diff --git a/Eigen/AccelerateSupport b/Eigen/AccelerateSupport
index e16f36b..533be68 100644
--- a/Eigen/AccelerateSupport
+++ b/Eigen/AccelerateSupport
@@ -13,35 +13,35 @@
 #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
-  */
+ * \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
+ */
 
 // IWYU pragma: begin_exports
 #include "src/AccelerateSupport/AccelerateSupport.h"
@@ -49,4 +49,4 @@
 
 #include "src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_ACCELERATESUPPORT_MODULE_H
+#endif  // EIGEN_ACCELERATESUPPORT_MODULE_H
diff --git a/Eigen/Cholesky b/Eigen/Cholesky
index 4211151..b05ed82 100644
--- a/Eigen/Cholesky
+++ b/Eigen/Cholesky
@@ -14,20 +14,20 @@
 #include "src/Core/util/DisableStupidWarnings.h"
 
 /** \defgroup Cholesky_Module Cholesky module
-  *
-  *
-  *
-  * This module provides two variants of the Cholesky decomposition for selfadjoint (hermitian) matrices.
-  * Those decompositions are also accessible via the following methods:
-  *  - MatrixBase::llt()
-  *  - MatrixBase::ldlt()
-  *  - SelfAdjointView::llt()
-  *  - SelfAdjointView::ldlt()
-  *
-  * \code
-  * #include <Eigen/Cholesky>
-  * \endcode
-  */
+ *
+ *
+ *
+ * This module provides two variants of the Cholesky decomposition for selfadjoint (hermitian) matrices.
+ * Those decompositions are also accessible via the following methods:
+ *  - MatrixBase::llt()
+ *  - MatrixBase::ldlt()
+ *  - SelfAdjointView::llt()
+ *  - SelfAdjointView::ldlt()
+ *
+ * \code
+ * #include <Eigen/Cholesky>
+ * \endcode
+ */
 
 // IWYU pragma: begin_exports
 #include "src/Cholesky/LLT.h"
@@ -40,4 +40,4 @@
 
 #include "src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_CHOLESKY_MODULE_H
+#endif  // EIGEN_CHOLESKY_MODULE_H
diff --git a/Eigen/CholmodSupport b/Eigen/CholmodSupport
index 2ccb211..2961863 100644
--- a/Eigen/CholmodSupport
+++ b/Eigen/CholmodSupport
@@ -13,32 +13,33 @@
 #include "src/Core/util/DisableStupidWarnings.h"
 
 extern "C" {
-  #include <cholmod.h>
+#include <cholmod.h>
 }
 
 /** \ingroup Support_modules
-  * \defgroup CholmodSupport_Module CholmodSupport module
-  *
-  * This module provides an interface to the Cholmod library which is part of the <a href="http://www.suitesparse.com">suitesparse</a> package.
-  * It provides the two following main factorization classes:
-  * - class CholmodSupernodalLLT: a supernodal LLT Cholesky factorization.
-  * - class CholmodDecomposition: a general L(D)LT Cholesky factorization with automatic or explicit runtime selection of the underlying factorization method (supernodal or simplicial).
-  *
-  * For the sake of completeness, this module also propose the two following classes:
-  * - class CholmodSimplicialLLT
-  * - class CholmodSimplicialLDLT
-  * Note that these classes does not bring any particular advantage compared to the built-in
-  * SimplicialLLT and SimplicialLDLT factorization classes.
-  *
-  * \code
-  * #include <Eigen/CholmodSupport>
-  * \endcode
-  *
-  * In order to use this module, the cholmod headers must be accessible from the include paths, and your binary must be linked to the cholmod library and its dependencies.
-  * The dependencies depend on how cholmod has been compiled.
-  * For a cmake based project, you can use our FindCholmod.cmake module to help you in this task.
-  *
-  */
+ * \defgroup CholmodSupport_Module CholmodSupport module
+ *
+ * This module provides an interface to the Cholmod library which is part of the <a
+ * href="http://www.suitesparse.com">suitesparse</a> package. It provides the two following main factorization classes:
+ * - class CholmodSupernodalLLT: a supernodal LLT Cholesky factorization.
+ * - class CholmodDecomposition: a general L(D)LT Cholesky factorization with automatic or explicit runtime selection of
+ * the underlying factorization method (supernodal or simplicial).
+ *
+ * For the sake of completeness, this module also propose the two following classes:
+ * - class CholmodSimplicialLLT
+ * - class CholmodSimplicialLDLT
+ * Note that these classes does not bring any particular advantage compared to the built-in
+ * SimplicialLLT and SimplicialLDLT factorization classes.
+ *
+ * \code
+ * #include <Eigen/CholmodSupport>
+ * \endcode
+ *
+ * In order to use this module, the cholmod headers must be accessible from the include paths, and your binary must be
+ * linked to the cholmod library and its dependencies. The dependencies depend on how cholmod has been compiled. For a
+ * cmake based project, you can use our FindCholmod.cmake module to help you in this task.
+ *
+ */
 
 // IWYU pragma: begin_exports
 #include "src/CholmodSupport/CholmodSupport.h"
@@ -46,5 +47,4 @@
 
 #include "src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_CHOLMODSUPPORT_MODULE_H
-
+#endif  // EIGEN_CHOLMODSUPPORT_MODULE_H
diff --git a/Eigen/Core b/Eigen/Core
index 700d815..39f2b3f 100644
--- a/Eigen/Core
+++ b/Eigen/Core
@@ -24,27 +24,25 @@
 // We need cuda_runtime.h/hip_runtime.h to ensure that
 // the EIGEN_USING_STD macro works properly on the device side
 #if defined(EIGEN_CUDACC)
-  #include <cuda_runtime.h>
+#include <cuda_runtime.h>
 #elif defined(EIGEN_HIPCC)
-  #include <hip/hip_runtime.h>
+#include <hip/hip_runtime.h>
 #endif
 
-
 #ifdef EIGEN_EXCEPTIONS
-  #include <new>
+#include <new>
 #endif
 
 // Disable the ipa-cp-clone optimization flag with MinGW 6.x or older (enabled by default with -O3)
 // See http://eigen.tuxfamily.org/bz/show_bug.cgi?id=556 for details.
-#if EIGEN_COMP_MINGW && EIGEN_GNUC_STRICT_LESS_THAN(6,0,0)
-  #pragma GCC optimize ("-fno-ipa-cp-clone")
+#if EIGEN_COMP_MINGW && EIGEN_GNUC_STRICT_LESS_THAN(6, 0, 0)
+#pragma GCC optimize("-fno-ipa-cp-clone")
 #endif
 
 // Prevent ICC from specializing std::complex operators that silently fail
 // on device. This allows us to use our own device-compatible specializations
 // instead.
-#if EIGEN_COMP_ICC && defined(EIGEN_GPU_COMPILE_PHASE) \
-    && !defined(_OVERRIDE_COMPLEX_SPECIALIZATION_)
+#if EIGEN_COMP_ICC && defined(EIGEN_GPU_COMPILE_PHASE) && !defined(_OVERRIDE_COMPLEX_SPECIALIZATION_)
 #define _OVERRIDE_COMPLEX_SPECIALIZATION_ 1
 #endif
 #include <complex>
@@ -53,17 +51,16 @@
 // and inclusion of their respective header files
 #include "src/Core/util/MKL_support.h"
 
-
 #if defined(EIGEN_HAS_CUDA_FP16) || defined(EIGEN_HAS_HIP_FP16)
-  #define EIGEN_HAS_GPU_FP16
+#define EIGEN_HAS_GPU_FP16
 #endif
 
 #if defined(EIGEN_HAS_CUDA_BF16) || defined(EIGEN_HAS_HIP_BF16)
-  #define EIGEN_HAS_GPU_BF16
+#define EIGEN_HAS_GPU_BF16
 #endif
 
 #if (defined _OPENMP) && (!defined EIGEN_DONT_PARALLELIZE)
-  #define EIGEN_HAS_OPENMP
+#define EIGEN_HAS_OPENMP
 #endif
 
 #ifdef EIGEN_HAS_OPENMP
@@ -84,13 +81,13 @@
 #include <cmath>
 #include <functional>
 #ifndef EIGEN_NO_IO
-  #include <sstream>
-  #include <iosfwd>
+#include <sstream>
+#include <iosfwd>
 #endif
 #include <cstring>
 #include <string>
 #include <limits>
-#include <climits> // for CHAR_BIT
+#include <climits>  // for CHAR_BIT
 // for min/max:
 #include <algorithm>
 
@@ -108,30 +105,31 @@
 // required for __cpuid, needs to be included after cmath
 // also required for _BitScanReverse on Windows on ARM
 #if EIGEN_COMP_MSVC && (EIGEN_ARCH_i386_OR_x86_64 || EIGEN_ARCH_ARM64) && !EIGEN_OS_WINCE
-  #include <intrin.h>
+#include <intrin.h>
 #endif
 
 #if defined(EIGEN_USE_SYCL)
-  #undef min
-  #undef max
-  #undef isnan
-  #undef isinf
-  #undef isfinite
-  #include <CL/sycl.hpp>
-  #include <map>
-  #include <memory>
-  #include <utility>
-  #include <thread>
-  #ifndef EIGEN_SYCL_LOCAL_THREAD_DIM0
-  #define EIGEN_SYCL_LOCAL_THREAD_DIM0 16
-  #endif
-  #ifndef EIGEN_SYCL_LOCAL_THREAD_DIM1
-  #define EIGEN_SYCL_LOCAL_THREAD_DIM1 16
-  #endif
+#undef min
+#undef max
+#undef isnan
+#undef isinf
+#undef isfinite
+#include <CL/sycl.hpp>
+#include <map>
+#include <memory>
+#include <utility>
+#include <thread>
+#ifndef EIGEN_SYCL_LOCAL_THREAD_DIM0
+#define EIGEN_SYCL_LOCAL_THREAD_DIM0 16
+#endif
+#ifndef EIGEN_SYCL_LOCAL_THREAD_DIM1
+#define EIGEN_SYCL_LOCAL_THREAD_DIM1 16
+#endif
 #endif
 
-
-#if defined EIGEN2_SUPPORT_STAGE40_FULL_EIGEN3_STRICTNESS || defined EIGEN2_SUPPORT_STAGE30_FULL_EIGEN3_API || defined EIGEN2_SUPPORT_STAGE20_RESOLVE_API_CONFLICTS || defined EIGEN2_SUPPORT_STAGE10_FULL_EIGEN2_API || defined EIGEN2_SUPPORT
+#if defined EIGEN2_SUPPORT_STAGE40_FULL_EIGEN3_STRICTNESS || defined EIGEN2_SUPPORT_STAGE30_FULL_EIGEN3_API || \
+    defined EIGEN2_SUPPORT_STAGE20_RESOLVE_API_CONFLICTS || defined EIGEN2_SUPPORT_STAGE10_FULL_EIGEN2_API ||  \
+    defined EIGEN2_SUPPORT
 // This will generate an error message:
 #error Eigen2-support is only available up to version 3.2. Please go to "http://eigen.tuxfamily.org/index.php?title=Eigen2" for further information
 #endif
@@ -144,24 +142,24 @@
 // gcc 4.6.0 wants std:: for ptrdiff_t
 using std::ptrdiff_t;
 
-}
+}  // namespace Eigen
 
 /** \defgroup Core_Module Core module
-  * This is the main module of Eigen providing dense matrix and vector support
-  * (both fixed and dynamic size) with all the features corresponding to a BLAS library
-  * and much more...
-  *
-  * \code
-  * #include <Eigen/Core>
-  * \endcode
-  */
+ * This is the main module of Eigen providing dense matrix and vector support
+ * (both fixed and dynamic size) with all the features corresponding to a BLAS library
+ * and much more...
+ *
+ * \code
+ * #include <Eigen/Core>
+ * \endcode
+ */
 
 #ifdef EIGEN_USE_LAPACKE
-  #ifdef EIGEN_USE_MKL
-    #include "mkl_lapacke.h"
-  #else
-    #include "src/misc/lapacke.h"
-  #endif
+#ifdef EIGEN_USE_MKL
+#include "mkl_lapacke.h"
+#else
+#include "src/misc/lapacke.h"
+#endif
 #endif
 
 // IWYU pragma: begin_exports
@@ -189,75 +187,75 @@
 #include "src/Core/arch/Default/GenericPacketMathFunctionsFwd.h"
 
 #if defined EIGEN_VECTORIZE_AVX512
-  #if defined EIGEN_VECTORIZE_AVX512FP16
-    #include "src/Core/arch/AVX512/PacketMathFP16.h"
-  #endif
-  #include "src/Core/arch/SSE/PacketMath.h"
-  #include "src/Core/arch/SSE/TypeCasting.h"
-  #include "src/Core/arch/SSE/Complex.h"
-  #include "src/Core/arch/AVX/PacketMath.h"
-  #include "src/Core/arch/AVX/TypeCasting.h"
-  #include "src/Core/arch/AVX/Complex.h"
-  #include "src/Core/arch/AVX512/PacketMath.h"
-  #include "src/Core/arch/AVX512/TypeCasting.h"
-  #include "src/Core/arch/AVX512/Complex.h"
-  #include "src/Core/arch/SSE/MathFunctions.h"
-  #include "src/Core/arch/AVX/MathFunctions.h"
-  #include "src/Core/arch/AVX512/MathFunctions.h"
-  #include "src/Core/arch/AVX512/TrsmKernel.h"
+#if defined EIGEN_VECTORIZE_AVX512FP16
+#include "src/Core/arch/AVX512/PacketMathFP16.h"
+#endif
+#include "src/Core/arch/SSE/PacketMath.h"
+#include "src/Core/arch/SSE/TypeCasting.h"
+#include "src/Core/arch/SSE/Complex.h"
+#include "src/Core/arch/AVX/PacketMath.h"
+#include "src/Core/arch/AVX/TypeCasting.h"
+#include "src/Core/arch/AVX/Complex.h"
+#include "src/Core/arch/AVX512/PacketMath.h"
+#include "src/Core/arch/AVX512/TypeCasting.h"
+#include "src/Core/arch/AVX512/Complex.h"
+#include "src/Core/arch/SSE/MathFunctions.h"
+#include "src/Core/arch/AVX/MathFunctions.h"
+#include "src/Core/arch/AVX512/MathFunctions.h"
+#include "src/Core/arch/AVX512/TrsmKernel.h"
 #elif defined EIGEN_VECTORIZE_AVX
-  // Use AVX for floats and doubles, SSE for integers
-  #include "src/Core/arch/SSE/PacketMath.h"
-  #include "src/Core/arch/SSE/TypeCasting.h"
-  #include "src/Core/arch/SSE/Complex.h"
-  #include "src/Core/arch/AVX/PacketMath.h"
-  #include "src/Core/arch/AVX/TypeCasting.h"
-  #include "src/Core/arch/AVX/Complex.h"
-  #include "src/Core/arch/SSE/MathFunctions.h"
-  #include "src/Core/arch/AVX/MathFunctions.h"
+   // Use AVX for floats and doubles, SSE for integers
+#include "src/Core/arch/SSE/PacketMath.h"
+#include "src/Core/arch/SSE/TypeCasting.h"
+#include "src/Core/arch/SSE/Complex.h"
+#include "src/Core/arch/AVX/PacketMath.h"
+#include "src/Core/arch/AVX/TypeCasting.h"
+#include "src/Core/arch/AVX/Complex.h"
+#include "src/Core/arch/SSE/MathFunctions.h"
+#include "src/Core/arch/AVX/MathFunctions.h"
 #elif defined EIGEN_VECTORIZE_SSE
-  #include "src/Core/arch/SSE/PacketMath.h"
-  #include "src/Core/arch/SSE/TypeCasting.h"
-  #include "src/Core/arch/SSE/MathFunctions.h"
-  #include "src/Core/arch/SSE/Complex.h"
+#include "src/Core/arch/SSE/PacketMath.h"
+#include "src/Core/arch/SSE/TypeCasting.h"
+#include "src/Core/arch/SSE/MathFunctions.h"
+#include "src/Core/arch/SSE/Complex.h"
 #elif defined(EIGEN_VECTORIZE_ALTIVEC) || defined(EIGEN_VECTORIZE_VSX)
-  #include "src/Core/arch/AltiVec/PacketMath.h"
-  #include "src/Core/arch/AltiVec/TypeCasting.h"
-  #include "src/Core/arch/AltiVec/MathFunctions.h"
-  #include "src/Core/arch/AltiVec/Complex.h"
+#include "src/Core/arch/AltiVec/PacketMath.h"
+#include "src/Core/arch/AltiVec/TypeCasting.h"
+#include "src/Core/arch/AltiVec/MathFunctions.h"
+#include "src/Core/arch/AltiVec/Complex.h"
 #elif defined EIGEN_VECTORIZE_NEON
-  #include "src/Core/arch/NEON/PacketMath.h"
-  #include "src/Core/arch/NEON/TypeCasting.h"
-  #include "src/Core/arch/NEON/MathFunctions.h"
-  #include "src/Core/arch/NEON/Complex.h"
+#include "src/Core/arch/NEON/PacketMath.h"
+#include "src/Core/arch/NEON/TypeCasting.h"
+#include "src/Core/arch/NEON/MathFunctions.h"
+#include "src/Core/arch/NEON/Complex.h"
 #elif defined EIGEN_VECTORIZE_SVE
-  #include "src/Core/arch/SVE/PacketMath.h"
-  #include "src/Core/arch/SVE/TypeCasting.h"
-  #include "src/Core/arch/SVE/MathFunctions.h"
+#include "src/Core/arch/SVE/PacketMath.h"
+#include "src/Core/arch/SVE/TypeCasting.h"
+#include "src/Core/arch/SVE/MathFunctions.h"
 #elif defined EIGEN_VECTORIZE_ZVECTOR
-  #include "src/Core/arch/ZVector/PacketMath.h"
-  #include "src/Core/arch/ZVector/MathFunctions.h"
-  #include "src/Core/arch/ZVector/Complex.h"
+#include "src/Core/arch/ZVector/PacketMath.h"
+#include "src/Core/arch/ZVector/MathFunctions.h"
+#include "src/Core/arch/ZVector/Complex.h"
 #elif defined EIGEN_VECTORIZE_MSA
-  #include "src/Core/arch/MSA/PacketMath.h"
-  #include "src/Core/arch/MSA/MathFunctions.h"
-  #include "src/Core/arch/MSA/Complex.h"
+#include "src/Core/arch/MSA/PacketMath.h"
+#include "src/Core/arch/MSA/MathFunctions.h"
+#include "src/Core/arch/MSA/Complex.h"
 #elif defined EIGEN_VECTORIZE_HVX
-  #include "src/Core/arch/HVX/PacketMath.h"
+#include "src/Core/arch/HVX/PacketMath.h"
 #endif
 
 #if defined EIGEN_VECTORIZE_GPU
-  #include "src/Core/arch/GPU/PacketMath.h"
-  #include "src/Core/arch/GPU/MathFunctions.h"
-  #include "src/Core/arch/GPU/TypeCasting.h"
+#include "src/Core/arch/GPU/PacketMath.h"
+#include "src/Core/arch/GPU/MathFunctions.h"
+#include "src/Core/arch/GPU/TypeCasting.h"
 #endif
 
 #if defined(EIGEN_USE_SYCL)
-  #include "src/Core/arch/SYCL/InteropHeaders.h"
+#include "src/Core/arch/SYCL/InteropHeaders.h"
 #if !defined(EIGEN_DONT_VECTORIZE_SYCL)
-  #include "src/Core/arch/SYCL/PacketMath.h"
-  #include "src/Core/arch/SYCL/MathFunctions.h"
-  #include "src/Core/arch/SYCL/TypeCasting.h"
+#include "src/Core/arch/SYCL/PacketMath.h"
+#include "src/Core/arch/SYCL/MathFunctions.h"
+#include "src/Core/arch/SYCL/TypeCasting.h"
 #endif
 #endif
 
@@ -286,7 +284,7 @@
 #include "src/Core/util/ReshapedHelper.h"
 #include "src/Core/ArithmeticSequence.h"
 #ifndef EIGEN_NO_IO
-  #include "src/Core/IO.h"
+#include "src/Core/IO.h"
 #endif
 #include "src/Core/DenseCoeffsBase.h"
 #include "src/Core/DenseBase.h"
@@ -297,9 +295,9 @@
 #include "src/Core/CoreEvaluators.h"
 #include "src/Core/AssignEvaluator.h"
 
-#ifndef EIGEN_PARSED_BY_DOXYGEN // work around Doxygen bug triggered by Assign.h r814874
-                                // at least confirmed with Doxygen 1.5.5 and 1.5.6
-  #include "src/Core/Assign.h"
+#ifndef EIGEN_PARSED_BY_DOXYGEN  // work around Doxygen bug triggered by Assign.h r814874
+                                 // at least confirmed with Doxygen 1.5.5 and 1.5.6
+#include "src/Core/Assign.h"
 #endif
 
 #include "src/Core/ArrayBase.h"
@@ -371,17 +369,17 @@
 #include "src/Core/ConditionEstimator.h"
 
 #if defined(EIGEN_VECTORIZE_VSX)
-  #include "src/Core/arch/AltiVec/MatrixProduct.h"
+#include "src/Core/arch/AltiVec/MatrixProduct.h"
 #elif defined EIGEN_VECTORIZE_NEON
-  #include "src/Core/arch/NEON/GeneralBlockPanelKernel.h"
+#include "src/Core/arch/NEON/GeneralBlockPanelKernel.h"
 #endif
 
 #if defined(EIGEN_VECTORIZE_AVX512)
-  #include "src/Core/arch/AVX512/GemmKernel.h"
+#include "src/Core/arch/AVX512/GemmKernel.h"
 #endif
 
 #if defined(EIGEN_VECTORIZE_HVX)
-  #include "src/Core/arch/HVX/GeneralBlockPanelKernel.h"
+#include "src/Core/arch/HVX/GeneralBlockPanelKernel.h"
 #endif
 
 #include "src/Core/Select.h"
@@ -402,7 +400,7 @@
 #include "src/Core/products/TriangularMatrixMatrix_BLAS.h"
 #include "src/Core/products/TriangularMatrixVector_BLAS.h"
 #include "src/Core/products/TriangularSolverMatrix_BLAS.h"
-#endif // EIGEN_USE_BLAS
+#endif  // EIGEN_USE_BLAS
 
 #ifdef EIGEN_USE_MKL_VML
 #include "src/Core/Assign_MKL.h"
@@ -413,4 +411,4 @@
 
 #include "src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_CORE_MODULE_H
+#endif  // EIGEN_CORE_MODULE_H
diff --git a/Eigen/Eigenvalues b/Eigen/Eigenvalues
index 97c526d..3b0bdee 100644
--- a/Eigen/Eigenvalues
+++ b/Eigen/Eigenvalues
@@ -19,18 +19,18 @@
 #include "src/Core/util/DisableStupidWarnings.h"
 
 /** \defgroup Eigenvalues_Module Eigenvalues module
-  *
-  *
-  *
-  * This module mainly provides various eigenvalue solvers.
-  * This module also provides some MatrixBase methods, including:
-  *  - MatrixBase::eigenvalues(),
-  *  - MatrixBase::operatorNorm()
-  *
-  * \code
-  * #include <Eigen/Eigenvalues>
-  * \endcode
-  */
+ *
+ *
+ *
+ * This module mainly provides various eigenvalue solvers.
+ * This module also provides some MatrixBase methods, including:
+ *  - MatrixBase::eigenvalues(),
+ *  - MatrixBase::operatorNorm()
+ *
+ * \code
+ * #include <Eigen/Eigenvalues>
+ * \endcode
+ */
 
 #include "src/misc/RealSvd2x2.h"
 
@@ -60,4 +60,4 @@
 
 #include "src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_EIGENVALUES_MODULE_H
+#endif  // EIGEN_EIGENVALUES_MODULE_H
diff --git a/Eigen/Geometry b/Eigen/Geometry
index 0a733c5..3334874 100644
--- a/Eigen/Geometry
+++ b/Eigen/Geometry
@@ -17,21 +17,22 @@
 #include "src/Core/util/DisableStupidWarnings.h"
 
 /** \defgroup Geometry_Module Geometry module
-  *
-  * This module provides support for:
-  *  - fixed-size homogeneous transformations
-  *  - translation, scaling, 2D and 3D rotations
-  *  - \link Quaternion quaternions \endlink
-  *  - cross products (\ref MatrixBase::cross, \ref MatrixBase::cross3)
-  *  - orthognal vector generation (\ref MatrixBase::unitOrthogonal)
-  *  - some linear components: \link ParametrizedLine parametrized-lines \endlink and \link Hyperplane hyperplanes \endlink
-  *  - \link AlignedBox axis aligned bounding boxes \endlink
-  *  - \link umeyama least-square transformation fitting \endlink
-  *
-  * \code
-  * #include <Eigen/Geometry>
-  * \endcode
-  */
+ *
+ * This module provides support for:
+ *  - fixed-size homogeneous transformations
+ *  - translation, scaling, 2D and 3D rotations
+ *  - \link Quaternion quaternions \endlink
+ *  - cross products (\ref MatrixBase::cross, \ref MatrixBase::cross3)
+ *  - orthognal vector generation (\ref MatrixBase::unitOrthogonal)
+ *  - some linear components: \link ParametrizedLine parametrized-lines \endlink and \link Hyperplane hyperplanes
+ * \endlink
+ *  - \link AlignedBox axis aligned bounding boxes \endlink
+ *  - \link umeyama least-square transformation fitting \endlink
+ *
+ * \code
+ * #include <Eigen/Geometry>
+ * \endcode
+ */
 
 // IWYU pragma: begin_exports
 #include "src/Geometry/OrthoMethods.h"
@@ -57,4 +58,4 @@
 
 #include "src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_GEOMETRY_MODULE_H
+#endif  // EIGEN_GEOMETRY_MODULE_H
diff --git a/Eigen/Householder b/Eigen/Householder
index 0f7f9b3..5070e07 100644
--- a/Eigen/Householder
+++ b/Eigen/Householder
@@ -13,12 +13,12 @@
 #include "src/Core/util/DisableStupidWarnings.h"
 
 /** \defgroup Householder_Module Householder module
-  * This module provides Householder transformations.
-  *
-  * \code
-  * #include <Eigen/Householder>
-  * \endcode
-  */
+ * This module provides Householder transformations.
+ *
+ * \code
+ * #include <Eigen/Householder>
+ * \endcode
+ */
 
 // IWYU pragma: begin_exports
 #include "src/Householder/Householder.h"
@@ -28,4 +28,4 @@
 
 #include "src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_HOUSEHOLDER_MODULE_H
+#endif  // EIGEN_HOUSEHOLDER_MODULE_H
diff --git a/Eigen/IterativeLinearSolvers b/Eigen/IterativeLinearSolvers
index 833189b..fe5159e 100644
--- a/Eigen/IterativeLinearSolvers
+++ b/Eigen/IterativeLinearSolvers
@@ -13,10 +13,11 @@
 
 #include "src/Core/util/DisableStupidWarnings.h"
 
-/** 
+/**
   * \defgroup IterativeLinearSolvers_Module IterativeLinearSolvers module
   *
-  * This module currently provides iterative methods to solve problems of the form \c A \c x = \c b, where \c A is a squared matrix, usually very large and sparse.
+  * This module currently provides iterative methods to solve problems of the form \c A \c x = \c b, where \c A is a
+  squared matrix, usually very large and sparse.
   * Those solvers are accessible via the following classes:
   *  - ConjugateGradient for selfadjoint (hermitian) matrices,
   *  - LeastSquaresConjugateGradient for rectangular least-square problems,
@@ -27,7 +28,8 @@
   *  - DiagonalPreconditioner - also called Jacobi preconditioner, work very well on diagonal dominant matrices.
   *  - IncompleteLUT - incomplete LU factorization with dual thresholding
   *
-  * Such problems can also be solved using the direct sparse decomposition modules: SparseCholesky, CholmodSupport, UmfPackSupport, SuperLUSupport, AccelerateSupport.
+  * Such problems can also be solved using the direct sparse decomposition modules: SparseCholesky, CholmodSupport,
+  UmfPackSupport, SuperLUSupport, AccelerateSupport.
   *
     \code
     #include <Eigen/IterativeLinearSolvers>
@@ -47,4 +49,4 @@
 
 #include "src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_ITERATIVELINEARSOLVERS_MODULE_H
+#endif  // EIGEN_ITERATIVELINEARSOLVERS_MODULE_H
diff --git a/Eigen/Jacobi b/Eigen/Jacobi
index 490a6a8..31eb36a 100644
--- a/Eigen/Jacobi
+++ b/Eigen/Jacobi
@@ -13,16 +13,16 @@
 #include "src/Core/util/DisableStupidWarnings.h"
 
 /** \defgroup Jacobi_Module Jacobi module
-  * This module provides Jacobi and Givens rotations.
-  *
-  * \code
-  * #include <Eigen/Jacobi>
-  * \endcode
-  *
-  * In addition to listed classes, it defines the two following MatrixBase methods to apply a Jacobi or Givens rotation:
-  *  - MatrixBase::applyOnTheLeft()
-  *  - MatrixBase::applyOnTheRight().
-  */
+ * This module provides Jacobi and Givens rotations.
+ *
+ * \code
+ * #include <Eigen/Jacobi>
+ * \endcode
+ *
+ * In addition to listed classes, it defines the two following MatrixBase methods to apply a Jacobi or Givens rotation:
+ *  - MatrixBase::applyOnTheLeft()
+ *  - MatrixBase::applyOnTheRight().
+ */
 
 // IWYU pragma: begin_exports
 #include "src/Jacobi/Jacobi.h"
@@ -30,5 +30,4 @@
 
 #include "src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_JACOBI_MODULE_H
-
+#endif  // EIGEN_JACOBI_MODULE_H
diff --git a/Eigen/KLUSupport b/Eigen/KLUSupport
index 5c8f8a3..13959a3 100644
--- a/Eigen/KLUSupport
+++ b/Eigen/KLUSupport
@@ -15,24 +15,24 @@
 extern "C" {
 #include <btf.h>
 #include <klu.h>
-   }
+}
 
 /** \ingroup Support_modules
-  * \defgroup KLUSupport_Module KLUSupport module
-  *
-  * This module provides an interface to the KLU library which is part of the <a href="http://www.suitesparse.com">suitesparse</a> package.
-  * It provides the following factorization class:
-  * - class KLU: a sparse LU factorization, well-suited for circuit simulation.
-  *
-  * \code
-  * #include <Eigen/KLUSupport>
-  * \endcode
-  *
-  * In order to use this module, the klu and btf headers must be accessible from the include paths, and your binary must be linked to the klu library and its dependencies.
-  * The dependencies depend on how umfpack has been compiled.
-  * For a cmake based project, you can use our FindKLU.cmake module to help you in this task.
-  *
-  */
+ * \defgroup KLUSupport_Module KLUSupport module
+ *
+ * This module provides an interface to the KLU library which is part of the <a
+ * href="http://www.suitesparse.com">suitesparse</a> package. It provides the following factorization class:
+ * - class KLU: a sparse LU factorization, well-suited for circuit simulation.
+ *
+ * \code
+ * #include <Eigen/KLUSupport>
+ * \endcode
+ *
+ * In order to use this module, the klu and btf headers must be accessible from the include paths, and your binary must
+ * be linked to the klu library and its dependencies. The dependencies depend on how umfpack has been compiled. For a
+ * cmake based project, you can use our FindKLU.cmake module to help you in this task.
+ *
+ */
 
 // IWYU pragma: begin_exports
 #include "src/KLUSupport/KLUSupport.h"
@@ -40,4 +40,4 @@
 
 #include "src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_KLUSUPPORT_MODULE_H
+#endif  // EIGEN_KLUSUPPORT_MODULE_H
diff --git a/Eigen/LU b/Eigen/LU
index 49d7b91..d804480 100644
--- a/Eigen/LU
+++ b/Eigen/LU
@@ -13,15 +13,15 @@
 #include "src/Core/util/DisableStupidWarnings.h"
 
 /** \defgroup LU_Module LU module
-  * This module includes %LU decomposition and related notions such as matrix inversion and determinant.
-  * This module defines the following MatrixBase methods:
-  *  - MatrixBase::inverse()
-  *  - MatrixBase::determinant()
-  *
-  * \code
-  * #include <Eigen/LU>
-  * \endcode
-  */
+ * This module includes %LU decomposition and related notions such as matrix inversion and determinant.
+ * This module defines the following MatrixBase methods:
+ *  - MatrixBase::inverse()
+ *  - MatrixBase::determinant()
+ *
+ * \code
+ * #include <Eigen/LU>
+ * \endcode
+ */
 
 #include "src/misc/Kernel.h"
 #include "src/misc/Image.h"
@@ -37,10 +37,10 @@
 #include "src/LU/InverseImpl.h"
 
 #if defined EIGEN_VECTORIZE_SSE || defined EIGEN_VECTORIZE_NEON
-  #include "src/LU/arch/InverseSize4.h"
+#include "src/LU/arch/InverseSize4.h"
 #endif
 // IWYU pragma: end_exports
 
 #include "src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_LU_MODULE_H
+#endif  // EIGEN_LU_MODULE_H
diff --git a/Eigen/MetisSupport b/Eigen/MetisSupport
index e74c3bb..3636d3a 100644
--- a/Eigen/MetisSupport
+++ b/Eigen/MetisSupport
@@ -16,16 +16,15 @@
 #include <metis.h>
 }
 
-
 /** \ingroup Support_modules
-  * \defgroup MetisSupport_Module MetisSupport module
-  *
-  * \code
-  * #include <Eigen/MetisSupport>
-  * \endcode
-  * This module defines an interface to the METIS reordering package (http://glaros.dtc.umn.edu/gkhome/views/metis). 
-  * It can be used just as any other built-in method as explained in \link OrderingMethods_Module here. \endlink
-  */
+ * \defgroup MetisSupport_Module MetisSupport module
+ *
+ * \code
+ * #include <Eigen/MetisSupport>
+ * \endcode
+ * This module defines an interface to the METIS reordering package (http://glaros.dtc.umn.edu/gkhome/views/metis).
+ * It can be used just as any other built-in method as explained in \link OrderingMethods_Module here. \endlink
+ */
 
 // IWYU pragma: begin_exports
 #include "src/MetisSupport/MetisSupport.h"
@@ -33,4 +32,4 @@
 
 #include "src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_METISSUPPORT_MODULE_H
+#endif  // EIGEN_METISSUPPORT_MODULE_H
diff --git a/Eigen/OrderingMethods b/Eigen/OrderingMethods
index 5031de7..921b8a0 100644
--- a/Eigen/OrderingMethods
+++ b/Eigen/OrderingMethods
@@ -12,56 +12,56 @@
 
 #include "src/Core/util/DisableStupidWarnings.h"
 
-/** 
-  * \defgroup OrderingMethods_Module OrderingMethods module
-  *
-  * This module is currently for internal use only
-  * 
-  * It defines various built-in and external ordering methods for sparse matrices. 
-  * They are typically used to reduce the number of elements during 
-  * the sparse matrix decomposition (LLT, LU, QR).
-  * Precisely, in a preprocessing step, a permutation matrix P is computed using 
-  * those ordering methods and applied to the columns of the matrix. 
-  * Using for instance the sparse Cholesky decomposition, it is expected that 
-  * the nonzeros elements in LLT(A*P) will be much smaller than that in LLT(A).
-  * 
-  * 
-  * Usage : 
-  * \code
-  * #include <Eigen/OrderingMethods>
-  * \endcode
-  * 
-  * A simple usage is as a template parameter in the sparse decomposition classes : 
-  * 
-  * \code 
-  * SparseLU<MatrixType, COLAMDOrdering<int> > solver;
-  * \endcode 
-  * 
-  * \code 
-  * SparseQR<MatrixType, COLAMDOrdering<int> > solver;
-  * \endcode
-  * 
-  * It is possible as well to call directly a particular ordering method for your own purpose, 
-  * \code 
-  * AMDOrdering<int> ordering;
-  * PermutationMatrix<Dynamic, Dynamic, int> perm;
-  * SparseMatrix<double> A; 
-  * //Fill the matrix ...
-  * 
-  * ordering(A, perm); // Call AMD
-  * \endcode
-  * 
-  * \note Some of these methods (like AMD or METIS), need the sparsity pattern 
-  * of the input matrix to be symmetric. When the matrix is structurally unsymmetric, 
-  * Eigen computes internally the pattern of \f$A^T*A\f$ before calling the method.
-  * If your matrix is already symmetric (at leat in structure), you can avoid that
-  * by calling the method with a SelfAdjointView type.
-  * 
-  * \code
-  *  // Call the ordering on the pattern of the lower triangular matrix A
-  * ordering(A.selfadjointView<Lower>(), perm);
-  * \endcode
-  */
+/**
+ * \defgroup OrderingMethods_Module OrderingMethods module
+ *
+ * This module is currently for internal use only
+ *
+ * It defines various built-in and external ordering methods for sparse matrices.
+ * They are typically used to reduce the number of elements during
+ * the sparse matrix decomposition (LLT, LU, QR).
+ * Precisely, in a preprocessing step, a permutation matrix P is computed using
+ * those ordering methods and applied to the columns of the matrix.
+ * Using for instance the sparse Cholesky decomposition, it is expected that
+ * the nonzeros elements in LLT(A*P) will be much smaller than that in LLT(A).
+ *
+ *
+ * Usage :
+ * \code
+ * #include <Eigen/OrderingMethods>
+ * \endcode
+ *
+ * A simple usage is as a template parameter in the sparse decomposition classes :
+ *
+ * \code
+ * SparseLU<MatrixType, COLAMDOrdering<int> > solver;
+ * \endcode
+ *
+ * \code
+ * SparseQR<MatrixType, COLAMDOrdering<int> > solver;
+ * \endcode
+ *
+ * It is possible as well to call directly a particular ordering method for your own purpose,
+ * \code
+ * AMDOrdering<int> ordering;
+ * PermutationMatrix<Dynamic, Dynamic, int> perm;
+ * SparseMatrix<double> A;
+ * //Fill the matrix ...
+ *
+ * ordering(A, perm); // Call AMD
+ * \endcode
+ *
+ * \note Some of these methods (like AMD or METIS), need the sparsity pattern
+ * of the input matrix to be symmetric. When the matrix is structurally unsymmetric,
+ * Eigen computes internally the pattern of \f$A^T*A\f$ before calling the method.
+ * If your matrix is already symmetric (at leat in structure), you can avoid that
+ * by calling the method with a SelfAdjointView type.
+ *
+ * \code
+ *  // Call the ordering on the pattern of the lower triangular matrix A
+ * ordering(A.selfadjointView<Lower>(), perm);
+ * \endcode
+ */
 
 // IWYU pragma: begin_exports
 #include "src/OrderingMethods/Amd.h"
@@ -70,4 +70,4 @@
 
 #include "src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_ORDERINGMETHODS_MODULE_H
+#endif  // EIGEN_ORDERINGMETHODS_MODULE_H
diff --git a/Eigen/PaStiXSupport b/Eigen/PaStiXSupport
index 5d3cb38..dd1cfcb 100644
--- a/Eigen/PaStiXSupport
+++ b/Eigen/PaStiXSupport
@@ -22,25 +22,25 @@
 #endif
 
 /** \ingroup Support_modules
-  * \defgroup PaStiXSupport_Module PaStiXSupport module
-  * 
-  * This module provides an interface to the <a href="http://pastix.gforge.inria.fr/">PaSTiX</a> library.
-  * PaSTiX is a general \b supernodal, \b parallel and \b opensource sparse solver.
-  * It provides the two following main factorization classes:
-  * - class PastixLLT : a supernodal, parallel LLt Cholesky factorization.
-  * - class PastixLDLT: a supernodal, parallel LDLt Cholesky factorization.
-  * - class PastixLU : a supernodal, parallel LU factorization (optimized for a symmetric pattern).
-  * 
-  * \code
-  * #include <Eigen/PaStiXSupport>
-  * \endcode
-  *
-  * In order to use this module, the PaSTiX headers must be accessible from the include paths, and your binary must be linked to the PaSTiX library and its dependencies.
-  * This wrapper resuires PaStiX version 5.x compiled without MPI support.
-  * The dependencies depend on how PaSTiX has been compiled.
-  * For a cmake based project, you can use our FindPaSTiX.cmake module to help you in this task.
-  *
-  */
+ * \defgroup PaStiXSupport_Module PaStiXSupport module
+ *
+ * This module provides an interface to the <a href="http://pastix.gforge.inria.fr/">PaSTiX</a> library.
+ * PaSTiX is a general \b supernodal, \b parallel and \b opensource sparse solver.
+ * It provides the two following main factorization classes:
+ * - class PastixLLT : a supernodal, parallel LLt Cholesky factorization.
+ * - class PastixLDLT: a supernodal, parallel LDLt Cholesky factorization.
+ * - class PastixLU : a supernodal, parallel LU factorization (optimized for a symmetric pattern).
+ *
+ * \code
+ * #include <Eigen/PaStiXSupport>
+ * \endcode
+ *
+ * In order to use this module, the PaSTiX headers must be accessible from the include paths, and your binary must be
+ * linked to the PaSTiX library and its dependencies. This wrapper resuires PaStiX version 5.x compiled without MPI
+ * support. The dependencies depend on how PaSTiX has been compiled. For a cmake based project, you can use our
+ * FindPaSTiX.cmake module to help you in this task.
+ *
+ */
 
 // IWYU pragma: begin_exports
 #include "src/PaStiXSupport/PaStiXSupport.h"
@@ -48,4 +48,4 @@
 
 #include "src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_PASTIXSUPPORT_MODULE_H
+#endif  // EIGEN_PASTIXSUPPORT_MODULE_H
diff --git a/Eigen/PardisoSupport b/Eigen/PardisoSupport
index c022ce1..4aef5fb 100644
--- a/Eigen/PardisoSupport
+++ b/Eigen/PardisoSupport
@@ -15,18 +15,19 @@
 #include <mkl_pardiso.h>
 
 /** \ingroup Support_modules
-  * \defgroup PardisoSupport_Module PardisoSupport module
-  *
-  * This module brings support for the Intel(R) MKL PARDISO direct sparse solvers.
-  *
-  * \code
-  * #include <Eigen/PardisoSupport>
-  * \endcode
-  *
-  * In order to use this module, the MKL headers must be accessible from the include paths, and your binary must be linked to the MKL library and its dependencies.
-  * See this \ref TopicUsingIntelMKL "page" for more information on MKL-Eigen integration.
-  * 
-  */
+ * \defgroup PardisoSupport_Module PardisoSupport module
+ *
+ * This module brings support for the Intel(R) MKL PARDISO direct sparse solvers.
+ *
+ * \code
+ * #include <Eigen/PardisoSupport>
+ * \endcode
+ *
+ * In order to use this module, the MKL headers must be accessible from the include paths, and your binary must be
+ * linked to the MKL library and its dependencies. See this \ref TopicUsingIntelMKL "page" for more information on
+ * MKL-Eigen integration.
+ *
+ */
 
 // IWYU pragma: begin_exports
 #include "src/PardisoSupport/PardisoSupport.h"
@@ -34,4 +35,4 @@
 
 #include "src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_PARDISOSUPPORT_MODULE_H
+#endif  // EIGEN_PARDISOSUPPORT_MODULE_H
diff --git a/Eigen/QR b/Eigen/QR
index 2f57a60..c38b453 100644
--- a/Eigen/QR
+++ b/Eigen/QR
@@ -17,19 +17,19 @@
 #include "src/Core/util/DisableStupidWarnings.h"
 
 /** \defgroup QR_Module QR module
-  *
-  *
-  *
-  * This module provides various QR decompositions
-  * This module also provides some MatrixBase methods, including:
-  *  - MatrixBase::householderQr()
-  *  - MatrixBase::colPivHouseholderQr()
-  *  - MatrixBase::fullPivHouseholderQr()
-  *
-  * \code
-  * #include <Eigen/QR>
-  * \endcode
-  */
+ *
+ *
+ *
+ * This module provides various QR decompositions
+ * This module also provides some MatrixBase methods, including:
+ *  - MatrixBase::householderQr()
+ *  - MatrixBase::colPivHouseholderQr()
+ *  - MatrixBase::fullPivHouseholderQr()
+ *
+ * \code
+ * #include <Eigen/QR>
+ * \endcode
+ */
 
 // IWYU pragma: begin_exports
 #include "src/QR/HouseholderQR.h"
@@ -45,4 +45,4 @@
 
 #include "src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_QR_MODULE_H
+#endif  // EIGEN_QR_MODULE_H
diff --git a/Eigen/QtAlignedMalloc b/Eigen/QtAlignedMalloc
index 6fe8237..585f8e8 100644
--- a/Eigen/QtAlignedMalloc
+++ b/Eigen/QtAlignedMalloc
@@ -14,19 +14,12 @@
 
 #include "src/Core/util/DisableStupidWarnings.h"
 
-void *qMalloc(std::size_t size)
-{
-  return Eigen::internal::aligned_malloc(size);
-}
+void *qMalloc(std::size_t size) { return Eigen::internal::aligned_malloc(size); }
 
-void qFree(void *ptr)
-{
-  Eigen::internal::aligned_free(ptr);
-}
+void qFree(void *ptr) { Eigen::internal::aligned_free(ptr); }
 
-void *qRealloc(void *ptr, std::size_t size)
-{
-  void* newPtr = Eigen::internal::aligned_malloc(size);
+void *qRealloc(void *ptr, std::size_t size) {
+  void *newPtr = Eigen::internal::aligned_malloc(size);
   std::memcpy(newPtr, ptr, size);
   Eigen::internal::aligned_free(ptr);
   return newPtr;
@@ -36,4 +29,4 @@
 
 #endif
 
-#endif // EIGEN_QTMALLOC_MODULE_H
+#endif  // EIGEN_QTMALLOC_MODULE_H
diff --git a/Eigen/SPQRSupport b/Eigen/SPQRSupport
index a25f5ef..c01dbe0 100644
--- a/Eigen/SPQRSupport
+++ b/Eigen/SPQRSupport
@@ -15,18 +15,20 @@
 #include "SuiteSparseQR.hpp"
 
 /** \ingroup Support_modules
-  * \defgroup SPQRSupport_Module SuiteSparseQR module
-  * 
-  * This module provides an interface to the SPQR library, which is part of the <a href="http://www.suitesparse.com">suitesparse</a> package.
-  *
-  * \code
-  * #include <Eigen/SPQRSupport>
-  * \endcode
-  *
-  * In order to use this module, the SPQR headers must be accessible from the include paths, and your binary must be linked to the SPQR library and its dependencies (Cholmod, AMD, COLAMD,...).
-  * For a cmake based project, you can use our FindSPQR.cmake and FindCholmod.Cmake modules
-  *
-  */
+ * \defgroup SPQRSupport_Module SuiteSparseQR module
+ *
+ * This module provides an interface to the SPQR library, which is part of the <a
+ * href="http://www.suitesparse.com">suitesparse</a> package.
+ *
+ * \code
+ * #include <Eigen/SPQRSupport>
+ * \endcode
+ *
+ * In order to use this module, the SPQR headers must be accessible from the include paths, and your binary must be
+ * linked to the SPQR library and its dependencies (Cholmod, AMD, COLAMD,...). For a cmake based project, you can use
+ * our FindSPQR.cmake and FindCholmod.Cmake modules
+ *
+ */
 
 #include "CholmodSupport"
 
diff --git a/Eigen/SVD b/Eigen/SVD
index b13ec2f..2a013f8 100644
--- a/Eigen/SVD
+++ b/Eigen/SVD
@@ -15,21 +15,22 @@
 #include "src/Core/util/DisableStupidWarnings.h"
 
 /** \defgroup SVD_Module SVD module
-  *
-  *
-  *
-  * This module provides SVD decomposition for matrices (both real and complex).
-  * Two decomposition algorithms are provided:
-  *  - JacobiSVD implementing two-sided Jacobi iterations is numerically very accurate, fast for small matrices, but very slow for larger ones.
-  *  - BDCSVD implementing a recursive divide & conquer strategy on top of an upper-bidiagonalization which remains fast for large problems.
-  * These decompositions are accessible via the respective classes and following MatrixBase methods:
-  *  - MatrixBase::jacobiSvd()
-  *  - MatrixBase::bdcSvd()
-  *
-  * \code
-  * #include <Eigen/SVD>
-  * \endcode
-  */
+ *
+ *
+ *
+ * This module provides SVD decomposition for matrices (both real and complex).
+ * Two decomposition algorithms are provided:
+ *  - JacobiSVD implementing two-sided Jacobi iterations is numerically very accurate, fast for small matrices, but very
+ * slow for larger ones.
+ *  - BDCSVD implementing a recursive divide & conquer strategy on top of an upper-bidiagonalization which remains fast
+ * for large problems. These decompositions are accessible via the respective classes and following MatrixBase methods:
+ *  - MatrixBase::jacobiSvd()
+ *  - MatrixBase::bdcSvd()
+ *
+ * \code
+ * #include <Eigen/SVD>
+ * \endcode
+ */
 
 // IWYU pragma: begin_exports
 #include "src/misc/RealSvd2x2.h"
@@ -52,4 +53,4 @@
 
 #include "src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_SVD_MODULE_H
+#endif  // EIGEN_SVD_MODULE_H
diff --git a/Eigen/Sparse b/Eigen/Sparse
index a2ef7a6..4d0ee8b 100644
--- a/Eigen/Sparse
+++ b/Eigen/Sparse
@@ -30,5 +30,4 @@
 #include "SparseQR"
 #include "IterativeLinearSolvers"
 
-#endif // EIGEN_SPARSE_MODULE_H
-
+#endif  // EIGEN_SPARSE_MODULE_H
diff --git a/Eigen/SparseCholesky b/Eigen/SparseCholesky
index 967196f..6abdcd6 100644
--- a/Eigen/SparseCholesky
+++ b/Eigen/SparseCholesky
@@ -15,20 +15,20 @@
 
 #include "src/Core/util/DisableStupidWarnings.h"
 
-/** 
-  * \defgroup SparseCholesky_Module SparseCholesky module
-  *
-  * This module currently provides two variants of the direct sparse Cholesky decomposition for selfadjoint (hermitian) matrices.
-  * Those decompositions are accessible via the following classes:
-  *  - SimplicialLLt,
-  *  - SimplicialLDLt
-  *
-  * Such problems can also be solved using the ConjugateGradient solver from the IterativeLinearSolvers module.
-  *
-  * \code
-  * #include <Eigen/SparseCholesky>
-  * \endcode
-  */
+/**
+ * \defgroup SparseCholesky_Module SparseCholesky module
+ *
+ * This module currently provides two variants of the direct sparse Cholesky decomposition for selfadjoint (hermitian)
+ * matrices. Those decompositions are accessible via the following classes:
+ *  - SimplicialLLt,
+ *  - SimplicialLDLt
+ *
+ * Such problems can also be solved using the ConjugateGradient solver from the IterativeLinearSolvers module.
+ *
+ * \code
+ * #include <Eigen/SparseCholesky>
+ * \endcode
+ */
 
 // IWYU pragma: begin_exports
 #include "src/SparseCholesky/SimplicialCholesky.h"
@@ -37,4 +37,4 @@
 
 #include "src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_SPARSECHOLESKY_MODULE_H
+#endif  // EIGEN_SPARSECHOLESKY_MODULE_H
diff --git a/Eigen/SparseCore b/Eigen/SparseCore
index 292b089..56a9401 100644
--- a/Eigen/SparseCore
+++ b/Eigen/SparseCore
@@ -19,20 +19,20 @@
 #include <algorithm>
 #include <numeric>
 
-/** 
-  * \defgroup SparseCore_Module SparseCore module
-  *
-  * This module provides a sparse matrix representation, and basic associated matrix manipulations
-  * and operations.
-  *
-  * See the \ref TutorialSparse "Sparse tutorial"
-  *
-  * \code
-  * #include <Eigen/SparseCore>
-  * \endcode
-  *
-  * This module depends on: Core.
-  */
+/**
+ * \defgroup SparseCore_Module SparseCore module
+ *
+ * This module provides a sparse matrix representation, and basic associated matrix manipulations
+ * and operations.
+ *
+ * See the \ref TutorialSparse "Sparse tutorial"
+ *
+ * \code
+ * #include <Eigen/SparseCore>
+ * \endcode
+ *
+ * This module depends on: Core.
+ */
 
 // IWYU pragma: begin_exports
 #include "src/SparseCore/SparseUtil.h"
@@ -67,5 +67,4 @@
 
 #include "src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_SPARSECORE_MODULE_H
-
+#endif  // EIGEN_SPARSECORE_MODULE_H
diff --git a/Eigen/SparseLU b/Eigen/SparseLU
index 9ec6ac7..6faf130 100644
--- a/Eigen/SparseLU
+++ b/Eigen/SparseLU
@@ -13,12 +13,12 @@
 
 #include "SparseCore"
 
-/** 
-  * \defgroup SparseLU_Module SparseLU module
-  * This module defines a supernodal factorization of general sparse matrices.
-  * The code is fully optimized for supernode-panel updates with specialized kernels.
-  * Please, see the documentation of the SparseLU class for more details.
-  */
+/**
+ * \defgroup SparseLU_Module SparseLU module
+ * This module defines a supernodal factorization of general sparse matrices.
+ * The code is fully optimized for supernode-panel updates with specialized kernels.
+ * Please, see the documentation of the SparseLU class for more details.
+ */
 
 // Ordering interface
 #include "OrderingMethods"
@@ -47,4 +47,4 @@
 
 #include "src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_SPARSELU_MODULE_H
+#endif  // EIGEN_SPARSELU_MODULE_H
diff --git a/Eigen/SparseQR b/Eigen/SparseQR
index 4bc144c..b4f1cad 100644
--- a/Eigen/SparseQR
+++ b/Eigen/SparseQR
@@ -13,20 +13,20 @@
 #include "src/Core/util/DisableStupidWarnings.h"
 
 /** \defgroup SparseQR_Module SparseQR module
-  * \brief Provides QR decomposition for sparse matrices
-  * 
-  * This module provides a simplicial version of the left-looking Sparse QR decomposition. 
-  * The columns of the input matrix should be reordered to limit the fill-in during the 
-  * decomposition. Built-in methods (COLAMD, AMD) or external  methods (METIS) can be used to this end.
-  * See the \link OrderingMethods_Module OrderingMethods\endlink module for the list 
-  * of built-in and external ordering methods.
-  * 
-  * \code
-  * #include <Eigen/SparseQR>
-  * \endcode
-  * 
-  * 
-  */
+ * \brief Provides QR decomposition for sparse matrices
+ *
+ * This module provides a simplicial version of the left-looking Sparse QR decomposition.
+ * The columns of the input matrix should be reordered to limit the fill-in during the
+ * decomposition. Built-in methods (COLAMD, AMD) or external  methods (METIS) can be used to this end.
+ * See the \link OrderingMethods_Module OrderingMethods\endlink module for the list
+ * of built-in and external ordering methods.
+ *
+ * \code
+ * #include <Eigen/SparseQR>
+ * \endcode
+ *
+ *
+ */
 
 // IWYU pragma: begin_exports
 #include "src/SparseCore/SparseColEtree.h"
diff --git a/Eigen/StdDeque b/Eigen/StdDeque
index 29550e2..01e1d76 100644
--- a/Eigen/StdDeque
+++ b/Eigen/StdDeque
@@ -14,7 +14,8 @@
 #include "Core"
 #include <deque>
 
-#if EIGEN_COMP_MSVC && EIGEN_OS_WIN64 && (EIGEN_MAX_STATIC_ALIGN_BYTES<=16) /* MSVC auto aligns up to 16 bytes in 64 bit builds */
+#if EIGEN_COMP_MSVC && EIGEN_OS_WIN64 && \
+    (EIGEN_MAX_STATIC_ALIGN_BYTES <= 16) /* MSVC auto aligns up to 16 bytes in 64 bit builds */
 
 #define EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(...)
 
@@ -26,4 +27,4 @@
 
 #endif
 
-#endif // EIGEN_STDDEQUE_MODULE_H
+#endif  // EIGEN_STDDEQUE_MODULE_H
diff --git a/Eigen/StdList b/Eigen/StdList
index 8a22fc8..1453c9f 100644
--- a/Eigen/StdList
+++ b/Eigen/StdList
@@ -13,7 +13,8 @@
 #include "Core"
 #include <list>
 
-#if EIGEN_COMP_MSVC && EIGEN_OS_WIN64 && (EIGEN_MAX_STATIC_ALIGN_BYTES<=16) /* MSVC auto aligns up to 16 bytes in 64 bit builds */
+#if EIGEN_COMP_MSVC && EIGEN_OS_WIN64 && \
+    (EIGEN_MAX_STATIC_ALIGN_BYTES <= 16) /* MSVC auto aligns up to 16 bytes in 64 bit builds */
 
 #define EIGEN_DEFINE_STL_LIST_SPECIALIZATION(...)
 
@@ -25,4 +26,4 @@
 
 #endif
 
-#endif // EIGEN_STDLIST_MODULE_H
+#endif  // EIGEN_STDLIST_MODULE_H
diff --git a/Eigen/StdVector b/Eigen/StdVector
index e68f6b5..711a654 100644
--- a/Eigen/StdVector
+++ b/Eigen/StdVector
@@ -14,7 +14,8 @@
 #include "Core"
 #include <vector>
 
-#if EIGEN_COMP_MSVC && EIGEN_OS_WIN64 && (EIGEN_MAX_STATIC_ALIGN_BYTES<=16) /* MSVC auto aligns up to 16 bytes in 64 bit builds */
+#if EIGEN_COMP_MSVC && EIGEN_OS_WIN64 && \
+    (EIGEN_MAX_STATIC_ALIGN_BYTES <= 16) /* MSVC auto aligns up to 16 bytes in 64 bit builds */
 
 #define EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(...)
 
@@ -26,4 +27,4 @@
 
 #endif
 
-#endif // EIGEN_STDVECTOR_MODULE_H
+#endif  // EIGEN_STDVECTOR_MODULE_H
diff --git a/Eigen/SuperLUSupport b/Eigen/SuperLUSupport
index 33997fa..79e2222 100644
--- a/Eigen/SuperLUSupport
+++ b/Eigen/SuperLUSupport
@@ -26,36 +26,40 @@
 // If EMPTY was already defined then we don't undef it.
 
 #if defined(EIGEN_EMPTY_WAS_ALREADY_DEFINED)
-# undef EIGEN_EMPTY_WAS_ALREADY_DEFINED
+#undef EIGEN_EMPTY_WAS_ALREADY_DEFINED
 #elif defined(EMPTY)
-# undef EMPTY
+#undef EMPTY
 #endif
 
 #define SUPERLU_EMPTY (-1)
 
-namespace Eigen { struct SluMatrix; }
+namespace Eigen {
+struct SluMatrix;
+}
 
 /** \ingroup Support_modules
-  * \defgroup SuperLUSupport_Module SuperLUSupport module
-  *
-  * This module provides an interface to the <a href="http://crd-legacy.lbl.gov/~xiaoye/SuperLU/">SuperLU</a> library.
-  * It provides the following factorization class:
-  * - class SuperLU: a supernodal sequential LU factorization.
-  * - class SuperILU: a supernodal sequential incomplete LU factorization (to be used as a preconditioner for iterative methods).
-  *
-  * \warning This wrapper requires at least versions 4.0 of SuperLU. The 3.x versions are not supported.
-  *
-  * \warning When including this module, you have to use SUPERLU_EMPTY instead of EMPTY which is no longer defined because it is too polluting.
-  *
-  * \code
-  * #include <Eigen/SuperLUSupport>
-  * \endcode
-  *
-  * In order to use this module, the superlu headers must be accessible from the include paths, and your binary must be linked to the superlu library and its dependencies.
-  * The dependencies depend on how superlu has been compiled.
-  * For a cmake based project, you can use our FindSuperLU.cmake module to help you in this task.
-  *
-  */
+ * \defgroup SuperLUSupport_Module SuperLUSupport module
+ *
+ * This module provides an interface to the <a href="http://crd-legacy.lbl.gov/~xiaoye/SuperLU/">SuperLU</a> library.
+ * It provides the following factorization class:
+ * - class SuperLU: a supernodal sequential LU factorization.
+ * - class SuperILU: a supernodal sequential incomplete LU factorization (to be used as a preconditioner for iterative
+ * methods).
+ *
+ * \warning This wrapper requires at least versions 4.0 of SuperLU. The 3.x versions are not supported.
+ *
+ * \warning When including this module, you have to use SUPERLU_EMPTY instead of EMPTY which is no longer defined
+ * because it is too polluting.
+ *
+ * \code
+ * #include <Eigen/SuperLUSupport>
+ * \endcode
+ *
+ * In order to use this module, the superlu headers must be accessible from the include paths, and your binary must be
+ * linked to the superlu library and its dependencies. The dependencies depend on how superlu has been compiled. For a
+ * cmake based project, you can use our FindSuperLU.cmake module to help you in this task.
+ *
+ */
 
 // IWYU pragma: begin_exports
 #include "src/SuperLUSupport/SuperLUSupport.h"
@@ -63,4 +67,4 @@
 
 #include "src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_SUPERLUSUPPORT_MODULE_H
+#endif  // EIGEN_SUPERLUSUPPORT_MODULE_H
diff --git a/Eigen/ThreadPool b/Eigen/ThreadPool
index 9be594f..febb187 100644
--- a/Eigen/ThreadPool
+++ b/Eigen/ThreadPool
@@ -15,15 +15,15 @@
 #include "src/Core/util/DisableStupidWarnings.h"
 
 /** \defgroup ThreadPool_Module ThreadPool Module
-  *
-  * This module provides 2 threadpool implementations
-  *  - a simple reference implementation
-  *  - a faster non blocking implementation
-  *
-  * \code
-  * #include <Eigen/ThreadPool>
-  * \endcode
-  */
+ *
+ * This module provides 2 threadpool implementations
+ *  - a simple reference implementation
+ *  - a faster non blocking implementation
+ *
+ * \code
+ * #include <Eigen/ThreadPool>
+ * \endcode
+ */
 
 #include <cstddef>
 #include <cstring>
@@ -75,4 +75,4 @@
 
 #include "src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_CXX11_THREADPOOL_MODULE_H
+#endif  // EIGEN_CXX11_THREADPOOL_MODULE_H
diff --git a/Eigen/UmfPackSupport b/Eigen/UmfPackSupport
index eea150e..126344c 100644
--- a/Eigen/UmfPackSupport
+++ b/Eigen/UmfPackSupport
@@ -17,21 +17,21 @@
 }
 
 /** \ingroup Support_modules
-  * \defgroup UmfPackSupport_Module UmfPackSupport module
-  *
-  * This module provides an interface to the UmfPack library which is part of the <a href="http://www.suitesparse.com">suitesparse</a> package.
-  * It provides the following factorization class:
-  * - class UmfPackLU: a multifrontal sequential LU factorization.
-  *
-  * \code
-  * #include <Eigen/UmfPackSupport>
-  * \endcode
-  *
-  * In order to use this module, the umfpack headers must be accessible from the include paths, and your binary must be linked to the umfpack library and its dependencies.
-  * The dependencies depend on how umfpack has been compiled.
-  * For a cmake based project, you can use our FindUmfPack.cmake module to help you in this task.
-  *
-  */
+ * \defgroup UmfPackSupport_Module UmfPackSupport module
+ *
+ * This module provides an interface to the UmfPack library which is part of the <a
+ * href="http://www.suitesparse.com">suitesparse</a> package. It provides the following factorization class:
+ * - class UmfPackLU: a multifrontal sequential LU factorization.
+ *
+ * \code
+ * #include <Eigen/UmfPackSupport>
+ * \endcode
+ *
+ * In order to use this module, the umfpack headers must be accessible from the include paths, and your binary must be
+ * linked to the umfpack library and its dependencies. The dependencies depend on how umfpack has been compiled. For a
+ * cmake based project, you can use our FindUmfPack.cmake module to help you in this task.
+ *
+ */
 
 // IWYU pragma: begin_exports
 #include "src/UmfPackSupport/UmfPackSupport.h"
@@ -39,4 +39,4 @@
 
 #include "src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_UMFPACKSUPPORT_MODULE_H
+#endif  // EIGEN_UMFPACKSUPPORT_MODULE_H
diff --git a/Eigen/src/AccelerateSupport/AccelerateSupport.h b/Eigen/src/AccelerateSupport/AccelerateSupport.h
index 0417688..09967ff 100644
--- a/Eigen/src/AccelerateSupport/AccelerateSupport.h
+++ b/Eigen/src/AccelerateSupport/AccelerateSupport.h
@@ -11,98 +11,99 @@
 class AccelerateImpl;
 
 /** \ingroup AccelerateSupport_Module
-  * \class AccelerateLLT
-  * \brief A direct Cholesky (LLT) factorization and solver based on Accelerate
-  *
-  * \warning Only single and double precision real scalar types are supported by Accelerate
-  * 
-  * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
-  * \tparam UpLo_ additional information about the matrix structure. Default is Lower.
-  *
-  * \sa \ref TutorialSparseSolverConcept, class AccelerateLLT
-  */
+ * \class AccelerateLLT
+ * \brief A direct Cholesky (LLT) factorization and solver based on Accelerate
+ *
+ * \warning Only single and double precision real scalar types are supported by Accelerate
+ *
+ * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
+ * \tparam UpLo_ additional information about the matrix structure. Default is Lower.
+ *
+ * \sa \ref TutorialSparseSolverConcept, class AccelerateLLT
+ */
 template <typename MatrixType, int UpLo = Lower>
 using AccelerateLLT = AccelerateImpl<MatrixType, UpLo | Symmetric, SparseFactorizationCholesky, true>;
 
 /** \ingroup AccelerateSupport_Module
-  * \class AccelerateLDLT
-  * \brief The default Cholesky (LDLT) factorization and solver based on Accelerate
-  *
-  * \warning Only single and double precision real scalar types are supported by Accelerate
-  * 
-  * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
-  * \tparam UpLo_ additional information about the matrix structure. Default is Lower.
-  *
-  * \sa \ref TutorialSparseSolverConcept, class AccelerateLDLT
-  */
+ * \class AccelerateLDLT
+ * \brief The default Cholesky (LDLT) factorization and solver based on Accelerate
+ *
+ * \warning Only single and double precision real scalar types are supported by Accelerate
+ *
+ * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
+ * \tparam UpLo_ additional information about the matrix structure. Default is Lower.
+ *
+ * \sa \ref TutorialSparseSolverConcept, class AccelerateLDLT
+ */
 template <typename MatrixType, int UpLo = Lower>
 using AccelerateLDLT = AccelerateImpl<MatrixType, UpLo | Symmetric, SparseFactorizationLDLT, true>;
 
 /** \ingroup AccelerateSupport_Module
-  * \class AccelerateLDLTUnpivoted
-  * \brief A direct Cholesky-like LDL^T factorization and solver based on Accelerate with only 1x1 pivots and no pivoting
-  *
-  * \warning Only single and double precision real scalar types are supported by Accelerate
-  * 
-  * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
-  * \tparam UpLo_ additional information about the matrix structure. Default is Lower.
-  *
-  * \sa \ref TutorialSparseSolverConcept, class AccelerateLDLTUnpivoted
-  */
+ * \class AccelerateLDLTUnpivoted
+ * \brief A direct Cholesky-like LDL^T factorization and solver based on Accelerate with only 1x1 pivots and no pivoting
+ *
+ * \warning Only single and double precision real scalar types are supported by Accelerate
+ *
+ * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
+ * \tparam UpLo_ additional information about the matrix structure. Default is Lower.
+ *
+ * \sa \ref TutorialSparseSolverConcept, class AccelerateLDLTUnpivoted
+ */
 template <typename MatrixType, int UpLo = Lower>
 using AccelerateLDLTUnpivoted = AccelerateImpl<MatrixType, UpLo | Symmetric, SparseFactorizationLDLTUnpivoted, true>;
 
 /** \ingroup AccelerateSupport_Module
-  * \class AccelerateLDLTSBK
-  * \brief A direct Cholesky (LDLT) factorization and solver based on Accelerate with Supernode Bunch-Kaufman and static pivoting
-  *
-  * \warning Only single and double precision real scalar types are supported by Accelerate
-  * 
-  * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
-  * \tparam UpLo_ additional information about the matrix structure. Default is Lower.
-  *
-  * \sa \ref TutorialSparseSolverConcept, class AccelerateLDLTSBK
-  */
+ * \class AccelerateLDLTSBK
+ * \brief A direct Cholesky (LDLT) factorization and solver based on Accelerate with Supernode Bunch-Kaufman and static
+ * pivoting
+ *
+ * \warning Only single and double precision real scalar types are supported by Accelerate
+ *
+ * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
+ * \tparam UpLo_ additional information about the matrix structure. Default is Lower.
+ *
+ * \sa \ref TutorialSparseSolverConcept, class AccelerateLDLTSBK
+ */
 template <typename MatrixType, int UpLo = Lower>
 using AccelerateLDLTSBK = AccelerateImpl<MatrixType, UpLo | Symmetric, SparseFactorizationLDLTSBK, true>;
 
 /** \ingroup AccelerateSupport_Module
-  * \class AccelerateLDLTTPP
-  * \brief A direct Cholesky (LDLT) factorization and solver based on Accelerate with full threshold partial pivoting
-  *
-  * \warning Only single and double precision real scalar types are supported by Accelerate
-  * 
-  * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
-  * \tparam UpLo_ additional information about the matrix structure. Default is Lower.
-  *
-  * \sa \ref TutorialSparseSolverConcept, class AccelerateLDLTTPP
-  */
+ * \class AccelerateLDLTTPP
+ * \brief A direct Cholesky (LDLT) factorization and solver based on Accelerate with full threshold partial pivoting
+ *
+ * \warning Only single and double precision real scalar types are supported by Accelerate
+ *
+ * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
+ * \tparam UpLo_ additional information about the matrix structure. Default is Lower.
+ *
+ * \sa \ref TutorialSparseSolverConcept, class AccelerateLDLTTPP
+ */
 template <typename MatrixType, int UpLo = Lower>
 using AccelerateLDLTTPP = AccelerateImpl<MatrixType, UpLo | Symmetric, SparseFactorizationLDLTTPP, true>;
 
 /** \ingroup AccelerateSupport_Module
-  * \class AccelerateQR
-  * \brief A QR factorization and solver based on Accelerate
-  *
-  * \warning Only single and double precision real scalar types are supported by Accelerate
-  * 
-  * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
-  *
-  * \sa \ref TutorialSparseSolverConcept, class AccelerateQR
-  */
+ * \class AccelerateQR
+ * \brief A QR factorization and solver based on Accelerate
+ *
+ * \warning Only single and double precision real scalar types are supported by Accelerate
+ *
+ * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
+ *
+ * \sa \ref TutorialSparseSolverConcept, class AccelerateQR
+ */
 template <typename MatrixType>
 using AccelerateQR = AccelerateImpl<MatrixType, 0, SparseFactorizationQR, false>;
 
 /** \ingroup AccelerateSupport_Module
-  * \class AccelerateCholeskyAtA
-  * \brief A QR factorization and solver based on Accelerate without storing Q (equivalent to A^TA = R^T R)
-  *
-  * \warning Only single and double precision real scalar types are supported by Accelerate
-  * 
-  * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
-  *
-  * \sa \ref TutorialSparseSolverConcept, class AccelerateCholeskyAtA
-  */
+ * \class AccelerateCholeskyAtA
+ * \brief A QR factorization and solver based on Accelerate without storing Q (equivalent to A^TA = R^T R)
+ *
+ * \warning Only single and double precision real scalar types are supported by Accelerate
+ *
+ * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
+ *
+ * \sa \ref TutorialSparseSolverConcept, class AccelerateCholeskyAtA
+ */
 template <typename MatrixType>
 using AccelerateCholeskyAtA = AccelerateImpl<MatrixType, 0, SparseFactorizationCholeskyAtA, false>;
 
@@ -361,7 +362,8 @@
 
 /** Performs a numeric decomposition of matrix \a a.
  *
- * The given matrix must have the same sparsity pattern as the matrix on which the symbolic decomposition has been performed.
+ * The given matrix must have the same sparsity pattern as the matrix on which the symbolic decomposition has been
+ * performed.
  *
  * \sa analyzePattern()
  */
diff --git a/Eigen/src/Cholesky/LDLT.h b/Eigen/src/Cholesky/LDLT.h
index f0664e9..5d52ab2 100644
--- a/Eigen/src/Cholesky/LDLT.h
+++ b/Eigen/src/Cholesky/LDLT.h
@@ -19,329 +19,308 @@
 namespace Eigen {
 
 namespace internal {
-  template<typename MatrixType_, int UpLo_> struct traits<LDLT<MatrixType_, UpLo_> >
-   : traits<MatrixType_>
-  {
-    typedef MatrixXpr XprKind;
-    typedef SolverStorage StorageKind;
-    typedef int StorageIndex;
-    enum { Flags = 0 };
-  };
+template <typename MatrixType_, int UpLo_>
+struct traits<LDLT<MatrixType_, UpLo_> > : traits<MatrixType_> {
+  typedef MatrixXpr XprKind;
+  typedef SolverStorage StorageKind;
+  typedef int StorageIndex;
+  enum { Flags = 0 };
+};
 
-  template<typename MatrixType, int UpLo> struct LDLT_Traits;
+template <typename MatrixType, int UpLo>
+struct LDLT_Traits;
 
-  // PositiveSemiDef means positive semi-definite and non-zero; same for NegativeSemiDef
-  enum SignMatrix { PositiveSemiDef, NegativeSemiDef, ZeroSign, Indefinite };
-}
+// PositiveSemiDef means positive semi-definite and non-zero; same for NegativeSemiDef
+enum SignMatrix { PositiveSemiDef, NegativeSemiDef, ZeroSign, Indefinite };
+}  // namespace internal
 
 /** \ingroup Cholesky_Module
-  *
-  * \class LDLT
-  *
-  * \brief Robust Cholesky decomposition of a matrix with pivoting
-  *
-  * \tparam MatrixType_ the type of the matrix of which to compute the LDL^T Cholesky decomposition
-  * \tparam UpLo_ the triangular part that will be used for the decomposition: Lower (default) or Upper.
-  *             The other triangular part won't be read.
-  *
-  * Perform a robust Cholesky decomposition of a positive semidefinite or negative semidefinite
-  * matrix \f$ A \f$ such that \f$ A =  P^TLDL^*P \f$, where P is a permutation matrix, L
-  * is lower triangular with a unit diagonal and D is a diagonal matrix.
-  *
-  * The decomposition uses pivoting to ensure stability, so that D will have
-  * zeros in the bottom right rank(A) - n submatrix. Avoiding the square root
-  * on D also stabilizes the computation.
-  *
-  * Remember that Cholesky decompositions are not rank-revealing. Also, do not use a Cholesky
-  * decomposition to determine whether a system of equations has a solution.
-  *
-  * This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism.
-  *
-  * \sa MatrixBase::ldlt(), SelfAdjointView::ldlt(), class LLT
-  */
-template<typename MatrixType_, int UpLo_> class LDLT
-        : public SolverBase<LDLT<MatrixType_, UpLo_> >
-{
-  public:
-    typedef MatrixType_ MatrixType;
-    typedef SolverBase<LDLT> Base;
-    friend class SolverBase<LDLT>;
+ *
+ * \class LDLT
+ *
+ * \brief Robust Cholesky decomposition of a matrix with pivoting
+ *
+ * \tparam MatrixType_ the type of the matrix of which to compute the LDL^T Cholesky decomposition
+ * \tparam UpLo_ the triangular part that will be used for the decomposition: Lower (default) or Upper.
+ *             The other triangular part won't be read.
+ *
+ * Perform a robust Cholesky decomposition of a positive semidefinite or negative semidefinite
+ * matrix \f$ A \f$ such that \f$ A =  P^TLDL^*P \f$, where P is a permutation matrix, L
+ * is lower triangular with a unit diagonal and D is a diagonal matrix.
+ *
+ * The decomposition uses pivoting to ensure stability, so that D will have
+ * zeros in the bottom right rank(A) - n submatrix. Avoiding the square root
+ * on D also stabilizes the computation.
+ *
+ * Remember that Cholesky decompositions are not rank-revealing. Also, do not use a Cholesky
+ * decomposition to determine whether a system of equations has a solution.
+ *
+ * This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism.
+ *
+ * \sa MatrixBase::ldlt(), SelfAdjointView::ldlt(), class LLT
+ */
+template <typename MatrixType_, int UpLo_>
+class LDLT : public SolverBase<LDLT<MatrixType_, UpLo_> > {
+ public:
+  typedef MatrixType_ MatrixType;
+  typedef SolverBase<LDLT> Base;
+  friend class SolverBase<LDLT>;
 
-    EIGEN_GENERIC_PUBLIC_INTERFACE(LDLT)
-    enum {
-      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
-      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,
-      UpLo = UpLo_
-    };
-    typedef Matrix<Scalar, RowsAtCompileTime, 1, 0, MaxRowsAtCompileTime, 1> TmpMatrixType;
+  EIGEN_GENERIC_PUBLIC_INTERFACE(LDLT)
+  enum {
+    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,
+    UpLo = UpLo_
+  };
+  typedef Matrix<Scalar, RowsAtCompileTime, 1, 0, MaxRowsAtCompileTime, 1> TmpMatrixType;
 
-    typedef Transpositions<RowsAtCompileTime, MaxRowsAtCompileTime> TranspositionType;
-    typedef PermutationMatrix<RowsAtCompileTime, MaxRowsAtCompileTime> PermutationType;
+  typedef Transpositions<RowsAtCompileTime, MaxRowsAtCompileTime> TranspositionType;
+  typedef PermutationMatrix<RowsAtCompileTime, MaxRowsAtCompileTime> PermutationType;
 
-    typedef internal::LDLT_Traits<MatrixType,UpLo> Traits;
+  typedef internal::LDLT_Traits<MatrixType, UpLo> Traits;
 
-    /** \brief Default Constructor.
-      *
-      * The default constructor is useful in cases in which the user intends to
-      * perform decompositions via LDLT::compute(const MatrixType&).
-      */
-    LDLT()
-      : m_matrix(),
-        m_transpositions(),
-        m_sign(internal::ZeroSign),
-        m_isInitialized(false)
-    {}
+  /** \brief Default Constructor.
+   *
+   * The default constructor is useful in cases in which the user intends to
+   * perform decompositions via LDLT::compute(const MatrixType&).
+   */
+  LDLT() : m_matrix(), m_transpositions(), m_sign(internal::ZeroSign), m_isInitialized(false) {}
 
-    /** \brief Default Constructor with memory preallocation
-      *
-      * Like the default constructor but with preallocation of the internal data
-      * according to the specified problem \a size.
-      * \sa LDLT()
-      */
-    explicit LDLT(Index size)
+  /** \brief Default Constructor with memory preallocation
+   *
+   * Like the default constructor but with preallocation of the internal data
+   * according to the specified problem \a size.
+   * \sa LDLT()
+   */
+  explicit LDLT(Index size)
       : m_matrix(size, size),
         m_transpositions(size),
         m_temporary(size),
         m_sign(internal::ZeroSign),
-        m_isInitialized(false)
-    {}
+        m_isInitialized(false) {}
 
-    /** \brief Constructor with decomposition
-      *
-      * This calculates the decomposition for the input \a matrix.
-      *
-      * \sa LDLT(Index size)
-      */
-    template<typename InputType>
-    explicit LDLT(const EigenBase<InputType>& matrix)
+  /** \brief Constructor with decomposition
+   *
+   * This calculates the decomposition for the input \a matrix.
+   *
+   * \sa LDLT(Index size)
+   */
+  template <typename InputType>
+  explicit LDLT(const EigenBase<InputType>& matrix)
       : m_matrix(matrix.rows(), matrix.cols()),
         m_transpositions(matrix.rows()),
         m_temporary(matrix.rows()),
         m_sign(internal::ZeroSign),
-        m_isInitialized(false)
-    {
-      compute(matrix.derived());
-    }
+        m_isInitialized(false) {
+    compute(matrix.derived());
+  }
 
-    /** \brief Constructs a LDLT factorization from a given matrix
-      *
-      * This overloaded constructor is provided for \link InplaceDecomposition inplace decomposition \endlink when \c MatrixType is a Eigen::Ref.
-      *
-      * \sa LDLT(const EigenBase&)
-      */
-    template<typename InputType>
-    explicit LDLT(EigenBase<InputType>& matrix)
+  /** \brief Constructs a LDLT factorization from a given matrix
+   *
+   * This overloaded constructor is provided for \link InplaceDecomposition inplace decomposition \endlink when \c
+   * MatrixType is a Eigen::Ref.
+   *
+   * \sa LDLT(const EigenBase&)
+   */
+  template <typename InputType>
+  explicit LDLT(EigenBase<InputType>& matrix)
       : m_matrix(matrix.derived()),
         m_transpositions(matrix.rows()),
         m_temporary(matrix.rows()),
         m_sign(internal::ZeroSign),
-        m_isInitialized(false)
-    {
-      compute(matrix.derived());
-    }
+        m_isInitialized(false) {
+    compute(matrix.derived());
+  }
 
-    /** Clear any existing decomposition
-     * \sa rankUpdate(w,sigma)
-     */
-    void setZero()
-    {
-      m_isInitialized = false;
-    }
+  /** Clear any existing decomposition
+   * \sa rankUpdate(w,sigma)
+   */
+  void setZero() { m_isInitialized = false; }
 
-    /** \returns a view of the upper triangular matrix U */
-    inline typename Traits::MatrixU matrixU() const
-    {
-      eigen_assert(m_isInitialized && "LDLT is not initialized.");
-      return Traits::getU(m_matrix);
-    }
+  /** \returns a view of the upper triangular matrix U */
+  inline typename Traits::MatrixU matrixU() const {
+    eigen_assert(m_isInitialized && "LDLT is not initialized.");
+    return Traits::getU(m_matrix);
+  }
 
-    /** \returns a view of the lower triangular matrix L */
-    inline typename Traits::MatrixL matrixL() const
-    {
-      eigen_assert(m_isInitialized && "LDLT is not initialized.");
-      return Traits::getL(m_matrix);
-    }
+  /** \returns a view of the lower triangular matrix L */
+  inline typename Traits::MatrixL matrixL() const {
+    eigen_assert(m_isInitialized && "LDLT is not initialized.");
+    return Traits::getL(m_matrix);
+  }
 
-    /** \returns the permutation matrix P as a transposition sequence.
-      */
-    inline const TranspositionType& transpositionsP() const
-    {
-      eigen_assert(m_isInitialized && "LDLT is not initialized.");
-      return m_transpositions;
-    }
+  /** \returns the permutation matrix P as a transposition sequence.
+   */
+  inline const TranspositionType& transpositionsP() const {
+    eigen_assert(m_isInitialized && "LDLT is not initialized.");
+    return m_transpositions;
+  }
 
-    /** \returns the coefficients of the diagonal matrix D */
-    inline Diagonal<const MatrixType> vectorD() const
-    {
-      eigen_assert(m_isInitialized && "LDLT is not initialized.");
-      return m_matrix.diagonal();
-    }
+  /** \returns the coefficients of the diagonal matrix D */
+  inline Diagonal<const MatrixType> vectorD() const {
+    eigen_assert(m_isInitialized && "LDLT is not initialized.");
+    return m_matrix.diagonal();
+  }
 
-    /** \returns true if the matrix is positive (semidefinite) */
-    inline bool isPositive() const
-    {
-      eigen_assert(m_isInitialized && "LDLT is not initialized.");
-      return m_sign == internal::PositiveSemiDef || m_sign == internal::ZeroSign;
-    }
+  /** \returns true if the matrix is positive (semidefinite) */
+  inline bool isPositive() const {
+    eigen_assert(m_isInitialized && "LDLT is not initialized.");
+    return m_sign == internal::PositiveSemiDef || m_sign == internal::ZeroSign;
+  }
 
-    /** \returns true if the matrix is negative (semidefinite) */
-    inline bool isNegative(void) const
-    {
-      eigen_assert(m_isInitialized && "LDLT is not initialized.");
-      return m_sign == internal::NegativeSemiDef || m_sign == internal::ZeroSign;
-    }
+  /** \returns true if the matrix is negative (semidefinite) */
+  inline bool isNegative(void) const {
+    eigen_assert(m_isInitialized && "LDLT is not initialized.");
+    return m_sign == internal::NegativeSemiDef || m_sign == internal::ZeroSign;
+  }
 
-    #ifdef EIGEN_PARSED_BY_DOXYGEN
-    /** \returns a solution x of \f$ A x = b \f$ using the current decomposition of A.
-      *
-      * This function also supports in-place solves using the syntax <tt>x = decompositionObject.solve(x)</tt> .
-      *
-      * \note_about_checking_solutions
-      *
-      * More precisely, this method solves \f$ A x = b \f$ using the decomposition \f$ A = P^T L D L^* P \f$
-      * by solving the systems \f$ P^T y_1 = b \f$, \f$ L y_2 = y_1 \f$, \f$ D y_3 = y_2 \f$,
-      * \f$ L^* y_4 = y_3 \f$ and \f$ P x = y_4 \f$ in succession. If the matrix \f$ A \f$ is singular, then
-      * \f$ D \f$ will also be singular (all the other matrices are invertible). In that case, the
-      * least-square solution of \f$ D y_3 = y_2 \f$ is computed. This does not mean that this function
-      * computes the least-square solution of \f$ A x = b \f$ if \f$ A \f$ is singular.
-      *
-      * \sa MatrixBase::ldlt(), SelfAdjointView::ldlt()
-      */
-    template<typename Rhs>
-    inline const Solve<LDLT, Rhs>
-    solve(const MatrixBase<Rhs>& b) const;
-    #endif
+#ifdef EIGEN_PARSED_BY_DOXYGEN
+  /** \returns a solution x of \f$ A x = b \f$ using the current decomposition of A.
+   *
+   * This function also supports in-place solves using the syntax <tt>x = decompositionObject.solve(x)</tt> .
+   *
+   * \note_about_checking_solutions
+   *
+   * More precisely, this method solves \f$ A x = b \f$ using the decomposition \f$ A = P^T L D L^* P \f$
+   * by solving the systems \f$ P^T y_1 = b \f$, \f$ L y_2 = y_1 \f$, \f$ D y_3 = y_2 \f$,
+   * \f$ L^* y_4 = y_3 \f$ and \f$ P x = y_4 \f$ in succession. If the matrix \f$ A \f$ is singular, then
+   * \f$ D \f$ will also be singular (all the other matrices are invertible). In that case, the
+   * least-square solution of \f$ D y_3 = y_2 \f$ is computed. This does not mean that this function
+   * computes the least-square solution of \f$ A x = b \f$ if \f$ A \f$ is singular.
+   *
+   * \sa MatrixBase::ldlt(), SelfAdjointView::ldlt()
+   */
+  template <typename Rhs>
+  inline const Solve<LDLT, Rhs> solve(const MatrixBase<Rhs>& b) const;
+#endif
 
-    template<typename Derived>
-    bool solveInPlace(MatrixBase<Derived> &bAndX) const;
+  template <typename Derived>
+  bool solveInPlace(MatrixBase<Derived>& bAndX) const;
 
-    template<typename InputType>
-    LDLT& compute(const EigenBase<InputType>& matrix);
+  template <typename InputType>
+  LDLT& compute(const EigenBase<InputType>& matrix);
 
-    /** \returns an estimate of the reciprocal condition number of the matrix of
-     *  which \c *this is the LDLT decomposition.
-     */
-    RealScalar rcond() const
-    {
-      eigen_assert(m_isInitialized && "LDLT is not initialized.");
-      return internal::rcond_estimate_helper(m_l1_norm, *this);
-    }
+  /** \returns an estimate of the reciprocal condition number of the matrix of
+   *  which \c *this is the LDLT decomposition.
+   */
+  RealScalar rcond() const {
+    eigen_assert(m_isInitialized && "LDLT is not initialized.");
+    return internal::rcond_estimate_helper(m_l1_norm, *this);
+  }
 
-    template <typename Derived>
-    LDLT& rankUpdate(const MatrixBase<Derived>& w, const RealScalar& alpha=1);
+  template <typename Derived>
+  LDLT& rankUpdate(const MatrixBase<Derived>& w, const RealScalar& alpha = 1);
 
-    /** \returns the internal LDLT decomposition matrix
-      *
-      * TODO: document the storage layout
-      */
-    inline const MatrixType& matrixLDLT() const
-    {
-      eigen_assert(m_isInitialized && "LDLT is not initialized.");
-      return m_matrix;
-    }
+  /** \returns the internal LDLT decomposition matrix
+   *
+   * TODO: document the storage layout
+   */
+  inline const MatrixType& matrixLDLT() const {
+    eigen_assert(m_isInitialized && "LDLT is not initialized.");
+    return m_matrix;
+  }
 
-    MatrixType reconstructedMatrix() const;
+  MatrixType reconstructedMatrix() const;
 
-    /** \returns the adjoint of \c *this, that is, a const reference to the decomposition itself as the underlying matrix is self-adjoint.
-      *
-      * This method is provided for compatibility with other matrix decompositions, thus enabling generic code such as:
-      * \code x = decomposition.adjoint().solve(b) \endcode
-      */
-    const LDLT& adjoint() const { return *this; }
+  /** \returns the adjoint of \c *this, that is, a const reference to the decomposition itself as the underlying matrix
+   * is self-adjoint.
+   *
+   * This method is provided for compatibility with other matrix decompositions, thus enabling generic code such as:
+   * \code x = decomposition.adjoint().solve(b) \endcode
+   */
+  const LDLT& adjoint() const { return *this; }
 
-    EIGEN_DEVICE_FUNC inline EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_matrix.rows(); }
-    EIGEN_DEVICE_FUNC inline EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_matrix.cols(); }
+  EIGEN_DEVICE_FUNC inline EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_matrix.rows(); }
+  EIGEN_DEVICE_FUNC inline EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_matrix.cols(); }
 
-    /** \brief Reports whether previous computation was successful.
-      *
-      * \returns \c Success if computation was successful,
-      *          \c NumericalIssue if the factorization failed because of a zero pivot.
-      */
-    ComputationInfo info() const
-    {
-      eigen_assert(m_isInitialized && "LDLT is not initialized.");
-      return m_info;
-    }
+  /** \brief Reports whether previous computation was successful.
+   *
+   * \returns \c Success if computation was successful,
+   *          \c NumericalIssue if the factorization failed because of a zero pivot.
+   */
+  ComputationInfo info() const {
+    eigen_assert(m_isInitialized && "LDLT is not initialized.");
+    return m_info;
+  }
 
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    template<typename RhsType, typename DstType>
-    void _solve_impl(const RhsType &rhs, DstType &dst) const;
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  template <typename RhsType, typename DstType>
+  void _solve_impl(const RhsType& rhs, DstType& dst) const;
 
-    template<bool Conjugate, typename RhsType, typename DstType>
-    void _solve_impl_transposed(const RhsType &rhs, DstType &dst) const;
-    #endif
+  template <bool Conjugate, typename RhsType, typename DstType>
+  void _solve_impl_transposed(const RhsType& rhs, DstType& dst) const;
+#endif
 
-  protected:
+ protected:
+  EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
 
-    EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
-
-    /** \internal
-      * Used to compute and store the Cholesky decomposition A = L D L^* = U^* D U.
-      * The strict upper part is used during the decomposition, the strict lower
-      * part correspond to the coefficients of L (its diagonal is equal to 1 and
-      * is not stored), and the diagonal entries correspond to D.
-      */
-    MatrixType m_matrix;
-    RealScalar m_l1_norm;
-    TranspositionType m_transpositions;
-    TmpMatrixType m_temporary;
-    internal::SignMatrix m_sign;
-    bool m_isInitialized;
-    ComputationInfo m_info;
+  /** \internal
+   * Used to compute and store the Cholesky decomposition A = L D L^* = U^* D U.
+   * The strict upper part is used during the decomposition, the strict lower
+   * part correspond to the coefficients of L (its diagonal is equal to 1 and
+   * is not stored), and the diagonal entries correspond to D.
+   */
+  MatrixType m_matrix;
+  RealScalar m_l1_norm;
+  TranspositionType m_transpositions;
+  TmpMatrixType m_temporary;
+  internal::SignMatrix m_sign;
+  bool m_isInitialized;
+  ComputationInfo m_info;
 };
 
 namespace internal {
 
-template<int UpLo> struct ldlt_inplace;
+template <int UpLo>
+struct ldlt_inplace;
 
-template<> struct ldlt_inplace<Lower>
-{
-  template<typename MatrixType, typename TranspositionType, typename Workspace>
-  static bool unblocked(MatrixType& mat, TranspositionType& transpositions, Workspace& temp, SignMatrix& sign)
-  {
+template <>
+struct ldlt_inplace<Lower> {
+  template <typename MatrixType, typename TranspositionType, typename Workspace>
+  static bool unblocked(MatrixType& mat, TranspositionType& transpositions, Workspace& temp, SignMatrix& sign) {
     using std::abs;
     typedef typename MatrixType::Scalar Scalar;
     typedef typename MatrixType::RealScalar RealScalar;
     typedef typename TranspositionType::StorageIndex IndexType;
-    eigen_assert(mat.rows()==mat.cols());
+    eigen_assert(mat.rows() == mat.cols());
     const Index size = mat.rows();
     bool found_zero_pivot = false;
     bool ret = true;
 
-    if (size <= 1)
-    {
+    if (size <= 1) {
       transpositions.setIdentity();
-      if(size==0) sign = ZeroSign;
-      else if (numext::real(mat.coeff(0,0)) > static_cast<RealScalar>(0) ) sign = PositiveSemiDef;
-      else if (numext::real(mat.coeff(0,0)) < static_cast<RealScalar>(0)) sign = NegativeSemiDef;
-      else sign = ZeroSign;
+      if (size == 0)
+        sign = ZeroSign;
+      else if (numext::real(mat.coeff(0, 0)) > static_cast<RealScalar>(0))
+        sign = PositiveSemiDef;
+      else if (numext::real(mat.coeff(0, 0)) < static_cast<RealScalar>(0))
+        sign = NegativeSemiDef;
+      else
+        sign = ZeroSign;
       return true;
     }
 
-    for (Index k = 0; k < size; ++k)
-    {
+    for (Index k = 0; k < size; ++k) {
       // Find largest diagonal element
       Index index_of_biggest_in_corner;
-      mat.diagonal().tail(size-k).cwiseAbs().maxCoeff(&index_of_biggest_in_corner);
+      mat.diagonal().tail(size - k).cwiseAbs().maxCoeff(&index_of_biggest_in_corner);
       index_of_biggest_in_corner += k;
 
       transpositions.coeffRef(k) = IndexType(index_of_biggest_in_corner);
-      if(k != index_of_biggest_in_corner)
-      {
+      if (k != index_of_biggest_in_corner) {
         // apply the transposition while taking care to consider only
         // the lower triangular part
-        Index s = size-index_of_biggest_in_corner-1; // trailing size after the biggest element
+        Index s = size - index_of_biggest_in_corner - 1;  // trailing size after the biggest element
         mat.row(k).head(k).swap(mat.row(index_of_biggest_in_corner).head(k));
         mat.col(k).tail(s).swap(mat.col(index_of_biggest_in_corner).tail(s));
-        std::swap(mat.coeffRef(k,k),mat.coeffRef(index_of_biggest_in_corner,index_of_biggest_in_corner));
-        for(Index i=k+1;i<index_of_biggest_in_corner;++i)
-        {
-          Scalar tmp = mat.coeffRef(i,k);
-          mat.coeffRef(i,k) = numext::conj(mat.coeffRef(index_of_biggest_in_corner,i));
-          mat.coeffRef(index_of_biggest_in_corner,i) = numext::conj(tmp);
+        std::swap(mat.coeffRef(k, k), mat.coeffRef(index_of_biggest_in_corner, index_of_biggest_in_corner));
+        for (Index i = k + 1; i < index_of_biggest_in_corner; ++i) {
+          Scalar tmp = mat.coeffRef(i, k);
+          mat.coeffRef(i, k) = numext::conj(mat.coeffRef(index_of_biggest_in_corner, i));
+          mat.coeffRef(index_of_biggest_in_corner, i) = numext::conj(tmp);
         }
-        if(NumTraits<Scalar>::IsComplex)
-          mat.coeffRef(index_of_biggest_in_corner,k) = numext::conj(mat.coeff(index_of_biggest_in_corner,k));
+        if (NumTraits<Scalar>::IsComplex)
+          mat.coeffRef(index_of_biggest_in_corner, k) = numext::conj(mat.coeff(index_of_biggest_in_corner, k));
       }
 
       // partition the matrix:
@@ -349,53 +328,53 @@
       // lu  = A10 | A11 |  -
       //       A20 | A21 | A22
       Index rs = size - k - 1;
-      Block<MatrixType,Dynamic,1> A21(mat,k+1,k,rs,1);
-      Block<MatrixType,1,Dynamic> A10(mat,k,0,1,k);
-      Block<MatrixType,Dynamic,Dynamic> A20(mat,k+1,0,rs,k);
+      Block<MatrixType, Dynamic, 1> A21(mat, k + 1, k, rs, 1);
+      Block<MatrixType, 1, Dynamic> A10(mat, k, 0, 1, k);
+      Block<MatrixType, Dynamic, Dynamic> A20(mat, k + 1, 0, rs, k);
 
-      if(k>0)
-      {
+      if (k > 0) {
         temp.head(k) = mat.diagonal().real().head(k).asDiagonal() * A10.adjoint();
-        mat.coeffRef(k,k) -= (A10 * temp.head(k)).value();
-        if(rs>0)
-          A21.noalias() -= A20 * temp.head(k);
+        mat.coeffRef(k, k) -= (A10 * temp.head(k)).value();
+        if (rs > 0) A21.noalias() -= A20 * temp.head(k);
       }
 
       // In some previous versions of Eigen (e.g., 3.2.1), the scaling was omitted if the pivot
       // was smaller than the cutoff value. However, since LDLT is not rank-revealing
       // we should only make sure that we do not introduce INF or NaN values.
       // Remark that LAPACK also uses 0 as the cutoff value.
-      RealScalar realAkk = numext::real(mat.coeffRef(k,k));
+      RealScalar realAkk = numext::real(mat.coeffRef(k, k));
       bool pivot_is_valid = (abs(realAkk) > RealScalar(0));
 
-      if(k==0 && !pivot_is_valid)
-      {
+      if (k == 0 && !pivot_is_valid) {
         // The entire diagonal is zero, there is nothing more to do
         // except filling the transpositions, and checking whether the matrix is zero.
         sign = ZeroSign;
-        for(Index j = 0; j<size; ++j)
-        {
+        for (Index j = 0; j < size; ++j) {
           transpositions.coeffRef(j) = IndexType(j);
-          ret = ret && (mat.col(j).tail(size-j-1).array()==Scalar(0)).all();
+          ret = ret && (mat.col(j).tail(size - j - 1).array() == Scalar(0)).all();
         }
         return ret;
       }
 
-      if((rs>0) && pivot_is_valid)
+      if ((rs > 0) && pivot_is_valid)
         A21 /= realAkk;
-      else if(rs>0)
-        ret = ret && (A21.array()==Scalar(0)).all();
+      else if (rs > 0)
+        ret = ret && (A21.array() == Scalar(0)).all();
 
-      if(found_zero_pivot && pivot_is_valid) ret = false; // factorization failed
-      else if(!pivot_is_valid) found_zero_pivot = true;
+      if (found_zero_pivot && pivot_is_valid)
+        ret = false;  // factorization failed
+      else if (!pivot_is_valid)
+        found_zero_pivot = true;
 
       if (sign == PositiveSemiDef) {
         if (realAkk < static_cast<RealScalar>(0)) sign = Indefinite;
       } else if (sign == NegativeSemiDef) {
         if (realAkk > static_cast<RealScalar>(0)) sign = Indefinite;
       } else if (sign == ZeroSign) {
-        if (realAkk > static_cast<RealScalar>(0)) sign = PositiveSemiDef;
-        else if (realAkk < static_cast<RealScalar>(0)) sign = NegativeSemiDef;
+        if (realAkk > static_cast<RealScalar>(0))
+          sign = PositiveSemiDef;
+        else if (realAkk < static_cast<RealScalar>(0))
+          sign = NegativeSemiDef;
       }
     }
 
@@ -409,96 +388,91 @@
   // original matrix is not of full rank.
   // Here only rank-1 updates are implemented, to reduce the
   // requirement for intermediate storage and improve accuracy
-  template<typename MatrixType, typename WDerived>
-  static bool updateInPlace(MatrixType& mat, MatrixBase<WDerived>& w, const typename MatrixType::RealScalar& sigma=1)
-  {
+  template <typename MatrixType, typename WDerived>
+  static bool updateInPlace(MatrixType& mat, MatrixBase<WDerived>& w,
+                            const typename MatrixType::RealScalar& sigma = 1) {
     using numext::isfinite;
     typedef typename MatrixType::Scalar Scalar;
     typedef typename MatrixType::RealScalar RealScalar;
 
     const Index size = mat.rows();
-    eigen_assert(mat.cols() == size && w.size()==size);
+    eigen_assert(mat.cols() == size && w.size() == size);
 
     RealScalar alpha = 1;
 
     // Apply the update
-    for (Index j = 0; j < size; j++)
-    {
+    for (Index j = 0; j < size; j++) {
       // Check for termination due to an original decomposition of low-rank
-      if (!(isfinite)(alpha))
-        break;
+      if (!(isfinite)(alpha)) break;
 
       // Update the diagonal terms
-      RealScalar dj = numext::real(mat.coeff(j,j));
+      RealScalar dj = numext::real(mat.coeff(j, j));
       Scalar wj = w.coeff(j);
-      RealScalar swj2 = sigma*numext::abs2(wj);
-      RealScalar gamma = dj*alpha + swj2;
+      RealScalar swj2 = sigma * numext::abs2(wj);
+      RealScalar gamma = dj * alpha + swj2;
 
-      mat.coeffRef(j,j) += swj2/alpha;
-      alpha += swj2/dj;
-
+      mat.coeffRef(j, j) += swj2 / alpha;
+      alpha += swj2 / dj;
 
       // Update the terms of L
-      Index rs = size-j-1;
+      Index rs = size - j - 1;
       w.tail(rs) -= wj * mat.col(j).tail(rs);
-      if(!numext::is_exactly_zero(gamma))
-        mat.col(j).tail(rs) += (sigma*numext::conj(wj)/gamma)*w.tail(rs);
+      if (!numext::is_exactly_zero(gamma)) mat.col(j).tail(rs) += (sigma * numext::conj(wj) / gamma) * w.tail(rs);
     }
     return true;
   }
 
-  template<typename MatrixType, typename TranspositionType, typename Workspace, typename WType>
-  static bool update(MatrixType& mat, const TranspositionType& transpositions, Workspace& tmp, const WType& w, const typename MatrixType::RealScalar& sigma=1)
-  {
+  template <typename MatrixType, typename TranspositionType, typename Workspace, typename WType>
+  static bool update(MatrixType& mat, const TranspositionType& transpositions, Workspace& tmp, const WType& w,
+                     const typename MatrixType::RealScalar& sigma = 1) {
     // Apply the permutation to the input w
     tmp = transpositions * w;
 
-    return ldlt_inplace<Lower>::updateInPlace(mat,tmp,sigma);
+    return ldlt_inplace<Lower>::updateInPlace(mat, tmp, sigma);
   }
 };
 
-template<> struct ldlt_inplace<Upper>
-{
-  template<typename MatrixType, typename TranspositionType, typename Workspace>
-  static EIGEN_STRONG_INLINE bool unblocked(MatrixType& mat, TranspositionType& transpositions, Workspace& temp, SignMatrix& sign)
-  {
+template <>
+struct ldlt_inplace<Upper> {
+  template <typename MatrixType, typename TranspositionType, typename Workspace>
+  static EIGEN_STRONG_INLINE bool unblocked(MatrixType& mat, TranspositionType& transpositions, Workspace& temp,
+                                            SignMatrix& sign) {
     Transpose<MatrixType> matt(mat);
     return ldlt_inplace<Lower>::unblocked(matt, transpositions, temp, sign);
   }
 
-  template<typename MatrixType, typename TranspositionType, typename Workspace, typename WType>
-  static EIGEN_STRONG_INLINE bool update(MatrixType& mat, TranspositionType& transpositions, Workspace& tmp, WType& w, const typename MatrixType::RealScalar& sigma=1)
-  {
+  template <typename MatrixType, typename TranspositionType, typename Workspace, typename WType>
+  static EIGEN_STRONG_INLINE bool update(MatrixType& mat, TranspositionType& transpositions, Workspace& tmp, WType& w,
+                                         const typename MatrixType::RealScalar& sigma = 1) {
     Transpose<MatrixType> matt(mat);
     return ldlt_inplace<Lower>::update(matt, transpositions, tmp, w.conjugate(), sigma);
   }
 };
 
-template<typename MatrixType> struct LDLT_Traits<MatrixType,Lower>
-{
+template <typename MatrixType>
+struct LDLT_Traits<MatrixType, Lower> {
   typedef const TriangularView<const MatrixType, UnitLower> MatrixL;
   typedef const TriangularView<const typename MatrixType::AdjointReturnType, UnitUpper> MatrixU;
   static inline MatrixL getL(const MatrixType& m) { return MatrixL(m); }
   static inline MatrixU getU(const MatrixType& m) { return MatrixU(m.adjoint()); }
 };
 
-template<typename MatrixType> struct LDLT_Traits<MatrixType,Upper>
-{
+template <typename MatrixType>
+struct LDLT_Traits<MatrixType, Upper> {
   typedef const TriangularView<const typename MatrixType::AdjointReturnType, UnitLower> MatrixL;
   typedef const TriangularView<const MatrixType, UnitUpper> MatrixU;
   static inline MatrixL getL(const MatrixType& m) { return MatrixL(m.adjoint()); }
   static inline MatrixU getU(const MatrixType& m) { return MatrixU(m); }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** Compute / recompute the LDLT decomposition A = L D L^* = U^* D U of \a matrix
-  */
-template<typename MatrixType, int UpLo_>
-template<typename InputType>
-LDLT<MatrixType,UpLo_>& LDLT<MatrixType,UpLo_>::compute(const EigenBase<InputType>& a)
-{
-  eigen_assert(a.rows()==a.cols());
+ */
+template <typename MatrixType, int UpLo_>
+template <typename InputType>
+LDLT<MatrixType, UpLo_>& LDLT<MatrixType, UpLo_>::compute(const EigenBase<InputType>& a) {
+  eigen_assert(a.rows() == a.cols());
   const Index size = a.rows();
 
   m_matrix = a.derived();
@@ -509,11 +483,12 @@
   for (Index col = 0; col < size; ++col) {
     RealScalar abs_col_sum;
     if (UpLo_ == Lower)
-      abs_col_sum = m_matrix.col(col).tail(size - col).template lpNorm<1>() + m_matrix.row(col).head(col).template lpNorm<1>();
+      abs_col_sum =
+          m_matrix.col(col).tail(size - col).template lpNorm<1>() + m_matrix.row(col).head(col).template lpNorm<1>();
     else
-      abs_col_sum = m_matrix.col(col).head(col).template lpNorm<1>() + m_matrix.row(col).tail(size - col).template lpNorm<1>();
-    if (abs_col_sum > m_l1_norm)
-      m_l1_norm = abs_col_sum;
+      abs_col_sum =
+          m_matrix.col(col).head(col).template lpNorm<1>() + m_matrix.row(col).tail(size - col).template lpNorm<1>();
+    if (abs_col_sum > m_l1_norm) m_l1_norm = abs_col_sum;
   }
 
   m_transpositions.resize(size);
@@ -521,7 +496,8 @@
   m_temporary.resize(size);
   m_sign = internal::ZeroSign;
 
-  m_info = internal::ldlt_inplace<UpLo>::unblocked(m_matrix, m_transpositions, m_temporary, m_sign) ? Success : NumericalIssue;
+  m_info = internal::ldlt_inplace<UpLo>::unblocked(m_matrix, m_transpositions, m_temporary, m_sign) ? Success
+                                                                                                    : NumericalIssue;
 
   m_isInitialized = true;
   return *this;
@@ -529,28 +505,24 @@
 
 /** Update the LDLT decomposition:  given A = L D L^T, efficiently compute the decomposition of A + sigma w w^T.
  * \param w a vector to be incorporated into the decomposition.
- * \param sigma a scalar, +1 for updates and -1 for "downdates," which correspond to removing previously-added column vectors. Optional; default value is +1.
- * \sa setZero()
-  */
-template<typename MatrixType, int UpLo_>
-template<typename Derived>
-LDLT<MatrixType,UpLo_>& LDLT<MatrixType,UpLo_>::rankUpdate(const MatrixBase<Derived>& w, const typename LDLT<MatrixType,UpLo_>::RealScalar& sigma)
-{
+ * \param sigma a scalar, +1 for updates and -1 for "downdates," which correspond to removing previously-added column
+ * vectors. Optional; default value is +1. \sa setZero()
+ */
+template <typename MatrixType, int UpLo_>
+template <typename Derived>
+LDLT<MatrixType, UpLo_>& LDLT<MatrixType, UpLo_>::rankUpdate(
+    const MatrixBase<Derived>& w, const typename LDLT<MatrixType, UpLo_>::RealScalar& sigma) {
   typedef typename TranspositionType::StorageIndex IndexType;
   const Index size = w.rows();
-  if (m_isInitialized)
-  {
-    eigen_assert(m_matrix.rows()==size);
-  }
-  else
-  {
-    m_matrix.resize(size,size);
+  if (m_isInitialized) {
+    eigen_assert(m_matrix.rows() == size);
+  } else {
+    m_matrix.resize(size, size);
     m_matrix.setZero();
     m_transpositions.resize(size);
-    for (Index i = 0; i < size; i++)
-      m_transpositions.coeffRef(i) = IndexType(i);
+    for (Index i = 0; i < size; i++) m_transpositions.coeffRef(i) = IndexType(i);
     m_temporary.resize(size);
-    m_sign = sigma>=0 ? internal::PositiveSemiDef : internal::NegativeSemiDef;
+    m_sign = sigma >= 0 ? internal::PositiveSemiDef : internal::NegativeSemiDef;
     m_isInitialized = true;
   }
 
@@ -560,17 +532,15 @@
 }
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-template<typename MatrixType_, int UpLo_>
-template<typename RhsType, typename DstType>
-void LDLT<MatrixType_,UpLo_>::_solve_impl(const RhsType &rhs, DstType &dst) const
-{
+template <typename MatrixType_, int UpLo_>
+template <typename RhsType, typename DstType>
+void LDLT<MatrixType_, UpLo_>::_solve_impl(const RhsType& rhs, DstType& dst) const {
   _solve_impl_transposed<true>(rhs, dst);
 }
 
-template<typename MatrixType_,int UpLo_>
-template<bool Conjugate, typename RhsType, typename DstType>
-void LDLT<MatrixType_,UpLo_>::_solve_impl_transposed(const RhsType &rhs, DstType &dst) const
-{
+template <typename MatrixType_, int UpLo_>
+template <bool Conjugate, typename RhsType, typename DstType>
+void LDLT<MatrixType_, UpLo_>::_solve_impl_transposed(const RhsType& rhs, DstType& dst) const {
   // dst = P b
   dst = m_transpositions * rhs;
 
@@ -585,15 +555,13 @@
   const typename Diagonal<const MatrixType>::RealReturnType vecD(vectorD());
   // In some previous versions, tolerance was set to the max of 1/highest (or rather numeric_limits::min())
   // and the maximal diagonal entry * epsilon as motivated by LAPACK's xGELSS:
-  // RealScalar tolerance = numext::maxi(vecD.array().abs().maxCoeff() * NumTraits<RealScalar>::epsilon(),RealScalar(1) / NumTraits<RealScalar>::highest());
-  // However, LDLT is not rank revealing, and so adjusting the tolerance wrt to the highest
-  // diagonal element is not well justified and leads to numerical issues in some cases.
-  // Moreover, Lapack's xSYTRS routines use 0 for the tolerance.
-  // Using numeric_limits::min() gives us more robustness to denormals.
+  // RealScalar tolerance = numext::maxi(vecD.array().abs().maxCoeff() * NumTraits<RealScalar>::epsilon(),RealScalar(1)
+  // / NumTraits<RealScalar>::highest()); However, LDLT is not rank revealing, and so adjusting the tolerance wrt to the
+  // highest diagonal element is not well justified and leads to numerical issues in some cases. Moreover, Lapack's
+  // xSYTRS routines use 0 for the tolerance. Using numeric_limits::min() gives us more robustness to denormals.
   RealScalar tolerance = (std::numeric_limits<RealScalar>::min)();
-  for (Index i = 0; i < vecD.size(); ++i)
-  {
-    if(abs(vecD(i)) > tolerance)
+  for (Index i = 0; i < vecD.size(); ++i) {
+    if (abs(vecD(i)) > tolerance)
       dst.row(i) /= vecD(i);
     else
       dst.row(i).setZero();
@@ -610,22 +578,21 @@
 #endif
 
 /** \internal use x = ldlt_object.solve(x);
-  *
-  * This is the \em in-place version of solve().
-  *
-  * \param bAndX represents both the right-hand side matrix b and result x.
-  *
-  * \returns true always! If you need to check for existence of solutions, use another decomposition like LU, QR, or SVD.
-  *
-  * This version avoids a copy when the right hand side matrix b is not
-  * needed anymore.
-  *
-  * \sa LDLT::solve(), MatrixBase::ldlt()
-  */
-template<typename MatrixType,int UpLo_>
-template<typename Derived>
-bool LDLT<MatrixType,UpLo_>::solveInPlace(MatrixBase<Derived> &bAndX) const
-{
+ *
+ * This is the \em in-place version of solve().
+ *
+ * \param bAndX represents both the right-hand side matrix b and result x.
+ *
+ * \returns true always! If you need to check for existence of solutions, use another decomposition like LU, QR, or SVD.
+ *
+ * This version avoids a copy when the right hand side matrix b is not
+ * needed anymore.
+ *
+ * \sa LDLT::solve(), MatrixBase::ldlt()
+ */
+template <typename MatrixType, int UpLo_>
+template <typename Derived>
+bool LDLT<MatrixType, UpLo_>::solveInPlace(MatrixBase<Derived>& bAndX) const {
   eigen_assert(m_isInitialized && "LDLT is not initialized.");
   eigen_assert(m_matrix.rows() == bAndX.rows());
 
@@ -637,12 +604,11 @@
 /** \returns the matrix represented by the decomposition,
  * i.e., it returns the product: P^T L D L^* P.
  * This function is provided for debug purpose. */
-template<typename MatrixType, int UpLo_>
-MatrixType LDLT<MatrixType,UpLo_>::reconstructedMatrix() const
-{
+template <typename MatrixType, int UpLo_>
+MatrixType LDLT<MatrixType, UpLo_>::reconstructedMatrix() const {
   eigen_assert(m_isInitialized && "LDLT is not initialized.");
   const Index size = m_matrix.rows();
-  MatrixType res(size,size);
+  MatrixType res(size, size);
 
   // P
   res.setIdentity();
@@ -660,27 +626,24 @@
 }
 
 /** \cholesky_module
-  * \returns the Cholesky decomposition with full pivoting without square root of \c *this
-  * \sa MatrixBase::ldlt()
-  */
-template<typename MatrixType, unsigned int UpLo>
+ * \returns the Cholesky decomposition with full pivoting without square root of \c *this
+ * \sa MatrixBase::ldlt()
+ */
+template <typename MatrixType, unsigned int UpLo>
 inline const LDLT<typename SelfAdjointView<MatrixType, UpLo>::PlainObject, UpLo>
-SelfAdjointView<MatrixType, UpLo>::ldlt() const
-{
-  return LDLT<PlainObject,UpLo>(m_matrix);
+SelfAdjointView<MatrixType, UpLo>::ldlt() const {
+  return LDLT<PlainObject, UpLo>(m_matrix);
 }
 
 /** \cholesky_module
-  * \returns the Cholesky decomposition with full pivoting without square root of \c *this
-  * \sa SelfAdjointView::ldlt()
-  */
-template<typename Derived>
-inline const LDLT<typename MatrixBase<Derived>::PlainObject>
-MatrixBase<Derived>::ldlt() const
-{
+ * \returns the Cholesky decomposition with full pivoting without square root of \c *this
+ * \sa SelfAdjointView::ldlt()
+ */
+template <typename Derived>
+inline const LDLT<typename MatrixBase<Derived>::PlainObject> MatrixBase<Derived>::ldlt() const {
   return LDLT<PlainObject>(derived());
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_LDLT_H
+#endif  // EIGEN_LDLT_H
diff --git a/Eigen/src/Cholesky/LLT.h b/Eigen/src/Cholesky/LLT.h
index 55b39f6..01b4476 100644
--- a/Eigen/src/Cholesky/LLT.h
+++ b/Eigen/src/Cholesky/LLT.h
@@ -15,427 +15,392 @@
 
 namespace Eigen {
 
-namespace internal{
+namespace internal {
 
-template<typename MatrixType_, int UpLo_> struct traits<LLT<MatrixType_, UpLo_> >
- : traits<MatrixType_>
-{
+template <typename MatrixType_, int UpLo_>
+struct traits<LLT<MatrixType_, UpLo_> > : traits<MatrixType_> {
   typedef MatrixXpr XprKind;
   typedef SolverStorage StorageKind;
   typedef int StorageIndex;
   enum { Flags = 0 };
 };
 
-template<typename MatrixType, int UpLo> struct LLT_Traits;
-}
+template <typename MatrixType, int UpLo>
+struct LLT_Traits;
+}  // namespace internal
 
 /** \ingroup Cholesky_Module
-  *
-  * \class LLT
-  *
-  * \brief Standard Cholesky decomposition (LL^T) of a matrix and associated features
-  *
-  * \tparam MatrixType_ the type of the matrix of which we are computing the LL^T Cholesky decomposition
-  * \tparam UpLo_ the triangular part that will be used for the decomposition: Lower (default) or Upper.
-  *               The other triangular part won't be read.
-  *
-  * This class performs a LL^T Cholesky decomposition of a symmetric, positive definite
-  * matrix A such that A = LL^* = U^*U, where L is lower triangular.
-  *
-  * While the Cholesky decomposition is particularly useful to solve selfadjoint problems like  D^*D x = b,
-  * for that purpose, we recommend the Cholesky decomposition without square root which is more stable
-  * and even faster. Nevertheless, this standard Cholesky decomposition remains useful in many other
-  * situations like generalised eigen problems with hermitian matrices.
-  *
-  * Remember that Cholesky decompositions are not rank-revealing. This LLT decomposition is only stable on positive definite matrices,
-  * use LDLT instead for the semidefinite case. Also, do not use a Cholesky decomposition to determine whether a system of equations
-  * has a solution.
-  *
-  * Example: \include LLT_example.cpp
-  * Output: \verbinclude LLT_example.out
-  *
-  * \b Performance: for best performance, it is recommended to use a column-major storage format
-  * with the Lower triangular part (the default), or, equivalently, a row-major storage format
-  * with the Upper triangular part. Otherwise, you might get a 20% slowdown for the full factorization
-  * step, and rank-updates can be up to 3 times slower.
-  *
-  * This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism.
-  *
-  * Note that during the decomposition, only the lower (or upper, as defined by UpLo_) triangular part of A is considered.
-  * Therefore, the strict lower part does not have to store correct values.
-  *
-  * \sa MatrixBase::llt(), SelfAdjointView::llt(), class LDLT
-  */
-template<typename MatrixType_, int UpLo_> class LLT
-        : public SolverBase<LLT<MatrixType_, UpLo_> >
-{
-  public:
-    typedef MatrixType_ MatrixType;
-    typedef SolverBase<LLT> Base;
-    friend class SolverBase<LLT>;
+ *
+ * \class LLT
+ *
+ * \brief Standard Cholesky decomposition (LL^T) of a matrix and associated features
+ *
+ * \tparam MatrixType_ the type of the matrix of which we are computing the LL^T Cholesky decomposition
+ * \tparam UpLo_ the triangular part that will be used for the decomposition: Lower (default) or Upper.
+ *               The other triangular part won't be read.
+ *
+ * This class performs a LL^T Cholesky decomposition of a symmetric, positive definite
+ * matrix A such that A = LL^* = U^*U, where L is lower triangular.
+ *
+ * While the Cholesky decomposition is particularly useful to solve selfadjoint problems like  D^*D x = b,
+ * for that purpose, we recommend the Cholesky decomposition without square root which is more stable
+ * and even faster. Nevertheless, this standard Cholesky decomposition remains useful in many other
+ * situations like generalised eigen problems with hermitian matrices.
+ *
+ * Remember that Cholesky decompositions are not rank-revealing. This LLT decomposition is only stable on positive
+ * definite matrices, use LDLT instead for the semidefinite case. Also, do not use a Cholesky decomposition to determine
+ * whether a system of equations has a solution.
+ *
+ * Example: \include LLT_example.cpp
+ * Output: \verbinclude LLT_example.out
+ *
+ * \b Performance: for best performance, it is recommended to use a column-major storage format
+ * with the Lower triangular part (the default), or, equivalently, a row-major storage format
+ * with the Upper triangular part. Otherwise, you might get a 20% slowdown for the full factorization
+ * step, and rank-updates can be up to 3 times slower.
+ *
+ * This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism.
+ *
+ * Note that during the decomposition, only the lower (or upper, as defined by UpLo_) triangular part of A is
+ * considered. Therefore, the strict lower part does not have to store correct values.
+ *
+ * \sa MatrixBase::llt(), SelfAdjointView::llt(), class LDLT
+ */
+template <typename MatrixType_, int UpLo_>
+class LLT : public SolverBase<LLT<MatrixType_, UpLo_> > {
+ public:
+  typedef MatrixType_ MatrixType;
+  typedef SolverBase<LLT> Base;
+  friend class SolverBase<LLT>;
 
-    EIGEN_GENERIC_PUBLIC_INTERFACE(LLT)
-    enum {
-      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
-    };
+  EIGEN_GENERIC_PUBLIC_INTERFACE(LLT)
+  enum { MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime };
 
-    enum {
-      PacketSize = internal::packet_traits<Scalar>::size,
-      AlignmentMask = int(PacketSize)-1,
-      UpLo = UpLo_
-    };
+  enum { PacketSize = internal::packet_traits<Scalar>::size, AlignmentMask = int(PacketSize) - 1, UpLo = UpLo_ };
 
-    typedef internal::LLT_Traits<MatrixType,UpLo> Traits;
+  typedef internal::LLT_Traits<MatrixType, UpLo> Traits;
 
-    /**
-      * \brief Default Constructor.
-      *
-      * The default constructor is useful in cases in which the user intends to
-      * perform decompositions via LLT::compute(const MatrixType&).
-      */
-    LLT() : m_matrix(), m_isInitialized(false) {}
+  /**
+   * \brief Default Constructor.
+   *
+   * The default constructor is useful in cases in which the user intends to
+   * perform decompositions via LLT::compute(const MatrixType&).
+   */
+  LLT() : m_matrix(), m_isInitialized(false) {}
 
-    /** \brief Default Constructor with memory preallocation
-      *
-      * Like the default constructor but with preallocation of the internal data
-      * according to the specified problem \a size.
-      * \sa LLT()
-      */
-    explicit LLT(Index size) : m_matrix(size, size),
-                    m_isInitialized(false) {}
+  /** \brief Default Constructor with memory preallocation
+   *
+   * Like the default constructor but with preallocation of the internal data
+   * according to the specified problem \a size.
+   * \sa LLT()
+   */
+  explicit LLT(Index size) : m_matrix(size, size), m_isInitialized(false) {}
 
-    template<typename InputType>
-    explicit LLT(const EigenBase<InputType>& matrix)
-      : m_matrix(matrix.rows(), matrix.cols()),
-        m_isInitialized(false)
-    {
-      compute(matrix.derived());
-    }
+  template <typename InputType>
+  explicit LLT(const EigenBase<InputType>& matrix) : m_matrix(matrix.rows(), matrix.cols()), m_isInitialized(false) {
+    compute(matrix.derived());
+  }
 
-    /** \brief Constructs a LLT factorization from a given matrix
-      *
-      * This overloaded constructor is provided for \link InplaceDecomposition inplace decomposition \endlink when
-      * \c MatrixType is a Eigen::Ref.
-      *
-      * \sa LLT(const EigenBase&)
-      */
-    template<typename InputType>
-    explicit LLT(EigenBase<InputType>& matrix)
-      : m_matrix(matrix.derived()),
-        m_isInitialized(false)
-    {
-      compute(matrix.derived());
-    }
+  /** \brief Constructs a LLT factorization from a given matrix
+   *
+   * This overloaded constructor is provided for \link InplaceDecomposition inplace decomposition \endlink when
+   * \c MatrixType is a Eigen::Ref.
+   *
+   * \sa LLT(const EigenBase&)
+   */
+  template <typename InputType>
+  explicit LLT(EigenBase<InputType>& matrix) : m_matrix(matrix.derived()), m_isInitialized(false) {
+    compute(matrix.derived());
+  }
 
-    /** \returns a view of the upper triangular matrix U */
-    inline typename Traits::MatrixU matrixU() const
-    {
-      eigen_assert(m_isInitialized && "LLT is not initialized.");
-      return Traits::getU(m_matrix);
-    }
+  /** \returns a view of the upper triangular matrix U */
+  inline typename Traits::MatrixU matrixU() const {
+    eigen_assert(m_isInitialized && "LLT is not initialized.");
+    return Traits::getU(m_matrix);
+  }
 
-    /** \returns a view of the lower triangular matrix L */
-    inline typename Traits::MatrixL matrixL() const
-    {
-      eigen_assert(m_isInitialized && "LLT is not initialized.");
-      return Traits::getL(m_matrix);
-    }
+  /** \returns a view of the lower triangular matrix L */
+  inline typename Traits::MatrixL matrixL() const {
+    eigen_assert(m_isInitialized && "LLT is not initialized.");
+    return Traits::getL(m_matrix);
+  }
 
-    #ifdef EIGEN_PARSED_BY_DOXYGEN
-    /** \returns the solution x of \f$ A x = b \f$ using the current decomposition of A.
-      *
-      * Since this LLT class assumes anyway that the matrix A is invertible, the solution
-      * theoretically exists and is unique regardless of b.
-      *
-      * Example: \include LLT_solve.cpp
-      * Output: \verbinclude LLT_solve.out
-      *
-      * \sa solveInPlace(), MatrixBase::llt(), SelfAdjointView::llt()
-      */
-    template<typename Rhs>
-    inline const Solve<LLT, Rhs>
-    solve(const MatrixBase<Rhs>& b) const;
-    #endif
+#ifdef EIGEN_PARSED_BY_DOXYGEN
+  /** \returns the solution x of \f$ A x = b \f$ using the current decomposition of A.
+   *
+   * Since this LLT class assumes anyway that the matrix A is invertible, the solution
+   * theoretically exists and is unique regardless of b.
+   *
+   * Example: \include LLT_solve.cpp
+   * Output: \verbinclude LLT_solve.out
+   *
+   * \sa solveInPlace(), MatrixBase::llt(), SelfAdjointView::llt()
+   */
+  template <typename Rhs>
+  inline const Solve<LLT, Rhs> solve(const MatrixBase<Rhs>& b) const;
+#endif
 
-    template<typename Derived>
-    void solveInPlace(const MatrixBase<Derived> &bAndX) const;
+  template <typename Derived>
+  void solveInPlace(const MatrixBase<Derived>& bAndX) const;
 
-    template<typename InputType>
-    LLT& compute(const EigenBase<InputType>& matrix);
+  template <typename InputType>
+  LLT& compute(const EigenBase<InputType>& matrix);
 
-    /** \returns an estimate of the reciprocal condition number of the matrix of
-      *  which \c *this is the Cholesky decomposition.
-      */
-    RealScalar rcond() const
-    {
-      eigen_assert(m_isInitialized && "LLT is not initialized.");
-      eigen_assert(m_info == Success && "LLT failed because matrix appears to be negative");
-      return internal::rcond_estimate_helper(m_l1_norm, *this);
-    }
+  /** \returns an estimate of the reciprocal condition number of the matrix of
+   *  which \c *this is the Cholesky decomposition.
+   */
+  RealScalar rcond() const {
+    eigen_assert(m_isInitialized && "LLT is not initialized.");
+    eigen_assert(m_info == Success && "LLT failed because matrix appears to be negative");
+    return internal::rcond_estimate_helper(m_l1_norm, *this);
+  }
 
-    /** \returns the LLT decomposition matrix
-      *
-      * TODO: document the storage layout
-      */
-    inline const MatrixType& matrixLLT() const
-    {
-      eigen_assert(m_isInitialized && "LLT is not initialized.");
-      return m_matrix;
-    }
+  /** \returns the LLT decomposition matrix
+   *
+   * TODO: document the storage layout
+   */
+  inline const MatrixType& matrixLLT() const {
+    eigen_assert(m_isInitialized && "LLT is not initialized.");
+    return m_matrix;
+  }
 
-    MatrixType reconstructedMatrix() const;
+  MatrixType reconstructedMatrix() const;
 
+  /** \brief Reports whether previous computation was successful.
+   *
+   * \returns \c Success if computation was successful,
+   *          \c NumericalIssue if the matrix.appears not to be positive definite.
+   */
+  ComputationInfo info() const {
+    eigen_assert(m_isInitialized && "LLT is not initialized.");
+    return m_info;
+  }
 
-    /** \brief Reports whether previous computation was successful.
-      *
-      * \returns \c Success if computation was successful,
-      *          \c NumericalIssue if the matrix.appears not to be positive definite.
-      */
-    ComputationInfo info() const
-    {
-      eigen_assert(m_isInitialized && "LLT is not initialized.");
-      return m_info;
-    }
+  /** \returns the adjoint of \c *this, that is, a const reference to the decomposition itself as the underlying matrix
+   * is self-adjoint.
+   *
+   * This method is provided for compatibility with other matrix decompositions, thus enabling generic code such as:
+   * \code x = decomposition.adjoint().solve(b) \endcode
+   */
+  const LLT& adjoint() const EIGEN_NOEXCEPT { return *this; }
 
-    /** \returns the adjoint of \c *this, that is, a const reference to the decomposition itself as the underlying matrix is self-adjoint.
-      *
-      * This method is provided for compatibility with other matrix decompositions, thus enabling generic code such as:
-      * \code x = decomposition.adjoint().solve(b) \endcode
-      */
-    const LLT& adjoint() const EIGEN_NOEXCEPT { return *this; }
+  inline EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_matrix.rows(); }
+  inline EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_matrix.cols(); }
 
-    inline EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_matrix.rows(); }
-    inline EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_matrix.cols(); }
+  template <typename VectorType>
+  LLT& rankUpdate(const VectorType& vec, const RealScalar& sigma = 1);
 
-    template<typename VectorType>
-    LLT & rankUpdate(const VectorType& vec, const RealScalar& sigma = 1);
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  template <typename RhsType, typename DstType>
+  void _solve_impl(const RhsType& rhs, DstType& dst) const;
 
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    template<typename RhsType, typename DstType>
-    void _solve_impl(const RhsType &rhs, DstType &dst) const;
+  template <bool Conjugate, typename RhsType, typename DstType>
+  void _solve_impl_transposed(const RhsType& rhs, DstType& dst) const;
+#endif
 
-    template<bool Conjugate, typename RhsType, typename DstType>
-    void _solve_impl_transposed(const RhsType &rhs, DstType &dst) const;
-    #endif
+ protected:
+  EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
 
-  protected:
-
-    EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
-
-    /** \internal
-      * Used to compute and store L
-      * The strict upper part is not used and even not initialized.
-      */
-    MatrixType m_matrix;
-    RealScalar m_l1_norm;
-    bool m_isInitialized;
-    ComputationInfo m_info;
+  /** \internal
+   * Used to compute and store L
+   * The strict upper part is not used and even not initialized.
+   */
+  MatrixType m_matrix;
+  RealScalar m_l1_norm;
+  bool m_isInitialized;
+  ComputationInfo m_info;
 };
 
 namespace internal {
 
-template<typename Scalar, int UpLo> struct llt_inplace;
+template <typename Scalar, int UpLo>
+struct llt_inplace;
 
-template<typename MatrixType, typename VectorType>
-static Index llt_rank_update_lower(MatrixType& mat, const VectorType& vec, const typename MatrixType::RealScalar& sigma)
-{
+template <typename MatrixType, typename VectorType>
+static Index llt_rank_update_lower(MatrixType& mat, const VectorType& vec,
+                                   const typename MatrixType::RealScalar& sigma) {
   using std::sqrt;
   typedef typename MatrixType::Scalar Scalar;
   typedef typename MatrixType::RealScalar RealScalar;
   typedef typename MatrixType::ColXpr ColXpr;
   typedef internal::remove_all_t<ColXpr> ColXprCleaned;
   typedef typename ColXprCleaned::SegmentReturnType ColXprSegment;
-  typedef Matrix<Scalar,Dynamic,1> TempVectorType;
+  typedef Matrix<Scalar, Dynamic, 1> TempVectorType;
   typedef typename TempVectorType::SegmentReturnType TempVecSegment;
 
   Index n = mat.cols();
-  eigen_assert(mat.rows()==n && vec.size()==n);
+  eigen_assert(mat.rows() == n && vec.size() == n);
 
   TempVectorType temp;
 
-  if(sigma>0)
-  {
+  if (sigma > 0) {
     // This version is based on Givens rotations.
     // It is faster than the other one below, but only works for updates,
     // i.e., for sigma > 0
     temp = sqrt(sigma) * vec;
 
-    for(Index i=0; i<n; ++i)
-    {
+    for (Index i = 0; i < n; ++i) {
       JacobiRotation<Scalar> g;
-      g.makeGivens(mat(i,i), -temp(i), &mat(i,i));
+      g.makeGivens(mat(i, i), -temp(i), &mat(i, i));
 
-      Index rs = n-i-1;
-      if(rs>0)
-      {
+      Index rs = n - i - 1;
+      if (rs > 0) {
         ColXprSegment x(mat.col(i).tail(rs));
         TempVecSegment y(temp.tail(rs));
         apply_rotation_in_the_plane(x, y, g);
       }
     }
-  }
-  else
-  {
+  } else {
     temp = vec;
     RealScalar beta = 1;
-    for(Index j=0; j<n; ++j)
-    {
-      RealScalar Ljj = numext::real(mat.coeff(j,j));
+    for (Index j = 0; j < n; ++j) {
+      RealScalar Ljj = numext::real(mat.coeff(j, j));
       RealScalar dj = numext::abs2(Ljj);
       Scalar wj = temp.coeff(j);
-      RealScalar swj2 = sigma*numext::abs2(wj);
-      RealScalar gamma = dj*beta + swj2;
+      RealScalar swj2 = sigma * numext::abs2(wj);
+      RealScalar gamma = dj * beta + swj2;
 
-      RealScalar x = dj + swj2/beta;
-      if (x<=RealScalar(0))
-        return j;
+      RealScalar x = dj + swj2 / beta;
+      if (x <= RealScalar(0)) return j;
       RealScalar nLjj = sqrt(x);
-      mat.coeffRef(j,j) = nLjj;
-      beta += swj2/dj;
+      mat.coeffRef(j, j) = nLjj;
+      beta += swj2 / dj;
 
       // Update the terms of L
-      Index rs = n-j-1;
-      if(rs)
-      {
-        temp.tail(rs) -= (wj/Ljj) * mat.col(j).tail(rs);
-        if(!numext::is_exactly_zero(gamma))
-          mat.col(j).tail(rs) = (nLjj/Ljj) * mat.col(j).tail(rs) + (nLjj * sigma*numext::conj(wj)/gamma)*temp.tail(rs);
+      Index rs = n - j - 1;
+      if (rs) {
+        temp.tail(rs) -= (wj / Ljj) * mat.col(j).tail(rs);
+        if (!numext::is_exactly_zero(gamma))
+          mat.col(j).tail(rs) =
+              (nLjj / Ljj) * mat.col(j).tail(rs) + (nLjj * sigma * numext::conj(wj) / gamma) * temp.tail(rs);
       }
     }
   }
   return -1;
 }
 
-template<typename Scalar> struct llt_inplace<Scalar, Lower>
-{
+template <typename Scalar>
+struct llt_inplace<Scalar, Lower> {
   typedef typename NumTraits<Scalar>::Real RealScalar;
-  template<typename MatrixType>
-  static Index unblocked(MatrixType& mat)
-  {
+  template <typename MatrixType>
+  static Index unblocked(MatrixType& mat) {
     using std::sqrt;
 
-    eigen_assert(mat.rows()==mat.cols());
+    eigen_assert(mat.rows() == mat.cols());
     const Index size = mat.rows();
-    for(Index k = 0; k < size; ++k)
-    {
-      Index rs = size-k-1; // remaining size
+    for (Index k = 0; k < size; ++k) {
+      Index rs = size - k - 1;  // remaining size
 
-      Block<MatrixType,Dynamic,1> A21(mat,k+1,k,rs,1);
-      Block<MatrixType,1,Dynamic> A10(mat,k,0,1,k);
-      Block<MatrixType,Dynamic,Dynamic> A20(mat,k+1,0,rs,k);
+      Block<MatrixType, Dynamic, 1> A21(mat, k + 1, k, rs, 1);
+      Block<MatrixType, 1, Dynamic> A10(mat, k, 0, 1, k);
+      Block<MatrixType, Dynamic, Dynamic> A20(mat, k + 1, 0, rs, k);
 
-      RealScalar x = numext::real(mat.coeff(k,k));
-      if (k>0) x -= A10.squaredNorm();
-      if (x<=RealScalar(0))
-        return k;
-      mat.coeffRef(k,k) = x = sqrt(x);
-      if (k>0 && rs>0) A21.noalias() -= A20 * A10.adjoint();
-      if (rs>0) A21 /= x;
+      RealScalar x = numext::real(mat.coeff(k, k));
+      if (k > 0) x -= A10.squaredNorm();
+      if (x <= RealScalar(0)) return k;
+      mat.coeffRef(k, k) = x = sqrt(x);
+      if (k > 0 && rs > 0) A21.noalias() -= A20 * A10.adjoint();
+      if (rs > 0) A21 /= x;
     }
     return -1;
   }
 
-  template<typename MatrixType>
-  static Index blocked(MatrixType& m)
-  {
-    eigen_assert(m.rows()==m.cols());
+  template <typename MatrixType>
+  static Index blocked(MatrixType& m) {
+    eigen_assert(m.rows() == m.cols());
     Index size = m.rows();
-    if(size<32)
-      return unblocked(m);
+    if (size < 32) return unblocked(m);
 
-    Index blockSize = size/8;
-    blockSize = (blockSize/16)*16;
-    blockSize = (std::min)((std::max)(blockSize,Index(8)), Index(128));
+    Index blockSize = size / 8;
+    blockSize = (blockSize / 16) * 16;
+    blockSize = (std::min)((std::max)(blockSize, Index(8)), Index(128));
 
-    for (Index k=0; k<size; k+=blockSize)
-    {
+    for (Index k = 0; k < size; k += blockSize) {
       // partition the matrix:
       //       A00 |  -  |  -
       // lu  = A10 | A11 |  -
       //       A20 | A21 | A22
-      Index bs = (std::min)(blockSize, size-k);
+      Index bs = (std::min)(blockSize, size - k);
       Index rs = size - k - bs;
-      Block<MatrixType,Dynamic,Dynamic> A11(m,k,   k,   bs,bs);
-      Block<MatrixType,Dynamic,Dynamic> A21(m,k+bs,k,   rs,bs);
-      Block<MatrixType,Dynamic,Dynamic> A22(m,k+bs,k+bs,rs,rs);
+      Block<MatrixType, Dynamic, Dynamic> A11(m, k, k, bs, bs);
+      Block<MatrixType, Dynamic, Dynamic> A21(m, k + bs, k, rs, bs);
+      Block<MatrixType, Dynamic, Dynamic> A22(m, k + bs, k + bs, rs, rs);
 
       Index ret;
-      if((ret=unblocked(A11))>=0) return k+ret;
-      if(rs>0) A11.adjoint().template triangularView<Upper>().template solveInPlace<OnTheRight>(A21);
-      if(rs>0) A22.template selfadjointView<Lower>().rankUpdate(A21,typename NumTraits<RealScalar>::Literal(-1)); // bottleneck
+      if ((ret = unblocked(A11)) >= 0) return k + ret;
+      if (rs > 0) A11.adjoint().template triangularView<Upper>().template solveInPlace<OnTheRight>(A21);
+      if (rs > 0)
+        A22.template selfadjointView<Lower>().rankUpdate(A21,
+                                                         typename NumTraits<RealScalar>::Literal(-1));  // bottleneck
     }
     return -1;
   }
 
-  template<typename MatrixType, typename VectorType>
-  static Index rankUpdate(MatrixType& mat, const VectorType& vec, const RealScalar& sigma)
-  {
+  template <typename MatrixType, typename VectorType>
+  static Index rankUpdate(MatrixType& mat, const VectorType& vec, const RealScalar& sigma) {
     return Eigen::internal::llt_rank_update_lower(mat, vec, sigma);
   }
 };
 
-template<typename Scalar> struct llt_inplace<Scalar, Upper>
-{
+template <typename Scalar>
+struct llt_inplace<Scalar, Upper> {
   typedef typename NumTraits<Scalar>::Real RealScalar;
 
-  template<typename MatrixType>
-  static EIGEN_STRONG_INLINE Index unblocked(MatrixType& mat)
-  {
+  template <typename MatrixType>
+  static EIGEN_STRONG_INLINE Index unblocked(MatrixType& mat) {
     Transpose<MatrixType> matt(mat);
     return llt_inplace<Scalar, Lower>::unblocked(matt);
   }
-  template<typename MatrixType>
-  static EIGEN_STRONG_INLINE Index blocked(MatrixType& mat)
-  {
+  template <typename MatrixType>
+  static EIGEN_STRONG_INLINE Index blocked(MatrixType& mat) {
     Transpose<MatrixType> matt(mat);
     return llt_inplace<Scalar, Lower>::blocked(matt);
   }
-  template<typename MatrixType, typename VectorType>
-  static Index rankUpdate(MatrixType& mat, const VectorType& vec, const RealScalar& sigma)
-  {
+  template <typename MatrixType, typename VectorType>
+  static Index rankUpdate(MatrixType& mat, const VectorType& vec, const RealScalar& sigma) {
     Transpose<MatrixType> matt(mat);
     return llt_inplace<Scalar, Lower>::rankUpdate(matt, vec.conjugate(), sigma);
   }
 };
 
-template<typename MatrixType> struct LLT_Traits<MatrixType,Lower>
-{
+template <typename MatrixType>
+struct LLT_Traits<MatrixType, Lower> {
   typedef const TriangularView<const MatrixType, Lower> MatrixL;
   typedef const TriangularView<const typename MatrixType::AdjointReturnType, Upper> MatrixU;
   static inline MatrixL getL(const MatrixType& m) { return MatrixL(m); }
   static inline MatrixU getU(const MatrixType& m) { return MatrixU(m.adjoint()); }
-  static bool inplace_decomposition(MatrixType& m)
-  { return llt_inplace<typename MatrixType::Scalar, Lower>::blocked(m)==-1; }
+  static bool inplace_decomposition(MatrixType& m) {
+    return llt_inplace<typename MatrixType::Scalar, Lower>::blocked(m) == -1;
+  }
 };
 
-template<typename MatrixType> struct LLT_Traits<MatrixType,Upper>
-{
+template <typename MatrixType>
+struct LLT_Traits<MatrixType, Upper> {
   typedef const TriangularView<const typename MatrixType::AdjointReturnType, Lower> MatrixL;
   typedef const TriangularView<const MatrixType, Upper> MatrixU;
   static inline MatrixL getL(const MatrixType& m) { return MatrixL(m.adjoint()); }
   static inline MatrixU getU(const MatrixType& m) { return MatrixU(m); }
-  static bool inplace_decomposition(MatrixType& m)
-  { return llt_inplace<typename MatrixType::Scalar, Upper>::blocked(m)==-1; }
+  static bool inplace_decomposition(MatrixType& m) {
+    return llt_inplace<typename MatrixType::Scalar, Upper>::blocked(m) == -1;
+  }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** Computes / recomputes the Cholesky decomposition A = LL^* = U^*U of \a matrix
-  *
-  * \returns a reference to *this
-  *
-  * Example: \include TutorialLinAlgComputeTwice.cpp
-  * Output: \verbinclude TutorialLinAlgComputeTwice.out
-  */
-template<typename MatrixType, int UpLo_>
-template<typename InputType>
-LLT<MatrixType,UpLo_>& LLT<MatrixType,UpLo_>::compute(const EigenBase<InputType>& a)
-{
-  eigen_assert(a.rows()==a.cols());
+ *
+ * \returns a reference to *this
+ *
+ * Example: \include TutorialLinAlgComputeTwice.cpp
+ * Output: \verbinclude TutorialLinAlgComputeTwice.out
+ */
+template <typename MatrixType, int UpLo_>
+template <typename InputType>
+LLT<MatrixType, UpLo_>& LLT<MatrixType, UpLo_>::compute(const EigenBase<InputType>& a) {
+  eigen_assert(a.rows() == a.cols());
   const Index size = a.rows();
   m_matrix.resize(size, size);
-  if (!internal::is_same_dense(m_matrix, a.derived()))
-    m_matrix = a.derived();
+  if (!internal::is_same_dense(m_matrix, a.derived())) m_matrix = a.derived();
 
   // Compute matrix L1 norm = max abs column sum.
   m_l1_norm = RealScalar(0);
@@ -443,11 +408,12 @@
   for (Index col = 0; col < size; ++col) {
     RealScalar abs_col_sum;
     if (UpLo_ == Lower)
-      abs_col_sum = m_matrix.col(col).tail(size - col).template lpNorm<1>() + m_matrix.row(col).head(col).template lpNorm<1>();
+      abs_col_sum =
+          m_matrix.col(col).tail(size - col).template lpNorm<1>() + m_matrix.row(col).head(col).template lpNorm<1>();
     else
-      abs_col_sum = m_matrix.col(col).head(col).template lpNorm<1>() + m_matrix.row(col).tail(size - col).template lpNorm<1>();
-    if (abs_col_sum > m_l1_norm)
-      m_l1_norm = abs_col_sum;
+      abs_col_sum =
+          m_matrix.col(col).head(col).template lpNorm<1>() + m_matrix.row(col).tail(size - col).template lpNorm<1>();
+    if (abs_col_sum > m_l1_norm) m_l1_norm = abs_col_sum;
   }
 
   m_isInitialized = true;
@@ -458,18 +424,17 @@
 }
 
 /** Performs a rank one update (or dowdate) of the current decomposition.
-  * If A = LL^* before the rank one update,
-  * then after it we have LL^* = A + sigma * v v^* where \a v must be a vector
-  * of same dimension.
-  */
-template<typename MatrixType_, int UpLo_>
-template<typename VectorType>
-LLT<MatrixType_,UpLo_> & LLT<MatrixType_,UpLo_>::rankUpdate(const VectorType& v, const RealScalar& sigma)
-{
+ * If A = LL^* before the rank one update,
+ * then after it we have LL^* = A + sigma * v v^* where \a v must be a vector
+ * of same dimension.
+ */
+template <typename MatrixType_, int UpLo_>
+template <typename VectorType>
+LLT<MatrixType_, UpLo_>& LLT<MatrixType_, UpLo_>::rankUpdate(const VectorType& v, const RealScalar& sigma) {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(VectorType);
-  eigen_assert(v.size()==m_matrix.cols());
+  eigen_assert(v.size() == m_matrix.cols());
   eigen_assert(m_isInitialized);
-  if(internal::llt_inplace<typename MatrixType::Scalar, UpLo>::rankUpdate(m_matrix,v,sigma)>=0)
+  if (internal::llt_inplace<typename MatrixType::Scalar, UpLo>::rankUpdate(m_matrix, v, sigma) >= 0)
     m_info = NumericalIssue;
   else
     m_info = Success;
@@ -478,43 +443,40 @@
 }
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-template<typename MatrixType_,int UpLo_>
-template<typename RhsType, typename DstType>
-void LLT<MatrixType_,UpLo_>::_solve_impl(const RhsType &rhs, DstType &dst) const
-{
+template <typename MatrixType_, int UpLo_>
+template <typename RhsType, typename DstType>
+void LLT<MatrixType_, UpLo_>::_solve_impl(const RhsType& rhs, DstType& dst) const {
   _solve_impl_transposed<true>(rhs, dst);
 }
 
-template<typename MatrixType_,int UpLo_>
-template<bool Conjugate, typename RhsType, typename DstType>
-void LLT<MatrixType_,UpLo_>::_solve_impl_transposed(const RhsType &rhs, DstType &dst) const
-{
-    dst = rhs;
+template <typename MatrixType_, int UpLo_>
+template <bool Conjugate, typename RhsType, typename DstType>
+void LLT<MatrixType_, UpLo_>::_solve_impl_transposed(const RhsType& rhs, DstType& dst) const {
+  dst = rhs;
 
-    matrixL().template conjugateIf<!Conjugate>().solveInPlace(dst);
-    matrixU().template conjugateIf<!Conjugate>().solveInPlace(dst);
+  matrixL().template conjugateIf<!Conjugate>().solveInPlace(dst);
+  matrixU().template conjugateIf<!Conjugate>().solveInPlace(dst);
 }
 #endif
 
 /** \internal use x = llt_object.solve(x);
-  *
-  * This is the \em in-place version of solve().
-  *
-  * \param bAndX represents both the right-hand side matrix b and result x.
-  *
-  * This version avoids a copy when the right hand side matrix b is not needed anymore.
-  *
-  * \warning The parameter is only marked 'const' to make the C++ compiler accept a temporary expression here.
-  * This function will const_cast it, so constness isn't honored here.
-  *
-  * \sa LLT::solve(), MatrixBase::llt()
-  */
-template<typename MatrixType, int UpLo_>
-template<typename Derived>
-void LLT<MatrixType,UpLo_>::solveInPlace(const MatrixBase<Derived> &bAndX) const
-{
+ *
+ * This is the \em in-place version of solve().
+ *
+ * \param bAndX represents both the right-hand side matrix b and result x.
+ *
+ * This version avoids a copy when the right hand side matrix b is not needed anymore.
+ *
+ * \warning The parameter is only marked 'const' to make the C++ compiler accept a temporary expression here.
+ * This function will const_cast it, so constness isn't honored here.
+ *
+ * \sa LLT::solve(), MatrixBase::llt()
+ */
+template <typename MatrixType, int UpLo_>
+template <typename Derived>
+void LLT<MatrixType, UpLo_>::solveInPlace(const MatrixBase<Derived>& bAndX) const {
   eigen_assert(m_isInitialized && "LLT is not initialized.");
-  eigen_assert(m_matrix.rows()==bAndX.rows());
+  eigen_assert(m_matrix.rows() == bAndX.rows());
   matrixL().solveInPlace(bAndX);
   matrixU().solveInPlace(bAndX);
 }
@@ -522,35 +484,31 @@
 /** \returns the matrix represented by the decomposition,
  * i.e., it returns the product: L L^*.
  * This function is provided for debug purpose. */
-template<typename MatrixType, int UpLo_>
-MatrixType LLT<MatrixType,UpLo_>::reconstructedMatrix() const
-{
+template <typename MatrixType, int UpLo_>
+MatrixType LLT<MatrixType, UpLo_>::reconstructedMatrix() const {
   eigen_assert(m_isInitialized && "LLT is not initialized.");
   return matrixL() * matrixL().adjoint().toDenseMatrix();
 }
 
 /** \cholesky_module
-  * \returns the LLT decomposition of \c *this
-  * \sa SelfAdjointView::llt()
-  */
-template<typename Derived>
-inline const LLT<typename MatrixBase<Derived>::PlainObject>
-MatrixBase<Derived>::llt() const
-{
+ * \returns the LLT decomposition of \c *this
+ * \sa SelfAdjointView::llt()
+ */
+template <typename Derived>
+inline const LLT<typename MatrixBase<Derived>::PlainObject> MatrixBase<Derived>::llt() const {
   return LLT<PlainObject>(derived());
 }
 
 /** \cholesky_module
-  * \returns the LLT decomposition of \c *this
-  * \sa SelfAdjointView::llt()
-  */
-template<typename MatrixType, unsigned int UpLo>
-inline const LLT<typename SelfAdjointView<MatrixType, UpLo>::PlainObject, UpLo>
-SelfAdjointView<MatrixType, UpLo>::llt() const
-{
-  return LLT<PlainObject,UpLo>(m_matrix);
+ * \returns the LLT decomposition of \c *this
+ * \sa SelfAdjointView::llt()
+ */
+template <typename MatrixType, unsigned int UpLo>
+inline const LLT<typename SelfAdjointView<MatrixType, UpLo>::PlainObject, UpLo> SelfAdjointView<MatrixType, UpLo>::llt()
+    const {
+  return LLT<PlainObject, UpLo>(m_matrix);
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_LLT_H
+#endif  // EIGEN_LLT_H
diff --git a/Eigen/src/Cholesky/LLT_LAPACKE.h b/Eigen/src/Cholesky/LLT_LAPACKE.h
index 15eb2b8..cb55b15 100644
--- a/Eigen/src/Cholesky/LLT_LAPACKE.h
+++ b/Eigen/src/Cholesky/LLT_LAPACKE.h
@@ -41,63 +41,61 @@
 namespace internal {
 
 namespace lapacke_helpers {
-  // -------------------------------------------------------------------------------------------------------------------
-  //        Dispatch for rank update handling upper and lower parts
-  // -------------------------------------------------------------------------------------------------------------------
+// -------------------------------------------------------------------------------------------------------------------
+//        Dispatch for rank update handling upper and lower parts
+// -------------------------------------------------------------------------------------------------------------------
 
-  template<UpLoType Mode>
-  struct rank_update {};
+template <UpLoType Mode>
+struct rank_update {};
 
-  template<>
-  struct rank_update<Lower> {
-      template<typename MatrixType, typename VectorType>
-      static Index run(MatrixType &mat, const VectorType &vec, const typename MatrixType::RealScalar &sigma) {
-        return Eigen::internal::llt_rank_update_lower(mat, vec, sigma);
-      }
-  };
+template <>
+struct rank_update<Lower> {
+  template <typename MatrixType, typename VectorType>
+  static Index run(MatrixType &mat, const VectorType &vec, const typename MatrixType::RealScalar &sigma) {
+    return Eigen::internal::llt_rank_update_lower(mat, vec, sigma);
+  }
+};
 
-  template<>
-  struct rank_update<Upper> {
-      template<typename MatrixType, typename VectorType>
-      static Index run(MatrixType &mat, const VectorType &vec, const typename MatrixType::RealScalar &sigma) {
-        Transpose<MatrixType> matt(mat);
-        return Eigen::internal::llt_rank_update_lower(matt, vec.conjugate(), sigma);
-      }
-  };
+template <>
+struct rank_update<Upper> {
+  template <typename MatrixType, typename VectorType>
+  static Index run(MatrixType &mat, const VectorType &vec, const typename MatrixType::RealScalar &sigma) {
+    Transpose<MatrixType> matt(mat);
+    return Eigen::internal::llt_rank_update_lower(matt, vec.conjugate(), sigma);
+  }
+};
 
-  // -------------------------------------------------------------------------------------------------------------------
-  //        Generic lapacke llt implementation that hands of to the dispatches
-  // -------------------------------------------------------------------------------------------------------------------
+// -------------------------------------------------------------------------------------------------------------------
+//        Generic lapacke llt implementation that hands of to the dispatches
+// -------------------------------------------------------------------------------------------------------------------
 
-  template<typename Scalar, UpLoType Mode>
-  struct lapacke_llt {
-    EIGEN_STATIC_ASSERT(((Mode == Lower) || (Mode == Upper)),MODE_MUST_BE_UPPER_OR_LOWER)
-    template<typename MatrixType>
-    static Index blocked(MatrixType& m)
-    {
-      eigen_assert(m.rows() == m.cols());
-      if(m.rows() == 0) {
-        return -1;
-      }
-      /* Set up parameters for ?potrf */
-      lapack_int size = to_lapack(m.rows());
-      lapack_int matrix_order = lapack_storage_of(m);
-      constexpr char uplo = Mode == Upper ? 'U' : 'L';
-      Scalar* a = &(m.coeffRef(0,0));
-      lapack_int lda = to_lapack(m.outerStride());
-
-      lapack_int info = potrf(matrix_order, uplo, size, to_lapack(a), lda );
-      info = (info==0) ? -1 : info>0 ? info-1 : size;
-      return info;
+template <typename Scalar, UpLoType Mode>
+struct lapacke_llt {
+  EIGEN_STATIC_ASSERT(((Mode == Lower) || (Mode == Upper)), MODE_MUST_BE_UPPER_OR_LOWER)
+  template <typename MatrixType>
+  static Index blocked(MatrixType &m) {
+    eigen_assert(m.rows() == m.cols());
+    if (m.rows() == 0) {
+      return -1;
     }
+    /* Set up parameters for ?potrf */
+    lapack_int size = to_lapack(m.rows());
+    lapack_int matrix_order = lapack_storage_of(m);
+    constexpr char uplo = Mode == Upper ? 'U' : 'L';
+    Scalar *a = &(m.coeffRef(0, 0));
+    lapack_int lda = to_lapack(m.outerStride());
 
-    template<typename MatrixType, typename VectorType>
-    static Index rankUpdate(MatrixType& mat, const VectorType& vec, const typename MatrixType::RealScalar& sigma)
-    {
-      return rank_update<Mode>::run(mat, vec, sigma);
-    }
-  };
-}
+    lapack_int info = potrf(matrix_order, uplo, size, to_lapack(a), lda);
+    info = (info == 0) ? -1 : info > 0 ? info - 1 : size;
+    return info;
+  }
+
+  template <typename MatrixType, typename VectorType>
+  static Index rankUpdate(MatrixType &mat, const VectorType &vec, const typename MatrixType::RealScalar &sigma) {
+    return rank_update<Mode>::run(mat, vec, sigma);
+  }
+};
+}  // namespace lapacke_helpers
 // end namespace lapacke_helpers
 
 /*
@@ -106,9 +104,11 @@
  * in LLT.h for double, float and complex double, complex float types.
  */
 
-#define EIGEN_LAPACKE_LLT(EIGTYPE) \
-template<> struct llt_inplace<EIGTYPE, Lower> : public lapacke_helpers::lapacke_llt<EIGTYPE, Lower> {}; \
-template<> struct llt_inplace<EIGTYPE, Upper> : public lapacke_helpers::lapacke_llt<EIGTYPE, Upper> {};
+#define EIGEN_LAPACKE_LLT(EIGTYPE)                                                             \
+  template <>                                                                                  \
+  struct llt_inplace<EIGTYPE, Lower> : public lapacke_helpers::lapacke_llt<EIGTYPE, Lower> {}; \
+  template <>                                                                                  \
+  struct llt_inplace<EIGTYPE, Upper> : public lapacke_helpers::lapacke_llt<EIGTYPE, Upper> {};
 
 EIGEN_LAPACKE_LLT(double)
 EIGEN_LAPACKE_LLT(float)
@@ -117,8 +117,8 @@
 
 #undef EIGEN_LAPACKE_LLT
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_LLT_LAPACKE_H
+#endif  // EIGEN_LLT_LAPACKE_H
diff --git a/Eigen/src/CholmodSupport/CholmodSupport.h b/Eigen/src/CholmodSupport/CholmodSupport.h
index e4e58f3..be2e737 100644
--- a/Eigen/src/CholmodSupport/CholmodSupport.h
+++ b/Eigen/src/CholmodSupport/CholmodSupport.h
@@ -17,18 +17,21 @@
 
 namespace internal {
 
-template<typename Scalar> struct cholmod_configure_matrix;
+template <typename Scalar>
+struct cholmod_configure_matrix;
 
-template<> struct cholmod_configure_matrix<double> {
-  template<typename CholmodType>
+template <>
+struct cholmod_configure_matrix<double> {
+  template <typename CholmodType>
   static void run(CholmodType& mat) {
     mat.xtype = CHOLMOD_REAL;
     mat.dtype = CHOLMOD_DOUBLE;
   }
 };
 
-template<> struct cholmod_configure_matrix<std::complex<double> > {
-  template<typename CholmodType>
+template <>
+struct cholmod_configure_matrix<std::complex<double> > {
+  template <typename CholmodType>
   static void run(CholmodType& mat) {
     mat.xtype = CHOLMOD_COMPLEX;
     mat.dtype = CHOLMOD_DOUBLE;
@@ -52,47 +55,38 @@
 //   }
 // };
 
-} // namespace internal
+}  // namespace internal
 
 /** Wraps the Eigen sparse matrix \a mat into a Cholmod sparse matrix object.
-  * Note that the data are shared.
-  */
-template<typename Scalar_, int Options_, typename StorageIndex_>
-cholmod_sparse viewAsCholmod(Ref<SparseMatrix<Scalar_,Options_,StorageIndex_> > mat)
-{
+ * Note that the data are shared.
+ */
+template <typename Scalar_, int Options_, typename StorageIndex_>
+cholmod_sparse viewAsCholmod(Ref<SparseMatrix<Scalar_, Options_, StorageIndex_> > mat) {
   cholmod_sparse res;
-  res.nzmax   = mat.nonZeros();
-  res.nrow    = mat.rows();
-  res.ncol    = mat.cols();
-  res.p       = mat.outerIndexPtr();
-  res.i       = mat.innerIndexPtr();
-  res.x       = mat.valuePtr();
-  res.z       = 0;
-  res.sorted  = 1;
-  if(mat.isCompressed())
-  {
-    res.packed  = 1;
+  res.nzmax = mat.nonZeros();
+  res.nrow = mat.rows();
+  res.ncol = mat.cols();
+  res.p = mat.outerIndexPtr();
+  res.i = mat.innerIndexPtr();
+  res.x = mat.valuePtr();
+  res.z = 0;
+  res.sorted = 1;
+  if (mat.isCompressed()) {
+    res.packed = 1;
     res.nz = 0;
-  }
-  else
-  {
-    res.packed  = 0;
+  } else {
+    res.packed = 0;
     res.nz = mat.innerNonZeroPtr();
   }
 
-  res.dtype   = 0;
-  res.stype   = -1;
+  res.dtype = 0;
+  res.stype = -1;
 
-  if (internal::is_same<StorageIndex_,int>::value)
-  {
+  if (internal::is_same<StorageIndex_, int>::value) {
     res.itype = CHOLMOD_INT;
-  }
-  else if (internal::is_same<StorageIndex_,SuiteSparse_long>::value)
-  {
+  } else if (internal::is_same<StorageIndex_, SuiteSparse_long>::value) {
     res.itype = CHOLMOD_LONG;
-  }
-  else
-  {
+  } else {
     eigen_assert(false && "Index type not supported yet");
   }
 
@@ -104,51 +98,49 @@
   return res;
 }
 
-template<typename Scalar_, int Options_, typename Index_>
-const cholmod_sparse viewAsCholmod(const SparseMatrix<Scalar_,Options_,Index_>& mat)
-{
-  cholmod_sparse res = viewAsCholmod(Ref<SparseMatrix<Scalar_,Options_,Index_> >(mat.const_cast_derived()));
+template <typename Scalar_, int Options_, typename Index_>
+const cholmod_sparse viewAsCholmod(const SparseMatrix<Scalar_, Options_, Index_>& mat) {
+  cholmod_sparse res = viewAsCholmod(Ref<SparseMatrix<Scalar_, Options_, Index_> >(mat.const_cast_derived()));
   return res;
 }
 
-template<typename Scalar_, int Options_, typename Index_>
-const cholmod_sparse viewAsCholmod(const SparseVector<Scalar_,Options_,Index_>& mat)
-{
-  cholmod_sparse res = viewAsCholmod(Ref<SparseMatrix<Scalar_,Options_,Index_> >(mat.const_cast_derived()));
+template <typename Scalar_, int Options_, typename Index_>
+const cholmod_sparse viewAsCholmod(const SparseVector<Scalar_, Options_, Index_>& mat) {
+  cholmod_sparse res = viewAsCholmod(Ref<SparseMatrix<Scalar_, Options_, Index_> >(mat.const_cast_derived()));
   return res;
 }
 
 /** Returns a view of the Eigen sparse matrix \a mat as Cholmod sparse matrix.
-  * The data are not copied but shared. */
-template<typename Scalar_, int Options_, typename Index_, unsigned int UpLo>
-cholmod_sparse viewAsCholmod(const SparseSelfAdjointView<const SparseMatrix<Scalar_,Options_,Index_>, UpLo>& mat)
-{
-  cholmod_sparse res = viewAsCholmod(Ref<SparseMatrix<Scalar_,Options_,Index_> >(mat.matrix().const_cast_derived()));
+ * The data are not copied but shared. */
+template <typename Scalar_, int Options_, typename Index_, unsigned int UpLo>
+cholmod_sparse viewAsCholmod(const SparseSelfAdjointView<const SparseMatrix<Scalar_, Options_, Index_>, UpLo>& mat) {
+  cholmod_sparse res = viewAsCholmod(Ref<SparseMatrix<Scalar_, Options_, Index_> >(mat.matrix().const_cast_derived()));
 
-  if(UpLo==Upper) res.stype =  1;
-  if(UpLo==Lower) res.stype = -1;
+  if (UpLo == Upper) res.stype = 1;
+  if (UpLo == Lower) res.stype = -1;
   // swap stype for rowmajor matrices (only works for real matrices)
-  EIGEN_STATIC_ASSERT((Options_ & RowMajorBit) == 0 || NumTraits<Scalar_>::IsComplex == 0, THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);
-  if(Options_ & RowMajorBit) res.stype *=-1;
+  EIGEN_STATIC_ASSERT((Options_ & RowMajorBit) == 0 || NumTraits<Scalar_>::IsComplex == 0,
+                      THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);
+  if (Options_ & RowMajorBit) res.stype *= -1;
 
   return res;
 }
 
 /** Returns a view of the Eigen \b dense matrix \a mat as Cholmod dense matrix.
-  * The data are not copied but shared. */
-template<typename Derived>
-cholmod_dense viewAsCholmod(MatrixBase<Derived>& mat)
-{
-  EIGEN_STATIC_ASSERT((internal::traits<Derived>::Flags&RowMajorBit)==0,THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);
+ * The data are not copied but shared. */
+template <typename Derived>
+cholmod_dense viewAsCholmod(MatrixBase<Derived>& mat) {
+  EIGEN_STATIC_ASSERT((internal::traits<Derived>::Flags & RowMajorBit) == 0,
+                      THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);
   typedef typename Derived::Scalar Scalar;
 
   cholmod_dense res;
-  res.nrow   = mat.rows();
-  res.ncol   = mat.cols();
-  res.nzmax  = res.nrow * res.ncol;
-  res.d      = Derived::IsVectorAtCompileTime ? mat.derived().size() : mat.derived().outerStride();
-  res.x      = (void*)(mat.derived().data());
-  res.z      = 0;
+  res.nrow = mat.rows();
+  res.ncol = mat.cols();
+  res.nzmax = res.nrow * res.ncol;
+  res.d = Derived::IsVectorAtCompileTime ? mat.derived().size() : mat.derived().outerStride();
+  res.x = (void*)(mat.derived().data());
+  res.z = 0;
 
   internal::cholmod_configure_matrix<Scalar>::run(res);
 
@@ -156,530 +148,526 @@
 }
 
 /** Returns a view of the Cholmod sparse matrix \a cm as an Eigen sparse matrix.
-  * The data are not copied but shared. */
-template<typename Scalar, int Flags, typename StorageIndex>
-Map<SparseMatrix<Scalar,Flags,StorageIndex> > viewAsEigen(cholmod_sparse& cm)
-{
-  return Map<SparseMatrix<Scalar,Flags,StorageIndex> >
-         (cm.nrow, cm.ncol, static_cast<StorageIndex*>(cm.p)[cm.ncol],
-          static_cast<StorageIndex*>(cm.p), static_cast<StorageIndex*>(cm.i),static_cast<Scalar*>(cm.x) );
+ * The data are not copied but shared. */
+template <typename Scalar, int Flags, typename StorageIndex>
+Map<SparseMatrix<Scalar, Flags, StorageIndex> > viewAsEigen(cholmod_sparse& cm) {
+  return Map<SparseMatrix<Scalar, Flags, StorageIndex> >(cm.nrow, cm.ncol, static_cast<StorageIndex*>(cm.p)[cm.ncol],
+                                                         static_cast<StorageIndex*>(cm.p),
+                                                         static_cast<StorageIndex*>(cm.i), static_cast<Scalar*>(cm.x));
 }
 
 namespace internal {
 
 // template specializations for int and long that call the correct cholmod method
 
-#define EIGEN_CHOLMOD_SPECIALIZE0(ret, name) \
-    template<typename StorageIndex_> inline ret cm_ ## name       (cholmod_common &Common) { return cholmod_ ## name   (&Common); } \
-    template<>                       inline ret cm_ ## name<SuiteSparse_long> (cholmod_common &Common) { return cholmod_l_ ## name (&Common); }
+#define EIGEN_CHOLMOD_SPECIALIZE0(ret, name)                        \
+  template <typename StorageIndex_>                                 \
+  inline ret cm_##name(cholmod_common& Common) {                    \
+    return cholmod_##name(&Common);                                 \
+  }                                                                 \
+  template <>                                                       \
+  inline ret cm_##name<SuiteSparse_long>(cholmod_common & Common) { \
+    return cholmod_l_##name(&Common);                               \
+  }
 
-#define EIGEN_CHOLMOD_SPECIALIZE1(ret, name, t1, a1) \
-    template<typename StorageIndex_> inline ret cm_ ## name       (t1& a1, cholmod_common &Common) { return cholmod_ ## name   (&a1, &Common); } \
-    template<>                       inline ret cm_ ## name<SuiteSparse_long> (t1& a1, cholmod_common &Common) { return cholmod_l_ ## name (&a1, &Common); }
+#define EIGEN_CHOLMOD_SPECIALIZE1(ret, name, t1, a1)                         \
+  template <typename StorageIndex_>                                          \
+  inline ret cm_##name(t1& a1, cholmod_common& Common) {                     \
+    return cholmod_##name(&a1, &Common);                                     \
+  }                                                                          \
+  template <>                                                                \
+  inline ret cm_##name<SuiteSparse_long>(t1 & a1, cholmod_common & Common) { \
+    return cholmod_l_##name(&a1, &Common);                                   \
+  }
 
 EIGEN_CHOLMOD_SPECIALIZE0(int, start)
 EIGEN_CHOLMOD_SPECIALIZE0(int, finish)
 
 EIGEN_CHOLMOD_SPECIALIZE1(int, free_factor, cholmod_factor*, L)
-EIGEN_CHOLMOD_SPECIALIZE1(int, free_dense,  cholmod_dense*,  X)
+EIGEN_CHOLMOD_SPECIALIZE1(int, free_dense, cholmod_dense*, X)
 EIGEN_CHOLMOD_SPECIALIZE1(int, free_sparse, cholmod_sparse*, A)
 
 EIGEN_CHOLMOD_SPECIALIZE1(cholmod_factor*, analyze, cholmod_sparse, A)
 
-template<typename StorageIndex_> inline cholmod_dense*  cm_solve         (int sys, cholmod_factor& L, cholmod_dense&  B, cholmod_common &Common) { return cholmod_solve     (sys, &L, &B, &Common); }
-template<>                       inline cholmod_dense*  cm_solve<SuiteSparse_long>   (int sys, cholmod_factor& L, cholmod_dense&  B, cholmod_common &Common) { return cholmod_l_solve   (sys, &L, &B, &Common); }
+template <typename StorageIndex_>
+inline cholmod_dense* cm_solve(int sys, cholmod_factor& L, cholmod_dense& B, cholmod_common& Common) {
+  return cholmod_solve(sys, &L, &B, &Common);
+}
+template <>
+inline cholmod_dense* cm_solve<SuiteSparse_long>(int sys, cholmod_factor& L, cholmod_dense& B, cholmod_common& Common) {
+  return cholmod_l_solve(sys, &L, &B, &Common);
+}
 
-template<typename StorageIndex_> inline cholmod_sparse* cm_spsolve       (int sys, cholmod_factor& L, cholmod_sparse& B, cholmod_common &Common) { return cholmod_spsolve   (sys, &L, &B, &Common); }
-template<>                       inline cholmod_sparse* cm_spsolve<SuiteSparse_long> (int sys, cholmod_factor& L, cholmod_sparse& B, cholmod_common &Common) { return cholmod_l_spsolve (sys, &L, &B, &Common); }
+template <typename StorageIndex_>
+inline cholmod_sparse* cm_spsolve(int sys, cholmod_factor& L, cholmod_sparse& B, cholmod_common& Common) {
+  return cholmod_spsolve(sys, &L, &B, &Common);
+}
+template <>
+inline cholmod_sparse* cm_spsolve<SuiteSparse_long>(int sys, cholmod_factor& L, cholmod_sparse& B,
+                                                    cholmod_common& Common) {
+  return cholmod_l_spsolve(sys, &L, &B, &Common);
+}
 
-template<typename StorageIndex_>
-inline int  cm_factorize_p       (cholmod_sparse*  A, double beta[2], StorageIndex_* fset, std::size_t fsize, cholmod_factor* L, cholmod_common &Common) { return cholmod_factorize_p   (A, beta, fset, fsize, L, &Common); }
-template<>
-inline int  cm_factorize_p<SuiteSparse_long> (cholmod_sparse*  A, double beta[2], SuiteSparse_long* fset,          std::size_t fsize, cholmod_factor* L, cholmod_common &Common) { return cholmod_l_factorize_p (A, beta, fset, fsize, L, &Common); }
+template <typename StorageIndex_>
+inline int cm_factorize_p(cholmod_sparse* A, double beta[2], StorageIndex_* fset, std::size_t fsize, cholmod_factor* L,
+                          cholmod_common& Common) {
+  return cholmod_factorize_p(A, beta, fset, fsize, L, &Common);
+}
+template <>
+inline int cm_factorize_p<SuiteSparse_long>(cholmod_sparse* A, double beta[2], SuiteSparse_long* fset,
+                                            std::size_t fsize, cholmod_factor* L, cholmod_common& Common) {
+  return cholmod_l_factorize_p(A, beta, fset, fsize, L, &Common);
+}
 
 #undef EIGEN_CHOLMOD_SPECIALIZE0
 #undef EIGEN_CHOLMOD_SPECIALIZE1
 
 }  // namespace internal
 
-
-enum CholmodMode {
-  CholmodAuto, CholmodSimplicialLLt, CholmodSupernodalLLt, CholmodLDLt
-};
-
+enum CholmodMode { CholmodAuto, CholmodSimplicialLLt, CholmodSupernodalLLt, CholmodLDLt };
 
 /** \ingroup CholmodSupport_Module
-  * \class CholmodBase
-  * \brief The base class for the direct Cholesky factorization of Cholmod
-  * \sa class CholmodSupernodalLLT, class CholmodSimplicialLDLT, class CholmodSimplicialLLT
-  */
-template<typename MatrixType_, int UpLo_, typename Derived>
-class CholmodBase : public SparseSolverBase<Derived>
-{
-  protected:
-    typedef SparseSolverBase<Derived> Base;
-    using Base::derived;
-    using Base::m_isInitialized;
-  public:
-    typedef MatrixType_ MatrixType;
-    enum { UpLo = UpLo_ };
-    typedef typename MatrixType::Scalar Scalar;
-    typedef typename MatrixType::RealScalar RealScalar;
-    typedef MatrixType CholMatrixType;
-    typedef typename MatrixType::StorageIndex StorageIndex;
-    enum {
-      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
-      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
-    };
+ * \class CholmodBase
+ * \brief The base class for the direct Cholesky factorization of Cholmod
+ * \sa class CholmodSupernodalLLT, class CholmodSimplicialLDLT, class CholmodSimplicialLLT
+ */
+template <typename MatrixType_, int UpLo_, typename Derived>
+class CholmodBase : public SparseSolverBase<Derived> {
+ protected:
+  typedef SparseSolverBase<Derived> Base;
+  using Base::derived;
+  using Base::m_isInitialized;
 
-  public:
+ public:
+  typedef MatrixType_ MatrixType;
+  enum { UpLo = UpLo_ };
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::RealScalar RealScalar;
+  typedef MatrixType CholMatrixType;
+  typedef typename MatrixType::StorageIndex StorageIndex;
+  enum { ColsAtCompileTime = MatrixType::ColsAtCompileTime, MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime };
 
-    CholmodBase()
-      : m_cholmodFactor(0), m_info(Success), m_factorizationIsOk(false), m_analysisIsOk(false)
-    {
-      EIGEN_STATIC_ASSERT((internal::is_same<double,RealScalar>::value), CHOLMOD_SUPPORTS_DOUBLE_PRECISION_ONLY);
-      m_shiftOffset[0] = m_shiftOffset[1] = 0.0;
-      internal::cm_start<StorageIndex>(m_cholmod);
+ public:
+  CholmodBase() : m_cholmodFactor(0), m_info(Success), m_factorizationIsOk(false), m_analysisIsOk(false) {
+    EIGEN_STATIC_ASSERT((internal::is_same<double, RealScalar>::value), CHOLMOD_SUPPORTS_DOUBLE_PRECISION_ONLY);
+    m_shiftOffset[0] = m_shiftOffset[1] = 0.0;
+    internal::cm_start<StorageIndex>(m_cholmod);
+  }
+
+  explicit CholmodBase(const MatrixType& matrix)
+      : m_cholmodFactor(0), m_info(Success), m_factorizationIsOk(false), m_analysisIsOk(false) {
+    EIGEN_STATIC_ASSERT((internal::is_same<double, RealScalar>::value), CHOLMOD_SUPPORTS_DOUBLE_PRECISION_ONLY);
+    m_shiftOffset[0] = m_shiftOffset[1] = 0.0;
+    internal::cm_start<StorageIndex>(m_cholmod);
+    compute(matrix);
+  }
+
+  ~CholmodBase() {
+    if (m_cholmodFactor) internal::cm_free_factor<StorageIndex>(m_cholmodFactor, m_cholmod);
+    internal::cm_finish<StorageIndex>(m_cholmod);
+  }
+
+  inline StorageIndex cols() const { return internal::convert_index<StorageIndex, Index>(m_cholmodFactor->n); }
+  inline StorageIndex rows() const { return internal::convert_index<StorageIndex, Index>(m_cholmodFactor->n); }
+
+  /** \brief Reports whether previous computation was successful.
+   *
+   * \returns \c Success if computation was successful,
+   *          \c NumericalIssue if the matrix.appears to be negative.
+   */
+  ComputationInfo info() const {
+    eigen_assert(m_isInitialized && "Decomposition is not initialized.");
+    return m_info;
+  }
+
+  /** Computes the sparse Cholesky decomposition of \a matrix */
+  Derived& compute(const MatrixType& matrix) {
+    analyzePattern(matrix);
+    factorize(matrix);
+    return derived();
+  }
+
+  /** Performs a symbolic decomposition on the sparsity pattern of \a matrix.
+   *
+   * This function is particularly useful when solving for several problems having the same structure.
+   *
+   * \sa factorize()
+   */
+  void analyzePattern(const MatrixType& matrix) {
+    if (m_cholmodFactor) {
+      internal::cm_free_factor<StorageIndex>(m_cholmodFactor, m_cholmod);
+      m_cholmodFactor = 0;
     }
+    cholmod_sparse A = viewAsCholmod(matrix.template selfadjointView<UpLo>());
+    m_cholmodFactor = internal::cm_analyze<StorageIndex>(A, m_cholmod);
 
-    explicit CholmodBase(const MatrixType& matrix)
-      : m_cholmodFactor(0), m_info(Success), m_factorizationIsOk(false), m_analysisIsOk(false)
-    {
-      EIGEN_STATIC_ASSERT((internal::is_same<double,RealScalar>::value), CHOLMOD_SUPPORTS_DOUBLE_PRECISION_ONLY);
-      m_shiftOffset[0] = m_shiftOffset[1] = 0.0;
-      internal::cm_start<StorageIndex>(m_cholmod);
-      compute(matrix);
+    this->m_isInitialized = true;
+    this->m_info = Success;
+    m_analysisIsOk = true;
+    m_factorizationIsOk = false;
+  }
+
+  /** Performs a numeric decomposition of \a matrix
+   *
+   * The given matrix must have the same sparsity pattern as the matrix on which the symbolic decomposition has been
+   * performed.
+   *
+   * \sa analyzePattern()
+   */
+  void factorize(const MatrixType& matrix) {
+    eigen_assert(m_analysisIsOk && "You must first call analyzePattern()");
+    cholmod_sparse A = viewAsCholmod(matrix.template selfadjointView<UpLo>());
+    internal::cm_factorize_p<StorageIndex>(&A, m_shiftOffset, 0, 0, m_cholmodFactor, m_cholmod);
+
+    // If the factorization failed, minor is the column at which it did. On success minor == n.
+    this->m_info = (m_cholmodFactor->minor == m_cholmodFactor->n ? Success : NumericalIssue);
+    m_factorizationIsOk = true;
+  }
+
+  /** Returns a reference to the Cholmod's configuration structure to get a full control over the performed operations.
+   *  See the Cholmod user guide for details. */
+  cholmod_common& cholmod() { return m_cholmod; }
+
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  /** \internal */
+  template <typename Rhs, typename Dest>
+  void _solve_impl(const MatrixBase<Rhs>& b, MatrixBase<Dest>& dest) const {
+    eigen_assert(m_factorizationIsOk &&
+                 "The decomposition is not in a valid state for solving, you must first call either compute() or "
+                 "symbolic()/numeric()");
+    const Index size = m_cholmodFactor->n;
+    EIGEN_UNUSED_VARIABLE(size);
+    eigen_assert(size == b.rows());
+
+    // Cholmod needs column-major storage without inner-stride, which corresponds to the default behavior of Ref.
+    Ref<const Matrix<typename Rhs::Scalar, Dynamic, Dynamic, ColMajor> > b_ref(b.derived());
+
+    cholmod_dense b_cd = viewAsCholmod(b_ref);
+    cholmod_dense* x_cd = internal::cm_solve<StorageIndex>(CHOLMOD_A, *m_cholmodFactor, b_cd, m_cholmod);
+    if (!x_cd) {
+      this->m_info = NumericalIssue;
+      return;
     }
+    // TODO optimize this copy by swapping when possible (be careful with alignment, etc.)
+    // NOTE Actually, the copy can be avoided by calling cholmod_solve2 instead of cholmod_solve
+    dest = Matrix<Scalar, Dest::RowsAtCompileTime, Dest::ColsAtCompileTime>::Map(reinterpret_cast<Scalar*>(x_cd->x),
+                                                                                 b.rows(), b.cols());
+    internal::cm_free_dense<StorageIndex>(x_cd, m_cholmod);
+  }
 
-    ~CholmodBase()
-    {
-      if(m_cholmodFactor)
-        internal::cm_free_factor<StorageIndex>(m_cholmodFactor, m_cholmod);
-      internal::cm_finish<StorageIndex>(m_cholmod);
+  /** \internal */
+  template <typename RhsDerived, typename DestDerived>
+  void _solve_impl(const SparseMatrixBase<RhsDerived>& b, SparseMatrixBase<DestDerived>& dest) const {
+    eigen_assert(m_factorizationIsOk &&
+                 "The decomposition is not in a valid state for solving, you must first call either compute() or "
+                 "symbolic()/numeric()");
+    const Index size = m_cholmodFactor->n;
+    EIGEN_UNUSED_VARIABLE(size);
+    eigen_assert(size == b.rows());
+
+    // note: cs stands for Cholmod Sparse
+    Ref<SparseMatrix<typename RhsDerived::Scalar, ColMajor, typename RhsDerived::StorageIndex> > b_ref(
+        b.const_cast_derived());
+    cholmod_sparse b_cs = viewAsCholmod(b_ref);
+    cholmod_sparse* x_cs = internal::cm_spsolve<StorageIndex>(CHOLMOD_A, *m_cholmodFactor, b_cs, m_cholmod);
+    if (!x_cs) {
+      this->m_info = NumericalIssue;
+      return;
     }
+    // TODO optimize this copy by swapping when possible (be careful with alignment, etc.)
+    // NOTE cholmod_spsolve in fact just calls the dense solver for blocks of 4 columns at a time (similar to Eigen's
+    // sparse solver)
+    dest.derived() = viewAsEigen<typename DestDerived::Scalar, ColMajor, typename DestDerived::StorageIndex>(*x_cs);
+    internal::cm_free_sparse<StorageIndex>(x_cs, m_cholmod);
+  }
+#endif  // EIGEN_PARSED_BY_DOXYGEN
 
-    inline StorageIndex cols() const { return internal::convert_index<StorageIndex, Index>(m_cholmodFactor->n); }
-    inline StorageIndex rows() const { return internal::convert_index<StorageIndex, Index>(m_cholmodFactor->n); }
+  /** Sets the shift parameter that will be used to adjust the diagonal coefficients during the numerical factorization.
+   *
+   * During the numerical factorization, an offset term is added to the diagonal coefficients:\n
+   * \c d_ii = \a offset + \c d_ii
+   *
+   * The default is \a offset=0.
+   *
+   * \returns a reference to \c *this.
+   */
+  Derived& setShift(const RealScalar& offset) {
+    m_shiftOffset[0] = double(offset);
+    return derived();
+  }
 
-    /** \brief Reports whether previous computation was successful.
-      *
-      * \returns \c Success if computation was successful,
-      *          \c NumericalIssue if the matrix.appears to be negative.
-      */
-    ComputationInfo info() const
-    {
-      eigen_assert(m_isInitialized && "Decomposition is not initialized.");
-      return m_info;
-    }
+  /** \returns the determinant of the underlying matrix from the current factorization */
+  Scalar determinant() const {
+    using std::exp;
+    return exp(logDeterminant());
+  }
 
-    /** Computes the sparse Cholesky decomposition of \a matrix */
-    Derived& compute(const MatrixType& matrix)
-    {
-      analyzePattern(matrix);
-      factorize(matrix);
-      return derived();
-    }
+  /** \returns the log determinant of the underlying matrix from the current factorization */
+  Scalar logDeterminant() const {
+    using numext::real;
+    using std::log;
+    eigen_assert(m_factorizationIsOk &&
+                 "The decomposition is not in a valid state for solving, you must first call either compute() or "
+                 "symbolic()/numeric()");
 
-    /** Performs a symbolic decomposition on the sparsity pattern of \a matrix.
-      *
-      * This function is particularly useful when solving for several problems having the same structure.
-      *
-      * \sa factorize()
-      */
-    void analyzePattern(const MatrixType& matrix)
-    {
-      if(m_cholmodFactor)
-      {
-        internal::cm_free_factor<StorageIndex>(m_cholmodFactor, m_cholmod);
-        m_cholmodFactor = 0;
+    RealScalar logDet = 0;
+    Scalar* x = static_cast<Scalar*>(m_cholmodFactor->x);
+    if (m_cholmodFactor->is_super) {
+      // Supernodal factorization stored as a packed list of dense column-major blocs,
+      // as described by the following structure:
+
+      // super[k] == index of the first column of the j-th super node
+      StorageIndex* super = static_cast<StorageIndex*>(m_cholmodFactor->super);
+      // pi[k] == offset to the description of row indices
+      StorageIndex* pi = static_cast<StorageIndex*>(m_cholmodFactor->pi);
+      // px[k] == offset to the respective dense block
+      StorageIndex* px = static_cast<StorageIndex*>(m_cholmodFactor->px);
+
+      Index nb_super_nodes = m_cholmodFactor->nsuper;
+      for (Index k = 0; k < nb_super_nodes; ++k) {
+        StorageIndex ncols = super[k + 1] - super[k];
+        StorageIndex nrows = pi[k + 1] - pi[k];
+
+        Map<const Array<Scalar, 1, Dynamic>, 0, InnerStride<> > sk(x + px[k], ncols, InnerStride<>(nrows + 1));
+        logDet += sk.real().log().sum();
       }
-      cholmod_sparse A = viewAsCholmod(matrix.template selfadjointView<UpLo>());
-      m_cholmodFactor = internal::cm_analyze<StorageIndex>(A, m_cholmod);
-
-      this->m_isInitialized = true;
-      this->m_info = Success;
-      m_analysisIsOk = true;
-      m_factorizationIsOk = false;
+    } else {
+      // Simplicial factorization stored as standard CSC matrix.
+      StorageIndex* p = static_cast<StorageIndex*>(m_cholmodFactor->p);
+      Index size = m_cholmodFactor->n;
+      for (Index k = 0; k < size; ++k) logDet += log(real(x[p[k]]));
     }
+    if (m_cholmodFactor->is_ll) logDet *= 2.0;
+    return logDet;
+  }
 
-    /** Performs a numeric decomposition of \a matrix
-      *
-      * The given matrix must have the same sparsity pattern as the matrix on which the symbolic decomposition has been performed.
-      *
-      * \sa analyzePattern()
-      */
-    void factorize(const MatrixType& matrix)
-    {
-      eigen_assert(m_analysisIsOk && "You must first call analyzePattern()");
-      cholmod_sparse A = viewAsCholmod(matrix.template selfadjointView<UpLo>());
-      internal::cm_factorize_p<StorageIndex>(&A, m_shiftOffset, 0, 0, m_cholmodFactor, m_cholmod);
+  template <typename Stream>
+  void dumpMemory(Stream& /*s*/) {}
 
-      // If the factorization failed, minor is the column at which it did. On success minor == n.
-      this->m_info = (m_cholmodFactor->minor == m_cholmodFactor->n ? Success : NumericalIssue);
-      m_factorizationIsOk = true;
-    }
-
-    /** Returns a reference to the Cholmod's configuration structure to get a full control over the performed operations.
-     *  See the Cholmod user guide for details. */
-    cholmod_common& cholmod() { return m_cholmod; }
-
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    /** \internal */
-    template<typename Rhs,typename Dest>
-    void _solve_impl(const MatrixBase<Rhs> &b, MatrixBase<Dest> &dest) const
-    {
-      eigen_assert(m_factorizationIsOk && "The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()");
-      const Index size = m_cholmodFactor->n;
-      EIGEN_UNUSED_VARIABLE(size);
-      eigen_assert(size==b.rows());
-
-      // Cholmod needs column-major storage without inner-stride, which corresponds to the default behavior of Ref.
-      Ref<const Matrix<typename Rhs::Scalar,Dynamic,Dynamic,ColMajor> > b_ref(b.derived());
-
-      cholmod_dense b_cd = viewAsCholmod(b_ref);
-      cholmod_dense* x_cd = internal::cm_solve<StorageIndex>(CHOLMOD_A, *m_cholmodFactor, b_cd, m_cholmod);
-      if(!x_cd)
-      {
-        this->m_info = NumericalIssue;
-        return;
-      }
-      // TODO optimize this copy by swapping when possible (be careful with alignment, etc.)
-      // NOTE Actually, the copy can be avoided by calling cholmod_solve2 instead of cholmod_solve
-      dest = Matrix<Scalar,Dest::RowsAtCompileTime,Dest::ColsAtCompileTime>::Map(reinterpret_cast<Scalar*>(x_cd->x),b.rows(),b.cols());
-      internal::cm_free_dense<StorageIndex>(x_cd, m_cholmod);
-    }
-
-    /** \internal */
-    template<typename RhsDerived, typename DestDerived>
-    void _solve_impl(const SparseMatrixBase<RhsDerived> &b, SparseMatrixBase<DestDerived> &dest) const
-    {
-      eigen_assert(m_factorizationIsOk && "The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()");
-      const Index size = m_cholmodFactor->n;
-      EIGEN_UNUSED_VARIABLE(size);
-      eigen_assert(size==b.rows());
-
-      // note: cs stands for Cholmod Sparse
-      Ref<SparseMatrix<typename RhsDerived::Scalar,ColMajor,typename RhsDerived::StorageIndex> > b_ref(b.const_cast_derived());
-      cholmod_sparse b_cs = viewAsCholmod(b_ref);
-      cholmod_sparse* x_cs = internal::cm_spsolve<StorageIndex>(CHOLMOD_A, *m_cholmodFactor, b_cs, m_cholmod);
-      if(!x_cs)
-      {
-        this->m_info = NumericalIssue;
-        return;
-      }
-      // TODO optimize this copy by swapping when possible (be careful with alignment, etc.)
-      // NOTE cholmod_spsolve in fact just calls the dense solver for blocks of 4 columns at a time (similar to Eigen's sparse solver)
-      dest.derived() = viewAsEigen<typename DestDerived::Scalar,ColMajor,typename DestDerived::StorageIndex>(*x_cs);
-      internal::cm_free_sparse<StorageIndex>(x_cs, m_cholmod);
-    }
-    #endif // EIGEN_PARSED_BY_DOXYGEN
-
-
-    /** Sets the shift parameter that will be used to adjust the diagonal coefficients during the numerical factorization.
-      *
-      * During the numerical factorization, an offset term is added to the diagonal coefficients:\n
-      * \c d_ii = \a offset + \c d_ii
-      *
-      * The default is \a offset=0.
-      *
-      * \returns a reference to \c *this.
-      */
-    Derived& setShift(const RealScalar& offset)
-    {
-      m_shiftOffset[0] = double(offset);
-      return derived();
-    }
-
-    /** \returns the determinant of the underlying matrix from the current factorization */
-    Scalar determinant() const
-    {
-      using std::exp;
-      return exp(logDeterminant());
-    }
-
-    /** \returns the log determinant of the underlying matrix from the current factorization */
-    Scalar logDeterminant() const
-    {
-      using std::log;
-      using numext::real;
-      eigen_assert(m_factorizationIsOk && "The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()");
-
-      RealScalar logDet = 0;
-      Scalar *x = static_cast<Scalar*>(m_cholmodFactor->x);
-      if (m_cholmodFactor->is_super)
-      {
-        // Supernodal factorization stored as a packed list of dense column-major blocs,
-        // as described by the following structure:
-
-        // super[k] == index of the first column of the j-th super node
-        StorageIndex *super = static_cast<StorageIndex*>(m_cholmodFactor->super);
-        // pi[k] == offset to the description of row indices
-        StorageIndex *pi = static_cast<StorageIndex*>(m_cholmodFactor->pi);
-        // px[k] == offset to the respective dense block
-        StorageIndex *px = static_cast<StorageIndex*>(m_cholmodFactor->px);
-
-        Index nb_super_nodes = m_cholmodFactor->nsuper;
-        for (Index k=0; k < nb_super_nodes; ++k)
-        {
-          StorageIndex ncols = super[k + 1] - super[k];
-          StorageIndex nrows = pi[k + 1] - pi[k];
-
-          Map<const Array<Scalar,1,Dynamic>, 0, InnerStride<> > sk(x + px[k], ncols, InnerStride<>(nrows+1));
-          logDet += sk.real().log().sum();
-        }
-      }
-      else
-      {
-        // Simplicial factorization stored as standard CSC matrix.
-        StorageIndex *p = static_cast<StorageIndex*>(m_cholmodFactor->p);
-        Index size = m_cholmodFactor->n;
-        for (Index k=0; k<size; ++k)
-          logDet += log(real( x[p[k]] ));
-      }
-      if (m_cholmodFactor->is_ll)
-        logDet *= 2.0;
-      return logDet;
-    }
-
-    template<typename Stream>
-    void dumpMemory(Stream& /*s*/)
-    {}
-
-  protected:
-    mutable cholmod_common m_cholmod;
-    cholmod_factor* m_cholmodFactor;
-    double m_shiftOffset[2];
-    mutable ComputationInfo m_info;
-    int m_factorizationIsOk;
-    int m_analysisIsOk;
+ protected:
+  mutable cholmod_common m_cholmod;
+  cholmod_factor* m_cholmodFactor;
+  double m_shiftOffset[2];
+  mutable ComputationInfo m_info;
+  int m_factorizationIsOk;
+  int m_analysisIsOk;
 };
 
 /** \ingroup CholmodSupport_Module
-  * \class CholmodSimplicialLLT
-  * \brief A simplicial direct Cholesky (LLT) factorization and solver based on Cholmod
-  *
-  * This class allows to solve for A.X = B sparse linear problems via a simplicial LL^T Cholesky factorization
-  * using the Cholmod library.
-  * This simplicial variant is equivalent to Eigen's built-in SimplicialLLT class. Therefore, it has little practical interest.
-  * The sparse matrix A must be selfadjoint and positive definite. The vectors or matrices
-  * X and B can be either dense or sparse.
-  *
-  * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
-  * \tparam UpLo_ the triangular part that will be used for the computations. It can be Lower
-  *               or Upper. Default is Lower.
-  *
-  * \implsparsesolverconcept
-  *
-  * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non compressed.
-  *
-  * \warning Only double precision real and complex scalar types are supported by Cholmod.
-  *
-  * \sa \ref TutorialSparseSolverConcept, class CholmodSupernodalLLT, class SimplicialLLT
-  */
-template<typename MatrixType_, int UpLo_ = Lower>
-class CholmodSimplicialLLT : public CholmodBase<MatrixType_, UpLo_, CholmodSimplicialLLT<MatrixType_, UpLo_> >
-{
-    typedef CholmodBase<MatrixType_, UpLo_, CholmodSimplicialLLT> Base;
-    using Base::m_cholmod;
+ * \class CholmodSimplicialLLT
+ * \brief A simplicial direct Cholesky (LLT) factorization and solver based on Cholmod
+ *
+ * This class allows to solve for A.X = B sparse linear problems via a simplicial LL^T Cholesky factorization
+ * using the Cholmod library.
+ * This simplicial variant is equivalent to Eigen's built-in SimplicialLLT class. Therefore, it has little practical
+ * interest. The sparse matrix A must be selfadjoint and positive definite. The vectors or matrices X and B can be
+ * either dense or sparse.
+ *
+ * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
+ * \tparam UpLo_ the triangular part that will be used for the computations. It can be Lower
+ *               or Upper. Default is Lower.
+ *
+ * \implsparsesolverconcept
+ *
+ * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non
+ * compressed.
+ *
+ * \warning Only double precision real and complex scalar types are supported by Cholmod.
+ *
+ * \sa \ref TutorialSparseSolverConcept, class CholmodSupernodalLLT, class SimplicialLLT
+ */
+template <typename MatrixType_, int UpLo_ = Lower>
+class CholmodSimplicialLLT : public CholmodBase<MatrixType_, UpLo_, CholmodSimplicialLLT<MatrixType_, UpLo_> > {
+  typedef CholmodBase<MatrixType_, UpLo_, CholmodSimplicialLLT> Base;
+  using Base::m_cholmod;
 
-  public:
+ public:
+  typedef MatrixType_ MatrixType;
 
-    typedef MatrixType_ MatrixType;
+  CholmodSimplicialLLT() : Base() { init(); }
 
-    CholmodSimplicialLLT() : Base() { init(); }
+  CholmodSimplicialLLT(const MatrixType& matrix) : Base() {
+    init();
+    this->compute(matrix);
+  }
 
-    CholmodSimplicialLLT(const MatrixType& matrix) : Base()
-    {
-      init();
-      this->compute(matrix);
-    }
+  ~CholmodSimplicialLLT() {}
 
-    ~CholmodSimplicialLLT() {}
-  protected:
-    void init()
-    {
-      m_cholmod.final_asis = 0;
-      m_cholmod.supernodal = CHOLMOD_SIMPLICIAL;
-      m_cholmod.final_ll = 1;
-    }
-};
-
-
-/** \ingroup CholmodSupport_Module
-  * \class CholmodSimplicialLDLT
-  * \brief A simplicial direct Cholesky (LDLT) factorization and solver based on Cholmod
-  *
-  * This class allows to solve for A.X = B sparse linear problems via a simplicial LDL^T Cholesky factorization
-  * using the Cholmod library.
-  * This simplicial variant is equivalent to Eigen's built-in SimplicialLDLT class. Therefore, it has little practical interest.
-  * The sparse matrix A must be selfadjoint and positive definite. The vectors or matrices
-  * X and B can be either dense or sparse.
-  *
-  * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
-  * \tparam UpLo_ the triangular part that will be used for the computations. It can be Lower
-  *               or Upper. Default is Lower.
-  *
-  * \implsparsesolverconcept
-  *
-  * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non compressed.
-  *
-  * \warning Only double precision real and complex scalar types are supported by Cholmod.
-  *
-  * \sa \ref TutorialSparseSolverConcept, class CholmodSupernodalLLT, class SimplicialLDLT
-  */
-template<typename MatrixType_, int UpLo_ = Lower>
-class CholmodSimplicialLDLT : public CholmodBase<MatrixType_, UpLo_, CholmodSimplicialLDLT<MatrixType_, UpLo_> >
-{
-    typedef CholmodBase<MatrixType_, UpLo_, CholmodSimplicialLDLT> Base;
-    using Base::m_cholmod;
-
-  public:
-
-    typedef MatrixType_ MatrixType;
-
-    CholmodSimplicialLDLT() : Base() { init(); }
-
-    CholmodSimplicialLDLT(const MatrixType& matrix) : Base()
-    {
-      init();
-      this->compute(matrix);
-    }
-
-    ~CholmodSimplicialLDLT() {}
-  protected:
-    void init()
-    {
-      m_cholmod.final_asis = 1;
-      m_cholmod.supernodal = CHOLMOD_SIMPLICIAL;
-    }
+ protected:
+  void init() {
+    m_cholmod.final_asis = 0;
+    m_cholmod.supernodal = CHOLMOD_SIMPLICIAL;
+    m_cholmod.final_ll = 1;
+  }
 };
 
 /** \ingroup CholmodSupport_Module
-  * \class CholmodSupernodalLLT
-  * \brief A supernodal Cholesky (LLT) factorization and solver based on Cholmod
-  *
-  * This class allows to solve for A.X = B sparse linear problems via a supernodal LL^T Cholesky factorization
-  * using the Cholmod library.
-  * This supernodal variant performs best on dense enough problems, e.g., 3D FEM, or very high order 2D FEM.
-  * The sparse matrix A must be selfadjoint and positive definite. The vectors or matrices
-  * X and B can be either dense or sparse.
-  *
-  * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
-  * \tparam UpLo_ the triangular part that will be used for the computations. It can be Lower
-  *               or Upper. Default is Lower.
-  *
-  * \implsparsesolverconcept
-  *
-  * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non compressed.
-  *
-  * \warning Only double precision real and complex scalar types are supported by Cholmod.
-  *
-  * \sa \ref TutorialSparseSolverConcept
-  */
-template<typename MatrixType_, int UpLo_ = Lower>
-class CholmodSupernodalLLT : public CholmodBase<MatrixType_, UpLo_, CholmodSupernodalLLT<MatrixType_, UpLo_> >
-{
-    typedef CholmodBase<MatrixType_, UpLo_, CholmodSupernodalLLT> Base;
-    using Base::m_cholmod;
+ * \class CholmodSimplicialLDLT
+ * \brief A simplicial direct Cholesky (LDLT) factorization and solver based on Cholmod
+ *
+ * This class allows to solve for A.X = B sparse linear problems via a simplicial LDL^T Cholesky factorization
+ * using the Cholmod library.
+ * This simplicial variant is equivalent to Eigen's built-in SimplicialLDLT class. Therefore, it has little practical
+ * interest. The sparse matrix A must be selfadjoint and positive definite. The vectors or matrices X and B can be
+ * either dense or sparse.
+ *
+ * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
+ * \tparam UpLo_ the triangular part that will be used for the computations. It can be Lower
+ *               or Upper. Default is Lower.
+ *
+ * \implsparsesolverconcept
+ *
+ * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non
+ * compressed.
+ *
+ * \warning Only double precision real and complex scalar types are supported by Cholmod.
+ *
+ * \sa \ref TutorialSparseSolverConcept, class CholmodSupernodalLLT, class SimplicialLDLT
+ */
+template <typename MatrixType_, int UpLo_ = Lower>
+class CholmodSimplicialLDLT : public CholmodBase<MatrixType_, UpLo_, CholmodSimplicialLDLT<MatrixType_, UpLo_> > {
+  typedef CholmodBase<MatrixType_, UpLo_, CholmodSimplicialLDLT> Base;
+  using Base::m_cholmod;
 
-  public:
+ public:
+  typedef MatrixType_ MatrixType;
 
-    typedef MatrixType_ MatrixType;
+  CholmodSimplicialLDLT() : Base() { init(); }
 
-    CholmodSupernodalLLT() : Base() { init(); }
+  CholmodSimplicialLDLT(const MatrixType& matrix) : Base() {
+    init();
+    this->compute(matrix);
+  }
 
-    CholmodSupernodalLLT(const MatrixType& matrix) : Base()
-    {
-      init();
-      this->compute(matrix);
-    }
+  ~CholmodSimplicialLDLT() {}
 
-    ~CholmodSupernodalLLT() {}
-  protected:
-    void init()
-    {
-      m_cholmod.final_asis = 1;
-      m_cholmod.supernodal = CHOLMOD_SUPERNODAL;
-    }
+ protected:
+  void init() {
+    m_cholmod.final_asis = 1;
+    m_cholmod.supernodal = CHOLMOD_SIMPLICIAL;
+  }
 };
 
 /** \ingroup CholmodSupport_Module
-  * \class CholmodDecomposition
-  * \brief A general Cholesky factorization and solver based on Cholmod
-  *
-  * This class allows to solve for A.X = B sparse linear problems via a LL^T or LDL^T Cholesky factorization
-  * using the Cholmod library. The sparse matrix A must be selfadjoint and positive definite. The vectors or matrices
-  * X and B can be either dense or sparse.
-  *
-  * This variant permits to change the underlying Cholesky method at runtime.
-  * On the other hand, it does not provide access to the result of the factorization.
-  * The default is to let Cholmod automatically choose between a simplicial and supernodal factorization.
-  *
-  * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
-  * \tparam UpLo_ the triangular part that will be used for the computations. It can be Lower
-  *               or Upper. Default is Lower.
-  *
-  * \implsparsesolverconcept
-  *
-  * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non compressed.
-  *
-  * \warning Only double precision real and complex scalar types are supported by Cholmod.
-  *
-  * \sa \ref TutorialSparseSolverConcept
-  */
-template<typename MatrixType_, int UpLo_ = Lower>
-class CholmodDecomposition : public CholmodBase<MatrixType_, UpLo_, CholmodDecomposition<MatrixType_, UpLo_> >
-{
-    typedef CholmodBase<MatrixType_, UpLo_, CholmodDecomposition> Base;
-    using Base::m_cholmod;
+ * \class CholmodSupernodalLLT
+ * \brief A supernodal Cholesky (LLT) factorization and solver based on Cholmod
+ *
+ * This class allows to solve for A.X = B sparse linear problems via a supernodal LL^T Cholesky factorization
+ * using the Cholmod library.
+ * This supernodal variant performs best on dense enough problems, e.g., 3D FEM, or very high order 2D FEM.
+ * The sparse matrix A must be selfadjoint and positive definite. The vectors or matrices
+ * X and B can be either dense or sparse.
+ *
+ * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
+ * \tparam UpLo_ the triangular part that will be used for the computations. It can be Lower
+ *               or Upper. Default is Lower.
+ *
+ * \implsparsesolverconcept
+ *
+ * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non
+ * compressed.
+ *
+ * \warning Only double precision real and complex scalar types are supported by Cholmod.
+ *
+ * \sa \ref TutorialSparseSolverConcept
+ */
+template <typename MatrixType_, int UpLo_ = Lower>
+class CholmodSupernodalLLT : public CholmodBase<MatrixType_, UpLo_, CholmodSupernodalLLT<MatrixType_, UpLo_> > {
+  typedef CholmodBase<MatrixType_, UpLo_, CholmodSupernodalLLT> Base;
+  using Base::m_cholmod;
 
-  public:
+ public:
+  typedef MatrixType_ MatrixType;
 
-    typedef MatrixType_ MatrixType;
+  CholmodSupernodalLLT() : Base() { init(); }
 
-    CholmodDecomposition() : Base() { init(); }
+  CholmodSupernodalLLT(const MatrixType& matrix) : Base() {
+    init();
+    this->compute(matrix);
+  }
 
-    CholmodDecomposition(const MatrixType& matrix) : Base()
-    {
-      init();
-      this->compute(matrix);
-    }
+  ~CholmodSupernodalLLT() {}
 
-    ~CholmodDecomposition() {}
-
-    void setMode(CholmodMode mode)
-    {
-      switch(mode)
-      {
-        case CholmodAuto:
-          m_cholmod.final_asis = 1;
-          m_cholmod.supernodal = CHOLMOD_AUTO;
-          break;
-        case CholmodSimplicialLLt:
-          m_cholmod.final_asis = 0;
-          m_cholmod.supernodal = CHOLMOD_SIMPLICIAL;
-          m_cholmod.final_ll = 1;
-          break;
-        case CholmodSupernodalLLt:
-          m_cholmod.final_asis = 1;
-          m_cholmod.supernodal = CHOLMOD_SUPERNODAL;
-          break;
-        case CholmodLDLt:
-          m_cholmod.final_asis = 1;
-          m_cholmod.supernodal = CHOLMOD_SIMPLICIAL;
-          break;
-        default:
-          break;
-      }
-    }
-  protected:
-    void init()
-    {
-      m_cholmod.final_asis = 1;
-      m_cholmod.supernodal = CHOLMOD_AUTO;
-    }
+ protected:
+  void init() {
+    m_cholmod.final_asis = 1;
+    m_cholmod.supernodal = CHOLMOD_SUPERNODAL;
+  }
 };
 
-} // end namespace Eigen
+/** \ingroup CholmodSupport_Module
+ * \class CholmodDecomposition
+ * \brief A general Cholesky factorization and solver based on Cholmod
+ *
+ * This class allows to solve for A.X = B sparse linear problems via a LL^T or LDL^T Cholesky factorization
+ * using the Cholmod library. The sparse matrix A must be selfadjoint and positive definite. The vectors or matrices
+ * X and B can be either dense or sparse.
+ *
+ * This variant permits to change the underlying Cholesky method at runtime.
+ * On the other hand, it does not provide access to the result of the factorization.
+ * The default is to let Cholmod automatically choose between a simplicial and supernodal factorization.
+ *
+ * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
+ * \tparam UpLo_ the triangular part that will be used for the computations. It can be Lower
+ *               or Upper. Default is Lower.
+ *
+ * \implsparsesolverconcept
+ *
+ * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non
+ * compressed.
+ *
+ * \warning Only double precision real and complex scalar types are supported by Cholmod.
+ *
+ * \sa \ref TutorialSparseSolverConcept
+ */
+template <typename MatrixType_, int UpLo_ = Lower>
+class CholmodDecomposition : public CholmodBase<MatrixType_, UpLo_, CholmodDecomposition<MatrixType_, UpLo_> > {
+  typedef CholmodBase<MatrixType_, UpLo_, CholmodDecomposition> Base;
+  using Base::m_cholmod;
 
-#endif // EIGEN_CHOLMODSUPPORT_H
+ public:
+  typedef MatrixType_ MatrixType;
+
+  CholmodDecomposition() : Base() { init(); }
+
+  CholmodDecomposition(const MatrixType& matrix) : Base() {
+    init();
+    this->compute(matrix);
+  }
+
+  ~CholmodDecomposition() {}
+
+  void setMode(CholmodMode mode) {
+    switch (mode) {
+      case CholmodAuto:
+        m_cholmod.final_asis = 1;
+        m_cholmod.supernodal = CHOLMOD_AUTO;
+        break;
+      case CholmodSimplicialLLt:
+        m_cholmod.final_asis = 0;
+        m_cholmod.supernodal = CHOLMOD_SIMPLICIAL;
+        m_cholmod.final_ll = 1;
+        break;
+      case CholmodSupernodalLLt:
+        m_cholmod.final_asis = 1;
+        m_cholmod.supernodal = CHOLMOD_SUPERNODAL;
+        break;
+      case CholmodLDLt:
+        m_cholmod.final_asis = 1;
+        m_cholmod.supernodal = CHOLMOD_SIMPLICIAL;
+        break;
+      default:
+        break;
+    }
+  }
+
+ protected:
+  void init() {
+    m_cholmod.final_asis = 1;
+    m_cholmod.supernodal = CHOLMOD_AUTO;
+  }
+};
+
+}  // end namespace Eigen
+
+#endif  // EIGEN_CHOLMODSUPPORT_H
diff --git a/Eigen/src/Core/ArithmeticSequence.h b/Eigen/src/Core/ArithmeticSequence.h
index 34689c6..0f45e89 100644
--- a/Eigen/src/Core/ArithmeticSequence.h
+++ b/Eigen/src/Core/ArithmeticSequence.h
@@ -18,8 +18,9 @@
 namespace internal {
 
 // Helper to cleanup the type of the increment:
-template<typename T> struct cleanup_seq_incr {
-  typedef typename cleanup_index_type<T,DynamicIndex>::type type;
+template <typename T>
+struct cleanup_seq_incr {
+  typedef typename cleanup_index_type<T, DynamicIndex>::type type;
 };
 
 }  // namespace internal
@@ -28,170 +29,174 @@
 // seq(first,last,incr) and seqN(first,size,incr)
 //--------------------------------------------------------------------------------
 
-template<typename FirstType=Index,typename SizeType=Index,typename IncrType=internal::FixedInt<1> >
+template <typename FirstType = Index, typename SizeType = Index, typename IncrType = internal::FixedInt<1> >
 class ArithmeticSequence;
 
-template<typename FirstType,typename SizeType,typename IncrType>
+template <typename FirstType, typename SizeType, typename IncrType>
 ArithmeticSequence<typename internal::cleanup_index_type<FirstType>::type,
                    typename internal::cleanup_index_type<SizeType>::type,
-                   typename internal::cleanup_seq_incr<IncrType>::type >
+                   typename internal::cleanup_seq_incr<IncrType>::type>
 seqN(FirstType first, SizeType size, IncrType incr);
 
 /** \class ArithmeticSequence
-  * \ingroup Core_Module
-  *
-  * This class represents an arithmetic progression \f$ a_0, a_1, a_2, ..., a_{n-1}\f$ defined by
-  * its \em first value \f$ a_0 \f$, its \em size (aka length) \em n, and the \em increment (aka stride)
-  * that is equal to \f$ a_{i+1}-a_{i}\f$ for any \em i.
-  *
-  * It is internally used as the return type of the Eigen::seq and Eigen::seqN functions, and as the input arguments
-  * of DenseBase::operator()(const RowIndices&, const ColIndices&), and most of the time this is the
-  * only way it is used.
-  *
-  * \tparam FirstType type of the first element, usually an Index,
-  *                   but internally it can be a symbolic expression
-  * \tparam SizeType type representing the size of the sequence, usually an Index
-  *                  or a compile time integral constant. Internally, it can also be a symbolic expression
-  * \tparam IncrType type of the increment, can be a runtime Index, or a compile time integral constant (default is compile-time 1)
-  *
-  * \sa Eigen::seq, Eigen::seqN, DenseBase::operator()(const RowIndices&, const ColIndices&), class IndexedView
-  */
-template<typename FirstType,typename SizeType,typename IncrType>
-class ArithmeticSequence
-{
-public:
+ * \ingroup Core_Module
+ *
+ * This class represents an arithmetic progression \f$ a_0, a_1, a_2, ..., a_{n-1}\f$ defined by
+ * its \em first value \f$ a_0 \f$, its \em size (aka length) \em n, and the \em increment (aka stride)
+ * that is equal to \f$ a_{i+1}-a_{i}\f$ for any \em i.
+ *
+ * It is internally used as the return type of the Eigen::seq and Eigen::seqN functions, and as the input arguments
+ * of DenseBase::operator()(const RowIndices&, const ColIndices&), and most of the time this is the
+ * only way it is used.
+ *
+ * \tparam FirstType type of the first element, usually an Index,
+ *                   but internally it can be a symbolic expression
+ * \tparam SizeType type representing the size of the sequence, usually an Index
+ *                  or a compile time integral constant. Internally, it can also be a symbolic expression
+ * \tparam IncrType type of the increment, can be a runtime Index, or a compile time integral constant (default is
+ * compile-time 1)
+ *
+ * \sa Eigen::seq, Eigen::seqN, DenseBase::operator()(const RowIndices&, const ColIndices&), class IndexedView
+ */
+template <typename FirstType, typename SizeType, typename IncrType>
+class ArithmeticSequence {
+ public:
   ArithmeticSequence(FirstType first, SizeType size) : m_first(first), m_size(size) {}
   ArithmeticSequence(FirstType first, SizeType size, IncrType incr) : m_first(first), m_size(size), m_incr(incr) {}
 
   enum {
     SizeAtCompileTime = internal::get_fixed_value<SizeType>::value,
-    IncrAtCompileTime = internal::get_fixed_value<IncrType,DynamicIndex>::value
+    IncrAtCompileTime = internal::get_fixed_value<IncrType, DynamicIndex>::value
   };
 
   /** \returns the size, i.e., number of elements, of the sequence */
-  Index size()  const { return m_size; }
+  Index size() const { return m_size; }
 
   /** \returns the first element \f$ a_0 \f$ in the sequence */
-  Index first()  const { return m_first; }
+  Index first() const { return m_first; }
 
   /** \returns the value \f$ a_i \f$ at index \a i in the sequence. */
   Index operator[](Index i) const { return m_first + i * m_incr; }
 
   const FirstType& firstObject() const { return m_first; }
-  const SizeType&  sizeObject()  const { return m_size; }
-  const IncrType&  incrObject()  const { return m_incr; }
+  const SizeType& sizeObject() const { return m_size; }
+  const IncrType& incrObject() const { return m_incr; }
 
-protected:
+ protected:
   FirstType m_first;
-  SizeType  m_size;
-  IncrType  m_incr;
+  SizeType m_size;
+  IncrType m_incr;
 
-public:
-  auto reverse() const -> decltype(Eigen::seqN(m_first+(m_size+fix<-1>())*m_incr,m_size,-m_incr)) {
-    return seqN(m_first+(m_size+fix<-1>())*m_incr,m_size,-m_incr);
+ public:
+  auto reverse() const -> decltype(Eigen::seqN(m_first + (m_size + fix<-1>()) * m_incr, m_size, -m_incr)) {
+    return seqN(m_first + (m_size + fix<-1>()) * m_incr, m_size, -m_incr);
   }
 };
 
 /** \returns an ArithmeticSequence starting at \a first, of length \a size, and increment \a incr
-  *
-  * \sa seqN(FirstType,SizeType), seq(FirstType,LastType,IncrType) */
-template<typename FirstType,typename SizeType,typename IncrType>
-ArithmeticSequence<typename internal::cleanup_index_type<FirstType>::type,typename internal::cleanup_index_type<SizeType>::type,typename internal::cleanup_seq_incr<IncrType>::type >
-seqN(FirstType first, SizeType size, IncrType incr)  {
-  return ArithmeticSequence<typename internal::cleanup_index_type<FirstType>::type,typename internal::cleanup_index_type<SizeType>::type,typename internal::cleanup_seq_incr<IncrType>::type>(first,size,incr);
+ *
+ * \sa seqN(FirstType,SizeType), seq(FirstType,LastType,IncrType) */
+template <typename FirstType, typename SizeType, typename IncrType>
+ArithmeticSequence<typename internal::cleanup_index_type<FirstType>::type,
+                   typename internal::cleanup_index_type<SizeType>::type,
+                   typename internal::cleanup_seq_incr<IncrType>::type>
+seqN(FirstType first, SizeType size, IncrType incr) {
+  return ArithmeticSequence<typename internal::cleanup_index_type<FirstType>::type,
+                            typename internal::cleanup_index_type<SizeType>::type,
+                            typename internal::cleanup_seq_incr<IncrType>::type>(first, size, incr);
 }
 
 /** \returns an ArithmeticSequence starting at \a first, of length \a size, and unit increment
-  *
-  * \sa seqN(FirstType,SizeType,IncrType), seq(FirstType,LastType) */
-template<typename FirstType,typename SizeType>
-ArithmeticSequence<typename internal::cleanup_index_type<FirstType>::type,typename internal::cleanup_index_type<SizeType>::type >
-seqN(FirstType first, SizeType size)  {
-  return ArithmeticSequence<typename internal::cleanup_index_type<FirstType>::type,typename internal::cleanup_index_type<SizeType>::type>(first,size);
+ *
+ * \sa seqN(FirstType,SizeType,IncrType), seq(FirstType,LastType) */
+template <typename FirstType, typename SizeType>
+ArithmeticSequence<typename internal::cleanup_index_type<FirstType>::type,
+                   typename internal::cleanup_index_type<SizeType>::type>
+seqN(FirstType first, SizeType size) {
+  return ArithmeticSequence<typename internal::cleanup_index_type<FirstType>::type,
+                            typename internal::cleanup_index_type<SizeType>::type>(first, size);
 }
 
 #ifdef EIGEN_PARSED_BY_DOXYGEN
 
-/** \returns an ArithmeticSequence starting at \a f, up (or down) to \a l, and with positive (or negative) increment \a incr
-  *
-  * It is essentially an alias to:
-  * \code
-  * seqN(f, (l-f+incr)/incr, incr);
-  * \endcode
-  *
-  * \sa seqN(FirstType,SizeType,IncrType), seq(FirstType,LastType)
-  */
-template<typename FirstType,typename LastType, typename IncrType>
+/** \returns an ArithmeticSequence starting at \a f, up (or down) to \a l, and with positive (or negative) increment \a
+ * incr
+ *
+ * It is essentially an alias to:
+ * \code
+ * seqN(f, (l-f+incr)/incr, incr);
+ * \endcode
+ *
+ * \sa seqN(FirstType,SizeType,IncrType), seq(FirstType,LastType)
+ */
+template <typename FirstType, typename LastType, typename IncrType>
 auto seq(FirstType f, LastType l, IncrType incr);
 
 /** \returns an ArithmeticSequence starting at \a f, up (or down) to \a l, and unit increment
-  *
-  * It is essentially an alias to:
-  * \code
-  * seqN(f,l-f+1);
-  * \endcode
-  *
-  * \sa seqN(FirstType,SizeType), seq(FirstType,LastType,IncrType)
-  */
-template<typename FirstType,typename LastType>
+ *
+ * It is essentially an alias to:
+ * \code
+ * seqN(f,l-f+1);
+ * \endcode
+ *
+ * \sa seqN(FirstType,SizeType), seq(FirstType,LastType,IncrType)
+ */
+template <typename FirstType, typename LastType>
 auto seq(FirstType f, LastType l);
 
-#else // EIGEN_PARSED_BY_DOXYGEN
+#else  // EIGEN_PARSED_BY_DOXYGEN
 
-template<typename FirstType,typename LastType>
-auto seq(FirstType f, LastType l) -> decltype(seqN(typename internal::cleanup_index_type<FirstType>::type(f),
-                                                   (  typename internal::cleanup_index_type<LastType>::type(l)
-                                                    - typename internal::cleanup_index_type<FirstType>::type(f)+fix<1>())))
-{
+template <typename FirstType, typename LastType>
+auto seq(FirstType f, LastType l)
+    -> decltype(seqN(typename internal::cleanup_index_type<FirstType>::type(f),
+                     (typename internal::cleanup_index_type<LastType>::type(l) -
+                      typename internal::cleanup_index_type<FirstType>::type(f) + fix<1>()))) {
   return seqN(typename internal::cleanup_index_type<FirstType>::type(f),
-              (typename internal::cleanup_index_type<LastType>::type(l)
-               -typename internal::cleanup_index_type<FirstType>::type(f)+fix<1>()));
+              (typename internal::cleanup_index_type<LastType>::type(l) -
+               typename internal::cleanup_index_type<FirstType>::type(f) + fix<1>()));
 }
 
-template<typename FirstType,typename LastType, typename IncrType>
+template <typename FirstType, typename LastType, typename IncrType>
 auto seq(FirstType f, LastType l, IncrType incr)
-  -> decltype(seqN(typename internal::cleanup_index_type<FirstType>::type(f),
-                   (   typename internal::cleanup_index_type<LastType>::type(l)
-                     - typename internal::cleanup_index_type<FirstType>::type(f)+typename internal::cleanup_seq_incr<IncrType>::type(incr)
-                   ) / typename internal::cleanup_seq_incr<IncrType>::type(incr),
-                   typename internal::cleanup_seq_incr<IncrType>::type(incr)))
-{
+    -> decltype(seqN(typename internal::cleanup_index_type<FirstType>::type(f),
+                     (typename internal::cleanup_index_type<LastType>::type(l) -
+                      typename internal::cleanup_index_type<FirstType>::type(f) +
+                      typename internal::cleanup_seq_incr<IncrType>::type(incr)) /
+                         typename internal::cleanup_seq_incr<IncrType>::type(incr),
+                     typename internal::cleanup_seq_incr<IncrType>::type(incr))) {
   typedef typename internal::cleanup_seq_incr<IncrType>::type CleanedIncrType;
   return seqN(typename internal::cleanup_index_type<FirstType>::type(f),
-              ( typename internal::cleanup_index_type<LastType>::type(l)
-               -typename internal::cleanup_index_type<FirstType>::type(f)+CleanedIncrType(incr)) / CleanedIncrType(incr),
+              (typename internal::cleanup_index_type<LastType>::type(l) -
+               typename internal::cleanup_index_type<FirstType>::type(f) + CleanedIncrType(incr)) /
+                  CleanedIncrType(incr),
               CleanedIncrType(incr));
 }
 
-
-#endif // EIGEN_PARSED_BY_DOXYGEN
+#endif  // EIGEN_PARSED_BY_DOXYGEN
 
 namespace placeholders {
 
 /** \cpp11
-  * \returns a symbolic ArithmeticSequence representing the last \a size elements with increment \a incr.
-  *
-  * It is a shortcut for: \code seqN(last-(size-fix<1>)*incr, size, incr) \endcode
-  * 
-  * \sa lastN(SizeType), seqN(FirstType,SizeType), seq(FirstType,LastType,IncrType) */
-template<typename SizeType,typename IncrType>
+ * \returns a symbolic ArithmeticSequence representing the last \a size elements with increment \a incr.
+ *
+ * It is a shortcut for: \code seqN(last-(size-fix<1>)*incr, size, incr) \endcode
+ *
+ * \sa lastN(SizeType), seqN(FirstType,SizeType), seq(FirstType,LastType,IncrType) */
+template <typename SizeType, typename IncrType>
 auto lastN(SizeType size, IncrType incr)
--> decltype(seqN(Eigen::placeholders::last-(size-fix<1>())*incr, size, incr))
-{
-  return seqN(Eigen::placeholders::last-(size-fix<1>())*incr, size, incr);
+    -> decltype(seqN(Eigen::placeholders::last - (size - fix<1>()) * incr, size, incr)) {
+  return seqN(Eigen::placeholders::last - (size - fix<1>()) * incr, size, incr);
 }
 
 /** \cpp11
-  * \returns a symbolic ArithmeticSequence representing the last \a size elements with a unit increment.
-  *
-  *  It is a shortcut for: \code seq(last+fix<1>-size, last) \endcode
-  * 
-  * \sa lastN(SizeType,IncrType, seqN(FirstType,SizeType), seq(FirstType,LastType) */
-template<typename SizeType>
-auto lastN(SizeType size)
--> decltype(seqN(Eigen::placeholders::last+fix<1>()-size, size))
-{
-  return seqN(Eigen::placeholders::last+fix<1>()-size, size);
+ * \returns a symbolic ArithmeticSequence representing the last \a size elements with a unit increment.
+ *
+ *  It is a shortcut for: \code seq(last+fix<1>-size, last) \endcode
+ *
+ * \sa lastN(SizeType,IncrType, seqN(FirstType,SizeType), seq(FirstType,LastType) */
+template <typename SizeType>
+auto lastN(SizeType size) -> decltype(seqN(Eigen::placeholders::last + fix<1>() - size, size)) {
+  return seqN(Eigen::placeholders::last + fix<1>() - size, size);
 }
 
 }  // namespace placeholders
@@ -199,33 +204,33 @@
 namespace internal {
 
 // Convert a symbolic span into a usable one (i.e., remove last/end "keywords")
-template<typename T>
+template <typename T>
 struct make_size_type {
   typedef std::conditional_t<symbolic::is_symbolic<T>::value, Index, T> type;
 };
 
-template<typename FirstType,typename SizeType,typename IncrType,int XprSize>
-struct IndexedViewCompatibleType<ArithmeticSequence<FirstType,SizeType,IncrType>, XprSize> {
-  typedef ArithmeticSequence<Index,typename make_size_type<SizeType>::type,IncrType> type;
+template <typename FirstType, typename SizeType, typename IncrType, int XprSize>
+struct IndexedViewCompatibleType<ArithmeticSequence<FirstType, SizeType, IncrType>, XprSize> {
+  typedef ArithmeticSequence<Index, typename make_size_type<SizeType>::type, IncrType> type;
 };
 
-template<typename FirstType,typename SizeType,typename IncrType>
-ArithmeticSequence<Index,typename make_size_type<SizeType>::type,IncrType>
-makeIndexedViewCompatible(const ArithmeticSequence<FirstType,SizeType,IncrType>& ids, Index size,SpecializedType) {
-  return ArithmeticSequence<Index,typename make_size_type<SizeType>::type,IncrType>(
-            eval_expr_given_size(ids.firstObject(),size),eval_expr_given_size(ids.sizeObject(),size),ids.incrObject());
+template <typename FirstType, typename SizeType, typename IncrType>
+ArithmeticSequence<Index, typename make_size_type<SizeType>::type, IncrType> makeIndexedViewCompatible(
+    const ArithmeticSequence<FirstType, SizeType, IncrType>& ids, Index size, SpecializedType) {
+  return ArithmeticSequence<Index, typename make_size_type<SizeType>::type, IncrType>(
+      eval_expr_given_size(ids.firstObject(), size), eval_expr_given_size(ids.sizeObject(), size), ids.incrObject());
 }
 
-template<typename FirstType,typename SizeType,typename IncrType>
-struct get_compile_time_incr<ArithmeticSequence<FirstType,SizeType,IncrType> > {
-  enum { value = get_fixed_value<IncrType,DynamicIndex>::value };
+template <typename FirstType, typename SizeType, typename IncrType>
+struct get_compile_time_incr<ArithmeticSequence<FirstType, SizeType, IncrType> > {
+  enum { value = get_fixed_value<IncrType, DynamicIndex>::value };
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \namespace Eigen::indexing
   * \ingroup Core_Module
-  * 
+  *
   * The sole purpose of this namespace is to be able to import all functions
   * and symbols that are expected to be used within operator() for indexing
   * and slicing. If you already imported the whole Eigen namespace:
@@ -245,15 +250,15 @@
   \endcode
   */
 namespace indexing {
-  using Eigen::fix;
-  using Eigen::seq;
-  using Eigen::seqN;
-  using Eigen::placeholders::all;
-  using Eigen::placeholders::last;
-  using Eigen::placeholders::lastN;
-  using Eigen::placeholders::lastp1;
-}
+using Eigen::fix;
+using Eigen::seq;
+using Eigen::seqN;
+using Eigen::placeholders::all;
+using Eigen::placeholders::last;
+using Eigen::placeholders::lastN;
+using Eigen::placeholders::lastp1;
+}  // namespace indexing
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_ARITHMETIC_SEQUENCE_H
+#endif  // EIGEN_ARITHMETIC_SEQUENCE_H
diff --git a/Eigen/src/Core/Array.h b/Eigen/src/Core/Array.h
index 0055838..29c9682 100644
--- a/Eigen/src/Core/Array.h
+++ b/Eigen/src/Core/Array.h
@@ -16,361 +16,324 @@
 namespace Eigen {
 
 namespace internal {
-template<typename Scalar_, int Rows_, int Cols_, int Options_, int MaxRows_, int MaxCols_>
-struct traits<Array<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_> > : traits<Matrix<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_> >
-{
+template <typename Scalar_, int Rows_, int Cols_, int Options_, int MaxRows_, int MaxCols_>
+struct traits<Array<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_>>
+    : traits<Matrix<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_>> {
   typedef ArrayXpr XprKind;
-  typedef ArrayBase<Array<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_> > XprBase;
+  typedef ArrayBase<Array<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_>> XprBase;
 };
-}
+}  // namespace internal
 
 /** \class Array
-  * \ingroup Core_Module
-  *
-  * \brief General-purpose arrays with easy API for coefficient-wise operations
-  *
-  * The %Array class is very similar to the Matrix class. It provides
-  * general-purpose one- and two-dimensional arrays. The difference between the
-  * %Array and the %Matrix class is primarily in the API: the API for the
-  * %Array class provides easy access to coefficient-wise operations, while the
-  * API for the %Matrix class provides easy access to linear-algebra
-  * operations.
-  *
-  * See documentation of class Matrix for detailed information on the template parameters
-  * storage layout.
-  *
-  * This class can be extended with the help of the plugin mechanism described on the page
-  * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_ARRAY_PLUGIN.
-  *
-  * \sa \blank \ref TutorialArrayClass, \ref TopicClassHierarchy
-  */
-template<typename Scalar_, int Rows_, int Cols_, int Options_, int MaxRows_, int MaxCols_>
-class Array
-  : public PlainObjectBase<Array<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_> >
-{
-  public:
+ * \ingroup Core_Module
+ *
+ * \brief General-purpose arrays with easy API for coefficient-wise operations
+ *
+ * The %Array class is very similar to the Matrix class. It provides
+ * general-purpose one- and two-dimensional arrays. The difference between the
+ * %Array and the %Matrix class is primarily in the API: the API for the
+ * %Array class provides easy access to coefficient-wise operations, while the
+ * API for the %Matrix class provides easy access to linear-algebra
+ * operations.
+ *
+ * See documentation of class Matrix for detailed information on the template parameters
+ * storage layout.
+ *
+ * This class can be extended with the help of the plugin mechanism described on the page
+ * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_ARRAY_PLUGIN.
+ *
+ * \sa \blank \ref TutorialArrayClass, \ref TopicClassHierarchy
+ */
+template <typename Scalar_, int Rows_, int Cols_, int Options_, int MaxRows_, int MaxCols_>
+class Array : public PlainObjectBase<Array<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_>> {
+ public:
+  typedef PlainObjectBase<Array> Base;
+  EIGEN_DENSE_PUBLIC_INTERFACE(Array)
 
-    typedef PlainObjectBase<Array> Base;
-    EIGEN_DENSE_PUBLIC_INTERFACE(Array)
+  enum { Options = Options_ };
+  typedef typename Base::PlainObject PlainObject;
 
-    enum { Options = Options_ };
-    typedef typename Base::PlainObject PlainObject;
+ protected:
+  template <typename Derived, typename OtherDerived, bool IsVector>
+  friend struct internal::conservative_resize_like_impl;
 
-  protected:
-    template <typename Derived, typename OtherDerived, bool IsVector>
-    friend struct internal::conservative_resize_like_impl;
+  using Base::m_storage;
 
-    using Base::m_storage;
+ public:
+  using Base::base;
+  using Base::coeff;
+  using Base::coeffRef;
 
-  public:
+  /**
+   * The usage of
+   *   using Base::operator=;
+   * fails on MSVC. Since the code below is working with GCC and MSVC, we skipped
+   * the usage of 'using'. This should be done only for operator=.
+   */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Array& operator=(const EigenBase<OtherDerived>& other) {
+    return Base::operator=(other);
+  }
 
-    using Base::base;
-    using Base::coeff;
-    using Base::coeffRef;
+  /** Set all the entries to \a value.
+   * \sa DenseBase::setConstant(), DenseBase::fill()
+   */
+  /* This overload is needed because the usage of
+   *   using Base::operator=;
+   * fails on MSVC. Since the code below is working with GCC and MSVC, we skipped
+   * the usage of 'using'. This should be done only for operator=.
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Array& operator=(const Scalar& value) {
+    Base::setConstant(value);
+    return *this;
+  }
 
-    /**
-      * The usage of
-      *   using Base::operator=;
-      * fails on MSVC. Since the code below is working with GCC and MSVC, we skipped
-      * the usage of 'using'. This should be done only for operator=.
-      */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Array& operator=(const EigenBase<OtherDerived> &other)
-    {
-      return Base::operator=(other);
-    }
+  /** Copies the value of the expression \a other into \c *this with automatic resizing.
+   *
+   * *this might be resized to match the dimensions of \a other. If *this was a null matrix (not already initialized),
+   * it will be initialized.
+   *
+   * Note that copying a row-vector into a vector (and conversely) is allowed.
+   * The resizing, if any, is then done in the appropriate way so that row-vectors
+   * remain row-vectors and vectors remain vectors.
+   */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Array& operator=(const DenseBase<OtherDerived>& other) {
+    return Base::_set(other);
+  }
 
-    /** Set all the entries to \a value.
-      * \sa DenseBase::setConstant(), DenseBase::fill()
-      */
-    /* This overload is needed because the usage of
-      *   using Base::operator=;
-      * fails on MSVC. Since the code below is working with GCC and MSVC, we skipped
-      * the usage of 'using'. This should be done only for operator=.
-      */
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Array& operator=(const Scalar &value)
-    {
-      Base::setConstant(value);
-      return *this;
-    }
+  /** This is a special case of the templated operator=. Its purpose is to
+   * prevent a default operator= from hiding the templated operator=.
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Array& operator=(const Array& other) { return Base::_set(other); }
 
-    /** Copies the value of the expression \a other into \c *this with automatic resizing.
-      *
-      * *this might be resized to match the dimensions of \a other. If *this was a null matrix (not already initialized),
-      * it will be initialized.
-      *
-      * Note that copying a row-vector into a vector (and conversely) is allowed.
-      * The resizing, if any, is then done in the appropriate way so that row-vectors
-      * remain row-vectors and vectors remain vectors.
-      */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Array& operator=(const DenseBase<OtherDerived>& other)
-    {
-      return Base::_set(other);
-    }
-
-    /** This is a special case of the templated operator=. Its purpose is to
-      * prevent a default operator= from hiding the templated operator=.
-      */
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Array& operator=(const Array& other)
-    {
-      return Base::_set(other);
-    }
-
-    /** Default constructor.
-      *
-      * For fixed-size matrices, does nothing.
-      *
-      * For dynamic-size matrices, creates an empty matrix of size 0. Does not allocate any array. Such a matrix
-      * is called a null matrix. This constructor is the unique way to create null matrices: resizing
-      * a matrix to 0 is not supported.
-      *
-      * \sa resize(Index,Index)
-      */
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Array() : Base()
-    {
-      EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
-    }
+  /** Default constructor.
+   *
+   * For fixed-size matrices, does nothing.
+   *
+   * For dynamic-size matrices, creates an empty matrix of size 0. Does not allocate any array. Such a matrix
+   * is called a null matrix. This constructor is the unique way to create null matrices: resizing
+   * a matrix to 0 is not supported.
+   *
+   * \sa resize(Index,Index)
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Array() : Base() { EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED }
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-    // FIXME is it still needed ??
-    /** \internal */
-    EIGEN_DEVICE_FUNC
-    Array(internal::constructor_without_unaligned_array_assert)
-      : Base(internal::constructor_without_unaligned_array_assert())
-    {
-      EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
-    }
+  // FIXME is it still needed ??
+  /** \internal */
+  EIGEN_DEVICE_FUNC Array(internal::constructor_without_unaligned_array_assert)
+      : Base(internal::constructor_without_unaligned_array_assert()){EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED}
 #endif
 
-    EIGEN_DEVICE_FUNC
-    Array(Array&& other) EIGEN_NOEXCEPT_IF(std::is_nothrow_move_constructible<Scalar>::value)
-      : Base(std::move(other))
-    {
-    }
-    EIGEN_DEVICE_FUNC
-    Array& operator=(Array&& other) EIGEN_NOEXCEPT_IF(std::is_nothrow_move_assignable<Scalar>::value)
-    {
-      Base::operator=(std::move(other));
-      return *this;
-    }
+        EIGEN_DEVICE_FUNC Array(Array && other) EIGEN_NOEXCEPT_IF(std::is_nothrow_move_constructible<Scalar>::value)
+      : Base(std::move(other)) {
+  }
+  EIGEN_DEVICE_FUNC Array& operator=(Array&& other) EIGEN_NOEXCEPT_IF(std::is_nothrow_move_assignable<Scalar>::value) {
+    Base::operator=(std::move(other));
+    return *this;
+  }
 
-    /** \copydoc PlainObjectBase(const Scalar& a0, const Scalar& a1, const Scalar& a2, const Scalar& a3, const ArgTypes&... args)
-     *
-     * Example: \include Array_variadic_ctor_cxx11.cpp
-     * Output: \verbinclude Array_variadic_ctor_cxx11.out
-     *
-     * \sa Array(const std::initializer_list<std::initializer_list<Scalar>>&)
-     * \sa Array(const Scalar&), Array(const Scalar&,const Scalar&)
-     */
-    template <typename... ArgTypes>
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Array(const Scalar& a0, const Scalar& a1, const Scalar& a2, const Scalar& a3, const ArgTypes&... args)
+  /** \copydoc PlainObjectBase(const Scalar& a0, const Scalar& a1, const Scalar& a2, const Scalar& a3, const
+   * ArgTypes&... args)
+   *
+   * Example: \include Array_variadic_ctor_cxx11.cpp
+   * Output: \verbinclude Array_variadic_ctor_cxx11.out
+   *
+   * \sa Array(const std::initializer_list<std::initializer_list<Scalar>>&)
+   * \sa Array(const Scalar&), Array(const Scalar&,const Scalar&)
+   */
+  template <typename... ArgTypes>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Array(const Scalar& a0, const Scalar& a1, const Scalar& a2, const Scalar& a3,
+                                              const ArgTypes&... args)
       : Base(a0, a1, a2, a3, args...) {}
 
-    /** \brief Constructs an array and initializes it from the coefficients given as initializer-lists grouped by row. \cpp11
-      *
-      * In the general case, the constructor takes a list of rows, each row being represented as a list of coefficients:
-      *
-      * Example: \include Array_initializer_list_23_cxx11.cpp
-      * Output: \verbinclude Array_initializer_list_23_cxx11.out
-      *
-      * Each of the inner initializer lists must contain the exact same number of elements, otherwise an assertion is triggered.
-      *
-      * In the case of a compile-time column 1D array, implicit transposition from a single row is allowed.
-      * Therefore <code> Array<int,Dynamic,1>{{1,2,3,4,5}}</code> is legal and the more verbose syntax
-      * <code>Array<int,Dynamic,1>{{1},{2},{3},{4},{5}}</code> can be avoided:
-      *
-      * Example: \include Array_initializer_list_vector_cxx11.cpp
-      * Output: \verbinclude Array_initializer_list_vector_cxx11.out
-      *
-      * In the case of fixed-sized arrays, the initializer list sizes must exactly match the array sizes,
-      * and implicit transposition is allowed for compile-time 1D arrays only.
-      *
-      * \sa  Array(const Scalar& a0, const Scalar& a1, const Scalar& a2, const Scalar& a3, const ArgTypes&... args)
-      */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE constexpr Array(
-        const std::initializer_list<std::initializer_list<Scalar>>& list)
-        : Base(list) {}
+  /** \brief Constructs an array and initializes it from the coefficients given as initializer-lists grouped by row.
+   * \cpp11
+   *
+   * In the general case, the constructor takes a list of rows, each row being represented as a list of coefficients:
+   *
+   * Example: \include Array_initializer_list_23_cxx11.cpp
+   * Output: \verbinclude Array_initializer_list_23_cxx11.out
+   *
+   * Each of the inner initializer lists must contain the exact same number of elements, otherwise an assertion is
+   * triggered.
+   *
+   * In the case of a compile-time column 1D array, implicit transposition from a single row is allowed.
+   * Therefore <code> Array<int,Dynamic,1>{{1,2,3,4,5}}</code> is legal and the more verbose syntax
+   * <code>Array<int,Dynamic,1>{{1},{2},{3},{4},{5}}</code> can be avoided:
+   *
+   * Example: \include Array_initializer_list_vector_cxx11.cpp
+   * Output: \verbinclude Array_initializer_list_vector_cxx11.out
+   *
+   * In the case of fixed-sized arrays, the initializer list sizes must exactly match the array sizes,
+   * and implicit transposition is allowed for compile-time 1D arrays only.
+   *
+   * \sa  Array(const Scalar& a0, const Scalar& a1, const Scalar& a2, const Scalar& a3, const ArgTypes&... args)
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE constexpr Array(
+      const std::initializer_list<std::initializer_list<Scalar>>& list)
+      : Base(list) {}
 
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    template<typename T>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE explicit Array(const T& x)
-    {
-      Base::template _init1<T>(x);
-    }
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  template <typename T>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit Array(const T& x) {
+    Base::template _init1<T>(x);
+  }
 
-    template<typename T0, typename T1>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Array(const T0& val0, const T1& val1)
-    {
-      this->template _init2<T0,T1>(val0, val1);
-    }
+  template <typename T0, typename T1>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Array(const T0& val0, const T1& val1) {
+    this->template _init2<T0, T1>(val0, val1);
+  }
 
-    #else
-    /** \brief Constructs a fixed-sized array initialized with coefficients starting at \a data */
-    EIGEN_DEVICE_FUNC explicit Array(const Scalar *data);
-    /** Constructs a vector or row-vector with given dimension. \only_for_vectors
-      *
-      * Note that this is only useful for dynamic-size vectors. For fixed-size vectors,
-      * it is redundant to pass the dimension here, so it makes more sense to use the default
-      * constructor Array() instead.
-      */
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE explicit Array(Index dim);
-    /** constructs an initialized 1x1 Array with the given coefficient
-      * \sa const Scalar& a0, const Scalar& a1, const Scalar& a2, const Scalar& a3, const ArgTypes&... args */
-    Array(const Scalar& value);
-    /** constructs an uninitialized array with \a rows rows and \a cols columns.
-      *
-      * This is useful for dynamic-size arrays. For fixed-size arrays,
-      * it is redundant to pass these parameters, so one should use the default constructor
-      * Array() instead. */
-    Array(Index rows, Index cols);
-    /** constructs an initialized 2D vector with given coefficients
-      * \sa Array(const Scalar& a0, const Scalar& a1, const Scalar& a2, const Scalar& a3, const ArgTypes&... args) */
-    Array(const Scalar& val0, const Scalar& val1);
-    #endif  // end EIGEN_PARSED_BY_DOXYGEN
+#else
+  /** \brief Constructs a fixed-sized array initialized with coefficients starting at \a data */
+  EIGEN_DEVICE_FUNC explicit Array(const Scalar* data);
+  /** Constructs a vector or row-vector with given dimension. \only_for_vectors
+   *
+   * Note that this is only useful for dynamic-size vectors. For fixed-size vectors,
+   * it is redundant to pass the dimension here, so it makes more sense to use the default
+   * constructor Array() instead.
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit Array(Index dim);
+  /** constructs an initialized 1x1 Array with the given coefficient
+   * \sa const Scalar& a0, const Scalar& a1, const Scalar& a2, const Scalar& a3, const ArgTypes&... args */
+  Array(const Scalar& value);
+  /** constructs an uninitialized array with \a rows rows and \a cols columns.
+   *
+   * This is useful for dynamic-size arrays. For fixed-size arrays,
+   * it is redundant to pass these parameters, so one should use the default constructor
+   * Array() instead. */
+  Array(Index rows, Index cols);
+  /** constructs an initialized 2D vector with given coefficients
+   * \sa Array(const Scalar& a0, const Scalar& a1, const Scalar& a2, const Scalar& a3, const ArgTypes&... args) */
+  Array(const Scalar& val0, const Scalar& val1);
+#endif  // end EIGEN_PARSED_BY_DOXYGEN
 
-    /** constructs an initialized 3D vector with given coefficients
-      * \sa Array(const Scalar& a0, const Scalar& a1, const Scalar& a2, const Scalar& a3, const ArgTypes&... args)
-      */
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Array(const Scalar& val0, const Scalar& val1, const Scalar& val2)
-    {
-      EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Array, 3)
-      m_storage.data()[0] = val0;
-      m_storage.data()[1] = val1;
-      m_storage.data()[2] = val2;
-    }
-    /** constructs an initialized 4D vector with given coefficients
-      * \sa Array(const Scalar& a0, const Scalar& a1, const Scalar& a2, const Scalar& a3, const ArgTypes&... args)
-      */
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Array(const Scalar& val0, const Scalar& val1, const Scalar& val2, const Scalar& val3)
-    {
-      EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Array, 4)
-      m_storage.data()[0] = val0;
-      m_storage.data()[1] = val1;
-      m_storage.data()[2] = val2;
-      m_storage.data()[3] = val3;
-    }
+  /** constructs an initialized 3D vector with given coefficients
+   * \sa Array(const Scalar& a0, const Scalar& a1, const Scalar& a2, const Scalar& a3, const ArgTypes&... args)
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Array(const Scalar& val0, const Scalar& val1, const Scalar& val2) {
+    EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Array, 3)
+    m_storage.data()[0] = val0;
+    m_storage.data()[1] = val1;
+    m_storage.data()[2] = val2;
+  }
+  /** constructs an initialized 4D vector with given coefficients
+   * \sa Array(const Scalar& a0, const Scalar& a1, const Scalar& a2, const Scalar& a3, const ArgTypes&... args)
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Array(const Scalar& val0, const Scalar& val1, const Scalar& val2,
+                                              const Scalar& val3) {
+    EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Array, 4)
+    m_storage.data()[0] = val0;
+    m_storage.data()[1] = val1;
+    m_storage.data()[2] = val2;
+    m_storage.data()[3] = val3;
+  }
 
-    /** Copy constructor */
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Array(const Array& other)
-            : Base(other)
-    { }
+  /** Copy constructor */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Array(const Array& other) : Base(other) {}
 
-  private:
-    struct PrivateType {};
-  public:
+ private:
+  struct PrivateType {};
 
-    /** \sa MatrixBase::operator=(const EigenBase<OtherDerived>&) */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Array(const EigenBase<OtherDerived> &other,
-                              std::enable_if_t<internal::is_convertible<typename OtherDerived::Scalar,Scalar>::value,
-                                               PrivateType> = PrivateType())
-      : Base(other.derived())
-    { }
+ public:
+  /** \sa MatrixBase::operator=(const EigenBase<OtherDerived>&) */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Array(
+      const EigenBase<OtherDerived>& other,
+      std::enable_if_t<internal::is_convertible<typename OtherDerived::Scalar, Scalar>::value, PrivateType> =
+          PrivateType())
+      : Base(other.derived()) {}
 
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index innerStride() const EIGEN_NOEXCEPT{ return 1; }
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index outerStride() const EIGEN_NOEXCEPT { return this->innerSize(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index innerStride() const EIGEN_NOEXCEPT { return 1; }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index outerStride() const EIGEN_NOEXCEPT { return this->innerSize(); }
 
-    #ifdef EIGEN_ARRAY_PLUGIN
-    #include EIGEN_ARRAY_PLUGIN
-    #endif
+#ifdef EIGEN_ARRAY_PLUGIN
+#include EIGEN_ARRAY_PLUGIN
+#endif
 
-  private:
-
-    template<typename MatrixType, typename OtherDerived, bool SwapPointers>
-    friend struct internal::matrix_swap_impl;
+ private:
+  template <typename MatrixType, typename OtherDerived, bool SwapPointers>
+  friend struct internal::matrix_swap_impl;
 };
 
 /** \defgroup arraytypedefs Global array typedefs
-  * \ingroup Core_Module
-  *
-  * %Eigen defines several typedef shortcuts for most common 1D and 2D array types.
-  *
-  * The general patterns are the following:
-  *
-  * \c ArrayRowsColsType where \c Rows and \c Cols can be \c 2,\c 3,\c 4 for fixed size square matrices or \c X for dynamic size,
-  * and where \c Type can be \c i for integer, \c f for float, \c d for double, \c cf for complex float, \c cd
-  * for complex double.
-  *
-  * For example, \c Array33d is a fixed-size 3x3 array type of doubles, and \c ArrayXXf is a dynamic-size matrix of floats.
-  *
-  * There are also \c ArraySizeType which are self-explanatory. For example, \c Array4cf is
-  * a fixed-size 1D array of 4 complex floats.
-  *
-  * With \cpp11, template alias are also defined for common sizes.
-  * They follow the same pattern as above except that the scalar type suffix is replaced by a
-  * template parameter, i.e.:
-  *   - `ArrayRowsCols<Type>` where `Rows` and `Cols` can be \c 2,\c 3,\c 4, or \c X for fixed or dynamic size.
-  *   - `ArraySize<Type>` where `Size` can be \c 2,\c 3,\c 4 or \c X for fixed or dynamic size 1D arrays.
-  *
-  * \sa class Array
-  */
+ * \ingroup Core_Module
+ *
+ * %Eigen defines several typedef shortcuts for most common 1D and 2D array types.
+ *
+ * The general patterns are the following:
+ *
+ * \c ArrayRowsColsType where \c Rows and \c Cols can be \c 2,\c 3,\c 4 for fixed size square matrices or \c X for
+ * dynamic size, and where \c Type can be \c i for integer, \c f for float, \c d for double, \c cf for complex float, \c
+ * cd for complex double.
+ *
+ * For example, \c Array33d is a fixed-size 3x3 array type of doubles, and \c ArrayXXf is a dynamic-size matrix of
+ * floats.
+ *
+ * There are also \c ArraySizeType which are self-explanatory. For example, \c Array4cf is
+ * a fixed-size 1D array of 4 complex floats.
+ *
+ * With \cpp11, template alias are also defined for common sizes.
+ * They follow the same pattern as above except that the scalar type suffix is replaced by a
+ * template parameter, i.e.:
+ *   - `ArrayRowsCols<Type>` where `Rows` and `Cols` can be \c 2,\c 3,\c 4, or \c X for fixed or dynamic size.
+ *   - `ArraySize<Type>` where `Size` can be \c 2,\c 3,\c 4 or \c X for fixed or dynamic size 1D arrays.
+ *
+ * \sa class Array
+ */
 
-#define EIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, Size, SizeSuffix)   \
-/** \ingroup arraytypedefs */                                    \
-typedef Array<Type, Size, Size> Array##SizeSuffix##SizeSuffix##TypeSuffix;  \
-/** \ingroup arraytypedefs */                                    \
-typedef Array<Type, Size, 1>    Array##SizeSuffix##TypeSuffix;
+#define EIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, Size, SizeSuffix)        \
+  /** \ingroup arraytypedefs */                                              \
+  typedef Array<Type, Size, Size> Array##SizeSuffix##SizeSuffix##TypeSuffix; \
+  /** \ingroup arraytypedefs */                                              \
+  typedef Array<Type, Size, 1> Array##SizeSuffix##TypeSuffix;
 
-#define EIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, Size)         \
-/** \ingroup arraytypedefs */                                    \
-typedef Array<Type, Size, Dynamic> Array##Size##X##TypeSuffix;  \
-/** \ingroup arraytypedefs */                                    \
-typedef Array<Type, Dynamic, Size> Array##X##Size##TypeSuffix;
+#define EIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, Size)  \
+  /** \ingroup arraytypedefs */                                  \
+  typedef Array<Type, Size, Dynamic> Array##Size##X##TypeSuffix; \
+  /** \ingroup arraytypedefs */                                  \
+  typedef Array<Type, Dynamic, Size> Array##X##Size##TypeSuffix;
 
 #define EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(Type, TypeSuffix) \
-EIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 2, 2) \
-EIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 3, 3) \
-EIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 4, 4) \
-EIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, Dynamic, X) \
-EIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 2) \
-EIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 3) \
-EIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 4)
+  EIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 2, 2)           \
+  EIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 3, 3)           \
+  EIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 4, 4)           \
+  EIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, Dynamic, X)     \
+  EIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 2)        \
+  EIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 3)        \
+  EIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 4)
 
-EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(int,                  i)
-EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(float,                f)
-EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(double,               d)
-EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(std::complex<float>,  cf)
+EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(int, i)
+EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(float, f)
+EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(double, d)
+EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(std::complex<float>, cf)
 EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(std::complex<double>, cd)
 
 #undef EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES
 #undef EIGEN_MAKE_ARRAY_TYPEDEFS
 #undef EIGEN_MAKE_ARRAY_FIXED_TYPEDEFS
 
-#define EIGEN_MAKE_ARRAY_TYPEDEFS(Size, SizeSuffix)               \
-/** \ingroup arraytypedefs */                                     \
-/** \brief \cpp11 */                                              \
-template <typename Type>                                          \
-using Array##SizeSuffix##SizeSuffix = Array<Type, Size, Size>;    \
-/** \ingroup arraytypedefs */                                     \
-/** \brief \cpp11 */                                              \
-template <typename Type>                                          \
-using Array##SizeSuffix = Array<Type, Size, 1>;
+#define EIGEN_MAKE_ARRAY_TYPEDEFS(Size, SizeSuffix)              \
+  /** \ingroup arraytypedefs */                                  \
+  /** \brief \cpp11 */                                           \
+  template <typename Type>                                       \
+  using Array##SizeSuffix##SizeSuffix = Array<Type, Size, Size>; \
+  /** \ingroup arraytypedefs */                                  \
+  /** \brief \cpp11 */                                           \
+  template <typename Type>                                       \
+  using Array##SizeSuffix = Array<Type, Size, 1>;
 
-#define EIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Size)                     \
-/** \ingroup arraytypedefs */                                     \
-/** \brief \cpp11 */                                              \
-template <typename Type>                                          \
-using Array##Size##X = Array<Type, Size, Dynamic>;                \
-/** \ingroup arraytypedefs */                                     \
-/** \brief \cpp11 */                                              \
-template <typename Type>                                          \
-using Array##X##Size = Array<Type, Dynamic, Size>;
+#define EIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Size)        \
+  /** \ingroup arraytypedefs */                      \
+  /** \brief \cpp11 */                               \
+  template <typename Type>                           \
+  using Array##Size##X = Array<Type, Size, Dynamic>; \
+  /** \ingroup arraytypedefs */                      \
+  /** \brief \cpp11 */                               \
+  template <typename Type>                           \
+  using Array##X##Size = Array<Type, Dynamic, Size>;
 
 EIGEN_MAKE_ARRAY_TYPEDEFS(2, 2)
 EIGEN_MAKE_ARRAY_TYPEDEFS(3, 3)
@@ -384,23 +347,23 @@
 #undef EIGEN_MAKE_ARRAY_FIXED_TYPEDEFS
 
 #define EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, SizeSuffix) \
-using Eigen::Matrix##SizeSuffix##TypeSuffix; \
-using Eigen::Vector##SizeSuffix##TypeSuffix; \
-using Eigen::RowVector##SizeSuffix##TypeSuffix;
+  using Eigen::Matrix##SizeSuffix##TypeSuffix;                               \
+  using Eigen::Vector##SizeSuffix##TypeSuffix;                               \
+  using Eigen::RowVector##SizeSuffix##TypeSuffix;
 
-#define EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(TypeSuffix) \
-EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, 2) \
-EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, 3) \
-EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, 4) \
-EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, X) \
+#define EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(TypeSuffix)       \
+  EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, 2) \
+  EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, 3) \
+  EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, 4) \
+  EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, X)
 
-#define EIGEN_USING_ARRAY_TYPEDEFS \
-EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(i) \
-EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(f) \
-EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(d) \
-EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(cf) \
-EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(cd)
+#define EIGEN_USING_ARRAY_TYPEDEFS        \
+  EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(i)  \
+  EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(f)  \
+  EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(d)  \
+  EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(cf) \
+  EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(cd)
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_ARRAY_H
+#endif  // EIGEN_ARRAY_H
diff --git a/Eigen/src/Core/ArrayBase.h b/Eigen/src/Core/ArrayBase.h
index 83001b2..6237df4 100644
--- a/Eigen/src/Core/ArrayBase.h
+++ b/Eigen/src/Core/ArrayBase.h
@@ -13,217 +13,210 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
-template<typename ExpressionType> class MatrixWrapper;
+template <typename ExpressionType>
+class MatrixWrapper;
 
 /** \class ArrayBase
-  * \ingroup Core_Module
-  *
-  * \brief Base class for all 1D and 2D array, and related expressions
-  *
-  * An array is similar to a dense vector or matrix. While matrices are mathematical
-  * objects with well defined linear algebra operators, an array is just a collection
-  * of scalar values arranged in a one or two dimensional fashion. As the main consequence,
-  * all operations applied to an array are performed coefficient wise. Furthermore,
-  * arrays support scalar math functions of the c++ standard library (e.g., std::sin(x)), and convenient
-  * constructors allowing to easily write generic code working for both scalar values
-  * and arrays.
-  *
-  * This class is the base that is inherited by all array expression types.
-  *
-  * \tparam Derived is the derived type, e.g., an array or an expression type.
-  *
-  * This class can be extended with the help of the plugin mechanism described on the page
-  * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_ARRAYBASE_PLUGIN.
-  *
-  * \sa class MatrixBase, \ref TopicClassHierarchy
-  */
-template<typename Derived> class ArrayBase
-  : public DenseBase<Derived>
-{
-  public:
+ * \ingroup Core_Module
+ *
+ * \brief Base class for all 1D and 2D array, and related expressions
+ *
+ * An array is similar to a dense vector or matrix. While matrices are mathematical
+ * objects with well defined linear algebra operators, an array is just a collection
+ * of scalar values arranged in a one or two dimensional fashion. As the main consequence,
+ * all operations applied to an array are performed coefficient wise. Furthermore,
+ * arrays support scalar math functions of the c++ standard library (e.g., std::sin(x)), and convenient
+ * constructors allowing to easily write generic code working for both scalar values
+ * and arrays.
+ *
+ * This class is the base that is inherited by all array expression types.
+ *
+ * \tparam Derived is the derived type, e.g., an array or an expression type.
+ *
+ * This class can be extended with the help of the plugin mechanism described on the page
+ * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_ARRAYBASE_PLUGIN.
+ *
+ * \sa class MatrixBase, \ref TopicClassHierarchy
+ */
+template <typename Derived>
+class ArrayBase : public DenseBase<Derived> {
+ public:
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-    /** The base class for a given storage type. */
-    typedef ArrayBase StorageBaseType;
+  /** The base class for a given storage type. */
+  typedef ArrayBase StorageBaseType;
 
-    typedef ArrayBase Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl;
+  typedef ArrayBase Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl;
 
-    typedef typename internal::traits<Derived>::StorageKind StorageKind;
-    typedef typename internal::traits<Derived>::Scalar Scalar;
-    typedef typename internal::packet_traits<Scalar>::type PacketScalar;
-    typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef typename internal::traits<Derived>::StorageKind StorageKind;
+  typedef typename internal::traits<Derived>::Scalar Scalar;
+  typedef typename internal::packet_traits<Scalar>::type PacketScalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
 
-    typedef DenseBase<Derived> Base;
-    using Base::RowsAtCompileTime;
-    using Base::ColsAtCompileTime;
-    using Base::SizeAtCompileTime;
-    using Base::MaxRowsAtCompileTime;
-    using Base::MaxColsAtCompileTime;
-    using Base::MaxSizeAtCompileTime;
-    using Base::IsVectorAtCompileTime;
-    using Base::Flags;
-    
-    using Base::derived;
-    using Base::const_cast_derived;
-    using Base::rows;
-    using Base::cols;
-    using Base::size;
-    using Base::coeff;
-    using Base::coeffRef;
-    using Base::lazyAssign;
-    using Base::operator-;
-    using Base::operator=;
-    using Base::operator+=;
-    using Base::operator-=;
-    using Base::operator*=;
-    using Base::operator/=;
+  typedef DenseBase<Derived> Base;
+  using Base::ColsAtCompileTime;
+  using Base::Flags;
+  using Base::IsVectorAtCompileTime;
+  using Base::MaxColsAtCompileTime;
+  using Base::MaxRowsAtCompileTime;
+  using Base::MaxSizeAtCompileTime;
+  using Base::RowsAtCompileTime;
+  using Base::SizeAtCompileTime;
 
-    typedef typename Base::CoeffReturnType CoeffReturnType;
+  using Base::coeff;
+  using Base::coeffRef;
+  using Base::cols;
+  using Base::const_cast_derived;
+  using Base::derived;
+  using Base::lazyAssign;
+  using Base::rows;
+  using Base::size;
+  using Base::operator-;
+  using Base::operator=;
+  using Base::operator+=;
+  using Base::operator-=;
+  using Base::operator*=;
+  using Base::operator/=;
 
-#endif // not EIGEN_PARSED_BY_DOXYGEN
+  typedef typename Base::CoeffReturnType CoeffReturnType;
+
+#endif  // not EIGEN_PARSED_BY_DOXYGEN
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-    typedef typename Base::PlainObject PlainObject;
+  typedef typename Base::PlainObject PlainObject;
 
-    /** \internal Represents a matrix with all coefficients equal to one another*/
-    typedef CwiseNullaryOp<internal::scalar_constant_op<Scalar>,PlainObject> ConstantReturnType;
-#endif // not EIGEN_PARSED_BY_DOXYGEN
+  /** \internal Represents a matrix with all coefficients equal to one another*/
+  typedef CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject> ConstantReturnType;
+#endif  // not EIGEN_PARSED_BY_DOXYGEN
 
 #define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::ArrayBase
-#define EIGEN_DOC_UNARY_ADDONS(X,Y)
-#   include "../plugins/MatrixCwiseUnaryOps.inc"
-#   include "../plugins/ArrayCwiseUnaryOps.inc"
-#   include "../plugins/CommonCwiseBinaryOps.inc"
-#   include "../plugins/MatrixCwiseBinaryOps.inc"
-#   include "../plugins/ArrayCwiseBinaryOps.inc"
-#   ifdef EIGEN_ARRAYBASE_PLUGIN
-#     include EIGEN_ARRAYBASE_PLUGIN
-#   endif
+#define EIGEN_DOC_UNARY_ADDONS(X, Y)
+#include "../plugins/MatrixCwiseUnaryOps.inc"
+#include "../plugins/ArrayCwiseUnaryOps.inc"
+#include "../plugins/CommonCwiseBinaryOps.inc"
+#include "../plugins/MatrixCwiseBinaryOps.inc"
+#include "../plugins/ArrayCwiseBinaryOps.inc"
+#ifdef EIGEN_ARRAYBASE_PLUGIN
+#include EIGEN_ARRAYBASE_PLUGIN
+#endif
 #undef EIGEN_CURRENT_STORAGE_BASE_CLASS
 #undef EIGEN_DOC_UNARY_ADDONS
 
-    /** Special case of the template operator=, in order to prevent the compiler
-      * from generating a default operator= (issue hit with g++ 4.1)
-      */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Derived& operator=(const ArrayBase& other)
-    {
-      internal::call_assignment(derived(), other.derived());
-      return derived();
-    }
-    
-    /** Set all the entries to \a value.
-      * \sa DenseBase::setConstant(), DenseBase::fill() */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Derived& operator=(const Scalar &value)
-    { Base::setConstant(value); return derived(); }
+  /** Special case of the template operator=, in order to prevent the compiler
+   * from generating a default operator= (issue hit with g++ 4.1)
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator=(const ArrayBase& other) {
+    internal::call_assignment(derived(), other.derived());
+    return derived();
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Derived& operator+=(const Scalar& scalar);
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Derived& operator-=(const Scalar& scalar);
+  /** Set all the entries to \a value.
+   * \sa DenseBase::setConstant(), DenseBase::fill() */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator=(const Scalar& value) {
+    Base::setConstant(value);
+    return derived();
+  }
 
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Derived& operator+=(const ArrayBase<OtherDerived>& other);
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Derived& operator-=(const ArrayBase<OtherDerived>& other);
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator+=(const Scalar& scalar);
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator-=(const Scalar& scalar);
 
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Derived& operator*=(const ArrayBase<OtherDerived>& other);
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator+=(const ArrayBase<OtherDerived>& other);
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator-=(const ArrayBase<OtherDerived>& other);
 
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Derived& operator/=(const ArrayBase<OtherDerived>& other);
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator*=(const ArrayBase<OtherDerived>& other);
 
-  public:
-    EIGEN_DEVICE_FUNC
-    ArrayBase<Derived>& array() { return *this; }
-    EIGEN_DEVICE_FUNC
-    const ArrayBase<Derived>& array() const { return *this; }
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator/=(const ArrayBase<OtherDerived>& other);
 
-    /** \returns an \link Eigen::MatrixBase Matrix \endlink expression of this array
-      * \sa MatrixBase::array() */
-    EIGEN_DEVICE_FUNC
-    MatrixWrapper<Derived> matrix() { return MatrixWrapper<Derived>(derived()); }
-    EIGEN_DEVICE_FUNC
-    const MatrixWrapper<const Derived> matrix() const { return MatrixWrapper<const Derived>(derived()); }
+ public:
+  EIGEN_DEVICE_FUNC ArrayBase<Derived>& array() { return *this; }
+  EIGEN_DEVICE_FUNC const ArrayBase<Derived>& array() const { return *this; }
 
-//     template<typename Dest>
-//     inline void evalTo(Dest& dst) const { dst = matrix(); }
+  /** \returns an \link Eigen::MatrixBase Matrix \endlink expression of this array
+   * \sa MatrixBase::array() */
+  EIGEN_DEVICE_FUNC MatrixWrapper<Derived> matrix() { return MatrixWrapper<Derived>(derived()); }
+  EIGEN_DEVICE_FUNC const MatrixWrapper<const Derived> matrix() const {
+    return MatrixWrapper<const Derived>(derived());
+  }
 
-  protected:
-    EIGEN_DEFAULT_COPY_CONSTRUCTOR(ArrayBase)
-    EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(ArrayBase)
+  //     template<typename Dest>
+  //     inline void evalTo(Dest& dst) const { dst = matrix(); }
 
-  private:
-    explicit ArrayBase(Index);
-    ArrayBase(Index,Index);
-    template<typename OtherDerived> explicit ArrayBase(const ArrayBase<OtherDerived>&);
-  protected:
-    // mixing arrays and matrices is not legal
-    template<typename OtherDerived> Derived& operator+=(const MatrixBase<OtherDerived>& )
-    {EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar))==-1,YOU_CANNOT_MIX_ARRAYS_AND_MATRICES); return *this;}
-    // mixing arrays and matrices is not legal
-    template<typename OtherDerived> Derived& operator-=(const MatrixBase<OtherDerived>& )
-    {EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar))==-1,YOU_CANNOT_MIX_ARRAYS_AND_MATRICES); return *this;}
+ protected:
+  EIGEN_DEFAULT_COPY_CONSTRUCTOR(ArrayBase)
+  EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(ArrayBase)
+
+ private:
+  explicit ArrayBase(Index);
+  ArrayBase(Index, Index);
+  template <typename OtherDerived>
+  explicit ArrayBase(const ArrayBase<OtherDerived>&);
+
+ protected:
+  // mixing arrays and matrices is not legal
+  template <typename OtherDerived>
+  Derived& operator+=(const MatrixBase<OtherDerived>&) {
+    EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar)) == -1,
+                        YOU_CANNOT_MIX_ARRAYS_AND_MATRICES);
+    return *this;
+  }
+  // mixing arrays and matrices is not legal
+  template <typename OtherDerived>
+  Derived& operator-=(const MatrixBase<OtherDerived>&) {
+    EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar)) == -1,
+                        YOU_CANNOT_MIX_ARRAYS_AND_MATRICES);
+    return *this;
+  }
 };
 
 /** replaces \c *this by \c *this - \a other.
-  *
-  * \returns a reference to \c *this
-  */
-template<typename Derived>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived &
-ArrayBase<Derived>::operator-=(const ArrayBase<OtherDerived> &other)
-{
-  call_assignment(derived(), other.derived(), internal::sub_assign_op<Scalar,typename OtherDerived::Scalar>());
+ *
+ * \returns a reference to \c *this
+ */
+template <typename Derived>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& ArrayBase<Derived>::operator-=(const ArrayBase<OtherDerived>& other) {
+  call_assignment(derived(), other.derived(), internal::sub_assign_op<Scalar, typename OtherDerived::Scalar>());
   return derived();
 }
 
 /** replaces \c *this by \c *this + \a other.
-  *
-  * \returns a reference to \c *this
-  */
-template<typename Derived>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived &
-ArrayBase<Derived>::operator+=(const ArrayBase<OtherDerived>& other)
-{
-  call_assignment(derived(), other.derived(), internal::add_assign_op<Scalar,typename OtherDerived::Scalar>());
+ *
+ * \returns a reference to \c *this
+ */
+template <typename Derived>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& ArrayBase<Derived>::operator+=(const ArrayBase<OtherDerived>& other) {
+  call_assignment(derived(), other.derived(), internal::add_assign_op<Scalar, typename OtherDerived::Scalar>());
   return derived();
 }
 
 /** replaces \c *this by \c *this * \a other coefficient wise.
-  *
-  * \returns a reference to \c *this
-  */
-template<typename Derived>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived &
-ArrayBase<Derived>::operator*=(const ArrayBase<OtherDerived>& other)
-{
-  call_assignment(derived(), other.derived(), internal::mul_assign_op<Scalar,typename OtherDerived::Scalar>());
+ *
+ * \returns a reference to \c *this
+ */
+template <typename Derived>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& ArrayBase<Derived>::operator*=(const ArrayBase<OtherDerived>& other) {
+  call_assignment(derived(), other.derived(), internal::mul_assign_op<Scalar, typename OtherDerived::Scalar>());
   return derived();
 }
 
 /** replaces \c *this by \c *this / \a other coefficient wise.
-  *
-  * \returns a reference to \c *this
-  */
-template<typename Derived>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived &
-ArrayBase<Derived>::operator/=(const ArrayBase<OtherDerived>& other)
-{
-  call_assignment(derived(), other.derived(), internal::div_assign_op<Scalar,typename OtherDerived::Scalar>());
+ *
+ * \returns a reference to \c *this
+ */
+template <typename Derived>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& ArrayBase<Derived>::operator/=(const ArrayBase<OtherDerived>& other) {
+  call_assignment(derived(), other.derived(), internal::div_assign_op<Scalar, typename OtherDerived::Scalar>());
   return derived();
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_ARRAYBASE_H
+#endif  // EIGEN_ARRAYBASE_H
diff --git a/Eigen/src/Core/ArrayWrapper.h b/Eigen/src/Core/ArrayWrapper.h
index 986fad8..b45395d 100644
--- a/Eigen/src/Core/ArrayWrapper.h
+++ b/Eigen/src/Core/ArrayWrapper.h
@@ -16,21 +16,19 @@
 namespace Eigen {
 
 /** \class ArrayWrapper
-  * \ingroup Core_Module
-  *
-  * \brief Expression of a mathematical vector or matrix as an array object
-  *
-  * This class is the return type of MatrixBase::array(), and most of the time
-  * this is the only way it is use.
-  *
-  * \sa MatrixBase::array(), class MatrixWrapper
-  */
+ * \ingroup Core_Module
+ *
+ * \brief Expression of a mathematical vector or matrix as an array object
+ *
+ * This class is the return type of MatrixBase::array(), and most of the time
+ * this is the only way it is use.
+ *
+ * \sa MatrixBase::array(), class MatrixWrapper
+ */
 
 namespace internal {
-template<typename ExpressionType>
-struct traits<ArrayWrapper<ExpressionType> >
-  : public traits<remove_all_t<typename ExpressionType::Nested> >
-{
+template <typename ExpressionType>
+struct traits<ArrayWrapper<ExpressionType> > : public traits<remove_all_t<typename ExpressionType::Nested> > {
   typedef ArrayXpr XprKind;
   // Let's remove NestByRefBit
   enum {
@@ -39,96 +37,77 @@
     Flags = (Flags0 & ~(NestByRefBit | LvalueBit)) | LvalueBitFlag
   };
 };
-}
+}  // namespace internal
 
-template<typename ExpressionType>
-class ArrayWrapper : public ArrayBase<ArrayWrapper<ExpressionType> >
-{
-  public:
-    typedef ArrayBase<ArrayWrapper> Base;
-    EIGEN_DENSE_PUBLIC_INTERFACE(ArrayWrapper)
-    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(ArrayWrapper)
-    typedef internal::remove_all_t<ExpressionType> NestedExpression;
+template <typename ExpressionType>
+class ArrayWrapper : public ArrayBase<ArrayWrapper<ExpressionType> > {
+ public:
+  typedef ArrayBase<ArrayWrapper> Base;
+  EIGEN_DENSE_PUBLIC_INTERFACE(ArrayWrapper)
+  EIGEN_INHERIT_ASSIGNMENT_OPERATORS(ArrayWrapper)
+  typedef internal::remove_all_t<ExpressionType> NestedExpression;
 
-    typedef std::conditional_t<
-                       internal::is_lvalue<ExpressionType>::value,
-                       Scalar,
-                       const Scalar
-                     > ScalarWithConstIfNotLvalue;
+  typedef std::conditional_t<internal::is_lvalue<ExpressionType>::value, Scalar, const Scalar>
+      ScalarWithConstIfNotLvalue;
 
-    typedef typename internal::ref_selector<ExpressionType>::non_const_type NestedExpressionType;
+  typedef typename internal::ref_selector<ExpressionType>::non_const_type NestedExpressionType;
 
-    using Base::coeffRef;
+  using Base::coeffRef;
 
-    EIGEN_DEVICE_FUNC
-    explicit EIGEN_STRONG_INLINE ArrayWrapper(ExpressionType& matrix) : m_expression(matrix) {}
+  EIGEN_DEVICE_FUNC explicit EIGEN_STRONG_INLINE ArrayWrapper(ExpressionType& matrix) : m_expression(matrix) {}
 
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index rows() const EIGEN_NOEXCEPT { return m_expression.rows(); }
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index cols() const EIGEN_NOEXCEPT { return m_expression.cols(); }
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index outerStride() const EIGEN_NOEXCEPT { return m_expression.outerStride(); }
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index innerStride() const EIGEN_NOEXCEPT { return m_expression.innerStride(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index rows() const EIGEN_NOEXCEPT { return m_expression.rows(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index cols() const EIGEN_NOEXCEPT { return m_expression.cols(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index outerStride() const EIGEN_NOEXCEPT {
+    return m_expression.outerStride();
+  }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index innerStride() const EIGEN_NOEXCEPT {
+    return m_expression.innerStride();
+  }
 
-    EIGEN_DEVICE_FUNC
-    inline ScalarWithConstIfNotLvalue* data() { return m_expression.data(); }
-    EIGEN_DEVICE_FUNC
-    inline const Scalar* data() const { return m_expression.data(); }
+  EIGEN_DEVICE_FUNC inline ScalarWithConstIfNotLvalue* data() { return m_expression.data(); }
+  EIGEN_DEVICE_FUNC inline const Scalar* data() const { return m_expression.data(); }
 
-    EIGEN_DEVICE_FUNC
-    inline const Scalar& coeffRef(Index rowId, Index colId) const
-    {
-      return m_expression.coeffRef(rowId, colId);
-    }
+  EIGEN_DEVICE_FUNC inline const Scalar& coeffRef(Index rowId, Index colId) const {
+    return m_expression.coeffRef(rowId, colId);
+  }
 
-    EIGEN_DEVICE_FUNC
-    inline const Scalar& coeffRef(Index index) const
-    {
-      return m_expression.coeffRef(index);
-    }
+  EIGEN_DEVICE_FUNC inline const Scalar& coeffRef(Index index) const { return m_expression.coeffRef(index); }
 
-    template<typename Dest>
-    EIGEN_DEVICE_FUNC
-    inline void evalTo(Dest& dst) const { dst = m_expression; }
+  template <typename Dest>
+  EIGEN_DEVICE_FUNC inline void evalTo(Dest& dst) const {
+    dst = m_expression;
+  }
 
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<NestedExpressionType>&
-    nestedExpression() const
-    {
-      return m_expression;
-    }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<NestedExpressionType>& nestedExpression() const {
+    return m_expression;
+  }
 
-    /** Forwards the resizing request to the nested expression
-      * \sa DenseBase::resize(Index)  */
-    EIGEN_DEVICE_FUNC
-    void resize(Index newSize) { m_expression.resize(newSize); }
-    /** Forwards the resizing request to the nested expression
-      * \sa DenseBase::resize(Index,Index)*/
-    EIGEN_DEVICE_FUNC
-    void resize(Index rows, Index cols) { m_expression.resize(rows,cols); }
+  /** Forwards the resizing request to the nested expression
+   * \sa DenseBase::resize(Index)  */
+  EIGEN_DEVICE_FUNC void resize(Index newSize) { m_expression.resize(newSize); }
+  /** Forwards the resizing request to the nested expression
+   * \sa DenseBase::resize(Index,Index)*/
+  EIGEN_DEVICE_FUNC void resize(Index rows, Index cols) { m_expression.resize(rows, cols); }
 
-  protected:
-    NestedExpressionType m_expression;
+ protected:
+  NestedExpressionType m_expression;
 };
 
 /** \class MatrixWrapper
-  * \ingroup Core_Module
-  *
-  * \brief Expression of an array as a mathematical vector or matrix
-  *
-  * This class is the return type of ArrayBase::matrix(), and most of the time
-  * this is the only way it is use.
-  *
-  * \sa MatrixBase::matrix(), class ArrayWrapper
-  */
+ * \ingroup Core_Module
+ *
+ * \brief Expression of an array as a mathematical vector or matrix
+ *
+ * This class is the return type of ArrayBase::matrix(), and most of the time
+ * this is the only way it is use.
+ *
+ * \sa MatrixBase::matrix(), class ArrayWrapper
+ */
 
 namespace internal {
-template<typename ExpressionType>
-struct traits<MatrixWrapper<ExpressionType> >
- : public traits<remove_all_t<typename ExpressionType::Nested> >
-{
+template <typename ExpressionType>
+struct traits<MatrixWrapper<ExpressionType> > : public traits<remove_all_t<typename ExpressionType::Nested> > {
   typedef MatrixXpr XprKind;
   // Let's remove NestByRefBit
   enum {
@@ -137,76 +116,58 @@
     Flags = (Flags0 & ~(NestByRefBit | LvalueBit)) | LvalueBitFlag
   };
 };
-}
+}  // namespace internal
 
-template<typename ExpressionType>
-class MatrixWrapper : public MatrixBase<MatrixWrapper<ExpressionType> >
-{
-  public:
-    typedef MatrixBase<MatrixWrapper<ExpressionType> > Base;
-    EIGEN_DENSE_PUBLIC_INTERFACE(MatrixWrapper)
-    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(MatrixWrapper)
-    typedef internal::remove_all_t<ExpressionType> NestedExpression;
+template <typename ExpressionType>
+class MatrixWrapper : public MatrixBase<MatrixWrapper<ExpressionType> > {
+ public:
+  typedef MatrixBase<MatrixWrapper<ExpressionType> > Base;
+  EIGEN_DENSE_PUBLIC_INTERFACE(MatrixWrapper)
+  EIGEN_INHERIT_ASSIGNMENT_OPERATORS(MatrixWrapper)
+  typedef internal::remove_all_t<ExpressionType> NestedExpression;
 
-    typedef std::conditional_t<
-              internal::is_lvalue<ExpressionType>::value,
-              Scalar,
-              const Scalar
-            > ScalarWithConstIfNotLvalue;
+  typedef std::conditional_t<internal::is_lvalue<ExpressionType>::value, Scalar, const Scalar>
+      ScalarWithConstIfNotLvalue;
 
-    typedef typename internal::ref_selector<ExpressionType>::non_const_type NestedExpressionType;
+  typedef typename internal::ref_selector<ExpressionType>::non_const_type NestedExpressionType;
 
-    using Base::coeffRef;
+  using Base::coeffRef;
 
-    EIGEN_DEVICE_FUNC
-    explicit inline MatrixWrapper(ExpressionType& matrix) : m_expression(matrix) {}
+  EIGEN_DEVICE_FUNC explicit inline MatrixWrapper(ExpressionType& matrix) : m_expression(matrix) {}
 
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index rows() const EIGEN_NOEXCEPT { return m_expression.rows(); }
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index cols() const EIGEN_NOEXCEPT { return m_expression.cols(); }
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index outerStride() const EIGEN_NOEXCEPT { return m_expression.outerStride(); }
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index innerStride() const EIGEN_NOEXCEPT { return m_expression.innerStride(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index rows() const EIGEN_NOEXCEPT { return m_expression.rows(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index cols() const EIGEN_NOEXCEPT { return m_expression.cols(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index outerStride() const EIGEN_NOEXCEPT {
+    return m_expression.outerStride();
+  }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index innerStride() const EIGEN_NOEXCEPT {
+    return m_expression.innerStride();
+  }
 
-    EIGEN_DEVICE_FUNC
-    inline ScalarWithConstIfNotLvalue* data() { return m_expression.data(); }
-    EIGEN_DEVICE_FUNC
-    inline const Scalar* data() const { return m_expression.data(); }
+  EIGEN_DEVICE_FUNC inline ScalarWithConstIfNotLvalue* data() { return m_expression.data(); }
+  EIGEN_DEVICE_FUNC inline const Scalar* data() const { return m_expression.data(); }
 
-    EIGEN_DEVICE_FUNC
-    inline const Scalar& coeffRef(Index rowId, Index colId) const
-    {
-      return m_expression.derived().coeffRef(rowId, colId);
-    }
+  EIGEN_DEVICE_FUNC inline const Scalar& coeffRef(Index rowId, Index colId) const {
+    return m_expression.derived().coeffRef(rowId, colId);
+  }
 
-    EIGEN_DEVICE_FUNC
-    inline const Scalar& coeffRef(Index index) const
-    {
-      return m_expression.coeffRef(index);
-    }
+  EIGEN_DEVICE_FUNC inline const Scalar& coeffRef(Index index) const { return m_expression.coeffRef(index); }
 
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<NestedExpressionType>&
-    nestedExpression() const
-    {
-      return m_expression;
-    }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<NestedExpressionType>& nestedExpression() const {
+    return m_expression;
+  }
 
-    /** Forwards the resizing request to the nested expression
-      * \sa DenseBase::resize(Index)  */
-    EIGEN_DEVICE_FUNC
-    void resize(Index newSize) { m_expression.resize(newSize); }
-    /** Forwards the resizing request to the nested expression
-      * \sa DenseBase::resize(Index,Index)*/
-    EIGEN_DEVICE_FUNC
-    void resize(Index rows, Index cols) { m_expression.resize(rows,cols); }
+  /** Forwards the resizing request to the nested expression
+   * \sa DenseBase::resize(Index)  */
+  EIGEN_DEVICE_FUNC void resize(Index newSize) { m_expression.resize(newSize); }
+  /** Forwards the resizing request to the nested expression
+   * \sa DenseBase::resize(Index,Index)*/
+  EIGEN_DEVICE_FUNC void resize(Index rows, Index cols) { m_expression.resize(rows, cols); }
 
-  protected:
-    NestedExpressionType m_expression;
+ protected:
+  NestedExpressionType m_expression;
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_ARRAYWRAPPER_H
+#endif  // EIGEN_ARRAYWRAPPER_H
diff --git a/Eigen/src/Core/Assign.h b/Eigen/src/Core/Assign.h
index 374558c..4b30f7b 100644
--- a/Eigen/src/Core/Assign.h
+++ b/Eigen/src/Core/Assign.h
@@ -17,77 +17,64 @@
 
 namespace Eigen {
 
-template<typename Derived>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>
-  ::lazyAssign(const DenseBase<OtherDerived>& other)
-{
-  enum{
-    SameType = internal::is_same<typename Derived::Scalar,typename OtherDerived::Scalar>::value
-  };
+template <typename Derived>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::lazyAssign(const DenseBase<OtherDerived>& other) {
+  enum { SameType = internal::is_same<typename Derived::Scalar, typename OtherDerived::Scalar>::value };
 
   EIGEN_STATIC_ASSERT_LVALUE(Derived)
-  EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Derived,OtherDerived)
-  EIGEN_STATIC_ASSERT(SameType,YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
+  EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Derived, OtherDerived)
+  EIGEN_STATIC_ASSERT(
+      SameType,
+      YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
 
   eigen_assert(rows() == other.rows() && cols() == other.cols());
-  internal::call_assignment_no_alias(derived(),other.derived());
-  
+  internal::call_assignment_no_alias(derived(), other.derived());
+
   return derived();
 }
 
-template<typename Derived>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC
-EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::operator=(const DenseBase<OtherDerived>& other)
-{
-  internal::call_assignment(derived(), other.derived());
-  return derived();
-}
-
-template<typename Derived>
-EIGEN_DEVICE_FUNC
-EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::operator=(const DenseBase& other)
-{
-  internal::call_assignment(derived(), other.derived());
-  return derived();
-}
-
-template<typename Derived>
-EIGEN_DEVICE_FUNC
-EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::operator=(const MatrixBase& other)
-{
-  internal::call_assignment(derived(), other.derived());
-  return derived();
-}
-
-template<typename Derived>
+template <typename Derived>
 template <typename OtherDerived>
-EIGEN_DEVICE_FUNC
-EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::operator=(const DenseBase<OtherDerived>& other)
-{
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::operator=(const DenseBase<OtherDerived>& other) {
   internal::call_assignment(derived(), other.derived());
   return derived();
 }
 
-template<typename Derived>
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::operator=(const DenseBase& other) {
+  internal::call_assignment(derived(), other.derived());
+  return derived();
+}
+
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::operator=(const MatrixBase& other) {
+  internal::call_assignment(derived(), other.derived());
+  return derived();
+}
+
+template <typename Derived>
 template <typename OtherDerived>
-EIGEN_DEVICE_FUNC
-EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::operator=(const EigenBase<OtherDerived>& other)
-{
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::operator=(const DenseBase<OtherDerived>& other) {
   internal::call_assignment(derived(), other.derived());
   return derived();
 }
 
-template<typename Derived>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC
-EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::operator=(const ReturnByValue<OtherDerived>& other)
-{
+template <typename Derived>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::operator=(const EigenBase<OtherDerived>& other) {
+  internal::call_assignment(derived(), other.derived());
+  return derived();
+}
+
+template <typename Derived>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::operator=(
+    const ReturnByValue<OtherDerived>& other) {
   other.derived().evalTo(derived());
   return derived();
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_ASSIGN_H
+#endif  // EIGEN_ASSIGN_H
diff --git a/Eigen/src/Core/AssignEvaluator.h b/Eigen/src/Core/AssignEvaluator.h
index 8d8dc2f..f7f0b23 100644
--- a/Eigen/src/Core/AssignEvaluator.h
+++ b/Eigen/src/Core/AssignEvaluator.h
@@ -22,23 +22,19 @@
 namespace internal {
 
 /***************************************************************************
-* Part 1 : the logic deciding a strategy for traversal and unrolling       *
-***************************************************************************/
+ * Part 1 : the logic deciding a strategy for traversal and unrolling       *
+ ***************************************************************************/
 
 // copy_using_evaluator_traits is based on assign_traits
 
 template <typename DstEvaluator, typename SrcEvaluator, typename AssignFunc, int MaxPacketSize = -1>
-struct copy_using_evaluator_traits
-{
+struct copy_using_evaluator_traits {
   typedef typename DstEvaluator::XprType Dst;
   typedef typename Dst::Scalar DstScalar;
 
-  enum {
-    DstFlags = DstEvaluator::Flags,
-    SrcFlags = SrcEvaluator::Flags
-  };
+  enum { DstFlags = DstEvaluator::Flags, SrcFlags = SrcEvaluator::Flags };
 
-public:
+ public:
   enum {
     DstAlignment = DstEvaluator::Alignment,
     SrcAlignment = SrcEvaluator::Alignment,
@@ -46,14 +42,14 @@
     JointAlignment = plain_enum_min(DstAlignment, SrcAlignment)
   };
 
-private:
+ private:
   enum {
     InnerSize = int(Dst::IsVectorAtCompileTime) ? int(Dst::SizeAtCompileTime)
-              : int(DstFlags)&RowMajorBit ? int(Dst::ColsAtCompileTime)
-              : int(Dst::RowsAtCompileTime),
+                : int(DstFlags) & RowMajorBit   ? int(Dst::ColsAtCompileTime)
+                                                : int(Dst::RowsAtCompileTime),
     InnerMaxSize = int(Dst::IsVectorAtCompileTime) ? int(Dst::MaxSizeAtCompileTime)
-              : int(DstFlags)&RowMajorBit ? int(Dst::MaxColsAtCompileTime)
-              : int(Dst::MaxRowsAtCompileTime),
+                   : int(DstFlags) & RowMajorBit   ? int(Dst::MaxColsAtCompileTime)
+                                                   : int(Dst::MaxRowsAtCompileTime),
     RestrictedInnerSize = min_size_prefer_fixed(InnerSize, MaxPacketSize),
     RestrictedLinearSize = min_size_prefer_fixed(Dst::SizeAtCompileTime, MaxPacketSize),
     OuterStride = int(outer_stride_at_compile_time<Dst>::ret),
@@ -61,104 +57,105 @@
   };
 
   // TODO distinguish between linear traversal and inner-traversals
-  typedef typename find_best_packet<DstScalar,RestrictedLinearSize>::type LinearPacketType;
-  typedef typename find_best_packet<DstScalar,RestrictedInnerSize>::type InnerPacketType;
+  typedef typename find_best_packet<DstScalar, RestrictedLinearSize>::type LinearPacketType;
+  typedef typename find_best_packet<DstScalar, RestrictedInnerSize>::type InnerPacketType;
 
   enum {
     LinearPacketSize = unpacket_traits<LinearPacketType>::size,
     InnerPacketSize = unpacket_traits<InnerPacketType>::size
   };
 
-public:
+ public:
   enum {
     LinearRequiredAlignment = unpacket_traits<LinearPacketType>::alignment,
     InnerRequiredAlignment = unpacket_traits<InnerPacketType>::alignment
   };
 
-private:
+ private:
   enum {
-    DstIsRowMajor = DstFlags&RowMajorBit,
-    SrcIsRowMajor = SrcFlags&RowMajorBit,
+    DstIsRowMajor = DstFlags & RowMajorBit,
+    SrcIsRowMajor = SrcFlags & RowMajorBit,
     StorageOrdersAgree = (int(DstIsRowMajor) == int(SrcIsRowMajor)),
-    MightVectorize = bool(StorageOrdersAgree)
-                  && (int(DstFlags) & int(SrcFlags) & ActualPacketAccessBit)
-                  && bool(functor_traits<AssignFunc>::PacketAccess),
-    MayInnerVectorize  = MightVectorize
-                       && int(InnerSize)!=Dynamic && int(InnerSize)%int(InnerPacketSize)==0
-                       && int(OuterStride)!=Dynamic && int(OuterStride)%int(InnerPacketSize)==0
-                       && (EIGEN_UNALIGNED_VECTORIZE  || int(JointAlignment)>=int(InnerRequiredAlignment)),
+    MightVectorize = bool(StorageOrdersAgree) && (int(DstFlags) & int(SrcFlags) & ActualPacketAccessBit) &&
+                     bool(functor_traits<AssignFunc>::PacketAccess),
+    MayInnerVectorize = MightVectorize && int(InnerSize) != Dynamic && int(InnerSize) % int(InnerPacketSize) == 0 &&
+                        int(OuterStride) != Dynamic && int(OuterStride) % int(InnerPacketSize) == 0 &&
+                        (EIGEN_UNALIGNED_VECTORIZE || int(JointAlignment) >= int(InnerRequiredAlignment)),
     MayLinearize = bool(StorageOrdersAgree) && (int(DstFlags) & int(SrcFlags) & LinearAccessBit),
-    MayLinearVectorize = bool(MightVectorize) && bool(MayLinearize) && bool(DstHasDirectAccess)
-                       && (EIGEN_UNALIGNED_VECTORIZE || (int(DstAlignment)>=int(LinearRequiredAlignment)) || MaxSizeAtCompileTime == Dynamic),
-      /* If the destination isn't aligned, we have to do runtime checks and we don't unroll,
-         so it's only good for large enough sizes. */
-    MaySliceVectorize  = bool(MightVectorize) && bool(DstHasDirectAccess)
-                       && (int(InnerMaxSize)==Dynamic || int(InnerMaxSize)>=(EIGEN_UNALIGNED_VECTORIZE?InnerPacketSize:(3*InnerPacketSize)))
-      /* slice vectorization can be slow, so we only want it if the slices are big, which is
-         indicated by InnerMaxSize rather than InnerSize, think of the case of a dynamic block
-         in a fixed-size matrix
-         However, with EIGEN_UNALIGNED_VECTORIZE and unrolling, slice vectorization is still worth it */
+    MayLinearVectorize = bool(MightVectorize) && bool(MayLinearize) && bool(DstHasDirectAccess) &&
+                         (EIGEN_UNALIGNED_VECTORIZE || (int(DstAlignment) >= int(LinearRequiredAlignment)) ||
+                          MaxSizeAtCompileTime == Dynamic),
+    /* If the destination isn't aligned, we have to do runtime checks and we don't unroll,
+       so it's only good for large enough sizes. */
+    MaySliceVectorize = bool(MightVectorize) && bool(DstHasDirectAccess) &&
+                        (int(InnerMaxSize) == Dynamic ||
+                         int(InnerMaxSize) >= (EIGEN_UNALIGNED_VECTORIZE ? InnerPacketSize : (3 * InnerPacketSize)))
+    /* slice vectorization can be slow, so we only want it if the slices are big, which is
+       indicated by InnerMaxSize rather than InnerSize, think of the case of a dynamic block
+       in a fixed-size matrix
+       However, with EIGEN_UNALIGNED_VECTORIZE and unrolling, slice vectorization is still worth it */
   };
 
-public:
+ public:
   enum {
-    Traversal =  int(Dst::SizeAtCompileTime) == 0 ? int(AllAtOnceTraversal) // If compile-size is zero, traversing will fail at compile-time.
-              : (int(MayLinearVectorize) && (LinearPacketSize>InnerPacketSize)) ? int(LinearVectorizedTraversal)
-              : int(MayInnerVectorize)   ? int(InnerVectorizedTraversal)
-              : int(MayLinearVectorize)  ? int(LinearVectorizedTraversal)
-              : int(MaySliceVectorize)   ? int(SliceVectorizedTraversal)
-              : int(MayLinearize)        ? int(LinearTraversal)
-                                         : int(DefaultTraversal),
-    Vectorized = int(Traversal) == InnerVectorizedTraversal
-              || int(Traversal) == LinearVectorizedTraversal
-              || int(Traversal) == SliceVectorizedTraversal
+    Traversal = int(Dst::SizeAtCompileTime) == 0
+                    ? int(AllAtOnceTraversal)  // If compile-size is zero, traversing will fail at compile-time.
+                : (int(MayLinearVectorize) && (LinearPacketSize > InnerPacketSize)) ? int(LinearVectorizedTraversal)
+                : int(MayInnerVectorize)                                            ? int(InnerVectorizedTraversal)
+                : int(MayLinearVectorize)                                           ? int(LinearVectorizedTraversal)
+                : int(MaySliceVectorize)                                            ? int(SliceVectorizedTraversal)
+                : int(MayLinearize)                                                 ? int(LinearTraversal)
+                                                                                    : int(DefaultTraversal),
+    Vectorized = int(Traversal) == InnerVectorizedTraversal || int(Traversal) == LinearVectorizedTraversal ||
+                 int(Traversal) == SliceVectorizedTraversal
   };
 
-  typedef std::conditional_t<int(Traversal)==LinearVectorizedTraversal, LinearPacketType, InnerPacketType> PacketType;
+  typedef std::conditional_t<int(Traversal) == LinearVectorizedTraversal, LinearPacketType, InnerPacketType> PacketType;
 
-private:
+ private:
   enum {
-    ActualPacketSize    = int(Traversal)==LinearVectorizedTraversal ? LinearPacketSize
-                        : Vectorized ? InnerPacketSize
-                        : 1,
-    UnrollingLimit      = EIGEN_UNROLLING_LIMIT * ActualPacketSize,
-    MayUnrollCompletely = int(Dst::SizeAtCompileTime) != Dynamic
-                       && int(Dst::SizeAtCompileTime) * (int(DstEvaluator::CoeffReadCost)+int(SrcEvaluator::CoeffReadCost)) <= int(UnrollingLimit),
-    MayUnrollInner      = int(InnerSize) != Dynamic
-                       && int(InnerSize) * (int(DstEvaluator::CoeffReadCost)+int(SrcEvaluator::CoeffReadCost)) <= int(UnrollingLimit)
+    ActualPacketSize = int(Traversal) == LinearVectorizedTraversal ? LinearPacketSize
+                       : Vectorized                                ? InnerPacketSize
+                                                                   : 1,
+    UnrollingLimit = EIGEN_UNROLLING_LIMIT * ActualPacketSize,
+    MayUnrollCompletely =
+        int(Dst::SizeAtCompileTime) != Dynamic &&
+        int(Dst::SizeAtCompileTime) * (int(DstEvaluator::CoeffReadCost) + int(SrcEvaluator::CoeffReadCost)) <=
+            int(UnrollingLimit),
+    MayUnrollInner =
+        int(InnerSize) != Dynamic &&
+        int(InnerSize) * (int(DstEvaluator::CoeffReadCost) + int(SrcEvaluator::CoeffReadCost)) <= int(UnrollingLimit)
   };
 
-public:
+ public:
   enum {
     Unrolling = (int(Traversal) == int(InnerVectorizedTraversal) || int(Traversal) == int(DefaultTraversal))
-                ? (
-                    int(MayUnrollCompletely) ? int(CompleteUnrolling)
-                  : int(MayUnrollInner)      ? int(InnerUnrolling)
-                                             : int(NoUnrolling)
-                  )
-              : int(Traversal) == int(LinearVectorizedTraversal)
-                ? ( bool(MayUnrollCompletely) && ( EIGEN_UNALIGNED_VECTORIZE || (int(DstAlignment)>=int(LinearRequiredAlignment)))
-                          ? int(CompleteUnrolling)
-                          : int(NoUnrolling) )
-              : int(Traversal) == int(LinearTraversal)
-                ? ( bool(MayUnrollCompletely) ? int(CompleteUnrolling)
-                                              : int(NoUnrolling) )
+                    ? (int(MayUnrollCompletely) ? int(CompleteUnrolling)
+                       : int(MayUnrollInner)    ? int(InnerUnrolling)
+                                                : int(NoUnrolling))
+                : int(Traversal) == int(LinearVectorizedTraversal)
+                    ? (bool(MayUnrollCompletely) &&
+                               (EIGEN_UNALIGNED_VECTORIZE || (int(DstAlignment) >= int(LinearRequiredAlignment)))
+                           ? int(CompleteUnrolling)
+                           : int(NoUnrolling))
+                : int(Traversal) == int(LinearTraversal)
+                    ? (bool(MayUnrollCompletely) ? int(CompleteUnrolling) : int(NoUnrolling))
 #if EIGEN_UNALIGNED_VECTORIZE
-              : int(Traversal) == int(SliceVectorizedTraversal)
-                ? ( bool(MayUnrollInner) ? int(InnerUnrolling)
-                                         : int(NoUnrolling) )
+                : int(Traversal) == int(SliceVectorizedTraversal)
+                    ? (bool(MayUnrollInner) ? int(InnerUnrolling) : int(NoUnrolling))
 #endif
-              : int(NoUnrolling)
+                    : int(NoUnrolling)
   };
 
 #ifdef EIGEN_DEBUG_ASSIGN
-  static void debug()
-  {
+  static void debug() {
     std::cerr << "DstXpr: " << typeid(typename DstEvaluator::XprType).name() << std::endl;
     std::cerr << "SrcXpr: " << typeid(typename SrcEvaluator::XprType).name() << std::endl;
     std::cerr.setf(std::ios::hex, std::ios::basefield);
-    std::cerr << "DstFlags" << " = " << DstFlags << " (" << demangle_flags(DstFlags) << " )" << std::endl;
-    std::cerr << "SrcFlags" << " = " << SrcFlags << " (" << demangle_flags(SrcFlags) << " )" << std::endl;
+    std::cerr << "DstFlags"
+              << " = " << DstFlags << " (" << demangle_flags(DstFlags) << " )" << std::endl;
+    std::cerr << "SrcFlags"
+              << " = " << SrcFlags << " (" << demangle_flags(SrcFlags) << " )" << std::endl;
     std::cerr.unsetf(std::ios::hex);
     EIGEN_DEBUG_VAR(DstAlignment)
     EIGEN_DEBUG_VAR(SrcAlignment)
@@ -176,95 +173,84 @@
     EIGEN_DEBUG_VAR(MayInnerVectorize)
     EIGEN_DEBUG_VAR(MayLinearVectorize)
     EIGEN_DEBUG_VAR(MaySliceVectorize)
-    std::cerr << "Traversal" << " = " << Traversal << " (" << demangle_traversal(Traversal) << ")" << std::endl;
+    std::cerr << "Traversal"
+              << " = " << Traversal << " (" << demangle_traversal(Traversal) << ")" << std::endl;
     EIGEN_DEBUG_VAR(SrcEvaluator::CoeffReadCost)
     EIGEN_DEBUG_VAR(DstEvaluator::CoeffReadCost)
     EIGEN_DEBUG_VAR(Dst::SizeAtCompileTime)
     EIGEN_DEBUG_VAR(UnrollingLimit)
     EIGEN_DEBUG_VAR(MayUnrollCompletely)
     EIGEN_DEBUG_VAR(MayUnrollInner)
-    std::cerr << "Unrolling" << " = " << Unrolling << " (" << demangle_unrolling(Unrolling) << ")" << std::endl;
+    std::cerr << "Unrolling"
+              << " = " << Unrolling << " (" << demangle_unrolling(Unrolling) << ")" << std::endl;
     std::cerr << std::endl;
   }
 #endif
 };
 
 /***************************************************************************
-* Part 2 : meta-unrollers
-***************************************************************************/
+ * Part 2 : meta-unrollers
+ ***************************************************************************/
 
 /************************
 *** Default traversal ***
 ************************/
 
-template<typename Kernel, int Index, int Stop>
-struct copy_using_evaluator_DefaultTraversal_CompleteUnrolling
-{
+template <typename Kernel, int Index, int Stop>
+struct copy_using_evaluator_DefaultTraversal_CompleteUnrolling {
   // FIXME: this is not very clean, perhaps this information should be provided by the kernel?
   typedef typename Kernel::DstEvaluatorType DstEvaluatorType;
   typedef typename DstEvaluatorType::XprType DstXprType;
 
-  enum {
-    outer = Index / DstXprType::InnerSizeAtCompileTime,
-    inner = Index % DstXprType::InnerSizeAtCompileTime
-  };
+  enum { outer = Index / DstXprType::InnerSizeAtCompileTime, inner = Index % DstXprType::InnerSizeAtCompileTime };
 
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel)
-  {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel& kernel) {
     kernel.assignCoeffByOuterInner(outer, inner);
-    copy_using_evaluator_DefaultTraversal_CompleteUnrolling<Kernel, Index+1, Stop>::run(kernel);
+    copy_using_evaluator_DefaultTraversal_CompleteUnrolling<Kernel, Index + 1, Stop>::run(kernel);
   }
 };
 
-template<typename Kernel, int Stop>
-struct copy_using_evaluator_DefaultTraversal_CompleteUnrolling<Kernel, Stop, Stop>
-{
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void run(Kernel&) { }
+template <typename Kernel, int Stop>
+struct copy_using_evaluator_DefaultTraversal_CompleteUnrolling<Kernel, Stop, Stop> {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void run(Kernel&) {}
 };
 
-template<typename Kernel, int Index_, int Stop>
-struct copy_using_evaluator_DefaultTraversal_InnerUnrolling
-{
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel, Index outer)
-  {
+template <typename Kernel, int Index_, int Stop>
+struct copy_using_evaluator_DefaultTraversal_InnerUnrolling {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel& kernel, Index outer) {
     kernel.assignCoeffByOuterInner(outer, Index_);
-    copy_using_evaluator_DefaultTraversal_InnerUnrolling<Kernel, Index_+1, Stop>::run(kernel, outer);
+    copy_using_evaluator_DefaultTraversal_InnerUnrolling<Kernel, Index_ + 1, Stop>::run(kernel, outer);
   }
 };
 
-template<typename Kernel, int Stop>
-struct copy_using_evaluator_DefaultTraversal_InnerUnrolling<Kernel, Stop, Stop>
-{
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel&, Index) { }
+template <typename Kernel, int Stop>
+struct copy_using_evaluator_DefaultTraversal_InnerUnrolling<Kernel, Stop, Stop> {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel&, Index) {}
 };
 
 /***********************
 *** Linear traversal ***
 ***********************/
 
-template<typename Kernel, int Index, int Stop>
-struct copy_using_evaluator_LinearTraversal_CompleteUnrolling
-{
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel& kernel)
-  {
+template <typename Kernel, int Index, int Stop>
+struct copy_using_evaluator_LinearTraversal_CompleteUnrolling {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel& kernel) {
     kernel.assignCoeff(Index);
-    copy_using_evaluator_LinearTraversal_CompleteUnrolling<Kernel, Index+1, Stop>::run(kernel);
+    copy_using_evaluator_LinearTraversal_CompleteUnrolling<Kernel, Index + 1, Stop>::run(kernel);
   }
 };
 
-template<typename Kernel, int Stop>
-struct copy_using_evaluator_LinearTraversal_CompleteUnrolling<Kernel, Stop, Stop>
-{
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel&) { }
+template <typename Kernel, int Stop>
+struct copy_using_evaluator_LinearTraversal_CompleteUnrolling<Kernel, Stop, Stop> {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel&) {}
 };
 
 /**************************
 *** Inner vectorization ***
 **************************/
 
-template<typename Kernel, int Index, int Stop>
-struct copy_using_evaluator_innervec_CompleteUnrolling
-{
+template <typename Kernel, int Index, int Stop>
+struct copy_using_evaluator_innervec_CompleteUnrolling {
   // FIXME: this is not very clean, perhaps this information should be provided by the kernel?
   typedef typename Kernel::DstEvaluatorType DstEvaluatorType;
   typedef typename DstEvaluatorType::XprType DstXprType;
@@ -277,47 +263,42 @@
     DstAlignment = Kernel::AssignmentTraits::DstAlignment
   };
 
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel)
-  {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel& kernel) {
     kernel.template assignPacketByOuterInner<DstAlignment, SrcAlignment, PacketType>(outer, inner);
     enum { NextIndex = Index + unpacket_traits<PacketType>::size };
     copy_using_evaluator_innervec_CompleteUnrolling<Kernel, NextIndex, Stop>::run(kernel);
   }
 };
 
-template<typename Kernel, int Stop>
-struct copy_using_evaluator_innervec_CompleteUnrolling<Kernel, Stop, Stop>
-{
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void run(Kernel&) { }
+template <typename Kernel, int Stop>
+struct copy_using_evaluator_innervec_CompleteUnrolling<Kernel, Stop, Stop> {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void run(Kernel&) {}
 };
 
-template<typename Kernel, int Index_, int Stop, int SrcAlignment, int DstAlignment>
-struct copy_using_evaluator_innervec_InnerUnrolling
-{
+template <typename Kernel, int Index_, int Stop, int SrcAlignment, int DstAlignment>
+struct copy_using_evaluator_innervec_InnerUnrolling {
   typedef typename Kernel::PacketType PacketType;
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel, Index outer)
-  {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel& kernel, Index outer) {
     kernel.template assignPacketByOuterInner<DstAlignment, SrcAlignment, PacketType>(outer, Index_);
     enum { NextIndex = Index_ + unpacket_traits<PacketType>::size };
-    copy_using_evaluator_innervec_InnerUnrolling<Kernel, NextIndex, Stop, SrcAlignment, DstAlignment>::run(kernel, outer);
+    copy_using_evaluator_innervec_InnerUnrolling<Kernel, NextIndex, Stop, SrcAlignment, DstAlignment>::run(kernel,
+                                                                                                           outer);
   }
 };
 
-template<typename Kernel, int Stop, int SrcAlignment, int DstAlignment>
-struct copy_using_evaluator_innervec_InnerUnrolling<Kernel, Stop, Stop, SrcAlignment, DstAlignment>
-{
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &, Index) { }
+template <typename Kernel, int Stop, int SrcAlignment, int DstAlignment>
+struct copy_using_evaluator_innervec_InnerUnrolling<Kernel, Stop, Stop, SrcAlignment, DstAlignment> {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel&, Index) {}
 };
 
 /***************************************************************************
-* Part 3 : implementation of all cases
-***************************************************************************/
+ * Part 3 : implementation of all cases
+ ***************************************************************************/
 
 // dense_assignment_loop is based on assign_impl
 
-template<typename Kernel,
-         int Traversal = Kernel::AssignmentTraits::Traversal,
-         int Unrolling = Kernel::AssignmentTraits::Unrolling>
+template <typename Kernel, int Traversal = Kernel::AssignmentTraits::Traversal,
+          int Unrolling = Kernel::AssignmentTraits::Unrolling>
 struct dense_assignment_loop;
 
 /************************
@@ -325,13 +306,11 @@
 ************************/
 
 // Zero-sized assignment is a no-op.
-template<typename Kernel, int Unrolling>
-struct dense_assignment_loop<Kernel, AllAtOnceTraversal, Unrolling>
-{
-  EIGEN_DEVICE_FUNC static void EIGEN_STRONG_INLINE EIGEN_CONSTEXPR run(Kernel& /*kernel*/)
-  {
+template <typename Kernel, int Unrolling>
+struct dense_assignment_loop<Kernel, AllAtOnceTraversal, Unrolling> {
+  EIGEN_DEVICE_FUNC static void EIGEN_STRONG_INLINE EIGEN_CONSTEXPR run(Kernel& /*kernel*/) {
     EIGEN_STATIC_ASSERT(int(Kernel::DstEvaluatorType::XprType::SizeAtCompileTime) == 0,
-      EIGEN_INTERNAL_ERROR_PLEASE_FILE_A_BUG_REPORT)
+                        EIGEN_INTERNAL_ERROR_PLEASE_FILE_A_BUG_REPORT)
   }
 };
 
@@ -339,39 +318,34 @@
 *** Default traversal ***
 ************************/
 
-template<typename Kernel>
-struct dense_assignment_loop<Kernel, DefaultTraversal, NoUnrolling>
-{
-  EIGEN_DEVICE_FUNC static void EIGEN_STRONG_INLINE run(Kernel &kernel)
-  {
-    for(Index outer = 0; outer < kernel.outerSize(); ++outer) {
-      for(Index inner = 0; inner < kernel.innerSize(); ++inner) {
+template <typename Kernel>
+struct dense_assignment_loop<Kernel, DefaultTraversal, NoUnrolling> {
+  EIGEN_DEVICE_FUNC static void EIGEN_STRONG_INLINE run(Kernel& kernel) {
+    for (Index outer = 0; outer < kernel.outerSize(); ++outer) {
+      for (Index inner = 0; inner < kernel.innerSize(); ++inner) {
         kernel.assignCoeffByOuterInner(outer, inner);
       }
     }
   }
 };
 
-template<typename Kernel>
-struct dense_assignment_loop<Kernel, DefaultTraversal, CompleteUnrolling>
-{
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel)
-  {
+template <typename Kernel>
+struct dense_assignment_loop<Kernel, DefaultTraversal, CompleteUnrolling> {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel& kernel) {
     typedef typename Kernel::DstEvaluatorType::XprType DstXprType;
     copy_using_evaluator_DefaultTraversal_CompleteUnrolling<Kernel, 0, DstXprType::SizeAtCompileTime>::run(kernel);
   }
 };
 
-template<typename Kernel>
-struct dense_assignment_loop<Kernel, DefaultTraversal, InnerUnrolling>
-{
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel)
-  {
+template <typename Kernel>
+struct dense_assignment_loop<Kernel, DefaultTraversal, InnerUnrolling> {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel& kernel) {
     typedef typename Kernel::DstEvaluatorType::XprType DstXprType;
 
     const Index outerSize = kernel.outerSize();
-    for(Index outer = 0; outer < outerSize; ++outer)
-      copy_using_evaluator_DefaultTraversal_InnerUnrolling<Kernel, 0, DstXprType::InnerSizeAtCompileTime>::run(kernel, outer);
+    for (Index outer = 0; outer < outerSize; ++outer)
+      copy_using_evaluator_DefaultTraversal_InnerUnrolling<Kernel, 0, DstXprType::InnerSizeAtCompileTime>::run(kernel,
+                                                                                                               outer);
   }
 };
 
@@ -379,38 +353,30 @@
 *** Linear vectorization ***
 ***************************/
 
-
 // The goal of unaligned_dense_assignment_loop is simply to factorize the handling
 // of the non vectorizable beginning and ending parts
 
 template <bool IsAligned = false>
-struct unaligned_dense_assignment_loop
-{
+struct unaligned_dense_assignment_loop {
   // if IsAligned = true, then do nothing
   template <typename Kernel>
   EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void run(Kernel&, Index, Index) {}
 };
 
 template <>
-struct unaligned_dense_assignment_loop<false>
-{
+struct unaligned_dense_assignment_loop<false> {
   // MSVC must not inline this functions. If it does, it fails to optimize the
   // packet access path.
   // FIXME check which version exhibits this issue
 #if EIGEN_COMP_MSVC
   template <typename Kernel>
-  static EIGEN_DONT_INLINE void run(Kernel &kernel,
-                                    Index start,
-                                    Index end)
+  static EIGEN_DONT_INLINE void run(Kernel& kernel, Index start, Index end)
 #else
   template <typename Kernel>
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void run(Kernel &kernel,
-                                      Index start,
-                                      Index end)
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void run(Kernel& kernel, Index start, Index end)
 #endif
   {
-    for (Index index = start; index < end; ++index)
-      kernel.assignCoeff(index);
+    for (Index index = start; index < end; ++index) kernel.assignCoeff(index);
   }
 };
 
@@ -421,10 +387,7 @@
   typedef typename DstEvaluatorType::XprType DstXprType;
   typedef typename Kernel::PacketType PacketType;
 
-  enum {
-    SrcAlignment = Kernel::AssignmentTraits::SrcAlignment,
-    DstAlignment = Kernel::AssignmentTraits::DstAlignment
-  };
+  enum { SrcAlignment = Kernel::AssignmentTraits::SrcAlignment, DstAlignment = Kernel::AssignmentTraits::DstAlignment };
 
   EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel& kernel) {
     kernel.template assignPacket<DstAlignment, SrcAlignment, PacketType>(Index);
@@ -438,45 +401,44 @@
   EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void run(Kernel&) {}
 };
 
-template<typename Kernel>
-struct dense_assignment_loop<Kernel, LinearVectorizedTraversal, NoUnrolling>
-{
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void run(Kernel &kernel)
-  {
+template <typename Kernel>
+struct dense_assignment_loop<Kernel, LinearVectorizedTraversal, NoUnrolling> {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void run(Kernel& kernel) {
     const Index size = kernel.size();
     typedef typename Kernel::Scalar Scalar;
     typedef typename Kernel::PacketType PacketType;
     enum {
       requestedAlignment = Kernel::AssignmentTraits::LinearRequiredAlignment,
       packetSize = unpacket_traits<PacketType>::size,
-      dstIsAligned = int(Kernel::AssignmentTraits::DstAlignment)>=int(requestedAlignment),
+      dstIsAligned = int(Kernel::AssignmentTraits::DstAlignment) >= int(requestedAlignment),
       dstAlignment = packet_traits<Scalar>::AlignedOnScalar ? int(requestedAlignment)
                                                             : int(Kernel::AssignmentTraits::DstAlignment),
       srcAlignment = Kernel::AssignmentTraits::JointAlignment
     };
-    const Index alignedStart = dstIsAligned ? 0 : internal::first_aligned<requestedAlignment>(kernel.dstDataPtr(), size);
-    const Index alignedEnd = alignedStart + ((size-alignedStart)/packetSize)*packetSize;
+    const Index alignedStart =
+        dstIsAligned ? 0 : internal::first_aligned<requestedAlignment>(kernel.dstDataPtr(), size);
+    const Index alignedEnd = alignedStart + ((size - alignedStart) / packetSize) * packetSize;
 
-    unaligned_dense_assignment_loop<dstIsAligned!=0>::run(kernel, 0, alignedStart);
+    unaligned_dense_assignment_loop<dstIsAligned != 0>::run(kernel, 0, alignedStart);
 
-    for(Index index = alignedStart; index < alignedEnd; index += packetSize)
+    for (Index index = alignedStart; index < alignedEnd; index += packetSize)
       kernel.template assignPacket<dstAlignment, srcAlignment, PacketType>(index);
 
     unaligned_dense_assignment_loop<>::run(kernel, alignedEnd, size);
   }
 };
 
-template<typename Kernel>
-struct dense_assignment_loop<Kernel, LinearVectorizedTraversal, CompleteUnrolling>
-{
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void run(Kernel &kernel)
-  {
+template <typename Kernel>
+struct dense_assignment_loop<Kernel, LinearVectorizedTraversal, CompleteUnrolling> {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void run(Kernel& kernel) {
     typedef typename Kernel::DstEvaluatorType::XprType DstXprType;
     typedef typename Kernel::PacketType PacketType;
 
-    enum { size = DstXprType::SizeAtCompileTime,
-           packetSize =unpacket_traits<PacketType>::size,
-           alignedSize = (int(size)/packetSize)*packetSize };
+    enum {
+      size = DstXprType::SizeAtCompileTime,
+      packetSize = unpacket_traits<PacketType>::size,
+      alignedSize = (int(size) / packetSize) * packetSize
+    };
 
     copy_using_evaluator_linearvec_CompleteUnrolling<Kernel, 0, alignedSize>::run(kernel);
     copy_using_evaluator_LinearTraversal_CompleteUnrolling<Kernel, alignedSize, size>::run(kernel);
@@ -487,46 +449,37 @@
 *** Inner vectorization ***
 **************************/
 
-template<typename Kernel>
-struct dense_assignment_loop<Kernel, InnerVectorizedTraversal, NoUnrolling>
-{
+template <typename Kernel>
+struct dense_assignment_loop<Kernel, InnerVectorizedTraversal, NoUnrolling> {
   typedef typename Kernel::PacketType PacketType;
-  enum {
-    SrcAlignment = Kernel::AssignmentTraits::SrcAlignment,
-    DstAlignment = Kernel::AssignmentTraits::DstAlignment
-  };
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void run(Kernel &kernel)
-  {
+  enum { SrcAlignment = Kernel::AssignmentTraits::SrcAlignment, DstAlignment = Kernel::AssignmentTraits::DstAlignment };
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void run(Kernel& kernel) {
     const Index innerSize = kernel.innerSize();
     const Index outerSize = kernel.outerSize();
     const Index packetSize = unpacket_traits<PacketType>::size;
-    for(Index outer = 0; outer < outerSize; ++outer)
-      for(Index inner = 0; inner < innerSize; inner+=packetSize)
+    for (Index outer = 0; outer < outerSize; ++outer)
+      for (Index inner = 0; inner < innerSize; inner += packetSize)
         kernel.template assignPacketByOuterInner<DstAlignment, SrcAlignment, PacketType>(outer, inner);
   }
 };
 
-template<typename Kernel>
-struct dense_assignment_loop<Kernel, InnerVectorizedTraversal, CompleteUnrolling>
-{
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel)
-  {
+template <typename Kernel>
+struct dense_assignment_loop<Kernel, InnerVectorizedTraversal, CompleteUnrolling> {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel& kernel) {
     typedef typename Kernel::DstEvaluatorType::XprType DstXprType;
     copy_using_evaluator_innervec_CompleteUnrolling<Kernel, 0, DstXprType::SizeAtCompileTime>::run(kernel);
   }
 };
 
-template<typename Kernel>
-struct dense_assignment_loop<Kernel, InnerVectorizedTraversal, InnerUnrolling>
-{
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel)
-  {
+template <typename Kernel>
+struct dense_assignment_loop<Kernel, InnerVectorizedTraversal, InnerUnrolling> {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel& kernel) {
     typedef typename Kernel::DstEvaluatorType::XprType DstXprType;
     typedef typename Kernel::AssignmentTraits Traits;
     const Index outerSize = kernel.outerSize();
-    for(Index outer = 0; outer < outerSize; ++outer)
-      copy_using_evaluator_innervec_InnerUnrolling<Kernel, 0, DstXprType::InnerSizeAtCompileTime,
-                                                   Traits::SrcAlignment, Traits::DstAlignment>::run(kernel, outer);
+    for (Index outer = 0; outer < outerSize; ++outer)
+      copy_using_evaluator_innervec_InnerUnrolling<Kernel, 0, DstXprType::InnerSizeAtCompileTime, Traits::SrcAlignment,
+                                                   Traits::DstAlignment>::run(kernel, outer);
   }
 };
 
@@ -534,22 +487,17 @@
 *** Linear traversal ***
 ***********************/
 
-template<typename Kernel>
-struct dense_assignment_loop<Kernel, LinearTraversal, NoUnrolling>
-{
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void run(Kernel &kernel)
-  {
+template <typename Kernel>
+struct dense_assignment_loop<Kernel, LinearTraversal, NoUnrolling> {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void run(Kernel& kernel) {
     const Index size = kernel.size();
-    for(Index i = 0; i < size; ++i)
-      kernel.assignCoeff(i);
+    for (Index i = 0; i < size; ++i) kernel.assignCoeff(i);
   }
 };
 
-template<typename Kernel>
-struct dense_assignment_loop<Kernel, LinearTraversal, CompleteUnrolling>
-{
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void run(Kernel &kernel)
-  {
+template <typename Kernel>
+struct dense_assignment_loop<Kernel, LinearTraversal, CompleteUnrolling> {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void run(Kernel& kernel) {
     typedef typename Kernel::DstEvaluatorType::XprType DstXprType;
     copy_using_evaluator_LinearTraversal_CompleteUnrolling<Kernel, 0, DstXprType::SizeAtCompileTime>::run(kernel);
   }
@@ -559,69 +507,63 @@
 *** Slice vectorization ***
 ***************************/
 
-template<typename Kernel>
-struct dense_assignment_loop<Kernel, SliceVectorizedTraversal, NoUnrolling>
-{
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void run(Kernel &kernel)
-  {
+template <typename Kernel>
+struct dense_assignment_loop<Kernel, SliceVectorizedTraversal, NoUnrolling> {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void run(Kernel& kernel) {
     typedef typename Kernel::Scalar Scalar;
     typedef typename Kernel::PacketType PacketType;
     enum {
       packetSize = unpacket_traits<PacketType>::size,
       requestedAlignment = int(Kernel::AssignmentTraits::InnerRequiredAlignment),
-      alignable = packet_traits<Scalar>::AlignedOnScalar || int(Kernel::AssignmentTraits::DstAlignment)>=sizeof(Scalar),
-      dstIsAligned = int(Kernel::AssignmentTraits::DstAlignment)>=int(requestedAlignment),
-      dstAlignment = alignable ? int(requestedAlignment)
-                               : int(Kernel::AssignmentTraits::DstAlignment)
+      alignable =
+          packet_traits<Scalar>::AlignedOnScalar || int(Kernel::AssignmentTraits::DstAlignment) >= sizeof(Scalar),
+      dstIsAligned = int(Kernel::AssignmentTraits::DstAlignment) >= int(requestedAlignment),
+      dstAlignment = alignable ? int(requestedAlignment) : int(Kernel::AssignmentTraits::DstAlignment)
     };
-    const Scalar *dst_ptr = kernel.dstDataPtr();
-    if((!bool(dstIsAligned)) && (std::uintptr_t(dst_ptr) % sizeof(Scalar))>0)
-    {
+    const Scalar* dst_ptr = kernel.dstDataPtr();
+    if ((!bool(dstIsAligned)) && (std::uintptr_t(dst_ptr) % sizeof(Scalar)) > 0) {
       // the pointer is not aligned-on scalar, so alignment is not possible
-      return dense_assignment_loop<Kernel,DefaultTraversal,NoUnrolling>::run(kernel);
+      return dense_assignment_loop<Kernel, DefaultTraversal, NoUnrolling>::run(kernel);
     }
     const Index packetAlignedMask = packetSize - 1;
     const Index innerSize = kernel.innerSize();
     const Index outerSize = kernel.outerSize();
     const Index alignedStep = alignable ? (packetSize - kernel.outerStride() % packetSize) & packetAlignedMask : 0;
-    Index alignedStart = ((!alignable) || bool(dstIsAligned)) ? 0 : internal::first_aligned<requestedAlignment>(dst_ptr, innerSize);
+    Index alignedStart =
+        ((!alignable) || bool(dstIsAligned)) ? 0 : internal::first_aligned<requestedAlignment>(dst_ptr, innerSize);
 
-    for(Index outer = 0; outer < outerSize; ++outer)
-    {
-      const Index alignedEnd = alignedStart + ((innerSize-alignedStart) & ~packetAlignedMask);
+    for (Index outer = 0; outer < outerSize; ++outer) {
+      const Index alignedEnd = alignedStart + ((innerSize - alignedStart) & ~packetAlignedMask);
       // do the non-vectorizable part of the assignment
-      for(Index inner = 0; inner<alignedStart ; ++inner)
-        kernel.assignCoeffByOuterInner(outer, inner);
+      for (Index inner = 0; inner < alignedStart; ++inner) kernel.assignCoeffByOuterInner(outer, inner);
 
       // do the vectorizable part of the assignment
-      for(Index inner = alignedStart; inner<alignedEnd; inner+=packetSize)
+      for (Index inner = alignedStart; inner < alignedEnd; inner += packetSize)
         kernel.template assignPacketByOuterInner<dstAlignment, Unaligned, PacketType>(outer, inner);
 
       // do the non-vectorizable part of the assignment
-      for(Index inner = alignedEnd; inner<innerSize ; ++inner)
-        kernel.assignCoeffByOuterInner(outer, inner);
+      for (Index inner = alignedEnd; inner < innerSize; ++inner) kernel.assignCoeffByOuterInner(outer, inner);
 
-      alignedStart = numext::mini((alignedStart+alignedStep)%packetSize, innerSize);
+      alignedStart = numext::mini((alignedStart + alignedStep) % packetSize, innerSize);
     }
   }
 };
 
 #if EIGEN_UNALIGNED_VECTORIZE
-template<typename Kernel>
-struct dense_assignment_loop<Kernel, SliceVectorizedTraversal, InnerUnrolling>
-{
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void run(Kernel &kernel)
-  {
+template <typename Kernel>
+struct dense_assignment_loop<Kernel, SliceVectorizedTraversal, InnerUnrolling> {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void run(Kernel& kernel) {
     typedef typename Kernel::DstEvaluatorType::XprType DstXprType;
     typedef typename Kernel::PacketType PacketType;
 
-    enum { innerSize = DstXprType::InnerSizeAtCompileTime,
-           packetSize =unpacket_traits<PacketType>::size,
-           vectorizableSize = (int(innerSize) / int(packetSize)) * int(packetSize),
-           size = DstXprType::SizeAtCompileTime };
+    enum {
+      innerSize = DstXprType::InnerSizeAtCompileTime,
+      packetSize = unpacket_traits<PacketType>::size,
+      vectorizableSize = (int(innerSize) / int(packetSize)) * int(packetSize),
+      size = DstXprType::SizeAtCompileTime
+    };
 
-    for(Index outer = 0; outer < kernel.outerSize(); ++outer)
-    {
+    for (Index outer = 0; outer < kernel.outerSize(); ++outer) {
       copy_using_evaluator_innervec_InnerUnrolling<Kernel, 0, vectorizableSize, 0, 0>::run(kernel, outer);
       copy_using_evaluator_DefaultTraversal_InnerUnrolling<Kernel, vectorizableSize, innerSize>::run(kernel, outer);
     }
@@ -629,10 +571,9 @@
 };
 #endif
 
-
 /***************************************************************************
-* Part 4 : Generic dense assignment kernel
-***************************************************************************/
+ * Part 4 : Generic dense assignment kernel
+ ***************************************************************************/
 
 // This class generalize the assignment of a coefficient (or packet) from one dense evaluator
 // to another dense writable evaluator.
@@ -640,28 +581,26 @@
 // This abstraction level permits to keep the evaluation loops as simple and as generic as possible.
 // One can customize the assignment using this generic dense_assignment_kernel with different
 // functors, or by completely overloading it, by-passing a functor.
-template<typename DstEvaluatorTypeT, typename SrcEvaluatorTypeT, typename Functor, int Version = Specialized>
-class generic_dense_assignment_kernel
-{
-protected:
+template <typename DstEvaluatorTypeT, typename SrcEvaluatorTypeT, typename Functor, int Version = Specialized>
+class generic_dense_assignment_kernel {
+ protected:
   typedef typename DstEvaluatorTypeT::XprType DstXprType;
   typedef typename SrcEvaluatorTypeT::XprType SrcXprType;
-public:
 
+ public:
   typedef DstEvaluatorTypeT DstEvaluatorType;
   typedef SrcEvaluatorTypeT SrcEvaluatorType;
   typedef typename DstEvaluatorType::Scalar Scalar;
   typedef copy_using_evaluator_traits<DstEvaluatorTypeT, SrcEvaluatorTypeT, Functor> AssignmentTraits;
   typedef typename AssignmentTraits::PacketType PacketType;
 
-
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  generic_dense_assignment_kernel(DstEvaluatorType &dst, const SrcEvaluatorType &src, const Functor &func, DstXprType& dstExpr)
-    : m_dst(dst), m_src(src), m_functor(func), m_dstExpr(dstExpr)
-  {
-    #ifdef EIGEN_DEBUG_ASSIGN
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE generic_dense_assignment_kernel(DstEvaluatorType& dst,
+                                                                        const SrcEvaluatorType& src,
+                                                                        const Functor& func, DstXprType& dstExpr)
+      : m_dst(dst), m_src(src), m_functor(func), m_dstExpr(dstExpr) {
+#ifdef EIGEN_DEBUG_ASSIGN
     AssignmentTraits::debug();
-    #endif
+#endif
   }
 
   EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index size() const EIGEN_NOEXCEPT { return m_dstExpr.size(); }
@@ -675,73 +614,62 @@
   EIGEN_DEVICE_FUNC const SrcEvaluatorType& srcEvaluator() const EIGEN_NOEXCEPT { return m_src; }
 
   /// Assign src(row,col) to dst(row,col) through the assignment functor.
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(Index row, Index col)
-  {
-    m_functor.assignCoeff(m_dst.coeffRef(row,col), m_src.coeff(row,col));
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(Index row, Index col) {
+    m_functor.assignCoeff(m_dst.coeffRef(row, col), m_src.coeff(row, col));
   }
 
   /// \sa assignCoeff(Index,Index)
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(Index index)
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(Index index) {
     m_functor.assignCoeff(m_dst.coeffRef(index), m_src.coeff(index));
   }
 
   /// \sa assignCoeff(Index,Index)
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeffByOuterInner(Index outer, Index inner)
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeffByOuterInner(Index outer, Index inner) {
     Index row = rowIndexByOuterInner(outer, inner);
     Index col = colIndexByOuterInner(outer, inner);
     assignCoeff(row, col);
   }
 
-
-  template<int StoreMode, int LoadMode, typename Packet>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignPacket(Index row, Index col)
-  {
-    m_functor.template assignPacket<StoreMode>(&m_dst.coeffRef(row,col), m_src.template packet<LoadMode,Packet>(row,col));
+  template <int StoreMode, int LoadMode, typename Packet>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignPacket(Index row, Index col) {
+    m_functor.template assignPacket<StoreMode>(&m_dst.coeffRef(row, col),
+                                               m_src.template packet<LoadMode, Packet>(row, col));
   }
 
-  template<int StoreMode, int LoadMode, typename Packet>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignPacket(Index index)
-  {
-    m_functor.template assignPacket<StoreMode>(&m_dst.coeffRef(index), m_src.template packet<LoadMode,Packet>(index));
+  template <int StoreMode, int LoadMode, typename Packet>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignPacket(Index index) {
+    m_functor.template assignPacket<StoreMode>(&m_dst.coeffRef(index), m_src.template packet<LoadMode, Packet>(index));
   }
 
-  template<int StoreMode, int LoadMode, typename Packet>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignPacketByOuterInner(Index outer, Index inner)
-  {
+  template <int StoreMode, int LoadMode, typename Packet>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignPacketByOuterInner(Index outer, Index inner) {
     Index row = rowIndexByOuterInner(outer, inner);
     Index col = colIndexByOuterInner(outer, inner);
-    assignPacket<StoreMode,LoadMode,Packet>(row, col);
+    assignPacket<StoreMode, LoadMode, Packet>(row, col);
   }
 
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Index rowIndexByOuterInner(Index outer, Index inner)
-  {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Index rowIndexByOuterInner(Index outer, Index inner) {
     typedef typename DstEvaluatorType::ExpressionTraits Traits;
-    return int(Traits::RowsAtCompileTime) == 1 ? 0
-      : int(Traits::ColsAtCompileTime) == 1 ? inner
-      : int(DstEvaluatorType::Flags)&RowMajorBit ? outer
-      : inner;
+    return int(Traits::RowsAtCompileTime) == 1          ? 0
+           : int(Traits::ColsAtCompileTime) == 1        ? inner
+           : int(DstEvaluatorType::Flags) & RowMajorBit ? outer
+                                                        : inner;
   }
 
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Index colIndexByOuterInner(Index outer, Index inner)
-  {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Index colIndexByOuterInner(Index outer, Index inner) {
     typedef typename DstEvaluatorType::ExpressionTraits Traits;
-    return int(Traits::ColsAtCompileTime) == 1 ? 0
-      : int(Traits::RowsAtCompileTime) == 1 ? inner
-      : int(DstEvaluatorType::Flags)&RowMajorBit ? inner
-      : outer;
+    return int(Traits::ColsAtCompileTime) == 1          ? 0
+           : int(Traits::RowsAtCompileTime) == 1        ? inner
+           : int(DstEvaluatorType::Flags) & RowMajorBit ? inner
+                                                        : outer;
   }
 
-  EIGEN_DEVICE_FUNC const Scalar* dstDataPtr() const
-  {
-    return m_dstExpr.data();
-  }
+  EIGEN_DEVICE_FUNC const Scalar* dstDataPtr() const { return m_dstExpr.data(); }
 
-protected:
+ protected:
   DstEvaluatorType& m_dst;
   const SrcEvaluatorType& m_src;
-  const Functor &m_functor;
+  const Functor& m_functor;
   // TODO find a way to avoid the needs of the original expression
   DstXprType& m_dstExpr;
 };
@@ -750,50 +678,48 @@
 // PacketSize used is no larger than 4, thereby increasing the chance that vectorized instructions will be used
 // when computing the product.
 
-template<typename DstEvaluatorTypeT, typename SrcEvaluatorTypeT, typename Functor>
-class restricted_packet_dense_assignment_kernel : public generic_dense_assignment_kernel<DstEvaluatorTypeT, SrcEvaluatorTypeT, Functor, BuiltIn>
-{
-protected:
+template <typename DstEvaluatorTypeT, typename SrcEvaluatorTypeT, typename Functor>
+class restricted_packet_dense_assignment_kernel
+    : public generic_dense_assignment_kernel<DstEvaluatorTypeT, SrcEvaluatorTypeT, Functor, BuiltIn> {
+ protected:
   typedef generic_dense_assignment_kernel<DstEvaluatorTypeT, SrcEvaluatorTypeT, Functor, BuiltIn> Base;
- public:
-    typedef typename Base::Scalar Scalar;
-    typedef typename Base::DstXprType DstXprType;
-    typedef copy_using_evaluator_traits<DstEvaluatorTypeT, SrcEvaluatorTypeT, Functor, 4> AssignmentTraits;
-    typedef typename AssignmentTraits::PacketType PacketType;
 
-    EIGEN_DEVICE_FUNC restricted_packet_dense_assignment_kernel(DstEvaluatorTypeT &dst, const SrcEvaluatorTypeT &src, const Functor &func, DstXprType& dstExpr)
-    : Base(dst, src, func, dstExpr)
-  {
-  }
- };
+ public:
+  typedef typename Base::Scalar Scalar;
+  typedef typename Base::DstXprType DstXprType;
+  typedef copy_using_evaluator_traits<DstEvaluatorTypeT, SrcEvaluatorTypeT, Functor, 4> AssignmentTraits;
+  typedef typename AssignmentTraits::PacketType PacketType;
+
+  EIGEN_DEVICE_FUNC restricted_packet_dense_assignment_kernel(DstEvaluatorTypeT& dst, const SrcEvaluatorTypeT& src,
+                                                              const Functor& func, DstXprType& dstExpr)
+      : Base(dst, src, func, dstExpr) {}
+};
 
 /***************************************************************************
-* Part 5 : Entry point for dense rectangular assignment
-***************************************************************************/
+ * Part 5 : Entry point for dense rectangular assignment
+ ***************************************************************************/
 
-template<typename DstXprType,typename SrcXprType, typename Functor>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-void resize_if_allowed(DstXprType &dst, const SrcXprType& src, const Functor &/*func*/)
-{
+template <typename DstXprType, typename SrcXprType, typename Functor>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void resize_if_allowed(DstXprType& dst, const SrcXprType& src,
+                                                             const Functor& /*func*/) {
   EIGEN_ONLY_USED_FOR_DEBUG(dst);
   EIGEN_ONLY_USED_FOR_DEBUG(src);
   eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols());
 }
 
-template<typename DstXprType,typename SrcXprType, typename T1, typename T2>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-void resize_if_allowed(DstXprType &dst, const SrcXprType& src, const internal::assign_op<T1,T2> &/*func*/)
-{
+template <typename DstXprType, typename SrcXprType, typename T1, typename T2>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void resize_if_allowed(DstXprType& dst, const SrcXprType& src,
+                                                             const internal::assign_op<T1, T2>& /*func*/) {
   Index dstRows = src.rows();
   Index dstCols = src.cols();
-  if(((dst.rows()!=dstRows) || (dst.cols()!=dstCols)))
-    dst.resize(dstRows, dstCols);
+  if (((dst.rows() != dstRows) || (dst.cols() != dstCols))) dst.resize(dstRows, dstCols);
   eigen_assert(dst.rows() == dstRows && dst.cols() == dstCols);
 }
 
-template<typename DstXprType, typename SrcXprType, typename Functor>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void call_dense_assignment_loop(DstXprType& dst, const SrcXprType& src, const Functor &func)
-{
+template <typename DstXprType, typename SrcXprType, typename Functor>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void call_dense_assignment_loop(DstXprType& dst,
+                                                                                      const SrcXprType& src,
+                                                                                      const Functor& func) {
   typedef evaluator<DstXprType> DstEvaluatorType;
   typedef evaluator<SrcXprType> SrcEvaluatorType;
 
@@ -805,7 +731,7 @@
 
   DstEvaluatorType dstEvaluator(dst);
 
-  typedef generic_dense_assignment_kernel<DstEvaluatorType,SrcEvaluatorType,Functor> Kernel;
+  typedef generic_dense_assignment_kernel<DstEvaluatorType, SrcEvaluatorType, Functor> Kernel;
   Kernel kernel(dstEvaluator, srcEvaluator, func, dst.const_cast_derived());
 
   dense_assignment_loop<Kernel>::run(kernel);
@@ -813,95 +739,94 @@
 
 // Specialization for filling the destination with a constant value.
 #ifndef EIGEN_GPU_COMPILE_PHASE
-template<typename DstXprType>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void call_dense_assignment_loop(DstXprType& dst, const Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<typename DstXprType::Scalar>, DstXprType>& src, const internal::assign_op<typename DstXprType::Scalar,typename DstXprType::Scalar>& func)
-{
+template <typename DstXprType>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void call_dense_assignment_loop(
+    DstXprType& dst,
+    const Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<typename DstXprType::Scalar>, DstXprType>& src,
+    const internal::assign_op<typename DstXprType::Scalar, typename DstXprType::Scalar>& func) {
   resize_if_allowed(dst, src, func);
   std::fill_n(dst.data(), dst.size(), src.functor()());
 }
 #endif
 
-template<typename DstXprType, typename SrcXprType>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void call_dense_assignment_loop(DstXprType& dst, const SrcXprType& src)
-{
-  call_dense_assignment_loop(dst, src, internal::assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar>());
+template <typename DstXprType, typename SrcXprType>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void call_dense_assignment_loop(DstXprType& dst, const SrcXprType& src) {
+  call_dense_assignment_loop(dst, src, internal::assign_op<typename DstXprType::Scalar, typename SrcXprType::Scalar>());
 }
 
 /***************************************************************************
-* Part 6 : Generic assignment
-***************************************************************************/
+ * Part 6 : Generic assignment
+ ***************************************************************************/
 
 // Based on the respective shapes of the destination and source,
 // the class AssignmentKind determine the kind of assignment mechanism.
 // AssignmentKind must define a Kind typedef.
-template<typename DstShape, typename SrcShape> struct AssignmentKind;
+template <typename DstShape, typename SrcShape>
+struct AssignmentKind;
 
 // Assignment kind defined in this file:
 struct Dense2Dense {};
 struct EigenBase2EigenBase {};
 
-template<typename,typename> struct AssignmentKind { typedef EigenBase2EigenBase Kind; };
-template<> struct AssignmentKind<DenseShape,DenseShape> { typedef Dense2Dense Kind; };
+template <typename, typename>
+struct AssignmentKind {
+  typedef EigenBase2EigenBase Kind;
+};
+template <>
+struct AssignmentKind<DenseShape, DenseShape> {
+  typedef Dense2Dense Kind;
+};
 
 // This is the main assignment class
-template< typename DstXprType, typename SrcXprType, typename Functor,
-          typename Kind = typename AssignmentKind< typename evaluator_traits<DstXprType>::Shape , typename evaluator_traits<SrcXprType>::Shape >::Kind,
+template <typename DstXprType, typename SrcXprType, typename Functor,
+          typename Kind = typename AssignmentKind<typename evaluator_traits<DstXprType>::Shape,
+                                                  typename evaluator_traits<SrcXprType>::Shape>::Kind,
           typename EnableIf = void>
 struct Assignment;
 
+// The only purpose of this call_assignment() function is to deal with noalias() / "assume-aliasing" and automatic
+// transposition. Indeed, I (Gael) think that this concept of "assume-aliasing" was a mistake, and it makes thing quite
+// complicated. So this intermediate function removes everything related to "assume-aliasing" such that Assignment does
+// not has to bother about these annoying details.
 
-// The only purpose of this call_assignment() function is to deal with noalias() / "assume-aliasing" and automatic transposition.
-// Indeed, I (Gael) think that this concept of "assume-aliasing" was a mistake, and it makes thing quite complicated.
-// So this intermediate function removes everything related to "assume-aliasing" such that Assignment
-// does not has to bother about these annoying details.
-
-template<typename Dst, typename Src>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-void call_assignment(Dst& dst, const Src& src)
-{
-  call_assignment(dst, src, internal::assign_op<typename Dst::Scalar,typename Src::Scalar>());
+template <typename Dst, typename Src>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void call_assignment(Dst& dst, const Src& src) {
+  call_assignment(dst, src, internal::assign_op<typename Dst::Scalar, typename Src::Scalar>());
 }
-template<typename Dst, typename Src>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-void call_assignment(const Dst& dst, const Src& src)
-{
-  call_assignment(dst, src, internal::assign_op<typename Dst::Scalar,typename Src::Scalar>());
+template <typename Dst, typename Src>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void call_assignment(const Dst& dst, const Src& src) {
+  call_assignment(dst, src, internal::assign_op<typename Dst::Scalar, typename Src::Scalar>());
 }
 
 // Deal with "assume-aliasing"
-template<typename Dst, typename Src, typename Func>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-void call_assignment(Dst& dst, const Src& src, const Func& func, std::enable_if_t< evaluator_assume_aliasing<Src>::value, void*> = 0)
-{
+template <typename Dst, typename Src, typename Func>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void call_assignment(
+    Dst& dst, const Src& src, const Func& func, std::enable_if_t<evaluator_assume_aliasing<Src>::value, void*> = 0) {
   typename plain_matrix_type<Src>::type tmp(src);
   call_assignment_no_alias(dst, tmp, func);
 }
 
-template<typename Dst, typename Src, typename Func>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-void call_assignment(Dst& dst, const Src& src, const Func& func, std::enable_if_t<!evaluator_assume_aliasing<Src>::value, void*> = 0)
-{
+template <typename Dst, typename Src, typename Func>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void call_assignment(
+    Dst& dst, const Src& src, const Func& func, std::enable_if_t<!evaluator_assume_aliasing<Src>::value, void*> = 0) {
   call_assignment_no_alias(dst, src, func);
 }
 
 // by-pass "assume-aliasing"
 // When there is no aliasing, we require that 'dst' has been properly resized
-template<typename Dst, template <typename> class StorageBase, typename Src, typename Func>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-void call_assignment(NoAlias<Dst,StorageBase>& dst, const Src& src, const Func& func)
-{
+template <typename Dst, template <typename> class StorageBase, typename Src, typename Func>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void call_assignment(NoAlias<Dst, StorageBase>& dst,
+                                                                           const Src& src, const Func& func) {
   call_assignment_no_alias(dst.expression(), src, func);
 }
 
-
-template<typename Dst, typename Src, typename Func>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-void call_assignment_no_alias(Dst& dst, const Src& src, const Func& func)
-{
+template <typename Dst, typename Src, typename Func>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void call_assignment_no_alias(Dst& dst, const Src& src,
+                                                                                    const Func& func) {
   enum {
-    NeedToTranspose = (    (int(Dst::RowsAtCompileTime) == 1 && int(Src::ColsAtCompileTime) == 1)
-                        || (int(Dst::ColsAtCompileTime) == 1 && int(Src::RowsAtCompileTime) == 1)
-                      ) && int(Dst::SizeAtCompileTime) != 1
+    NeedToTranspose = ((int(Dst::RowsAtCompileTime) == 1 && int(Src::ColsAtCompileTime) == 1) ||
+                       (int(Dst::ColsAtCompileTime) == 1 && int(Src::RowsAtCompileTime) == 1)) &&
+                      int(Dst::SizeAtCompileTime) != 1
   };
 
   typedef std::conditional_t<NeedToTranspose, Transpose<Dst>, Dst> ActualDstTypeCleaned;
@@ -910,69 +835,63 @@
 
   // TODO check whether this is the right place to perform these checks:
   EIGEN_STATIC_ASSERT_LVALUE(Dst)
-  EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(ActualDstTypeCleaned,Src)
-  EIGEN_CHECK_BINARY_COMPATIBILIY(Func,typename ActualDstTypeCleaned::Scalar,typename Src::Scalar);
+  EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(ActualDstTypeCleaned, Src)
+  EIGEN_CHECK_BINARY_COMPATIBILIY(Func, typename ActualDstTypeCleaned::Scalar, typename Src::Scalar);
 
-  Assignment<ActualDstTypeCleaned,Src,Func>::run(actualDst, src, func);
+  Assignment<ActualDstTypeCleaned, Src, Func>::run(actualDst, src, func);
 }
 
-template<typename Dst, typename Src, typename Func>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-void call_restricted_packet_assignment_no_alias(Dst& dst, const Src& src, const Func& func)
-{
-    typedef evaluator<Dst> DstEvaluatorType;
-    typedef evaluator<Src> SrcEvaluatorType;
-    typedef restricted_packet_dense_assignment_kernel<DstEvaluatorType,SrcEvaluatorType,Func> Kernel;
+template <typename Dst, typename Src, typename Func>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void call_restricted_packet_assignment_no_alias(Dst& dst, const Src& src,
+                                                                                      const Func& func) {
+  typedef evaluator<Dst> DstEvaluatorType;
+  typedef evaluator<Src> SrcEvaluatorType;
+  typedef restricted_packet_dense_assignment_kernel<DstEvaluatorType, SrcEvaluatorType, Func> Kernel;
 
-    EIGEN_STATIC_ASSERT_LVALUE(Dst)
-    EIGEN_CHECK_BINARY_COMPATIBILIY(Func,typename Dst::Scalar,typename Src::Scalar);
+  EIGEN_STATIC_ASSERT_LVALUE(Dst)
+  EIGEN_CHECK_BINARY_COMPATIBILIY(Func, typename Dst::Scalar, typename Src::Scalar);
 
-    SrcEvaluatorType srcEvaluator(src);
-    resize_if_allowed(dst, src, func);
+  SrcEvaluatorType srcEvaluator(src);
+  resize_if_allowed(dst, src, func);
 
-    DstEvaluatorType dstEvaluator(dst);
-    Kernel kernel(dstEvaluator, srcEvaluator, func, dst.const_cast_derived());
+  DstEvaluatorType dstEvaluator(dst);
+  Kernel kernel(dstEvaluator, srcEvaluator, func, dst.const_cast_derived());
 
-    dense_assignment_loop<Kernel>::run(kernel);
+  dense_assignment_loop<Kernel>::run(kernel);
 }
 
-template<typename Dst, typename Src>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-void call_assignment_no_alias(Dst& dst, const Src& src)
-{
-  call_assignment_no_alias(dst, src, internal::assign_op<typename Dst::Scalar,typename Src::Scalar>());
+template <typename Dst, typename Src>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void call_assignment_no_alias(Dst& dst, const Src& src) {
+  call_assignment_no_alias(dst, src, internal::assign_op<typename Dst::Scalar, typename Src::Scalar>());
 }
 
-template<typename Dst, typename Src, typename Func>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-void call_assignment_no_alias_no_transpose(Dst& dst, const Src& src, const Func& func)
-{
+template <typename Dst, typename Src, typename Func>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void call_assignment_no_alias_no_transpose(Dst& dst,
+                                                                                                 const Src& src,
+                                                                                                 const Func& func) {
   // TODO check whether this is the right place to perform these checks:
   EIGEN_STATIC_ASSERT_LVALUE(Dst)
-  EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Dst,Src)
-  EIGEN_CHECK_BINARY_COMPATIBILIY(Func,typename Dst::Scalar,typename Src::Scalar);
+  EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Dst, Src)
+  EIGEN_CHECK_BINARY_COMPATIBILIY(Func, typename Dst::Scalar, typename Src::Scalar);
 
-  Assignment<Dst,Src,Func>::run(dst, src, func);
+  Assignment<Dst, Src, Func>::run(dst, src, func);
 }
-template<typename Dst, typename Src>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-void call_assignment_no_alias_no_transpose(Dst& dst, const Src& src)
-{
-  call_assignment_no_alias_no_transpose(dst, src, internal::assign_op<typename Dst::Scalar,typename Src::Scalar>());
+template <typename Dst, typename Src>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR void call_assignment_no_alias_no_transpose(Dst& dst,
+                                                                                                 const Src& src) {
+  call_assignment_no_alias_no_transpose(dst, src, internal::assign_op<typename Dst::Scalar, typename Src::Scalar>());
 }
 
 // forward declaration
-template<typename Dst, typename Src> EIGEN_DEVICE_FUNC void check_for_aliasing(const Dst &dst, const Src &src);
+template <typename Dst, typename Src>
+EIGEN_DEVICE_FUNC void check_for_aliasing(const Dst& dst, const Src& src);
 
 // Generic Dense to Dense assignment
 // Note that the last template argument "Weak" is needed to make it possible to perform
 // both partial specialization+SFINAE without ambiguous specialization
-template< typename DstXprType, typename SrcXprType, typename Functor, typename Weak>
-struct Assignment<DstXprType, SrcXprType, Functor, Dense2Dense, Weak>
-{
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE void run(DstXprType &dst, const SrcXprType &src, const Functor &func)
-  {
+template <typename DstXprType, typename SrcXprType, typename Functor, typename Weak>
+struct Assignment<DstXprType, SrcXprType, Functor, Dense2Dense, Weak> {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(DstXprType& dst, const SrcXprType& src, const Functor& func) {
 #ifndef EIGEN_NO_DEBUG
     internal::check_for_aliasing(dst, src);
 #endif
@@ -985,16 +904,14 @@
 // TODO: not sure we have to keep that one, but it helps porting current code to new evaluator mechanism.
 // Note that the last template argument "Weak" is needed to make it possible to perform
 // both partial specialization+SFINAE without ambiguous specialization
-template< typename DstXprType, typename SrcXprType, typename Functor, typename Weak>
-struct Assignment<DstXprType, SrcXprType, Functor, EigenBase2EigenBase, Weak>
-{
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &/*func*/)
-  {
+template <typename DstXprType, typename SrcXprType, typename Functor, typename Weak>
+struct Assignment<DstXprType, SrcXprType, Functor, EigenBase2EigenBase, Weak> {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(
+      DstXprType& dst, const SrcXprType& src,
+      const internal::assign_op<typename DstXprType::Scalar, typename SrcXprType::Scalar>& /*func*/) {
     Index dstRows = src.rows();
     Index dstCols = src.cols();
-    if((dst.rows()!=dstRows) || (dst.cols()!=dstCols))
-      dst.resize(dstRows, dstCols);
+    if ((dst.rows() != dstRows) || (dst.cols() != dstCols)) dst.resize(dstRows, dstCols);
 
     eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols());
     src.evalTo(dst);
@@ -1002,35 +919,33 @@
 
   // NOTE The following two functions are templated to avoid their instantiation if not needed
   //      This is needed because some expressions supports evalTo only and/or have 'void' as scalar type.
-  template<typename SrcScalarType>
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE void run(DstXprType &dst, const SrcXprType &src, const internal::add_assign_op<typename DstXprType::Scalar,SrcScalarType> &/*func*/)
-  {
+  template <typename SrcScalarType>
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(
+      DstXprType& dst, const SrcXprType& src,
+      const internal::add_assign_op<typename DstXprType::Scalar, SrcScalarType>& /*func*/) {
     Index dstRows = src.rows();
     Index dstCols = src.cols();
-    if((dst.rows()!=dstRows) || (dst.cols()!=dstCols))
-      dst.resize(dstRows, dstCols);
+    if ((dst.rows() != dstRows) || (dst.cols() != dstCols)) dst.resize(dstRows, dstCols);
 
     eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols());
     src.addTo(dst);
   }
 
-  template<typename SrcScalarType>
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE void run(DstXprType &dst, const SrcXprType &src, const internal::sub_assign_op<typename DstXprType::Scalar,SrcScalarType> &/*func*/)
-  {
+  template <typename SrcScalarType>
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(
+      DstXprType& dst, const SrcXprType& src,
+      const internal::sub_assign_op<typename DstXprType::Scalar, SrcScalarType>& /*func*/) {
     Index dstRows = src.rows();
     Index dstCols = src.cols();
-    if((dst.rows()!=dstRows) || (dst.cols()!=dstCols))
-      dst.resize(dstRows, dstCols);
+    if ((dst.rows() != dstRows) || (dst.cols() != dstCols)) dst.resize(dstRows, dstCols);
 
     eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols());
     src.subTo(dst);
   }
 };
 
-} // namespace internal
+}  // namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_ASSIGN_EVALUATOR_H
+#endif  // EIGEN_ASSIGN_EVALUATOR_H
diff --git a/Eigen/src/Core/Assign_MKL.h b/Eigen/src/Core/Assign_MKL.h
index 448dae2..5b566cd 100644
--- a/Eigen/src/Core/Assign_MKL.h
+++ b/Eigen/src/Core/Assign_MKL.h
@@ -1,7 +1,7 @@
 /*
  Copyright (c) 2011, Intel Corporation. All rights reserved.
  Copyright (C) 2015 Gael Guennebaud <gael.guennebaud@inria.fr>
- 
+
  Redistribution and use in source and binary forms, with or without modification,
  are permitted provided that the following conditions are met:
 
@@ -37,40 +37,38 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
-template<typename Dst, typename Src>
-class vml_assign_traits
-{
-  private:
-    enum {
-      DstHasDirectAccess = Dst::Flags & DirectAccessBit,
-      SrcHasDirectAccess = Src::Flags & DirectAccessBit,
-      StorageOrdersAgree = (int(Dst::IsRowMajor) == int(Src::IsRowMajor)),
-      InnerSize = int(Dst::IsVectorAtCompileTime) ? int(Dst::SizeAtCompileTime)
-                : int(Dst::Flags)&RowMajorBit ? int(Dst::ColsAtCompileTime)
-                : int(Dst::RowsAtCompileTime),
-      InnerMaxSize  = int(Dst::IsVectorAtCompileTime) ? int(Dst::MaxSizeAtCompileTime)
-                    : int(Dst::Flags)&RowMajorBit ? int(Dst::MaxColsAtCompileTime)
-                    : int(Dst::MaxRowsAtCompileTime),
-      MaxSizeAtCompileTime = Dst::SizeAtCompileTime,
+template <typename Dst, typename Src>
+class vml_assign_traits {
+ private:
+  enum {
+    DstHasDirectAccess = Dst::Flags & DirectAccessBit,
+    SrcHasDirectAccess = Src::Flags & DirectAccessBit,
+    StorageOrdersAgree = (int(Dst::IsRowMajor) == int(Src::IsRowMajor)),
+    InnerSize = int(Dst::IsVectorAtCompileTime) ? int(Dst::SizeAtCompileTime)
+                : int(Dst::Flags) & RowMajorBit ? int(Dst::ColsAtCompileTime)
+                                                : int(Dst::RowsAtCompileTime),
+    InnerMaxSize = int(Dst::IsVectorAtCompileTime) ? int(Dst::MaxSizeAtCompileTime)
+                   : int(Dst::Flags) & RowMajorBit ? int(Dst::MaxColsAtCompileTime)
+                                                   : int(Dst::MaxRowsAtCompileTime),
+    MaxSizeAtCompileTime = Dst::SizeAtCompileTime,
 
-      MightEnableVml = StorageOrdersAgree && DstHasDirectAccess && SrcHasDirectAccess && Src::InnerStrideAtCompileTime==1 && Dst::InnerStrideAtCompileTime==1,
-      MightLinearize = MightEnableVml && (int(Dst::Flags) & int(Src::Flags) & LinearAccessBit),
-      VmlSize = MightLinearize ? MaxSizeAtCompileTime : InnerMaxSize,
-      LargeEnough = VmlSize==Dynamic || VmlSize>=EIGEN_MKL_VML_THRESHOLD
-    };
-  public:
-    enum {
-      EnableVml = MightEnableVml && LargeEnough,
-      Traversal = MightLinearize ? LinearTraversal : DefaultTraversal
-    };
+    MightEnableVml = StorageOrdersAgree && DstHasDirectAccess && SrcHasDirectAccess &&
+                     Src::InnerStrideAtCompileTime == 1 && Dst::InnerStrideAtCompileTime == 1,
+    MightLinearize = MightEnableVml && (int(Dst::Flags) & int(Src::Flags) & LinearAccessBit),
+    VmlSize = MightLinearize ? MaxSizeAtCompileTime : InnerMaxSize,
+    LargeEnough = VmlSize == Dynamic || VmlSize >= EIGEN_MKL_VML_THRESHOLD
+  };
+
+ public:
+  enum { EnableVml = MightEnableVml && LargeEnough, Traversal = MightLinearize ? LinearTraversal : DefaultTraversal };
 };
 
 #define EIGEN_PP_EXPAND(ARG) ARG
-#if !defined (EIGEN_FAST_MATH) || (EIGEN_FAST_MATH != 1)
+#if !defined(EIGEN_FAST_MATH) || (EIGEN_FAST_MATH != 1)
 #define EIGEN_VMLMODE_EXPAND_xLA , VML_HA
 #else
 #define EIGEN_VMLMODE_EXPAND_xLA , VML_LA
@@ -79,104 +77,107 @@
 #define EIGEN_VMLMODE_EXPAND_x_
 
 #define EIGEN_VMLMODE_PREFIX_xLA vm
-#define EIGEN_VMLMODE_PREFIX_x_  v
-#define EIGEN_VMLMODE_PREFIX(VMLMODE) EIGEN_CAT(EIGEN_VMLMODE_PREFIX_x,VMLMODE)
+#define EIGEN_VMLMODE_PREFIX_x_ v
+#define EIGEN_VMLMODE_PREFIX(VMLMODE) EIGEN_CAT(EIGEN_VMLMODE_PREFIX_x, VMLMODE)
 
-#define EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, VMLOP, EIGENTYPE, VMLTYPE, VMLMODE)                                           \
-  template< typename DstXprType, typename SrcXprNested>                                                                         \
-  struct Assignment<DstXprType, CwiseUnaryOp<scalar_##EIGENOP##_op<EIGENTYPE>, SrcXprNested>, assign_op<EIGENTYPE,EIGENTYPE>,   \
-                   Dense2Dense, std::enable_if_t<vml_assign_traits<DstXprType,SrcXprNested>::EnableVml>> {              \
-    typedef CwiseUnaryOp<scalar_##EIGENOP##_op<EIGENTYPE>, SrcXprNested> SrcXprType;                                            \
-    static void run(DstXprType &dst, const SrcXprType &src, const assign_op<EIGENTYPE,EIGENTYPE> &func) {                       \
-      resize_if_allowed(dst, src, func);                                                                                        \
-      eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols());                                                       \
-      if(vml_assign_traits<DstXprType,SrcXprNested>::Traversal==LinearTraversal) {                                              \
-        VMLOP(dst.size(), (const VMLTYPE*)src.nestedExpression().data(),                                                        \
-              (VMLTYPE*)dst.data() EIGEN_PP_EXPAND(EIGEN_VMLMODE_EXPAND_x##VMLMODE) );                                           \
-      } else {                                                                                                                  \
-        const Index outerSize = dst.outerSize();                                                                                \
-        for(Index outer = 0; outer < outerSize; ++outer) {                                                                      \
-          const EIGENTYPE *src_ptr = src.IsRowMajor ? &(src.nestedExpression().coeffRef(outer,0)) :                             \
-                                                      &(src.nestedExpression().coeffRef(0, outer));                             \
-          EIGENTYPE *dst_ptr = dst.IsRowMajor ? &(dst.coeffRef(outer,0)) : &(dst.coeffRef(0, outer));                           \
-          VMLOP( dst.innerSize(), (const VMLTYPE*)src_ptr,                                                                      \
-                (VMLTYPE*)dst_ptr EIGEN_PP_EXPAND(EIGEN_VMLMODE_EXPAND_x##VMLMODE));                                             \
-        }                                                                                                                       \
-      }                                                                                                                         \
-    }                                                                                                                           \
-  };                                                                                                                            \
+#define EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, VMLOP, EIGENTYPE, VMLTYPE, VMLMODE)                      \
+  template <typename DstXprType, typename SrcXprNested>                                                    \
+  struct Assignment<DstXprType, CwiseUnaryOp<scalar_##EIGENOP##_op<EIGENTYPE>, SrcXprNested>,              \
+                    assign_op<EIGENTYPE, EIGENTYPE>, Dense2Dense,                                          \
+                    std::enable_if_t<vml_assign_traits<DstXprType, SrcXprNested>::EnableVml>> {            \
+    typedef CwiseUnaryOp<scalar_##EIGENOP##_op<EIGENTYPE>, SrcXprNested> SrcXprType;                       \
+    static void run(DstXprType &dst, const SrcXprType &src, const assign_op<EIGENTYPE, EIGENTYPE> &func) { \
+      resize_if_allowed(dst, src, func);                                                                   \
+      eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols());                                  \
+      if (vml_assign_traits<DstXprType, SrcXprNested>::Traversal == LinearTraversal) {                     \
+        VMLOP(dst.size(), (const VMLTYPE *)src.nestedExpression().data(),                                  \
+              (VMLTYPE *)dst.data() EIGEN_PP_EXPAND(EIGEN_VMLMODE_EXPAND_x##VMLMODE));                     \
+      } else {                                                                                             \
+        const Index outerSize = dst.outerSize();                                                           \
+        for (Index outer = 0; outer < outerSize; ++outer) {                                                \
+          const EIGENTYPE *src_ptr = src.IsRowMajor ? &(src.nestedExpression().coeffRef(outer, 0))         \
+                                                    : &(src.nestedExpression().coeffRef(0, outer));        \
+          EIGENTYPE *dst_ptr = dst.IsRowMajor ? &(dst.coeffRef(outer, 0)) : &(dst.coeffRef(0, outer));     \
+          VMLOP(dst.innerSize(), (const VMLTYPE *)src_ptr,                                                 \
+                (VMLTYPE *)dst_ptr EIGEN_PP_EXPAND(EIGEN_VMLMODE_EXPAND_x##VMLMODE));                      \
+        }                                                                                                  \
+      }                                                                                                    \
+    }                                                                                                      \
+  };
 
+#define EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(EIGENOP, VMLOP, VMLMODE)                                                \
+  EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, EIGEN_CAT(EIGEN_VMLMODE_PREFIX(VMLMODE), s##VMLOP), float, float, VMLMODE) \
+  EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, EIGEN_CAT(EIGEN_VMLMODE_PREFIX(VMLMODE), d##VMLOP), double, double, VMLMODE)
 
-#define EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(EIGENOP, VMLOP, VMLMODE)                                                         \
-  EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, EIGEN_CAT(EIGEN_VMLMODE_PREFIX(VMLMODE),s##VMLOP), float, float, VMLMODE)           \
-  EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, EIGEN_CAT(EIGEN_VMLMODE_PREFIX(VMLMODE),d##VMLOP), double, double, VMLMODE)
+#define EIGEN_MKL_VML_DECLARE_UNARY_CALLS_CPLX(EIGENOP, VMLOP, VMLMODE)                                   \
+  EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, EIGEN_CAT(EIGEN_VMLMODE_PREFIX(VMLMODE), c##VMLOP), scomplex, \
+                                   MKL_Complex8, VMLMODE)                                                 \
+  EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, EIGEN_CAT(EIGEN_VMLMODE_PREFIX(VMLMODE), z##VMLOP), dcomplex, \
+                                   MKL_Complex16, VMLMODE)
 
-#define EIGEN_MKL_VML_DECLARE_UNARY_CALLS_CPLX(EIGENOP, VMLOP, VMLMODE)                                                         \
-  EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, EIGEN_CAT(EIGEN_VMLMODE_PREFIX(VMLMODE),c##VMLOP), scomplex, MKL_Complex8, VMLMODE) \
-  EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, EIGEN_CAT(EIGEN_VMLMODE_PREFIX(VMLMODE),z##VMLOP), dcomplex, MKL_Complex16, VMLMODE)
-  
-#define EIGEN_MKL_VML_DECLARE_UNARY_CALLS(EIGENOP, VMLOP, VMLMODE)                                                              \
-  EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(EIGENOP, VMLOP, VMLMODE)                                                               \
+#define EIGEN_MKL_VML_DECLARE_UNARY_CALLS(EIGENOP, VMLOP, VMLMODE) \
+  EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(EIGENOP, VMLOP, VMLMODE)  \
   EIGEN_MKL_VML_DECLARE_UNARY_CALLS_CPLX(EIGENOP, VMLOP, VMLMODE)
 
-  
-EIGEN_MKL_VML_DECLARE_UNARY_CALLS(sin,   Sin,   LA)
-EIGEN_MKL_VML_DECLARE_UNARY_CALLS(asin,  Asin,  LA)
-EIGEN_MKL_VML_DECLARE_UNARY_CALLS(sinh,  Sinh,  LA)
-EIGEN_MKL_VML_DECLARE_UNARY_CALLS(cos,   Cos,   LA)
-EIGEN_MKL_VML_DECLARE_UNARY_CALLS(acos,  Acos,  LA)
-EIGEN_MKL_VML_DECLARE_UNARY_CALLS(cosh,  Cosh,  LA)
-EIGEN_MKL_VML_DECLARE_UNARY_CALLS(tan,   Tan,   LA)
-EIGEN_MKL_VML_DECLARE_UNARY_CALLS(atan,  Atan,  LA)
-EIGEN_MKL_VML_DECLARE_UNARY_CALLS(tanh,  Tanh,  LA)
+EIGEN_MKL_VML_DECLARE_UNARY_CALLS(sin, Sin, LA)
+EIGEN_MKL_VML_DECLARE_UNARY_CALLS(asin, Asin, LA)
+EIGEN_MKL_VML_DECLARE_UNARY_CALLS(sinh, Sinh, LA)
+EIGEN_MKL_VML_DECLARE_UNARY_CALLS(cos, Cos, LA)
+EIGEN_MKL_VML_DECLARE_UNARY_CALLS(acos, Acos, LA)
+EIGEN_MKL_VML_DECLARE_UNARY_CALLS(cosh, Cosh, LA)
+EIGEN_MKL_VML_DECLARE_UNARY_CALLS(tan, Tan, LA)
+EIGEN_MKL_VML_DECLARE_UNARY_CALLS(atan, Atan, LA)
+EIGEN_MKL_VML_DECLARE_UNARY_CALLS(tanh, Tanh, LA)
 // EIGEN_MKL_VML_DECLARE_UNARY_CALLS(abs,   Abs,    _)
-EIGEN_MKL_VML_DECLARE_UNARY_CALLS(exp,   Exp,   LA)
-EIGEN_MKL_VML_DECLARE_UNARY_CALLS(log,   Ln,    LA)
+EIGEN_MKL_VML_DECLARE_UNARY_CALLS(exp, Exp, LA)
+EIGEN_MKL_VML_DECLARE_UNARY_CALLS(log, Ln, LA)
 EIGEN_MKL_VML_DECLARE_UNARY_CALLS(log10, Log10, LA)
-EIGEN_MKL_VML_DECLARE_UNARY_CALLS(sqrt,  Sqrt,  _)
+EIGEN_MKL_VML_DECLARE_UNARY_CALLS(sqrt, Sqrt, _)
 
-EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(square, Sqr,   _)
-EIGEN_MKL_VML_DECLARE_UNARY_CALLS_CPLX(arg, Arg,      _)
-EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(round, Round,  _)
-EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(floor, Floor,  _)
-EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(ceil,  Ceil,   _)
-EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(cbrt,  Cbrt,  _)
+EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(square, Sqr, _)
+EIGEN_MKL_VML_DECLARE_UNARY_CALLS_CPLX(arg, Arg, _)
+EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(round, Round, _)
+EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(floor, Floor, _)
+EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(ceil, Ceil, _)
+EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(cbrt, Cbrt, _)
 
-#define EIGEN_MKL_VML_DECLARE_POW_CALL(EIGENOP, VMLOP, EIGENTYPE, VMLTYPE, VMLMODE)                                           \
-  template< typename DstXprType, typename SrcXprNested, typename Plain>                                                       \
-  struct Assignment<DstXprType, CwiseBinaryOp<scalar_##EIGENOP##_op<EIGENTYPE,EIGENTYPE>, SrcXprNested,                       \
-                    const CwiseNullaryOp<internal::scalar_constant_op<EIGENTYPE>,Plain> >, assign_op<EIGENTYPE,EIGENTYPE>,    \
-                   Dense2Dense, std::enable_if_t<vml_assign_traits<DstXprType,SrcXprNested>::EnableVml>> {            \
-    typedef CwiseBinaryOp<scalar_##EIGENOP##_op<EIGENTYPE,EIGENTYPE>, SrcXprNested,                                           \
-                    const CwiseNullaryOp<internal::scalar_constant_op<EIGENTYPE>,Plain> > SrcXprType;                         \
-    static void run(DstXprType &dst, const SrcXprType &src, const assign_op<EIGENTYPE,EIGENTYPE> &func) {                     \
-      resize_if_allowed(dst, src, func);                                                                                      \
-      eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols());                                                     \
-      VMLTYPE exponent = reinterpret_cast<const VMLTYPE&>(src.rhs().functor().m_other);                                       \
-      if(vml_assign_traits<DstXprType,SrcXprNested>::Traversal==LinearTraversal)                                              \
-      {                                                                                                                       \
-        VMLOP( dst.size(), (const VMLTYPE*)src.lhs().data(), exponent,                                                        \
-              (VMLTYPE*)dst.data() EIGEN_PP_EXPAND(EIGEN_VMLMODE_EXPAND_x##VMLMODE) );                                         \
-      } else {                                                                                                                \
-        const Index outerSize = dst.outerSize();                                                                              \
-        for(Index outer = 0; outer < outerSize; ++outer) {                                                                    \
-          const EIGENTYPE *src_ptr = src.IsRowMajor ? &(src.lhs().coeffRef(outer,0)) :                                        \
-                                                      &(src.lhs().coeffRef(0, outer));                                        \
-          EIGENTYPE *dst_ptr = dst.IsRowMajor ? &(dst.coeffRef(outer,0)) : &(dst.coeffRef(0, outer));                         \
-          VMLOP( dst.innerSize(), (const VMLTYPE*)src_ptr, exponent,                                                          \
-                 (VMLTYPE*)dst_ptr EIGEN_PP_EXPAND(EIGEN_VMLMODE_EXPAND_x##VMLMODE));                                          \
-        }                                                                                                                     \
-      }                                                                                                                       \
-    }                                                                                                                         \
+#define EIGEN_MKL_VML_DECLARE_POW_CALL(EIGENOP, VMLOP, EIGENTYPE, VMLTYPE, VMLMODE)                        \
+  template <typename DstXprType, typename SrcXprNested, typename Plain>                                    \
+  struct Assignment<DstXprType,                                                                            \
+                    CwiseBinaryOp<scalar_##EIGENOP##_op<EIGENTYPE, EIGENTYPE>, SrcXprNested,               \
+                                  const CwiseNullaryOp<internal::scalar_constant_op<EIGENTYPE>, Plain>>,   \
+                    assign_op<EIGENTYPE, EIGENTYPE>, Dense2Dense,                                          \
+                    std::enable_if_t<vml_assign_traits<DstXprType, SrcXprNested>::EnableVml>> {            \
+    typedef CwiseBinaryOp<scalar_##EIGENOP##_op<EIGENTYPE, EIGENTYPE>, SrcXprNested,                       \
+                          const CwiseNullaryOp<internal::scalar_constant_op<EIGENTYPE>, Plain>>            \
+        SrcXprType;                                                                                        \
+    static void run(DstXprType &dst, const SrcXprType &src, const assign_op<EIGENTYPE, EIGENTYPE> &func) { \
+      resize_if_allowed(dst, src, func);                                                                   \
+      eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols());                                  \
+      VMLTYPE exponent = reinterpret_cast<const VMLTYPE &>(src.rhs().functor().m_other);                   \
+      if (vml_assign_traits<DstXprType, SrcXprNested>::Traversal == LinearTraversal) {                     \
+        VMLOP(dst.size(), (const VMLTYPE *)src.lhs().data(), exponent,                                     \
+              (VMLTYPE *)dst.data() EIGEN_PP_EXPAND(EIGEN_VMLMODE_EXPAND_x##VMLMODE));                     \
+      } else {                                                                                             \
+        const Index outerSize = dst.outerSize();                                                           \
+        for (Index outer = 0; outer < outerSize; ++outer) {                                                \
+          const EIGENTYPE *src_ptr =                                                                       \
+              src.IsRowMajor ? &(src.lhs().coeffRef(outer, 0)) : &(src.lhs().coeffRef(0, outer));          \
+          EIGENTYPE *dst_ptr = dst.IsRowMajor ? &(dst.coeffRef(outer, 0)) : &(dst.coeffRef(0, outer));     \
+          VMLOP(dst.innerSize(), (const VMLTYPE *)src_ptr, exponent,                                       \
+                (VMLTYPE *)dst_ptr EIGEN_PP_EXPAND(EIGEN_VMLMODE_EXPAND_x##VMLMODE));                      \
+        }                                                                                                  \
+      }                                                                                                    \
+    }                                                                                                      \
   };
-  
-EIGEN_MKL_VML_DECLARE_POW_CALL(pow, vmsPowx, float,    float,         LA)
-EIGEN_MKL_VML_DECLARE_POW_CALL(pow, vmdPowx, double,   double,        LA)
-EIGEN_MKL_VML_DECLARE_POW_CALL(pow, vmcPowx, scomplex, MKL_Complex8,  LA)
+
+EIGEN_MKL_VML_DECLARE_POW_CALL(pow, vmsPowx, float, float, LA)
+EIGEN_MKL_VML_DECLARE_POW_CALL(pow, vmdPowx, double, double, LA)
+EIGEN_MKL_VML_DECLARE_POW_CALL(pow, vmcPowx, scomplex, MKL_Complex8, LA)
 EIGEN_MKL_VML_DECLARE_POW_CALL(pow, vmzPowx, dcomplex, MKL_Complex16, LA)
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_ASSIGN_VML_H
+#endif  // EIGEN_ASSIGN_VML_H
diff --git a/Eigen/src/Core/BandMatrix.h b/Eigen/src/Core/BandMatrix.h
index 8955bcd..ca991ca 100644
--- a/Eigen/src/Core/BandMatrix.h
+++ b/Eigen/src/Core/BandMatrix.h
@@ -17,169 +17,159 @@
 
 namespace internal {
 
-template<typename Derived>
-class BandMatrixBase : public EigenBase<Derived>
-{
-  public:
+template <typename Derived>
+class BandMatrixBase : public EigenBase<Derived> {
+ public:
+  enum {
+    Flags = internal::traits<Derived>::Flags,
+    CoeffReadCost = internal::traits<Derived>::CoeffReadCost,
+    RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
+    ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
+    MaxRowsAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = internal::traits<Derived>::MaxColsAtCompileTime,
+    Supers = internal::traits<Derived>::Supers,
+    Subs = internal::traits<Derived>::Subs,
+    Options = internal::traits<Derived>::Options
+  };
+  typedef typename internal::traits<Derived>::Scalar Scalar;
+  typedef Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime> DenseMatrixType;
+  typedef typename DenseMatrixType::StorageIndex StorageIndex;
+  typedef typename internal::traits<Derived>::CoefficientsType CoefficientsType;
+  typedef EigenBase<Derived> Base;
 
+ protected:
+  enum {
+    DataRowsAtCompileTime = ((Supers != Dynamic) && (Subs != Dynamic)) ? 1 + Supers + Subs : Dynamic,
+    SizeAtCompileTime = min_size_prefer_dynamic(RowsAtCompileTime, ColsAtCompileTime)
+  };
+
+ public:
+  using Base::cols;
+  using Base::derived;
+  using Base::rows;
+
+  /** \returns the number of super diagonals */
+  inline Index supers() const { return derived().supers(); }
+
+  /** \returns the number of sub diagonals */
+  inline Index subs() const { return derived().subs(); }
+
+  /** \returns an expression of the underlying coefficient matrix */
+  inline const CoefficientsType& coeffs() const { return derived().coeffs(); }
+
+  /** \returns an expression of the underlying coefficient matrix */
+  inline CoefficientsType& coeffs() { return derived().coeffs(); }
+
+  /** \returns a vector expression of the \a i -th column,
+   * only the meaningful part is returned.
+   * \warning the internal storage must be column major. */
+  inline Block<CoefficientsType, Dynamic, 1> col(Index i) {
+    EIGEN_STATIC_ASSERT((int(Options) & int(RowMajor)) == 0, THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);
+    Index start = 0;
+    Index len = coeffs().rows();
+    if (i <= supers()) {
+      start = supers() - i;
+      len = (std::min)(rows(), std::max<Index>(0, coeffs().rows() - (supers() - i)));
+    } else if (i >= rows() - subs())
+      len = std::max<Index>(0, coeffs().rows() - (i + 1 - rows() + subs()));
+    return Block<CoefficientsType, Dynamic, 1>(coeffs(), start, i, len, 1);
+  }
+
+  /** \returns a vector expression of the main diagonal */
+  inline Block<CoefficientsType, 1, SizeAtCompileTime> diagonal() {
+    return Block<CoefficientsType, 1, SizeAtCompileTime>(coeffs(), supers(), 0, 1, (std::min)(rows(), cols()));
+  }
+
+  /** \returns a vector expression of the main diagonal (const version) */
+  inline const Block<const CoefficientsType, 1, SizeAtCompileTime> diagonal() const {
+    return Block<const CoefficientsType, 1, SizeAtCompileTime>(coeffs(), supers(), 0, 1, (std::min)(rows(), cols()));
+  }
+
+  template <int Index>
+  struct DiagonalIntReturnType {
     enum {
-      Flags = internal::traits<Derived>::Flags,
-      CoeffReadCost = internal::traits<Derived>::CoeffReadCost,
-      RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
-      ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
-      MaxRowsAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime,
-      MaxColsAtCompileTime = internal::traits<Derived>::MaxColsAtCompileTime,
-      Supers = internal::traits<Derived>::Supers,
-      Subs   = internal::traits<Derived>::Subs,
-      Options = internal::traits<Derived>::Options
+      ReturnOpposite =
+          (int(Options) & int(SelfAdjoint)) && (((Index) > 0 && Supers == 0) || ((Index) < 0 && Subs == 0)),
+      Conjugate = ReturnOpposite && NumTraits<Scalar>::IsComplex,
+      ActualIndex = ReturnOpposite ? -Index : Index,
+      DiagonalSize =
+          (RowsAtCompileTime == Dynamic || ColsAtCompileTime == Dynamic)
+              ? Dynamic
+              : (ActualIndex < 0 ? min_size_prefer_dynamic(ColsAtCompileTime, RowsAtCompileTime + ActualIndex)
+                                 : min_size_prefer_dynamic(RowsAtCompileTime, ColsAtCompileTime - ActualIndex))
     };
-    typedef typename internal::traits<Derived>::Scalar Scalar;
-    typedef Matrix<Scalar,RowsAtCompileTime,ColsAtCompileTime> DenseMatrixType;
-    typedef typename DenseMatrixType::StorageIndex StorageIndex;
-    typedef typename internal::traits<Derived>::CoefficientsType CoefficientsType;
-    typedef EigenBase<Derived> Base;
+    typedef Block<CoefficientsType, 1, DiagonalSize> BuildType;
+    typedef std::conditional_t<Conjugate, CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>, BuildType>, BuildType>
+        Type;
+  };
 
-  protected:
-    enum {
-      DataRowsAtCompileTime = ((Supers!=Dynamic) && (Subs!=Dynamic))
-                            ? 1 + Supers + Subs
-                            : Dynamic,
-      SizeAtCompileTime = min_size_prefer_dynamic(RowsAtCompileTime,ColsAtCompileTime)
-    };
+  /** \returns a vector expression of the \a N -th sub or super diagonal */
+  template <int N>
+  inline typename DiagonalIntReturnType<N>::Type diagonal() {
+    return typename DiagonalIntReturnType<N>::BuildType(coeffs(), supers() - N, (std::max)(0, N), 1, diagonalLength(N));
+  }
 
-  public:
+  /** \returns a vector expression of the \a N -th sub or super diagonal */
+  template <int N>
+  inline const typename DiagonalIntReturnType<N>::Type diagonal() const {
+    return typename DiagonalIntReturnType<N>::BuildType(coeffs(), supers() - N, (std::max)(0, N), 1, diagonalLength(N));
+  }
 
-    using Base::derived;
-    using Base::rows;
-    using Base::cols;
+  /** \returns a vector expression of the \a i -th sub or super diagonal */
+  inline Block<CoefficientsType, 1, Dynamic> diagonal(Index i) {
+    eigen_assert((i < 0 && -i <= subs()) || (i >= 0 && i <= supers()));
+    return Block<CoefficientsType, 1, Dynamic>(coeffs(), supers() - i, std::max<Index>(0, i), 1, diagonalLength(i));
+  }
 
-    /** \returns the number of super diagonals */
-    inline Index supers() const { return derived().supers(); }
+  /** \returns a vector expression of the \a i -th sub or super diagonal */
+  inline const Block<const CoefficientsType, 1, Dynamic> diagonal(Index i) const {
+    eigen_assert((i < 0 && -i <= subs()) || (i >= 0 && i <= supers()));
+    return Block<const CoefficientsType, 1, Dynamic>(coeffs(), supers() - i, std::max<Index>(0, i), 1,
+                                                     diagonalLength(i));
+  }
 
-    /** \returns the number of sub diagonals */
-    inline Index subs() const { return derived().subs(); }
+  template <typename Dest>
+  inline void evalTo(Dest& dst) const {
+    dst.resize(rows(), cols());
+    dst.setZero();
+    dst.diagonal() = diagonal();
+    for (Index i = 1; i <= supers(); ++i) dst.diagonal(i) = diagonal(i);
+    for (Index i = 1; i <= subs(); ++i) dst.diagonal(-i) = diagonal(-i);
+  }
 
-    /** \returns an expression of the underlying coefficient matrix */
-    inline const CoefficientsType& coeffs() const { return derived().coeffs(); }
+  DenseMatrixType toDenseMatrix() const {
+    DenseMatrixType res(rows(), cols());
+    evalTo(res);
+    return res;
+  }
 
-    /** \returns an expression of the underlying coefficient matrix */
-    inline CoefficientsType& coeffs() { return derived().coeffs(); }
-
-    /** \returns a vector expression of the \a i -th column,
-      * only the meaningful part is returned.
-      * \warning the internal storage must be column major. */
-    inline Block<CoefficientsType,Dynamic,1> col(Index i)
-    {
-      EIGEN_STATIC_ASSERT((int(Options) & int(RowMajor)) == 0, THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);
-      Index start = 0;
-      Index len = coeffs().rows();
-      if (i<=supers())
-      {
-        start = supers()-i;
-        len = (std::min)(rows(),std::max<Index>(0,coeffs().rows() - (supers()-i)));
-      }
-      else if (i>=rows()-subs())
-        len = std::max<Index>(0,coeffs().rows() - (i + 1 - rows() + subs()));
-      return Block<CoefficientsType,Dynamic,1>(coeffs(), start, i, len, 1);
-    }
-
-    /** \returns a vector expression of the main diagonal */
-    inline Block<CoefficientsType,1,SizeAtCompileTime> diagonal()
-    { return Block<CoefficientsType,1,SizeAtCompileTime>(coeffs(),supers(),0,1,(std::min)(rows(),cols())); }
-
-    /** \returns a vector expression of the main diagonal (const version) */
-    inline const Block<const CoefficientsType,1,SizeAtCompileTime> diagonal() const
-    { return Block<const CoefficientsType,1,SizeAtCompileTime>(coeffs(),supers(),0,1,(std::min)(rows(),cols())); }
-
-    template<int Index> struct DiagonalIntReturnType {
-      enum {
-        ReturnOpposite = (int(Options) & int(SelfAdjoint)) && (((Index) > 0 && Supers == 0) || ((Index) < 0 && Subs == 0)),
-        Conjugate = ReturnOpposite && NumTraits<Scalar>::IsComplex,
-        ActualIndex = ReturnOpposite ? -Index : Index,
-        DiagonalSize = (RowsAtCompileTime==Dynamic || ColsAtCompileTime==Dynamic)
-                     ? Dynamic
-                     : (ActualIndex<0
-                     ? min_size_prefer_dynamic(ColsAtCompileTime, RowsAtCompileTime + ActualIndex)
-                     : min_size_prefer_dynamic(RowsAtCompileTime, ColsAtCompileTime - ActualIndex))
-      };
-      typedef Block<CoefficientsType,1, DiagonalSize> BuildType;
-      typedef std::conditional_t<Conjugate,
-                 CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>,BuildType >,
-                 BuildType> Type;
-    };
-
-    /** \returns a vector expression of the \a N -th sub or super diagonal */
-    template<int N> inline typename DiagonalIntReturnType<N>::Type diagonal()
-    {
-      return typename DiagonalIntReturnType<N>::BuildType(coeffs(), supers()-N, (std::max)(0,N), 1, diagonalLength(N));
-    }
-
-    /** \returns a vector expression of the \a N -th sub or super diagonal */
-    template<int N> inline const typename DiagonalIntReturnType<N>::Type diagonal() const
-    {
-      return typename DiagonalIntReturnType<N>::BuildType(coeffs(), supers()-N, (std::max)(0,N), 1, diagonalLength(N));
-    }
-
-    /** \returns a vector expression of the \a i -th sub or super diagonal */
-    inline Block<CoefficientsType,1,Dynamic> diagonal(Index i)
-    {
-      eigen_assert((i<0 && -i<=subs()) || (i>=0 && i<=supers()));
-      return Block<CoefficientsType,1,Dynamic>(coeffs(), supers()-i, std::max<Index>(0,i), 1, diagonalLength(i));
-    }
-
-    /** \returns a vector expression of the \a i -th sub or super diagonal */
-    inline const Block<const CoefficientsType,1,Dynamic> diagonal(Index i) const
-    {
-      eigen_assert((i<0 && -i<=subs()) || (i>=0 && i<=supers()));
-      return Block<const CoefficientsType,1,Dynamic>(coeffs(), supers()-i, std::max<Index>(0,i), 1, diagonalLength(i));
-    }
-
-    template<typename Dest> inline void evalTo(Dest& dst) const
-    {
-      dst.resize(rows(),cols());
-      dst.setZero();
-      dst.diagonal() = diagonal();
-      for (Index i=1; i<=supers();++i)
-        dst.diagonal(i) = diagonal(i);
-      for (Index i=1; i<=subs();++i)
-        dst.diagonal(-i) = diagonal(-i);
-    }
-
-    DenseMatrixType toDenseMatrix() const
-    {
-      DenseMatrixType res(rows(),cols());
-      evalTo(res);
-      return res;
-    }
-
-  protected:
-
-    inline Index diagonalLength(Index i) const
-    { return i<0 ? (std::min)(cols(),rows()+i) : (std::min)(rows(),cols()-i); }
+ protected:
+  inline Index diagonalLength(Index i) const {
+    return i < 0 ? (std::min)(cols(), rows() + i) : (std::min)(rows(), cols() - i);
+  }
 };
 
 /**
-  * \class BandMatrix
-  * \ingroup Core_Module
-  *
-  * \brief Represents a rectangular matrix with a banded storage
-  *
-  * \tparam Scalar_ Numeric type, i.e. float, double, int
-  * \tparam Rows_ Number of rows, or \b Dynamic
-  * \tparam Cols_ Number of columns, or \b Dynamic
-  * \tparam Supers_ Number of super diagonal
-  * \tparam Subs_ Number of sub diagonal
-  * \tparam Options_ A combination of either \b #RowMajor or \b #ColMajor, and of \b #SelfAdjoint
-  *                  The former controls \ref TopicStorageOrders "storage order", and defaults to
-  *                  column-major. The latter controls whether the matrix represents a selfadjoint
-  *                  matrix in which case either Supers of Subs have to be null.
-  *
-  * \sa class TridiagonalMatrix
-  */
+ * \class BandMatrix
+ * \ingroup Core_Module
+ *
+ * \brief Represents a rectangular matrix with a banded storage
+ *
+ * \tparam Scalar_ Numeric type, i.e. float, double, int
+ * \tparam Rows_ Number of rows, or \b Dynamic
+ * \tparam Cols_ Number of columns, or \b Dynamic
+ * \tparam Supers_ Number of super diagonal
+ * \tparam Subs_ Number of sub diagonal
+ * \tparam Options_ A combination of either \b #RowMajor or \b #ColMajor, and of \b #SelfAdjoint
+ *                  The former controls \ref TopicStorageOrders "storage order", and defaults to
+ *                  column-major. The latter controls whether the matrix represents a selfadjoint
+ *                  matrix in which case either Supers of Subs have to be null.
+ *
+ * \sa class TridiagonalMatrix
+ */
 
-template<typename Scalar_, int Rows_, int Cols_, int Supers_, int Subs_, int Options_>
-struct traits<BandMatrix<Scalar_,Rows_,Cols_,Supers_,Subs_,Options_> >
-{
+template <typename Scalar_, int Rows_, int Cols_, int Supers_, int Subs_, int Options_>
+struct traits<BandMatrix<Scalar_, Rows_, Cols_, Supers_, Subs_, Options_> > {
   typedef Scalar_ Scalar;
   typedef Dense StorageKind;
   typedef Eigen::Index StorageIndex;
@@ -193,55 +183,49 @@
     Supers = Supers_,
     Subs = Subs_,
     Options = Options_,
-    DataRowsAtCompileTime = ((Supers!=Dynamic) && (Subs!=Dynamic)) ? 1 + Supers + Subs : Dynamic
+    DataRowsAtCompileTime = ((Supers != Dynamic) && (Subs != Dynamic)) ? 1 + Supers + Subs : Dynamic
   };
-  typedef Matrix<Scalar, DataRowsAtCompileTime, ColsAtCompileTime, int(Options) & int(RowMajor) ? RowMajor : ColMajor> CoefficientsType;
+  typedef Matrix<Scalar, DataRowsAtCompileTime, ColsAtCompileTime, int(Options) & int(RowMajor) ? RowMajor : ColMajor>
+      CoefficientsType;
 };
 
-template<typename Scalar_, int Rows, int Cols, int Supers, int Subs, int Options>
-class BandMatrix : public BandMatrixBase<BandMatrix<Scalar_,Rows,Cols,Supers,Subs,Options> >
-{
-  public:
+template <typename Scalar_, int Rows, int Cols, int Supers, int Subs, int Options>
+class BandMatrix : public BandMatrixBase<BandMatrix<Scalar_, Rows, Cols, Supers, Subs, Options> > {
+ public:
+  typedef typename internal::traits<BandMatrix>::Scalar Scalar;
+  typedef typename internal::traits<BandMatrix>::StorageIndex StorageIndex;
+  typedef typename internal::traits<BandMatrix>::CoefficientsType CoefficientsType;
 
-    typedef typename internal::traits<BandMatrix>::Scalar Scalar;
-    typedef typename internal::traits<BandMatrix>::StorageIndex StorageIndex;
-    typedef typename internal::traits<BandMatrix>::CoefficientsType CoefficientsType;
+  explicit inline BandMatrix(Index rows = Rows, Index cols = Cols, Index supers = Supers, Index subs = Subs)
+      : m_coeffs(1 + supers + subs, cols), m_rows(rows), m_supers(supers), m_subs(subs) {}
 
-    explicit inline BandMatrix(Index rows=Rows, Index cols=Cols, Index supers=Supers, Index subs=Subs)
-      : m_coeffs(1+supers+subs,cols),
-        m_rows(rows), m_supers(supers), m_subs(subs)
-    {
-    }
+  /** \returns the number of columns */
+  inline EIGEN_CONSTEXPR Index rows() const { return m_rows.value(); }
 
-    /** \returns the number of columns */
-    inline EIGEN_CONSTEXPR Index rows() const { return m_rows.value(); }
+  /** \returns the number of rows */
+  inline EIGEN_CONSTEXPR Index cols() const { return m_coeffs.cols(); }
 
-    /** \returns the number of rows */
-    inline EIGEN_CONSTEXPR Index cols() const { return m_coeffs.cols(); }
+  /** \returns the number of super diagonals */
+  inline EIGEN_CONSTEXPR Index supers() const { return m_supers.value(); }
 
-    /** \returns the number of super diagonals */
-    inline EIGEN_CONSTEXPR Index supers() const { return m_supers.value(); }
+  /** \returns the number of sub diagonals */
+  inline EIGEN_CONSTEXPR Index subs() const { return m_subs.value(); }
 
-    /** \returns the number of sub diagonals */
-    inline EIGEN_CONSTEXPR Index subs() const { return m_subs.value(); }
+  inline const CoefficientsType& coeffs() const { return m_coeffs; }
+  inline CoefficientsType& coeffs() { return m_coeffs; }
 
-    inline const CoefficientsType& coeffs() const { return m_coeffs; }
-    inline CoefficientsType& coeffs() { return m_coeffs; }
-
-  protected:
-
-    CoefficientsType m_coeffs;
-    internal::variable_if_dynamic<Index, Rows>   m_rows;
-    internal::variable_if_dynamic<Index, Supers> m_supers;
-    internal::variable_if_dynamic<Index, Subs>   m_subs;
+ protected:
+  CoefficientsType m_coeffs;
+  internal::variable_if_dynamic<Index, Rows> m_rows;
+  internal::variable_if_dynamic<Index, Supers> m_supers;
+  internal::variable_if_dynamic<Index, Subs> m_subs;
 };
 
-template<typename CoefficientsType_,int Rows_, int Cols_, int Supers_, int Subs_,int Options_>
+template <typename CoefficientsType_, int Rows_, int Cols_, int Supers_, int Subs_, int Options_>
 class BandMatrixWrapper;
 
-template<typename CoefficientsType_,int Rows_, int Cols_, int Supers_, int Subs_,int Options_>
-struct traits<BandMatrixWrapper<CoefficientsType_,Rows_,Cols_,Supers_,Subs_,Options_> >
-{
+template <typename CoefficientsType_, int Rows_, int Cols_, int Supers_, int Subs_, int Options_>
+struct traits<BandMatrixWrapper<CoefficientsType_, Rows_, Cols_, Supers_, Subs_, Options_> > {
   typedef typename CoefficientsType_::Scalar Scalar;
   typedef typename CoefficientsType_::StorageKind StorageKind;
   typedef typename CoefficientsType_::StorageIndex StorageIndex;
@@ -255,102 +239,100 @@
     Supers = Supers_,
     Subs = Subs_,
     Options = Options_,
-    DataRowsAtCompileTime = ((Supers!=Dynamic) && (Subs!=Dynamic)) ? 1 + Supers + Subs : Dynamic
+    DataRowsAtCompileTime = ((Supers != Dynamic) && (Subs != Dynamic)) ? 1 + Supers + Subs : Dynamic
   };
   typedef CoefficientsType_ CoefficientsType;
 };
 
-template<typename CoefficientsType_,int Rows_, int Cols_, int Supers_, int Subs_,int Options_>
-class BandMatrixWrapper : public BandMatrixBase<BandMatrixWrapper<CoefficientsType_,Rows_,Cols_,Supers_,Subs_,Options_> >
-{
-  public:
+template <typename CoefficientsType_, int Rows_, int Cols_, int Supers_, int Subs_, int Options_>
+class BandMatrixWrapper
+    : public BandMatrixBase<BandMatrixWrapper<CoefficientsType_, Rows_, Cols_, Supers_, Subs_, Options_> > {
+ public:
+  typedef typename internal::traits<BandMatrixWrapper>::Scalar Scalar;
+  typedef typename internal::traits<BandMatrixWrapper>::CoefficientsType CoefficientsType;
+  typedef typename internal::traits<BandMatrixWrapper>::StorageIndex StorageIndex;
 
-    typedef typename internal::traits<BandMatrixWrapper>::Scalar Scalar;
-    typedef typename internal::traits<BandMatrixWrapper>::CoefficientsType CoefficientsType;
-    typedef typename internal::traits<BandMatrixWrapper>::StorageIndex StorageIndex;
+  explicit inline BandMatrixWrapper(const CoefficientsType& coeffs, Index rows = Rows_, Index cols = Cols_,
+                                    Index supers = Supers_, Index subs = Subs_)
+      : m_coeffs(coeffs), m_rows(rows), m_supers(supers), m_subs(subs) {
+    EIGEN_UNUSED_VARIABLE(cols);
+    // eigen_assert(coeffs.cols()==cols() && (supers()+subs()+1)==coeffs.rows());
+  }
 
-    explicit inline BandMatrixWrapper(const CoefficientsType& coeffs, Index rows=Rows_, Index cols=Cols_, Index supers=Supers_, Index subs=Subs_)
-      : m_coeffs(coeffs),
-        m_rows(rows), m_supers(supers), m_subs(subs)
-    {
-      EIGEN_UNUSED_VARIABLE(cols);
-      // eigen_assert(coeffs.cols()==cols() && (supers()+subs()+1)==coeffs.rows());
-    }
+  /** \returns the number of columns */
+  inline EIGEN_CONSTEXPR Index rows() const { return m_rows.value(); }
 
-    /** \returns the number of columns */
-    inline EIGEN_CONSTEXPR Index rows() const { return m_rows.value(); }
+  /** \returns the number of rows */
+  inline EIGEN_CONSTEXPR Index cols() const { return m_coeffs.cols(); }
 
-    /** \returns the number of rows */
-    inline EIGEN_CONSTEXPR Index cols() const { return m_coeffs.cols(); }
+  /** \returns the number of super diagonals */
+  inline EIGEN_CONSTEXPR Index supers() const { return m_supers.value(); }
 
-    /** \returns the number of super diagonals */
-    inline EIGEN_CONSTEXPR Index supers() const { return m_supers.value(); }
+  /** \returns the number of sub diagonals */
+  inline EIGEN_CONSTEXPR Index subs() const { return m_subs.value(); }
 
-    /** \returns the number of sub diagonals */
-    inline EIGEN_CONSTEXPR Index subs() const { return m_subs.value(); }
+  inline const CoefficientsType& coeffs() const { return m_coeffs; }
 
-    inline const CoefficientsType& coeffs() const { return m_coeffs; }
-
-  protected:
-
-    const CoefficientsType& m_coeffs;
-    internal::variable_if_dynamic<Index, Rows_>   m_rows;
-    internal::variable_if_dynamic<Index, Supers_> m_supers;
-    internal::variable_if_dynamic<Index, Subs_>   m_subs;
+ protected:
+  const CoefficientsType& m_coeffs;
+  internal::variable_if_dynamic<Index, Rows_> m_rows;
+  internal::variable_if_dynamic<Index, Supers_> m_supers;
+  internal::variable_if_dynamic<Index, Subs_> m_subs;
 };
 
 /**
-  * \class TridiagonalMatrix
-  * \ingroup Core_Module
-  *
-  * \brief Represents a tridiagonal matrix with a compact banded storage
-  *
-  * \tparam Scalar Numeric type, i.e. float, double, int
-  * \tparam Size Number of rows and cols, or \b Dynamic
-  * \tparam Options Can be 0 or \b SelfAdjoint
-  *
-  * \sa class BandMatrix
-  */
-template<typename Scalar, int Size, int Options>
-class TridiagonalMatrix : public BandMatrix<Scalar,Size,Size,Options&SelfAdjoint?0:1,1,Options|RowMajor>
-{
-    typedef BandMatrix<Scalar,Size,Size,Options&SelfAdjoint?0:1,1,Options|RowMajor> Base;
-    typedef typename Base::StorageIndex StorageIndex;
-  public:
-    explicit TridiagonalMatrix(Index size = Size) : Base(size,size,Options&SelfAdjoint?0:1,1) {}
+ * \class TridiagonalMatrix
+ * \ingroup Core_Module
+ *
+ * \brief Represents a tridiagonal matrix with a compact banded storage
+ *
+ * \tparam Scalar Numeric type, i.e. float, double, int
+ * \tparam Size Number of rows and cols, or \b Dynamic
+ * \tparam Options Can be 0 or \b SelfAdjoint
+ *
+ * \sa class BandMatrix
+ */
+template <typename Scalar, int Size, int Options>
+class TridiagonalMatrix : public BandMatrix<Scalar, Size, Size, Options & SelfAdjoint ? 0 : 1, 1, Options | RowMajor> {
+  typedef BandMatrix<Scalar, Size, Size, Options & SelfAdjoint ? 0 : 1, 1, Options | RowMajor> Base;
+  typedef typename Base::StorageIndex StorageIndex;
 
-    inline typename Base::template DiagonalIntReturnType<1>::Type super()
-    { return Base::template diagonal<1>(); }
-    inline const typename Base::template DiagonalIntReturnType<1>::Type super() const
-    { return Base::template diagonal<1>(); }
-    inline typename Base::template DiagonalIntReturnType<-1>::Type sub()
-    { return Base::template diagonal<-1>(); }
-    inline const typename Base::template DiagonalIntReturnType<-1>::Type sub() const
-    { return Base::template diagonal<-1>(); }
-  protected:
+ public:
+  explicit TridiagonalMatrix(Index size = Size) : Base(size, size, Options & SelfAdjoint ? 0 : 1, 1) {}
+
+  inline typename Base::template DiagonalIntReturnType<1>::Type super() { return Base::template diagonal<1>(); }
+  inline const typename Base::template DiagonalIntReturnType<1>::Type super() const {
+    return Base::template diagonal<1>();
+  }
+  inline typename Base::template DiagonalIntReturnType<-1>::Type sub() { return Base::template diagonal<-1>(); }
+  inline const typename Base::template DiagonalIntReturnType<-1>::Type sub() const {
+    return Base::template diagonal<-1>();
+  }
+
+ protected:
 };
 
-
 struct BandShape {};
 
-template<typename Scalar_, int Rows_, int Cols_, int Supers_, int Subs_, int Options_>
-struct evaluator_traits<BandMatrix<Scalar_,Rows_,Cols_,Supers_,Subs_,Options_> >
-  : public evaluator_traits_base<BandMatrix<Scalar_,Rows_,Cols_,Supers_,Subs_,Options_> >
-{
+template <typename Scalar_, int Rows_, int Cols_, int Supers_, int Subs_, int Options_>
+struct evaluator_traits<BandMatrix<Scalar_, Rows_, Cols_, Supers_, Subs_, Options_> >
+    : public evaluator_traits_base<BandMatrix<Scalar_, Rows_, Cols_, Supers_, Subs_, Options_> > {
   typedef BandShape Shape;
 };
 
-template<typename CoefficientsType_,int Rows_, int Cols_, int Supers_, int Subs_,int Options_>
-struct evaluator_traits<BandMatrixWrapper<CoefficientsType_,Rows_,Cols_,Supers_,Subs_,Options_> >
-  : public evaluator_traits_base<BandMatrixWrapper<CoefficientsType_,Rows_,Cols_,Supers_,Subs_,Options_> >
-{
+template <typename CoefficientsType_, int Rows_, int Cols_, int Supers_, int Subs_, int Options_>
+struct evaluator_traits<BandMatrixWrapper<CoefficientsType_, Rows_, Cols_, Supers_, Subs_, Options_> >
+    : public evaluator_traits_base<BandMatrixWrapper<CoefficientsType_, Rows_, Cols_, Supers_, Subs_, Options_> > {
   typedef BandShape Shape;
 };
 
-template<> struct AssignmentKind<DenseShape,BandShape> { typedef EigenBase2EigenBase Kind; };
+template <>
+struct AssignmentKind<DenseShape, BandShape> {
+  typedef EigenBase2EigenBase Kind;
+};
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_BANDMATRIX_H
+#endif  // EIGEN_BANDMATRIX_H
diff --git a/Eigen/src/Core/Block.h b/Eigen/src/Core/Block.h
index 248d297..9b16ed2 100644
--- a/Eigen/src/Core/Block.h
+++ b/Eigen/src/Core/Block.h
@@ -17,468 +17,423 @@
 namespace Eigen {
 
 namespace internal {
-template<typename XprType_, int BlockRows, int BlockCols, bool InnerPanel_>
-struct traits<Block<XprType_, BlockRows, BlockCols, InnerPanel_> > : traits<XprType_>
-{
+template <typename XprType_, int BlockRows, int BlockCols, bool InnerPanel_>
+struct traits<Block<XprType_, BlockRows, BlockCols, InnerPanel_>> : traits<XprType_> {
   typedef typename traits<XprType_>::Scalar Scalar;
   typedef typename traits<XprType_>::StorageKind StorageKind;
   typedef typename traits<XprType_>::XprKind XprKind;
   typedef typename ref_selector<XprType_>::type XprTypeNested;
   typedef std::remove_reference_t<XprTypeNested> XprTypeNested_;
-  enum{
+  enum {
     MatrixRows = traits<XprType_>::RowsAtCompileTime,
     MatrixCols = traits<XprType_>::ColsAtCompileTime,
     RowsAtCompileTime = MatrixRows == 0 ? 0 : BlockRows,
     ColsAtCompileTime = MatrixCols == 0 ? 0 : BlockCols,
-    MaxRowsAtCompileTime = BlockRows==0 ? 0
-                         : RowsAtCompileTime != Dynamic ? int(RowsAtCompileTime)
-                         : int(traits<XprType_>::MaxRowsAtCompileTime),
-    MaxColsAtCompileTime = BlockCols==0 ? 0
-                         : ColsAtCompileTime != Dynamic ? int(ColsAtCompileTime)
-                         : int(traits<XprType_>::MaxColsAtCompileTime),
+    MaxRowsAtCompileTime = BlockRows == 0                 ? 0
+                           : RowsAtCompileTime != Dynamic ? int(RowsAtCompileTime)
+                                                          : int(traits<XprType_>::MaxRowsAtCompileTime),
+    MaxColsAtCompileTime = BlockCols == 0                 ? 0
+                           : ColsAtCompileTime != Dynamic ? int(ColsAtCompileTime)
+                                                          : int(traits<XprType_>::MaxColsAtCompileTime),
 
-    XprTypeIsRowMajor = (int(traits<XprType_>::Flags)&RowMajorBit) != 0,
-    IsRowMajor = (MaxRowsAtCompileTime==1&&MaxColsAtCompileTime!=1) ? 1
-               : (MaxColsAtCompileTime==1&&MaxRowsAtCompileTime!=1) ? 0
-               : XprTypeIsRowMajor,
+    XprTypeIsRowMajor = (int(traits<XprType_>::Flags) & RowMajorBit) != 0,
+    IsRowMajor = (MaxRowsAtCompileTime == 1 && MaxColsAtCompileTime != 1)   ? 1
+                 : (MaxColsAtCompileTime == 1 && MaxRowsAtCompileTime != 1) ? 0
+                                                                            : XprTypeIsRowMajor,
     HasSameStorageOrderAsXprType = (IsRowMajor == XprTypeIsRowMajor),
     InnerSize = IsRowMajor ? int(ColsAtCompileTime) : int(RowsAtCompileTime),
-    InnerStrideAtCompileTime = HasSameStorageOrderAsXprType
-                             ? int(inner_stride_at_compile_time<XprType_>::ret)
-                             : int(outer_stride_at_compile_time<XprType_>::ret),
-    OuterStrideAtCompileTime = HasSameStorageOrderAsXprType
-                             ? int(outer_stride_at_compile_time<XprType_>::ret)
-                             : int(inner_stride_at_compile_time<XprType_>::ret),
+    InnerStrideAtCompileTime = HasSameStorageOrderAsXprType ? int(inner_stride_at_compile_time<XprType_>::ret)
+                                                            : int(outer_stride_at_compile_time<XprType_>::ret),
+    OuterStrideAtCompileTime = HasSameStorageOrderAsXprType ? int(outer_stride_at_compile_time<XprType_>::ret)
+                                                            : int(inner_stride_at_compile_time<XprType_>::ret),
 
     // FIXME, this traits is rather specialized for dense object and it needs to be cleaned further
     FlagsLvalueBit = is_lvalue<XprType_>::value ? LvalueBit : 0,
     FlagsRowMajorBit = IsRowMajor ? RowMajorBit : 0,
-    Flags = (traits<XprType_>::Flags & (DirectAccessBit | (InnerPanel_?CompressedAccessBit:0))) | FlagsLvalueBit | FlagsRowMajorBit,
+    Flags = (traits<XprType_>::Flags & (DirectAccessBit | (InnerPanel_ ? CompressedAccessBit : 0))) | FlagsLvalueBit |
+            FlagsRowMajorBit,
     // FIXME DirectAccessBit should not be handled by expressions
     //
     // Alignment is needed by MapBase's assertions
-    // We can sefely set it to false here. Internal alignment errors will be detected by an eigen_internal_assert in the respective evaluator
+    // We can sefely set it to false here. Internal alignment errors will be detected by an eigen_internal_assert in the
+    // respective evaluator
     Alignment = 0,
     InnerPanel = InnerPanel_ ? 1 : 0
   };
 };
 
-template<typename XprType, int BlockRows=Dynamic, int BlockCols=Dynamic, bool InnerPanel = false,
-         bool HasDirectAccess = internal::has_direct_access<XprType>::ret> class BlockImpl_dense;
+template <typename XprType, int BlockRows = Dynamic, int BlockCols = Dynamic, bool InnerPanel = false,
+          bool HasDirectAccess = internal::has_direct_access<XprType>::ret>
+class BlockImpl_dense;
 
-} // end namespace internal
+}  // end namespace internal
 
-template<typename XprType, int BlockRows, int BlockCols, bool InnerPanel, typename StorageKind> class BlockImpl;
+template <typename XprType, int BlockRows, int BlockCols, bool InnerPanel, typename StorageKind>
+class BlockImpl;
 
 /** \class Block
-  * \ingroup Core_Module
-  *
-  * \brief Expression of a fixed-size or dynamic-size block
-  *
-  * \tparam XprType the type of the expression in which we are taking a block
-  * \tparam BlockRows the number of rows of the block we are taking at compile time (optional)
-  * \tparam BlockCols the number of columns of the block we are taking at compile time (optional)
-  * \tparam InnerPanel is true, if the block maps to a set of rows of a row major matrix or
-  *         to set of columns of a column major matrix (optional). The parameter allows to determine
-  *         at compile time whether aligned access is possible on the block expression.
-  *
-  * This class represents an expression of either a fixed-size or dynamic-size block. It is the return
-  * type of DenseBase::block(Index,Index,Index,Index) and DenseBase::block<int,int>(Index,Index) and
-  * most of the time this is the only way it is used.
-  *
-  * However, if you want to directly manipulate block expressions,
-  * for instance if you want to write a function returning such an expression, you
-  * will need to use this class.
-  *
-  * Here is an example illustrating the dynamic case:
-  * \include class_Block.cpp
-  * Output: \verbinclude class_Block.out
-  *
-  * \note Even though this expression has dynamic size, in the case where \a XprType
-  * has fixed size, this expression inherits a fixed maximal size which means that evaluating
-  * it does not cause a dynamic memory allocation.
-  *
-  * Here is an example illustrating the fixed-size case:
-  * \include class_FixedBlock.cpp
-  * Output: \verbinclude class_FixedBlock.out
-  *
-  * \sa DenseBase::block(Index,Index,Index,Index), DenseBase::block(Index,Index), class VectorBlock
-  */
-template<typename XprType, int BlockRows, int BlockCols, bool InnerPanel> class Block
-  : public BlockImpl<XprType, BlockRows, BlockCols, InnerPanel, typename internal::traits<XprType>::StorageKind>
-{
-    typedef BlockImpl<XprType, BlockRows, BlockCols, InnerPanel, typename internal::traits<XprType>::StorageKind> Impl;
-    using BlockHelper = internal::block_xpr_helper<Block>;
-  public:
-    //typedef typename Impl::Base Base;
-    typedef Impl Base;
-    EIGEN_GENERIC_PUBLIC_INTERFACE(Block)
-    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Block)
+ * \ingroup Core_Module
+ *
+ * \brief Expression of a fixed-size or dynamic-size block
+ *
+ * \tparam XprType the type of the expression in which we are taking a block
+ * \tparam BlockRows the number of rows of the block we are taking at compile time (optional)
+ * \tparam BlockCols the number of columns of the block we are taking at compile time (optional)
+ * \tparam InnerPanel is true, if the block maps to a set of rows of a row major matrix or
+ *         to set of columns of a column major matrix (optional). The parameter allows to determine
+ *         at compile time whether aligned access is possible on the block expression.
+ *
+ * This class represents an expression of either a fixed-size or dynamic-size block. It is the return
+ * type of DenseBase::block(Index,Index,Index,Index) and DenseBase::block<int,int>(Index,Index) and
+ * most of the time this is the only way it is used.
+ *
+ * However, if you want to directly manipulate block expressions,
+ * for instance if you want to write a function returning such an expression, you
+ * will need to use this class.
+ *
+ * Here is an example illustrating the dynamic case:
+ * \include class_Block.cpp
+ * Output: \verbinclude class_Block.out
+ *
+ * \note Even though this expression has dynamic size, in the case where \a XprType
+ * has fixed size, this expression inherits a fixed maximal size which means that evaluating
+ * it does not cause a dynamic memory allocation.
+ *
+ * Here is an example illustrating the fixed-size case:
+ * \include class_FixedBlock.cpp
+ * Output: \verbinclude class_FixedBlock.out
+ *
+ * \sa DenseBase::block(Index,Index,Index,Index), DenseBase::block(Index,Index), class VectorBlock
+ */
+template <typename XprType, int BlockRows, int BlockCols, bool InnerPanel>
+class Block
+    : public BlockImpl<XprType, BlockRows, BlockCols, InnerPanel, typename internal::traits<XprType>::StorageKind> {
+  typedef BlockImpl<XprType, BlockRows, BlockCols, InnerPanel, typename internal::traits<XprType>::StorageKind> Impl;
+  using BlockHelper = internal::block_xpr_helper<Block>;
 
-    typedef internal::remove_all_t<XprType> NestedExpression;
+ public:
+  // typedef typename Impl::Base Base;
+  typedef Impl Base;
+  EIGEN_GENERIC_PUBLIC_INTERFACE(Block)
+  EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Block)
 
-    /** Column or Row constructor
-      */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Block(XprType& xpr, Index i) : Impl(xpr,i)
-    {
-      eigen_assert( (i>=0) && (
-          ((BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) && i<xpr.rows())
-        ||((BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) && i<xpr.cols())));
-    }
+  typedef internal::remove_all_t<XprType> NestedExpression;
 
-    /** Fixed-size constructor
-      */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Block(XprType& xpr, Index startRow, Index startCol)
-      : Impl(xpr, startRow, startCol)
-    {
-      EIGEN_STATIC_ASSERT(RowsAtCompileTime!=Dynamic && ColsAtCompileTime!=Dynamic,THIS_METHOD_IS_ONLY_FOR_FIXED_SIZE)
-      eigen_assert(startRow >= 0 && BlockRows >= 0 && startRow + BlockRows <= xpr.rows()
-             && startCol >= 0 && BlockCols >= 0 && startCol + BlockCols <= xpr.cols());
-    }
+  /** Column or Row constructor
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Block(XprType& xpr, Index i) : Impl(xpr, i) {
+    eigen_assert((i >= 0) && (((BlockRows == 1) && (BlockCols == XprType::ColsAtCompileTime) && i < xpr.rows()) ||
+                              ((BlockRows == XprType::RowsAtCompileTime) && (BlockCols == 1) && i < xpr.cols())));
+  }
 
-    /** Dynamic-size constructor
-      */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Block(XprType& xpr,
-          Index startRow, Index startCol,
-          Index blockRows, Index blockCols)
-      : Impl(xpr, startRow, startCol, blockRows, blockCols)
-    {
-      eigen_assert((RowsAtCompileTime==Dynamic || RowsAtCompileTime==blockRows)
-          && (ColsAtCompileTime==Dynamic || ColsAtCompileTime==blockCols));
-      eigen_assert(startRow >= 0 && blockRows >= 0 && startRow  <= xpr.rows() - blockRows
-          && startCol >= 0 && blockCols >= 0 && startCol <= xpr.cols() - blockCols);
-    }
+  /** Fixed-size constructor
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Block(XprType& xpr, Index startRow, Index startCol)
+      : Impl(xpr, startRow, startCol) {
+    EIGEN_STATIC_ASSERT(RowsAtCompileTime != Dynamic && ColsAtCompileTime != Dynamic,
+                        THIS_METHOD_IS_ONLY_FOR_FIXED_SIZE)
+    eigen_assert(startRow >= 0 && BlockRows >= 0 && startRow + BlockRows <= xpr.rows() && startCol >= 0 &&
+                 BlockCols >= 0 && startCol + BlockCols <= xpr.cols());
+  }
 
-    // convert nested blocks (e.g. Block<Block<MatrixType>>) to a simple block expression (Block<MatrixType>)
+  /** Dynamic-size constructor
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Block(XprType& xpr, Index startRow, Index startCol, Index blockRows,
+                                              Index blockCols)
+      : Impl(xpr, startRow, startCol, blockRows, blockCols) {
+    eigen_assert((RowsAtCompileTime == Dynamic || RowsAtCompileTime == blockRows) &&
+                 (ColsAtCompileTime == Dynamic || ColsAtCompileTime == blockCols));
+    eigen_assert(startRow >= 0 && blockRows >= 0 && startRow <= xpr.rows() - blockRows && startCol >= 0 &&
+                 blockCols >= 0 && startCol <= xpr.cols() - blockCols);
+  }
 
-    using ConstUnwindReturnType = Block<const typename BlockHelper::BaseType, BlockRows, BlockCols, InnerPanel>;
-    using UnwindReturnType = Block<typename BlockHelper::BaseType, BlockRows, BlockCols, InnerPanel>;
+  // convert nested blocks (e.g. Block<Block<MatrixType>>) to a simple block expression (Block<MatrixType>)
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ConstUnwindReturnType unwind() const {
-      return ConstUnwindReturnType(BlockHelper::base(*this), BlockHelper::row(*this, 0), BlockHelper::col(*this, 0),
-                                   this->rows(), this->cols());
-    }
+  using ConstUnwindReturnType = Block<const typename BlockHelper::BaseType, BlockRows, BlockCols, InnerPanel>;
+  using UnwindReturnType = Block<typename BlockHelper::BaseType, BlockRows, BlockCols, InnerPanel>;
 
-    template <typename T = Block, typename EnableIf = std::enable_if_t<!std::is_const<T>::value>>
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE UnwindReturnType unwind() {
-      return UnwindReturnType(BlockHelper::base(*this), BlockHelper::row(*this, 0), BlockHelper::col(*this, 0),
-                              this->rows(), this->cols());
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ConstUnwindReturnType unwind() const {
+    return ConstUnwindReturnType(BlockHelper::base(*this), BlockHelper::row(*this, 0), BlockHelper::col(*this, 0),
+                                 this->rows(), this->cols());
+  }
+
+  template <typename T = Block, typename EnableIf = std::enable_if_t<!std::is_const<T>::value>>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE UnwindReturnType unwind() {
+    return UnwindReturnType(BlockHelper::base(*this), BlockHelper::row(*this, 0), BlockHelper::col(*this, 0),
+                            this->rows(), this->cols());
+  }
 };
 
 // The generic default implementation for dense block simply forward to the internal::BlockImpl_dense
 // that must be specialized for direct and non-direct access...
-template<typename XprType, int BlockRows, int BlockCols, bool InnerPanel>
+template <typename XprType, int BlockRows, int BlockCols, bool InnerPanel>
 class BlockImpl<XprType, BlockRows, BlockCols, InnerPanel, Dense>
-  : public internal::BlockImpl_dense<XprType, BlockRows, BlockCols, InnerPanel>
-{
-    typedef internal::BlockImpl_dense<XprType, BlockRows, BlockCols, InnerPanel> Impl;
-    typedef typename XprType::StorageIndex StorageIndex;
-  public:
-    typedef Impl Base;
-    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(BlockImpl)
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE BlockImpl(XprType& xpr, Index i) : Impl(xpr,i) {}
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE BlockImpl(XprType& xpr, Index startRow, Index startCol) : Impl(xpr, startRow, startCol) {}
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE BlockImpl(XprType& xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
+    : public internal::BlockImpl_dense<XprType, BlockRows, BlockCols, InnerPanel> {
+  typedef internal::BlockImpl_dense<XprType, BlockRows, BlockCols, InnerPanel> Impl;
+  typedef typename XprType::StorageIndex StorageIndex;
+
+ public:
+  typedef Impl Base;
+  EIGEN_INHERIT_ASSIGNMENT_OPERATORS(BlockImpl)
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE BlockImpl(XprType& xpr, Index i) : Impl(xpr, i) {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE BlockImpl(XprType& xpr, Index startRow, Index startCol)
+      : Impl(xpr, startRow, startCol) {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE BlockImpl(XprType& xpr, Index startRow, Index startCol, Index blockRows,
+                                                  Index blockCols)
       : Impl(xpr, startRow, startCol, blockRows, blockCols) {}
 };
 
 namespace internal {
 
 /** \internal Internal implementation of dense Blocks in the general case. */
-template<typename XprType, int BlockRows, int BlockCols, bool InnerPanel, bool HasDirectAccess> class BlockImpl_dense
-  : public internal::dense_xpr_base<Block<XprType, BlockRows, BlockCols, InnerPanel> >::type
-{
-    typedef Block<XprType, BlockRows, BlockCols, InnerPanel> BlockType;
-    typedef typename internal::ref_selector<XprType>::non_const_type XprTypeNested;
-  public:
+template <typename XprType, int BlockRows, int BlockCols, bool InnerPanel, bool HasDirectAccess>
+class BlockImpl_dense : public internal::dense_xpr_base<Block<XprType, BlockRows, BlockCols, InnerPanel>>::type {
+  typedef Block<XprType, BlockRows, BlockCols, InnerPanel> BlockType;
+  typedef typename internal::ref_selector<XprType>::non_const_type XprTypeNested;
 
-    typedef typename internal::dense_xpr_base<BlockType>::type Base;
-    EIGEN_DENSE_PUBLIC_INTERFACE(BlockType)
-    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(BlockImpl_dense)
+ public:
+  typedef typename internal::dense_xpr_base<BlockType>::type Base;
+  EIGEN_DENSE_PUBLIC_INTERFACE(BlockType)
+  EIGEN_INHERIT_ASSIGNMENT_OPERATORS(BlockImpl_dense)
 
-    // class InnerIterator; // FIXME apparently never used
+  // class InnerIterator; // FIXME apparently never used
 
-    /** Column or Row constructor
-      */
-    EIGEN_DEVICE_FUNC
-    inline BlockImpl_dense(XprType& xpr, Index i)
+  /** Column or Row constructor
+   */
+  EIGEN_DEVICE_FUNC inline BlockImpl_dense(XprType& xpr, Index i)
       : m_xpr(xpr),
         // It is a row if and only if BlockRows==1 and BlockCols==XprType::ColsAtCompileTime,
         // and it is a column if and only if BlockRows==XprType::RowsAtCompileTime and BlockCols==1,
         // all other cases are invalid.
         // The case a 1x1 matrix seems ambiguous, but the result is the same anyway.
-        m_startRow( (BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) ? i : 0),
-        m_startCol( (BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) ? i : 0),
-        m_blockRows(BlockRows==1 ? 1 : xpr.rows()),
-        m_blockCols(BlockCols==1 ? 1 : xpr.cols())
-    {}
+        m_startRow((BlockRows == 1) && (BlockCols == XprType::ColsAtCompileTime) ? i : 0),
+        m_startCol((BlockRows == XprType::RowsAtCompileTime) && (BlockCols == 1) ? i : 0),
+        m_blockRows(BlockRows == 1 ? 1 : xpr.rows()),
+        m_blockCols(BlockCols == 1 ? 1 : xpr.cols()) {}
 
-    /** Fixed-size constructor
-      */
-    EIGEN_DEVICE_FUNC
-    inline BlockImpl_dense(XprType& xpr, Index startRow, Index startCol)
-      : m_xpr(xpr), m_startRow(startRow), m_startCol(startCol),
-                    m_blockRows(BlockRows), m_blockCols(BlockCols)
-    {}
+  /** Fixed-size constructor
+   */
+  EIGEN_DEVICE_FUNC inline BlockImpl_dense(XprType& xpr, Index startRow, Index startCol)
+      : m_xpr(xpr), m_startRow(startRow), m_startCol(startCol), m_blockRows(BlockRows), m_blockCols(BlockCols) {}
 
-    /** Dynamic-size constructor
-      */
-    EIGEN_DEVICE_FUNC
-    inline BlockImpl_dense(XprType& xpr,
-          Index startRow, Index startCol,
-          Index blockRows, Index blockCols)
-      : m_xpr(xpr), m_startRow(startRow), m_startCol(startCol),
-                    m_blockRows(blockRows), m_blockCols(blockCols)
-    {}
+  /** Dynamic-size constructor
+   */
+  EIGEN_DEVICE_FUNC inline BlockImpl_dense(XprType& xpr, Index startRow, Index startCol, Index blockRows,
+                                           Index blockCols)
+      : m_xpr(xpr), m_startRow(startRow), m_startCol(startCol), m_blockRows(blockRows), m_blockCols(blockCols) {}
 
-    EIGEN_DEVICE_FUNC inline Index rows() const { return m_blockRows.value(); }
-    EIGEN_DEVICE_FUNC inline Index cols() const { return m_blockCols.value(); }
+  EIGEN_DEVICE_FUNC inline Index rows() const { return m_blockRows.value(); }
+  EIGEN_DEVICE_FUNC inline Index cols() const { return m_blockCols.value(); }
 
-    EIGEN_DEVICE_FUNC
-    inline Scalar& coeffRef(Index rowId, Index colId)
-    {
-      EIGEN_STATIC_ASSERT_LVALUE(XprType)
-      return m_xpr.coeffRef(rowId + m_startRow.value(), colId + m_startCol.value());
-    }
+  EIGEN_DEVICE_FUNC inline Scalar& coeffRef(Index rowId, Index colId) {
+    EIGEN_STATIC_ASSERT_LVALUE(XprType)
+    return m_xpr.coeffRef(rowId + m_startRow.value(), colId + m_startCol.value());
+  }
 
-    EIGEN_DEVICE_FUNC
-    inline const Scalar& coeffRef(Index rowId, Index colId) const
-    {
-      return m_xpr.derived().coeffRef(rowId + m_startRow.value(), colId + m_startCol.value());
-    }
+  EIGEN_DEVICE_FUNC inline const Scalar& coeffRef(Index rowId, Index colId) const {
+    return m_xpr.derived().coeffRef(rowId + m_startRow.value(), colId + m_startCol.value());
+  }
 
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE const CoeffReturnType coeff(Index rowId, Index colId) const
-    {
-      return m_xpr.coeff(rowId + m_startRow.value(), colId + m_startCol.value());
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CoeffReturnType coeff(Index rowId, Index colId) const {
+    return m_xpr.coeff(rowId + m_startRow.value(), colId + m_startCol.value());
+  }
 
-    EIGEN_DEVICE_FUNC
-    inline Scalar& coeffRef(Index index)
-    {
-      EIGEN_STATIC_ASSERT_LVALUE(XprType)
-      return m_xpr.coeffRef(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
-                            m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
-    }
+  EIGEN_DEVICE_FUNC inline Scalar& coeffRef(Index index) {
+    EIGEN_STATIC_ASSERT_LVALUE(XprType)
+    return m_xpr.coeffRef(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
+                          m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
+  }
 
-    EIGEN_DEVICE_FUNC
-    inline const Scalar& coeffRef(Index index) const
-    {
-      return m_xpr.coeffRef(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
-                            m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
-    }
+  EIGEN_DEVICE_FUNC inline const Scalar& coeffRef(Index index) const {
+    return m_xpr.coeffRef(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
+                          m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
+  }
 
-    EIGEN_DEVICE_FUNC
-    inline const CoeffReturnType coeff(Index index) const
-    {
-      return m_xpr.coeff(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
-                         m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
-    }
+  EIGEN_DEVICE_FUNC inline const CoeffReturnType coeff(Index index) const {
+    return m_xpr.coeff(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
+                       m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
+  }
 
-    template<int LoadMode>
-    EIGEN_DEVICE_FUNC inline PacketScalar packet(Index rowId, Index colId) const
-    {
-      return m_xpr.template packet<Unaligned>(rowId + m_startRow.value(), colId + m_startCol.value());
-    }
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC inline PacketScalar packet(Index rowId, Index colId) const {
+    return m_xpr.template packet<Unaligned>(rowId + m_startRow.value(), colId + m_startCol.value());
+  }
 
-    template<int LoadMode>
-    EIGEN_DEVICE_FUNC inline void writePacket(Index rowId, Index colId, const PacketScalar& val)
-    {
-      m_xpr.template writePacket<Unaligned>(rowId + m_startRow.value(), colId + m_startCol.value(), val);
-    }
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC inline void writePacket(Index rowId, Index colId, const PacketScalar& val) {
+    m_xpr.template writePacket<Unaligned>(rowId + m_startRow.value(), colId + m_startCol.value(), val);
+  }
 
-    template<int LoadMode>
-    EIGEN_DEVICE_FUNC inline PacketScalar packet(Index index) const
-    {
-      return m_xpr.template packet<Unaligned>
-              (m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
-               m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
-    }
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC inline PacketScalar packet(Index index) const {
+    return m_xpr.template packet<Unaligned>(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
+                                            m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
+  }
 
-    template<int LoadMode>
-    EIGEN_DEVICE_FUNC inline void writePacket(Index index, const PacketScalar& val)
-    {
-      m_xpr.template writePacket<Unaligned>
-         (m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
-          m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0), val);
-    }
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC inline void writePacket(Index index, const PacketScalar& val) {
+    m_xpr.template writePacket<Unaligned>(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
+                                          m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0), val);
+  }
 
-    #ifdef EIGEN_PARSED_BY_DOXYGEN
-    /** \sa MapBase::data() */
-    EIGEN_DEVICE_FUNC inline const Scalar* data() const;
-    EIGEN_DEVICE_FUNC inline Index innerStride() const;
-    EIGEN_DEVICE_FUNC inline Index outerStride() const;
-    #endif
+#ifdef EIGEN_PARSED_BY_DOXYGEN
+  /** \sa MapBase::data() */
+  EIGEN_DEVICE_FUNC inline const Scalar* data() const;
+  EIGEN_DEVICE_FUNC inline Index innerStride() const;
+  EIGEN_DEVICE_FUNC inline Index outerStride() const;
+#endif
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    const internal::remove_all_t<XprTypeNested>& nestedExpression() const
-    {
-      return m_xpr;
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const internal::remove_all_t<XprTypeNested>& nestedExpression() const {
+    return m_xpr;
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    XprType& nestedExpression() { return m_xpr; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE XprType& nestedExpression() { return m_xpr; }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-    StorageIndex startRow() const EIGEN_NOEXCEPT
-    {
-      return m_startRow.value();
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR StorageIndex startRow() const EIGEN_NOEXCEPT {
+    return m_startRow.value();
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-    StorageIndex startCol() const EIGEN_NOEXCEPT
-    {
-      return m_startCol.value();
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR StorageIndex startCol() const EIGEN_NOEXCEPT {
+    return m_startCol.value();
+  }
 
-  protected:
-
-    XprTypeNested m_xpr;
-    const internal::variable_if_dynamic<StorageIndex, (XprType::RowsAtCompileTime == 1 && BlockRows==1) ? 0 : Dynamic> m_startRow;
-    const internal::variable_if_dynamic<StorageIndex, (XprType::ColsAtCompileTime == 1 && BlockCols==1) ? 0 : Dynamic> m_startCol;
-    const internal::variable_if_dynamic<StorageIndex, RowsAtCompileTime> m_blockRows;
-    const internal::variable_if_dynamic<StorageIndex, ColsAtCompileTime> m_blockCols;
+ protected:
+  XprTypeNested m_xpr;
+  const internal::variable_if_dynamic<StorageIndex, (XprType::RowsAtCompileTime == 1 && BlockRows == 1) ? 0 : Dynamic>
+      m_startRow;
+  const internal::variable_if_dynamic<StorageIndex, (XprType::ColsAtCompileTime == 1 && BlockCols == 1) ? 0 : Dynamic>
+      m_startCol;
+  const internal::variable_if_dynamic<StorageIndex, RowsAtCompileTime> m_blockRows;
+  const internal::variable_if_dynamic<StorageIndex, ColsAtCompileTime> m_blockCols;
 };
 
 /** \internal Internal implementation of dense Blocks in the direct access case.*/
-template<typename XprType, int BlockRows, int BlockCols, bool InnerPanel>
-class BlockImpl_dense<XprType,BlockRows,BlockCols, InnerPanel,true>
-  : public MapBase<Block<XprType, BlockRows, BlockCols, InnerPanel> >
-{
-    typedef Block<XprType, BlockRows, BlockCols, InnerPanel> BlockType;
-    typedef typename internal::ref_selector<XprType>::non_const_type XprTypeNested;
-    enum {
-      XprTypeIsRowMajor = (int(traits<XprType>::Flags)&RowMajorBit) != 0
-    };
+template <typename XprType, int BlockRows, int BlockCols, bool InnerPanel>
+class BlockImpl_dense<XprType, BlockRows, BlockCols, InnerPanel, true>
+    : public MapBase<Block<XprType, BlockRows, BlockCols, InnerPanel>> {
+  typedef Block<XprType, BlockRows, BlockCols, InnerPanel> BlockType;
+  typedef typename internal::ref_selector<XprType>::non_const_type XprTypeNested;
+  enum { XprTypeIsRowMajor = (int(traits<XprType>::Flags) & RowMajorBit) != 0 };
 
-    /** \internal Returns base+offset (unless base is null, in which case returns null).
-      * Adding an offset to nullptr is undefined behavior, so we must avoid it.
-      */
-    template <typename Scalar>
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR EIGEN_ALWAYS_INLINE
-    static Scalar* add_to_nullable_pointer(Scalar* base, Index offset)
-    {
-      return base != nullptr ? base+offset : nullptr;
-    }
+  /** \internal Returns base+offset (unless base is null, in which case returns null).
+   * Adding an offset to nullptr is undefined behavior, so we must avoid it.
+   */
+  template <typename Scalar>
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR EIGEN_ALWAYS_INLINE static Scalar* add_to_nullable_pointer(Scalar* base,
+                                                                                               Index offset) {
+    return base != nullptr ? base + offset : nullptr;
+  }
 
-  public:
+ public:
+  typedef MapBase<BlockType> Base;
+  EIGEN_DENSE_PUBLIC_INTERFACE(BlockType)
+  EIGEN_INHERIT_ASSIGNMENT_OPERATORS(BlockImpl_dense)
 
-    typedef MapBase<BlockType> Base;
-    EIGEN_DENSE_PUBLIC_INTERFACE(BlockType)
-    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(BlockImpl_dense)
-
-    /** Column or Row constructor
-      */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    BlockImpl_dense(XprType& xpr, Index i)
-      : Base((BlockRows == 0 || BlockCols == 0) ? nullptr : add_to_nullable_pointer(xpr.data(),
-                 i * (    ((BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) && (!XprTypeIsRowMajor))
-                       || ((BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) && ( XprTypeIsRowMajor)) ? xpr.innerStride() : xpr.outerStride())),
-             BlockRows==1 ? 1 : xpr.rows(),
-             BlockCols==1 ? 1 : xpr.cols()),
+  /** Column or Row constructor
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE BlockImpl_dense(XprType& xpr, Index i)
+      : Base((BlockRows == 0 || BlockCols == 0)
+                 ? nullptr
+                 : add_to_nullable_pointer(
+                       xpr.data(),
+                       i * (((BlockRows == 1) && (BlockCols == XprType::ColsAtCompileTime) && (!XprTypeIsRowMajor)) ||
+                                    ((BlockRows == XprType::RowsAtCompileTime) && (BlockCols == 1) &&
+                                     (XprTypeIsRowMajor))
+                                ? xpr.innerStride()
+                                : xpr.outerStride())),
+             BlockRows == 1 ? 1 : xpr.rows(), BlockCols == 1 ? 1 : xpr.cols()),
         m_xpr(xpr),
-        m_startRow( (BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) ? i : 0),
-        m_startCol( (BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) ? i : 0)
-    {
-      init();
-    }
+        m_startRow((BlockRows == 1) && (BlockCols == XprType::ColsAtCompileTime) ? i : 0),
+        m_startCol((BlockRows == XprType::RowsAtCompileTime) && (BlockCols == 1) ? i : 0) {
+    init();
+  }
 
-    /** Fixed-size constructor
-      */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    BlockImpl_dense(XprType& xpr, Index startRow, Index startCol)
-      : Base((BlockRows == 0 || BlockCols == 0) ? nullptr : add_to_nullable_pointer(xpr.data(),
-                 xpr.innerStride()*(XprTypeIsRowMajor?startCol:startRow) + xpr.outerStride()*(XprTypeIsRowMajor?startRow:startCol))),
-        m_xpr(xpr), m_startRow(startRow), m_startCol(startCol)
-    {
-      init();
-    }
+  /** Fixed-size constructor
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE BlockImpl_dense(XprType& xpr, Index startRow, Index startCol)
+      : Base((BlockRows == 0 || BlockCols == 0)
+                 ? nullptr
+                 : add_to_nullable_pointer(xpr.data(),
+                                           xpr.innerStride() * (XprTypeIsRowMajor ? startCol : startRow) +
+                                               xpr.outerStride() * (XprTypeIsRowMajor ? startRow : startCol))),
+        m_xpr(xpr),
+        m_startRow(startRow),
+        m_startCol(startCol) {
+    init();
+  }
 
-    /** Dynamic-size constructor
-      */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    BlockImpl_dense(XprType& xpr,
-          Index startRow, Index startCol,
-          Index blockRows, Index blockCols)
-      : Base((blockRows == 0 || blockCols == 0) ? nullptr : add_to_nullable_pointer(xpr.data(),
-                 xpr.innerStride()*(XprTypeIsRowMajor?startCol:startRow) + xpr.outerStride()*(XprTypeIsRowMajor?startRow:startCol)),
+  /** Dynamic-size constructor
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE BlockImpl_dense(XprType& xpr, Index startRow, Index startCol, Index blockRows,
+                                                        Index blockCols)
+      : Base((blockRows == 0 || blockCols == 0)
+                 ? nullptr
+                 : add_to_nullable_pointer(xpr.data(),
+                                           xpr.innerStride() * (XprTypeIsRowMajor ? startCol : startRow) +
+                                               xpr.outerStride() * (XprTypeIsRowMajor ? startRow : startCol)),
              blockRows, blockCols),
-        m_xpr(xpr), m_startRow(startRow), m_startCol(startCol)
-    {
-      init();
-    }
+        m_xpr(xpr),
+        m_startRow(startRow),
+        m_startCol(startCol) {
+    init();
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    const internal::remove_all_t<XprTypeNested>& nestedExpression() const EIGEN_NOEXCEPT
-    {
-      return m_xpr;
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const internal::remove_all_t<XprTypeNested>& nestedExpression() const
+      EIGEN_NOEXCEPT {
+    return m_xpr;
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    XprType& nestedExpression() { return m_xpr; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE XprType& nestedExpression() { return m_xpr; }
 
-    /** \sa MapBase::innerStride() */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-    Index innerStride() const EIGEN_NOEXCEPT
-    {
-      return internal::traits<BlockType>::HasSameStorageOrderAsXprType
-             ? m_xpr.innerStride()
-             : m_xpr.outerStride();
-    }
+  /** \sa MapBase::innerStride() */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index innerStride() const EIGEN_NOEXCEPT {
+    return internal::traits<BlockType>::HasSameStorageOrderAsXprType ? m_xpr.innerStride() : m_xpr.outerStride();
+  }
 
-    /** \sa MapBase::outerStride() */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-    Index outerStride() const EIGEN_NOEXCEPT
-    {
-      return internal::traits<BlockType>::HasSameStorageOrderAsXprType
-                    ? m_xpr.outerStride()
-                    : m_xpr.innerStride();
-    }
+  /** \sa MapBase::outerStride() */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index outerStride() const EIGEN_NOEXCEPT {
+    return internal::traits<BlockType>::HasSameStorageOrderAsXprType ? m_xpr.outerStride() : m_xpr.innerStride();
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-    StorageIndex startRow() const EIGEN_NOEXCEPT { return m_startRow.value(); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR StorageIndex startRow() const EIGEN_NOEXCEPT {
+    return m_startRow.value();
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-    StorageIndex startCol() const EIGEN_NOEXCEPT { return m_startCol.value(); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR StorageIndex startCol() const EIGEN_NOEXCEPT {
+    return m_startCol.value();
+  }
 
-  #ifndef __SUNPRO_CC
+#ifndef __SUNPRO_CC
   // FIXME sunstudio is not friendly with the above friend...
   // META-FIXME there is no 'friend' keyword around here. Is this obsolete?
-  protected:
-  #endif
+ protected:
+#endif
 
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    /** \internal used by allowAligned() */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    BlockImpl_dense(XprType& xpr, const Scalar* data, Index blockRows, Index blockCols)
-      : Base(data, blockRows, blockCols), m_xpr(xpr)
-    {
-      init();
-    }
-    #endif
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  /** \internal used by allowAligned() */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE BlockImpl_dense(XprType& xpr, const Scalar* data, Index blockRows,
+                                                        Index blockCols)
+      : Base(data, blockRows, blockCols), m_xpr(xpr) {
+    init();
+  }
+#endif
 
-  protected:
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    void init()
-    {
-      m_outerStride = internal::traits<BlockType>::HasSameStorageOrderAsXprType
-                    ? m_xpr.outerStride()
-                    : m_xpr.innerStride();
-    }
+ protected:
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void init() {
+    m_outerStride =
+        internal::traits<BlockType>::HasSameStorageOrderAsXprType ? m_xpr.outerStride() : m_xpr.innerStride();
+  }
 
-    XprTypeNested m_xpr;
-    const internal::variable_if_dynamic<StorageIndex, (XprType::RowsAtCompileTime == 1 && BlockRows==1) ? 0 : Dynamic> m_startRow;
-    const internal::variable_if_dynamic<StorageIndex, (XprType::ColsAtCompileTime == 1 && BlockCols==1) ? 0 : Dynamic> m_startCol;
-    Index m_outerStride;
+  XprTypeNested m_xpr;
+  const internal::variable_if_dynamic<StorageIndex, (XprType::RowsAtCompileTime == 1 && BlockRows == 1) ? 0 : Dynamic>
+      m_startRow;
+  const internal::variable_if_dynamic<StorageIndex, (XprType::ColsAtCompileTime == 1 && BlockCols == 1) ? 0 : Dynamic>
+      m_startCol;
+  Index m_outerStride;
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_BLOCK_H
+#endif  // EIGEN_BLOCK_H
diff --git a/Eigen/src/Core/CommaInitializer.h b/Eigen/src/Core/CommaInitializer.h
index 51bf876..c629123 100644
--- a/Eigen/src/Core/CommaInitializer.h
+++ b/Eigen/src/Core/CommaInitializer.h
@@ -14,49 +14,43 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 /** \class CommaInitializer
-  * \ingroup Core_Module
-  *
-  * \brief Helper class used by the comma initializer operator
-  *
-  * This class is internally used to implement the comma initializer feature. It is
-  * the return type of MatrixBase::operator<<, and most of the time this is the only
-  * way it is used.
-  *
-  * \sa \blank \ref MatrixBaseCommaInitRef "MatrixBase::operator<<", CommaInitializer::finished()
-  */
-template<typename XprType>
-struct CommaInitializer
-{
+ * \ingroup Core_Module
+ *
+ * \brief Helper class used by the comma initializer operator
+ *
+ * This class is internally used to implement the comma initializer feature. It is
+ * the return type of MatrixBase::operator<<, and most of the time this is the only
+ * way it is used.
+ *
+ * \sa \blank \ref MatrixBaseCommaInitRef "MatrixBase::operator<<", CommaInitializer::finished()
+ */
+template <typename XprType>
+struct CommaInitializer {
   typedef typename XprType::Scalar Scalar;
 
-  EIGEN_DEVICE_FUNC
-  inline CommaInitializer(XprType& xpr, const Scalar& s)
-    : m_xpr(xpr), m_row(0), m_col(1), m_currentBlockRows(1)
-  {
-    eigen_assert(m_xpr.rows() > 0 && m_xpr.cols() > 0
-      && "Cannot comma-initialize a 0x0 matrix (operator<<)");
-    m_xpr.coeffRef(0,0) = s;
+  EIGEN_DEVICE_FUNC inline CommaInitializer(XprType& xpr, const Scalar& s)
+      : m_xpr(xpr), m_row(0), m_col(1), m_currentBlockRows(1) {
+    eigen_assert(m_xpr.rows() > 0 && m_xpr.cols() > 0 && "Cannot comma-initialize a 0x0 matrix (operator<<)");
+    m_xpr.coeffRef(0, 0) = s;
   }
 
-  template<typename OtherDerived>
-  EIGEN_DEVICE_FUNC
-  inline CommaInitializer(XprType& xpr, const DenseBase<OtherDerived>& other)
-    : m_xpr(xpr), m_row(0), m_col(other.cols()), m_currentBlockRows(other.rows())
-  {
-    eigen_assert(m_xpr.rows() >= other.rows() && m_xpr.cols() >= other.cols()
-      && "Cannot comma-initialize a 0x0 matrix (operator<<)");
-    m_xpr.template block<OtherDerived::RowsAtCompileTime, OtherDerived::ColsAtCompileTime>(0, 0, other.rows(), other.cols()) = other;
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC inline CommaInitializer(XprType& xpr, const DenseBase<OtherDerived>& other)
+      : m_xpr(xpr), m_row(0), m_col(other.cols()), m_currentBlockRows(other.rows()) {
+    eigen_assert(m_xpr.rows() >= other.rows() && m_xpr.cols() >= other.cols() &&
+                 "Cannot comma-initialize a 0x0 matrix (operator<<)");
+    m_xpr.template block<OtherDerived::RowsAtCompileTime, OtherDerived::ColsAtCompileTime>(0, 0, other.rows(),
+                                                                                           other.cols()) = other;
   }
 
-  /* Copy/Move constructor which transfers ownership. This is crucial in 
+  /* Copy/Move constructor which transfers ownership. This is crucial in
    * absence of return value optimization to avoid assertions during destruction. */
   // FIXME in C++11 mode this could be replaced by a proper RValue constructor
-  EIGEN_DEVICE_FUNC
-  inline CommaInitializer(const CommaInitializer& o)
-  : m_xpr(o.m_xpr), m_row(o.m_row), m_col(o.m_col), m_currentBlockRows(o.m_currentBlockRows) {
+  EIGEN_DEVICE_FUNC inline CommaInitializer(const CommaInitializer& o)
+      : m_xpr(o.m_xpr), m_row(o.m_row), m_col(o.m_col), m_currentBlockRows(o.m_currentBlockRows) {
     // Mark original object as finished. In absence of R-value references we need to const_cast:
     const_cast<CommaInitializer&>(o).m_row = m_xpr.rows();
     const_cast<CommaInitializer&>(o).m_col = m_xpr.cols();
@@ -64,104 +58,92 @@
   }
 
   /* inserts a scalar value in the target matrix */
-  EIGEN_DEVICE_FUNC
-  CommaInitializer& operator,(const Scalar& s)
-  {
-    if (m_col==m_xpr.cols())
-    {
-      m_row+=m_currentBlockRows;
+  EIGEN_DEVICE_FUNC CommaInitializer &operator,(const Scalar& s) {
+    if (m_col == m_xpr.cols()) {
+      m_row += m_currentBlockRows;
       m_col = 0;
       m_currentBlockRows = 1;
-      eigen_assert(m_row<m_xpr.rows()
-        && "Too many rows passed to comma initializer (operator<<)");
+      eigen_assert(m_row < m_xpr.rows() && "Too many rows passed to comma initializer (operator<<)");
     }
-    eigen_assert(m_col<m_xpr.cols()
-      && "Too many coefficients passed to comma initializer (operator<<)");
-    eigen_assert(m_currentBlockRows==1);
+    eigen_assert(m_col < m_xpr.cols() && "Too many coefficients passed to comma initializer (operator<<)");
+    eigen_assert(m_currentBlockRows == 1);
     m_xpr.coeffRef(m_row, m_col++) = s;
     return *this;
   }
 
   /* inserts a matrix expression in the target matrix */
-  template<typename OtherDerived>
-  EIGEN_DEVICE_FUNC
-  CommaInitializer& operator,(const DenseBase<OtherDerived>& other)
-  {
-    if (m_col==m_xpr.cols() && (other.cols()!=0 || other.rows()!=m_currentBlockRows))
-    {
-      m_row+=m_currentBlockRows;
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC CommaInitializer &operator,(const DenseBase<OtherDerived>& other) {
+    if (m_col == m_xpr.cols() && (other.cols() != 0 || other.rows() != m_currentBlockRows)) {
+      m_row += m_currentBlockRows;
       m_col = 0;
       m_currentBlockRows = other.rows();
-      eigen_assert(m_row+m_currentBlockRows<=m_xpr.rows()
-        && "Too many rows passed to comma initializer (operator<<)");
+      eigen_assert(m_row + m_currentBlockRows <= m_xpr.rows() &&
+                   "Too many rows passed to comma initializer (operator<<)");
     }
-    eigen_assert((m_col + other.cols() <= m_xpr.cols())
-      && "Too many coefficients passed to comma initializer (operator<<)");
-    eigen_assert(m_currentBlockRows==other.rows());
-    m_xpr.template block<OtherDerived::RowsAtCompileTime, OtherDerived::ColsAtCompileTime>
-                    (m_row, m_col, other.rows(), other.cols()) = other;
+    eigen_assert((m_col + other.cols() <= m_xpr.cols()) &&
+                 "Too many coefficients passed to comma initializer (operator<<)");
+    eigen_assert(m_currentBlockRows == other.rows());
+    m_xpr.template block<OtherDerived::RowsAtCompileTime, OtherDerived::ColsAtCompileTime>(m_row, m_col, other.rows(),
+                                                                                           other.cols()) = other;
     m_col += other.cols();
     return *this;
   }
 
-  EIGEN_DEVICE_FUNC
-  inline ~CommaInitializer()
+  EIGEN_DEVICE_FUNC inline ~CommaInitializer()
 #if defined VERIFY_RAISES_ASSERT && (!defined EIGEN_NO_ASSERTION_CHECKING) && defined EIGEN_EXCEPTIONS
-  EIGEN_EXCEPTION_SPEC(Eigen::eigen_assert_exception)
+      EIGEN_EXCEPTION_SPEC(Eigen::eigen_assert_exception)
 #endif
   {
     finished();
   }
 
   /** \returns the built matrix once all its coefficients have been set.
-    * Calling finished is 100% optional. Its purpose is to write expressions
-    * like this:
-    * \code
-    * quaternion.fromRotationMatrix((Matrix3f() << axis0, axis1, axis2).finished());
-    * \endcode
-    */
-  EIGEN_DEVICE_FUNC
-  inline XprType& finished() {
-      eigen_assert(((m_row+m_currentBlockRows) == m_xpr.rows() || m_xpr.cols() == 0)
-           && m_col == m_xpr.cols()
-           && "Too few coefficients passed to comma initializer (operator<<)");
-      return m_xpr;
+   * Calling finished is 100% optional. Its purpose is to write expressions
+   * like this:
+   * \code
+   * quaternion.fromRotationMatrix((Matrix3f() << axis0, axis1, axis2).finished());
+   * \endcode
+   */
+  EIGEN_DEVICE_FUNC inline XprType& finished() {
+    eigen_assert(((m_row + m_currentBlockRows) == m_xpr.rows() || m_xpr.cols() == 0) && m_col == m_xpr.cols() &&
+                 "Too few coefficients passed to comma initializer (operator<<)");
+    return m_xpr;
   }
 
-  XprType& m_xpr;           // target expression
-  Index m_row;              // current row id
-  Index m_col;              // current col id
-  Index m_currentBlockRows; // current block height
+  XprType& m_xpr;            // target expression
+  Index m_row;               // current row id
+  Index m_col;               // current col id
+  Index m_currentBlockRows;  // current block height
 };
 
 /** \anchor MatrixBaseCommaInitRef
-  * Convenient operator to set the coefficients of a matrix.
-  *
-  * The coefficients must be provided in a row major order and exactly match
-  * the size of the matrix. Otherwise an assertion is raised.
-  *
-  * Example: \include MatrixBase_set.cpp
-  * Output: \verbinclude MatrixBase_set.out
-  * 
-  * \note According the c++ standard, the argument expressions of this comma initializer are evaluated in arbitrary order.
-  *
-  * \sa CommaInitializer::finished(), class CommaInitializer
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC inline CommaInitializer<Derived> DenseBase<Derived>::operator<< (const Scalar& s)
-{
+ * Convenient operator to set the coefficients of a matrix.
+ *
+ * The coefficients must be provided in a row major order and exactly match
+ * the size of the matrix. Otherwise an assertion is raised.
+ *
+ * Example: \include MatrixBase_set.cpp
+ * Output: \verbinclude MatrixBase_set.out
+ *
+ * \note According the c++ standard, the argument expressions of this comma initializer are evaluated in arbitrary
+ * order.
+ *
+ * \sa CommaInitializer::finished(), class CommaInitializer
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC inline CommaInitializer<Derived> DenseBase<Derived>::operator<<(const Scalar& s) {
   return CommaInitializer<Derived>(*static_cast<Derived*>(this), s);
 }
 
 /** \sa operator<<(const Scalar&) */
-template<typename Derived>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC inline CommaInitializer<Derived>
-DenseBase<Derived>::operator<<(const DenseBase<OtherDerived>& other)
-{
-  return CommaInitializer<Derived>(*static_cast<Derived *>(this), other);
+template <typename Derived>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC inline CommaInitializer<Derived> DenseBase<Derived>::operator<<(
+    const DenseBase<OtherDerived>& other) {
+  return CommaInitializer<Derived>(*static_cast<Derived*>(this), other);
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_COMMAINITIALIZER_H
+#endif  // EIGEN_COMMAINITIALIZER_H
diff --git a/Eigen/src/Core/ConditionEstimator.h b/Eigen/src/Core/ConditionEstimator.h
index 7d77f43..dd1770b 100644
--- a/Eigen/src/Core/ConditionEstimator.h
+++ b/Eigen/src/Core/ConditionEstimator.h
@@ -22,7 +22,7 @@
   static inline Vector run(const Vector& v) {
     const RealVector v_abs = v.cwiseAbs();
     return (v_abs.array() == static_cast<typename Vector::RealScalar>(0))
-            .select(Vector::Ones(v.size()), v.cwiseQuotient(v_abs));
+        .select(Vector::Ones(v.size()), v.cwiseQuotient(v_abs));
   }
 };
 
@@ -31,33 +31,32 @@
 struct rcond_compute_sign<Vector, Vector, false> {
   static inline Vector run(const Vector& v) {
     return (v.array() < static_cast<typename Vector::RealScalar>(0))
-           .select(-Vector::Ones(v.size()), Vector::Ones(v.size()));
+        .select(-Vector::Ones(v.size()), Vector::Ones(v.size()));
   }
 };
 
 /**
-  * \returns an estimate of ||inv(matrix)||_1 given a decomposition of
-  * \a matrix that implements .solve() and .adjoint().solve() methods.
-  *
-  * This function implements Algorithms 4.1 and 5.1 from
-  *   http://www.maths.manchester.ac.uk/~higham/narep/narep135.pdf
-  * which also forms the basis for the condition number estimators in
-  * LAPACK. Since at most 10 calls to the solve method of dec are
-  * performed, the total cost is O(dims^2), as opposed to O(dims^3)
-  * needed to compute the inverse matrix explicitly.
-  *
-  * The most common usage is in estimating the condition number
-  * ||matrix||_1 * ||inv(matrix)||_1. The first term ||matrix||_1 can be
-  * computed directly in O(n^2) operations.
-  *
-  * Supports the following decompositions: FullPivLU, PartialPivLU, LDLT, and
-  * LLT.
-  *
-  * \sa FullPivLU, PartialPivLU, LDLT, LLT.
-  */
+ * \returns an estimate of ||inv(matrix)||_1 given a decomposition of
+ * \a matrix that implements .solve() and .adjoint().solve() methods.
+ *
+ * This function implements Algorithms 4.1 and 5.1 from
+ *   http://www.maths.manchester.ac.uk/~higham/narep/narep135.pdf
+ * which also forms the basis for the condition number estimators in
+ * LAPACK. Since at most 10 calls to the solve method of dec are
+ * performed, the total cost is O(dims^2), as opposed to O(dims^3)
+ * needed to compute the inverse matrix explicitly.
+ *
+ * The most common usage is in estimating the condition number
+ * ||matrix||_1 * ||inv(matrix)||_1. The first term ||matrix||_1 can be
+ * computed directly in O(n^2) operations.
+ *
+ * Supports the following decompositions: FullPivLU, PartialPivLU, LDLT, and
+ * LLT.
+ *
+ * \sa FullPivLU, PartialPivLU, LDLT, LLT.
+ */
 template <typename Decomposition>
-typename Decomposition::RealScalar rcond_invmatrix_L1_norm_estimate(const Decomposition& dec)
-{
+typename Decomposition::RealScalar rcond_invmatrix_L1_norm_estimate(const Decomposition& dec) {
   typedef typename Decomposition::MatrixType MatrixType;
   typedef typename Decomposition::Scalar Scalar;
   typedef typename Decomposition::RealScalar RealScalar;
@@ -67,17 +66,16 @@
 
   eigen_assert(dec.rows() == dec.cols());
   const Index n = dec.rows();
-  if (n == 0)
-    return 0;
+  if (n == 0) return 0;
 
-  // Disable Index to float conversion warning
+    // Disable Index to float conversion warning
 #ifdef __INTEL_COMPILER
-  #pragma warning push
-  #pragma warning ( disable : 2259 )
+#pragma warning push
+#pragma warning(disable : 2259)
 #endif
   Vector v = dec.solve(Vector::Ones(n) / Scalar(n));
 #ifdef __INTEL_COMPILER
-  #pragma warning pop
+#pragma warning pop
 #endif
 
   // lower_bound is a lower bound on
@@ -85,8 +83,7 @@
   // and is the objective maximized by the ("super-") gradient ascent
   // algorithm below.
   RealScalar lower_bound = v.template lpNorm<1>();
-  if (n == 1)
-    return lower_bound;
+  if (n == 1) return lower_bound;
 
   // Gradient ascent algorithm follows: We know that the optimum is achieved at
   // one of the simplices v = e_i, so in each iteration we follow a
@@ -96,8 +93,7 @@
   Vector old_sign_vector;
   Index v_max_abs_index = -1;
   Index old_v_max_abs_index = v_max_abs_index;
-  for (int k = 0; k < 4; ++k)
-  {
+  for (int k = 0; k < 4; ++k) {
     sign_vector = internal::rcond_compute_sign<Vector, RealVector, is_complex>::run(v);
     if (k > 0 && !is_complex && sign_vector == old_sign_vector) {
       // Break if the solution stagnated.
@@ -145,27 +141,26 @@
 }
 
 /** \brief Reciprocal condition number estimator.
-  *
-  * Computing a decomposition of a dense matrix takes O(n^3) operations, while
-  * this method estimates the condition number quickly and reliably in O(n^2)
-  * operations.
-  *
-  * \returns an estimate of the reciprocal condition number
-  * (1 / (||matrix||_1 * ||inv(matrix)||_1)) of matrix, given ||matrix||_1 and
-  * its decomposition. Supports the following decompositions: FullPivLU,
-  * PartialPivLU, LDLT, and LLT.
-  *
-  * \sa FullPivLU, PartialPivLU, LDLT, LLT.
-  */
+ *
+ * Computing a decomposition of a dense matrix takes O(n^3) operations, while
+ * this method estimates the condition number quickly and reliably in O(n^2)
+ * operations.
+ *
+ * \returns an estimate of the reciprocal condition number
+ * (1 / (||matrix||_1 * ||inv(matrix)||_1)) of matrix, given ||matrix||_1 and
+ * its decomposition. Supports the following decompositions: FullPivLU,
+ * PartialPivLU, LDLT, and LLT.
+ *
+ * \sa FullPivLU, PartialPivLU, LDLT, LLT.
+ */
 template <typename Decomposition>
-typename Decomposition::RealScalar
-rcond_estimate_helper(typename Decomposition::RealScalar matrix_norm, const Decomposition& dec)
-{
+typename Decomposition::RealScalar rcond_estimate_helper(typename Decomposition::RealScalar matrix_norm,
+                                                         const Decomposition& dec) {
   typedef typename Decomposition::RealScalar RealScalar;
   eigen_assert(dec.rows() == dec.cols());
-  if (dec.rows() == 0)                        return NumTraits<RealScalar>::infinity();
+  if (dec.rows() == 0) return NumTraits<RealScalar>::infinity();
   if (numext::is_exactly_zero(matrix_norm)) return RealScalar(0);
-  if (dec.rows() == 1)                        return RealScalar(1);
+  if (dec.rows() == 1) return RealScalar(1);
   const RealScalar inverse_matrix_norm = rcond_invmatrix_L1_norm_estimate(dec);
   return (numext::is_exactly_zero(inverse_matrix_norm) ? RealScalar(0)
                                                        : (RealScalar(1) / inverse_matrix_norm) / matrix_norm);
diff --git a/Eigen/src/Core/CoreEvaluators.h b/Eigen/src/Core/CoreEvaluators.h
index 7249f7e..c620600 100644
--- a/Eigen/src/Core/CoreEvaluators.h
+++ b/Eigen/src/Core/CoreEvaluators.h
@@ -9,7 +9,6 @@
 // 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_COREEVALUATORS_H
 #define EIGEN_COREEVALUATORS_H
 
@@ -22,19 +21,32 @@
 
 // This class returns the evaluator kind from the expression storage kind.
 // Default assumes index based accessors
-template<typename StorageKind>
+template <typename StorageKind>
 struct storage_kind_to_evaluator_kind {
   typedef IndexBased Kind;
 };
 
 // This class returns the evaluator shape from the expression storage kind.
 // It can be Dense, Sparse, Triangular, Diagonal, SelfAdjoint, Band, etc.
-template<typename StorageKind> struct storage_kind_to_shape;
+template <typename StorageKind>
+struct storage_kind_to_shape;
 
-template<> struct storage_kind_to_shape<Dense>                  { typedef DenseShape Shape;           };
-template<> struct storage_kind_to_shape<SolverStorage>          { typedef SolverShape Shape;           };
-template<> struct storage_kind_to_shape<PermutationStorage>     { typedef PermutationShape Shape;     };
-template<> struct storage_kind_to_shape<TranspositionsStorage>  { typedef TranspositionsShape Shape;  };
+template <>
+struct storage_kind_to_shape<Dense> {
+  typedef DenseShape Shape;
+};
+template <>
+struct storage_kind_to_shape<SolverStorage> {
+  typedef SolverShape Shape;
+};
+template <>
+struct storage_kind_to_shape<PermutationStorage> {
+  typedef PermutationShape Shape;
+};
+template <>
+struct storage_kind_to_shape<TranspositionsStorage> {
+  typedef TranspositionsShape Shape;
+};
 
 // Evaluators have to be specialized with respect to various criteria such as:
 //  - storage/structure/shape
@@ -42,88 +54,80 @@
 //  - etc.
 // Therefore, we need specialization of evaluator providing additional template arguments for each kind of evaluators.
 // We currently distinguish the following kind of evaluators:
-// - unary_evaluator    for expressions taking only one arguments (CwiseUnaryOp, CwiseUnaryView, Transpose, MatrixWrapper, ArrayWrapper, Reverse, Replicate)
+// - unary_evaluator    for expressions taking only one arguments (CwiseUnaryOp, CwiseUnaryView, Transpose,
+// MatrixWrapper, ArrayWrapper, Reverse, Replicate)
 // - binary_evaluator   for expression taking two arguments (CwiseBinaryOp)
 // - ternary_evaluator   for expression taking three arguments (CwiseTernaryOp)
-// - product_evaluator  for linear algebra products (Product); special case of binary_evaluator because it requires additional tags for dispatching.
+// - product_evaluator  for linear algebra products (Product); special case of binary_evaluator because it requires
+// additional tags for dispatching.
 // - mapbase_evaluator  for Map, Block, Ref
 // - block_evaluator    for Block (special dispatching to a mapbase_evaluator or unary_evaluator)
 
-template< typename T,
-          typename Arg1Kind   = typename evaluator_traits<typename T::Arg1>::Kind,
-          typename Arg2Kind   = typename evaluator_traits<typename T::Arg2>::Kind,
-          typename Arg3Kind   = typename evaluator_traits<typename T::Arg3>::Kind,
+template <typename T, typename Arg1Kind = typename evaluator_traits<typename T::Arg1>::Kind,
+          typename Arg2Kind = typename evaluator_traits<typename T::Arg2>::Kind,
+          typename Arg3Kind = typename evaluator_traits<typename T::Arg3>::Kind,
           typename Arg1Scalar = typename traits<typename T::Arg1>::Scalar,
           typename Arg2Scalar = typename traits<typename T::Arg2>::Scalar,
-          typename Arg3Scalar = typename traits<typename T::Arg3>::Scalar> struct ternary_evaluator;
+          typename Arg3Scalar = typename traits<typename T::Arg3>::Scalar>
+struct ternary_evaluator;
 
-template< typename T,
-          typename LhsKind   = typename evaluator_traits<typename T::Lhs>::Kind,
-          typename RhsKind   = typename evaluator_traits<typename T::Rhs>::Kind,
+template <typename T, typename LhsKind = typename evaluator_traits<typename T::Lhs>::Kind,
+          typename RhsKind = typename evaluator_traits<typename T::Rhs>::Kind,
           typename LhsScalar = typename traits<typename T::Lhs>::Scalar,
-          typename RhsScalar = typename traits<typename T::Rhs>::Scalar> struct binary_evaluator;
+          typename RhsScalar = typename traits<typename T::Rhs>::Scalar>
+struct binary_evaluator;
 
-template< typename T,
-          typename Kind   = typename evaluator_traits<typename T::NestedExpression>::Kind,
-          typename Scalar = typename T::Scalar> struct unary_evaluator;
+template <typename T, typename Kind = typename evaluator_traits<typename T::NestedExpression>::Kind,
+          typename Scalar = typename T::Scalar>
+struct unary_evaluator;
 
 // evaluator_traits<T> contains traits for evaluator<T>
 
-template<typename T>
-struct evaluator_traits_base
-{
+template <typename T>
+struct evaluator_traits_base {
   // by default, get evaluator kind and shape from storage
   typedef typename storage_kind_to_evaluator_kind<typename traits<T>::StorageKind>::Kind Kind;
   typedef typename storage_kind_to_shape<typename traits<T>::StorageKind>::Shape Shape;
 };
 
 // Default evaluator traits
-template<typename T>
-struct evaluator_traits : public evaluator_traits_base<T>
-{
-};
+template <typename T>
+struct evaluator_traits : public evaluator_traits_base<T> {};
 
-template<typename T, typename Shape = typename evaluator_traits<T>::Shape >
+template <typename T, typename Shape = typename evaluator_traits<T>::Shape>
 struct evaluator_assume_aliasing {
   static const bool value = false;
 };
 
 // By default, we assume a unary expression:
-template<typename T>
-struct evaluator : public unary_evaluator<T>
-{
+template <typename T>
+struct evaluator : public unary_evaluator<T> {
   typedef unary_evaluator<T> Base;
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  explicit evaluator(const T& xpr) : Base(xpr) {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit evaluator(const T& xpr) : Base(xpr) {}
 };
 
-
 // TODO: Think about const-correctness
-template<typename T>
-struct evaluator<const T>
-  : evaluator<T>
-{
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  explicit evaluator(const T& xpr) : evaluator<T>(xpr) {}
+template <typename T>
+struct evaluator<const T> : evaluator<T> {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit evaluator(const T& xpr) : evaluator<T>(xpr) {}
 };
 
 // ---------- base class for all evaluators ----------
 
-template<typename ExpressionType>
-struct evaluator_base
-{
-  // TODO that's not very nice to have to propagate all these traits. They are currently only needed to handle outer,inner indices.
+template <typename ExpressionType>
+struct evaluator_base {
+  // TODO that's not very nice to have to propagate all these traits. They are currently only needed to handle
+  // outer,inner indices.
   typedef traits<ExpressionType> ExpressionTraits;
 
-  enum {
-    Alignment = 0
-  };
+  enum { Alignment = 0 };
   // noncopyable:
   // Don't make this class inherit noncopyable as this kills EBO (Empty Base Optimization)
   // and make complex evaluator much larger than then should do.
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE evaluator_base() {}
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ~evaluator_base() {}
-private:
+
+ private:
   EIGEN_DEVICE_FUNC evaluator_base(const evaluator_base&);
   EIGEN_DEVICE_FUNC const evaluator_base& operator=(const evaluator_base&);
 };
@@ -136,36 +140,34 @@
 // so no need for more sophisticated dispatching.
 
 // this helper permits to completely eliminate m_outerStride if it is known at compiletime.
-template<typename Scalar,int OuterStride> class plainobjectbase_evaluator_data {
-public:
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  plainobjectbase_evaluator_data(const Scalar* ptr, Index outerStride) : data(ptr)
-  {
+template <typename Scalar, int OuterStride>
+class plainobjectbase_evaluator_data {
+ public:
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE plainobjectbase_evaluator_data(const Scalar* ptr, Index outerStride)
+      : data(ptr) {
 #ifndef EIGEN_INTERNAL_DEBUGGING
     EIGEN_UNUSED_VARIABLE(outerStride);
 #endif
-    eigen_internal_assert(outerStride==OuterStride);
+    eigen_internal_assert(outerStride == OuterStride);
   }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-  Index outerStride() const EIGEN_NOEXCEPT { return OuterStride; }
-  const Scalar *data;
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index outerStride() const EIGEN_NOEXCEPT { return OuterStride; }
+  const Scalar* data;
 };
 
-template<typename Scalar> class plainobjectbase_evaluator_data<Scalar,Dynamic> {
-public:
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  plainobjectbase_evaluator_data(const Scalar* ptr, Index outerStride) : data(ptr), m_outerStride(outerStride) {}
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Index outerStride() const { return m_outerStride; }
-  const Scalar *data;
-protected:
+template <typename Scalar>
+class plainobjectbase_evaluator_data<Scalar, Dynamic> {
+ public:
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE plainobjectbase_evaluator_data(const Scalar* ptr, Index outerStride)
+      : data(ptr), m_outerStride(outerStride) {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index outerStride() const { return m_outerStride; }
+  const Scalar* data;
+
+ protected:
   Index m_outerStride;
 };
 
-template<typename Derived>
-struct evaluator<PlainObjectBase<Derived> >
-  : evaluator_base<Derived>
-{
+template <typename Derived>
+struct evaluator<PlainObjectBase<Derived> > : evaluator_base<Derived> {
   typedef PlainObjectBase<Derived> PlainObjectType;
   typedef typename PlainObjectType::Scalar Scalar;
   typedef typename PlainObjectType::CoeffReturnType CoeffReturnType;
@@ -182,132 +184,94 @@
   };
   enum {
     // We do not need to know the outer stride for vectors
-    OuterStrideAtCompileTime = IsVectorAtCompileTime  ? 0
-                                                      : int(IsRowMajor) ? ColsAtCompileTime
-                                                                        : RowsAtCompileTime
+    OuterStrideAtCompileTime = IsVectorAtCompileTime ? 0
+                               : int(IsRowMajor)     ? ColsAtCompileTime
+                                                     : RowsAtCompileTime
   };
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  evaluator()
-    : m_d(0,OuterStrideAtCompileTime)
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE evaluator() : m_d(0, OuterStrideAtCompileTime) {
     EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  explicit evaluator(const PlainObjectType& m)
-    : m_d(m.data(),IsVectorAtCompileTime ? 0 : m.outerStride())
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit evaluator(const PlainObjectType& m)
+      : m_d(m.data(), IsVectorAtCompileTime ? 0 : m.outerStride()) {
     EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeff(Index row, Index col) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const {
     if (IsRowMajor)
       return m_d.data[row * m_d.outerStride() + col];
     else
       return m_d.data[row + col * m_d.outerStride()];
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeff(Index index) const
-  {
-    return m_d.data[index];
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const { return m_d.data[index]; }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Scalar& coeffRef(Index row, Index col)
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index row, Index col) {
     if (IsRowMajor)
       return const_cast<Scalar*>(m_d.data)[row * m_d.outerStride() + col];
     else
       return const_cast<Scalar*>(m_d.data)[row + col * m_d.outerStride()];
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Scalar& coeffRef(Index index)
-  {
-    return const_cast<Scalar*>(m_d.data)[index];
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index index) { return const_cast<Scalar*>(m_d.data)[index]; }
 
-  template<int LoadMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  PacketType packet(Index row, Index col) const
-  {
+  template <int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE PacketType packet(Index row, Index col) const {
     if (IsRowMajor)
       return ploadt<PacketType, LoadMode>(m_d.data + row * m_d.outerStride() + col);
     else
       return ploadt<PacketType, LoadMode>(m_d.data + row + col * m_d.outerStride());
   }
 
-  template<int LoadMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  PacketType packet(Index index) const
-  {
+  template <int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE PacketType packet(Index index) const {
     return ploadt<PacketType, LoadMode>(m_d.data + index);
   }
 
-  template<int StoreMode,typename PacketType>
-  EIGEN_STRONG_INLINE
-  void writePacket(Index row, Index col, const PacketType& x)
-  {
+  template <int StoreMode, typename PacketType>
+  EIGEN_STRONG_INLINE void writePacket(Index row, Index col, const PacketType& x) {
     if (IsRowMajor)
-      return pstoret<Scalar, PacketType, StoreMode>
-	            (const_cast<Scalar*>(m_d.data) + row * m_d.outerStride() + col, x);
+      return pstoret<Scalar, PacketType, StoreMode>(const_cast<Scalar*>(m_d.data) + row * m_d.outerStride() + col, x);
     else
-      return pstoret<Scalar, PacketType, StoreMode>
-                    (const_cast<Scalar*>(m_d.data) + row + col * m_d.outerStride(), x);
+      return pstoret<Scalar, PacketType, StoreMode>(const_cast<Scalar*>(m_d.data) + row + col * m_d.outerStride(), x);
   }
 
-  template<int StoreMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  void writePacket(Index index, const PacketType& x)
-  {
+  template <int StoreMode, typename PacketType>
+  EIGEN_STRONG_INLINE void writePacket(Index index, const PacketType& x) {
     return pstoret<Scalar, PacketType, StoreMode>(const_cast<Scalar*>(m_d.data) + index, x);
   }
 
-protected:
-
-  plainobjectbase_evaluator_data<Scalar,OuterStrideAtCompileTime> m_d;
+ protected:
+  plainobjectbase_evaluator_data<Scalar, OuterStrideAtCompileTime> m_d;
 };
 
-template<typename Scalar, int Rows, int Cols, int Options, int MaxRows, int MaxCols>
+template <typename Scalar, int Rows, int Cols, int Options, int MaxRows, int MaxCols>
 struct evaluator<Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> >
-  : evaluator<PlainObjectBase<Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> > >
-{
+    : evaluator<PlainObjectBase<Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> > > {
   typedef Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> XprType;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  evaluator() {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE evaluator() {}
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  explicit evaluator(const XprType& m)
-    : evaluator<PlainObjectBase<XprType> >(m)
-  { }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit evaluator(const XprType& m)
+      : evaluator<PlainObjectBase<XprType> >(m) {}
 };
 
-template<typename Scalar, int Rows, int Cols, int Options, int MaxRows, int MaxCols>
+template <typename Scalar, int Rows, int Cols, int Options, int MaxRows, int MaxCols>
 struct evaluator<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols> >
-  : evaluator<PlainObjectBase<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols> > >
-{
+    : evaluator<PlainObjectBase<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols> > > {
   typedef Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols> XprType;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  evaluator() {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE evaluator() {}
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  explicit evaluator(const XprType& m)
-    : evaluator<PlainObjectBase<XprType> >(m)
-  { }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit evaluator(const XprType& m)
+      : evaluator<PlainObjectBase<XprType> >(m) {}
 };
 
 // -------------------- Transpose --------------------
 
-template<typename ArgType>
-struct unary_evaluator<Transpose<ArgType>, IndexBased>
-  : evaluator_base<Transpose<ArgType> >
-{
+template <typename ArgType>
+struct unary_evaluator<Transpose<ArgType>, IndexBased> : evaluator_base<Transpose<ArgType> > {
   typedef Transpose<ArgType> XprType;
 
   enum {
@@ -316,65 +280,44 @@
     Alignment = evaluator<ArgType>::Alignment
   };
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  explicit unary_evaluator(const XprType& t) : m_argImpl(t.nestedExpression()) {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit unary_evaluator(const XprType& t) : m_argImpl(t.nestedExpression()) {}
 
   typedef typename XprType::Scalar Scalar;
   typedef typename XprType::CoeffReturnType CoeffReturnType;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeff(Index row, Index col) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const {
     return m_argImpl.coeff(col, row);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeff(Index index) const
-  {
-    return m_argImpl.coeff(index);
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const { return m_argImpl.coeff(index); }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Scalar& coeffRef(Index row, Index col)
-  {
-    return m_argImpl.coeffRef(col, row);
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index row, Index col) { return m_argImpl.coeffRef(col, row); }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  typename XprType::Scalar& coeffRef(Index index)
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename XprType::Scalar& coeffRef(Index index) {
     return m_argImpl.coeffRef(index);
   }
 
-  template<int LoadMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  PacketType packet(Index row, Index col) const
-  {
-    return m_argImpl.template packet<LoadMode,PacketType>(col, row);
+  template <int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE PacketType packet(Index row, Index col) const {
+    return m_argImpl.template packet<LoadMode, PacketType>(col, row);
   }
 
-  template<int LoadMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  PacketType packet(Index index) const
-  {
-    return m_argImpl.template packet<LoadMode,PacketType>(index);
+  template <int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE PacketType packet(Index index) const {
+    return m_argImpl.template packet<LoadMode, PacketType>(index);
   }
 
-  template<int StoreMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  void writePacket(Index row, Index col, const PacketType& x)
-  {
-    m_argImpl.template writePacket<StoreMode,PacketType>(col, row, x);
+  template <int StoreMode, typename PacketType>
+  EIGEN_STRONG_INLINE void writePacket(Index row, Index col, const PacketType& x) {
+    m_argImpl.template writePacket<StoreMode, PacketType>(col, row, x);
   }
 
-  template<int StoreMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  void writePacket(Index index, const PacketType& x)
-  {
-    m_argImpl.template writePacket<StoreMode,PacketType>(index, x);
+  template <int StoreMode, typename PacketType>
+  EIGEN_STRONG_INLINE void writePacket(Index index, const PacketType& x) {
+    m_argImpl.template writePacket<StoreMode, PacketType>(index, x);
   }
 
-protected:
+ protected:
   evaluator<ArgType> m_argImpl;
 };
 
@@ -382,63 +325,83 @@
 // Like Matrix and Array, this is not really a unary expression, so we directly specialize evaluator.
 // Likewise, there is not need to more sophisticated dispatching here.
 
-template<typename Scalar,typename NullaryOp,
-         bool has_nullary = has_nullary_operator<NullaryOp>::value,
-         bool has_unary   = has_unary_operator<NullaryOp>::value,
-         bool has_binary  = has_binary_operator<NullaryOp>::value>
-struct nullary_wrapper
-{
+template <typename Scalar, typename NullaryOp, bool has_nullary = has_nullary_operator<NullaryOp>::value,
+          bool has_unary = has_unary_operator<NullaryOp>::value,
+          bool has_binary = has_binary_operator<NullaryOp>::value>
+struct nullary_wrapper {
   template <typename IndexType>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i, IndexType j) const { return op(i,j); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i, IndexType j) const {
+    return op(i, j);
+  }
   template <typename IndexType>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i) const { return op(i); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i) const {
+    return op(i);
+  }
 
-  template <typename T, typename IndexType> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i, IndexType j) const { return op.template packetOp<T>(i,j); }
-  template <typename T, typename IndexType> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i) const { return op.template packetOp<T>(i); }
+  template <typename T, typename IndexType>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i, IndexType j) const {
+    return op.template packetOp<T>(i, j);
+  }
+  template <typename T, typename IndexType>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i) const {
+    return op.template packetOp<T>(i);
+  }
 };
 
-template<typename Scalar,typename NullaryOp>
-struct nullary_wrapper<Scalar,NullaryOp,true,false,false>
-{
+template <typename Scalar, typename NullaryOp>
+struct nullary_wrapper<Scalar, NullaryOp, true, false, false> {
   template <typename IndexType>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType=0, IndexType=0) const { return op(); }
-  template <typename T, typename IndexType> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType=0, IndexType=0) const { return op.template packetOp<T>(); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType = 0, IndexType = 0) const {
+    return op();
+  }
+  template <typename T, typename IndexType>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType = 0, IndexType = 0) const {
+    return op.template packetOp<T>();
+  }
 };
 
-template<typename Scalar,typename NullaryOp>
-struct nullary_wrapper<Scalar,NullaryOp,false,false,true>
-{
+template <typename Scalar, typename NullaryOp>
+struct nullary_wrapper<Scalar, NullaryOp, false, false, true> {
   template <typename IndexType>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i, IndexType j=0) const { return op(i,j); }
-  template <typename T, typename IndexType> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i, IndexType j=0) const { return op.template packetOp<T>(i,j); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i, IndexType j = 0) const {
+    return op(i, j);
+  }
+  template <typename T, typename IndexType>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i, IndexType j = 0) const {
+    return op.template packetOp<T>(i, j);
+  }
 };
 
 // We need the following specialization for vector-only functors assigned to a runtime vector,
 // for instance, using linspace and assigning a RowVectorXd to a MatrixXd or even a row of a MatrixXd.
 // In this case, i==0 and j is used for the actual iteration.
-template<typename Scalar,typename NullaryOp>
-struct nullary_wrapper<Scalar,NullaryOp,false,true,false>
-{
+template <typename Scalar, typename NullaryOp>
+struct nullary_wrapper<Scalar, NullaryOp, false, true, false> {
   template <typename IndexType>
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i, IndexType j) const {
-    eigen_assert(i==0 || j==0);
-    return op(i+j);
+    eigen_assert(i == 0 || j == 0);
+    return op(i + j);
   }
-  template <typename T, typename IndexType> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i, IndexType j) const {
-    eigen_assert(i==0 || j==0);
-    return op.template packetOp<T>(i+j);
+  template <typename T, typename IndexType>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i, IndexType j) const {
+    eigen_assert(i == 0 || j == 0);
+    return op.template packetOp<T>(i + j);
   }
 
   template <typename IndexType>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i) const { return op(i); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i) const {
+    return op(i);
+  }
   template <typename T, typename IndexType>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i) const { return op.template packetOp<T>(i); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i) const {
+    return op.template packetOp<T>(i);
+  }
 };
 
-template<typename Scalar,typename NullaryOp>
-struct nullary_wrapper<Scalar,NullaryOp,false,false,false> {};
+template <typename Scalar, typename NullaryOp>
+struct nullary_wrapper<Scalar, NullaryOp, false, false, false> {};
 
-#if 0 && EIGEN_COMP_MSVC>0
+#if 0 && EIGEN_COMP_MSVC > 0
 // Disable this ugly workaround. This is now handled in traits<Ref>::match,
 // but this piece of code might still become handly if some other weird compilation
 // erros pop up again.
@@ -494,127 +457,100 @@
     has_binary_operator<NullaryOp,nullary_wrapper_workaround_msvc<IndexType> >::value>().template packetOp<T>(op,i);
   }
 };
-#endif // MSVC workaround
+#endif  // MSVC workaround
 
-template<typename NullaryOp, typename PlainObjectType>
-struct evaluator<CwiseNullaryOp<NullaryOp,PlainObjectType> >
-  : evaluator_base<CwiseNullaryOp<NullaryOp,PlainObjectType> >
-{
-  typedef CwiseNullaryOp<NullaryOp,PlainObjectType> XprType;
+template <typename NullaryOp, typename PlainObjectType>
+struct evaluator<CwiseNullaryOp<NullaryOp, PlainObjectType> >
+    : evaluator_base<CwiseNullaryOp<NullaryOp, PlainObjectType> > {
+  typedef CwiseNullaryOp<NullaryOp, PlainObjectType> XprType;
   typedef internal::remove_all_t<PlainObjectType> PlainObjectTypeCleaned;
 
   enum {
     CoeffReadCost = internal::functor_traits<NullaryOp>::Cost,
 
-    Flags = (evaluator<PlainObjectTypeCleaned>::Flags
-          &  (  HereditaryBits
-              | (functor_has_linear_access<NullaryOp>::ret  ? LinearAccessBit : 0)
-              | (functor_traits<NullaryOp>::PacketAccess    ? PacketAccessBit : 0)))
-          | (functor_traits<NullaryOp>::IsRepeatable ? 0 : EvalBeforeNestingBit),
+    Flags = (evaluator<PlainObjectTypeCleaned>::Flags &
+             (HereditaryBits | (functor_has_linear_access<NullaryOp>::ret ? LinearAccessBit : 0) |
+              (functor_traits<NullaryOp>::PacketAccess ? PacketAccessBit : 0))) |
+            (functor_traits<NullaryOp>::IsRepeatable ? 0 : EvalBeforeNestingBit),
     Alignment = AlignedMax
   };
 
-  EIGEN_DEVICE_FUNC explicit evaluator(const XprType& n)
-    : m_functor(n.functor()), m_wrapper()
-  {
+  EIGEN_DEVICE_FUNC explicit evaluator(const XprType& n) : m_functor(n.functor()), m_wrapper() {
     EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
   }
 
   typedef typename XprType::CoeffReturnType CoeffReturnType;
 
   template <typename IndexType>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeff(IndexType row, IndexType col) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(IndexType row, IndexType col) const {
     return m_wrapper(m_functor, row, col);
   }
 
   template <typename IndexType>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeff(IndexType index) const
-  {
-    return m_wrapper(m_functor,index);
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(IndexType index) const {
+    return m_wrapper(m_functor, index);
   }
 
-  template<int LoadMode, typename PacketType, typename IndexType>
-  EIGEN_STRONG_INLINE
-  PacketType packet(IndexType row, IndexType col) const
-  {
+  template <int LoadMode, typename PacketType, typename IndexType>
+  EIGEN_STRONG_INLINE PacketType packet(IndexType row, IndexType col) const {
     return m_wrapper.template packetOp<PacketType>(m_functor, row, col);
   }
 
-  template<int LoadMode, typename PacketType, typename IndexType>
-  EIGEN_STRONG_INLINE
-  PacketType packet(IndexType index) const
-  {
+  template <int LoadMode, typename PacketType, typename IndexType>
+  EIGEN_STRONG_INLINE PacketType packet(IndexType index) const {
     return m_wrapper.template packetOp<PacketType>(m_functor, index);
   }
 
-protected:
+ protected:
   const NullaryOp m_functor;
-  const internal::nullary_wrapper<CoeffReturnType,NullaryOp> m_wrapper;
+  const internal::nullary_wrapper<CoeffReturnType, NullaryOp> m_wrapper;
 };
 
 // -------------------- CwiseUnaryOp --------------------
 
-template<typename UnaryOp, typename ArgType>
-struct unary_evaluator<CwiseUnaryOp<UnaryOp, ArgType>, IndexBased >
-  : evaluator_base<CwiseUnaryOp<UnaryOp, ArgType> >
-{
+template <typename UnaryOp, typename ArgType>
+struct unary_evaluator<CwiseUnaryOp<UnaryOp, ArgType>, IndexBased> : evaluator_base<CwiseUnaryOp<UnaryOp, ArgType> > {
   typedef CwiseUnaryOp<UnaryOp, ArgType> XprType;
 
   enum {
     CoeffReadCost = int(evaluator<ArgType>::CoeffReadCost) + int(functor_traits<UnaryOp>::Cost),
 
-    Flags = evaluator<ArgType>::Flags
-          & (HereditaryBits | LinearAccessBit | (functor_traits<UnaryOp>::PacketAccess ? PacketAccessBit : 0)),
+    Flags = evaluator<ArgType>::Flags &
+            (HereditaryBits | LinearAccessBit | (functor_traits<UnaryOp>::PacketAccess ? PacketAccessBit : 0)),
     Alignment = evaluator<ArgType>::Alignment
   };
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  explicit unary_evaluator(const XprType& op) : m_d(op)
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit unary_evaluator(const XprType& op) : m_d(op) {
     EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits<UnaryOp>::Cost);
     EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
   }
 
   typedef typename XprType::CoeffReturnType CoeffReturnType;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeff(Index row, Index col) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const {
     return m_d.func()(m_d.argImpl.coeff(row, col));
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
     return m_d.func()(m_d.argImpl.coeff(index));
   }
 
-  template<int LoadMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  PacketType packet(Index row, Index col) const
-  {
+  template <int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE PacketType packet(Index row, Index col) const {
     return m_d.func().packetOp(m_d.argImpl.template packet<LoadMode, PacketType>(row, col));
   }
 
-  template<int LoadMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  PacketType packet(Index index) const
-  {
+  template <int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE PacketType packet(Index index) const {
     return m_d.func().packetOp(m_d.argImpl.template packet<LoadMode, PacketType>(index));
   }
 
-protected:
-
+ protected:
   // this helper permits to completely eliminate the functor if it is empty
-  struct Data
-  {
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Data(const XprType& xpr) : op(xpr.functor()), argImpl(xpr.nestedExpression()) {}
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    const UnaryOp& func() const { return op; }
+  struct Data {
+    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Data(const XprType& xpr)
+        : op(xpr.functor()), argImpl(xpr.nestedExpression()) {}
+    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const UnaryOp& func() const { return op; }
     UnaryOp op;
     evaluator<ArgType> argImpl;
   };
@@ -650,9 +586,12 @@
   }
 
   template <typename DstPacketType>
-  using AltSrcScalarOp = std::enable_if_t<(unpacket_traits<DstPacketType>::size < SrcPacketSize && !find_packet_by_size<SrcType, unpacket_traits<DstPacketType>::size>::value), bool>;
+  using AltSrcScalarOp = std::enable_if_t<(unpacket_traits<DstPacketType>::size < SrcPacketSize &&
+                                           !find_packet_by_size<SrcType, unpacket_traits<DstPacketType>::size>::value),
+                                          bool>;
   template <typename DstPacketType>
-  using SrcPacketArgs1 = std::enable_if_t<(find_packet_by_size<SrcType, unpacket_traits<DstPacketType>::size>::value), bool>;
+  using SrcPacketArgs1 =
+      std::enable_if_t<(find_packet_by_size<SrcType, unpacket_traits<DstPacketType>::size>::value), bool>;
   template <typename DstPacketType>
   using SrcPacketArgs2 = std::enable_if_t<(unpacket_traits<DstPacketType>::size) == (2 * SrcPacketSize), bool>;
   template <typename DstPacketType>
@@ -685,7 +624,9 @@
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DstType coeff(Index row, Index col) const {
     return cast<SrcType, DstType>(srcCoeff(row, col, 0));
   }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DstType coeff(Index index) const { return cast<SrcType, DstType>(srcCoeff(index, 0)); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DstType coeff(Index index) const {
+    return cast<SrcType, DstType>(srcCoeff(index, 0));
+  }
 
   template <int LoadMode, typename PacketType = SrcPacketType>
   EIGEN_STRONG_INLINE PacketType srcPacket(Index row, Index col, Index offset) const {
@@ -705,9 +646,9 @@
 
   // There is no source packet type with equal or fewer elements than DstPacketType.
   // This is problematic as the evaluation loop may attempt to access data outside the bounds of the array.
-  // For example, consider the cast utilizing pcast<Packet4f,Packet2d> with an array of size 4: {0.0f,1.0f,2.0f,3.0f}. 
-  // The first iteration of the evaulation loop will load 16 bytes: {0.0f,1.0f,2.0f,3.0f} and cast to {0.0,1.0}, which is acceptable.
-  // The second iteration will load 16 bytes: {2.0f,3.0f,?,?}, which is outside the bounds of the array.
+  // For example, consider the cast utilizing pcast<Packet4f,Packet2d> with an array of size 4: {0.0f,1.0f,2.0f,3.0f}.
+  // The first iteration of the evaulation loop will load 16 bytes: {0.0f,1.0f,2.0f,3.0f} and cast to {0.0,1.0}, which
+  // is acceptable. The second iteration will load 16 bytes: {2.0f,3.0f,?,?}, which is outside the bounds of the array.
 
   // Instead, perform runtime check to determine if the load would access data outside the bounds of the array.
   // If not, perform full load. Otherwise, revert to a scalar loop to perform a partial load.
@@ -735,32 +676,30 @@
     using SizedSrcPacketType = typename find_packet_by_size<SrcType, DstPacketSize>::type;
     constexpr int SrcBytesIncrement = DstPacketSize * sizeof(SrcType);
     constexpr int SrcLoadMode = plain_enum_min(SrcBytesIncrement, LoadMode);
-    return pcast<SizedSrcPacketType, DstPacketType>(
-        srcPacket<SrcLoadMode, SizedSrcPacketType>(row, col, 0));
+    return pcast<SizedSrcPacketType, DstPacketType>(srcPacket<SrcLoadMode, SizedSrcPacketType>(row, col, 0));
   }
   // unpacket_traits<DstPacketType>::size == 2 * SrcPacketSize
   template <int LoadMode, typename DstPacketType, SrcPacketArgs2<DstPacketType> = true>
   EIGEN_STRONG_INLINE DstPacketType packet(Index row, Index col) const {
     constexpr int SrcLoadMode = plain_enum_min(SrcPacketBytes, LoadMode);
-    return pcast<SrcPacketType, DstPacketType>(
-        srcPacket<SrcLoadMode>(row, col, 0), srcPacket<SrcLoadMode>(row, col, 1));
+    return pcast<SrcPacketType, DstPacketType>(srcPacket<SrcLoadMode>(row, col, 0),
+                                               srcPacket<SrcLoadMode>(row, col, 1));
   }
   // unpacket_traits<DstPacketType>::size == 4 * SrcPacketSize
   template <int LoadMode, typename DstPacketType, SrcPacketArgs4<DstPacketType> = true>
   EIGEN_STRONG_INLINE DstPacketType packet(Index row, Index col) const {
     constexpr int SrcLoadMode = plain_enum_min(SrcPacketBytes, LoadMode);
-    return pcast<SrcPacketType, DstPacketType>(
-        srcPacket<SrcLoadMode>(row, col, 0), srcPacket<SrcLoadMode>(row, col, 1),
-        srcPacket<SrcLoadMode>(row, col, 2), srcPacket<SrcLoadMode>(row, col, 3));
+    return pcast<SrcPacketType, DstPacketType>(srcPacket<SrcLoadMode>(row, col, 0), srcPacket<SrcLoadMode>(row, col, 1),
+                                               srcPacket<SrcLoadMode>(row, col, 2),
+                                               srcPacket<SrcLoadMode>(row, col, 3));
   }
   // unpacket_traits<DstPacketType>::size == 8 * SrcPacketSize
   template <int LoadMode, typename DstPacketType, SrcPacketArgs8<DstPacketType> = true>
   EIGEN_STRONG_INLINE DstPacketType packet(Index row, Index col) const {
     constexpr int SrcLoadMode = plain_enum_min(SrcPacketBytes, LoadMode);
     return pcast<SrcPacketType, DstPacketType>(
-        srcPacket<SrcLoadMode>(row, col, 0), srcPacket<SrcLoadMode>(row, col, 1), 
-        srcPacket<SrcLoadMode>(row, col, 2), srcPacket<SrcLoadMode>(row, col, 3), 
-        srcPacket<SrcLoadMode>(row, col, 4), srcPacket<SrcLoadMode>(row, col, 5),
+        srcPacket<SrcLoadMode>(row, col, 0), srcPacket<SrcLoadMode>(row, col, 1), srcPacket<SrcLoadMode>(row, col, 2),
+        srcPacket<SrcLoadMode>(row, col, 3), srcPacket<SrcLoadMode>(row, col, 4), srcPacket<SrcLoadMode>(row, col, 5),
         srcPacket<SrcLoadMode>(row, col, 6), srcPacket<SrcLoadMode>(row, col, 7));
   }
 
@@ -787,30 +726,26 @@
     using SizedSrcPacketType = typename find_packet_by_size<SrcType, DstPacketSize>::type;
     constexpr int SrcBytesIncrement = DstPacketSize * sizeof(SrcType);
     constexpr int SrcLoadMode = plain_enum_min(SrcBytesIncrement, LoadMode);
-    return pcast<SizedSrcPacketType, DstPacketType>(
-        srcPacket<SrcLoadMode, SizedSrcPacketType>(index, 0));
+    return pcast<SizedSrcPacketType, DstPacketType>(srcPacket<SrcLoadMode, SizedSrcPacketType>(index, 0));
   }
   template <int LoadMode, typename DstPacketType, SrcPacketArgs2<DstPacketType> = true>
   EIGEN_STRONG_INLINE DstPacketType packet(Index index) const {
     constexpr int SrcLoadMode = plain_enum_min(SrcPacketBytes, LoadMode);
-    return pcast<SrcPacketType, DstPacketType>(
-        srcPacket<SrcLoadMode>(index, 0), srcPacket<SrcLoadMode>(index, 1));
+    return pcast<SrcPacketType, DstPacketType>(srcPacket<SrcLoadMode>(index, 0), srcPacket<SrcLoadMode>(index, 1));
   }
   template <int LoadMode, typename DstPacketType, SrcPacketArgs4<DstPacketType> = true>
   EIGEN_STRONG_INLINE DstPacketType packet(Index index) const {
     constexpr int SrcLoadMode = plain_enum_min(SrcPacketBytes, LoadMode);
-    return pcast<SrcPacketType, DstPacketType>(
-        srcPacket<SrcLoadMode>(index, 0), srcPacket<SrcLoadMode>(index, 1),
-        srcPacket<SrcLoadMode>(index, 2), srcPacket<SrcLoadMode>(index, 3));
+    return pcast<SrcPacketType, DstPacketType>(srcPacket<SrcLoadMode>(index, 0), srcPacket<SrcLoadMode>(index, 1),
+                                               srcPacket<SrcLoadMode>(index, 2), srcPacket<SrcLoadMode>(index, 3));
   }
   template <int LoadMode, typename DstPacketType, SrcPacketArgs8<DstPacketType> = true>
   EIGEN_STRONG_INLINE DstPacketType packet(Index index) const {
     constexpr int SrcLoadMode = plain_enum_min(SrcPacketBytes, LoadMode);
-    return pcast<SrcPacketType, DstPacketType>(
-        srcPacket<SrcLoadMode>(index, 0), srcPacket<SrcLoadMode>(index, 1),
-        srcPacket<SrcLoadMode>(index, 2), srcPacket<SrcLoadMode>(index, 3),
-        srcPacket<SrcLoadMode>(index, 4), srcPacket<SrcLoadMode>(index, 5),
-        srcPacket<SrcLoadMode>(index, 6), srcPacket<SrcLoadMode>(index, 7));
+    return pcast<SrcPacketType, DstPacketType>(srcPacket<SrcLoadMode>(index, 0), srcPacket<SrcLoadMode>(index, 1),
+                                               srcPacket<SrcLoadMode>(index, 2), srcPacket<SrcLoadMode>(index, 3),
+                                               srcPacket<SrcLoadMode>(index, 4), srcPacket<SrcLoadMode>(index, 5),
+                                               srcPacket<SrcLoadMode>(index, 6), srcPacket<SrcLoadMode>(index, 7));
   }
 
   constexpr EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index rows() const { return m_rows; }
@@ -826,90 +761,76 @@
 // -------------------- CwiseTernaryOp --------------------
 
 // this is a ternary expression
-template<typename TernaryOp, typename Arg1, typename Arg2, typename Arg3>
+template <typename TernaryOp, typename Arg1, typename Arg2, typename Arg3>
 struct evaluator<CwiseTernaryOp<TernaryOp, Arg1, Arg2, Arg3> >
-  : public ternary_evaluator<CwiseTernaryOp<TernaryOp, Arg1, Arg2, Arg3> >
-{
+    : public ternary_evaluator<CwiseTernaryOp<TernaryOp, Arg1, Arg2, Arg3> > {
   typedef CwiseTernaryOp<TernaryOp, Arg1, Arg2, Arg3> XprType;
   typedef ternary_evaluator<CwiseTernaryOp<TernaryOp, Arg1, Arg2, Arg3> > Base;
 
   EIGEN_DEVICE_FUNC explicit evaluator(const XprType& xpr) : Base(xpr) {}
 };
 
-template<typename TernaryOp, typename Arg1, typename Arg2, typename Arg3>
+template <typename TernaryOp, typename Arg1, typename Arg2, typename Arg3>
 struct ternary_evaluator<CwiseTernaryOp<TernaryOp, Arg1, Arg2, Arg3>, IndexBased, IndexBased>
-  : evaluator_base<CwiseTernaryOp<TernaryOp, Arg1, Arg2, Arg3> >
-{
+    : evaluator_base<CwiseTernaryOp<TernaryOp, Arg1, Arg2, Arg3> > {
   typedef CwiseTernaryOp<TernaryOp, Arg1, Arg2, Arg3> XprType;
 
   enum {
-    CoeffReadCost = int(evaluator<Arg1>::CoeffReadCost) + int(evaluator<Arg2>::CoeffReadCost) + int(evaluator<Arg3>::CoeffReadCost) + int(functor_traits<TernaryOp>::Cost),
+    CoeffReadCost = int(evaluator<Arg1>::CoeffReadCost) + int(evaluator<Arg2>::CoeffReadCost) +
+                    int(evaluator<Arg3>::CoeffReadCost) + int(functor_traits<TernaryOp>::Cost),
 
     Arg1Flags = evaluator<Arg1>::Flags,
     Arg2Flags = evaluator<Arg2>::Flags,
     Arg3Flags = evaluator<Arg3>::Flags,
-    SameType = is_same<typename Arg1::Scalar,typename Arg2::Scalar>::value && is_same<typename Arg1::Scalar,typename Arg3::Scalar>::value,
-    StorageOrdersAgree = (int(Arg1Flags)&RowMajorBit)==(int(Arg2Flags)&RowMajorBit) && (int(Arg1Flags)&RowMajorBit)==(int(Arg3Flags)&RowMajorBit),
-    Flags0 = (int(Arg1Flags) | int(Arg2Flags) | int(Arg3Flags)) & (
-        HereditaryBits
-        | (int(Arg1Flags) & int(Arg2Flags) & int(Arg3Flags) &
-           ( (StorageOrdersAgree ? LinearAccessBit : 0)
-           | (functor_traits<TernaryOp>::PacketAccess && StorageOrdersAgree && SameType ? PacketAccessBit : 0)
-           )
-        )
-     ),
+    SameType = is_same<typename Arg1::Scalar, typename Arg2::Scalar>::value &&
+               is_same<typename Arg1::Scalar, typename Arg3::Scalar>::value,
+    StorageOrdersAgree = (int(Arg1Flags) & RowMajorBit) == (int(Arg2Flags) & RowMajorBit) &&
+                         (int(Arg1Flags) & RowMajorBit) == (int(Arg3Flags) & RowMajorBit),
+    Flags0 = (int(Arg1Flags) | int(Arg2Flags) | int(Arg3Flags)) &
+             (HereditaryBits |
+              (int(Arg1Flags) & int(Arg2Flags) & int(Arg3Flags) &
+               ((StorageOrdersAgree ? LinearAccessBit : 0) |
+                (functor_traits<TernaryOp>::PacketAccess && StorageOrdersAgree && SameType ? PacketAccessBit : 0)))),
     Flags = (Flags0 & ~RowMajorBit) | (Arg1Flags & RowMajorBit),
-    Alignment = plain_enum_min(
-            plain_enum_min(evaluator<Arg1>::Alignment, evaluator<Arg2>::Alignment),
-            evaluator<Arg3>::Alignment)
+    Alignment = plain_enum_min(plain_enum_min(evaluator<Arg1>::Alignment, evaluator<Arg2>::Alignment),
+                               evaluator<Arg3>::Alignment)
   };
 
-  EIGEN_DEVICE_FUNC explicit ternary_evaluator(const XprType& xpr) : m_d(xpr)
-  {
+  EIGEN_DEVICE_FUNC explicit ternary_evaluator(const XprType& xpr) : m_d(xpr) {
     EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits<TernaryOp>::Cost);
     EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
   }
 
   typedef typename XprType::CoeffReturnType CoeffReturnType;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeff(Index row, Index col) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const {
     return m_d.func()(m_d.arg1Impl.coeff(row, col), m_d.arg2Impl.coeff(row, col), m_d.arg3Impl.coeff(row, col));
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
     return m_d.func()(m_d.arg1Impl.coeff(index), m_d.arg2Impl.coeff(index), m_d.arg3Impl.coeff(index));
   }
 
-  template<int LoadMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  PacketType packet(Index row, Index col) const
-  {
-    return m_d.func().packetOp(m_d.arg1Impl.template packet<LoadMode,PacketType>(row, col),
-                               m_d.arg2Impl.template packet<LoadMode,PacketType>(row, col),
-                               m_d.arg3Impl.template packet<LoadMode,PacketType>(row, col));
+  template <int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE PacketType packet(Index row, Index col) const {
+    return m_d.func().packetOp(m_d.arg1Impl.template packet<LoadMode, PacketType>(row, col),
+                               m_d.arg2Impl.template packet<LoadMode, PacketType>(row, col),
+                               m_d.arg3Impl.template packet<LoadMode, PacketType>(row, col));
   }
 
-  template<int LoadMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  PacketType packet(Index index) const
-  {
-    return m_d.func().packetOp(m_d.arg1Impl.template packet<LoadMode,PacketType>(index),
-                               m_d.arg2Impl.template packet<LoadMode,PacketType>(index),
-                               m_d.arg3Impl.template packet<LoadMode,PacketType>(index));
+  template <int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE PacketType packet(Index index) const {
+    return m_d.func().packetOp(m_d.arg1Impl.template packet<LoadMode, PacketType>(index),
+                               m_d.arg2Impl.template packet<LoadMode, PacketType>(index),
+                               m_d.arg3Impl.template packet<LoadMode, PacketType>(index));
   }
 
-protected:
+ protected:
   // this helper permits to completely eliminate the functor if it is empty
-  struct Data
-  {
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Data(const XprType& xpr) : op(xpr.functor()), arg1Impl(xpr.arg1()), arg2Impl(xpr.arg2()), arg3Impl(xpr.arg3()) {}
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    const TernaryOp& func() const { return op; }
+  struct Data {
+    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Data(const XprType& xpr)
+        : op(xpr.functor()), arg1Impl(xpr.arg1()), arg2Impl(xpr.arg2()), arg3Impl(xpr.arg3()) {}
+    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const TernaryOp& func() const { return op; }
     TernaryOp op;
     evaluator<Arg1> arg1Impl;
     evaluator<Arg2> arg2Impl;
@@ -922,88 +843,69 @@
 // -------------------- CwiseBinaryOp --------------------
 
 // this is a binary expression
-template<typename BinaryOp, typename Lhs, typename Rhs>
-struct evaluator<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >
-  : public binary_evaluator<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >
-{
+template <typename BinaryOp, typename Lhs, typename Rhs>
+struct evaluator<CwiseBinaryOp<BinaryOp, Lhs, Rhs> > : public binary_evaluator<CwiseBinaryOp<BinaryOp, Lhs, Rhs> > {
   typedef CwiseBinaryOp<BinaryOp, Lhs, Rhs> XprType;
   typedef binary_evaluator<CwiseBinaryOp<BinaryOp, Lhs, Rhs> > Base;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  explicit evaluator(const XprType& xpr) : Base(xpr) {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit evaluator(const XprType& xpr) : Base(xpr) {}
 };
 
-template<typename BinaryOp, typename Lhs, typename Rhs>
+template <typename BinaryOp, typename Lhs, typename Rhs>
 struct binary_evaluator<CwiseBinaryOp<BinaryOp, Lhs, Rhs>, IndexBased, IndexBased>
-  : evaluator_base<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >
-{
+    : evaluator_base<CwiseBinaryOp<BinaryOp, Lhs, Rhs> > {
   typedef CwiseBinaryOp<BinaryOp, Lhs, Rhs> XprType;
 
   enum {
-    CoeffReadCost = int(evaluator<Lhs>::CoeffReadCost) + int(evaluator<Rhs>::CoeffReadCost) + int(functor_traits<BinaryOp>::Cost),
+    CoeffReadCost =
+        int(evaluator<Lhs>::CoeffReadCost) + int(evaluator<Rhs>::CoeffReadCost) + int(functor_traits<BinaryOp>::Cost),
 
     LhsFlags = evaluator<Lhs>::Flags,
     RhsFlags = evaluator<Rhs>::Flags,
-    SameType = is_same<typename Lhs::Scalar,typename Rhs::Scalar>::value,
-    StorageOrdersAgree = (int(LhsFlags)&RowMajorBit)==(int(RhsFlags)&RowMajorBit),
-    Flags0 = (int(LhsFlags) | int(RhsFlags)) & (
-        HereditaryBits
-      | (int(LhsFlags) & int(RhsFlags) &
-           ( (StorageOrdersAgree ? LinearAccessBit : 0)
-           | (functor_traits<BinaryOp>::PacketAccess && StorageOrdersAgree && SameType ? PacketAccessBit : 0)
-           )
-        )
-     ),
+    SameType = is_same<typename Lhs::Scalar, typename Rhs::Scalar>::value,
+    StorageOrdersAgree = (int(LhsFlags) & RowMajorBit) == (int(RhsFlags) & RowMajorBit),
+    Flags0 = (int(LhsFlags) | int(RhsFlags)) &
+             (HereditaryBits |
+              (int(LhsFlags) & int(RhsFlags) &
+               ((StorageOrdersAgree ? LinearAccessBit : 0) |
+                (functor_traits<BinaryOp>::PacketAccess && StorageOrdersAgree && SameType ? PacketAccessBit : 0)))),
     Flags = (Flags0 & ~RowMajorBit) | (LhsFlags & RowMajorBit),
     Alignment = plain_enum_min(evaluator<Lhs>::Alignment, evaluator<Rhs>::Alignment)
   };
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  explicit binary_evaluator(const XprType& xpr) : m_d(xpr)
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit binary_evaluator(const XprType& xpr) : m_d(xpr) {
     EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits<BinaryOp>::Cost);
     EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
   }
 
   typedef typename XprType::CoeffReturnType CoeffReturnType;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeff(Index row, Index col) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const {
     return m_d.func()(m_d.lhsImpl.coeff(row, col), m_d.rhsImpl.coeff(row, col));
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
     return m_d.func()(m_d.lhsImpl.coeff(index), m_d.rhsImpl.coeff(index));
   }
 
-  template<int LoadMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  PacketType packet(Index row, Index col) const
-  {
-    return m_d.func().packetOp(m_d.lhsImpl.template packet<LoadMode,PacketType>(row, col),
-                               m_d.rhsImpl.template packet<LoadMode,PacketType>(row, col));
+  template <int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE PacketType packet(Index row, Index col) const {
+    return m_d.func().packetOp(m_d.lhsImpl.template packet<LoadMode, PacketType>(row, col),
+                               m_d.rhsImpl.template packet<LoadMode, PacketType>(row, col));
   }
 
-  template<int LoadMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  PacketType packet(Index index) const
-  {
-    return m_d.func().packetOp(m_d.lhsImpl.template packet<LoadMode,PacketType>(index),
-                               m_d.rhsImpl.template packet<LoadMode,PacketType>(index));
+  template <int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE PacketType packet(Index index) const {
+    return m_d.func().packetOp(m_d.lhsImpl.template packet<LoadMode, PacketType>(index),
+                               m_d.rhsImpl.template packet<LoadMode, PacketType>(index));
   }
 
-protected:
-
+ protected:
   // this helper permits to completely eliminate the functor if it is empty
-  struct Data
-  {
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Data(const XprType& xpr) : op(xpr.functor()), lhsImpl(xpr.lhs()), rhsImpl(xpr.rhs()) {}
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    const BinaryOp& func() const { return op; }
+  struct Data {
+    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Data(const XprType& xpr)
+        : op(xpr.functor()), lhsImpl(xpr.lhs()), rhsImpl(xpr.rhs()) {}
+    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const BinaryOp& func() const { return op; }
     BinaryOp op;
     evaluator<Lhs> lhsImpl;
     evaluator<Rhs> rhsImpl;
@@ -1014,10 +916,9 @@
 
 // -------------------- CwiseUnaryView --------------------
 
-template<typename UnaryOp, typename ArgType, typename StrideType>
+template <typename UnaryOp, typename ArgType, typename StrideType>
 struct unary_evaluator<CwiseUnaryView<UnaryOp, ArgType, StrideType>, IndexBased>
-  : evaluator_base<CwiseUnaryView<UnaryOp, ArgType, StrideType> >
-{
+    : evaluator_base<CwiseUnaryView<UnaryOp, ArgType, StrideType> > {
   typedef CwiseUnaryView<UnaryOp, ArgType, StrideType> XprType;
 
   enum {
@@ -1025,11 +926,10 @@
 
     Flags = (evaluator<ArgType>::Flags & (HereditaryBits | LinearAccessBit | DirectAccessBit)),
 
-    Alignment = 0 // FIXME it is not very clear why alignment is necessarily lost...
+    Alignment = 0  // FIXME it is not very clear why alignment is necessarily lost...
   };
 
-  EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& op) : m_d(op)
-  {
+  EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& op) : m_d(op) {
     EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits<UnaryOp>::Cost);
     EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
   }
@@ -1037,39 +937,28 @@
   typedef typename XprType::Scalar Scalar;
   typedef typename XprType::CoeffReturnType CoeffReturnType;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeff(Index row, Index col) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const {
     return m_d.func()(m_d.argImpl.coeff(row, col));
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
     return m_d.func()(m_d.argImpl.coeff(index));
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Scalar& coeffRef(Index row, Index col)
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index row, Index col) {
     return m_d.func()(m_d.argImpl.coeffRef(row, col));
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Scalar& coeffRef(Index index)
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index index) {
     return m_d.func()(m_d.argImpl.coeffRef(index));
   }
 
-protected:
-
+ protected:
   // this helper permits to completely eliminate the functor if it is empty
-  struct Data
-  {
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Data(const XprType& xpr) : op(xpr.functor()), argImpl(xpr.nestedExpression()) {}
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    const UnaryOp& func() const { return op; }
+  struct Data {
+    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Data(const XprType& xpr)
+        : op(xpr.functor()), argImpl(xpr.nestedExpression()) {}
+    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const UnaryOp& func() const { return op; }
     UnaryOp op;
     evaluator<ArgType> argImpl;
   };
@@ -1081,13 +970,12 @@
 
 // FIXME perhaps the PlainObjectType could be provided by Derived::PlainObject ?
 // but that might complicate template specialization
-template<typename Derived, typename PlainObjectType>
+template <typename Derived, typename PlainObjectType>
 struct mapbase_evaluator;
 
-template<typename Derived, typename PlainObjectType>
-struct mapbase_evaluator : evaluator_base<Derived>
-{
-  typedef Derived  XprType;
+template <typename Derived, typename PlainObjectType>
+struct mapbase_evaluator : evaluator_base<Derived> {
+  typedef Derived XprType;
   typedef typename XprType::PointerType PointerType;
   typedef typename XprType::Scalar Scalar;
   typedef typename XprType::CoeffReturnType CoeffReturnType;
@@ -1098,79 +986,58 @@
     CoeffReadCost = NumTraits<Scalar>::ReadCost
   };
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  explicit mapbase_evaluator(const XprType& map)
-    : m_data(const_cast<PointerType>(map.data())),
-      m_innerStride(map.innerStride()),
-      m_outerStride(map.outerStride())
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit mapbase_evaluator(const XprType& map)
+      : m_data(const_cast<PointerType>(map.data())),
+        m_innerStride(map.innerStride()),
+        m_outerStride(map.outerStride()) {
     EIGEN_STATIC_ASSERT(check_implication((evaluator<Derived>::Flags & PacketAccessBit) != 0,
                                           internal::inner_stride_at_compile_time<Derived>::ret == 1),
                         PACKET_ACCESS_REQUIRES_TO_HAVE_INNER_STRIDE_FIXED_TO_1);
     EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeff(Index row, Index col) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const {
     return m_data[col * colStride() + row * rowStride()];
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
     return m_data[index * m_innerStride.value()];
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Scalar& coeffRef(Index row, Index col)
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index row, Index col) {
     return m_data[col * colStride() + row * rowStride()];
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Scalar& coeffRef(Index index)
-  {
-    return m_data[index * m_innerStride.value()];
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index index) { return m_data[index * m_innerStride.value()]; }
 
-  template<int LoadMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  PacketType packet(Index row, Index col) const
-  {
+  template <int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE PacketType packet(Index row, Index col) const {
     PointerType ptr = m_data + row * rowStride() + col * colStride();
     return internal::ploadt<PacketType, LoadMode>(ptr);
   }
 
-  template<int LoadMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  PacketType packet(Index index) const
-  {
+  template <int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE PacketType packet(Index index) const {
     return internal::ploadt<PacketType, LoadMode>(m_data + index * m_innerStride.value());
   }
 
-  template<int StoreMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  void writePacket(Index row, Index col, const PacketType& x)
-  {
+  template <int StoreMode, typename PacketType>
+  EIGEN_STRONG_INLINE void writePacket(Index row, Index col, const PacketType& x) {
     PointerType ptr = m_data + row * rowStride() + col * colStride();
     return internal::pstoret<Scalar, PacketType, StoreMode>(ptr, x);
   }
 
-  template<int StoreMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  void writePacket(Index index, const PacketType& x)
-  {
+  template <int StoreMode, typename PacketType>
+  EIGEN_STRONG_INLINE void writePacket(Index index, const PacketType& x) {
     internal::pstoret<Scalar, PacketType, StoreMode>(m_data + index * m_innerStride.value(), x);
   }
-protected:
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-  Index rowStride() const EIGEN_NOEXCEPT {
+
+ protected:
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index rowStride() const EIGEN_NOEXCEPT {
     return XprType::IsRowMajor ? m_outerStride.value() : m_innerStride.value();
   }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-  Index colStride() const EIGEN_NOEXCEPT {
-     return XprType::IsRowMajor ? m_innerStride.value() : m_outerStride.value();
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index colStride() const EIGEN_NOEXCEPT {
+    return XprType::IsRowMajor ? m_innerStride.value() : m_outerStride.value();
   }
 
   PointerType m_data;
@@ -1178,10 +1045,9 @@
   const internal::variable_if_dynamic<Index, XprType::OuterStrideAtCompileTime> m_outerStride;
 };
 
-template<typename PlainObjectType, int MapOptions, typename StrideType>
+template <typename PlainObjectType, int MapOptions, typename StrideType>
 struct evaluator<Map<PlainObjectType, MapOptions, StrideType> >
-  : public mapbase_evaluator<Map<PlainObjectType, MapOptions, StrideType>, PlainObjectType>
-{
+    : public mapbase_evaluator<Map<PlainObjectType, MapOptions, StrideType>, PlainObjectType> {
   typedef Map<PlainObjectType, MapOptions, StrideType> XprType;
   typedef typename XprType::Scalar Scalar;
   // TODO: should check for smaller packet types once we can handle multi-sized packet types
@@ -1189,34 +1055,32 @@
 
   enum {
     InnerStrideAtCompileTime = StrideType::InnerStrideAtCompileTime == 0
-                             ? int(PlainObjectType::InnerStrideAtCompileTime)
-                             : int(StrideType::InnerStrideAtCompileTime),
+                                   ? int(PlainObjectType::InnerStrideAtCompileTime)
+                                   : int(StrideType::InnerStrideAtCompileTime),
     OuterStrideAtCompileTime = StrideType::OuterStrideAtCompileTime == 0
-                             ? int(PlainObjectType::OuterStrideAtCompileTime)
-                             : int(StrideType::OuterStrideAtCompileTime),
+                                   ? int(PlainObjectType::OuterStrideAtCompileTime)
+                                   : int(StrideType::OuterStrideAtCompileTime),
     HasNoInnerStride = InnerStrideAtCompileTime == 1,
     HasNoOuterStride = StrideType::OuterStrideAtCompileTime == 0,
     HasNoStride = HasNoInnerStride && HasNoOuterStride,
-    IsDynamicSize = PlainObjectType::SizeAtCompileTime==Dynamic,
+    IsDynamicSize = PlainObjectType::SizeAtCompileTime == Dynamic,
 
     PacketAccessMask = bool(HasNoInnerStride) ? ~int(0) : ~int(PacketAccessBit),
-    LinearAccessMask = bool(HasNoStride) || bool(PlainObjectType::IsVectorAtCompileTime) ? ~int(0) : ~int(LinearAccessBit),
-    Flags = int( evaluator<PlainObjectType>::Flags) & (LinearAccessMask&PacketAccessMask),
+    LinearAccessMask =
+        bool(HasNoStride) || bool(PlainObjectType::IsVectorAtCompileTime) ? ~int(0) : ~int(LinearAccessBit),
+    Flags = int(evaluator<PlainObjectType>::Flags) & (LinearAccessMask & PacketAccessMask),
 
-    Alignment = int(MapOptions)&int(AlignedMask)
+    Alignment = int(MapOptions) & int(AlignedMask)
   };
 
-  EIGEN_DEVICE_FUNC explicit evaluator(const XprType& map)
-    : mapbase_evaluator<XprType, PlainObjectType>(map)
-  { }
+  EIGEN_DEVICE_FUNC explicit evaluator(const XprType& map) : mapbase_evaluator<XprType, PlainObjectType>(map) {}
 };
 
 // -------------------- Ref --------------------
 
-template<typename PlainObjectType, int RefOptions, typename StrideType>
+template <typename PlainObjectType, int RefOptions, typename StrideType>
 struct evaluator<Ref<PlainObjectType, RefOptions, StrideType> >
-  : public mapbase_evaluator<Ref<PlainObjectType, RefOptions, StrideType>, PlainObjectType>
-{
+    : public mapbase_evaluator<Ref<PlainObjectType, RefOptions, StrideType>, PlainObjectType> {
   typedef Ref<PlainObjectType, RefOptions, StrideType> XprType;
 
   enum {
@@ -1224,21 +1088,19 @@
     Alignment = evaluator<Map<PlainObjectType, RefOptions, StrideType> >::Alignment
   };
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  explicit evaluator(const XprType& ref)
-    : mapbase_evaluator<XprType, PlainObjectType>(ref)
-  { }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit evaluator(const XprType& ref)
+      : mapbase_evaluator<XprType, PlainObjectType>(ref) {}
 };
 
 // -------------------- Block --------------------
 
-template<typename ArgType, int BlockRows, int BlockCols, bool InnerPanel,
-         bool HasDirectAccess = internal::has_direct_access<ArgType>::ret> struct block_evaluator;
+template <typename ArgType, int BlockRows, int BlockCols, bool InnerPanel,
+          bool HasDirectAccess = internal::has_direct_access<ArgType>::ret>
+struct block_evaluator;
 
-template<typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
+template <typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
 struct evaluator<Block<ArgType, BlockRows, BlockCols, InnerPanel> >
-  : block_evaluator<ArgType, BlockRows, BlockCols, InnerPanel>
-{
+    : block_evaluator<ArgType, BlockRows, BlockCols, InnerPanel> {
   typedef Block<ArgType, BlockRows, BlockCols, InnerPanel> XprType;
   typedef typename XprType::Scalar Scalar;
   // TODO: should check for smaller packet types once we can handle multi-sized packet types
@@ -1252,323 +1114,272 @@
     MaxRowsAtCompileTime = traits<XprType>::MaxRowsAtCompileTime,
     MaxColsAtCompileTime = traits<XprType>::MaxColsAtCompileTime,
 
-    ArgTypeIsRowMajor = (int(evaluator<ArgType>::Flags)&RowMajorBit) != 0,
-    IsRowMajor = (MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1) ? 1
-               : (MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1) ? 0
-               : ArgTypeIsRowMajor,
+    ArgTypeIsRowMajor = (int(evaluator<ArgType>::Flags) & RowMajorBit) != 0,
+    IsRowMajor = (MaxRowsAtCompileTime == 1 && MaxColsAtCompileTime != 1)   ? 1
+                 : (MaxColsAtCompileTime == 1 && MaxRowsAtCompileTime != 1) ? 0
+                                                                            : ArgTypeIsRowMajor,
     HasSameStorageOrderAsArgType = (IsRowMajor == ArgTypeIsRowMajor),
     InnerSize = IsRowMajor ? int(ColsAtCompileTime) : int(RowsAtCompileTime),
-    InnerStrideAtCompileTime = HasSameStorageOrderAsArgType
-                             ? int(inner_stride_at_compile_time<ArgType>::ret)
-                             : int(outer_stride_at_compile_time<ArgType>::ret),
-    OuterStrideAtCompileTime = HasSameStorageOrderAsArgType
-                             ? int(outer_stride_at_compile_time<ArgType>::ret)
-                             : int(inner_stride_at_compile_time<ArgType>::ret),
+    InnerStrideAtCompileTime = HasSameStorageOrderAsArgType ? int(inner_stride_at_compile_time<ArgType>::ret)
+                                                            : int(outer_stride_at_compile_time<ArgType>::ret),
+    OuterStrideAtCompileTime = HasSameStorageOrderAsArgType ? int(outer_stride_at_compile_time<ArgType>::ret)
+                                                            : int(inner_stride_at_compile_time<ArgType>::ret),
     MaskPacketAccessBit = (InnerStrideAtCompileTime == 1 || HasSameStorageOrderAsArgType) ? PacketAccessBit : 0,
 
-    FlagsLinearAccessBit = (RowsAtCompileTime == 1 || ColsAtCompileTime == 1 || (InnerPanel && (evaluator<ArgType>::Flags&LinearAccessBit))) ? LinearAccessBit : 0,
-    FlagsRowMajorBit = XprType::Flags&RowMajorBit,
-    Flags0 = evaluator<ArgType>::Flags & ( (HereditaryBits & ~RowMajorBit) |
-                                           DirectAccessBit |
-                                           MaskPacketAccessBit),
+    FlagsLinearAccessBit = (RowsAtCompileTime == 1 || ColsAtCompileTime == 1 ||
+                            (InnerPanel && (evaluator<ArgType>::Flags & LinearAccessBit)))
+                               ? LinearAccessBit
+                               : 0,
+    FlagsRowMajorBit = XprType::Flags & RowMajorBit,
+    Flags0 = evaluator<ArgType>::Flags & ((HereditaryBits & ~RowMajorBit) | DirectAccessBit | MaskPacketAccessBit),
     Flags = Flags0 | FlagsLinearAccessBit | FlagsRowMajorBit,
 
     PacketAlignment = unpacket_traits<PacketScalar>::alignment,
-    Alignment0 = (InnerPanel && (OuterStrideAtCompileTime!=Dynamic)
-                             && (OuterStrideAtCompileTime!=0)
-                             && (((OuterStrideAtCompileTime * int(sizeof(Scalar))) % int(PacketAlignment)) == 0)) ? int(PacketAlignment) : 0,
+    Alignment0 = (InnerPanel && (OuterStrideAtCompileTime != Dynamic) && (OuterStrideAtCompileTime != 0) &&
+                  (((OuterStrideAtCompileTime * int(sizeof(Scalar))) % int(PacketAlignment)) == 0))
+                     ? int(PacketAlignment)
+                     : 0,
     Alignment = plain_enum_min(evaluator<ArgType>::Alignment, Alignment0)
   };
   typedef block_evaluator<ArgType, BlockRows, BlockCols, InnerPanel> block_evaluator_type;
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  explicit evaluator(const XprType& block) : block_evaluator_type(block)
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit evaluator(const XprType& block) : block_evaluator_type(block) {
     EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
   }
 };
 
 // no direct-access => dispatch to a unary evaluator
-template<typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
+template <typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
 struct block_evaluator<ArgType, BlockRows, BlockCols, InnerPanel, /*HasDirectAccess*/ false>
-  : unary_evaluator<Block<ArgType, BlockRows, BlockCols, InnerPanel> >
-{
+    : unary_evaluator<Block<ArgType, BlockRows, BlockCols, InnerPanel> > {
   typedef Block<ArgType, BlockRows, BlockCols, InnerPanel> XprType;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  explicit block_evaluator(const XprType& block)
-    : unary_evaluator<XprType>(block)
-  {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit block_evaluator(const XprType& block)
+      : unary_evaluator<XprType>(block) {}
 };
 
-template<typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
+template <typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
 struct unary_evaluator<Block<ArgType, BlockRows, BlockCols, InnerPanel>, IndexBased>
-  : evaluator_base<Block<ArgType, BlockRows, BlockCols, InnerPanel> >
-{
+    : evaluator_base<Block<ArgType, BlockRows, BlockCols, InnerPanel> > {
   typedef Block<ArgType, BlockRows, BlockCols, InnerPanel> XprType;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  explicit unary_evaluator(const XprType& block)
-    : m_argImpl(block.nestedExpression()),
-      m_startRow(block.startRow()),
-      m_startCol(block.startCol()),
-      m_linear_offset(ForwardLinearAccess?(ArgType::IsRowMajor ? block.startRow()*block.nestedExpression().cols() + block.startCol() : block.startCol()*block.nestedExpression().rows() + block.startRow()):0)
-  { }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit unary_evaluator(const XprType& block)
+      : m_argImpl(block.nestedExpression()),
+        m_startRow(block.startRow()),
+        m_startCol(block.startCol()),
+        m_linear_offset(ForwardLinearAccess
+                            ? (ArgType::IsRowMajor
+                                   ? block.startRow() * block.nestedExpression().cols() + block.startCol()
+                                   : block.startCol() * block.nestedExpression().rows() + block.startRow())
+                            : 0) {}
 
   typedef typename XprType::Scalar Scalar;
   typedef typename XprType::CoeffReturnType CoeffReturnType;
 
   enum {
     RowsAtCompileTime = XprType::RowsAtCompileTime,
-    ForwardLinearAccess = (InnerPanel || int(XprType::IsRowMajor)==int(ArgType::IsRowMajor)) && bool(evaluator<ArgType>::Flags&LinearAccessBit)
+    ForwardLinearAccess = (InnerPanel || int(XprType::IsRowMajor) == int(ArgType::IsRowMajor)) &&
+                          bool(evaluator<ArgType>::Flags & LinearAccessBit)
   };
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeff(Index row, Index col) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const {
     return m_argImpl.coeff(m_startRow.value() + row, m_startCol.value() + col);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
     return linear_coeff_impl(index, bool_constant<ForwardLinearAccess>());
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Scalar& coeffRef(Index row, Index col)
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index row, Index col) {
     return m_argImpl.coeffRef(m_startRow.value() + row, m_startCol.value() + col);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Scalar& coeffRef(Index index)
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index index) {
     return linear_coeffRef_impl(index, bool_constant<ForwardLinearAccess>());
   }
 
-  template<int LoadMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  PacketType packet(Index row, Index col) const
-  {
-    return m_argImpl.template packet<LoadMode,PacketType>(m_startRow.value() + row, m_startCol.value() + col);
+  template <int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE PacketType packet(Index row, Index col) const {
+    return m_argImpl.template packet<LoadMode, PacketType>(m_startRow.value() + row, m_startCol.value() + col);
   }
 
-  template<int LoadMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  PacketType packet(Index index) const
-  {
+  template <int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE PacketType packet(Index index) const {
     if (ForwardLinearAccess)
-      return m_argImpl.template packet<LoadMode,PacketType>(m_linear_offset.value() + index);
+      return m_argImpl.template packet<LoadMode, PacketType>(m_linear_offset.value() + index);
     else
-      return packet<LoadMode,PacketType>(RowsAtCompileTime == 1 ? 0 : index,
-                                         RowsAtCompileTime == 1 ? index : 0);
+      return packet<LoadMode, PacketType>(RowsAtCompileTime == 1 ? 0 : index, RowsAtCompileTime == 1 ? index : 0);
   }
 
-  template<int StoreMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  void writePacket(Index row, Index col, const PacketType& x)
-  {
-    return m_argImpl.template writePacket<StoreMode,PacketType>(m_startRow.value() + row, m_startCol.value() + col, x);
+  template <int StoreMode, typename PacketType>
+  EIGEN_STRONG_INLINE void writePacket(Index row, Index col, const PacketType& x) {
+    return m_argImpl.template writePacket<StoreMode, PacketType>(m_startRow.value() + row, m_startCol.value() + col, x);
   }
 
-  template<int StoreMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  void writePacket(Index index, const PacketType& x)
-  {
+  template <int StoreMode, typename PacketType>
+  EIGEN_STRONG_INLINE void writePacket(Index index, const PacketType& x) {
     if (ForwardLinearAccess)
-      return m_argImpl.template writePacket<StoreMode,PacketType>(m_linear_offset.value() + index, x);
+      return m_argImpl.template writePacket<StoreMode, PacketType>(m_linear_offset.value() + index, x);
     else
-      return writePacket<StoreMode,PacketType>(RowsAtCompileTime == 1 ? 0 : index,
-                                              RowsAtCompileTime == 1 ? index : 0,
-                                              x);
+      return writePacket<StoreMode, PacketType>(RowsAtCompileTime == 1 ? 0 : index, RowsAtCompileTime == 1 ? index : 0,
+                                                x);
   }
 
-protected:
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType linear_coeff_impl(Index index, internal::true_type /* ForwardLinearAccess */) const
-  {
+ protected:
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType
+  linear_coeff_impl(Index index, internal::true_type /* ForwardLinearAccess */) const {
     return m_argImpl.coeff(m_linear_offset.value() + index);
   }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType linear_coeff_impl(Index index, internal::false_type /* not ForwardLinearAccess */) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType
+  linear_coeff_impl(Index index, internal::false_type /* not ForwardLinearAccess */) const {
     return coeff(RowsAtCompileTime == 1 ? 0 : index, RowsAtCompileTime == 1 ? index : 0);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Scalar& linear_coeffRef_impl(Index index, internal::true_type /* ForwardLinearAccess */)
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& linear_coeffRef_impl(Index index,
+                                                                     internal::true_type /* ForwardLinearAccess */) {
     return m_argImpl.coeffRef(m_linear_offset.value() + index);
   }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Scalar& linear_coeffRef_impl(Index index, internal::false_type /* not ForwardLinearAccess */)
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& linear_coeffRef_impl(
+      Index index, internal::false_type /* not ForwardLinearAccess */) {
     return coeffRef(RowsAtCompileTime == 1 ? 0 : index, RowsAtCompileTime == 1 ? index : 0);
   }
 
   evaluator<ArgType> m_argImpl;
-  const variable_if_dynamic<Index, (ArgType::RowsAtCompileTime == 1 && BlockRows==1) ? 0 : Dynamic> m_startRow;
-  const variable_if_dynamic<Index, (ArgType::ColsAtCompileTime == 1 && BlockCols==1) ? 0 : Dynamic> m_startCol;
+  const variable_if_dynamic<Index, (ArgType::RowsAtCompileTime == 1 && BlockRows == 1) ? 0 : Dynamic> m_startRow;
+  const variable_if_dynamic<Index, (ArgType::ColsAtCompileTime == 1 && BlockCols == 1) ? 0 : Dynamic> m_startCol;
   const variable_if_dynamic<Index, ForwardLinearAccess ? Dynamic : 0> m_linear_offset;
 };
 
 // TODO: This evaluator does not actually use the child evaluator;
 // all action is via the data() as returned by the Block expression.
 
-template<typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
+template <typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
 struct block_evaluator<ArgType, BlockRows, BlockCols, InnerPanel, /* HasDirectAccess */ true>
-  : mapbase_evaluator<Block<ArgType, BlockRows, BlockCols, InnerPanel>,
-                      typename Block<ArgType, BlockRows, BlockCols, InnerPanel>::PlainObject>
-{
+    : mapbase_evaluator<Block<ArgType, BlockRows, BlockCols, InnerPanel>,
+                        typename Block<ArgType, BlockRows, BlockCols, InnerPanel>::PlainObject> {
   typedef Block<ArgType, BlockRows, BlockCols, InnerPanel> XprType;
   typedef typename XprType::Scalar Scalar;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  explicit block_evaluator(const XprType& block)
-    : mapbase_evaluator<XprType, typename XprType::PlainObject>(block)
-  {
-    eigen_internal_assert((internal::is_constant_evaluated() || (std::uintptr_t(block.data()) % plain_enum_max(1,evaluator<XprType>::Alignment)) == 0) \
-      && "data is not aligned");
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit block_evaluator(const XprType& block)
+      : mapbase_evaluator<XprType, typename XprType::PlainObject>(block) {
+    eigen_internal_assert((internal::is_constant_evaluated() ||
+                           (std::uintptr_t(block.data()) % plain_enum_max(1, evaluator<XprType>::Alignment)) == 0) &&
+                          "data is not aligned");
   }
 };
 
-
 // -------------------- Select --------------------
 // NOTE shall we introduce a ternary_evaluator?
 
 // TODO enable vectorization for Select
-template<typename ConditionMatrixType, typename ThenMatrixType, typename ElseMatrixType>
+template <typename ConditionMatrixType, typename ThenMatrixType, typename ElseMatrixType>
 struct evaluator<Select<ConditionMatrixType, ThenMatrixType, ElseMatrixType> >
-  : evaluator_base<Select<ConditionMatrixType, ThenMatrixType, ElseMatrixType> >
-{
+    : evaluator_base<Select<ConditionMatrixType, ThenMatrixType, ElseMatrixType> > {
   typedef Select<ConditionMatrixType, ThenMatrixType, ElseMatrixType> XprType;
   enum {
-    CoeffReadCost = evaluator<ConditionMatrixType>::CoeffReadCost
-                  + plain_enum_max(evaluator<ThenMatrixType>::CoeffReadCost,
-                                             evaluator<ElseMatrixType>::CoeffReadCost),
+    CoeffReadCost = evaluator<ConditionMatrixType>::CoeffReadCost +
+                    plain_enum_max(evaluator<ThenMatrixType>::CoeffReadCost, evaluator<ElseMatrixType>::CoeffReadCost),
 
     Flags = (unsigned int)evaluator<ThenMatrixType>::Flags & evaluator<ElseMatrixType>::Flags & HereditaryBits,
 
     Alignment = plain_enum_min(evaluator<ThenMatrixType>::Alignment, evaluator<ElseMatrixType>::Alignment)
   };
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  explicit evaluator(const XprType& select)
-    : m_conditionImpl(select.conditionMatrix()),
-      m_thenImpl(select.thenMatrix()),
-      m_elseImpl(select.elseMatrix())
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit evaluator(const XprType& select)
+      : m_conditionImpl(select.conditionMatrix()), m_thenImpl(select.thenMatrix()), m_elseImpl(select.elseMatrix()) {
     EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
   }
 
   typedef typename XprType::CoeffReturnType CoeffReturnType;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeff(Index row, Index col) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const {
     if (m_conditionImpl.coeff(row, col))
       return m_thenImpl.coeff(row, col);
     else
       return m_elseImpl.coeff(row, col);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
     if (m_conditionImpl.coeff(index))
       return m_thenImpl.coeff(index);
     else
       return m_elseImpl.coeff(index);
   }
 
-protected:
+ protected:
   evaluator<ConditionMatrixType> m_conditionImpl;
   evaluator<ThenMatrixType> m_thenImpl;
   evaluator<ElseMatrixType> m_elseImpl;
 };
 
-
 // -------------------- Replicate --------------------
 
-template<typename ArgType, int RowFactor, int ColFactor>
+template <typename ArgType, int RowFactor, int ColFactor>
 struct unary_evaluator<Replicate<ArgType, RowFactor, ColFactor> >
-  : evaluator_base<Replicate<ArgType, RowFactor, ColFactor> >
-{
+    : evaluator_base<Replicate<ArgType, RowFactor, ColFactor> > {
   typedef Replicate<ArgType, RowFactor, ColFactor> XprType;
   typedef typename XprType::CoeffReturnType CoeffReturnType;
-  enum {
-    Factor = (RowFactor==Dynamic || ColFactor==Dynamic) ? Dynamic : RowFactor*ColFactor
-  };
-  typedef typename internal::nested_eval<ArgType,Factor>::type ArgTypeNested;
+  enum { Factor = (RowFactor == Dynamic || ColFactor == Dynamic) ? Dynamic : RowFactor * ColFactor };
+  typedef typename internal::nested_eval<ArgType, Factor>::type ArgTypeNested;
   typedef internal::remove_all_t<ArgTypeNested> ArgTypeNestedCleaned;
 
   enum {
     CoeffReadCost = evaluator<ArgTypeNestedCleaned>::CoeffReadCost,
     LinearAccessMask = XprType::IsVectorAtCompileTime ? LinearAccessBit : 0,
-    Flags = (evaluator<ArgTypeNestedCleaned>::Flags & (HereditaryBits|LinearAccessMask) & ~RowMajorBit) | (traits<XprType>::Flags & RowMajorBit),
+    Flags = (evaluator<ArgTypeNestedCleaned>::Flags & (HereditaryBits | LinearAccessMask) & ~RowMajorBit) |
+            (traits<XprType>::Flags & RowMajorBit),
 
     Alignment = evaluator<ArgTypeNestedCleaned>::Alignment
   };
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  explicit unary_evaluator(const XprType& replicate)
-    : m_arg(replicate.nestedExpression()),
-      m_argImpl(m_arg),
-      m_rows(replicate.nestedExpression().rows()),
-      m_cols(replicate.nestedExpression().cols())
-  {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit unary_evaluator(const XprType& replicate)
+      : m_arg(replicate.nestedExpression()),
+        m_argImpl(m_arg),
+        m_rows(replicate.nestedExpression().rows()),
+        m_cols(replicate.nestedExpression().cols()) {}
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeff(Index row, Index col) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const {
     // try to avoid using modulo; this is a pure optimization strategy
-    const Index actual_row = internal::traits<XprType>::RowsAtCompileTime==1 ? 0
-                           : RowFactor==1 ? row
-                           : row % m_rows.value();
-    const Index actual_col = internal::traits<XprType>::ColsAtCompileTime==1 ? 0
-                           : ColFactor==1 ? col
-                           : col % m_cols.value();
+    const Index actual_row = internal::traits<XprType>::RowsAtCompileTime == 1 ? 0
+                             : RowFactor == 1                                  ? row
+                                                                               : row % m_rows.value();
+    const Index actual_col = internal::traits<XprType>::ColsAtCompileTime == 1 ? 0
+                             : ColFactor == 1                                  ? col
+                                                                               : col % m_cols.value();
 
     return m_argImpl.coeff(actual_row, actual_col);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
     // try to avoid using modulo; this is a pure optimization strategy
-    const Index actual_index = internal::traits<XprType>::RowsAtCompileTime==1
-                                  ? (ColFactor==1 ?  index : index%m_cols.value())
-                                  : (RowFactor==1 ?  index : index%m_rows.value());
+    const Index actual_index = internal::traits<XprType>::RowsAtCompileTime == 1
+                                   ? (ColFactor == 1 ? index : index % m_cols.value())
+                                   : (RowFactor == 1 ? index : index % m_rows.value());
 
     return m_argImpl.coeff(actual_index);
   }
 
-  template<int LoadMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  PacketType packet(Index row, Index col) const
-  {
-    const Index actual_row = internal::traits<XprType>::RowsAtCompileTime==1 ? 0
-                           : RowFactor==1 ? row
-                           : row % m_rows.value();
-    const Index actual_col = internal::traits<XprType>::ColsAtCompileTime==1 ? 0
-                           : ColFactor==1 ? col
-                           : col % m_cols.value();
+  template <int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE PacketType packet(Index row, Index col) const {
+    const Index actual_row = internal::traits<XprType>::RowsAtCompileTime == 1 ? 0
+                             : RowFactor == 1                                  ? row
+                                                                               : row % m_rows.value();
+    const Index actual_col = internal::traits<XprType>::ColsAtCompileTime == 1 ? 0
+                             : ColFactor == 1                                  ? col
+                                                                               : col % m_cols.value();
 
-    return m_argImpl.template packet<LoadMode,PacketType>(actual_row, actual_col);
+    return m_argImpl.template packet<LoadMode, PacketType>(actual_row, actual_col);
   }
 
-  template<int LoadMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  PacketType packet(Index index) const
-  {
-    const Index actual_index = internal::traits<XprType>::RowsAtCompileTime==1
-                                  ? (ColFactor==1 ?  index : index%m_cols.value())
-                                  : (RowFactor==1 ?  index : index%m_rows.value());
+  template <int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE PacketType packet(Index index) const {
+    const Index actual_index = internal::traits<XprType>::RowsAtCompileTime == 1
+                                   ? (ColFactor == 1 ? index : index % m_cols.value())
+                                   : (RowFactor == 1 ? index : index % m_rows.value());
 
-    return m_argImpl.template packet<LoadMode,PacketType>(actual_index);
+    return m_argImpl.template packet<LoadMode, PacketType>(actual_index);
   }
 
-protected:
+ protected:
   const ArgTypeNested m_arg;
   evaluator<ArgTypeNestedCleaned> m_argImpl;
   const variable_if_dynamic<Index, ArgType::RowsAtCompileTime> m_rows;
@@ -1580,10 +1391,8 @@
 // evaluator_wrapper_base<T> is a common base class for the
 // MatrixWrapper and ArrayWrapper evaluators.
 
-template<typename XprType>
-struct evaluator_wrapper_base
-  : evaluator_base<XprType>
-{
+template <typename XprType>
+struct evaluator_wrapper_base : evaluator_base<XprType> {
   typedef remove_all_t<typename XprType::NestedExpressionType> ArgType;
   enum {
     CoeffReadCost = evaluator<ArgType>::CoeffReadCost,
@@ -1591,102 +1400,69 @@
     Alignment = evaluator<ArgType>::Alignment
   };
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  explicit evaluator_wrapper_base(const ArgType& arg) : m_argImpl(arg) {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit evaluator_wrapper_base(const ArgType& arg) : m_argImpl(arg) {}
 
   typedef typename ArgType::Scalar Scalar;
   typedef typename ArgType::CoeffReturnType CoeffReturnType;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeff(Index row, Index col) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const {
     return m_argImpl.coeff(row, col);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeff(Index index) const
-  {
-    return m_argImpl.coeff(index);
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const { return m_argImpl.coeff(index); }
+
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index row, Index col) { return m_argImpl.coeffRef(row, col); }
+
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index index) { return m_argImpl.coeffRef(index); }
+
+  template <int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE PacketType packet(Index row, Index col) const {
+    return m_argImpl.template packet<LoadMode, PacketType>(row, col);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Scalar& coeffRef(Index row, Index col)
-  {
-    return m_argImpl.coeffRef(row, col);
+  template <int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE PacketType packet(Index index) const {
+    return m_argImpl.template packet<LoadMode, PacketType>(index);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Scalar& coeffRef(Index index)
-  {
-    return m_argImpl.coeffRef(index);
-  }
-
-  template<int LoadMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  PacketType packet(Index row, Index col) const
-  {
-    return m_argImpl.template packet<LoadMode,PacketType>(row, col);
-  }
-
-  template<int LoadMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  PacketType packet(Index index) const
-  {
-    return m_argImpl.template packet<LoadMode,PacketType>(index);
-  }
-
-  template<int StoreMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  void writePacket(Index row, Index col, const PacketType& x)
-  {
+  template <int StoreMode, typename PacketType>
+  EIGEN_STRONG_INLINE void writePacket(Index row, Index col, const PacketType& x) {
     m_argImpl.template writePacket<StoreMode>(row, col, x);
   }
 
-  template<int StoreMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  void writePacket(Index index, const PacketType& x)
-  {
+  template <int StoreMode, typename PacketType>
+  EIGEN_STRONG_INLINE void writePacket(Index index, const PacketType& x) {
     m_argImpl.template writePacket<StoreMode>(index, x);
   }
 
-protected:
+ protected:
   evaluator<ArgType> m_argImpl;
 };
 
-template<typename TArgType>
-struct unary_evaluator<MatrixWrapper<TArgType> >
-  : evaluator_wrapper_base<MatrixWrapper<TArgType> >
-{
+template <typename TArgType>
+struct unary_evaluator<MatrixWrapper<TArgType> > : evaluator_wrapper_base<MatrixWrapper<TArgType> > {
   typedef MatrixWrapper<TArgType> XprType;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  explicit unary_evaluator(const XprType& wrapper)
-    : evaluator_wrapper_base<MatrixWrapper<TArgType> >(wrapper.nestedExpression())
-  { }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit unary_evaluator(const XprType& wrapper)
+      : evaluator_wrapper_base<MatrixWrapper<TArgType> >(wrapper.nestedExpression()) {}
 };
 
-template<typename TArgType>
-struct unary_evaluator<ArrayWrapper<TArgType> >
-  : evaluator_wrapper_base<ArrayWrapper<TArgType> >
-{
+template <typename TArgType>
+struct unary_evaluator<ArrayWrapper<TArgType> > : evaluator_wrapper_base<ArrayWrapper<TArgType> > {
   typedef ArrayWrapper<TArgType> XprType;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  explicit unary_evaluator(const XprType& wrapper)
-    : evaluator_wrapper_base<ArrayWrapper<TArgType> >(wrapper.nestedExpression())
-  { }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit unary_evaluator(const XprType& wrapper)
+      : evaluator_wrapper_base<ArrayWrapper<TArgType> >(wrapper.nestedExpression()) {}
 };
 
-
 // -------------------- Reverse --------------------
 
 // defined in Reverse.h:
-template<typename PacketType, bool ReversePacket> struct reverse_packet_cond;
+template <typename PacketType, bool ReversePacket>
+struct reverse_packet_cond;
 
-template<typename ArgType, int Direction>
-struct unary_evaluator<Reverse<ArgType, Direction> >
-  : evaluator_base<Reverse<ArgType, Direction> >
-{
+template <typename ArgType, int Direction>
+struct unary_evaluator<Reverse<ArgType, Direction> > : evaluator_base<Reverse<ArgType, Direction> > {
   typedef Reverse<ArgType, Direction> XprType;
   typedef typename XprType::Scalar Scalar;
   typedef typename XprType::CoeffReturnType CoeffReturnType;
@@ -1694,109 +1470,88 @@
   enum {
     IsRowMajor = XprType::IsRowMajor,
     IsColMajor = !IsRowMajor,
-    ReverseRow = (Direction == Vertical)   || (Direction == BothDirections),
+    ReverseRow = (Direction == Vertical) || (Direction == BothDirections),
     ReverseCol = (Direction == Horizontal) || (Direction == BothDirections),
-    ReversePacket = (Direction == BothDirections)
-                    || ((Direction == Vertical)   && IsColMajor)
-                    || ((Direction == Horizontal) && IsRowMajor),
+    ReversePacket = (Direction == BothDirections) || ((Direction == Vertical) && IsColMajor) ||
+                    ((Direction == Horizontal) && IsRowMajor),
 
     CoeffReadCost = evaluator<ArgType>::CoeffReadCost,
 
     // let's enable LinearAccess only with vectorization because of the product overhead
     // FIXME enable DirectAccess with negative strides?
     Flags0 = evaluator<ArgType>::Flags,
-    LinearAccess = ( (Direction==BothDirections) && (int(Flags0)&PacketAccessBit) )
-                  || ((ReverseRow && XprType::ColsAtCompileTime==1) || (ReverseCol && XprType::RowsAtCompileTime==1))
-                 ? LinearAccessBit : 0,
+    LinearAccess =
+        ((Direction == BothDirections) && (int(Flags0) & PacketAccessBit)) ||
+                ((ReverseRow && XprType::ColsAtCompileTime == 1) || (ReverseCol && XprType::RowsAtCompileTime == 1))
+            ? LinearAccessBit
+            : 0,
 
     Flags = int(Flags0) & (HereditaryBits | PacketAccessBit | LinearAccess),
 
-    Alignment = 0 // FIXME in some rare cases, Alignment could be preserved, like a Vector4f.
+    Alignment = 0  // FIXME in some rare cases, Alignment could be preserved, like a Vector4f.
   };
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  explicit unary_evaluator(const XprType& reverse)
-    : m_argImpl(reverse.nestedExpression()),
-      m_rows(ReverseRow ? reverse.nestedExpression().rows() : 1),
-      m_cols(ReverseCol ? reverse.nestedExpression().cols() : 1)
-  { }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit unary_evaluator(const XprType& reverse)
+      : m_argImpl(reverse.nestedExpression()),
+        m_rows(ReverseRow ? reverse.nestedExpression().rows() : 1),
+        m_cols(ReverseCol ? reverse.nestedExpression().cols() : 1) {}
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeff(Index row, Index col) const
-  {
-    return m_argImpl.coeff(ReverseRow ? m_rows.value() - row - 1 : row,
-                           ReverseCol ? m_cols.value() - col - 1 : col);
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const {
+    return m_argImpl.coeff(ReverseRow ? m_rows.value() - row - 1 : row, ReverseCol ? m_cols.value() - col - 1 : col);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
     return m_argImpl.coeff(m_rows.value() * m_cols.value() - index - 1);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Scalar& coeffRef(Index row, Index col)
-  {
-    return m_argImpl.coeffRef(ReverseRow ? m_rows.value() - row - 1 : row,
-                              ReverseCol ? m_cols.value() - col - 1 : col);
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index row, Index col) {
+    return m_argImpl.coeffRef(ReverseRow ? m_rows.value() - row - 1 : row, ReverseCol ? m_cols.value() - col - 1 : col);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Scalar& coeffRef(Index index)
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index index) {
     return m_argImpl.coeffRef(m_rows.value() * m_cols.value() - index - 1);
   }
 
-  template<int LoadMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  PacketType packet(Index row, Index col) const
-  {
+  template <int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE PacketType packet(Index row, Index col) const {
     enum {
       PacketSize = unpacket_traits<PacketType>::size,
-      OffsetRow  = ReverseRow && IsColMajor ? PacketSize : 1,
-      OffsetCol  = ReverseCol && IsRowMajor ? PacketSize : 1
+      OffsetRow = ReverseRow && IsColMajor ? PacketSize : 1,
+      OffsetCol = ReverseCol && IsRowMajor ? PacketSize : 1
     };
-    typedef internal::reverse_packet_cond<PacketType,ReversePacket> reverse_packet;
-    return reverse_packet::run(m_argImpl.template packet<LoadMode,PacketType>(
-                                  ReverseRow ? m_rows.value() - row - OffsetRow : row,
-                                  ReverseCol ? m_cols.value() - col - OffsetCol : col));
+    typedef internal::reverse_packet_cond<PacketType, ReversePacket> reverse_packet;
+    return reverse_packet::run(m_argImpl.template packet<LoadMode, PacketType>(
+        ReverseRow ? m_rows.value() - row - OffsetRow : row, ReverseCol ? m_cols.value() - col - OffsetCol : col));
   }
 
-  template<int LoadMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  PacketType packet(Index index) const
-  {
+  template <int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE PacketType packet(Index index) const {
     enum { PacketSize = unpacket_traits<PacketType>::size };
-    return preverse(m_argImpl.template packet<LoadMode,PacketType>(m_rows.value() * m_cols.value() - index - PacketSize));
+    return preverse(
+        m_argImpl.template packet<LoadMode, PacketType>(m_rows.value() * m_cols.value() - index - PacketSize));
   }
 
-  template<int LoadMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  void writePacket(Index row, Index col, const PacketType& x)
-  {
+  template <int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE void writePacket(Index row, Index col, const PacketType& x) {
     // FIXME we could factorize some code with packet(i,j)
     enum {
       PacketSize = unpacket_traits<PacketType>::size,
-      OffsetRow  = ReverseRow && IsColMajor ? PacketSize : 1,
-      OffsetCol  = ReverseCol && IsRowMajor ? PacketSize : 1
+      OffsetRow = ReverseRow && IsColMajor ? PacketSize : 1,
+      OffsetCol = ReverseCol && IsRowMajor ? PacketSize : 1
     };
-    typedef internal::reverse_packet_cond<PacketType,ReversePacket> reverse_packet;
-    m_argImpl.template writePacket<LoadMode>(
-                                  ReverseRow ? m_rows.value() - row - OffsetRow : row,
-                                  ReverseCol ? m_cols.value() - col - OffsetCol : col,
-                                  reverse_packet::run(x));
+    typedef internal::reverse_packet_cond<PacketType, ReversePacket> reverse_packet;
+    m_argImpl.template writePacket<LoadMode>(ReverseRow ? m_rows.value() - row - OffsetRow : row,
+                                             ReverseCol ? m_cols.value() - col - OffsetCol : col,
+                                             reverse_packet::run(x));
   }
 
-  template<int LoadMode, typename PacketType>
-  EIGEN_STRONG_INLINE
-  void writePacket(Index index, const PacketType& x)
-  {
+  template <int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE void writePacket(Index index, const PacketType& x) {
     enum { PacketSize = unpacket_traits<PacketType>::size };
-    m_argImpl.template writePacket<LoadMode>
-      (m_rows.value() * m_cols.value() - index - PacketSize, preverse(x));
+    m_argImpl.template writePacket<LoadMode>(m_rows.value() * m_cols.value() - index - PacketSize, preverse(x));
   }
 
-protected:
+ protected:
   evaluator<ArgType> m_argImpl;
 
   // If we do not reverse rows, then we do not need to know the number of rows; same for columns
@@ -1805,68 +1560,56 @@
   const variable_if_dynamic<Index, ReverseCol ? ArgType::ColsAtCompileTime : 1> m_cols;
 };
 
-
 // -------------------- Diagonal --------------------
 
-template<typename ArgType, int DiagIndex>
-struct evaluator<Diagonal<ArgType, DiagIndex> >
-  : evaluator_base<Diagonal<ArgType, DiagIndex> >
-{
+template <typename ArgType, int DiagIndex>
+struct evaluator<Diagonal<ArgType, DiagIndex> > : evaluator_base<Diagonal<ArgType, DiagIndex> > {
   typedef Diagonal<ArgType, DiagIndex> XprType;
 
   enum {
     CoeffReadCost = evaluator<ArgType>::CoeffReadCost,
 
-    Flags = (unsigned int)(evaluator<ArgType>::Flags & (HereditaryBits | DirectAccessBit) & ~RowMajorBit) | LinearAccessBit,
+    Flags =
+        (unsigned int)(evaluator<ArgType>::Flags & (HereditaryBits | DirectAccessBit) & ~RowMajorBit) | LinearAccessBit,
 
     Alignment = 0
   };
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  explicit evaluator(const XprType& diagonal)
-    : m_argImpl(diagonal.nestedExpression()),
-      m_index(diagonal.index())
-  { }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit evaluator(const XprType& diagonal)
+      : m_argImpl(diagonal.nestedExpression()), m_index(diagonal.index()) {}
 
   typedef typename XprType::Scalar Scalar;
   typedef typename XprType::CoeffReturnType CoeffReturnType;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeff(Index row, Index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index) const {
     return m_argImpl.coeff(row + rowOffset(), row + colOffset());
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
     return m_argImpl.coeff(index + rowOffset(), index + colOffset());
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Scalar& coeffRef(Index row, Index)
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index row, Index) {
     return m_argImpl.coeffRef(row + rowOffset(), row + colOffset());
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Scalar& coeffRef(Index index)
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index index) {
     return m_argImpl.coeffRef(index + rowOffset(), index + colOffset());
   }
 
-protected:
+ protected:
   evaluator<ArgType> m_argImpl;
   const internal::variable_if_dynamicindex<Index, XprType::DiagIndex> m_index;
 
-private:
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-  Index rowOffset() const { return m_index.value() > 0 ? 0 : -m_index.value(); }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-  Index colOffset() const { return m_index.value() > 0 ? m_index.value() : 0; }
+ private:
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index rowOffset() const {
+    return m_index.value() > 0 ? 0 : -m_index.value();
+  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index colOffset() const {
+    return m_index.value() > 0 ? m_index.value() : 0;
+  }
 };
 
-
 //----------------------------------------------------------------------
 // deprecated code
 //----------------------------------------------------------------------
@@ -1875,72 +1618,49 @@
 
 // expression class for evaluating nested expression to a temporary
 
-template<typename ArgType> class EvalToTemp;
+template <typename ArgType>
+class EvalToTemp;
 
-template<typename ArgType>
-struct traits<EvalToTemp<ArgType> >
-  : public traits<ArgType>
-{ };
+template <typename ArgType>
+struct traits<EvalToTemp<ArgType> > : public traits<ArgType> {};
 
-template<typename ArgType>
-class EvalToTemp
-  : public dense_xpr_base<EvalToTemp<ArgType> >::type
-{
+template <typename ArgType>
+class EvalToTemp : public dense_xpr_base<EvalToTemp<ArgType> >::type {
  public:
-
   typedef typename dense_xpr_base<EvalToTemp>::type Base;
   EIGEN_GENERIC_PUBLIC_INTERFACE(EvalToTemp)
 
-  explicit EvalToTemp(const ArgType& arg)
-    : m_arg(arg)
-  { }
+  explicit EvalToTemp(const ArgType& arg) : m_arg(arg) {}
 
-  const ArgType& arg() const
-  {
-    return m_arg;
-  }
+  const ArgType& arg() const { return m_arg; }
 
-  EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT
-  {
-    return m_arg.rows();
-  }
+  EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_arg.rows(); }
 
-  EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT
-  {
-    return m_arg.cols();
-  }
+  EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_arg.cols(); }
 
  private:
   const ArgType& m_arg;
 };
 
-template<typename ArgType>
-struct evaluator<EvalToTemp<ArgType> >
-  : public evaluator<typename ArgType::PlainObject>
-{
-  typedef EvalToTemp<ArgType>                   XprType;
-  typedef typename ArgType::PlainObject         PlainObject;
+template <typename ArgType>
+struct evaluator<EvalToTemp<ArgType> > : public evaluator<typename ArgType::PlainObject> {
+  typedef EvalToTemp<ArgType> XprType;
+  typedef typename ArgType::PlainObject PlainObject;
   typedef evaluator<PlainObject> Base;
 
-  EIGEN_DEVICE_FUNC explicit evaluator(const XprType& xpr)
-    : m_result(xpr.arg())
-  {
+  EIGEN_DEVICE_FUNC explicit evaluator(const XprType& xpr) : m_result(xpr.arg()) {
     internal::construct_at<Base>(this, m_result);
   }
 
   // This constructor is used when nesting an EvalTo evaluator in another evaluator
-  EIGEN_DEVICE_FUNC evaluator(const ArgType& arg)
-    : m_result(arg)
-  {
-    internal::construct_at<Base>(this, m_result);
-  }
+  EIGEN_DEVICE_FUNC evaluator(const ArgType& arg) : m_result(arg) { internal::construct_at<Base>(this, m_result); }
 
-protected:
+ protected:
   PlainObject m_result;
 };
 
-} // namespace internal
+}  // namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_COREEVALUATORS_H
+#endif  // EIGEN_COREEVALUATORS_H
diff --git a/Eigen/src/Core/CoreIterators.h b/Eigen/src/Core/CoreIterators.h
index d768cbc..f62cf23 100644
--- a/Eigen/src/Core/CoreIterators.h
+++ b/Eigen/src/Core/CoreIterators.h
@@ -13,100 +13,108 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 /* This file contains the respective InnerIterator definition of the expressions defined in Eigen/Core
  */
 
 namespace internal {
 
-template<typename XprType, typename EvaluatorKind>
+template <typename XprType, typename EvaluatorKind>
 class inner_iterator_selector;
 
 }
 
 /** \class InnerIterator
-  * \brief An InnerIterator allows to loop over the element of any matrix expression.
-  * 
-  * \warning To be used with care because an evaluator is constructed every time an InnerIterator iterator is constructed.
-  * 
-  * TODO: add a usage example
-  */
-template<typename XprType>
-class InnerIterator
-{
-protected:
+ * \brief An InnerIterator allows to loop over the element of any matrix expression.
+ *
+ * \warning To be used with care because an evaluator is constructed every time an InnerIterator iterator is
+ * constructed.
+ *
+ * TODO: add a usage example
+ */
+template <typename XprType>
+class InnerIterator {
+ protected:
   typedef internal::inner_iterator_selector<XprType, typename internal::evaluator_traits<XprType>::Kind> IteratorType;
   typedef internal::evaluator<XprType> EvaluatorType;
   typedef typename internal::traits<XprType>::Scalar Scalar;
-public:
+
+ public:
   /** Construct an iterator over the \a outerId -th row or column of \a xpr */
-  InnerIterator(const XprType &xpr, const Index &outerId)
-    : m_eval(xpr), m_iter(m_eval, outerId, xpr.innerSize())
-  {}
-  
+  InnerIterator(const XprType &xpr, const Index &outerId) : m_eval(xpr), m_iter(m_eval, outerId, xpr.innerSize()) {}
+
   /// \returns the value of the current coefficient.
-  EIGEN_STRONG_INLINE Scalar value() const          { return m_iter.value(); }
+  EIGEN_STRONG_INLINE Scalar value() const { return m_iter.value(); }
   /** Increment the iterator \c *this to the next non-zero coefficient.
-    * Explicit zeros are not skipped over. To skip explicit zeros, see class SparseView
-    */
-  EIGEN_STRONG_INLINE InnerIterator& operator++()   { m_iter.operator++(); return *this; }
-  EIGEN_STRONG_INLINE InnerIterator& operator+=(Index i) { m_iter.operator+=(i); return *this; }
-  EIGEN_STRONG_INLINE InnerIterator operator+(Index i) 
-  { InnerIterator result(*this); result+=i; return result; }
-    
+   * Explicit zeros are not skipped over. To skip explicit zeros, see class SparseView
+   */
+  EIGEN_STRONG_INLINE InnerIterator &operator++() {
+    m_iter.operator++();
+    return *this;
+  }
+  EIGEN_STRONG_INLINE InnerIterator &operator+=(Index i) {
+    m_iter.operator+=(i);
+    return *this;
+  }
+  EIGEN_STRONG_INLINE InnerIterator operator+(Index i) {
+    InnerIterator result(*this);
+    result += i;
+    return result;
+  }
 
   /// \returns the column or row index of the current coefficient.
-  EIGEN_STRONG_INLINE Index index() const           { return m_iter.index(); }
+  EIGEN_STRONG_INLINE Index index() const { return m_iter.index(); }
   /// \returns the row index of the current coefficient.
-  EIGEN_STRONG_INLINE Index row() const             { return m_iter.row(); }
+  EIGEN_STRONG_INLINE Index row() const { return m_iter.row(); }
   /// \returns the column index of the current coefficient.
-  EIGEN_STRONG_INLINE Index col() const             { return m_iter.col(); }
+  EIGEN_STRONG_INLINE Index col() const { return m_iter.col(); }
   /// \returns \c true if the iterator \c *this still references a valid coefficient.
-  EIGEN_STRONG_INLINE operator bool() const         { return m_iter; }
-  
-protected:
+  EIGEN_STRONG_INLINE operator bool() const { return m_iter; }
+
+ protected:
   EvaluatorType m_eval;
   IteratorType m_iter;
-private:
+
+ private:
   // If you get here, then you're not using the right InnerIterator type, e.g.:
   //   SparseMatrix<double,RowMajor> A;
   //   SparseMatrix<double>::InnerIterator it(A,0);
-  template<typename T> InnerIterator(const EigenBase<T>&,Index outer);
+  template <typename T>
+  InnerIterator(const EigenBase<T> &, Index outer);
 };
 
 namespace internal {
 
 // Generic inner iterator implementation for dense objects
-template<typename XprType>
-class inner_iterator_selector<XprType, IndexBased>
-{
-protected:
+template <typename XprType>
+class inner_iterator_selector<XprType, IndexBased> {
+ protected:
   typedef evaluator<XprType> EvaluatorType;
   typedef typename traits<XprType>::Scalar Scalar;
-  enum { IsRowMajor = (XprType::Flags&RowMajorBit)==RowMajorBit };
-  
-public:
-  EIGEN_STRONG_INLINE inner_iterator_selector(const EvaluatorType &eval, const Index &outerId, const Index &innerSize)
-    : m_eval(eval), m_inner(0), m_outer(outerId), m_end(innerSize)
-  {}
+  enum { IsRowMajor = (XprType::Flags & RowMajorBit) == RowMajorBit };
 
-  EIGEN_STRONG_INLINE Scalar value() const
-  {
-    return (IsRowMajor) ? m_eval.coeff(m_outer, m_inner)
-                        : m_eval.coeff(m_inner, m_outer);
+ public:
+  EIGEN_STRONG_INLINE inner_iterator_selector(const EvaluatorType &eval, const Index &outerId, const Index &innerSize)
+      : m_eval(eval), m_inner(0), m_outer(outerId), m_end(innerSize) {}
+
+  EIGEN_STRONG_INLINE Scalar value() const {
+    return (IsRowMajor) ? m_eval.coeff(m_outer, m_inner) : m_eval.coeff(m_inner, m_outer);
   }
 
-  EIGEN_STRONG_INLINE inner_iterator_selector& operator++() { m_inner++; return *this; }
+  EIGEN_STRONG_INLINE inner_iterator_selector &operator++() {
+    m_inner++;
+    return *this;
+  }
 
   EIGEN_STRONG_INLINE Index index() const { return m_inner; }
   inline Index row() const { return IsRowMajor ? m_outer : index(); }
   inline Index col() const { return IsRowMajor ? index() : m_outer; }
 
-  EIGEN_STRONG_INLINE operator bool() const { return m_inner < m_end && m_inner>=0; }
+  EIGEN_STRONG_INLINE operator bool() const { return m_inner < m_end && m_inner >= 0; }
 
-protected:
-  const EvaluatorType& m_eval;
+ protected:
+  const EvaluatorType &m_eval;
   Index m_inner;
   const Index m_outer;
   const Index m_end;
@@ -114,22 +122,20 @@
 
 // For iterator-based evaluator, inner-iterator is already implemented as
 // evaluator<>::InnerIterator
-template<typename XprType>
-class inner_iterator_selector<XprType, IteratorBased>
- : public evaluator<XprType>::InnerIterator
-{
-protected:
+template <typename XprType>
+class inner_iterator_selector<XprType, IteratorBased> : public evaluator<XprType>::InnerIterator {
+ protected:
   typedef typename evaluator<XprType>::InnerIterator Base;
   typedef evaluator<XprType> EvaluatorType;
-  
-public:
-  EIGEN_STRONG_INLINE inner_iterator_selector(const EvaluatorType &eval, const Index &outerId, const Index &/*innerSize*/)
-    : Base(eval, outerId)
-  {}  
+
+ public:
+  EIGEN_STRONG_INLINE inner_iterator_selector(const EvaluatorType &eval, const Index &outerId,
+                                              const Index & /*innerSize*/)
+      : Base(eval, outerId) {}
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_COREITERATORS_H
+#endif  // EIGEN_COREITERATORS_H
diff --git a/Eigen/src/Core/CwiseBinaryOp.h b/Eigen/src/Core/CwiseBinaryOp.h
index d5cf5d5..aa79b60 100644
--- a/Eigen/src/Core/CwiseBinaryOp.h
+++ b/Eigen/src/Core/CwiseBinaryOp.h
@@ -17,9 +17,8 @@
 namespace Eigen {
 
 namespace internal {
-template<typename BinaryOp, typename Lhs, typename Rhs>
-struct traits<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >
-{
+template <typename BinaryOp, typename Lhs, typename Rhs>
+struct traits<CwiseBinaryOp<BinaryOp, Lhs, Rhs>> {
   // we must not inherit from traits<Lhs> since it has
   // the potential to cause problems with MSVC
   typedef remove_all_t<Lhs> Ancestor;
@@ -33,154 +32,135 @@
 
   // even though we require Lhs and Rhs to have the same scalar type (see CwiseBinaryOp constructor),
   // we still want to handle the case when the result type is different.
-  typedef typename result_of<
-                     BinaryOp(
-                       const typename Lhs::Scalar&,
-                       const typename Rhs::Scalar&
-                     )
-                   >::type Scalar;
-  typedef typename cwise_promote_storage_type<typename traits<Lhs>::StorageKind,
-                                              typename traits<Rhs>::StorageKind,
+  typedef typename result_of<BinaryOp(const typename Lhs::Scalar&, const typename Rhs::Scalar&)>::type Scalar;
+  typedef typename cwise_promote_storage_type<typename traits<Lhs>::StorageKind, typename traits<Rhs>::StorageKind,
                                               BinaryOp>::ret StorageKind;
-  typedef typename promote_index_type<typename traits<Lhs>::StorageIndex,
-                                      typename traits<Rhs>::StorageIndex>::type StorageIndex;
+  typedef typename promote_index_type<typename traits<Lhs>::StorageIndex, typename traits<Rhs>::StorageIndex>::type
+      StorageIndex;
   typedef typename Lhs::Nested LhsNested;
   typedef typename Rhs::Nested RhsNested;
   typedef std::remove_reference_t<LhsNested> LhsNested_;
   typedef std::remove_reference_t<RhsNested> RhsNested_;
   enum {
-    Flags = cwise_promote_storage_order<typename traits<Lhs>::StorageKind,typename traits<Rhs>::StorageKind,LhsNested_::Flags & RowMajorBit,RhsNested_::Flags & RowMajorBit>::value
+    Flags = cwise_promote_storage_order<typename traits<Lhs>::StorageKind, typename traits<Rhs>::StorageKind,
+                                        LhsNested_::Flags & RowMajorBit, RhsNested_::Flags & RowMajorBit>::value
   };
 };
-} // end namespace internal
+}  // end namespace internal
 
-template<typename BinaryOp, typename Lhs, typename Rhs, typename StorageKind>
+template <typename BinaryOp, typename Lhs, typename Rhs, typename StorageKind>
 class CwiseBinaryOpImpl;
 
 /** \class CwiseBinaryOp
-  * \ingroup Core_Module
-  *
-  * \brief Generic expression where a coefficient-wise binary operator is applied to two expressions
-  *
-  * \tparam BinaryOp template functor implementing the operator
-  * \tparam LhsType the type of the left-hand side
-  * \tparam RhsType the type of the right-hand side
-  *
-  * This class represents an expression  where a coefficient-wise binary operator is applied to two expressions.
-  * It is the return type of binary operators, by which we mean only those binary operators where
-  * both the left-hand side and the right-hand side are Eigen expressions.
-  * For example, the return type of matrix1+matrix2 is a CwiseBinaryOp.
-  *
-  * Most of the time, this is the only way that it is used, so you typically don't have to name
-  * CwiseBinaryOp types explicitly.
-  *
-  * \sa MatrixBase::binaryExpr(const MatrixBase<OtherDerived> &,const CustomBinaryOp &) const, class CwiseUnaryOp, class CwiseNullaryOp
-  */
-template<typename BinaryOp, typename LhsType, typename RhsType>
-class CwiseBinaryOp :
-  public CwiseBinaryOpImpl<
-          BinaryOp, LhsType, RhsType,
-          typename internal::cwise_promote_storage_type<typename internal::traits<LhsType>::StorageKind,
-                                                        typename internal::traits<RhsType>::StorageKind,
-                                                        BinaryOp>::ret>,
-  internal::no_assignment_operator
-{
-  public:
+ * \ingroup Core_Module
+ *
+ * \brief Generic expression where a coefficient-wise binary operator is applied to two expressions
+ *
+ * \tparam BinaryOp template functor implementing the operator
+ * \tparam LhsType the type of the left-hand side
+ * \tparam RhsType the type of the right-hand side
+ *
+ * This class represents an expression  where a coefficient-wise binary operator is applied to two expressions.
+ * It is the return type of binary operators, by which we mean only those binary operators where
+ * both the left-hand side and the right-hand side are Eigen expressions.
+ * For example, the return type of matrix1+matrix2 is a CwiseBinaryOp.
+ *
+ * Most of the time, this is the only way that it is used, so you typically don't have to name
+ * CwiseBinaryOp types explicitly.
+ *
+ * \sa MatrixBase::binaryExpr(const MatrixBase<OtherDerived> &,const CustomBinaryOp &) const, class CwiseUnaryOp, class
+ * CwiseNullaryOp
+ */
+template <typename BinaryOp, typename LhsType, typename RhsType>
+class CwiseBinaryOp : public CwiseBinaryOpImpl<BinaryOp, LhsType, RhsType,
+                                               typename internal::cwise_promote_storage_type<
+                                                   typename internal::traits<LhsType>::StorageKind,
+                                                   typename internal::traits<RhsType>::StorageKind, BinaryOp>::ret>,
+                      internal::no_assignment_operator {
+ public:
+  typedef internal::remove_all_t<BinaryOp> Functor;
+  typedef internal::remove_all_t<LhsType> Lhs;
+  typedef internal::remove_all_t<RhsType> Rhs;
 
-    typedef internal::remove_all_t<BinaryOp> Functor;
-    typedef internal::remove_all_t<LhsType> Lhs;
-    typedef internal::remove_all_t<RhsType> Rhs;
+  typedef typename CwiseBinaryOpImpl<
+      BinaryOp, LhsType, RhsType,
+      typename internal::cwise_promote_storage_type<typename internal::traits<LhsType>::StorageKind,
+                                                    typename internal::traits<Rhs>::StorageKind, BinaryOp>::ret>::Base
+      Base;
+  EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseBinaryOp)
 
-    typedef typename CwiseBinaryOpImpl<
-        BinaryOp, LhsType, RhsType,
-        typename internal::cwise_promote_storage_type<typename internal::traits<LhsType>::StorageKind,
-                                                      typename internal::traits<Rhs>::StorageKind,
-                                                      BinaryOp>::ret>::Base Base;
-    EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseBinaryOp)
+  EIGEN_CHECK_BINARY_COMPATIBILIY(BinaryOp, typename Lhs::Scalar, typename Rhs::Scalar)
+  EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Lhs, Rhs)
 
-    EIGEN_CHECK_BINARY_COMPATIBILIY(BinaryOp,typename Lhs::Scalar,typename Rhs::Scalar)
-    EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Lhs, Rhs)
-
-    typedef typename internal::ref_selector<LhsType>::type LhsNested;
-    typedef typename internal::ref_selector<RhsType>::type RhsNested;
-    typedef std::remove_reference_t<LhsNested> LhsNested_;
-    typedef std::remove_reference_t<RhsNested> RhsNested_;
+  typedef typename internal::ref_selector<LhsType>::type LhsNested;
+  typedef typename internal::ref_selector<RhsType>::type RhsNested;
+  typedef std::remove_reference_t<LhsNested> LhsNested_;
+  typedef std::remove_reference_t<RhsNested> RhsNested_;
 
 #if EIGEN_COMP_MSVC
-    //Required for Visual Studio or the Copy constructor will probably not get inlined!
-    EIGEN_STRONG_INLINE
-    CwiseBinaryOp(const CwiseBinaryOp<BinaryOp,LhsType,RhsType>&) = default;
+  // Required for Visual Studio or the Copy constructor will probably not get inlined!
+  EIGEN_STRONG_INLINE CwiseBinaryOp(const CwiseBinaryOp<BinaryOp, LhsType, RhsType>&) = default;
 #endif
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    CwiseBinaryOp(const Lhs& aLhs, const Rhs& aRhs, const BinaryOp& func = BinaryOp())
-      : m_lhs(aLhs), m_rhs(aRhs), m_functor(func)
-    {
-      eigen_assert(aLhs.rows() == aRhs.rows() && aLhs.cols() == aRhs.cols());
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CwiseBinaryOp(const Lhs& aLhs, const Rhs& aRhs,
+                                                      const BinaryOp& func = BinaryOp())
+      : m_lhs(aLhs), m_rhs(aRhs), m_functor(func) {
+    eigen_assert(aLhs.rows() == aRhs.rows() && aLhs.cols() == aRhs.cols());
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-    Index rows() const EIGEN_NOEXCEPT {
-      // return the fixed size type if available to enable compile time optimizations
-      return internal::traits<internal::remove_all_t<LhsNested>>::RowsAtCompileTime==Dynamic ? m_rhs.rows() : m_lhs.rows();
-    }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-    Index cols() const EIGEN_NOEXCEPT {
-      // return the fixed size type if available to enable compile time optimizations
-      return internal::traits<internal::remove_all_t<LhsNested>>::ColsAtCompileTime==Dynamic ? m_rhs.cols() : m_lhs.cols();
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT {
+    // return the fixed size type if available to enable compile time optimizations
+    return internal::traits<internal::remove_all_t<LhsNested>>::RowsAtCompileTime == Dynamic ? m_rhs.rows()
+                                                                                             : m_lhs.rows();
+  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT {
+    // return the fixed size type if available to enable compile time optimizations
+    return internal::traits<internal::remove_all_t<LhsNested>>::ColsAtCompileTime == Dynamic ? m_rhs.cols()
+                                                                                             : m_lhs.cols();
+  }
 
-    /** \returns the left hand side nested expression */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    const LhsNested_& lhs() const { return m_lhs; }
-    /** \returns the right hand side nested expression */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    const RhsNested_& rhs() const { return m_rhs; }
-    /** \returns the functor representing the binary operation */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    const BinaryOp& functor() const { return m_functor; }
+  /** \returns the left hand side nested expression */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const LhsNested_& lhs() const { return m_lhs; }
+  /** \returns the right hand side nested expression */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const RhsNested_& rhs() const { return m_rhs; }
+  /** \returns the functor representing the binary operation */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const BinaryOp& functor() const { return m_functor; }
 
-  protected:
-    LhsNested m_lhs;
-    RhsNested m_rhs;
-    const BinaryOp m_functor;
+ protected:
+  LhsNested m_lhs;
+  RhsNested m_rhs;
+  const BinaryOp m_functor;
 };
 
 // Generic API dispatcher
-template<typename BinaryOp, typename Lhs, typename Rhs, typename StorageKind>
-class CwiseBinaryOpImpl
-  : public internal::generic_xpr_base<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >::type
-{
-public:
-  typedef typename internal::generic_xpr_base<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >::type Base;
+template <typename BinaryOp, typename Lhs, typename Rhs, typename StorageKind>
+class CwiseBinaryOpImpl : public internal::generic_xpr_base<CwiseBinaryOp<BinaryOp, Lhs, Rhs>>::type {
+ public:
+  typedef typename internal::generic_xpr_base<CwiseBinaryOp<BinaryOp, Lhs, Rhs>>::type Base;
 };
 
 /** replaces \c *this by \c *this - \a other.
-  *
-  * \returns a reference to \c *this
-  */
-template<typename Derived>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived &
-MatrixBase<Derived>::operator-=(const MatrixBase<OtherDerived> &other)
-{
-  call_assignment(derived(), other.derived(), internal::sub_assign_op<Scalar,typename OtherDerived::Scalar>());
+ *
+ * \returns a reference to \c *this
+ */
+template <typename Derived>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::operator-=(const MatrixBase<OtherDerived>& other) {
+  call_assignment(derived(), other.derived(), internal::sub_assign_op<Scalar, typename OtherDerived::Scalar>());
   return derived();
 }
 
 /** replaces \c *this by \c *this + \a other.
-  *
-  * \returns a reference to \c *this
-  */
-template<typename Derived>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived &
-MatrixBase<Derived>::operator+=(const MatrixBase<OtherDerived>& other)
-{
-  call_assignment(derived(), other.derived(), internal::add_assign_op<Scalar,typename OtherDerived::Scalar>());
+ *
+ * \returns a reference to \c *this
+ */
+template <typename Derived>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::operator+=(const MatrixBase<OtherDerived>& other) {
+  call_assignment(derived(), other.derived(), internal::add_assign_op<Scalar, typename OtherDerived::Scalar>());
   return derived();
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_CWISE_BINARY_OP_H
+#endif  // EIGEN_CWISE_BINARY_OP_H
diff --git a/Eigen/src/Core/CwiseNullaryOp.h b/Eigen/src/Core/CwiseNullaryOp.h
index b246cca..39c33cf 100644
--- a/Eigen/src/Core/CwiseNullaryOp.h
+++ b/Eigen/src/Core/CwiseNullaryOp.h
@@ -16,15 +16,12 @@
 namespace Eigen {
 
 namespace internal {
-template<typename NullaryOp, typename PlainObjectType>
-struct traits<CwiseNullaryOp<NullaryOp, PlainObjectType> > : traits<PlainObjectType>
-{
-  enum {
-    Flags = traits<PlainObjectType>::Flags & RowMajorBit
-  };
+template <typename NullaryOp, typename PlainObjectType>
+struct traits<CwiseNullaryOp<NullaryOp, PlainObjectType> > : traits<PlainObjectType> {
+  enum { Flags = traits<PlainObjectType>::Flags & RowMajorBit };
 };
 
-} // namespace internal
+}  // namespace internal
 
 /** \class CwiseNullaryOp
   * \ingroup Core_Module
@@ -43,11 +40,14 @@
   *
   * The functor NullaryOp must expose one of the following method:
     <table class="manual">
-    <tr            ><td>\c operator()() </td><td>if the procedural generation does not depend on the coefficient entries (e.g., random numbers)</td></tr>
-    <tr class="alt"><td>\c operator()(Index i)</td><td>if the procedural generation makes sense for vectors only and that it depends on the coefficient index \c i (e.g., linspace) </td></tr>
-    <tr            ><td>\c operator()(Index i,Index j)</td><td>if the procedural generation depends on the matrix coordinates \c i, \c j (e.g., to generate a checkerboard with 0 and 1)</td></tr>
+    <tr            ><td>\c operator()() </td><td>if the procedural generation does not depend on the coefficient entries
+  (e.g., random numbers)</td></tr> <tr class="alt"><td>\c operator()(Index i)</td><td>if the procedural generation makes
+  sense for vectors only and that it depends on the coefficient index \c i (e.g., linspace) </td></tr> <tr ><td>\c
+  operator()(Index i,Index j)</td><td>if the procedural generation depends on the matrix coordinates \c i, \c j (e.g.,
+  to generate a checkerboard with 0 and 1)</td></tr>
     </table>
-  * It is also possible to expose the last two operators if the generation makes sense for matrices but can be optimized for vectors.
+  * It is also possible to expose the last two operators if the generation makes sense for matrices but can be optimized
+  for vectors.
   *
   * See DenseBase::NullaryExpr(Index,const CustomNullaryOp&) for an example binding
   * C++11 random number generators.
@@ -59,252 +59,240 @@
   *
   * \sa class CwiseUnaryOp, class CwiseBinaryOp, DenseBase::NullaryExpr
   */
-template<typename NullaryOp, typename PlainObjectType>
-class CwiseNullaryOp : public internal::dense_xpr_base< CwiseNullaryOp<NullaryOp, PlainObjectType> >::type, internal::no_assignment_operator
-{
-  public:
+template <typename NullaryOp, typename PlainObjectType>
+class CwiseNullaryOp : public internal::dense_xpr_base<CwiseNullaryOp<NullaryOp, PlainObjectType> >::type,
+                       internal::no_assignment_operator {
+ public:
+  typedef typename internal::dense_xpr_base<CwiseNullaryOp>::type Base;
+  EIGEN_DENSE_PUBLIC_INTERFACE(CwiseNullaryOp)
 
-    typedef typename internal::dense_xpr_base<CwiseNullaryOp>::type Base;
-    EIGEN_DENSE_PUBLIC_INTERFACE(CwiseNullaryOp)
+  EIGEN_DEVICE_FUNC CwiseNullaryOp(Index rows, Index cols, const NullaryOp& func = NullaryOp())
+      : m_rows(rows), m_cols(cols), m_functor(func) {
+    eigen_assert(rows >= 0 && (RowsAtCompileTime == Dynamic || RowsAtCompileTime == rows) && cols >= 0 &&
+                 (ColsAtCompileTime == Dynamic || ColsAtCompileTime == cols));
+  }
 
-    EIGEN_DEVICE_FUNC
-    CwiseNullaryOp(Index rows, Index cols, const NullaryOp& func = NullaryOp())
-      : m_rows(rows), m_cols(cols), m_functor(func)
-    {
-      eigen_assert(rows >= 0
-            && (RowsAtCompileTime == Dynamic || RowsAtCompileTime == rows)
-            &&  cols >= 0
-            && (ColsAtCompileTime == Dynamic || ColsAtCompileTime == cols));
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index rows() const { return m_rows.value(); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index cols() const { return m_cols.value(); }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-    Index rows() const { return m_rows.value(); }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-    Index cols() const { return m_cols.value(); }
+  /** \returns the functor representing the nullary operation */
+  EIGEN_DEVICE_FUNC const NullaryOp& functor() const { return m_functor; }
 
-    /** \returns the functor representing the nullary operation */
-    EIGEN_DEVICE_FUNC
-    const NullaryOp& functor() const { return m_functor; }
-
-  protected:
-    const internal::variable_if_dynamic<Index, RowsAtCompileTime> m_rows;
-    const internal::variable_if_dynamic<Index, ColsAtCompileTime> m_cols;
-    const NullaryOp m_functor;
+ protected:
+  const internal::variable_if_dynamic<Index, RowsAtCompileTime> m_rows;
+  const internal::variable_if_dynamic<Index, ColsAtCompileTime> m_cols;
+  const NullaryOp m_functor;
 };
 
-
 /** \returns an expression of a matrix defined by a custom functor \a func
-  *
-  * The parameters \a rows and \a cols are the number of rows and of columns of
-  * the returned matrix. Must be compatible with this MatrixBase type.
-  *
-  * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
-  * it is redundant to pass \a rows and \a cols as arguments, so Zero() should be used
-  * instead.
-  *
-  * The template parameter \a CustomNullaryOp is the type of the functor.
-  *
-  * \sa class CwiseNullaryOp
-  */
-template<typename Derived>
-template<typename CustomNullaryOp>
+ *
+ * The parameters \a rows and \a cols are the number of rows and of columns of
+ * the returned matrix. Must be compatible with this MatrixBase type.
+ *
+ * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
+ * it is redundant to pass \a rows and \a cols as arguments, so Zero() should be used
+ * instead.
+ *
+ * The template parameter \a CustomNullaryOp is the type of the functor.
+ *
+ * \sa class CwiseNullaryOp
+ */
+template <typename Derived>
+template <typename CustomNullaryOp>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-const CwiseNullaryOp<CustomNullaryOp,typename DenseBase<Derived>::PlainObject>
+    const CwiseNullaryOp<CustomNullaryOp, typename DenseBase<Derived>::PlainObject>
 #else
-const CwiseNullaryOp<CustomNullaryOp,PlainObject>
+    const CwiseNullaryOp<CustomNullaryOp, PlainObject>
 #endif
-DenseBase<Derived>::NullaryExpr(Index rows, Index cols, const CustomNullaryOp& func)
-{
+    DenseBase<Derived>::NullaryExpr(Index rows, Index cols, const CustomNullaryOp& func) {
   return CwiseNullaryOp<CustomNullaryOp, PlainObject>(rows, cols, func);
 }
 
 /** \returns an expression of a matrix defined by a custom functor \a func
-  *
-  * The parameter \a size is the size of the returned vector.
-  * Must be compatible with this MatrixBase type.
-  *
-  * \only_for_vectors
-  *
-  * This variant is meant to be used for dynamic-size vector types. For fixed-size types,
-  * it is redundant to pass \a size as argument, so Zero() should be used
-  * instead.
-  *
-  * The template parameter \a CustomNullaryOp is the type of the functor.
-  *
-  * Here is an example with C++11 random generators: \include random_cpp11.cpp
-  * Output: \verbinclude random_cpp11.out
-  *
-  * \sa class CwiseNullaryOp
-  */
-template<typename Derived>
-template<typename CustomNullaryOp>
+ *
+ * The parameter \a size is the size of the returned vector.
+ * Must be compatible with this MatrixBase type.
+ *
+ * \only_for_vectors
+ *
+ * This variant is meant to be used for dynamic-size vector types. For fixed-size types,
+ * it is redundant to pass \a size as argument, so Zero() should be used
+ * instead.
+ *
+ * The template parameter \a CustomNullaryOp is the type of the functor.
+ *
+ * Here is an example with C++11 random generators: \include random_cpp11.cpp
+ * Output: \verbinclude random_cpp11.out
+ *
+ * \sa class CwiseNullaryOp
+ */
+template <typename Derived>
+template <typename CustomNullaryOp>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-const CwiseNullaryOp<CustomNullaryOp, typename DenseBase<Derived>::PlainObject>
+    const CwiseNullaryOp<CustomNullaryOp, typename DenseBase<Derived>::PlainObject>
 #else
-const CwiseNullaryOp<CustomNullaryOp, PlainObject>
+    const CwiseNullaryOp<CustomNullaryOp, PlainObject>
 #endif
-DenseBase<Derived>::NullaryExpr(Index size, const CustomNullaryOp& func)
-{
+    DenseBase<Derived>::NullaryExpr(Index size, const CustomNullaryOp& func) {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
-  if(RowsAtCompileTime == 1) return CwiseNullaryOp<CustomNullaryOp, PlainObject>(1, size, func);
-  else return CwiseNullaryOp<CustomNullaryOp, PlainObject>(size, 1, func);
+  if (RowsAtCompileTime == 1)
+    return CwiseNullaryOp<CustomNullaryOp, PlainObject>(1, size, func);
+  else
+    return CwiseNullaryOp<CustomNullaryOp, PlainObject>(size, 1, func);
 }
 
 /** \returns an expression of a matrix defined by a custom functor \a func
-  *
-  * This variant is only for fixed-size DenseBase types. For dynamic-size types, you
-  * need to use the variants taking size arguments.
-  *
-  * The template parameter \a CustomNullaryOp is the type of the functor.
-  *
-  * \sa class CwiseNullaryOp
-  */
-template<typename Derived>
-template<typename CustomNullaryOp>
+ *
+ * This variant is only for fixed-size DenseBase types. For dynamic-size types, you
+ * need to use the variants taking size arguments.
+ *
+ * The template parameter \a CustomNullaryOp is the type of the functor.
+ *
+ * \sa class CwiseNullaryOp
+ */
+template <typename Derived>
+template <typename CustomNullaryOp>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-const CwiseNullaryOp<CustomNullaryOp, typename DenseBase<Derived>::PlainObject>
+    const CwiseNullaryOp<CustomNullaryOp, typename DenseBase<Derived>::PlainObject>
 #else
-const CwiseNullaryOp<CustomNullaryOp, PlainObject>
+    const CwiseNullaryOp<CustomNullaryOp, PlainObject>
 #endif
-DenseBase<Derived>::NullaryExpr(const CustomNullaryOp& func)
-{
+    DenseBase<Derived>::NullaryExpr(const CustomNullaryOp& func) {
   return CwiseNullaryOp<CustomNullaryOp, PlainObject>(RowsAtCompileTime, ColsAtCompileTime, func);
 }
 
 /** \returns an expression of a constant matrix of value \a value
-  *
-  * The parameters \a rows and \a cols are the number of rows and of columns of
-  * the returned matrix. Must be compatible with this DenseBase type.
-  *
-  * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
-  * it is redundant to pass \a rows and \a cols as arguments, so Zero() should be used
-  * instead.
-  *
-  * The template parameter \a CustomNullaryOp is the type of the functor.
-  *
-  * \sa class CwiseNullaryOp
-  */
-template<typename Derived>
+ *
+ * The parameters \a rows and \a cols are the number of rows and of columns of
+ * the returned matrix. Must be compatible with this DenseBase type.
+ *
+ * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
+ * it is redundant to pass \a rows and \a cols as arguments, so Zero() should be used
+ * instead.
+ *
+ * The template parameter \a CustomNullaryOp is the type of the functor.
+ *
+ * \sa class CwiseNullaryOp
+ */
+template <typename Derived>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
-DenseBase<Derived>::Constant(Index rows, Index cols, const Scalar& value)
-{
+DenseBase<Derived>::Constant(Index rows, Index cols, const Scalar& value) {
   return DenseBase<Derived>::NullaryExpr(rows, cols, internal::scalar_constant_op<Scalar>(value));
 }
 
 /** \returns an expression of a constant matrix of value \a value
-  *
-  * The parameter \a size is the size of the returned vector.
-  * Must be compatible with this DenseBase type.
-  *
-  * \only_for_vectors
-  *
-  * This variant is meant to be used for dynamic-size vector types. For fixed-size types,
-  * it is redundant to pass \a size as argument, so Zero() should be used
-  * instead.
-  *
-  * The template parameter \a CustomNullaryOp is the type of the functor.
-  *
-  * \sa class CwiseNullaryOp
-  */
-template<typename Derived>
+ *
+ * The parameter \a size is the size of the returned vector.
+ * Must be compatible with this DenseBase type.
+ *
+ * \only_for_vectors
+ *
+ * This variant is meant to be used for dynamic-size vector types. For fixed-size types,
+ * it is redundant to pass \a size as argument, so Zero() should be used
+ * instead.
+ *
+ * The template parameter \a CustomNullaryOp is the type of the functor.
+ *
+ * \sa class CwiseNullaryOp
+ */
+template <typename Derived>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
-DenseBase<Derived>::Constant(Index size, const Scalar& value)
-{
+DenseBase<Derived>::Constant(Index size, const Scalar& value) {
   return DenseBase<Derived>::NullaryExpr(size, internal::scalar_constant_op<Scalar>(value));
 }
 
 /** \returns an expression of a constant matrix of value \a value
-  *
-  * This variant is only for fixed-size DenseBase types. For dynamic-size types, you
-  * need to use the variants taking size arguments.
-  *
-  * The template parameter \a CustomNullaryOp is the type of the functor.
-  *
-  * \sa class CwiseNullaryOp
-  */
-template<typename Derived>
+ *
+ * This variant is only for fixed-size DenseBase types. For dynamic-size types, you
+ * need to use the variants taking size arguments.
+ *
+ * The template parameter \a CustomNullaryOp is the type of the functor.
+ *
+ * \sa class CwiseNullaryOp
+ */
+template <typename Derived>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
-DenseBase<Derived>::Constant(const Scalar& value)
-{
+DenseBase<Derived>::Constant(const Scalar& value) {
   EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
-  return DenseBase<Derived>::NullaryExpr(RowsAtCompileTime, ColsAtCompileTime, internal::scalar_constant_op<Scalar>(value));
+  return DenseBase<Derived>::NullaryExpr(RowsAtCompileTime, ColsAtCompileTime,
+                                         internal::scalar_constant_op<Scalar>(value));
 }
 
 /** \deprecated because of accuracy loss. In Eigen 3.3, it is an alias for LinSpaced(Index,const Scalar&,const Scalar&)
-  *
-  * \only_for_vectors
-  *
-  * Example: \include DenseBase_LinSpaced_seq_deprecated.cpp
-  * Output: \verbinclude DenseBase_LinSpaced_seq_deprecated.out
-  *
-  * \sa LinSpaced(Index,const Scalar&, const Scalar&), setLinSpaced(Index,const Scalar&,const Scalar&)
-  */
-template<typename Derived>
-EIGEN_DEPRECATED EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::RandomAccessLinSpacedReturnType
-DenseBase<Derived>::LinSpaced(Sequential_t, Index size, const Scalar& low, const Scalar& high)
-{
+ *
+ * \only_for_vectors
+ *
+ * Example: \include DenseBase_LinSpaced_seq_deprecated.cpp
+ * Output: \verbinclude DenseBase_LinSpaced_seq_deprecated.out
+ *
+ * \sa LinSpaced(Index,const Scalar&, const Scalar&), setLinSpaced(Index,const Scalar&,const Scalar&)
+ */
+template <typename Derived>
+EIGEN_DEPRECATED EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<
+    Derived>::RandomAccessLinSpacedReturnType
+DenseBase<Derived>::LinSpaced(Sequential_t, Index size, const Scalar& low, const Scalar& high) {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
-  return DenseBase<Derived>::NullaryExpr(size, internal::linspaced_op<Scalar>(low,high,size));
+  return DenseBase<Derived>::NullaryExpr(size, internal::linspaced_op<Scalar>(low, high, size));
 }
 
 /** \deprecated because of accuracy loss. In Eigen 3.3, it is an alias for LinSpaced(const Scalar&,const Scalar&)
-  *
-  * \sa LinSpaced(const Scalar&, const Scalar&)
-  */
-template<typename Derived>
-EIGEN_DEPRECATED EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::RandomAccessLinSpacedReturnType
-DenseBase<Derived>::LinSpaced(Sequential_t, const Scalar& low, const Scalar& high)
-{
+ *
+ * \sa LinSpaced(const Scalar&, const Scalar&)
+ */
+template <typename Derived>
+EIGEN_DEPRECATED EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<
+    Derived>::RandomAccessLinSpacedReturnType
+DenseBase<Derived>::LinSpaced(Sequential_t, const Scalar& low, const Scalar& high) {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
   EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
-  return DenseBase<Derived>::NullaryExpr(Derived::SizeAtCompileTime, internal::linspaced_op<Scalar>(low,high,Derived::SizeAtCompileTime));
+  return DenseBase<Derived>::NullaryExpr(Derived::SizeAtCompileTime,
+                                         internal::linspaced_op<Scalar>(low, high, Derived::SizeAtCompileTime));
 }
 
 /**
-  * \brief Sets a linearly spaced vector.
-  *
-  * The function generates 'size' equally spaced values in the closed interval [low,high].
-  * When size is set to 1, a vector of length 1 containing 'high' is returned.
-  *
-  * \only_for_vectors
-  *
-  * Example: \include DenseBase_LinSpaced.cpp
-  * Output: \verbinclude DenseBase_LinSpaced.out
-  *
-  * For integer scalar types, an even spacing is possible if and only if the length of the range,
-  * i.e., \c high-low is a scalar multiple of \c size-1, or if \c size is a scalar multiple of the
-  * number of values \c high-low+1 (meaning each value can be repeated the same number of time).
-  * If one of these two considions is not satisfied, then \c high is lowered to the largest value
-  * satisfying one of this constraint.
-  * Here are some examples:
-  *
-  * Example: \include DenseBase_LinSpacedInt.cpp
-  * Output: \verbinclude DenseBase_LinSpacedInt.out
-  *
-  * \sa setLinSpaced(Index,const Scalar&,const Scalar&), CwiseNullaryOp
-  */
-template<typename Derived>
+ * \brief Sets a linearly spaced vector.
+ *
+ * The function generates 'size' equally spaced values in the closed interval [low,high].
+ * When size is set to 1, a vector of length 1 containing 'high' is returned.
+ *
+ * \only_for_vectors
+ *
+ * Example: \include DenseBase_LinSpaced.cpp
+ * Output: \verbinclude DenseBase_LinSpaced.out
+ *
+ * For integer scalar types, an even spacing is possible if and only if the length of the range,
+ * i.e., \c high-low is a scalar multiple of \c size-1, or if \c size is a scalar multiple of the
+ * number of values \c high-low+1 (meaning each value can be repeated the same number of time).
+ * If one of these two considions is not satisfied, then \c high is lowered to the largest value
+ * satisfying one of this constraint.
+ * Here are some examples:
+ *
+ * Example: \include DenseBase_LinSpacedInt.cpp
+ * Output: \verbinclude DenseBase_LinSpacedInt.out
+ *
+ * \sa setLinSpaced(Index,const Scalar&,const Scalar&), CwiseNullaryOp
+ */
+template <typename Derived>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::RandomAccessLinSpacedReturnType
-DenseBase<Derived>::LinSpaced(Index size, const Scalar& low, const Scalar& high)
-{
+DenseBase<Derived>::LinSpaced(Index size, const Scalar& low, const Scalar& high) {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
-  return DenseBase<Derived>::NullaryExpr(size, internal::linspaced_op<Scalar>(low,high,size));
+  return DenseBase<Derived>::NullaryExpr(size, internal::linspaced_op<Scalar>(low, high, size));
 }
 
 /**
-  * \copydoc DenseBase::LinSpaced(Index, const Scalar&, const Scalar&)
-  * Special version for fixed size types which does not require the size parameter.
-  */
-template<typename Derived>
+ * \copydoc DenseBase::LinSpaced(Index, const Scalar&, const Scalar&)
+ * Special version for fixed size types which does not require the size parameter.
+ */
+template <typename Derived>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::RandomAccessLinSpacedReturnType
-DenseBase<Derived>::LinSpaced(const Scalar& low, const Scalar& high)
-{
+DenseBase<Derived>::LinSpaced(const Scalar& low, const Scalar& high) {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
   EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
-  return DenseBase<Derived>::NullaryExpr(Derived::SizeAtCompileTime, internal::linspaced_op<Scalar>(low,high,Derived::SizeAtCompileTime));
+  return DenseBase<Derived>::NullaryExpr(Derived::SizeAtCompileTime,
+                                         internal::linspaced_op<Scalar>(low, high, Derived::SizeAtCompileTime));
 }
 
 template <typename Derived>
@@ -322,150 +310,141 @@
 }
 
 /** \returns true if all coefficients in this matrix are approximately equal to \a val, to within precision \a prec */
-template<typename Derived>
-EIGEN_DEVICE_FUNC bool DenseBase<Derived>::isApproxToConstant
-(const Scalar& val, const RealScalar& prec) const
-{
-  typename internal::nested_eval<Derived,1>::type self(derived());
-  for(Index j = 0; j < cols(); ++j)
-    for(Index i = 0; i < rows(); ++i)
-      if(!internal::isApprox(self.coeff(i, j), val, prec))
-        return false;
+template <typename Derived>
+EIGEN_DEVICE_FUNC bool DenseBase<Derived>::isApproxToConstant(const Scalar& val, const RealScalar& prec) const {
+  typename internal::nested_eval<Derived, 1>::type self(derived());
+  for (Index j = 0; j < cols(); ++j)
+    for (Index i = 0; i < rows(); ++i)
+      if (!internal::isApprox(self.coeff(i, j), val, prec)) return false;
   return true;
 }
 
 /** This is just an alias for isApproxToConstant().
-  *
-  * \returns true if all coefficients in this matrix are approximately equal to \a value, to within precision \a prec */
-template<typename Derived>
-EIGEN_DEVICE_FUNC bool DenseBase<Derived>::isConstant
-(const Scalar& val, const RealScalar& prec) const
-{
+ *
+ * \returns true if all coefficients in this matrix are approximately equal to \a value, to within precision \a prec */
+template <typename Derived>
+EIGEN_DEVICE_FUNC bool DenseBase<Derived>::isConstant(const Scalar& val, const RealScalar& prec) const {
   return isApproxToConstant(val, prec);
 }
 
 /** Alias for setConstant(): sets all coefficients in this expression to \a val.
-  *
-  * \sa setConstant(), Constant(), class CwiseNullaryOp
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void DenseBase<Derived>::fill(const Scalar& val)
-{
+ *
+ * \sa setConstant(), Constant(), class CwiseNullaryOp
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void DenseBase<Derived>::fill(const Scalar& val) {
   setConstant(val);
 }
 
 /** Sets all coefficients in this expression to value \a val.
-  *
-  * \sa fill(), setConstant(Index,const Scalar&), setConstant(Index,Index,const Scalar&), setZero(), setOnes(), Constant(), class CwiseNullaryOp, setZero(), setOnes()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setConstant(const Scalar& val)
-{
+ *
+ * \sa fill(), setConstant(Index,const Scalar&), setConstant(Index,Index,const Scalar&), setZero(), setOnes(),
+ * Constant(), class CwiseNullaryOp, setZero(), setOnes()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setConstant(const Scalar& val) {
   return derived() = Constant(rows(), cols(), val);
 }
 
 /** Resizes to the given \a size, and sets all coefficients in this expression to the given value \a val.
-  *
-  * \only_for_vectors
-  *
-  * Example: \include Matrix_setConstant_int.cpp
-  * Output: \verbinclude Matrix_setConstant_int.out
-  *
-  * \sa MatrixBase::setConstant(const Scalar&), setConstant(Index,Index,const Scalar&), class CwiseNullaryOp, MatrixBase::Constant(const Scalar&)
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
-PlainObjectBase<Derived>::setConstant(Index size, const Scalar& val)
-{
+ *
+ * \only_for_vectors
+ *
+ * Example: \include Matrix_setConstant_int.cpp
+ * Output: \verbinclude Matrix_setConstant_int.out
+ *
+ * \sa MatrixBase::setConstant(const Scalar&), setConstant(Index,Index,const Scalar&), class CwiseNullaryOp,
+ * MatrixBase::Constant(const Scalar&)
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& PlainObjectBase<Derived>::setConstant(Index size, const Scalar& val) {
   resize(size);
   return setConstant(val);
 }
 
 /** Resizes to the given size, and sets all coefficients in this expression to the given value \a val.
-  *
-  * \param rows the new number of rows
-  * \param cols the new number of columns
-  * \param val the value to which all coefficients are set
-  *
-  * Example: \include Matrix_setConstant_int_int.cpp
-  * Output: \verbinclude Matrix_setConstant_int_int.out
-  *
-  * \sa MatrixBase::setConstant(const Scalar&), setConstant(Index,const Scalar&), class CwiseNullaryOp, MatrixBase::Constant(const Scalar&)
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
-PlainObjectBase<Derived>::setConstant(Index rows, Index cols, const Scalar& val)
-{
+ *
+ * \param rows the new number of rows
+ * \param cols the new number of columns
+ * \param val the value to which all coefficients are set
+ *
+ * Example: \include Matrix_setConstant_int_int.cpp
+ * Output: \verbinclude Matrix_setConstant_int_int.out
+ *
+ * \sa MatrixBase::setConstant(const Scalar&), setConstant(Index,const Scalar&), class CwiseNullaryOp,
+ * MatrixBase::Constant(const Scalar&)
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& PlainObjectBase<Derived>::setConstant(Index rows, Index cols,
+                                                                                     const Scalar& val) {
   resize(rows, cols);
   return setConstant(val);
 }
 
 /** Resizes to the given size, changing only the number of columns, and sets all
-  * coefficients in this expression to the given value \a val. For the parameter
-  * of type NoChange_t, just pass the special value \c NoChange.
-  *
-  * \sa MatrixBase::setConstant(const Scalar&), setConstant(Index,const Scalar&), class CwiseNullaryOp, MatrixBase::Constant(const Scalar&)
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
-PlainObjectBase<Derived>::setConstant(NoChange_t, Index cols, const Scalar& val)
-{
+ * coefficients in this expression to the given value \a val. For the parameter
+ * of type NoChange_t, just pass the special value \c NoChange.
+ *
+ * \sa MatrixBase::setConstant(const Scalar&), setConstant(Index,const Scalar&), class CwiseNullaryOp,
+ * MatrixBase::Constant(const Scalar&)
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& PlainObjectBase<Derived>::setConstant(NoChange_t, Index cols,
+                                                                                     const Scalar& val) {
   return setConstant(rows(), cols, val);
 }
 
 /** Resizes to the given size, changing only the number of rows, and sets all
-  * coefficients in this expression to the given value \a val. For the parameter
-  * of type NoChange_t, just pass the special value \c NoChange.
-  *
-  * \sa MatrixBase::setConstant(const Scalar&), setConstant(Index,const Scalar&), class CwiseNullaryOp, MatrixBase::Constant(const Scalar&)
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
-PlainObjectBase<Derived>::setConstant(Index rows, NoChange_t, const Scalar& val)
-{
+ * coefficients in this expression to the given value \a val. For the parameter
+ * of type NoChange_t, just pass the special value \c NoChange.
+ *
+ * \sa MatrixBase::setConstant(const Scalar&), setConstant(Index,const Scalar&), class CwiseNullaryOp,
+ * MatrixBase::Constant(const Scalar&)
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& PlainObjectBase<Derived>::setConstant(Index rows, NoChange_t,
+                                                                                     const Scalar& val) {
   return setConstant(rows, cols(), val);
 }
 
-
 /**
-  * \brief Sets a linearly spaced vector.
-  *
-  * The function generates 'size' equally spaced values in the closed interval [low,high].
-  * When size is set to 1, a vector of length 1 containing 'high' is returned.
-  *
-  * \only_for_vectors
-  *
-  * Example: \include DenseBase_setLinSpaced.cpp
-  * Output: \verbinclude DenseBase_setLinSpaced.out
-  *
-  * For integer scalar types, do not miss the explanations on the definition
-  * of \link LinSpaced(Index,const Scalar&,const Scalar&) even spacing \endlink.
-  *
-  * \sa LinSpaced(Index,const Scalar&,const Scalar&), CwiseNullaryOp
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setLinSpaced(Index newSize, const Scalar& low, const Scalar& high)
-{
+ * \brief Sets a linearly spaced vector.
+ *
+ * The function generates 'size' equally spaced values in the closed interval [low,high].
+ * When size is set to 1, a vector of length 1 containing 'high' is returned.
+ *
+ * \only_for_vectors
+ *
+ * Example: \include DenseBase_setLinSpaced.cpp
+ * Output: \verbinclude DenseBase_setLinSpaced.out
+ *
+ * For integer scalar types, do not miss the explanations on the definition
+ * of \link LinSpaced(Index,const Scalar&,const Scalar&) even spacing \endlink.
+ *
+ * \sa LinSpaced(Index,const Scalar&,const Scalar&), CwiseNullaryOp
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setLinSpaced(Index newSize, const Scalar& low,
+                                                                                const Scalar& high) {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
-  return derived() = Derived::NullaryExpr(newSize, internal::linspaced_op<Scalar>(low,high,newSize));
+  return derived() = Derived::NullaryExpr(newSize, internal::linspaced_op<Scalar>(low, high, newSize));
 }
 
 /**
-  * \brief Sets a linearly spaced vector.
-  *
-  * The function fills \c *this with equally spaced values in the closed interval [low,high].
-  * When size is set to 1, a vector of length 1 containing 'high' is returned.
-  *
-  * \only_for_vectors
-  *
-  * For integer scalar types, do not miss the explanations on the definition
-  * of \link LinSpaced(Index,const Scalar&,const Scalar&) even spacing \endlink.
-  *
-  * \sa LinSpaced(Index,const Scalar&,const Scalar&), setLinSpaced(Index, const Scalar&, const Scalar&), CwiseNullaryOp
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setLinSpaced(const Scalar& low, const Scalar& high)
-{
+ * \brief Sets a linearly spaced vector.
+ *
+ * The function fills \c *this with equally spaced values in the closed interval [low,high].
+ * When size is set to 1, a vector of length 1 containing 'high' is returned.
+ *
+ * \only_for_vectors
+ *
+ * For integer scalar types, do not miss the explanations on the definition
+ * of \link LinSpaced(Index,const Scalar&,const Scalar&) even spacing \endlink.
+ *
+ * \sa LinSpaced(Index,const Scalar&,const Scalar&), setLinSpaced(Index, const Scalar&, const Scalar&), CwiseNullaryOp
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setLinSpaced(const Scalar& low, const Scalar& high) {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
   return setLinSpaced(size(), low, high);
 }
@@ -486,379 +465,342 @@
 // zero:
 
 /** \returns an expression of a zero matrix.
-  *
-  * The parameters \a rows and \a cols are the number of rows and of columns of
-  * the returned matrix. Must be compatible with this MatrixBase type.
-  *
-  * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
-  * it is redundant to pass \a rows and \a cols as arguments, so Zero() should be used
-  * instead.
-  *
-  * Example: \include MatrixBase_zero_int_int.cpp
-  * Output: \verbinclude MatrixBase_zero_int_int.out
-  *
-  * \sa Zero(), Zero(Index)
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
-DenseBase<Derived>::Zero(Index rows, Index cols)
-{
+ *
+ * The parameters \a rows and \a cols are the number of rows and of columns of
+ * the returned matrix. Must be compatible with this MatrixBase type.
+ *
+ * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
+ * it is redundant to pass \a rows and \a cols as arguments, so Zero() should be used
+ * instead.
+ *
+ * Example: \include MatrixBase_zero_int_int.cpp
+ * Output: \verbinclude MatrixBase_zero_int_int.out
+ *
+ * \sa Zero(), Zero(Index)
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType DenseBase<Derived>::Zero(
+    Index rows, Index cols) {
   return Constant(rows, cols, Scalar(0));
 }
 
 /** \returns an expression of a zero vector.
-  *
-  * The parameter \a size is the size of the returned vector.
-  * Must be compatible with this MatrixBase type.
-  *
-  * \only_for_vectors
-  *
-  * This variant is meant to be used for dynamic-size vector types. For fixed-size types,
-  * it is redundant to pass \a size as argument, so Zero() should be used
-  * instead.
-  *
-  * Example: \include MatrixBase_zero_int.cpp
-  * Output: \verbinclude MatrixBase_zero_int.out
-  *
-  * \sa Zero(), Zero(Index,Index)
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
-DenseBase<Derived>::Zero(Index size)
-{
+ *
+ * The parameter \a size is the size of the returned vector.
+ * Must be compatible with this MatrixBase type.
+ *
+ * \only_for_vectors
+ *
+ * This variant is meant to be used for dynamic-size vector types. For fixed-size types,
+ * it is redundant to pass \a size as argument, so Zero() should be used
+ * instead.
+ *
+ * Example: \include MatrixBase_zero_int.cpp
+ * Output: \verbinclude MatrixBase_zero_int.out
+ *
+ * \sa Zero(), Zero(Index,Index)
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType DenseBase<Derived>::Zero(
+    Index size) {
   return Constant(size, Scalar(0));
 }
 
 /** \returns an expression of a fixed-size zero matrix or vector.
-  *
-  * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you
-  * need to use the variants taking size arguments.
-  *
-  * Example: \include MatrixBase_zero.cpp
-  * Output: \verbinclude MatrixBase_zero.out
-  *
-  * \sa Zero(Index), Zero(Index,Index)
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
-DenseBase<Derived>::Zero()
-{
+ *
+ * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you
+ * need to use the variants taking size arguments.
+ *
+ * Example: \include MatrixBase_zero.cpp
+ * Output: \verbinclude MatrixBase_zero.out
+ *
+ * \sa Zero(Index), Zero(Index,Index)
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType DenseBase<Derived>::Zero() {
   return Constant(Scalar(0));
 }
 
 /** \returns true if *this is approximately equal to the zero matrix,
-  *          within the precision given by \a prec.
-  *
-  * Example: \include MatrixBase_isZero.cpp
-  * Output: \verbinclude MatrixBase_isZero.out
-  *
-  * \sa class CwiseNullaryOp, Zero()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC bool DenseBase<Derived>::isZero(const RealScalar& prec) const
-{
-  typename internal::nested_eval<Derived,1>::type self(derived());
-  for(Index j = 0; j < cols(); ++j)
-    for(Index i = 0; i < rows(); ++i)
-      if(!internal::isMuchSmallerThan(self.coeff(i, j), static_cast<Scalar>(1), prec))
-        return false;
+ *          within the precision given by \a prec.
+ *
+ * Example: \include MatrixBase_isZero.cpp
+ * Output: \verbinclude MatrixBase_isZero.out
+ *
+ * \sa class CwiseNullaryOp, Zero()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC bool DenseBase<Derived>::isZero(const RealScalar& prec) const {
+  typename internal::nested_eval<Derived, 1>::type self(derived());
+  for (Index j = 0; j < cols(); ++j)
+    for (Index i = 0; i < rows(); ++i)
+      if (!internal::isMuchSmallerThan(self.coeff(i, j), static_cast<Scalar>(1), prec)) return false;
   return true;
 }
 
 /** Sets all coefficients in this expression to zero.
-  *
-  * Example: \include MatrixBase_setZero.cpp
-  * Output: \verbinclude MatrixBase_setZero.out
-  *
-  * \sa class CwiseNullaryOp, Zero()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setZero()
-{
+ *
+ * Example: \include MatrixBase_setZero.cpp
+ * Output: \verbinclude MatrixBase_setZero.out
+ *
+ * \sa class CwiseNullaryOp, Zero()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setZero() {
   return setConstant(Scalar(0));
 }
 
 /** Resizes to the given \a size, and sets all coefficients in this expression to zero.
-  *
-  * \only_for_vectors
-  *
-  * Example: \include Matrix_setZero_int.cpp
-  * Output: \verbinclude Matrix_setZero_int.out
-  *
-  * \sa DenseBase::setZero(), setZero(Index,Index), class CwiseNullaryOp, DenseBase::Zero()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
-PlainObjectBase<Derived>::setZero(Index newSize)
-{
+ *
+ * \only_for_vectors
+ *
+ * Example: \include Matrix_setZero_int.cpp
+ * Output: \verbinclude Matrix_setZero_int.out
+ *
+ * \sa DenseBase::setZero(), setZero(Index,Index), class CwiseNullaryOp, DenseBase::Zero()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& PlainObjectBase<Derived>::setZero(Index newSize) {
   resize(newSize);
   return setConstant(Scalar(0));
 }
 
 /** Resizes to the given size, and sets all coefficients in this expression to zero.
-  *
-  * \param rows the new number of rows
-  * \param cols the new number of columns
-  *
-  * Example: \include Matrix_setZero_int_int.cpp
-  * Output: \verbinclude Matrix_setZero_int_int.out
-  *
-  * \sa DenseBase::setZero(), setZero(Index), class CwiseNullaryOp, DenseBase::Zero()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
-PlainObjectBase<Derived>::setZero(Index rows, Index cols)
-{
+ *
+ * \param rows the new number of rows
+ * \param cols the new number of columns
+ *
+ * Example: \include Matrix_setZero_int_int.cpp
+ * Output: \verbinclude Matrix_setZero_int_int.out
+ *
+ * \sa DenseBase::setZero(), setZero(Index), class CwiseNullaryOp, DenseBase::Zero()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& PlainObjectBase<Derived>::setZero(Index rows, Index cols) {
   resize(rows, cols);
   return setConstant(Scalar(0));
 }
 
 /** Resizes to the given size, changing only the number of columns, and sets all
-  * coefficients in this expression to zero. For the parameter of type NoChange_t,
-  * just pass the special value \c NoChange.
-  *
-  * \sa DenseBase::setZero(), setZero(Index), setZero(Index, Index), setZero(Index, NoChange_t), class CwiseNullaryOp, DenseBase::Zero()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
-PlainObjectBase<Derived>::setZero(NoChange_t, Index cols)
-{
+ * coefficients in this expression to zero. For the parameter of type NoChange_t,
+ * just pass the special value \c NoChange.
+ *
+ * \sa DenseBase::setZero(), setZero(Index), setZero(Index, Index), setZero(Index, NoChange_t), class CwiseNullaryOp,
+ * DenseBase::Zero()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& PlainObjectBase<Derived>::setZero(NoChange_t, Index cols) {
   return setZero(rows(), cols);
 }
 
 /** Resizes to the given size, changing only the number of rows, and sets all
-  * coefficients in this expression to zero. For the parameter of type NoChange_t,
-  * just pass the special value \c NoChange.
-  *
-  * \sa DenseBase::setZero(), setZero(Index), setZero(Index, Index), setZero(NoChange_t, Index), class CwiseNullaryOp, DenseBase::Zero()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
-PlainObjectBase<Derived>::setZero(Index rows, NoChange_t)
-{
+ * coefficients in this expression to zero. For the parameter of type NoChange_t,
+ * just pass the special value \c NoChange.
+ *
+ * \sa DenseBase::setZero(), setZero(Index), setZero(Index, Index), setZero(NoChange_t, Index), class CwiseNullaryOp,
+ * DenseBase::Zero()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& PlainObjectBase<Derived>::setZero(Index rows, NoChange_t) {
   return setZero(rows, cols());
 }
 
 // ones:
 
 /** \returns an expression of a matrix where all coefficients equal one.
-  *
-  * The parameters \a rows and \a cols are the number of rows and of columns of
-  * the returned matrix. Must be compatible with this MatrixBase type.
-  *
-  * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
-  * it is redundant to pass \a rows and \a cols as arguments, so Ones() should be used
-  * instead.
-  *
-  * Example: \include MatrixBase_ones_int_int.cpp
-  * Output: \verbinclude MatrixBase_ones_int_int.out
-  *
-  * \sa Ones(), Ones(Index), isOnes(), class Ones
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
-DenseBase<Derived>::Ones(Index rows, Index cols)
-{
+ *
+ * The parameters \a rows and \a cols are the number of rows and of columns of
+ * the returned matrix. Must be compatible with this MatrixBase type.
+ *
+ * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
+ * it is redundant to pass \a rows and \a cols as arguments, so Ones() should be used
+ * instead.
+ *
+ * Example: \include MatrixBase_ones_int_int.cpp
+ * Output: \verbinclude MatrixBase_ones_int_int.out
+ *
+ * \sa Ones(), Ones(Index), isOnes(), class Ones
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType DenseBase<Derived>::Ones(
+    Index rows, Index cols) {
   return Constant(rows, cols, Scalar(1));
 }
 
 /** \returns an expression of a vector where all coefficients equal one.
-  *
-  * The parameter \a newSize is the size of the returned vector.
-  * Must be compatible with this MatrixBase type.
-  *
-  * \only_for_vectors
-  *
-  * This variant is meant to be used for dynamic-size vector types. For fixed-size types,
-  * it is redundant to pass \a size as argument, so Ones() should be used
-  * instead.
-  *
-  * Example: \include MatrixBase_ones_int.cpp
-  * Output: \verbinclude MatrixBase_ones_int.out
-  *
-  * \sa Ones(), Ones(Index,Index), isOnes(), class Ones
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
-DenseBase<Derived>::Ones(Index newSize)
-{
+ *
+ * The parameter \a newSize is the size of the returned vector.
+ * Must be compatible with this MatrixBase type.
+ *
+ * \only_for_vectors
+ *
+ * This variant is meant to be used for dynamic-size vector types. For fixed-size types,
+ * it is redundant to pass \a size as argument, so Ones() should be used
+ * instead.
+ *
+ * Example: \include MatrixBase_ones_int.cpp
+ * Output: \verbinclude MatrixBase_ones_int.out
+ *
+ * \sa Ones(), Ones(Index,Index), isOnes(), class Ones
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType DenseBase<Derived>::Ones(
+    Index newSize) {
   return Constant(newSize, Scalar(1));
 }
 
 /** \returns an expression of a fixed-size matrix or vector where all coefficients equal one.
-  *
-  * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you
-  * need to use the variants taking size arguments.
-  *
-  * Example: \include MatrixBase_ones.cpp
-  * Output: \verbinclude MatrixBase_ones.out
-  *
-  * \sa Ones(Index), Ones(Index,Index), isOnes(), class Ones
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
-DenseBase<Derived>::Ones()
-{
+ *
+ * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you
+ * need to use the variants taking size arguments.
+ *
+ * Example: \include MatrixBase_ones.cpp
+ * Output: \verbinclude MatrixBase_ones.out
+ *
+ * \sa Ones(Index), Ones(Index,Index), isOnes(), class Ones
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType DenseBase<Derived>::Ones() {
   return Constant(Scalar(1));
 }
 
 /** \returns true if *this is approximately equal to the matrix where all coefficients
-  *          are equal to 1, within the precision given by \a prec.
-  *
-  * Example: \include MatrixBase_isOnes.cpp
-  * Output: \verbinclude MatrixBase_isOnes.out
-  *
-  * \sa class CwiseNullaryOp, Ones()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC bool DenseBase<Derived>::isOnes
-(const RealScalar& prec) const
-{
+ *          are equal to 1, within the precision given by \a prec.
+ *
+ * Example: \include MatrixBase_isOnes.cpp
+ * Output: \verbinclude MatrixBase_isOnes.out
+ *
+ * \sa class CwiseNullaryOp, Ones()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC bool DenseBase<Derived>::isOnes(const RealScalar& prec) const {
   return isApproxToConstant(Scalar(1), prec);
 }
 
 /** Sets all coefficients in this expression to one.
-  *
-  * Example: \include MatrixBase_setOnes.cpp
-  * Output: \verbinclude MatrixBase_setOnes.out
-  *
-  * \sa class CwiseNullaryOp, Ones()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setOnes()
-{
+ *
+ * Example: \include MatrixBase_setOnes.cpp
+ * Output: \verbinclude MatrixBase_setOnes.out
+ *
+ * \sa class CwiseNullaryOp, Ones()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setOnes() {
   return setConstant(Scalar(1));
 }
 
 /** Resizes to the given \a newSize, and sets all coefficients in this expression to one.
-  *
-  * \only_for_vectors
-  *
-  * Example: \include Matrix_setOnes_int.cpp
-  * Output: \verbinclude Matrix_setOnes_int.out
-  *
-  * \sa MatrixBase::setOnes(), setOnes(Index,Index), class CwiseNullaryOp, MatrixBase::Ones()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
-PlainObjectBase<Derived>::setOnes(Index newSize)
-{
+ *
+ * \only_for_vectors
+ *
+ * Example: \include Matrix_setOnes_int.cpp
+ * Output: \verbinclude Matrix_setOnes_int.out
+ *
+ * \sa MatrixBase::setOnes(), setOnes(Index,Index), class CwiseNullaryOp, MatrixBase::Ones()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& PlainObjectBase<Derived>::setOnes(Index newSize) {
   resize(newSize);
   return setConstant(Scalar(1));
 }
 
 /** Resizes to the given size, and sets all coefficients in this expression to one.
-  *
-  * \param rows the new number of rows
-  * \param cols the new number of columns
-  *
-  * Example: \include Matrix_setOnes_int_int.cpp
-  * Output: \verbinclude Matrix_setOnes_int_int.out
-  *
-  * \sa MatrixBase::setOnes(), setOnes(Index), class CwiseNullaryOp, MatrixBase::Ones()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
-PlainObjectBase<Derived>::setOnes(Index rows, Index cols)
-{
+ *
+ * \param rows the new number of rows
+ * \param cols the new number of columns
+ *
+ * Example: \include Matrix_setOnes_int_int.cpp
+ * Output: \verbinclude Matrix_setOnes_int_int.out
+ *
+ * \sa MatrixBase::setOnes(), setOnes(Index), class CwiseNullaryOp, MatrixBase::Ones()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& PlainObjectBase<Derived>::setOnes(Index rows, Index cols) {
   resize(rows, cols);
   return setConstant(Scalar(1));
 }
 
 /** Resizes to the given size, changing only the number of rows, and sets all
-  * coefficients in this expression to one. For the parameter of type NoChange_t,
-  * just pass the special value \c NoChange.
-  *
- * \sa MatrixBase::setOnes(), setOnes(Index), setOnes(Index, Index), setOnes(NoChange_t, Index), class CwiseNullaryOp, MatrixBase::Ones()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
-PlainObjectBase<Derived>::setOnes(Index rows, NoChange_t)
-{
+ * coefficients in this expression to one. For the parameter of type NoChange_t,
+ * just pass the special value \c NoChange.
+ *
+ * \sa MatrixBase::setOnes(), setOnes(Index), setOnes(Index, Index), setOnes(NoChange_t, Index), class CwiseNullaryOp,
+ * MatrixBase::Ones()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& PlainObjectBase<Derived>::setOnes(Index rows, NoChange_t) {
   return setOnes(rows, cols());
 }
 
 /** Resizes to the given size, changing only the number of columns, and sets all
-  * coefficients in this expression to one. For the parameter of type NoChange_t,
-  * just pass the special value \c NoChange.
-  *
- * \sa MatrixBase::setOnes(), setOnes(Index), setOnes(Index, Index), setOnes(Index, NoChange_t) class CwiseNullaryOp, MatrixBase::Ones()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
-PlainObjectBase<Derived>::setOnes(NoChange_t, Index cols)
-{
+ * coefficients in this expression to one. For the parameter of type NoChange_t,
+ * just pass the special value \c NoChange.
+ *
+ * \sa MatrixBase::setOnes(), setOnes(Index), setOnes(Index, Index), setOnes(Index, NoChange_t) class CwiseNullaryOp,
+ * MatrixBase::Ones()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& PlainObjectBase<Derived>::setOnes(NoChange_t, Index cols) {
   return setOnes(rows(), cols);
 }
 
 // Identity:
 
 /** \returns an expression of the identity matrix (not necessarily square).
-  *
-  * The parameters \a rows and \a cols are the number of rows and of columns of
-  * the returned matrix. Must be compatible with this MatrixBase type.
-  *
-  * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
-  * it is redundant to pass \a rows and \a cols as arguments, so Identity() should be used
-  * instead.
-  *
-  * Example: \include MatrixBase_identity_int_int.cpp
-  * Output: \verbinclude MatrixBase_identity_int_int.out
-  *
-  * \sa Identity(), setIdentity(), isIdentity()
-  */
-template<typename Derived>
+ *
+ * The parameters \a rows and \a cols are the number of rows and of columns of
+ * the returned matrix. Must be compatible with this MatrixBase type.
+ *
+ * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
+ * it is redundant to pass \a rows and \a cols as arguments, so Identity() should be used
+ * instead.
+ *
+ * Example: \include MatrixBase_identity_int_int.cpp
+ * Output: \verbinclude MatrixBase_identity_int_int.out
+ *
+ * \sa Identity(), setIdentity(), isIdentity()
+ */
+template <typename Derived>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::IdentityReturnType
-MatrixBase<Derived>::Identity(Index rows, Index cols)
-{
+MatrixBase<Derived>::Identity(Index rows, Index cols) {
   return DenseBase<Derived>::NullaryExpr(rows, cols, internal::scalar_identity_op<Scalar>());
 }
 
 /** \returns an expression of the identity matrix (not necessarily square).
-  *
-  * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you
-  * need to use the variant taking size arguments.
-  *
-  * Example: \include MatrixBase_identity.cpp
-  * Output: \verbinclude MatrixBase_identity.out
-  *
-  * \sa Identity(Index,Index), setIdentity(), isIdentity()
-  */
-template<typename Derived>
+ *
+ * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you
+ * need to use the variant taking size arguments.
+ *
+ * Example: \include MatrixBase_identity.cpp
+ * Output: \verbinclude MatrixBase_identity.out
+ *
+ * \sa Identity(Index,Index), setIdentity(), isIdentity()
+ */
+template <typename Derived>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::IdentityReturnType
-MatrixBase<Derived>::Identity()
-{
+MatrixBase<Derived>::Identity() {
   EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
   return MatrixBase<Derived>::NullaryExpr(RowsAtCompileTime, ColsAtCompileTime, internal::scalar_identity_op<Scalar>());
 }
 
 /** \returns true if *this is approximately equal to the identity matrix
-  *          (not necessarily square),
-  *          within the precision given by \a prec.
-  *
-  * Example: \include MatrixBase_isIdentity.cpp
-  * Output: \verbinclude MatrixBase_isIdentity.out
-  *
-  * \sa class CwiseNullaryOp, Identity(), Identity(Index,Index), setIdentity()
-  */
-template<typename Derived>
-bool MatrixBase<Derived>::isIdentity
-(const RealScalar& prec) const
-{
-  typename internal::nested_eval<Derived,1>::type self(derived());
-  for(Index j = 0; j < cols(); ++j)
-  {
-    for(Index i = 0; i < rows(); ++i)
-    {
-      if(i == j)
-      {
-        if(!internal::isApprox(self.coeff(i, j), static_cast<Scalar>(1), prec))
-          return false;
-      }
-      else
-      {
-        if(!internal::isMuchSmallerThan(self.coeff(i, j), static_cast<RealScalar>(1), prec))
-          return false;
+ *          (not necessarily square),
+ *          within the precision given by \a prec.
+ *
+ * Example: \include MatrixBase_isIdentity.cpp
+ * Output: \verbinclude MatrixBase_isIdentity.out
+ *
+ * \sa class CwiseNullaryOp, Identity(), Identity(Index,Index), setIdentity()
+ */
+template <typename Derived>
+bool MatrixBase<Derived>::isIdentity(const RealScalar& prec) const {
+  typename internal::nested_eval<Derived, 1>::type self(derived());
+  for (Index j = 0; j < cols(); ++j) {
+    for (Index i = 0; i < rows(); ++i) {
+      if (i == j) {
+        if (!internal::isApprox(self.coeff(i, j), static_cast<Scalar>(1), prec)) return false;
+      } else {
+        if (!internal::isMuchSmallerThan(self.coeff(i, j), static_cast<RealScalar>(1), prec)) return false;
       }
     }
   }
@@ -867,165 +809,163 @@
 
 namespace internal {
 
-template<typename Derived, bool Big = (Derived::SizeAtCompileTime>=16)>
-struct setIdentity_impl
-{
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE Derived& run(Derived& m)
-  {
+template <typename Derived, bool Big = (Derived::SizeAtCompileTime >= 16)>
+struct setIdentity_impl {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Derived& run(Derived& m) {
     return m = Derived::Identity(m.rows(), m.cols());
   }
 };
 
-template<typename Derived>
-struct setIdentity_impl<Derived, true>
-{
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE Derived& run(Derived& m)
-  {
+template <typename Derived>
+struct setIdentity_impl<Derived, true> {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Derived& run(Derived& m) {
     m.setZero();
     const Index size = numext::mini(m.rows(), m.cols());
-    for(Index i = 0; i < size; ++i) m.coeffRef(i,i) = typename Derived::Scalar(1);
+    for (Index i = 0; i < size; ++i) m.coeffRef(i, i) = typename Derived::Scalar(1);
     return m;
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** Writes the identity expression (not necessarily square) into *this.
-  *
-  * Example: \include MatrixBase_setIdentity.cpp
-  * Output: \verbinclude MatrixBase_setIdentity.out
-  *
-  * \sa class CwiseNullaryOp, Identity(), Identity(Index,Index), isIdentity()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::setIdentity()
-{
+ *
+ * Example: \include MatrixBase_setIdentity.cpp
+ * Output: \verbinclude MatrixBase_setIdentity.out
+ *
+ * \sa class CwiseNullaryOp, Identity(), Identity(Index,Index), isIdentity()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::setIdentity() {
   return internal::setIdentity_impl<Derived>::run(derived());
 }
 
 /** \brief Resizes to the given size, and writes the identity expression (not necessarily square) into *this.
-  *
-  * \param rows the new number of rows
-  * \param cols the new number of columns
-  *
-  * Example: \include Matrix_setIdentity_int_int.cpp
-  * Output: \verbinclude Matrix_setIdentity_int_int.out
-  *
-  * \sa MatrixBase::setIdentity(), class CwiseNullaryOp, MatrixBase::Identity()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::setIdentity(Index rows, Index cols)
-{
+ *
+ * \param rows the new number of rows
+ * \param cols the new number of columns
+ *
+ * Example: \include Matrix_setIdentity_int_int.cpp
+ * Output: \verbinclude Matrix_setIdentity_int_int.out
+ *
+ * \sa MatrixBase::setIdentity(), class CwiseNullaryOp, MatrixBase::Identity()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::setIdentity(Index rows, Index cols) {
   derived().resize(rows, cols);
   return setIdentity();
 }
 
 /** \returns an expression of the i-th unit (basis) vector.
-  *
-  * \only_for_vectors
-  *
-  * \sa MatrixBase::Unit(Index), MatrixBase::UnitX(), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::Unit(Index newSize, Index i)
-{
+ *
+ * \only_for_vectors
+ *
+ * \sa MatrixBase::Unit(Index), MatrixBase::UnitX(), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::Unit(
+    Index newSize, Index i) {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
-  return BasisReturnType(SquareMatrixType::Identity(newSize,newSize), i);
+  return BasisReturnType(SquareMatrixType::Identity(newSize, newSize), i);
 }
 
 /** \returns an expression of the i-th unit (basis) vector.
-  *
-  * \only_for_vectors
-  *
-  * This variant is for fixed-size vector only.
-  *
-  * \sa MatrixBase::Unit(Index,Index), MatrixBase::UnitX(), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::Unit(Index i)
-{
+ *
+ * \only_for_vectors
+ *
+ * This variant is for fixed-size vector only.
+ *
+ * \sa MatrixBase::Unit(Index,Index), MatrixBase::UnitX(), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::Unit(
+    Index i) {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
-  return BasisReturnType(SquareMatrixType::Identity(),i);
+  return BasisReturnType(SquareMatrixType::Identity(), i);
 }
 
 /** \returns an expression of the X axis unit vector (1{,0}^*)
-  *
-  * \only_for_vectors
-  *
-  * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitX()
-{ return Derived::Unit(0); }
+ *
+ * \only_for_vectors
+ *
+ * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(),
+ * MatrixBase::UnitW()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitX() {
+  return Derived::Unit(0);
+}
 
 /** \returns an expression of the Y axis unit vector (0,1{,0}^*)
-  *
-  * \only_for_vectors
-  *
-  * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitY()
-{ return Derived::Unit(1); }
+ *
+ * \only_for_vectors
+ *
+ * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(),
+ * MatrixBase::UnitW()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitY() {
+  return Derived::Unit(1);
+}
 
 /** \returns an expression of the Z axis unit vector (0,0,1{,0}^*)
-  *
-  * \only_for_vectors
-  *
-  * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitZ()
-{ return Derived::Unit(2); }
+ *
+ * \only_for_vectors
+ *
+ * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(),
+ * MatrixBase::UnitW()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitZ() {
+  return Derived::Unit(2);
+}
 
 /** \returns an expression of the W axis unit vector (0,0,0,1)
-  *
-  * \only_for_vectors
-  *
-  * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitW()
-{ return Derived::Unit(3); }
+ *
+ * \only_for_vectors
+ *
+ * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(),
+ * MatrixBase::UnitW()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitW() {
+  return Derived::Unit(3);
+}
 
 /** \brief Set the coefficients of \c *this to the i-th unit (basis) vector
-  *
-  * \param i index of the unique coefficient to be set to 1
-  *
-  * \only_for_vectors
-  *
-  * \sa MatrixBase::setIdentity(), class CwiseNullaryOp, MatrixBase::Unit(Index,Index)
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::setUnit(Index i)
-{
+ *
+ * \param i index of the unique coefficient to be set to 1
+ *
+ * \only_for_vectors
+ *
+ * \sa MatrixBase::setIdentity(), class CwiseNullaryOp, MatrixBase::Unit(Index,Index)
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::setUnit(Index i) {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
-  eigen_assert(i<size());
+  eigen_assert(i < size());
   derived().setZero();
   derived().coeffRef(i) = Scalar(1);
   return derived();
 }
 
 /** \brief Resizes to the given \a newSize, and writes the i-th unit (basis) vector into *this.
-  *
-  * \param newSize the new size of the vector
-  * \param i index of the unique coefficient to be set to 1
-  *
-  * \only_for_vectors
-  *
-  * \sa MatrixBase::setIdentity(), class CwiseNullaryOp, MatrixBase::Unit(Index,Index)
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::setUnit(Index newSize, Index i)
-{
+ *
+ * \param newSize the new size of the vector
+ * \param i index of the unique coefficient to be set to 1
+ *
+ * \only_for_vectors
+ *
+ * \sa MatrixBase::setIdentity(), class CwiseNullaryOp, MatrixBase::Unit(Index,Index)
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::setUnit(Index newSize, Index i) {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
-  eigen_assert(i<newSize);
+  eigen_assert(i < newSize);
   derived().resize(newSize);
   return setUnit(i);
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_CWISE_NULLARY_OP_H
+#endif  // EIGEN_CWISE_NULLARY_OP_H
diff --git a/Eigen/src/Core/CwiseTernaryOp.h b/Eigen/src/Core/CwiseTernaryOp.h
index d8d912f..9bb0d40 100644
--- a/Eigen/src/Core/CwiseTernaryOp.h
+++ b/Eigen/src/Core/CwiseTernaryOp.h
@@ -19,7 +19,7 @@
 
 namespace internal {
 template <typename TernaryOp, typename Arg1, typename Arg2, typename Arg3>
-struct traits<CwiseTernaryOp<TernaryOp, Arg1, Arg2, Arg3> > {
+struct traits<CwiseTernaryOp<TernaryOp, Arg1, Arg2, Arg3>> {
   // we must not inherit from traits<Arg1> since it has
   // the potential to cause problems with MSVC
   typedef remove_all_t<Arg1> Ancestor;
@@ -34,9 +34,8 @@
   // even though we require Arg1, Arg2, and Arg3 to have the same scalar type
   // (see CwiseTernaryOp constructor),
   // we still want to handle the case when the result type is different.
-  typedef typename result_of<TernaryOp(
-      const typename Arg1::Scalar&, const typename Arg2::Scalar&,
-      const typename Arg3::Scalar&)>::type Scalar;
+  typedef typename result_of<TernaryOp(const typename Arg1::Scalar&, const typename Arg2::Scalar&,
+                                       const typename Arg3::Scalar&)>::type Scalar;
 
   typedef typename internal::traits<Arg1>::StorageKind StorageKind;
   typedef typename internal::traits<Arg1>::StorageIndex StorageIndex;
@@ -51,44 +50,40 @@
 };
 }  // end namespace internal
 
-template <typename TernaryOp, typename Arg1, typename Arg2, typename Arg3,
-          typename StorageKind>
+template <typename TernaryOp, typename Arg1, typename Arg2, typename Arg3, typename StorageKind>
 class CwiseTernaryOpImpl;
 
 /** \class CwiseTernaryOp
-  * \ingroup Core_Module
-  *
-  * \brief Generic expression where a coefficient-wise ternary operator is
+ * \ingroup Core_Module
+ *
+ * \brief Generic expression where a coefficient-wise ternary operator is
  * applied to two expressions
-  *
-  * \tparam TernaryOp template functor implementing the operator
-  * \tparam Arg1Type the type of the first argument
-  * \tparam Arg2Type the type of the second argument
-  * \tparam Arg3Type the type of the third argument
-  *
-  * This class represents an expression where a coefficient-wise ternary
+ *
+ * \tparam TernaryOp template functor implementing the operator
+ * \tparam Arg1Type the type of the first argument
+ * \tparam Arg2Type the type of the second argument
+ * \tparam Arg3Type the type of the third argument
+ *
+ * This class represents an expression where a coefficient-wise ternary
  * operator is applied to three expressions.
-  * It is the return type of ternary operators, by which we mean only those
+ * It is the return type of ternary operators, by which we mean only those
  * ternary operators where
-  * all three arguments are Eigen expressions.
-  * For example, the return type of betainc(matrix1, matrix2, matrix3) is a
+ * all three arguments are Eigen expressions.
+ * For example, the return type of betainc(matrix1, matrix2, matrix3) is a
  * CwiseTernaryOp.
-  *
-  * Most of the time, this is the only way that it is used, so you typically
+ *
+ * Most of the time, this is the only way that it is used, so you typically
  * don't have to name
-  * CwiseTernaryOp types explicitly.
-  *
-  * \sa MatrixBase::ternaryExpr(const MatrixBase<Argument2> &, const
+ * CwiseTernaryOp types explicitly.
+ *
+ * \sa MatrixBase::ternaryExpr(const MatrixBase<Argument2> &, const
  * MatrixBase<Argument3> &, const CustomTernaryOp &) const, class CwiseBinaryOp,
  * class CwiseUnaryOp, class CwiseNullaryOp
-  */
-template <typename TernaryOp, typename Arg1Type, typename Arg2Type,
-          typename Arg3Type>
-class CwiseTernaryOp : public CwiseTernaryOpImpl<
-                           TernaryOp, Arg1Type, Arg2Type, Arg3Type,
-                           typename internal::traits<Arg1Type>::StorageKind>,
-                       internal::no_assignment_operator
-{
+ */
+template <typename TernaryOp, typename Arg1Type, typename Arg2Type, typename Arg3Type>
+class CwiseTernaryOp : public CwiseTernaryOpImpl<TernaryOp, Arg1Type, Arg2Type, Arg3Type,
+                                                 typename internal::traits<Arg1Type>::StorageKind>,
+                       internal::no_assignment_operator {
  public:
   typedef internal::remove_all_t<Arg1Type> Arg1;
   typedef internal::remove_all_t<Arg2Type> Arg2;
@@ -99,18 +94,15 @@
   EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Arg1, Arg3)
 
   // The index types should match
-  EIGEN_STATIC_ASSERT((internal::is_same<
-                       typename internal::traits<Arg1Type>::StorageKind,
-                       typename internal::traits<Arg2Type>::StorageKind>::value),
+  EIGEN_STATIC_ASSERT((internal::is_same<typename internal::traits<Arg1Type>::StorageKind,
+                                         typename internal::traits<Arg2Type>::StorageKind>::value),
                       STORAGE_KIND_MUST_MATCH)
-  EIGEN_STATIC_ASSERT((internal::is_same<
-                       typename internal::traits<Arg1Type>::StorageKind,
-                       typename internal::traits<Arg3Type>::StorageKind>::value),
+  EIGEN_STATIC_ASSERT((internal::is_same<typename internal::traits<Arg1Type>::StorageKind,
+                                         typename internal::traits<Arg3Type>::StorageKind>::value),
                       STORAGE_KIND_MUST_MATCH)
 
-  typedef typename CwiseTernaryOpImpl<
-      TernaryOp, Arg1Type, Arg2Type, Arg3Type,
-      typename internal::traits<Arg1Type>::StorageKind>::Base Base;
+  typedef typename CwiseTernaryOpImpl<TernaryOp, Arg1Type, Arg2Type, Arg3Type,
+                                      typename internal::traits<Arg1Type>::StorageKind>::Base Base;
   EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseTernaryOp)
 
   typedef typename internal::ref_selector<Arg1Type>::type Arg1Nested;
@@ -120,62 +112,45 @@
   typedef std::remove_reference_t<Arg2Nested> Arg2Nested_;
   typedef std::remove_reference_t<Arg3Nested> Arg3Nested_;
 
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE CwiseTernaryOp(const Arg1& a1, const Arg2& a2,
-                                     const Arg3& a3,
-                                     const TernaryOp& func = TernaryOp())
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CwiseTernaryOp(const Arg1& a1, const Arg2& a2, const Arg3& a3,
+                                                       const TernaryOp& func = TernaryOp())
       : m_arg1(a1), m_arg2(a2), m_arg3(a3), m_functor(func) {
-    eigen_assert(a1.rows() == a2.rows() && a1.cols() == a2.cols() &&
-                 a1.rows() == a3.rows() && a1.cols() == a3.cols());
+    eigen_assert(a1.rows() == a2.rows() && a1.cols() == a2.cols() && a1.rows() == a3.rows() && a1.cols() == a3.cols());
   }
 
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE Index rows() const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index rows() const {
     // return the fixed size type if available to enable compile time
     // optimizations
-    if (internal::traits<internal::remove_all_t<Arg1Nested>>::
-                RowsAtCompileTime == Dynamic &&
-        internal::traits<internal::remove_all_t<Arg2Nested>>::
-                RowsAtCompileTime == Dynamic)
+    if (internal::traits<internal::remove_all_t<Arg1Nested>>::RowsAtCompileTime == Dynamic &&
+        internal::traits<internal::remove_all_t<Arg2Nested>>::RowsAtCompileTime == Dynamic)
       return m_arg3.rows();
-    else if (internal::traits<internal::remove_all_t<Arg1Nested>>::
-                     RowsAtCompileTime == Dynamic &&
-             internal::traits<internal::remove_all_t<Arg3Nested>>::
-                     RowsAtCompileTime == Dynamic)
+    else if (internal::traits<internal::remove_all_t<Arg1Nested>>::RowsAtCompileTime == Dynamic &&
+             internal::traits<internal::remove_all_t<Arg3Nested>>::RowsAtCompileTime == Dynamic)
       return m_arg2.rows();
     else
       return m_arg1.rows();
   }
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE Index cols() const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index cols() const {
     // return the fixed size type if available to enable compile time
     // optimizations
-    if (internal::traits<internal::remove_all_t<Arg1Nested>>::
-                ColsAtCompileTime == Dynamic &&
-        internal::traits<internal::remove_all_t<Arg2Nested>>::
-                ColsAtCompileTime == Dynamic)
+    if (internal::traits<internal::remove_all_t<Arg1Nested>>::ColsAtCompileTime == Dynamic &&
+        internal::traits<internal::remove_all_t<Arg2Nested>>::ColsAtCompileTime == Dynamic)
       return m_arg3.cols();
-    else if (internal::traits<internal::remove_all_t<Arg1Nested>>::
-                     ColsAtCompileTime == Dynamic &&
-             internal::traits<internal::remove_all_t<Arg3Nested>>::
-                     ColsAtCompileTime == Dynamic)
+    else if (internal::traits<internal::remove_all_t<Arg1Nested>>::ColsAtCompileTime == Dynamic &&
+             internal::traits<internal::remove_all_t<Arg3Nested>>::ColsAtCompileTime == Dynamic)
       return m_arg2.cols();
     else
       return m_arg1.cols();
   }
 
   /** \returns the first argument nested expression */
-  EIGEN_DEVICE_FUNC
-  const Arg1Nested_& arg1() const { return m_arg1; }
+  EIGEN_DEVICE_FUNC const Arg1Nested_& arg1() const { return m_arg1; }
   /** \returns the first argument nested expression */
-  EIGEN_DEVICE_FUNC
-  const Arg2Nested_& arg2() const { return m_arg2; }
+  EIGEN_DEVICE_FUNC const Arg2Nested_& arg2() const { return m_arg2; }
   /** \returns the third argument nested expression */
-  EIGEN_DEVICE_FUNC
-  const Arg3Nested_& arg3() const { return m_arg3; }
+  EIGEN_DEVICE_FUNC const Arg3Nested_& arg3() const { return m_arg3; }
   /** \returns the functor representing the ternary operation */
-  EIGEN_DEVICE_FUNC
-  const TernaryOp& functor() const { return m_functor; }
+  EIGEN_DEVICE_FUNC const TernaryOp& functor() const { return m_functor; }
 
  protected:
   Arg1Nested m_arg1;
@@ -185,14 +160,10 @@
 };
 
 // Generic API dispatcher
-template <typename TernaryOp, typename Arg1, typename Arg2, typename Arg3,
-          typename StorageKind>
-class CwiseTernaryOpImpl
-    : public internal::generic_xpr_base<
-          CwiseTernaryOp<TernaryOp, Arg1, Arg2, Arg3> >::type {
+template <typename TernaryOp, typename Arg1, typename Arg2, typename Arg3, typename StorageKind>
+class CwiseTernaryOpImpl : public internal::generic_xpr_base<CwiseTernaryOp<TernaryOp, Arg1, Arg2, Arg3>>::type {
  public:
-  typedef typename internal::generic_xpr_base<
-      CwiseTernaryOp<TernaryOp, Arg1, Arg2, Arg3> >::type Base;
+  typedef typename internal::generic_xpr_base<CwiseTernaryOp<TernaryOp, Arg1, Arg2, Arg3>>::type Base;
 };
 
 }  // end namespace Eigen
diff --git a/Eigen/src/Core/CwiseUnaryOp.h b/Eigen/src/Core/CwiseUnaryOp.h
index ec3b2e4..42ed459 100644
--- a/Eigen/src/Core/CwiseUnaryOp.h
+++ b/Eigen/src/Core/CwiseUnaryOp.h
@@ -17,90 +17,75 @@
 namespace Eigen {
 
 namespace internal {
-template<typename UnaryOp, typename XprType>
-struct traits<CwiseUnaryOp<UnaryOp, XprType> >
- : traits<XprType>
-{
-  typedef typename result_of<
-                     UnaryOp(const typename XprType::Scalar&)
-                   >::type Scalar;
+template <typename UnaryOp, typename XprType>
+struct traits<CwiseUnaryOp<UnaryOp, XprType> > : traits<XprType> {
+  typedef typename result_of<UnaryOp(const typename XprType::Scalar&)>::type Scalar;
   typedef typename XprType::Nested XprTypeNested;
   typedef std::remove_reference_t<XprTypeNested> XprTypeNested_;
-  enum {
-    Flags = XprTypeNested_::Flags & RowMajorBit
-  };
+  enum { Flags = XprTypeNested_::Flags & RowMajorBit };
 };
-}
+}  // namespace internal
 
-template<typename UnaryOp, typename XprType, typename StorageKind>
+template <typename UnaryOp, typename XprType, typename StorageKind>
 class CwiseUnaryOpImpl;
 
 /** \class CwiseUnaryOp
-  * \ingroup Core_Module
-  *
-  * \brief Generic expression where a coefficient-wise unary operator is applied to an expression
-  *
-  * \tparam UnaryOp template functor implementing the operator
-  * \tparam XprType the type of the expression to which we are applying the unary operator
-  *
-  * This class represents an expression where a unary operator is applied to an expression.
-  * It is the return type of all operations taking exactly 1 input expression, regardless of the
-  * presence of other inputs such as scalars. For example, the operator* in the expression 3*matrix
-  * is considered unary, because only the right-hand side is an expression, and its
-  * return type is a specialization of CwiseUnaryOp.
-  *
-  * Most of the time, this is the only way that it is used, so you typically don't have to name
-  * CwiseUnaryOp types explicitly.
-  *
-  * \sa MatrixBase::unaryExpr(const CustomUnaryOp &) const, class CwiseBinaryOp, class CwiseNullaryOp
-  */
-template<typename UnaryOp, typename XprType>
-class CwiseUnaryOp : public CwiseUnaryOpImpl<UnaryOp, XprType, typename internal::traits<XprType>::StorageKind>, internal::no_assignment_operator
-{
-  public:
+ * \ingroup Core_Module
+ *
+ * \brief Generic expression where a coefficient-wise unary operator is applied to an expression
+ *
+ * \tparam UnaryOp template functor implementing the operator
+ * \tparam XprType the type of the expression to which we are applying the unary operator
+ *
+ * This class represents an expression where a unary operator is applied to an expression.
+ * It is the return type of all operations taking exactly 1 input expression, regardless of the
+ * presence of other inputs such as scalars. For example, the operator* in the expression 3*matrix
+ * is considered unary, because only the right-hand side is an expression, and its
+ * return type is a specialization of CwiseUnaryOp.
+ *
+ * Most of the time, this is the only way that it is used, so you typically don't have to name
+ * CwiseUnaryOp types explicitly.
+ *
+ * \sa MatrixBase::unaryExpr(const CustomUnaryOp &) const, class CwiseBinaryOp, class CwiseNullaryOp
+ */
+template <typename UnaryOp, typename XprType>
+class CwiseUnaryOp : public CwiseUnaryOpImpl<UnaryOp, XprType, typename internal::traits<XprType>::StorageKind>,
+                     internal::no_assignment_operator {
+ public:
+  typedef typename CwiseUnaryOpImpl<UnaryOp, XprType, typename internal::traits<XprType>::StorageKind>::Base Base;
+  EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseUnaryOp)
+  typedef typename internal::ref_selector<XprType>::type XprTypeNested;
+  typedef internal::remove_all_t<XprType> NestedExpression;
 
-    typedef typename CwiseUnaryOpImpl<UnaryOp, XprType,typename internal::traits<XprType>::StorageKind>::Base Base;
-    EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseUnaryOp)
-    typedef typename internal::ref_selector<XprType>::type XprTypeNested;
-    typedef internal::remove_all_t<XprType> NestedExpression;
-
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    explicit CwiseUnaryOp(const XprType& xpr, const UnaryOp& func = UnaryOp())
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit CwiseUnaryOp(const XprType& xpr, const UnaryOp& func = UnaryOp())
       : m_xpr(xpr), m_functor(func) {}
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-    Index rows() const EIGEN_NOEXCEPT { return m_xpr.rows(); }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-    Index cols() const EIGEN_NOEXCEPT { return m_xpr.cols(); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_xpr.rows(); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_xpr.cols(); }
 
-    /** \returns the functor representing the unary operation */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    const UnaryOp& functor() const { return m_functor; }
+  /** \returns the functor representing the unary operation */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const UnaryOp& functor() const { return m_functor; }
 
-    /** \returns the nested expression */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    const internal::remove_all_t<XprTypeNested>&
-    nestedExpression() const { return m_xpr; }
+  /** \returns the nested expression */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const internal::remove_all_t<XprTypeNested>& nestedExpression() const {
+    return m_xpr;
+  }
 
-    /** \returns the nested expression */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    internal::remove_all_t<XprTypeNested>&
-    nestedExpression() { return m_xpr; }
+  /** \returns the nested expression */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE internal::remove_all_t<XprTypeNested>& nestedExpression() { return m_xpr; }
 
-  protected:
-    XprTypeNested m_xpr;
-    const UnaryOp m_functor;
+ protected:
+  XprTypeNested m_xpr;
+  const UnaryOp m_functor;
 };
 
 // Generic API dispatcher
-template<typename UnaryOp, typename XprType, typename StorageKind>
-class CwiseUnaryOpImpl
-  : public internal::generic_xpr_base<CwiseUnaryOp<UnaryOp, XprType> >::type
-{
-public:
+template <typename UnaryOp, typename XprType, typename StorageKind>
+class CwiseUnaryOpImpl : public internal::generic_xpr_base<CwiseUnaryOp<UnaryOp, XprType> >::type {
+ public:
   typedef typename internal::generic_xpr_base<CwiseUnaryOp<UnaryOp, XprType> >::type Base;
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_CWISE_UNARY_OP_H
+#endif  // EIGEN_CWISE_UNARY_OP_H
diff --git a/Eigen/src/Core/CwiseUnaryView.h b/Eigen/src/Core/CwiseUnaryView.h
index ef1c208..725b337 100644
--- a/Eigen/src/Core/CwiseUnaryView.h
+++ b/Eigen/src/Core/CwiseUnaryView.h
@@ -16,129 +16,122 @@
 namespace Eigen {
 
 namespace internal {
-template<typename ViewOp, typename MatrixType, typename StrideType>
-struct traits<CwiseUnaryView<ViewOp, MatrixType, StrideType> >
- : traits<MatrixType>
-{
-  typedef typename result_of<
-                     ViewOp(const typename traits<MatrixType>::Scalar&)
-                   >::type Scalar;
+template <typename ViewOp, typename MatrixType, typename StrideType>
+struct traits<CwiseUnaryView<ViewOp, MatrixType, StrideType> > : traits<MatrixType> {
+  typedef typename result_of<ViewOp(const typename traits<MatrixType>::Scalar&)>::type Scalar;
   typedef typename MatrixType::Nested MatrixTypeNested;
   typedef remove_all_t<MatrixTypeNested> MatrixTypeNested_;
   enum {
     FlagsLvalueBit = is_lvalue<MatrixType>::value ? LvalueBit : 0,
-    Flags = traits<MatrixTypeNested_>::Flags & (RowMajorBit | FlagsLvalueBit | DirectAccessBit), // FIXME DirectAccessBit should not be handled by expressions
-    MatrixTypeInnerStride =  inner_stride_at_compile_time<MatrixType>::ret,
+    Flags =
+        traits<MatrixTypeNested_>::Flags &
+        (RowMajorBit | FlagsLvalueBit | DirectAccessBit),  // FIXME DirectAccessBit should not be handled by expressions
+    MatrixTypeInnerStride = inner_stride_at_compile_time<MatrixType>::ret,
     // need to cast the sizeof's from size_t to int explicitly, otherwise:
     // "error: no integral type can represent all of the enumerator values
-    InnerStrideAtCompileTime = StrideType::InnerStrideAtCompileTime == 0
-                             ? (MatrixTypeInnerStride == Dynamic
-                               ? int(Dynamic)
-                               : int(MatrixTypeInnerStride) * int(sizeof(typename traits<MatrixType>::Scalar) / sizeof(Scalar)))
-                             : int(StrideType::InnerStrideAtCompileTime),
+    InnerStrideAtCompileTime =
+        StrideType::InnerStrideAtCompileTime == 0
+            ? (MatrixTypeInnerStride == Dynamic
+                   ? int(Dynamic)
+                   : int(MatrixTypeInnerStride) * int(sizeof(typename traits<MatrixType>::Scalar) / sizeof(Scalar)))
+            : int(StrideType::InnerStrideAtCompileTime),
 
     OuterStrideAtCompileTime = StrideType::OuterStrideAtCompileTime == 0
-                             ? (outer_stride_at_compile_time<MatrixType>::ret == Dynamic
-                               ? int(Dynamic)
-                               : outer_stride_at_compile_time<MatrixType>::ret * int(sizeof(typename traits<MatrixType>::Scalar) / sizeof(Scalar)))
-                             : int(StrideType::OuterStrideAtCompileTime)
+                                   ? (outer_stride_at_compile_time<MatrixType>::ret == Dynamic
+                                          ? int(Dynamic)
+                                          : outer_stride_at_compile_time<MatrixType>::ret *
+                                                int(sizeof(typename traits<MatrixType>::Scalar) / sizeof(Scalar)))
+                                   : int(StrideType::OuterStrideAtCompileTime)
   };
 };
-}
+}  // namespace internal
 
-template<typename ViewOp, typename MatrixType, typename StrideType, typename StorageKind>
+template <typename ViewOp, typename MatrixType, typename StrideType, typename StorageKind>
 class CwiseUnaryViewImpl;
 
 /** \class CwiseUnaryView
-  * \ingroup Core_Module
-  *
-  * \brief Generic lvalue expression of a coefficient-wise unary operator of a matrix or a vector
-  *
-  * \tparam ViewOp template functor implementing the view
-  * \tparam MatrixType the type of the matrix we are applying the unary operator
-  *
-  * This class represents a lvalue expression of a generic unary view operator of a matrix or a vector.
-  * It is the return type of real() and imag(), and most of the time this is the only way it is used.
-  *
-  * \sa MatrixBase::unaryViewExpr(const CustomUnaryOp &) const, class CwiseUnaryOp
-  */
-template<typename ViewOp, typename MatrixType, typename StrideType>
-class CwiseUnaryView : public CwiseUnaryViewImpl<ViewOp, MatrixType, StrideType, typename internal::traits<MatrixType>::StorageKind>
-{
-  public:
+ * \ingroup Core_Module
+ *
+ * \brief Generic lvalue expression of a coefficient-wise unary operator of a matrix or a vector
+ *
+ * \tparam ViewOp template functor implementing the view
+ * \tparam MatrixType the type of the matrix we are applying the unary operator
+ *
+ * This class represents a lvalue expression of a generic unary view operator of a matrix or a vector.
+ * It is the return type of real() and imag(), and most of the time this is the only way it is used.
+ *
+ * \sa MatrixBase::unaryViewExpr(const CustomUnaryOp &) const, class CwiseUnaryOp
+ */
+template <typename ViewOp, typename MatrixType, typename StrideType>
+class CwiseUnaryView
+    : public CwiseUnaryViewImpl<ViewOp, MatrixType, StrideType, typename internal::traits<MatrixType>::StorageKind> {
+ public:
+  typedef typename CwiseUnaryViewImpl<ViewOp, MatrixType, StrideType,
+                                      typename internal::traits<MatrixType>::StorageKind>::Base Base;
+  EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseUnaryView)
+  typedef typename internal::ref_selector<MatrixType>::non_const_type MatrixTypeNested;
+  typedef internal::remove_all_t<MatrixType> NestedExpression;
 
-    typedef typename CwiseUnaryViewImpl<ViewOp, MatrixType, StrideType, typename internal::traits<MatrixType>::StorageKind>::Base Base;
-    EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseUnaryView)
-    typedef typename internal::ref_selector<MatrixType>::non_const_type MatrixTypeNested;
-    typedef internal::remove_all_t<MatrixType> NestedExpression;
-
-    explicit EIGEN_DEVICE_FUNC inline CwiseUnaryView(MatrixType& mat, const ViewOp& func = ViewOp())
+  explicit EIGEN_DEVICE_FUNC inline CwiseUnaryView(MatrixType& mat, const ViewOp& func = ViewOp())
       : m_matrix(mat), m_functor(func) {}
 
-    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(CwiseUnaryView)
+  EIGEN_INHERIT_ASSIGNMENT_OPERATORS(CwiseUnaryView)
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-    Index rows() const EIGEN_NOEXCEPT { return m_matrix.rows(); }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-    Index cols() const EIGEN_NOEXCEPT { return m_matrix.cols(); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_matrix.rows(); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_matrix.cols(); }
 
-    /** \returns the functor representing unary operation */
-    EIGEN_DEVICE_FUNC const ViewOp& functor() const { return m_functor; }
+  /** \returns the functor representing unary operation */
+  EIGEN_DEVICE_FUNC const ViewOp& functor() const { return m_functor; }
 
-    /** \returns the nested expression */
-    EIGEN_DEVICE_FUNC const internal::remove_all_t<MatrixTypeNested>&
-    nestedExpression() const { return m_matrix; }
+  /** \returns the nested expression */
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<MatrixTypeNested>& nestedExpression() const { return m_matrix; }
 
-    /** \returns the nested expression */
-    EIGEN_DEVICE_FUNC std::remove_reference_t<MatrixTypeNested>&
-    nestedExpression() { return m_matrix; }
+  /** \returns the nested expression */
+  EIGEN_DEVICE_FUNC std::remove_reference_t<MatrixTypeNested>& nestedExpression() { return m_matrix; }
 
-  protected:
-    MatrixTypeNested m_matrix;
-    ViewOp m_functor;
+ protected:
+  MatrixTypeNested m_matrix;
+  ViewOp m_functor;
 };
 
 // Generic API dispatcher
-template<typename ViewOp, typename XprType, typename StrideType, typename StorageKind>
-class CwiseUnaryViewImpl
-  : public internal::generic_xpr_base<CwiseUnaryView<ViewOp, XprType, StrideType> >::type
-{
-public:
+template <typename ViewOp, typename XprType, typename StrideType, typename StorageKind>
+class CwiseUnaryViewImpl : public internal::generic_xpr_base<CwiseUnaryView<ViewOp, XprType, StrideType> >::type {
+ public:
   typedef typename internal::generic_xpr_base<CwiseUnaryView<ViewOp, XprType, StrideType> >::type Base;
 };
 
-template<typename ViewOp, typename MatrixType, typename StrideType>
-class CwiseUnaryViewImpl<ViewOp,MatrixType,StrideType,Dense>
-  : public internal::dense_xpr_base< CwiseUnaryView<ViewOp, MatrixType, StrideType> >::type
-{
-  public:
+template <typename ViewOp, typename MatrixType, typename StrideType>
+class CwiseUnaryViewImpl<ViewOp, MatrixType, StrideType, Dense>
+    : public internal::dense_xpr_base<CwiseUnaryView<ViewOp, MatrixType, StrideType> >::type {
+ public:
+  typedef CwiseUnaryView<ViewOp, MatrixType, StrideType> Derived;
+  typedef typename internal::dense_xpr_base<CwiseUnaryView<ViewOp, MatrixType, StrideType> >::type Base;
 
-    typedef CwiseUnaryView<ViewOp, MatrixType,StrideType> Derived;
-    typedef typename internal::dense_xpr_base< CwiseUnaryView<ViewOp, MatrixType,StrideType> >::type Base;
+  EIGEN_DENSE_PUBLIC_INTERFACE(Derived)
+  EIGEN_INHERIT_ASSIGNMENT_OPERATORS(CwiseUnaryViewImpl)
 
-    EIGEN_DENSE_PUBLIC_INTERFACE(Derived)
-    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(CwiseUnaryViewImpl)
+  EIGEN_DEVICE_FUNC inline Scalar* data() { return &(this->coeffRef(0)); }
+  EIGEN_DEVICE_FUNC inline const Scalar* data() const { return &(this->coeff(0)); }
 
-    EIGEN_DEVICE_FUNC inline Scalar* data() { return &(this->coeffRef(0)); }
-    EIGEN_DEVICE_FUNC inline const Scalar* data() const { return &(this->coeff(0)); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index innerStride() const {
+    return StrideType::InnerStrideAtCompileTime != 0
+               ? int(StrideType::InnerStrideAtCompileTime)
+               : derived().nestedExpression().innerStride() * sizeof(typename internal::traits<MatrixType>::Scalar) /
+                     sizeof(Scalar);
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index innerStride() const
-    {
-      return StrideType::InnerStrideAtCompileTime != 0
-             ? int(StrideType::InnerStrideAtCompileTime)
-             : derived().nestedExpression().innerStride() * sizeof(typename internal::traits<MatrixType>::Scalar) / sizeof(Scalar);
-    }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index outerStride() const {
+    return StrideType::OuterStrideAtCompileTime != 0
+               ? int(StrideType::OuterStrideAtCompileTime)
+               : derived().nestedExpression().outerStride() * sizeof(typename internal::traits<MatrixType>::Scalar) /
+                     sizeof(Scalar);
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index outerStride() const
-    {
-      return StrideType::OuterStrideAtCompileTime != 0
-             ? int(StrideType::OuterStrideAtCompileTime)
-             : derived().nestedExpression().outerStride() * sizeof(typename internal::traits<MatrixType>::Scalar) / sizeof(Scalar);
-    }
-  protected:
-    EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(CwiseUnaryViewImpl)
+ protected:
+  EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(CwiseUnaryViewImpl)
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_CWISE_UNARY_VIEW_H
+#endif  // EIGEN_CWISE_UNARY_VIEW_H
diff --git a/Eigen/src/Core/DenseBase.h b/Eigen/src/Core/DenseBase.h
index 3b687a4..5ab54ef 100644
--- a/Eigen/src/Core/DenseBase.h
+++ b/Eigen/src/Core/DenseBase.h
@@ -17,687 +17,629 @@
 namespace Eigen {
 
 // The index type defined by EIGEN_DEFAULT_DENSE_INDEX_TYPE must be a signed type.
-EIGEN_STATIC_ASSERT(NumTraits<DenseIndex>::IsSigned,THE_INDEX_TYPE_MUST_BE_A_SIGNED_TYPE)
+EIGEN_STATIC_ASSERT(NumTraits<DenseIndex>::IsSigned, THE_INDEX_TYPE_MUST_BE_A_SIGNED_TYPE)
 
 /** \class DenseBase
-  * \ingroup Core_Module
-  *
-  * \brief Base class for all dense matrices, vectors, and arrays
-  *
-  * This class is the base that is inherited by all dense objects (matrix, vector, arrays,
-  * and related expression types). The common Eigen API for dense objects is contained in this class.
-  *
-  * \tparam Derived is the derived type, e.g., a matrix type or an expression.
-  *
-  * This class can be extended with the help of the plugin mechanism described on the page
-  * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_DENSEBASE_PLUGIN.
-  *
-  * \sa \blank \ref TopicClassHierarchy
-  */
-template<typename Derived> class DenseBase
+ * \ingroup Core_Module
+ *
+ * \brief Base class for all dense matrices, vectors, and arrays
+ *
+ * This class is the base that is inherited by all dense objects (matrix, vector, arrays,
+ * and related expression types). The common Eigen API for dense objects is contained in this class.
+ *
+ * \tparam Derived is the derived type, e.g., a matrix type or an expression.
+ *
+ * This class can be extended with the help of the plugin mechanism described on the page
+ * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_DENSEBASE_PLUGIN.
+ *
+ * \sa \blank \ref TopicClassHierarchy
+ */
+template <typename Derived>
+class DenseBase
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-  : public DenseCoeffsBase<Derived, internal::accessors_level<Derived>::value>
+    : public DenseCoeffsBase<Derived, internal::accessors_level<Derived>::value>
 #else
-  : public DenseCoeffsBase<Derived,DirectWriteAccessors>
-#endif // not EIGEN_PARSED_BY_DOXYGEN
+    : public DenseCoeffsBase<Derived, DirectWriteAccessors>
+#endif  // not EIGEN_PARSED_BY_DOXYGEN
 {
-  public:
+ public:
+  /** Inner iterator type to iterate over the coefficients of a row or column.
+   * \sa class InnerIterator
+   */
+  typedef Eigen::InnerIterator<Derived> InnerIterator;
 
-    /** Inner iterator type to iterate over the coefficients of a row or column.
-      * \sa class InnerIterator
-      */
-    typedef Eigen::InnerIterator<Derived> InnerIterator;
+  typedef typename internal::traits<Derived>::StorageKind StorageKind;
 
-    typedef typename internal::traits<Derived>::StorageKind StorageKind;
+  /**
+   * \brief The type used to store indices
+   * \details This typedef is relevant for types that store multiple indices such as
+   *          PermutationMatrix or Transpositions, otherwise it defaults to Eigen::Index
+   * \sa \blank \ref TopicPreprocessorDirectives, Eigen::Index, SparseMatrixBase.
+   */
+  typedef typename internal::traits<Derived>::StorageIndex StorageIndex;
 
-    /**
-      * \brief The type used to store indices
-      * \details This typedef is relevant for types that store multiple indices such as
-      *          PermutationMatrix or Transpositions, otherwise it defaults to Eigen::Index
-      * \sa \blank \ref TopicPreprocessorDirectives, Eigen::Index, SparseMatrixBase.
+  /** The numeric type of the expression' coefficients, e.g. float, double, int or std::complex<float>, etc. */
+  typedef typename internal::traits<Derived>::Scalar Scalar;
+
+  /** The numeric type of the expression' coefficients, e.g. float, double, int or std::complex<float>, etc.
+   *
+   * It is an alias for the Scalar type */
+  typedef Scalar value_type;
+
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef DenseCoeffsBase<Derived, internal::accessors_level<Derived>::value> Base;
+
+  using Base::coeff;
+  using Base::coeffByOuterInner;
+  using Base::colIndexByOuterInner;
+  using Base::cols;
+  using Base::const_cast_derived;
+  using Base::derived;
+  using Base::rowIndexByOuterInner;
+  using Base::rows;
+  using Base::size;
+  using Base::operator();
+  using Base::operator[];
+  using Base::colStride;
+  using Base::innerStride;
+  using Base::outerStride;
+  using Base::rowStride;
+  using Base::stride;
+  using Base::w;
+  using Base::x;
+  using Base::y;
+  using Base::z;
+  typedef typename Base::CoeffReturnType CoeffReturnType;
+
+  enum {
+
+    RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
+    /**< The number of rows at compile-time. This is just a copy of the value provided
+     * by the \a Derived type. If a value is not known at compile-time,
+     * it is set to the \a Dynamic constant.
+     * \sa MatrixBase::rows(), MatrixBase::cols(), ColsAtCompileTime, SizeAtCompileTime */
+
+    ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
+    /**< The number of columns at compile-time. This is just a copy of the value provided
+     * by the \a Derived type. If a value is not known at compile-time,
+     * it is set to the \a Dynamic constant.
+     * \sa MatrixBase::rows(), MatrixBase::cols(), RowsAtCompileTime, SizeAtCompileTime */
+
+    SizeAtCompileTime = (internal::size_of_xpr_at_compile_time<Derived>::ret),
+    /**< This is equal to the number of coefficients, i.e. the number of
+     * rows times the number of columns, or to \a Dynamic if this is not
+     * known at compile-time. \sa RowsAtCompileTime, ColsAtCompileTime */
+
+    MaxRowsAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime,
+    /**< This value is equal to the maximum possible number of rows that this expression
+     * might have. If this expression might have an arbitrarily high number of rows,
+     * this value is set to \a Dynamic.
+     *
+     * This value is useful to know when evaluating an expression, in order to determine
+     * whether it is possible to avoid doing a dynamic memory allocation.
+     *
+     * \sa RowsAtCompileTime, MaxColsAtCompileTime, MaxSizeAtCompileTime
      */
-    typedef typename internal::traits<Derived>::StorageIndex StorageIndex;
 
-    /** The numeric type of the expression' coefficients, e.g. float, double, int or std::complex<float>, etc. */
-    typedef typename internal::traits<Derived>::Scalar Scalar;
+    MaxColsAtCompileTime = internal::traits<Derived>::MaxColsAtCompileTime,
+    /**< This value is equal to the maximum possible number of columns that this expression
+     * might have. If this expression might have an arbitrarily high number of columns,
+     * this value is set to \a Dynamic.
+     *
+     * This value is useful to know when evaluating an expression, in order to determine
+     * whether it is possible to avoid doing a dynamic memory allocation.
+     *
+     * \sa ColsAtCompileTime, MaxRowsAtCompileTime, MaxSizeAtCompileTime
+     */
 
-    /** The numeric type of the expression' coefficients, e.g. float, double, int or std::complex<float>, etc.
-      *
-      * It is an alias for the Scalar type */
-    typedef Scalar value_type;
+    MaxSizeAtCompileTime = internal::size_at_compile_time(internal::traits<Derived>::MaxRowsAtCompileTime,
+                                                          internal::traits<Derived>::MaxColsAtCompileTime),
+    /**< This value is equal to the maximum possible number of coefficients that this expression
+     * might have. If this expression might have an arbitrarily high number of coefficients,
+     * this value is set to \a Dynamic.
+     *
+     * This value is useful to know when evaluating an expression, in order to determine
+     * whether it is possible to avoid doing a dynamic memory allocation.
+     *
+     * \sa SizeAtCompileTime, MaxRowsAtCompileTime, MaxColsAtCompileTime
+     */
 
-    typedef typename NumTraits<Scalar>::Real RealScalar;
-    typedef DenseCoeffsBase<Derived, internal::accessors_level<Derived>::value> Base;
+    IsVectorAtCompileTime =
+        internal::traits<Derived>::RowsAtCompileTime == 1 || internal::traits<Derived>::ColsAtCompileTime == 1,
+    /**< This is set to true if either the number of rows or the number of
+     * columns is known at compile-time to be equal to 1. Indeed, in that case,
+     * we are dealing with a column-vector (if there is only one column) or with
+     * a row-vector (if there is only one row). */
 
-    using Base::derived;
-    using Base::const_cast_derived;
-    using Base::rows;
-    using Base::cols;
-    using Base::size;
-    using Base::rowIndexByOuterInner;
-    using Base::colIndexByOuterInner;
-    using Base::coeff;
-    using Base::coeffByOuterInner;
-    using Base::operator();
-    using Base::operator[];
-    using Base::x;
-    using Base::y;
-    using Base::z;
-    using Base::w;
-    using Base::stride;
-    using Base::innerStride;
-    using Base::outerStride;
-    using Base::rowStride;
-    using Base::colStride;
-    typedef typename Base::CoeffReturnType CoeffReturnType;
+    NumDimensions = int(MaxSizeAtCompileTime) == 1 ? 0
+                    : bool(IsVectorAtCompileTime)  ? 1
+                                                   : 2,
+    /**< This value is equal to Tensor::NumDimensions, i.e. 0 for scalars, 1 for vectors,
+     * and 2 for matrices.
+     */
 
-    enum {
+    Flags = internal::traits<Derived>::Flags,
+    /**< This stores expression \ref flags flags which may or may not be inherited by new expressions
+     * constructed from this one. See the \ref flags "list of flags".
+     */
 
-      RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
-        /**< The number of rows at compile-time. This is just a copy of the value provided
-          * by the \a Derived type. If a value is not known at compile-time,
-          * it is set to the \a Dynamic constant.
-          * \sa MatrixBase::rows(), MatrixBase::cols(), ColsAtCompileTime, SizeAtCompileTime */
+    IsRowMajor = int(Flags) & RowMajorBit, /**< True if this expression has row-major storage order. */
 
-      ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
-        /**< The number of columns at compile-time. This is just a copy of the value provided
-          * by the \a Derived type. If a value is not known at compile-time,
-          * it is set to the \a Dynamic constant.
-          * \sa MatrixBase::rows(), MatrixBase::cols(), RowsAtCompileTime, SizeAtCompileTime */
+    InnerSizeAtCompileTime = int(IsVectorAtCompileTime) ? int(SizeAtCompileTime)
+                             : int(IsRowMajor)          ? int(ColsAtCompileTime)
+                                                        : int(RowsAtCompileTime),
 
+    InnerStrideAtCompileTime = internal::inner_stride_at_compile_time<Derived>::ret,
+    OuterStrideAtCompileTime = internal::outer_stride_at_compile_time<Derived>::ret
+  };
 
-      SizeAtCompileTime = (internal::size_of_xpr_at_compile_time<Derived>::ret),
-        /**< This is equal to the number of coefficients, i.e. the number of
-          * rows times the number of columns, or to \a Dynamic if this is not
-          * known at compile-time. \sa RowsAtCompileTime, ColsAtCompileTime */
+  typedef typename internal::find_best_packet<Scalar, SizeAtCompileTime>::type PacketScalar;
 
-      MaxRowsAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime,
-        /**< This value is equal to the maximum possible number of rows that this expression
-          * might have. If this expression might have an arbitrarily high number of rows,
-          * this value is set to \a Dynamic.
-          *
-          * This value is useful to know when evaluating an expression, in order to determine
-          * whether it is possible to avoid doing a dynamic memory allocation.
-          *
-          * \sa RowsAtCompileTime, MaxColsAtCompileTime, MaxSizeAtCompileTime
-          */
+  enum { IsPlainObjectBase = 0 };
 
-      MaxColsAtCompileTime = internal::traits<Derived>::MaxColsAtCompileTime,
-        /**< This value is equal to the maximum possible number of columns that this expression
-          * might have. If this expression might have an arbitrarily high number of columns,
-          * this value is set to \a Dynamic.
-          *
-          * This value is useful to know when evaluating an expression, in order to determine
-          * whether it is possible to avoid doing a dynamic memory allocation.
-          *
-          * \sa ColsAtCompileTime, MaxRowsAtCompileTime, MaxSizeAtCompileTime
-          */
+  /** The plain matrix type corresponding to this expression.
+   * \sa PlainObject */
+  typedef Matrix<typename internal::traits<Derived>::Scalar, internal::traits<Derived>::RowsAtCompileTime,
+                 internal::traits<Derived>::ColsAtCompileTime,
+                 AutoAlign | (internal::traits<Derived>::Flags & RowMajorBit ? RowMajor : ColMajor),
+                 internal::traits<Derived>::MaxRowsAtCompileTime, internal::traits<Derived>::MaxColsAtCompileTime>
+      PlainMatrix;
 
-      MaxSizeAtCompileTime = internal::size_at_compile_time(internal::traits<Derived>::MaxRowsAtCompileTime,
-                                                            internal::traits<Derived>::MaxColsAtCompileTime),
-        /**< This value is equal to the maximum possible number of coefficients that this expression
-          * might have. If this expression might have an arbitrarily high number of coefficients,
-          * this value is set to \a Dynamic.
-          *
-          * This value is useful to know when evaluating an expression, in order to determine
-          * whether it is possible to avoid doing a dynamic memory allocation.
-          *
-          * \sa SizeAtCompileTime, MaxRowsAtCompileTime, MaxColsAtCompileTime
-          */
-
-      IsVectorAtCompileTime = internal::traits<Derived>::RowsAtCompileTime == 1
-                           || internal::traits<Derived>::ColsAtCompileTime == 1,
-        /**< This is set to true if either the number of rows or the number of
-          * columns is known at compile-time to be equal to 1. Indeed, in that case,
-          * we are dealing with a column-vector (if there is only one column) or with
-          * a row-vector (if there is only one row). */
-
-      NumDimensions = int(MaxSizeAtCompileTime) == 1 ? 0 : bool(IsVectorAtCompileTime) ? 1 : 2,
-        /**< This value is equal to Tensor::NumDimensions, i.e. 0 for scalars, 1 for vectors,
-         * and 2 for matrices.
-         */
-
-      Flags = internal::traits<Derived>::Flags,
-        /**< This stores expression \ref flags flags which may or may not be inherited by new expressions
-          * constructed from this one. See the \ref flags "list of flags".
-          */
-
-      IsRowMajor = int(Flags) & RowMajorBit, /**< True if this expression has row-major storage order. */
-
-      InnerSizeAtCompileTime = int(IsVectorAtCompileTime) ? int(SizeAtCompileTime)
-                             : int(IsRowMajor) ? int(ColsAtCompileTime) : int(RowsAtCompileTime),
-
-      InnerStrideAtCompileTime = internal::inner_stride_at_compile_time<Derived>::ret,
-      OuterStrideAtCompileTime = internal::outer_stride_at_compile_time<Derived>::ret
-    };
-
-    typedef typename internal::find_best_packet<Scalar,SizeAtCompileTime>::type PacketScalar;
-
-    enum { IsPlainObjectBase = 0 };
-
-    /** The plain matrix type corresponding to this expression.
-      * \sa PlainObject */
-    typedef Matrix<typename internal::traits<Derived>::Scalar,
-                internal::traits<Derived>::RowsAtCompileTime,
+  /** The plain array type corresponding to this expression.
+   * \sa PlainObject */
+  typedef Array<typename internal::traits<Derived>::Scalar, internal::traits<Derived>::RowsAtCompileTime,
                 internal::traits<Derived>::ColsAtCompileTime,
-                AutoAlign | (internal::traits<Derived>::Flags&RowMajorBit ? RowMajor : ColMajor),
-                internal::traits<Derived>::MaxRowsAtCompileTime,
-                internal::traits<Derived>::MaxColsAtCompileTime
-          > PlainMatrix;
+                AutoAlign | (internal::traits<Derived>::Flags & RowMajorBit ? RowMajor : ColMajor),
+                internal::traits<Derived>::MaxRowsAtCompileTime, internal::traits<Derived>::MaxColsAtCompileTime>
+      PlainArray;
 
-    /** The plain array type corresponding to this expression.
-      * \sa PlainObject */
-    typedef Array<typename internal::traits<Derived>::Scalar,
-                internal::traits<Derived>::RowsAtCompileTime,
-                internal::traits<Derived>::ColsAtCompileTime,
-                AutoAlign | (internal::traits<Derived>::Flags&RowMajorBit ? RowMajor : ColMajor),
-                internal::traits<Derived>::MaxRowsAtCompileTime,
-                internal::traits<Derived>::MaxColsAtCompileTime
-          > PlainArray;
+  /** \brief The plain matrix or array type corresponding to this expression.
+   *
+   * This is not necessarily exactly the return type of eval(). In the case of plain matrices,
+   * the return type of eval() is a const reference to a matrix, not a matrix! It is however guaranteed
+   * that the return type of eval() is either PlainObject or const PlainObject&.
+   */
+  typedef std::conditional_t<internal::is_same<typename internal::traits<Derived>::XprKind, MatrixXpr>::value,
+                             PlainMatrix, PlainArray>
+      PlainObject;
 
-    /** \brief The plain matrix or array type corresponding to this expression.
-      *
-      * This is not necessarily exactly the return type of eval(). In the case of plain matrices,
-      * the return type of eval() is a const reference to a matrix, not a matrix! It is however guaranteed
-      * that the return type of eval() is either PlainObject or const PlainObject&.
-      */
-    typedef std::conditional_t<internal::is_same<typename internal::traits<Derived>::XprKind,MatrixXpr >::value,
-                                 PlainMatrix, PlainArray> PlainObject;
+  /** \returns the outer size.
+   *
+   * \note For a vector, this returns just 1. For a matrix (non-vector), this is the major dimension
+   * with respect to the \ref TopicStorageOrders "storage order", i.e., the number of columns for a
+   * column-major matrix, and the number of rows for a row-major matrix. */
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index outerSize() const {
+    return IsVectorAtCompileTime ? 1 : int(IsRowMajor) ? this->rows() : this->cols();
+  }
 
-    /** \returns the outer size.
-      *
-      * \note For a vector, this returns just 1. For a matrix (non-vector), this is the major dimension
-      * with respect to the \ref TopicStorageOrders "storage order", i.e., the number of columns for a
-      * column-major matrix, and the number of rows for a row-major matrix. */
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    Index outerSize() const
-    {
-      return IsVectorAtCompileTime ? 1
-           : int(IsRowMajor) ? this->rows() : this->cols();
-    }
+  /** \returns the inner size.
+   *
+   * \note For a vector, this is just the size. For a matrix (non-vector), this is the minor dimension
+   * with respect to the \ref TopicStorageOrders "storage order", i.e., the number of rows for a
+   * column-major matrix, and the number of columns for a row-major matrix. */
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index innerSize() const {
+    return IsVectorAtCompileTime ? this->size() : int(IsRowMajor) ? this->cols() : this->rows();
+  }
 
-    /** \returns the inner size.
-      *
-      * \note For a vector, this is just the size. For a matrix (non-vector), this is the minor dimension
-      * with respect to the \ref TopicStorageOrders "storage order", i.e., the number of rows for a
-      * column-major matrix, and the number of columns for a row-major matrix. */
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    Index innerSize() const
-    {
-      return IsVectorAtCompileTime ? this->size()
-           : int(IsRowMajor) ? this->cols() : this->rows();
-    }
-
-    /** Only plain matrices/arrays, not expressions, may be resized; therefore the only useful resize methods are
-      * Matrix::resize() and Array::resize(). The present method only asserts that the new size equals the old size, and does
-      * nothing else.
-      */
-    EIGEN_DEVICE_FUNC
-    void resize(Index newSize)
-    {
-      EIGEN_ONLY_USED_FOR_DEBUG(newSize);
-      eigen_assert(newSize == this->size()
-                && "DenseBase::resize() does not actually allow to resize.");
-    }
-    /** Only plain matrices/arrays, not expressions, may be resized; therefore the only useful resize methods are
-      * Matrix::resize() and Array::resize(). The present method only asserts that the new size equals the old size, and does
-      * nothing else.
-      */
-    EIGEN_DEVICE_FUNC
-    void resize(Index rows, Index cols)
-    {
-      EIGEN_ONLY_USED_FOR_DEBUG(rows);
-      EIGEN_ONLY_USED_FOR_DEBUG(cols);
-      eigen_assert(rows == this->rows() && cols == this->cols()
-                && "DenseBase::resize() does not actually allow to resize.");
-    }
+  /** Only plain matrices/arrays, not expressions, may be resized; therefore the only useful resize methods are
+   * Matrix::resize() and Array::resize(). The present method only asserts that the new size equals the old size, and
+   * does nothing else.
+   */
+  EIGEN_DEVICE_FUNC void resize(Index newSize) {
+    EIGEN_ONLY_USED_FOR_DEBUG(newSize);
+    eigen_assert(newSize == this->size() && "DenseBase::resize() does not actually allow to resize.");
+  }
+  /** Only plain matrices/arrays, not expressions, may be resized; therefore the only useful resize methods are
+   * Matrix::resize() and Array::resize(). The present method only asserts that the new size equals the old size, and
+   * does nothing else.
+   */
+  EIGEN_DEVICE_FUNC void resize(Index rows, Index cols) {
+    EIGEN_ONLY_USED_FOR_DEBUG(rows);
+    EIGEN_ONLY_USED_FOR_DEBUG(cols);
+    eigen_assert(rows == this->rows() && cols == this->cols() &&
+                 "DenseBase::resize() does not actually allow to resize.");
+  }
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-    /** \internal Represents a matrix with all coefficients equal to one another*/
-    typedef CwiseNullaryOp<internal::scalar_constant_op<Scalar>,PlainObject> ConstantReturnType;
-    /** \internal \deprecated Represents a vector with linearly spaced coefficients that allows sequential access only. */
-    EIGEN_DEPRECATED typedef CwiseNullaryOp<internal::linspaced_op<Scalar>,PlainObject> SequentialLinSpacedReturnType;
-    /** \internal Represents a vector with linearly spaced coefficients that allows random access. */
-    typedef CwiseNullaryOp<internal::linspaced_op<Scalar>,PlainObject> RandomAccessLinSpacedReturnType;
-    /** \internal Represents a vector with equally spaced coefficients that allows random access. */
-    typedef CwiseNullaryOp<internal::equalspaced_op<Scalar>, PlainObject> RandomAccessEqualSpacedReturnType;
-    /** \internal the return type of MatrixBase::eigenvalues() */
-    typedef Matrix<typename NumTraits<typename internal::traits<Derived>::Scalar>::Real, internal::traits<Derived>::ColsAtCompileTime, 1> EigenvaluesReturnType;
+  /** \internal Represents a matrix with all coefficients equal to one another*/
+  typedef CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject> ConstantReturnType;
+  /** \internal \deprecated Represents a vector with linearly spaced coefficients that allows sequential access only. */
+  EIGEN_DEPRECATED typedef CwiseNullaryOp<internal::linspaced_op<Scalar>, PlainObject> SequentialLinSpacedReturnType;
+  /** \internal Represents a vector with linearly spaced coefficients that allows random access. */
+  typedef CwiseNullaryOp<internal::linspaced_op<Scalar>, PlainObject> RandomAccessLinSpacedReturnType;
+  /** \internal Represents a vector with equally spaced coefficients that allows random access. */
+  typedef CwiseNullaryOp<internal::equalspaced_op<Scalar>, PlainObject> RandomAccessEqualSpacedReturnType;
+  /** \internal the return type of MatrixBase::eigenvalues() */
+  typedef Matrix<typename NumTraits<typename internal::traits<Derived>::Scalar>::Real,
+                 internal::traits<Derived>::ColsAtCompileTime, 1>
+      EigenvaluesReturnType;
 
-#endif // not EIGEN_PARSED_BY_DOXYGEN
+#endif  // not EIGEN_PARSED_BY_DOXYGEN
 
-    /** Copies \a other into *this. \returns a reference to *this. */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Derived& operator=(const DenseBase<OtherDerived>& other);
+  /** Copies \a other into *this. \returns a reference to *this. */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator=(const DenseBase<OtherDerived>& other);
 
-    /** Special case of the template operator=, in order to prevent the compiler
-      * from generating a default operator= (issue hit with g++ 4.1)
-      */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Derived& operator=(const DenseBase& other);
+  /** Special case of the template operator=, in order to prevent the compiler
+   * from generating a default operator= (issue hit with g++ 4.1)
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator=(const DenseBase& other);
 
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    Derived& operator=(const EigenBase<OtherDerived> &other);
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC Derived& operator=(const EigenBase<OtherDerived>& other);
 
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    Derived& operator+=(const EigenBase<OtherDerived> &other);
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC Derived& operator+=(const EigenBase<OtherDerived>& other);
 
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    Derived& operator-=(const EigenBase<OtherDerived> &other);
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC Derived& operator-=(const EigenBase<OtherDerived>& other);
 
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    Derived& operator=(const ReturnByValue<OtherDerived>& func);
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC Derived& operator=(const ReturnByValue<OtherDerived>& func);
 
-    /** \internal
-      * Copies \a other into *this without evaluating other. \returns a reference to *this. */
-    template<typename OtherDerived>
-    /** \deprecated */
-    EIGEN_DEPRECATED EIGEN_DEVICE_FUNC
-    Derived& lazyAssign(const DenseBase<OtherDerived>& other);
+  /** \internal
+   * Copies \a other into *this without evaluating other. \returns a reference to *this. */
+  template <typename OtherDerived>
+  /** \deprecated */
+  EIGEN_DEPRECATED EIGEN_DEVICE_FUNC Derived& lazyAssign(const DenseBase<OtherDerived>& other);
 
-    EIGEN_DEVICE_FUNC
-    CommaInitializer<Derived> operator<< (const Scalar& s);
+  EIGEN_DEVICE_FUNC CommaInitializer<Derived> operator<<(const Scalar& s);
 
-    template<unsigned int Added,unsigned int Removed>
-    /** \deprecated it now returns \c *this */
-    EIGEN_DEPRECATED
-    const Derived& flagged() const
-    { return derived(); }
+  template <unsigned int Added, unsigned int Removed>
+  /** \deprecated it now returns \c *this */
+  EIGEN_DEPRECATED const Derived& flagged() const {
+    return derived();
+  }
 
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    CommaInitializer<Derived> operator<< (const DenseBase<OtherDerived>& other);
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC CommaInitializer<Derived> operator<<(const DenseBase<OtherDerived>& other);
 
-    typedef Transpose<Derived> TransposeReturnType;
-    EIGEN_DEVICE_FUNC
-    TransposeReturnType transpose();
-    typedef Transpose<const Derived> ConstTransposeReturnType;
-    EIGEN_DEVICE_FUNC
-    const ConstTransposeReturnType transpose() const;
-    EIGEN_DEVICE_FUNC
-    void transposeInPlace();
+  typedef Transpose<Derived> TransposeReturnType;
+  EIGEN_DEVICE_FUNC TransposeReturnType transpose();
+  typedef Transpose<const Derived> ConstTransposeReturnType;
+  EIGEN_DEVICE_FUNC const ConstTransposeReturnType transpose() const;
+  EIGEN_DEVICE_FUNC void transposeInPlace();
 
-    EIGEN_DEVICE_FUNC static const ConstantReturnType
-    Constant(Index rows, Index cols, const Scalar& value);
-    EIGEN_DEVICE_FUNC static const ConstantReturnType
-    Constant(Index size, const Scalar& value);
-    EIGEN_DEVICE_FUNC static const ConstantReturnType
-    Constant(const Scalar& value);
+  EIGEN_DEVICE_FUNC static const ConstantReturnType Constant(Index rows, Index cols, const Scalar& value);
+  EIGEN_DEVICE_FUNC static const ConstantReturnType Constant(Index size, const Scalar& value);
+  EIGEN_DEVICE_FUNC static const ConstantReturnType Constant(const Scalar& value);
 
-    EIGEN_DEPRECATED EIGEN_DEVICE_FUNC static const RandomAccessLinSpacedReturnType
-    LinSpaced(Sequential_t, Index size, const Scalar& low, const Scalar& high);
-    EIGEN_DEPRECATED EIGEN_DEVICE_FUNC static const RandomAccessLinSpacedReturnType
-    LinSpaced(Sequential_t, const Scalar& low, const Scalar& high);
+  EIGEN_DEPRECATED EIGEN_DEVICE_FUNC static const RandomAccessLinSpacedReturnType LinSpaced(Sequential_t, Index size,
+                                                                                            const Scalar& low,
+                                                                                            const Scalar& high);
+  EIGEN_DEPRECATED EIGEN_DEVICE_FUNC static const RandomAccessLinSpacedReturnType LinSpaced(Sequential_t,
+                                                                                            const Scalar& low,
+                                                                                            const Scalar& high);
 
-    EIGEN_DEVICE_FUNC static const RandomAccessLinSpacedReturnType
-    LinSpaced(Index size, const Scalar& low, const Scalar& high);
-    EIGEN_DEVICE_FUNC static const RandomAccessLinSpacedReturnType
-    LinSpaced(const Scalar& low, const Scalar& high);
+  EIGEN_DEVICE_FUNC static const RandomAccessLinSpacedReturnType LinSpaced(Index size, const Scalar& low,
+                                                                           const Scalar& high);
+  EIGEN_DEVICE_FUNC static const RandomAccessLinSpacedReturnType LinSpaced(const Scalar& low, const Scalar& high);
 
-    EIGEN_DEVICE_FUNC static const RandomAccessEqualSpacedReturnType
-    EqualSpaced(Index size, const Scalar& low, const Scalar& step);
-    EIGEN_DEVICE_FUNC static const RandomAccessEqualSpacedReturnType
-    EqualSpaced(const Scalar& low, const Scalar& step);
+  EIGEN_DEVICE_FUNC static const RandomAccessEqualSpacedReturnType EqualSpaced(Index size, const Scalar& low,
+                                                                               const Scalar& step);
+  EIGEN_DEVICE_FUNC static const RandomAccessEqualSpacedReturnType EqualSpaced(const Scalar& low, const Scalar& step);
 
-    template<typename CustomNullaryOp> EIGEN_DEVICE_FUNC
-    static const CwiseNullaryOp<CustomNullaryOp, PlainObject>
-    NullaryExpr(Index rows, Index cols, const CustomNullaryOp& func);
-    template<typename CustomNullaryOp> EIGEN_DEVICE_FUNC
-    static const CwiseNullaryOp<CustomNullaryOp, PlainObject>
-    NullaryExpr(Index size, const CustomNullaryOp& func);
-    template<typename CustomNullaryOp> EIGEN_DEVICE_FUNC
-    static const CwiseNullaryOp<CustomNullaryOp, PlainObject>
-    NullaryExpr(const CustomNullaryOp& func);
+  template <typename CustomNullaryOp>
+  EIGEN_DEVICE_FUNC static const CwiseNullaryOp<CustomNullaryOp, PlainObject> NullaryExpr(Index rows, Index cols,
+                                                                                          const CustomNullaryOp& func);
+  template <typename CustomNullaryOp>
+  EIGEN_DEVICE_FUNC static const CwiseNullaryOp<CustomNullaryOp, PlainObject> NullaryExpr(Index size,
+                                                                                          const CustomNullaryOp& func);
+  template <typename CustomNullaryOp>
+  EIGEN_DEVICE_FUNC static const CwiseNullaryOp<CustomNullaryOp, PlainObject> NullaryExpr(const CustomNullaryOp& func);
 
-    EIGEN_DEVICE_FUNC static const ConstantReturnType Zero(Index rows, Index cols);
-    EIGEN_DEVICE_FUNC static const ConstantReturnType Zero(Index size);
-    EIGEN_DEVICE_FUNC static const ConstantReturnType Zero();
-    EIGEN_DEVICE_FUNC static const ConstantReturnType Ones(Index rows, Index cols);
-    EIGEN_DEVICE_FUNC static const ConstantReturnType Ones(Index size);
-    EIGEN_DEVICE_FUNC static const ConstantReturnType Ones();
+  EIGEN_DEVICE_FUNC static const ConstantReturnType Zero(Index rows, Index cols);
+  EIGEN_DEVICE_FUNC static const ConstantReturnType Zero(Index size);
+  EIGEN_DEVICE_FUNC static const ConstantReturnType Zero();
+  EIGEN_DEVICE_FUNC static const ConstantReturnType Ones(Index rows, Index cols);
+  EIGEN_DEVICE_FUNC static const ConstantReturnType Ones(Index size);
+  EIGEN_DEVICE_FUNC static const ConstantReturnType Ones();
 
-    EIGEN_DEVICE_FUNC void fill(const Scalar& value);
-    EIGEN_DEVICE_FUNC Derived& setConstant(const Scalar& value);
-    EIGEN_DEVICE_FUNC Derived& setLinSpaced(Index size, const Scalar& low, const Scalar& high);
-    EIGEN_DEVICE_FUNC Derived& setLinSpaced(const Scalar& low, const Scalar& high);
-    EIGEN_DEVICE_FUNC Derived& setEqualSpaced(Index size, const Scalar& low, const Scalar& step);
-    EIGEN_DEVICE_FUNC Derived& setEqualSpaced(const Scalar& low, const Scalar& step);
-    EIGEN_DEVICE_FUNC Derived& setZero();
-    EIGEN_DEVICE_FUNC Derived& setOnes();
-    EIGEN_DEVICE_FUNC Derived& setRandom();
+  EIGEN_DEVICE_FUNC void fill(const Scalar& value);
+  EIGEN_DEVICE_FUNC Derived& setConstant(const Scalar& value);
+  EIGEN_DEVICE_FUNC Derived& setLinSpaced(Index size, const Scalar& low, const Scalar& high);
+  EIGEN_DEVICE_FUNC Derived& setLinSpaced(const Scalar& low, const Scalar& high);
+  EIGEN_DEVICE_FUNC Derived& setEqualSpaced(Index size, const Scalar& low, const Scalar& step);
+  EIGEN_DEVICE_FUNC Derived& setEqualSpaced(const Scalar& low, const Scalar& step);
+  EIGEN_DEVICE_FUNC Derived& setZero();
+  EIGEN_DEVICE_FUNC Derived& setOnes();
+  EIGEN_DEVICE_FUNC Derived& setRandom();
 
-    template<typename OtherDerived> EIGEN_DEVICE_FUNC
-    bool isApprox(const DenseBase<OtherDerived>& other,
-                  const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
-    EIGEN_DEVICE_FUNC
-    bool isMuchSmallerThan(const RealScalar& other,
-                           const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
-    template<typename OtherDerived> EIGEN_DEVICE_FUNC
-    bool isMuchSmallerThan(const DenseBase<OtherDerived>& other,
-                           const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC bool isApprox(const DenseBase<OtherDerived>& other,
+                                  const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
+  EIGEN_DEVICE_FUNC bool isMuchSmallerThan(const RealScalar& other,
+                                           const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC bool isMuchSmallerThan(const DenseBase<OtherDerived>& other,
+                                           const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
 
-    EIGEN_DEVICE_FUNC bool isApproxToConstant(const Scalar& value, const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
-    EIGEN_DEVICE_FUNC bool isConstant(const Scalar& value, const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
-    EIGEN_DEVICE_FUNC bool isZero(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
-    EIGEN_DEVICE_FUNC bool isOnes(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
+  EIGEN_DEVICE_FUNC bool isApproxToConstant(const Scalar& value,
+                                            const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
+  EIGEN_DEVICE_FUNC bool isConstant(const Scalar& value,
+                                    const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
+  EIGEN_DEVICE_FUNC bool isZero(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
+  EIGEN_DEVICE_FUNC bool isOnes(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
 
-    EIGEN_DEVICE_FUNC inline bool hasNaN() const;
-    EIGEN_DEVICE_FUNC inline bool allFinite() const;
+  EIGEN_DEVICE_FUNC inline bool hasNaN() const;
+  EIGEN_DEVICE_FUNC inline bool allFinite() const;
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Derived& operator*=(const Scalar& other);
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Derived& operator/=(const Scalar& other);
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator*=(const Scalar& other);
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator/=(const Scalar& other);
 
-    typedef internal::add_const_on_value_type_t<typename internal::eval<Derived>::type> EvalReturnType;
-    /** \returns the matrix or vector obtained by evaluating this expression.
-      *
-      * Notice that in the case of a plain matrix or vector (not an expression) this function just returns
-      * a const reference, in order to avoid a useless copy.
-      *
-      * \warning Be careful with eval() and the auto C++ keyword, as detailed in this \link TopicPitfalls_auto_keyword page \endlink.
-      */
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE EvalReturnType eval() const
-    {
-      // Even though MSVC does not honor strong inlining when the return type
-      // is a dynamic matrix, we desperately need strong inlining for fixed
-      // size types on MSVC.
-      return typename internal::eval<Derived>::type(derived());
-    }
+  typedef internal::add_const_on_value_type_t<typename internal::eval<Derived>::type> EvalReturnType;
+  /** \returns the matrix or vector obtained by evaluating this expression.
+   *
+   * Notice that in the case of a plain matrix or vector (not an expression) this function just returns
+   * a const reference, in order to avoid a useless copy.
+   *
+   * \warning Be careful with eval() and the auto C++ keyword, as detailed in this \link TopicPitfalls_auto_keyword page
+   * \endlink.
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EvalReturnType eval() const {
+    // Even though MSVC does not honor strong inlining when the return type
+    // is a dynamic matrix, we desperately need strong inlining for fixed
+    // size types on MSVC.
+    return typename internal::eval<Derived>::type(derived());
+  }
 
-    /** swaps *this with the expression \a other.
-      *
-      */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    void swap(const DenseBase<OtherDerived>& other)
-    {
-      EIGEN_STATIC_ASSERT(!OtherDerived::IsPlainObjectBase,THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY);
-      eigen_assert(rows()==other.rows() && cols()==other.cols());
-      call_assignment(derived(), other.const_cast_derived(), internal::swap_assign_op<Scalar>());
-    }
+  /** swaps *this with the expression \a other.
+   *
+   */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void swap(const DenseBase<OtherDerived>& other) {
+    EIGEN_STATIC_ASSERT(!OtherDerived::IsPlainObjectBase, THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY);
+    eigen_assert(rows() == other.rows() && cols() == other.cols());
+    call_assignment(derived(), other.const_cast_derived(), internal::swap_assign_op<Scalar>());
+  }
 
-    /** swaps *this with the matrix or array \a other.
-      *
-      */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    void swap(PlainObjectBase<OtherDerived>& other)
-    {
-      eigen_assert(rows()==other.rows() && cols()==other.cols());
-      call_assignment(derived(), other.derived(), internal::swap_assign_op<Scalar>());
-    }
+  /** swaps *this with the matrix or array \a other.
+   *
+   */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void swap(PlainObjectBase<OtherDerived>& other) {
+    eigen_assert(rows() == other.rows() && cols() == other.cols());
+    call_assignment(derived(), other.derived(), internal::swap_assign_op<Scalar>());
+  }
 
-    EIGEN_DEVICE_FUNC inline const NestByValue<Derived> nestByValue() const;
-    EIGEN_DEVICE_FUNC inline const ForceAlignedAccess<Derived> forceAlignedAccess() const;
-    EIGEN_DEVICE_FUNC inline ForceAlignedAccess<Derived> forceAlignedAccess();
-    template<bool Enable> EIGEN_DEVICE_FUNC
-    inline const std::conditional_t<Enable,ForceAlignedAccess<Derived>,Derived&> forceAlignedAccessIf() const;
-    template<bool Enable> EIGEN_DEVICE_FUNC
-    inline std::conditional_t<Enable,ForceAlignedAccess<Derived>,Derived&> forceAlignedAccessIf();
+  EIGEN_DEVICE_FUNC inline const NestByValue<Derived> nestByValue() const;
+  EIGEN_DEVICE_FUNC inline const ForceAlignedAccess<Derived> forceAlignedAccess() const;
+  EIGEN_DEVICE_FUNC inline ForceAlignedAccess<Derived> forceAlignedAccess();
+  template <bool Enable>
+  EIGEN_DEVICE_FUNC inline const std::conditional_t<Enable, ForceAlignedAccess<Derived>, Derived&>
+  forceAlignedAccessIf() const;
+  template <bool Enable>
+  EIGEN_DEVICE_FUNC inline std::conditional_t<Enable, ForceAlignedAccess<Derived>, Derived&> forceAlignedAccessIf();
 
-    EIGEN_DEVICE_FUNC Scalar sum() const;
-    EIGEN_DEVICE_FUNC Scalar mean() const;
-    EIGEN_DEVICE_FUNC Scalar trace() const;
+  EIGEN_DEVICE_FUNC Scalar sum() const;
+  EIGEN_DEVICE_FUNC Scalar mean() const;
+  EIGEN_DEVICE_FUNC Scalar trace() const;
 
-    EIGEN_DEVICE_FUNC Scalar prod() const;
+  EIGEN_DEVICE_FUNC Scalar prod() const;
 
-    template<int NaNPropagation>
-    EIGEN_DEVICE_FUNC typename internal::traits<Derived>::Scalar minCoeff() const;
-    template<int NaNPropagation>
-    EIGEN_DEVICE_FUNC typename internal::traits<Derived>::Scalar maxCoeff() const;
+  template <int NaNPropagation>
+  EIGEN_DEVICE_FUNC typename internal::traits<Derived>::Scalar minCoeff() const;
+  template <int NaNPropagation>
+  EIGEN_DEVICE_FUNC typename internal::traits<Derived>::Scalar maxCoeff() const;
 
+  // By default, the fastest version with undefined NaN propagation semantics is
+  // used.
+  // TODO(rmlarsen): Replace with default template argument when we move to
+  // c++11 or beyond.
+  EIGEN_DEVICE_FUNC inline typename internal::traits<Derived>::Scalar minCoeff() const {
+    return minCoeff<PropagateFast>();
+  }
+  EIGEN_DEVICE_FUNC inline typename internal::traits<Derived>::Scalar maxCoeff() const {
+    return maxCoeff<PropagateFast>();
+  }
 
-    // By default, the fastest version with undefined NaN propagation semantics is
-    // used.
-    // TODO(rmlarsen): Replace with default template argument when we move to
-    // c++11 or beyond.
-    EIGEN_DEVICE_FUNC inline typename internal::traits<Derived>::Scalar minCoeff() const {
-      return minCoeff<PropagateFast>();
-    }
-    EIGEN_DEVICE_FUNC inline typename internal::traits<Derived>::Scalar maxCoeff() const {
-      return maxCoeff<PropagateFast>();
-    }
+  template <int NaNPropagation, typename IndexType>
+  EIGEN_DEVICE_FUNC typename internal::traits<Derived>::Scalar minCoeff(IndexType* row, IndexType* col) const;
+  template <int NaNPropagation, typename IndexType>
+  EIGEN_DEVICE_FUNC typename internal::traits<Derived>::Scalar maxCoeff(IndexType* row, IndexType* col) const;
+  template <int NaNPropagation, typename IndexType>
+  EIGEN_DEVICE_FUNC typename internal::traits<Derived>::Scalar minCoeff(IndexType* index) const;
+  template <int NaNPropagation, typename IndexType>
+  EIGEN_DEVICE_FUNC typename internal::traits<Derived>::Scalar maxCoeff(IndexType* index) const;
 
-    template<int NaNPropagation, typename IndexType>
-    EIGEN_DEVICE_FUNC
-    typename internal::traits<Derived>::Scalar minCoeff(IndexType* row, IndexType* col) const;
-    template<int NaNPropagation, typename IndexType>
-    EIGEN_DEVICE_FUNC
-    typename internal::traits<Derived>::Scalar maxCoeff(IndexType* row, IndexType* col) const;
-    template<int NaNPropagation, typename IndexType>
-    EIGEN_DEVICE_FUNC
-    typename internal::traits<Derived>::Scalar minCoeff(IndexType* index) const;
-    template<int NaNPropagation, typename IndexType>
-    EIGEN_DEVICE_FUNC
-    typename internal::traits<Derived>::Scalar maxCoeff(IndexType* index) const;
+  // TODO(rmlarsen): Replace these methods with a default template argument.
+  template <typename IndexType>
+  EIGEN_DEVICE_FUNC inline typename internal::traits<Derived>::Scalar minCoeff(IndexType* row, IndexType* col) const {
+    return minCoeff<PropagateFast>(row, col);
+  }
+  template <typename IndexType>
+  EIGEN_DEVICE_FUNC inline typename internal::traits<Derived>::Scalar maxCoeff(IndexType* row, IndexType* col) const {
+    return maxCoeff<PropagateFast>(row, col);
+  }
+  template <typename IndexType>
+  EIGEN_DEVICE_FUNC inline typename internal::traits<Derived>::Scalar minCoeff(IndexType* index) const {
+    return minCoeff<PropagateFast>(index);
+  }
+  template <typename IndexType>
+  EIGEN_DEVICE_FUNC inline typename internal::traits<Derived>::Scalar maxCoeff(IndexType* index) const {
+    return maxCoeff<PropagateFast>(index);
+  }
 
-    // TODO(rmlarsen): Replace these methods with a default template argument.
-    template<typename IndexType>
-    EIGEN_DEVICE_FUNC inline
-    typename internal::traits<Derived>::Scalar minCoeff(IndexType* row, IndexType* col) const {
-      return minCoeff<PropagateFast>(row, col);
-    }
-    template<typename IndexType>
-    EIGEN_DEVICE_FUNC inline
-    typename internal::traits<Derived>::Scalar maxCoeff(IndexType* row, IndexType* col) const {
-      return maxCoeff<PropagateFast>(row, col);
-    }
-    template<typename IndexType>
-     EIGEN_DEVICE_FUNC inline
-    typename internal::traits<Derived>::Scalar minCoeff(IndexType* index) const {
-      return minCoeff<PropagateFast>(index);
-    }
-    template<typename IndexType>
-    EIGEN_DEVICE_FUNC inline
-    typename internal::traits<Derived>::Scalar maxCoeff(IndexType* index) const {
-      return maxCoeff<PropagateFast>(index);
-    }
-  
-    template<typename BinaryOp>
-    EIGEN_DEVICE_FUNC
-    Scalar redux(const BinaryOp& func) const;
+  template <typename BinaryOp>
+  EIGEN_DEVICE_FUNC Scalar redux(const BinaryOp& func) const;
 
-    template<typename Visitor>
-    EIGEN_DEVICE_FUNC
-    void visit(Visitor& func) const;
+  template <typename Visitor>
+  EIGEN_DEVICE_FUNC void visit(Visitor& func) const;
 
-    /** \returns a WithFormat proxy object allowing to print a matrix the with given
-      * format \a fmt.
-      *
-      * See class IOFormat for some examples.
-      *
-      * \sa class IOFormat, class WithFormat
-      */
-    inline const WithFormat<Derived> format(const IOFormat& fmt) const
-    {
-      return WithFormat<Derived>(derived(), fmt);
-    }
+  /** \returns a WithFormat proxy object allowing to print a matrix the with given
+   * format \a fmt.
+   *
+   * See class IOFormat for some examples.
+   *
+   * \sa class IOFormat, class WithFormat
+   */
+  inline const WithFormat<Derived> format(const IOFormat& fmt) const { return WithFormat<Derived>(derived(), fmt); }
 
-    /** \returns the unique coefficient of a 1x1 expression */
-    EIGEN_DEVICE_FUNC
-    CoeffReturnType value() const
-    {
-      EIGEN_STATIC_ASSERT_SIZE_1x1(Derived)
-      eigen_assert(this->rows() == 1 && this->cols() == 1);
-      return derived().coeff(0,0);
-    }
+  /** \returns the unique coefficient of a 1x1 expression */
+  EIGEN_DEVICE_FUNC CoeffReturnType value() const {
+    EIGEN_STATIC_ASSERT_SIZE_1x1(Derived) eigen_assert(this->rows() == 1 && this->cols() == 1);
+    return derived().coeff(0, 0);
+  }
 
-    EIGEN_DEVICE_FUNC bool all() const;
-    EIGEN_DEVICE_FUNC bool any() const;
-    EIGEN_DEVICE_FUNC Index count() const;
+  EIGEN_DEVICE_FUNC bool all() const;
+  EIGEN_DEVICE_FUNC bool any() const;
+  EIGEN_DEVICE_FUNC Index count() const;
 
-    typedef VectorwiseOp<Derived, Horizontal> RowwiseReturnType;
-    typedef const VectorwiseOp<const Derived, Horizontal> ConstRowwiseReturnType;
-    typedef VectorwiseOp<Derived, Vertical> ColwiseReturnType;
-    typedef const VectorwiseOp<const Derived, Vertical> ConstColwiseReturnType;
+  typedef VectorwiseOp<Derived, Horizontal> RowwiseReturnType;
+  typedef const VectorwiseOp<const Derived, Horizontal> ConstRowwiseReturnType;
+  typedef VectorwiseOp<Derived, Vertical> ColwiseReturnType;
+  typedef const VectorwiseOp<const Derived, Vertical> ConstColwiseReturnType;
 
-    /** \returns a VectorwiseOp wrapper of *this for broadcasting and partial reductions
-    *
-    * Example: \include MatrixBase_rowwise.cpp
-    * Output: \verbinclude MatrixBase_rowwise.out
-    *
-    * \sa colwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting
-    */
-    //Code moved here due to a CUDA compiler bug
-    EIGEN_DEVICE_FUNC inline ConstRowwiseReturnType rowwise() const {
-      return ConstRowwiseReturnType(derived());
-    }
-    EIGEN_DEVICE_FUNC RowwiseReturnType rowwise();
+  /** \returns a VectorwiseOp wrapper of *this for broadcasting and partial reductions
+   *
+   * Example: \include MatrixBase_rowwise.cpp
+   * Output: \verbinclude MatrixBase_rowwise.out
+   *
+   * \sa colwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting
+   */
+  // Code moved here due to a CUDA compiler bug
+  EIGEN_DEVICE_FUNC inline ConstRowwiseReturnType rowwise() const { return ConstRowwiseReturnType(derived()); }
+  EIGEN_DEVICE_FUNC RowwiseReturnType rowwise();
 
-    /** \returns a VectorwiseOp wrapper of *this broadcasting and partial reductions
-    *
-    * Example: \include MatrixBase_colwise.cpp
-    * Output: \verbinclude MatrixBase_colwise.out
-    *
-    * \sa rowwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting
-    */
-    EIGEN_DEVICE_FUNC inline ConstColwiseReturnType colwise() const {
-      return ConstColwiseReturnType(derived());
-    }
-    EIGEN_DEVICE_FUNC ColwiseReturnType colwise();
+  /** \returns a VectorwiseOp wrapper of *this broadcasting and partial reductions
+   *
+   * Example: \include MatrixBase_colwise.cpp
+   * Output: \verbinclude MatrixBase_colwise.out
+   *
+   * \sa rowwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting
+   */
+  EIGEN_DEVICE_FUNC inline ConstColwiseReturnType colwise() const { return ConstColwiseReturnType(derived()); }
+  EIGEN_DEVICE_FUNC ColwiseReturnType colwise();
 
-    typedef CwiseNullaryOp<internal::scalar_random_op<Scalar>,PlainObject> RandomReturnType;
-    static const RandomReturnType Random(Index rows, Index cols);
-    static const RandomReturnType Random(Index size);
-    static const RandomReturnType Random();
+  typedef CwiseNullaryOp<internal::scalar_random_op<Scalar>, PlainObject> RandomReturnType;
+  static const RandomReturnType Random(Index rows, Index cols);
+  static const RandomReturnType Random(Index size);
+  static const RandomReturnType Random();
 
-    template <typename ThenDerived, typename ElseDerived>
-    inline EIGEN_DEVICE_FUNC
-        CwiseTernaryOp<internal::scalar_boolean_select_op<typename DenseBase<ThenDerived>::Scalar,
-                           typename DenseBase<ElseDerived>::Scalar, Scalar>,
-        ThenDerived, ElseDerived, Derived>
-        select(const DenseBase<ThenDerived>& thenMatrix, const DenseBase<ElseDerived>& elseMatrix) const;
+  template <typename ThenDerived, typename ElseDerived>
+  inline EIGEN_DEVICE_FUNC
+      CwiseTernaryOp<internal::scalar_boolean_select_op<typename DenseBase<ThenDerived>::Scalar,
+                                                        typename DenseBase<ElseDerived>::Scalar, Scalar>,
+                     ThenDerived, ElseDerived, Derived>
+      select(const DenseBase<ThenDerived>& thenMatrix, const DenseBase<ElseDerived>& elseMatrix) const;
 
-    template <typename ThenDerived>
-    inline EIGEN_DEVICE_FUNC
-        CwiseTernaryOp<internal::scalar_boolean_select_op<typename DenseBase<ThenDerived>::Scalar,
-                           typename DenseBase<ThenDerived>::Scalar, Scalar>,
-        ThenDerived, typename DenseBase<ThenDerived>::ConstantReturnType, Derived>
-        select(const DenseBase<ThenDerived>& thenMatrix,
-               const typename DenseBase<ThenDerived>::Scalar& elseScalar) const;
+  template <typename ThenDerived>
+  inline EIGEN_DEVICE_FUNC
+      CwiseTernaryOp<internal::scalar_boolean_select_op<typename DenseBase<ThenDerived>::Scalar,
+                                                        typename DenseBase<ThenDerived>::Scalar, Scalar>,
+                     ThenDerived, typename DenseBase<ThenDerived>::ConstantReturnType, Derived>
+      select(const DenseBase<ThenDerived>& thenMatrix, const typename DenseBase<ThenDerived>::Scalar& elseScalar) const;
 
-    template <typename ElseDerived>
-    inline EIGEN_DEVICE_FUNC
-        CwiseTernaryOp<internal::scalar_boolean_select_op<typename DenseBase<ElseDerived>::Scalar,
-                           typename DenseBase<ElseDerived>::Scalar, Scalar>,
-        typename DenseBase<ElseDerived>::ConstantReturnType, ElseDerived, Derived>
-        select(const typename DenseBase<ElseDerived>::Scalar& thenScalar,
-               const DenseBase<ElseDerived>& elseMatrix) const;
+  template <typename ElseDerived>
+  inline EIGEN_DEVICE_FUNC
+      CwiseTernaryOp<internal::scalar_boolean_select_op<typename DenseBase<ElseDerived>::Scalar,
+                                                        typename DenseBase<ElseDerived>::Scalar, Scalar>,
+                     typename DenseBase<ElseDerived>::ConstantReturnType, ElseDerived, Derived>
+      select(const typename DenseBase<ElseDerived>::Scalar& thenScalar, const DenseBase<ElseDerived>& elseMatrix) const;
 
-    template<int p> RealScalar lpNorm() const;
+  template <int p>
+  RealScalar lpNorm() const;
 
-    template<int RowFactor, int ColFactor>
-    EIGEN_DEVICE_FUNC
-    const Replicate<Derived,RowFactor,ColFactor> replicate() const;
-    /**
-    * \return an expression of the replication of \c *this
-    *
-    * Example: \include MatrixBase_replicate_int_int.cpp
-    * Output: \verbinclude MatrixBase_replicate_int_int.out
-    *
-    * \sa VectorwiseOp::replicate(), DenseBase::replicate<int,int>(), class Replicate
-    */
-    //Code moved here due to a CUDA compiler bug
-    EIGEN_DEVICE_FUNC
-    const Replicate<Derived, Dynamic, Dynamic> replicate(Index rowFactor, Index colFactor) const
-    {
-      return Replicate<Derived, Dynamic, Dynamic>(derived(), rowFactor, colFactor);
-    }
+  template <int RowFactor, int ColFactor>
+  EIGEN_DEVICE_FUNC const Replicate<Derived, RowFactor, ColFactor> replicate() const;
+  /**
+   * \return an expression of the replication of \c *this
+   *
+   * Example: \include MatrixBase_replicate_int_int.cpp
+   * Output: \verbinclude MatrixBase_replicate_int_int.out
+   *
+   * \sa VectorwiseOp::replicate(), DenseBase::replicate<int,int>(), class Replicate
+   */
+  // Code moved here due to a CUDA compiler bug
+  EIGEN_DEVICE_FUNC const Replicate<Derived, Dynamic, Dynamic> replicate(Index rowFactor, Index colFactor) const {
+    return Replicate<Derived, Dynamic, Dynamic>(derived(), rowFactor, colFactor);
+  }
 
-    typedef Reverse<Derived, BothDirections> ReverseReturnType;
-    typedef const Reverse<const Derived, BothDirections> ConstReverseReturnType;
-    EIGEN_DEVICE_FUNC ReverseReturnType reverse();
-    /** This is the const version of reverse(). */
-    //Code moved here due to a CUDA compiler bug
-    EIGEN_DEVICE_FUNC ConstReverseReturnType reverse() const
-    {
-      return ConstReverseReturnType(derived());
-    }
-    EIGEN_DEVICE_FUNC void reverseInPlace();
+  typedef Reverse<Derived, BothDirections> ReverseReturnType;
+  typedef const Reverse<const Derived, BothDirections> ConstReverseReturnType;
+  EIGEN_DEVICE_FUNC ReverseReturnType reverse();
+  /** This is the const version of reverse(). */
+  // Code moved here due to a CUDA compiler bug
+  EIGEN_DEVICE_FUNC ConstReverseReturnType reverse() const { return ConstReverseReturnType(derived()); }
+  EIGEN_DEVICE_FUNC void reverseInPlace();
 
-    #ifdef EIGEN_PARSED_BY_DOXYGEN
-    /** STL-like <a href="https://en.cppreference.com/w/cpp/named_req/RandomAccessIterator">RandomAccessIterator</a>
-      * iterator type as returned by the begin() and end() methods.
-      */
-    typedef random_access_iterator_type iterator;
-    /** This is the const version of iterator (aka read-only) */
-    typedef random_access_iterator_type const_iterator;
-    #else
-    typedef std::conditional_t< (Flags&DirectAccessBit)==DirectAccessBit,
-                                     internal::pointer_based_stl_iterator<Derived>,
-                                     internal::generic_randaccess_stl_iterator<Derived>
-                                   > iterator_type;
+#ifdef EIGEN_PARSED_BY_DOXYGEN
+  /** STL-like <a href="https://en.cppreference.com/w/cpp/named_req/RandomAccessIterator">RandomAccessIterator</a>
+   * iterator type as returned by the begin() and end() methods.
+   */
+  typedef random_access_iterator_type iterator;
+  /** This is the const version of iterator (aka read-only) */
+  typedef random_access_iterator_type const_iterator;
+#else
+  typedef std::conditional_t<(Flags & DirectAccessBit) == DirectAccessBit,
+                             internal::pointer_based_stl_iterator<Derived>,
+                             internal::generic_randaccess_stl_iterator<Derived> >
+      iterator_type;
 
-    typedef std::conditional_t< (Flags&DirectAccessBit)==DirectAccessBit,
-                                     internal::pointer_based_stl_iterator<const Derived>,
-                                     internal::generic_randaccess_stl_iterator<const Derived>
-                                   > const_iterator_type;
+  typedef std::conditional_t<(Flags & DirectAccessBit) == DirectAccessBit,
+                             internal::pointer_based_stl_iterator<const Derived>,
+                             internal::generic_randaccess_stl_iterator<const Derived> >
+      const_iterator_type;
 
-    // Stl-style iterators are supported only for vectors.
+  // Stl-style iterators are supported only for vectors.
 
-    typedef std::conditional_t<IsVectorAtCompileTime, iterator_type, void> iterator;
+  typedef std::conditional_t<IsVectorAtCompileTime, iterator_type, void> iterator;
 
-    typedef std::conditional_t<IsVectorAtCompileTime, const_iterator_type, void> const_iterator;
-    #endif
+  typedef std::conditional_t<IsVectorAtCompileTime, const_iterator_type, void> const_iterator;
+#endif
 
-    inline iterator begin();
-    inline const_iterator begin() const;
-    inline const_iterator cbegin() const;
-    inline iterator end();
-    inline const_iterator end() const;
-    inline const_iterator cend() const;
+  inline iterator begin();
+  inline const_iterator begin() const;
+  inline const_iterator cbegin() const;
+  inline iterator end();
+  inline const_iterator end() const;
+  inline const_iterator cend() const;
 
 #define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::DenseBase
 #define EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
 #define EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(COND)
-#define EIGEN_DOC_UNARY_ADDONS(X,Y)
-#   include "../plugins/CommonCwiseUnaryOps.inc"
-#   include "../plugins/BlockMethods.inc"
-#   include "../plugins/IndexedViewMethods.inc"
-#   include "../plugins/ReshapedMethods.inc"
-#   ifdef EIGEN_DENSEBASE_PLUGIN
-#     include EIGEN_DENSEBASE_PLUGIN
-#   endif
+#define EIGEN_DOC_UNARY_ADDONS(X, Y)
+#include "../plugins/CommonCwiseUnaryOps.inc"
+#include "../plugins/BlockMethods.inc"
+#include "../plugins/IndexedViewMethods.inc"
+#include "../plugins/ReshapedMethods.inc"
+#ifdef EIGEN_DENSEBASE_PLUGIN
+#include EIGEN_DENSEBASE_PLUGIN
+#endif
 #undef EIGEN_CURRENT_STORAGE_BASE_CLASS
 #undef EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
 #undef EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF
 #undef EIGEN_DOC_UNARY_ADDONS
 
-    // disable the use of evalTo for dense objects with a nice compilation error
-    template<typename Dest>
-    EIGEN_DEVICE_FUNC
-    inline void evalTo(Dest& ) const
-    {
-      EIGEN_STATIC_ASSERT((internal::is_same<Dest,void>::value),THE_EVAL_EVALTO_FUNCTION_SHOULD_NEVER_BE_CALLED_FOR_DENSE_OBJECTS);
-    }
+  // disable the use of evalTo for dense objects with a nice compilation error
+  template <typename Dest>
+  EIGEN_DEVICE_FUNC inline void evalTo(Dest&) const {
+    EIGEN_STATIC_ASSERT((internal::is_same<Dest, void>::value),
+                        THE_EVAL_EVALTO_FUNCTION_SHOULD_NEVER_BE_CALLED_FOR_DENSE_OBJECTS);
+  }
 
-  protected:
-    EIGEN_DEFAULT_COPY_CONSTRUCTOR(DenseBase)
-    /** Default constructor. Do nothing. */
-    EIGEN_DEVICE_FUNC constexpr DenseBase() {
-      /* Just checks for self-consistency of the flags.
-       * Only do it when debugging Eigen, as this borders on paranoia and could slow compilation down
-       */
+ protected:
+  EIGEN_DEFAULT_COPY_CONSTRUCTOR(DenseBase)
+  /** Default constructor. Do nothing. */
+  EIGEN_DEVICE_FUNC constexpr DenseBase() {
+    /* Just checks for self-consistency of the flags.
+     * Only do it when debugging Eigen, as this borders on paranoia and could slow compilation down
+     */
 #ifdef EIGEN_INTERNAL_DEBUGGING
-      EIGEN_STATIC_ASSERT((internal::check_implication(MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1, int(IsRowMajor))
-                        && internal::check_implication(MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1, int(!IsRowMajor))),
-                          INVALID_STORAGE_ORDER_FOR_THIS_VECTOR_EXPRESSION)
+    EIGEN_STATIC_ASSERT(
+        (internal::check_implication(MaxRowsAtCompileTime == 1 && MaxColsAtCompileTime != 1, int(IsRowMajor)) &&
+         internal::check_implication(MaxColsAtCompileTime == 1 && MaxRowsAtCompileTime != 1, int(!IsRowMajor))),
+        INVALID_STORAGE_ORDER_FOR_THIS_VECTOR_EXPRESSION)
 #endif
-    }
+  }
 
-  private:
-    EIGEN_DEVICE_FUNC explicit DenseBase(int);
-    EIGEN_DEVICE_FUNC DenseBase(int,int);
-    template<typename OtherDerived> EIGEN_DEVICE_FUNC explicit DenseBase(const DenseBase<OtherDerived>&);
+ private:
+  EIGEN_DEVICE_FUNC explicit DenseBase(int);
+  EIGEN_DEVICE_FUNC DenseBase(int, int);
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC explicit DenseBase(const DenseBase<OtherDerived>&);
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_DENSEBASE_H
+#endif  // EIGEN_DENSEBASE_H
diff --git a/Eigen/src/Core/DenseCoeffsBase.h b/Eigen/src/Core/DenseCoeffsBase.h
index 93a2965..48c6d73 100644
--- a/Eigen/src/Core/DenseCoeffsBase.h
+++ b/Eigen/src/Core/DenseCoeffsBase.h
@@ -16,673 +16,553 @@
 namespace Eigen {
 
 namespace internal {
-template<typename T> struct add_const_on_value_type_if_arithmetic
-{
+template <typename T>
+struct add_const_on_value_type_if_arithmetic {
   typedef std::conditional_t<is_arithmetic<T>::value, T, add_const_on_value_type_t<T>> type;
 };
-}
+}  // namespace internal
 
 /** \brief Base class providing read-only coefficient access to matrices and arrays.
-  * \ingroup Core_Module
-  * \tparam Derived Type of the derived class
-  *
-  * \note #ReadOnlyAccessors Constant indicating read-only access
-  *
-  * This class defines the \c operator() \c const function and friends, which can be used to read specific
-  * entries of a matrix or array.
-  *
-  * \sa DenseCoeffsBase<Derived, WriteAccessors>, DenseCoeffsBase<Derived, DirectAccessors>,
-  *     \ref TopicClassHierarchy
-  */
-template<typename Derived>
-class DenseCoeffsBase<Derived,ReadOnlyAccessors> : public EigenBase<Derived>
-{
-  public:
-    typedef typename internal::traits<Derived>::StorageKind StorageKind;
-    typedef typename internal::traits<Derived>::Scalar Scalar;
-    typedef typename internal::packet_traits<Scalar>::type PacketScalar;
+ * \ingroup Core_Module
+ * \tparam Derived Type of the derived class
+ *
+ * \note #ReadOnlyAccessors Constant indicating read-only access
+ *
+ * This class defines the \c operator() \c const function and friends, which can be used to read specific
+ * entries of a matrix or array.
+ *
+ * \sa DenseCoeffsBase<Derived, WriteAccessors>, DenseCoeffsBase<Derived, DirectAccessors>,
+ *     \ref TopicClassHierarchy
+ */
+template <typename Derived>
+class DenseCoeffsBase<Derived, ReadOnlyAccessors> : public EigenBase<Derived> {
+ public:
+  typedef typename internal::traits<Derived>::StorageKind StorageKind;
+  typedef typename internal::traits<Derived>::Scalar Scalar;
+  typedef typename internal::packet_traits<Scalar>::type PacketScalar;
 
-    // Explanation for this CoeffReturnType typedef.
-    // - This is the return type of the coeff() method.
-    // - The LvalueBit means exactly that we can offer a coeffRef() method, which means exactly that we can get references
-    // to coeffs, which means exactly that we can have coeff() return a const reference (as opposed to returning a value).
-    // - The is_arithmetic check is required since "const int", "const double", etc. will cause warnings on some systems
-    // while the declaration of "const T", where T is a non arithmetic type does not. Always returning "const Scalar&" is
-    // not possible, since the underlying expressions might not offer a valid address the reference could be referring to.
-    typedef std::conditional_t<bool(internal::traits<Derived>::Flags&LvalueBit),
-                const Scalar&,
-                std::conditional_t<internal::is_arithmetic<Scalar>::value, Scalar, const Scalar>
-            > CoeffReturnType;
+  // Explanation for this CoeffReturnType typedef.
+  // - This is the return type of the coeff() method.
+  // - The LvalueBit means exactly that we can offer a coeffRef() method, which means exactly that we can get references
+  // to coeffs, which means exactly that we can have coeff() return a const reference (as opposed to returning a value).
+  // - The is_arithmetic check is required since "const int", "const double", etc. will cause warnings on some systems
+  // while the declaration of "const T", where T is a non arithmetic type does not. Always returning "const Scalar&" is
+  // not possible, since the underlying expressions might not offer a valid address the reference could be referring to.
+  typedef std::conditional_t<bool(internal::traits<Derived>::Flags& LvalueBit), const Scalar&,
+                             std::conditional_t<internal::is_arithmetic<Scalar>::value, Scalar, const Scalar>>
+      CoeffReturnType;
 
-    typedef typename internal::add_const_on_value_type_if_arithmetic<
-                         typename internal::packet_traits<Scalar>::type
-                     >::type PacketReturnType;
+  typedef typename internal::add_const_on_value_type_if_arithmetic<typename internal::packet_traits<Scalar>::type>::type
+      PacketReturnType;
 
-    typedef EigenBase<Derived> Base;
-    using Base::rows;
-    using Base::cols;
-    using Base::size;
-    using Base::derived;
+  typedef EigenBase<Derived> Base;
+  using Base::cols;
+  using Base::derived;
+  using Base::rows;
+  using Base::size;
 
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Index rowIndexByOuterInner(Index outer, Index inner) const
-    {
-      return int(Derived::RowsAtCompileTime) == 1 ? 0
-          : int(Derived::ColsAtCompileTime) == 1 ? inner
-          : int(Derived::Flags)&RowMajorBit ? outer
-          : inner;
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index rowIndexByOuterInner(Index outer, Index inner) const {
+    return int(Derived::RowsAtCompileTime) == 1   ? 0
+           : int(Derived::ColsAtCompileTime) == 1 ? inner
+           : int(Derived::Flags) & RowMajorBit    ? outer
+                                                  : inner;
+  }
 
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Index colIndexByOuterInner(Index outer, Index inner) const
-    {
-      return int(Derived::ColsAtCompileTime) == 1 ? 0
-          : int(Derived::RowsAtCompileTime) == 1 ? inner
-          : int(Derived::Flags)&RowMajorBit ? inner
-          : outer;
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index colIndexByOuterInner(Index outer, Index inner) const {
+    return int(Derived::ColsAtCompileTime) == 1   ? 0
+           : int(Derived::RowsAtCompileTime) == 1 ? inner
+           : int(Derived::Flags) & RowMajorBit    ? inner
+                                                  : outer;
+  }
 
-    /** Short version: don't use this function, use
-      * \link operator()(Index,Index) const \endlink instead.
-      *
-      * Long version: this function is similar to
-      * \link operator()(Index,Index) const \endlink, but without the assertion.
-      * Use this for limiting the performance cost of debugging code when doing
-      * repeated coefficient access. Only use this when it is guaranteed that the
-      * parameters \a row and \a col are in range.
-      *
-      * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this
-      * function equivalent to \link operator()(Index,Index) const \endlink.
-      *
-      * \sa operator()(Index,Index) const, coeffRef(Index,Index), coeff(Index) const
-      */
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const
-    {
-      eigen_internal_assert(row >= 0 && row < rows()
-                         && col >= 0 && col < cols());
-      return internal::evaluator<Derived>(derived()).coeff(row,col);
-    }
+  /** Short version: don't use this function, use
+   * \link operator()(Index,Index) const \endlink instead.
+   *
+   * Long version: this function is similar to
+   * \link operator()(Index,Index) const \endlink, but without the assertion.
+   * Use this for limiting the performance cost of debugging code when doing
+   * repeated coefficient access. Only use this when it is guaranteed that the
+   * parameters \a row and \a col are in range.
+   *
+   * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this
+   * function equivalent to \link operator()(Index,Index) const \endlink.
+   *
+   * \sa operator()(Index,Index) const, coeffRef(Index,Index), coeff(Index) const
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const {
+    eigen_internal_assert(row >= 0 && row < rows() && col >= 0 && col < cols());
+    return internal::evaluator<Derived>(derived()).coeff(row, col);
+  }
 
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE CoeffReturnType coeffByOuterInner(Index outer, Index inner) const
-    {
-      return coeff(rowIndexByOuterInner(outer, inner),
-                   colIndexByOuterInner(outer, inner));
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeffByOuterInner(Index outer, Index inner) const {
+    return coeff(rowIndexByOuterInner(outer, inner), colIndexByOuterInner(outer, inner));
+  }
 
-    /** \returns the coefficient at given the given row and column.
-      *
-      * \sa operator()(Index,Index), operator[](Index)
-      */
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE CoeffReturnType operator()(Index row, Index col) const
-    {
-      eigen_assert(row >= 0 && row < rows()
-          && col >= 0 && col < cols());
-      return coeff(row, col);
-    }
+  /** \returns the coefficient at given the given row and column.
+   *
+   * \sa operator()(Index,Index), operator[](Index)
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType operator()(Index row, Index col) const {
+    eigen_assert(row >= 0 && row < rows() && col >= 0 && col < cols());
+    return coeff(row, col);
+  }
 
-    /** Short version: don't use this function, use
-      * \link operator[](Index) const \endlink instead.
-      *
-      * Long version: this function is similar to
-      * \link operator[](Index) const \endlink, but without the assertion.
-      * Use this for limiting the performance cost of debugging code when doing
-      * repeated coefficient access. Only use this when it is guaranteed that the
-      * parameter \a index is in range.
-      *
-      * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this
-      * function equivalent to \link operator[](Index) const \endlink.
-      *
-      * \sa operator[](Index) const, coeffRef(Index), coeff(Index,Index) const
-      */
+  /** Short version: don't use this function, use
+   * \link operator[](Index) const \endlink instead.
+   *
+   * Long version: this function is similar to
+   * \link operator[](Index) const \endlink, but without the assertion.
+   * Use this for limiting the performance cost of debugging code when doing
+   * repeated coefficient access. Only use this when it is guaranteed that the
+   * parameter \a index is in range.
+   *
+   * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this
+   * function equivalent to \link operator[](Index) const \endlink.
+   *
+   * \sa operator[](Index) const, coeffRef(Index), coeff(Index,Index) const
+   */
 
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE CoeffReturnType
-    coeff(Index index) const
-    {
-      EIGEN_STATIC_ASSERT(internal::evaluator<Derived>::Flags & LinearAccessBit,
-                          THIS_COEFFICIENT_ACCESSOR_TAKING_ONE_ACCESS_IS_ONLY_FOR_EXPRESSIONS_ALLOWING_LINEAR_ACCESS)
-      eigen_internal_assert(index >= 0 && index < size());
-      return internal::evaluator<Derived>(derived()).coeff(index);
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
+    EIGEN_STATIC_ASSERT(internal::evaluator<Derived>::Flags & LinearAccessBit,
+                        THIS_COEFFICIENT_ACCESSOR_TAKING_ONE_ACCESS_IS_ONLY_FOR_EXPRESSIONS_ALLOWING_LINEAR_ACCESS)
+    eigen_internal_assert(index >= 0 && index < size());
+    return internal::evaluator<Derived>(derived()).coeff(index);
+  }
 
+  /** \returns the coefficient at given index.
+   *
+   * This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit.
+   *
+   * \sa operator[](Index), operator()(Index,Index) const, x() const, y() const,
+   * z() const, w() const
+   */
 
-    /** \returns the coefficient at given index.
-      *
-      * This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit.
-      *
-      * \sa operator[](Index), operator()(Index,Index) const, x() const, y() const,
-      * z() const, w() const
-      */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType operator[](Index index) const {
+    EIGEN_STATIC_ASSERT(Derived::IsVectorAtCompileTime,
+                        THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD)
+    eigen_assert(index >= 0 && index < size());
+    return coeff(index);
+  }
 
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE CoeffReturnType
-    operator[](Index index) const
-    {
-      EIGEN_STATIC_ASSERT(Derived::IsVectorAtCompileTime,
-                          THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD)
-      eigen_assert(index >= 0 && index < size());
-      return coeff(index);
-    }
+  /** \returns the coefficient at given index.
+   *
+   * This is synonymous to operator[](Index) const.
+   *
+   * This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit.
+   *
+   * \sa operator[](Index), operator()(Index,Index) const, x() const, y() const,
+   * z() const, w() const
+   */
 
-    /** \returns the coefficient at given index.
-      *
-      * This is synonymous to operator[](Index) const.
-      *
-      * This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit.
-      *
-      * \sa operator[](Index), operator()(Index,Index) const, x() const, y() const,
-      * z() const, w() const
-      */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType operator()(Index index) const {
+    eigen_assert(index >= 0 && index < size());
+    return coeff(index);
+  }
 
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE CoeffReturnType
-    operator()(Index index) const
-    {
-      eigen_assert(index >= 0 && index < size());
-      return coeff(index);
-    }
+  /** equivalent to operator[](0).  */
 
-    /** equivalent to operator[](0).  */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType x() const { return (*this)[0]; }
 
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE CoeffReturnType
-    x() const { return (*this)[0]; }
+  /** equivalent to operator[](1).  */
 
-    /** equivalent to operator[](1).  */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType y() const {
+    EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime == -1 || Derived::SizeAtCompileTime >= 2, OUT_OF_RANGE_ACCESS);
+    return (*this)[1];
+  }
 
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE CoeffReturnType
-    y() const
-    {
-      EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=2, OUT_OF_RANGE_ACCESS);
-      return (*this)[1];
-    }
+  /** equivalent to operator[](2).  */
 
-    /** equivalent to operator[](2).  */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType z() const {
+    EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime == -1 || Derived::SizeAtCompileTime >= 3, OUT_OF_RANGE_ACCESS);
+    return (*this)[2];
+  }
 
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE CoeffReturnType
-    z() const
-    {
-      EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=3, OUT_OF_RANGE_ACCESS);
-      return (*this)[2];
-    }
+  /** equivalent to operator[](3).  */
 
-    /** equivalent to operator[](3).  */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType w() const {
+    EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime == -1 || Derived::SizeAtCompileTime >= 4, OUT_OF_RANGE_ACCESS);
+    return (*this)[3];
+  }
 
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE CoeffReturnType
-    w() const
-    {
-      EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=4, OUT_OF_RANGE_ACCESS);
-      return (*this)[3];
-    }
+  /** \internal
+   * \returns the packet of coefficients starting at the given row and column. It is your responsibility
+   * to ensure that a packet really starts there. This method is only available on expressions having the
+   * PacketAccessBit.
+   *
+   * The \a LoadMode parameter may have the value \a #Aligned or \a #Unaligned. Its effect is to select
+   * the appropriate vectorization instruction. Aligned access is faster, but is only possible for packets
+   * starting at an address which is a multiple of the packet size.
+   */
 
-    /** \internal
-      * \returns the packet of coefficients starting at the given row and column. It is your responsibility
-      * to ensure that a packet really starts there. This method is only available on expressions having the
-      * PacketAccessBit.
-      *
-      * The \a LoadMode parameter may have the value \a #Aligned or \a #Unaligned. Its effect is to select
-      * the appropriate vectorization instruction. Aligned access is faster, but is only possible for packets
-      * starting at an address which is a multiple of the packet size.
-      */
+  template <int LoadMode>
+  EIGEN_STRONG_INLINE PacketReturnType packet(Index row, Index col) const {
+    typedef typename internal::packet_traits<Scalar>::type DefaultPacketType;
+    eigen_internal_assert(row >= 0 && row < rows() && col >= 0 && col < cols());
+    return internal::evaluator<Derived>(derived()).template packet<LoadMode, DefaultPacketType>(row, col);
+  }
 
-    template<int LoadMode>
-    EIGEN_STRONG_INLINE PacketReturnType packet(Index row, Index col) const
-    {
-      typedef typename internal::packet_traits<Scalar>::type DefaultPacketType;
-      eigen_internal_assert(row >= 0 && row < rows() && col >= 0 && col < cols());
-      return internal::evaluator<Derived>(derived()).template packet<LoadMode,DefaultPacketType>(row,col);
-    }
+  /** \internal */
+  template <int LoadMode>
+  EIGEN_STRONG_INLINE PacketReturnType packetByOuterInner(Index outer, Index inner) const {
+    return packet<LoadMode>(rowIndexByOuterInner(outer, inner), colIndexByOuterInner(outer, inner));
+  }
 
+  /** \internal
+   * \returns the packet of coefficients starting at the given index. It is your responsibility
+   * to ensure that a packet really starts there. This method is only available on expressions having the
+   * PacketAccessBit and the LinearAccessBit.
+   *
+   * The \a LoadMode parameter may have the value \a #Aligned or \a #Unaligned. Its effect is to select
+   * the appropriate vectorization instruction. Aligned access is faster, but is only possible for packets
+   * starting at an address which is a multiple of the packet size.
+   */
 
-    /** \internal */
-    template<int LoadMode>
-    EIGEN_STRONG_INLINE PacketReturnType packetByOuterInner(Index outer, Index inner) const
-    {
-      return packet<LoadMode>(rowIndexByOuterInner(outer, inner),
-                              colIndexByOuterInner(outer, inner));
-    }
+  template <int LoadMode>
+  EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const {
+    EIGEN_STATIC_ASSERT(internal::evaluator<Derived>::Flags & LinearAccessBit,
+                        THIS_COEFFICIENT_ACCESSOR_TAKING_ONE_ACCESS_IS_ONLY_FOR_EXPRESSIONS_ALLOWING_LINEAR_ACCESS)
+    typedef typename internal::packet_traits<Scalar>::type DefaultPacketType;
+    eigen_internal_assert(index >= 0 && index < size());
+    return internal::evaluator<Derived>(derived()).template packet<LoadMode, DefaultPacketType>(index);
+  }
 
-    /** \internal
-      * \returns the packet of coefficients starting at the given index. It is your responsibility
-      * to ensure that a packet really starts there. This method is only available on expressions having the
-      * PacketAccessBit and the LinearAccessBit.
-      *
-      * The \a LoadMode parameter may have the value \a #Aligned or \a #Unaligned. Its effect is to select
-      * the appropriate vectorization instruction. Aligned access is faster, but is only possible for packets
-      * starting at an address which is a multiple of the packet size.
-      */
-
-    template<int LoadMode>
-    EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const
-    {
-      EIGEN_STATIC_ASSERT(internal::evaluator<Derived>::Flags & LinearAccessBit,
-                          THIS_COEFFICIENT_ACCESSOR_TAKING_ONE_ACCESS_IS_ONLY_FOR_EXPRESSIONS_ALLOWING_LINEAR_ACCESS)
-      typedef typename internal::packet_traits<Scalar>::type DefaultPacketType;
-      eigen_internal_assert(index >= 0 && index < size());
-      return internal::evaluator<Derived>(derived()).template packet<LoadMode,DefaultPacketType>(index);
-    }
-
-  protected:
-    // explanation: DenseBase is doing "using ..." on the methods from DenseCoeffsBase.
-    // But some methods are only available in the DirectAccess case.
-    // So we add dummy methods here with these names, so that "using... " doesn't fail.
-    // It's not private so that the child class DenseBase can access them, and it's not public
-    // either since it's an implementation detail, so has to be protected.
-    void coeffRef();
-    void coeffRefByOuterInner();
-    void writePacket();
-    void writePacketByOuterInner();
-    void copyCoeff();
-    void copyCoeffByOuterInner();
-    void copyPacket();
-    void copyPacketByOuterInner();
-    void stride();
-    void innerStride();
-    void outerStride();
-    void rowStride();
-    void colStride();
+ protected:
+  // explanation: DenseBase is doing "using ..." on the methods from DenseCoeffsBase.
+  // But some methods are only available in the DirectAccess case.
+  // So we add dummy methods here with these names, so that "using... " doesn't fail.
+  // It's not private so that the child class DenseBase can access them, and it's not public
+  // either since it's an implementation detail, so has to be protected.
+  void coeffRef();
+  void coeffRefByOuterInner();
+  void writePacket();
+  void writePacketByOuterInner();
+  void copyCoeff();
+  void copyCoeffByOuterInner();
+  void copyPacket();
+  void copyPacketByOuterInner();
+  void stride();
+  void innerStride();
+  void outerStride();
+  void rowStride();
+  void colStride();
 };
 
 /** \brief Base class providing read/write coefficient access to matrices and arrays.
-  * \ingroup Core_Module
-  * \tparam Derived Type of the derived class
-  *
-  * \note #WriteAccessors Constant indicating read/write access
-  *
-  * This class defines the non-const \c operator() function and friends, which can be used to write specific
-  * entries of a matrix or array. This class inherits DenseCoeffsBase<Derived, ReadOnlyAccessors> which
-  * defines the const variant for reading specific entries.
-  *
-  * \sa DenseCoeffsBase<Derived, DirectAccessors>, \ref TopicClassHierarchy
-  */
-template<typename Derived>
-class DenseCoeffsBase<Derived, WriteAccessors> : public DenseCoeffsBase<Derived, ReadOnlyAccessors>
-{
-  public:
+ * \ingroup Core_Module
+ * \tparam Derived Type of the derived class
+ *
+ * \note #WriteAccessors Constant indicating read/write access
+ *
+ * This class defines the non-const \c operator() function and friends, which can be used to write specific
+ * entries of a matrix or array. This class inherits DenseCoeffsBase<Derived, ReadOnlyAccessors> which
+ * defines the const variant for reading specific entries.
+ *
+ * \sa DenseCoeffsBase<Derived, DirectAccessors>, \ref TopicClassHierarchy
+ */
+template <typename Derived>
+class DenseCoeffsBase<Derived, WriteAccessors> : public DenseCoeffsBase<Derived, ReadOnlyAccessors> {
+ public:
+  typedef DenseCoeffsBase<Derived, ReadOnlyAccessors> Base;
 
-    typedef DenseCoeffsBase<Derived, ReadOnlyAccessors> Base;
+  typedef typename internal::traits<Derived>::StorageKind StorageKind;
+  typedef typename internal::traits<Derived>::Scalar Scalar;
+  typedef typename internal::packet_traits<Scalar>::type PacketScalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
 
-    typedef typename internal::traits<Derived>::StorageKind StorageKind;
-    typedef typename internal::traits<Derived>::Scalar Scalar;
-    typedef typename internal::packet_traits<Scalar>::type PacketScalar;
-    typedef typename NumTraits<Scalar>::Real RealScalar;
+  using Base::coeff;
+  using Base::colIndexByOuterInner;
+  using Base::cols;
+  using Base::derived;
+  using Base::rowIndexByOuterInner;
+  using Base::rows;
+  using Base::size;
+  using Base::operator[];
+  using Base::operator();
+  using Base::w;
+  using Base::x;
+  using Base::y;
+  using Base::z;
 
-    using Base::coeff;
-    using Base::rows;
-    using Base::cols;
-    using Base::size;
-    using Base::derived;
-    using Base::rowIndexByOuterInner;
-    using Base::colIndexByOuterInner;
-    using Base::operator[];
-    using Base::operator();
-    using Base::x;
-    using Base::y;
-    using Base::z;
-    using Base::w;
+  /** Short version: don't use this function, use
+   * \link operator()(Index,Index) \endlink instead.
+   *
+   * Long version: this function is similar to
+   * \link operator()(Index,Index) \endlink, but without the assertion.
+   * Use this for limiting the performance cost of debugging code when doing
+   * repeated coefficient access. Only use this when it is guaranteed that the
+   * parameters \a row and \a col are in range.
+   *
+   * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this
+   * function equivalent to \link operator()(Index,Index) \endlink.
+   *
+   * \sa operator()(Index,Index), coeff(Index, Index) const, coeffRef(Index)
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index row, Index col) {
+    eigen_internal_assert(row >= 0 && row < rows() && col >= 0 && col < cols());
+    return internal::evaluator<Derived>(derived()).coeffRef(row, col);
+  }
 
-    /** Short version: don't use this function, use
-      * \link operator()(Index,Index) \endlink instead.
-      *
-      * Long version: this function is similar to
-      * \link operator()(Index,Index) \endlink, but without the assertion.
-      * Use this for limiting the performance cost of debugging code when doing
-      * repeated coefficient access. Only use this when it is guaranteed that the
-      * parameters \a row and \a col are in range.
-      *
-      * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this
-      * function equivalent to \link operator()(Index,Index) \endlink.
-      *
-      * \sa operator()(Index,Index), coeff(Index, Index) const, coeffRef(Index)
-      */
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Scalar& coeffRef(Index row, Index col)
-    {
-      eigen_internal_assert(row >= 0 && row < rows()
-                         && col >= 0 && col < cols());
-      return internal::evaluator<Derived>(derived()).coeffRef(row,col);
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRefByOuterInner(Index outer, Index inner) {
+    return coeffRef(rowIndexByOuterInner(outer, inner), colIndexByOuterInner(outer, inner));
+  }
 
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Scalar&
-    coeffRefByOuterInner(Index outer, Index inner)
-    {
-      return coeffRef(rowIndexByOuterInner(outer, inner),
-                      colIndexByOuterInner(outer, inner));
-    }
+  /** \returns a reference to the coefficient at given the given row and column.
+   *
+   * \sa operator[](Index)
+   */
 
-    /** \returns a reference to the coefficient at given the given row and column.
-      *
-      * \sa operator[](Index)
-      */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator()(Index row, Index col) {
+    eigen_assert(row >= 0 && row < rows() && col >= 0 && col < cols());
+    return coeffRef(row, col);
+  }
 
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Scalar&
-    operator()(Index row, Index col)
-    {
-      eigen_assert(row >= 0 && row < rows()
-          && col >= 0 && col < cols());
-      return coeffRef(row, col);
-    }
+  /** Short version: don't use this function, use
+   * \link operator[](Index) \endlink instead.
+   *
+   * Long version: this function is similar to
+   * \link operator[](Index) \endlink, but without the assertion.
+   * Use this for limiting the performance cost of debugging code when doing
+   * repeated coefficient access. Only use this when it is guaranteed that the
+   * parameters \a row and \a col are in range.
+   *
+   * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this
+   * function equivalent to \link operator[](Index) \endlink.
+   *
+   * \sa operator[](Index), coeff(Index) const, coeffRef(Index,Index)
+   */
 
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index index) {
+    EIGEN_STATIC_ASSERT(internal::evaluator<Derived>::Flags & LinearAccessBit,
+                        THIS_COEFFICIENT_ACCESSOR_TAKING_ONE_ACCESS_IS_ONLY_FOR_EXPRESSIONS_ALLOWING_LINEAR_ACCESS)
+    eigen_internal_assert(index >= 0 && index < size());
+    return internal::evaluator<Derived>(derived()).coeffRef(index);
+  }
 
-    /** Short version: don't use this function, use
-      * \link operator[](Index) \endlink instead.
-      *
-      * Long version: this function is similar to
-      * \link operator[](Index) \endlink, but without the assertion.
-      * Use this for limiting the performance cost of debugging code when doing
-      * repeated coefficient access. Only use this when it is guaranteed that the
-      * parameters \a row and \a col are in range.
-      *
-      * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this
-      * function equivalent to \link operator[](Index) \endlink.
-      *
-      * \sa operator[](Index), coeff(Index) const, coeffRef(Index,Index)
-      */
+  /** \returns a reference to the coefficient at given index.
+   *
+   * This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit.
+   *
+   * \sa operator[](Index) const, operator()(Index,Index), x(), y(), z(), w()
+   */
 
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Scalar&
-    coeffRef(Index index)
-    {
-      EIGEN_STATIC_ASSERT(internal::evaluator<Derived>::Flags & LinearAccessBit,
-                          THIS_COEFFICIENT_ACCESSOR_TAKING_ONE_ACCESS_IS_ONLY_FOR_EXPRESSIONS_ALLOWING_LINEAR_ACCESS)
-      eigen_internal_assert(index >= 0 && index < size());
-      return internal::evaluator<Derived>(derived()).coeffRef(index);
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator[](Index index) {
+    EIGEN_STATIC_ASSERT(Derived::IsVectorAtCompileTime,
+                        THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD)
+    eigen_assert(index >= 0 && index < size());
+    return coeffRef(index);
+  }
 
-    /** \returns a reference to the coefficient at given index.
-      *
-      * This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit.
-      *
-      * \sa operator[](Index) const, operator()(Index,Index), x(), y(), z(), w()
-      */
+  /** \returns a reference to the coefficient at given index.
+   *
+   * This is synonymous to operator[](Index).
+   *
+   * This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit.
+   *
+   * \sa operator[](Index) const, operator()(Index,Index), x(), y(), z(), w()
+   */
 
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Scalar&
-    operator[](Index index)
-    {
-      EIGEN_STATIC_ASSERT(Derived::IsVectorAtCompileTime,
-                          THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD)
-      eigen_assert(index >= 0 && index < size());
-      return coeffRef(index);
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator()(Index index) {
+    eigen_assert(index >= 0 && index < size());
+    return coeffRef(index);
+  }
 
-    /** \returns a reference to the coefficient at given index.
-      *
-      * This is synonymous to operator[](Index).
-      *
-      * This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit.
-      *
-      * \sa operator[](Index) const, operator()(Index,Index), x(), y(), z(), w()
-      */
+  /** equivalent to operator[](0).  */
 
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Scalar&
-    operator()(Index index)
-    {
-      eigen_assert(index >= 0 && index < size());
-      return coeffRef(index);
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& x() { return (*this)[0]; }
 
-    /** equivalent to operator[](0).  */
+  /** equivalent to operator[](1).  */
 
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Scalar&
-    x() { return (*this)[0]; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& y() {
+    EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime == -1 || Derived::SizeAtCompileTime >= 2, OUT_OF_RANGE_ACCESS);
+    return (*this)[1];
+  }
 
-    /** equivalent to operator[](1).  */
+  /** equivalent to operator[](2).  */
 
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Scalar&
-    y()
-    {
-      EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=2, OUT_OF_RANGE_ACCESS);
-      return (*this)[1];
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& z() {
+    EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime == -1 || Derived::SizeAtCompileTime >= 3, OUT_OF_RANGE_ACCESS);
+    return (*this)[2];
+  }
 
-    /** equivalent to operator[](2).  */
+  /** equivalent to operator[](3).  */
 
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Scalar&
-    z()
-    {
-      EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=3, OUT_OF_RANGE_ACCESS);
-      return (*this)[2];
-    }
-
-    /** equivalent to operator[](3).  */
-
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Scalar&
-    w()
-    {
-      EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=4, OUT_OF_RANGE_ACCESS);
-      return (*this)[3];
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& w() {
+    EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime == -1 || Derived::SizeAtCompileTime >= 4, OUT_OF_RANGE_ACCESS);
+    return (*this)[3];
+  }
 };
 
 /** \brief Base class providing direct read-only coefficient access to matrices and arrays.
-  * \ingroup Core_Module
-  * \tparam Derived Type of the derived class
-  *
-  * \note #DirectAccessors Constant indicating direct access
-  *
-  * This class defines functions to work with strides which can be used to access entries directly. This class
-  * inherits DenseCoeffsBase<Derived, ReadOnlyAccessors> which defines functions to access entries read-only using
-  * \c operator() .
-  *
-  * \sa \blank \ref TopicClassHierarchy
-  */
-template<typename Derived>
-class DenseCoeffsBase<Derived, DirectAccessors> : public DenseCoeffsBase<Derived, ReadOnlyAccessors>
-{
-  public:
+ * \ingroup Core_Module
+ * \tparam Derived Type of the derived class
+ *
+ * \note #DirectAccessors Constant indicating direct access
+ *
+ * This class defines functions to work with strides which can be used to access entries directly. This class
+ * inherits DenseCoeffsBase<Derived, ReadOnlyAccessors> which defines functions to access entries read-only using
+ * \c operator() .
+ *
+ * \sa \blank \ref TopicClassHierarchy
+ */
+template <typename Derived>
+class DenseCoeffsBase<Derived, DirectAccessors> : public DenseCoeffsBase<Derived, ReadOnlyAccessors> {
+ public:
+  typedef DenseCoeffsBase<Derived, ReadOnlyAccessors> Base;
+  typedef typename internal::traits<Derived>::Scalar Scalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
 
-    typedef DenseCoeffsBase<Derived, ReadOnlyAccessors> Base;
-    typedef typename internal::traits<Derived>::Scalar Scalar;
-    typedef typename NumTraits<Scalar>::Real RealScalar;
+  using Base::cols;
+  using Base::derived;
+  using Base::rows;
+  using Base::size;
 
-    using Base::rows;
-    using Base::cols;
-    using Base::size;
-    using Base::derived;
+  /** \returns the pointer increment between two consecutive elements within a slice in the inner direction.
+   *
+   * \sa outerStride(), rowStride(), colStride()
+   */
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index innerStride() const { return derived().innerStride(); }
 
-    /** \returns the pointer increment between two consecutive elements within a slice in the inner direction.
-      *
-      * \sa outerStride(), rowStride(), colStride()
-      */
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index innerStride() const
-    {
-      return derived().innerStride();
-    }
+  /** \returns the pointer increment between two consecutive inner slices (for example, between two consecutive columns
+   *          in a column-major matrix).
+   *
+   * \sa innerStride(), rowStride(), colStride()
+   */
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index outerStride() const { return derived().outerStride(); }
 
-    /** \returns the pointer increment between two consecutive inner slices (for example, between two consecutive columns
-      *          in a column-major matrix).
-      *
-      * \sa innerStride(), rowStride(), colStride()
-      */
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index outerStride() const
-    {
-      return derived().outerStride();
-    }
+  // FIXME shall we remove it ?
+  EIGEN_CONSTEXPR inline Index stride() const { return Derived::IsVectorAtCompileTime ? innerStride() : outerStride(); }
 
-    // FIXME shall we remove it ?
-    EIGEN_CONSTEXPR inline Index stride() const
-    {
-      return Derived::IsVectorAtCompileTime ? innerStride() : outerStride();
-    }
+  /** \returns the pointer increment between two consecutive rows.
+   *
+   * \sa innerStride(), outerStride(), colStride()
+   */
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index rowStride() const {
+    return Derived::IsRowMajor ? outerStride() : innerStride();
+  }
 
-    /** \returns the pointer increment between two consecutive rows.
-      *
-      * \sa innerStride(), outerStride(), colStride()
-      */
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index rowStride() const
-    {
-      return Derived::IsRowMajor ? outerStride() : innerStride();
-    }
-
-    /** \returns the pointer increment between two consecutive columns.
-      *
-      * \sa innerStride(), outerStride(), rowStride()
-      */
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index colStride() const
-    {
-      return Derived::IsRowMajor ? innerStride() : outerStride();
-    }
+  /** \returns the pointer increment between two consecutive columns.
+   *
+   * \sa innerStride(), outerStride(), rowStride()
+   */
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index colStride() const {
+    return Derived::IsRowMajor ? innerStride() : outerStride();
+  }
 };
 
 /** \brief Base class providing direct read/write coefficient access to matrices and arrays.
-  * \ingroup Core_Module
-  * \tparam Derived Type of the derived class
-  *
-  * \note #DirectWriteAccessors Constant indicating direct access
-  *
-  * This class defines functions to work with strides which can be used to access entries directly. This class
-  * inherits DenseCoeffsBase<Derived, WriteAccessors> which defines functions to access entries read/write using
-  * \c operator().
-  *
-  * \sa \blank \ref TopicClassHierarchy
-  */
-template<typename Derived>
-class DenseCoeffsBase<Derived, DirectWriteAccessors>
-  : public DenseCoeffsBase<Derived, WriteAccessors>
-{
-  public:
+ * \ingroup Core_Module
+ * \tparam Derived Type of the derived class
+ *
+ * \note #DirectWriteAccessors Constant indicating direct access
+ *
+ * This class defines functions to work with strides which can be used to access entries directly. This class
+ * inherits DenseCoeffsBase<Derived, WriteAccessors> which defines functions to access entries read/write using
+ * \c operator().
+ *
+ * \sa \blank \ref TopicClassHierarchy
+ */
+template <typename Derived>
+class DenseCoeffsBase<Derived, DirectWriteAccessors> : public DenseCoeffsBase<Derived, WriteAccessors> {
+ public:
+  typedef DenseCoeffsBase<Derived, WriteAccessors> Base;
+  typedef typename internal::traits<Derived>::Scalar Scalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
 
-    typedef DenseCoeffsBase<Derived, WriteAccessors> Base;
-    typedef typename internal::traits<Derived>::Scalar Scalar;
-    typedef typename NumTraits<Scalar>::Real RealScalar;
+  using Base::cols;
+  using Base::derived;
+  using Base::rows;
+  using Base::size;
 
-    using Base::rows;
-    using Base::cols;
-    using Base::size;
-    using Base::derived;
+  /** \returns the pointer increment between two consecutive elements within a slice in the inner direction.
+   *
+   * \sa outerStride(), rowStride(), colStride()
+   */
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index innerStride() const EIGEN_NOEXCEPT { return derived().innerStride(); }
 
-    /** \returns the pointer increment between two consecutive elements within a slice in the inner direction.
-      *
-      * \sa outerStride(), rowStride(), colStride()
-      */
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index innerStride() const EIGEN_NOEXCEPT
-    {
-      return derived().innerStride();
-    }
+  /** \returns the pointer increment between two consecutive inner slices (for example, between two consecutive columns
+   *          in a column-major matrix).
+   *
+   * \sa innerStride(), rowStride(), colStride()
+   */
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index outerStride() const EIGEN_NOEXCEPT { return derived().outerStride(); }
 
-    /** \returns the pointer increment between two consecutive inner slices (for example, between two consecutive columns
-      *          in a column-major matrix).
-      *
-      * \sa innerStride(), rowStride(), colStride()
-      */
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index outerStride() const EIGEN_NOEXCEPT
-    {
-      return derived().outerStride();
-    }
+  // FIXME shall we remove it ?
+  EIGEN_CONSTEXPR inline Index stride() const EIGEN_NOEXCEPT {
+    return Derived::IsVectorAtCompileTime ? innerStride() : outerStride();
+  }
 
-    // FIXME shall we remove it ?
-    EIGEN_CONSTEXPR inline Index stride() const EIGEN_NOEXCEPT
-    {
-      return Derived::IsVectorAtCompileTime ? innerStride() : outerStride();
-    }
+  /** \returns the pointer increment between two consecutive rows.
+   *
+   * \sa innerStride(), outerStride(), colStride()
+   */
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index rowStride() const EIGEN_NOEXCEPT {
+    return Derived::IsRowMajor ? outerStride() : innerStride();
+  }
 
-    /** \returns the pointer increment between two consecutive rows.
-      *
-      * \sa innerStride(), outerStride(), colStride()
-      */
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index rowStride() const EIGEN_NOEXCEPT
-    {
-      return Derived::IsRowMajor ? outerStride() : innerStride();
-    }
-
-    /** \returns the pointer increment between two consecutive columns.
-      *
-      * \sa innerStride(), outerStride(), rowStride()
-      */
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index colStride() const EIGEN_NOEXCEPT
-    {
-      return Derived::IsRowMajor ? innerStride() : outerStride();
-    }
+  /** \returns the pointer increment between two consecutive columns.
+   *
+   * \sa innerStride(), outerStride(), rowStride()
+   */
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index colStride() const EIGEN_NOEXCEPT {
+    return Derived::IsRowMajor ? innerStride() : outerStride();
+  }
 };
 
 namespace internal {
 
-template<int Alignment, typename Derived, bool JustReturnZero>
-struct first_aligned_impl
-{
-  static EIGEN_CONSTEXPR inline Index run(const Derived&) EIGEN_NOEXCEPT
-  { return 0; }
+template <int Alignment, typename Derived, bool JustReturnZero>
+struct first_aligned_impl {
+  static EIGEN_CONSTEXPR inline Index run(const Derived&) EIGEN_NOEXCEPT { return 0; }
 };
 
-template<int Alignment, typename Derived>
-struct first_aligned_impl<Alignment, Derived, false>
-{
-  static inline Index run(const Derived& m)
-  {
-    return internal::first_aligned<Alignment>(m.data(), m.size());
-  }
+template <int Alignment, typename Derived>
+struct first_aligned_impl<Alignment, Derived, false> {
+  static inline Index run(const Derived& m) { return internal::first_aligned<Alignment>(m.data(), m.size()); }
 };
 
-/** \internal \returns the index of the first element of the array stored by \a m that is properly aligned with respect to \a Alignment for vectorization.
-  *
-  * \tparam Alignment requested alignment in Bytes.
-  *
-  * There is also the variant first_aligned(const Scalar*, Integer) defined in Memory.h. See it for more
-  * documentation.
-  */
-template<int Alignment, typename Derived>
-static inline Index first_aligned(const DenseBase<Derived>& m)
-{
+/** \internal \returns the index of the first element of the array stored by \a m that is properly aligned with respect
+ * to \a Alignment for vectorization.
+ *
+ * \tparam Alignment requested alignment in Bytes.
+ *
+ * There is also the variant first_aligned(const Scalar*, Integer) defined in Memory.h. See it for more
+ * documentation.
+ */
+template <int Alignment, typename Derived>
+static inline Index first_aligned(const DenseBase<Derived>& m) {
   enum { ReturnZero = (int(evaluator<Derived>::Alignment) >= Alignment) || !(Derived::Flags & DirectAccessBit) };
   return first_aligned_impl<Alignment, Derived, ReturnZero>::run(m.derived());
 }
 
-template<typename Derived>
-static inline Index first_default_aligned(const DenseBase<Derived>& m)
-{
+template <typename Derived>
+static inline Index first_default_aligned(const DenseBase<Derived>& m) {
   typedef typename Derived::Scalar Scalar;
   typedef typename packet_traits<Scalar>::type DefaultPacketType;
-  return internal::first_aligned<int(unpacket_traits<DefaultPacketType>::alignment),Derived>(m);
+  return internal::first_aligned<int(unpacket_traits<DefaultPacketType>::alignment), Derived>(m);
 }
 
-template<typename Derived, bool HasDirectAccess = has_direct_access<Derived>::ret>
-struct inner_stride_at_compile_time
-{
+template <typename Derived, bool HasDirectAccess = has_direct_access<Derived>::ret>
+struct inner_stride_at_compile_time {
   enum { ret = traits<Derived>::InnerStrideAtCompileTime };
 };
 
-template<typename Derived>
-struct inner_stride_at_compile_time<Derived, false>
-{
+template <typename Derived>
+struct inner_stride_at_compile_time<Derived, false> {
   enum { ret = 0 };
 };
 
-template<typename Derived, bool HasDirectAccess = has_direct_access<Derived>::ret>
-struct outer_stride_at_compile_time
-{
+template <typename Derived, bool HasDirectAccess = has_direct_access<Derived>::ret>
+struct outer_stride_at_compile_time {
   enum { ret = traits<Derived>::OuterStrideAtCompileTime };
 };
 
-template<typename Derived>
-struct outer_stride_at_compile_time<Derived, false>
-{
+template <typename Derived>
+struct outer_stride_at_compile_time<Derived, false> {
   enum { ret = 0 };
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_DENSECOEFFSBASE_H
+#endif  // EIGEN_DENSECOEFFSBASE_H
diff --git a/Eigen/src/Core/DenseStorage.h b/Eigen/src/Core/DenseStorage.h
index b030378..f616939 100644
--- a/Eigen/src/Core/DenseStorage.h
+++ b/Eigen/src/Core/DenseStorage.h
@@ -13,9 +13,11 @@
 #define EIGEN_MATRIXSTORAGE_H
 
 #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
-  #define EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(X) X; EIGEN_DENSE_STORAGE_CTOR_PLUGIN;
+#define EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(X) \
+  X;                                                \
+  EIGEN_DENSE_STORAGE_CTOR_PLUGIN;
 #else
-  #define EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(X)
+#define EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(X)
 #endif
 
 // IWYU pragma: private
@@ -36,14 +38,12 @@
 }
 
 /** \internal
-  * Static array. If the MatrixOrArrayOptions require auto-alignment, the array will be automatically aligned:
-  * to 16 bytes boundary if the total size is a multiple of 16 bytes.
-  */
+ * Static array. If the MatrixOrArrayOptions require auto-alignment, the array will be automatically aligned:
+ * to 16 bytes boundary if the total size is a multiple of 16 bytes.
+ */
 template <typename T, int Size, int MatrixOrArrayOptions,
-          int Alignment = (MatrixOrArrayOptions&DontAlign) ? 0
-                        : compute_default_alignment<T,Size>::value >
-struct plain_array
-{
+          int Alignment = (MatrixOrArrayOptions & DontAlign) ? 0 : compute_default_alignment<T, Size>::value>
+struct plain_array {
   T array[Size];
 
   EIGEN_DEVICE_FUNC constexpr plain_array() { check_static_allocation_size<T, Size>(); }
@@ -54,23 +54,22 @@
 };
 
 #if defined(EIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT)
-  #define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask)
+#define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask)
 #else
-  #define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask) \
-    eigen_assert((internal::is_constant_evaluated() || (std::uintptr_t(array) & (sizemask)) == 0) \
-              && "this assertion is explained here: " \
-              "http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html" \
-              " **** READ THIS WEB PAGE !!! ****");
+#define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask)                                                \
+  eigen_assert((internal::is_constant_evaluated() || (std::uintptr_t(array) & (sizemask)) == 0) && \
+               "this assertion is explained here: "                                                \
+               "http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html"        \
+               " **** READ THIS WEB PAGE !!! ****");
 #endif
 
 template <typename T, int Size, int MatrixOrArrayOptions>
-struct plain_array<T, Size, MatrixOrArrayOptions, 8>
-{
+struct plain_array<T, Size, MatrixOrArrayOptions, 8> {
   EIGEN_ALIGN_TO_BOUNDARY(8) T array[Size];
 
   EIGEN_DEVICE_FUNC constexpr plain_array() {
     EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(7);
-    check_static_allocation_size<T,Size>();
+    check_static_allocation_size<T, Size>();
   }
 
   EIGEN_DEVICE_FUNC constexpr plain_array(constructor_without_unaligned_array_assert) {
@@ -79,13 +78,12 @@
 };
 
 template <typename T, int Size, int MatrixOrArrayOptions>
-struct plain_array<T, Size, MatrixOrArrayOptions, 16>
-{
+struct plain_array<T, Size, MatrixOrArrayOptions, 16> {
   EIGEN_ALIGN_TO_BOUNDARY(16) T array[Size];
 
   EIGEN_DEVICE_FUNC constexpr plain_array() {
     EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(15);
-    check_static_allocation_size<T,Size>();
+    check_static_allocation_size<T, Size>();
   }
 
   EIGEN_DEVICE_FUNC constexpr plain_array(constructor_without_unaligned_array_assert) {
@@ -94,13 +92,12 @@
 };
 
 template <typename T, int Size, int MatrixOrArrayOptions>
-struct plain_array<T, Size, MatrixOrArrayOptions, 32>
-{
+struct plain_array<T, Size, MatrixOrArrayOptions, 32> {
   EIGEN_ALIGN_TO_BOUNDARY(32) T array[Size];
 
   EIGEN_DEVICE_FUNC constexpr plain_array() {
     EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(31);
-    check_static_allocation_size<T,Size>();
+    check_static_allocation_size<T, Size>();
   }
 
   EIGEN_DEVICE_FUNC constexpr plain_array(constructor_without_unaligned_array_assert) {
@@ -109,13 +106,12 @@
 };
 
 template <typename T, int Size, int MatrixOrArrayOptions>
-struct plain_array<T, Size, MatrixOrArrayOptions, 64>
-{
+struct plain_array<T, Size, MatrixOrArrayOptions, 64> {
   EIGEN_ALIGN_TO_BOUNDARY(64) T array[Size];
 
   EIGEN_DEVICE_FUNC constexpr plain_array() {
     EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(63);
-    check_static_allocation_size<T,Size>();
+    check_static_allocation_size<T, Size>();
   }
 
   EIGEN_DEVICE_FUNC constexpr plain_array(constructor_without_unaligned_array_assert) {
@@ -124,25 +120,25 @@
 };
 
 template <typename T, int MatrixOrArrayOptions, int Alignment>
-struct plain_array<T, 0, MatrixOrArrayOptions, Alignment>
-{
+struct plain_array<T, 0, MatrixOrArrayOptions, Alignment> {
   T array[1];
   EIGEN_DEVICE_FUNC constexpr plain_array() {}
   EIGEN_DEVICE_FUNC constexpr plain_array(constructor_without_unaligned_array_assert) {}
 };
 
 struct plain_array_helper {
-  template<typename T, int Size, int MatrixOrArrayOptions, int Alignment>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  static void copy(const plain_array<T, Size, MatrixOrArrayOptions, Alignment>& src, const Eigen::Index size,
-                         plain_array<T, Size, MatrixOrArrayOptions, Alignment>& dst) {
+  template <typename T, int Size, int MatrixOrArrayOptions, int Alignment>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE static void copy(
+      const plain_array<T, Size, MatrixOrArrayOptions, Alignment>& src, const Eigen::Index size,
+      plain_array<T, Size, MatrixOrArrayOptions, Alignment>& dst) {
     smart_copy(src.array, src.array + size, dst.array);
   }
-  
-  template<typename T, int Size, int MatrixOrArrayOptions, int Alignment>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  static void swap(plain_array<T, Size, MatrixOrArrayOptions, Alignment>& a, const Eigen::Index a_size,
-                   plain_array<T, Size, MatrixOrArrayOptions, Alignment>& b, const Eigen::Index b_size) {
+
+  template <typename T, int Size, int MatrixOrArrayOptions, int Alignment>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE static void swap(plain_array<T, Size, MatrixOrArrayOptions, Alignment>& a,
+                                                         const Eigen::Index a_size,
+                                                         plain_array<T, Size, MatrixOrArrayOptions, Alignment>& b,
+                                                         const Eigen::Index b_size) {
     if (a_size < b_size) {
       std::swap_ranges(b.array, b.array + a_size, a.array);
       smart_move(b.array + a_size, b.array + b_size, a.array + a_size);
@@ -155,535 +151,500 @@
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \internal
-  *
-  * \class DenseStorage
-  * \ingroup Core_Module
-  *
-  * \brief Stores the data of a matrix
-  *
-  * This class stores the data of fixed-size, dynamic-size or mixed matrices
-  * in a way as compact as possible.
-  *
-  * \sa Matrix
-  */
-template<typename T, int Size, int Rows_, int Cols_, int Options_> class DenseStorage;
+ *
+ * \class DenseStorage
+ * \ingroup Core_Module
+ *
+ * \brief Stores the data of a matrix
+ *
+ * This class stores the data of fixed-size, dynamic-size or mixed matrices
+ * in a way as compact as possible.
+ *
+ * \sa Matrix
+ */
+template <typename T, int Size, int Rows_, int Cols_, int Options_>
+class DenseStorage;
 
 // purely fixed-size matrix
-template<typename T, int Size, int Rows_, int Cols_, int Options_> class DenseStorage
-{
-    internal::plain_array<T,Size,Options_> m_data;
-  public:
-    constexpr EIGEN_DEVICE_FUNC DenseStorage() {
-      EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(Index size = Size)
-    }
-    EIGEN_DEVICE_FUNC explicit constexpr DenseStorage(internal::constructor_without_unaligned_array_assert)
+template <typename T, int Size, int Rows_, int Cols_, int Options_>
+class DenseStorage {
+  internal::plain_array<T, Size, Options_> m_data;
+
+ public:
+  constexpr EIGEN_DEVICE_FUNC DenseStorage(){EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(
+      Index size =
+          Size)} EIGEN_DEVICE_FUNC explicit constexpr DenseStorage(internal::constructor_without_unaligned_array_assert)
       : m_data(internal::constructor_without_unaligned_array_assert()) {}
 #if defined(EIGEN_DENSE_STORAGE_CTOR_PLUGIN)
-    EIGEN_DEVICE_FUNC constexpr
-    DenseStorage(const DenseStorage& other) : m_data(other.m_data) {
-      EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(Index size = Size)
-    }
+  EIGEN_DEVICE_FUNC constexpr DenseStorage(const DenseStorage& other)
+      : m_data(other.m_data){EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(Index size = Size)}
 #else
-    EIGEN_DEVICE_FUNC constexpr DenseStorage(const DenseStorage&) = default;
+  EIGEN_DEVICE_FUNC constexpr DenseStorage(const DenseStorage&) = default;
 #endif
-    EIGEN_DEVICE_FUNC constexpr DenseStorage& operator=(const DenseStorage&) = default;
-    EIGEN_DEVICE_FUNC constexpr DenseStorage(DenseStorage&&) = default;
-    EIGEN_DEVICE_FUNC constexpr DenseStorage& operator=(DenseStorage&&) = default;
-    EIGEN_DEVICE_FUNC constexpr DenseStorage(Index size, Index rows, Index cols) {
-      EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({})
-      eigen_internal_assert(size == rows * cols && rows == Rows_ && cols == Cols_);
-      EIGEN_UNUSED_VARIABLE(size);
-      EIGEN_UNUSED_VARIABLE(rows);
-      EIGEN_UNUSED_VARIABLE(cols);
-    }
-    EIGEN_DEVICE_FUNC void swap(DenseStorage& other) {
-      numext::swap(m_data, other.m_data);
-    }
-    EIGEN_DEVICE_FUNC static constexpr Index rows(void) EIGEN_NOEXCEPT { return Rows_; }
-    EIGEN_DEVICE_FUNC static constexpr Index cols(void) EIGEN_NOEXCEPT { return Cols_; }
-    EIGEN_DEVICE_FUNC constexpr void conservativeResize(Index, Index, Index) {}
-    EIGEN_DEVICE_FUNC constexpr void resize(Index, Index, Index) {}
-    EIGEN_DEVICE_FUNC constexpr const T* data() const { return m_data.array; }
-    EIGEN_DEVICE_FUNC constexpr T* data() { return m_data.array; }
+        EIGEN_DEVICE_FUNC constexpr DenseStorage
+        &
+        operator=(const DenseStorage&) = default;
+  EIGEN_DEVICE_FUNC constexpr DenseStorage(DenseStorage&&) = default;
+  EIGEN_DEVICE_FUNC constexpr DenseStorage& operator=(DenseStorage&&) = default;
+  EIGEN_DEVICE_FUNC constexpr DenseStorage(Index size, Index rows, Index cols) {
+    EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({})
+    eigen_internal_assert(size == rows * cols && rows == Rows_ && cols == Cols_);
+    EIGEN_UNUSED_VARIABLE(size);
+    EIGEN_UNUSED_VARIABLE(rows);
+    EIGEN_UNUSED_VARIABLE(cols);
+  }
+  EIGEN_DEVICE_FUNC void swap(DenseStorage& other) { numext::swap(m_data, other.m_data); }
+  EIGEN_DEVICE_FUNC static constexpr Index rows(void) EIGEN_NOEXCEPT { return Rows_; }
+  EIGEN_DEVICE_FUNC static constexpr Index cols(void) EIGEN_NOEXCEPT { return Cols_; }
+  EIGEN_DEVICE_FUNC constexpr void conservativeResize(Index, Index, Index) {}
+  EIGEN_DEVICE_FUNC constexpr void resize(Index, Index, Index) {}
+  EIGEN_DEVICE_FUNC constexpr const T* data() const { return m_data.array; }
+  EIGEN_DEVICE_FUNC constexpr T* data() { return m_data.array; }
 };
 
 // null matrix
-template<typename T, int Rows_, int Cols_, int Options_>
-class DenseStorage<T, 0, Rows_, Cols_, Options_>
-{
-  public:
-    static_assert(Rows_ * Cols_ == 0, "The fixed number of rows times columns must equal the storage size.");
-    EIGEN_DEVICE_FUNC constexpr DenseStorage() {}
-    EIGEN_DEVICE_FUNC explicit constexpr DenseStorage(internal::constructor_without_unaligned_array_assert) {}
-    EIGEN_DEVICE_FUNC constexpr DenseStorage(const DenseStorage&) {}
-    EIGEN_DEVICE_FUNC constexpr DenseStorage& operator=(const DenseStorage&) { return *this; }
-    EIGEN_DEVICE_FUNC constexpr DenseStorage(Index,Index,Index) {}
-    EIGEN_DEVICE_FUNC constexpr void swap(DenseStorage& ) {}
-    EIGEN_DEVICE_FUNC static constexpr Index rows(void) EIGEN_NOEXCEPT {return Rows_;}
-    EIGEN_DEVICE_FUNC static constexpr Index cols(void) EIGEN_NOEXCEPT {return Cols_;}
-    EIGEN_DEVICE_FUNC constexpr void conservativeResize(Index,Index,Index) {}
-    EIGEN_DEVICE_FUNC constexpr void resize(Index,Index,Index) {}
-    EIGEN_DEVICE_FUNC constexpr const T *data() const { return 0; }
-    EIGEN_DEVICE_FUNC constexpr T *data() { return 0; }
+template <typename T, int Rows_, int Cols_, int Options_>
+class DenseStorage<T, 0, Rows_, Cols_, Options_> {
+ public:
+  static_assert(Rows_ * Cols_ == 0, "The fixed number of rows times columns must equal the storage size.");
+  EIGEN_DEVICE_FUNC constexpr DenseStorage() {}
+  EIGEN_DEVICE_FUNC explicit constexpr DenseStorage(internal::constructor_without_unaligned_array_assert) {}
+  EIGEN_DEVICE_FUNC constexpr DenseStorage(const DenseStorage&) {}
+  EIGEN_DEVICE_FUNC constexpr DenseStorage& operator=(const DenseStorage&) { return *this; }
+  EIGEN_DEVICE_FUNC constexpr DenseStorage(Index, Index, Index) {}
+  EIGEN_DEVICE_FUNC constexpr void swap(DenseStorage&) {}
+  EIGEN_DEVICE_FUNC static constexpr Index rows(void) EIGEN_NOEXCEPT { return Rows_; }
+  EIGEN_DEVICE_FUNC static constexpr Index cols(void) EIGEN_NOEXCEPT { return Cols_; }
+  EIGEN_DEVICE_FUNC constexpr void conservativeResize(Index, Index, Index) {}
+  EIGEN_DEVICE_FUNC constexpr void resize(Index, Index, Index) {}
+  EIGEN_DEVICE_FUNC constexpr const T* data() const { return 0; }
+  EIGEN_DEVICE_FUNC constexpr T* data() { return 0; }
 };
 
 // more specializations for null matrices; these are necessary to resolve ambiguities
-template<typename T, int Options_>
+template <typename T, int Options_>
 class DenseStorage<T, 0, Dynamic, Dynamic, Options_> {
-    Index m_rows;
-    Index m_cols;
-  public:
-    EIGEN_DEVICE_FUNC DenseStorage() : m_rows(0), m_cols(0) {}
-    EIGEN_DEVICE_FUNC explicit DenseStorage(internal::constructor_without_unaligned_array_assert) : DenseStorage() {}
-    EIGEN_DEVICE_FUNC DenseStorage(const DenseStorage& other) : m_rows(other.m_rows), m_cols(other.m_cols) {}
-    EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other) {
-      m_rows = other.m_rows;
-      m_cols = other.m_cols;
-      return *this;
-    }
-    EIGEN_DEVICE_FUNC DenseStorage(Index, Index rows, Index cols) : m_rows(rows), m_cols(cols) {
-      eigen_assert(m_rows * m_cols == 0 && "The number of rows times columns must equal the storage size.");
-    }
-    EIGEN_DEVICE_FUNC void swap(DenseStorage& other) {
-      numext::swap(m_rows,other.m_rows);
-      numext::swap(m_cols,other.m_cols);
-    }
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT {return m_rows;}
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT {return m_cols;}
-    EIGEN_DEVICE_FUNC void conservativeResize(Index, Index rows, Index cols) {
-      m_rows = rows;
-      m_cols = cols;
-      eigen_assert(m_rows * m_cols == 0 && "The number of rows times columns must equal the storage size.");
-    }
-    EIGEN_DEVICE_FUNC void resize(Index, Index rows, Index cols) {
-      m_rows = rows;
-      m_cols = cols;
-      eigen_assert(m_rows * m_cols == 0 && "The number of rows times columns must equal the storage size.");
-    }
-    EIGEN_DEVICE_FUNC const T *data() const { return nullptr; }
-    EIGEN_DEVICE_FUNC T *data() { return nullptr; }
+  Index m_rows;
+  Index m_cols;
+
+ public:
+  EIGEN_DEVICE_FUNC DenseStorage() : m_rows(0), m_cols(0) {}
+  EIGEN_DEVICE_FUNC explicit DenseStorage(internal::constructor_without_unaligned_array_assert) : DenseStorage() {}
+  EIGEN_DEVICE_FUNC DenseStorage(const DenseStorage& other) : m_rows(other.m_rows), m_cols(other.m_cols) {}
+  EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other) {
+    m_rows = other.m_rows;
+    m_cols = other.m_cols;
+    return *this;
+  }
+  EIGEN_DEVICE_FUNC DenseStorage(Index, Index rows, Index cols) : m_rows(rows), m_cols(cols) {
+    eigen_assert(m_rows * m_cols == 0 && "The number of rows times columns must equal the storage size.");
+  }
+  EIGEN_DEVICE_FUNC void swap(DenseStorage& other) {
+    numext::swap(m_rows, other.m_rows);
+    numext::swap(m_cols, other.m_cols);
+  }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_rows; }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_cols; }
+  EIGEN_DEVICE_FUNC void conservativeResize(Index, Index rows, Index cols) {
+    m_rows = rows;
+    m_cols = cols;
+    eigen_assert(m_rows * m_cols == 0 && "The number of rows times columns must equal the storage size.");
+  }
+  EIGEN_DEVICE_FUNC void resize(Index, Index rows, Index cols) {
+    m_rows = rows;
+    m_cols = cols;
+    eigen_assert(m_rows * m_cols == 0 && "The number of rows times columns must equal the storage size.");
+  }
+  EIGEN_DEVICE_FUNC const T* data() const { return nullptr; }
+  EIGEN_DEVICE_FUNC T* data() { return nullptr; }
 };
 
-template<typename T, int Rows_, int Options_>
+template <typename T, int Rows_, int Options_>
 class DenseStorage<T, 0, Rows_, Dynamic, Options_> {
-    Index m_cols;
-  public:
-    EIGEN_DEVICE_FUNC DenseStorage() : m_cols(0) {}
-    EIGEN_DEVICE_FUNC explicit DenseStorage(internal::constructor_without_unaligned_array_assert) : DenseStorage() {}
-    EIGEN_DEVICE_FUNC DenseStorage(const DenseStorage& other) : m_cols(other.m_cols) {}
-    EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other) {
-      m_cols = other.m_cols;
-      return *this;
-    }
-    EIGEN_DEVICE_FUNC DenseStorage(Index, Index, Index cols) : m_cols(cols) {
-      eigen_assert(Rows_ * m_cols == 0 && "The number of rows times columns must equal the storage size.");
-    }
-    EIGEN_DEVICE_FUNC void swap(DenseStorage& other) {
-      numext::swap(m_cols, other.m_cols);
-    }
-    EIGEN_DEVICE_FUNC static EIGEN_CONSTEXPR Index rows(void) EIGEN_NOEXCEPT {return Rows_;}
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index cols(void) const EIGEN_NOEXCEPT {return m_cols;}
-    EIGEN_DEVICE_FUNC void conservativeResize(Index, Index, Index cols) {
-      m_cols = cols;
-      eigen_assert(Rows_ * m_cols == 0 && "The number of rows times columns must equal the storage size.");
-    }
-    EIGEN_DEVICE_FUNC void resize(Index, Index, Index cols) {
-      m_cols = cols;
-      eigen_assert(Rows_ * m_cols == 0 && "The number of rows times columns must equal the storage size.");
-    }
-    EIGEN_DEVICE_FUNC const T *data() const { return nullptr; }
-    EIGEN_DEVICE_FUNC T *data() { return nullptr; }
+  Index m_cols;
+
+ public:
+  EIGEN_DEVICE_FUNC DenseStorage() : m_cols(0) {}
+  EIGEN_DEVICE_FUNC explicit DenseStorage(internal::constructor_without_unaligned_array_assert) : DenseStorage() {}
+  EIGEN_DEVICE_FUNC DenseStorage(const DenseStorage& other) : m_cols(other.m_cols) {}
+  EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other) {
+    m_cols = other.m_cols;
+    return *this;
+  }
+  EIGEN_DEVICE_FUNC DenseStorage(Index, Index, Index cols) : m_cols(cols) {
+    eigen_assert(Rows_ * m_cols == 0 && "The number of rows times columns must equal the storage size.");
+  }
+  EIGEN_DEVICE_FUNC void swap(DenseStorage& other) { numext::swap(m_cols, other.m_cols); }
+  EIGEN_DEVICE_FUNC static EIGEN_CONSTEXPR Index rows(void) EIGEN_NOEXCEPT { return Rows_; }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index cols(void) const EIGEN_NOEXCEPT { return m_cols; }
+  EIGEN_DEVICE_FUNC void conservativeResize(Index, Index, Index cols) {
+    m_cols = cols;
+    eigen_assert(Rows_ * m_cols == 0 && "The number of rows times columns must equal the storage size.");
+  }
+  EIGEN_DEVICE_FUNC void resize(Index, Index, Index cols) {
+    m_cols = cols;
+    eigen_assert(Rows_ * m_cols == 0 && "The number of rows times columns must equal the storage size.");
+  }
+  EIGEN_DEVICE_FUNC const T* data() const { return nullptr; }
+  EIGEN_DEVICE_FUNC T* data() { return nullptr; }
 };
 
-template<typename T, int Cols_, int Options_>
+template <typename T, int Cols_, int Options_>
 class DenseStorage<T, 0, Dynamic, Cols_, Options_> {
-    Index m_rows;
-  public:
-    EIGEN_DEVICE_FUNC DenseStorage() : m_rows(0) {}
-    EIGEN_DEVICE_FUNC explicit DenseStorage(internal::constructor_without_unaligned_array_assert) : DenseStorage() {}
-    EIGEN_DEVICE_FUNC DenseStorage(const DenseStorage& other) : m_rows(other.m_rows) {}
-    EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other) {
-      m_rows = other.m_rows;
-      return *this;
-    }
-    EIGEN_DEVICE_FUNC DenseStorage(Index, Index rows, Index) : m_rows(rows) {
-      eigen_assert(m_rows * Cols_ == 0 && "The number of rows times columns must equal the storage size.");
-    }
-    EIGEN_DEVICE_FUNC void swap(DenseStorage& other) {
-      numext::swap(m_rows, other.m_rows);
-    }
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index rows(void) const EIGEN_NOEXCEPT {return m_rows;}
-    EIGEN_DEVICE_FUNC static EIGEN_CONSTEXPR Index cols(void) EIGEN_NOEXCEPT {return Cols_;}
-    EIGEN_DEVICE_FUNC void conservativeResize(Index, Index rows, Index) {
-      m_rows = rows;
-      eigen_assert(m_rows * Cols_ == 0 && "The number of rows times columns must equal the storage size.");
-    }
-    EIGEN_DEVICE_FUNC void resize(Index, Index rows, Index) {
-      m_rows = rows;
-      eigen_assert(m_rows * Cols_ == 0 && "The number of rows times columns must equal the storage size.");
-    }
-    EIGEN_DEVICE_FUNC const T *data() const { return nullptr; }
-    EIGEN_DEVICE_FUNC T *data() { return nullptr; }
+  Index m_rows;
+
+ public:
+  EIGEN_DEVICE_FUNC DenseStorage() : m_rows(0) {}
+  EIGEN_DEVICE_FUNC explicit DenseStorage(internal::constructor_without_unaligned_array_assert) : DenseStorage() {}
+  EIGEN_DEVICE_FUNC DenseStorage(const DenseStorage& other) : m_rows(other.m_rows) {}
+  EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other) {
+    m_rows = other.m_rows;
+    return *this;
+  }
+  EIGEN_DEVICE_FUNC DenseStorage(Index, Index rows, Index) : m_rows(rows) {
+    eigen_assert(m_rows * Cols_ == 0 && "The number of rows times columns must equal the storage size.");
+  }
+  EIGEN_DEVICE_FUNC void swap(DenseStorage& other) { numext::swap(m_rows, other.m_rows); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index rows(void) const EIGEN_NOEXCEPT { return m_rows; }
+  EIGEN_DEVICE_FUNC static EIGEN_CONSTEXPR Index cols(void) EIGEN_NOEXCEPT { return Cols_; }
+  EIGEN_DEVICE_FUNC void conservativeResize(Index, Index rows, Index) {
+    m_rows = rows;
+    eigen_assert(m_rows * Cols_ == 0 && "The number of rows times columns must equal the storage size.");
+  }
+  EIGEN_DEVICE_FUNC void resize(Index, Index rows, Index) {
+    m_rows = rows;
+    eigen_assert(m_rows * Cols_ == 0 && "The number of rows times columns must equal the storage size.");
+  }
+  EIGEN_DEVICE_FUNC const T* data() const { return nullptr; }
+  EIGEN_DEVICE_FUNC T* data() { return nullptr; }
 };
 
 // dynamic-size matrix with fixed-size storage
-template<typename T, int Size, int Options_>
-class DenseStorage<T, Size, Dynamic, Dynamic, Options_>
-{
-    internal::plain_array<T,Size,Options_> m_data;
-    Index m_rows;
-    Index m_cols;
-  public:
-   EIGEN_DEVICE_FUNC constexpr DenseStorage() : m_data(), m_rows(0), m_cols(0) {}
-   EIGEN_DEVICE_FUNC explicit constexpr DenseStorage(internal::constructor_without_unaligned_array_assert)
-       : m_data(internal::constructor_without_unaligned_array_assert()), m_rows(0), m_cols(0) {}
-   EIGEN_DEVICE_FUNC constexpr DenseStorage(const DenseStorage& other)
-       : m_data(internal::constructor_without_unaligned_array_assert()), m_rows(other.m_rows), m_cols(other.m_cols) {
+template <typename T, int Size, int Options_>
+class DenseStorage<T, Size, Dynamic, Dynamic, Options_> {
+  internal::plain_array<T, Size, Options_> m_data;
+  Index m_rows;
+  Index m_cols;
+
+ public:
+  EIGEN_DEVICE_FUNC constexpr DenseStorage() : m_data(), m_rows(0), m_cols(0) {}
+  EIGEN_DEVICE_FUNC explicit constexpr DenseStorage(internal::constructor_without_unaligned_array_assert)
+      : m_data(internal::constructor_without_unaligned_array_assert()), m_rows(0), m_cols(0) {}
+  EIGEN_DEVICE_FUNC constexpr DenseStorage(const DenseStorage& other)
+      : m_data(internal::constructor_without_unaligned_array_assert()), m_rows(other.m_rows), m_cols(other.m_cols) {
     internal::plain_array_helper::copy(other.m_data, m_rows * m_cols, m_data);
-   }
-    EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other)
-    {
-      if (this != &other)
-      {
-        m_rows = other.m_rows;
-        m_cols = other.m_cols;
-        internal::plain_array_helper::copy(other.m_data, m_rows * m_cols, m_data);
-      }
-      return *this;
+  }
+  EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other) {
+    if (this != &other) {
+      m_rows = other.m_rows;
+      m_cols = other.m_cols;
+      internal::plain_array_helper::copy(other.m_data, m_rows * m_cols, m_data);
     }
-    EIGEN_DEVICE_FUNC constexpr DenseStorage(Index, Index rows, Index cols) : m_rows(rows), m_cols(cols) {}
-    EIGEN_DEVICE_FUNC void swap(DenseStorage& other)
-    {
-      internal::plain_array_helper::swap(m_data, m_rows * m_cols, other.m_data, other.m_rows * other.m_cols);
-      numext::swap(m_rows,other.m_rows);
-      numext::swap(m_cols,other.m_cols);
-    }
-    EIGEN_DEVICE_FUNC constexpr Index rows() const { return m_rows; }
-    EIGEN_DEVICE_FUNC constexpr Index cols() const { return m_cols; }
-    EIGEN_DEVICE_FUNC constexpr void conservativeResize(Index, Index rows, Index cols) {
-      m_rows = rows;
-      m_cols = cols;
-    }
-    EIGEN_DEVICE_FUNC constexpr void resize(Index, Index rows, Index cols) {
-      m_rows = rows;
-      m_cols = cols;
-    }
-    EIGEN_DEVICE_FUNC constexpr const T* data() const { return m_data.array; }
-    EIGEN_DEVICE_FUNC constexpr T* data() { return m_data.array; }
+    return *this;
+  }
+  EIGEN_DEVICE_FUNC constexpr DenseStorage(Index, Index rows, Index cols) : m_rows(rows), m_cols(cols) {}
+  EIGEN_DEVICE_FUNC void swap(DenseStorage& other) {
+    internal::plain_array_helper::swap(m_data, m_rows * m_cols, other.m_data, other.m_rows * other.m_cols);
+    numext::swap(m_rows, other.m_rows);
+    numext::swap(m_cols, other.m_cols);
+  }
+  EIGEN_DEVICE_FUNC constexpr Index rows() const { return m_rows; }
+  EIGEN_DEVICE_FUNC constexpr Index cols() const { return m_cols; }
+  EIGEN_DEVICE_FUNC constexpr void conservativeResize(Index, Index rows, Index cols) {
+    m_rows = rows;
+    m_cols = cols;
+  }
+  EIGEN_DEVICE_FUNC constexpr void resize(Index, Index rows, Index cols) {
+    m_rows = rows;
+    m_cols = cols;
+  }
+  EIGEN_DEVICE_FUNC constexpr const T* data() const { return m_data.array; }
+  EIGEN_DEVICE_FUNC constexpr T* data() { return m_data.array; }
 };
 
 // dynamic-size matrix with fixed-size storage and fixed width
-template<typename T, int Size, int Cols_, int Options_>
-class DenseStorage<T, Size, Dynamic, Cols_, Options_>
-{
-    internal::plain_array<T,Size,Options_> m_data;
-    Index m_rows;
-  public:
-   EIGEN_DEVICE_FUNC constexpr DenseStorage() : m_rows(0) {}
-   EIGEN_DEVICE_FUNC explicit constexpr DenseStorage(internal::constructor_without_unaligned_array_assert)
-       : m_data(internal::constructor_without_unaligned_array_assert()), m_rows(0) {}
-   EIGEN_DEVICE_FUNC constexpr DenseStorage(const DenseStorage& other)
-       : m_data(internal::constructor_without_unaligned_array_assert()), m_rows(other.m_rows) {
-      internal::plain_array_helper::copy(other.m_data, m_rows * Cols_, m_data);
-   }
+template <typename T, int Size, int Cols_, int Options_>
+class DenseStorage<T, Size, Dynamic, Cols_, Options_> {
+  internal::plain_array<T, Size, Options_> m_data;
+  Index m_rows;
 
-    EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other)
-    {
-      if (this != &other)
-      {
-        m_rows = other.m_rows;
-        internal::plain_array_helper::copy(other.m_data, m_rows * Cols_, m_data);
-      }
-      return *this;
+ public:
+  EIGEN_DEVICE_FUNC constexpr DenseStorage() : m_rows(0) {}
+  EIGEN_DEVICE_FUNC explicit constexpr DenseStorage(internal::constructor_without_unaligned_array_assert)
+      : m_data(internal::constructor_without_unaligned_array_assert()), m_rows(0) {}
+  EIGEN_DEVICE_FUNC constexpr DenseStorage(const DenseStorage& other)
+      : m_data(internal::constructor_without_unaligned_array_assert()), m_rows(other.m_rows) {
+    internal::plain_array_helper::copy(other.m_data, m_rows * Cols_, m_data);
+  }
+
+  EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other) {
+    if (this != &other) {
+      m_rows = other.m_rows;
+      internal::plain_array_helper::copy(other.m_data, m_rows * Cols_, m_data);
     }
-    EIGEN_DEVICE_FUNC constexpr DenseStorage(Index, Index rows, Index) : m_rows(rows) {}
-    EIGEN_DEVICE_FUNC void swap(DenseStorage& other)
-    { 
-      internal::plain_array_helper::swap(m_data, m_rows * Cols_, other.m_data, other.m_rows * Cols_);
-      numext::swap(m_rows, other.m_rows);
-    }
-    EIGEN_DEVICE_FUNC constexpr Index rows(void) const EIGEN_NOEXCEPT { return m_rows; }
-    EIGEN_DEVICE_FUNC constexpr Index cols(void) const EIGEN_NOEXCEPT { return Cols_; }
-    EIGEN_DEVICE_FUNC constexpr void conservativeResize(Index, Index rows, Index) { m_rows = rows; }
-    EIGEN_DEVICE_FUNC constexpr void resize(Index, Index rows, Index) { m_rows = rows; }
-    EIGEN_DEVICE_FUNC constexpr const T* data() const { return m_data.array; }
-    EIGEN_DEVICE_FUNC constexpr T* data() { return m_data.array; }
+    return *this;
+  }
+  EIGEN_DEVICE_FUNC constexpr DenseStorage(Index, Index rows, Index) : m_rows(rows) {}
+  EIGEN_DEVICE_FUNC void swap(DenseStorage& other) {
+    internal::plain_array_helper::swap(m_data, m_rows * Cols_, other.m_data, other.m_rows * Cols_);
+    numext::swap(m_rows, other.m_rows);
+  }
+  EIGEN_DEVICE_FUNC constexpr Index rows(void) const EIGEN_NOEXCEPT { return m_rows; }
+  EIGEN_DEVICE_FUNC constexpr Index cols(void) const EIGEN_NOEXCEPT { return Cols_; }
+  EIGEN_DEVICE_FUNC constexpr void conservativeResize(Index, Index rows, Index) { m_rows = rows; }
+  EIGEN_DEVICE_FUNC constexpr void resize(Index, Index rows, Index) { m_rows = rows; }
+  EIGEN_DEVICE_FUNC constexpr const T* data() const { return m_data.array; }
+  EIGEN_DEVICE_FUNC constexpr T* data() { return m_data.array; }
 };
 
 // dynamic-size matrix with fixed-size storage and fixed height
-template<typename T, int Size, int Rows_, int Options_>
-class DenseStorage<T, Size, Rows_, Dynamic, Options_>
-{
-    internal::plain_array<T,Size,Options_> m_data;
-    Index m_cols;
-  public:
-   EIGEN_DEVICE_FUNC constexpr DenseStorage() : m_cols(0) {}
-   EIGEN_DEVICE_FUNC explicit constexpr DenseStorage(internal::constructor_without_unaligned_array_assert)
-       : m_data(internal::constructor_without_unaligned_array_assert()), m_cols(0) {}
-   EIGEN_DEVICE_FUNC constexpr DenseStorage(const DenseStorage& other)
-       : m_data(internal::constructor_without_unaligned_array_assert()), m_cols(other.m_cols) {
+template <typename T, int Size, int Rows_, int Options_>
+class DenseStorage<T, Size, Rows_, Dynamic, Options_> {
+  internal::plain_array<T, Size, Options_> m_data;
+  Index m_cols;
+
+ public:
+  EIGEN_DEVICE_FUNC constexpr DenseStorage() : m_cols(0) {}
+  EIGEN_DEVICE_FUNC explicit constexpr DenseStorage(internal::constructor_without_unaligned_array_assert)
+      : m_data(internal::constructor_without_unaligned_array_assert()), m_cols(0) {}
+  EIGEN_DEVICE_FUNC constexpr DenseStorage(const DenseStorage& other)
+      : m_data(internal::constructor_without_unaligned_array_assert()), m_cols(other.m_cols) {
+    internal::plain_array_helper::copy(other.m_data, Rows_ * m_cols, m_data);
+  }
+  EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other) {
+    if (this != &other) {
+      m_cols = other.m_cols;
       internal::plain_array_helper::copy(other.m_data, Rows_ * m_cols, m_data);
-   }
-    EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other)
-    {
-      if (this != &other)
-      {
-        m_cols = other.m_cols;
-        internal::plain_array_helper::copy(other.m_data, Rows_ * m_cols, m_data);
-      }
-      return *this;
     }
-    EIGEN_DEVICE_FUNC DenseStorage(Index, Index, Index cols) : m_cols(cols) {}
-    EIGEN_DEVICE_FUNC void swap(DenseStorage& other) {
-      internal::plain_array_helper::swap(m_data, Rows_ * m_cols, other.m_data, Rows_ * other.m_cols);
-      numext::swap(m_cols, other.m_cols);
-    }
-    EIGEN_DEVICE_FUNC constexpr Index rows(void) const EIGEN_NOEXCEPT { return Rows_; }
-    EIGEN_DEVICE_FUNC constexpr Index cols(void) const EIGEN_NOEXCEPT { return m_cols; }
-    EIGEN_DEVICE_FUNC constexpr void conservativeResize(Index, Index, Index cols) { m_cols = cols; }
-    EIGEN_DEVICE_FUNC constexpr void resize(Index, Index, Index cols) { m_cols = cols; }
-    EIGEN_DEVICE_FUNC constexpr const T* data() const { return m_data.array; }
-    EIGEN_DEVICE_FUNC constexpr T* data() { return m_data.array; }
+    return *this;
+  }
+  EIGEN_DEVICE_FUNC DenseStorage(Index, Index, Index cols) : m_cols(cols) {}
+  EIGEN_DEVICE_FUNC void swap(DenseStorage& other) {
+    internal::plain_array_helper::swap(m_data, Rows_ * m_cols, other.m_data, Rows_ * other.m_cols);
+    numext::swap(m_cols, other.m_cols);
+  }
+  EIGEN_DEVICE_FUNC constexpr Index rows(void) const EIGEN_NOEXCEPT { return Rows_; }
+  EIGEN_DEVICE_FUNC constexpr Index cols(void) const EIGEN_NOEXCEPT { return m_cols; }
+  EIGEN_DEVICE_FUNC constexpr void conservativeResize(Index, Index, Index cols) { m_cols = cols; }
+  EIGEN_DEVICE_FUNC constexpr void resize(Index, Index, Index cols) { m_cols = cols; }
+  EIGEN_DEVICE_FUNC constexpr const T* data() const { return m_data.array; }
+  EIGEN_DEVICE_FUNC constexpr T* data() { return m_data.array; }
 };
 
 // purely dynamic matrix.
-template<typename T, int Options_>
-class DenseStorage<T, Dynamic, Dynamic, Dynamic, Options_>
-{
-    T *m_data;
-    Index m_rows;
-    Index m_cols;
-  public:
-   EIGEN_DEVICE_FUNC constexpr DenseStorage() : m_data(0), m_rows(0), m_cols(0) {}
-   EIGEN_DEVICE_FUNC explicit constexpr DenseStorage(internal::constructor_without_unaligned_array_assert)
-       : m_data(0), m_rows(0), m_cols(0) {}
-   EIGEN_DEVICE_FUNC DenseStorage(Index size, Index rows, Index cols)
-       : m_data(internal::conditional_aligned_new_auto<T, (Options_ & DontAlign) == 0>(size)),
-         m_rows(rows),
-         m_cols(cols) {
+template <typename T, int Options_>
+class DenseStorage<T, Dynamic, Dynamic, Dynamic, Options_> {
+  T* m_data;
+  Index m_rows;
+  Index m_cols;
+
+ public:
+  EIGEN_DEVICE_FUNC constexpr DenseStorage() : m_data(0), m_rows(0), m_cols(0) {}
+  EIGEN_DEVICE_FUNC explicit constexpr DenseStorage(internal::constructor_without_unaligned_array_assert)
+      : m_data(0), m_rows(0), m_cols(0) {}
+  EIGEN_DEVICE_FUNC DenseStorage(Index size, Index rows, Index cols)
+      : m_data(internal::conditional_aligned_new_auto<T, (Options_ & DontAlign) == 0>(size)),
+        m_rows(rows),
+        m_cols(cols) {
+    EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({})
+    eigen_internal_assert(size == rows * cols && rows >= 0 && cols >= 0);
+  }
+  EIGEN_DEVICE_FUNC DenseStorage(const DenseStorage& other)
+      : m_data(internal::conditional_aligned_new_auto<T, (Options_ & DontAlign) == 0>(other.m_rows * other.m_cols)),
+        m_rows(other.m_rows),
+        m_cols(other.m_cols) {
+    EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(Index size = m_rows * m_cols)
+    internal::smart_copy(other.m_data, other.m_data + other.m_rows * other.m_cols, m_data);
+  }
+  EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other) {
+    if (this != &other) {
+      DenseStorage tmp(other);
+      this->swap(tmp);
+    }
+    return *this;
+  }
+  EIGEN_DEVICE_FUNC DenseStorage(DenseStorage&& other) EIGEN_NOEXCEPT : m_data(std::move(other.m_data)),
+                                                                        m_rows(std::move(other.m_rows)),
+                                                                        m_cols(std::move(other.m_cols)) {
+    other.m_data = nullptr;
+    other.m_rows = 0;
+    other.m_cols = 0;
+  }
+  EIGEN_DEVICE_FUNC DenseStorage& operator=(DenseStorage&& other) EIGEN_NOEXCEPT {
+    numext::swap(m_data, other.m_data);
+    numext::swap(m_rows, other.m_rows);
+    numext::swap(m_cols, other.m_cols);
+    return *this;
+  }
+  EIGEN_DEVICE_FUNC ~DenseStorage() {
+    internal::conditional_aligned_delete_auto<T, (Options_ & DontAlign) == 0>(m_data, m_rows * m_cols);
+  }
+  EIGEN_DEVICE_FUNC void swap(DenseStorage& other) {
+    numext::swap(m_data, other.m_data);
+    numext::swap(m_rows, other.m_rows);
+    numext::swap(m_cols, other.m_cols);
+  }
+  EIGEN_DEVICE_FUNC Index rows(void) const EIGEN_NOEXCEPT { return m_rows; }
+  EIGEN_DEVICE_FUNC Index cols(void) const EIGEN_NOEXCEPT { return m_cols; }
+  void conservativeResize(Index size, Index rows, Index cols) {
+    m_data =
+        internal::conditional_aligned_realloc_new_auto<T, (Options_ & DontAlign) == 0>(m_data, size, m_rows * m_cols);
+    m_rows = rows;
+    m_cols = cols;
+  }
+  EIGEN_DEVICE_FUNC void resize(Index size, Index rows, Index cols) {
+    if (size != m_rows * m_cols) {
+      internal::conditional_aligned_delete_auto<T, (Options_ & DontAlign) == 0>(m_data, m_rows * m_cols);
+      if (size > 0)  // >0 and not simply !=0 to let the compiler knows that size cannot be negative
+        m_data = internal::conditional_aligned_new_auto<T, (Options_ & DontAlign) == 0>(size);
+      else
+        m_data = 0;
       EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({})
-      eigen_internal_assert(size==rows*cols && rows>=0 && cols >=0);
-   }
-    EIGEN_DEVICE_FUNC DenseStorage(const DenseStorage& other)
-      : m_data(internal::conditional_aligned_new_auto<T,(Options_&DontAlign)==0>(other.m_rows*other.m_cols))
-      , m_rows(other.m_rows)
-      , m_cols(other.m_cols)
-    {
-      EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(Index size = m_rows*m_cols)
-      internal::smart_copy(other.m_data, other.m_data+other.m_rows*other.m_cols, m_data);
     }
-    EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other)
-    {
-      if (this != &other)
-      {
-        DenseStorage tmp(other);
-        this->swap(tmp);
-      }
-      return *this;
-    }
-    EIGEN_DEVICE_FUNC
-    DenseStorage(DenseStorage&& other) EIGEN_NOEXCEPT
-      : m_data(std::move(other.m_data))
-      , m_rows(std::move(other.m_rows))
-      , m_cols(std::move(other.m_cols))
-    {
-      other.m_data = nullptr;
-      other.m_rows = 0;
-      other.m_cols = 0;
-    }
-    EIGEN_DEVICE_FUNC
-    DenseStorage& operator=(DenseStorage&& other) EIGEN_NOEXCEPT
-    {
-      numext::swap(m_data, other.m_data);
-      numext::swap(m_rows, other.m_rows);
-      numext::swap(m_cols, other.m_cols);
-      return *this;
-    }
-    EIGEN_DEVICE_FUNC ~DenseStorage() { internal::conditional_aligned_delete_auto<T,(Options_&DontAlign)==0>(m_data, m_rows*m_cols); }
-    EIGEN_DEVICE_FUNC void swap(DenseStorage& other)
-    {
-      numext::swap(m_data,other.m_data);
-      numext::swap(m_rows,other.m_rows);
-      numext::swap(m_cols,other.m_cols);
-    }
-    EIGEN_DEVICE_FUNC Index rows(void) const EIGEN_NOEXCEPT {return m_rows;}
-    EIGEN_DEVICE_FUNC Index cols(void) const EIGEN_NOEXCEPT {return m_cols;}
-    void conservativeResize(Index size, Index rows, Index cols)
-    {
-      m_data = internal::conditional_aligned_realloc_new_auto<T,(Options_&DontAlign)==0>(m_data, size, m_rows*m_cols);
-      m_rows = rows;
-      m_cols = cols;
-    }
-    EIGEN_DEVICE_FUNC void resize(Index size, Index rows, Index cols)
-    {
-      if(size != m_rows*m_cols)
-      {
-        internal::conditional_aligned_delete_auto<T,(Options_&DontAlign)==0>(m_data, m_rows*m_cols);
-        if (size>0) // >0 and not simply !=0 to let the compiler knows that size cannot be negative
-          m_data = internal::conditional_aligned_new_auto<T,(Options_&DontAlign)==0>(size);
-        else
-          m_data = 0;
-        EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({})
-      }
-      m_rows = rows;
-      m_cols = cols;
-    }
-    EIGEN_DEVICE_FUNC const T *data() const { return m_data; }
-    EIGEN_DEVICE_FUNC T *data() { return m_data; }
+    m_rows = rows;
+    m_cols = cols;
+  }
+  EIGEN_DEVICE_FUNC const T* data() const { return m_data; }
+  EIGEN_DEVICE_FUNC T* data() { return m_data; }
 };
 
 // matrix with dynamic width and fixed height (so that matrix has dynamic size).
-template<typename T, int Rows_, int Options_>
+template <typename T, int Rows_, int Options_>
 class DenseStorage<T, Dynamic, Rows_, Dynamic, Options_> {
-    T *m_data;
-    Index m_cols;
-  public:
-   EIGEN_DEVICE_FUNC constexpr DenseStorage() : m_data(0), m_cols(0) {}
-   explicit constexpr DenseStorage(internal::constructor_without_unaligned_array_assert) : m_data(0), m_cols(0) {}
-   EIGEN_DEVICE_FUNC DenseStorage(Index size, Index rows, Index cols)
-       : m_data(internal::conditional_aligned_new_auto<T, (Options_ & DontAlign) == 0>(size)), m_cols(cols) {
+  T* m_data;
+  Index m_cols;
+
+ public:
+  EIGEN_DEVICE_FUNC constexpr DenseStorage() : m_data(0), m_cols(0) {}
+  explicit constexpr DenseStorage(internal::constructor_without_unaligned_array_assert) : m_data(0), m_cols(0) {}
+  EIGEN_DEVICE_FUNC DenseStorage(Index size, Index rows, Index cols)
+      : m_data(internal::conditional_aligned_new_auto<T, (Options_ & DontAlign) == 0>(size)), m_cols(cols) {
+    EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({})
+    eigen_internal_assert(size == rows * cols && rows == Rows_ && cols >= 0);
+    EIGEN_UNUSED_VARIABLE(rows);
+  }
+  EIGEN_DEVICE_FUNC DenseStorage(const DenseStorage& other)
+      : m_data(internal::conditional_aligned_new_auto<T, (Options_ & DontAlign) == 0>(Rows_ * other.m_cols)),
+        m_cols(other.m_cols) {
+    EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(Index size = m_cols * Rows_)
+    internal::smart_copy(other.m_data, other.m_data + Rows_ * m_cols, m_data);
+  }
+  EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other) {
+    if (this != &other) {
+      DenseStorage tmp(other);
+      this->swap(tmp);
+    }
+    return *this;
+  }
+  EIGEN_DEVICE_FUNC DenseStorage(DenseStorage&& other) EIGEN_NOEXCEPT : m_data(std::move(other.m_data)),
+                                                                        m_cols(std::move(other.m_cols)) {
+    other.m_data = nullptr;
+    other.m_cols = 0;
+  }
+  EIGEN_DEVICE_FUNC DenseStorage& operator=(DenseStorage&& other) EIGEN_NOEXCEPT {
+    numext::swap(m_data, other.m_data);
+    numext::swap(m_cols, other.m_cols);
+    return *this;
+  }
+  EIGEN_DEVICE_FUNC ~DenseStorage() {
+    internal::conditional_aligned_delete_auto<T, (Options_ & DontAlign) == 0>(m_data, Rows_ * m_cols);
+  }
+  EIGEN_DEVICE_FUNC void swap(DenseStorage& other) {
+    numext::swap(m_data, other.m_data);
+    numext::swap(m_cols, other.m_cols);
+  }
+  EIGEN_DEVICE_FUNC static constexpr Index rows(void) EIGEN_NOEXCEPT { return Rows_; }
+  EIGEN_DEVICE_FUNC Index cols(void) const EIGEN_NOEXCEPT { return m_cols; }
+  EIGEN_DEVICE_FUNC void conservativeResize(Index size, Index, Index cols) {
+    m_data =
+        internal::conditional_aligned_realloc_new_auto<T, (Options_ & DontAlign) == 0>(m_data, size, Rows_ * m_cols);
+    m_cols = cols;
+  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void resize(Index size, Index, Index cols) {
+    if (size != Rows_ * m_cols) {
+      internal::conditional_aligned_delete_auto<T, (Options_ & DontAlign) == 0>(m_data, Rows_ * m_cols);
+      if (size > 0)  // >0 and not simply !=0 to let the compiler knows that size cannot be negative
+        m_data = internal::conditional_aligned_new_auto<T, (Options_ & DontAlign) == 0>(size);
+      else
+        m_data = 0;
       EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({})
-      eigen_internal_assert(size==rows*cols && rows==Rows_ && cols >=0);
-      EIGEN_UNUSED_VARIABLE(rows);
-   }
-    EIGEN_DEVICE_FUNC DenseStorage(const DenseStorage& other)
-      : m_data(internal::conditional_aligned_new_auto<T,(Options_&DontAlign)==0>(Rows_*other.m_cols))
-      , m_cols(other.m_cols)
-    {
-      EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(Index size = m_cols*Rows_)
-      internal::smart_copy(other.m_data, other.m_data+Rows_*m_cols, m_data);
     }
-    EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other)
-    {
-      if (this != &other)
-      {
-        DenseStorage tmp(other);
-        this->swap(tmp);
-      }
-      return *this;
-    }
-    EIGEN_DEVICE_FUNC
-    DenseStorage(DenseStorage&& other) EIGEN_NOEXCEPT
-      : m_data(std::move(other.m_data))
-      , m_cols(std::move(other.m_cols))
-    {
-      other.m_data = nullptr;
-      other.m_cols = 0;
-    }
-    EIGEN_DEVICE_FUNC
-    DenseStorage& operator=(DenseStorage&& other) EIGEN_NOEXCEPT
-    {
-      numext::swap(m_data, other.m_data);
-      numext::swap(m_cols, other.m_cols);
-      return *this;
-    }
-    EIGEN_DEVICE_FUNC ~DenseStorage() { internal::conditional_aligned_delete_auto<T,(Options_&DontAlign)==0>(m_data, Rows_*m_cols); }
-    EIGEN_DEVICE_FUNC void swap(DenseStorage& other) {
-      numext::swap(m_data,other.m_data);
-      numext::swap(m_cols,other.m_cols);
-    }
-    EIGEN_DEVICE_FUNC static constexpr Index rows(void) EIGEN_NOEXCEPT { return Rows_; }
-    EIGEN_DEVICE_FUNC Index cols(void) const EIGEN_NOEXCEPT {return m_cols;}
-    EIGEN_DEVICE_FUNC void conservativeResize(Index size, Index, Index cols)
-    {
-      m_data = internal::conditional_aligned_realloc_new_auto<T,(Options_&DontAlign)==0>(m_data, size, Rows_*m_cols);
-      m_cols = cols;
-    }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void resize(Index size, Index, Index cols)
-    {
-      if(size != Rows_*m_cols)
-      {
-        internal::conditional_aligned_delete_auto<T,(Options_&DontAlign)==0>(m_data, Rows_*m_cols);
-        if (size>0) // >0 and not simply !=0 to let the compiler knows that size cannot be negative
-          m_data = internal::conditional_aligned_new_auto<T,(Options_&DontAlign)==0>(size);
-        else
-          m_data = 0;
-        EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({})
-      }
-      m_cols = cols;
-    }
-    EIGEN_DEVICE_FUNC const T *data() const { return m_data; }
-    EIGEN_DEVICE_FUNC T *data() { return m_data; }
+    m_cols = cols;
+  }
+  EIGEN_DEVICE_FUNC const T* data() const { return m_data; }
+  EIGEN_DEVICE_FUNC T* data() { return m_data; }
 };
 
 // matrix with dynamic height and fixed width (so that matrix has dynamic size).
-template<typename T, int Cols_, int Options_>
-class DenseStorage<T, Dynamic, Dynamic, Cols_, Options_>
-{
-    T *m_data;
-    Index m_rows;
-  public:
-   EIGEN_DEVICE_FUNC constexpr DenseStorage() : m_data(0), m_rows(0) {}
-   explicit constexpr DenseStorage(internal::constructor_without_unaligned_array_assert) : m_data(0), m_rows(0) {}
-   EIGEN_DEVICE_FUNC constexpr DenseStorage(Index size, Index rows, Index cols)
-       : m_data(internal::conditional_aligned_new_auto<T, (Options_ & DontAlign) == 0>(size)), m_rows(rows) {
+template <typename T, int Cols_, int Options_>
+class DenseStorage<T, Dynamic, Dynamic, Cols_, Options_> {
+  T* m_data;
+  Index m_rows;
+
+ public:
+  EIGEN_DEVICE_FUNC constexpr DenseStorage() : m_data(0), m_rows(0) {}
+  explicit constexpr DenseStorage(internal::constructor_without_unaligned_array_assert) : m_data(0), m_rows(0) {}
+  EIGEN_DEVICE_FUNC constexpr DenseStorage(Index size, Index rows, Index cols)
+      : m_data(internal::conditional_aligned_new_auto<T, (Options_ & DontAlign) == 0>(size)), m_rows(rows) {
+    EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({})
+    eigen_internal_assert(size == rows * cols && rows >= 0 && cols == Cols_);
+    EIGEN_UNUSED_VARIABLE(cols);
+  }
+  EIGEN_DEVICE_FUNC DenseStorage(const DenseStorage& other)
+      : m_data(internal::conditional_aligned_new_auto<T, (Options_ & DontAlign) == 0>(other.m_rows * Cols_)),
+        m_rows(other.m_rows) {
+    EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(Index size = m_rows * Cols_)
+    internal::smart_copy(other.m_data, other.m_data + other.m_rows * Cols_, m_data);
+  }
+  EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other) {
+    if (this != &other) {
+      DenseStorage tmp(other);
+      this->swap(tmp);
+    }
+    return *this;
+  }
+  EIGEN_DEVICE_FUNC DenseStorage(DenseStorage&& other) EIGEN_NOEXCEPT : m_data(std::move(other.m_data)),
+                                                                        m_rows(std::move(other.m_rows)) {
+    other.m_data = nullptr;
+    other.m_rows = 0;
+  }
+  EIGEN_DEVICE_FUNC DenseStorage& operator=(DenseStorage&& other) EIGEN_NOEXCEPT {
+    numext::swap(m_data, other.m_data);
+    numext::swap(m_rows, other.m_rows);
+    return *this;
+  }
+  EIGEN_DEVICE_FUNC ~DenseStorage() {
+    internal::conditional_aligned_delete_auto<T, (Options_ & DontAlign) == 0>(m_data, Cols_ * m_rows);
+  }
+  EIGEN_DEVICE_FUNC void swap(DenseStorage& other) {
+    numext::swap(m_data, other.m_data);
+    numext::swap(m_rows, other.m_rows);
+  }
+  EIGEN_DEVICE_FUNC Index rows(void) const EIGEN_NOEXCEPT { return m_rows; }
+  EIGEN_DEVICE_FUNC static constexpr Index cols(void) { return Cols_; }
+  void conservativeResize(Index size, Index rows, Index) {
+    m_data =
+        internal::conditional_aligned_realloc_new_auto<T, (Options_ & DontAlign) == 0>(m_data, size, m_rows * Cols_);
+    m_rows = rows;
+  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void resize(Index size, Index rows, Index) {
+    if (size != m_rows * Cols_) {
+      internal::conditional_aligned_delete_auto<T, (Options_ & DontAlign) == 0>(m_data, Cols_ * m_rows);
+      if (size > 0)  // >0 and not simply !=0 to let the compiler knows that size cannot be negative
+        m_data = internal::conditional_aligned_new_auto<T, (Options_ & DontAlign) == 0>(size);
+      else
+        m_data = 0;
       EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({})
-      eigen_internal_assert(size==rows*cols && rows>=0 && cols == Cols_);
-      EIGEN_UNUSED_VARIABLE(cols);
-   }
-    EIGEN_DEVICE_FUNC DenseStorage(const DenseStorage& other)
-      : m_data(internal::conditional_aligned_new_auto<T,(Options_&DontAlign)==0>(other.m_rows*Cols_))
-      , m_rows(other.m_rows)
-    {
-      EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(Index size = m_rows*Cols_)
-      internal::smart_copy(other.m_data, other.m_data+other.m_rows*Cols_, m_data);
     }
-    EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other)
-    {
-      if (this != &other)
-      {
-        DenseStorage tmp(other);
-        this->swap(tmp);
-      }
-      return *this;
-    }
-    EIGEN_DEVICE_FUNC
-    DenseStorage(DenseStorage&& other) EIGEN_NOEXCEPT
-      : m_data(std::move(other.m_data))
-      , m_rows(std::move(other.m_rows))
-    {
-      other.m_data = nullptr;
-      other.m_rows = 0;
-    }
-    EIGEN_DEVICE_FUNC
-    DenseStorage& operator=(DenseStorage&& other) EIGEN_NOEXCEPT
-    {
-      numext::swap(m_data, other.m_data);
-      numext::swap(m_rows, other.m_rows);
-      return *this;
-    }
-    EIGEN_DEVICE_FUNC ~DenseStorage() { internal::conditional_aligned_delete_auto<T,(Options_&DontAlign)==0>(m_data, Cols_*m_rows); }
-    EIGEN_DEVICE_FUNC void swap(DenseStorage& other) {
-      numext::swap(m_data,other.m_data);
-      numext::swap(m_rows,other.m_rows);
-    }
-    EIGEN_DEVICE_FUNC Index rows(void) const EIGEN_NOEXCEPT {return m_rows;}
-    EIGEN_DEVICE_FUNC static constexpr Index cols(void) { return Cols_; }
-    void conservativeResize(Index size, Index rows, Index)
-    {
-      m_data = internal::conditional_aligned_realloc_new_auto<T,(Options_&DontAlign)==0>(m_data, size, m_rows*Cols_);
-      m_rows = rows;
-    }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void resize(Index size, Index rows, Index)
-    {
-      if(size != m_rows*Cols_)
-      {
-        internal::conditional_aligned_delete_auto<T,(Options_&DontAlign)==0>(m_data, Cols_*m_rows);
-        if (size>0) // >0 and not simply !=0 to let the compiler knows that size cannot be negative
-          m_data = internal::conditional_aligned_new_auto<T,(Options_&DontAlign)==0>(size);
-        else
-          m_data = 0;
-        EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({})
-      }
-      m_rows = rows;
-    }
-    EIGEN_DEVICE_FUNC const T *data() const { return m_data; }
-    EIGEN_DEVICE_FUNC T *data() { return m_data; }
+    m_rows = rows;
+  }
+  EIGEN_DEVICE_FUNC const T* data() const { return m_data; }
+  EIGEN_DEVICE_FUNC T* data() { return m_data; }
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_MATRIX_H
+#endif  // EIGEN_MATRIX_H
diff --git a/Eigen/src/Core/Diagonal.h b/Eigen/src/Core/Diagonal.h
index d369486..8d27857 100644
--- a/Eigen/src/Core/Diagonal.h
+++ b/Eigen/src/Core/Diagonal.h
@@ -17,246 +17,205 @@
 namespace Eigen {
 
 /** \class Diagonal
-  * \ingroup Core_Module
-  *
-  * \brief Expression of a diagonal/subdiagonal/superdiagonal in a matrix
-  *
-  * \tparam MatrixType the type of the object in which we are taking a sub/main/super diagonal
-  * \tparam DiagIndex the index of the sub/super diagonal. The default is 0 and it means the main diagonal.
-  *              A positive value means a superdiagonal, a negative value means a subdiagonal.
-  *              You can also use DynamicIndex so the index can be set at runtime.
-  *
-  * The matrix is not required to be square.
-  *
-  * This class represents an expression of the main diagonal, or any sub/super diagonal
-  * of a square matrix. It is the return type of MatrixBase::diagonal() and MatrixBase::diagonal(Index) and most of the
-  * time this is the only way it is used.
-  *
-  * \sa MatrixBase::diagonal(), MatrixBase::diagonal(Index)
-  */
+ * \ingroup Core_Module
+ *
+ * \brief Expression of a diagonal/subdiagonal/superdiagonal in a matrix
+ *
+ * \tparam MatrixType the type of the object in which we are taking a sub/main/super diagonal
+ * \tparam DiagIndex the index of the sub/super diagonal. The default is 0 and it means the main diagonal.
+ *              A positive value means a superdiagonal, a negative value means a subdiagonal.
+ *              You can also use DynamicIndex so the index can be set at runtime.
+ *
+ * The matrix is not required to be square.
+ *
+ * This class represents an expression of the main diagonal, or any sub/super diagonal
+ * of a square matrix. It is the return type of MatrixBase::diagonal() and MatrixBase::diagonal(Index) and most of the
+ * time this is the only way it is used.
+ *
+ * \sa MatrixBase::diagonal(), MatrixBase::diagonal(Index)
+ */
 
 namespace internal {
-template<typename MatrixType, int DiagIndex>
-struct traits<Diagonal<MatrixType,DiagIndex> >
- : traits<MatrixType>
-{
+template <typename MatrixType, int DiagIndex>
+struct traits<Diagonal<MatrixType, DiagIndex> > : traits<MatrixType> {
   typedef typename ref_selector<MatrixType>::type MatrixTypeNested;
   typedef std::remove_reference_t<MatrixTypeNested> MatrixTypeNested_;
   typedef typename MatrixType::StorageKind StorageKind;
   enum {
-    RowsAtCompileTime = (int(DiagIndex) == DynamicIndex || int(MatrixType::SizeAtCompileTime) == Dynamic) ? Dynamic
-                      : (plain_enum_min(MatrixType::RowsAtCompileTime - plain_enum_max(-DiagIndex, 0),
-                                        MatrixType::ColsAtCompileTime - plain_enum_max( DiagIndex, 0))),
+    RowsAtCompileTime = (int(DiagIndex) == DynamicIndex || int(MatrixType::SizeAtCompileTime) == Dynamic)
+                            ? Dynamic
+                            : (plain_enum_min(MatrixType::RowsAtCompileTime - plain_enum_max(-DiagIndex, 0),
+                                              MatrixType::ColsAtCompileTime - plain_enum_max(DiagIndex, 0))),
     ColsAtCompileTime = 1,
-    MaxRowsAtCompileTime = int(MatrixType::MaxSizeAtCompileTime) == Dynamic ? Dynamic
-                         : DiagIndex == DynamicIndex ? min_size_prefer_fixed(MatrixType::MaxRowsAtCompileTime,
-                                                                             MatrixType::MaxColsAtCompileTime)
-                         : (plain_enum_min(MatrixType::MaxRowsAtCompileTime - plain_enum_max(-DiagIndex, 0),
-                                           MatrixType::MaxColsAtCompileTime - plain_enum_max( DiagIndex, 0))),
+    MaxRowsAtCompileTime =
+        int(MatrixType::MaxSizeAtCompileTime) == Dynamic ? Dynamic
+        : DiagIndex == DynamicIndex
+            ? min_size_prefer_fixed(MatrixType::MaxRowsAtCompileTime, MatrixType::MaxColsAtCompileTime)
+            : (plain_enum_min(MatrixType::MaxRowsAtCompileTime - plain_enum_max(-DiagIndex, 0),
+                              MatrixType::MaxColsAtCompileTime - plain_enum_max(DiagIndex, 0))),
     MaxColsAtCompileTime = 1,
     MaskLvalueBit = is_lvalue<MatrixType>::value ? LvalueBit : 0,
-    Flags = (unsigned int)MatrixTypeNested_::Flags & (RowMajorBit | MaskLvalueBit | DirectAccessBit) & ~RowMajorBit, // FIXME DirectAccessBit should not be handled by expressions
+    Flags = (unsigned int)MatrixTypeNested_::Flags & (RowMajorBit | MaskLvalueBit | DirectAccessBit) &
+            ~RowMajorBit,  // FIXME DirectAccessBit should not be handled by expressions
     MatrixTypeOuterStride = outer_stride_at_compile_time<MatrixType>::ret,
-    InnerStrideAtCompileTime = MatrixTypeOuterStride == Dynamic ? Dynamic : MatrixTypeOuterStride+1,
+    InnerStrideAtCompileTime = MatrixTypeOuterStride == Dynamic ? Dynamic : MatrixTypeOuterStride + 1,
     OuterStrideAtCompileTime = 0
   };
 };
-}
+}  // namespace internal
 
-template<typename MatrixType, int DiagIndex_> class Diagonal
-   : public internal::dense_xpr_base< Diagonal<MatrixType,DiagIndex_> >::type
-{
-  public:
+template <typename MatrixType, int DiagIndex_>
+class Diagonal : public internal::dense_xpr_base<Diagonal<MatrixType, DiagIndex_> >::type {
+ public:
+  enum { DiagIndex = DiagIndex_ };
+  typedef typename internal::dense_xpr_base<Diagonal>::type Base;
+  EIGEN_DENSE_PUBLIC_INTERFACE(Diagonal)
 
-    enum { DiagIndex = DiagIndex_ };
-    typedef typename internal::dense_xpr_base<Diagonal>::type Base;
-    EIGEN_DENSE_PUBLIC_INTERFACE(Diagonal)
+  EIGEN_DEVICE_FUNC explicit inline Diagonal(MatrixType& matrix, Index a_index = DiagIndex)
+      : m_matrix(matrix), m_index(a_index) {
+    eigen_assert(a_index <= m_matrix.cols() && -a_index <= m_matrix.rows());
+  }
 
-    EIGEN_DEVICE_FUNC
-    explicit inline Diagonal(MatrixType& matrix, Index a_index = DiagIndex) : m_matrix(matrix), m_index(a_index)
-    {
-      eigen_assert( a_index <= m_matrix.cols() && -a_index <= m_matrix.rows() );
-    }
+  EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Diagonal)
 
-    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Diagonal)
+  EIGEN_DEVICE_FUNC inline Index rows() const {
+    return m_index.value() < 0 ? numext::mini<Index>(m_matrix.cols(), m_matrix.rows() + m_index.value())
+                               : numext::mini<Index>(m_matrix.rows(), m_matrix.cols() - m_index.value());
+  }
 
-    EIGEN_DEVICE_FUNC
-    inline Index rows() const
-    {
-      return m_index.value()<0 ? numext::mini<Index>(m_matrix.cols(),m_matrix.rows()+m_index.value())
-                               : numext::mini<Index>(m_matrix.rows(),m_matrix.cols()-m_index.value());
-    }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index cols() const EIGEN_NOEXCEPT { return 1; }
 
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index cols() const EIGEN_NOEXCEPT { return 1; }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index innerStride() const EIGEN_NOEXCEPT {
+    return m_matrix.outerStride() + 1;
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index innerStride() const EIGEN_NOEXCEPT {
-      return m_matrix.outerStride() + 1;
-    }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index outerStride() const EIGEN_NOEXCEPT { return 0; }
 
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index outerStride() const EIGEN_NOEXCEPT { return 0; }
+  typedef std::conditional_t<internal::is_lvalue<MatrixType>::value, Scalar, const Scalar> ScalarWithConstIfNotLvalue;
 
-    typedef std::conditional_t<
-              internal::is_lvalue<MatrixType>::value,
-              Scalar,
-              const Scalar
-            > ScalarWithConstIfNotLvalue;
+  EIGEN_DEVICE_FUNC inline ScalarWithConstIfNotLvalue* data() { return &(m_matrix.coeffRef(rowOffset(), colOffset())); }
+  EIGEN_DEVICE_FUNC inline const Scalar* data() const { return &(m_matrix.coeffRef(rowOffset(), colOffset())); }
 
-    EIGEN_DEVICE_FUNC
-    inline ScalarWithConstIfNotLvalue* data() { return &(m_matrix.coeffRef(rowOffset(), colOffset())); }
-    EIGEN_DEVICE_FUNC
-    inline const Scalar* data() const { return &(m_matrix.coeffRef(rowOffset(), colOffset())); }
+  EIGEN_DEVICE_FUNC inline Scalar& coeffRef(Index row, Index) {
+    EIGEN_STATIC_ASSERT_LVALUE(MatrixType)
+    return m_matrix.coeffRef(row + rowOffset(), row + colOffset());
+  }
 
-    EIGEN_DEVICE_FUNC
-    inline Scalar& coeffRef(Index row, Index)
-    {
-      EIGEN_STATIC_ASSERT_LVALUE(MatrixType)
-      return m_matrix.coeffRef(row+rowOffset(), row+colOffset());
-    }
+  EIGEN_DEVICE_FUNC inline const Scalar& coeffRef(Index row, Index) const {
+    return m_matrix.coeffRef(row + rowOffset(), row + colOffset());
+  }
 
-    EIGEN_DEVICE_FUNC
-    inline const Scalar& coeffRef(Index row, Index) const
-    {
-      return m_matrix.coeffRef(row+rowOffset(), row+colOffset());
-    }
+  EIGEN_DEVICE_FUNC inline CoeffReturnType coeff(Index row, Index) const {
+    return m_matrix.coeff(row + rowOffset(), row + colOffset());
+  }
 
-    EIGEN_DEVICE_FUNC
-    inline CoeffReturnType coeff(Index row, Index) const
-    {
-      return m_matrix.coeff(row+rowOffset(), row+colOffset());
-    }
+  EIGEN_DEVICE_FUNC inline Scalar& coeffRef(Index idx) {
+    EIGEN_STATIC_ASSERT_LVALUE(MatrixType)
+    return m_matrix.coeffRef(idx + rowOffset(), idx + colOffset());
+  }
 
-    EIGEN_DEVICE_FUNC
-    inline Scalar& coeffRef(Index idx)
-    {
-      EIGEN_STATIC_ASSERT_LVALUE(MatrixType)
-      return m_matrix.coeffRef(idx+rowOffset(), idx+colOffset());
-    }
+  EIGEN_DEVICE_FUNC inline const Scalar& coeffRef(Index idx) const {
+    return m_matrix.coeffRef(idx + rowOffset(), idx + colOffset());
+  }
 
-    EIGEN_DEVICE_FUNC
-    inline const Scalar& coeffRef(Index idx) const
-    {
-      return m_matrix.coeffRef(idx+rowOffset(), idx+colOffset());
-    }
+  EIGEN_DEVICE_FUNC inline CoeffReturnType coeff(Index idx) const {
+    return m_matrix.coeff(idx + rowOffset(), idx + colOffset());
+  }
 
-    EIGEN_DEVICE_FUNC
-    inline CoeffReturnType coeff(Index idx) const
-    {
-      return m_matrix.coeff(idx+rowOffset(), idx+colOffset());
-    }
+  EIGEN_DEVICE_FUNC inline const internal::remove_all_t<typename MatrixType::Nested>& nestedExpression() const {
+    return m_matrix;
+  }
 
-    EIGEN_DEVICE_FUNC
-    inline const internal::remove_all_t<typename MatrixType::Nested>&
-    nestedExpression() const
-    {
-      return m_matrix;
-    }
+  EIGEN_DEVICE_FUNC inline Index index() const { return m_index.value(); }
 
-    EIGEN_DEVICE_FUNC
-    inline Index index() const
-    {
-      return m_index.value();
-    }
+ protected:
+  typename internal::ref_selector<MatrixType>::non_const_type m_matrix;
+  const internal::variable_if_dynamicindex<Index, DiagIndex> m_index;
 
-  protected:
-    typename internal::ref_selector<MatrixType>::non_const_type m_matrix;
-    const internal::variable_if_dynamicindex<Index, DiagIndex> m_index;
-
-  private:
-    // some compilers may fail to optimize std::max etc in case of compile-time constants...
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-    Index absDiagIndex() const EIGEN_NOEXCEPT { return m_index.value()>0 ? m_index.value() : -m_index.value(); }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-    Index rowOffset() const EIGEN_NOEXCEPT { return m_index.value()>0 ? 0 : -m_index.value(); }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-    Index colOffset() const EIGEN_NOEXCEPT { return m_index.value()>0 ? m_index.value() : 0; }
-    // trigger a compile-time error if someone try to call packet
-    template<int LoadMode> typename MatrixType::PacketReturnType packet(Index) const;
-    template<int LoadMode> typename MatrixType::PacketReturnType packet(Index,Index) const;
+ private:
+  // some compilers may fail to optimize std::max etc in case of compile-time constants...
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index absDiagIndex() const EIGEN_NOEXCEPT {
+    return m_index.value() > 0 ? m_index.value() : -m_index.value();
+  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index rowOffset() const EIGEN_NOEXCEPT {
+    return m_index.value() > 0 ? 0 : -m_index.value();
+  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index colOffset() const EIGEN_NOEXCEPT {
+    return m_index.value() > 0 ? m_index.value() : 0;
+  }
+  // trigger a compile-time error if someone try to call packet
+  template <int LoadMode>
+  typename MatrixType::PacketReturnType packet(Index) const;
+  template <int LoadMode>
+  typename MatrixType::PacketReturnType packet(Index, Index) const;
 };
 
 /** \returns an expression of the main diagonal of the matrix \c *this
-  *
-  * \c *this is not required to be square.
-  *
-  * Example: \include MatrixBase_diagonal.cpp
-  * Output: \verbinclude MatrixBase_diagonal.out
-  *
-  * \sa class Diagonal */
-template<typename Derived>
-EIGEN_DEVICE_FUNC inline typename MatrixBase<Derived>::DiagonalReturnType
-MatrixBase<Derived>::diagonal()
-{
+ *
+ * \c *this is not required to be square.
+ *
+ * Example: \include MatrixBase_diagonal.cpp
+ * Output: \verbinclude MatrixBase_diagonal.out
+ *
+ * \sa class Diagonal */
+template <typename Derived>
+EIGEN_DEVICE_FUNC inline typename MatrixBase<Derived>::DiagonalReturnType MatrixBase<Derived>::diagonal() {
   return DiagonalReturnType(derived());
 }
 
 /** This is the const version of diagonal(). */
-template<typename Derived>
-EIGEN_DEVICE_FUNC inline
-const typename MatrixBase<Derived>::ConstDiagonalReturnType
-MatrixBase<Derived>::diagonal() const
-{
+template <typename Derived>
+EIGEN_DEVICE_FUNC inline const typename MatrixBase<Derived>::ConstDiagonalReturnType MatrixBase<Derived>::diagonal()
+    const {
   return ConstDiagonalReturnType(derived());
 }
 
 /** \returns an expression of the \a DiagIndex-th sub or super diagonal of the matrix \c *this
-  *
-  * \c *this is not required to be square.
-  *
-  * The template parameter \a DiagIndex represent a super diagonal if \a DiagIndex > 0
-  * and a sub diagonal otherwise. \a DiagIndex == 0 is equivalent to the main diagonal.
-  *
-  * Example: \include MatrixBase_diagonal_int.cpp
-  * Output: \verbinclude MatrixBase_diagonal_int.out
-  *
-  * \sa MatrixBase::diagonal(), class Diagonal */
-template<typename Derived>
-EIGEN_DEVICE_FUNC inline Diagonal<Derived, DynamicIndex>
-MatrixBase<Derived>::diagonal(Index index)
-{
+ *
+ * \c *this is not required to be square.
+ *
+ * The template parameter \a DiagIndex represent a super diagonal if \a DiagIndex > 0
+ * and a sub diagonal otherwise. \a DiagIndex == 0 is equivalent to the main diagonal.
+ *
+ * Example: \include MatrixBase_diagonal_int.cpp
+ * Output: \verbinclude MatrixBase_diagonal_int.out
+ *
+ * \sa MatrixBase::diagonal(), class Diagonal */
+template <typename Derived>
+EIGEN_DEVICE_FUNC inline Diagonal<Derived, DynamicIndex> MatrixBase<Derived>::diagonal(Index index) {
   return Diagonal<Derived, DynamicIndex>(derived(), index);
 }
 
 /** This is the const version of diagonal(Index). */
-template<typename Derived>
-EIGEN_DEVICE_FUNC inline const Diagonal<const Derived, DynamicIndex>
-MatrixBase<Derived>::diagonal(Index index) const
-{
+template <typename Derived>
+EIGEN_DEVICE_FUNC inline const Diagonal<const Derived, DynamicIndex> MatrixBase<Derived>::diagonal(Index index) const {
   return Diagonal<const Derived, DynamicIndex>(derived(), index);
 }
 
 /** \returns an expression of the \a DiagIndex-th sub or super diagonal of the matrix \c *this
-  *
-  * \c *this is not required to be square.
-  *
-  * The template parameter \a DiagIndex represent a super diagonal if \a DiagIndex > 0
-  * and a sub diagonal otherwise. \a DiagIndex == 0 is equivalent to the main diagonal.
-  *
-  * Example: \include MatrixBase_diagonal_template_int.cpp
-  * Output: \verbinclude MatrixBase_diagonal_template_int.out
-  *
-  * \sa MatrixBase::diagonal(), class Diagonal */
-template<typename Derived>
-template<int Index_>
-EIGEN_DEVICE_FUNC
-inline Diagonal<Derived, Index_>
-MatrixBase<Derived>::diagonal()
-{
+ *
+ * \c *this is not required to be square.
+ *
+ * The template parameter \a DiagIndex represent a super diagonal if \a DiagIndex > 0
+ * and a sub diagonal otherwise. \a DiagIndex == 0 is equivalent to the main diagonal.
+ *
+ * Example: \include MatrixBase_diagonal_template_int.cpp
+ * Output: \verbinclude MatrixBase_diagonal_template_int.out
+ *
+ * \sa MatrixBase::diagonal(), class Diagonal */
+template <typename Derived>
+template <int Index_>
+EIGEN_DEVICE_FUNC inline Diagonal<Derived, Index_> MatrixBase<Derived>::diagonal() {
   return Diagonal<Derived, Index_>(derived());
 }
 
 /** This is the const version of diagonal<int>(). */
-template<typename Derived>
-template<int Index_>
-EIGEN_DEVICE_FUNC
-inline const Diagonal<const Derived, Index_>
-MatrixBase<Derived>::diagonal() const
-{
-  return  Diagonal<const Derived, Index_>(derived());
+template <typename Derived>
+template <int Index_>
+EIGEN_DEVICE_FUNC inline const Diagonal<const Derived, Index_> MatrixBase<Derived>::diagonal() const {
+  return Diagonal<const Derived, Index_>(derived());
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_DIAGONAL_H
+#endif  // EIGEN_DIAGONAL_H
diff --git a/Eigen/src/Core/DiagonalMatrix.h b/Eigen/src/Core/DiagonalMatrix.h
index 2b745dc..fd61bb7 100644
--- a/Eigen/src/Core/DiagonalMatrix.h
+++ b/Eigen/src/Core/DiagonalMatrix.h
@@ -29,130 +29,121 @@
  *
  * \sa class DiagonalMatrix, class DiagonalWrapper
  */
-template<typename Derived>
-class DiagonalBase : public EigenBase<Derived>
-{
-  public:
-    typedef typename internal::traits<Derived>::DiagonalVectorType DiagonalVectorType;
-    typedef typename DiagonalVectorType::Scalar Scalar;
-    typedef typename DiagonalVectorType::RealScalar RealScalar;
-    typedef typename internal::traits<Derived>::StorageKind StorageKind;
-    typedef typename internal::traits<Derived>::StorageIndex StorageIndex;
+template <typename Derived>
+class DiagonalBase : public EigenBase<Derived> {
+ public:
+  typedef typename internal::traits<Derived>::DiagonalVectorType DiagonalVectorType;
+  typedef typename DiagonalVectorType::Scalar Scalar;
+  typedef typename DiagonalVectorType::RealScalar RealScalar;
+  typedef typename internal::traits<Derived>::StorageKind StorageKind;
+  typedef typename internal::traits<Derived>::StorageIndex StorageIndex;
 
-    enum {
-      RowsAtCompileTime = DiagonalVectorType::SizeAtCompileTime,
-      ColsAtCompileTime = DiagonalVectorType::SizeAtCompileTime,
-      MaxRowsAtCompileTime = DiagonalVectorType::MaxSizeAtCompileTime,
-      MaxColsAtCompileTime = DiagonalVectorType::MaxSizeAtCompileTime,
-      IsVectorAtCompileTime = 0,
-      Flags = NoPreferredStorageOrderBit
-    };
+  enum {
+    RowsAtCompileTime = DiagonalVectorType::SizeAtCompileTime,
+    ColsAtCompileTime = DiagonalVectorType::SizeAtCompileTime,
+    MaxRowsAtCompileTime = DiagonalVectorType::MaxSizeAtCompileTime,
+    MaxColsAtCompileTime = DiagonalVectorType::MaxSizeAtCompileTime,
+    IsVectorAtCompileTime = 0,
+    Flags = NoPreferredStorageOrderBit
+  };
 
-    typedef Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime, 0, MaxRowsAtCompileTime, MaxColsAtCompileTime> DenseMatrixType;
-    typedef DenseMatrixType DenseType;
-    typedef DiagonalMatrix<Scalar,DiagonalVectorType::SizeAtCompileTime,DiagonalVectorType::MaxSizeAtCompileTime> PlainObject;
+  typedef Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime, 0, MaxRowsAtCompileTime, MaxColsAtCompileTime>
+      DenseMatrixType;
+  typedef DenseMatrixType DenseType;
+  typedef DiagonalMatrix<Scalar, DiagonalVectorType::SizeAtCompileTime, DiagonalVectorType::MaxSizeAtCompileTime>
+      PlainObject;
 
-    /** \returns a reference to the derived object. */
-    EIGEN_DEVICE_FUNC
-    inline const Derived& derived() const { return *static_cast<const Derived*>(this); }
-    /** \returns a const reference to the derived object. */
-    EIGEN_DEVICE_FUNC
-    inline Derived& derived() { return *static_cast<Derived*>(this); }
+  /** \returns a reference to the derived object. */
+  EIGEN_DEVICE_FUNC inline const Derived& derived() const { return *static_cast<const Derived*>(this); }
+  /** \returns a const reference to the derived object. */
+  EIGEN_DEVICE_FUNC inline Derived& derived() { return *static_cast<Derived*>(this); }
 
-    /**
-     * Constructs a dense matrix from \c *this. Note, this directly returns a dense matrix type,
-     * not an expression.
-     * \returns A dense matrix, with its diagonal entries set from the the derived object. */
-    EIGEN_DEVICE_FUNC
-    DenseMatrixType toDenseMatrix() const { return derived(); }
+  /**
+   * Constructs a dense matrix from \c *this. Note, this directly returns a dense matrix type,
+   * not an expression.
+   * \returns A dense matrix, with its diagonal entries set from the the derived object. */
+  EIGEN_DEVICE_FUNC DenseMatrixType toDenseMatrix() const { return derived(); }
 
-    /** \returns a reference to the derived object's vector of diagonal coefficients. */
-    EIGEN_DEVICE_FUNC
-    inline const DiagonalVectorType& diagonal() const { return derived().diagonal(); }
-    /** \returns a const reference to the derived object's vector of diagonal coefficients. */
-    EIGEN_DEVICE_FUNC
-    inline DiagonalVectorType& diagonal() { return derived().diagonal(); }
+  /** \returns a reference to the derived object's vector of diagonal coefficients. */
+  EIGEN_DEVICE_FUNC inline const DiagonalVectorType& diagonal() const { return derived().diagonal(); }
+  /** \returns a const reference to the derived object's vector of diagonal coefficients. */
+  EIGEN_DEVICE_FUNC inline DiagonalVectorType& diagonal() { return derived().diagonal(); }
 
-    /** \returns the value of the coefficient as if \c *this was a dense matrix. */
-    EIGEN_DEVICE_FUNC
-    inline Scalar coeff(Index row, Index col) const {
-      eigen_assert(row >= 0 && col >= 0 && row < rows() && col <= cols());
-      return row == col ? diagonal().coeff(row) : Scalar(0);
-    }
+  /** \returns the value of the coefficient as if \c *this was a dense matrix. */
+  EIGEN_DEVICE_FUNC inline Scalar coeff(Index row, Index col) const {
+    eigen_assert(row >= 0 && col >= 0 && row < rows() && col <= cols());
+    return row == col ? diagonal().coeff(row) : Scalar(0);
+  }
 
-    /** \returns the number of rows. */
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR 
-    inline Index rows() const { return diagonal().size(); }
-    /** \returns the number of columns. */
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR 
-    inline Index cols() const { return diagonal().size(); }
+  /** \returns the number of rows. */
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index rows() const { return diagonal().size(); }
+  /** \returns the number of columns. */
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index cols() const { return diagonal().size(); }
 
-    /** \returns the diagonal matrix product of \c *this by the dense matrix, \a matrix */
-    template<typename MatrixDerived>
-    EIGEN_DEVICE_FUNC
-    const Product<Derived,MatrixDerived,LazyProduct>
-    operator*(const MatrixBase<MatrixDerived> &matrix) const
-    {
-      return Product<Derived, MatrixDerived, LazyProduct>(derived(),matrix.derived());
-    }
+  /** \returns the diagonal matrix product of \c *this by the dense matrix, \a matrix */
+  template <typename MatrixDerived>
+  EIGEN_DEVICE_FUNC const Product<Derived, MatrixDerived, LazyProduct> operator*(
+      const MatrixBase<MatrixDerived>& matrix) const {
+    return Product<Derived, MatrixDerived, LazyProduct>(derived(), matrix.derived());
+  }
 
-    template <typename OtherDerived>
-    using DiagonalProductReturnType = DiagonalWrapper<const EIGEN_CWISE_BINARY_RETURN_TYPE(
-        DiagonalVectorType, typename OtherDerived::DiagonalVectorType, product)>;
+  template <typename OtherDerived>
+  using DiagonalProductReturnType = DiagonalWrapper<const EIGEN_CWISE_BINARY_RETURN_TYPE(
+      DiagonalVectorType, typename OtherDerived::DiagonalVectorType, product)>;
 
-    /** \returns the diagonal matrix product of \c *this by the diagonal matrix \a other */
-    template <typename OtherDerived>
-    EIGEN_DEVICE_FUNC const DiagonalProductReturnType<OtherDerived> operator*(
-        const DiagonalBase<OtherDerived>& other) const {
-      return diagonal().cwiseProduct(other.diagonal()).asDiagonal();
-    }
+  /** \returns the diagonal matrix product of \c *this by the diagonal matrix \a other */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC const DiagonalProductReturnType<OtherDerived> operator*(
+      const DiagonalBase<OtherDerived>& other) const {
+    return diagonal().cwiseProduct(other.diagonal()).asDiagonal();
+  }
 
-    using DiagonalInverseReturnType =
-        DiagonalWrapper<const CwiseUnaryOp<internal::scalar_inverse_op<Scalar>, const DiagonalVectorType>>;
+  using DiagonalInverseReturnType =
+      DiagonalWrapper<const CwiseUnaryOp<internal::scalar_inverse_op<Scalar>, const DiagonalVectorType>>;
 
-    /** \returns the inverse \c *this. Computed as the coefficient-wise inverse of the diagonal. */
-    EIGEN_DEVICE_FUNC
-    inline const DiagonalInverseReturnType inverse() const { return diagonal().cwiseInverse().asDiagonal(); }
+  /** \returns the inverse \c *this. Computed as the coefficient-wise inverse of the diagonal. */
+  EIGEN_DEVICE_FUNC inline const DiagonalInverseReturnType inverse() const {
+    return diagonal().cwiseInverse().asDiagonal();
+  }
 
-    using DiagonalScaleReturnType =
-        DiagonalWrapper<const EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(DiagonalVectorType, Scalar, product)>;
+  using DiagonalScaleReturnType =
+      DiagonalWrapper<const EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(DiagonalVectorType, Scalar, product)>;
 
-    /** \returns the product of \c *this by the scalar \a scalar */
-    EIGEN_DEVICE_FUNC
-    inline const DiagonalScaleReturnType operator*(const Scalar& scalar) const {
-      return (diagonal() * scalar).asDiagonal();
-    }
+  /** \returns the product of \c *this by the scalar \a scalar */
+  EIGEN_DEVICE_FUNC inline const DiagonalScaleReturnType operator*(const Scalar& scalar) const {
+    return (diagonal() * scalar).asDiagonal();
+  }
 
-    using ScaleDiagonalReturnType =
-        DiagonalWrapper<const EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(Scalar, DiagonalVectorType, product)>;
+  using ScaleDiagonalReturnType =
+      DiagonalWrapper<const EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(Scalar, DiagonalVectorType, product)>;
 
-    /** \returns the product of a scalar and the diagonal matrix \a other */
-    EIGEN_DEVICE_FUNC
-    friend inline const ScaleDiagonalReturnType operator*(const Scalar& scalar, const DiagonalBase& other) {
-      return (scalar * other.diagonal()).asDiagonal();
-    }
+  /** \returns the product of a scalar and the diagonal matrix \a other */
+  EIGEN_DEVICE_FUNC friend inline const ScaleDiagonalReturnType operator*(const Scalar& scalar,
+                                                                          const DiagonalBase& other) {
+    return (scalar * other.diagonal()).asDiagonal();
+  }
 
-    template <typename OtherDerived>
-    using DiagonalSumReturnType = DiagonalWrapper<const EIGEN_CWISE_BINARY_RETURN_TYPE(
-        DiagonalVectorType, typename OtherDerived::DiagonalVectorType, sum)>;
+  template <typename OtherDerived>
+  using DiagonalSumReturnType = DiagonalWrapper<const EIGEN_CWISE_BINARY_RETURN_TYPE(
+      DiagonalVectorType, typename OtherDerived::DiagonalVectorType, sum)>;
 
-    /** \returns the sum of \c *this and the diagonal matrix \a other */
-    template <typename OtherDerived>
-    EIGEN_DEVICE_FUNC inline const DiagonalSumReturnType<OtherDerived> operator+(
-        const DiagonalBase<OtherDerived>& other) const {
-      return (diagonal() + other.diagonal()).asDiagonal();
-    }
+  /** \returns the sum of \c *this and the diagonal matrix \a other */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC inline const DiagonalSumReturnType<OtherDerived> operator+(
+      const DiagonalBase<OtherDerived>& other) const {
+    return (diagonal() + other.diagonal()).asDiagonal();
+  }
 
-    template <typename OtherDerived>
-    using DiagonalDifferenceReturnType = DiagonalWrapper<const EIGEN_CWISE_BINARY_RETURN_TYPE(
-        DiagonalVectorType, typename OtherDerived::DiagonalVectorType, difference)>;
+  template <typename OtherDerived>
+  using DiagonalDifferenceReturnType = DiagonalWrapper<const EIGEN_CWISE_BINARY_RETURN_TYPE(
+      DiagonalVectorType, typename OtherDerived::DiagonalVectorType, difference)>;
 
-    /** \returns the difference of \c *this and the diagonal matrix \a other */
-    template <typename OtherDerived>
-    EIGEN_DEVICE_FUNC inline const DiagonalDifferenceReturnType<OtherDerived> operator-(
-        const DiagonalBase<OtherDerived>& other) const {
-      return (diagonal() - other.diagonal()).asDiagonal();
-    }
+  /** \returns the difference of \c *this and the diagonal matrix \a other */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC inline const DiagonalDifferenceReturnType<OtherDerived> operator-(
+      const DiagonalBase<OtherDerived>& other) const {
+    return (diagonal() - other.diagonal()).asDiagonal();
+  }
 };
 
 /** \class DiagonalMatrix
@@ -169,171 +160,144 @@
  */
 
 namespace internal {
-template<typename Scalar_, int SizeAtCompileTime, int MaxSizeAtCompileTime>
-struct traits<DiagonalMatrix<Scalar_,SizeAtCompileTime,MaxSizeAtCompileTime> >
- : traits<Matrix<Scalar_,SizeAtCompileTime,SizeAtCompileTime,0,MaxSizeAtCompileTime,MaxSizeAtCompileTime> >
-{
-  typedef Matrix<Scalar_,SizeAtCompileTime,1,0,MaxSizeAtCompileTime,1> DiagonalVectorType;
+template <typename Scalar_, int SizeAtCompileTime, int MaxSizeAtCompileTime>
+struct traits<DiagonalMatrix<Scalar_, SizeAtCompileTime, MaxSizeAtCompileTime>>
+    : traits<Matrix<Scalar_, SizeAtCompileTime, SizeAtCompileTime, 0, MaxSizeAtCompileTime, MaxSizeAtCompileTime>> {
+  typedef Matrix<Scalar_, SizeAtCompileTime, 1, 0, MaxSizeAtCompileTime, 1> DiagonalVectorType;
   typedef DiagonalShape StorageKind;
-  enum {
-    Flags = LvalueBit | NoPreferredStorageOrderBit | NestByRefBit
-  };
+  enum { Flags = LvalueBit | NoPreferredStorageOrderBit | NestByRefBit };
 };
-}
-template<typename Scalar_, int SizeAtCompileTime, int MaxSizeAtCompileTime>
-class DiagonalMatrix
-  : public DiagonalBase<DiagonalMatrix<Scalar_,SizeAtCompileTime,MaxSizeAtCompileTime> >
-{
-  public:
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    typedef typename internal::traits<DiagonalMatrix>::DiagonalVectorType DiagonalVectorType;
-    typedef const DiagonalMatrix& Nested;
-    typedef Scalar_ Scalar;
-    typedef typename internal::traits<DiagonalMatrix>::StorageKind StorageKind;
-    typedef typename internal::traits<DiagonalMatrix>::StorageIndex StorageIndex;
-    #endif
+}  // namespace internal
+template <typename Scalar_, int SizeAtCompileTime, int MaxSizeAtCompileTime>
+class DiagonalMatrix : public DiagonalBase<DiagonalMatrix<Scalar_, SizeAtCompileTime, MaxSizeAtCompileTime>> {
+ public:
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  typedef typename internal::traits<DiagonalMatrix>::DiagonalVectorType DiagonalVectorType;
+  typedef const DiagonalMatrix& Nested;
+  typedef Scalar_ Scalar;
+  typedef typename internal::traits<DiagonalMatrix>::StorageKind StorageKind;
+  typedef typename internal::traits<DiagonalMatrix>::StorageIndex StorageIndex;
+#endif
 
-  protected:
+ protected:
+  DiagonalVectorType m_diagonal;
 
-    DiagonalVectorType m_diagonal;
+ public:
+  /** const version of diagonal(). */
+  EIGEN_DEVICE_FUNC inline const DiagonalVectorType& diagonal() const { return m_diagonal; }
+  /** \returns a reference to the stored vector of diagonal coefficients. */
+  EIGEN_DEVICE_FUNC inline DiagonalVectorType& diagonal() { return m_diagonal; }
 
-  public:
+  /** Default constructor without initialization */
+  EIGEN_DEVICE_FUNC inline DiagonalMatrix() {}
 
-    /** const version of diagonal(). */
-    EIGEN_DEVICE_FUNC
-    inline const DiagonalVectorType& diagonal() const { return m_diagonal; }
-    /** \returns a reference to the stored vector of diagonal coefficients. */
-    EIGEN_DEVICE_FUNC
-    inline DiagonalVectorType& diagonal() { return m_diagonal; }
+  /** Constructs a diagonal matrix with given dimension  */
+  EIGEN_DEVICE_FUNC explicit inline DiagonalMatrix(Index dim) : m_diagonal(dim) {}
 
-    /** Default constructor without initialization */
-    EIGEN_DEVICE_FUNC
-    inline DiagonalMatrix() {}
+  /** 2D constructor. */
+  EIGEN_DEVICE_FUNC inline DiagonalMatrix(const Scalar& x, const Scalar& y) : m_diagonal(x, y) {}
 
-    /** Constructs a diagonal matrix with given dimension  */
-    EIGEN_DEVICE_FUNC
-    explicit inline DiagonalMatrix(Index dim) : m_diagonal(dim) {}
+  /** 3D constructor. */
+  EIGEN_DEVICE_FUNC inline DiagonalMatrix(const Scalar& x, const Scalar& y, const Scalar& z) : m_diagonal(x, y, z) {}
 
-    /** 2D constructor. */
-    EIGEN_DEVICE_FUNC
-    inline DiagonalMatrix(const Scalar& x, const Scalar& y) : m_diagonal(x,y) {}
-
-    /** 3D constructor. */
-    EIGEN_DEVICE_FUNC
-    inline DiagonalMatrix(const Scalar& x, const Scalar& y, const Scalar& z) : m_diagonal(x,y,z) {}
-
-    /** \brief Construct a diagonal matrix with fixed size from an arbitrary number of coefficients.
-      * 
-      * \warning To construct a diagonal matrix of fixed size, the number of values passed to this 
-      * constructor must match the fixed dimension of \c *this.
-      * 
-      * \sa DiagonalMatrix(const Scalar&, const Scalar&)
-      * \sa DiagonalMatrix(const Scalar&, const Scalar&, const Scalar&)
-      */
-    template <typename... ArgTypes>
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    DiagonalMatrix(const Scalar& a0, const Scalar& a1, const Scalar& a2, const ArgTypes&... args)
+  /** \brief Construct a diagonal matrix with fixed size from an arbitrary number of coefficients.
+   *
+   * \warning To construct a diagonal matrix of fixed size, the number of values passed to this
+   * constructor must match the fixed dimension of \c *this.
+   *
+   * \sa DiagonalMatrix(const Scalar&, const Scalar&)
+   * \sa DiagonalMatrix(const Scalar&, const Scalar&, const Scalar&)
+   */
+  template <typename... ArgTypes>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DiagonalMatrix(const Scalar& a0, const Scalar& a1, const Scalar& a2,
+                                                       const ArgTypes&... args)
       : m_diagonal(a0, a1, a2, args...) {}
 
-    /** \brief Constructs a DiagonalMatrix and initializes it by elements given by an initializer list of initializer
-      * lists \cpp11
-      */
-    EIGEN_DEVICE_FUNC
-    explicit EIGEN_STRONG_INLINE DiagonalMatrix(const std::initializer_list<std::initializer_list<Scalar>>& list)
+  /** \brief Constructs a DiagonalMatrix and initializes it by elements given by an initializer list of initializer
+   * lists \cpp11
+   */
+  EIGEN_DEVICE_FUNC explicit EIGEN_STRONG_INLINE DiagonalMatrix(
+      const std::initializer_list<std::initializer_list<Scalar>>& list)
       : m_diagonal(list) {}
 
-    /** \brief Constructs a DiagonalMatrix from an r-value diagonal vector type */
-    EIGEN_DEVICE_FUNC
-    explicit inline DiagonalMatrix(DiagonalVectorType&& diag) : m_diagonal(std::move(diag)) {}
+  /** \brief Constructs a DiagonalMatrix from an r-value diagonal vector type */
+  EIGEN_DEVICE_FUNC explicit inline DiagonalMatrix(DiagonalVectorType&& diag) : m_diagonal(std::move(diag)) {}
 
-    /** Copy constructor. */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    inline DiagonalMatrix(const DiagonalBase<OtherDerived>& other) : m_diagonal(other.diagonal()) {}
+  /** Copy constructor. */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC inline DiagonalMatrix(const DiagonalBase<OtherDerived>& other) : m_diagonal(other.diagonal()) {}
 
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    /** copy constructor. prevent a default copy constructor from hiding the other templated constructor */
-    inline DiagonalMatrix(const DiagonalMatrix& other) : m_diagonal(other.diagonal()) {}
-    #endif
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  /** copy constructor. prevent a default copy constructor from hiding the other templated constructor */
+  inline DiagonalMatrix(const DiagonalMatrix& other) : m_diagonal(other.diagonal()) {}
+#endif
 
-    /** generic constructor from expression of the diagonal coefficients */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    explicit inline DiagonalMatrix(const MatrixBase<OtherDerived>& other) : m_diagonal(other)
-    {}
+  /** generic constructor from expression of the diagonal coefficients */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC explicit inline DiagonalMatrix(const MatrixBase<OtherDerived>& other) : m_diagonal(other) {}
 
-    /** Copy operator. */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    DiagonalMatrix& operator=(const DiagonalBase<OtherDerived>& other)
-    {
-      m_diagonal = other.diagonal();
-      return *this;
-    }
+  /** Copy operator. */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC DiagonalMatrix& operator=(const DiagonalBase<OtherDerived>& other) {
+    m_diagonal = other.diagonal();
+    return *this;
+  }
 
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    /** This is a special case of the templated operator=. Its purpose is to
-      * prevent a default operator= from hiding the templated operator=.
-      */
-    EIGEN_DEVICE_FUNC
-    DiagonalMatrix& operator=(const DiagonalMatrix& other)
-    {
-      m_diagonal = other.diagonal();
-      return *this;
-    }
-    #endif
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  /** This is a special case of the templated operator=. Its purpose is to
+   * prevent a default operator= from hiding the templated operator=.
+   */
+  EIGEN_DEVICE_FUNC DiagonalMatrix& operator=(const DiagonalMatrix& other) {
+    m_diagonal = other.diagonal();
+    return *this;
+  }
+#endif
 
-    typedef DiagonalWrapper<const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, DiagonalVectorType>>
-        InitializeReturnType;
+  typedef DiagonalWrapper<const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, DiagonalVectorType>>
+      InitializeReturnType;
 
-    /** Initializes a diagonal matrix of size SizeAtCompileTime with coefficients set to zero */
-    EIGEN_DEVICE_FUNC
-    static const InitializeReturnType Zero() { return DiagonalVectorType::Zero().asDiagonal(); }
-    /** Initializes a diagonal matrix of size dim with coefficients set to zero */
-    EIGEN_DEVICE_FUNC
-    static const InitializeReturnType Zero(Index size) { return DiagonalVectorType::Zero(size).asDiagonal(); }
-    /** Initializes a identity matrix of size SizeAtCompileTime */
-    EIGEN_DEVICE_FUNC
-    static const InitializeReturnType Identity() { return DiagonalVectorType::Ones().asDiagonal(); }
-    /** Initializes a identity matrix of size dim */
-    EIGEN_DEVICE_FUNC
-    static const InitializeReturnType Identity(Index size) { return DiagonalVectorType::Ones(size).asDiagonal(); }
+  /** Initializes a diagonal matrix of size SizeAtCompileTime with coefficients set to zero */
+  EIGEN_DEVICE_FUNC static const InitializeReturnType Zero() { return DiagonalVectorType::Zero().asDiagonal(); }
+  /** Initializes a diagonal matrix of size dim with coefficients set to zero */
+  EIGEN_DEVICE_FUNC static const InitializeReturnType Zero(Index size) {
+    return DiagonalVectorType::Zero(size).asDiagonal();
+  }
+  /** Initializes a identity matrix of size SizeAtCompileTime */
+  EIGEN_DEVICE_FUNC static const InitializeReturnType Identity() { return DiagonalVectorType::Ones().asDiagonal(); }
+  /** Initializes a identity matrix of size dim */
+  EIGEN_DEVICE_FUNC static const InitializeReturnType Identity(Index size) {
+    return DiagonalVectorType::Ones(size).asDiagonal();
+  }
 
-    /** Resizes to given size. */
-    EIGEN_DEVICE_FUNC
-    inline void resize(Index size) { m_diagonal.resize(size); }
-    /** Sets all coefficients to zero. */
-    EIGEN_DEVICE_FUNC
-    inline void setZero() { m_diagonal.setZero(); }
-    /** Resizes and sets all coefficients to zero. */
-    EIGEN_DEVICE_FUNC
-    inline void setZero(Index size) { m_diagonal.setZero(size); }
-    /** Sets this matrix to be the identity matrix of the current size. */
-    EIGEN_DEVICE_FUNC
-    inline void setIdentity() { m_diagonal.setOnes(); }
-    /** Sets this matrix to be the identity matrix of the given size. */
-    EIGEN_DEVICE_FUNC
-    inline void setIdentity(Index size) { m_diagonal.setOnes(size); }
+  /** Resizes to given size. */
+  EIGEN_DEVICE_FUNC inline void resize(Index size) { m_diagonal.resize(size); }
+  /** Sets all coefficients to zero. */
+  EIGEN_DEVICE_FUNC inline void setZero() { m_diagonal.setZero(); }
+  /** Resizes and sets all coefficients to zero. */
+  EIGEN_DEVICE_FUNC inline void setZero(Index size) { m_diagonal.setZero(size); }
+  /** Sets this matrix to be the identity matrix of the current size. */
+  EIGEN_DEVICE_FUNC inline void setIdentity() { m_diagonal.setOnes(); }
+  /** Sets this matrix to be the identity matrix of the given size. */
+  EIGEN_DEVICE_FUNC inline void setIdentity(Index size) { m_diagonal.setOnes(size); }
 };
 
 /** \class DiagonalWrapper
-  * \ingroup Core_Module
-  *
-  * \brief Expression of a diagonal matrix
-  *
-  * \tparam DiagonalVectorType_ the type of the vector of diagonal coefficients
-  *
-  * This class is an expression of a diagonal matrix, but not storing its own vector of diagonal coefficients,
-  * instead wrapping an existing vector expression. It is the return type of MatrixBase::asDiagonal()
-  * and most of the time this is the only way that it is used.
-  *
-  * \sa class DiagonalMatrix, class DiagonalBase, MatrixBase::asDiagonal()
-  */
+ * \ingroup Core_Module
+ *
+ * \brief Expression of a diagonal matrix
+ *
+ * \tparam DiagonalVectorType_ the type of the vector of diagonal coefficients
+ *
+ * This class is an expression of a diagonal matrix, but not storing its own vector of diagonal coefficients,
+ * instead wrapping an existing vector expression. It is the return type of MatrixBase::asDiagonal()
+ * and most of the time this is the only way that it is used.
+ *
+ * \sa class DiagonalMatrix, class DiagonalBase, MatrixBase::asDiagonal()
+ */
 
 namespace internal {
-template<typename DiagonalVectorType_>
-struct traits<DiagonalWrapper<DiagonalVectorType_> >
-{
+template <typename DiagonalVectorType_>
+struct traits<DiagonalWrapper<DiagonalVectorType_>> {
   typedef DiagonalVectorType_ DiagonalVectorType;
   typedef typename DiagonalVectorType::Scalar Scalar;
   typedef typename DiagonalVectorType::StorageIndex StorageIndex;
@@ -344,108 +308,107 @@
     ColsAtCompileTime = DiagonalVectorType::SizeAtCompileTime,
     MaxRowsAtCompileTime = DiagonalVectorType::MaxSizeAtCompileTime,
     MaxColsAtCompileTime = DiagonalVectorType::MaxSizeAtCompileTime,
-    Flags =  (traits<DiagonalVectorType>::Flags & LvalueBit) | NoPreferredStorageOrderBit
+    Flags = (traits<DiagonalVectorType>::Flags & LvalueBit) | NoPreferredStorageOrderBit
   };
 };
-}
+}  // namespace internal
 
-template<typename DiagonalVectorType_>
-class DiagonalWrapper
-  : public DiagonalBase<DiagonalWrapper<DiagonalVectorType_> >, internal::no_assignment_operator
-{
-  public:
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    typedef DiagonalVectorType_ DiagonalVectorType;
-    typedef DiagonalWrapper Nested;
-    #endif
+template <typename DiagonalVectorType_>
+class DiagonalWrapper : public DiagonalBase<DiagonalWrapper<DiagonalVectorType_>>, internal::no_assignment_operator {
+ public:
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  typedef DiagonalVectorType_ DiagonalVectorType;
+  typedef DiagonalWrapper Nested;
+#endif
 
-    /** Constructor from expression of diagonal coefficients to wrap. */
-    EIGEN_DEVICE_FUNC
-    explicit inline DiagonalWrapper(DiagonalVectorType& a_diagonal) : m_diagonal(a_diagonal) {}
+  /** Constructor from expression of diagonal coefficients to wrap. */
+  EIGEN_DEVICE_FUNC explicit inline DiagonalWrapper(DiagonalVectorType& a_diagonal) : m_diagonal(a_diagonal) {}
 
-    /** \returns a const reference to the wrapped expression of diagonal coefficients. */
-    EIGEN_DEVICE_FUNC
-    const DiagonalVectorType& diagonal() const { return m_diagonal; }
+  /** \returns a const reference to the wrapped expression of diagonal coefficients. */
+  EIGEN_DEVICE_FUNC const DiagonalVectorType& diagonal() const { return m_diagonal; }
 
-  protected:
-    typename DiagonalVectorType::Nested m_diagonal;
+ protected:
+  typename DiagonalVectorType::Nested m_diagonal;
 };
 
 /** \returns a pseudo-expression of a diagonal matrix with *this as vector of diagonal coefficients
-  *
-  * \only_for_vectors
-  *
-  * Example: \include MatrixBase_asDiagonal.cpp
-  * Output: \verbinclude MatrixBase_asDiagonal.out
-  *
-  * \sa class DiagonalWrapper, class DiagonalMatrix, diagonal(), isDiagonal()
-  **/
-template<typename Derived>
-EIGEN_DEVICE_FUNC inline const DiagonalWrapper<const Derived>
-MatrixBase<Derived>::asDiagonal() const
-{
+ *
+ * \only_for_vectors
+ *
+ * Example: \include MatrixBase_asDiagonal.cpp
+ * Output: \verbinclude MatrixBase_asDiagonal.out
+ *
+ * \sa class DiagonalWrapper, class DiagonalMatrix, diagonal(), isDiagonal()
+ **/
+template <typename Derived>
+EIGEN_DEVICE_FUNC inline const DiagonalWrapper<const Derived> MatrixBase<Derived>::asDiagonal() const {
   return DiagonalWrapper<const Derived>(derived());
 }
 
 /** \returns true if *this is approximately equal to a diagonal matrix,
-  *          within the precision given by \a prec.
-  *
-  * Example: \include MatrixBase_isDiagonal.cpp
-  * Output: \verbinclude MatrixBase_isDiagonal.out
-  *
-  * \sa asDiagonal()
-  */
-template<typename Derived>
-bool MatrixBase<Derived>::isDiagonal(const RealScalar& prec) const
-{
-  if(cols() != rows()) return false;
+ *          within the precision given by \a prec.
+ *
+ * Example: \include MatrixBase_isDiagonal.cpp
+ * Output: \verbinclude MatrixBase_isDiagonal.out
+ *
+ * \sa asDiagonal()
+ */
+template <typename Derived>
+bool MatrixBase<Derived>::isDiagonal(const RealScalar& prec) const {
+  if (cols() != rows()) return false;
   RealScalar maxAbsOnDiagonal = static_cast<RealScalar>(-1);
-  for(Index j = 0; j < cols(); ++j)
-  {
-    RealScalar absOnDiagonal = numext::abs(coeff(j,j));
-    if(absOnDiagonal > maxAbsOnDiagonal) maxAbsOnDiagonal = absOnDiagonal;
+  for (Index j = 0; j < cols(); ++j) {
+    RealScalar absOnDiagonal = numext::abs(coeff(j, j));
+    if (absOnDiagonal > maxAbsOnDiagonal) maxAbsOnDiagonal = absOnDiagonal;
   }
-  for(Index j = 0; j < cols(); ++j)
-    for(Index i = 0; i < j; ++i)
-    {
-      if(!internal::isMuchSmallerThan(coeff(i, j), maxAbsOnDiagonal, prec)) return false;
-      if(!internal::isMuchSmallerThan(coeff(j, i), maxAbsOnDiagonal, prec)) return false;
+  for (Index j = 0; j < cols(); ++j)
+    for (Index i = 0; i < j; ++i) {
+      if (!internal::isMuchSmallerThan(coeff(i, j), maxAbsOnDiagonal, prec)) return false;
+      if (!internal::isMuchSmallerThan(coeff(j, i), maxAbsOnDiagonal, prec)) return false;
     }
   return true;
 }
 
 namespace internal {
 
-template<> struct storage_kind_to_shape<DiagonalShape> { typedef DiagonalShape Shape; };
+template <>
+struct storage_kind_to_shape<DiagonalShape> {
+  typedef DiagonalShape Shape;
+};
 
 struct Diagonal2Dense {};
 
-template<> struct AssignmentKind<DenseShape,DiagonalShape> { typedef Diagonal2Dense Kind; };
+template <>
+struct AssignmentKind<DenseShape, DiagonalShape> {
+  typedef Diagonal2Dense Kind;
+};
 
 // Diagonal matrix to Dense assignment
-template< typename DstXprType, typename SrcXprType, typename Functor>
-struct Assignment<DstXprType, SrcXprType, Functor, Diagonal2Dense>
-{
-  static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &/*func*/)
-  {
+template <typename DstXprType, typename SrcXprType, typename Functor>
+struct Assignment<DstXprType, SrcXprType, Functor, Diagonal2Dense> {
+  static void run(DstXprType& dst, const SrcXprType& src,
+                  const internal::assign_op<typename DstXprType::Scalar, typename SrcXprType::Scalar>& /*func*/) {
     Index dstRows = src.rows();
     Index dstCols = src.cols();
-    if((dst.rows()!=dstRows) || (dst.cols()!=dstCols))
-      dst.resize(dstRows, dstCols);
-    
+    if ((dst.rows() != dstRows) || (dst.cols() != dstCols)) dst.resize(dstRows, dstCols);
+
     dst.setZero();
     dst.diagonal() = src.diagonal();
   }
-  
-  static void run(DstXprType &dst, const SrcXprType &src, const internal::add_assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &/*func*/)
-  { dst.diagonal() += src.diagonal(); }
-  
-  static void run(DstXprType &dst, const SrcXprType &src, const internal::sub_assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &/*func*/)
-  { dst.diagonal() -= src.diagonal(); }
+
+  static void run(DstXprType& dst, const SrcXprType& src,
+                  const internal::add_assign_op<typename DstXprType::Scalar, typename SrcXprType::Scalar>& /*func*/) {
+    dst.diagonal() += src.diagonal();
+  }
+
+  static void run(DstXprType& dst, const SrcXprType& src,
+                  const internal::sub_assign_op<typename DstXprType::Scalar, typename SrcXprType::Scalar>& /*func*/) {
+    dst.diagonal() -= src.diagonal();
+  }
 };
 
-} // namespace internal
+}  // namespace internal
 
 }  // end namespace Eigen
 
-#endif // EIGEN_DIAGONALMATRIX_H
+#endif  // EIGEN_DIAGONALMATRIX_H
diff --git a/Eigen/src/Core/DiagonalProduct.h b/Eigen/src/Core/DiagonalProduct.h
index aad474d..bd0feea 100644
--- a/Eigen/src/Core/DiagonalProduct.h
+++ b/Eigen/src/Core/DiagonalProduct.h
@@ -14,18 +14,17 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 /** \returns the diagonal matrix product of \c *this by the diagonal matrix \a diagonal.
-  */
-template<typename Derived>
-template<typename DiagonalDerived>
-EIGEN_DEVICE_FUNC inline const Product<Derived, DiagonalDerived, LazyProduct>
-MatrixBase<Derived>::operator*(const DiagonalBase<DiagonalDerived> &a_diagonal) const
-{
-  return Product<Derived, DiagonalDerived, LazyProduct>(derived(),a_diagonal.derived());
+ */
+template <typename Derived>
+template <typename DiagonalDerived>
+EIGEN_DEVICE_FUNC inline const Product<Derived, DiagonalDerived, LazyProduct> MatrixBase<Derived>::operator*(
+    const DiagonalBase<DiagonalDerived> &a_diagonal) const {
+  return Product<Derived, DiagonalDerived, LazyProduct>(derived(), a_diagonal.derived());
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_DIAGONALPRODUCT_H
+#endif  // EIGEN_DIAGONALPRODUCT_H
diff --git a/Eigen/src/Core/Dot.h b/Eigen/src/Core/Dot.h
index a8ce736..82eb9c7 100644
--- a/Eigen/src/Core/Dot.h
+++ b/Eigen/src/Core/Dot.h
@@ -13,305 +13,277 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
 // helper function for dot(). The problem is that if we put that in the body of dot(), then upon calling dot
 // with mismatched types, the compiler emits errors about failing to instantiate cwiseProduct BEFORE
 // looking at the static assertions. Thus this is a trick to get better compile errors.
-template<typename T, typename U,
-         bool NeedToTranspose = T::IsVectorAtCompileTime && U::IsVectorAtCompileTime &&
-                ((int(T::RowsAtCompileTime) == 1 && int(U::ColsAtCompileTime) == 1) ||
-                 (int(T::ColsAtCompileTime) == 1 && int(U::RowsAtCompileTime) == 1))>
-struct dot_nocheck
-{
-  typedef scalar_conj_product_op<typename traits<T>::Scalar,typename traits<U>::Scalar> conj_prod;
+template <typename T, typename U,
+          bool NeedToTranspose = T::IsVectorAtCompileTime && U::IsVectorAtCompileTime &&
+                                 ((int(T::RowsAtCompileTime) == 1 && int(U::ColsAtCompileTime) == 1) ||
+                                  (int(T::ColsAtCompileTime) == 1 && int(U::RowsAtCompileTime) == 1))>
+struct dot_nocheck {
+  typedef scalar_conj_product_op<typename traits<T>::Scalar, typename traits<U>::Scalar> conj_prod;
   typedef typename conj_prod::result_type ResScalar;
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE
-  static ResScalar run(const MatrixBase<T>& a, const MatrixBase<U>& b)
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE static ResScalar run(const MatrixBase<T>& a, const MatrixBase<U>& b) {
     return a.template binaryExpr<conj_prod>(b).sum();
   }
 };
 
-template<typename T, typename U>
-struct dot_nocheck<T, U, true>
-{
-  typedef scalar_conj_product_op<typename traits<T>::Scalar,typename traits<U>::Scalar> conj_prod;
+template <typename T, typename U>
+struct dot_nocheck<T, U, true> {
+  typedef scalar_conj_product_op<typename traits<T>::Scalar, typename traits<U>::Scalar> conj_prod;
   typedef typename conj_prod::result_type ResScalar;
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE
-  static ResScalar run(const MatrixBase<T>& a, const MatrixBase<U>& b)
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE static ResScalar run(const MatrixBase<T>& a, const MatrixBase<U>& b) {
     return a.transpose().template binaryExpr<conj_prod>(b).sum();
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \fn MatrixBase::dot
-  * \returns the dot product of *this with other.
-  *
-  * \only_for_vectors
-  *
-  * \note If the scalar type is complex numbers, then this function returns the hermitian
-  * (sesquilinear) dot product, conjugate-linear in the first variable and linear in the
-  * second variable.
-  *
-  * \sa squaredNorm(), norm()
-  */
-template<typename Derived>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC
-EIGEN_STRONG_INLINE
-typename ScalarBinaryOpTraits<typename internal::traits<Derived>::Scalar,typename internal::traits<OtherDerived>::Scalar>::ReturnType
-MatrixBase<Derived>::dot(const MatrixBase<OtherDerived>& other) const
-{
+ * \returns the dot product of *this with other.
+ *
+ * \only_for_vectors
+ *
+ * \note If the scalar type is complex numbers, then this function returns the hermitian
+ * (sesquilinear) dot product, conjugate-linear in the first variable and linear in the
+ * second variable.
+ *
+ * \sa squaredNorm(), norm()
+ */
+template <typename Derived>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
+    typename ScalarBinaryOpTraits<typename internal::traits<Derived>::Scalar,
+                                  typename internal::traits<OtherDerived>::Scalar>::ReturnType
+    MatrixBase<Derived>::dot(const MatrixBase<OtherDerived>& other) const {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
-  EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived)
+  EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived, OtherDerived)
 #if !(defined(EIGEN_NO_STATIC_ASSERT) && defined(EIGEN_NO_DEBUG))
   EIGEN_CHECK_BINARY_COMPATIBILIY(
-      Eigen::internal::scalar_conj_product_op<Scalar EIGEN_COMMA typename OtherDerived::Scalar>, 
-      Scalar, typename OtherDerived::Scalar);
+      Eigen::internal::scalar_conj_product_op<Scalar EIGEN_COMMA typename OtherDerived::Scalar>, Scalar,
+      typename OtherDerived::Scalar);
 #endif
-  
+
   eigen_assert(size() == other.size());
 
-  return internal::dot_nocheck<Derived,OtherDerived>::run(*this, other);
+  return internal::dot_nocheck<Derived, OtherDerived>::run(*this, other);
 }
 
 //---------- implementation of L2 norm and related functions ----------
 
 /** \returns, for vectors, the squared \em l2 norm of \c *this, and for matrices the squared Frobenius norm.
-  * In both cases, it consists in the sum of the square of all the matrix entries.
-  * For vectors, this is also equals to the dot product of \c *this with itself.
-  *
-  * \sa dot(), norm(), lpNorm()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename NumTraits<typename internal::traits<Derived>::Scalar>::Real MatrixBase<Derived>::squaredNorm() const
-{
+ * In both cases, it consists in the sum of the square of all the matrix entries.
+ * For vectors, this is also equals to the dot product of \c *this with itself.
+ *
+ * \sa dot(), norm(), lpNorm()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
+MatrixBase<Derived>::squaredNorm() const {
   return numext::real((*this).cwiseAbs2().sum());
 }
 
 /** \returns, for vectors, the \em l2 norm of \c *this, and for matrices the Frobenius norm.
-  * In both cases, it consists in the square root of the sum of the square of all the matrix entries.
-  * For vectors, this is also equals to the square root of the dot product of \c *this with itself.
-  *
-  * \sa lpNorm(), dot(), squaredNorm()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename NumTraits<typename internal::traits<Derived>::Scalar>::Real MatrixBase<Derived>::norm() const
-{
+ * In both cases, it consists in the square root of the sum of the square of all the matrix entries.
+ * For vectors, this is also equals to the square root of the dot product of \c *this with itself.
+ *
+ * \sa lpNorm(), dot(), squaredNorm()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
+MatrixBase<Derived>::norm() const {
   return numext::sqrt(squaredNorm());
 }
 
 /** \returns an expression of the quotient of \c *this by its own norm.
-  *
-  * \warning If the input vector is too small (i.e., this->norm()==0),
-  *          then this function returns a copy of the input.
-  *
-  * \only_for_vectors
-  *
-  * \sa norm(), normalize()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::PlainObject
-MatrixBase<Derived>::normalized() const
-{
-  typedef typename internal::nested_eval<Derived,2>::type Nested_;
+ *
+ * \warning If the input vector is too small (i.e., this->norm()==0),
+ *          then this function returns a copy of the input.
+ *
+ * \only_for_vectors
+ *
+ * \sa norm(), normalize()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::PlainObject MatrixBase<Derived>::normalized()
+    const {
+  typedef typename internal::nested_eval<Derived, 2>::type Nested_;
   Nested_ n(derived());
   RealScalar z = n.squaredNorm();
   // NOTE: after extensive benchmarking, this conditional does not impact performance, at least on recent x86 CPU
-  if(z>RealScalar(0))
+  if (z > RealScalar(0))
     return n / numext::sqrt(z);
   else
     return n;
 }
 
 /** Normalizes the vector, i.e. divides it by its own norm.
-  *
-  * \only_for_vectors
-  *
-  * \warning If the input vector is too small (i.e., this->norm()==0), then \c *this is left unchanged.
-  *
-  * \sa norm(), normalized()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void MatrixBase<Derived>::normalize()
-{
+ *
+ * \only_for_vectors
+ *
+ * \warning If the input vector is too small (i.e., this->norm()==0), then \c *this is left unchanged.
+ *
+ * \sa norm(), normalized()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void MatrixBase<Derived>::normalize() {
   RealScalar z = squaredNorm();
   // NOTE: after extensive benchmarking, this conditional does not impact performance, at least on recent x86 CPU
-  if(z>RealScalar(0))
-    derived() /= numext::sqrt(z);
+  if (z > RealScalar(0)) derived() /= numext::sqrt(z);
 }
 
 /** \returns an expression of the quotient of \c *this by its own norm while avoiding underflow and overflow.
-  *
-  * \only_for_vectors
-  *
-  * This method is analogue to the normalized() method, but it reduces the risk of
-  * underflow and overflow when computing the norm.
-  *
-  * \warning If the input vector is too small (i.e., this->norm()==0),
-  *          then this function returns a copy of the input.
-  *
-  * \sa stableNorm(), stableNormalize(), normalized()
-  */
-template<typename Derived>
+ *
+ * \only_for_vectors
+ *
+ * This method is analogue to the normalized() method, but it reduces the risk of
+ * underflow and overflow when computing the norm.
+ *
+ * \warning If the input vector is too small (i.e., this->norm()==0),
+ *          then this function returns a copy of the input.
+ *
+ * \sa stableNorm(), stableNormalize(), normalized()
+ */
+template <typename Derived>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::PlainObject
-MatrixBase<Derived>::stableNormalized() const
-{
-  typedef typename internal::nested_eval<Derived,3>::type Nested_;
+MatrixBase<Derived>::stableNormalized() const {
+  typedef typename internal::nested_eval<Derived, 3>::type Nested_;
   Nested_ n(derived());
   RealScalar w = n.cwiseAbs().maxCoeff();
-  RealScalar z = (n/w).squaredNorm();
-  if(z>RealScalar(0))
-    return n / (numext::sqrt(z)*w);
+  RealScalar z = (n / w).squaredNorm();
+  if (z > RealScalar(0))
+    return n / (numext::sqrt(z) * w);
   else
     return n;
 }
 
 /** Normalizes the vector while avoid underflow and overflow
-  *
-  * \only_for_vectors
-  *
-  * This method is analogue to the normalize() method, but it reduces the risk of
-  * underflow and overflow when computing the norm.
-  *
-  * \warning If the input vector is too small (i.e., this->norm()==0), then \c *this is left unchanged.
-  *
-  * \sa stableNorm(), stableNormalized(), normalize()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void MatrixBase<Derived>::stableNormalize()
-{
+ *
+ * \only_for_vectors
+ *
+ * This method is analogue to the normalize() method, but it reduces the risk of
+ * underflow and overflow when computing the norm.
+ *
+ * \warning If the input vector is too small (i.e., this->norm()==0), then \c *this is left unchanged.
+ *
+ * \sa stableNorm(), stableNormalized(), normalize()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void MatrixBase<Derived>::stableNormalize() {
   RealScalar w = cwiseAbs().maxCoeff();
-  RealScalar z = (derived()/w).squaredNorm();
-  if(z>RealScalar(0))
-    derived() /= numext::sqrt(z)*w;
+  RealScalar z = (derived() / w).squaredNorm();
+  if (z > RealScalar(0)) derived() /= numext::sqrt(z) * w;
 }
 
 //---------- implementation of other norms ----------
 
 namespace internal {
 
-template<typename Derived, int p>
-struct lpNorm_selector
-{
+template <typename Derived, int p>
+struct lpNorm_selector {
   typedef typename NumTraits<typename traits<Derived>::Scalar>::Real RealScalar;
-  EIGEN_DEVICE_FUNC
-  static inline RealScalar run(const MatrixBase<Derived>& m)
-  {
+  EIGEN_DEVICE_FUNC static inline RealScalar run(const MatrixBase<Derived>& m) {
     EIGEN_USING_STD(pow)
-    return pow(m.cwiseAbs().array().pow(p).sum(), RealScalar(1)/p);
+    return pow(m.cwiseAbs().array().pow(p).sum(), RealScalar(1) / p);
   }
 };
 
-template<typename Derived>
-struct lpNorm_selector<Derived, 1>
-{
-  EIGEN_DEVICE_FUNC
-  static inline typename NumTraits<typename traits<Derived>::Scalar>::Real run(const MatrixBase<Derived>& m)
-  {
+template <typename Derived>
+struct lpNorm_selector<Derived, 1> {
+  EIGEN_DEVICE_FUNC static inline typename NumTraits<typename traits<Derived>::Scalar>::Real run(
+      const MatrixBase<Derived>& m) {
     return m.cwiseAbs().sum();
   }
 };
 
-template<typename Derived>
-struct lpNorm_selector<Derived, 2>
-{
-  EIGEN_DEVICE_FUNC
-  static inline typename NumTraits<typename traits<Derived>::Scalar>::Real run(const MatrixBase<Derived>& m)
-  {
+template <typename Derived>
+struct lpNorm_selector<Derived, 2> {
+  EIGEN_DEVICE_FUNC static inline typename NumTraits<typename traits<Derived>::Scalar>::Real run(
+      const MatrixBase<Derived>& m) {
     return m.norm();
   }
 };
 
-template<typename Derived>
-struct lpNorm_selector<Derived, Infinity>
-{
+template <typename Derived>
+struct lpNorm_selector<Derived, Infinity> {
   typedef typename NumTraits<typename traits<Derived>::Scalar>::Real RealScalar;
-  EIGEN_DEVICE_FUNC
-  static inline RealScalar run(const MatrixBase<Derived>& m)
-  {
-    if(Derived::SizeAtCompileTime==0 || (Derived::SizeAtCompileTime==Dynamic && m.size()==0))
+  EIGEN_DEVICE_FUNC static inline RealScalar run(const MatrixBase<Derived>& m) {
+    if (Derived::SizeAtCompileTime == 0 || (Derived::SizeAtCompileTime == Dynamic && m.size() == 0))
       return RealScalar(0);
     return m.cwiseAbs().maxCoeff();
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-/** \returns the \b coefficient-wise \f$ \ell^p \f$ norm of \c *this, that is, returns the p-th root of the sum of the p-th powers of the absolute values
-  *          of the coefficients of \c *this. If \a p is the special value \a Eigen::Infinity, this function returns the \f$ \ell^\infty \f$
-  *          norm, that is the maximum of the absolute values of the coefficients of \c *this.
-  *
-  * In all cases, if \c *this is empty, then the value 0 is returned.
-  *
-  * \note For matrices, this function does not compute the <a href="https://en.wikipedia.org/wiki/Operator_norm">operator-norm</a>. That is, if \c *this is a matrix, then its coefficients are interpreted as a 1D vector. Nonetheless, you can easily compute the 1-norm and \f$\infty\f$-norm matrix operator norms using \link TutorialReductionsVisitorsBroadcastingReductionsNorm partial reductions \endlink.
-  *
-  * \sa norm()
-  */
-template<typename Derived>
-template<int p>
+/** \returns the \b coefficient-wise \f$ \ell^p \f$ norm of \c *this, that is, returns the p-th root of the sum of the
+ * p-th powers of the absolute values of the coefficients of \c *this. If \a p is the special value \a Eigen::Infinity,
+ * this function returns the \f$ \ell^\infty \f$ norm, that is the maximum of the absolute values of the coefficients of
+ * \c *this.
+ *
+ * In all cases, if \c *this is empty, then the value 0 is returned.
+ *
+ * \note For matrices, this function does not compute the <a
+ * href="https://en.wikipedia.org/wiki/Operator_norm">operator-norm</a>. That is, if \c *this is a matrix, then its
+ * coefficients are interpreted as a 1D vector. Nonetheless, you can easily compute the 1-norm and \f$\infty\f$-norm
+ * matrix operator norms using \link TutorialReductionsVisitorsBroadcastingReductionsNorm partial reductions \endlink.
+ *
+ * \sa norm()
+ */
+template <typename Derived>
+template <int p>
 #ifndef EIGEN_PARSED_BY_DOXYGEN
 EIGEN_DEVICE_FUNC inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
 #else
 EIGEN_DEVICE_FUNC MatrixBase<Derived>::RealScalar
 #endif
-MatrixBase<Derived>::lpNorm() const
-{
+MatrixBase<Derived>::lpNorm() const {
   return internal::lpNorm_selector<Derived, p>::run(*this);
 }
 
 //---------- implementation of isOrthogonal / isUnitary ----------
 
 /** \returns true if *this is approximately orthogonal to \a other,
-  *          within the precision given by \a prec.
-  *
-  * Example: \include MatrixBase_isOrthogonal.cpp
-  * Output: \verbinclude MatrixBase_isOrthogonal.out
-  */
-template<typename Derived>
-template<typename OtherDerived>
-bool MatrixBase<Derived>::isOrthogonal
-(const MatrixBase<OtherDerived>& other, const RealScalar& prec) const
-{
-  typename internal::nested_eval<Derived,2>::type nested(derived());
-  typename internal::nested_eval<OtherDerived,2>::type otherNested(other.derived());
+ *          within the precision given by \a prec.
+ *
+ * Example: \include MatrixBase_isOrthogonal.cpp
+ * Output: \verbinclude MatrixBase_isOrthogonal.out
+ */
+template <typename Derived>
+template <typename OtherDerived>
+bool MatrixBase<Derived>::isOrthogonal(const MatrixBase<OtherDerived>& other, const RealScalar& prec) const {
+  typename internal::nested_eval<Derived, 2>::type nested(derived());
+  typename internal::nested_eval<OtherDerived, 2>::type otherNested(other.derived());
   return numext::abs2(nested.dot(otherNested)) <= prec * prec * nested.squaredNorm() * otherNested.squaredNorm();
 }
 
 /** \returns true if *this is approximately an unitary matrix,
-  *          within the precision given by \a prec. In the case where the \a Scalar
-  *          type is real numbers, a unitary matrix is an orthogonal matrix, whence the name.
-  *
-  * \note This can be used to check whether a family of vectors forms an orthonormal basis.
-  *       Indeed, \c m.isUnitary() returns true if and only if the columns (equivalently, the rows) of m form an
-  *       orthonormal basis.
-  *
-  * Example: \include MatrixBase_isUnitary.cpp
-  * Output: \verbinclude MatrixBase_isUnitary.out
-  */
-template<typename Derived>
-bool MatrixBase<Derived>::isUnitary(const RealScalar& prec) const
-{
-  typename internal::nested_eval<Derived,1>::type self(derived());
-  for(Index i = 0; i < cols(); ++i)
-  {
-    if(!internal::isApprox(self.col(i).squaredNorm(), static_cast<RealScalar>(1), prec))
-      return false;
-    for(Index j = 0; j < i; ++j)
-      if(!internal::isMuchSmallerThan(self.col(i).dot(self.col(j)), static_cast<Scalar>(1), prec))
-        return false;
+ *          within the precision given by \a prec. In the case where the \a Scalar
+ *          type is real numbers, a unitary matrix is an orthogonal matrix, whence the name.
+ *
+ * \note This can be used to check whether a family of vectors forms an orthonormal basis.
+ *       Indeed, \c m.isUnitary() returns true if and only if the columns (equivalently, the rows) of m form an
+ *       orthonormal basis.
+ *
+ * Example: \include MatrixBase_isUnitary.cpp
+ * Output: \verbinclude MatrixBase_isUnitary.out
+ */
+template <typename Derived>
+bool MatrixBase<Derived>::isUnitary(const RealScalar& prec) const {
+  typename internal::nested_eval<Derived, 1>::type self(derived());
+  for (Index i = 0; i < cols(); ++i) {
+    if (!internal::isApprox(self.col(i).squaredNorm(), static_cast<RealScalar>(1), prec)) return false;
+    for (Index j = 0; j < i; ++j)
+      if (!internal::isMuchSmallerThan(self.col(i).dot(self.col(j)), static_cast<Scalar>(1), prec)) return false;
   }
   return true;
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_DOT_H
+#endif  // EIGEN_DOT_H
diff --git a/Eigen/src/Core/EigenBase.h b/Eigen/src/Core/EigenBase.h
index 251125b..f485016 100644
--- a/Eigen/src/Core/EigenBase.h
+++ b/Eigen/src/Core/EigenBase.h
@@ -17,147 +17,128 @@
 namespace Eigen {
 
 /** \class EigenBase
-  * \ingroup Core_Module
-  *
-  * Common base class for all classes T such that MatrixBase has an operator=(T) and a constructor MatrixBase(T).
-  *
-  * In other words, an EigenBase object is an object that can be copied into a MatrixBase.
-  *
-  * Besides MatrixBase-derived classes, this also includes special matrix classes such as diagonal matrices, etc.
-  *
-  * Notice that this class is trivial, it is only used to disambiguate overloaded functions.
-  *
-  * \sa \blank \ref TopicClassHierarchy
-  */
-template<typename Derived> struct EigenBase
-{
-//   typedef typename internal::plain_matrix_type<Derived>::type PlainObject;
+ * \ingroup Core_Module
+ *
+ * Common base class for all classes T such that MatrixBase has an operator=(T) and a constructor MatrixBase(T).
+ *
+ * In other words, an EigenBase object is an object that can be copied into a MatrixBase.
+ *
+ * Besides MatrixBase-derived classes, this also includes special matrix classes such as diagonal matrices, etc.
+ *
+ * Notice that this class is trivial, it is only used to disambiguate overloaded functions.
+ *
+ * \sa \blank \ref TopicClassHierarchy
+ */
+template <typename Derived>
+struct EigenBase {
+  //   typedef typename internal::plain_matrix_type<Derived>::type PlainObject;
 
   /** \brief The interface type of indices
-    * \details To change this, \c \#define the preprocessor symbol \c EIGEN_DEFAULT_DENSE_INDEX_TYPE.
-    * \sa StorageIndex, \ref TopicPreprocessorDirectives.
-    * DEPRECATED: Since Eigen 3.3, its usage is deprecated. Use Eigen::Index instead.
-    * Deprecation is not marked with a doxygen comment because there are too many existing usages to add the deprecation attribute.
-    */
+   * \details To change this, \c \#define the preprocessor symbol \c EIGEN_DEFAULT_DENSE_INDEX_TYPE.
+   * \sa StorageIndex, \ref TopicPreprocessorDirectives.
+   * DEPRECATED: Since Eigen 3.3, its usage is deprecated. Use Eigen::Index instead.
+   * Deprecation is not marked with a doxygen comment because there are too many existing usages to add the deprecation
+   * attribute.
+   */
   typedef Eigen::Index Index;
 
   // FIXME is it needed?
   typedef typename internal::traits<Derived>::StorageKind StorageKind;
 
   /** \returns a reference to the derived object */
-  EIGEN_DEVICE_FUNC
-  Derived& derived() { return *static_cast<Derived*>(this); }
+  EIGEN_DEVICE_FUNC Derived& derived() { return *static_cast<Derived*>(this); }
   /** \returns a const reference to the derived object */
-  EIGEN_DEVICE_FUNC
-  const Derived& derived() const { return *static_cast<const Derived*>(this); }
+  EIGEN_DEVICE_FUNC const Derived& derived() const { return *static_cast<const Derived*>(this); }
 
-  EIGEN_DEVICE_FUNC
-  inline Derived& const_cast_derived() const
-  { return *static_cast<Derived*>(const_cast<EigenBase*>(this)); }
-  EIGEN_DEVICE_FUNC
-  inline const Derived& const_derived() const
-  { return *static_cast<const Derived*>(this); }
+  EIGEN_DEVICE_FUNC inline Derived& const_cast_derived() const {
+    return *static_cast<Derived*>(const_cast<EigenBase*>(this));
+  }
+  EIGEN_DEVICE_FUNC inline const Derived& const_derived() const { return *static_cast<const Derived*>(this); }
 
   /** \returns the number of rows. \sa cols(), RowsAtCompileTime */
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  inline Index rows() const EIGEN_NOEXCEPT { return derived().rows(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index rows() const EIGEN_NOEXCEPT { return derived().rows(); }
   /** \returns the number of columns. \sa rows(), ColsAtCompileTime*/
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  inline Index cols() const EIGEN_NOEXCEPT { return derived().cols(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index cols() const EIGEN_NOEXCEPT { return derived().cols(); }
   /** \returns the number of coefficients, which is rows()*cols().
-    * \sa rows(), cols(), SizeAtCompileTime. */
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  inline Index size() const EIGEN_NOEXCEPT { return rows() * cols(); }
+   * \sa rows(), cols(), SizeAtCompileTime. */
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index size() const EIGEN_NOEXCEPT { return rows() * cols(); }
 
   /** \internal Don't use it, but do the equivalent: \code dst = *this; \endcode */
-  template<typename Dest>
-  EIGEN_DEVICE_FUNC
-  inline void evalTo(Dest& dst) const
-  { derived().evalTo(dst); }
+  template <typename Dest>
+  EIGEN_DEVICE_FUNC inline void evalTo(Dest& dst) const {
+    derived().evalTo(dst);
+  }
 
   /** \internal Don't use it, but do the equivalent: \code dst += *this; \endcode */
-  template<typename Dest>
-  EIGEN_DEVICE_FUNC
-  inline void addTo(Dest& dst) const
-  {
+  template <typename Dest>
+  EIGEN_DEVICE_FUNC inline void addTo(Dest& dst) const {
     // This is the default implementation,
     // derived class can reimplement it in a more optimized way.
-    typename Dest::PlainObject res(rows(),cols());
+    typename Dest::PlainObject res(rows(), cols());
     evalTo(res);
     dst += res;
   }
 
   /** \internal Don't use it, but do the equivalent: \code dst -= *this; \endcode */
-  template<typename Dest>
-  EIGEN_DEVICE_FUNC
-  inline void subTo(Dest& dst) const
-  {
+  template <typename Dest>
+  EIGEN_DEVICE_FUNC inline void subTo(Dest& dst) const {
     // This is the default implementation,
     // derived class can reimplement it in a more optimized way.
-    typename Dest::PlainObject res(rows(),cols());
+    typename Dest::PlainObject res(rows(), cols());
     evalTo(res);
     dst -= res;
   }
 
   /** \internal Don't use it, but do the equivalent: \code dst.applyOnTheRight(*this); \endcode */
-  template<typename Dest>
-  EIGEN_DEVICE_FUNC inline void applyThisOnTheRight(Dest& dst) const
-  {
+  template <typename Dest>
+  EIGEN_DEVICE_FUNC inline void applyThisOnTheRight(Dest& dst) const {
     // This is the default implementation,
     // derived class can reimplement it in a more optimized way.
     dst = dst * this->derived();
   }
 
   /** \internal Don't use it, but do the equivalent: \code dst.applyOnTheLeft(*this); \endcode */
-  template<typename Dest>
-  EIGEN_DEVICE_FUNC inline void applyThisOnTheLeft(Dest& dst) const
-  {
+  template <typename Dest>
+  EIGEN_DEVICE_FUNC inline void applyThisOnTheLeft(Dest& dst) const {
     // This is the default implementation,
     // derived class can reimplement it in a more optimized way.
     dst = this->derived() * dst;
   }
-
 };
 
 /***************************************************************************
-* Implementation of matrix base methods
-***************************************************************************/
+ * Implementation of matrix base methods
+ ***************************************************************************/
 
 /** \brief Copies the generic expression \a other into *this.
-  *
-  * \details The expression must provide a (templated) evalTo(Derived& dst) const
-  * function which does the actual job. In practice, this allows any user to write
-  * its own special matrix without having to modify MatrixBase
-  *
-  * \returns a reference to *this.
-  */
-template<typename Derived>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC
-Derived& DenseBase<Derived>::operator=(const EigenBase<OtherDerived> &other)
-{
+ *
+ * \details The expression must provide a (templated) evalTo(Derived& dst) const
+ * function which does the actual job. In practice, this allows any user to write
+ * its own special matrix without having to modify MatrixBase
+ *
+ * \returns a reference to *this.
+ */
+template <typename Derived>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC Derived& DenseBase<Derived>::operator=(const EigenBase<OtherDerived>& other) {
   call_assignment(derived(), other.derived());
   return derived();
 }
 
-template<typename Derived>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC
-Derived& DenseBase<Derived>::operator+=(const EigenBase<OtherDerived> &other)
-{
-  call_assignment(derived(), other.derived(), internal::add_assign_op<Scalar,typename OtherDerived::Scalar>());
+template <typename Derived>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC Derived& DenseBase<Derived>::operator+=(const EigenBase<OtherDerived>& other) {
+  call_assignment(derived(), other.derived(), internal::add_assign_op<Scalar, typename OtherDerived::Scalar>());
   return derived();
 }
 
-template<typename Derived>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC
-Derived& DenseBase<Derived>::operator-=(const EigenBase<OtherDerived> &other)
-{
-  call_assignment(derived(), other.derived(), internal::sub_assign_op<Scalar,typename OtherDerived::Scalar>());
+template <typename Derived>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC Derived& DenseBase<Derived>::operator-=(const EigenBase<OtherDerived>& other) {
+  call_assignment(derived(), other.derived(), internal::sub_assign_op<Scalar, typename OtherDerived::Scalar>());
   return derived();
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_EIGENBASE_H
+#endif  // EIGEN_EIGENBASE_H
diff --git a/Eigen/src/Core/ForceAlignedAccess.h b/Eigen/src/Core/ForceAlignedAccess.h
index 643ff9b..a91b0da 100644
--- a/Eigen/src/Core/ForceAlignedAccess.h
+++ b/Eigen/src/Core/ForceAlignedAccess.h
@@ -16,138 +16,116 @@
 namespace Eigen {
 
 /** \class ForceAlignedAccess
-  * \ingroup Core_Module
-  *
-  * \brief Enforce aligned packet loads and stores regardless of what is requested
-  *
-  * \param ExpressionType the type of the object of which we are forcing aligned packet access
-  *
-  * This class is the return type of MatrixBase::forceAlignedAccess()
-  * and most of the time this is the only way it is used.
-  *
-  * \sa MatrixBase::forceAlignedAccess()
-  */
+ * \ingroup Core_Module
+ *
+ * \brief Enforce aligned packet loads and stores regardless of what is requested
+ *
+ * \param ExpressionType the type of the object of which we are forcing aligned packet access
+ *
+ * This class is the return type of MatrixBase::forceAlignedAccess()
+ * and most of the time this is the only way it is used.
+ *
+ * \sa MatrixBase::forceAlignedAccess()
+ */
 
 namespace internal {
-template<typename ExpressionType>
-struct traits<ForceAlignedAccess<ExpressionType> > : public traits<ExpressionType>
-{};
-}
+template <typename ExpressionType>
+struct traits<ForceAlignedAccess<ExpressionType>> : public traits<ExpressionType> {};
+}  // namespace internal
 
-template<typename ExpressionType> class ForceAlignedAccess
-  : public internal::dense_xpr_base< ForceAlignedAccess<ExpressionType> >::type
-{
-  public:
+template <typename ExpressionType>
+class ForceAlignedAccess : public internal::dense_xpr_base<ForceAlignedAccess<ExpressionType>>::type {
+ public:
+  typedef typename internal::dense_xpr_base<ForceAlignedAccess>::type Base;
+  EIGEN_DENSE_PUBLIC_INTERFACE(ForceAlignedAccess)
 
-    typedef typename internal::dense_xpr_base<ForceAlignedAccess>::type Base;
-    EIGEN_DENSE_PUBLIC_INTERFACE(ForceAlignedAccess)
+  EIGEN_DEVICE_FUNC explicit inline ForceAlignedAccess(const ExpressionType& matrix) : m_expression(matrix) {}
 
-    EIGEN_DEVICE_FUNC explicit inline ForceAlignedAccess(const ExpressionType& matrix) : m_expression(matrix) {}
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index rows() const EIGEN_NOEXCEPT { return m_expression.rows(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index cols() const EIGEN_NOEXCEPT { return m_expression.cols(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index outerStride() const EIGEN_NOEXCEPT {
+    return m_expression.outerStride();
+  }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index innerStride() const EIGEN_NOEXCEPT {
+    return m_expression.innerStride();
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index rows() const EIGEN_NOEXCEPT { return m_expression.rows(); }
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index cols() const EIGEN_NOEXCEPT { return m_expression.cols(); }
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index outerStride() const EIGEN_NOEXCEPT { return m_expression.outerStride(); }
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index innerStride() const EIGEN_NOEXCEPT { return m_expression.innerStride(); }
+  EIGEN_DEVICE_FUNC inline const CoeffReturnType coeff(Index row, Index col) const {
+    return m_expression.coeff(row, col);
+  }
 
-    EIGEN_DEVICE_FUNC inline const CoeffReturnType coeff(Index row, Index col) const
-    {
-      return m_expression.coeff(row, col);
-    }
+  EIGEN_DEVICE_FUNC inline Scalar& coeffRef(Index row, Index col) {
+    return m_expression.const_cast_derived().coeffRef(row, col);
+  }
 
-    EIGEN_DEVICE_FUNC inline Scalar& coeffRef(Index row, Index col)
-    {
-      return m_expression.const_cast_derived().coeffRef(row, col);
-    }
+  EIGEN_DEVICE_FUNC inline const CoeffReturnType coeff(Index index) const { return m_expression.coeff(index); }
 
-    EIGEN_DEVICE_FUNC inline const CoeffReturnType coeff(Index index) const
-    {
-      return m_expression.coeff(index);
-    }
+  EIGEN_DEVICE_FUNC inline Scalar& coeffRef(Index index) { return m_expression.const_cast_derived().coeffRef(index); }
 
-    EIGEN_DEVICE_FUNC inline Scalar& coeffRef(Index index)
-    {
-      return m_expression.const_cast_derived().coeffRef(index);
-    }
+  template <int LoadMode>
+  inline const PacketScalar packet(Index row, Index col) const {
+    return m_expression.template packet<Aligned>(row, col);
+  }
 
-    template<int LoadMode>
-    inline const PacketScalar packet(Index row, Index col) const
-    {
-      return m_expression.template packet<Aligned>(row, col);
-    }
+  template <int LoadMode>
+  inline void writePacket(Index row, Index col, const PacketScalar& x) {
+    m_expression.const_cast_derived().template writePacket<Aligned>(row, col, x);
+  }
 
-    template<int LoadMode>
-    inline void writePacket(Index row, Index col, const PacketScalar& x)
-    {
-      m_expression.const_cast_derived().template writePacket<Aligned>(row, col, x);
-    }
+  template <int LoadMode>
+  inline const PacketScalar packet(Index index) const {
+    return m_expression.template packet<Aligned>(index);
+  }
 
-    template<int LoadMode>
-    inline const PacketScalar packet(Index index) const
-    {
-      return m_expression.template packet<Aligned>(index);
-    }
+  template <int LoadMode>
+  inline void writePacket(Index index, const PacketScalar& x) {
+    m_expression.const_cast_derived().template writePacket<Aligned>(index, x);
+  }
 
-    template<int LoadMode>
-    inline void writePacket(Index index, const PacketScalar& x)
-    {
-      m_expression.const_cast_derived().template writePacket<Aligned>(index, x);
-    }
+  EIGEN_DEVICE_FUNC operator const ExpressionType&() const { return m_expression; }
 
-    EIGEN_DEVICE_FUNC operator const ExpressionType&() const { return m_expression; }
+ protected:
+  const ExpressionType& m_expression;
 
-  protected:
-    const ExpressionType& m_expression;
-
-  private:
-    ForceAlignedAccess& operator=(const ForceAlignedAccess&);
+ private:
+  ForceAlignedAccess& operator=(const ForceAlignedAccess&);
 };
 
 /** \returns an expression of *this with forced aligned access
-  * \sa forceAlignedAccessIf(),class ForceAlignedAccess
-  */
-template<typename Derived>
-inline const ForceAlignedAccess<Derived>
-MatrixBase<Derived>::forceAlignedAccess() const
-{
+ * \sa forceAlignedAccessIf(),class ForceAlignedAccess
+ */
+template <typename Derived>
+inline const ForceAlignedAccess<Derived> MatrixBase<Derived>::forceAlignedAccess() const {
   return ForceAlignedAccess<Derived>(derived());
 }
 
 /** \returns an expression of *this with forced aligned access
-  * \sa forceAlignedAccessIf(), class ForceAlignedAccess
-  */
-template<typename Derived>
-inline ForceAlignedAccess<Derived>
-MatrixBase<Derived>::forceAlignedAccess()
-{
+ * \sa forceAlignedAccessIf(), class ForceAlignedAccess
+ */
+template <typename Derived>
+inline ForceAlignedAccess<Derived> MatrixBase<Derived>::forceAlignedAccess() {
   return ForceAlignedAccess<Derived>(derived());
 }
 
 /** \returns an expression of *this with forced aligned access if \a Enable is true.
-  * \sa forceAlignedAccess(), class ForceAlignedAccess
-  */
-template<typename Derived>
-template<bool Enable>
-inline add_const_on_value_type_t<std::conditional_t<Enable,ForceAlignedAccess<Derived>,Derived&>>
-MatrixBase<Derived>::forceAlignedAccessIf() const
-{
+ * \sa forceAlignedAccess(), class ForceAlignedAccess
+ */
+template <typename Derived>
+template <bool Enable>
+inline add_const_on_value_type_t<std::conditional_t<Enable, ForceAlignedAccess<Derived>, Derived&>>
+MatrixBase<Derived>::forceAlignedAccessIf() const {
   return derived();  // FIXME This should not work but apparently is never used
 }
 
 /** \returns an expression of *this with forced aligned access if \a Enable is true.
-  * \sa forceAlignedAccess(), class ForceAlignedAccess
-  */
-template<typename Derived>
-template<bool Enable>
-inline std::conditional_t<Enable,ForceAlignedAccess<Derived>,Derived&>
-MatrixBase<Derived>::forceAlignedAccessIf()
-{
+ * \sa forceAlignedAccess(), class ForceAlignedAccess
+ */
+template <typename Derived>
+template <bool Enable>
+inline std::conditional_t<Enable, ForceAlignedAccess<Derived>, Derived&> MatrixBase<Derived>::forceAlignedAccessIf() {
   return derived();  // FIXME This should not work but apparently is never used
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_FORCEALIGNEDACCESS_H
+#endif  // EIGEN_FORCEALIGNEDACCESS_H
diff --git a/Eigen/src/Core/Fuzzy.h b/Eigen/src/Core/Fuzzy.h
index 26b25c2..ed6b4ff 100644
--- a/Eigen/src/Core/Fuzzy.h
+++ b/Eigen/src/Core/Fuzzy.h
@@ -14,145 +14,119 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
-namespace internal
-{
+namespace internal {
 
-template<typename Derived, typename OtherDerived, bool is_integer = NumTraits<typename Derived::Scalar>::IsInteger>
-struct isApprox_selector
-{
-  EIGEN_DEVICE_FUNC
-  static bool run(const Derived& x, const OtherDerived& y, const typename Derived::RealScalar& prec)
-  {
-    typename internal::nested_eval<Derived,2>::type nested(x);
-    typename internal::nested_eval<OtherDerived,2>::type otherNested(y);
-    return (nested.matrix() - otherNested.matrix()).cwiseAbs2().sum() <= prec * prec * numext::mini(nested.cwiseAbs2().sum(), otherNested.cwiseAbs2().sum());
+template <typename Derived, typename OtherDerived, bool is_integer = NumTraits<typename Derived::Scalar>::IsInteger>
+struct isApprox_selector {
+  EIGEN_DEVICE_FUNC static bool run(const Derived& x, const OtherDerived& y, const typename Derived::RealScalar& prec) {
+    typename internal::nested_eval<Derived, 2>::type nested(x);
+    typename internal::nested_eval<OtherDerived, 2>::type otherNested(y);
+    return (nested.matrix() - otherNested.matrix()).cwiseAbs2().sum() <=
+           prec * prec * numext::mini(nested.cwiseAbs2().sum(), otherNested.cwiseAbs2().sum());
   }
 };
 
-template<typename Derived, typename OtherDerived>
-struct isApprox_selector<Derived, OtherDerived, true>
-{
-  EIGEN_DEVICE_FUNC
-  static bool run(const Derived& x, const OtherDerived& y, const typename Derived::RealScalar&)
-  {
+template <typename Derived, typename OtherDerived>
+struct isApprox_selector<Derived, OtherDerived, true> {
+  EIGEN_DEVICE_FUNC static bool run(const Derived& x, const OtherDerived& y, const typename Derived::RealScalar&) {
     return x.matrix() == y.matrix();
   }
 };
 
-template<typename Derived, typename OtherDerived, bool is_integer = NumTraits<typename Derived::Scalar>::IsInteger>
-struct isMuchSmallerThan_object_selector
-{
-  EIGEN_DEVICE_FUNC
-  static bool run(const Derived& x, const OtherDerived& y, const typename Derived::RealScalar& prec)
-  {
+template <typename Derived, typename OtherDerived, bool is_integer = NumTraits<typename Derived::Scalar>::IsInteger>
+struct isMuchSmallerThan_object_selector {
+  EIGEN_DEVICE_FUNC static bool run(const Derived& x, const OtherDerived& y, const typename Derived::RealScalar& prec) {
     return x.cwiseAbs2().sum() <= numext::abs2(prec) * y.cwiseAbs2().sum();
   }
 };
 
-template<typename Derived, typename OtherDerived>
-struct isMuchSmallerThan_object_selector<Derived, OtherDerived, true>
-{
-  EIGEN_DEVICE_FUNC
-  static bool run(const Derived& x, const OtherDerived&, const typename Derived::RealScalar&)
-  {
+template <typename Derived, typename OtherDerived>
+struct isMuchSmallerThan_object_selector<Derived, OtherDerived, true> {
+  EIGEN_DEVICE_FUNC static bool run(const Derived& x, const OtherDerived&, const typename Derived::RealScalar&) {
     return x.matrix() == Derived::Zero(x.rows(), x.cols()).matrix();
   }
 };
 
-template<typename Derived, bool is_integer = NumTraits<typename Derived::Scalar>::IsInteger>
-struct isMuchSmallerThan_scalar_selector
-{
-  EIGEN_DEVICE_FUNC
-  static bool run(const Derived& x, const typename Derived::RealScalar& y, const typename Derived::RealScalar& prec)
-  {
+template <typename Derived, bool is_integer = NumTraits<typename Derived::Scalar>::IsInteger>
+struct isMuchSmallerThan_scalar_selector {
+  EIGEN_DEVICE_FUNC static bool run(const Derived& x, const typename Derived::RealScalar& y,
+                                    const typename Derived::RealScalar& prec) {
     return x.cwiseAbs2().sum() <= numext::abs2(prec * y);
   }
 };
 
-template<typename Derived>
-struct isMuchSmallerThan_scalar_selector<Derived, true>
-{
-  EIGEN_DEVICE_FUNC
-  static bool run(const Derived& x, const typename Derived::RealScalar&, const typename Derived::RealScalar&)
-  {
+template <typename Derived>
+struct isMuchSmallerThan_scalar_selector<Derived, true> {
+  EIGEN_DEVICE_FUNC static bool run(const Derived& x, const typename Derived::RealScalar&,
+                                    const typename Derived::RealScalar&) {
     return x.matrix() == Derived::Zero(x.rows(), x.cols()).matrix();
   }
 };
 
-} // end namespace internal
-
+}  // end namespace internal
 
 /** \returns \c true if \c *this is approximately equal to \a other, within the precision
-  * determined by \a prec.
-  *
-  * \note The fuzzy compares are done multiplicatively. Two vectors \f$ v \f$ and \f$ w \f$
-  * are considered to be approximately equal within precision \f$ p \f$ if
-  * \f[ \Vert v - w \Vert \leqslant p\,\min(\Vert v\Vert, \Vert w\Vert). \f]
-  * For matrices, the comparison is done using the Hilbert-Schmidt norm (aka Frobenius norm
-  * L2 norm).
-  *
-  * \note Because of the multiplicativeness of this comparison, one can't use this function
-  * to check whether \c *this is approximately equal to the zero matrix or vector.
-  * Indeed, \c isApprox(zero) returns false unless \c *this itself is exactly the zero matrix
-  * or vector. If you want to test whether \c *this is zero, use internal::isMuchSmallerThan(const
-  * RealScalar&, RealScalar) instead.
-  *
-  * \sa internal::isMuchSmallerThan(const RealScalar&, RealScalar) const
-  */
-template<typename Derived>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC bool DenseBase<Derived>::isApprox(
-  const DenseBase<OtherDerived>& other,
-  const RealScalar& prec
-) const
-{
+ * determined by \a prec.
+ *
+ * \note The fuzzy compares are done multiplicatively. Two vectors \f$ v \f$ and \f$ w \f$
+ * are considered to be approximately equal within precision \f$ p \f$ if
+ * \f[ \Vert v - w \Vert \leqslant p\,\min(\Vert v\Vert, \Vert w\Vert). \f]
+ * For matrices, the comparison is done using the Hilbert-Schmidt norm (aka Frobenius norm
+ * L2 norm).
+ *
+ * \note Because of the multiplicativeness of this comparison, one can't use this function
+ * to check whether \c *this is approximately equal to the zero matrix or vector.
+ * Indeed, \c isApprox(zero) returns false unless \c *this itself is exactly the zero matrix
+ * or vector. If you want to test whether \c *this is zero, use internal::isMuchSmallerThan(const
+ * RealScalar&, RealScalar) instead.
+ *
+ * \sa internal::isMuchSmallerThan(const RealScalar&, RealScalar) const
+ */
+template <typename Derived>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC bool DenseBase<Derived>::isApprox(const DenseBase<OtherDerived>& other,
+                                                    const RealScalar& prec) const {
   return internal::isApprox_selector<Derived, OtherDerived>::run(derived(), other.derived(), prec);
 }
 
 /** \returns \c true if the norm of \c *this is much smaller than \a other,
-  * within the precision determined by \a prec.
-  *
-  * \note The fuzzy compares are done multiplicatively. A vector \f$ v \f$ is
-  * considered to be much smaller than \f$ x \f$ within precision \f$ p \f$ if
-  * \f[ \Vert v \Vert \leqslant p\,\vert x\vert. \f]
-  *
-  * For matrices, the comparison is done using the Hilbert-Schmidt norm. For this reason,
-  * the value of the reference scalar \a other should come from the Hilbert-Schmidt norm
-  * of a reference matrix of same dimensions.
-  *
-  * \sa isApprox(), isMuchSmallerThan(const DenseBase<OtherDerived>&, RealScalar) const
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC bool DenseBase<Derived>::isMuchSmallerThan(
-  const typename NumTraits<Scalar>::Real& other,
-  const RealScalar& prec
-) const
-{
+ * within the precision determined by \a prec.
+ *
+ * \note The fuzzy compares are done multiplicatively. A vector \f$ v \f$ is
+ * considered to be much smaller than \f$ x \f$ within precision \f$ p \f$ if
+ * \f[ \Vert v \Vert \leqslant p\,\vert x\vert. \f]
+ *
+ * For matrices, the comparison is done using the Hilbert-Schmidt norm. For this reason,
+ * the value of the reference scalar \a other should come from the Hilbert-Schmidt norm
+ * of a reference matrix of same dimensions.
+ *
+ * \sa isApprox(), isMuchSmallerThan(const DenseBase<OtherDerived>&, RealScalar) const
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC bool DenseBase<Derived>::isMuchSmallerThan(const typename NumTraits<Scalar>::Real& other,
+                                                             const RealScalar& prec) const {
   return internal::isMuchSmallerThan_scalar_selector<Derived>::run(derived(), other, prec);
 }
 
 /** \returns \c true if the norm of \c *this is much smaller than the norm of \a other,
-  * within the precision determined by \a prec.
-  *
-  * \note The fuzzy compares are done multiplicatively. A vector \f$ v \f$ is
-  * considered to be much smaller than a vector \f$ w \f$ within precision \f$ p \f$ if
-  * \f[ \Vert v \Vert \leqslant p\,\Vert w\Vert. \f]
-  * For matrices, the comparison is done using the Hilbert-Schmidt norm.
-  *
-  * \sa isApprox(), isMuchSmallerThan(const RealScalar&, RealScalar) const
-  */
-template<typename Derived>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC bool DenseBase<Derived>::isMuchSmallerThan(
-  const DenseBase<OtherDerived>& other,
-  const RealScalar& prec
-) const
-{
+ * within the precision determined by \a prec.
+ *
+ * \note The fuzzy compares are done multiplicatively. A vector \f$ v \f$ is
+ * considered to be much smaller than a vector \f$ w \f$ within precision \f$ p \f$ if
+ * \f[ \Vert v \Vert \leqslant p\,\Vert w\Vert. \f]
+ * For matrices, the comparison is done using the Hilbert-Schmidt norm.
+ *
+ * \sa isApprox(), isMuchSmallerThan(const RealScalar&, RealScalar) const
+ */
+template <typename Derived>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC bool DenseBase<Derived>::isMuchSmallerThan(const DenseBase<OtherDerived>& other,
+                                                             const RealScalar& prec) const {
   return internal::isMuchSmallerThan_object_selector<Derived, OtherDerived>::run(derived(), other.derived(), prec);
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_FUZZY_H
+#endif  // EIGEN_FUZZY_H
diff --git a/Eigen/src/Core/GeneralProduct.h b/Eigen/src/Core/GeneralProduct.h
index 24a8a79..3ec6852 100644
--- a/Eigen/src/Core/GeneralProduct.h
+++ b/Eigen/src/Core/GeneralProduct.h
@@ -16,10 +16,7 @@
 
 namespace Eigen {
 
-enum {
-  Large = 2,
-  Small = 3
-};
+enum { Large = 2, Small = 3 };
 
 // Define the threshold value to fallback from the generic matrix-matrix product
 // implementation (heavy) to the lightweight coeff-based product one.
@@ -33,64 +30,58 @@
 
 namespace internal {
 
-template<int Rows, int Cols, int Depth> struct product_type_selector;
+template <int Rows, int Cols, int Depth>
+struct product_type_selector;
 
-template<int Size, int MaxSize> struct product_size_category
-{
+template <int Size, int MaxSize>
+struct product_size_category {
   enum {
-    #ifndef EIGEN_GPU_COMPILE_PHASE
-    is_large = MaxSize == Dynamic ||
-               Size >= EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD ||
-               (Size==Dynamic && MaxSize>=EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD),
-    #else
+#ifndef EIGEN_GPU_COMPILE_PHASE
+    is_large = MaxSize == Dynamic || Size >= EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD ||
+               (Size == Dynamic && MaxSize >= EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD),
+#else
     is_large = 0,
-    #endif
-    value = is_large  ? Large
-          : Size == 1 ? 1
-                      : Small
+#endif
+    value = is_large    ? Large
+            : Size == 1 ? 1
+                        : Small
   };
 };
 
-template<typename Lhs, typename Rhs> struct product_type
-{
+template <typename Lhs, typename Rhs>
+struct product_type {
   typedef remove_all_t<Lhs> Lhs_;
   typedef remove_all_t<Rhs> Rhs_;
   enum {
     MaxRows = traits<Lhs_>::MaxRowsAtCompileTime,
-    Rows    = traits<Lhs_>::RowsAtCompileTime,
+    Rows = traits<Lhs_>::RowsAtCompileTime,
     MaxCols = traits<Rhs_>::MaxColsAtCompileTime,
-    Cols    = traits<Rhs_>::ColsAtCompileTime,
-    MaxDepth = min_size_prefer_fixed(traits<Lhs_>::MaxColsAtCompileTime,
-                                     traits<Rhs_>::MaxRowsAtCompileTime),
-    Depth = min_size_prefer_fixed(traits<Lhs_>::ColsAtCompileTime,
-                                  traits<Rhs_>::RowsAtCompileTime)
+    Cols = traits<Rhs_>::ColsAtCompileTime,
+    MaxDepth = min_size_prefer_fixed(traits<Lhs_>::MaxColsAtCompileTime, traits<Rhs_>::MaxRowsAtCompileTime),
+    Depth = min_size_prefer_fixed(traits<Lhs_>::ColsAtCompileTime, traits<Rhs_>::RowsAtCompileTime)
   };
 
   // the splitting into different lines of code here, introducing the _select enums and the typedef below,
   // is to work around an internal compiler error with gcc 4.1 and 4.2.
-private:
+ private:
   enum {
-    rows_select = product_size_category<Rows,MaxRows>::value,
-    cols_select = product_size_category<Cols,MaxCols>::value,
-    depth_select = product_size_category<Depth,MaxDepth>::value
+    rows_select = product_size_category<Rows, MaxRows>::value,
+    cols_select = product_size_category<Cols, MaxCols>::value,
+    depth_select = product_size_category<Depth, MaxDepth>::value
   };
   typedef product_type_selector<rows_select, cols_select, depth_select> selector;
 
-public:
-  enum {
-    value = selector::ret,
-    ret = selector::ret
-  };
+ public:
+  enum { value = selector::ret, ret = selector::ret };
 #ifdef EIGEN_DEBUG_PRODUCT
-  static void debug()
-  {
-      EIGEN_DEBUG_VAR(Rows);
-      EIGEN_DEBUG_VAR(Cols);
-      EIGEN_DEBUG_VAR(Depth);
-      EIGEN_DEBUG_VAR(rows_select);
-      EIGEN_DEBUG_VAR(cols_select);
-      EIGEN_DEBUG_VAR(depth_select);
-      EIGEN_DEBUG_VAR(value);
+  static void debug() {
+    EIGEN_DEBUG_VAR(Rows);
+    EIGEN_DEBUG_VAR(Cols);
+    EIGEN_DEBUG_VAR(Depth);
+    EIGEN_DEBUG_VAR(rows_select);
+    EIGEN_DEBUG_VAR(cols_select);
+    EIGEN_DEBUG_VAR(depth_select);
+    EIGEN_DEBUG_VAR(value);
   }
 #endif
 };
@@ -99,36 +90,108 @@
  * based on the three dimensions of the product.
  * This is a compile time mapping from {1,Small,Large}^3 -> {product types} */
 // FIXME I'm not sure the current mapping is the ideal one.
-template<int M, int N>  struct product_type_selector<M,N,1>              { enum { ret = OuterProduct }; };
-template<int M>         struct product_type_selector<M, 1, 1>            { enum { ret = LazyCoeffBasedProductMode }; };
-template<int N>         struct product_type_selector<1, N, 1>            { enum { ret = LazyCoeffBasedProductMode }; };
-template<int Depth>     struct product_type_selector<1,    1,    Depth>  { enum { ret = InnerProduct }; };
-template<>              struct product_type_selector<1,    1,    1>      { enum { ret = InnerProduct }; };
-template<>              struct product_type_selector<Small,1,    Small>  { enum { ret = CoeffBasedProductMode }; };
-template<>              struct product_type_selector<1,    Small,Small>  { enum { ret = CoeffBasedProductMode }; };
-template<>              struct product_type_selector<Small,Small,Small>  { enum { ret = CoeffBasedProductMode }; };
-template<>              struct product_type_selector<Small, Small, 1>    { enum { ret = LazyCoeffBasedProductMode }; };
-template<>              struct product_type_selector<Small, Large, 1>    { enum { ret = LazyCoeffBasedProductMode }; };
-template<>              struct product_type_selector<Large, Small, 1>    { enum { ret = LazyCoeffBasedProductMode }; };
-template<>              struct product_type_selector<1,    Large,Small>  { enum { ret = CoeffBasedProductMode }; };
-template<>              struct product_type_selector<1,    Large,Large>  { enum { ret = GemvProduct }; };
-template<>              struct product_type_selector<1,    Small,Large>  { enum { ret = CoeffBasedProductMode }; };
-template<>              struct product_type_selector<Large,1,    Small>  { enum { ret = CoeffBasedProductMode }; };
-template<>              struct product_type_selector<Large,1,    Large>  { enum { ret = GemvProduct }; };
-template<>              struct product_type_selector<Small,1,    Large>  { enum { ret = CoeffBasedProductMode }; };
-template<>              struct product_type_selector<Small,Small,Large>  { enum { ret = GemmProduct }; };
-template<>              struct product_type_selector<Large,Small,Large>  { enum { ret = GemmProduct }; };
-template<>              struct product_type_selector<Small,Large,Large>  { enum { ret = GemmProduct }; };
-template<>              struct product_type_selector<Large,Large,Large>  { enum { ret = GemmProduct }; };
-template<>              struct product_type_selector<Large,Small,Small>  { enum { ret = CoeffBasedProductMode }; };
-template<>              struct product_type_selector<Small,Large,Small>  { enum { ret = CoeffBasedProductMode }; };
-template<>              struct product_type_selector<Large,Large,Small>  { enum { ret = GemmProduct }; };
+template <int M, int N>
+struct product_type_selector<M, N, 1> {
+  enum { ret = OuterProduct };
+};
+template <int M>
+struct product_type_selector<M, 1, 1> {
+  enum { ret = LazyCoeffBasedProductMode };
+};
+template <int N>
+struct product_type_selector<1, N, 1> {
+  enum { ret = LazyCoeffBasedProductMode };
+};
+template <int Depth>
+struct product_type_selector<1, 1, Depth> {
+  enum { ret = InnerProduct };
+};
+template <>
+struct product_type_selector<1, 1, 1> {
+  enum { ret = InnerProduct };
+};
+template <>
+struct product_type_selector<Small, 1, Small> {
+  enum { ret = CoeffBasedProductMode };
+};
+template <>
+struct product_type_selector<1, Small, Small> {
+  enum { ret = CoeffBasedProductMode };
+};
+template <>
+struct product_type_selector<Small, Small, Small> {
+  enum { ret = CoeffBasedProductMode };
+};
+template <>
+struct product_type_selector<Small, Small, 1> {
+  enum { ret = LazyCoeffBasedProductMode };
+};
+template <>
+struct product_type_selector<Small, Large, 1> {
+  enum { ret = LazyCoeffBasedProductMode };
+};
+template <>
+struct product_type_selector<Large, Small, 1> {
+  enum { ret = LazyCoeffBasedProductMode };
+};
+template <>
+struct product_type_selector<1, Large, Small> {
+  enum { ret = CoeffBasedProductMode };
+};
+template <>
+struct product_type_selector<1, Large, Large> {
+  enum { ret = GemvProduct };
+};
+template <>
+struct product_type_selector<1, Small, Large> {
+  enum { ret = CoeffBasedProductMode };
+};
+template <>
+struct product_type_selector<Large, 1, Small> {
+  enum { ret = CoeffBasedProductMode };
+};
+template <>
+struct product_type_selector<Large, 1, Large> {
+  enum { ret = GemvProduct };
+};
+template <>
+struct product_type_selector<Small, 1, Large> {
+  enum { ret = CoeffBasedProductMode };
+};
+template <>
+struct product_type_selector<Small, Small, Large> {
+  enum { ret = GemmProduct };
+};
+template <>
+struct product_type_selector<Large, Small, Large> {
+  enum { ret = GemmProduct };
+};
+template <>
+struct product_type_selector<Small, Large, Large> {
+  enum { ret = GemmProduct };
+};
+template <>
+struct product_type_selector<Large, Large, Large> {
+  enum { ret = GemmProduct };
+};
+template <>
+struct product_type_selector<Large, Small, Small> {
+  enum { ret = CoeffBasedProductMode };
+};
+template <>
+struct product_type_selector<Small, Large, Small> {
+  enum { ret = CoeffBasedProductMode };
+};
+template <>
+struct product_type_selector<Large, Large, Small> {
+  enum { ret = GemmProduct };
+};
 
-} // end namespace internal
+}  // end namespace internal
 
 /***********************************************************************
-*  Implementation of Inner Vector Vector Product
-***********************************************************************/
+ *  Implementation of Inner Vector Vector Product
+ ***********************************************************************/
 
 // FIXME : maybe the "inner product" could return a Scalar
 // instead of a 1x1 matrix ??
@@ -138,12 +201,12 @@
 // case, we could have a specialization for Block<MatrixType,1,1> with: operator=(Scalar x);
 
 /***********************************************************************
-*  Implementation of Outer Vector Vector Product
-***********************************************************************/
+ *  Implementation of Outer Vector Vector Product
+ ***********************************************************************/
 
 /***********************************************************************
-*  Implementation of General Matrix Vector Product
-***********************************************************************/
+ *  Implementation of General Matrix Vector Product
+ ***********************************************************************/
 
 /*  According to the shape/flags of the matrix we have to distinghish 3 different cases:
  *   1 - the matrix is col-major, BLAS compatible and M is large => call fast BLAS-like colmajor routine
@@ -154,79 +217,82 @@
  */
 namespace internal {
 
-template<int Side, int StorageOrder, bool BlasCompatible>
+template <int Side, int StorageOrder, bool BlasCompatible>
 struct gemv_dense_selector;
 
-} // end namespace internal
+}  // end namespace internal
 
 namespace internal {
 
-template<typename Scalar,int Size,int MaxSize,bool Cond> struct gemv_static_vector_if;
+template <typename Scalar, int Size, int MaxSize, bool Cond>
+struct gemv_static_vector_if;
 
-template<typename Scalar,int Size,int MaxSize>
-struct gemv_static_vector_if<Scalar,Size,MaxSize,false>
-{
-  EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Scalar* data() { eigen_internal_assert(false && "should never be called"); return 0; }
+template <typename Scalar, int Size, int MaxSize>
+struct gemv_static_vector_if<Scalar, Size, MaxSize, false> {
+  EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Scalar* data() {
+    eigen_internal_assert(false && "should never be called");
+    return 0;
+  }
 };
 
-template<typename Scalar,int Size>
-struct gemv_static_vector_if<Scalar,Size,Dynamic,true>
-{
+template <typename Scalar, int Size>
+struct gemv_static_vector_if<Scalar, Size, Dynamic, true> {
   EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Scalar* data() { return 0; }
 };
 
-template<typename Scalar,int Size,int MaxSize>
-struct gemv_static_vector_if<Scalar,Size,MaxSize,true>
-{
+template <typename Scalar, int Size, int MaxSize>
+struct gemv_static_vector_if<Scalar, Size, MaxSize, true> {
   enum {
-    ForceAlignment  = internal::packet_traits<Scalar>::Vectorizable,
-    PacketSize      = internal::packet_traits<Scalar>::size
+    ForceAlignment = internal::packet_traits<Scalar>::Vectorizable,
+    PacketSize = internal::packet_traits<Scalar>::size
   };
-  #if EIGEN_MAX_STATIC_ALIGN_BYTES!=0
+#if EIGEN_MAX_STATIC_ALIGN_BYTES != 0
   internal::plain_array<Scalar, internal::min_size_prefer_fixed(Size, MaxSize), 0,
-                        internal::plain_enum_min(AlignedMax, PacketSize)> m_data;
+                        internal::plain_enum_min(AlignedMax, PacketSize)>
+      m_data;
   EIGEN_STRONG_INLINE Scalar* data() { return m_data.array; }
-  #else
+#else
   // Some architectures cannot align on the stack,
   // => let's manually enforce alignment by allocating more data and return the address of the first aligned element.
-  internal::plain_array<Scalar, internal::min_size_prefer_fixed(Size, MaxSize)+(ForceAlignment?EIGEN_MAX_ALIGN_BYTES:0),0> m_data;
+  internal::plain_array<
+      Scalar, internal::min_size_prefer_fixed(Size, MaxSize) + (ForceAlignment ? EIGEN_MAX_ALIGN_BYTES : 0), 0>
+      m_data;
   EIGEN_STRONG_INLINE Scalar* data() {
     return ForceAlignment
-            ? reinterpret_cast<Scalar*>((std::uintptr_t(m_data.array) & ~(std::size_t(EIGEN_MAX_ALIGN_BYTES-1))) + EIGEN_MAX_ALIGN_BYTES)
-            : m_data.array;
+               ? reinterpret_cast<Scalar*>((std::uintptr_t(m_data.array) & ~(std::size_t(EIGEN_MAX_ALIGN_BYTES - 1))) +
+                                           EIGEN_MAX_ALIGN_BYTES)
+               : m_data.array;
   }
-  #endif
+#endif
 };
 
 // The vector is on the left => transposition
-template<int StorageOrder, bool BlasCompatible>
-struct gemv_dense_selector<OnTheLeft,StorageOrder,BlasCompatible>
-{
-  template<typename Lhs, typename Rhs, typename Dest>
-  static void run(const Lhs &lhs, const Rhs &rhs, Dest& dest, const typename Dest::Scalar& alpha)
-  {
+template <int StorageOrder, bool BlasCompatible>
+struct gemv_dense_selector<OnTheLeft, StorageOrder, BlasCompatible> {
+  template <typename Lhs, typename Rhs, typename Dest>
+  static void run(const Lhs& lhs, const Rhs& rhs, Dest& dest, const typename Dest::Scalar& alpha) {
     Transpose<Dest> destT(dest);
     enum { OtherStorageOrder = StorageOrder == RowMajor ? ColMajor : RowMajor };
-    gemv_dense_selector<OnTheRight,OtherStorageOrder,BlasCompatible>
-      ::run(rhs.transpose(), lhs.transpose(), destT, alpha);
+    gemv_dense_selector<OnTheRight, OtherStorageOrder, BlasCompatible>::run(rhs.transpose(), lhs.transpose(), destT,
+                                                                            alpha);
   }
 };
 
-template<> struct gemv_dense_selector<OnTheRight,ColMajor,true>
-{
-  template<typename Lhs, typename Rhs, typename Dest>
-  static inline void run(const Lhs &lhs, const Rhs &rhs, Dest& dest, const typename Dest::Scalar& alpha)
-  {
-    typedef typename Lhs::Scalar   LhsScalar;
-    typedef typename Rhs::Scalar   RhsScalar;
-    typedef typename Dest::Scalar  ResScalar;
-    
+template <>
+struct gemv_dense_selector<OnTheRight, ColMajor, true> {
+  template <typename Lhs, typename Rhs, typename Dest>
+  static inline void run(const Lhs& lhs, const Rhs& rhs, Dest& dest, const typename Dest::Scalar& alpha) {
+    typedef typename Lhs::Scalar LhsScalar;
+    typedef typename Rhs::Scalar RhsScalar;
+    typedef typename Dest::Scalar ResScalar;
+
     typedef internal::blas_traits<Lhs> LhsBlasTraits;
     typedef typename LhsBlasTraits::DirectLinearAccessType ActualLhsType;
     typedef internal::blas_traits<Rhs> RhsBlasTraits;
     typedef typename RhsBlasTraits::DirectLinearAccessType ActualRhsType;
-  
-    typedef Map<Matrix<ResScalar,Dynamic,1>, plain_enum_min(AlignedMax, internal::packet_traits<ResScalar>::size)> MappedDest;
+
+    typedef Map<Matrix<ResScalar, Dynamic, 1>, plain_enum_min(AlignedMax, internal::packet_traits<ResScalar>::size)>
+        MappedDest;
 
     ActualLhsType actualLhs = LhsBlasTraits::extract(lhs);
     ActualRhsType actualRhs = RhsBlasTraits::extract(rhs);
@@ -239,63 +305,58 @@
     enum {
       // FIXME find a way to allow an inner stride on the result if packet_traits<Scalar>::size==1
       // on, the other hand it is good for the cache to pack the vector anyways...
-      EvalToDestAtCompileTime = (ActualDest::InnerStrideAtCompileTime==1),
+      EvalToDestAtCompileTime = (ActualDest::InnerStrideAtCompileTime == 1),
       ComplexByReal = (NumTraits<LhsScalar>::IsComplex) && (!NumTraits<RhsScalar>::IsComplex),
-      MightCannotUseDest = ((!EvalToDestAtCompileTime) || ComplexByReal) && (ActualDest::MaxSizeAtCompileTime!=0)
+      MightCannotUseDest = ((!EvalToDestAtCompileTime) || ComplexByReal) && (ActualDest::MaxSizeAtCompileTime != 0)
     };
 
-    typedef const_blas_data_mapper<LhsScalar,Index,ColMajor> LhsMapper;
-    typedef const_blas_data_mapper<RhsScalar,Index,RowMajor> RhsMapper;
-    RhsScalar compatibleAlpha = get_factor<ResScalar,RhsScalar>::run(actualAlpha);
+    typedef const_blas_data_mapper<LhsScalar, Index, ColMajor> LhsMapper;
+    typedef const_blas_data_mapper<RhsScalar, Index, RowMajor> RhsMapper;
+    RhsScalar compatibleAlpha = get_factor<ResScalar, RhsScalar>::run(actualAlpha);
 
-    if(!MightCannotUseDest)
-    {
+    if (!MightCannotUseDest) {
       // shortcut if we are sure to be able to use dest directly,
       // this ease the compiler to generate cleaner and more optimzized code for most common cases
-      general_matrix_vector_product
-          <Index,LhsScalar,LhsMapper,ColMajor,LhsBlasTraits::NeedToConjugate,RhsScalar,RhsMapper,RhsBlasTraits::NeedToConjugate>::run(
-          actualLhs.rows(), actualLhs.cols(),
-          LhsMapper(actualLhs.data(), actualLhs.outerStride()),
-          RhsMapper(actualRhs.data(), actualRhs.innerStride()),
-          dest.data(), 1,
-          compatibleAlpha);
-    }
-    else
-    {
-      gemv_static_vector_if<ResScalar,ActualDest::SizeAtCompileTime,ActualDest::MaxSizeAtCompileTime,MightCannotUseDest> static_dest;
+      general_matrix_vector_product<Index, LhsScalar, LhsMapper, ColMajor, LhsBlasTraits::NeedToConjugate, RhsScalar,
+                                    RhsMapper, RhsBlasTraits::NeedToConjugate>::run(actualLhs.rows(), actualLhs.cols(),
+                                                                                    LhsMapper(actualLhs.data(),
+                                                                                              actualLhs.outerStride()),
+                                                                                    RhsMapper(actualRhs.data(),
+                                                                                              actualRhs.innerStride()),
+                                                                                    dest.data(), 1, compatibleAlpha);
+    } else {
+      gemv_static_vector_if<ResScalar, ActualDest::SizeAtCompileTime, ActualDest::MaxSizeAtCompileTime,
+                            MightCannotUseDest>
+          static_dest;
 
       const bool alphaIsCompatible = (!ComplexByReal) || (numext::is_exactly_zero(numext::imag(actualAlpha)));
       const bool evalToDest = EvalToDestAtCompileTime && alphaIsCompatible;
 
-      ei_declare_aligned_stack_constructed_variable(ResScalar,actualDestPtr,dest.size(),
+      ei_declare_aligned_stack_constructed_variable(ResScalar, actualDestPtr, dest.size(),
                                                     evalToDest ? dest.data() : static_dest.data());
 
-      if(!evalToDest)
-      {
-        #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
+      if (!evalToDest) {
+#ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
         Index size = dest.size();
         EIGEN_DENSE_STORAGE_CTOR_PLUGIN
-        #endif
-        if(!alphaIsCompatible)
-        {
+#endif
+        if (!alphaIsCompatible) {
           MappedDest(actualDestPtr, dest.size()).setZero();
           compatibleAlpha = RhsScalar(1);
-        }
-        else
+        } else
           MappedDest(actualDestPtr, dest.size()) = dest;
       }
 
-      general_matrix_vector_product
-          <Index,LhsScalar,LhsMapper,ColMajor,LhsBlasTraits::NeedToConjugate,RhsScalar,RhsMapper,RhsBlasTraits::NeedToConjugate>::run(
-          actualLhs.rows(), actualLhs.cols(),
-          LhsMapper(actualLhs.data(), actualLhs.outerStride()),
-          RhsMapper(actualRhs.data(), actualRhs.innerStride()),
-          actualDestPtr, 1,
-          compatibleAlpha);
+      general_matrix_vector_product<Index, LhsScalar, LhsMapper, ColMajor, LhsBlasTraits::NeedToConjugate, RhsScalar,
+                                    RhsMapper, RhsBlasTraits::NeedToConjugate>::run(actualLhs.rows(), actualLhs.cols(),
+                                                                                    LhsMapper(actualLhs.data(),
+                                                                                              actualLhs.outerStride()),
+                                                                                    RhsMapper(actualRhs.data(),
+                                                                                              actualRhs.innerStride()),
+                                                                                    actualDestPtr, 1, compatibleAlpha);
 
-      if (!evalToDest)
-      {
-        if(!alphaIsCompatible)
+      if (!evalToDest) {
+        if (!alphaIsCompatible)
           dest.matrix() += actualAlpha * MappedDest(actualDestPtr, dest.size());
         else
           dest = MappedDest(actualDestPtr, dest.size());
@@ -304,15 +365,14 @@
   }
 };
 
-template<> struct gemv_dense_selector<OnTheRight,RowMajor,true>
-{
-  template<typename Lhs, typename Rhs, typename Dest>
-  static void run(const Lhs &lhs, const Rhs &rhs, Dest& dest, const typename Dest::Scalar& alpha)
-  {
-    typedef typename Lhs::Scalar   LhsScalar;
-    typedef typename Rhs::Scalar   RhsScalar;
-    typedef typename Dest::Scalar  ResScalar;
-    
+template <>
+struct gemv_dense_selector<OnTheRight, RowMajor, true> {
+  template <typename Lhs, typename Rhs, typename Dest>
+  static void run(const Lhs& lhs, const Rhs& rhs, Dest& dest, const typename Dest::Scalar& alpha) {
+    typedef typename Lhs::Scalar LhsScalar;
+    typedef typename Rhs::Scalar RhsScalar;
+    typedef typename Dest::Scalar ResScalar;
+
     typedef internal::blas_traits<Lhs> LhsBlasTraits;
     typedef typename LhsBlasTraits::DirectLinearAccessType ActualLhsType;
     typedef internal::blas_traits<Rhs> RhsBlasTraits;
@@ -327,142 +387,141 @@
     enum {
       // FIXME find a way to allow an inner stride on the result if packet_traits<Scalar>::size==1
       // on, the other hand it is good for the cache to pack the vector anyways...
-      DirectlyUseRhs = ActualRhsTypeCleaned::InnerStrideAtCompileTime==1 || ActualRhsTypeCleaned::MaxSizeAtCompileTime==0
+      DirectlyUseRhs =
+          ActualRhsTypeCleaned::InnerStrideAtCompileTime == 1 || ActualRhsTypeCleaned::MaxSizeAtCompileTime == 0
     };
 
-    gemv_static_vector_if<RhsScalar,ActualRhsTypeCleaned::SizeAtCompileTime,ActualRhsTypeCleaned::MaxSizeAtCompileTime,!DirectlyUseRhs> static_rhs;
+    gemv_static_vector_if<RhsScalar, ActualRhsTypeCleaned::SizeAtCompileTime,
+                          ActualRhsTypeCleaned::MaxSizeAtCompileTime, !DirectlyUseRhs>
+        static_rhs;
 
-    ei_declare_aligned_stack_constructed_variable(RhsScalar,actualRhsPtr,actualRhs.size(),
+    ei_declare_aligned_stack_constructed_variable(
+        RhsScalar, actualRhsPtr, actualRhs.size(),
         DirectlyUseRhs ? const_cast<RhsScalar*>(actualRhs.data()) : static_rhs.data());
 
-    if(!DirectlyUseRhs)
-    {
-      #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
+    if (!DirectlyUseRhs) {
+#ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
       Index size = actualRhs.size();
       EIGEN_DENSE_STORAGE_CTOR_PLUGIN
-      #endif
+#endif
       Map<typename ActualRhsTypeCleaned::PlainObject>(actualRhsPtr, actualRhs.size()) = actualRhs;
     }
 
-    typedef const_blas_data_mapper<LhsScalar,Index,RowMajor> LhsMapper;
-    typedef const_blas_data_mapper<RhsScalar,Index,ColMajor> RhsMapper;
-    general_matrix_vector_product
-        <Index,LhsScalar,LhsMapper,RowMajor,LhsBlasTraits::NeedToConjugate,RhsScalar,RhsMapper,RhsBlasTraits::NeedToConjugate>::run(
-        actualLhs.rows(), actualLhs.cols(),
-        LhsMapper(actualLhs.data(), actualLhs.outerStride()),
-        RhsMapper(actualRhsPtr, 1),
-        dest.data(), dest.col(0).innerStride(), //NOTE  if dest is not a vector at compile-time, then dest.innerStride() might be wrong. (bug 1166)
-        actualAlpha);
+    typedef const_blas_data_mapper<LhsScalar, Index, RowMajor> LhsMapper;
+    typedef const_blas_data_mapper<RhsScalar, Index, ColMajor> RhsMapper;
+    general_matrix_vector_product<Index, LhsScalar, LhsMapper, RowMajor, LhsBlasTraits::NeedToConjugate, RhsScalar,
+                                  RhsMapper, RhsBlasTraits::NeedToConjugate>::
+        run(actualLhs.rows(), actualLhs.cols(), LhsMapper(actualLhs.data(), actualLhs.outerStride()),
+            RhsMapper(actualRhsPtr, 1), dest.data(),
+            dest.col(0).innerStride(),  // NOTE  if dest is not a vector at compile-time, then dest.innerStride() might
+                                        // be wrong. (bug 1166)
+            actualAlpha);
   }
 };
 
-template<> struct gemv_dense_selector<OnTheRight,ColMajor,false>
-{
-  template<typename Lhs, typename Rhs, typename Dest>
-  static void run(const Lhs &lhs, const Rhs &rhs, Dest& dest, const typename Dest::Scalar& alpha)
-  {
-    EIGEN_STATIC_ASSERT((!nested_eval<Lhs,1>::Evaluate),EIGEN_INTERNAL_COMPILATION_ERROR_OR_YOU_MADE_A_PROGRAMMING_MISTAKE);
-    // TODO if rhs is large enough it might be beneficial to make sure that dest is sequentially stored in memory, otherwise use a temp
-    typename nested_eval<Rhs,1>::type actual_rhs(rhs);
+template <>
+struct gemv_dense_selector<OnTheRight, ColMajor, false> {
+  template <typename Lhs, typename Rhs, typename Dest>
+  static void run(const Lhs& lhs, const Rhs& rhs, Dest& dest, const typename Dest::Scalar& alpha) {
+    EIGEN_STATIC_ASSERT((!nested_eval<Lhs, 1>::Evaluate),
+                        EIGEN_INTERNAL_COMPILATION_ERROR_OR_YOU_MADE_A_PROGRAMMING_MISTAKE);
+    // TODO if rhs is large enough it might be beneficial to make sure that dest is sequentially stored in memory,
+    // otherwise use a temp
+    typename nested_eval<Rhs, 1>::type actual_rhs(rhs);
     const Index size = rhs.rows();
-    for(Index k=0; k<size; ++k)
-      dest += (alpha*actual_rhs.coeff(k)) * lhs.col(k);
+    for (Index k = 0; k < size; ++k) dest += (alpha * actual_rhs.coeff(k)) * lhs.col(k);
   }
 };
 
-template<> struct gemv_dense_selector<OnTheRight,RowMajor,false>
-{
-  template<typename Lhs, typename Rhs, typename Dest>
-  static void run(const Lhs &lhs, const Rhs &rhs, Dest& dest, const typename Dest::Scalar& alpha)
-  {
-    EIGEN_STATIC_ASSERT((!nested_eval<Lhs,1>::Evaluate),EIGEN_INTERNAL_COMPILATION_ERROR_OR_YOU_MADE_A_PROGRAMMING_MISTAKE);
-    typename nested_eval<Rhs,Lhs::RowsAtCompileTime>::type actual_rhs(rhs);
+template <>
+struct gemv_dense_selector<OnTheRight, RowMajor, false> {
+  template <typename Lhs, typename Rhs, typename Dest>
+  static void run(const Lhs& lhs, const Rhs& rhs, Dest& dest, const typename Dest::Scalar& alpha) {
+    EIGEN_STATIC_ASSERT((!nested_eval<Lhs, 1>::Evaluate),
+                        EIGEN_INTERNAL_COMPILATION_ERROR_OR_YOU_MADE_A_PROGRAMMING_MISTAKE);
+    typename nested_eval<Rhs, Lhs::RowsAtCompileTime>::type actual_rhs(rhs);
     const Index rows = dest.rows();
-    for(Index i=0; i<rows; ++i)
+    for (Index i = 0; i < rows; ++i)
       dest.coeffRef(i) += alpha * (lhs.row(i).cwiseProduct(actual_rhs.transpose())).sum();
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /***************************************************************************
-* Implementation of matrix base methods
-***************************************************************************/
+ * Implementation of matrix base methods
+ ***************************************************************************/
 
 /** \returns the matrix product of \c *this and \a other.
-  *
-  * \note If instead of the matrix product you want the coefficient-wise product, see Cwise::operator*().
-  *
-  * \sa lazyProduct(), operator*=(const MatrixBase&), Cwise::operator*()
-  */
-template<typename Derived>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-const Product<Derived, OtherDerived>
-MatrixBase<Derived>::operator*(const MatrixBase<OtherDerived> &other) const
-{
+ *
+ * \note If instead of the matrix product you want the coefficient-wise product, see Cwise::operator*().
+ *
+ * \sa lazyProduct(), operator*=(const MatrixBase&), Cwise::operator*()
+ */
+template <typename Derived>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Product<Derived, OtherDerived> MatrixBase<Derived>::operator*(
+    const MatrixBase<OtherDerived>& other) const {
   // A note regarding the function declaration: In MSVC, this function will sometimes
   // not be inlined since DenseStorage is an unwindable object for dynamic
   // matrices and product types are holding a member to store the result.
   // Thus it does not help tagging this function with EIGEN_STRONG_INLINE.
   enum {
-    ProductIsValid =  Derived::ColsAtCompileTime==Dynamic
-                   || OtherDerived::RowsAtCompileTime==Dynamic
-                   || int(Derived::ColsAtCompileTime)==int(OtherDerived::RowsAtCompileTime),
+    ProductIsValid = Derived::ColsAtCompileTime == Dynamic || OtherDerived::RowsAtCompileTime == Dynamic ||
+                     int(Derived::ColsAtCompileTime) == int(OtherDerived::RowsAtCompileTime),
     AreVectors = Derived::IsVectorAtCompileTime && OtherDerived::IsVectorAtCompileTime,
-    SameSizes = EIGEN_PREDICATE_SAME_MATRIX_SIZE(Derived,OtherDerived)
+    SameSizes = EIGEN_PREDICATE_SAME_MATRIX_SIZE(Derived, OtherDerived)
   };
   // note to the lost user:
   //    * for a dot product use: v1.dot(v2)
   //    * for a coeff-wise product use: v1.cwiseProduct(v2)
-  EIGEN_STATIC_ASSERT(ProductIsValid || !(AreVectors && SameSizes),
-    INVALID_VECTOR_VECTOR_PRODUCT__IF_YOU_WANTED_A_DOT_OR_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTIONS)
+  EIGEN_STATIC_ASSERT(
+      ProductIsValid || !(AreVectors && SameSizes),
+      INVALID_VECTOR_VECTOR_PRODUCT__IF_YOU_WANTED_A_DOT_OR_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTIONS)
   EIGEN_STATIC_ASSERT(ProductIsValid || !(SameSizes && !AreVectors),
-    INVALID_MATRIX_PRODUCT__IF_YOU_WANTED_A_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTION)
+                      INVALID_MATRIX_PRODUCT__IF_YOU_WANTED_A_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTION)
   EIGEN_STATIC_ASSERT(ProductIsValid || SameSizes, INVALID_MATRIX_PRODUCT)
 #ifdef EIGEN_DEBUG_PRODUCT
-  internal::product_type<Derived,OtherDerived>::debug();
+  internal::product_type<Derived, OtherDerived>::debug();
 #endif
 
   return Product<Derived, OtherDerived>(derived(), other.derived());
 }
 
 /** \returns an expression of the matrix product of \c *this and \a other without implicit evaluation.
-  *
-  * The returned product will behave like any other expressions: the coefficients of the product will be
-  * computed once at a time as requested. This might be useful in some extremely rare cases when only
-  * a small and no coherent fraction of the result's coefficients have to be computed.
-  *
-  * \warning This version of the matrix product can be much much slower. So use it only if you know
-  * what you are doing and that you measured a true speed improvement.
-  *
-  * \sa operator*(const MatrixBase&)
-  */
-template<typename Derived>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-const Product<Derived,OtherDerived,LazyProduct>
-MatrixBase<Derived>::lazyProduct(const MatrixBase<OtherDerived> &other) const
-{
+ *
+ * The returned product will behave like any other expressions: the coefficients of the product will be
+ * computed once at a time as requested. This might be useful in some extremely rare cases when only
+ * a small and no coherent fraction of the result's coefficients have to be computed.
+ *
+ * \warning This version of the matrix product can be much much slower. So use it only if you know
+ * what you are doing and that you measured a true speed improvement.
+ *
+ * \sa operator*(const MatrixBase&)
+ */
+template <typename Derived>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Product<Derived, OtherDerived, LazyProduct>
+MatrixBase<Derived>::lazyProduct(const MatrixBase<OtherDerived>& other) const {
   enum {
-    ProductIsValid =  Derived::ColsAtCompileTime==Dynamic
-                   || OtherDerived::RowsAtCompileTime==Dynamic
-                   || int(Derived::ColsAtCompileTime)==int(OtherDerived::RowsAtCompileTime),
+    ProductIsValid = Derived::ColsAtCompileTime == Dynamic || OtherDerived::RowsAtCompileTime == Dynamic ||
+                     int(Derived::ColsAtCompileTime) == int(OtherDerived::RowsAtCompileTime),
     AreVectors = Derived::IsVectorAtCompileTime && OtherDerived::IsVectorAtCompileTime,
-    SameSizes = EIGEN_PREDICATE_SAME_MATRIX_SIZE(Derived,OtherDerived)
+    SameSizes = EIGEN_PREDICATE_SAME_MATRIX_SIZE(Derived, OtherDerived)
   };
   // note to the lost user:
   //    * for a dot product use: v1.dot(v2)
   //    * for a coeff-wise product use: v1.cwiseProduct(v2)
-  EIGEN_STATIC_ASSERT(ProductIsValid || !(AreVectors && SameSizes),
-    INVALID_VECTOR_VECTOR_PRODUCT__IF_YOU_WANTED_A_DOT_OR_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTIONS)
+  EIGEN_STATIC_ASSERT(
+      ProductIsValid || !(AreVectors && SameSizes),
+      INVALID_VECTOR_VECTOR_PRODUCT__IF_YOU_WANTED_A_DOT_OR_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTIONS)
   EIGEN_STATIC_ASSERT(ProductIsValid || !(SameSizes && !AreVectors),
-    INVALID_MATRIX_PRODUCT__IF_YOU_WANTED_A_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTION)
+                      INVALID_MATRIX_PRODUCT__IF_YOU_WANTED_A_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTION)
   EIGEN_STATIC_ASSERT(ProductIsValid || SameSizes, INVALID_MATRIX_PRODUCT)
 
-  return Product<Derived,OtherDerived,LazyProduct>(derived(), other.derived());
+  return Product<Derived, OtherDerived, LazyProduct>(derived(), other.derived());
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_PRODUCT_H
+#endif  // EIGEN_PRODUCT_H
diff --git a/Eigen/src/Core/GenericPacketMath.h b/Eigen/src/Core/GenericPacketMath.h
index d04f713..5936336 100644
--- a/Eigen/src/Core/GenericPacketMath.h
+++ b/Eigen/src/Core/GenericPacketMath.h
@@ -19,12 +19,12 @@
 namespace internal {
 
 /** \internal
-  * \file GenericPacketMath.h
-  *
-  * Default implementation for types not supported by the vectorization.
-  * In practice these functions are provided to make easier the writing
-  * of generic vectorized code.
-  */
+ * \file GenericPacketMath.h
+ *
+ * Default implementation for types not supported by the vectorization.
+ * In practice these functions are provided to make easier the writing
+ * of generic vectorized code.
+ */
 
 #ifndef EIGEN_DEBUG_ALIGNED_LOAD
 #define EIGEN_DEBUG_ALIGNED_LOAD
@@ -42,49 +42,48 @@
 #define EIGEN_DEBUG_UNALIGNED_STORE
 #endif
 
-struct default_packet_traits
-{
+struct default_packet_traits {
   enum {
-    HasAdd       = 1,
-    HasSub       = 1,
-    HasShift     = 1,
-    HasMul       = 1,
-    HasNegate    = 1,
-    HasAbs       = 1,
-    HasArg       = 0,
-    HasAbs2      = 1,
-    HasAbsDiff   = 0,
-    HasMin       = 1,
-    HasMax       = 1,
-    HasConj      = 1,
+    HasAdd = 1,
+    HasSub = 1,
+    HasShift = 1,
+    HasMul = 1,
+    HasNegate = 1,
+    HasAbs = 1,
+    HasArg = 0,
+    HasAbs2 = 1,
+    HasAbsDiff = 0,
+    HasMin = 1,
+    HasMax = 1,
+    HasConj = 1,
     HasSetLinear = 1,
-    HasSign      = 1,
-    HasBlend     = 0,
+    HasSign = 1,
+    HasBlend = 0,
     // This flag is used to indicate whether packet comparison is supported.
     // pcmp_eq, pcmp_lt and pcmp_le should be defined for it to be true.
-    HasCmp       = 0,
+    HasCmp = 0,
 
-    HasDiv    = 0,
+    HasDiv = 0,
     HasReciprocal = 0,
-    HasSqrt   = 0,
-    HasRsqrt  = 0,
-    HasExp    = 0,
-    HasExpm1  = 0,
-    HasLog    = 0,
-    HasLog1p  = 0,
-    HasLog10  = 0,
-    HasPow    = 0,
+    HasSqrt = 0,
+    HasRsqrt = 0,
+    HasExp = 0,
+    HasExpm1 = 0,
+    HasLog = 0,
+    HasLog1p = 0,
+    HasLog10 = 0,
+    HasPow = 0,
 
-    HasSin    = 0,
-    HasCos    = 0,
-    HasTan    = 0,
-    HasASin   = 0,
-    HasACos   = 0,
-    HasATan   = 0,
-    HasATanh  = 0,
-    HasSinh   = 0,
-    HasCosh   = 0,
-    HasTanh   = 0,
+    HasSin = 0,
+    HasCos = 0,
+    HasTan = 0,
+    HasASin = 0,
+    HasACos = 0,
+    HasATan = 0,
+    HasATanh = 0,
+    HasSinh = 0,
+    HasCosh = 0,
+    HasTanh = 0,
     HasLGamma = 0,
     HasDiGamma = 0,
     HasZeta = 0,
@@ -99,15 +98,15 @@
     HasIGammac = 0,
     HasBetaInc = 0,
 
-    HasRound  = 0,
-    HasRint   = 0,
-    HasFloor  = 0,
-    HasCeil   = 0
+    HasRound = 0,
+    HasRint = 0,
+    HasFloor = 0,
+    HasCeil = 0
   };
 };
 
-template<typename T> struct packet_traits : default_packet_traits
-{
+template <typename T>
+struct packet_traits : default_packet_traits {
   typedef T type;
   typedef T half;
   enum {
@@ -116,36 +115,31 @@
     AlignedOnScalar = 0,
   };
   enum {
-    HasAdd    = 0,
-    HasSub    = 0,
-    HasMul    = 0,
+    HasAdd = 0,
+    HasSub = 0,
+    HasMul = 0,
     HasNegate = 0,
-    HasAbs    = 0,
-    HasAbs2   = 0,
-    HasMin    = 0,
-    HasMax    = 0,
-    HasConj   = 0,
+    HasAbs = 0,
+    HasAbs2 = 0,
+    HasMin = 0,
+    HasMax = 0,
+    HasConj = 0,
     HasSetLinear = 0
   };
 };
 
-template<typename T> struct packet_traits<const T> : packet_traits<T> { };
+template <typename T>
+struct packet_traits<const T> : packet_traits<T> {};
 
-template<typename T> struct unpacket_traits
-{
+template <typename T>
+struct unpacket_traits {
   typedef T type;
   typedef T half;
-  enum
-  {
-    size = 1,
-    alignment = 1,
-    vectorizable = false,
-    masked_load_available=false,
-    masked_store_available=false
-  };
+  enum { size = 1, alignment = 1, vectorizable = false, masked_load_available = false, masked_store_available = false };
 };
 
-template<typename T> struct unpacket_traits<const T> : unpacket_traits<T> { };
+template <typename T>
+struct unpacket_traits<const T> : unpacket_traits<T> {};
 
 /** \internal A convenience utility for determining if the type is a scalar.
  * This is used to enable some generic packet implementations.
@@ -156,9 +150,9 @@
   enum { value = internal::is_same<Packet, Scalar>::value };
 };
 
-// automatically and succinctly define combinations of pcast<SrcPacket,TgtPacket> when 
+// automatically and succinctly define combinations of pcast<SrcPacket,TgtPacket> when
 // 1) the packets are the same type, or
-// 2) the packets differ only in sign. 
+// 2) the packets differ only in sign.
 // In both of these cases, preinterpret (bit_cast) is equivalent to pcast (static_cast)
 template <typename SrcPacket, typename TgtPacket,
           bool Scalar = is_scalar<SrcPacket>::value && is_scalar<TgtPacket>::value>
@@ -221,14 +215,13 @@
 
 /** \internal Wrapper to ensure that multiple packet types can map to the same
     same underlying vector type. */
-template<typename T, int unique_id = 0>
-struct eigen_packet_wrapper
-{
+template <typename T, int unique_id = 0>
+struct eigen_packet_wrapper {
   EIGEN_ALWAYS_INLINE operator T&() { return m_val; }
   EIGEN_ALWAYS_INLINE operator const T&() const { return m_val; }
   EIGEN_ALWAYS_INLINE eigen_packet_wrapper() = default;
-  EIGEN_ALWAYS_INLINE eigen_packet_wrapper(const T &v) : m_val(v) {}
-  EIGEN_ALWAYS_INLINE eigen_packet_wrapper& operator=(const T &v) {
+  EIGEN_ALWAYS_INLINE eigen_packet_wrapper(const T& v) : m_val(v) {}
+  EIGEN_ALWAYS_INLINE eigen_packet_wrapper& operator=(const T& v) {
     m_val = v;
     return *this;
   }
@@ -259,7 +252,8 @@
   return preinterpret_generic<Target, Packet>::run(a);
 }
 
-template <typename SrcPacket, typename TgtPacket, bool Degenerate = is_degenerate<SrcPacket, TgtPacket>::value, bool TgtIsHalf = is_half<TgtPacket>::value>
+template <typename SrcPacket, typename TgtPacket, bool Degenerate = is_degenerate<SrcPacket, TgtPacket>::value,
+          bool TgtIsHalf = is_half<TgtPacket>::value>
 struct pcast_generic;
 
 template <typename SrcPacket, typename TgtPacket>
@@ -282,8 +276,6 @@
   static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TgtPacket run(const SrcPacket& a) { return preinterpret<TgtPacket>(a); }
 };
 
-
-
 /** \internal \returns static_cast<TgtType>(a) (coeff-wise) */
 template <typename SrcPacket, typename TgtPacket>
 EIGEN_DEVICE_FUNC inline TgtPacket pcast(const SrcPacket& a) {
@@ -316,51 +308,68 @@
 };
 
 /** \internal \returns a + b (coeff-wise) */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-padd(const Packet& a, const Packet& b) { return a+b; }
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet padd(const Packet& a, const Packet& b) {
+  return a + b;
+}
 // Avoid compiler warning for boolean algebra.
-template<> EIGEN_DEVICE_FUNC inline bool
-padd(const bool& a, const bool& b) { return a || b; }
+template <>
+EIGEN_DEVICE_FUNC inline bool padd(const bool& a, const bool& b) {
+  return a || b;
+}
 
 /** \internal \returns a packet version of \a *from, (un-aligned masked add)
  * There is no generic implementation. We only have implementations for specialized
  * cases. Generic case should not be called.
  */
-template<typename Packet> EIGEN_DEVICE_FUNC inline
-std::enable_if_t<unpacket_traits<Packet>::masked_fpops_available, Packet>
-padd(const Packet& a, const Packet& b, typename unpacket_traits<Packet>::mask_t umask);
-
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline std::enable_if_t<unpacket_traits<Packet>::masked_fpops_available, Packet> padd(
+    const Packet& a, const Packet& b, typename unpacket_traits<Packet>::mask_t umask);
 
 /** \internal \returns a - b (coeff-wise) */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-psub(const Packet& a, const Packet& b) { return a-b; }
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet psub(const Packet& a, const Packet& b) {
+  return a - b;
+}
 
 /** \internal \returns -a (coeff-wise) */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-pnegate(const Packet& a) { return -a; }
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet pnegate(const Packet& a) {
+  return -a;
+}
 
-template<> EIGEN_DEVICE_FUNC inline bool
-pnegate(const bool& a) { return !a; }
+template <>
+EIGEN_DEVICE_FUNC inline bool pnegate(const bool& a) {
+  return !a;
+}
 
 /** \internal \returns conj(a) (coeff-wise) */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-pconj(const Packet& a) { return numext::conj(a); }
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet pconj(const Packet& a) {
+  return numext::conj(a);
+}
 
 /** \internal \returns a * b (coeff-wise) */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-pmul(const Packet& a, const Packet& b) { return a*b; }
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet pmul(const Packet& a, const Packet& b) {
+  return a * b;
+}
 // Avoid compiler warning for boolean algebra.
-template<> EIGEN_DEVICE_FUNC inline bool
-pmul(const bool& a, const bool& b) { return a && b; }
+template <>
+EIGEN_DEVICE_FUNC inline bool pmul(const bool& a, const bool& b) {
+  return a && b;
+}
 
 /** \internal \returns a / b (coeff-wise) */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-pdiv(const Packet& a, const Packet& b) { return a/b; }
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet pdiv(const Packet& a, const Packet& b) {
+  return a / b;
+}
 
 // In the generic case, memset to all one bits.
-template<typename Packet, typename EnableIf = void>
+template <typename Packet, typename EnableIf = void>
 struct ptrue_impl {
-  static EIGEN_DEVICE_FUNC inline Packet run(const Packet& /*a*/){
+  static EIGEN_DEVICE_FUNC inline Packet run(const Packet& /*a*/) {
     Packet b;
     memset(static_cast<void*>(&b), 0xff, sizeof(Packet));
     return b;
@@ -371,22 +380,19 @@
 // Although this is technically not a valid bitmask, the scalar path for pselect
 // uses a comparison to zero, so this should still work in most cases. We don't
 // have another option, since the scalar type requires initialization.
-template<typename T>
-struct ptrue_impl<T, 
-    std::enable_if_t<is_scalar<T>::value && NumTraits<T>::RequireInitialization> > {
-  static EIGEN_DEVICE_FUNC inline T run(const T& /*a*/){
-    return T(1);
-  }
+template <typename T>
+struct ptrue_impl<T, std::enable_if_t<is_scalar<T>::value && NumTraits<T>::RequireInitialization>> {
+  static EIGEN_DEVICE_FUNC inline T run(const T& /*a*/) { return T(1); }
 };
 
 /** \internal \returns one bits. */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-ptrue(const Packet& a) {
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet ptrue(const Packet& a) {
   return ptrue_impl<Packet>::run(a);
 }
 
 // In the general case, memset to zero.
-template<typename Packet, typename EnableIf = void>
+template <typename Packet, typename EnableIf = void>
 struct pzero_impl {
   static EIGEN_DEVICE_FUNC inline Packet run(const Packet& /*a*/) {
     Packet b;
@@ -397,66 +403,63 @@
 
 // For scalars, explicitly set to Scalar(0), since the underlying representation
 // for zero may not consist of all-zero bits.
-template<typename T>
-struct pzero_impl<T,
-    std::enable_if_t<is_scalar<T>::value>> {
-  static EIGEN_DEVICE_FUNC inline T run(const T& /*a*/) {
-    return T(0);
-  }
+template <typename T>
+struct pzero_impl<T, std::enable_if_t<is_scalar<T>::value>> {
+  static EIGEN_DEVICE_FUNC inline T run(const T& /*a*/) { return T(0); }
 };
 
 /** \internal \returns packet of zeros */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-pzero(const Packet& a) {
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet pzero(const Packet& a) {
   return pzero_impl<Packet>::run(a);
 }
 
 /** \internal \returns a <= b as a bit mask */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-pcmp_le(const Packet& a, const Packet& b)  { return a<=b ? ptrue(a) : pzero(a); }
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet pcmp_le(const Packet& a, const Packet& b) {
+  return a <= b ? ptrue(a) : pzero(a);
+}
 
 /** \internal \returns a < b as a bit mask */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-pcmp_lt(const Packet& a, const Packet& b)  { return a<b ? ptrue(a) : pzero(a); }
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet pcmp_lt(const Packet& a, const Packet& b) {
+  return a < b ? ptrue(a) : pzero(a);
+}
 
 /** \internal \returns a == b as a bit mask */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-pcmp_eq(const Packet& a, const Packet& b) { return a==b ? ptrue(a) : pzero(a); }
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet pcmp_eq(const Packet& a, const Packet& b) {
+  return a == b ? ptrue(a) : pzero(a);
+}
 
 /** \internal \returns a < b or a==NaN or b==NaN as a bit mask */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-pcmp_lt_or_nan(const Packet& a, const Packet& b) { return a>=b ? pzero(a) : ptrue(a); }
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet pcmp_lt_or_nan(const Packet& a, const Packet& b) {
+  return a >= b ? pzero(a) : ptrue(a);
+}
 
-template<typename T>
+template <typename T>
 struct bit_and {
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR EIGEN_ALWAYS_INLINE T operator()(const T& a, const T& b) const {
-    return a & b;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR EIGEN_ALWAYS_INLINE T operator()(const T& a, const T& b) const { return a & b; }
 };
 
-template<typename T>
+template <typename T>
 struct bit_or {
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR EIGEN_ALWAYS_INLINE T operator()(const T& a, const T& b) const {
-    return a | b;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR EIGEN_ALWAYS_INLINE T operator()(const T& a, const T& b) const { return a | b; }
 };
 
-template<typename T>
+template <typename T>
 struct bit_xor {
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR EIGEN_ALWAYS_INLINE T operator()(const T& a, const T& b) const {
-    return a ^ b;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR EIGEN_ALWAYS_INLINE T operator()(const T& a, const T& b) const { return a ^ b; }
 };
 
-template<typename T>
+template <typename T>
 struct bit_not {
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR EIGEN_ALWAYS_INLINE T operator()(const T& a) const {
-    return ~a;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR EIGEN_ALWAYS_INLINE T operator()(const T& a) const { return ~a; }
 };
 
 // Use operators &, |, ^, ~.
-template<typename T>
+template <typename T>
 struct operator_bitwise_helper {
   EIGEN_DEVICE_FUNC static inline T bitwise_and(const T& a, const T& b) { return bit_and<T>()(a, b); }
   EIGEN_DEVICE_FUNC static inline T bitwise_or(const T& a, const T& b) { return bit_or<T>()(a, b); }
@@ -465,23 +468,19 @@
 };
 
 // Apply binary operations byte-by-byte
-template<typename T>
+template <typename T>
 struct bytewise_bitwise_helper {
   EIGEN_DEVICE_FUNC static inline T bitwise_and(const T& a, const T& b) {
     return binary(a, b, bit_and<unsigned char>());
   }
-  EIGEN_DEVICE_FUNC static inline T bitwise_or(const T& a, const T& b) {
-    return binary(a, b, bit_or<unsigned char>());
-   }
+  EIGEN_DEVICE_FUNC static inline T bitwise_or(const T& a, const T& b) { return binary(a, b, bit_or<unsigned char>()); }
   EIGEN_DEVICE_FUNC static inline T bitwise_xor(const T& a, const T& b) {
     return binary(a, b, bit_xor<unsigned char>());
   }
-  EIGEN_DEVICE_FUNC static inline T bitwise_not(const T& a) {
-    return unary(a,bit_not<unsigned char>());
-   }
+  EIGEN_DEVICE_FUNC static inline T bitwise_not(const T& a) { return unary(a, bit_not<unsigned char>()); }
 
  private:
-  template<typename Op>
+  template <typename Op>
   EIGEN_DEVICE_FUNC static inline T unary(const T& a, Op op) {
     const unsigned char* a_ptr = reinterpret_cast<const unsigned char*>(&a);
     T c;
@@ -492,7 +491,7 @@
     return c;
   }
 
-  template<typename Op>
+  template <typename Op>
   EIGEN_DEVICE_FUNC static inline T binary(const T& a, const T& b, Op op) {
     const unsigned char* a_ptr = reinterpret_cast<const unsigned char*>(&a);
     const unsigned char* b_ptr = reinterpret_cast<const unsigned char*>(&b);
@@ -506,130 +505,125 @@
 };
 
 // In the general case, use byte-by-byte manipulation.
-template<typename T, typename EnableIf = void>
+template <typename T, typename EnableIf = void>
 struct bitwise_helper : public bytewise_bitwise_helper<T> {};
 
 // For integers or non-trivial scalars, use binary operators.
-template<typename T>
-struct bitwise_helper<T,
-  typename std::enable_if_t<
-    is_scalar<T>::value && (NumTraits<T>::IsInteger || NumTraits<T>::RequireInitialization)>
-  > : public operator_bitwise_helper<T> {};
+template <typename T>
+struct bitwise_helper<T, typename std::enable_if_t<is_scalar<T>::value &&
+                                                   (NumTraits<T>::IsInteger || NumTraits<T>::RequireInitialization)>>
+    : public operator_bitwise_helper<T> {};
 
 /** \internal \returns the bitwise and of \a a and \a b */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-pand(const Packet& a, const Packet& b) {
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet pand(const Packet& a, const Packet& b) {
   return bitwise_helper<Packet>::bitwise_and(a, b);
 }
 
 /** \internal \returns the bitwise or of \a a and \a b */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-por(const Packet& a, const Packet& b) {
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet por(const Packet& a, const Packet& b) {
   return bitwise_helper<Packet>::bitwise_or(a, b);
 }
 
 /** \internal \returns the bitwise xor of \a a and \a b */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-pxor(const Packet& a, const Packet& b) {
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet pxor(const Packet& a, const Packet& b) {
   return bitwise_helper<Packet>::bitwise_xor(a, b);
 }
 
 /** \internal \returns the bitwise not of \a a */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-pnot(const Packet& a) {
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet pnot(const Packet& a) {
   return bitwise_helper<Packet>::bitwise_not(a);
 }
 
 /** \internal \returns the bitwise and of \a a and not \a b */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-pandnot(const Packet& a, const Packet& b) { return pand(a, pnot(b)); }
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet pandnot(const Packet& a, const Packet& b) {
+  return pand(a, pnot(b));
+}
 
 /** \internal \returns isnan(a) */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-pisnan(const Packet& a) {
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet pisnan(const Packet& a) {
   return pandnot(ptrue(a), pcmp_eq(a, a));
 }
 
 // In the general case, use bitwise select.
-template<typename Packet, typename EnableIf = void>
+template <typename Packet, typename EnableIf = void>
 struct pselect_impl {
   static EIGEN_DEVICE_FUNC inline Packet run(const Packet& mask, const Packet& a, const Packet& b) {
-    return por(pand(a,mask),pandnot(b,mask));
+    return por(pand(a, mask), pandnot(b, mask));
   }
 };
 
 // For scalars, use ternary select.
-template<typename Packet>
-struct pselect_impl<Packet, 
-    std::enable_if_t<is_scalar<Packet>::value> > {
+template <typename Packet>
+struct pselect_impl<Packet, std::enable_if_t<is_scalar<Packet>::value>> {
   static EIGEN_DEVICE_FUNC inline Packet run(const Packet& mask, const Packet& a, const Packet& b) {
     return numext::equal_strict(mask, Packet(0)) ? b : a;
   }
 };
 
 /** \internal \returns \a or \b for each field in packet according to \mask */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-pselect(const Packet& mask, const Packet& a, const Packet& b) {
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet pselect(const Packet& mask, const Packet& a, const Packet& b) {
   return pselect_impl<Packet>::run(mask, a, b);
 }
 
-template<> EIGEN_DEVICE_FUNC inline bool pselect<bool>(
-    const bool& cond, const bool& a, const bool& b) {
+template <>
+EIGEN_DEVICE_FUNC inline bool pselect<bool>(const bool& cond, const bool& a, const bool& b) {
   return cond ? a : b;
 }
 
 /** \internal \returns the min or of \a a and \a b (coeff-wise)
     If either \a a or \a b are NaN, the result is implementation defined. */
-template<int NaNPropagation>
+template <int NaNPropagation>
 struct pminmax_impl {
   template <typename Packet, typename Op>
   static EIGEN_DEVICE_FUNC inline Packet run(const Packet& a, const Packet& b, Op op) {
-    return op(a,b);
+    return op(a, b);
   }
 };
 
 /** \internal \returns the min or max of \a a and \a b (coeff-wise)
     If either \a a or \a b are NaN, NaN is returned. */
-template<>
+template <>
 struct pminmax_impl<PropagateNaN> {
   template <typename Packet, typename Op>
   static EIGEN_DEVICE_FUNC inline Packet run(const Packet& a, const Packet& b, Op op) {
-  Packet not_nan_mask_a = pcmp_eq(a, a);
-  Packet not_nan_mask_b = pcmp_eq(b, b);
-  return pselect(not_nan_mask_a,
-                 pselect(not_nan_mask_b, op(a, b), b),
-                 a);
+    Packet not_nan_mask_a = pcmp_eq(a, a);
+    Packet not_nan_mask_b = pcmp_eq(b, b);
+    return pselect(not_nan_mask_a, pselect(not_nan_mask_b, op(a, b), b), a);
   }
 };
 
 /** \internal \returns the min or max of \a a and \a b (coeff-wise)
     If both \a a and \a b are NaN, NaN is returned.
     Equivalent to std::fmin(a, b).  */
-template<>
+template <>
 struct pminmax_impl<PropagateNumbers> {
   template <typename Packet, typename Op>
   static EIGEN_DEVICE_FUNC inline Packet run(const Packet& a, const Packet& b, Op op) {
-  Packet not_nan_mask_a = pcmp_eq(a, a);
-  Packet not_nan_mask_b = pcmp_eq(b, b);
-  return pselect(not_nan_mask_a,
-                 pselect(not_nan_mask_b, op(a, b), a),
-                 b);
+    Packet not_nan_mask_a = pcmp_eq(a, a);
+    Packet not_nan_mask_b = pcmp_eq(b, b);
+    return pselect(not_nan_mask_a, pselect(not_nan_mask_b, op(a, b), a), b);
   }
 };
 
-
 #ifndef SYCL_DEVICE_ONLY
 #define EIGEN_BINARY_OP_NAN_PROPAGATION(Type, Func) Func
 #else
-#define EIGEN_BINARY_OP_NAN_PROPAGATION(Type, Func) \
-[](const Type& a, const Type& b) { \
-        return Func(a, b);}
+#define EIGEN_BINARY_OP_NAN_PROPAGATION(Type, Func) [](const Type& a, const Type& b) { return Func(a, b); }
 #endif
 
 /** \internal \returns the min of \a a and \a b  (coeff-wise).
     If \a a or \b b is NaN, the return value is implementation defined. */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-pmin(const Packet& a, const Packet& b) { return numext::mini(a,b); }
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet pmin(const Packet& a, const Packet& b) {
+  return numext::mini(a, b);
+}
 
 /** \internal \returns the min of \a a and \a b  (coeff-wise).
     NaNPropagation determines the NaN propagation semantics. */
@@ -640,58 +634,82 @@
 
 /** \internal \returns the max of \a a and \a b  (coeff-wise)
     If \a a or \b b is NaN, the return value is implementation defined. */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-pmax(const Packet& a, const Packet& b) { return numext::maxi(a, b); }
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet pmax(const Packet& a, const Packet& b) {
+  return numext::maxi(a, b);
+}
 
 /** \internal \returns the max of \a a and \a b  (coeff-wise).
     NaNPropagation determines the NaN propagation semantics. */
 template <int NaNPropagation, typename Packet>
 EIGEN_DEVICE_FUNC inline Packet pmax(const Packet& a, const Packet& b) {
-  return pminmax_impl<NaNPropagation>::run(a, b, EIGEN_BINARY_OP_NAN_PROPAGATION(Packet,(pmax<Packet>)));
+  return pminmax_impl<NaNPropagation>::run(a, b, EIGEN_BINARY_OP_NAN_PROPAGATION(Packet, (pmax<Packet>)));
 }
 
 /** \internal \returns the absolute value of \a a */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-pabs(const Packet& a) { return numext::abs(a); }
-template<> EIGEN_DEVICE_FUNC inline unsigned int
-pabs(const unsigned int& a) { return a; }
-template<> EIGEN_DEVICE_FUNC inline unsigned long
-pabs(const unsigned long& a) { return a; }
-template<> EIGEN_DEVICE_FUNC inline unsigned long long
-pabs(const unsigned long long& a) { return a; }
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet pabs(const Packet& a) {
+  return numext::abs(a);
+}
+template <>
+EIGEN_DEVICE_FUNC inline unsigned int pabs(const unsigned int& a) {
+  return a;
+}
+template <>
+EIGEN_DEVICE_FUNC inline unsigned long pabs(const unsigned long& a) {
+  return a;
+}
+template <>
+EIGEN_DEVICE_FUNC inline unsigned long long pabs(const unsigned long long& a) {
+  return a;
+}
 
 /** \internal \returns the addsub value of \a a,b */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-paddsub(const Packet& a, const Packet& b) {
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet paddsub(const Packet& a, const Packet& b) {
   return pselect(peven_mask(a), padd(a, b), psub(a, b));
- }
+}
 
 /** \internal \returns the phase angle of \a a */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-parg(const Packet& a) { using numext::arg; return arg(a); }
-
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet parg(const Packet& a) {
+  using numext::arg;
+  return arg(a);
+}
 
 /** \internal \returns \a a arithmetically shifted by N bits to the right */
-template<int N> EIGEN_DEVICE_FUNC inline int
-parithmetic_shift_right(const int& a) { return a >> N; }
-template<int N> EIGEN_DEVICE_FUNC inline long int
-parithmetic_shift_right(const long int& a) { return a >> N; }
+template <int N>
+EIGEN_DEVICE_FUNC inline int parithmetic_shift_right(const int& a) {
+  return a >> N;
+}
+template <int N>
+EIGEN_DEVICE_FUNC inline long int parithmetic_shift_right(const long int& a) {
+  return a >> N;
+}
 
 /** \internal \returns \a a logically shifted by N bits to the right */
-template<int N> EIGEN_DEVICE_FUNC inline int
-plogical_shift_right(const int& a) { return static_cast<int>(static_cast<unsigned int>(a) >> N); }
-template<int N> EIGEN_DEVICE_FUNC inline long int
-plogical_shift_right(const long int& a) { return static_cast<long>(static_cast<unsigned long>(a) >> N); }
+template <int N>
+EIGEN_DEVICE_FUNC inline int plogical_shift_right(const int& a) {
+  return static_cast<int>(static_cast<unsigned int>(a) >> N);
+}
+template <int N>
+EIGEN_DEVICE_FUNC inline long int plogical_shift_right(const long int& a) {
+  return static_cast<long>(static_cast<unsigned long>(a) >> N);
+}
 
 /** \internal \returns \a a shifted by N bits to the left */
-template<int N> EIGEN_DEVICE_FUNC inline int
-plogical_shift_left(const int& a) { return a << N; }
-template<int N> EIGEN_DEVICE_FUNC inline long int
-plogical_shift_left(const long int& a) { return a << N; }
+template <int N>
+EIGEN_DEVICE_FUNC inline int plogical_shift_left(const int& a) {
+  return a << N;
+}
+template <int N>
+EIGEN_DEVICE_FUNC inline long int plogical_shift_left(const long int& a) {
+  return a << N;
+}
 
 /** \internal \returns the significant and exponent of the underlying floating point numbers
-  * See https://en.cppreference.com/w/cpp/numeric/math/frexp
-  */
+ * See https://en.cppreference.com/w/cpp/numeric/math/frexp
+ */
 template <typename Packet>
 EIGEN_DEVICE_FUNC inline Packet pfrexp(const Packet& a, Packet& exponent) {
   int exp;
@@ -702,54 +720,60 @@
 }
 
 /** \internal \returns a * 2^((int)exponent)
-  * See https://en.cppreference.com/w/cpp/numeric/math/ldexp
-  */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-pldexp(const Packet &a, const Packet &exponent) {
+ * See https://en.cppreference.com/w/cpp/numeric/math/ldexp
+ */
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet pldexp(const Packet& a, const Packet& exponent) {
   EIGEN_USING_STD(ldexp)
   return static_cast<Packet>(ldexp(a, static_cast<int>(exponent)));
 }
 
 /** \internal \returns the min of \a a and \a b  (coeff-wise) */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-pabsdiff(const Packet& a, const Packet& b) { return pselect(pcmp_lt(a, b), psub(b, a), psub(a, b)); }
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet pabsdiff(const Packet& a, const Packet& b) {
+  return pselect(pcmp_lt(a, b), psub(b, a), psub(a, b));
+}
 
 /** \internal \returns a packet version of \a *from, from must be properly aligned */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-pload(const typename unpacket_traits<Packet>::type* from) { return *from; }
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet pload(const typename unpacket_traits<Packet>::type* from) {
+  return *from;
+}
 
 /** \internal \returns n elements of a packet version of \a *from, from must be properly aligned
-  * offset indicates the starting element in which to load and
-  * offset + n <= unpacket_traits::size
-  * All elements before offset and after the last element loaded will initialized with zero */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-pload_partial(const typename unpacket_traits<Packet>::type* from, const Index n, const Index offset = 0)
-{
+ * offset indicates the starting element in which to load and
+ * offset + n <= unpacket_traits::size
+ * All elements before offset and after the last element loaded will initialized with zero */
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet pload_partial(const typename unpacket_traits<Packet>::type* from, const Index n,
+                                              const Index offset = 0) {
   const Index packet_size = unpacket_traits<Packet>::size;
   eigen_assert(n + offset <= packet_size && "number of elements plus offset will read past end of packet");
   typedef typename unpacket_traits<Packet>::type Scalar;
-  EIGEN_ALIGN_MAX Scalar elements[packet_size] = { Scalar(0) };
-  for (Index i = offset; i < numext::mini(n+offset,packet_size); i++) {
-    elements[i] = from[i-offset];
+  EIGEN_ALIGN_MAX Scalar elements[packet_size] = {Scalar(0)};
+  for (Index i = offset; i < numext::mini(n + offset, packet_size); i++) {
+    elements[i] = from[i - offset];
   }
   return pload<Packet>(elements);
 }
 
 /** \internal \returns a packet version of \a *from, (un-aligned load) */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-ploadu(const typename unpacket_traits<Packet>::type* from) { return *from; }
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet ploadu(const typename unpacket_traits<Packet>::type* from) {
+  return *from;
+}
 
 /** \internal \returns n elements of a packet version of \a *from, (un-aligned load)
-  * All elements after the last element loaded will initialized with zero */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-ploadu_partial(const typename unpacket_traits<Packet>::type* from, const Index n, const Index offset = 0)
-{
+ * All elements after the last element loaded will initialized with zero */
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet ploadu_partial(const typename unpacket_traits<Packet>::type* from, const Index n,
+                                               const Index offset = 0) {
   const Index packet_size = unpacket_traits<Packet>::size;
   eigen_assert(n + offset <= packet_size && "number of elements plus offset will read past end of packet");
   typedef typename unpacket_traits<Packet>::type Scalar;
-  EIGEN_ALIGN_MAX Scalar elements[packet_size] = { Scalar(0) };
-  for (Index i = offset; i < numext::mini(n+offset,packet_size); i++) {
-    elements[i] = from[i-offset];
+  EIGEN_ALIGN_MAX Scalar elements[packet_size] = {Scalar(0)};
+  for (Index i = offset; i < numext::mini(n + offset, packet_size); i++) {
+    elements[i] = from[i - offset];
   }
   return pload<Packet>(elements);
 }
@@ -758,122 +782,131 @@
  * There is no generic implementation. We only have implementations for specialized
  * cases. Generic case should not be called.
  */
-template<typename Packet> EIGEN_DEVICE_FUNC inline
-std::enable_if_t<unpacket_traits<Packet>::masked_load_available, Packet>
-ploadu(const typename unpacket_traits<Packet>::type* from, typename unpacket_traits<Packet>::mask_t umask);
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline std::enable_if_t<unpacket_traits<Packet>::masked_load_available, Packet> ploadu(
+    const typename unpacket_traits<Packet>::type* from, typename unpacket_traits<Packet>::mask_t umask);
 
 /** \internal \returns a packet with constant coefficients \a a, e.g.: (a,a,a,a) */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-pset1(const typename unpacket_traits<Packet>::type& a) { return a; }
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet pset1(const typename unpacket_traits<Packet>::type& a) {
+  return a;
+}
 
 /** \internal \returns a packet with constant coefficients set from bits */
-template<typename Packet,typename BitsType> EIGEN_DEVICE_FUNC inline Packet
-pset1frombits(BitsType a);
+template <typename Packet, typename BitsType>
+EIGEN_DEVICE_FUNC inline Packet pset1frombits(BitsType a);
 
 /** \internal \returns a packet with constant coefficients \a a[0], e.g.: (a[0],a[0],a[0],a[0]) */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-pload1(const typename unpacket_traits<Packet>::type  *a) { return pset1<Packet>(*a); }
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet pload1(const typename unpacket_traits<Packet>::type* a) {
+  return pset1<Packet>(*a);
+}
 
 /** \internal \returns a packet with elements of \a *from duplicated.
-  * For instance, for a packet of 8 elements, 4 scalars will be read from \a *from and
-  * duplicated to form: {from[0],from[0],from[1],from[1],from[2],from[2],from[3],from[3]}
-  * Currently, this function is only used for scalar * complex products.
-  */
-template<typename Packet> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet
-ploaddup(const typename unpacket_traits<Packet>::type* from) { return *from; }
+ * For instance, for a packet of 8 elements, 4 scalars will be read from \a *from and
+ * duplicated to form: {from[0],from[0],from[1],from[1],from[2],from[2],from[3],from[3]}
+ * Currently, this function is only used for scalar * complex products.
+ */
+template <typename Packet>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet ploaddup(const typename unpacket_traits<Packet>::type* from) {
+  return *from;
+}
 
 /** \internal \returns a packet with elements of \a *from quadrupled.
-  * For instance, for a packet of 8 elements, 2 scalars will be read from \a *from and
-  * replicated to form: {from[0],from[0],from[0],from[0],from[1],from[1],from[1],from[1]}
-  * Currently, this function is only used in matrix products.
-  * For packet-size smaller or equal to 4, this function is equivalent to pload1
-  */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-ploadquad(const typename unpacket_traits<Packet>::type* from)
-{ return pload1<Packet>(from); }
-
-/** \internal equivalent to
-  * \code
-  * a0 = pload1(a+0);
-  * a1 = pload1(a+1);
-  * a2 = pload1(a+2);
-  * a3 = pload1(a+3);
-  * \endcode
-  * \sa pset1, pload1, ploaddup, pbroadcast2
-  */
-template<typename Packet> EIGEN_DEVICE_FUNC
-inline void pbroadcast4(const typename unpacket_traits<Packet>::type *a,
-                        Packet& a0, Packet& a1, Packet& a2, Packet& a3)
-{
-  a0 = pload1<Packet>(a+0);
-  a1 = pload1<Packet>(a+1);
-  a2 = pload1<Packet>(a+2);
-  a3 = pload1<Packet>(a+3);
+ * For instance, for a packet of 8 elements, 2 scalars will be read from \a *from and
+ * replicated to form: {from[0],from[0],from[0],from[0],from[1],from[1],from[1],from[1]}
+ * Currently, this function is only used in matrix products.
+ * For packet-size smaller or equal to 4, this function is equivalent to pload1
+ */
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet ploadquad(const typename unpacket_traits<Packet>::type* from) {
+  return pload1<Packet>(from);
 }
 
 /** \internal equivalent to
-  * \code
-  * a0 = pload1(a+0);
-  * a1 = pload1(a+1);
-  * \endcode
-  * \sa pset1, pload1, ploaddup, pbroadcast4
-  */
-template<typename Packet> EIGEN_DEVICE_FUNC
-inline void pbroadcast2(const typename unpacket_traits<Packet>::type *a,
-                        Packet& a0, Packet& a1)
-{
-  a0 = pload1<Packet>(a+0);
-  a1 = pload1<Packet>(a+1);
+ * \code
+ * a0 = pload1(a+0);
+ * a1 = pload1(a+1);
+ * a2 = pload1(a+2);
+ * a3 = pload1(a+3);
+ * \endcode
+ * \sa pset1, pload1, ploaddup, pbroadcast2
+ */
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline void pbroadcast4(const typename unpacket_traits<Packet>::type* a, Packet& a0, Packet& a1,
+                                          Packet& a2, Packet& a3) {
+  a0 = pload1<Packet>(a + 0);
+  a1 = pload1<Packet>(a + 1);
+  a2 = pload1<Packet>(a + 2);
+  a3 = pload1<Packet>(a + 3);
+}
+
+/** \internal equivalent to
+ * \code
+ * a0 = pload1(a+0);
+ * a1 = pload1(a+1);
+ * \endcode
+ * \sa pset1, pload1, ploaddup, pbroadcast4
+ */
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline void pbroadcast2(const typename unpacket_traits<Packet>::type* a, Packet& a0, Packet& a1) {
+  a0 = pload1<Packet>(a + 0);
+  a1 = pload1<Packet>(a + 1);
 }
 
 /** \internal \brief Returns a packet with coefficients (a,a+1,...,a+packet_size-1). */
-template<typename Packet> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet
-plset(const typename unpacket_traits<Packet>::type& a) { return a; }
+template <typename Packet>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet plset(const typename unpacket_traits<Packet>::type& a) {
+  return a;
+}
 
 /** \internal \returns a packet with constant coefficients \a a, e.g.: (x, 0, x, 0),
      where x is the value of all 1-bits. */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-peven_mask(const Packet& /*a*/) {
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet peven_mask(const Packet& /*a*/) {
   typedef typename unpacket_traits<Packet>::type Scalar;
   const size_t n = unpacket_traits<Packet>::size;
   EIGEN_ALIGN_TO_BOUNDARY(sizeof(Packet)) Scalar elements[n];
-  for(size_t i = 0; i < n; ++i) {
-    memset(elements+i, ((i & 1) == 0 ? 0xff : 0), sizeof(Scalar));
+  for (size_t i = 0; i < n; ++i) {
+    memset(elements + i, ((i & 1) == 0 ? 0xff : 0), sizeof(Scalar));
   }
   return ploadu<Packet>(elements);
 }
 
-
 /** \internal copy the packet \a from to \a *to, \a to must be properly aligned */
-template<typename Scalar, typename Packet> EIGEN_DEVICE_FUNC inline void pstore(Scalar* to, const Packet& from)
-{ (*to) = from; }
+template <typename Scalar, typename Packet>
+EIGEN_DEVICE_FUNC inline void pstore(Scalar* to, const Packet& from) {
+  (*to) = from;
+}
 
 /** \internal copy n elements of the packet \a from to \a *to, \a to must be properly aligned
  * offset indicates the starting element in which to store and
  * offset + n <= unpacket_traits::size */
-template<typename Scalar, typename Packet> EIGEN_DEVICE_FUNC inline void pstore_partial(Scalar* to, const Packet& from, const Index n, const Index offset = 0)
-{
+template <typename Scalar, typename Packet>
+EIGEN_DEVICE_FUNC inline void pstore_partial(Scalar* to, const Packet& from, const Index n, const Index offset = 0) {
   const Index packet_size = unpacket_traits<Packet>::size;
   eigen_assert(n + offset <= packet_size && "number of elements plus offset will write past end of packet");
   EIGEN_ALIGN_MAX Scalar elements[packet_size];
   pstore<Scalar>(elements, from);
-  for (Index i = 0; i < numext::mini(n,packet_size-offset); i++) {
+  for (Index i = 0; i < numext::mini(n, packet_size - offset); i++) {
     to[i] = elements[i + offset];
   }
 }
 
 /** \internal copy the packet \a from to \a *to, (un-aligned store) */
-template<typename Scalar, typename Packet> EIGEN_DEVICE_FUNC inline void pstoreu(Scalar* to, const Packet& from)
-{  (*to) = from; }
+template <typename Scalar, typename Packet>
+EIGEN_DEVICE_FUNC inline void pstoreu(Scalar* to, const Packet& from) {
+  (*to) = from;
+}
 
 /** \internal copy n elements of the packet \a from to \a *to, (un-aligned store) */
-template<typename Scalar, typename Packet> EIGEN_DEVICE_FUNC inline void pstoreu_partial(Scalar* to, const Packet& from, const Index n, const Index offset = 0)
-{
+template <typename Scalar, typename Packet>
+EIGEN_DEVICE_FUNC inline void pstoreu_partial(Scalar* to, const Packet& from, const Index n, const Index offset = 0) {
   const Index packet_size = unpacket_traits<Packet>::size;
   eigen_assert(n + offset <= packet_size && "number of elements plus offset will write past end of packet");
   EIGEN_ALIGN_MAX Scalar elements[packet_size];
   pstore<Scalar>(elements, from);
-  for (Index i = 0; i < numext::mini(n,packet_size-offset); i++) {
+  for (Index i = 0; i < numext::mini(n, packet_size - offset); i++) {
     to[i] = elements[i + offset];
   }
 }
@@ -882,40 +915,43 @@
  * There is no generic implementation. We only have implementations for specialized
  * cases. Generic case should not be called.
  */
-template<typename Scalar, typename Packet>
-EIGEN_DEVICE_FUNC inline
-std::enable_if_t<unpacket_traits<Packet>::masked_store_available, void>
-pstoreu(Scalar* to, const Packet& from, typename unpacket_traits<Packet>::mask_t umask);
+template <typename Scalar, typename Packet>
+EIGEN_DEVICE_FUNC inline std::enable_if_t<unpacket_traits<Packet>::masked_store_available, void> pstoreu(
+    Scalar* to, const Packet& from, typename unpacket_traits<Packet>::mask_t umask);
 
-template<typename Scalar, typename Packet> EIGEN_DEVICE_FUNC inline Packet pgather(const Scalar* from, Index /*stride*/)
-{ return ploadu<Packet>(from); }
+template <typename Scalar, typename Packet>
+EIGEN_DEVICE_FUNC inline Packet pgather(const Scalar* from, Index /*stride*/) {
+  return ploadu<Packet>(from);
+}
 
-template<typename Scalar, typename Packet> EIGEN_DEVICE_FUNC inline Packet pgather_partial(const Scalar* from, Index stride, const Index n)
-{
+template <typename Scalar, typename Packet>
+EIGEN_DEVICE_FUNC inline Packet pgather_partial(const Scalar* from, Index stride, const Index n) {
   const Index packet_size = unpacket_traits<Packet>::size;
-  EIGEN_ALIGN_MAX Scalar elements[packet_size] = { Scalar(0) };
-  for (Index i = 0; i < numext::mini(n,packet_size); i++) {
-    elements[i] = from[i*stride];
+  EIGEN_ALIGN_MAX Scalar elements[packet_size] = {Scalar(0)};
+  for (Index i = 0; i < numext::mini(n, packet_size); i++) {
+    elements[i] = from[i * stride];
   }
   return pload<Packet>(elements);
 }
 
-template<typename Scalar, typename Packet> EIGEN_DEVICE_FUNC inline void pscatter(Scalar* to, const Packet& from, Index /*stride*/)
-{ pstore(to, from); }
+template <typename Scalar, typename Packet>
+EIGEN_DEVICE_FUNC inline void pscatter(Scalar* to, const Packet& from, Index /*stride*/) {
+  pstore(to, from);
+}
 
-template<typename Scalar, typename Packet> EIGEN_DEVICE_FUNC inline void pscatter_partial(Scalar* to, const Packet& from, Index stride, const Index n)
-{
+template <typename Scalar, typename Packet>
+EIGEN_DEVICE_FUNC inline void pscatter_partial(Scalar* to, const Packet& from, Index stride, const Index n) {
   const Index packet_size = unpacket_traits<Packet>::size;
   EIGEN_ALIGN_MAX Scalar elements[packet_size];
   pstore<Scalar>(elements, from);
-  for (Index i = 0; i < numext::mini(n,packet_size); i++) {
-    to[i*stride] = elements[i];
+  for (Index i = 0; i < numext::mini(n, packet_size); i++) {
+    to[i * stride] = elements[i];
   }
 }
 
 /** \internal tries to do cache prefetching of \a addr */
-template<typename Scalar> EIGEN_DEVICE_FUNC inline void prefetch(const Scalar* addr)
-{
+template <typename Scalar>
+EIGEN_DEVICE_FUNC inline void prefetch(const Scalar* addr) {
 #if defined(EIGEN_HIP_DEVICE_COMPILE)
   // do nothing
 #elif defined(EIGEN_CUDA_ARCH)
@@ -932,155 +968,214 @@
 }
 
 /** \internal \returns the reversed elements of \a a*/
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet preverse(const Packet& a)
-{ return a; }
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet preverse(const Packet& a) {
+  return a;
+}
 
 /** \internal \returns \a a with real and imaginary part flipped (for complex type only) */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet pcplxflip(const Packet& a)
-{
-  return Packet(numext::imag(a),numext::real(a));
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet pcplxflip(const Packet& a) {
+  return Packet(numext::imag(a), numext::real(a));
 }
 
 /**************************
-* Special math functions
-***************************/
+ * Special math functions
+ ***************************/
 
 /** \internal \returns the sine of \a a (coeff-wise) */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet psin(const Packet& a) { EIGEN_USING_STD(sin); return sin(a); }
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet psin(const Packet& a) {
+  EIGEN_USING_STD(sin);
+  return sin(a);
+}
 
 /** \internal \returns the cosine of \a a (coeff-wise) */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pcos(const Packet& a) { EIGEN_USING_STD(cos); return cos(a); }
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pcos(const Packet& a) {
+  EIGEN_USING_STD(cos);
+  return cos(a);
+}
 
 /** \internal \returns the tan of \a a (coeff-wise) */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet ptan(const Packet& a) { EIGEN_USING_STD(tan); return tan(a); }
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet ptan(const Packet& a) {
+  EIGEN_USING_STD(tan);
+  return tan(a);
+}
 
 /** \internal \returns the arc sine of \a a (coeff-wise) */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pasin(const Packet& a) { EIGEN_USING_STD(asin); return asin(a); }
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pasin(const Packet& a) {
+  EIGEN_USING_STD(asin);
+  return asin(a);
+}
 
 /** \internal \returns the arc cosine of \a a (coeff-wise) */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pacos(const Packet& a) { EIGEN_USING_STD(acos); return acos(a); }
-
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pacos(const Packet& a) {
+  EIGEN_USING_STD(acos);
+  return acos(a);
+}
 
 /** \internal \returns the hyperbolic sine of \a a (coeff-wise) */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet psinh(const Packet& a) { EIGEN_USING_STD(sinh); return sinh(a); }
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet psinh(const Packet& a) {
+  EIGEN_USING_STD(sinh);
+  return sinh(a);
+}
 
 /** \internal \returns the hyperbolic cosine of \a a (coeff-wise) */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pcosh(const Packet& a) { EIGEN_USING_STD(cosh); return cosh(a); }
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pcosh(const Packet& a) {
+  EIGEN_USING_STD(cosh);
+  return cosh(a);
+}
 
 /** \internal \returns the arc tangent of \a a (coeff-wise) */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet patan(const Packet& a) { EIGEN_USING_STD(atan); return atan(a); }
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet patan(const Packet& a) {
+  EIGEN_USING_STD(atan);
+  return atan(a);
+}
 
 /** \internal \returns the hyperbolic tan of \a a (coeff-wise) */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet ptanh(const Packet& a) { EIGEN_USING_STD(tanh); return tanh(a); }
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet ptanh(const Packet& a) {
+  EIGEN_USING_STD(tanh);
+  return tanh(a);
+}
 
 /** \internal \returns the arc tangent of \a a (coeff-wise) */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet patanh(const Packet& a) { EIGEN_USING_STD(atanh); return atanh(a); }
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet patanh(const Packet& a) {
+  EIGEN_USING_STD(atanh);
+  return atanh(a);
+}
 
 /** \internal \returns the exp of \a a (coeff-wise) */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pexp(const Packet& a) { EIGEN_USING_STD(exp); return exp(a); }
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pexp(const Packet& a) {
+  EIGEN_USING_STD(exp);
+  return exp(a);
+}
 
 /** \internal \returns the expm1 of \a a (coeff-wise) */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pexpm1(const Packet& a) { return numext::expm1(a); }
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pexpm1(const Packet& a) {
+  return numext::expm1(a);
+}
 
 /** \internal \returns the log of \a a (coeff-wise) */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet plog(const Packet& a) { EIGEN_USING_STD(log); return log(a); }
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog(const Packet& a) {
+  EIGEN_USING_STD(log);
+  return log(a);
+}
 
 /** \internal \returns the log1p of \a a (coeff-wise) */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet plog1p(const Packet& a) { return numext::log1p(a); }
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog1p(const Packet& a) {
+  return numext::log1p(a);
+}
 
 /** \internal \returns the log10 of \a a (coeff-wise) */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet plog10(const Packet& a) { EIGEN_USING_STD(log10); return log10(a); }
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog10(const Packet& a) {
+  EIGEN_USING_STD(log10);
+  return log10(a);
+}
 
 /** \internal \returns the log10 of \a a (coeff-wise) */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet plog2(const Packet& a) {
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog2(const Packet& a) {
   typedef typename internal::unpacket_traits<Packet>::type Scalar;
   return pmul(pset1<Packet>(Scalar(EIGEN_LOG2E)), plog(a));
 }
 
 /** \internal \returns the square-root of \a a (coeff-wise) */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet psqrt(const Packet& a) { return numext::sqrt(a); }
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet psqrt(const Packet& a) {
+  return numext::sqrt(a);
+}
 
 /** \internal \returns the cube-root of \a a (coeff-wise) */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pcbrt(const Packet& a) { return numext::cbrt(a); }
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pcbrt(const Packet& a) {
+  return numext::cbrt(a);
+}
 
 /** \internal \returns the rounded value of \a a (coeff-wise) */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pround(const Packet& a) { using numext::round; return round(a); }
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pround(const Packet& a) {
+  using numext::round;
+  return round(a);
+}
 
 /** \internal \returns the floor of \a a (coeff-wise) */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pfloor(const Packet& a) { using numext::floor; return floor(a); }
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pfloor(const Packet& a) {
+  using numext::floor;
+  return floor(a);
+}
 
 /** \internal \returns the rounded value of \a a (coeff-wise) with current
  * rounding mode */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet print(const Packet& a) { using numext::rint; return rint(a); }
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet print(const Packet& a) {
+  using numext::rint;
+  return rint(a);
+}
 
 /** \internal \returns the ceil of \a a (coeff-wise) */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pceil(const Packet& a) { using numext::ceil; return ceil(a); }
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pceil(const Packet& a) {
+  using numext::ceil;
+  return ceil(a);
+}
 
-template<typename Packet, typename EnableIf = void>
+template <typename Packet, typename EnableIf = void>
 struct psign_impl {
-  static EIGEN_DEVICE_FUNC inline Packet run(const Packet& a) {
-    return numext::sign(a);
-  }
+  static EIGEN_DEVICE_FUNC inline Packet run(const Packet& a) { return numext::sign(a); }
 };
 
 /** \internal \returns the sign of \a a (coeff-wise) */
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-psign(const Packet& a) {
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet psign(const Packet& a) {
   return psign_impl<Packet>::run(a);
 }
 
-template<> EIGEN_DEVICE_FUNC inline bool
-psign(const bool& a) {
+template <>
+EIGEN_DEVICE_FUNC inline bool psign(const bool& a) {
   return a;
 }
 
 /** \internal \returns the first element of a packet */
-template<typename Packet>
-EIGEN_DEVICE_FUNC inline typename unpacket_traits<Packet>::type
-pfirst(const Packet& a)
-{ return a; }
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline typename unpacket_traits<Packet>::type pfirst(const Packet& a) {
+  return a;
+}
 
 /** \internal \returns the sum of the elements of upper and lower half of \a a if \a a is larger than 4.
-  * For a packet {a0, a1, a2, a3, a4, a5, a6, a7}, it returns a half packet {a0+a4, a1+a5, a2+a6, a3+a7}
-  * For packet-size smaller or equal to 4, this boils down to a noop.
-  */
-template<typename Packet>
-EIGEN_DEVICE_FUNC inline std::conditional_t<(unpacket_traits<Packet>::size%8)==0,typename unpacket_traits<Packet>::half,Packet>
-predux_half_dowto4(const Packet& a)
-{ return a; }
+ * For a packet {a0, a1, a2, a3, a4, a5, a6, a7}, it returns a half packet {a0+a4, a1+a5, a2+a6, a3+a7}
+ * For packet-size smaller or equal to 4, this boils down to a noop.
+ */
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline std::conditional_t<(unpacket_traits<Packet>::size % 8) == 0,
+                                            typename unpacket_traits<Packet>::half, Packet>
+predux_half_dowto4(const Packet& a) {
+  return a;
+}
 
 // Slow generic implementation of Packet reduction.
 template <typename Packet, typename Op>
-EIGEN_DEVICE_FUNC inline typename unpacket_traits<Packet>::type
-predux_helper(const Packet& a, Op op) {
+EIGEN_DEVICE_FUNC inline typename unpacket_traits<Packet>::type predux_helper(const Packet& a, Op op) {
   typedef typename unpacket_traits<Packet>::type Scalar;
   const size_t n = unpacket_traits<Packet>::size;
   EIGEN_ALIGN_TO_BOUNDARY(sizeof(Packet)) Scalar elements[n];
   pstoreu<Scalar>(elements, a);
-  for(size_t k = n / 2; k > 0; k /= 2)  {
-    for(size_t i = 0; i < k; ++i) {
+  for (size_t k = n / 2; k > 0; k /= 2) {
+    for (size_t i = 0; i < k; ++i) {
       elements[i] = op(elements[i], elements[i + k]);
     }
   }
@@ -1088,47 +1183,40 @@
 }
 
 /** \internal \returns the sum of the elements of \a a*/
-template<typename Packet>
-EIGEN_DEVICE_FUNC inline typename unpacket_traits<Packet>::type
-predux(const Packet& a)
-{
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline typename unpacket_traits<Packet>::type predux(const Packet& a) {
   return a;
 }
 
 /** \internal \returns the product of the elements of \a a */
 template <typename Packet>
-EIGEN_DEVICE_FUNC inline typename unpacket_traits<Packet>::type predux_mul(
-    const Packet& a) {
+EIGEN_DEVICE_FUNC inline typename unpacket_traits<Packet>::type predux_mul(const Packet& a) {
   typedef typename unpacket_traits<Packet>::type Scalar;
   return predux_helper(a, EIGEN_BINARY_OP_NAN_PROPAGATION(Scalar, (pmul<Scalar>)));
 }
 
 /** \internal \returns the min of the elements of \a a */
 template <typename Packet>
-EIGEN_DEVICE_FUNC inline typename unpacket_traits<Packet>::type predux_min(
-    const Packet &a) {
+EIGEN_DEVICE_FUNC inline typename unpacket_traits<Packet>::type predux_min(const Packet& a) {
   typedef typename unpacket_traits<Packet>::type Scalar;
   return predux_helper(a, EIGEN_BINARY_OP_NAN_PROPAGATION(Scalar, (pmin<PropagateFast, Scalar>)));
 }
 
 template <int NaNPropagation, typename Packet>
-EIGEN_DEVICE_FUNC inline typename unpacket_traits<Packet>::type predux_min(
-    const Packet& a) {
+EIGEN_DEVICE_FUNC inline typename unpacket_traits<Packet>::type predux_min(const Packet& a) {
   typedef typename unpacket_traits<Packet>::type Scalar;
   return predux_helper(a, EIGEN_BINARY_OP_NAN_PROPAGATION(Scalar, (pmin<NaNPropagation, Scalar>)));
 }
 
 /** \internal \returns the min of the elements of \a a */
 template <typename Packet>
-EIGEN_DEVICE_FUNC inline typename unpacket_traits<Packet>::type predux_max(
-    const Packet &a) {
+EIGEN_DEVICE_FUNC inline typename unpacket_traits<Packet>::type predux_max(const Packet& a) {
   typedef typename unpacket_traits<Packet>::type Scalar;
   return predux_helper(a, EIGEN_BINARY_OP_NAN_PROPAGATION(Scalar, (pmax<PropagateFast, Scalar>)));
 }
 
 template <int NaNPropagation, typename Packet>
-EIGEN_DEVICE_FUNC inline typename unpacket_traits<Packet>::type predux_max(
-    const Packet& a) {
+EIGEN_DEVICE_FUNC inline typename unpacket_traits<Packet>::type predux_max(const Packet& a) {
   typedef typename unpacket_traits<Packet>::type Scalar;
   return predux_helper(a, EIGEN_BINARY_OP_NAN_PROPAGATION(Scalar, (pmax<NaNPropagation, Scalar>)));
 }
@@ -1136,17 +1224,17 @@
 #undef EIGEN_BINARY_OP_NAN_PROPAGATION
 
 /** \internal \returns true if all coeffs of \a a means "true"
-  * It is supposed to be called on values returned by pcmp_*.
-  */
+ * It is supposed to be called on values returned by pcmp_*.
+ */
 // not needed yet
 // template<typename Packet> EIGEN_DEVICE_FUNC inline bool predux_all(const Packet& a)
 // { return bool(a); }
 
 /** \internal \returns true if any coeffs of \a a means "true"
-  * It is supposed to be called on values returned by pcmp_*.
-  */
-template<typename Packet> EIGEN_DEVICE_FUNC inline bool predux_any(const Packet& a)
-{
+ * It is supposed to be called on values returned by pcmp_*.
+ */
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline bool predux_any(const Packet& a) {
   // Dirty but generic implementation where "true" is assumed to be non 0 and all the sames.
   // It is expected that "true" is either:
   //  - Scalar(1)
@@ -1158,140 +1246,140 @@
 }
 
 /***************************************************************************
-* The following functions might not have to be overwritten for vectorized types
-***************************************************************************/
+ * The following functions might not have to be overwritten for vectorized types
+ ***************************************************************************/
 
 // FMA instructions.
 /** \internal \returns a * b + c (coeff-wise) */
 template <typename Packet>
-EIGEN_DEVICE_FUNC inline Packet pmadd(const Packet& a, const Packet& b,
-                                      const Packet& c) {
+EIGEN_DEVICE_FUNC inline Packet pmadd(const Packet& a, const Packet& b, const Packet& c) {
   return padd(pmul(a, b), c);
 }
 
 /** \internal \returns a * b - c (coeff-wise) */
 template <typename Packet>
-EIGEN_DEVICE_FUNC inline Packet pmsub(const Packet& a, const Packet& b,
-                                      const Packet& c) {
+EIGEN_DEVICE_FUNC inline Packet pmsub(const Packet& a, const Packet& b, const Packet& c) {
   return psub(pmul(a, b), c);
 }
 
 /** \internal \returns -(a * b) + c (coeff-wise) */
 template <typename Packet>
-EIGEN_DEVICE_FUNC inline Packet pnmadd(const Packet& a, const Packet& b,
-                                       const Packet& c) {
+EIGEN_DEVICE_FUNC inline Packet pnmadd(const Packet& a, const Packet& b, const Packet& c) {
   return padd(pnegate(pmul(a, b)), c);
 }
 
 /** \internal \returns -(a * b) - c (coeff-wise) */
 template <typename Packet>
-EIGEN_DEVICE_FUNC inline Packet pnmsub(const Packet& a, const Packet& b,
-                                       const Packet& c) {
+EIGEN_DEVICE_FUNC inline Packet pnmsub(const Packet& a, const Packet& b, const Packet& c) {
   return psub(pnegate(pmul(a, b)), c);
 }
 
-/** \internal copy a packet with constant coefficient \a a (e.g., [a,a,a,a]) to \a *to. \a to must be 16 bytes aligned */
-// NOTE: this function must really be templated on the packet type (think about different packet types for the same scalar type)
-template<typename Packet>
-inline void pstore1(typename unpacket_traits<Packet>::type* to, const typename unpacket_traits<Packet>::type& a)
-{
+/** \internal copy a packet with constant coefficient \a a (e.g., [a,a,a,a]) to \a *to. \a to must be 16 bytes aligned
+ */
+// NOTE: this function must really be templated on the packet type (think about different packet types for the same
+// scalar type)
+template <typename Packet>
+inline void pstore1(typename unpacket_traits<Packet>::type* to, const typename unpacket_traits<Packet>::type& a) {
   pstore(to, pset1<Packet>(a));
 }
 
 /** \internal \returns a packet version of \a *from.
-  * The pointer \a from must be aligned on a \a Alignment bytes boundary. */
-template<typename Packet, int Alignment>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet ploadt(const typename unpacket_traits<Packet>::type* from)
-{
-  if(Alignment >= unpacket_traits<Packet>::alignment)
+ * The pointer \a from must be aligned on a \a Alignment bytes boundary. */
+template <typename Packet, int Alignment>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet ploadt(const typename unpacket_traits<Packet>::type* from) {
+  if (Alignment >= unpacket_traits<Packet>::alignment)
     return pload<Packet>(from);
   else
     return ploadu<Packet>(from);
 }
 
 /** \internal \returns n elements of a packet version of \a *from.
-  * The pointer \a from must be aligned on a \a Alignment bytes boundary. */
-template<typename Packet, int Alignment>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet ploadt_partial(const typename unpacket_traits<Packet>::type* from, const Index n, const Index offset = 0)
-{
-  if(Alignment >= unpacket_traits<Packet>::alignment)
+ * The pointer \a from must be aligned on a \a Alignment bytes boundary. */
+template <typename Packet, int Alignment>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet ploadt_partial(const typename unpacket_traits<Packet>::type* from,
+                                                            const Index n, const Index offset = 0) {
+  if (Alignment >= unpacket_traits<Packet>::alignment)
     return pload_partial<Packet>(from, n, offset);
   else
     return ploadu_partial<Packet>(from, n, offset);
 }
 
 /** \internal copy the packet \a from to \a *to.
-  * The pointer \a from must be aligned on a \a Alignment bytes boundary. */
-template<typename Scalar, typename Packet, int Alignment>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pstoret(Scalar* to, const Packet& from)
-{
-  if(Alignment >= unpacket_traits<Packet>::alignment)
+ * The pointer \a from must be aligned on a \a Alignment bytes boundary. */
+template <typename Scalar, typename Packet, int Alignment>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pstoret(Scalar* to, const Packet& from) {
+  if (Alignment >= unpacket_traits<Packet>::alignment)
     pstore(to, from);
   else
     pstoreu(to, from);
 }
 
 /** \internal copy n elements of the packet \a from to \a *to.
-  * The pointer \a from must be aligned on a \a Alignment bytes boundary. */
-template<typename Scalar, typename Packet, int Alignment>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pstoret_partial(Scalar* to, const Packet& from, const Index n, const Index offset = 0)
-{
-  if(Alignment >= unpacket_traits<Packet>::alignment)
+ * The pointer \a from must be aligned on a \a Alignment bytes boundary. */
+template <typename Scalar, typename Packet, int Alignment>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pstoret_partial(Scalar* to, const Packet& from, const Index n,
+                                                           const Index offset = 0) {
+  if (Alignment >= unpacket_traits<Packet>::alignment)
     pstore_partial(to, from, n, offset);
   else
     pstoreu_partial(to, from, n, offset);
 }
 
 /** \internal \returns a packet version of \a *from.
-  * Unlike ploadt, ploadt_ro takes advantage of the read-only memory path on the
-  * hardware if available to speedup the loading of data that won't be modified
-  * by the current computation.
-  */
-template<typename Packet, int LoadMode>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet ploadt_ro(const typename unpacket_traits<Packet>::type* from)
-{
+ * Unlike ploadt, ploadt_ro takes advantage of the read-only memory path on the
+ * hardware if available to speedup the loading of data that won't be modified
+ * by the current computation.
+ */
+template <typename Packet, int LoadMode>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet ploadt_ro(const typename unpacket_traits<Packet>::type* from) {
   return ploadt<Packet, LoadMode>(from);
 }
 
 /***************************************************************************
-* Fast complex products (GCC generates a function call which is very slow)
-***************************************************************************/
+ * Fast complex products (GCC generates a function call which is very slow)
+ ***************************************************************************/
 
 // Eigen+CUDA does not support complexes.
 #if !defined(EIGEN_GPUCC)
 
-template<> inline std::complex<float> pmul(const std::complex<float>& a, const std::complex<float>& b)
-{ return std::complex<float>(a.real()*b.real() - a.imag()*b.imag(), a.imag()*b.real() + a.real()*b.imag()); }
+template <>
+inline std::complex<float> pmul(const std::complex<float>& a, const std::complex<float>& b) {
+  return std::complex<float>(a.real() * b.real() - a.imag() * b.imag(), a.imag() * b.real() + a.real() * b.imag());
+}
 
-template<> inline std::complex<double> pmul(const std::complex<double>& a, const std::complex<double>& b)
-{ return std::complex<double>(a.real()*b.real() - a.imag()*b.imag(), a.imag()*b.real() + a.real()*b.imag()); }
+template <>
+inline std::complex<double> pmul(const std::complex<double>& a, const std::complex<double>& b) {
+  return std::complex<double>(a.real() * b.real() - a.imag() * b.imag(), a.imag() * b.real() + a.real() * b.imag());
+}
 
 #endif
 
-
 /***************************************************************************
  * PacketBlock, that is a collection of N packets where the number of words
  * in the packet is a multiple of N.
-***************************************************************************/
-template <typename Packet,int N=unpacket_traits<Packet>::size> struct PacketBlock {
+ ***************************************************************************/
+template <typename Packet, int N = unpacket_traits<Packet>::size>
+struct PacketBlock {
   Packet packet[N];
 };
 
-template<typename Packet> EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet,1>& /*kernel*/) {
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet, 1>& /*kernel*/) {
   // Nothing to do in the scalar case, i.e. a 1x1 matrix.
 }
 
 /***************************************************************************
  * Selector, i.e. vector of N boolean values used to select (i.e. blend)
  * words from 2 packets.
-***************************************************************************/
-template <size_t N> struct Selector {
+ ***************************************************************************/
+template <size_t N>
+struct Selector {
   bool select[N];
 };
 
-template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
-pblend(const Selector<unpacket_traits<Packet>::size>& ifPacket, const Packet& thenPacket, const Packet& elsePacket) {
+template <typename Packet>
+EIGEN_DEVICE_FUNC inline Packet pblend(const Selector<unpacket_traits<Packet>::size>& ifPacket,
+                                       const Packet& thenPacket, const Packet& elsePacket) {
   return ifPacket.select[0] ? thenPacket : elsePacket;
 }
 
@@ -1303,8 +1391,8 @@
 }
 
 /** \internal \returns the reciprocal square-root of \a a (coeff-wise) */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet prsqrt(const Packet& a) {
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet prsqrt(const Packet& a) {
   return preciprocal<Packet>(psqrt(a));
 }
 
@@ -1333,8 +1421,9 @@
 };
 /** \internal \returns the sign bit of \a a as a bitmask*/
 template <typename Packet>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE constexpr Packet
-psignbit(const Packet& a) { return psignbit_impl<Packet>::run(a); }
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE constexpr Packet psignbit(const Packet& a) {
+  return psignbit_impl<Packet>::run(a);
+}
 
 /** \internal \returns the 2-argument arc tangent of \a y and \a x (coeff-wise) */
 template <typename Packet, std::enable_if_t<is_scalar<Packet>::value, int> = 0>
@@ -1382,7 +1471,8 @@
 /** \internal \returns the argument of \a a as a complex number */
 template <typename Packet, std::enable_if_t<!is_scalar<Packet>::value, int> = 0>
 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet pcarg(const Packet& a) {
-  EIGEN_STATIC_ASSERT(NumTraits<typename unpacket_traits<Packet>::type>::IsComplex, THIS METHOD IS FOR COMPLEX TYPES ONLY)
+  EIGEN_STATIC_ASSERT(NumTraits<typename unpacket_traits<Packet>::type>::IsComplex,
+                      THIS METHOD IS FOR COMPLEX TYPES ONLY)
   using RealPacket = typename unpacket_traits<Packet>::as_real;
   // a                                              // r     i    r     i    ...
   RealPacket aflip = pcplxflip(a).v;                // i     r    i     r    ...
@@ -1390,8 +1480,8 @@
   return (Packet)pand(result, peven_mask(result));  // atan2 0    atan2 0    ...
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_GENERIC_PACKET_MATH_H
+#endif  // EIGEN_GENERIC_PACKET_MATH_H
diff --git a/Eigen/src/Core/GlobalFunctions.h b/Eigen/src/Core/GlobalFunctions.h
index 2d8bb80..f0ae5a8 100644
--- a/Eigen/src/Core/GlobalFunctions.h
+++ b/Eigen/src/Core/GlobalFunctions.h
@@ -13,203 +13,214 @@
 
 #ifdef EIGEN_PARSED_BY_DOXYGEN
 
-#define EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(NAME,FUNCTOR,DOC_OP,DOC_DETAILS) \
-  /** \returns an expression of the coefficient-wise DOC_OP of \a x
-
-    DOC_DETAILS
-
-    \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_##NAME">Math functions</a>, class CwiseUnaryOp
-    */ \
-  template<typename Derived> \
-  inline const Eigen::CwiseUnaryOp<Eigen::internal::FUNCTOR<typename Derived::Scalar>, const Derived> \
-  NAME(const Eigen::ArrayBase<Derived>& x);
+#define EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(NAME, FUNCTOR, DOC_OP, DOC_DETAILS)                                    \
+  /** \returns an expression of the coefficient-wise DOC_OP of \a x                                             \
+                                                                                                              \ \
+    DOC_DETAILS                                                                                                 \
+                                                                                                              \ \
+    \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_##NAME">Math functions</a>, class CwiseUnaryOp   \
+    */                                                                                                          \
+  template <typename Derived>                                                                                   \
+  inline const Eigen::CwiseUnaryOp<Eigen::internal::FUNCTOR<typename Derived::Scalar>, const Derived> NAME(     \
+      const Eigen::ArrayBase<Derived>& x);
 
 #else
 
-#define EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(NAME,FUNCTOR,DOC_OP,DOC_DETAILS) \
-  template<typename Derived> \
-  inline const Eigen::CwiseUnaryOp<Eigen::internal::FUNCTOR<typename Derived::Scalar>, const Derived> \
-  (NAME)(const Eigen::ArrayBase<Derived>& x) { \
+#define EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(NAME, FUNCTOR, DOC_OP, DOC_DETAILS)                                    \
+  template <typename Derived>                                                                                   \
+  inline const Eigen::CwiseUnaryOp<Eigen::internal::FUNCTOR<typename Derived::Scalar>, const Derived>(NAME)(    \
+      const Eigen::ArrayBase<Derived>& x) {                                                                     \
     return Eigen::CwiseUnaryOp<Eigen::internal::FUNCTOR<typename Derived::Scalar>, const Derived>(x.derived()); \
   }
 
-#endif // EIGEN_PARSED_BY_DOXYGEN
+#endif  // EIGEN_PARSED_BY_DOXYGEN
 
-#define EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(NAME,FUNCTOR) \
-  \
-  template<typename Derived> \
-  struct NAME##_retval<ArrayBase<Derived> > \
-  { \
+#define EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(NAME, FUNCTOR)                                                  \
+                                                                                                               \
+  template <typename Derived>                                                                                  \
+  struct NAME##_retval<ArrayBase<Derived> > {                                                                  \
     typedef const Eigen::CwiseUnaryOp<Eigen::internal::FUNCTOR<typename Derived::Scalar>, const Derived> type; \
-  }; \
-  template<typename Derived> \
-  struct NAME##_impl<ArrayBase<Derived> > \
-  { \
-    static inline typename NAME##_retval<ArrayBase<Derived> >::type run(const Eigen::ArrayBase<Derived>& x) \
-    { \
-      return typename NAME##_retval<ArrayBase<Derived> >::type(x.derived()); \
-    } \
+  };                                                                                                           \
+  template <typename Derived>                                                                                  \
+  struct NAME##_impl<ArrayBase<Derived> > {                                                                    \
+    static inline typename NAME##_retval<ArrayBase<Derived> >::type run(const Eigen::ArrayBase<Derived>& x) {  \
+      return typename NAME##_retval<ArrayBase<Derived> >::type(x.derived());                                   \
+    }                                                                                                          \
   };
 
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen
-{
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(real,scalar_real_op,real part,\sa ArrayBase::real)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(imag,scalar_imag_op,imaginary part,\sa ArrayBase::imag)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(conj,scalar_conjugate_op,complex conjugate,\sa ArrayBase::conjugate)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(inverse,scalar_inverse_op,inverse,\sa ArrayBase::inverse)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(sin,scalar_sin_op,sine,\sa ArrayBase::sin)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(cos,scalar_cos_op,cosine,\sa ArrayBase::cos)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(tan,scalar_tan_op,tangent,\sa ArrayBase::tan)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(atan,scalar_atan_op,arc-tangent,\sa ArrayBase::atan)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(asin,scalar_asin_op,arc-sine,\sa ArrayBase::asin)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(acos,scalar_acos_op,arc-consine,\sa ArrayBase::acos)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(sinh,scalar_sinh_op,hyperbolic sine,\sa ArrayBase::sinh)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(cosh,scalar_cosh_op,hyperbolic cosine,\sa ArrayBase::cosh)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(tanh,scalar_tanh_op,hyperbolic tangent,\sa ArrayBase::tanh)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(asinh,scalar_asinh_op,inverse hyperbolic sine,\sa ArrayBase::asinh)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(acosh,scalar_acosh_op,inverse hyperbolic cosine,\sa ArrayBase::acosh)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(atanh,scalar_atanh_op,inverse hyperbolic tangent,\sa ArrayBase::atanh)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(logistic,scalar_logistic_op,logistic function,\sa ArrayBase::logistic)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(lgamma,scalar_lgamma_op,natural logarithm of the gamma function,\sa ArrayBase::lgamma)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(digamma,scalar_digamma_op,derivative of lgamma,\sa ArrayBase::digamma)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(erf,scalar_erf_op,error function,\sa ArrayBase::erf)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(erfc,scalar_erfc_op,complement error function,\sa ArrayBase::erfc)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(ndtri,scalar_ndtri_op,inverse normal distribution function,\sa ArrayBase::ndtri)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(exp,scalar_exp_op,exponential,\sa ArrayBase::exp)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(expm1,scalar_expm1_op,exponential of a value minus 1,\sa ArrayBase::expm1)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(log,scalar_log_op,natural logarithm,\sa Eigen::log10 DOXCOMMA ArrayBase::log)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(log1p,scalar_log1p_op,natural logarithm of 1 plus the value,\sa ArrayBase::log1p)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(log10,scalar_log10_op,base 10 logarithm,\sa Eigen::log DOXCOMMA ArrayBase::log10)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(log2,scalar_log2_op,base 2 logarithm,\sa Eigen::log DOXCOMMA ArrayBase::log2)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(abs,scalar_abs_op,absolute value,\sa ArrayBase::abs DOXCOMMA MatrixBase::cwiseAbs)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(abs2,scalar_abs2_op,squared absolute value,\sa ArrayBase::abs2 DOXCOMMA MatrixBase::cwiseAbs2)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(arg,scalar_arg_op,complex argument,\sa ArrayBase::arg DOXCOMMA MatrixBase::cwiseArg)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(carg, scalar_carg_op, complex argument, \sa ArrayBase::carg DOXCOMMA MatrixBase::cwiseCArg)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(sqrt,scalar_sqrt_op,square root,\sa ArrayBase::sqrt DOXCOMMA MatrixBase::cwiseSqrt)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(cbrt,scalar_cbrt_op,cube root,\sa ArrayBase::cbrt DOXCOMMA MatrixBase::cwiseCbrt)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(rsqrt,scalar_rsqrt_op,reciprocal square root,\sa ArrayBase::rsqrt)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(square,scalar_square_op,square (power 2),\sa Eigen::abs2 DOXCOMMA Eigen::pow DOXCOMMA ArrayBase::square)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(cube,scalar_cube_op,cube (power 3),\sa Eigen::pow DOXCOMMA ArrayBase::cube)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(rint,scalar_rint_op,nearest integer,\sa Eigen::floor DOXCOMMA Eigen::ceil DOXCOMMA ArrayBase::round)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(round,scalar_round_op,nearest integer,\sa Eigen::floor DOXCOMMA Eigen::ceil DOXCOMMA ArrayBase::round)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(floor,scalar_floor_op,nearest integer not greater than the giben value,\sa Eigen::ceil DOXCOMMA ArrayBase::floor)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(ceil,scalar_ceil_op,nearest integer not less than the giben value,\sa Eigen::floor DOXCOMMA ArrayBase::ceil)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(isnan,scalar_isnan_op,not-a-number test,\sa Eigen::isinf DOXCOMMA Eigen::isfinite DOXCOMMA ArrayBase::isnan)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(isinf,scalar_isinf_op,infinite value test,\sa Eigen::isnan DOXCOMMA Eigen::isfinite DOXCOMMA ArrayBase::isinf)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(isfinite,scalar_isfinite_op,finite value test,\sa Eigen::isinf DOXCOMMA Eigen::isnan DOXCOMMA ArrayBase::isfinite)
-  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(sign,scalar_sign_op,sign (or 0),\sa ArrayBase::sign)
+namespace Eigen {
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(real, scalar_real_op, real part,\sa ArrayBase::real)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(imag, scalar_imag_op, imaginary part,\sa ArrayBase::imag)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(conj, scalar_conjugate_op, complex conjugate,\sa ArrayBase::conjugate)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(inverse, scalar_inverse_op, inverse,\sa ArrayBase::inverse)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(sin, scalar_sin_op, sine,\sa ArrayBase::sin)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(cos, scalar_cos_op, cosine,\sa ArrayBase::cos)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(tan, scalar_tan_op, tangent,\sa ArrayBase::tan)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(atan, scalar_atan_op, arc - tangent,\sa ArrayBase::atan)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(asin, scalar_asin_op, arc - sine,\sa ArrayBase::asin)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(acos, scalar_acos_op, arc - consine,\sa ArrayBase::acos)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(sinh, scalar_sinh_op, hyperbolic sine,\sa ArrayBase::sinh)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(cosh, scalar_cosh_op, hyperbolic cosine,\sa ArrayBase::cosh)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(tanh, scalar_tanh_op, hyperbolic tangent,\sa ArrayBase::tanh)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(asinh, scalar_asinh_op, inverse hyperbolic sine,\sa ArrayBase::asinh)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(acosh, scalar_acosh_op, inverse hyperbolic cosine,\sa ArrayBase::acosh)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(atanh, scalar_atanh_op, inverse hyperbolic tangent,\sa ArrayBase::atanh)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(logistic, scalar_logistic_op, logistic function,\sa ArrayBase::logistic)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(lgamma, scalar_lgamma_op,
+                                 natural logarithm of the gamma function,\sa ArrayBase::lgamma)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(digamma, scalar_digamma_op, derivative of lgamma,\sa ArrayBase::digamma)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(erf, scalar_erf_op, error function,\sa ArrayBase::erf)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(erfc, scalar_erfc_op, complement error function,\sa ArrayBase::erfc)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(ndtri, scalar_ndtri_op, inverse normal distribution function,\sa ArrayBase::ndtri)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(exp, scalar_exp_op, exponential,\sa ArrayBase::exp)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(expm1, scalar_expm1_op, exponential of a value minus 1,\sa ArrayBase::expm1)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(log, scalar_log_op, natural logarithm,\sa Eigen::log10 DOXCOMMA ArrayBase::log)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(log1p, scalar_log1p_op, natural logarithm of 1 plus the value,\sa ArrayBase::log1p)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(log10, scalar_log10_op, base 10 logarithm,\sa Eigen::log DOXCOMMA ArrayBase::log10)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(log2, scalar_log2_op, base 2 logarithm,\sa Eigen::log DOXCOMMA ArrayBase::log2)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(abs, scalar_abs_op, absolute value,\sa ArrayBase::abs DOXCOMMA MatrixBase::cwiseAbs)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(abs2, scalar_abs2_op,
+                                 squared absolute value,\sa ArrayBase::abs2 DOXCOMMA MatrixBase::cwiseAbs2)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(arg, scalar_arg_op, complex argument,\sa ArrayBase::arg DOXCOMMA MatrixBase::cwiseArg)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(carg, scalar_carg_op,
+                                 complex argument, \sa ArrayBase::carg DOXCOMMA MatrixBase::cwiseCArg)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(sqrt, scalar_sqrt_op, square root,\sa ArrayBase::sqrt DOXCOMMA MatrixBase::cwiseSqrt)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(cbrt, scalar_cbrt_op, cube root,\sa ArrayBase::cbrt DOXCOMMA MatrixBase::cwiseCbrt)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(rsqrt, scalar_rsqrt_op, reciprocal square root,\sa ArrayBase::rsqrt)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(square, scalar_square_op,
+                                 square(power 2),\sa Eigen::abs2 DOXCOMMA Eigen::pow DOXCOMMA ArrayBase::square)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(cube, scalar_cube_op, cube(power 3),\sa Eigen::pow DOXCOMMA ArrayBase::cube)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(rint, scalar_rint_op,
+                                 nearest integer,\sa Eigen::floor DOXCOMMA Eigen::ceil DOXCOMMA ArrayBase::round)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(round, scalar_round_op,
+                                 nearest integer,\sa Eigen::floor DOXCOMMA Eigen::ceil DOXCOMMA ArrayBase::round)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(
+    floor, scalar_floor_op, nearest integer not greater than the giben value,\sa Eigen::ceil DOXCOMMA ArrayBase::floor)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(
+    ceil, scalar_ceil_op, nearest integer not less than the giben value,\sa Eigen::floor DOXCOMMA ArrayBase::ceil)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(
+    isnan, scalar_isnan_op, not -a - number test,\sa Eigen::isinf DOXCOMMA Eigen::isfinite DOXCOMMA ArrayBase::isnan)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(
+    isinf, scalar_isinf_op, infinite value test,\sa Eigen::isnan DOXCOMMA Eigen::isfinite DOXCOMMA ArrayBase::isinf)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(isfinite, scalar_isfinite_op,
+                                 finite value test,\sa Eigen::isinf DOXCOMMA Eigen::isnan DOXCOMMA ArrayBase::isfinite)
+EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(sign, scalar_sign_op, sign(or 0),\sa ArrayBase::sign)
 
-  template <typename Derived, typename ScalarExponent>
-  using GlobalUnaryPowReturnType = std::enable_if_t<
-      !internal::is_arithmetic<typename NumTraits<Derived>::Real>::value &&
-          internal::is_arithmetic<typename NumTraits<ScalarExponent>::Real>::value,
-      CwiseUnaryOp<internal::scalar_unary_pow_op<typename Derived::Scalar, ScalarExponent>, const Derived> >;
+template <typename Derived, typename ScalarExponent>
+using GlobalUnaryPowReturnType = std::enable_if_t<
+    !internal::is_arithmetic<typename NumTraits<Derived>::Real>::value &&
+        internal::is_arithmetic<typename NumTraits<ScalarExponent>::Real>::value,
+    CwiseUnaryOp<internal::scalar_unary_pow_op<typename Derived::Scalar, ScalarExponent>, const Derived> >;
 
-  /** \returns an expression of the coefficient-wise power of \a x to the given constant \a exponent.
-   *
-   * \tparam ScalarExponent is the scalar type of \a exponent. It must be compatible with the scalar type of the given
-   * expression (\c Derived::Scalar).
-   *
-   * \sa ArrayBase::pow()
-   *
-   * \relates ArrayBase
-   */
+/** \returns an expression of the coefficient-wise power of \a x to the given constant \a exponent.
+ *
+ * \tparam ScalarExponent is the scalar type of \a exponent. It must be compatible with the scalar type of the given
+ * expression (\c Derived::Scalar).
+ *
+ * \sa ArrayBase::pow()
+ *
+ * \relates ArrayBase
+ */
 #ifdef EIGEN_PARSED_BY_DOXYGEN
-  template <typename Derived, typename ScalarExponent>
-  EIGEN_DEVICE_FUNC inline const GlobalUnaryPowReturnType<Derived, ScalarExponent> pow(
-      const Eigen::ArrayBase<Derived>& x, const ScalarExponent& exponent);
+template <typename Derived, typename ScalarExponent>
+EIGEN_DEVICE_FUNC inline const GlobalUnaryPowReturnType<Derived, ScalarExponent> pow(const Eigen::ArrayBase<Derived>& x,
+                                                                                     const ScalarExponent& exponent);
 #else
-  template <typename Derived, typename ScalarExponent>
-  EIGEN_DEVICE_FUNC inline const GlobalUnaryPowReturnType<Derived, ScalarExponent> pow(
-      const Eigen::ArrayBase<Derived>& x, const ScalarExponent& exponent) {
-    return GlobalUnaryPowReturnType<Derived, ScalarExponent>(
-        x.derived(), internal::scalar_unary_pow_op<typename Derived::Scalar, ScalarExponent>(exponent));
-  }
+template <typename Derived, typename ScalarExponent>
+EIGEN_DEVICE_FUNC inline const GlobalUnaryPowReturnType<Derived, ScalarExponent> pow(const Eigen::ArrayBase<Derived>& x,
+                                                                                     const ScalarExponent& exponent) {
+  return GlobalUnaryPowReturnType<Derived, ScalarExponent>(
+      x.derived(), internal::scalar_unary_pow_op<typename Derived::Scalar, ScalarExponent>(exponent));
+}
 #endif
 
-  /** \returns an expression of the coefficient-wise power of \a x to the given array of \a exponents.
-    *
-    * This function computes the coefficient-wise power.
-    *
-    * Example: \include Cwise_array_power_array.cpp
-    * Output: \verbinclude Cwise_array_power_array.out
-    *
-    * \sa ArrayBase::pow()
-    *
-    * \relates ArrayBase
-    */
-  template<typename Derived,typename ExponentDerived>
-  inline const Eigen::CwiseBinaryOp<Eigen::internal::scalar_pow_op<typename Derived::Scalar, typename ExponentDerived::Scalar>, const Derived, const ExponentDerived>
-  pow(const Eigen::ArrayBase<Derived>& x, const Eigen::ArrayBase<ExponentDerived>& exponents)
-  {
-    return Eigen::CwiseBinaryOp<Eigen::internal::scalar_pow_op<typename Derived::Scalar, typename ExponentDerived::Scalar>, const Derived, const ExponentDerived>(
-      x.derived(),
-      exponents.derived()
-    );
-  }
-
-  /** \returns an expression of the coefficient-wise power of the scalar \a x to the given array of \a exponents.
-    *
-    * This function computes the coefficient-wise power between a scalar and an array of exponents.
-    *
-    * \tparam Scalar is the scalar type of \a x. It must be compatible with the scalar type of the given array expression (\c Derived::Scalar).
-    *
-    * Example: \include Cwise_scalar_power_array.cpp
-    * Output: \verbinclude Cwise_scalar_power_array.out
-    *
-    * \sa ArrayBase::pow()
-    *
-    * \relates ArrayBase
-    */
-#ifdef EIGEN_PARSED_BY_DOXYGEN
-  template<typename Scalar,typename Derived>
-  inline const CwiseBinaryOp<internal::scalar_pow_op<Scalar,Derived::Scalar>,Constant<Scalar>,Derived>
-  pow(const Scalar& x,const Eigen::ArrayBase<Derived>& x);
-#else
-  template <typename Scalar, typename Derived>
-  EIGEN_DEVICE_FUNC inline
-    const EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(typename internal::promote_scalar_arg<typename Derived::Scalar
-                                                 EIGEN_COMMA Scalar EIGEN_COMMA
-                                                 EIGEN_SCALAR_BINARY_SUPPORTED(pow,Scalar,typename Derived::Scalar)>::type,Derived,pow)
-  pow(const Scalar& x, const Eigen::ArrayBase<Derived>& exponents) {
-    typedef typename internal::promote_scalar_arg<typename Derived::Scalar,Scalar,
-                                                  EIGEN_SCALAR_BINARY_SUPPORTED(pow,Scalar,typename Derived::Scalar)>::type PromotedScalar;
-    return EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(PromotedScalar,Derived,pow)(
-           typename internal::plain_constant_type<Derived,PromotedScalar>::type(exponents.derived().rows(), exponents.derived().cols(), internal::scalar_constant_op<PromotedScalar>(x)), exponents.derived());
-  }
-#endif
-
-  /** \returns an expression of the coefficient-wise atan2(\a x, \a y). \a x and \a y must be of the same type.
-    *
-    * This function computes the coefficient-wise atan2().
-    *
-    * \sa ArrayBase::atan2()
-    *
-    * \relates ArrayBase
-    */
-  template <typename LhsDerived, typename RhsDerived>
-  inline const std::enable_if_t<
-      std::is_same<typename LhsDerived::Scalar, typename RhsDerived::Scalar>::value,
-      Eigen::CwiseBinaryOp<Eigen::internal::scalar_atan2_op<typename LhsDerived::Scalar, typename RhsDerived::Scalar>, const LhsDerived, const RhsDerived>
-      >
-  atan2(const Eigen::ArrayBase<LhsDerived>& x, const Eigen::ArrayBase<RhsDerived>& exponents) {
-    return Eigen::CwiseBinaryOp<Eigen::internal::scalar_atan2_op<typename LhsDerived::Scalar, typename RhsDerived::Scalar>, const LhsDerived, const RhsDerived>(
-      x.derived(),
-      exponents.derived()
-    );
-  }
-
-  namespace internal
-  {
-    EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(real,scalar_real_op)
-    EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(imag,scalar_imag_op)
-    EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(abs2,scalar_abs2_op)
-  }
+/** \returns an expression of the coefficient-wise power of \a x to the given array of \a exponents.
+ *
+ * This function computes the coefficient-wise power.
+ *
+ * Example: \include Cwise_array_power_array.cpp
+ * Output: \verbinclude Cwise_array_power_array.out
+ *
+ * \sa ArrayBase::pow()
+ *
+ * \relates ArrayBase
+ */
+template <typename Derived, typename ExponentDerived>
+inline const Eigen::CwiseBinaryOp<
+    Eigen::internal::scalar_pow_op<typename Derived::Scalar, typename ExponentDerived::Scalar>, const Derived,
+    const ExponentDerived>
+pow(const Eigen::ArrayBase<Derived>& x, const Eigen::ArrayBase<ExponentDerived>& exponents) {
+  return Eigen::CwiseBinaryOp<
+      Eigen::internal::scalar_pow_op<typename Derived::Scalar, typename ExponentDerived::Scalar>, const Derived,
+      const ExponentDerived>(x.derived(), exponents.derived());
 }
 
-// TODO: cleanly disable those functions that are not supported on Array (numext::real_ref, internal::random, internal::isApprox...)
+/** \returns an expression of the coefficient-wise power of the scalar \a x to the given array of \a exponents.
+ *
+ * This function computes the coefficient-wise power between a scalar and an array of exponents.
+ *
+ * \tparam Scalar is the scalar type of \a x. It must be compatible with the scalar type of the given array expression
+ * (\c Derived::Scalar).
+ *
+ * Example: \include Cwise_scalar_power_array.cpp
+ * Output: \verbinclude Cwise_scalar_power_array.out
+ *
+ * \sa ArrayBase::pow()
+ *
+ * \relates ArrayBase
+ */
+#ifdef EIGEN_PARSED_BY_DOXYGEN
+template <typename Scalar, typename Derived>
+inline const CwiseBinaryOp<internal::scalar_pow_op<Scalar, Derived::Scalar>, Constant<Scalar>, Derived> pow(
+    const Scalar& x, const Eigen::ArrayBase<Derived>& x);
+#else
+template <typename Scalar, typename Derived>
+EIGEN_DEVICE_FUNC inline const EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(
+    typename internal::promote_scalar_arg<typename Derived::Scalar EIGEN_COMMA Scalar EIGEN_COMMA
+                                              EIGEN_SCALAR_BINARY_SUPPORTED(pow, Scalar,
+                                                                            typename Derived::Scalar)>::type,
+    Derived, pow) pow(const Scalar& x, const Eigen::ArrayBase<Derived>& exponents) {
+  typedef
+      typename internal::promote_scalar_arg<typename Derived::Scalar, Scalar,
+                                            EIGEN_SCALAR_BINARY_SUPPORTED(pow, Scalar, typename Derived::Scalar)>::type
+          PromotedScalar;
+  return EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(PromotedScalar, Derived, pow)(
+      typename internal::plain_constant_type<Derived, PromotedScalar>::type(
+          exponents.derived().rows(), exponents.derived().cols(), internal::scalar_constant_op<PromotedScalar>(x)),
+      exponents.derived());
+}
+#endif
 
-#endif // EIGEN_GLOBAL_FUNCTIONS_H
+/** \returns an expression of the coefficient-wise atan2(\a x, \a y). \a x and \a y must be of the same type.
+ *
+ * This function computes the coefficient-wise atan2().
+ *
+ * \sa ArrayBase::atan2()
+ *
+ * \relates ArrayBase
+ */
+template <typename LhsDerived, typename RhsDerived>
+inline const std::enable_if_t<
+    std::is_same<typename LhsDerived::Scalar, typename RhsDerived::Scalar>::value,
+    Eigen::CwiseBinaryOp<Eigen::internal::scalar_atan2_op<typename LhsDerived::Scalar, typename RhsDerived::Scalar>,
+                         const LhsDerived, const RhsDerived> >
+atan2(const Eigen::ArrayBase<LhsDerived>& x, const Eigen::ArrayBase<RhsDerived>& exponents) {
+  return Eigen::CwiseBinaryOp<
+      Eigen::internal::scalar_atan2_op<typename LhsDerived::Scalar, typename RhsDerived::Scalar>, const LhsDerived,
+      const RhsDerived>(x.derived(), exponents.derived());
+}
+
+namespace internal {
+EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(real, scalar_real_op)
+EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(imag, scalar_imag_op)
+EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(abs2, scalar_abs2_op)
+}  // namespace internal
+}  // namespace Eigen
+
+// TODO: cleanly disable those functions that are not supported on Array (numext::real_ref, internal::random,
+// internal::isApprox...)
+
+#endif  // EIGEN_GLOBAL_FUNCTIONS_H
diff --git a/Eigen/src/Core/IO.h b/Eigen/src/Core/IO.h
index 454cbc3..ca5f247 100644
--- a/Eigen/src/Core/IO.h
+++ b/Eigen/src/Core/IO.h
@@ -14,60 +14,62 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 enum { DontAlignCols = 1 };
-enum { StreamPrecision = -1,
-       FullPrecision = -2 };
+enum { StreamPrecision = -1, FullPrecision = -2 };
 
 namespace internal {
-template<typename Derived>
-std::ostream & print_matrix(std::ostream & s, const Derived& _m, const IOFormat& fmt);
+template <typename Derived>
+std::ostream& print_matrix(std::ostream& s, const Derived& _m, const IOFormat& fmt);
 }
 
 /** \class IOFormat
-  * \ingroup Core_Module
-  *
-  * \brief Stores a set of parameters controlling the way matrices are printed
-  *
-  * List of available parameters:
-  *  - \b precision number of digits for floating point values, or one of the special constants \c StreamPrecision and \c FullPrecision.
-  *                 The default is the special value \c StreamPrecision which means to use the
-  *                 stream's own precision setting, as set for instance using \c cout.precision(3). The other special value
-  *                 \c FullPrecision means that the number of digits will be computed to match the full precision of each floating-point
-  *                 type.
-  *  - \b flags an OR-ed combination of flags, the default value is 0, the only currently available flag is \c DontAlignCols which
-  *             allows to disable the alignment of columns, resulting in faster code.
-  *  - \b coeffSeparator string printed between two coefficients of the same row
-  *  - \b rowSeparator string printed between two rows
-  *  - \b rowPrefix string printed at the beginning of each row
-  *  - \b rowSuffix string printed at the end of each row
-  *  - \b matPrefix string printed at the beginning of the matrix
-  *  - \b matSuffix string printed at the end of the matrix
-  *  - \b fill character printed to fill the empty space in aligned columns
-  *
-  * Example: \include IOFormat.cpp
-  * Output: \verbinclude IOFormat.out
-  *
-  * \sa DenseBase::format(), class WithFormat
-  */
-struct IOFormat
-{
+ * \ingroup Core_Module
+ *
+ * \brief Stores a set of parameters controlling the way matrices are printed
+ *
+ * List of available parameters:
+ *  - \b precision number of digits for floating point values, or one of the special constants \c StreamPrecision and \c
+ * FullPrecision. The default is the special value \c StreamPrecision which means to use the stream's own precision
+ * setting, as set for instance using \c cout.precision(3). The other special value \c FullPrecision means that the
+ * number of digits will be computed to match the full precision of each floating-point type.
+ *  - \b flags an OR-ed combination of flags, the default value is 0, the only currently available flag is \c
+ * DontAlignCols which allows to disable the alignment of columns, resulting in faster code.
+ *  - \b coeffSeparator string printed between two coefficients of the same row
+ *  - \b rowSeparator string printed between two rows
+ *  - \b rowPrefix string printed at the beginning of each row
+ *  - \b rowSuffix string printed at the end of each row
+ *  - \b matPrefix string printed at the beginning of the matrix
+ *  - \b matSuffix string printed at the end of the matrix
+ *  - \b fill character printed to fill the empty space in aligned columns
+ *
+ * Example: \include IOFormat.cpp
+ * Output: \verbinclude IOFormat.out
+ *
+ * \sa DenseBase::format(), class WithFormat
+ */
+struct IOFormat {
   /** Default constructor, see class IOFormat for the meaning of the parameters */
-  IOFormat(int _precision = StreamPrecision, int _flags = 0,
-    const std::string& _coeffSeparator = " ",
-    const std::string& _rowSeparator = "\n", const std::string& _rowPrefix="", const std::string& _rowSuffix="",
-    const std::string& _matPrefix="", const std::string& _matSuffix="", const char _fill=' ')
-  : matPrefix(_matPrefix), matSuffix(_matSuffix), rowPrefix(_rowPrefix), rowSuffix(_rowSuffix), rowSeparator(_rowSeparator),
-    rowSpacer(""), coeffSeparator(_coeffSeparator), fill(_fill), precision(_precision), flags(_flags)
-  {
+  IOFormat(int _precision = StreamPrecision, int _flags = 0, const std::string& _coeffSeparator = " ",
+           const std::string& _rowSeparator = "\n", const std::string& _rowPrefix = "",
+           const std::string& _rowSuffix = "", const std::string& _matPrefix = "", const std::string& _matSuffix = "",
+           const char _fill = ' ')
+      : matPrefix(_matPrefix),
+        matSuffix(_matSuffix),
+        rowPrefix(_rowPrefix),
+        rowSuffix(_rowSuffix),
+        rowSeparator(_rowSeparator),
+        rowSpacer(""),
+        coeffSeparator(_coeffSeparator),
+        fill(_fill),
+        precision(_precision),
+        flags(_flags) {
     // TODO check if rowPrefix, rowSuffix or rowSeparator contains a newline
     // don't add rowSpacer if columns are not to be aligned
-    if((flags & DontAlignCols))
-      return;
-    int i = int(matSuffix.length())-1;
-    while (i>=0 && matSuffix[i]!='\n')
-    {
+    if ((flags & DontAlignCols)) return;
+    int i = int(matSuffix.length()) - 1;
+    while (i >= 0 && matSuffix[i] != '\n') {
       rowSpacer += ' ';
       i--;
     }
@@ -81,37 +83,32 @@
 };
 
 /** \class WithFormat
-  * \ingroup Core_Module
-  *
-  * \brief Pseudo expression providing matrix output with given format
-  *
-  * \tparam ExpressionType the type of the object on which IO stream operations are performed
-  *
-  * This class represents an expression with stream operators controlled by a given IOFormat.
-  * It is the return type of DenseBase::format()
-  * and most of the time this is the only way it is used.
-  *
-  * See class IOFormat for some examples.
-  *
-  * \sa DenseBase::format(), class IOFormat
-  */
-template<typename ExpressionType>
-class WithFormat
-{
-  public:
+ * \ingroup Core_Module
+ *
+ * \brief Pseudo expression providing matrix output with given format
+ *
+ * \tparam ExpressionType the type of the object on which IO stream operations are performed
+ *
+ * This class represents an expression with stream operators controlled by a given IOFormat.
+ * It is the return type of DenseBase::format()
+ * and most of the time this is the only way it is used.
+ *
+ * See class IOFormat for some examples.
+ *
+ * \sa DenseBase::format(), class IOFormat
+ */
+template <typename ExpressionType>
+class WithFormat {
+ public:
+  WithFormat(const ExpressionType& matrix, const IOFormat& format) : m_matrix(matrix), m_format(format) {}
 
-    WithFormat(const ExpressionType& matrix, const IOFormat& format)
-      : m_matrix(matrix), m_format(format)
-    {}
+  friend std::ostream& operator<<(std::ostream& s, const WithFormat& wf) {
+    return internal::print_matrix(s, wf.m_matrix.eval(), wf.m_format);
+  }
 
-    friend std::ostream & operator << (std::ostream & s, const WithFormat& wf)
-    {
-      return internal::print_matrix(s, wf.m_matrix.eval(), wf.m_format);
-    }
-
-  protected:
-    typename ExpressionType::Nested m_matrix;
-    IOFormat m_format;
+ protected:
+  typename ExpressionType::Nested m_matrix;
+  IOFormat m_format;
 };
 
 namespace internal {
@@ -119,138 +116,110 @@
 // NOTE: This helper is kept for backward compatibility with previous code specializing
 //       this internal::significant_decimals_impl structure. In the future we should directly
 //       call max_digits10().
-template<typename Scalar>
-struct significant_decimals_impl
-{
-  static inline int run()
-  {
-    return NumTraits<Scalar>::max_digits10();
-  }
+template <typename Scalar>
+struct significant_decimals_impl {
+  static inline int run() { return NumTraits<Scalar>::max_digits10(); }
 };
 
 /** \internal
-  * print the matrix \a _m to the output stream \a s using the output format \a fmt */
-template<typename Derived>
-std::ostream & print_matrix(std::ostream & s, const Derived& _m, const IOFormat& fmt)
-{
+ * print the matrix \a _m to the output stream \a s using the output format \a fmt */
+template <typename Derived>
+std::ostream& print_matrix(std::ostream& s, const Derived& _m, const IOFormat& fmt) {
   using internal::is_same;
 
-  if(_m.size() == 0)
-  {
+  if (_m.size() == 0) {
     s << fmt.matPrefix << fmt.matSuffix;
     return s;
   }
-  
+
   typename Derived::Nested m = _m;
   typedef typename Derived::Scalar Scalar;
-  typedef std::conditional_t<
-          is_same<Scalar, char>::value ||
-            is_same<Scalar, unsigned char>::value ||
-            is_same<Scalar, numext::int8_t>::value ||
-            is_same<Scalar, numext::uint8_t>::value,
-          int,
-          std::conditional_t<
-              is_same<Scalar, std::complex<char> >::value ||
-                is_same<Scalar, std::complex<unsigned char> >::value ||
-                is_same<Scalar, std::complex<numext::int8_t> >::value ||
-                is_same<Scalar, std::complex<numext::uint8_t> >::value,
-              std::complex<int>,
-              const Scalar&
-            >
-        > PrintType;
+  typedef std::conditional_t<is_same<Scalar, char>::value || is_same<Scalar, unsigned char>::value ||
+                                 is_same<Scalar, numext::int8_t>::value || is_same<Scalar, numext::uint8_t>::value,
+                             int,
+                             std::conditional_t<is_same<Scalar, std::complex<char> >::value ||
+                                                    is_same<Scalar, std::complex<unsigned char> >::value ||
+                                                    is_same<Scalar, std::complex<numext::int8_t> >::value ||
+                                                    is_same<Scalar, std::complex<numext::uint8_t> >::value,
+                                                std::complex<int>, const Scalar&> >
+      PrintType;
 
   Index width = 0;
 
   std::streamsize explicit_precision;
-  if(fmt.precision == StreamPrecision)
-  {
+  if (fmt.precision == StreamPrecision) {
     explicit_precision = 0;
-  }
-  else if(fmt.precision == FullPrecision)
-  {
-    if (NumTraits<Scalar>::IsInteger)
-    {
+  } else if (fmt.precision == FullPrecision) {
+    if (NumTraits<Scalar>::IsInteger) {
       explicit_precision = 0;
-    }
-    else
-    {
+    } else {
       explicit_precision = significant_decimals_impl<Scalar>::run();
     }
-  }
-  else
-  {
+  } else {
     explicit_precision = fmt.precision;
   }
 
   std::streamsize old_precision = 0;
-  if(explicit_precision) old_precision = s.precision(explicit_precision);
+  if (explicit_precision) old_precision = s.precision(explicit_precision);
 
   bool align_cols = !(fmt.flags & DontAlignCols);
-  if(align_cols)
-  {
+  if (align_cols) {
     // compute the largest width
-    for(Index j = 0; j < m.cols(); ++j)
-      for(Index i = 0; i < m.rows(); ++i)
-      {
+    for (Index j = 0; j < m.cols(); ++j)
+      for (Index i = 0; i < m.rows(); ++i) {
         std::stringstream sstr;
         sstr.copyfmt(s);
-        sstr << static_cast<PrintType>(m.coeff(i,j));
+        sstr << static_cast<PrintType>(m.coeff(i, j));
         width = std::max<Index>(width, Index(sstr.str().length()));
       }
   }
   std::streamsize old_width = s.width();
   char old_fill_character = s.fill();
   s << fmt.matPrefix;
-  for(Index i = 0; i < m.rows(); ++i)
-  {
-    if (i)
-      s << fmt.rowSpacer;
+  for (Index i = 0; i < m.rows(); ++i) {
+    if (i) s << fmt.rowSpacer;
     s << fmt.rowPrefix;
-    if(width) {
+    if (width) {
       s.fill(fmt.fill);
       s.width(width);
     }
     s << static_cast<PrintType>(m.coeff(i, 0));
-    for(Index j = 1; j < m.cols(); ++j)
-    {
+    for (Index j = 1; j < m.cols(); ++j) {
       s << fmt.coeffSeparator;
-      if(width) {
+      if (width) {
         s.fill(fmt.fill);
         s.width(width);
       }
       s << static_cast<PrintType>(m.coeff(i, j));
     }
     s << fmt.rowSuffix;
-    if( i < m.rows() - 1)
-      s << fmt.rowSeparator;
+    if (i < m.rows() - 1) s << fmt.rowSeparator;
   }
   s << fmt.matSuffix;
-  if(explicit_precision) s.precision(old_precision);
-  if(width) {
+  if (explicit_precision) s.precision(old_precision);
+  if (width) {
     s.fill(old_fill_character);
     s.width(old_width);
   }
   return s;
 }
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \relates DenseBase
-  *
-  * Outputs the matrix, to the given stream.
-  *
-  * If you wish to print the matrix with a format different than the default, use DenseBase::format().
-  *
-  * It is also possible to change the default format by defining EIGEN_DEFAULT_IO_FORMAT before including Eigen headers.
-  * If not defined, this will automatically be defined to Eigen::IOFormat(), that is the Eigen::IOFormat with default parameters.
-  *
-  * \sa DenseBase::format()
-  */
-template<typename Derived>
-std::ostream & operator <<
-(std::ostream & s,
- const DenseBase<Derived> & m)
-{
+ *
+ * Outputs the matrix, to the given stream.
+ *
+ * If you wish to print the matrix with a format different than the default, use DenseBase::format().
+ *
+ * It is also possible to change the default format by defining EIGEN_DEFAULT_IO_FORMAT before including Eigen headers.
+ * If not defined, this will automatically be defined to Eigen::IOFormat(), that is the Eigen::IOFormat with default
+ * parameters.
+ *
+ * \sa DenseBase::format()
+ */
+template <typename Derived>
+std::ostream& operator<<(std::ostream& s, const DenseBase<Derived>& m) {
   return internal::print_matrix(s, m.eval(), EIGEN_DEFAULT_IO_FORMAT);
 }
 
@@ -259,6 +228,6 @@
   return internal::print_matrix(s, m.derived(), EIGEN_DEFAULT_IO_FORMAT);
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_IO_H
+#endif  // EIGEN_IO_H
diff --git a/Eigen/src/Core/IndexedView.h b/Eigen/src/Core/IndexedView.h
index 4898e51..0a02417 100644
--- a/Eigen/src/Core/IndexedView.h
+++ b/Eigen/src/Core/IndexedView.h
@@ -17,20 +17,18 @@
 
 namespace internal {
 
-template<typename XprType, typename RowIndices, typename ColIndices>
-struct traits<IndexedView<XprType, RowIndices, ColIndices> >
- : traits<XprType>
-{
+template <typename XprType, typename RowIndices, typename ColIndices>
+struct traits<IndexedView<XprType, RowIndices, ColIndices>> : traits<XprType> {
   enum {
     RowsAtCompileTime = int(array_size<RowIndices>::value),
     ColsAtCompileTime = int(array_size<ColIndices>::value),
     MaxRowsAtCompileTime = RowsAtCompileTime,
     MaxColsAtCompileTime = ColsAtCompileTime,
 
-    XprTypeIsRowMajor = (int(traits<XprType>::Flags)&RowMajorBit) != 0,
-    IsRowMajor = (MaxRowsAtCompileTime==1&&MaxColsAtCompileTime!=1) ? 1
-               : (MaxColsAtCompileTime==1&&MaxRowsAtCompileTime!=1) ? 0
-               : XprTypeIsRowMajor,
+    XprTypeIsRowMajor = (int(traits<XprType>::Flags) & RowMajorBit) != 0,
+    IsRowMajor = (MaxRowsAtCompileTime == 1 && MaxColsAtCompileTime != 1)   ? 1
+                 : (MaxColsAtCompileTime == 1 && MaxRowsAtCompileTime != 1) ? 0
+                                                                            : XprTypeIsRowMajor,
 
     RowIncr = int(get_compile_time_incr<RowIndices>::value),
     ColIncr = int(get_compile_time_incr<ColIndices>::value),
@@ -38,90 +36,104 @@
     OuterIncr = IsRowMajor ? RowIncr : ColIncr,
 
     HasSameStorageOrderAsXprType = (IsRowMajor == XprTypeIsRowMajor),
-    XprInnerStride = HasSameStorageOrderAsXprType ? int(inner_stride_at_compile_time<XprType>::ret) : int(outer_stride_at_compile_time<XprType>::ret),
-    XprOuterstride = HasSameStorageOrderAsXprType ? int(outer_stride_at_compile_time<XprType>::ret) : int(inner_stride_at_compile_time<XprType>::ret),
+    XprInnerStride = HasSameStorageOrderAsXprType ? int(inner_stride_at_compile_time<XprType>::ret)
+                                                  : int(outer_stride_at_compile_time<XprType>::ret),
+    XprOuterstride = HasSameStorageOrderAsXprType ? int(outer_stride_at_compile_time<XprType>::ret)
+                                                  : int(inner_stride_at_compile_time<XprType>::ret),
 
     InnerSize = XprTypeIsRowMajor ? ColsAtCompileTime : RowsAtCompileTime,
-    IsBlockAlike = InnerIncr==1 && OuterIncr==1,
-    IsInnerPannel = HasSameStorageOrderAsXprType && is_same<AllRange<InnerSize>,std::conditional_t<XprTypeIsRowMajor,ColIndices,RowIndices>>::value,
+    IsBlockAlike = InnerIncr == 1 && OuterIncr == 1,
+    IsInnerPannel = HasSameStorageOrderAsXprType &&
+                    is_same<AllRange<InnerSize>, std::conditional_t<XprTypeIsRowMajor, ColIndices, RowIndices>>::value,
 
-    InnerStrideAtCompileTime = InnerIncr<0 || InnerIncr==DynamicIndex || XprInnerStride==Dynamic || InnerIncr==UndefinedIncr ? Dynamic : XprInnerStride * InnerIncr,
-    OuterStrideAtCompileTime = OuterIncr<0 || OuterIncr==DynamicIndex || XprOuterstride==Dynamic || OuterIncr==UndefinedIncr ? Dynamic : XprOuterstride * OuterIncr,
+    InnerStrideAtCompileTime =
+        InnerIncr < 0 || InnerIncr == DynamicIndex || XprInnerStride == Dynamic || InnerIncr == UndefinedIncr
+            ? Dynamic
+            : XprInnerStride * InnerIncr,
+    OuterStrideAtCompileTime =
+        OuterIncr < 0 || OuterIncr == DynamicIndex || XprOuterstride == Dynamic || OuterIncr == UndefinedIncr
+            ? Dynamic
+            : XprOuterstride * OuterIncr,
 
-    ReturnAsScalar = is_same<RowIndices,SingleRange>::value && is_same<ColIndices,SingleRange>::value,
+    ReturnAsScalar = is_same<RowIndices, SingleRange>::value && is_same<ColIndices, SingleRange>::value,
     ReturnAsBlock = (!ReturnAsScalar) && IsBlockAlike,
     ReturnAsIndexedView = (!ReturnAsScalar) && (!ReturnAsBlock),
 
     // FIXME we deal with compile-time strides if and only if we have DirectAccessBit flag,
     // but this is too strict regarding negative strides...
-    DirectAccessMask = (int(InnerIncr)!=UndefinedIncr && int(OuterIncr)!=UndefinedIncr && InnerIncr>=0 && OuterIncr>=0) ? DirectAccessBit : 0,
+    DirectAccessMask =
+        (int(InnerIncr) != UndefinedIncr && int(OuterIncr) != UndefinedIncr && InnerIncr >= 0 && OuterIncr >= 0)
+            ? DirectAccessBit
+            : 0,
     FlagsRowMajorBit = IsRowMajor ? RowMajorBit : 0,
     FlagsLvalueBit = is_lvalue<XprType>::value ? LvalueBit : 0,
     FlagsLinearAccessBit = (RowsAtCompileTime == 1 || ColsAtCompileTime == 1) ? LinearAccessBit : 0,
-    Flags = (traits<XprType>::Flags & (HereditaryBits | DirectAccessMask )) | FlagsLvalueBit | FlagsRowMajorBit | FlagsLinearAccessBit
+    Flags = (traits<XprType>::Flags & (HereditaryBits | DirectAccessMask)) | FlagsLvalueBit | FlagsRowMajorBit |
+            FlagsLinearAccessBit
   };
 
-  typedef Block<XprType,RowsAtCompileTime,ColsAtCompileTime,IsInnerPannel> BlockType;
+  typedef Block<XprType, RowsAtCompileTime, ColsAtCompileTime, IsInnerPannel> BlockType;
 };
 
-}
+}  // namespace internal
 
-template<typename XprType, typename RowIndices, typename ColIndices, typename StorageKind>
+template <typename XprType, typename RowIndices, typename ColIndices, typename StorageKind>
 class IndexedViewImpl;
 
-
 /** \class IndexedView
-  * \ingroup Core_Module
-  *
-  * \brief Expression of a non-sequential sub-matrix defined by arbitrary sequences of row and column indices
-  *
-  * \tparam XprType the type of the expression in which we are taking the intersections of sub-rows and sub-columns
-  * \tparam RowIndices the type of the object defining the sequence of row indices
-  * \tparam ColIndices the type of the object defining the sequence of column indices
-  *
-  * This class represents an expression of a sub-matrix (or sub-vector) defined as the intersection
-  * of sub-sets of rows and columns, that are themself defined by generic sequences of row indices \f$ \{r_0,r_1,..r_{m-1}\} \f$
-  * and column indices \f$ \{c_0,c_1,..c_{n-1} \}\f$. Let \f$ A \f$  be the nested matrix, then the resulting matrix \f$ B \f$ has \c m
-  * rows and \c n columns, and its entries are given by: \f$ B(i,j) = A(r_i,c_j) \f$.
-  *
-  * The \c RowIndices and \c ColIndices types must be compatible with the following API:
-  * \code
-  * <integral type> operator[](Index) const;
-  * Index size() const;
-  * \endcode
-  *
-  * Typical supported types thus include:
-  *  - std::vector<int>
-  *  - std::valarray<int>
-  *  - std::array<int>
-  *  - Eigen::ArrayXi
-  *  - decltype(ArrayXi::LinSpaced(...))
-  *  - Any view/expressions of the previous types
-  *  - Eigen::ArithmeticSequence
-  *  - Eigen::internal::AllRange     (helper for Eigen::placeholders::all)
-  *  - Eigen::internal::SingleRange  (helper for single index)
-  *  - etc.
-  *
-  * In typical usages of %Eigen, this class should never be used directly. It is the return type of
-  * DenseBase::operator()(const RowIndices&, const ColIndices&).
-  *
-  * \sa class Block
-  */
-template<typename XprType, typename RowIndices, typename ColIndices>
-class IndexedView : public IndexedViewImpl<XprType, RowIndices, ColIndices, typename internal::traits<XprType>::StorageKind>
-{
-public:
-  typedef typename IndexedViewImpl<XprType, RowIndices, ColIndices, typename internal::traits<XprType>::StorageKind>::Base Base;
+ * \ingroup Core_Module
+ *
+ * \brief Expression of a non-sequential sub-matrix defined by arbitrary sequences of row and column indices
+ *
+ * \tparam XprType the type of the expression in which we are taking the intersections of sub-rows and sub-columns
+ * \tparam RowIndices the type of the object defining the sequence of row indices
+ * \tparam ColIndices the type of the object defining the sequence of column indices
+ *
+ * This class represents an expression of a sub-matrix (or sub-vector) defined as the intersection
+ * of sub-sets of rows and columns, that are themself defined by generic sequences of row indices \f$
+ * \{r_0,r_1,..r_{m-1}\} \f$ and column indices \f$ \{c_0,c_1,..c_{n-1} \}\f$. Let \f$ A \f$  be the nested matrix, then
+ * the resulting matrix \f$ B \f$ has \c m rows and \c n columns, and its entries are given by: \f$ B(i,j) = A(r_i,c_j)
+ * \f$.
+ *
+ * The \c RowIndices and \c ColIndices types must be compatible with the following API:
+ * \code
+ * <integral type> operator[](Index) const;
+ * Index size() const;
+ * \endcode
+ *
+ * Typical supported types thus include:
+ *  - std::vector<int>
+ *  - std::valarray<int>
+ *  - std::array<int>
+ *  - Eigen::ArrayXi
+ *  - decltype(ArrayXi::LinSpaced(...))
+ *  - Any view/expressions of the previous types
+ *  - Eigen::ArithmeticSequence
+ *  - Eigen::internal::AllRange     (helper for Eigen::placeholders::all)
+ *  - Eigen::internal::SingleRange  (helper for single index)
+ *  - etc.
+ *
+ * In typical usages of %Eigen, this class should never be used directly. It is the return type of
+ * DenseBase::operator()(const RowIndices&, const ColIndices&).
+ *
+ * \sa class Block
+ */
+template <typename XprType, typename RowIndices, typename ColIndices>
+class IndexedView
+    : public IndexedViewImpl<XprType, RowIndices, ColIndices, typename internal::traits<XprType>::StorageKind> {
+ public:
+  typedef
+      typename IndexedViewImpl<XprType, RowIndices, ColIndices, typename internal::traits<XprType>::StorageKind>::Base
+          Base;
   EIGEN_GENERIC_PUBLIC_INTERFACE(IndexedView)
   EIGEN_INHERIT_ASSIGNMENT_OPERATORS(IndexedView)
 
   typedef typename internal::ref_selector<XprType>::non_const_type MatrixTypeNested;
   typedef internal::remove_all_t<XprType> NestedExpression;
 
-  template<typename T0, typename T1>
+  template <typename T0, typename T1>
   IndexedView(XprType& xpr, const T0& rowIndices, const T1& colIndices)
-    : m_xpr(xpr), m_rowIndices(rowIndices), m_colIndices(colIndices)
-  {}
+      : m_xpr(xpr), m_rowIndices(rowIndices), m_colIndices(colIndices) {}
 
   /** \returns number of rows */
   Index rows() const { return internal::index_list_size(m_rowIndices); }
@@ -130,12 +142,10 @@
   Index cols() const { return internal::index_list_size(m_colIndices); }
 
   /** \returns the nested expression */
-  const internal::remove_all_t<XprType>&
-  nestedExpression() const { return m_xpr; }
+  const internal::remove_all_t<XprType>& nestedExpression() const { return m_xpr; }
 
   /** \returns the nested expression */
-  std::remove_reference_t<XprType>&
-  nestedExpression() { return m_xpr; }
+  std::remove_reference_t<XprType>& nestedExpression() { return m_xpr; }
 
   /** \returns a const reference to the object storing/generating the row indices */
   const RowIndices& rowIndices() const { return m_rowIndices; }
@@ -143,107 +153,91 @@
   /** \returns a const reference to the object storing/generating the column indices */
   const ColIndices& colIndices() const { return m_colIndices; }
 
-protected:
+ protected:
   MatrixTypeNested m_xpr;
   RowIndices m_rowIndices;
   ColIndices m_colIndices;
 };
 
-
 // Generic API dispatcher
-template<typename XprType, typename RowIndices, typename ColIndices, typename StorageKind>
-class IndexedViewImpl
-  : public internal::generic_xpr_base<IndexedView<XprType, RowIndices, ColIndices> >::type
-{
-public:
-  typedef typename internal::generic_xpr_base<IndexedView<XprType, RowIndices, ColIndices> >::type Base;
+template <typename XprType, typename RowIndices, typename ColIndices, typename StorageKind>
+class IndexedViewImpl : public internal::generic_xpr_base<IndexedView<XprType, RowIndices, ColIndices>>::type {
+ public:
+  typedef typename internal::generic_xpr_base<IndexedView<XprType, RowIndices, ColIndices>>::type Base;
 };
 
 namespace internal {
 
-
-template<typename ArgType, typename RowIndices, typename ColIndices>
+template <typename ArgType, typename RowIndices, typename ColIndices>
 struct unary_evaluator<IndexedView<ArgType, RowIndices, ColIndices>, IndexBased>
-  : evaluator_base<IndexedView<ArgType, RowIndices, ColIndices> >
-{
+    : evaluator_base<IndexedView<ArgType, RowIndices, ColIndices>> {
   typedef IndexedView<ArgType, RowIndices, ColIndices> XprType;
 
   enum {
     CoeffReadCost = evaluator<ArgType>::CoeffReadCost /* TODO + cost of row/col index */,
 
-    FlagsLinearAccessBit = (traits<XprType>::RowsAtCompileTime == 1 || traits<XprType>::ColsAtCompileTime == 1) ? LinearAccessBit : 0,
+    FlagsLinearAccessBit =
+        (traits<XprType>::RowsAtCompileTime == 1 || traits<XprType>::ColsAtCompileTime == 1) ? LinearAccessBit : 0,
 
-    FlagsRowMajorBit = traits<XprType>::FlagsRowMajorBit, 
+    FlagsRowMajorBit = traits<XprType>::FlagsRowMajorBit,
 
-    Flags = (evaluator<ArgType>::Flags & (HereditaryBits & ~RowMajorBit /*| LinearAccessBit | DirectAccessBit*/)) | FlagsLinearAccessBit | FlagsRowMajorBit,
+    Flags = (evaluator<ArgType>::Flags & (HereditaryBits & ~RowMajorBit /*| LinearAccessBit | DirectAccessBit*/)) |
+            FlagsLinearAccessBit | FlagsRowMajorBit,
 
     Alignment = 0
   };
 
-  EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& xpr) : m_argImpl(xpr.nestedExpression()), m_xpr(xpr)
-  {
+  EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& xpr) : m_argImpl(xpr.nestedExpression()), m_xpr(xpr) {
     EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
   }
 
   typedef typename XprType::Scalar Scalar;
   typedef typename XprType::CoeffReturnType CoeffReturnType;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeff(Index row, Index col) const
-  {
-    eigen_assert(m_xpr.rowIndices()[row] >= 0 && m_xpr.rowIndices()[row] < m_xpr.nestedExpression().rows()
-                 && m_xpr.colIndices()[col] >= 0 && m_xpr.colIndices()[col] < m_xpr.nestedExpression().cols());
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const {
+    eigen_assert(m_xpr.rowIndices()[row] >= 0 && m_xpr.rowIndices()[row] < m_xpr.nestedExpression().rows() &&
+                 m_xpr.colIndices()[col] >= 0 && m_xpr.colIndices()[col] < m_xpr.nestedExpression().cols());
     return m_argImpl.coeff(m_xpr.rowIndices()[row], m_xpr.colIndices()[col]);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Scalar& coeffRef(Index row, Index col)
-  {
-    eigen_assert(m_xpr.rowIndices()[row] >= 0 && m_xpr.rowIndices()[row] < m_xpr.nestedExpression().rows()
-                 && m_xpr.colIndices()[col] >= 0 && m_xpr.colIndices()[col] < m_xpr.nestedExpression().cols());
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index row, Index col) {
+    eigen_assert(m_xpr.rowIndices()[row] >= 0 && m_xpr.rowIndices()[row] < m_xpr.nestedExpression().rows() &&
+                 m_xpr.colIndices()[col] >= 0 && m_xpr.colIndices()[col] < m_xpr.nestedExpression().cols());
     return m_argImpl.coeffRef(m_xpr.rowIndices()[row], m_xpr.colIndices()[col]);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Scalar& coeffRef(Index index)
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index index) {
     EIGEN_STATIC_ASSERT_LVALUE(XprType)
     Index row = XprType::RowsAtCompileTime == 1 ? 0 : index;
     Index col = XprType::RowsAtCompileTime == 1 ? index : 0;
-    eigen_assert(m_xpr.rowIndices()[row] >= 0 && m_xpr.rowIndices()[row] < m_xpr.nestedExpression().rows()
-                 && m_xpr.colIndices()[col] >= 0 && m_xpr.colIndices()[col] < m_xpr.nestedExpression().cols());
-    return m_argImpl.coeffRef( m_xpr.rowIndices()[row], m_xpr.colIndices()[col]);
+    eigen_assert(m_xpr.rowIndices()[row] >= 0 && m_xpr.rowIndices()[row] < m_xpr.nestedExpression().rows() &&
+                 m_xpr.colIndices()[col] >= 0 && m_xpr.colIndices()[col] < m_xpr.nestedExpression().cols());
+    return m_argImpl.coeffRef(m_xpr.rowIndices()[row], m_xpr.colIndices()[col]);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  const Scalar& coeffRef(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& coeffRef(Index index) const {
     Index row = XprType::RowsAtCompileTime == 1 ? 0 : index;
     Index col = XprType::RowsAtCompileTime == 1 ? index : 0;
-    eigen_assert(m_xpr.rowIndices()[row] >= 0 && m_xpr.rowIndices()[row] < m_xpr.nestedExpression().rows()
-                 && m_xpr.colIndices()[col] >= 0 && m_xpr.colIndices()[col] < m_xpr.nestedExpression().cols());
-    return m_argImpl.coeffRef( m_xpr.rowIndices()[row], m_xpr.colIndices()[col]);
+    eigen_assert(m_xpr.rowIndices()[row] >= 0 && m_xpr.rowIndices()[row] < m_xpr.nestedExpression().rows() &&
+                 m_xpr.colIndices()[col] >= 0 && m_xpr.colIndices()[col] < m_xpr.nestedExpression().cols());
+    return m_argImpl.coeffRef(m_xpr.rowIndices()[row], m_xpr.colIndices()[col]);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  const CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CoeffReturnType coeff(Index index) const {
     Index row = XprType::RowsAtCompileTime == 1 ? 0 : index;
     Index col = XprType::RowsAtCompileTime == 1 ? index : 0;
-    eigen_assert(m_xpr.rowIndices()[row] >= 0 && m_xpr.rowIndices()[row] < m_xpr.nestedExpression().rows()
-                 && m_xpr.colIndices()[col] >= 0 && m_xpr.colIndices()[col] < m_xpr.nestedExpression().cols());
-    return m_argImpl.coeff( m_xpr.rowIndices()[row], m_xpr.colIndices()[col]);
+    eigen_assert(m_xpr.rowIndices()[row] >= 0 && m_xpr.rowIndices()[row] < m_xpr.nestedExpression().rows() &&
+                 m_xpr.colIndices()[col] >= 0 && m_xpr.colIndices()[col] < m_xpr.nestedExpression().cols());
+    return m_argImpl.coeff(m_xpr.rowIndices()[row], m_xpr.colIndices()[col]);
   }
 
-protected:
-
+ protected:
   evaluator<ArgType> m_argImpl;
   const XprType& m_xpr;
-
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_INDEXED_VIEW_H
+#endif  // EIGEN_INDEXED_VIEW_H
diff --git a/Eigen/src/Core/Inverse.h b/Eigen/src/Core/Inverse.h
index 54f257e..cfb3b20 100644
--- a/Eigen/src/Core/Inverse.h
+++ b/Eigen/src/Core/Inverse.h
@@ -15,67 +15,59 @@
 
 namespace Eigen {
 
-template<typename XprType,typename StorageKind> class InverseImpl;
+template <typename XprType, typename StorageKind>
+class InverseImpl;
 
 namespace internal {
 
-template<typename XprType>
-struct traits<Inverse<XprType> >
-  : traits<typename XprType::PlainObject>
-{
+template <typename XprType>
+struct traits<Inverse<XprType> > : traits<typename XprType::PlainObject> {
   typedef typename XprType::PlainObject PlainObject;
   typedef traits<PlainObject> BaseTraits;
-  enum {
-    Flags = BaseTraits::Flags & RowMajorBit
-  };
+  enum { Flags = BaseTraits::Flags & RowMajorBit };
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \class Inverse
-  *
-  * \brief Expression of the inverse of another expression
-  *
-  * \tparam XprType the type of the expression we are taking the inverse
-  *
-  * This class represents an abstract expression of A.inverse()
-  * and most of the time this is the only way it is used.
-  *
-  */
-template<typename XprType>
-class Inverse : public InverseImpl<XprType,typename internal::traits<XprType>::StorageKind>
-{
-public:
+ *
+ * \brief Expression of the inverse of another expression
+ *
+ * \tparam XprType the type of the expression we are taking the inverse
+ *
+ * This class represents an abstract expression of A.inverse()
+ * and most of the time this is the only way it is used.
+ *
+ */
+template <typename XprType>
+class Inverse : public InverseImpl<XprType, typename internal::traits<XprType>::StorageKind> {
+ public:
   typedef typename XprType::StorageIndex StorageIndex;
-  typedef typename XprType::Scalar                            Scalar;
-  typedef typename internal::ref_selector<XprType>::type      XprTypeNested;
-  typedef internal::remove_all_t<XprTypeNested>  XprTypeNestedCleaned;
+  typedef typename XprType::Scalar Scalar;
+  typedef typename internal::ref_selector<XprType>::type XprTypeNested;
+  typedef internal::remove_all_t<XprTypeNested> XprTypeNestedCleaned;
   typedef typename internal::ref_selector<Inverse>::type Nested;
   typedef internal::remove_all_t<XprType> NestedExpression;
 
-  explicit EIGEN_DEVICE_FUNC Inverse(const XprType &xpr)
-    : m_xpr(xpr)
-  {}
+  explicit EIGEN_DEVICE_FUNC Inverse(const XprType& xpr) : m_xpr(xpr) {}
 
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR  Index rows() const EIGEN_NOEXCEPT { return m_xpr.cols(); }
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR  Index cols() const EIGEN_NOEXCEPT { return m_xpr.rows(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_xpr.cols(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_xpr.rows(); }
 
   EIGEN_DEVICE_FUNC const XprTypeNestedCleaned& nestedExpression() const { return m_xpr; }
 
-protected:
+ protected:
   XprTypeNested m_xpr;
 };
 
 // Generic API dispatcher
-template<typename XprType, typename StorageKind>
-class InverseImpl
-  : public internal::generic_xpr_base<Inverse<XprType> >::type
-{
-public:
+template <typename XprType, typename StorageKind>
+class InverseImpl : public internal::generic_xpr_base<Inverse<XprType> >::type {
+ public:
   typedef typename internal::generic_xpr_base<Inverse<XprType> >::type Base;
   typedef typename XprType::Scalar Scalar;
-private:
 
+ private:
   Scalar coeff(Index row, Index col) const;
   Scalar coeff(Index i) const;
 };
@@ -83,38 +75,34 @@
 namespace internal {
 
 /** \internal
-  * \brief Default evaluator for Inverse expression.
-  *
-  * This default evaluator for Inverse expression simply evaluate the inverse into a temporary
-  * by a call to internal::call_assignment_no_alias.
-  * Therefore, inverse implementers only have to specialize Assignment<Dst,Inverse<...>, ...> for
-  * there own nested expression.
-  *
-  * \sa class Inverse
-  */
-template<typename ArgType>
-struct unary_evaluator<Inverse<ArgType> >
-  : public evaluator<typename Inverse<ArgType>::PlainObject>
-{
+ * \brief Default evaluator for Inverse expression.
+ *
+ * This default evaluator for Inverse expression simply evaluate the inverse into a temporary
+ * by a call to internal::call_assignment_no_alias.
+ * Therefore, inverse implementers only have to specialize Assignment<Dst,Inverse<...>, ...> for
+ * there own nested expression.
+ *
+ * \sa class Inverse
+ */
+template <typename ArgType>
+struct unary_evaluator<Inverse<ArgType> > : public evaluator<typename Inverse<ArgType>::PlainObject> {
   typedef Inverse<ArgType> InverseType;
   typedef typename InverseType::PlainObject PlainObject;
   typedef evaluator<PlainObject> Base;
 
   enum { Flags = Base::Flags | EvalBeforeNestingBit };
 
-  unary_evaluator(const InverseType& inv_xpr)
-    : m_result(inv_xpr.rows(), inv_xpr.cols())
-  {
+  unary_evaluator(const InverseType& inv_xpr) : m_result(inv_xpr.rows(), inv_xpr.cols()) {
     internal::construct_at<Base>(this, m_result);
     internal::call_assignment_no_alias(m_result, inv_xpr);
   }
 
-protected:
+ protected:
   PlainObject m_result;
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_INVERSE_H
+#endif  // EIGEN_INVERSE_H
diff --git a/Eigen/src/Core/Map.h b/Eigen/src/Core/Map.h
index 5544b2d..df7b7ca 100644
--- a/Eigen/src/Core/Map.h
+++ b/Eigen/src/Core/Map.h
@@ -17,155 +17,137 @@
 namespace Eigen {
 
 namespace internal {
-template<typename PlainObjectType, int MapOptions, typename StrideType>
-struct traits<Map<PlainObjectType, MapOptions, StrideType> >
-  : public traits<PlainObjectType>
-{
+template <typename PlainObjectType, int MapOptions, typename StrideType>
+struct traits<Map<PlainObjectType, MapOptions, StrideType> > : public traits<PlainObjectType> {
   typedef traits<PlainObjectType> TraitsBase;
   enum {
-    PlainObjectTypeInnerSize = ((traits<PlainObjectType>::Flags&RowMajorBit)==RowMajorBit)
-                             ? PlainObjectType::ColsAtCompileTime
-                             : PlainObjectType::RowsAtCompileTime,
+    PlainObjectTypeInnerSize = ((traits<PlainObjectType>::Flags & RowMajorBit) == RowMajorBit)
+                                   ? PlainObjectType::ColsAtCompileTime
+                                   : PlainObjectType::RowsAtCompileTime,
 
     InnerStrideAtCompileTime = StrideType::InnerStrideAtCompileTime == 0
-                             ? int(PlainObjectType::InnerStrideAtCompileTime)
-                             : int(StrideType::InnerStrideAtCompileTime),
+                                   ? int(PlainObjectType::InnerStrideAtCompileTime)
+                                   : int(StrideType::InnerStrideAtCompileTime),
     OuterStrideAtCompileTime = StrideType::OuterStrideAtCompileTime == 0
-                             ? (InnerStrideAtCompileTime==Dynamic || PlainObjectTypeInnerSize==Dynamic
-                                ? Dynamic
-                                : int(InnerStrideAtCompileTime) * int(PlainObjectTypeInnerSize))
-                             : int(StrideType::OuterStrideAtCompileTime),
-    Alignment = int(MapOptions)&int(AlignedMask),
+                                   ? (InnerStrideAtCompileTime == Dynamic || PlainObjectTypeInnerSize == Dynamic
+                                          ? Dynamic
+                                          : int(InnerStrideAtCompileTime) * int(PlainObjectTypeInnerSize))
+                                   : int(StrideType::OuterStrideAtCompileTime),
+    Alignment = int(MapOptions) & int(AlignedMask),
     Flags0 = TraitsBase::Flags & (~NestByRefBit),
     Flags = is_lvalue<PlainObjectType>::value ? int(Flags0) : (int(Flags0) & ~LvalueBit)
   };
-private:
-  enum { Options }; // Expressions don't have Options
+
+ private:
+  enum { Options };  // Expressions don't have Options
 };
-}
+}  // namespace internal
 
 /** \class Map
-  * \ingroup Core_Module
-  *
-  * \brief A matrix or vector expression mapping an existing array of data.
-  *
-  * \tparam PlainObjectType the equivalent matrix type of the mapped data
-  * \tparam MapOptions specifies the pointer alignment in bytes. It can be: \c #Aligned128, \c #Aligned64, \c #Aligned32, \c #Aligned16, \c #Aligned8 or \c #Unaligned.
-  *                The default is \c #Unaligned.
-  * \tparam StrideType optionally specifies strides. By default, Map assumes the memory layout
-  *                   of an ordinary, contiguous array. This can be overridden by specifying strides.
-  *                   The type passed here must be a specialization of the Stride template, see examples below.
-  *
-  * This class represents a matrix or vector expression mapping an existing array of data.
-  * It can be used to let Eigen interface without any overhead with non-Eigen data structures,
-  * such as plain C arrays or structures from other libraries. By default, it assumes that the
-  * data is laid out contiguously in memory. You can however override this by explicitly specifying
-  * inner and outer strides.
-  *
-  * Here's an example of simply mapping a contiguous array as a \ref TopicStorageOrders "column-major" matrix:
-  * \include Map_simple.cpp
-  * Output: \verbinclude Map_simple.out
-  *
-  * If you need to map non-contiguous arrays, you can do so by specifying strides:
-  *
-  * Here's an example of mapping an array as a vector, specifying an inner stride, that is, the pointer
-  * increment between two consecutive coefficients. Here, we're specifying the inner stride as a compile-time
-  * fixed value.
-  * \include Map_inner_stride.cpp
-  * Output: \verbinclude Map_inner_stride.out
-  *
-  * Here's an example of mapping an array while specifying an outer stride. Here, since we're mapping
-  * as a column-major matrix, 'outer stride' means the pointer increment between two consecutive columns.
-  * Here, we're specifying the outer stride as a runtime parameter. Note that here \c OuterStride<> is
-  * a short version of \c OuterStride<Dynamic> because the default template parameter of OuterStride
-  * is  \c Dynamic
-  * \include Map_outer_stride.cpp
-  * Output: \verbinclude Map_outer_stride.out
-  *
-  * For more details and for an example of specifying both an inner and an outer stride, see class Stride.
-  *
-  * \b Tip: to change the array of data mapped by a Map object, you can use the C++
-  * placement new syntax:
-  *
-  * Example: \include Map_placement_new.cpp
-  * Output: \verbinclude Map_placement_new.out
-  *
-  * This class is the return type of PlainObjectBase::Map() but can also be used directly.
-  *
-  * \sa PlainObjectBase::Map(), \ref TopicStorageOrders
-  */
-template<typename PlainObjectType, int MapOptions, typename StrideType> class Map
-  : public MapBase<Map<PlainObjectType, MapOptions, StrideType> >
-{
-  public:
+ * \ingroup Core_Module
+ *
+ * \brief A matrix or vector expression mapping an existing array of data.
+ *
+ * \tparam PlainObjectType the equivalent matrix type of the mapped data
+ * \tparam MapOptions specifies the pointer alignment in bytes. It can be: \c #Aligned128, \c #Aligned64, \c #Aligned32,
+ * \c #Aligned16, \c #Aligned8 or \c #Unaligned. The default is \c #Unaligned. \tparam StrideType optionally specifies
+ * strides. By default, Map assumes the memory layout of an ordinary, contiguous array. This can be overridden by
+ * specifying strides. The type passed here must be a specialization of the Stride template, see examples below.
+ *
+ * This class represents a matrix or vector expression mapping an existing array of data.
+ * It can be used to let Eigen interface without any overhead with non-Eigen data structures,
+ * such as plain C arrays or structures from other libraries. By default, it assumes that the
+ * data is laid out contiguously in memory. You can however override this by explicitly specifying
+ * inner and outer strides.
+ *
+ * Here's an example of simply mapping a contiguous array as a \ref TopicStorageOrders "column-major" matrix:
+ * \include Map_simple.cpp
+ * Output: \verbinclude Map_simple.out
+ *
+ * If you need to map non-contiguous arrays, you can do so by specifying strides:
+ *
+ * Here's an example of mapping an array as a vector, specifying an inner stride, that is, the pointer
+ * increment between two consecutive coefficients. Here, we're specifying the inner stride as a compile-time
+ * fixed value.
+ * \include Map_inner_stride.cpp
+ * Output: \verbinclude Map_inner_stride.out
+ *
+ * Here's an example of mapping an array while specifying an outer stride. Here, since we're mapping
+ * as a column-major matrix, 'outer stride' means the pointer increment between two consecutive columns.
+ * Here, we're specifying the outer stride as a runtime parameter. Note that here \c OuterStride<> is
+ * a short version of \c OuterStride<Dynamic> because the default template parameter of OuterStride
+ * is  \c Dynamic
+ * \include Map_outer_stride.cpp
+ * Output: \verbinclude Map_outer_stride.out
+ *
+ * For more details and for an example of specifying both an inner and an outer stride, see class Stride.
+ *
+ * \b Tip: to change the array of data mapped by a Map object, you can use the C++
+ * placement new syntax:
+ *
+ * Example: \include Map_placement_new.cpp
+ * Output: \verbinclude Map_placement_new.out
+ *
+ * This class is the return type of PlainObjectBase::Map() but can also be used directly.
+ *
+ * \sa PlainObjectBase::Map(), \ref TopicStorageOrders
+ */
+template <typename PlainObjectType, int MapOptions, typename StrideType>
+class Map : public MapBase<Map<PlainObjectType, MapOptions, StrideType> > {
+ public:
+  typedef MapBase<Map> Base;
+  EIGEN_DENSE_PUBLIC_INTERFACE(Map)
 
-    typedef MapBase<Map> Base;
-    EIGEN_DENSE_PUBLIC_INTERFACE(Map)
+  typedef typename Base::PointerType PointerType;
+  typedef PointerType PointerArgType;
+  EIGEN_DEVICE_FUNC inline PointerType cast_to_pointer_type(PointerArgType ptr) { return ptr; }
 
-    typedef typename Base::PointerType PointerType;
-    typedef PointerType PointerArgType;
-    EIGEN_DEVICE_FUNC
-    inline PointerType cast_to_pointer_type(PointerArgType ptr) { return ptr; }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index innerStride() const {
+    return StrideType::InnerStrideAtCompileTime != 0 ? m_stride.inner() : 1;
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index innerStride() const
-    {
-      return StrideType::InnerStrideAtCompileTime != 0 ? m_stride.inner() : 1;
-    }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index outerStride() const {
+    return StrideType::OuterStrideAtCompileTime != 0 ? m_stride.outer()
+           : internal::traits<Map>::OuterStrideAtCompileTime != Dynamic
+               ? Index(internal::traits<Map>::OuterStrideAtCompileTime)
+           : IsVectorAtCompileTime    ? (this->size() * innerStride())
+           : int(Flags) & RowMajorBit ? (this->cols() * innerStride())
+                                      : (this->rows() * innerStride());
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index outerStride() const
-    {
-      return StrideType::OuterStrideAtCompileTime != 0 ? m_stride.outer()
-           : internal::traits<Map>::OuterStrideAtCompileTime != Dynamic ? Index(internal::traits<Map>::OuterStrideAtCompileTime)
-           : IsVectorAtCompileTime ? (this->size() * innerStride())
-           : int(Flags)&RowMajorBit ? (this->cols() * innerStride())
-           : (this->rows() * innerStride());
-    }
+  /** Constructor in the fixed-size case.
+   *
+   * \param dataPtr pointer to the array to map
+   * \param stride optional Stride object, passing the strides.
+   */
+  EIGEN_DEVICE_FUNC explicit inline Map(PointerArgType dataPtr, const StrideType& stride = StrideType())
+      : Base(cast_to_pointer_type(dataPtr)), m_stride(stride) {}
 
-    /** Constructor in the fixed-size case.
-      *
-      * \param dataPtr pointer to the array to map
-      * \param stride optional Stride object, passing the strides.
-      */
-    EIGEN_DEVICE_FUNC
-    explicit inline Map(PointerArgType dataPtr, const StrideType& stride = StrideType())
-      : Base(cast_to_pointer_type(dataPtr)), m_stride(stride)
-    {
-    }
+  /** Constructor in the dynamic-size vector case.
+   *
+   * \param dataPtr pointer to the array to map
+   * \param size the size of the vector expression
+   * \param stride optional Stride object, passing the strides.
+   */
+  EIGEN_DEVICE_FUNC inline Map(PointerArgType dataPtr, Index size, const StrideType& stride = StrideType())
+      : Base(cast_to_pointer_type(dataPtr), size), m_stride(stride) {}
 
-    /** Constructor in the dynamic-size vector case.
-      *
-      * \param dataPtr pointer to the array to map
-      * \param size the size of the vector expression
-      * \param stride optional Stride object, passing the strides.
-      */
-    EIGEN_DEVICE_FUNC
-    inline Map(PointerArgType dataPtr, Index size, const StrideType& stride = StrideType())
-      : Base(cast_to_pointer_type(dataPtr), size), m_stride(stride)
-    {
-    }
+  /** Constructor in the dynamic-size matrix case.
+   *
+   * \param dataPtr pointer to the array to map
+   * \param rows the number of rows of the matrix expression
+   * \param cols the number of columns of the matrix expression
+   * \param stride optional Stride object, passing the strides.
+   */
+  EIGEN_DEVICE_FUNC inline Map(PointerArgType dataPtr, Index rows, Index cols, const StrideType& stride = StrideType())
+      : Base(cast_to_pointer_type(dataPtr), rows, cols), m_stride(stride) {}
 
-    /** Constructor in the dynamic-size matrix case.
-      *
-      * \param dataPtr pointer to the array to map
-      * \param rows the number of rows of the matrix expression
-      * \param cols the number of columns of the matrix expression
-      * \param stride optional Stride object, passing the strides.
-      */
-    EIGEN_DEVICE_FUNC
-    inline Map(PointerArgType dataPtr, Index rows, Index cols, const StrideType& stride = StrideType())
-      : Base(cast_to_pointer_type(dataPtr), rows, cols), m_stride(stride)
-    {
-    }
+  EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Map)
 
-    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Map)
-
-  protected:
-    StrideType m_stride;
+ protected:
+  StrideType m_stride;
 };
 
+}  // end namespace Eigen
 
-} // end namespace Eigen
-
-#endif // EIGEN_MAP_H
+#endif  // EIGEN_MAP_H
diff --git a/Eigen/src/Core/MapBase.h b/Eigen/src/Core/MapBase.h
index 622a780..da95b5c 100644
--- a/Eigen/src/Core/MapBase.h
+++ b/Eigen/src/Core/MapBase.h
@@ -11,9 +11,9 @@
 #ifndef EIGEN_MAPBASE_H
 #define EIGEN_MAPBASE_H
 
-#define EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived) \
-      EIGEN_STATIC_ASSERT((int(internal::evaluator<Derived>::Flags) & LinearAccessBit) || Derived::IsVectorAtCompileTime, \
-                          YOU_ARE_TRYING_TO_USE_AN_INDEX_BASED_ACCESSOR_ON_AN_EXPRESSION_THAT_DOES_NOT_SUPPORT_THAT)
+#define EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)                                                               \
+  EIGEN_STATIC_ASSERT((int(internal::evaluator<Derived>::Flags) & LinearAccessBit) || Derived::IsVectorAtCompileTime, \
+                      YOU_ARE_TRYING_TO_USE_AN_INDEX_BASED_ACCESSOR_ON_AN_EXPRESSION_THAT_DOES_NOT_SUPPORT_THAT)
 
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
@@ -21,304 +21,263 @@
 namespace Eigen {
 
 /** \ingroup Core_Module
-  *
-  * \brief Base class for dense Map and Block expression with direct access
-  *
-  * This base class provides the const low-level accessors (e.g. coeff, coeffRef) of dense
-  * Map and Block objects with direct access.
-  * Typical users do not have to directly deal with this class.
-  *
-  * This class can be extended by through the macro plugin \c EIGEN_MAPBASE_PLUGIN.
-  * See \link TopicCustomizing_Plugins customizing Eigen \endlink for details.
-  *
-  * The \c Derived class has to provide the following two methods describing the memory layout:
-  *  \code Index innerStride() const; \endcode
-  *  \code Index outerStride() const; \endcode
-  *
-  * \sa class Map, class Block
-  */
-template<typename Derived> class MapBase<Derived, ReadOnlyAccessors>
-  : public internal::dense_xpr_base<Derived>::type
-{
-  public:
+ *
+ * \brief Base class for dense Map and Block expression with direct access
+ *
+ * This base class provides the const low-level accessors (e.g. coeff, coeffRef) of dense
+ * Map and Block objects with direct access.
+ * Typical users do not have to directly deal with this class.
+ *
+ * This class can be extended by through the macro plugin \c EIGEN_MAPBASE_PLUGIN.
+ * See \link TopicCustomizing_Plugins customizing Eigen \endlink for details.
+ *
+ * The \c Derived class has to provide the following two methods describing the memory layout:
+ *  \code Index innerStride() const; \endcode
+ *  \code Index outerStride() const; \endcode
+ *
+ * \sa class Map, class Block
+ */
+template <typename Derived>
+class MapBase<Derived, ReadOnlyAccessors> : public internal::dense_xpr_base<Derived>::type {
+ public:
+  typedef typename internal::dense_xpr_base<Derived>::type Base;
+  enum {
+    RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
+    ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
+    InnerStrideAtCompileTime = internal::traits<Derived>::InnerStrideAtCompileTime,
+    SizeAtCompileTime = Base::SizeAtCompileTime
+  };
 
-    typedef typename internal::dense_xpr_base<Derived>::type Base;
-    enum {
-      RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
-      ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
-      InnerStrideAtCompileTime = internal::traits<Derived>::InnerStrideAtCompileTime,
-      SizeAtCompileTime = Base::SizeAtCompileTime
-    };
+  typedef typename internal::traits<Derived>::StorageKind StorageKind;
+  typedef typename internal::traits<Derived>::Scalar Scalar;
+  typedef typename internal::packet_traits<Scalar>::type PacketScalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef std::conditional_t<bool(internal::is_lvalue<Derived>::value), Scalar*, const Scalar*> PointerType;
 
-    typedef typename internal::traits<Derived>::StorageKind StorageKind;
-    typedef typename internal::traits<Derived>::Scalar Scalar;
-    typedef typename internal::packet_traits<Scalar>::type PacketScalar;
-    typedef typename NumTraits<Scalar>::Real RealScalar;
-    typedef std::conditional_t<
-                bool(internal::is_lvalue<Derived>::value),
-                Scalar *,
-                const Scalar *>
-            PointerType;
+  using Base::derived;
+  //    using Base::RowsAtCompileTime;
+  //    using Base::ColsAtCompileTime;
+  //    using Base::SizeAtCompileTime;
+  using Base::Flags;
+  using Base::IsRowMajor;
+  using Base::IsVectorAtCompileTime;
+  using Base::MaxColsAtCompileTime;
+  using Base::MaxRowsAtCompileTime;
+  using Base::MaxSizeAtCompileTime;
 
-    using Base::derived;
-//    using Base::RowsAtCompileTime;
-//    using Base::ColsAtCompileTime;
-//    using Base::SizeAtCompileTime;
-    using Base::MaxRowsAtCompileTime;
-    using Base::MaxColsAtCompileTime;
-    using Base::MaxSizeAtCompileTime;
-    using Base::IsVectorAtCompileTime;
-    using Base::Flags;
-    using Base::IsRowMajor;
+  using Base::coeff;
+  using Base::coeffRef;
+  using Base::cols;
+  using Base::eval;
+  using Base::lazyAssign;
+  using Base::rows;
+  using Base::size;
 
-    using Base::rows;
-    using Base::cols;
-    using Base::size;
-    using Base::coeff;
-    using Base::coeffRef;
-    using Base::lazyAssign;
-    using Base::eval;
+  using Base::colStride;
+  using Base::innerStride;
+  using Base::outerStride;
+  using Base::rowStride;
 
-    using Base::innerStride;
-    using Base::outerStride;
-    using Base::rowStride;
-    using Base::colStride;
+  // bug 217 - compile error on ICC 11.1
+  using Base::operator=;
 
-    // bug 217 - compile error on ICC 11.1
-    using Base::operator=;
+  typedef typename Base::CoeffReturnType CoeffReturnType;
 
-    typedef typename Base::CoeffReturnType CoeffReturnType;
+  /** \copydoc DenseBase::rows() */
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index rows() const EIGEN_NOEXCEPT { return m_rows.value(); }
+  /** \copydoc DenseBase::cols() */
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index cols() const EIGEN_NOEXCEPT { return m_cols.value(); }
 
-    /** \copydoc DenseBase::rows() */
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index rows() const EIGEN_NOEXCEPT { return m_rows.value(); }
-    /** \copydoc DenseBase::cols() */
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index cols() const EIGEN_NOEXCEPT { return m_cols.value(); }
+  /** Returns a pointer to the first coefficient of the matrix or vector.
+   *
+   * \note When addressing this data, make sure to honor the strides returned by innerStride() and outerStride().
+   *
+   * \sa innerStride(), outerStride()
+   */
+  EIGEN_DEVICE_FUNC inline const Scalar* data() const { return m_data; }
 
-    /** Returns a pointer to the first coefficient of the matrix or vector.
-      *
-      * \note When addressing this data, make sure to honor the strides returned by innerStride() and outerStride().
-      *
-      * \sa innerStride(), outerStride()
-      */
-    EIGEN_DEVICE_FUNC inline const Scalar* data() const { return m_data; }
+  /** \copydoc PlainObjectBase::coeff(Index,Index) const */
+  EIGEN_DEVICE_FUNC inline const Scalar& coeff(Index rowId, Index colId) const {
+    return m_data[colId * colStride() + rowId * rowStride()];
+  }
 
-    /** \copydoc PlainObjectBase::coeff(Index,Index) const */
-    EIGEN_DEVICE_FUNC
-    inline const Scalar& coeff(Index rowId, Index colId) const
-    {
-      return m_data[colId * colStride() + rowId * rowStride()];
-    }
+  /** \copydoc PlainObjectBase::coeff(Index) const */
+  EIGEN_DEVICE_FUNC inline const Scalar& coeff(Index index) const {
+    EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
+    return m_data[index * innerStride()];
+  }
 
-    /** \copydoc PlainObjectBase::coeff(Index) const */
-    EIGEN_DEVICE_FUNC
-    inline const Scalar& coeff(Index index) const
-    {
-      EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
-      return m_data[index * innerStride()];
-    }
+  /** \copydoc PlainObjectBase::coeffRef(Index,Index) const */
+  EIGEN_DEVICE_FUNC inline const Scalar& coeffRef(Index rowId, Index colId) const {
+    return this->m_data[colId * colStride() + rowId * rowStride()];
+  }
 
-    /** \copydoc PlainObjectBase::coeffRef(Index,Index) const */
-    EIGEN_DEVICE_FUNC
-    inline const Scalar& coeffRef(Index rowId, Index colId) const
-    {
-      return this->m_data[colId * colStride() + rowId * rowStride()];
-    }
+  /** \copydoc PlainObjectBase::coeffRef(Index) const */
+  EIGEN_DEVICE_FUNC inline const Scalar& coeffRef(Index index) const {
+    EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
+    return this->m_data[index * innerStride()];
+  }
 
-    /** \copydoc PlainObjectBase::coeffRef(Index) const */
-    EIGEN_DEVICE_FUNC
-    inline const Scalar& coeffRef(Index index) const
-    {
-      EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
-      return this->m_data[index * innerStride()];
-    }
+  /** \internal */
+  template <int LoadMode>
+  inline PacketScalar packet(Index rowId, Index colId) const {
+    return internal::ploadt<PacketScalar, LoadMode>(m_data + (colId * colStride() + rowId * rowStride()));
+  }
 
-    /** \internal */
-    template<int LoadMode>
-    inline PacketScalar packet(Index rowId, Index colId) const
-    {
-      return internal::ploadt<PacketScalar, LoadMode>
-               (m_data + (colId * colStride() + rowId * rowStride()));
-    }
+  /** \internal */
+  template <int LoadMode>
+  inline PacketScalar packet(Index index) const {
+    EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
+    return internal::ploadt<PacketScalar, LoadMode>(m_data + index * innerStride());
+  }
 
-    /** \internal */
-    template<int LoadMode>
-    inline PacketScalar packet(Index index) const
-    {
-      EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
-      return internal::ploadt<PacketScalar, LoadMode>(m_data + index * innerStride());
-    }
+  /** \internal Constructor for fixed size matrices or vectors */
+  EIGEN_DEVICE_FUNC explicit inline MapBase(PointerType dataPtr)
+      : m_data(dataPtr), m_rows(RowsAtCompileTime), m_cols(ColsAtCompileTime) {
+    EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
+    checkSanity<Derived>();
+  }
 
-    /** \internal Constructor for fixed size matrices or vectors */
-    EIGEN_DEVICE_FUNC
-    explicit inline MapBase(PointerType dataPtr) : m_data(dataPtr), m_rows(RowsAtCompileTime), m_cols(ColsAtCompileTime)
-    {
-      EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
-      checkSanity<Derived>();
-    }
+  /** \internal Constructor for dynamically sized vectors */
+  EIGEN_DEVICE_FUNC inline MapBase(PointerType dataPtr, Index vecSize)
+      : m_data(dataPtr),
+        m_rows(RowsAtCompileTime == Dynamic ? vecSize : Index(RowsAtCompileTime)),
+        m_cols(ColsAtCompileTime == Dynamic ? vecSize : Index(ColsAtCompileTime)) {
+    EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+    eigen_assert(vecSize >= 0);
+    eigen_assert(dataPtr == 0 || SizeAtCompileTime == Dynamic || SizeAtCompileTime == vecSize);
+    checkSanity<Derived>();
+  }
 
-    /** \internal Constructor for dynamically sized vectors */
-    EIGEN_DEVICE_FUNC
-    inline MapBase(PointerType dataPtr, Index vecSize)
-            : m_data(dataPtr),
-              m_rows(RowsAtCompileTime == Dynamic ? vecSize : Index(RowsAtCompileTime)),
-              m_cols(ColsAtCompileTime == Dynamic ? vecSize : Index(ColsAtCompileTime))
-    {
-      EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
-      eigen_assert(vecSize >= 0);
-      eigen_assert(dataPtr == 0 || SizeAtCompileTime == Dynamic || SizeAtCompileTime == vecSize);
-      checkSanity<Derived>();
-    }
+  /** \internal Constructor for dynamically sized matrices */
+  EIGEN_DEVICE_FUNC inline MapBase(PointerType dataPtr, Index rows, Index cols)
+      : m_data(dataPtr), m_rows(rows), m_cols(cols) {
+    eigen_assert((dataPtr == 0) || (rows >= 0 && (RowsAtCompileTime == Dynamic || RowsAtCompileTime == rows) &&
+                                    cols >= 0 && (ColsAtCompileTime == Dynamic || ColsAtCompileTime == cols)));
+    checkSanity<Derived>();
+  }
 
-    /** \internal Constructor for dynamically sized matrices */
-    EIGEN_DEVICE_FUNC
-    inline MapBase(PointerType dataPtr, Index rows, Index cols)
-            : m_data(dataPtr), m_rows(rows), m_cols(cols)
-    {
-      eigen_assert( (dataPtr == 0)
-              || (   rows >= 0 && (RowsAtCompileTime == Dynamic || RowsAtCompileTime == rows)
-                  && cols >= 0 && (ColsAtCompileTime == Dynamic || ColsAtCompileTime == cols)));
-      checkSanity<Derived>();
-    }
+#ifdef EIGEN_MAPBASE_PLUGIN
+#include EIGEN_MAPBASE_PLUGIN
+#endif
 
-    #ifdef EIGEN_MAPBASE_PLUGIN
-    #include EIGEN_MAPBASE_PLUGIN
-    #endif
+ protected:
+  EIGEN_DEFAULT_COPY_CONSTRUCTOR(MapBase)
+  EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(MapBase)
 
-  protected:
-    EIGEN_DEFAULT_COPY_CONSTRUCTOR(MapBase)
-    EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(MapBase)
-
-    template<typename T>
-    EIGEN_DEVICE_FUNC
-    void checkSanity(std::enable_if_t<(internal::traits<T>::Alignment>0),void*> = 0) const
-    {
+  template <typename T>
+  EIGEN_DEVICE_FUNC void checkSanity(std::enable_if_t<(internal::traits<T>::Alignment > 0), void*> = 0) const {
 // Temporary macro to allow scalars to not be properly aligned.  This is while we sort out failures
 // in TensorFlow Lite that are currently relying on this UB.
 #ifndef EIGEN_ALLOW_UNALIGNED_SCALARS
-      // Pointer must be aligned to the Scalar type, otherwise we get UB.
-      eigen_assert((std::uintptr_t(m_data) % alignof(Scalar) == 0) && "data is not scalar-aligned");
+    // Pointer must be aligned to the Scalar type, otherwise we get UB.
+    eigen_assert((std::uintptr_t(m_data) % alignof(Scalar) == 0) && "data is not scalar-aligned");
 #endif
-#if EIGEN_MAX_ALIGN_BYTES>0
-      // innerStride() is not set yet when this function is called, so we optimistically assume the lowest plausible value:
-      const Index minInnerStride = InnerStrideAtCompileTime == Dynamic ? 1 : Index(InnerStrideAtCompileTime);
-      EIGEN_ONLY_USED_FOR_DEBUG(minInnerStride);
-      eigen_assert((   ((std::uintptr_t(m_data) % internal::traits<Derived>::Alignment) == 0)
-                    || (cols() * rows() * minInnerStride * sizeof(Scalar)) < internal::traits<Derived>::Alignment ) && "data is not aligned");
+#if EIGEN_MAX_ALIGN_BYTES > 0
+    // innerStride() is not set yet when this function is called, so we optimistically assume the lowest plausible
+    // value:
+    const Index minInnerStride = InnerStrideAtCompileTime == Dynamic ? 1 : Index(InnerStrideAtCompileTime);
+    EIGEN_ONLY_USED_FOR_DEBUG(minInnerStride);
+    eigen_assert((((std::uintptr_t(m_data) % internal::traits<Derived>::Alignment) == 0) ||
+                  (cols() * rows() * minInnerStride * sizeof(Scalar)) < internal::traits<Derived>::Alignment) &&
+                 "data is not aligned");
 #endif
-    }
+  }
 
-    template<typename T>
-    EIGEN_DEVICE_FUNC
-    void checkSanity(std::enable_if_t<internal::traits<T>::Alignment==0,void*> = 0) const
-    {
+  template <typename T>
+  EIGEN_DEVICE_FUNC void checkSanity(std::enable_if_t<internal::traits<T>::Alignment == 0, void*> = 0) const {
 #ifndef EIGEN_ALLOW_UNALIGNED_SCALARS
-      // Pointer must be aligned to the Scalar type, otherwise we get UB.
-      eigen_assert((std::uintptr_t(m_data) % alignof(Scalar) == 0) && "data is not scalar-aligned");
+    // Pointer must be aligned to the Scalar type, otherwise we get UB.
+    eigen_assert((std::uintptr_t(m_data) % alignof(Scalar) == 0) && "data is not scalar-aligned");
 #endif
-    }
+  }
 
-    PointerType m_data;
-    const internal::variable_if_dynamic<Index, RowsAtCompileTime> m_rows;
-    const internal::variable_if_dynamic<Index, ColsAtCompileTime> m_cols;
+  PointerType m_data;
+  const internal::variable_if_dynamic<Index, RowsAtCompileTime> m_rows;
+  const internal::variable_if_dynamic<Index, ColsAtCompileTime> m_cols;
 };
 
 /** \ingroup Core_Module
-  *
-  * \brief Base class for non-const dense Map and Block expression with direct access
-  *
-  * This base class provides the non-const low-level accessors (e.g. coeff and coeffRef) of
-  * dense Map and Block objects with direct access.
-  * It inherits MapBase<Derived, ReadOnlyAccessors> which defines the const variant for reading specific entries.
-  *
-  * \sa class Map, class Block
-  */
-template<typename Derived> class MapBase<Derived, WriteAccessors>
-  : public MapBase<Derived, ReadOnlyAccessors>
-{
-    typedef MapBase<Derived, ReadOnlyAccessors> ReadOnlyMapBase;
-  public:
+ *
+ * \brief Base class for non-const dense Map and Block expression with direct access
+ *
+ * This base class provides the non-const low-level accessors (e.g. coeff and coeffRef) of
+ * dense Map and Block objects with direct access.
+ * It inherits MapBase<Derived, ReadOnlyAccessors> which defines the const variant for reading specific entries.
+ *
+ * \sa class Map, class Block
+ */
+template <typename Derived>
+class MapBase<Derived, WriteAccessors> : public MapBase<Derived, ReadOnlyAccessors> {
+  typedef MapBase<Derived, ReadOnlyAccessors> ReadOnlyMapBase;
 
-    typedef MapBase<Derived, ReadOnlyAccessors> Base;
+ public:
+  typedef MapBase<Derived, ReadOnlyAccessors> Base;
 
-    typedef typename Base::Scalar Scalar;
-    typedef typename Base::PacketScalar PacketScalar;
-    typedef typename Base::StorageIndex StorageIndex;
-    typedef typename Base::PointerType PointerType;
+  typedef typename Base::Scalar Scalar;
+  typedef typename Base::PacketScalar PacketScalar;
+  typedef typename Base::StorageIndex StorageIndex;
+  typedef typename Base::PointerType PointerType;
 
-    using Base::derived;
-    using Base::rows;
-    using Base::cols;
-    using Base::size;
-    using Base::coeff;
-    using Base::coeffRef;
+  using Base::coeff;
+  using Base::coeffRef;
+  using Base::cols;
+  using Base::derived;
+  using Base::rows;
+  using Base::size;
 
-    using Base::innerStride;
-    using Base::outerStride;
-    using Base::rowStride;
-    using Base::colStride;
+  using Base::colStride;
+  using Base::innerStride;
+  using Base::outerStride;
+  using Base::rowStride;
 
-    typedef std::conditional_t<
-                    internal::is_lvalue<Derived>::value,
-                    Scalar,
-                    const Scalar
-                  > ScalarWithConstIfNotLvalue;
+  typedef std::conditional_t<internal::is_lvalue<Derived>::value, Scalar, const Scalar> ScalarWithConstIfNotLvalue;
 
-    EIGEN_DEVICE_FUNC
-    inline const Scalar* data() const { return this->m_data; }
-    EIGEN_DEVICE_FUNC
-    inline ScalarWithConstIfNotLvalue* data() { return this->m_data; } // no const-cast here so non-const-correct code will give a compile error
+  EIGEN_DEVICE_FUNC inline const Scalar* data() const { return this->m_data; }
+  EIGEN_DEVICE_FUNC inline ScalarWithConstIfNotLvalue* data() {
+    return this->m_data;
+  }  // no const-cast here so non-const-correct code will give a compile error
 
-    EIGEN_DEVICE_FUNC
-    inline ScalarWithConstIfNotLvalue& coeffRef(Index row, Index col)
-    {
-      return this->m_data[col * colStride() + row * rowStride()];
-    }
+  EIGEN_DEVICE_FUNC inline ScalarWithConstIfNotLvalue& coeffRef(Index row, Index col) {
+    return this->m_data[col * colStride() + row * rowStride()];
+  }
 
-    EIGEN_DEVICE_FUNC
-    inline ScalarWithConstIfNotLvalue& coeffRef(Index index)
-    {
-      EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
-      return this->m_data[index * innerStride()];
-    }
+  EIGEN_DEVICE_FUNC inline ScalarWithConstIfNotLvalue& coeffRef(Index index) {
+    EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
+    return this->m_data[index * innerStride()];
+  }
 
-    template<int StoreMode>
-    inline void writePacket(Index row, Index col, const PacketScalar& val)
-    {
-      internal::pstoret<Scalar, PacketScalar, StoreMode>
-               (this->m_data + (col * colStride() + row * rowStride()), val);
-    }
+  template <int StoreMode>
+  inline void writePacket(Index row, Index col, const PacketScalar& val) {
+    internal::pstoret<Scalar, PacketScalar, StoreMode>(this->m_data + (col * colStride() + row * rowStride()), val);
+  }
 
-    template<int StoreMode>
-    inline void writePacket(Index index, const PacketScalar& val)
-    {
-      EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
-      internal::pstoret<Scalar, PacketScalar, StoreMode>
-                (this->m_data + index * innerStride(), val);
-    }
+  template <int StoreMode>
+  inline void writePacket(Index index, const PacketScalar& val) {
+    EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
+    internal::pstoret<Scalar, PacketScalar, StoreMode>(this->m_data + index * innerStride(), val);
+  }
 
-    EIGEN_DEVICE_FUNC explicit inline MapBase(PointerType dataPtr) : Base(dataPtr) {}
-    EIGEN_DEVICE_FUNC inline MapBase(PointerType dataPtr, Index vecSize) : Base(dataPtr, vecSize) {}
-    EIGEN_DEVICE_FUNC inline MapBase(PointerType dataPtr, Index rows, Index cols) : Base(dataPtr, rows, cols) {}
+  EIGEN_DEVICE_FUNC explicit inline MapBase(PointerType dataPtr) : Base(dataPtr) {}
+  EIGEN_DEVICE_FUNC inline MapBase(PointerType dataPtr, Index vecSize) : Base(dataPtr, vecSize) {}
+  EIGEN_DEVICE_FUNC inline MapBase(PointerType dataPtr, Index rows, Index cols) : Base(dataPtr, rows, cols) {}
 
-    EIGEN_DEVICE_FUNC
-    Derived& operator=(const MapBase& other)
-    {
-      ReadOnlyMapBase::Base::operator=(other);
-      return derived();
-    }
+  EIGEN_DEVICE_FUNC Derived& operator=(const MapBase& other) {
+    ReadOnlyMapBase::Base::operator=(other);
+    return derived();
+  }
 
-    // In theory we could simply refer to Base:Base::operator=, but MSVC does not like Base::Base,
-    // see bugs 821 and 920.
-    using ReadOnlyMapBase::Base::operator=;
-  protected:
-    EIGEN_DEFAULT_COPY_CONSTRUCTOR(MapBase)
-    EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(MapBase)
+  // In theory we could simply refer to Base:Base::operator=, but MSVC does not like Base::Base,
+  // see bugs 821 and 920.
+  using ReadOnlyMapBase::Base::operator=;
+
+ protected:
+  EIGEN_DEFAULT_COPY_CONSTRUCTOR(MapBase)
+  EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(MapBase)
 };
 
 #undef EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_MAPBASE_H
+#endif  // EIGEN_MAPBASE_H
diff --git a/Eigen/src/Core/MathFunctions.h b/Eigen/src/Core/MathFunctions.h
index 6f2fd6d..95f9b97 100644
--- a/Eigen/src/Core/MathFunctions.h
+++ b/Eigen/src/Core/MathFunctions.h
@@ -13,9 +13,9 @@
 
 // TODO this should better be moved to NumTraits
 // Source: WolframAlpha
-#define EIGEN_PI    3.141592653589793238462643383279502884197169399375105820974944592307816406L
+#define EIGEN_PI 3.141592653589793238462643383279502884197169399375105820974944592307816406L
 #define EIGEN_LOG2E 1.442695040888963407359924681001892137426645954152985934135449406931109219L
-#define EIGEN_LN2   0.693147180559945309417232121458176568075500134360255254120680009493393621L
+#define EIGEN_LN2 0.693147180559945309417232121458176568075500134360255254120680009493393621L
 
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
@@ -25,430 +25,332 @@
 namespace internal {
 
 /** \internal \class global_math_functions_filtering_base
-  *
-  * What it does:
-  * Defines a typedef 'type' as follows:
-  * - if type T has a member typedef Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl, then
-  *   global_math_functions_filtering_base<T>::type is a typedef for it.
-  * - otherwise, global_math_functions_filtering_base<T>::type is a typedef for T.
-  *
-  * How it's used:
-  * To allow to defined the global math functions (like sin...) in certain cases, like the Array expressions.
-  * When you do sin(array1+array2), the object array1+array2 has a complicated expression type, all what you want to know
-  * is that it inherits ArrayBase. So we implement a partial specialization of sin_impl for ArrayBase<Derived>.
-  * So we must make sure to use sin_impl<ArrayBase<Derived> > and not sin_impl<Derived>, otherwise our partial specialization
-  * won't be used. How does sin know that? That's exactly what global_math_functions_filtering_base tells it.
-  *
-  * How it's implemented:
-  * SFINAE in the style of enable_if. Highly susceptible of breaking compilers. With GCC, it sure does work, but if you replace
-  * the typename dummy by an integer template parameter, it doesn't work anymore!
-  */
+ *
+ * What it does:
+ * Defines a typedef 'type' as follows:
+ * - if type T has a member typedef Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl, then
+ *   global_math_functions_filtering_base<T>::type is a typedef for it.
+ * - otherwise, global_math_functions_filtering_base<T>::type is a typedef for T.
+ *
+ * How it's used:
+ * To allow to defined the global math functions (like sin...) in certain cases, like the Array expressions.
+ * When you do sin(array1+array2), the object array1+array2 has a complicated expression type, all what you want to know
+ * is that it inherits ArrayBase. So we implement a partial specialization of sin_impl for ArrayBase<Derived>.
+ * So we must make sure to use sin_impl<ArrayBase<Derived> > and not sin_impl<Derived>, otherwise our partial
+ * specialization won't be used. How does sin know that? That's exactly what global_math_functions_filtering_base tells
+ * it.
+ *
+ * How it's implemented:
+ * SFINAE in the style of enable_if. Highly susceptible of breaking compilers. With GCC, it sure does work, but if you
+ * replace the typename dummy by an integer template parameter, it doesn't work anymore!
+ */
 
-template<typename T, typename dummy = void>
-struct global_math_functions_filtering_base
-{
+template <typename T, typename dummy = void>
+struct global_math_functions_filtering_base {
   typedef T type;
 };
 
-template<typename T> struct always_void { typedef void type; };
+template <typename T>
+struct always_void {
+  typedef void type;
+};
 
-template<typename T>
-struct global_math_functions_filtering_base
-  <T,
-   typename always_void<typename T::Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl>::type
-  >
-{
+template <typename T>
+struct global_math_functions_filtering_base<
+    T, typename always_void<typename T::Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl>::type> {
   typedef typename T::Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl type;
 };
 
-#define EIGEN_MATHFUNC_IMPL(func, scalar) Eigen::internal::func##_impl<typename Eigen::internal::global_math_functions_filtering_base<scalar>::type>
-#define EIGEN_MATHFUNC_RETVAL(func, scalar) typename Eigen::internal::func##_retval<typename Eigen::internal::global_math_functions_filtering_base<scalar>::type>::type
+#define EIGEN_MATHFUNC_IMPL(func, scalar) \
+  Eigen::internal::func##_impl<typename Eigen::internal::global_math_functions_filtering_base<scalar>::type>
+#define EIGEN_MATHFUNC_RETVAL(func, scalar) \
+  typename Eigen::internal::func##_retval<  \
+      typename Eigen::internal::global_math_functions_filtering_base<scalar>::type>::type
 
 /****************************************************************************
-* Implementation of real                                                 *
-****************************************************************************/
+ * Implementation of real                                                 *
+ ****************************************************************************/
 
-template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
-struct real_default_impl
-{
+template <typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
+struct real_default_impl {
   typedef typename NumTraits<Scalar>::Real RealScalar;
-  EIGEN_DEVICE_FUNC
-  static inline RealScalar run(const Scalar& x)
-  {
-    return x;
-  }
+  EIGEN_DEVICE_FUNC static inline RealScalar run(const Scalar& x) { return x; }
 };
 
-template<typename Scalar>
-struct real_default_impl<Scalar,true>
-{
+template <typename Scalar>
+struct real_default_impl<Scalar, true> {
   typedef typename NumTraits<Scalar>::Real RealScalar;
-  EIGEN_DEVICE_FUNC
-  static inline RealScalar run(const Scalar& x)
-  {
+  EIGEN_DEVICE_FUNC static inline RealScalar run(const Scalar& x) {
     using std::real;
     return real(x);
   }
 };
 
-template<typename Scalar> struct real_impl : real_default_impl<Scalar> {};
+template <typename Scalar>
+struct real_impl : real_default_impl<Scalar> {};
 
 #if defined(EIGEN_GPU_COMPILE_PHASE)
-template<typename T>
-struct real_impl<std::complex<T> >
-{
+template <typename T>
+struct real_impl<std::complex<T>> {
   typedef T RealScalar;
-  EIGEN_DEVICE_FUNC
-  static inline T run(const std::complex<T>& x)
-  {
-    return x.real();
-  }
+  EIGEN_DEVICE_FUNC static inline T run(const std::complex<T>& x) { return x.real(); }
 };
 #endif
 
-template<typename Scalar>
-struct real_retval
-{
+template <typename Scalar>
+struct real_retval {
   typedef typename NumTraits<Scalar>::Real type;
 };
 
 /****************************************************************************
-* Implementation of imag                                                 *
-****************************************************************************/
+ * Implementation of imag                                                 *
+ ****************************************************************************/
 
-template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
-struct imag_default_impl
-{
+template <typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
+struct imag_default_impl {
   typedef typename NumTraits<Scalar>::Real RealScalar;
-  EIGEN_DEVICE_FUNC
-  static inline RealScalar run(const Scalar&)
-  {
-    return RealScalar(0);
-  }
+  EIGEN_DEVICE_FUNC static inline RealScalar run(const Scalar&) { return RealScalar(0); }
 };
 
-template<typename Scalar>
-struct imag_default_impl<Scalar,true>
-{
+template <typename Scalar>
+struct imag_default_impl<Scalar, true> {
   typedef typename NumTraits<Scalar>::Real RealScalar;
-  EIGEN_DEVICE_FUNC
-  static inline RealScalar run(const Scalar& x)
-  {
+  EIGEN_DEVICE_FUNC static inline RealScalar run(const Scalar& x) {
     using std::imag;
     return imag(x);
   }
 };
 
-template<typename Scalar> struct imag_impl : imag_default_impl<Scalar> {};
+template <typename Scalar>
+struct imag_impl : imag_default_impl<Scalar> {};
 
 #if defined(EIGEN_GPU_COMPILE_PHASE)
-template<typename T>
-struct imag_impl<std::complex<T> >
-{
+template <typename T>
+struct imag_impl<std::complex<T>> {
   typedef T RealScalar;
-  EIGEN_DEVICE_FUNC
-  static inline T run(const std::complex<T>& x)
-  {
-    return x.imag();
-  }
+  EIGEN_DEVICE_FUNC static inline T run(const std::complex<T>& x) { return x.imag(); }
 };
 #endif
 
-template<typename Scalar>
-struct imag_retval
-{
+template <typename Scalar>
+struct imag_retval {
   typedef typename NumTraits<Scalar>::Real type;
 };
 
 /****************************************************************************
-* Implementation of real_ref                                             *
-****************************************************************************/
+ * Implementation of real_ref                                             *
+ ****************************************************************************/
 
-template<typename Scalar>
-struct real_ref_impl
-{
+template <typename Scalar>
+struct real_ref_impl {
   typedef typename NumTraits<Scalar>::Real RealScalar;
-  EIGEN_DEVICE_FUNC
-  static inline RealScalar& run(Scalar& x)
-  {
-    return reinterpret_cast<RealScalar*>(&x)[0];
-  }
-  EIGEN_DEVICE_FUNC
-  static inline const RealScalar& run(const Scalar& x)
-  {
+  EIGEN_DEVICE_FUNC static inline RealScalar& run(Scalar& x) { return reinterpret_cast<RealScalar*>(&x)[0]; }
+  EIGEN_DEVICE_FUNC static inline const RealScalar& run(const Scalar& x) {
     return reinterpret_cast<const RealScalar*>(&x)[0];
   }
 };
 
-template<typename Scalar>
-struct real_ref_retval
-{
-  typedef typename NumTraits<Scalar>::Real & type;
+template <typename Scalar>
+struct real_ref_retval {
+  typedef typename NumTraits<Scalar>::Real& type;
 };
 
 /****************************************************************************
-* Implementation of imag_ref                                             *
-****************************************************************************/
+ * Implementation of imag_ref                                             *
+ ****************************************************************************/
 
-template<typename Scalar, bool IsComplex>
-struct imag_ref_default_impl
-{
+template <typename Scalar, bool IsComplex>
+struct imag_ref_default_impl {
   typedef typename NumTraits<Scalar>::Real RealScalar;
-  EIGEN_DEVICE_FUNC
-  static inline RealScalar& run(Scalar& x)
-  {
-    return reinterpret_cast<RealScalar*>(&x)[1];
-  }
-  EIGEN_DEVICE_FUNC
-  static inline const RealScalar& run(const Scalar& x)
-  {
+  EIGEN_DEVICE_FUNC static inline RealScalar& run(Scalar& x) { return reinterpret_cast<RealScalar*>(&x)[1]; }
+  EIGEN_DEVICE_FUNC static inline const RealScalar& run(const Scalar& x) {
     return reinterpret_cast<RealScalar*>(&x)[1];
   }
 };
 
-template<typename Scalar>
-struct imag_ref_default_impl<Scalar, false>
-{
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static inline Scalar run(Scalar&)
-  {
-    return Scalar(0);
-  }
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static inline const Scalar run(const Scalar&)
-  {
-    return Scalar(0);
-  }
+template <typename Scalar>
+struct imag_ref_default_impl<Scalar, false> {
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline Scalar run(Scalar&) { return Scalar(0); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline const Scalar run(const Scalar&) { return Scalar(0); }
 };
 
-template<typename Scalar>
+template <typename Scalar>
 struct imag_ref_impl : imag_ref_default_impl<Scalar, NumTraits<Scalar>::IsComplex> {};
 
-template<typename Scalar>
-struct imag_ref_retval
-{
-  typedef typename NumTraits<Scalar>::Real & type;
+template <typename Scalar>
+struct imag_ref_retval {
+  typedef typename NumTraits<Scalar>::Real& type;
 };
 
 /****************************************************************************
-* Implementation of conj                                                 *
-****************************************************************************/
+ * Implementation of conj                                                 *
+ ****************************************************************************/
 
-template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
-struct conj_default_impl
-{
-  EIGEN_DEVICE_FUNC
-  static inline Scalar run(const Scalar& x)
-  {
-    return x;
-  }
+template <typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
+struct conj_default_impl {
+  EIGEN_DEVICE_FUNC static inline Scalar run(const Scalar& x) { return x; }
 };
 
-template<typename Scalar>
-struct conj_default_impl<Scalar,true>
-{
-  EIGEN_DEVICE_FUNC
-  static inline Scalar run(const Scalar& x)
-  {
+template <typename Scalar>
+struct conj_default_impl<Scalar, true> {
+  EIGEN_DEVICE_FUNC static inline Scalar run(const Scalar& x) {
     using std::conj;
     return conj(x);
   }
 };
 
-template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
+template <typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
 struct conj_impl : conj_default_impl<Scalar, IsComplex> {};
 
-template<typename Scalar>
-struct conj_retval
-{
+template <typename Scalar>
+struct conj_retval {
   typedef Scalar type;
 };
 
 /****************************************************************************
-* Implementation of abs2                                                 *
-****************************************************************************/
+ * Implementation of abs2                                                 *
+ ****************************************************************************/
 
-template<typename Scalar,bool IsComplex>
-struct abs2_impl_default
+template <typename Scalar, bool IsComplex>
+struct abs2_impl_default {
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  EIGEN_DEVICE_FUNC static inline RealScalar run(const Scalar& x) { return x * x; }
+};
+
+template <typename Scalar>
+struct abs2_impl_default<Scalar, true>  // IsComplex
 {
   typedef typename NumTraits<Scalar>::Real RealScalar;
-  EIGEN_DEVICE_FUNC
-  static inline RealScalar run(const Scalar& x)
-  {
-    return x*x;
+  EIGEN_DEVICE_FUNC static inline RealScalar run(const Scalar& x) { return x.real() * x.real() + x.imag() * x.imag(); }
+};
+
+template <typename Scalar>
+struct abs2_impl {
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  EIGEN_DEVICE_FUNC static inline RealScalar run(const Scalar& x) {
+    return abs2_impl_default<Scalar, NumTraits<Scalar>::IsComplex>::run(x);
   }
 };
 
-template<typename Scalar>
-struct abs2_impl_default<Scalar, true> // IsComplex
-{
-  typedef typename NumTraits<Scalar>::Real RealScalar;
-  EIGEN_DEVICE_FUNC
-  static inline RealScalar run(const Scalar& x)
-  {
-    return x.real()*x.real() + x.imag()*x.imag();
-  }
-};
-
-template<typename Scalar>
-struct abs2_impl
-{
-  typedef typename NumTraits<Scalar>::Real RealScalar;
-  EIGEN_DEVICE_FUNC
-  static inline RealScalar run(const Scalar& x)
-  {
-    return abs2_impl_default<Scalar,NumTraits<Scalar>::IsComplex>::run(x);
-  }
-};
-
-template<typename Scalar>
-struct abs2_retval
-{
+template <typename Scalar>
+struct abs2_retval {
   typedef typename NumTraits<Scalar>::Real type;
 };
 
 /****************************************************************************
-* Implementation of sqrt/rsqrt                                             *
-****************************************************************************/
+ * Implementation of sqrt/rsqrt                                             *
+ ****************************************************************************/
 
-template<typename Scalar>
-struct sqrt_impl
-{
-  EIGEN_DEVICE_FUNC
-  static EIGEN_ALWAYS_INLINE Scalar run(const Scalar& x)
-  {
+template <typename Scalar>
+struct sqrt_impl {
+  EIGEN_DEVICE_FUNC static EIGEN_ALWAYS_INLINE Scalar run(const Scalar& x) {
     EIGEN_USING_STD(sqrt);
     return sqrt(x);
   }
 };
 
 // Complex sqrt defined in MathFunctionsImpl.h.
-template<typename T> EIGEN_DEVICE_FUNC std::complex<T> complex_sqrt(const std::complex<T>& a_x);
+template <typename T>
+EIGEN_DEVICE_FUNC std::complex<T> complex_sqrt(const std::complex<T>& a_x);
 
 // Custom implementation is faster than `std::sqrt`, works on
 // GPU, and correctly handles special cases (unlike MSVC).
-template<typename T>
-struct sqrt_impl<std::complex<T> >
-{
-  EIGEN_DEVICE_FUNC
-  static EIGEN_ALWAYS_INLINE std::complex<T> run(const std::complex<T>& x)
-  {
+template <typename T>
+struct sqrt_impl<std::complex<T>> {
+  EIGEN_DEVICE_FUNC static EIGEN_ALWAYS_INLINE std::complex<T> run(const std::complex<T>& x) {
     return complex_sqrt<T>(x);
   }
 };
 
-template<typename Scalar>
-struct sqrt_retval
-{
+template <typename Scalar>
+struct sqrt_retval {
   typedef Scalar type;
 };
 
 // Default implementation relies on numext::sqrt, at bottom of file.
-template<typename T>
+template <typename T>
 struct rsqrt_impl;
 
 // Complex rsqrt defined in MathFunctionsImpl.h.
-template<typename T> EIGEN_DEVICE_FUNC std::complex<T> complex_rsqrt(const std::complex<T>& a_x);
+template <typename T>
+EIGEN_DEVICE_FUNC std::complex<T> complex_rsqrt(const std::complex<T>& a_x);
 
-template<typename T>
-struct rsqrt_impl<std::complex<T> >
-{
-  EIGEN_DEVICE_FUNC
-  static EIGEN_ALWAYS_INLINE std::complex<T> run(const std::complex<T>& x)
-  {
+template <typename T>
+struct rsqrt_impl<std::complex<T>> {
+  EIGEN_DEVICE_FUNC static EIGEN_ALWAYS_INLINE std::complex<T> run(const std::complex<T>& x) {
     return complex_rsqrt<T>(x);
   }
 };
 
-template<typename Scalar>
-struct rsqrt_retval
-{
+template <typename Scalar>
+struct rsqrt_retval {
   typedef Scalar type;
 };
 
 /****************************************************************************
-* Implementation of norm1                                                *
-****************************************************************************/
+ * Implementation of norm1                                                *
+ ****************************************************************************/
 
-template<typename Scalar, bool IsComplex>
+template <typename Scalar, bool IsComplex>
 struct norm1_default_impl;
 
-template<typename Scalar>
-struct norm1_default_impl<Scalar,true>
-{
+template <typename Scalar>
+struct norm1_default_impl<Scalar, true> {
   typedef typename NumTraits<Scalar>::Real RealScalar;
-  EIGEN_DEVICE_FUNC
-  static inline RealScalar run(const Scalar& x)
-  {
+  EIGEN_DEVICE_FUNC static inline RealScalar run(const Scalar& x) {
     EIGEN_USING_STD(abs);
     return abs(x.real()) + abs(x.imag());
   }
 };
 
-template<typename Scalar>
-struct norm1_default_impl<Scalar, false>
-{
-  EIGEN_DEVICE_FUNC
-  static inline Scalar run(const Scalar& x)
-  {
+template <typename Scalar>
+struct norm1_default_impl<Scalar, false> {
+  EIGEN_DEVICE_FUNC static inline Scalar run(const Scalar& x) {
     EIGEN_USING_STD(abs);
     return abs(x);
   }
 };
 
-template<typename Scalar>
+template <typename Scalar>
 struct norm1_impl : norm1_default_impl<Scalar, NumTraits<Scalar>::IsComplex> {};
 
-template<typename Scalar>
-struct norm1_retval
-{
+template <typename Scalar>
+struct norm1_retval {
   typedef typename NumTraits<Scalar>::Real type;
 };
 
 /****************************************************************************
-* Implementation of hypot                                                *
-****************************************************************************/
+ * Implementation of hypot                                                *
+ ****************************************************************************/
 
-template<typename Scalar> struct hypot_impl;
+template <typename Scalar>
+struct hypot_impl;
 
-template<typename Scalar>
-struct hypot_retval
-{
+template <typename Scalar>
+struct hypot_retval {
   typedef typename NumTraits<Scalar>::Real type;
 };
 
 /****************************************************************************
-* Implementation of cast                                                 *
-****************************************************************************/
+ * Implementation of cast                                                 *
+ ****************************************************************************/
 
-template<typename OldType, typename NewType, typename EnableIf = void>
-struct cast_impl
-{
-  EIGEN_DEVICE_FUNC
-  static inline NewType run(const OldType& x)
-  {
-    return static_cast<NewType>(x);
-  }
+template <typename OldType, typename NewType, typename EnableIf = void>
+struct cast_impl {
+  EIGEN_DEVICE_FUNC static inline NewType run(const OldType& x) { return static_cast<NewType>(x); }
 };
 
 template <typename OldType>
 struct cast_impl<OldType, bool> {
-  EIGEN_DEVICE_FUNC
-  static inline bool run(const OldType& x) { return x != OldType(0); }
+  EIGEN_DEVICE_FUNC static inline bool run(const OldType& x) { return x != OldType(0); }
 };
 
-
 // Casting from S -> Complex<T> leads to an implicit conversion from S to T,
 // generating warnings on clang.  Here we explicitly cast the real component.
-template<typename OldType, typename NewType>
+template <typename OldType, typename NewType>
 struct cast_impl<OldType, NewType,
-  typename std::enable_if_t<
-    !NumTraits<OldType>::IsComplex && NumTraits<NewType>::IsComplex
-  >>
-{
-  EIGEN_DEVICE_FUNC
-  static inline NewType run(const OldType& x)
-  {
+                 typename std::enable_if_t<!NumTraits<OldType>::IsComplex && NumTraits<NewType>::IsComplex>> {
+  EIGEN_DEVICE_FUNC static inline NewType run(const OldType& x) {
     typedef typename NumTraits<NewType>::Real NewReal;
     return static_cast<NewType>(static_cast<NewReal>(x));
   }
@@ -456,33 +358,28 @@
 
 // here, for once, we're plainly returning NewType: we don't want cast to do weird things.
 
-template<typename OldType, typename NewType>
-EIGEN_DEVICE_FUNC
-inline NewType cast(const OldType& x)
-{
+template <typename OldType, typename NewType>
+EIGEN_DEVICE_FUNC inline NewType cast(const OldType& x) {
   return cast_impl<OldType, NewType>::run(x);
 }
 
 /****************************************************************************
-* Implementation of arg                                                     *
-****************************************************************************/
+ * Implementation of arg                                                     *
+ ****************************************************************************/
 
 // Visual Studio 2017 has a bug where arg(float) returns 0 for negative inputs.
 // This seems to be fixed in VS 2019.
 #if (!EIGEN_COMP_MSVC || EIGEN_COMP_MSVC >= 1920)
 // std::arg is only defined for types of std::complex, or integer types or float/double/long double
-template<typename Scalar,
-          bool HasStdImpl = NumTraits<Scalar>::IsComplex || is_integral<Scalar>::value
-                            || is_same<Scalar, float>::value || is_same<Scalar, double>::value
-                            || is_same<Scalar, long double>::value >
+template <typename Scalar, bool HasStdImpl = NumTraits<Scalar>::IsComplex || is_integral<Scalar>::value ||
+                                             is_same<Scalar, float>::value || is_same<Scalar, double>::value ||
+                                             is_same<Scalar, long double>::value>
 struct arg_default_impl;
 
-template<typename Scalar>
+template <typename Scalar>
 struct arg_default_impl<Scalar, true> {
   typedef typename NumTraits<Scalar>::Real RealScalar;
-  EIGEN_DEVICE_FUNC
-  static inline RealScalar run(const Scalar& x)
-  {
+  EIGEN_DEVICE_FUNC static inline RealScalar run(const Scalar& x) {
     // There is no official ::arg on device in CUDA/HIP, so we always need to use std::arg.
     using std::arg;
     return static_cast<RealScalar>(arg(x));
@@ -490,143 +387,129 @@
 };
 
 // Must be non-complex floating-point type (e.g. half/bfloat16).
-template<typename Scalar>
+template <typename Scalar>
 struct arg_default_impl<Scalar, false> {
   typedef typename NumTraits<Scalar>::Real RealScalar;
-  EIGEN_DEVICE_FUNC
-  static inline RealScalar run(const Scalar& x)
-  {
+  EIGEN_DEVICE_FUNC static inline RealScalar run(const Scalar& x) {
     return (x < Scalar(0)) ? RealScalar(EIGEN_PI) : RealScalar(0);
   }
 };
 #else
-template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
-struct arg_default_impl
-{
+template <typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
+struct arg_default_impl {
   typedef typename NumTraits<Scalar>::Real RealScalar;
-  EIGEN_DEVICE_FUNC
-  static inline RealScalar run(const Scalar& x)
-  {
+  EIGEN_DEVICE_FUNC static inline RealScalar run(const Scalar& x) {
     return (x < RealScalar(0)) ? RealScalar(EIGEN_PI) : RealScalar(0);
   }
 };
 
-template<typename Scalar>
-struct arg_default_impl<Scalar,true>
-{
+template <typename Scalar>
+struct arg_default_impl<Scalar, true> {
   typedef typename NumTraits<Scalar>::Real RealScalar;
-  EIGEN_DEVICE_FUNC
-  static inline RealScalar run(const Scalar& x)
-  {
+  EIGEN_DEVICE_FUNC static inline RealScalar run(const Scalar& x) {
     EIGEN_USING_STD(arg);
     return arg(x);
   }
 };
 #endif
-template<typename Scalar> struct arg_impl : arg_default_impl<Scalar> {};
+template <typename Scalar>
+struct arg_impl : arg_default_impl<Scalar> {};
 
-template<typename Scalar>
-struct arg_retval
-{
+template <typename Scalar>
+struct arg_retval {
   typedef typename NumTraits<Scalar>::Real type;
 };
 
 /****************************************************************************
-* Implementation of expm1                                                   *
-****************************************************************************/
+ * Implementation of expm1                                                   *
+ ****************************************************************************/
 
 // This implementation is based on GSL Math's expm1.
 namespace std_fallback {
-  // fallback expm1 implementation in case there is no expm1(Scalar) function in namespace of Scalar,
-  // or that there is no suitable std::expm1 function available. Implementation
-  // attributed to Kahan. See: http://www.plunk.org/~hatch/rightway.php.
-  template<typename Scalar>
-  EIGEN_DEVICE_FUNC inline Scalar expm1(const Scalar& x) {
-    EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
-    typedef typename NumTraits<Scalar>::Real RealScalar;
+// fallback expm1 implementation in case there is no expm1(Scalar) function in namespace of Scalar,
+// or that there is no suitable std::expm1 function available. Implementation
+// attributed to Kahan. See: http://www.plunk.org/~hatch/rightway.php.
+template <typename Scalar>
+EIGEN_DEVICE_FUNC inline Scalar expm1(const Scalar& x) {
+  EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
+  typedef typename NumTraits<Scalar>::Real RealScalar;
 
-    EIGEN_USING_STD(exp);
-    Scalar u = exp(x);
-    if (numext::equal_strict(u, Scalar(1))) {
-      return x;
-    }
-    Scalar um1 = u - RealScalar(1);
-    if (numext::equal_strict(um1, Scalar(-1))) {
-      return RealScalar(-1);
-    }
-
-    EIGEN_USING_STD(log);
-    Scalar logu = log(u);
-    return numext::equal_strict(u, logu) ? u : (u - RealScalar(1)) * x / logu;
+  EIGEN_USING_STD(exp);
+  Scalar u = exp(x);
+  if (numext::equal_strict(u, Scalar(1))) {
+    return x;
   }
-}
+  Scalar um1 = u - RealScalar(1);
+  if (numext::equal_strict(um1, Scalar(-1))) {
+    return RealScalar(-1);
+  }
 
-template<typename Scalar>
+  EIGEN_USING_STD(log);
+  Scalar logu = log(u);
+  return numext::equal_strict(u, logu) ? u : (u - RealScalar(1)) * x / logu;
+}
+}  // namespace std_fallback
+
+template <typename Scalar>
 struct expm1_impl {
-  EIGEN_DEVICE_FUNC static inline Scalar run(const Scalar& x)
-  {
+  EIGEN_DEVICE_FUNC static inline Scalar run(const Scalar& x) {
     EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
     EIGEN_USING_STD(expm1);
     return expm1(x);
   }
 };
 
-template<typename Scalar>
-struct expm1_retval
-{
+template <typename Scalar>
+struct expm1_retval {
   typedef Scalar type;
 };
 
 /****************************************************************************
-* Implementation of log                                                     *
-****************************************************************************/
+ * Implementation of log                                                     *
+ ****************************************************************************/
 
 // Complex log defined in MathFunctionsImpl.h.
-template<typename T> EIGEN_DEVICE_FUNC std::complex<T> complex_log(const std::complex<T>& z);
+template <typename T>
+EIGEN_DEVICE_FUNC std::complex<T> complex_log(const std::complex<T>& z);
 
-template<typename Scalar>
+template <typename Scalar>
 struct log_impl {
-  EIGEN_DEVICE_FUNC static inline Scalar run(const Scalar& x)
-  {
+  EIGEN_DEVICE_FUNC static inline Scalar run(const Scalar& x) {
     EIGEN_USING_STD(log);
     return static_cast<Scalar>(log(x));
   }
 };
 
-template<typename Scalar>
-struct log_impl<std::complex<Scalar> > {
-  EIGEN_DEVICE_FUNC static inline std::complex<Scalar> run(const std::complex<Scalar>& z)
-  {
-    return complex_log(z);
-  }
+template <typename Scalar>
+struct log_impl<std::complex<Scalar>> {
+  EIGEN_DEVICE_FUNC static inline std::complex<Scalar> run(const std::complex<Scalar>& z) { return complex_log(z); }
 };
 
 /****************************************************************************
-* Implementation of log1p                                                   *
-****************************************************************************/
+ * Implementation of log1p                                                   *
+ ****************************************************************************/
 
 namespace std_fallback {
-  // fallback log1p implementation in case there is no log1p(Scalar) function in namespace of Scalar,
-  // or that there is no suitable std::log1p function available
-  template<typename Scalar>
-  EIGEN_DEVICE_FUNC inline Scalar log1p(const Scalar& x) {
-    EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
-    typedef typename NumTraits<Scalar>::Real RealScalar;
-    EIGEN_USING_STD(log);
-    Scalar x1p = RealScalar(1) + x;
-    Scalar log_1p = log_impl<Scalar>::run(x1p);
-    const bool is_small = numext::equal_strict(x1p, Scalar(1));
-    const bool is_inf = numext::equal_strict(x1p, log_1p);
-    return (is_small || is_inf) ? x : x * (log_1p / (x1p - RealScalar(1)));
-  }
+// fallback log1p implementation in case there is no log1p(Scalar) function in namespace of Scalar,
+// or that there is no suitable std::log1p function available
+template <typename Scalar>
+EIGEN_DEVICE_FUNC inline Scalar log1p(const Scalar& x) {
+  EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  EIGEN_USING_STD(log);
+  Scalar x1p = RealScalar(1) + x;
+  Scalar log_1p = log_impl<Scalar>::run(x1p);
+  const bool is_small = numext::equal_strict(x1p, Scalar(1));
+  const bool is_inf = numext::equal_strict(x1p, log_1p);
+  return (is_small || is_inf) ? x : x * (log_1p / (x1p - RealScalar(1)));
 }
+}  // namespace std_fallback
 
-template<typename Scalar>
+template <typename Scalar>
 struct log1p_impl {
   EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
 
-  EIGEN_DEVICE_FUNC static inline Scalar run(const Scalar& x)
-  {
+  EIGEN_DEVICE_FUNC static inline Scalar run(const Scalar& x) {
     EIGEN_USING_STD(log1p);
     return log1p(x);
   }
@@ -634,51 +517,46 @@
 
 // Specialization for complex types that are not supported by std::log1p.
 template <typename RealScalar>
-struct log1p_impl<std::complex<RealScalar> > {
+struct log1p_impl<std::complex<RealScalar>> {
   EIGEN_STATIC_ASSERT_NON_INTEGER(RealScalar)
 
-  EIGEN_DEVICE_FUNC static inline std::complex<RealScalar> run(
-      const std::complex<RealScalar>& x) {
+  EIGEN_DEVICE_FUNC static inline std::complex<RealScalar> run(const std::complex<RealScalar>& x) {
     return std_fallback::log1p(x);
   }
 };
 
-template<typename Scalar>
-struct log1p_retval
-{
+template <typename Scalar>
+struct log1p_retval {
   typedef Scalar type;
 };
 
 /****************************************************************************
-* Implementation of pow                                                  *
-****************************************************************************/
+ * Implementation of pow                                                  *
+ ****************************************************************************/
 
-template<typename ScalarX,typename ScalarY, bool IsInteger = NumTraits<ScalarX>::IsInteger&&NumTraits<ScalarY>::IsInteger>
-struct pow_impl
-{
-  //typedef Scalar retval;
-  typedef typename ScalarBinaryOpTraits<ScalarX,ScalarY,internal::scalar_pow_op<ScalarX,ScalarY> >::ReturnType result_type;
-  static EIGEN_DEVICE_FUNC inline result_type run(const ScalarX& x, const ScalarY& y)
-  {
+template <typename ScalarX, typename ScalarY,
+          bool IsInteger = NumTraits<ScalarX>::IsInteger && NumTraits<ScalarY>::IsInteger>
+struct pow_impl {
+  // typedef Scalar retval;
+  typedef typename ScalarBinaryOpTraits<ScalarX, ScalarY, internal::scalar_pow_op<ScalarX, ScalarY>>::ReturnType
+      result_type;
+  static EIGEN_DEVICE_FUNC inline result_type run(const ScalarX& x, const ScalarY& y) {
     EIGEN_USING_STD(pow);
     return pow(x, y);
   }
 };
 
-template<typename ScalarX,typename ScalarY>
-struct pow_impl<ScalarX,ScalarY, true>
-{
+template <typename ScalarX, typename ScalarY>
+struct pow_impl<ScalarX, ScalarY, true> {
   typedef ScalarX result_type;
-  static EIGEN_DEVICE_FUNC inline ScalarX run(ScalarX x, ScalarY y)
-  {
+  static EIGEN_DEVICE_FUNC inline ScalarX run(ScalarX x, ScalarY y) {
     ScalarX res(1);
     eigen_assert(!NumTraits<ScalarY>::IsSigned || y >= 0);
-    if(y & 1) res *= x;
+    if (y & 1) res *= x;
     y >>= 1;
-    while(y)
-    {
+    while (y) {
       x *= x;
-      if(y&1) res *= x;
+      if (y & 1) res *= x;
       y >>= 1;
     }
     return res;
@@ -686,93 +564,74 @@
 };
 
 /****************************************************************************
-* Implementation of random                                               *
-****************************************************************************/
+ * Implementation of random                                               *
+ ****************************************************************************/
 
-template<typename Scalar,
-         bool IsComplex,
-         bool IsInteger>
+template <typename Scalar, bool IsComplex, bool IsInteger>
 struct random_default_impl {};
 
-template<typename Scalar>
+template <typename Scalar>
 struct random_impl : random_default_impl<Scalar, NumTraits<Scalar>::IsComplex, NumTraits<Scalar>::IsInteger> {};
 
-template<typename Scalar>
-struct random_retval
-{
+template <typename Scalar>
+struct random_retval {
   typedef Scalar type;
 };
 
-template<typename Scalar> inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random(const Scalar& x, const Scalar& y);
-template<typename Scalar> inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random();
+template <typename Scalar>
+inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random(const Scalar& x, const Scalar& y);
+template <typename Scalar>
+inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random();
 
-template<typename Scalar>
-struct random_default_impl<Scalar, false, false>
-{
-  static inline Scalar run(const Scalar& x, const Scalar& y)
-  {
-    return x + (y-x) * Scalar(std::rand()) / Scalar(RAND_MAX);
+template <typename Scalar>
+struct random_default_impl<Scalar, false, false> {
+  static inline Scalar run(const Scalar& x, const Scalar& y) {
+    return x + (y - x) * Scalar(std::rand()) / Scalar(RAND_MAX);
   }
-  static inline Scalar run()
-  {
-    return run(Scalar(NumTraits<Scalar>::IsSigned ? -1 : 0), Scalar(1));
-  }
+  static inline Scalar run() { return run(Scalar(NumTraits<Scalar>::IsSigned ? -1 : 0), Scalar(1)); }
 };
 
-enum {
-  meta_floor_log2_terminate,
-  meta_floor_log2_move_up,
-  meta_floor_log2_move_down,
-  meta_floor_log2_bogus
-};
+enum { meta_floor_log2_terminate, meta_floor_log2_move_up, meta_floor_log2_move_down, meta_floor_log2_bogus };
 
-template<unsigned int n, int lower, int upper> struct meta_floor_log2_selector
-{
-  enum { middle = (lower + upper) / 2,
-         value = (upper <= lower + 1) ? int(meta_floor_log2_terminate)
-               : (n < (1 << middle)) ? int(meta_floor_log2_move_down)
-               : (n==0) ? int(meta_floor_log2_bogus)
-               : int(meta_floor_log2_move_up)
+template <unsigned int n, int lower, int upper>
+struct meta_floor_log2_selector {
+  enum {
+    middle = (lower + upper) / 2,
+    value = (upper <= lower + 1)  ? int(meta_floor_log2_terminate)
+            : (n < (1 << middle)) ? int(meta_floor_log2_move_down)
+            : (n == 0)            ? int(meta_floor_log2_bogus)
+                                  : int(meta_floor_log2_move_up)
   };
 };
 
-template<unsigned int n,
-         int lower = 0,
-         int upper = sizeof(unsigned int) * CHAR_BIT - 1,
-         int selector = meta_floor_log2_selector<n, lower, upper>::value>
+template <unsigned int n, int lower = 0, int upper = sizeof(unsigned int) * CHAR_BIT - 1,
+          int selector = meta_floor_log2_selector<n, lower, upper>::value>
 struct meta_floor_log2 {};
 
-template<unsigned int n, int lower, int upper>
-struct meta_floor_log2<n, lower, upper, meta_floor_log2_move_down>
-{
+template <unsigned int n, int lower, int upper>
+struct meta_floor_log2<n, lower, upper, meta_floor_log2_move_down> {
   enum { value = meta_floor_log2<n, lower, meta_floor_log2_selector<n, lower, upper>::middle>::value };
 };
 
-template<unsigned int n, int lower, int upper>
-struct meta_floor_log2<n, lower, upper, meta_floor_log2_move_up>
-{
+template <unsigned int n, int lower, int upper>
+struct meta_floor_log2<n, lower, upper, meta_floor_log2_move_up> {
   enum { value = meta_floor_log2<n, meta_floor_log2_selector<n, lower, upper>::middle, upper>::value };
 };
 
-template<unsigned int n, int lower, int upper>
-struct meta_floor_log2<n, lower, upper, meta_floor_log2_terminate>
-{
-  enum { value = (n >= ((unsigned int)(1) << (lower+1))) ? lower+1 : lower };
+template <unsigned int n, int lower, int upper>
+struct meta_floor_log2<n, lower, upper, meta_floor_log2_terminate> {
+  enum { value = (n >= ((unsigned int)(1) << (lower + 1))) ? lower + 1 : lower };
 };
 
-template<unsigned int n, int lower, int upper>
-struct meta_floor_log2<n, lower, upper, meta_floor_log2_bogus>
-{
+template <unsigned int n, int lower, int upper>
+struct meta_floor_log2<n, lower, upper, meta_floor_log2_bogus> {
   // no value, error at compile time
 };
 
-template<typename Scalar>
-struct random_default_impl<Scalar, false, true>
-{
-  static inline Scalar run(const Scalar& x, const Scalar& y)
-  {
-    if (y <= x)
-      return x;
+template <typename Scalar>
+struct random_default_impl<Scalar, false, true> {
+  static inline Scalar run(const Scalar& x, const Scalar& y) {
+    if (y <= x) return x;
     // ScalarU is the unsigned counterpart of Scalar, possibly Scalar itself.
     typedef typename make_unsigned<Scalar>::type ScalarU;
     // ScalarX is the widest of ScalarU and unsigned int.
@@ -787,8 +646,10 @@
     ScalarX divisor = 1;
     ScalarX multiplier = 1;
     const unsigned rand_max = RAND_MAX;
-    if (range <= rand_max) divisor = (rand_max + 1) / (range + 1);
-    else                   multiplier = 1 + range / (rand_max + 1);
+    if (range <= rand_max)
+      divisor = (rand_max + 1) / (range + 1);
+    else
+      multiplier = 1 + range / (rand_max + 1);
     // Rejection sampling.
     do {
       offset = (unsigned(std::rand()) * multiplier) / divisor;
@@ -796,53 +657,46 @@
     return Scalar(ScalarX(x) + offset);
   }
 
-  static inline Scalar run()
-  {
+  static inline Scalar run() {
 #ifdef EIGEN_MAKING_DOCS
     return run(Scalar(NumTraits<Scalar>::IsSigned ? -10 : 0), Scalar(10));
 #else
-    enum { rand_bits = meta_floor_log2<(unsigned int)(RAND_MAX)+1>::value,
-           scalar_bits = sizeof(Scalar) * CHAR_BIT,
-           shift = plain_enum_max(0, int(rand_bits) - int(scalar_bits)),
-           offset = NumTraits<Scalar>::IsSigned ? (1 << (plain_enum_min(rand_bits, scalar_bits)-1)) : 0
+    enum {
+      rand_bits = meta_floor_log2<(unsigned int)(RAND_MAX) + 1>::value,
+      scalar_bits = sizeof(Scalar) * CHAR_BIT,
+      shift = plain_enum_max(0, int(rand_bits) - int(scalar_bits)),
+      offset = NumTraits<Scalar>::IsSigned ? (1 << (plain_enum_min(rand_bits, scalar_bits) - 1)) : 0
     };
     return Scalar((std::rand() >> shift) - offset);
 #endif
   }
 };
 
-template<typename Scalar>
-struct random_default_impl<Scalar, true, false>
-{
-  static inline Scalar run(const Scalar& x, const Scalar& y)
-  {
-    return Scalar(random(x.real(), y.real()),
-                  random(x.imag(), y.imag()));
+template <typename Scalar>
+struct random_default_impl<Scalar, true, false> {
+  static inline Scalar run(const Scalar& x, const Scalar& y) {
+    return Scalar(random(x.real(), y.real()), random(x.imag(), y.imag()));
   }
-  static inline Scalar run()
-  {
+  static inline Scalar run() {
     typedef typename NumTraits<Scalar>::Real RealScalar;
     return Scalar(random<RealScalar>(), random<RealScalar>());
   }
 };
 
-template<typename Scalar>
-inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random(const Scalar& x, const Scalar& y)
-{
+template <typename Scalar>
+inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random(const Scalar& x, const Scalar& y) {
   return EIGEN_MATHFUNC_IMPL(random, Scalar)::run(x, y);
 }
 
-template<typename Scalar>
-inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random()
-{
+template <typename Scalar>
+inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random() {
   return EIGEN_MATHFUNC_IMPL(random, Scalar)::run();
 }
 
 // Implementation of is* functions
 
 template <typename T>
-EIGEN_DEVICE_FUNC std::enable_if_t<!(std::numeric_limits<T>::has_infinity ||
-                                     std::numeric_limits<T>::has_quiet_NaN ||
+EIGEN_DEVICE_FUNC std::enable_if_t<!(std::numeric_limits<T>::has_infinity || std::numeric_limits<T>::has_quiet_NaN ||
                                      std::numeric_limits<T>::has_signaling_NaN),
                                    bool>
 isfinite_impl(const T&) {
@@ -856,40 +710,35 @@
                                    bool>
 isfinite_impl(const T& x) {
   EIGEN_USING_STD(isfinite);
-  return isfinite EIGEN_NOT_A_MACRO (x);
+  return isfinite EIGEN_NOT_A_MACRO(x);
 }
 
 template <typename T>
-EIGEN_DEVICE_FUNC std::enable_if_t<!std::numeric_limits<T>::has_infinity, bool>
-isinf_impl(const T&) {
+EIGEN_DEVICE_FUNC std::enable_if_t<!std::numeric_limits<T>::has_infinity, bool> isinf_impl(const T&) {
+  return false;
+}
+
+template <typename T>
+EIGEN_DEVICE_FUNC std::enable_if_t<(std::numeric_limits<T>::has_infinity && !NumTraits<T>::IsComplex), bool> isinf_impl(
+    const T& x) {
+  EIGEN_USING_STD(isinf);
+  return isinf EIGEN_NOT_A_MACRO(x);
+}
+
+template <typename T>
+EIGEN_DEVICE_FUNC
+    std::enable_if_t<!(std::numeric_limits<T>::has_quiet_NaN || std::numeric_limits<T>::has_signaling_NaN), bool>
+    isnan_impl(const T&) {
   return false;
 }
 
 template <typename T>
 EIGEN_DEVICE_FUNC std::enable_if_t<
-    (std::numeric_limits<T>::has_infinity && !NumTraits<T>::IsComplex), bool>
-isinf_impl(const T& x) {
-  EIGEN_USING_STD(isinf);
-  return isinf EIGEN_NOT_A_MACRO (x);
-}
-
-template <typename T>
-EIGEN_DEVICE_FUNC std::enable_if_t<!(std::numeric_limits<T>::has_quiet_NaN ||
-                                     std::numeric_limits<T>::has_signaling_NaN),
-                                   bool>
-isnan_impl(const T&) {
-  return false;
-}
-
-template <typename T>
-EIGEN_DEVICE_FUNC
-    std::enable_if_t<(std::numeric_limits<T>::has_quiet_NaN ||
-                      std::numeric_limits<T>::has_signaling_NaN) &&
-                         (!NumTraits<T>::IsComplex),
-                     bool>
-    isnan_impl(const T& x) {
+    (std::numeric_limits<T>::has_quiet_NaN || std::numeric_limits<T>::has_signaling_NaN) && (!NumTraits<T>::IsComplex),
+    bool>
+isnan_impl(const T& x) {
   EIGEN_USING_STD(isnan);
-  return isnan EIGEN_NOT_A_MACRO (x);
+  return isnan EIGEN_NOT_A_MACRO(x);
 }
 
 // The following overload are defined at the end of this file
@@ -908,25 +757,19 @@
 template <typename Scalar, bool IsComplex = (NumTraits<Scalar>::IsComplex != 0),
           bool IsInteger = (NumTraits<Scalar>::IsInteger != 0)>
 struct sign_impl {
-  EIGEN_DEVICE_FUNC
-  static inline Scalar run(const Scalar& a) {
-    return Scalar((a > Scalar(0)) - (a < Scalar(0)));
-  }
+  EIGEN_DEVICE_FUNC static inline Scalar run(const Scalar& a) { return Scalar((a > Scalar(0)) - (a < Scalar(0))); }
 };
 
 template <typename Scalar>
 struct sign_impl<Scalar, false, false> {
-  EIGEN_DEVICE_FUNC
-  static inline Scalar run(const Scalar& a) {
-    return (isnan_impl<Scalar>)(a) ? a
-                                   : Scalar((a > Scalar(0)) - (a < Scalar(0)));
+  EIGEN_DEVICE_FUNC static inline Scalar run(const Scalar& a) {
+    return (isnan_impl<Scalar>)(a) ? a : Scalar((a > Scalar(0)) - (a < Scalar(0)));
   }
 };
 
 template <typename Scalar, bool IsInteger>
 struct sign_impl<Scalar, true, IsInteger> {
-  EIGEN_DEVICE_FUNC
-  static inline Scalar run(const Scalar& a) {
+  EIGEN_DEVICE_FUNC static inline Scalar run(const Scalar& a) {
     using real_type = typename NumTraits<Scalar>::Real;
     EIGEN_USING_STD(abs);
     real_type aa = abs(a);
@@ -939,8 +782,7 @@
 // The sign function for bool is the identity.
 template <>
 struct sign_impl<bool, false, true> {
-  EIGEN_DEVICE_FUNC
-  static inline bool run(const bool& a) { return a; }
+  EIGEN_DEVICE_FUNC static inline bool run(const bool& a) { return a; }
 };
 
 template <typename Scalar>
@@ -948,13 +790,20 @@
   typedef Scalar type;
 };
 
-
 template <typename Scalar, bool IsInteger = NumTraits<typename unpacket_traits<Scalar>::type>::IsInteger>
 struct nearest_integer_impl {
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_floor(const Scalar& x) { EIGEN_USING_STD(floor) return floor(x); }
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_ceil(const Scalar& x) { EIGEN_USING_STD(ceil) return ceil(x); }
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_rint(const Scalar& x) { EIGEN_USING_STD(rint) return rint(x); }
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_round(const Scalar& x) { EIGEN_USING_STD(round) return round(x); }
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_floor(const Scalar& x) {
+    EIGEN_USING_STD(floor) return floor(x);
+  }
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_ceil(const Scalar& x) {
+    EIGEN_USING_STD(ceil) return ceil(x);
+  }
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_rint(const Scalar& x) {
+    EIGEN_USING_STD(rint) return rint(x);
+  }
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_round(const Scalar& x) {
+    EIGEN_USING_STD(round) return round(x);
+  }
 };
 template <typename Scalar>
 struct nearest_integer_impl<Scalar, true> {
@@ -964,55 +813,43 @@
   static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_round(const Scalar& x) { return x; }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /****************************************************************************
-* Generic math functions                                                    *
-****************************************************************************/
+ * Generic math functions                                                    *
+ ****************************************************************************/
 
 namespace numext {
 
 #if (!defined(EIGEN_GPUCC) || defined(EIGEN_CONSTEXPR_ARE_DEVICE_FUNC))
-template<typename T>
-EIGEN_DEVICE_FUNC
-EIGEN_ALWAYS_INLINE T mini(const T& x, const T& y)
-{
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T mini(const T& x, const T& y) {
   EIGEN_USING_STD(min)
-  return min EIGEN_NOT_A_MACRO (x,y);
+  return min EIGEN_NOT_A_MACRO(x, y);
 }
 
-template<typename T>
-EIGEN_DEVICE_FUNC
-EIGEN_ALWAYS_INLINE T maxi(const T& x, const T& y)
-{
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T maxi(const T& x, const T& y) {
   EIGEN_USING_STD(max)
-  return max EIGEN_NOT_A_MACRO (x,y);
+  return max EIGEN_NOT_A_MACRO(x, y);
 }
 #else
-template<typename T>
-EIGEN_DEVICE_FUNC
-EIGEN_ALWAYS_INLINE T mini(const T& x, const T& y)
-{
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T mini(const T& x, const T& y) {
   return y < x ? y : x;
 }
-template<>
-EIGEN_DEVICE_FUNC
-EIGEN_ALWAYS_INLINE float mini(const float& x, const float& y)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float mini(const float& x, const float& y) {
   return fminf(x, y);
 }
-template<>
-EIGEN_DEVICE_FUNC
-EIGEN_ALWAYS_INLINE double mini(const double& x, const double& y)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double mini(const double& x, const double& y) {
   return fmin(x, y);
 }
 
 #ifndef EIGEN_GPU_COMPILE_PHASE
-template<>
-EIGEN_DEVICE_FUNC
-EIGEN_ALWAYS_INLINE long double mini(const long double& x, const long double& y)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE long double mini(const long double& x, const long double& y) {
 #if defined(EIGEN_HIPCC)
   // no "fminl" on HIP yet
   return (x < y) ? x : y;
@@ -1022,29 +859,21 @@
 }
 #endif
 
-template<typename T>
-EIGEN_DEVICE_FUNC
-EIGEN_ALWAYS_INLINE T maxi(const T& x, const T& y)
-{
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T maxi(const T& x, const T& y) {
   return x < y ? y : x;
 }
-template<>
-EIGEN_DEVICE_FUNC
-EIGEN_ALWAYS_INLINE float maxi(const float& x, const float& y)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float maxi(const float& x, const float& y) {
   return fmaxf(x, y);
 }
-template<>
-EIGEN_DEVICE_FUNC
-EIGEN_ALWAYS_INLINE double maxi(const double& x, const double& y)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double maxi(const double& x, const double& y) {
   return fmax(x, y);
 }
 #ifndef EIGEN_GPU_COMPILE_PHASE
-template<>
-EIGEN_DEVICE_FUNC
-EIGEN_ALWAYS_INLINE long double maxi(const long double& x, const long double& y)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE long double maxi(const long double& x, const long double& y) {
 #if defined(EIGEN_HIPCC)
   // no "fmaxl" on HIP yet
   return (x > y) ? x : y;
@@ -1057,65 +886,60 @@
 
 #if defined(SYCL_DEVICE_ONLY)
 
-
 #define SYCL_SPECIALIZE_SIGNED_INTEGER_TYPES_BINARY(NAME, FUNC) \
-  SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_char)   \
-  SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_short)  \
-  SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_int)    \
+  SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_char)    \
+  SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_short)   \
+  SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_int)     \
   SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_long)
 #define SYCL_SPECIALIZE_SIGNED_INTEGER_TYPES_UNARY(NAME, FUNC) \
-  SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_char)   \
-  SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_short)  \
-  SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_int)    \
+  SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_char)    \
+  SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_short)   \
+  SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_int)     \
   SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_long)
 #define SYCL_SPECIALIZE_UNSIGNED_INTEGER_TYPES_BINARY(NAME, FUNC) \
-  SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_uchar)  \
-  SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_ushort) \
-  SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_uint)   \
+  SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_uchar)     \
+  SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_ushort)    \
+  SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_uint)      \
   SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_ulong)
 #define SYCL_SPECIALIZE_UNSIGNED_INTEGER_TYPES_UNARY(NAME, FUNC) \
-  SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_uchar)  \
-  SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_ushort) \
-  SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_uint)   \
+  SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_uchar)     \
+  SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_ushort)    \
+  SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_uint)      \
   SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_ulong)
-#define SYCL_SPECIALIZE_INTEGER_TYPES_BINARY(NAME, FUNC) \
+#define SYCL_SPECIALIZE_INTEGER_TYPES_BINARY(NAME, FUNC)  \
   SYCL_SPECIALIZE_SIGNED_INTEGER_TYPES_BINARY(NAME, FUNC) \
   SYCL_SPECIALIZE_UNSIGNED_INTEGER_TYPES_BINARY(NAME, FUNC)
-#define SYCL_SPECIALIZE_INTEGER_TYPES_UNARY(NAME, FUNC) \
+#define SYCL_SPECIALIZE_INTEGER_TYPES_UNARY(NAME, FUNC)  \
   SYCL_SPECIALIZE_SIGNED_INTEGER_TYPES_UNARY(NAME, FUNC) \
   SYCL_SPECIALIZE_UNSIGNED_INTEGER_TYPES_UNARY(NAME, FUNC)
-#define SYCL_SPECIALIZE_FLOATING_TYPES_BINARY(NAME, FUNC) \
+#define SYCL_SPECIALIZE_FLOATING_TYPES_BINARY(NAME, FUNC)     \
   SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_float) \
-  SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC,cl::sycl::cl_double)
-#define SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(NAME, FUNC) \
+  SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_double)
+#define SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(NAME, FUNC)     \
   SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_float) \
-  SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC,cl::sycl::cl_double)
+  SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_double)
 #define SYCL_SPECIALIZE_FLOATING_TYPES_UNARY_FUNC_RET_TYPE(NAME, FUNC, RET_TYPE) \
-  SYCL_SPECIALIZE_GEN_UNARY_FUNC(NAME, FUNC, RET_TYPE, cl::sycl::cl_float) \
+  SYCL_SPECIALIZE_GEN_UNARY_FUNC(NAME, FUNC, RET_TYPE, cl::sycl::cl_float)       \
   SYCL_SPECIALIZE_GEN_UNARY_FUNC(NAME, FUNC, RET_TYPE, cl::sycl::cl_double)
 
-#define SYCL_SPECIALIZE_GEN_UNARY_FUNC(NAME, FUNC, RET_TYPE, ARG_TYPE) \
-template<>                                               \
-  EIGEN_DEVICE_FUNC                                      \
-  EIGEN_ALWAYS_INLINE RET_TYPE NAME(const ARG_TYPE& x) { \
-    return cl::sycl::FUNC(x);                            \
+#define SYCL_SPECIALIZE_GEN_UNARY_FUNC(NAME, FUNC, RET_TYPE, ARG_TYPE)     \
+  template <>                                                              \
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE RET_TYPE NAME(const ARG_TYPE& x) { \
+    return cl::sycl::FUNC(x);                                              \
   }
 
-#define SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, TYPE) \
-  SYCL_SPECIALIZE_GEN_UNARY_FUNC(NAME, FUNC, TYPE, TYPE)
+#define SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, TYPE) SYCL_SPECIALIZE_GEN_UNARY_FUNC(NAME, FUNC, TYPE, TYPE)
 
-#define SYCL_SPECIALIZE_GEN1_BINARY_FUNC(NAME, FUNC, RET_TYPE, ARG_TYPE1, ARG_TYPE2) \
-  template<>                                                                  \
-  EIGEN_DEVICE_FUNC                                                           \
-  EIGEN_ALWAYS_INLINE RET_TYPE NAME(const ARG_TYPE1& x, const ARG_TYPE2& y) { \
-    return cl::sycl::FUNC(x, y);                                              \
+#define SYCL_SPECIALIZE_GEN1_BINARY_FUNC(NAME, FUNC, RET_TYPE, ARG_TYPE1, ARG_TYPE2)            \
+  template <>                                                                                   \
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE RET_TYPE NAME(const ARG_TYPE1& x, const ARG_TYPE2& y) { \
+    return cl::sycl::FUNC(x, y);                                                                \
   }
 
 #define SYCL_SPECIALIZE_GEN2_BINARY_FUNC(NAME, FUNC, RET_TYPE, ARG_TYPE) \
   SYCL_SPECIALIZE_GEN1_BINARY_FUNC(NAME, FUNC, RET_TYPE, ARG_TYPE, ARG_TYPE)
 
-#define SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, TYPE) \
-  SYCL_SPECIALIZE_GEN2_BINARY_FUNC(NAME, FUNC, TYPE, TYPE)
+#define SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, TYPE) SYCL_SPECIALIZE_GEN2_BINARY_FUNC(NAME, FUNC, TYPE, TYPE)
 
 SYCL_SPECIALIZE_INTEGER_TYPES_BINARY(mini, min)
 SYCL_SPECIALIZE_FLOATING_TYPES_BINARY(mini, fmin)
@@ -1124,130 +948,97 @@
 
 #endif
 
-
-template<typename Scalar>
-EIGEN_DEVICE_FUNC
-inline EIGEN_MATHFUNC_RETVAL(real, Scalar) real(const Scalar& x)
-{
+template <typename Scalar>
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(real, Scalar) real(const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(real, Scalar)::run(x);
 }
 
-template<typename Scalar>
-EIGEN_DEVICE_FUNC
-inline internal::add_const_on_value_type_t< EIGEN_MATHFUNC_RETVAL(real_ref, Scalar) > real_ref(const Scalar& x)
-{
+template <typename Scalar>
+EIGEN_DEVICE_FUNC inline internal::add_const_on_value_type_t<EIGEN_MATHFUNC_RETVAL(real_ref, Scalar)> real_ref(
+    const Scalar& x) {
   return internal::real_ref_impl<Scalar>::run(x);
 }
 
-template<typename Scalar>
-EIGEN_DEVICE_FUNC
-inline EIGEN_MATHFUNC_RETVAL(real_ref, Scalar) real_ref(Scalar& x)
-{
+template <typename Scalar>
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(real_ref, Scalar) real_ref(Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(real_ref, Scalar)::run(x);
 }
 
-template<typename Scalar>
-EIGEN_DEVICE_FUNC
-inline EIGEN_MATHFUNC_RETVAL(imag, Scalar) imag(const Scalar& x)
-{
+template <typename Scalar>
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(imag, Scalar) imag(const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(imag, Scalar)::run(x);
 }
 
-template<typename Scalar>
-EIGEN_DEVICE_FUNC
-inline EIGEN_MATHFUNC_RETVAL(arg, Scalar) arg(const Scalar& x)
-{
+template <typename Scalar>
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(arg, Scalar) arg(const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(arg, Scalar)::run(x);
 }
 
-template<typename Scalar>
-EIGEN_DEVICE_FUNC
-inline internal::add_const_on_value_type_t< EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar) > imag_ref(const Scalar& x)
-{
+template <typename Scalar>
+EIGEN_DEVICE_FUNC inline internal::add_const_on_value_type_t<EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar)> imag_ref(
+    const Scalar& x) {
   return internal::imag_ref_impl<Scalar>::run(x);
 }
 
-template<typename Scalar>
-EIGEN_DEVICE_FUNC
-inline EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar) imag_ref(Scalar& x)
-{
+template <typename Scalar>
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar) imag_ref(Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(imag_ref, Scalar)::run(x);
 }
 
-template<typename Scalar>
-EIGEN_DEVICE_FUNC
-inline EIGEN_MATHFUNC_RETVAL(conj, Scalar) conj(const Scalar& x)
-{
+template <typename Scalar>
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(conj, Scalar) conj(const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(conj, Scalar)::run(x);
 }
 
-template<typename Scalar>
-EIGEN_DEVICE_FUNC
-inline EIGEN_MATHFUNC_RETVAL(sign, Scalar) sign(const Scalar& x)
-{
+template <typename Scalar>
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(sign, Scalar) sign(const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(sign, Scalar)::run(x);
 }
 
-template<typename Scalar>
-EIGEN_DEVICE_FUNC
-inline EIGEN_MATHFUNC_RETVAL(abs2, Scalar) abs2(const Scalar& x)
-{
+template <typename Scalar>
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(abs2, Scalar) abs2(const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(abs2, Scalar)::run(x);
 }
 
-EIGEN_DEVICE_FUNC
-inline bool abs2(bool x) { return x; }
+EIGEN_DEVICE_FUNC inline bool abs2(bool x) { return x; }
 
-template<typename T>
-EIGEN_DEVICE_FUNC
-EIGEN_ALWAYS_INLINE T absdiff(const T& x, const T& y)
-{
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T absdiff(const T& x, const T& y) {
   return x > y ? x - y : y - x;
 }
-template<>
-EIGEN_DEVICE_FUNC
-EIGEN_ALWAYS_INLINE float absdiff(const float& x, const float& y)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float absdiff(const float& x, const float& y) {
   return fabsf(x - y);
 }
-template<>
-EIGEN_DEVICE_FUNC
-EIGEN_ALWAYS_INLINE double absdiff(const double& x, const double& y)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double absdiff(const double& x, const double& y) {
   return fabs(x - y);
 }
 
 // HIP and CUDA do not support long double.
 #ifndef EIGEN_GPU_COMPILE_PHASE
-template<>
-EIGEN_DEVICE_FUNC
-EIGEN_ALWAYS_INLINE long double absdiff(const long double& x, const long double& y) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE long double absdiff(const long double& x, const long double& y) {
   return fabsl(x - y);
 }
 #endif
 
-template<typename Scalar>
-EIGEN_DEVICE_FUNC
-inline EIGEN_MATHFUNC_RETVAL(norm1, Scalar) norm1(const Scalar& x)
-{
+template <typename Scalar>
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(norm1, Scalar) norm1(const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(norm1, Scalar)::run(x);
 }
 
-template<typename Scalar>
-EIGEN_DEVICE_FUNC
-inline EIGEN_MATHFUNC_RETVAL(hypot, Scalar) hypot(const Scalar& x, const Scalar& y)
-{
+template <typename Scalar>
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(hypot, Scalar) hypot(const Scalar& x, const Scalar& y) {
   return EIGEN_MATHFUNC_IMPL(hypot, Scalar)::run(x, y);
 }
 
 #if defined(SYCL_DEVICE_ONLY)
-  SYCL_SPECIALIZE_FLOATING_TYPES_BINARY(hypot, hypot)
+SYCL_SPECIALIZE_FLOATING_TYPES_BINARY(hypot, hypot)
 #endif
 
-template<typename Scalar>
-EIGEN_DEVICE_FUNC
-inline EIGEN_MATHFUNC_RETVAL(log1p, Scalar) log1p(const Scalar& x)
-{
+template <typename Scalar>
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(log1p, Scalar) log1p(const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(log1p, Scalar)::run(x);
 }
 
@@ -1256,27 +1047,39 @@
 #endif
 
 #if defined(EIGEN_GPUCC)
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-float log1p(const float &x) { return ::log1pf(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float log1p(const float& x) {
+  return ::log1pf(x);
+}
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-double log1p(const double &x) { return ::log1p(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double log1p(const double& x) {
+  return ::log1p(x);
+}
 #endif
 
-template<typename ScalarX,typename ScalarY>
-EIGEN_DEVICE_FUNC
-inline typename internal::pow_impl<ScalarX,ScalarY>::result_type pow(const ScalarX& x, const ScalarY& y)
-{
-  return internal::pow_impl<ScalarX,ScalarY>::run(x, y);
+template <typename ScalarX, typename ScalarY>
+EIGEN_DEVICE_FUNC inline typename internal::pow_impl<ScalarX, ScalarY>::result_type pow(const ScalarX& x,
+                                                                                        const ScalarY& y) {
+  return internal::pow_impl<ScalarX, ScalarY>::run(x, y);
 }
 
 #if defined(SYCL_DEVICE_ONLY)
 SYCL_SPECIALIZE_FLOATING_TYPES_BINARY(pow, pow)
 #endif
 
-template<typename T> EIGEN_DEVICE_FUNC bool (isnan)   (const T &x) { return internal::isnan_impl(x); }
-template<typename T> EIGEN_DEVICE_FUNC bool (isinf)   (const T &x) { return internal::isinf_impl(x); }
-template<typename T> EIGEN_DEVICE_FUNC bool (isfinite)(const T &x) { return internal::isfinite_impl(x); }
+template <typename T>
+EIGEN_DEVICE_FUNC bool(isnan)(const T& x) {
+  return internal::isnan_impl(x);
+}
+template <typename T>
+EIGEN_DEVICE_FUNC bool(isinf)(const T& x) {
+  return internal::isinf_impl(x);
+}
+template <typename T>
+EIGEN_DEVICE_FUNC bool(isfinite)(const T& x) {
+  return internal::isfinite_impl(x);
+}
 
 #if defined(SYCL_DEVICE_ONLY)
 SYCL_SPECIALIZE_FLOATING_TYPES_UNARY_FUNC_RET_TYPE(isnan, isnan, bool)
@@ -1284,17 +1087,13 @@
 SYCL_SPECIALIZE_FLOATING_TYPES_UNARY_FUNC_RET_TYPE(isfinite, isfinite, bool)
 #endif
 
-template<typename Scalar>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-Scalar rint(const Scalar& x)
-{
+template <typename Scalar>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar rint(const Scalar& x) {
   return internal::nearest_integer_impl<Scalar>::run_rint(x);
 }
 
-template<typename Scalar>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-Scalar round(const Scalar& x)
-{
+template <typename Scalar>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar round(const Scalar& x) {
   return internal::nearest_integer_impl<Scalar>::run_round(x);
 }
 
@@ -1302,10 +1101,8 @@
 SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(round, round)
 #endif
 
-template<typename Scalar>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-Scalar (floor)(const Scalar& x)
-{
+template <typename Scalar>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar(floor)(const Scalar& x) {
   return internal::nearest_integer_impl<Scalar>::run_floor(x);
 }
 
@@ -1314,17 +1111,19 @@
 #endif
 
 #if defined(EIGEN_GPUCC)
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-float floor(const float &x) { return ::floorf(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float floor(const float& x) {
+  return ::floorf(x);
+}
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-double floor(const double &x) { return ::floor(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double floor(const double& x) {
+  return ::floor(x);
+}
 #endif
 
-template<typename Scalar>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-Scalar (ceil)(const Scalar& x)
-{
+template <typename Scalar>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar(ceil)(const Scalar& x) {
   return internal::nearest_integer_impl<Scalar>::run_ceil(x);
 }
 
@@ -1333,20 +1132,21 @@
 #endif
 
 #if defined(EIGEN_GPUCC)
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-float ceil(const float &x) { return ::ceilf(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float ceil(const float& x) {
+  return ::ceilf(x);
+}
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-double ceil(const double &x) { return ::ceil(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double ceil(const double& x) {
+  return ::ceil(x);
+}
 #endif
 
-
 // Integer division with rounding up.
 // T is assumed to be an integer type with a>=0, and b>0
-template<typename T>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE EIGEN_CONSTEXPR
-T div_ceil(T a, T b)
-{
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE EIGEN_CONSTEXPR T div_ceil(T a, T b) {
   EIGEN_STATIC_ASSERT((NumTraits<T>::IsInteger), THIS FUNCTION IS FOR INTEGER TYPES)
   eigen_assert(a >= 0);
   eigen_assert(b > 0);
@@ -1355,12 +1155,12 @@
 }
 
 /** Log base 2 for 32 bits positive integers.
-  * Conveniently returns 0 for x==0. */
-inline int log2(int x)
-{
-  eigen_assert(x>=0);
+ * Conveniently returns 0 for x==0. */
+inline int log2(int x) {
+  eigen_assert(x >= 0);
   unsigned int v(x);
-  static const int table[32] = { 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30, 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31 };
+  static const int table[32] = {0, 9,  1,  10, 13, 21, 2,  29, 11, 14, 16, 18, 22, 25, 3, 30,
+                                8, 12, 20, 28, 15, 17, 24, 7,  19, 27, 23, 6,  26, 5,  4, 31};
   v |= v >> 1;
   v |= v >> 2;
   v |= v >> 4;
@@ -1370,49 +1170,44 @@
 }
 
 /** \returns the square root of \a x.
-  *
-  * It is essentially equivalent to
-  * \code using std::sqrt; return sqrt(x); \endcode
-  * but slightly faster for float/double and some compilers (e.g., gcc), thanks to
-  * specializations when SSE is enabled.
-  *
-  * It's usage is justified in performance critical functions, like norm/normalize.
-  */
-template<typename Scalar>
-EIGEN_DEVICE_FUNC
-EIGEN_ALWAYS_INLINE EIGEN_MATHFUNC_RETVAL(sqrt, Scalar) sqrt(const Scalar& x)
-{
+ *
+ * It is essentially equivalent to
+ * \code using std::sqrt; return sqrt(x); \endcode
+ * but slightly faster for float/double and some compilers (e.g., gcc), thanks to
+ * specializations when SSE is enabled.
+ *
+ * It's usage is justified in performance critical functions, like norm/normalize.
+ */
+template <typename Scalar>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE EIGEN_MATHFUNC_RETVAL(sqrt, Scalar) sqrt(const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(sqrt, Scalar)::run(x);
 }
 
 // Boolean specialization, avoids implicit float to bool conversion (-Wimplicit-conversion-floating-point-to-bool).
-template<>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_DEVICE_FUNC
-bool sqrt<bool>(const bool &x) { return x; }
+template <>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_DEVICE_FUNC bool sqrt<bool>(const bool& x) {
+  return x;
+}
 
 #if defined(SYCL_DEVICE_ONLY)
 SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(sqrt, sqrt)
 #endif
 
 /** \returns the cube root of \a x. **/
-template<typename T>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-T cbrt(const T &x) {
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T cbrt(const T& x) {
   EIGEN_USING_STD(cbrt);
   return static_cast<T>(cbrt(x));
 }
 
 /** \returns the reciprocal square root of \a x. **/
-template<typename T>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-T rsqrt(const T& x)
-{
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T rsqrt(const T& x) {
   return internal::rsqrt_impl<T>::run(x);
 }
 
-template<typename T>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-T log(const T &x) {
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T log(const T& x) {
   return internal::log_impl<T>::run(x);
 }
 
@@ -1420,27 +1215,30 @@
 SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(log, log)
 #endif
 
-
 #if defined(EIGEN_GPUCC)
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-float log(const float &x) { return ::logf(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float log(const float& x) {
+  return ::logf(x);
+}
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-double log(const double &x) { return ::log(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double log(const double& x) {
+  return ::log(x);
+}
 #endif
 
-template<typename T>
+template <typename T>
 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-std::enable_if_t<NumTraits<T>::IsSigned || NumTraits<T>::IsComplex,typename NumTraits<T>::Real>
-abs(const T &x) {
+    std::enable_if_t<NumTraits<T>::IsSigned || NumTraits<T>::IsComplex, typename NumTraits<T>::Real>
+    abs(const T& x) {
   EIGEN_USING_STD(abs);
   return abs(x);
 }
 
-template<typename T>
+template <typename T>
 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-std::enable_if_t<!(NumTraits<T>::IsSigned || NumTraits<T>::IsComplex),typename NumTraits<T>::Real>
-abs(const T &x) {
+    std::enable_if_t<!(NumTraits<T>::IsSigned || NumTraits<T>::IsComplex), typename NumTraits<T>::Real>
+    abs(const T& x) {
   return x;
 }
 
@@ -1450,19 +1248,23 @@
 #endif
 
 #if defined(EIGEN_GPUCC)
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-float abs(const float &x) { return ::fabsf(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float abs(const float& x) {
+  return ::fabsf(x);
+}
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-double abs(const double &x) { return ::fabs(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double abs(const double& x) {
+  return ::fabs(x);
+}
 
-template <> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-float abs(const std::complex<float>& x) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float abs(const std::complex<float>& x) {
   return ::hypotf(x.real(), x.imag());
 }
 
-template <> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-double abs(const std::complex<double>& x) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double abs(const std::complex<double>& x) {
   return ::hypot(x.real(), x.imag());
 }
 #endif
@@ -1489,18 +1291,15 @@
 };
 template <typename Scalar>
 struct signbit_impl<Scalar, true, false> {
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static constexpr Scalar run(const Scalar&  ) {
-    return Scalar(0);
-  }
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static constexpr Scalar run(const Scalar&) { return Scalar(0); }
 };
 template <typename Scalar>
 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static constexpr Scalar signbit(const Scalar& x) {
   return signbit_impl<Scalar>::run(x);
 }
 
-template<typename T>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-T exp(const T &x) {
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T exp(const T& x) {
   EIGEN_USING_STD(exp);
   return exp(x);
 }
@@ -1510,22 +1309,26 @@
 #endif
 
 #if defined(EIGEN_GPUCC)
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-float exp(const float &x) { return ::expf(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float exp(const float& x) {
+  return ::expf(x);
+}
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-double exp(const double &x) { return ::exp(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double exp(const double& x) {
+  return ::exp(x);
+}
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-std::complex<float> exp(const std::complex<float>& x) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE std::complex<float> exp(const std::complex<float>& x) {
   float com = ::expf(x.real());
   float res_real = com * ::cosf(x.imag());
   float res_imag = com * ::sinf(x.imag());
   return std::complex<float>(res_real, res_imag);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-std::complex<double> exp(const std::complex<double>& x) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE std::complex<double> exp(const std::complex<double>& x) {
   double com = ::exp(x.real());
   double res_real = com * ::cos(x.imag());
   double res_imag = com * ::sin(x.imag());
@@ -1533,10 +1336,8 @@
 }
 #endif
 
-template<typename Scalar>
-EIGEN_DEVICE_FUNC
-inline EIGEN_MATHFUNC_RETVAL(expm1, Scalar) expm1(const Scalar& x)
-{
+template <typename Scalar>
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(expm1, Scalar) expm1(const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(expm1, Scalar)::run(x);
 }
 
@@ -1545,35 +1346,41 @@
 #endif
 
 #if defined(EIGEN_GPUCC)
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-float expm1(const float &x) { return ::expm1f(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float expm1(const float& x) {
+  return ::expm1f(x);
+}
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-double expm1(const double &x) { return ::expm1(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double expm1(const double& x) {
+  return ::expm1(x);
+}
 #endif
 
-template<typename T>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-T cos(const T &x) {
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T cos(const T& x) {
   EIGEN_USING_STD(cos);
   return cos(x);
 }
 
 #if defined(SYCL_DEVICE_ONLY)
-SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(cos,cos)
+SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(cos, cos)
 #endif
 
 #if defined(EIGEN_GPUCC)
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-float cos(const float &x) { return ::cosf(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float cos(const float& x) {
+  return ::cosf(x);
+}
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-double cos(const double &x) { return ::cos(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double cos(const double& x) {
+  return ::cos(x);
+}
 #endif
 
-template<typename T>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-T sin(const T &x) {
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T sin(const T& x) {
   EIGEN_USING_STD(sin);
   return sin(x);
 }
@@ -1583,16 +1390,19 @@
 #endif
 
 #if defined(EIGEN_GPUCC)
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-float sin(const float &x) { return ::sinf(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float sin(const float& x) {
+  return ::sinf(x);
+}
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-double sin(const double &x) { return ::sin(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double sin(const double& x) {
+  return ::sin(x);
+}
 #endif
 
-template<typename T>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-T tan(const T &x) {
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T tan(const T& x) {
   EIGEN_USING_STD(tan);
   return tan(x);
 }
@@ -1602,23 +1412,25 @@
 #endif
 
 #if defined(EIGEN_GPUCC)
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-float tan(const float &x) { return ::tanf(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float tan(const float& x) {
+  return ::tanf(x);
+}
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-double tan(const double &x) { return ::tan(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double tan(const double& x) {
+  return ::tan(x);
+}
 #endif
 
-template<typename T>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-T acos(const T &x) {
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T acos(const T& x) {
   EIGEN_USING_STD(acos);
   return acos(x);
 }
 
-template<typename T>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-T acosh(const T &x) {
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T acosh(const T& x) {
   EIGEN_USING_STD(acosh);
   return static_cast<T>(acosh(x));
 }
@@ -1629,23 +1441,25 @@
 #endif
 
 #if defined(EIGEN_GPUCC)
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-float acos(const float &x) { return ::acosf(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float acos(const float& x) {
+  return ::acosf(x);
+}
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-double acos(const double &x) { return ::acos(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double acos(const double& x) {
+  return ::acos(x);
+}
 #endif
 
-template<typename T>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-T asin(const T &x) {
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T asin(const T& x) {
   EIGEN_USING_STD(asin);
   return asin(x);
 }
 
-template<typename T>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-T asinh(const T &x) {
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T asinh(const T& x) {
   EIGEN_USING_STD(asinh);
   return static_cast<T>(asinh(x));
 }
@@ -1656,16 +1470,19 @@
 #endif
 
 #if defined(EIGEN_GPUCC)
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-float asin(const float &x) { return ::asinf(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float asin(const float& x) {
+  return ::asinf(x);
+}
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-double asin(const double &x) { return ::asin(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double asin(const double& x) {
+  return ::asin(x);
+}
 #endif
 
-template<typename T>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-T atan(const T &x) {
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T atan(const T& x) {
   EIGEN_USING_STD(atan);
   return static_cast<T>(atan(x));
 }
@@ -1676,9 +1493,8 @@
   return static_cast<T>(atan2(y, x));
 }
 
-template<typename T>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-T atanh(const T &x) {
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T atanh(const T& x) {
   EIGEN_USING_STD(atanh);
   return static_cast<T>(atanh(x));
 }
@@ -1689,17 +1505,19 @@
 #endif
 
 #if defined(EIGEN_GPUCC)
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-float atan(const float &x) { return ::atanf(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float atan(const float& x) {
+  return ::atanf(x);
+}
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-double atan(const double &x) { return ::atan(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double atan(const double& x) {
+  return ::atan(x);
+}
 #endif
 
-
-template<typename T>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-T cosh(const T &x) {
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T cosh(const T& x) {
   EIGEN_USING_STD(cosh);
   return static_cast<T>(cosh(x));
 }
@@ -1709,16 +1527,19 @@
 #endif
 
 #if defined(EIGEN_GPUCC)
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-float cosh(const float &x) { return ::coshf(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float cosh(const float& x) {
+  return ::coshf(x);
+}
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-double cosh(const double &x) { return ::cosh(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double cosh(const double& x) {
+  return ::cosh(x);
+}
 #endif
 
-template<typename T>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-T sinh(const T &x) {
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T sinh(const T& x) {
   EIGEN_USING_STD(sinh);
   return static_cast<T>(sinh(x));
 }
@@ -1728,23 +1549,25 @@
 #endif
 
 #if defined(EIGEN_GPUCC)
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-float sinh(const float &x) { return ::sinhf(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float sinh(const float& x) {
+  return ::sinhf(x);
+}
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-double sinh(const double &x) { return ::sinh(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double sinh(const double& x) {
+  return ::sinh(x);
+}
 #endif
 
-template<typename T>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-T tanh(const T &x) {
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T tanh(const T& x) {
   EIGEN_USING_STD(tanh);
   return tanh(x);
 }
 
 #if (!defined(EIGEN_GPUCC)) && EIGEN_FAST_MATH && !defined(SYCL_DEVICE_ONLY)
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-float tanh(float x) { return internal::generic_fast_tanh_float(x); }
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float tanh(float x) { return internal::generic_fast_tanh_float(x); }
 #endif
 
 #if defined(SYCL_DEVICE_ONLY)
@@ -1752,16 +1575,19 @@
 #endif
 
 #if defined(EIGEN_GPUCC)
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-float tanh(const float &x) { return ::tanhf(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float tanh(const float& x) {
+  return ::tanhf(x);
+}
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-double tanh(const double &x) { return ::tanh(x); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double tanh(const double& x) {
+  return ::tanh(x);
+}
 #endif
 
 template <typename T>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-T fmod(const T& a, const T& b) {
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T fmod(const T& a, const T& b) {
   EIGEN_USING_STD(fmod);
   return fmod(a, b);
 }
@@ -1772,14 +1598,12 @@
 
 #if defined(EIGEN_GPUCC)
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-float fmod(const float& a, const float& b) {
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float fmod(const float& a, const float& b) {
   return ::fmodf(a, b);
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-double fmod(const double& a, const double& b) {
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double fmod(const double& a, const double& b) {
   return ::fmod(a, b);
 }
 #endif
@@ -1801,116 +1625,96 @@
 #undef SYCL_SPECIALIZE_BINARY_FUNC
 #endif
 
-} // end namespace numext
+}  // end namespace numext
 
 namespace internal {
 
-template<typename T>
-EIGEN_DEVICE_FUNC bool isfinite_impl(const std::complex<T>& x)
-{
+template <typename T>
+EIGEN_DEVICE_FUNC bool isfinite_impl(const std::complex<T>& x) {
   return (numext::isfinite)(numext::real(x)) && (numext::isfinite)(numext::imag(x));
 }
 
-template<typename T>
-EIGEN_DEVICE_FUNC bool isnan_impl(const std::complex<T>& x)
-{
+template <typename T>
+EIGEN_DEVICE_FUNC bool isnan_impl(const std::complex<T>& x) {
   return (numext::isnan)(numext::real(x)) || (numext::isnan)(numext::imag(x));
 }
 
-template<typename T>
-EIGEN_DEVICE_FUNC bool isinf_impl(const std::complex<T>& x)
-{
+template <typename T>
+EIGEN_DEVICE_FUNC bool isinf_impl(const std::complex<T>& x) {
   return ((numext::isinf)(numext::real(x)) || (numext::isinf)(numext::imag(x))) && (!(numext::isnan)(x));
 }
 
 /****************************************************************************
-* Implementation of fuzzy comparisons                                       *
-****************************************************************************/
+ * Implementation of fuzzy comparisons                                       *
+ ****************************************************************************/
 
-template<typename Scalar,
-         bool IsComplex,
-         bool IsInteger>
+template <typename Scalar, bool IsComplex, bool IsInteger>
 struct scalar_fuzzy_default_impl {};
 
-template<typename Scalar>
-struct scalar_fuzzy_default_impl<Scalar, false, false>
-{
+template <typename Scalar>
+struct scalar_fuzzy_default_impl<Scalar, false, false> {
   typedef typename NumTraits<Scalar>::Real RealScalar;
-  template<typename OtherScalar> EIGEN_DEVICE_FUNC
-  static inline bool isMuchSmallerThan(const Scalar& x, const OtherScalar& y, const RealScalar& prec)
-  {
+  template <typename OtherScalar>
+  EIGEN_DEVICE_FUNC static inline bool isMuchSmallerThan(const Scalar& x, const OtherScalar& y,
+                                                         const RealScalar& prec) {
     return numext::abs(x) <= numext::abs(y) * prec;
   }
-  EIGEN_DEVICE_FUNC
-  static inline bool isApprox(const Scalar& x, const Scalar& y, const RealScalar& prec)
-  {
+  EIGEN_DEVICE_FUNC static inline bool isApprox(const Scalar& x, const Scalar& y, const RealScalar& prec) {
     return numext::abs(x - y) <= numext::mini(numext::abs(x), numext::abs(y)) * prec;
   }
-  EIGEN_DEVICE_FUNC
-  static inline bool isApproxOrLessThan(const Scalar& x, const Scalar& y, const RealScalar& prec)
-  {
+  EIGEN_DEVICE_FUNC static inline bool isApproxOrLessThan(const Scalar& x, const Scalar& y, const RealScalar& prec) {
     return x <= y || isApprox(x, y, prec);
   }
 };
 
-template<typename Scalar>
-struct scalar_fuzzy_default_impl<Scalar, false, true>
-{
+template <typename Scalar>
+struct scalar_fuzzy_default_impl<Scalar, false, true> {
   typedef typename NumTraits<Scalar>::Real RealScalar;
-  template<typename OtherScalar> EIGEN_DEVICE_FUNC
-  static inline bool isMuchSmallerThan(const Scalar& x, const Scalar&, const RealScalar&)
-  {
+  template <typename OtherScalar>
+  EIGEN_DEVICE_FUNC static inline bool isMuchSmallerThan(const Scalar& x, const Scalar&, const RealScalar&) {
     return x == Scalar(0);
   }
-  EIGEN_DEVICE_FUNC
-  static inline bool isApprox(const Scalar& x, const Scalar& y, const RealScalar&)
-  {
-    return x == y;
-  }
-  EIGEN_DEVICE_FUNC
-  static inline bool isApproxOrLessThan(const Scalar& x, const Scalar& y, const RealScalar&)
-  {
+  EIGEN_DEVICE_FUNC static inline bool isApprox(const Scalar& x, const Scalar& y, const RealScalar&) { return x == y; }
+  EIGEN_DEVICE_FUNC static inline bool isApproxOrLessThan(const Scalar& x, const Scalar& y, const RealScalar&) {
     return x <= y;
   }
 };
 
-template<typename Scalar>
-struct scalar_fuzzy_default_impl<Scalar, true, false>
-{
+template <typename Scalar>
+struct scalar_fuzzy_default_impl<Scalar, true, false> {
   typedef typename NumTraits<Scalar>::Real RealScalar;
-  template<typename OtherScalar> EIGEN_DEVICE_FUNC
-  static inline bool isMuchSmallerThan(const Scalar& x, const OtherScalar& y, const RealScalar& prec)
-  {
+  template <typename OtherScalar>
+  EIGEN_DEVICE_FUNC static inline bool isMuchSmallerThan(const Scalar& x, const OtherScalar& y,
+                                                         const RealScalar& prec) {
     return numext::abs2(x) <= numext::abs2(y) * prec * prec;
   }
-  EIGEN_DEVICE_FUNC
-  static inline bool isApprox(const Scalar& x, const Scalar& y, const RealScalar& prec)
-  {
+  EIGEN_DEVICE_FUNC static inline bool isApprox(const Scalar& x, const Scalar& y, const RealScalar& prec) {
     return numext::abs2(x - y) <= numext::mini(numext::abs2(x), numext::abs2(y)) * prec * prec;
   }
 };
 
-template<typename Scalar>
-struct scalar_fuzzy_impl : scalar_fuzzy_default_impl<Scalar, NumTraits<Scalar>::IsComplex, NumTraits<Scalar>::IsInteger> {};
+template <typename Scalar>
+struct scalar_fuzzy_impl
+    : scalar_fuzzy_default_impl<Scalar, NumTraits<Scalar>::IsComplex, NumTraits<Scalar>::IsInteger> {};
 
-template<typename Scalar, typename OtherScalar> EIGEN_DEVICE_FUNC
-inline bool isMuchSmallerThan(const Scalar& x, const OtherScalar& y,
-                              const typename NumTraits<Scalar>::Real &precision = NumTraits<Scalar>::dummy_precision())
-{
+template <typename Scalar, typename OtherScalar>
+EIGEN_DEVICE_FUNC inline bool isMuchSmallerThan(
+    const Scalar& x, const OtherScalar& y,
+    const typename NumTraits<Scalar>::Real& precision = NumTraits<Scalar>::dummy_precision()) {
   return scalar_fuzzy_impl<Scalar>::template isMuchSmallerThan<OtherScalar>(x, y, precision);
 }
 
-template<typename Scalar> EIGEN_DEVICE_FUNC
-inline bool isApprox(const Scalar& x, const Scalar& y,
-                     const typename NumTraits<Scalar>::Real &precision = NumTraits<Scalar>::dummy_precision())
-{
+template <typename Scalar>
+EIGEN_DEVICE_FUNC inline bool isApprox(
+    const Scalar& x, const Scalar& y,
+    const typename NumTraits<Scalar>::Real& precision = NumTraits<Scalar>::dummy_precision()) {
   return scalar_fuzzy_impl<Scalar>::isApprox(x, y, precision);
 }
 
-template<typename Scalar> EIGEN_DEVICE_FUNC
-inline bool isApproxOrLessThan(const Scalar& x, const Scalar& y,
-                               const typename NumTraits<Scalar>::Real &precision = NumTraits<Scalar>::dummy_precision())
-{
+template <typename Scalar>
+EIGEN_DEVICE_FUNC inline bool isApproxOrLessThan(
+    const Scalar& x, const Scalar& y,
+    const typename NumTraits<Scalar>::Real& precision = NumTraits<Scalar>::dummy_precision()) {
   return scalar_fuzzy_impl<Scalar>::isApproxOrLessThan(x, y, precision);
 }
 
@@ -1918,55 +1722,40 @@
 ***  The special case of the  bool type ***
 ******************************************/
 
-template<> struct random_impl<bool>
-{
-  static inline bool run()
-  {
-    return random<int>(0,1)==0 ? false : true;
-  }
+template <>
+struct random_impl<bool> {
+  static inline bool run() { return random<int>(0, 1) == 0 ? false : true; }
 
-  static inline bool run(const bool& a, const bool& b)
-  {
-    return random<int>(a, b)==0 ? false : true;
-  }
+  static inline bool run(const bool& a, const bool& b) { return random<int>(a, b) == 0 ? false : true; }
 };
 
-template<> struct scalar_fuzzy_impl<bool>
-{
+template <>
+struct scalar_fuzzy_impl<bool> {
   typedef bool RealScalar;
 
-  template<typename OtherScalar> EIGEN_DEVICE_FUNC
-  static inline bool isMuchSmallerThan(const bool& x, const bool&, const bool&)
-  {
+  template <typename OtherScalar>
+  EIGEN_DEVICE_FUNC static inline bool isMuchSmallerThan(const bool& x, const bool&, const bool&) {
     return !x;
   }
 
-  EIGEN_DEVICE_FUNC
-  static inline bool isApprox(bool x, bool y, bool)
-  {
-    return x == y;
-  }
+  EIGEN_DEVICE_FUNC static inline bool isApprox(bool x, bool y, bool) { return x == y; }
 
-  EIGEN_DEVICE_FUNC
-  static inline bool isApproxOrLessThan(const bool& x, const bool& y, const bool&)
-  {
+  EIGEN_DEVICE_FUNC static inline bool isApproxOrLessThan(const bool& x, const bool& y, const bool&) {
     return (!x) || y;
   }
-
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 // Default implementations that rely on other numext implementations
 namespace internal {
 
 // Specialization for complex types that are not supported by std::expm1.
 template <typename RealScalar>
-struct expm1_impl<std::complex<RealScalar> > {
+struct expm1_impl<std::complex<RealScalar>> {
   EIGEN_STATIC_ASSERT_NON_INTEGER(RealScalar)
 
-  EIGEN_DEVICE_FUNC static inline std::complex<RealScalar> run(
-      const std::complex<RealScalar>& x) {
+  EIGEN_DEVICE_FUNC static inline std::complex<RealScalar> run(const std::complex<RealScalar>& x) {
     RealScalar xr = x.real();
     RealScalar xi = x.imag();
     // expm1(z) = exp(z) - 1
@@ -1988,28 +1777,22 @@
   }
 };
 
-template<typename T>
+template <typename T>
 struct rsqrt_impl {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_ALWAYS_INLINE T run(const T& x) {
-    return T(1)/numext::sqrt(x);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_ALWAYS_INLINE T run(const T& x) { return T(1) / numext::sqrt(x); }
 };
 
 #if defined(EIGEN_GPU_COMPILE_PHASE)
-template<typename T>
-struct conj_impl<std::complex<T>, true>
-{
-  EIGEN_DEVICE_FUNC
-  static inline std::complex<T> run(const std::complex<T>& x)
-  {
+template <typename T>
+struct conj_impl<std::complex<T>, true> {
+  EIGEN_DEVICE_FUNC static inline std::complex<T> run(const std::complex<T>& x) {
     return std::complex<T>(numext::real(x), -numext::imag(x));
   }
 };
 #endif
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_MATHFUNCTIONS_H
+#endif  // EIGEN_MATHFUNCTIONS_H
diff --git a/Eigen/src/Core/MathFunctionsImpl.h b/Eigen/src/Core/MathFunctionsImpl.h
index 5b29fee..ed44089 100644
--- a/Eigen/src/Core/MathFunctionsImpl.h
+++ b/Eigen/src/Core/MathFunctionsImpl.h
@@ -35,31 +35,27 @@
 template <typename Packet, int Steps>
 struct generic_reciprocal_newton_step {
   static_assert(Steps > 0, "Steps must be at least 1.");
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE  Packet
-  run(const Packet& a, const Packet& approx_a_recip) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Packet run(const Packet& a, const Packet& approx_a_recip) {
     using Scalar = typename unpacket_traits<Packet>::type;
     const Packet two = pset1<Packet>(Scalar(2));
     // Refine the approximation using one Newton-Raphson step:
     //   x_{i} = x_{i-1} * (2 - a * x_{i-1})
-     const Packet x =
-         generic_reciprocal_newton_step<Packet,Steps - 1>::run(a, approx_a_recip);
-     const Packet tmp = pnmadd(a, x, two);
-     // If tmp is NaN, it means that a is either +/-0 or +/-Inf.
-     // In this case return the approximation directly.
-     const Packet is_not_nan = pcmp_eq(tmp, tmp);
-     return pselect(is_not_nan, pmul(x, tmp), x);
+    const Packet x = generic_reciprocal_newton_step<Packet, Steps - 1>::run(a, approx_a_recip);
+    const Packet tmp = pnmadd(a, x, two);
+    // If tmp is NaN, it means that a is either +/-0 or +/-Inf.
+    // In this case return the approximation directly.
+    const Packet is_not_nan = pcmp_eq(tmp, tmp);
+    return pselect(is_not_nan, pmul(x, tmp), x);
   }
 };
 
-template<typename Packet>
+template <typename Packet>
 struct generic_reciprocal_newton_step<Packet, 0> {
-   EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Packet
-   run(const Packet& /*unused*/, const Packet& approx_rsqrt) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Packet run(const Packet& /*unused*/, const Packet& approx_rsqrt) {
     return approx_rsqrt;
   }
 };
 
-
 /** \internal Fast reciprocal sqrt using Newton-Raphson's method.
 
  Preconditions:
@@ -79,9 +75,8 @@
 struct generic_rsqrt_newton_step {
   static_assert(Steps > 0, "Steps must be at least 1.");
   using Scalar = typename unpacket_traits<Packet>::type;
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Packet
-  run(const Packet& a, const Packet& approx_rsqrt) {
-    constexpr Scalar kMinusHalf = Scalar(-1)/Scalar(2);
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Packet run(const Packet& a, const Packet& approx_rsqrt) {
+    constexpr Scalar kMinusHalf = Scalar(-1) / Scalar(2);
     const Packet cst_minus_half = pset1<Packet>(kMinusHalf);
     const Packet cst_minus_one = pset1<Packet>(Scalar(-1));
 
@@ -104,10 +99,9 @@
   }
 };
 
-template<typename Packet>
+template <typename Packet>
 struct generic_rsqrt_newton_step<Packet, 0> {
-   EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Packet
-   run(const Packet& /*unused*/, const Packet& approx_rsqrt) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Packet run(const Packet& /*unused*/, const Packet& approx_rsqrt) {
     return approx_rsqrt;
   }
 };
@@ -127,12 +121,11 @@
    and correctly handles zero and infinity, and NaN. Positive denormal inputs
    are treated as zero.
 */
-template <typename Packet, int Steps=1>
+template <typename Packet, int Steps = 1>
 struct generic_sqrt_newton_step {
   static_assert(Steps > 0, "Steps must be at least 1.");
 
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE  Packet
-  run(const Packet& a, const Packet& approx_rsqrt) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Packet run(const Packet& a, const Packet& approx_rsqrt) {
     using Scalar = typename unpacket_traits<Packet>::type;
     const Packet one_point_five = pset1<Packet>(Scalar(1.5));
     const Packet minus_half = pset1<Packet>(Scalar(-0.5));
@@ -163,9 +156,8 @@
 
     This implementation works on both scalars and packets.
 */
-template<typename T>
-T generic_fast_tanh_float(const T& a_x)
-{
+template <typename T>
+T generic_fast_tanh_float(const T& a_x) {
   // Clamp the inputs to the range [-c, c]
 #ifdef EIGEN_VECTORIZE_FMA
   const T plus_clamp = pset1<T>(7.99881172180175781f);
@@ -213,31 +205,24 @@
   return pselect(tiny_mask, x, pdiv(p, q));
 }
 
-template<typename RealScalar>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-RealScalar positive_real_hypot(const RealScalar& x, const RealScalar& y)
-{
+template <typename RealScalar>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE RealScalar positive_real_hypot(const RealScalar& x, const RealScalar& y) {
   // IEEE IEC 6059 special cases.
-  if ((numext::isinf)(x) || (numext::isinf)(y))
-    return NumTraits<RealScalar>::infinity();
-  if ((numext::isnan)(x) || (numext::isnan)(y))
-    return NumTraits<RealScalar>::quiet_NaN();
-    
+  if ((numext::isinf)(x) || (numext::isinf)(y)) return NumTraits<RealScalar>::infinity();
+  if ((numext::isnan)(x) || (numext::isnan)(y)) return NumTraits<RealScalar>::quiet_NaN();
+
   EIGEN_USING_STD(sqrt);
   RealScalar p, qp;
-  p = numext::maxi(x,y);
-  if(numext::is_exactly_zero(p)) return RealScalar(0);
-  qp = numext::mini(y,x) / p;
-  return p * sqrt(RealScalar(1) + qp*qp);
+  p = numext::maxi(x, y);
+  if (numext::is_exactly_zero(p)) return RealScalar(0);
+  qp = numext::mini(y, x) / p;
+  return p * sqrt(RealScalar(1) + qp * qp);
 }
 
-template<typename Scalar>
-struct hypot_impl
-{
+template <typename Scalar>
+struct hypot_impl {
   typedef typename NumTraits<Scalar>::Real RealScalar;
-  static EIGEN_DEVICE_FUNC
-  inline RealScalar run(const Scalar& x, const Scalar& y)
-  {
+  static EIGEN_DEVICE_FUNC inline RealScalar run(const Scalar& x, const Scalar& y) {
     EIGEN_USING_STD(abs);
     return positive_real_hypot<RealScalar>(abs(x), abs(y));
   }
@@ -245,7 +230,7 @@
 
 // Generic complex sqrt implementation that correctly handles corner cases
 // according to https://en.cppreference.com/w/cpp/numeric/complex/sqrt
-template<typename T>
+template <typename T>
 EIGEN_DEVICE_FUNC std::complex<T> complex_sqrt(const std::complex<T>& z) {
   // Computes the principal sqrt of the input.
   //
@@ -274,15 +259,14 @@
   const T zero = T(0);
   const T w = numext::sqrt(T(0.5) * (numext::abs(x) + numext::hypot(x, y)));
 
-  return
-    (numext::isinf)(y) ? std::complex<T>(NumTraits<T>::infinity(), y)
-      : numext::is_exactly_zero(x) ? std::complex<T>(w, y < zero ? -w : w)
-                                   : x > zero ? std::complex<T>(w, y / (2 * w))
-      : std::complex<T>(numext::abs(y) / (2 * w), y < zero ? -w : w );
+  return (numext::isinf)(y)           ? std::complex<T>(NumTraits<T>::infinity(), y)
+         : numext::is_exactly_zero(x) ? std::complex<T>(w, y < zero ? -w : w)
+         : x > zero                   ? std::complex<T>(w, y / (2 * w))
+                                      : std::complex<T>(numext::abs(y) / (2 * w), y < zero ? -w : w);
 }
 
 // Generic complex rsqrt implementation.
-template<typename T>
+template <typename T>
 EIGEN_DEVICE_FUNC std::complex<T> complex_rsqrt(const std::complex<T>& z) {
   // Computes the principal reciprocal sqrt of the input.
   //
@@ -314,15 +298,14 @@
   const T w = numext::sqrt(T(0.5) * (numext::abs(x) + abs_z));
   const T woz = w / abs_z;
   // Corner cases consistent with 1/sqrt(z) on gcc/clang.
-  return
-          numext::is_exactly_zero(abs_z) ? std::complex<T>(NumTraits<T>::infinity(), NumTraits<T>::quiet_NaN())
-                                         : ((numext::isinf)(x) || (numext::isinf)(y)) ? std::complex<T>(zero, zero)
-      : numext::is_exactly_zero(x) ? std::complex<T>(woz, y < zero ? woz : -woz)
-                                   : x > zero ? std::complex<T>(woz, -y / (2 * w * abs_z))
-      : std::complex<T>(numext::abs(y) / (2 * w * abs_z), y < zero ? woz : -woz );
+  return numext::is_exactly_zero(abs_z) ? std::complex<T>(NumTraits<T>::infinity(), NumTraits<T>::quiet_NaN())
+         : ((numext::isinf)(x) || (numext::isinf)(y)) ? std::complex<T>(zero, zero)
+         : numext::is_exactly_zero(x)                 ? std::complex<T>(woz, y < zero ? woz : -woz)
+         : x > zero                                   ? std::complex<T>(woz, -y / (2 * w * abs_z))
+                    : std::complex<T>(numext::abs(y) / (2 * w * abs_z), y < zero ? woz : -woz);
 }
 
-template<typename T>
+template <typename T>
 EIGEN_DEVICE_FUNC std::complex<T> complex_log(const std::complex<T>& z) {
   // Computes complex log.
   T a = numext::abs(z);
@@ -331,8 +314,8 @@
   return std::complex<T>(numext::log(a), b);
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_MATHFUNCTIONSIMPL_H
+#endif  // EIGEN_MATHFUNCTIONSIMPL_H
diff --git a/Eigen/src/Core/Matrix.h b/Eigen/src/Core/Matrix.h
index 91008f8..ce0e4e6 100644
--- a/Eigen/src/Core/Matrix.h
+++ b/Eigen/src/Core/Matrix.h
@@ -17,23 +17,25 @@
 namespace Eigen {
 
 namespace internal {
-template<typename Scalar_, int Rows_, int Cols_, int Options_, int MaxRows_, int MaxCols_>
-struct traits<Matrix<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_> >
-{
-private:
-  constexpr static int size = internal::size_at_compile_time(Rows_,Cols_);
-  typedef typename find_best_packet<Scalar_,size>::type PacketScalar;
+template <typename Scalar_, int Rows_, int Cols_, int Options_, int MaxRows_, int MaxCols_>
+struct traits<Matrix<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_>> {
+ private:
+  constexpr static int size = internal::size_at_compile_time(Rows_, Cols_);
+  typedef typename find_best_packet<Scalar_, size>::type PacketScalar;
   enum {
-      row_major_bit = Options_&RowMajor ? RowMajorBit : 0,
-      is_dynamic_size_storage = MaxRows_==Dynamic || MaxCols_==Dynamic,
-      max_size = is_dynamic_size_storage ? Dynamic : MaxRows_*MaxCols_,
-      default_alignment = compute_default_alignment<Scalar_,max_size>::value,
-      actual_alignment = ((Options_&DontAlign)==0) ? default_alignment : 0,
-      required_alignment = unpacket_traits<PacketScalar>::alignment,
-      packet_access_bit = (packet_traits<Scalar_>::Vectorizable && (EIGEN_UNALIGNED_VECTORIZE || (actual_alignment>=required_alignment))) ? PacketAccessBit : 0
-    };
+    row_major_bit = Options_ & RowMajor ? RowMajorBit : 0,
+    is_dynamic_size_storage = MaxRows_ == Dynamic || MaxCols_ == Dynamic,
+    max_size = is_dynamic_size_storage ? Dynamic : MaxRows_ * MaxCols_,
+    default_alignment = compute_default_alignment<Scalar_, max_size>::value,
+    actual_alignment = ((Options_ & DontAlign) == 0) ? default_alignment : 0,
+    required_alignment = unpacket_traits<PacketScalar>::alignment,
+    packet_access_bit = (packet_traits<Scalar_>::Vectorizable &&
+                         (EIGEN_UNALIGNED_VECTORIZE || (actual_alignment >= required_alignment)))
+                            ? PacketAccessBit
+                            : 0
+  };
 
-public:
+ public:
   typedef Scalar_ Scalar;
   typedef Dense StorageKind;
   typedef Eigen::Index StorageIndex;
@@ -46,491 +48,458 @@
     Flags = compute_matrix_flags(Options_),
     Options = Options_,
     InnerStrideAtCompileTime = 1,
-    OuterStrideAtCompileTime = (Options&RowMajor) ? ColsAtCompileTime : RowsAtCompileTime,
+    OuterStrideAtCompileTime = (Options & RowMajor) ? ColsAtCompileTime : RowsAtCompileTime,
 
     // FIXME, the following flag in only used to define NeedsToAlign in PlainObjectBase
     EvaluatorFlags = LinearAccessBit | DirectAccessBit | packet_access_bit | row_major_bit,
     Alignment = actual_alignment
   };
 };
-}
+}  // namespace internal
 
 /** \class Matrix
-  * \ingroup Core_Module
-  *
-  * \brief The matrix class, also used for vectors and row-vectors
-  *
-  * The %Matrix class is the work-horse for all \em dense (\ref dense "note") matrices and vectors within Eigen.
-  * Vectors are matrices with one column, and row-vectors are matrices with one row.
-  *
-  * The %Matrix class encompasses \em both fixed-size and dynamic-size objects (\ref fixedsize "note").
-  *
-  * The first three template parameters are required:
-  * \tparam Scalar_ Numeric type, e.g. float, double, int or std::complex<float>.
-  *                 User defined scalar types are supported as well (see \ref user_defined_scalars "here").
-  * \tparam Rows_ Number of rows, or \b Dynamic
-  * \tparam Cols_ Number of columns, or \b Dynamic
-  *
-  * The remaining template parameters are optional -- in most cases you don't have to worry about them.
-  * \tparam Options_ A combination of either \b #RowMajor or \b #ColMajor, and of either
-  *                 \b #AutoAlign or \b #DontAlign.
-  *                 The former controls \ref TopicStorageOrders "storage order", and defaults to column-major. The latter controls alignment, which is required
-  *                 for vectorization. It defaults to aligning matrices except for fixed sizes that aren't a multiple of the packet size.
-  * \tparam MaxRows_ Maximum number of rows. Defaults to \a Rows_ (\ref maxrows "note").
-  * \tparam MaxCols_ Maximum number of columns. Defaults to \a Cols_ (\ref maxrows "note").
-  *
-  * Eigen provides a number of typedefs covering the usual cases. Here are some examples:
-  *
-  * \li \c Matrix2d is a 2x2 square matrix of doubles (\c Matrix<double, 2, 2>)
-  * \li \c Vector4f is a vector of 4 floats (\c Matrix<float, 4, 1>)
-  * \li \c RowVector3i is a row-vector of 3 ints (\c Matrix<int, 1, 3>)
-  *
-  * \li \c MatrixXf is a dynamic-size matrix of floats (\c Matrix<float, Dynamic, Dynamic>)
-  * \li \c VectorXf is a dynamic-size vector of floats (\c Matrix<float, Dynamic, 1>)
-  *
-  * \li \c Matrix2Xf is a partially fixed-size (dynamic-size) matrix of floats (\c Matrix<float, 2, Dynamic>)
-  * \li \c MatrixX3d is a partially dynamic-size (fixed-size) matrix of double (\c Matrix<double, Dynamic, 3>)
-  *
-  * See \link matrixtypedefs this page \endlink for a complete list of predefined \em %Matrix and \em Vector typedefs.
-  *
-  * You can access elements of vectors and matrices using normal subscripting:
-  *
-  * \code
-  * Eigen::VectorXd v(10);
-  * v[0] = 0.1;
-  * v[1] = 0.2;
-  * v(0) = 0.3;
-  * v(1) = 0.4;
-  *
-  * Eigen::MatrixXi m(10, 10);
-  * m(0, 1) = 1;
-  * m(0, 2) = 2;
-  * m(0, 3) = 3;
-  * \endcode
-  *
-  * This class can be extended with the help of the plugin mechanism described on the page
-  * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_MATRIX_PLUGIN.
-  *
-  * <i><b>Some notes:</b></i>
-  *
-  * <dl>
-  * <dt><b>\anchor dense Dense versus sparse:</b></dt>
-  * <dd>This %Matrix class handles dense, not sparse matrices and vectors. For sparse matrices and vectors, see the Sparse module.
-  *
-  * Dense matrices and vectors are plain usual arrays of coefficients. All the coefficients are stored, in an ordinary contiguous array.
-  * This is unlike Sparse matrices and vectors where the coefficients are stored as a list of nonzero coefficients.</dd>
-  *
-  * <dt><b>\anchor fixedsize Fixed-size versus dynamic-size:</b></dt>
-  * <dd>Fixed-size means that the numbers of rows and columns are known are compile-time. In this case, Eigen allocates the array
-  * of coefficients as a fixed-size array, as a class member. This makes sense for very small matrices, typically up to 4x4, sometimes up
-  * to 16x16. Larger matrices should be declared as dynamic-size even if one happens to know their size at compile-time.
-  *
-  * Dynamic-size means that the numbers of rows or columns are not necessarily known at compile-time. In this case they are runtime
-  * variables, and the array of coefficients is allocated dynamically on the heap.
-  *
-  * Note that \em dense matrices, be they Fixed-size or Dynamic-size, <em>do not</em> expand dynamically in the sense of a std::map.
-  * If you want this behavior, see the Sparse module.</dd>
-  *
-  * <dt><b>\anchor maxrows MaxRows_ and MaxCols_:</b></dt>
-  * <dd>In most cases, one just leaves these parameters to the default values.
-  * These parameters mean the maximum size of rows and columns that the matrix may have. They are useful in cases
-  * when the exact numbers of rows and columns are not known are compile-time, but it is known at compile-time that they cannot
-  * exceed a certain value. This happens when taking dynamic-size blocks inside fixed-size matrices: in this case MaxRows_ and MaxCols_
-  * are the dimensions of the original matrix, while Rows_ and Cols_ are Dynamic.</dd>
-  * </dl>
-  *
-  * <i><b>ABI and storage layout</b></i>
-  *
-  * The table below summarizes the ABI of some possible Matrix instances which is fixed thorough the lifetime of Eigen 3.
-  * <table  class="manual">
-  * <tr><th>Matrix type</th><th>Equivalent C structure</th></tr>
-  * <tr><td>\code Matrix<T,Dynamic,Dynamic> \endcode</td><td>\code
-  * struct {
-  *   T *data;                  // with (size_t(data)%EIGEN_MAX_ALIGN_BYTES)==0
-  *   Eigen::Index rows, cols;
-  *  };
-  * \endcode</td></tr>
-  * <tr class="alt"><td>\code
-  * Matrix<T,Dynamic,1>
-  * Matrix<T,1,Dynamic> \endcode</td><td>\code
-  * struct {
-  *   T *data;                  // with (size_t(data)%EIGEN_MAX_ALIGN_BYTES)==0
-  *   Eigen::Index size;
-  *  };
-  * \endcode</td></tr>
-  * <tr><td>\code Matrix<T,Rows,Cols> \endcode</td><td>\code
-  * struct {
-  *   T data[Rows*Cols];        // with (size_t(data)%A(Rows*Cols*sizeof(T)))==0
-  *  };
-  * \endcode</td></tr>
-  * <tr class="alt"><td>\code Matrix<T,Dynamic,Dynamic,0,MaxRows,MaxCols> \endcode</td><td>\code
-  * struct {
-  *   T data[MaxRows*MaxCols];  // with (size_t(data)%A(MaxRows*MaxCols*sizeof(T)))==0
-  *   Eigen::Index rows, cols;
-  *  };
-  * \endcode</td></tr>
-  * </table>
-  * Note that in this table Rows, Cols, MaxRows and MaxCols are all positive integers. A(S) is defined to the largest possible power-of-two
-  * smaller to EIGEN_MAX_STATIC_ALIGN_BYTES.
-  *
-  * \see MatrixBase for the majority of the API methods for matrices, \ref TopicClassHierarchy,
-  * \ref TopicStorageOrders
-  */
+ * \ingroup Core_Module
+ *
+ * \brief The matrix class, also used for vectors and row-vectors
+ *
+ * The %Matrix class is the work-horse for all \em dense (\ref dense "note") matrices and vectors within Eigen.
+ * Vectors are matrices with one column, and row-vectors are matrices with one row.
+ *
+ * The %Matrix class encompasses \em both fixed-size and dynamic-size objects (\ref fixedsize "note").
+ *
+ * The first three template parameters are required:
+ * \tparam Scalar_ Numeric type, e.g. float, double, int or std::complex<float>.
+ *                 User defined scalar types are supported as well (see \ref user_defined_scalars "here").
+ * \tparam Rows_ Number of rows, or \b Dynamic
+ * \tparam Cols_ Number of columns, or \b Dynamic
+ *
+ * The remaining template parameters are optional -- in most cases you don't have to worry about them.
+ * \tparam Options_ A combination of either \b #RowMajor or \b #ColMajor, and of either
+ *                 \b #AutoAlign or \b #DontAlign.
+ *                 The former controls \ref TopicStorageOrders "storage order", and defaults to column-major. The latter
+ * controls alignment, which is required for vectorization. It defaults to aligning matrices except for fixed sizes that
+ * aren't a multiple of the packet size. \tparam MaxRows_ Maximum number of rows. Defaults to \a Rows_ (\ref maxrows
+ * "note"). \tparam MaxCols_ Maximum number of columns. Defaults to \a Cols_ (\ref maxrows "note").
+ *
+ * Eigen provides a number of typedefs covering the usual cases. Here are some examples:
+ *
+ * \li \c Matrix2d is a 2x2 square matrix of doubles (\c Matrix<double, 2, 2>)
+ * \li \c Vector4f is a vector of 4 floats (\c Matrix<float, 4, 1>)
+ * \li \c RowVector3i is a row-vector of 3 ints (\c Matrix<int, 1, 3>)
+ *
+ * \li \c MatrixXf is a dynamic-size matrix of floats (\c Matrix<float, Dynamic, Dynamic>)
+ * \li \c VectorXf is a dynamic-size vector of floats (\c Matrix<float, Dynamic, 1>)
+ *
+ * \li \c Matrix2Xf is a partially fixed-size (dynamic-size) matrix of floats (\c Matrix<float, 2, Dynamic>)
+ * \li \c MatrixX3d is a partially dynamic-size (fixed-size) matrix of double (\c Matrix<double, Dynamic, 3>)
+ *
+ * See \link matrixtypedefs this page \endlink for a complete list of predefined \em %Matrix and \em Vector typedefs.
+ *
+ * You can access elements of vectors and matrices using normal subscripting:
+ *
+ * \code
+ * Eigen::VectorXd v(10);
+ * v[0] = 0.1;
+ * v[1] = 0.2;
+ * v(0) = 0.3;
+ * v(1) = 0.4;
+ *
+ * Eigen::MatrixXi m(10, 10);
+ * m(0, 1) = 1;
+ * m(0, 2) = 2;
+ * m(0, 3) = 3;
+ * \endcode
+ *
+ * This class can be extended with the help of the plugin mechanism described on the page
+ * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_MATRIX_PLUGIN.
+ *
+ * <i><b>Some notes:</b></i>
+ *
+ * <dl>
+ * <dt><b>\anchor dense Dense versus sparse:</b></dt>
+ * <dd>This %Matrix class handles dense, not sparse matrices and vectors. For sparse matrices and vectors, see the
+ * Sparse module.
+ *
+ * Dense matrices and vectors are plain usual arrays of coefficients. All the coefficients are stored, in an ordinary
+ * contiguous array. This is unlike Sparse matrices and vectors where the coefficients are stored as a list of nonzero
+ * coefficients.</dd>
+ *
+ * <dt><b>\anchor fixedsize Fixed-size versus dynamic-size:</b></dt>
+ * <dd>Fixed-size means that the numbers of rows and columns are known are compile-time. In this case, Eigen allocates
+ * the array of coefficients as a fixed-size array, as a class member. This makes sense for very small matrices,
+ * typically up to 4x4, sometimes up to 16x16. Larger matrices should be declared as dynamic-size even if one happens to
+ * know their size at compile-time.
+ *
+ * Dynamic-size means that the numbers of rows or columns are not necessarily known at compile-time. In this case they
+ * are runtime variables, and the array of coefficients is allocated dynamically on the heap.
+ *
+ * Note that \em dense matrices, be they Fixed-size or Dynamic-size, <em>do not</em> expand dynamically in the sense of
+ * a std::map. If you want this behavior, see the Sparse module.</dd>
+ *
+ * <dt><b>\anchor maxrows MaxRows_ and MaxCols_:</b></dt>
+ * <dd>In most cases, one just leaves these parameters to the default values.
+ * These parameters mean the maximum size of rows and columns that the matrix may have. They are useful in cases
+ * when the exact numbers of rows and columns are not known are compile-time, but it is known at compile-time that they
+ * cannot exceed a certain value. This happens when taking dynamic-size blocks inside fixed-size matrices: in this case
+ * MaxRows_ and MaxCols_ are the dimensions of the original matrix, while Rows_ and Cols_ are Dynamic.</dd>
+ * </dl>
+ *
+ * <i><b>ABI and storage layout</b></i>
+ *
+ * The table below summarizes the ABI of some possible Matrix instances which is fixed thorough the lifetime of Eigen 3.
+ * <table  class="manual">
+ * <tr><th>Matrix type</th><th>Equivalent C structure</th></tr>
+ * <tr><td>\code Matrix<T,Dynamic,Dynamic> \endcode</td><td>\code
+ * struct {
+ *   T *data;                  // with (size_t(data)%EIGEN_MAX_ALIGN_BYTES)==0
+ *   Eigen::Index rows, cols;
+ *  };
+ * \endcode</td></tr>
+ * <tr class="alt"><td>\code
+ * Matrix<T,Dynamic,1>
+ * Matrix<T,1,Dynamic> \endcode</td><td>\code
+ * struct {
+ *   T *data;                  // with (size_t(data)%EIGEN_MAX_ALIGN_BYTES)==0
+ *   Eigen::Index size;
+ *  };
+ * \endcode</td></tr>
+ * <tr><td>\code Matrix<T,Rows,Cols> \endcode</td><td>\code
+ * struct {
+ *   T data[Rows*Cols];        // with (size_t(data)%A(Rows*Cols*sizeof(T)))==0
+ *  };
+ * \endcode</td></tr>
+ * <tr class="alt"><td>\code Matrix<T,Dynamic,Dynamic,0,MaxRows,MaxCols> \endcode</td><td>\code
+ * struct {
+ *   T data[MaxRows*MaxCols];  // with (size_t(data)%A(MaxRows*MaxCols*sizeof(T)))==0
+ *   Eigen::Index rows, cols;
+ *  };
+ * \endcode</td></tr>
+ * </table>
+ * Note that in this table Rows, Cols, MaxRows and MaxCols are all positive integers. A(S) is defined to the largest
+ * possible power-of-two smaller to EIGEN_MAX_STATIC_ALIGN_BYTES.
+ *
+ * \see MatrixBase for the majority of the API methods for matrices, \ref TopicClassHierarchy,
+ * \ref TopicStorageOrders
+ */
 
-template<typename Scalar_, int Rows_, int Cols_, int Options_, int MaxRows_, int MaxCols_>
-class Matrix
-  : public PlainObjectBase<Matrix<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_> >
-{
-  public:
+template <typename Scalar_, int Rows_, int Cols_, int Options_, int MaxRows_, int MaxCols_>
+class Matrix : public PlainObjectBase<Matrix<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_>> {
+ public:
+  /** \brief Base class typedef.
+   * \sa PlainObjectBase
+   */
+  typedef PlainObjectBase<Matrix> Base;
 
-    /** \brief Base class typedef.
-      * \sa PlainObjectBase
-      */
-    typedef PlainObjectBase<Matrix> Base;
+  enum { Options = Options_ };
 
-    enum { Options = Options_ };
+  EIGEN_DENSE_PUBLIC_INTERFACE(Matrix)
 
-    EIGEN_DENSE_PUBLIC_INTERFACE(Matrix)
+  typedef typename Base::PlainObject PlainObject;
 
-    typedef typename Base::PlainObject PlainObject;
+  using Base::base;
+  using Base::coeffRef;
 
-    using Base::base;
-    using Base::coeffRef;
+  /**
+   * \brief Assigns matrices to each other.
+   *
+   * \note This is a special case of the templated operator=. Its purpose is
+   * to prevent a default operator= from hiding the templated operator=.
+   *
+   * \callgraph
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Matrix& operator=(const Matrix& other) { return Base::_set(other); }
 
-    /**
-      * \brief Assigns matrices to each other.
-      *
-      * \note This is a special case of the templated operator=. Its purpose is
-      * to prevent a default operator= from hiding the templated operator=.
-      *
-      * \callgraph
-      */
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Matrix& operator=(const Matrix& other)
-    {
-      return Base::_set(other);
-    }
+  /** \internal
+   * \brief Copies the value of the expression \a other into \c *this with automatic resizing.
+   *
+   * *this might be resized to match the dimensions of \a other. If *this was a null matrix (not already initialized),
+   * it will be initialized.
+   *
+   * Note that copying a row-vector into a vector (and conversely) is allowed.
+   * The resizing, if any, is then done in the appropriate way so that row-vectors
+   * remain row-vectors and vectors remain vectors.
+   */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Matrix& operator=(const DenseBase<OtherDerived>& other) {
+    return Base::_set(other);
+  }
 
-    /** \internal
-      * \brief Copies the value of the expression \a other into \c *this with automatic resizing.
-      *
-      * *this might be resized to match the dimensions of \a other. If *this was a null matrix (not already initialized),
-      * it will be initialized.
-      *
-      * Note that copying a row-vector into a vector (and conversely) is allowed.
-      * The resizing, if any, is then done in the appropriate way so that row-vectors
-      * remain row-vectors and vectors remain vectors.
-      */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Matrix& operator=(const DenseBase<OtherDerived>& other)
-    {
-      return Base::_set(other);
-    }
+  /* Here, doxygen failed to copy the brief information when using \copydoc */
 
-    /* Here, doxygen failed to copy the brief information when using \copydoc */
+  /**
+   * \brief Copies the generic expression \a other into *this.
+   * \copydetails DenseBase::operator=(const EigenBase<OtherDerived> &other)
+   */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Matrix& operator=(const EigenBase<OtherDerived>& other) {
+    return Base::operator=(other);
+  }
 
-    /**
-      * \brief Copies the generic expression \a other into *this.
-      * \copydetails DenseBase::operator=(const EigenBase<OtherDerived> &other)
-      */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Matrix& operator=(const EigenBase<OtherDerived> &other)
-    {
-      return Base::operator=(other);
-    }
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Matrix& operator=(const ReturnByValue<OtherDerived>& func) {
+    return Base::operator=(func);
+  }
 
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Matrix& operator=(const ReturnByValue<OtherDerived>& func)
-    {
-      return Base::operator=(func);
-    }
+  /** \brief Default constructor.
+   *
+   * For fixed-size matrices, does nothing.
+   *
+   * For dynamic-size matrices, creates an empty matrix of size 0. Does not allocate any array. Such a matrix
+   * is called a null matrix. This constructor is the unique way to create null matrices: resizing
+   * a matrix to 0 is not supported.
+   *
+   * \sa resize(Index,Index)
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Matrix()
+      : Base(){EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED}
 
-    /** \brief Default constructor.
-      *
-      * For fixed-size matrices, does nothing.
-      *
-      * For dynamic-size matrices, creates an empty matrix of size 0. Does not allocate any array. Such a matrix
-      * is called a null matrix. This constructor is the unique way to create null matrices: resizing
-      * a matrix to 0 is not supported.
-      *
-      * \sa resize(Index,Index)
-      */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Matrix() : Base()
-    {
-      EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
-    }
+        // FIXME is it still needed
+        EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit Matrix(internal::constructor_without_unaligned_array_assert)
+      : Base(internal::constructor_without_unaligned_array_assert()){EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED}
 
-    // FIXME is it still needed
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    explicit Matrix(internal::constructor_without_unaligned_array_assert)
-      : Base(internal::constructor_without_unaligned_array_assert())
-    { EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED }
-
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Matrix(Matrix&& other) EIGEN_NOEXCEPT_IF(std::is_nothrow_move_constructible<Scalar>::value)
+        EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Matrix(Matrix && other)
+            EIGEN_NOEXCEPT_IF(std::is_nothrow_move_constructible<Scalar>::value)
       : Base(std::move(other)) {}
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Matrix& operator=(Matrix&& other) EIGEN_NOEXCEPT_IF(std::is_nothrow_move_assignable<Scalar>::value)
-    {
-      Base::operator=(std::move(other));
-      return *this;
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Matrix& operator=(Matrix&& other)
+      EIGEN_NOEXCEPT_IF(std::is_nothrow_move_assignable<Scalar>::value) {
+    Base::operator=(std::move(other));
+    return *this;
+  }
 
-    /** \copydoc PlainObjectBase(const Scalar&, const Scalar&, const Scalar&,  const Scalar&, const ArgTypes&... args)
-     *
-     * Example: \include Matrix_variadic_ctor_cxx11.cpp
-     * Output: \verbinclude Matrix_variadic_ctor_cxx11.out
-     *
-     * \sa Matrix(const std::initializer_list<std::initializer_list<Scalar>>&)
-     */
-    template <typename... ArgTypes>
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Matrix(const Scalar& a0, const Scalar& a1, const Scalar& a2,  const Scalar& a3, const ArgTypes&... args)
+  /** \copydoc PlainObjectBase(const Scalar&, const Scalar&, const Scalar&,  const Scalar&, const ArgTypes&... args)
+   *
+   * Example: \include Matrix_variadic_ctor_cxx11.cpp
+   * Output: \verbinclude Matrix_variadic_ctor_cxx11.out
+   *
+   * \sa Matrix(const std::initializer_list<std::initializer_list<Scalar>>&)
+   */
+  template <typename... ArgTypes>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Matrix(const Scalar& a0, const Scalar& a1, const Scalar& a2, const Scalar& a3,
+                                               const ArgTypes&... args)
       : Base(a0, a1, a2, a3, args...) {}
 
-    /** \brief Constructs a Matrix and initializes it from the coefficients given as initializer-lists grouped by row. \cpp11
-      *
-      * In the general case, the constructor takes a list of rows, each row being represented as a list of coefficients:
-      *
-      * Example: \include Matrix_initializer_list_23_cxx11.cpp
-      * Output: \verbinclude Matrix_initializer_list_23_cxx11.out
-      *
-      * Each of the inner initializer lists must contain the exact same number of elements, otherwise an assertion is triggered.
-      *
-      * In the case of a compile-time column vector, implicit transposition from a single row is allowed.
-      * Therefore <code>VectorXd{{1,2,3,4,5}}</code> is legal and the more verbose syntax
-      * <code>RowVectorXd{{1},{2},{3},{4},{5}}</code> can be avoided:
-      *
-      * Example: \include Matrix_initializer_list_vector_cxx11.cpp
-      * Output: \verbinclude Matrix_initializer_list_vector_cxx11.out
-      *
-      * In the case of fixed-sized matrices, the initializer list sizes must exactly match the matrix sizes,
-      * and implicit transposition is allowed for compile-time vectors only.
-      *
-      * \sa Matrix(const Scalar& a0, const Scalar& a1, const Scalar& a2,  const Scalar& a3, const ArgTypes&... args)
-      */
-    EIGEN_DEVICE_FUNC explicit constexpr EIGEN_STRONG_INLINE Matrix(
-        const std::initializer_list<std::initializer_list<Scalar>>& list)
-        : Base(list) {}
+  /** \brief Constructs a Matrix and initializes it from the coefficients given as initializer-lists grouped by row.
+   * \cpp11
+   *
+   * In the general case, the constructor takes a list of rows, each row being represented as a list of coefficients:
+   *
+   * Example: \include Matrix_initializer_list_23_cxx11.cpp
+   * Output: \verbinclude Matrix_initializer_list_23_cxx11.out
+   *
+   * Each of the inner initializer lists must contain the exact same number of elements, otherwise an assertion is
+   * triggered.
+   *
+   * In the case of a compile-time column vector, implicit transposition from a single row is allowed.
+   * Therefore <code>VectorXd{{1,2,3,4,5}}</code> is legal and the more verbose syntax
+   * <code>RowVectorXd{{1},{2},{3},{4},{5}}</code> can be avoided:
+   *
+   * Example: \include Matrix_initializer_list_vector_cxx11.cpp
+   * Output: \verbinclude Matrix_initializer_list_vector_cxx11.out
+   *
+   * In the case of fixed-sized matrices, the initializer list sizes must exactly match the matrix sizes,
+   * and implicit transposition is allowed for compile-time vectors only.
+   *
+   * \sa Matrix(const Scalar& a0, const Scalar& a1, const Scalar& a2,  const Scalar& a3, const ArgTypes&... args)
+   */
+  EIGEN_DEVICE_FUNC explicit constexpr EIGEN_STRONG_INLINE Matrix(
+      const std::initializer_list<std::initializer_list<Scalar>>& list)
+      : Base(list) {}
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
 
-    // This constructor is for both 1x1 matrices and dynamic vectors
-    template<typename T>
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    explicit Matrix(const T& x)
-    {
-      Base::template _init1<T>(x);
-    }
+  // This constructor is for both 1x1 matrices and dynamic vectors
+  template <typename T>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit Matrix(const T& x) {
+    Base::template _init1<T>(x);
+  }
 
-    template<typename T0, typename T1>
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Matrix(const T0& x, const T1& y)
-    {
-      Base::template _init2<T0,T1>(x, y);
-    }
-
+  template <typename T0, typename T1>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Matrix(const T0& x, const T1& y) {
+    Base::template _init2<T0, T1>(x, y);
+  }
 
 #else
-    /** \brief Constructs a fixed-sized matrix initialized with coefficients starting at \a data */
-    EIGEN_DEVICE_FUNC
-    explicit Matrix(const Scalar *data);
+  /** \brief Constructs a fixed-sized matrix initialized with coefficients starting at \a data */
+  EIGEN_DEVICE_FUNC explicit Matrix(const Scalar* data);
 
-    /** \brief Constructs a vector or row-vector with given dimension. \only_for_vectors
-      *
-      * This is useful for dynamic-size vectors. For fixed-size vectors,
-      * it is redundant to pass these parameters, so one should use the default constructor
-      * Matrix() instead.
-      *
-      * \warning This constructor is disabled for fixed-size \c 1x1 matrices. For instance,
-      * calling Matrix<double,1,1>(1) will call the initialization constructor: Matrix(const Scalar&).
-      * For fixed-size \c 1x1 matrices it is therefore recommended to use the default
-      * constructor Matrix() instead, especially when using one of the non standard
-      * \c EIGEN_INITIALIZE_MATRICES_BY_{ZERO,\c NAN} macros (see \ref TopicPreprocessorDirectives).
-      */
-    EIGEN_STRONG_INLINE explicit Matrix(Index dim);
-    /** \brief Constructs an initialized 1x1 matrix with the given coefficient
-      * \sa Matrix(const Scalar&, const Scalar&, const Scalar&,  const Scalar&, const ArgTypes&...) */
-    Matrix(const Scalar& x);
-    /** \brief Constructs an uninitialized matrix with \a rows rows and \a cols columns.
-      *
-      * This is useful for dynamic-size matrices. For fixed-size matrices,
-      * it is redundant to pass these parameters, so one should use the default constructor
-      * Matrix() instead.
-      *
-      * \warning This constructor is disabled for fixed-size \c 1x2 and \c 2x1 vectors. For instance,
-      * calling Matrix2f(2,1) will call the initialization constructor: Matrix(const Scalar& x, const Scalar& y).
-      * For fixed-size \c 1x2 or \c 2x1 vectors it is therefore recommended to use the default
-      * constructor Matrix() instead, especially when using one of the non standard
-      * \c EIGEN_INITIALIZE_MATRICES_BY_{ZERO,\c NAN} macros (see \ref TopicPreprocessorDirectives).
-      */
-    EIGEN_DEVICE_FUNC
-    Matrix(Index rows, Index cols);
+  /** \brief Constructs a vector or row-vector with given dimension. \only_for_vectors
+   *
+   * This is useful for dynamic-size vectors. For fixed-size vectors,
+   * it is redundant to pass these parameters, so one should use the default constructor
+   * Matrix() instead.
+   *
+   * \warning This constructor is disabled for fixed-size \c 1x1 matrices. For instance,
+   * calling Matrix<double,1,1>(1) will call the initialization constructor: Matrix(const Scalar&).
+   * For fixed-size \c 1x1 matrices it is therefore recommended to use the default
+   * constructor Matrix() instead, especially when using one of the non standard
+   * \c EIGEN_INITIALIZE_MATRICES_BY_{ZERO,\c NAN} macros (see \ref TopicPreprocessorDirectives).
+   */
+  EIGEN_STRONG_INLINE explicit Matrix(Index dim);
+  /** \brief Constructs an initialized 1x1 matrix with the given coefficient
+   * \sa Matrix(const Scalar&, const Scalar&, const Scalar&,  const Scalar&, const ArgTypes&...) */
+  Matrix(const Scalar& x);
+  /** \brief Constructs an uninitialized matrix with \a rows rows and \a cols columns.
+   *
+   * This is useful for dynamic-size matrices. For fixed-size matrices,
+   * it is redundant to pass these parameters, so one should use the default constructor
+   * Matrix() instead.
+   *
+   * \warning This constructor is disabled for fixed-size \c 1x2 and \c 2x1 vectors. For instance,
+   * calling Matrix2f(2,1) will call the initialization constructor: Matrix(const Scalar& x, const Scalar& y).
+   * For fixed-size \c 1x2 or \c 2x1 vectors it is therefore recommended to use the default
+   * constructor Matrix() instead, especially when using one of the non standard
+   * \c EIGEN_INITIALIZE_MATRICES_BY_{ZERO,\c NAN} macros (see \ref TopicPreprocessorDirectives).
+   */
+  EIGEN_DEVICE_FUNC Matrix(Index rows, Index cols);
 
-    /** \brief Constructs an initialized 2D vector with given coefficients
-      * \sa Matrix(const Scalar&, const Scalar&, const Scalar&,  const Scalar&, const ArgTypes&...) */
-    Matrix(const Scalar& x, const Scalar& y);
-    #endif  // end EIGEN_PARSED_BY_DOXYGEN
+  /** \brief Constructs an initialized 2D vector with given coefficients
+   * \sa Matrix(const Scalar&, const Scalar&, const Scalar&,  const Scalar&, const ArgTypes&...) */
+  Matrix(const Scalar& x, const Scalar& y);
+#endif  // end EIGEN_PARSED_BY_DOXYGEN
 
-    /** \brief Constructs an initialized 3D vector with given coefficients
-      * \sa Matrix(const Scalar&, const Scalar&, const Scalar&,  const Scalar&, const ArgTypes&...)
-      */
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Matrix(const Scalar& x, const Scalar& y, const Scalar& z)
-    {
-      EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Matrix, 3)
-      m_storage.data()[0] = x;
-      m_storage.data()[1] = y;
-      m_storage.data()[2] = z;
-    }
-    /** \brief Constructs an initialized 4D vector with given coefficients
-      * \sa Matrix(const Scalar&, const Scalar&, const Scalar&,  const Scalar&, const ArgTypes&...)
-      */
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Matrix(const Scalar& x, const Scalar& y, const Scalar& z, const Scalar& w)
-    {
-      EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Matrix, 4)
-      m_storage.data()[0] = x;
-      m_storage.data()[1] = y;
-      m_storage.data()[2] = z;
-      m_storage.data()[3] = w;
-    }
+  /** \brief Constructs an initialized 3D vector with given coefficients
+   * \sa Matrix(const Scalar&, const Scalar&, const Scalar&,  const Scalar&, const ArgTypes&...)
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Matrix(const Scalar& x, const Scalar& y, const Scalar& z) {
+    EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Matrix, 3)
+    m_storage.data()[0] = x;
+    m_storage.data()[1] = y;
+    m_storage.data()[2] = z;
+  }
+  /** \brief Constructs an initialized 4D vector with given coefficients
+   * \sa Matrix(const Scalar&, const Scalar&, const Scalar&,  const Scalar&, const ArgTypes&...)
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Matrix(const Scalar& x, const Scalar& y, const Scalar& z, const Scalar& w) {
+    EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Matrix, 4)
+    m_storage.data()[0] = x;
+    m_storage.data()[1] = y;
+    m_storage.data()[2] = z;
+    m_storage.data()[3] = w;
+  }
 
+  /** \brief Copy constructor */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Matrix(const Matrix& other) : Base(other) {}
 
-    /** \brief Copy constructor */
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Matrix(const Matrix& other) : Base(other)
-    { }
+  /** \brief Copy constructor for generic expressions.
+   * \sa MatrixBase::operator=(const EigenBase<OtherDerived>&)
+   */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Matrix(const EigenBase<OtherDerived>& other) : Base(other.derived()) {}
 
-    /** \brief Copy constructor for generic expressions.
-      * \sa MatrixBase::operator=(const EigenBase<OtherDerived>&)
-      */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Matrix(const EigenBase<OtherDerived> &other)
-      : Base(other.derived())
-    { }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index innerStride() const EIGEN_NOEXCEPT { return 1; }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index outerStride() const EIGEN_NOEXCEPT { return this->innerSize(); }
 
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index innerStride() const EIGEN_NOEXCEPT { return 1; }
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index outerStride() const EIGEN_NOEXCEPT { return this->innerSize(); }
+  /////////// Geometry module ///////////
 
-    /////////// Geometry module ///////////
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC explicit Matrix(const RotationBase<OtherDerived, ColsAtCompileTime>& r);
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC Matrix& operator=(const RotationBase<OtherDerived, ColsAtCompileTime>& r);
 
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    explicit Matrix(const RotationBase<OtherDerived,ColsAtCompileTime>& r);
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    Matrix& operator=(const RotationBase<OtherDerived,ColsAtCompileTime>& r);
+// allow to extend Matrix outside Eigen
+#ifdef EIGEN_MATRIX_PLUGIN
+#include EIGEN_MATRIX_PLUGIN
+#endif
 
-    // allow to extend Matrix outside Eigen
-    #ifdef EIGEN_MATRIX_PLUGIN
-    #include EIGEN_MATRIX_PLUGIN
-    #endif
+ protected:
+  template <typename Derived, typename OtherDerived, bool IsVector>
+  friend struct internal::conservative_resize_like_impl;
 
-  protected:
-    template <typename Derived, typename OtherDerived, bool IsVector>
-    friend struct internal::conservative_resize_like_impl;
-
-    using Base::m_storage;
+  using Base::m_storage;
 };
 
 /** \defgroup matrixtypedefs Global matrix typedefs
-  *
-  * \ingroup Core_Module
-  *
-  * %Eigen defines several typedef shortcuts for most common matrix and vector types.
-  *
-  * The general patterns are the following:
-  *
-  * \c MatrixSizeType where \c Size can be \c 2,\c 3,\c 4 for fixed size square matrices or \c X for dynamic size,
-  * and where \c Type can be \c i for integer, \c f for float, \c d for double, \c cf for complex float, \c cd
-  * for complex double.
-  *
-  * For example, \c Matrix3d is a fixed-size 3x3 matrix type of doubles, and \c MatrixXf is a dynamic-size matrix of floats.
-  *
-  * There are also \c VectorSizeType and \c RowVectorSizeType which are self-explanatory. For example, \c Vector4cf is
-  * a fixed-size vector of 4 complex floats.
-  *
-  * With \cpp11, template alias are also defined for common sizes.
-  * They follow the same pattern as above except that the scalar type suffix is replaced by a
-  * template parameter, i.e.:
-  *   - `MatrixSize<Type>` where `Size` can be \c 2,\c 3,\c 4 for fixed size square matrices or \c X for dynamic size.
-  *   - `MatrixXSize<Type>` and `MatrixSizeX<Type>` where `Size` can be \c 2,\c 3,\c 4 for hybrid dynamic/fixed matrices.
-  *   - `VectorSize<Type>` and `RowVectorSize<Type>` for column and row vectors.
-  *
-  * With \cpp11, you can also use fully generic column and row vector types: `Vector<Type,Size>` and `RowVector<Type,Size>`.
-  *
-  * \sa class Matrix
-  */
+ *
+ * \ingroup Core_Module
+ *
+ * %Eigen defines several typedef shortcuts for most common matrix and vector types.
+ *
+ * The general patterns are the following:
+ *
+ * \c MatrixSizeType where \c Size can be \c 2,\c 3,\c 4 for fixed size square matrices or \c X for dynamic size,
+ * and where \c Type can be \c i for integer, \c f for float, \c d for double, \c cf for complex float, \c cd
+ * for complex double.
+ *
+ * For example, \c Matrix3d is a fixed-size 3x3 matrix type of doubles, and \c MatrixXf is a dynamic-size matrix of
+ * floats.
+ *
+ * There are also \c VectorSizeType and \c RowVectorSizeType which are self-explanatory. For example, \c Vector4cf is
+ * a fixed-size vector of 4 complex floats.
+ *
+ * With \cpp11, template alias are also defined for common sizes.
+ * They follow the same pattern as above except that the scalar type suffix is replaced by a
+ * template parameter, i.e.:
+ *   - `MatrixSize<Type>` where `Size` can be \c 2,\c 3,\c 4 for fixed size square matrices or \c X for dynamic size.
+ *   - `MatrixXSize<Type>` and `MatrixSizeX<Type>` where `Size` can be \c 2,\c 3,\c 4 for hybrid dynamic/fixed matrices.
+ *   - `VectorSize<Type>` and `RowVectorSize<Type>` for column and row vectors.
+ *
+ * With \cpp11, you can also use fully generic column and row vector types: `Vector<Type,Size>` and
+ * `RowVector<Type,Size>`.
+ *
+ * \sa class Matrix
+ */
 
-#define EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Size, SizeSuffix)   \
-/** \ingroup matrixtypedefs */                                    \
-/** \brief `Size`&times;`Size` matrix of type `Type`. */          \
-typedef Matrix<Type, Size, Size> Matrix##SizeSuffix##TypeSuffix;  \
-/** \ingroup matrixtypedefs */                                    \
-/** \brief `Size`&times;`1` vector of type `Type`. */             \
-typedef Matrix<Type, Size, 1>    Vector##SizeSuffix##TypeSuffix;  \
-/** \ingroup matrixtypedefs */                                    \
-/** \brief `1`&times;`Size` vector of type `Type`. */             \
-typedef Matrix<Type, 1, Size>    RowVector##SizeSuffix##TypeSuffix;
+#define EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Size, SizeSuffix)    \
+  /** \ingroup matrixtypedefs */                                   \
+  /** \brief `Size`&times;`Size` matrix of type `Type`. */         \
+  typedef Matrix<Type, Size, Size> Matrix##SizeSuffix##TypeSuffix; \
+  /** \ingroup matrixtypedefs */                                   \
+  /** \brief `Size`&times;`1` vector of type `Type`. */            \
+  typedef Matrix<Type, Size, 1> Vector##SizeSuffix##TypeSuffix;    \
+  /** \ingroup matrixtypedefs */                                   \
+  /** \brief `1`&times;`Size` vector of type `Type`. */            \
+  typedef Matrix<Type, 1, Size> RowVector##SizeSuffix##TypeSuffix;
 
-#define EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, Size)         \
-/** \ingroup matrixtypedefs */                                    \
-/** \brief `Size`&times;`Dynamic` matrix of type `Type`. */       \
-typedef Matrix<Type, Size, Dynamic> Matrix##Size##X##TypeSuffix;  \
-/** \ingroup matrixtypedefs */                                    \
-/** \brief `Dynamic`&times;`Size` matrix of type `Type`. */       \
-typedef Matrix<Type, Dynamic, Size> Matrix##X##Size##TypeSuffix;
+#define EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, Size)          \
+  /** \ingroup matrixtypedefs */                                   \
+  /** \brief `Size`&times;`Dynamic` matrix of type `Type`. */      \
+  typedef Matrix<Type, Size, Dynamic> Matrix##Size##X##TypeSuffix; \
+  /** \ingroup matrixtypedefs */                                   \
+  /** \brief `Dynamic`&times;`Size` matrix of type `Type`. */      \
+  typedef Matrix<Type, Dynamic, Size> Matrix##X##Size##TypeSuffix;
 
 #define EIGEN_MAKE_TYPEDEFS_ALL_SIZES(Type, TypeSuffix) \
-EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 2, 2) \
-EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 3, 3) \
-EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 4, 4) \
-EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Dynamic, X) \
-EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 2) \
-EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 3) \
-EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 4)
+  EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 2, 2)           \
+  EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 3, 3)           \
+  EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 4, 4)           \
+  EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Dynamic, X)     \
+  EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 2)        \
+  EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 3)        \
+  EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 4)
 
-EIGEN_MAKE_TYPEDEFS_ALL_SIZES(int,                  i)
-EIGEN_MAKE_TYPEDEFS_ALL_SIZES(float,                f)
-EIGEN_MAKE_TYPEDEFS_ALL_SIZES(double,               d)
-EIGEN_MAKE_TYPEDEFS_ALL_SIZES(std::complex<float>,  cf)
+EIGEN_MAKE_TYPEDEFS_ALL_SIZES(int, i)
+EIGEN_MAKE_TYPEDEFS_ALL_SIZES(float, f)
+EIGEN_MAKE_TYPEDEFS_ALL_SIZES(double, d)
+EIGEN_MAKE_TYPEDEFS_ALL_SIZES(std::complex<float>, cf)
 EIGEN_MAKE_TYPEDEFS_ALL_SIZES(std::complex<double>, cd)
 
 #undef EIGEN_MAKE_TYPEDEFS_ALL_SIZES
 #undef EIGEN_MAKE_TYPEDEFS
 #undef EIGEN_MAKE_FIXED_TYPEDEFS
 
-#define EIGEN_MAKE_TYPEDEFS(Size, SizeSuffix)                        \
-/** \ingroup matrixtypedefs */                                       \
-/** \brief \cpp11 `Size`&times;`Size` matrix of type `Type`.*/       \
-template <typename Type>                                             \
-using Matrix##SizeSuffix = Matrix<Type, Size, Size>;                 \
-/** \ingroup matrixtypedefs */                                       \
-/** \brief \cpp11 `Size`&times;`1` vector of type `Type`.*/          \
-template <typename Type>                                             \
-using Vector##SizeSuffix = Matrix<Type, Size, 1>;                    \
-/** \ingroup matrixtypedefs */                                       \
-/** \brief \cpp11 `1`&times;`Size` vector of type `Type`.*/          \
-template <typename Type>                                             \
-using RowVector##SizeSuffix = Matrix<Type, 1, Size>;
+#define EIGEN_MAKE_TYPEDEFS(Size, SizeSuffix)                    \
+  /** \ingroup matrixtypedefs */                                 \
+  /** \brief \cpp11 `Size`&times;`Size` matrix of type `Type`.*/ \
+  template <typename Type>                                       \
+  using Matrix##SizeSuffix = Matrix<Type, Size, Size>;           \
+  /** \ingroup matrixtypedefs */                                 \
+  /** \brief \cpp11 `Size`&times;`1` vector of type `Type`.*/    \
+  template <typename Type>                                       \
+  using Vector##SizeSuffix = Matrix<Type, Size, 1>;              \
+  /** \ingroup matrixtypedefs */                                 \
+  /** \brief \cpp11 `1`&times;`Size` vector of type `Type`.*/    \
+  template <typename Type>                                       \
+  using RowVector##SizeSuffix = Matrix<Type, 1, Size>;
 
-#define EIGEN_MAKE_FIXED_TYPEDEFS(Size)                            \
-/** \ingroup matrixtypedefs */                                     \
-/** \brief \cpp11 `Size`&times;`Dynamic` matrix of type `Type` */  \
-template <typename Type>                                           \
-using Matrix##Size##X = Matrix<Type, Size, Dynamic>;               \
-/** \ingroup matrixtypedefs */                                     \
-/** \brief \cpp11 `Dynamic`&times;`Size` matrix of type `Type`. */ \
-template <typename Type>                                           \
-using Matrix##X##Size = Matrix<Type, Dynamic, Size>;
+#define EIGEN_MAKE_FIXED_TYPEDEFS(Size)                              \
+  /** \ingroup matrixtypedefs */                                     \
+  /** \brief \cpp11 `Size`&times;`Dynamic` matrix of type `Type` */  \
+  template <typename Type>                                           \
+  using Matrix##Size##X = Matrix<Type, Size, Dynamic>;               \
+  /** \ingroup matrixtypedefs */                                     \
+  /** \brief \cpp11 `Dynamic`&times;`Size` matrix of type `Type`. */ \
+  template <typename Type>                                           \
+  using Matrix##X##Size = Matrix<Type, Dynamic, Size>;
 
 EIGEN_MAKE_TYPEDEFS(2, 2)
 EIGEN_MAKE_TYPEDEFS(3, 3)
@@ -541,18 +510,18 @@
 EIGEN_MAKE_FIXED_TYPEDEFS(4)
 
 /** \ingroup matrixtypedefs
-  * \brief \cpp11 `Size`&times;`1` vector of type `Type`. */
+ * \brief \cpp11 `Size`&times;`1` vector of type `Type`. */
 template <typename Type, int Size>
 using Vector = Matrix<Type, Size, 1>;
 
 /** \ingroup matrixtypedefs
-  * \brief \cpp11 `1`&times;`Size` vector of type `Type`. */
+ * \brief \cpp11 `1`&times;`Size` vector of type `Type`. */
 template <typename Type, int Size>
 using RowVector = Matrix<Type, 1, Size>;
 
 #undef EIGEN_MAKE_TYPEDEFS
 #undef EIGEN_MAKE_FIXED_TYPEDEFS
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_MATRIX_H
+#endif  // EIGEN_MATRIX_H
diff --git a/Eigen/src/Core/MatrixBase.h b/Eigen/src/Core/MatrixBase.h
index 7a0942f..81d5a97 100644
--- a/Eigen/src/Core/MatrixBase.h
+++ b/Eigen/src/Core/MatrixBase.h
@@ -48,505 +48,495 @@
   *
   * \sa \blank \ref TopicClassHierarchy
   */
-template<typename Derived> class MatrixBase
-  : public DenseBase<Derived>
-{
-  public:
+template <typename Derived>
+class MatrixBase : public DenseBase<Derived> {
+ public:
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-    typedef MatrixBase StorageBaseType;
-    typedef typename internal::traits<Derived>::StorageKind StorageKind;
-    typedef typename internal::traits<Derived>::StorageIndex StorageIndex;
-    typedef typename internal::traits<Derived>::Scalar Scalar;
-    typedef typename internal::packet_traits<Scalar>::type PacketScalar;
-    typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef MatrixBase StorageBaseType;
+  typedef typename internal::traits<Derived>::StorageKind StorageKind;
+  typedef typename internal::traits<Derived>::StorageIndex StorageIndex;
+  typedef typename internal::traits<Derived>::Scalar Scalar;
+  typedef typename internal::packet_traits<Scalar>::type PacketScalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
 
-    typedef DenseBase<Derived> Base;
-    using Base::RowsAtCompileTime;
-    using Base::ColsAtCompileTime;
-    using Base::SizeAtCompileTime;
-    using Base::MaxRowsAtCompileTime;
-    using Base::MaxColsAtCompileTime;
-    using Base::MaxSizeAtCompileTime;
-    using Base::IsVectorAtCompileTime;
-    using Base::Flags;
+  typedef DenseBase<Derived> Base;
+  using Base::ColsAtCompileTime;
+  using Base::Flags;
+  using Base::IsVectorAtCompileTime;
+  using Base::MaxColsAtCompileTime;
+  using Base::MaxRowsAtCompileTime;
+  using Base::MaxSizeAtCompileTime;
+  using Base::RowsAtCompileTime;
+  using Base::SizeAtCompileTime;
 
-    using Base::derived;
-    using Base::const_cast_derived;
-    using Base::rows;
-    using Base::cols;
-    using Base::size;
-    using Base::coeff;
-    using Base::coeffRef;
-    using Base::lazyAssign;
-    using Base::eval;
-    using Base::operator-;
-    using Base::operator+=;
-    using Base::operator-=;
-    using Base::operator*=;
-    using Base::operator/=;
+  using Base::coeff;
+  using Base::coeffRef;
+  using Base::cols;
+  using Base::const_cast_derived;
+  using Base::derived;
+  using Base::eval;
+  using Base::lazyAssign;
+  using Base::rows;
+  using Base::size;
+  using Base::operator-;
+  using Base::operator+=;
+  using Base::operator-=;
+  using Base::operator*=;
+  using Base::operator/=;
 
-    typedef typename Base::CoeffReturnType CoeffReturnType;
-    typedef typename Base::ConstTransposeReturnType ConstTransposeReturnType;
-    typedef typename Base::RowXpr RowXpr;
-    typedef typename Base::ColXpr ColXpr;
-#endif // not EIGEN_PARSED_BY_DOXYGEN
-
-
+  typedef typename Base::CoeffReturnType CoeffReturnType;
+  typedef typename Base::ConstTransposeReturnType ConstTransposeReturnType;
+  typedef typename Base::RowXpr RowXpr;
+  typedef typename Base::ColXpr ColXpr;
+#endif  // not EIGEN_PARSED_BY_DOXYGEN
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-    /** type of the equivalent square matrix */
-    typedef Matrix<Scalar, internal::max_size_prefer_dynamic(RowsAtCompileTime, ColsAtCompileTime),
-                           internal::max_size_prefer_dynamic(RowsAtCompileTime, ColsAtCompileTime)> SquareMatrixType;
-#endif // not EIGEN_PARSED_BY_DOXYGEN
+  /** type of the equivalent square matrix */
+  typedef Matrix<Scalar, internal::max_size_prefer_dynamic(RowsAtCompileTime, ColsAtCompileTime),
+                 internal::max_size_prefer_dynamic(RowsAtCompileTime, ColsAtCompileTime)>
+      SquareMatrixType;
+#endif  // not EIGEN_PARSED_BY_DOXYGEN
 
-    /** \returns the size of the main diagonal, which is min(rows(),cols()).
-      * \sa rows(), cols(), SizeAtCompileTime. */
-    EIGEN_DEVICE_FUNC
-    inline Index diagonalSize() const { return (numext::mini)(rows(),cols()); }
+  /** \returns the size of the main diagonal, which is min(rows(),cols()).
+   * \sa rows(), cols(), SizeAtCompileTime. */
+  EIGEN_DEVICE_FUNC inline Index diagonalSize() const { return (numext::mini)(rows(), cols()); }
 
-    typedef typename Base::PlainObject PlainObject;
+  typedef typename Base::PlainObject PlainObject;
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-    /** \internal Represents a matrix with all coefficients equal to one another*/
-    typedef CwiseNullaryOp<internal::scalar_constant_op<Scalar>,PlainObject> ConstantReturnType;
-    /** \internal the return type of MatrixBase::adjoint() */
-    typedef std::conditional_t<NumTraits<Scalar>::IsComplex,
-               CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>, ConstTransposeReturnType>,
-               ConstTransposeReturnType
-            > AdjointReturnType;
-    /** \internal Return type of eigenvalues() */
-    typedef Matrix<std::complex<RealScalar>, internal::traits<Derived>::ColsAtCompileTime, 1, ColMajor> EigenvaluesReturnType;
-    /** \internal the return type of identity */
-    typedef CwiseNullaryOp<internal::scalar_identity_op<Scalar>,PlainObject> IdentityReturnType;
-    /** \internal the return type of unit vectors */
-    typedef Block<const CwiseNullaryOp<internal::scalar_identity_op<Scalar>, SquareMatrixType>,
-                  internal::traits<Derived>::RowsAtCompileTime,
-                  internal::traits<Derived>::ColsAtCompileTime> BasisReturnType;
-#endif // not EIGEN_PARSED_BY_DOXYGEN
+  /** \internal Represents a matrix with all coefficients equal to one another*/
+  typedef CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject> ConstantReturnType;
+  /** \internal the return type of MatrixBase::adjoint() */
+  typedef std::conditional_t<NumTraits<Scalar>::IsComplex,
+                             CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>, ConstTransposeReturnType>,
+                             ConstTransposeReturnType>
+      AdjointReturnType;
+  /** \internal Return type of eigenvalues() */
+  typedef Matrix<std::complex<RealScalar>, internal::traits<Derived>::ColsAtCompileTime, 1, ColMajor>
+      EigenvaluesReturnType;
+  /** \internal the return type of identity */
+  typedef CwiseNullaryOp<internal::scalar_identity_op<Scalar>, PlainObject> IdentityReturnType;
+  /** \internal the return type of unit vectors */
+  typedef Block<const CwiseNullaryOp<internal::scalar_identity_op<Scalar>, SquareMatrixType>,
+                internal::traits<Derived>::RowsAtCompileTime, internal::traits<Derived>::ColsAtCompileTime>
+      BasisReturnType;
+#endif  // not EIGEN_PARSED_BY_DOXYGEN
 
 #define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::MatrixBase
-#define EIGEN_DOC_UNARY_ADDONS(X,Y)
-#   include "../plugins/CommonCwiseBinaryOps.inc"
-#   include "../plugins/MatrixCwiseUnaryOps.inc"
-#   include "../plugins/MatrixCwiseBinaryOps.inc"
-#   ifdef EIGEN_MATRIXBASE_PLUGIN
-#     include EIGEN_MATRIXBASE_PLUGIN
-#   endif
+#define EIGEN_DOC_UNARY_ADDONS(X, Y)
+#include "../plugins/CommonCwiseBinaryOps.inc"
+#include "../plugins/MatrixCwiseUnaryOps.inc"
+#include "../plugins/MatrixCwiseBinaryOps.inc"
+#ifdef EIGEN_MATRIXBASE_PLUGIN
+#include EIGEN_MATRIXBASE_PLUGIN
+#endif
 #undef EIGEN_CURRENT_STORAGE_BASE_CLASS
 #undef EIGEN_DOC_UNARY_ADDONS
 
-    /** Special case of the template operator=, in order to prevent the compiler
-      * from generating a default operator= (issue hit with g++ 4.1)
-      */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Derived& operator=(const MatrixBase& other);
+  /** Special case of the template operator=, in order to prevent the compiler
+   * from generating a default operator= (issue hit with g++ 4.1)
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator=(const MatrixBase& other);
 
-    // We cannot inherit here via Base::operator= since it is causing
-    // trouble with MSVC.
+  // We cannot inherit here via Base::operator= since it is causing
+  // trouble with MSVC.
 
-    template <typename OtherDerived>
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Derived& operator=(const DenseBase<OtherDerived>& other);
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator=(const DenseBase<OtherDerived>& other);
 
-    template <typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    Derived& operator=(const EigenBase<OtherDerived>& other);
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC Derived& operator=(const EigenBase<OtherDerived>& other);
 
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    Derived& operator=(const ReturnByValue<OtherDerived>& other);
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC Derived& operator=(const ReturnByValue<OtherDerived>& other);
 
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Derived& operator+=(const MatrixBase<OtherDerived>& other);
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Derived& operator-=(const MatrixBase<OtherDerived>& other);
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator+=(const MatrixBase<OtherDerived>& other);
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator-=(const MatrixBase<OtherDerived>& other);
 
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    const Product<Derived,OtherDerived>
-    operator*(const MatrixBase<OtherDerived> &other) const;
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC const Product<Derived, OtherDerived> operator*(const MatrixBase<OtherDerived>& other) const;
 
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    const Product<Derived,OtherDerived,LazyProduct>
-    lazyProduct(const MatrixBase<OtherDerived> &other) const;
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC const Product<Derived, OtherDerived, LazyProduct> lazyProduct(
+      const MatrixBase<OtherDerived>& other) const;
 
-    template<typename OtherDerived>
-    Derived& operator*=(const EigenBase<OtherDerived>& other);
+  template <typename OtherDerived>
+  Derived& operator*=(const EigenBase<OtherDerived>& other);
 
-    template<typename OtherDerived>
-    void applyOnTheLeft(const EigenBase<OtherDerived>& other);
+  template <typename OtherDerived>
+  void applyOnTheLeft(const EigenBase<OtherDerived>& other);
 
-    template<typename OtherDerived>
-    void applyOnTheRight(const EigenBase<OtherDerived>& other);
+  template <typename OtherDerived>
+  void applyOnTheRight(const EigenBase<OtherDerived>& other);
 
-    template<typename DiagonalDerived>
-    EIGEN_DEVICE_FUNC
-    const Product<Derived, DiagonalDerived, LazyProduct>
-    operator*(const DiagonalBase<DiagonalDerived> &diagonal) const;
+  template <typename DiagonalDerived>
+  EIGEN_DEVICE_FUNC const Product<Derived, DiagonalDerived, LazyProduct> operator*(
+      const DiagonalBase<DiagonalDerived>& diagonal) const;
 
-    template<typename SkewDerived>
-    EIGEN_DEVICE_FUNC
-    const Product<Derived, SkewDerived, LazyProduct>
-    operator*(const SkewSymmetricBase<SkewDerived> &skew) const;
+  template <typename SkewDerived>
+  EIGEN_DEVICE_FUNC const Product<Derived, SkewDerived, LazyProduct> operator*(
+      const SkewSymmetricBase<SkewDerived>& skew) const;
 
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    typename ScalarBinaryOpTraits<typename internal::traits<Derived>::Scalar,typename internal::traits<OtherDerived>::Scalar>::ReturnType
-    dot(const MatrixBase<OtherDerived>& other) const;
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC typename ScalarBinaryOpTraits<typename internal::traits<Derived>::Scalar,
+                                                  typename internal::traits<OtherDerived>::Scalar>::ReturnType
+  dot(const MatrixBase<OtherDerived>& other) const;
 
-    EIGEN_DEVICE_FUNC RealScalar squaredNorm() const;
-    EIGEN_DEVICE_FUNC RealScalar norm() const;
-    RealScalar stableNorm() const;
-    RealScalar blueNorm() const;
-    RealScalar hypotNorm() const;
-    EIGEN_DEVICE_FUNC const PlainObject normalized() const;
-    EIGEN_DEVICE_FUNC const PlainObject stableNormalized() const;
-    EIGEN_DEVICE_FUNC void normalize();
-    EIGEN_DEVICE_FUNC void stableNormalize();
+  EIGEN_DEVICE_FUNC RealScalar squaredNorm() const;
+  EIGEN_DEVICE_FUNC RealScalar norm() const;
+  RealScalar stableNorm() const;
+  RealScalar blueNorm() const;
+  RealScalar hypotNorm() const;
+  EIGEN_DEVICE_FUNC const PlainObject normalized() const;
+  EIGEN_DEVICE_FUNC const PlainObject stableNormalized() const;
+  EIGEN_DEVICE_FUNC void normalize();
+  EIGEN_DEVICE_FUNC void stableNormalize();
 
-    EIGEN_DEVICE_FUNC const AdjointReturnType adjoint() const;
-    EIGEN_DEVICE_FUNC void adjointInPlace();
+  EIGEN_DEVICE_FUNC const AdjointReturnType adjoint() const;
+  EIGEN_DEVICE_FUNC void adjointInPlace();
 
-    typedef Diagonal<Derived> DiagonalReturnType;
-    EIGEN_DEVICE_FUNC
-    DiagonalReturnType diagonal();
+  typedef Diagonal<Derived> DiagonalReturnType;
+  EIGEN_DEVICE_FUNC DiagonalReturnType diagonal();
 
-    typedef Diagonal<const Derived> ConstDiagonalReturnType;
-    EIGEN_DEVICE_FUNC
-    const ConstDiagonalReturnType diagonal() const;
+  typedef Diagonal<const Derived> ConstDiagonalReturnType;
+  EIGEN_DEVICE_FUNC const ConstDiagonalReturnType diagonal() const;
 
-    template<int Index>
-    EIGEN_DEVICE_FUNC
-    Diagonal<Derived, Index> diagonal();
+  template <int Index>
+  EIGEN_DEVICE_FUNC Diagonal<Derived, Index> diagonal();
 
-    template<int Index>
-    EIGEN_DEVICE_FUNC
-    const Diagonal<const Derived, Index> diagonal() const;
+  template <int Index>
+  EIGEN_DEVICE_FUNC const Diagonal<const Derived, Index> diagonal() const;
 
-    EIGEN_DEVICE_FUNC
-    Diagonal<Derived, DynamicIndex> diagonal(Index index);
-    EIGEN_DEVICE_FUNC
-    const Diagonal<const Derived, DynamicIndex> diagonal(Index index) const;
+  EIGEN_DEVICE_FUNC Diagonal<Derived, DynamicIndex> diagonal(Index index);
+  EIGEN_DEVICE_FUNC const Diagonal<const Derived, DynamicIndex> diagonal(Index index) const;
 
-    template<unsigned int Mode> struct TriangularViewReturnType { typedef TriangularView<Derived, Mode> Type; };
-    template<unsigned int Mode> struct ConstTriangularViewReturnType { typedef const TriangularView<const Derived, Mode> Type; };
+  template <unsigned int Mode>
+  struct TriangularViewReturnType {
+    typedef TriangularView<Derived, Mode> Type;
+  };
+  template <unsigned int Mode>
+  struct ConstTriangularViewReturnType {
+    typedef const TriangularView<const Derived, Mode> Type;
+  };
 
-    template<unsigned int Mode>
-    EIGEN_DEVICE_FUNC
-    typename TriangularViewReturnType<Mode>::Type triangularView();
-    template<unsigned int Mode>
-    EIGEN_DEVICE_FUNC
-    typename ConstTriangularViewReturnType<Mode>::Type triangularView() const;
+  template <unsigned int Mode>
+  EIGEN_DEVICE_FUNC typename TriangularViewReturnType<Mode>::Type triangularView();
+  template <unsigned int Mode>
+  EIGEN_DEVICE_FUNC typename ConstTriangularViewReturnType<Mode>::Type triangularView() const;
 
-    template<unsigned int UpLo> struct SelfAdjointViewReturnType { typedef SelfAdjointView<Derived, UpLo> Type; };
-    template<unsigned int UpLo> struct ConstSelfAdjointViewReturnType { typedef const SelfAdjointView<const Derived, UpLo> Type; };
+  template <unsigned int UpLo>
+  struct SelfAdjointViewReturnType {
+    typedef SelfAdjointView<Derived, UpLo> Type;
+  };
+  template <unsigned int UpLo>
+  struct ConstSelfAdjointViewReturnType {
+    typedef const SelfAdjointView<const Derived, UpLo> Type;
+  };
 
-    template<unsigned int UpLo>
-    EIGEN_DEVICE_FUNC
-    typename SelfAdjointViewReturnType<UpLo>::Type selfadjointView();
-    template<unsigned int UpLo>
-    EIGEN_DEVICE_FUNC
-    typename ConstSelfAdjointViewReturnType<UpLo>::Type selfadjointView() const;
+  template <unsigned int UpLo>
+  EIGEN_DEVICE_FUNC typename SelfAdjointViewReturnType<UpLo>::Type selfadjointView();
+  template <unsigned int UpLo>
+  EIGEN_DEVICE_FUNC typename ConstSelfAdjointViewReturnType<UpLo>::Type selfadjointView() const;
 
-    const SparseView<Derived> sparseView(const Scalar& m_reference = Scalar(0),
-                                         const typename NumTraits<Scalar>::Real& m_epsilon = NumTraits<Scalar>::dummy_precision()) const;
-    EIGEN_DEVICE_FUNC static const IdentityReturnType Identity();
-    EIGEN_DEVICE_FUNC static const IdentityReturnType Identity(Index rows, Index cols);
-    EIGEN_DEVICE_FUNC static const BasisReturnType Unit(Index size, Index i);
-    EIGEN_DEVICE_FUNC static const BasisReturnType Unit(Index i);
-    EIGEN_DEVICE_FUNC static const BasisReturnType UnitX();
-    EIGEN_DEVICE_FUNC static const BasisReturnType UnitY();
-    EIGEN_DEVICE_FUNC static const BasisReturnType UnitZ();
-    EIGEN_DEVICE_FUNC static const BasisReturnType UnitW();
+  const SparseView<Derived> sparseView(
+      const Scalar& m_reference = Scalar(0),
+      const typename NumTraits<Scalar>::Real& m_epsilon = NumTraits<Scalar>::dummy_precision()) const;
+  EIGEN_DEVICE_FUNC static const IdentityReturnType Identity();
+  EIGEN_DEVICE_FUNC static const IdentityReturnType Identity(Index rows, Index cols);
+  EIGEN_DEVICE_FUNC static const BasisReturnType Unit(Index size, Index i);
+  EIGEN_DEVICE_FUNC static const BasisReturnType Unit(Index i);
+  EIGEN_DEVICE_FUNC static const BasisReturnType UnitX();
+  EIGEN_DEVICE_FUNC static const BasisReturnType UnitY();
+  EIGEN_DEVICE_FUNC static const BasisReturnType UnitZ();
+  EIGEN_DEVICE_FUNC static const BasisReturnType UnitW();
 
-    EIGEN_DEVICE_FUNC
-    const DiagonalWrapper<const Derived> asDiagonal() const;
-    const PermutationWrapper<const Derived> asPermutation() const;
-    EIGEN_DEVICE_FUNC
-    const SkewSymmetricWrapper<const Derived> asSkewSymmetric() const;
+  EIGEN_DEVICE_FUNC const DiagonalWrapper<const Derived> asDiagonal() const;
+  const PermutationWrapper<const Derived> asPermutation() const;
+  EIGEN_DEVICE_FUNC const SkewSymmetricWrapper<const Derived> asSkewSymmetric() const;
 
-    EIGEN_DEVICE_FUNC
-    Derived& setIdentity();
-    EIGEN_DEVICE_FUNC
-    Derived& setIdentity(Index rows, Index cols);
-    EIGEN_DEVICE_FUNC Derived& setUnit(Index i);
-    EIGEN_DEVICE_FUNC Derived& setUnit(Index newSize, Index i);
+  EIGEN_DEVICE_FUNC Derived& setIdentity();
+  EIGEN_DEVICE_FUNC Derived& setIdentity(Index rows, Index cols);
+  EIGEN_DEVICE_FUNC Derived& setUnit(Index i);
+  EIGEN_DEVICE_FUNC Derived& setUnit(Index newSize, Index i);
 
-    bool isIdentity(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
-    bool isDiagonal(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
+  bool isIdentity(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
+  bool isDiagonal(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
 
-    bool isUpperTriangular(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
-    bool isLowerTriangular(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
+  bool isUpperTriangular(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
+  bool isLowerTriangular(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
 
-    bool isSkewSymmetric(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
+  bool isSkewSymmetric(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
 
-    template<typename OtherDerived>
-    bool isOrthogonal(const MatrixBase<OtherDerived>& other,
-                      const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
-    bool isUnitary(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
+  template <typename OtherDerived>
+  bool isOrthogonal(const MatrixBase<OtherDerived>& other,
+                    const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
+  bool isUnitary(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
 
-    /** \returns true if each coefficients of \c *this and \a other are all exactly equal.
-      * \warning When using floating point scalar values you probably should rather use a
-      *          fuzzy comparison such as isApprox()
-      * \sa isApprox(), operator!= */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC inline bool operator==(const MatrixBase<OtherDerived>& other) const
-    { return cwiseEqual(other).all(); }
+  /** \returns true if each coefficients of \c *this and \a other are all exactly equal.
+   * \warning When using floating point scalar values you probably should rather use a
+   *          fuzzy comparison such as isApprox()
+   * \sa isApprox(), operator!= */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC inline bool operator==(const MatrixBase<OtherDerived>& other) const {
+    return cwiseEqual(other).all();
+  }
 
-    /** \returns true if at least one pair of coefficients of \c *this and \a other are not exactly equal to each other.
-      * \warning When using floating point scalar values you probably should rather use a
-      *          fuzzy comparison such as isApprox()
-      * \sa isApprox(), operator== */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC inline bool operator!=(const MatrixBase<OtherDerived>& other) const
-    { return cwiseNotEqual(other).any(); }
+  /** \returns true if at least one pair of coefficients of \c *this and \a other are not exactly equal to each other.
+   * \warning When using floating point scalar values you probably should rather use a
+   *          fuzzy comparison such as isApprox()
+   * \sa isApprox(), operator== */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC inline bool operator!=(const MatrixBase<OtherDerived>& other) const {
+    return cwiseNotEqual(other).any();
+  }
 
-    NoAlias<Derived,Eigen::MatrixBase > EIGEN_DEVICE_FUNC noalias();
+  NoAlias<Derived, Eigen::MatrixBase> EIGEN_DEVICE_FUNC noalias();
 
-    // TODO forceAlignedAccess is temporarily disabled
-    // Need to find a nicer workaround.
-    inline const Derived& forceAlignedAccess() const { return derived(); }
-    inline Derived& forceAlignedAccess() { return derived(); }
-    template<bool Enable> inline const Derived& forceAlignedAccessIf() const { return derived(); }
-    template<bool Enable> inline Derived& forceAlignedAccessIf() { return derived(); }
+  // TODO forceAlignedAccess is temporarily disabled
+  // Need to find a nicer workaround.
+  inline const Derived& forceAlignedAccess() const { return derived(); }
+  inline Derived& forceAlignedAccess() { return derived(); }
+  template <bool Enable>
+  inline const Derived& forceAlignedAccessIf() const {
+    return derived();
+  }
+  template <bool Enable>
+  inline Derived& forceAlignedAccessIf() {
+    return derived();
+  }
 
-    EIGEN_DEVICE_FUNC Scalar trace() const;
+  EIGEN_DEVICE_FUNC Scalar trace() const;
 
-    template<int p> EIGEN_DEVICE_FUNC RealScalar lpNorm() const;
+  template <int p>
+  EIGEN_DEVICE_FUNC RealScalar lpNorm() const;
 
-    EIGEN_DEVICE_FUNC MatrixBase<Derived>& matrix() { return *this; }
-    EIGEN_DEVICE_FUNC const MatrixBase<Derived>& matrix() const { return *this; }
+  EIGEN_DEVICE_FUNC MatrixBase<Derived>& matrix() { return *this; }
+  EIGEN_DEVICE_FUNC const MatrixBase<Derived>& matrix() const { return *this; }
+
+  /** \returns an \link Eigen::ArrayBase Array \endlink expression of this matrix
+   * \sa ArrayBase::matrix() */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ArrayWrapper<Derived> array() { return ArrayWrapper<Derived>(derived()); }
+  /** \returns a const \link Eigen::ArrayBase Array \endlink expression of this matrix
+   * \sa ArrayBase::matrix() */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const ArrayWrapper<const Derived> array() const {
+    return ArrayWrapper<const Derived>(derived());
+  }
 
-    /** \returns an \link Eigen::ArrayBase Array \endlink expression of this matrix
-      * \sa ArrayBase::matrix() */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ArrayWrapper<Derived> array() { return ArrayWrapper<Derived>(derived()); }
-    /** \returns a const \link Eigen::ArrayBase Array \endlink expression of this matrix
-      * \sa ArrayBase::matrix() */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const ArrayWrapper<const Derived> array() const { return ArrayWrapper<const Derived>(derived()); }
+  /////////// LU module ///////////
 
-/////////// LU module ///////////
+  template <typename PermutationIndex = DefaultPermutationIndex>
+  inline const FullPivLU<PlainObject, PermutationIndex> fullPivLu() const;
+  template <typename PermutationIndex = DefaultPermutationIndex>
+  inline const PartialPivLU<PlainObject, PermutationIndex> partialPivLu() const;
 
-    template<typename PermutationIndex = DefaultPermutationIndex> inline const FullPivLU<PlainObject, PermutationIndex> fullPivLu() const;
-    template<typename PermutationIndex = DefaultPermutationIndex> inline const PartialPivLU<PlainObject, PermutationIndex> partialPivLu() const;
+  template <typename PermutationIndex = DefaultPermutationIndex>
+  inline const PartialPivLU<PlainObject, PermutationIndex> lu() const;
 
-    template<typename PermutationIndex = DefaultPermutationIndex> inline const PartialPivLU<PlainObject, PermutationIndex> lu() const;
+  EIGEN_DEVICE_FUNC inline const Inverse<Derived> inverse() const;
 
-    EIGEN_DEVICE_FUNC
-    inline const Inverse<Derived> inverse() const;
+  template <typename ResultType>
+  inline void computeInverseAndDetWithCheck(
+      ResultType& inverse, typename ResultType::Scalar& determinant, bool& invertible,
+      const RealScalar& absDeterminantThreshold = NumTraits<Scalar>::dummy_precision()) const;
 
-    template<typename ResultType>
-    inline void computeInverseAndDetWithCheck(
-      ResultType& inverse,
-      typename ResultType::Scalar& determinant,
-      bool& invertible,
-      const RealScalar& absDeterminantThreshold = NumTraits<Scalar>::dummy_precision()
-    ) const;
+  template <typename ResultType>
+  inline void computeInverseWithCheck(
+      ResultType& inverse, bool& invertible,
+      const RealScalar& absDeterminantThreshold = NumTraits<Scalar>::dummy_precision()) const;
 
-    template<typename ResultType>
-    inline void computeInverseWithCheck(
-      ResultType& inverse,
-      bool& invertible,
-      const RealScalar& absDeterminantThreshold = NumTraits<Scalar>::dummy_precision()
-    ) const;
+  EIGEN_DEVICE_FUNC Scalar determinant() const;
 
-    EIGEN_DEVICE_FUNC
-    Scalar determinant() const;
+  /////////// Cholesky module ///////////
 
-/////////// Cholesky module ///////////
+  inline const LLT<PlainObject> llt() const;
+  inline const LDLT<PlainObject> ldlt() const;
 
-    inline const LLT<PlainObject>  llt() const;
-    inline const LDLT<PlainObject> ldlt() const;
+  /////////// QR module ///////////
 
-/////////// QR module ///////////
+  inline const HouseholderQR<PlainObject> householderQr() const;
+  template <typename PermutationIndex = DefaultPermutationIndex>
+  inline const ColPivHouseholderQR<PlainObject, PermutationIndex> colPivHouseholderQr() const;
+  template <typename PermutationIndex = DefaultPermutationIndex>
+  inline const FullPivHouseholderQR<PlainObject, PermutationIndex> fullPivHouseholderQr() const;
+  template <typename PermutationIndex = DefaultPermutationIndex>
+  inline const CompleteOrthogonalDecomposition<PlainObject, PermutationIndex> completeOrthogonalDecomposition() const;
 
-    inline const HouseholderQR<PlainObject> householderQr() const;
-    template<typename PermutationIndex = DefaultPermutationIndex> inline const ColPivHouseholderQR<PlainObject, PermutationIndex> colPivHouseholderQr() const;
-    template<typename PermutationIndex = DefaultPermutationIndex> inline const FullPivHouseholderQR<PlainObject, PermutationIndex> fullPivHouseholderQr() const;
-    template<typename PermutationIndex = DefaultPermutationIndex> inline const CompleteOrthogonalDecomposition<PlainObject, PermutationIndex> completeOrthogonalDecomposition() const;
+  /////////// Eigenvalues module ///////////
 
-/////////// Eigenvalues module ///////////
+  inline EigenvaluesReturnType eigenvalues() const;
+  inline RealScalar operatorNorm() const;
 
-    inline EigenvaluesReturnType eigenvalues() const;
-    inline RealScalar operatorNorm() const;
+  /////////// SVD module ///////////
 
-/////////// SVD module ///////////
+  template <int Options = 0>
+  inline JacobiSVD<PlainObject, Options> jacobiSvd() const;
+  template <int Options = 0>
+  EIGEN_DEPRECATED inline JacobiSVD<PlainObject, Options> jacobiSvd(unsigned int computationOptions) const;
 
-    template<int Options = 0>
-    inline JacobiSVD<PlainObject, Options> jacobiSvd() const;
-    template<int Options = 0>
-    EIGEN_DEPRECATED
-    inline JacobiSVD<PlainObject, Options> jacobiSvd(unsigned int computationOptions) const;
+  template <int Options = 0>
+  inline BDCSVD<PlainObject, Options> bdcSvd() const;
+  template <int Options = 0>
+  EIGEN_DEPRECATED inline BDCSVD<PlainObject, Options> bdcSvd(unsigned int computationOptions) const;
 
-    template<int Options = 0>
-    inline BDCSVD<PlainObject, Options> bdcSvd() const;
-    template<int Options = 0>
-    EIGEN_DEPRECATED
-    inline BDCSVD<PlainObject, Options> bdcSvd(unsigned int computationOptions) const;
+  /////////// Geometry module ///////////
 
-/////////// Geometry module ///////////
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC inline typename internal::cross_impl<Derived, OtherDerived>::return_type cross(
+      const MatrixBase<OtherDerived>& other) const;
 
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    inline typename internal::cross_impl<Derived, OtherDerived>::return_type
-    cross(const MatrixBase<OtherDerived>& other) const;
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC inline PlainObject cross3(const MatrixBase<OtherDerived>& other) const;
 
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    inline PlainObject cross3(const MatrixBase<OtherDerived>& other) const;
+  EIGEN_DEVICE_FUNC inline PlainObject unitOrthogonal(void) const;
 
-    EIGEN_DEVICE_FUNC
-    inline PlainObject unitOrthogonal(void) const;
+  EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline Matrix<Scalar, 3, 1> eulerAngles(Index a0, Index a1, Index a2) const;
 
-    EIGEN_DEPRECATED EIGEN_DEVICE_FUNC
-    inline Matrix<Scalar,3,1> eulerAngles(Index a0, Index a1, Index a2) const;
+  EIGEN_DEVICE_FUNC inline Matrix<Scalar, 3, 1> canonicalEulerAngles(Index a0, Index a1, Index a2) const;
 
-    EIGEN_DEVICE_FUNC
-    inline Matrix<Scalar,3,1> canonicalEulerAngles(Index a0, Index a1, Index a2) const;
+  // put this as separate enum value to work around possible GCC 4.3 bug (?)
+  enum {
+    HomogeneousReturnTypeDirection =
+        ColsAtCompileTime == 1 && RowsAtCompileTime == 1
+            ? ((internal::traits<Derived>::Flags & RowMajorBit) == RowMajorBit ? Horizontal : Vertical)
+        : ColsAtCompileTime == 1 ? Vertical
+                                 : Horizontal
+  };
+  typedef Homogeneous<Derived, HomogeneousReturnTypeDirection> HomogeneousReturnType;
+  EIGEN_DEVICE_FUNC inline HomogeneousReturnType homogeneous() const;
 
-    // put this as separate enum value to work around possible GCC 4.3 bug (?)
-    enum { HomogeneousReturnTypeDirection = ColsAtCompileTime==1&&RowsAtCompileTime==1 ? ((internal::traits<Derived>::Flags&RowMajorBit)==RowMajorBit ? Horizontal : Vertical)
-                                          : ColsAtCompileTime==1 ? Vertical : Horizontal };
-    typedef Homogeneous<Derived, HomogeneousReturnTypeDirection> HomogeneousReturnType;
-    EIGEN_DEVICE_FUNC
-    inline HomogeneousReturnType homogeneous() const;
+  enum { SizeMinusOne = SizeAtCompileTime == Dynamic ? Dynamic : SizeAtCompileTime - 1 };
+  typedef Block<const Derived, internal::traits<Derived>::ColsAtCompileTime == 1 ? SizeMinusOne : 1,
+                internal::traits<Derived>::ColsAtCompileTime == 1 ? 1 : SizeMinusOne>
+      ConstStartMinusOne;
+  typedef EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(ConstStartMinusOne, Scalar, quotient) HNormalizedReturnType;
+  EIGEN_DEVICE_FUNC inline const HNormalizedReturnType hnormalized() const;
 
-    enum {
-      SizeMinusOne = SizeAtCompileTime==Dynamic ? Dynamic : SizeAtCompileTime-1
-    };
-    typedef Block<const Derived,
-                  internal::traits<Derived>::ColsAtCompileTime==1 ? SizeMinusOne : 1,
-                  internal::traits<Derived>::ColsAtCompileTime==1 ? 1 : SizeMinusOne> ConstStartMinusOne;
-    typedef EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(ConstStartMinusOne,Scalar,quotient) HNormalizedReturnType;
-    EIGEN_DEVICE_FUNC
-    inline const HNormalizedReturnType hnormalized() const;
+  ////////// Householder module ///////////
 
-////////// Householder module ///////////
+  EIGEN_DEVICE_FUNC void makeHouseholderInPlace(Scalar& tau, RealScalar& beta);
+  template <typename EssentialPart>
+  EIGEN_DEVICE_FUNC void makeHouseholder(EssentialPart& essential, Scalar& tau, RealScalar& beta) const;
+  template <typename EssentialPart>
+  EIGEN_DEVICE_FUNC void applyHouseholderOnTheLeft(const EssentialPart& essential, const Scalar& tau,
+                                                   Scalar* workspace);
+  template <typename EssentialPart>
+  EIGEN_DEVICE_FUNC void applyHouseholderOnTheRight(const EssentialPart& essential, const Scalar& tau,
+                                                    Scalar* workspace);
 
-    EIGEN_DEVICE_FUNC
-    void makeHouseholderInPlace(Scalar& tau, RealScalar& beta);
-    template<typename EssentialPart>
-    EIGEN_DEVICE_FUNC
-    void makeHouseholder(EssentialPart& essential,
-                         Scalar& tau, RealScalar& beta) const;
-    template<typename EssentialPart>
-    EIGEN_DEVICE_FUNC
-    void applyHouseholderOnTheLeft(const EssentialPart& essential,
-                                   const Scalar& tau,
-                                   Scalar* workspace);
-    template<typename EssentialPart>
-    EIGEN_DEVICE_FUNC
-    void applyHouseholderOnTheRight(const EssentialPart& essential,
-                                    const Scalar& tau,
-                                    Scalar* workspace);
+  ///////// Jacobi module /////////
 
-///////// Jacobi module /////////
+  template <typename OtherScalar>
+  EIGEN_DEVICE_FUNC void applyOnTheLeft(Index p, Index q, const JacobiRotation<OtherScalar>& j);
+  template <typename OtherScalar>
+  EIGEN_DEVICE_FUNC void applyOnTheRight(Index p, Index q, const JacobiRotation<OtherScalar>& j);
 
-    template<typename OtherScalar>
-    EIGEN_DEVICE_FUNC
-    void applyOnTheLeft(Index p, Index q, const JacobiRotation<OtherScalar>& j);
-    template<typename OtherScalar>
-    EIGEN_DEVICE_FUNC
-    void applyOnTheRight(Index p, Index q, const JacobiRotation<OtherScalar>& j);
+  ///////// SparseCore module /////////
 
-///////// SparseCore module /////////
+  template <typename OtherDerived>
+  EIGEN_STRONG_INLINE const typename SparseMatrixBase<OtherDerived>::template CwiseProductDenseReturnType<Derived>::Type
+  cwiseProduct(const SparseMatrixBase<OtherDerived>& other) const {
+    return other.cwiseProduct(derived());
+  }
 
-    template<typename OtherDerived>
-    EIGEN_STRONG_INLINE const typename SparseMatrixBase<OtherDerived>::template CwiseProductDenseReturnType<Derived>::Type
-    cwiseProduct(const SparseMatrixBase<OtherDerived> &other) const
-    {
-      return other.cwiseProduct(derived());
-    }
+  ///////// MatrixFunctions module /////////
 
-///////// MatrixFunctions module /////////
+  typedef typename internal::stem_function<Scalar>::type StemFunction;
+#define EIGEN_MATRIX_FUNCTION(ReturnType, Name, Description)                                                        \
+  /** \returns an expression of the matrix Description of \c *this. \brief This function requires the <a            \
+   * href="unsupported/group__MatrixFunctions__Module.html"> unsupported MatrixFunctions module</a>. To compute the \
+   * coefficient-wise Description use ArrayBase::##Name . */                                                        \
+  const ReturnType<Derived> Name() const;
+#define EIGEN_MATRIX_FUNCTION_1(ReturnType, Name, Description, Argument)                                            \
+  /** \returns an expression of the matrix Description of \c *this. \brief This function requires the <a            \
+   * href="unsupported/group__MatrixFunctions__Module.html"> unsupported MatrixFunctions module</a>. To compute the \
+   * coefficient-wise Description use ArrayBase::##Name . */                                                        \
+  const ReturnType<Derived> Name(Argument) const;
 
-    typedef typename internal::stem_function<Scalar>::type StemFunction;
-#define EIGEN_MATRIX_FUNCTION(ReturnType, Name, Description) \
-    /** \returns an expression of the matrix Description of \c *this. \brief This function requires the <a href="unsupported/group__MatrixFunctions__Module.html"> unsupported MatrixFunctions module</a>. To compute the coefficient-wise Description use ArrayBase::##Name . */ \
-    const ReturnType<Derived> Name() const;
-#define EIGEN_MATRIX_FUNCTION_1(ReturnType, Name, Description, Argument) \
-    /** \returns an expression of the matrix Description of \c *this. \brief This function requires the <a href="unsupported/group__MatrixFunctions__Module.html"> unsupported MatrixFunctions module</a>. To compute the coefficient-wise Description use ArrayBase::##Name . */ \
-    const ReturnType<Derived> Name(Argument) const;
+  EIGEN_MATRIX_FUNCTION(MatrixExponentialReturnValue, exp, exponential)
+  /** \brief Helper function for the <a href="unsupported/group__MatrixFunctions__Module.html"> unsupported
+   * MatrixFunctions module</a>.*/
+  const MatrixFunctionReturnValue<Derived> matrixFunction(StemFunction f) const;
+  EIGEN_MATRIX_FUNCTION(MatrixFunctionReturnValue, cosh, hyperbolic cosine)
+  EIGEN_MATRIX_FUNCTION(MatrixFunctionReturnValue, sinh, hyperbolic sine)
+  EIGEN_MATRIX_FUNCTION(MatrixFunctionReturnValue, atanh, inverse hyperbolic cosine)
+  EIGEN_MATRIX_FUNCTION(MatrixFunctionReturnValue, acosh, inverse hyperbolic cosine)
+  EIGEN_MATRIX_FUNCTION(MatrixFunctionReturnValue, asinh, inverse hyperbolic sine)
+  EIGEN_MATRIX_FUNCTION(MatrixFunctionReturnValue, cos, cosine)
+  EIGEN_MATRIX_FUNCTION(MatrixFunctionReturnValue, sin, sine)
+  EIGEN_MATRIX_FUNCTION(MatrixSquareRootReturnValue, sqrt, square root)
+  EIGEN_MATRIX_FUNCTION(MatrixLogarithmReturnValue, log, logarithm)
+  EIGEN_MATRIX_FUNCTION_1(MatrixPowerReturnValue, pow, power to \c p, const RealScalar& p)
+  EIGEN_MATRIX_FUNCTION_1(MatrixComplexPowerReturnValue, pow, power to \c p, const std::complex<RealScalar>& p)
 
-    EIGEN_MATRIX_FUNCTION(MatrixExponentialReturnValue, exp, exponential)
-    /** \brief Helper function for the <a href="unsupported/group__MatrixFunctions__Module.html"> unsupported MatrixFunctions module</a>.*/
-    const MatrixFunctionReturnValue<Derived> matrixFunction(StemFunction f) const;
-    EIGEN_MATRIX_FUNCTION(MatrixFunctionReturnValue, cosh, hyperbolic cosine)
-    EIGEN_MATRIX_FUNCTION(MatrixFunctionReturnValue, sinh, hyperbolic sine)
-    EIGEN_MATRIX_FUNCTION(MatrixFunctionReturnValue, atanh, inverse hyperbolic cosine)
-    EIGEN_MATRIX_FUNCTION(MatrixFunctionReturnValue, acosh, inverse hyperbolic cosine)
-    EIGEN_MATRIX_FUNCTION(MatrixFunctionReturnValue, asinh, inverse hyperbolic sine)
-    EIGEN_MATRIX_FUNCTION(MatrixFunctionReturnValue, cos, cosine)
-    EIGEN_MATRIX_FUNCTION(MatrixFunctionReturnValue, sin, sine)
-    EIGEN_MATRIX_FUNCTION(MatrixSquareRootReturnValue, sqrt, square root)
-    EIGEN_MATRIX_FUNCTION(MatrixLogarithmReturnValue, log, logarithm)
-    EIGEN_MATRIX_FUNCTION_1(MatrixPowerReturnValue,        pow, power to \c p, const RealScalar& p)
-    EIGEN_MATRIX_FUNCTION_1(MatrixComplexPowerReturnValue, pow, power to \c p, const std::complex<RealScalar>& p)
+ protected:
+  EIGEN_DEFAULT_COPY_CONSTRUCTOR(MatrixBase)
+  EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(MatrixBase)
 
-  protected:
-    EIGEN_DEFAULT_COPY_CONSTRUCTOR(MatrixBase)
-    EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(MatrixBase)
+ private:
+  EIGEN_DEVICE_FUNC explicit MatrixBase(int);
+  EIGEN_DEVICE_FUNC MatrixBase(int, int);
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC explicit MatrixBase(const MatrixBase<OtherDerived>&);
 
-  private:
-    EIGEN_DEVICE_FUNC explicit MatrixBase(int);
-    EIGEN_DEVICE_FUNC MatrixBase(int,int);
-    template<typename OtherDerived> EIGEN_DEVICE_FUNC explicit MatrixBase(const MatrixBase<OtherDerived>&);
-  protected:
-    // mixing arrays and matrices is not legal
-    template<typename OtherDerived> Derived& operator+=(const ArrayBase<OtherDerived>& )
-    {EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar))==-1,YOU_CANNOT_MIX_ARRAYS_AND_MATRICES); return *this;}
-    // mixing arrays and matrices is not legal
-    template<typename OtherDerived> Derived& operator-=(const ArrayBase<OtherDerived>& )
-    {EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar))==-1,YOU_CANNOT_MIX_ARRAYS_AND_MATRICES); return *this;}
+ protected:
+  // mixing arrays and matrices is not legal
+  template <typename OtherDerived>
+  Derived& operator+=(const ArrayBase<OtherDerived>&) {
+    EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar)) == -1,
+                        YOU_CANNOT_MIX_ARRAYS_AND_MATRICES);
+    return *this;
+  }
+  // mixing arrays and matrices is not legal
+  template <typename OtherDerived>
+  Derived& operator-=(const ArrayBase<OtherDerived>&) {
+    EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar)) == -1,
+                        YOU_CANNOT_MIX_ARRAYS_AND_MATRICES);
+    return *this;
+  }
 };
 
-
 /***************************************************************************
-* Implementation of matrix base methods
-***************************************************************************/
+ * Implementation of matrix base methods
+ ***************************************************************************/
 
 /** replaces \c *this by \c *this * \a other.
-  *
-  * \returns a reference to \c *this
-  *
-  * Example: \include MatrixBase_applyOnTheRight.cpp
-  * Output: \verbinclude MatrixBase_applyOnTheRight.out
-  */
-template<typename Derived>
-template<typename OtherDerived>
-inline Derived&
-MatrixBase<Derived>::operator*=(const EigenBase<OtherDerived> &other)
-{
+ *
+ * \returns a reference to \c *this
+ *
+ * Example: \include MatrixBase_applyOnTheRight.cpp
+ * Output: \verbinclude MatrixBase_applyOnTheRight.out
+ */
+template <typename Derived>
+template <typename OtherDerived>
+inline Derived& MatrixBase<Derived>::operator*=(const EigenBase<OtherDerived>& other) {
   other.derived().applyThisOnTheRight(derived());
   return derived();
 }
 
 /** replaces \c *this by \c *this * \a other. It is equivalent to MatrixBase::operator*=().
-  *
-  * Example: \include MatrixBase_applyOnTheRight.cpp
-  * Output: \verbinclude MatrixBase_applyOnTheRight.out
-  */
-template<typename Derived>
-template<typename OtherDerived>
-inline void MatrixBase<Derived>::applyOnTheRight(const EigenBase<OtherDerived> &other)
-{
+ *
+ * Example: \include MatrixBase_applyOnTheRight.cpp
+ * Output: \verbinclude MatrixBase_applyOnTheRight.out
+ */
+template <typename Derived>
+template <typename OtherDerived>
+inline void MatrixBase<Derived>::applyOnTheRight(const EigenBase<OtherDerived>& other) {
   other.derived().applyThisOnTheRight(derived());
 }
 
 /** replaces \c *this by \a other * \c *this.
-  *
-  * Example: \include MatrixBase_applyOnTheLeft.cpp
-  * Output: \verbinclude MatrixBase_applyOnTheLeft.out
-  */
-template<typename Derived>
-template<typename OtherDerived>
-inline void MatrixBase<Derived>::applyOnTheLeft(const EigenBase<OtherDerived> &other)
-{
+ *
+ * Example: \include MatrixBase_applyOnTheLeft.cpp
+ * Output: \verbinclude MatrixBase_applyOnTheLeft.out
+ */
+template <typename Derived>
+template <typename OtherDerived>
+inline void MatrixBase<Derived>::applyOnTheLeft(const EigenBase<OtherDerived>& other) {
   other.derived().applyThisOnTheLeft(derived());
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_MATRIXBASE_H
+#endif  // EIGEN_MATRIXBASE_H
diff --git a/Eigen/src/Core/NestByValue.h b/Eigen/src/Core/NestByValue.h
index 7bcd97e..ec360eb 100644
--- a/Eigen/src/Core/NestByValue.h
+++ b/Eigen/src/Core/NestByValue.h
@@ -17,86 +17,75 @@
 namespace Eigen {
 
 namespace internal {
-template<typename ExpressionType>
-struct traits<NestByValue<ExpressionType> > : public traits<ExpressionType>
-{
-  enum {
-    Flags = traits<ExpressionType>::Flags & ~NestByRefBit
-  };
+template <typename ExpressionType>
+struct traits<NestByValue<ExpressionType> > : public traits<ExpressionType> {
+  enum { Flags = traits<ExpressionType>::Flags & ~NestByRefBit };
 };
-}
+}  // namespace internal
 
 /** \class NestByValue
-  * \ingroup Core_Module
-  *
-  * \brief Expression which must be nested by value
-  *
-  * \tparam ExpressionType the type of the object of which we are requiring nesting-by-value
-  *
-  * This class is the return type of MatrixBase::nestByValue()
-  * and most of the time this is the only way it is used.
-  *
-  * \sa MatrixBase::nestByValue()
-  */
-template<typename ExpressionType> class NestByValue
-  : public internal::dense_xpr_base< NestByValue<ExpressionType> >::type
-{
-  public:
+ * \ingroup Core_Module
+ *
+ * \brief Expression which must be nested by value
+ *
+ * \tparam ExpressionType the type of the object of which we are requiring nesting-by-value
+ *
+ * This class is the return type of MatrixBase::nestByValue()
+ * and most of the time this is the only way it is used.
+ *
+ * \sa MatrixBase::nestByValue()
+ */
+template <typename ExpressionType>
+class NestByValue : public internal::dense_xpr_base<NestByValue<ExpressionType> >::type {
+ public:
+  typedef typename internal::dense_xpr_base<NestByValue>::type Base;
+  static constexpr bool HasDirectAccess = internal::has_direct_access<ExpressionType>::ret;
 
-    typedef typename internal::dense_xpr_base<NestByValue>::type Base;
-    static constexpr bool HasDirectAccess = internal::has_direct_access<ExpressionType>::ret;
-    
-    EIGEN_DENSE_PUBLIC_INTERFACE(NestByValue)
+  EIGEN_DENSE_PUBLIC_INTERFACE(NestByValue)
 
-    EIGEN_DEVICE_FUNC explicit inline NestByValue(const ExpressionType& matrix) : m_expression(matrix) {}
+  EIGEN_DEVICE_FUNC explicit inline NestByValue(const ExpressionType& matrix) : m_expression(matrix) {}
 
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index rows() const EIGEN_NOEXCEPT { return m_expression.rows(); }
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index cols() const EIGEN_NOEXCEPT { return m_expression.cols(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index rows() const EIGEN_NOEXCEPT { return m_expression.rows(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index cols() const EIGEN_NOEXCEPT { return m_expression.cols(); }
 
-    EIGEN_DEVICE_FUNC operator const ExpressionType&() const { return m_expression; }
+  EIGEN_DEVICE_FUNC operator const ExpressionType&() const { return m_expression; }
 
-    EIGEN_DEVICE_FUNC const ExpressionType& nestedExpression() const { return m_expression; }
+  EIGEN_DEVICE_FUNC const ExpressionType& nestedExpression() const { return m_expression; }
 
-    EIGEN_DEVICE_FUNC typename std::enable_if<HasDirectAccess, const Scalar*>::type data() const {
-      return m_expression.data();
-    }
-    
-    EIGEN_DEVICE_FUNC typename std::enable_if<HasDirectAccess, Index>::type innerStride() const {
-      return m_expression.innerStride();
-    }
-    
-    EIGEN_DEVICE_FUNC typename std::enable_if<HasDirectAccess, Index>::type outerStride() const {
-      return m_expression.outerStride();
-    }
+  EIGEN_DEVICE_FUNC typename std::enable_if<HasDirectAccess, const Scalar*>::type data() const {
+    return m_expression.data();
+  }
 
-  protected:
-    const ExpressionType m_expression;
+  EIGEN_DEVICE_FUNC typename std::enable_if<HasDirectAccess, Index>::type innerStride() const {
+    return m_expression.innerStride();
+  }
+
+  EIGEN_DEVICE_FUNC typename std::enable_if<HasDirectAccess, Index>::type outerStride() const {
+    return m_expression.outerStride();
+  }
+
+ protected:
+  const ExpressionType m_expression;
 };
 
 /** \returns an expression of the temporary version of *this.
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC inline const NestByValue<Derived>
-DenseBase<Derived>::nestByValue() const
-{
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC inline const NestByValue<Derived> DenseBase<Derived>::nestByValue() const {
   return NestByValue<Derived>(derived());
 }
 
 namespace internal {
 
 // Evaluator of Solve -> eval into a temporary
-template<typename ArgType>
-struct evaluator<NestByValue<ArgType> >
-  : public evaluator<ArgType>
-{
+template <typename ArgType>
+struct evaluator<NestByValue<ArgType> > : public evaluator<ArgType> {
   typedef evaluator<ArgType> Base;
 
-  EIGEN_DEVICE_FUNC explicit evaluator(const NestByValue<ArgType>& xpr)
-    : Base(xpr.nestedExpression())
-  {}
+  EIGEN_DEVICE_FUNC explicit evaluator(const NestByValue<ArgType>& xpr) : Base(xpr.nestedExpression()) {}
 };
-}
+}  // namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_NESTBYVALUE_H
+#endif  // EIGEN_NESTBYVALUE_H
diff --git a/Eigen/src/Core/NoAlias.h b/Eigen/src/Core/NoAlias.h
index 8b032ff..b6c7209 100644
--- a/Eigen/src/Core/NoAlias.h
+++ b/Eigen/src/Core/NoAlias.h
@@ -16,97 +16,87 @@
 namespace Eigen {
 
 /** \class NoAlias
-  * \ingroup Core_Module
-  *
-  * \brief Pseudo expression providing an operator = assuming no aliasing
-  *
-  * \tparam ExpressionType the type of the object on which to do the lazy assignment
-  *
-  * This class represents an expression with special assignment operators
-  * assuming no aliasing between the target expression and the source expression.
-  * More precisely it alloas to bypass the EvalBeforeAssignBit flag of the source expression.
-  * It is the return type of MatrixBase::noalias()
-  * and most of the time this is the only way it is used.
-  *
-  * \sa MatrixBase::noalias()
-  */
-template<typename ExpressionType, template <typename> class StorageBase>
-class NoAlias
-{
-  public:
-    typedef typename ExpressionType::Scalar Scalar;
-    
-    EIGEN_DEVICE_FUNC
-    explicit NoAlias(ExpressionType& expression) : m_expression(expression) {}
-    
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE ExpressionType& operator=(const StorageBase<OtherDerived>& other)
-    {
-      call_assignment_no_alias(m_expression, other.derived(), internal::assign_op<Scalar,typename OtherDerived::Scalar>());
-      return m_expression;
-    }
-    
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE ExpressionType& operator+=(const StorageBase<OtherDerived>& other)
-    {
-      call_assignment_no_alias(m_expression, other.derived(), internal::add_assign_op<Scalar,typename OtherDerived::Scalar>());
-      return m_expression;
-    }
-    
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE ExpressionType& operator-=(const StorageBase<OtherDerived>& other)
-    {
-      call_assignment_no_alias(m_expression, other.derived(), internal::sub_assign_op<Scalar,typename OtherDerived::Scalar>());
-      return m_expression;
-    }
+ * \ingroup Core_Module
+ *
+ * \brief Pseudo expression providing an operator = assuming no aliasing
+ *
+ * \tparam ExpressionType the type of the object on which to do the lazy assignment
+ *
+ * This class represents an expression with special assignment operators
+ * assuming no aliasing between the target expression and the source expression.
+ * More precisely it alloas to bypass the EvalBeforeAssignBit flag of the source expression.
+ * It is the return type of MatrixBase::noalias()
+ * and most of the time this is the only way it is used.
+ *
+ * \sa MatrixBase::noalias()
+ */
+template <typename ExpressionType, template <typename> class StorageBase>
+class NoAlias {
+ public:
+  typedef typename ExpressionType::Scalar Scalar;
 
-    EIGEN_DEVICE_FUNC
-    ExpressionType& expression() const
-    {
-      return m_expression;
-    }
+  EIGEN_DEVICE_FUNC explicit NoAlias(ExpressionType& expression) : m_expression(expression) {}
 
-  protected:
-    ExpressionType& m_expression;
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ExpressionType& operator=(const StorageBase<OtherDerived>& other) {
+    call_assignment_no_alias(m_expression, other.derived(),
+                             internal::assign_op<Scalar, typename OtherDerived::Scalar>());
+    return m_expression;
+  }
+
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ExpressionType& operator+=(const StorageBase<OtherDerived>& other) {
+    call_assignment_no_alias(m_expression, other.derived(),
+                             internal::add_assign_op<Scalar, typename OtherDerived::Scalar>());
+    return m_expression;
+  }
+
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ExpressionType& operator-=(const StorageBase<OtherDerived>& other) {
+    call_assignment_no_alias(m_expression, other.derived(),
+                             internal::sub_assign_op<Scalar, typename OtherDerived::Scalar>());
+    return m_expression;
+  }
+
+  EIGEN_DEVICE_FUNC ExpressionType& expression() const { return m_expression; }
+
+ protected:
+  ExpressionType& m_expression;
 };
 
 /** \returns a pseudo expression of \c *this with an operator= assuming
-  * no aliasing between \c *this and the source expression.
-  *
-  * More precisely, noalias() allows to bypass the EvalBeforeAssignBit flag.
-  * Currently, even though several expressions may alias, only product
-  * expressions have this flag. Therefore, noalias() is only useful when
-  * the source expression contains a matrix product.
-  *
-  * Here are some examples where noalias is useful:
-  * \code
-  * D.noalias()  = A * B;
-  * D.noalias() += A.transpose() * B;
-  * D.noalias() -= 2 * A * B.adjoint();
-  * \endcode
-  *
-  * On the other hand the following example will lead to a \b wrong result:
-  * \code
-  * A.noalias() = A * B;
-  * \endcode
-  * because the result matrix A is also an operand of the matrix product. Therefore,
-  * there is no alternative than evaluating A * B in a temporary, that is the default
-  * behavior when you write:
-  * \code
-  * A = A * B;
-  * \endcode
-  *
-  * \sa class NoAlias
-  */
-template<typename Derived>
-NoAlias<Derived,MatrixBase> EIGEN_DEVICE_FUNC MatrixBase<Derived>::noalias()
-{
-  return NoAlias<Derived, Eigen::MatrixBase >(derived());
+ * no aliasing between \c *this and the source expression.
+ *
+ * More precisely, noalias() allows to bypass the EvalBeforeAssignBit flag.
+ * Currently, even though several expressions may alias, only product
+ * expressions have this flag. Therefore, noalias() is only useful when
+ * the source expression contains a matrix product.
+ *
+ * Here are some examples where noalias is useful:
+ * \code
+ * D.noalias()  = A * B;
+ * D.noalias() += A.transpose() * B;
+ * D.noalias() -= 2 * A * B.adjoint();
+ * \endcode
+ *
+ * On the other hand the following example will lead to a \b wrong result:
+ * \code
+ * A.noalias() = A * B;
+ * \endcode
+ * because the result matrix A is also an operand of the matrix product. Therefore,
+ * there is no alternative than evaluating A * B in a temporary, that is the default
+ * behavior when you write:
+ * \code
+ * A = A * B;
+ * \endcode
+ *
+ * \sa class NoAlias
+ */
+template <typename Derived>
+NoAlias<Derived, MatrixBase> EIGEN_DEVICE_FUNC MatrixBase<Derived>::noalias() {
+  return NoAlias<Derived, Eigen::MatrixBase>(derived());
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_NOALIAS_H
+#endif  // EIGEN_NOALIAS_H
diff --git a/Eigen/src/Core/NumTraits.h b/Eigen/src/Core/NumTraits.h
index a417b4c..80f74e9 100644
--- a/Eigen/src/Core/NumTraits.h
+++ b/Eigen/src/Core/NumTraits.h
@@ -19,95 +19,80 @@
 
 // default implementation of digits(), based on numeric_limits if specialized,
 // 0 for integer types, and log2(epsilon()) otherwise.
-template< typename T,
-          bool use_numeric_limits = std::numeric_limits<T>::is_specialized,
+template <typename T, bool use_numeric_limits = std::numeric_limits<T>::is_specialized,
           bool is_integer = NumTraits<T>::IsInteger>
-struct default_digits_impl
-{
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static int run() { return std::numeric_limits<T>::digits; }
+struct default_digits_impl {
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static int run() { return std::numeric_limits<T>::digits; }
 };
 
-template<typename T>
-struct default_digits_impl<T,false,false> // Floating point
+template <typename T>
+struct default_digits_impl<T, false, false>  // Floating point
 {
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static int run() {
-    using std::log2;
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static int run() {
     using std::ceil;
+    using std::log2;
     typedef typename NumTraits<T>::Real Real;
     return int(ceil(-log2(NumTraits<Real>::epsilon())));
   }
 };
 
-template<typename T>
-struct default_digits_impl<T,false,true> // Integer
+template <typename T>
+struct default_digits_impl<T, false, true>  // Integer
 {
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static int run() { return 0; }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static int run() { return 0; }
 };
 
 // default implementation of digits10(), based on numeric_limits if specialized,
 // 0 for integer types, and floor((digits()-1)*log10(2)) otherwise.
-template< typename T,
-          bool use_numeric_limits = std::numeric_limits<T>::is_specialized,
+template <typename T, bool use_numeric_limits = std::numeric_limits<T>::is_specialized,
           bool is_integer = NumTraits<T>::IsInteger>
-struct default_digits10_impl
-{
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static int run() { return std::numeric_limits<T>::digits10; }
+struct default_digits10_impl {
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static int run() { return std::numeric_limits<T>::digits10; }
 };
 
-template<typename T>
-struct default_digits10_impl<T,false,false> // Floating point
+template <typename T>
+struct default_digits10_impl<T, false, false>  // Floating point
 {
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static int run() {
-    using std::log10;
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static int run() {
     using std::floor;
+    using std::log10;
     typedef typename NumTraits<T>::Real Real;
-    return int(floor((internal::default_digits_impl<Real>::run()-1)*log10(2)));
+    return int(floor((internal::default_digits_impl<Real>::run() - 1) * log10(2)));
   }
 };
 
-template<typename T>
-struct default_digits10_impl<T,false,true> // Integer
+template <typename T>
+struct default_digits10_impl<T, false, true>  // Integer
 {
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static int run() { return 0; }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static int run() { return 0; }
 };
 
 // default implementation of max_digits10(), based on numeric_limits if specialized,
 // 0 for integer types, and log10(2) * digits() + 1 otherwise.
-template< typename T,
-          bool use_numeric_limits = std::numeric_limits<T>::is_specialized,
+template <typename T, bool use_numeric_limits = std::numeric_limits<T>::is_specialized,
           bool is_integer = NumTraits<T>::IsInteger>
-struct default_max_digits10_impl
-{
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static int run() { return std::numeric_limits<T>::max_digits10; }
+struct default_max_digits10_impl {
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static int run() { return std::numeric_limits<T>::max_digits10; }
 };
 
-template<typename T>
-struct default_max_digits10_impl<T,false,false> // Floating point
+template <typename T>
+struct default_max_digits10_impl<T, false, false>  // Floating point
 {
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static int run() {
-    using std::log10;
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static int run() {
     using std::ceil;
+    using std::log10;
     typedef typename NumTraits<T>::Real Real;
-    return int(ceil(internal::default_digits_impl<Real>::run()*log10(2)+1));
+    return int(ceil(internal::default_digits_impl<Real>::run() * log10(2) + 1));
   }
 };
 
-template<typename T>
-struct default_max_digits10_impl<T,false,true> // Integer
+template <typename T>
+struct default_max_digits10_impl<T, false, true>  // Integer
 {
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static int run() { return 0; }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static int run() { return 0; }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 namespace numext {
 /** \internal bit-wise cast without changing the underlying bit representation. */
@@ -125,67 +110,66 @@
   // Load src into registers first. This allows the memcpy to be elided by CUDA.
   const Src staged = src;
   EIGEN_USING_STD(memcpy)
-  memcpy(static_cast<void*>(&tgt),static_cast<const void*>(&staged), sizeof(Tgt));
+  memcpy(static_cast<void*>(&tgt), static_cast<const void*>(&staged), sizeof(Tgt));
   return tgt;
 }
 }  // namespace numext
 
 /** \class NumTraits
-  * \ingroup Core_Module
-  *
-  * \brief Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
-  *
-  * \tparam T the numeric type at hand
-  *
-  * This class stores enums, typedefs and static methods giving information about a numeric type.
-  *
-  * The provided data consists of:
-  * \li A typedef \c Real, giving the "real part" type of \a T. If \a T is already real,
-  *     then \c Real is just a typedef to \a T. If \a T is \c std::complex<U> then \c Real
-  *     is a typedef to \a U.
-  * \li A typedef \c NonInteger, giving the type that should be used for operations producing non-integral values,
-  *     such as quotients, square roots, etc. If \a T is a floating-point type, then this typedef just gives
-  *     \a T again. Note however that many Eigen functions such as internal::sqrt simply refuse to
-  *     take integers. Outside of a few cases, Eigen doesn't do automatic type promotion. Thus, this typedef is
-  *     only intended as a helper for code that needs to explicitly promote types.
-  * \li A typedef \c Literal giving the type to use for numeric literals such as "2" or "0.5". For instance, for \c std::complex<U>, Literal is defined as \c U.
-  *     Of course, this type must be fully compatible with \a T. In doubt, just use \a T here.
-  * \li A typedef \a Nested giving the type to use to nest a value inside of the expression tree. If you don't know what
-  *     this means, just use \a T here.
-  * \li An enum value \a IsComplex. It is equal to 1 if \a T is a \c std::complex
-  *     type, and to 0 otherwise.
-  * \li An enum value \a IsInteger. It is equal to \c 1 if \a T is an integer type such as \c int,
-  *     and to \c 0 otherwise.
-  * \li Enum values ReadCost, AddCost and MulCost representing a rough estimate of the number of CPU cycles needed
-  *     to by move / add / mul instructions respectively, assuming the data is already stored in CPU registers.
-  *     Stay vague here. No need to do architecture-specific stuff. If you don't know what this means, just use \c Eigen::HugeCost.
-  * \li An enum value \a IsSigned. It is equal to \c 1 if \a T is a signed type and to 0 if \a T is unsigned.
-  * \li An enum value \a RequireInitialization. It is equal to \c 1 if the constructor of the numeric type \a T must
-  *     be called, and to 0 if it is safe not to call it. Default is 0 if \a T is an arithmetic type, and 1 otherwise.
-  * \li An epsilon() function which, unlike <a href="http://en.cppreference.com/w/cpp/types/numeric_limits/epsilon">std::numeric_limits::epsilon()</a>,
-  *     it returns a \a Real instead of a \a T.
-  * \li A dummy_precision() function returning a weak epsilon value. It is mainly used as a default
-  *     value by the fuzzy comparison operators.
-  * \li highest() and lowest() functions returning the highest and lowest possible values respectively.
-  * \li digits() function returning the number of radix digits (non-sign digits for integers, mantissa for floating-point). This is
-  *     the analogue of <a href="http://en.cppreference.com/w/cpp/types/numeric_limits/digits">std::numeric_limits<T>::digits</a>
-  *     which is used as the default implementation if specialized.
-  * \li digits10() function returning the number of decimal digits that can be represented without change. This is
-  *     the analogue of <a href="http://en.cppreference.com/w/cpp/types/numeric_limits/digits10">std::numeric_limits<T>::digits10</a>
-  *     which is used as the default implementation if specialized.
-  * \li max_digits10() function returning the number of decimal digits required to uniquely represent all distinct values of the type. This is
-  *     the analogue of <a href="http://en.cppreference.com/w/cpp/types/numeric_limits/max_digits10">std::numeric_limits<T>::max_digits10</a>
-  *     which is used as the default implementation if specialized.
-  * \li min_exponent() and max_exponent() functions returning the highest and lowest possible values, respectively,
-  *     such that the radix raised to the power exponent-1 is a normalized floating-point number.  These are equivalent to
-  *     <a href="http://en.cppreference.com/w/cpp/types/numeric_limits/min_exponent">std::numeric_limits<T>::min_exponent</a>/
-  *     <a href="http://en.cppreference.com/w/cpp/types/numeric_limits/max_exponent">std::numeric_limits<T>::max_exponent</a>.
-  * \li infinity() function returning a representation of positive infinity, if available.
-  * \li quiet_NaN function returning a non-signaling "not-a-number", if available.
-  */
+ * \ingroup Core_Module
+ *
+ * \brief Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
+ *
+ * \tparam T the numeric type at hand
+ *
+ * This class stores enums, typedefs and static methods giving information about a numeric type.
+ *
+ * The provided data consists of:
+ * \li A typedef \c Real, giving the "real part" type of \a T. If \a T is already real,
+ *     then \c Real is just a typedef to \a T. If \a T is \c std::complex<U> then \c Real
+ *     is a typedef to \a U.
+ * \li A typedef \c NonInteger, giving the type that should be used for operations producing non-integral values,
+ *     such as quotients, square roots, etc. If \a T is a floating-point type, then this typedef just gives
+ *     \a T again. Note however that many Eigen functions such as internal::sqrt simply refuse to
+ *     take integers. Outside of a few cases, Eigen doesn't do automatic type promotion. Thus, this typedef is
+ *     only intended as a helper for code that needs to explicitly promote types.
+ * \li A typedef \c Literal giving the type to use for numeric literals such as "2" or "0.5". For instance, for \c
+ * std::complex<U>, Literal is defined as \c U. Of course, this type must be fully compatible with \a T. In doubt, just
+ * use \a T here. \li A typedef \a Nested giving the type to use to nest a value inside of the expression tree. If you
+ * don't know what this means, just use \a T here. \li An enum value \a IsComplex. It is equal to 1 if \a T is a \c
+ * std::complex type, and to 0 otherwise. \li An enum value \a IsInteger. It is equal to \c 1 if \a T is an integer type
+ * such as \c int, and to \c 0 otherwise. \li Enum values ReadCost, AddCost and MulCost representing a rough estimate of
+ * the number of CPU cycles needed to by move / add / mul instructions respectively, assuming the data is already stored
+ * in CPU registers. Stay vague here. No need to do architecture-specific stuff. If you don't know what this means, just
+ * use \c Eigen::HugeCost. \li An enum value \a IsSigned. It is equal to \c 1 if \a T is a signed type and to 0 if \a T
+ * is unsigned. \li An enum value \a RequireInitialization. It is equal to \c 1 if the constructor of the numeric type
+ * \a T must be called, and to 0 if it is safe not to call it. Default is 0 if \a T is an arithmetic type, and 1
+ * otherwise. \li An epsilon() function which, unlike <a
+ * href="http://en.cppreference.com/w/cpp/types/numeric_limits/epsilon">std::numeric_limits::epsilon()</a>, it returns a
+ * \a Real instead of a \a T. \li A dummy_precision() function returning a weak epsilon value. It is mainly used as a
+ * default value by the fuzzy comparison operators. \li highest() and lowest() functions returning the highest and
+ * lowest possible values respectively. \li digits() function returning the number of radix digits (non-sign digits for
+ * integers, mantissa for floating-point). This is the analogue of <a
+ * href="http://en.cppreference.com/w/cpp/types/numeric_limits/digits">std::numeric_limits<T>::digits</a> which is used
+ * as the default implementation if specialized. \li digits10() function returning the number of decimal digits that can
+ * be represented without change. This is the analogue of <a
+ * href="http://en.cppreference.com/w/cpp/types/numeric_limits/digits10">std::numeric_limits<T>::digits10</a> which is
+ * used as the default implementation if specialized. \li max_digits10() function returning the number of decimal digits
+ * required to uniquely represent all distinct values of the type. This is the analogue of <a
+ * href="http://en.cppreference.com/w/cpp/types/numeric_limits/max_digits10">std::numeric_limits<T>::max_digits10</a>
+ *     which is used as the default implementation if specialized.
+ * \li min_exponent() and max_exponent() functions returning the highest and lowest possible values, respectively,
+ *     such that the radix raised to the power exponent-1 is a normalized floating-point number.  These are equivalent
+ * to <a
+ * href="http://en.cppreference.com/w/cpp/types/numeric_limits/min_exponent">std::numeric_limits<T>::min_exponent</a>/
+ *     <a
+ * href="http://en.cppreference.com/w/cpp/types/numeric_limits/max_exponent">std::numeric_limits<T>::max_exponent</a>.
+ * \li infinity() function returning a representation of positive infinity, if available.
+ * \li quiet_NaN function returning a non-signaling "not-a-number", if available.
+ */
 
-template<typename T> struct GenericNumTraits
-{
+template <typename T>
+struct GenericNumTraits {
   enum {
     IsInteger = std::numeric_limits<T>::is_integer,
     IsSigned = std::numeric_limits<T>::is_signed,
@@ -197,104 +181,64 @@
   };
 
   typedef T Real;
-  typedef std::conditional_t<IsInteger, std::conditional_t<sizeof(T)<=2, float, double>, T> NonInteger;
+  typedef std::conditional_t<IsInteger, std::conditional_t<sizeof(T) <= 2, float, double>, T> NonInteger;
   typedef T Nested;
   typedef T Literal;
 
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static inline Real epsilon()
-  {
-    return numext::numeric_limits<T>::epsilon();
-  }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline Real epsilon() { return numext::numeric_limits<T>::epsilon(); }
 
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static inline int digits10()
-  {
-    return internal::default_digits10_impl<T>::run();
-  }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline int digits10() { return internal::default_digits10_impl<T>::run(); }
 
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static inline int max_digits10()
-  {
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline int max_digits10() {
     return internal::default_max_digits10_impl<T>::run();
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static inline int digits()
-  {
-    return internal::default_digits_impl<T>::run();
-  }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline int digits() { return internal::default_digits_impl<T>::run(); }
 
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static inline int min_exponent()
-  {
-    return numext::numeric_limits<T>::min_exponent;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline int min_exponent() { return numext::numeric_limits<T>::min_exponent; }
 
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static inline int max_exponent()
-  {
-    return numext::numeric_limits<T>::max_exponent;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline int max_exponent() { return numext::numeric_limits<T>::max_exponent; }
 
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static inline Real dummy_precision()
-  {
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline Real dummy_precision() {
     // make sure to override this for floating-point types
     return Real(0);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static inline T highest() {
-    return (numext::numeric_limits<T>::max)();
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline T highest() { return (numext::numeric_limits<T>::max)(); }
+
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline T lowest() {
+    return IsInteger ? (numext::numeric_limits<T>::min)() : static_cast<T>(-(numext::numeric_limits<T>::max)());
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static inline T lowest()  {
-    return IsInteger ? (numext::numeric_limits<T>::min)()
-                     : static_cast<T>(-(numext::numeric_limits<T>::max)());
-  }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline T infinity() { return numext::numeric_limits<T>::infinity(); }
 
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static inline T infinity() {
-    return numext::numeric_limits<T>::infinity();
-  }
-
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static inline T quiet_NaN() {
-    return numext::numeric_limits<T>::quiet_NaN();
-  }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline T quiet_NaN() { return numext::numeric_limits<T>::quiet_NaN(); }
 };
 
-template<typename T> struct NumTraits : GenericNumTraits<T>
-{};
+template <typename T>
+struct NumTraits : GenericNumTraits<T> {};
 
-template<> struct NumTraits<float>
-  : GenericNumTraits<float>
-{
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static inline float dummy_precision() { return 1e-5f; }
+template <>
+struct NumTraits<float> : GenericNumTraits<float> {
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline float dummy_precision() { return 1e-5f; }
 };
 
-template<> struct NumTraits<double> : GenericNumTraits<double>
-{
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static inline double dummy_precision() { return 1e-12; }
+template <>
+struct NumTraits<double> : GenericNumTraits<double> {
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline double dummy_precision() { return 1e-12; }
 };
 
 // GPU devices treat `long double` as `double`.
 #ifndef EIGEN_GPU_COMPILE_PHASE
-template<> struct NumTraits<long double>
-  : GenericNumTraits<long double>
-{
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static inline long double dummy_precision() { return static_cast<long double>(1e-15l); }
+template <>
+struct NumTraits<long double> : GenericNumTraits<long double> {
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline long double dummy_precision() {
+    return static_cast<long double>(1e-15l);
+  }
 
 #if defined(EIGEN_ARCH_PPC) && (__LDBL_MANT_DIG__ == 106)
   // PowerPC double double causes issues with some values
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static inline long double epsilon()
-  {
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline long double epsilon() {
     // 2^(-(__LDBL_MANT_DIG__)+1)
     return static_cast<long double>(2.4651903288156618919116517665087e-32l);
   }
@@ -302,9 +246,8 @@
 };
 #endif
 
-template<typename Real_> struct NumTraits<std::complex<Real_> >
-  : GenericNumTraits<std::complex<Real_> >
-{
+template <typename Real_>
+struct NumTraits<std::complex<Real_> > : GenericNumTraits<std::complex<Real_> > {
   typedef Real_ Real;
   typedef typename NumTraits<Real_>::Literal Literal;
   enum {
@@ -315,41 +258,40 @@
     MulCost = 4 * NumTraits<Real>::MulCost + 2 * NumTraits<Real>::AddCost
   };
 
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static inline Real epsilon() { return NumTraits<Real>::epsilon(); }
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static inline Real dummy_precision() { return NumTraits<Real>::dummy_precision(); }
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static inline int digits10() { return NumTraits<Real>::digits10(); }
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static inline int max_digits10() { return NumTraits<Real>::max_digits10(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline Real epsilon() { return NumTraits<Real>::epsilon(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline Real dummy_precision() { return NumTraits<Real>::dummy_precision(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline int digits10() { return NumTraits<Real>::digits10(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline int max_digits10() { return NumTraits<Real>::max_digits10(); }
 };
 
-template<typename Scalar, int Rows, int Cols, int Options, int MaxRows, int MaxCols>
-struct NumTraits<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols> >
-{
+template <typename Scalar, int Rows, int Cols, int Options, int MaxRows, int MaxCols>
+struct NumTraits<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols> > {
   typedef Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols> ArrayType;
   typedef typename NumTraits<Scalar>::Real RealScalar;
   typedef Array<RealScalar, Rows, Cols, Options, MaxRows, MaxCols> Real;
   typedef typename NumTraits<Scalar>::NonInteger NonIntegerScalar;
   typedef Array<NonIntegerScalar, Rows, Cols, Options, MaxRows, MaxCols> NonInteger;
-  typedef ArrayType & Nested;
+  typedef ArrayType& Nested;
   typedef typename NumTraits<Scalar>::Literal Literal;
 
   enum {
     IsComplex = NumTraits<Scalar>::IsComplex,
     IsInteger = NumTraits<Scalar>::IsInteger,
-    IsSigned  = NumTraits<Scalar>::IsSigned,
+    IsSigned = NumTraits<Scalar>::IsSigned,
     RequireInitialization = 1,
-    ReadCost = ArrayType::SizeAtCompileTime==Dynamic ? HugeCost : ArrayType::SizeAtCompileTime * int(NumTraits<Scalar>::ReadCost),
-    AddCost  = ArrayType::SizeAtCompileTime==Dynamic ? HugeCost : ArrayType::SizeAtCompileTime * int(NumTraits<Scalar>::AddCost),
-    MulCost  = ArrayType::SizeAtCompileTime==Dynamic ? HugeCost : ArrayType::SizeAtCompileTime * int(NumTraits<Scalar>::MulCost)
+    ReadCost = ArrayType::SizeAtCompileTime == Dynamic
+                   ? HugeCost
+                   : ArrayType::SizeAtCompileTime * int(NumTraits<Scalar>::ReadCost),
+    AddCost = ArrayType::SizeAtCompileTime == Dynamic ? HugeCost
+                                                      : ArrayType::SizeAtCompileTime * int(NumTraits<Scalar>::AddCost),
+    MulCost = ArrayType::SizeAtCompileTime == Dynamic ? HugeCost
+                                                      : ArrayType::SizeAtCompileTime * int(NumTraits<Scalar>::MulCost)
   };
 
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static inline RealScalar epsilon() { return NumTraits<RealScalar>::epsilon(); }
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  static inline RealScalar dummy_precision() { return NumTraits<RealScalar>::dummy_precision(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline RealScalar epsilon() { return NumTraits<RealScalar>::epsilon(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline RealScalar dummy_precision() {
+    return NumTraits<RealScalar>::dummy_precision();
+  }
 
   EIGEN_CONSTEXPR
   static inline int digits10() { return NumTraits<Scalar>::digits10(); }
@@ -357,15 +299,9 @@
   static inline int max_digits10() { return NumTraits<Scalar>::max_digits10(); }
 };
 
-template<> struct NumTraits<std::string>
-  : GenericNumTraits<std::string>
-{
-  enum {
-    RequireInitialization = 1,
-    ReadCost = HugeCost,
-    AddCost  = HugeCost,
-    MulCost  = HugeCost
-  };
+template <>
+struct NumTraits<std::string> : GenericNumTraits<std::string> {
+  enum { RequireInitialization = 1, ReadCost = HugeCost, AddCost = HugeCost, MulCost = HugeCost };
 
   EIGEN_CONSTEXPR
   static inline int digits10() { return 0; }
@@ -382,10 +318,12 @@
 };
 
 // Empty specialization for void to allow template specialization based on NumTraits<T>::Real with T==void and SFINAE.
-template<> struct NumTraits<void> {};
+template <>
+struct NumTraits<void> {};
 
-template<> struct NumTraits<bool> : GenericNumTraits<bool> {};
+template <>
+struct NumTraits<bool> : GenericNumTraits<bool> {};
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_NUMTRAITS_H
+#endif  // EIGEN_NUMTRAITS_H
diff --git a/Eigen/src/Core/PartialReduxEvaluator.h b/Eigen/src/Core/PartialReduxEvaluator.h
index f7653eb..7b2c8dc 100644
--- a/Eigen/src/Core/PartialReduxEvaluator.h
+++ b/Eigen/src/Core/PartialReduxEvaluator.h
@@ -13,80 +13,71 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
-
 /***************************************************************************
-*
-* This file provides evaluators for partial reductions.
-* There are two modes:
-*
-*  - scalar path: simply calls the respective function on the column or row.
-*    -> nothing special here, all the tricky part is handled by the return
-*       types of VectorwiseOp's members. They embed the functor calling the
-*       respective DenseBase's member function.
-*
-*  - vectorized path: implements a packet-wise reductions followed by
-*    some (optional) processing of the outcome, e.g., division by n for mean.
-*
-* For the vectorized path let's observe that the packet-size and outer-unrolling
-* are both decided by the assignment logic. So all we have to do is to decide
-* on the inner unrolling.
-*
-* For the unrolling, we can reuse "internal::redux_vec_unroller" from Redux.h,
-* but be need to be careful to specify correct increment.
-*
-***************************************************************************/
-
+ *
+ * This file provides evaluators for partial reductions.
+ * There are two modes:
+ *
+ *  - scalar path: simply calls the respective function on the column or row.
+ *    -> nothing special here, all the tricky part is handled by the return
+ *       types of VectorwiseOp's members. They embed the functor calling the
+ *       respective DenseBase's member function.
+ *
+ *  - vectorized path: implements a packet-wise reductions followed by
+ *    some (optional) processing of the outcome, e.g., division by n for mean.
+ *
+ * For the vectorized path let's observe that the packet-size and outer-unrolling
+ * are both decided by the assignment logic. So all we have to do is to decide
+ * on the inner unrolling.
+ *
+ * For the unrolling, we can reuse "internal::redux_vec_unroller" from Redux.h,
+ * but be need to be careful to specify correct increment.
+ *
+ ***************************************************************************/
 
 /* logic deciding a strategy for unrolling of vectorized paths */
-template<typename Func, typename Evaluator>
-struct packetwise_redux_traits
-{
+template <typename Func, typename Evaluator>
+struct packetwise_redux_traits {
   enum {
     OuterSize = int(Evaluator::IsRowMajor) ? Evaluator::RowsAtCompileTime : Evaluator::ColsAtCompileTime,
     Cost = OuterSize == Dynamic ? HugeCost
-         : OuterSize * Evaluator::CoeffReadCost + (OuterSize-1) * functor_traits<Func>::Cost,
+                                : OuterSize * Evaluator::CoeffReadCost + (OuterSize - 1) * functor_traits<Func>::Cost,
     Unrolling = Cost <= EIGEN_UNROLLING_LIMIT ? CompleteUnrolling : NoUnrolling
   };
-
 };
 
 /* Value to be returned when size==0 , by default let's return 0 */
-template<typename PacketType,typename Func>
-EIGEN_DEVICE_FUNC
-PacketType packetwise_redux_empty_value(const Func& ) {
+template <typename PacketType, typename Func>
+EIGEN_DEVICE_FUNC PacketType packetwise_redux_empty_value(const Func&) {
   const typename unpacket_traits<PacketType>::type zero(0);
   return pset1<PacketType>(zero);
 }
 
 /* For products the default is 1 */
-template<typename PacketType,typename Scalar>
-EIGEN_DEVICE_FUNC
-PacketType packetwise_redux_empty_value(const scalar_product_op<Scalar,Scalar>& ) {
+template <typename PacketType, typename Scalar>
+EIGEN_DEVICE_FUNC PacketType packetwise_redux_empty_value(const scalar_product_op<Scalar, Scalar>&) {
   return pset1<PacketType>(Scalar(1));
 }
 
 /* Perform the actual reduction */
-template<typename Func, typename Evaluator,
-         int Unrolling = packetwise_redux_traits<Func, Evaluator>::Unrolling
->
+template <typename Func, typename Evaluator, int Unrolling = packetwise_redux_traits<Func, Evaluator>::Unrolling>
 struct packetwise_redux_impl;
 
 /* Perform the actual reduction with unrolling */
-template<typename Func, typename Evaluator>
-struct packetwise_redux_impl<Func, Evaluator, CompleteUnrolling>
-{
-  typedef redux_novec_unroller<Func,Evaluator, 0, Evaluator::SizeAtCompileTime> Base;
+template <typename Func, typename Evaluator>
+struct packetwise_redux_impl<Func, Evaluator, CompleteUnrolling> {
+  typedef redux_novec_unroller<Func, Evaluator, 0, Evaluator::SizeAtCompileTime> Base;
   typedef typename Evaluator::Scalar Scalar;
 
-  template<typename PacketType>
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE
-  PacketType run(const Evaluator &eval, const Func& func, Index /*size*/)
-  {
-    return redux_vec_unroller<Func, Evaluator, 0, packetwise_redux_traits<Func, Evaluator>::OuterSize>::template run<PacketType>(eval,func);
+  template <typename PacketType>
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE PacketType run(const Evaluator& eval, const Func& func, Index /*size*/) {
+    return redux_vec_unroller<Func, Evaluator, 0,
+                              packetwise_redux_traits<Func, Evaluator>::OuterSize>::template run<PacketType>(eval,
+                                                                                                             func);
   }
 };
 
@@ -94,147 +85,125 @@
  * This specialization is not required for general reductions, which is
  * why it is defined here.
  */
-template<typename Func, typename Evaluator, Index Start>
-struct redux_vec_unroller<Func, Evaluator, Start, 0>
-{
-  template<typename PacketType>
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE PacketType run(const Evaluator &, const Func& f)
-  {
+template <typename Func, typename Evaluator, Index Start>
+struct redux_vec_unroller<Func, Evaluator, Start, 0> {
+  template <typename PacketType>
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE PacketType run(const Evaluator&, const Func& f) {
     return packetwise_redux_empty_value<PacketType>(f);
   }
 };
 
 /* Perform the actual reduction for dynamic sizes */
-template<typename Func, typename Evaluator>
-struct packetwise_redux_impl<Func, Evaluator, NoUnrolling>
-{
+template <typename Func, typename Evaluator>
+struct packetwise_redux_impl<Func, Evaluator, NoUnrolling> {
   typedef typename Evaluator::Scalar Scalar;
   typedef typename redux_traits<Func, Evaluator>::PacketType PacketScalar;
 
-  template<typename PacketType>
-  EIGEN_DEVICE_FUNC
-  static PacketType run(const Evaluator &eval, const Func& func, Index size)
-  {
-    if(size==0)
-      return packetwise_redux_empty_value<PacketType>(func);
-    
-    const Index size4 = (size-1)&(~3);
-    PacketType p = eval.template packetByOuterInner<Unaligned,PacketType>(0,0);
+  template <typename PacketType>
+  EIGEN_DEVICE_FUNC static PacketType run(const Evaluator& eval, const Func& func, Index size) {
+    if (size == 0) return packetwise_redux_empty_value<PacketType>(func);
+
+    const Index size4 = (size - 1) & (~3);
+    PacketType p = eval.template packetByOuterInner<Unaligned, PacketType>(0, 0);
     Index i = 1;
     // This loop is optimized for instruction pipelining:
     // - each iteration generates two independent instructions
     // - thanks to branch prediction and out-of-order execution we have independent instructions across loops
-    for(; i<size4; i+=4)
-      p = func.packetOp(p,
-            func.packetOp(
-              func.packetOp(eval.template packetByOuterInner<Unaligned,PacketType>(i+0,0),eval.template packetByOuterInner<Unaligned,PacketType>(i+1,0)),
-              func.packetOp(eval.template packetByOuterInner<Unaligned,PacketType>(i+2,0),eval.template packetByOuterInner<Unaligned,PacketType>(i+3,0))));
-    for(; i<size; ++i)
-      p = func.packetOp(p, eval.template packetByOuterInner<Unaligned,PacketType>(i,0));
+    for (; i < size4; i += 4)
+      p = func.packetOp(
+          p, func.packetOp(func.packetOp(eval.template packetByOuterInner<Unaligned, PacketType>(i + 0, 0),
+                                         eval.template packetByOuterInner<Unaligned, PacketType>(i + 1, 0)),
+                           func.packetOp(eval.template packetByOuterInner<Unaligned, PacketType>(i + 2, 0),
+                                         eval.template packetByOuterInner<Unaligned, PacketType>(i + 3, 0))));
+    for (; i < size; ++i) p = func.packetOp(p, eval.template packetByOuterInner<Unaligned, PacketType>(i, 0));
     return p;
   }
 };
 
-template< typename ArgType, typename MemberOp, int Direction>
+template <typename ArgType, typename MemberOp, int Direction>
 struct evaluator<PartialReduxExpr<ArgType, MemberOp, Direction> >
-  : evaluator_base<PartialReduxExpr<ArgType, MemberOp, Direction> >
-{
+    : evaluator_base<PartialReduxExpr<ArgType, MemberOp, Direction> > {
   typedef PartialReduxExpr<ArgType, MemberOp, Direction> XprType;
-  typedef typename internal::nested_eval<ArgType,1>::type ArgTypeNested;
+  typedef typename internal::nested_eval<ArgType, 1>::type ArgTypeNested;
   typedef add_const_on_value_type_t<ArgTypeNested> ConstArgTypeNested;
   typedef internal::remove_all_t<ArgTypeNested> ArgTypeNestedCleaned;
   typedef typename ArgType::Scalar InputScalar;
   typedef typename XprType::Scalar Scalar;
   enum {
-    TraversalSize = Direction==int(Vertical) ? int(ArgType::RowsAtCompileTime) :  int(ArgType::ColsAtCompileTime)
+    TraversalSize = Direction == int(Vertical) ? int(ArgType::RowsAtCompileTime) : int(ArgType::ColsAtCompileTime)
   };
   typedef typename MemberOp::template Cost<int(TraversalSize)> CostOpType;
   enum {
-    CoeffReadCost = TraversalSize==Dynamic ? HugeCost
-                  : TraversalSize==0 ? 1
-                  : int(TraversalSize) * int(evaluator<ArgType>::CoeffReadCost) + int(CostOpType::value),
-    
+    CoeffReadCost = TraversalSize == Dynamic ? HugeCost
+                    : TraversalSize == 0
+                        ? 1
+                        : int(TraversalSize) * int(evaluator<ArgType>::CoeffReadCost) + int(CostOpType::value),
+
     ArgFlags_ = evaluator<ArgType>::Flags,
 
-    Vectorizable_ =  bool(int(ArgFlags_)&PacketAccessBit)
-                  && bool(MemberOp::Vectorizable)
-                  && (Direction==int(Vertical) ? bool(ArgFlags_&RowMajorBit) : (ArgFlags_&RowMajorBit)==0)
-                  && (TraversalSize!=0),
-                  
-    Flags = (traits<XprType>::Flags&RowMajorBit)
-          | (evaluator<ArgType>::Flags&(HereditaryBits&(~RowMajorBit)))
-          | (Vectorizable_ ? PacketAccessBit : 0)
-          | LinearAccessBit,
-    
-    Alignment = 0 // FIXME this will need to be improved once PartialReduxExpr is vectorized
+    Vectorizable_ = bool(int(ArgFlags_) & PacketAccessBit) && bool(MemberOp::Vectorizable) &&
+                    (Direction == int(Vertical) ? bool(ArgFlags_ & RowMajorBit) : (ArgFlags_ & RowMajorBit) == 0) &&
+                    (TraversalSize != 0),
+
+    Flags = (traits<XprType>::Flags & RowMajorBit) | (evaluator<ArgType>::Flags & (HereditaryBits & (~RowMajorBit))) |
+            (Vectorizable_ ? PacketAccessBit : 0) | LinearAccessBit,
+
+    Alignment = 0  // FIXME this will need to be improved once PartialReduxExpr is vectorized
   };
 
-  EIGEN_DEVICE_FUNC explicit evaluator(const XprType xpr)
-    : m_arg(xpr.nestedExpression()), m_functor(xpr.functor())
-  {
-    EIGEN_INTERNAL_CHECK_COST_VALUE(TraversalSize==Dynamic ? HugeCost : (TraversalSize==0 ? 1 : int(CostOpType::value)));
+  EIGEN_DEVICE_FUNC explicit evaluator(const XprType xpr) : m_arg(xpr.nestedExpression()), m_functor(xpr.functor()) {
+    EIGEN_INTERNAL_CHECK_COST_VALUE(TraversalSize == Dynamic ? HugeCost
+                                                             : (TraversalSize == 0 ? 1 : int(CostOpType::value)));
     EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
   }
 
   typedef typename XprType::CoeffReturnType CoeffReturnType;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  const Scalar coeff(Index i, Index j) const
-  {
-    return coeff(Direction==Vertical ? j : i);
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar coeff(Index i, Index j) const {
+    return coeff(Direction == Vertical ? j : i);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  const Scalar coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar coeff(Index index) const {
     return m_functor(m_arg.template subVector<DirectionType(Direction)>(index));
   }
 
-  template<int LoadMode,typename PacketType>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  PacketType packet(Index i, Index j) const
-  {
-    return packet<LoadMode,PacketType>(Direction==Vertical ? j : i);
+  template <int LoadMode, typename PacketType>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketType packet(Index i, Index j) const {
+    return packet<LoadMode, PacketType>(Direction == Vertical ? j : i);
   }
-  
-  template<int LoadMode,typename PacketType>
-  EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
-  PacketType packet(Index idx) const
-  {
+
+  template <int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC PacketType packet(Index idx) const {
     enum { PacketSize = internal::unpacket_traits<PacketType>::size };
-    typedef Block<const ArgTypeNestedCleaned,
-                  Direction==Vertical ? int(ArgType::RowsAtCompileTime) : int(PacketSize),
-                  Direction==Vertical ? int(PacketSize) : int(ArgType::ColsAtCompileTime),
-                  true /* InnerPanel */> PanelType;
-    
-    PanelType panel(m_arg,
-                    Direction==Vertical ? 0 : idx,
-                    Direction==Vertical ? idx : 0,
-                    Direction==Vertical ? m_arg.rows() : Index(PacketSize),
-                    Direction==Vertical ? Index(PacketSize) : m_arg.cols());
+    typedef Block<const ArgTypeNestedCleaned, Direction == Vertical ? int(ArgType::RowsAtCompileTime) : int(PacketSize),
+                  Direction == Vertical ? int(PacketSize) : int(ArgType::ColsAtCompileTime), true /* InnerPanel */>
+        PanelType;
+
+    PanelType panel(m_arg, Direction == Vertical ? 0 : idx, Direction == Vertical ? idx : 0,
+                    Direction == Vertical ? m_arg.rows() : Index(PacketSize),
+                    Direction == Vertical ? Index(PacketSize) : m_arg.cols());
 
     // FIXME
-    // See bug 1612, currently if PacketSize==1 (i.e. complex<double> with 128bits registers) then the storage-order of panel get reversed
-    // and methods like packetByOuterInner do not make sense anymore in this context.
-    // So let's just by pass "vectorization" in this case:
-    if(PacketSize==1)
-      return internal::pset1<PacketType>(coeff(idx));
-    
+    // See bug 1612, currently if PacketSize==1 (i.e. complex<double> with 128bits registers) then the storage-order of
+    // panel get reversed and methods like packetByOuterInner do not make sense anymore in this context. So let's just
+    // by pass "vectorization" in this case:
+    if (PacketSize == 1) return internal::pset1<PacketType>(coeff(idx));
+
     typedef typename internal::redux_evaluator<PanelType> PanelEvaluator;
     PanelEvaluator panel_eval(panel);
     typedef typename MemberOp::BinaryOp BinaryOp;
-    PacketType p = internal::packetwise_redux_impl<BinaryOp,PanelEvaluator>::template run<PacketType>(panel_eval,m_functor.binaryFunc(),m_arg.outerSize());
+    PacketType p = internal::packetwise_redux_impl<BinaryOp, PanelEvaluator>::template run<PacketType>(
+        panel_eval, m_functor.binaryFunc(), m_arg.outerSize());
     return p;
   }
 
-protected:
+ protected:
   ConstArgTypeNested m_arg;
   const MemberOp m_functor;
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_PARTIALREDUX_H
+#endif  // EIGEN_PARTIALREDUX_H
diff --git a/Eigen/src/Core/PermutationMatrix.h b/Eigen/src/Core/PermutationMatrix.h
index 9255465..6945964 100644
--- a/Eigen/src/Core/PermutationMatrix.h
+++ b/Eigen/src/Core/PermutationMatrix.h
@@ -14,452 +14,413 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
-enum PermPermProduct_t {PermPermProduct};
+enum PermPermProduct_t { PermPermProduct };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \class PermutationBase
-  * \ingroup Core_Module
-  *
-  * \brief Base class for permutations
-  *
-  * \tparam Derived the derived class
-  *
-  * This class is the base class for all expressions representing a permutation matrix,
-  * internally stored as a vector of integers.
-  * The convention followed here is that if \f$ \sigma \f$ is a permutation, the corresponding permutation matrix
-  * \f$ P_\sigma \f$ is such that if \f$ (e_1,\ldots,e_p) \f$ is the canonical basis, we have:
-  *  \f[ P_\sigma(e_i) = e_{\sigma(i)}. \f]
-  * This convention ensures that for any two permutations \f$ \sigma, \tau \f$, we have:
-  *  \f[ P_{\sigma\circ\tau} = P_\sigma P_\tau. \f]
-  *
-  * Permutation matrices are square and invertible.
-  *
-  * Notice that in addition to the member functions and operators listed here, there also are non-member
-  * operator* to multiply any kind of permutation object with any kind of matrix expression (MatrixBase)
-  * on either side.
-  *
-  * \sa class PermutationMatrix, class PermutationWrapper
-  */
-template<typename Derived>
-class PermutationBase : public EigenBase<Derived>
-{
-    typedef internal::traits<Derived> Traits;
-    typedef EigenBase<Derived> Base;
-  public:
+ * \ingroup Core_Module
+ *
+ * \brief Base class for permutations
+ *
+ * \tparam Derived the derived class
+ *
+ * This class is the base class for all expressions representing a permutation matrix,
+ * internally stored as a vector of integers.
+ * The convention followed here is that if \f$ \sigma \f$ is a permutation, the corresponding permutation matrix
+ * \f$ P_\sigma \f$ is such that if \f$ (e_1,\ldots,e_p) \f$ is the canonical basis, we have:
+ *  \f[ P_\sigma(e_i) = e_{\sigma(i)}. \f]
+ * This convention ensures that for any two permutations \f$ \sigma, \tau \f$, we have:
+ *  \f[ P_{\sigma\circ\tau} = P_\sigma P_\tau. \f]
+ *
+ * Permutation matrices are square and invertible.
+ *
+ * Notice that in addition to the member functions and operators listed here, there also are non-member
+ * operator* to multiply any kind of permutation object with any kind of matrix expression (MatrixBase)
+ * on either side.
+ *
+ * \sa class PermutationMatrix, class PermutationWrapper
+ */
+template <typename Derived>
+class PermutationBase : public EigenBase<Derived> {
+  typedef internal::traits<Derived> Traits;
+  typedef EigenBase<Derived> Base;
 
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    typedef typename Traits::IndicesType IndicesType;
-    enum {
-      Flags = Traits::Flags,
-      RowsAtCompileTime = Traits::RowsAtCompileTime,
-      ColsAtCompileTime = Traits::ColsAtCompileTime,
-      MaxRowsAtCompileTime = Traits::MaxRowsAtCompileTime,
-      MaxColsAtCompileTime = Traits::MaxColsAtCompileTime
-    };
-    typedef typename Traits::StorageIndex StorageIndex;
-    typedef Matrix<StorageIndex,RowsAtCompileTime,ColsAtCompileTime,0,MaxRowsAtCompileTime,MaxColsAtCompileTime>
-            DenseMatrixType;
-    typedef PermutationMatrix<IndicesType::SizeAtCompileTime,IndicesType::MaxSizeAtCompileTime,StorageIndex>
-            PlainPermutationType;
-    typedef PlainPermutationType PlainObject;
-    using Base::derived;
-    typedef Inverse<Derived> InverseReturnType;
-    typedef void Scalar;
-    #endif
-
-    /** Copies the other permutation into *this */
-    template<typename OtherDerived>
-    Derived& operator=(const PermutationBase<OtherDerived>& other)
-    {
-      indices() = other.indices();
-      return derived();
-    }
-
-    /** Assignment from the Transpositions \a tr */
-    template<typename OtherDerived>
-    Derived& operator=(const TranspositionsBase<OtherDerived>& tr)
-    {
-      setIdentity(tr.size());
-      for(Index k=size()-1; k>=0; --k)
-        applyTranspositionOnTheRight(k,tr.coeff(k));
-      return derived();
-    }
-
-    /** \returns the number of rows */
-    inline EIGEN_DEVICE_FUNC Index rows() const { return Index(indices().size()); }
-
-    /** \returns the number of columns */
-    inline EIGEN_DEVICE_FUNC Index cols() const { return Index(indices().size()); }
-
-    /** \returns the size of a side of the respective square matrix, i.e., the number of indices */
-    inline EIGEN_DEVICE_FUNC Index size() const { return Index(indices().size()); }
-
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    template<typename DenseDerived>
-    void evalTo(MatrixBase<DenseDerived>& other) const
-    {
-      other.setZero();
-      for (Index i=0; i<rows(); ++i)
-        other.coeffRef(indices().coeff(i),i) = typename DenseDerived::Scalar(1);
-    }
-    #endif
-
-    /** \returns a Matrix object initialized from this permutation matrix. Notice that it
-      * is inefficient to return this Matrix object by value. For efficiency, favor using
-      * the Matrix constructor taking EigenBase objects.
-      */
-    DenseMatrixType toDenseMatrix() const
-    {
-      return derived();
-    }
-
-    /** const version of indices(). */
-    const IndicesType& indices() const { return derived().indices(); }
-    /** \returns a reference to the stored array representing the permutation. */
-    IndicesType& indices() { return derived().indices(); }
-
-    /** Resizes to given size.
-      */
-    inline void resize(Index newSize)
-    {
-      indices().resize(newSize);
-    }
-
-    /** Sets *this to be the identity permutation matrix */
-    void setIdentity()
-    {
-      StorageIndex n = StorageIndex(size());
-      for(StorageIndex i = 0; i < n; ++i)
-        indices().coeffRef(i) = i;
-    }
-
-    /** Sets *this to be the identity permutation matrix of given size.
-      */
-    void setIdentity(Index newSize)
-    {
-      resize(newSize);
-      setIdentity();
-    }
-
-    /** Multiplies *this by the transposition \f$(ij)\f$ on the left.
-      *
-      * \returns a reference to *this.
-      *
-      * \warning This is much slower than applyTranspositionOnTheRight(Index,Index):
-      * this has linear complexity and requires a lot of branching.
-      *
-      * \sa applyTranspositionOnTheRight(Index,Index)
-      */
-    Derived& applyTranspositionOnTheLeft(Index i, Index j)
-    {
-      eigen_assert(i>=0 && j>=0 && i<size() && j<size());
-      for(Index k = 0; k < size(); ++k)
-      {
-        if(indices().coeff(k) == i) indices().coeffRef(k) = StorageIndex(j);
-        else if(indices().coeff(k) == j) indices().coeffRef(k) = StorageIndex(i);
-      }
-      return derived();
-    }
-
-    /** Multiplies *this by the transposition \f$(ij)\f$ on the right.
-      *
-      * \returns a reference to *this.
-      *
-      * This is a fast operation, it only consists in swapping two indices.
-      *
-      * \sa applyTranspositionOnTheLeft(Index,Index)
-      */
-    Derived& applyTranspositionOnTheRight(Index i, Index j)
-    {
-      eigen_assert(i>=0 && j>=0 && i<size() && j<size());
-      std::swap(indices().coeffRef(i), indices().coeffRef(j));
-      return derived();
-    }
-
-    /** \returns the inverse permutation matrix.
-      *
-      * \note \blank \note_try_to_help_rvo
-      */
-    inline InverseReturnType inverse() const
-    { return InverseReturnType(derived()); }
-    /** \returns the tranpose permutation matrix.
-      *
-      * \note \blank \note_try_to_help_rvo
-      */
-    inline InverseReturnType transpose() const
-    { return InverseReturnType(derived()); }
-
-    /**** multiplication helpers to hopefully get RVO ****/
-
-  
+ public:
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-  protected:
-    template<typename OtherDerived>
-    void assignTranspose(const PermutationBase<OtherDerived>& other)
-    {
-      for (Index i=0; i<rows();++i) indices().coeffRef(other.indices().coeff(i)) = i;
-    }
-    template<typename Lhs,typename Rhs>
-    void assignProduct(const Lhs& lhs, const Rhs& rhs)
-    {
-      eigen_assert(lhs.cols() == rhs.rows());
-      for (Index i=0; i<rows();++i) indices().coeffRef(i) = lhs.indices().coeff(rhs.indices().coeff(i));
-    }
+  typedef typename Traits::IndicesType IndicesType;
+  enum {
+    Flags = Traits::Flags,
+    RowsAtCompileTime = Traits::RowsAtCompileTime,
+    ColsAtCompileTime = Traits::ColsAtCompileTime,
+    MaxRowsAtCompileTime = Traits::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = Traits::MaxColsAtCompileTime
+  };
+  typedef typename Traits::StorageIndex StorageIndex;
+  typedef Matrix<StorageIndex, RowsAtCompileTime, ColsAtCompileTime, 0, MaxRowsAtCompileTime, MaxColsAtCompileTime>
+      DenseMatrixType;
+  typedef PermutationMatrix<IndicesType::SizeAtCompileTime, IndicesType::MaxSizeAtCompileTime, StorageIndex>
+      PlainPermutationType;
+  typedef PlainPermutationType PlainObject;
+  using Base::derived;
+  typedef Inverse<Derived> InverseReturnType;
+  typedef void Scalar;
 #endif
 
-  public:
+  /** Copies the other permutation into *this */
+  template <typename OtherDerived>
+  Derived& operator=(const PermutationBase<OtherDerived>& other) {
+    indices() = other.indices();
+    return derived();
+  }
 
-    /** \returns the product permutation matrix.
-      *
-      * \note \blank \note_try_to_help_rvo
-      */
-    template<typename Other>
-    inline PlainPermutationType operator*(const PermutationBase<Other>& other) const
-    { return PlainPermutationType(internal::PermPermProduct, derived(), other.derived()); }
+  /** Assignment from the Transpositions \a tr */
+  template <typename OtherDerived>
+  Derived& operator=(const TranspositionsBase<OtherDerived>& tr) {
+    setIdentity(tr.size());
+    for (Index k = size() - 1; k >= 0; --k) applyTranspositionOnTheRight(k, tr.coeff(k));
+    return derived();
+  }
 
-    /** \returns the product of a permutation with another inverse permutation.
-      *
-      * \note \blank \note_try_to_help_rvo
-      */
-    template<typename Other>
-    inline PlainPermutationType operator*(const InverseImpl<Other,PermutationStorage>& other) const
-    { return PlainPermutationType(internal::PermPermProduct, *this, other.eval()); }
+  /** \returns the number of rows */
+  inline EIGEN_DEVICE_FUNC Index rows() const { return Index(indices().size()); }
 
-    /** \returns the product of an inverse permutation with another permutation.
-      *
-      * \note \blank \note_try_to_help_rvo
-      */
-    template<typename Other> friend
-    inline PlainPermutationType operator*(const InverseImpl<Other, PermutationStorage>& other, const PermutationBase& perm)
-    { return PlainPermutationType(internal::PermPermProduct, other.eval(), perm); }
-    
-    /** \returns the determinant of the permutation matrix, which is either 1 or -1 depending on the parity of the permutation.
-      *
-      * This function is O(\c n) procedure allocating a buffer of \c n booleans.
-      */
-    Index determinant() const
-    {
-      Index res = 1;
-      Index n = size();
-      Matrix<bool,RowsAtCompileTime,1,0,MaxRowsAtCompileTime> mask(n);
-      mask.fill(false);
-      Index r = 0;
-      while(r < n)
-      {
-        // search for the next seed
-        while(r<n && mask[r]) r++;
-        if(r>=n)
-          break;
-        // we got one, let's follow it until we are back to the seed
-        Index k0 = r++;
-        mask.coeffRef(k0) = true;
-        for(Index k=indices().coeff(k0); k!=k0; k=indices().coeff(k))
-        {
-          mask.coeffRef(k) = true;
-          res = -res;
-        }
-      }
-      return res;
+  /** \returns the number of columns */
+  inline EIGEN_DEVICE_FUNC Index cols() const { return Index(indices().size()); }
+
+  /** \returns the size of a side of the respective square matrix, i.e., the number of indices */
+  inline EIGEN_DEVICE_FUNC Index size() const { return Index(indices().size()); }
+
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  template <typename DenseDerived>
+  void evalTo(MatrixBase<DenseDerived>& other) const {
+    other.setZero();
+    for (Index i = 0; i < rows(); ++i) other.coeffRef(indices().coeff(i), i) = typename DenseDerived::Scalar(1);
+  }
+#endif
+
+  /** \returns a Matrix object initialized from this permutation matrix. Notice that it
+   * is inefficient to return this Matrix object by value. For efficiency, favor using
+   * the Matrix constructor taking EigenBase objects.
+   */
+  DenseMatrixType toDenseMatrix() const { return derived(); }
+
+  /** const version of indices(). */
+  const IndicesType& indices() const { return derived().indices(); }
+  /** \returns a reference to the stored array representing the permutation. */
+  IndicesType& indices() { return derived().indices(); }
+
+  /** Resizes to given size.
+   */
+  inline void resize(Index newSize) { indices().resize(newSize); }
+
+  /** Sets *this to be the identity permutation matrix */
+  void setIdentity() {
+    StorageIndex n = StorageIndex(size());
+    for (StorageIndex i = 0; i < n; ++i) indices().coeffRef(i) = i;
+  }
+
+  /** Sets *this to be the identity permutation matrix of given size.
+   */
+  void setIdentity(Index newSize) {
+    resize(newSize);
+    setIdentity();
+  }
+
+  /** Multiplies *this by the transposition \f$(ij)\f$ on the left.
+   *
+   * \returns a reference to *this.
+   *
+   * \warning This is much slower than applyTranspositionOnTheRight(Index,Index):
+   * this has linear complexity and requires a lot of branching.
+   *
+   * \sa applyTranspositionOnTheRight(Index,Index)
+   */
+  Derived& applyTranspositionOnTheLeft(Index i, Index j) {
+    eigen_assert(i >= 0 && j >= 0 && i < size() && j < size());
+    for (Index k = 0; k < size(); ++k) {
+      if (indices().coeff(k) == i)
+        indices().coeffRef(k) = StorageIndex(j);
+      else if (indices().coeff(k) == j)
+        indices().coeffRef(k) = StorageIndex(i);
     }
+    return derived();
+  }
 
-  protected:
+  /** Multiplies *this by the transposition \f$(ij)\f$ on the right.
+   *
+   * \returns a reference to *this.
+   *
+   * This is a fast operation, it only consists in swapping two indices.
+   *
+   * \sa applyTranspositionOnTheLeft(Index,Index)
+   */
+  Derived& applyTranspositionOnTheRight(Index i, Index j) {
+    eigen_assert(i >= 0 && j >= 0 && i < size() && j < size());
+    std::swap(indices().coeffRef(i), indices().coeffRef(j));
+    return derived();
+  }
 
+  /** \returns the inverse permutation matrix.
+   *
+   * \note \blank \note_try_to_help_rvo
+   */
+  inline InverseReturnType inverse() const { return InverseReturnType(derived()); }
+  /** \returns the tranpose permutation matrix.
+   *
+   * \note \blank \note_try_to_help_rvo
+   */
+  inline InverseReturnType transpose() const { return InverseReturnType(derived()); }
+
+  /**** multiplication helpers to hopefully get RVO ****/
+
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+ protected:
+  template <typename OtherDerived>
+  void assignTranspose(const PermutationBase<OtherDerived>& other) {
+    for (Index i = 0; i < rows(); ++i) indices().coeffRef(other.indices().coeff(i)) = i;
+  }
+  template <typename Lhs, typename Rhs>
+  void assignProduct(const Lhs& lhs, const Rhs& rhs) {
+    eigen_assert(lhs.cols() == rhs.rows());
+    for (Index i = 0; i < rows(); ++i) indices().coeffRef(i) = lhs.indices().coeff(rhs.indices().coeff(i));
+  }
+#endif
+
+ public:
+  /** \returns the product permutation matrix.
+   *
+   * \note \blank \note_try_to_help_rvo
+   */
+  template <typename Other>
+  inline PlainPermutationType operator*(const PermutationBase<Other>& other) const {
+    return PlainPermutationType(internal::PermPermProduct, derived(), other.derived());
+  }
+
+  /** \returns the product of a permutation with another inverse permutation.
+   *
+   * \note \blank \note_try_to_help_rvo
+   */
+  template <typename Other>
+  inline PlainPermutationType operator*(const InverseImpl<Other, PermutationStorage>& other) const {
+    return PlainPermutationType(internal::PermPermProduct, *this, other.eval());
+  }
+
+  /** \returns the product of an inverse permutation with another permutation.
+   *
+   * \note \blank \note_try_to_help_rvo
+   */
+  template <typename Other>
+  friend inline PlainPermutationType operator*(const InverseImpl<Other, PermutationStorage>& other,
+                                               const PermutationBase& perm) {
+    return PlainPermutationType(internal::PermPermProduct, other.eval(), perm);
+  }
+
+  /** \returns the determinant of the permutation matrix, which is either 1 or -1 depending on the parity of the
+   * permutation.
+   *
+   * This function is O(\c n) procedure allocating a buffer of \c n booleans.
+   */
+  Index determinant() const {
+    Index res = 1;
+    Index n = size();
+    Matrix<bool, RowsAtCompileTime, 1, 0, MaxRowsAtCompileTime> mask(n);
+    mask.fill(false);
+    Index r = 0;
+    while (r < n) {
+      // search for the next seed
+      while (r < n && mask[r]) r++;
+      if (r >= n) break;
+      // we got one, let's follow it until we are back to the seed
+      Index k0 = r++;
+      mask.coeffRef(k0) = true;
+      for (Index k = indices().coeff(k0); k != k0; k = indices().coeff(k)) {
+        mask.coeffRef(k) = true;
+        res = -res;
+      }
+    }
+    return res;
+  }
+
+ protected:
 };
 
 namespace internal {
-template<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename StorageIndex_>
+template <int SizeAtCompileTime, int MaxSizeAtCompileTime, typename StorageIndex_>
 struct traits<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, StorageIndex_> >
- : traits<Matrix<StorageIndex_,SizeAtCompileTime,SizeAtCompileTime,0,MaxSizeAtCompileTime,MaxSizeAtCompileTime> >
-{
+    : traits<
+          Matrix<StorageIndex_, SizeAtCompileTime, SizeAtCompileTime, 0, MaxSizeAtCompileTime, MaxSizeAtCompileTime> > {
   typedef PermutationStorage StorageKind;
   typedef Matrix<StorageIndex_, SizeAtCompileTime, 1, 0, MaxSizeAtCompileTime, 1> IndicesType;
   typedef StorageIndex_ StorageIndex;
   typedef void Scalar;
 };
-}
+}  // namespace internal
 
 /** \class PermutationMatrix
-  * \ingroup Core_Module
-  *
-  * \brief Permutation matrix
-  *
-  * \tparam SizeAtCompileTime the number of rows/cols, or Dynamic
-  * \tparam MaxSizeAtCompileTime the maximum number of rows/cols, or Dynamic. This optional parameter defaults to SizeAtCompileTime. Most of the time, you should not have to specify it.
-  * \tparam StorageIndex_ the integer type of the indices
-  *
-  * This class represents a permutation matrix, internally stored as a vector of integers.
-  *
-  * \sa class PermutationBase, class PermutationWrapper, class DiagonalMatrix
-  */
-template<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename StorageIndex_>
-class PermutationMatrix : public PermutationBase<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, StorageIndex_> >
-{
-    typedef PermutationBase<PermutationMatrix> Base;
-    typedef internal::traits<PermutationMatrix> Traits;
-  public:
+ * \ingroup Core_Module
+ *
+ * \brief Permutation matrix
+ *
+ * \tparam SizeAtCompileTime the number of rows/cols, or Dynamic
+ * \tparam MaxSizeAtCompileTime the maximum number of rows/cols, or Dynamic. This optional parameter defaults to
+ * SizeAtCompileTime. Most of the time, you should not have to specify it. \tparam StorageIndex_ the integer type of the
+ * indices
+ *
+ * This class represents a permutation matrix, internally stored as a vector of integers.
+ *
+ * \sa class PermutationBase, class PermutationWrapper, class DiagonalMatrix
+ */
+template <int SizeAtCompileTime, int MaxSizeAtCompileTime, typename StorageIndex_>
+class PermutationMatrix
+    : public PermutationBase<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, StorageIndex_> > {
+  typedef PermutationBase<PermutationMatrix> Base;
+  typedef internal::traits<PermutationMatrix> Traits;
 
-    typedef const PermutationMatrix& Nested;
-
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    typedef typename Traits::IndicesType IndicesType;
-    typedef typename Traits::StorageIndex StorageIndex;
-    #endif
-
-    inline PermutationMatrix()
-    {}
-
-    /** Constructs an uninitialized permutation matrix of given size.
-      */
-    explicit inline PermutationMatrix(Index size) : m_indices(size)
-    {
-      eigen_internal_assert(size <= NumTraits<StorageIndex>::highest());
-    }
-
-    /** Copy constructor. */
-    template<typename OtherDerived>
-    inline PermutationMatrix(const PermutationBase<OtherDerived>& other)
-      : m_indices(other.indices()) {}
-
-    /** Generic constructor from expression of the indices. The indices
-      * array has the meaning that the permutations sends each integer i to indices[i].
-      *
-      * \warning It is your responsibility to check that the indices array that you passes actually
-      * describes a permutation, i.e., each value between 0 and n-1 occurs exactly once, where n is the
-      * array's size.
-      */
-    template<typename Other>
-    explicit inline PermutationMatrix(const MatrixBase<Other>& indices) : m_indices(indices)
-    {}
-
-    /** Convert the Transpositions \a tr to a permutation matrix */
-    template<typename Other>
-    explicit PermutationMatrix(const TranspositionsBase<Other>& tr)
-      : m_indices(tr.size())
-    {
-      *this = tr;
-    }
-
-    /** Copies the other permutation into *this */
-    template<typename Other>
-    PermutationMatrix& operator=(const PermutationBase<Other>& other)
-    {
-      m_indices = other.indices();
-      return *this;
-    }
-
-    /** Assignment from the Transpositions \a tr */
-    template<typename Other>
-    PermutationMatrix& operator=(const TranspositionsBase<Other>& tr)
-    {
-      return Base::operator=(tr.derived());
-    }
-
-    /** const version of indices(). */
-    const IndicesType& indices() const { return m_indices; }
-    /** \returns a reference to the stored array representing the permutation. */
-    IndicesType& indices() { return m_indices; }
-
-
-    /**** multiplication helpers to hopefully get RVO ****/
+ public:
+  typedef const PermutationMatrix& Nested;
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-    template<typename Other>
-    PermutationMatrix(const InverseImpl<Other,PermutationStorage>& other)
-      : m_indices(other.derived().nestedExpression().size())
-    {
-      eigen_internal_assert(m_indices.size() <= NumTraits<StorageIndex>::highest());
-      StorageIndex end = StorageIndex(m_indices.size());
-      for (StorageIndex i=0; i<end;++i)
-        m_indices.coeffRef(other.derived().nestedExpression().indices().coeff(i)) = i;
-    }
-    template<typename Lhs,typename Rhs>
-    PermutationMatrix(internal::PermPermProduct_t, const Lhs& lhs, const Rhs& rhs)
-      : m_indices(lhs.indices().size())
-    {
-      Base::assignProduct(lhs,rhs);
-    }
+  typedef typename Traits::IndicesType IndicesType;
+  typedef typename Traits::StorageIndex StorageIndex;
 #endif
 
-  protected:
+  inline PermutationMatrix() {}
 
-    IndicesType m_indices;
+  /** Constructs an uninitialized permutation matrix of given size.
+   */
+  explicit inline PermutationMatrix(Index size) : m_indices(size) {
+    eigen_internal_assert(size <= NumTraits<StorageIndex>::highest());
+  }
+
+  /** Copy constructor. */
+  template <typename OtherDerived>
+  inline PermutationMatrix(const PermutationBase<OtherDerived>& other) : m_indices(other.indices()) {}
+
+  /** Generic constructor from expression of the indices. The indices
+   * array has the meaning that the permutations sends each integer i to indices[i].
+   *
+   * \warning It is your responsibility to check that the indices array that you passes actually
+   * describes a permutation, i.e., each value between 0 and n-1 occurs exactly once, where n is the
+   * array's size.
+   */
+  template <typename Other>
+  explicit inline PermutationMatrix(const MatrixBase<Other>& indices) : m_indices(indices) {}
+
+  /** Convert the Transpositions \a tr to a permutation matrix */
+  template <typename Other>
+  explicit PermutationMatrix(const TranspositionsBase<Other>& tr) : m_indices(tr.size()) {
+    *this = tr;
+  }
+
+  /** Copies the other permutation into *this */
+  template <typename Other>
+  PermutationMatrix& operator=(const PermutationBase<Other>& other) {
+    m_indices = other.indices();
+    return *this;
+  }
+
+  /** Assignment from the Transpositions \a tr */
+  template <typename Other>
+  PermutationMatrix& operator=(const TranspositionsBase<Other>& tr) {
+    return Base::operator=(tr.derived());
+  }
+
+  /** const version of indices(). */
+  const IndicesType& indices() const { return m_indices; }
+  /** \returns a reference to the stored array representing the permutation. */
+  IndicesType& indices() { return m_indices; }
+
+  /**** multiplication helpers to hopefully get RVO ****/
+
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  template <typename Other>
+  PermutationMatrix(const InverseImpl<Other, PermutationStorage>& other)
+      : m_indices(other.derived().nestedExpression().size()) {
+    eigen_internal_assert(m_indices.size() <= NumTraits<StorageIndex>::highest());
+    StorageIndex end = StorageIndex(m_indices.size());
+    for (StorageIndex i = 0; i < end; ++i)
+      m_indices.coeffRef(other.derived().nestedExpression().indices().coeff(i)) = i;
+  }
+  template <typename Lhs, typename Rhs>
+  PermutationMatrix(internal::PermPermProduct_t, const Lhs& lhs, const Rhs& rhs) : m_indices(lhs.indices().size()) {
+    Base::assignProduct(lhs, rhs);
+  }
+#endif
+
+ protected:
+  IndicesType m_indices;
 };
 
-
 namespace internal {
-template<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename StorageIndex_, int PacketAccess_>
-struct traits<Map<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, StorageIndex_>,PacketAccess_> >
- : traits<Matrix<StorageIndex_,SizeAtCompileTime,SizeAtCompileTime,0,MaxSizeAtCompileTime,MaxSizeAtCompileTime> >
-{
+template <int SizeAtCompileTime, int MaxSizeAtCompileTime, typename StorageIndex_, int PacketAccess_>
+struct traits<Map<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, StorageIndex_>, PacketAccess_> >
+    : traits<
+          Matrix<StorageIndex_, SizeAtCompileTime, SizeAtCompileTime, 0, MaxSizeAtCompileTime, MaxSizeAtCompileTime> > {
   typedef PermutationStorage StorageKind;
   typedef Map<const Matrix<StorageIndex_, SizeAtCompileTime, 1, 0, MaxSizeAtCompileTime, 1>, PacketAccess_> IndicesType;
   typedef StorageIndex_ StorageIndex;
   typedef void Scalar;
 };
-}
+}  // namespace internal
 
-template<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename StorageIndex_, int PacketAccess_>
-class Map<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, StorageIndex_>,PacketAccess_>
-  : public PermutationBase<Map<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, StorageIndex_>,PacketAccess_> >
-{
-    typedef PermutationBase<Map> Base;
-    typedef internal::traits<Map> Traits;
-  public:
+template <int SizeAtCompileTime, int MaxSizeAtCompileTime, typename StorageIndex_, int PacketAccess_>
+class Map<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, StorageIndex_>, PacketAccess_>
+    : public PermutationBase<
+          Map<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, StorageIndex_>, PacketAccess_> > {
+  typedef PermutationBase<Map> Base;
+  typedef internal::traits<Map> Traits;
 
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    typedef typename Traits::IndicesType IndicesType;
-    typedef typename IndicesType::Scalar StorageIndex;
-    #endif
+ public:
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  typedef typename Traits::IndicesType IndicesType;
+  typedef typename IndicesType::Scalar StorageIndex;
+#endif
 
-    inline Map(const StorageIndex* indicesPtr)
-      : m_indices(indicesPtr)
-    {}
+  inline Map(const StorageIndex* indicesPtr) : m_indices(indicesPtr) {}
 
-    inline Map(const StorageIndex* indicesPtr, Index size)
-      : m_indices(indicesPtr,size)
-    {}
+  inline Map(const StorageIndex* indicesPtr, Index size) : m_indices(indicesPtr, size) {}
 
-    /** Copies the other permutation into *this */
-    template<typename Other>
-    Map& operator=(const PermutationBase<Other>& other)
-    { return Base::operator=(other.derived()); }
+  /** Copies the other permutation into *this */
+  template <typename Other>
+  Map& operator=(const PermutationBase<Other>& other) {
+    return Base::operator=(other.derived());
+  }
 
-    /** Assignment from the Transpositions \a tr */
-    template<typename Other>
-    Map& operator=(const TranspositionsBase<Other>& tr)
-    { return Base::operator=(tr.derived()); }
+  /** Assignment from the Transpositions \a tr */
+  template <typename Other>
+  Map& operator=(const TranspositionsBase<Other>& tr) {
+    return Base::operator=(tr.derived());
+  }
 
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    /** This is a special case of the templated operator=. Its purpose is to
-      * prevent a default operator= from hiding the templated operator=.
-      */
-    Map& operator=(const Map& other)
-    {
-      m_indices = other.m_indices;
-      return *this;
-    }
-    #endif
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  /** This is a special case of the templated operator=. Its purpose is to
+   * prevent a default operator= from hiding the templated operator=.
+   */
+  Map& operator=(const Map& other) {
+    m_indices = other.m_indices;
+    return *this;
+  }
+#endif
 
-    /** const version of indices(). */
-    const IndicesType& indices() const { return m_indices; }
-    /** \returns a reference to the stored array representing the permutation. */
-    IndicesType& indices() { return m_indices; }
+  /** const version of indices(). */
+  const IndicesType& indices() const { return m_indices; }
+  /** \returns a reference to the stored array representing the permutation. */
+  IndicesType& indices() { return m_indices; }
 
-  protected:
-
-    IndicesType m_indices;
+ protected:
+  IndicesType m_indices;
 };
 
-template<typename IndicesType_> class TranspositionsWrapper;
+template <typename IndicesType_>
+class TranspositionsWrapper;
 namespace internal {
-template<typename IndicesType_>
-struct traits<PermutationWrapper<IndicesType_> >
-{
+template <typename IndicesType_>
+struct traits<PermutationWrapper<IndicesType_> > {
   typedef PermutationStorage StorageKind;
   typedef void Scalar;
   typedef typename IndicesType_::Scalar StorageIndex;
@@ -472,137 +433,120 @@
     Flags = 0
   };
 };
-}
+}  // namespace internal
 
 /** \class PermutationWrapper
-  * \ingroup Core_Module
-  *
-  * \brief Class to view a vector of integers as a permutation matrix
-  *
-  * \tparam IndicesType_ the type of the vector of integer (can be any compatible expression)
-  *
-  * This class allows to view any vector expression of integers as a permutation matrix.
-  *
-  * \sa class PermutationBase, class PermutationMatrix
-  */
-template<typename IndicesType_>
-class PermutationWrapper : public PermutationBase<PermutationWrapper<IndicesType_> >
-{
-    typedef PermutationBase<PermutationWrapper> Base;
-    typedef internal::traits<PermutationWrapper> Traits;
-  public:
+ * \ingroup Core_Module
+ *
+ * \brief Class to view a vector of integers as a permutation matrix
+ *
+ * \tparam IndicesType_ the type of the vector of integer (can be any compatible expression)
+ *
+ * This class allows to view any vector expression of integers as a permutation matrix.
+ *
+ * \sa class PermutationBase, class PermutationMatrix
+ */
+template <typename IndicesType_>
+class PermutationWrapper : public PermutationBase<PermutationWrapper<IndicesType_> > {
+  typedef PermutationBase<PermutationWrapper> Base;
+  typedef internal::traits<PermutationWrapper> Traits;
 
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    typedef typename Traits::IndicesType IndicesType;
-    #endif
+ public:
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  typedef typename Traits::IndicesType IndicesType;
+#endif
 
-    inline PermutationWrapper(const IndicesType& indices)
-      : m_indices(indices)
-    {}
+  inline PermutationWrapper(const IndicesType& indices) : m_indices(indices) {}
 
-    /** const version of indices(). */
-    const internal::remove_all_t<typename IndicesType::Nested>&
-    indices() const { return m_indices; }
+  /** const version of indices(). */
+  const internal::remove_all_t<typename IndicesType::Nested>& indices() const { return m_indices; }
 
-  protected:
-
-    typename IndicesType::Nested m_indices;
+ protected:
+  typename IndicesType::Nested m_indices;
 };
 
-
 /** \returns the matrix with the permutation applied to the columns.
-  */
-template<typename MatrixDerived, typename PermutationDerived>
-EIGEN_DEVICE_FUNC
-const Product<MatrixDerived, PermutationDerived, AliasFreeProduct>
-operator*(const MatrixBase<MatrixDerived> &matrix,
-          const PermutationBase<PermutationDerived>& permutation)
-{
-  return Product<MatrixDerived, PermutationDerived, AliasFreeProduct>
-            (matrix.derived(), permutation.derived());
+ */
+template <typename MatrixDerived, typename PermutationDerived>
+EIGEN_DEVICE_FUNC const Product<MatrixDerived, PermutationDerived, AliasFreeProduct> operator*(
+    const MatrixBase<MatrixDerived>& matrix, const PermutationBase<PermutationDerived>& permutation) {
+  return Product<MatrixDerived, PermutationDerived, AliasFreeProduct>(matrix.derived(), permutation.derived());
 }
 
 /** \returns the matrix with the permutation applied to the rows.
-  */
-template<typename PermutationDerived, typename MatrixDerived>
-EIGEN_DEVICE_FUNC
-const Product<PermutationDerived, MatrixDerived, AliasFreeProduct>
-operator*(const PermutationBase<PermutationDerived> &permutation,
-          const MatrixBase<MatrixDerived>& matrix)
-{
-  return Product<PermutationDerived, MatrixDerived, AliasFreeProduct>
-            (permutation.derived(), matrix.derived());
+ */
+template <typename PermutationDerived, typename MatrixDerived>
+EIGEN_DEVICE_FUNC const Product<PermutationDerived, MatrixDerived, AliasFreeProduct> operator*(
+    const PermutationBase<PermutationDerived>& permutation, const MatrixBase<MatrixDerived>& matrix) {
+  return Product<PermutationDerived, MatrixDerived, AliasFreeProduct>(permutation.derived(), matrix.derived());
 }
 
+template <typename PermutationType>
+class InverseImpl<PermutationType, PermutationStorage> : public EigenBase<Inverse<PermutationType> > {
+  typedef typename PermutationType::PlainPermutationType PlainPermutationType;
+  typedef internal::traits<PermutationType> PermTraits;
 
-template<typename PermutationType>
-class InverseImpl<PermutationType, PermutationStorage>
-  : public EigenBase<Inverse<PermutationType> >
-{
-    typedef typename PermutationType::PlainPermutationType PlainPermutationType;
-    typedef internal::traits<PermutationType> PermTraits;
-  protected:
-    InverseImpl() {}
-  public:
-    typedef Inverse<PermutationType> InverseType;
-    using EigenBase<Inverse<PermutationType> >::derived;
+ protected:
+  InverseImpl() {}
 
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    typedef typename PermutationType::DenseMatrixType DenseMatrixType;
-    enum {
-      RowsAtCompileTime = PermTraits::RowsAtCompileTime,
-      ColsAtCompileTime = PermTraits::ColsAtCompileTime,
-      MaxRowsAtCompileTime = PermTraits::MaxRowsAtCompileTime,
-      MaxColsAtCompileTime = PermTraits::MaxColsAtCompileTime
-    };
-    #endif
+ public:
+  typedef Inverse<PermutationType> InverseType;
+  using EigenBase<Inverse<PermutationType> >::derived;
 
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    template<typename DenseDerived>
-    void evalTo(MatrixBase<DenseDerived>& other) const
-    {
-      other.setZero();
-      for (Index i=0; i<derived().rows();++i)
-        other.coeffRef(i, derived().nestedExpression().indices().coeff(i)) = typename DenseDerived::Scalar(1);
-    }
-    #endif
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  typedef typename PermutationType::DenseMatrixType DenseMatrixType;
+  enum {
+    RowsAtCompileTime = PermTraits::RowsAtCompileTime,
+    ColsAtCompileTime = PermTraits::ColsAtCompileTime,
+    MaxRowsAtCompileTime = PermTraits::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = PermTraits::MaxColsAtCompileTime
+  };
+#endif
 
-    /** \return the equivalent permutation matrix */
-    PlainPermutationType eval() const { return derived(); }
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  template <typename DenseDerived>
+  void evalTo(MatrixBase<DenseDerived>& other) const {
+    other.setZero();
+    for (Index i = 0; i < derived().rows(); ++i)
+      other.coeffRef(i, derived().nestedExpression().indices().coeff(i)) = typename DenseDerived::Scalar(1);
+  }
+#endif
 
-    DenseMatrixType toDenseMatrix() const { return derived(); }
+  /** \return the equivalent permutation matrix */
+  PlainPermutationType eval() const { return derived(); }
 
-    /** \returns the matrix with the inverse permutation applied to the columns.
-      */
-    template<typename OtherDerived> friend
-    const Product<OtherDerived, InverseType, AliasFreeProduct>
-    operator*(const MatrixBase<OtherDerived>& matrix, const InverseType& trPerm)
-    {
-      return Product<OtherDerived, InverseType, AliasFreeProduct>(matrix.derived(), trPerm.derived());
-    }
+  DenseMatrixType toDenseMatrix() const { return derived(); }
 
-    /** \returns the matrix with the inverse permutation applied to the rows.
-      */
-    template<typename OtherDerived>
-    const Product<InverseType, OtherDerived, AliasFreeProduct>
-    operator*(const MatrixBase<OtherDerived>& matrix) const
-    {
-      return Product<InverseType, OtherDerived, AliasFreeProduct>(derived(), matrix.derived());
-    }
+  /** \returns the matrix with the inverse permutation applied to the columns.
+   */
+  template <typename OtherDerived>
+  friend const Product<OtherDerived, InverseType, AliasFreeProduct> operator*(const MatrixBase<OtherDerived>& matrix,
+                                                                              const InverseType& trPerm) {
+    return Product<OtherDerived, InverseType, AliasFreeProduct>(matrix.derived(), trPerm.derived());
+  }
+
+  /** \returns the matrix with the inverse permutation applied to the rows.
+   */
+  template <typename OtherDerived>
+  const Product<InverseType, OtherDerived, AliasFreeProduct> operator*(const MatrixBase<OtherDerived>& matrix) const {
+    return Product<InverseType, OtherDerived, AliasFreeProduct>(derived(), matrix.derived());
+  }
 };
 
-template<typename Derived>
-const PermutationWrapper<const Derived> MatrixBase<Derived>::asPermutation() const
-{
+template <typename Derived>
+const PermutationWrapper<const Derived> MatrixBase<Derived>::asPermutation() const {
   return derived();
 }
 
 namespace internal {
 
-template<> struct AssignmentKind<DenseShape,PermutationShape> { typedef EigenBase2EigenBase Kind; };
+template <>
+struct AssignmentKind<DenseShape, PermutationShape> {
+  typedef EigenBase2EigenBase Kind;
+};
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_PERMUTATIONMATRIX_H
+#endif  // EIGEN_PERMUTATIONMATRIX_H
diff --git a/Eigen/src/Core/PlainObjectBase.h b/Eigen/src/Core/PlainObjectBase.h
index 2c3c585..a8307c7 100644
--- a/Eigen/src/Core/PlainObjectBase.h
+++ b/Eigen/src/Core/PlainObjectBase.h
@@ -12,14 +12,16 @@
 #define EIGEN_DENSESTORAGEBASE_H
 
 #if defined(EIGEN_INITIALIZE_MATRICES_BY_ZERO)
-# define EIGEN_INITIALIZE_COEFFS
-# define EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED for(Index i=0;i<base().size();++i) coeffRef(i)=Scalar(0);
+#define EIGEN_INITIALIZE_COEFFS
+#define EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED \
+  for (Index i = 0; i < base().size(); ++i) coeffRef(i) = Scalar(0);
 #elif defined(EIGEN_INITIALIZE_MATRICES_BY_NAN)
-# define EIGEN_INITIALIZE_COEFFS
-# define EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED for(Index i=0;i<base().size();++i) coeffRef(i)=std::numeric_limits<Scalar>::quiet_NaN();
+#define EIGEN_INITIALIZE_COEFFS
+#define EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED \
+  for (Index i = 0; i < base().size(); ++i) coeffRef(i) = std::numeric_limits<Scalar>::quiet_NaN();
 #else
-# undef EIGEN_INITIALIZE_COEFFS
-# define EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
+#undef EIGEN_INITIALIZE_COEFFS
+#define EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
 #endif
 
 // IWYU pragma: private
@@ -31,7 +33,8 @@
 
 template <int MaxSizeAtCompileTime, int MaxRowsAtCompileTime, int MaxColsAtCompileTime>
 struct check_rows_cols_for_overflow {
-  EIGEN_STATIC_ASSERT(MaxRowsAtCompileTime * MaxColsAtCompileTime == MaxSizeAtCompileTime,YOU MADE A PROGRAMMING MISTAKE)
+  EIGEN_STATIC_ASSERT(MaxRowsAtCompileTime* MaxColsAtCompileTime == MaxSizeAtCompileTime,
+                      YOU MADE A PROGRAMMING MISTAKE)
   template <typename Index>
   EIGEN_DEVICE_FUNC static EIGEN_ALWAYS_INLINE constexpr void run(Index, Index) {}
 };
@@ -66,14 +69,14 @@
   }
 };
 
-template <typename Derived,
-          typename OtherDerived = Derived,
+template <typename Derived, typename OtherDerived = Derived,
           bool IsVector = bool(Derived::IsVectorAtCompileTime) && bool(OtherDerived::IsVectorAtCompileTime)>
 struct conservative_resize_like_impl;
 
-template<typename MatrixTypeA, typename MatrixTypeB, bool SwapPointers> struct matrix_swap_impl;
+template <typename MatrixTypeA, typename MatrixTypeB, bool SwapPointers>
+struct matrix_swap_impl;
 
-} // end namespace internal
+}  // end namespace internal
 
 #ifdef EIGEN_PARSED_BY_DOXYGEN
 namespace doxygen {
@@ -85,922 +88,871 @@
 // this is why we simply inherits MatrixBase, though this does not make sense.
 
 /** This class is just a workaround for Doxygen and it does not not actually exist. */
-template<typename Derived> struct dense_xpr_base_dispatcher;
+template <typename Derived>
+struct dense_xpr_base_dispatcher;
 /** This class is just a workaround for Doxygen and it does not not actually exist. */
-template<typename Scalar_, int Rows_, int Cols_, int Options_, int MaxRows_, int MaxCols_>
-struct dense_xpr_base_dispatcher<Matrix<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_> >
-    : public MatrixBase {};
+template <typename Scalar_, int Rows_, int Cols_, int Options_, int MaxRows_, int MaxCols_>
+struct dense_xpr_base_dispatcher<Matrix<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_>> : public MatrixBase {};
 /** This class is just a workaround for Doxygen and it does not not actually exist. */
-template<typename Scalar_, int Rows_, int Cols_, int Options_, int MaxRows_, int MaxCols_>
-struct dense_xpr_base_dispatcher<Array<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_> >
-    : public ArrayBase {};
+template <typename Scalar_, int Rows_, int Cols_, int Options_, int MaxRows_, int MaxCols_>
+struct dense_xpr_base_dispatcher<Array<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_>> : public ArrayBase {};
 
-} // namespace doxygen
+}  // namespace doxygen
 
 /** \class PlainObjectBase
-  * \ingroup Core_Module
-  * \brief %Dense storage base class for matrices and arrays.
-  *
-  * This class can be extended with the help of the plugin mechanism described on the page
-  * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_PLAINOBJECTBASE_PLUGIN.
-  *
-  * \tparam Derived is the derived type, e.g., a Matrix or Array
-  *
-  * \sa \ref TopicClassHierarchy
-  */
-template<typename Derived>
+ * \ingroup Core_Module
+ * \brief %Dense storage base class for matrices and arrays.
+ *
+ * This class can be extended with the help of the plugin mechanism described on the page
+ * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_PLAINOBJECTBASE_PLUGIN.
+ *
+ * \tparam Derived is the derived type, e.g., a Matrix or Array
+ *
+ * \sa \ref TopicClassHierarchy
+ */
+template <typename Derived>
 class PlainObjectBase : public doxygen::dense_xpr_base_dispatcher<Derived>
 #else
-template<typename Derived>
+template <typename Derived>
 class PlainObjectBase : public internal::dense_xpr_base<Derived>::type
 #endif
 {
-  public:
-    enum { Options = internal::traits<Derived>::Options };
-    typedef typename internal::dense_xpr_base<Derived>::type Base;
+ public:
+  enum { Options = internal::traits<Derived>::Options };
+  typedef typename internal::dense_xpr_base<Derived>::type Base;
 
-    typedef typename internal::traits<Derived>::StorageKind StorageKind;
-    typedef typename internal::traits<Derived>::Scalar Scalar;
+  typedef typename internal::traits<Derived>::StorageKind StorageKind;
+  typedef typename internal::traits<Derived>::Scalar Scalar;
 
-    typedef typename internal::packet_traits<Scalar>::type PacketScalar;
-    typedef typename NumTraits<Scalar>::Real RealScalar;
-    typedef Derived DenseType;
+  typedef typename internal::packet_traits<Scalar>::type PacketScalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef Derived DenseType;
 
-    using Base::RowsAtCompileTime;
-    using Base::ColsAtCompileTime;
-    using Base::SizeAtCompileTime;
-    using Base::MaxRowsAtCompileTime;
-    using Base::MaxColsAtCompileTime;
-    using Base::MaxSizeAtCompileTime;
-    using Base::IsVectorAtCompileTime;
-    using Base::Flags;
+  using Base::ColsAtCompileTime;
+  using Base::Flags;
+  using Base::IsVectorAtCompileTime;
+  using Base::MaxColsAtCompileTime;
+  using Base::MaxRowsAtCompileTime;
+  using Base::MaxSizeAtCompileTime;
+  using Base::RowsAtCompileTime;
+  using Base::SizeAtCompileTime;
 
-    typedef Eigen::Map<Derived, Unaligned>  MapType;
-    typedef const Eigen::Map<const Derived, Unaligned> ConstMapType;
-    typedef Eigen::Map<Derived, AlignedMax> AlignedMapType;
-    typedef const Eigen::Map<const Derived, AlignedMax> ConstAlignedMapType;
-    template<typename StrideType> struct StridedMapType { typedef Eigen::Map<Derived, Unaligned, StrideType> type; };
-    template<typename StrideType> struct StridedConstMapType { typedef Eigen::Map<const Derived, Unaligned, StrideType> type; };
-    template<typename StrideType> struct StridedAlignedMapType { typedef Eigen::Map<Derived, AlignedMax, StrideType> type; };
-    template<typename StrideType> struct StridedConstAlignedMapType { typedef Eigen::Map<const Derived, AlignedMax, StrideType> type; };
+  typedef Eigen::Map<Derived, Unaligned> MapType;
+  typedef const Eigen::Map<const Derived, Unaligned> ConstMapType;
+  typedef Eigen::Map<Derived, AlignedMax> AlignedMapType;
+  typedef const Eigen::Map<const Derived, AlignedMax> ConstAlignedMapType;
+  template <typename StrideType>
+  struct StridedMapType {
+    typedef Eigen::Map<Derived, Unaligned, StrideType> type;
+  };
+  template <typename StrideType>
+  struct StridedConstMapType {
+    typedef Eigen::Map<const Derived, Unaligned, StrideType> type;
+  };
+  template <typename StrideType>
+  struct StridedAlignedMapType {
+    typedef Eigen::Map<Derived, AlignedMax, StrideType> type;
+  };
+  template <typename StrideType>
+  struct StridedConstAlignedMapType {
+    typedef Eigen::Map<const Derived, AlignedMax, StrideType> type;
+  };
 
-  protected:
-    DenseStorage<Scalar, Base::MaxSizeAtCompileTime, Base::RowsAtCompileTime, Base::ColsAtCompileTime, Options> m_storage;
+ protected:
+  DenseStorage<Scalar, Base::MaxSizeAtCompileTime, Base::RowsAtCompileTime, Base::ColsAtCompileTime, Options> m_storage;
 
-  public:
-    enum { NeedsToAlign = (SizeAtCompileTime != Dynamic) && (internal::traits<Derived>::Alignment>0) };
-    EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign)
+ public:
+  enum { NeedsToAlign = (SizeAtCompileTime != Dynamic) && (internal::traits<Derived>::Alignment > 0) };
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign)
 
-    EIGEN_STATIC_ASSERT(internal::check_implication(MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1, (int(Options)&RowMajor)==RowMajor), INVALID_MATRIX_TEMPLATE_PARAMETERS)
-    EIGEN_STATIC_ASSERT(internal::check_implication(MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1, (int(Options)&RowMajor)==0), INVALID_MATRIX_TEMPLATE_PARAMETERS)
-    EIGEN_STATIC_ASSERT((RowsAtCompileTime == Dynamic) || (RowsAtCompileTime >= 0), INVALID_MATRIX_TEMPLATE_PARAMETERS)
-    EIGEN_STATIC_ASSERT((ColsAtCompileTime == Dynamic) || (ColsAtCompileTime >= 0), INVALID_MATRIX_TEMPLATE_PARAMETERS)
-    EIGEN_STATIC_ASSERT((MaxRowsAtCompileTime == Dynamic) || (MaxRowsAtCompileTime >= 0), INVALID_MATRIX_TEMPLATE_PARAMETERS)
-    EIGEN_STATIC_ASSERT((MaxColsAtCompileTime == Dynamic) || (MaxColsAtCompileTime >= 0), INVALID_MATRIX_TEMPLATE_PARAMETERS)
-    EIGEN_STATIC_ASSERT((MaxRowsAtCompileTime == RowsAtCompileTime || RowsAtCompileTime==Dynamic), INVALID_MATRIX_TEMPLATE_PARAMETERS)
-    EIGEN_STATIC_ASSERT((MaxColsAtCompileTime == ColsAtCompileTime || ColsAtCompileTime==Dynamic), INVALID_MATRIX_TEMPLATE_PARAMETERS)
-    EIGEN_STATIC_ASSERT(((Options & (DontAlign|RowMajor)) == Options), INVALID_MATRIX_TEMPLATE_PARAMETERS)
+  EIGEN_STATIC_ASSERT(internal::check_implication(MaxRowsAtCompileTime == 1 && MaxColsAtCompileTime != 1,
+                                                  (int(Options) & RowMajor) == RowMajor),
+                      INVALID_MATRIX_TEMPLATE_PARAMETERS)
+  EIGEN_STATIC_ASSERT(internal::check_implication(MaxColsAtCompileTime == 1 && MaxRowsAtCompileTime != 1,
+                                                  (int(Options) & RowMajor) == 0),
+                      INVALID_MATRIX_TEMPLATE_PARAMETERS)
+  EIGEN_STATIC_ASSERT((RowsAtCompileTime == Dynamic) || (RowsAtCompileTime >= 0), INVALID_MATRIX_TEMPLATE_PARAMETERS)
+  EIGEN_STATIC_ASSERT((ColsAtCompileTime == Dynamic) || (ColsAtCompileTime >= 0), INVALID_MATRIX_TEMPLATE_PARAMETERS)
+  EIGEN_STATIC_ASSERT((MaxRowsAtCompileTime == Dynamic) || (MaxRowsAtCompileTime >= 0),
+                      INVALID_MATRIX_TEMPLATE_PARAMETERS)
+  EIGEN_STATIC_ASSERT((MaxColsAtCompileTime == Dynamic) || (MaxColsAtCompileTime >= 0),
+                      INVALID_MATRIX_TEMPLATE_PARAMETERS)
+  EIGEN_STATIC_ASSERT((MaxRowsAtCompileTime == RowsAtCompileTime || RowsAtCompileTime == Dynamic),
+                      INVALID_MATRIX_TEMPLATE_PARAMETERS)
+  EIGEN_STATIC_ASSERT((MaxColsAtCompileTime == ColsAtCompileTime || ColsAtCompileTime == Dynamic),
+                      INVALID_MATRIX_TEMPLATE_PARAMETERS)
+  EIGEN_STATIC_ASSERT(((Options & (DontAlign | RowMajor)) == Options), INVALID_MATRIX_TEMPLATE_PARAMETERS)
 
-    EIGEN_DEVICE_FUNC
-    Base& base() { return *static_cast<Base*>(this); }
-    EIGEN_DEVICE_FUNC
-    const Base& base() const { return *static_cast<const Base*>(this); }
+  EIGEN_DEVICE_FUNC Base& base() { return *static_cast<Base*>(this); }
+  EIGEN_DEVICE_FUNC const Base& base() const { return *static_cast<const Base*>(this); }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-    Index rows() const EIGEN_NOEXCEPT { return m_storage.rows(); }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-    Index cols() const EIGEN_NOEXCEPT { return m_storage.cols(); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_storage.rows(); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_storage.cols(); }
 
-    /** This is an overloaded version of DenseCoeffsBase<Derived,ReadOnlyAccessors>::coeff(Index,Index) const
-      * provided to by-pass the creation of an evaluator of the expression, thus saving compilation efforts.
-      *
-      * See DenseCoeffsBase<Derived,ReadOnlyAccessors>::coeff(Index) const for details. */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE constexpr const Scalar& coeff(Index rowId, Index colId) const {
-      if (Flags & RowMajorBit)
-        return m_storage.data()[colId + rowId * m_storage.cols()];
-      else  // column-major
-        return m_storage.data()[rowId + colId * m_storage.rows()];
-    }
+  /** This is an overloaded version of DenseCoeffsBase<Derived,ReadOnlyAccessors>::coeff(Index,Index) const
+   * provided to by-pass the creation of an evaluator of the expression, thus saving compilation efforts.
+   *
+   * See DenseCoeffsBase<Derived,ReadOnlyAccessors>::coeff(Index) const for details. */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE constexpr const Scalar& coeff(Index rowId, Index colId) const {
+    if (Flags & RowMajorBit)
+      return m_storage.data()[colId + rowId * m_storage.cols()];
+    else  // column-major
+      return m_storage.data()[rowId + colId * m_storage.rows()];
+  }
 
-    /** This is an overloaded version of DenseCoeffsBase<Derived,ReadOnlyAccessors>::coeff(Index) const
-      * provided to by-pass the creation of an evaluator of the expression, thus saving compilation efforts.
-      *
-      * See DenseCoeffsBase<Derived,ReadOnlyAccessors>::coeff(Index) const for details. */
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE const Scalar& coeff(Index index) const
-    {
-      return m_storage.data()[index];
-    }
+  /** This is an overloaded version of DenseCoeffsBase<Derived,ReadOnlyAccessors>::coeff(Index) const
+   * provided to by-pass the creation of an evaluator of the expression, thus saving compilation efforts.
+   *
+   * See DenseCoeffsBase<Derived,ReadOnlyAccessors>::coeff(Index) const for details. */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& coeff(Index index) const { return m_storage.data()[index]; }
 
-    /** This is an overloaded version of DenseCoeffsBase<Derived,WriteAccessors>::coeffRef(Index,Index) const
-      * provided to by-pass the creation of an evaluator of the expression, thus saving compilation efforts.
-      *
-      * See DenseCoeffsBase<Derived,WriteAccessors>::coeffRef(Index,Index) const for details. */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE constexpr Scalar& coeffRef(Index rowId, Index colId) {
-      if (Flags & RowMajorBit)
-        return m_storage.data()[colId + rowId * m_storage.cols()];
-      else  // column-major
-        return m_storage.data()[rowId + colId * m_storage.rows()];
-    }
+  /** This is an overloaded version of DenseCoeffsBase<Derived,WriteAccessors>::coeffRef(Index,Index) const
+   * provided to by-pass the creation of an evaluator of the expression, thus saving compilation efforts.
+   *
+   * See DenseCoeffsBase<Derived,WriteAccessors>::coeffRef(Index,Index) const for details. */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE constexpr Scalar& coeffRef(Index rowId, Index colId) {
+    if (Flags & RowMajorBit)
+      return m_storage.data()[colId + rowId * m_storage.cols()];
+    else  // column-major
+      return m_storage.data()[rowId + colId * m_storage.rows()];
+  }
 
-    /** This is an overloaded version of DenseCoeffsBase<Derived,WriteAccessors>::coeffRef(Index) const
-      * provided to by-pass the creation of an evaluator of the expression, thus saving compilation efforts.
-      *
-      * See DenseCoeffsBase<Derived,WriteAccessors>::coeffRef(Index) const for details. */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE constexpr Scalar& coeffRef(Index index) { return m_storage.data()[index]; }
+  /** This is an overloaded version of DenseCoeffsBase<Derived,WriteAccessors>::coeffRef(Index) const
+   * provided to by-pass the creation of an evaluator of the expression, thus saving compilation efforts.
+   *
+   * See DenseCoeffsBase<Derived,WriteAccessors>::coeffRef(Index) const for details. */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE constexpr Scalar& coeffRef(Index index) { return m_storage.data()[index]; }
 
-    /** This is the const version of coeffRef(Index,Index) which is thus synonym of coeff(Index,Index).
-      * It is provided for convenience. */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE constexpr const Scalar& coeffRef(Index rowId, Index colId) const {
-      if (Flags & RowMajorBit)
-        return m_storage.data()[colId + rowId * m_storage.cols()];
-      else  // column-major
-        return m_storage.data()[rowId + colId * m_storage.rows()];
-    }
+  /** This is the const version of coeffRef(Index,Index) which is thus synonym of coeff(Index,Index).
+   * It is provided for convenience. */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE constexpr const Scalar& coeffRef(Index rowId, Index colId) const {
+    if (Flags & RowMajorBit)
+      return m_storage.data()[colId + rowId * m_storage.cols()];
+    else  // column-major
+      return m_storage.data()[rowId + colId * m_storage.rows()];
+  }
 
-    /** This is the const version of coeffRef(Index) which is thus synonym of coeff(Index).
-      * It is provided for convenience. */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE constexpr const Scalar& coeffRef(Index index) const {
-      return m_storage.data()[index];
-    }
+  /** This is the const version of coeffRef(Index) which is thus synonym of coeff(Index).
+   * It is provided for convenience. */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE constexpr const Scalar& coeffRef(Index index) const {
+    return m_storage.data()[index];
+  }
 
-    /** \internal */
-    template<int LoadMode>
-    EIGEN_STRONG_INLINE PacketScalar packet(Index rowId, Index colId) const
-    {
-      return internal::ploadt<PacketScalar, LoadMode>
-               (m_storage.data() + (Flags & RowMajorBit
-                                   ? colId + rowId * m_storage.cols()
-                                   : rowId + colId * m_storage.rows()));
-    }
+  /** \internal */
+  template <int LoadMode>
+  EIGEN_STRONG_INLINE PacketScalar packet(Index rowId, Index colId) const {
+    return internal::ploadt<PacketScalar, LoadMode>(
+        m_storage.data() + (Flags & RowMajorBit ? colId + rowId * m_storage.cols() : rowId + colId * m_storage.rows()));
+  }
 
-    /** \internal */
-    template<int LoadMode>
-    EIGEN_STRONG_INLINE PacketScalar packet(Index index) const
-    {
-      return internal::ploadt<PacketScalar, LoadMode>(m_storage.data() + index);
-    }
+  /** \internal */
+  template <int LoadMode>
+  EIGEN_STRONG_INLINE PacketScalar packet(Index index) const {
+    return internal::ploadt<PacketScalar, LoadMode>(m_storage.data() + index);
+  }
 
-    /** \internal */
-    template<int StoreMode>
-    EIGEN_STRONG_INLINE void writePacket(Index rowId, Index colId, const PacketScalar& val)
-    {
-      internal::pstoret<Scalar, PacketScalar, StoreMode>
-              (m_storage.data() + (Flags & RowMajorBit
-                                   ? colId + rowId * m_storage.cols()
-                                   : rowId + colId * m_storage.rows()), val);
-    }
+  /** \internal */
+  template <int StoreMode>
+  EIGEN_STRONG_INLINE void writePacket(Index rowId, Index colId, const PacketScalar& val) {
+    internal::pstoret<Scalar, PacketScalar, StoreMode>(
+        m_storage.data() + (Flags & RowMajorBit ? colId + rowId * m_storage.cols() : rowId + colId * m_storage.rows()),
+        val);
+  }
 
-    /** \internal */
-    template<int StoreMode>
-    EIGEN_STRONG_INLINE void writePacket(Index index, const PacketScalar& val)
-    {
-      internal::pstoret<Scalar, PacketScalar, StoreMode>(m_storage.data() + index, val);
-    }
+  /** \internal */
+  template <int StoreMode>
+  EIGEN_STRONG_INLINE void writePacket(Index index, const PacketScalar& val) {
+    internal::pstoret<Scalar, PacketScalar, StoreMode>(m_storage.data() + index, val);
+  }
 
-    /** \returns a const pointer to the data array of this matrix */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar *data() const
-    { return m_storage.data(); }
+  /** \returns a const pointer to the data array of this matrix */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar* data() const { return m_storage.data(); }
 
-    /** \returns a pointer to the data array of this matrix */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar *data()
-    { return m_storage.data(); }
+  /** \returns a pointer to the data array of this matrix */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar* data() { return m_storage.data(); }
 
-    /** Resizes \c *this to a \a rows x \a cols matrix.
-      *
-      * This method is intended for dynamic-size matrices, although it is legal to call it on any
-      * matrix as long as fixed dimensions are left unchanged. If you only want to change the number
-      * of rows and/or of columns, you can use resize(NoChange_t, Index), resize(Index, NoChange_t).
-      *
-      * If the current number of coefficients of \c *this exactly matches the
-      * product \a rows * \a cols, then no memory allocation is performed and
-      * the current values are left unchanged. In all other cases, including
-      * shrinking, the data is reallocated and all previous values are lost.
-      *
-      * Example: \include Matrix_resize_int_int.cpp
-      * Output: \verbinclude Matrix_resize_int_int.out
-      *
-      * \sa resize(Index) for vectors, resize(NoChange_t, Index), resize(Index, NoChange_t)
-      */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE constexpr void resize(Index rows, Index cols) {
-      eigen_assert(internal::check_implication(RowsAtCompileTime!=Dynamic, rows==RowsAtCompileTime)
-                   && internal::check_implication(ColsAtCompileTime!=Dynamic, cols==ColsAtCompileTime)
-                   && internal::check_implication(RowsAtCompileTime==Dynamic && MaxRowsAtCompileTime!=Dynamic, rows<=MaxRowsAtCompileTime)
-                   && internal::check_implication(ColsAtCompileTime==Dynamic && MaxColsAtCompileTime!=Dynamic, cols<=MaxColsAtCompileTime)
-                   && rows>=0 && cols>=0 && "Invalid sizes when resizing a matrix or array.");
-      internal::check_rows_cols_for_overflow<MaxSizeAtCompileTime, MaxRowsAtCompileTime, MaxColsAtCompileTime>::run(rows, cols);
-      #ifdef EIGEN_INITIALIZE_COEFFS
-        Index size = rows*cols;
-        bool size_changed = size != this->size();
-        m_storage.resize(size, rows, cols);
-        if(size_changed) EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
-      #else
-        m_storage.resize(rows*cols, rows, cols);
-      #endif
-    }
-
-    /** Resizes \c *this to a vector of length \a size
-      *
-      * \only_for_vectors. This method does not work for
-      * partially dynamic matrices when the static dimension is anything other
-      * than 1. For example it will not work with Matrix<double, 2, Dynamic>.
-      *
-      * Example: \include Matrix_resize_int.cpp
-      * Output: \verbinclude Matrix_resize_int.out
-      *
-      * \sa resize(Index,Index), resize(NoChange_t, Index), resize(Index, NoChange_t)
-      */
-    EIGEN_DEVICE_FUNC inline constexpr void resize(Index size) {
-        EIGEN_STATIC_ASSERT_VECTOR_ONLY(PlainObjectBase)
-        eigen_assert(
-            ((SizeAtCompileTime == Dynamic && (MaxSizeAtCompileTime == Dynamic || size <= MaxSizeAtCompileTime)) ||
-             SizeAtCompileTime == size) &&
-            size >= 0);
+  /** Resizes \c *this to a \a rows x \a cols matrix.
+   *
+   * This method is intended for dynamic-size matrices, although it is legal to call it on any
+   * matrix as long as fixed dimensions are left unchanged. If you only want to change the number
+   * of rows and/or of columns, you can use resize(NoChange_t, Index), resize(Index, NoChange_t).
+   *
+   * If the current number of coefficients of \c *this exactly matches the
+   * product \a rows * \a cols, then no memory allocation is performed and
+   * the current values are left unchanged. In all other cases, including
+   * shrinking, the data is reallocated and all previous values are lost.
+   *
+   * Example: \include Matrix_resize_int_int.cpp
+   * Output: \verbinclude Matrix_resize_int_int.out
+   *
+   * \sa resize(Index) for vectors, resize(NoChange_t, Index), resize(Index, NoChange_t)
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE constexpr void resize(Index rows, Index cols) {
+    eigen_assert(internal::check_implication(RowsAtCompileTime != Dynamic, rows == RowsAtCompileTime) &&
+                 internal::check_implication(ColsAtCompileTime != Dynamic, cols == ColsAtCompileTime) &&
+                 internal::check_implication(RowsAtCompileTime == Dynamic && MaxRowsAtCompileTime != Dynamic,
+                                             rows <= MaxRowsAtCompileTime) &&
+                 internal::check_implication(ColsAtCompileTime == Dynamic && MaxColsAtCompileTime != Dynamic,
+                                             cols <= MaxColsAtCompileTime) &&
+                 rows >= 0 && cols >= 0 && "Invalid sizes when resizing a matrix or array.");
+    internal::check_rows_cols_for_overflow<MaxSizeAtCompileTime, MaxRowsAtCompileTime, MaxColsAtCompileTime>::run(rows,
+                                                                                                                  cols);
 #ifdef EIGEN_INITIALIZE_COEFFS
-        bool size_changed = size != this->size();
-      #endif
-      if(RowsAtCompileTime == 1)
-        m_storage.resize(size, 1, size);
-      else
-        m_storage.resize(size, size, 1);
-      #ifdef EIGEN_INITIALIZE_COEFFS
-        if(size_changed) EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
-      #endif
-    }
+    Index size = rows * cols;
+    bool size_changed = size != this->size();
+    m_storage.resize(size, rows, cols);
+    if (size_changed) EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
+#else
+    m_storage.resize(rows * cols, rows, cols);
+#endif
+  }
 
-    /** Resizes the matrix, changing only the number of columns. For the parameter of type NoChange_t, just pass the special value \c NoChange
-      * as in the example below.
-      *
-      * Example: \include Matrix_resize_NoChange_int.cpp
-      * Output: \verbinclude Matrix_resize_NoChange_int.out
-      *
-      * \sa resize(Index,Index)
-      */
-    EIGEN_DEVICE_FUNC inline constexpr void resize(NoChange_t, Index cols) { resize(rows(), cols); }
+  /** Resizes \c *this to a vector of length \a size
+   *
+   * \only_for_vectors. This method does not work for
+   * partially dynamic matrices when the static dimension is anything other
+   * than 1. For example it will not work with Matrix<double, 2, Dynamic>.
+   *
+   * Example: \include Matrix_resize_int.cpp
+   * Output: \verbinclude Matrix_resize_int.out
+   *
+   * \sa resize(Index,Index), resize(NoChange_t, Index), resize(Index, NoChange_t)
+   */
+  EIGEN_DEVICE_FUNC inline constexpr void resize(Index size) {
+    EIGEN_STATIC_ASSERT_VECTOR_ONLY(PlainObjectBase)
+    eigen_assert(((SizeAtCompileTime == Dynamic && (MaxSizeAtCompileTime == Dynamic || size <= MaxSizeAtCompileTime)) ||
+                  SizeAtCompileTime == size) &&
+                 size >= 0);
+#ifdef EIGEN_INITIALIZE_COEFFS
+    bool size_changed = size != this->size();
+#endif
+    if (RowsAtCompileTime == 1)
+      m_storage.resize(size, 1, size);
+    else
+      m_storage.resize(size, size, 1);
+#ifdef EIGEN_INITIALIZE_COEFFS
+    if (size_changed) EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
+#endif
+  }
 
-    /** Resizes the matrix, changing only the number of rows. For the parameter of type NoChange_t, just pass the special value \c NoChange
-      * as in the example below.
-      *
-      * Example: \include Matrix_resize_int_NoChange.cpp
-      * Output: \verbinclude Matrix_resize_int_NoChange.out
-      *
-      * \sa resize(Index,Index)
-      */
-    EIGEN_DEVICE_FUNC inline constexpr void resize(Index rows, NoChange_t) { resize(rows, cols()); }
+  /** Resizes the matrix, changing only the number of columns. For the parameter of type NoChange_t, just pass the
+   * special value \c NoChange as in the example below.
+   *
+   * Example: \include Matrix_resize_NoChange_int.cpp
+   * Output: \verbinclude Matrix_resize_NoChange_int.out
+   *
+   * \sa resize(Index,Index)
+   */
+  EIGEN_DEVICE_FUNC inline constexpr void resize(NoChange_t, Index cols) { resize(rows(), cols); }
 
-    /** Resizes \c *this to have the same dimensions as \a other.
-      * Takes care of doing all the checking that's needed.
-      *
-      * Note that copying a row-vector into a vector (and conversely) is allowed.
-      * The resizing, if any, is then done in the appropriate way so that row-vectors
-      * remain row-vectors and vectors remain vectors.
-      */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE void resizeLike(const EigenBase<OtherDerived>& _other)
-    {
-      const OtherDerived& other = _other.derived();
-      internal::check_rows_cols_for_overflow<MaxSizeAtCompileTime, MaxRowsAtCompileTime, MaxColsAtCompileTime>::run(other.rows(), other.cols());
-      const Index othersize = other.rows()*other.cols();
-      if(RowsAtCompileTime == 1)
-      {
-        eigen_assert(other.rows() == 1 || other.cols() == 1);
-        resize(1, othersize);
-      }
-      else if(ColsAtCompileTime == 1)
-      {
-        eigen_assert(other.rows() == 1 || other.cols() == 1);
-        resize(othersize, 1);
-      }
-      else resize(other.rows(), other.cols());
-    }
+  /** Resizes the matrix, changing only the number of rows. For the parameter of type NoChange_t, just pass the special
+   * value \c NoChange as in the example below.
+   *
+   * Example: \include Matrix_resize_int_NoChange.cpp
+   * Output: \verbinclude Matrix_resize_int_NoChange.out
+   *
+   * \sa resize(Index,Index)
+   */
+  EIGEN_DEVICE_FUNC inline constexpr void resize(Index rows, NoChange_t) { resize(rows, cols()); }
 
-    /** Resizes the matrix to \a rows x \a cols while leaving old values untouched.
-      *
-      * The method is intended for matrices of dynamic size. If you only want to change the number
-      * of rows and/or of columns, you can use conservativeResize(NoChange_t, Index) or
-      * conservativeResize(Index, NoChange_t).
-      *
-      * Matrices are resized relative to the top-left element. In case values need to be
-      * appended to the matrix they will be uninitialized.
-      */
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE void conservativeResize(Index rows, Index cols)
-    {
-      internal::conservative_resize_like_impl<Derived>::run(*this, rows, cols);
-    }
+  /** Resizes \c *this to have the same dimensions as \a other.
+   * Takes care of doing all the checking that's needed.
+   *
+   * Note that copying a row-vector into a vector (and conversely) is allowed.
+   * The resizing, if any, is then done in the appropriate way so that row-vectors
+   * remain row-vectors and vectors remain vectors.
+   */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void resizeLike(const EigenBase<OtherDerived>& _other) {
+    const OtherDerived& other = _other.derived();
+    internal::check_rows_cols_for_overflow<MaxSizeAtCompileTime, MaxRowsAtCompileTime, MaxColsAtCompileTime>::run(
+        other.rows(), other.cols());
+    const Index othersize = other.rows() * other.cols();
+    if (RowsAtCompileTime == 1) {
+      eigen_assert(other.rows() == 1 || other.cols() == 1);
+      resize(1, othersize);
+    } else if (ColsAtCompileTime == 1) {
+      eigen_assert(other.rows() == 1 || other.cols() == 1);
+      resize(othersize, 1);
+    } else
+      resize(other.rows(), other.cols());
+  }
 
-    /** Resizes the matrix to \a rows x \a cols while leaving old values untouched.
-      *
-      * As opposed to conservativeResize(Index rows, Index cols), this version leaves
-      * the number of columns unchanged.
-      *
-      * In case the matrix is growing, new rows will be uninitialized.
-      */
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE void conservativeResize(Index rows, NoChange_t)
-    {
-      // Note: see the comment in conservativeResize(Index,Index)
-      conservativeResize(rows, cols());
-    }
+  /** Resizes the matrix to \a rows x \a cols while leaving old values untouched.
+   *
+   * The method is intended for matrices of dynamic size. If you only want to change the number
+   * of rows and/or of columns, you can use conservativeResize(NoChange_t, Index) or
+   * conservativeResize(Index, NoChange_t).
+   *
+   * Matrices are resized relative to the top-left element. In case values need to be
+   * appended to the matrix they will be uninitialized.
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void conservativeResize(Index rows, Index cols) {
+    internal::conservative_resize_like_impl<Derived>::run(*this, rows, cols);
+  }
 
-    /** Resizes the matrix to \a rows x \a cols while leaving old values untouched.
-      *
-      * As opposed to conservativeResize(Index rows, Index cols), this version leaves
-      * the number of rows unchanged.
-      *
-      * In case the matrix is growing, new columns will be uninitialized.
-      */
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE void conservativeResize(NoChange_t, Index cols)
-    {
-      // Note: see the comment in conservativeResize(Index,Index)
-      conservativeResize(rows(), cols);
-    }
+  /** Resizes the matrix to \a rows x \a cols while leaving old values untouched.
+   *
+   * As opposed to conservativeResize(Index rows, Index cols), this version leaves
+   * the number of columns unchanged.
+   *
+   * In case the matrix is growing, new rows will be uninitialized.
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void conservativeResize(Index rows, NoChange_t) {
+    // Note: see the comment in conservativeResize(Index,Index)
+    conservativeResize(rows, cols());
+  }
 
-    /** Resizes the vector to \a size while retaining old values.
-      *
-      * \only_for_vectors. This method does not work for
-      * partially dynamic matrices when the static dimension is anything other
-      * than 1. For example it will not work with Matrix<double, 2, Dynamic>.
-      *
-      * When values are appended, they will be uninitialized.
-      */
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE void conservativeResize(Index size)
-    {
-      internal::conservative_resize_like_impl<Derived>::run(*this, size);
-    }
+  /** Resizes the matrix to \a rows x \a cols while leaving old values untouched.
+   *
+   * As opposed to conservativeResize(Index rows, Index cols), this version leaves
+   * the number of rows unchanged.
+   *
+   * In case the matrix is growing, new columns will be uninitialized.
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void conservativeResize(NoChange_t, Index cols) {
+    // Note: see the comment in conservativeResize(Index,Index)
+    conservativeResize(rows(), cols);
+  }
 
-    /** Resizes the matrix to \a rows x \a cols of \c other, while leaving old values untouched.
-      *
-      * The method is intended for matrices of dynamic size. If you only want to change the number
-      * of rows and/or of columns, you can use conservativeResize(NoChange_t, Index) or
-      * conservativeResize(Index, NoChange_t).
-      *
-      * Matrices are resized relative to the top-left element. In case values need to be
-      * appended to the matrix they will copied from \c other.
-      */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE void conservativeResizeLike(const DenseBase<OtherDerived>& other)
-    {
-      internal::conservative_resize_like_impl<Derived,OtherDerived>::run(*this, other);
-    }
+  /** Resizes the vector to \a size while retaining old values.
+   *
+   * \only_for_vectors. This method does not work for
+   * partially dynamic matrices when the static dimension is anything other
+   * than 1. For example it will not work with Matrix<double, 2, Dynamic>.
+   *
+   * When values are appended, they will be uninitialized.
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void conservativeResize(Index size) {
+    internal::conservative_resize_like_impl<Derived>::run(*this, size);
+  }
 
-    /** This is a special case of the templated operator=. Its purpose is to
-      * prevent a default operator= from hiding the templated operator=.
-      */
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Derived& operator=(const PlainObjectBase& other)
-    {
-      return _set(other);
-    }
+  /** Resizes the matrix to \a rows x \a cols of \c other, while leaving old values untouched.
+   *
+   * The method is intended for matrices of dynamic size. If you only want to change the number
+   * of rows and/or of columns, you can use conservativeResize(NoChange_t, Index) or
+   * conservativeResize(Index, NoChange_t).
+   *
+   * Matrices are resized relative to the top-left element. In case values need to be
+   * appended to the matrix they will copied from \c other.
+   */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void conservativeResizeLike(const DenseBase<OtherDerived>& other) {
+    internal::conservative_resize_like_impl<Derived, OtherDerived>::run(*this, other);
+  }
 
-    /** \sa MatrixBase::lazyAssign() */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Derived& lazyAssign(const DenseBase<OtherDerived>& other)
-    {
-      _resize_to_match(other);
-      return Base::lazyAssign(other.derived());
-    }
+  /** This is a special case of the templated operator=. Its purpose is to
+   * prevent a default operator= from hiding the templated operator=.
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator=(const PlainObjectBase& other) { return _set(other); }
 
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Derived& operator=(const ReturnByValue<OtherDerived>& func)
-    {
-      resize(func.rows(), func.cols());
-      return Base::operator=(func);
-    }
+  /** \sa MatrixBase::lazyAssign() */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& lazyAssign(const DenseBase<OtherDerived>& other) {
+    _resize_to_match(other);
+    return Base::lazyAssign(other.derived());
+  }
 
-    // Prevent user from trying to instantiate PlainObjectBase objects
-    // by making all its constructor protected. See bug 1074.
-  protected:
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator=(const ReturnByValue<OtherDerived>& func) {
+    resize(func.rows(), func.cols());
+    return Base::operator=(func);
+  }
 
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE PlainObjectBase() : m_storage()
-    {
-//       EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
-    }
+  // Prevent user from trying to instantiate PlainObjectBase objects
+  // by making all its constructor protected. See bug 1074.
+ protected:
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PlainObjectBase() : m_storage() {
+    //       EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
+  }
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-    // FIXME is it still needed ?
-    /** \internal */
-    EIGEN_DEVICE_FUNC
-    explicit PlainObjectBase(internal::constructor_without_unaligned_array_assert)
-      : m_storage(internal::constructor_without_unaligned_array_assert())
-    {
-      // EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
-    }
+  // FIXME is it still needed ?
+  /** \internal */
+  EIGEN_DEVICE_FUNC explicit PlainObjectBase(internal::constructor_without_unaligned_array_assert)
+      : m_storage(internal::constructor_without_unaligned_array_assert()) {
+    // EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
+  }
 #endif
 
-    EIGEN_DEVICE_FUNC
-    PlainObjectBase(PlainObjectBase&& other) EIGEN_NOEXCEPT
-      : m_storage( std::move(other.m_storage) )
-    {
+  EIGEN_DEVICE_FUNC PlainObjectBase(PlainObjectBase&& other) EIGEN_NOEXCEPT : m_storage(std::move(other.m_storage)) {}
+
+  EIGEN_DEVICE_FUNC PlainObjectBase& operator=(PlainObjectBase&& other) EIGEN_NOEXCEPT {
+    m_storage = std::move(other.m_storage);
+    return *this;
+  }
+
+  /** Copy constructor */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PlainObjectBase(const PlainObjectBase& other)
+      : Base(), m_storage(other.m_storage) {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PlainObjectBase(Index size, Index rows, Index cols)
+      : m_storage(size, rows, cols) {
+    //       EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
+  }
+
+  /** \brief Construct a row of column vector with fixed size from an arbitrary number of coefficients.
+   *
+   * \only_for_vectors
+   *
+   * This constructor is for 1D array or vectors with more than 4 coefficients.
+   *
+   * \warning To construct a column (resp. row) vector of fixed length, the number of values passed to this
+   * constructor must match the the fixed number of rows (resp. columns) of \c *this.
+   */
+  template <typename... ArgTypes>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PlainObjectBase(const Scalar& a0, const Scalar& a1, const Scalar& a2,
+                                                        const Scalar& a3, const ArgTypes&... args)
+      : m_storage() {
+    EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(PlainObjectBase, sizeof...(args) + 4);
+    m_storage.data()[0] = a0;
+    m_storage.data()[1] = a1;
+    m_storage.data()[2] = a2;
+    m_storage.data()[3] = a3;
+    Index i = 4;
+    auto x = {(m_storage.data()[i++] = args, 0)...};
+    static_cast<void>(x);
+  }
+
+  /** \brief Constructs a Matrix or Array and initializes it by elements given by an initializer list of initializer
+   * lists
+   */
+  EIGEN_DEVICE_FUNC explicit constexpr EIGEN_STRONG_INLINE PlainObjectBase(
+      const std::initializer_list<std::initializer_list<Scalar>>& list)
+      : m_storage() {
+    size_t list_size = 0;
+    if (list.begin() != list.end()) {
+      list_size = list.begin()->size();
     }
 
-    EIGEN_DEVICE_FUNC
-    PlainObjectBase& operator=(PlainObjectBase&& other) EIGEN_NOEXCEPT
-    {
-      m_storage = std::move(other.m_storage);
-      return *this;
-    }
-
-    /** Copy constructor */
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE PlainObjectBase(const PlainObjectBase& other)
-      : Base(), m_storage(other.m_storage) { }
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE PlainObjectBase(Index size, Index rows, Index cols)
-      : m_storage(size, rows, cols)
-    {
-//       EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
-    }
-
-    /** \brief Construct a row of column vector with fixed size from an arbitrary number of coefficients.
-      *
-      * \only_for_vectors
-      *
-      * This constructor is for 1D array or vectors with more than 4 coefficients.
-      *
-      * \warning To construct a column (resp. row) vector of fixed length, the number of values passed to this
-      * constructor must match the the fixed number of rows (resp. columns) of \c *this.
-      */
-    template <typename... ArgTypes>
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    PlainObjectBase(const Scalar& a0, const Scalar& a1, const Scalar& a2,  const Scalar& a3, const ArgTypes&... args)
-      : m_storage()
-    {
-      EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(PlainObjectBase, sizeof...(args) + 4);
-      m_storage.data()[0] = a0;
-      m_storage.data()[1] = a1;
-      m_storage.data()[2] = a2;
-      m_storage.data()[3] = a3;
-      Index i = 4;
-      auto x = {(m_storage.data()[i++] = args, 0)...};
-      static_cast<void>(x);
-    }
-
-    /** \brief Constructs a Matrix or Array and initializes it by elements given by an initializer list of initializer
-      * lists
-      */
-    EIGEN_DEVICE_FUNC explicit constexpr EIGEN_STRONG_INLINE PlainObjectBase(
-        const std::initializer_list<std::initializer_list<Scalar>>& list)
-        : m_storage() {
-      size_t list_size = 0;
-      if (list.begin() != list.end()) {
-        list_size = list.begin()->size();
+    // This is to allow syntax like VectorXi {{1, 2, 3, 4}}
+    if (ColsAtCompileTime == 1 && list.size() == 1) {
+      eigen_assert(list_size == static_cast<size_t>(RowsAtCompileTime) || RowsAtCompileTime == Dynamic);
+      resize(list_size, ColsAtCompileTime);
+      if (list.begin()->begin() != nullptr) {
+        std::copy(list.begin()->begin(), list.begin()->end(), m_storage.data());
       }
+    } else {
+      eigen_assert(list.size() == static_cast<size_t>(RowsAtCompileTime) || RowsAtCompileTime == Dynamic);
+      eigen_assert(list_size == static_cast<size_t>(ColsAtCompileTime) || ColsAtCompileTime == Dynamic);
+      resize(list.size(), list_size);
 
-      // This is to allow syntax like VectorXi {{1, 2, 3, 4}}
-      if (ColsAtCompileTime == 1 && list.size() == 1) {
-        eigen_assert(list_size == static_cast<size_t>(RowsAtCompileTime) || RowsAtCompileTime == Dynamic);
-        resize(list_size, ColsAtCompileTime);
-        if (list.begin()->begin() != nullptr) {
-          std::copy(list.begin()->begin(), list.begin()->end(), m_storage.data());
+      Index row_index = 0;
+      for (const std::initializer_list<Scalar>& row : list) {
+        eigen_assert(list_size == row.size());
+        Index col_index = 0;
+        for (const Scalar& e : row) {
+          coeffRef(row_index, col_index) = e;
+          ++col_index;
         }
-      } else {
-        eigen_assert(list.size() == static_cast<size_t>(RowsAtCompileTime) || RowsAtCompileTime == Dynamic);
-        eigen_assert(list_size == static_cast<size_t>(ColsAtCompileTime) || ColsAtCompileTime == Dynamic);
-        resize(list.size(), list_size);
-
-        Index row_index = 0;
-        for (const std::initializer_list<Scalar>& row : list) {
-          eigen_assert(list_size == row.size());
-          Index col_index = 0;
-          for (const Scalar& e : row) {
-            coeffRef(row_index, col_index) = e;
-            ++col_index;
-          }
-          ++row_index;
-        }
+        ++row_index;
       }
     }
+  }
 
-    /** \sa PlainObjectBase::operator=(const EigenBase<OtherDerived>&) */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE PlainObjectBase(const DenseBase<OtherDerived> &other)
-      : m_storage()
-    {
-      resizeLike(other);
-      _set_noalias(other);
-    }
+  /** \sa PlainObjectBase::operator=(const EigenBase<OtherDerived>&) */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PlainObjectBase(const DenseBase<OtherDerived>& other) : m_storage() {
+    resizeLike(other);
+    _set_noalias(other);
+  }
 
-    /** \sa PlainObjectBase::operator=(const EigenBase<OtherDerived>&) */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE PlainObjectBase(const EigenBase<OtherDerived> &other)
-      : m_storage()
-    {
-      resizeLike(other);
-      *this = other.derived();
-    }
-    /** \brief Copy constructor with in-place evaluation */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE PlainObjectBase(const ReturnByValue<OtherDerived>& other)
-    {
-      // FIXME this does not automatically transpose vectors if necessary
-      resize(other.rows(), other.cols());
-      other.evalTo(this->derived());
-    }
+  /** \sa PlainObjectBase::operator=(const EigenBase<OtherDerived>&) */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PlainObjectBase(const EigenBase<OtherDerived>& other) : m_storage() {
+    resizeLike(other);
+    *this = other.derived();
+  }
+  /** \brief Copy constructor with in-place evaluation */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PlainObjectBase(const ReturnByValue<OtherDerived>& other) {
+    // FIXME this does not automatically transpose vectors if necessary
+    resize(other.rows(), other.cols());
+    other.evalTo(this->derived());
+  }
 
-  public:
+ public:
+  /** \brief Copies the generic expression \a other into *this.
+   * \copydetails DenseBase::operator=(const EigenBase<OtherDerived> &other)
+   */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator=(const EigenBase<OtherDerived>& other) {
+    _resize_to_match(other);
+    Base::operator=(other.derived());
+    return this->derived();
+  }
 
-    /** \brief Copies the generic expression \a other into *this.
-      * \copydetails DenseBase::operator=(const EigenBase<OtherDerived> &other)
-      */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Derived& operator=(const EigenBase<OtherDerived> &other)
-    {
-      _resize_to_match(other);
-      Base::operator=(other.derived());
-      return this->derived();
-    }
+  /** \name Map
+   * These are convenience functions returning Map objects. The Map() static functions return unaligned Map objects,
+   * while the AlignedMap() functions return aligned Map objects and thus should be called only with 16-byte-aligned
+   * \a data pointers.
+   *
+   * Here is an example using strides:
+   * \include Matrix_Map_stride.cpp
+   * Output: \verbinclude Matrix_Map_stride.out
+   *
+   * \see class Map
+   */
+  ///@{
+  static inline ConstMapType Map(const Scalar* data) { return ConstMapType(data); }
+  static inline MapType Map(Scalar* data) { return MapType(data); }
+  static inline ConstMapType Map(const Scalar* data, Index size) { return ConstMapType(data, size); }
+  static inline MapType Map(Scalar* data, Index size) { return MapType(data, size); }
+  static inline ConstMapType Map(const Scalar* data, Index rows, Index cols) { return ConstMapType(data, rows, cols); }
+  static inline MapType Map(Scalar* data, Index rows, Index cols) { return MapType(data, rows, cols); }
 
-    /** \name Map
-      * These are convenience functions returning Map objects. The Map() static functions return unaligned Map objects,
-      * while the AlignedMap() functions return aligned Map objects and thus should be called only with 16-byte-aligned
-      * \a data pointers.
-      *
-      * Here is an example using strides:
-      * \include Matrix_Map_stride.cpp
-      * Output: \verbinclude Matrix_Map_stride.out
-      *
-      * \see class Map
-      */
-    ///@{
-    static inline ConstMapType Map(const Scalar* data)
-    { return ConstMapType(data); }
-    static inline MapType Map(Scalar* data)
-    { return MapType(data); }
-    static inline ConstMapType Map(const Scalar* data, Index size)
-    { return ConstMapType(data, size); }
-    static inline MapType Map(Scalar* data, Index size)
-    { return MapType(data, size); }
-    static inline ConstMapType Map(const Scalar* data, Index rows, Index cols)
-    { return ConstMapType(data, rows, cols); }
-    static inline MapType Map(Scalar* data, Index rows, Index cols)
-    { return MapType(data, rows, cols); }
+  static inline ConstAlignedMapType MapAligned(const Scalar* data) { return ConstAlignedMapType(data); }
+  static inline AlignedMapType MapAligned(Scalar* data) { return AlignedMapType(data); }
+  static inline ConstAlignedMapType MapAligned(const Scalar* data, Index size) {
+    return ConstAlignedMapType(data, size);
+  }
+  static inline AlignedMapType MapAligned(Scalar* data, Index size) { return AlignedMapType(data, size); }
+  static inline ConstAlignedMapType MapAligned(const Scalar* data, Index rows, Index cols) {
+    return ConstAlignedMapType(data, rows, cols);
+  }
+  static inline AlignedMapType MapAligned(Scalar* data, Index rows, Index cols) {
+    return AlignedMapType(data, rows, cols);
+  }
 
-    static inline ConstAlignedMapType MapAligned(const Scalar* data)
-    { return ConstAlignedMapType(data); }
-    static inline AlignedMapType MapAligned(Scalar* data)
-    { return AlignedMapType(data); }
-    static inline ConstAlignedMapType MapAligned(const Scalar* data, Index size)
-    { return ConstAlignedMapType(data, size); }
-    static inline AlignedMapType MapAligned(Scalar* data, Index size)
-    { return AlignedMapType(data, size); }
-    static inline ConstAlignedMapType MapAligned(const Scalar* data, Index rows, Index cols)
-    { return ConstAlignedMapType(data, rows, cols); }
-    static inline AlignedMapType MapAligned(Scalar* data, Index rows, Index cols)
-    { return AlignedMapType(data, rows, cols); }
+  template <int Outer, int Inner>
+  static inline typename StridedConstMapType<Stride<Outer, Inner>>::type Map(const Scalar* data,
+                                                                             const Stride<Outer, Inner>& stride) {
+    return typename StridedConstMapType<Stride<Outer, Inner>>::type(data, stride);
+  }
+  template <int Outer, int Inner>
+  static inline typename StridedMapType<Stride<Outer, Inner>>::type Map(Scalar* data,
+                                                                        const Stride<Outer, Inner>& stride) {
+    return typename StridedMapType<Stride<Outer, Inner>>::type(data, stride);
+  }
+  template <int Outer, int Inner>
+  static inline typename StridedConstMapType<Stride<Outer, Inner>>::type Map(const Scalar* data, Index size,
+                                                                             const Stride<Outer, Inner>& stride) {
+    return typename StridedConstMapType<Stride<Outer, Inner>>::type(data, size, stride);
+  }
+  template <int Outer, int Inner>
+  static inline typename StridedMapType<Stride<Outer, Inner>>::type Map(Scalar* data, Index size,
+                                                                        const Stride<Outer, Inner>& stride) {
+    return typename StridedMapType<Stride<Outer, Inner>>::type(data, size, stride);
+  }
+  template <int Outer, int Inner>
+  static inline typename StridedConstMapType<Stride<Outer, Inner>>::type Map(const Scalar* data, Index rows, Index cols,
+                                                                             const Stride<Outer, Inner>& stride) {
+    return typename StridedConstMapType<Stride<Outer, Inner>>::type(data, rows, cols, stride);
+  }
+  template <int Outer, int Inner>
+  static inline typename StridedMapType<Stride<Outer, Inner>>::type Map(Scalar* data, Index rows, Index cols,
+                                                                        const Stride<Outer, Inner>& stride) {
+    return typename StridedMapType<Stride<Outer, Inner>>::type(data, rows, cols, stride);
+  }
 
-    template<int Outer, int Inner>
-    static inline typename StridedConstMapType<Stride<Outer, Inner> >::type Map(const Scalar* data, const Stride<Outer, Inner>& stride)
-    { return typename StridedConstMapType<Stride<Outer, Inner> >::type(data, stride); }
-    template<int Outer, int Inner>
-    static inline typename StridedMapType<Stride<Outer, Inner> >::type Map(Scalar* data, const Stride<Outer, Inner>& stride)
-    { return typename StridedMapType<Stride<Outer, Inner> >::type(data, stride); }
-    template<int Outer, int Inner>
-    static inline typename StridedConstMapType<Stride<Outer, Inner> >::type Map(const Scalar* data, Index size, const Stride<Outer, Inner>& stride)
-    { return typename StridedConstMapType<Stride<Outer, Inner> >::type(data, size, stride); }
-    template<int Outer, int Inner>
-    static inline typename StridedMapType<Stride<Outer, Inner> >::type Map(Scalar* data, Index size, const Stride<Outer, Inner>& stride)
-    { return typename StridedMapType<Stride<Outer, Inner> >::type(data, size, stride); }
-    template<int Outer, int Inner>
-    static inline typename StridedConstMapType<Stride<Outer, Inner> >::type Map(const Scalar* data, Index rows, Index cols, const Stride<Outer, Inner>& stride)
-    { return typename StridedConstMapType<Stride<Outer, Inner> >::type(data, rows, cols, stride); }
-    template<int Outer, int Inner>
-    static inline typename StridedMapType<Stride<Outer, Inner> >::type Map(Scalar* data, Index rows, Index cols, const Stride<Outer, Inner>& stride)
-    { return typename StridedMapType<Stride<Outer, Inner> >::type(data, rows, cols, stride); }
+  template <int Outer, int Inner>
+  static inline typename StridedConstAlignedMapType<Stride<Outer, Inner>>::type MapAligned(
+      const Scalar* data, const Stride<Outer, Inner>& stride) {
+    return typename StridedConstAlignedMapType<Stride<Outer, Inner>>::type(data, stride);
+  }
+  template <int Outer, int Inner>
+  static inline typename StridedAlignedMapType<Stride<Outer, Inner>>::type MapAligned(
+      Scalar* data, const Stride<Outer, Inner>& stride) {
+    return typename StridedAlignedMapType<Stride<Outer, Inner>>::type(data, stride);
+  }
+  template <int Outer, int Inner>
+  static inline typename StridedConstAlignedMapType<Stride<Outer, Inner>>::type MapAligned(
+      const Scalar* data, Index size, const Stride<Outer, Inner>& stride) {
+    return typename StridedConstAlignedMapType<Stride<Outer, Inner>>::type(data, size, stride);
+  }
+  template <int Outer, int Inner>
+  static inline typename StridedAlignedMapType<Stride<Outer, Inner>>::type MapAligned(
+      Scalar* data, Index size, const Stride<Outer, Inner>& stride) {
+    return typename StridedAlignedMapType<Stride<Outer, Inner>>::type(data, size, stride);
+  }
+  template <int Outer, int Inner>
+  static inline typename StridedConstAlignedMapType<Stride<Outer, Inner>>::type MapAligned(
+      const Scalar* data, Index rows, Index cols, const Stride<Outer, Inner>& stride) {
+    return typename StridedConstAlignedMapType<Stride<Outer, Inner>>::type(data, rows, cols, stride);
+  }
+  template <int Outer, int Inner>
+  static inline typename StridedAlignedMapType<Stride<Outer, Inner>>::type MapAligned(
+      Scalar* data, Index rows, Index cols, const Stride<Outer, Inner>& stride) {
+    return typename StridedAlignedMapType<Stride<Outer, Inner>>::type(data, rows, cols, stride);
+  }
+  ///@}
 
-    template<int Outer, int Inner>
-    static inline typename StridedConstAlignedMapType<Stride<Outer, Inner> >::type MapAligned(const Scalar* data, const Stride<Outer, Inner>& stride)
-    { return typename StridedConstAlignedMapType<Stride<Outer, Inner> >::type(data, stride); }
-    template<int Outer, int Inner>
-    static inline typename StridedAlignedMapType<Stride<Outer, Inner> >::type MapAligned(Scalar* data, const Stride<Outer, Inner>& stride)
-    { return typename StridedAlignedMapType<Stride<Outer, Inner> >::type(data, stride); }
-    template<int Outer, int Inner>
-    static inline typename StridedConstAlignedMapType<Stride<Outer, Inner> >::type MapAligned(const Scalar* data, Index size, const Stride<Outer, Inner>& stride)
-    { return typename StridedConstAlignedMapType<Stride<Outer, Inner> >::type(data, size, stride); }
-    template<int Outer, int Inner>
-    static inline typename StridedAlignedMapType<Stride<Outer, Inner> >::type MapAligned(Scalar* data, Index size, const Stride<Outer, Inner>& stride)
-    { return typename StridedAlignedMapType<Stride<Outer, Inner> >::type(data, size, stride); }
-    template<int Outer, int Inner>
-    static inline typename StridedConstAlignedMapType<Stride<Outer, Inner> >::type MapAligned(const Scalar* data, Index rows, Index cols, const Stride<Outer, Inner>& stride)
-    { return typename StridedConstAlignedMapType<Stride<Outer, Inner> >::type(data, rows, cols, stride); }
-    template<int Outer, int Inner>
-    static inline typename StridedAlignedMapType<Stride<Outer, Inner> >::type MapAligned(Scalar* data, Index rows, Index cols, const Stride<Outer, Inner>& stride)
-    { return typename StridedAlignedMapType<Stride<Outer, Inner> >::type(data, rows, cols, stride); }
-    ///@}
+  using Base::setConstant;
+  EIGEN_DEVICE_FUNC Derived& setConstant(Index size, const Scalar& val);
+  EIGEN_DEVICE_FUNC Derived& setConstant(Index rows, Index cols, const Scalar& val);
+  EIGEN_DEVICE_FUNC Derived& setConstant(NoChange_t, Index cols, const Scalar& val);
+  EIGEN_DEVICE_FUNC Derived& setConstant(Index rows, NoChange_t, const Scalar& val);
 
-    using Base::setConstant;
-    EIGEN_DEVICE_FUNC Derived& setConstant(Index size, const Scalar& val);
-    EIGEN_DEVICE_FUNC Derived& setConstant(Index rows, Index cols, const Scalar& val);
-    EIGEN_DEVICE_FUNC Derived& setConstant(NoChange_t, Index cols, const Scalar& val);
-    EIGEN_DEVICE_FUNC Derived& setConstant(Index rows, NoChange_t, const Scalar& val);
+  using Base::setZero;
+  EIGEN_DEVICE_FUNC Derived& setZero(Index size);
+  EIGEN_DEVICE_FUNC Derived& setZero(Index rows, Index cols);
+  EIGEN_DEVICE_FUNC Derived& setZero(NoChange_t, Index cols);
+  EIGEN_DEVICE_FUNC Derived& setZero(Index rows, NoChange_t);
 
-    using Base::setZero;
-    EIGEN_DEVICE_FUNC Derived& setZero(Index size);
-    EIGEN_DEVICE_FUNC Derived& setZero(Index rows, Index cols);
-    EIGEN_DEVICE_FUNC Derived& setZero(NoChange_t, Index cols);
-    EIGEN_DEVICE_FUNC Derived& setZero(Index rows, NoChange_t);
+  using Base::setOnes;
+  EIGEN_DEVICE_FUNC Derived& setOnes(Index size);
+  EIGEN_DEVICE_FUNC Derived& setOnes(Index rows, Index cols);
+  EIGEN_DEVICE_FUNC Derived& setOnes(NoChange_t, Index cols);
+  EIGEN_DEVICE_FUNC Derived& setOnes(Index rows, NoChange_t);
 
-    using Base::setOnes;
-    EIGEN_DEVICE_FUNC Derived& setOnes(Index size);
-    EIGEN_DEVICE_FUNC Derived& setOnes(Index rows, Index cols);
-    EIGEN_DEVICE_FUNC Derived& setOnes(NoChange_t, Index cols);
-    EIGEN_DEVICE_FUNC Derived& setOnes(Index rows, NoChange_t);
+  using Base::setRandom;
+  Derived& setRandom(Index size);
+  Derived& setRandom(Index rows, Index cols);
+  Derived& setRandom(NoChange_t, Index cols);
+  Derived& setRandom(Index rows, NoChange_t);
 
-    using Base::setRandom;
-    Derived& setRandom(Index size);
-    Derived& setRandom(Index rows, Index cols);
-    Derived& setRandom(NoChange_t, Index cols);
-    Derived& setRandom(Index rows, NoChange_t);
+#ifdef EIGEN_PLAINOBJECTBASE_PLUGIN
+#include EIGEN_PLAINOBJECTBASE_PLUGIN
+#endif
 
-    #ifdef EIGEN_PLAINOBJECTBASE_PLUGIN
-    #include EIGEN_PLAINOBJECTBASE_PLUGIN
-    #endif
+ protected:
+  /** \internal Resizes *this in preparation for assigning \a other to it.
+   * Takes care of doing all the checking that's needed.
+   *
+   * Note that copying a row-vector into a vector (and conversely) is allowed.
+   * The resizing, if any, is then done in the appropriate way so that row-vectors
+   * remain row-vectors and vectors remain vectors.
+   */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void _resize_to_match(const EigenBase<OtherDerived>& other) {
+#ifdef EIGEN_NO_AUTOMATIC_RESIZING
+    eigen_assert((this->size() == 0 || (IsVectorAtCompileTime ? (this->size() == other.size())
+                                                              : (rows() == other.rows() && cols() == other.cols()))) &&
+                 "Size mismatch. Automatic resizing is disabled because EIGEN_NO_AUTOMATIC_RESIZING is defined");
+    EIGEN_ONLY_USED_FOR_DEBUG(other);
+#else
+    resizeLike(other);
+#endif
+  }
 
-  protected:
-    /** \internal Resizes *this in preparation for assigning \a other to it.
-      * Takes care of doing all the checking that's needed.
-      *
-      * Note that copying a row-vector into a vector (and conversely) is allowed.
-      * The resizing, if any, is then done in the appropriate way so that row-vectors
-      * remain row-vectors and vectors remain vectors.
-      */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE void _resize_to_match(const EigenBase<OtherDerived>& other)
-    {
-      #ifdef EIGEN_NO_AUTOMATIC_RESIZING
-      eigen_assert((this->size()==0 || (IsVectorAtCompileTime ? (this->size() == other.size())
-                 : (rows() == other.rows() && cols() == other.cols())))
-        && "Size mismatch. Automatic resizing is disabled because EIGEN_NO_AUTOMATIC_RESIZING is defined");
-      EIGEN_ONLY_USED_FOR_DEBUG(other);
-      #else
-      resizeLike(other);
-      #endif
-    }
+  /**
+   * \brief Copies the value of the expression \a other into \c *this with automatic resizing.
+   *
+   * *this might be resized to match the dimensions of \a other. If *this was a null matrix (not already initialized),
+   * it will be initialized.
+   *
+   * Note that copying a row-vector into a vector (and conversely) is allowed.
+   * The resizing, if any, is then done in the appropriate way so that row-vectors
+   * remain row-vectors and vectors remain vectors.
+   *
+   * \sa operator=(const MatrixBase<OtherDerived>&), _set_noalias()
+   *
+   * \internal
+   */
+  // aliasing is dealt once in internal::call_assignment
+  // so at this stage we have to assume aliasing... and resising has to be done later.
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& _set(const DenseBase<OtherDerived>& other) {
+    internal::call_assignment(this->derived(), other.derived());
+    return this->derived();
+  }
 
-    /**
-      * \brief Copies the value of the expression \a other into \c *this with automatic resizing.
-      *
-      * *this might be resized to match the dimensions of \a other. If *this was a null matrix (not already initialized),
-      * it will be initialized.
-      *
-      * Note that copying a row-vector into a vector (and conversely) is allowed.
-      * The resizing, if any, is then done in the appropriate way so that row-vectors
-      * remain row-vectors and vectors remain vectors.
-      *
-      * \sa operator=(const MatrixBase<OtherDerived>&), _set_noalias()
-      *
-      * \internal
-      */
-    // aliasing is dealt once in internal::call_assignment
-    // so at this stage we have to assume aliasing... and resising has to be done later.
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Derived& _set(const DenseBase<OtherDerived>& other)
-    {
-      internal::call_assignment(this->derived(), other.derived());
-      return this->derived();
-    }
+  /** \internal Like _set() but additionally makes the assumption that no aliasing effect can happen (which
+   * is the case when creating a new matrix) so one can enforce lazy evaluation.
+   *
+   * \sa operator=(const MatrixBase<OtherDerived>&), _set()
+   */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& _set_noalias(const DenseBase<OtherDerived>& other) {
+    // I don't think we need this resize call since the lazyAssign will anyways resize
+    // and lazyAssign will be called by the assign selector.
+    //_resize_to_match(other);
+    // the 'false' below means to enforce lazy evaluation. We don't use lazyAssign() because
+    // it wouldn't allow to copy a row-vector into a column-vector.
+    internal::call_assignment_no_alias(this->derived(), other.derived(),
+                                       internal::assign_op<Scalar, typename OtherDerived::Scalar>());
+    return this->derived();
+  }
 
-    /** \internal Like _set() but additionally makes the assumption that no aliasing effect can happen (which
-      * is the case when creating a new matrix) so one can enforce lazy evaluation.
-      *
-      * \sa operator=(const MatrixBase<OtherDerived>&), _set()
-      */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Derived& _set_noalias(const DenseBase<OtherDerived>& other)
-    {
-      // I don't think we need this resize call since the lazyAssign will anyways resize
-      // and lazyAssign will be called by the assign selector.
-      //_resize_to_match(other);
-      // the 'false' below means to enforce lazy evaluation. We don't use lazyAssign() because
-      // it wouldn't allow to copy a row-vector into a column-vector.
-      internal::call_assignment_no_alias(this->derived(), other.derived(), internal::assign_op<Scalar,typename OtherDerived::Scalar>());
-      return this->derived();
-    }
+  template <typename T0, typename T1>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void _init2(Index rows, Index cols,
+                                                    std::enable_if_t<Base::SizeAtCompileTime != 2, T0>* = 0) {
+    EIGEN_STATIC_ASSERT(internal::is_valid_index_type<T0>::value && internal::is_valid_index_type<T1>::value,
+                        T0 AND T1 MUST BE INTEGER TYPES)
+    resize(rows, cols);
+  }
 
-    template<typename T0, typename T1>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE void _init2(Index rows, Index cols, std::enable_if_t<Base::SizeAtCompileTime!=2,T0>* = 0)
-    {
-      EIGEN_STATIC_ASSERT(internal::is_valid_index_type<T0>::value &&
-                          internal::is_valid_index_type<T1>::value,
-                          T0 AND T1 MUST BE INTEGER TYPES)
-      resize(rows,cols);
-    }
+  template <typename T0, typename T1>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void _init2(const T0& val0, const T1& val1,
+                                                    std::enable_if_t<Base::SizeAtCompileTime == 2, T0>* = 0) {
+    EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(PlainObjectBase, 2)
+    m_storage.data()[0] = Scalar(val0);
+    m_storage.data()[1] = Scalar(val1);
+  }
 
-    template<typename T0, typename T1>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE void _init2(const T0& val0, const T1& val1, std::enable_if_t<Base::SizeAtCompileTime==2,T0>* = 0)
-    {
-      EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(PlainObjectBase, 2)
-      m_storage.data()[0] = Scalar(val0);
-      m_storage.data()[1] = Scalar(val1);
-    }
+  template <typename T0, typename T1>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void _init2(
+      const Index& val0, const Index& val1,
+      std::enable_if_t<(!internal::is_same<Index, Scalar>::value) && (internal::is_same<T0, Index>::value) &&
+                           (internal::is_same<T1, Index>::value) && Base::SizeAtCompileTime == 2,
+                       T1>* = 0) {
+    EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(PlainObjectBase, 2)
+    m_storage.data()[0] = Scalar(val0);
+    m_storage.data()[1] = Scalar(val1);
+  }
 
-    template<typename T0, typename T1>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE void _init2(const Index& val0, const Index& val1,
-                                    std::enable_if_t<    (!internal::is_same<Index,Scalar>::value)
-                                                      && (internal::is_same<T0,Index>::value)
-                                                      && (internal::is_same<T1,Index>::value)
-                                                      && Base::SizeAtCompileTime==2,T1>* = 0)
-    {
-      EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(PlainObjectBase, 2)
-      m_storage.data()[0] = Scalar(val0);
-      m_storage.data()[1] = Scalar(val1);
-    }
+  // The argument is convertible to the Index type and we either have a non 1x1 Matrix, or a dynamic-sized Array,
+  // then the argument is meant to be the size of the object.
+  template <typename T>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void _init1(
+      Index size,
+      std::enable_if_t<(Base::SizeAtCompileTime != 1 || !internal::is_convertible<T, Scalar>::value) &&
+                           ((!internal::is_same<typename internal::traits<Derived>::XprKind, ArrayXpr>::value ||
+                             Base::SizeAtCompileTime == Dynamic)),
+                       T>* = 0) {
+    // NOTE MSVC 2008 complains if we directly put bool(NumTraits<T>::IsInteger) as the EIGEN_STATIC_ASSERT argument.
+    const bool is_integer_alike = internal::is_valid_index_type<T>::value;
+    EIGEN_UNUSED_VARIABLE(is_integer_alike);
+    EIGEN_STATIC_ASSERT(is_integer_alike, FLOATING_POINT_ARGUMENT_PASSED__INTEGER_WAS_EXPECTED)
+    resize(size);
+  }
 
-    // The argument is convertible to the Index type and we either have a non 1x1 Matrix, or a dynamic-sized Array,
-    // then the argument is meant to be the size of the object.
-    template<typename T>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE void _init1(Index size, std::enable_if_t<    (Base::SizeAtCompileTime!=1 || !internal::is_convertible<T, Scalar>::value)
-                                                                  && ((!internal::is_same<typename internal::traits<Derived>::XprKind,ArrayXpr>::value || Base::SizeAtCompileTime==Dynamic)),T>* = 0)
-    {
-      // NOTE MSVC 2008 complains if we directly put bool(NumTraits<T>::IsInteger) as the EIGEN_STATIC_ASSERT argument.
-      const bool is_integer_alike = internal::is_valid_index_type<T>::value;
-      EIGEN_UNUSED_VARIABLE(is_integer_alike);
-      EIGEN_STATIC_ASSERT(is_integer_alike,
-                          FLOATING_POINT_ARGUMENT_PASSED__INTEGER_WAS_EXPECTED)
-      resize(size);
-    }
+  // We have a 1x1 matrix/array => the argument is interpreted as the value of the unique coefficient (case where scalar
+  // type can be implicitly converted)
+  template <typename T>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void _init1(
+      const Scalar& val0,
+      std::enable_if_t<Base::SizeAtCompileTime == 1 && internal::is_convertible<T, Scalar>::value, T>* = 0) {
+    EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(PlainObjectBase, 1)
+    m_storage.data()[0] = val0;
+  }
 
-    // We have a 1x1 matrix/array => the argument is interpreted as the value of the unique coefficient (case where scalar type can be implicitly converted)
-    template<typename T>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE void _init1(const Scalar& val0, std::enable_if_t<Base::SizeAtCompileTime==1 && internal::is_convertible<T, Scalar>::value,T>* = 0)
-    {
-      EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(PlainObjectBase, 1)
-      m_storage.data()[0] = val0;
-    }
+  // We have a 1x1 matrix/array => the argument is interpreted as the value of the unique coefficient (case where scalar
+  // type match the index type)
+  template <typename T>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void _init1(
+      const Index& val0,
+      std::enable_if_t<(!internal::is_same<Index, Scalar>::value) && (internal::is_same<Index, T>::value) &&
+                           Base::SizeAtCompileTime == 1 && internal::is_convertible<T, Scalar>::value,
+                       T*>* = 0) {
+    EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(PlainObjectBase, 1)
+    m_storage.data()[0] = Scalar(val0);
+  }
 
-    // We have a 1x1 matrix/array => the argument is interpreted as the value of the unique coefficient (case where scalar type match the index type)
-    template<typename T>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE void _init1(const Index& val0,
-                                    std::enable_if_t<    (!internal::is_same<Index,Scalar>::value)
-                                                      && (internal::is_same<Index,T>::value)
-                                                      && Base::SizeAtCompileTime==1
-                                                      && internal::is_convertible<T, Scalar>::value,T*>* = 0)
-    {
-      EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(PlainObjectBase, 1)
-      m_storage.data()[0] = Scalar(val0);
-    }
+  // Initialize a fixed size matrix from a pointer to raw data
+  template <typename T>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void _init1(const Scalar* data) {
+    this->_set_noalias(ConstMapType(data));
+  }
 
-    // Initialize a fixed size matrix from a pointer to raw data
-    template<typename T>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE void _init1(const Scalar* data){
-      this->_set_noalias(ConstMapType(data));
-    }
+  // Initialize an arbitrary matrix from a dense expression
+  template <typename T, typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void _init1(const DenseBase<OtherDerived>& other) {
+    this->_set_noalias(other);
+  }
 
-    // Initialize an arbitrary matrix from a dense expression
-    template<typename T, typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE void _init1(const DenseBase<OtherDerived>& other){
-      this->_set_noalias(other);
-    }
+  // Initialize an arbitrary matrix from an object convertible to the Derived type.
+  template <typename T>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void _init1(const Derived& other) {
+    this->_set_noalias(other);
+  }
 
-    // Initialize an arbitrary matrix from an object convertible to the Derived type.
-    template<typename T>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE void _init1(const Derived& other){
-      this->_set_noalias(other);
-    }
+  // Initialize an arbitrary matrix from a generic Eigen expression
+  template <typename T, typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void _init1(const EigenBase<OtherDerived>& other) {
+    this->derived() = other;
+  }
 
-    // Initialize an arbitrary matrix from a generic Eigen expression
-    template<typename T, typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE void _init1(const EigenBase<OtherDerived>& other){
-      this->derived() = other;
-    }
+  template <typename T, typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void _init1(const ReturnByValue<OtherDerived>& other) {
+    resize(other.rows(), other.cols());
+    other.evalTo(this->derived());
+  }
 
-    template<typename T, typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE void _init1(const ReturnByValue<OtherDerived>& other)
-    {
-      resize(other.rows(), other.cols());
-      other.evalTo(this->derived());
-    }
+  template <typename T, typename OtherDerived, int ColsAtCompileTime>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void _init1(const RotationBase<OtherDerived, ColsAtCompileTime>& r) {
+    this->derived() = r;
+  }
 
-    template<typename T, typename OtherDerived, int ColsAtCompileTime>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE void _init1(const RotationBase<OtherDerived,ColsAtCompileTime>& r)
-    {
-      this->derived() = r;
-    }
+  // For fixed-size Array<Scalar,...>
+  template <typename T>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void _init1(
+      const Scalar& val0,
+      std::enable_if_t<Base::SizeAtCompileTime != Dynamic && Base::SizeAtCompileTime != 1 &&
+                           internal::is_convertible<T, Scalar>::value &&
+                           internal::is_same<typename internal::traits<Derived>::XprKind, ArrayXpr>::value,
+                       T>* = 0) {
+    Base::setConstant(val0);
+  }
 
-    // For fixed-size Array<Scalar,...>
-    template<typename T>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE void _init1(const Scalar& val0,
-                                    std::enable_if_t<    Base::SizeAtCompileTime!=Dynamic
-                                                      && Base::SizeAtCompileTime!=1
-                                                      && internal::is_convertible<T, Scalar>::value
-                                                      && internal::is_same<typename internal::traits<Derived>::XprKind,ArrayXpr>::value,T>* = 0)
-    {
-      Base::setConstant(val0);
-    }
+  // For fixed-size Array<Index,...>
+  template <typename T>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void _init1(
+      const Index& val0,
+      std::enable_if_t<(!internal::is_same<Index, Scalar>::value) && (internal::is_same<Index, T>::value) &&
+                           Base::SizeAtCompileTime != Dynamic && Base::SizeAtCompileTime != 1 &&
+                           internal::is_convertible<T, Scalar>::value &&
+                           internal::is_same<typename internal::traits<Derived>::XprKind, ArrayXpr>::value,
+                       T*>* = 0) {
+    Base::setConstant(val0);
+  }
 
-    // For fixed-size Array<Index,...>
-    template<typename T>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE void _init1(const Index& val0,
-                                    std::enable_if_t<    (!internal::is_same<Index,Scalar>::value)
-                                                      && (internal::is_same<Index,T>::value)
-                                                      && Base::SizeAtCompileTime!=Dynamic
-                                                      && Base::SizeAtCompileTime!=1
-                                                      && internal::is_convertible<T, Scalar>::value
-                                                      && internal::is_same<typename internal::traits<Derived>::XprKind,ArrayXpr>::value,T*>* = 0)
-    {
-      Base::setConstant(val0);
-    }
+  template <typename MatrixTypeA, typename MatrixTypeB, bool SwapPointers>
+  friend struct internal::matrix_swap_impl;
 
-    template<typename MatrixTypeA, typename MatrixTypeB, bool SwapPointers>
-    friend struct internal::matrix_swap_impl;
-
-  public:
-
+ public:
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-    /** \internal
-      * \brief Override DenseBase::swap() since for dynamic-sized matrices
-      * of same type it is enough to swap the data pointers.
-      */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    void swap(DenseBase<OtherDerived> & other)
-    {
-      enum { SwapPointers = internal::is_same<Derived, OtherDerived>::value && Base::SizeAtCompileTime==Dynamic };
-      internal::matrix_swap_impl<Derived, OtherDerived, bool(SwapPointers)>::run(this->derived(), other.derived());
-    }
+  /** \internal
+   * \brief Override DenseBase::swap() since for dynamic-sized matrices
+   * of same type it is enough to swap the data pointers.
+   */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void swap(DenseBase<OtherDerived>& other) {
+    enum {SwapPointers = internal::is_same<Derived, OtherDerived>::value && Base::SizeAtCompileTime == Dynamic};
+    internal::matrix_swap_impl<Derived, OtherDerived, bool(SwapPointers)>::run(this->derived(), other.derived());
+  }
 
-    /** \internal
-      * \brief const version forwarded to DenseBase::swap
-      */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    void swap(DenseBase<OtherDerived> const & other)
-    { Base::swap(other.derived()); }
+  /** \internal
+   * \brief const version forwarded to DenseBase::swap
+   */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void swap(DenseBase<OtherDerived> const& other) {
+    Base::swap(other.derived());
+  }
 
-    enum { IsPlainObjectBase = 1 };
+  enum {IsPlainObjectBase = 1};
 #endif
-  public:
-    // These apparently need to be down here for nvcc+icc to prevent duplicate
-    // Map symbol.
-    template<typename PlainObjectType, int MapOptions, typename StrideType> friend class Eigen::Map;
-    friend class Eigen::Map<Derived, Unaligned>;
-    friend class Eigen::Map<const Derived, Unaligned>;
-#if EIGEN_MAX_ALIGN_BYTES>0
-    // for EIGEN_MAX_ALIGN_BYTES==0, AlignedMax==Unaligned, and many compilers generate warnings for friend-ing a class twice.
-    friend class Eigen::Map<Derived, AlignedMax>;
-    friend class Eigen::Map<const Derived, AlignedMax>;
+ public:
+  // These apparently need to be down here for nvcc+icc to prevent duplicate
+  // Map symbol.
+  template <typename PlainObjectType, int MapOptions, typename StrideType>
+  friend class Eigen::Map;
+  friend class Eigen::Map<Derived, Unaligned>;
+  friend class Eigen::Map<const Derived, Unaligned>;
+#if EIGEN_MAX_ALIGN_BYTES > 0
+  // for EIGEN_MAX_ALIGN_BYTES==0, AlignedMax==Unaligned, and many compilers generate warnings for friend-ing a class
+  // twice.
+  friend class Eigen::Map<Derived, AlignedMax>;
+  friend class Eigen::Map<const Derived, AlignedMax>;
 #endif
 };
 
 namespace internal {
 
 template <typename Derived, typename OtherDerived, bool IsVector>
-struct conservative_resize_like_impl
-{
+struct conservative_resize_like_impl {
   static constexpr bool IsRelocatable = std::is_trivially_copyable<typename Derived::Scalar>::value;
-  static void run(DenseBase<Derived>& _this, Index rows, Index cols)
-  {
+  static void run(DenseBase<Derived>& _this, Index rows, Index cols) {
     if (_this.rows() == rows && _this.cols() == cols) return;
     EIGEN_STATIC_ASSERT_DYNAMIC_SIZE(Derived)
 
-    if ( IsRelocatable
-          && (( Derived::IsRowMajor && _this.cols() == cols) ||  // row-major and we change only the number of rows
-              (!Derived::IsRowMajor && _this.rows() == rows) ))  // column-major and we change only the number of columns
+    if (IsRelocatable &&
+        ((Derived::IsRowMajor && _this.cols() == cols) ||  // row-major and we change only the number of rows
+         (!Derived::IsRowMajor && _this.rows() == rows)))  // column-major and we change only the number of columns
     {
-      internal::check_rows_cols_for_overflow<Derived::MaxSizeAtCompileTime, Derived::MaxRowsAtCompileTime, Derived::MaxColsAtCompileTime>::run(rows, cols);
-      _this.derived().m_storage.conservativeResize(rows*cols,rows,cols);
-    }
-    else
-    {
+      internal::check_rows_cols_for_overflow<Derived::MaxSizeAtCompileTime, Derived::MaxRowsAtCompileTime,
+                                             Derived::MaxColsAtCompileTime>::run(rows, cols);
+      _this.derived().m_storage.conservativeResize(rows * cols, rows, cols);
+    } else {
       // The storage order does not allow us to use reallocation.
-      Derived tmp(rows,cols);
+      Derived tmp(rows, cols);
       const Index common_rows = numext::mini(rows, _this.rows());
       const Index common_cols = numext::mini(cols, _this.cols());
-      tmp.block(0,0,common_rows,common_cols) = _this.block(0,0,common_rows,common_cols);
+      tmp.block(0, 0, common_rows, common_cols) = _this.block(0, 0, common_rows, common_cols);
       _this.derived().swap(tmp);
     }
   }
 
-  static void run(DenseBase<Derived>& _this, const DenseBase<OtherDerived>& other)
-  {
+  static void run(DenseBase<Derived>& _this, const DenseBase<OtherDerived>& other) {
     if (_this.rows() == other.rows() && _this.cols() == other.cols()) return;
 
     // Note: Here is space for improvement. Basically, for conservativeResize(Index,Index),
@@ -1011,25 +963,24 @@
     EIGEN_STATIC_ASSERT_DYNAMIC_SIZE(Derived)
     EIGEN_STATIC_ASSERT_DYNAMIC_SIZE(OtherDerived)
 
-    if ( IsRelocatable &&
-          (( Derived::IsRowMajor && _this.cols() == other.cols()) ||  // row-major and we change only the number of rows
-           (!Derived::IsRowMajor && _this.rows() == other.rows()) ))  // column-major and we change only the number of columns
+    if (IsRelocatable &&
+        ((Derived::IsRowMajor && _this.cols() == other.cols()) ||  // row-major and we change only the number of rows
+         (!Derived::IsRowMajor &&
+          _this.rows() == other.rows())))  // column-major and we change only the number of columns
     {
       const Index new_rows = other.rows() - _this.rows();
       const Index new_cols = other.cols() - _this.cols();
-      _this.derived().m_storage.conservativeResize(other.size(),other.rows(),other.cols());
-      if (new_rows>0)
+      _this.derived().m_storage.conservativeResize(other.size(), other.rows(), other.cols());
+      if (new_rows > 0)
         _this.bottomRightCorner(new_rows, other.cols()) = other.bottomRows(new_rows);
-      else if (new_cols>0)
+      else if (new_cols > 0)
         _this.bottomRightCorner(other.rows(), new_cols) = other.rightCols(new_cols);
-    }
-    else
-    {
+    } else {
       // The storage order does not allow us to use reallocation.
       Derived tmp(other);
       const Index common_rows = numext::mini(tmp.rows(), _this.rows());
       const Index common_cols = numext::mini(tmp.cols(), _this.cols());
-      tmp.block(0,0,common_rows,common_cols) = _this.block(0,0,common_rows,common_cols);
+      tmp.block(0, 0, common_rows, common_cols) = _this.block(0, 0, common_rows, common_cols);
       _this.derived().swap(tmp);
     }
   }
@@ -1038,63 +989,51 @@
 // Here, the specialization for vectors inherits from the general matrix case
 // to allow calling .conservativeResize(rows,cols) on vectors.
 template <typename Derived, typename OtherDerived>
-struct conservative_resize_like_impl<Derived,OtherDerived,true>
-  : conservative_resize_like_impl<Derived,OtherDerived,false>
-{
-  typedef conservative_resize_like_impl<Derived,OtherDerived,false> Base;
-  using Base::run;
+struct conservative_resize_like_impl<Derived, OtherDerived, true>
+    : conservative_resize_like_impl<Derived, OtherDerived, false> {
+  typedef conservative_resize_like_impl<Derived, OtherDerived, false> Base;
   using Base::IsRelocatable;
+  using Base::run;
 
-  static void run(DenseBase<Derived>& _this, Index size)
-  {
-    const Index new_rows = Derived::RowsAtCompileTime==1 ? 1 : size;
-    const Index new_cols = Derived::RowsAtCompileTime==1 ? size : 1;
-    if(IsRelocatable)
-      _this.derived().m_storage.conservativeResize(size,new_rows,new_cols);
+  static void run(DenseBase<Derived>& _this, Index size) {
+    const Index new_rows = Derived::RowsAtCompileTime == 1 ? 1 : size;
+    const Index new_cols = Derived::RowsAtCompileTime == 1 ? size : 1;
+    if (IsRelocatable)
+      _this.derived().m_storage.conservativeResize(size, new_rows, new_cols);
     else
       Base::run(_this.derived(), new_rows, new_cols);
   }
 
-  static void run(DenseBase<Derived>& _this, const DenseBase<OtherDerived>& other)
-  {
+  static void run(DenseBase<Derived>& _this, const DenseBase<OtherDerived>& other) {
     if (_this.rows() == other.rows() && _this.cols() == other.cols()) return;
 
     const Index num_new_elements = other.size() - _this.size();
 
-    const Index new_rows = Derived::RowsAtCompileTime==1 ? 1 : other.rows();
-    const Index new_cols = Derived::RowsAtCompileTime==1 ? other.cols() : 1;
-    if(IsRelocatable)
-      _this.derived().m_storage.conservativeResize(other.size(),new_rows,new_cols);
+    const Index new_rows = Derived::RowsAtCompileTime == 1 ? 1 : other.rows();
+    const Index new_cols = Derived::RowsAtCompileTime == 1 ? other.cols() : 1;
+    if (IsRelocatable)
+      _this.derived().m_storage.conservativeResize(other.size(), new_rows, new_cols);
     else
       Base::run(_this.derived(), new_rows, new_cols);
 
-    if (num_new_elements > 0)
-      _this.tail(num_new_elements) = other.tail(num_new_elements);
+    if (num_new_elements > 0) _this.tail(num_new_elements) = other.tail(num_new_elements);
   }
 };
 
-template<typename MatrixTypeA, typename MatrixTypeB, bool SwapPointers>
-struct matrix_swap_impl
-{
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE void run(MatrixTypeA& a, MatrixTypeB& b)
-  {
-    a.base().swap(b);
-  }
+template <typename MatrixTypeA, typename MatrixTypeB, bool SwapPointers>
+struct matrix_swap_impl {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(MatrixTypeA& a, MatrixTypeB& b) { a.base().swap(b); }
 };
 
-template<typename MatrixTypeA, typename MatrixTypeB>
-struct matrix_swap_impl<MatrixTypeA, MatrixTypeB, true>
-{
-  EIGEN_DEVICE_FUNC
-  static inline void run(MatrixTypeA& a, MatrixTypeB& b)
-  {
+template <typename MatrixTypeA, typename MatrixTypeB>
+struct matrix_swap_impl<MatrixTypeA, MatrixTypeB, true> {
+  EIGEN_DEVICE_FUNC static inline void run(MatrixTypeA& a, MatrixTypeB& b) {
     static_cast<typename MatrixTypeA::Base&>(a).m_storage.swap(static_cast<typename MatrixTypeB::Base&>(b).m_storage);
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_DENSESTORAGEBASE_H
+#endif  // EIGEN_DENSESTORAGEBASE_H
diff --git a/Eigen/src/Core/Product.h b/Eigen/src/Core/Product.h
index 107b47e..6bad832 100644
--- a/Eigen/src/Core/Product.h
+++ b/Eigen/src/Core/Product.h
@@ -15,13 +15,13 @@
 
 namespace Eigen {
 
-template<typename Lhs, typename Rhs, int Option, typename StorageKind> class ProductImpl;
+template <typename Lhs, typename Rhs, int Option, typename StorageKind>
+class ProductImpl;
 
 namespace internal {
 
-template<typename Lhs, typename Rhs, int Option>
-struct traits<Product<Lhs, Rhs, Option> >
-{
+template <typename Lhs, typename Rhs, int Option>
+struct traits<Product<Lhs, Rhs, Option> > {
   typedef remove_all_t<Lhs> LhsCleaned;
   typedef remove_all_t<Rhs> RhsCleaned;
   typedef traits<LhsCleaned> LhsTraits;
@@ -29,16 +29,16 @@
 
   typedef MatrixXpr XprKind;
 
-  typedef typename ScalarBinaryOpTraits<typename traits<LhsCleaned>::Scalar, typename traits<RhsCleaned>::Scalar>::ReturnType Scalar;
-  typedef typename product_promote_storage_type<typename LhsTraits::StorageKind,
-                                                typename RhsTraits::StorageKind,
-                                                internal::product_type<Lhs,Rhs>::ret>::ret StorageKind;
-  typedef typename promote_index_type<typename LhsTraits::StorageIndex,
-                                      typename RhsTraits::StorageIndex>::type StorageIndex;
+  typedef typename ScalarBinaryOpTraits<typename traits<LhsCleaned>::Scalar,
+                                        typename traits<RhsCleaned>::Scalar>::ReturnType Scalar;
+  typedef typename product_promote_storage_type<typename LhsTraits::StorageKind, typename RhsTraits::StorageKind,
+                                                internal::product_type<Lhs, Rhs>::ret>::ret StorageKind;
+  typedef typename promote_index_type<typename LhsTraits::StorageIndex, typename RhsTraits::StorageIndex>::type
+      StorageIndex;
 
   enum {
-    RowsAtCompileTime    = LhsTraits::RowsAtCompileTime,
-    ColsAtCompileTime    = RhsTraits::ColsAtCompileTime,
+    RowsAtCompileTime = LhsTraits::RowsAtCompileTime,
+    ColsAtCompileTime = RhsTraits::ColsAtCompileTime,
     MaxRowsAtCompileTime = LhsTraits::MaxRowsAtCompileTime,
     MaxColsAtCompileTime = RhsTraits::MaxColsAtCompileTime,
 
@@ -46,149 +46,129 @@
     InnerSize = min_size_prefer_fixed(LhsTraits::ColsAtCompileTime, RhsTraits::RowsAtCompileTime),
 
     // The storage order is somewhat arbitrary here. The correct one will be determined through the evaluator.
-    Flags = (MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1) ? RowMajorBit
-          : (MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1) ? 0
-          : (   ((LhsTraits::Flags&NoPreferredStorageOrderBit) && (RhsTraits::Flags&RowMajorBit))
-             || ((RhsTraits::Flags&NoPreferredStorageOrderBit) && (LhsTraits::Flags&RowMajorBit)) ) ? RowMajorBit
-          : NoPreferredStorageOrderBit
+    Flags = (MaxRowsAtCompileTime == 1 && MaxColsAtCompileTime != 1)   ? RowMajorBit
+            : (MaxColsAtCompileTime == 1 && MaxRowsAtCompileTime != 1) ? 0
+            : (((LhsTraits::Flags & NoPreferredStorageOrderBit) && (RhsTraits::Flags & RowMajorBit)) ||
+               ((RhsTraits::Flags & NoPreferredStorageOrderBit) && (LhsTraits::Flags & RowMajorBit)))
+                ? RowMajorBit
+                : NoPreferredStorageOrderBit
   };
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \class Product
-  * \ingroup Core_Module
-  *
-  * \brief Expression of the product of two arbitrary matrices or vectors
-  *
-  * \tparam Lhs_ the type of the left-hand side expression
-  * \tparam Rhs_ the type of the right-hand side expression
-  *
-  * This class represents an expression of the product of two arbitrary matrices.
-  *
-  * The other template parameters are:
-  * \tparam Option     can be DefaultProduct, AliasFreeProduct, or LazyProduct
-  *
-  */
-template<typename Lhs_, typename Rhs_, int Option>
-class Product : public ProductImpl<Lhs_,Rhs_,Option,
-                                   typename internal::product_promote_storage_type<typename internal::traits<Lhs_>::StorageKind,
-                                                                                   typename internal::traits<Rhs_>::StorageKind,
-                                                                                   internal::product_type<Lhs_,Rhs_>::ret>::ret>
-{
-  public:
+ * \ingroup Core_Module
+ *
+ * \brief Expression of the product of two arbitrary matrices or vectors
+ *
+ * \tparam Lhs_ the type of the left-hand side expression
+ * \tparam Rhs_ the type of the right-hand side expression
+ *
+ * This class represents an expression of the product of two arbitrary matrices.
+ *
+ * The other template parameters are:
+ * \tparam Option     can be DefaultProduct, AliasFreeProduct, or LazyProduct
+ *
+ */
+template <typename Lhs_, typename Rhs_, int Option>
+class Product
+    : public ProductImpl<Lhs_, Rhs_, Option,
+                         typename internal::product_promote_storage_type<
+                             typename internal::traits<Lhs_>::StorageKind, typename internal::traits<Rhs_>::StorageKind,
+                             internal::product_type<Lhs_, Rhs_>::ret>::ret> {
+ public:
+  typedef Lhs_ Lhs;
+  typedef Rhs_ Rhs;
 
-    typedef Lhs_ Lhs;
-    typedef Rhs_ Rhs;
+  typedef
+      typename ProductImpl<Lhs, Rhs, Option,
+                           typename internal::product_promote_storage_type<
+                               typename internal::traits<Lhs>::StorageKind, typename internal::traits<Rhs>::StorageKind,
+                               internal::product_type<Lhs, Rhs>::ret>::ret>::Base Base;
+  EIGEN_GENERIC_PUBLIC_INTERFACE(Product)
 
-    typedef typename ProductImpl<
-        Lhs, Rhs, Option,
-        typename internal::product_promote_storage_type<typename internal::traits<Lhs>::StorageKind,
-                                                        typename internal::traits<Rhs>::StorageKind,
-                                                        internal::product_type<Lhs,Rhs>::ret>::ret>::Base Base;
-    EIGEN_GENERIC_PUBLIC_INTERFACE(Product)
+  typedef typename internal::ref_selector<Lhs>::type LhsNested;
+  typedef typename internal::ref_selector<Rhs>::type RhsNested;
+  typedef internal::remove_all_t<LhsNested> LhsNestedCleaned;
+  typedef internal::remove_all_t<RhsNested> RhsNestedCleaned;
 
-    typedef typename internal::ref_selector<Lhs>::type LhsNested;
-    typedef typename internal::ref_selector<Rhs>::type RhsNested;
-    typedef internal::remove_all_t<LhsNested> LhsNestedCleaned;
-    typedef internal::remove_all_t<RhsNested> RhsNestedCleaned;
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Product(const Lhs& lhs, const Rhs& rhs) : m_lhs(lhs), m_rhs(rhs) {
+    eigen_assert(lhs.cols() == rhs.rows() && "invalid matrix product" &&
+                 "if you wanted a coeff-wise or a dot product use the respective explicit functions");
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Product(const Lhs& lhs, const Rhs& rhs) : m_lhs(lhs), m_rhs(rhs)
-    {
-      eigen_assert(lhs.cols() == rhs.rows()
-        && "invalid matrix product"
-        && "if you wanted a coeff-wise or a dot product use the respective explicit functions");
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_lhs.rows(); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_rhs.cols(); }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-    Index rows() const EIGEN_NOEXCEPT { return m_lhs.rows(); }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-    Index cols() const EIGEN_NOEXCEPT { return m_rhs.cols(); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const LhsNestedCleaned& lhs() const { return m_lhs; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const RhsNestedCleaned& rhs() const { return m_rhs; }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    const LhsNestedCleaned& lhs() const { return m_lhs; }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    const RhsNestedCleaned& rhs() const { return m_rhs; }
-
-  protected:
-
-    LhsNested m_lhs;
-    RhsNested m_rhs;
+ protected:
+  LhsNested m_lhs;
+  RhsNested m_rhs;
 };
 
 namespace internal {
 
-template<typename Lhs, typename Rhs, int Option, int ProductTag = internal::product_type<Lhs,Rhs>::ret>
-class dense_product_base
- : public internal::dense_xpr_base<Product<Lhs,Rhs,Option> >::type
-{};
+template <typename Lhs, typename Rhs, int Option, int ProductTag = internal::product_type<Lhs, Rhs>::ret>
+class dense_product_base : public internal::dense_xpr_base<Product<Lhs, Rhs, Option> >::type {};
 
 /** Conversion to scalar for inner-products */
-template<typename Lhs, typename Rhs, int Option>
+template <typename Lhs, typename Rhs, int Option>
 class dense_product_base<Lhs, Rhs, Option, InnerProduct>
- : public internal::dense_xpr_base<Product<Lhs,Rhs,Option> >::type
-{
-  typedef Product<Lhs,Rhs,Option> ProductXpr;
+    : public internal::dense_xpr_base<Product<Lhs, Rhs, Option> >::type {
+  typedef Product<Lhs, Rhs, Option> ProductXpr;
   typedef typename internal::dense_xpr_base<ProductXpr>::type Base;
-public:
+
+ public:
   using Base::derived;
   typedef typename Base::Scalar Scalar;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE operator const Scalar() const
-  {
-    return internal::evaluator<ProductXpr>(derived()).coeff(0,0);
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE operator const Scalar() const {
+    return internal::evaluator<ProductXpr>(derived()).coeff(0, 0);
   }
 };
 
-} // namespace internal
+}  // namespace internal
 
 // Generic API dispatcher
-template<typename Lhs, typename Rhs, int Option, typename StorageKind>
-class ProductImpl : public internal::generic_xpr_base<Product<Lhs,Rhs,Option>, MatrixXpr, StorageKind>::type
-{
-  public:
-    typedef typename internal::generic_xpr_base<Product<Lhs,Rhs,Option>, MatrixXpr, StorageKind>::type Base;
+template <typename Lhs, typename Rhs, int Option, typename StorageKind>
+class ProductImpl : public internal::generic_xpr_base<Product<Lhs, Rhs, Option>, MatrixXpr, StorageKind>::type {
+ public:
+  typedef typename internal::generic_xpr_base<Product<Lhs, Rhs, Option>, MatrixXpr, StorageKind>::type Base;
 };
 
-template<typename Lhs, typename Rhs, int Option>
-class ProductImpl<Lhs,Rhs,Option,Dense>
-  : public internal::dense_product_base<Lhs,Rhs,Option>
-{
-    typedef Product<Lhs, Rhs, Option> Derived;
+template <typename Lhs, typename Rhs, int Option>
+class ProductImpl<Lhs, Rhs, Option, Dense> : public internal::dense_product_base<Lhs, Rhs, Option> {
+  typedef Product<Lhs, Rhs, Option> Derived;
 
-  public:
+ public:
+  typedef typename internal::dense_product_base<Lhs, Rhs, Option> Base;
+  EIGEN_DENSE_PUBLIC_INTERFACE(Derived)
+ protected:
+  enum {
+    IsOneByOne = (RowsAtCompileTime == 1 || RowsAtCompileTime == Dynamic) &&
+                 (ColsAtCompileTime == 1 || ColsAtCompileTime == Dynamic),
+    EnableCoeff = IsOneByOne || Option == LazyProduct
+  };
 
-    typedef typename internal::dense_product_base<Lhs, Rhs, Option> Base;
-    EIGEN_DENSE_PUBLIC_INTERFACE(Derived)
-  protected:
-    enum {
-      IsOneByOne = (RowsAtCompileTime == 1 || RowsAtCompileTime == Dynamic) &&
-                   (ColsAtCompileTime == 1 || ColsAtCompileTime == Dynamic),
-      EnableCoeff = IsOneByOne || Option==LazyProduct
-    };
+ public:
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar coeff(Index row, Index col) const {
+    EIGEN_STATIC_ASSERT(EnableCoeff, THIS_METHOD_IS_ONLY_FOR_INNER_OR_LAZY_PRODUCTS);
+    eigen_assert((Option == LazyProduct) || (this->rows() == 1 && this->cols() == 1));
 
-  public:
+    return internal::evaluator<Derived>(derived()).coeff(row, col);
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar coeff(Index row, Index col) const
-    {
-      EIGEN_STATIC_ASSERT(EnableCoeff, THIS_METHOD_IS_ONLY_FOR_INNER_OR_LAZY_PRODUCTS);
-      eigen_assert( (Option==LazyProduct) || (this->rows() == 1 && this->cols() == 1) );
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar coeff(Index i) const {
+    EIGEN_STATIC_ASSERT(EnableCoeff, THIS_METHOD_IS_ONLY_FOR_INNER_OR_LAZY_PRODUCTS);
+    eigen_assert((Option == LazyProduct) || (this->rows() == 1 && this->cols() == 1));
 
-      return internal::evaluator<Derived>(derived()).coeff(row,col);
-    }
-
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar coeff(Index i) const
-    {
-      EIGEN_STATIC_ASSERT(EnableCoeff, THIS_METHOD_IS_ONLY_FOR_INNER_OR_LAZY_PRODUCTS);
-      eigen_assert( (Option==LazyProduct) || (this->rows() == 1 && this->cols() == 1) );
-
-      return internal::evaluator<Derived>(derived()).coeff(i);
-    }
-
-
+    return internal::evaluator<Derived>(derived()).coeff(i);
+  }
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_PRODUCT_H
+#endif  // EIGEN_PRODUCT_H
diff --git a/Eigen/src/Core/ProductEvaluators.h b/Eigen/src/Core/ProductEvaluators.h
index 67b0434..19c2560 100644
--- a/Eigen/src/Core/ProductEvaluators.h
+++ b/Eigen/src/Core/ProductEvaluators.h
@@ -9,7 +9,6 @@
 // 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_PRODUCTEVALUATORS_H
 #define EIGEN_PRODUCTEVALUATORS_H
 
@@ -21,17 +20,15 @@
 namespace internal {
 
 /** \internal
-  * Evaluator of a product expression.
-  * Since products require special treatments to handle all possible cases,
-  * we simply defer the evaluation logic to a product_evaluator class
-  * which offers more partial specialization possibilities.
-  *
-  * \sa class product_evaluator
-  */
-template<typename Lhs, typename Rhs, int Options>
-struct evaluator<Product<Lhs, Rhs, Options> >
- : public product_evaluator<Product<Lhs, Rhs, Options> >
-{
+ * Evaluator of a product expression.
+ * Since products require special treatments to handle all possible cases,
+ * we simply defer the evaluation logic to a product_evaluator class
+ * which offers more partial specialization possibilities.
+ *
+ * \sa class product_evaluator
+ */
+template <typename Lhs, typename Rhs, int Options>
+struct evaluator<Product<Lhs, Rhs, Options>> : public product_evaluator<Product<Lhs, Rhs, Options>> {
   typedef Product<Lhs, Rhs, Options> XprType;
   typedef product_evaluator<XprType> Base;
 
@@ -40,94 +37,82 @@
 
 // Catch "scalar * ( A * B )" and transform it to "(A*scalar) * B"
 // TODO we should apply that rule only if that's really helpful
-template<typename Lhs, typename Rhs, typename Scalar1, typename Scalar2, typename Plain1>
-struct evaluator_assume_aliasing<CwiseBinaryOp<internal::scalar_product_op<Scalar1,Scalar2>,
+template <typename Lhs, typename Rhs, typename Scalar1, typename Scalar2, typename Plain1>
+struct evaluator_assume_aliasing<CwiseBinaryOp<internal::scalar_product_op<Scalar1, Scalar2>,
                                                const CwiseNullaryOp<internal::scalar_constant_op<Scalar1>, Plain1>,
-                                               const Product<Lhs, Rhs, DefaultProduct> > >
-{
+                                               const Product<Lhs, Rhs, DefaultProduct>>> {
   static const bool value = true;
 };
-template<typename Lhs, typename Rhs, typename Scalar1, typename Scalar2, typename Plain1>
-struct evaluator<CwiseBinaryOp<internal::scalar_product_op<Scalar1,Scalar2>,
+template <typename Lhs, typename Rhs, typename Scalar1, typename Scalar2, typename Plain1>
+struct evaluator<CwiseBinaryOp<internal::scalar_product_op<Scalar1, Scalar2>,
                                const CwiseNullaryOp<internal::scalar_constant_op<Scalar1>, Plain1>,
-                               const Product<Lhs, Rhs, DefaultProduct> > >
- : public evaluator<Product<EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(Scalar1,Lhs,product), Rhs, DefaultProduct> >
-{
-  typedef CwiseBinaryOp<internal::scalar_product_op<Scalar1,Scalar2>,
-                               const CwiseNullaryOp<internal::scalar_constant_op<Scalar1>, Plain1>,
-                               const Product<Lhs, Rhs, DefaultProduct> > XprType;
-  typedef evaluator<Product<EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(Scalar1,Lhs,product), Rhs, DefaultProduct> > Base;
+                               const Product<Lhs, Rhs, DefaultProduct>>>
+    : public evaluator<Product<EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(Scalar1, Lhs, product), Rhs, DefaultProduct>> {
+  typedef CwiseBinaryOp<internal::scalar_product_op<Scalar1, Scalar2>,
+                        const CwiseNullaryOp<internal::scalar_constant_op<Scalar1>, Plain1>,
+                        const Product<Lhs, Rhs, DefaultProduct>>
+      XprType;
+  typedef evaluator<Product<EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(Scalar1, Lhs, product), Rhs, DefaultProduct>> Base;
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit evaluator(const XprType& xpr)
-    : Base(xpr.lhs().functor().m_other * xpr.rhs().lhs() * xpr.rhs().rhs())
-  {}
+      : Base(xpr.lhs().functor().m_other * xpr.rhs().lhs() * xpr.rhs().rhs()) {}
 };
 
-
-template<typename Lhs, typename Rhs, int DiagIndex>
-struct evaluator<Diagonal<const Product<Lhs, Rhs, DefaultProduct>, DiagIndex> >
- : public evaluator<Diagonal<const Product<Lhs, Rhs, LazyProduct>, DiagIndex> >
-{
+template <typename Lhs, typename Rhs, int DiagIndex>
+struct evaluator<Diagonal<const Product<Lhs, Rhs, DefaultProduct>, DiagIndex>>
+    : public evaluator<Diagonal<const Product<Lhs, Rhs, LazyProduct>, DiagIndex>> {
   typedef Diagonal<const Product<Lhs, Rhs, DefaultProduct>, DiagIndex> XprType;
-  typedef evaluator<Diagonal<const Product<Lhs, Rhs, LazyProduct>, DiagIndex> > Base;
+  typedef evaluator<Diagonal<const Product<Lhs, Rhs, LazyProduct>, DiagIndex>> Base;
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit evaluator(const XprType& xpr)
-    : Base(Diagonal<const Product<Lhs, Rhs, LazyProduct>, DiagIndex>(
-        Product<Lhs, Rhs, LazyProduct>(xpr.nestedExpression().lhs(), xpr.nestedExpression().rhs()),
-        xpr.index() ))
-  {}
+      : Base(Diagonal<const Product<Lhs, Rhs, LazyProduct>, DiagIndex>(
+            Product<Lhs, Rhs, LazyProduct>(xpr.nestedExpression().lhs(), xpr.nestedExpression().rhs()), xpr.index())) {}
 };
 
-
 // Helper class to perform a matrix product with the destination at hand.
 // Depending on the sizes of the factors, there are different evaluation strategies
 // as controlled by internal::product_type.
-template< typename Lhs, typename Rhs,
-          typename LhsShape = typename evaluator_traits<Lhs>::Shape,
+template <typename Lhs, typename Rhs, typename LhsShape = typename evaluator_traits<Lhs>::Shape,
           typename RhsShape = typename evaluator_traits<Rhs>::Shape,
-          int ProductType = internal::product_type<Lhs,Rhs>::value>
+          int ProductType = internal::product_type<Lhs, Rhs>::value>
 struct generic_product_impl;
 
-template<typename Lhs, typename Rhs>
-struct evaluator_assume_aliasing<Product<Lhs, Rhs, DefaultProduct> > {
+template <typename Lhs, typename Rhs>
+struct evaluator_assume_aliasing<Product<Lhs, Rhs, DefaultProduct>> {
   static const bool value = true;
 };
 
 // This is the default evaluator implementation for products:
 // It creates a temporary and call generic_product_impl
-template<typename Lhs, typename Rhs, int Options, int ProductTag, typename LhsShape, typename RhsShape>
+template <typename Lhs, typename Rhs, int Options, int ProductTag, typename LhsShape, typename RhsShape>
 struct product_evaluator<Product<Lhs, Rhs, Options>, ProductTag, LhsShape, RhsShape>
-  : public evaluator<typename Product<Lhs, Rhs, Options>::PlainObject>
-{
+    : public evaluator<typename Product<Lhs, Rhs, Options>::PlainObject> {
   typedef Product<Lhs, Rhs, Options> XprType;
   typedef typename XprType::PlainObject PlainObject;
   typedef evaluator<PlainObject> Base;
-  enum {
-    Flags = Base::Flags | EvalBeforeNestingBit
-  };
+  enum { Flags = Base::Flags | EvalBeforeNestingBit };
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  explicit product_evaluator(const XprType& xpr)
-    : m_result(xpr.rows(), xpr.cols())
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit product_evaluator(const XprType& xpr)
+      : m_result(xpr.rows(), xpr.cols()) {
     internal::construct_at<Base>(this, m_result);
 
-// FIXME shall we handle nested_eval here?,
-// if so, then we must take care at removing the call to nested_eval in the specializations (e.g., in permutation_matrix_product, transposition_matrix_product, etc.)
-//     typedef typename internal::nested_eval<Lhs,Rhs::ColsAtCompileTime>::type LhsNested;
-//     typedef typename internal::nested_eval<Rhs,Lhs::RowsAtCompileTime>::type RhsNested;
-//     typedef internal::remove_all_t<LhsNested> LhsNestedCleaned;
-//     typedef internal::remove_all_t<RhsNested> RhsNestedCleaned;
-//
-//     const LhsNested lhs(xpr.lhs());
-//     const RhsNested rhs(xpr.rhs());
-//
-//     generic_product_impl<LhsNestedCleaned, RhsNestedCleaned>::evalTo(m_result, lhs, rhs);
+    // FIXME shall we handle nested_eval here?,
+    // if so, then we must take care at removing the call to nested_eval in the specializations (e.g., in
+    // permutation_matrix_product, transposition_matrix_product, etc.)
+    //     typedef typename internal::nested_eval<Lhs,Rhs::ColsAtCompileTime>::type LhsNested;
+    //     typedef typename internal::nested_eval<Rhs,Lhs::RowsAtCompileTime>::type RhsNested;
+    //     typedef internal::remove_all_t<LhsNested> LhsNestedCleaned;
+    //     typedef internal::remove_all_t<RhsNested> RhsNestedCleaned;
+    //
+    //     const LhsNested lhs(xpr.lhs());
+    //     const RhsNested rhs(xpr.rhs());
+    //
+    //     generic_product_impl<LhsNestedCleaned, RhsNestedCleaned>::evalTo(m_result, lhs, rhs);
 
     generic_product_impl<Lhs, Rhs, LhsShape, RhsShape, ProductTag>::evalTo(m_result, xpr.lhs(), xpr.rhs());
   }
 
-protected:
+ protected:
   PlainObject m_result;
 };
 
@@ -135,32 +120,27 @@
 // TODO: we could enable them for different scalar types when the product is not vectorized.
 
 // Dense = Product
-template< typename DstXprType, typename Lhs, typename Rhs, int Options, typename Scalar>
-struct Assignment<DstXprType, Product<Lhs,Rhs,Options>, internal::assign_op<Scalar,Scalar>, Dense2Dense,
-  std::enable_if_t<(Options==DefaultProduct || Options==AliasFreeProduct)>>
-{
-  typedef Product<Lhs,Rhs,Options> SrcXprType;
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<Scalar,Scalar> &)
-  {
+template <typename DstXprType, typename Lhs, typename Rhs, int Options, typename Scalar>
+struct Assignment<DstXprType, Product<Lhs, Rhs, Options>, internal::assign_op<Scalar, Scalar>, Dense2Dense,
+                  std::enable_if_t<(Options == DefaultProduct || Options == AliasFreeProduct)>> {
+  typedef Product<Lhs, Rhs, Options> SrcXprType;
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(DstXprType& dst, const SrcXprType& src,
+                                                        const internal::assign_op<Scalar, Scalar>&) {
     Index dstRows = src.rows();
     Index dstCols = src.cols();
-    if((dst.rows()!=dstRows) || (dst.cols()!=dstCols))
-      dst.resize(dstRows, dstCols);
+    if ((dst.rows() != dstRows) || (dst.cols() != dstCols)) dst.resize(dstRows, dstCols);
     // FIXME shall we handle nested_eval here?
     generic_product_impl<Lhs, Rhs>::evalTo(dst, src.lhs(), src.rhs());
   }
 };
 
 // Dense += Product
-template< typename DstXprType, typename Lhs, typename Rhs, int Options, typename Scalar>
-struct Assignment<DstXprType, Product<Lhs,Rhs,Options>, internal::add_assign_op<Scalar,Scalar>, Dense2Dense,
-  std::enable_if_t<(Options==DefaultProduct || Options==AliasFreeProduct)>>
-{
-  typedef Product<Lhs,Rhs,Options> SrcXprType;
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  void run(DstXprType &dst, const SrcXprType &src, const internal::add_assign_op<Scalar,Scalar> &)
-  {
+template <typename DstXprType, typename Lhs, typename Rhs, int Options, typename Scalar>
+struct Assignment<DstXprType, Product<Lhs, Rhs, Options>, internal::add_assign_op<Scalar, Scalar>, Dense2Dense,
+                  std::enable_if_t<(Options == DefaultProduct || Options == AliasFreeProduct)>> {
+  typedef Product<Lhs, Rhs, Options> SrcXprType;
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(DstXprType& dst, const SrcXprType& src,
+                                                        const internal::add_assign_op<Scalar, Scalar>&) {
     eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols());
     // FIXME shall we handle nested_eval here?
     generic_product_impl<Lhs, Rhs>::addTo(dst, src.lhs(), src.rhs());
@@ -168,35 +148,35 @@
 };
 
 // Dense -= Product
-template< typename DstXprType, typename Lhs, typename Rhs, int Options, typename Scalar>
-struct Assignment<DstXprType, Product<Lhs,Rhs,Options>, internal::sub_assign_op<Scalar,Scalar>, Dense2Dense,
-  std::enable_if_t<(Options==DefaultProduct || Options==AliasFreeProduct)>>
-{
-  typedef Product<Lhs,Rhs,Options> SrcXprType;
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  void run(DstXprType &dst, const SrcXprType &src, const internal::sub_assign_op<Scalar,Scalar> &)
-  {
+template <typename DstXprType, typename Lhs, typename Rhs, int Options, typename Scalar>
+struct Assignment<DstXprType, Product<Lhs, Rhs, Options>, internal::sub_assign_op<Scalar, Scalar>, Dense2Dense,
+                  std::enable_if_t<(Options == DefaultProduct || Options == AliasFreeProduct)>> {
+  typedef Product<Lhs, Rhs, Options> SrcXprType;
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(DstXprType& dst, const SrcXprType& src,
+                                                        const internal::sub_assign_op<Scalar, Scalar>&) {
     eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols());
     // FIXME shall we handle nested_eval here?
     generic_product_impl<Lhs, Rhs>::subTo(dst, src.lhs(), src.rhs());
   }
 };
 
-
 // Dense ?= scalar * Product
 // TODO we should apply that rule if that's really helpful
 // for instance, this is not good for inner products
-template< typename DstXprType, typename Lhs, typename Rhs, typename AssignFunc, typename Scalar, typename ScalarBis, typename Plain>
-struct Assignment<DstXprType, CwiseBinaryOp<internal::scalar_product_op<ScalarBis,Scalar>, const CwiseNullaryOp<internal::scalar_constant_op<ScalarBis>,Plain>,
-                                           const Product<Lhs,Rhs,DefaultProduct> >, AssignFunc, Dense2Dense>
-{
-  typedef CwiseBinaryOp<internal::scalar_product_op<ScalarBis,Scalar>,
-                        const CwiseNullaryOp<internal::scalar_constant_op<ScalarBis>,Plain>,
-                        const Product<Lhs,Rhs,DefaultProduct> > SrcXprType;
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  void run(DstXprType &dst, const SrcXprType &src, const AssignFunc& func)
-  {
-    call_assignment_no_alias(dst, (src.lhs().functor().m_other * src.rhs().lhs())*src.rhs().rhs(), func);
+template <typename DstXprType, typename Lhs, typename Rhs, typename AssignFunc, typename Scalar, typename ScalarBis,
+          typename Plain>
+struct Assignment<DstXprType,
+                  CwiseBinaryOp<internal::scalar_product_op<ScalarBis, Scalar>,
+                                const CwiseNullaryOp<internal::scalar_constant_op<ScalarBis>, Plain>,
+                                const Product<Lhs, Rhs, DefaultProduct>>,
+                  AssignFunc, Dense2Dense> {
+  typedef CwiseBinaryOp<internal::scalar_product_op<ScalarBis, Scalar>,
+                        const CwiseNullaryOp<internal::scalar_constant_op<ScalarBis>, Plain>,
+                        const Product<Lhs, Rhs, DefaultProduct>>
+      SrcXprType;
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(DstXprType& dst, const SrcXprType& src,
+                                                        const AssignFunc& func) {
+    call_assignment_no_alias(dst, (src.lhs().functor().m_other * src.rhs().lhs()) * src.rhs().rhs(), func);
   }
 };
 
@@ -204,219 +184,232 @@
 // Catch "Dense ?= xpr + Product<>" expression to save one temporary
 // FIXME we could probably enable these rules for any product, i.e., not only Dense and DefaultProduct
 
-template<typename OtherXpr, typename Lhs, typename Rhs>
-struct evaluator_assume_aliasing<CwiseBinaryOp<internal::scalar_sum_op<typename OtherXpr::Scalar,typename Product<Lhs,Rhs,DefaultProduct>::Scalar>, const OtherXpr,
-                                               const Product<Lhs,Rhs,DefaultProduct> >, DenseShape > {
+template <typename OtherXpr, typename Lhs, typename Rhs>
+struct evaluator_assume_aliasing<
+    CwiseBinaryOp<
+        internal::scalar_sum_op<typename OtherXpr::Scalar, typename Product<Lhs, Rhs, DefaultProduct>::Scalar>,
+        const OtherXpr, const Product<Lhs, Rhs, DefaultProduct>>,
+    DenseShape> {
   static const bool value = true;
 };
 
-template<typename OtherXpr, typename Lhs, typename Rhs>
-struct evaluator_assume_aliasing<CwiseBinaryOp<internal::scalar_difference_op<typename OtherXpr::Scalar,typename Product<Lhs,Rhs,DefaultProduct>::Scalar>, const OtherXpr,
-                                               const Product<Lhs,Rhs,DefaultProduct> >, DenseShape > {
+template <typename OtherXpr, typename Lhs, typename Rhs>
+struct evaluator_assume_aliasing<
+    CwiseBinaryOp<
+        internal::scalar_difference_op<typename OtherXpr::Scalar, typename Product<Lhs, Rhs, DefaultProduct>::Scalar>,
+        const OtherXpr, const Product<Lhs, Rhs, DefaultProduct>>,
+    DenseShape> {
   static const bool value = true;
 };
 
-template<typename DstXprType, typename OtherXpr, typename ProductType, typename Func1, typename Func2>
-struct assignment_from_xpr_op_product
-{
-  template<typename SrcXprType, typename InitialFunc>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  void run(DstXprType &dst, const SrcXprType &src, const InitialFunc& /*func*/)
-  {
+template <typename DstXprType, typename OtherXpr, typename ProductType, typename Func1, typename Func2>
+struct assignment_from_xpr_op_product {
+  template <typename SrcXprType, typename InitialFunc>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(DstXprType& dst, const SrcXprType& src,
+                                                        const InitialFunc& /*func*/) {
     call_assignment_no_alias(dst, src.lhs(), Func1());
     call_assignment_no_alias(dst, src.rhs(), Func2());
   }
 };
 
-#define EIGEN_CATCH_ASSIGN_XPR_OP_PRODUCT(ASSIGN_OP,BINOP,ASSIGN_OP2) \
-  template< typename DstXprType, typename OtherXpr, typename Lhs, typename Rhs, typename DstScalar, typename SrcScalar, typename OtherScalar,typename ProdScalar> \
-  struct Assignment<DstXprType, CwiseBinaryOp<internal::BINOP<OtherScalar,ProdScalar>, const OtherXpr, \
-                                            const Product<Lhs,Rhs,DefaultProduct> >, internal::ASSIGN_OP<DstScalar,SrcScalar>, Dense2Dense> \
-    : assignment_from_xpr_op_product<DstXprType, OtherXpr, Product<Lhs,Rhs,DefaultProduct>, internal::ASSIGN_OP<DstScalar,OtherScalar>, internal::ASSIGN_OP2<DstScalar,ProdScalar> > \
-  {}
+#define EIGEN_CATCH_ASSIGN_XPR_OP_PRODUCT(ASSIGN_OP, BINOP, ASSIGN_OP2)                             \
+  template <typename DstXprType, typename OtherXpr, typename Lhs, typename Rhs, typename DstScalar, \
+            typename SrcScalar, typename OtherScalar, typename ProdScalar>                          \
+  struct Assignment<DstXprType,                                                                     \
+                    CwiseBinaryOp<internal::BINOP<OtherScalar, ProdScalar>, const OtherXpr,         \
+                                  const Product<Lhs, Rhs, DefaultProduct>>,                         \
+                    internal::ASSIGN_OP<DstScalar, SrcScalar>, Dense2Dense>                         \
+      : assignment_from_xpr_op_product<DstXprType, OtherXpr, Product<Lhs, Rhs, DefaultProduct>,     \
+                                       internal::ASSIGN_OP<DstScalar, OtherScalar>,                 \
+                                       internal::ASSIGN_OP2<DstScalar, ProdScalar>> {}
 
-EIGEN_CATCH_ASSIGN_XPR_OP_PRODUCT(assign_op,    scalar_sum_op,add_assign_op);
-EIGEN_CATCH_ASSIGN_XPR_OP_PRODUCT(add_assign_op,scalar_sum_op,add_assign_op);
-EIGEN_CATCH_ASSIGN_XPR_OP_PRODUCT(sub_assign_op,scalar_sum_op,sub_assign_op);
+EIGEN_CATCH_ASSIGN_XPR_OP_PRODUCT(assign_op, scalar_sum_op, add_assign_op);
+EIGEN_CATCH_ASSIGN_XPR_OP_PRODUCT(add_assign_op, scalar_sum_op, add_assign_op);
+EIGEN_CATCH_ASSIGN_XPR_OP_PRODUCT(sub_assign_op, scalar_sum_op, sub_assign_op);
 
-EIGEN_CATCH_ASSIGN_XPR_OP_PRODUCT(assign_op,    scalar_difference_op,sub_assign_op);
-EIGEN_CATCH_ASSIGN_XPR_OP_PRODUCT(add_assign_op,scalar_difference_op,sub_assign_op);
-EIGEN_CATCH_ASSIGN_XPR_OP_PRODUCT(sub_assign_op,scalar_difference_op,add_assign_op);
+EIGEN_CATCH_ASSIGN_XPR_OP_PRODUCT(assign_op, scalar_difference_op, sub_assign_op);
+EIGEN_CATCH_ASSIGN_XPR_OP_PRODUCT(add_assign_op, scalar_difference_op, sub_assign_op);
+EIGEN_CATCH_ASSIGN_XPR_OP_PRODUCT(sub_assign_op, scalar_difference_op, add_assign_op);
 
 //----------------------------------------
 
-template<typename Lhs, typename Rhs>
-struct generic_product_impl<Lhs,Rhs,DenseShape,DenseShape,InnerProduct>
-{
-  template<typename Dst>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
-  {
-    dst.coeffRef(0,0) = (lhs.transpose().cwiseProduct(rhs)).sum();
+template <typename Lhs, typename Rhs>
+struct generic_product_impl<Lhs, Rhs, DenseShape, DenseShape, InnerProduct> {
+  template <typename Dst>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) {
+    dst.coeffRef(0, 0) = (lhs.transpose().cwiseProduct(rhs)).sum();
   }
 
-  template<typename Dst>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void addTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
-  {
-    dst.coeffRef(0,0) += (lhs.transpose().cwiseProduct(rhs)).sum();
+  template <typename Dst>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void addTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) {
+    dst.coeffRef(0, 0) += (lhs.transpose().cwiseProduct(rhs)).sum();
   }
 
-  template<typename Dst>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void subTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
-  { dst.coeffRef(0,0) -= (lhs.transpose().cwiseProduct(rhs)).sum(); }
+  template <typename Dst>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void subTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) {
+    dst.coeffRef(0, 0) -= (lhs.transpose().cwiseProduct(rhs)).sum();
+  }
 };
 
-
 /***********************************************************************
-*  Implementation of outer dense * dense vector product
-***********************************************************************/
+ *  Implementation of outer dense * dense vector product
+ ***********************************************************************/
 
 // Column major result
-template<typename Dst, typename Lhs, typename Rhs, typename Func>
-void EIGEN_DEVICE_FUNC outer_product_selector_run(Dst& dst, const Lhs &lhs, const Rhs &rhs, const Func& func, const false_type&)
-{
+template <typename Dst, typename Lhs, typename Rhs, typename Func>
+void EIGEN_DEVICE_FUNC outer_product_selector_run(Dst& dst, const Lhs& lhs, const Rhs& rhs, const Func& func,
+                                                  const false_type&) {
   evaluator<Rhs> rhsEval(rhs);
-  ei_declare_local_nested_eval(Lhs,lhs,Rhs::SizeAtCompileTime,actual_lhs);
+  ei_declare_local_nested_eval(Lhs, lhs, Rhs::SizeAtCompileTime, actual_lhs);
   // FIXME if cols is large enough, then it might be useful to make sure that lhs is sequentially stored
   // FIXME not very good if rhs is real and lhs complex while alpha is real too
   const Index cols = dst.cols();
-  for (Index j=0; j<cols; ++j)
-    func(dst.col(j), rhsEval.coeff(Index(0),j) * actual_lhs);
+  for (Index j = 0; j < cols; ++j) func(dst.col(j), rhsEval.coeff(Index(0), j) * actual_lhs);
 }
 
 // Row major result
-template<typename Dst, typename Lhs, typename Rhs, typename Func>
-void EIGEN_DEVICE_FUNC outer_product_selector_run(Dst& dst, const Lhs &lhs, const Rhs &rhs, const Func& func, const true_type&)
-{
+template <typename Dst, typename Lhs, typename Rhs, typename Func>
+void EIGEN_DEVICE_FUNC outer_product_selector_run(Dst& dst, const Lhs& lhs, const Rhs& rhs, const Func& func,
+                                                  const true_type&) {
   evaluator<Lhs> lhsEval(lhs);
-  ei_declare_local_nested_eval(Rhs,rhs,Lhs::SizeAtCompileTime,actual_rhs);
+  ei_declare_local_nested_eval(Rhs, rhs, Lhs::SizeAtCompileTime, actual_rhs);
   // FIXME if rows is large enough, then it might be useful to make sure that rhs is sequentially stored
   // FIXME not very good if lhs is real and rhs complex while alpha is real too
   const Index rows = dst.rows();
-  for (Index i=0; i<rows; ++i)
-    func(dst.row(i), lhsEval.coeff(i,Index(0)) * actual_rhs);
+  for (Index i = 0; i < rows; ++i) func(dst.row(i), lhsEval.coeff(i, Index(0)) * actual_rhs);
 }
 
-template<typename Lhs, typename Rhs>
-struct generic_product_impl<Lhs,Rhs,DenseShape,DenseShape,OuterProduct>
-{
-  template<typename T> struct is_row_major : std::conditional_t<(int(T::Flags)&RowMajorBit), internal::true_type, internal::false_type> {};
-  typedef typename Product<Lhs,Rhs>::Scalar Scalar;
+template <typename Lhs, typename Rhs>
+struct generic_product_impl<Lhs, Rhs, DenseShape, DenseShape, OuterProduct> {
+  template <typename T>
+  struct is_row_major : std::conditional_t<(int(T::Flags) & RowMajorBit), internal::true_type, internal::false_type> {};
+  typedef typename Product<Lhs, Rhs>::Scalar Scalar;
 
   // TODO it would be nice to be able to exploit our *_assign_op functors for that purpose
-  struct set  { template<typename Dst, typename Src> EIGEN_DEVICE_FUNC void operator()(const Dst& dst, const Src& src) const { dst.const_cast_derived()  = src; } };
-  struct add  { template<typename Dst, typename Src> EIGEN_DEVICE_FUNC void operator()(const Dst& dst, const Src& src) const { dst.const_cast_derived() += src; } };
-  struct sub  { template<typename Dst, typename Src> EIGEN_DEVICE_FUNC void operator()(const Dst& dst, const Src& src) const { dst.const_cast_derived() -= src; } };
+  struct set {
+    template <typename Dst, typename Src>
+    EIGEN_DEVICE_FUNC void operator()(const Dst& dst, const Src& src) const {
+      dst.const_cast_derived() = src;
+    }
+  };
+  struct add {
+    template <typename Dst, typename Src>
+    EIGEN_DEVICE_FUNC void operator()(const Dst& dst, const Src& src) const {
+      dst.const_cast_derived() += src;
+    }
+  };
+  struct sub {
+    template <typename Dst, typename Src>
+    EIGEN_DEVICE_FUNC void operator()(const Dst& dst, const Src& src) const {
+      dst.const_cast_derived() -= src;
+    }
+  };
   struct adds {
     Scalar m_scale;
     explicit adds(const Scalar& s) : m_scale(s) {}
-    template<typename Dst, typename Src> void EIGEN_DEVICE_FUNC operator()(const Dst& dst, const Src& src) const {
+    template <typename Dst, typename Src>
+    void EIGEN_DEVICE_FUNC operator()(const Dst& dst, const Src& src) const {
       dst.const_cast_derived() += m_scale * src;
     }
   };
 
-  template<typename Dst>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
-  {
+  template <typename Dst>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) {
     internal::outer_product_selector_run(dst, lhs, rhs, set(), is_row_major<Dst>());
   }
 
-  template<typename Dst>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void addTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
-  {
+  template <typename Dst>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void addTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) {
     internal::outer_product_selector_run(dst, lhs, rhs, add(), is_row_major<Dst>());
   }
 
-  template<typename Dst>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void subTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
-  {
+  template <typename Dst>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void subTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) {
     internal::outer_product_selector_run(dst, lhs, rhs, sub(), is_row_major<Dst>());
   }
 
-  template<typename Dst>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void scaleAndAddTo(Dst& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha)
-  {
+  template <typename Dst>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void scaleAndAddTo(Dst& dst, const Lhs& lhs, const Rhs& rhs,
+                                                                  const Scalar& alpha) {
     internal::outer_product_selector_run(dst, lhs, rhs, adds(alpha), is_row_major<Dst>());
   }
-
 };
 
-
 // This base class provides default implementations for evalTo, addTo, subTo, in terms of scaleAndAddTo
-template<typename Lhs, typename Rhs, typename Derived>
-struct generic_product_impl_base
-{
-  typedef typename Product<Lhs,Rhs>::Scalar Scalar;
+template <typename Lhs, typename Rhs, typename Derived>
+struct generic_product_impl_base {
+  typedef typename Product<Lhs, Rhs>::Scalar Scalar;
 
-  template<typename Dst>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
-  { dst.setZero(); scaleAndAddTo(dst, lhs, rhs, Scalar(1)); }
+  template <typename Dst>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) {
+    dst.setZero();
+    scaleAndAddTo(dst, lhs, rhs, Scalar(1));
+  }
 
-  template<typename Dst>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void addTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
-  { scaleAndAddTo(dst,lhs, rhs, Scalar(1)); }
+  template <typename Dst>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void addTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) {
+    scaleAndAddTo(dst, lhs, rhs, Scalar(1));
+  }
 
-  template<typename Dst>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void subTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
-  { scaleAndAddTo(dst, lhs, rhs, Scalar(-1)); }
+  template <typename Dst>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void subTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) {
+    scaleAndAddTo(dst, lhs, rhs, Scalar(-1));
+  }
 
-  template<typename Dst>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void scaleAndAddTo(Dst& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha)
-  { Derived::scaleAndAddTo(dst,lhs,rhs,alpha); }
-
+  template <typename Dst>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void scaleAndAddTo(Dst& dst, const Lhs& lhs, const Rhs& rhs,
+                                                                  const Scalar& alpha) {
+    Derived::scaleAndAddTo(dst, lhs, rhs, alpha);
+  }
 };
 
-template<typename Lhs, typename Rhs>
-struct generic_product_impl<Lhs,Rhs,DenseShape,DenseShape,GemvProduct>
-  : generic_product_impl_base<Lhs,Rhs,generic_product_impl<Lhs,Rhs,DenseShape,DenseShape,GemvProduct> >
-{
-  typedef typename nested_eval<Lhs,1>::type LhsNested;
-  typedef typename nested_eval<Rhs,1>::type RhsNested;
-  typedef typename Product<Lhs,Rhs>::Scalar Scalar;
+template <typename Lhs, typename Rhs>
+struct generic_product_impl<Lhs, Rhs, DenseShape, DenseShape, GemvProduct>
+    : generic_product_impl_base<Lhs, Rhs, generic_product_impl<Lhs, Rhs, DenseShape, DenseShape, GemvProduct>> {
+  typedef typename nested_eval<Lhs, 1>::type LhsNested;
+  typedef typename nested_eval<Rhs, 1>::type RhsNested;
+  typedef typename Product<Lhs, Rhs>::Scalar Scalar;
   enum { Side = Lhs::IsVectorAtCompileTime ? OnTheLeft : OnTheRight };
-  typedef internal::remove_all_t<std::conditional_t<int(Side)==OnTheRight,LhsNested,RhsNested>> MatrixType;
+  typedef internal::remove_all_t<std::conditional_t<int(Side) == OnTheRight, LhsNested, RhsNested>> MatrixType;
 
-  template<typename Dest>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void scaleAndAddTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha)
-  {
+  template <typename Dest>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void scaleAndAddTo(Dest& dst, const Lhs& lhs, const Rhs& rhs,
+                                                                  const Scalar& alpha) {
     // Fallback to inner product if both the lhs and rhs is a runtime vector.
     if (lhs.rows() == 1 && rhs.cols() == 1) {
-      dst.coeffRef(0,0) += alpha * lhs.row(0).conjugate().dot(rhs.col(0));
+      dst.coeffRef(0, 0) += alpha * lhs.row(0).conjugate().dot(rhs.col(0));
       return;
     }
     LhsNested actual_lhs(lhs);
     RhsNested actual_rhs(rhs);
-    internal::gemv_dense_selector<Side,
-                            (int(MatrixType::Flags)&RowMajorBit) ? RowMajor : ColMajor,
-                            bool(internal::blas_traits<MatrixType>::HasUsableDirectAccess)
-                           >::run(actual_lhs, actual_rhs, dst, alpha);
+    internal::gemv_dense_selector<Side, (int(MatrixType::Flags) & RowMajorBit) ? RowMajor : ColMajor,
+                                  bool(internal::blas_traits<MatrixType>::HasUsableDirectAccess)>::run(actual_lhs,
+                                                                                                       actual_rhs, dst,
+                                                                                                       alpha);
   }
 };
 
-template<typename Lhs, typename Rhs>
-struct generic_product_impl<Lhs,Rhs,DenseShape,DenseShape,CoeffBasedProductMode>
-{
-  typedef typename Product<Lhs,Rhs>::Scalar Scalar;
+template <typename Lhs, typename Rhs>
+struct generic_product_impl<Lhs, Rhs, DenseShape, DenseShape, CoeffBasedProductMode> {
+  typedef typename Product<Lhs, Rhs>::Scalar Scalar;
 
-  template<typename Dst>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
-  {
+  template <typename Dst>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) {
     // Same as: dst.noalias() = lhs.lazyProduct(rhs);
     // but easier on the compiler side
-    call_assignment_no_alias(dst, lhs.lazyProduct(rhs), internal::assign_op<typename Dst::Scalar,Scalar>());
+    call_assignment_no_alias(dst, lhs.lazyProduct(rhs), internal::assign_op<typename Dst::Scalar, Scalar>());
   }
 
-  template<typename Dst>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void addTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
-  {
+  template <typename Dst>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void addTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) {
     // dst.noalias() += lhs.lazyProduct(rhs);
-    call_assignment_no_alias(dst, lhs.lazyProduct(rhs), internal::add_assign_op<typename Dst::Scalar,Scalar>());
+    call_assignment_no_alias(dst, lhs.lazyProduct(rhs), internal::add_assign_op<typename Dst::Scalar, Scalar>());
   }
 
-  template<typename Dst>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void subTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
-  {
+  template <typename Dst>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void subTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) {
     // dst.noalias() -= lhs.lazyProduct(rhs);
-    call_assignment_no_alias(dst, lhs.lazyProduct(rhs), internal::sub_assign_op<typename Dst::Scalar,Scalar>());
+    call_assignment_no_alias(dst, lhs.lazyProduct(rhs), internal::sub_assign_op<typename Dst::Scalar, Scalar>());
   }
 
   // This is a special evaluation path called from generic_product_impl<...,GemmProduct> in file GeneralMatrixMatrix.h
@@ -430,13 +423,12 @@
   //  3 - it makes this fallback consistent with the heavy GEMM routine.
   //  4 - it fully by-passes huge stack allocation attempts when multiplying huge fixed-size matrices.
   //      (see https://stackoverflow.com/questions/54738495)
-  // For small fixed sizes matrices, however, the gains are less obvious, it is sometimes x2 faster, but sometimes x3 slower,
-  // and the behavior depends also a lot on the compiler... This is why this re-writing strategy is currently
+  // For small fixed sizes matrices, however, the gains are less obvious, it is sometimes x2 faster, but sometimes x3
+  // slower, and the behavior depends also a lot on the compiler... This is why this re-writing strategy is currently
   // enabled only when falling back from the main GEMM.
-  template<typename Dst, typename Func>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  void eval_dynamic(Dst& dst, const Lhs& lhs, const Rhs& rhs, const Func &func)
-  {
+  template <typename Dst, typename Func>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void eval_dynamic(Dst& dst, const Lhs& lhs, const Rhs& rhs,
+                                                                 const Func& func) {
     enum {
       HasScalarFactor = blas_traits<Lhs>::HasScalarFactor || blas_traits<Rhs>::HasScalarFactor,
       ConjLhs = blas_traits<Lhs>::NeedToConjugate,
@@ -446,37 +438,32 @@
     //        this is important for real*complex_mat
     Scalar actualAlpha = combine_scalar_factors<Scalar>(lhs, rhs);
 
-    eval_dynamic_impl(dst,
-                      blas_traits<Lhs>::extract(lhs).template conjugateIf<ConjLhs>(),
-                      blas_traits<Rhs>::extract(rhs).template conjugateIf<ConjRhs>(),
-                      func,
-                      actualAlpha,
-                      std::conditional_t<HasScalarFactor,true_type,false_type>());
+    eval_dynamic_impl(dst, blas_traits<Lhs>::extract(lhs).template conjugateIf<ConjLhs>(),
+                      blas_traits<Rhs>::extract(rhs).template conjugateIf<ConjRhs>(), func, actualAlpha,
+                      std::conditional_t<HasScalarFactor, true_type, false_type>());
   }
 
-protected:
-
-  template<typename Dst, typename LhsT, typename RhsT, typename Func, typename Scalar>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  void eval_dynamic_impl(Dst& dst, const LhsT& lhs, const RhsT& rhs, const Func &func, const Scalar&  s /* == 1 */, false_type)
-  {
+ protected:
+  template <typename Dst, typename LhsT, typename RhsT, typename Func, typename Scalar>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void eval_dynamic_impl(Dst& dst, const LhsT& lhs, const RhsT& rhs,
+                                                                      const Func& func, const Scalar& s /* == 1 */,
+                                                                      false_type) {
     EIGEN_UNUSED_VARIABLE(s);
     eigen_internal_assert(numext::is_exactly_one(s));
     call_restricted_packet_assignment_no_alias(dst, lhs.lazyProduct(rhs), func);
   }
 
-  template<typename Dst, typename LhsT, typename RhsT, typename Func, typename Scalar>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  void eval_dynamic_impl(Dst& dst, const LhsT& lhs, const RhsT& rhs, const Func &func, const Scalar& s, true_type)
-  {
+  template <typename Dst, typename LhsT, typename RhsT, typename Func, typename Scalar>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void eval_dynamic_impl(Dst& dst, const LhsT& lhs, const RhsT& rhs,
+                                                                      const Func& func, const Scalar& s, true_type) {
     call_restricted_packet_assignment_no_alias(dst, s * lhs.lazyProduct(rhs), func);
   }
 };
 
 // This specialization enforces the use of a coefficient-based evaluation strategy
-template<typename Lhs, typename Rhs>
-struct generic_product_impl<Lhs,Rhs,DenseShape,DenseShape,LazyCoeffBasedProductMode>
-  : generic_product_impl<Lhs,Rhs,DenseShape,DenseShape,CoeffBasedProductMode> {};
+template <typename Lhs, typename Rhs>
+struct generic_product_impl<Lhs, Rhs, DenseShape, DenseShape, LazyCoeffBasedProductMode>
+    : generic_product_impl<Lhs, Rhs, DenseShape, DenseShape, CoeffBasedProductMode> {};
 
 // Case 2: Evaluate coeff by coeff
 //
@@ -484,29 +471,27 @@
 // The main difference is that we add an extra argument to the etor_product_*_impl::run() function
 // for the inner dimension of the product, because evaluator object do not know their size.
 
-template<int Traversal, int UnrollingIndex, typename Lhs, typename Rhs, typename RetScalar>
+template <int Traversal, int UnrollingIndex, typename Lhs, typename Rhs, typename RetScalar>
 struct etor_product_coeff_impl;
 
-template<int StorageOrder, int UnrollingIndex, typename Lhs, typename Rhs, typename Packet, int LoadMode>
+template <int StorageOrder, int UnrollingIndex, typename Lhs, typename Rhs, typename Packet, int LoadMode>
 struct etor_product_packet_impl;
 
-template<typename Lhs, typename Rhs, int ProductTag>
+template <typename Lhs, typename Rhs, int ProductTag>
 struct product_evaluator<Product<Lhs, Rhs, LazyProduct>, ProductTag, DenseShape, DenseShape>
-    : evaluator_base<Product<Lhs, Rhs, LazyProduct> >
-{
+    : evaluator_base<Product<Lhs, Rhs, LazyProduct>> {
   typedef Product<Lhs, Rhs, LazyProduct> XprType;
   typedef typename XprType::Scalar Scalar;
   typedef typename XprType::CoeffReturnType CoeffReturnType;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  explicit product_evaluator(const XprType& xpr)
-    : m_lhs(xpr.lhs()),
-      m_rhs(xpr.rhs()),
-      m_lhsImpl(m_lhs),     // FIXME the creation of the evaluator objects should result in a no-op, but check that!
-      m_rhsImpl(m_rhs),     //       Moreover, they are only useful for the packet path, so we could completely disable them when not needed,
-                            //       or perhaps declare them on the fly on the packet method... We have experiment to check what's best.
-      m_innerDim(xpr.lhs().cols())
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit product_evaluator(const XprType& xpr)
+      : m_lhs(xpr.lhs()),
+        m_rhs(xpr.rhs()),
+        m_lhsImpl(m_lhs),  // FIXME the creation of the evaluator objects should result in a no-op, but check that!
+        m_rhsImpl(m_rhs),  //       Moreover, they are only useful for the packet path, so we could completely disable
+                           //       them when not needed, or perhaps declare them on the fly on the packet method... We
+                           //       have experiment to check what's best.
+        m_innerDim(xpr.lhs().cols()) {
     EIGEN_INTERNAL_CHECK_COST_VALUE(NumTraits<Scalar>::MulCost);
     EIGEN_INTERNAL_CHECK_COST_VALUE(NumTraits<Scalar>::AddCost);
     EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
@@ -526,8 +511,8 @@
 
   // Everything below here is taken from CoeffBasedProduct.h
 
-  typedef typename internal::nested_eval<Lhs,Rhs::ColsAtCompileTime>::type LhsNested;
-  typedef typename internal::nested_eval<Rhs,Lhs::RowsAtCompileTime>::type RhsNested;
+  typedef typename internal::nested_eval<Lhs, Rhs::ColsAtCompileTime>::type LhsNested;
+  typedef typename internal::nested_eval<Rhs, Lhs::RowsAtCompileTime>::type RhsNested;
 
   typedef internal::remove_all_t<LhsNested> LhsNestedCleaned;
   typedef internal::remove_all_t<RhsNested> RhsNestedCleaned;
@@ -543,17 +528,18 @@
     MaxColsAtCompileTime = RhsNestedCleaned::MaxColsAtCompileTime
   };
 
-  typedef typename find_best_packet<Scalar,RowsAtCompileTime>::type LhsVecPacketType;
-  typedef typename find_best_packet<Scalar,ColsAtCompileTime>::type RhsVecPacketType;
+  typedef typename find_best_packet<Scalar, RowsAtCompileTime>::type LhsVecPacketType;
+  typedef typename find_best_packet<Scalar, ColsAtCompileTime>::type RhsVecPacketType;
 
   enum {
 
     LhsCoeffReadCost = LhsEtorType::CoeffReadCost,
     RhsCoeffReadCost = RhsEtorType::CoeffReadCost,
-    CoeffReadCost = InnerSize==0 ? NumTraits<Scalar>::ReadCost
-                  : InnerSize == Dynamic ? HugeCost
-                    : InnerSize * (NumTraits<Scalar>::MulCost + int(LhsCoeffReadCost) + int(RhsCoeffReadCost))
-                    + (InnerSize - 1) * NumTraits<Scalar>::AddCost,
+    CoeffReadCost = InnerSize == 0 ? NumTraits<Scalar>::ReadCost
+                    : InnerSize == Dynamic
+                        ? HugeCost
+                        : InnerSize * (NumTraits<Scalar>::MulCost + int(LhsCoeffReadCost) + int(RhsCoeffReadCost)) +
+                              (InnerSize - 1) * NumTraits<Scalar>::AddCost,
 
     Unroll = CoeffReadCost <= EIGEN_UNROLLING_LIMIT,
 
@@ -567,82 +553,84 @@
     RhsVecPacketSize = unpacket_traits<RhsVecPacketType>::size,
 
     // Here, we don't care about alignment larger than the usable packet size.
-    LhsAlignment = plain_enum_min(LhsEtorType::Alignment, LhsVecPacketSize*int(sizeof(typename LhsNestedCleaned::Scalar))),
-    RhsAlignment = plain_enum_min(RhsEtorType::Alignment, RhsVecPacketSize*int(sizeof(typename RhsNestedCleaned::Scalar))),
+    LhsAlignment =
+        plain_enum_min(LhsEtorType::Alignment, LhsVecPacketSize* int(sizeof(typename LhsNestedCleaned::Scalar))),
+    RhsAlignment =
+        plain_enum_min(RhsEtorType::Alignment, RhsVecPacketSize* int(sizeof(typename RhsNestedCleaned::Scalar))),
 
-    SameType = is_same<typename LhsNestedCleaned::Scalar,typename RhsNestedCleaned::Scalar>::value,
+    SameType = is_same<typename LhsNestedCleaned::Scalar, typename RhsNestedCleaned::Scalar>::value,
 
-    CanVectorizeRhs = bool(RhsRowMajor) && (RhsFlags & PacketAccessBit) && (ColsAtCompileTime!=1),
-    CanVectorizeLhs = (!LhsRowMajor) && (LhsFlags & PacketAccessBit) && (RowsAtCompileTime!=1),
+    CanVectorizeRhs = bool(RhsRowMajor) && (RhsFlags & PacketAccessBit) && (ColsAtCompileTime != 1),
+    CanVectorizeLhs = (!LhsRowMajor) && (LhsFlags & PacketAccessBit) && (RowsAtCompileTime != 1),
 
-    EvalToRowMajor = (MaxRowsAtCompileTime==1&&MaxColsAtCompileTime!=1) ? 1
-                    : (MaxColsAtCompileTime==1&&MaxRowsAtCompileTime!=1) ? 0
-                    : (bool(RhsRowMajor) && !CanVectorizeLhs),
+    EvalToRowMajor = (MaxRowsAtCompileTime == 1 && MaxColsAtCompileTime != 1) ? 1
+                     : (MaxColsAtCompileTime == 1 && MaxRowsAtCompileTime != 1)
+                         ? 0
+                         : (bool(RhsRowMajor) && !CanVectorizeLhs),
 
-    Flags = ((int(LhsFlags) | int(RhsFlags)) & HereditaryBits & ~RowMajorBit)
-          | (EvalToRowMajor ? RowMajorBit : 0)
-          // TODO enable vectorization for mixed types
-          | (SameType && (CanVectorizeLhs || CanVectorizeRhs) ? PacketAccessBit : 0)
-          | (XprType::IsVectorAtCompileTime ? LinearAccessBit : 0),
+    Flags = ((int(LhsFlags) | int(RhsFlags)) & HereditaryBits & ~RowMajorBit) |
+            (EvalToRowMajor ? RowMajorBit : 0)
+            // TODO enable vectorization for mixed types
+            | (SameType && (CanVectorizeLhs || CanVectorizeRhs) ? PacketAccessBit : 0) |
+            (XprType::IsVectorAtCompileTime ? LinearAccessBit : 0),
 
-    LhsOuterStrideBytes = int(LhsNestedCleaned::OuterStrideAtCompileTime) * int(sizeof(typename LhsNestedCleaned::Scalar)),
-    RhsOuterStrideBytes = int(RhsNestedCleaned::OuterStrideAtCompileTime) * int(sizeof(typename RhsNestedCleaned::Scalar)),
+    LhsOuterStrideBytes =
+        int(LhsNestedCleaned::OuterStrideAtCompileTime) * int(sizeof(typename LhsNestedCleaned::Scalar)),
+    RhsOuterStrideBytes =
+        int(RhsNestedCleaned::OuterStrideAtCompileTime) * int(sizeof(typename RhsNestedCleaned::Scalar)),
 
-    Alignment = bool(CanVectorizeLhs) ? (LhsOuterStrideBytes<=0 || (int(LhsOuterStrideBytes) % plain_enum_max(1, LhsAlignment))!=0 ? 0 : LhsAlignment)
-              : bool(CanVectorizeRhs) ? (RhsOuterStrideBytes<=0 || (int(RhsOuterStrideBytes) % plain_enum_max(1, RhsAlignment))!=0 ? 0 : RhsAlignment)
-              : 0,
+    Alignment = bool(CanVectorizeLhs)
+                    ? (LhsOuterStrideBytes <= 0 || (int(LhsOuterStrideBytes) % plain_enum_max(1, LhsAlignment)) != 0
+                           ? 0
+                           : LhsAlignment)
+                : bool(CanVectorizeRhs)
+                    ? (RhsOuterStrideBytes <= 0 || (int(RhsOuterStrideBytes) % plain_enum_max(1, RhsAlignment)) != 0
+                           ? 0
+                           : RhsAlignment)
+                    : 0,
 
     /* CanVectorizeInner deserves special explanation. It does not affect the product flags. It is not used outside
      * of Product. If the Product itself is not a packet-access expression, there is still a chance that the inner
      * loop of the product might be vectorized. This is the meaning of CanVectorizeInner. Since it doesn't affect
      * the Flags, it is safe to make this value depend on ActualPacketAccessBit, that doesn't affect the ABI.
      */
-    CanVectorizeInner =    SameType
-                        && LhsRowMajor
-                        && (!RhsRowMajor)
-                        && (int(LhsFlags) & int(RhsFlags) & ActualPacketAccessBit)
-                        && (int(InnerSize) % packet_traits<Scalar>::size == 0)
+    CanVectorizeInner = SameType && LhsRowMajor && (!RhsRowMajor) &&
+                        (int(LhsFlags) & int(RhsFlags) & ActualPacketAccessBit) &&
+                        (int(InnerSize) % packet_traits<Scalar>::size == 0)
   };
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CoeffReturnType coeff(Index row, Index col) const
-  {
-    return (m_lhs.row(row).transpose().cwiseProduct( m_rhs.col(col) )).sum();
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CoeffReturnType coeff(Index row, Index col) const {
+    return (m_lhs.row(row).transpose().cwiseProduct(m_rhs.col(col))).sum();
   }
 
   /* Allow index-based non-packet access. It is impossible though to allow index-based packed access,
    * which is why we don't set the LinearAccessBit.
    * TODO: this seems possible when the result is a vector
    */
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  const CoeffReturnType coeff(Index index) const
-  {
-    const Index row = (RowsAtCompileTime == 1 || MaxRowsAtCompileTime==1) ? 0 : index;
-    const Index col = (RowsAtCompileTime == 1 || MaxRowsAtCompileTime==1) ? index : 0;
-    return (m_lhs.row(row).transpose().cwiseProduct( m_rhs.col(col) )).sum();
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CoeffReturnType coeff(Index index) const {
+    const Index row = (RowsAtCompileTime == 1 || MaxRowsAtCompileTime == 1) ? 0 : index;
+    const Index col = (RowsAtCompileTime == 1 || MaxRowsAtCompileTime == 1) ? index : 0;
+    return (m_lhs.row(row).transpose().cwiseProduct(m_rhs.col(col))).sum();
   }
 
-  template<int LoadMode, typename PacketType>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  const PacketType packet(Index row, Index col) const
-  {
+  template <int LoadMode, typename PacketType>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const PacketType packet(Index row, Index col) const {
     PacketType res;
-    typedef etor_product_packet_impl<bool(int(Flags)&RowMajorBit) ? RowMajor : ColMajor,
-                                     Unroll ? int(InnerSize) : Dynamic,
-                                     LhsEtorType, RhsEtorType, PacketType, LoadMode> PacketImpl;
+    typedef etor_product_packet_impl<bool(int(Flags) & RowMajorBit) ? RowMajor : ColMajor,
+                                     Unroll ? int(InnerSize) : Dynamic, LhsEtorType, RhsEtorType, PacketType, LoadMode>
+        PacketImpl;
     PacketImpl::run(row, col, m_lhsImpl, m_rhsImpl, m_innerDim, res);
     return res;
   }
 
-  template<int LoadMode, typename PacketType>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  const PacketType packet(Index index) const
-  {
-    const Index row = (RowsAtCompileTime == 1 || MaxRowsAtCompileTime==1) ? 0 : index;
-    const Index col = (RowsAtCompileTime == 1 || MaxRowsAtCompileTime==1) ? index : 0;
-    return packet<LoadMode,PacketType>(row,col);
+  template <int LoadMode, typename PacketType>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const PacketType packet(Index index) const {
+    const Index row = (RowsAtCompileTime == 1 || MaxRowsAtCompileTime == 1) ? 0 : index;
+    const Index col = (RowsAtCompileTime == 1 || MaxRowsAtCompileTime == 1) ? index : 0;
+    return packet<LoadMode, PacketType>(row, col);
   }
 
-protected:
+ protected:
   add_const_on_value_type_t<LhsNested> m_lhs;
   add_const_on_value_type_t<RhsNested> m_rhs;
 
@@ -653,308 +641,288 @@
   Index m_innerDim;
 };
 
-template<typename Lhs, typename Rhs>
+template <typename Lhs, typename Rhs>
 struct product_evaluator<Product<Lhs, Rhs, DefaultProduct>, LazyCoeffBasedProductMode, DenseShape, DenseShape>
-  : product_evaluator<Product<Lhs, Rhs, LazyProduct>, CoeffBasedProductMode, DenseShape, DenseShape>
-{
+    : product_evaluator<Product<Lhs, Rhs, LazyProduct>, CoeffBasedProductMode, DenseShape, DenseShape> {
   typedef Product<Lhs, Rhs, DefaultProduct> XprType;
   typedef Product<Lhs, Rhs, LazyProduct> BaseProduct;
   typedef product_evaluator<BaseProduct, CoeffBasedProductMode, DenseShape, DenseShape> Base;
-  enum {
-    Flags = Base::Flags | EvalBeforeNestingBit
-  };
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  explicit product_evaluator(const XprType& xpr)
-    : Base(BaseProduct(xpr.lhs(),xpr.rhs()))
-  {}
+  enum { Flags = Base::Flags | EvalBeforeNestingBit };
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit product_evaluator(const XprType& xpr)
+      : Base(BaseProduct(xpr.lhs(), xpr.rhs())) {}
 };
 
 /****************************************
 *** Coeff based product, Packet path  ***
 ****************************************/
 
-template<int UnrollingIndex, typename Lhs, typename Rhs, typename Packet, int LoadMode>
-struct etor_product_packet_impl<RowMajor, UnrollingIndex, Lhs, Rhs, Packet, LoadMode>
-{
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index innerDim, Packet &res)
-  {
-    etor_product_packet_impl<RowMajor, UnrollingIndex-1, Lhs, Rhs, Packet, LoadMode>::run(row, col, lhs, rhs, innerDim, res);
-    res =  pmadd(pset1<Packet>(lhs.coeff(row, Index(UnrollingIndex-1))), rhs.template packet<LoadMode,Packet>(Index(UnrollingIndex-1), col), res);
+template <int UnrollingIndex, typename Lhs, typename Rhs, typename Packet, int LoadMode>
+struct etor_product_packet_impl<RowMajor, UnrollingIndex, Lhs, Rhs, Packet, LoadMode> {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs,
+                                                        Index innerDim, Packet& res) {
+    etor_product_packet_impl<RowMajor, UnrollingIndex - 1, Lhs, Rhs, Packet, LoadMode>::run(row, col, lhs, rhs,
+                                                                                            innerDim, res);
+    res = pmadd(pset1<Packet>(lhs.coeff(row, Index(UnrollingIndex - 1))),
+                rhs.template packet<LoadMode, Packet>(Index(UnrollingIndex - 1), col), res);
   }
 };
 
-template<int UnrollingIndex, typename Lhs, typename Rhs, typename Packet, int LoadMode>
-struct etor_product_packet_impl<ColMajor, UnrollingIndex, Lhs, Rhs, Packet, LoadMode>
-{
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index innerDim, Packet &res)
-  {
-    etor_product_packet_impl<ColMajor, UnrollingIndex-1, Lhs, Rhs, Packet, LoadMode>::run(row, col, lhs, rhs, innerDim, res);
-    res =  pmadd(lhs.template packet<LoadMode,Packet>(row, Index(UnrollingIndex-1)), pset1<Packet>(rhs.coeff(Index(UnrollingIndex-1), col)), res);
+template <int UnrollingIndex, typename Lhs, typename Rhs, typename Packet, int LoadMode>
+struct etor_product_packet_impl<ColMajor, UnrollingIndex, Lhs, Rhs, Packet, LoadMode> {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs,
+                                                        Index innerDim, Packet& res) {
+    etor_product_packet_impl<ColMajor, UnrollingIndex - 1, Lhs, Rhs, Packet, LoadMode>::run(row, col, lhs, rhs,
+                                                                                            innerDim, res);
+    res = pmadd(lhs.template packet<LoadMode, Packet>(row, Index(UnrollingIndex - 1)),
+                pset1<Packet>(rhs.coeff(Index(UnrollingIndex - 1), col)), res);
   }
 };
 
-template<typename Lhs, typename Rhs, typename Packet, int LoadMode>
-struct etor_product_packet_impl<RowMajor, 1, Lhs, Rhs, Packet, LoadMode>
-{
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index /*innerDim*/, Packet &res)
-  {
-    res = pmul(pset1<Packet>(lhs.coeff(row, Index(0))),rhs.template packet<LoadMode,Packet>(Index(0), col));
+template <typename Lhs, typename Rhs, typename Packet, int LoadMode>
+struct etor_product_packet_impl<RowMajor, 1, Lhs, Rhs, Packet, LoadMode> {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs,
+                                                        Index /*innerDim*/, Packet& res) {
+    res = pmul(pset1<Packet>(lhs.coeff(row, Index(0))), rhs.template packet<LoadMode, Packet>(Index(0), col));
   }
 };
 
-template<typename Lhs, typename Rhs, typename Packet, int LoadMode>
-struct etor_product_packet_impl<ColMajor, 1, Lhs, Rhs, Packet, LoadMode>
-{
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index /*innerDim*/, Packet &res)
-  {
-    res = pmul(lhs.template packet<LoadMode,Packet>(row, Index(0)), pset1<Packet>(rhs.coeff(Index(0), col)));
+template <typename Lhs, typename Rhs, typename Packet, int LoadMode>
+struct etor_product_packet_impl<ColMajor, 1, Lhs, Rhs, Packet, LoadMode> {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs,
+                                                        Index /*innerDim*/, Packet& res) {
+    res = pmul(lhs.template packet<LoadMode, Packet>(row, Index(0)), pset1<Packet>(rhs.coeff(Index(0), col)));
   }
 };
 
-template<typename Lhs, typename Rhs, typename Packet, int LoadMode>
-struct etor_product_packet_impl<RowMajor, 0, Lhs, Rhs, Packet, LoadMode>
-{
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Index /*row*/, Index /*col*/, const Lhs& /*lhs*/, const Rhs& /*rhs*/, Index /*innerDim*/, Packet &res)
-  {
+template <typename Lhs, typename Rhs, typename Packet, int LoadMode>
+struct etor_product_packet_impl<RowMajor, 0, Lhs, Rhs, Packet, LoadMode> {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Index /*row*/, Index /*col*/, const Lhs& /*lhs*/,
+                                                        const Rhs& /*rhs*/, Index /*innerDim*/, Packet& res) {
     res = pset1<Packet>(typename unpacket_traits<Packet>::type(0));
   }
 };
 
-template<typename Lhs, typename Rhs, typename Packet, int LoadMode>
-struct etor_product_packet_impl<ColMajor, 0, Lhs, Rhs, Packet, LoadMode>
-{
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Index /*row*/, Index /*col*/, const Lhs& /*lhs*/, const Rhs& /*rhs*/, Index /*innerDim*/, Packet &res)
-  {
+template <typename Lhs, typename Rhs, typename Packet, int LoadMode>
+struct etor_product_packet_impl<ColMajor, 0, Lhs, Rhs, Packet, LoadMode> {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Index /*row*/, Index /*col*/, const Lhs& /*lhs*/,
+                                                        const Rhs& /*rhs*/, Index /*innerDim*/, Packet& res) {
     res = pset1<Packet>(typename unpacket_traits<Packet>::type(0));
   }
 };
 
-template<typename Lhs, typename Rhs, typename Packet, int LoadMode>
-struct etor_product_packet_impl<RowMajor, Dynamic, Lhs, Rhs, Packet, LoadMode>
-{
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index innerDim, Packet& res)
-  {
+template <typename Lhs, typename Rhs, typename Packet, int LoadMode>
+struct etor_product_packet_impl<RowMajor, Dynamic, Lhs, Rhs, Packet, LoadMode> {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs,
+                                                        Index innerDim, Packet& res) {
     res = pset1<Packet>(typename unpacket_traits<Packet>::type(0));
-    for(Index i = 0; i < innerDim; ++i)
-      res =  pmadd(pset1<Packet>(lhs.coeff(row, i)), rhs.template packet<LoadMode,Packet>(i, col), res);
+    for (Index i = 0; i < innerDim; ++i)
+      res = pmadd(pset1<Packet>(lhs.coeff(row, i)), rhs.template packet<LoadMode, Packet>(i, col), res);
   }
 };
 
-template<typename Lhs, typename Rhs, typename Packet, int LoadMode>
-struct etor_product_packet_impl<ColMajor, Dynamic, Lhs, Rhs, Packet, LoadMode>
-{
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index innerDim, Packet& res)
-  {
+template <typename Lhs, typename Rhs, typename Packet, int LoadMode>
+struct etor_product_packet_impl<ColMajor, Dynamic, Lhs, Rhs, Packet, LoadMode> {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs,
+                                                        Index innerDim, Packet& res) {
     res = pset1<Packet>(typename unpacket_traits<Packet>::type(0));
-    for(Index i = 0; i < innerDim; ++i)
-      res =  pmadd(lhs.template packet<LoadMode,Packet>(row, i), pset1<Packet>(rhs.coeff(i, col)), res);
+    for (Index i = 0; i < innerDim; ++i)
+      res = pmadd(lhs.template packet<LoadMode, Packet>(row, i), pset1<Packet>(rhs.coeff(i, col)), res);
   }
 };
 
-
 /***************************************************************************
-* Triangular products
-***************************************************************************/
-template<int Mode, bool LhsIsTriangular,
-         typename Lhs, bool LhsIsVector,
-         typename Rhs, bool RhsIsVector>
+ * Triangular products
+ ***************************************************************************/
+template <int Mode, bool LhsIsTriangular, typename Lhs, bool LhsIsVector, typename Rhs, bool RhsIsVector>
 struct triangular_product_impl;
 
-template<typename Lhs, typename Rhs, int ProductTag>
-struct generic_product_impl<Lhs,Rhs,TriangularShape,DenseShape,ProductTag>
-  : generic_product_impl_base<Lhs,Rhs,generic_product_impl<Lhs,Rhs,TriangularShape,DenseShape,ProductTag> >
-{
-  typedef typename Product<Lhs,Rhs>::Scalar Scalar;
+template <typename Lhs, typename Rhs, int ProductTag>
+struct generic_product_impl<Lhs, Rhs, TriangularShape, DenseShape, ProductTag>
+    : generic_product_impl_base<Lhs, Rhs, generic_product_impl<Lhs, Rhs, TriangularShape, DenseShape, ProductTag>> {
+  typedef typename Product<Lhs, Rhs>::Scalar Scalar;
 
-  template<typename Dest>
-  static void scaleAndAddTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha)
-  {
-    triangular_product_impl<Lhs::Mode,true,typename Lhs::MatrixType,false,Rhs, Rhs::ColsAtCompileTime==1>
-        ::run(dst, lhs.nestedExpression(), rhs, alpha);
+  template <typename Dest>
+  static void scaleAndAddTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha) {
+    triangular_product_impl<Lhs::Mode, true, typename Lhs::MatrixType, false, Rhs, Rhs::ColsAtCompileTime == 1>::run(
+        dst, lhs.nestedExpression(), rhs, alpha);
   }
 };
 
-template<typename Lhs, typename Rhs, int ProductTag>
-struct generic_product_impl<Lhs,Rhs,DenseShape,TriangularShape,ProductTag>
-: generic_product_impl_base<Lhs,Rhs,generic_product_impl<Lhs,Rhs,DenseShape,TriangularShape,ProductTag> >
-{
-  typedef typename Product<Lhs,Rhs>::Scalar Scalar;
+template <typename Lhs, typename Rhs, int ProductTag>
+struct generic_product_impl<Lhs, Rhs, DenseShape, TriangularShape, ProductTag>
+    : generic_product_impl_base<Lhs, Rhs, generic_product_impl<Lhs, Rhs, DenseShape, TriangularShape, ProductTag>> {
+  typedef typename Product<Lhs, Rhs>::Scalar Scalar;
 
-  template<typename Dest>
-  static void scaleAndAddTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha)
-  {
-    triangular_product_impl<Rhs::Mode,false,Lhs,Lhs::RowsAtCompileTime==1, typename Rhs::MatrixType, false>::run(dst, lhs, rhs.nestedExpression(), alpha);
+  template <typename Dest>
+  static void scaleAndAddTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha) {
+    triangular_product_impl<Rhs::Mode, false, Lhs, Lhs::RowsAtCompileTime == 1, typename Rhs::MatrixType, false>::run(
+        dst, lhs, rhs.nestedExpression(), alpha);
   }
 };
 
-
 /***************************************************************************
-* SelfAdjoint products
-***************************************************************************/
-template <typename Lhs, int LhsMode, bool LhsIsVector,
-          typename Rhs, int RhsMode, bool RhsIsVector>
+ * SelfAdjoint products
+ ***************************************************************************/
+template <typename Lhs, int LhsMode, bool LhsIsVector, typename Rhs, int RhsMode, bool RhsIsVector>
 struct selfadjoint_product_impl;
 
-template<typename Lhs, typename Rhs, int ProductTag>
-struct generic_product_impl<Lhs,Rhs,SelfAdjointShape,DenseShape,ProductTag>
-  : generic_product_impl_base<Lhs,Rhs,generic_product_impl<Lhs,Rhs,SelfAdjointShape,DenseShape,ProductTag> >
-{
-  typedef typename Product<Lhs,Rhs>::Scalar Scalar;
+template <typename Lhs, typename Rhs, int ProductTag>
+struct generic_product_impl<Lhs, Rhs, SelfAdjointShape, DenseShape, ProductTag>
+    : generic_product_impl_base<Lhs, Rhs, generic_product_impl<Lhs, Rhs, SelfAdjointShape, DenseShape, ProductTag>> {
+  typedef typename Product<Lhs, Rhs>::Scalar Scalar;
 
-  template<typename Dest>
-  static EIGEN_DEVICE_FUNC
-  void scaleAndAddTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha)
-  {
-    selfadjoint_product_impl<typename Lhs::MatrixType,Lhs::Mode,false,Rhs,0,Rhs::IsVectorAtCompileTime>::run(dst, lhs.nestedExpression(), rhs, alpha);
+  template <typename Dest>
+  static EIGEN_DEVICE_FUNC void scaleAndAddTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha) {
+    selfadjoint_product_impl<typename Lhs::MatrixType, Lhs::Mode, false, Rhs, 0, Rhs::IsVectorAtCompileTime>::run(
+        dst, lhs.nestedExpression(), rhs, alpha);
   }
 };
 
-template<typename Lhs, typename Rhs, int ProductTag>
-struct generic_product_impl<Lhs,Rhs,DenseShape,SelfAdjointShape,ProductTag>
-: generic_product_impl_base<Lhs,Rhs,generic_product_impl<Lhs,Rhs,DenseShape,SelfAdjointShape,ProductTag> >
-{
-  typedef typename Product<Lhs,Rhs>::Scalar Scalar;
+template <typename Lhs, typename Rhs, int ProductTag>
+struct generic_product_impl<Lhs, Rhs, DenseShape, SelfAdjointShape, ProductTag>
+    : generic_product_impl_base<Lhs, Rhs, generic_product_impl<Lhs, Rhs, DenseShape, SelfAdjointShape, ProductTag>> {
+  typedef typename Product<Lhs, Rhs>::Scalar Scalar;
 
-  template<typename Dest>
-  static void scaleAndAddTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha)
-  {
-    selfadjoint_product_impl<Lhs,0,Lhs::IsVectorAtCompileTime,typename Rhs::MatrixType,Rhs::Mode,false>::run(dst, lhs, rhs.nestedExpression(), alpha);
+  template <typename Dest>
+  static void scaleAndAddTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha) {
+    selfadjoint_product_impl<Lhs, 0, Lhs::IsVectorAtCompileTime, typename Rhs::MatrixType, Rhs::Mode, false>::run(
+        dst, lhs, rhs.nestedExpression(), alpha);
   }
 };
 
-
 /***************************************************************************
-* Diagonal products
-***************************************************************************/
+ * Diagonal products
+ ***************************************************************************/
 
-template<typename MatrixType, typename DiagonalType, typename Derived, int ProductOrder>
-struct diagonal_product_evaluator_base
-  : evaluator_base<Derived>
-{
-   typedef typename ScalarBinaryOpTraits<typename MatrixType::Scalar, typename DiagonalType::Scalar>::ReturnType Scalar;
-public:
+template <typename MatrixType, typename DiagonalType, typename Derived, int ProductOrder>
+struct diagonal_product_evaluator_base : evaluator_base<Derived> {
+  typedef typename ScalarBinaryOpTraits<typename MatrixType::Scalar, typename DiagonalType::Scalar>::ReturnType Scalar;
+
+ public:
   enum {
-    CoeffReadCost = int(NumTraits<Scalar>::MulCost) + int(evaluator<MatrixType>::CoeffReadCost) + int(evaluator<DiagonalType>::CoeffReadCost),
+    CoeffReadCost = int(NumTraits<Scalar>::MulCost) + int(evaluator<MatrixType>::CoeffReadCost) +
+                    int(evaluator<DiagonalType>::CoeffReadCost),
 
     MatrixFlags = evaluator<MatrixType>::Flags,
     DiagFlags = evaluator<DiagonalType>::Flags,
 
-    StorageOrder_ = (Derived::MaxRowsAtCompileTime==1 && Derived::MaxColsAtCompileTime!=1) ? RowMajor
-                  : (Derived::MaxColsAtCompileTime==1 && Derived::MaxRowsAtCompileTime!=1) ? ColMajor
-                  : MatrixFlags & RowMajorBit ? RowMajor : ColMajor,
+    StorageOrder_ = (Derived::MaxRowsAtCompileTime == 1 && Derived::MaxColsAtCompileTime != 1)   ? RowMajor
+                    : (Derived::MaxColsAtCompileTime == 1 && Derived::MaxRowsAtCompileTime != 1) ? ColMajor
+                    : MatrixFlags & RowMajorBit                                                  ? RowMajor
+                                                                                                 : ColMajor,
     SameStorageOrder_ = StorageOrder_ == (MatrixFlags & RowMajorBit ? RowMajor : ColMajor),
 
-    ScalarAccessOnDiag_ =  !((int(StorageOrder_) == ColMajor && int(ProductOrder) == OnTheLeft)
-                           ||(int(StorageOrder_) == RowMajor && int(ProductOrder) == OnTheRight)),
+    ScalarAccessOnDiag_ = !((int(StorageOrder_) == ColMajor && int(ProductOrder) == OnTheLeft) ||
+                            (int(StorageOrder_) == RowMajor && int(ProductOrder) == OnTheRight)),
     SameTypes_ = is_same<typename MatrixType::Scalar, typename DiagonalType::Scalar>::value,
     // FIXME currently we need same types, but in the future the next rule should be the one
-    //Vectorizable_ = bool(int(MatrixFlags)&PacketAccessBit) && ((!_PacketOnDiag) || (SameTypes_ && bool(int(DiagFlags)&PacketAccessBit))),
-    Vectorizable_ =   bool(int(MatrixFlags)&PacketAccessBit)
-                  &&  SameTypes_
-                  && (SameStorageOrder_ || (MatrixFlags&LinearAccessBit)==LinearAccessBit)
-                  && (ScalarAccessOnDiag_ || (bool(int(DiagFlags)&PacketAccessBit))),
-    LinearAccessMask_ = (MatrixType::RowsAtCompileTime==1 || MatrixType::ColsAtCompileTime==1) ? LinearAccessBit : 0,
-    Flags = ((HereditaryBits|LinearAccessMask_) & (unsigned int)(MatrixFlags)) | (Vectorizable_ ? PacketAccessBit : 0),
+    // Vectorizable_ = bool(int(MatrixFlags)&PacketAccessBit) && ((!_PacketOnDiag) || (SameTypes_ &&
+    // bool(int(DiagFlags)&PacketAccessBit))),
+    Vectorizable_ = bool(int(MatrixFlags) & PacketAccessBit) && SameTypes_ &&
+                    (SameStorageOrder_ || (MatrixFlags & LinearAccessBit) == LinearAccessBit) &&
+                    (ScalarAccessOnDiag_ || (bool(int(DiagFlags) & PacketAccessBit))),
+    LinearAccessMask_ =
+        (MatrixType::RowsAtCompileTime == 1 || MatrixType::ColsAtCompileTime == 1) ? LinearAccessBit : 0,
+    Flags =
+        ((HereditaryBits | LinearAccessMask_) & (unsigned int)(MatrixFlags)) | (Vectorizable_ ? PacketAccessBit : 0),
     Alignment = evaluator<MatrixType>::Alignment,
 
-    AsScalarProduct =     (DiagonalType::SizeAtCompileTime==1)
-                      ||  (DiagonalType::SizeAtCompileTime==Dynamic && MatrixType::RowsAtCompileTime==1 && ProductOrder==OnTheLeft)
-                      ||  (DiagonalType::SizeAtCompileTime==Dynamic && MatrixType::ColsAtCompileTime==1 && ProductOrder==OnTheRight)
+    AsScalarProduct =
+        (DiagonalType::SizeAtCompileTime == 1) ||
+        (DiagonalType::SizeAtCompileTime == Dynamic && MatrixType::RowsAtCompileTime == 1 &&
+         ProductOrder == OnTheLeft) ||
+        (DiagonalType::SizeAtCompileTime == Dynamic && MatrixType::ColsAtCompileTime == 1 && ProductOrder == OnTheRight)
   };
 
-  EIGEN_DEVICE_FUNC diagonal_product_evaluator_base(const MatrixType &mat, const DiagonalType &diag)
-    : m_diagImpl(diag), m_matImpl(mat)
-  {
+  EIGEN_DEVICE_FUNC diagonal_product_evaluator_base(const MatrixType& mat, const DiagonalType& diag)
+      : m_diagImpl(diag), m_matImpl(mat) {
     EIGEN_INTERNAL_CHECK_COST_VALUE(NumTraits<Scalar>::MulCost);
     EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar coeff(Index idx) const
-  {
-    if(AsScalarProduct)
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar coeff(Index idx) const {
+    if (AsScalarProduct)
       return m_diagImpl.coeff(0) * m_matImpl.coeff(idx);
     else
       return m_diagImpl.coeff(idx) * m_matImpl.coeff(idx);
   }
 
-protected:
-  template<int LoadMode,typename PacketType>
-  EIGEN_STRONG_INLINE PacketType packet_impl(Index row, Index col, Index id, internal::true_type) const
-  {
-    return internal::pmul(m_matImpl.template packet<LoadMode,PacketType>(row, col),
+ protected:
+  template <int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE PacketType packet_impl(Index row, Index col, Index id, internal::true_type) const {
+    return internal::pmul(m_matImpl.template packet<LoadMode, PacketType>(row, col),
                           internal::pset1<PacketType>(m_diagImpl.coeff(id)));
   }
 
-  template<int LoadMode,typename PacketType>
-  EIGEN_STRONG_INLINE PacketType packet_impl(Index row, Index col, Index id, internal::false_type) const
-  {
+  template <int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE PacketType packet_impl(Index row, Index col, Index id, internal::false_type) const {
     enum {
       InnerSize = (MatrixType::Flags & RowMajorBit) ? MatrixType::ColsAtCompileTime : MatrixType::RowsAtCompileTime,
-      DiagonalPacketLoadMode = plain_enum_min(LoadMode,((InnerSize%16) == 0) ? int(Aligned16) : int(evaluator<DiagonalType>::Alignment)) // FIXME hardcoded 16!!
+      DiagonalPacketLoadMode = plain_enum_min(
+          LoadMode,
+          ((InnerSize % 16) == 0) ? int(Aligned16) : int(evaluator<DiagonalType>::Alignment))  // FIXME hardcoded 16!!
     };
-    return internal::pmul(m_matImpl.template packet<LoadMode,PacketType>(row, col),
-                          m_diagImpl.template packet<DiagonalPacketLoadMode,PacketType>(id));
+    return internal::pmul(m_matImpl.template packet<LoadMode, PacketType>(row, col),
+                          m_diagImpl.template packet<DiagonalPacketLoadMode, PacketType>(id));
   }
 
   evaluator<DiagonalType> m_diagImpl;
-  evaluator<MatrixType>   m_matImpl;
+  evaluator<MatrixType> m_matImpl;
 };
 
 // diagonal * dense
-template<typename Lhs, typename Rhs, int ProductKind, int ProductTag>
+template <typename Lhs, typename Rhs, int ProductKind, int ProductTag>
 struct product_evaluator<Product<Lhs, Rhs, ProductKind>, ProductTag, DiagonalShape, DenseShape>
-  : diagonal_product_evaluator_base<Rhs, typename Lhs::DiagonalVectorType, Product<Lhs, Rhs, LazyProduct>, OnTheLeft>
-{
-  typedef diagonal_product_evaluator_base<Rhs, typename Lhs::DiagonalVectorType, Product<Lhs, Rhs, LazyProduct>, OnTheLeft> Base;
+    : diagonal_product_evaluator_base<Rhs, typename Lhs::DiagonalVectorType, Product<Lhs, Rhs, LazyProduct>,
+                                      OnTheLeft> {
+  typedef diagonal_product_evaluator_base<Rhs, typename Lhs::DiagonalVectorType, Product<Lhs, Rhs, LazyProduct>,
+                                          OnTheLeft>
+      Base;
+  using Base::coeff;
   using Base::m_diagImpl;
   using Base::m_matImpl;
-  using Base::coeff;
   typedef typename Base::Scalar Scalar;
 
   typedef Product<Lhs, Rhs, ProductKind> XprType;
   typedef typename XprType::PlainObject PlainObject;
   typedef typename Lhs::DiagonalVectorType DiagonalType;
 
-
   enum { StorageOrder = Base::StorageOrder_ };
 
-  EIGEN_DEVICE_FUNC explicit product_evaluator(const XprType& xpr)
-    : Base(xpr.rhs(), xpr.lhs().diagonal())
-  {
-  }
+  EIGEN_DEVICE_FUNC explicit product_evaluator(const XprType& xpr) : Base(xpr.rhs(), xpr.lhs().diagonal()) {}
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar coeff(Index row, Index col) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar coeff(Index row, Index col) const {
     return m_diagImpl.coeff(row) * m_matImpl.coeff(row, col);
   }
 
 #ifndef EIGEN_GPUCC
-  template<int LoadMode,typename PacketType>
-  EIGEN_STRONG_INLINE PacketType packet(Index row, Index col) const
-  {
+  template <int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE PacketType packet(Index row, Index col) const {
     // FIXME: NVCC used to complain about the template keyword, but we have to check whether this is still the case.
     // See also similar calls below.
-    return this->template packet_impl<LoadMode,PacketType>(row,col, row,
-                                 std::conditional_t<int(StorageOrder)==RowMajor, internal::true_type, internal::false_type>());
+    return this->template packet_impl<LoadMode, PacketType>(
+        row, col, row, std::conditional_t<int(StorageOrder) == RowMajor, internal::true_type, internal::false_type>());
   }
 
-  template<int LoadMode,typename PacketType>
-  EIGEN_STRONG_INLINE PacketType packet(Index idx) const
-  {
-    return packet<LoadMode,PacketType>(int(StorageOrder)==ColMajor?idx:0,int(StorageOrder)==ColMajor?0:idx);
+  template <int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE PacketType packet(Index idx) const {
+    return packet<LoadMode, PacketType>(int(StorageOrder) == ColMajor ? idx : 0,
+                                        int(StorageOrder) == ColMajor ? 0 : idx);
   }
 #endif
 };
 
 // dense * diagonal
-template<typename Lhs, typename Rhs, int ProductKind, int ProductTag>
+template <typename Lhs, typename Rhs, int ProductKind, int ProductTag>
 struct product_evaluator<Product<Lhs, Rhs, ProductKind>, ProductTag, DenseShape, DiagonalShape>
-  : diagonal_product_evaluator_base<Lhs, typename Rhs::DiagonalVectorType, Product<Lhs, Rhs, LazyProduct>, OnTheRight>
-{
-  typedef diagonal_product_evaluator_base<Lhs, typename Rhs::DiagonalVectorType, Product<Lhs, Rhs, LazyProduct>, OnTheRight> Base;
+    : diagonal_product_evaluator_base<Lhs, typename Rhs::DiagonalVectorType, Product<Lhs, Rhs, LazyProduct>,
+                                      OnTheRight> {
+  typedef diagonal_product_evaluator_base<Lhs, typename Rhs::DiagonalVectorType, Product<Lhs, Rhs, LazyProduct>,
+                                          OnTheRight>
+      Base;
+  using Base::coeff;
   using Base::m_diagImpl;
   using Base::m_matImpl;
-  using Base::coeff;
   typedef typename Base::Scalar Scalar;
 
   typedef Product<Lhs, Rhs, ProductKind> XprType;
@@ -962,255 +930,226 @@
 
   enum { StorageOrder = Base::StorageOrder_ };
 
-  EIGEN_DEVICE_FUNC explicit product_evaluator(const XprType& xpr)
-    : Base(xpr.lhs(), xpr.rhs().diagonal())
-  {
-  }
+  EIGEN_DEVICE_FUNC explicit product_evaluator(const XprType& xpr) : Base(xpr.lhs(), xpr.rhs().diagonal()) {}
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar coeff(Index row, Index col) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar coeff(Index row, Index col) const {
     return m_matImpl.coeff(row, col) * m_diagImpl.coeff(col);
   }
 
 #ifndef EIGEN_GPUCC
-  template<int LoadMode,typename PacketType>
-  EIGEN_STRONG_INLINE PacketType packet(Index row, Index col) const
-  {
-    return this->template packet_impl<LoadMode,PacketType>(row,col, col,
-                                 std::conditional_t<int(StorageOrder)==ColMajor, internal::true_type, internal::false_type>());
+  template <int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE PacketType packet(Index row, Index col) const {
+    return this->template packet_impl<LoadMode, PacketType>(
+        row, col, col, std::conditional_t<int(StorageOrder) == ColMajor, internal::true_type, internal::false_type>());
   }
 
-  template<int LoadMode,typename PacketType>
-  EIGEN_STRONG_INLINE PacketType packet(Index idx) const
-  {
-    return packet<LoadMode,PacketType>(int(StorageOrder)==ColMajor?idx:0,int(StorageOrder)==ColMajor?0:idx);
+  template <int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE PacketType packet(Index idx) const {
+    return packet<LoadMode, PacketType>(int(StorageOrder) == ColMajor ? idx : 0,
+                                        int(StorageOrder) == ColMajor ? 0 : idx);
   }
 #endif
 };
 
 /***************************************************************************
-* Products with permutation matrices
-***************************************************************************/
+ * Products with permutation matrices
+ ***************************************************************************/
 
 /** \internal
-  * \class permutation_matrix_product
-  * Internal helper class implementing the product between a permutation matrix and a matrix.
-  * This class is specialized for DenseShape below and for SparseShape in SparseCore/SparsePermutation.h
-  */
-template<typename ExpressionType, int Side, bool Transposed, typename ExpressionShape>
+ * \class permutation_matrix_product
+ * Internal helper class implementing the product between a permutation matrix and a matrix.
+ * This class is specialized for DenseShape below and for SparseShape in SparseCore/SparsePermutation.h
+ */
+template <typename ExpressionType, int Side, bool Transposed, typename ExpressionShape>
 struct permutation_matrix_product;
 
-template<typename ExpressionType, int Side, bool Transposed>
-struct permutation_matrix_product<ExpressionType, Side, Transposed, DenseShape>
-{
-    typedef typename nested_eval<ExpressionType, 1>::type MatrixType;
-    typedef remove_all_t<MatrixType> MatrixTypeCleaned;
+template <typename ExpressionType, int Side, bool Transposed>
+struct permutation_matrix_product<ExpressionType, Side, Transposed, DenseShape> {
+  typedef typename nested_eval<ExpressionType, 1>::type MatrixType;
+  typedef remove_all_t<MatrixType> MatrixTypeCleaned;
 
-    template<typename Dest, typename PermutationType>
-    static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Dest& dst, const PermutationType& perm, const ExpressionType& xpr)
-    {
-      MatrixType mat(xpr);
-      const Index n = Side==OnTheLeft ? mat.rows() : mat.cols();
-      // FIXME we need an is_same for expression that is not sensitive to constness. For instance
-      // is_same_xpr<Block<const Matrix>, Block<Matrix> >::value should be true.
-      //if(is_same<MatrixTypeCleaned,Dest>::value && extract_data(dst) == extract_data(mat))
-      if(is_same_dense(dst, mat))
-      {
-        // apply the permutation inplace
-        Matrix<bool,PermutationType::RowsAtCompileTime,1,0,PermutationType::MaxRowsAtCompileTime> mask(perm.size());
-        mask.fill(false);
-        Index r = 0;
-        while(r < perm.size())
-        {
-          // search for the next seed
-          while(r<perm.size() && mask[r]) r++;
-          if(r>=perm.size())
-            break;
-          // we got one, let's follow it until we are back to the seed
-          Index k0 = r++;
-          Index kPrev = k0;
-          mask.coeffRef(k0) = true;
-          for(Index k=perm.indices().coeff(k0); k!=k0; k=perm.indices().coeff(k))
-          {
-                  Block<Dest, Side==OnTheLeft ? 1 : Dest::RowsAtCompileTime, Side==OnTheRight ? 1 : Dest::ColsAtCompileTime>(dst, k)
-            .swap(Block<Dest, Side==OnTheLeft ? 1 : Dest::RowsAtCompileTime, Side==OnTheRight ? 1 : Dest::ColsAtCompileTime>
-                       (dst,((Side==OnTheLeft) ^ Transposed) ? k0 : kPrev));
+  template <typename Dest, typename PermutationType>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Dest& dst, const PermutationType& perm,
+                                                        const ExpressionType& xpr) {
+    MatrixType mat(xpr);
+    const Index n = Side == OnTheLeft ? mat.rows() : mat.cols();
+    // FIXME we need an is_same for expression that is not sensitive to constness. For instance
+    // is_same_xpr<Block<const Matrix>, Block<Matrix> >::value should be true.
+    // if(is_same<MatrixTypeCleaned,Dest>::value && extract_data(dst) == extract_data(mat))
+    if (is_same_dense(dst, mat)) {
+      // apply the permutation inplace
+      Matrix<bool, PermutationType::RowsAtCompileTime, 1, 0, PermutationType::MaxRowsAtCompileTime> mask(perm.size());
+      mask.fill(false);
+      Index r = 0;
+      while (r < perm.size()) {
+        // search for the next seed
+        while (r < perm.size() && mask[r]) r++;
+        if (r >= perm.size()) break;
+        // we got one, let's follow it until we are back to the seed
+        Index k0 = r++;
+        Index kPrev = k0;
+        mask.coeffRef(k0) = true;
+        for (Index k = perm.indices().coeff(k0); k != k0; k = perm.indices().coeff(k)) {
+          Block<Dest, Side == OnTheLeft ? 1 : Dest::RowsAtCompileTime,
+                Side == OnTheRight ? 1 : Dest::ColsAtCompileTime>(dst, k)
+              .swap(Block < Dest, Side == OnTheLeft ? 1 : Dest::RowsAtCompileTime,
+                    Side == OnTheRight
+                        ? 1
+                        : Dest::ColsAtCompileTime > (dst, ((Side == OnTheLeft) ^ Transposed) ? k0 : kPrev));
 
-            mask.coeffRef(k) = true;
-            kPrev = k;
-          }
+          mask.coeffRef(k) = true;
+          kPrev = k;
         }
       }
-      else
-      {
-        for(Index i = 0; i < n; ++i)
-        {
-          Block<Dest, Side==OnTheLeft ? 1 : Dest::RowsAtCompileTime, Side==OnTheRight ? 1 : Dest::ColsAtCompileTime>
-               (dst, ((Side==OnTheLeft) ^ Transposed) ? perm.indices().coeff(i) : i)
+    } else {
+      for (Index i = 0; i < n; ++i) {
+        Block<Dest, Side == OnTheLeft ? 1 : Dest::RowsAtCompileTime, Side == OnTheRight ? 1 : Dest::ColsAtCompileTime>(
+            dst, ((Side == OnTheLeft) ^ Transposed) ? perm.indices().coeff(i) : i)
 
-          =
+            =
 
-          Block<const MatrixTypeCleaned,Side==OnTheLeft ? 1 : MatrixTypeCleaned::RowsAtCompileTime,Side==OnTheRight ? 1 : MatrixTypeCleaned::ColsAtCompileTime>
-               (mat, ((Side==OnTheRight) ^ Transposed) ? perm.indices().coeff(i) : i);
-        }
+                Block < const MatrixTypeCleaned,
+            Side == OnTheLeft ? 1 : MatrixTypeCleaned::RowsAtCompileTime,
+            Side == OnTheRight ? 1
+                               : MatrixTypeCleaned::ColsAtCompileTime >
+                                     (mat, ((Side == OnTheRight) ^ Transposed) ? perm.indices().coeff(i) : i);
       }
     }
+  }
 };
 
-template<typename Lhs, typename Rhs, int ProductTag, typename MatrixShape>
-struct generic_product_impl<Lhs, Rhs, PermutationShape, MatrixShape, ProductTag>
-{
-  template<typename Dest>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs)
-  {
+template <typename Lhs, typename Rhs, int ProductTag, typename MatrixShape>
+struct generic_product_impl<Lhs, Rhs, PermutationShape, MatrixShape, ProductTag> {
+  template <typename Dest>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs) {
     permutation_matrix_product<Rhs, OnTheLeft, false, MatrixShape>::run(dst, lhs, rhs);
   }
 };
 
-template<typename Lhs, typename Rhs, int ProductTag, typename MatrixShape>
-struct generic_product_impl<Lhs, Rhs, MatrixShape, PermutationShape, ProductTag>
-{
-  template<typename Dest>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs)
-  {
+template <typename Lhs, typename Rhs, int ProductTag, typename MatrixShape>
+struct generic_product_impl<Lhs, Rhs, MatrixShape, PermutationShape, ProductTag> {
+  template <typename Dest>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs) {
     permutation_matrix_product<Lhs, OnTheRight, false, MatrixShape>::run(dst, rhs, lhs);
   }
 };
 
-template<typename Lhs, typename Rhs, int ProductTag, typename MatrixShape>
-struct generic_product_impl<Inverse<Lhs>, Rhs, PermutationShape, MatrixShape, ProductTag>
-{
-  template<typename Dest>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dest& dst, const Inverse<Lhs>& lhs, const Rhs& rhs)
-  {
+template <typename Lhs, typename Rhs, int ProductTag, typename MatrixShape>
+struct generic_product_impl<Inverse<Lhs>, Rhs, PermutationShape, MatrixShape, ProductTag> {
+  template <typename Dest>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dest& dst, const Inverse<Lhs>& lhs, const Rhs& rhs) {
     permutation_matrix_product<Rhs, OnTheLeft, true, MatrixShape>::run(dst, lhs.nestedExpression(), rhs);
   }
 };
 
-template<typename Lhs, typename Rhs, int ProductTag, typename MatrixShape>
-struct generic_product_impl<Lhs, Inverse<Rhs>, MatrixShape, PermutationShape, ProductTag>
-{
-  template<typename Dest>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dest& dst, const Lhs& lhs, const Inverse<Rhs>& rhs)
-  {
+template <typename Lhs, typename Rhs, int ProductTag, typename MatrixShape>
+struct generic_product_impl<Lhs, Inverse<Rhs>, MatrixShape, PermutationShape, ProductTag> {
+  template <typename Dest>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dest& dst, const Lhs& lhs, const Inverse<Rhs>& rhs) {
     permutation_matrix_product<Lhs, OnTheRight, true, MatrixShape>::run(dst, rhs.nestedExpression(), lhs);
   }
 };
 
-
 /***************************************************************************
-* Products with transpositions matrices
-***************************************************************************/
+ * Products with transpositions matrices
+ ***************************************************************************/
 
 // FIXME could we unify Transpositions and Permutation into a single "shape"??
 
 /** \internal
-  * \class transposition_matrix_product
-  * Internal helper class implementing the product between a permutation matrix and a matrix.
-  */
-template<typename ExpressionType, int Side, bool Transposed, typename ExpressionShape>
-struct transposition_matrix_product
-{
+ * \class transposition_matrix_product
+ * Internal helper class implementing the product between a permutation matrix and a matrix.
+ */
+template <typename ExpressionType, int Side, bool Transposed, typename ExpressionShape>
+struct transposition_matrix_product {
   typedef typename nested_eval<ExpressionType, 1>::type MatrixType;
   typedef remove_all_t<MatrixType> MatrixTypeCleaned;
 
-  template<typename Dest, typename TranspositionType>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Dest& dst, const TranspositionType& tr, const ExpressionType& xpr)
-  {
+  template <typename Dest, typename TranspositionType>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Dest& dst, const TranspositionType& tr,
+                                                        const ExpressionType& xpr) {
     MatrixType mat(xpr);
     typedef typename TranspositionType::StorageIndex StorageIndex;
     const Index size = tr.size();
     StorageIndex j = 0;
 
-    if(!is_same_dense(dst,mat))
-      dst = mat;
+    if (!is_same_dense(dst, mat)) dst = mat;
 
-    for(Index k=(Transposed?size-1:0) ; Transposed?k>=0:k<size ; Transposed?--k:++k)
-      if(Index(j=tr.coeff(k))!=k)
-      {
-        if(Side==OnTheLeft)        dst.row(k).swap(dst.row(j));
-        else if(Side==OnTheRight)  dst.col(k).swap(dst.col(j));
+    for (Index k = (Transposed ? size - 1 : 0); Transposed ? k >= 0 : k < size; Transposed ? --k : ++k)
+      if (Index(j = tr.coeff(k)) != k) {
+        if (Side == OnTheLeft)
+          dst.row(k).swap(dst.row(j));
+        else if (Side == OnTheRight)
+          dst.col(k).swap(dst.col(j));
       }
   }
 };
 
-template<typename Lhs, typename Rhs, int ProductTag, typename MatrixShape>
-struct generic_product_impl<Lhs, Rhs, TranspositionsShape, MatrixShape, ProductTag>
-{
-  template<typename Dest>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs)
-  {
+template <typename Lhs, typename Rhs, int ProductTag, typename MatrixShape>
+struct generic_product_impl<Lhs, Rhs, TranspositionsShape, MatrixShape, ProductTag> {
+  template <typename Dest>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs) {
     transposition_matrix_product<Rhs, OnTheLeft, false, MatrixShape>::run(dst, lhs, rhs);
   }
 };
 
-template<typename Lhs, typename Rhs, int ProductTag, typename MatrixShape>
-struct generic_product_impl<Lhs, Rhs, MatrixShape, TranspositionsShape, ProductTag>
-{
-  template<typename Dest>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs)
-  {
+template <typename Lhs, typename Rhs, int ProductTag, typename MatrixShape>
+struct generic_product_impl<Lhs, Rhs, MatrixShape, TranspositionsShape, ProductTag> {
+  template <typename Dest>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs) {
     transposition_matrix_product<Lhs, OnTheRight, false, MatrixShape>::run(dst, rhs, lhs);
   }
 };
 
-
-template<typename Lhs, typename Rhs, int ProductTag, typename MatrixShape>
-struct generic_product_impl<Transpose<Lhs>, Rhs, TranspositionsShape, MatrixShape, ProductTag>
-{
-  template<typename Dest>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dest& dst, const Transpose<Lhs>& lhs, const Rhs& rhs)
-  {
+template <typename Lhs, typename Rhs, int ProductTag, typename MatrixShape>
+struct generic_product_impl<Transpose<Lhs>, Rhs, TranspositionsShape, MatrixShape, ProductTag> {
+  template <typename Dest>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dest& dst, const Transpose<Lhs>& lhs, const Rhs& rhs) {
     transposition_matrix_product<Rhs, OnTheLeft, true, MatrixShape>::run(dst, lhs.nestedExpression(), rhs);
   }
 };
 
-template<typename Lhs, typename Rhs, int ProductTag, typename MatrixShape>
-struct generic_product_impl<Lhs, Transpose<Rhs>, MatrixShape, TranspositionsShape, ProductTag>
-{
-  template<typename Dest>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dest& dst, const Lhs& lhs, const Transpose<Rhs>& rhs)
-  {
+template <typename Lhs, typename Rhs, int ProductTag, typename MatrixShape>
+struct generic_product_impl<Lhs, Transpose<Rhs>, MatrixShape, TranspositionsShape, ProductTag> {
+  template <typename Dest>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dest& dst, const Lhs& lhs, const Transpose<Rhs>& rhs) {
     transposition_matrix_product<Lhs, OnTheRight, true, MatrixShape>::run(dst, rhs.nestedExpression(), lhs);
   }
 };
 
 /***************************************************************************
-* skew symmetric products
-* for now we just call the generic implementation
-***************************************************************************/
-template<typename Lhs, typename Rhs, int ProductTag, typename MatrixShape>
-struct generic_product_impl<Lhs, Rhs, SkewSymmetricShape, MatrixShape, ProductTag>
-{
-  template<typename Dest>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs)
-  {
-    generic_product_impl<typename Lhs::DenseMatrixType , Rhs, DenseShape, MatrixShape, ProductTag>::evalTo(dst, lhs, rhs);
+ * skew symmetric products
+ * for now we just call the generic implementation
+ ***************************************************************************/
+template <typename Lhs, typename Rhs, int ProductTag, typename MatrixShape>
+struct generic_product_impl<Lhs, Rhs, SkewSymmetricShape, MatrixShape, ProductTag> {
+  template <typename Dest>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs) {
+    generic_product_impl<typename Lhs::DenseMatrixType, Rhs, DenseShape, MatrixShape, ProductTag>::evalTo(dst, lhs,
+                                                                                                          rhs);
   }
 };
 
-template<typename Lhs, typename Rhs, int ProductTag, typename MatrixShape>
-struct generic_product_impl<Lhs, Rhs, MatrixShape, SkewSymmetricShape, ProductTag>
-{
-  template<typename Dest>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs)
-  {
-    generic_product_impl<Lhs, typename Rhs::DenseMatrixType, MatrixShape, DenseShape, ProductTag>::evalTo(dst, lhs, rhs);
+template <typename Lhs, typename Rhs, int ProductTag, typename MatrixShape>
+struct generic_product_impl<Lhs, Rhs, MatrixShape, SkewSymmetricShape, ProductTag> {
+  template <typename Dest>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs) {
+    generic_product_impl<Lhs, typename Rhs::DenseMatrixType, MatrixShape, DenseShape, ProductTag>::evalTo(dst, lhs,
+                                                                                                          rhs);
   }
 };
 
-template<typename Lhs, typename Rhs, int ProductTag>
-struct generic_product_impl<Lhs, Rhs, SkewSymmetricShape, SkewSymmetricShape, ProductTag>
-{
-  template<typename Dest>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs)
-  {
-    generic_product_impl<typename Lhs::DenseMatrixType, typename Rhs::DenseMatrixType, DenseShape, DenseShape, ProductTag>::evalTo(dst, lhs, rhs);
+template <typename Lhs, typename Rhs, int ProductTag>
+struct generic_product_impl<Lhs, Rhs, SkewSymmetricShape, SkewSymmetricShape, ProductTag> {
+  template <typename Dest>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs) {
+    generic_product_impl<typename Lhs::DenseMatrixType, typename Rhs::DenseMatrixType, DenseShape, DenseShape,
+                         ProductTag>::evalTo(dst, lhs, rhs);
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_PRODUCT_EVALUATORS_H
+#endif  // EIGEN_PRODUCT_EVALUATORS_H
diff --git a/Eigen/src/Core/Random.h b/Eigen/src/Core/Random.h
index 2e9784f..f8a5435 100644
--- a/Eigen/src/Core/Random.h
+++ b/Eigen/src/Core/Random.h
@@ -13,208 +13,195 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
-template<typename Scalar> struct scalar_random_op {
-  inline const Scalar operator() () const { return random<Scalar>(); }
+template <typename Scalar>
+struct scalar_random_op {
+  inline const Scalar operator()() const { return random<Scalar>(); }
 };
 
-template<typename Scalar>
-struct functor_traits<scalar_random_op<Scalar> >
-{ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false, IsRepeatable = false }; };
+template <typename Scalar>
+struct functor_traits<scalar_random_op<Scalar> > {
+  enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false, IsRepeatable = false };
+};
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \returns a random matrix expression
-  *
-  * Numbers are uniformly spread through their whole definition range for integer types,
-  * and in the [-1:1] range for floating point scalar types.
-  * 
-  * The parameters \a rows and \a cols are the number of rows and of columns of
-  * the returned matrix. Must be compatible with this MatrixBase type.
-  *
-  * \not_reentrant
-  * 
-  * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
-  * it is redundant to pass \a rows and \a cols as arguments, so Random() should be used
-  * instead.
-  * 
-  *
-  * Example: \include MatrixBase_random_int_int.cpp
-  * Output: \verbinclude MatrixBase_random_int_int.out
-  *
-  * This expression has the "evaluate before nesting" flag so that it will be evaluated into
-  * a temporary matrix whenever it is nested in a larger expression. This prevents unexpected
-  * behavior with expressions involving random matrices.
-  * 
-  * See DenseBase::NullaryExpr(Index, const CustomNullaryOp&) for an example using C++11 random generators.
-  *
-  * \sa DenseBase::setRandom(), DenseBase::Random(Index), DenseBase::Random()
-  */
-template<typename Derived>
-inline const typename DenseBase<Derived>::RandomReturnType
-DenseBase<Derived>::Random(Index rows, Index cols)
-{
+ *
+ * Numbers are uniformly spread through their whole definition range for integer types,
+ * and in the [-1:1] range for floating point scalar types.
+ *
+ * The parameters \a rows and \a cols are the number of rows and of columns of
+ * the returned matrix. Must be compatible with this MatrixBase type.
+ *
+ * \not_reentrant
+ *
+ * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
+ * it is redundant to pass \a rows and \a cols as arguments, so Random() should be used
+ * instead.
+ *
+ *
+ * Example: \include MatrixBase_random_int_int.cpp
+ * Output: \verbinclude MatrixBase_random_int_int.out
+ *
+ * This expression has the "evaluate before nesting" flag so that it will be evaluated into
+ * a temporary matrix whenever it is nested in a larger expression. This prevents unexpected
+ * behavior with expressions involving random matrices.
+ *
+ * See DenseBase::NullaryExpr(Index, const CustomNullaryOp&) for an example using C++11 random generators.
+ *
+ * \sa DenseBase::setRandom(), DenseBase::Random(Index), DenseBase::Random()
+ */
+template <typename Derived>
+inline const typename DenseBase<Derived>::RandomReturnType DenseBase<Derived>::Random(Index rows, Index cols) {
   return NullaryExpr(rows, cols, internal::scalar_random_op<Scalar>());
 }
 
 /** \returns a random vector expression
-  *
-  * Numbers are uniformly spread through their whole definition range for integer types,
-  * and in the [-1:1] range for floating point scalar types.
-  *
-  * The parameter \a size is the size of the returned vector.
-  * Must be compatible with this MatrixBase type.
-  *
-  * \only_for_vectors
-  * \not_reentrant
-  *
-  * This variant is meant to be used for dynamic-size vector types. For fixed-size types,
-  * it is redundant to pass \a size as argument, so Random() should be used
-  * instead.
-  *
-  * Example: \include MatrixBase_random_int.cpp
-  * Output: \verbinclude MatrixBase_random_int.out
-  *
-  * This expression has the "evaluate before nesting" flag so that it will be evaluated into
-  * a temporary vector whenever it is nested in a larger expression. This prevents unexpected
-  * behavior with expressions involving random matrices.
-  *
-  * \sa DenseBase::setRandom(), DenseBase::Random(Index,Index), DenseBase::Random()
-  */
-template<typename Derived>
-inline const typename DenseBase<Derived>::RandomReturnType
-DenseBase<Derived>::Random(Index size)
-{
+ *
+ * Numbers are uniformly spread through their whole definition range for integer types,
+ * and in the [-1:1] range for floating point scalar types.
+ *
+ * The parameter \a size is the size of the returned vector.
+ * Must be compatible with this MatrixBase type.
+ *
+ * \only_for_vectors
+ * \not_reentrant
+ *
+ * This variant is meant to be used for dynamic-size vector types. For fixed-size types,
+ * it is redundant to pass \a size as argument, so Random() should be used
+ * instead.
+ *
+ * Example: \include MatrixBase_random_int.cpp
+ * Output: \verbinclude MatrixBase_random_int.out
+ *
+ * This expression has the "evaluate before nesting" flag so that it will be evaluated into
+ * a temporary vector whenever it is nested in a larger expression. This prevents unexpected
+ * behavior with expressions involving random matrices.
+ *
+ * \sa DenseBase::setRandom(), DenseBase::Random(Index,Index), DenseBase::Random()
+ */
+template <typename Derived>
+inline const typename DenseBase<Derived>::RandomReturnType DenseBase<Derived>::Random(Index size) {
   return NullaryExpr(size, internal::scalar_random_op<Scalar>());
 }
 
 /** \returns a fixed-size random matrix or vector expression
-  *
-  * Numbers are uniformly spread through their whole definition range for integer types,
-  * and in the [-1:1] range for floating point scalar types.
-  * 
-  * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you
-  * need to use the variants taking size arguments.
-  *
-  * Example: \include MatrixBase_random.cpp
-  * Output: \verbinclude MatrixBase_random.out
-  *
-  * This expression has the "evaluate before nesting" flag so that it will be evaluated into
-  * a temporary matrix whenever it is nested in a larger expression. This prevents unexpected
-  * behavior with expressions involving random matrices.
-  * 
-  * \not_reentrant
-  *
-  * \sa DenseBase::setRandom(), DenseBase::Random(Index,Index), DenseBase::Random(Index)
-  */
-template<typename Derived>
-inline const typename DenseBase<Derived>::RandomReturnType
-DenseBase<Derived>::Random()
-{
+ *
+ * Numbers are uniformly spread through their whole definition range for integer types,
+ * and in the [-1:1] range for floating point scalar types.
+ *
+ * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you
+ * need to use the variants taking size arguments.
+ *
+ * Example: \include MatrixBase_random.cpp
+ * Output: \verbinclude MatrixBase_random.out
+ *
+ * This expression has the "evaluate before nesting" flag so that it will be evaluated into
+ * a temporary matrix whenever it is nested in a larger expression. This prevents unexpected
+ * behavior with expressions involving random matrices.
+ *
+ * \not_reentrant
+ *
+ * \sa DenseBase::setRandom(), DenseBase::Random(Index,Index), DenseBase::Random(Index)
+ */
+template <typename Derived>
+inline const typename DenseBase<Derived>::RandomReturnType DenseBase<Derived>::Random() {
   return NullaryExpr(RowsAtCompileTime, ColsAtCompileTime, internal::scalar_random_op<Scalar>());
 }
 
 /** Sets all coefficients in this expression to random values.
-  *
-  * Numbers are uniformly spread through their whole definition range for integer types,
-  * and in the [-1:1] range for floating point scalar types.
-  * 
-  * \not_reentrant
-  * 
-  * Example: \include MatrixBase_setRandom.cpp
-  * Output: \verbinclude MatrixBase_setRandom.out
-  *
-  * \sa class CwiseNullaryOp, setRandom(Index), setRandom(Index,Index)
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC inline Derived& DenseBase<Derived>::setRandom()
-{
+ *
+ * Numbers are uniformly spread through their whole definition range for integer types,
+ * and in the [-1:1] range for floating point scalar types.
+ *
+ * \not_reentrant
+ *
+ * Example: \include MatrixBase_setRandom.cpp
+ * Output: \verbinclude MatrixBase_setRandom.out
+ *
+ * \sa class CwiseNullaryOp, setRandom(Index), setRandom(Index,Index)
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC inline Derived& DenseBase<Derived>::setRandom() {
   return *this = Random(rows(), cols());
 }
 
 /** Resizes to the given \a newSize, and sets all coefficients in this expression to random values.
-  *
-  * Numbers are uniformly spread through their whole definition range for integer types,
-  * and in the [-1:1] range for floating point scalar types.
-  * 
-  * \only_for_vectors
-  * \not_reentrant
-  *
-  * Example: \include Matrix_setRandom_int.cpp
-  * Output: \verbinclude Matrix_setRandom_int.out
-  *
-  * \sa DenseBase::setRandom(), setRandom(Index,Index), class CwiseNullaryOp, DenseBase::Random()
-  */
-template<typename Derived>
-EIGEN_STRONG_INLINE Derived&
-PlainObjectBase<Derived>::setRandom(Index newSize)
-{
+ *
+ * Numbers are uniformly spread through their whole definition range for integer types,
+ * and in the [-1:1] range for floating point scalar types.
+ *
+ * \only_for_vectors
+ * \not_reentrant
+ *
+ * Example: \include Matrix_setRandom_int.cpp
+ * Output: \verbinclude Matrix_setRandom_int.out
+ *
+ * \sa DenseBase::setRandom(), setRandom(Index,Index), class CwiseNullaryOp, DenseBase::Random()
+ */
+template <typename Derived>
+EIGEN_STRONG_INLINE Derived& PlainObjectBase<Derived>::setRandom(Index newSize) {
   resize(newSize);
   return setRandom();
 }
 
 /** Resizes to the given size, and sets all coefficients in this expression to random values.
-  *
-  * Numbers are uniformly spread through their whole definition range for integer types,
-  * and in the [-1:1] range for floating point scalar types.
-  *
-  * \not_reentrant
-  * 
-  * \param rows the new number of rows
-  * \param cols the new number of columns
-  *
-  * Example: \include Matrix_setRandom_int_int.cpp
-  * Output: \verbinclude Matrix_setRandom_int_int.out
-  *
-  * \sa DenseBase::setRandom(), setRandom(Index), class CwiseNullaryOp, DenseBase::Random()
-  */
-template<typename Derived>
-EIGEN_STRONG_INLINE Derived&
-PlainObjectBase<Derived>::setRandom(Index rows, Index cols)
-{
+ *
+ * Numbers are uniformly spread through their whole definition range for integer types,
+ * and in the [-1:1] range for floating point scalar types.
+ *
+ * \not_reentrant
+ *
+ * \param rows the new number of rows
+ * \param cols the new number of columns
+ *
+ * Example: \include Matrix_setRandom_int_int.cpp
+ * Output: \verbinclude Matrix_setRandom_int_int.out
+ *
+ * \sa DenseBase::setRandom(), setRandom(Index), class CwiseNullaryOp, DenseBase::Random()
+ */
+template <typename Derived>
+EIGEN_STRONG_INLINE Derived& PlainObjectBase<Derived>::setRandom(Index rows, Index cols) {
   resize(rows, cols);
   return setRandom();
 }
 
 /** Resizes to the given size, changing only the number of columns, and sets all
-  * coefficients in this expression to random values. For the parameter of type
-  * NoChange_t, just pass the special value \c NoChange.
-  *
-  * Numbers are uniformly spread through their whole definition range for integer types,
-  * and in the [-1:1] range for floating point scalar types.
-  *
-  * \not_reentrant
-  *
-  * \sa DenseBase::setRandom(), setRandom(Index), setRandom(Index, NoChange_t), class CwiseNullaryOp, DenseBase::Random()
-  */
-template<typename Derived>
-EIGEN_STRONG_INLINE Derived&
-PlainObjectBase<Derived>::setRandom(NoChange_t, Index cols)
-{
+ * coefficients in this expression to random values. For the parameter of type
+ * NoChange_t, just pass the special value \c NoChange.
+ *
+ * Numbers are uniformly spread through their whole definition range for integer types,
+ * and in the [-1:1] range for floating point scalar types.
+ *
+ * \not_reentrant
+ *
+ * \sa DenseBase::setRandom(), setRandom(Index), setRandom(Index, NoChange_t), class CwiseNullaryOp, DenseBase::Random()
+ */
+template <typename Derived>
+EIGEN_STRONG_INLINE Derived& PlainObjectBase<Derived>::setRandom(NoChange_t, Index cols) {
   return setRandom(rows(), cols);
 }
 
 /** Resizes to the given size, changing only the number of rows, and sets all
-  * coefficients in this expression to random values. For the parameter of type
-  * NoChange_t, just pass the special value \c NoChange.
-  *
-  * Numbers are uniformly spread through their whole definition range for integer types,
-  * and in the [-1:1] range for floating point scalar types.
-  *
-  * \not_reentrant
-  *
-  * \sa DenseBase::setRandom(), setRandom(Index), setRandom(NoChange_t, Index), class CwiseNullaryOp, DenseBase::Random()
-  */
-template<typename Derived>
-EIGEN_STRONG_INLINE Derived&
-PlainObjectBase<Derived>::setRandom(Index rows, NoChange_t)
-{
+ * coefficients in this expression to random values. For the parameter of type
+ * NoChange_t, just pass the special value \c NoChange.
+ *
+ * Numbers are uniformly spread through their whole definition range for integer types,
+ * and in the [-1:1] range for floating point scalar types.
+ *
+ * \not_reentrant
+ *
+ * \sa DenseBase::setRandom(), setRandom(Index), setRandom(NoChange_t, Index), class CwiseNullaryOp, DenseBase::Random()
+ */
+template <typename Derived>
+EIGEN_STRONG_INLINE Derived& PlainObjectBase<Derived>::setRandom(Index rows, NoChange_t) {
   return setRandom(rows, cols());
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_RANDOM_H
+#endif  // EIGEN_RANDOM_H
diff --git a/Eigen/src/Core/Redux.h b/Eigen/src/Core/Redux.h
index 9ccbf69..0c5f2d9 100644
--- a/Eigen/src/Core/Redux.h
+++ b/Eigen/src/Core/Redux.h
@@ -14,7 +14,7 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
@@ -23,58 +23,51 @@
 //  * factorize code
 
 /***************************************************************************
-* Part 1 : the logic deciding a strategy for vectorization and unrolling
-***************************************************************************/
+ * Part 1 : the logic deciding a strategy for vectorization and unrolling
+ ***************************************************************************/
 
-template<typename Func, typename Evaluator>
-struct redux_traits
-{
-public:
-    typedef typename find_best_packet<typename Evaluator::Scalar,Evaluator::SizeAtCompileTime>::type PacketType;
+template <typename Func, typename Evaluator>
+struct redux_traits {
+ public:
+  typedef typename find_best_packet<typename Evaluator::Scalar, Evaluator::SizeAtCompileTime>::type PacketType;
   enum {
     PacketSize = unpacket_traits<PacketType>::size,
-    InnerMaxSize = int(Evaluator::IsRowMajor)
-                 ? Evaluator::MaxColsAtCompileTime
-                 : Evaluator::MaxRowsAtCompileTime,
-    OuterMaxSize = int(Evaluator::IsRowMajor)
-                 ? Evaluator::MaxRowsAtCompileTime
-                 : Evaluator::MaxColsAtCompileTime,
-    SliceVectorizedWork = int(InnerMaxSize)==Dynamic ? Dynamic
-                        : int(OuterMaxSize)==Dynamic ? (int(InnerMaxSize)>=int(PacketSize) ? Dynamic : 0)
-                        : (int(InnerMaxSize)/int(PacketSize)) * int(OuterMaxSize)
+    InnerMaxSize = int(Evaluator::IsRowMajor) ? Evaluator::MaxColsAtCompileTime : Evaluator::MaxRowsAtCompileTime,
+    OuterMaxSize = int(Evaluator::IsRowMajor) ? Evaluator::MaxRowsAtCompileTime : Evaluator::MaxColsAtCompileTime,
+    SliceVectorizedWork = int(InnerMaxSize) == Dynamic   ? Dynamic
+                          : int(OuterMaxSize) == Dynamic ? (int(InnerMaxSize) >= int(PacketSize) ? Dynamic : 0)
+                                                         : (int(InnerMaxSize) / int(PacketSize)) * int(OuterMaxSize)
   };
 
   enum {
     MayLinearize = (int(Evaluator::Flags) & LinearAccessBit),
-    MightVectorize = (int(Evaluator::Flags)&ActualPacketAccessBit)
-                  && (functor_traits<Func>::PacketAccess),
+    MightVectorize = (int(Evaluator::Flags) & ActualPacketAccessBit) && (functor_traits<Func>::PacketAccess),
     MayLinearVectorize = bool(MightVectorize) && bool(MayLinearize),
-    MaySliceVectorize  = bool(MightVectorize) && (int(SliceVectorizedWork)==Dynamic || int(SliceVectorizedWork)>=3)
+    MaySliceVectorize = bool(MightVectorize) && (int(SliceVectorizedWork) == Dynamic || int(SliceVectorizedWork) >= 3)
   };
 
-public:
+ public:
   enum {
-    Traversal = int(MayLinearVectorize) ? int(LinearVectorizedTraversal)
-              : int(MaySliceVectorize)  ? int(SliceVectorizedTraversal)
-              : int(MayLinearize)       ? int(LinearTraversal)
-                                        : int(DefaultTraversal)
+    Traversal = int(MayLinearVectorize)  ? int(LinearVectorizedTraversal)
+                : int(MaySliceVectorize) ? int(SliceVectorizedTraversal)
+                : int(MayLinearize)      ? int(LinearTraversal)
+                                         : int(DefaultTraversal)
   };
 
-public:
+ public:
   enum {
-    Cost = Evaluator::SizeAtCompileTime == Dynamic ? HugeCost
-         : int(Evaluator::SizeAtCompileTime) * int(Evaluator::CoeffReadCost) + (Evaluator::SizeAtCompileTime-1) * functor_traits<Func>::Cost,
+    Cost = Evaluator::SizeAtCompileTime == Dynamic
+               ? HugeCost
+               : int(Evaluator::SizeAtCompileTime) * int(Evaluator::CoeffReadCost) +
+                     (Evaluator::SizeAtCompileTime - 1) * functor_traits<Func>::Cost,
     UnrollingLimit = EIGEN_UNROLLING_LIMIT * (int(Traversal) == int(DefaultTraversal) ? 1 : int(PacketSize))
   };
 
-public:
-  enum {
-    Unrolling = Cost <= UnrollingLimit ? CompleteUnrolling : NoUnrolling
-  };
-  
+ public:
+  enum { Unrolling = Cost <= UnrollingLimit ? CompleteUnrolling : NoUnrolling };
+
 #ifdef EIGEN_DEBUG_ASSIGN
-  static void debug()
-  {
+  static void debug() {
     std::cerr << "Xpr: " << typeid(typename Evaluator::XprType).name() << std::endl;
     std::cerr.setf(std::ios::hex, std::ios::basefield);
     EIGEN_DEBUG_VAR(Evaluator::Flags)
@@ -86,46 +79,42 @@
     EIGEN_DEBUG_VAR(MightVectorize)
     EIGEN_DEBUG_VAR(MayLinearVectorize)
     EIGEN_DEBUG_VAR(MaySliceVectorize)
-    std::cerr << "Traversal" << " = " << Traversal << " (" << demangle_traversal(Traversal) << ")" << std::endl;
+    std::cerr << "Traversal"
+              << " = " << Traversal << " (" << demangle_traversal(Traversal) << ")" << std::endl;
     EIGEN_DEBUG_VAR(UnrollingLimit)
-    std::cerr << "Unrolling" << " = " << Unrolling << " (" << demangle_unrolling(Unrolling) << ")" << std::endl;
+    std::cerr << "Unrolling"
+              << " = " << Unrolling << " (" << demangle_unrolling(Unrolling) << ")" << std::endl;
     std::cerr << std::endl;
   }
 #endif
 };
 
 /***************************************************************************
-* Part 2 : unrollers
-***************************************************************************/
+ * Part 2 : unrollers
+ ***************************************************************************/
 
 /*** no vectorization ***/
 
-template<typename Func, typename Evaluator, Index Start, Index Length>
-struct redux_novec_unroller
-{
-  static constexpr Index HalfLength = Length/2;
+template <typename Func, typename Evaluator, Index Start, Index Length>
+struct redux_novec_unroller {
+  static constexpr Index HalfLength = Length / 2;
 
   typedef typename Evaluator::Scalar Scalar;
 
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE Scalar run(const Evaluator &eval, const Func& func)
-  {
-    return func(redux_novec_unroller<Func, Evaluator, Start, HalfLength>::run(eval,func),
-                redux_novec_unroller<Func, Evaluator, Start+HalfLength, Length-HalfLength>::run(eval,func));
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator& eval, const Func& func) {
+    return func(redux_novec_unroller<Func, Evaluator, Start, HalfLength>::run(eval, func),
+                redux_novec_unroller<Func, Evaluator, Start + HalfLength, Length - HalfLength>::run(eval, func));
   }
 };
 
-template<typename Func, typename Evaluator, Index Start>
-struct redux_novec_unroller<Func, Evaluator, Start, 1>
-{
+template <typename Func, typename Evaluator, Index Start>
+struct redux_novec_unroller<Func, Evaluator, Start, 1> {
   static constexpr Index outer = Start / Evaluator::InnerSizeAtCompileTime;
   static constexpr Index inner = Start % Evaluator::InnerSizeAtCompileTime;
 
   typedef typename Evaluator::Scalar Scalar;
 
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE Scalar run(const Evaluator &eval, const Func&)
-  {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator& eval, const Func&) {
     return eval.coeffByOuterInner(outer, inner);
   }
 };
@@ -133,37 +122,29 @@
 // This is actually dead code and will never be called. It is required
 // to prevent false warnings regarding failed inlining though
 // for 0 length run() will never be called at all.
-template<typename Func, typename Evaluator, Index Start>
-struct redux_novec_unroller<Func, Evaluator, Start, 0>
-{
+template <typename Func, typename Evaluator, Index Start>
+struct redux_novec_unroller<Func, Evaluator, Start, 0> {
   typedef typename Evaluator::Scalar Scalar;
-  EIGEN_DEVICE_FUNC 
-  static EIGEN_STRONG_INLINE Scalar run(const Evaluator&, const Func&) { return Scalar(); }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator&, const Func&) { return Scalar(); }
 };
 
-template<typename Func, typename Evaluator, Index Start, Index Length>
-struct redux_novec_linear_unroller
-{
-  static constexpr Index HalfLength = Length/2;
+template <typename Func, typename Evaluator, Index Start, Index Length>
+struct redux_novec_linear_unroller {
+  static constexpr Index HalfLength = Length / 2;
 
   typedef typename Evaluator::Scalar Scalar;
 
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE Scalar run(const Evaluator &eval, const Func& func)
-  {
-    return func(redux_novec_linear_unroller<Func, Evaluator, Start, HalfLength>::run(eval,func),
-                redux_novec_linear_unroller<Func, Evaluator, Start+HalfLength, Length-HalfLength>::run(eval,func));
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator& eval, const Func& func) {
+    return func(redux_novec_linear_unroller<Func, Evaluator, Start, HalfLength>::run(eval, func),
+                redux_novec_linear_unroller<Func, Evaluator, Start + HalfLength, Length - HalfLength>::run(eval, func));
   }
 };
 
-template<typename Func, typename Evaluator, Index Start>
-struct redux_novec_linear_unroller<Func, Evaluator, Start, 1>
-{
+template <typename Func, typename Evaluator, Index Start>
+struct redux_novec_linear_unroller<Func, Evaluator, Start, 1> {
   typedef typename Evaluator::Scalar Scalar;
 
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE Scalar run(const Evaluator &eval, const Func&)
-  {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator& eval, const Func&) {
     return eval.coeff(Start);
   }
 };
@@ -171,203 +152,171 @@
 // This is actually dead code and will never be called. It is required
 // to prevent false warnings regarding failed inlining though
 // for 0 length run() will never be called at all.
-template<typename Func, typename Evaluator, Index Start>
-struct redux_novec_linear_unroller<Func, Evaluator, Start, 0>
-{
+template <typename Func, typename Evaluator, Index Start>
+struct redux_novec_linear_unroller<Func, Evaluator, Start, 0> {
   typedef typename Evaluator::Scalar Scalar;
-  EIGEN_DEVICE_FUNC 
-  static EIGEN_STRONG_INLINE Scalar run(const Evaluator&, const Func&) { return Scalar(); }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator&, const Func&) { return Scalar(); }
 };
 
 /*** vectorization ***/
 
-template<typename Func, typename Evaluator, Index Start, Index Length>
-struct redux_vec_unroller
-{
-  template<typename PacketType>
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE PacketType run(const Evaluator &eval, const Func& func)
-  {
-    constexpr Index HalfLength = Length/2;
+template <typename Func, typename Evaluator, Index Start, Index Length>
+struct redux_vec_unroller {
+  template <typename PacketType>
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE PacketType run(const Evaluator& eval, const Func& func) {
+    constexpr Index HalfLength = Length / 2;
 
     return func.packetOp(
-            redux_vec_unroller<Func, Evaluator, Start, HalfLength>::template run<PacketType>(eval,func),
-            redux_vec_unroller<Func, Evaluator, Start+HalfLength, Length-HalfLength>::template run<PacketType>(eval,func) );
+        redux_vec_unroller<Func, Evaluator, Start, HalfLength>::template run<PacketType>(eval, func),
+        redux_vec_unroller<Func, Evaluator, Start + HalfLength, Length - HalfLength>::template run<PacketType>(eval,
+                                                                                                               func));
   }
 };
 
-template<typename Func, typename Evaluator, Index Start>
-struct redux_vec_unroller<Func, Evaluator, Start, 1>
-{
-  template<typename PacketType>
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE PacketType run(const Evaluator &eval, const Func&)
-  {
+template <typename Func, typename Evaluator, Index Start>
+struct redux_vec_unroller<Func, Evaluator, Start, 1> {
+  template <typename PacketType>
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE PacketType run(const Evaluator& eval, const Func&) {
     constexpr Index PacketSize = unpacket_traits<PacketType>::size;
     constexpr Index index = Start * PacketSize;
     constexpr Index outer = index / int(Evaluator::InnerSizeAtCompileTime);
     constexpr Index inner = index % int(Evaluator::InnerSizeAtCompileTime);
     constexpr int alignment = Evaluator::Alignment;
 
-    return eval.template packetByOuterInner<alignment,PacketType>(outer, inner);
+    return eval.template packetByOuterInner<alignment, PacketType>(outer, inner);
   }
 };
 
-template<typename Func, typename Evaluator, Index Start, Index Length>
-struct redux_vec_linear_unroller
-{
-  template<typename PacketType>
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE PacketType run(const Evaluator &eval, const Func& func)
-  {
-    constexpr Index HalfLength = Length/2;
+template <typename Func, typename Evaluator, Index Start, Index Length>
+struct redux_vec_linear_unroller {
+  template <typename PacketType>
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE PacketType run(const Evaluator& eval, const Func& func) {
+    constexpr Index HalfLength = Length / 2;
 
     return func.packetOp(
-            redux_vec_linear_unroller<Func, Evaluator, Start, HalfLength>::template run<PacketType>(eval,func),
-            redux_vec_linear_unroller<Func, Evaluator, Start+HalfLength, Length-HalfLength>::template run<PacketType>(eval,func) );
+        redux_vec_linear_unroller<Func, Evaluator, Start, HalfLength>::template run<PacketType>(eval, func),
+        redux_vec_linear_unroller<Func, Evaluator, Start + HalfLength, Length - HalfLength>::template run<PacketType>(
+            eval, func));
   }
 };
 
-template<typename Func, typename Evaluator, Index Start>
-struct redux_vec_linear_unroller<Func, Evaluator, Start, 1>
-{
-  template<typename PacketType>
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE PacketType run(const Evaluator &eval, const Func&)
-  {
+template <typename Func, typename Evaluator, Index Start>
+struct redux_vec_linear_unroller<Func, Evaluator, Start, 1> {
+  template <typename PacketType>
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE PacketType run(const Evaluator& eval, const Func&) {
     constexpr Index PacketSize = unpacket_traits<PacketType>::size;
     constexpr Index index = (Start * PacketSize);
     constexpr int alignment = Evaluator::Alignment;
-    return eval.template packet<alignment,PacketType>(index);
+    return eval.template packet<alignment, PacketType>(index);
   }
 };
 
 /***************************************************************************
-* Part 3 : implementation of all cases
-***************************************************************************/
+ * Part 3 : implementation of all cases
+ ***************************************************************************/
 
-template<typename Func, typename Evaluator,
-         int Traversal = redux_traits<Func, Evaluator>::Traversal,
-         int Unrolling = redux_traits<Func, Evaluator>::Unrolling
->
+template <typename Func, typename Evaluator, int Traversal = redux_traits<Func, Evaluator>::Traversal,
+          int Unrolling = redux_traits<Func, Evaluator>::Unrolling>
 struct redux_impl;
 
-template<typename Func, typename Evaluator>
-struct redux_impl<Func, Evaluator, DefaultTraversal, NoUnrolling>
-{
+template <typename Func, typename Evaluator>
+struct redux_impl<Func, Evaluator, DefaultTraversal, NoUnrolling> {
   typedef typename Evaluator::Scalar Scalar;
 
-  template<typename XprType>
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE
-  Scalar run(const Evaluator &eval, const Func& func, const XprType& xpr)
-  {
-    eigen_assert(xpr.rows()>0 && xpr.cols()>0 && "you are using an empty matrix");
+  template <typename XprType>
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator& eval, const Func& func, const XprType& xpr) {
+    eigen_assert(xpr.rows() > 0 && xpr.cols() > 0 && "you are using an empty matrix");
     Scalar res = eval.coeffByOuterInner(0, 0);
-    for(Index i = 1; i < xpr.innerSize(); ++i)
-      res = func(res, eval.coeffByOuterInner(0, i));
-    for(Index i = 1; i < xpr.outerSize(); ++i)
-      for(Index j = 0; j < xpr.innerSize(); ++j)
-        res = func(res, eval.coeffByOuterInner(i, j));
+    for (Index i = 1; i < xpr.innerSize(); ++i) res = func(res, eval.coeffByOuterInner(0, i));
+    for (Index i = 1; i < xpr.outerSize(); ++i)
+      for (Index j = 0; j < xpr.innerSize(); ++j) res = func(res, eval.coeffByOuterInner(i, j));
     return res;
   }
 };
 
-template<typename Func, typename Evaluator>
-struct redux_impl<Func, Evaluator, LinearTraversal, NoUnrolling>
-{
+template <typename Func, typename Evaluator>
+struct redux_impl<Func, Evaluator, LinearTraversal, NoUnrolling> {
   typedef typename Evaluator::Scalar Scalar;
 
-  template<typename XprType>
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE
-  Scalar run(const Evaluator &eval, const Func& func, const XprType& xpr)
-  {
-    eigen_assert(xpr.size()>0 && "you are using an empty matrix");
+  template <typename XprType>
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator& eval, const Func& func, const XprType& xpr) {
+    eigen_assert(xpr.size() > 0 && "you are using an empty matrix");
     Scalar res = eval.coeff(0);
-    for(Index k = 1; k < xpr.size(); ++k)
-      res = func(res, eval.coeff(k));
+    for (Index k = 1; k < xpr.size(); ++k) res = func(res, eval.coeff(k));
     return res;
   }
 };
 
-template<typename Func, typename Evaluator>
-struct redux_impl<Func,Evaluator, DefaultTraversal, CompleteUnrolling>
-  : redux_novec_unroller<Func,Evaluator, 0, Evaluator::SizeAtCompileTime>
-{
-  typedef redux_novec_unroller<Func,Evaluator, 0, Evaluator::SizeAtCompileTime> Base;
+template <typename Func, typename Evaluator>
+struct redux_impl<Func, Evaluator, DefaultTraversal, CompleteUnrolling>
+    : redux_novec_unroller<Func, Evaluator, 0, Evaluator::SizeAtCompileTime> {
+  typedef redux_novec_unroller<Func, Evaluator, 0, Evaluator::SizeAtCompileTime> Base;
   typedef typename Evaluator::Scalar Scalar;
-  template<typename XprType>
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE
-  Scalar run(const Evaluator &eval, const Func& func, const XprType& /*xpr*/)
-  {
-    return Base::run(eval,func);
+  template <typename XprType>
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator& eval, const Func& func,
+                                                          const XprType& /*xpr*/) {
+    return Base::run(eval, func);
   }
 };
 
-template<typename Func, typename Evaluator>
-struct redux_impl<Func,Evaluator, LinearTraversal, CompleteUnrolling>
-  : redux_novec_linear_unroller<Func,Evaluator, 0, Evaluator::SizeAtCompileTime>
-{
-  typedef redux_novec_linear_unroller<Func,Evaluator, 0, Evaluator::SizeAtCompileTime> Base;
+template <typename Func, typename Evaluator>
+struct redux_impl<Func, Evaluator, LinearTraversal, CompleteUnrolling>
+    : redux_novec_linear_unroller<Func, Evaluator, 0, Evaluator::SizeAtCompileTime> {
+  typedef redux_novec_linear_unroller<Func, Evaluator, 0, Evaluator::SizeAtCompileTime> Base;
   typedef typename Evaluator::Scalar Scalar;
-  template<typename XprType>
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE
-  Scalar run(const Evaluator &eval, const Func& func, const XprType& /*xpr*/)
-  {
-    return Base::run(eval,func);
+  template <typename XprType>
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator& eval, const Func& func,
+                                                          const XprType& /*xpr*/) {
+    return Base::run(eval, func);
   }
 };
 
-template<typename Func, typename Evaluator>
-struct redux_impl<Func, Evaluator, LinearVectorizedTraversal, NoUnrolling>
-{
+template <typename Func, typename Evaluator>
+struct redux_impl<Func, Evaluator, LinearVectorizedTraversal, NoUnrolling> {
   typedef typename Evaluator::Scalar Scalar;
   typedef typename redux_traits<Func, Evaluator>::PacketType PacketScalar;
 
-  template<typename XprType>
-  static Scalar run(const Evaluator &eval, const Func& func, const XprType& xpr)
-  {
+  template <typename XprType>
+  static Scalar run(const Evaluator& eval, const Func& func, const XprType& xpr) {
     const Index size = xpr.size();
-    
+
     constexpr Index packetSize = redux_traits<Func, Evaluator>::PacketSize;
     constexpr int packetAlignment = unpacket_traits<PacketScalar>::alignment;
-    constexpr int alignment0 = (bool(Evaluator::Flags & DirectAccessBit) && bool(packet_traits<Scalar>::AlignedOnScalar)) ? int(packetAlignment) : int(Unaligned);
+    constexpr int alignment0 =
+        (bool(Evaluator::Flags & DirectAccessBit) && bool(packet_traits<Scalar>::AlignedOnScalar))
+            ? int(packetAlignment)
+            : int(Unaligned);
     constexpr int alignment = plain_enum_max(alignment0, Evaluator::Alignment);
     const Index alignedStart = internal::first_default_aligned(xpr);
-    const Index alignedSize2 = ((size-alignedStart)/(2*packetSize))*(2*packetSize);
-    const Index alignedSize = ((size-alignedStart)/(packetSize))*(packetSize);
+    const Index alignedSize2 = ((size - alignedStart) / (2 * packetSize)) * (2 * packetSize);
+    const Index alignedSize = ((size - alignedStart) / (packetSize)) * (packetSize);
     const Index alignedEnd2 = alignedStart + alignedSize2;
-    const Index alignedEnd  = alignedStart + alignedSize;
+    const Index alignedEnd = alignedStart + alignedSize;
     Scalar res;
-    if(alignedSize)
-    {
-      PacketScalar packet_res0 = eval.template packet<alignment,PacketScalar>(alignedStart);
-      if(alignedSize>packetSize) // we have at least two packets to partly unroll the loop
+    if (alignedSize) {
+      PacketScalar packet_res0 = eval.template packet<alignment, PacketScalar>(alignedStart);
+      if (alignedSize > packetSize)  // we have at least two packets to partly unroll the loop
       {
-        PacketScalar packet_res1 = eval.template packet<alignment,PacketScalar>(alignedStart+packetSize);
-        for(Index index = alignedStart + 2*packetSize; index < alignedEnd2; index += 2*packetSize)
-        {
-          packet_res0 = func.packetOp(packet_res0, eval.template packet<alignment,PacketScalar>(index));
-          packet_res1 = func.packetOp(packet_res1, eval.template packet<alignment,PacketScalar>(index+packetSize));
+        PacketScalar packet_res1 = eval.template packet<alignment, PacketScalar>(alignedStart + packetSize);
+        for (Index index = alignedStart + 2 * packetSize; index < alignedEnd2; index += 2 * packetSize) {
+          packet_res0 = func.packetOp(packet_res0, eval.template packet<alignment, PacketScalar>(index));
+          packet_res1 = func.packetOp(packet_res1, eval.template packet<alignment, PacketScalar>(index + packetSize));
         }
 
-        packet_res0 = func.packetOp(packet_res0,packet_res1);
-        if(alignedEnd>alignedEnd2)
-          packet_res0 = func.packetOp(packet_res0, eval.template packet<alignment,PacketScalar>(alignedEnd2));
+        packet_res0 = func.packetOp(packet_res0, packet_res1);
+        if (alignedEnd > alignedEnd2)
+          packet_res0 = func.packetOp(packet_res0, eval.template packet<alignment, PacketScalar>(alignedEnd2));
       }
       res = func.predux(packet_res0);
 
-      for(Index index = 0; index < alignedStart; ++index)
-        res = func(res,eval.coeff(index));
+      for (Index index = 0; index < alignedStart; ++index) res = func(res, eval.coeff(index));
 
-      for(Index index = alignedEnd; index < size; ++index)
-        res = func(res,eval.coeff(index));
-    }
-    else // too small to vectorize anything.
-         // since this is dynamic-size hence inefficient anyway for such small sizes, don't try to optimize.
+      for (Index index = alignedEnd; index < size; ++index) res = func(res, eval.coeff(index));
+    } else  // too small to vectorize anything.
+            // since this is dynamic-size hence inefficient anyway for such small sizes, don't try to optimize.
     {
       res = eval.coeff(0);
-      for(Index index = 1; index < size; ++index)
-        res = func(res,eval.coeff(index));
+      for (Index index = 1; index < size; ++index) res = func(res, eval.coeff(index));
     }
 
     return res;
@@ -375,35 +324,30 @@
 };
 
 // NOTE: for SliceVectorizedTraversal we simply bypass unrolling
-template<typename Func, typename Evaluator, int Unrolling>
-struct redux_impl<Func, Evaluator, SliceVectorizedTraversal, Unrolling>
-{
+template <typename Func, typename Evaluator, int Unrolling>
+struct redux_impl<Func, Evaluator, SliceVectorizedTraversal, Unrolling> {
   typedef typename Evaluator::Scalar Scalar;
   typedef typename redux_traits<Func, Evaluator>::PacketType PacketType;
 
-  template<typename XprType>
-  EIGEN_DEVICE_FUNC static Scalar run(const Evaluator &eval, const Func& func, const XprType& xpr)
-  {
-    eigen_assert(xpr.rows()>0 && xpr.cols()>0 && "you are using an empty matrix");
+  template <typename XprType>
+  EIGEN_DEVICE_FUNC static Scalar run(const Evaluator& eval, const Func& func, const XprType& xpr) {
+    eigen_assert(xpr.rows() > 0 && xpr.cols() > 0 && "you are using an empty matrix");
     constexpr Index packetSize = redux_traits<Func, Evaluator>::PacketSize;
     const Index innerSize = xpr.innerSize();
     const Index outerSize = xpr.outerSize();
-    const Index packetedInnerSize = ((innerSize)/packetSize)*packetSize;
+    const Index packetedInnerSize = ((innerSize) / packetSize) * packetSize;
     Scalar res;
-    if(packetedInnerSize)
-    {
-      PacketType packet_res = eval.template packet<Unaligned,PacketType>(0,0);
-      for(Index j=0; j<outerSize; ++j)
-        for(Index i=(j==0?packetSize:0); i<packetedInnerSize; i+=Index(packetSize))
-          packet_res = func.packetOp(packet_res, eval.template packetByOuterInner<Unaligned,PacketType>(j,i));
+    if (packetedInnerSize) {
+      PacketType packet_res = eval.template packet<Unaligned, PacketType>(0, 0);
+      for (Index j = 0; j < outerSize; ++j)
+        for (Index i = (j == 0 ? packetSize : 0); i < packetedInnerSize; i += Index(packetSize))
+          packet_res = func.packetOp(packet_res, eval.template packetByOuterInner<Unaligned, PacketType>(j, i));
 
       res = func.predux(packet_res);
-      for(Index j=0; j<outerSize; ++j)
-        for(Index i=packetedInnerSize; i<innerSize; ++i)
-          res = func(res, eval.coeffByOuterInner(j,i));
-    }
-    else // too small to vectorize anything.
-         // since this is dynamic-size hence inefficient anyway for such small sizes, don't try to optimize.
+      for (Index j = 0; j < outerSize; ++j)
+        for (Index i = packetedInnerSize; i < innerSize; ++i) res = func(res, eval.coeffByOuterInner(j, i));
+    } else  // too small to vectorize anything.
+            // since this is dynamic-size hence inefficient anyway for such small sizes, don't try to optimize.
     {
       res = redux_impl<Func, Evaluator, DefaultTraversal, NoUnrolling>::run(eval, func, xpr);
     }
@@ -412,192 +356,173 @@
   }
 };
 
-template<typename Func, typename Evaluator>
-struct redux_impl<Func, Evaluator, LinearVectorizedTraversal, CompleteUnrolling>
-{
+template <typename Func, typename Evaluator>
+struct redux_impl<Func, Evaluator, LinearVectorizedTraversal, CompleteUnrolling> {
   typedef typename Evaluator::Scalar Scalar;
 
   typedef typename redux_traits<Func, Evaluator>::PacketType PacketType;
   static constexpr Index PacketSize = redux_traits<Func, Evaluator>::PacketSize;
-  static constexpr Index  Size = Evaluator::SizeAtCompileTime;
-  static constexpr Index  VectorizedSize = (int(Size) / int(PacketSize)) * int(PacketSize);
+  static constexpr Index Size = Evaluator::SizeAtCompileTime;
+  static constexpr Index VectorizedSize = (int(Size) / int(PacketSize)) * int(PacketSize);
 
-  template<typename XprType>
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE
-  Scalar run(const Evaluator &eval, const Func& func, const XprType &xpr)
-  {
+  template <typename XprType>
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator& eval, const Func& func, const XprType& xpr) {
     EIGEN_ONLY_USED_FOR_DEBUG(xpr)
-    eigen_assert(xpr.rows()>0 && xpr.cols()>0 && "you are using an empty matrix");
+    eigen_assert(xpr.rows() > 0 && xpr.cols() > 0 && "you are using an empty matrix");
     if (VectorizedSize > 0) {
-      Scalar res = func.predux(redux_vec_linear_unroller<Func, Evaluator, 0, Size / PacketSize>::template run<PacketType>(eval,func));
+      Scalar res = func.predux(
+          redux_vec_linear_unroller<Func, Evaluator, 0, Size / PacketSize>::template run<PacketType>(eval, func));
       if (VectorizedSize != Size)
-        res = func(res,redux_novec_linear_unroller<Func, Evaluator, VectorizedSize, Size-VectorizedSize>::run(eval,func));
+        res = func(
+            res, redux_novec_linear_unroller<Func, Evaluator, VectorizedSize, Size - VectorizedSize>::run(eval, func));
       return res;
-    }
-    else {
-      return redux_novec_linear_unroller<Func, Evaluator, 0, Size>::run(eval,func);
+    } else {
+      return redux_novec_linear_unroller<Func, Evaluator, 0, Size>::run(eval, func);
     }
   }
 };
 
 // evaluator adaptor
-template<typename XprType_>
-class redux_evaluator : public internal::evaluator<XprType_>
-{
+template <typename XprType_>
+class redux_evaluator : public internal::evaluator<XprType_> {
   typedef internal::evaluator<XprType_> Base;
-public:
+
+ public:
   typedef XprType_ XprType;
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  explicit redux_evaluator(const XprType &xpr) : Base(xpr) {}
-  
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit redux_evaluator(const XprType& xpr) : Base(xpr) {}
+
   typedef typename XprType::Scalar Scalar;
   typedef typename XprType::CoeffReturnType CoeffReturnType;
   typedef typename XprType::PacketScalar PacketScalar;
-  
+
   enum {
     MaxRowsAtCompileTime = XprType::MaxRowsAtCompileTime,
     MaxColsAtCompileTime = XprType::MaxColsAtCompileTime,
-    // TODO we should not remove DirectAccessBit and rather find an elegant way to query the alignment offset at runtime from the evaluator
+    // TODO we should not remove DirectAccessBit and rather find an elegant way to query the alignment offset at runtime
+    // from the evaluator
     Flags = Base::Flags & ~DirectAccessBit,
     IsRowMajor = XprType::IsRowMajor,
     SizeAtCompileTime = XprType::SizeAtCompileTime,
     InnerSizeAtCompileTime = XprType::InnerSizeAtCompileTime
   };
-  
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  CoeffReturnType coeffByOuterInner(Index outer, Index inner) const
-  { return Base::coeff(IsRowMajor ? outer : inner, IsRowMajor ? inner : outer); }
-  
-  template<int LoadMode, typename PacketType>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  PacketType packetByOuterInner(Index outer, Index inner) const
-  { return Base::template packet<LoadMode,PacketType>(IsRowMajor ? outer : inner, IsRowMajor ? inner : outer); }
-  
+
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeffByOuterInner(Index outer, Index inner) const {
+    return Base::coeff(IsRowMajor ? outer : inner, IsRowMajor ? inner : outer);
+  }
+
+  template <int LoadMode, typename PacketType>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketType packetByOuterInner(Index outer, Index inner) const {
+    return Base::template packet<LoadMode, PacketType>(IsRowMajor ? outer : inner, IsRowMajor ? inner : outer);
+  }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /***************************************************************************
-* Part 4 : public API
-***************************************************************************/
-
+ * Part 4 : public API
+ ***************************************************************************/
 
 /** \returns the result of a full redux operation on the whole matrix or vector using \a func
-  *
-  * The template parameter \a BinaryOp is the type of the functor \a func which must be
-  * an associative operator. Both current C++98 and C++11 functor styles are handled.
-  *
-  * \warning the matrix must be not empty, otherwise an assertion is triggered.
-  *
-  * \sa DenseBase::sum(), DenseBase::minCoeff(), DenseBase::maxCoeff(), MatrixBase::colwise(), MatrixBase::rowwise()
-  */
-template<typename Derived>
-template<typename Func>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar
-DenseBase<Derived>::redux(const Func& func) const
-{
-  eigen_assert(this->rows()>0 && this->cols()>0 && "you are using an empty matrix");
+ *
+ * The template parameter \a BinaryOp is the type of the functor \a func which must be
+ * an associative operator. Both current C++98 and C++11 functor styles are handled.
+ *
+ * \warning the matrix must be not empty, otherwise an assertion is triggered.
+ *
+ * \sa DenseBase::sum(), DenseBase::minCoeff(), DenseBase::maxCoeff(), MatrixBase::colwise(), MatrixBase::rowwise()
+ */
+template <typename Derived>
+template <typename Func>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar DenseBase<Derived>::redux(
+    const Func& func) const {
+  eigen_assert(this->rows() > 0 && this->cols() > 0 && "you are using an empty matrix");
 
   typedef typename internal::redux_evaluator<Derived> ThisEvaluator;
   ThisEvaluator thisEval(derived());
 
   // The initial expression is passed to the reducer as an additional argument instead of
-  // passing it as a member of redux_evaluator to help  
+  // passing it as a member of redux_evaluator to help
   return internal::redux_impl<Func, ThisEvaluator>::run(thisEval, func, derived());
 }
 
 /** \returns the minimum of all coefficients of \c *this.
-  * In case \c *this contains NaN, NaNPropagation determines the behavior:
-  *   NaNPropagation == PropagateFast : undefined
-  *   NaNPropagation == PropagateNaN : result is NaN
-  *   NaNPropagation == PropagateNumbers : result is minimum of elements that are not NaN
-  * \warning the matrix must be not empty, otherwise an assertion is triggered.
-  */
-template<typename Derived>
-template<int NaNPropagation>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar
-DenseBase<Derived>::minCoeff() const
-{
-  return derived().redux(Eigen::internal::scalar_min_op<Scalar,Scalar, NaNPropagation>());
+ * In case \c *this contains NaN, NaNPropagation determines the behavior:
+ *   NaNPropagation == PropagateFast : undefined
+ *   NaNPropagation == PropagateNaN : result is NaN
+ *   NaNPropagation == PropagateNumbers : result is minimum of elements that are not NaN
+ * \warning the matrix must be not empty, otherwise an assertion is triggered.
+ */
+template <typename Derived>
+template <int NaNPropagation>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar DenseBase<Derived>::minCoeff() const {
+  return derived().redux(Eigen::internal::scalar_min_op<Scalar, Scalar, NaNPropagation>());
 }
 
-/** \returns the maximum of all coefficients of \c *this. 
-  * In case \c *this contains NaN, NaNPropagation determines the behavior:
-  *   NaNPropagation == PropagateFast : undefined
-  *   NaNPropagation == PropagateNaN : result is NaN
-  *   NaNPropagation == PropagateNumbers : result is maximum of elements that are not NaN
-  * \warning the matrix must be not empty, otherwise an assertion is triggered.
-  */
-template<typename Derived>
-template<int NaNPropagation>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar
-DenseBase<Derived>::maxCoeff() const
-{
-  return derived().redux(Eigen::internal::scalar_max_op<Scalar,Scalar, NaNPropagation>());
+/** \returns the maximum of all coefficients of \c *this.
+ * In case \c *this contains NaN, NaNPropagation determines the behavior:
+ *   NaNPropagation == PropagateFast : undefined
+ *   NaNPropagation == PropagateNaN : result is NaN
+ *   NaNPropagation == PropagateNumbers : result is maximum of elements that are not NaN
+ * \warning the matrix must be not empty, otherwise an assertion is triggered.
+ */
+template <typename Derived>
+template <int NaNPropagation>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar DenseBase<Derived>::maxCoeff() const {
+  return derived().redux(Eigen::internal::scalar_max_op<Scalar, Scalar, NaNPropagation>());
 }
 
 /** \returns the sum of all coefficients of \c *this
-  *
-  * If \c *this is empty, then the value 0 is returned.
-  *
-  * \sa trace(), prod(), mean()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar
-DenseBase<Derived>::sum() const
-{
-  if(SizeAtCompileTime==0 || (SizeAtCompileTime==Dynamic && size()==0))
-    return Scalar(0);
-  return derived().redux(Eigen::internal::scalar_sum_op<Scalar,Scalar>());
+ *
+ * If \c *this is empty, then the value 0 is returned.
+ *
+ * \sa trace(), prod(), mean()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar DenseBase<Derived>::sum() const {
+  if (SizeAtCompileTime == 0 || (SizeAtCompileTime == Dynamic && size() == 0)) return Scalar(0);
+  return derived().redux(Eigen::internal::scalar_sum_op<Scalar, Scalar>());
 }
 
 /** \returns the mean of all coefficients of *this
-*
-* \sa trace(), prod(), sum()
-*/
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar
-DenseBase<Derived>::mean() const
-{
+ *
+ * \sa trace(), prod(), sum()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar DenseBase<Derived>::mean() const {
 #ifdef __INTEL_COMPILER
-  #pragma warning push
-  #pragma warning ( disable : 2259 )
+#pragma warning push
+#pragma warning(disable : 2259)
 #endif
-  return Scalar(derived().redux(Eigen::internal::scalar_sum_op<Scalar,Scalar>())) / Scalar(this->size());
+  return Scalar(derived().redux(Eigen::internal::scalar_sum_op<Scalar, Scalar>())) / Scalar(this->size());
 #ifdef __INTEL_COMPILER
-  #pragma warning pop
+#pragma warning pop
 #endif
 }
 
 /** \returns the product of all coefficients of *this
-  *
-  * Example: \include MatrixBase_prod.cpp
-  * Output: \verbinclude MatrixBase_prod.out
-  *
-  * \sa sum(), mean(), trace()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar
-DenseBase<Derived>::prod() const
-{
-  if(SizeAtCompileTime==0 || (SizeAtCompileTime==Dynamic && size()==0))
-    return Scalar(1);
+ *
+ * Example: \include MatrixBase_prod.cpp
+ * Output: \verbinclude MatrixBase_prod.out
+ *
+ * \sa sum(), mean(), trace()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar DenseBase<Derived>::prod() const {
+  if (SizeAtCompileTime == 0 || (SizeAtCompileTime == Dynamic && size() == 0)) return Scalar(1);
   return derived().redux(Eigen::internal::scalar_product_op<Scalar>());
 }
 
 /** \returns the trace of \c *this, i.e. the sum of the coefficients on the main diagonal.
-  *
-  * \c *this can be any matrix, not necessarily square.
-  *
-  * \sa diagonal(), sum()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar
-MatrixBase<Derived>::trace() const
-{
+ *
+ * \c *this can be any matrix, not necessarily square.
+ *
+ * \sa diagonal(), sum()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar MatrixBase<Derived>::trace() const {
   return derived().diagonal().sum();
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_REDUX_H
+#endif  // EIGEN_REDUX_H
diff --git a/Eigen/src/Core/Ref.h b/Eigen/src/Core/Ref.h
index 5be39ce..129bc85 100644
--- a/Eigen/src/Core/Ref.h
+++ b/Eigen/src/Core/Ref.h
@@ -17,10 +17,9 @@
 
 namespace internal {
 
-template<typename PlainObjectType_, int Options_, typename StrideType_>
+template <typename PlainObjectType_, int Options_, typename StrideType_>
 struct traits<Ref<PlainObjectType_, Options_, StrideType_> >
-  : public traits<Map<PlainObjectType_, Options_, StrideType_> >
-{
+    : public traits<Map<PlainObjectType_, Options_, StrideType_> > {
   typedef PlainObjectType_ PlainObjectType;
   typedef StrideType_ StrideType;
   enum {
@@ -31,181 +30,165 @@
     OuterStrideAtCompileTime = traits<Map<PlainObjectType_, Options_, StrideType_> >::OuterStrideAtCompileTime
   };
 
-  template<typename Derived> struct match {
+  template <typename Derived>
+  struct match {
     enum {
       IsVectorAtCompileTime = PlainObjectType::IsVectorAtCompileTime || Derived::IsVectorAtCompileTime,
       HasDirectAccess = internal::has_direct_access<Derived>::ret,
-      StorageOrderMatch = IsVectorAtCompileTime || ((PlainObjectType::Flags&RowMajorBit)==(Derived::Flags&RowMajorBit)),
-      InnerStrideMatch = int(InnerStrideAtCompileTime)==int(Dynamic)
-                      || int(InnerStrideAtCompileTime)==int(Derived::InnerStrideAtCompileTime)
-                      || (int(InnerStrideAtCompileTime)==0 && int(Derived::InnerStrideAtCompileTime)==1),
-      OuterStrideMatch = IsVectorAtCompileTime
-                      || int(OuterStrideAtCompileTime)==int(Dynamic) || int(OuterStrideAtCompileTime)==int(Derived::OuterStrideAtCompileTime),
+      StorageOrderMatch =
+          IsVectorAtCompileTime || ((PlainObjectType::Flags & RowMajorBit) == (Derived::Flags & RowMajorBit)),
+      InnerStrideMatch = int(InnerStrideAtCompileTime) == int(Dynamic) ||
+                         int(InnerStrideAtCompileTime) == int(Derived::InnerStrideAtCompileTime) ||
+                         (int(InnerStrideAtCompileTime) == 0 && int(Derived::InnerStrideAtCompileTime) == 1),
+      OuterStrideMatch = IsVectorAtCompileTime || int(OuterStrideAtCompileTime) == int(Dynamic) ||
+                         int(OuterStrideAtCompileTime) == int(Derived::OuterStrideAtCompileTime),
       // NOTE, this indirection of evaluator<Derived>::Alignment is needed
       // to workaround a very strange bug in MSVC related to the instantiation
       // of has_*ary_operator in evaluator<CwiseNullaryOp>.
       // This line is surprisingly very sensitive. For instance, simply adding parenthesis
       // as "DerivedAlignment = (int(evaluator<Derived>::Alignment))," will make MSVC fail...
       DerivedAlignment = int(evaluator<Derived>::Alignment),
-      AlignmentMatch = (int(traits<PlainObjectType>::Alignment)==int(Unaligned)) || (DerivedAlignment >= int(Alignment)), // FIXME the first condition is not very clear, it should be replaced by the required alignment
+      AlignmentMatch = (int(traits<PlainObjectType>::Alignment) == int(Unaligned)) ||
+                       (DerivedAlignment >= int(Alignment)),  // FIXME the first condition is not very clear, it should
+                                                              // be replaced by the required alignment
       ScalarTypeMatch = internal::is_same<typename PlainObjectType::Scalar, typename Derived::Scalar>::value,
-      MatchAtCompileTime = HasDirectAccess && StorageOrderMatch && InnerStrideMatch && OuterStrideMatch && AlignmentMatch && ScalarTypeMatch
+      MatchAtCompileTime = HasDirectAccess && StorageOrderMatch && InnerStrideMatch && OuterStrideMatch &&
+                           AlignmentMatch && ScalarTypeMatch
     };
-    typedef std::conditional_t<MatchAtCompileTime,internal::true_type,internal::false_type> type;
+    typedef std::conditional_t<MatchAtCompileTime, internal::true_type, internal::false_type> type;
   };
-
 };
 
-template<typename Derived>
+template <typename Derived>
 struct traits<RefBase<Derived> > : public traits<Derived> {};
 
-}
+}  // namespace internal
 
-template<typename Derived> class RefBase
- : public MapBase<Derived>
-{
+template <typename Derived>
+class RefBase : public MapBase<Derived> {
   typedef typename internal::traits<Derived>::PlainObjectType PlainObjectType;
   typedef typename internal::traits<Derived>::StrideType StrideType;
 
-public:
-
+ public:
   typedef MapBase<Derived> Base;
   EIGEN_DENSE_PUBLIC_INTERFACE(RefBase)
 
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index innerStride() const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index innerStride() const {
     return StrideType::InnerStrideAtCompileTime != 0 ? m_stride.inner() : 1;
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index outerStride() const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index outerStride() const {
     return StrideType::OuterStrideAtCompileTime != 0 ? m_stride.outer()
-         : IsVectorAtCompileTime ? this->size()
-         : int(Flags)&RowMajorBit ? this->cols()
-         : this->rows();
+           : IsVectorAtCompileTime                   ? this->size()
+           : int(Flags) & RowMajorBit                ? this->cols()
+                                                     : this->rows();
   }
 
   EIGEN_DEVICE_FUNC RefBase()
-    : Base(0,RowsAtCompileTime==Dynamic?0:RowsAtCompileTime,ColsAtCompileTime==Dynamic?0:ColsAtCompileTime),
-      // Stride<> does not allow default ctor for Dynamic strides, so let' initialize it with dummy values:
-      m_stride(StrideType::OuterStrideAtCompileTime==Dynamic?0:StrideType::OuterStrideAtCompileTime,
-               StrideType::InnerStrideAtCompileTime==Dynamic?0:StrideType::InnerStrideAtCompileTime)
-  {}
+      : Base(0, RowsAtCompileTime == Dynamic ? 0 : RowsAtCompileTime,
+             ColsAtCompileTime == Dynamic ? 0 : ColsAtCompileTime),
+        // Stride<> does not allow default ctor for Dynamic strides, so let' initialize it with dummy values:
+        m_stride(StrideType::OuterStrideAtCompileTime == Dynamic ? 0 : StrideType::OuterStrideAtCompileTime,
+                 StrideType::InnerStrideAtCompileTime == Dynamic ? 0 : StrideType::InnerStrideAtCompileTime) {}
 
   EIGEN_INHERIT_ASSIGNMENT_OPERATORS(RefBase)
 
-protected:
-
-  typedef Stride<StrideType::OuterStrideAtCompileTime,StrideType::InnerStrideAtCompileTime> StrideBase;
+ protected:
+  typedef Stride<StrideType::OuterStrideAtCompileTime, StrideType::InnerStrideAtCompileTime> StrideBase;
 
   // Resolves inner stride if default 0.
-  static EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index resolveInnerStride(Index inner) {
-    return inner == 0 ? 1 : inner;
-  }
+  static EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index resolveInnerStride(Index inner) { return inner == 0 ? 1 : inner; }
 
   // Resolves outer stride if default 0.
-  static EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index resolveOuterStride(Index inner, Index outer, Index rows, Index cols, bool isVectorAtCompileTime, bool isRowMajor) {
+  static EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index resolveOuterStride(Index inner, Index outer, Index rows, Index cols,
+                                                                    bool isVectorAtCompileTime, bool isRowMajor) {
     return outer == 0 ? isVectorAtCompileTime ? inner * rows * cols : isRowMajor ? inner * cols : inner * rows : outer;
   }
 
   // Returns true if construction is valid, false if there is a stride mismatch,
   // and fails if there is a size mismatch.
-  template<typename Expression>
-  EIGEN_DEVICE_FUNC bool construct(Expression& expr)
-  {
+  template <typename Expression>
+  EIGEN_DEVICE_FUNC bool construct(Expression& expr) {
     // Check matrix sizes.  If this is a compile-time vector, we do allow
     // implicitly transposing.
-    EIGEN_STATIC_ASSERT(
-      EIGEN_PREDICATE_SAME_MATRIX_SIZE(PlainObjectType, Expression)
-      // If it is a vector, the transpose sizes might match.
-      || ( PlainObjectType::IsVectorAtCompileTime
-            && ((int(PlainObjectType::RowsAtCompileTime)==Eigen::Dynamic
-              || int(Expression::ColsAtCompileTime)==Eigen::Dynamic
-              || int(PlainObjectType::RowsAtCompileTime)==int(Expression::ColsAtCompileTime))
-            &&  (int(PlainObjectType::ColsAtCompileTime)==Eigen::Dynamic
-              || int(Expression::RowsAtCompileTime)==Eigen::Dynamic
-              || int(PlainObjectType::ColsAtCompileTime)==int(Expression::RowsAtCompileTime)))),
-      YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES
-    )
+    EIGEN_STATIC_ASSERT(EIGEN_PREDICATE_SAME_MATRIX_SIZE(PlainObjectType, Expression)
+                            // If it is a vector, the transpose sizes might match.
+                            || (PlainObjectType::IsVectorAtCompileTime &&
+                                ((int(PlainObjectType::RowsAtCompileTime) == Eigen::Dynamic ||
+                                  int(Expression::ColsAtCompileTime) == Eigen::Dynamic ||
+                                  int(PlainObjectType::RowsAtCompileTime) == int(Expression::ColsAtCompileTime)) &&
+                                 (int(PlainObjectType::ColsAtCompileTime) == Eigen::Dynamic ||
+                                  int(Expression::RowsAtCompileTime) == Eigen::Dynamic ||
+                                  int(PlainObjectType::ColsAtCompileTime) == int(Expression::RowsAtCompileTime)))),
+                        YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES)
 
     // Determine runtime rows and columns.
     Index rows = expr.rows();
     Index cols = expr.cols();
-    if(PlainObjectType::RowsAtCompileTime==1)
-    {
-      eigen_assert(expr.rows()==1 || expr.cols()==1);
+    if (PlainObjectType::RowsAtCompileTime == 1) {
+      eigen_assert(expr.rows() == 1 || expr.cols() == 1);
       rows = 1;
       cols = expr.size();
-    }
-    else if(PlainObjectType::ColsAtCompileTime==1)
-    {
-      eigen_assert(expr.rows()==1 || expr.cols()==1);
+    } else if (PlainObjectType::ColsAtCompileTime == 1) {
+      eigen_assert(expr.rows() == 1 || expr.cols() == 1);
       rows = expr.size();
       cols = 1;
     }
     // Verify that the sizes are valid.
-    eigen_assert(
-      (PlainObjectType::RowsAtCompileTime == Dynamic) || (PlainObjectType::RowsAtCompileTime == rows));
-    eigen_assert(
-      (PlainObjectType::ColsAtCompileTime == Dynamic) || (PlainObjectType::ColsAtCompileTime == cols));
-
+    eigen_assert((PlainObjectType::RowsAtCompileTime == Dynamic) || (PlainObjectType::RowsAtCompileTime == rows));
+    eigen_assert((PlainObjectType::ColsAtCompileTime == Dynamic) || (PlainObjectType::ColsAtCompileTime == cols));
 
     // If this is a vector, we might be transposing, which means that stride should swap.
     const bool transpose = PlainObjectType::IsVectorAtCompileTime && (rows != expr.rows());
     // If the storage format differs, we also need to swap the stride.
     const bool row_major = ((PlainObjectType::Flags)&RowMajorBit) != 0;
-    const bool expr_row_major = (Expression::Flags&RowMajorBit) != 0;
-    const bool storage_differs =  (row_major != expr_row_major);
+    const bool expr_row_major = (Expression::Flags & RowMajorBit) != 0;
+    const bool storage_differs = (row_major != expr_row_major);
 
     const bool swap_stride = (transpose != storage_differs);
 
     // Determine expr's actual strides, resolving any defaults if zero.
     const Index expr_inner_actual = resolveInnerStride(expr.innerStride());
-    const Index expr_outer_actual = resolveOuterStride(expr_inner_actual,
-                                                       expr.outerStride(),
-                                                       expr.rows(),
-                                                       expr.cols(),
-                                                       Expression::IsVectorAtCompileTime != 0,
-                                                       expr_row_major);
+    const Index expr_outer_actual = resolveOuterStride(expr_inner_actual, expr.outerStride(), expr.rows(), expr.cols(),
+                                                       Expression::IsVectorAtCompileTime != 0, expr_row_major);
 
     // If this is a column-major row vector or row-major column vector, the inner-stride
     // is arbitrary, so set it to either the compile-time inner stride or 1.
     const bool row_vector = (rows == 1);
     const bool col_vector = (cols == 1);
     const Index inner_stride =
-        ( (!row_major && row_vector) || (row_major && col_vector) ) ?
-            ( StrideType::InnerStrideAtCompileTime > 0 ? Index(StrideType::InnerStrideAtCompileTime) : 1)
-            : swap_stride ? expr_outer_actual : expr_inner_actual;
+        ((!row_major && row_vector) || (row_major && col_vector))
+            ? (StrideType::InnerStrideAtCompileTime > 0 ? Index(StrideType::InnerStrideAtCompileTime) : 1)
+        : swap_stride ? expr_outer_actual
+                      : expr_inner_actual;
 
     // If this is a column-major column vector or row-major row vector, the outer-stride
     // is arbitrary, so set it to either the compile-time outer stride or vector size.
     const Index outer_stride =
-      ( (!row_major && col_vector) || (row_major && row_vector) ) ?
-          ( StrideType::OuterStrideAtCompileTime > 0 ? Index(StrideType::OuterStrideAtCompileTime) : rows * cols * inner_stride)
-          : swap_stride ? expr_inner_actual : expr_outer_actual;
+        ((!row_major && col_vector) || (row_major && row_vector))
+            ? (StrideType::OuterStrideAtCompileTime > 0 ? Index(StrideType::OuterStrideAtCompileTime)
+                                                        : rows * cols * inner_stride)
+        : swap_stride ? expr_inner_actual
+                      : expr_outer_actual;
 
     // Check if given inner/outer strides are compatible with compile-time strides.
-    const bool inner_valid = (StrideType::InnerStrideAtCompileTime == Dynamic)
-        || (resolveInnerStride(Index(StrideType::InnerStrideAtCompileTime)) == inner_stride);
+    const bool inner_valid = (StrideType::InnerStrideAtCompileTime == Dynamic) ||
+                             (resolveInnerStride(Index(StrideType::InnerStrideAtCompileTime)) == inner_stride);
     if (!inner_valid) {
       return false;
     }
 
-    const bool outer_valid = (StrideType::OuterStrideAtCompileTime == Dynamic)
-        || (resolveOuterStride(
-              inner_stride,
-              Index(StrideType::OuterStrideAtCompileTime),
-              rows, cols, PlainObjectType::IsVectorAtCompileTime != 0,
-              row_major)
-            == outer_stride);
+    const bool outer_valid =
+        (StrideType::OuterStrideAtCompileTime == Dynamic) ||
+        (resolveOuterStride(inner_stride, Index(StrideType::OuterStrideAtCompileTime), rows, cols,
+                            PlainObjectType::IsVectorAtCompileTime != 0, row_major) == outer_stride);
     if (!outer_valid) {
       return false;
     }
 
     internal::construct_at<Base>(this, expr.data(), rows, cols);
-    internal::construct_at(&m_stride,
-      (StrideType::OuterStrideAtCompileTime == 0) ? 0 : outer_stride,
-      (StrideType::InnerStrideAtCompileTime == 0) ? 0 : inner_stride );
+    internal::construct_at(&m_stride, (StrideType::OuterStrideAtCompileTime == 0) ? 0 : outer_stride,
+                           (StrideType::InnerStrideAtCompileTime == 0) ? 0 : inner_stride);
     return true;
   }
 
@@ -213,199 +196,188 @@
 };
 
 /** \class Ref
-  * \ingroup Core_Module
-  *
-  * \brief A matrix or vector expression mapping an existing expression
-  *
-  * \tparam PlainObjectType the equivalent matrix type of the mapped data
-  * \tparam Options specifies the pointer alignment in bytes. It can be: \c #Aligned128, , \c #Aligned64, \c #Aligned32, \c #Aligned16, \c #Aligned8 or \c #Unaligned.
-  *                 The default is \c #Unaligned.
-  * \tparam StrideType optionally specifies strides. By default, Ref implies a contiguous storage along the inner dimension (inner stride==1),
-  *                   but accepts a variable outer stride (leading dimension).
-  *                   This can be overridden by specifying strides.
-  *                   The type passed here must be a specialization of the Stride template, see examples below.
-  *
-  * This class provides a way to write non-template functions taking Eigen objects as parameters while limiting the number of copies.
-  * A Ref<> object can represent either a const expression or a l-value:
-  * \code
-  * // in-out argument:
-  * void foo1(Ref<VectorXf> x);
-  *
-  * // read-only const argument:
-  * void foo2(const Ref<const VectorXf>& x);
-  * \endcode
-  *
-  * In the in-out case, the input argument must satisfy the constraints of the actual Ref<> type, otherwise a compilation issue will be triggered.
-  * By default, a Ref<VectorXf> can reference any dense vector expression of float having a contiguous memory layout.
-  * Likewise, a Ref<MatrixXf> can reference any column-major dense matrix expression of float whose column's elements are contiguously stored with
-  * the possibility to have a constant space in-between each column, i.e. the inner stride must be equal to 1, but the outer stride (or leading dimension)
-  * can be greater than the number of rows.
-  *
-  * In the const case, if the input expression does not match the above requirement, then it is evaluated into a temporary before being passed to the function.
-  * Here are some examples:
-  * \code
-  * MatrixXf A;
-  * VectorXf a;
-  * foo1(a.head());             // OK
-  * foo1(A.col());              // OK
-  * foo1(A.row());              // Compilation error because here innerstride!=1
-  * foo2(A.row());              // Compilation error because A.row() is a 1xN object while foo2 is expecting a Nx1 object
-  * foo2(A.row().transpose());  // The row is copied into a contiguous temporary
-  * foo2(2*a);                  // The expression is evaluated into a temporary
-  * foo2(A.col().segment(2,4)); // No temporary
-  * \endcode
-  *
-  * The range of inputs that can be referenced without temporary can be enlarged using the last two template parameters.
-  * Here is an example accepting an innerstride!=1:
-  * \code
-  * // in-out argument:
-  * void foo3(Ref<VectorXf,0,InnerStride<> > x);
-  * foo3(A.row());              // OK
-  * \endcode
-  * The downside here is that the function foo3 might be significantly slower than foo1 because it won't be able to exploit vectorization, and will involve more
-  * expensive address computations even if the input is contiguously stored in memory. To overcome this issue, one might propose to overload internally calling a
-  * template function, e.g.:
-  * \code
-  * // in the .h:
-  * void foo(const Ref<MatrixXf>& A);
-  * void foo(const Ref<MatrixXf,0,Stride<> >& A);
-  *
-  * // in the .cpp:
-  * template<typename TypeOfA> void foo_impl(const TypeOfA& A) {
-  *     ... // crazy code goes here
-  * }
-  * void foo(const Ref<MatrixXf>& A) { foo_impl(A); }
-  * void foo(const Ref<MatrixXf,0,Stride<> >& A) { foo_impl(A); }
-  * \endcode
-  *
-  * See also the following stackoverflow questions for further references:
-  *  - <a href="http://stackoverflow.com/questions/21132538/correct-usage-of-the-eigenref-class">Correct usage of the Eigen::Ref<> class</a>
-  *
-  * \sa PlainObjectBase::Map(), \ref TopicStorageOrders
-  */
-template<typename PlainObjectType, int Options, typename StrideType> class Ref
-  : public RefBase<Ref<PlainObjectType, Options, StrideType> >
-{
-  private:
-    typedef internal::traits<Ref> Traits;
-    template<typename Derived>
-    EIGEN_DEVICE_FUNC inline Ref(const PlainObjectBase<Derived>& expr,
-                                 std::enable_if_t<bool(Traits::template match<Derived>::MatchAtCompileTime),Derived>* = 0);
-  public:
+ * \ingroup Core_Module
+ *
+ * \brief A matrix or vector expression mapping an existing expression
+ *
+ * \tparam PlainObjectType the equivalent matrix type of the mapped data
+ * \tparam Options specifies the pointer alignment in bytes. It can be: \c #Aligned128, , \c #Aligned64, \c #Aligned32,
+ * \c #Aligned16, \c #Aligned8 or \c #Unaligned. The default is \c #Unaligned. \tparam StrideType optionally specifies
+ * strides. By default, Ref implies a contiguous storage along the inner dimension (inner stride==1), but accepts a
+ * variable outer stride (leading dimension). This can be overridden by specifying strides. The type passed here must be
+ * a specialization of the Stride template, see examples below.
+ *
+ * This class provides a way to write non-template functions taking Eigen objects as parameters while limiting the
+ * number of copies. A Ref<> object can represent either a const expression or a l-value: \code
+ * // in-out argument:
+ * void foo1(Ref<VectorXf> x);
+ *
+ * // read-only const argument:
+ * void foo2(const Ref<const VectorXf>& x);
+ * \endcode
+ *
+ * In the in-out case, the input argument must satisfy the constraints of the actual Ref<> type, otherwise a compilation
+ * issue will be triggered. By default, a Ref<VectorXf> can reference any dense vector expression of float having a
+ * contiguous memory layout. Likewise, a Ref<MatrixXf> can reference any column-major dense matrix expression of float
+ * whose column's elements are contiguously stored with the possibility to have a constant space in-between each column,
+ * i.e. the inner stride must be equal to 1, but the outer stride (or leading dimension) can be greater than the number
+ * of rows.
+ *
+ * In the const case, if the input expression does not match the above requirement, then it is evaluated into a
+ * temporary before being passed to the function. Here are some examples: \code MatrixXf A; VectorXf a; foo1(a.head());
+ * // OK foo1(A.col());              // OK foo1(A.row());              // Compilation error because here innerstride!=1
+ * foo2(A.row());              // Compilation error because A.row() is a 1xN object while foo2 is expecting a Nx1 object
+ * foo2(A.row().transpose());  // The row is copied into a contiguous temporary
+ * foo2(2*a);                  // The expression is evaluated into a temporary
+ * foo2(A.col().segment(2,4)); // No temporary
+ * \endcode
+ *
+ * The range of inputs that can be referenced without temporary can be enlarged using the last two template parameters.
+ * Here is an example accepting an innerstride!=1:
+ * \code
+ * // in-out argument:
+ * void foo3(Ref<VectorXf,0,InnerStride<> > x);
+ * foo3(A.row());              // OK
+ * \endcode
+ * The downside here is that the function foo3 might be significantly slower than foo1 because it won't be able to
+ * exploit vectorization, and will involve more expensive address computations even if the input is contiguously stored
+ * in memory. To overcome this issue, one might propose to overload internally calling a template function, e.g.: \code
+ * // in the .h:
+ * void foo(const Ref<MatrixXf>& A);
+ * void foo(const Ref<MatrixXf,0,Stride<> >& A);
+ *
+ * // in the .cpp:
+ * template<typename TypeOfA> void foo_impl(const TypeOfA& A) {
+ *     ... // crazy code goes here
+ * }
+ * void foo(const Ref<MatrixXf>& A) { foo_impl(A); }
+ * void foo(const Ref<MatrixXf,0,Stride<> >& A) { foo_impl(A); }
+ * \endcode
+ *
+ * See also the following stackoverflow questions for further references:
+ *  - <a href="http://stackoverflow.com/questions/21132538/correct-usage-of-the-eigenref-class">Correct usage of the
+ * Eigen::Ref<> class</a>
+ *
+ * \sa PlainObjectBase::Map(), \ref TopicStorageOrders
+ */
+template <typename PlainObjectType, int Options, typename StrideType>
+class Ref : public RefBase<Ref<PlainObjectType, Options, StrideType> > {
+ private:
+  typedef internal::traits<Ref> Traits;
+  template <typename Derived>
+  EIGEN_DEVICE_FUNC inline Ref(
+      const PlainObjectBase<Derived>& expr,
+      std::enable_if_t<bool(Traits::template match<Derived>::MatchAtCompileTime), Derived>* = 0);
 
-    typedef RefBase<Ref> Base;
-    EIGEN_DENSE_PUBLIC_INTERFACE(Ref)
+ public:
+  typedef RefBase<Ref> Base;
+  EIGEN_DENSE_PUBLIC_INTERFACE(Ref)
 
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  template <typename Derived>
+  EIGEN_DEVICE_FUNC inline Ref(
+      PlainObjectBase<Derived>& expr,
+      std::enable_if_t<bool(Traits::template match<Derived>::MatchAtCompileTime), Derived>* = 0) {
+    EIGEN_STATIC_ASSERT(bool(Traits::template match<Derived>::MatchAtCompileTime), STORAGE_LAYOUT_DOES_NOT_MATCH);
+    // Construction must pass since we will not create temporary storage in the non-const case.
+    const bool success = Base::construct(expr.derived());
+    EIGEN_UNUSED_VARIABLE(success)
+    eigen_assert(success);
+  }
+  template <typename Derived>
+  EIGEN_DEVICE_FUNC inline Ref(
+      const DenseBase<Derived>& expr,
+      std::enable_if_t<bool(Traits::template match<Derived>::MatchAtCompileTime), Derived>* = 0)
+#else
+  /** Implicit constructor from any dense expression */
+  template <typename Derived>
+  inline Ref(DenseBase<Derived>& expr)
+#endif
+  {
+    EIGEN_STATIC_ASSERT(bool(internal::is_lvalue<Derived>::value), THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY);
+    EIGEN_STATIC_ASSERT(bool(Traits::template match<Derived>::MatchAtCompileTime), STORAGE_LAYOUT_DOES_NOT_MATCH);
+    EIGEN_STATIC_ASSERT(!Derived::IsPlainObjectBase, THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY);
+    // Construction must pass since we will not create temporary storage in the non-const case.
+    const bool success = Base::construct(expr.const_cast_derived());
+    EIGEN_UNUSED_VARIABLE(success)
+    eigen_assert(success);
+  }
 
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    template<typename Derived>
-    EIGEN_DEVICE_FUNC inline Ref(PlainObjectBase<Derived>& expr,
-                                 std::enable_if_t<bool(Traits::template match<Derived>::MatchAtCompileTime),Derived>* = 0)
-    {
-      EIGEN_STATIC_ASSERT(bool(Traits::template match<Derived>::MatchAtCompileTime), STORAGE_LAYOUT_DOES_NOT_MATCH);
-      // Construction must pass since we will not create temporary storage in the non-const case.
-      const bool success = Base::construct(expr.derived());
-      EIGEN_UNUSED_VARIABLE(success)
-      eigen_assert(success);
-    }
-    template<typename Derived>
-    EIGEN_DEVICE_FUNC inline Ref(const DenseBase<Derived>& expr,
-                                 std::enable_if_t<bool(Traits::template match<Derived>::MatchAtCompileTime),Derived>* = 0)
-    #else
-    /** Implicit constructor from any dense expression */
-    template<typename Derived>
-    inline Ref(DenseBase<Derived>& expr)
-    #endif
-    {
-      EIGEN_STATIC_ASSERT(bool(internal::is_lvalue<Derived>::value), THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY);
-      EIGEN_STATIC_ASSERT(bool(Traits::template match<Derived>::MatchAtCompileTime), STORAGE_LAYOUT_DOES_NOT_MATCH);
-      EIGEN_STATIC_ASSERT(!Derived::IsPlainObjectBase,THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY);
-      // Construction must pass since we will not create temporary storage in the non-const case.
-      const bool success = Base::construct(expr.const_cast_derived());
-      EIGEN_UNUSED_VARIABLE(success)
-      eigen_assert(success);
-    }
-
-    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Ref)
-
+  EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Ref)
 };
 
 // this is the const ref version
-template<typename TPlainObjectType, int Options, typename StrideType> class Ref<const TPlainObjectType, Options, StrideType>
-  : public RefBase<Ref<const TPlainObjectType, Options, StrideType> >
-{
-    typedef internal::traits<Ref> Traits;
+template <typename TPlainObjectType, int Options, typename StrideType>
+class Ref<const TPlainObjectType, Options, StrideType>
+    : public RefBase<Ref<const TPlainObjectType, Options, StrideType> > {
+  typedef internal::traits<Ref> Traits;
 
-    static constexpr bool may_map_m_object_successfully = 
+  static constexpr bool may_map_m_object_successfully =
       (static_cast<int>(StrideType::InnerStrideAtCompileTime) == 0 ||
        static_cast<int>(StrideType::InnerStrideAtCompileTime) == 1 ||
        static_cast<int>(StrideType::InnerStrideAtCompileTime) == Dynamic) &&
-      (TPlainObjectType::IsVectorAtCompileTime ||
-       static_cast<int>(StrideType::OuterStrideAtCompileTime) == 0 ||
+      (TPlainObjectType::IsVectorAtCompileTime || static_cast<int>(StrideType::OuterStrideAtCompileTime) == 0 ||
        static_cast<int>(StrideType::OuterStrideAtCompileTime) == Dynamic ||
-       static_cast<int>(StrideType::OuterStrideAtCompileTime) == static_cast<int>(TPlainObjectType::InnerSizeAtCompileTime) ||
+       static_cast<int>(StrideType::OuterStrideAtCompileTime) ==
+           static_cast<int>(TPlainObjectType::InnerSizeAtCompileTime) ||
        static_cast<int>(TPlainObjectType::InnerSizeAtCompileTime) == Dynamic);
-  public:
 
-    typedef RefBase<Ref> Base;
-    EIGEN_DENSE_PUBLIC_INTERFACE(Ref)
+ public:
+  typedef RefBase<Ref> Base;
+  EIGEN_DENSE_PUBLIC_INTERFACE(Ref)
 
-    template<typename Derived>
-    EIGEN_DEVICE_FUNC inline Ref(const DenseBase<Derived>& expr,
-                                 std::enable_if_t<bool(Traits::template match<Derived>::ScalarTypeMatch),Derived>* = 0)
-    {
-//      std::cout << match_helper<Derived>::HasDirectAccess << "," << match_helper<Derived>::OuterStrideMatch << "," << match_helper<Derived>::InnerStrideMatch << "\n";
-//      std::cout << int(StrideType::OuterStrideAtCompileTime) << " - " << int(Derived::OuterStrideAtCompileTime) << "\n";
-//      std::cout << int(StrideType::InnerStrideAtCompileTime) << " - " << int(Derived::InnerStrideAtCompileTime) << "\n";
-      EIGEN_STATIC_ASSERT(Traits::template match<Derived>::type::value || may_map_m_object_successfully,
-                          STORAGE_LAYOUT_DOES_NOT_MATCH);
-      construct(expr.derived(), typename Traits::template match<Derived>::type());
+  template <typename Derived>
+  EIGEN_DEVICE_FUNC inline Ref(const DenseBase<Derived>& expr,
+                               std::enable_if_t<bool(Traits::template match<Derived>::ScalarTypeMatch), Derived>* = 0) {
+    //      std::cout << match_helper<Derived>::HasDirectAccess << "," << match_helper<Derived>::OuterStrideMatch << ","
+    //      << match_helper<Derived>::InnerStrideMatch << "\n"; std::cout << int(StrideType::OuterStrideAtCompileTime)
+    //      << " - " << int(Derived::OuterStrideAtCompileTime) << "\n"; std::cout <<
+    //      int(StrideType::InnerStrideAtCompileTime) << " - " << int(Derived::InnerStrideAtCompileTime) << "\n";
+    EIGEN_STATIC_ASSERT(Traits::template match<Derived>::type::value || may_map_m_object_successfully,
+                        STORAGE_LAYOUT_DOES_NOT_MATCH);
+    construct(expr.derived(), typename Traits::template match<Derived>::type());
+  }
+
+  EIGEN_DEVICE_FUNC inline Ref(const Ref& other) : Base(other) {
+    // copy constructor shall not copy the m_object, to avoid unnecessary malloc and copy
+  }
+
+  EIGEN_DEVICE_FUNC inline Ref(Ref&& other) {
+    if (other.data() == other.m_object.data()) {
+      m_object = std::move(other.m_object);
+      Base::construct(m_object);
+    } else
+      Base::construct(other);
+  }
+
+  template <typename OtherRef>
+  EIGEN_DEVICE_FUNC inline Ref(const RefBase<OtherRef>& other) {
+    EIGEN_STATIC_ASSERT(Traits::template match<OtherRef>::type::value || may_map_m_object_successfully,
+                        STORAGE_LAYOUT_DOES_NOT_MATCH);
+    construct(other.derived(), typename Traits::template match<OtherRef>::type());
+  }
+
+ protected:
+  template <typename Expression>
+  EIGEN_DEVICE_FUNC void construct(const Expression& expr, internal::true_type) {
+    // Check if we can use the underlying expr's storage directly, otherwise call the copy version.
+    if (!Base::construct(expr)) {
+      construct(expr, internal::false_type());
     }
+  }
 
-    EIGEN_DEVICE_FUNC inline Ref(const Ref& other) : Base(other) {
-      // copy constructor shall not copy the m_object, to avoid unnecessary malloc and copy
-    }
+  template <typename Expression>
+  EIGEN_DEVICE_FUNC void construct(const Expression& expr, internal::false_type) {
+    internal::call_assignment_no_alias(m_object, expr, internal::assign_op<Scalar, Scalar>());
+    const bool success = Base::construct(m_object);
+    EIGEN_ONLY_USED_FOR_DEBUG(success)
+    eigen_assert(success);
+  }
 
-    EIGEN_DEVICE_FUNC inline Ref(Ref&& other) {
-      if (other.data() == other.m_object.data()) {
-        m_object = std::move(other.m_object);
-        Base::construct(m_object);
-      }
-      else
-        Base::construct(other);
-    }
-
-    template<typename OtherRef>
-    EIGEN_DEVICE_FUNC inline Ref(const RefBase<OtherRef>& other) {
-      EIGEN_STATIC_ASSERT(Traits::template match<OtherRef>::type::value || may_map_m_object_successfully,
-                          STORAGE_LAYOUT_DOES_NOT_MATCH);
-      construct(other.derived(), typename Traits::template match<OtherRef>::type());
-    }
-
-  protected:
-
-    template<typename Expression>
-    EIGEN_DEVICE_FUNC void construct(const Expression& expr,internal::true_type)
-    {
-      // Check if we can use the underlying expr's storage directly, otherwise call the copy version.
-      if (!Base::construct(expr)) {
-        construct(expr, internal::false_type());
-      }
-    }
-
-    template<typename Expression>
-    EIGEN_DEVICE_FUNC void construct(const Expression& expr, internal::false_type)
-    {
-      internal::call_assignment_no_alias(m_object,expr,internal::assign_op<Scalar,Scalar>());
-      const bool success = Base::construct(m_object);
-      EIGEN_ONLY_USED_FOR_DEBUG(success)
-      eigen_assert(success);
-    }
-
-  protected:
-    TPlainObjectType m_object;
+ protected:
+  TPlainObjectType m_object;
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_REF_H
+#endif  // EIGEN_REF_H
diff --git a/Eigen/src/Core/Replicate.h b/Eigen/src/Core/Replicate.h
index e06eaf2..c01c627 100644
--- a/Eigen/src/Core/Replicate.h
+++ b/Eigen/src/Core/Replicate.h
@@ -16,130 +16,118 @@
 namespace Eigen {
 
 namespace internal {
-template<typename MatrixType,int RowFactor,int ColFactor>
-struct traits<Replicate<MatrixType,RowFactor,ColFactor> >
- : traits<MatrixType>
-{
+template <typename MatrixType, int RowFactor, int ColFactor>
+struct traits<Replicate<MatrixType, RowFactor, ColFactor> > : traits<MatrixType> {
   typedef typename MatrixType::Scalar Scalar;
   typedef typename traits<MatrixType>::StorageKind StorageKind;
   typedef typename traits<MatrixType>::XprKind XprKind;
   typedef typename ref_selector<MatrixType>::type MatrixTypeNested;
   typedef std::remove_reference_t<MatrixTypeNested> MatrixTypeNested_;
   enum {
-    RowsAtCompileTime = RowFactor==Dynamic || int(MatrixType::RowsAtCompileTime)==Dynamic
-                      ? Dynamic
-                      : RowFactor * MatrixType::RowsAtCompileTime,
-    ColsAtCompileTime = ColFactor==Dynamic || int(MatrixType::ColsAtCompileTime)==Dynamic
-                      ? Dynamic
-                      : ColFactor * MatrixType::ColsAtCompileTime,
-   //FIXME we don't propagate the max sizes !!!
+    RowsAtCompileTime = RowFactor == Dynamic || int(MatrixType::RowsAtCompileTime) == Dynamic
+                            ? Dynamic
+                            : RowFactor * MatrixType::RowsAtCompileTime,
+    ColsAtCompileTime = ColFactor == Dynamic || int(MatrixType::ColsAtCompileTime) == Dynamic
+                            ? Dynamic
+                            : ColFactor * MatrixType::ColsAtCompileTime,
+    // FIXME we don't propagate the max sizes !!!
     MaxRowsAtCompileTime = RowsAtCompileTime,
     MaxColsAtCompileTime = ColsAtCompileTime,
-    IsRowMajor = MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1 ? 1
-               : MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1 ? 0
-               : (MatrixType::Flags & RowMajorBit) ? 1 : 0,
+    IsRowMajor = MaxRowsAtCompileTime == 1 && MaxColsAtCompileTime != 1   ? 1
+                 : MaxColsAtCompileTime == 1 && MaxRowsAtCompileTime != 1 ? 0
+                 : (MatrixType::Flags & RowMajorBit)                      ? 1
+                                                                          : 0,
 
     // FIXME enable DirectAccess with negative strides?
     Flags = IsRowMajor ? RowMajorBit : 0
   };
 };
-}
+}  // namespace internal
 
 /**
-  * \class Replicate
-  * \ingroup Core_Module
-  *
-  * \brief Expression of the multiple replication of a matrix or vector
-  *
-  * \tparam MatrixType the type of the object we are replicating
-  * \tparam RowFactor number of repetitions at compile time along the vertical direction, can be Dynamic.
-  * \tparam ColFactor number of repetitions at compile time along the horizontal direction, can be Dynamic.
-  *
-  * This class represents an expression of the multiple replication of a matrix or vector.
-  * It is the return type of DenseBase::replicate() and most of the time
-  * this is the only way it is used.
-  *
-  * \sa DenseBase::replicate()
-  */
-template<typename MatrixType,int RowFactor,int ColFactor> class Replicate
-  : public internal::dense_xpr_base< Replicate<MatrixType,RowFactor,ColFactor> >::type
-{
-    typedef typename internal::traits<Replicate>::MatrixTypeNested MatrixTypeNested;
-    typedef typename internal::traits<Replicate>::MatrixTypeNested_ MatrixTypeNested_;
-  public:
+ * \class Replicate
+ * \ingroup Core_Module
+ *
+ * \brief Expression of the multiple replication of a matrix or vector
+ *
+ * \tparam MatrixType the type of the object we are replicating
+ * \tparam RowFactor number of repetitions at compile time along the vertical direction, can be Dynamic.
+ * \tparam ColFactor number of repetitions at compile time along the horizontal direction, can be Dynamic.
+ *
+ * This class represents an expression of the multiple replication of a matrix or vector.
+ * It is the return type of DenseBase::replicate() and most of the time
+ * this is the only way it is used.
+ *
+ * \sa DenseBase::replicate()
+ */
+template <typename MatrixType, int RowFactor, int ColFactor>
+class Replicate : public internal::dense_xpr_base<Replicate<MatrixType, RowFactor, ColFactor> >::type {
+  typedef typename internal::traits<Replicate>::MatrixTypeNested MatrixTypeNested;
+  typedef typename internal::traits<Replicate>::MatrixTypeNested_ MatrixTypeNested_;
 
-    typedef typename internal::dense_xpr_base<Replicate>::type Base;
-    EIGEN_DENSE_PUBLIC_INTERFACE(Replicate)
-    typedef internal::remove_all_t<MatrixType> NestedExpression;
+ public:
+  typedef typename internal::dense_xpr_base<Replicate>::type Base;
+  EIGEN_DENSE_PUBLIC_INTERFACE(Replicate)
+  typedef internal::remove_all_t<MatrixType> NestedExpression;
 
-    template<typename OriginalMatrixType>
-    EIGEN_DEVICE_FUNC
-    inline explicit Replicate(const OriginalMatrixType& matrix)
-      : m_matrix(matrix), m_rowFactor(RowFactor), m_colFactor(ColFactor)
-    {
-      EIGEN_STATIC_ASSERT((internal::is_same<std::remove_const_t<MatrixType>,OriginalMatrixType>::value),
-                          THE_MATRIX_OR_EXPRESSION_THAT_YOU_PASSED_DOES_NOT_HAVE_THE_EXPECTED_TYPE)
-      eigen_assert(RowFactor!=Dynamic && ColFactor!=Dynamic);
-    }
+  template <typename OriginalMatrixType>
+  EIGEN_DEVICE_FUNC inline explicit Replicate(const OriginalMatrixType& matrix)
+      : m_matrix(matrix), m_rowFactor(RowFactor), m_colFactor(ColFactor) {
+    EIGEN_STATIC_ASSERT((internal::is_same<std::remove_const_t<MatrixType>, OriginalMatrixType>::value),
+                        THE_MATRIX_OR_EXPRESSION_THAT_YOU_PASSED_DOES_NOT_HAVE_THE_EXPECTED_TYPE)
+    eigen_assert(RowFactor != Dynamic && ColFactor != Dynamic);
+  }
 
-    template<typename OriginalMatrixType>
-    EIGEN_DEVICE_FUNC
-    inline Replicate(const OriginalMatrixType& matrix, Index rowFactor, Index colFactor)
-      : m_matrix(matrix), m_rowFactor(rowFactor), m_colFactor(colFactor)
-    {
-      EIGEN_STATIC_ASSERT((internal::is_same<std::remove_const_t<MatrixType>,OriginalMatrixType>::value),
-                          THE_MATRIX_OR_EXPRESSION_THAT_YOU_PASSED_DOES_NOT_HAVE_THE_EXPECTED_TYPE)
-    }
+  template <typename OriginalMatrixType>
+  EIGEN_DEVICE_FUNC inline Replicate(const OriginalMatrixType& matrix, Index rowFactor, Index colFactor)
+      : m_matrix(matrix),
+        m_rowFactor(rowFactor),
+        m_colFactor(colFactor){
+            EIGEN_STATIC_ASSERT((internal::is_same<std::remove_const_t<MatrixType>, OriginalMatrixType>::value),
+                                THE_MATRIX_OR_EXPRESSION_THAT_YOU_PASSED_DOES_NOT_HAVE_THE_EXPECTED_TYPE)}
 
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index rows() const { return m_matrix.rows() * m_rowFactor.value(); }
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index cols() const { return m_matrix.cols() * m_colFactor.value(); }
+        EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index rows() const {
+    return m_matrix.rows() * m_rowFactor.value();
+  }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index cols() const { return m_matrix.cols() * m_colFactor.value(); }
 
-    EIGEN_DEVICE_FUNC
-    const MatrixTypeNested_& nestedExpression() const
-    {
-      return m_matrix;
-    }
+  EIGEN_DEVICE_FUNC const MatrixTypeNested_& nestedExpression() const { return m_matrix; }
 
-  protected:
-    MatrixTypeNested m_matrix;
-    const internal::variable_if_dynamic<Index, RowFactor> m_rowFactor;
-    const internal::variable_if_dynamic<Index, ColFactor> m_colFactor;
+ protected:
+  MatrixTypeNested m_matrix;
+  const internal::variable_if_dynamic<Index, RowFactor> m_rowFactor;
+  const internal::variable_if_dynamic<Index, ColFactor> m_colFactor;
 };
 
 /**
-  * \return an expression of the replication of \c *this
-  *
-  * Example: \include MatrixBase_replicate.cpp
-  * Output: \verbinclude MatrixBase_replicate.out
-  *
-  * \sa VectorwiseOp::replicate(), DenseBase::replicate(Index,Index), class Replicate
-  */
-template<typename Derived>
-template<int RowFactor, int ColFactor>
-EIGEN_DEVICE_FUNC const Replicate<Derived,RowFactor,ColFactor>
-DenseBase<Derived>::replicate() const
-{
-  return Replicate<Derived,RowFactor,ColFactor>(derived());
+ * \return an expression of the replication of \c *this
+ *
+ * Example: \include MatrixBase_replicate.cpp
+ * Output: \verbinclude MatrixBase_replicate.out
+ *
+ * \sa VectorwiseOp::replicate(), DenseBase::replicate(Index,Index), class Replicate
+ */
+template <typename Derived>
+template <int RowFactor, int ColFactor>
+EIGEN_DEVICE_FUNC const Replicate<Derived, RowFactor, ColFactor> DenseBase<Derived>::replicate() const {
+  return Replicate<Derived, RowFactor, ColFactor>(derived());
 }
 
 /**
-  * \return an expression of the replication of each column (or row) of \c *this
-  *
-  * Example: \include DirectionWise_replicate_int.cpp
-  * Output: \verbinclude DirectionWise_replicate_int.out
-  *
-  * \sa VectorwiseOp::replicate(), DenseBase::replicate(), class Replicate
-  */
-template<typename ExpressionType, int Direction>
-EIGEN_DEVICE_FUNC const typename VectorwiseOp<ExpressionType,Direction>::ReplicateReturnType
-VectorwiseOp<ExpressionType,Direction>::replicate(Index factor) const
-{
-  return typename VectorwiseOp<ExpressionType,Direction>::ReplicateReturnType
-          (_expression(),Direction==Vertical?factor:1,Direction==Horizontal?factor:1);
+ * \return an expression of the replication of each column (or row) of \c *this
+ *
+ * Example: \include DirectionWise_replicate_int.cpp
+ * Output: \verbinclude DirectionWise_replicate_int.out
+ *
+ * \sa VectorwiseOp::replicate(), DenseBase::replicate(), class Replicate
+ */
+template <typename ExpressionType, int Direction>
+EIGEN_DEVICE_FUNC const typename VectorwiseOp<ExpressionType, Direction>::ReplicateReturnType
+VectorwiseOp<ExpressionType, Direction>::replicate(Index factor) const {
+  return typename VectorwiseOp<ExpressionType, Direction>::ReplicateReturnType(
+      _expression(), Direction == Vertical ? factor : 1, Direction == Horizontal ? factor : 1);
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_REPLICATE_H
+#endif  // EIGEN_REPLICATE_H
diff --git a/Eigen/src/Core/Reshaped.h b/Eigen/src/Core/Reshaped.h
index c118469..b881dd6 100644
--- a/Eigen/src/Core/Reshaped.h
+++ b/Eigen/src/Core/Reshaped.h
@@ -17,43 +17,42 @@
 namespace Eigen {
 
 /** \class Reshaped
-  * \ingroup Core_Module
-  *
-  * \brief Expression of a fixed-size or dynamic-size reshape
-  *
-  * \tparam XprType the type of the expression in which we are taking a reshape
-  * \tparam Rows the number of rows of the reshape we are taking at compile time (optional)
-  * \tparam Cols the number of columns of the reshape we are taking at compile time (optional)
-  * \tparam Order can be ColMajor or RowMajor, default is ColMajor.
-  *
-  * This class represents an expression of either a fixed-size or dynamic-size reshape.
-  * It is the return type of DenseBase::reshaped(NRowsType,NColsType) and
-  * most of the time this is the only way it is used.
-  *
-  * If you want to directly manipulate reshaped expressions,
-  * for instance if you want to write a function returning such an expression,
-  * it is advised to use the \em auto keyword for such use cases.
-  *
-  * Here is an example illustrating the dynamic case:
-  * \include class_Reshaped.cpp
-  * Output: \verbinclude class_Reshaped.out
-  *
-  * Here is an example illustrating the fixed-size case:
-  * \include class_FixedReshaped.cpp
-  * Output: \verbinclude class_FixedReshaped.out
-  *
-  * \sa DenseBase::reshaped(NRowsType,NColsType)
-  */
+ * \ingroup Core_Module
+ *
+ * \brief Expression of a fixed-size or dynamic-size reshape
+ *
+ * \tparam XprType the type of the expression in which we are taking a reshape
+ * \tparam Rows the number of rows of the reshape we are taking at compile time (optional)
+ * \tparam Cols the number of columns of the reshape we are taking at compile time (optional)
+ * \tparam Order can be ColMajor or RowMajor, default is ColMajor.
+ *
+ * This class represents an expression of either a fixed-size or dynamic-size reshape.
+ * It is the return type of DenseBase::reshaped(NRowsType,NColsType) and
+ * most of the time this is the only way it is used.
+ *
+ * If you want to directly manipulate reshaped expressions,
+ * for instance if you want to write a function returning such an expression,
+ * it is advised to use the \em auto keyword for such use cases.
+ *
+ * Here is an example illustrating the dynamic case:
+ * \include class_Reshaped.cpp
+ * Output: \verbinclude class_Reshaped.out
+ *
+ * Here is an example illustrating the fixed-size case:
+ * \include class_FixedReshaped.cpp
+ * Output: \verbinclude class_FixedReshaped.out
+ *
+ * \sa DenseBase::reshaped(NRowsType,NColsType)
+ */
 
 namespace internal {
 
-template<typename XprType, int Rows, int Cols, int Order>
-struct traits<Reshaped<XprType, Rows, Cols, Order> > : traits<XprType>
-{
+template <typename XprType, int Rows, int Cols, int Order>
+struct traits<Reshaped<XprType, Rows, Cols, Order> > : traits<XprType> {
   typedef typename traits<XprType>::Scalar Scalar;
   typedef typename traits<XprType>::StorageKind StorageKind;
   typedef typename traits<XprType>::XprKind XprKind;
-  enum{
+  enum {
     MatrixRows = traits<XprType>::RowsAtCompileTime,
     MatrixCols = traits<XprType>::ColsAtCompileTime,
     RowsAtCompileTime = Rows,
@@ -61,212 +60,179 @@
     MaxRowsAtCompileTime = Rows,
     MaxColsAtCompileTime = Cols,
     XpxStorageOrder = ((int(traits<XprType>::Flags) & RowMajorBit) == RowMajorBit) ? RowMajor : ColMajor,
-    ReshapedStorageOrder = (RowsAtCompileTime == 1 && ColsAtCompileTime != 1) ? RowMajor
-                         : (ColsAtCompileTime == 1 && RowsAtCompileTime != 1) ? ColMajor
-                         : XpxStorageOrder,
+    ReshapedStorageOrder = (RowsAtCompileTime == 1 && ColsAtCompileTime != 1)   ? RowMajor
+                           : (ColsAtCompileTime == 1 && RowsAtCompileTime != 1) ? ColMajor
+                                                                                : XpxStorageOrder,
     HasSameStorageOrderAsXprType = (ReshapedStorageOrder == XpxStorageOrder),
-    InnerSize = (ReshapedStorageOrder==int(RowMajor)) ? int(ColsAtCompileTime) : int(RowsAtCompileTime),
-    InnerStrideAtCompileTime = HasSameStorageOrderAsXprType
-                             ? int(inner_stride_at_compile_time<XprType>::ret)
-                             : Dynamic,
+    InnerSize = (ReshapedStorageOrder == int(RowMajor)) ? int(ColsAtCompileTime) : int(RowsAtCompileTime),
+    InnerStrideAtCompileTime = HasSameStorageOrderAsXprType ? int(inner_stride_at_compile_time<XprType>::ret) : Dynamic,
     OuterStrideAtCompileTime = Dynamic,
 
-    HasDirectAccess = internal::has_direct_access<XprType>::ret
-                    && (Order==int(XpxStorageOrder))
-                    && ((evaluator<XprType>::Flags&LinearAccessBit)==LinearAccessBit),
+    HasDirectAccess = internal::has_direct_access<XprType>::ret && (Order == int(XpxStorageOrder)) &&
+                      ((evaluator<XprType>::Flags & LinearAccessBit) == LinearAccessBit),
 
-    MaskPacketAccessBit = (InnerSize == Dynamic || (InnerSize % packet_traits<Scalar>::size) == 0)
-                       && (InnerStrideAtCompileTime == 1)
-                        ? PacketAccessBit : 0,
-    //MaskAlignedBit = ((OuterStrideAtCompileTime!=Dynamic) && (((OuterStrideAtCompileTime * int(sizeof(Scalar))) % 16) == 0)) ? AlignedBit : 0,
+    MaskPacketAccessBit =
+        (InnerSize == Dynamic || (InnerSize % packet_traits<Scalar>::size) == 0) && (InnerStrideAtCompileTime == 1)
+            ? PacketAccessBit
+            : 0,
+    // MaskAlignedBit = ((OuterStrideAtCompileTime!=Dynamic) && (((OuterStrideAtCompileTime * int(sizeof(Scalar))) % 16)
+    // == 0)) ? AlignedBit : 0,
     FlagsLinearAccessBit = (RowsAtCompileTime == 1 || ColsAtCompileTime == 1) ? LinearAccessBit : 0,
     FlagsLvalueBit = is_lvalue<XprType>::value ? LvalueBit : 0,
-    FlagsRowMajorBit = (ReshapedStorageOrder==int(RowMajor)) ? RowMajorBit : 0,
+    FlagsRowMajorBit = (ReshapedStorageOrder == int(RowMajor)) ? RowMajorBit : 0,
     FlagsDirectAccessBit = HasDirectAccess ? DirectAccessBit : 0,
-    Flags0 = traits<XprType>::Flags & ( (HereditaryBits & ~RowMajorBit) | MaskPacketAccessBit),
+    Flags0 = traits<XprType>::Flags & ((HereditaryBits & ~RowMajorBit) | MaskPacketAccessBit),
 
     Flags = (Flags0 | FlagsLinearAccessBit | FlagsLvalueBit | FlagsRowMajorBit | FlagsDirectAccessBit)
   };
 };
 
-template<typename XprType, int Rows, int Cols, int Order, bool HasDirectAccess> class ReshapedImpl_dense;
+template <typename XprType, int Rows, int Cols, int Order, bool HasDirectAccess>
+class ReshapedImpl_dense;
 
-} // end namespace internal
+}  // end namespace internal
 
-template<typename XprType, int Rows, int Cols, int Order, typename StorageKind> class ReshapedImpl;
+template <typename XprType, int Rows, int Cols, int Order, typename StorageKind>
+class ReshapedImpl;
 
-template<typename XprType, int Rows, int Cols, int Order> class Reshaped
-  : public ReshapedImpl<XprType, Rows, Cols, Order, typename internal::traits<XprType>::StorageKind>
-{
-    typedef ReshapedImpl<XprType, Rows, Cols, Order, typename internal::traits<XprType>::StorageKind> Impl;
-  public:
-    //typedef typename Impl::Base Base;
-    typedef Impl Base;
-    EIGEN_GENERIC_PUBLIC_INTERFACE(Reshaped)
-    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Reshaped)
+template <typename XprType, int Rows, int Cols, int Order>
+class Reshaped : public ReshapedImpl<XprType, Rows, Cols, Order, typename internal::traits<XprType>::StorageKind> {
+  typedef ReshapedImpl<XprType, Rows, Cols, Order, typename internal::traits<XprType>::StorageKind> Impl;
 
-    /** Fixed-size constructor
-      */
-    EIGEN_DEVICE_FUNC
-    inline Reshaped(XprType& xpr)
-      : Impl(xpr)
-    {
-      EIGEN_STATIC_ASSERT(RowsAtCompileTime!=Dynamic && ColsAtCompileTime!=Dynamic,THIS_METHOD_IS_ONLY_FOR_FIXED_SIZE)
-      eigen_assert(Rows * Cols == xpr.rows() * xpr.cols());
-    }
+ public:
+  // typedef typename Impl::Base Base;
+  typedef Impl Base;
+  EIGEN_GENERIC_PUBLIC_INTERFACE(Reshaped)
+  EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Reshaped)
 
-    /** Dynamic-size constructor
-      */
-    EIGEN_DEVICE_FUNC
-    inline Reshaped(XprType& xpr,
-          Index reshapeRows, Index reshapeCols)
-      : Impl(xpr, reshapeRows, reshapeCols)
-    {
-      eigen_assert((RowsAtCompileTime==Dynamic || RowsAtCompileTime==reshapeRows)
-          && (ColsAtCompileTime==Dynamic || ColsAtCompileTime==reshapeCols));
-      eigen_assert(reshapeRows * reshapeCols == xpr.rows() * xpr.cols());
-    }
+  /** Fixed-size constructor
+   */
+  EIGEN_DEVICE_FUNC inline Reshaped(XprType& xpr) : Impl(xpr) {
+    EIGEN_STATIC_ASSERT(RowsAtCompileTime != Dynamic && ColsAtCompileTime != Dynamic,
+                        THIS_METHOD_IS_ONLY_FOR_FIXED_SIZE)
+    eigen_assert(Rows * Cols == xpr.rows() * xpr.cols());
+  }
+
+  /** Dynamic-size constructor
+   */
+  EIGEN_DEVICE_FUNC inline Reshaped(XprType& xpr, Index reshapeRows, Index reshapeCols)
+      : Impl(xpr, reshapeRows, reshapeCols) {
+    eigen_assert((RowsAtCompileTime == Dynamic || RowsAtCompileTime == reshapeRows) &&
+                 (ColsAtCompileTime == Dynamic || ColsAtCompileTime == reshapeCols));
+    eigen_assert(reshapeRows * reshapeCols == xpr.rows() * xpr.cols());
+  }
 };
 
 // The generic default implementation for dense reshape simply forward to the internal::ReshapedImpl_dense
 // that must be specialized for direct and non-direct access...
-template<typename XprType, int Rows, int Cols, int Order>
+template <typename XprType, int Rows, int Cols, int Order>
 class ReshapedImpl<XprType, Rows, Cols, Order, Dense>
-  : public internal::ReshapedImpl_dense<XprType, Rows, Cols, Order,internal::traits<Reshaped<XprType,Rows,Cols,Order> >::HasDirectAccess>
-{
-    typedef internal::ReshapedImpl_dense<XprType, Rows, Cols, Order,internal::traits<Reshaped<XprType,Rows,Cols,Order> >::HasDirectAccess> Impl;
-  public:
-    typedef Impl Base;
-    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(ReshapedImpl)
-    EIGEN_DEVICE_FUNC inline ReshapedImpl(XprType& xpr) : Impl(xpr) {}
-    EIGEN_DEVICE_FUNC inline ReshapedImpl(XprType& xpr, Index reshapeRows, Index reshapeCols)
+    : public internal::ReshapedImpl_dense<XprType, Rows, Cols, Order,
+                                          internal::traits<Reshaped<XprType, Rows, Cols, Order> >::HasDirectAccess> {
+  typedef internal::ReshapedImpl_dense<XprType, Rows, Cols, Order,
+                                       internal::traits<Reshaped<XprType, Rows, Cols, Order> >::HasDirectAccess>
+      Impl;
+
+ public:
+  typedef Impl Base;
+  EIGEN_INHERIT_ASSIGNMENT_OPERATORS(ReshapedImpl)
+  EIGEN_DEVICE_FUNC inline ReshapedImpl(XprType& xpr) : Impl(xpr) {}
+  EIGEN_DEVICE_FUNC inline ReshapedImpl(XprType& xpr, Index reshapeRows, Index reshapeCols)
       : Impl(xpr, reshapeRows, reshapeCols) {}
 };
 
 namespace internal {
 
 /** \internal Internal implementation of dense Reshaped in the general case. */
-template<typename XprType, int Rows, int Cols, int Order>
-class ReshapedImpl_dense<XprType,Rows,Cols,Order,false>
-  : public internal::dense_xpr_base<Reshaped<XprType, Rows, Cols, Order> >::type
-{
-    typedef Reshaped<XprType, Rows, Cols, Order> ReshapedType;
-  public:
+template <typename XprType, int Rows, int Cols, int Order>
+class ReshapedImpl_dense<XprType, Rows, Cols, Order, false>
+    : public internal::dense_xpr_base<Reshaped<XprType, Rows, Cols, Order> >::type {
+  typedef Reshaped<XprType, Rows, Cols, Order> ReshapedType;
 
-    typedef typename internal::dense_xpr_base<ReshapedType>::type Base;
-    EIGEN_DENSE_PUBLIC_INTERFACE(ReshapedType)
-    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(ReshapedImpl_dense)
+ public:
+  typedef typename internal::dense_xpr_base<ReshapedType>::type Base;
+  EIGEN_DENSE_PUBLIC_INTERFACE(ReshapedType)
+  EIGEN_INHERIT_ASSIGNMENT_OPERATORS(ReshapedImpl_dense)
 
-    typedef typename internal::ref_selector<XprType>::non_const_type MatrixTypeNested;
-    typedef internal::remove_all_t<XprType> NestedExpression;
+  typedef typename internal::ref_selector<XprType>::non_const_type MatrixTypeNested;
+  typedef internal::remove_all_t<XprType> NestedExpression;
 
-    class InnerIterator;
+  class InnerIterator;
 
-    /** Fixed-size constructor
-      */
-    EIGEN_DEVICE_FUNC
-    inline ReshapedImpl_dense(XprType& xpr)
-      : m_xpr(xpr), m_rows(Rows), m_cols(Cols)
-    {}
+  /** Fixed-size constructor
+   */
+  EIGEN_DEVICE_FUNC inline ReshapedImpl_dense(XprType& xpr) : m_xpr(xpr), m_rows(Rows), m_cols(Cols) {}
 
-    /** Dynamic-size constructor
-      */
-    EIGEN_DEVICE_FUNC
-    inline ReshapedImpl_dense(XprType& xpr, Index nRows, Index nCols)
-      : m_xpr(xpr), m_rows(nRows), m_cols(nCols)
-    {}
+  /** Dynamic-size constructor
+   */
+  EIGEN_DEVICE_FUNC inline ReshapedImpl_dense(XprType& xpr, Index nRows, Index nCols)
+      : m_xpr(xpr), m_rows(nRows), m_cols(nCols) {}
 
-    EIGEN_DEVICE_FUNC Index rows() const { return m_rows; }
-    EIGEN_DEVICE_FUNC Index cols() const { return m_cols; }
+  EIGEN_DEVICE_FUNC Index rows() const { return m_rows; }
+  EIGEN_DEVICE_FUNC Index cols() const { return m_cols; }
 
-    #ifdef EIGEN_PARSED_BY_DOXYGEN
-    /** \sa MapBase::data() */
-    EIGEN_DEVICE_FUNC inline const Scalar* data() const;
-    EIGEN_DEVICE_FUNC inline Index innerStride() const;
-    EIGEN_DEVICE_FUNC inline Index outerStride() const;
-    #endif
+#ifdef EIGEN_PARSED_BY_DOXYGEN
+  /** \sa MapBase::data() */
+  EIGEN_DEVICE_FUNC inline const Scalar* data() const;
+  EIGEN_DEVICE_FUNC inline Index innerStride() const;
+  EIGEN_DEVICE_FUNC inline Index outerStride() const;
+#endif
 
-    /** \returns the nested expression */
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<XprType>&
-    nestedExpression() const { return m_xpr; }
+  /** \returns the nested expression */
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<XprType>& nestedExpression() const { return m_xpr; }
 
-    /** \returns the nested expression */
-    EIGEN_DEVICE_FUNC
-    std::remove_reference_t<XprType>&
-    nestedExpression() { return m_xpr; }
+  /** \returns the nested expression */
+  EIGEN_DEVICE_FUNC std::remove_reference_t<XprType>& nestedExpression() { return m_xpr; }
 
-  protected:
-
-    MatrixTypeNested m_xpr;
-    const internal::variable_if_dynamic<Index, Rows> m_rows;
-    const internal::variable_if_dynamic<Index, Cols> m_cols;
+ protected:
+  MatrixTypeNested m_xpr;
+  const internal::variable_if_dynamic<Index, Rows> m_rows;
+  const internal::variable_if_dynamic<Index, Cols> m_cols;
 };
 
-
 /** \internal Internal implementation of dense Reshaped in the direct access case. */
-template<typename XprType, int Rows, int Cols, int Order>
-class ReshapedImpl_dense<XprType, Rows, Cols, Order, true>
-  : public MapBase<Reshaped<XprType, Rows, Cols, Order> >
-{
-    typedef Reshaped<XprType, Rows, Cols, Order> ReshapedType;
-    typedef typename internal::ref_selector<XprType>::non_const_type XprTypeNested;
-  public:
+template <typename XprType, int Rows, int Cols, int Order>
+class ReshapedImpl_dense<XprType, Rows, Cols, Order, true> : public MapBase<Reshaped<XprType, Rows, Cols, Order> > {
+  typedef Reshaped<XprType, Rows, Cols, Order> ReshapedType;
+  typedef typename internal::ref_selector<XprType>::non_const_type XprTypeNested;
 
-    typedef MapBase<ReshapedType> Base;
-    EIGEN_DENSE_PUBLIC_INTERFACE(ReshapedType)
-    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(ReshapedImpl_dense)
+ public:
+  typedef MapBase<ReshapedType> Base;
+  EIGEN_DENSE_PUBLIC_INTERFACE(ReshapedType)
+  EIGEN_INHERIT_ASSIGNMENT_OPERATORS(ReshapedImpl_dense)
 
-    /** Fixed-size constructor
-      */
-    EIGEN_DEVICE_FUNC
-    inline ReshapedImpl_dense(XprType& xpr)
-      : Base(xpr.data()), m_xpr(xpr)
-    {}
+  /** Fixed-size constructor
+   */
+  EIGEN_DEVICE_FUNC inline ReshapedImpl_dense(XprType& xpr) : Base(xpr.data()), m_xpr(xpr) {}
 
-    /** Dynamic-size constructor
-      */
-    EIGEN_DEVICE_FUNC
-    inline ReshapedImpl_dense(XprType& xpr, Index nRows, Index nCols)
-      : Base(xpr.data(), nRows, nCols),
-        m_xpr(xpr)
-    {}
+  /** Dynamic-size constructor
+   */
+  EIGEN_DEVICE_FUNC inline ReshapedImpl_dense(XprType& xpr, Index nRows, Index nCols)
+      : Base(xpr.data(), nRows, nCols), m_xpr(xpr) {}
 
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<XprTypeNested>& nestedExpression() const
-    {
-      return m_xpr;
-    }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<XprTypeNested>& nestedExpression() const { return m_xpr; }
 
-    EIGEN_DEVICE_FUNC
-    XprType& nestedExpression() { return m_xpr; }
+  EIGEN_DEVICE_FUNC XprType& nestedExpression() { return m_xpr; }
 
-    /** \sa MapBase::innerStride() */
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index innerStride() const
-    {
-      return m_xpr.innerStride();
-    }
+  /** \sa MapBase::innerStride() */
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index innerStride() const { return m_xpr.innerStride(); }
 
-    /** \sa MapBase::outerStride() */
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index outerStride() const
-    {
-      return (((Flags&RowMajorBit)==RowMajorBit) ? this->cols() : this->rows()) * m_xpr.innerStride();
-    }
+  /** \sa MapBase::outerStride() */
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index outerStride() const {
+    return (((Flags & RowMajorBit) == RowMajorBit) ? this->cols() : this->rows()) * m_xpr.innerStride();
+  }
 
-  protected:
-
-    XprTypeNested m_xpr;
+ protected:
+  XprTypeNested m_xpr;
 };
 
 // Evaluators
-template<typename ArgType, int Rows, int Cols, int Order, bool HasDirectAccess> struct reshaped_evaluator;
+template <typename ArgType, int Rows, int Cols, int Order, bool HasDirectAccess>
+struct reshaped_evaluator;
 
-template<typename ArgType, int Rows, int Cols, int Order>
+template <typename ArgType, int Rows, int Cols, int Order>
 struct evaluator<Reshaped<ArgType, Rows, Cols, Order> >
-  : reshaped_evaluator<ArgType, Rows, Cols, Order, traits<Reshaped<ArgType,Rows,Cols,Order> >::HasDirectAccess>
-{
+    : reshaped_evaluator<ArgType, Rows, Cols, Order, traits<Reshaped<ArgType, Rows, Cols, Order> >::HasDirectAccess> {
   typedef Reshaped<ArgType, Rows, Cols, Order> XprType;
   typedef typename XprType::Scalar Scalar;
   // TODO: should check for smaller packet types
@@ -276,19 +242,22 @@
     CoeffReadCost = evaluator<ArgType>::CoeffReadCost,
     HasDirectAccess = traits<XprType>::HasDirectAccess,
 
-//     RowsAtCompileTime = traits<XprType>::RowsAtCompileTime,
-//     ColsAtCompileTime = traits<XprType>::ColsAtCompileTime,
-//     MaxRowsAtCompileTime = traits<XprType>::MaxRowsAtCompileTime,
-//     MaxColsAtCompileTime = traits<XprType>::MaxColsAtCompileTime,
-//
-//     InnerStrideAtCompileTime = traits<XprType>::HasSameStorageOrderAsXprType
-//                              ? int(inner_stride_at_compile_time<ArgType>::ret)
-//                              : Dynamic,
-//     OuterStrideAtCompileTime = Dynamic,
+    //     RowsAtCompileTime = traits<XprType>::RowsAtCompileTime,
+    //     ColsAtCompileTime = traits<XprType>::ColsAtCompileTime,
+    //     MaxRowsAtCompileTime = traits<XprType>::MaxRowsAtCompileTime,
+    //     MaxColsAtCompileTime = traits<XprType>::MaxColsAtCompileTime,
+    //
+    //     InnerStrideAtCompileTime = traits<XprType>::HasSameStorageOrderAsXprType
+    //                              ? int(inner_stride_at_compile_time<ArgType>::ret)
+    //                              : Dynamic,
+    //     OuterStrideAtCompileTime = Dynamic,
 
-    FlagsLinearAccessBit = (traits<XprType>::RowsAtCompileTime == 1 || traits<XprType>::ColsAtCompileTime == 1 || HasDirectAccess) ? LinearAccessBit : 0,
-    FlagsRowMajorBit = (traits<XprType>::ReshapedStorageOrder==int(RowMajor)) ? RowMajorBit : 0,
-    FlagsDirectAccessBit =  HasDirectAccess ? DirectAccessBit : 0,
+    FlagsLinearAccessBit =
+        (traits<XprType>::RowsAtCompileTime == 1 || traits<XprType>::ColsAtCompileTime == 1 || HasDirectAccess)
+            ? LinearAccessBit
+            : 0,
+    FlagsRowMajorBit = (traits<XprType>::ReshapedStorageOrder == int(RowMajor)) ? RowMajorBit : 0,
+    FlagsDirectAccessBit = HasDirectAccess ? DirectAccessBit : 0,
     Flags0 = evaluator<ArgType>::Flags & (HereditaryBits & ~RowMajorBit),
     Flags = Flags0 | FlagsLinearAccessBit | FlagsRowMajorBit | FlagsDirectAccessBit,
 
@@ -296,16 +265,14 @@
     Alignment = evaluator<ArgType>::Alignment
   };
   typedef reshaped_evaluator<ArgType, Rows, Cols, Order, HasDirectAccess> reshaped_evaluator_type;
-  EIGEN_DEVICE_FUNC explicit evaluator(const XprType& xpr) : reshaped_evaluator_type(xpr)
-  {
+  EIGEN_DEVICE_FUNC explicit evaluator(const XprType& xpr) : reshaped_evaluator_type(xpr) {
     EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
   }
 };
 
-template<typename ArgType, int Rows, int Cols, int Order>
+template <typename ArgType, int Rows, int Cols, int Order>
 struct reshaped_evaluator<ArgType, Rows, Cols, Order, /* HasDirectAccess */ false>
-  : evaluator_base<Reshaped<ArgType, Rows, Cols, Order> >
-{
+    : evaluator_base<Reshaped<ArgType, Rows, Cols, Order> > {
   typedef Reshaped<ArgType, Rows, Cols, Order> XprType;
 
   enum {
@@ -316,8 +283,7 @@
     Alignment = 0
   };
 
-  EIGEN_DEVICE_FUNC explicit reshaped_evaluator(const XprType& xpr) : m_argImpl(xpr.nestedExpression()), m_xpr(xpr)
-  {
+  EIGEN_DEVICE_FUNC explicit reshaped_evaluator(const XprType& xpr) : m_argImpl(xpr.nestedExpression()), m_xpr(xpr) {
     EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
   }
 
@@ -326,67 +292,45 @@
 
   typedef std::pair<Index, Index> RowCol;
 
-  EIGEN_DEVICE_FUNC inline RowCol index_remap(Index rowId, Index colId) const
-  {
-    if(Order==ColMajor)
-    {
+  EIGEN_DEVICE_FUNC inline RowCol index_remap(Index rowId, Index colId) const {
+    if (Order == ColMajor) {
       const Index nth_elem_idx = colId * m_xpr.rows() + rowId;
-      return RowCol(nth_elem_idx % m_xpr.nestedExpression().rows(),
-                    nth_elem_idx / m_xpr.nestedExpression().rows());
-    }
-    else
-    {
+      return RowCol(nth_elem_idx % m_xpr.nestedExpression().rows(), nth_elem_idx / m_xpr.nestedExpression().rows());
+    } else {
       const Index nth_elem_idx = colId + rowId * m_xpr.cols();
-      return RowCol(nth_elem_idx / m_xpr.nestedExpression().cols(),
-                    nth_elem_idx % m_xpr.nestedExpression().cols());
+      return RowCol(nth_elem_idx / m_xpr.nestedExpression().cols(), nth_elem_idx % m_xpr.nestedExpression().cols());
     }
   }
 
-  EIGEN_DEVICE_FUNC
-  inline Scalar& coeffRef(Index rowId, Index colId)
-  {
+  EIGEN_DEVICE_FUNC inline Scalar& coeffRef(Index rowId, Index colId) {
     EIGEN_STATIC_ASSERT_LVALUE(XprType)
     const RowCol row_col = index_remap(rowId, colId);
     return m_argImpl.coeffRef(row_col.first, row_col.second);
   }
 
-  EIGEN_DEVICE_FUNC
-  inline const Scalar& coeffRef(Index rowId, Index colId) const
-  {
+  EIGEN_DEVICE_FUNC inline const Scalar& coeffRef(Index rowId, Index colId) const {
     const RowCol row_col = index_remap(rowId, colId);
     return m_argImpl.coeffRef(row_col.first, row_col.second);
   }
 
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE const CoeffReturnType coeff(Index rowId, Index colId) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CoeffReturnType coeff(Index rowId, Index colId) const {
     const RowCol row_col = index_remap(rowId, colId);
     return m_argImpl.coeff(row_col.first, row_col.second);
   }
 
-  EIGEN_DEVICE_FUNC
-  inline Scalar& coeffRef(Index index)
-  {
+  EIGEN_DEVICE_FUNC inline Scalar& coeffRef(Index index) {
     EIGEN_STATIC_ASSERT_LVALUE(XprType)
-    const RowCol row_col = index_remap(Rows == 1 ? 0 : index,
-                                       Rows == 1 ? index : 0);
-    return m_argImpl.coeffRef(row_col.first, row_col.second);
-
-  }
-
-  EIGEN_DEVICE_FUNC
-  inline const Scalar& coeffRef(Index index) const
-  {
-    const RowCol row_col = index_remap(Rows == 1 ? 0 : index,
-                                       Rows == 1 ? index : 0);
+    const RowCol row_col = index_remap(Rows == 1 ? 0 : index, Rows == 1 ? index : 0);
     return m_argImpl.coeffRef(row_col.first, row_col.second);
   }
 
-  EIGEN_DEVICE_FUNC
-  inline const CoeffReturnType coeff(Index index) const
-  {
-    const RowCol row_col = index_remap(Rows == 1 ? 0 : index,
-                                       Rows == 1 ? index : 0);
+  EIGEN_DEVICE_FUNC inline const Scalar& coeffRef(Index index) const {
+    const RowCol row_col = index_remap(Rows == 1 ? 0 : index, Rows == 1 ? index : 0);
+    return m_argImpl.coeffRef(row_col.first, row_col.second);
+  }
+
+  EIGEN_DEVICE_FUNC inline const CoeffReturnType coeff(Index index) const {
+    const RowCol row_col = index_remap(Rows == 1 ? 0 : index, Rows == 1 ? index : 0);
     return m_argImpl.coeff(row_col.first, row_col.second);
   }
 #if 0
@@ -426,31 +370,29 @@
     return m_argImpl.template packet<Unaligned>(row_col.first, row_col.second, val);
   }
 #endif
-protected:
-
+ protected:
   evaluator<ArgType> m_argImpl;
   const XprType& m_xpr;
-
 };
 
-template<typename ArgType, int Rows, int Cols, int Order>
+template <typename ArgType, int Rows, int Cols, int Order>
 struct reshaped_evaluator<ArgType, Rows, Cols, Order, /* HasDirectAccess */ true>
-: mapbase_evaluator<Reshaped<ArgType, Rows, Cols, Order>,
-                      typename Reshaped<ArgType, Rows, Cols, Order>::PlainObject>
-{
+    : mapbase_evaluator<Reshaped<ArgType, Rows, Cols, Order>,
+                        typename Reshaped<ArgType, Rows, Cols, Order>::PlainObject> {
   typedef Reshaped<ArgType, Rows, Cols, Order> XprType;
   typedef typename XprType::Scalar Scalar;
 
   EIGEN_DEVICE_FUNC explicit reshaped_evaluator(const XprType& xpr)
-    : mapbase_evaluator<XprType, typename XprType::PlainObject>(xpr)
-  {
-    // TODO: for the 3.4 release, this should be turned to an internal assertion, but let's keep it as is for the beta lifetime
-    eigen_assert(((std::uintptr_t(xpr.data()) % plain_enum_max(1, evaluator<XprType>::Alignment)) == 0) && "data is not aligned");
+      : mapbase_evaluator<XprType, typename XprType::PlainObject>(xpr) {
+    // TODO: for the 3.4 release, this should be turned to an internal assertion, but let's keep it as is for the beta
+    // lifetime
+    eigen_assert(((std::uintptr_t(xpr.data()) % plain_enum_max(1, evaluator<XprType>::Alignment)) == 0) &&
+                 "data is not aligned");
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_RESHAPED_H
+#endif  // EIGEN_RESHAPED_H
diff --git a/Eigen/src/Core/ReturnByValue.h b/Eigen/src/Core/ReturnByValue.h
index c71e5f5..3b5e470 100644
--- a/Eigen/src/Core/ReturnByValue.h
+++ b/Eigen/src/Core/ReturnByValue.h
@@ -18,16 +18,13 @@
 
 namespace internal {
 
-template<typename Derived>
-struct traits<ReturnByValue<Derived> >
-  : public traits<typename traits<Derived>::ReturnType>
-{
+template <typename Derived>
+struct traits<ReturnByValue<Derived> > : public traits<typename traits<Derived>::ReturnType> {
   enum {
     // We're disabling the DirectAccess because e.g. the constructor of
     // the Block-with-DirectAccess expression requires to have a coeffRef method.
     // Also, we don't want to have to implement the stride stuff.
-    Flags = (traits<typename traits<Derived>::ReturnType>::Flags
-             | EvalBeforeNestingBit) & ~DirectAccessBit
+    Flags = (traits<typename traits<Derived>::ReturnType>::Flags | EvalBeforeNestingBit) & ~DirectAccessBit
   };
 };
 
@@ -38,54 +35,54 @@
  * FIXME: I don't understand why we need this specialization: isn't this taken care of by the EvalBeforeNestingBit ??
  * Answer: EvalBeforeNestingBit should be deprecated since we have the evaluators
  */
-template<typename Derived,int n,typename PlainObject>
-struct nested_eval<ReturnByValue<Derived>, n, PlainObject>
-{
+template <typename Derived, int n, typename PlainObject>
+struct nested_eval<ReturnByValue<Derived>, n, PlainObject> {
   typedef typename traits<Derived>::ReturnType type;
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \class ReturnByValue
-  * \ingroup Core_Module
-  *
-  */
-template<typename Derived> class ReturnByValue
-  : public internal::dense_xpr_base< ReturnByValue<Derived> >::type, internal::no_assignment_operator
-{
-  public:
-    typedef typename internal::traits<Derived>::ReturnType ReturnType;
+ * \ingroup Core_Module
+ *
+ */
+template <typename Derived>
+class ReturnByValue : public internal::dense_xpr_base<ReturnByValue<Derived> >::type, internal::no_assignment_operator {
+ public:
+  typedef typename internal::traits<Derived>::ReturnType ReturnType;
 
-    typedef typename internal::dense_xpr_base<ReturnByValue>::type Base;
-    EIGEN_DENSE_PUBLIC_INTERFACE(ReturnByValue)
+  typedef typename internal::dense_xpr_base<ReturnByValue>::type Base;
+  EIGEN_DENSE_PUBLIC_INTERFACE(ReturnByValue)
 
-    template<typename Dest>
-    EIGEN_DEVICE_FUNC
-    inline void evalTo(Dest& dst) const
-    { static_cast<const Derived*>(this)->evalTo(dst); }
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index rows() const EIGEN_NOEXCEPT { return static_cast<const Derived*>(this)->rows(); }
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index cols() const EIGEN_NOEXCEPT { return static_cast<const Derived*>(this)->cols(); }
+  template <typename Dest>
+  EIGEN_DEVICE_FUNC inline void evalTo(Dest& dst) const {
+    static_cast<const Derived*>(this)->evalTo(dst);
+  }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index rows() const EIGEN_NOEXCEPT {
+    return static_cast<const Derived*>(this)->rows();
+  }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index cols() const EIGEN_NOEXCEPT {
+    return static_cast<const Derived*>(this)->cols();
+  }
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-#define Unusable YOU_ARE_TRYING_TO_ACCESS_A_SINGLE_COEFFICIENT_IN_A_SPECIAL_EXPRESSION_WHERE_THAT_IS_NOT_ALLOWED_BECAUSE_THAT_WOULD_BE_INEFFICIENT
-    class Unusable{
-      Unusable(const Unusable&) {}
-      Unusable& operator=(const Unusable&) {return *this;}
-    };
-    const Unusable& coeff(Index) const { return *reinterpret_cast<const Unusable*>(this); }
-    const Unusable& coeff(Index,Index) const { return *reinterpret_cast<const Unusable*>(this); }
-    Unusable& coeffRef(Index) { return *reinterpret_cast<Unusable*>(this); }
-    Unusable& coeffRef(Index,Index) { return *reinterpret_cast<Unusable*>(this); }
+#define Unusable \
+  YOU_ARE_TRYING_TO_ACCESS_A_SINGLE_COEFFICIENT_IN_A_SPECIAL_EXPRESSION_WHERE_THAT_IS_NOT_ALLOWED_BECAUSE_THAT_WOULD_BE_INEFFICIENT
+  class Unusable {
+    Unusable(const Unusable&) {}
+    Unusable& operator=(const Unusable&) { return *this; }
+  };
+  const Unusable& coeff(Index) const { return *reinterpret_cast<const Unusable*>(this); }
+  const Unusable& coeff(Index, Index) const { return *reinterpret_cast<const Unusable*>(this); }
+  Unusable& coeffRef(Index) { return *reinterpret_cast<Unusable*>(this); }
+  Unusable& coeffRef(Index, Index) { return *reinterpret_cast<Unusable*>(this); }
 #undef Unusable
 #endif
 };
 
-template<typename Derived>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC Derived& DenseBase<Derived>::operator=(const ReturnByValue<OtherDerived>& other)
-{
+template <typename Derived>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC Derived& DenseBase<Derived>::operator=(const ReturnByValue<OtherDerived>& other) {
   other.evalTo(derived());
   return derived();
 }
@@ -96,27 +93,23 @@
 // when a ReturnByValue expression is assigned, the evaluator is not constructed.
 // TODO: Finalize port to new regime; ReturnByValue should not exist in the expression world
 
-template<typename Derived>
-struct evaluator<ReturnByValue<Derived> >
-  : public evaluator<typename internal::traits<Derived>::ReturnType>
-{
+template <typename Derived>
+struct evaluator<ReturnByValue<Derived> > : public evaluator<typename internal::traits<Derived>::ReturnType> {
   typedef ReturnByValue<Derived> XprType;
   typedef typename internal::traits<Derived>::ReturnType PlainObject;
   typedef evaluator<PlainObject> Base;
 
-  EIGEN_DEVICE_FUNC explicit evaluator(const XprType& xpr)
-    : m_result(xpr.rows(), xpr.cols())
-  {
+  EIGEN_DEVICE_FUNC explicit evaluator(const XprType& xpr) : m_result(xpr.rows(), xpr.cols()) {
     internal::construct_at<Base>(this, m_result);
     xpr.evalTo(m_result);
   }
 
-protected:
+ protected:
   PlainObject m_result;
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_RETURNBYVALUE_H
+#endif  // EIGEN_RETURNBYVALUE_H
diff --git a/Eigen/src/Core/Reverse.h b/Eigen/src/Core/Reverse.h
index 78ac4b1..66116aa 100644
--- a/Eigen/src/Core/Reverse.h
+++ b/Eigen/src/Core/Reverse.h
@@ -19,10 +19,8 @@
 
 namespace internal {
 
-template<typename MatrixType, int Direction>
-struct traits<Reverse<MatrixType, Direction> >
- : traits<MatrixType>
-{
+template <typename MatrixType, int Direction>
+struct traits<Reverse<MatrixType, Direction> > : traits<MatrixType> {
   typedef typename MatrixType::Scalar Scalar;
   typedef typename traits<MatrixType>::StorageKind StorageKind;
   typedef typename traits<MatrixType>::XprKind XprKind;
@@ -37,129 +35,110 @@
   };
 };
 
-template<typename PacketType, bool ReversePacket> struct reverse_packet_cond
-{
+template <typename PacketType, bool ReversePacket>
+struct reverse_packet_cond {
   static inline PacketType run(const PacketType& x) { return preverse(x); }
 };
 
-template<typename PacketType> struct reverse_packet_cond<PacketType,false>
-{
+template <typename PacketType>
+struct reverse_packet_cond<PacketType, false> {
   static inline PacketType run(const PacketType& x) { return x; }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \class Reverse
-  * \ingroup Core_Module
-  *
-  * \brief Expression of the reverse of a vector or matrix
-  *
-  * \tparam MatrixType the type of the object of which we are taking the reverse
-  * \tparam Direction defines the direction of the reverse operation, can be Vertical, Horizontal, or BothDirections
-  *
-  * This class represents an expression of the reverse of a vector.
-  * It is the return type of MatrixBase::reverse() and VectorwiseOp::reverse()
-  * and most of the time this is the only way it is used.
-  *
-  * \sa MatrixBase::reverse(), VectorwiseOp::reverse()
-  */
-template<typename MatrixType, int Direction> class Reverse
-  : public internal::dense_xpr_base< Reverse<MatrixType, Direction> >::type
-{
-  public:
+ * \ingroup Core_Module
+ *
+ * \brief Expression of the reverse of a vector or matrix
+ *
+ * \tparam MatrixType the type of the object of which we are taking the reverse
+ * \tparam Direction defines the direction of the reverse operation, can be Vertical, Horizontal, or BothDirections
+ *
+ * This class represents an expression of the reverse of a vector.
+ * It is the return type of MatrixBase::reverse() and VectorwiseOp::reverse()
+ * and most of the time this is the only way it is used.
+ *
+ * \sa MatrixBase::reverse(), VectorwiseOp::reverse()
+ */
+template <typename MatrixType, int Direction>
+class Reverse : public internal::dense_xpr_base<Reverse<MatrixType, Direction> >::type {
+ public:
+  typedef typename internal::dense_xpr_base<Reverse>::type Base;
+  EIGEN_DENSE_PUBLIC_INTERFACE(Reverse)
+  typedef internal::remove_all_t<MatrixType> NestedExpression;
+  using Base::IsRowMajor;
 
-    typedef typename internal::dense_xpr_base<Reverse>::type Base;
-    EIGEN_DENSE_PUBLIC_INTERFACE(Reverse)
-    typedef internal::remove_all_t<MatrixType> NestedExpression;
-    using Base::IsRowMajor;
+ protected:
+  enum {
+    PacketSize = internal::packet_traits<Scalar>::size,
+    IsColMajor = !IsRowMajor,
+    ReverseRow = (Direction == Vertical) || (Direction == BothDirections),
+    ReverseCol = (Direction == Horizontal) || (Direction == BothDirections),
+    OffsetRow = ReverseRow && IsColMajor ? PacketSize : 1,
+    OffsetCol = ReverseCol && IsRowMajor ? PacketSize : 1,
+    ReversePacket = (Direction == BothDirections) || ((Direction == Vertical) && IsColMajor) ||
+                    ((Direction == Horizontal) && IsRowMajor)
+  };
+  typedef internal::reverse_packet_cond<PacketScalar, ReversePacket> reverse_packet;
 
-  protected:
-    enum {
-      PacketSize = internal::packet_traits<Scalar>::size,
-      IsColMajor = !IsRowMajor,
-      ReverseRow = (Direction == Vertical)   || (Direction == BothDirections),
-      ReverseCol = (Direction == Horizontal) || (Direction == BothDirections),
-      OffsetRow  = ReverseRow && IsColMajor ? PacketSize : 1,
-      OffsetCol  = ReverseCol && IsRowMajor ? PacketSize : 1,
-      ReversePacket = (Direction == BothDirections)
-                    || ((Direction == Vertical)   && IsColMajor)
-                    || ((Direction == Horizontal) && IsRowMajor)
-    };
-    typedef internal::reverse_packet_cond<PacketScalar,ReversePacket> reverse_packet;
-  public:
+ public:
+  EIGEN_DEVICE_FUNC explicit inline Reverse(const MatrixType& matrix) : m_matrix(matrix) {}
 
-    EIGEN_DEVICE_FUNC explicit inline Reverse(const MatrixType& matrix) : m_matrix(matrix) { }
+  EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Reverse)
 
-    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Reverse)
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index rows() const EIGEN_NOEXCEPT { return m_matrix.rows(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index cols() const EIGEN_NOEXCEPT { return m_matrix.cols(); }
 
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index rows() const EIGEN_NOEXCEPT { return m_matrix.rows(); }
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index cols() const EIGEN_NOEXCEPT { return m_matrix.cols(); }
+  EIGEN_DEVICE_FUNC inline Index innerStride() const { return -m_matrix.innerStride(); }
 
-    EIGEN_DEVICE_FUNC inline Index innerStride() const
-    {
-      return -m_matrix.innerStride();
-    }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename MatrixType::Nested>& nestedExpression() const {
+    return m_matrix;
+  }
 
-    EIGEN_DEVICE_FUNC const internal::remove_all_t<typename MatrixType::Nested>&
-    nestedExpression() const
-    {
-      return m_matrix;
-    }
-
-  protected:
-    typename MatrixType::Nested m_matrix;
+ protected:
+  typename MatrixType::Nested m_matrix;
 };
 
 /** \returns an expression of the reverse of *this.
-  *
-  * Example: \include MatrixBase_reverse.cpp
-  * Output: \verbinclude MatrixBase_reverse.out
-  *
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC inline typename DenseBase<Derived>::ReverseReturnType
-DenseBase<Derived>::reverse()
-{
+ *
+ * Example: \include MatrixBase_reverse.cpp
+ * Output: \verbinclude MatrixBase_reverse.out
+ *
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC inline typename DenseBase<Derived>::ReverseReturnType DenseBase<Derived>::reverse() {
   return ReverseReturnType(derived());
 }
 
-
-//reverse const overload moved DenseBase.h due to a CUDA compiler bug
+// reverse const overload moved DenseBase.h due to a CUDA compiler bug
 
 /** This is the "in place" version of reverse: it reverses \c *this.
-  *
-  * In most cases it is probably better to simply use the reversed expression
-  * of a matrix. However, when reversing the matrix data itself is really needed,
-  * then this "in-place" version is probably the right choice because it provides
-  * the following additional benefits:
-  *  - less error prone: doing the same operation with .reverse() requires special care:
-  *    \code m = m.reverse().eval(); \endcode
-  *  - this API enables reverse operations without the need for a temporary
-  *  - it allows future optimizations (cache friendliness, etc.)
-  *
-  * \sa VectorwiseOp::reverseInPlace(), reverse() */
-template<typename Derived>
-EIGEN_DEVICE_FUNC inline void DenseBase<Derived>::reverseInPlace()
-{
-  if(cols()>rows())
-  {
-    Index half = cols()/2;
+ *
+ * In most cases it is probably better to simply use the reversed expression
+ * of a matrix. However, when reversing the matrix data itself is really needed,
+ * then this "in-place" version is probably the right choice because it provides
+ * the following additional benefits:
+ *  - less error prone: doing the same operation with .reverse() requires special care:
+ *    \code m = m.reverse().eval(); \endcode
+ *  - this API enables reverse operations without the need for a temporary
+ *  - it allows future optimizations (cache friendliness, etc.)
+ *
+ * \sa VectorwiseOp::reverseInPlace(), reverse() */
+template <typename Derived>
+EIGEN_DEVICE_FUNC inline void DenseBase<Derived>::reverseInPlace() {
+  if (cols() > rows()) {
+    Index half = cols() / 2;
     leftCols(half).swap(rightCols(half).reverse());
-    if((cols()%2)==1)
-    {
-      Index half2 = rows()/2;
+    if ((cols() % 2) == 1) {
+      Index half2 = rows() / 2;
       col(half).head(half2).swap(col(half).tail(half2).reverse());
     }
-  }
-  else
-  {
-    Index half = rows()/2;
+  } else {
+    Index half = rows() / 2;
     topRows(half).swap(bottomRows(half).reverse());
-    if((rows()%2)==1)
-    {
-      Index half2 = cols()/2;
+    if ((rows() % 2) == 1) {
+      Index half2 = cols() / 2;
       row(half).head(half2).swap(row(half).tail(half2).reverse());
     }
   }
@@ -167,54 +146,51 @@
 
 namespace internal {
 
-template<int Direction>
+template <int Direction>
 struct vectorwise_reverse_inplace_impl;
 
-template<>
-struct vectorwise_reverse_inplace_impl<Vertical>
-{
-  template<typename ExpressionType>
-  static void run(ExpressionType &xpr)
-  {
-    constexpr Index HalfAtCompileTime = ExpressionType::RowsAtCompileTime==Dynamic?Dynamic:ExpressionType::RowsAtCompileTime/2;
-    Index half = xpr.rows()/2;
-    xpr.template topRows<HalfAtCompileTime>(half)
-       .swap(xpr.template bottomRows<HalfAtCompileTime>(half).colwise().reverse());
+template <>
+struct vectorwise_reverse_inplace_impl<Vertical> {
+  template <typename ExpressionType>
+  static void run(ExpressionType& xpr) {
+    constexpr Index HalfAtCompileTime =
+        ExpressionType::RowsAtCompileTime == Dynamic ? Dynamic : ExpressionType::RowsAtCompileTime / 2;
+    Index half = xpr.rows() / 2;
+    xpr.template topRows<HalfAtCompileTime>(half).swap(
+        xpr.template bottomRows<HalfAtCompileTime>(half).colwise().reverse());
   }
 };
 
-template<>
-struct vectorwise_reverse_inplace_impl<Horizontal>
-{
-  template<typename ExpressionType>
-  static void run(ExpressionType &xpr)
-  {
-    constexpr Index HalfAtCompileTime = ExpressionType::ColsAtCompileTime==Dynamic?Dynamic:ExpressionType::ColsAtCompileTime/2;
-    Index half = xpr.cols()/2;
-    xpr.template leftCols<HalfAtCompileTime>(half)
-       .swap(xpr.template rightCols<HalfAtCompileTime>(half).rowwise().reverse());
+template <>
+struct vectorwise_reverse_inplace_impl<Horizontal> {
+  template <typename ExpressionType>
+  static void run(ExpressionType& xpr) {
+    constexpr Index HalfAtCompileTime =
+        ExpressionType::ColsAtCompileTime == Dynamic ? Dynamic : ExpressionType::ColsAtCompileTime / 2;
+    Index half = xpr.cols() / 2;
+    xpr.template leftCols<HalfAtCompileTime>(half).swap(
+        xpr.template rightCols<HalfAtCompileTime>(half).rowwise().reverse());
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** This is the "in place" version of VectorwiseOp::reverse: it reverses each column or row of \c *this.
-  *
-  * In most cases it is probably better to simply use the reversed expression
-  * of a matrix. However, when reversing the matrix data itself is really needed,
-  * then this "in-place" version is probably the right choice because it provides
-  * the following additional benefits:
-  *  - less error prone: doing the same operation with .reverse() requires special care:
-  *    \code m = m.reverse().eval(); \endcode
-  *  - this API enables reverse operations without the need for a temporary
-  *
-  * \sa DenseBase::reverseInPlace(), reverse() */
-template<typename ExpressionType, int Direction>
-EIGEN_DEVICE_FUNC void VectorwiseOp<ExpressionType,Direction>::reverseInPlace()
-{
+ *
+ * In most cases it is probably better to simply use the reversed expression
+ * of a matrix. However, when reversing the matrix data itself is really needed,
+ * then this "in-place" version is probably the right choice because it provides
+ * the following additional benefits:
+ *  - less error prone: doing the same operation with .reverse() requires special care:
+ *    \code m = m.reverse().eval(); \endcode
+ *  - this API enables reverse operations without the need for a temporary
+ *
+ * \sa DenseBase::reverseInPlace(), reverse() */
+template <typename ExpressionType, int Direction>
+EIGEN_DEVICE_FUNC void VectorwiseOp<ExpressionType, Direction>::reverseInPlace() {
   internal::vectorwise_reverse_inplace_impl<Direction>::run(m_matrix);
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_REVERSE_H
+#endif  // EIGEN_REVERSE_H
diff --git a/Eigen/src/Core/Select.h b/Eigen/src/Core/Select.h
index 9180a5c..9f46120 100644
--- a/Eigen/src/Core/Select.h
+++ b/Eigen/src/Core/Select.h
@@ -16,25 +16,23 @@
 namespace Eigen {
 
 /** \class Select
-  * \ingroup Core_Module
-  *
-  * \brief Expression of a coefficient wise version of the C++ ternary operator ?:
-  *
-  * \tparam ConditionMatrixType the type of the \em condition expression which must be a boolean matrix
-  * \tparam ThenMatrixType the type of the \em then expression
-  * \tparam ElseMatrixType the type of the \em else expression
-  *
-  * This class represents an expression of a coefficient wise version of the C++ ternary operator ?:.
-  * It is the return type of DenseBase::select() and most of the time this is the only way it is used.
-  *
-  * \sa DenseBase::select(const DenseBase<ThenDerived>&, const DenseBase<ElseDerived>&) const
-  */
+ * \ingroup Core_Module
+ *
+ * \brief Expression of a coefficient wise version of the C++ ternary operator ?:
+ *
+ * \tparam ConditionMatrixType the type of the \em condition expression which must be a boolean matrix
+ * \tparam ThenMatrixType the type of the \em then expression
+ * \tparam ElseMatrixType the type of the \em else expression
+ *
+ * This class represents an expression of a coefficient wise version of the C++ ternary operator ?:.
+ * It is the return type of DenseBase::select() and most of the time this is the only way it is used.
+ *
+ * \sa DenseBase::select(const DenseBase<ThenDerived>&, const DenseBase<ElseDerived>&) const
+ */
 
 namespace internal {
-template<typename ConditionMatrixType, typename ThenMatrixType, typename ElseMatrixType>
-struct traits<Select<ConditionMatrixType, ThenMatrixType, ElseMatrixType> >
- : traits<ThenMatrixType>
-{
+template <typename ConditionMatrixType, typename ThenMatrixType, typename ElseMatrixType>
+struct traits<Select<ConditionMatrixType, ThenMatrixType, ElseMatrixType> > : traits<ThenMatrixType> {
   typedef typename traits<ThenMatrixType>::Scalar Scalar;
   typedef Dense StorageKind;
   typedef typename traits<ThenMatrixType>::XprKind XprKind;
@@ -49,69 +47,49 @@
     Flags = (unsigned int)ThenMatrixType::Flags & ElseMatrixType::Flags & RowMajorBit
   };
 };
-}
+}  // namespace internal
 
-template<typename ConditionMatrixType, typename ThenMatrixType, typename ElseMatrixType>
-class Select : public internal::dense_xpr_base< Select<ConditionMatrixType, ThenMatrixType, ElseMatrixType> >::type,
-               internal::no_assignment_operator
-{
-  public:
+template <typename ConditionMatrixType, typename ThenMatrixType, typename ElseMatrixType>
+class Select : public internal::dense_xpr_base<Select<ConditionMatrixType, ThenMatrixType, ElseMatrixType> >::type,
+               internal::no_assignment_operator {
+ public:
+  typedef typename internal::dense_xpr_base<Select>::type Base;
+  EIGEN_DENSE_PUBLIC_INTERFACE(Select)
 
-    typedef typename internal::dense_xpr_base<Select>::type Base;
-    EIGEN_DENSE_PUBLIC_INTERFACE(Select)
+  inline EIGEN_DEVICE_FUNC Select(const ConditionMatrixType& a_conditionMatrix, const ThenMatrixType& a_thenMatrix,
+                                  const ElseMatrixType& a_elseMatrix)
+      : m_condition(a_conditionMatrix), m_then(a_thenMatrix), m_else(a_elseMatrix) {
+    eigen_assert(m_condition.rows() == m_then.rows() && m_condition.rows() == m_else.rows());
+    eigen_assert(m_condition.cols() == m_then.cols() && m_condition.cols() == m_else.cols());
+  }
 
-    inline EIGEN_DEVICE_FUNC
-    Select(const ConditionMatrixType& a_conditionMatrix,
-           const ThenMatrixType& a_thenMatrix,
-           const ElseMatrixType& a_elseMatrix)
-      : m_condition(a_conditionMatrix), m_then(a_thenMatrix), m_else(a_elseMatrix)
-    {
-      eigen_assert(m_condition.rows() == m_then.rows() && m_condition.rows() == m_else.rows());
-      eigen_assert(m_condition.cols() == m_then.cols() && m_condition.cols() == m_else.cols());
-    }
+  inline EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_condition.rows(); }
+  inline EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_condition.cols(); }
 
-    inline EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    Index rows() const EIGEN_NOEXCEPT { return m_condition.rows(); }
-    inline EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    Index cols() const EIGEN_NOEXCEPT { return m_condition.cols(); }
+  inline EIGEN_DEVICE_FUNC const Scalar coeff(Index i, Index j) const {
+    if (m_condition.coeff(i, j))
+      return m_then.coeff(i, j);
+    else
+      return m_else.coeff(i, j);
+  }
 
-    inline EIGEN_DEVICE_FUNC
-    const Scalar coeff(Index i, Index j) const
-    {
-      if (m_condition.coeff(i,j))
-        return m_then.coeff(i,j);
-      else
-        return m_else.coeff(i,j);
-    }
+  inline EIGEN_DEVICE_FUNC const Scalar coeff(Index i) const {
+    if (m_condition.coeff(i))
+      return m_then.coeff(i);
+    else
+      return m_else.coeff(i);
+  }
 
-    inline EIGEN_DEVICE_FUNC
-    const Scalar coeff(Index i) const
-    {
-      if (m_condition.coeff(i))
-        return m_then.coeff(i);
-      else
-        return m_else.coeff(i);
-    }
+  inline EIGEN_DEVICE_FUNC const ConditionMatrixType& conditionMatrix() const { return m_condition; }
 
-    inline EIGEN_DEVICE_FUNC const ConditionMatrixType& conditionMatrix() const
-    {
-      return m_condition;
-    }
+  inline EIGEN_DEVICE_FUNC const ThenMatrixType& thenMatrix() const { return m_then; }
 
-    inline EIGEN_DEVICE_FUNC const ThenMatrixType& thenMatrix() const
-    {
-      return m_then;
-    }
+  inline EIGEN_DEVICE_FUNC const ElseMatrixType& elseMatrix() const { return m_else; }
 
-    inline EIGEN_DEVICE_FUNC const ElseMatrixType& elseMatrix() const
-    {
-      return m_else;
-    }
-
-  protected:
-    typename ConditionMatrixType::Nested m_condition;
-    typename ThenMatrixType::Nested m_then;
-    typename ElseMatrixType::Nested m_else;
+ protected:
+  typename ConditionMatrixType::Nested m_condition;
+  typename ThenMatrixType::Nested m_then;
+  typename ElseMatrixType::Nested m_else;
 };
 
 /** \returns a matrix where each coefficient (i,j) is equal to \a thenMatrix(i,j)
@@ -125,17 +103,14 @@
 template <typename Derived>
 template <typename ThenDerived, typename ElseDerived>
 inline EIGEN_DEVICE_FUNC CwiseTernaryOp<
-    internal::scalar_boolean_select_op<typename DenseBase<ThenDerived>::Scalar,
-                                       typename DenseBase<ElseDerived>::Scalar,
+    internal::scalar_boolean_select_op<typename DenseBase<ThenDerived>::Scalar, typename DenseBase<ElseDerived>::Scalar,
                                        typename DenseBase<Derived>::Scalar>,
     ThenDerived, ElseDerived, Derived>
-DenseBase<Derived>::select(const DenseBase<ThenDerived>& thenMatrix,
-                           const DenseBase<ElseDerived>& elseMatrix) const {
-    using Op = internal::scalar_boolean_select_op<
-        typename DenseBase<ThenDerived>::Scalar,
-        typename DenseBase<ElseDerived>::Scalar, Scalar>;
-    return CwiseTernaryOp<Op, ThenDerived, ElseDerived, Derived>(
-        thenMatrix.derived(), elseMatrix.derived(), derived(), Op());
+DenseBase<Derived>::select(const DenseBase<ThenDerived>& thenMatrix, const DenseBase<ElseDerived>& elseMatrix) const {
+  using Op = internal::scalar_boolean_select_op<typename DenseBase<ThenDerived>::Scalar,
+                                                typename DenseBase<ElseDerived>::Scalar, Scalar>;
+  return CwiseTernaryOp<Op, ThenDerived, ElseDerived, Derived>(thenMatrix.derived(), elseMatrix.derived(), derived(),
+                                                               Op());
 }
 /** Version of DenseBase::select(const DenseBase&, const DenseBase&) with
  * the \em else expression being a scalar value.
@@ -145,21 +120,16 @@
 template <typename Derived>
 template <typename ThenDerived>
 inline EIGEN_DEVICE_FUNC CwiseTernaryOp<
-    internal::scalar_boolean_select_op<typename DenseBase<ThenDerived>::Scalar,
-                                       typename DenseBase<ThenDerived>::Scalar,
+    internal::scalar_boolean_select_op<typename DenseBase<ThenDerived>::Scalar, typename DenseBase<ThenDerived>::Scalar,
                                        typename DenseBase<Derived>::Scalar>,
     ThenDerived, typename DenseBase<ThenDerived>::ConstantReturnType, Derived>
-DenseBase<Derived>::select(
-    const DenseBase<ThenDerived>& thenMatrix,
-    const typename DenseBase<ThenDerived>::Scalar& elseScalar) const {
-    using ElseConstantType =
-        typename DenseBase<ThenDerived>::ConstantReturnType;
-    using Op = internal::scalar_boolean_select_op<
-        typename DenseBase<ThenDerived>::Scalar,
-        typename DenseBase<ThenDerived>::Scalar, Scalar>;
-    return CwiseTernaryOp<Op, ThenDerived, ElseConstantType, Derived>(
-        thenMatrix.derived(), ElseConstantType(rows(), cols(), elseScalar),
-        derived(), Op());
+DenseBase<Derived>::select(const DenseBase<ThenDerived>& thenMatrix,
+                           const typename DenseBase<ThenDerived>::Scalar& elseScalar) const {
+  using ElseConstantType = typename DenseBase<ThenDerived>::ConstantReturnType;
+  using Op = internal::scalar_boolean_select_op<typename DenseBase<ThenDerived>::Scalar,
+                                                typename DenseBase<ThenDerived>::Scalar, Scalar>;
+  return CwiseTernaryOp<Op, ThenDerived, ElseConstantType, Derived>(
+      thenMatrix.derived(), ElseConstantType(rows(), cols(), elseScalar), derived(), Op());
 }
 /** Version of DenseBase::select(const DenseBase&, const DenseBase&) with
  * the \em then expression being a scalar value.
@@ -169,24 +139,18 @@
 template <typename Derived>
 template <typename ElseDerived>
 inline EIGEN_DEVICE_FUNC CwiseTernaryOp<
-    internal::scalar_boolean_select_op<typename DenseBase<ElseDerived>::Scalar,
-                                       typename DenseBase<ElseDerived>::Scalar,
+    internal::scalar_boolean_select_op<typename DenseBase<ElseDerived>::Scalar, typename DenseBase<ElseDerived>::Scalar,
                                        typename DenseBase<Derived>::Scalar>,
-    typename DenseBase<ElseDerived>::ConstantReturnType, ElseDerived,
-    Derived>
-DenseBase<Derived>::select(
-    const typename DenseBase<ElseDerived>::Scalar& thenScalar,
-    const DenseBase<ElseDerived>& elseMatrix) const {
-    using ThenConstantType =
-        typename DenseBase<ElseDerived>::ConstantReturnType;
-    using Op = internal::scalar_boolean_select_op<
-        typename DenseBase<ElseDerived>::Scalar,
-        typename DenseBase<ElseDerived>::Scalar, Scalar>;
-    return CwiseTernaryOp<Op, ThenConstantType, ElseDerived, Derived>(
-        ThenConstantType(rows(), cols(), thenScalar), elseMatrix.derived(),
-        derived(), Op());
+    typename DenseBase<ElseDerived>::ConstantReturnType, ElseDerived, Derived>
+DenseBase<Derived>::select(const typename DenseBase<ElseDerived>::Scalar& thenScalar,
+                           const DenseBase<ElseDerived>& elseMatrix) const {
+  using ThenConstantType = typename DenseBase<ElseDerived>::ConstantReturnType;
+  using Op = internal::scalar_boolean_select_op<typename DenseBase<ElseDerived>::Scalar,
+                                                typename DenseBase<ElseDerived>::Scalar, Scalar>;
+  return CwiseTernaryOp<Op, ThenConstantType, ElseDerived, Derived>(ThenConstantType(rows(), cols(), thenScalar),
+                                                                    elseMatrix.derived(), derived(), Op());
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SELECT_H
+#endif  // EIGEN_SELECT_H
diff --git a/Eigen/src/Core/SelfAdjointView.h b/Eigen/src/Core/SelfAdjointView.h
index 0c8a333..4e9a923 100644
--- a/Eigen/src/Core/SelfAdjointView.h
+++ b/Eigen/src/Core/SelfAdjointView.h
@@ -16,25 +16,24 @@
 namespace Eigen {
 
 /** \class SelfAdjointView
-  * \ingroup Core_Module
-  *
-  *
-  * \brief Expression of a selfadjoint matrix from a triangular part of a dense matrix
-  *
-  * \tparam MatrixType the type of the dense matrix storing the coefficients
-  * \tparam TriangularPart can be either \c #Lower or \c #Upper
-  *
-  * This class is an expression of a sefladjoint matrix from a triangular part of a matrix
-  * with given dense storage of the coefficients. It is the return type of MatrixBase::selfadjointView()
-  * and most of the time this is the only way that it is used.
-  *
-  * \sa class TriangularBase, MatrixBase::selfadjointView()
-  */
+ * \ingroup Core_Module
+ *
+ *
+ * \brief Expression of a selfadjoint matrix from a triangular part of a dense matrix
+ *
+ * \tparam MatrixType the type of the dense matrix storing the coefficients
+ * \tparam TriangularPart can be either \c #Lower or \c #Upper
+ *
+ * This class is an expression of a sefladjoint matrix from a triangular part of a matrix
+ * with given dense storage of the coefficients. It is the return type of MatrixBase::selfadjointView()
+ * and most of the time this is the only way that it is used.
+ *
+ * \sa class TriangularBase, MatrixBase::selfadjointView()
+ */
 
 namespace internal {
-template<typename MatrixType, unsigned int UpLo>
-struct traits<SelfAdjointView<MatrixType, UpLo> > : traits<MatrixType>
-{
+template <typename MatrixType, unsigned int UpLo>
+struct traits<SelfAdjointView<MatrixType, UpLo> > : traits<MatrixType> {
   typedef typename ref_selector<MatrixType>::non_const_type MatrixTypeNested;
   typedef remove_all_t<MatrixTypeNested> MatrixTypeNestedCleaned;
   typedef MatrixType ExpressionType;
@@ -42,237 +41,207 @@
   enum {
     Mode = UpLo | SelfAdjoint,
     FlagsLvalueBit = is_lvalue<MatrixType>::value ? LvalueBit : 0,
-    Flags =  MatrixTypeNestedCleaned::Flags & (HereditaryBits|FlagsLvalueBit)
-           & (~(PacketAccessBit | DirectAccessBit | LinearAccessBit)) // FIXME these flags should be preserved
+    Flags = MatrixTypeNestedCleaned::Flags & (HereditaryBits | FlagsLvalueBit) &
+            (~(PacketAccessBit | DirectAccessBit | LinearAccessBit))  // FIXME these flags should be preserved
   };
 };
-}
+}  // namespace internal
 
+template <typename MatrixType_, unsigned int UpLo>
+class SelfAdjointView : public TriangularBase<SelfAdjointView<MatrixType_, UpLo> > {
+ public:
+  EIGEN_STATIC_ASSERT(UpLo == Lower || UpLo == Upper, SELFADJOINTVIEW_ACCEPTS_UPPER_AND_LOWER_MODE_ONLY)
 
-template<typename MatrixType_, unsigned int UpLo> class SelfAdjointView
-  : public TriangularBase<SelfAdjointView<MatrixType_, UpLo> >
-{
-  public:
-    EIGEN_STATIC_ASSERT(UpLo==Lower || UpLo==Upper,SELFADJOINTVIEW_ACCEPTS_UPPER_AND_LOWER_MODE_ONLY)
+  typedef MatrixType_ MatrixType;
+  typedef TriangularBase<SelfAdjointView> Base;
+  typedef typename internal::traits<SelfAdjointView>::MatrixTypeNested MatrixTypeNested;
+  typedef typename internal::traits<SelfAdjointView>::MatrixTypeNestedCleaned MatrixTypeNestedCleaned;
+  typedef MatrixTypeNestedCleaned NestedExpression;
 
-    typedef MatrixType_ MatrixType;
-    typedef TriangularBase<SelfAdjointView> Base;
-    typedef typename internal::traits<SelfAdjointView>::MatrixTypeNested MatrixTypeNested;
-    typedef typename internal::traits<SelfAdjointView>::MatrixTypeNestedCleaned MatrixTypeNestedCleaned;
-    typedef MatrixTypeNestedCleaned NestedExpression;
+  /** \brief The type of coefficients in this matrix */
+  typedef typename internal::traits<SelfAdjointView>::Scalar Scalar;
+  typedef typename MatrixType::StorageIndex StorageIndex;
+  typedef internal::remove_all_t<typename MatrixType::ConjugateReturnType> MatrixConjugateReturnType;
+  typedef SelfAdjointView<std::add_const_t<MatrixType>, UpLo> ConstSelfAdjointView;
 
-    /** \brief The type of coefficients in this matrix */
-    typedef typename internal::traits<SelfAdjointView>::Scalar Scalar;
-    typedef typename MatrixType::StorageIndex StorageIndex;
-    typedef internal::remove_all_t<typename MatrixType::ConjugateReturnType> MatrixConjugateReturnType;
-    typedef SelfAdjointView<std::add_const_t<MatrixType>, UpLo> ConstSelfAdjointView;
+  enum {
+    Mode = internal::traits<SelfAdjointView>::Mode,
+    Flags = internal::traits<SelfAdjointView>::Flags,
+    TransposeMode = ((int(Mode) & int(Upper)) ? Lower : 0) | ((int(Mode) & int(Lower)) ? Upper : 0)
+  };
+  typedef typename MatrixType::PlainObject PlainObject;
 
-    enum {
-      Mode = internal::traits<SelfAdjointView>::Mode,
-      Flags = internal::traits<SelfAdjointView>::Flags,
-      TransposeMode = ((int(Mode) & int(Upper)) ? Lower : 0) | ((int(Mode) & int(Lower)) ? Upper : 0)
-    };
-    typedef typename MatrixType::PlainObject PlainObject;
+  EIGEN_DEVICE_FUNC explicit inline SelfAdjointView(MatrixType& matrix) : m_matrix(matrix) {}
 
-    EIGEN_DEVICE_FUNC
-    explicit inline SelfAdjointView(MatrixType& matrix) : m_matrix(matrix) { }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index rows() const EIGEN_NOEXCEPT { return m_matrix.rows(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index cols() const EIGEN_NOEXCEPT { return m_matrix.cols(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index outerStride() const EIGEN_NOEXCEPT { return m_matrix.outerStride(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index innerStride() const EIGEN_NOEXCEPT { return m_matrix.innerStride(); }
 
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index rows() const EIGEN_NOEXCEPT { return m_matrix.rows(); }
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index cols() const EIGEN_NOEXCEPT { return m_matrix.cols(); }
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index outerStride() const EIGEN_NOEXCEPT { return m_matrix.outerStride(); }
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index innerStride() const EIGEN_NOEXCEPT { return m_matrix.innerStride(); }
+  /** \sa MatrixBase::coeff()
+   * \warning the coordinates must fit into the referenced triangular part
+   */
+  EIGEN_DEVICE_FUNC inline Scalar coeff(Index row, Index col) const {
+    Base::check_coordinates_internal(row, col);
+    return m_matrix.coeff(row, col);
+  }
 
-    /** \sa MatrixBase::coeff()
-      * \warning the coordinates must fit into the referenced triangular part
-      */
-    EIGEN_DEVICE_FUNC
-    inline Scalar coeff(Index row, Index col) const
-    {
-      Base::check_coordinates_internal(row, col);
-      return m_matrix.coeff(row, col);
-    }
+  /** \sa MatrixBase::coeffRef()
+   * \warning the coordinates must fit into the referenced triangular part
+   */
+  EIGEN_DEVICE_FUNC inline Scalar& coeffRef(Index row, Index col) {
+    EIGEN_STATIC_ASSERT_LVALUE(SelfAdjointView);
+    Base::check_coordinates_internal(row, col);
+    return m_matrix.coeffRef(row, col);
+  }
 
-    /** \sa MatrixBase::coeffRef()
-      * \warning the coordinates must fit into the referenced triangular part
-      */
-    EIGEN_DEVICE_FUNC
-    inline Scalar& coeffRef(Index row, Index col)
-    {
-      EIGEN_STATIC_ASSERT_LVALUE(SelfAdjointView);
-      Base::check_coordinates_internal(row, col);
-      return m_matrix.coeffRef(row, col);
-    }
+  /** \internal */
+  EIGEN_DEVICE_FUNC const MatrixTypeNestedCleaned& _expression() const { return m_matrix; }
 
-    /** \internal */
-    EIGEN_DEVICE_FUNC
-    const MatrixTypeNestedCleaned& _expression() const { return m_matrix; }
+  EIGEN_DEVICE_FUNC const MatrixTypeNestedCleaned& nestedExpression() const { return m_matrix; }
+  EIGEN_DEVICE_FUNC MatrixTypeNestedCleaned& nestedExpression() { return m_matrix; }
 
-    EIGEN_DEVICE_FUNC
-    const MatrixTypeNestedCleaned& nestedExpression() const { return m_matrix; }
-    EIGEN_DEVICE_FUNC
-    MatrixTypeNestedCleaned& nestedExpression() { return m_matrix; }
+  /** Efficient triangular matrix times vector/matrix product */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC const Product<SelfAdjointView, OtherDerived> operator*(const MatrixBase<OtherDerived>& rhs) const {
+    return Product<SelfAdjointView, OtherDerived>(*this, rhs.derived());
+  }
 
-    /** Efficient triangular matrix times vector/matrix product */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    const Product<SelfAdjointView,OtherDerived>
-    operator*(const MatrixBase<OtherDerived>& rhs) const
-    {
-      return Product<SelfAdjointView,OtherDerived>(*this, rhs.derived());
-    }
+  /** Efficient vector/matrix times triangular matrix product */
+  template <typename OtherDerived>
+  friend EIGEN_DEVICE_FUNC const Product<OtherDerived, SelfAdjointView> operator*(const MatrixBase<OtherDerived>& lhs,
+                                                                                  const SelfAdjointView& rhs) {
+    return Product<OtherDerived, SelfAdjointView>(lhs.derived(), rhs);
+  }
 
-    /** Efficient vector/matrix times triangular matrix product */
-    template<typename OtherDerived> friend
-    EIGEN_DEVICE_FUNC
-    const Product<OtherDerived,SelfAdjointView>
-    operator*(const MatrixBase<OtherDerived>& lhs, const SelfAdjointView& rhs)
-    {
-      return Product<OtherDerived,SelfAdjointView>(lhs.derived(),rhs);
-    }
+  friend EIGEN_DEVICE_FUNC const
+      SelfAdjointView<const EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(Scalar, MatrixType, product), UpLo>
+      operator*(const Scalar& s, const SelfAdjointView& mat) {
+    return (s * mat.nestedExpression()).template selfadjointView<UpLo>();
+  }
 
-    friend EIGEN_DEVICE_FUNC
-    const SelfAdjointView<const EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(Scalar,MatrixType,product),UpLo>
-    operator*(const Scalar& s, const SelfAdjointView& mat)
-    {
-      return (s*mat.nestedExpression()).template selfadjointView<UpLo>();
-    }
+  /** Perform a symmetric rank 2 update of the selfadjoint matrix \c *this:
+   * \f$ this = this + \alpha u v^* + conj(\alpha) v u^* \f$
+   * \returns a reference to \c *this
+   *
+   * The vectors \a u and \c v \b must be column vectors, however they can be
+   * a adjoint expression without any overhead. Only the meaningful triangular
+   * part of the matrix is updated, the rest is left unchanged.
+   *
+   * \sa rankUpdate(const MatrixBase<DerivedU>&, Scalar)
+   */
+  template <typename DerivedU, typename DerivedV>
+  EIGEN_DEVICE_FUNC SelfAdjointView& rankUpdate(const MatrixBase<DerivedU>& u, const MatrixBase<DerivedV>& v,
+                                                const Scalar& alpha = Scalar(1));
 
-    /** Perform a symmetric rank 2 update of the selfadjoint matrix \c *this:
-      * \f$ this = this + \alpha u v^* + conj(\alpha) v u^* \f$
-      * \returns a reference to \c *this
-      *
-      * The vectors \a u and \c v \b must be column vectors, however they can be
-      * a adjoint expression without any overhead. Only the meaningful triangular
-      * part of the matrix is updated, the rest is left unchanged.
-      *
-      * \sa rankUpdate(const MatrixBase<DerivedU>&, Scalar)
-      */
-    template<typename DerivedU, typename DerivedV>
-    EIGEN_DEVICE_FUNC
-    SelfAdjointView& rankUpdate(const MatrixBase<DerivedU>& u, const MatrixBase<DerivedV>& v, const Scalar& alpha = Scalar(1));
+  /** Perform a symmetric rank K update of the selfadjoint matrix \c *this:
+   * \f$ this = this + \alpha ( u u^* ) \f$ where \a u is a vector or matrix.
+   *
+   * \returns a reference to \c *this
+   *
+   * Note that to perform \f$ this = this + \alpha ( u^* u ) \f$ you can simply
+   * call this function with u.adjoint().
+   *
+   * \sa rankUpdate(const MatrixBase<DerivedU>&, const MatrixBase<DerivedV>&, Scalar)
+   */
+  template <typename DerivedU>
+  EIGEN_DEVICE_FUNC SelfAdjointView& rankUpdate(const MatrixBase<DerivedU>& u, const Scalar& alpha = Scalar(1));
 
-    /** Perform a symmetric rank K update of the selfadjoint matrix \c *this:
-      * \f$ this = this + \alpha ( u u^* ) \f$ where \a u is a vector or matrix.
-      *
-      * \returns a reference to \c *this
-      *
-      * Note that to perform \f$ this = this + \alpha ( u^* u ) \f$ you can simply
-      * call this function with u.adjoint().
-      *
-      * \sa rankUpdate(const MatrixBase<DerivedU>&, const MatrixBase<DerivedV>&, Scalar)
-      */
-    template<typename DerivedU>
-    EIGEN_DEVICE_FUNC
-    SelfAdjointView& rankUpdate(const MatrixBase<DerivedU>& u, const Scalar& alpha = Scalar(1));
+  /** \returns an expression of a triangular view extracted from the current selfadjoint view of a given triangular part
+   *
+   * The parameter \a TriMode can have the following values: \c #Upper, \c #StrictlyUpper, \c #UnitUpper,
+   * \c #Lower, \c #StrictlyLower, \c #UnitLower.
+   *
+   * If \c TriMode references the same triangular part than \c *this, then this method simply return a \c TriangularView
+   * of the nested expression, otherwise, the nested expression is first transposed, thus returning a \c
+   * TriangularView<Transpose<MatrixType>> object.
+   *
+   * \sa MatrixBase::triangularView(), class TriangularView
+   */
+  template <unsigned int TriMode>
+  EIGEN_DEVICE_FUNC
+      std::conditional_t<(TriMode & (Upper | Lower)) == (UpLo & (Upper | Lower)), TriangularView<MatrixType, TriMode>,
+                         TriangularView<typename MatrixType::AdjointReturnType, TriMode> >
+      triangularView() const {
+    std::conditional_t<(TriMode & (Upper | Lower)) == (UpLo & (Upper | Lower)), MatrixType&,
+                       typename MatrixType::ConstTransposeReturnType>
+        tmp1(m_matrix);
+    std::conditional_t<(TriMode & (Upper | Lower)) == (UpLo & (Upper | Lower)), MatrixType&,
+                       typename MatrixType::AdjointReturnType>
+        tmp2(tmp1);
+    return std::conditional_t<(TriMode & (Upper | Lower)) == (UpLo & (Upper | Lower)),
+                              TriangularView<MatrixType, TriMode>,
+                              TriangularView<typename MatrixType::AdjointReturnType, TriMode> >(tmp2);
+  }
 
-    /** \returns an expression of a triangular view extracted from the current selfadjoint view of a given triangular part
-      *
-      * The parameter \a TriMode can have the following values: \c #Upper, \c #StrictlyUpper, \c #UnitUpper,
-      * \c #Lower, \c #StrictlyLower, \c #UnitLower.
-      *
-      * If \c TriMode references the same triangular part than \c *this, then this method simply return a \c TriangularView of the nested expression,
-      * otherwise, the nested expression is first transposed, thus returning a \c TriangularView<Transpose<MatrixType>> object.
-      *
-      * \sa MatrixBase::triangularView(), class TriangularView
-      */
-    template<unsigned int TriMode>
-    EIGEN_DEVICE_FUNC
-    std::conditional_t<(TriMode&(Upper|Lower))==(UpLo&(Upper|Lower)),
-                            TriangularView<MatrixType,TriMode>,
-                            TriangularView<typename MatrixType::AdjointReturnType,TriMode> >
-    triangularView() const
-    {
-      std::conditional_t<(TriMode&(Upper|Lower))==(UpLo&(Upper|Lower)), MatrixType&, typename MatrixType::ConstTransposeReturnType> tmp1(m_matrix);
-      std::conditional_t<(TriMode&(Upper|Lower))==(UpLo&(Upper|Lower)), MatrixType&, typename MatrixType::AdjointReturnType> tmp2(tmp1);
-      return std::conditional_t<(TriMode&(Upper|Lower))==(UpLo&(Upper|Lower)),
-                          TriangularView<MatrixType,TriMode>,
-                          TriangularView<typename MatrixType::AdjointReturnType,TriMode> >(tmp2);
-    }
+  typedef SelfAdjointView<const MatrixConjugateReturnType, UpLo> ConjugateReturnType;
+  /** \sa MatrixBase::conjugate() const */
+  EIGEN_DEVICE_FUNC inline const ConjugateReturnType conjugate() const {
+    return ConjugateReturnType(m_matrix.conjugate());
+  }
 
-    typedef SelfAdjointView<const MatrixConjugateReturnType,UpLo> ConjugateReturnType;
-    /** \sa MatrixBase::conjugate() const */
-    EIGEN_DEVICE_FUNC
-    inline const ConjugateReturnType conjugate() const
-    { return ConjugateReturnType(m_matrix.conjugate()); }
+  /** \returns an expression of the complex conjugate of \c *this if Cond==true,
+   *           returns \c *this otherwise.
+   */
+  template <bool Cond>
+  EIGEN_DEVICE_FUNC inline std::conditional_t<Cond, ConjugateReturnType, ConstSelfAdjointView> conjugateIf() const {
+    typedef std::conditional_t<Cond, ConjugateReturnType, ConstSelfAdjointView> ReturnType;
+    return ReturnType(m_matrix.template conjugateIf<Cond>());
+  }
 
-    /** \returns an expression of the complex conjugate of \c *this if Cond==true,
-     *           returns \c *this otherwise.
-     */
-    template<bool Cond>
-    EIGEN_DEVICE_FUNC
-    inline std::conditional_t<Cond,ConjugateReturnType,ConstSelfAdjointView>
-    conjugateIf() const
-    {
-      typedef std::conditional_t<Cond,ConjugateReturnType,ConstSelfAdjointView> ReturnType;
-      return ReturnType(m_matrix.template conjugateIf<Cond>());
-    }
+  typedef SelfAdjointView<const typename MatrixType::AdjointReturnType, TransposeMode> AdjointReturnType;
+  /** \sa MatrixBase::adjoint() const */
+  EIGEN_DEVICE_FUNC inline const AdjointReturnType adjoint() const { return AdjointReturnType(m_matrix.adjoint()); }
 
-    typedef SelfAdjointView<const typename MatrixType::AdjointReturnType,TransposeMode> AdjointReturnType;
-    /** \sa MatrixBase::adjoint() const */
-    EIGEN_DEVICE_FUNC
-    inline const AdjointReturnType adjoint() const
-    { return AdjointReturnType(m_matrix.adjoint()); }
+  typedef SelfAdjointView<typename MatrixType::TransposeReturnType, TransposeMode> TransposeReturnType;
+  /** \sa MatrixBase::transpose() */
+  template <class Dummy = int>
+  EIGEN_DEVICE_FUNC inline TransposeReturnType transpose(
+      std::enable_if_t<Eigen::internal::is_lvalue<MatrixType>::value, Dummy*> = nullptr) {
+    typename MatrixType::TransposeReturnType tmp(m_matrix);
+    return TransposeReturnType(tmp);
+  }
 
-    typedef SelfAdjointView<typename MatrixType::TransposeReturnType,TransposeMode> TransposeReturnType;
-     /** \sa MatrixBase::transpose() */
-    template<class Dummy=int>
-    EIGEN_DEVICE_FUNC
-    inline TransposeReturnType transpose(std::enable_if_t<Eigen::internal::is_lvalue<MatrixType>::value, Dummy*> = nullptr)
-    {
-      typename MatrixType::TransposeReturnType tmp(m_matrix);
-      return TransposeReturnType(tmp);
-    }
+  typedef SelfAdjointView<const typename MatrixType::ConstTransposeReturnType, TransposeMode> ConstTransposeReturnType;
+  /** \sa MatrixBase::transpose() const */
+  EIGEN_DEVICE_FUNC inline const ConstTransposeReturnType transpose() const {
+    return ConstTransposeReturnType(m_matrix.transpose());
+  }
 
-    typedef SelfAdjointView<const typename MatrixType::ConstTransposeReturnType,TransposeMode> ConstTransposeReturnType;
-    /** \sa MatrixBase::transpose() const */
-    EIGEN_DEVICE_FUNC
-    inline const ConstTransposeReturnType transpose() const
-    {
-      return ConstTransposeReturnType(m_matrix.transpose());
-    }
+  /** \returns a const expression of the main diagonal of the matrix \c *this
+   *
+   * This method simply returns the diagonal of the nested expression, thus by-passing the SelfAdjointView decorator.
+   *
+   * \sa MatrixBase::diagonal(), class Diagonal */
+  EIGEN_DEVICE_FUNC typename MatrixType::ConstDiagonalReturnType diagonal() const {
+    return typename MatrixType::ConstDiagonalReturnType(m_matrix);
+  }
 
-    /** \returns a const expression of the main diagonal of the matrix \c *this
-      *
-      * This method simply returns the diagonal of the nested expression, thus by-passing the SelfAdjointView decorator.
-      *
-      * \sa MatrixBase::diagonal(), class Diagonal */
-    EIGEN_DEVICE_FUNC
-    typename MatrixType::ConstDiagonalReturnType diagonal() const
-    {
-      return typename MatrixType::ConstDiagonalReturnType(m_matrix);
-    }
+  /////////// Cholesky module ///////////
 
-/////////// Cholesky module ///////////
+  const LLT<PlainObject, UpLo> llt() const;
+  const LDLT<PlainObject, UpLo> ldlt() const;
 
-    const LLT<PlainObject, UpLo> llt() const;
-    const LDLT<PlainObject, UpLo> ldlt() const;
+  /////////// Eigenvalue module ///////////
 
-/////////// Eigenvalue module ///////////
+  /** Real part of #Scalar */
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  /** Return type of eigenvalues() */
+  typedef Matrix<RealScalar, internal::traits<MatrixType>::ColsAtCompileTime, 1> EigenvaluesReturnType;
 
-    /** Real part of #Scalar */
-    typedef typename NumTraits<Scalar>::Real RealScalar;
-    /** Return type of eigenvalues() */
-    typedef Matrix<RealScalar, internal::traits<MatrixType>::ColsAtCompileTime, 1> EigenvaluesReturnType;
+  EIGEN_DEVICE_FUNC EigenvaluesReturnType eigenvalues() const;
+  EIGEN_DEVICE_FUNC RealScalar operatorNorm() const;
 
-    EIGEN_DEVICE_FUNC
-    EigenvaluesReturnType eigenvalues() const;
-    EIGEN_DEVICE_FUNC
-    RealScalar operatorNorm() const;
-
-  protected:
-    MatrixTypeNested m_matrix;
+ protected:
+  MatrixTypeNested m_matrix;
 };
 
-
 // template<typename OtherDerived, typename MatrixType, unsigned int UpLo>
 // internal::selfadjoint_matrix_product_returntype<OtherDerived,SelfAdjointView<MatrixType,UpLo> >
 // operator*(const MatrixBase<OtherDerived>& lhs, const SelfAdjointView<MatrixType,UpLo>& rhs)
 // {
-//   return internal::matrix_selfadjoint_product_returntype<OtherDerived,SelfAdjointView<MatrixType,UpLo> >(lhs.derived(),rhs);
+//   return internal::matrix_selfadjoint_product_returntype<OtherDerived,SelfAdjointView<MatrixType,UpLo>
+//   >(lhs.derived(),rhs);
 // }
 
 // selfadjoint to dense matrix
@@ -281,86 +250,80 @@
 
 // TODO currently a selfadjoint expression has the form SelfAdjointView<.,.>
 //      in the future selfadjoint-ness should be defined by the expression traits
-//      such that Transpose<SelfAdjointView<.,.> > is valid. (currently TriangularBase::transpose() is overloaded to make it work)
-template<typename MatrixType, unsigned int Mode>
-struct evaluator_traits<SelfAdjointView<MatrixType,Mode> >
-{
+//      such that Transpose<SelfAdjointView<.,.> > is valid. (currently TriangularBase::transpose() is overloaded to
+//      make it work)
+template <typename MatrixType, unsigned int Mode>
+struct evaluator_traits<SelfAdjointView<MatrixType, Mode> > {
   typedef typename storage_kind_to_evaluator_kind<typename MatrixType::StorageKind>::Kind Kind;
   typedef SelfAdjointShape Shape;
 };
 
-template<int UpLo, int SetOpposite, typename DstEvaluatorTypeT, typename SrcEvaluatorTypeT, typename Functor, int Version>
-class triangular_dense_assignment_kernel<UpLo,SelfAdjoint,SetOpposite,DstEvaluatorTypeT,SrcEvaluatorTypeT,Functor,Version>
-  : public generic_dense_assignment_kernel<DstEvaluatorTypeT, SrcEvaluatorTypeT, Functor, Version>
-{
-protected:
+template <int UpLo, int SetOpposite, typename DstEvaluatorTypeT, typename SrcEvaluatorTypeT, typename Functor,
+          int Version>
+class triangular_dense_assignment_kernel<UpLo, SelfAdjoint, SetOpposite, DstEvaluatorTypeT, SrcEvaluatorTypeT, Functor,
+                                         Version>
+    : public generic_dense_assignment_kernel<DstEvaluatorTypeT, SrcEvaluatorTypeT, Functor, Version> {
+ protected:
   typedef generic_dense_assignment_kernel<DstEvaluatorTypeT, SrcEvaluatorTypeT, Functor, Version> Base;
   typedef typename Base::DstXprType DstXprType;
   typedef typename Base::SrcXprType SrcXprType;
   using Base::m_dst;
-  using Base::m_src;
   using Base::m_functor;
-public:
+  using Base::m_src;
 
+ public:
   typedef typename Base::DstEvaluatorType DstEvaluatorType;
   typedef typename Base::SrcEvaluatorType SrcEvaluatorType;
   typedef typename Base::Scalar Scalar;
   typedef typename Base::AssignmentTraits AssignmentTraits;
 
+  EIGEN_DEVICE_FUNC triangular_dense_assignment_kernel(DstEvaluatorType& dst, const SrcEvaluatorType& src,
+                                                       const Functor& func, DstXprType& dstExpr)
+      : Base(dst, src, func, dstExpr) {}
 
-  EIGEN_DEVICE_FUNC triangular_dense_assignment_kernel(DstEvaluatorType &dst, const SrcEvaluatorType &src, const Functor &func, DstXprType& dstExpr)
-    : Base(dst, src, func, dstExpr)
-  {}
-
-  EIGEN_DEVICE_FUNC void assignCoeff(Index row, Index col)
-  {
-    eigen_internal_assert(row!=col);
-    Scalar tmp = m_src.coeff(row,col);
-    m_functor.assignCoeff(m_dst.coeffRef(row,col), tmp);
-    m_functor.assignCoeff(m_dst.coeffRef(col,row), numext::conj(tmp));
+  EIGEN_DEVICE_FUNC void assignCoeff(Index row, Index col) {
+    eigen_internal_assert(row != col);
+    Scalar tmp = m_src.coeff(row, col);
+    m_functor.assignCoeff(m_dst.coeffRef(row, col), tmp);
+    m_functor.assignCoeff(m_dst.coeffRef(col, row), numext::conj(tmp));
   }
 
-  EIGEN_DEVICE_FUNC void assignDiagonalCoeff(Index id)
-  {
-    Base::assignCoeff(id,id);
-  }
+  EIGEN_DEVICE_FUNC void assignDiagonalCoeff(Index id) { Base::assignCoeff(id, id); }
 
-  EIGEN_DEVICE_FUNC void assignOppositeCoeff(Index, Index)
-  { eigen_internal_assert(false && "should never be called"); }
+  EIGEN_DEVICE_FUNC void assignOppositeCoeff(Index, Index) { eigen_internal_assert(false && "should never be called"); }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /***************************************************************************
-* Implementation of MatrixBase methods
-***************************************************************************/
+ * Implementation of MatrixBase methods
+ ***************************************************************************/
 
 /** This is the const version of MatrixBase::selfadjointView() */
-template<typename Derived>
-template<unsigned int UpLo>
+template <typename Derived>
+template <unsigned int UpLo>
 EIGEN_DEVICE_FUNC typename MatrixBase<Derived>::template ConstSelfAdjointViewReturnType<UpLo>::Type
-MatrixBase<Derived>::selfadjointView() const
-{
+MatrixBase<Derived>::selfadjointView() const {
   return typename ConstSelfAdjointViewReturnType<UpLo>::Type(derived());
 }
 
-/** \returns an expression of a symmetric/self-adjoint view extracted from the upper or lower triangular part of the current matrix
-  *
-  * The parameter \a UpLo can be either \c #Upper or \c #Lower
-  *
-  * Example: \include MatrixBase_selfadjointView.cpp
-  * Output: \verbinclude MatrixBase_selfadjointView.out
-  *
-  * \sa class SelfAdjointView
-  */
-template<typename Derived>
-template<unsigned int UpLo>
+/** \returns an expression of a symmetric/self-adjoint view extracted from the upper or lower triangular part of the
+ * current matrix
+ *
+ * The parameter \a UpLo can be either \c #Upper or \c #Lower
+ *
+ * Example: \include MatrixBase_selfadjointView.cpp
+ * Output: \verbinclude MatrixBase_selfadjointView.out
+ *
+ * \sa class SelfAdjointView
+ */
+template <typename Derived>
+template <unsigned int UpLo>
 EIGEN_DEVICE_FUNC typename MatrixBase<Derived>::template SelfAdjointViewReturnType<UpLo>::Type
-MatrixBase<Derived>::selfadjointView()
-{
+MatrixBase<Derived>::selfadjointView() {
   return typename SelfAdjointViewReturnType<UpLo>::Type(derived());
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SELFADJOINTMATRIX_H
+#endif  // EIGEN_SELFADJOINTMATRIX_H
diff --git a/Eigen/src/Core/SelfCwiseBinaryOp.h b/Eigen/src/Core/SelfCwiseBinaryOp.h
index 5ed85c7..4dc92f1 100644
--- a/Eigen/src/Core/SelfCwiseBinaryOp.h
+++ b/Eigen/src/Core/SelfCwiseBinaryOp.h
@@ -13,38 +13,38 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 // TODO generalize the scalar type of 'other'
 
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::operator*=(const Scalar& other)
-{
-  internal::call_assignment(this->derived(), PlainObject::Constant(rows(),cols(),other), internal::mul_assign_op<Scalar,Scalar>());
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::operator*=(const Scalar& other) {
+  internal::call_assignment(this->derived(), PlainObject::Constant(rows(), cols(), other),
+                            internal::mul_assign_op<Scalar, Scalar>());
   return derived();
 }
 
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& ArrayBase<Derived>::operator+=(const Scalar& other)
-{
-  internal::call_assignment(this->derived(), PlainObject::Constant(rows(),cols(),other), internal::add_assign_op<Scalar,Scalar>());
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& ArrayBase<Derived>::operator+=(const Scalar& other) {
+  internal::call_assignment(this->derived(), PlainObject::Constant(rows(), cols(), other),
+                            internal::add_assign_op<Scalar, Scalar>());
   return derived();
 }
 
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& ArrayBase<Derived>::operator-=(const Scalar& other)
-{
-  internal::call_assignment(this->derived(), PlainObject::Constant(rows(),cols(),other), internal::sub_assign_op<Scalar,Scalar>());
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& ArrayBase<Derived>::operator-=(const Scalar& other) {
+  internal::call_assignment(this->derived(), PlainObject::Constant(rows(), cols(), other),
+                            internal::sub_assign_op<Scalar, Scalar>());
   return derived();
 }
 
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::operator/=(const Scalar& other)
-{
-  internal::call_assignment(this->derived(), PlainObject::Constant(rows(),cols(),other), internal::div_assign_op<Scalar,Scalar>());
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::operator/=(const Scalar& other) {
+  internal::call_assignment(this->derived(), PlainObject::Constant(rows(), cols(), other),
+                            internal::div_assign_op<Scalar, Scalar>());
   return derived();
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SELFCWISEBINARYOP_H
+#endif  // EIGEN_SELFCWISEBINARYOP_H
diff --git a/Eigen/src/Core/SkewSymmetricMatrix3.h b/Eigen/src/Core/SkewSymmetricMatrix3.h
index 6812236..b3fcc3a 100644
--- a/Eigen/src/Core/SkewSymmetricMatrix3.h
+++ b/Eigen/src/Core/SkewSymmetricMatrix3.h
@@ -31,148 +31,134 @@
  *
  * \sa class SkewSymmetricMatrix3, class SkewSymmetricWrapper
  */
-template<typename Derived>
-class SkewSymmetricBase : public EigenBase<Derived>
-{
-  public:
-    typedef typename internal::traits<Derived>::SkewSymmetricVectorType SkewSymmetricVectorType;
-    typedef typename SkewSymmetricVectorType::Scalar Scalar;
-    typedef typename SkewSymmetricVectorType::RealScalar RealScalar;
-    typedef typename internal::traits<Derived>::StorageKind StorageKind;
-    typedef typename internal::traits<Derived>::StorageIndex StorageIndex;
+template <typename Derived>
+class SkewSymmetricBase : public EigenBase<Derived> {
+ public:
+  typedef typename internal::traits<Derived>::SkewSymmetricVectorType SkewSymmetricVectorType;
+  typedef typename SkewSymmetricVectorType::Scalar Scalar;
+  typedef typename SkewSymmetricVectorType::RealScalar RealScalar;
+  typedef typename internal::traits<Derived>::StorageKind StorageKind;
+  typedef typename internal::traits<Derived>::StorageIndex StorageIndex;
 
-    enum {
-      RowsAtCompileTime = SkewSymmetricVectorType::SizeAtCompileTime,
-      ColsAtCompileTime = SkewSymmetricVectorType::SizeAtCompileTime,
-      MaxRowsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
-      MaxColsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
-      IsVectorAtCompileTime = 0,
-      Flags = NoPreferredStorageOrderBit
-    };
+  enum {
+    RowsAtCompileTime = SkewSymmetricVectorType::SizeAtCompileTime,
+    ColsAtCompileTime = SkewSymmetricVectorType::SizeAtCompileTime,
+    MaxRowsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
+    MaxColsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
+    IsVectorAtCompileTime = 0,
+    Flags = NoPreferredStorageOrderBit
+  };
 
-    typedef Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime, 0, MaxRowsAtCompileTime, MaxColsAtCompileTime> DenseMatrixType;
-    typedef DenseMatrixType DenseType;
-    typedef SkewSymmetricMatrix3<Scalar> PlainObject;
+  typedef Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime, 0, MaxRowsAtCompileTime, MaxColsAtCompileTime>
+      DenseMatrixType;
+  typedef DenseMatrixType DenseType;
+  typedef SkewSymmetricMatrix3<Scalar> PlainObject;
 
-    /** \returns a reference to the derived object. */
-    EIGEN_DEVICE_FUNC
-    inline const Derived& derived() const { return *static_cast<const Derived*>(this); }
-    /** \returns a const reference to the derived object. */
-    EIGEN_DEVICE_FUNC
-    inline Derived& derived() { return *static_cast<Derived*>(this); }
+  /** \returns a reference to the derived object. */
+  EIGEN_DEVICE_FUNC inline const Derived& derived() const { return *static_cast<const Derived*>(this); }
+  /** \returns a const reference to the derived object. */
+  EIGEN_DEVICE_FUNC inline Derived& derived() { return *static_cast<Derived*>(this); }
 
-    /**
-     * Constructs a dense matrix from \c *this. Note, this directly returns a dense matrix type,
-     * not an expression.
-     * \returns A dense matrix, with its entries set from the the derived object. */
-    EIGEN_DEVICE_FUNC
-    DenseMatrixType toDenseMatrix() const { return derived(); }
+  /**
+   * Constructs a dense matrix from \c *this. Note, this directly returns a dense matrix type,
+   * not an expression.
+   * \returns A dense matrix, with its entries set from the the derived object. */
+  EIGEN_DEVICE_FUNC DenseMatrixType toDenseMatrix() const { return derived(); }
 
-    /** Determinant vanishes */
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Scalar determinant() const { return 0; }
+  /** Determinant vanishes */
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Scalar determinant() const { return 0; }
 
-    /** A.transpose() = -A */
-    EIGEN_DEVICE_FUNC
-    PlainObject transpose() const { return (-vector()).asSkewSymmetric(); }
+  /** A.transpose() = -A */
+  EIGEN_DEVICE_FUNC PlainObject transpose() const { return (-vector()).asSkewSymmetric(); }
 
-    /** \returns the exponential of this matrix using Rodrigues’ formula */
-    EIGEN_DEVICE_FUNC
-    DenseMatrixType exponential() const {
-      DenseMatrixType retVal = DenseMatrixType::Identity();
-      const SkewSymmetricVectorType& v = vector();
-      if (v.isZero()) {
-        return retVal;
-      }
-      const Scalar norm2 = v.squaredNorm();
-      const Scalar norm = numext::sqrt(norm2);
-      retVal += ((((1 - numext::cos(norm))/norm2)*derived())*derived()) + (numext::sin(norm)/norm)*derived().toDenseMatrix();
+  /** \returns the exponential of this matrix using Rodrigues’ formula */
+  EIGEN_DEVICE_FUNC DenseMatrixType exponential() const {
+    DenseMatrixType retVal = DenseMatrixType::Identity();
+    const SkewSymmetricVectorType& v = vector();
+    if (v.isZero()) {
       return retVal;
     }
+    const Scalar norm2 = v.squaredNorm();
+    const Scalar norm = numext::sqrt(norm2);
+    retVal += ((((1 - numext::cos(norm)) / norm2) * derived()) * derived()) +
+              (numext::sin(norm) / norm) * derived().toDenseMatrix();
+    return retVal;
+  }
 
-    /** \returns a reference to the derived object's vector of coefficients. */
-    EIGEN_DEVICE_FUNC
-    inline const SkewSymmetricVectorType& vector() const { return derived().vector(); }
-    /** \returns a const reference to the derived object's vector of coefficients. */
-    EIGEN_DEVICE_FUNC
-    inline SkewSymmetricVectorType& vector() { return derived().vector(); }
+  /** \returns a reference to the derived object's vector of coefficients. */
+  EIGEN_DEVICE_FUNC inline const SkewSymmetricVectorType& vector() const { return derived().vector(); }
+  /** \returns a const reference to the derived object's vector of coefficients. */
+  EIGEN_DEVICE_FUNC inline SkewSymmetricVectorType& vector() { return derived().vector(); }
 
-    /** \returns the number of rows. */
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR 
-    inline Index rows() const { return 3; }
-    /** \returns the number of columns. */
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR 
-    inline Index cols() const { return 3; }
+  /** \returns the number of rows. */
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index rows() const { return 3; }
+  /** \returns the number of columns. */
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index cols() const { return 3; }
 
-    /** \returns the matrix product of \c *this by the dense matrix, \a matrix */
-    template<typename MatrixDerived>
-    EIGEN_DEVICE_FUNC
-    Product<Derived,MatrixDerived,LazyProduct>
-    operator*(const MatrixBase<MatrixDerived> &matrix) const
-    {
-      return Product<Derived, MatrixDerived, LazyProduct>(derived(), matrix.derived());
-    }
+  /** \returns the matrix product of \c *this by the dense matrix, \a matrix */
+  template <typename MatrixDerived>
+  EIGEN_DEVICE_FUNC Product<Derived, MatrixDerived, LazyProduct> operator*(
+      const MatrixBase<MatrixDerived>& matrix) const {
+    return Product<Derived, MatrixDerived, LazyProduct>(derived(), matrix.derived());
+  }
 
-    /** \returns the matrix product of \c *this by the skew symmetric matrix, \a matrix */
-    template<typename MatrixDerived>
-    EIGEN_DEVICE_FUNC
-    Product<Derived,MatrixDerived,LazyProduct>
-    operator*(const SkewSymmetricBase<MatrixDerived> &matrix) const
-    {
-      return Product<Derived, MatrixDerived, LazyProduct>(derived(), matrix.derived());
-    }
+  /** \returns the matrix product of \c *this by the skew symmetric matrix, \a matrix */
+  template <typename MatrixDerived>
+  EIGEN_DEVICE_FUNC Product<Derived, MatrixDerived, LazyProduct> operator*(
+      const SkewSymmetricBase<MatrixDerived>& matrix) const {
+    return Product<Derived, MatrixDerived, LazyProduct>(derived(), matrix.derived());
+  }
 
-    template <typename OtherDerived>
-    using SkewSymmetricProductReturnType = SkewSymmetricWrapper<const EIGEN_CWISE_BINARY_RETURN_TYPE(
-        SkewSymmetricVectorType, typename OtherDerived::SkewSymmetricVectorType, product)>;
+  template <typename OtherDerived>
+  using SkewSymmetricProductReturnType = SkewSymmetricWrapper<const EIGEN_CWISE_BINARY_RETURN_TYPE(
+      SkewSymmetricVectorType, typename OtherDerived::SkewSymmetricVectorType, product)>;
 
-    /** \returns the wedge product of \c *this by the skew symmetric matrix \a other
-     *  A wedge B = AB - BA */
-    template <typename OtherDerived>
-    EIGEN_DEVICE_FUNC SkewSymmetricProductReturnType<OtherDerived> wedge(
-        const SkewSymmetricBase<OtherDerived>& other) const {
-      return vector().cross(other.vector()).asSkewSymmetric();
-    }
+  /** \returns the wedge product of \c *this by the skew symmetric matrix \a other
+   *  A wedge B = AB - BA */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC SkewSymmetricProductReturnType<OtherDerived> wedge(
+      const SkewSymmetricBase<OtherDerived>& other) const {
+    return vector().cross(other.vector()).asSkewSymmetric();
+  }
 
-    using SkewSymmetricScaleReturnType =
-        SkewSymmetricWrapper<const EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(SkewSymmetricVectorType, Scalar, product)>;
+  using SkewSymmetricScaleReturnType =
+      SkewSymmetricWrapper<const EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(SkewSymmetricVectorType, Scalar, product)>;
 
-    /** \returns the product of \c *this by the scalar \a scalar */
-    EIGEN_DEVICE_FUNC
-    inline SkewSymmetricScaleReturnType operator*(const Scalar& scalar) const {
-      return (vector() * scalar).asSkewSymmetric();
-    }
+  /** \returns the product of \c *this by the scalar \a scalar */
+  EIGEN_DEVICE_FUNC inline SkewSymmetricScaleReturnType operator*(const Scalar& scalar) const {
+    return (vector() * scalar).asSkewSymmetric();
+  }
 
-    using ScaleSkewSymmetricReturnType =
-        SkewSymmetricWrapper<const EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(Scalar, SkewSymmetricVectorType, product)>;
+  using ScaleSkewSymmetricReturnType =
+      SkewSymmetricWrapper<const EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(Scalar, SkewSymmetricVectorType, product)>;
 
-    /** \returns the product of a scalar and the skew symmetric matrix \a other */
-    EIGEN_DEVICE_FUNC
-    friend inline ScaleSkewSymmetricReturnType operator*(const Scalar& scalar, const SkewSymmetricBase& other) {
-      return (scalar * other.vector()).asSkewSymmetric();
-    }
+  /** \returns the product of a scalar and the skew symmetric matrix \a other */
+  EIGEN_DEVICE_FUNC friend inline ScaleSkewSymmetricReturnType operator*(const Scalar& scalar,
+                                                                         const SkewSymmetricBase& other) {
+    return (scalar * other.vector()).asSkewSymmetric();
+  }
 
-    template <typename OtherDerived>
-    using SkewSymmetricSumReturnType = SkewSymmetricWrapper<const EIGEN_CWISE_BINARY_RETURN_TYPE(
-        SkewSymmetricVectorType, typename OtherDerived::SkewSymmetricVectorType, sum)>;
+  template <typename OtherDerived>
+  using SkewSymmetricSumReturnType = SkewSymmetricWrapper<const EIGEN_CWISE_BINARY_RETURN_TYPE(
+      SkewSymmetricVectorType, typename OtherDerived::SkewSymmetricVectorType, sum)>;
 
-    /** \returns the sum of \c *this and the skew symmetric matrix \a other */
-    template <typename OtherDerived>
-    EIGEN_DEVICE_FUNC inline SkewSymmetricSumReturnType<OtherDerived> operator+(
-        const SkewSymmetricBase<OtherDerived>& other) const {
-      return (vector() + other.vector()).asSkewSymmetric();
-    }
+  /** \returns the sum of \c *this and the skew symmetric matrix \a other */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC inline SkewSymmetricSumReturnType<OtherDerived> operator+(
+      const SkewSymmetricBase<OtherDerived>& other) const {
+    return (vector() + other.vector()).asSkewSymmetric();
+  }
 
-    template <typename OtherDerived>
-    using SkewSymmetricDifferenceReturnType = SkewSymmetricWrapper<const EIGEN_CWISE_BINARY_RETURN_TYPE(
-        SkewSymmetricVectorType, typename OtherDerived::SkewSymmetricVectorType, difference)>;
+  template <typename OtherDerived>
+  using SkewSymmetricDifferenceReturnType = SkewSymmetricWrapper<const EIGEN_CWISE_BINARY_RETURN_TYPE(
+      SkewSymmetricVectorType, typename OtherDerived::SkewSymmetricVectorType, difference)>;
 
-    /** \returns the difference of \c *this and the skew symmetric matrix \a other */
-    template <typename OtherDerived>
-    EIGEN_DEVICE_FUNC inline SkewSymmetricDifferenceReturnType<OtherDerived> operator-(
-        const SkewSymmetricBase<OtherDerived>& other) const {
-      return (vector() - other.vector()).asSkewSymmetric();
-    }
+  /** \returns the difference of \c *this and the skew symmetric matrix \a other */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC inline SkewSymmetricDifferenceReturnType<OtherDerived> operator-(
+      const SkewSymmetricBase<OtherDerived>& other) const {
+    return (vector() - other.vector()).asSkewSymmetric();
+  }
 };
 
 /** \class SkewSymmetricMatrix3
@@ -186,122 +172,101 @@
  */
 
 namespace internal {
-template<typename Scalar_>
-struct traits<SkewSymmetricMatrix3<Scalar_> >
- : traits<Matrix<Scalar_,3,3,0,3,3> >
-{
-  typedef Matrix<Scalar_,3,1,0,3,1> SkewSymmetricVectorType;
+template <typename Scalar_>
+struct traits<SkewSymmetricMatrix3<Scalar_>> : traits<Matrix<Scalar_, 3, 3, 0, 3, 3>> {
+  typedef Matrix<Scalar_, 3, 1, 0, 3, 1> SkewSymmetricVectorType;
   typedef SkewSymmetricShape StorageKind;
-  enum {
-    Flags = LvalueBit | NoPreferredStorageOrderBit | NestByRefBit
-  };
+  enum { Flags = LvalueBit | NoPreferredStorageOrderBit | NestByRefBit };
 };
-}
-template<typename Scalar_>
-class SkewSymmetricMatrix3
-  : public SkewSymmetricBase<SkewSymmetricMatrix3<Scalar_> >
-{
-  public:
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    typedef typename internal::traits<SkewSymmetricMatrix3>::SkewSymmetricVectorType SkewSymmetricVectorType;
-    typedef const SkewSymmetricMatrix3& Nested;
-    typedef Scalar_ Scalar;
-    typedef typename internal::traits<SkewSymmetricMatrix3>::StorageKind StorageKind;
-    typedef typename internal::traits<SkewSymmetricMatrix3>::StorageIndex StorageIndex;
-    #endif
+}  // namespace internal
+template <typename Scalar_>
+class SkewSymmetricMatrix3 : public SkewSymmetricBase<SkewSymmetricMatrix3<Scalar_>> {
+ public:
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  typedef typename internal::traits<SkewSymmetricMatrix3>::SkewSymmetricVectorType SkewSymmetricVectorType;
+  typedef const SkewSymmetricMatrix3& Nested;
+  typedef Scalar_ Scalar;
+  typedef typename internal::traits<SkewSymmetricMatrix3>::StorageKind StorageKind;
+  typedef typename internal::traits<SkewSymmetricMatrix3>::StorageIndex StorageIndex;
+#endif
 
-  protected:
+ protected:
+  SkewSymmetricVectorType m_vector;
 
-    SkewSymmetricVectorType m_vector;
+ public:
+  /** const version of vector(). */
+  EIGEN_DEVICE_FUNC inline const SkewSymmetricVectorType& vector() const { return m_vector; }
+  /** \returns a reference to the stored vector of coefficients. */
+  EIGEN_DEVICE_FUNC inline SkewSymmetricVectorType& vector() { return m_vector; }
 
-  public:
+  /** Default constructor without initialization */
+  EIGEN_DEVICE_FUNC inline SkewSymmetricMatrix3() {}
 
-    /** const version of vector(). */
-    EIGEN_DEVICE_FUNC
-    inline const SkewSymmetricVectorType& vector() const { return m_vector; }
-    /** \returns a reference to the stored vector of coefficients. */
-    EIGEN_DEVICE_FUNC
-    inline SkewSymmetricVectorType& vector() { return m_vector; }
+  /** Constructor from three scalars */
+  EIGEN_DEVICE_FUNC inline SkewSymmetricMatrix3(const Scalar& x, const Scalar& y, const Scalar& z)
+      : m_vector(x, y, z) {}
 
-    /** Default constructor without initialization */
-    EIGEN_DEVICE_FUNC
-    inline SkewSymmetricMatrix3() {}
+  /** \brief Constructs a SkewSymmetricMatrix3 from an r-value vector type */
+  EIGEN_DEVICE_FUNC explicit inline SkewSymmetricMatrix3(SkewSymmetricVectorType&& vec) : m_vector(std::move(vec)) {}
 
-    /** Constructor from three scalars */
-    EIGEN_DEVICE_FUNC
-    inline SkewSymmetricMatrix3(const Scalar& x, const Scalar& y, const Scalar& z) : m_vector(x,y,z) {}
+  /** generic constructor from expression of the coefficients */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC explicit inline SkewSymmetricMatrix3(const MatrixBase<OtherDerived>& other) : m_vector(other) {}
 
-    /** \brief Constructs a SkewSymmetricMatrix3 from an r-value vector type */
-    EIGEN_DEVICE_FUNC
-    explicit inline SkewSymmetricMatrix3(SkewSymmetricVectorType&& vec) : m_vector(std::move(vec)) {}
+  /** Copy constructor. */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC inline SkewSymmetricMatrix3(const SkewSymmetricBase<OtherDerived>& other)
+      : m_vector(other.vector()) {}
 
-    /** generic constructor from expression of the coefficients */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-        explicit inline SkewSymmetricMatrix3(const MatrixBase<OtherDerived>& other) : m_vector(other)
-    {}
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  /** copy constructor. prevent a default copy constructor from hiding the other templated constructor */
+  inline SkewSymmetricMatrix3(const SkewSymmetricMatrix3& other) : m_vector(other.vector()) {}
+#endif
 
-    /** Copy constructor. */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    inline SkewSymmetricMatrix3(const SkewSymmetricBase<OtherDerived>& other) : m_vector(other.vector()) {}
+  /** Copy operator. */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC SkewSymmetricMatrix3& operator=(const SkewSymmetricBase<OtherDerived>& other) {
+    m_vector = other.vector();
+    return *this;
+  }
 
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    /** copy constructor. prevent a default copy constructor from hiding the other templated constructor */
-    inline SkewSymmetricMatrix3(const SkewSymmetricMatrix3& other) : m_vector(other.vector()) {}
-    #endif
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  /** This is a special case of the templated operator=. Its purpose is to
+   * prevent a default operator= from hiding the templated operator=.
+   */
+  EIGEN_DEVICE_FUNC SkewSymmetricMatrix3& operator=(const SkewSymmetricMatrix3& other) {
+    m_vector = other.vector();
+    return *this;
+  }
+#endif
 
-    /** Copy operator. */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    SkewSymmetricMatrix3& operator=(const SkewSymmetricBase<OtherDerived>& other)
-    {
-      m_vector = other.vector();
-      return *this;
-    }
+  typedef SkewSymmetricWrapper<const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, SkewSymmetricVectorType>>
+      InitializeReturnType;
 
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    /** This is a special case of the templated operator=. Its purpose is to
-      * prevent a default operator= from hiding the templated operator=.
-      */
-    EIGEN_DEVICE_FUNC
-    SkewSymmetricMatrix3& operator=(const SkewSymmetricMatrix3& other)
-    {
-      m_vector = other.vector();
-      return *this;
-    }
-    #endif
+  /** Initializes a skew symmetric matrix with coefficients set to zero */
+  EIGEN_DEVICE_FUNC static InitializeReturnType Zero() { return SkewSymmetricVectorType::Zero().asSkewSymmetric(); }
 
-    typedef SkewSymmetricWrapper<const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, SkewSymmetricVectorType>>
-        InitializeReturnType;
-
-    /** Initializes a skew symmetric matrix with coefficients set to zero */
-    EIGEN_DEVICE_FUNC
-    static InitializeReturnType Zero() { return SkewSymmetricVectorType::Zero().asSkewSymmetric(); }
-
-    /** Sets all coefficients to zero. */
-    EIGEN_DEVICE_FUNC
-    inline void setZero() { m_vector.setZero(); }
+  /** Sets all coefficients to zero. */
+  EIGEN_DEVICE_FUNC inline void setZero() { m_vector.setZero(); }
 };
 
 /** \class SkewSymmetricWrapper
-  * \ingroup Core_Module
-  *
-  * \brief Expression of a skew symmetric matrix
-  *
-  * \tparam SkewSymmetricVectorType_ the type of the vector of coefficients
-  *
-  * This class is an expression of a skew symmetric matrix, but not storing its own vector of coefficients,
-  * instead wrapping an existing vector expression. It is the return type of MatrixBase::asSkewSymmetric()
-  * and most of the time this is the only way that it is used.
-  *
-  * \sa class SkewSymmetricMatrix3, class SkewSymmetricBase, MatrixBase::asSkewSymmetric()
-  */
+ * \ingroup Core_Module
+ *
+ * \brief Expression of a skew symmetric matrix
+ *
+ * \tparam SkewSymmetricVectorType_ the type of the vector of coefficients
+ *
+ * This class is an expression of a skew symmetric matrix, but not storing its own vector of coefficients,
+ * instead wrapping an existing vector expression. It is the return type of MatrixBase::asSkewSymmetric()
+ * and most of the time this is the only way that it is used.
+ *
+ * \sa class SkewSymmetricMatrix3, class SkewSymmetricBase, MatrixBase::asSkewSymmetric()
+ */
 
 namespace internal {
-template<typename SkewSymmetricVectorType_>
-struct traits<SkewSymmetricWrapper<SkewSymmetricVectorType_> >
-{
+template <typename SkewSymmetricVectorType_>
+struct traits<SkewSymmetricWrapper<SkewSymmetricVectorType_>> {
   typedef SkewSymmetricVectorType_ SkewSymmetricVectorType;
   typedef typename SkewSymmetricVectorType::Scalar Scalar;
   typedef typename SkewSymmetricVectorType::StorageIndex StorageIndex;
@@ -312,82 +277,80 @@
     ColsAtCompileTime = SkewSymmetricVectorType::SizeAtCompileTime,
     MaxRowsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
     MaxColsAtCompileTime = SkewSymmetricVectorType::MaxSizeAtCompileTime,
-    Flags =  (traits<SkewSymmetricVectorType>::Flags & LvalueBit) | NoPreferredStorageOrderBit
+    Flags = (traits<SkewSymmetricVectorType>::Flags & LvalueBit) | NoPreferredStorageOrderBit
   };
 };
-}
+}  // namespace internal
 
-template<typename SkewSymmetricVectorType_>
-class SkewSymmetricWrapper
-  : public SkewSymmetricBase<SkewSymmetricWrapper<SkewSymmetricVectorType_> >, internal::no_assignment_operator
-{
-  public:
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    typedef SkewSymmetricVectorType_ SkewSymmetricVectorType;
-    typedef SkewSymmetricWrapper Nested;
-    #endif
+template <typename SkewSymmetricVectorType_>
+class SkewSymmetricWrapper : public SkewSymmetricBase<SkewSymmetricWrapper<SkewSymmetricVectorType_>>,
+                             internal::no_assignment_operator {
+ public:
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  typedef SkewSymmetricVectorType_ SkewSymmetricVectorType;
+  typedef SkewSymmetricWrapper Nested;
+#endif
 
-    /** Constructor from expression of coefficients to wrap. */
-    EIGEN_DEVICE_FUNC
-    explicit inline SkewSymmetricWrapper(SkewSymmetricVectorType& a_vector) : m_vector(a_vector) {}
+  /** Constructor from expression of coefficients to wrap. */
+  EIGEN_DEVICE_FUNC explicit inline SkewSymmetricWrapper(SkewSymmetricVectorType& a_vector) : m_vector(a_vector) {}
 
-    /** \returns a const reference to the wrapped expression of coefficients. */
-    EIGEN_DEVICE_FUNC
-    const SkewSymmetricVectorType& vector() const { return m_vector; }
+  /** \returns a const reference to the wrapped expression of coefficients. */
+  EIGEN_DEVICE_FUNC const SkewSymmetricVectorType& vector() const { return m_vector; }
 
-  protected:
-    typename SkewSymmetricVectorType::Nested m_vector;
+ protected:
+  typename SkewSymmetricVectorType::Nested m_vector;
 };
 
 /** \returns a pseudo-expression of a skew symmetric matrix with *this as vector of coefficients
-  *
-  * \only_for_vectors
-  *
-  * \sa class SkewSymmetricWrapper, class SkewSymmetricMatrix3, vector(), isSkewSymmetric()
-  **/
-template<typename Derived>
-EIGEN_DEVICE_FUNC inline const SkewSymmetricWrapper<const Derived>
-MatrixBase<Derived>::asSkewSymmetric() const
-{
+ *
+ * \only_for_vectors
+ *
+ * \sa class SkewSymmetricWrapper, class SkewSymmetricMatrix3, vector(), isSkewSymmetric()
+ **/
+template <typename Derived>
+EIGEN_DEVICE_FUNC inline const SkewSymmetricWrapper<const Derived> MatrixBase<Derived>::asSkewSymmetric() const {
   return SkewSymmetricWrapper<const Derived>(derived());
 }
 
 /** \returns true if *this is approximately equal to a skew symmetric matrix,
-  *          within the precision given by \a prec.
-  */
-template<typename Derived>
-bool MatrixBase<Derived>::isSkewSymmetric(const RealScalar& prec) const
-{
-  if(cols() != rows()) return false;
+ *          within the precision given by \a prec.
+ */
+template <typename Derived>
+bool MatrixBase<Derived>::isSkewSymmetric(const RealScalar& prec) const {
+  if (cols() != rows()) return false;
   return (this->transpose() + *this).isZero(prec);
 }
 
 /** \returns the matrix product of \c *this by the skew symmetric matrix \skew.
  */
-template<typename Derived>
-template<typename SkewDerived>
-EIGEN_DEVICE_FUNC inline const Product<Derived, SkewDerived, LazyProduct>
-MatrixBase<Derived>::operator*(const SkewSymmetricBase<SkewDerived> &skew) const
-{
+template <typename Derived>
+template <typename SkewDerived>
+EIGEN_DEVICE_FUNC inline const Product<Derived, SkewDerived, LazyProduct> MatrixBase<Derived>::operator*(
+    const SkewSymmetricBase<SkewDerived>& skew) const {
   return Product<Derived, SkewDerived, LazyProduct>(derived(), skew.derived());
 }
 
 namespace internal {
 
-template<> struct storage_kind_to_shape<SkewSymmetricShape> { typedef SkewSymmetricShape Shape; };
+template <>
+struct storage_kind_to_shape<SkewSymmetricShape> {
+  typedef SkewSymmetricShape Shape;
+};
 
 struct SkewSymmetric2Dense {};
 
-template<> struct AssignmentKind<DenseShape,SkewSymmetricShape> { typedef SkewSymmetric2Dense Kind; };
+template <>
+struct AssignmentKind<DenseShape, SkewSymmetricShape> {
+  typedef SkewSymmetric2Dense Kind;
+};
 
 // SkewSymmetric matrix to Dense assignment
-template< typename DstXprType, typename SrcXprType, typename Functor>
-struct Assignment<DstXprType, SrcXprType, Functor, SkewSymmetric2Dense>
-{
-  EIGEN_DEVICE_FUNC
-  static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &/*func*/)
-  {
-    if((dst.rows()!=3) || (dst.cols()!=3)) {
+template <typename DstXprType, typename SrcXprType, typename Functor>
+struct Assignment<DstXprType, SrcXprType, Functor, SkewSymmetric2Dense> {
+  EIGEN_DEVICE_FUNC static void run(
+      DstXprType& dst, const SrcXprType& src,
+      const internal::assign_op<typename DstXprType::Scalar, typename SrcXprType::Scalar>& /*func*/) {
+    if ((dst.rows() != 3) || (dst.cols() != 3)) {
       dst.resize(3, 3);
     }
     dst.diagonal().setZero();
@@ -399,17 +362,21 @@
     dst(1, 2) = -v(0);
     dst(2, 1) = v(0);
   }
-  EIGEN_DEVICE_FUNC
-  static void run(DstXprType &dst, const SrcXprType &src, const internal::add_assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &/*func*/)
-  { dst.vector() += src.vector(); }
+  EIGEN_DEVICE_FUNC static void run(
+      DstXprType& dst, const SrcXprType& src,
+      const internal::add_assign_op<typename DstXprType::Scalar, typename SrcXprType::Scalar>& /*func*/) {
+    dst.vector() += src.vector();
+  }
 
-  EIGEN_DEVICE_FUNC
-  static void run(DstXprType &dst, const SrcXprType &src, const internal::sub_assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &/*func*/)
-  { dst.vector() -= src.vector(); }
+  EIGEN_DEVICE_FUNC static void run(
+      DstXprType& dst, const SrcXprType& src,
+      const internal::sub_assign_op<typename DstXprType::Scalar, typename SrcXprType::Scalar>& /*func*/) {
+    dst.vector() -= src.vector();
+  }
 };
 
-} // namespace internal
+}  // namespace internal
 
 }  // end namespace Eigen
 
-#endif // EIGEN_SKEWSYMMETRICMATRIX3_H
+#endif  // EIGEN_SKEWSYMMETRICMATRIX3_H
diff --git a/Eigen/src/Core/Solve.h b/Eigen/src/Core/Solve.h
index 616dd16..dfea9c6 100644
--- a/Eigen/src/Core/Solve.h
+++ b/Eigen/src/Core/Solve.h
@@ -15,177 +15,160 @@
 
 namespace Eigen {
 
-template<typename Decomposition, typename RhsType, typename StorageKind> class SolveImpl;
+template <typename Decomposition, typename RhsType, typename StorageKind>
+class SolveImpl;
 
 /** \class Solve
-  * \ingroup Core_Module
-  *
-  * \brief Pseudo expression representing a solving operation
-  *
-  * \tparam Decomposition the type of the matrix or decomposition object
-  * \tparam Rhstype the type of the right-hand side
-  *
-  * This class represents an expression of A.solve(B)
-  * and most of the time this is the only way it is used.
-  *
-  */
+ * \ingroup Core_Module
+ *
+ * \brief Pseudo expression representing a solving operation
+ *
+ * \tparam Decomposition the type of the matrix or decomposition object
+ * \tparam Rhstype the type of the right-hand side
+ *
+ * This class represents an expression of A.solve(B)
+ * and most of the time this is the only way it is used.
+ *
+ */
 namespace internal {
 
 // this solve_traits class permits to determine the evaluation type with respect to storage kind (Dense vs Sparse)
-template<typename Decomposition, typename RhsType,typename StorageKind> struct solve_traits;
+template <typename Decomposition, typename RhsType, typename StorageKind>
+struct solve_traits;
 
-template<typename Decomposition, typename RhsType>
-struct solve_traits<Decomposition,RhsType,Dense>
-{
-  typedef typename make_proper_matrix_type<typename RhsType::Scalar,
-                 Decomposition::ColsAtCompileTime,
-                 RhsType::ColsAtCompileTime,
-                 RhsType::PlainObject::Options,
-                 Decomposition::MaxColsAtCompileTime,
-                 RhsType::MaxColsAtCompileTime>::type PlainObject;
+template <typename Decomposition, typename RhsType>
+struct solve_traits<Decomposition, RhsType, Dense> {
+  typedef typename make_proper_matrix_type<typename RhsType::Scalar, Decomposition::ColsAtCompileTime,
+                                           RhsType::ColsAtCompileTime, RhsType::PlainObject::Options,
+                                           Decomposition::MaxColsAtCompileTime, RhsType::MaxColsAtCompileTime>::type
+      PlainObject;
 };
 
-template<typename Decomposition, typename RhsType>
+template <typename Decomposition, typename RhsType>
 struct traits<Solve<Decomposition, RhsType> >
-  : traits<typename solve_traits<Decomposition,RhsType,typename internal::traits<RhsType>::StorageKind>::PlainObject>
-{
-  typedef typename solve_traits<Decomposition,RhsType,typename internal::traits<RhsType>::StorageKind>::PlainObject PlainObject;
-  typedef typename promote_index_type<typename Decomposition::StorageIndex, typename RhsType::StorageIndex>::type StorageIndex;
+    : traits<
+          typename solve_traits<Decomposition, RhsType, typename internal::traits<RhsType>::StorageKind>::PlainObject> {
+  typedef typename solve_traits<Decomposition, RhsType, typename internal::traits<RhsType>::StorageKind>::PlainObject
+      PlainObject;
+  typedef typename promote_index_type<typename Decomposition::StorageIndex, typename RhsType::StorageIndex>::type
+      StorageIndex;
   typedef traits<PlainObject> BaseTraits;
-  enum {
-    Flags = BaseTraits::Flags & RowMajorBit,
-    CoeffReadCost = HugeCost
-  };
+  enum { Flags = BaseTraits::Flags & RowMajorBit, CoeffReadCost = HugeCost };
 };
 
-}
+}  // namespace internal
 
-
-template<typename Decomposition, typename RhsType>
-class Solve : public SolveImpl<Decomposition,RhsType,typename internal::traits<RhsType>::StorageKind>
-{
-public:
+template <typename Decomposition, typename RhsType>
+class Solve : public SolveImpl<Decomposition, RhsType, typename internal::traits<RhsType>::StorageKind> {
+ public:
   typedef typename internal::traits<Solve>::PlainObject PlainObject;
   typedef typename internal::traits<Solve>::StorageIndex StorageIndex;
 
-  Solve(const Decomposition &dec, const RhsType &rhs)
-    : m_dec(dec), m_rhs(rhs)
-  {}
+  Solve(const Decomposition &dec, const RhsType &rhs) : m_dec(dec), m_rhs(rhs) {}
 
   EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_dec.cols(); }
   EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_rhs.cols(); }
 
-  EIGEN_DEVICE_FUNC const Decomposition& dec() const { return m_dec; }
-  EIGEN_DEVICE_FUNC const RhsType&       rhs() const { return m_rhs; }
+  EIGEN_DEVICE_FUNC const Decomposition &dec() const { return m_dec; }
+  EIGEN_DEVICE_FUNC const RhsType &rhs() const { return m_rhs; }
 
-protected:
+ protected:
   const Decomposition &m_dec;
   const typename internal::ref_selector<RhsType>::type m_rhs;
 };
 
-
 // Specialization of the Solve expression for dense results
-template<typename Decomposition, typename RhsType>
-class SolveImpl<Decomposition,RhsType,Dense>
-  : public MatrixBase<Solve<Decomposition,RhsType> >
-{
-  typedef Solve<Decomposition,RhsType> Derived;
+template <typename Decomposition, typename RhsType>
+class SolveImpl<Decomposition, RhsType, Dense> : public MatrixBase<Solve<Decomposition, RhsType> > {
+  typedef Solve<Decomposition, RhsType> Derived;
 
-public:
-
-  typedef MatrixBase<Solve<Decomposition,RhsType> > Base;
+ public:
+  typedef MatrixBase<Solve<Decomposition, RhsType> > Base;
   EIGEN_DENSE_PUBLIC_INTERFACE(Derived)
 
-private:
-
+ private:
   Scalar coeff(Index row, Index col) const;
   Scalar coeff(Index i) const;
 };
 
 // Generic API dispatcher
-template<typename Decomposition, typename RhsType, typename StorageKind>
-class SolveImpl : public internal::generic_xpr_base<Solve<Decomposition,RhsType>, MatrixXpr, StorageKind>::type
-{
-  public:
-    typedef typename internal::generic_xpr_base<Solve<Decomposition,RhsType>, MatrixXpr, StorageKind>::type Base;
+template <typename Decomposition, typename RhsType, typename StorageKind>
+class SolveImpl : public internal::generic_xpr_base<Solve<Decomposition, RhsType>, MatrixXpr, StorageKind>::type {
+ public:
+  typedef typename internal::generic_xpr_base<Solve<Decomposition, RhsType>, MatrixXpr, StorageKind>::type Base;
 };
 
 namespace internal {
 
 // Evaluator of Solve -> eval into a temporary
-template<typename Decomposition, typename RhsType>
-struct evaluator<Solve<Decomposition,RhsType> >
-  : public evaluator<typename Solve<Decomposition,RhsType>::PlainObject>
-{
-  typedef Solve<Decomposition,RhsType> SolveType;
+template <typename Decomposition, typename RhsType>
+struct evaluator<Solve<Decomposition, RhsType> >
+    : public evaluator<typename Solve<Decomposition, RhsType>::PlainObject> {
+  typedef Solve<Decomposition, RhsType> SolveType;
   typedef typename SolveType::PlainObject PlainObject;
   typedef evaluator<PlainObject> Base;
 
   enum { Flags = Base::Flags | EvalBeforeNestingBit };
 
-  EIGEN_DEVICE_FUNC explicit evaluator(const SolveType& solve)
-    : m_result(solve.rows(), solve.cols())
-  {
+  EIGEN_DEVICE_FUNC explicit evaluator(const SolveType &solve) : m_result(solve.rows(), solve.cols()) {
     internal::construct_at<Base>(this, m_result);
     solve.dec()._solve_impl(solve.rhs(), m_result);
   }
 
-protected:
+ protected:
   PlainObject m_result;
 };
 
 // Specialization for "dst = dec.solve(rhs)"
-// NOTE we need to specialize it for Dense2Dense to avoid ambiguous specialization error and a Sparse2Sparse specialization must exist somewhere
-template<typename DstXprType, typename DecType, typename RhsType, typename Scalar>
-struct Assignment<DstXprType, Solve<DecType,RhsType>, internal::assign_op<Scalar,Scalar>, Dense2Dense>
-{
-  typedef Solve<DecType,RhsType> SrcXprType;
-  static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<Scalar,Scalar> &)
-  {
+// NOTE we need to specialize it for Dense2Dense to avoid ambiguous specialization error and a Sparse2Sparse
+// specialization must exist somewhere
+template <typename DstXprType, typename DecType, typename RhsType, typename Scalar>
+struct Assignment<DstXprType, Solve<DecType, RhsType>, internal::assign_op<Scalar, Scalar>, Dense2Dense> {
+  typedef Solve<DecType, RhsType> SrcXprType;
+  static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<Scalar, Scalar> &) {
     Index dstRows = src.rows();
     Index dstCols = src.cols();
-    if((dst.rows()!=dstRows) || (dst.cols()!=dstCols))
-      dst.resize(dstRows, dstCols);
+    if ((dst.rows() != dstRows) || (dst.cols() != dstCols)) dst.resize(dstRows, dstCols);
 
     src.dec()._solve_impl(src.rhs(), dst);
   }
 };
 
 // Specialization for "dst = dec.transpose().solve(rhs)"
-template<typename DstXprType, typename DecType, typename RhsType, typename Scalar>
-struct Assignment<DstXprType, Solve<Transpose<const DecType>,RhsType>, internal::assign_op<Scalar,Scalar>, Dense2Dense>
-{
-  typedef Solve<Transpose<const DecType>,RhsType> SrcXprType;
-  static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<Scalar,Scalar> &)
-  {
+template <typename DstXprType, typename DecType, typename RhsType, typename Scalar>
+struct Assignment<DstXprType, Solve<Transpose<const DecType>, RhsType>, internal::assign_op<Scalar, Scalar>,
+                  Dense2Dense> {
+  typedef Solve<Transpose<const DecType>, RhsType> SrcXprType;
+  static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<Scalar, Scalar> &) {
     Index dstRows = src.rows();
     Index dstCols = src.cols();
-    if((dst.rows()!=dstRows) || (dst.cols()!=dstCols))
-      dst.resize(dstRows, dstCols);
+    if ((dst.rows() != dstRows) || (dst.cols() != dstCols)) dst.resize(dstRows, dstCols);
 
     src.dec().nestedExpression().template _solve_impl_transposed<false>(src.rhs(), dst);
   }
 };
 
 // Specialization for "dst = dec.adjoint().solve(rhs)"
-template<typename DstXprType, typename DecType, typename RhsType, typename Scalar>
-struct Assignment<DstXprType, Solve<CwiseUnaryOp<internal::scalar_conjugate_op<typename DecType::Scalar>, const Transpose<const DecType> >,RhsType>,
-                  internal::assign_op<Scalar,Scalar>, Dense2Dense>
-{
-  typedef Solve<CwiseUnaryOp<internal::scalar_conjugate_op<typename DecType::Scalar>, const Transpose<const DecType> >,RhsType> SrcXprType;
-  static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<Scalar,Scalar> &)
-  {
+template <typename DstXprType, typename DecType, typename RhsType, typename Scalar>
+struct Assignment<
+    DstXprType,
+    Solve<CwiseUnaryOp<internal::scalar_conjugate_op<typename DecType::Scalar>, const Transpose<const DecType> >,
+          RhsType>,
+    internal::assign_op<Scalar, Scalar>, Dense2Dense> {
+  typedef Solve<CwiseUnaryOp<internal::scalar_conjugate_op<typename DecType::Scalar>, const Transpose<const DecType> >,
+                RhsType>
+      SrcXprType;
+  static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<Scalar, Scalar> &) {
     Index dstRows = src.rows();
     Index dstCols = src.cols();
-    if((dst.rows()!=dstRows) || (dst.cols()!=dstCols))
-      dst.resize(dstRows, dstCols);
+    if ((dst.rows() != dstRows) || (dst.cols() != dstCols)) dst.resize(dstRows, dstCols);
 
     src.dec().nestedExpression().nestedExpression().template _solve_impl_transposed<true>(src.rhs(), dst);
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SOLVE_H
+#endif  // EIGEN_SOLVE_H
diff --git a/Eigen/src/Core/SolveTriangular.h b/Eigen/src/Core/SolveTriangular.h
index b29a7da..26d62ff 100644
--- a/Eigen/src/Core/SolveTriangular.h
+++ b/Eigen/src/Core/SolveTriangular.h
@@ -19,84 +19,80 @@
 
 // Forward declarations:
 // The following two routines are implemented in the products/TriangularSolver*.h files
-template<typename LhsScalar, typename RhsScalar, typename Index, int Side, int Mode, bool Conjugate, int StorageOrder>
+template <typename LhsScalar, typename RhsScalar, typename Index, int Side, int Mode, bool Conjugate, int StorageOrder>
 struct triangular_solve_vector;
 
-template <typename Scalar, typename Index, int Side, int Mode, bool Conjugate, int TriStorageOrder, int OtherStorageOrder, int OtherInnerStride>
+template <typename Scalar, typename Index, int Side, int Mode, bool Conjugate, int TriStorageOrder,
+          int OtherStorageOrder, int OtherInnerStride>
 struct triangular_solve_matrix;
 
 // small helper struct extracting some traits on the underlying solver operation
-template<typename Lhs, typename Rhs, int Side>
-class trsolve_traits
-{
-  private:
-    enum {
-      RhsIsVectorAtCompileTime = (Side==OnTheLeft ? Rhs::ColsAtCompileTime : Rhs::RowsAtCompileTime)==1
-    };
-  public:
-    enum {
-      Unrolling   = (RhsIsVectorAtCompileTime && Rhs::SizeAtCompileTime != Dynamic && Rhs::SizeAtCompileTime <= 8)
-                  ? CompleteUnrolling : NoUnrolling,
-      RhsVectors  = RhsIsVectorAtCompileTime ? 1 : Dynamic
-    };
+template <typename Lhs, typename Rhs, int Side>
+class trsolve_traits {
+ private:
+  enum { RhsIsVectorAtCompileTime = (Side == OnTheLeft ? Rhs::ColsAtCompileTime : Rhs::RowsAtCompileTime) == 1 };
+
+ public:
+  enum {
+    Unrolling = (RhsIsVectorAtCompileTime && Rhs::SizeAtCompileTime != Dynamic && Rhs::SizeAtCompileTime <= 8)
+                    ? CompleteUnrolling
+                    : NoUnrolling,
+    RhsVectors = RhsIsVectorAtCompileTime ? 1 : Dynamic
+  };
 };
 
-template<typename Lhs, typename Rhs,
-  int Side, // can be OnTheLeft/OnTheRight
-  int Mode, // can be Upper/Lower | UnitDiag
-  int Unrolling = trsolve_traits<Lhs,Rhs,Side>::Unrolling,
-  int RhsVectors = trsolve_traits<Lhs,Rhs,Side>::RhsVectors
-  >
+template <typename Lhs, typename Rhs,
+          int Side,  // can be OnTheLeft/OnTheRight
+          int Mode,  // can be Upper/Lower | UnitDiag
+          int Unrolling = trsolve_traits<Lhs, Rhs, Side>::Unrolling,
+          int RhsVectors = trsolve_traits<Lhs, Rhs, Side>::RhsVectors>
 struct triangular_solver_selector;
 
-template<typename Lhs, typename Rhs, int Side, int Mode>
-struct triangular_solver_selector<Lhs,Rhs,Side,Mode,NoUnrolling,1>
-{
+template <typename Lhs, typename Rhs, int Side, int Mode>
+struct triangular_solver_selector<Lhs, Rhs, Side, Mode, NoUnrolling, 1> {
   typedef typename Lhs::Scalar LhsScalar;
   typedef typename Rhs::Scalar RhsScalar;
   typedef blas_traits<Lhs> LhsProductTraits;
   typedef typename LhsProductTraits::ExtractType ActualLhsType;
-  typedef Map<Matrix<RhsScalar,Dynamic,1>, Aligned> MappedRhs;
-  static EIGEN_DEVICE_FUNC void run(const Lhs& lhs, Rhs& rhs)
-  {
+  typedef Map<Matrix<RhsScalar, Dynamic, 1>, Aligned> MappedRhs;
+  static EIGEN_DEVICE_FUNC void run(const Lhs& lhs, Rhs& rhs) {
     ActualLhsType actualLhs = LhsProductTraits::extract(lhs);
 
     // FIXME find a way to allow an inner stride if packet_traits<Scalar>::size==1
 
-    bool useRhsDirectly = Rhs::InnerStrideAtCompileTime==1 || rhs.innerStride()==1;
+    bool useRhsDirectly = Rhs::InnerStrideAtCompileTime == 1 || rhs.innerStride() == 1;
 
-    ei_declare_aligned_stack_constructed_variable(RhsScalar,actualRhs,rhs.size(),
-                                                  (useRhsDirectly ? rhs.data() : 0));
+    ei_declare_aligned_stack_constructed_variable(RhsScalar, actualRhs, rhs.size(), (useRhsDirectly ? rhs.data() : 0));
 
-    if(!useRhsDirectly)
-      MappedRhs(actualRhs,rhs.size()) = rhs;
+    if (!useRhsDirectly) MappedRhs(actualRhs, rhs.size()) = rhs;
 
     triangular_solve_vector<LhsScalar, RhsScalar, Index, Side, Mode, LhsProductTraits::NeedToConjugate,
-                            (int(Lhs::Flags) & RowMajorBit) ? RowMajor : ColMajor>
-      ::run(actualLhs.cols(), actualLhs.data(), actualLhs.outerStride(), actualRhs);
+                            (int(Lhs::Flags) & RowMajorBit) ? RowMajor : ColMajor>::run(actualLhs.cols(),
+                                                                                        actualLhs.data(),
+                                                                                        actualLhs.outerStride(),
+                                                                                        actualRhs);
 
-    if(!useRhsDirectly)
-      rhs = MappedRhs(actualRhs, rhs.size());
+    if (!useRhsDirectly) rhs = MappedRhs(actualRhs, rhs.size());
   }
 };
 
 // the rhs is a matrix
-template<typename Lhs, typename Rhs, int Side, int Mode>
-struct triangular_solver_selector<Lhs,Rhs,Side,Mode,NoUnrolling,Dynamic>
-{
+template <typename Lhs, typename Rhs, int Side, int Mode>
+struct triangular_solver_selector<Lhs, Rhs, Side, Mode, NoUnrolling, Dynamic> {
   typedef typename Rhs::Scalar Scalar;
   typedef blas_traits<Lhs> LhsProductTraits;
   typedef typename LhsProductTraits::DirectLinearAccessType ActualLhsType;
 
-  static EIGEN_DEVICE_FUNC void run(const Lhs& lhs, Rhs& rhs)
-  {
+  static EIGEN_DEVICE_FUNC void run(const Lhs& lhs, Rhs& rhs) {
     add_const_on_value_type_t<ActualLhsType> actualLhs = LhsProductTraits::extract(lhs);
 
     const Index size = lhs.rows();
-    const Index othersize = Side==OnTheLeft? rhs.cols() : rhs.rows();
+    const Index othersize = Side == OnTheLeft ? rhs.cols() : rhs.rows();
 
-    typedef internal::gemm_blocking_space<(Rhs::Flags&RowMajorBit) ? RowMajor : ColMajor,Scalar,Scalar,
-              Rhs::MaxRowsAtCompileTime, Rhs::MaxColsAtCompileTime, Lhs::MaxRowsAtCompileTime,4> BlockingType;
+    typedef internal::gemm_blocking_space<(Rhs::Flags & RowMajorBit) ? RowMajor : ColMajor, Scalar, Scalar,
+                                          Rhs::MaxRowsAtCompileTime, Rhs::MaxColsAtCompileTime,
+                                          Lhs::MaxRowsAtCompileTime, 4>
+        BlockingType;
 
     // Nothing to solve.
     if (actualLhs.size() == 0 || rhs.size() == 0) {
@@ -105,139 +101,137 @@
 
     BlockingType blocking(rhs.rows(), rhs.cols(), size, 1, false);
 
-    triangular_solve_matrix<Scalar,Index,Side,Mode,LhsProductTraits::NeedToConjugate,(int(Lhs::Flags) & RowMajorBit) ? RowMajor : ColMajor,
-                               (Rhs::Flags&RowMajorBit) ? RowMajor : ColMajor, Rhs::InnerStrideAtCompileTime>
-      ::run(size, othersize, &actualLhs.coeffRef(0,0), actualLhs.outerStride(), &rhs.coeffRef(0,0), rhs.innerStride(), rhs.outerStride(), blocking);
+    triangular_solve_matrix<Scalar, Index, Side, Mode, LhsProductTraits::NeedToConjugate,
+                            (int(Lhs::Flags) & RowMajorBit) ? RowMajor : ColMajor,
+                            (Rhs::Flags & RowMajorBit) ? RowMajor : ColMajor,
+                            Rhs::InnerStrideAtCompileTime>::run(size, othersize, &actualLhs.coeffRef(0, 0),
+                                                                actualLhs.outerStride(), &rhs.coeffRef(0, 0),
+                                                                rhs.innerStride(), rhs.outerStride(), blocking);
   }
 };
 
 /***************************************************************************
-* meta-unrolling implementation
-***************************************************************************/
+ * meta-unrolling implementation
+ ***************************************************************************/
 
-template<typename Lhs, typename Rhs, int Mode, int LoopIndex, int Size,
-         bool Stop = LoopIndex==Size>
+template <typename Lhs, typename Rhs, int Mode, int LoopIndex, int Size, bool Stop = LoopIndex == Size>
 struct triangular_solver_unroller;
 
-template<typename Lhs, typename Rhs, int Mode, int LoopIndex, int Size>
-struct triangular_solver_unroller<Lhs,Rhs,Mode,LoopIndex,Size,false> {
+template <typename Lhs, typename Rhs, int Mode, int LoopIndex, int Size>
+struct triangular_solver_unroller<Lhs, Rhs, Mode, LoopIndex, Size, false> {
   enum {
-    IsLower = ((Mode&Lower)==Lower),
-    DiagIndex  = IsLower ? LoopIndex : Size - LoopIndex - 1,
-    StartIndex = IsLower ? 0         : DiagIndex+1
+    IsLower = ((Mode & Lower) == Lower),
+    DiagIndex = IsLower ? LoopIndex : Size - LoopIndex - 1,
+    StartIndex = IsLower ? 0 : DiagIndex + 1
   };
-  static EIGEN_DEVICE_FUNC void run(const Lhs& lhs, Rhs& rhs)
-  {
-    if (LoopIndex>0)
-      rhs.coeffRef(DiagIndex) -= lhs.row(DiagIndex).template segment<LoopIndex>(StartIndex).transpose()
-                                .cwiseProduct(rhs.template segment<LoopIndex>(StartIndex)).sum();
+  static EIGEN_DEVICE_FUNC void run(const Lhs& lhs, Rhs& rhs) {
+    if (LoopIndex > 0)
+      rhs.coeffRef(DiagIndex) -= lhs.row(DiagIndex)
+                                     .template segment<LoopIndex>(StartIndex)
+                                     .transpose()
+                                     .cwiseProduct(rhs.template segment<LoopIndex>(StartIndex))
+                                     .sum();
 
-    if(!(Mode & UnitDiag))
-      rhs.coeffRef(DiagIndex) /= lhs.coeff(DiagIndex,DiagIndex);
+    if (!(Mode & UnitDiag)) rhs.coeffRef(DiagIndex) /= lhs.coeff(DiagIndex, DiagIndex);
 
-    triangular_solver_unroller<Lhs,Rhs,Mode,LoopIndex+1,Size>::run(lhs,rhs);
+    triangular_solver_unroller<Lhs, Rhs, Mode, LoopIndex + 1, Size>::run(lhs, rhs);
   }
 };
 
-template<typename Lhs, typename Rhs, int Mode, int LoopIndex, int Size>
-struct triangular_solver_unroller<Lhs,Rhs,Mode,LoopIndex,Size,true> {
+template <typename Lhs, typename Rhs, int Mode, int LoopIndex, int Size>
+struct triangular_solver_unroller<Lhs, Rhs, Mode, LoopIndex, Size, true> {
   static EIGEN_DEVICE_FUNC void run(const Lhs&, Rhs&) {}
 };
 
-template<typename Lhs, typename Rhs, int Mode>
-struct triangular_solver_selector<Lhs,Rhs,OnTheLeft,Mode,CompleteUnrolling,1> {
-  static EIGEN_DEVICE_FUNC void run(const Lhs& lhs, Rhs& rhs)
-  { triangular_solver_unroller<Lhs,Rhs,Mode,0,Rhs::SizeAtCompileTime>::run(lhs,rhs); }
-};
-
-template<typename Lhs, typename Rhs, int Mode>
-struct triangular_solver_selector<Lhs,Rhs,OnTheRight,Mode,CompleteUnrolling,1> {
-  static EIGEN_DEVICE_FUNC void run(const Lhs& lhs, Rhs& rhs)
-  {
-    Transpose<const Lhs> trLhs(lhs);
-    Transpose<Rhs> trRhs(rhs);
-
-    triangular_solver_unroller<Transpose<const Lhs>,Transpose<Rhs>,
-                              ((Mode&Upper)==Upper ? Lower : Upper) | (Mode&UnitDiag),
-                              0,Rhs::SizeAtCompileTime>::run(trLhs,trRhs);
+template <typename Lhs, typename Rhs, int Mode>
+struct triangular_solver_selector<Lhs, Rhs, OnTheLeft, Mode, CompleteUnrolling, 1> {
+  static EIGEN_DEVICE_FUNC void run(const Lhs& lhs, Rhs& rhs) {
+    triangular_solver_unroller<Lhs, Rhs, Mode, 0, Rhs::SizeAtCompileTime>::run(lhs, rhs);
   }
 };
 
-} // end namespace internal
+template <typename Lhs, typename Rhs, int Mode>
+struct triangular_solver_selector<Lhs, Rhs, OnTheRight, Mode, CompleteUnrolling, 1> {
+  static EIGEN_DEVICE_FUNC void run(const Lhs& lhs, Rhs& rhs) {
+    Transpose<const Lhs> trLhs(lhs);
+    Transpose<Rhs> trRhs(rhs);
+
+    triangular_solver_unroller<Transpose<const Lhs>, Transpose<Rhs>,
+                               ((Mode & Upper) == Upper ? Lower : Upper) | (Mode & UnitDiag), 0,
+                               Rhs::SizeAtCompileTime>::run(trLhs, trRhs);
+  }
+};
+
+}  // end namespace internal
 
 /***************************************************************************
-* TriangularView methods
-***************************************************************************/
+ * TriangularView methods
+ ***************************************************************************/
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-template<typename MatrixType, unsigned int Mode>
-template<int Side, typename OtherDerived>
-EIGEN_DEVICE_FUNC void TriangularViewImpl<MatrixType,Mode,Dense>::solveInPlace(const MatrixBase<OtherDerived>& _other) const
-{
+template <typename MatrixType, unsigned int Mode>
+template <int Side, typename OtherDerived>
+EIGEN_DEVICE_FUNC void TriangularViewImpl<MatrixType, Mode, Dense>::solveInPlace(
+    const MatrixBase<OtherDerived>& _other) const {
   OtherDerived& other = _other.const_cast_derived();
-  eigen_assert( derived().cols() == derived().rows() && ((Side==OnTheLeft && derived().cols() == other.rows()) || (Side==OnTheRight && derived().cols() == other.cols())) );
+  eigen_assert(derived().cols() == derived().rows() && ((Side == OnTheLeft && derived().cols() == other.rows()) ||
+                                                        (Side == OnTheRight && derived().cols() == other.cols())));
   eigen_assert((!(int(Mode) & int(ZeroDiag))) && bool(int(Mode) & (int(Upper) | int(Lower))));
   // If solving for a 0x0 matrix, nothing to do, simply return.
-  if (derived().cols() == 0)
-    return;
+  if (derived().cols() == 0) return;
 
-  enum { copy = (internal::traits<OtherDerived>::Flags & RowMajorBit)  && OtherDerived::IsVectorAtCompileTime && OtherDerived::SizeAtCompileTime!=1};
-  typedef std::conditional_t<copy,
-    typename internal::plain_matrix_type_column_major<OtherDerived>::type, OtherDerived&> OtherCopy;
+  enum {
+    copy = (internal::traits<OtherDerived>::Flags & RowMajorBit) && OtherDerived::IsVectorAtCompileTime &&
+           OtherDerived::SizeAtCompileTime != 1
+  };
+  typedef std::conditional_t<copy, typename internal::plain_matrix_type_column_major<OtherDerived>::type, OtherDerived&>
+      OtherCopy;
   OtherCopy otherCopy(other);
 
-  internal::triangular_solver_selector<MatrixType, std::remove_reference_t<OtherCopy>,
-    Side, Mode>::run(derived().nestedExpression(), otherCopy);
+  internal::triangular_solver_selector<MatrixType, std::remove_reference_t<OtherCopy>, Side, Mode>::run(
+      derived().nestedExpression(), otherCopy);
 
-  if (copy)
-    other = otherCopy;
+  if (copy) other = otherCopy;
 }
 
-template<typename Derived, unsigned int Mode>
-template<int Side, typename Other>
-const internal::triangular_solve_retval<Side,TriangularView<Derived,Mode>,Other>
-TriangularViewImpl<Derived,Mode,Dense>::solve(const MatrixBase<Other>& other) const
-{
-  return internal::triangular_solve_retval<Side,TriangularViewType,Other>(derived(), other.derived());
+template <typename Derived, unsigned int Mode>
+template <int Side, typename Other>
+const internal::triangular_solve_retval<Side, TriangularView<Derived, Mode>, Other>
+TriangularViewImpl<Derived, Mode, Dense>::solve(const MatrixBase<Other>& other) const {
+  return internal::triangular_solve_retval<Side, TriangularViewType, Other>(derived(), other.derived());
 }
 #endif
 
 namespace internal {
 
-
-template<int Side, typename TriangularType, typename Rhs>
-struct traits<triangular_solve_retval<Side, TriangularType, Rhs> >
-{
+template <int Side, typename TriangularType, typename Rhs>
+struct traits<triangular_solve_retval<Side, TriangularType, Rhs> > {
   typedef typename internal::plain_matrix_type_column_major<Rhs>::type ReturnType;
 };
 
-template<int Side, typename TriangularType, typename Rhs> struct triangular_solve_retval
- : public ReturnByValue<triangular_solve_retval<Side, TriangularType, Rhs> >
-{
+template <int Side, typename TriangularType, typename Rhs>
+struct triangular_solve_retval : public ReturnByValue<triangular_solve_retval<Side, TriangularType, Rhs> > {
   typedef remove_all_t<typename Rhs::Nested> RhsNestedCleaned;
   typedef ReturnByValue<triangular_solve_retval> Base;
 
-  triangular_solve_retval(const TriangularType& tri, const Rhs& rhs)
-    : m_triangularMatrix(tri), m_rhs(rhs)
-  {}
+  triangular_solve_retval(const TriangularType& tri, const Rhs& rhs) : m_triangularMatrix(tri), m_rhs(rhs) {}
 
   inline EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_rhs.rows(); }
   inline EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_rhs.cols(); }
 
-  template<typename Dest> inline void evalTo(Dest& dst) const
-  {
-    if(!is_same_dense(dst,m_rhs))
-      dst = m_rhs;
+  template <typename Dest>
+  inline void evalTo(Dest& dst) const {
+    if (!is_same_dense(dst, m_rhs)) dst = m_rhs;
     m_triangularMatrix.template solveInPlace<Side>(dst);
   }
 
-  protected:
-    const TriangularType& m_triangularMatrix;
-    typename Rhs::Nested m_rhs;
+ protected:
+  const TriangularType& m_triangularMatrix;
+  typename Rhs::Nested m_rhs;
 };
 
-} // namespace internal
+}  // namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SOLVETRIANGULAR_H
+#endif  // EIGEN_SOLVETRIANGULAR_H
diff --git a/Eigen/src/Core/SolverBase.h b/Eigen/src/Core/SolverBase.h
index f45b519..df2ac83 100644
--- a/Eigen/src/Core/SolverBase.h
+++ b/Eigen/src/Core/SolverBase.h
@@ -17,154 +17,143 @@
 
 namespace internal {
 
-template<typename Derived>
+template <typename Derived>
 struct solve_assertion {
-    template<bool Transpose_, typename Rhs>
-    static void run(const Derived& solver, const Rhs& b) { solver.template _check_solve_assertion<Transpose_>(b); }
+  template <bool Transpose_, typename Rhs>
+  static void run(const Derived& solver, const Rhs& b) {
+    solver.template _check_solve_assertion<Transpose_>(b);
+  }
 };
 
-template<typename Derived>
-struct solve_assertion<Transpose<Derived> >
-{
-    typedef Transpose<Derived> type;
+template <typename Derived>
+struct solve_assertion<Transpose<Derived>> {
+  typedef Transpose<Derived> type;
 
-    template<bool Transpose_, typename Rhs>
-    static void run(const type& transpose, const Rhs& b)
-    {
-        internal::solve_assertion<internal::remove_all_t<Derived>>::template run<true>(transpose.nestedExpression(), b);
-    }
+  template <bool Transpose_, typename Rhs>
+  static void run(const type& transpose, const Rhs& b) {
+    internal::solve_assertion<internal::remove_all_t<Derived>>::template run<true>(transpose.nestedExpression(), b);
+  }
 };
 
-template<typename Scalar, typename Derived>
-struct solve_assertion<CwiseUnaryOp<Eigen::internal::scalar_conjugate_op<Scalar>, const Transpose<Derived> > >
-{
-    typedef CwiseUnaryOp<Eigen::internal::scalar_conjugate_op<Scalar>, const Transpose<Derived> > type;
+template <typename Scalar, typename Derived>
+struct solve_assertion<CwiseUnaryOp<Eigen::internal::scalar_conjugate_op<Scalar>, const Transpose<Derived>>> {
+  typedef CwiseUnaryOp<Eigen::internal::scalar_conjugate_op<Scalar>, const Transpose<Derived>> type;
 
-    template<bool Transpose_, typename Rhs>
-    static void run(const type& adjoint, const Rhs& b)
-    {
-        internal::solve_assertion<internal::remove_all_t<Transpose<Derived> >>::template run<true>(adjoint.nestedExpression(), b);
-    }
+  template <bool Transpose_, typename Rhs>
+  static void run(const type& adjoint, const Rhs& b) {
+    internal::solve_assertion<internal::remove_all_t<Transpose<Derived>>>::template run<true>(
+        adjoint.nestedExpression(), b);
+  }
 };
-} // end namespace internal
+}  // end namespace internal
 
 /** \class SolverBase
-  * \brief A base class for matrix decomposition and solvers
-  *
-  * \tparam Derived the actual type of the decomposition/solver.
-  *
-  * Any matrix decomposition inheriting this base class provide the following API:
-  *
-  * \code
-  * MatrixType A, b, x;
-  * DecompositionType dec(A);
-  * x = dec.solve(b);             // solve A   * x = b
-  * x = dec.transpose().solve(b); // solve A^T * x = b
-  * x = dec.adjoint().solve(b);   // solve A'  * x = b
-  * \endcode
-  *
-  * \warning Currently, any other usage of transpose() and adjoint() are not supported and will produce compilation errors.
-  *
-  * \sa class PartialPivLU, class FullPivLU, class HouseholderQR, class ColPivHouseholderQR, class FullPivHouseholderQR, class CompleteOrthogonalDecomposition, class LLT, class LDLT, class SVDBase
-  */
-template<typename Derived>
-class SolverBase : public EigenBase<Derived>
-{
-  public:
+ * \brief A base class for matrix decomposition and solvers
+ *
+ * \tparam Derived the actual type of the decomposition/solver.
+ *
+ * Any matrix decomposition inheriting this base class provide the following API:
+ *
+ * \code
+ * MatrixType A, b, x;
+ * DecompositionType dec(A);
+ * x = dec.solve(b);             // solve A   * x = b
+ * x = dec.transpose().solve(b); // solve A^T * x = b
+ * x = dec.adjoint().solve(b);   // solve A'  * x = b
+ * \endcode
+ *
+ * \warning Currently, any other usage of transpose() and adjoint() are not supported and will produce compilation
+ * errors.
+ *
+ * \sa class PartialPivLU, class FullPivLU, class HouseholderQR, class ColPivHouseholderQR, class FullPivHouseholderQR,
+ * class CompleteOrthogonalDecomposition, class LLT, class LDLT, class SVDBase
+ */
+template <typename Derived>
+class SolverBase : public EigenBase<Derived> {
+ public:
+  typedef EigenBase<Derived> Base;
+  typedef typename internal::traits<Derived>::Scalar Scalar;
+  typedef Scalar CoeffReturnType;
 
-    typedef EigenBase<Derived> Base;
-    typedef typename internal::traits<Derived>::Scalar Scalar;
-    typedef Scalar CoeffReturnType;
+  template <typename Derived_>
+  friend struct internal::solve_assertion;
 
-    template<typename Derived_>
-    friend struct internal::solve_assertion;
+  enum {
+    RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
+    ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
+    SizeAtCompileTime = (internal::size_of_xpr_at_compile_time<Derived>::ret),
+    MaxRowsAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = internal::traits<Derived>::MaxColsAtCompileTime,
+    MaxSizeAtCompileTime = internal::size_at_compile_time(internal::traits<Derived>::MaxRowsAtCompileTime,
+                                                          internal::traits<Derived>::MaxColsAtCompileTime),
+    IsVectorAtCompileTime =
+        internal::traits<Derived>::MaxRowsAtCompileTime == 1 || internal::traits<Derived>::MaxColsAtCompileTime == 1,
+    NumDimensions = int(MaxSizeAtCompileTime) == 1 ? 0
+                    : bool(IsVectorAtCompileTime)  ? 1
+                                                   : 2
+  };
 
-    enum {
-      RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
-      ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
-      SizeAtCompileTime = (internal::size_of_xpr_at_compile_time<Derived>::ret),
-      MaxRowsAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime,
-      MaxColsAtCompileTime = internal::traits<Derived>::MaxColsAtCompileTime,
-      MaxSizeAtCompileTime = internal::size_at_compile_time(internal::traits<Derived>::MaxRowsAtCompileTime,
-                                                            internal::traits<Derived>::MaxColsAtCompileTime),
-      IsVectorAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime == 1
-                           || internal::traits<Derived>::MaxColsAtCompileTime == 1,
-      NumDimensions = int(MaxSizeAtCompileTime) == 1 ? 0 : bool(IsVectorAtCompileTime) ? 1 : 2
-    };
+  /** Default constructor */
+  SolverBase() {}
 
-    /** Default constructor */
-    SolverBase()
-    {}
+  ~SolverBase() {}
 
-    ~SolverBase()
-    {}
+  using Base::derived;
 
-    using Base::derived;
+  /** \returns an expression of the solution x of \f$ A x = b \f$ using the current decomposition of A.
+   */
+  template <typename Rhs>
+  inline const Solve<Derived, Rhs> solve(const MatrixBase<Rhs>& b) const {
+    internal::solve_assertion<internal::remove_all_t<Derived>>::template run<false>(derived(), b);
+    return Solve<Derived, Rhs>(derived(), b.derived());
+  }
 
-    /** \returns an expression of the solution x of \f$ A x = b \f$ using the current decomposition of A.
-      */
-    template<typename Rhs>
-    inline const Solve<Derived, Rhs>
-    solve(const MatrixBase<Rhs>& b) const
-    {
-      internal::solve_assertion<internal::remove_all_t<Derived>>::template run<false>(derived(), b);
-      return Solve<Derived, Rhs>(derived(), b.derived());
-    }
+  /** \internal the return type of transpose() */
+  typedef Transpose<const Derived> ConstTransposeReturnType;
+  /** \returns an expression of the transposed of the factored matrix.
+   *
+   * A typical usage is to solve for the transposed problem A^T x = b:
+   * \code x = dec.transpose().solve(b); \endcode
+   *
+   * \sa adjoint(), solve()
+   */
+  inline const ConstTransposeReturnType transpose() const { return ConstTransposeReturnType(derived()); }
 
-    /** \internal the return type of transpose() */
-    typedef Transpose<const Derived> ConstTransposeReturnType;
-    /** \returns an expression of the transposed of the factored matrix.
-      *
-      * A typical usage is to solve for the transposed problem A^T x = b:
-      * \code x = dec.transpose().solve(b); \endcode
-      *
-      * \sa adjoint(), solve()
-      */
-    inline const ConstTransposeReturnType transpose() const
-    {
-      return ConstTransposeReturnType(derived());
-    }
+  /** \internal the return type of adjoint() */
+  typedef std::conditional_t<NumTraits<Scalar>::IsComplex,
+                             CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>, const ConstTransposeReturnType>,
+                             const ConstTransposeReturnType>
+      AdjointReturnType;
+  /** \returns an expression of the adjoint of the factored matrix
+   *
+   * A typical usage is to solve for the adjoint problem A' x = b:
+   * \code x = dec.adjoint().solve(b); \endcode
+   *
+   * For real scalar types, this function is equivalent to transpose().
+   *
+   * \sa transpose(), solve()
+   */
+  inline const AdjointReturnType adjoint() const { return AdjointReturnType(derived().transpose()); }
 
-    /** \internal the return type of adjoint() */
-    typedef std::conditional_t<NumTraits<Scalar>::IsComplex,
-               CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>, const ConstTransposeReturnType>,
-               const ConstTransposeReturnType
-            > AdjointReturnType;
-    /** \returns an expression of the adjoint of the factored matrix
-      *
-      * A typical usage is to solve for the adjoint problem A' x = b:
-      * \code x = dec.adjoint().solve(b); \endcode
-      *
-      * For real scalar types, this function is equivalent to transpose().
-      *
-      * \sa transpose(), solve()
-      */
-    inline const AdjointReturnType adjoint() const
-    {
-      return AdjointReturnType(derived().transpose());
-    }
-
-  protected:
-
-    template<bool Transpose_, typename Rhs>
-    void _check_solve_assertion(const Rhs& b) const {
-        EIGEN_ONLY_USED_FOR_DEBUG(b);
-        eigen_assert(derived().m_isInitialized && "Solver is not initialized.");
-        eigen_assert((Transpose_?derived().cols():derived().rows())==b.rows() && "SolverBase::solve(): invalid number of rows of the right hand side matrix b");
-    }
+ protected:
+  template <bool Transpose_, typename Rhs>
+  void _check_solve_assertion(const Rhs& b) const {
+    EIGEN_ONLY_USED_FOR_DEBUG(b);
+    eigen_assert(derived().m_isInitialized && "Solver is not initialized.");
+    eigen_assert((Transpose_ ? derived().cols() : derived().rows()) == b.rows() &&
+                 "SolverBase::solve(): invalid number of rows of the right hand side matrix b");
+  }
 };
 
 namespace internal {
 
-template<typename Derived>
-struct generic_xpr_base<Derived, MatrixXpr, SolverStorage>
-{
+template <typename Derived>
+struct generic_xpr_base<Derived, MatrixXpr, SolverStorage> {
   typedef SolverBase<Derived> type;
-
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SOLVERBASE_H
+#endif  // EIGEN_SOLVERBASE_H
diff --git a/Eigen/src/Core/StableNorm.h b/Eigen/src/Core/StableNorm.h
index dd36f2c..6513120 100644
--- a/Eigen/src/Core/StableNorm.h
+++ b/Eigen/src/Core/StableNorm.h
@@ -13,119 +13,111 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
-template<typename ExpressionType, typename Scalar>
-inline void stable_norm_kernel(const ExpressionType& bl, Scalar& ssq, Scalar& scale, Scalar& invScale)
-{
+template <typename ExpressionType, typename Scalar>
+inline void stable_norm_kernel(const ExpressionType& bl, Scalar& ssq, Scalar& scale, Scalar& invScale) {
   Scalar maxCoeff = bl.cwiseAbs().maxCoeff();
-  
-  if(maxCoeff>scale)
-  {
-    ssq = ssq * numext::abs2(scale/maxCoeff);
-    Scalar tmp = Scalar(1)/maxCoeff;
-    if(tmp > NumTraits<Scalar>::highest())
-    {
+
+  if (maxCoeff > scale) {
+    ssq = ssq * numext::abs2(scale / maxCoeff);
+    Scalar tmp = Scalar(1) / maxCoeff;
+    if (tmp > NumTraits<Scalar>::highest()) {
       invScale = NumTraits<Scalar>::highest();
-      scale = Scalar(1)/invScale;
-    }
-    else if(maxCoeff>NumTraits<Scalar>::highest()) // we got a INF
+      scale = Scalar(1) / invScale;
+    } else if (maxCoeff > NumTraits<Scalar>::highest())  // we got a INF
     {
       invScale = Scalar(1);
       scale = maxCoeff;
-    }
-    else
-    {
+    } else {
       scale = maxCoeff;
       invScale = tmp;
     }
-  }
-  else if(maxCoeff!=maxCoeff) // we got a NaN
+  } else if (maxCoeff != maxCoeff)  // we got a NaN
   {
     scale = maxCoeff;
   }
-  
+
   // TODO if the maxCoeff is much much smaller than the current scale,
   // then we can neglect this sub vector
-  if(scale>Scalar(0)) // if scale==0, then bl is 0 
-    ssq += (bl*invScale).squaredNorm();
+  if (scale > Scalar(0))  // if scale==0, then bl is 0
+    ssq += (bl * invScale).squaredNorm();
 }
 
-template<typename VectorType, typename RealScalar>
-void stable_norm_impl_inner_step(const VectorType &vec, RealScalar& ssq, RealScalar& scale, RealScalar& invScale)
-{
+template <typename VectorType, typename RealScalar>
+void stable_norm_impl_inner_step(const VectorType& vec, RealScalar& ssq, RealScalar& scale, RealScalar& invScale) {
   typedef typename VectorType::Scalar Scalar;
   const Index blockSize = 4096;
-  
-  typedef typename internal::nested_eval<VectorType,2>::type VectorTypeCopy;
+
+  typedef typename internal::nested_eval<VectorType, 2>::type VectorTypeCopy;
   typedef internal::remove_all_t<VectorTypeCopy> VectorTypeCopyClean;
   const VectorTypeCopy copy(vec);
-  
+
   enum {
-    CanAlign = (   (int(VectorTypeCopyClean::Flags)&DirectAccessBit)
-                || (int(internal::evaluator<VectorTypeCopyClean>::Alignment)>0) // FIXME Alignment)>0 might not be enough
-               ) && (blockSize*sizeof(Scalar)*2<EIGEN_STACK_ALLOCATION_LIMIT)
-                 && (EIGEN_MAX_STATIC_ALIGN_BYTES>0) // if we cannot allocate on the stack, then let's not bother about this optimization
+    CanAlign =
+        ((int(VectorTypeCopyClean::Flags) & DirectAccessBit) ||
+         (int(internal::evaluator<VectorTypeCopyClean>::Alignment) > 0)  // FIXME Alignment)>0 might not be enough
+         ) &&
+        (blockSize * sizeof(Scalar) * 2 < EIGEN_STACK_ALLOCATION_LIMIT) &&
+        (EIGEN_MAX_STATIC_ALIGN_BYTES >
+         0)  // if we cannot allocate on the stack, then let's not bother about this optimization
   };
-  typedef std::conditional_t<CanAlign, Ref<const Matrix<Scalar,Dynamic,1,0,blockSize,1>, internal::evaluator<VectorTypeCopyClean>::Alignment>,
-                                                   typename VectorTypeCopyClean::ConstSegmentReturnType> SegmentWrapper;
+  typedef std::conditional_t<
+      CanAlign,
+      Ref<const Matrix<Scalar, Dynamic, 1, 0, blockSize, 1>, internal::evaluator<VectorTypeCopyClean>::Alignment>,
+      typename VectorTypeCopyClean::ConstSegmentReturnType>
+      SegmentWrapper;
   Index n = vec.size();
-  
+
   Index bi = internal::first_default_aligned(copy);
-  if (bi>0)
-    internal::stable_norm_kernel(copy.head(bi), ssq, scale, invScale);
-  for (; bi<n; bi+=blockSize)
-    internal::stable_norm_kernel(SegmentWrapper(copy.segment(bi,numext::mini(blockSize, n - bi))), ssq, scale, invScale);
+  if (bi > 0) internal::stable_norm_kernel(copy.head(bi), ssq, scale, invScale);
+  for (; bi < n; bi += blockSize)
+    internal::stable_norm_kernel(SegmentWrapper(copy.segment(bi, numext::mini(blockSize, n - bi))), ssq, scale,
+                                 invScale);
 }
 
-template<typename VectorType>
-typename VectorType::RealScalar
-stable_norm_impl(const VectorType &vec, std::enable_if_t<VectorType::IsVectorAtCompileTime>* = 0 )
-{
-  using std::sqrt;
+template <typename VectorType>
+typename VectorType::RealScalar stable_norm_impl(const VectorType& vec,
+                                                 std::enable_if_t<VectorType::IsVectorAtCompileTime>* = 0) {
   using std::abs;
+  using std::sqrt;
 
   Index n = vec.size();
 
-  if(n==1)
-    return abs(vec.coeff(0));
+  if (n == 1) return abs(vec.coeff(0));
 
   typedef typename VectorType::RealScalar RealScalar;
   RealScalar scale(0);
   RealScalar invScale(1);
-  RealScalar ssq(0); // sum of squares
+  RealScalar ssq(0);  // sum of squares
 
   stable_norm_impl_inner_step(vec, ssq, scale, invScale);
-  
+
   return scale * sqrt(ssq);
 }
 
-template<typename MatrixType>
-typename MatrixType::RealScalar
-stable_norm_impl(const MatrixType &mat, std::enable_if_t<!MatrixType::IsVectorAtCompileTime>* = 0 )
-{
+template <typename MatrixType>
+typename MatrixType::RealScalar stable_norm_impl(const MatrixType& mat,
+                                                 std::enable_if_t<!MatrixType::IsVectorAtCompileTime>* = 0) {
   using std::sqrt;
 
   typedef typename MatrixType::RealScalar RealScalar;
   RealScalar scale(0);
   RealScalar invScale(1);
-  RealScalar ssq(0); // sum of squares
+  RealScalar ssq(0);  // sum of squares
 
-  for(Index j=0; j<mat.outerSize(); ++j)
-    stable_norm_impl_inner_step(mat.innerVector(j), ssq, scale, invScale);
+  for (Index j = 0; j < mat.outerSize(); ++j) stable_norm_impl_inner_step(mat.innerVector(j), ssq, scale, invScale);
   return scale * sqrt(ssq);
 }
 
-template<typename Derived>
-inline typename NumTraits<typename traits<Derived>::Scalar>::Real
-blueNorm_impl(const EigenBase<Derived>& _vec)
-{
-  typedef typename Derived::RealScalar RealScalar;  
+template <typename Derived>
+inline typename NumTraits<typename traits<Derived>::Scalar>::Real blueNorm_impl(const EigenBase<Derived>& _vec) {
+  typedef typename Derived::RealScalar RealScalar;
+  using std::abs;
   using std::pow;
   using std::sqrt;
-  using std::abs;
 
   // This program calculates the machine-dependent constants
   // bl, b2, slm, s2m, relerr overfl
@@ -136,15 +128,19 @@
   // are used. For any specific computer, each of the assignment
   // statements can be replaced
   static const int ibeta = std::numeric_limits<RealScalar>::radix;  // base for floating-point numbers
-  static const int it    = NumTraits<RealScalar>::digits();  // number of base-beta digits in mantissa
-  static const int iemin = NumTraits<RealScalar>::min_exponent();  // minimum exponent
-  static const int iemax = NumTraits<RealScalar>::max_exponent();  // maximum exponent
-  static const RealScalar rbig   = NumTraits<RealScalar>::highest();  // largest floating-point number
-  static const RealScalar b1     = RealScalar(pow(RealScalar(ibeta),RealScalar(-((1-iemin)/2))));  // lower boundary of midrange
-  static const RealScalar b2     = RealScalar(pow(RealScalar(ibeta),RealScalar((iemax + 1 - it)/2)));  // upper boundary of midrange
-  static const RealScalar s1m    = RealScalar(pow(RealScalar(ibeta),RealScalar((2-iemin)/2)));  // scaling factor for lower range
-  static const RealScalar s2m    = RealScalar(pow(RealScalar(ibeta),RealScalar(- ((iemax+it)/2))));  // scaling factor for upper range
-  static const RealScalar eps    = RealScalar(pow(double(ibeta), 1-it));
+  static const int it = NumTraits<RealScalar>::digits();            // number of base-beta digits in mantissa
+  static const int iemin = NumTraits<RealScalar>::min_exponent();   // minimum exponent
+  static const int iemax = NumTraits<RealScalar>::max_exponent();   // maximum exponent
+  static const RealScalar rbig = NumTraits<RealScalar>::highest();  // largest floating-point number
+  static const RealScalar b1 =
+      RealScalar(pow(RealScalar(ibeta), RealScalar(-((1 - iemin) / 2))));  // lower boundary of midrange
+  static const RealScalar b2 =
+      RealScalar(pow(RealScalar(ibeta), RealScalar((iemax + 1 - it) / 2)));  // upper boundary of midrange
+  static const RealScalar s1m =
+      RealScalar(pow(RealScalar(ibeta), RealScalar((2 - iemin) / 2)));  // scaling factor for lower range
+  static const RealScalar s2m =
+      RealScalar(pow(RealScalar(ibeta), RealScalar(-((iemax + it) / 2))));  // scaling factor for upper range
+  static const RealScalar eps = RealScalar(pow(double(ibeta), 1 - it));
   static const RealScalar relerr = sqrt(eps);  // tolerance for neglecting asml
 
   const Derived& vec(_vec.derived());
@@ -154,101 +150,87 @@
   RealScalar amed = RealScalar(0);
   RealScalar abig = RealScalar(0);
 
-  for(Index j=0; j<vec.outerSize(); ++j)
-  {
-    for(typename Derived::InnerIterator iter(vec, j); iter; ++iter)
-    {
+  for (Index j = 0; j < vec.outerSize(); ++j) {
+    for (typename Derived::InnerIterator iter(vec, j); iter; ++iter) {
       RealScalar ax = abs(iter.value());
-      if(ax > ab2)     abig += numext::abs2(ax*s2m);
-      else if(ax < b1) asml += numext::abs2(ax*s1m);
-      else             amed += numext::abs2(ax);
+      if (ax > ab2)
+        abig += numext::abs2(ax * s2m);
+      else if (ax < b1)
+        asml += numext::abs2(ax * s1m);
+      else
+        amed += numext::abs2(ax);
     }
   }
-  if(amed!=amed)
-    return amed;  // we got a NaN
-  if(abig > RealScalar(0))
-  {
+  if (amed != amed) return amed;  // we got a NaN
+  if (abig > RealScalar(0)) {
     abig = sqrt(abig);
-    if(abig > rbig) // overflow, or *this contains INF values
-      return abig;  // return INF
-    if(amed > RealScalar(0))
-    {
-      abig = abig/s2m;
+    if (abig > rbig)  // overflow, or *this contains INF values
+      return abig;    // return INF
+    if (amed > RealScalar(0)) {
+      abig = abig / s2m;
       amed = sqrt(amed);
-    }
-    else
-      return abig/s2m;
-  }
-  else if(asml > RealScalar(0))
-  {
-    if (amed > RealScalar(0))
-    {
+    } else
+      return abig / s2m;
+  } else if (asml > RealScalar(0)) {
+    if (amed > RealScalar(0)) {
       abig = sqrt(amed);
       amed = sqrt(asml) / s1m;
-    }
-    else
-      return sqrt(asml)/s1m;
-  }
-  else
+    } else
+      return sqrt(asml) / s1m;
+  } else
     return sqrt(amed);
   asml = numext::mini(abig, amed);
   abig = numext::maxi(abig, amed);
-  if(asml <= abig*relerr)
+  if (asml <= abig * relerr)
     return abig;
   else
-    return abig * sqrt(RealScalar(1) + numext::abs2(asml/abig));
+    return abig * sqrt(RealScalar(1) + numext::abs2(asml / abig));
 }
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \returns the \em l2 norm of \c *this avoiding underflow and overflow.
-  * This version use a blockwise two passes algorithm:
-  *  1 - find the absolute largest coefficient \c s
-  *  2 - compute \f$ s \Vert \frac{*this}{s} \Vert \f$ in a standard way
-  *
-  * For architecture/scalar types supporting vectorization, this version
-  * is faster than blueNorm(). Otherwise the blueNorm() is much faster.
-  *
-  * \sa norm(), blueNorm(), hypotNorm()
-  */
-template<typename Derived>
-inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
-MatrixBase<Derived>::stableNorm() const
-{
+ * This version use a blockwise two passes algorithm:
+ *  1 - find the absolute largest coefficient \c s
+ *  2 - compute \f$ s \Vert \frac{*this}{s} \Vert \f$ in a standard way
+ *
+ * For architecture/scalar types supporting vectorization, this version
+ * is faster than blueNorm(). Otherwise the blueNorm() is much faster.
+ *
+ * \sa norm(), blueNorm(), hypotNorm()
+ */
+template <typename Derived>
+inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real MatrixBase<Derived>::stableNorm() const {
   return internal::stable_norm_impl(derived());
 }
 
 /** \returns the \em l2 norm of \c *this using the Blue's algorithm.
-  * A Portable Fortran Program to Find the Euclidean Norm of a Vector,
-  * ACM TOMS, Vol 4, Issue 1, 1978.
-  *
-  * For architecture/scalar types without vectorization, this version
-  * is much faster than stableNorm(). Otherwise the stableNorm() is faster.
-  *
-  * \sa norm(), stableNorm(), hypotNorm()
-  */
-template<typename Derived>
-inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
-MatrixBase<Derived>::blueNorm() const
-{
+ * A Portable Fortran Program to Find the Euclidean Norm of a Vector,
+ * ACM TOMS, Vol 4, Issue 1, 1978.
+ *
+ * For architecture/scalar types without vectorization, this version
+ * is much faster than stableNorm(). Otherwise the stableNorm() is faster.
+ *
+ * \sa norm(), stableNorm(), hypotNorm()
+ */
+template <typename Derived>
+inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real MatrixBase<Derived>::blueNorm() const {
   return internal::blueNorm_impl(*this);
 }
 
 /** \returns the \em l2 norm of \c *this avoiding undeflow and overflow.
-  * This version use a concatenation of hypot() calls, and it is very slow.
-  *
-  * \sa norm(), stableNorm()
-  */
-template<typename Derived>
-inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
-MatrixBase<Derived>::hypotNorm() const
-{
-  if(size()==1)
-    return numext::abs(coeff(0,0));
+ * This version use a concatenation of hypot() calls, and it is very slow.
+ *
+ * \sa norm(), stableNorm()
+ */
+template <typename Derived>
+inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real MatrixBase<Derived>::hypotNorm() const {
+  if (size() == 1)
+    return numext::abs(coeff(0, 0));
   else
     return this->cwiseAbs().redux(internal::scalar_hypot_op<RealScalar>());
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_STABLENORM_H
+#endif  // EIGEN_STABLENORM_H
diff --git a/Eigen/src/Core/StlIterators.h b/Eigen/src/Core/StlIterators.h
index 445199c..3ab7d21 100644
--- a/Eigen/src/Core/StlIterators.h
+++ b/Eigen/src/Core/StlIterators.h
@@ -17,101 +17,168 @@
 
 namespace internal {
 
-template<typename IteratorType>
+template <typename IteratorType>
 struct indexed_based_stl_iterator_traits;
 
-template<typename  Derived>
-class indexed_based_stl_iterator_base
-{
-protected:
+template <typename Derived>
+class indexed_based_stl_iterator_base {
+ protected:
   typedef indexed_based_stl_iterator_traits<Derived> traits;
   typedef typename traits::XprType XprType;
   typedef indexed_based_stl_iterator_base<typename traits::non_const_iterator> non_const_iterator;
   typedef indexed_based_stl_iterator_base<typename traits::const_iterator> const_iterator;
-  typedef std::conditional_t<internal::is_const<XprType>::value,non_const_iterator,const_iterator> other_iterator;
+  typedef std::conditional_t<internal::is_const<XprType>::value, non_const_iterator, const_iterator> other_iterator;
   // NOTE: in C++03 we cannot declare friend classes through typedefs because we need to write friend class:
   friend class indexed_based_stl_iterator_base<typename traits::const_iterator>;
   friend class indexed_based_stl_iterator_base<typename traits::non_const_iterator>;
-public:
+
+ public:
   typedef Index difference_type;
   typedef std::random_access_iterator_tag iterator_category;
 
   indexed_based_stl_iterator_base() EIGEN_NO_THROW : mp_xpr(0), m_index(0) {}
   indexed_based_stl_iterator_base(XprType& xpr, Index index) EIGEN_NO_THROW : mp_xpr(&xpr), m_index(index) {}
 
-  indexed_based_stl_iterator_base(const non_const_iterator& other) EIGEN_NO_THROW
-    : mp_xpr(other.mp_xpr), m_index(other.m_index)
-  {}
+  indexed_based_stl_iterator_base(const non_const_iterator& other) EIGEN_NO_THROW : mp_xpr(other.mp_xpr),
+                                                                                    m_index(other.m_index) {}
 
-  indexed_based_stl_iterator_base& operator=(const non_const_iterator& other)
-  {
+  indexed_based_stl_iterator_base& operator=(const non_const_iterator& other) {
     mp_xpr = other.mp_xpr;
     m_index = other.m_index;
     return *this;
   }
 
-  Derived& operator++() { ++m_index; return derived(); }
-  Derived& operator--() { --m_index; return derived(); }
+  Derived& operator++() {
+    ++m_index;
+    return derived();
+  }
+  Derived& operator--() {
+    --m_index;
+    return derived();
+  }
 
-  Derived operator++(int) { Derived prev(derived()); operator++(); return prev;}
-  Derived operator--(int) { Derived prev(derived()); operator--(); return prev;}
+  Derived operator++(int) {
+    Derived prev(derived());
+    operator++();
+    return prev;
+  }
+  Derived operator--(int) {
+    Derived prev(derived());
+    operator--();
+    return prev;
+  }
 
-  friend Derived operator+(const indexed_based_stl_iterator_base& a, Index b) { Derived ret(a.derived()); ret += b; return ret; }
-  friend Derived operator-(const indexed_based_stl_iterator_base& a, Index b) { Derived ret(a.derived()); ret -= b; return ret; }
-  friend Derived operator+(Index a, const indexed_based_stl_iterator_base& b) { Derived ret(b.derived()); ret += a; return ret; }
-  friend Derived operator-(Index a, const indexed_based_stl_iterator_base& b) { Derived ret(b.derived()); ret -= a; return ret; }
-  
-  Derived& operator+=(Index b) { m_index += b; return derived(); }
-  Derived& operator-=(Index b) { m_index -= b; return derived(); }
+  friend Derived operator+(const indexed_based_stl_iterator_base& a, Index b) {
+    Derived ret(a.derived());
+    ret += b;
+    return ret;
+  }
+  friend Derived operator-(const indexed_based_stl_iterator_base& a, Index b) {
+    Derived ret(a.derived());
+    ret -= b;
+    return ret;
+  }
+  friend Derived operator+(Index a, const indexed_based_stl_iterator_base& b) {
+    Derived ret(b.derived());
+    ret += a;
+    return ret;
+  }
+  friend Derived operator-(Index a, const indexed_based_stl_iterator_base& b) {
+    Derived ret(b.derived());
+    ret -= a;
+    return ret;
+  }
 
-  difference_type operator-(const indexed_based_stl_iterator_base& other) const
-  {
+  Derived& operator+=(Index b) {
+    m_index += b;
+    return derived();
+  }
+  Derived& operator-=(Index b) {
+    m_index -= b;
+    return derived();
+  }
+
+  difference_type operator-(const indexed_based_stl_iterator_base& other) const {
     eigen_assert(mp_xpr == other.mp_xpr);
     return m_index - other.m_index;
   }
 
-  difference_type operator-(const other_iterator& other) const
-  {
+  difference_type operator-(const other_iterator& other) const {
     eigen_assert(mp_xpr == other.mp_xpr);
     return m_index - other.m_index;
   }
 
-  bool operator==(const indexed_based_stl_iterator_base& other) const { eigen_assert(mp_xpr == other.mp_xpr); return m_index == other.m_index; }
-  bool operator!=(const indexed_based_stl_iterator_base& other) const { eigen_assert(mp_xpr == other.mp_xpr); return m_index != other.m_index; }
-  bool operator< (const indexed_based_stl_iterator_base& other) const { eigen_assert(mp_xpr == other.mp_xpr); return m_index <  other.m_index; }
-  bool operator<=(const indexed_based_stl_iterator_base& other) const { eigen_assert(mp_xpr == other.mp_xpr); return m_index <= other.m_index; }
-  bool operator> (const indexed_based_stl_iterator_base& other) const { eigen_assert(mp_xpr == other.mp_xpr); return m_index >  other.m_index; }
-  bool operator>=(const indexed_based_stl_iterator_base& other) const { eigen_assert(mp_xpr == other.mp_xpr); return m_index >= other.m_index; }
+  bool operator==(const indexed_based_stl_iterator_base& other) const {
+    eigen_assert(mp_xpr == other.mp_xpr);
+    return m_index == other.m_index;
+  }
+  bool operator!=(const indexed_based_stl_iterator_base& other) const {
+    eigen_assert(mp_xpr == other.mp_xpr);
+    return m_index != other.m_index;
+  }
+  bool operator<(const indexed_based_stl_iterator_base& other) const {
+    eigen_assert(mp_xpr == other.mp_xpr);
+    return m_index < other.m_index;
+  }
+  bool operator<=(const indexed_based_stl_iterator_base& other) const {
+    eigen_assert(mp_xpr == other.mp_xpr);
+    return m_index <= other.m_index;
+  }
+  bool operator>(const indexed_based_stl_iterator_base& other) const {
+    eigen_assert(mp_xpr == other.mp_xpr);
+    return m_index > other.m_index;
+  }
+  bool operator>=(const indexed_based_stl_iterator_base& other) const {
+    eigen_assert(mp_xpr == other.mp_xpr);
+    return m_index >= other.m_index;
+  }
 
-  bool operator==(const other_iterator& other) const { eigen_assert(mp_xpr == other.mp_xpr); return m_index == other.m_index; }
-  bool operator!=(const other_iterator& other) const { eigen_assert(mp_xpr == other.mp_xpr); return m_index != other.m_index; }
-  bool operator< (const other_iterator& other) const { eigen_assert(mp_xpr == other.mp_xpr); return m_index <  other.m_index; }
-  bool operator<=(const other_iterator& other) const { eigen_assert(mp_xpr == other.mp_xpr); return m_index <= other.m_index; }
-  bool operator> (const other_iterator& other) const { eigen_assert(mp_xpr == other.mp_xpr); return m_index >  other.m_index; }
-  bool operator>=(const other_iterator& other) const { eigen_assert(mp_xpr == other.mp_xpr); return m_index >= other.m_index; }
+  bool operator==(const other_iterator& other) const {
+    eigen_assert(mp_xpr == other.mp_xpr);
+    return m_index == other.m_index;
+  }
+  bool operator!=(const other_iterator& other) const {
+    eigen_assert(mp_xpr == other.mp_xpr);
+    return m_index != other.m_index;
+  }
+  bool operator<(const other_iterator& other) const {
+    eigen_assert(mp_xpr == other.mp_xpr);
+    return m_index < other.m_index;
+  }
+  bool operator<=(const other_iterator& other) const {
+    eigen_assert(mp_xpr == other.mp_xpr);
+    return m_index <= other.m_index;
+  }
+  bool operator>(const other_iterator& other) const {
+    eigen_assert(mp_xpr == other.mp_xpr);
+    return m_index > other.m_index;
+  }
+  bool operator>=(const other_iterator& other) const {
+    eigen_assert(mp_xpr == other.mp_xpr);
+    return m_index >= other.m_index;
+  }
 
-protected:
-
+ protected:
   Derived& derived() { return static_cast<Derived&>(*this); }
   const Derived& derived() const { return static_cast<const Derived&>(*this); }
 
-  XprType *mp_xpr;
+  XprType* mp_xpr;
   Index m_index;
 };
 
-template<typename  Derived>
-class indexed_based_stl_reverse_iterator_base
-{
-protected:
+template <typename Derived>
+class indexed_based_stl_reverse_iterator_base {
+ protected:
   typedef indexed_based_stl_iterator_traits<Derived> traits;
   typedef typename traits::XprType XprType;
   typedef indexed_based_stl_reverse_iterator_base<typename traits::non_const_iterator> non_const_iterator;
   typedef indexed_based_stl_reverse_iterator_base<typename traits::const_iterator> const_iterator;
-  typedef std::conditional_t<internal::is_const<XprType>::value,non_const_iterator,const_iterator> other_iterator;
+  typedef std::conditional_t<internal::is_const<XprType>::value, non_const_iterator, const_iterator> other_iterator;
   // NOTE: in C++03 we cannot declare friend classes through typedefs because we need to write friend class:
   friend class indexed_based_stl_reverse_iterator_base<typename traits::const_iterator>;
   friend class indexed_based_stl_reverse_iterator_base<typename traits::non_const_iterator>;
-public:
+
+ public:
   typedef Index difference_type;
   typedef std::random_access_iterator_tag iterator_category;
 
@@ -119,165 +186,259 @@
   indexed_based_stl_reverse_iterator_base(XprType& xpr, Index index) : mp_xpr(&xpr), m_index(index) {}
 
   indexed_based_stl_reverse_iterator_base(const non_const_iterator& other)
-    : mp_xpr(other.mp_xpr), m_index(other.m_index)
-  {}
+      : mp_xpr(other.mp_xpr), m_index(other.m_index) {}
 
-  indexed_based_stl_reverse_iterator_base& operator=(const non_const_iterator& other)
-  {
+  indexed_based_stl_reverse_iterator_base& operator=(const non_const_iterator& other) {
     mp_xpr = other.mp_xpr;
     m_index = other.m_index;
     return *this;
   }
 
-  Derived& operator++() { --m_index; return derived(); }
-  Derived& operator--() { ++m_index; return derived(); }
+  Derived& operator++() {
+    --m_index;
+    return derived();
+  }
+  Derived& operator--() {
+    ++m_index;
+    return derived();
+  }
 
-  Derived operator++(int) { Derived prev(derived()); operator++(); return prev;}
-  Derived operator--(int) { Derived prev(derived()); operator--(); return prev;}
+  Derived operator++(int) {
+    Derived prev(derived());
+    operator++();
+    return prev;
+  }
+  Derived operator--(int) {
+    Derived prev(derived());
+    operator--();
+    return prev;
+  }
 
-  friend Derived operator+(const indexed_based_stl_reverse_iterator_base& a, Index b) { Derived ret(a.derived()); ret += b; return ret; }
-  friend Derived operator-(const indexed_based_stl_reverse_iterator_base& a, Index b) { Derived ret(a.derived()); ret -= b; return ret; }
-  friend Derived operator+(Index a, const indexed_based_stl_reverse_iterator_base& b) { Derived ret(b.derived()); ret += a; return ret; }
-  friend Derived operator-(Index a, const indexed_based_stl_reverse_iterator_base& b) { Derived ret(b.derived()); ret -= a; return ret; }
-  
-  Derived& operator+=(Index b) { m_index -= b; return derived(); }
-  Derived& operator-=(Index b) { m_index += b; return derived(); }
+  friend Derived operator+(const indexed_based_stl_reverse_iterator_base& a, Index b) {
+    Derived ret(a.derived());
+    ret += b;
+    return ret;
+  }
+  friend Derived operator-(const indexed_based_stl_reverse_iterator_base& a, Index b) {
+    Derived ret(a.derived());
+    ret -= b;
+    return ret;
+  }
+  friend Derived operator+(Index a, const indexed_based_stl_reverse_iterator_base& b) {
+    Derived ret(b.derived());
+    ret += a;
+    return ret;
+  }
+  friend Derived operator-(Index a, const indexed_based_stl_reverse_iterator_base& b) {
+    Derived ret(b.derived());
+    ret -= a;
+    return ret;
+  }
 
-  difference_type operator-(const indexed_based_stl_reverse_iterator_base& other) const
-  {
+  Derived& operator+=(Index b) {
+    m_index -= b;
+    return derived();
+  }
+  Derived& operator-=(Index b) {
+    m_index += b;
+    return derived();
+  }
+
+  difference_type operator-(const indexed_based_stl_reverse_iterator_base& other) const {
     eigen_assert(mp_xpr == other.mp_xpr);
     return other.m_index - m_index;
   }
 
-  difference_type operator-(const other_iterator& other) const
-  {
+  difference_type operator-(const other_iterator& other) const {
     eigen_assert(mp_xpr == other.mp_xpr);
     return other.m_index - m_index;
   }
 
-  bool operator==(const indexed_based_stl_reverse_iterator_base& other) const { eigen_assert(mp_xpr == other.mp_xpr); return m_index == other.m_index; }
-  bool operator!=(const indexed_based_stl_reverse_iterator_base& other) const { eigen_assert(mp_xpr == other.mp_xpr); return m_index != other.m_index; }
-  bool operator< (const indexed_based_stl_reverse_iterator_base& other) const { eigen_assert(mp_xpr == other.mp_xpr); return m_index >  other.m_index; }
-  bool operator<=(const indexed_based_stl_reverse_iterator_base& other) const { eigen_assert(mp_xpr == other.mp_xpr); return m_index >= other.m_index; }
-  bool operator> (const indexed_based_stl_reverse_iterator_base& other) const { eigen_assert(mp_xpr == other.mp_xpr); return m_index <  other.m_index; }
-  bool operator>=(const indexed_based_stl_reverse_iterator_base& other) const { eigen_assert(mp_xpr == other.mp_xpr); return m_index <= other.m_index; }
+  bool operator==(const indexed_based_stl_reverse_iterator_base& other) const {
+    eigen_assert(mp_xpr == other.mp_xpr);
+    return m_index == other.m_index;
+  }
+  bool operator!=(const indexed_based_stl_reverse_iterator_base& other) const {
+    eigen_assert(mp_xpr == other.mp_xpr);
+    return m_index != other.m_index;
+  }
+  bool operator<(const indexed_based_stl_reverse_iterator_base& other) const {
+    eigen_assert(mp_xpr == other.mp_xpr);
+    return m_index > other.m_index;
+  }
+  bool operator<=(const indexed_based_stl_reverse_iterator_base& other) const {
+    eigen_assert(mp_xpr == other.mp_xpr);
+    return m_index >= other.m_index;
+  }
+  bool operator>(const indexed_based_stl_reverse_iterator_base& other) const {
+    eigen_assert(mp_xpr == other.mp_xpr);
+    return m_index < other.m_index;
+  }
+  bool operator>=(const indexed_based_stl_reverse_iterator_base& other) const {
+    eigen_assert(mp_xpr == other.mp_xpr);
+    return m_index <= other.m_index;
+  }
 
-  bool operator==(const other_iterator& other) const { eigen_assert(mp_xpr == other.mp_xpr); return m_index == other.m_index; }
-  bool operator!=(const other_iterator& other) const { eigen_assert(mp_xpr == other.mp_xpr); return m_index != other.m_index; }
-  bool operator< (const other_iterator& other) const { eigen_assert(mp_xpr == other.mp_xpr); return m_index >  other.m_index; }
-  bool operator<=(const other_iterator& other) const { eigen_assert(mp_xpr == other.mp_xpr); return m_index >= other.m_index; }
-  bool operator> (const other_iterator& other) const { eigen_assert(mp_xpr == other.mp_xpr); return m_index <  other.m_index; }
-  bool operator>=(const other_iterator& other) const { eigen_assert(mp_xpr == other.mp_xpr); return m_index <= other.m_index; }
+  bool operator==(const other_iterator& other) const {
+    eigen_assert(mp_xpr == other.mp_xpr);
+    return m_index == other.m_index;
+  }
+  bool operator!=(const other_iterator& other) const {
+    eigen_assert(mp_xpr == other.mp_xpr);
+    return m_index != other.m_index;
+  }
+  bool operator<(const other_iterator& other) const {
+    eigen_assert(mp_xpr == other.mp_xpr);
+    return m_index > other.m_index;
+  }
+  bool operator<=(const other_iterator& other) const {
+    eigen_assert(mp_xpr == other.mp_xpr);
+    return m_index >= other.m_index;
+  }
+  bool operator>(const other_iterator& other) const {
+    eigen_assert(mp_xpr == other.mp_xpr);
+    return m_index < other.m_index;
+  }
+  bool operator>=(const other_iterator& other) const {
+    eigen_assert(mp_xpr == other.mp_xpr);
+    return m_index <= other.m_index;
+  }
 
-protected:
-
+ protected:
   Derived& derived() { return static_cast<Derived&>(*this); }
   const Derived& derived() const { return static_cast<const Derived&>(*this); }
 
-  XprType *mp_xpr;
+  XprType* mp_xpr;
   Index m_index;
 };
 
-template<typename XprType>
-class pointer_based_stl_iterator
-{
-  enum { is_lvalue  = internal::is_lvalue<XprType>::value };
+template <typename XprType>
+class pointer_based_stl_iterator {
+  enum { is_lvalue = internal::is_lvalue<XprType>::value };
   typedef pointer_based_stl_iterator<std::remove_const_t<XprType>> non_const_iterator;
   typedef pointer_based_stl_iterator<std::add_const_t<XprType>> const_iterator;
-  typedef std::conditional_t<internal::is_const<XprType>::value,non_const_iterator,const_iterator> other_iterator;
+  typedef std::conditional_t<internal::is_const<XprType>::value, non_const_iterator, const_iterator> other_iterator;
   // NOTE: in C++03 we cannot declare friend classes through typedefs because we need to write friend class:
   friend class pointer_based_stl_iterator<std::add_const_t<XprType>>;
   friend class pointer_based_stl_iterator<std::remove_const_t<XprType>>;
-public:
+
+ public:
   typedef Index difference_type;
   typedef typename XprType::Scalar value_type;
   typedef std::random_access_iterator_tag iterator_category;
   typedef std::conditional_t<bool(is_lvalue), value_type*, const value_type*> pointer;
   typedef std::conditional_t<bool(is_lvalue), value_type&, const value_type&> reference;
 
-
   pointer_based_stl_iterator() EIGEN_NO_THROW : m_ptr(0) {}
-  pointer_based_stl_iterator(XprType& xpr, Index index) EIGEN_NO_THROW : m_incr(xpr.innerStride())
-  {
+  pointer_based_stl_iterator(XprType& xpr, Index index) EIGEN_NO_THROW : m_incr(xpr.innerStride()) {
     m_ptr = xpr.data() + index * m_incr.value();
   }
 
-  pointer_based_stl_iterator(const non_const_iterator& other) EIGEN_NO_THROW
-    : m_ptr(other.m_ptr), m_incr(other.m_incr)
-  {}
+  pointer_based_stl_iterator(const non_const_iterator& other) EIGEN_NO_THROW : m_ptr(other.m_ptr),
+                                                                               m_incr(other.m_incr) {}
 
-  pointer_based_stl_iterator& operator=(const non_const_iterator& other) EIGEN_NO_THROW
-  {
+  pointer_based_stl_iterator& operator=(const non_const_iterator& other) EIGEN_NO_THROW {
     m_ptr = other.m_ptr;
     m_incr.setValue(other.m_incr);
     return *this;
   }
 
-  reference operator*()         const { return *m_ptr;   }
-  reference operator[](Index i) const { return *(m_ptr+i*m_incr.value()); }
-  pointer   operator->()        const { return m_ptr;    }
+  reference operator*() const { return *m_ptr; }
+  reference operator[](Index i) const { return *(m_ptr + i * m_incr.value()); }
+  pointer operator->() const { return m_ptr; }
 
-  pointer_based_stl_iterator& operator++() { m_ptr += m_incr.value(); return *this; }
-  pointer_based_stl_iterator& operator--() { m_ptr -= m_incr.value(); return *this; }
+  pointer_based_stl_iterator& operator++() {
+    m_ptr += m_incr.value();
+    return *this;
+  }
+  pointer_based_stl_iterator& operator--() {
+    m_ptr -= m_incr.value();
+    return *this;
+  }
 
-  pointer_based_stl_iterator operator++(int) { pointer_based_stl_iterator prev(*this); operator++(); return prev;}
-  pointer_based_stl_iterator operator--(int) { pointer_based_stl_iterator prev(*this); operator--(); return prev;}
+  pointer_based_stl_iterator operator++(int) {
+    pointer_based_stl_iterator prev(*this);
+    operator++();
+    return prev;
+  }
+  pointer_based_stl_iterator operator--(int) {
+    pointer_based_stl_iterator prev(*this);
+    operator--();
+    return prev;
+  }
 
-  friend pointer_based_stl_iterator operator+(const pointer_based_stl_iterator& a, Index b) { pointer_based_stl_iterator ret(a); ret += b; return ret; }
-  friend pointer_based_stl_iterator operator-(const pointer_based_stl_iterator& a, Index b) { pointer_based_stl_iterator ret(a); ret -= b; return ret; }
-  friend pointer_based_stl_iterator operator+(Index a, const pointer_based_stl_iterator& b) { pointer_based_stl_iterator ret(b); ret += a; return ret; }
-  friend pointer_based_stl_iterator operator-(Index a, const pointer_based_stl_iterator& b) { pointer_based_stl_iterator ret(b); ret -= a; return ret; }
-  
-  pointer_based_stl_iterator& operator+=(Index b) { m_ptr += b*m_incr.value(); return *this; }
-  pointer_based_stl_iterator& operator-=(Index b) { m_ptr -= b*m_incr.value(); return *this; }
+  friend pointer_based_stl_iterator operator+(const pointer_based_stl_iterator& a, Index b) {
+    pointer_based_stl_iterator ret(a);
+    ret += b;
+    return ret;
+  }
+  friend pointer_based_stl_iterator operator-(const pointer_based_stl_iterator& a, Index b) {
+    pointer_based_stl_iterator ret(a);
+    ret -= b;
+    return ret;
+  }
+  friend pointer_based_stl_iterator operator+(Index a, const pointer_based_stl_iterator& b) {
+    pointer_based_stl_iterator ret(b);
+    ret += a;
+    return ret;
+  }
+  friend pointer_based_stl_iterator operator-(Index a, const pointer_based_stl_iterator& b) {
+    pointer_based_stl_iterator ret(b);
+    ret -= a;
+    return ret;
+  }
+
+  pointer_based_stl_iterator& operator+=(Index b) {
+    m_ptr += b * m_incr.value();
+    return *this;
+  }
+  pointer_based_stl_iterator& operator-=(Index b) {
+    m_ptr -= b * m_incr.value();
+    return *this;
+  }
 
   difference_type operator-(const pointer_based_stl_iterator& other) const {
-    return (m_ptr - other.m_ptr)/m_incr.value();
+    return (m_ptr - other.m_ptr) / m_incr.value();
   }
 
-  difference_type operator-(const other_iterator& other) const {
-    return (m_ptr - other.m_ptr)/m_incr.value();
-  }
+  difference_type operator-(const other_iterator& other) const { return (m_ptr - other.m_ptr) / m_incr.value(); }
 
   bool operator==(const pointer_based_stl_iterator& other) const { return m_ptr == other.m_ptr; }
   bool operator!=(const pointer_based_stl_iterator& other) const { return m_ptr != other.m_ptr; }
-  bool operator< (const pointer_based_stl_iterator& other) const { return m_ptr <  other.m_ptr; }
+  bool operator<(const pointer_based_stl_iterator& other) const { return m_ptr < other.m_ptr; }
   bool operator<=(const pointer_based_stl_iterator& other) const { return m_ptr <= other.m_ptr; }
-  bool operator> (const pointer_based_stl_iterator& other) const { return m_ptr >  other.m_ptr; }
+  bool operator>(const pointer_based_stl_iterator& other) const { return m_ptr > other.m_ptr; }
   bool operator>=(const pointer_based_stl_iterator& other) const { return m_ptr >= other.m_ptr; }
 
   bool operator==(const other_iterator& other) const { return m_ptr == other.m_ptr; }
   bool operator!=(const other_iterator& other) const { return m_ptr != other.m_ptr; }
-  bool operator< (const other_iterator& other) const { return m_ptr <  other.m_ptr; }
+  bool operator<(const other_iterator& other) const { return m_ptr < other.m_ptr; }
   bool operator<=(const other_iterator& other) const { return m_ptr <= other.m_ptr; }
-  bool operator> (const other_iterator& other) const { return m_ptr >  other.m_ptr; }
+  bool operator>(const other_iterator& other) const { return m_ptr > other.m_ptr; }
   bool operator>=(const other_iterator& other) const { return m_ptr >= other.m_ptr; }
 
-protected:
-
+ protected:
   pointer m_ptr;
   internal::variable_if_dynamic<Index, XprType::InnerStrideAtCompileTime> m_incr;
 };
 
-template<typename XprType_>
-struct indexed_based_stl_iterator_traits<generic_randaccess_stl_iterator<XprType_> >
-{
+template <typename XprType_>
+struct indexed_based_stl_iterator_traits<generic_randaccess_stl_iterator<XprType_>> {
   typedef XprType_ XprType;
   typedef generic_randaccess_stl_iterator<std::remove_const_t<XprType>> non_const_iterator;
   typedef generic_randaccess_stl_iterator<std::add_const_t<XprType>> const_iterator;
 };
 
-template<typename XprType>
-class generic_randaccess_stl_iterator : public indexed_based_stl_iterator_base<generic_randaccess_stl_iterator<XprType> >
-{
-public:
+template <typename XprType>
+class generic_randaccess_stl_iterator
+    : public indexed_based_stl_iterator_base<generic_randaccess_stl_iterator<XprType>> {
+ public:
   typedef typename XprType::Scalar value_type;
 
-protected:
-
+ protected:
   enum {
     has_direct_access = (internal::traits<XprType>::Flags & DirectAccessBit) ? 1 : 0,
-    is_lvalue  = internal::is_lvalue<XprType>::value
+    is_lvalue = internal::is_lvalue<XprType>::value
   };
 
   typedef indexed_based_stl_iterator_base<generic_randaccess_stl_iterator> Base;
@@ -286,181 +447,168 @@
 
   // TODO currently const Transpose/Reshape expressions never returns const references,
   // so lets return by value too.
-  //typedef std::conditional_t<bool(has_direct_access), const value_type&, const value_type> read_only_ref_t;
+  // typedef std::conditional_t<bool(has_direct_access), const value_type&, const value_type> read_only_ref_t;
   typedef const value_type read_only_ref_t;
 
-public:
-  
-  typedef std::conditional_t<bool(is_lvalue), value_type *, const value_type *> pointer;
+ public:
+  typedef std::conditional_t<bool(is_lvalue), value_type*, const value_type*> pointer;
   typedef std::conditional_t<bool(is_lvalue), value_type&, read_only_ref_t> reference;
-  
+
   generic_randaccess_stl_iterator() : Base() {}
-  generic_randaccess_stl_iterator(XprType& xpr, Index index) : Base(xpr,index) {}
+  generic_randaccess_stl_iterator(XprType& xpr, Index index) : Base(xpr, index) {}
   generic_randaccess_stl_iterator(const typename Base::non_const_iterator& other) : Base(other) {}
   using Base::operator=;
 
-  reference operator*()         const { return   (*mp_xpr)(m_index);   }
-  reference operator[](Index i) const { return   (*mp_xpr)(m_index+i); }
-  pointer   operator->()        const { return &((*mp_xpr)(m_index)); }
+  reference operator*() const { return (*mp_xpr)(m_index); }
+  reference operator[](Index i) const { return (*mp_xpr)(m_index + i); }
+  pointer operator->() const { return &((*mp_xpr)(m_index)); }
 };
 
-template<typename XprType_, DirectionType Direction>
-struct indexed_based_stl_iterator_traits<subvector_stl_iterator<XprType_,Direction> >
-{
+template <typename XprType_, DirectionType Direction>
+struct indexed_based_stl_iterator_traits<subvector_stl_iterator<XprType_, Direction>> {
   typedef XprType_ XprType;
   typedef subvector_stl_iterator<std::remove_const_t<XprType>, Direction> non_const_iterator;
   typedef subvector_stl_iterator<std::add_const_t<XprType>, Direction> const_iterator;
 };
 
-template<typename XprType, DirectionType Direction>
-class subvector_stl_iterator : public indexed_based_stl_iterator_base<subvector_stl_iterator<XprType,Direction> >
-{
-protected:
-
-  enum { is_lvalue  = internal::is_lvalue<XprType>::value };
+template <typename XprType, DirectionType Direction>
+class subvector_stl_iterator : public indexed_based_stl_iterator_base<subvector_stl_iterator<XprType, Direction>> {
+ protected:
+  enum { is_lvalue = internal::is_lvalue<XprType>::value };
 
   typedef indexed_based_stl_iterator_base<subvector_stl_iterator> Base;
   using Base::m_index;
   using Base::mp_xpr;
 
-  typedef std::conditional_t<Direction==Vertical,typename XprType::ColXpr,typename XprType::RowXpr> SubVectorType;
-  typedef std::conditional_t<Direction==Vertical,typename XprType::ConstColXpr,typename XprType::ConstRowXpr> ConstSubVectorType;
+  typedef std::conditional_t<Direction == Vertical, typename XprType::ColXpr, typename XprType::RowXpr> SubVectorType;
+  typedef std::conditional_t<Direction == Vertical, typename XprType::ConstColXpr, typename XprType::ConstRowXpr>
+      ConstSubVectorType;
 
-
-public:
+ public:
   typedef std::conditional_t<bool(is_lvalue), SubVectorType, ConstSubVectorType> reference;
   typedef typename reference::PlainObject value_type;
 
-private:
-  class subvector_stl_iterator_ptr
-  {
-  public:
-      subvector_stl_iterator_ptr(const reference &subvector) : m_subvector(subvector) {}
-      reference* operator->() { return &m_subvector; }
-  private:
-      reference m_subvector;
+ private:
+  class subvector_stl_iterator_ptr {
+   public:
+    subvector_stl_iterator_ptr(const reference& subvector) : m_subvector(subvector) {}
+    reference* operator->() { return &m_subvector; }
+
+   private:
+    reference m_subvector;
   };
-public:
 
+ public:
   typedef subvector_stl_iterator_ptr pointer;
-  
-  subvector_stl_iterator() : Base() {}
-  subvector_stl_iterator(XprType& xpr, Index index) : Base(xpr,index) {}
 
-  reference operator*()         const { return (*mp_xpr).template subVector<Direction>(m_index); }
-  reference operator[](Index i) const { return (*mp_xpr).template subVector<Direction>(m_index+i); }
-  pointer   operator->()        const { return (*mp_xpr).template subVector<Direction>(m_index); }
+  subvector_stl_iterator() : Base() {}
+  subvector_stl_iterator(XprType& xpr, Index index) : Base(xpr, index) {}
+
+  reference operator*() const { return (*mp_xpr).template subVector<Direction>(m_index); }
+  reference operator[](Index i) const { return (*mp_xpr).template subVector<Direction>(m_index + i); }
+  pointer operator->() const { return (*mp_xpr).template subVector<Direction>(m_index); }
 };
 
-template<typename XprType_, DirectionType Direction>
-struct indexed_based_stl_iterator_traits<subvector_stl_reverse_iterator<XprType_,Direction> >
-{
+template <typename XprType_, DirectionType Direction>
+struct indexed_based_stl_iterator_traits<subvector_stl_reverse_iterator<XprType_, Direction>> {
   typedef XprType_ XprType;
   typedef subvector_stl_reverse_iterator<std::remove_const_t<XprType>, Direction> non_const_iterator;
   typedef subvector_stl_reverse_iterator<std::add_const_t<XprType>, Direction> const_iterator;
 };
 
-template<typename XprType, DirectionType Direction>
-class subvector_stl_reverse_iterator : public indexed_based_stl_reverse_iterator_base<subvector_stl_reverse_iterator<XprType,Direction> >
-{
-protected:
-
-  enum { is_lvalue  = internal::is_lvalue<XprType>::value };
+template <typename XprType, DirectionType Direction>
+class subvector_stl_reverse_iterator
+    : public indexed_based_stl_reverse_iterator_base<subvector_stl_reverse_iterator<XprType, Direction>> {
+ protected:
+  enum { is_lvalue = internal::is_lvalue<XprType>::value };
 
   typedef indexed_based_stl_reverse_iterator_base<subvector_stl_reverse_iterator> Base;
   using Base::m_index;
   using Base::mp_xpr;
 
-  typedef std::conditional_t<Direction==Vertical,typename XprType::ColXpr,typename XprType::RowXpr> SubVectorType;
-  typedef std::conditional_t<Direction==Vertical,typename XprType::ConstColXpr,typename XprType::ConstRowXpr> ConstSubVectorType;
+  typedef std::conditional_t<Direction == Vertical, typename XprType::ColXpr, typename XprType::RowXpr> SubVectorType;
+  typedef std::conditional_t<Direction == Vertical, typename XprType::ConstColXpr, typename XprType::ConstRowXpr>
+      ConstSubVectorType;
 
-
-public:
+ public:
   typedef std::conditional_t<bool(is_lvalue), SubVectorType, ConstSubVectorType> reference;
   typedef typename reference::PlainObject value_type;
 
-private:
-  class subvector_stl_reverse_iterator_ptr
-  {
-  public:
-      subvector_stl_reverse_iterator_ptr(const reference &subvector) : m_subvector(subvector) {}
-      reference* operator->() { return &m_subvector; }
-  private:
-      reference m_subvector;
+ private:
+  class subvector_stl_reverse_iterator_ptr {
+   public:
+    subvector_stl_reverse_iterator_ptr(const reference& subvector) : m_subvector(subvector) {}
+    reference* operator->() { return &m_subvector; }
+
+   private:
+    reference m_subvector;
   };
-public:
 
+ public:
   typedef subvector_stl_reverse_iterator_ptr pointer;
-  
-  subvector_stl_reverse_iterator() : Base() {}
-  subvector_stl_reverse_iterator(XprType& xpr, Index index) : Base(xpr,index) {}
 
-  reference operator*()         const { return (*mp_xpr).template subVector<Direction>(m_index); }
-  reference operator[](Index i) const { return (*mp_xpr).template subVector<Direction>(m_index+i); }
-  pointer   operator->()        const { return (*mp_xpr).template subVector<Direction>(m_index); }
+  subvector_stl_reverse_iterator() : Base() {}
+  subvector_stl_reverse_iterator(XprType& xpr, Index index) : Base(xpr, index) {}
+
+  reference operator*() const { return (*mp_xpr).template subVector<Direction>(m_index); }
+  reference operator[](Index i) const { return (*mp_xpr).template subVector<Direction>(m_index + i); }
+  pointer operator->() const { return (*mp_xpr).template subVector<Direction>(m_index); }
 };
 
-} // namespace internal
-
+}  // namespace internal
 
 /** returns an iterator to the first element of the 1D vector or array
-  * \only_for_vectors
-  * \sa end(), cbegin()
-  */
-template<typename Derived>
-inline typename DenseBase<Derived>::iterator DenseBase<Derived>::begin()
-{
+ * \only_for_vectors
+ * \sa end(), cbegin()
+ */
+template <typename Derived>
+inline typename DenseBase<Derived>::iterator DenseBase<Derived>::begin() {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
   return iterator(derived(), 0);
 }
 
 /** const version of begin() */
-template<typename Derived>
-inline typename DenseBase<Derived>::const_iterator DenseBase<Derived>::begin() const
-{
+template <typename Derived>
+inline typename DenseBase<Derived>::const_iterator DenseBase<Derived>::begin() const {
   return cbegin();
 }
 
 /** returns a read-only const_iterator to the first element of the 1D vector or array
-  * \only_for_vectors
-  * \sa cend(), begin()
-  */
-template<typename Derived>
-inline typename DenseBase<Derived>::const_iterator DenseBase<Derived>::cbegin() const
-{
+ * \only_for_vectors
+ * \sa cend(), begin()
+ */
+template <typename Derived>
+inline typename DenseBase<Derived>::const_iterator DenseBase<Derived>::cbegin() const {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
   return const_iterator(derived(), 0);
 }
 
 /** returns an iterator to the element following the last element of the 1D vector or array
-  * \only_for_vectors
-  * \sa begin(), cend()
-  */
-template<typename Derived>
-inline typename DenseBase<Derived>::iterator DenseBase<Derived>::end()
-{
+ * \only_for_vectors
+ * \sa begin(), cend()
+ */
+template <typename Derived>
+inline typename DenseBase<Derived>::iterator DenseBase<Derived>::end() {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
   return iterator(derived(), size());
 }
 
 /** const version of end() */
-template<typename Derived>
-inline typename DenseBase<Derived>::const_iterator DenseBase<Derived>::end() const
-{
+template <typename Derived>
+inline typename DenseBase<Derived>::const_iterator DenseBase<Derived>::end() const {
   return cend();
 }
 
 /** returns a read-only const_iterator to the element following the last element of the 1D vector or array
-  * \only_for_vectors
-  * \sa begin(), cend()
-  */
-template<typename Derived>
-inline typename DenseBase<Derived>::const_iterator DenseBase<Derived>::cend() const
-{
+ * \only_for_vectors
+ * \sa begin(), cend()
+ */
+template <typename Derived>
+inline typename DenseBase<Derived>::const_iterator DenseBase<Derived>::cend() const {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
   return const_iterator(derived(), size());
 }
 
-} // namespace Eigen
+}  // namespace Eigen
 
-#endif // EIGEN_STLITERATORS_H
+#endif  // EIGEN_STLITERATORS_H
diff --git a/Eigen/src/Core/Stride.h b/Eigen/src/Core/Stride.h
index 31c7002..a8fdeaf 100644
--- a/Eigen/src/Core/Stride.h
+++ b/Eigen/src/Core/Stride.h
@@ -16,108 +16,92 @@
 namespace Eigen {
 
 /** \class Stride
-  * \ingroup Core_Module
-  *
-  * \brief Holds strides information for Map
-  *
-  * This class holds the strides information for mapping arrays with strides with class Map.
-  *
-  * It holds two values: the inner stride and the outer stride.
-  *
-  * The inner stride is the pointer increment between two consecutive entries within a given row of a
-  * row-major matrix or within a given column of a column-major matrix.
-  *
-  * The outer stride is the pointer increment between two consecutive rows of a row-major matrix or
-  * between two consecutive columns of a column-major matrix.
-  *
-  * These two values can be passed either at compile-time as template parameters, or at runtime as
-  * arguments to the constructor.
-  *
-  * Indeed, this class takes two template parameters:
-  *  \tparam OuterStrideAtCompileTime_ the outer stride, or Dynamic if you want to specify it at runtime.
-  *  \tparam InnerStrideAtCompileTime_ the inner stride, or Dynamic if you want to specify it at runtime.
-  *
-  * Here is an example:
-  * \include Map_general_stride.cpp
-  * Output: \verbinclude Map_general_stride.out
-  *
-  * Both strides can be negative. However, a negative stride of -1 cannot be specified at compile time
-  * because of the ambiguity with Dynamic which is defined to -1 (historically, negative strides were
-  * not allowed).
-  *
-  * Note that for compile-time vectors (ColsAtCompileTime==1 or RowsAtCompile==1),
-  * the inner stride is the pointer increment between two consecutive elements,
-  * regardless of storage layout.
-  *
-  * \sa class InnerStride, class OuterStride, \ref TopicStorageOrders
-  */
-template<int OuterStrideAtCompileTime_, int InnerStrideAtCompileTime_>
-class Stride
-{
-  public:
-    typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3
-    enum {
-      InnerStrideAtCompileTime = InnerStrideAtCompileTime_,
-      OuterStrideAtCompileTime = OuterStrideAtCompileTime_
-    };
+ * \ingroup Core_Module
+ *
+ * \brief Holds strides information for Map
+ *
+ * This class holds the strides information for mapping arrays with strides with class Map.
+ *
+ * It holds two values: the inner stride and the outer stride.
+ *
+ * The inner stride is the pointer increment between two consecutive entries within a given row of a
+ * row-major matrix or within a given column of a column-major matrix.
+ *
+ * The outer stride is the pointer increment between two consecutive rows of a row-major matrix or
+ * between two consecutive columns of a column-major matrix.
+ *
+ * These two values can be passed either at compile-time as template parameters, or at runtime as
+ * arguments to the constructor.
+ *
+ * Indeed, this class takes two template parameters:
+ *  \tparam OuterStrideAtCompileTime_ the outer stride, or Dynamic if you want to specify it at runtime.
+ *  \tparam InnerStrideAtCompileTime_ the inner stride, or Dynamic if you want to specify it at runtime.
+ *
+ * Here is an example:
+ * \include Map_general_stride.cpp
+ * Output: \verbinclude Map_general_stride.out
+ *
+ * Both strides can be negative. However, a negative stride of -1 cannot be specified at compile time
+ * because of the ambiguity with Dynamic which is defined to -1 (historically, negative strides were
+ * not allowed).
+ *
+ * Note that for compile-time vectors (ColsAtCompileTime==1 or RowsAtCompile==1),
+ * the inner stride is the pointer increment between two consecutive elements,
+ * regardless of storage layout.
+ *
+ * \sa class InnerStride, class OuterStride, \ref TopicStorageOrders
+ */
+template <int OuterStrideAtCompileTime_, int InnerStrideAtCompileTime_>
+class Stride {
+ public:
+  typedef Eigen::Index Index;  ///< \deprecated since Eigen 3.3
+  enum { InnerStrideAtCompileTime = InnerStrideAtCompileTime_, OuterStrideAtCompileTime = OuterStrideAtCompileTime_ };
 
-    /** Default constructor, for use when strides are fixed at compile time */
-    EIGEN_DEVICE_FUNC
-    Stride()
-      : m_outer(OuterStrideAtCompileTime), m_inner(InnerStrideAtCompileTime)
-    {
-      // FIXME: for Eigen 4 we should use DynamicIndex instead of Dynamic.
-      // FIXME: for Eigen 4 we should also unify this API with fix<>
-      eigen_assert(InnerStrideAtCompileTime != Dynamic && OuterStrideAtCompileTime != Dynamic);
-    }
+  /** Default constructor, for use when strides are fixed at compile time */
+  EIGEN_DEVICE_FUNC Stride() : m_outer(OuterStrideAtCompileTime), m_inner(InnerStrideAtCompileTime) {
+    // FIXME: for Eigen 4 we should use DynamicIndex instead of Dynamic.
+    // FIXME: for Eigen 4 we should also unify this API with fix<>
+    eigen_assert(InnerStrideAtCompileTime != Dynamic && OuterStrideAtCompileTime != Dynamic);
+  }
 
-    /** Constructor allowing to pass the strides at runtime */
-    EIGEN_DEVICE_FUNC
-    Stride(Index outerStride, Index innerStride)
-      : m_outer(outerStride), m_inner(innerStride)
-    {
-    }
+  /** Constructor allowing to pass the strides at runtime */
+  EIGEN_DEVICE_FUNC Stride(Index outerStride, Index innerStride) : m_outer(outerStride), m_inner(innerStride) {}
 
-    /** Copy constructor */
-    EIGEN_DEVICE_FUNC
-    Stride(const Stride& other)
-      : m_outer(other.outer()), m_inner(other.inner())
-    {}
+  /** Copy constructor */
+  EIGEN_DEVICE_FUNC Stride(const Stride& other) : m_outer(other.outer()), m_inner(other.inner()) {}
 
-    /** \returns the outer stride */
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index outer() const { return m_outer.value(); }
-    /** \returns the inner stride */
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index inner() const { return m_inner.value(); }
+  /** \returns the outer stride */
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index outer() const { return m_outer.value(); }
+  /** \returns the inner stride */
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index inner() const { return m_inner.value(); }
 
-  protected:
-    internal::variable_if_dynamic<Index, OuterStrideAtCompileTime> m_outer;
-    internal::variable_if_dynamic<Index, InnerStrideAtCompileTime> m_inner;
+ protected:
+  internal::variable_if_dynamic<Index, OuterStrideAtCompileTime> m_outer;
+  internal::variable_if_dynamic<Index, InnerStrideAtCompileTime> m_inner;
 };
 
 /** \brief Convenience specialization of Stride to specify only an inner stride
-  * See class Map for some examples */
-template<int Value>
-class InnerStride : public Stride<0, Value>
-{
-    typedef Stride<0, Value> Base;
-  public:
-    EIGEN_DEVICE_FUNC InnerStride() : Base() {}
-    EIGEN_DEVICE_FUNC InnerStride(Index v) : Base(0, v) {} // FIXME making this explicit could break valid code
+ * See class Map for some examples */
+template <int Value>
+class InnerStride : public Stride<0, Value> {
+  typedef Stride<0, Value> Base;
+
+ public:
+  EIGEN_DEVICE_FUNC InnerStride() : Base() {}
+  EIGEN_DEVICE_FUNC InnerStride(Index v) : Base(0, v) {}  // FIXME making this explicit could break valid code
 };
 
 /** \brief Convenience specialization of Stride to specify only an outer stride
-  * See class Map for some examples */
-template<int Value>
-class OuterStride : public Stride<Value, 0>
-{
-    typedef Stride<Value, 0> Base;
-  public:
-    EIGEN_DEVICE_FUNC OuterStride() : Base() {}
-    EIGEN_DEVICE_FUNC OuterStride(Index v) : Base(v,0) {} // FIXME making this explicit could break valid code
+ * See class Map for some examples */
+template <int Value>
+class OuterStride : public Stride<Value, 0> {
+  typedef Stride<Value, 0> Base;
+
+ public:
+  EIGEN_DEVICE_FUNC OuterStride() : Base() {}
+  EIGEN_DEVICE_FUNC OuterStride(Index v) : Base(v, 0) {}  // FIXME making this explicit could break valid code
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_STRIDE_H
+#endif  // EIGEN_STRIDE_H
diff --git a/Eigen/src/Core/Swap.h b/Eigen/src/Core/Swap.h
index fd67963..d417c1a 100644
--- a/Eigen/src/Core/Swap.h
+++ b/Eigen/src/Core/Swap.h
@@ -13,59 +13,62 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
 // Overload default assignPacket behavior for swapping them
-template<typename DstEvaluatorTypeT, typename SrcEvaluatorTypeT>
-class generic_dense_assignment_kernel<DstEvaluatorTypeT, SrcEvaluatorTypeT, swap_assign_op<typename DstEvaluatorTypeT::Scalar>, Specialized>
- : public generic_dense_assignment_kernel<DstEvaluatorTypeT, SrcEvaluatorTypeT, swap_assign_op<typename DstEvaluatorTypeT::Scalar>, BuiltIn>
-{
-protected:
-  typedef generic_dense_assignment_kernel<DstEvaluatorTypeT, SrcEvaluatorTypeT, swap_assign_op<typename DstEvaluatorTypeT::Scalar>, BuiltIn> Base;
+template <typename DstEvaluatorTypeT, typename SrcEvaluatorTypeT>
+class generic_dense_assignment_kernel<DstEvaluatorTypeT, SrcEvaluatorTypeT,
+                                      swap_assign_op<typename DstEvaluatorTypeT::Scalar>, Specialized>
+    : public generic_dense_assignment_kernel<DstEvaluatorTypeT, SrcEvaluatorTypeT,
+                                             swap_assign_op<typename DstEvaluatorTypeT::Scalar>, BuiltIn> {
+ protected:
+  typedef generic_dense_assignment_kernel<DstEvaluatorTypeT, SrcEvaluatorTypeT,
+                                          swap_assign_op<typename DstEvaluatorTypeT::Scalar>, BuiltIn>
+      Base;
   using Base::m_dst;
-  using Base::m_src;
   using Base::m_functor;
-  
-public:
+  using Base::m_src;
+
+ public:
   typedef typename Base::Scalar Scalar;
   typedef typename Base::DstXprType DstXprType;
   typedef swap_assign_op<Scalar> Functor;
-  
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  generic_dense_assignment_kernel(DstEvaluatorTypeT &dst, const SrcEvaluatorTypeT &src, const Functor &func, DstXprType& dstExpr)
-    : Base(dst, src, func, dstExpr)
-  {}
-  
-  template<int StoreMode, int LoadMode, typename PacketType>
-  EIGEN_STRONG_INLINE void assignPacket(Index row, Index col)
-  {
-    PacketType tmp = m_src.template packet<LoadMode,PacketType>(row,col);
-    const_cast<SrcEvaluatorTypeT&>(m_src).template writePacket<LoadMode>(row,col, m_dst.template packet<StoreMode,PacketType>(row,col));
-    m_dst.template writePacket<StoreMode>(row,col,tmp);
+
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE generic_dense_assignment_kernel(DstEvaluatorTypeT &dst,
+                                                                        const SrcEvaluatorTypeT &src,
+                                                                        const Functor &func, DstXprType &dstExpr)
+      : Base(dst, src, func, dstExpr) {}
+
+  template <int StoreMode, int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE void assignPacket(Index row, Index col) {
+    PacketType tmp = m_src.template packet<LoadMode, PacketType>(row, col);
+    const_cast<SrcEvaluatorTypeT &>(m_src).template writePacket<LoadMode>(
+        row, col, m_dst.template packet<StoreMode, PacketType>(row, col));
+    m_dst.template writePacket<StoreMode>(row, col, tmp);
   }
-  
-  template<int StoreMode, int LoadMode, typename PacketType>
-  EIGEN_STRONG_INLINE void assignPacket(Index index)
-  {
-    PacketType tmp = m_src.template packet<LoadMode,PacketType>(index);
-    const_cast<SrcEvaluatorTypeT&>(m_src).template writePacket<LoadMode>(index, m_dst.template packet<StoreMode,PacketType>(index));
-    m_dst.template writePacket<StoreMode>(index,tmp);
+
+  template <int StoreMode, int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE void assignPacket(Index index) {
+    PacketType tmp = m_src.template packet<LoadMode, PacketType>(index);
+    const_cast<SrcEvaluatorTypeT &>(m_src).template writePacket<LoadMode>(
+        index, m_dst.template packet<StoreMode, PacketType>(index));
+    m_dst.template writePacket<StoreMode>(index, tmp);
   }
-  
-  // TODO find a simple way not to have to copy/paste this function from generic_dense_assignment_kernel, by simple I mean no CRTP (Gael)
-  template<int StoreMode, int LoadMode, typename PacketType>
-  EIGEN_STRONG_INLINE void assignPacketByOuterInner(Index outer, Index inner)
-  {
-    Index row = Base::rowIndexByOuterInner(outer, inner); 
+
+  // TODO find a simple way not to have to copy/paste this function from generic_dense_assignment_kernel, by simple I
+  // mean no CRTP (Gael)
+  template <int StoreMode, int LoadMode, typename PacketType>
+  EIGEN_STRONG_INLINE void assignPacketByOuterInner(Index outer, Index inner) {
+    Index row = Base::rowIndexByOuterInner(outer, inner);
     Index col = Base::colIndexByOuterInner(outer, inner);
-    assignPacket<StoreMode,LoadMode,PacketType>(row, col);
+    assignPacket<StoreMode, LoadMode, PacketType>(row, col);
   }
 };
 
-} // namespace internal
+}  // namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SWAP_H
+#endif  // EIGEN_SWAP_H
diff --git a/Eigen/src/Core/Transpose.h b/Eigen/src/Core/Transpose.h
index 89b011b..1cc7a28 100644
--- a/Eigen/src/Core/Transpose.h
+++ b/Eigen/src/Core/Transpose.h
@@ -17,9 +17,8 @@
 namespace Eigen {
 
 namespace internal {
-template<typename MatrixType>
-struct traits<Transpose<MatrixType> > : public traits<MatrixType>
-{
+template <typename MatrixType>
+struct traits<Transpose<MatrixType> > : public traits<MatrixType> {
   typedef typename ref_selector<MatrixType>::type MatrixTypeNested;
   typedef std::remove_reference_t<MatrixTypeNested> MatrixTypeNestedPlain;
   enum {
@@ -35,234 +34,205 @@
     OuterStrideAtCompileTime = outer_stride_at_compile_time<MatrixType>::ret
   };
 };
-}
+}  // namespace internal
 
-template<typename MatrixType, typename StorageKind> class TransposeImpl;
+template <typename MatrixType, typename StorageKind>
+class TransposeImpl;
 
 /** \class Transpose
-  * \ingroup Core_Module
-  *
-  * \brief Expression of the transpose of a matrix
-  *
-  * \tparam MatrixType the type of the object of which we are taking the transpose
-  *
-  * This class represents an expression of the transpose of a matrix.
-  * It is the return type of MatrixBase::transpose() and MatrixBase::adjoint()
-  * and most of the time this is the only way it is used.
-  *
-  * \sa MatrixBase::transpose(), MatrixBase::adjoint()
-  */
-template<typename MatrixType> class Transpose
-  : public TransposeImpl<MatrixType,typename internal::traits<MatrixType>::StorageKind>
-{
-  public:
+ * \ingroup Core_Module
+ *
+ * \brief Expression of the transpose of a matrix
+ *
+ * \tparam MatrixType the type of the object of which we are taking the transpose
+ *
+ * This class represents an expression of the transpose of a matrix.
+ * It is the return type of MatrixBase::transpose() and MatrixBase::adjoint()
+ * and most of the time this is the only way it is used.
+ *
+ * \sa MatrixBase::transpose(), MatrixBase::adjoint()
+ */
+template <typename MatrixType>
+class Transpose : public TransposeImpl<MatrixType, typename internal::traits<MatrixType>::StorageKind> {
+ public:
+  typedef typename internal::ref_selector<MatrixType>::non_const_type MatrixTypeNested;
 
-    typedef typename internal::ref_selector<MatrixType>::non_const_type MatrixTypeNested;
+  typedef typename TransposeImpl<MatrixType, typename internal::traits<MatrixType>::StorageKind>::Base Base;
+  EIGEN_GENERIC_PUBLIC_INTERFACE(Transpose)
+  typedef internal::remove_all_t<MatrixType> NestedExpression;
 
-    typedef typename TransposeImpl<MatrixType,typename internal::traits<MatrixType>::StorageKind>::Base Base;
-    EIGEN_GENERIC_PUBLIC_INTERFACE(Transpose)
-    typedef internal::remove_all_t<MatrixType> NestedExpression;
+  EIGEN_DEVICE_FUNC explicit EIGEN_STRONG_INLINE Transpose(MatrixType& matrix) : m_matrix(matrix) {}
 
-    EIGEN_DEVICE_FUNC
-    explicit EIGEN_STRONG_INLINE Transpose(MatrixType& matrix) : m_matrix(matrix) {}
+  EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Transpose)
 
-    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Transpose)
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_matrix.cols(); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_matrix.rows(); }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-    Index rows() const EIGEN_NOEXCEPT { return m_matrix.cols(); }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-    Index cols() const EIGEN_NOEXCEPT { return m_matrix.rows(); }
+  /** \returns the nested expression */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const internal::remove_all_t<MatrixTypeNested>& nestedExpression() const {
+    return m_matrix;
+  }
 
-    /** \returns the nested expression */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    const internal::remove_all_t<MatrixTypeNested>&
-    nestedExpression() const { return m_matrix; }
+  /** \returns the nested expression */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::remove_reference_t<MatrixTypeNested>& nestedExpression() {
+    return m_matrix;
+  }
 
-    /** \returns the nested expression */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    std::remove_reference_t<MatrixTypeNested>&
-    nestedExpression() { return m_matrix; }
+  /** \internal */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void resize(Index nrows, Index ncols) { m_matrix.resize(ncols, nrows); }
 
-    /** \internal */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    void resize(Index nrows, Index ncols) {
-      m_matrix.resize(ncols,nrows);
-    }
-
-  protected:
-    typename internal::ref_selector<MatrixType>::non_const_type m_matrix;
+ protected:
+  typename internal::ref_selector<MatrixType>::non_const_type m_matrix;
 };
 
 namespace internal {
 
-template<typename MatrixType, bool HasDirectAccess = has_direct_access<MatrixType>::ret>
-struct TransposeImpl_base
-{
+template <typename MatrixType, bool HasDirectAccess = has_direct_access<MatrixType>::ret>
+struct TransposeImpl_base {
   typedef typename dense_xpr_base<Transpose<MatrixType> >::type type;
 };
 
-template<typename MatrixType>
-struct TransposeImpl_base<MatrixType, false>
-{
+template <typename MatrixType>
+struct TransposeImpl_base<MatrixType, false> {
   typedef typename dense_xpr_base<Transpose<MatrixType> >::type type;
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 // Generic API dispatcher
-template<typename XprType, typename StorageKind>
-class TransposeImpl
-  : public internal::generic_xpr_base<Transpose<XprType> >::type
-{
-public:
+template <typename XprType, typename StorageKind>
+class TransposeImpl : public internal::generic_xpr_base<Transpose<XprType> >::type {
+ public:
   typedef typename internal::generic_xpr_base<Transpose<XprType> >::type Base;
 };
 
-template<typename MatrixType> class TransposeImpl<MatrixType,Dense>
-  : public internal::TransposeImpl_base<MatrixType>::type
-{
-  public:
+template <typename MatrixType>
+class TransposeImpl<MatrixType, Dense> : public internal::TransposeImpl_base<MatrixType>::type {
+ public:
+  typedef typename internal::TransposeImpl_base<MatrixType>::type Base;
+  using Base::coeffRef;
+  EIGEN_DENSE_PUBLIC_INTERFACE(Transpose<MatrixType>)
+  EIGEN_INHERIT_ASSIGNMENT_OPERATORS(TransposeImpl)
 
-    typedef typename internal::TransposeImpl_base<MatrixType>::type Base;
-    using Base::coeffRef;
-    EIGEN_DENSE_PUBLIC_INTERFACE(Transpose<MatrixType>)
-    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(TransposeImpl)
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index innerStride() const { return derived().nestedExpression().innerStride(); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index outerStride() const { return derived().nestedExpression().outerStride(); }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Index innerStride() const { return derived().nestedExpression().innerStride(); }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    Index outerStride() const { return derived().nestedExpression().outerStride(); }
+  typedef std::conditional_t<internal::is_lvalue<MatrixType>::value, Scalar, const Scalar> ScalarWithConstIfNotLvalue;
 
-    typedef std::conditional_t<
-              internal::is_lvalue<MatrixType>::value,
-              Scalar,
-              const Scalar
-            > ScalarWithConstIfNotLvalue;
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ScalarWithConstIfNotLvalue* data() {
+    return derived().nestedExpression().data();
+  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar* data() const { return derived().nestedExpression().data(); }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    ScalarWithConstIfNotLvalue* data() { return derived().nestedExpression().data(); }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    const Scalar* data() const { return derived().nestedExpression().data(); }
+  // FIXME: shall we keep the const version of coeffRef?
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& coeffRef(Index rowId, Index colId) const {
+    return derived().nestedExpression().coeffRef(colId, rowId);
+  }
 
-    // FIXME: shall we keep the const version of coeffRef?
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    const Scalar& coeffRef(Index rowId, Index colId) const
-    {
-      return derived().nestedExpression().coeffRef(colId, rowId);
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& coeffRef(Index index) const {
+    return derived().nestedExpression().coeffRef(index);
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    const Scalar& coeffRef(Index index) const
-    {
-      return derived().nestedExpression().coeffRef(index);
-    }
-  protected:
-    EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(TransposeImpl)
+ protected:
+  EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(TransposeImpl)
 };
 
 /** \returns an expression of the transpose of *this.
-  *
-  * Example: \include MatrixBase_transpose.cpp
-  * Output: \verbinclude MatrixBase_transpose.out
-  *
-  * \warning If you want to replace a matrix by its own transpose, do \b NOT do this:
-  * \code
-  * m = m.transpose(); // bug!!! caused by aliasing effect
-  * \endcode
-  * Instead, use the transposeInPlace() method:
-  * \code
-  * m.transposeInPlace();
-  * \endcode
-  * which gives Eigen good opportunities for optimization, or alternatively you can also do:
-  * \code
-  * m = m.transpose().eval();
-  * \endcode
-  *
-  * \sa transposeInPlace(), adjoint() */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename DenseBase<Derived>::TransposeReturnType
-DenseBase<Derived>::transpose()
-{
+ *
+ * Example: \include MatrixBase_transpose.cpp
+ * Output: \verbinclude MatrixBase_transpose.out
+ *
+ * \warning If you want to replace a matrix by its own transpose, do \b NOT do this:
+ * \code
+ * m = m.transpose(); // bug!!! caused by aliasing effect
+ * \endcode
+ * Instead, use the transposeInPlace() method:
+ * \code
+ * m.transposeInPlace();
+ * \endcode
+ * which gives Eigen good opportunities for optimization, or alternatively you can also do:
+ * \code
+ * m = m.transpose().eval();
+ * \endcode
+ *
+ * \sa transposeInPlace(), adjoint() */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename DenseBase<Derived>::TransposeReturnType DenseBase<Derived>::transpose() {
   return TransposeReturnType(derived());
 }
 
 /** This is the const version of transpose().
-  *
-  * Make sure you read the warning for transpose() !
-  *
-  * \sa transposeInPlace(), adjoint() */
-template<typename Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-const typename DenseBase<Derived>::ConstTransposeReturnType
-DenseBase<Derived>::transpose() const
-{
+ *
+ * Make sure you read the warning for transpose() !
+ *
+ * \sa transposeInPlace(), adjoint() */
+template <typename Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstTransposeReturnType
+DenseBase<Derived>::transpose() const {
   return ConstTransposeReturnType(derived());
 }
 
 /** \returns an expression of the adjoint (i.e. conjugate transpose) of *this.
-  *
-  * Example: \include MatrixBase_adjoint.cpp
-  * Output: \verbinclude MatrixBase_adjoint.out
-  *
-  * \warning If you want to replace a matrix by its own adjoint, do \b NOT do this:
-  * \code
-  * m = m.adjoint(); // bug!!! caused by aliasing effect
-  * \endcode
-  * Instead, use the adjointInPlace() method:
-  * \code
-  * m.adjointInPlace();
-  * \endcode
-  * which gives Eigen good opportunities for optimization, or alternatively you can also do:
-  * \code
-  * m = m.adjoint().eval();
-  * \endcode
-  *
-  * \sa adjointInPlace(), transpose(), conjugate(), class Transpose, class internal::scalar_conjugate_op */
-template<typename Derived>
-EIGEN_DEVICE_FUNC inline const typename MatrixBase<Derived>::AdjointReturnType
-MatrixBase<Derived>::adjoint() const
-{
+ *
+ * Example: \include MatrixBase_adjoint.cpp
+ * Output: \verbinclude MatrixBase_adjoint.out
+ *
+ * \warning If you want to replace a matrix by its own adjoint, do \b NOT do this:
+ * \code
+ * m = m.adjoint(); // bug!!! caused by aliasing effect
+ * \endcode
+ * Instead, use the adjointInPlace() method:
+ * \code
+ * m.adjointInPlace();
+ * \endcode
+ * which gives Eigen good opportunities for optimization, or alternatively you can also do:
+ * \code
+ * m = m.adjoint().eval();
+ * \endcode
+ *
+ * \sa adjointInPlace(), transpose(), conjugate(), class Transpose, class internal::scalar_conjugate_op */
+template <typename Derived>
+EIGEN_DEVICE_FUNC inline const typename MatrixBase<Derived>::AdjointReturnType MatrixBase<Derived>::adjoint() const {
   return AdjointReturnType(this->transpose());
 }
 
 /***************************************************************************
-* "in place" transpose implementation
-***************************************************************************/
+ * "in place" transpose implementation
+ ***************************************************************************/
 
 namespace internal {
 
-template<typename MatrixType,
-  bool IsSquare = (MatrixType::RowsAtCompileTime == MatrixType::ColsAtCompileTime) && MatrixType::RowsAtCompileTime!=Dynamic,
-  bool MatchPacketSize =
-        (int(MatrixType::RowsAtCompileTime) == int(internal::packet_traits<typename MatrixType::Scalar>::size))
-    &&  (internal::evaluator<MatrixType>::Flags&PacketAccessBit) >
+template <typename MatrixType,
+          bool IsSquare = (MatrixType::RowsAtCompileTime == MatrixType::ColsAtCompileTime) &&
+                          MatrixType::RowsAtCompileTime != Dynamic,
+          bool MatchPacketSize =
+              (int(MatrixType::RowsAtCompileTime) == int(internal::packet_traits<typename MatrixType::Scalar>::size)) &&
+              (internal::evaluator<MatrixType>::Flags & PacketAccessBit)>
 struct inplace_transpose_selector;
 
-template<typename MatrixType>
-struct inplace_transpose_selector<MatrixType,true,false> { // square matrix
+template <typename MatrixType>
+struct inplace_transpose_selector<MatrixType, true, false> {  // square matrix
   static void run(MatrixType& m) {
-    m.matrix().template triangularView<StrictlyUpper>().swap(m.matrix().transpose().template triangularView<StrictlyUpper>());
+    m.matrix().template triangularView<StrictlyUpper>().swap(
+        m.matrix().transpose().template triangularView<StrictlyUpper>());
   }
 };
 
-template<typename MatrixType>
-struct inplace_transpose_selector<MatrixType,true,true> { // PacketSize x PacketSize
+template <typename MatrixType>
+struct inplace_transpose_selector<MatrixType, true, true> {  // PacketSize x PacketSize
   static void run(MatrixType& m) {
     typedef typename MatrixType::Scalar Scalar;
     typedef typename internal::packet_traits<typename MatrixType::Scalar>::type Packet;
     const Index PacketSize = internal::packet_traits<Scalar>::size;
     const Index Alignment = internal::evaluator<MatrixType>::Alignment;
     PacketBlock<Packet> A;
-    for (Index i=0; i<PacketSize; ++i)
-      A.packet[i] = m.template packetByOuterInner<Alignment>(i,0);
+    for (Index i = 0; i < PacketSize; ++i) A.packet[i] = m.template packetByOuterInner<Alignment>(i, 0);
     internal::ptranspose(A);
-    for (Index i=0; i<PacketSize; ++i)
-      m.template writePacket<Alignment>(m.rowIndexByOuterInner(i,0), m.colIndexByOuterInner(i,0), A.packet[i]);
+    for (Index i = 0; i < PacketSize; ++i)
+      m.template writePacket<Alignment>(m.rowIndexByOuterInner(i, 0), m.colIndexByOuterInner(i, 0), A.packet[i]);
   }
 };
 
-
 template <typename MatrixType, Index Alignment>
 void BlockedInPlaceTranspose(MatrixType& m) {
   typedef typename MatrixType::Scalar Scalar;
@@ -274,46 +244,48 @@
     for (int col_start = row_start; col_start + PacketSize <= m.cols(); col_start += PacketSize) {
       PacketBlock<Packet> A;
       if (row_start == col_start) {
-        for (Index i=0; i<PacketSize; ++i)
-          A.packet[i] = m.template packetByOuterInner<Alignment>(row_start + i,col_start);
+        for (Index i = 0; i < PacketSize; ++i)
+          A.packet[i] = m.template packetByOuterInner<Alignment>(row_start + i, col_start);
         internal::ptranspose(A);
-        for (Index i=0; i<PacketSize; ++i)
-          m.template writePacket<Alignment>(m.rowIndexByOuterInner(row_start + i, col_start), m.colIndexByOuterInner(row_start + i,col_start), A.packet[i]);
+        for (Index i = 0; i < PacketSize; ++i)
+          m.template writePacket<Alignment>(m.rowIndexByOuterInner(row_start + i, col_start),
+                                            m.colIndexByOuterInner(row_start + i, col_start), A.packet[i]);
       } else {
         PacketBlock<Packet> B;
-        for (Index i=0; i<PacketSize; ++i) {
-          A.packet[i] = m.template packetByOuterInner<Alignment>(row_start + i,col_start);
+        for (Index i = 0; i < PacketSize; ++i) {
+          A.packet[i] = m.template packetByOuterInner<Alignment>(row_start + i, col_start);
           B.packet[i] = m.template packetByOuterInner<Alignment>(col_start + i, row_start);
         }
         internal::ptranspose(A);
         internal::ptranspose(B);
-        for (Index i=0; i<PacketSize; ++i) {
-          m.template writePacket<Alignment>(m.rowIndexByOuterInner(row_start + i, col_start), m.colIndexByOuterInner(row_start + i,col_start), B.packet[i]);
-          m.template writePacket<Alignment>(m.rowIndexByOuterInner(col_start + i, row_start), m.colIndexByOuterInner(col_start + i,row_start), A.packet[i]);
+        for (Index i = 0; i < PacketSize; ++i) {
+          m.template writePacket<Alignment>(m.rowIndexByOuterInner(row_start + i, col_start),
+                                            m.colIndexByOuterInner(row_start + i, col_start), B.packet[i]);
+          m.template writePacket<Alignment>(m.rowIndexByOuterInner(col_start + i, row_start),
+                                            m.colIndexByOuterInner(col_start + i, row_start), A.packet[i]);
         }
       }
     }
   }
   for (Index row = row_start; row < m.rows(); ++row) {
-    m.matrix().row(row).head(row).swap(
-        m.matrix().col(row).head(row).transpose());
+    m.matrix().row(row).head(row).swap(m.matrix().col(row).head(row).transpose());
   }
 }
 
-template<typename MatrixType,bool MatchPacketSize>
-struct inplace_transpose_selector<MatrixType,false,MatchPacketSize> { // non square or dynamic matrix
+template <typename MatrixType, bool MatchPacketSize>
+struct inplace_transpose_selector<MatrixType, false, MatchPacketSize> {  // non square or dynamic matrix
   static void run(MatrixType& m) {
     typedef typename MatrixType::Scalar Scalar;
     if (m.rows() == m.cols()) {
       const Index PacketSize = internal::packet_traits<Scalar>::size;
       if (!NumTraits<Scalar>::IsComplex && m.rows() >= PacketSize) {
         if ((m.rows() % PacketSize) == 0)
-          BlockedInPlaceTranspose<MatrixType,internal::evaluator<MatrixType>::Alignment>(m);
+          BlockedInPlaceTranspose<MatrixType, internal::evaluator<MatrixType>::Alignment>(m);
         else
-          BlockedInPlaceTranspose<MatrixType,Unaligned>(m);
-      }
-      else {
-        m.matrix().template triangularView<StrictlyUpper>().swap(m.matrix().transpose().template triangularView<StrictlyUpper>());
+          BlockedInPlaceTranspose<MatrixType, Unaligned>(m);
+      } else {
+        m.matrix().template triangularView<StrictlyUpper>().swap(
+            m.matrix().transpose().template triangularView<StrictlyUpper>());
       }
     } else {
       m = m.transpose().eval();
@@ -321,62 +293,59 @@
   }
 };
 
-
-} // end namespace internal
+}  // end namespace internal
 
 /** This is the "in place" version of transpose(): it replaces \c *this by its own transpose.
-  * Thus, doing
-  * \code
-  * m.transposeInPlace();
-  * \endcode
-  * has the same effect on m as doing
-  * \code
-  * m = m.transpose().eval();
-  * \endcode
-  * and is faster and also safer because in the latter line of code, forgetting the eval() results
-  * in a bug caused by \ref TopicAliasing "aliasing".
-  *
-  * Notice however that this method is only useful if you want to replace a matrix by its own transpose.
-  * If you just need the transpose of a matrix, use transpose().
-  *
-  * \note if the matrix is not square, then \c *this must be a resizable matrix.
-  * This excludes (non-square) fixed-size matrices, block-expressions and maps.
-  *
-  * \sa transpose(), adjoint(), adjointInPlace() */
-template<typename Derived>
-EIGEN_DEVICE_FUNC inline void DenseBase<Derived>::transposeInPlace()
-{
-  eigen_assert((rows() == cols() || (RowsAtCompileTime == Dynamic && ColsAtCompileTime == Dynamic))
-               && "transposeInPlace() called on a non-square non-resizable matrix");
+ * Thus, doing
+ * \code
+ * m.transposeInPlace();
+ * \endcode
+ * has the same effect on m as doing
+ * \code
+ * m = m.transpose().eval();
+ * \endcode
+ * and is faster and also safer because in the latter line of code, forgetting the eval() results
+ * in a bug caused by \ref TopicAliasing "aliasing".
+ *
+ * Notice however that this method is only useful if you want to replace a matrix by its own transpose.
+ * If you just need the transpose of a matrix, use transpose().
+ *
+ * \note if the matrix is not square, then \c *this must be a resizable matrix.
+ * This excludes (non-square) fixed-size matrices, block-expressions and maps.
+ *
+ * \sa transpose(), adjoint(), adjointInPlace() */
+template <typename Derived>
+EIGEN_DEVICE_FUNC inline void DenseBase<Derived>::transposeInPlace() {
+  eigen_assert((rows() == cols() || (RowsAtCompileTime == Dynamic && ColsAtCompileTime == Dynamic)) &&
+               "transposeInPlace() called on a non-square non-resizable matrix");
   internal::inplace_transpose_selector<Derived>::run(derived());
 }
 
 /***************************************************************************
-* "in place" adjoint implementation
-***************************************************************************/
+ * "in place" adjoint implementation
+ ***************************************************************************/
 
 /** This is the "in place" version of adjoint(): it replaces \c *this by its own transpose.
-  * Thus, doing
-  * \code
-  * m.adjointInPlace();
-  * \endcode
-  * has the same effect on m as doing
-  * \code
-  * m = m.adjoint().eval();
-  * \endcode
-  * and is faster and also safer because in the latter line of code, forgetting the eval() results
-  * in a bug caused by aliasing.
-  *
-  * Notice however that this method is only useful if you want to replace a matrix by its own adjoint.
-  * If you just need the adjoint of a matrix, use adjoint().
-  *
-  * \note if the matrix is not square, then \c *this must be a resizable matrix.
-  * This excludes (non-square) fixed-size matrices, block-expressions and maps.
-  *
-  * \sa transpose(), adjoint(), transposeInPlace() */
-template<typename Derived>
-EIGEN_DEVICE_FUNC inline void MatrixBase<Derived>::adjointInPlace()
-{
+ * Thus, doing
+ * \code
+ * m.adjointInPlace();
+ * \endcode
+ * has the same effect on m as doing
+ * \code
+ * m = m.adjoint().eval();
+ * \endcode
+ * and is faster and also safer because in the latter line of code, forgetting the eval() results
+ * in a bug caused by aliasing.
+ *
+ * Notice however that this method is only useful if you want to replace a matrix by its own adjoint.
+ * If you just need the adjoint of a matrix, use adjoint().
+ *
+ * \note if the matrix is not square, then \c *this must be a resizable matrix.
+ * This excludes (non-square) fixed-size matrices, block-expressions and maps.
+ *
+ * \sa transpose(), adjoint(), transposeInPlace() */
+template <typename Derived>
+EIGEN_DEVICE_FUNC inline void MatrixBase<Derived>::adjointInPlace() {
   derived() = adjoint().eval();
 }
 
@@ -386,36 +355,34 @@
 
 namespace internal {
 
-template<bool DestIsTransposed, typename OtherDerived>
-struct check_transpose_aliasing_compile_time_selector
-{
+template <bool DestIsTransposed, typename OtherDerived>
+struct check_transpose_aliasing_compile_time_selector {
   enum { ret = bool(blas_traits<OtherDerived>::IsTransposed) != DestIsTransposed };
 };
 
-template<bool DestIsTransposed, typename BinOp, typename DerivedA, typename DerivedB>
-struct check_transpose_aliasing_compile_time_selector<DestIsTransposed,CwiseBinaryOp<BinOp,DerivedA,DerivedB> >
-{
-  enum { ret =    bool(blas_traits<DerivedA>::IsTransposed) != DestIsTransposed
-               || bool(blas_traits<DerivedB>::IsTransposed) != DestIsTransposed
+template <bool DestIsTransposed, typename BinOp, typename DerivedA, typename DerivedB>
+struct check_transpose_aliasing_compile_time_selector<DestIsTransposed, CwiseBinaryOp<BinOp, DerivedA, DerivedB> > {
+  enum {
+    ret = bool(blas_traits<DerivedA>::IsTransposed) != DestIsTransposed ||
+          bool(blas_traits<DerivedB>::IsTransposed) != DestIsTransposed
   };
 };
 
-template<typename Scalar, bool DestIsTransposed, typename OtherDerived>
-struct check_transpose_aliasing_run_time_selector
-{
-  EIGEN_DEVICE_FUNC static bool run(const Scalar* dest, const OtherDerived& src)
-  {
-    return (bool(blas_traits<OtherDerived>::IsTransposed) != DestIsTransposed) && (dest!=0 && dest==(const Scalar*)extract_data(src));
+template <typename Scalar, bool DestIsTransposed, typename OtherDerived>
+struct check_transpose_aliasing_run_time_selector {
+  EIGEN_DEVICE_FUNC static bool run(const Scalar* dest, const OtherDerived& src) {
+    return (bool(blas_traits<OtherDerived>::IsTransposed) != DestIsTransposed) &&
+           (dest != 0 && dest == (const Scalar*)extract_data(src));
   }
 };
 
-template<typename Scalar, bool DestIsTransposed, typename BinOp, typename DerivedA, typename DerivedB>
-struct check_transpose_aliasing_run_time_selector<Scalar,DestIsTransposed,CwiseBinaryOp<BinOp,DerivedA,DerivedB> >
-{
-  EIGEN_DEVICE_FUNC static bool run(const Scalar* dest, const CwiseBinaryOp<BinOp,DerivedA,DerivedB>& src)
-  {
-    return ((blas_traits<DerivedA>::IsTransposed != DestIsTransposed) && (dest!=0 && dest==(const Scalar*)extract_data(src.lhs())))
-        || ((blas_traits<DerivedB>::IsTransposed != DestIsTransposed) && (dest!=0 && dest==(const Scalar*)extract_data(src.rhs())));
+template <typename Scalar, bool DestIsTransposed, typename BinOp, typename DerivedA, typename DerivedB>
+struct check_transpose_aliasing_run_time_selector<Scalar, DestIsTransposed, CwiseBinaryOp<BinOp, DerivedA, DerivedB> > {
+  EIGEN_DEVICE_FUNC static bool run(const Scalar* dest, const CwiseBinaryOp<BinOp, DerivedA, DerivedB>& src) {
+    return ((blas_traits<DerivedA>::IsTransposed != DestIsTransposed) &&
+            (dest != 0 && dest == (const Scalar*)extract_data(src.lhs()))) ||
+           ((blas_traits<DerivedB>::IsTransposed != DestIsTransposed) &&
+            (dest != 0 && dest == (const Scalar*)extract_data(src.rhs())));
   }
 };
 
@@ -425,43 +392,34 @@
 // known at compile time to be false, and using that, we can avoid generating the code of the assert again
 // and again for all these expressions that don't need it.
 
-template<typename Derived, typename OtherDerived,
-         bool MightHaveTransposeAliasing
-                 = check_transpose_aliasing_compile_time_selector
-                     <blas_traits<Derived>::IsTransposed,OtherDerived>::ret
-        >
-struct checkTransposeAliasing_impl
-{
-    EIGEN_DEVICE_FUNC static void run(const Derived& dst, const OtherDerived& other)
-    {
-        eigen_assert((!check_transpose_aliasing_run_time_selector
-                      <typename Derived::Scalar,blas_traits<Derived>::IsTransposed,OtherDerived>
-                      ::run(extract_data(dst), other))
-          && "aliasing detected during transposition, use transposeInPlace() "
-             "or evaluate the rhs into a temporary using .eval()");
-
-    }
+template <typename Derived, typename OtherDerived,
+          bool MightHaveTransposeAliasing =
+              check_transpose_aliasing_compile_time_selector<blas_traits<Derived>::IsTransposed, OtherDerived>::ret>
+struct checkTransposeAliasing_impl {
+  EIGEN_DEVICE_FUNC static void run(const Derived& dst, const OtherDerived& other) {
+    eigen_assert(
+        (!check_transpose_aliasing_run_time_selector<typename Derived::Scalar, blas_traits<Derived>::IsTransposed,
+                                                     OtherDerived>::run(extract_data(dst), other)) &&
+        "aliasing detected during transposition, use transposeInPlace() "
+        "or evaluate the rhs into a temporary using .eval()");
+  }
 };
 
-template<typename Derived, typename OtherDerived>
-struct checkTransposeAliasing_impl<Derived, OtherDerived, false>
-{
-    EIGEN_DEVICE_FUNC static void run(const Derived&, const OtherDerived&)
-    {
-    }
+template <typename Derived, typename OtherDerived>
+struct checkTransposeAliasing_impl<Derived, OtherDerived, false> {
+  EIGEN_DEVICE_FUNC static void run(const Derived&, const OtherDerived&) {}
 };
 
-template<typename Dst, typename Src>
-EIGEN_DEVICE_FUNC inline void check_for_aliasing(const Dst &dst, const Src &src)
-{
-  if((!Dst::IsVectorAtCompileTime) && dst.rows()>1 && dst.cols()>1)
+template <typename Dst, typename Src>
+EIGEN_DEVICE_FUNC inline void check_for_aliasing(const Dst& dst, const Src& src) {
+  if ((!Dst::IsVectorAtCompileTime) && dst.rows() > 1 && dst.cols() > 1)
     internal::checkTransposeAliasing_impl<Dst, Src>::run(dst, src);
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-#endif // EIGEN_NO_DEBUG
+#endif  // EIGEN_NO_DEBUG
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_TRANSPOSE_H
+#endif  // EIGEN_TRANSPOSE_H
diff --git a/Eigen/src/Core/Transpositions.h b/Eigen/src/Core/Transpositions.h
index f10ca33..ad136d3 100644
--- a/Eigen/src/Core/Transpositions.h
+++ b/Eigen/src/Core/Transpositions.h
@@ -15,375 +15,309 @@
 
 namespace Eigen {
 
-template<typename Derived>
-class TranspositionsBase
-{
-    typedef internal::traits<Derived> Traits;
+template <typename Derived>
+class TranspositionsBase {
+  typedef internal::traits<Derived> Traits;
 
-  public:
+ public:
+  typedef typename Traits::IndicesType IndicesType;
+  typedef typename IndicesType::Scalar StorageIndex;
+  typedef Eigen::Index Index;  ///< \deprecated since Eigen 3.3
 
-    typedef typename Traits::IndicesType IndicesType;
-    typedef typename IndicesType::Scalar StorageIndex;
-    typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3
+  EIGEN_DEVICE_FUNC Derived& derived() { return *static_cast<Derived*>(this); }
+  EIGEN_DEVICE_FUNC const Derived& derived() const { return *static_cast<const Derived*>(this); }
 
-    EIGEN_DEVICE_FUNC
-    Derived& derived() { return *static_cast<Derived*>(this); }
-    EIGEN_DEVICE_FUNC
-    const Derived& derived() const { return *static_cast<const Derived*>(this); }
+  /** Copies the \a other transpositions into \c *this */
+  template <typename OtherDerived>
+  Derived& operator=(const TranspositionsBase<OtherDerived>& other) {
+    indices() = other.indices();
+    return derived();
+  }
 
-    /** Copies the \a other transpositions into \c *this */
-    template<typename OtherDerived>
-    Derived& operator=(const TranspositionsBase<OtherDerived>& other)
-    {
-      indices() = other.indices();
-      return derived();
-    }
+  /** \returns the number of transpositions */
+  EIGEN_DEVICE_FUNC Index size() const { return indices().size(); }
+  /** \returns the number of rows of the equivalent permutation matrix */
+  EIGEN_DEVICE_FUNC Index rows() const { return indices().size(); }
+  /** \returns the number of columns of the equivalent permutation matrix */
+  EIGEN_DEVICE_FUNC Index cols() const { return indices().size(); }
 
-    /** \returns the number of transpositions */
-    EIGEN_DEVICE_FUNC
-    Index size() const { return indices().size(); }
-    /** \returns the number of rows of the equivalent permutation matrix */
-    EIGEN_DEVICE_FUNC
-    Index rows() const { return indices().size(); }
-    /** \returns the number of columns of the equivalent permutation matrix */
-    EIGEN_DEVICE_FUNC
-    Index cols() const { return indices().size(); }
+  /** Direct access to the underlying index vector */
+  EIGEN_DEVICE_FUNC inline const StorageIndex& coeff(Index i) const { return indices().coeff(i); }
+  /** Direct access to the underlying index vector */
+  inline StorageIndex& coeffRef(Index i) { return indices().coeffRef(i); }
+  /** Direct access to the underlying index vector */
+  inline const StorageIndex& operator()(Index i) const { return indices()(i); }
+  /** Direct access to the underlying index vector */
+  inline StorageIndex& operator()(Index i) { return indices()(i); }
+  /** Direct access to the underlying index vector */
+  inline const StorageIndex& operator[](Index i) const { return indices()(i); }
+  /** Direct access to the underlying index vector */
+  inline StorageIndex& operator[](Index i) { return indices()(i); }
 
-    /** Direct access to the underlying index vector */
-    EIGEN_DEVICE_FUNC
-    inline const StorageIndex& coeff(Index i) const { return indices().coeff(i); }
-    /** Direct access to the underlying index vector */
-    inline StorageIndex& coeffRef(Index i) { return indices().coeffRef(i); }
-    /** Direct access to the underlying index vector */
-    inline const StorageIndex& operator()(Index i) const { return indices()(i); }
-    /** Direct access to the underlying index vector */
-    inline StorageIndex& operator()(Index i) { return indices()(i); }
-    /** Direct access to the underlying index vector */
-    inline const StorageIndex& operator[](Index i) const { return indices()(i); }
-    /** Direct access to the underlying index vector */
-    inline StorageIndex& operator[](Index i) { return indices()(i); }
+  /** const version of indices(). */
+  EIGEN_DEVICE_FUNC const IndicesType& indices() const { return derived().indices(); }
+  /** \returns a reference to the stored array representing the transpositions. */
+  EIGEN_DEVICE_FUNC IndicesType& indices() { return derived().indices(); }
 
-    /** const version of indices(). */
-    EIGEN_DEVICE_FUNC
-    const IndicesType& indices() const { return derived().indices(); }
-    /** \returns a reference to the stored array representing the transpositions. */
-    EIGEN_DEVICE_FUNC
-    IndicesType& indices() { return derived().indices(); }
+  /** Resizes to given size. */
+  inline void resize(Index newSize) { indices().resize(newSize); }
 
-    /** Resizes to given size. */
-    inline void resize(Index newSize)
-    {
-      indices().resize(newSize);
-    }
+  /** Sets \c *this to represents an identity transformation */
+  void setIdentity() {
+    for (StorageIndex i = 0; i < indices().size(); ++i) coeffRef(i) = i;
+  }
 
-    /** Sets \c *this to represents an identity transformation */
-    void setIdentity()
-    {
-      for(StorageIndex i = 0; i < indices().size(); ++i)
-        coeffRef(i) = i;
-    }
+  // FIXME: do we want such methods ?
+  // might be useful when the target matrix expression is complex, e.g.:
+  // object.matrix().block(..,..,..,..) = trans * object.matrix().block(..,..,..,..);
+  /*
+  template<typename MatrixType>
+  void applyForwardToRows(MatrixType& mat) const
+  {
+    for(Index k=0 ; k<size() ; ++k)
+      if(m_indices(k)!=k)
+        mat.row(k).swap(mat.row(m_indices(k)));
+  }
 
-    // FIXME: do we want such methods ?
-    // might be useful when the target matrix expression is complex, e.g.:
-    // object.matrix().block(..,..,..,..) = trans * object.matrix().block(..,..,..,..);
-    /*
-    template<typename MatrixType>
-    void applyForwardToRows(MatrixType& mat) const
-    {
-      for(Index k=0 ; k<size() ; ++k)
-        if(m_indices(k)!=k)
-          mat.row(k).swap(mat.row(m_indices(k)));
-    }
+  template<typename MatrixType>
+  void applyBackwardToRows(MatrixType& mat) const
+  {
+    for(Index k=size()-1 ; k>=0 ; --k)
+      if(m_indices(k)!=k)
+        mat.row(k).swap(mat.row(m_indices(k)));
+  }
+  */
 
-    template<typename MatrixType>
-    void applyBackwardToRows(MatrixType& mat) const
-    {
-      for(Index k=size()-1 ; k>=0 ; --k)
-        if(m_indices(k)!=k)
-          mat.row(k).swap(mat.row(m_indices(k)));
-    }
-    */
+  /** \returns the inverse transformation */
+  inline Transpose<TranspositionsBase> inverse() const { return Transpose<TranspositionsBase>(derived()); }
 
-    /** \returns the inverse transformation */
-    inline Transpose<TranspositionsBase> inverse() const
-    { return Transpose<TranspositionsBase>(derived()); }
+  /** \returns the tranpose transformation */
+  inline Transpose<TranspositionsBase> transpose() const { return Transpose<TranspositionsBase>(derived()); }
 
-    /** \returns the tranpose transformation */
-    inline Transpose<TranspositionsBase> transpose() const
-    { return Transpose<TranspositionsBase>(derived()); }
-
-  protected:
+ protected:
 };
 
 namespace internal {
-template<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename StorageIndex_>
-struct traits<Transpositions<SizeAtCompileTime,MaxSizeAtCompileTime,StorageIndex_> >
- : traits<PermutationMatrix<SizeAtCompileTime,MaxSizeAtCompileTime,StorageIndex_> >
-{
+template <int SizeAtCompileTime, int MaxSizeAtCompileTime, typename StorageIndex_>
+struct traits<Transpositions<SizeAtCompileTime, MaxSizeAtCompileTime, StorageIndex_> >
+    : traits<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, StorageIndex_> > {
   typedef Matrix<StorageIndex_, SizeAtCompileTime, 1, 0, MaxSizeAtCompileTime, 1> IndicesType;
   typedef TranspositionsStorage StorageKind;
 };
-}
+}  // namespace internal
 
 /** \class Transpositions
-  * \ingroup Core_Module
-  *
-  * \brief Represents a sequence of transpositions (row/column interchange)
-  *
-  * \tparam SizeAtCompileTime the number of transpositions, or Dynamic
-  * \tparam MaxSizeAtCompileTime the maximum number of transpositions, or Dynamic. This optional parameter defaults to SizeAtCompileTime. Most of the time, you should not have to specify it.
-  *
-  * This class represents a permutation transformation as a sequence of \em n transpositions
-  * \f$[T_{n-1} \ldots T_{i} \ldots T_{0}]\f$. It is internally stored as a vector of integers \c indices.
-  * Each transposition \f$ T_{i} \f$ applied on the left of a matrix (\f$ T_{i} M\f$) interchanges
-  * the rows \c i and \c indices[i] of the matrix \c M.
-  * A transposition applied on the right (e.g., \f$ M T_{i}\f$) yields a column interchange.
-  *
-  * Compared to the class PermutationMatrix, such a sequence of transpositions is what is
-  * computed during a decomposition with pivoting, and it is faster when applying the permutation in-place.
-  *
-  * To apply a sequence of transpositions to a matrix, simply use the operator * as in the following example:
-  * \code
-  * Transpositions tr;
-  * MatrixXf mat;
-  * mat = tr * mat;
-  * \endcode
-  * In this example, we detect that the matrix appears on both side, and so the transpositions
-  * are applied in-place without any temporary or extra copy.
-  *
-  * \sa class PermutationMatrix
-  */
+ * \ingroup Core_Module
+ *
+ * \brief Represents a sequence of transpositions (row/column interchange)
+ *
+ * \tparam SizeAtCompileTime the number of transpositions, or Dynamic
+ * \tparam MaxSizeAtCompileTime the maximum number of transpositions, or Dynamic. This optional parameter defaults to
+ * SizeAtCompileTime. Most of the time, you should not have to specify it.
+ *
+ * This class represents a permutation transformation as a sequence of \em n transpositions
+ * \f$[T_{n-1} \ldots T_{i} \ldots T_{0}]\f$. It is internally stored as a vector of integers \c indices.
+ * Each transposition \f$ T_{i} \f$ applied on the left of a matrix (\f$ T_{i} M\f$) interchanges
+ * the rows \c i and \c indices[i] of the matrix \c M.
+ * A transposition applied on the right (e.g., \f$ M T_{i}\f$) yields a column interchange.
+ *
+ * Compared to the class PermutationMatrix, such a sequence of transpositions is what is
+ * computed during a decomposition with pivoting, and it is faster when applying the permutation in-place.
+ *
+ * To apply a sequence of transpositions to a matrix, simply use the operator * as in the following example:
+ * \code
+ * Transpositions tr;
+ * MatrixXf mat;
+ * mat = tr * mat;
+ * \endcode
+ * In this example, we detect that the matrix appears on both side, and so the transpositions
+ * are applied in-place without any temporary or extra copy.
+ *
+ * \sa class PermutationMatrix
+ */
 
-template<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename StorageIndex_>
-class Transpositions : public TranspositionsBase<Transpositions<SizeAtCompileTime,MaxSizeAtCompileTime,StorageIndex_> >
-{
-    typedef internal::traits<Transpositions> Traits;
-  public:
+template <int SizeAtCompileTime, int MaxSizeAtCompileTime, typename StorageIndex_>
+class Transpositions
+    : public TranspositionsBase<Transpositions<SizeAtCompileTime, MaxSizeAtCompileTime, StorageIndex_> > {
+  typedef internal::traits<Transpositions> Traits;
 
-    typedef TranspositionsBase<Transpositions> Base;
-    typedef typename Traits::IndicesType IndicesType;
-    typedef typename IndicesType::Scalar StorageIndex;
+ public:
+  typedef TranspositionsBase<Transpositions> Base;
+  typedef typename Traits::IndicesType IndicesType;
+  typedef typename IndicesType::Scalar StorageIndex;
 
-    inline Transpositions() {}
+  inline Transpositions() {}
 
-    /** Copy constructor. */
-    template<typename OtherDerived>
-    inline Transpositions(const TranspositionsBase<OtherDerived>& other)
-      : m_indices(other.indices()) {}
+  /** Copy constructor. */
+  template <typename OtherDerived>
+  inline Transpositions(const TranspositionsBase<OtherDerived>& other) : m_indices(other.indices()) {}
 
-    /** Generic constructor from expression of the transposition indices. */
-    template<typename Other>
-    explicit inline Transpositions(const MatrixBase<Other>& indices) : m_indices(indices)
-    {}
+  /** Generic constructor from expression of the transposition indices. */
+  template <typename Other>
+  explicit inline Transpositions(const MatrixBase<Other>& indices) : m_indices(indices) {}
 
-    /** Copies the \a other transpositions into \c *this */
-    template<typename OtherDerived>
-    Transpositions& operator=(const TranspositionsBase<OtherDerived>& other)
-    {
-      return Base::operator=(other);
-    }
+  /** Copies the \a other transpositions into \c *this */
+  template <typename OtherDerived>
+  Transpositions& operator=(const TranspositionsBase<OtherDerived>& other) {
+    return Base::operator=(other);
+  }
 
-    /** Constructs an uninitialized permutation matrix of given size.
-      */
-    inline Transpositions(Index size) : m_indices(size)
-    {}
+  /** Constructs an uninitialized permutation matrix of given size.
+   */
+  inline Transpositions(Index size) : m_indices(size) {}
 
-    /** const version of indices(). */
-    EIGEN_DEVICE_FUNC
-    const IndicesType& indices() const { return m_indices; }
-    /** \returns a reference to the stored array representing the transpositions. */
-    EIGEN_DEVICE_FUNC
-    IndicesType& indices() { return m_indices; }
+  /** const version of indices(). */
+  EIGEN_DEVICE_FUNC const IndicesType& indices() const { return m_indices; }
+  /** \returns a reference to the stored array representing the transpositions. */
+  EIGEN_DEVICE_FUNC IndicesType& indices() { return m_indices; }
 
-  protected:
-
-    IndicesType m_indices;
+ protected:
+  IndicesType m_indices;
 };
 
-
 namespace internal {
-template<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename StorageIndex_, int PacketAccess_>
-struct traits<Map<Transpositions<SizeAtCompileTime,MaxSizeAtCompileTime,StorageIndex_>,PacketAccess_> >
- : traits<PermutationMatrix<SizeAtCompileTime,MaxSizeAtCompileTime,StorageIndex_> >
-{
-  typedef Map<const Matrix<StorageIndex_,SizeAtCompileTime,1,0,MaxSizeAtCompileTime,1>, PacketAccess_> IndicesType;
+template <int SizeAtCompileTime, int MaxSizeAtCompileTime, typename StorageIndex_, int PacketAccess_>
+struct traits<Map<Transpositions<SizeAtCompileTime, MaxSizeAtCompileTime, StorageIndex_>, PacketAccess_> >
+    : traits<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, StorageIndex_> > {
+  typedef Map<const Matrix<StorageIndex_, SizeAtCompileTime, 1, 0, MaxSizeAtCompileTime, 1>, PacketAccess_> IndicesType;
   typedef StorageIndex_ StorageIndex;
   typedef TranspositionsStorage StorageKind;
 };
-}
+}  // namespace internal
 
-template<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename StorageIndex_, int PacketAccess>
-class Map<Transpositions<SizeAtCompileTime,MaxSizeAtCompileTime,StorageIndex_>,PacketAccess>
- : public TranspositionsBase<Map<Transpositions<SizeAtCompileTime,MaxSizeAtCompileTime,StorageIndex_>,PacketAccess> >
-{
-    typedef internal::traits<Map> Traits;
-  public:
+template <int SizeAtCompileTime, int MaxSizeAtCompileTime, typename StorageIndex_, int PacketAccess>
+class Map<Transpositions<SizeAtCompileTime, MaxSizeAtCompileTime, StorageIndex_>, PacketAccess>
+    : public TranspositionsBase<
+          Map<Transpositions<SizeAtCompileTime, MaxSizeAtCompileTime, StorageIndex_>, PacketAccess> > {
+  typedef internal::traits<Map> Traits;
 
-    typedef TranspositionsBase<Map> Base;
-    typedef typename Traits::IndicesType IndicesType;
-    typedef typename IndicesType::Scalar StorageIndex;
+ public:
+  typedef TranspositionsBase<Map> Base;
+  typedef typename Traits::IndicesType IndicesType;
+  typedef typename IndicesType::Scalar StorageIndex;
 
-    explicit inline Map(const StorageIndex* indicesPtr)
-      : m_indices(indicesPtr)
-    {}
+  explicit inline Map(const StorageIndex* indicesPtr) : m_indices(indicesPtr) {}
 
-    inline Map(const StorageIndex* indicesPtr, Index size)
-      : m_indices(indicesPtr,size)
-    {}
+  inline Map(const StorageIndex* indicesPtr, Index size) : m_indices(indicesPtr, size) {}
 
-    /** Copies the \a other transpositions into \c *this */
-    template<typename OtherDerived>
-    Map& operator=(const TranspositionsBase<OtherDerived>& other)
-    {
-      return Base::operator=(other);
-    }
+  /** Copies the \a other transpositions into \c *this */
+  template <typename OtherDerived>
+  Map& operator=(const TranspositionsBase<OtherDerived>& other) {
+    return Base::operator=(other);
+  }
 
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    /** This is a special case of the templated operator=. Its purpose is to
-      * prevent a default operator= from hiding the templated operator=.
-      */
-    Map& operator=(const Map& other)
-    {
-      m_indices = other.m_indices;
-      return *this;
-    }
-    #endif
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  /** This is a special case of the templated operator=. Its purpose is to
+   * prevent a default operator= from hiding the templated operator=.
+   */
+  Map& operator=(const Map& other) {
+    m_indices = other.m_indices;
+    return *this;
+  }
+#endif
 
-    /** const version of indices(). */
-    EIGEN_DEVICE_FUNC
-    const IndicesType& indices() const { return m_indices; }
+  /** const version of indices(). */
+  EIGEN_DEVICE_FUNC const IndicesType& indices() const { return m_indices; }
 
-    /** \returns a reference to the stored array representing the transpositions. */
-    EIGEN_DEVICE_FUNC
-    IndicesType& indices() { return m_indices; }
+  /** \returns a reference to the stored array representing the transpositions. */
+  EIGEN_DEVICE_FUNC IndicesType& indices() { return m_indices; }
 
-  protected:
-
-    IndicesType m_indices;
+ protected:
+  IndicesType m_indices;
 };
 
 namespace internal {
-template<typename IndicesType_>
-struct traits<TranspositionsWrapper<IndicesType_> >
- : traits<PermutationWrapper<IndicesType_> >
-{
+template <typename IndicesType_>
+struct traits<TranspositionsWrapper<IndicesType_> > : traits<PermutationWrapper<IndicesType_> > {
   typedef TranspositionsStorage StorageKind;
 };
-}
+}  // namespace internal
 
-template<typename IndicesType_>
-class TranspositionsWrapper
- : public TranspositionsBase<TranspositionsWrapper<IndicesType_> >
-{
-    typedef internal::traits<TranspositionsWrapper> Traits;
-  public:
+template <typename IndicesType_>
+class TranspositionsWrapper : public TranspositionsBase<TranspositionsWrapper<IndicesType_> > {
+  typedef internal::traits<TranspositionsWrapper> Traits;
 
-    typedef TranspositionsBase<TranspositionsWrapper> Base;
-    typedef typename Traits::IndicesType IndicesType;
-    typedef typename IndicesType::Scalar StorageIndex;
+ public:
+  typedef TranspositionsBase<TranspositionsWrapper> Base;
+  typedef typename Traits::IndicesType IndicesType;
+  typedef typename IndicesType::Scalar StorageIndex;
 
-    explicit inline TranspositionsWrapper(IndicesType& indices)
-      : m_indices(indices)
-    {}
+  explicit inline TranspositionsWrapper(IndicesType& indices) : m_indices(indices) {}
 
-    /** Copies the \a other transpositions into \c *this */
-    template<typename OtherDerived>
-    TranspositionsWrapper& operator=(const TranspositionsBase<OtherDerived>& other)
-    {
-      return Base::operator=(other);
-    }
+  /** Copies the \a other transpositions into \c *this */
+  template <typename OtherDerived>
+  TranspositionsWrapper& operator=(const TranspositionsBase<OtherDerived>& other) {
+    return Base::operator=(other);
+  }
 
-    /** const version of indices(). */
-    EIGEN_DEVICE_FUNC
-    const IndicesType& indices() const { return m_indices; }
+  /** const version of indices(). */
+  EIGEN_DEVICE_FUNC const IndicesType& indices() const { return m_indices; }
 
-    /** \returns a reference to the stored array representing the transpositions. */
-    EIGEN_DEVICE_FUNC
-    IndicesType& indices() { return m_indices; }
+  /** \returns a reference to the stored array representing the transpositions. */
+  EIGEN_DEVICE_FUNC IndicesType& indices() { return m_indices; }
 
-  protected:
-
-    typename IndicesType::Nested m_indices;
+ protected:
+  typename IndicesType::Nested m_indices;
 };
 
-
-
 /** \returns the \a matrix with the \a transpositions applied to the columns.
-  */
-template<typename MatrixDerived, typename TranspositionsDerived>
-EIGEN_DEVICE_FUNC
-const Product<MatrixDerived, TranspositionsDerived, AliasFreeProduct>
-operator*(const MatrixBase<MatrixDerived> &matrix,
-          const TranspositionsBase<TranspositionsDerived>& transpositions)
-{
-  return Product<MatrixDerived, TranspositionsDerived, AliasFreeProduct>
-            (matrix.derived(), transpositions.derived());
+ */
+template <typename MatrixDerived, typename TranspositionsDerived>
+EIGEN_DEVICE_FUNC const Product<MatrixDerived, TranspositionsDerived, AliasFreeProduct> operator*(
+    const MatrixBase<MatrixDerived>& matrix, const TranspositionsBase<TranspositionsDerived>& transpositions) {
+  return Product<MatrixDerived, TranspositionsDerived, AliasFreeProduct>(matrix.derived(), transpositions.derived());
 }
 
 /** \returns the \a matrix with the \a transpositions applied to the rows.
-  */
-template<typename TranspositionsDerived, typename MatrixDerived>
-EIGEN_DEVICE_FUNC
-const Product<TranspositionsDerived, MatrixDerived, AliasFreeProduct>
-operator*(const TranspositionsBase<TranspositionsDerived> &transpositions,
-          const MatrixBase<MatrixDerived>& matrix)
-{
-  return Product<TranspositionsDerived, MatrixDerived, AliasFreeProduct>
-            (transpositions.derived(), matrix.derived());
+ */
+template <typename TranspositionsDerived, typename MatrixDerived>
+EIGEN_DEVICE_FUNC const Product<TranspositionsDerived, MatrixDerived, AliasFreeProduct> operator*(
+    const TranspositionsBase<TranspositionsDerived>& transpositions, const MatrixBase<MatrixDerived>& matrix) {
+  return Product<TranspositionsDerived, MatrixDerived, AliasFreeProduct>(transpositions.derived(), matrix.derived());
 }
 
 // Template partial specialization for transposed/inverse transpositions
 
 namespace internal {
 
-template<typename Derived>
-struct traits<Transpose<TranspositionsBase<Derived> > >
- : traits<Derived>
-{};
+template <typename Derived>
+struct traits<Transpose<TranspositionsBase<Derived> > > : traits<Derived> {};
 
-} // end namespace internal
+}  // end namespace internal
 
-template<typename TranspositionsDerived>
-class Transpose<TranspositionsBase<TranspositionsDerived> >
-{
-    typedef TranspositionsDerived TranspositionType;
-    typedef typename TranspositionType::IndicesType IndicesType;
-  public:
+template <typename TranspositionsDerived>
+class Transpose<TranspositionsBase<TranspositionsDerived> > {
+  typedef TranspositionsDerived TranspositionType;
+  typedef typename TranspositionType::IndicesType IndicesType;
 
-    explicit Transpose(const TranspositionType& t) : m_transpositions(t) {}
+ public:
+  explicit Transpose(const TranspositionType& t) : m_transpositions(t) {}
 
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    Index size() const EIGEN_NOEXCEPT { return m_transpositions.size(); }
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    Index rows() const EIGEN_NOEXCEPT { return m_transpositions.size(); }
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    Index cols() const EIGEN_NOEXCEPT { return m_transpositions.size(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index size() const EIGEN_NOEXCEPT { return m_transpositions.size(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_transpositions.size(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_transpositions.size(); }
 
-    /** \returns the \a matrix with the inverse transpositions applied to the columns.
-      */
-    template<typename OtherDerived> friend
-    const Product<OtherDerived, Transpose, AliasFreeProduct>
-    operator*(const MatrixBase<OtherDerived>& matrix, const Transpose& trt)
-    {
-      return Product<OtherDerived, Transpose, AliasFreeProduct>(matrix.derived(), trt);
-    }
+  /** \returns the \a matrix with the inverse transpositions applied to the columns.
+   */
+  template <typename OtherDerived>
+  friend const Product<OtherDerived, Transpose, AliasFreeProduct> operator*(const MatrixBase<OtherDerived>& matrix,
+                                                                            const Transpose& trt) {
+    return Product<OtherDerived, Transpose, AliasFreeProduct>(matrix.derived(), trt);
+  }
 
-    /** \returns the \a matrix with the inverse transpositions applied to the rows.
-      */
-    template<typename OtherDerived>
-    const Product<Transpose, OtherDerived, AliasFreeProduct>
-    operator*(const MatrixBase<OtherDerived>& matrix) const
-    {
-      return Product<Transpose, OtherDerived, AliasFreeProduct>(*this, matrix.derived());
-    }
+  /** \returns the \a matrix with the inverse transpositions applied to the rows.
+   */
+  template <typename OtherDerived>
+  const Product<Transpose, OtherDerived, AliasFreeProduct> operator*(const MatrixBase<OtherDerived>& matrix) const {
+    return Product<Transpose, OtherDerived, AliasFreeProduct>(*this, matrix.derived());
+  }
 
-    EIGEN_DEVICE_FUNC
-    const TranspositionType& nestedExpression() const { return m_transpositions; }
+  EIGEN_DEVICE_FUNC const TranspositionType& nestedExpression() const { return m_transpositions; }
 
-  protected:
-    const TranspositionType& m_transpositions;
+ protected:
+  const TranspositionType& m_transpositions;
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_TRANSPOSITIONS_H
+#endif  // EIGEN_TRANSPOSITIONS_H
diff --git a/Eigen/src/Core/TriangularMatrix.h b/Eigen/src/Core/TriangularMatrix.h
index 44af65d..afdb242 100644
--- a/Eigen/src/Core/TriangularMatrix.h
+++ b/Eigen/src/Core/TriangularMatrix.h
@@ -18,159 +18,133 @@
 
 namespace internal {
 
-template<int Side, typename TriangularType, typename Rhs> struct triangular_solve_retval;
+template <int Side, typename TriangularType, typename Rhs>
+struct triangular_solve_retval;
 
 }
 
 /** \class TriangularBase
-  * \ingroup Core_Module
-  *
-  * \brief Base class for triangular part in a matrix
-  */
-template<typename Derived> class TriangularBase : public EigenBase<Derived>
-{
-  public:
+ * \ingroup Core_Module
+ *
+ * \brief Base class for triangular part in a matrix
+ */
+template <typename Derived>
+class TriangularBase : public EigenBase<Derived> {
+ public:
+  enum {
+    Mode = internal::traits<Derived>::Mode,
+    RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
+    ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
+    MaxRowsAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = internal::traits<Derived>::MaxColsAtCompileTime,
 
-    enum {
-      Mode = internal::traits<Derived>::Mode,
-      RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
-      ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
-      MaxRowsAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime,
-      MaxColsAtCompileTime = internal::traits<Derived>::MaxColsAtCompileTime,
+    SizeAtCompileTime = (internal::size_of_xpr_at_compile_time<Derived>::ret),
+    /**< This is equal to the number of coefficients, i.e. the number of
+     * rows times the number of columns, or to \a Dynamic if this is not
+     * known at compile-time. \sa RowsAtCompileTime, ColsAtCompileTime */
 
-      SizeAtCompileTime = (internal::size_of_xpr_at_compile_time<Derived>::ret),
-      /**< This is equal to the number of coefficients, i.e. the number of
-          * rows times the number of columns, or to \a Dynamic if this is not
-          * known at compile-time. \sa RowsAtCompileTime, ColsAtCompileTime */
+    MaxSizeAtCompileTime = internal::size_at_compile_time(internal::traits<Derived>::MaxRowsAtCompileTime,
+                                                          internal::traits<Derived>::MaxColsAtCompileTime)
 
-      MaxSizeAtCompileTime = internal::size_at_compile_time(internal::traits<Derived>::MaxRowsAtCompileTime,
-                                                            internal::traits<Derived>::MaxColsAtCompileTime)
+  };
+  typedef typename internal::traits<Derived>::Scalar Scalar;
+  typedef typename internal::traits<Derived>::StorageKind StorageKind;
+  typedef typename internal::traits<Derived>::StorageIndex StorageIndex;
+  typedef typename internal::traits<Derived>::FullMatrixType DenseMatrixType;
+  typedef DenseMatrixType DenseType;
+  typedef Derived const& Nested;
 
-    };
-    typedef typename internal::traits<Derived>::Scalar Scalar;
-    typedef typename internal::traits<Derived>::StorageKind StorageKind;
-    typedef typename internal::traits<Derived>::StorageIndex StorageIndex;
-    typedef typename internal::traits<Derived>::FullMatrixType DenseMatrixType;
-    typedef DenseMatrixType DenseType;
-    typedef Derived const& Nested;
+  EIGEN_DEVICE_FUNC inline TriangularBase() {
+    eigen_assert(!((int(Mode) & int(UnitDiag)) && (int(Mode) & int(ZeroDiag))));
+  }
 
-    EIGEN_DEVICE_FUNC
-    inline TriangularBase() { eigen_assert(!((int(Mode) & int(UnitDiag)) && (int(Mode) & int(ZeroDiag)))); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index rows() const EIGEN_NOEXCEPT { return derived().rows(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index cols() const EIGEN_NOEXCEPT { return derived().cols(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index outerStride() const EIGEN_NOEXCEPT { return derived().outerStride(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index innerStride() const EIGEN_NOEXCEPT { return derived().innerStride(); }
 
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index rows() const EIGEN_NOEXCEPT { return derived().rows(); }
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index cols() const EIGEN_NOEXCEPT { return derived().cols(); }
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index outerStride() const EIGEN_NOEXCEPT { return derived().outerStride(); }
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index innerStride() const EIGEN_NOEXCEPT { return derived().innerStride(); }
+  // dummy resize function
+  EIGEN_DEVICE_FUNC void resize(Index rows, Index cols) {
+    EIGEN_UNUSED_VARIABLE(rows);
+    EIGEN_UNUSED_VARIABLE(cols);
+    eigen_assert(rows == this->rows() && cols == this->cols());
+  }
 
-    // dummy resize function
-    EIGEN_DEVICE_FUNC
-    void resize(Index rows, Index cols)
-    {
-      EIGEN_UNUSED_VARIABLE(rows);
-      EIGEN_UNUSED_VARIABLE(cols);
-      eigen_assert(rows==this->rows() && cols==this->cols());
-    }
+  EIGEN_DEVICE_FUNC inline Scalar coeff(Index row, Index col) const { return derived().coeff(row, col); }
+  EIGEN_DEVICE_FUNC inline Scalar& coeffRef(Index row, Index col) { return derived().coeffRef(row, col); }
 
-    EIGEN_DEVICE_FUNC
-    inline Scalar coeff(Index row, Index col) const  { return derived().coeff(row,col); }
-    EIGEN_DEVICE_FUNC
-    inline Scalar& coeffRef(Index row, Index col) { return derived().coeffRef(row,col); }
+  /** \see MatrixBase::copyCoeff(row,col)
+   */
+  template <typename Other>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void copyCoeff(Index row, Index col, Other& other) {
+    derived().coeffRef(row, col) = other.coeff(row, col);
+  }
 
-    /** \see MatrixBase::copyCoeff(row,col)
-      */
-    template<typename Other>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE void copyCoeff(Index row, Index col, Other& other)
-    {
-      derived().coeffRef(row, col) = other.coeff(row, col);
-    }
+  EIGEN_DEVICE_FUNC inline Scalar operator()(Index row, Index col) const {
+    check_coordinates(row, col);
+    return coeff(row, col);
+  }
+  EIGEN_DEVICE_FUNC inline Scalar& operator()(Index row, Index col) {
+    check_coordinates(row, col);
+    return coeffRef(row, col);
+  }
 
-    EIGEN_DEVICE_FUNC
-    inline Scalar operator()(Index row, Index col) const
-    {
-      check_coordinates(row, col);
-      return coeff(row,col);
-    }
-    EIGEN_DEVICE_FUNC
-    inline Scalar& operator()(Index row, Index col)
-    {
-      check_coordinates(row, col);
-      return coeffRef(row,col);
-    }
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  EIGEN_DEVICE_FUNC inline const Derived& derived() const { return *static_cast<const Derived*>(this); }
+  EIGEN_DEVICE_FUNC inline Derived& derived() { return *static_cast<Derived*>(this); }
+#endif  // not EIGEN_PARSED_BY_DOXYGEN
 
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    EIGEN_DEVICE_FUNC
-    inline const Derived& derived() const { return *static_cast<const Derived*>(this); }
-    EIGEN_DEVICE_FUNC
-    inline Derived& derived() { return *static_cast<Derived*>(this); }
-    #endif // not EIGEN_PARSED_BY_DOXYGEN
+  template <typename DenseDerived>
+  EIGEN_DEVICE_FUNC void evalTo(MatrixBase<DenseDerived>& other) const;
+  template <typename DenseDerived>
+  EIGEN_DEVICE_FUNC void evalToLazy(MatrixBase<DenseDerived>& other) const;
 
-    template<typename DenseDerived>
-    EIGEN_DEVICE_FUNC
-    void evalTo(MatrixBase<DenseDerived> &other) const;
-    template<typename DenseDerived>
-    EIGEN_DEVICE_FUNC
-    void evalToLazy(MatrixBase<DenseDerived> &other) const;
+  EIGEN_DEVICE_FUNC DenseMatrixType toDenseMatrix() const {
+    DenseMatrixType res(rows(), cols());
+    evalToLazy(res);
+    return res;
+  }
 
-    EIGEN_DEVICE_FUNC
-    DenseMatrixType toDenseMatrix() const
-    {
-      DenseMatrixType res(rows(), cols());
-      evalToLazy(res);
-      return res;
-    }
+ protected:
+  void check_coordinates(Index row, Index col) const {
+    EIGEN_ONLY_USED_FOR_DEBUG(row);
+    EIGEN_ONLY_USED_FOR_DEBUG(col);
+    eigen_assert(col >= 0 && col < cols() && row >= 0 && row < rows());
+    const int mode = int(Mode) & ~SelfAdjoint;
+    EIGEN_ONLY_USED_FOR_DEBUG(mode);
+    eigen_assert((mode == Upper && col >= row) || (mode == Lower && col <= row) ||
+                 ((mode == StrictlyUpper || mode == UnitUpper) && col > row) ||
+                 ((mode == StrictlyLower || mode == UnitLower) && col < row));
+  }
 
-  protected:
-
-    void check_coordinates(Index row, Index col) const
-    {
-      EIGEN_ONLY_USED_FOR_DEBUG(row);
-      EIGEN_ONLY_USED_FOR_DEBUG(col);
-      eigen_assert(col>=0 && col<cols() && row>=0 && row<rows());
-      const int mode = int(Mode) & ~SelfAdjoint;
-      EIGEN_ONLY_USED_FOR_DEBUG(mode);
-      eigen_assert((mode==Upper && col>=row)
-                || (mode==Lower && col<=row)
-                || ((mode==StrictlyUpper || mode==UnitUpper) && col>row)
-                || ((mode==StrictlyLower || mode==UnitLower) && col<row));
-    }
-
-    #ifdef EIGEN_INTERNAL_DEBUGGING
-    void check_coordinates_internal(Index row, Index col) const
-    {
-      check_coordinates(row, col);
-    }
-    #else
-    void check_coordinates_internal(Index , Index ) const {}
-    #endif
-
+#ifdef EIGEN_INTERNAL_DEBUGGING
+  void check_coordinates_internal(Index row, Index col) const { check_coordinates(row, col); }
+#else
+  void check_coordinates_internal(Index, Index) const {}
+#endif
 };
 
 /** \class TriangularView
-  * \ingroup Core_Module
-  *
-  * \brief Expression of a triangular part in a matrix
-  *
-  * \tparam MatrixType the type of the object in which we are taking the triangular part
-  * \tparam Mode the kind of triangular matrix expression to construct. Can be #Upper,
-  *             #Lower, #UnitUpper, #UnitLower, #StrictlyUpper, or #StrictlyLower.
-  *             This is in fact a bit field; it must have either #Upper or #Lower,
-  *             and additionally it may have #UnitDiag or #ZeroDiag or neither.
-  *
-  * This class represents a triangular part of a matrix, not necessarily square. Strictly speaking, for rectangular
-  * matrices one should speak of "trapezoid" parts. This class is the return type
-  * of MatrixBase::triangularView() and SparseMatrixBase::triangularView(), and most of the time this is the only way it is used.
-  *
-  * \sa MatrixBase::triangularView()
-  */
+ * \ingroup Core_Module
+ *
+ * \brief Expression of a triangular part in a matrix
+ *
+ * \tparam MatrixType the type of the object in which we are taking the triangular part
+ * \tparam Mode the kind of triangular matrix expression to construct. Can be #Upper,
+ *             #Lower, #UnitUpper, #UnitLower, #StrictlyUpper, or #StrictlyLower.
+ *             This is in fact a bit field; it must have either #Upper or #Lower,
+ *             and additionally it may have #UnitDiag or #ZeroDiag or neither.
+ *
+ * This class represents a triangular part of a matrix, not necessarily square. Strictly speaking, for rectangular
+ * matrices one should speak of "trapezoid" parts. This class is the return type
+ * of MatrixBase::triangularView() and SparseMatrixBase::triangularView(), and most of the time this is the only way it
+ * is used.
+ *
+ * \sa MatrixBase::triangularView()
+ */
 namespace internal {
-template<typename MatrixType, unsigned int Mode_>
-struct traits<TriangularView<MatrixType, Mode_> > : traits<MatrixType>
-{
+template <typename MatrixType, unsigned int Mode_>
+struct traits<TriangularView<MatrixType, Mode_>> : traits<MatrixType> {
   typedef typename ref_selector<MatrixType>::non_const_type MatrixTypeNested;
   typedef std::remove_reference_t<MatrixTypeNested> MatrixTypeNestedNonRef;
   typedef remove_all_t<MatrixTypeNested> MatrixTypeNestedCleaned;
@@ -179,537 +153,472 @@
   enum {
     Mode = Mode_,
     FlagsLvalueBit = is_lvalue<MatrixType>::value ? LvalueBit : 0,
-    Flags = (MatrixTypeNestedCleaned::Flags & (HereditaryBits | FlagsLvalueBit) & (~(PacketAccessBit | DirectAccessBit | LinearAccessBit)))
+    Flags = (MatrixTypeNestedCleaned::Flags & (HereditaryBits | FlagsLvalueBit) &
+             (~(PacketAccessBit | DirectAccessBit | LinearAccessBit)))
   };
 };
-}
+}  // namespace internal
 
-template<typename MatrixType_, unsigned int Mode_, typename StorageKind> class TriangularViewImpl;
+template <typename MatrixType_, unsigned int Mode_, typename StorageKind>
+class TriangularViewImpl;
 
-template<typename MatrixType_, unsigned int Mode_> class TriangularView
-  : public TriangularViewImpl<MatrixType_, Mode_, typename internal::traits<MatrixType_>::StorageKind >
-{
-  public:
+template <typename MatrixType_, unsigned int Mode_>
+class TriangularView
+    : public TriangularViewImpl<MatrixType_, Mode_, typename internal::traits<MatrixType_>::StorageKind> {
+ public:
+  typedef TriangularViewImpl<MatrixType_, Mode_, typename internal::traits<MatrixType_>::StorageKind> Base;
+  typedef typename internal::traits<TriangularView>::Scalar Scalar;
+  typedef MatrixType_ MatrixType;
 
-    typedef TriangularViewImpl<MatrixType_, Mode_, typename internal::traits<MatrixType_>::StorageKind > Base;
-    typedef typename internal::traits<TriangularView>::Scalar Scalar;
-    typedef MatrixType_ MatrixType;
+ protected:
+  typedef typename internal::traits<TriangularView>::MatrixTypeNested MatrixTypeNested;
+  typedef typename internal::traits<TriangularView>::MatrixTypeNestedNonRef MatrixTypeNestedNonRef;
 
-  protected:
-    typedef typename internal::traits<TriangularView>::MatrixTypeNested MatrixTypeNested;
-    typedef typename internal::traits<TriangularView>::MatrixTypeNestedNonRef MatrixTypeNestedNonRef;
+  typedef internal::remove_all_t<typename MatrixType::ConjugateReturnType> MatrixConjugateReturnType;
+  typedef TriangularView<std::add_const_t<MatrixType>, Mode_> ConstTriangularView;
 
-    typedef internal::remove_all_t<typename MatrixType::ConjugateReturnType> MatrixConjugateReturnType;
-    typedef TriangularView<std::add_const_t<MatrixType>, Mode_> ConstTriangularView;
+ public:
+  typedef typename internal::traits<TriangularView>::StorageKind StorageKind;
+  typedef typename internal::traits<TriangularView>::MatrixTypeNestedCleaned NestedExpression;
 
-  public:
+  enum {
+    Mode = Mode_,
+    Flags = internal::traits<TriangularView>::Flags,
+    TransposeMode = (Mode & Upper ? Lower : 0) | (Mode & Lower ? Upper : 0) | (Mode & (UnitDiag)) | (Mode & (ZeroDiag)),
+    IsVectorAtCompileTime = false
+  };
 
-    typedef typename internal::traits<TriangularView>::StorageKind StorageKind;
-    typedef typename internal::traits<TriangularView>::MatrixTypeNestedCleaned NestedExpression;
+  EIGEN_DEVICE_FUNC explicit inline TriangularView(MatrixType& matrix) : m_matrix(matrix) {}
 
-    enum {
-      Mode = Mode_,
-      Flags = internal::traits<TriangularView>::Flags,
-      TransposeMode = (Mode & Upper ? Lower : 0)
-                    | (Mode & Lower ? Upper : 0)
-                    | (Mode & (UnitDiag))
-                    | (Mode & (ZeroDiag)),
-      IsVectorAtCompileTime = false
-    };
+  EIGEN_INHERIT_ASSIGNMENT_OPERATORS(TriangularView)
 
-    EIGEN_DEVICE_FUNC
-    explicit inline TriangularView(MatrixType& matrix) : m_matrix(matrix)
-    {}
+  /** \copydoc EigenBase::rows() */
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index rows() const EIGEN_NOEXCEPT { return m_matrix.rows(); }
+  /** \copydoc EigenBase::cols() */
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index cols() const EIGEN_NOEXCEPT { return m_matrix.cols(); }
 
-    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(TriangularView)
+  /** \returns a const reference to the nested expression */
+  EIGEN_DEVICE_FUNC const NestedExpression& nestedExpression() const { return m_matrix; }
 
-    /** \copydoc EigenBase::rows() */
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index rows() const EIGEN_NOEXCEPT { return m_matrix.rows(); }
-    /** \copydoc EigenBase::cols() */
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index cols() const EIGEN_NOEXCEPT { return m_matrix.cols(); }
+  /** \returns a reference to the nested expression */
+  EIGEN_DEVICE_FUNC NestedExpression& nestedExpression() { return m_matrix; }
 
-    /** \returns a const reference to the nested expression */
-    EIGEN_DEVICE_FUNC
-    const NestedExpression& nestedExpression() const { return m_matrix; }
+  typedef TriangularView<const MatrixConjugateReturnType, Mode> ConjugateReturnType;
+  /** \sa MatrixBase::conjugate() const */
+  EIGEN_DEVICE_FUNC inline const ConjugateReturnType conjugate() const {
+    return ConjugateReturnType(m_matrix.conjugate());
+  }
 
-    /** \returns a reference to the nested expression */
-    EIGEN_DEVICE_FUNC
-    NestedExpression& nestedExpression() { return m_matrix; }
+  /** \returns an expression of the complex conjugate of \c *this if Cond==true,
+   *           returns \c *this otherwise.
+   */
+  template <bool Cond>
+  EIGEN_DEVICE_FUNC inline std::conditional_t<Cond, ConjugateReturnType, ConstTriangularView> conjugateIf() const {
+    typedef std::conditional_t<Cond, ConjugateReturnType, ConstTriangularView> ReturnType;
+    return ReturnType(m_matrix.template conjugateIf<Cond>());
+  }
 
-    typedef TriangularView<const MatrixConjugateReturnType,Mode> ConjugateReturnType;
-    /** \sa MatrixBase::conjugate() const */
-    EIGEN_DEVICE_FUNC
-    inline const ConjugateReturnType conjugate() const
-    { return ConjugateReturnType(m_matrix.conjugate()); }
+  typedef TriangularView<const typename MatrixType::AdjointReturnType, TransposeMode> AdjointReturnType;
+  /** \sa MatrixBase::adjoint() const */
+  EIGEN_DEVICE_FUNC inline const AdjointReturnType adjoint() const { return AdjointReturnType(m_matrix.adjoint()); }
 
-    /** \returns an expression of the complex conjugate of \c *this if Cond==true,
-     *           returns \c *this otherwise.
-     */
-    template<bool Cond>
-    EIGEN_DEVICE_FUNC
-    inline std::conditional_t<Cond,ConjugateReturnType,ConstTriangularView>
-    conjugateIf() const
-    {
-      typedef std::conditional_t<Cond,ConjugateReturnType,ConstTriangularView> ReturnType;
-      return ReturnType(m_matrix.template conjugateIf<Cond>());
-    }
+  typedef TriangularView<typename MatrixType::TransposeReturnType, TransposeMode> TransposeReturnType;
+  /** \sa MatrixBase::transpose() */
+  template <class Dummy = int>
+  EIGEN_DEVICE_FUNC inline TransposeReturnType transpose(
+      std::enable_if_t<Eigen::internal::is_lvalue<MatrixType>::value, Dummy*> = nullptr) {
+    typename MatrixType::TransposeReturnType tmp(m_matrix);
+    return TransposeReturnType(tmp);
+  }
 
-    typedef TriangularView<const typename MatrixType::AdjointReturnType,TransposeMode> AdjointReturnType;
-    /** \sa MatrixBase::adjoint() const */
-    EIGEN_DEVICE_FUNC
-    inline const AdjointReturnType adjoint() const
-    { return AdjointReturnType(m_matrix.adjoint()); }
+  typedef TriangularView<const typename MatrixType::ConstTransposeReturnType, TransposeMode> ConstTransposeReturnType;
+  /** \sa MatrixBase::transpose() const */
+  EIGEN_DEVICE_FUNC inline const ConstTransposeReturnType transpose() const {
+    return ConstTransposeReturnType(m_matrix.transpose());
+  }
 
-    typedef TriangularView<typename MatrixType::TransposeReturnType,TransposeMode> TransposeReturnType;
-     /** \sa MatrixBase::transpose() */
-    template<class Dummy=int>
-    EIGEN_DEVICE_FUNC
-    inline TransposeReturnType transpose(std::enable_if_t<Eigen::internal::is_lvalue<MatrixType>::value, Dummy*> = nullptr)
-    {
-      typename MatrixType::TransposeReturnType tmp(m_matrix);
-      return TransposeReturnType(tmp);
-    }
+  template <typename Other>
+  EIGEN_DEVICE_FUNC inline const Solve<TriangularView, Other> solve(const MatrixBase<Other>& other) const {
+    return Solve<TriangularView, Other>(*this, other.derived());
+  }
 
-    typedef TriangularView<const typename MatrixType::ConstTransposeReturnType,TransposeMode> ConstTransposeReturnType;
-    /** \sa MatrixBase::transpose() const */
-    EIGEN_DEVICE_FUNC
-    inline const ConstTransposeReturnType transpose() const
-    {
-      return ConstTransposeReturnType(m_matrix.transpose());
-    }
+// workaround MSVC ICE
+#if EIGEN_COMP_MSVC
+  template <int Side, typename Other>
+  EIGEN_DEVICE_FUNC inline const internal::triangular_solve_retval<Side, TriangularView, Other> solve(
+      const MatrixBase<Other>& other) const {
+    return Base::template solve<Side>(other);
+  }
+#else
+  using Base::solve;
+#endif
 
-    template<typename Other>
-    EIGEN_DEVICE_FUNC
-    inline const Solve<TriangularView, Other>
-    solve(const MatrixBase<Other>& other) const
-    { return Solve<TriangularView, Other>(*this, other.derived()); }
+  /** \returns a selfadjoint view of the referenced triangular part which must be either \c #Upper or \c #Lower.
+   *
+   * This is a shortcut for \code this->nestedExpression().selfadjointView<(*this)::Mode>() \endcode
+   * \sa MatrixBase::selfadjointView() */
+  EIGEN_DEVICE_FUNC SelfAdjointView<MatrixTypeNestedNonRef, Mode> selfadjointView() {
+    EIGEN_STATIC_ASSERT((Mode & (UnitDiag | ZeroDiag)) == 0, PROGRAMMING_ERROR);
+    return SelfAdjointView<MatrixTypeNestedNonRef, Mode>(m_matrix);
+  }
 
-  // workaround MSVC ICE
-  #if EIGEN_COMP_MSVC
-    template<int Side, typename Other>
-    EIGEN_DEVICE_FUNC
-    inline const internal::triangular_solve_retval<Side,TriangularView, Other>
-    solve(const MatrixBase<Other>& other) const
-    { return Base::template solve<Side>(other); }
-  #else
-    using Base::solve;
-  #endif
+  /** This is the const version of selfadjointView() */
+  EIGEN_DEVICE_FUNC const SelfAdjointView<MatrixTypeNestedNonRef, Mode> selfadjointView() const {
+    EIGEN_STATIC_ASSERT((Mode & (UnitDiag | ZeroDiag)) == 0, PROGRAMMING_ERROR);
+    return SelfAdjointView<MatrixTypeNestedNonRef, Mode>(m_matrix);
+  }
 
-    /** \returns a selfadjoint view of the referenced triangular part which must be either \c #Upper or \c #Lower.
-      *
-      * This is a shortcut for \code this->nestedExpression().selfadjointView<(*this)::Mode>() \endcode
-      * \sa MatrixBase::selfadjointView() */
-    EIGEN_DEVICE_FUNC
-    SelfAdjointView<MatrixTypeNestedNonRef,Mode> selfadjointView()
-    {
-      EIGEN_STATIC_ASSERT((Mode&(UnitDiag|ZeroDiag))==0,PROGRAMMING_ERROR);
-      return SelfAdjointView<MatrixTypeNestedNonRef,Mode>(m_matrix);
-    }
+  /** \returns the determinant of the triangular matrix
+   * \sa MatrixBase::determinant() */
+  EIGEN_DEVICE_FUNC Scalar determinant() const {
+    if (Mode & UnitDiag)
+      return 1;
+    else if (Mode & ZeroDiag)
+      return 0;
+    else
+      return m_matrix.diagonal().prod();
+  }
 
-    /** This is the const version of selfadjointView() */
-    EIGEN_DEVICE_FUNC
-    const SelfAdjointView<MatrixTypeNestedNonRef,Mode> selfadjointView() const
-    {
-      EIGEN_STATIC_ASSERT((Mode&(UnitDiag|ZeroDiag))==0,PROGRAMMING_ERROR);
-      return SelfAdjointView<MatrixTypeNestedNonRef,Mode>(m_matrix);
-    }
-
-
-    /** \returns the determinant of the triangular matrix
-      * \sa MatrixBase::determinant() */
-    EIGEN_DEVICE_FUNC
-    Scalar determinant() const
-    {
-      if (Mode & UnitDiag)
-        return 1;
-      else if (Mode & ZeroDiag)
-        return 0;
-      else
-        return m_matrix.diagonal().prod();
-    }
-
-  protected:
-
-    MatrixTypeNested m_matrix;
+ protected:
+  MatrixTypeNested m_matrix;
 };
 
 /** \ingroup Core_Module
-  *
-  * \brief Base class for a triangular part in a \b dense matrix
-  *
-  * This class is an abstract base class of class TriangularView, and objects of type TriangularViewImpl cannot be instantiated.
-  * It extends class TriangularView with additional methods which available for dense expressions only.
-  *
-  * \sa class TriangularView, MatrixBase::triangularView()
-  */
-template<typename MatrixType_, unsigned int Mode_> class TriangularViewImpl<MatrixType_,Mode_,Dense>
-  : public TriangularBase<TriangularView<MatrixType_, Mode_> >
-{
-  public:
+ *
+ * \brief Base class for a triangular part in a \b dense matrix
+ *
+ * This class is an abstract base class of class TriangularView, and objects of type TriangularViewImpl cannot be
+ * instantiated. It extends class TriangularView with additional methods which available for dense expressions only.
+ *
+ * \sa class TriangularView, MatrixBase::triangularView()
+ */
+template <typename MatrixType_, unsigned int Mode_>
+class TriangularViewImpl<MatrixType_, Mode_, Dense> : public TriangularBase<TriangularView<MatrixType_, Mode_>> {
+ public:
+  typedef TriangularView<MatrixType_, Mode_> TriangularViewType;
 
-    typedef TriangularView<MatrixType_, Mode_> TriangularViewType;
+  typedef TriangularBase<TriangularViewType> Base;
+  typedef typename internal::traits<TriangularViewType>::Scalar Scalar;
 
-    typedef TriangularBase<TriangularViewType> Base;
-    typedef typename internal::traits<TriangularViewType>::Scalar Scalar;
+  typedef MatrixType_ MatrixType;
+  typedef typename MatrixType::PlainObject DenseMatrixType;
+  typedef DenseMatrixType PlainObject;
 
-    typedef MatrixType_ MatrixType;
-    typedef typename MatrixType::PlainObject DenseMatrixType;
-    typedef DenseMatrixType PlainObject;
+ public:
+  using Base::derived;
+  using Base::evalToLazy;
 
-  public:
-    using Base::evalToLazy;
-    using Base::derived;
+  typedef typename internal::traits<TriangularViewType>::StorageKind StorageKind;
 
-    typedef typename internal::traits<TriangularViewType>::StorageKind StorageKind;
+  enum { Mode = Mode_, Flags = internal::traits<TriangularViewType>::Flags };
 
-    enum {
-      Mode = Mode_,
-      Flags = internal::traits<TriangularViewType>::Flags
-    };
+  /** \returns the outer-stride of the underlying dense matrix
+   * \sa DenseCoeffsBase::outerStride() */
+  EIGEN_DEVICE_FUNC inline Index outerStride() const { return derived().nestedExpression().outerStride(); }
+  /** \returns the inner-stride of the underlying dense matrix
+   * \sa DenseCoeffsBase::innerStride() */
+  EIGEN_DEVICE_FUNC inline Index innerStride() const { return derived().nestedExpression().innerStride(); }
 
-    /** \returns the outer-stride of the underlying dense matrix
-      * \sa DenseCoeffsBase::outerStride() */
-    EIGEN_DEVICE_FUNC
-    inline Index outerStride() const { return derived().nestedExpression().outerStride(); }
-    /** \returns the inner-stride of the underlying dense matrix
-      * \sa DenseCoeffsBase::innerStride() */
-    EIGEN_DEVICE_FUNC
-    inline Index innerStride() const { return derived().nestedExpression().innerStride(); }
+  /** \sa MatrixBase::operator+=() */
+  template <typename Other>
+  EIGEN_DEVICE_FUNC TriangularViewType& operator+=(const DenseBase<Other>& other) {
+    internal::call_assignment_no_alias(derived(), other.derived(),
+                                       internal::add_assign_op<Scalar, typename Other::Scalar>());
+    return derived();
+  }
+  /** \sa MatrixBase::operator-=() */
+  template <typename Other>
+  EIGEN_DEVICE_FUNC TriangularViewType& operator-=(const DenseBase<Other>& other) {
+    internal::call_assignment_no_alias(derived(), other.derived(),
+                                       internal::sub_assign_op<Scalar, typename Other::Scalar>());
+    return derived();
+  }
 
-    /** \sa MatrixBase::operator+=() */
-    template<typename Other>
-    EIGEN_DEVICE_FUNC
-    TriangularViewType&  operator+=(const DenseBase<Other>& other) {
-      internal::call_assignment_no_alias(derived(), other.derived(), internal::add_assign_op<Scalar,typename Other::Scalar>());
-      return derived();
-    }
-    /** \sa MatrixBase::operator-=() */
-    template<typename Other>
-    EIGEN_DEVICE_FUNC
-    TriangularViewType&  operator-=(const DenseBase<Other>& other) {
-      internal::call_assignment_no_alias(derived(), other.derived(), internal::sub_assign_op<Scalar,typename Other::Scalar>());
-      return derived();
-    }
+  /** \sa MatrixBase::operator*=() */
+  EIGEN_DEVICE_FUNC TriangularViewType& operator*=(const typename internal::traits<MatrixType>::Scalar& other) {
+    return *this = derived().nestedExpression() * other;
+  }
+  /** \sa DenseBase::operator/=() */
+  EIGEN_DEVICE_FUNC TriangularViewType& operator/=(const typename internal::traits<MatrixType>::Scalar& other) {
+    return *this = derived().nestedExpression() / other;
+  }
 
-    /** \sa MatrixBase::operator*=() */
-    EIGEN_DEVICE_FUNC
-    TriangularViewType&  operator*=(const typename internal::traits<MatrixType>::Scalar& other) { return *this = derived().nestedExpression() * other; }
-    /** \sa DenseBase::operator/=() */
-    EIGEN_DEVICE_FUNC
-    TriangularViewType&  operator/=(const typename internal::traits<MatrixType>::Scalar& other) { return *this = derived().nestedExpression() / other; }
+  /** \sa MatrixBase::fill() */
+  EIGEN_DEVICE_FUNC void fill(const Scalar& value) { setConstant(value); }
+  /** \sa MatrixBase::setConstant() */
+  EIGEN_DEVICE_FUNC TriangularViewType& setConstant(const Scalar& value) {
+    return *this = MatrixType::Constant(derived().rows(), derived().cols(), value);
+  }
+  /** \sa MatrixBase::setZero() */
+  EIGEN_DEVICE_FUNC TriangularViewType& setZero() { return setConstant(Scalar(0)); }
+  /** \sa MatrixBase::setOnes() */
+  EIGEN_DEVICE_FUNC TriangularViewType& setOnes() { return setConstant(Scalar(1)); }
 
-    /** \sa MatrixBase::fill() */
-    EIGEN_DEVICE_FUNC
-    void fill(const Scalar& value) { setConstant(value); }
-    /** \sa MatrixBase::setConstant() */
-    EIGEN_DEVICE_FUNC
-    TriangularViewType& setConstant(const Scalar& value)
-    { return *this = MatrixType::Constant(derived().rows(), derived().cols(), value); }
-    /** \sa MatrixBase::setZero() */
-    EIGEN_DEVICE_FUNC
-    TriangularViewType& setZero() { return setConstant(Scalar(0)); }
-    /** \sa MatrixBase::setOnes() */
-    EIGEN_DEVICE_FUNC
-    TriangularViewType& setOnes() { return setConstant(Scalar(1)); }
+  /** \sa MatrixBase::coeff()
+   * \warning the coordinates must fit into the referenced triangular part
+   */
+  EIGEN_DEVICE_FUNC inline Scalar coeff(Index row, Index col) const {
+    Base::check_coordinates_internal(row, col);
+    return derived().nestedExpression().coeff(row, col);
+  }
 
-    /** \sa MatrixBase::coeff()
-      * \warning the coordinates must fit into the referenced triangular part
-      */
-    EIGEN_DEVICE_FUNC
-    inline Scalar coeff(Index row, Index col) const
-    {
-      Base::check_coordinates_internal(row, col);
-      return derived().nestedExpression().coeff(row, col);
-    }
+  /** \sa MatrixBase::coeffRef()
+   * \warning the coordinates must fit into the referenced triangular part
+   */
+  EIGEN_DEVICE_FUNC inline Scalar& coeffRef(Index row, Index col) {
+    EIGEN_STATIC_ASSERT_LVALUE(TriangularViewType);
+    Base::check_coordinates_internal(row, col);
+    return derived().nestedExpression().coeffRef(row, col);
+  }
 
-    /** \sa MatrixBase::coeffRef()
-      * \warning the coordinates must fit into the referenced triangular part
-      */
-    EIGEN_DEVICE_FUNC
-    inline Scalar& coeffRef(Index row, Index col)
-    {
-      EIGEN_STATIC_ASSERT_LVALUE(TriangularViewType);
-      Base::check_coordinates_internal(row, col);
-      return derived().nestedExpression().coeffRef(row, col);
-    }
+  /** Assigns a triangular matrix to a triangular part of a dense matrix */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC TriangularViewType& operator=(const TriangularBase<OtherDerived>& other);
 
-    /** Assigns a triangular matrix to a triangular part of a dense matrix */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    TriangularViewType& operator=(const TriangularBase<OtherDerived>& other);
-
-    /** Shortcut for\code *this = other.other.triangularView<(*this)::Mode>() \endcode */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    TriangularViewType& operator=(const MatrixBase<OtherDerived>& other);
+  /** Shortcut for\code *this = other.other.triangularView<(*this)::Mode>() \endcode */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC TriangularViewType& operator=(const MatrixBase<OtherDerived>& other);
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-    EIGEN_DEVICE_FUNC
-    TriangularViewType& operator=(const TriangularViewImpl& other)
-    { return *this = other.derived().nestedExpression(); }
+  EIGEN_DEVICE_FUNC TriangularViewType& operator=(const TriangularViewImpl& other) {
+    return *this = other.derived().nestedExpression();
+  }
 
-    template<typename OtherDerived>
-    /** \deprecated */
-    EIGEN_DEPRECATED EIGEN_DEVICE_FUNC
-    void lazyAssign(const TriangularBase<OtherDerived>& other);
+  template <typename OtherDerived>
+  /** \deprecated */
+  EIGEN_DEPRECATED EIGEN_DEVICE_FUNC void lazyAssign(const TriangularBase<OtherDerived>& other);
 
-    template<typename OtherDerived>
-    /** \deprecated */
-    EIGEN_DEPRECATED EIGEN_DEVICE_FUNC
-    void lazyAssign(const MatrixBase<OtherDerived>& other);
+  template <typename OtherDerived>
+  /** \deprecated */
+  EIGEN_DEPRECATED EIGEN_DEVICE_FUNC void lazyAssign(const MatrixBase<OtherDerived>& other);
 #endif
 
-    /** Efficient triangular matrix times vector/matrix product */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    const Product<TriangularViewType,OtherDerived>
-    operator*(const MatrixBase<OtherDerived>& rhs) const
-    {
-      return Product<TriangularViewType,OtherDerived>(derived(), rhs.derived());
-    }
+  /** Efficient triangular matrix times vector/matrix product */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC const Product<TriangularViewType, OtherDerived> operator*(
+      const MatrixBase<OtherDerived>& rhs) const {
+    return Product<TriangularViewType, OtherDerived>(derived(), rhs.derived());
+  }
 
-    /** Efficient vector/matrix times triangular matrix product */
-    template<typename OtherDerived> friend
-    EIGEN_DEVICE_FUNC
-    const Product<OtherDerived,TriangularViewType>
-    operator*(const MatrixBase<OtherDerived>& lhs, const TriangularViewImpl& rhs)
-    {
-      return Product<OtherDerived,TriangularViewType>(lhs.derived(),rhs.derived());
-    }
+  /** Efficient vector/matrix times triangular matrix product */
+  template <typename OtherDerived>
+  friend EIGEN_DEVICE_FUNC const Product<OtherDerived, TriangularViewType> operator*(
+      const MatrixBase<OtherDerived>& lhs, const TriangularViewImpl& rhs) {
+    return Product<OtherDerived, TriangularViewType>(lhs.derived(), rhs.derived());
+  }
 
-    /** \returns the product of the inverse of \c *this with \a other, \a *this being triangular.
-      *
-      * This function computes the inverse-matrix matrix product inverse(\c *this) * \a other if
-      * \a Side==OnTheLeft (the default), or the right-inverse-multiply  \a other * inverse(\c *this) if
-      * \a Side==OnTheRight.
-      *
-      * Note that the template parameter \c Side can be omitted, in which case \c Side==OnTheLeft
-      *
-      * The matrix \c *this must be triangular and invertible (i.e., all the coefficients of the
-      * diagonal must be non zero). It works as a forward (resp. backward) substitution if \c *this
-      * is an upper (resp. lower) triangular matrix.
-      *
-      * Example: \include Triangular_solve.cpp
-      * Output: \verbinclude Triangular_solve.out
-      *
-      * This function returns an expression of the inverse-multiply and can works in-place if it is assigned
-      * to the same matrix or vector \a other.
-      *
-      * For users coming from BLAS, this function (and more specifically solveInPlace()) offer
-      * all the operations supported by the \c *TRSV and \c *TRSM BLAS routines.
-      *
-      * \sa TriangularView::solveInPlace()
-      */
-    template<int Side, typename Other>
-    inline const internal::triangular_solve_retval<Side,TriangularViewType, Other>
-    solve(const MatrixBase<Other>& other) const;
+  /** \returns the product of the inverse of \c *this with \a other, \a *this being triangular.
+   *
+   * This function computes the inverse-matrix matrix product inverse(\c *this) * \a other if
+   * \a Side==OnTheLeft (the default), or the right-inverse-multiply  \a other * inverse(\c *this) if
+   * \a Side==OnTheRight.
+   *
+   * Note that the template parameter \c Side can be omitted, in which case \c Side==OnTheLeft
+   *
+   * The matrix \c *this must be triangular and invertible (i.e., all the coefficients of the
+   * diagonal must be non zero). It works as a forward (resp. backward) substitution if \c *this
+   * is an upper (resp. lower) triangular matrix.
+   *
+   * Example: \include Triangular_solve.cpp
+   * Output: \verbinclude Triangular_solve.out
+   *
+   * This function returns an expression of the inverse-multiply and can works in-place if it is assigned
+   * to the same matrix or vector \a other.
+   *
+   * For users coming from BLAS, this function (and more specifically solveInPlace()) offer
+   * all the operations supported by the \c *TRSV and \c *TRSM BLAS routines.
+   *
+   * \sa TriangularView::solveInPlace()
+   */
+  template <int Side, typename Other>
+  inline const internal::triangular_solve_retval<Side, TriangularViewType, Other> solve(
+      const MatrixBase<Other>& other) const;
 
-    /** "in-place" version of TriangularView::solve() where the result is written in \a other
-      *
-      * \warning The parameter is only marked 'const' to make the C++ compiler accept a temporary expression here.
-      * This function will const_cast it, so constness isn't honored here.
-      *
-      * Note that the template parameter \c Side can be omitted, in which case \c Side==OnTheLeft
-      *
-      * See TriangularView:solve() for the details.
-      */
-    template<int Side, typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    void solveInPlace(const MatrixBase<OtherDerived>& other) const;
+  /** "in-place" version of TriangularView::solve() where the result is written in \a other
+   *
+   * \warning The parameter is only marked 'const' to make the C++ compiler accept a temporary expression here.
+   * This function will const_cast it, so constness isn't honored here.
+   *
+   * Note that the template parameter \c Side can be omitted, in which case \c Side==OnTheLeft
+   *
+   * See TriangularView:solve() for the details.
+   */
+  template <int Side, typename OtherDerived>
+  EIGEN_DEVICE_FUNC void solveInPlace(const MatrixBase<OtherDerived>& other) const;
 
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    void solveInPlace(const MatrixBase<OtherDerived>& other) const
-    { return solveInPlace<OnTheLeft>(other); }
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC void solveInPlace(const MatrixBase<OtherDerived>& other) const {
+    return solveInPlace<OnTheLeft>(other);
+  }
 
-    /** Swaps the coefficients of the common triangular parts of two matrices */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
+  /** Swaps the coefficients of the common triangular parts of two matrices */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC
 #ifdef EIGEN_PARSED_BY_DOXYGEN
-    void swap(TriangularBase<OtherDerived> &other)
+      void
+      swap(TriangularBase<OtherDerived>& other)
 #else
-    void swap(TriangularBase<OtherDerived> const & other)
+      void
+      swap(TriangularBase<OtherDerived> const& other)
 #endif
-    {
-      EIGEN_STATIC_ASSERT_LVALUE(OtherDerived);
-      call_assignment(derived(), other.const_cast_derived(), internal::swap_assign_op<Scalar>());
-    }
+  {
+    EIGEN_STATIC_ASSERT_LVALUE(OtherDerived);
+    call_assignment(derived(), other.const_cast_derived(), internal::swap_assign_op<Scalar>());
+  }
 
-    /** Shortcut for \code (*this).swap(other.triangularView<(*this)::Mode>()) \endcode */
-    template<typename OtherDerived>
-    /** \deprecated */
-    EIGEN_DEPRECATED EIGEN_DEVICE_FUNC
-    void swap(MatrixBase<OtherDerived> const & other)
-    {
-      EIGEN_STATIC_ASSERT_LVALUE(OtherDerived);
-      call_assignment(derived(), other.const_cast_derived(), internal::swap_assign_op<Scalar>());
-    }
+  /** Shortcut for \code (*this).swap(other.triangularView<(*this)::Mode>()) \endcode */
+  template <typename OtherDerived>
+  /** \deprecated */
+  EIGEN_DEPRECATED EIGEN_DEVICE_FUNC void swap(MatrixBase<OtherDerived> const& other) {
+    EIGEN_STATIC_ASSERT_LVALUE(OtherDerived);
+    call_assignment(derived(), other.const_cast_derived(), internal::swap_assign_op<Scalar>());
+  }
 
-    template<typename RhsType, typename DstType>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE void _solve_impl(const RhsType &rhs, DstType &dst) const {
-      if(!internal::is_same_dense(dst,rhs))
-        dst = rhs;
-      this->solveInPlace(dst);
-    }
+  template <typename RhsType, typename DstType>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void _solve_impl(const RhsType& rhs, DstType& dst) const {
+    if (!internal::is_same_dense(dst, rhs)) dst = rhs;
+    this->solveInPlace(dst);
+  }
 
-    template<typename ProductType>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE TriangularViewType& _assignProduct(const ProductType& prod, const Scalar& alpha, bool beta);
-  protected:
-    EIGEN_DEFAULT_COPY_CONSTRUCTOR(TriangularViewImpl)
-    EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(TriangularViewImpl)
+  template <typename ProductType>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TriangularViewType& _assignProduct(const ProductType& prod, const Scalar& alpha,
+                                                                           bool beta);
 
+ protected:
+  EIGEN_DEFAULT_COPY_CONSTRUCTOR(TriangularViewImpl)
+  EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(TriangularViewImpl)
 };
 
 /***************************************************************************
-* Implementation of triangular evaluation/assignment
-***************************************************************************/
+ * Implementation of triangular evaluation/assignment
+ ***************************************************************************/
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
 // FIXME should we keep that possibility
-template<typename MatrixType, unsigned int Mode>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC inline TriangularView<MatrixType, Mode>&
-TriangularViewImpl<MatrixType, Mode, Dense>::operator=(const MatrixBase<OtherDerived>& other)
-{
-  internal::call_assignment_no_alias(derived(), other.derived(), internal::assign_op<Scalar,typename OtherDerived::Scalar>());
+template <typename MatrixType, unsigned int Mode>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC inline TriangularView<MatrixType, Mode>& TriangularViewImpl<MatrixType, Mode, Dense>::operator=(
+    const MatrixBase<OtherDerived>& other) {
+  internal::call_assignment_no_alias(derived(), other.derived(),
+                                     internal::assign_op<Scalar, typename OtherDerived::Scalar>());
   return derived();
 }
 
 // FIXME should we keep that possibility
-template<typename MatrixType, unsigned int Mode>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC void TriangularViewImpl<MatrixType, Mode, Dense>::lazyAssign(const MatrixBase<OtherDerived>& other)
-{
+template <typename MatrixType, unsigned int Mode>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC void TriangularViewImpl<MatrixType, Mode, Dense>::lazyAssign(const MatrixBase<OtherDerived>& other) {
   internal::call_assignment_no_alias(derived(), other.template triangularView<Mode>());
 }
 
-
-
-template<typename MatrixType, unsigned int Mode>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC inline TriangularView<MatrixType, Mode>&
-TriangularViewImpl<MatrixType, Mode, Dense>::operator=(const TriangularBase<OtherDerived>& other)
-{
+template <typename MatrixType, unsigned int Mode>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC inline TriangularView<MatrixType, Mode>& TriangularViewImpl<MatrixType, Mode, Dense>::operator=(
+    const TriangularBase<OtherDerived>& other) {
   eigen_assert(Mode == int(OtherDerived::Mode));
   internal::call_assignment(derived(), other.derived());
   return derived();
 }
 
-template<typename MatrixType, unsigned int Mode>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC void TriangularViewImpl<MatrixType, Mode, Dense>::lazyAssign(const TriangularBase<OtherDerived>& other)
-{
+template <typename MatrixType, unsigned int Mode>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC void TriangularViewImpl<MatrixType, Mode, Dense>::lazyAssign(
+    const TriangularBase<OtherDerived>& other) {
   eigen_assert(Mode == int(OtherDerived::Mode));
   internal::call_assignment_no_alias(derived(), other.derived());
 }
 #endif
 
 /***************************************************************************
-* Implementation of TriangularBase methods
-***************************************************************************/
+ * Implementation of TriangularBase methods
+ ***************************************************************************/
 
 /** Assigns a triangular or selfadjoint matrix to a dense matrix.
-  * If the matrix is triangular, the opposite part is set to zero. */
-template<typename Derived>
-template<typename DenseDerived>
-EIGEN_DEVICE_FUNC void TriangularBase<Derived>::evalTo(MatrixBase<DenseDerived> &other) const
-{
+ * If the matrix is triangular, the opposite part is set to zero. */
+template <typename Derived>
+template <typename DenseDerived>
+EIGEN_DEVICE_FUNC void TriangularBase<Derived>::evalTo(MatrixBase<DenseDerived>& other) const {
   evalToLazy(other.derived());
 }
 
 /***************************************************************************
-* Implementation of TriangularView methods
-***************************************************************************/
+ * Implementation of TriangularView methods
+ ***************************************************************************/
 
 /***************************************************************************
-* Implementation of MatrixBase methods
-***************************************************************************/
+ * Implementation of MatrixBase methods
+ ***************************************************************************/
 
 /**
-  * \returns an expression of a triangular view extracted from the current matrix
-  *
-  * The parameter \a Mode can have the following values: \c #Upper, \c #StrictlyUpper, \c #UnitUpper,
-  * \c #Lower, \c #StrictlyLower, \c #UnitLower.
-  *
-  * Example: \include MatrixBase_triangularView.cpp
-  * Output: \verbinclude MatrixBase_triangularView.out
-  *
-  * \sa class TriangularView
-  */
-template<typename Derived>
-template<unsigned int Mode>
-EIGEN_DEVICE_FUNC
-typename MatrixBase<Derived>::template TriangularViewReturnType<Mode>::Type
-MatrixBase<Derived>::triangularView()
-{
+ * \returns an expression of a triangular view extracted from the current matrix
+ *
+ * The parameter \a Mode can have the following values: \c #Upper, \c #StrictlyUpper, \c #UnitUpper,
+ * \c #Lower, \c #StrictlyLower, \c #UnitLower.
+ *
+ * Example: \include MatrixBase_triangularView.cpp
+ * Output: \verbinclude MatrixBase_triangularView.out
+ *
+ * \sa class TriangularView
+ */
+template <typename Derived>
+template <unsigned int Mode>
+EIGEN_DEVICE_FUNC typename MatrixBase<Derived>::template TriangularViewReturnType<Mode>::Type
+MatrixBase<Derived>::triangularView() {
   return typename TriangularViewReturnType<Mode>::Type(derived());
 }
 
 /** This is the const version of MatrixBase::triangularView() */
-template<typename Derived>
-template<unsigned int Mode>
-EIGEN_DEVICE_FUNC
-typename MatrixBase<Derived>::template ConstTriangularViewReturnType<Mode>::Type
-MatrixBase<Derived>::triangularView() const
-{
+template <typename Derived>
+template <unsigned int Mode>
+EIGEN_DEVICE_FUNC typename MatrixBase<Derived>::template ConstTriangularViewReturnType<Mode>::Type
+MatrixBase<Derived>::triangularView() const {
   return typename ConstTriangularViewReturnType<Mode>::Type(derived());
 }
 
 /** \returns true if *this is approximately equal to an upper triangular matrix,
-  *          within the precision given by \a prec.
-  *
-  * \sa isLowerTriangular()
-  */
-template<typename Derived>
-bool MatrixBase<Derived>::isUpperTriangular(const RealScalar& prec) const
-{
+ *          within the precision given by \a prec.
+ *
+ * \sa isLowerTriangular()
+ */
+template <typename Derived>
+bool MatrixBase<Derived>::isUpperTriangular(const RealScalar& prec) const {
   RealScalar maxAbsOnUpperPart = static_cast<RealScalar>(-1);
-  for(Index j = 0; j < cols(); ++j)
-  {
-    Index maxi = numext::mini(j, rows()-1);
-    for(Index i = 0; i <= maxi; ++i)
-    {
-      RealScalar absValue = numext::abs(coeff(i,j));
-      if(absValue > maxAbsOnUpperPart) maxAbsOnUpperPart = absValue;
+  for (Index j = 0; j < cols(); ++j) {
+    Index maxi = numext::mini(j, rows() - 1);
+    for (Index i = 0; i <= maxi; ++i) {
+      RealScalar absValue = numext::abs(coeff(i, j));
+      if (absValue > maxAbsOnUpperPart) maxAbsOnUpperPart = absValue;
     }
   }
   RealScalar threshold = maxAbsOnUpperPart * prec;
-  for(Index j = 0; j < cols(); ++j)
-    for(Index i = j+1; i < rows(); ++i)
-      if(numext::abs(coeff(i, j)) > threshold) return false;
+  for (Index j = 0; j < cols(); ++j)
+    for (Index i = j + 1; i < rows(); ++i)
+      if (numext::abs(coeff(i, j)) > threshold) return false;
   return true;
 }
 
 /** \returns true if *this is approximately equal to a lower triangular matrix,
-  *          within the precision given by \a prec.
-  *
-  * \sa isUpperTriangular()
-  */
-template<typename Derived>
-bool MatrixBase<Derived>::isLowerTriangular(const RealScalar& prec) const
-{
+ *          within the precision given by \a prec.
+ *
+ * \sa isUpperTriangular()
+ */
+template <typename Derived>
+bool MatrixBase<Derived>::isLowerTriangular(const RealScalar& prec) const {
   RealScalar maxAbsOnLowerPart = static_cast<RealScalar>(-1);
-  for(Index j = 0; j < cols(); ++j)
-    for(Index i = j; i < rows(); ++i)
-    {
-      RealScalar absValue = numext::abs(coeff(i,j));
-      if(absValue > maxAbsOnLowerPart) maxAbsOnLowerPart = absValue;
+  for (Index j = 0; j < cols(); ++j)
+    for (Index i = j; i < rows(); ++i) {
+      RealScalar absValue = numext::abs(coeff(i, j));
+      if (absValue > maxAbsOnLowerPart) maxAbsOnLowerPart = absValue;
     }
   RealScalar threshold = maxAbsOnLowerPart * prec;
-  for(Index j = 1; j < cols(); ++j)
-  {
-    Index maxi = numext::mini(j, rows()-1);
-    for(Index i = 0; i < maxi; ++i)
-      if(numext::abs(coeff(i, j)) > threshold) return false;
+  for (Index j = 1; j < cols(); ++j) {
+    Index maxi = numext::mini(j, rows() - 1);
+    for (Index i = 0; i < maxi; ++i)
+      if (numext::abs(coeff(i, j)) > threshold) return false;
   }
   return true;
 }
 
-
 /***************************************************************************
 ****************************************************************************
 * Evaluators and Assignment of triangular expressions
@@ -718,92 +627,85 @@
 
 namespace internal {
 
-
 // TODO currently a triangular expression has the form TriangularView<.,.>
 //      in the future triangular-ness should be defined by the expression traits
-//      such that Transpose<TriangularView<.,.> > is valid. (currently TriangularBase::transpose() is overloaded to make it work)
-template<typename MatrixType, unsigned int Mode>
-struct evaluator_traits<TriangularView<MatrixType,Mode> >
-{
+//      such that Transpose<TriangularView<.,.> > is valid. (currently TriangularBase::transpose() is overloaded to make
+//      it work)
+template <typename MatrixType, unsigned int Mode>
+struct evaluator_traits<TriangularView<MatrixType, Mode>> {
   typedef typename storage_kind_to_evaluator_kind<typename MatrixType::StorageKind>::Kind Kind;
   typedef typename glue_shapes<typename evaluator_traits<MatrixType>::Shape, TriangularShape>::type Shape;
 };
 
-template<typename MatrixType, unsigned int Mode>
-struct unary_evaluator<TriangularView<MatrixType,Mode>, IndexBased>
- : evaluator<internal::remove_all_t<MatrixType>>
-{
-  typedef TriangularView<MatrixType,Mode> XprType;
+template <typename MatrixType, unsigned int Mode>
+struct unary_evaluator<TriangularView<MatrixType, Mode>, IndexBased> : evaluator<internal::remove_all_t<MatrixType>> {
+  typedef TriangularView<MatrixType, Mode> XprType;
   typedef evaluator<internal::remove_all_t<MatrixType>> Base;
-  EIGEN_DEVICE_FUNC
-  unary_evaluator(const XprType &xpr) : Base(xpr.nestedExpression()) {}
+  EIGEN_DEVICE_FUNC unary_evaluator(const XprType& xpr) : Base(xpr.nestedExpression()) {}
 };
 
 // Additional assignment kinds:
-struct Triangular2Triangular    {};
-struct Triangular2Dense         {};
-struct Dense2Triangular         {};
+struct Triangular2Triangular {};
+struct Triangular2Dense {};
+struct Dense2Triangular {};
 
-
-template<typename Kernel, unsigned int Mode, int UnrollCount, bool ClearOpposite> struct triangular_assignment_loop;
-
+template <typename Kernel, unsigned int Mode, int UnrollCount, bool ClearOpposite>
+struct triangular_assignment_loop;
 
 /** \internal Specialization of the dense assignment kernel for triangular matrices.
-  * The main difference is that the triangular, diagonal, and opposite parts are processed through three different functions.
-  * \tparam UpLo must be either Lower or Upper
-  * \tparam Mode must be either 0, UnitDiag, ZeroDiag, or SelfAdjoint
-  */
-template<int UpLo, int Mode, int SetOpposite, typename DstEvaluatorTypeT, typename SrcEvaluatorTypeT, typename Functor, int Version = Specialized>
-class triangular_dense_assignment_kernel : public generic_dense_assignment_kernel<DstEvaluatorTypeT, SrcEvaluatorTypeT, Functor, Version>
-{
-protected:
+ * The main difference is that the triangular, diagonal, and opposite parts are processed through three different
+ * functions. \tparam UpLo must be either Lower or Upper \tparam Mode must be either 0, UnitDiag, ZeroDiag, or
+ * SelfAdjoint
+ */
+template <int UpLo, int Mode, int SetOpposite, typename DstEvaluatorTypeT, typename SrcEvaluatorTypeT, typename Functor,
+          int Version = Specialized>
+class triangular_dense_assignment_kernel
+    : public generic_dense_assignment_kernel<DstEvaluatorTypeT, SrcEvaluatorTypeT, Functor, Version> {
+ protected:
   typedef generic_dense_assignment_kernel<DstEvaluatorTypeT, SrcEvaluatorTypeT, Functor, Version> Base;
   typedef typename Base::DstXprType DstXprType;
   typedef typename Base::SrcXprType SrcXprType;
   using Base::m_dst;
-  using Base::m_src;
   using Base::m_functor;
-public:
+  using Base::m_src;
 
+ public:
   typedef typename Base::DstEvaluatorType DstEvaluatorType;
   typedef typename Base::SrcEvaluatorType SrcEvaluatorType;
   typedef typename Base::Scalar Scalar;
   typedef typename Base::AssignmentTraits AssignmentTraits;
 
-
-  EIGEN_DEVICE_FUNC triangular_dense_assignment_kernel(DstEvaluatorType &dst, const SrcEvaluatorType &src, const Functor &func, DstXprType& dstExpr)
-    : Base(dst, src, func, dstExpr)
-  {}
+  EIGEN_DEVICE_FUNC triangular_dense_assignment_kernel(DstEvaluatorType& dst, const SrcEvaluatorType& src,
+                                                       const Functor& func, DstXprType& dstExpr)
+      : Base(dst, src, func, dstExpr) {}
 
 #ifdef EIGEN_INTERNAL_DEBUGGING
-  EIGEN_DEVICE_FUNC void assignCoeff(Index row, Index col)
-  {
-    eigen_internal_assert(row!=col);
-    Base::assignCoeff(row,col);
+  EIGEN_DEVICE_FUNC void assignCoeff(Index row, Index col) {
+    eigen_internal_assert(row != col);
+    Base::assignCoeff(row, col);
   }
 #else
   using Base::assignCoeff;
 #endif
 
-  EIGEN_DEVICE_FUNC void assignDiagonalCoeff(Index id)
-  {
-         if(Mode==UnitDiag && SetOpposite) m_functor.assignCoeff(m_dst.coeffRef(id,id), Scalar(1));
-    else if(Mode==ZeroDiag && SetOpposite) m_functor.assignCoeff(m_dst.coeffRef(id,id), Scalar(0));
-    else if(Mode==0)                       Base::assignCoeff(id,id);
+  EIGEN_DEVICE_FUNC void assignDiagonalCoeff(Index id) {
+    if (Mode == UnitDiag && SetOpposite)
+      m_functor.assignCoeff(m_dst.coeffRef(id, id), Scalar(1));
+    else if (Mode == ZeroDiag && SetOpposite)
+      m_functor.assignCoeff(m_dst.coeffRef(id, id), Scalar(0));
+    else if (Mode == 0)
+      Base::assignCoeff(id, id);
   }
 
-  EIGEN_DEVICE_FUNC void assignOppositeCoeff(Index row, Index col)
-  {
-    eigen_internal_assert(row!=col);
-    if(SetOpposite)
-      m_functor.assignCoeff(m_dst.coeffRef(row,col), Scalar(0));
+  EIGEN_DEVICE_FUNC void assignOppositeCoeff(Index row, Index col) {
+    eigen_internal_assert(row != col);
+    if (SetOpposite) m_functor.assignCoeff(m_dst.coeffRef(row, col), Scalar(0));
   }
 };
 
-template<int Mode, bool SetOpposite, typename DstXprType, typename SrcXprType, typename Functor>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-void call_triangular_assignment_loop(DstXprType& dst, const SrcXprType& src, const Functor &func)
-{
+template <int Mode, bool SetOpposite, typename DstXprType, typename SrcXprType, typename Functor>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void call_triangular_assignment_loop(DstXprType& dst, const SrcXprType& src,
+                                                                           const Functor& func) {
   typedef evaluator<DstXprType> DstEvaluatorType;
   typedef evaluator<SrcXprType> SrcEvaluatorType;
 
@@ -811,194 +713,187 @@
 
   Index dstRows = src.rows();
   Index dstCols = src.cols();
-  if((dst.rows()!=dstRows) || (dst.cols()!=dstCols))
-    dst.resize(dstRows, dstCols);
+  if ((dst.rows() != dstRows) || (dst.cols() != dstCols)) dst.resize(dstRows, dstCols);
   DstEvaluatorType dstEvaluator(dst);
 
-  typedef triangular_dense_assignment_kernel< Mode&(Lower|Upper),Mode&(UnitDiag|ZeroDiag|SelfAdjoint),SetOpposite,
-                                              DstEvaluatorType,SrcEvaluatorType,Functor> Kernel;
+  typedef triangular_dense_assignment_kernel<Mode&(Lower | Upper), Mode&(UnitDiag | ZeroDiag | SelfAdjoint),
+                                             SetOpposite, DstEvaluatorType, SrcEvaluatorType, Functor>
+      Kernel;
   Kernel kernel(dstEvaluator, srcEvaluator, func, dst.const_cast_derived());
 
   enum {
-      unroll = DstXprType::SizeAtCompileTime != Dynamic
-            && SrcEvaluatorType::CoeffReadCost < HugeCost
-            && DstXprType::SizeAtCompileTime * (int(DstEvaluatorType::CoeffReadCost) + int(SrcEvaluatorType::CoeffReadCost)) / 2 <= EIGEN_UNROLLING_LIMIT
-    };
+    unroll = DstXprType::SizeAtCompileTime != Dynamic && SrcEvaluatorType::CoeffReadCost < HugeCost &&
+             DstXprType::SizeAtCompileTime *
+                     (int(DstEvaluatorType::CoeffReadCost) + int(SrcEvaluatorType::CoeffReadCost)) / 2 <=
+                 EIGEN_UNROLLING_LIMIT
+  };
 
-  triangular_assignment_loop<Kernel, Mode, unroll ? int(DstXprType::SizeAtCompileTime) : Dynamic, SetOpposite>::run(kernel);
+  triangular_assignment_loop<Kernel, Mode, unroll ? int(DstXprType::SizeAtCompileTime) : Dynamic, SetOpposite>::run(
+      kernel);
 }
 
-template<int Mode, bool SetOpposite, typename DstXprType, typename SrcXprType>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-void call_triangular_assignment_loop(DstXprType& dst, const SrcXprType& src)
-{
-  call_triangular_assignment_loop<Mode,SetOpposite>(dst, src, internal::assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar>());
+template <int Mode, bool SetOpposite, typename DstXprType, typename SrcXprType>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void call_triangular_assignment_loop(DstXprType& dst, const SrcXprType& src) {
+  call_triangular_assignment_loop<Mode, SetOpposite>(
+      dst, src, internal::assign_op<typename DstXprType::Scalar, typename SrcXprType::Scalar>());
 }
 
-template<> struct AssignmentKind<TriangularShape,TriangularShape> { typedef Triangular2Triangular Kind; };
-template<> struct AssignmentKind<DenseShape,TriangularShape>      { typedef Triangular2Dense      Kind; };
-template<> struct AssignmentKind<TriangularShape,DenseShape>      { typedef Dense2Triangular      Kind; };
+template <>
+struct AssignmentKind<TriangularShape, TriangularShape> {
+  typedef Triangular2Triangular Kind;
+};
+template <>
+struct AssignmentKind<DenseShape, TriangularShape> {
+  typedef Triangular2Dense Kind;
+};
+template <>
+struct AssignmentKind<TriangularShape, DenseShape> {
+  typedef Dense2Triangular Kind;
+};
 
-
-template< typename DstXprType, typename SrcXprType, typename Functor>
-struct Assignment<DstXprType, SrcXprType, Functor, Triangular2Triangular>
-{
-  EIGEN_DEVICE_FUNC static void run(DstXprType &dst, const SrcXprType &src, const Functor &func)
-  {
+template <typename DstXprType, typename SrcXprType, typename Functor>
+struct Assignment<DstXprType, SrcXprType, Functor, Triangular2Triangular> {
+  EIGEN_DEVICE_FUNC static void run(DstXprType& dst, const SrcXprType& src, const Functor& func) {
     eigen_assert(int(DstXprType::Mode) == int(SrcXprType::Mode));
 
     call_triangular_assignment_loop<DstXprType::Mode, false>(dst, src, func);
   }
 };
 
-template< typename DstXprType, typename SrcXprType, typename Functor>
-struct Assignment<DstXprType, SrcXprType, Functor, Triangular2Dense>
-{
-  EIGEN_DEVICE_FUNC static void run(DstXprType &dst, const SrcXprType &src, const Functor &func)
-  {
+template <typename DstXprType, typename SrcXprType, typename Functor>
+struct Assignment<DstXprType, SrcXprType, Functor, Triangular2Dense> {
+  EIGEN_DEVICE_FUNC static void run(DstXprType& dst, const SrcXprType& src, const Functor& func) {
     call_triangular_assignment_loop<SrcXprType::Mode, (int(SrcXprType::Mode) & int(SelfAdjoint)) == 0>(dst, src, func);
   }
 };
 
-template< typename DstXprType, typename SrcXprType, typename Functor>
-struct Assignment<DstXprType, SrcXprType, Functor, Dense2Triangular>
-{
-  EIGEN_DEVICE_FUNC static void run(DstXprType &dst, const SrcXprType &src, const Functor &func)
-  {
+template <typename DstXprType, typename SrcXprType, typename Functor>
+struct Assignment<DstXprType, SrcXprType, Functor, Dense2Triangular> {
+  EIGEN_DEVICE_FUNC static void run(DstXprType& dst, const SrcXprType& src, const Functor& func) {
     call_triangular_assignment_loop<DstXprType::Mode, false>(dst, src, func);
   }
 };
 
-
-template<typename Kernel, unsigned int Mode, int UnrollCount, bool SetOpposite>
-struct triangular_assignment_loop
-{
+template <typename Kernel, unsigned int Mode, int UnrollCount, bool SetOpposite>
+struct triangular_assignment_loop {
   // FIXME: this is not very clean, perhaps this information should be provided by the kernel?
   typedef typename Kernel::DstEvaluatorType DstEvaluatorType;
   typedef typename DstEvaluatorType::XprType DstXprType;
 
   enum {
-    col = (UnrollCount-1) / DstXprType::RowsAtCompileTime,
-    row = (UnrollCount-1) % DstXprType::RowsAtCompileTime
+    col = (UnrollCount - 1) / DstXprType::RowsAtCompileTime,
+    row = (UnrollCount - 1) % DstXprType::RowsAtCompileTime
   };
 
   typedef typename Kernel::Scalar Scalar;
 
-  EIGEN_DEVICE_FUNC
-  static inline void run(Kernel &kernel)
-  {
-    triangular_assignment_loop<Kernel, Mode, UnrollCount-1, SetOpposite>::run(kernel);
+  EIGEN_DEVICE_FUNC static inline void run(Kernel& kernel) {
+    triangular_assignment_loop<Kernel, Mode, UnrollCount - 1, SetOpposite>::run(kernel);
 
-    if(row==col)
+    if (row == col)
       kernel.assignDiagonalCoeff(row);
-    else if( ((Mode&Lower) && row>col) || ((Mode&Upper) && row<col) )
-      kernel.assignCoeff(row,col);
-    else if(SetOpposite)
-      kernel.assignOppositeCoeff(row,col);
+    else if (((Mode & Lower) && row > col) || ((Mode & Upper) && row < col))
+      kernel.assignCoeff(row, col);
+    else if (SetOpposite)
+      kernel.assignOppositeCoeff(row, col);
   }
 };
 
 // prevent buggy user code from causing an infinite recursion
-template<typename Kernel, unsigned int Mode, bool SetOpposite>
-struct triangular_assignment_loop<Kernel, Mode, 0, SetOpposite>
-{
-  EIGEN_DEVICE_FUNC
-  static inline void run(Kernel &) {}
+template <typename Kernel, unsigned int Mode, bool SetOpposite>
+struct triangular_assignment_loop<Kernel, Mode, 0, SetOpposite> {
+  EIGEN_DEVICE_FUNC static inline void run(Kernel&) {}
 };
 
-
-
 // TODO: experiment with a recursive assignment procedure splitting the current
 //       triangular part into one rectangular and two triangular parts.
 
-
-template<typename Kernel, unsigned int Mode, bool SetOpposite>
-struct triangular_assignment_loop<Kernel, Mode, Dynamic, SetOpposite>
-{
+template <typename Kernel, unsigned int Mode, bool SetOpposite>
+struct triangular_assignment_loop<Kernel, Mode, Dynamic, SetOpposite> {
   typedef typename Kernel::Scalar Scalar;
-  EIGEN_DEVICE_FUNC
-  static inline void run(Kernel &kernel)
-  {
-    for(Index j = 0; j < kernel.cols(); ++j)
-    {
+  EIGEN_DEVICE_FUNC static inline void run(Kernel& kernel) {
+    for (Index j = 0; j < kernel.cols(); ++j) {
       Index maxi = numext::mini(j, kernel.rows());
       Index i = 0;
-      if (((Mode&Lower) && SetOpposite) || (Mode&Upper))
-      {
-        for(; i < maxi; ++i)
-          if(Mode&Upper) kernel.assignCoeff(i, j);
-          else           kernel.assignOppositeCoeff(i, j);
-      }
-      else
+      if (((Mode & Lower) && SetOpposite) || (Mode & Upper)) {
+        for (; i < maxi; ++i)
+          if (Mode & Upper)
+            kernel.assignCoeff(i, j);
+          else
+            kernel.assignOppositeCoeff(i, j);
+      } else
         i = maxi;
 
-      if(i<kernel.rows()) // then i==j
+      if (i < kernel.rows())  // then i==j
         kernel.assignDiagonalCoeff(i++);
 
-      if (((Mode&Upper) && SetOpposite) || (Mode&Lower))
-      {
-        for(; i < kernel.rows(); ++i)
-          if(Mode&Lower) kernel.assignCoeff(i, j);
-          else           kernel.assignOppositeCoeff(i, j);
+      if (((Mode & Upper) && SetOpposite) || (Mode & Lower)) {
+        for (; i < kernel.rows(); ++i)
+          if (Mode & Lower)
+            kernel.assignCoeff(i, j);
+          else
+            kernel.assignOppositeCoeff(i, j);
       }
     }
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** Assigns a triangular or selfadjoint matrix to a dense matrix.
-  * If the matrix is triangular, the opposite part is set to zero. */
-template<typename Derived>
-template<typename DenseDerived>
-EIGEN_DEVICE_FUNC void TriangularBase<Derived>::evalToLazy(MatrixBase<DenseDerived> &other) const
-{
+ * If the matrix is triangular, the opposite part is set to zero. */
+template <typename Derived>
+template <typename DenseDerived>
+EIGEN_DEVICE_FUNC void TriangularBase<Derived>::evalToLazy(MatrixBase<DenseDerived>& other) const {
   other.derived().resize(this->rows(), this->cols());
-  internal::call_triangular_assignment_loop<Derived::Mode, (int(Derived::Mode) & int(SelfAdjoint)) == 0 /* SetOpposite */>(other.derived(), derived().nestedExpression());
+  internal::call_triangular_assignment_loop<Derived::Mode,
+                                            (int(Derived::Mode) & int(SelfAdjoint)) == 0 /* SetOpposite */>(
+      other.derived(), derived().nestedExpression());
 }
 
 namespace internal {
 
 // Triangular = Product
-template< typename DstXprType, typename Lhs, typename Rhs, typename Scalar>
-struct Assignment<DstXprType, Product<Lhs,Rhs,DefaultProduct>, internal::assign_op<Scalar,typename Product<Lhs,Rhs,DefaultProduct>::Scalar>, Dense2Triangular>
-{
-  typedef Product<Lhs,Rhs,DefaultProduct> SrcXprType;
-  static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<Scalar,typename SrcXprType::Scalar> &)
-  {
+template <typename DstXprType, typename Lhs, typename Rhs, typename Scalar>
+struct Assignment<DstXprType, Product<Lhs, Rhs, DefaultProduct>,
+                  internal::assign_op<Scalar, typename Product<Lhs, Rhs, DefaultProduct>::Scalar>, Dense2Triangular> {
+  typedef Product<Lhs, Rhs, DefaultProduct> SrcXprType;
+  static void run(DstXprType& dst, const SrcXprType& src,
+                  const internal::assign_op<Scalar, typename SrcXprType::Scalar>&) {
     Index dstRows = src.rows();
     Index dstCols = src.cols();
-    if((dst.rows()!=dstRows) || (dst.cols()!=dstCols))
-      dst.resize(dstRows, dstCols);
+    if ((dst.rows() != dstRows) || (dst.cols() != dstCols)) dst.resize(dstRows, dstCols);
 
     dst._assignProduct(src, Scalar(1), false);
   }
 };
 
 // Triangular += Product
-template< typename DstXprType, typename Lhs, typename Rhs, typename Scalar>
-struct Assignment<DstXprType, Product<Lhs,Rhs,DefaultProduct>, internal::add_assign_op<Scalar,typename Product<Lhs,Rhs,DefaultProduct>::Scalar>, Dense2Triangular>
-{
-  typedef Product<Lhs,Rhs,DefaultProduct> SrcXprType;
-  static void run(DstXprType &dst, const SrcXprType &src, const internal::add_assign_op<Scalar,typename SrcXprType::Scalar> &)
-  {
+template <typename DstXprType, typename Lhs, typename Rhs, typename Scalar>
+struct Assignment<DstXprType, Product<Lhs, Rhs, DefaultProduct>,
+                  internal::add_assign_op<Scalar, typename Product<Lhs, Rhs, DefaultProduct>::Scalar>,
+                  Dense2Triangular> {
+  typedef Product<Lhs, Rhs, DefaultProduct> SrcXprType;
+  static void run(DstXprType& dst, const SrcXprType& src,
+                  const internal::add_assign_op<Scalar, typename SrcXprType::Scalar>&) {
     dst._assignProduct(src, Scalar(1), true);
   }
 };
 
 // Triangular -= Product
-template< typename DstXprType, typename Lhs, typename Rhs, typename Scalar>
-struct Assignment<DstXprType, Product<Lhs,Rhs,DefaultProduct>, internal::sub_assign_op<Scalar,typename Product<Lhs,Rhs,DefaultProduct>::Scalar>, Dense2Triangular>
-{
-  typedef Product<Lhs,Rhs,DefaultProduct> SrcXprType;
-  static void run(DstXprType &dst, const SrcXprType &src, const internal::sub_assign_op<Scalar,typename SrcXprType::Scalar> &)
-  {
+template <typename DstXprType, typename Lhs, typename Rhs, typename Scalar>
+struct Assignment<DstXprType, Product<Lhs, Rhs, DefaultProduct>,
+                  internal::sub_assign_op<Scalar, typename Product<Lhs, Rhs, DefaultProduct>::Scalar>,
+                  Dense2Triangular> {
+  typedef Product<Lhs, Rhs, DefaultProduct> SrcXprType;
+  static void run(DstXprType& dst, const SrcXprType& src,
+                  const internal::sub_assign_op<Scalar, typename SrcXprType::Scalar>&) {
     dst._assignProduct(src, Scalar(-1), true);
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_TRIANGULARMATRIX_H
+#endif  // EIGEN_TRIANGULARMATRIX_H
diff --git a/Eigen/src/Core/VectorBlock.h b/Eigen/src/Core/VectorBlock.h
index 64798c3..5ac13eb 100644
--- a/Eigen/src/Core/VectorBlock.h
+++ b/Eigen/src/Core/VectorBlock.h
@@ -14,82 +14,70 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
-template<typename VectorType, int Size>
+template <typename VectorType, int Size>
 struct traits<VectorBlock<VectorType, Size> >
-  : public traits<Block<VectorType,
-                     traits<VectorType>::Flags & RowMajorBit ? 1 : Size,
-                     traits<VectorType>::Flags & RowMajorBit ? Size : 1> >
-{
-};
-}
+    : public traits<Block<VectorType, traits<VectorType>::Flags & RowMajorBit ? 1 : Size,
+                          traits<VectorType>::Flags & RowMajorBit ? Size : 1> > {};
+}  // namespace internal
 
 /** \class VectorBlock
-  * \ingroup Core_Module
-  *
-  * \brief Expression of a fixed-size or dynamic-size sub-vector
-  *
-  * \tparam VectorType the type of the object in which we are taking a sub-vector
-  * \tparam Size size of the sub-vector we are taking at compile time (optional)
-  *
-  * This class represents an expression of either a fixed-size or dynamic-size sub-vector.
-  * It is the return type of DenseBase::segment(Index,Index) and DenseBase::segment<int>(Index) and
-  * most of the time this is the only way it is used.
-  *
-  * However, if you want to directly manipulate sub-vector expressions,
-  * for instance if you want to write a function returning such an expression, you
-  * will need to use this class.
-  *
-  * Here is an example illustrating the dynamic case:
-  * \include class_VectorBlock.cpp
-  * Output: \verbinclude class_VectorBlock.out
-  *
-  * \note Even though this expression has dynamic size, in the case where \a VectorType
-  * has fixed size, this expression inherits a fixed maximal size which means that evaluating
-  * it does not cause a dynamic memory allocation.
-  *
-  * Here is an example illustrating the fixed-size case:
-  * \include class_FixedVectorBlock.cpp
-  * Output: \verbinclude class_FixedVectorBlock.out
-  *
-  * \sa class Block, DenseBase::segment(Index,Index,Index,Index), DenseBase::segment(Index,Index)
-  */
-template<typename VectorType, int Size> class VectorBlock
-  : public Block<VectorType,
-                     internal::traits<VectorType>::Flags & RowMajorBit ? 1 : Size,
-                     internal::traits<VectorType>::Flags & RowMajorBit ? Size : 1>
-{
-    typedef Block<VectorType,
-                     internal::traits<VectorType>::Flags & RowMajorBit ? 1 : Size,
-                     internal::traits<VectorType>::Flags & RowMajorBit ? Size : 1> Base;
-    enum {
-      IsColVector = !(internal::traits<VectorType>::Flags & RowMajorBit)
-    };
-  public:
-    EIGEN_DENSE_PUBLIC_INTERFACE(VectorBlock)
-    EIGEN_STATIC_ASSERT_VECTOR_ONLY(VectorBlock)
-    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(VectorBlock)
+ * \ingroup Core_Module
+ *
+ * \brief Expression of a fixed-size or dynamic-size sub-vector
+ *
+ * \tparam VectorType the type of the object in which we are taking a sub-vector
+ * \tparam Size size of the sub-vector we are taking at compile time (optional)
+ *
+ * This class represents an expression of either a fixed-size or dynamic-size sub-vector.
+ * It is the return type of DenseBase::segment(Index,Index) and DenseBase::segment<int>(Index) and
+ * most of the time this is the only way it is used.
+ *
+ * However, if you want to directly manipulate sub-vector expressions,
+ * for instance if you want to write a function returning such an expression, you
+ * will need to use this class.
+ *
+ * Here is an example illustrating the dynamic case:
+ * \include class_VectorBlock.cpp
+ * Output: \verbinclude class_VectorBlock.out
+ *
+ * \note Even though this expression has dynamic size, in the case where \a VectorType
+ * has fixed size, this expression inherits a fixed maximal size which means that evaluating
+ * it does not cause a dynamic memory allocation.
+ *
+ * Here is an example illustrating the fixed-size case:
+ * \include class_FixedVectorBlock.cpp
+ * Output: \verbinclude class_FixedVectorBlock.out
+ *
+ * \sa class Block, DenseBase::segment(Index,Index,Index,Index), DenseBase::segment(Index,Index)
+ */
+template <typename VectorType, int Size>
+class VectorBlock : public Block<VectorType, internal::traits<VectorType>::Flags & RowMajorBit ? 1 : Size,
+                                 internal::traits<VectorType>::Flags & RowMajorBit ? Size : 1> {
+  typedef Block<VectorType, internal::traits<VectorType>::Flags & RowMajorBit ? 1 : Size,
+                internal::traits<VectorType>::Flags & RowMajorBit ? Size : 1>
+      Base;
+  enum { IsColVector = !(internal::traits<VectorType>::Flags & RowMajorBit) };
 
-    /** Dynamic-size constructor
-      */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    VectorBlock(VectorType& vector, Index start, Index size)
-      : Base(vector,
-             IsColVector ? start : 0, IsColVector ? 0 : start,
-             IsColVector ? size  : 1, IsColVector ? 1 : size)
-    { }
+ public:
+  EIGEN_DENSE_PUBLIC_INTERFACE(VectorBlock)
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(VectorBlock)
+  EIGEN_INHERIT_ASSIGNMENT_OPERATORS(VectorBlock)
 
-    /** Fixed-size constructor
-      */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    VectorBlock(VectorType& vector, Index start)
-      : Base(vector, IsColVector ? start : 0, IsColVector ? 0 : start)
-    { }
+  /** Dynamic-size constructor
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE VectorBlock(VectorType& vector, Index start, Index size)
+      : Base(vector, IsColVector ? start : 0, IsColVector ? 0 : start, IsColVector ? size : 1, IsColVector ? 1 : size) {
+  }
+
+  /** Fixed-size constructor
+   */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE VectorBlock(VectorType& vector, Index start)
+      : Base(vector, IsColVector ? start : 0, IsColVector ? 0 : start) {}
 };
 
+}  // end namespace Eigen
 
-} // end namespace Eigen
-
-#endif // EIGEN_VECTORBLOCK_H
+#endif  // EIGEN_VECTORBLOCK_H
diff --git a/Eigen/src/Core/VectorwiseOp.h b/Eigen/src/Core/VectorwiseOp.h
index caaaef6..9887db6 100644
--- a/Eigen/src/Core/VectorwiseOp.h
+++ b/Eigen/src/Core/VectorwiseOp.h
@@ -17,770 +17,697 @@
 namespace Eigen {
 
 /** \class PartialReduxExpr
-  * \ingroup Core_Module
-  *
-  * \brief Generic expression of a partially reduxed matrix
-  *
-  * \tparam MatrixType the type of the matrix we are applying the redux operation
-  * \tparam MemberOp type of the member functor
-  * \tparam Direction indicates the direction of the redux (#Vertical or #Horizontal)
-  *
-  * This class represents an expression of a partial redux operator of a matrix.
-  * It is the return type of some VectorwiseOp functions,
-  * and most of the time this is the only way it is used.
-  *
-  * \sa class VectorwiseOp
-  */
+ * \ingroup Core_Module
+ *
+ * \brief Generic expression of a partially reduxed matrix
+ *
+ * \tparam MatrixType the type of the matrix we are applying the redux operation
+ * \tparam MemberOp type of the member functor
+ * \tparam Direction indicates the direction of the redux (#Vertical or #Horizontal)
+ *
+ * This class represents an expression of a partial redux operator of a matrix.
+ * It is the return type of some VectorwiseOp functions,
+ * and most of the time this is the only way it is used.
+ *
+ * \sa class VectorwiseOp
+ */
 
-template< typename MatrixType, typename MemberOp, int Direction>
+template <typename MatrixType, typename MemberOp, int Direction>
 class PartialReduxExpr;
 
 namespace internal {
-template<typename MatrixType, typename MemberOp, int Direction>
-struct traits<PartialReduxExpr<MatrixType, MemberOp, Direction> >
- : traits<MatrixType>
-{
+template <typename MatrixType, typename MemberOp, int Direction>
+struct traits<PartialReduxExpr<MatrixType, MemberOp, Direction> > : traits<MatrixType> {
   typedef typename MemberOp::result_type Scalar;
   typedef typename traits<MatrixType>::StorageKind StorageKind;
   typedef typename traits<MatrixType>::XprKind XprKind;
   typedef typename MatrixType::Scalar InputScalar;
   enum {
-    RowsAtCompileTime = Direction==Vertical   ? 1 : MatrixType::RowsAtCompileTime,
-    ColsAtCompileTime = Direction==Horizontal ? 1 : MatrixType::ColsAtCompileTime,
-    MaxRowsAtCompileTime = Direction==Vertical   ? 1 : MatrixType::MaxRowsAtCompileTime,
-    MaxColsAtCompileTime = Direction==Horizontal ? 1 : MatrixType::MaxColsAtCompileTime,
+    RowsAtCompileTime = Direction == Vertical ? 1 : MatrixType::RowsAtCompileTime,
+    ColsAtCompileTime = Direction == Horizontal ? 1 : MatrixType::ColsAtCompileTime,
+    MaxRowsAtCompileTime = Direction == Vertical ? 1 : MatrixType::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = Direction == Horizontal ? 1 : MatrixType::MaxColsAtCompileTime,
     Flags = RowsAtCompileTime == 1 ? RowMajorBit : 0,
-    TraversalSize = Direction==Vertical ? MatrixType::RowsAtCompileTime :  MatrixType::ColsAtCompileTime
+    TraversalSize = Direction == Vertical ? MatrixType::RowsAtCompileTime : MatrixType::ColsAtCompileTime
   };
 };
-}
+}  // namespace internal
 
-template< typename MatrixType, typename MemberOp, int Direction>
-class PartialReduxExpr : public internal::dense_xpr_base< PartialReduxExpr<MatrixType, MemberOp, Direction> >::type,
-                         internal::no_assignment_operator
-{
-  public:
+template <typename MatrixType, typename MemberOp, int Direction>
+class PartialReduxExpr : public internal::dense_xpr_base<PartialReduxExpr<MatrixType, MemberOp, Direction> >::type,
+                         internal::no_assignment_operator {
+ public:
+  typedef typename internal::dense_xpr_base<PartialReduxExpr>::type Base;
+  EIGEN_DENSE_PUBLIC_INTERFACE(PartialReduxExpr)
 
-    typedef typename internal::dense_xpr_base<PartialReduxExpr>::type Base;
-    EIGEN_DENSE_PUBLIC_INTERFACE(PartialReduxExpr)
-
-    EIGEN_DEVICE_FUNC
-    explicit PartialReduxExpr(const MatrixType& mat, const MemberOp& func = MemberOp())
+  EIGEN_DEVICE_FUNC explicit PartialReduxExpr(const MatrixType& mat, const MemberOp& func = MemberOp())
       : m_matrix(mat), m_functor(func) {}
 
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    Index rows() const EIGEN_NOEXCEPT { return (Direction==Vertical   ? 1 : m_matrix.rows()); }
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    Index cols() const EIGEN_NOEXCEPT { return (Direction==Horizontal ? 1 : m_matrix.cols()); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT {
+    return (Direction == Vertical ? 1 : m_matrix.rows());
+  }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT {
+    return (Direction == Horizontal ? 1 : m_matrix.cols());
+  }
 
-    EIGEN_DEVICE_FUNC
-    typename MatrixType::Nested nestedExpression() const { return m_matrix; }
+  EIGEN_DEVICE_FUNC typename MatrixType::Nested nestedExpression() const { return m_matrix; }
 
-    EIGEN_DEVICE_FUNC
-    const MemberOp& functor() const { return m_functor; }
+  EIGEN_DEVICE_FUNC const MemberOp& functor() const { return m_functor; }
 
-  protected:
-    typename MatrixType::Nested m_matrix;
-    const MemberOp m_functor;
+ protected:
+  typename MatrixType::Nested m_matrix;
+  const MemberOp m_functor;
 };
 
-template<typename A,typename B> struct partial_redux_dummy_func;
+template <typename A, typename B>
+struct partial_redux_dummy_func;
 
-#define EIGEN_MAKE_PARTIAL_REDUX_FUNCTOR(MEMBER,COST,VECTORIZABLE,BINARYOP)                \
-  template <typename ResultType,typename Scalar>                                                            \
+#define EIGEN_MAKE_PARTIAL_REDUX_FUNCTOR(MEMBER, COST, VECTORIZABLE, BINARYOP)              \
+  template <typename ResultType, typename Scalar>                                           \
   struct member_##MEMBER {                                                                  \
     typedef ResultType result_type;                                                         \
-    typedef BINARYOP<Scalar,Scalar> BinaryOp;   \
-    template<int Size> struct Cost { enum { value = COST }; };             \
+    typedef BINARYOP<Scalar, Scalar> BinaryOp;                                              \
+    template <int Size>                                                                     \
+    struct Cost {                                                                           \
+      enum { value = COST };                                                                \
+    };                                                                                      \
     enum { Vectorizable = VECTORIZABLE };                                                   \
-    template<typename XprType>                                                              \
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                                                   \
-    ResultType operator()(const XprType& mat) const                                         \
-    { return mat.MEMBER(); }                                                                \
+    template <typename XprType>                                                             \
+    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ResultType operator()(const XprType& mat) const { \
+      return mat.MEMBER();                                                                  \
+    }                                                                                       \
     BinaryOp binaryFunc() const { return BinaryOp(); }                                      \
   }
 
-#define EIGEN_MEMBER_FUNCTOR(MEMBER,COST) \
-  EIGEN_MAKE_PARTIAL_REDUX_FUNCTOR(MEMBER,COST,0,partial_redux_dummy_func)
+#define EIGEN_MEMBER_FUNCTOR(MEMBER, COST) EIGEN_MAKE_PARTIAL_REDUX_FUNCTOR(MEMBER, COST, 0, partial_redux_dummy_func)
 
 namespace internal {
 
-EIGEN_MEMBER_FUNCTOR(norm, (Size+5) * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost);
-EIGEN_MEMBER_FUNCTOR(stableNorm, (Size+5) * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost);
-EIGEN_MEMBER_FUNCTOR(blueNorm, (Size+5) * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost);
-EIGEN_MEMBER_FUNCTOR(hypotNorm, (Size-1) * functor_traits<scalar_hypot_op<Scalar> >::Cost );
-EIGEN_MEMBER_FUNCTOR(all, (Size-1)*NumTraits<Scalar>::AddCost);
-EIGEN_MEMBER_FUNCTOR(any, (Size-1)*NumTraits<Scalar>::AddCost);
-EIGEN_MEMBER_FUNCTOR(count, (Size-1)*NumTraits<Scalar>::AddCost);
+EIGEN_MEMBER_FUNCTOR(norm, (Size + 5) * NumTraits<Scalar>::MulCost + (Size - 1) * NumTraits<Scalar>::AddCost);
+EIGEN_MEMBER_FUNCTOR(stableNorm, (Size + 5) * NumTraits<Scalar>::MulCost + (Size - 1) * NumTraits<Scalar>::AddCost);
+EIGEN_MEMBER_FUNCTOR(blueNorm, (Size + 5) * NumTraits<Scalar>::MulCost + (Size - 1) * NumTraits<Scalar>::AddCost);
+EIGEN_MEMBER_FUNCTOR(hypotNorm, (Size - 1) * functor_traits<scalar_hypot_op<Scalar> >::Cost);
+EIGEN_MEMBER_FUNCTOR(all, (Size - 1) * NumTraits<Scalar>::AddCost);
+EIGEN_MEMBER_FUNCTOR(any, (Size - 1) * NumTraits<Scalar>::AddCost);
+EIGEN_MEMBER_FUNCTOR(count, (Size - 1) * NumTraits<Scalar>::AddCost);
 
-EIGEN_MAKE_PARTIAL_REDUX_FUNCTOR(sum, (Size-1)*NumTraits<Scalar>::AddCost, 1, internal::scalar_sum_op);
-EIGEN_MAKE_PARTIAL_REDUX_FUNCTOR(minCoeff, (Size-1)*NumTraits<Scalar>::AddCost, 1, internal::scalar_min_op);
-EIGEN_MAKE_PARTIAL_REDUX_FUNCTOR(maxCoeff, (Size-1)*NumTraits<Scalar>::AddCost, 1, internal::scalar_max_op);
-EIGEN_MAKE_PARTIAL_REDUX_FUNCTOR(prod, (Size-1)*NumTraits<Scalar>::MulCost, 1, internal::scalar_product_op);
+EIGEN_MAKE_PARTIAL_REDUX_FUNCTOR(sum, (Size - 1) * NumTraits<Scalar>::AddCost, 1, internal::scalar_sum_op);
+EIGEN_MAKE_PARTIAL_REDUX_FUNCTOR(minCoeff, (Size - 1) * NumTraits<Scalar>::AddCost, 1, internal::scalar_min_op);
+EIGEN_MAKE_PARTIAL_REDUX_FUNCTOR(maxCoeff, (Size - 1) * NumTraits<Scalar>::AddCost, 1, internal::scalar_max_op);
+EIGEN_MAKE_PARTIAL_REDUX_FUNCTOR(prod, (Size - 1) * NumTraits<Scalar>::MulCost, 1, internal::scalar_product_op);
 
-template <int p, typename ResultType,typename Scalar>
+template <int p, typename ResultType, typename Scalar>
 struct member_lpnorm {
   typedef ResultType result_type;
   enum { Vectorizable = 0 };
-  template<int Size> struct Cost
-  { enum { value = (Size+5) * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost }; };
+  template <int Size>
+  struct Cost {
+    enum { value = (Size + 5) * NumTraits<Scalar>::MulCost + (Size - 1) * NumTraits<Scalar>::AddCost };
+  };
   EIGEN_DEVICE_FUNC member_lpnorm() {}
-  template<typename XprType>
-  EIGEN_DEVICE_FUNC inline ResultType operator()(const XprType& mat) const
-  { return mat.template lpNorm<p>(); }
+  template <typename XprType>
+  EIGEN_DEVICE_FUNC inline ResultType operator()(const XprType& mat) const {
+    return mat.template lpNorm<p>();
+  }
 };
 
 template <typename BinaryOpT, typename Scalar>
 struct member_redux {
   typedef BinaryOpT BinaryOp;
-  typedef typename result_of<
-                     BinaryOp(const Scalar&,const Scalar&)
-                   >::type  result_type;
+  typedef typename result_of<BinaryOp(const Scalar&, const Scalar&)>::type result_type;
 
   enum { Vectorizable = functor_traits<BinaryOp>::PacketAccess };
-  template<int Size> struct Cost { enum { value = (Size-1) * functor_traits<BinaryOp>::Cost }; };
+  template <int Size>
+  struct Cost {
+    enum { value = (Size - 1) * functor_traits<BinaryOp>::Cost };
+  };
   EIGEN_DEVICE_FUNC explicit member_redux(const BinaryOp func) : m_functor(func) {}
-  template<typename Derived>
-  EIGEN_DEVICE_FUNC inline result_type operator()(const DenseBase<Derived>& mat) const
-  { return mat.redux(m_functor); }
+  template <typename Derived>
+  EIGEN_DEVICE_FUNC inline result_type operator()(const DenseBase<Derived>& mat) const {
+    return mat.redux(m_functor);
+  }
   const BinaryOp& binaryFunc() const { return m_functor; }
   const BinaryOp m_functor;
 };
-}
+}  // namespace internal
 
 /** \class VectorwiseOp
-  * \ingroup Core_Module
-  *
-  * \brief Pseudo expression providing broadcasting and partial reduction operations
-  *
-  * \tparam ExpressionType the type of the object on which to do partial reductions
-  * \tparam Direction indicates whether to operate on columns (#Vertical) or rows (#Horizontal)
-  *
-  * This class represents a pseudo expression with broadcasting and partial reduction features.
-  * It is the return type of DenseBase::colwise() and DenseBase::rowwise()
-  * and most of the time this is the only way it is explicitly used.
-  *
-  * To understand the logic of rowwise/colwise expression, let's consider a generic case `A.colwise().foo()`
-  * where `foo` is any method of `VectorwiseOp`. This expression is equivalent to applying `foo()` to each
-  * column of `A` and then re-assemble the outputs in a matrix expression:
-  * \code [A.col(0).foo(), A.col(1).foo(), ..., A.col(A.cols()-1).foo()] \endcode
-  *
-  * Example: \include MatrixBase_colwise.cpp
-  * Output: \verbinclude MatrixBase_colwise.out
-  *
-  * The begin() and end() methods are obviously exceptions to the previous rule as they
-  * return STL-compatible begin/end iterators to the rows or columns of the nested expression.
-  * Typical use cases include for-range-loop and calls to STL algorithms:
-  *
-  * Example: \include MatrixBase_colwise_iterator_cxx11.cpp
-  * Output: \verbinclude MatrixBase_colwise_iterator_cxx11.out
-  *
-  * For a partial reduction on an empty input, some rules apply.
-  * For the sake of clarity, let's consider a vertical reduction:
-  *   - If the number of columns is zero, then a 1x0 row-major vector expression is returned.
-  *   - Otherwise, if the number of rows is zero, then
-  *       - a row vector of zeros is returned for sum-like reductions (sum, squaredNorm, norm, etc.)
-  *       - a row vector of ones is returned for a product reduction (e.g., <code>MatrixXd(n,0).colwise().prod()</code>)
-  *       - an assert is triggered for all other reductions (minCoeff,maxCoeff,redux(bin_op))
-  *
-  * \sa DenseBase::colwise(), DenseBase::rowwise(), class PartialReduxExpr
-  */
-template<typename ExpressionType, int Direction> class VectorwiseOp
-{
-  public:
+ * \ingroup Core_Module
+ *
+ * \brief Pseudo expression providing broadcasting and partial reduction operations
+ *
+ * \tparam ExpressionType the type of the object on which to do partial reductions
+ * \tparam Direction indicates whether to operate on columns (#Vertical) or rows (#Horizontal)
+ *
+ * This class represents a pseudo expression with broadcasting and partial reduction features.
+ * It is the return type of DenseBase::colwise() and DenseBase::rowwise()
+ * and most of the time this is the only way it is explicitly used.
+ *
+ * To understand the logic of rowwise/colwise expression, let's consider a generic case `A.colwise().foo()`
+ * where `foo` is any method of `VectorwiseOp`. This expression is equivalent to applying `foo()` to each
+ * column of `A` and then re-assemble the outputs in a matrix expression:
+ * \code [A.col(0).foo(), A.col(1).foo(), ..., A.col(A.cols()-1).foo()] \endcode
+ *
+ * Example: \include MatrixBase_colwise.cpp
+ * Output: \verbinclude MatrixBase_colwise.out
+ *
+ * The begin() and end() methods are obviously exceptions to the previous rule as they
+ * return STL-compatible begin/end iterators to the rows or columns of the nested expression.
+ * Typical use cases include for-range-loop and calls to STL algorithms:
+ *
+ * Example: \include MatrixBase_colwise_iterator_cxx11.cpp
+ * Output: \verbinclude MatrixBase_colwise_iterator_cxx11.out
+ *
+ * For a partial reduction on an empty input, some rules apply.
+ * For the sake of clarity, let's consider a vertical reduction:
+ *   - If the number of columns is zero, then a 1x0 row-major vector expression is returned.
+ *   - Otherwise, if the number of rows is zero, then
+ *       - a row vector of zeros is returned for sum-like reductions (sum, squaredNorm, norm, etc.)
+ *       - a row vector of ones is returned for a product reduction (e.g., <code>MatrixXd(n,0).colwise().prod()</code>)
+ *       - an assert is triggered for all other reductions (minCoeff,maxCoeff,redux(bin_op))
+ *
+ * \sa DenseBase::colwise(), DenseBase::rowwise(), class PartialReduxExpr
+ */
+template <typename ExpressionType, int Direction>
+class VectorwiseOp {
+ public:
+  typedef typename ExpressionType::Scalar Scalar;
+  typedef typename ExpressionType::RealScalar RealScalar;
+  typedef Eigen::Index Index;  ///< \deprecated since Eigen 3.3
+  typedef typename internal::ref_selector<ExpressionType>::non_const_type ExpressionTypeNested;
+  typedef internal::remove_all_t<ExpressionTypeNested> ExpressionTypeNestedCleaned;
 
-    typedef typename ExpressionType::Scalar Scalar;
-    typedef typename ExpressionType::RealScalar RealScalar;
-    typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3
-    typedef typename internal::ref_selector<ExpressionType>::non_const_type ExpressionTypeNested;
-    typedef internal::remove_all_t<ExpressionTypeNested> ExpressionTypeNestedCleaned;
+  template <template <typename OutScalar, typename InputScalar> class Functor, typename ReturnScalar = Scalar>
+  struct ReturnType {
+    typedef PartialReduxExpr<ExpressionType, Functor<ReturnScalar, Scalar>, Direction> Type;
+  };
 
-    template<template<typename OutScalar,typename InputScalar> class Functor,
-                      typename ReturnScalar=Scalar> struct ReturnType
-    {
-      typedef PartialReduxExpr<ExpressionType,
-                               Functor<ReturnScalar,Scalar>,
-                               Direction
-                              > Type;
-    };
+  template <typename BinaryOp>
+  struct ReduxReturnType {
+    typedef PartialReduxExpr<ExpressionType, internal::member_redux<BinaryOp, Scalar>, Direction> Type;
+  };
 
-    template<typename BinaryOp> struct ReduxReturnType
-    {
-      typedef PartialReduxExpr<ExpressionType,
-                               internal::member_redux<BinaryOp,Scalar>,
-                               Direction
-                              > Type;
-    };
+  enum { isVertical = (Direction == Vertical) ? 1 : 0, isHorizontal = (Direction == Horizontal) ? 1 : 0 };
 
-    enum {
-      isVertical   = (Direction==Vertical) ? 1 : 0,
-      isHorizontal = (Direction==Horizontal) ? 1 : 0
-    };
+ protected:
+  template <typename OtherDerived>
+  struct ExtendedType {
+    typedef Replicate<OtherDerived, isVertical ? 1 : ExpressionType::RowsAtCompileTime,
+                      isHorizontal ? 1 : ExpressionType::ColsAtCompileTime>
+        Type;
+  };
 
-  protected:
+  /** \internal
+   * Replicates a vector to match the size of \c *this */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC typename ExtendedType<OtherDerived>::Type extendedTo(const DenseBase<OtherDerived>& other) const {
+    EIGEN_STATIC_ASSERT(internal::check_implication(isVertical, OtherDerived::MaxColsAtCompileTime == 1),
+                        YOU_PASSED_A_ROW_VECTOR_BUT_A_COLUMN_VECTOR_WAS_EXPECTED)
+    EIGEN_STATIC_ASSERT(internal::check_implication(isHorizontal, OtherDerived::MaxRowsAtCompileTime == 1),
+                        YOU_PASSED_A_COLUMN_VECTOR_BUT_A_ROW_VECTOR_WAS_EXPECTED)
+    return typename ExtendedType<OtherDerived>::Type(other.derived(), isVertical ? 1 : m_matrix.rows(),
+                                                     isHorizontal ? 1 : m_matrix.cols());
+  }
 
-    template<typename OtherDerived> struct ExtendedType {
-      typedef Replicate<OtherDerived,
-                        isVertical   ? 1 : ExpressionType::RowsAtCompileTime,
-                        isHorizontal ? 1 : ExpressionType::ColsAtCompileTime> Type;
-    };
+  template <typename OtherDerived>
+  struct OppositeExtendedType {
+    typedef Replicate<OtherDerived, isHorizontal ? 1 : ExpressionType::RowsAtCompileTime,
+                      isVertical ? 1 : ExpressionType::ColsAtCompileTime>
+        Type;
+  };
 
-    /** \internal
-      * Replicates a vector to match the size of \c *this */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    typename ExtendedType<OtherDerived>::Type
-    extendedTo(const DenseBase<OtherDerived>& other) const
-    {
-      EIGEN_STATIC_ASSERT(internal::check_implication(isVertical, OtherDerived::MaxColsAtCompileTime==1),
-                          YOU_PASSED_A_ROW_VECTOR_BUT_A_COLUMN_VECTOR_WAS_EXPECTED)
-      EIGEN_STATIC_ASSERT(internal::check_implication(isHorizontal, OtherDerived::MaxRowsAtCompileTime==1),
-                          YOU_PASSED_A_COLUMN_VECTOR_BUT_A_ROW_VECTOR_WAS_EXPECTED)
-      return typename ExtendedType<OtherDerived>::Type
-                      (other.derived(),
-                       isVertical   ? 1 : m_matrix.rows(),
-                       isHorizontal ? 1 : m_matrix.cols());
-    }
+  /** \internal
+   * Replicates a vector in the opposite direction to match the size of \c *this */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC typename OppositeExtendedType<OtherDerived>::Type extendedToOpposite(
+      const DenseBase<OtherDerived>& other) const {
+    EIGEN_STATIC_ASSERT(internal::check_implication(isHorizontal, OtherDerived::MaxColsAtCompileTime == 1),
+                        YOU_PASSED_A_ROW_VECTOR_BUT_A_COLUMN_VECTOR_WAS_EXPECTED)
+    EIGEN_STATIC_ASSERT(internal::check_implication(isVertical, OtherDerived::MaxRowsAtCompileTime == 1),
+                        YOU_PASSED_A_COLUMN_VECTOR_BUT_A_ROW_VECTOR_WAS_EXPECTED)
+    return typename OppositeExtendedType<OtherDerived>::Type(other.derived(), isHorizontal ? 1 : m_matrix.rows(),
+                                                             isVertical ? 1 : m_matrix.cols());
+  }
 
-    template<typename OtherDerived> struct OppositeExtendedType {
-      typedef Replicate<OtherDerived,
-                        isHorizontal ? 1 : ExpressionType::RowsAtCompileTime,
-                        isVertical   ? 1 : ExpressionType::ColsAtCompileTime> Type;
-    };
+ public:
+  EIGEN_DEVICE_FUNC explicit inline VectorwiseOp(ExpressionType& matrix) : m_matrix(matrix) {}
 
-    /** \internal
-      * Replicates a vector in the opposite direction to match the size of \c *this */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    typename OppositeExtendedType<OtherDerived>::Type
-    extendedToOpposite(const DenseBase<OtherDerived>& other) const
-    {
-      EIGEN_STATIC_ASSERT(internal::check_implication(isHorizontal, OtherDerived::MaxColsAtCompileTime==1),
-                          YOU_PASSED_A_ROW_VECTOR_BUT_A_COLUMN_VECTOR_WAS_EXPECTED)
-      EIGEN_STATIC_ASSERT(internal::check_implication(isVertical, OtherDerived::MaxRowsAtCompileTime==1),
-                          YOU_PASSED_A_COLUMN_VECTOR_BUT_A_ROW_VECTOR_WAS_EXPECTED)
-      return typename OppositeExtendedType<OtherDerived>::Type
-                      (other.derived(),
-                       isHorizontal  ? 1 : m_matrix.rows(),
-                       isVertical    ? 1 : m_matrix.cols());
-    }
+  /** \internal */
+  EIGEN_DEVICE_FUNC inline const ExpressionType& _expression() const { return m_matrix; }
 
-  public:
-    EIGEN_DEVICE_FUNC
-    explicit inline VectorwiseOp(ExpressionType& matrix) : m_matrix(matrix) {}
+#ifdef EIGEN_PARSED_BY_DOXYGEN
+  /** STL-like <a href="https://en.cppreference.com/w/cpp/named_req/RandomAccessIterator">RandomAccessIterator</a>
+   * iterator type over the columns or rows as returned by the begin() and end() methods.
+   */
+  random_access_iterator_type iterator;
+  /** This is the const version of iterator (aka read-only) */
+  random_access_iterator_type const_iterator;
+#else
+  typedef internal::subvector_stl_iterator<ExpressionType, DirectionType(Direction)> iterator;
+  typedef internal::subvector_stl_iterator<const ExpressionType, DirectionType(Direction)> const_iterator;
+  typedef internal::subvector_stl_reverse_iterator<ExpressionType, DirectionType(Direction)> reverse_iterator;
+  typedef internal::subvector_stl_reverse_iterator<const ExpressionType, DirectionType(Direction)>
+      const_reverse_iterator;
+#endif
 
-    /** \internal */
-    EIGEN_DEVICE_FUNC
-    inline const ExpressionType& _expression() const { return m_matrix; }
+  /** returns an iterator to the first row (rowwise) or column (colwise) of the nested expression.
+   * \sa end(), cbegin()
+   */
+  iterator begin() { return iterator(m_matrix, 0); }
+  /** const version of begin() */
+  const_iterator begin() const { return const_iterator(m_matrix, 0); }
+  /** const version of begin() */
+  const_iterator cbegin() const { return const_iterator(m_matrix, 0); }
 
-    #ifdef EIGEN_PARSED_BY_DOXYGEN
-    /** STL-like <a href="https://en.cppreference.com/w/cpp/named_req/RandomAccessIterator">RandomAccessIterator</a>
-      * iterator type over the columns or rows as returned by the begin() and end() methods.
-      */
-    random_access_iterator_type iterator;
-    /** This is the const version of iterator (aka read-only) */
-    random_access_iterator_type const_iterator;
-    #else
-    typedef internal::subvector_stl_iterator<ExpressionType,               DirectionType(Direction)> iterator;
-    typedef internal::subvector_stl_iterator<const ExpressionType,         DirectionType(Direction)> const_iterator;
-    typedef internal::subvector_stl_reverse_iterator<ExpressionType,       DirectionType(Direction)> reverse_iterator;
-    typedef internal::subvector_stl_reverse_iterator<const ExpressionType, DirectionType(Direction)> const_reverse_iterator;
-    #endif
+  /** returns a reverse iterator to the last row (rowwise) or column (colwise) of the nested expression.
+   * \sa rend(), crbegin()
+   */
+  reverse_iterator rbegin() {
+    return reverse_iterator(m_matrix, m_matrix.template subVectors<DirectionType(Direction)>() - 1);
+  }
+  /** const version of rbegin() */
+  const_reverse_iterator rbegin() const {
+    return const_reverse_iterator(m_matrix, m_matrix.template subVectors<DirectionType(Direction)>() - 1);
+  }
+  /** const version of rbegin() */
+  const_reverse_iterator crbegin() const {
+    return const_reverse_iterator(m_matrix, m_matrix.template subVectors<DirectionType(Direction)>() - 1);
+  }
 
-    /** returns an iterator to the first row (rowwise) or column (colwise) of the nested expression.
-      * \sa end(), cbegin()
-      */
-    iterator                 begin()       { return iterator      (m_matrix, 0); }
-    /** const version of begin() */
-    const_iterator           begin() const { return const_iterator(m_matrix, 0); }
-    /** const version of begin() */
-    const_iterator          cbegin() const { return const_iterator(m_matrix, 0); }
+  /** returns an iterator to the row (resp. column) following the last row (resp. column) of the nested expression
+   * \sa begin(), cend()
+   */
+  iterator end() { return iterator(m_matrix, m_matrix.template subVectors<DirectionType(Direction)>()); }
+  /** const version of end() */
+  const_iterator end() const {
+    return const_iterator(m_matrix, m_matrix.template subVectors<DirectionType(Direction)>());
+  }
+  /** const version of end() */
+  const_iterator cend() const {
+    return const_iterator(m_matrix, m_matrix.template subVectors<DirectionType(Direction)>());
+  }
 
-    /** returns a reverse iterator to the last row (rowwise) or column (colwise) of the nested expression.
-      * \sa rend(), crbegin()
-      */
-    reverse_iterator        rbegin()       { return reverse_iterator       (m_matrix, m_matrix.template subVectors<DirectionType(Direction)>()-1); }
-	/** const version of rbegin() */
-    const_reverse_iterator  rbegin() const { return const_reverse_iterator (m_matrix, m_matrix.template subVectors<DirectionType(Direction)>()-1); }
-	/** const version of rbegin() */
-	const_reverse_iterator crbegin() const { return const_reverse_iterator (m_matrix, m_matrix.template subVectors<DirectionType(Direction)>()-1); }
+  /** returns a reverse iterator to the row (resp. column) before the first row (resp. column) of the nested expression
+   * \sa begin(), cend()
+   */
+  reverse_iterator rend() { return reverse_iterator(m_matrix, -1); }
+  /** const version of rend() */
+  const_reverse_iterator rend() const { return const_reverse_iterator(m_matrix, -1); }
+  /** const version of rend() */
+  const_reverse_iterator crend() const { return const_reverse_iterator(m_matrix, -1); }
 
-    /** returns an iterator to the row (resp. column) following the last row (resp. column) of the nested expression
-      * \sa begin(), cend()
-      */
-    iterator                 end()         { return iterator      (m_matrix, m_matrix.template subVectors<DirectionType(Direction)>()); }
-    /** const version of end() */
-    const_iterator           end()  const  { return const_iterator(m_matrix, m_matrix.template subVectors<DirectionType(Direction)>()); }
-    /** const version of end() */
-    const_iterator          cend()  const  { return const_iterator(m_matrix, m_matrix.template subVectors<DirectionType(Direction)>()); }
+  /** \returns a row or column vector expression of \c *this reduxed by \a func
+   *
+   * The template parameter \a BinaryOp is the type of the functor
+   * of the custom redux operator. Note that func must be an associative operator.
+   *
+   * \warning the size along the reduction direction must be strictly positive,
+   *          otherwise an assertion is triggered.
+   *
+   * \sa class VectorwiseOp, DenseBase::colwise(), DenseBase::rowwise()
+   */
+  template <typename BinaryOp>
+  EIGEN_DEVICE_FUNC const typename ReduxReturnType<BinaryOp>::Type redux(const BinaryOp& func = BinaryOp()) const {
+    eigen_assert(redux_length() > 0 && "you are using an empty matrix");
+    return typename ReduxReturnType<BinaryOp>::Type(_expression(), internal::member_redux<BinaryOp, Scalar>(func));
+  }
 
-    /** returns a reverse iterator to the row (resp. column) before the first row (resp. column) of the nested expression
-      * \sa begin(), cend()
-      */
-    reverse_iterator        rend()         { return reverse_iterator       (m_matrix, -1); }
-    /** const version of rend() */
-    const_reverse_iterator  rend()  const  { return const_reverse_iterator (m_matrix, -1); }
-    /** const version of rend() */
-    const_reverse_iterator crend()  const  { return const_reverse_iterator (m_matrix, -1); }
+  typedef typename ReturnType<internal::member_minCoeff>::Type MinCoeffReturnType;
+  typedef typename ReturnType<internal::member_maxCoeff>::Type MaxCoeffReturnType;
+  typedef PartialReduxExpr<const CwiseUnaryOp<internal::scalar_abs2_op<Scalar>, const ExpressionTypeNestedCleaned>,
+                           internal::member_sum<RealScalar, RealScalar>, Direction>
+      SquaredNormReturnType;
+  typedef CwiseUnaryOp<internal::scalar_sqrt_op<RealScalar>, const SquaredNormReturnType> NormReturnType;
+  typedef typename ReturnType<internal::member_blueNorm, RealScalar>::Type BlueNormReturnType;
+  typedef typename ReturnType<internal::member_stableNorm, RealScalar>::Type StableNormReturnType;
+  typedef typename ReturnType<internal::member_hypotNorm, RealScalar>::Type HypotNormReturnType;
+  typedef typename ReturnType<internal::member_sum>::Type SumReturnType;
+  typedef EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(SumReturnType, Scalar, quotient) MeanReturnType;
+  typedef typename ReturnType<internal::member_all, bool>::Type AllReturnType;
+  typedef typename ReturnType<internal::member_any, bool>::Type AnyReturnType;
+  typedef PartialReduxExpr<ExpressionType, internal::member_count<Index, Scalar>, Direction> CountReturnType;
+  typedef typename ReturnType<internal::member_prod>::Type ProdReturnType;
+  typedef Reverse<const ExpressionType, Direction> ConstReverseReturnType;
+  typedef Reverse<ExpressionType, Direction> ReverseReturnType;
 
-    /** \returns a row or column vector expression of \c *this reduxed by \a func
-      *
-      * The template parameter \a BinaryOp is the type of the functor
-      * of the custom redux operator. Note that func must be an associative operator.
-      *
-      * \warning the size along the reduction direction must be strictly positive,
-      *          otherwise an assertion is triggered.
-      *
-      * \sa class VectorwiseOp, DenseBase::colwise(), DenseBase::rowwise()
-      */
-    template<typename BinaryOp>
-    EIGEN_DEVICE_FUNC
-    const typename ReduxReturnType<BinaryOp>::Type
-    redux(const BinaryOp& func = BinaryOp()) const
-    {
-      eigen_assert(redux_length()>0 && "you are using an empty matrix");
-      return typename ReduxReturnType<BinaryOp>::Type(_expression(), internal::member_redux<BinaryOp,Scalar>(func));
-    }
+  template <int p>
+  struct LpNormReturnType {
+    typedef PartialReduxExpr<ExpressionType, internal::member_lpnorm<p, RealScalar, Scalar>, Direction> Type;
+  };
 
-    typedef typename ReturnType<internal::member_minCoeff>::Type MinCoeffReturnType;
-    typedef typename ReturnType<internal::member_maxCoeff>::Type MaxCoeffReturnType;
-    typedef PartialReduxExpr<const CwiseUnaryOp<internal::scalar_abs2_op<Scalar>, const ExpressionTypeNestedCleaned>,internal::member_sum<RealScalar,RealScalar>,Direction> SquaredNormReturnType;
-    typedef CwiseUnaryOp<internal::scalar_sqrt_op<RealScalar>, const SquaredNormReturnType> NormReturnType;
-    typedef typename ReturnType<internal::member_blueNorm,RealScalar>::Type BlueNormReturnType;
-    typedef typename ReturnType<internal::member_stableNorm,RealScalar>::Type StableNormReturnType;
-    typedef typename ReturnType<internal::member_hypotNorm,RealScalar>::Type HypotNormReturnType;
-    typedef typename ReturnType<internal::member_sum>::Type SumReturnType;
-    typedef EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(SumReturnType,Scalar,quotient) MeanReturnType;
-    typedef typename ReturnType<internal::member_all, bool>::Type AllReturnType;
-    typedef typename ReturnType<internal::member_any, bool>::Type AnyReturnType;
-    typedef PartialReduxExpr<ExpressionType, internal::member_count<Index,Scalar>, Direction> CountReturnType;
-    typedef typename ReturnType<internal::member_prod>::Type ProdReturnType;
-    typedef Reverse<const ExpressionType, Direction> ConstReverseReturnType;
-    typedef Reverse<ExpressionType, Direction> ReverseReturnType;
+  /** \returns a row (or column) vector expression of the smallest coefficient
+   * of each column (or row) of the referenced expression.
+   *
+   * \warning the size along the reduction direction must be strictly positive,
+   *          otherwise an assertion is triggered.
+   *
+   * \warning the result is undefined if \c *this contains NaN.
+   *
+   * Example: \include PartialRedux_minCoeff.cpp
+   * Output: \verbinclude PartialRedux_minCoeff.out
+   *
+   * \sa DenseBase::minCoeff() */
+  EIGEN_DEVICE_FUNC const MinCoeffReturnType minCoeff() const {
+    eigen_assert(redux_length() > 0 && "you are using an empty matrix");
+    return MinCoeffReturnType(_expression());
+  }
 
-    template<int p> struct LpNormReturnType {
-      typedef PartialReduxExpr<ExpressionType, internal::member_lpnorm<p,RealScalar,Scalar>,Direction> Type;
-    };
+  /** \returns a row (or column) vector expression of the largest coefficient
+   * of each column (or row) of the referenced expression.
+   *
+   * \warning the size along the reduction direction must be strictly positive,
+   *          otherwise an assertion is triggered.
+   *
+   * \warning the result is undefined if \c *this contains NaN.
+   *
+   * Example: \include PartialRedux_maxCoeff.cpp
+   * Output: \verbinclude PartialRedux_maxCoeff.out
+   *
+   * \sa DenseBase::maxCoeff() */
+  EIGEN_DEVICE_FUNC const MaxCoeffReturnType maxCoeff() const {
+    eigen_assert(redux_length() > 0 && "you are using an empty matrix");
+    return MaxCoeffReturnType(_expression());
+  }
 
-    /** \returns a row (or column) vector expression of the smallest coefficient
-      * of each column (or row) of the referenced expression.
-      *
-      * \warning the size along the reduction direction must be strictly positive,
-      *          otherwise an assertion is triggered.
-      *
-      * \warning the result is undefined if \c *this contains NaN.
-      *
-      * Example: \include PartialRedux_minCoeff.cpp
-      * Output: \verbinclude PartialRedux_minCoeff.out
-      *
-      * \sa DenseBase::minCoeff() */
-    EIGEN_DEVICE_FUNC
-    const MinCoeffReturnType minCoeff() const
-    {
-      eigen_assert(redux_length()>0 && "you are using an empty matrix");
-      return MinCoeffReturnType(_expression());
-    }
+  /** \returns a row (or column) vector expression of the squared norm
+   * of each column (or row) of the referenced expression.
+   * This is a vector with real entries, even if the original matrix has complex entries.
+   *
+   * Example: \include PartialRedux_squaredNorm.cpp
+   * Output: \verbinclude PartialRedux_squaredNorm.out
+   *
+   * \sa DenseBase::squaredNorm() */
+  EIGEN_DEVICE_FUNC const SquaredNormReturnType squaredNorm() const {
+    return SquaredNormReturnType(m_matrix.cwiseAbs2());
+  }
 
-    /** \returns a row (or column) vector expression of the largest coefficient
-      * of each column (or row) of the referenced expression.
-      *
-      * \warning the size along the reduction direction must be strictly positive,
-      *          otherwise an assertion is triggered.
-      *
-      * \warning the result is undefined if \c *this contains NaN.
-      *
-      * Example: \include PartialRedux_maxCoeff.cpp
-      * Output: \verbinclude PartialRedux_maxCoeff.out
-      *
-      * \sa DenseBase::maxCoeff() */
-    EIGEN_DEVICE_FUNC
-    const MaxCoeffReturnType maxCoeff() const
-    {
-      eigen_assert(redux_length()>0 && "you are using an empty matrix");
-      return MaxCoeffReturnType(_expression());
-    }
+  /** \returns a row (or column) vector expression of the norm
+   * of each column (or row) of the referenced expression.
+   * This is a vector with real entries, even if the original matrix has complex entries.
+   *
+   * Example: \include PartialRedux_norm.cpp
+   * Output: \verbinclude PartialRedux_norm.out
+   *
+   * \sa DenseBase::norm() */
+  EIGEN_DEVICE_FUNC const NormReturnType norm() const { return NormReturnType(squaredNorm()); }
 
-    /** \returns a row (or column) vector expression of the squared norm
-      * of each column (or row) of the referenced expression.
-      * This is a vector with real entries, even if the original matrix has complex entries.
-      *
-      * Example: \include PartialRedux_squaredNorm.cpp
-      * Output: \verbinclude PartialRedux_squaredNorm.out
-      *
-      * \sa DenseBase::squaredNorm() */
-    EIGEN_DEVICE_FUNC
-    const SquaredNormReturnType squaredNorm() const
-    { return SquaredNormReturnType(m_matrix.cwiseAbs2()); }
+  /** \returns a row (or column) vector expression of the norm
+   * of each column (or row) of the referenced expression.
+   * This is a vector with real entries, even if the original matrix has complex entries.
+   *
+   * Example: \include PartialRedux_norm.cpp
+   * Output: \verbinclude PartialRedux_norm.out
+   *
+   * \sa DenseBase::norm() */
+  template <int p>
+  EIGEN_DEVICE_FUNC const typename LpNormReturnType<p>::Type lpNorm() const {
+    return typename LpNormReturnType<p>::Type(_expression());
+  }
 
-    /** \returns a row (or column) vector expression of the norm
-      * of each column (or row) of the referenced expression.
-      * This is a vector with real entries, even if the original matrix has complex entries.
-      *
-      * Example: \include PartialRedux_norm.cpp
-      * Output: \verbinclude PartialRedux_norm.out
-      *
-      * \sa DenseBase::norm() */
-    EIGEN_DEVICE_FUNC
-    const NormReturnType norm() const
-    { return NormReturnType(squaredNorm()); }
+  /** \returns a row (or column) vector expression of the norm
+   * of each column (or row) of the referenced expression, using
+   * Blue's algorithm.
+   * This is a vector with real entries, even if the original matrix has complex entries.
+   *
+   * \sa DenseBase::blueNorm() */
+  EIGEN_DEVICE_FUNC const BlueNormReturnType blueNorm() const { return BlueNormReturnType(_expression()); }
 
-    /** \returns a row (or column) vector expression of the norm
-      * of each column (or row) of the referenced expression.
-      * This is a vector with real entries, even if the original matrix has complex entries.
-      *
-      * Example: \include PartialRedux_norm.cpp
-      * Output: \verbinclude PartialRedux_norm.out
-      *
-      * \sa DenseBase::norm() */
-    template<int p>
-    EIGEN_DEVICE_FUNC
-    const typename LpNormReturnType<p>::Type lpNorm() const
-    { return typename LpNormReturnType<p>::Type(_expression()); }
+  /** \returns a row (or column) vector expression of the norm
+   * of each column (or row) of the referenced expression, avoiding
+   * underflow and overflow.
+   * This is a vector with real entries, even if the original matrix has complex entries.
+   *
+   * \sa DenseBase::stableNorm() */
+  EIGEN_DEVICE_FUNC const StableNormReturnType stableNorm() const { return StableNormReturnType(_expression()); }
 
+  /** \returns a row (or column) vector expression of the norm
+   * of each column (or row) of the referenced expression, avoiding
+   * underflow and overflow using a concatenation of hypot() calls.
+   * This is a vector with real entries, even if the original matrix has complex entries.
+   *
+   * \sa DenseBase::hypotNorm() */
+  EIGEN_DEVICE_FUNC const HypotNormReturnType hypotNorm() const { return HypotNormReturnType(_expression()); }
 
-    /** \returns a row (or column) vector expression of the norm
-      * of each column (or row) of the referenced expression, using
-      * Blue's algorithm.
-      * This is a vector with real entries, even if the original matrix has complex entries.
-      *
-      * \sa DenseBase::blueNorm() */
-    EIGEN_DEVICE_FUNC
-    const BlueNormReturnType blueNorm() const
-    { return BlueNormReturnType(_expression()); }
+  /** \returns a row (or column) vector expression of the sum
+   * of each column (or row) of the referenced expression.
+   *
+   * Example: \include PartialRedux_sum.cpp
+   * Output: \verbinclude PartialRedux_sum.out
+   *
+   * \sa DenseBase::sum() */
+  EIGEN_DEVICE_FUNC const SumReturnType sum() const { return SumReturnType(_expression()); }
 
+  /** \returns a row (or column) vector expression of the mean
+   * of each column (or row) of the referenced expression.
+   *
+   * \sa DenseBase::mean() */
+  EIGEN_DEVICE_FUNC const MeanReturnType mean() const {
+    return sum() / Scalar(Direction == Vertical ? m_matrix.rows() : m_matrix.cols());
+  }
 
-    /** \returns a row (or column) vector expression of the norm
-      * of each column (or row) of the referenced expression, avoiding
-      * underflow and overflow.
-      * This is a vector with real entries, even if the original matrix has complex entries.
-      *
-      * \sa DenseBase::stableNorm() */
-    EIGEN_DEVICE_FUNC
-    const StableNormReturnType stableNorm() const
-    { return StableNormReturnType(_expression()); }
+  /** \returns a row (or column) vector expression representing
+   * whether \b all coefficients of each respective column (or row) are \c true.
+   * This expression can be assigned to a vector with entries of type \c bool.
+   *
+   * \sa DenseBase::all() */
+  EIGEN_DEVICE_FUNC const AllReturnType all() const { return AllReturnType(_expression()); }
 
+  /** \returns a row (or column) vector expression representing
+   * whether \b at \b least one coefficient of each respective column (or row) is \c true.
+   * This expression can be assigned to a vector with entries of type \c bool.
+   *
+   * \sa DenseBase::any() */
+  EIGEN_DEVICE_FUNC const AnyReturnType any() const { return AnyReturnType(_expression()); }
 
-    /** \returns a row (or column) vector expression of the norm
-      * of each column (or row) of the referenced expression, avoiding
-      * underflow and overflow using a concatenation of hypot() calls.
-      * This is a vector with real entries, even if the original matrix has complex entries.
-      *
-      * \sa DenseBase::hypotNorm() */
-    EIGEN_DEVICE_FUNC
-    const HypotNormReturnType hypotNorm() const
-    { return HypotNormReturnType(_expression()); }
+  /** \returns a row (or column) vector expression representing
+   * the number of \c true coefficients of each respective column (or row).
+   * This expression can be assigned to a vector whose entries have the same type as is used to
+   * index entries of the original matrix; for dense matrices, this is \c std::ptrdiff_t .
+   *
+   * Example: \include PartialRedux_count.cpp
+   * Output: \verbinclude PartialRedux_count.out
+   *
+   * \sa DenseBase::count() */
+  EIGEN_DEVICE_FUNC const CountReturnType count() const { return CountReturnType(_expression()); }
 
-    /** \returns a row (or column) vector expression of the sum
-      * of each column (or row) of the referenced expression.
-      *
-      * Example: \include PartialRedux_sum.cpp
-      * Output: \verbinclude PartialRedux_sum.out
-      *
-      * \sa DenseBase::sum() */
-    EIGEN_DEVICE_FUNC
-    const SumReturnType sum() const
-    { return SumReturnType(_expression()); }
+  /** \returns a row (or column) vector expression of the product
+   * of each column (or row) of the referenced expression.
+   *
+   * Example: \include PartialRedux_prod.cpp
+   * Output: \verbinclude PartialRedux_prod.out
+   *
+   * \sa DenseBase::prod() */
+  EIGEN_DEVICE_FUNC const ProdReturnType prod() const { return ProdReturnType(_expression()); }
 
-    /** \returns a row (or column) vector expression of the mean
-    * of each column (or row) of the referenced expression.
-    *
-    * \sa DenseBase::mean() */
-    EIGEN_DEVICE_FUNC
-    const MeanReturnType mean() const
-    { return sum() / Scalar(Direction==Vertical?m_matrix.rows():m_matrix.cols()); }
+  /** \returns a matrix expression
+   * where each column (or row) are reversed.
+   *
+   * Example: \include Vectorwise_reverse.cpp
+   * Output: \verbinclude Vectorwise_reverse.out
+   *
+   * \sa DenseBase::reverse() */
+  EIGEN_DEVICE_FUNC const ConstReverseReturnType reverse() const { return ConstReverseReturnType(_expression()); }
 
-    /** \returns a row (or column) vector expression representing
-      * whether \b all coefficients of each respective column (or row) are \c true.
-      * This expression can be assigned to a vector with entries of type \c bool.
-      *
-      * \sa DenseBase::all() */
-    EIGEN_DEVICE_FUNC
-    const AllReturnType all() const
-    { return AllReturnType(_expression()); }
+  /** \returns a writable matrix expression
+   * where each column (or row) are reversed.
+   *
+   * \sa reverse() const */
+  EIGEN_DEVICE_FUNC ReverseReturnType reverse() { return ReverseReturnType(_expression()); }
 
-    /** \returns a row (or column) vector expression representing
-      * whether \b at \b least one coefficient of each respective column (or row) is \c true.
-      * This expression can be assigned to a vector with entries of type \c bool.
-      *
-      * \sa DenseBase::any() */
-    EIGEN_DEVICE_FUNC
-    const AnyReturnType any() const
-    { return AnyReturnType(_expression()); }
+  typedef Replicate<ExpressionType, (isVertical ? Dynamic : 1), (isHorizontal ? Dynamic : 1)> ReplicateReturnType;
+  EIGEN_DEVICE_FUNC const ReplicateReturnType replicate(Index factor) const;
 
-    /** \returns a row (or column) vector expression representing
-      * the number of \c true coefficients of each respective column (or row).
-      * This expression can be assigned to a vector whose entries have the same type as is used to
-      * index entries of the original matrix; for dense matrices, this is \c std::ptrdiff_t .
-      *
-      * Example: \include PartialRedux_count.cpp
-      * Output: \verbinclude PartialRedux_count.out
-      *
-      * \sa DenseBase::count() */
-    EIGEN_DEVICE_FUNC
-    const CountReturnType count() const
-    { return CountReturnType(_expression()); }
+  /**
+   * \return an expression of the replication of each column (or row) of \c *this
+   *
+   * Example: \include DirectionWise_replicate.cpp
+   * Output: \verbinclude DirectionWise_replicate.out
+   *
+   * \sa VectorwiseOp::replicate(Index), DenseBase::replicate(), class Replicate
+   */
+  // NOTE implemented here because of sunstudio's compilation errors
+  // isVertical*Factor+isHorizontal instead of (isVertical?Factor:1) to handle CUDA bug with ternary operator
+  template <int Factor>
+  const Replicate<ExpressionType, isVertical * Factor + isHorizontal,
+                  isHorizontal * Factor + isVertical> EIGEN_DEVICE_FUNC
+  replicate(Index factor = Factor) const {
+    return Replicate<ExpressionType, (isVertical ? Factor : 1), (isHorizontal ? Factor : 1)>(
+        _expression(), isVertical ? factor : 1, isHorizontal ? factor : 1);
+  }
 
-    /** \returns a row (or column) vector expression of the product
-      * of each column (or row) of the referenced expression.
-      *
-      * Example: \include PartialRedux_prod.cpp
-      * Output: \verbinclude PartialRedux_prod.out
-      *
-      * \sa DenseBase::prod() */
-    EIGEN_DEVICE_FUNC
-    const ProdReturnType prod() const
-    { return ProdReturnType(_expression()); }
+  /////////// Artithmetic operators ///////////
 
+  /** Copies the vector \a other to each subvector of \c *this */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC ExpressionType& operator=(const DenseBase<OtherDerived>& other) {
+    EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
+    EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
+    // eigen_assert((m_matrix.isNull()) == (other.isNull())); FIXME
+    return m_matrix = extendedTo(other.derived());
+  }
 
-    /** \returns a matrix expression
-      * where each column (or row) are reversed.
-      *
-      * Example: \include Vectorwise_reverse.cpp
-      * Output: \verbinclude Vectorwise_reverse.out
-      *
-      * \sa DenseBase::reverse() */
-    EIGEN_DEVICE_FUNC
-    const ConstReverseReturnType reverse() const
-    { return ConstReverseReturnType( _expression() ); }
+  /** Adds the vector \a other to each subvector of \c *this */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC ExpressionType& operator+=(const DenseBase<OtherDerived>& other) {
+    EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
+    EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
+    return m_matrix += extendedTo(other.derived());
+  }
 
-    /** \returns a writable matrix expression
-      * where each column (or row) are reversed.
-      *
-      * \sa reverse() const */
-    EIGEN_DEVICE_FUNC
-    ReverseReturnType reverse()
-    { return ReverseReturnType( _expression() ); }
+  /** Subtracts the vector \a other to each subvector of \c *this */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC ExpressionType& operator-=(const DenseBase<OtherDerived>& other) {
+    EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
+    EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
+    return m_matrix -= extendedTo(other.derived());
+  }
 
-    typedef Replicate<ExpressionType,(isVertical?Dynamic:1),(isHorizontal?Dynamic:1)> ReplicateReturnType;
-    EIGEN_DEVICE_FUNC
-    const ReplicateReturnType replicate(Index factor) const;
+  /** Multiplies each subvector of \c *this by the vector \a other */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC ExpressionType& operator*=(const DenseBase<OtherDerived>& other) {
+    EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
+    EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
+    EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
+    m_matrix *= extendedTo(other.derived());
+    return m_matrix;
+  }
 
-    /**
-      * \return an expression of the replication of each column (or row) of \c *this
-      *
-      * Example: \include DirectionWise_replicate.cpp
-      * Output: \verbinclude DirectionWise_replicate.out
-      *
-      * \sa VectorwiseOp::replicate(Index), DenseBase::replicate(), class Replicate
-      */
-    // NOTE implemented here because of sunstudio's compilation errors
-    // isVertical*Factor+isHorizontal instead of (isVertical?Factor:1) to handle CUDA bug with ternary operator
-    template<int Factor> const Replicate<ExpressionType,isVertical*Factor+isHorizontal,isHorizontal*Factor+isVertical>
-    EIGEN_DEVICE_FUNC
-    replicate(Index factor = Factor) const
-    {
-      return Replicate<ExpressionType,(isVertical?Factor:1),(isHorizontal?Factor:1)>
-          (_expression(),isVertical?factor:1,isHorizontal?factor:1);
-    }
+  /** Divides each subvector of \c *this by the vector \a other */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC ExpressionType& operator/=(const DenseBase<OtherDerived>& other) {
+    EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
+    EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
+    EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
+    m_matrix /= extendedTo(other.derived());
+    return m_matrix;
+  }
 
-/////////// Artithmetic operators ///////////
+  /** Returns the expression of the sum of the vector \a other to each subvector of \c *this */
+  template <typename OtherDerived>
+  EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
+      CwiseBinaryOp<internal::scalar_sum_op<Scalar, typename OtherDerived::Scalar>, const ExpressionTypeNestedCleaned,
+                    const typename ExtendedType<OtherDerived>::Type>
+      operator+(const DenseBase<OtherDerived>& other) const {
+    EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
+    EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
+    return m_matrix + extendedTo(other.derived());
+  }
 
-    /** Copies the vector \a other to each subvector of \c *this */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    ExpressionType& operator=(const DenseBase<OtherDerived>& other)
-    {
-      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
-      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
-      //eigen_assert((m_matrix.isNull()) == (other.isNull())); FIXME
-      return m_matrix = extendedTo(other.derived());
-    }
+  /** Returns the expression of the difference between each subvector of \c *this and the vector \a other */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC CwiseBinaryOp<internal::scalar_difference_op<Scalar, typename OtherDerived::Scalar>,
+                                  const ExpressionTypeNestedCleaned, const typename ExtendedType<OtherDerived>::Type>
+  operator-(const DenseBase<OtherDerived>& other) const {
+    EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
+    EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
+    return m_matrix - extendedTo(other.derived());
+  }
 
-    /** Adds the vector \a other to each subvector of \c *this */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    ExpressionType& operator+=(const DenseBase<OtherDerived>& other)
-    {
-      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
-      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
-      return m_matrix += extendedTo(other.derived());
-    }
+  /** Returns the expression where each subvector is the product of the vector \a other
+   * by the corresponding subvector of \c *this */
+  template <typename OtherDerived>
+  EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
+      CwiseBinaryOp<internal::scalar_product_op<Scalar>, const ExpressionTypeNestedCleaned,
+                    const typename ExtendedType<OtherDerived>::Type> EIGEN_DEVICE_FUNC
+      operator*(const DenseBase<OtherDerived>& other) const {
+    EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
+    EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
+    EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
+    return m_matrix * extendedTo(other.derived());
+  }
 
-    /** Subtracts the vector \a other to each subvector of \c *this */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    ExpressionType& operator-=(const DenseBase<OtherDerived>& other)
-    {
-      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
-      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
-      return m_matrix -= extendedTo(other.derived());
-    }
+  /** Returns the expression where each subvector is the quotient of the corresponding
+   * subvector of \c *this by the vector \a other */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC CwiseBinaryOp<internal::scalar_quotient_op<Scalar>, const ExpressionTypeNestedCleaned,
+                                  const typename ExtendedType<OtherDerived>::Type>
+  operator/(const DenseBase<OtherDerived>& other) const {
+    EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
+    EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
+    EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
+    return m_matrix / extendedTo(other.derived());
+  }
 
-    /** Multiplies each subvector of \c *this by the vector \a other */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    ExpressionType& operator*=(const DenseBase<OtherDerived>& other)
-    {
-      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
-      EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
-      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
-      m_matrix *= extendedTo(other.derived());
-      return m_matrix;
-    }
+  /** \returns an expression where each column (or row) of the referenced matrix are normalized.
+   * The referenced matrix is \b not modified.
+   * \sa MatrixBase::normalized(), normalize()
+   */
+  EIGEN_DEVICE_FUNC CwiseBinaryOp<internal::scalar_quotient_op<Scalar>, const ExpressionTypeNestedCleaned,
+                                  const typename OppositeExtendedType<NormReturnType>::Type>
+  normalized() const {
+    return m_matrix.cwiseQuotient(extendedToOpposite(this->norm()));
+  }
 
-    /** Divides each subvector of \c *this by the vector \a other */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    ExpressionType& operator/=(const DenseBase<OtherDerived>& other)
-    {
-      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
-      EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
-      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
-      m_matrix /= extendedTo(other.derived());
-      return m_matrix;
-    }
+  /** Normalize in-place each row or columns of the referenced matrix.
+   * \sa MatrixBase::normalize(), normalized()
+   */
+  EIGEN_DEVICE_FUNC void normalize() { m_matrix = this->normalized(); }
 
-    /** Returns the expression of the sum of the vector \a other to each subvector of \c *this */
-    template<typename OtherDerived> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
-    CwiseBinaryOp<internal::scalar_sum_op<Scalar,typename OtherDerived::Scalar>,
-                  const ExpressionTypeNestedCleaned,
-                  const typename ExtendedType<OtherDerived>::Type>
-    operator+(const DenseBase<OtherDerived>& other) const
-    {
-      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
-      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
-      return m_matrix + extendedTo(other.derived());
-    }
+  EIGEN_DEVICE_FUNC inline void reverseInPlace();
 
-    /** Returns the expression of the difference between each subvector of \c *this and the vector \a other */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    CwiseBinaryOp<internal::scalar_difference_op<Scalar,typename OtherDerived::Scalar>,
-                  const ExpressionTypeNestedCleaned,
-                  const typename ExtendedType<OtherDerived>::Type>
-    operator-(const DenseBase<OtherDerived>& other) const
-    {
-      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
-      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
-      return m_matrix - extendedTo(other.derived());
-    }
+  /////////// Geometry module ///////////
 
-    /** Returns the expression where each subvector is the product of the vector \a other
-      * by the corresponding subvector of \c *this */
-    template<typename OtherDerived> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
-    CwiseBinaryOp<internal::scalar_product_op<Scalar>,
-                  const ExpressionTypeNestedCleaned,
-                  const typename ExtendedType<OtherDerived>::Type>
-    EIGEN_DEVICE_FUNC
-    operator*(const DenseBase<OtherDerived>& other) const
-    {
-      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
-      EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
-      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
-      return m_matrix * extendedTo(other.derived());
-    }
+  typedef Homogeneous<ExpressionType, Direction> HomogeneousReturnType;
+  EIGEN_DEVICE_FUNC HomogeneousReturnType homogeneous() const;
 
-    /** Returns the expression where each subvector is the quotient of the corresponding
-      * subvector of \c *this by the vector \a other */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    CwiseBinaryOp<internal::scalar_quotient_op<Scalar>,
-                  const ExpressionTypeNestedCleaned,
-                  const typename ExtendedType<OtherDerived>::Type>
-    operator/(const DenseBase<OtherDerived>& other) const
-    {
-      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
-      EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
-      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
-      return m_matrix / extendedTo(other.derived());
-    }
+  typedef typename ExpressionType::PlainObject CrossReturnType;
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC const CrossReturnType cross(const MatrixBase<OtherDerived>& other) const;
 
-    /** \returns an expression where each column (or row) of the referenced matrix are normalized.
-      * The referenced matrix is \b not modified.
-      * \sa MatrixBase::normalized(), normalize()
-      */
-    EIGEN_DEVICE_FUNC
-    CwiseBinaryOp<internal::scalar_quotient_op<Scalar>,
-                  const ExpressionTypeNestedCleaned,
-                  const typename OppositeExtendedType<NormReturnType>::Type>
-    normalized() const { return m_matrix.cwiseQuotient(extendedToOpposite(this->norm())); }
-
-
-    /** Normalize in-place each row or columns of the referenced matrix.
-      * \sa MatrixBase::normalize(), normalized()
-      */
-    EIGEN_DEVICE_FUNC void normalize() {
-      m_matrix = this->normalized();
-    }
-
-    EIGEN_DEVICE_FUNC inline void reverseInPlace();
-
-/////////// Geometry module ///////////
-
-    typedef Homogeneous<ExpressionType,Direction> HomogeneousReturnType;
-    EIGEN_DEVICE_FUNC
-    HomogeneousReturnType homogeneous() const;
-
-    typedef typename ExpressionType::PlainObject CrossReturnType;
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    const CrossReturnType cross(const MatrixBase<OtherDerived>& other) const;
-
-    enum {
-      HNormalized_Size = Direction==Vertical ? internal::traits<ExpressionType>::RowsAtCompileTime
+  enum {
+    HNormalized_Size = Direction == Vertical ? internal::traits<ExpressionType>::RowsAtCompileTime
                                              : internal::traits<ExpressionType>::ColsAtCompileTime,
-      HNormalized_SizeMinusOne = HNormalized_Size==Dynamic ? Dynamic : HNormalized_Size-1
-    };
-    typedef Block<const ExpressionType,
-                  Direction==Vertical   ? int(HNormalized_SizeMinusOne)
-                                        : int(internal::traits<ExpressionType>::RowsAtCompileTime),
-                  Direction==Horizontal ? int(HNormalized_SizeMinusOne)
+    HNormalized_SizeMinusOne = HNormalized_Size == Dynamic ? Dynamic : HNormalized_Size - 1
+  };
+  typedef Block<const ExpressionType,
+                Direction == Vertical ? int(HNormalized_SizeMinusOne)
+                                      : int(internal::traits<ExpressionType>::RowsAtCompileTime),
+                Direction == Horizontal ? int(HNormalized_SizeMinusOne)
                                         : int(internal::traits<ExpressionType>::ColsAtCompileTime)>
-            HNormalized_Block;
-    typedef Block<const ExpressionType,
-                  Direction==Vertical   ? 1 : int(internal::traits<ExpressionType>::RowsAtCompileTime),
-                  Direction==Horizontal ? 1 : int(internal::traits<ExpressionType>::ColsAtCompileTime)>
-            HNormalized_Factors;
-    typedef CwiseBinaryOp<internal::scalar_quotient_op<typename internal::traits<ExpressionType>::Scalar>,
-                const HNormalized_Block,
-                const Replicate<HNormalized_Factors,
-                  Direction==Vertical   ? HNormalized_SizeMinusOne : 1,
-                  Direction==Horizontal ? HNormalized_SizeMinusOne : 1> >
-            HNormalizedReturnType;
+      HNormalized_Block;
+  typedef Block<const ExpressionType,
+                Direction == Vertical ? 1 : int(internal::traits<ExpressionType>::RowsAtCompileTime),
+                Direction == Horizontal ? 1 : int(internal::traits<ExpressionType>::ColsAtCompileTime)>
+      HNormalized_Factors;
+  typedef CwiseBinaryOp<internal::scalar_quotient_op<typename internal::traits<ExpressionType>::Scalar>,
+                        const HNormalized_Block,
+                        const Replicate<HNormalized_Factors, Direction == Vertical ? HNormalized_SizeMinusOne : 1,
+                                        Direction == Horizontal ? HNormalized_SizeMinusOne : 1> >
+      HNormalizedReturnType;
 
-    EIGEN_DEVICE_FUNC
-    const HNormalizedReturnType hnormalized() const;
+  EIGEN_DEVICE_FUNC const HNormalizedReturnType hnormalized() const;
 
-#   ifdef EIGEN_VECTORWISEOP_PLUGIN
-#     include EIGEN_VECTORWISEOP_PLUGIN
-#   endif
+#ifdef EIGEN_VECTORWISEOP_PLUGIN
+#include EIGEN_VECTORWISEOP_PLUGIN
+#endif
 
-  protected:
-    EIGEN_DEVICE_FUNC Index redux_length() const
-    {
-      return Direction==Vertical ? m_matrix.rows() : m_matrix.cols();
-    }
-    ExpressionTypeNested m_matrix;
+ protected:
+  EIGEN_DEVICE_FUNC Index redux_length() const { return Direction == Vertical ? m_matrix.rows() : m_matrix.cols(); }
+  ExpressionTypeNested m_matrix;
 };
 
-//const colwise moved to DenseBase.h due to CUDA compiler bug
-
+// const colwise moved to DenseBase.h due to CUDA compiler bug
 
 /** \returns a writable VectorwiseOp wrapper of *this providing additional partial reduction operations
-  *
-  * \sa rowwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC inline typename DenseBase<Derived>::ColwiseReturnType
-DenseBase<Derived>::colwise()
-{
+ *
+ * \sa rowwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC inline typename DenseBase<Derived>::ColwiseReturnType DenseBase<Derived>::colwise() {
   return ColwiseReturnType(derived());
 }
 
-//const rowwise moved to DenseBase.h due to CUDA compiler bug
-
+// const rowwise moved to DenseBase.h due to CUDA compiler bug
 
 /** \returns a writable VectorwiseOp wrapper of *this providing additional partial reduction operations
-  *
-  * \sa colwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC inline typename DenseBase<Derived>::RowwiseReturnType
-DenseBase<Derived>::rowwise()
-{
+ *
+ * \sa colwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC inline typename DenseBase<Derived>::RowwiseReturnType DenseBase<Derived>::rowwise() {
   return RowwiseReturnType(derived());
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_PARTIAL_REDUX_H
+#endif  // EIGEN_PARTIAL_REDUX_H
diff --git a/Eigen/src/Core/Visitor.h b/Eigen/src/Core/Visitor.h
index 6fb00e0..037a605 100644
--- a/Eigen/src/Core/Visitor.h
+++ b/Eigen/src/Core/Visitor.h
@@ -48,58 +48,40 @@
 
   static constexpr bool CanVectorize(int K) {
     constexpr int InnerSizeAtCompileTime = RowMajor ? ColsAtCompileTime : RowsAtCompileTime;
-    if(InnerSizeAtCompileTime < PacketSize) return false;
+    if (InnerSizeAtCompileTime < PacketSize) return false;
     return Vectorize && (InnerSizeAtCompileTime - (K % InnerSizeAtCompileTime) >= PacketSize);
   }
 
-  template <int K = 0,
-      bool Empty = (K == UnrollCount),
-      std::enable_if_t<Empty, bool> = true>
+  template <int K = 0, bool Empty = (K == UnrollCount), std::enable_if_t<Empty, bool> = true>
   static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Derived&, Visitor&) {}
 
-  template <int K = 0,
-      bool Empty = (K == UnrollCount),
-      bool Initialize = (K == 0),
-      bool DoVectorOp = CanVectorize(K),
-      std::enable_if_t<!Empty && Initialize && !DoVectorOp, bool> = true>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Derived& mat, Visitor& visitor)
-  {
+  template <int K = 0, bool Empty = (K == UnrollCount), bool Initialize = (K == 0), bool DoVectorOp = CanVectorize(K),
+            std::enable_if_t<!Empty && Initialize && !DoVectorOp, bool> = true>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Derived& mat, Visitor& visitor) {
     visitor.init(mat.coeff(0, 0), 0, 0);
     run<1>(mat, visitor);
   }
 
-  template <int K = 0,
-      bool Empty = (K == UnrollCount),
-      bool Initialize = (K == 0),
-      bool DoVectorOp = CanVectorize(K),
-      std::enable_if_t<!Empty && !Initialize && !DoVectorOp, bool> = true>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Derived& mat, Visitor& visitor)
-  {
+  template <int K = 0, bool Empty = (K == UnrollCount), bool Initialize = (K == 0), bool DoVectorOp = CanVectorize(K),
+            std::enable_if_t<!Empty && !Initialize && !DoVectorOp, bool> = true>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Derived& mat, Visitor& visitor) {
     static constexpr int R = RowMajor ? (K / ColsAtCompileTime) : (K % RowsAtCompileTime);
     static constexpr int C = RowMajor ? (K % ColsAtCompileTime) : (K / RowsAtCompileTime);
     visitor(mat.coeff(R, C), R, C);
     run<K + 1>(mat, visitor);
   }
 
-  template <int K = 0,
-      bool Empty = (K == UnrollCount),
-      bool Initialize = (K == 0),
-      bool DoVectorOp = CanVectorize(K),
-      std::enable_if_t<!Empty && Initialize && DoVectorOp, bool> = true>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Derived& mat, Visitor& visitor)
-  {
+  template <int K = 0, bool Empty = (K == UnrollCount), bool Initialize = (K == 0), bool DoVectorOp = CanVectorize(K),
+            std::enable_if_t<!Empty && Initialize && DoVectorOp, bool> = true>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Derived& mat, Visitor& visitor) {
     Packet P = mat.template packet<Packet>(0, 0);
     visitor.initpacket(P, 0, 0);
     run<PacketSize>(mat, visitor);
   }
 
-  template <int K = 0,
-      bool Empty = (K == UnrollCount),
-      bool Initialize = (K == 0),
-      bool DoVectorOp = CanVectorize(K),
-      std::enable_if_t<!Empty && !Initialize && DoVectorOp, bool> = true>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Derived& mat, Visitor& visitor)
-  {
+  template <int K = 0, bool Empty = (K == UnrollCount), bool Initialize = (K == 0), bool DoVectorOp = CanVectorize(K),
+            std::enable_if_t<!Empty && !Initialize && DoVectorOp, bool> = true>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Derived& mat, Visitor& visitor) {
     static constexpr int R = RowMajor ? (K / ColsAtCompileTime) : (K % RowsAtCompileTime);
     static constexpr int C = RowMajor ? (K % ColsAtCompileTime) : (K / RowsAtCompileTime);
     Packet P = mat.template packet<Packet>(R, C);
@@ -116,44 +98,31 @@
   using Packet = typename packet_traits<Scalar>::type;
   static constexpr int PacketSize = packet_traits<Scalar>::size;
 
-  static constexpr bool CanVectorize(int K) {
-      return Vectorize && ((UnrollCount - K) >= PacketSize);
-  }
+  static constexpr bool CanVectorize(int K) { return Vectorize && ((UnrollCount - K) >= PacketSize); }
 
   // empty
-  template <int K = 0,
-      bool Empty = (K == UnrollCount),
-      std::enable_if_t<Empty, bool> = true>
+  template <int K = 0, bool Empty = (K == UnrollCount), std::enable_if_t<Empty, bool> = true>
   static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Derived&, Visitor&) {}
 
   // scalar initialization
-  template <int K = 0,
-      bool Empty = (K == UnrollCount),
-      bool Initialize = (K == 0),
-      bool DoVectorOp = CanVectorize(K),
-      std::enable_if_t<!Empty && Initialize && !DoVectorOp, bool> = true>
+  template <int K = 0, bool Empty = (K == UnrollCount), bool Initialize = (K == 0), bool DoVectorOp = CanVectorize(K),
+            std::enable_if_t<!Empty && Initialize && !DoVectorOp, bool> = true>
   static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Derived& mat, Visitor& visitor) {
     visitor.init(mat.coeff(0), 0);
     run<1>(mat, visitor);
   }
 
   // scalar iteration
-  template <int K = 0,
-      bool Empty = (K == UnrollCount),
-      bool Initialize = (K == 0),
-      bool DoVectorOp = CanVectorize(K),
-      std::enable_if_t<!Empty && !Initialize && !DoVectorOp, bool> = true>
+  template <int K = 0, bool Empty = (K == UnrollCount), bool Initialize = (K == 0), bool DoVectorOp = CanVectorize(K),
+            std::enable_if_t<!Empty && !Initialize && !DoVectorOp, bool> = true>
   static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Derived& mat, Visitor& visitor) {
     visitor(mat.coeff(K), K);
     run<K + 1>(mat, visitor);
   }
 
   // vector initialization
-  template <int K = 0,
-      bool Empty = (K == UnrollCount),
-      bool Initialize = (K == 0),
-      bool DoVectorOp = CanVectorize(K),
-      std::enable_if_t<!Empty && Initialize && DoVectorOp, bool> = true>
+  template <int K = 0, bool Empty = (K == UnrollCount), bool Initialize = (K == 0), bool DoVectorOp = CanVectorize(K),
+            std::enable_if_t<!Empty && Initialize && DoVectorOp, bool> = true>
   static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Derived& mat, Visitor& visitor) {
     Packet P = mat.template packet<Packet>(0);
     visitor.initpacket(P, 0);
@@ -161,11 +130,8 @@
   }
 
   // vector iteration
-  template <int K = 0,
-      bool Empty = (K == UnrollCount),
-      bool Initialize = (K == 0),
-      bool DoVectorOp = CanVectorize(K),
-      std::enable_if_t<!Empty && !Initialize && DoVectorOp, bool> = true>
+  template <int K = 0, bool Empty = (K == UnrollCount), bool Initialize = (K == 0), bool DoVectorOp = CanVectorize(K),
+            std::enable_if_t<!Empty && !Initialize && DoVectorOp, bool> = true>
   static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Derived& mat, Visitor& visitor) {
     Packet P = mat.template packet<Packet>(K);
     visitor.packet(P, K);
@@ -190,7 +156,7 @@
         Index r = RowMajor ? 0 : i;
         Index c = RowMajor ? i : 0;
         visitor(mat.coeff(r, c), r, c);
-        if EIGEN_PREDICT_FALSE(short_circuit::run(visitor)) return;
+        if EIGEN_PREDICT_FALSE (short_circuit::run(visitor)) return;
       }
     }
     for (Index j = 1; j < outerSize; j++) {
@@ -198,7 +164,7 @@
         Index r = RowMajor ? j : i;
         Index c = RowMajor ? i : j;
         visitor(mat.coeff(r, c), r, c);
-        if EIGEN_PREDICT_FALSE(short_circuit::run(visitor)) return;
+        if EIGEN_PREDICT_FALSE (short_circuit::run(visitor)) return;
       }
     }
   }
@@ -227,19 +193,19 @@
         visitor.initpacket(p, 0, 0);
         i = PacketSize;
       }
-      if EIGEN_PREDICT_FALSE(short_circuit::run(visitor)) return;
+      if EIGEN_PREDICT_FALSE (short_circuit::run(visitor)) return;
       for (; i + PacketSize - 1 < innerSize; i += PacketSize) {
         Index r = RowMajor ? 0 : i;
         Index c = RowMajor ? i : 0;
         Packet p = mat.template packet<Packet>(r, c);
         visitor.packet(p, r, c);
-        if EIGEN_PREDICT_FALSE(short_circuit::run(visitor)) return;
+        if EIGEN_PREDICT_FALSE (short_circuit::run(visitor)) return;
       }
       for (; i < innerSize; ++i) {
         Index r = RowMajor ? 0 : i;
         Index c = RowMajor ? i : 0;
         visitor(mat.coeff(r, c), r, c);
-        if EIGEN_PREDICT_FALSE(short_circuit::run(visitor)) return;
+        if EIGEN_PREDICT_FALSE (short_circuit::run(visitor)) return;
       }
     }
     for (Index j = 1; j < outerSize; j++) {
@@ -249,13 +215,13 @@
         Index c = RowMajor ? i : j;
         Packet p = mat.template packet<Packet>(r, c);
         visitor.packet(p, r, c);
-        if EIGEN_PREDICT_FALSE(short_circuit::run(visitor)) return;
+        if EIGEN_PREDICT_FALSE (short_circuit::run(visitor)) return;
       }
       for (; i < innerSize; ++i) {
         Index r = RowMajor ? j : i;
         Index c = RowMajor ? i : j;
         visitor(mat.coeff(r, c), r, c);
-        if EIGEN_PREDICT_FALSE(short_circuit::run(visitor)) return;
+        if EIGEN_PREDICT_FALSE (short_circuit::run(visitor)) return;
       }
     }
   }
@@ -270,10 +236,10 @@
     const Index size = mat.size();
     if (size == 0) return;
     visitor.init(mat.coeff(0), 0);
-    if EIGEN_PREDICT_FALSE(short_circuit::run(visitor)) return;
+    if EIGEN_PREDICT_FALSE (short_circuit::run(visitor)) return;
     for (Index k = 1; k < size; k++) {
       visitor(mat.coeff(k), k);
-      if EIGEN_PREDICT_FALSE(short_circuit::run(visitor)) return;
+      if EIGEN_PREDICT_FALSE (short_circuit::run(visitor)) return;
     }
   }
 };
@@ -298,24 +264,23 @@
       visitor.initpacket(p, k);
       k = PacketSize;
     }
-    if EIGEN_PREDICT_FALSE(short_circuit::run(visitor)) return;
+    if EIGEN_PREDICT_FALSE (short_circuit::run(visitor)) return;
     for (; k + PacketSize - 1 < size; k += PacketSize) {
       Packet p = mat.template packet<Packet>(k);
       visitor.packet(p, k);
-      if EIGEN_PREDICT_FALSE(short_circuit::run(visitor)) return;
+      if EIGEN_PREDICT_FALSE (short_circuit::run(visitor)) return;
     }
     for (; k < size; k++) {
       visitor(mat.coeff(k), k);
-      if EIGEN_PREDICT_FALSE(short_circuit::run(visitor)) return;
+      if EIGEN_PREDICT_FALSE (short_circuit::run(visitor)) return;
     }
   }
 };
 
 // evaluator adaptor
-template<typename XprType>
-class visitor_evaluator
-{
-public:
+template <typename XprType>
+class visitor_evaluator {
+ public:
   typedef evaluator<XprType> Evaluator;
   typedef typename XprType::Scalar Scalar;
   using Packet = typename packet_traits<Scalar>::type;
@@ -329,14 +294,15 @@
   static constexpr int XprAlignment = Evaluator::Alignment;
   static constexpr int CoeffReadCost = Evaluator::CoeffReadCost;
 
-  EIGEN_DEVICE_FUNC
-  explicit visitor_evaluator(const XprType &xpr) : m_evaluator(xpr), m_xpr(xpr) { }
+  EIGEN_DEVICE_FUNC explicit visitor_evaluator(const XprType& xpr) : m_evaluator(xpr), m_xpr(xpr) {}
 
   EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_xpr.rows(); }
   EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_xpr.cols(); }
   EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index size() const EIGEN_NOEXCEPT { return m_xpr.size(); }
   // outer-inner access
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const { return m_evaluator.coeff(row, col); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const {
+    return m_evaluator.coeff(row, col);
+  }
   template <typename Packet, int Alignment = Unaligned>
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packet(Index row, Index col) const {
     return m_evaluator.template packet<Alignment, Packet>(row, col);
@@ -348,9 +314,9 @@
     return m_evaluator.template packet<Alignment, Packet>(index);
   }
 
-protected:
+ protected:
   Evaluator m_evaluator;
-  const XprType &m_xpr;
+  const XprType& m_xpr;
 };
 
 template <typename Derived, typename Visitor, bool ShortCircuitEvaulation>
@@ -365,11 +331,15 @@
   static constexpr int InnerSizeAtCompileTime = IsRowMajor ? ColsAtCompileTime : RowsAtCompileTime;
   static constexpr int OuterSizeAtCompileTime = IsRowMajor ? RowsAtCompileTime : ColsAtCompileTime;
 
-  static constexpr bool LinearAccess = Evaluator::LinearAccess && static_cast<bool>(functor_traits<Visitor>::LinearAccess);
+  static constexpr bool LinearAccess =
+      Evaluator::LinearAccess && static_cast<bool>(functor_traits<Visitor>::LinearAccess);
   static constexpr bool Vectorize = Evaluator::PacketAccess && static_cast<bool>(functor_traits<Visitor>::PacketAccess);
 
   static constexpr int PacketSize = packet_traits<Scalar>::size;
-  static constexpr int VectorOps = Vectorize ? (LinearAccess ? (SizeAtCompileTime / PacketSize) : (OuterSizeAtCompileTime * (InnerSizeAtCompileTime / PacketSize))) : 0;
+  static constexpr int VectorOps =
+      Vectorize ? (LinearAccess ? (SizeAtCompileTime / PacketSize)
+                                : (OuterSizeAtCompileTime * (InnerSizeAtCompileTime / PacketSize)))
+                : 0;
   static constexpr int ScalarOps = SizeAtCompileTime - (VectorOps * PacketSize);
   // treat vector op and scalar op as same cost for unroll logic
   static constexpr int TotalOps = VectorOps + ScalarOps;
@@ -378,7 +348,6 @@
   static constexpr bool Unroll = (SizeAtCompileTime != Dynamic) && ((TotalOps * UnrollCost) <= EIGEN_UNROLLING_LIMIT);
   static constexpr int UnrollCount = Unroll ? int(SizeAtCompileTime) : Dynamic;
 
-
   using impl = visitor_impl<Visitor, Evaluator, UnrollCount, Vectorize, LinearAccess, ShortCircuitEvaulation>;
 
   static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const DenseBase<Derived>& mat, Visitor& visitor) {
@@ -387,60 +356,53 @@
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** Applies the visitor \a visitor to the whole coefficients of the matrix or vector.
-  *
-  * The template parameter \a Visitor is the type of the visitor and provides the following interface:
-  * \code
-  * struct MyVisitor {
-  *   // called for the first coefficient
-  *   void init(const Scalar& value, Index i, Index j);
-  *   // called for all other coefficients
-  *   void operator() (const Scalar& value, Index i, Index j);
-  * };
-  * \endcode
-  *
-  * \note compared to one or two \em for \em loops, visitors offer automatic
-  * unrolling for small fixed size matrix.
-  *
-  * \note if the matrix is empty, then the visitor is left unchanged.
-  *
-  * \sa minCoeff(Index*,Index*), maxCoeff(Index*,Index*), DenseBase::redux()
-  */
-template<typename Derived>
-template<typename Visitor>
-EIGEN_DEVICE_FUNC
-void DenseBase<Derived>::visit(Visitor& visitor) const
-{
-  using impl = internal::visit_impl<Derived, Visitor, /*ShortCircuitEvaulation*/false>;
+ *
+ * The template parameter \a Visitor is the type of the visitor and provides the following interface:
+ * \code
+ * struct MyVisitor {
+ *   // called for the first coefficient
+ *   void init(const Scalar& value, Index i, Index j);
+ *   // called for all other coefficients
+ *   void operator() (const Scalar& value, Index i, Index j);
+ * };
+ * \endcode
+ *
+ * \note compared to one or two \em for \em loops, visitors offer automatic
+ * unrolling for small fixed size matrix.
+ *
+ * \note if the matrix is empty, then the visitor is left unchanged.
+ *
+ * \sa minCoeff(Index*,Index*), maxCoeff(Index*,Index*), DenseBase::redux()
+ */
+template <typename Derived>
+template <typename Visitor>
+EIGEN_DEVICE_FUNC void DenseBase<Derived>::visit(Visitor& visitor) const {
+  using impl = internal::visit_impl<Derived, Visitor, /*ShortCircuitEvaulation*/ false>;
   impl::run(derived(), visitor);
 }
 
 namespace internal {
 
 /** \internal
-  * \brief Base class to implement min and max visitors
-  */
+ * \brief Base class to implement min and max visitors
+ */
 template <typename Derived>
-struct coeff_visitor
-{
+struct coeff_visitor {
   // default initialization to avoid countless invalid maybe-uninitialized warnings by gcc
-  EIGEN_DEVICE_FUNC
-  coeff_visitor() : row(-1), col(-1), res(0) {}
+  EIGEN_DEVICE_FUNC coeff_visitor() : row(-1), col(-1), res(0) {}
   typedef typename Derived::Scalar Scalar;
   Index row, col;
   Scalar res;
-  EIGEN_DEVICE_FUNC
-  inline void init(const Scalar& value, Index i, Index j)
-  {
+  EIGEN_DEVICE_FUNC inline void init(const Scalar& value, Index i, Index j) {
     res = value;
     row = i;
     col = j;
   }
 };
 
-
 template <typename Scalar, int NaNPropagation, bool is_min = true>
 struct minmax_compare {
   typedef typename packet_traits<Scalar>::type Packet;
@@ -544,7 +506,7 @@
 // Propagate NaNs. If the matrix contains NaN, the location of the first NaN
 // will be returned in row and col.
 template <typename Derived, bool is_min, int NaNPropagation>
-    struct minmax_coeff_visitor<Derived, is_min, NaNPropagation, false> : coeff_visitor<Derived> {
+struct minmax_coeff_visitor<Derived, is_min, NaNPropagation, false> : coeff_visitor<Derived> {
   typedef typename Derived::Scalar Scalar;
   using Packet = typename packet_traits<Scalar>::type;
   using Comparator = minmax_compare<Scalar, PropagateNaN, is_min>;
@@ -585,14 +547,10 @@
   }
 };
 
-template<typename Derived, bool is_min, int NaNPropagation>
-struct functor_traits<minmax_coeff_visitor<Derived, is_min, NaNPropagation> > {
+template <typename Derived, bool is_min, int NaNPropagation>
+struct functor_traits<minmax_coeff_visitor<Derived, is_min, NaNPropagation>> {
   using Scalar = typename Derived::Scalar;
-  enum {
-    Cost = NumTraits<Scalar>::AddCost,
-    LinearAccess = false,
-    PacketAccess = packet_traits<Scalar>::HasCmp
-  };
+  enum { Cost = NumTraits<Scalar>::AddCost, LinearAccess = false, PacketAccess = packet_traits<Scalar>::HasCmp };
 };
 
 template <typename Scalar>
@@ -674,26 +632,24 @@
   };
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \fn DenseBase<Derived>::minCoeff(IndexType* rowId, IndexType* colId) const
-  * \returns the minimum of all coefficients of *this and puts in *row and *col its location.
-  *
-  * In case \c *this contains NaN, NaNPropagation determines the behavior:
-  *   NaNPropagation == PropagateFast : undefined
-  *   NaNPropagation == PropagateNaN : result is NaN
-  *   NaNPropagation == PropagateNumbers : result is maximum of elements that are not NaN
-  * \warning the matrix must be not empty, otherwise an assertion is triggered.
-  *
-  * \sa DenseBase::minCoeff(Index*), DenseBase::maxCoeff(Index*,Index*), DenseBase::visit(), DenseBase::minCoeff()
-  */
-template<typename Derived>
-template<int NaNPropagation, typename IndexType>
-EIGEN_DEVICE_FUNC
-typename internal::traits<Derived>::Scalar
-DenseBase<Derived>::minCoeff(IndexType* rowId, IndexType* colId) const
-{
-  eigen_assert(this->rows()>0 && this->cols()>0 && "you are using an empty matrix");
+ * \returns the minimum of all coefficients of *this and puts in *row and *col its location.
+ *
+ * In case \c *this contains NaN, NaNPropagation determines the behavior:
+ *   NaNPropagation == PropagateFast : undefined
+ *   NaNPropagation == PropagateNaN : result is NaN
+ *   NaNPropagation == PropagateNumbers : result is maximum of elements that are not NaN
+ * \warning the matrix must be not empty, otherwise an assertion is triggered.
+ *
+ * \sa DenseBase::minCoeff(Index*), DenseBase::maxCoeff(Index*,Index*), DenseBase::visit(), DenseBase::minCoeff()
+ */
+template <typename Derived>
+template <int NaNPropagation, typename IndexType>
+EIGEN_DEVICE_FUNC typename internal::traits<Derived>::Scalar DenseBase<Derived>::minCoeff(IndexType* rowId,
+                                                                                          IndexType* colId) const {
+  eigen_assert(this->rows() > 0 && this->cols() > 0 && "you are using an empty matrix");
 
   internal::minmax_coeff_visitor<Derived, true, NaNPropagation> minVisitor;
   this->visit(minVisitor);
@@ -703,48 +659,44 @@
 }
 
 /** \returns the minimum of all coefficients of *this and puts in *index its location.
-  *
-  * In case \c *this contains NaN, NaNPropagation determines the behavior:
-  *   NaNPropagation == PropagateFast : undefined
-  *   NaNPropagation == PropagateNaN : result is NaN
-  *   NaNPropagation == PropagateNumbers : result is maximum of elements that are not NaN
-  * \warning the matrix must be not empty, otherwise an assertion is triggered.
-  *
-  * \sa DenseBase::minCoeff(IndexType*,IndexType*), DenseBase::maxCoeff(IndexType*,IndexType*), DenseBase::visit(), DenseBase::minCoeff()
-  */
-template<typename Derived>
-template<int NaNPropagation, typename IndexType>
-EIGEN_DEVICE_FUNC
-typename internal::traits<Derived>::Scalar
-DenseBase<Derived>::minCoeff(IndexType* index) const
-{
+ *
+ * In case \c *this contains NaN, NaNPropagation determines the behavior:
+ *   NaNPropagation == PropagateFast : undefined
+ *   NaNPropagation == PropagateNaN : result is NaN
+ *   NaNPropagation == PropagateNumbers : result is maximum of elements that are not NaN
+ * \warning the matrix must be not empty, otherwise an assertion is triggered.
+ *
+ * \sa DenseBase::minCoeff(IndexType*,IndexType*), DenseBase::maxCoeff(IndexType*,IndexType*), DenseBase::visit(),
+ * DenseBase::minCoeff()
+ */
+template <typename Derived>
+template <int NaNPropagation, typename IndexType>
+EIGEN_DEVICE_FUNC typename internal::traits<Derived>::Scalar DenseBase<Derived>::minCoeff(IndexType* index) const {
   eigen_assert(this->rows() > 0 && this->cols() > 0 && "you are using an empty matrix");
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
 
   internal::minmax_coeff_visitor<Derived, true, NaNPropagation> minVisitor;
   this->visit(minVisitor);
-  *index = IndexType((RowsAtCompileTime==1) ? minVisitor.col : minVisitor.row);
+  *index = IndexType((RowsAtCompileTime == 1) ? minVisitor.col : minVisitor.row);
   return minVisitor.res;
 }
 
 /** \fn DenseBase<Derived>::maxCoeff(IndexType* rowId, IndexType* colId) const
-  * \returns the maximum of all coefficients of *this and puts in *row and *col its location.
-  *
-  * In case \c *this contains NaN, NaNPropagation determines the behavior:
-  *   NaNPropagation == PropagateFast : undefined
-  *   NaNPropagation == PropagateNaN : result is NaN
-  *   NaNPropagation == PropagateNumbers : result is maximum of elements that are not NaN
-  * \warning the matrix must be not empty, otherwise an assertion is triggered.
-  *
-  * \sa DenseBase::minCoeff(IndexType*,IndexType*), DenseBase::visit(), DenseBase::maxCoeff()
-  */
-template<typename Derived>
-template<int NaNPropagation, typename IndexType>
-EIGEN_DEVICE_FUNC
-typename internal::traits<Derived>::Scalar
-DenseBase<Derived>::maxCoeff(IndexType* rowPtr, IndexType* colPtr) const
-{
-  eigen_assert(this->rows()>0 && this->cols()>0 && "you are using an empty matrix");
+ * \returns the maximum of all coefficients of *this and puts in *row and *col its location.
+ *
+ * In case \c *this contains NaN, NaNPropagation determines the behavior:
+ *   NaNPropagation == PropagateFast : undefined
+ *   NaNPropagation == PropagateNaN : result is NaN
+ *   NaNPropagation == PropagateNumbers : result is maximum of elements that are not NaN
+ * \warning the matrix must be not empty, otherwise an assertion is triggered.
+ *
+ * \sa DenseBase::minCoeff(IndexType*,IndexType*), DenseBase::visit(), DenseBase::maxCoeff()
+ */
+template <typename Derived>
+template <int NaNPropagation, typename IndexType>
+EIGEN_DEVICE_FUNC typename internal::traits<Derived>::Scalar DenseBase<Derived>::maxCoeff(IndexType* rowPtr,
+                                                                                          IndexType* colPtr) const {
+  eigen_assert(this->rows() > 0 && this->cols() > 0 && "you are using an empty matrix");
 
   internal::minmax_coeff_visitor<Derived, false, NaNPropagation> maxVisitor;
   this->visit(maxVisitor);
@@ -754,73 +706,68 @@
 }
 
 /** \returns the maximum of all coefficients of *this and puts in *index its location.
-  *
-  * In case \c *this contains NaN, NaNPropagation determines the behavior:
-  *   NaNPropagation == PropagateFast : undefined
-  *   NaNPropagation == PropagateNaN : result is NaN
-  *   NaNPropagation == PropagateNumbers : result is maximum of elements that are not NaN
-  * \warning the matrix must be not empty, otherwise an assertion is triggered.
-  *
-  * \sa DenseBase::maxCoeff(IndexType*,IndexType*), DenseBase::minCoeff(IndexType*,IndexType*), DenseBase::visitor(), DenseBase::maxCoeff()
-  */
-template<typename Derived>
-template<int NaNPropagation, typename IndexType>
-EIGEN_DEVICE_FUNC
-typename internal::traits<Derived>::Scalar
-DenseBase<Derived>::maxCoeff(IndexType* index) const
-{
-  eigen_assert(this->rows()>0 && this->cols()>0 && "you are using an empty matrix");
+ *
+ * In case \c *this contains NaN, NaNPropagation determines the behavior:
+ *   NaNPropagation == PropagateFast : undefined
+ *   NaNPropagation == PropagateNaN : result is NaN
+ *   NaNPropagation == PropagateNumbers : result is maximum of elements that are not NaN
+ * \warning the matrix must be not empty, otherwise an assertion is triggered.
+ *
+ * \sa DenseBase::maxCoeff(IndexType*,IndexType*), DenseBase::minCoeff(IndexType*,IndexType*), DenseBase::visitor(),
+ * DenseBase::maxCoeff()
+ */
+template <typename Derived>
+template <int NaNPropagation, typename IndexType>
+EIGEN_DEVICE_FUNC typename internal::traits<Derived>::Scalar DenseBase<Derived>::maxCoeff(IndexType* index) const {
+  eigen_assert(this->rows() > 0 && this->cols() > 0 && "you are using an empty matrix");
 
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
   internal::minmax_coeff_visitor<Derived, false, NaNPropagation> maxVisitor;
   this->visit(maxVisitor);
-  *index = (RowsAtCompileTime==1) ? maxVisitor.col : maxVisitor.row;
+  *index = (RowsAtCompileTime == 1) ? maxVisitor.col : maxVisitor.row;
   return maxVisitor.res;
 }
 
 /** \returns true if all coefficients are true
-  *
-  * Example: \include MatrixBase_all.cpp
-  * Output: \verbinclude MatrixBase_all.out
-  *
-  * \sa any(), Cwise::operator<()
-  */
+ *
+ * Example: \include MatrixBase_all.cpp
+ * Output: \verbinclude MatrixBase_all.out
+ *
+ * \sa any(), Cwise::operator<()
+ */
 template <typename Derived>
 EIGEN_DEVICE_FUNC inline bool DenseBase<Derived>::all() const {
   using Visitor = internal::all_visitor<Scalar>;
-  using impl = internal::visit_impl<Derived, Visitor, /*ShortCircuitEvaulation*/true>;
+  using impl = internal::visit_impl<Derived, Visitor, /*ShortCircuitEvaulation*/ true>;
   Visitor visitor;
   impl::run(derived(), visitor);
   return visitor.res;
 }
 
 /** \returns true if at least one coefficient is true
-  *
-  * \sa all()
-  */
+ *
+ * \sa all()
+ */
 template <typename Derived>
 EIGEN_DEVICE_FUNC inline bool DenseBase<Derived>::any() const {
   using Visitor = internal::any_visitor<Scalar>;
-  using impl = internal::visit_impl<Derived, Visitor, /*ShortCircuitEvaulation*/true>;
+  using impl = internal::visit_impl<Derived, Visitor, /*ShortCircuitEvaulation*/ true>;
   Visitor visitor;
   impl::run(derived(), visitor);
   return visitor.res;
 }
 
 /** \returns the number of coefficients which evaluate to true
-  *
-  * \sa all(), any()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC
-Index DenseBase<Derived>::count() const
-{
+ *
+ * \sa all(), any()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC Index DenseBase<Derived>::count() const {
   using Visitor = internal::count_visitor<Scalar>;
-  using impl = internal::visit_impl<Derived, Visitor, /*ShortCircuitEvaulation*/false>;
+  using impl = internal::visit_impl<Derived, Visitor, /*ShortCircuitEvaulation*/ false>;
   Visitor visitor;
   impl::run(derived(), visitor);
   return visitor.res;
-
 }
 
 template <typename Derived>
@@ -829,14 +776,14 @@
 }
 
 /** \returns true if \c *this contains only finite numbers, i.e., no NaN and no +/-INF values.
-  *
-  * \sa hasNaN()
-  */
+ *
+ * \sa hasNaN()
+ */
 template <typename Derived>
 EIGEN_DEVICE_FUNC inline bool DenseBase<Derived>::allFinite() const {
-  return derived().array().isFinite().all(); 
+  return derived().array().isFinite().all();
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_VISITOR_H
+#endif  // EIGEN_VISITOR_H
diff --git a/Eigen/src/Core/arch/AVX/Complex.h b/Eigen/src/Core/arch/AVX/Complex.h
index 238edc8..a5e6499 100644
--- a/Eigen/src/Core/arch/AVX/Complex.h
+++ b/Eigen/src/Core/arch/AVX/Complex.h
@@ -18,16 +18,15 @@
 namespace internal {
 
 //---------- float ----------
-struct Packet4cf
-{
+struct Packet4cf {
   EIGEN_STRONG_INLINE Packet4cf() {}
   EIGEN_STRONG_INLINE explicit Packet4cf(const __m256& a) : v(a) {}
-  __m256  v;
+  __m256 v;
 };
 
 #ifndef EIGEN_VECTORIZE_AVX512
-template<> struct packet_traits<std::complex<float> >  : default_packet_traits
-{
+template <>
+struct packet_traits<std::complex<float> > : default_packet_traits {
   typedef Packet4cf type;
   typedef Packet2cf half;
   enum {
@@ -35,50 +34,58 @@
     AlignedOnScalar = 1,
     size = 4,
 
-    HasAdd    = 1,
-    HasSub    = 1,
-    HasMul    = 1,
-    HasDiv    = 1,
+    HasAdd = 1,
+    HasSub = 1,
+    HasMul = 1,
+    HasDiv = 1,
     HasNegate = 1,
-    HasSqrt   = 1,
-    HasAbs    = 0,
-    HasAbs2   = 0,
-    HasMin    = 0,
-    HasMax    = 0,
+    HasSqrt = 1,
+    HasAbs = 0,
+    HasAbs2 = 0,
+    HasMin = 0,
+    HasMax = 0,
     HasSetLinear = 0
   };
 };
 #endif
 
-template<> struct unpacket_traits<Packet4cf> {
+template <>
+struct unpacket_traits<Packet4cf> {
   typedef std::complex<float> type;
   typedef Packet2cf half;
   typedef Packet8f as_real;
   enum {
-    size=4,
-    alignment=Aligned32,
-    vectorizable=true,
-    masked_load_available=false,
-    masked_store_available=false
+    size = 4,
+    alignment = Aligned32,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
   };
 };
 
-template<> EIGEN_STRONG_INLINE Packet4cf padd<Packet4cf>(const Packet4cf& a, const Packet4cf& b) { return Packet4cf(_mm256_add_ps(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet4cf psub<Packet4cf>(const Packet4cf& a, const Packet4cf& b) { return Packet4cf(_mm256_sub_ps(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet4cf pnegate(const Packet4cf& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4cf padd<Packet4cf>(const Packet4cf& a, const Packet4cf& b) {
+  return Packet4cf(_mm256_add_ps(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4cf psub<Packet4cf>(const Packet4cf& a, const Packet4cf& b) {
+  return Packet4cf(_mm256_sub_ps(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4cf pnegate(const Packet4cf& a) {
   return Packet4cf(pnegate(a.v));
 }
-template<> EIGEN_STRONG_INLINE Packet4cf pconj(const Packet4cf& a)
-{
-  const __m256 mask = _mm256_castsi256_ps(_mm256_setr_epi32(0x00000000,0x80000000,0x00000000,0x80000000,0x00000000,0x80000000,0x00000000,0x80000000));
-  return Packet4cf(_mm256_xor_ps(a.v,mask));
+template <>
+EIGEN_STRONG_INLINE Packet4cf pconj(const Packet4cf& a) {
+  const __m256 mask = _mm256_castsi256_ps(_mm256_setr_epi32(0x00000000, 0x80000000, 0x00000000, 0x80000000, 0x00000000,
+                                                            0x80000000, 0x00000000, 0x80000000));
+  return Packet4cf(_mm256_xor_ps(a.v, mask));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4cf pmul<Packet4cf>(const Packet4cf& a, const Packet4cf& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4cf pmul<Packet4cf>(const Packet4cf& a, const Packet4cf& b) {
   __m256 tmp1 = _mm256_mul_ps(_mm256_moveldup_ps(a.v), b.v);
-  __m256 tmp2 = _mm256_mul_ps(_mm256_movehdup_ps(a.v), _mm256_permute_ps(b.v, _MM_SHUFFLE(2,3,0,1)));
+  __m256 tmp2 = _mm256_mul_ps(_mm256_movehdup_ps(a.v), _mm256_permute_ps(b.v, _MM_SHUFFLE(2, 3, 0, 1)));
   __m256 result = _mm256_addsub_ps(tmp1, tmp2);
   return Packet4cf(result);
 }
@@ -89,112 +96,135 @@
   return Packet4cf(_mm256_and_ps(eq, _mm256_permute_ps(eq, 0xb1)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4cf ptrue<Packet4cf>(const Packet4cf& a) { return Packet4cf(ptrue(Packet8f(a.v))); }
-template<> EIGEN_STRONG_INLINE Packet4cf pand   <Packet4cf>(const Packet4cf& a, const Packet4cf& b) { return Packet4cf(_mm256_and_ps(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet4cf por    <Packet4cf>(const Packet4cf& a, const Packet4cf& b) { return Packet4cf(_mm256_or_ps(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet4cf pxor   <Packet4cf>(const Packet4cf& a, const Packet4cf& b) { return Packet4cf(_mm256_xor_ps(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet4cf pandnot<Packet4cf>(const Packet4cf& a, const Packet4cf& b) { return Packet4cf(_mm256_andnot_ps(b.v,a.v)); }
+template <>
+EIGEN_STRONG_INLINE Packet4cf ptrue<Packet4cf>(const Packet4cf& a) {
+  return Packet4cf(ptrue(Packet8f(a.v)));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4cf pand<Packet4cf>(const Packet4cf& a, const Packet4cf& b) {
+  return Packet4cf(_mm256_and_ps(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4cf por<Packet4cf>(const Packet4cf& a, const Packet4cf& b) {
+  return Packet4cf(_mm256_or_ps(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4cf pxor<Packet4cf>(const Packet4cf& a, const Packet4cf& b) {
+  return Packet4cf(_mm256_xor_ps(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4cf pandnot<Packet4cf>(const Packet4cf& a, const Packet4cf& b) {
+  return Packet4cf(_mm256_andnot_ps(b.v, a.v));
+}
 
-template<> EIGEN_STRONG_INLINE Packet4cf pload <Packet4cf>(const std::complex<float>* from) { EIGEN_DEBUG_ALIGNED_LOAD return Packet4cf(pload<Packet8f>(&numext::real_ref(*from))); }
-template<> EIGEN_STRONG_INLINE Packet4cf ploadu<Packet4cf>(const std::complex<float>* from) { EIGEN_DEBUG_UNALIGNED_LOAD return Packet4cf(ploadu<Packet8f>(&numext::real_ref(*from))); }
+template <>
+EIGEN_STRONG_INLINE Packet4cf pload<Packet4cf>(const std::complex<float>* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return Packet4cf(pload<Packet8f>(&numext::real_ref(*from)));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4cf ploadu<Packet4cf>(const std::complex<float>* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return Packet4cf(ploadu<Packet8f>(&numext::real_ref(*from)));
+}
 
-
-template<> EIGEN_STRONG_INLINE Packet4cf pset1<Packet4cf>(const std::complex<float>& from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4cf pset1<Packet4cf>(const std::complex<float>& from) {
   const float re = std::real(from);
   const float im = std::imag(from);
   return Packet4cf(_mm256_set_ps(im, re, im, re, im, re, im, re));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4cf ploaddup<Packet4cf>(const std::complex<float>* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4cf ploaddup<Packet4cf>(const std::complex<float>* from) {
   // FIXME The following might be optimized using _mm256_movedup_pd
   Packet2cf a = ploaddup<Packet2cf>(from);
-  Packet2cf b = ploaddup<Packet2cf>(from+1);
-  return  Packet4cf(_mm256_insertf128_ps(_mm256_castps128_ps256(a.v), b.v, 1));
+  Packet2cf b = ploaddup<Packet2cf>(from + 1);
+  return Packet4cf(_mm256_insertf128_ps(_mm256_castps128_ps256(a.v), b.v, 1));
 }
 
-template<> EIGEN_STRONG_INLINE void pstore <std::complex<float> >(std::complex<float>* to, const Packet4cf& from) { EIGEN_DEBUG_ALIGNED_STORE pstore(&numext::real_ref(*to), from.v); }
-template<> EIGEN_STRONG_INLINE void pstoreu<std::complex<float> >(std::complex<float>* to, const Packet4cf& from) { EIGEN_DEBUG_UNALIGNED_STORE pstoreu(&numext::real_ref(*to), from.v); }
-
-template<> EIGEN_DEVICE_FUNC inline Packet4cf pgather<std::complex<float>, Packet4cf>(const std::complex<float>* from, Index stride)
-{
-  return Packet4cf(_mm256_set_ps(std::imag(from[3*stride]), std::real(from[3*stride]),
-                                 std::imag(from[2*stride]), std::real(from[2*stride]),
-                                 std::imag(from[1*stride]), std::real(from[1*stride]),
-                                 std::imag(from[0*stride]), std::real(from[0*stride])));
+template <>
+EIGEN_STRONG_INLINE void pstore<std::complex<float> >(std::complex<float>* to, const Packet4cf& from) {
+  EIGEN_DEBUG_ALIGNED_STORE pstore(&numext::real_ref(*to), from.v);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<std::complex<float> >(std::complex<float>* to, const Packet4cf& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE pstoreu(&numext::real_ref(*to), from.v);
 }
 
-template<> EIGEN_DEVICE_FUNC inline void pscatter<std::complex<float>, Packet4cf>(std::complex<float>* to, const Packet4cf& from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC inline Packet4cf pgather<std::complex<float>, Packet4cf>(const std::complex<float>* from,
+                                                                           Index stride) {
+  return Packet4cf(_mm256_set_ps(std::imag(from[3 * stride]), std::real(from[3 * stride]), std::imag(from[2 * stride]),
+                                 std::real(from[2 * stride]), std::imag(from[1 * stride]), std::real(from[1 * stride]),
+                                 std::imag(from[0 * stride]), std::real(from[0 * stride])));
+}
+
+template <>
+EIGEN_DEVICE_FUNC inline void pscatter<std::complex<float>, Packet4cf>(std::complex<float>* to, const Packet4cf& from,
+                                                                       Index stride) {
   __m128 low = _mm256_extractf128_ps(from.v, 0);
-  to[stride*0] = std::complex<float>(_mm_cvtss_f32(_mm_shuffle_ps(low, low, 0)),
-                                     _mm_cvtss_f32(_mm_shuffle_ps(low, low, 1)));
-  to[stride*1] = std::complex<float>(_mm_cvtss_f32(_mm_shuffle_ps(low, low, 2)),
-                                     _mm_cvtss_f32(_mm_shuffle_ps(low, low, 3)));
+  to[stride * 0] =
+      std::complex<float>(_mm_cvtss_f32(_mm_shuffle_ps(low, low, 0)), _mm_cvtss_f32(_mm_shuffle_ps(low, low, 1)));
+  to[stride * 1] =
+      std::complex<float>(_mm_cvtss_f32(_mm_shuffle_ps(low, low, 2)), _mm_cvtss_f32(_mm_shuffle_ps(low, low, 3)));
 
   __m128 high = _mm256_extractf128_ps(from.v, 1);
-  to[stride*2] = std::complex<float>(_mm_cvtss_f32(_mm_shuffle_ps(high, high, 0)),
-                                     _mm_cvtss_f32(_mm_shuffle_ps(high, high, 1)));
-  to[stride*3] = std::complex<float>(_mm_cvtss_f32(_mm_shuffle_ps(high, high, 2)),
-                                     _mm_cvtss_f32(_mm_shuffle_ps(high, high, 3)));
-
+  to[stride * 2] =
+      std::complex<float>(_mm_cvtss_f32(_mm_shuffle_ps(high, high, 0)), _mm_cvtss_f32(_mm_shuffle_ps(high, high, 1)));
+  to[stride * 3] =
+      std::complex<float>(_mm_cvtss_f32(_mm_shuffle_ps(high, high, 2)), _mm_cvtss_f32(_mm_shuffle_ps(high, high, 3)));
 }
 
-template<> EIGEN_STRONG_INLINE std::complex<float>  pfirst<Packet4cf>(const Packet4cf& a)
-{
+template <>
+EIGEN_STRONG_INLINE std::complex<float> pfirst<Packet4cf>(const Packet4cf& a) {
   return pfirst(Packet2cf(_mm256_castps256_ps128(a.v)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4cf preverse(const Packet4cf& a) {
-  __m128 low  = _mm256_extractf128_ps(a.v, 0);
+template <>
+EIGEN_STRONG_INLINE Packet4cf preverse(const Packet4cf& a) {
+  __m128 low = _mm256_extractf128_ps(a.v, 0);
   __m128 high = _mm256_extractf128_ps(a.v, 1);
-  __m128d lowd  = _mm_castps_pd(low);
+  __m128d lowd = _mm_castps_pd(low);
   __m128d highd = _mm_castps_pd(high);
-  low  = _mm_castpd_ps(_mm_shuffle_pd(lowd,lowd,0x1));
-  high = _mm_castpd_ps(_mm_shuffle_pd(highd,highd,0x1));
+  low = _mm_castpd_ps(_mm_shuffle_pd(lowd, lowd, 0x1));
+  high = _mm_castpd_ps(_mm_shuffle_pd(highd, highd, 0x1));
   __m256 result = _mm256_setzero_ps();
   result = _mm256_insertf128_ps(result, low, 1);
   result = _mm256_insertf128_ps(result, high, 0);
   return Packet4cf(result);
 }
 
-template<> EIGEN_STRONG_INLINE std::complex<float> predux<Packet4cf>(const Packet4cf& a)
-{
-  return predux(padd(Packet2cf(_mm256_extractf128_ps(a.v,0)),
-                     Packet2cf(_mm256_extractf128_ps(a.v,1))));
+template <>
+EIGEN_STRONG_INLINE std::complex<float> predux<Packet4cf>(const Packet4cf& a) {
+  return predux(padd(Packet2cf(_mm256_extractf128_ps(a.v, 0)), Packet2cf(_mm256_extractf128_ps(a.v, 1))));
 }
 
-template<> EIGEN_STRONG_INLINE std::complex<float> predux_mul<Packet4cf>(const Packet4cf& a)
-{
-  return predux_mul(pmul(Packet2cf(_mm256_extractf128_ps(a.v, 0)),
-                         Packet2cf(_mm256_extractf128_ps(a.v, 1))));
+template <>
+EIGEN_STRONG_INLINE std::complex<float> predux_mul<Packet4cf>(const Packet4cf& a) {
+  return predux_mul(pmul(Packet2cf(_mm256_extractf128_ps(a.v, 0)), Packet2cf(_mm256_extractf128_ps(a.v, 1))));
 }
 
+EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet4cf, Packet8f)
 
-EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet4cf,Packet8f)
-
-template<> EIGEN_STRONG_INLINE Packet4cf pdiv<Packet4cf>(const Packet4cf& a, const Packet4cf& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4cf pdiv<Packet4cf>(const Packet4cf& a, const Packet4cf& b) {
   return pdiv_complex(a, b);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4cf pcplxflip<Packet4cf>(const Packet4cf& x)
-{
-  return Packet4cf(_mm256_shuffle_ps(x.v, x.v, _MM_SHUFFLE(2, 3, 0 ,1)));
+template <>
+EIGEN_STRONG_INLINE Packet4cf pcplxflip<Packet4cf>(const Packet4cf& x) {
+  return Packet4cf(_mm256_shuffle_ps(x.v, x.v, _MM_SHUFFLE(2, 3, 0, 1)));
 }
 
 //---------- double ----------
-struct Packet2cd
-{
+struct Packet2cd {
   EIGEN_STRONG_INLINE Packet2cd() {}
   EIGEN_STRONG_INLINE explicit Packet2cd(const __m256d& a) : v(a) {}
-  __m256d  v;
+  __m256d v;
 };
 
 #ifndef EIGEN_VECTORIZE_AVX512
-template<> struct packet_traits<std::complex<double> >  : default_packet_traits
-{
+template <>
+struct packet_traits<std::complex<double> > : default_packet_traits {
   typedef Packet2cd type;
   typedef Packet1cd half;
   enum {
@@ -202,50 +232,60 @@
     AlignedOnScalar = 0,
     size = 2,
 
-    HasAdd    = 1,
-    HasSub    = 1,
-    HasMul    = 1,
-    HasDiv    = 1,
+    HasAdd = 1,
+    HasSub = 1,
+    HasMul = 1,
+    HasDiv = 1,
     HasNegate = 1,
-    HasSqrt   = 1,
-    HasAbs    = 0,
-    HasAbs2   = 0,
-    HasMin    = 0,
-    HasMax    = 0,
+    HasSqrt = 1,
+    HasAbs = 0,
+    HasAbs2 = 0,
+    HasMin = 0,
+    HasMax = 0,
     HasSetLinear = 0
   };
 };
 #endif
 
-template<> struct unpacket_traits<Packet2cd> {
+template <>
+struct unpacket_traits<Packet2cd> {
   typedef std::complex<double> type;
   typedef Packet1cd half;
   typedef Packet4d as_real;
   enum {
-    size=2,
-    alignment=Aligned32,
-    vectorizable=true,
-    masked_load_available=false,
-    masked_store_available=false
+    size = 2,
+    alignment = Aligned32,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
   };
 };
 
-template<> EIGEN_STRONG_INLINE Packet2cd padd<Packet2cd>(const Packet2cd& a, const Packet2cd& b) { return Packet2cd(_mm256_add_pd(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet2cd psub<Packet2cd>(const Packet2cd& a, const Packet2cd& b) { return Packet2cd(_mm256_sub_pd(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet2cd pnegate(const Packet2cd& a) { return Packet2cd(pnegate(a.v)); }
-template<> EIGEN_STRONG_INLINE Packet2cd pconj(const Packet2cd& a)
-{
-  const __m256d mask = _mm256_castsi256_pd(_mm256_set_epi32(0x80000000,0x0,0x0,0x0,0x80000000,0x0,0x0,0x0));
-  return Packet2cd(_mm256_xor_pd(a.v,mask));
+template <>
+EIGEN_STRONG_INLINE Packet2cd padd<Packet2cd>(const Packet2cd& a, const Packet2cd& b) {
+  return Packet2cd(_mm256_add_pd(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cd psub<Packet2cd>(const Packet2cd& a, const Packet2cd& b) {
+  return Packet2cd(_mm256_sub_pd(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cd pnegate(const Packet2cd& a) {
+  return Packet2cd(pnegate(a.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cd pconj(const Packet2cd& a) {
+  const __m256d mask = _mm256_castsi256_pd(_mm256_set_epi32(0x80000000, 0x0, 0x0, 0x0, 0x80000000, 0x0, 0x0, 0x0));
+  return Packet2cd(_mm256_xor_pd(a.v, mask));
 }
 
-template<> EIGEN_STRONG_INLINE Packet2cd pmul<Packet2cd>(const Packet2cd& a, const Packet2cd& b)
-{
-  __m256d tmp1 = _mm256_shuffle_pd(a.v,a.v,0x0);
+template <>
+EIGEN_STRONG_INLINE Packet2cd pmul<Packet2cd>(const Packet2cd& a, const Packet2cd& b) {
+  __m256d tmp1 = _mm256_shuffle_pd(a.v, a.v, 0x0);
   __m256d even = _mm256_mul_pd(tmp1, b.v);
-  __m256d tmp2 = _mm256_shuffle_pd(a.v,a.v,0xF);
-  __m256d tmp3 = _mm256_shuffle_pd(b.v,b.v,0x5);
-  __m256d odd  = _mm256_mul_pd(tmp2, tmp3);
+  __m256d tmp2 = _mm256_shuffle_pd(a.v, a.v, 0xF);
+  __m256d tmp3 = _mm256_shuffle_pd(b.v, b.v, 0x5);
+  __m256d odd = _mm256_mul_pd(tmp2, tmp3);
   return Packet2cd(_mm256_addsub_pd(even, odd));
 }
 
@@ -255,82 +295,110 @@
   return Packet2cd(pand(eq, _mm256_permute_pd(eq, 0x5)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet2cd ptrue<Packet2cd>(const Packet2cd& a) { return Packet2cd(ptrue(Packet4d(a.v))); }
-template<> EIGEN_STRONG_INLINE Packet2cd pand   <Packet2cd>(const Packet2cd& a, const Packet2cd& b) { return Packet2cd(_mm256_and_pd(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet2cd por    <Packet2cd>(const Packet2cd& a, const Packet2cd& b) { return Packet2cd(_mm256_or_pd(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet2cd pxor   <Packet2cd>(const Packet2cd& a, const Packet2cd& b) { return Packet2cd(_mm256_xor_pd(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet2cd pandnot<Packet2cd>(const Packet2cd& a, const Packet2cd& b) { return Packet2cd(_mm256_andnot_pd(b.v,a.v)); }
+template <>
+EIGEN_STRONG_INLINE Packet2cd ptrue<Packet2cd>(const Packet2cd& a) {
+  return Packet2cd(ptrue(Packet4d(a.v)));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cd pand<Packet2cd>(const Packet2cd& a, const Packet2cd& b) {
+  return Packet2cd(_mm256_and_pd(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cd por<Packet2cd>(const Packet2cd& a, const Packet2cd& b) {
+  return Packet2cd(_mm256_or_pd(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cd pxor<Packet2cd>(const Packet2cd& a, const Packet2cd& b) {
+  return Packet2cd(_mm256_xor_pd(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cd pandnot<Packet2cd>(const Packet2cd& a, const Packet2cd& b) {
+  return Packet2cd(_mm256_andnot_pd(b.v, a.v));
+}
 
-template<> EIGEN_STRONG_INLINE Packet2cd pload <Packet2cd>(const std::complex<double>* from)
-{ EIGEN_DEBUG_ALIGNED_LOAD return Packet2cd(pload<Packet4d>((const double*)from)); }
-template<> EIGEN_STRONG_INLINE Packet2cd ploadu<Packet2cd>(const std::complex<double>* from)
-{ EIGEN_DEBUG_UNALIGNED_LOAD return Packet2cd(ploadu<Packet4d>((const double*)from)); }
+template <>
+EIGEN_STRONG_INLINE Packet2cd pload<Packet2cd>(const std::complex<double>* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return Packet2cd(pload<Packet4d>((const double*)from));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cd ploadu<Packet2cd>(const std::complex<double>* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return Packet2cd(ploadu<Packet4d>((const double*)from));
+}
 
-template<> EIGEN_STRONG_INLINE Packet2cd pset1<Packet2cd>(const std::complex<double>& from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2cd pset1<Packet2cd>(const std::complex<double>& from) {
   // in case casting to a __m128d* is really not safe, then we can still fallback to this version: (much slower though)
-//   return Packet2cd(_mm256_loadu2_m128d((const double*)&from,(const double*)&from));
-    return Packet2cd(_mm256_broadcast_pd((const __m128d*)(const void*)&from));
+  //   return Packet2cd(_mm256_loadu2_m128d((const double*)&from,(const double*)&from));
+  return Packet2cd(_mm256_broadcast_pd((const __m128d*)(const void*)&from));
 }
 
-template<> EIGEN_STRONG_INLINE Packet2cd ploaddup<Packet2cd>(const std::complex<double>* from) { return pset1<Packet2cd>(*from); }
-
-template<> EIGEN_STRONG_INLINE void pstore <std::complex<double> >(std::complex<double> *   to, const Packet2cd& from) { EIGEN_DEBUG_ALIGNED_STORE pstore((double*)to, from.v); }
-template<> EIGEN_STRONG_INLINE void pstoreu<std::complex<double> >(std::complex<double> *   to, const Packet2cd& from) { EIGEN_DEBUG_UNALIGNED_STORE pstoreu((double*)to, from.v); }
-
-template<> EIGEN_DEVICE_FUNC inline Packet2cd pgather<std::complex<double>, Packet2cd>(const std::complex<double>* from, Index stride)
-{
-  return Packet2cd(_mm256_set_pd(std::imag(from[1*stride]), std::real(from[1*stride]),
-				 std::imag(from[0*stride]), std::real(from[0*stride])));
+template <>
+EIGEN_STRONG_INLINE Packet2cd ploaddup<Packet2cd>(const std::complex<double>* from) {
+  return pset1<Packet2cd>(*from);
 }
 
-template<> EIGEN_DEVICE_FUNC inline void pscatter<std::complex<double>, Packet2cd>(std::complex<double>* to, const Packet2cd& from, Index stride)
-{
+template <>
+EIGEN_STRONG_INLINE void pstore<std::complex<double> >(std::complex<double>* to, const Packet2cd& from) {
+  EIGEN_DEBUG_ALIGNED_STORE pstore((double*)to, from.v);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<std::complex<double> >(std::complex<double>* to, const Packet2cd& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE pstoreu((double*)to, from.v);
+}
+
+template <>
+EIGEN_DEVICE_FUNC inline Packet2cd pgather<std::complex<double>, Packet2cd>(const std::complex<double>* from,
+                                                                            Index stride) {
+  return Packet2cd(_mm256_set_pd(std::imag(from[1 * stride]), std::real(from[1 * stride]), std::imag(from[0 * stride]),
+                                 std::real(from[0 * stride])));
+}
+
+template <>
+EIGEN_DEVICE_FUNC inline void pscatter<std::complex<double>, Packet2cd>(std::complex<double>* to, const Packet2cd& from,
+                                                                        Index stride) {
   __m128d low = _mm256_extractf128_pd(from.v, 0);
-  to[stride*0] = std::complex<double>(_mm_cvtsd_f64(low), _mm_cvtsd_f64(_mm_shuffle_pd(low, low, 1)));
+  to[stride * 0] = std::complex<double>(_mm_cvtsd_f64(low), _mm_cvtsd_f64(_mm_shuffle_pd(low, low, 1)));
   __m128d high = _mm256_extractf128_pd(from.v, 1);
-  to[stride*1] = std::complex<double>(_mm_cvtsd_f64(high), _mm_cvtsd_f64(_mm_shuffle_pd(high, high, 1)));
+  to[stride * 1] = std::complex<double>(_mm_cvtsd_f64(high), _mm_cvtsd_f64(_mm_shuffle_pd(high, high, 1)));
 }
 
-template<> EIGEN_STRONG_INLINE std::complex<double> pfirst<Packet2cd>(const Packet2cd& a)
-{
+template <>
+EIGEN_STRONG_INLINE std::complex<double> pfirst<Packet2cd>(const Packet2cd& a) {
   __m128d low = _mm256_extractf128_pd(a.v, 0);
   EIGEN_ALIGN16 double res[2];
   _mm_store_pd(res, low);
-  return std::complex<double>(res[0],res[1]);
+  return std::complex<double>(res[0], res[1]);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2cd preverse(const Packet2cd& a) {
+template <>
+EIGEN_STRONG_INLINE Packet2cd preverse(const Packet2cd& a) {
   __m256d result = _mm256_permute2f128_pd(a.v, a.v, 1);
   return Packet2cd(result);
 }
 
-template<> EIGEN_STRONG_INLINE std::complex<double> predux<Packet2cd>(const Packet2cd& a)
-{
-  return predux(padd(Packet1cd(_mm256_extractf128_pd(a.v,0)),
-                     Packet1cd(_mm256_extractf128_pd(a.v,1))));
+template <>
+EIGEN_STRONG_INLINE std::complex<double> predux<Packet2cd>(const Packet2cd& a) {
+  return predux(padd(Packet1cd(_mm256_extractf128_pd(a.v, 0)), Packet1cd(_mm256_extractf128_pd(a.v, 1))));
 }
 
-template<> EIGEN_STRONG_INLINE std::complex<double> predux_mul<Packet2cd>(const Packet2cd& a)
-{
-  return predux(pmul(Packet1cd(_mm256_extractf128_pd(a.v,0)),
-                     Packet1cd(_mm256_extractf128_pd(a.v,1))));
+template <>
+EIGEN_STRONG_INLINE std::complex<double> predux_mul<Packet2cd>(const Packet2cd& a) {
+  return predux(pmul(Packet1cd(_mm256_extractf128_pd(a.v, 0)), Packet1cd(_mm256_extractf128_pd(a.v, 1))));
 }
 
-EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet2cd,Packet4d)
+EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet2cd, Packet4d)
 
-template<> EIGEN_STRONG_INLINE Packet2cd pdiv<Packet2cd>(const Packet2cd& a, const Packet2cd& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2cd pdiv<Packet2cd>(const Packet2cd& a, const Packet2cd& b) {
   return pdiv_complex(a, b);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2cd pcplxflip<Packet2cd>(const Packet2cd& x)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2cd pcplxflip<Packet2cd>(const Packet2cd& x) {
   return Packet2cd(_mm256_shuffle_pd(x.v, x.v, 0x5));
 }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet4cf,4>& kernel) {
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet4cf, 4>& kernel) {
   __m256d P0 = _mm256_castps_pd(kernel.packet[0].v);
   __m256d P1 = _mm256_castps_pd(kernel.packet[1].v);
   __m256d P2 = _mm256_castps_pd(kernel.packet[2].v);
@@ -347,23 +415,24 @@
   kernel.packet[2].v = _mm256_castpd_ps(_mm256_permute2f128_pd(T1, T3, 49));
 }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet2cd,2>& kernel) {
-  __m256d tmp = _mm256_permute2f128_pd(kernel.packet[0].v, kernel.packet[1].v, 0+(2<<4));
-  kernel.packet[1].v = _mm256_permute2f128_pd(kernel.packet[0].v, kernel.packet[1].v, 1+(3<<4));
- kernel.packet[0].v = tmp;
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet2cd, 2>& kernel) {
+  __m256d tmp = _mm256_permute2f128_pd(kernel.packet[0].v, kernel.packet[1].v, 0 + (2 << 4));
+  kernel.packet[1].v = _mm256_permute2f128_pd(kernel.packet[0].v, kernel.packet[1].v, 1 + (3 << 4));
+  kernel.packet[0].v = tmp;
 }
 
-template<> EIGEN_STRONG_INLINE Packet2cd psqrt<Packet2cd>(const Packet2cd& a) {
+template <>
+EIGEN_STRONG_INLINE Packet2cd psqrt<Packet2cd>(const Packet2cd& a) {
   return psqrt_complex<Packet2cd>(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4cf psqrt<Packet4cf>(const Packet4cf& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4cf psqrt<Packet4cf>(const Packet4cf& a) {
   return psqrt_complex<Packet4cf>(a);
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_COMPLEX_AVX_H
+#endif  // EIGEN_COMPLEX_AVX_H
diff --git a/Eigen/src/Core/arch/AVX/MathFunctions.h b/Eigen/src/Core/arch/AVX/MathFunctions.h
index 6e83cfc..b125d59 100644
--- a/Eigen/src/Core/arch/AVX/MathFunctions.h
+++ b/Eigen/src/Core/arch/AVX/MathFunctions.h
@@ -28,20 +28,19 @@
 // iteration for square root. In particular, Skylake and Zen2 processors
 // have approximately doubled throughput of the _mm_sqrt_ps instruction
 // compared to their predecessors.
-template <> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet8f psqrt<Packet8f>(const Packet8f& _x) {
+template <>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet8f psqrt<Packet8f>(const Packet8f& _x) {
   return _mm256_sqrt_ps(_x);
 }
-template <> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet4d psqrt<Packet4d>(const Packet4d& _x) {
+template <>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet4d psqrt<Packet4d>(const Packet4d& _x) {
   return _mm256_sqrt_pd(_x);
 }
 
-
 // Even on Skylake, using Newton iteration is a win for reciprocal square root.
 #if EIGEN_FAST_MATH
-template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet8f prsqrt<Packet8f>(const Packet8f& a) {
+template <>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet8f prsqrt<Packet8f>(const Packet8f& a) {
   // _mm256_rsqrt_ps returns -inf for negative denormals.
   // _mm512_rsqrt**_ps returns -NaN for negative denormals.  We may want
   // consistency here.
@@ -51,7 +50,8 @@
   return generic_rsqrt_newton_step<Packet8f, /*Steps=*/1>::run(a, _mm256_rsqrt_ps(a));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8f preciprocal<Packet8f>(const Packet8f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8f preciprocal<Packet8f>(const Packet8f& a) {
   return generic_reciprocal_newton_step<Packet8f, /*Steps=*/1>::run(a, _mm256_rcp_ps(a));
 }
 
@@ -106,7 +106,6 @@
 F16_PACKET_FUNCTION(Packet8f, Packet8h, psqrt)
 F16_PACKET_FUNCTION(Packet8f, Packet8h, ptanh)
 
-
 }  // end namespace internal
 
 }  // end namespace Eigen
diff --git a/Eigen/src/Core/arch/AVX/PacketMath.h b/Eigen/src/Core/arch/AVX/PacketMath.h
index 6f37ba0..d752f06 100644
--- a/Eigen/src/Core/arch/AVX/PacketMath.h
+++ b/Eigen/src/Core/arch/AVX/PacketMath.h
@@ -31,7 +31,7 @@
 #endif
 #endif
 
-typedef __m256  Packet8f;
+typedef __m256 Packet8f;
 typedef eigen_packet_wrapper<__m256i, 0> Packet8i;
 typedef __m256d Packet4d;
 #ifndef EIGEN_VECTORIZE_AVX512FP16
@@ -46,31 +46,58 @@
 typedef eigen_packet_wrapper<__m256i, 5> Packet4ul;
 #endif
 
-template<> struct is_arithmetic<__m256>  { enum { value = true }; };
-template<> struct is_arithmetic<__m256i> { enum { value = true }; };
-template<> struct is_arithmetic<__m256d> { enum { value = true }; };
-template<> struct is_arithmetic<Packet8i> { enum { value = true }; };
+template <>
+struct is_arithmetic<__m256> {
+  enum { value = true };
+};
+template <>
+struct is_arithmetic<__m256i> {
+  enum { value = true };
+};
+template <>
+struct is_arithmetic<__m256d> {
+  enum { value = true };
+};
+template <>
+struct is_arithmetic<Packet8i> {
+  enum { value = true };
+};
 // Note that `Packet8ui` uses the underlying type `__m256i`, which is
 // interpreted as a vector of _signed_ `int32`s, which breaks some arithmetic
 // operations used in `GenericPacketMath.h`.
-template<> struct is_arithmetic<Packet8ui> { enum { value = false }; };
+template <>
+struct is_arithmetic<Packet8ui> {
+  enum { value = false };
+};
 #ifndef EIGEN_VECTORIZE_AVX512FP16
-template<> struct is_arithmetic<Packet8h> { enum { value = true }; };
+template <>
+struct is_arithmetic<Packet8h> {
+  enum { value = true };
+};
 #endif
-template<> struct is_arithmetic<Packet8bf> { enum { value = true }; };
+template <>
+struct is_arithmetic<Packet8bf> {
+  enum { value = true };
+};
 #ifdef EIGEN_VECTORIZE_AVX2
-template<> struct is_arithmetic<Packet4l> { enum { value = true }; };
+template <>
+struct is_arithmetic<Packet4l> {
+  enum { value = true };
+};
 // Note that `Packet4ul` uses the underlying type `__m256i`, which is
 // interpreted as a vector of _signed_ `int32`s, which breaks some arithmetic
 // operations used in `GenericPacketMath.h`.
-template<> struct is_arithmetic<Packet4ul> { enum { value = false }; };
+template <>
+struct is_arithmetic<Packet4ul> {
+  enum { value = false };
+};
 #endif
 
 // Use the packet_traits defined in AVX512/PacketMath.h instead if we're going
 // to leverage AVX512 instructions.
 #ifndef EIGEN_VECTORIZE_AVX512
-template<> struct packet_traits<float>  : default_packet_traits
-{
+template <>
+struct packet_traits<float> : default_packet_traits {
   typedef Packet8f type;
   typedef Packet4f half;
   enum {
@@ -78,7 +105,7 @@
     AlignedOnScalar = 1,
     size = 8,
 
-    HasCmp  = 1,
+    HasCmp = 1,
     HasDiv = 1,
     HasReciprocal = EIGEN_FAST_MATH,
     HasSin = EIGEN_FAST_MATH,
@@ -104,19 +131,19 @@
     HasRint = 1
   };
 };
-template<> struct packet_traits<double> : default_packet_traits
-{
+template <>
+struct packet_traits<double> : default_packet_traits {
   typedef Packet4d type;
   typedef Packet2d half;
   enum {
     Vectorizable = 1,
     AlignedOnScalar = 1,
-    size=4,
+    size = 4,
 
-    HasCmp  = 1,
-    HasDiv  = 1,
-    HasLog  = 1,
-    HasExp  = 1,
+    HasCmp = 1,
+    HasDiv = 1,
+    HasLog = 1,
+    HasExp = 1,
     HasSqrt = 1,
     HasRsqrt = 1,
     HasATan = 1,
@@ -138,35 +165,35 @@
     AlignedOnScalar = 1,
     size = 8,
 
-    HasCmp    = 1,
-    HasAdd    = 1,
-    HasSub    = 1,
-    HasMul    = 1,
-    HasDiv    = 1,
-    HasSin    = EIGEN_FAST_MATH,
-    HasCos    = EIGEN_FAST_MATH,
+    HasCmp = 1,
+    HasAdd = 1,
+    HasSub = 1,
+    HasMul = 1,
+    HasDiv = 1,
+    HasSin = EIGEN_FAST_MATH,
+    HasCos = EIGEN_FAST_MATH,
     HasNegate = 1,
-    HasAbs    = 1,
-    HasAbs2   = 0,
-    HasMin    = 1,
-    HasMax    = 1,
-    HasConj   = 1,
+    HasAbs = 1,
+    HasAbs2 = 0,
+    HasMin = 1,
+    HasMax = 1,
+    HasConj = 1,
     HasSetLinear = 0,
-    HasLog    = 1,
-    HasLog1p  = 1,
-    HasExpm1  = 1,
-    HasExp    = 1,
-    HasSqrt   = 1,
-    HasRsqrt  = 1,
-    HasTanh   = EIGEN_FAST_MATH,
-    HasErf    = EIGEN_FAST_MATH,
-    HasBlend  = 0,
-    HasRound  = 1,
-    HasFloor  = 1,
-    HasCeil   = 1,
-    HasRint   = 1,
+    HasLog = 1,
+    HasLog1p = 1,
+    HasExpm1 = 1,
+    HasExp = 1,
+    HasSqrt = 1,
+    HasRsqrt = 1,
+    HasTanh = EIGEN_FAST_MATH,
+    HasErf = EIGEN_FAST_MATH,
+    HasBlend = 0,
+    HasRound = 1,
+    HasFloor = 1,
+    HasCeil = 1,
+    HasRint = 1,
     HasBessel = 1,
-    HasNdtri  = 1
+    HasNdtri = 1
   };
 };
 
@@ -189,15 +216,15 @@
     HasSin = EIGEN_FAST_MATH,
     HasCos = EIGEN_FAST_MATH,
     HasNegate = 1,
-    HasAbs    = 1,
-    HasAbs2   = 0,
-    HasMin    = 1,
-    HasMax    = 1,
-    HasConj   = 1,
+    HasAbs = 1,
+    HasAbs2 = 0,
+    HasMin = 1,
+    HasMax = 1,
+    HasConj = 1,
     HasSetLinear = 0,
     HasLog = 1,
-    HasLog1p  = 1,
-    HasExpm1  = 1,
+    HasLog1p = 1,
+    HasExpm1 = 1,
     HasExp = 1,
     HasSqrt = 1,
     HasRsqrt = 1,
@@ -209,24 +236,18 @@
     HasCeil = 1,
     HasRint = 1,
     HasBessel = 1,
-    HasNdtri  = 1
+    HasNdtri = 1
   };
 };
 
-template<> struct packet_traits<int> : default_packet_traits
-{
+template <>
+struct packet_traits<int> : default_packet_traits {
   typedef Packet8i type;
   typedef Packet4i half;
-  enum {
-    Vectorizable = 1,
-    AlignedOnScalar = 1,
-    HasCmp = 1,
-    HasDiv = 1,
-    size=8
-  };
+  enum { Vectorizable = 1, AlignedOnScalar = 1, HasCmp = 1, HasDiv = 1, size = 8 };
 };
-template<> struct packet_traits<uint32_t> : default_packet_traits
-{
+template <>
+struct packet_traits<uint32_t> : default_packet_traits {
   typedef Packet8ui type;
   typedef Packet4ui half;
   enum {
@@ -246,21 +267,16 @@
 };
 
 #ifdef EIGEN_VECTORIZE_AVX2
-template<> struct packet_traits<int64_t> : default_packet_traits
-{
+template <>
+struct packet_traits<int64_t> : default_packet_traits {
   typedef Packet4l type;
   // There is no half-size packet for current Packet4l.
   // TODO: support as SSE path.
   typedef Packet4l half;
-  enum {
-    Vectorizable = 1,
-    AlignedOnScalar = 1,
-    HasCmp = 1,
-    size=4
-  };
+  enum { Vectorizable = 1, AlignedOnScalar = 1, HasCmp = 1, size = 4 };
 };
-template<> struct packet_traits<uint64_t> : default_packet_traits
-{
+template <>
+struct packet_traits<uint64_t> : default_packet_traits {
   typedef Packet4ul type;
   // There is no half-size packet for current Packet4ul.
   // TODO: support as SSE path.
@@ -285,51 +301,106 @@
 
 #endif
 
-template<> struct scalar_div_cost<float,true> { enum { value = 14 }; };
-template<> struct scalar_div_cost<double,true> { enum { value = 16 }; };
+template <>
+struct scalar_div_cost<float, true> {
+  enum { value = 14 };
+};
+template <>
+struct scalar_div_cost<double, true> {
+  enum { value = 16 };
+};
 
-template<> struct unpacket_traits<Packet8f> {
-  typedef float     type;
-  typedef Packet4f  half;
-  typedef Packet8i  integer_packet;
-  typedef uint8_t   mask_t;
-  enum {size=8, alignment=Aligned32, vectorizable=true, masked_load_available=true, masked_store_available=true
+template <>
+struct unpacket_traits<Packet8f> {
+  typedef float type;
+  typedef Packet4f half;
+  typedef Packet8i integer_packet;
+  typedef uint8_t mask_t;
+  enum {
+    size = 8,
+    alignment = Aligned32,
+    vectorizable = true,
+    masked_load_available = true,
+    masked_store_available = true
 #ifdef EIGEN_VECTORIZE_AVX512
-    , masked_fpops_available=true
+    ,
+    masked_fpops_available = true
 #endif
   };
 };
-template<> struct unpacket_traits<Packet4d> {
+template <>
+struct unpacket_traits<Packet4d> {
   typedef double type;
   typedef Packet2d half;
-  enum {size=4, alignment=Aligned32, vectorizable=true, masked_load_available=false, masked_store_available=false};
+  enum {
+    size = 4,
+    alignment = Aligned32,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
 };
-template<> struct unpacket_traits<Packet8i> {
-  typedef int    type;
+template <>
+struct unpacket_traits<Packet8i> {
+  typedef int type;
   typedef Packet4i half;
-  enum {size=8, alignment=Aligned32, vectorizable=true, masked_load_available=false, masked_store_available=false};
+  enum {
+    size = 8,
+    alignment = Aligned32,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
 };
-template<> struct unpacket_traits<Packet8ui> {
+template <>
+struct unpacket_traits<Packet8ui> {
   typedef uint32_t type;
   typedef Packet4ui half;
-  enum {size = 8, alignment = Aligned32, vectorizable = true, masked_load_available = false, masked_store_available = false};
+  enum {
+    size = 8,
+    alignment = Aligned32,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
 };
 #ifdef EIGEN_VECTORIZE_AVX2
-template<> struct unpacket_traits<Packet4l> {
-  typedef int64_t    type;
+template <>
+struct unpacket_traits<Packet4l> {
+  typedef int64_t type;
   typedef Packet4l half;
-  enum {size=4, alignment=Aligned32, vectorizable=true, masked_load_available=false, masked_store_available=false};
+  enum {
+    size = 4,
+    alignment = Aligned32,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
 };
-template<> struct unpacket_traits<Packet4ul> {
+template <>
+struct unpacket_traits<Packet4ul> {
   typedef uint64_t type;
   typedef Packet4ul half;
-  enum {size = 4, alignment = Aligned32, vectorizable = true, masked_load_available = false, masked_store_available = false};
+  enum {
+    size = 4,
+    alignment = Aligned32,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
 };
 #endif
-template<> struct unpacket_traits<Packet8bf> {
+template <>
+struct unpacket_traits<Packet8bf> {
   typedef bfloat16 type;
   typedef Packet8bf half;
-  enum {size=8, alignment=Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false};
+  enum {
+    size = 8,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
 };
 
 // Helper function for bit packing snippet of low precision comparison.
@@ -380,7 +451,7 @@
 EIGEN_STRONG_INLINE Packet4ul padd<Packet4ul>(const Packet4ul& a, const Packet4ul& b) {
   return _mm256_add_epi64(a, b);
 }
-template<>
+template <>
 EIGEN_STRONG_INLINE Packet4l plset<Packet4l>(const int64_t& a) {
   return padd(pset1<Packet4l>(a), Packet4l(_mm256_set_epi64x(3ll, 2ll, 1ll, 0ll)));
 }
@@ -468,31 +539,33 @@
 }
 #ifdef EIGEN_VECTORIZE_AVX512FP16
 template <int N>
-EIGEN_STRONG_INLINE Packet4l parithmetic_shift_right(Packet4l a) { return _mm256_srai_epi64(a, N); }
+EIGEN_STRONG_INLINE Packet4l parithmetic_shift_right(Packet4l a) {
+  return _mm256_srai_epi64(a, N);
+}
 #else
 template <int N>
-EIGEN_STRONG_INLINE std::enable_if_t< (N == 0), Packet4l> parithmetic_shift_right(Packet4l a) {
+EIGEN_STRONG_INLINE std::enable_if_t<(N == 0), Packet4l> parithmetic_shift_right(Packet4l a) {
   return a;
 }
 template <int N>
-EIGEN_STRONG_INLINE std::enable_if_t< (N > 0) && (N < 32), Packet4l> parithmetic_shift_right(Packet4l a) {
+EIGEN_STRONG_INLINE std::enable_if_t<(N > 0) && (N < 32), Packet4l> parithmetic_shift_right(Packet4l a) {
   __m256i hi_word = _mm256_srai_epi32(a, N);
   __m256i lo_word = _mm256_srli_epi64(a, N);
   return _mm256_blend_epi32(hi_word, lo_word, 0b01010101);
 }
 template <int N>
-EIGEN_STRONG_INLINE std::enable_if_t< (N >= 32) && (N < 63), Packet4l> parithmetic_shift_right(Packet4l a) {
+EIGEN_STRONG_INLINE std::enable_if_t<(N >= 32) && (N < 63), Packet4l> parithmetic_shift_right(Packet4l a) {
   __m256i hi_word = _mm256_srai_epi32(a, 31);
   __m256i lo_word = _mm256_shuffle_epi32(_mm256_srai_epi32(a, N - 32), (shuffle_mask<1, 1, 3, 3>::mask));
   return _mm256_blend_epi32(hi_word, lo_word, 0b01010101);
 }
 template <int N>
-EIGEN_STRONG_INLINE std::enable_if_t< (N == 63), Packet4l> parithmetic_shift_right(Packet4l a) {
+EIGEN_STRONG_INLINE std::enable_if_t<(N == 63), Packet4l> parithmetic_shift_right(Packet4l a) {
   return _mm256_shuffle_epi32(_mm256_srai_epi32(a, 31), (shuffle_mask<1, 1, 3, 3>::mask));
 }
 template <int N>
-EIGEN_STRONG_INLINE std::enable_if_t< (N < 0) || (N > 63), Packet4l> parithmetic_shift_right(Packet4l a) {
-  return parithmetic_shift_right<int(N&63)>(a);
+EIGEN_STRONG_INLINE std::enable_if_t<(N < 0) || (N > 63), Packet4l> parithmetic_shift_right(Packet4l a) {
+  return parithmetic_shift_right<int(N & 63)>(a);
 }
 #endif
 template <>
@@ -523,7 +596,7 @@
   const Packet4ul a = _mm256_castsi128_si256(_mm_loadu_si128(reinterpret_cast<const __m128i*>(from)));
   return _mm256_permutevar8x32_epi32(a, _mm256_setr_epi32(0, 1, 0, 1, 2, 3, 2, 3));
 }
-template<>
+template <>
 EIGEN_STRONG_INLINE void pstore<int64_t>(int64_t* to, const Packet4l& from) {
   EIGEN_DEBUG_ALIGNED_STORE _mm256_store_si256(reinterpret_cast<__m256i*>(to), from);
 }
@@ -577,7 +650,7 @@
   Packet4ul pa = pset1<Packet4ul>(a);
   pstore(to, pa);
 }
-template<>
+template <>
 EIGEN_STRONG_INLINE int64_t pfirst<Packet4l>(const Packet4l& a) {
   return _mm_cvtsi128_si64(_mm256_castsi256_si128(a));
 }
@@ -667,51 +740,102 @@
 }
 #endif
 
-template<> EIGEN_STRONG_INLINE Packet8f pset1<Packet8f>(const float&  from) { return _mm256_set1_ps(from); }
-template<> EIGEN_STRONG_INLINE Packet4d pset1<Packet4d>(const double& from) { return _mm256_set1_pd(from); }
-template<> EIGEN_STRONG_INLINE Packet8i pset1<Packet8i>(const int&    from) { return _mm256_set1_epi32(from); }
-template<> EIGEN_STRONG_INLINE Packet8ui pset1<Packet8ui>(const uint32_t& from) { return _mm256_set1_epi32(from); }
+template <>
+EIGEN_STRONG_INLINE Packet8f pset1<Packet8f>(const float& from) {
+  return _mm256_set1_ps(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4d pset1<Packet4d>(const double& from) {
+  return _mm256_set1_pd(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8i pset1<Packet8i>(const int& from) {
+  return _mm256_set1_epi32(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8ui pset1<Packet8ui>(const uint32_t& from) {
+  return _mm256_set1_epi32(from);
+}
 
-template<> EIGEN_STRONG_INLINE Packet8f pset1frombits<Packet8f>(unsigned int from) { return _mm256_castsi256_ps(pset1<Packet8i>(from)); }
-template<> EIGEN_STRONG_INLINE Packet4d pset1frombits<Packet4d>(uint64_t from) { return _mm256_castsi256_pd(_mm256_set1_epi64x(from)); }
+template <>
+EIGEN_STRONG_INLINE Packet8f pset1frombits<Packet8f>(unsigned int from) {
+  return _mm256_castsi256_ps(pset1<Packet8i>(from));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4d pset1frombits<Packet4d>(uint64_t from) {
+  return _mm256_castsi256_pd(_mm256_set1_epi64x(from));
+}
 
-template<> EIGEN_STRONG_INLINE Packet8f pzero(const Packet8f& /*a*/) { return _mm256_setzero_ps(); }
-template<> EIGEN_STRONG_INLINE Packet4d pzero(const Packet4d& /*a*/) { return _mm256_setzero_pd(); }
-template<> EIGEN_STRONG_INLINE Packet8i pzero(const Packet8i& /*a*/) { return _mm256_setzero_si256(); }
-template<> EIGEN_STRONG_INLINE Packet8ui pzero(const Packet8ui& /*a*/) { return _mm256_setzero_si256(); }
+template <>
+EIGEN_STRONG_INLINE Packet8f pzero(const Packet8f& /*a*/) {
+  return _mm256_setzero_ps();
+}
+template <>
+EIGEN_STRONG_INLINE Packet4d pzero(const Packet4d& /*a*/) {
+  return _mm256_setzero_pd();
+}
+template <>
+EIGEN_STRONG_INLINE Packet8i pzero(const Packet8i& /*a*/) {
+  return _mm256_setzero_si256();
+}
+template <>
+EIGEN_STRONG_INLINE Packet8ui pzero(const Packet8ui& /*a*/) {
+  return _mm256_setzero_si256();
+}
 
+template <>
+EIGEN_STRONG_INLINE Packet8f peven_mask(const Packet8f& /*a*/) {
+  return _mm256_castsi256_ps(_mm256_set_epi32(0, -1, 0, -1, 0, -1, 0, -1));
+}
+template <>
+EIGEN_STRONG_INLINE Packet8i peven_mask(const Packet8i& /*a*/) {
+  return _mm256_set_epi32(0, -1, 0, -1, 0, -1, 0, -1);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8ui peven_mask(const Packet8ui& /*a*/) {
+  return _mm256_set_epi32(0, -1, 0, -1, 0, -1, 0, -1);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4d peven_mask(const Packet4d& /*a*/) {
+  return _mm256_castsi256_pd(_mm256_set_epi32(0, 0, -1, -1, 0, 0, -1, -1));
+}
 
-template<> EIGEN_STRONG_INLINE Packet8f peven_mask(const Packet8f& /*a*/) { return _mm256_castsi256_ps(_mm256_set_epi32(0, -1, 0, -1, 0, -1, 0, -1)); }
-template<> EIGEN_STRONG_INLINE Packet8i peven_mask(const Packet8i& /*a*/) { return _mm256_set_epi32(0, -1, 0, -1, 0, -1, 0, -1); }
-template<> EIGEN_STRONG_INLINE Packet8ui peven_mask(const Packet8ui& /*a*/) { return _mm256_set_epi32(0, -1, 0, -1, 0, -1, 0, -1); }
-template<> EIGEN_STRONG_INLINE Packet4d peven_mask(const Packet4d& /*a*/) { return _mm256_castsi256_pd(_mm256_set_epi32(0, 0, -1, -1, 0, 0, -1, -1)); }
+template <>
+EIGEN_STRONG_INLINE Packet8f pload1<Packet8f>(const float* from) {
+  return _mm256_broadcast_ss(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4d pload1<Packet4d>(const double* from) {
+  return _mm256_broadcast_sd(from);
+}
 
-template<> EIGEN_STRONG_INLINE Packet8f pload1<Packet8f>(const float*  from) { return _mm256_broadcast_ss(from); }
-template<> EIGEN_STRONG_INLINE Packet4d pload1<Packet4d>(const double* from) { return _mm256_broadcast_sd(from); }
-
-template<> EIGEN_STRONG_INLINE Packet8f padd<Packet8f>(const Packet8f& a, const Packet8f& b) { return _mm256_add_ps(a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet8f padd<Packet8f>(const Packet8f& a, const Packet8f& b) {
+  return _mm256_add_ps(a, b);
+}
 #ifdef EIGEN_VECTORIZE_AVX512
 template <>
 EIGEN_STRONG_INLINE Packet8f padd<Packet8f>(const Packet8f& a, const Packet8f& b, uint8_t umask) {
   __mmask16 mask = static_cast<__mmask16>(umask & 0x00FF);
-  return _mm512_castps512_ps256(_mm512_maskz_add_ps(
-                                    mask,
-                                    _mm512_castps256_ps512(a),
-                                    _mm512_castps256_ps512(b)));
+  return _mm512_castps512_ps256(_mm512_maskz_add_ps(mask, _mm512_castps256_ps512(a), _mm512_castps256_ps512(b)));
 }
 #endif
-template<> EIGEN_STRONG_INLINE Packet4d padd<Packet4d>(const Packet4d& a, const Packet4d& b) { return _mm256_add_pd(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8i padd<Packet8i>(const Packet8i& a, const Packet8i& b) {
+template <>
+EIGEN_STRONG_INLINE Packet4d padd<Packet4d>(const Packet4d& a, const Packet4d& b) {
+  return _mm256_add_pd(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8i padd<Packet8i>(const Packet8i& a, const Packet8i& b) {
 #ifdef EIGEN_VECTORIZE_AVX2
-  return _mm256_add_epi32(a,b);
+  return _mm256_add_epi32(a, b);
 #else
   __m128i lo = _mm_add_epi32(_mm256_extractf128_si256(a, 0), _mm256_extractf128_si256(b, 0));
   __m128i hi = _mm_add_epi32(_mm256_extractf128_si256(a, 1), _mm256_extractf128_si256(b, 1));
   return _mm256_insertf128_si256(_mm256_castsi128_si256(lo), (hi), 1);
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet8ui padd<Packet8ui>(const Packet8ui& a, const Packet8ui& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8ui padd<Packet8ui>(const Packet8ui& a, const Packet8ui& b) {
 #ifdef EIGEN_VECTORIZE_AVX2
   return _mm256_add_epi32(a, b);
 #else
@@ -721,24 +845,43 @@
 #endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet8f plset<Packet8f>(const float& a) { return padd(pset1<Packet8f>(a), _mm256_set_ps(7.0,6.0,5.0,4.0,3.0,2.0,1.0,0.0)); }
-template<> EIGEN_STRONG_INLINE Packet4d plset<Packet4d>(const double& a) { return padd(pset1<Packet4d>(a), _mm256_set_pd(3.0,2.0,1.0,0.0)); }
-template<> EIGEN_STRONG_INLINE Packet8i plset<Packet8i>(const int& a) { return padd(pset1<Packet8i>(a), (Packet8i)_mm256_set_epi32(7,6,5,4,3,2,1,0)); }
-template<> EIGEN_STRONG_INLINE Packet8ui plset<Packet8ui>(const uint32_t& a) { return padd(pset1<Packet8ui>(a), (Packet8ui)_mm256_set_epi32(7, 6, 5, 4, 3, 2, 1, 0)); }
+template <>
+EIGEN_STRONG_INLINE Packet8f plset<Packet8f>(const float& a) {
+  return padd(pset1<Packet8f>(a), _mm256_set_ps(7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 0.0));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4d plset<Packet4d>(const double& a) {
+  return padd(pset1<Packet4d>(a), _mm256_set_pd(3.0, 2.0, 1.0, 0.0));
+}
+template <>
+EIGEN_STRONG_INLINE Packet8i plset<Packet8i>(const int& a) {
+  return padd(pset1<Packet8i>(a), (Packet8i)_mm256_set_epi32(7, 6, 5, 4, 3, 2, 1, 0));
+}
+template <>
+EIGEN_STRONG_INLINE Packet8ui plset<Packet8ui>(const uint32_t& a) {
+  return padd(pset1<Packet8ui>(a), (Packet8ui)_mm256_set_epi32(7, 6, 5, 4, 3, 2, 1, 0));
+}
 
-template<> EIGEN_STRONG_INLINE Packet8f psub<Packet8f>(const Packet8f& a, const Packet8f& b) { return _mm256_sub_ps(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4d psub<Packet4d>(const Packet4d& a, const Packet4d& b) { return _mm256_sub_pd(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8i psub<Packet8i>(const Packet8i& a, const Packet8i& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8f psub<Packet8f>(const Packet8f& a, const Packet8f& b) {
+  return _mm256_sub_ps(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4d psub<Packet4d>(const Packet4d& a, const Packet4d& b) {
+  return _mm256_sub_pd(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8i psub<Packet8i>(const Packet8i& a, const Packet8i& b) {
 #ifdef EIGEN_VECTORIZE_AVX2
-  return _mm256_sub_epi32(a,b);
+  return _mm256_sub_epi32(a, b);
 #else
   __m128i lo = _mm_sub_epi32(_mm256_extractf128_si256(a, 0), _mm256_extractf128_si256(b, 0));
   __m128i hi = _mm_sub_epi32(_mm256_extractf128_si256(a, 1), _mm256_extractf128_si256(b, 1));
   return _mm256_insertf128_si256(_mm256_castsi128_si256(lo), (hi), 1);
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet8ui psub<Packet8ui>(const Packet8ui& a, const Packet8ui& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8ui psub<Packet8ui>(const Packet8ui& a, const Packet8ui& b) {
 #ifdef EIGEN_VECTORIZE_AVX2
   return _mm256_sub_epi32(a, b);
 #else
@@ -748,38 +891,54 @@
 #endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet8f pnegate(const Packet8f& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8f pnegate(const Packet8f& a) {
   const Packet8f mask = _mm256_castsi256_ps(_mm256_set1_epi32(0x80000000));
   return _mm256_xor_ps(a, mask);
 }
-template<> EIGEN_STRONG_INLINE Packet4d pnegate(const Packet4d& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4d pnegate(const Packet4d& a) {
   const Packet4d mask = _mm256_castsi256_pd(_mm256_set1_epi64x(0x8000000000000000ULL));
   return _mm256_xor_pd(a, mask);
 }
-template<> EIGEN_STRONG_INLINE Packet8i pnegate(const Packet8i& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8i pnegate(const Packet8i& a) {
   return psub(pzero(a), a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8f pconj(const Packet8f& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet4d pconj(const Packet4d& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet8i pconj(const Packet8i& a) { return a; }
+template <>
+EIGEN_STRONG_INLINE Packet8f pconj(const Packet8f& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet4d pconj(const Packet4d& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet8i pconj(const Packet8i& a) {
+  return a;
+}
 
-template<> EIGEN_STRONG_INLINE Packet8f pmul<Packet8f>(const Packet8f& a, const Packet8f& b) { return _mm256_mul_ps(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4d pmul<Packet4d>(const Packet4d& a, const Packet4d& b) { return _mm256_mul_pd(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8i pmul<Packet8i>(const Packet8i& a, const Packet8i& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8f pmul<Packet8f>(const Packet8f& a, const Packet8f& b) {
+  return _mm256_mul_ps(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4d pmul<Packet4d>(const Packet4d& a, const Packet4d& b) {
+  return _mm256_mul_pd(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8i pmul<Packet8i>(const Packet8i& a, const Packet8i& b) {
 #ifdef EIGEN_VECTORIZE_AVX2
-  return _mm256_mullo_epi32(a,b);
+  return _mm256_mullo_epi32(a, b);
 #else
   const __m128i lo = _mm_mullo_epi32(_mm256_extractf128_si256(a, 0), _mm256_extractf128_si256(b, 0));
   const __m128i hi = _mm_mullo_epi32(_mm256_extractf128_si256(a, 1), _mm256_extractf128_si256(b, 1));
   return _mm256_insertf128_si256(_mm256_castsi128_si256(lo), (hi), 1);
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet8ui pmul<Packet8ui>(const Packet8ui& a, const Packet8ui& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8ui pmul<Packet8ui>(const Packet8ui& a, const Packet8ui& b) {
 #ifdef EIGEN_VECTORIZE_AVX2
   return _mm256_mullo_epi32(a, b);
 #else
@@ -789,11 +948,17 @@
 #endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet8f pdiv<Packet8f>(const Packet8f& a, const Packet8f& b) { return _mm256_div_ps(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4d pdiv<Packet4d>(const Packet4d& a, const Packet4d& b) { return _mm256_div_pd(a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet8f pdiv<Packet8f>(const Packet8f& a, const Packet8f& b) {
+  return _mm256_div_ps(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4d pdiv<Packet4d>(const Packet4d& a, const Packet4d& b) {
+  return _mm256_div_pd(a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet8i pdiv<Packet8i>(const Packet8i& a, const Packet8i& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8i pdiv<Packet8i>(const Packet8i& a, const Packet8i& b) {
 #ifdef EIGEN_VECTORIZE_AVX512
   return _mm512_cvttpd_epi32(_mm512_div_pd(_mm512_cvtepi32_pd(a), _mm512_cvtepi32_pd(b)));
 #else
@@ -845,20 +1010,48 @@
 
 #endif
 
-template<> EIGEN_STRONG_INLINE Packet8f pcmp_le(const Packet8f& a, const Packet8f& b) { return _mm256_cmp_ps(a,b,_CMP_LE_OQ); }
-template<> EIGEN_STRONG_INLINE Packet8f pcmp_lt(const Packet8f& a, const Packet8f& b) { return _mm256_cmp_ps(a,b,_CMP_LT_OQ); }
-template<> EIGEN_STRONG_INLINE Packet8f pcmp_lt_or_nan(const Packet8f& a, const Packet8f& b) { return _mm256_cmp_ps(a, b, _CMP_NGE_UQ); }
-template<> EIGEN_STRONG_INLINE Packet8f pcmp_eq(const Packet8f& a, const Packet8f& b) { return _mm256_cmp_ps(a,b,_CMP_EQ_OQ); }
-template<> EIGEN_STRONG_INLINE Packet8f pisnan(const Packet8f& a) { return _mm256_cmp_ps(a,a,_CMP_UNORD_Q); }
+template <>
+EIGEN_STRONG_INLINE Packet8f pcmp_le(const Packet8f& a, const Packet8f& b) {
+  return _mm256_cmp_ps(a, b, _CMP_LE_OQ);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8f pcmp_lt(const Packet8f& a, const Packet8f& b) {
+  return _mm256_cmp_ps(a, b, _CMP_LT_OQ);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8f pcmp_lt_or_nan(const Packet8f& a, const Packet8f& b) {
+  return _mm256_cmp_ps(a, b, _CMP_NGE_UQ);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8f pcmp_eq(const Packet8f& a, const Packet8f& b) {
+  return _mm256_cmp_ps(a, b, _CMP_EQ_OQ);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8f pisnan(const Packet8f& a) {
+  return _mm256_cmp_ps(a, a, _CMP_UNORD_Q);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4d pcmp_le(const Packet4d& a, const Packet4d& b) { return _mm256_cmp_pd(a,b,_CMP_LE_OQ); }
-template<> EIGEN_STRONG_INLINE Packet4d pcmp_lt(const Packet4d& a, const Packet4d& b) { return _mm256_cmp_pd(a,b,_CMP_LT_OQ); }
-template<> EIGEN_STRONG_INLINE Packet4d pcmp_lt_or_nan(const Packet4d& a, const Packet4d& b) { return _mm256_cmp_pd(a, b, _CMP_NGE_UQ); }
-template<> EIGEN_STRONG_INLINE Packet4d pcmp_eq(const Packet4d& a, const Packet4d& b) { return _mm256_cmp_pd(a,b,_CMP_EQ_OQ); }
+template <>
+EIGEN_STRONG_INLINE Packet4d pcmp_le(const Packet4d& a, const Packet4d& b) {
+  return _mm256_cmp_pd(a, b, _CMP_LE_OQ);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4d pcmp_lt(const Packet4d& a, const Packet4d& b) {
+  return _mm256_cmp_pd(a, b, _CMP_LT_OQ);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4d pcmp_lt_or_nan(const Packet4d& a, const Packet4d& b) {
+  return _mm256_cmp_pd(a, b, _CMP_NGE_UQ);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4d pcmp_eq(const Packet4d& a, const Packet4d& b) {
+  return _mm256_cmp_pd(a, b, _CMP_EQ_OQ);
+}
 
-template<> EIGEN_STRONG_INLINE Packet8i pcmp_le(const Packet8i& a, const Packet8i& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8i pcmp_le(const Packet8i& a, const Packet8i& b) {
 #ifdef EIGEN_VECTORIZE_AVX2
-  return _mm256_xor_si256(_mm256_cmpgt_epi32(a,b), _mm256_set1_epi32(-1));
+  return _mm256_xor_si256(_mm256_cmpgt_epi32(a, b), _mm256_set1_epi32(-1));
 #else
   __m128i lo = _mm_cmpgt_epi32(_mm256_extractf128_si256(a, 0), _mm256_extractf128_si256(b, 0));
   lo = _mm_xor_si128(lo, _mm_set1_epi32(-1));
@@ -867,25 +1060,28 @@
   return _mm256_insertf128_si256(_mm256_castsi128_si256(lo), (hi), 1);
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet8i pcmp_lt(const Packet8i& a, const Packet8i& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8i pcmp_lt(const Packet8i& a, const Packet8i& b) {
 #ifdef EIGEN_VECTORIZE_AVX2
-  return _mm256_cmpgt_epi32(b,a);
+  return _mm256_cmpgt_epi32(b, a);
 #else
   __m128i lo = _mm_cmpgt_epi32(_mm256_extractf128_si256(b, 0), _mm256_extractf128_si256(a, 0));
   __m128i hi = _mm_cmpgt_epi32(_mm256_extractf128_si256(b, 1), _mm256_extractf128_si256(a, 1));
   return _mm256_insertf128_si256(_mm256_castsi128_si256(lo), (hi), 1);
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet8i pcmp_eq(const Packet8i& a, const Packet8i& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8i pcmp_eq(const Packet8i& a, const Packet8i& b) {
 #ifdef EIGEN_VECTORIZE_AVX2
-  return _mm256_cmpeq_epi32(a,b);
+  return _mm256_cmpeq_epi32(a, b);
 #else
   __m128i lo = _mm_cmpeq_epi32(_mm256_extractf128_si256(a, 0), _mm256_extractf128_si256(b, 0));
   __m128i hi = _mm_cmpeq_epi32(_mm256_extractf128_si256(a, 1), _mm256_extractf128_si256(b, 1));
   return _mm256_insertf128_si256(_mm256_castsi128_si256(lo), (hi), 1);
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet8ui pcmp_eq(const Packet8ui& a, const Packet8ui& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8ui pcmp_eq(const Packet8ui& a, const Packet8ui& b) {
 #ifdef EIGEN_VECTORIZE_AVX2
   return _mm256_cmpeq_epi32(a, b);
 #else
@@ -895,32 +1091,35 @@
 #endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet8f pmin<Packet8f>(const Packet8f& a, const Packet8f& b) {
-#if EIGEN_GNUC_STRICT_LESS_THAN(6,3,0)
+template <>
+EIGEN_STRONG_INLINE Packet8f pmin<Packet8f>(const Packet8f& a, const Packet8f& b) {
+#if EIGEN_GNUC_STRICT_LESS_THAN(6, 3, 0)
   // There appears to be a bug in GCC, by which the optimizer may flip
   // the argument order in calls to _mm_min_ps/_mm_max_ps, so we have to
   // resort to inline ASM here. This is supposed to be fixed in gcc6.3,
   // see also: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=72867
   Packet8f res;
-  asm("vminps %[a], %[b], %[res]" : [res] "=x" (res) : [a] "x" (a), [b] "x" (b));
+  asm("vminps %[a], %[b], %[res]" : [res] "=x"(res) : [a] "x"(a), [b] "x"(b));
   return res;
 #else
   // Arguments are swapped to match NaN propagation behavior of std::min.
-  return _mm256_min_ps(b,a);
+  return _mm256_min_ps(b, a);
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet4d pmin<Packet4d>(const Packet4d& a, const Packet4d& b) {
-#if EIGEN_GNUC_STRICT_LESS_THAN(6,3,0)
+template <>
+EIGEN_STRONG_INLINE Packet4d pmin<Packet4d>(const Packet4d& a, const Packet4d& b) {
+#if EIGEN_GNUC_STRICT_LESS_THAN(6, 3, 0)
   // See pmin above
   Packet4d res;
-  asm("vminpd %[a], %[b], %[res]" : [res] "=x" (res) : [a] "x" (a), [b] "x" (b));
+  asm("vminpd %[a], %[b], %[res]" : [res] "=x"(res) : [a] "x"(a), [b] "x"(b));
   return res;
 #else
   // Arguments are swapped to match NaN propagation behavior of std::min.
-  return _mm256_min_pd(b,a);
+  return _mm256_min_pd(b, a);
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet8i pmin<Packet8i>(const Packet8i& a, const Packet8i& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8i pmin<Packet8i>(const Packet8i& a, const Packet8i& b) {
 #ifdef EIGEN_VECTORIZE_AVX2
   return _mm256_min_epi32(a, b);
 #else
@@ -929,7 +1128,8 @@
   return _mm256_insertf128_si256(_mm256_castsi128_si256(lo), (hi), 1);
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet8ui pmin<Packet8ui>(const Packet8ui& a, const Packet8ui& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8ui pmin<Packet8ui>(const Packet8ui& a, const Packet8ui& b) {
 #ifdef EIGEN_VECTORIZE_AVX2
   return _mm256_min_epu32(a, b);
 #else
@@ -939,29 +1139,32 @@
 #endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet8f pmax<Packet8f>(const Packet8f& a, const Packet8f& b) {
-#if EIGEN_GNUC_STRICT_LESS_THAN(6,3,0)
+template <>
+EIGEN_STRONG_INLINE Packet8f pmax<Packet8f>(const Packet8f& a, const Packet8f& b) {
+#if EIGEN_GNUC_STRICT_LESS_THAN(6, 3, 0)
   // See pmin above
   Packet8f res;
-  asm("vmaxps %[a], %[b], %[res]" : [res] "=x" (res) : [a] "x" (a), [b] "x" (b));
+  asm("vmaxps %[a], %[b], %[res]" : [res] "=x"(res) : [a] "x"(a), [b] "x"(b));
   return res;
 #else
   // Arguments are swapped to match NaN propagation behavior of std::max.
-  return _mm256_max_ps(b,a);
+  return _mm256_max_ps(b, a);
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet4d pmax<Packet4d>(const Packet4d& a, const Packet4d& b) {
-#if EIGEN_GNUC_STRICT_LESS_THAN(6,3,0)
+template <>
+EIGEN_STRONG_INLINE Packet4d pmax<Packet4d>(const Packet4d& a, const Packet4d& b) {
+#if EIGEN_GNUC_STRICT_LESS_THAN(6, 3, 0)
   // See pmin above
   Packet4d res;
-  asm("vmaxpd %[a], %[b], %[res]" : [res] "=x" (res) : [a] "x" (a), [b] "x" (b));
+  asm("vmaxpd %[a], %[b], %[res]" : [res] "=x"(res) : [a] "x"(a), [b] "x"(b));
   return res;
 #else
   // Arguments are swapped to match NaN propagation behavior of std::max.
-  return _mm256_max_pd(b,a);
+  return _mm256_max_pd(b, a);
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet8i pmax<Packet8i>(const Packet8i& a, const Packet8i& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8i pmax<Packet8i>(const Packet8i& a, const Packet8i& b) {
 #ifdef EIGEN_VECTORIZE_AVX2
   return _mm256_max_epi32(a, b);
 #else
@@ -970,7 +1173,8 @@
   return _mm256_insertf128_si256(_mm256_castsi128_si256(lo), (hi), 1);
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet8ui pmax<Packet8ui>(const Packet8ui& a, const Packet8ui& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8ui pmax<Packet8ui>(const Packet8ui& a, const Packet8ui& b) {
 #ifdef EIGEN_VECTORIZE_AVX2
   return _mm256_max_epu32(a, b);
 #else
@@ -981,129 +1185,174 @@
 }
 
 #ifdef EIGEN_VECTORIZE_AVX2
-template<> EIGEN_STRONG_INLINE Packet8i psign(const Packet8i& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8i psign(const Packet8i& a) {
   return _mm256_sign_epi32(_mm256_set1_epi32(1), a);
 }
 #endif
 
 // Add specializations for min/max with prescribed NaN progation.
-template<>
+template <>
 EIGEN_STRONG_INLINE Packet8f pmin<PropagateNumbers, Packet8f>(const Packet8f& a, const Packet8f& b) {
   return pminmax_propagate_numbers(a, b, pmin<Packet8f>);
 }
-template<>
+template <>
 EIGEN_STRONG_INLINE Packet4d pmin<PropagateNumbers, Packet4d>(const Packet4d& a, const Packet4d& b) {
   return pminmax_propagate_numbers(a, b, pmin<Packet4d>);
 }
-template<>
+template <>
 EIGEN_STRONG_INLINE Packet8f pmax<PropagateNumbers, Packet8f>(const Packet8f& a, const Packet8f& b) {
   return pminmax_propagate_numbers(a, b, pmax<Packet8f>);
 }
-template<>
+template <>
 EIGEN_STRONG_INLINE Packet4d pmax<PropagateNumbers, Packet4d>(const Packet4d& a, const Packet4d& b) {
   return pminmax_propagate_numbers(a, b, pmax<Packet4d>);
 }
-template<>
+template <>
 EIGEN_STRONG_INLINE Packet8f pmin<PropagateNaN, Packet8f>(const Packet8f& a, const Packet8f& b) {
   return pminmax_propagate_nan(a, b, pmin<Packet8f>);
 }
-template<>
+template <>
 EIGEN_STRONG_INLINE Packet4d pmin<PropagateNaN, Packet4d>(const Packet4d& a, const Packet4d& b) {
   return pminmax_propagate_nan(a, b, pmin<Packet4d>);
 }
-template<>
+template <>
 EIGEN_STRONG_INLINE Packet8f pmax<PropagateNaN, Packet8f>(const Packet8f& a, const Packet8f& b) {
   return pminmax_propagate_nan(a, b, pmax<Packet8f>);
 }
-template<>
+template <>
 EIGEN_STRONG_INLINE Packet4d pmax<PropagateNaN, Packet4d>(const Packet4d& a, const Packet4d& b) {
   return pminmax_propagate_nan(a, b, pmax<Packet4d>);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8f print<Packet8f>(const Packet8f& a) { return _mm256_round_ps(a, _MM_FROUND_CUR_DIRECTION); }
-template<> EIGEN_STRONG_INLINE Packet4d print<Packet4d>(const Packet4d& a) { return _mm256_round_pd(a, _MM_FROUND_CUR_DIRECTION); }
+template <>
+EIGEN_STRONG_INLINE Packet8f print<Packet8f>(const Packet8f& a) {
+  return _mm256_round_ps(a, _MM_FROUND_CUR_DIRECTION);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4d print<Packet4d>(const Packet4d& a) {
+  return _mm256_round_pd(a, _MM_FROUND_CUR_DIRECTION);
+}
 
-template<> EIGEN_STRONG_INLINE Packet8f pceil<Packet8f>(const Packet8f& a) { return _mm256_ceil_ps(a); }
-template<> EIGEN_STRONG_INLINE Packet4d pceil<Packet4d>(const Packet4d& a) { return _mm256_ceil_pd(a); }
+template <>
+EIGEN_STRONG_INLINE Packet8f pceil<Packet8f>(const Packet8f& a) {
+  return _mm256_ceil_ps(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4d pceil<Packet4d>(const Packet4d& a) {
+  return _mm256_ceil_pd(a);
+}
 
-template<> EIGEN_STRONG_INLINE Packet8f pfloor<Packet8f>(const Packet8f& a) { return _mm256_floor_ps(a); }
-template<> EIGEN_STRONG_INLINE Packet4d pfloor<Packet4d>(const Packet4d& a) { return _mm256_floor_pd(a); }
+template <>
+EIGEN_STRONG_INLINE Packet8f pfloor<Packet8f>(const Packet8f& a) {
+  return _mm256_floor_ps(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4d pfloor<Packet4d>(const Packet4d& a) {
+  return _mm256_floor_pd(a);
+}
 
-
-template<> EIGEN_STRONG_INLINE Packet8i ptrue<Packet8i>(const Packet8i& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8i ptrue<Packet8i>(const Packet8i& a) {
 #ifdef EIGEN_VECTORIZE_AVX2
   // vpcmpeqd has lower latency than the more general vcmpps
-  return _mm256_cmpeq_epi32(a,a);
+  return _mm256_cmpeq_epi32(a, a);
 #else
   const __m256 b = _mm256_castsi256_ps(a);
-  return _mm256_castps_si256(_mm256_cmp_ps(b,b,_CMP_TRUE_UQ));
+  return _mm256_castps_si256(_mm256_cmp_ps(b, b, _CMP_TRUE_UQ));
 #endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet8f ptrue<Packet8f>(const Packet8f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8f ptrue<Packet8f>(const Packet8f& a) {
 #ifdef EIGEN_VECTORIZE_AVX2
   // vpcmpeqd has lower latency than the more general vcmpps
   const __m256i b = _mm256_castps_si256(a);
-  return _mm256_castsi256_ps(_mm256_cmpeq_epi32(b,b));
+  return _mm256_castsi256_ps(_mm256_cmpeq_epi32(b, b));
 #else
-  return _mm256_cmp_ps(a,a,_CMP_TRUE_UQ);
+  return _mm256_cmp_ps(a, a, _CMP_TRUE_UQ);
 #endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet4d ptrue<Packet4d>(const Packet4d& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4d ptrue<Packet4d>(const Packet4d& a) {
 #ifdef EIGEN_VECTORIZE_AVX2
   // vpcmpeqq has lower latency than the more general vcmppd
   const __m256i b = _mm256_castpd_si256(a);
-  return _mm256_castsi256_pd(_mm256_cmpeq_epi64(b,b));
+  return _mm256_castsi256_pd(_mm256_cmpeq_epi64(b, b));
 #else
-  return _mm256_cmp_pd(a,a,_CMP_TRUE_UQ);
+  return _mm256_cmp_pd(a, a, _CMP_TRUE_UQ);
 #endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet8f pand<Packet8f>(const Packet8f& a, const Packet8f& b) { return _mm256_and_ps(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4d pand<Packet4d>(const Packet4d& a, const Packet4d& b) { return _mm256_and_pd(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8i pand<Packet8i>(const Packet8i& a, const Packet8i& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8f pand<Packet8f>(const Packet8f& a, const Packet8f& b) {
+  return _mm256_and_ps(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4d pand<Packet4d>(const Packet4d& a, const Packet4d& b) {
+  return _mm256_and_pd(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8i pand<Packet8i>(const Packet8i& a, const Packet8i& b) {
 #ifdef EIGEN_VECTORIZE_AVX2
-  return _mm256_and_si256(a,b);
+  return _mm256_and_si256(a, b);
 #else
-  return _mm256_castps_si256(_mm256_and_ps(_mm256_castsi256_ps(a),_mm256_castsi256_ps(b)));
+  return _mm256_castps_si256(_mm256_and_ps(_mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet8ui pand<Packet8ui>(const Packet8ui& a, const Packet8ui& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8ui pand<Packet8ui>(const Packet8ui& a, const Packet8ui& b) {
 #ifdef EIGEN_VECTORIZE_AVX2
-  return _mm256_and_si256(a,b);
+  return _mm256_and_si256(a, b);
 #else
-  return _mm256_castps_si256(_mm256_and_ps(_mm256_castsi256_ps(a),_mm256_castsi256_ps(b)));
+  return _mm256_castps_si256(_mm256_and_ps(_mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
 #endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet8f por<Packet8f>(const Packet8f& a, const Packet8f& b) { return _mm256_or_ps(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4d por<Packet4d>(const Packet4d& a, const Packet4d& b) { return _mm256_or_pd(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8i por<Packet8i>(const Packet8i& a, const Packet8i& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8f por<Packet8f>(const Packet8f& a, const Packet8f& b) {
+  return _mm256_or_ps(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4d por<Packet4d>(const Packet4d& a, const Packet4d& b) {
+  return _mm256_or_pd(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8i por<Packet8i>(const Packet8i& a, const Packet8i& b) {
 #ifdef EIGEN_VECTORIZE_AVX2
-  return _mm256_or_si256(a,b);
+  return _mm256_or_si256(a, b);
 #else
-  return _mm256_castps_si256(_mm256_or_ps(_mm256_castsi256_ps(a),_mm256_castsi256_ps(b)));
+  return _mm256_castps_si256(_mm256_or_ps(_mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet8ui por<Packet8ui>(const Packet8ui& a, const Packet8ui& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8ui por<Packet8ui>(const Packet8ui& a, const Packet8ui& b) {
 #ifdef EIGEN_VECTORIZE_AVX2
-  return _mm256_or_si256(a,b);
+  return _mm256_or_si256(a, b);
 #else
-  return _mm256_castps_si256(_mm256_or_ps(_mm256_castsi256_ps(a),_mm256_castsi256_ps(b)));
+  return _mm256_castps_si256(_mm256_or_ps(_mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
 #endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet8f pxor<Packet8f>(const Packet8f& a, const Packet8f& b) { return _mm256_xor_ps(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4d pxor<Packet4d>(const Packet4d& a, const Packet4d& b) { return _mm256_xor_pd(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8i pxor<Packet8i>(const Packet8i& a, const Packet8i& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8f pxor<Packet8f>(const Packet8f& a, const Packet8f& b) {
+  return _mm256_xor_ps(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4d pxor<Packet4d>(const Packet4d& a, const Packet4d& b) {
+  return _mm256_xor_pd(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8i pxor<Packet8i>(const Packet8i& a, const Packet8i& b) {
 #ifdef EIGEN_VECTORIZE_AVX2
-  return _mm256_xor_si256(a,b);
+  return _mm256_xor_si256(a, b);
 #else
-  return _mm256_castps_si256(_mm256_xor_ps(_mm256_castsi256_ps(a),_mm256_castsi256_ps(b)));
+  return _mm256_castps_si256(_mm256_xor_ps(_mm256_castsi256_ps(a), _mm256_castsi256_ps(b)));
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet8ui pxor<Packet8ui>(const Packet8ui& a, const Packet8ui& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8ui pxor<Packet8ui>(const Packet8ui& a, const Packet8ui& b) {
 #ifdef EIGEN_VECTORIZE_AVX2
   return _mm256_xor_si256(a, b);
 #else
@@ -1111,54 +1360,75 @@
 #endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet8f pandnot<Packet8f>(const Packet8f& a, const Packet8f& b) { return _mm256_andnot_ps(b,a); }
-template<> EIGEN_STRONG_INLINE Packet4d pandnot<Packet4d>(const Packet4d& a, const Packet4d& b) { return _mm256_andnot_pd(b,a); }
-template<> EIGEN_STRONG_INLINE Packet8i pandnot<Packet8i>(const Packet8i& a, const Packet8i& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8f pandnot<Packet8f>(const Packet8f& a, const Packet8f& b) {
+  return _mm256_andnot_ps(b, a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4d pandnot<Packet4d>(const Packet4d& a, const Packet4d& b) {
+  return _mm256_andnot_pd(b, a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8i pandnot<Packet8i>(const Packet8i& a, const Packet8i& b) {
 #ifdef EIGEN_VECTORIZE_AVX2
-  return _mm256_andnot_si256(b,a);
+  return _mm256_andnot_si256(b, a);
 #else
-  return _mm256_castps_si256(_mm256_andnot_ps(_mm256_castsi256_ps(b),_mm256_castsi256_ps(a)));
+  return _mm256_castps_si256(_mm256_andnot_ps(_mm256_castsi256_ps(b), _mm256_castsi256_ps(a)));
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet8ui pandnot<Packet8ui>(const Packet8ui& a, const Packet8ui& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8ui pandnot<Packet8ui>(const Packet8ui& a, const Packet8ui& b) {
 #ifdef EIGEN_VECTORIZE_AVX2
-  return _mm256_andnot_si256(b,a);
+  return _mm256_andnot_si256(b, a);
 #else
-  return _mm256_castps_si256(_mm256_andnot_ps(_mm256_castsi256_ps(b),_mm256_castsi256_ps(a)));
+  return _mm256_castps_si256(_mm256_andnot_ps(_mm256_castsi256_ps(b), _mm256_castsi256_ps(a)));
 #endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet8ui pcmp_lt(const Packet8ui& a, const Packet8ui& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8ui pcmp_lt(const Packet8ui& a, const Packet8ui& b) {
   return pxor(pcmp_eq(a, pmax(a, b)), ptrue(a));
 }
-template<> EIGEN_STRONG_INLINE Packet8ui pcmp_le(const Packet8ui& a, const Packet8ui& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8ui pcmp_le(const Packet8ui& a, const Packet8ui& b) {
   return pcmp_eq(a, pmin(a, b));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8f pround<Packet8f>(const Packet8f& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8f pround<Packet8f>(const Packet8f& a) {
   const Packet8f mask = pset1frombits<Packet8f>(static_cast<numext::uint32_t>(0x80000000u));
   const Packet8f prev0dot5 = pset1frombits<Packet8f>(static_cast<numext::uint32_t>(0x3EFFFFFFu));
   return _mm256_round_ps(padd(por(pand(a, mask), prev0dot5), a), _MM_FROUND_TO_ZERO);
 }
-template<> EIGEN_STRONG_INLINE Packet4d pround<Packet4d>(const Packet4d& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4d pround<Packet4d>(const Packet4d& a) {
   const Packet4d mask = pset1frombits<Packet4d>(static_cast<numext::uint64_t>(0x8000000000000000ull));
   const Packet4d prev0dot5 = pset1frombits<Packet4d>(static_cast<numext::uint64_t>(0x3FDFFFFFFFFFFFFFull));
   return _mm256_round_pd(padd(por(pand(a, mask), prev0dot5), a), _MM_FROUND_TO_ZERO);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8f pselect<Packet8f>(const Packet8f& mask, const Packet8f& a, const Packet8f& b)
-{ return _mm256_blendv_ps(b,a,mask); }
-template<> EIGEN_STRONG_INLINE Packet8i pselect<Packet8i>(const Packet8i& mask, const Packet8i& a, const Packet8i& b)
-{ return _mm256_castps_si256(_mm256_blendv_ps(_mm256_castsi256_ps(b), _mm256_castsi256_ps(a), _mm256_castsi256_ps(mask))); }
-template<> EIGEN_STRONG_INLINE Packet8ui pselect<Packet8ui>(const Packet8ui& mask, const Packet8ui& a, const Packet8ui& b)
-{ return _mm256_castps_si256(_mm256_blendv_ps(_mm256_castsi256_ps(b), _mm256_castsi256_ps(a), _mm256_castsi256_ps(mask))); }
+template <>
+EIGEN_STRONG_INLINE Packet8f pselect<Packet8f>(const Packet8f& mask, const Packet8f& a, const Packet8f& b) {
+  return _mm256_blendv_ps(b, a, mask);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8i pselect<Packet8i>(const Packet8i& mask, const Packet8i& a, const Packet8i& b) {
+  return _mm256_castps_si256(
+      _mm256_blendv_ps(_mm256_castsi256_ps(b), _mm256_castsi256_ps(a), _mm256_castsi256_ps(mask)));
+}
+template <>
+EIGEN_STRONG_INLINE Packet8ui pselect<Packet8ui>(const Packet8ui& mask, const Packet8ui& a, const Packet8ui& b) {
+  return _mm256_castps_si256(
+      _mm256_blendv_ps(_mm256_castsi256_ps(b), _mm256_castsi256_ps(a), _mm256_castsi256_ps(mask)));
+}
 
-template<> EIGEN_STRONG_INLINE Packet4d pselect<Packet4d>(const Packet4d& mask, const Packet4d& a, const Packet4d& b)
-{ return _mm256_blendv_pd(b,a,mask); }
+template <>
+EIGEN_STRONG_INLINE Packet4d pselect<Packet4d>(const Packet4d& mask, const Packet4d& a, const Packet4d& b) {
+  return _mm256_blendv_pd(b, a, mask);
+}
 
-template<int N> EIGEN_STRONG_INLINE Packet8i parithmetic_shift_right(Packet8i a) {
+template <int N>
+EIGEN_STRONG_INLINE Packet8i parithmetic_shift_right(Packet8i a) {
 #ifdef EIGEN_VECTORIZE_AVX2
   return _mm256_srai_epi32(a, N);
 #else
@@ -1168,7 +1438,8 @@
 #endif
 }
 
-template<int N> EIGEN_STRONG_INLINE Packet8i plogical_shift_right(Packet8i a) {
+template <int N>
+EIGEN_STRONG_INLINE Packet8i plogical_shift_right(Packet8i a) {
 #ifdef EIGEN_VECTORIZE_AVX2
   return _mm256_srli_epi32(a, N);
 #else
@@ -1178,7 +1449,8 @@
 #endif
 }
 
-template<int N> EIGEN_STRONG_INLINE Packet8i plogical_shift_left(Packet8i a) {
+template <int N>
+EIGEN_STRONG_INLINE Packet8i plogical_shift_left(Packet8i a) {
 #ifdef EIGEN_VECTORIZE_AVX2
   return _mm256_slli_epi32(a, N);
 #else
@@ -1188,33 +1460,62 @@
 #endif
 }
 
-template<int N> EIGEN_STRONG_INLINE Packet8ui parithmetic_shift_right(Packet8ui a) {
+template <int N>
+EIGEN_STRONG_INLINE Packet8ui parithmetic_shift_right(Packet8ui a) {
   return (Packet8ui)plogical_shift_right<N>((Packet8i)a);
 }
-template<int N> EIGEN_STRONG_INLINE Packet8ui plogical_shift_right(Packet8ui a) {
+template <int N>
+EIGEN_STRONG_INLINE Packet8ui plogical_shift_right(Packet8ui a) {
   return (Packet8ui)plogical_shift_right<N>((Packet8i)a);
 }
-template<int N> EIGEN_STRONG_INLINE Packet8ui plogical_shift_left(Packet8ui a) {
+template <int N>
+EIGEN_STRONG_INLINE Packet8ui plogical_shift_left(Packet8ui a) {
   return (Packet8ui)plogical_shift_left<N>((Packet8i)a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8f pload<Packet8f>(const float*   from) { EIGEN_DEBUG_ALIGNED_LOAD return _mm256_load_ps(from); }
-template<> EIGEN_STRONG_INLINE Packet4d pload<Packet4d>(const double*  from) { EIGEN_DEBUG_ALIGNED_LOAD return _mm256_load_pd(from); }
-template<> EIGEN_STRONG_INLINE Packet8i pload<Packet8i>(const int*     from) { EIGEN_DEBUG_ALIGNED_LOAD return _mm256_load_si256(reinterpret_cast<const __m256i*>(from)); }
-template<> EIGEN_STRONG_INLINE Packet8ui pload<Packet8ui>(const uint32_t* from) { EIGEN_DEBUG_ALIGNED_LOAD return _mm256_load_si256(reinterpret_cast<const __m256i*>(from)); }
+template <>
+EIGEN_STRONG_INLINE Packet8f pload<Packet8f>(const float* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return _mm256_load_ps(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4d pload<Packet4d>(const double* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return _mm256_load_pd(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8i pload<Packet8i>(const int* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return _mm256_load_si256(reinterpret_cast<const __m256i*>(from));
+}
+template <>
+EIGEN_STRONG_INLINE Packet8ui pload<Packet8ui>(const uint32_t* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return _mm256_load_si256(reinterpret_cast<const __m256i*>(from));
+}
 
-template<> EIGEN_STRONG_INLINE Packet8f ploadu<Packet8f>(const float* from) { EIGEN_DEBUG_UNALIGNED_LOAD return _mm256_loadu_ps(from); }
-template<> EIGEN_STRONG_INLINE Packet4d ploadu<Packet4d>(const double* from) { EIGEN_DEBUG_UNALIGNED_LOAD return _mm256_loadu_pd(from); }
-template<> EIGEN_STRONG_INLINE Packet8i ploadu<Packet8i>(const int* from) { EIGEN_DEBUG_UNALIGNED_LOAD return _mm256_loadu_si256(reinterpret_cast<const __m256i*>(from)); }
-template<> EIGEN_STRONG_INLINE Packet8ui ploadu<Packet8ui>(const uint32_t* from) { EIGEN_DEBUG_UNALIGNED_LOAD return _mm256_loadu_si256(reinterpret_cast<const __m256i*>(from)); }
+template <>
+EIGEN_STRONG_INLINE Packet8f ploadu<Packet8f>(const float* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return _mm256_loadu_ps(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4d ploadu<Packet4d>(const double* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return _mm256_loadu_pd(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8i ploadu<Packet8i>(const int* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return _mm256_loadu_si256(reinterpret_cast<const __m256i*>(from));
+}
+template <>
+EIGEN_STRONG_INLINE Packet8ui ploadu<Packet8ui>(const uint32_t* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return _mm256_loadu_si256(reinterpret_cast<const __m256i*>(from));
+}
 
-template<> EIGEN_STRONG_INLINE Packet8f ploadu<Packet8f>(const float* from, uint8_t umask) {
+template <>
+EIGEN_STRONG_INLINE Packet8f ploadu<Packet8f>(const float* from, uint8_t umask) {
 #ifdef EIGEN_VECTORIZE_AVX512
   __mmask16 mask = static_cast<__mmask16>(umask & 0x00FF);
-  EIGEN_DEBUG_UNALIGNED_LOAD return  _mm512_castps512_ps256(_mm512_maskz_loadu_ps(mask, from));
+  EIGEN_DEBUG_UNALIGNED_LOAD return _mm512_castps512_ps256(_mm512_maskz_loadu_ps(mask, from));
 #else
   Packet8i mask = _mm256_set1_epi8(static_cast<char>(umask));
-  const Packet8i bit_mask = _mm256_set_epi32(0xffffff7f, 0xffffffbf, 0xffffffdf, 0xffffffef, 0xfffffff7, 0xfffffffb, 0xfffffffd, 0xfffffffe);
+  const Packet8i bit_mask =
+      _mm256_set_epi32(0xffffff7f, 0xffffffbf, 0xffffffdf, 0xffffffef, 0xfffffff7, 0xfffffffb, 0xfffffffd, 0xfffffffe);
   mask = por<Packet8i>(mask, bit_mask);
   mask = pcmp_eq<Packet8i>(mask, _mm256_set1_epi32(0xffffffff));
   EIGEN_DEBUG_UNALIGNED_LOAD return _mm256_maskload_ps(from, mask);
@@ -1222,41 +1523,44 @@
 }
 
 // Loads 4 floats from memory a returns the packet {a0, a0  a1, a1, a2, a2, a3, a3}
-template<> EIGEN_STRONG_INLINE Packet8f ploaddup<Packet8f>(const float* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8f ploaddup<Packet8f>(const float* from) {
   // TODO try to find a way to avoid the need of a temporary register
   //   Packet8f tmp  = _mm256_castps128_ps256(_mm_loadu_ps(from));
-//   tmp = _mm256_insertf128_ps(tmp, _mm_movehl_ps(_mm256_castps256_ps128(tmp),_mm256_castps256_ps128(tmp)), 1);
-//   return _mm256_unpacklo_ps(tmp,tmp);
+  //   tmp = _mm256_insertf128_ps(tmp, _mm_movehl_ps(_mm256_castps256_ps128(tmp),_mm256_castps256_ps128(tmp)), 1);
+  //   return _mm256_unpacklo_ps(tmp,tmp);
 
   // _mm256_insertf128_ps is very slow on Haswell, thus:
   Packet8f tmp = _mm256_broadcast_ps((const __m128*)(const void*)from);
   // mimic an "inplace" permutation of the lower 128bits using a blend
-  tmp = _mm256_blend_ps(tmp,_mm256_castps128_ps256(_mm_permute_ps( _mm256_castps256_ps128(tmp), _MM_SHUFFLE(1,0,1,0))), 15);
+  tmp = _mm256_blend_ps(
+      tmp, _mm256_castps128_ps256(_mm_permute_ps(_mm256_castps256_ps128(tmp), _MM_SHUFFLE(1, 0, 1, 0))), 15);
   // then we can perform a consistent permutation on the global register to get everything in shape:
-  return  _mm256_permute_ps(tmp, _MM_SHUFFLE(3,3,2,2));
+  return _mm256_permute_ps(tmp, _MM_SHUFFLE(3, 3, 2, 2));
 }
 // Loads 2 doubles from memory a returns the packet {a0, a0, a1, a1}
-template<> EIGEN_STRONG_INLINE Packet4d ploaddup<Packet4d>(const double* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4d ploaddup<Packet4d>(const double* from) {
   Packet4d tmp = _mm256_broadcast_pd((const __m128d*)(const void*)from);
-  return  _mm256_permute_pd(tmp, 3<<2);
+  return _mm256_permute_pd(tmp, 3 << 2);
 }
 // Loads 4 integers from memory a returns the packet {a0, a0, a1, a1, a2, a2, a3, a3}
-template<> EIGEN_STRONG_INLINE Packet8i ploaddup<Packet8i>(const int* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8i ploaddup<Packet8i>(const int* from) {
 #ifdef EIGEN_VECTORIZE_AVX2
   const Packet8i a = _mm256_castsi128_si256(ploadu<Packet4i>(from));
   return _mm256_permutevar8x32_epi32(a, _mm256_setr_epi32(0, 0, 1, 1, 2, 2, 3, 3));
 #else
   __m256 tmp = _mm256_broadcast_ps((const __m128*)(const void*)from);
   // mimic an "inplace" permutation of the lower 128bits using a blend
-  tmp = _mm256_blend_ps(tmp,_mm256_castps128_ps256(_mm_permute_ps( _mm256_castps256_ps128(tmp), _MM_SHUFFLE(1,0,1,0))), 15);
+  tmp = _mm256_blend_ps(
+      tmp, _mm256_castps128_ps256(_mm_permute_ps(_mm256_castps256_ps128(tmp), _MM_SHUFFLE(1, 0, 1, 0))), 15);
   // then we can perform a consistent permutation on the global register to get everything in shape:
-  return  _mm256_castps_si256(_mm256_permute_ps(tmp, _MM_SHUFFLE(3,3,2,2)));
+  return _mm256_castps_si256(_mm256_permute_ps(tmp, _MM_SHUFFLE(3, 3, 2, 2)));
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet8ui ploaddup<Packet8ui>(const uint32_t* from) {
+template <>
+EIGEN_STRONG_INLINE Packet8ui ploaddup<Packet8ui>(const uint32_t* from) {
 #ifdef EIGEN_VECTORIZE_AVX2
   const Packet8ui a = _mm256_castsi128_si256(ploadu<Packet4ui>(from));
   return _mm256_permutevar8x32_epi32(a, _mm256_setr_epi32(0, 0, 1, 1, 2, 2, 3, 3));
@@ -1272,43 +1576,72 @@
 }
 
 // Loads 2 floats from memory a returns the packet {a0, a0  a0, a0, a1, a1, a1, a1}
-template<> EIGEN_STRONG_INLINE Packet8f ploadquad<Packet8f>(const float* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8f ploadquad<Packet8f>(const float* from) {
   Packet8f tmp = _mm256_castps128_ps256(_mm_broadcast_ss(from));
-  return _mm256_insertf128_ps(tmp, _mm_broadcast_ss(from+1), 1);
+  return _mm256_insertf128_ps(tmp, _mm_broadcast_ss(from + 1), 1);
 }
-template<> EIGEN_STRONG_INLINE Packet8i ploadquad<Packet8i>(const int* from)
-{
-  return _mm256_insertf128_si256(_mm256_set1_epi32(*from), _mm_set1_epi32(*(from+1)), 1);
+template <>
+EIGEN_STRONG_INLINE Packet8i ploadquad<Packet8i>(const int* from) {
+  return _mm256_insertf128_si256(_mm256_set1_epi32(*from), _mm_set1_epi32(*(from + 1)), 1);
 }
-template<> EIGEN_STRONG_INLINE Packet8ui ploadquad<Packet8ui>(const uint32_t* from) {
+template <>
+EIGEN_STRONG_INLINE Packet8ui ploadquad<Packet8ui>(const uint32_t* from) {
   return _mm256_insertf128_si256(_mm256_set1_epi32(*from), _mm_set1_epi32(*(from + 1)), 1);
 }
 
-template<> EIGEN_STRONG_INLINE void pstore<float>(float*   to, const Packet8f& from) { EIGEN_DEBUG_ALIGNED_STORE _mm256_store_ps(to, from); }
-template<> EIGEN_STRONG_INLINE void pstore<double>(double* to, const Packet4d& from) { EIGEN_DEBUG_ALIGNED_STORE _mm256_store_pd(to, from); }
-template<> EIGEN_STRONG_INLINE void pstore<int>(int*       to, const Packet8i& from) { EIGEN_DEBUG_ALIGNED_STORE _mm256_store_si256(reinterpret_cast<__m256i*>(to), from); }
-template<> EIGEN_STRONG_INLINE void pstore<uint32_t>(uint32_t* to, const Packet8ui& from) { EIGEN_DEBUG_ALIGNED_STORE _mm256_store_si256(reinterpret_cast<__m256i*>(to), from); }
+template <>
+EIGEN_STRONG_INLINE void pstore<float>(float* to, const Packet8f& from) {
+  EIGEN_DEBUG_ALIGNED_STORE _mm256_store_ps(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstore<double>(double* to, const Packet4d& from) {
+  EIGEN_DEBUG_ALIGNED_STORE _mm256_store_pd(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstore<int>(int* to, const Packet8i& from) {
+  EIGEN_DEBUG_ALIGNED_STORE _mm256_store_si256(reinterpret_cast<__m256i*>(to), from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstore<uint32_t>(uint32_t* to, const Packet8ui& from) {
+  EIGEN_DEBUG_ALIGNED_STORE _mm256_store_si256(reinterpret_cast<__m256i*>(to), from);
+}
 
-template<> EIGEN_STRONG_INLINE void pstoreu<float>(float*   to, const Packet8f& from) { EIGEN_DEBUG_UNALIGNED_STORE _mm256_storeu_ps(to, from); }
-template<> EIGEN_STRONG_INLINE void pstoreu<double>(double* to, const Packet4d& from) { EIGEN_DEBUG_UNALIGNED_STORE _mm256_storeu_pd(to, from); }
-template<> EIGEN_STRONG_INLINE void pstoreu<int>(int*       to, const Packet8i& from) { EIGEN_DEBUG_UNALIGNED_STORE _mm256_storeu_si256(reinterpret_cast<__m256i*>(to), from); }
-template<> EIGEN_STRONG_INLINE void pstoreu<uint32_t>(uint32_t* to, const Packet8ui& from) { EIGEN_DEBUG_UNALIGNED_STORE _mm256_storeu_si256(reinterpret_cast<__m256i*>(to), from); }
+template <>
+EIGEN_STRONG_INLINE void pstoreu<float>(float* to, const Packet8f& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE _mm256_storeu_ps(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<double>(double* to, const Packet4d& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE _mm256_storeu_pd(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<int>(int* to, const Packet8i& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE _mm256_storeu_si256(reinterpret_cast<__m256i*>(to), from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<uint32_t>(uint32_t* to, const Packet8ui& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE _mm256_storeu_si256(reinterpret_cast<__m256i*>(to), from);
+}
 
-template<> EIGEN_STRONG_INLINE void pstoreu<float>(float*   to, const Packet8f& from, uint8_t umask) {
+template <>
+EIGEN_STRONG_INLINE void pstoreu<float>(float* to, const Packet8f& from, uint8_t umask) {
 #ifdef EIGEN_VECTORIZE_AVX512
   __mmask16 mask = static_cast<__mmask16>(umask & 0x00FF);
   EIGEN_DEBUG_UNALIGNED_STORE _mm512_mask_storeu_ps(to, mask, _mm512_castps256_ps512(from));
 #else
   Packet8i mask = _mm256_set1_epi8(static_cast<char>(umask));
-  const Packet8i bit_mask = _mm256_set_epi32(0x7f7f7f7f, 0xbfbfbfbf, 0xdfdfdfdf, 0xefefefef, 0xf7f7f7f7, 0xfbfbfbfb, 0xfdfdfdfd, 0xfefefefe);
+  const Packet8i bit_mask =
+      _mm256_set_epi32(0x7f7f7f7f, 0xbfbfbfbf, 0xdfdfdfdf, 0xefefefef, 0xf7f7f7f7, 0xfbfbfbfb, 0xfdfdfdfd, 0xfefefefe);
   mask = por<Packet8i>(mask, bit_mask);
   mask = pcmp_eq<Packet8i>(mask, _mm256_set1_epi32(0xffffffff));
 #if EIGEN_COMP_MSVC
   // MSVC sometimes seems to use a bogus mask with maskstore.
   const __m256i ifrom = _mm256_castps_si256(from);
-  EIGEN_DEBUG_UNALIGNED_STORE _mm_maskmoveu_si128(_mm256_extractf128_si256(ifrom, 0), _mm256_extractf128_si256(mask, 0), reinterpret_cast<char*>(to));
-  EIGEN_DEBUG_UNALIGNED_STORE _mm_maskmoveu_si128(_mm256_extractf128_si256(ifrom, 1), _mm256_extractf128_si256(mask, 1), reinterpret_cast<char*>(to + 4));
+  EIGEN_DEBUG_UNALIGNED_STORE _mm_maskmoveu_si128(_mm256_extractf128_si256(ifrom, 0), _mm256_extractf128_si256(mask, 0),
+                                                  reinterpret_cast<char*>(to));
+  EIGEN_DEBUG_UNALIGNED_STORE _mm_maskmoveu_si128(_mm256_extractf128_si256(ifrom, 1), _mm256_extractf128_si256(mask, 1),
+                                                  reinterpret_cast<char*>(to + 4));
 #else
   EIGEN_DEBUG_UNALIGNED_STORE _mm256_maskstore_ps(to, mask, from);
 #endif
@@ -1316,111 +1649,129 @@
 }
 
 // NOTE: leverage _mm256_i32gather_ps and _mm256_i32gather_pd if AVX2 instructions are available
-// NOTE: for the record the following seems to be slower: return _mm256_i32gather_ps(from, _mm256_set1_epi32(stride), 4);
-template<> EIGEN_DEVICE_FUNC inline Packet8f pgather<float, Packet8f>(const float* from, Index stride)
-{
-  return _mm256_set_ps(from[7*stride], from[6*stride], from[5*stride], from[4*stride],
-                       from[3*stride], from[2*stride], from[1*stride], from[0*stride]);
+// NOTE: for the record the following seems to be slower: return _mm256_i32gather_ps(from, _mm256_set1_epi32(stride),
+// 4);
+template <>
+EIGEN_DEVICE_FUNC inline Packet8f pgather<float, Packet8f>(const float* from, Index stride) {
+  return _mm256_set_ps(from[7 * stride], from[6 * stride], from[5 * stride], from[4 * stride], from[3 * stride],
+                       from[2 * stride], from[1 * stride], from[0 * stride]);
 }
-template<> EIGEN_DEVICE_FUNC inline Packet4d pgather<double, Packet4d>(const double* from, Index stride)
-{
-  return _mm256_set_pd(from[3*stride], from[2*stride], from[1*stride], from[0*stride]);
+template <>
+EIGEN_DEVICE_FUNC inline Packet4d pgather<double, Packet4d>(const double* from, Index stride) {
+  return _mm256_set_pd(from[3 * stride], from[2 * stride], from[1 * stride], from[0 * stride]);
 }
-template<> EIGEN_DEVICE_FUNC inline Packet8i pgather<int, Packet8i>(const int* from, Index stride)
-{
-  return _mm256_set_epi32(from[7*stride], from[6*stride], from[5*stride], from[4*stride],
-                          from[3*stride], from[2*stride], from[1*stride], from[0*stride]);
+template <>
+EIGEN_DEVICE_FUNC inline Packet8i pgather<int, Packet8i>(const int* from, Index stride) {
+  return _mm256_set_epi32(from[7 * stride], from[6 * stride], from[5 * stride], from[4 * stride], from[3 * stride],
+                          from[2 * stride], from[1 * stride], from[0 * stride]);
 }
-template<> EIGEN_DEVICE_FUNC inline Packet8ui pgather<uint32_t, Packet8ui>(const uint32_t* from, Index stride) {
+template <>
+EIGEN_DEVICE_FUNC inline Packet8ui pgather<uint32_t, Packet8ui>(const uint32_t* from, Index stride) {
   return (Packet8ui)pgather<int, Packet8i>((int*)from, stride);
 }
 
-template<> EIGEN_DEVICE_FUNC inline void pscatter<float, Packet8f>(float* to, const Packet8f& from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC inline void pscatter<float, Packet8f>(float* to, const Packet8f& from, Index stride) {
   __m128 low = _mm256_extractf128_ps(from, 0);
-  to[stride*0] = _mm_cvtss_f32(low);
-  to[stride*1] = _mm_cvtss_f32(_mm_shuffle_ps(low, low, 1));
-  to[stride*2] = _mm_cvtss_f32(_mm_shuffle_ps(low, low, 2));
-  to[stride*3] = _mm_cvtss_f32(_mm_shuffle_ps(low, low, 3));
+  to[stride * 0] = _mm_cvtss_f32(low);
+  to[stride * 1] = _mm_cvtss_f32(_mm_shuffle_ps(low, low, 1));
+  to[stride * 2] = _mm_cvtss_f32(_mm_shuffle_ps(low, low, 2));
+  to[stride * 3] = _mm_cvtss_f32(_mm_shuffle_ps(low, low, 3));
 
   __m128 high = _mm256_extractf128_ps(from, 1);
-  to[stride*4] = _mm_cvtss_f32(high);
-  to[stride*5] = _mm_cvtss_f32(_mm_shuffle_ps(high, high, 1));
-  to[stride*6] = _mm_cvtss_f32(_mm_shuffle_ps(high, high, 2));
-  to[stride*7] = _mm_cvtss_f32(_mm_shuffle_ps(high, high, 3));
+  to[stride * 4] = _mm_cvtss_f32(high);
+  to[stride * 5] = _mm_cvtss_f32(_mm_shuffle_ps(high, high, 1));
+  to[stride * 6] = _mm_cvtss_f32(_mm_shuffle_ps(high, high, 2));
+  to[stride * 7] = _mm_cvtss_f32(_mm_shuffle_ps(high, high, 3));
 }
-template<> EIGEN_DEVICE_FUNC inline void pscatter<double, Packet4d>(double* to, const Packet4d& from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC inline void pscatter<double, Packet4d>(double* to, const Packet4d& from, Index stride) {
   __m128d low = _mm256_extractf128_pd(from, 0);
-  to[stride*0] = _mm_cvtsd_f64(low);
-  to[stride*1] = _mm_cvtsd_f64(_mm_shuffle_pd(low, low, 1));
+  to[stride * 0] = _mm_cvtsd_f64(low);
+  to[stride * 1] = _mm_cvtsd_f64(_mm_shuffle_pd(low, low, 1));
   __m128d high = _mm256_extractf128_pd(from, 1);
-  to[stride*2] = _mm_cvtsd_f64(high);
-  to[stride*3] = _mm_cvtsd_f64(_mm_shuffle_pd(high, high, 1));
+  to[stride * 2] = _mm_cvtsd_f64(high);
+  to[stride * 3] = _mm_cvtsd_f64(_mm_shuffle_pd(high, high, 1));
 }
-template<> EIGEN_DEVICE_FUNC inline void pscatter<int, Packet8i>(int* to, const Packet8i& from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC inline void pscatter<int, Packet8i>(int* to, const Packet8i& from, Index stride) {
   __m128i low = _mm256_extractf128_si256(from, 0);
-  to[stride*0] = _mm_extract_epi32(low, 0);
-  to[stride*1] = _mm_extract_epi32(low, 1);
-  to[stride*2] = _mm_extract_epi32(low, 2);
-  to[stride*3] = _mm_extract_epi32(low, 3);
+  to[stride * 0] = _mm_extract_epi32(low, 0);
+  to[stride * 1] = _mm_extract_epi32(low, 1);
+  to[stride * 2] = _mm_extract_epi32(low, 2);
+  to[stride * 3] = _mm_extract_epi32(low, 3);
 
   __m128i high = _mm256_extractf128_si256(from, 1);
-  to[stride*4] = _mm_extract_epi32(high, 0);
-  to[stride*5] = _mm_extract_epi32(high, 1);
-  to[stride*6] = _mm_extract_epi32(high, 2);
-  to[stride*7] = _mm_extract_epi32(high, 3);
+  to[stride * 4] = _mm_extract_epi32(high, 0);
+  to[stride * 5] = _mm_extract_epi32(high, 1);
+  to[stride * 6] = _mm_extract_epi32(high, 2);
+  to[stride * 7] = _mm_extract_epi32(high, 3);
 }
-template<> EIGEN_DEVICE_FUNC inline void pscatter<uint32_t, Packet8ui>(uint32_t* to, const Packet8ui& from, Index stride) {
+template <>
+EIGEN_DEVICE_FUNC inline void pscatter<uint32_t, Packet8ui>(uint32_t* to, const Packet8ui& from, Index stride) {
   pscatter<int, Packet8i>((int*)to, (Packet8i)from, stride);
 }
 
-template<> EIGEN_STRONG_INLINE void pstore1<Packet8f>(float* to, const float& a)
-{
+template <>
+EIGEN_STRONG_INLINE void pstore1<Packet8f>(float* to, const float& a) {
   Packet8f pa = pset1<Packet8f>(a);
   pstore(to, pa);
 }
-template<> EIGEN_STRONG_INLINE void pstore1<Packet4d>(double* to, const double& a)
-{
+template <>
+EIGEN_STRONG_INLINE void pstore1<Packet4d>(double* to, const double& a) {
   Packet4d pa = pset1<Packet4d>(a);
   pstore(to, pa);
 }
-template<> EIGEN_STRONG_INLINE void pstore1<Packet8i>(int* to, const int& a)
-{
+template <>
+EIGEN_STRONG_INLINE void pstore1<Packet8i>(int* to, const int& a) {
   Packet8i pa = pset1<Packet8i>(a);
   pstore(to, pa);
 }
 
 #ifndef EIGEN_VECTORIZE_AVX512
-template<> EIGEN_STRONG_INLINE void prefetch<float>(const float*   addr) { _mm_prefetch((SsePrefetchPtrType)(addr), _MM_HINT_T0); }
-template<> EIGEN_STRONG_INLINE void prefetch<double>(const double* addr) { _mm_prefetch((SsePrefetchPtrType)(addr), _MM_HINT_T0); }
-template<> EIGEN_STRONG_INLINE void prefetch<int>(const int*       addr) { _mm_prefetch((SsePrefetchPtrType)(addr), _MM_HINT_T0); }
-template<> EIGEN_STRONG_INLINE void prefetch<uint32_t>(const uint32_t*       addr) { _mm_prefetch((SsePrefetchPtrType)(addr), _MM_HINT_T0); }
+template <>
+EIGEN_STRONG_INLINE void prefetch<float>(const float* addr) {
+  _mm_prefetch((SsePrefetchPtrType)(addr), _MM_HINT_T0);
+}
+template <>
+EIGEN_STRONG_INLINE void prefetch<double>(const double* addr) {
+  _mm_prefetch((SsePrefetchPtrType)(addr), _MM_HINT_T0);
+}
+template <>
+EIGEN_STRONG_INLINE void prefetch<int>(const int* addr) {
+  _mm_prefetch((SsePrefetchPtrType)(addr), _MM_HINT_T0);
+}
+template <>
+EIGEN_STRONG_INLINE void prefetch<uint32_t>(const uint32_t* addr) {
+  _mm_prefetch((SsePrefetchPtrType)(addr), _MM_HINT_T0);
+}
 #endif
 
-template<> EIGEN_STRONG_INLINE float  pfirst<Packet8f>(const Packet8f& a) {
+template <>
+EIGEN_STRONG_INLINE float pfirst<Packet8f>(const Packet8f& a) {
   return _mm_cvtss_f32(_mm256_castps256_ps128(a));
 }
-template<> EIGEN_STRONG_INLINE double pfirst<Packet4d>(const Packet4d& a) {
+template <>
+EIGEN_STRONG_INLINE double pfirst<Packet4d>(const Packet4d& a) {
   return _mm_cvtsd_f64(_mm256_castpd256_pd128(a));
 }
-template<> EIGEN_STRONG_INLINE int    pfirst<Packet8i>(const Packet8i& a) {
+template <>
+EIGEN_STRONG_INLINE int pfirst<Packet8i>(const Packet8i& a) {
   return _mm_cvtsi128_si32(_mm256_castsi256_si128(a));
 }
-template<> EIGEN_STRONG_INLINE uint32_t pfirst<Packet8ui>(const Packet8ui& a) {
+template <>
+EIGEN_STRONG_INLINE uint32_t pfirst<Packet8ui>(const Packet8ui& a) {
   return numext::bit_cast<uint32_t>(_mm_cvtsi128_si32(_mm256_castsi256_si128(a)));
 }
 
-
-template<> EIGEN_STRONG_INLINE Packet8f preverse(const Packet8f& a)
-{
-  __m256 tmp = _mm256_shuffle_ps(a,a,0x1b);
+template <>
+EIGEN_STRONG_INLINE Packet8f preverse(const Packet8f& a) {
+  __m256 tmp = _mm256_shuffle_ps(a, a, 0x1b);
   return _mm256_permute2f128_ps(tmp, tmp, 1);
 }
-template<> EIGEN_STRONG_INLINE Packet4d preverse(const Packet4d& a)
-{
-   __m256d tmp = _mm256_shuffle_pd(a,a,5);
+template <>
+EIGEN_STRONG_INLINE Packet4d preverse(const Packet4d& a) {
+  __m256d tmp = _mm256_shuffle_pd(a, a, 5);
   return _mm256_permute2f128_pd(tmp, tmp, 1);
 #if 0
   // This version is unlikely to be faster as _mm256_shuffle_ps and _mm256_permute_pd
@@ -1429,37 +1780,41 @@
     return _mm256_permute_pd(swap_halves,5);
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet8i preverse(const Packet8i& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8i preverse(const Packet8i& a) {
   return _mm256_castps_si256(preverse(_mm256_castsi256_ps(a)));
 }
-template<> EIGEN_STRONG_INLINE Packet8ui preverse(const Packet8ui& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8ui preverse(const Packet8ui& a) {
   return _mm256_castps_si256(preverse(_mm256_castsi256_ps(a)));
 }
 
 #ifdef EIGEN_VECTORIZE_AVX2
-template<> EIGEN_STRONG_INLINE Packet4l preverse(const Packet4l& a)
-    {
+template <>
+EIGEN_STRONG_INLINE Packet4l preverse(const Packet4l& a) {
   return _mm256_castpd_si256(preverse(_mm256_castsi256_pd(a)));
 }
-template<> EIGEN_STRONG_INLINE Packet4ul preverse(const Packet4ul& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4ul preverse(const Packet4ul& a) {
   return _mm256_castpd_si256(preverse(_mm256_castsi256_pd(a)));
 }
 #endif
 
 // pabs should be ok
-template<> EIGEN_STRONG_INLINE Packet8f pabs(const Packet8f& a)
-{
-  const Packet8f mask = _mm256_castsi256_ps(_mm256_setr_epi32(0x7FFFFFFF,0x7FFFFFFF,0x7FFFFFFF,0x7FFFFFFF,0x7FFFFFFF,0x7FFFFFFF,0x7FFFFFFF,0x7FFFFFFF));
-  return _mm256_and_ps(a,mask);
+template <>
+EIGEN_STRONG_INLINE Packet8f pabs(const Packet8f& a) {
+  const Packet8f mask = _mm256_castsi256_ps(_mm256_setr_epi32(0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF,
+                                                              0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF));
+  return _mm256_and_ps(a, mask);
 }
-template<> EIGEN_STRONG_INLINE Packet4d pabs(const Packet4d& a)
-{
-  const Packet4d mask = _mm256_castsi256_pd(_mm256_setr_epi32(0xFFFFFFFF,0x7FFFFFFF,0xFFFFFFFF,0x7FFFFFFF,0xFFFFFFFF,0x7FFFFFFF,0xFFFFFFFF,0x7FFFFFFF));
-  return _mm256_and_pd(a,mask);
+template <>
+EIGEN_STRONG_INLINE Packet4d pabs(const Packet4d& a) {
+  const Packet4d mask = _mm256_castsi256_pd(_mm256_setr_epi32(0xFFFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF,
+                                                              0xFFFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF));
+  return _mm256_and_pd(a, mask);
 }
-template<> EIGEN_STRONG_INLINE Packet8i pabs(const Packet8i& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8i pabs(const Packet8i& a) {
 #ifdef EIGEN_VECTORIZE_AVX2
   return _mm256_abs_epi32(a);
 #else
@@ -1468,26 +1823,47 @@
   return _mm256_insertf128_si256(_mm256_castsi128_si256(lo), (hi), 1);
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet8ui pabs(const Packet8ui& a) { return a; }
+template <>
+EIGEN_STRONG_INLINE Packet8ui pabs(const Packet8ui& a) {
+  return a;
+}
 
-template<> EIGEN_STRONG_INLINE Packet8h  psignbit(const Packet8h&  a) { return _mm_srai_epi16(a, 15); }
-template<> EIGEN_STRONG_INLINE Packet8bf psignbit(const Packet8bf& a) { return _mm_srai_epi16(a, 15); }
-template<> EIGEN_STRONG_INLINE Packet8f  psignbit(const Packet8f&  a) { return _mm256_castsi256_ps(parithmetic_shift_right<31>((Packet8i)_mm256_castps_si256(a))); }
-template<> EIGEN_STRONG_INLINE Packet8ui  psignbit(const Packet8ui& a)  { return pzero(a); }
+template <>
+EIGEN_STRONG_INLINE Packet8h psignbit(const Packet8h& a) {
+  return _mm_srai_epi16(a, 15);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8bf psignbit(const Packet8bf& a) {
+  return _mm_srai_epi16(a, 15);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8f psignbit(const Packet8f& a) {
+  return _mm256_castsi256_ps(parithmetic_shift_right<31>((Packet8i)_mm256_castps_si256(a)));
+}
+template <>
+EIGEN_STRONG_INLINE Packet8ui psignbit(const Packet8ui& a) {
+  return pzero(a);
+}
 #ifdef EIGEN_VECTORIZE_AVX2
-template<> EIGEN_STRONG_INLINE Packet4d  psignbit(const Packet4d& a)  { return _mm256_castsi256_pd(parithmetic_shift_right<63>((Packet4l)_mm256_castpd_si256(a))); }
-template<> EIGEN_STRONG_INLINE Packet4ul  psignbit(const Packet4ul& a)  { return pzero(a); }
+template <>
+EIGEN_STRONG_INLINE Packet4d psignbit(const Packet4d& a) {
+  return _mm256_castsi256_pd(parithmetic_shift_right<63>((Packet4l)_mm256_castpd_si256(a)));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ul psignbit(const Packet4ul& a) {
+  return pzero(a);
+}
 #endif
 
-template<> EIGEN_STRONG_INLINE Packet8f pfrexp<Packet8f>(const Packet8f& a, Packet8f& exponent) {
-  return pfrexp_generic(a,exponent);
+template <>
+EIGEN_STRONG_INLINE Packet8f pfrexp<Packet8f>(const Packet8f& a, Packet8f& exponent) {
+  return pfrexp_generic(a, exponent);
 }
 
 // Extract exponent without existence of Packet4l.
-template<>
-EIGEN_STRONG_INLINE  
-Packet4d pfrexp_generic_get_biased_exponent(const Packet4d& a) {
-  const Packet4d cst_exp_mask  = pset1frombits<Packet4d>(static_cast<uint64_t>(0x7ff0000000000000ull));
+template <>
+EIGEN_STRONG_INLINE Packet4d pfrexp_generic_get_biased_exponent(const Packet4d& a) {
+  const Packet4d cst_exp_mask = pset1frombits<Packet4d>(static_cast<uint64_t>(0x7ff0000000000000ull));
   __m256i a_expo = _mm256_castpd_si256(pand(a, cst_exp_mask));
 #ifdef EIGEN_VECTORIZE_AVX2
   a_expo = _mm256_srli_epi64(a_expo, 52);
@@ -1506,16 +1882,18 @@
   return exponent;
 }
 
-
-template<> EIGEN_STRONG_INLINE Packet4d pfrexp<Packet4d>(const Packet4d& a, Packet4d& exponent) {
+template <>
+EIGEN_STRONG_INLINE Packet4d pfrexp<Packet4d>(const Packet4d& a, Packet4d& exponent) {
   return pfrexp_generic(a, exponent);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8f pldexp<Packet8f>(const Packet8f& a, const Packet8f& exponent) {
+template <>
+EIGEN_STRONG_INLINE Packet8f pldexp<Packet8f>(const Packet8f& a, const Packet8f& exponent) {
   return pldexp_generic(a, exponent);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4d pldexp<Packet4d>(const Packet4d& a, const Packet4d& exponent) {
+template <>
+EIGEN_STRONG_INLINE Packet4d pldexp<Packet4d>(const Packet4d& a, const Packet4d& exponent) {
   // Clamp exponent to [-2099, 2099]
   const Packet4d max_exponent = pset1<Packet4d>(2099.0);
   const Packet4i e = _mm256_cvtpd_epi32(pmin(pmax(exponent, pnegate(max_exponent)), max_exponent));
@@ -1537,74 +1915,76 @@
   lo = _mm_slli_epi64(hi, 52);
   hi = _mm_slli_epi64(_mm_srli_epi64(hi, 32), 52);
   c = _mm256_castsi256_pd(_mm256_insertf128_si256(_mm256_castsi128_si256(lo), hi, 1));
-  out = pmul(out, c); // a * 2^e
+  out = pmul(out, c);  // a * 2^e
   return out;
 }
 
-template<> EIGEN_STRONG_INLINE float predux<Packet8f>(const Packet8f& a)
-{
-  return predux(Packet4f(_mm_add_ps(_mm256_castps256_ps128(a),_mm256_extractf128_ps(a,1))));
+template <>
+EIGEN_STRONG_INLINE float predux<Packet8f>(const Packet8f& a) {
+  return predux(Packet4f(_mm_add_ps(_mm256_castps256_ps128(a), _mm256_extractf128_ps(a, 1))));
 }
-template<> EIGEN_STRONG_INLINE double predux<Packet4d>(const Packet4d& a)
-{
-  return predux(Packet2d(_mm_add_pd(_mm256_castpd256_pd128(a),_mm256_extractf128_pd(a,1))));
+template <>
+EIGEN_STRONG_INLINE double predux<Packet4d>(const Packet4d& a) {
+  return predux(Packet2d(_mm_add_pd(_mm256_castpd256_pd128(a), _mm256_extractf128_pd(a, 1))));
 }
-template<> EIGEN_STRONG_INLINE int predux<Packet8i>(const Packet8i& a)
-{
-  return predux(Packet4i(_mm_add_epi32(_mm256_castsi256_si128(a),_mm256_extractf128_si256(a,1))));
+template <>
+EIGEN_STRONG_INLINE int predux<Packet8i>(const Packet8i& a) {
+  return predux(Packet4i(_mm_add_epi32(_mm256_castsi256_si128(a), _mm256_extractf128_si256(a, 1))));
 }
-template<> EIGEN_STRONG_INLINE uint32_t predux<Packet8ui>(const Packet8ui& a) {
+template <>
+EIGEN_STRONG_INLINE uint32_t predux<Packet8ui>(const Packet8ui& a) {
   return predux(Packet4ui(_mm_add_epi32(_mm256_castsi256_si128(a), _mm256_extractf128_si256(a, 1))));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f predux_half_dowto4<Packet8f>(const Packet8f& a)
-{
-  return _mm_add_ps(_mm256_castps256_ps128(a),_mm256_extractf128_ps(a,1));
+template <>
+EIGEN_STRONG_INLINE Packet4f predux_half_dowto4<Packet8f>(const Packet8f& a) {
+  return _mm_add_ps(_mm256_castps256_ps128(a), _mm256_extractf128_ps(a, 1));
 }
-template<> EIGEN_STRONG_INLINE Packet4i predux_half_dowto4<Packet8i>(const Packet8i& a)
-{
-  return _mm_add_epi32(_mm256_castsi256_si128(a),_mm256_extractf128_si256(a,1));
+template <>
+EIGEN_STRONG_INLINE Packet4i predux_half_dowto4<Packet8i>(const Packet8i& a) {
+  return _mm_add_epi32(_mm256_castsi256_si128(a), _mm256_extractf128_si256(a, 1));
 }
-template<> EIGEN_STRONG_INLINE Packet4ui predux_half_dowto4<Packet8ui>(const Packet8ui& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4ui predux_half_dowto4<Packet8ui>(const Packet8ui& a) {
   return _mm_add_epi32(_mm256_castsi256_si128(a), _mm256_extractf128_si256(a, 1));
 }
 
-template<> EIGEN_STRONG_INLINE float predux_mul<Packet8f>(const Packet8f& a)
-{
+template <>
+EIGEN_STRONG_INLINE float predux_mul<Packet8f>(const Packet8f& a) {
   Packet8f tmp;
-  tmp = _mm256_mul_ps(a, _mm256_permute2f128_ps(a,a,1));
-  tmp = _mm256_mul_ps(tmp, _mm256_shuffle_ps(tmp,tmp,_MM_SHUFFLE(1,0,3,2)));
-  return pfirst(_mm256_mul_ps(tmp, _mm256_shuffle_ps(tmp,tmp,1)));
+  tmp = _mm256_mul_ps(a, _mm256_permute2f128_ps(a, a, 1));
+  tmp = _mm256_mul_ps(tmp, _mm256_shuffle_ps(tmp, tmp, _MM_SHUFFLE(1, 0, 3, 2)));
+  return pfirst(_mm256_mul_ps(tmp, _mm256_shuffle_ps(tmp, tmp, 1)));
 }
-template<> EIGEN_STRONG_INLINE double predux_mul<Packet4d>(const Packet4d& a)
-{
+template <>
+EIGEN_STRONG_INLINE double predux_mul<Packet4d>(const Packet4d& a) {
   Packet4d tmp;
-  tmp = _mm256_mul_pd(a, _mm256_permute2f128_pd(a,a,1));
-  return pfirst(_mm256_mul_pd(tmp, _mm256_shuffle_pd(tmp,tmp,1)));
+  tmp = _mm256_mul_pd(a, _mm256_permute2f128_pd(a, a, 1));
+  return pfirst(_mm256_mul_pd(tmp, _mm256_shuffle_pd(tmp, tmp, 1)));
 }
 
-template<> EIGEN_STRONG_INLINE float predux_min<Packet8f>(const Packet8f& a)
-{
-  Packet8f tmp = _mm256_min_ps(a, _mm256_permute2f128_ps(a,a,1));
-  tmp = _mm256_min_ps(tmp, _mm256_shuffle_ps(tmp,tmp,_MM_SHUFFLE(1,0,3,2)));
-  return pfirst(_mm256_min_ps(tmp, _mm256_shuffle_ps(tmp,tmp,1)));
+template <>
+EIGEN_STRONG_INLINE float predux_min<Packet8f>(const Packet8f& a) {
+  Packet8f tmp = _mm256_min_ps(a, _mm256_permute2f128_ps(a, a, 1));
+  tmp = _mm256_min_ps(tmp, _mm256_shuffle_ps(tmp, tmp, _MM_SHUFFLE(1, 0, 3, 2)));
+  return pfirst(_mm256_min_ps(tmp, _mm256_shuffle_ps(tmp, tmp, 1)));
 }
-template<> EIGEN_STRONG_INLINE double predux_min<Packet4d>(const Packet4d& a)
-{
-  Packet4d tmp = _mm256_min_pd(a, _mm256_permute2f128_pd(a,a,1));
+template <>
+EIGEN_STRONG_INLINE double predux_min<Packet4d>(const Packet4d& a) {
+  Packet4d tmp = _mm256_min_pd(a, _mm256_permute2f128_pd(a, a, 1));
   return pfirst(_mm256_min_pd(tmp, _mm256_shuffle_pd(tmp, tmp, 1)));
 }
 
-template<> EIGEN_STRONG_INLINE float predux_max<Packet8f>(const Packet8f& a)
-{
-  Packet8f tmp = _mm256_max_ps(a, _mm256_permute2f128_ps(a,a,1));
-  tmp = _mm256_max_ps(tmp, _mm256_shuffle_ps(tmp,tmp,_MM_SHUFFLE(1,0,3,2)));
-  return pfirst(_mm256_max_ps(tmp, _mm256_shuffle_ps(tmp,tmp,1)));
+template <>
+EIGEN_STRONG_INLINE float predux_max<Packet8f>(const Packet8f& a) {
+  Packet8f tmp = _mm256_max_ps(a, _mm256_permute2f128_ps(a, a, 1));
+  tmp = _mm256_max_ps(tmp, _mm256_shuffle_ps(tmp, tmp, _MM_SHUFFLE(1, 0, 3, 2)));
+  return pfirst(_mm256_max_ps(tmp, _mm256_shuffle_ps(tmp, tmp, 1)));
 }
 
-template<> EIGEN_STRONG_INLINE double predux_max<Packet4d>(const Packet4d& a)
-{
-  Packet4d tmp = _mm256_max_pd(a, _mm256_permute2f128_pd(a,a,1));
+template <>
+EIGEN_STRONG_INLINE double predux_max<Packet4d>(const Packet4d& a) {
+  Packet4d tmp = _mm256_max_pd(a, _mm256_permute2f128_pd(a, a, 1));
   return pfirst(_mm256_max_pd(tmp, _mm256_shuffle_pd(tmp, tmp, 1)));
 }
 
@@ -1614,22 +1994,21 @@
 //   return _mm256_movemask_ps(x)==0xFF;
 // }
 
-template<> EIGEN_STRONG_INLINE bool predux_any(const Packet8f& x)
-{
+template <>
+EIGEN_STRONG_INLINE bool predux_any(const Packet8f& x) {
   return _mm256_movemask_ps(x) != 0;
 }
 
-template<> EIGEN_STRONG_INLINE bool predux_any(const Packet8i& x)
-{
+template <>
+EIGEN_STRONG_INLINE bool predux_any(const Packet8i& x) {
   return _mm256_movemask_ps(_mm256_castsi256_ps(x)) != 0;
 }
-template<> EIGEN_STRONG_INLINE bool predux_any(const Packet8ui& x)
-{
+template <>
+EIGEN_STRONG_INLINE bool predux_any(const Packet8ui& x) {
   return _mm256_movemask_ps(_mm256_castsi256_ps(x)) != 0;
 }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet8f,8>& kernel) {
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet8f, 8>& kernel) {
   __m256 T0 = _mm256_unpacklo_ps(kernel.packet[0], kernel.packet[1]);
   __m256 T1 = _mm256_unpackhi_ps(kernel.packet[0], kernel.packet[1]);
   __m256 T2 = _mm256_unpacklo_ps(kernel.packet[2], kernel.packet[3]);
@@ -1638,14 +2017,14 @@
   __m256 T5 = _mm256_unpackhi_ps(kernel.packet[4], kernel.packet[5]);
   __m256 T6 = _mm256_unpacklo_ps(kernel.packet[6], kernel.packet[7]);
   __m256 T7 = _mm256_unpackhi_ps(kernel.packet[6], kernel.packet[7]);
-  __m256 S0 = _mm256_shuffle_ps(T0,T2,_MM_SHUFFLE(1,0,1,0));
-  __m256 S1 = _mm256_shuffle_ps(T0,T2,_MM_SHUFFLE(3,2,3,2));
-  __m256 S2 = _mm256_shuffle_ps(T1,T3,_MM_SHUFFLE(1,0,1,0));
-  __m256 S3 = _mm256_shuffle_ps(T1,T3,_MM_SHUFFLE(3,2,3,2));
-  __m256 S4 = _mm256_shuffle_ps(T4,T6,_MM_SHUFFLE(1,0,1,0));
-  __m256 S5 = _mm256_shuffle_ps(T4,T6,_MM_SHUFFLE(3,2,3,2));
-  __m256 S6 = _mm256_shuffle_ps(T5,T7,_MM_SHUFFLE(1,0,1,0));
-  __m256 S7 = _mm256_shuffle_ps(T5,T7,_MM_SHUFFLE(3,2,3,2));
+  __m256 S0 = _mm256_shuffle_ps(T0, T2, _MM_SHUFFLE(1, 0, 1, 0));
+  __m256 S1 = _mm256_shuffle_ps(T0, T2, _MM_SHUFFLE(3, 2, 3, 2));
+  __m256 S2 = _mm256_shuffle_ps(T1, T3, _MM_SHUFFLE(1, 0, 1, 0));
+  __m256 S3 = _mm256_shuffle_ps(T1, T3, _MM_SHUFFLE(3, 2, 3, 2));
+  __m256 S4 = _mm256_shuffle_ps(T4, T6, _MM_SHUFFLE(1, 0, 1, 0));
+  __m256 S5 = _mm256_shuffle_ps(T4, T6, _MM_SHUFFLE(3, 2, 3, 2));
+  __m256 S6 = _mm256_shuffle_ps(T5, T7, _MM_SHUFFLE(1, 0, 1, 0));
+  __m256 S7 = _mm256_shuffle_ps(T5, T7, _MM_SHUFFLE(3, 2, 3, 2));
   kernel.packet[0] = _mm256_permute2f128_ps(S0, S4, 0x20);
   kernel.packet[1] = _mm256_permute2f128_ps(S1, S5, 0x20);
   kernel.packet[2] = _mm256_permute2f128_ps(S2, S6, 0x20);
@@ -1656,17 +2035,16 @@
   kernel.packet[7] = _mm256_permute2f128_ps(S3, S7, 0x31);
 }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet8f,4>& kernel) {
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet8f, 4>& kernel) {
   __m256 T0 = _mm256_unpacklo_ps(kernel.packet[0], kernel.packet[1]);
   __m256 T1 = _mm256_unpackhi_ps(kernel.packet[0], kernel.packet[1]);
   __m256 T2 = _mm256_unpacklo_ps(kernel.packet[2], kernel.packet[3]);
   __m256 T3 = _mm256_unpackhi_ps(kernel.packet[2], kernel.packet[3]);
 
-  __m256 S0 = _mm256_shuffle_ps(T0,T2,_MM_SHUFFLE(1,0,1,0));
-  __m256 S1 = _mm256_shuffle_ps(T0,T2,_MM_SHUFFLE(3,2,3,2));
-  __m256 S2 = _mm256_shuffle_ps(T1,T3,_MM_SHUFFLE(1,0,1,0));
-  __m256 S3 = _mm256_shuffle_ps(T1,T3,_MM_SHUFFLE(3,2,3,2));
+  __m256 S0 = _mm256_shuffle_ps(T0, T2, _MM_SHUFFLE(1, 0, 1, 0));
+  __m256 S1 = _mm256_shuffle_ps(T0, T2, _MM_SHUFFLE(3, 2, 3, 2));
+  __m256 S2 = _mm256_shuffle_ps(T1, T3, _MM_SHUFFLE(1, 0, 1, 0));
+  __m256 S3 = _mm256_shuffle_ps(T1, T3, _MM_SHUFFLE(3, 2, 3, 2));
 
   kernel.packet[0] = _mm256_permute2f128_ps(S0, S1, 0x20);
   kernel.packet[1] = _mm256_permute2f128_ps(S2, S3, 0x20);
@@ -1687,9 +2065,7 @@
 #define MM256_UNPACKHI_EPI32(A, B) _mm256_unpackhi_epi32(A, B)
 #endif
 
-
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet8i,8>& kernel) {
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet8i, 8>& kernel) {
   __m256i T0 = MM256_UNPACKLO_EPI32(kernel.packet[0], kernel.packet[1]);
   __m256i T1 = MM256_UNPACKHI_EPI32(kernel.packet[0], kernel.packet[1]);
   __m256i T2 = MM256_UNPACKLO_EPI32(kernel.packet[2], kernel.packet[3]);
@@ -1698,14 +2074,14 @@
   __m256i T5 = MM256_UNPACKHI_EPI32(kernel.packet[4], kernel.packet[5]);
   __m256i T6 = MM256_UNPACKLO_EPI32(kernel.packet[6], kernel.packet[7]);
   __m256i T7 = MM256_UNPACKHI_EPI32(kernel.packet[6], kernel.packet[7]);
-  __m256i S0 = MM256_SHUFFLE_EPI32(T0,T2,_MM_SHUFFLE(1,0,1,0));
-  __m256i S1 = MM256_SHUFFLE_EPI32(T0,T2,_MM_SHUFFLE(3,2,3,2));
-  __m256i S2 = MM256_SHUFFLE_EPI32(T1,T3,_MM_SHUFFLE(1,0,1,0));
-  __m256i S3 = MM256_SHUFFLE_EPI32(T1,T3,_MM_SHUFFLE(3,2,3,2));
-  __m256i S4 = MM256_SHUFFLE_EPI32(T4,T6,_MM_SHUFFLE(1,0,1,0));
-  __m256i S5 = MM256_SHUFFLE_EPI32(T4,T6,_MM_SHUFFLE(3,2,3,2));
-  __m256i S6 = MM256_SHUFFLE_EPI32(T5,T7,_MM_SHUFFLE(1,0,1,0));
-  __m256i S7 = MM256_SHUFFLE_EPI32(T5,T7,_MM_SHUFFLE(3,2,3,2));
+  __m256i S0 = MM256_SHUFFLE_EPI32(T0, T2, _MM_SHUFFLE(1, 0, 1, 0));
+  __m256i S1 = MM256_SHUFFLE_EPI32(T0, T2, _MM_SHUFFLE(3, 2, 3, 2));
+  __m256i S2 = MM256_SHUFFLE_EPI32(T1, T3, _MM_SHUFFLE(1, 0, 1, 0));
+  __m256i S3 = MM256_SHUFFLE_EPI32(T1, T3, _MM_SHUFFLE(3, 2, 3, 2));
+  __m256i S4 = MM256_SHUFFLE_EPI32(T4, T6, _MM_SHUFFLE(1, 0, 1, 0));
+  __m256i S5 = MM256_SHUFFLE_EPI32(T4, T6, _MM_SHUFFLE(3, 2, 3, 2));
+  __m256i S6 = MM256_SHUFFLE_EPI32(T5, T7, _MM_SHUFFLE(1, 0, 1, 0));
+  __m256i S7 = MM256_SHUFFLE_EPI32(T5, T7, _MM_SHUFFLE(3, 2, 3, 2));
   kernel.packet[0] = _mm256_permute2f128_si256(S0, S4, 0x20);
   kernel.packet[1] = _mm256_permute2f128_si256(S1, S5, 0x20);
   kernel.packet[2] = _mm256_permute2f128_si256(S2, S6, 0x20);
@@ -1719,17 +2095,16 @@
   ptranspose((PacketBlock<Packet8i, 8>&)kernel);
 }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet8i,4>& kernel) {
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet8i, 4>& kernel) {
   __m256i T0 = MM256_UNPACKLO_EPI32(kernel.packet[0], kernel.packet[1]);
   __m256i T1 = MM256_UNPACKHI_EPI32(kernel.packet[0], kernel.packet[1]);
   __m256i T2 = MM256_UNPACKLO_EPI32(kernel.packet[2], kernel.packet[3]);
   __m256i T3 = MM256_UNPACKHI_EPI32(kernel.packet[2], kernel.packet[3]);
 
-  __m256i S0 = MM256_SHUFFLE_EPI32(T0,T2,_MM_SHUFFLE(1,0,1,0));
-  __m256i S1 = MM256_SHUFFLE_EPI32(T0,T2,_MM_SHUFFLE(3,2,3,2));
-  __m256i S2 = MM256_SHUFFLE_EPI32(T1,T3,_MM_SHUFFLE(1,0,1,0));
-  __m256i S3 = MM256_SHUFFLE_EPI32(T1,T3,_MM_SHUFFLE(3,2,3,2));
+  __m256i S0 = MM256_SHUFFLE_EPI32(T0, T2, _MM_SHUFFLE(1, 0, 1, 0));
+  __m256i S1 = MM256_SHUFFLE_EPI32(T0, T2, _MM_SHUFFLE(3, 2, 3, 2));
+  __m256i S2 = MM256_SHUFFLE_EPI32(T1, T3, _MM_SHUFFLE(1, 0, 1, 0));
+  __m256i S3 = MM256_SHUFFLE_EPI32(T1, T3, _MM_SHUFFLE(3, 2, 3, 2));
 
   kernel.packet[0] = _mm256_permute2f128_si256(S0, S1, 0x20);
   kernel.packet[1] = _mm256_permute2f128_si256(S2, S3, 0x20);
@@ -1740,8 +2115,7 @@
   ptranspose((PacketBlock<Packet8i, 4>&)kernel);
 }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet4d,4>& kernel) {
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet4d, 4>& kernel) {
   __m256d T0 = _mm256_shuffle_pd(kernel.packet[0], kernel.packet[1], 15);
   __m256d T1 = _mm256_shuffle_pd(kernel.packet[0], kernel.packet[1], 0);
   __m256d T2 = _mm256_shuffle_pd(kernel.packet[2], kernel.packet[3], 15);
@@ -1753,24 +2127,32 @@
   kernel.packet[2] = _mm256_permute2f128_pd(T1, T3, 49);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8f pblend(const Selector<8>& ifPacket, const Packet8f& thenPacket, const Packet8f& elsePacket) {
+template <>
+EIGEN_STRONG_INLINE Packet8f pblend(const Selector<8>& ifPacket, const Packet8f& thenPacket,
+                                    const Packet8f& elsePacket) {
 #ifdef EIGEN_VECTORIZE_AVX2
   const __m256i zero = _mm256_setzero_si256();
-  const __m256i select = _mm256_set_epi32(ifPacket.select[7], ifPacket.select[6], ifPacket.select[5], ifPacket.select[4], ifPacket.select[3], ifPacket.select[2], ifPacket.select[1], ifPacket.select[0]);
+  const __m256i select =
+      _mm256_set_epi32(ifPacket.select[7], ifPacket.select[6], ifPacket.select[5], ifPacket.select[4],
+                       ifPacket.select[3], ifPacket.select[2], ifPacket.select[1], ifPacket.select[0]);
   __m256i false_mask = _mm256_cmpeq_epi32(zero, select);
   return _mm256_blendv_ps(thenPacket, elsePacket, _mm256_castsi256_ps(false_mask));
 #else
   const __m256 zero = _mm256_setzero_ps();
-  const __m256 select = _mm256_set_ps(ifPacket.select[7], ifPacket.select[6], ifPacket.select[5], ifPacket.select[4], ifPacket.select[3], ifPacket.select[2], ifPacket.select[1], ifPacket.select[0]);
+  const __m256 select = _mm256_set_ps(ifPacket.select[7], ifPacket.select[6], ifPacket.select[5], ifPacket.select[4],
+                                      ifPacket.select[3], ifPacket.select[2], ifPacket.select[1], ifPacket.select[0]);
   __m256 false_mask = _mm256_cmp_ps(select, zero, _CMP_EQ_UQ);
   return _mm256_blendv_ps(thenPacket, elsePacket, false_mask);
 #endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet4d pblend(const Selector<4>& ifPacket, const Packet4d& thenPacket, const Packet4d& elsePacket) {
+template <>
+EIGEN_STRONG_INLINE Packet4d pblend(const Selector<4>& ifPacket, const Packet4d& thenPacket,
+                                    const Packet4d& elsePacket) {
 #ifdef EIGEN_VECTORIZE_AVX2
   const __m256i zero = _mm256_setzero_si256();
-  const __m256i select = _mm256_set_epi64x(ifPacket.select[3], ifPacket.select[2], ifPacket.select[1], ifPacket.select[0]);
+  const __m256i select =
+      _mm256_set_epi64x(ifPacket.select[3], ifPacket.select[2], ifPacket.select[1], ifPacket.select[0]);
   __m256i false_mask = _mm256_cmpeq_epi64(select, zero);
   return _mm256_blendv_pd(thenPacket, elsePacket, _mm256_castsi256_pd(false_mask));
 #else
@@ -1783,35 +2165,52 @@
 
 // Packet math for Eigen::half
 #ifndef EIGEN_VECTORIZE_AVX512FP16
-template<> struct unpacket_traits<Packet8h> { typedef Eigen::half type; enum {size=8, alignment=Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false}; typedef Packet8h half; };
+template <>
+struct unpacket_traits<Packet8h> {
+  typedef Eigen::half type;
+  enum {
+    size = 8,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
+  typedef Packet8h half;
+};
 #endif
 
-template<> EIGEN_STRONG_INLINE Packet8h pset1<Packet8h>(const Eigen::half& from) {
+template <>
+EIGEN_STRONG_INLINE Packet8h pset1<Packet8h>(const Eigen::half& from) {
   return _mm_set1_epi16(numext::bit_cast<numext::uint16_t>(from));
 }
 
-template<> EIGEN_STRONG_INLINE Eigen::half pfirst<Packet8h>(const Packet8h& from) {
+template <>
+EIGEN_STRONG_INLINE Eigen::half pfirst<Packet8h>(const Packet8h& from) {
   return numext::bit_cast<Eigen::half>(static_cast<numext::uint16_t>(_mm_extract_epi16(from, 0)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8h pload<Packet8h>(const Eigen::half* from) {
+template <>
+EIGEN_STRONG_INLINE Packet8h pload<Packet8h>(const Eigen::half* from) {
   return _mm_load_si128(reinterpret_cast<const __m128i*>(from));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8h ploadu<Packet8h>(const Eigen::half* from) {
+template <>
+EIGEN_STRONG_INLINE Packet8h ploadu<Packet8h>(const Eigen::half* from) {
   return _mm_loadu_si128(reinterpret_cast<const __m128i*>(from));
 }
 
-template<> EIGEN_STRONG_INLINE void pstore<Eigen::half>(Eigen::half* to, const Packet8h& from) {
+template <>
+EIGEN_STRONG_INLINE void pstore<Eigen::half>(Eigen::half* to, const Packet8h& from) {
   _mm_store_si128(reinterpret_cast<__m128i*>(to), from);
 }
 
-template<> EIGEN_STRONG_INLINE void pstoreu<Eigen::half>(Eigen::half* to, const Packet8h& from) {
+template <>
+EIGEN_STRONG_INLINE void pstoreu<Eigen::half>(Eigen::half* to, const Packet8h& from) {
   _mm_storeu_si128(reinterpret_cast<__m128i*>(to), from);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8h
-ploaddup<Packet8h>(const Eigen::half*  from) {
+template <>
+EIGEN_STRONG_INLINE Packet8h ploaddup<Packet8h>(const Eigen::half* from) {
   const numext::uint16_t a = numext::bit_cast<numext::uint16_t>(from[0]);
   const numext::uint16_t b = numext::bit_cast<numext::uint16_t>(from[1]);
   const numext::uint16_t c = numext::bit_cast<numext::uint16_t>(from[2]);
@@ -1819,14 +2218,15 @@
   return _mm_set_epi16(d, d, c, c, b, b, a, a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8h
-ploadquad<Packet8h>(const Eigen::half* from) {
+template <>
+EIGEN_STRONG_INLINE Packet8h ploadquad<Packet8h>(const Eigen::half* from) {
   const numext::uint16_t a = numext::bit_cast<numext::uint16_t>(from[0]);
   const numext::uint16_t b = numext::bit_cast<numext::uint16_t>(from[1]);
   return _mm_set_epi16(b, b, b, b, a, a, a, a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8h ptrue(const Packet8h& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8h ptrue(const Packet8h& a) {
   return _mm_cmpeq_epi32(a, a);
 }
 
@@ -1840,8 +2240,8 @@
 #ifdef EIGEN_HAS_FP16_C
   return _mm256_cvtph_ps(a);
 #else
-  Eigen::internal::Packet8f pp = _mm256_castsi256_ps(_mm256_insertf128_si256(
-      _mm256_castsi128_si256(half2floatsse(a)), half2floatsse(_mm_srli_si128(a, 8)), 1));
+  Eigen::internal::Packet8f pp = _mm256_castsi256_ps(
+      _mm256_insertf128_si256(_mm256_castsi128_si256(half2floatsse(a)), half2floatsse(_mm_srli_si128(a, 8)), 1));
   return pp;
 #endif
 }
@@ -1852,19 +2252,17 @@
 #else
   __m128i lo = float2half(_mm256_extractf128_ps(a, 0));
   __m128i hi = float2half(_mm256_extractf128_ps(a, 1));
-  return   _mm_packus_epi32(lo, hi);
+  return _mm_packus_epi32(lo, hi);
 #endif
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet8h pmin<Packet8h>(const Packet8h& a,
-                                            const Packet8h& b) {
+EIGEN_STRONG_INLINE Packet8h pmin<Packet8h>(const Packet8h& a, const Packet8h& b) {
   return float2half(pmin<Packet8f>(half2float(a), half2float(b)));
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet8h pmax<Packet8h>(const Packet8h& a,
-                                            const Packet8h& b) {
+EIGEN_STRONG_INLINE Packet8h pmax<Packet8h>(const Packet8h& a, const Packet8h& b) {
   return float2half(pmax<Packet8f>(half2float(a), half2float(b)));
 }
 
@@ -1873,87 +2271,108 @@
   return float2half(plset<Packet8f>(static_cast<float>(a)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8h por(const Packet8h& a,const Packet8h& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8h por(const Packet8h& a, const Packet8h& b) {
   // in some cases Packet4i is a wrapper around __m128i, so we either need to
   // cast to Packet4i to directly call the intrinsics as below:
-  return _mm_or_si128(a,b);
+  return _mm_or_si128(a, b);
 }
-template<> EIGEN_STRONG_INLINE Packet8h pxor(const Packet8h& a,const Packet8h& b) {
-  return _mm_xor_si128(a,b);
+template <>
+EIGEN_STRONG_INLINE Packet8h pxor(const Packet8h& a, const Packet8h& b) {
+  return _mm_xor_si128(a, b);
 }
-template<> EIGEN_STRONG_INLINE Packet8h pand(const Packet8h& a,const Packet8h& b) {
-  return _mm_and_si128(a,b);
+template <>
+EIGEN_STRONG_INLINE Packet8h pand(const Packet8h& a, const Packet8h& b) {
+  return _mm_and_si128(a, b);
 }
-template<> EIGEN_STRONG_INLINE Packet8h pandnot(const Packet8h& a,const Packet8h& b) {
-  return _mm_andnot_si128(b,a);
+template <>
+EIGEN_STRONG_INLINE Packet8h pandnot(const Packet8h& a, const Packet8h& b) {
+  return _mm_andnot_si128(b, a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8h pselect(const Packet8h& mask, const Packet8h& a, const Packet8h& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8h pselect(const Packet8h& mask, const Packet8h& a, const Packet8h& b) {
   return _mm_blendv_epi8(b, a, mask);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8h pround<Packet8h>(const Packet8h& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8h pround<Packet8h>(const Packet8h& a) {
   return float2half(pround<Packet8f>(half2float(a)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8h print<Packet8h>(const Packet8h& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8h print<Packet8h>(const Packet8h& a) {
   return float2half(print<Packet8f>(half2float(a)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8h pceil<Packet8h>(const Packet8h& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8h pceil<Packet8h>(const Packet8h& a) {
   return float2half(pceil<Packet8f>(half2float(a)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8h pfloor<Packet8h>(const Packet8h& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8h pfloor<Packet8h>(const Packet8h& a) {
   return float2half(pfloor<Packet8f>(half2float(a)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8h pcmp_eq(const Packet8h& a,const Packet8h& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8h pcmp_eq(const Packet8h& a, const Packet8h& b) {
   return Pack16To8(pcmp_eq(half2float(a), half2float(b)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8h pcmp_le(const Packet8h& a,const Packet8h& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8h pcmp_le(const Packet8h& a, const Packet8h& b) {
   return Pack16To8(pcmp_le(half2float(a), half2float(b)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8h pcmp_lt(const Packet8h& a,const Packet8h& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8h pcmp_lt(const Packet8h& a, const Packet8h& b) {
   return Pack16To8(pcmp_lt(half2float(a), half2float(b)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8h pcmp_lt_or_nan(const Packet8h& a,const Packet8h& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8h pcmp_lt_or_nan(const Packet8h& a, const Packet8h& b) {
   return Pack16To8(pcmp_lt_or_nan(half2float(a), half2float(b)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8h pconj(const Packet8h& a) { return a; }
+template <>
+EIGEN_STRONG_INLINE Packet8h pconj(const Packet8h& a) {
+  return a;
+}
 
-template<> EIGEN_STRONG_INLINE Packet8h pnegate(const Packet8h& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8h pnegate(const Packet8h& a) {
   Packet8h sign_mask = _mm_set1_epi16(static_cast<numext::uint16_t>(0x8000));
   return _mm_xor_si128(a, sign_mask);
 }
 
 #ifndef EIGEN_VECTORIZE_AVX512FP16
-template<> EIGEN_STRONG_INLINE Packet8h padd<Packet8h>(const Packet8h& a, const Packet8h& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8h padd<Packet8h>(const Packet8h& a, const Packet8h& b) {
   Packet8f af = half2float(a);
   Packet8f bf = half2float(b);
   Packet8f rf = padd(af, bf);
   return float2half(rf);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8h psub<Packet8h>(const Packet8h& a, const Packet8h& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8h psub<Packet8h>(const Packet8h& a, const Packet8h& b) {
   Packet8f af = half2float(a);
   Packet8f bf = half2float(b);
   Packet8f rf = psub(af, bf);
   return float2half(rf);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8h pmul<Packet8h>(const Packet8h& a, const Packet8h& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8h pmul<Packet8h>(const Packet8h& a, const Packet8h& b) {
   Packet8f af = half2float(a);
   Packet8f bf = half2float(b);
   Packet8f rf = pmul(af, bf);
   return float2half(rf);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8h pdiv<Packet8h>(const Packet8h& a, const Packet8h& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8h pdiv<Packet8h>(const Packet8h& a, const Packet8h& b) {
   Packet8f af = half2float(a);
   Packet8f bf = half2float(b);
   Packet8f rf = pdiv(af, bf);
@@ -1961,68 +2380,70 @@
 }
 #endif
 
-template<> EIGEN_STRONG_INLINE Packet8h pgather<Eigen::half, Packet8h>(const Eigen::half* from, Index stride)
-{
-  const numext::uint16_t s0 = numext::bit_cast<numext::uint16_t>(from[0*stride]);
-  const numext::uint16_t s1 = numext::bit_cast<numext::uint16_t>(from[1*stride]);
-  const numext::uint16_t s2 = numext::bit_cast<numext::uint16_t>(from[2*stride]);
-  const numext::uint16_t s3 = numext::bit_cast<numext::uint16_t>(from[3*stride]);
-  const numext::uint16_t s4 = numext::bit_cast<numext::uint16_t>(from[4*stride]);
-  const numext::uint16_t s5 = numext::bit_cast<numext::uint16_t>(from[5*stride]);
-  const numext::uint16_t s6 = numext::bit_cast<numext::uint16_t>(from[6*stride]);
-  const numext::uint16_t s7 = numext::bit_cast<numext::uint16_t>(from[7*stride]);
+template <>
+EIGEN_STRONG_INLINE Packet8h pgather<Eigen::half, Packet8h>(const Eigen::half* from, Index stride) {
+  const numext::uint16_t s0 = numext::bit_cast<numext::uint16_t>(from[0 * stride]);
+  const numext::uint16_t s1 = numext::bit_cast<numext::uint16_t>(from[1 * stride]);
+  const numext::uint16_t s2 = numext::bit_cast<numext::uint16_t>(from[2 * stride]);
+  const numext::uint16_t s3 = numext::bit_cast<numext::uint16_t>(from[3 * stride]);
+  const numext::uint16_t s4 = numext::bit_cast<numext::uint16_t>(from[4 * stride]);
+  const numext::uint16_t s5 = numext::bit_cast<numext::uint16_t>(from[5 * stride]);
+  const numext::uint16_t s6 = numext::bit_cast<numext::uint16_t>(from[6 * stride]);
+  const numext::uint16_t s7 = numext::bit_cast<numext::uint16_t>(from[7 * stride]);
   return _mm_set_epi16(s7, s6, s5, s4, s3, s2, s1, s0);
 }
 
-template<> EIGEN_STRONG_INLINE void pscatter<Eigen::half, Packet8h>(Eigen::half* to, const Packet8h& from, Index stride)
-{
+template <>
+EIGEN_STRONG_INLINE void pscatter<Eigen::half, Packet8h>(Eigen::half* to, const Packet8h& from, Index stride) {
   EIGEN_ALIGN32 Eigen::half aux[8];
   pstore(aux, from);
-  to[stride*0] = aux[0];
-  to[stride*1] = aux[1];
-  to[stride*2] = aux[2];
-  to[stride*3] = aux[3];
-  to[stride*4] = aux[4];
-  to[stride*5] = aux[5];
-  to[stride*6] = aux[6];
-  to[stride*7] = aux[7];
+  to[stride * 0] = aux[0];
+  to[stride * 1] = aux[1];
+  to[stride * 2] = aux[2];
+  to[stride * 3] = aux[3];
+  to[stride * 4] = aux[4];
+  to[stride * 5] = aux[5];
+  to[stride * 6] = aux[6];
+  to[stride * 7] = aux[7];
 }
 
-
 #ifndef EIGEN_VECTORIZE_AVX512FP16
-template<> EIGEN_STRONG_INLINE Eigen::half predux<Packet8h>(const Packet8h& a) {
+template <>
+EIGEN_STRONG_INLINE Eigen::half predux<Packet8h>(const Packet8h& a) {
   Packet8f af = half2float(a);
   float reduced = predux<Packet8f>(af);
   return Eigen::half(reduced);
 }
 #endif
 
-template<> EIGEN_STRONG_INLINE Eigen::half predux_max<Packet8h>(const Packet8h& a) {
+template <>
+EIGEN_STRONG_INLINE Eigen::half predux_max<Packet8h>(const Packet8h& a) {
   Packet8f af = half2float(a);
   float reduced = predux_max<Packet8f>(af);
   return Eigen::half(reduced);
 }
 
-template<> EIGEN_STRONG_INLINE Eigen::half predux_min<Packet8h>(const Packet8h& a) {
+template <>
+EIGEN_STRONG_INLINE Eigen::half predux_min<Packet8h>(const Packet8h& a) {
   Packet8f af = half2float(a);
   float reduced = predux_min<Packet8f>(af);
   return Eigen::half(reduced);
 }
 
-template<> EIGEN_STRONG_INLINE Eigen::half predux_mul<Packet8h>(const Packet8h& a) {
+template <>
+EIGEN_STRONG_INLINE Eigen::half predux_mul<Packet8h>(const Packet8h& a) {
   Packet8f af = half2float(a);
   float reduced = predux_mul<Packet8f>(af);
   return Eigen::half(reduced);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8h preverse(const Packet8h& a)
-{
-  __m128i m = _mm_setr_epi8(14,15,12,13,10,11,8,9,6,7,4,5,2,3,0,1);
-  return _mm_shuffle_epi8(a,m);
+template <>
+EIGEN_STRONG_INLINE Packet8h preverse(const Packet8h& a) {
+  __m128i m = _mm_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1);
+  return _mm_shuffle_epi8(a, m);
 }
 
-EIGEN_STRONG_INLINE void
-ptranspose(PacketBlock<Packet8h,8>& kernel) {
+EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet8h, 8>& kernel) {
   __m128i a = kernel.packet[0];
   __m128i b = kernel.packet[1];
   __m128i c = kernel.packet[2];
@@ -2069,8 +2490,7 @@
   kernel.packet[7] = a7b7c7d7e7f7g7h7;
 }
 
-EIGEN_STRONG_INLINE void
-ptranspose(PacketBlock<Packet8h,4>& kernel) {
+EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet8h, 4>& kernel) {
   EIGEN_ALIGN32 Eigen::half in[4][8];
   pstore<Eigen::half>(in[0], kernel.packet[0]);
   pstore<Eigen::half>(in[1], kernel.packet[1]);
@@ -2081,10 +2501,10 @@
 
   for (int i = 0; i < 4; ++i) {
     for (int j = 0; j < 4; ++j) {
-      out[i][j] = in[j][2*i];
+      out[i][j] = in[j][2 * i];
     }
     for (int j = 0; j < 4; ++j) {
-      out[i][j+4] = in[j][2*i+1];
+      out[i][j + 4] = in[j][2 * i + 1];
     }
   }
 
@@ -2111,7 +2531,6 @@
 
 // Convert float to bfloat16 according to round-to-nearest-even/denormals algorithm.
 EIGEN_STRONG_INLINE Packet8bf F32ToBf16(const Packet8f& a) {
-
   __m256i input = _mm256_castps_si256(a);
 
 #ifdef EIGEN_VECTORIZE_AVX2
@@ -2130,8 +2549,7 @@
   __m256i nan = _mm256_set1_epi32(0x7fc0);
   t = _mm256_blendv_epi8(nan, t, _mm256_castps_si256(mask));
   // output = numext::bit_cast<uint16_t>(input);
-  return _mm_packus_epi32(_mm256_extractf128_si256(t, 0),
-                         _mm256_extractf128_si256(t, 1));
+  return _mm_packus_epi32(_mm256_extractf128_si256(t, 0), _mm256_extractf128_si256(t, 1));
 #else
   // uint32_t lsb = (input >> 16);
   __m128i lo = _mm_srli_epi32(_mm256_extractf128_si256(input, 0), 16);
@@ -2158,32 +2576,38 @@
 #endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf pset1<Packet8bf>(const bfloat16& from) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf pset1<Packet8bf>(const bfloat16& from) {
   return _mm_set1_epi16(numext::bit_cast<numext::uint16_t>(from));
 }
 
-template<> EIGEN_STRONG_INLINE bfloat16 pfirst<Packet8bf>(const Packet8bf& from) {
+template <>
+EIGEN_STRONG_INLINE bfloat16 pfirst<Packet8bf>(const Packet8bf& from) {
   return numext::bit_cast<bfloat16>(static_cast<numext::uint16_t>(_mm_extract_epi16(from, 0)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf pload<Packet8bf>(const bfloat16* from) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf pload<Packet8bf>(const bfloat16* from) {
   return _mm_load_si128(reinterpret_cast<const __m128i*>(from));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf ploadu<Packet8bf>(const bfloat16* from) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf ploadu<Packet8bf>(const bfloat16* from) {
   return _mm_loadu_si128(reinterpret_cast<const __m128i*>(from));
 }
 
-template<> EIGEN_STRONG_INLINE void pstore<bfloat16>(bfloat16* to, const Packet8bf& from) {
+template <>
+EIGEN_STRONG_INLINE void pstore<bfloat16>(bfloat16* to, const Packet8bf& from) {
   _mm_store_si128(reinterpret_cast<__m128i*>(to), from);
 }
 
-template<> EIGEN_STRONG_INLINE void pstoreu<bfloat16>(bfloat16* to, const Packet8bf& from) {
+template <>
+EIGEN_STRONG_INLINE void pstoreu<bfloat16>(bfloat16* to, const Packet8bf& from) {
   _mm_storeu_si128(reinterpret_cast<__m128i*>(to), from);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf
-ploaddup<Packet8bf>(const bfloat16* from) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf ploaddup<Packet8bf>(const bfloat16* from) {
   const numext::uint16_t a = numext::bit_cast<numext::uint16_t>(from[0]);
   const numext::uint16_t b = numext::bit_cast<numext::uint16_t>(from[1]);
   const numext::uint16_t c = numext::bit_cast<numext::uint16_t>(from[2]);
@@ -2191,14 +2615,15 @@
   return _mm_set_epi16(d, d, c, c, b, b, a, a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf
-ploadquad<Packet8bf>(const bfloat16* from) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf ploadquad<Packet8bf>(const bfloat16* from) {
   const numext::uint16_t a = numext::bit_cast<numext::uint16_t>(from[0]);
   const numext::uint16_t b = numext::bit_cast<numext::uint16_t>(from[1]);
   return _mm_set_epi16(b, b, b, b, a, a, a, a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf ptrue(const Packet8bf& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf ptrue(const Packet8bf& a) {
   return _mm_cmpeq_epi32(a, a);
 }
 
@@ -2209,14 +2634,12 @@
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet8bf pmin<Packet8bf>(const Packet8bf& a,
-                                                const Packet8bf& b) {
+EIGEN_STRONG_INLINE Packet8bf pmin<Packet8bf>(const Packet8bf& a, const Packet8bf& b) {
   return F32ToBf16(pmin<Packet8f>(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet8bf pmax<Packet8bf>(const Packet8bf& a,
-                                                const Packet8bf& b) {
+EIGEN_STRONG_INLINE Packet8bf pmax<Packet8bf>(const Packet8bf& a, const Packet8bf& b) {
   return F32ToBf16(pmax<Packet8f>(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
@@ -2225,131 +2648,153 @@
   return F32ToBf16(plset<Packet8f>(static_cast<float>(a)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf por(const Packet8bf& a,const Packet8bf& b) {
-  return _mm_or_si128(a,b);
+template <>
+EIGEN_STRONG_INLINE Packet8bf por(const Packet8bf& a, const Packet8bf& b) {
+  return _mm_or_si128(a, b);
 }
-template<> EIGEN_STRONG_INLINE Packet8bf pxor(const Packet8bf& a,const Packet8bf& b) {
-  return _mm_xor_si128(a,b);
+template <>
+EIGEN_STRONG_INLINE Packet8bf pxor(const Packet8bf& a, const Packet8bf& b) {
+  return _mm_xor_si128(a, b);
 }
-template<> EIGEN_STRONG_INLINE Packet8bf pand(const Packet8bf& a,const Packet8bf& b) {
-  return _mm_and_si128(a,b);
+template <>
+EIGEN_STRONG_INLINE Packet8bf pand(const Packet8bf& a, const Packet8bf& b) {
+  return _mm_and_si128(a, b);
 }
-template<> EIGEN_STRONG_INLINE Packet8bf pandnot(const Packet8bf& a,const Packet8bf& b) {
-  return _mm_andnot_si128(b,a);
+template <>
+EIGEN_STRONG_INLINE Packet8bf pandnot(const Packet8bf& a, const Packet8bf& b) {
+  return _mm_andnot_si128(b, a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf pselect(const Packet8bf& mask, const Packet8bf& a, const Packet8bf& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf pselect(const Packet8bf& mask, const Packet8bf& a, const Packet8bf& b) {
   return _mm_blendv_epi8(b, a, mask);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf pround<Packet8bf>(const Packet8bf& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8bf pround<Packet8bf>(const Packet8bf& a) {
   return F32ToBf16(pround<Packet8f>(Bf16ToF32(a)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf print<Packet8bf>(const Packet8bf& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf print<Packet8bf>(const Packet8bf& a) {
   return F32ToBf16(print<Packet8f>(Bf16ToF32(a)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf pceil<Packet8bf>(const Packet8bf& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf pceil<Packet8bf>(const Packet8bf& a) {
   return F32ToBf16(pceil<Packet8f>(Bf16ToF32(a)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf pfloor<Packet8bf>(const Packet8bf& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf pfloor<Packet8bf>(const Packet8bf& a) {
   return F32ToBf16(pfloor<Packet8f>(Bf16ToF32(a)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf pcmp_eq(const Packet8bf& a,const Packet8bf& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf pcmp_eq(const Packet8bf& a, const Packet8bf& b) {
   return Pack16To8(pcmp_eq(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf pcmp_le(const Packet8bf& a,const Packet8bf& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf pcmp_le(const Packet8bf& a, const Packet8bf& b) {
   return Pack16To8(pcmp_le(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf pcmp_lt(const Packet8bf& a,const Packet8bf& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf pcmp_lt(const Packet8bf& a, const Packet8bf& b) {
   return Pack16To8(pcmp_lt(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf pcmp_lt_or_nan(const Packet8bf& a,const Packet8bf& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf pcmp_lt_or_nan(const Packet8bf& a, const Packet8bf& b) {
   return Pack16To8(pcmp_lt_or_nan(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf pconj(const Packet8bf& a) { return a; }
+template <>
+EIGEN_STRONG_INLINE Packet8bf pconj(const Packet8bf& a) {
+  return a;
+}
 
-template<> EIGEN_STRONG_INLINE Packet8bf pnegate(const Packet8bf& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf pnegate(const Packet8bf& a) {
   Packet8bf sign_mask = _mm_set1_epi16(static_cast<numext::uint16_t>(0x8000));
   return _mm_xor_si128(a, sign_mask);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf padd<Packet8bf>(const Packet8bf& a, const Packet8bf& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf padd<Packet8bf>(const Packet8bf& a, const Packet8bf& b) {
   return F32ToBf16(padd<Packet8f>(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf psub<Packet8bf>(const Packet8bf& a, const Packet8bf& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf psub<Packet8bf>(const Packet8bf& a, const Packet8bf& b) {
   return F32ToBf16(psub<Packet8f>(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf pmul<Packet8bf>(const Packet8bf& a, const Packet8bf& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf pmul<Packet8bf>(const Packet8bf& a, const Packet8bf& b) {
   return F32ToBf16(pmul<Packet8f>(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf pdiv<Packet8bf>(const Packet8bf& a, const Packet8bf& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf pdiv<Packet8bf>(const Packet8bf& a, const Packet8bf& b) {
   return F32ToBf16(pdiv<Packet8f>(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
-
-template<> EIGEN_STRONG_INLINE Packet8bf pgather<bfloat16, Packet8bf>(const bfloat16* from, Index stride)
-{
-  const numext::uint16_t s0 = numext::bit_cast<numext::uint16_t>(from[0*stride]);
-  const numext::uint16_t s1 = numext::bit_cast<numext::uint16_t>(from[1*stride]);
-  const numext::uint16_t s2 = numext::bit_cast<numext::uint16_t>(from[2*stride]);
-  const numext::uint16_t s3 = numext::bit_cast<numext::uint16_t>(from[3*stride]);
-  const numext::uint16_t s4 = numext::bit_cast<numext::uint16_t>(from[4*stride]);
-  const numext::uint16_t s5 = numext::bit_cast<numext::uint16_t>(from[5*stride]);
-  const numext::uint16_t s6 = numext::bit_cast<numext::uint16_t>(from[6*stride]);
-  const numext::uint16_t s7 = numext::bit_cast<numext::uint16_t>(from[7*stride]);
+template <>
+EIGEN_STRONG_INLINE Packet8bf pgather<bfloat16, Packet8bf>(const bfloat16* from, Index stride) {
+  const numext::uint16_t s0 = numext::bit_cast<numext::uint16_t>(from[0 * stride]);
+  const numext::uint16_t s1 = numext::bit_cast<numext::uint16_t>(from[1 * stride]);
+  const numext::uint16_t s2 = numext::bit_cast<numext::uint16_t>(from[2 * stride]);
+  const numext::uint16_t s3 = numext::bit_cast<numext::uint16_t>(from[3 * stride]);
+  const numext::uint16_t s4 = numext::bit_cast<numext::uint16_t>(from[4 * stride]);
+  const numext::uint16_t s5 = numext::bit_cast<numext::uint16_t>(from[5 * stride]);
+  const numext::uint16_t s6 = numext::bit_cast<numext::uint16_t>(from[6 * stride]);
+  const numext::uint16_t s7 = numext::bit_cast<numext::uint16_t>(from[7 * stride]);
   return _mm_set_epi16(s7, s6, s5, s4, s3, s2, s1, s0);
 }
 
-template<> EIGEN_STRONG_INLINE void pscatter<bfloat16, Packet8bf>(bfloat16* to, const Packet8bf& from, Index stride)
-{
+template <>
+EIGEN_STRONG_INLINE void pscatter<bfloat16, Packet8bf>(bfloat16* to, const Packet8bf& from, Index stride) {
   EIGEN_ALIGN32 bfloat16 aux[8];
   pstore(aux, from);
-  to[stride*0] = aux[0];
-  to[stride*1] = aux[1];
-  to[stride*2] = aux[2];
-  to[stride*3] = aux[3];
-  to[stride*4] = aux[4];
-  to[stride*5] = aux[5];
-  to[stride*6] = aux[6];
-  to[stride*7] = aux[7];
+  to[stride * 0] = aux[0];
+  to[stride * 1] = aux[1];
+  to[stride * 2] = aux[2];
+  to[stride * 3] = aux[3];
+  to[stride * 4] = aux[4];
+  to[stride * 5] = aux[5];
+  to[stride * 6] = aux[6];
+  to[stride * 7] = aux[7];
 }
 
-template<> EIGEN_STRONG_INLINE bfloat16 predux<Packet8bf>(const Packet8bf& a) {
+template <>
+EIGEN_STRONG_INLINE bfloat16 predux<Packet8bf>(const Packet8bf& a) {
   return static_cast<bfloat16>(predux<Packet8f>(Bf16ToF32(a)));
 }
 
-template<> EIGEN_STRONG_INLINE bfloat16 predux_max<Packet8bf>(const Packet8bf& a) {
+template <>
+EIGEN_STRONG_INLINE bfloat16 predux_max<Packet8bf>(const Packet8bf& a) {
   return static_cast<bfloat16>(predux_max<Packet8f>(Bf16ToF32(a)));
 }
 
-template<> EIGEN_STRONG_INLINE bfloat16 predux_min<Packet8bf>(const Packet8bf& a) {
+template <>
+EIGEN_STRONG_INLINE bfloat16 predux_min<Packet8bf>(const Packet8bf& a) {
   return static_cast<bfloat16>(predux_min<Packet8f>(Bf16ToF32(a)));
 }
 
-template<> EIGEN_STRONG_INLINE bfloat16 predux_mul<Packet8bf>(const Packet8bf& a) {
+template <>
+EIGEN_STRONG_INLINE bfloat16 predux_mul<Packet8bf>(const Packet8bf& a) {
   return static_cast<bfloat16>(predux_mul<Packet8f>(Bf16ToF32(a)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf preverse(const Packet8bf& a)
-{
-  __m128i m = _mm_setr_epi8(14,15,12,13,10,11,8,9,6,7,4,5,2,3,0,1);
-  return _mm_shuffle_epi8(a,m);
+template <>
+EIGEN_STRONG_INLINE Packet8bf preverse(const Packet8bf& a) {
+  __m128i m = _mm_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1);
+  return _mm_shuffle_epi8(a, m);
 }
 
-EIGEN_STRONG_INLINE void
-ptranspose(PacketBlock<Packet8bf,8>& kernel) {
+EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet8bf, 8>& kernel) {
   __m128i a = kernel.packet[0];
   __m128i b = kernel.packet[1];
   __m128i c = kernel.packet[2];
@@ -2387,8 +2832,7 @@
   kernel.packet[7] = _mm_unpackhi_epi64(a67b67c67d67, e67f67g67h67);
 }
 
-EIGEN_STRONG_INLINE void
-ptranspose(PacketBlock<Packet8bf,4>& kernel) {
+EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet8bf, 4>& kernel) {
   __m128i a = kernel.packet[0];
   __m128i b = kernel.packet[1];
   __m128i c = kernel.packet[2];
@@ -2405,8 +2849,8 @@
   kernel.packet[3] = _mm_unpackhi_epi32(ab_47, cd_47);
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_PACKET_MATH_AVX_H
+#endif  // EIGEN_PACKET_MATH_AVX_H
diff --git a/Eigen/src/Core/arch/AVX/TypeCasting.h b/Eigen/src/Core/arch/AVX/TypeCasting.h
index 49927b8..3688f8d 100644
--- a/Eigen/src/Core/arch/AVX/TypeCasting.h
+++ b/Eigen/src/Core/arch/AVX/TypeCasting.h
@@ -18,28 +18,39 @@
 namespace internal {
 
 #ifndef EIGEN_VECTORIZE_AVX512
-template<> struct type_casting_traits<float, bool> : vectorized_type_casting_traits<float, bool> {};
-template<> struct type_casting_traits<bool, float> : vectorized_type_casting_traits<bool, float> {};
+template <>
+struct type_casting_traits<float, bool> : vectorized_type_casting_traits<float, bool> {};
+template <>
+struct type_casting_traits<bool, float> : vectorized_type_casting_traits<bool, float> {};
 
-template<> struct type_casting_traits<float, int> : vectorized_type_casting_traits<float, int> {};
-template<> struct type_casting_traits<int, float> : vectorized_type_casting_traits<int, float> {};
+template <>
+struct type_casting_traits<float, int> : vectorized_type_casting_traits<float, int> {};
+template <>
+struct type_casting_traits<int, float> : vectorized_type_casting_traits<int, float> {};
 
-template<> struct type_casting_traits<float, double> : vectorized_type_casting_traits<float, double> {};
-template<> struct type_casting_traits<double, float> : vectorized_type_casting_traits<double, float> {};
+template <>
+struct type_casting_traits<float, double> : vectorized_type_casting_traits<float, double> {};
+template <>
+struct type_casting_traits<double, float> : vectorized_type_casting_traits<double, float> {};
 
-template<> struct type_casting_traits<double, int> : vectorized_type_casting_traits<double, int> {};
-template<> struct type_casting_traits<int, double> : vectorized_type_casting_traits<int, double> {};
+template <>
+struct type_casting_traits<double, int> : vectorized_type_casting_traits<double, int> {};
+template <>
+struct type_casting_traits<int, double> : vectorized_type_casting_traits<int, double> {};
 
-template<> struct type_casting_traits<half, float> : vectorized_type_casting_traits<half, float> {};
-template<> struct type_casting_traits<float, half> : vectorized_type_casting_traits<float, half> {};
+template <>
+struct type_casting_traits<half, float> : vectorized_type_casting_traits<half, float> {};
+template <>
+struct type_casting_traits<float, half> : vectorized_type_casting_traits<float, half> {};
 
-template<> struct type_casting_traits<bfloat16, float> : vectorized_type_casting_traits<bfloat16, float> {};
-template<> struct type_casting_traits<float, bfloat16> : vectorized_type_casting_traits<float, bfloat16> {};
+template <>
+struct type_casting_traits<bfloat16, float> : vectorized_type_casting_traits<bfloat16, float> {};
+template <>
+struct type_casting_traits<float, bfloat16> : vectorized_type_casting_traits<float, bfloat16> {};
 #endif
 
 template <>
-EIGEN_STRONG_INLINE Packet16b pcast<Packet8f, Packet16b>(const Packet8f& a,
-                                                         const Packet8f& b) {
+EIGEN_STRONG_INLINE Packet16b pcast<Packet8f, Packet16b>(const Packet8f& a, const Packet8f& b) {
   __m256 nonzero_a = _mm256_cmp_ps(a, pzero(a), _CMP_NEQ_UQ);
   __m256 nonzero_b = _mm256_cmp_ps(b, pzero(b), _CMP_NEQ_UQ);
   constexpr char kFF = '\255';
@@ -54,11 +65,11 @@
   __m128i b_lo = _mm_shuffle_epi8(_mm256_extractf128_si256(_mm256_castps_si256(nonzero_b), 0), shuffle_mask128_b_lo);
   __m128i merged = _mm_or_si128(_mm_or_si128(b_lo, b_hi), _mm_or_si128(a_lo, a_hi));
   return _mm_and_si128(merged, _mm_set1_epi8(1));
- #else
-  __m256i a_shuffle_mask = _mm256_set_epi8(kFF, kFF, kFF, kFF, kFF, kFF, kFF, kFF,  12,   8,   4,   0, kFF, kFF, kFF, kFF,
-                                           kFF, kFF, kFF, kFF, kFF, kFF, kFF, kFF, kFF, kFF, kFF, kFF,  12,   8,   4,   0);
-  __m256i b_shuffle_mask = _mm256_set_epi8( 12,   8,   4,   0, kFF, kFF, kFF, kFF, kFF, kFF, kFF, kFF, kFF, kFF, kFF, kFF,
-                                           kFF, kFF, kFF, kFF,  12,   8,   4,   0, kFF, kFF, kFF, kFF, kFF, kFF, kFF, kFF);
+#else
+  __m256i a_shuffle_mask = _mm256_set_epi8(kFF, kFF, kFF, kFF, kFF, kFF, kFF, kFF, 12, 8, 4, 0, kFF, kFF, kFF, kFF, kFF,
+                                           kFF, kFF, kFF, kFF, kFF, kFF, kFF, kFF, kFF, kFF, kFF, 12, 8, 4, 0);
+  __m256i b_shuffle_mask = _mm256_set_epi8(12, 8, 4, 0, kFF, kFF, kFF, kFF, kFF, kFF, kFF, kFF, kFF, kFF, kFF, kFF, kFF,
+                                           kFF, kFF, kFF, 12, 8, 4, 0, kFF, kFF, kFF, kFF, kFF, kFF, kFF, kFF);
   __m256i a_shuff = _mm256_shuffle_epi8(_mm256_castps_si256(nonzero_a), a_shuffle_mask);
   __m256i b_shuff = _mm256_shuffle_epi8(_mm256_castps_si256(nonzero_b), b_shuffle_mask);
   __m256i a_or_b = _mm256_or_si256(a_shuff, b_shuff);
@@ -70,124 +81,147 @@
 template <>
 EIGEN_STRONG_INLINE Packet8f pcast<Packet16b, Packet8f>(const Packet16b& a) {
   const __m256 cst_one = _mm256_set1_ps(1.0f);
-  #ifdef EIGEN_VECTORIZE_AVX2
+#ifdef EIGEN_VECTORIZE_AVX2
   __m256i a_extended = _mm256_cvtepi8_epi32(a);
   __m256i abcd_efgh = _mm256_cmpeq_epi32(a_extended, _mm256_setzero_si256());
-  #else
+#else
   __m128i abcd_efhg_ijkl_mnop = _mm_cmpeq_epi8(a, _mm_setzero_si128());
   __m128i aabb_ccdd_eeff_gghh = _mm_unpacklo_epi8(abcd_efhg_ijkl_mnop, abcd_efhg_ijkl_mnop);
   __m128i aaaa_bbbb_cccc_dddd = _mm_unpacklo_epi8(aabb_ccdd_eeff_gghh, aabb_ccdd_eeff_gghh);
   __m128i eeee_ffff_gggg_hhhh = _mm_unpackhi_epi8(aabb_ccdd_eeff_gghh, aabb_ccdd_eeff_gghh);
   __m256i abcd_efgh = _mm256_setr_m128i(aaaa_bbbb_cccc_dddd, eeee_ffff_gggg_hhhh);
-  #endif
+#endif
   __m256 result = _mm256_andnot_ps(_mm256_castsi256_ps(abcd_efgh), cst_one);
   return result;
 }
 
-template<> EIGEN_STRONG_INLINE Packet8i pcast<Packet8f, Packet8i>(const Packet8f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8i pcast<Packet8f, Packet8i>(const Packet8f& a) {
   return _mm256_cvttps_epi32(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8i pcast<Packet4d, Packet8i>(const Packet4d& a, const Packet4d& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8i pcast<Packet4d, Packet8i>(const Packet4d& a, const Packet4d& b) {
   return _mm256_set_m128i(_mm256_cvttpd_epi32(b), _mm256_cvttpd_epi32(a));
 }
 
-template <> EIGEN_STRONG_INLINE Packet4i pcast<Packet4d, Packet4i>(const Packet4d& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4i pcast<Packet4d, Packet4i>(const Packet4d& a) {
   return _mm256_cvttpd_epi32(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8f pcast<Packet8i, Packet8f>(const Packet8i& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8f pcast<Packet8i, Packet8f>(const Packet8i& a) {
   return _mm256_cvtepi32_ps(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8f pcast<Packet4d, Packet8f>(const Packet4d& a, const Packet4d& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8f pcast<Packet4d, Packet8f>(const Packet4d& a, const Packet4d& b) {
   return _mm256_set_m128(_mm256_cvtpd_ps(b), _mm256_cvtpd_ps(a));
 }
 
-template <> EIGEN_STRONG_INLINE Packet4f pcast<Packet4d, Packet4f>(const Packet4d& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4f pcast<Packet4d, Packet4f>(const Packet4d& a) {
   return _mm256_cvtpd_ps(a);
 }
 
-template <> EIGEN_STRONG_INLINE Packet4d pcast<Packet8i, Packet4d>(const Packet8i& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4d pcast<Packet8i, Packet4d>(const Packet8i& a) {
   return _mm256_cvtepi32_pd(_mm256_castsi256_si128(a));
 }
 
-template <> EIGEN_STRONG_INLINE Packet4d pcast<Packet4i, Packet4d>(const Packet4i& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4d pcast<Packet4i, Packet4d>(const Packet4i& a) {
   return _mm256_cvtepi32_pd(a);
 }
 
-template <> EIGEN_STRONG_INLINE Packet4d pcast<Packet8f, Packet4d>(const Packet8f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4d pcast<Packet8f, Packet4d>(const Packet8f& a) {
   return _mm256_cvtps_pd(_mm256_castps256_ps128(a));
 }
 
-template <> EIGEN_STRONG_INLINE Packet4d pcast<Packet4f, Packet4d>(const Packet4f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4d pcast<Packet4f, Packet4d>(const Packet4f& a) {
   return _mm256_cvtps_pd(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8i preinterpret<Packet8i,Packet8f>(const Packet8f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8i preinterpret<Packet8i, Packet8f>(const Packet8f& a) {
   return _mm256_castps_si256(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8f preinterpret<Packet8f,Packet8i>(const Packet8i& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8f preinterpret<Packet8f, Packet8i>(const Packet8i& a) {
   return _mm256_castsi256_ps(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8ui preinterpret<Packet8ui, Packet8i>(const Packet8i& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8ui preinterpret<Packet8ui, Packet8i>(const Packet8i& a) {
   return Packet8ui(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8i preinterpret<Packet8i, Packet8ui>(const Packet8ui& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8i preinterpret<Packet8i, Packet8ui>(const Packet8ui& a) {
   return Packet8i(a);
 }
 
 // truncation operations
 
-template<> EIGEN_STRONG_INLINE Packet4f preinterpret<Packet4f, Packet8f>(const Packet8f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4f preinterpret<Packet4f, Packet8f>(const Packet8f& a) {
   return _mm256_castps256_ps128(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2d preinterpret<Packet2d, Packet4d>(const Packet4d& a) {
+template <>
+EIGEN_STRONG_INLINE Packet2d preinterpret<Packet2d, Packet4d>(const Packet4d& a) {
   return _mm256_castpd256_pd128(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4i preinterpret<Packet4i, Packet8i>(const Packet8i& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4i preinterpret<Packet4i, Packet8i>(const Packet8i& a) {
   return _mm256_castsi256_si128(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4ui preinterpret<Packet4ui, Packet8ui>(const Packet8ui& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4ui preinterpret<Packet4ui, Packet8ui>(const Packet8ui& a) {
   return _mm256_castsi256_si128(a);
 }
 
-
 #ifdef EIGEN_VECTORIZE_AVX2
-template<> EIGEN_STRONG_INLINE Packet4ul preinterpret<Packet4ul, Packet4l>(const Packet4l& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4ul preinterpret<Packet4ul, Packet4l>(const Packet4l& a) {
   return Packet4ul(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4l preinterpret<Packet4l, Packet4ul>(const Packet4ul& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4l preinterpret<Packet4l, Packet4ul>(const Packet4ul& a) {
   return Packet4l(a);
 }
 
 #endif
 
-template<> EIGEN_STRONG_INLINE Packet8f pcast<Packet8h, Packet8f>(const Packet8h& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8f pcast<Packet8h, Packet8f>(const Packet8h& a) {
   return half2float(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8f pcast<Packet8bf, Packet8f>(const Packet8bf& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8f pcast<Packet8bf, Packet8f>(const Packet8bf& a) {
   return Bf16ToF32(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8h pcast<Packet8f, Packet8h>(const Packet8f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8h pcast<Packet8f, Packet8h>(const Packet8f& a) {
   return float2half(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf pcast<Packet8f, Packet8bf>(const Packet8f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf pcast<Packet8f, Packet8bf>(const Packet8f& a) {
   return F32ToBf16(a);
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_TYPE_CASTING_AVX_H
+#endif  // EIGEN_TYPE_CASTING_AVX_H
diff --git a/Eigen/src/Core/arch/AVX512/Complex.h b/Eigen/src/Core/arch/AVX512/Complex.h
index c484517..f2c8ce6 100644
--- a/Eigen/src/Core/arch/AVX512/Complex.h
+++ b/Eigen/src/Core/arch/AVX512/Complex.h
@@ -18,15 +18,14 @@
 namespace internal {
 
 //---------- float ----------
-struct Packet8cf
-{
+struct Packet8cf {
   EIGEN_STRONG_INLINE Packet8cf() {}
   EIGEN_STRONG_INLINE explicit Packet8cf(const __m512& a) : v(a) {}
-  __m512  v;
+  __m512 v;
 };
 
-template<> struct packet_traits<std::complex<float> >  : default_packet_traits
-{
+template <>
+struct packet_traits<std::complex<float> > : default_packet_traits {
   typedef Packet8cf type;
   typedef Packet4cf half;
   enum {
@@ -34,58 +33,80 @@
     AlignedOnScalar = 1,
     size = 8,
 
-    HasAdd    = 1,
-    HasSub    = 1,
-    HasMul    = 1,
-    HasDiv    = 1,
+    HasAdd = 1,
+    HasSub = 1,
+    HasMul = 1,
+    HasDiv = 1,
     HasNegate = 1,
-    HasSqrt   = 1,
-    HasAbs    = 0,
-    HasAbs2   = 0,
-    HasMin    = 0,
-    HasMax    = 0,
+    HasSqrt = 1,
+    HasAbs = 0,
+    HasAbs2 = 0,
+    HasMin = 0,
+    HasMax = 0,
     HasSetLinear = 0
   };
 };
 
-template<> struct unpacket_traits<Packet8cf> {
+template <>
+struct unpacket_traits<Packet8cf> {
   typedef std::complex<float> type;
   typedef Packet4cf half;
   typedef Packet16f as_real;
   enum {
     size = 8,
-    alignment=unpacket_traits<Packet16f>::alignment,
-    vectorizable=true,
-    masked_load_available=false,
-    masked_store_available=false
+    alignment = unpacket_traits<Packet16f>::alignment,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
   };
 };
 
-template<> EIGEN_STRONG_INLINE Packet8cf ptrue<Packet8cf>(const Packet8cf& a) { return Packet8cf(ptrue(Packet16f(a.v))); }
-template<> EIGEN_STRONG_INLINE Packet8cf padd<Packet8cf>(const Packet8cf& a, const Packet8cf& b) { return Packet8cf(_mm512_add_ps(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet8cf psub<Packet8cf>(const Packet8cf& a, const Packet8cf& b) { return Packet8cf(_mm512_sub_ps(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet8cf pnegate(const Packet8cf& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8cf ptrue<Packet8cf>(const Packet8cf& a) {
+  return Packet8cf(ptrue(Packet16f(a.v)));
+}
+template <>
+EIGEN_STRONG_INLINE Packet8cf padd<Packet8cf>(const Packet8cf& a, const Packet8cf& b) {
+  return Packet8cf(_mm512_add_ps(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet8cf psub<Packet8cf>(const Packet8cf& a, const Packet8cf& b) {
+  return Packet8cf(_mm512_sub_ps(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet8cf pnegate(const Packet8cf& a) {
   return Packet8cf(pnegate(a.v));
 }
-template<> EIGEN_STRONG_INLINE Packet8cf pconj(const Packet8cf& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8cf pconj(const Packet8cf& a) {
   const __m512 mask = _mm512_castsi512_ps(_mm512_setr_epi32(
-    0x00000000,0x80000000,0x00000000,0x80000000,0x00000000,0x80000000,0x00000000,0x80000000,
-    0x00000000,0x80000000,0x00000000,0x80000000,0x00000000,0x80000000,0x00000000,0x80000000));
-  return Packet8cf(pxor(a.v,mask));
+      0x00000000, 0x80000000, 0x00000000, 0x80000000, 0x00000000, 0x80000000, 0x00000000, 0x80000000, 0x00000000,
+      0x80000000, 0x00000000, 0x80000000, 0x00000000, 0x80000000, 0x00000000, 0x80000000));
+  return Packet8cf(pxor(a.v, mask));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8cf pmul<Packet8cf>(const Packet8cf& a, const Packet8cf& b)
-{
-  __m512 tmp2 = _mm512_mul_ps(_mm512_movehdup_ps(a.v), _mm512_permute_ps(b.v, _MM_SHUFFLE(2,3,0,1)));
+template <>
+EIGEN_STRONG_INLINE Packet8cf pmul<Packet8cf>(const Packet8cf& a, const Packet8cf& b) {
+  __m512 tmp2 = _mm512_mul_ps(_mm512_movehdup_ps(a.v), _mm512_permute_ps(b.v, _MM_SHUFFLE(2, 3, 0, 1)));
   return Packet8cf(_mm512_fmaddsub_ps(_mm512_moveldup_ps(a.v), b.v, tmp2));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8cf pand   <Packet8cf>(const Packet8cf& a, const Packet8cf& b) { return Packet8cf(pand(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet8cf por    <Packet8cf>(const Packet8cf& a, const Packet8cf& b) { return Packet8cf(por(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet8cf pxor   <Packet8cf>(const Packet8cf& a, const Packet8cf& b) { return Packet8cf(pxor(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet8cf pandnot<Packet8cf>(const Packet8cf& a, const Packet8cf& b) { return Packet8cf(pandnot(a.v,b.v)); }
+template <>
+EIGEN_STRONG_INLINE Packet8cf pand<Packet8cf>(const Packet8cf& a, const Packet8cf& b) {
+  return Packet8cf(pand(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet8cf por<Packet8cf>(const Packet8cf& a, const Packet8cf& b) {
+  return Packet8cf(por(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet8cf pxor<Packet8cf>(const Packet8cf& a, const Packet8cf& b) {
+  return Packet8cf(pxor(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet8cf pandnot<Packet8cf>(const Packet8cf& a, const Packet8cf& b) {
+  return Packet8cf(pandnot(a.v, b.v));
+}
 
 template <>
 EIGEN_STRONG_INLINE Packet8cf pcmp_eq(const Packet8cf& a, const Packet8cf& b) {
@@ -93,60 +114,71 @@
   return Packet8cf(pand(eq, _mm512_permute_ps(eq, 0xB1)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8cf pload <Packet8cf>(const std::complex<float>* from) { EIGEN_DEBUG_ALIGNED_LOAD return Packet8cf(pload<Packet16f>(&numext::real_ref(*from))); }
-template<> EIGEN_STRONG_INLINE Packet8cf ploadu<Packet8cf>(const std::complex<float>* from) { EIGEN_DEBUG_UNALIGNED_LOAD return Packet8cf(ploadu<Packet16f>(&numext::real_ref(*from))); }
+template <>
+EIGEN_STRONG_INLINE Packet8cf pload<Packet8cf>(const std::complex<float>* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return Packet8cf(pload<Packet16f>(&numext::real_ref(*from)));
+}
+template <>
+EIGEN_STRONG_INLINE Packet8cf ploadu<Packet8cf>(const std::complex<float>* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return Packet8cf(ploadu<Packet16f>(&numext::real_ref(*from)));
+}
 
-
-template<> EIGEN_STRONG_INLINE Packet8cf pset1<Packet8cf>(const std::complex<float>& from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8cf pset1<Packet8cf>(const std::complex<float>& from) {
   const float re = std::real(from);
   const float im = std::imag(from);
   return Packet8cf(_mm512_set_ps(im, re, im, re, im, re, im, re, im, re, im, re, im, re, im, re));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8cf ploaddup<Packet8cf>(const std::complex<float>* from)
-{
-  return Packet8cf( _mm512_castpd_ps( ploaddup<Packet8d>((const double*)(const void*)from )) );
+template <>
+EIGEN_STRONG_INLINE Packet8cf ploaddup<Packet8cf>(const std::complex<float>* from) {
+  return Packet8cf(_mm512_castpd_ps(ploaddup<Packet8d>((const double*)(const void*)from)));
 }
-template<> EIGEN_STRONG_INLINE Packet8cf ploadquad<Packet8cf>(const std::complex<float>* from)
-{
-  return Packet8cf( _mm512_castpd_ps( ploadquad<Packet8d>((const double*)(const void*)from )) );
+template <>
+EIGEN_STRONG_INLINE Packet8cf ploadquad<Packet8cf>(const std::complex<float>* from) {
+  return Packet8cf(_mm512_castpd_ps(ploadquad<Packet8d>((const double*)(const void*)from)));
 }
 
-template<> EIGEN_STRONG_INLINE void pstore <std::complex<float> >(std::complex<float>* to, const Packet8cf& from) { EIGEN_DEBUG_ALIGNED_STORE pstore(&numext::real_ref(*to), from.v); }
-template<> EIGEN_STRONG_INLINE void pstoreu<std::complex<float> >(std::complex<float>* to, const Packet8cf& from) { EIGEN_DEBUG_UNALIGNED_STORE pstoreu(&numext::real_ref(*to), from.v); }
-
-template<> EIGEN_DEVICE_FUNC inline Packet8cf pgather<std::complex<float>, Packet8cf>(const std::complex<float>* from, Index stride)
-{
-  return Packet8cf(_mm512_castpd_ps(pgather<double,Packet8d>((const double*)(const void*)from, stride)));
+template <>
+EIGEN_STRONG_INLINE void pstore<std::complex<float> >(std::complex<float>* to, const Packet8cf& from) {
+  EIGEN_DEBUG_ALIGNED_STORE pstore(&numext::real_ref(*to), from.v);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<std::complex<float> >(std::complex<float>* to, const Packet8cf& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE pstoreu(&numext::real_ref(*to), from.v);
 }
 
-template<> EIGEN_DEVICE_FUNC inline void pscatter<std::complex<float>, Packet8cf>(std::complex<float>* to, const Packet8cf& from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC inline Packet8cf pgather<std::complex<float>, Packet8cf>(const std::complex<float>* from,
+                                                                           Index stride) {
+  return Packet8cf(_mm512_castpd_ps(pgather<double, Packet8d>((const double*)(const void*)from, stride)));
+}
+
+template <>
+EIGEN_DEVICE_FUNC inline void pscatter<std::complex<float>, Packet8cf>(std::complex<float>* to, const Packet8cf& from,
+                                                                       Index stride) {
   pscatter((double*)(void*)to, _mm512_castps_pd(from.v), stride);
 }
 
-template<> EIGEN_STRONG_INLINE std::complex<float>  pfirst<Packet8cf>(const Packet8cf& a)
-{
+template <>
+EIGEN_STRONG_INLINE std::complex<float> pfirst<Packet8cf>(const Packet8cf& a) {
   return pfirst(Packet2cf(_mm512_castps512_ps128(a.v)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8cf preverse(const Packet8cf& a) {
-  return Packet8cf(_mm512_castsi512_ps(
-            _mm512_permutexvar_epi64( _mm512_set_epi32(0, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7),
-                                      _mm512_castps_si512(a.v))));
+template <>
+EIGEN_STRONG_INLINE Packet8cf preverse(const Packet8cf& a) {
+  return Packet8cf(_mm512_castsi512_ps(_mm512_permutexvar_epi64(
+      _mm512_set_epi32(0, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7), _mm512_castps_si512(a.v))));
 }
 
-template<> EIGEN_STRONG_INLINE std::complex<float> predux<Packet8cf>(const Packet8cf& a)
-{
-  return predux(padd(Packet4cf(extract256<0>(a.v)),
-                     Packet4cf(extract256<1>(a.v))));
+template <>
+EIGEN_STRONG_INLINE std::complex<float> predux<Packet8cf>(const Packet8cf& a) {
+  return predux(padd(Packet4cf(extract256<0>(a.v)), Packet4cf(extract256<1>(a.v))));
 }
 
-template<> EIGEN_STRONG_INLINE std::complex<float> predux_mul<Packet8cf>(const Packet8cf& a)
-{
-  return predux_mul(pmul(Packet4cf(extract256<0>(a.v)),
-                         Packet4cf(extract256<1>(a.v))));
+template <>
+EIGEN_STRONG_INLINE std::complex<float> predux_mul<Packet8cf>(const Packet8cf& a) {
+  return predux_mul(pmul(Packet4cf(extract256<0>(a.v)), Packet4cf(extract256<1>(a.v))));
 }
 
 template <>
@@ -157,28 +189,27 @@
   return Packet4cf(res);
 }
 
-EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet8cf,Packet16f)
+EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet8cf, Packet16f)
 
-template<> EIGEN_STRONG_INLINE Packet8cf pdiv<Packet8cf>(const Packet8cf& a, const Packet8cf& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8cf pdiv<Packet8cf>(const Packet8cf& a, const Packet8cf& b) {
   return pdiv_complex(a, b);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8cf pcplxflip<Packet8cf>(const Packet8cf& x)
-{
-  return Packet8cf(_mm512_shuffle_ps(x.v, x.v, _MM_SHUFFLE(2, 3, 0 ,1)));
+template <>
+EIGEN_STRONG_INLINE Packet8cf pcplxflip<Packet8cf>(const Packet8cf& x) {
+  return Packet8cf(_mm512_shuffle_ps(x.v, x.v, _MM_SHUFFLE(2, 3, 0, 1)));
 }
 
 //---------- double ----------
-struct Packet4cd
-{
+struct Packet4cd {
   EIGEN_STRONG_INLINE Packet4cd() {}
   EIGEN_STRONG_INLINE explicit Packet4cd(const __m512d& a) : v(a) {}
-  __m512d  v;
+  __m512d v;
 };
 
-template<> struct packet_traits<std::complex<double> >  : default_packet_traits
-{
+template <>
+struct packet_traits<std::complex<double> > : default_packet_traits {
   typedef Packet4cd type;
   typedef Packet2cd half;
   enum {
@@ -186,58 +217,82 @@
     AlignedOnScalar = 0,
     size = 4,
 
-    HasAdd    = 1,
-    HasSub    = 1,
-    HasMul    = 1,
-    HasDiv    = 1,
+    HasAdd = 1,
+    HasSub = 1,
+    HasMul = 1,
+    HasDiv = 1,
     HasNegate = 1,
-    HasSqrt   = 1,
-    HasAbs    = 0,
-    HasAbs2   = 0,
-    HasMin    = 0,
-    HasMax    = 0,
+    HasSqrt = 1,
+    HasAbs = 0,
+    HasAbs2 = 0,
+    HasMin = 0,
+    HasMax = 0,
     HasSetLinear = 0
   };
 };
 
-template<> struct unpacket_traits<Packet4cd> {
+template <>
+struct unpacket_traits<Packet4cd> {
   typedef std::complex<double> type;
   typedef Packet2cd half;
   typedef Packet8d as_real;
   enum {
     size = 4,
     alignment = unpacket_traits<Packet8d>::alignment,
-    vectorizable=true,
-    masked_load_available=false,
-    masked_store_available=false
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
   };
 };
 
-template<> EIGEN_STRONG_INLINE Packet4cd padd<Packet4cd>(const Packet4cd& a, const Packet4cd& b) { return Packet4cd(_mm512_add_pd(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet4cd psub<Packet4cd>(const Packet4cd& a, const Packet4cd& b) { return Packet4cd(_mm512_sub_pd(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet4cd pnegate(const Packet4cd& a) { return Packet4cd(pnegate(a.v)); }
-template<> EIGEN_STRONG_INLINE Packet4cd pconj(const Packet4cd& a)
-{
-  const __m512d mask = _mm512_castsi512_pd(
-          _mm512_set_epi32(0x80000000,0x0,0x0,0x0,0x80000000,0x0,0x0,0x0,
-                           0x80000000,0x0,0x0,0x0,0x80000000,0x0,0x0,0x0));
-  return Packet4cd(pxor(a.v,mask));
+template <>
+EIGEN_STRONG_INLINE Packet4cd padd<Packet4cd>(const Packet4cd& a, const Packet4cd& b) {
+  return Packet4cd(_mm512_add_pd(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4cd psub<Packet4cd>(const Packet4cd& a, const Packet4cd& b) {
+  return Packet4cd(_mm512_sub_pd(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4cd pnegate(const Packet4cd& a) {
+  return Packet4cd(pnegate(a.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4cd pconj(const Packet4cd& a) {
+  const __m512d mask = _mm512_castsi512_pd(_mm512_set_epi32(0x80000000, 0x0, 0x0, 0x0, 0x80000000, 0x0, 0x0, 0x0,
+                                                            0x80000000, 0x0, 0x0, 0x0, 0x80000000, 0x0, 0x0, 0x0));
+  return Packet4cd(pxor(a.v, mask));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4cd pmul<Packet4cd>(const Packet4cd& a, const Packet4cd& b)
-{
-  __m512d tmp1 = _mm512_shuffle_pd(a.v,a.v,0x0);
-  __m512d tmp2 = _mm512_shuffle_pd(a.v,a.v,0xFF);
-  __m512d tmp3 = _mm512_shuffle_pd(b.v,b.v,0x55);
-  __m512d odd  = _mm512_mul_pd(tmp2, tmp3);
+template <>
+EIGEN_STRONG_INLINE Packet4cd pmul<Packet4cd>(const Packet4cd& a, const Packet4cd& b) {
+  __m512d tmp1 = _mm512_shuffle_pd(a.v, a.v, 0x0);
+  __m512d tmp2 = _mm512_shuffle_pd(a.v, a.v, 0xFF);
+  __m512d tmp3 = _mm512_shuffle_pd(b.v, b.v, 0x55);
+  __m512d odd = _mm512_mul_pd(tmp2, tmp3);
   return Packet4cd(_mm512_fmaddsub_pd(tmp1, b.v, odd));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4cd ptrue<Packet4cd>(const Packet4cd& a) { return Packet4cd(ptrue(Packet8d(a.v))); }
-template<> EIGEN_STRONG_INLINE Packet4cd pand   <Packet4cd>(const Packet4cd& a, const Packet4cd& b) { return Packet4cd(pand(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet4cd por    <Packet4cd>(const Packet4cd& a, const Packet4cd& b) { return Packet4cd(por(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet4cd pxor   <Packet4cd>(const Packet4cd& a, const Packet4cd& b) { return Packet4cd(pxor(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet4cd pandnot<Packet4cd>(const Packet4cd& a, const Packet4cd& b) { return Packet4cd(pandnot(a.v,b.v)); }
+template <>
+EIGEN_STRONG_INLINE Packet4cd ptrue<Packet4cd>(const Packet4cd& a) {
+  return Packet4cd(ptrue(Packet8d(a.v)));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4cd pand<Packet4cd>(const Packet4cd& a, const Packet4cd& b) {
+  return Packet4cd(pand(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4cd por<Packet4cd>(const Packet4cd& a, const Packet4cd& b) {
+  return Packet4cd(por(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4cd pxor<Packet4cd>(const Packet4cd& a, const Packet4cd& b) {
+  return Packet4cd(pxor(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4cd pandnot<Packet4cd>(const Packet4cd& a, const Packet4cd& b) {
+  return Packet4cd(pandnot(a.v, b.v));
+}
 
 template <>
 EIGEN_STRONG_INLINE Packet4cd pcmp_eq(const Packet4cd& a, const Packet4cd& b) {
@@ -245,81 +300,95 @@
   return Packet4cd(pand(eq, _mm512_permute_pd(eq, 0x55)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4cd pload <Packet4cd>(const std::complex<double>* from)
-{ EIGEN_DEBUG_ALIGNED_LOAD return Packet4cd(pload<Packet8d>((const double*)from)); }
-template<> EIGEN_STRONG_INLINE Packet4cd ploadu<Packet4cd>(const std::complex<double>* from)
-{ EIGEN_DEBUG_UNALIGNED_LOAD return Packet4cd(ploadu<Packet8d>((const double*)from)); }
-
-template<> EIGEN_STRONG_INLINE Packet4cd pset1<Packet4cd>(const std::complex<double>& from)
-{
-  return Packet4cd(_mm512_castps_pd(_mm512_broadcast_f32x4( _mm_castpd_ps(pset1<Packet1cd>(from).v))));
+template <>
+EIGEN_STRONG_INLINE Packet4cd pload<Packet4cd>(const std::complex<double>* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return Packet4cd(pload<Packet8d>((const double*)from));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4cd ploadu<Packet4cd>(const std::complex<double>* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return Packet4cd(ploadu<Packet8d>((const double*)from));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4cd ploaddup<Packet4cd>(const std::complex<double>* from) {
+template <>
+EIGEN_STRONG_INLINE Packet4cd pset1<Packet4cd>(const std::complex<double>& from) {
+  return Packet4cd(_mm512_castps_pd(_mm512_broadcast_f32x4(_mm_castpd_ps(pset1<Packet1cd>(from).v))));
+}
+
+template <>
+EIGEN_STRONG_INLINE Packet4cd ploaddup<Packet4cd>(const std::complex<double>* from) {
+  return Packet4cd(
+      _mm512_insertf64x4(_mm512_castpd256_pd512(ploaddup<Packet2cd>(from).v), ploaddup<Packet2cd>(from + 1).v, 1));
+}
+
+template <>
+EIGEN_STRONG_INLINE void pstore<std::complex<double> >(std::complex<double>* to, const Packet4cd& from) {
+  EIGEN_DEBUG_ALIGNED_STORE pstore((double*)to, from.v);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<std::complex<double> >(std::complex<double>* to, const Packet4cd& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE pstoreu((double*)to, from.v);
+}
+
+template <>
+EIGEN_DEVICE_FUNC inline Packet4cd pgather<std::complex<double>, Packet4cd>(const std::complex<double>* from,
+                                                                            Index stride) {
   return Packet4cd(_mm512_insertf64x4(
-          _mm512_castpd256_pd512(ploaddup<Packet2cd>(from).v), ploaddup<Packet2cd>(from+1).v, 1));
+      _mm512_castpd256_pd512(_mm256_insertf128_pd(_mm256_castpd128_pd256(ploadu<Packet1cd>(from + 0 * stride).v),
+                                                  ploadu<Packet1cd>(from + 1 * stride).v, 1)),
+      _mm256_insertf128_pd(_mm256_castpd128_pd256(ploadu<Packet1cd>(from + 2 * stride).v),
+                           ploadu<Packet1cd>(from + 3 * stride).v, 1),
+      1));
 }
 
-template<> EIGEN_STRONG_INLINE void pstore <std::complex<double> >(std::complex<double> *   to, const Packet4cd& from) { EIGEN_DEBUG_ALIGNED_STORE pstore((double*)to, from.v); }
-template<> EIGEN_STRONG_INLINE void pstoreu<std::complex<double> >(std::complex<double> *   to, const Packet4cd& from) { EIGEN_DEBUG_UNALIGNED_STORE pstoreu((double*)to, from.v); }
-
-template<> EIGEN_DEVICE_FUNC inline Packet4cd pgather<std::complex<double>, Packet4cd>(const std::complex<double>* from, Index stride)
-{
-  return Packet4cd(_mm512_insertf64x4(_mm512_castpd256_pd512(
-            _mm256_insertf128_pd(_mm256_castpd128_pd256(ploadu<Packet1cd>(from+0*stride).v), ploadu<Packet1cd>(from+1*stride).v,1)),
-            _mm256_insertf128_pd(_mm256_castpd128_pd256(ploadu<Packet1cd>(from+2*stride).v), ploadu<Packet1cd>(from+3*stride).v,1), 1));
-}
-
-template<> EIGEN_DEVICE_FUNC inline void pscatter<std::complex<double>, Packet4cd>(std::complex<double>* to, const Packet4cd& from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC inline void pscatter<std::complex<double>, Packet4cd>(std::complex<double>* to, const Packet4cd& from,
+                                                                        Index stride) {
   __m512i fromi = _mm512_castpd_si512(from.v);
   double* tod = (double*)(void*)to;
-  _mm_storeu_pd(tod+0*stride, _mm_castsi128_pd(_mm512_extracti32x4_epi32(fromi,0)) );
-  _mm_storeu_pd(tod+2*stride, _mm_castsi128_pd(_mm512_extracti32x4_epi32(fromi,1)) );
-  _mm_storeu_pd(tod+4*stride, _mm_castsi128_pd(_mm512_extracti32x4_epi32(fromi,2)) );
-  _mm_storeu_pd(tod+6*stride, _mm_castsi128_pd(_mm512_extracti32x4_epi32(fromi,3)) );
+  _mm_storeu_pd(tod + 0 * stride, _mm_castsi128_pd(_mm512_extracti32x4_epi32(fromi, 0)));
+  _mm_storeu_pd(tod + 2 * stride, _mm_castsi128_pd(_mm512_extracti32x4_epi32(fromi, 1)));
+  _mm_storeu_pd(tod + 4 * stride, _mm_castsi128_pd(_mm512_extracti32x4_epi32(fromi, 2)));
+  _mm_storeu_pd(tod + 6 * stride, _mm_castsi128_pd(_mm512_extracti32x4_epi32(fromi, 3)));
 }
 
-template<> EIGEN_STRONG_INLINE std::complex<double> pfirst<Packet4cd>(const Packet4cd& a)
-{
+template <>
+EIGEN_STRONG_INLINE std::complex<double> pfirst<Packet4cd>(const Packet4cd& a) {
   __m128d low = extract128<0>(a.v);
   EIGEN_ALIGN16 double res[2];
   _mm_store_pd(res, low);
-  return std::complex<double>(res[0],res[1]);
+  return std::complex<double>(res[0], res[1]);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4cd preverse(const Packet4cd& a) {
-  return Packet4cd(_mm512_shuffle_f64x2(a.v, a.v, (shuffle_mask<3,2,1,0>::mask)));
+template <>
+EIGEN_STRONG_INLINE Packet4cd preverse(const Packet4cd& a) {
+  return Packet4cd(_mm512_shuffle_f64x2(a.v, a.v, (shuffle_mask<3, 2, 1, 0>::mask)));
 }
 
-template<> EIGEN_STRONG_INLINE std::complex<double> predux<Packet4cd>(const Packet4cd& a)
-{
-  return predux(padd(Packet2cd(_mm512_extractf64x4_pd(a.v,0)),
-                     Packet2cd(_mm512_extractf64x4_pd(a.v,1))));
+template <>
+EIGEN_STRONG_INLINE std::complex<double> predux<Packet4cd>(const Packet4cd& a) {
+  return predux(padd(Packet2cd(_mm512_extractf64x4_pd(a.v, 0)), Packet2cd(_mm512_extractf64x4_pd(a.v, 1))));
 }
 
-template<> EIGEN_STRONG_INLINE std::complex<double> predux_mul<Packet4cd>(const Packet4cd& a)
-{
-  return predux_mul(pmul(Packet2cd(_mm512_extractf64x4_pd(a.v,0)),
-                         Packet2cd(_mm512_extractf64x4_pd(a.v,1))));
+template <>
+EIGEN_STRONG_INLINE std::complex<double> predux_mul<Packet4cd>(const Packet4cd& a) {
+  return predux_mul(pmul(Packet2cd(_mm512_extractf64x4_pd(a.v, 0)), Packet2cd(_mm512_extractf64x4_pd(a.v, 1))));
 }
 
-EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet4cd,Packet8d)
+EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet4cd, Packet8d)
 
-template<> EIGEN_STRONG_INLINE Packet4cd pdiv<Packet4cd>(const Packet4cd& a, const Packet4cd& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4cd pdiv<Packet4cd>(const Packet4cd& a, const Packet4cd& b) {
   return pdiv_complex(a, b);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4cd pcplxflip<Packet4cd>(const Packet4cd& x)
-{
-  return Packet4cd(_mm512_permute_pd(x.v,0x55));
+template <>
+EIGEN_STRONG_INLINE Packet4cd pcplxflip<Packet4cd>(const Packet4cd& x) {
+  return Packet4cd(_mm512_permute_pd(x.v, 0x55));
 }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet8cf,4>& kernel) {
-  PacketBlock<Packet8d,4> pb;
-  
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet8cf, 4>& kernel) {
+  PacketBlock<Packet8d, 4> pb;
+
   pb.packet[0] = _mm512_castps_pd(kernel.packet[0].v);
   pb.packet[1] = _mm512_castps_pd(kernel.packet[1].v);
   pb.packet[2] = _mm512_castps_pd(kernel.packet[2].v);
@@ -331,10 +400,9 @@
   kernel.packet[3].v = _mm512_castpd_ps(pb.packet[3]);
 }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet8cf,8>& kernel) {
-  PacketBlock<Packet8d,8> pb;
-  
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet8cf, 8>& kernel) {
+  PacketBlock<Packet8d, 8> pb;
+
   pb.packet[0] = _mm512_castps_pd(kernel.packet[0].v);
   pb.packet[1] = _mm512_castps_pd(kernel.packet[1].v);
   pb.packet[2] = _mm512_castps_pd(kernel.packet[2].v);
@@ -354,28 +422,33 @@
   kernel.packet[7].v = _mm512_castpd_ps(pb.packet[7]);
 }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet4cd,4>& kernel) {
-  __m512d T0 = _mm512_shuffle_f64x2(kernel.packet[0].v, kernel.packet[1].v, (shuffle_mask<0,1,0,1>::mask)); // [a0 a1 b0 b1]
-  __m512d T1 = _mm512_shuffle_f64x2(kernel.packet[0].v, kernel.packet[1].v, (shuffle_mask<2,3,2,3>::mask)); // [a2 a3 b2 b3]
-  __m512d T2 = _mm512_shuffle_f64x2(kernel.packet[2].v, kernel.packet[3].v, (shuffle_mask<0,1,0,1>::mask)); // [c0 c1 d0 d1]
-  __m512d T3 = _mm512_shuffle_f64x2(kernel.packet[2].v, kernel.packet[3].v, (shuffle_mask<2,3,2,3>::mask)); // [c2 c3 d2 d3]
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet4cd, 4>& kernel) {
+  __m512d T0 =
+      _mm512_shuffle_f64x2(kernel.packet[0].v, kernel.packet[1].v, (shuffle_mask<0, 1, 0, 1>::mask));  // [a0 a1 b0 b1]
+  __m512d T1 =
+      _mm512_shuffle_f64x2(kernel.packet[0].v, kernel.packet[1].v, (shuffle_mask<2, 3, 2, 3>::mask));  // [a2 a3 b2 b3]
+  __m512d T2 =
+      _mm512_shuffle_f64x2(kernel.packet[2].v, kernel.packet[3].v, (shuffle_mask<0, 1, 0, 1>::mask));  // [c0 c1 d0 d1]
+  __m512d T3 =
+      _mm512_shuffle_f64x2(kernel.packet[2].v, kernel.packet[3].v, (shuffle_mask<2, 3, 2, 3>::mask));  // [c2 c3 d2 d3]
 
-  kernel.packet[3] = Packet4cd(_mm512_shuffle_f64x2(T1, T3, (shuffle_mask<1,3,1,3>::mask))); // [a3 b3 c3 d3]
-  kernel.packet[2] = Packet4cd(_mm512_shuffle_f64x2(T1, T3, (shuffle_mask<0,2,0,2>::mask))); // [a2 b2 c2 d2]
-  kernel.packet[1] = Packet4cd(_mm512_shuffle_f64x2(T0, T2, (shuffle_mask<1,3,1,3>::mask))); // [a1 b1 c1 d1]
-  kernel.packet[0] = Packet4cd(_mm512_shuffle_f64x2(T0, T2, (shuffle_mask<0,2,0,2>::mask))); // [a0 b0 c0 d0]
+  kernel.packet[3] = Packet4cd(_mm512_shuffle_f64x2(T1, T3, (shuffle_mask<1, 3, 1, 3>::mask)));  // [a3 b3 c3 d3]
+  kernel.packet[2] = Packet4cd(_mm512_shuffle_f64x2(T1, T3, (shuffle_mask<0, 2, 0, 2>::mask)));  // [a2 b2 c2 d2]
+  kernel.packet[1] = Packet4cd(_mm512_shuffle_f64x2(T0, T2, (shuffle_mask<1, 3, 1, 3>::mask)));  // [a1 b1 c1 d1]
+  kernel.packet[0] = Packet4cd(_mm512_shuffle_f64x2(T0, T2, (shuffle_mask<0, 2, 0, 2>::mask)));  // [a0 b0 c0 d0]
 }
 
-template<> EIGEN_STRONG_INLINE Packet4cd psqrt<Packet4cd>(const Packet4cd& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4cd psqrt<Packet4cd>(const Packet4cd& a) {
   return psqrt_complex<Packet4cd>(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8cf psqrt<Packet8cf>(const Packet8cf& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8cf psqrt<Packet8cf>(const Packet8cf& a) {
   return psqrt_complex<Packet8cf>(a);
 }
 
-} // end namespace internal
-} // end namespace Eigen
+}  // end namespace internal
+}  // end namespace Eigen
 
-#endif // EIGEN_COMPLEX_AVX512_H
+#endif  // EIGEN_COMPLEX_AVX512_H
diff --git a/Eigen/src/Core/arch/AVX512/GemmKernel.h b/Eigen/src/Core/arch/AVX512/GemmKernel.h
index 2df1704..e06b83c 100644
--- a/Eigen/src/Core/arch/AVX512/GemmKernel.h
+++ b/Eigen/src/Core/arch/AVX512/GemmKernel.h
@@ -639,7 +639,8 @@
     }
   }
 
-  template <int uk, int max_b_unroll, int a_unroll, int b_unroll, bool ktail, bool fetch_x, bool c_fetch, bool no_a_preload = false>
+  template <int uk, int max_b_unroll, int a_unroll, int b_unroll, bool ktail, bool fetch_x, bool c_fetch,
+            bool no_a_preload = false>
   EIGEN_ALWAYS_INLINE void innerkernel_1uk(const Scalar *&aa, const Scalar *const &ao, const Scalar *const &bo,
                                            Scalar *&co2, int &fetchA_idx, int &fetchB_idx) {
     const int um_vecs = numext::div_ceil(a_unroll, nelems_in_cache_line);
@@ -696,7 +697,8 @@
    *  bo += b_unroll * kfactor;
    */
 
-  template <int a_unroll, int b_unroll, int k_factor, int max_b_unroll, int max_k_factor, bool c_fetch, bool no_a_preload = false>
+  template <int a_unroll, int b_unroll, int k_factor, int max_b_unroll, int max_k_factor, bool c_fetch,
+            bool no_a_preload = false>
   EIGEN_ALWAYS_INLINE void innerkernel(const Scalar *&aa, const Scalar *&ao, const Scalar *&bo, Scalar *&co2) {
     int fetchA_idx = 0;
     int fetchB_idx = 0;
@@ -705,20 +707,21 @@
     const bool ktail = k_factor == 1;
 
     static_assert(k_factor <= 4 && k_factor > 0, "innerkernel maximum k_factor supported is 4");
-    static_assert(no_a_preload == false || (no_a_preload == true && k_factor == 1), "skipping a preload only allowed when k unroll is 1");
+    static_assert(no_a_preload == false || (no_a_preload == true && k_factor == 1),
+                  "skipping a preload only allowed when k unroll is 1");
 
     if (k_factor > 0)
-      innerkernel_1uk<0, max_b_unroll, a_unroll, b_unroll, ktail, fetch_x, c_fetch, no_a_preload>(aa, ao, bo, co2, fetchA_idx,
-                                                                                    fetchB_idx);
+      innerkernel_1uk<0, max_b_unroll, a_unroll, b_unroll, ktail, fetch_x, c_fetch, no_a_preload>(
+          aa, ao, bo, co2, fetchA_idx, fetchB_idx);
     if (k_factor > 1)
-      innerkernel_1uk<1, max_b_unroll, a_unroll, b_unroll, ktail, fetch_x, c_fetch, no_a_preload>(aa, ao, bo, co2, fetchA_idx,
-                                                                                    fetchB_idx);
+      innerkernel_1uk<1, max_b_unroll, a_unroll, b_unroll, ktail, fetch_x, c_fetch, no_a_preload>(
+          aa, ao, bo, co2, fetchA_idx, fetchB_idx);
     if (k_factor > 2)
-      innerkernel_1uk<2, max_b_unroll, a_unroll, b_unroll, ktail, fetch_x, c_fetch, no_a_preload>(aa, ao, bo, co2, fetchA_idx,
-                                                                                    fetchB_idx);
+      innerkernel_1uk<2, max_b_unroll, a_unroll, b_unroll, ktail, fetch_x, c_fetch, no_a_preload>(
+          aa, ao, bo, co2, fetchA_idx, fetchB_idx);
     if (k_factor > 3)
-      innerkernel_1uk<3, max_b_unroll, a_unroll, b_unroll, ktail, fetch_x, c_fetch, no_a_preload>(aa, ao, bo, co2, fetchA_idx,
-                                                                                    fetchB_idx);
+      innerkernel_1uk<3, max_b_unroll, a_unroll, b_unroll, ktail, fetch_x, c_fetch, no_a_preload>(
+          aa, ao, bo, co2, fetchA_idx, fetchB_idx);
 
     // Advance A/B pointers after uk-loop.
     ao += a_unroll * k_factor;
@@ -1201,10 +1204,9 @@
 
 template <typename Scalar, typename Index, typename DataMapper, int mr, bool ConjugateLhs, bool ConjugateRhs>
 struct gebp_kernel<Scalar, Scalar, Index, DataMapper, mr, 8, ConjugateLhs, ConjugateRhs> {
-  EIGEN_ALWAYS_INLINE
-  void operator()(const DataMapper &res, const Scalar *blockA, const Scalar *blockB, Index rows, Index depth,
-                  Index cols, Scalar alpha, Index strideA = -1, Index strideB = -1, Index offsetA = 0,
-                  Index offsetB = 0);
+  EIGEN_ALWAYS_INLINE void operator()(const DataMapper &res, const Scalar *blockA, const Scalar *blockB, Index rows,
+                                      Index depth, Index cols, Scalar alpha, Index strideA = -1, Index strideB = -1,
+                                      Index offsetA = 0, Index offsetB = 0);
 };
 
 template <typename Scalar, typename Index, typename DataMapper, int mr, bool ConjugateLhs, bool ConjugateRhs>
@@ -1233,7 +1235,7 @@
     }
   }
 }
-#endif // EIGEN_USE_AVX512_GEMM_KERNELS
+#endif  // EIGEN_USE_AVX512_GEMM_KERNELS
 
 }  // namespace internal
 }  // namespace Eigen
diff --git a/Eigen/src/Core/arch/AVX512/MathFunctions.h b/Eigen/src/Core/arch/AVX512/MathFunctions.h
index 08e5fe8..0677248 100644
--- a/Eigen/src/Core/arch/AVX512/MathFunctions.h
+++ b/Eigen/src/Core/arch/AVX512/MathFunctions.h
@@ -47,14 +47,12 @@
 
 #if EIGEN_FAST_MATH
 template <>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet16f
-psqrt<Packet16f>(const Packet16f& _x) {
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet16f psqrt<Packet16f>(const Packet16f& _x) {
   return generic_sqrt_newton_step<Packet16f>::run(_x, _mm512_rsqrt14_ps(_x));
 }
 
 template <>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet8d
-psqrt<Packet8d>(const Packet8d& _x) {
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet8d psqrt<Packet8d>(const Packet8d& _x) {
 #ifdef EIGEN_VECTORIZE_AVX512ER
   return generic_sqrt_newton_step<Packet8d, /*Steps=*/1>::run(_x, _mm512_rsqrt28_pd(_x));
 #else
@@ -82,26 +80,24 @@
 #elif EIGEN_FAST_MATH
 
 template <>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet16f
-prsqrt<Packet16f>(const Packet16f& _x) {
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet16f prsqrt<Packet16f>(const Packet16f& _x) {
   return generic_rsqrt_newton_step<Packet16f, /*Steps=*/1>::run(_x, _mm512_rsqrt14_ps(_x));
 }
 #endif
 
-
 // prsqrt for double.
 #if EIGEN_FAST_MATH
 template <>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet8d
-prsqrt<Packet8d>(const Packet8d& _x) {
-  #ifdef EIGEN_VECTORIZE_AVX512ER
-    return generic_rsqrt_newton_step<Packet8d, /*Steps=*/1>::run(_x, _mm512_rsqrt28_pd(_x));
-  #else
-    return generic_rsqrt_newton_step<Packet8d, /*Steps=*/2>::run(_x, _mm512_rsqrt14_pd(_x));
-  #endif
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet8d prsqrt<Packet8d>(const Packet8d& _x) {
+#ifdef EIGEN_VECTORIZE_AVX512ER
+  return generic_rsqrt_newton_step<Packet8d, /*Steps=*/1>::run(_x, _mm512_rsqrt28_pd(_x));
+#else
+  return generic_rsqrt_newton_step<Packet8d, /*Steps=*/2>::run(_x, _mm512_rsqrt14_pd(_x));
+#endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet16f preciprocal<Packet16f>(const Packet16f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet16f preciprocal<Packet16f>(const Packet16f& a) {
 #ifdef EIGEN_VECTORIZE_AVX512ER
   return _mm512_rcp28_ps(a);
 #else
diff --git a/Eigen/src/Core/arch/AVX512/PacketMath.h b/Eigen/src/Core/arch/AVX512/PacketMath.h
index c6566a4..b6d2d98 100644
--- a/Eigen/src/Core/arch/AVX512/PacketMath.h
+++ b/Eigen/src/Core/arch/AVX512/PacketMath.h
@@ -53,7 +53,10 @@
 };
 
 #ifndef EIGEN_VECTORIZE_AVX512FP16
-template<> struct is_arithmetic<Packet16h> { enum { value = true }; };
+template <>
+struct is_arithmetic<Packet16h> {
+  enum { value = true };
+};
 
 template <>
 struct packet_traits<half> : default_packet_traits {
@@ -65,41 +68,41 @@
     AlignedOnScalar = 1,
     size = 16,
 
-    HasCmp    = 1,
-    HasAdd    = 1,
-    HasSub    = 1,
-    HasMul    = 1,
-    HasDiv    = 1,
+    HasCmp = 1,
+    HasAdd = 1,
+    HasSub = 1,
+    HasMul = 1,
+    HasDiv = 1,
     HasNegate = 1,
-    HasAbs    = 1,
-    HasAbs2   = 0,
-    HasMin    = 1,
-    HasMax    = 1,
-    HasConj   = 1,
+    HasAbs = 1,
+    HasAbs2 = 0,
+    HasMin = 1,
+    HasMax = 1,
+    HasConj = 1,
     HasSetLinear = 0,
-    HasSqrt   = 1,
-    HasRsqrt  = 1,
-    HasLog    = 1,
-    HasLog1p  = 1,
-    HasExp    = 1,
-    HasExpm1  = 1,
+    HasSqrt = 1,
+    HasRsqrt = 1,
+    HasLog = 1,
+    HasLog1p = 1,
+    HasExp = 1,
+    HasExpm1 = 1,
     HasBessel = 1,
-    HasNdtri  = 1,
-    HasSin    = EIGEN_FAST_MATH,
-    HasCos    = EIGEN_FAST_MATH,
-    HasTanh   = EIGEN_FAST_MATH,
-    HasErf    = EIGEN_FAST_MATH,
-    HasBlend  = 0,
-    HasRound  = 1,
-    HasFloor  = 1,
-    HasCeil   = 1,
-    HasRint   = 1
+    HasNdtri = 1,
+    HasSin = EIGEN_FAST_MATH,
+    HasCos = EIGEN_FAST_MATH,
+    HasTanh = EIGEN_FAST_MATH,
+    HasErf = EIGEN_FAST_MATH,
+    HasBlend = 0,
+    HasRound = 1,
+    HasFloor = 1,
+    HasCeil = 1,
+    HasRint = 1
   };
 };
 #endif
 
-template<> struct packet_traits<float>  : default_packet_traits
-{
+template <>
+struct packet_traits<float> : default_packet_traits {
   typedef Packet16f type;
   typedef Packet8f half;
   enum {
@@ -108,9 +111,9 @@
     size = 16,
 
     HasAbs = 1,
-    HasMin   = 1,
-    HasMax   = 1,
-    HasConj  = 1,
+    HasMin = 1,
+    HasMax = 1,
+    HasConj = 1,
     HasBlend = 1,
     HasSin = EIGEN_FAST_MATH,
     HasCos = EIGEN_FAST_MATH,
@@ -121,24 +124,24 @@
     HasSqrt = 1,
     HasRsqrt = 1,
     HasLog = 1,
-    HasLog1p  = 1,
-    HasExpm1  = 1,
+    HasLog1p = 1,
+    HasExpm1 = 1,
     HasNdtri = 1,
-    HasBessel  = 1,
+    HasBessel = 1,
     HasExp = 1,
     HasReciprocal = EIGEN_FAST_MATH,
     HasTanh = EIGEN_FAST_MATH,
     HasErf = EIGEN_FAST_MATH,
-    HasCmp  = 1,
+    HasCmp = 1,
     HasDiv = 1,
     HasRound = 1,
     HasFloor = 1,
     HasCeil = 1,
     HasRint = 1
   };
- };
-template<> struct packet_traits<double> : default_packet_traits
-{
+};
+template <>
+struct packet_traits<double> : default_packet_traits {
   typedef Packet8d type;
   typedef Packet4d half;
   enum {
@@ -148,10 +151,10 @@
     HasBlend = 1,
     HasSqrt = 1,
     HasRsqrt = 1,
-    HasLog  = 1,
+    HasLog = 1,
     HasExp = 1,
     HasATan = 1,
-    HasCmp  = 1,
+    HasCmp = 1,
     HasDiv = 1,
     HasRound = 1,
     HasFloor = 1,
@@ -160,18 +163,11 @@
   };
 };
 
-template<> struct packet_traits<int> : default_packet_traits
-{
+template <>
+struct packet_traits<int> : default_packet_traits {
   typedef Packet16i type;
   typedef Packet8i half;
-  enum {
-    Vectorizable = 1,
-    AlignedOnScalar = 1,
-    HasBlend = 0,
-    HasCmp = 1,
-    HasDiv = 1,
-    size=16
-  };
+  enum { Vectorizable = 1, AlignedOnScalar = 1, HasBlend = 0, HasCmp = 1, HasDiv = 1, size = 16 };
 };
 
 template <>
@@ -180,28 +176,54 @@
   typedef Packet8f half;
   typedef Packet16i integer_packet;
   typedef uint16_t mask_t;
-  enum { size = 16, alignment=Aligned64, vectorizable=true, masked_load_available=true, masked_store_available=true, masked_fpops_available=true };
+  enum {
+    size = 16,
+    alignment = Aligned64,
+    vectorizable = true,
+    masked_load_available = true,
+    masked_store_available = true,
+    masked_fpops_available = true
+  };
 };
 template <>
 struct unpacket_traits<Packet8d> {
   typedef double type;
   typedef Packet4d half;
   typedef uint8_t mask_t;
-  enum { size = 8, alignment=Aligned64, vectorizable=true, masked_load_available=true, masked_store_available=true, masked_fpops_available=true };
+  enum {
+    size = 8,
+    alignment = Aligned64,
+    vectorizable = true,
+    masked_load_available = true,
+    masked_store_available = true,
+    masked_fpops_available = true
+  };
 };
 template <>
 struct unpacket_traits<Packet16i> {
   typedef int type;
   typedef Packet8i half;
-  enum { size = 16, alignment=Aligned64, vectorizable=true, masked_load_available=false, masked_store_available=false };
+  enum {
+    size = 16,
+    alignment = Aligned64,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
 };
 
 #ifndef EIGEN_VECTORIZE_AVX512FP16
-template<>
+template <>
 struct unpacket_traits<Packet16h> {
   typedef Eigen::half type;
   typedef Packet8h half;
-  enum {size=16, alignment=Aligned32, vectorizable=true, masked_load_available=false, masked_store_available=false};
+  enum {
+    size = 16,
+    alignment = Aligned32,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
 };
 #endif
 
@@ -228,21 +250,30 @@
   return _mm512_castsi512_pd(_mm512_set1_epi64(from));
 }
 
-template<> EIGEN_STRONG_INLINE Packet16f pzero(const Packet16f& /*a*/) { return _mm512_setzero_ps(); }
-template<> EIGEN_STRONG_INLINE Packet8d pzero(const Packet8d& /*a*/) { return _mm512_setzero_pd(); }
-template<> EIGEN_STRONG_INLINE Packet16i pzero(const Packet16i& /*a*/) { return _mm512_setzero_si512(); }
+template <>
+EIGEN_STRONG_INLINE Packet16f pzero(const Packet16f& /*a*/) {
+  return _mm512_setzero_ps();
+}
+template <>
+EIGEN_STRONG_INLINE Packet8d pzero(const Packet8d& /*a*/) {
+  return _mm512_setzero_pd();
+}
+template <>
+EIGEN_STRONG_INLINE Packet16i pzero(const Packet16i& /*a*/) {
+  return _mm512_setzero_si512();
+}
 
-template<> EIGEN_STRONG_INLINE Packet16f peven_mask(const Packet16f& /*a*/) {
-  return _mm512_castsi512_ps(_mm512_set_epi32(0, -1, 0, -1, 0, -1, 0, -1,
-                                              0, -1, 0, -1, 0, -1, 0, -1));
+template <>
+EIGEN_STRONG_INLINE Packet16f peven_mask(const Packet16f& /*a*/) {
+  return _mm512_castsi512_ps(_mm512_set_epi32(0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1));
 }
-template<> EIGEN_STRONG_INLINE Packet16i peven_mask(const Packet16i& /*a*/) {
-  return _mm512_set_epi32(0, -1, 0, -1, 0, -1, 0, -1,
-                          0, -1, 0, -1, 0, -1, 0, -1);
+template <>
+EIGEN_STRONG_INLINE Packet16i peven_mask(const Packet16i& /*a*/) {
+  return _mm512_set_epi32(0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1);
 }
-template<> EIGEN_STRONG_INLINE Packet8d peven_mask(const Packet8d& /*a*/) {
-  return _mm512_castsi512_pd(_mm512_set_epi32(0, 0, -1, -1, 0, 0, -1, -1,
-                                              0, 0, -1, -1, 0, 0, -1, -1));
+template <>
+EIGEN_STRONG_INLINE Packet8d peven_mask(const Packet8d& /*a*/) {
+  return _mm512_castsi512_pd(_mm512_set_epi32(0, 0, -1, -1, 0, 0, -1, -1, 0, 0, -1, -1, 0, 0, -1, -1));
 }
 
 template <>
@@ -251,7 +282,7 @@
   // Inline asm here helps reduce some register spilling in TRSM kernels.
   // See note in unrolls::gemm::microKernel in TrsmKernel.h
   Packet16f ret;
-  __asm__  ("vbroadcastss %[mem], %[dst]" : [dst] "=v" (ret) : [mem] "m" (*from));
+  __asm__("vbroadcastss %[mem], %[dst]" : [dst] "=v"(ret) : [mem] "m"(*from));
   return ret;
 #else
   return _mm512_broadcastss_ps(_mm_load_ps1(from));
@@ -261,7 +292,7 @@
 EIGEN_STRONG_INLINE Packet8d pload1<Packet8d>(const double* from) {
 #if (EIGEN_COMP_GNUC != 0) || (EIGEN_COMP_CLANG != 0)
   Packet8d ret;
-  __asm__  ("vbroadcastsd %[mem], %[dst]" : [dst] "=v" (ret) : [mem] "m" (*from));
+  __asm__("vbroadcastsd %[mem], %[dst]" : [dst] "=v"(ret) : [mem] "m"(*from));
   return ret;
 #else
   return _mm512_set1_pd(*from);
@@ -270,67 +301,52 @@
 
 template <>
 EIGEN_STRONG_INLINE Packet16f plset<Packet16f>(const float& a) {
-  return _mm512_add_ps(
-      _mm512_set1_ps(a),
-      _mm512_set_ps(15.0f, 14.0f, 13.0f, 12.0f, 11.0f, 10.0f, 9.0f, 8.0f, 7.0f, 6.0f, 5.0f,
-                    4.0f, 3.0f, 2.0f, 1.0f, 0.0f));
+  return _mm512_add_ps(_mm512_set1_ps(a), _mm512_set_ps(15.0f, 14.0f, 13.0f, 12.0f, 11.0f, 10.0f, 9.0f, 8.0f, 7.0f,
+                                                        6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f, 0.0f));
 }
 template <>
 EIGEN_STRONG_INLINE Packet8d plset<Packet8d>(const double& a) {
-  return _mm512_add_pd(_mm512_set1_pd(a),
-                       _mm512_set_pd(7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 0.0));
+  return _mm512_add_pd(_mm512_set1_pd(a), _mm512_set_pd(7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 0.0));
 }
 template <>
 EIGEN_STRONG_INLINE Packet16i plset<Packet16i>(const int& a) {
-  return _mm512_add_epi32(
-      _mm512_set1_epi32(a),
-      _mm512_set_epi32(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0));
+  return _mm512_add_epi32(_mm512_set1_epi32(a), _mm512_set_epi32(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0));
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet16f padd<Packet16f>(const Packet16f& a,
-                                              const Packet16f& b) {
+EIGEN_STRONG_INLINE Packet16f padd<Packet16f>(const Packet16f& a, const Packet16f& b) {
   return _mm512_add_ps(a, b);
 }
 template <>
-EIGEN_STRONG_INLINE Packet8d padd<Packet8d>(const Packet8d& a,
-                                            const Packet8d& b) {
+EIGEN_STRONG_INLINE Packet8d padd<Packet8d>(const Packet8d& a, const Packet8d& b) {
   return _mm512_add_pd(a, b);
 }
 template <>
-EIGEN_STRONG_INLINE Packet16i padd<Packet16i>(const Packet16i& a,
-                                              const Packet16i& b) {
+EIGEN_STRONG_INLINE Packet16i padd<Packet16i>(const Packet16i& a, const Packet16i& b) {
   return _mm512_add_epi32(a, b);
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet16f padd<Packet16f>(const Packet16f& a,
-                                              const Packet16f& b,
-                                              uint16_t umask) {
+EIGEN_STRONG_INLINE Packet16f padd<Packet16f>(const Packet16f& a, const Packet16f& b, uint16_t umask) {
   __mmask16 mask = static_cast<__mmask16>(umask);
   return _mm512_maskz_add_ps(mask, a, b);
 }
 template <>
-EIGEN_STRONG_INLINE Packet8d padd<Packet8d>(const Packet8d& a,
-                                            const Packet8d& b,
-                                            uint8_t umask) {
+EIGEN_STRONG_INLINE Packet8d padd<Packet8d>(const Packet8d& a, const Packet8d& b, uint8_t umask) {
   __mmask8 mask = static_cast<__mmask8>(umask);
   return _mm512_maskz_add_pd(mask, a, b);
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet16f psub<Packet16f>(const Packet16f& a,
-                                              const Packet16f& b) {
+EIGEN_STRONG_INLINE Packet16f psub<Packet16f>(const Packet16f& a, const Packet16f& b) {
   return _mm512_sub_ps(a, b);
 }
 template <>
-EIGEN_STRONG_INLINE Packet8d psub<Packet8d>(const Packet8d& a,
-                                            const Packet8d& b) {
+EIGEN_STRONG_INLINE Packet8d psub<Packet8d>(const Packet8d& a, const Packet8d& b) {
   return _mm512_sub_pd(a, b);
 }
 template <>
-EIGEN_STRONG_INLINE Packet16i psub<Packet16i>(const Packet16i& a,
-                                              const Packet16i& b) {
+EIGEN_STRONG_INLINE Packet16i psub<Packet16i>(const Packet16i& a, const Packet16i& b) {
   return _mm512_sub_epi32(a, b);
 }
 
@@ -339,16 +355,16 @@
   // NOTE: MSVC seems to struggle with _mm512_set1_epi32, leading to random results.
   //       The intel docs give it a relatively high latency as well, so we're probably
   //       better off with using _mm512_set_epi32 directly anyways.
-  const __m512i mask = _mm512_set_epi32(0x80000000,0x80000000,0x80000000,0x80000000,
-                                        0x80000000,0x80000000,0x80000000,0x80000000,
-                                        0x80000000,0x80000000,0x80000000,0x80000000,
-                                        0x80000000,0x80000000,0x80000000,0x80000000);
+  const __m512i mask =
+      _mm512_set_epi32(0x80000000, 0x80000000, 0x80000000, 0x80000000, 0x80000000, 0x80000000, 0x80000000, 0x80000000,
+                       0x80000000, 0x80000000, 0x80000000, 0x80000000, 0x80000000, 0x80000000, 0x80000000, 0x80000000);
   return _mm512_castsi512_ps(_mm512_xor_epi32(_mm512_castps_si512(a), mask));
 }
 template <>
 EIGEN_STRONG_INLINE Packet8d pnegate(const Packet8d& a) {
-  const __m512i mask = _mm512_set_epi64(0x8000000000000000ULL, 0x8000000000000000ULL, 0x8000000000000000ULL, 0x8000000000000000ULL,
-                                        0x8000000000000000ULL, 0x8000000000000000ULL, 0x8000000000000000ULL, 0x8000000000000000ULL);
+  const __m512i mask =
+      _mm512_set_epi64(0x8000000000000000ULL, 0x8000000000000000ULL, 0x8000000000000000ULL, 0x8000000000000000ULL,
+                       0x8000000000000000ULL, 0x8000000000000000ULL, 0x8000000000000000ULL, 0x8000000000000000ULL);
   return _mm512_castsi512_pd(_mm512_xor_epi64(_mm512_castpd_si512(a), mask));
 }
 template <>
@@ -370,202 +386,186 @@
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet16f pmul<Packet16f>(const Packet16f& a,
-                                              const Packet16f& b) {
+EIGEN_STRONG_INLINE Packet16f pmul<Packet16f>(const Packet16f& a, const Packet16f& b) {
   return _mm512_mul_ps(a, b);
 }
 template <>
-EIGEN_STRONG_INLINE Packet8d pmul<Packet8d>(const Packet8d& a,
-                                            const Packet8d& b) {
+EIGEN_STRONG_INLINE Packet8d pmul<Packet8d>(const Packet8d& a, const Packet8d& b) {
   return _mm512_mul_pd(a, b);
 }
 template <>
-EIGEN_STRONG_INLINE Packet16i pmul<Packet16i>(const Packet16i& a,
-                                              const Packet16i& b) {
+EIGEN_STRONG_INLINE Packet16i pmul<Packet16i>(const Packet16i& a, const Packet16i& b) {
   return _mm512_mullo_epi32(a, b);
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet16f pdiv<Packet16f>(const Packet16f& a,
-                                              const Packet16f& b) {
+EIGEN_STRONG_INLINE Packet16f pdiv<Packet16f>(const Packet16f& a, const Packet16f& b) {
   return _mm512_div_ps(a, b);
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet8d pdiv<Packet8d>(const Packet8d& a,
-                                            const Packet8d& b) {
+EIGEN_STRONG_INLINE Packet8d pdiv<Packet8d>(const Packet8d& a, const Packet8d& b) {
   return _mm512_div_pd(a, b);
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet16i pdiv<Packet16i>(const Packet16i& a,
-                                              const Packet16i& b) {
-  Packet8i q_lo = pdiv<Packet8i>(_mm512_extracti64x4_epi64(a, 0), _mm512_extracti64x4_epi64(b,0));
+EIGEN_STRONG_INLINE Packet16i pdiv<Packet16i>(const Packet16i& a, const Packet16i& b) {
+  Packet8i q_lo = pdiv<Packet8i>(_mm512_extracti64x4_epi64(a, 0), _mm512_extracti64x4_epi64(b, 0));
   Packet8i q_hi = pdiv<Packet8i>(_mm512_extracti64x4_epi64(a, 1), _mm512_extracti64x4_epi64(b, 1));
   return _mm512_inserti64x4(_mm512_castsi256_si512(q_lo), q_hi, 1);
 }
 
 #ifdef EIGEN_VECTORIZE_FMA
 template <>
-EIGEN_STRONG_INLINE Packet16f pmadd(const Packet16f& a, const Packet16f& b,
-                                    const Packet16f& c) {
+EIGEN_STRONG_INLINE Packet16f pmadd(const Packet16f& a, const Packet16f& b, const Packet16f& c) {
   return _mm512_fmadd_ps(a, b, c);
 }
 template <>
-EIGEN_STRONG_INLINE Packet8d pmadd(const Packet8d& a, const Packet8d& b,
-                                   const Packet8d& c) {
+EIGEN_STRONG_INLINE Packet8d pmadd(const Packet8d& a, const Packet8d& b, const Packet8d& c) {
   return _mm512_fmadd_pd(a, b, c);
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet16f pmsub(const Packet16f& a, const Packet16f& b,
-                                    const Packet16f& c) {
+EIGEN_STRONG_INLINE Packet16f pmsub(const Packet16f& a, const Packet16f& b, const Packet16f& c) {
   return _mm512_fmsub_ps(a, b, c);
 }
 template <>
-EIGEN_STRONG_INLINE Packet8d pmsub(const Packet8d& a, const Packet8d& b,
-                                   const Packet8d& c) {
+EIGEN_STRONG_INLINE Packet8d pmsub(const Packet8d& a, const Packet8d& b, const Packet8d& c) {
   return _mm512_fmsub_pd(a, b, c);
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet16f pnmadd(const Packet16f& a, const Packet16f& b,
-                                    const Packet16f& c) {
+EIGEN_STRONG_INLINE Packet16f pnmadd(const Packet16f& a, const Packet16f& b, const Packet16f& c) {
   return _mm512_fnmadd_ps(a, b, c);
 }
 template <>
-EIGEN_STRONG_INLINE Packet8d pnmadd(const Packet8d& a, const Packet8d& b,
-                                   const Packet8d& c) {
+EIGEN_STRONG_INLINE Packet8d pnmadd(const Packet8d& a, const Packet8d& b, const Packet8d& c) {
   return _mm512_fnmadd_pd(a, b, c);
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet16f pnmsub(const Packet16f& a, const Packet16f& b,
-                                    const Packet16f& c) {
+EIGEN_STRONG_INLINE Packet16f pnmsub(const Packet16f& a, const Packet16f& b, const Packet16f& c) {
   return _mm512_fnmsub_ps(a, b, c);
 }
 template <>
-EIGEN_STRONG_INLINE Packet8d pnmsub(const Packet8d& a, const Packet8d& b,
-                                   const Packet8d& c) {
+EIGEN_STRONG_INLINE Packet8d pnmsub(const Packet8d& a, const Packet8d& b, const Packet8d& c) {
   return _mm512_fnmsub_pd(a, b, c);
 }
 #endif
 
 template <>
-EIGEN_DEVICE_FUNC inline Packet16f pselect(const Packet16f& mask,
-                                           const Packet16f& a,
-                                           const Packet16f& b) {
+EIGEN_DEVICE_FUNC inline Packet16f pselect(const Packet16f& mask, const Packet16f& a, const Packet16f& b) {
   __mmask16 mask16 = _mm512_cmpeq_epi32_mask(_mm512_castps_si512(mask), _mm512_setzero_epi32());
   return _mm512_mask_blend_ps(mask16, a, b);
 }
 
 template <>
-EIGEN_DEVICE_FUNC inline Packet16i pselect(const Packet16i& mask,
-                                           const Packet16i& a,
-                                           const Packet16i& b) {
+EIGEN_DEVICE_FUNC inline Packet16i pselect(const Packet16i& mask, const Packet16i& a, const Packet16i& b) {
   __mmask16 mask16 = _mm512_cmpeq_epi32_mask(mask, _mm512_setzero_epi32());
   return _mm512_mask_blend_epi32(mask16, a, b);
 }
 
 template <>
-EIGEN_DEVICE_FUNC inline Packet8d pselect(const Packet8d& mask,
-                                          const Packet8d& a,
-                                          const Packet8d& b) {
-  __mmask8 mask8 = _mm512_cmp_epi64_mask(_mm512_castpd_si512(mask),
-                                         _mm512_setzero_epi32(), _MM_CMPINT_EQ);
+EIGEN_DEVICE_FUNC inline Packet8d pselect(const Packet8d& mask, const Packet8d& a, const Packet8d& b) {
+  __mmask8 mask8 = _mm512_cmp_epi64_mask(_mm512_castpd_si512(mask), _mm512_setzero_epi32(), _MM_CMPINT_EQ);
   return _mm512_mask_blend_pd(mask8, a, b);
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet16f pmin<Packet16f>(const Packet16f& a,
-                                              const Packet16f& b) {
+EIGEN_STRONG_INLINE Packet16f pmin<Packet16f>(const Packet16f& a, const Packet16f& b) {
   // Arguments are reversed to match NaN propagation behavior of std::min.
   return _mm512_min_ps(b, a);
 }
 template <>
-EIGEN_STRONG_INLINE Packet8d pmin<Packet8d>(const Packet8d& a,
-                                            const Packet8d& b) {
+EIGEN_STRONG_INLINE Packet8d pmin<Packet8d>(const Packet8d& a, const Packet8d& b) {
   // Arguments are reversed to match NaN propagation behavior of std::min.
   return _mm512_min_pd(b, a);
 }
 template <>
-EIGEN_STRONG_INLINE Packet16i pmin<Packet16i>(const Packet16i& a,
-                                              const Packet16i& b) {
+EIGEN_STRONG_INLINE Packet16i pmin<Packet16i>(const Packet16i& a, const Packet16i& b) {
   return _mm512_min_epi32(b, a);
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet16f pmax<Packet16f>(const Packet16f& a,
-                                              const Packet16f& b) {
+EIGEN_STRONG_INLINE Packet16f pmax<Packet16f>(const Packet16f& a, const Packet16f& b) {
   // Arguments are reversed to match NaN propagation behavior of std::max.
   return _mm512_max_ps(b, a);
 }
 template <>
-EIGEN_STRONG_INLINE Packet8d pmax<Packet8d>(const Packet8d& a,
-                                            const Packet8d& b) {
+EIGEN_STRONG_INLINE Packet8d pmax<Packet8d>(const Packet8d& a, const Packet8d& b) {
   // Arguments are reversed to match NaN propagation behavior of std::max.
   return _mm512_max_pd(b, a);
 }
 template <>
-EIGEN_STRONG_INLINE Packet16i pmax<Packet16i>(const Packet16i& a,
-                                              const Packet16i& b) {
+EIGEN_STRONG_INLINE Packet16i pmax<Packet16i>(const Packet16i& a, const Packet16i& b) {
   return _mm512_max_epi32(b, a);
 }
 
 // Add specializations for min/max with prescribed NaN progation.
-template<>
+template <>
 EIGEN_STRONG_INLINE Packet16f pmin<PropagateNumbers, Packet16f>(const Packet16f& a, const Packet16f& b) {
   return pminmax_propagate_numbers(a, b, pmin<Packet16f>);
 }
-template<>
+template <>
 EIGEN_STRONG_INLINE Packet8d pmin<PropagateNumbers, Packet8d>(const Packet8d& a, const Packet8d& b) {
   return pminmax_propagate_numbers(a, b, pmin<Packet8d>);
 }
-template<>
+template <>
 EIGEN_STRONG_INLINE Packet16f pmax<PropagateNumbers, Packet16f>(const Packet16f& a, const Packet16f& b) {
   return pminmax_propagate_numbers(a, b, pmax<Packet16f>);
 }
-template<>
+template <>
 EIGEN_STRONG_INLINE Packet8d pmax<PropagateNumbers, Packet8d>(const Packet8d& a, const Packet8d& b) {
   return pminmax_propagate_numbers(a, b, pmax<Packet8d>);
 }
-template<>
+template <>
 EIGEN_STRONG_INLINE Packet16f pmin<PropagateNaN, Packet16f>(const Packet16f& a, const Packet16f& b) {
   return pminmax_propagate_nan(a, b, pmin<Packet16f>);
 }
-template<>
+template <>
 EIGEN_STRONG_INLINE Packet8d pmin<PropagateNaN, Packet8d>(const Packet8d& a, const Packet8d& b) {
   return pminmax_propagate_nan(a, b, pmin<Packet8d>);
 }
-template<>
+template <>
 EIGEN_STRONG_INLINE Packet16f pmax<PropagateNaN, Packet16f>(const Packet16f& a, const Packet16f& b) {
   return pminmax_propagate_nan(a, b, pmax<Packet16f>);
 }
-template<>
+template <>
 EIGEN_STRONG_INLINE Packet8d pmax<PropagateNaN, Packet8d>(const Packet8d& a, const Packet8d& b) {
   return pminmax_propagate_nan(a, b, pmax<Packet8d>);
 }
 
-
 #ifdef EIGEN_VECTORIZE_AVX512DQ
-template<int I_> EIGEN_STRONG_INLINE Packet8f extract256(Packet16f x) { return _mm512_extractf32x8_ps(x,I_); }
-template<int I_> EIGEN_STRONG_INLINE Packet2d extract128(Packet8d x) { return _mm512_extractf64x2_pd(x,I_); }
-EIGEN_STRONG_INLINE Packet16f cat256(Packet8f a, Packet8f b) { return _mm512_insertf32x8(_mm512_castps256_ps512(a),b,1); }
-EIGEN_STRONG_INLINE Packet16i cat256i(Packet8i a, Packet8i b) { return _mm512_inserti32x8(_mm512_castsi256_si512(a), b, 1); }
+template <int I_>
+EIGEN_STRONG_INLINE Packet8f extract256(Packet16f x) {
+  return _mm512_extractf32x8_ps(x, I_);
+}
+template <int I_>
+EIGEN_STRONG_INLINE Packet2d extract128(Packet8d x) {
+  return _mm512_extractf64x2_pd(x, I_);
+}
+EIGEN_STRONG_INLINE Packet16f cat256(Packet8f a, Packet8f b) {
+  return _mm512_insertf32x8(_mm512_castps256_ps512(a), b, 1);
+}
+EIGEN_STRONG_INLINE Packet16i cat256i(Packet8i a, Packet8i b) {
+  return _mm512_inserti32x8(_mm512_castsi256_si512(a), b, 1);
+}
 #else
 // AVX512F does not define _mm512_extractf32x8_ps to extract _m256 from _m512
-template<int I_> EIGEN_STRONG_INLINE Packet8f extract256(Packet16f x) {
-  return  _mm256_castsi256_ps(_mm512_extracti64x4_epi64( _mm512_castps_si512(x),I_));
+template <int I_>
+EIGEN_STRONG_INLINE Packet8f extract256(Packet16f x) {
+  return _mm256_castsi256_ps(_mm512_extracti64x4_epi64(_mm512_castps_si512(x), I_));
 }
 
 // AVX512F does not define _mm512_extractf64x2_pd to extract _m128 from _m512
-template<int I_> EIGEN_STRONG_INLINE Packet2d extract128(Packet8d x) {
-  return _mm_castsi128_pd(_mm512_extracti32x4_epi32( _mm512_castpd_si512(x),I_));
+template <int I_>
+EIGEN_STRONG_INLINE Packet2d extract128(Packet8d x) {
+  return _mm_castsi128_pd(_mm512_extracti32x4_epi32(_mm512_castpd_si512(x), I_));
 }
 
 EIGEN_STRONG_INLINE Packet16f cat256(Packet8f a, Packet8f b) {
-  return _mm512_castsi512_ps(_mm512_inserti64x4(_mm512_castsi256_si512(_mm256_castps_si256(a)),
-                                                _mm256_castps_si256(b),1));
+  return _mm512_castsi512_ps(
+      _mm512_inserti64x4(_mm512_castsi256_si512(_mm256_castps_si256(a)), _mm256_castps_si256(b), 1));
 }
 EIGEN_STRONG_INLINE Packet16i cat256i(Packet8i a, Packet8i b) {
   return _mm512_inserti64x4(_mm512_castsi256_si512(a), b, 1);
@@ -584,10 +584,8 @@
   //   dst[255:240] := Saturate16(rf[255:224])
   __m256i lo = _mm256_castps_si256(extract256<0>(rf));
   __m256i hi = _mm256_castps_si256(extract256<1>(rf));
-  __m128i result_lo = _mm_packs_epi32(_mm256_extractf128_si256(lo, 0),
-                                      _mm256_extractf128_si256(lo, 1));
-  __m128i result_hi = _mm_packs_epi32(_mm256_extractf128_si256(hi, 0),
-                                      _mm256_extractf128_si256(hi, 1));
+  __m128i result_lo = _mm_packs_epi32(_mm256_extractf128_si256(lo, 0), _mm256_extractf128_si256(lo, 1));
+  __m128i result_hi = _mm_packs_epi32(_mm256_extractf128_si256(hi, 0), _mm256_extractf128_si256(hi, 1));
   return _mm256_insertf128_si256(_mm256_castsi128_si256(result_lo), result_hi, 1);
 }
 
@@ -600,36 +598,38 @@
 template <>
 EIGEN_STRONG_INLINE Packet16f pcmp_eq(const Packet16f& a, const Packet16f& b) {
   __mmask16 mask = _mm512_cmp_ps_mask(a, b, _CMP_EQ_OQ);
-  return _mm512_castsi512_ps(
-      _mm512_mask_set1_epi32(_mm512_setzero_epi32(), mask, 0xffffffffu));
+  return _mm512_castsi512_ps(_mm512_mask_set1_epi32(_mm512_setzero_epi32(), mask, 0xffffffffu));
 }
-template<> EIGEN_STRONG_INLINE Packet16f pcmp_le(const Packet16f& a, const Packet16f& b) {
+template <>
+EIGEN_STRONG_INLINE Packet16f pcmp_le(const Packet16f& a, const Packet16f& b) {
   __mmask16 mask = _mm512_cmp_ps_mask(a, b, _CMP_LE_OQ);
-  return _mm512_castsi512_ps(
-      _mm512_mask_set1_epi32(_mm512_setzero_epi32(), mask, 0xffffffffu));
+  return _mm512_castsi512_ps(_mm512_mask_set1_epi32(_mm512_setzero_epi32(), mask, 0xffffffffu));
 }
 
-template<> EIGEN_STRONG_INLINE Packet16f pcmp_lt(const Packet16f& a, const Packet16f& b) {
+template <>
+EIGEN_STRONG_INLINE Packet16f pcmp_lt(const Packet16f& a, const Packet16f& b) {
   __mmask16 mask = _mm512_cmp_ps_mask(a, b, _CMP_LT_OQ);
-  return _mm512_castsi512_ps(
-      _mm512_mask_set1_epi32(_mm512_setzero_epi32(), mask, 0xffffffffu));
+  return _mm512_castsi512_ps(_mm512_mask_set1_epi32(_mm512_setzero_epi32(), mask, 0xffffffffu));
 }
 
-template<> EIGEN_STRONG_INLINE Packet16f pcmp_lt_or_nan(const Packet16f& a, const Packet16f& b) {
+template <>
+EIGEN_STRONG_INLINE Packet16f pcmp_lt_or_nan(const Packet16f& a, const Packet16f& b) {
   __mmask16 mask = _mm512_cmp_ps_mask(a, b, _CMP_NGE_UQ);
-  return _mm512_castsi512_ps(
-      _mm512_mask_set1_epi32(_mm512_setzero_epi32(), mask, 0xffffffffu));
+  return _mm512_castsi512_ps(_mm512_mask_set1_epi32(_mm512_setzero_epi32(), mask, 0xffffffffu));
 }
 
-template<> EIGEN_STRONG_INLINE Packet16i pcmp_eq(const Packet16i& a, const Packet16i& b) {
+template <>
+EIGEN_STRONG_INLINE Packet16i pcmp_eq(const Packet16i& a, const Packet16i& b) {
   __mmask16 mask = _mm512_cmp_epi32_mask(a, b, _MM_CMPINT_EQ);
   return _mm512_mask_set1_epi32(_mm512_setzero_epi32(), mask, 0xffffffffu);
 }
-template<> EIGEN_STRONG_INLINE Packet16i pcmp_le(const Packet16i& a, const Packet16i& b) {
+template <>
+EIGEN_STRONG_INLINE Packet16i pcmp_le(const Packet16i& a, const Packet16i& b) {
   __mmask16 mask = _mm512_cmp_epi32_mask(a, b, _MM_CMPINT_LE);
   return _mm512_mask_set1_epi32(_mm512_setzero_epi32(), mask, 0xffffffffu);
 }
-template<> EIGEN_STRONG_INLINE Packet16i pcmp_lt(const Packet16i& a, const Packet16i& b) {
+template <>
+EIGEN_STRONG_INLINE Packet16i pcmp_lt(const Packet16i& a, const Packet16i& b) {
   __mmask16 mask = _mm512_cmp_epi32_mask(a, b, _MM_CMPINT_LT);
   return _mm512_mask_set1_epi32(_mm512_setzero_epi32(), mask, 0xffffffffu);
 }
@@ -637,36 +637,50 @@
 template <>
 EIGEN_STRONG_INLINE Packet8d pcmp_eq(const Packet8d& a, const Packet8d& b) {
   __mmask8 mask = _mm512_cmp_pd_mask(a, b, _CMP_EQ_OQ);
-  return _mm512_castsi512_pd(
-      _mm512_mask_set1_epi64(_mm512_setzero_epi32(), mask, 0xffffffffffffffffu));
+  return _mm512_castsi512_pd(_mm512_mask_set1_epi64(_mm512_setzero_epi32(), mask, 0xffffffffffffffffu));
 }
 template <>
 EIGEN_STRONG_INLINE Packet8d pcmp_le(const Packet8d& a, const Packet8d& b) {
   __mmask8 mask = _mm512_cmp_pd_mask(a, b, _CMP_LE_OQ);
-  return _mm512_castsi512_pd(
-      _mm512_mask_set1_epi64(_mm512_setzero_epi32(), mask, 0xffffffffffffffffu));
+  return _mm512_castsi512_pd(_mm512_mask_set1_epi64(_mm512_setzero_epi32(), mask, 0xffffffffffffffffu));
 }
 template <>
 EIGEN_STRONG_INLINE Packet8d pcmp_lt(const Packet8d& a, const Packet8d& b) {
   __mmask8 mask = _mm512_cmp_pd_mask(a, b, _CMP_LT_OQ);
-  return _mm512_castsi512_pd(
-      _mm512_mask_set1_epi64(_mm512_setzero_epi32(), mask, 0xffffffffffffffffu));
+  return _mm512_castsi512_pd(_mm512_mask_set1_epi64(_mm512_setzero_epi32(), mask, 0xffffffffffffffffu));
 }
 template <>
 EIGEN_STRONG_INLINE Packet8d pcmp_lt_or_nan(const Packet8d& a, const Packet8d& b) {
   __mmask8 mask = _mm512_cmp_pd_mask(a, b, _CMP_NGE_UQ);
-  return _mm512_castsi512_pd(
-      _mm512_mask_set1_epi64(_mm512_setzero_epi32(), mask, 0xffffffffffffffffu));
+  return _mm512_castsi512_pd(_mm512_mask_set1_epi64(_mm512_setzero_epi32(), mask, 0xffffffffffffffffu));
 }
 
-template<> EIGEN_STRONG_INLINE Packet16f print<Packet16f>(const Packet16f& a) { return _mm512_roundscale_ps(a, _MM_FROUND_CUR_DIRECTION); }
-template<> EIGEN_STRONG_INLINE Packet8d print<Packet8d>(const Packet8d& a) { return _mm512_roundscale_pd(a, _MM_FROUND_CUR_DIRECTION); }
+template <>
+EIGEN_STRONG_INLINE Packet16f print<Packet16f>(const Packet16f& a) {
+  return _mm512_roundscale_ps(a, _MM_FROUND_CUR_DIRECTION);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8d print<Packet8d>(const Packet8d& a) {
+  return _mm512_roundscale_pd(a, _MM_FROUND_CUR_DIRECTION);
+}
 
-template<> EIGEN_STRONG_INLINE Packet16f pceil<Packet16f>(const Packet16f& a) { return _mm512_roundscale_ps(a, _MM_FROUND_TO_POS_INF); }
-template<> EIGEN_STRONG_INLINE Packet8d pceil<Packet8d>(const Packet8d& a) { return _mm512_roundscale_pd(a, _MM_FROUND_TO_POS_INF); }
+template <>
+EIGEN_STRONG_INLINE Packet16f pceil<Packet16f>(const Packet16f& a) {
+  return _mm512_roundscale_ps(a, _MM_FROUND_TO_POS_INF);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8d pceil<Packet8d>(const Packet8d& a) {
+  return _mm512_roundscale_pd(a, _MM_FROUND_TO_POS_INF);
+}
 
-template<> EIGEN_STRONG_INLINE Packet16f pfloor<Packet16f>(const Packet16f& a) { return _mm512_roundscale_ps(a, _MM_FROUND_TO_NEG_INF); }
-template<> EIGEN_STRONG_INLINE Packet8d pfloor<Packet8d>(const Packet8d& a) { return _mm512_roundscale_pd(a, _MM_FROUND_TO_NEG_INF); }
+template <>
+EIGEN_STRONG_INLINE Packet16f pfloor<Packet16f>(const Packet16f& a) {
+  return _mm512_roundscale_ps(a, _MM_FROUND_TO_NEG_INF);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8d pfloor<Packet8d>(const Packet8d& a) {
+  return _mm512_roundscale_pd(a, _MM_FROUND_TO_NEG_INF);
+}
 
 template <>
 EIGEN_STRONG_INLINE Packet16i ptrue<Packet16i>(const Packet16i& /*a*/) {
@@ -684,23 +698,20 @@
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet16i pand<Packet16i>(const Packet16i& a,
-                                              const Packet16i& b) {
-  return _mm512_and_si512(a,b);
+EIGEN_STRONG_INLINE Packet16i pand<Packet16i>(const Packet16i& a, const Packet16i& b) {
+  return _mm512_and_si512(a, b);
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet16f pand<Packet16f>(const Packet16f& a,
-                                              const Packet16f& b) {
+EIGEN_STRONG_INLINE Packet16f pand<Packet16f>(const Packet16f& a, const Packet16f& b) {
 #ifdef EIGEN_VECTORIZE_AVX512DQ
   return _mm512_and_ps(a, b);
 #else
-  return _mm512_castsi512_ps(pand(_mm512_castps_si512(a),_mm512_castps_si512(b)));
+  return _mm512_castsi512_ps(pand(_mm512_castps_si512(a), _mm512_castps_si512(b)));
 #endif
 }
 template <>
-EIGEN_STRONG_INLINE Packet8d pand<Packet8d>(const Packet8d& a,
-                                            const Packet8d& b) {
+EIGEN_STRONG_INLINE Packet8d pand<Packet8d>(const Packet8d& a, const Packet8d& b) {
 #ifdef EIGEN_VECTORIZE_AVX512DQ
   return _mm512_and_pd(a, b);
 #else
@@ -725,17 +736,16 @@
 #ifdef EIGEN_VECTORIZE_AVX512DQ
   return _mm512_or_ps(a, b);
 #else
-  return _mm512_castsi512_ps(por(_mm512_castps_si512(a),_mm512_castps_si512(b)));
+  return _mm512_castsi512_ps(por(_mm512_castps_si512(a), _mm512_castps_si512(b)));
 #endif
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet8d por<Packet8d>(const Packet8d& a,
-                                           const Packet8d& b) {
+EIGEN_STRONG_INLINE Packet8d por<Packet8d>(const Packet8d& a, const Packet8d& b) {
 #ifdef EIGEN_VECTORIZE_AVX512DQ
   return _mm512_or_pd(a, b);
 #else
-  return _mm512_castsi512_pd(por(_mm512_castpd_si512(a),_mm512_castpd_si512(b)));
+  return _mm512_castsi512_pd(por(_mm512_castpd_si512(a), _mm512_castpd_si512(b)));
 #endif
 }
 
@@ -749,7 +759,7 @@
 #ifdef EIGEN_VECTORIZE_AVX512DQ
   return _mm512_xor_ps(a, b);
 #else
-  return _mm512_castsi512_ps(pxor(_mm512_castps_si512(a),_mm512_castps_si512(b)));
+  return _mm512_castsi512_ps(pxor(_mm512_castps_si512(a), _mm512_castps_si512(b)));
 #endif
 }
 
@@ -758,7 +768,7 @@
 #ifdef EIGEN_VECTORIZE_AVX512DQ
   return _mm512_xor_pd(a, b);
 #else
-  return _mm512_castsi512_pd(pxor(_mm512_castpd_si512(a),_mm512_castpd_si512(b)));
+  return _mm512_castsi512_pd(pxor(_mm512_castpd_si512(a), _mm512_castpd_si512(b)));
 #endif
 }
 
@@ -772,42 +782,45 @@
 #ifdef EIGEN_VECTORIZE_AVX512DQ
   return _mm512_andnot_ps(b, a);
 #else
-  return _mm512_castsi512_ps(pandnot(_mm512_castps_si512(a),_mm512_castps_si512(b)));
+  return _mm512_castsi512_ps(pandnot(_mm512_castps_si512(a), _mm512_castps_si512(b)));
 #endif
 }
 template <>
-EIGEN_STRONG_INLINE Packet8d pandnot<Packet8d>(const Packet8d& a,const Packet8d& b) {
+EIGEN_STRONG_INLINE Packet8d pandnot<Packet8d>(const Packet8d& a, const Packet8d& b) {
 #ifdef EIGEN_VECTORIZE_AVX512DQ
   return _mm512_andnot_pd(b, a);
 #else
-  return _mm512_castsi512_pd(pandnot(_mm512_castpd_si512(a),_mm512_castpd_si512(b)));
+  return _mm512_castsi512_pd(pandnot(_mm512_castpd_si512(a), _mm512_castpd_si512(b)));
 #endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet16f pround<Packet16f>(const Packet16f& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet16f pround<Packet16f>(const Packet16f& a) {
   // Work-around for default std::round rounding mode.
   const Packet16f mask = pset1frombits<Packet16f>(static_cast<numext::uint32_t>(0x80000000u));
   const Packet16f prev0dot5 = pset1frombits<Packet16f>(static_cast<numext::uint32_t>(0x3EFFFFFFu));
   return _mm512_roundscale_ps(padd(por(pand(a, mask), prev0dot5), a), _MM_FROUND_TO_ZERO);
 }
-template<> EIGEN_STRONG_INLINE Packet8d pround<Packet8d>(const Packet8d& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8d pround<Packet8d>(const Packet8d& a) {
   // Work-around for default std::round rounding mode.
   const Packet8d mask = pset1frombits<Packet8d>(static_cast<numext::uint64_t>(0x8000000000000000ull));
   const Packet8d prev0dot5 = pset1frombits<Packet8d>(static_cast<numext::uint64_t>(0x3FDFFFFFFFFFFFFFull));
   return _mm512_roundscale_pd(padd(por(pand(a, mask), prev0dot5), a), _MM_FROUND_TO_ZERO);
 }
 
-template<int N> EIGEN_STRONG_INLINE Packet16i parithmetic_shift_right(Packet16i a) {
+template <int N>
+EIGEN_STRONG_INLINE Packet16i parithmetic_shift_right(Packet16i a) {
   return _mm512_srai_epi32(a, N);
 }
 
-template<int N> EIGEN_STRONG_INLINE Packet16i plogical_shift_right(Packet16i a) {
+template <int N>
+EIGEN_STRONG_INLINE Packet16i plogical_shift_right(Packet16i a) {
   return _mm512_srli_epi32(a, N);
 }
 
-template<int N> EIGEN_STRONG_INLINE Packet16i plogical_shift_left(Packet16i a) {
+template <int N>
+EIGEN_STRONG_INLINE Packet16i plogical_shift_left(Packet16i a) {
   return _mm512_slli_epi32(a, N);
 }
 
@@ -821,8 +834,7 @@
 }
 template <>
 EIGEN_STRONG_INLINE Packet16i pload<Packet16i>(const int* from) {
-  EIGEN_DEBUG_ALIGNED_LOAD return _mm512_load_si512(
-    reinterpret_cast<const __m512i*>(from));
+  EIGEN_DEBUG_ALIGNED_LOAD return _mm512_load_si512(reinterpret_cast<const __m512i*>(from));
 }
 
 template <>
@@ -835,8 +847,7 @@
 }
 template <>
 EIGEN_STRONG_INLINE Packet16i ploadu<Packet16i>(const int* from) {
-  EIGEN_DEBUG_UNALIGNED_LOAD return _mm512_loadu_si512(
-      reinterpret_cast<const __m512i*>(from));
+  EIGEN_DEBUG_UNALIGNED_LOAD return _mm512_loadu_si512(reinterpret_cast<const __m512i*>(from));
 }
 
 template <>
@@ -868,7 +879,7 @@
 // a3}
 template <>
 EIGEN_STRONG_INLINE Packet8d ploaddup<Packet8d>(const double* from) {
- __m512d x = _mm512_setzero_pd();
+  __m512d x = _mm512_setzero_pd();
   x = _mm512_insertf64x2(x, _mm_loaddup_pd(&from[0]), 0);
   x = _mm512_insertf64x2(x, _mm_loaddup_pd(&from[1]), 1);
   x = _mm512_insertf64x2(x, _mm_loaddup_pd(&from[2]), 2);
@@ -879,10 +890,10 @@
 template <>
 EIGEN_STRONG_INLINE Packet8d ploaddup<Packet8d>(const double* from) {
   __m512d x = _mm512_setzero_pd();
-  x = _mm512_mask_broadcastsd_pd(x, 0x3<<0, _mm_load_sd(from+0));
-  x = _mm512_mask_broadcastsd_pd(x, 0x3<<2, _mm_load_sd(from+1));
-  x = _mm512_mask_broadcastsd_pd(x, 0x3<<4, _mm_load_sd(from+2));
-  x = _mm512_mask_broadcastsd_pd(x, 0x3<<6, _mm_load_sd(from+3));
+  x = _mm512_mask_broadcastsd_pd(x, 0x3 << 0, _mm_load_sd(from + 0));
+  x = _mm512_mask_broadcastsd_pd(x, 0x3 << 2, _mm_load_sd(from + 1));
+  x = _mm512_mask_broadcastsd_pd(x, 0x3 << 4, _mm_load_sd(from + 2));
+  x = _mm512_mask_broadcastsd_pd(x, 0x3 << 6, _mm_load_sd(from + 3));
   return x;
 }
 #endif
@@ -902,7 +913,7 @@
 template <>
 EIGEN_STRONG_INLINE Packet16f ploadquad<Packet16f>(const float* from) {
   Packet16f tmp = _mm512_castps128_ps512(ploadu<Packet4f>(from));
-  const Packet16i scatter_mask = _mm512_set_epi32(3,3,3,3, 2,2,2,2, 1,1,1,1, 0,0,0,0);
+  const Packet16i scatter_mask = _mm512_set_epi32(3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0);
   return _mm512_permutexvar_ps(scatter_mask, tmp);
 }
 
@@ -911,7 +922,7 @@
 template <>
 EIGEN_STRONG_INLINE Packet8d ploadquad<Packet8d>(const double* from) {
   __m256d lane0 = _mm256_set1_pd(*from);
-  __m256d lane1 = _mm256_set1_pd(*(from+1));
+  __m256d lane1 = _mm256_set1_pd(*(from + 1));
   __m512d tmp = _mm512_undefined_pd();
   tmp = _mm512_insertf64x4(tmp, lane0, 0);
   return _mm512_insertf64x4(tmp, lane1, 1);
@@ -922,7 +933,7 @@
 template <>
 EIGEN_STRONG_INLINE Packet16i ploadquad<Packet16i>(const int* from) {
   Packet16i tmp = _mm512_castsi128_si512(ploadu<Packet4i>(from));
-  const Packet16i scatter_mask = _mm512_set_epi32(3,3,3,3, 2,2,2,2, 1,1,1,1, 0,0,0,0);
+  const Packet16i scatter_mask = _mm512_set_epi32(3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0);
   return _mm512_permutexvar_epi32(scatter_mask, tmp);
 }
 
@@ -936,8 +947,7 @@
 }
 template <>
 EIGEN_STRONG_INLINE void pstore<int>(int* to, const Packet16i& from) {
-  EIGEN_DEBUG_ALIGNED_STORE _mm512_storeu_si512(reinterpret_cast<__m512i*>(to),
-                                                from);
+  EIGEN_DEBUG_ALIGNED_STORE _mm512_storeu_si512(reinterpret_cast<__m512i*>(to), from);
 }
 
 template <>
@@ -950,8 +960,7 @@
 }
 template <>
 EIGEN_STRONG_INLINE void pstoreu<int>(int* to, const Packet16i& from) {
-  EIGEN_DEBUG_UNALIGNED_STORE _mm512_storeu_si512(
-      reinterpret_cast<__m512i*>(to), from);
+  EIGEN_DEBUG_UNALIGNED_STORE _mm512_storeu_si512(reinterpret_cast<__m512i*>(to), from);
 }
 template <>
 EIGEN_STRONG_INLINE void pstoreu<float>(float* to, const Packet16f& from, uint16_t umask) {
@@ -965,25 +974,20 @@
 }
 
 template <typename Scalar, typename Packet>
-EIGEN_DEVICE_FUNC inline Packet pgather(const Packet& src, const Scalar* from,
-    Index stride, typename unpacket_traits<Packet>::mask_t umask);
+EIGEN_DEVICE_FUNC inline Packet pgather(const Packet& src, const Scalar* from, Index stride,
+                                        typename unpacket_traits<Packet>::mask_t umask);
 template <>
-EIGEN_DEVICE_FUNC inline Packet16f pgather<float, Packet16f>(const Packet16f& src,
-                                                             const float* from,
-                                                             Index stride,
+EIGEN_DEVICE_FUNC inline Packet16f pgather<float, Packet16f>(const Packet16f& src, const float* from, Index stride,
                                                              uint16_t umask) {
   Packet16i stride_vector = _mm512_set1_epi32(convert_index<int>(stride));
-  Packet16i stride_multiplier =
-      _mm512_set_epi32(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
+  Packet16i stride_multiplier = _mm512_set_epi32(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
   Packet16i indices = _mm512_mullo_epi32(stride_vector, stride_multiplier);
   __mmask16 mask = static_cast<__mmask16>(umask);
 
   return _mm512_mask_i32gather_ps(src, mask, indices, from, 4);
 }
 template <>
-EIGEN_DEVICE_FUNC inline Packet8d pgather<double, Packet8d>(const Packet8d& src,
-                                                            const double* from,
-                                                            Index stride,
+EIGEN_DEVICE_FUNC inline Packet8d pgather<double, Packet8d>(const Packet8d& src, const double* from, Index stride,
                                                             uint8_t umask) {
   Packet8i stride_vector = _mm256_set1_epi32(convert_index<int>(stride));
   Packet8i stride_multiplier = _mm256_set_epi32(7, 6, 5, 4, 3, 2, 1, 0);
@@ -994,18 +998,15 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC inline Packet16f pgather<float, Packet16f>(const float* from,
-                                                             Index stride) {
+EIGEN_DEVICE_FUNC inline Packet16f pgather<float, Packet16f>(const float* from, Index stride) {
   Packet16i stride_vector = _mm512_set1_epi32(convert_index<int>(stride));
-  Packet16i stride_multiplier =
-      _mm512_set_epi32(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
+  Packet16i stride_multiplier = _mm512_set_epi32(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
   Packet16i indices = _mm512_mullo_epi32(stride_vector, stride_multiplier);
 
   return _mm512_i32gather_ps(indices, from, 4);
 }
 template <>
-EIGEN_DEVICE_FUNC inline Packet8d pgather<double, Packet8d>(const double* from,
-                                                            Index stride) {
+EIGEN_DEVICE_FUNC inline Packet8d pgather<double, Packet8d>(const double* from, Index stride) {
   Packet8i stride_vector = _mm256_set1_epi32(convert_index<int>(stride));
   Packet8i stride_multiplier = _mm256_set_epi32(7, 6, 5, 4, 3, 2, 1, 0);
   Packet8i indices = _mm256_mullo_epi32(stride_vector, stride_multiplier);
@@ -1013,34 +1014,27 @@
   return _mm512_i32gather_pd(indices, from, 8);
 }
 template <>
-EIGEN_DEVICE_FUNC inline Packet16i pgather<int, Packet16i>(const int* from,
-                                                           Index stride) {
+EIGEN_DEVICE_FUNC inline Packet16i pgather<int, Packet16i>(const int* from, Index stride) {
   Packet16i stride_vector = _mm512_set1_epi32(convert_index<int>(stride));
-  Packet16i stride_multiplier =
-      _mm512_set_epi32(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
+  Packet16i stride_multiplier = _mm512_set_epi32(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
   Packet16i indices = _mm512_mullo_epi32(stride_vector, stride_multiplier);
   return _mm512_i32gather_epi32(indices, from, 4);
 }
 
 template <typename Scalar, typename Packet>
-EIGEN_DEVICE_FUNC inline void pscatter(Scalar* to, const Packet& from,
-    Index stride, typename unpacket_traits<Packet>::mask_t umask);
+EIGEN_DEVICE_FUNC inline void pscatter(Scalar* to, const Packet& from, Index stride,
+                                       typename unpacket_traits<Packet>::mask_t umask);
 template <>
-EIGEN_DEVICE_FUNC inline void pscatter<float, Packet16f>(float* to,
-                                                         const Packet16f& from,
-                                                         Index stride,
+EIGEN_DEVICE_FUNC inline void pscatter<float, Packet16f>(float* to, const Packet16f& from, Index stride,
                                                          uint16_t umask) {
   Packet16i stride_vector = _mm512_set1_epi32(convert_index<int>(stride));
-  Packet16i stride_multiplier =
-      _mm512_set_epi32(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
+  Packet16i stride_multiplier = _mm512_set_epi32(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
   Packet16i indices = _mm512_mullo_epi32(stride_vector, stride_multiplier);
   __mmask16 mask = static_cast<__mmask16>(umask);
   _mm512_mask_i32scatter_ps(to, mask, indices, from, 4);
 }
 template <>
-EIGEN_DEVICE_FUNC inline void pscatter<double, Packet8d>(double* to,
-                                                         const Packet8d& from,
-                                                         Index stride,
+EIGEN_DEVICE_FUNC inline void pscatter<double, Packet8d>(double* to, const Packet8d& from, Index stride,
                                                          uint8_t umask) {
   Packet8i stride_vector = _mm256_set1_epi32(convert_index<int>(stride));
   Packet8i stride_multiplier = _mm256_set_epi32(7, 6, 5, 4, 3, 2, 1, 0);
@@ -1050,31 +1044,23 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC inline void pscatter<float, Packet16f>(float* to,
-                                                         const Packet16f& from,
-                                                         Index stride) {
+EIGEN_DEVICE_FUNC inline void pscatter<float, Packet16f>(float* to, const Packet16f& from, Index stride) {
   Packet16i stride_vector = _mm512_set1_epi32(convert_index<int>(stride));
-  Packet16i stride_multiplier =
-      _mm512_set_epi32(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
+  Packet16i stride_multiplier = _mm512_set_epi32(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
   Packet16i indices = _mm512_mullo_epi32(stride_vector, stride_multiplier);
   _mm512_i32scatter_ps(to, indices, from, 4);
 }
 template <>
-EIGEN_DEVICE_FUNC inline void pscatter<double, Packet8d>(double* to,
-                                                         const Packet8d& from,
-                                                         Index stride) {
+EIGEN_DEVICE_FUNC inline void pscatter<double, Packet8d>(double* to, const Packet8d& from, Index stride) {
   Packet8i stride_vector = _mm256_set1_epi32(convert_index<int>(stride));
   Packet8i stride_multiplier = _mm256_set_epi32(7, 6, 5, 4, 3, 2, 1, 0);
   Packet8i indices = _mm256_mullo_epi32(stride_vector, stride_multiplier);
   _mm512_i32scatter_pd(to, indices, from, 8);
 }
 template <>
-EIGEN_DEVICE_FUNC inline void pscatter<int, Packet16i>(int* to,
-                                                       const Packet16i& from,
-                                                       Index stride) {
+EIGEN_DEVICE_FUNC inline void pscatter<int, Packet16i>(int* to, const Packet16i& from, Index stride) {
   Packet16i stride_vector = _mm512_set1_epi32(convert_index<int>(stride));
-  Packet16i stride_multiplier =
-      _mm512_set_epi32(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
+  Packet16i stride_multiplier = _mm512_set_epi32(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
   Packet16i indices = _mm512_mullo_epi32(stride_vector, stride_multiplier);
   _mm512_i32scatter_epi32(to, indices, from, 4);
 }
@@ -1095,9 +1081,18 @@
   pstore(to, pa);
 }
 
-template<> EIGEN_STRONG_INLINE void prefetch<float>(const float*   addr) { _mm_prefetch((SsePrefetchPtrType)(addr), _MM_HINT_T0); }
-template<> EIGEN_STRONG_INLINE void prefetch<double>(const double* addr) { _mm_prefetch((SsePrefetchPtrType)(addr), _MM_HINT_T0); }
-template<> EIGEN_STRONG_INLINE void prefetch<int>(const int*       addr) { _mm_prefetch((SsePrefetchPtrType)(addr), _MM_HINT_T0); }
+template <>
+EIGEN_STRONG_INLINE void prefetch<float>(const float* addr) {
+  _mm_prefetch((SsePrefetchPtrType)(addr), _MM_HINT_T0);
+}
+template <>
+EIGEN_STRONG_INLINE void prefetch<double>(const double* addr) {
+  _mm_prefetch((SsePrefetchPtrType)(addr), _MM_HINT_T0);
+}
+template <>
+EIGEN_STRONG_INLINE void prefetch<int>(const int* addr) {
+  _mm_prefetch((SsePrefetchPtrType)(addr), _MM_HINT_T0);
+}
 
 template <>
 EIGEN_STRONG_INLINE float pfirst<Packet16f>(const Packet16f& a) {
@@ -1112,69 +1107,81 @@
   return _mm_extract_epi32(_mm512_extracti32x4_epi32(a, 0), 0);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16f preverse(const Packet16f& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet16f preverse(const Packet16f& a) {
   return _mm512_permutexvar_ps(_mm512_set_epi32(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15), a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8d preverse(const Packet8d& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8d preverse(const Packet8d& a) {
   return _mm512_permutexvar_pd(_mm512_set_epi32(0, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7), a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16i preverse(const Packet16i& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet16i preverse(const Packet16i& a) {
   return _mm512_permutexvar_epi32(_mm512_set_epi32(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15), a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16f pabs(const Packet16f& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet16f pabs(const Packet16f& a) {
   // _mm512_abs_ps intrinsic not found, so hack around it
   return _mm512_castsi512_ps(_mm512_and_si512(_mm512_castps_si512(a), _mm512_set1_epi32(0x7fffffff)));
 }
 template <>
 EIGEN_STRONG_INLINE Packet8d pabs(const Packet8d& a) {
   // _mm512_abs_ps intrinsic not found, so hack around it
-  return _mm512_castsi512_pd(_mm512_and_si512(_mm512_castpd_si512(a),
-                                   _mm512_set1_epi64(0x7fffffffffffffff)));
+  return _mm512_castsi512_pd(_mm512_and_si512(_mm512_castpd_si512(a), _mm512_set1_epi64(0x7fffffffffffffff)));
 }
-template<> EIGEN_STRONG_INLINE Packet16i pabs(const Packet16i& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet16i pabs(const Packet16i& a) {
   return _mm512_abs_epi32(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16h  psignbit(const Packet16h&  a) { return _mm256_srai_epi16(a, 15); }
-template<> EIGEN_STRONG_INLINE Packet16bf psignbit(const Packet16bf& a) { return _mm256_srai_epi16(a, 15); }
-template<> EIGEN_STRONG_INLINE Packet16f  psignbit(const Packet16f&  a) { return _mm512_castsi512_ps(_mm512_srai_epi32(_mm512_castps_si512(a), 31)); }
-template<> EIGEN_STRONG_INLINE Packet8d   psignbit(const Packet8d&   a) { return _mm512_castsi512_pd(_mm512_srai_epi64(_mm512_castpd_si512(a), 63)); }
+template <>
+EIGEN_STRONG_INLINE Packet16h psignbit(const Packet16h& a) {
+  return _mm256_srai_epi16(a, 15);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16bf psignbit(const Packet16bf& a) {
+  return _mm256_srai_epi16(a, 15);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16f psignbit(const Packet16f& a) {
+  return _mm512_castsi512_ps(_mm512_srai_epi32(_mm512_castps_si512(a), 31));
+}
+template <>
+EIGEN_STRONG_INLINE Packet8d psignbit(const Packet8d& a) {
+  return _mm512_castsi512_pd(_mm512_srai_epi64(_mm512_castpd_si512(a), 63));
+}
 
-template<>
-EIGEN_STRONG_INLINE Packet16f pfrexp<Packet16f>(const Packet16f& a, Packet16f& exponent){
+template <>
+EIGEN_STRONG_INLINE Packet16f pfrexp<Packet16f>(const Packet16f& a, Packet16f& exponent) {
   return pfrexp_generic(a, exponent);
 }
 
 // Extract exponent without existence of Packet8l.
-template<>
-EIGEN_STRONG_INLINE
-Packet8d pfrexp_generic_get_biased_exponent(const Packet8d& a) {
-  const Packet8d cst_exp_mask  = pset1frombits<Packet8d>(static_cast<uint64_t>(0x7ff0000000000000ull));
-  #ifdef EIGEN_VECTORIZE_AVX512DQ
+template <>
+EIGEN_STRONG_INLINE Packet8d pfrexp_generic_get_biased_exponent(const Packet8d& a) {
+  const Packet8d cst_exp_mask = pset1frombits<Packet8d>(static_cast<uint64_t>(0x7ff0000000000000ull));
+#ifdef EIGEN_VECTORIZE_AVX512DQ
   return _mm512_cvtepi64_pd(_mm512_srli_epi64(_mm512_castpd_si512(pand(a, cst_exp_mask)), 52));
-  #else
+#else
   return _mm512_cvtepi32_pd(_mm512_cvtepi64_epi32(_mm512_srli_epi64(_mm512_castpd_si512(pand(a, cst_exp_mask)), 52)));
-  #endif
+#endif
 }
 
-template<>
+template <>
 EIGEN_STRONG_INLINE Packet8d pfrexp<Packet8d>(const Packet8d& a, Packet8d& exponent) {
   return pfrexp_generic(a, exponent);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16f pldexp<Packet16f>(const Packet16f& a, const Packet16f& exponent) {
+template <>
+EIGEN_STRONG_INLINE Packet16f pldexp<Packet16f>(const Packet16f& a, const Packet16f& exponent) {
   return pldexp_generic(a, exponent);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8d pldexp<Packet8d>(const Packet8d& a, const Packet8d& exponent) {
+template <>
+EIGEN_STRONG_INLINE Packet8d pldexp<Packet8d>(const Packet8d& a, const Packet8d& exponent) {
   // Clamp exponent to [-2099, 2099]
   const Packet8d max_exponent = pset1<Packet8d>(2099.0);
   const Packet8i e = _mm512_cvtpd_epi32(pmin(pmax(exponent, pnegate(max_exponent)), max_exponent));
@@ -1203,30 +1210,26 @@
 
 #ifdef EIGEN_VECTORIZE_AVX512DQ
 // AVX512F does not define _mm512_extractf32x8_ps to extract _m256 from _m512
-#define EIGEN_EXTRACT_8f_FROM_16f(INPUT, OUTPUT)                           \
-  __m256 OUTPUT##_0 = _mm512_extractf32x8_ps(INPUT, 0);                    \
+#define EIGEN_EXTRACT_8f_FROM_16f(INPUT, OUTPUT)        \
+  __m256 OUTPUT##_0 = _mm512_extractf32x8_ps(INPUT, 0); \
   __m256 OUTPUT##_1 = _mm512_extractf32x8_ps(INPUT, 1)
 
 // AVX512F does not define _mm512_extracti32x8_epi32 to extract _m256i from _m512i
-#define EIGEN_EXTRACT_8i_FROM_16i(INPUT, OUTPUT)                           \
-  __m256i OUTPUT##_0 = _mm512_extracti32x8_epi32(INPUT, 0);                \
+#define EIGEN_EXTRACT_8i_FROM_16i(INPUT, OUTPUT)            \
+  __m256i OUTPUT##_0 = _mm512_extracti32x8_epi32(INPUT, 0); \
   __m256i OUTPUT##_1 = _mm512_extracti32x8_epi32(INPUT, 1)
 #else
-#define EIGEN_EXTRACT_8f_FROM_16f(INPUT, OUTPUT)                \
-  __m256 OUTPUT##_0 = _mm256_insertf128_ps(                     \
-      _mm256_castps128_ps256(_mm512_extractf32x4_ps(INPUT, 0)), \
-      _mm512_extractf32x4_ps(INPUT, 1), 1);                     \
-  __m256 OUTPUT##_1 = _mm256_insertf128_ps(                     \
-      _mm256_castps128_ps256(_mm512_extractf32x4_ps(INPUT, 2)), \
-      _mm512_extractf32x4_ps(INPUT, 3), 1)
+#define EIGEN_EXTRACT_8f_FROM_16f(INPUT, OUTPUT)                                                     \
+  __m256 OUTPUT##_0 = _mm256_insertf128_ps(_mm256_castps128_ps256(_mm512_extractf32x4_ps(INPUT, 0)), \
+                                           _mm512_extractf32x4_ps(INPUT, 1), 1);                     \
+  __m256 OUTPUT##_1 = _mm256_insertf128_ps(_mm256_castps128_ps256(_mm512_extractf32x4_ps(INPUT, 2)), \
+                                           _mm512_extractf32x4_ps(INPUT, 3), 1)
 
-#define EIGEN_EXTRACT_8i_FROM_16i(INPUT, OUTPUT)                    \
-  __m256i OUTPUT##_0 = _mm256_insertf128_si256(                     \
-      _mm256_castsi128_si256(_mm512_extracti32x4_epi32(INPUT, 0)),  \
-      _mm512_extracti32x4_epi32(INPUT, 1), 1);                      \
-  __m256i OUTPUT##_1 = _mm256_insertf128_si256(                     \
-      _mm256_castsi128_si256(_mm512_extracti32x4_epi32(INPUT, 2)),  \
-      _mm512_extracti32x4_epi32(INPUT, 3), 1)
+#define EIGEN_EXTRACT_8i_FROM_16i(INPUT, OUTPUT)                                                            \
+  __m256i OUTPUT##_0 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm512_extracti32x4_epi32(INPUT, 0)), \
+                                               _mm512_extracti32x4_epi32(INPUT, 1), 1);                     \
+  __m256i OUTPUT##_1 = _mm256_insertf128_si256(_mm256_castsi128_si256(_mm512_extracti32x4_epi32(INPUT, 2)), \
+                                               _mm512_extracti32x4_epi32(INPUT, 3), 1)
 #endif
 
 #ifdef EIGEN_VECTORIZE_AVX512DQ
@@ -1243,7 +1246,7 @@
   OUTPUT = _mm512_insertf32x4(OUTPUT, _mm256_extractf128_ps(INPUTB, 0), 2); \
   OUTPUT = _mm512_insertf32x4(OUTPUT, _mm256_extractf128_ps(INPUTB, 1), 3);
 
-#define EIGEN_INSERT_8i_INTO_16i(OUTPUT, INPUTA, INPUTB)                    \
+#define EIGEN_INSERT_8i_INTO_16i(OUTPUT, INPUTA, INPUTB)                       \
   OUTPUT = _mm512_undefined_epi32();                                           \
   OUTPUT = _mm512_inserti32x4(OUTPUT, _mm256_extractf128_si256(INPUTA, 0), 0); \
   OUTPUT = _mm512_inserti32x4(OUTPUT, _mm256_extractf128_si256(INPUTA, 1), 1); \
@@ -1337,7 +1340,7 @@
 
 template <>
 EIGEN_STRONG_INLINE float predux_mul<Packet16f>(const Packet16f& a) {
-//#ifdef EIGEN_VECTORIZE_AVX512DQ
+// #ifdef EIGEN_VECTORIZE_AVX512DQ
 #if 0
   Packet8f lane0 = _mm512_extractf32x8_ps(a, 0);
   Packet8f lane1 = _mm512_extractf32x8_ps(a, 1);
@@ -1403,17 +1406,17 @@
   return pfirst(_mm256_max_pd(res, _mm256_shuffle_pd(res, res, 1)));
 }
 
-template<> EIGEN_STRONG_INLINE bool predux_any(const Packet16f& x)
-{
+template <>
+EIGEN_STRONG_INLINE bool predux_any(const Packet16f& x) {
   Packet16i xi = _mm512_castps_si512(x);
-  __mmask16 tmp = _mm512_test_epi32_mask(xi,xi);
-  return !_mm512_kortestz(tmp,tmp);
+  __mmask16 tmp = _mm512_test_epi32_mask(xi, xi);
+  return !_mm512_kortestz(tmp, tmp);
 }
 
-template<> EIGEN_STRONG_INLINE bool predux_any(const Packet16i& x)
-{
-  __mmask16 tmp = _mm512_test_epi32_mask(x,x);
-  return !_mm512_kortestz(tmp,tmp);
+template <>
+EIGEN_STRONG_INLINE bool predux_any(const Packet16i& x) {
+  __mmask16 tmp = _mm512_test_epi32_mask(x, x);
+  return !_mm512_kortestz(tmp, tmp);
 }
 
 #define PACK_OUTPUT(OUTPUT, INPUT, INDEX, STRIDE) \
@@ -1530,28 +1533,27 @@
   PACK_OUTPUT(kernel.packet, tmp.packet, 14, 16);
   PACK_OUTPUT(kernel.packet, tmp.packet, 15, 16);
 }
-#define PACK_OUTPUT_2(OUTPUT, INPUT, INDEX, STRIDE)         \
-  EIGEN_INSERT_8f_INTO_16f(OUTPUT[INDEX], INPUT[2 * INDEX], \
-                           INPUT[2 * INDEX + STRIDE]);
+#define PACK_OUTPUT_2(OUTPUT, INPUT, INDEX, STRIDE) \
+  EIGEN_INSERT_8f_INTO_16f(OUTPUT[INDEX], INPUT[2 * INDEX], INPUT[2 * INDEX + STRIDE]);
 
 EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet16f, 8>& kernel) {
-  __m512 T0 = _mm512_unpacklo_ps(kernel.packet[0],kernel.packet[1]);
-  __m512 T1 = _mm512_unpackhi_ps(kernel.packet[0],kernel.packet[1]);
-  __m512 T2 = _mm512_unpacklo_ps(kernel.packet[2],kernel.packet[3]);
-  __m512 T3 = _mm512_unpackhi_ps(kernel.packet[2],kernel.packet[3]);
-  __m512 T4 = _mm512_unpacklo_ps(kernel.packet[4],kernel.packet[5]);
-  __m512 T5 = _mm512_unpackhi_ps(kernel.packet[4],kernel.packet[5]);
-  __m512 T6 = _mm512_unpacklo_ps(kernel.packet[6],kernel.packet[7]);
-  __m512 T7 = _mm512_unpackhi_ps(kernel.packet[6],kernel.packet[7]);
+  __m512 T0 = _mm512_unpacklo_ps(kernel.packet[0], kernel.packet[1]);
+  __m512 T1 = _mm512_unpackhi_ps(kernel.packet[0], kernel.packet[1]);
+  __m512 T2 = _mm512_unpacklo_ps(kernel.packet[2], kernel.packet[3]);
+  __m512 T3 = _mm512_unpackhi_ps(kernel.packet[2], kernel.packet[3]);
+  __m512 T4 = _mm512_unpacklo_ps(kernel.packet[4], kernel.packet[5]);
+  __m512 T5 = _mm512_unpackhi_ps(kernel.packet[4], kernel.packet[5]);
+  __m512 T6 = _mm512_unpacklo_ps(kernel.packet[6], kernel.packet[7]);
+  __m512 T7 = _mm512_unpackhi_ps(kernel.packet[6], kernel.packet[7]);
 
-  kernel.packet[0] = _mm512_castpd_ps(_mm512_unpacklo_pd(_mm512_castps_pd(T0),_mm512_castps_pd(T2)));
-  kernel.packet[1] = _mm512_castpd_ps(_mm512_unpackhi_pd(_mm512_castps_pd(T0),_mm512_castps_pd(T2)));
-  kernel.packet[2] = _mm512_castpd_ps(_mm512_unpacklo_pd(_mm512_castps_pd(T1),_mm512_castps_pd(T3)));
-  kernel.packet[3] = _mm512_castpd_ps(_mm512_unpackhi_pd(_mm512_castps_pd(T1),_mm512_castps_pd(T3)));
-  kernel.packet[4] = _mm512_castpd_ps(_mm512_unpacklo_pd(_mm512_castps_pd(T4),_mm512_castps_pd(T6)));
-  kernel.packet[5] = _mm512_castpd_ps(_mm512_unpackhi_pd(_mm512_castps_pd(T4),_mm512_castps_pd(T6)));
-  kernel.packet[6] = _mm512_castpd_ps(_mm512_unpacklo_pd(_mm512_castps_pd(T5),_mm512_castps_pd(T7)));
-  kernel.packet[7] = _mm512_castpd_ps(_mm512_unpackhi_pd(_mm512_castps_pd(T5),_mm512_castps_pd(T7)));
+  kernel.packet[0] = _mm512_castpd_ps(_mm512_unpacklo_pd(_mm512_castps_pd(T0), _mm512_castps_pd(T2)));
+  kernel.packet[1] = _mm512_castpd_ps(_mm512_unpackhi_pd(_mm512_castps_pd(T0), _mm512_castps_pd(T2)));
+  kernel.packet[2] = _mm512_castpd_ps(_mm512_unpacklo_pd(_mm512_castps_pd(T1), _mm512_castps_pd(T3)));
+  kernel.packet[3] = _mm512_castpd_ps(_mm512_unpackhi_pd(_mm512_castps_pd(T1), _mm512_castps_pd(T3)));
+  kernel.packet[4] = _mm512_castpd_ps(_mm512_unpacklo_pd(_mm512_castps_pd(T4), _mm512_castps_pd(T6)));
+  kernel.packet[5] = _mm512_castpd_ps(_mm512_unpackhi_pd(_mm512_castps_pd(T4), _mm512_castps_pd(T6)));
+  kernel.packet[6] = _mm512_castpd_ps(_mm512_unpacklo_pd(_mm512_castps_pd(T5), _mm512_castps_pd(T7)));
+  kernel.packet[7] = _mm512_castpd_ps(_mm512_unpackhi_pd(_mm512_castps_pd(T5), _mm512_castps_pd(T7)));
 
   T0 = _mm512_shuffle_f32x4(kernel.packet[0], kernel.packet[4], 0x44);
   T1 = _mm512_shuffle_f32x4(kernel.packet[0], kernel.packet[4], 0xee);
@@ -1612,8 +1614,7 @@
 
 #define PACK_OUTPUT_D(OUTPUT, INPUT, INDEX, STRIDE)                         \
   OUTPUT[INDEX] = _mm512_insertf64x4(OUTPUT[INDEX], INPUT[(2 * INDEX)], 0); \
-  OUTPUT[INDEX] =                                                           \
-      _mm512_insertf64x4(OUTPUT[INDEX], INPUT[(2 * INDEX) + STRIDE], 1);
+  OUTPUT[INDEX] = _mm512_insertf64x4(OUTPUT[INDEX], INPUT[(2 * INDEX) + STRIDE], 1);
 
 EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet8d, 4>& kernel) {
   __m512d T0 = _mm512_shuffle_pd(kernel.packet[0], kernel.packet[1], 0);
@@ -1623,23 +1624,15 @@
 
   PacketBlock<Packet4d, 8> tmp;
 
-  tmp.packet[0] = _mm256_permute2f128_pd(_mm512_extractf64x4_pd(T0, 0),
-                                         _mm512_extractf64x4_pd(T2, 0), 0x20);
-  tmp.packet[1] = _mm256_permute2f128_pd(_mm512_extractf64x4_pd(T1, 0),
-                                         _mm512_extractf64x4_pd(T3, 0), 0x20);
-  tmp.packet[2] = _mm256_permute2f128_pd(_mm512_extractf64x4_pd(T0, 0),
-                                         _mm512_extractf64x4_pd(T2, 0), 0x31);
-  tmp.packet[3] = _mm256_permute2f128_pd(_mm512_extractf64x4_pd(T1, 0),
-                                         _mm512_extractf64x4_pd(T3, 0), 0x31);
+  tmp.packet[0] = _mm256_permute2f128_pd(_mm512_extractf64x4_pd(T0, 0), _mm512_extractf64x4_pd(T2, 0), 0x20);
+  tmp.packet[1] = _mm256_permute2f128_pd(_mm512_extractf64x4_pd(T1, 0), _mm512_extractf64x4_pd(T3, 0), 0x20);
+  tmp.packet[2] = _mm256_permute2f128_pd(_mm512_extractf64x4_pd(T0, 0), _mm512_extractf64x4_pd(T2, 0), 0x31);
+  tmp.packet[3] = _mm256_permute2f128_pd(_mm512_extractf64x4_pd(T1, 0), _mm512_extractf64x4_pd(T3, 0), 0x31);
 
-  tmp.packet[4] = _mm256_permute2f128_pd(_mm512_extractf64x4_pd(T0, 1),
-                                         _mm512_extractf64x4_pd(T2, 1), 0x20);
-  tmp.packet[5] = _mm256_permute2f128_pd(_mm512_extractf64x4_pd(T1, 1),
-                                         _mm512_extractf64x4_pd(T3, 1), 0x20);
-  tmp.packet[6] = _mm256_permute2f128_pd(_mm512_extractf64x4_pd(T0, 1),
-                                         _mm512_extractf64x4_pd(T2, 1), 0x31);
-  tmp.packet[7] = _mm256_permute2f128_pd(_mm512_extractf64x4_pd(T1, 1),
-                                         _mm512_extractf64x4_pd(T3, 1), 0x31);
+  tmp.packet[4] = _mm256_permute2f128_pd(_mm512_extractf64x4_pd(T0, 1), _mm512_extractf64x4_pd(T2, 1), 0x20);
+  tmp.packet[5] = _mm256_permute2f128_pd(_mm512_extractf64x4_pd(T1, 1), _mm512_extractf64x4_pd(T3, 1), 0x20);
+  tmp.packet[6] = _mm256_permute2f128_pd(_mm512_extractf64x4_pd(T0, 1), _mm512_extractf64x4_pd(T2, 1), 0x31);
+  tmp.packet[7] = _mm256_permute2f128_pd(_mm512_extractf64x4_pd(T1, 1), _mm512_extractf64x4_pd(T3, 1), 0x31);
 
   PACK_OUTPUT_D(kernel.packet, tmp.packet, 0, 1);
   PACK_OUTPUT_D(kernel.packet, tmp.packet, 1, 1);
@@ -1648,64 +1641,66 @@
 }
 
 EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet8d, 8>& kernel) {
-    __m512d T0 = _mm512_unpacklo_pd(kernel.packet[0],kernel.packet[1]);
-    __m512d T1 = _mm512_unpackhi_pd(kernel.packet[0],kernel.packet[1]);
-    __m512d T2 = _mm512_unpacklo_pd(kernel.packet[2],kernel.packet[3]);
-    __m512d T3 = _mm512_unpackhi_pd(kernel.packet[2],kernel.packet[3]);
-    __m512d T4 = _mm512_unpacklo_pd(kernel.packet[4],kernel.packet[5]);
-    __m512d T5 = _mm512_unpackhi_pd(kernel.packet[4],kernel.packet[5]);
-    __m512d T6 = _mm512_unpacklo_pd(kernel.packet[6],kernel.packet[7]);
-    __m512d T7 = _mm512_unpackhi_pd(kernel.packet[6],kernel.packet[7]);
+  __m512d T0 = _mm512_unpacklo_pd(kernel.packet[0], kernel.packet[1]);
+  __m512d T1 = _mm512_unpackhi_pd(kernel.packet[0], kernel.packet[1]);
+  __m512d T2 = _mm512_unpacklo_pd(kernel.packet[2], kernel.packet[3]);
+  __m512d T3 = _mm512_unpackhi_pd(kernel.packet[2], kernel.packet[3]);
+  __m512d T4 = _mm512_unpacklo_pd(kernel.packet[4], kernel.packet[5]);
+  __m512d T5 = _mm512_unpackhi_pd(kernel.packet[4], kernel.packet[5]);
+  __m512d T6 = _mm512_unpacklo_pd(kernel.packet[6], kernel.packet[7]);
+  __m512d T7 = _mm512_unpackhi_pd(kernel.packet[6], kernel.packet[7]);
 
-    kernel.packet[0] = _mm512_permutex_pd(T2, 0x4E);
-    kernel.packet[0] = _mm512_mask_blend_pd(0xCC, T0, kernel.packet[0]);
-    kernel.packet[2] = _mm512_permutex_pd(T0, 0x4E);
-    kernel.packet[2] = _mm512_mask_blend_pd(0xCC, kernel.packet[2], T2);
-    kernel.packet[1] = _mm512_permutex_pd(T3, 0x4E);
-    kernel.packet[1] = _mm512_mask_blend_pd(0xCC, T1, kernel.packet[1]);
-    kernel.packet[3] = _mm512_permutex_pd(T1, 0x4E);
-    kernel.packet[3] = _mm512_mask_blend_pd(0xCC, kernel.packet[3], T3);
-    kernel.packet[4] = _mm512_permutex_pd(T6, 0x4E);
-    kernel.packet[4] = _mm512_mask_blend_pd(0xCC, T4, kernel.packet[4]);
-    kernel.packet[6] = _mm512_permutex_pd(T4, 0x4E);
-    kernel.packet[6] = _mm512_mask_blend_pd(0xCC, kernel.packet[6], T6);
-    kernel.packet[5] = _mm512_permutex_pd(T7, 0x4E);
-    kernel.packet[5] = _mm512_mask_blend_pd(0xCC, T5, kernel.packet[5]);
-    kernel.packet[7] = _mm512_permutex_pd(T5, 0x4E);
-    kernel.packet[7] = _mm512_mask_blend_pd(0xCC, kernel.packet[7], T7);
+  kernel.packet[0] = _mm512_permutex_pd(T2, 0x4E);
+  kernel.packet[0] = _mm512_mask_blend_pd(0xCC, T0, kernel.packet[0]);
+  kernel.packet[2] = _mm512_permutex_pd(T0, 0x4E);
+  kernel.packet[2] = _mm512_mask_blend_pd(0xCC, kernel.packet[2], T2);
+  kernel.packet[1] = _mm512_permutex_pd(T3, 0x4E);
+  kernel.packet[1] = _mm512_mask_blend_pd(0xCC, T1, kernel.packet[1]);
+  kernel.packet[3] = _mm512_permutex_pd(T1, 0x4E);
+  kernel.packet[3] = _mm512_mask_blend_pd(0xCC, kernel.packet[3], T3);
+  kernel.packet[4] = _mm512_permutex_pd(T6, 0x4E);
+  kernel.packet[4] = _mm512_mask_blend_pd(0xCC, T4, kernel.packet[4]);
+  kernel.packet[6] = _mm512_permutex_pd(T4, 0x4E);
+  kernel.packet[6] = _mm512_mask_blend_pd(0xCC, kernel.packet[6], T6);
+  kernel.packet[5] = _mm512_permutex_pd(T7, 0x4E);
+  kernel.packet[5] = _mm512_mask_blend_pd(0xCC, T5, kernel.packet[5]);
+  kernel.packet[7] = _mm512_permutex_pd(T5, 0x4E);
+  kernel.packet[7] = _mm512_mask_blend_pd(0xCC, kernel.packet[7], T7);
 
-    T0 = _mm512_shuffle_f64x2(kernel.packet[4], kernel.packet[4], 0x4E);
-    T0 = _mm512_mask_blend_pd(0xF0, kernel.packet[0], T0);
-    T4 = _mm512_shuffle_f64x2(kernel.packet[0], kernel.packet[0], 0x4E);
-    T4 = _mm512_mask_blend_pd(0xF0, T4, kernel.packet[4]);
-    T1 = _mm512_shuffle_f64x2(kernel.packet[5], kernel.packet[5], 0x4E);
-    T1 = _mm512_mask_blend_pd(0xF0, kernel.packet[1], T1);
-    T5 = _mm512_shuffle_f64x2(kernel.packet[1], kernel.packet[1], 0x4E);
-    T5 = _mm512_mask_blend_pd(0xF0, T5, kernel.packet[5]);
-    T2 = _mm512_shuffle_f64x2(kernel.packet[6], kernel.packet[6], 0x4E);
-    T2 = _mm512_mask_blend_pd(0xF0, kernel.packet[2], T2);
-    T6 = _mm512_shuffle_f64x2(kernel.packet[2], kernel.packet[2], 0x4E);
-    T6 = _mm512_mask_blend_pd(0xF0, T6, kernel.packet[6]);
-    T3 = _mm512_shuffle_f64x2(kernel.packet[7], kernel.packet[7], 0x4E);
-    T3 = _mm512_mask_blend_pd(0xF0, kernel.packet[3], T3);
-    T7 = _mm512_shuffle_f64x2(kernel.packet[3], kernel.packet[3], 0x4E);
-    T7 = _mm512_mask_blend_pd(0xF0, T7, kernel.packet[7]);
+  T0 = _mm512_shuffle_f64x2(kernel.packet[4], kernel.packet[4], 0x4E);
+  T0 = _mm512_mask_blend_pd(0xF0, kernel.packet[0], T0);
+  T4 = _mm512_shuffle_f64x2(kernel.packet[0], kernel.packet[0], 0x4E);
+  T4 = _mm512_mask_blend_pd(0xF0, T4, kernel.packet[4]);
+  T1 = _mm512_shuffle_f64x2(kernel.packet[5], kernel.packet[5], 0x4E);
+  T1 = _mm512_mask_blend_pd(0xF0, kernel.packet[1], T1);
+  T5 = _mm512_shuffle_f64x2(kernel.packet[1], kernel.packet[1], 0x4E);
+  T5 = _mm512_mask_blend_pd(0xF0, T5, kernel.packet[5]);
+  T2 = _mm512_shuffle_f64x2(kernel.packet[6], kernel.packet[6], 0x4E);
+  T2 = _mm512_mask_blend_pd(0xF0, kernel.packet[2], T2);
+  T6 = _mm512_shuffle_f64x2(kernel.packet[2], kernel.packet[2], 0x4E);
+  T6 = _mm512_mask_blend_pd(0xF0, T6, kernel.packet[6]);
+  T3 = _mm512_shuffle_f64x2(kernel.packet[7], kernel.packet[7], 0x4E);
+  T3 = _mm512_mask_blend_pd(0xF0, kernel.packet[3], T3);
+  T7 = _mm512_shuffle_f64x2(kernel.packet[3], kernel.packet[3], 0x4E);
+  T7 = _mm512_mask_blend_pd(0xF0, T7, kernel.packet[7]);
 
-    kernel.packet[0] = T0; kernel.packet[1] = T1;
-    kernel.packet[2] = T2; kernel.packet[3] = T3;
-    kernel.packet[4] = T4; kernel.packet[5] = T5;
-    kernel.packet[6] = T6; kernel.packet[7] = T7;
+  kernel.packet[0] = T0;
+  kernel.packet[1] = T1;
+  kernel.packet[2] = T2;
+  kernel.packet[3] = T3;
+  kernel.packet[4] = T4;
+  kernel.packet[5] = T5;
+  kernel.packet[6] = T6;
+  kernel.packet[7] = T7;
 }
 
 #define PACK_OUTPUT_I32(OUTPUT, INPUT, INDEX, STRIDE) \
   EIGEN_INSERT_8i_INTO_16i(OUTPUT[INDEX], INPUT[INDEX], INPUT[INDEX + STRIDE]);
 
-#define PACK_OUTPUT_I32_2(OUTPUT, INPUT, INDEX, STRIDE)     \
-  EIGEN_INSERT_8i_INTO_16i(OUTPUT[INDEX], INPUT[2 * INDEX], \
-                           INPUT[2 * INDEX + STRIDE]);
+#define PACK_OUTPUT_I32_2(OUTPUT, INPUT, INDEX, STRIDE) \
+  EIGEN_INSERT_8i_INTO_16i(OUTPUT[INDEX], INPUT[2 * INDEX], INPUT[2 * INDEX + STRIDE]);
 
-#define SHUFFLE_EPI32(A, B, M) \
-  _mm512_castps_si512(_mm512_shuffle_ps(_mm512_castsi512_ps(A), _mm512_castsi512_ps(B), M))
+#define SHUFFLE_EPI32(A, B, M) _mm512_castps_si512(_mm512_shuffle_ps(_mm512_castsi512_ps(A), _mm512_castsi512_ps(B), M))
 
 EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet16i, 16>& kernel) {
   __m512i T0 = _mm512_unpacklo_epi32(kernel.packet[0], kernel.packet[1]);
@@ -1854,8 +1849,7 @@
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet16f pblend(const Selector<16>& ifPacket,
-                                     const Packet16f& thenPacket,
+EIGEN_STRONG_INLINE Packet16f pblend(const Selector<16>& ifPacket, const Packet16f& thenPacket,
                                      const Packet16f& elsePacket) {
   __mmask16 m = (ifPacket.select[0]) | (ifPacket.select[1] << 1) | (ifPacket.select[2] << 2) |
                 (ifPacket.select[3] << 3) | (ifPacket.select[4] << 4) | (ifPacket.select[5] << 5) |
@@ -1866,51 +1860,51 @@
   return _mm512_mask_blend_ps(m, elsePacket, thenPacket);
 }
 template <>
-EIGEN_STRONG_INLINE Packet8d pblend(const Selector<8>& ifPacket,
-                                    const Packet8d& thenPacket,
+EIGEN_STRONG_INLINE Packet8d pblend(const Selector<8>& ifPacket, const Packet8d& thenPacket,
                                     const Packet8d& elsePacket) {
-  __mmask8 m = (ifPacket.select[0]   )
-             | (ifPacket.select[1]<<1)
-             | (ifPacket.select[2]<<2)
-             | (ifPacket.select[3]<<3)
-             | (ifPacket.select[4]<<4)
-             | (ifPacket.select[5]<<5)
-             | (ifPacket.select[6]<<6)
-             | (ifPacket.select[7]<<7);
+  __mmask8 m = (ifPacket.select[0]) | (ifPacket.select[1] << 1) | (ifPacket.select[2] << 2) |
+               (ifPacket.select[3] << 3) | (ifPacket.select[4] << 4) | (ifPacket.select[5] << 5) |
+               (ifPacket.select[6] << 6) | (ifPacket.select[7] << 7);
   return _mm512_mask_blend_pd(m, elsePacket, thenPacket);
 }
 
 // Packet math for Eigen::half
-template<> EIGEN_STRONG_INLINE Packet16h pset1<Packet16h>(const Eigen::half& from) {
+template <>
+EIGEN_STRONG_INLINE Packet16h pset1<Packet16h>(const Eigen::half& from) {
   return _mm256_set1_epi16(from.x);
 }
 
-template<> EIGEN_STRONG_INLINE Eigen::half pfirst<Packet16h>(const Packet16h& from) {
+template <>
+EIGEN_STRONG_INLINE Eigen::half pfirst<Packet16h>(const Packet16h& from) {
   return half_impl::raw_uint16_to_half(static_cast<unsigned short>(_mm256_extract_epi16(from, 0)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet16h pload<Packet16h>(const Eigen::half* from) {
+template <>
+EIGEN_STRONG_INLINE Packet16h pload<Packet16h>(const Eigen::half* from) {
   return _mm256_load_si256(reinterpret_cast<const __m256i*>(from));
 }
 
-template<> EIGEN_STRONG_INLINE Packet16h ploadu<Packet16h>(const Eigen::half* from) {
+template <>
+EIGEN_STRONG_INLINE Packet16h ploadu<Packet16h>(const Eigen::half* from) {
   return _mm256_loadu_si256(reinterpret_cast<const __m256i*>(from));
 }
 
-template<> EIGEN_STRONG_INLINE void pstore<half>(Eigen::half* to, const Packet16h& from) {
+template <>
+EIGEN_STRONG_INLINE void pstore<half>(Eigen::half* to, const Packet16h& from) {
   // (void*) -> workaround clang warning:
   // cast from 'Eigen::half *' to '__m256i *' increases required alignment from 2 to 32
   _mm256_store_si256((__m256i*)(void*)to, from);
 }
 
-template<> EIGEN_STRONG_INLINE void pstoreu<half>(Eigen::half* to, const Packet16h& from) {
+template <>
+EIGEN_STRONG_INLINE void pstoreu<half>(Eigen::half* to, const Packet16h& from) {
   // (void*) -> workaround clang warning:
   // cast from 'Eigen::half *' to '__m256i *' increases required alignment from 2 to 32
   _mm256_storeu_si256((__m256i*)(void*)to, from);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16h
-ploaddup<Packet16h>(const Eigen::half*  from) {
+template <>
+EIGEN_STRONG_INLINE Packet16h ploaddup<Packet16h>(const Eigen::half* from) {
   unsigned short a = from[0].x;
   unsigned short b = from[1].x;
   unsigned short c = from[2].x;
@@ -1922,8 +1916,8 @@
   return _mm256_set_epi16(h, h, g, g, f, f, e, e, d, d, c, c, b, b, a, a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16h
-ploadquad(const Eigen::half* from) {
+template <>
+EIGEN_STRONG_INLINE Packet16h ploadquad(const Eigen::half* from) {
   unsigned short a = from[0].x;
   unsigned short b = from[1].x;
   unsigned short c = from[2].x;
@@ -1931,15 +1925,14 @@
   return _mm256_set_epi16(d, d, d, d, c, c, c, c, b, b, b, b, a, a, a, a);
 }
 
-EIGEN_STRONG_INLINE Packet16f half2float(const Packet16h& a) {
-  return _mm512_cvtph_ps(a);
-}
+EIGEN_STRONG_INLINE Packet16f half2float(const Packet16h& a) { return _mm512_cvtph_ps(a); }
 
 EIGEN_STRONG_INLINE Packet16h float2half(const Packet16f& a) {
-  return _mm512_cvtps_ph(a, _MM_FROUND_TO_NEAREST_INT|_MM_FROUND_NO_EXC);
+  return _mm512_cvtps_ph(a, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16h ptrue(const Packet16h& a) {
+template <>
+EIGEN_STRONG_INLINE Packet16h ptrue(const Packet16h& a) {
   return Packet16h(ptrue(Packet8i(a)));
 }
 
@@ -1950,14 +1943,12 @@
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet16h pmin<Packet16h>(const Packet16h& a,
-                                              const Packet16h& b) {
+EIGEN_STRONG_INLINE Packet16h pmin<Packet16h>(const Packet16h& a, const Packet16h& b) {
   return float2half(pmin<Packet16f>(half2float(a), half2float(b)));
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet16h pmax<Packet16h>(const Packet16h& a,
-                                              const Packet16h& b) {
+EIGEN_STRONG_INLINE Packet16h pmax<Packet16h>(const Packet16h& a, const Packet16h& b) {
   return float2half(pmax<Packet16f>(half2float(a), half2float(b)));
 }
 
@@ -1966,96 +1957,118 @@
   return float2half(plset<Packet16f>(static_cast<float>(a)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet16h por(const Packet16h& a,const Packet16h& b) {
+template <>
+EIGEN_STRONG_INLINE Packet16h por(const Packet16h& a, const Packet16h& b) {
   // in some cases Packet8i is a wrapper around __m256i, so we need to
   // cast to Packet8i to call the correct overload.
-  return Packet16h(por(Packet8i(a),Packet8i(b)));
+  return Packet16h(por(Packet8i(a), Packet8i(b)));
 }
-template<> EIGEN_STRONG_INLINE Packet16h pxor(const Packet16h& a,const Packet16h& b) {
-  return Packet16h(pxor(Packet8i(a),Packet8i(b)));
+template <>
+EIGEN_STRONG_INLINE Packet16h pxor(const Packet16h& a, const Packet16h& b) {
+  return Packet16h(pxor(Packet8i(a), Packet8i(b)));
 }
-template<> EIGEN_STRONG_INLINE Packet16h pand(const Packet16h& a,const Packet16h& b) {
-  return Packet16h(pand(Packet8i(a),Packet8i(b)));
+template <>
+EIGEN_STRONG_INLINE Packet16h pand(const Packet16h& a, const Packet16h& b) {
+  return Packet16h(pand(Packet8i(a), Packet8i(b)));
 }
-template<> EIGEN_STRONG_INLINE Packet16h pandnot(const Packet16h& a,const Packet16h& b) {
-  return Packet16h(pandnot(Packet8i(a),Packet8i(b)));
+template <>
+EIGEN_STRONG_INLINE Packet16h pandnot(const Packet16h& a, const Packet16h& b) {
+  return Packet16h(pandnot(Packet8i(a), Packet8i(b)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet16h pselect(const Packet16h& mask, const Packet16h& a, const Packet16h& b) {
+template <>
+EIGEN_STRONG_INLINE Packet16h pselect(const Packet16h& mask, const Packet16h& a, const Packet16h& b) {
   return _mm256_blendv_epi8(b, a, mask);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16h pround<Packet16h>(const Packet16h& a) {
+template <>
+EIGEN_STRONG_INLINE Packet16h pround<Packet16h>(const Packet16h& a) {
   return float2half(pround<Packet16f>(half2float(a)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet16h print<Packet16h>(const Packet16h& a) {
+template <>
+EIGEN_STRONG_INLINE Packet16h print<Packet16h>(const Packet16h& a) {
   return float2half(print<Packet16f>(half2float(a)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet16h pceil<Packet16h>(const Packet16h& a) {
+template <>
+EIGEN_STRONG_INLINE Packet16h pceil<Packet16h>(const Packet16h& a) {
   return float2half(pceil<Packet16f>(half2float(a)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet16h pfloor<Packet16h>(const Packet16h& a) {
+template <>
+EIGEN_STRONG_INLINE Packet16h pfloor<Packet16h>(const Packet16h& a) {
   return float2half(pfloor<Packet16f>(half2float(a)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet16h pcmp_eq(const Packet16h& a,const Packet16h& b) {
+template <>
+EIGEN_STRONG_INLINE Packet16h pcmp_eq(const Packet16h& a, const Packet16h& b) {
   Packet16f af = half2float(a);
   Packet16f bf = half2float(b);
   return Pack32To16(pcmp_eq(af, bf));
 }
 
-template<> EIGEN_STRONG_INLINE Packet16h pcmp_le(const Packet16h& a,const Packet16h& b) {
+template <>
+EIGEN_STRONG_INLINE Packet16h pcmp_le(const Packet16h& a, const Packet16h& b) {
   return Pack32To16(pcmp_le(half2float(a), half2float(b)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet16h pcmp_lt(const Packet16h& a,const Packet16h& b) {
+template <>
+EIGEN_STRONG_INLINE Packet16h pcmp_lt(const Packet16h& a, const Packet16h& b) {
   return Pack32To16(pcmp_lt(half2float(a), half2float(b)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet16h pcmp_lt_or_nan(const Packet16h& a,const Packet16h& b) {
+template <>
+EIGEN_STRONG_INLINE Packet16h pcmp_lt_or_nan(const Packet16h& a, const Packet16h& b) {
   return Pack32To16(pcmp_lt_or_nan(half2float(a), half2float(b)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet16h pconj(const Packet16h& a) { return a; }
+template <>
+EIGEN_STRONG_INLINE Packet16h pconj(const Packet16h& a) {
+  return a;
+}
 
-template<> EIGEN_STRONG_INLINE Packet16h pnegate(const Packet16h& a) {
+template <>
+EIGEN_STRONG_INLINE Packet16h pnegate(const Packet16h& a) {
   Packet16h sign_mask = _mm256_set1_epi16(static_cast<unsigned short>(0x8000));
   return _mm256_xor_si256(a, sign_mask);
 }
 
 #ifndef EIGEN_VECTORIZE_AVX512FP16
-template<> EIGEN_STRONG_INLINE Packet16h padd<Packet16h>(const Packet16h& a, const Packet16h& b) {
+template <>
+EIGEN_STRONG_INLINE Packet16h padd<Packet16h>(const Packet16h& a, const Packet16h& b) {
   Packet16f af = half2float(a);
   Packet16f bf = half2float(b);
   Packet16f rf = padd(af, bf);
   return float2half(rf);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16h psub<Packet16h>(const Packet16h& a, const Packet16h& b) {
+template <>
+EIGEN_STRONG_INLINE Packet16h psub<Packet16h>(const Packet16h& a, const Packet16h& b) {
   Packet16f af = half2float(a);
   Packet16f bf = half2float(b);
   Packet16f rf = psub(af, bf);
   return float2half(rf);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16h pmul<Packet16h>(const Packet16h& a, const Packet16h& b) {
+template <>
+EIGEN_STRONG_INLINE Packet16h pmul<Packet16h>(const Packet16h& a, const Packet16h& b) {
   Packet16f af = half2float(a);
   Packet16f bf = half2float(b);
   Packet16f rf = pmul(af, bf);
   return float2half(rf);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16h pdiv<Packet16h>(const Packet16h& a, const Packet16h& b) {
+template <>
+EIGEN_STRONG_INLINE Packet16h pdiv<Packet16h>(const Packet16h& a, const Packet16h& b) {
   Packet16f af = half2float(a);
   Packet16f bf = half2float(b);
   Packet16f rf = pdiv(af, bf);
   return float2half(rf);
 }
 
-template<> EIGEN_STRONG_INLINE half predux<Packet16h>(const Packet16h& from) {
+template <>
+EIGEN_STRONG_INLINE half predux<Packet16h>(const Packet16h& from) {
   Packet16f from_float = half2float(from);
   return half(predux(from_float));
 }
@@ -2069,64 +2082,64 @@
   return padd<Packet8h>(lane0, lane1);
 }
 
-template<> EIGEN_STRONG_INLINE Eigen::half predux_max<Packet16h>(const Packet16h& a) {
+template <>
+EIGEN_STRONG_INLINE Eigen::half predux_max<Packet16h>(const Packet16h& a) {
   Packet16f af = half2float(a);
   float reduced = predux_max<Packet16f>(af);
   return Eigen::half(reduced);
 }
 
-template<> EIGEN_STRONG_INLINE Eigen::half predux_min<Packet16h>(const Packet16h& a) {
+template <>
+EIGEN_STRONG_INLINE Eigen::half predux_min<Packet16h>(const Packet16h& a) {
   Packet16f af = half2float(a);
   float reduced = predux_min<Packet16f>(af);
   return Eigen::half(reduced);
 }
 
-template<> EIGEN_STRONG_INLINE half predux_mul<Packet16h>(const Packet16h& from) {
+template <>
+EIGEN_STRONG_INLINE half predux_mul<Packet16h>(const Packet16h& from) {
   Packet16f from_float = half2float(from);
   return half(predux_mul(from_float));
 }
 
-template<> EIGEN_STRONG_INLINE Packet16h preverse(const Packet16h& a)
-{
-  __m128i m = _mm_setr_epi8(14,15,12,13,10,11,8,9,6,7,4,5,2,3,0,1);
-  return _mm256_insertf128_si256(
-                    _mm256_castsi128_si256(_mm_shuffle_epi8(_mm256_extractf128_si256(a,1),m)),
-                                           _mm_shuffle_epi8(_mm256_extractf128_si256(a,0),m), 1);
+template <>
+EIGEN_STRONG_INLINE Packet16h preverse(const Packet16h& a) {
+  __m128i m = _mm_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1);
+  return _mm256_insertf128_si256(_mm256_castsi128_si256(_mm_shuffle_epi8(_mm256_extractf128_si256(a, 1), m)),
+                                 _mm_shuffle_epi8(_mm256_extractf128_si256(a, 0), m), 1);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16h pgather<Eigen::half, Packet16h>(const Eigen::half* from, Index stride)
-{
-  return _mm256_set_epi16(
-      from[15*stride].x, from[14*stride].x, from[13*stride].x, from[12*stride].x,
-      from[11*stride].x, from[10*stride].x, from[9*stride].x, from[8*stride].x,
-      from[7*stride].x, from[6*stride].x, from[5*stride].x, from[4*stride].x,
-      from[3*stride].x, from[2*stride].x, from[1*stride].x, from[0*stride].x);
+template <>
+EIGEN_STRONG_INLINE Packet16h pgather<Eigen::half, Packet16h>(const Eigen::half* from, Index stride) {
+  return _mm256_set_epi16(from[15 * stride].x, from[14 * stride].x, from[13 * stride].x, from[12 * stride].x,
+                          from[11 * stride].x, from[10 * stride].x, from[9 * stride].x, from[8 * stride].x,
+                          from[7 * stride].x, from[6 * stride].x, from[5 * stride].x, from[4 * stride].x,
+                          from[3 * stride].x, from[2 * stride].x, from[1 * stride].x, from[0 * stride].x);
 }
 
-template<> EIGEN_STRONG_INLINE void pscatter<half, Packet16h>(half* to, const Packet16h& from, Index stride)
-{
+template <>
+EIGEN_STRONG_INLINE void pscatter<half, Packet16h>(half* to, const Packet16h& from, Index stride) {
   EIGEN_ALIGN64 half aux[16];
   pstore(aux, from);
-  to[stride*0] = aux[0];
-  to[stride*1] = aux[1];
-  to[stride*2] = aux[2];
-  to[stride*3] = aux[3];
-  to[stride*4] = aux[4];
-  to[stride*5] = aux[5];
-  to[stride*6] = aux[6];
-  to[stride*7] = aux[7];
-  to[stride*8] = aux[8];
-  to[stride*9] = aux[9];
-  to[stride*10] = aux[10];
-  to[stride*11] = aux[11];
-  to[stride*12] = aux[12];
-  to[stride*13] = aux[13];
-  to[stride*14] = aux[14];
-  to[stride*15] = aux[15];
+  to[stride * 0] = aux[0];
+  to[stride * 1] = aux[1];
+  to[stride * 2] = aux[2];
+  to[stride * 3] = aux[3];
+  to[stride * 4] = aux[4];
+  to[stride * 5] = aux[5];
+  to[stride * 6] = aux[6];
+  to[stride * 7] = aux[7];
+  to[stride * 8] = aux[8];
+  to[stride * 9] = aux[9];
+  to[stride * 10] = aux[10];
+  to[stride * 11] = aux[11];
+  to[stride * 12] = aux[12];
+  to[stride * 13] = aux[13];
+  to[stride * 14] = aux[14];
+  to[stride * 15] = aux[15];
 }
 
-EIGEN_STRONG_INLINE void
-ptranspose(PacketBlock<Packet16h,16>& kernel) {
+EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet16h, 16>& kernel) {
   __m256i a = kernel.packet[0];
   __m256i b = kernel.packet[1];
   __m256i c = kernel.packet[2];
@@ -2233,8 +2246,7 @@
   kernel.packet[15] = a_p_f;
 }
 
-EIGEN_STRONG_INLINE void
-ptranspose(PacketBlock<Packet16h,8>& kernel) {
+EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet16h, 8>& kernel) {
   EIGEN_ALIGN64 half in[8][16];
   pstore<half>(in[0], kernel.packet[0]);
   pstore<half>(in[1], kernel.packet[1]);
@@ -2249,10 +2261,10 @@
 
   for (int i = 0; i < 8; ++i) {
     for (int j = 0; j < 8; ++j) {
-      out[i][j] = in[j][2*i];
+      out[i][j] = in[j][2 * i];
     }
     for (int j = 0; j < 8; ++j) {
-      out[i][j+8] = in[j][2*i+1];
+      out[i][j + 8] = in[j][2 * i + 1];
     }
   }
 
@@ -2266,8 +2278,7 @@
   kernel.packet[7] = pload<Packet16h>(out[7]);
 }
 
-EIGEN_STRONG_INLINE void
-ptranspose(PacketBlock<Packet16h,4>& kernel) {
+EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet16h, 4>& kernel) {
   EIGEN_ALIGN64 half in[4][16];
   pstore<half>(in[0], kernel.packet[0]);
   pstore<half>(in[1], kernel.packet[1]);
@@ -2278,16 +2289,16 @@
 
   for (int i = 0; i < 4; ++i) {
     for (int j = 0; j < 4; ++j) {
-      out[i][j] = in[j][4*i];
+      out[i][j] = in[j][4 * i];
     }
     for (int j = 0; j < 4; ++j) {
-      out[i][j+4] = in[j][4*i+1];
+      out[i][j + 4] = in[j][4 * i + 1];
     }
     for (int j = 0; j < 4; ++j) {
-      out[i][j+8] = in[j][4*i+2];
+      out[i][j + 8] = in[j][4 * i + 2];
     }
     for (int j = 0; j < 4; ++j) {
-      out[i][j+12] = in[j][4*i+3];
+      out[i][j + 12] = in[j][4 * i + 3];
     }
   }
 
@@ -2297,7 +2308,10 @@
   kernel.packet[3] = pload<Packet16h>(out[3]);
 }
 
-template <> struct is_arithmetic<Packet16bf> { enum { value = true }; };
+template <>
+struct is_arithmetic<Packet16bf> {
+  enum { value = true };
+};
 
 template <>
 struct packet_traits<bfloat16> : default_packet_traits {
@@ -2315,24 +2329,29 @@
     HasRsqrt = 1,
 #ifdef EIGEN_VECTORIZE_AVX512DQ
     HasLog = 1,  // Currently fails test with bad accuracy.
-    HasLog1p  = 1,
-    HasExpm1  = 1,
+    HasLog1p = 1,
+    HasExpm1 = 1,
     HasNdtri = 1,
     HasBessel = 1,
 #endif
     HasExp = 1,
     HasTanh = EIGEN_FAST_MATH,
     HasErf = EIGEN_FAST_MATH,
-    HasCmp  = 1,
+    HasCmp = 1,
     HasDiv = 1
   };
 };
 
 template <>
-struct unpacket_traits<Packet16bf>
-{
+struct unpacket_traits<Packet16bf> {
   typedef bfloat16 type;
-  enum {size=16, alignment=Aligned32, vectorizable=true, masked_load_available=false, masked_store_available=false};
+  enum {
+    size = 16,
+    alignment = Aligned32,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
   typedef Packet8bf half;
 };
 
@@ -2359,19 +2378,17 @@
 }
 
 template <>
-EIGEN_STRONG_INLINE void pstore<bfloat16>(bfloat16* to,
-                                          const Packet16bf& from) {
+EIGEN_STRONG_INLINE void pstore<bfloat16>(bfloat16* to, const Packet16bf& from) {
   _mm256_store_si256(reinterpret_cast<__m256i*>(to), from);
 }
 
 template <>
-EIGEN_STRONG_INLINE void pstoreu<bfloat16>(bfloat16* to,
-                                           const Packet16bf& from) {
+EIGEN_STRONG_INLINE void pstoreu<bfloat16>(bfloat16* to, const Packet16bf& from) {
   _mm256_storeu_si256(reinterpret_cast<__m256i*>(to), from);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16bf
-ploaddup<Packet16bf>(const bfloat16* from) {
+template <>
+EIGEN_STRONG_INLINE Packet16bf ploaddup<Packet16bf>(const bfloat16* from) {
   unsigned short a = from[0].value;
   unsigned short b = from[1].value;
   unsigned short c = from[2].value;
@@ -2383,8 +2400,8 @@
   return _mm256_set_epi16(h, h, g, g, f, f, e, e, d, d, c, c, b, b, a, a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16bf
-ploadquad(const bfloat16* from) {
+template <>
+EIGEN_STRONG_INLINE Packet16bf ploadquad(const bfloat16* from) {
   unsigned short a = from[0].value;
   unsigned short b = from[1].value;
   unsigned short c = from[2].value;
@@ -2400,7 +2417,7 @@
 EIGEN_STRONG_INLINE Packet16bf F32ToBf16(const Packet16f& a) {
   Packet16bf r;
 
-#if defined(EIGEN_VECTORIZE_AVX512BF16) && EIGEN_GNUC_STRICT_AT_LEAST(10,1,0)
+#if defined(EIGEN_VECTORIZE_AVX512BF16) && EIGEN_GNUC_STRICT_AT_LEAST(10, 1, 0)
   // Since GCC 10.1 supports avx512bf16 and C style explicit cast
   // (C++ static_cast is not supported yet), do conversion via intrinsic
   // and register path for performance.
@@ -2426,7 +2443,7 @@
   t = _mm512_mask_blend_epi32(mask, nan, t);
   // output.value = static_cast<uint16_t>(input);
   r = _mm512_cvtepi32_epi16(t);
-#endif // EIGEN_VECTORIZE_AVX512BF16
+#endif  // EIGEN_VECTORIZE_AVX512BF16
 
   return r;
 }
@@ -2452,58 +2469,54 @@
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet16bf pandnot(const Packet16bf& a,
-                                       const Packet16bf& b) {
+EIGEN_STRONG_INLINE Packet16bf pandnot(const Packet16bf& a, const Packet16bf& b) {
   return Packet16bf(pandnot<Packet8i>(Packet8i(a), Packet8i(b)));
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet16bf pselect(const Packet16bf& mask,
-                                       const Packet16bf& a,
-                                       const Packet16bf& b) {
+EIGEN_STRONG_INLINE Packet16bf pselect(const Packet16bf& mask, const Packet16bf& a, const Packet16bf& b) {
   // Input mask is expected to be all 0/1, handle it with 8-bit
   // intrinsic for performance.
   return _mm256_blendv_epi8(b, a, mask);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16bf pround<Packet16bf>(const Packet16bf& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet16bf pround<Packet16bf>(const Packet16bf& a) {
   return F32ToBf16(pround<Packet16f>(Bf16ToF32(a)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet16bf print<Packet16bf>(const Packet16bf& a) {
+template <>
+EIGEN_STRONG_INLINE Packet16bf print<Packet16bf>(const Packet16bf& a) {
   return F32ToBf16(print<Packet16f>(Bf16ToF32(a)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet16bf pceil<Packet16bf>(const Packet16bf& a) {
+template <>
+EIGEN_STRONG_INLINE Packet16bf pceil<Packet16bf>(const Packet16bf& a) {
   return F32ToBf16(pceil<Packet16f>(Bf16ToF32(a)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet16bf pfloor<Packet16bf>(const Packet16bf& a) {
+template <>
+EIGEN_STRONG_INLINE Packet16bf pfloor<Packet16bf>(const Packet16bf& a) {
   return F32ToBf16(pfloor<Packet16f>(Bf16ToF32(a)));
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet16bf pcmp_eq(const Packet16bf& a,
-                                       const Packet16bf& b) {
+EIGEN_STRONG_INLINE Packet16bf pcmp_eq(const Packet16bf& a, const Packet16bf& b) {
   return Pack32To16(pcmp_eq(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet16bf pcmp_le(const Packet16bf& a,
-                                       const Packet16bf& b) {
+EIGEN_STRONG_INLINE Packet16bf pcmp_le(const Packet16bf& a, const Packet16bf& b) {
   return Pack32To16(pcmp_le(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet16bf pcmp_lt(const Packet16bf& a,
-                                       const Packet16bf& b) {
+EIGEN_STRONG_INLINE Packet16bf pcmp_lt(const Packet16bf& a, const Packet16bf& b) {
   return Pack32To16(pcmp_lt(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet16bf pcmp_lt_or_nan(const Packet16bf& a,
-                                              const Packet16bf& b) {
+EIGEN_STRONG_INLINE Packet16bf pcmp_lt_or_nan(const Packet16bf& a, const Packet16bf& b) {
   return Pack32To16(pcmp_lt_or_nan(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
@@ -2525,38 +2538,32 @@
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet16bf padd<Packet16bf>(const Packet16bf& a,
-                                                const Packet16bf& b) {
+EIGEN_STRONG_INLINE Packet16bf padd<Packet16bf>(const Packet16bf& a, const Packet16bf& b) {
   return F32ToBf16(padd<Packet16f>(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet16bf psub<Packet16bf>(const Packet16bf& a,
-                                                const Packet16bf& b) {
+EIGEN_STRONG_INLINE Packet16bf psub<Packet16bf>(const Packet16bf& a, const Packet16bf& b) {
   return F32ToBf16(psub<Packet16f>(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet16bf pmul<Packet16bf>(const Packet16bf& a,
-                                                const Packet16bf& b) {
+EIGEN_STRONG_INLINE Packet16bf pmul<Packet16bf>(const Packet16bf& a, const Packet16bf& b) {
   return F32ToBf16(pmul<Packet16f>(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet16bf pdiv<Packet16bf>(const Packet16bf& a,
-                                                const Packet16bf& b) {
+EIGEN_STRONG_INLINE Packet16bf pdiv<Packet16bf>(const Packet16bf& a, const Packet16bf& b) {
   return F32ToBf16(pdiv<Packet16f>(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet16bf pmin<Packet16bf>(const Packet16bf& a,
-                                                const Packet16bf& b) {
+EIGEN_STRONG_INLINE Packet16bf pmin<Packet16bf>(const Packet16bf& a, const Packet16bf& b) {
   return F32ToBf16(pmin<Packet16f>(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet16bf pmax<Packet16bf>(const Packet16bf& a,
-                                                const Packet16bf& b) {
+EIGEN_STRONG_INLINE Packet16bf pmax<Packet16bf>(const Packet16bf& a, const Packet16bf& b) {
   return F32ToBf16(pmax<Packet16f>(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
@@ -2594,8 +2601,8 @@
 
 template <>
 EIGEN_STRONG_INLINE Packet16bf preverse(const Packet16bf& a) {
-  __m256i m = _mm256_setr_epi8(14,15,12,13,10,11,8,9,6,7,4,5,2,3,0,1,
-                               14,15,12,13,10,11,8,9,6,7,4,5,2,3,0,1);
+  __m256i m = _mm256_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7,
+                               4, 5, 2, 3, 0, 1);
 
   Packet16bf res;
   // Swap hi and lo first because shuffle is in 128-bit lanes.
@@ -2605,40 +2612,37 @@
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet16bf pgather<bfloat16, Packet16bf>(const bfloat16* from,
-                                                             Index stride) {
+EIGEN_STRONG_INLINE Packet16bf pgather<bfloat16, Packet16bf>(const bfloat16* from, Index stride) {
   return _mm256_set_epi16(
-      from[15*stride].value, from[14*stride].value, from[13*stride].value, from[12*stride].value,
-      from[11*stride].value, from[10*stride].value, from[9*stride].value, from[8*stride].value,
-      from[7*stride].value, from[6*stride].value, from[5*stride].value, from[4*stride].value,
-      from[3*stride].value, from[2*stride].value, from[1*stride].value, from[0*stride].value);
+      from[15 * stride].value, from[14 * stride].value, from[13 * stride].value, from[12 * stride].value,
+      from[11 * stride].value, from[10 * stride].value, from[9 * stride].value, from[8 * stride].value,
+      from[7 * stride].value, from[6 * stride].value, from[5 * stride].value, from[4 * stride].value,
+      from[3 * stride].value, from[2 * stride].value, from[1 * stride].value, from[0 * stride].value);
 }
 
 template <>
-EIGEN_STRONG_INLINE void pscatter<bfloat16, Packet16bf>(bfloat16* to,
-                                                        const Packet16bf& from,
-                                                        Index stride) {
+EIGEN_STRONG_INLINE void pscatter<bfloat16, Packet16bf>(bfloat16* to, const Packet16bf& from, Index stride) {
   EIGEN_ALIGN64 bfloat16 aux[16];
   pstore(aux, from);
-  to[stride*0] = aux[0];
-  to[stride*1] = aux[1];
-  to[stride*2] = aux[2];
-  to[stride*3] = aux[3];
-  to[stride*4] = aux[4];
-  to[stride*5] = aux[5];
-  to[stride*6] = aux[6];
-  to[stride*7] = aux[7];
-  to[stride*8] = aux[8];
-  to[stride*9] = aux[9];
-  to[stride*10] = aux[10];
-  to[stride*11] = aux[11];
-  to[stride*12] = aux[12];
-  to[stride*13] = aux[13];
-  to[stride*14] = aux[14];
-  to[stride*15] = aux[15];
+  to[stride * 0] = aux[0];
+  to[stride * 1] = aux[1];
+  to[stride * 2] = aux[2];
+  to[stride * 3] = aux[3];
+  to[stride * 4] = aux[4];
+  to[stride * 5] = aux[5];
+  to[stride * 6] = aux[6];
+  to[stride * 7] = aux[7];
+  to[stride * 8] = aux[8];
+  to[stride * 9] = aux[9];
+  to[stride * 10] = aux[10];
+  to[stride * 11] = aux[11];
+  to[stride * 12] = aux[12];
+  to[stride * 13] = aux[13];
+  to[stride * 14] = aux[14];
+  to[stride * 15] = aux[15];
 }
 
-EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet16bf,16>& kernel) {
+EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet16bf, 16>& kernel) {
   __m256i a = kernel.packet[0];
   __m256i b = kernel.packet[1];
   __m256i c = kernel.packet[2];
@@ -2728,7 +2732,7 @@
   kernel.packet[15] = _mm256_permute2x128_si256(abcdefgh_ef, ijklmnop_ef, 0x31);
 }
 
-EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet16bf,4>& kernel) {
+EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet16bf, 4>& kernel) {
   __m256i a = kernel.packet[0];
   __m256i b = kernel.packet[1];
   __m256i c = kernel.packet[2];
@@ -2751,8 +2755,8 @@
   kernel.packet[3] = _mm256_permute2x128_si256(abcd_8b, abcd_cf, 0x31);
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_PACKET_MATH_AVX512_H
+#endif  // EIGEN_PACKET_MATH_AVX512_H
diff --git a/Eigen/src/Core/arch/AVX512/PacketMathFP16.h b/Eigen/src/Core/arch/AVX512/PacketMathFP16.h
index faa3853..131e6f1 100644
--- a/Eigen/src/Core/arch/AVX512/PacketMathFP16.h
+++ b/Eigen/src/Core/arch/AVX512/PacketMathFP16.h
@@ -10,7 +10,7 @@
 #ifndef EIGEN_PACKET_MATH_FP16_AVX512_H
 #define EIGEN_PACKET_MATH_FP16_AVX512_H
 
-// IWYU pragma: private
+// IWYU pragma: private
 #include "../../InternalHeaderCheck.h"
 
 namespace Eigen {
diff --git a/Eigen/src/Core/arch/AVX512/TrsmKernel.h b/Eigen/src/Core/arch/AVX512/TrsmKernel.h
index a3025ec..903bca5 100644
--- a/Eigen/src/Core/arch/AVX512/TrsmKernel.h
+++ b/Eigen/src/Core/arch/AVX512/TrsmKernel.h
@@ -108,7 +108,7 @@
   int64_t cutoff_l = static_cast<int64_t>(cutoff_d);
   return (cutoff_l / EIGEN_AVX_MAX_NUM_ROW) * EIGEN_AVX_MAX_NUM_ROW;
 }
-#else // !(EIGEN_USE_AVX512_TRSM_KERNELS) || !(EIGEN_COMP_CLANG != 0)
+#else  // !(EIGEN_USE_AVX512_TRSM_KERNELS) || !(EIGEN_COMP_CLANG != 0)
 #define EIGEN_ENABLE_AVX512_NOCOPY_TRSM_CUTOFFS 0
 #define EIGEN_ENABLE_AVX512_NOCOPY_TRSM_R_CUTOFFS 0
 #define EIGEN_ENABLE_AVX512_NOCOPY_TRSM_L_CUTOFFS 0
@@ -118,8 +118,8 @@
  * Used by gemmKernel for the case A/B row-major and C col-major.
  */
 template <typename Scalar, typename vec, int64_t unrollM, int64_t unrollN, bool remM, bool remN>
-EIGEN_ALWAYS_INLINE void transStoreC(PacketBlock<vec, EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS> &zmm,
-                                            Scalar *C_arr, int64_t LDC, int64_t remM_ = 0, int64_t remN_ = 0) {
+EIGEN_ALWAYS_INLINE void transStoreC(PacketBlock<vec, EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS> &zmm, Scalar *C_arr,
+                                     int64_t LDC, int64_t remM_ = 0, int64_t remN_ = 0) {
   EIGEN_UNUSED_VARIABLE(remN_);
   EIGEN_UNUSED_VARIABLE(remM_);
   using urolls = unrolls::trans<Scalar>;
@@ -811,7 +811,7 @@
  */
 template <typename Scalar, bool toTemp = true, bool remM = false>
 EIGEN_ALWAYS_INLINE void copyBToRowMajor(Scalar *B_arr, int64_t LDB, int64_t K, Scalar *B_temp, int64_t LDB_,
-                                                int64_t remM_ = 0) {
+                                         int64_t remM_ = 0) {
   EIGEN_UNUSED_VARIABLE(remM_);
   using urolls = unrolls::transB<Scalar>;
   using vecHalf = typename std::conditional<std::is_same<Scalar, float>::value, vecHalfFloat, vecFullDouble>::type;
@@ -1062,7 +1062,8 @@
 // Template specializations of trsmKernelL/R for float/double and inner strides of 1.
 #if (EIGEN_USE_AVX512_TRSM_KERNELS)
 #if (EIGEN_USE_AVX512_TRSM_R_KERNELS)
-template <typename Scalar, typename Index, int Mode, bool Conjugate, int TriStorageOrder, int OtherInnerStride, bool Specialized>
+template <typename Scalar, typename Index, int Mode, bool Conjugate, int TriStorageOrder, int OtherInnerStride,
+          bool Specialized>
 struct trsmKernelR;
 
 template <typename Index, int Mode, int TriStorageOrder>
@@ -1085,7 +1086,7 @@
 #ifdef EIGEN_RUNTIME_NO_MALLOC
   if (!is_malloc_allowed()) {
     trsmKernelR<float, Index, Mode, false, TriStorageOrder, 1, /*Specialized=*/false>::kernel(
-          size, otherSize, _tri, triStride, _other, otherIncr, otherStride);
+        size, otherSize, _tri, triStride, _other, otherIncr, otherStride);
     return;
   }
 #endif
@@ -1101,7 +1102,7 @@
 #ifdef EIGEN_RUNTIME_NO_MALLOC
   if (!is_malloc_allowed()) {
     trsmKernelR<double, Index, Mode, false, TriStorageOrder, 1, /*Specialized=*/false>::kernel(
-          size, otherSize, _tri, triStride, _other, otherIncr, otherStride);
+        size, otherSize, _tri, triStride, _other, otherIncr, otherStride);
     return;
   }
 #endif
@@ -1112,7 +1113,8 @@
 
 // These trsm kernels require temporary memory allocation
 #if (EIGEN_USE_AVX512_TRSM_L_KERNELS)
-template <typename Scalar, typename Index, int Mode, bool Conjugate, int TriStorageOrder, int OtherInnerStride, bool Specialized = true>
+template <typename Scalar, typename Index, int Mode, bool Conjugate, int TriStorageOrder, int OtherInnerStride,
+          bool Specialized = true>
 struct trsmKernelL;
 
 template <typename Index, int Mode, int TriStorageOrder>
@@ -1135,7 +1137,7 @@
 #ifdef EIGEN_RUNTIME_NO_MALLOC
   if (!is_malloc_allowed()) {
     trsmKernelL<float, Index, Mode, false, TriStorageOrder, 1, /*Specialized=*/false>::kernel(
-          size, otherSize, _tri, triStride, _other, otherIncr, otherStride);
+        size, otherSize, _tri, triStride, _other, otherIncr, otherStride);
     return;
   }
 #endif
@@ -1151,7 +1153,7 @@
 #ifdef EIGEN_RUNTIME_NO_MALLOC
   if (!is_malloc_allowed()) {
     trsmKernelL<double, Index, Mode, false, TriStorageOrder, 1, /*Specialized=*/false>::kernel(
-          size, otherSize, _tri, triStride, _other, otherIncr, otherStride);
+        size, otherSize, _tri, triStride, _other, otherIncr, otherStride);
     return;
   }
 #endif
diff --git a/Eigen/src/Core/arch/AVX512/TypeCasting.h b/Eigen/src/Core/arch/AVX512/TypeCasting.h
index 5053230..56a94f4 100644
--- a/Eigen/src/Core/arch/AVX512/TypeCasting.h
+++ b/Eigen/src/Core/arch/AVX512/TypeCasting.h
@@ -17,161 +17,207 @@
 
 namespace internal {
 
-template<> struct type_casting_traits<float, bool> : vectorized_type_casting_traits<float, bool> {};
-template<> struct type_casting_traits<bool, float> : vectorized_type_casting_traits<bool, float> {};
+template <>
+struct type_casting_traits<float, bool> : vectorized_type_casting_traits<float, bool> {};
+template <>
+struct type_casting_traits<bool, float> : vectorized_type_casting_traits<bool, float> {};
 
-template<> struct type_casting_traits<float, int> : vectorized_type_casting_traits<float, int> {};
-template<> struct type_casting_traits<int, float> : vectorized_type_casting_traits<int, float> {};
+template <>
+struct type_casting_traits<float, int> : vectorized_type_casting_traits<float, int> {};
+template <>
+struct type_casting_traits<int, float> : vectorized_type_casting_traits<int, float> {};
 
-template<> struct type_casting_traits<float, double> : vectorized_type_casting_traits<float, double> {};
-template<> struct type_casting_traits<double, float> : vectorized_type_casting_traits<double, float> {};
+template <>
+struct type_casting_traits<float, double> : vectorized_type_casting_traits<float, double> {};
+template <>
+struct type_casting_traits<double, float> : vectorized_type_casting_traits<double, float> {};
 
-template<> struct type_casting_traits<double, int> : vectorized_type_casting_traits<double, int> {};
-template<> struct type_casting_traits<int, double> : vectorized_type_casting_traits<int, double> {};
+template <>
+struct type_casting_traits<double, int> : vectorized_type_casting_traits<double, int> {};
+template <>
+struct type_casting_traits<int, double> : vectorized_type_casting_traits<int, double> {};
 
-template<> struct type_casting_traits<half, float> : vectorized_type_casting_traits<half, float> {};
-template<> struct type_casting_traits<float, half> : vectorized_type_casting_traits<float, half> {};
+template <>
+struct type_casting_traits<half, float> : vectorized_type_casting_traits<half, float> {};
+template <>
+struct type_casting_traits<float, half> : vectorized_type_casting_traits<float, half> {};
 
-template<> struct type_casting_traits<bfloat16, float> : vectorized_type_casting_traits<bfloat16, float> {};
-template<> struct type_casting_traits<float, bfloat16> : vectorized_type_casting_traits<float, bfloat16> {};
+template <>
+struct type_casting_traits<bfloat16, float> : vectorized_type_casting_traits<bfloat16, float> {};
+template <>
+struct type_casting_traits<float, bfloat16> : vectorized_type_casting_traits<float, bfloat16> {};
 
-template<> EIGEN_STRONG_INLINE Packet16b pcast<Packet16f, Packet16b>(const Packet16f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet16b pcast<Packet16f, Packet16b>(const Packet16f& a) {
   __mmask16 mask = _mm512_cmpneq_ps_mask(a, pzero(a));
   return _mm512_maskz_cvtepi32_epi8(mask, _mm512_set1_epi32(1));
 }
 
-template<> EIGEN_STRONG_INLINE Packet16f pcast<Packet16b, Packet16f>(const Packet16b& a) {
+template <>
+EIGEN_STRONG_INLINE Packet16f pcast<Packet16b, Packet16f>(const Packet16b& a) {
   return _mm512_cvtepi32_ps(_mm512_and_si512(_mm512_cvtepi8_epi32(a), _mm512_set1_epi32(1)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet16i pcast<Packet16f, Packet16i>(const Packet16f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet16i pcast<Packet16f, Packet16i>(const Packet16f& a) {
   return _mm512_cvttps_epi32(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8d pcast<Packet16f, Packet8d>(const Packet16f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8d pcast<Packet16f, Packet8d>(const Packet16f& a) {
   return _mm512_cvtps_pd(_mm512_castps512_ps256(a));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8d pcast<Packet8f, Packet8d>(const Packet8f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8d pcast<Packet8f, Packet8d>(const Packet8f& a) {
   return _mm512_cvtps_pd(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16f pcast<Packet16i, Packet16f>(const Packet16i& a) {
+template <>
+EIGEN_STRONG_INLINE Packet16f pcast<Packet16i, Packet16f>(const Packet16i& a) {
   return _mm512_cvtepi32_ps(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8d pcast<Packet16i, Packet8d>(const Packet16i& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8d pcast<Packet16i, Packet8d>(const Packet16i& a) {
   return _mm512_cvtepi32_pd(_mm512_castsi512_si256(a));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8d pcast<Packet8i, Packet8d>(const Packet8i& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8d pcast<Packet8i, Packet8d>(const Packet8i& a) {
   return _mm512_cvtepi32_pd(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16f pcast<Packet8d, Packet16f>(const Packet8d& a, const Packet8d& b) {
-  return  cat256(_mm512_cvtpd_ps(a), _mm512_cvtpd_ps(b));
+template <>
+EIGEN_STRONG_INLINE Packet16f pcast<Packet8d, Packet16f>(const Packet8d& a, const Packet8d& b) {
+  return cat256(_mm512_cvtpd_ps(a), _mm512_cvtpd_ps(b));
 }
 
-template<> EIGEN_STRONG_INLINE Packet16i pcast<Packet8d, Packet16i>(const Packet8d& a, const Packet8d& b) {
-  return  cat256i(_mm512_cvttpd_epi32(a), _mm512_cvttpd_epi32(b));
+template <>
+EIGEN_STRONG_INLINE Packet16i pcast<Packet8d, Packet16i>(const Packet8d& a, const Packet8d& b) {
+  return cat256i(_mm512_cvttpd_epi32(a), _mm512_cvttpd_epi32(b));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8i pcast<Packet8d, Packet8i>(const Packet8d& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8i pcast<Packet8d, Packet8i>(const Packet8d& a) {
   return _mm512_cvtpd_epi32(a);
 }
-template<> EIGEN_STRONG_INLINE Packet8f pcast<Packet8d, Packet8f>(const Packet8d& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8f pcast<Packet8d, Packet8f>(const Packet8d& a) {
   return _mm512_cvtpd_ps(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16i preinterpret<Packet16i, Packet16f>(const Packet16f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet16i preinterpret<Packet16i, Packet16f>(const Packet16f& a) {
   return _mm512_castps_si512(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16f preinterpret<Packet16f, Packet16i>(const Packet16i& a) {
+template <>
+EIGEN_STRONG_INLINE Packet16f preinterpret<Packet16f, Packet16i>(const Packet16i& a) {
   return _mm512_castsi512_ps(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8d preinterpret<Packet8d, Packet16f>(const Packet16f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8d preinterpret<Packet8d, Packet16f>(const Packet16f& a) {
   return _mm512_castps_pd(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16f preinterpret<Packet16f, Packet8d>(const Packet8d& a) {
+template <>
+EIGEN_STRONG_INLINE Packet16f preinterpret<Packet16f, Packet8d>(const Packet8d& a) {
   return _mm512_castpd_ps(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8f preinterpret<Packet8f, Packet16f>(const Packet16f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8f preinterpret<Packet8f, Packet16f>(const Packet16f& a) {
   return _mm512_castps512_ps256(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f preinterpret<Packet4f, Packet16f>(const Packet16f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4f preinterpret<Packet4f, Packet16f>(const Packet16f& a) {
   return _mm512_castps512_ps128(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4d preinterpret<Packet4d, Packet8d>(const Packet8d& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4d preinterpret<Packet4d, Packet8d>(const Packet8d& a) {
   return _mm512_castpd512_pd256(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2d preinterpret<Packet2d, Packet8d>(const Packet8d& a) {
+template <>
+EIGEN_STRONG_INLINE Packet2d preinterpret<Packet2d, Packet8d>(const Packet8d& a) {
   return _mm512_castpd512_pd128(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16f preinterpret<Packet16f, Packet8f>(const Packet8f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet16f preinterpret<Packet16f, Packet8f>(const Packet8f& a) {
   return _mm512_castps256_ps512(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16f preinterpret<Packet16f, Packet4f>(const Packet4f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet16f preinterpret<Packet16f, Packet4f>(const Packet4f& a) {
   return _mm512_castps128_ps512(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8d preinterpret<Packet8d, Packet4d>(const Packet4d& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8d preinterpret<Packet8d, Packet4d>(const Packet4d& a) {
   return _mm512_castpd256_pd512(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8d preinterpret<Packet8d, Packet2d>(const Packet2d& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8d preinterpret<Packet8d, Packet2d>(const Packet2d& a) {
   return _mm512_castpd128_pd512(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8i preinterpret<Packet8i, Packet16i>(const Packet16i& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8i preinterpret<Packet8i, Packet16i>(const Packet16i& a) {
   return _mm512_castsi512_si256(a);
 }
-template<> EIGEN_STRONG_INLINE Packet4i preinterpret<Packet4i, Packet16i>(const Packet16i& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4i preinterpret<Packet4i, Packet16i>(const Packet16i& a) {
   return _mm512_castsi512_si128(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8h preinterpret<Packet8h, Packet16h>(const Packet16h& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8h preinterpret<Packet8h, Packet16h>(const Packet16h& a) {
   return _mm256_castsi256_si128(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf preinterpret<Packet8bf, Packet16bf>(const Packet16bf& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf preinterpret<Packet8bf, Packet16bf>(const Packet16bf& a) {
   return _mm256_castsi256_si128(a);
 }
 
 #ifndef EIGEN_VECTORIZE_AVX512FP16
 
-template<> EIGEN_STRONG_INLINE Packet16f pcast<Packet16h, Packet16f>(const Packet16h& a) {
+template <>
+EIGEN_STRONG_INLINE Packet16f pcast<Packet16h, Packet16f>(const Packet16h& a) {
   return half2float(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16h pcast<Packet16f, Packet16h>(const Packet16f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet16h pcast<Packet16f, Packet16h>(const Packet16f& a) {
   return float2half(a);
 }
 
 #endif
 
-template<> EIGEN_STRONG_INLINE Packet16f pcast<Packet16bf, Packet16f>(const Packet16bf& a) {
+template <>
+EIGEN_STRONG_INLINE Packet16f pcast<Packet16bf, Packet16f>(const Packet16bf& a) {
   return Bf16ToF32(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16bf pcast<Packet16f, Packet16bf>(const Packet16f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet16bf pcast<Packet16f, Packet16bf>(const Packet16f& a) {
   return F32ToBf16(a);
 }
 
 #ifdef EIGEN_VECTORIZE_AVX512FP16
 
-template<> EIGEN_STRONG_INLINE Packet16h preinterpret<Packet16h, Packet32h>(const Packet32h& a) {
+template <>
+EIGEN_STRONG_INLINE Packet16h preinterpret<Packet16h, Packet32h>(const Packet32h& a) {
   return _mm256_castpd_si256(_mm512_extractf64x4_pd(_mm512_castph_pd(a), 0));
 }
-template<> EIGEN_STRONG_INLINE Packet8h preinterpret<Packet8h, Packet32h>(const Packet32h& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8h preinterpret<Packet8h, Packet32h>(const Packet32h& a) {
   return _mm256_castsi256_si128(preinterpret<Packet16h>(a));
 }
 
@@ -182,12 +228,13 @@
   return _mm512_cvtxph_ps(_mm256_castsi256_ph(low));
 }
 
-
 template <>
 EIGEN_STRONG_INLINE Packet32h pcast<Packet16f, Packet32h>(const Packet16f& a, const Packet16f& b) {
   __m512d result = _mm512_undefined_pd();
-  result = _mm512_insertf64x4(result, _mm256_castsi256_pd(_mm512_cvtps_ph(a, _MM_FROUND_TO_NEAREST_INT|_MM_FROUND_NO_EXC)), 0);
-  result = _mm512_insertf64x4(result, _mm256_castsi256_pd(_mm512_cvtps_ph(b, _MM_FROUND_TO_NEAREST_INT|_MM_FROUND_NO_EXC)), 1);
+  result = _mm512_insertf64x4(
+      result, _mm256_castsi256_pd(_mm512_cvtps_ph(a, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC)), 0);
+  result = _mm512_insertf64x4(
+      result, _mm256_castsi256_pd(_mm512_cvtps_ph(b, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC)), 1);
   return _mm512_castpd_ph(result);
 }
 
@@ -198,12 +245,13 @@
   return _mm256_cvtxph_ps(_mm_castsi128_ph(low));
 }
 
-
 template <>
 EIGEN_STRONG_INLINE Packet16h pcast<Packet8f, Packet16h>(const Packet8f& a, const Packet8f& b) {
   __m256d result = _mm256_undefined_pd();
-  result = _mm256_insertf64x2(result, _mm_castsi128_pd(_mm256_cvtps_ph(a, _MM_FROUND_TO_NEAREST_INT|_MM_FROUND_NO_EXC)), 0);
-  result = _mm256_insertf64x2(result, _mm_castsi128_pd(_mm256_cvtps_ph(b, _MM_FROUND_TO_NEAREST_INT|_MM_FROUND_NO_EXC)), 1);
+  result = _mm256_insertf64x2(result,
+                              _mm_castsi128_pd(_mm256_cvtps_ph(a, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC)), 0);
+  result = _mm256_insertf64x2(result,
+                              _mm_castsi128_pd(_mm256_cvtps_ph(b, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC)), 1);
   return _mm256_castpd_si256(result);
 }
 
@@ -214,7 +262,6 @@
   return _mm256_extractf32x4_ps(full, 0);
 }
 
-
 template <>
 EIGEN_STRONG_INLINE Packet8h pcast<Packet4f, Packet8h>(const Packet4f& a, const Packet4f& b) {
   __m256 result = _mm256_undefined_ps();
@@ -223,11 +270,10 @@
   return _mm256_cvtps_ph(result, _MM_FROUND_TO_NEAREST_INT);
 }
 
-
 #endif
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_TYPE_CASTING_AVX512_H
+#endif  // EIGEN_TYPE_CASTING_AVX512_H
diff --git a/Eigen/src/Core/arch/AltiVec/Complex.h b/Eigen/src/Core/arch/AltiVec/Complex.h
index 915b01b..7bfc61d 100644
--- a/Eigen/src/Core/arch/AltiVec/Complex.h
+++ b/Eigen/src/Core/arch/AltiVec/Complex.h
@@ -18,25 +18,28 @@
 
 namespace internal {
 
-static Packet4ui  p4ui_CONJ_XOR = vec_mergeh((Packet4ui)p4i_ZERO, (Packet4ui)p4f_MZERO);//{ 0x00000000, 0x80000000, 0x00000000, 0x80000000 };
+static Packet4ui p4ui_CONJ_XOR =
+    vec_mergeh((Packet4ui)p4i_ZERO, (Packet4ui)p4f_MZERO);  //{ 0x00000000, 0x80000000, 0x00000000, 0x80000000 };
 #ifdef EIGEN_VECTORIZE_VSX
 #if defined(_BIG_ENDIAN)
-static Packet2ul  p2ul_CONJ_XOR1 = (Packet2ul) vec_sld((Packet4ui) p2d_MZERO, (Packet4ui) p2l_ZERO, 8);//{ 0x8000000000000000, 0x0000000000000000 };
-static Packet2ul  p2ul_CONJ_XOR2 = (Packet2ul) vec_sld((Packet4ui) p2l_ZERO,  (Packet4ui) p2d_MZERO, 8);//{ 0x8000000000000000, 0x0000000000000000 };
+static Packet2ul p2ul_CONJ_XOR1 =
+    (Packet2ul)vec_sld((Packet4ui)p2d_MZERO, (Packet4ui)p2l_ZERO, 8);  //{ 0x8000000000000000, 0x0000000000000000 };
+static Packet2ul p2ul_CONJ_XOR2 =
+    (Packet2ul)vec_sld((Packet4ui)p2l_ZERO, (Packet4ui)p2d_MZERO, 8);  //{ 0x8000000000000000, 0x0000000000000000 };
 #else
-static Packet2ul  p2ul_CONJ_XOR1 = (Packet2ul) vec_sld((Packet4ui) p2l_ZERO,  (Packet4ui) p2d_MZERO, 8);//{ 0x8000000000000000, 0x0000000000000000 };
-static Packet2ul  p2ul_CONJ_XOR2 = (Packet2ul) vec_sld((Packet4ui) p2d_MZERO, (Packet4ui) p2l_ZERO, 8);//{ 0x8000000000000000, 0x0000000000000000 };
+static Packet2ul p2ul_CONJ_XOR1 =
+    (Packet2ul)vec_sld((Packet4ui)p2l_ZERO, (Packet4ui)p2d_MZERO, 8);  //{ 0x8000000000000000, 0x0000000000000000 };
+static Packet2ul p2ul_CONJ_XOR2 =
+    (Packet2ul)vec_sld((Packet4ui)p2d_MZERO, (Packet4ui)p2l_ZERO, 8);  //{ 0x8000000000000000, 0x0000000000000000 };
 #endif
 #endif
 
 //---------- float ----------
-struct Packet2cf
-{
+struct Packet2cf {
   EIGEN_STRONG_INLINE explicit Packet2cf() {}
   EIGEN_STRONG_INLINE explicit Packet2cf(const Packet4f& a) : v(a) {}
 
-  EIGEN_STRONG_INLINE Packet2cf pmul(const Packet2cf& a, const Packet2cf& b)
-  {
+  EIGEN_STRONG_INLINE Packet2cf pmul(const Packet2cf& a, const Packet2cf& b) {
     Packet4f v1, v2;
 
     // Permute and multiply the real parts of a and b
@@ -58,33 +61,25 @@
     v = pmul(Packet2cf(*this), b).v;
     return *this;
   }
-  EIGEN_STRONG_INLINE Packet2cf operator*(const Packet2cf& b) const {
-    return Packet2cf(*this) *= b;
-  }
+  EIGEN_STRONG_INLINE Packet2cf operator*(const Packet2cf& b) const { return Packet2cf(*this) *= b; }
 
   EIGEN_STRONG_INLINE Packet2cf& operator+=(const Packet2cf& b) {
     v = padd(v, b.v);
     return *this;
   }
-  EIGEN_STRONG_INLINE Packet2cf operator+(const Packet2cf& b) const {
-    return Packet2cf(*this) += b;
-  }
+  EIGEN_STRONG_INLINE Packet2cf operator+(const Packet2cf& b) const { return Packet2cf(*this) += b; }
   EIGEN_STRONG_INLINE Packet2cf& operator-=(const Packet2cf& b) {
     v = psub(v, b.v);
     return *this;
   }
-  EIGEN_STRONG_INLINE Packet2cf operator-(const Packet2cf& b) const {
-    return Packet2cf(*this) -= b;
-  }
-  EIGEN_STRONG_INLINE Packet2cf operator-(void) const {
-    return Packet2cf(-v);
-  }
+  EIGEN_STRONG_INLINE Packet2cf operator-(const Packet2cf& b) const { return Packet2cf(*this) -= b; }
+  EIGEN_STRONG_INLINE Packet2cf operator-(void) const { return Packet2cf(-v); }
 
-  Packet4f  v;
+  Packet4f v;
 };
 
-template<> struct packet_traits<std::complex<float> >  : default_packet_traits
-{
+template <>
+struct packet_traits<std::complex<float> > : default_packet_traits {
   typedef Packet2cf type;
   typedef Packet2cf half;
   typedef Packet4f as_real;
@@ -93,160 +88,232 @@
     AlignedOnScalar = 1,
     size = 2,
 
-    HasAdd    = 1,
-    HasSub    = 1,
-    HasMul    = 1,
-    HasDiv    = 1,
+    HasAdd = 1,
+    HasSub = 1,
+    HasMul = 1,
+    HasDiv = 1,
     HasNegate = 1,
-    HasAbs    = 0,
-    HasAbs2   = 0,
-    HasMin    = 0,
-    HasMax    = 0,
-    HasSqrt   = 1,
+    HasAbs = 0,
+    HasAbs2 = 0,
+    HasMin = 0,
+    HasMax = 0,
+    HasSqrt = 1,
 #ifdef EIGEN_VECTORIZE_VSX
-    HasBlend  = 1,
+    HasBlend = 1,
 #endif
     HasSetLinear = 0
   };
 };
 
-template<> struct unpacket_traits<Packet2cf> { typedef std::complex<float> type; enum {size=2, alignment=Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false}; typedef Packet2cf half; typedef Packet4f as_real; };
+template <>
+struct unpacket_traits<Packet2cf> {
+  typedef std::complex<float> type;
+  enum {
+    size = 2,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
+  typedef Packet2cf half;
+  typedef Packet4f as_real;
+};
 
-template<> EIGEN_STRONG_INLINE Packet2cf pset1<Packet2cf>(const std::complex<float>&  from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2cf pset1<Packet2cf>(const std::complex<float>& from) {
   Packet2cf res;
 #ifdef EIGEN_VECTORIZE_VSX
   // Load a single std::complex<float> from memory and duplicate
   //
   // Using pload would read past the end of the reference in this case
   // Using vec_xl_len + vec_splat, generates poor assembly
-  __asm__ ("lxvdsx %x0,%y1" : "=wa" (res.v) : "Z" (from));
+  __asm__("lxvdsx %x0,%y1" : "=wa"(res.v) : "Z"(from));
 #else
-  if((std::ptrdiff_t(&from) % 16) == 0)
-    res.v = pload<Packet4f>((const float *)&from);
+  if ((std::ptrdiff_t(&from) % 16) == 0)
+    res.v = pload<Packet4f>((const float*)&from);
   else
-    res.v = ploadu<Packet4f>((const float *)&from);
+    res.v = ploadu<Packet4f>((const float*)&from);
   res.v = vec_perm(res.v, res.v, p16uc_PSET64_HI);
 #endif
   return res;
 }
 
-template<> EIGEN_STRONG_INLINE Packet2cf pload<Packet2cf>(const std::complex<float>*        from) { return Packet2cf(pload<Packet4f>((const float *) from)); }
-template<> EIGEN_STRONG_INLINE Packet2cf ploadu<Packet2cf>(const std::complex<float>*       from) { return Packet2cf(ploadu<Packet4f>((const float*) from)); }
-template<> EIGEN_ALWAYS_INLINE Packet2cf pload_partial<Packet2cf>(const std::complex<float>* from, const Index n, const Index offset)
-{
-  return Packet2cf(pload_partial<Packet4f>((const float *) from, n * 2, offset * 2));
+template <>
+EIGEN_STRONG_INLINE Packet2cf pload<Packet2cf>(const std::complex<float>* from) {
+  return Packet2cf(pload<Packet4f>((const float*)from));
 }
-template<> EIGEN_ALWAYS_INLINE Packet2cf ploadu_partial<Packet2cf>(const std::complex<float>* from, const Index n, const Index offset)
-{
-  return Packet2cf(ploadu_partial<Packet4f>((const float*) from, n * 2, offset * 2));
+template <>
+EIGEN_STRONG_INLINE Packet2cf ploadu<Packet2cf>(const std::complex<float>* from) {
+  return Packet2cf(ploadu<Packet4f>((const float*)from));
 }
-template<> EIGEN_STRONG_INLINE Packet2cf ploaddup<Packet2cf>(const std::complex<float>*     from) { return pset1<Packet2cf>(*from); }
+template <>
+EIGEN_ALWAYS_INLINE Packet2cf pload_partial<Packet2cf>(const std::complex<float>* from, const Index n,
+                                                       const Index offset) {
+  return Packet2cf(pload_partial<Packet4f>((const float*)from, n * 2, offset * 2));
+}
+template <>
+EIGEN_ALWAYS_INLINE Packet2cf ploadu_partial<Packet2cf>(const std::complex<float>* from, const Index n,
+                                                        const Index offset) {
+  return Packet2cf(ploadu_partial<Packet4f>((const float*)from, n * 2, offset * 2));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf ploaddup<Packet2cf>(const std::complex<float>* from) {
+  return pset1<Packet2cf>(*from);
+}
 
-template<> EIGEN_STRONG_INLINE void pstore <std::complex<float> >(std::complex<float> *   to, const Packet2cf& from) { pstore((float*)to, from.v); }
-template<> EIGEN_STRONG_INLINE void pstoreu<std::complex<float> >(std::complex<float> *   to, const Packet2cf& from) { pstoreu((float*)to, from.v); }
-template<> EIGEN_ALWAYS_INLINE void pstore_partial <std::complex<float> >(std::complex<float> *  to, const Packet2cf& from, const Index n, const Index offset) { pstore_partial((float*)to, from.v, n * 2, offset * 2); }
-template<> EIGEN_ALWAYS_INLINE void pstoreu_partial<std::complex<float> >(std::complex<float> *  to, const Packet2cf& from, const Index n, const Index offset) { pstoreu_partial((float*)to, from.v, n * 2, offset * 2); }
+template <>
+EIGEN_STRONG_INLINE void pstore<std::complex<float> >(std::complex<float>* to, const Packet2cf& from) {
+  pstore((float*)to, from.v);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<std::complex<float> >(std::complex<float>* to, const Packet2cf& from) {
+  pstoreu((float*)to, from.v);
+}
+template <>
+EIGEN_ALWAYS_INLINE void pstore_partial<std::complex<float> >(std::complex<float>* to, const Packet2cf& from,
+                                                              const Index n, const Index offset) {
+  pstore_partial((float*)to, from.v, n * 2, offset * 2);
+}
+template <>
+EIGEN_ALWAYS_INLINE void pstoreu_partial<std::complex<float> >(std::complex<float>* to, const Packet2cf& from,
+                                                               const Index n, const Index offset) {
+  pstoreu_partial((float*)to, from.v, n * 2, offset * 2);
+}
 
-EIGEN_STRONG_INLINE Packet2cf pload2(const std::complex<float>& from0, const std::complex<float>& from1)
-{
+EIGEN_STRONG_INLINE Packet2cf pload2(const std::complex<float>& from0, const std::complex<float>& from1) {
   Packet4f res0, res1;
 #ifdef EIGEN_VECTORIZE_VSX
   // Load two std::complex<float> from memory and combine
-  __asm__ ("lxsdx %x0,%y1" : "=wa" (res0) : "Z" (from0));
-  __asm__ ("lxsdx %x0,%y1" : "=wa" (res1) : "Z" (from1));
+  __asm__("lxsdx %x0,%y1" : "=wa"(res0) : "Z"(from0));
+  __asm__("lxsdx %x0,%y1" : "=wa"(res1) : "Z"(from1));
 #ifdef _BIG_ENDIAN
-  __asm__ ("xxpermdi %x0, %x1, %x2, 0" : "=wa" (res0) : "wa" (res0), "wa" (res1));
+  __asm__("xxpermdi %x0, %x1, %x2, 0" : "=wa"(res0) : "wa"(res0), "wa"(res1));
 #else
-  __asm__ ("xxpermdi %x0, %x2, %x1, 0" : "=wa" (res0) : "wa" (res0), "wa" (res1));
+  __asm__("xxpermdi %x0, %x2, %x1, 0" : "=wa"(res0) : "wa"(res0), "wa"(res1));
 #endif
 #else
-  *reinterpret_cast<std::complex<float> *>(&res0) = from0;
-  *reinterpret_cast<std::complex<float> *>(&res1) = from1;
+  *reinterpret_cast<std::complex<float>*>(&res0) = from0;
+  *reinterpret_cast<std::complex<float>*>(&res1) = from1;
   res0 = vec_perm(res0, res1, p16uc_TRANSPOSE64_HI);
 #endif
   return Packet2cf(res0);
 }
 
-template<> EIGEN_ALWAYS_INLINE Packet2cf pload_ignore<Packet2cf>(const std::complex<float>*     from)
-{
+template <>
+EIGEN_ALWAYS_INLINE Packet2cf pload_ignore<Packet2cf>(const std::complex<float>* from) {
   Packet2cf res;
   res.v = pload_ignore<Packet4f>(reinterpret_cast<const float*>(from));
   return res;
 }
 
-template<typename Scalar, typename Packet> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet pgather_complex_size2(const Scalar* from, Index stride, const Index n = 2)
-{
+template <typename Scalar, typename Packet>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet pgather_complex_size2(const Scalar* from, Index stride,
+                                                                   const Index n = 2) {
   eigen_internal_assert(n <= unpacket_traits<Packet>::size && "number of elements will gather past end of packet");
   EIGEN_ALIGN16 Scalar af[2];
   for (Index i = 0; i < n; i++) {
-    af[i] = from[i*stride];
+    af[i] = from[i * stride];
   }
   return pload_ignore<Packet>(af);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet2cf pgather<std::complex<float>, Packet2cf>(const std::complex<float>* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet2cf pgather<std::complex<float>, Packet2cf>(const std::complex<float>* from,
+                                                                                        Index stride) {
   return pgather_complex_size2<std::complex<float>, Packet2cf>(from, stride);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet2cf pgather_partial<std::complex<float>, Packet2cf>(const std::complex<float>* from, Index stride, const Index n)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet2cf
+pgather_partial<std::complex<float>, Packet2cf>(const std::complex<float>* from, Index stride, const Index n) {
   return pgather_complex_size2<std::complex<float>, Packet2cf>(from, stride, n);
 }
-template<typename Scalar, typename Packet> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter_complex_size2(Scalar* to, const Packet& from, Index stride, const Index n = 2)
-{
+template <typename Scalar, typename Packet>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter_complex_size2(Scalar* to, const Packet& from, Index stride,
+                                                                  const Index n = 2) {
   eigen_internal_assert(n <= unpacket_traits<Packet>::size && "number of elements will scatter past end of packet");
   EIGEN_ALIGN16 Scalar af[2];
-  pstore<Scalar>((Scalar *) af, from);
+  pstore<Scalar>((Scalar*)af, from);
   for (Index i = 0; i < n; i++) {
-    to[i*stride] = af[i];
+    to[i * stride] = af[i];
   }
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter<std::complex<float>, Packet2cf>(std::complex<float>* to, const Packet2cf& from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter<std::complex<float>, Packet2cf>(std::complex<float>* to,
+                                                                                    const Packet2cf& from,
+                                                                                    Index stride) {
   pscatter_complex_size2<std::complex<float>, Packet2cf>(to, from, stride);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter_partial<std::complex<float>, Packet2cf>(std::complex<float>* to, const Packet2cf& from, Index stride, const Index n)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter_partial<std::complex<float>, Packet2cf>(std::complex<float>* to,
+                                                                                            const Packet2cf& from,
+                                                                                            Index stride,
+                                                                                            const Index n) {
   pscatter_complex_size2<std::complex<float>, Packet2cf>(to, from, stride, n);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2cf padd<Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(a.v + b.v); }
-template<> EIGEN_STRONG_INLINE Packet2cf psub<Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(a.v - b.v); }
-template<> EIGEN_STRONG_INLINE Packet2cf pnegate(const Packet2cf& a) { return Packet2cf(pnegate(a.v)); }
-template<> EIGEN_STRONG_INLINE Packet2cf pconj(const Packet2cf& a) { return Packet2cf(pxor<Packet4f>(a.v, reinterpret_cast<Packet4f>(p4ui_CONJ_XOR))); }
+template <>
+EIGEN_STRONG_INLINE Packet2cf padd<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
+  return Packet2cf(a.v + b.v);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf psub<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
+  return Packet2cf(a.v - b.v);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf pnegate(const Packet2cf& a) {
+  return Packet2cf(pnegate(a.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf pconj(const Packet2cf& a) {
+  return Packet2cf(pxor<Packet4f>(a.v, reinterpret_cast<Packet4f>(p4ui_CONJ_XOR)));
+}
 
-template<> EIGEN_STRONG_INLINE Packet2cf pand   <Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(pand<Packet4f>(a.v, b.v)); }
-template<> EIGEN_STRONG_INLINE Packet2cf por    <Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(por<Packet4f>(a.v, b.v)); }
-template<> EIGEN_STRONG_INLINE Packet2cf pxor   <Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(pxor<Packet4f>(a.v, b.v)); }
-template<> EIGEN_STRONG_INLINE Packet2cf pandnot<Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(pandnot<Packet4f>(a.v, b.v)); }
+template <>
+EIGEN_STRONG_INLINE Packet2cf pand<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
+  return Packet2cf(pand<Packet4f>(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf por<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
+  return Packet2cf(por<Packet4f>(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf pxor<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
+  return Packet2cf(pxor<Packet4f>(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf pandnot<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
+  return Packet2cf(pandnot<Packet4f>(a.v, b.v));
+}
 
-template<> EIGEN_STRONG_INLINE void prefetch<std::complex<float> >(const std::complex<float> * addr)    { EIGEN_PPC_PREFETCH(addr); }
+template <>
+EIGEN_STRONG_INLINE void prefetch<std::complex<float> >(const std::complex<float>* addr) {
+  EIGEN_PPC_PREFETCH(addr);
+}
 
-template<> EIGEN_STRONG_INLINE std::complex<float>  pfirst<Packet2cf>(const Packet2cf& a)
-{
+template <>
+EIGEN_STRONG_INLINE std::complex<float> pfirst<Packet2cf>(const Packet2cf& a) {
   EIGEN_ALIGN16 std::complex<float> res[2];
-  pstore((float *)&res, a.v);
+  pstore((float*)&res, a.v);
 
   return res[0];
 }
 
-template<> EIGEN_STRONG_INLINE Packet2cf preverse(const Packet2cf& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2cf preverse(const Packet2cf& a) {
   Packet4f rev_a;
   rev_a = vec_sld(a.v, a.v, 8);
   return Packet2cf(rev_a);
 }
 
-template<> EIGEN_STRONG_INLINE std::complex<float> predux<Packet2cf>(const Packet2cf& a)
-{
+template <>
+EIGEN_STRONG_INLINE std::complex<float> predux<Packet2cf>(const Packet2cf& a) {
   Packet4f b;
   b = vec_sld(a.v, a.v, 8);
   b = padd<Packet4f>(a.v, b);
   return pfirst<Packet2cf>(Packet2cf(b));
 }
 
-template<> EIGEN_STRONG_INLINE std::complex<float> predux_mul<Packet2cf>(const Packet2cf& a)
-{
+template <>
+EIGEN_STRONG_INLINE std::complex<float> predux_mul<Packet2cf>(const Packet2cf& a) {
   Packet4f b;
   Packet2cf prod;
   b = vec_sld(a.v, a.v, 8);
@@ -255,23 +322,24 @@
   return pfirst<Packet2cf>(prod);
 }
 
-EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet2cf,Packet4f)
+EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet2cf, Packet4f)
 
-template<> EIGEN_STRONG_INLINE Packet2cf pdiv<Packet2cf>(const Packet2cf& a, const Packet2cf& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2cf pdiv<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
   return pdiv_complex(a, b);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2cf pcplxflip<Packet2cf>(const Packet2cf& x)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2cf pcplxflip<Packet2cf>(const Packet2cf& x) {
   return Packet2cf(vec_perm(x.v, x.v, p16uc_COMPLEX32_REV));
 }
 
-EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet2cf,2>& kernel)
-{
+EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet2cf, 2>& kernel) {
 #ifdef EIGEN_VECTORIZE_VSX
-  Packet4f tmp = reinterpret_cast<Packet4f>(vec_mergeh(reinterpret_cast<Packet2d>(kernel.packet[0].v), reinterpret_cast<Packet2d>(kernel.packet[1].v)));
-  kernel.packet[1].v = reinterpret_cast<Packet4f>(vec_mergel(reinterpret_cast<Packet2d>(kernel.packet[0].v), reinterpret_cast<Packet2d>(kernel.packet[1].v)));
+  Packet4f tmp = reinterpret_cast<Packet4f>(
+      vec_mergeh(reinterpret_cast<Packet2d>(kernel.packet[0].v), reinterpret_cast<Packet2d>(kernel.packet[1].v)));
+  kernel.packet[1].v = reinterpret_cast<Packet4f>(
+      vec_mergel(reinterpret_cast<Packet2d>(kernel.packet[0].v), reinterpret_cast<Packet2d>(kernel.packet[1].v)));
 #else
   Packet4f tmp = vec_perm(kernel.packet[0].v, kernel.packet[1].v, p16uc_TRANSPOSE64_HI);
   kernel.packet[1].v = vec_perm(kernel.packet[0].v, kernel.packet[1].v, p16uc_TRANSPOSE64_LO);
@@ -279,33 +347,35 @@
   kernel.packet[0].v = tmp;
 }
 
-template<> EIGEN_STRONG_INLINE Packet2cf pcmp_eq(const Packet2cf& a, const Packet2cf& b) {
-  Packet4f eq = reinterpret_cast<Packet4f>(vec_cmpeq(a.v,b.v));
+template <>
+EIGEN_STRONG_INLINE Packet2cf pcmp_eq(const Packet2cf& a, const Packet2cf& b) {
+  Packet4f eq = reinterpret_cast<Packet4f>(vec_cmpeq(a.v, b.v));
   return Packet2cf(vec_and(eq, vec_perm(eq, eq, p16uc_COMPLEX32_REV)));
 }
 
 #ifdef EIGEN_VECTORIZE_VSX
-template<> EIGEN_STRONG_INLINE Packet2cf pblend(const Selector<2>& ifPacket, const Packet2cf& thenPacket, const Packet2cf& elsePacket) {
+template <>
+EIGEN_STRONG_INLINE Packet2cf pblend(const Selector<2>& ifPacket, const Packet2cf& thenPacket,
+                                     const Packet2cf& elsePacket) {
   Packet2cf result;
-  result.v = reinterpret_cast<Packet4f>(pblend<Packet2d>(ifPacket, reinterpret_cast<Packet2d>(thenPacket.v), reinterpret_cast<Packet2d>(elsePacket.v)));
+  result.v = reinterpret_cast<Packet4f>(
+      pblend<Packet2d>(ifPacket, reinterpret_cast<Packet2d>(thenPacket.v), reinterpret_cast<Packet2d>(elsePacket.v)));
   return result;
 }
 #endif
 
-template<> EIGEN_STRONG_INLINE Packet2cf psqrt<Packet2cf>(const Packet2cf& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2cf psqrt<Packet2cf>(const Packet2cf& a) {
   return psqrt_complex<Packet2cf>(a);
 }
 
 //---------- double ----------
 #ifdef EIGEN_VECTORIZE_VSX
-struct Packet1cd
-{
+struct Packet1cd {
   EIGEN_STRONG_INLINE Packet1cd() {}
   EIGEN_STRONG_INLINE explicit Packet1cd(const Packet2d& a) : v(a) {}
 
-  EIGEN_STRONG_INLINE Packet1cd pmul(const Packet1cd& a, const Packet1cd& b)
-  {
+  EIGEN_STRONG_INLINE Packet1cd pmul(const Packet1cd& a, const Packet1cd& b) {
     Packet2d a_re, a_im, v1, v2;
 
     // Permute and multiply the real parts of a and b
@@ -326,33 +396,25 @@
     v = pmul(Packet1cd(*this), b).v;
     return *this;
   }
-  EIGEN_STRONG_INLINE Packet1cd operator*(const Packet1cd& b) const {
-    return Packet1cd(*this) *= b;
-  }
+  EIGEN_STRONG_INLINE Packet1cd operator*(const Packet1cd& b) const { return Packet1cd(*this) *= b; }
 
   EIGEN_STRONG_INLINE Packet1cd& operator+=(const Packet1cd& b) {
     v = padd(v, b.v);
     return *this;
   }
-  EIGEN_STRONG_INLINE Packet1cd operator+(const Packet1cd& b) const {
-    return Packet1cd(*this) += b;
-  }
+  EIGEN_STRONG_INLINE Packet1cd operator+(const Packet1cd& b) const { return Packet1cd(*this) += b; }
   EIGEN_STRONG_INLINE Packet1cd& operator-=(const Packet1cd& b) {
     v = psub(v, b.v);
     return *this;
   }
-  EIGEN_STRONG_INLINE Packet1cd operator-(const Packet1cd& b) const {
-    return Packet1cd(*this) -= b;
-  }
-  EIGEN_STRONG_INLINE Packet1cd operator-(void) const {
-    return Packet1cd(-v);
-  }
+  EIGEN_STRONG_INLINE Packet1cd operator-(const Packet1cd& b) const { return Packet1cd(*this) -= b; }
+  EIGEN_STRONG_INLINE Packet1cd operator-(void) const { return Packet1cd(-v); }
 
   Packet2d v;
 };
 
-template<> struct packet_traits<std::complex<double> >  : default_packet_traits
-{
+template <>
+struct packet_traits<std::complex<double> > : default_packet_traits {
   typedef Packet1cd type;
   typedef Packet1cd half;
   typedef Packet2d as_real;
@@ -361,123 +423,204 @@
     AlignedOnScalar = 0,
     size = 1,
 
-    HasAdd    = 1,
-    HasSub    = 1,
-    HasMul    = 1,
-    HasDiv    = 1,
+    HasAdd = 1,
+    HasSub = 1,
+    HasMul = 1,
+    HasDiv = 1,
     HasNegate = 1,
-    HasAbs    = 0,
-    HasAbs2   = 0,
-    HasMin    = 0,
-    HasMax    = 0,
-    HasSqrt   = 1,
+    HasAbs = 0,
+    HasAbs2 = 0,
+    HasMin = 0,
+    HasMax = 0,
+    HasSqrt = 1,
     HasSetLinear = 0
   };
 };
 
-template<> struct unpacket_traits<Packet1cd> { typedef std::complex<double> type; enum {size=1, alignment=Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false}; typedef Packet1cd half; typedef Packet2d as_real; };
+template <>
+struct unpacket_traits<Packet1cd> {
+  typedef std::complex<double> type;
+  enum {
+    size = 1,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
+  typedef Packet1cd half;
+  typedef Packet2d as_real;
+};
 
-template<> EIGEN_STRONG_INLINE Packet1cd pload <Packet1cd>(const std::complex<double>* from) { return Packet1cd(pload<Packet2d>((const double*)from)); }
-template<> EIGEN_STRONG_INLINE Packet1cd ploadu<Packet1cd>(const std::complex<double>* from) { return Packet1cd(ploadu<Packet2d>((const double*)from)); }
-template<> EIGEN_ALWAYS_INLINE Packet1cd pload_partial<Packet1cd>(const std::complex<double>* from, const Index n, const Index offset)
-{
+template <>
+EIGEN_STRONG_INLINE Packet1cd pload<Packet1cd>(const std::complex<double>* from) {
+  return Packet1cd(pload<Packet2d>((const double*)from));
+}
+template <>
+EIGEN_STRONG_INLINE Packet1cd ploadu<Packet1cd>(const std::complex<double>* from) {
+  return Packet1cd(ploadu<Packet2d>((const double*)from));
+}
+template <>
+EIGEN_ALWAYS_INLINE Packet1cd pload_partial<Packet1cd>(const std::complex<double>* from, const Index n,
+                                                       const Index offset) {
   return Packet1cd(pload_partial<Packet2d>((const double*)from, n * 2, offset * 2));
 }
-template<> EIGEN_ALWAYS_INLINE Packet1cd ploadu_partial<Packet1cd>(const std::complex<double>* from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE Packet1cd ploadu_partial<Packet1cd>(const std::complex<double>* from, const Index n,
+                                                        const Index offset) {
   return Packet1cd(ploadu_partial<Packet2d>((const double*)from, n * 2, offset * 2));
 }
-template<> EIGEN_STRONG_INLINE void pstore <std::complex<double> >(std::complex<double> *   to, const Packet1cd& from) { pstore((double*)to, from.v); }
-template<> EIGEN_STRONG_INLINE void pstoreu<std::complex<double> >(std::complex<double> *   to, const Packet1cd& from) { pstoreu((double*)to, from.v); }
-template<> EIGEN_ALWAYS_INLINE void pstore_partial <std::complex<double> >(std::complex<double> *  to, const Packet1cd& from, const Index n, const Index offset) { pstore_partial((double*)to, from.v, n * 2, offset * 2); }
-template<> EIGEN_ALWAYS_INLINE void pstoreu_partial<std::complex<double> >(std::complex<double> *  to, const Packet1cd& from, const Index n, const Index offset) { pstoreu_partial((double*)to, from.v, n * 2, offset * 2); }
+template <>
+EIGEN_STRONG_INLINE void pstore<std::complex<double> >(std::complex<double>* to, const Packet1cd& from) {
+  pstore((double*)to, from.v);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<std::complex<double> >(std::complex<double>* to, const Packet1cd& from) {
+  pstoreu((double*)to, from.v);
+}
+template <>
+EIGEN_ALWAYS_INLINE void pstore_partial<std::complex<double> >(std::complex<double>* to, const Packet1cd& from,
+                                                               const Index n, const Index offset) {
+  pstore_partial((double*)to, from.v, n * 2, offset * 2);
+}
+template <>
+EIGEN_ALWAYS_INLINE void pstoreu_partial<std::complex<double> >(std::complex<double>* to, const Packet1cd& from,
+                                                                const Index n, const Index offset) {
+  pstoreu_partial((double*)to, from.v, n * 2, offset * 2);
+}
 
-template<> EIGEN_STRONG_INLINE Packet1cd pset1<Packet1cd>(const std::complex<double>&  from)
-{ /* here we really have to use unaligned loads :( */ return ploadu<Packet1cd>(&from); }
+template <>
+EIGEN_STRONG_INLINE Packet1cd
+pset1<Packet1cd>(const std::complex<double>& from) { /* here we really have to use unaligned loads :( */
+  return ploadu<Packet1cd>(&from);
+}
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet1cd pgather<std::complex<double>, Packet1cd>(const std::complex<double>* from, Index)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet1cd
+pgather<std::complex<double>, Packet1cd>(const std::complex<double>* from, Index) {
   return pload<Packet1cd>(from);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet1cd pgather_partial<std::complex<double>, Packet1cd>(const std::complex<double>* from, Index, const Index)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet1cd
+pgather_partial<std::complex<double>, Packet1cd>(const std::complex<double>* from, Index, const Index) {
   return pload<Packet1cd>(from);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter<std::complex<double>, Packet1cd>(std::complex<double>* to, const Packet1cd& from, Index)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter<std::complex<double>, Packet1cd>(std::complex<double>* to,
+                                                                                     const Packet1cd& from, Index) {
   pstore<std::complex<double> >(to, from);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter_partial<std::complex<double>, Packet1cd>(std::complex<double>* to, const Packet1cd& from, Index, const Index)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter_partial<std::complex<double>, Packet1cd>(std::complex<double>* to,
+                                                                                             const Packet1cd& from,
+                                                                                             Index, const Index) {
   pstore<std::complex<double> >(to, from);
 }
 
-template<> EIGEN_STRONG_INLINE Packet1cd padd<Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(a.v + b.v); }
-template<> EIGEN_STRONG_INLINE Packet1cd psub<Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(a.v - b.v); }
-template<> EIGEN_STRONG_INLINE Packet1cd pnegate(const Packet1cd& a) { return Packet1cd(pnegate(Packet2d(a.v))); }
-template<> EIGEN_STRONG_INLINE Packet1cd pconj(const Packet1cd& a) { return Packet1cd(pxor(a.v, reinterpret_cast<Packet2d>(p2ul_CONJ_XOR2))); }
+template <>
+EIGEN_STRONG_INLINE Packet1cd padd<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
+  return Packet1cd(a.v + b.v);
+}
+template <>
+EIGEN_STRONG_INLINE Packet1cd psub<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
+  return Packet1cd(a.v - b.v);
+}
+template <>
+EIGEN_STRONG_INLINE Packet1cd pnegate(const Packet1cd& a) {
+  return Packet1cd(pnegate(Packet2d(a.v)));
+}
+template <>
+EIGEN_STRONG_INLINE Packet1cd pconj(const Packet1cd& a) {
+  return Packet1cd(pxor(a.v, reinterpret_cast<Packet2d>(p2ul_CONJ_XOR2)));
+}
 
-template<> EIGEN_STRONG_INLINE Packet1cd pand   <Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(pand(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet1cd por    <Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(por(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet1cd pxor   <Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(pxor(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet1cd pandnot<Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(pandnot(a.v, b.v)); }
+template <>
+EIGEN_STRONG_INLINE Packet1cd pand<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
+  return Packet1cd(pand(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet1cd por<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
+  return Packet1cd(por(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet1cd pxor<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
+  return Packet1cd(pxor(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet1cd pandnot<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
+  return Packet1cd(pandnot(a.v, b.v));
+}
 
-template<> EIGEN_STRONG_INLINE Packet1cd ploaddup<Packet1cd>(const std::complex<double>*     from)  { return pset1<Packet1cd>(*from); }
+template <>
+EIGEN_STRONG_INLINE Packet1cd ploaddup<Packet1cd>(const std::complex<double>* from) {
+  return pset1<Packet1cd>(*from);
+}
 
-template<> EIGEN_STRONG_INLINE void prefetch<std::complex<double> >(const std::complex<double> * addr)    { EIGEN_PPC_PREFETCH(addr); }
+template <>
+EIGEN_STRONG_INLINE void prefetch<std::complex<double> >(const std::complex<double>* addr) {
+  EIGEN_PPC_PREFETCH(addr);
+}
 
-template<> EIGEN_STRONG_INLINE std::complex<double>  pfirst<Packet1cd>(const Packet1cd& a)
-{
+template <>
+EIGEN_STRONG_INLINE std::complex<double> pfirst<Packet1cd>(const Packet1cd& a) {
   EIGEN_ALIGN16 std::complex<double> res[1];
   pstore<std::complex<double> >(res, a);
 
   return res[0];
 }
 
-template<> EIGEN_STRONG_INLINE Packet1cd preverse(const Packet1cd& a) { return a; }
+template <>
+EIGEN_STRONG_INLINE Packet1cd preverse(const Packet1cd& a) {
+  return a;
+}
 
-template<> EIGEN_STRONG_INLINE std::complex<double> predux<Packet1cd>(const Packet1cd& a) { return pfirst(a); }
+template <>
+EIGEN_STRONG_INLINE std::complex<double> predux<Packet1cd>(const Packet1cd& a) {
+  return pfirst(a);
+}
 
-template<> EIGEN_STRONG_INLINE std::complex<double> predux_mul<Packet1cd>(const Packet1cd& a) { return pfirst(a); }
+template <>
+EIGEN_STRONG_INLINE std::complex<double> predux_mul<Packet1cd>(const Packet1cd& a) {
+  return pfirst(a);
+}
 
-EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet1cd,Packet2d)
+EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet1cd, Packet2d)
 
-template<> EIGEN_STRONG_INLINE Packet1cd pdiv<Packet1cd>(const Packet1cd& a, const Packet1cd& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet1cd pdiv<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
   return pdiv_complex(a, b);
 }
 
-EIGEN_STRONG_INLINE Packet1cd pcplxflip/*<Packet1cd>*/(const Packet1cd& x)
-{
+EIGEN_STRONG_INLINE Packet1cd pcplxflip /*<Packet1cd>*/ (const Packet1cd& x) {
   return Packet1cd(preverse(Packet2d(x.v)));
 }
 
-EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet1cd,2>& kernel)
-{
+EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet1cd, 2>& kernel) {
   Packet2d tmp = vec_mergeh(kernel.packet[0].v, kernel.packet[1].v);
   kernel.packet[1].v = vec_mergel(kernel.packet[0].v, kernel.packet[1].v);
   kernel.packet[0].v = tmp;
 }
 
-template<> EIGEN_STRONG_INLINE Packet1cd pcmp_eq(const Packet1cd& a, const Packet1cd& b) {
+template <>
+EIGEN_STRONG_INLINE Packet1cd pcmp_eq(const Packet1cd& a, const Packet1cd& b) {
   // Compare real and imaginary parts of a and b to get the mask vector:
   // [re(a)==re(b), im(a)==im(b)]
-  Packet2d eq = reinterpret_cast<Packet2d>(vec_cmpeq(a.v,b.v));
+  Packet2d eq = reinterpret_cast<Packet2d>(vec_cmpeq(a.v, b.v));
   // Swap real/imag elements in the mask in to get:
   // [im(a)==im(b), re(a)==re(b)]
-  Packet2d eq_swapped = reinterpret_cast<Packet2d>(vec_sld(reinterpret_cast<Packet4ui>(eq), reinterpret_cast<Packet4ui>(eq), 8));
+  Packet2d eq_swapped =
+      reinterpret_cast<Packet2d>(vec_sld(reinterpret_cast<Packet4ui>(eq), reinterpret_cast<Packet4ui>(eq), 8));
   // Return re(a)==re(b) & im(a)==im(b) by computing bitwise AND of eq and eq_swapped
   return Packet1cd(vec_and(eq, eq_swapped));
 }
 
-template<> EIGEN_STRONG_INLINE Packet1cd psqrt<Packet1cd>(const Packet1cd& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet1cd psqrt<Packet1cd>(const Packet1cd& a) {
   return psqrt_complex<Packet1cd>(a);
 }
 
-#endif // __VSX__
-} // end namespace internal
+#endif  // __VSX__
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_COMPLEX32_ALTIVEC_H
+#endif  // EIGEN_COMPLEX32_ALTIVEC_H
diff --git a/Eigen/src/Core/arch/AltiVec/MathFunctions.h b/Eigen/src/Core/arch/AltiVec/MathFunctions.h
index a8a2309..c95ee38 100644
--- a/Eigen/src/Core/arch/AltiVec/MathFunctions.h
+++ b/Eigen/src/Core/arch/AltiVec/MathFunctions.h
@@ -25,50 +25,47 @@
 #endif
 
 #ifdef EIGEN_VECTORIZE_VSX
-template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet4f psqrt<Packet4f>(const Packet4f& x)
-{
-  return  vec_sqrt(x);
+template <>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet4f psqrt<Packet4f>(const Packet4f& x) {
+  return vec_sqrt(x);
 }
 
-template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet2d psqrt<Packet2d>(const Packet2d& x)
-{
-  return  vec_sqrt(x);
+template <>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet2d psqrt<Packet2d>(const Packet2d& x) {
+  return vec_sqrt(x);
 }
 
 #if !EIGEN_COMP_CLANG
-template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet4f prsqrt<Packet4f>(const Packet4f& x)
-{
+template <>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet4f prsqrt<Packet4f>(const Packet4f& x) {
   return pset1<Packet4f>(1.0f) / psqrt<Packet4f>(x);
-//  vec_rsqrt returns different results from the generic version
-//  return  vec_rsqrt(x);
+  //  vec_rsqrt returns different results from the generic version
+  //  return  vec_rsqrt(x);
 }
 
-template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet2d prsqrt<Packet2d>(const Packet2d& x)
-{
+template <>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet2d prsqrt<Packet2d>(const Packet2d& x) {
   return pset1<Packet2d>(1.0) / psqrt<Packet2d>(x);
-//  vec_rsqrt returns different results from the generic version
-//  return  vec_rsqrt(x);
+  //  vec_rsqrt returns different results from the generic version
+  //  return  vec_rsqrt(x);
 }
 
 #endif
 
-template<> EIGEN_STRONG_INLINE Packet8bf psqrt<Packet8bf> (const Packet8bf& a){
+template <>
+EIGEN_STRONG_INLINE Packet8bf psqrt<Packet8bf>(const Packet8bf& a) {
   BF16_TO_F32_UNARY_OP_WRAPPER(psqrt<Packet4f>, a);
 }
 
 #if !EIGEN_COMP_CLANG
-template<> EIGEN_STRONG_INLINE Packet8bf prsqrt<Packet8bf> (const Packet8bf& a){
+template <>
+EIGEN_STRONG_INLINE Packet8bf prsqrt<Packet8bf>(const Packet8bf& a) {
   BF16_TO_F32_UNARY_OP_WRAPPER(prsqrt<Packet4f>, a);
 }
 #endif
 #else
-template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet4f psqrt<Packet4f>(const Packet4f& x)
-{
+template <>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet4f psqrt<Packet4f>(const Packet4f& x) {
   Packet4f a;
   for (Index i = 0; i < packet_traits<float>::size; i++) {
     a[i] = numext::sqrt(x[i]);
diff --git a/Eigen/src/Core/arch/AltiVec/MatrixProduct.h b/Eigen/src/Core/arch/AltiVec/MatrixProduct.h
index e9a9307..94306da 100644
--- a/Eigen/src/Core/arch/AltiVec/MatrixProduct.h
+++ b/Eigen/src/Core/arch/AltiVec/MatrixProduct.h
@@ -12,17 +12,17 @@
 #define EIGEN_MATRIX_PRODUCT_ALTIVEC_H
 
 #ifndef EIGEN_ALTIVEC_USE_CUSTOM_PACK
-#define EIGEN_ALTIVEC_USE_CUSTOM_PACK    1
+#define EIGEN_ALTIVEC_USE_CUSTOM_PACK 1
 #endif
 
 #if !defined(EIGEN_ALTIVEC_DISABLE_MMA)
 #define EIGEN_ALTIVEC_DISABLE_MMA 0
 #endif
 
-// Check for MMA builtin support. 
+// Check for MMA builtin support.
 #if !EIGEN_ALTIVEC_DISABLE_MMA && defined(__has_builtin)
 #if __has_builtin(__builtin_mma_assemble_acc)
-  #define EIGEN_ALTIVEC_MMA_SUPPORT
+#define EIGEN_ALTIVEC_MMA_SUPPORT
 #endif
 #endif
 
@@ -41,12 +41,12 @@
 #define EIGEN_ALTIVEC_MMA_ONLY 1
 #endif
 
-#endif // EIGEN_ALTIVEC_MMA_SUPPORT
+#endif  // EIGEN_ALTIVEC_MMA_SUPPORT
 
 #include "MatrixProductCommon.h"
 
 #if defined(EIGEN_ALTIVEC_MMA_ONLY) || defined(EIGEN_ALTIVEC_MMA_DYNAMIC_DISPATCH)
-  #include "MatrixProductMMA.h"
+#include "MatrixProductMMA.h"
 #endif
 
 // IWYU pragma: private
@@ -59,71 +59,41 @@
 /**************************
  * Constants and typedefs *
  **************************/
-template<typename Scalar>
-struct quad_traits
-{
-  typedef typename packet_traits<Scalar>::type    vectortype;
-  typedef PacketBlock<vectortype,4>                     type;
-  typedef vectortype                                 rhstype;
-  enum
-  {
-    vectorsize = packet_traits<Scalar>::size,
-    size = 4,
-    rows = 4
-  };
+template <typename Scalar>
+struct quad_traits {
+  typedef typename packet_traits<Scalar>::type vectortype;
+  typedef PacketBlock<vectortype, 4> type;
+  typedef vectortype rhstype;
+  enum { vectorsize = packet_traits<Scalar>::size, size = 4, rows = 4 };
 };
 
-template<>
-struct quad_traits<double>
-{
-  typedef Packet2d                        vectortype;
-  typedef PacketBlock<vectortype,4>             type;
-  typedef PacketBlock<Packet2d,2>            rhstype;
-  enum
-  {
-    vectorsize = packet_traits<double>::size,
-    size = 2,
-    rows = 4
-  };
+template <>
+struct quad_traits<double> {
+  typedef Packet2d vectortype;
+  typedef PacketBlock<vectortype, 4> type;
+  typedef PacketBlock<Packet2d, 2> rhstype;
+  enum { vectorsize = packet_traits<double>::size, size = 2, rows = 4 };
 };
 
-template<>
-struct quad_traits<bfloat16>
-{
-  typedef Packet8bf                       vectortype;
-  typedef PacketBlock<vectortype,4>             type;
-  typedef vectortype                         rhstype;
-  enum
-  {
-    vectorsize = packet_traits<bfloat16>::size,
-    size = 8,
-    rows = 4
-  };
+template <>
+struct quad_traits<bfloat16> {
+  typedef Packet8bf vectortype;
+  typedef PacketBlock<vectortype, 4> type;
+  typedef vectortype rhstype;
+  enum { vectorsize = packet_traits<bfloat16>::size, size = 8, rows = 4 };
 };
 
 // MatrixProduct decomposes real/imaginary vectors into a real vector and an imaginary vector, this turned out
 // to be faster than Eigen's usual approach of having real/imaginary pairs on a single vector. This constants then
 // are responsible to extract from convert between Eigen's and MatrixProduct approach.
 
-const static Packet16uc p16uc_GETREAL32 = {  0,  1,  2,  3,
-                                             8,  9, 10, 11,
-                                            16, 17, 18, 19,
-                                            24, 25, 26, 27};
+const static Packet16uc p16uc_GETREAL32 = {0, 1, 2, 3, 8, 9, 10, 11, 16, 17, 18, 19, 24, 25, 26, 27};
 
-const static Packet16uc p16uc_GETIMAG32 = {  4,  5,  6,  7,
-                                            12, 13, 14, 15,
-                                            20, 21, 22, 23,
-                                            28, 29, 30, 31};
+const static Packet16uc p16uc_GETIMAG32 = {4, 5, 6, 7, 12, 13, 14, 15, 20, 21, 22, 23, 28, 29, 30, 31};
 
-const static Packet16uc p16uc_GETREAL32b = {  0,  1,  2,  3,
-                                             16, 17, 18, 19,
-                                              8,  9, 10, 11,
-                                             24, 25, 26, 27};
+const static Packet16uc p16uc_GETREAL32b = {0, 1, 2, 3, 16, 17, 18, 19, 8, 9, 10, 11, 24, 25, 26, 27};
 
-const static Packet16uc p16uc_GETIMAG32b = {  4,  5,  6,  7,
-                                             20, 21, 22, 23,
-                                             12, 13, 14, 15,
-                                             28, 29, 30, 31};
+const static Packet16uc p16uc_GETIMAG32b = {4, 5, 6, 7, 20, 21, 22, 23, 12, 13, 14, 15, 28, 29, 30, 31};
 
 /*********************************************
  * Single precision real and complex packing *
@@ -131,55 +101,50 @@
 
 /**
  * Symm packing is related to packing of symmetric adjoint blocks, as expected the packing leaves
- * the diagonal real, whatever is below it is copied from the respective upper diagonal element and 
+ * the diagonal real, whatever is below it is copied from the respective upper diagonal element and
  * conjugated. There's no PanelMode available for symm packing.
  *
- * Packing in general is supposed to leave the lhs block and the rhs block easy to be read by gemm using 
+ * Packing in general is supposed to leave the lhs block and the rhs block easy to be read by gemm using
  * its respective rank-update instructions. The float32/64 versions are different because at this moment
  * the size of the accumulator is fixed at 512-bits so you can't have a 4x4 accumulator of 64-bit elements.
- * 
+ *
  * As mentioned earlier MatrixProduct breaks complex numbers into a real vector and a complex vector so packing has
  * to take that into account, at the moment, we run pack the real part and then the imaginary part, this is the main
  * reason why packing for complex is broken down into several different parts, also the reason why we endup having a
  * float32/64 and complex float32/64 version.
  **/
-template<typename Scalar, int StorageOrder>
-EIGEN_ALWAYS_INLINE std::complex<Scalar> getAdjointVal(Index i, Index j, const_blas_data_mapper<std::complex<Scalar>, Index, StorageOrder>& dt)
-{
+template <typename Scalar, int StorageOrder>
+EIGEN_ALWAYS_INLINE std::complex<Scalar> getAdjointVal(
+    Index i, Index j, const_blas_data_mapper<std::complex<Scalar>, Index, StorageOrder>& dt) {
   std::complex<Scalar> v;
-  if(i < j)
-  {
-    v.real( dt(j,i).real());
-    v.imag(-dt(j,i).imag());
-  } else if(i > j)
-  {
-    v.real( dt(i,j).real());
-    v.imag( dt(i,j).imag());
+  if (i < j) {
+    v.real(dt(j, i).real());
+    v.imag(-dt(j, i).imag());
+  } else if (i > j) {
+    v.real(dt(i, j).real());
+    v.imag(dt(i, j).imag());
   } else {
-    v.real( dt(i,j).real());
+    v.real(dt(i, j).real());
     v.imag((Scalar)0.0);
   }
   return v;
 }
 
-template<typename Scalar, int StorageOrder, int N>
-EIGEN_STRONG_INLINE void symm_pack_complex_rhs_helper(std::complex<Scalar>* blockB, const std::complex<Scalar>* _rhs, Index rhsStride, Index rows, Index cols, Index k2)
-{
+template <typename Scalar, int StorageOrder, int N>
+EIGEN_STRONG_INLINE void symm_pack_complex_rhs_helper(std::complex<Scalar>* blockB, const std::complex<Scalar>* _rhs,
+                                                      Index rhsStride, Index rows, Index cols, Index k2) {
   const Index depth = k2 + rows;
   const_blas_data_mapper<std::complex<Scalar>, Index, StorageOrder> rhs(_rhs, rhsStride);
-  const Index vectorSize = N*quad_traits<Scalar>::vectorsize;
+  const Index vectorSize = N * quad_traits<Scalar>::vectorsize;
   const Index vectorDelta = vectorSize * rows;
-  Scalar* blockBf = reinterpret_cast<Scalar *>(blockB);
+  Scalar* blockBf = reinterpret_cast<Scalar*>(blockB);
 
   Index rir = 0, rii, j = 0;
-  for(; j + vectorSize <= cols; j+=vectorSize)
-  {
+  for (; j + vectorSize <= cols; j += vectorSize) {
     rii = rir + vectorDelta;
 
-    for(Index i = k2; i < depth; i++)
-    {
-      for(Index k = 0; k < vectorSize; k++)
-      {
+    for (Index i = k2; i < depth; i++) {
+      for (Index k = 0; k < vectorSize; k++) {
         std::complex<Scalar> v = getAdjointVal<Scalar, StorageOrder>(i, j + k, rhs);
 
         blockBf[rir + k] = v.real();
@@ -192,12 +157,10 @@
     rir += vectorDelta;
   }
 
-  for(; j < cols; j++)
-  {
+  for (; j < cols; j++) {
     rii = rir + rows;
 
-    for(Index i = k2; i < depth; i++)
-    {
+    for (Index i = k2; i < depth; i++) {
       std::complex<Scalar> v = getAdjointVal<Scalar, StorageOrder>(i, j, rhs);
 
       blockBf[rir] = v.real();
@@ -211,25 +174,22 @@
   }
 }
 
-template<typename Scalar, int StorageOrder>
-EIGEN_STRONG_INLINE void symm_pack_complex_lhs_helper(std::complex<Scalar>* blockA, const std::complex<Scalar>* _lhs, Index lhsStride, Index cols, Index rows)
-{
+template <typename Scalar, int StorageOrder>
+EIGEN_STRONG_INLINE void symm_pack_complex_lhs_helper(std::complex<Scalar>* blockA, const std::complex<Scalar>* _lhs,
+                                                      Index lhsStride, Index cols, Index rows) {
   const Index depth = cols;
   const_blas_data_mapper<std::complex<Scalar>, Index, StorageOrder> lhs(_lhs, lhsStride);
   const Index vectorSize = quad_traits<Scalar>::vectorsize;
   const Index vectorDelta = vectorSize * depth;
-  Scalar* blockAf = reinterpret_cast<Scalar *>(blockA);
+  Scalar* blockAf = reinterpret_cast<Scalar*>(blockA);
 
   Index rir = 0, rii, j = 0;
-  for(; j + vectorSize <= rows; j+=vectorSize)
-  {
+  for (; j + vectorSize <= rows; j += vectorSize) {
     rii = rir + vectorDelta;
 
-    for(Index i = 0; i < depth; i++)
-    {
-      for(Index k = 0; k < vectorSize; k++)
-      {
-        std::complex<Scalar> v = getAdjointVal<Scalar, StorageOrder>(j+k, i, lhs);
+    for (Index i = 0; i < depth; i++) {
+      for (Index k = 0; k < vectorSize; k++) {
+        std::complex<Scalar> v = getAdjointVal<Scalar, StorageOrder>(j + k, i, lhs);
 
         blockAf[rir + k] = v.real();
         blockAf[rii + k] = v.imag();
@@ -241,15 +201,12 @@
     rir += vectorDelta;
   }
 
-  if (j < rows)
-  {
+  if (j < rows) {
     rii = rir + ((rows - j) * depth);
 
-    for(Index i = 0; i < depth; i++)
-    {
+    for (Index i = 0; i < depth; i++) {
       Index k = j;
-      for(; k < rows; k++)
-      {
+      for (; k < rows; k++) {
         std::complex<Scalar> v = getAdjointVal<Scalar, StorageOrder>(k, i, lhs);
 
         blockAf[rir] = v.real();
@@ -262,35 +219,30 @@
   }
 }
 
-template<typename Scalar, int StorageOrder, int N>
-EIGEN_STRONG_INLINE void symm_pack_rhs_helper(Scalar* blockB, const Scalar* _rhs, Index rhsStride, Index rows, Index cols, Index k2)
-{
+template <typename Scalar, int StorageOrder, int N>
+EIGEN_STRONG_INLINE void symm_pack_rhs_helper(Scalar* blockB, const Scalar* _rhs, Index rhsStride, Index rows,
+                                              Index cols, Index k2) {
   const Index depth = k2 + rows;
   const_blas_data_mapper<Scalar, Index, StorageOrder> rhs(_rhs, rhsStride);
   const Index vectorSize = quad_traits<Scalar>::vectorsize;
 
   Index ri = 0, j = 0;
-  for(; j + N*vectorSize <= cols; j+=N*vectorSize)
-  {
+  for (; j + N * vectorSize <= cols; j += N * vectorSize) {
     Index i = k2;
-    for(; i < depth; i++)
-    {
-      for(Index k = 0; k < N*vectorSize; k++)
-      {
-        if(i <= j+k)
-          blockB[ri + k] = rhs(j+k, i);
+    for (; i < depth; i++) {
+      for (Index k = 0; k < N * vectorSize; k++) {
+        if (i <= j + k)
+          blockB[ri + k] = rhs(j + k, i);
         else
-          blockB[ri + k] = rhs(i, j+k);
+          blockB[ri + k] = rhs(i, j + k);
       }
-      ri += N*vectorSize;
+      ri += N * vectorSize;
     }
   }
 
-  for(; j < cols; j++)
-  {
-    for(Index i = k2; i < depth; i++)
-    {
-      if(j <= i)
+  for (; j < cols; j++) {
+    for (Index i = k2; i < depth; i++) {
+      if (j <= i)
         blockB[ri] = rhs(i, j);
       else
         blockB[ri] = rhs(j, i);
@@ -299,39 +251,33 @@
   }
 }
 
-template<typename Scalar, int StorageOrder>
-EIGEN_STRONG_INLINE void symm_pack_lhs_helper(Scalar* blockA, const Scalar* _lhs, Index lhsStride, Index cols, Index rows)
-{
+template <typename Scalar, int StorageOrder>
+EIGEN_STRONG_INLINE void symm_pack_lhs_helper(Scalar* blockA, const Scalar* _lhs, Index lhsStride, Index cols,
+                                              Index rows) {
   const Index depth = cols;
   const_blas_data_mapper<Scalar, Index, StorageOrder> lhs(_lhs, lhsStride);
   const Index vectorSize = quad_traits<Scalar>::vectorsize;
 
   Index ri = 0, j = 0;
-  for(; j + vectorSize <= rows; j+=vectorSize)
-  {
+  for (; j + vectorSize <= rows; j += vectorSize) {
     Index i = 0;
 
-    for(; i < depth; i++)
-    {
-      for(Index k = 0; k < vectorSize; k++)
-      {
-        if(i <= j+k)
-          blockA[ri + k] = lhs(j+k, i);
+    for (; i < depth; i++) {
+      for (Index k = 0; k < vectorSize; k++) {
+        if (i <= j + k)
+          blockA[ri + k] = lhs(j + k, i);
         else
-          blockA[ri + k] = lhs(i, j+k);
+          blockA[ri + k] = lhs(i, j + k);
       }
       ri += vectorSize;
     }
   }
 
-  if (j < rows)
-  {
-    for(Index i = 0; i < depth; i++)
-    {
+  if (j < rows) {
+    for (Index i = 0; i < depth; i++) {
       Index k = j;
-      for(; k < rows; k++)
-      {
-        if(i <= k)
+      for (; k < rows; k++) {
+        if (i <= k)
           blockA[ri] = lhs(k, i);
         else
           blockA[ri] = lhs(i, k);
@@ -341,85 +287,73 @@
   }
 }
 
-template<typename Index, int nr, int StorageOrder>
-struct symm_pack_rhs<std::complex<float>, Index, nr, StorageOrder>
-{
-  void operator()(std::complex<float>* blockB, const std::complex<float>* _rhs, Index rhsStride, Index rows, Index cols, Index k2)
-  {
+template <typename Index, int nr, int StorageOrder>
+struct symm_pack_rhs<std::complex<float>, Index, nr, StorageOrder> {
+  void operator()(std::complex<float>* blockB, const std::complex<float>* _rhs, Index rhsStride, Index rows, Index cols,
+                  Index k2) {
     symm_pack_complex_rhs_helper<float, StorageOrder, 1>(blockB, _rhs, rhsStride, rows, cols, k2);
   }
 };
 
-template<typename Index, int Pack1, int Pack2_dummy, int StorageOrder>
-struct symm_pack_lhs<std::complex<float>, Index, Pack1, Pack2_dummy, StorageOrder>
-{
-  void operator()(std::complex<float>* blockA, const std::complex<float>* _lhs, Index lhsStride, Index cols, Index rows)
-  {
+template <typename Index, int Pack1, int Pack2_dummy, int StorageOrder>
+struct symm_pack_lhs<std::complex<float>, Index, Pack1, Pack2_dummy, StorageOrder> {
+  void operator()(std::complex<float>* blockA, const std::complex<float>* _lhs, Index lhsStride, Index cols,
+                  Index rows) {
     symm_pack_complex_lhs_helper<float, StorageOrder>(blockA, _lhs, lhsStride, cols, rows);
   }
 };
 
 // *********** symm_pack std::complex<float64> ***********
 
-template<typename Index, int nr, int StorageOrder>
-struct symm_pack_rhs<std::complex<double>, Index, nr, StorageOrder>
-{
-  void operator()(std::complex<double>* blockB, const std::complex<double>* _rhs, Index rhsStride, Index rows, Index cols, Index k2)
-  {
+template <typename Index, int nr, int StorageOrder>
+struct symm_pack_rhs<std::complex<double>, Index, nr, StorageOrder> {
+  void operator()(std::complex<double>* blockB, const std::complex<double>* _rhs, Index rhsStride, Index rows,
+                  Index cols, Index k2) {
     symm_pack_complex_rhs_helper<double, StorageOrder, 2>(blockB, _rhs, rhsStride, rows, cols, k2);
   }
 };
 
-template<typename Index, int Pack1, int Pack2_dummy, int StorageOrder>
-struct symm_pack_lhs<std::complex<double>, Index, Pack1, Pack2_dummy, StorageOrder>
-{
-  void operator()(std::complex<double>* blockA, const std::complex<double>* _lhs, Index lhsStride, Index cols, Index rows)
-  {
+template <typename Index, int Pack1, int Pack2_dummy, int StorageOrder>
+struct symm_pack_lhs<std::complex<double>, Index, Pack1, Pack2_dummy, StorageOrder> {
+  void operator()(std::complex<double>* blockA, const std::complex<double>* _lhs, Index lhsStride, Index cols,
+                  Index rows) {
     symm_pack_complex_lhs_helper<double, StorageOrder>(blockA, _lhs, lhsStride, cols, rows);
   }
 };
 
 // *********** symm_pack float32 ***********
-template<typename Index, int nr, int StorageOrder>
-struct symm_pack_rhs<float, Index, nr, StorageOrder>
-{
-  void operator()(float* blockB, const float* _rhs, Index rhsStride, Index rows, Index cols, Index k2)
-  {
+template <typename Index, int nr, int StorageOrder>
+struct symm_pack_rhs<float, Index, nr, StorageOrder> {
+  void operator()(float* blockB, const float* _rhs, Index rhsStride, Index rows, Index cols, Index k2) {
     symm_pack_rhs_helper<float, StorageOrder, 1>(blockB, _rhs, rhsStride, rows, cols, k2);
   }
 };
 
-template<typename Index, int Pack1, int Pack2_dummy, int StorageOrder>
-struct symm_pack_lhs<float, Index, Pack1, Pack2_dummy, StorageOrder>
-{
-  void operator()(float* blockA, const float* _lhs, Index lhsStride, Index cols, Index rows)
-  {
+template <typename Index, int Pack1, int Pack2_dummy, int StorageOrder>
+struct symm_pack_lhs<float, Index, Pack1, Pack2_dummy, StorageOrder> {
+  void operator()(float* blockA, const float* _lhs, Index lhsStride, Index cols, Index rows) {
     symm_pack_lhs_helper<float, StorageOrder>(blockA, _lhs, lhsStride, cols, rows);
   }
 };
 
 // *********** symm_pack float64 ***********
-template<typename Index, int nr, int StorageOrder>
-struct symm_pack_rhs<double, Index, nr, StorageOrder>
-{
-  void operator()(double* blockB, const double* _rhs, Index rhsStride, Index rows, Index cols, Index k2)
-  {
+template <typename Index, int nr, int StorageOrder>
+struct symm_pack_rhs<double, Index, nr, StorageOrder> {
+  void operator()(double* blockB, const double* _rhs, Index rhsStride, Index rows, Index cols, Index k2) {
     symm_pack_rhs_helper<double, StorageOrder, 2>(blockB, _rhs, rhsStride, rows, cols, k2);
   }
 };
 
-template<typename Index, int Pack1, int Pack2_dummy, int StorageOrder>
-struct symm_pack_lhs<double, Index, Pack1, Pack2_dummy, StorageOrder>
-{
-  void operator()(double* blockA, const double* _lhs, Index lhsStride, Index cols, Index rows)
-  {
+template <typename Index, int Pack1, int Pack2_dummy, int StorageOrder>
+struct symm_pack_lhs<double, Index, Pack1, Pack2_dummy, StorageOrder> {
+  void operator()(double* blockA, const double* _lhs, Index lhsStride, Index cols, Index rows) {
     symm_pack_lhs_helper<double, StorageOrder>(blockA, _lhs, lhsStride, cols, rows);
   }
 };
 
 /**
  * PanelMode
- * Packing might be called several times before being multiplied by gebp_kernel, this happens because 
+ * Packing might be called several times before being multiplied by gebp_kernel, this happens because
  * on special occasions it fills part of block with other parts of the matrix. Two variables control
  * how PanelMode should behave: offset and stride. The idea is that those variables represent whatever
  * is going to be the real offset and stride in the future and this is what you should obey. The process
@@ -428,9 +362,8 @@
  * and offset and behaves accordingly.
  **/
 
-template<typename Scalar, typename Packet, int N>
-EIGEN_ALWAYS_INLINE void storeBlock(Scalar* to, PacketBlock<Packet,N>& block)
-{
+template <typename Scalar, typename Packet, int N>
+EIGEN_ALWAYS_INLINE void storeBlock(Scalar* to, PacketBlock<Packet, N>& block) {
   const Index size = 16 / sizeof(Scalar);
   pstore<Scalar>(to + (0 * size), block.packet[0]);
   pstore<Scalar>(to + (1 * size), block.packet[1]);
@@ -443,11 +376,12 @@
 }
 
 // General template for lhs & rhs complex packing.
-template<typename Scalar, typename DataMapper, typename Packet, typename PacketC, int StorageOrder, bool Conjugate, bool PanelMode, bool UseLhs>
+template <typename Scalar, typename DataMapper, typename Packet, typename PacketC, int StorageOrder, bool Conjugate,
+          bool PanelMode, bool UseLhs>
 struct dhs_cpack {
-  template<bool transpose>
-  EIGEN_ALWAYS_INLINE void dhs_cblock(PacketBlock<PacketC,8>& cblock, PacketBlock<Packet,4>& block, Packet16uc permute)
-  {
+  template <bool transpose>
+  EIGEN_ALWAYS_INLINE void dhs_cblock(PacketBlock<PacketC, 8>& cblock, PacketBlock<Packet, 4>& block,
+                                      Packet16uc permute) {
     if (transpose) {
       block.packet[0] = vec_perm(cblock.packet[0].v, cblock.packet[1].v, permute);
       block.packet[1] = vec_perm(cblock.packet[2].v, cblock.packet[3].v, permute);
@@ -456,10 +390,14 @@
 
       Packet4f t0, t1, t2, t3;
 #ifdef EIGEN_VECTORIZE_VSX
-      t0 = reinterpret_cast<Packet>(vec_mergeh(reinterpret_cast<Packet2ul>(block.packet[0]), reinterpret_cast<Packet2ul>(block.packet[1])));
-      t1 = reinterpret_cast<Packet>(vec_mergel(reinterpret_cast<Packet2ul>(block.packet[0]), reinterpret_cast<Packet2ul>(block.packet[1])));
-      t2 = reinterpret_cast<Packet>(vec_mergeh(reinterpret_cast<Packet2ul>(block.packet[2]), reinterpret_cast<Packet2ul>(block.packet[3])));
-      t3 = reinterpret_cast<Packet>(vec_mergel(reinterpret_cast<Packet2ul>(block.packet[2]), reinterpret_cast<Packet2ul>(block.packet[3])));
+      t0 = reinterpret_cast<Packet>(
+          vec_mergeh(reinterpret_cast<Packet2ul>(block.packet[0]), reinterpret_cast<Packet2ul>(block.packet[1])));
+      t1 = reinterpret_cast<Packet>(
+          vec_mergel(reinterpret_cast<Packet2ul>(block.packet[0]), reinterpret_cast<Packet2ul>(block.packet[1])));
+      t2 = reinterpret_cast<Packet>(
+          vec_mergeh(reinterpret_cast<Packet2ul>(block.packet[2]), reinterpret_cast<Packet2ul>(block.packet[3])));
+      t3 = reinterpret_cast<Packet>(
+          vec_mergel(reinterpret_cast<Packet2ul>(block.packet[2]), reinterpret_cast<Packet2ul>(block.packet[3])));
 #else
       t0 = reinterpret_cast<Packet>(vec_perm(block.packet[0], block.packet[1], p16uc_TRANSPOSE64_HI));
       t1 = reinterpret_cast<Packet>(vec_perm(block.packet[0], block.packet[1], p16uc_TRANSPOSE64_LO));
@@ -479,21 +417,19 @@
     }
   }
 
-  EIGEN_ALWAYS_INLINE void dhs_ccopy(Scalar* blockAt, const DataMapper& lhs2, Index& i, Index& rir, Index& rii, Index depth, const Index vectorSize)
-  {
-    PacketBlock<Packet,4> blockr, blocki;
-    PacketBlock<PacketC,8> cblock;
+  EIGEN_ALWAYS_INLINE void dhs_ccopy(Scalar* blockAt, const DataMapper& lhs2, Index& i, Index& rir, Index& rii,
+                                     Index depth, const Index vectorSize) {
+    PacketBlock<Packet, 4> blockr, blocki;
+    PacketBlock<PacketC, 8> cblock;
 
-    for(; i + vectorSize <= depth; i+=vectorSize)
-    {
+    for (; i + vectorSize <= depth; i += vectorSize) {
       if (UseLhs) {
         bload<DataMapper, PacketC, 2, StorageOrder, true, 4>(cblock, lhs2, 0, i);
       } else {
         bload<DataMapper, PacketC, 2, StorageOrder, true, 4>(cblock, lhs2, i, 0);
       }
 
-      if(((StorageOrder == RowMajor) && UseLhs) || (((StorageOrder == ColMajor) && !UseLhs)))
-      {
+      if (((StorageOrder == RowMajor) && UseLhs) || (((StorageOrder == ColMajor) && !UseLhs))) {
         dhs_cblock<true>(cblock, blockr, p16uc_GETREAL32b);
         dhs_cblock<true>(cblock, blocki, p16uc_GETIMAG32b);
       } else {
@@ -501,8 +437,7 @@
         dhs_cblock<false>(cblock, blocki, p16uc_GETIMAG32);
       }
 
-      if(Conjugate)
-      {
+      if (Conjugate) {
         blocki.packet[0] = -blocki.packet[0];
         blocki.packet[1] = -blocki.packet[1];
         blocki.packet[2] = -blocki.packet[2];
@@ -512,21 +447,20 @@
       storeBlock<Scalar, Packet, 4>(blockAt + rir, blockr);
       storeBlock<Scalar, Packet, 4>(blockAt + rii, blocki);
 
-      rir += 4*vectorSize;
-      rii += 4*vectorSize;
+      rir += 4 * vectorSize;
+      rii += 4 * vectorSize;
     }
   }
 
-  EIGEN_STRONG_INLINE void operator()(std::complex<Scalar>* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride, Index offset)
-  {
+  EIGEN_STRONG_INLINE void operator()(std::complex<Scalar>* blockA, const DataMapper& lhs, Index depth, Index rows,
+                                      Index stride, Index offset) {
     const Index vectorSize = quad_traits<Scalar>::vectorsize;
     const Index vectorDelta = vectorSize * ((PanelMode) ? stride : depth);
-    Index rir = ((PanelMode) ? (vectorSize*offset) : 0), rii;
-    Scalar* blockAt = reinterpret_cast<Scalar *>(blockA);
+    Index rir = ((PanelMode) ? (vectorSize * offset) : 0), rii;
+    Scalar* blockAt = reinterpret_cast<Scalar*>(blockA);
     Index j = 0;
 
-    for(; j + vectorSize <= rows; j+=vectorSize)
-    {
+    for (; j + vectorSize <= rows; j += vectorSize) {
       const DataMapper lhs2 = UseLhs ? lhs.getSubMapper(j, 0) : lhs.getSubMapper(0, j);
       Index i = 0;
 
@@ -534,13 +468,11 @@
 
       dhs_ccopy(blockAt, lhs2, i, rir, rii, depth, vectorSize);
 
-      for(; i < depth; i++)
-      {
-        PacketBlock<Packet,1> blockr, blocki;
-        PacketBlock<PacketC,2> cblock;
+      for (; i < depth; i++) {
+        PacketBlock<Packet, 1> blockr, blocki;
+        PacketBlock<PacketC, 2> cblock;
 
-        if(((StorageOrder == ColMajor) && UseLhs) || (((StorageOrder == RowMajor) && !UseLhs)))
-        {
+        if (((StorageOrder == ColMajor) && UseLhs) || (((StorageOrder == RowMajor) && !UseLhs))) {
           if (UseLhs) {
             cblock.packet[0] = lhs2.template loadPacket<PacketC>(0, i);
             cblock.packet[1] = lhs2.template loadPacket<PacketC>(2, i);
@@ -561,8 +493,7 @@
         blockr.packet[0] = vec_perm(cblock.packet[0].v, cblock.packet[1].v, p16uc_GETREAL32);
         blocki.packet[0] = vec_perm(cblock.packet[0].v, cblock.packet[1].v, p16uc_GETIMAG32);
 
-        if(Conjugate)
-        {
+        if (Conjugate) {
           blocki.packet[0] = -blocki.packet[0];
         }
 
@@ -573,50 +504,44 @@
         rii += vectorSize;
       }
 
-      rir += ((PanelMode) ? (vectorSize*(2*stride - depth)) : vectorDelta);
+      rir += ((PanelMode) ? (vectorSize * (2 * stride - depth)) : vectorDelta);
     }
 
-    if (!UseLhs)
-    {
-      if(PanelMode) rir -= (offset*(vectorSize - 1));
+    if (!UseLhs) {
+      if (PanelMode) rir -= (offset * (vectorSize - 1));
 
-      for(; j < rows; j++)
-      {
+      for (; j < rows; j++) {
         const DataMapper lhs2 = lhs.getSubMapper(0, j);
         rii = rir + ((PanelMode) ? stride : depth);
 
-        for(Index i = 0; i < depth; i++)
-        {
+        for (Index i = 0; i < depth; i++) {
           blockAt[rir] = lhs2(i, 0).real();
 
-          if(Conjugate)
+          if (Conjugate)
             blockAt[rii] = -lhs2(i, 0).imag();
           else
-            blockAt[rii] =  lhs2(i, 0).imag();
+            blockAt[rii] = lhs2(i, 0).imag();
 
           rir += 1;
           rii += 1;
         }
 
-        rir += ((PanelMode) ? (2*stride - depth) : depth);
+        rir += ((PanelMode) ? (2 * stride - depth) : depth);
       }
     } else {
-      if (j < rows)
-      {
-        if(PanelMode) rir += (offset*(rows - j - vectorSize));
+      if (j < rows) {
+        if (PanelMode) rir += (offset * (rows - j - vectorSize));
         rii = rir + (((PanelMode) ? stride : depth) * (rows - j));
 
-        for(Index i = 0; i < depth; i++)
-        {
+        for (Index i = 0; i < depth; i++) {
           Index k = j;
-          for(; k < rows; k++)
-          {
+          for (; k < rows; k++) {
             blockAt[rir] = lhs(k, i).real();
 
-            if(Conjugate)
+            if (Conjugate)
               blockAt[rii] = -lhs(k, i).imag();
             else
-              blockAt[rii] =  lhs(k, i).imag();
+              blockAt[rii] = lhs(k, i).imag();
 
             rir += 1;
             rii += 1;
@@ -628,68 +553,63 @@
 };
 
 // General template for lhs & rhs packing.
-template<typename Scalar, typename DataMapper, typename Packet, int StorageOrder, bool PanelMode, bool UseLhs>
-struct dhs_pack{
-  template<Index n>
-  EIGEN_ALWAYS_INLINE void dhs_copy(Scalar* blockA, const DataMapper& lhs2, Index& i, Index& ri, Index depth, const Index vectorSize)
-  {
-    PacketBlock<Packet,4> block[n];
+template <typename Scalar, typename DataMapper, typename Packet, int StorageOrder, bool PanelMode, bool UseLhs>
+struct dhs_pack {
+  template <Index n>
+  EIGEN_ALWAYS_INLINE void dhs_copy(Scalar* blockA, const DataMapper& lhs2, Index& i, Index& ri, Index depth,
+                                    const Index vectorSize) {
+    PacketBlock<Packet, 4> block[n];
 
-    for(; i + n*vectorSize <= depth; i+=n*vectorSize)
-    {
+    for (; i + n * vectorSize <= depth; i += n * vectorSize) {
       for (Index k = 0; k < n; k++) {
         if (UseLhs) {
-          bload<DataMapper, Packet, 4, StorageOrder, false, 4>(block[k], lhs2, 0, i + k*vectorSize);
+          bload<DataMapper, Packet, 4, StorageOrder, false, 4>(block[k], lhs2, 0, i + k * vectorSize);
         } else {
-          bload<DataMapper, Packet, 4, StorageOrder, false, 4>(block[k], lhs2, i + k*vectorSize, 0);
+          bload<DataMapper, Packet, 4, StorageOrder, false, 4>(block[k], lhs2, i + k * vectorSize, 0);
         }
       }
 
-      if(((StorageOrder == RowMajor) && UseLhs) || ((StorageOrder == ColMajor) && !UseLhs))
-      {
+      if (((StorageOrder == RowMajor) && UseLhs) || ((StorageOrder == ColMajor) && !UseLhs)) {
         for (Index k = 0; k < n; k++) {
           ptranspose(block[k]);
         }
       }
 
       for (Index k = 0; k < n; k++) {
-        storeBlock<Scalar, Packet, 4>(blockA + ri + k*4*vectorSize, block[k]);
+        storeBlock<Scalar, Packet, 4>(blockA + ri + k * 4 * vectorSize, block[k]);
       }
 
-      ri += n*4*vectorSize;
+      ri += n * 4 * vectorSize;
     }
   }
 
-  EIGEN_STRONG_INLINE void operator()(Scalar* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride, Index offset)
-  {
+  EIGEN_STRONG_INLINE void operator()(Scalar* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride,
+                                      Index offset) {
     const Index vectorSize = quad_traits<Scalar>::vectorsize;
     Index ri = 0, j = 0;
 
-    for(; j + vectorSize <= rows; j+=vectorSize)
-    {
+    for (; j + vectorSize <= rows; j += vectorSize) {
       const DataMapper lhs2 = UseLhs ? lhs.getSubMapper(j, 0) : lhs.getSubMapper(0, j);
       Index i = 0;
 
-      if(PanelMode) ri += vectorSize*offset;
+      if (PanelMode) ri += vectorSize * offset;
 
       dhs_copy<4>(blockA, lhs2, i, ri, depth, vectorSize);
       dhs_copy<2>(blockA, lhs2, i, ri, depth, vectorSize);
       dhs_copy<1>(blockA, lhs2, i, ri, depth, vectorSize);
 
-      for(; i < depth; i++)
-      {
-        if(((StorageOrder == RowMajor) && UseLhs) || ((StorageOrder == ColMajor) && !UseLhs))
-        {
+      for (; i < depth; i++) {
+        if (((StorageOrder == RowMajor) && UseLhs) || ((StorageOrder == ColMajor) && !UseLhs)) {
           if (UseLhs) {
-            blockA[ri+0] = lhs2(0, i);
-            blockA[ri+1] = lhs2(1, i);
-            blockA[ri+2] = lhs2(2, i);
-            blockA[ri+3] = lhs2(3, i);
+            blockA[ri + 0] = lhs2(0, i);
+            blockA[ri + 1] = lhs2(1, i);
+            blockA[ri + 2] = lhs2(2, i);
+            blockA[ri + 3] = lhs2(3, i);
           } else {
-            blockA[ri+0] = lhs2(i, 0);
-            blockA[ri+1] = lhs2(i, 1);
-            blockA[ri+2] = lhs2(i, 2);
-            blockA[ri+3] = lhs2(i, 3);
+            blockA[ri + 0] = lhs2(i, 0);
+            blockA[ri + 1] = lhs2(i, 1);
+            blockA[ri + 2] = lhs2(i, 2);
+            blockA[ri + 3] = lhs2(i, 3);
           }
         } else {
           Packet lhsV;
@@ -704,34 +624,28 @@
         ri += vectorSize;
       }
 
-      if(PanelMode) ri += vectorSize*(stride - offset - depth);
+      if (PanelMode) ri += vectorSize * (stride - offset - depth);
     }
 
-    if (!UseLhs)
-    {
-      if(PanelMode) ri += offset;
+    if (!UseLhs) {
+      if (PanelMode) ri += offset;
 
-      for(; j < rows; j++)
-      {
+      for (; j < rows; j++) {
         const DataMapper lhs2 = lhs.getSubMapper(0, j);
-        for(Index i = 0; i < depth; i++)
-        {
+        for (Index i = 0; i < depth; i++) {
           blockA[ri] = lhs2(i, 0);
           ri += 1;
         }
 
-        if(PanelMode) ri += stride - depth;
+        if (PanelMode) ri += stride - depth;
       }
     } else {
-      if (j < rows)
-      {
-        if(PanelMode) ri += offset*(rows - j);
+      if (j < rows) {
+        if (PanelMode) ri += offset * (rows - j);
 
-        for(Index i = 0; i < depth; i++)
-        {
+        for (Index i = 0; i < depth; i++) {
           Index k = j;
-          for(; k < rows; k++)
-          {
+          for (; k < rows; k++) {
             blockA[ri] = lhs(k, i);
             ri += 1;
           }
@@ -742,64 +656,57 @@
 };
 
 // General template for lhs packing, float64 specialization.
-template<typename DataMapper, int StorageOrder, bool PanelMode>
-struct dhs_pack<double, DataMapper, Packet2d, StorageOrder, PanelMode, true>
-{
-  template<Index n>
-  EIGEN_ALWAYS_INLINE void dhs_copy(double* blockA, const DataMapper& lhs2, Index& i, Index& ri, Index depth, const Index vectorSize)
-  {
-    PacketBlock<Packet2d,2> block[n];
+template <typename DataMapper, int StorageOrder, bool PanelMode>
+struct dhs_pack<double, DataMapper, Packet2d, StorageOrder, PanelMode, true> {
+  template <Index n>
+  EIGEN_ALWAYS_INLINE void dhs_copy(double* blockA, const DataMapper& lhs2, Index& i, Index& ri, Index depth,
+                                    const Index vectorSize) {
+    PacketBlock<Packet2d, 2> block[n];
 
-    for(; i + n*vectorSize <= depth; i+=n*vectorSize)
-    {
+    for (; i + n * vectorSize <= depth; i += n * vectorSize) {
       for (Index k = 0; k < n; k++) {
-        if(StorageOrder == RowMajor)
-        {
-          block[k].packet[0] = lhs2.template loadPacket<Packet2d>(0, i + k*vectorSize);
-          block[k].packet[1] = lhs2.template loadPacket<Packet2d>(1, i + k*vectorSize);
+        if (StorageOrder == RowMajor) {
+          block[k].packet[0] = lhs2.template loadPacket<Packet2d>(0, i + k * vectorSize);
+          block[k].packet[1] = lhs2.template loadPacket<Packet2d>(1, i + k * vectorSize);
         } else {
-          block[k].packet[0] = lhs2.template loadPacket<Packet2d>(0, i + k*vectorSize + 0);
-          block[k].packet[1] = lhs2.template loadPacket<Packet2d>(0, i + k*vectorSize + 1);
+          block[k].packet[0] = lhs2.template loadPacket<Packet2d>(0, i + k * vectorSize + 0);
+          block[k].packet[1] = lhs2.template loadPacket<Packet2d>(0, i + k * vectorSize + 1);
         }
       }
 
-      if(StorageOrder == RowMajor)
-      {
+      if (StorageOrder == RowMajor) {
         for (Index k = 0; k < n; k++) {
           ptranspose(block[k]);
         }
       }
 
       for (Index k = 0; k < n; k++) {
-        storeBlock<double, Packet2d, 2>(blockA + ri + k*2*vectorSize, block[k]);
+        storeBlock<double, Packet2d, 2>(blockA + ri + k * 2 * vectorSize, block[k]);
       }
 
-      ri += n*2*vectorSize;
+      ri += n * 2 * vectorSize;
     }
   }
 
-  EIGEN_STRONG_INLINE void operator()(double* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride, Index offset)
-  {
+  EIGEN_STRONG_INLINE void operator()(double* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride,
+                                      Index offset) {
     const Index vectorSize = quad_traits<double>::vectorsize;
     Index ri = 0, j = 0;
 
-    for(; j + vectorSize <= rows; j+=vectorSize)
-    {
+    for (; j + vectorSize <= rows; j += vectorSize) {
       const DataMapper lhs2 = lhs.getSubMapper(j, 0);
       Index i = 0;
 
-      if(PanelMode) ri += vectorSize*offset;
+      if (PanelMode) ri += vectorSize * offset;
 
       dhs_copy<4>(blockA, lhs2, i, ri, depth, vectorSize);
       dhs_copy<2>(blockA, lhs2, i, ri, depth, vectorSize);
       dhs_copy<1>(blockA, lhs2, i, ri, depth, vectorSize);
 
-      for(; i < depth; i++)
-      {
-        if(StorageOrder == RowMajor)
-        {
-          blockA[ri+0] = lhs2(0, i);
-          blockA[ri+1] = lhs2(1, i);
+      for (; i < depth; i++) {
+        if (StorageOrder == RowMajor) {
+          blockA[ri + 0] = lhs2(0, i);
+          blockA[ri + 1] = lhs2(1, i);
         } else {
           Packet2d lhsV = lhs2.template loadPacket<Packet2d>(0, i);
           pstore<double>(blockA + ri, lhsV);
@@ -808,18 +715,15 @@
         ri += vectorSize;
       }
 
-      if(PanelMode) ri += vectorSize*(stride - offset - depth);
+      if (PanelMode) ri += vectorSize * (stride - offset - depth);
     }
 
-    if (j < rows)
-    {
-      if(PanelMode) ri += offset*(rows - j);
+    if (j < rows) {
+      if (PanelMode) ri += offset * (rows - j);
 
-      for(Index i = 0; i < depth; i++)
-      {
+      for (Index i = 0; i < depth; i++) {
         Index k = j;
-        for(; k < rows; k++)
-        {
+        for (; k < rows; k++) {
           blockA[ri] = lhs(k, i);
           ri += 1;
         }
@@ -829,34 +733,30 @@
 };
 
 // General template for rhs packing, float64 specialization.
-template<typename DataMapper, int StorageOrder, bool PanelMode>
-struct dhs_pack<double, DataMapper, Packet2d, StorageOrder, PanelMode, false>
-{
-  template<Index n>
-  EIGEN_ALWAYS_INLINE void dhs_copy(double* blockB, const DataMapper& rhs2, Index& i, Index& ri, Index depth, const Index vectorSize)
-  {
-    PacketBlock<Packet2d,2> block1[n], block2[n];
-    PacketBlock<Packet2d,4> block3[n];
+template <typename DataMapper, int StorageOrder, bool PanelMode>
+struct dhs_pack<double, DataMapper, Packet2d, StorageOrder, PanelMode, false> {
+  template <Index n>
+  EIGEN_ALWAYS_INLINE void dhs_copy(double* blockB, const DataMapper& rhs2, Index& i, Index& ri, Index depth,
+                                    const Index vectorSize) {
+    PacketBlock<Packet2d, 2> block1[n], block2[n];
+    PacketBlock<Packet2d, 4> block3[n];
 
-    for(; i + n*vectorSize <= depth; i+=n*vectorSize)
-    {
+    for (; i + n * vectorSize <= depth; i += n * vectorSize) {
       for (Index k = 0; k < n; k++) {
-        if(StorageOrder == ColMajor)
-        {
-          block1[k].packet[0] = rhs2.template loadPacket<Packet2d>(i + k*vectorSize, 0);
-          block1[k].packet[1] = rhs2.template loadPacket<Packet2d>(i + k*vectorSize, 1);
-          block2[k].packet[0] = rhs2.template loadPacket<Packet2d>(i + k*vectorSize, 2);
-          block2[k].packet[1] = rhs2.template loadPacket<Packet2d>(i + k*vectorSize, 3);
+        if (StorageOrder == ColMajor) {
+          block1[k].packet[0] = rhs2.template loadPacket<Packet2d>(i + k * vectorSize, 0);
+          block1[k].packet[1] = rhs2.template loadPacket<Packet2d>(i + k * vectorSize, 1);
+          block2[k].packet[0] = rhs2.template loadPacket<Packet2d>(i + k * vectorSize, 2);
+          block2[k].packet[1] = rhs2.template loadPacket<Packet2d>(i + k * vectorSize, 3);
         } else {
-          block3[k].packet[0] = rhs2.template loadPacket<Packet2d>(i + k*vectorSize + 0, 0); //[a1 a2]
-          block3[k].packet[1] = rhs2.template loadPacket<Packet2d>(i + k*vectorSize + 0, 2); //[a3 a4]
-          block3[k].packet[2] = rhs2.template loadPacket<Packet2d>(i + k*vectorSize + 1, 0); //[b1 b2]
-          block3[k].packet[3] = rhs2.template loadPacket<Packet2d>(i + k*vectorSize + 1, 2); //[b3 b4]
+          block3[k].packet[0] = rhs2.template loadPacket<Packet2d>(i + k * vectorSize + 0, 0);  //[a1 a2]
+          block3[k].packet[1] = rhs2.template loadPacket<Packet2d>(i + k * vectorSize + 0, 2);  //[a3 a4]
+          block3[k].packet[2] = rhs2.template loadPacket<Packet2d>(i + k * vectorSize + 1, 0);  //[b1 b2]
+          block3[k].packet[3] = rhs2.template loadPacket<Packet2d>(i + k * vectorSize + 1, 2);  //[b3 b4]
         }
       }
 
-      if(StorageOrder == ColMajor)
-      {
+      if (StorageOrder == ColMajor) {
         for (Index k = 0; k < n; k++) {
           ptranspose(block1[k]);
           ptranspose(block2[k]);
@@ -864,48 +764,44 @@
       }
 
       for (Index k = 0; k < n; k++) {
-        if(StorageOrder == ColMajor)
-        {
-          pstore<double>(blockB + ri + k*4*vectorSize    , block1[k].packet[0]);
-          pstore<double>(blockB + ri + k*4*vectorSize + 2, block2[k].packet[0]);
-          pstore<double>(blockB + ri + k*4*vectorSize + 4, block1[k].packet[1]);
-          pstore<double>(blockB + ri + k*4*vectorSize + 6, block2[k].packet[1]);
+        if (StorageOrder == ColMajor) {
+          pstore<double>(blockB + ri + k * 4 * vectorSize, block1[k].packet[0]);
+          pstore<double>(blockB + ri + k * 4 * vectorSize + 2, block2[k].packet[0]);
+          pstore<double>(blockB + ri + k * 4 * vectorSize + 4, block1[k].packet[1]);
+          pstore<double>(blockB + ri + k * 4 * vectorSize + 6, block2[k].packet[1]);
         } else {
-          storeBlock<double, Packet2d, 4>(blockB + ri + k*4*vectorSize, block3[k]);
+          storeBlock<double, Packet2d, 4>(blockB + ri + k * 4 * vectorSize, block3[k]);
         }
       }
 
-      ri += n*4*vectorSize;
+      ri += n * 4 * vectorSize;
     }
   }
 
-  EIGEN_STRONG_INLINE void operator()(double* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride, Index offset)
-  {
+  EIGEN_STRONG_INLINE void operator()(double* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride,
+                                      Index offset) {
     const Index vectorSize = quad_traits<double>::vectorsize;
     Index ri = 0, j = 0;
 
-    for(; j + 2*vectorSize <= cols; j+=2*vectorSize)
-    {
+    for (; j + 2 * vectorSize <= cols; j += 2 * vectorSize) {
       const DataMapper rhs2 = rhs.getSubMapper(0, j);
       Index i = 0;
 
-      if(PanelMode) ri += offset*(2*vectorSize);
+      if (PanelMode) ri += offset * (2 * vectorSize);
 
       dhs_copy<4>(blockB, rhs2, i, ri, depth, vectorSize);
       dhs_copy<2>(blockB, rhs2, i, ri, depth, vectorSize);
       dhs_copy<1>(blockB, rhs2, i, ri, depth, vectorSize);
 
-      for(; i < depth; i++)
-      {
-        if(StorageOrder == ColMajor)
-        {
-          blockB[ri+0] = rhs2(i, 0);
-          blockB[ri+1] = rhs2(i, 1);
+      for (; i < depth; i++) {
+        if (StorageOrder == ColMajor) {
+          blockB[ri + 0] = rhs2(i, 0);
+          blockB[ri + 1] = rhs2(i, 1);
 
           ri += vectorSize;
 
-          blockB[ri+0] = rhs2(i, 2);
-          blockB[ri+1] = rhs2(i, 3);
+          blockB[ri + 0] = rhs2(i, 2);
+          blockB[ri + 1] = rhs2(i, 3);
         } else {
           Packet2d rhsV = rhs2.template loadPacket<Packet2d>(i, 0);
           pstore<double>(blockB + ri, rhsV);
@@ -918,46 +814,40 @@
         ri += vectorSize;
       }
 
-      if(PanelMode) ri += (2*vectorSize)*(stride - offset - depth);
+      if (PanelMode) ri += (2 * vectorSize) * (stride - offset - depth);
     }
 
-    if(PanelMode) ri += offset;
+    if (PanelMode) ri += offset;
 
-    for(; j < cols; j++)
-    {
+    for (; j < cols; j++) {
       const DataMapper rhs2 = rhs.getSubMapper(0, j);
-      for(Index i = 0; i < depth; i++)
-      {
+      for (Index i = 0; i < depth; i++) {
         blockB[ri] = rhs2(i, 0);
         ri += 1;
       }
 
-      if(PanelMode) ri += stride - depth;
+      if (PanelMode) ri += stride - depth;
     }
   }
 };
 
 // General template for lhs packing, bfloat16 specialization.
-template<typename DataMapper, int StorageOrder, bool PanelMode>
-struct dhs_pack<bfloat16, DataMapper, Packet8bf, StorageOrder, PanelMode, true>
-{
-  EIGEN_STRONG_INLINE void operator()(bfloat16* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride, Index offset)
-  {
+template <typename DataMapper, int StorageOrder, bool PanelMode>
+struct dhs_pack<bfloat16, DataMapper, Packet8bf, StorageOrder, PanelMode, true> {
+  EIGEN_STRONG_INLINE void operator()(bfloat16* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride,
+                                      Index offset) {
     const Index vectorSize = quad_traits<bfloat16>::vectorsize;
     Index ri = 0, j = 0;
 
-    for(; j + 2*vectorSize <= rows; j+=2*vectorSize)
-    {
+    for (; j + 2 * vectorSize <= rows; j += 2 * vectorSize) {
       const DataMapper lhs2 = lhs.getSubMapper(j, 0);
       Index i = 0;
 
-      if(PanelMode) ri += 2*vectorSize*offset;
+      if (PanelMode) ri += 2 * vectorSize * offset;
 
-      if(StorageOrder == ColMajor)
-      {
-        for(; i + 2 <= depth; i+=2)
-        {
-          PacketBlock<Packet8bf,4> block;
+      if (StorageOrder == ColMajor) {
+        for (; i + 2 <= depth; i += 2) {
+          PacketBlock<Packet8bf, 4> block;
 
           block.packet[0] = lhs2.template loadPacket<Packet8bf>(0 * vectorSize, i + 0);
           block.packet[1] = lhs2.template loadPacket<Packet8bf>(1 * vectorSize, i + 0);
@@ -965,8 +855,8 @@
           block.packet[3] = lhs2.template loadPacket<Packet8bf>(1 * vectorSize, i + 1);
 
           Packet8bf t0, t1;
-          t0              = vec_mergeh(block.packet[0].m_val, block.packet[2].m_val);
-          t1              = vec_mergel(block.packet[0].m_val, block.packet[2].m_val);
+          t0 = vec_mergeh(block.packet[0].m_val, block.packet[2].m_val);
+          t1 = vec_mergel(block.packet[0].m_val, block.packet[2].m_val);
           block.packet[2] = vec_mergeh(block.packet[1].m_val, block.packet[3].m_val);
           block.packet[3] = vec_mergel(block.packet[1].m_val, block.packet[3].m_val);
           block.packet[0] = t0;
@@ -974,200 +864,237 @@
 
           storeBlock<bfloat16, Packet8bf, 4>(blockA + ri, block);
 
-          ri += 2*2*vectorSize;
+          ri += 2 * 2 * vectorSize;
         }
-        if (depth & 1)
-        {
-          PacketBlock<Packet8bf,2> block;
+        if (depth & 1) {
+          PacketBlock<Packet8bf, 2> block;
 
           block.packet[0] = lhs2.template loadPacket<Packet8bf>(0 * vectorSize, i + 0);
           block.packet[1] = lhs2.template loadPacket<Packet8bf>(1 * vectorSize, i + 0);
 
           storeBlock<bfloat16, Packet8bf, 2>(blockA + ri, block);
 
-          ri += 2*vectorSize;
+          ri += 2 * vectorSize;
         }
       } else {
-        for(; i + vectorSize <= depth; i+=vectorSize)
-        {
-          PacketBlock<Packet8bf,8> block1, block2;
+        for (; i + vectorSize <= depth; i += vectorSize) {
+          PacketBlock<Packet8bf, 8> block1, block2;
 
           bload<DataMapper, Packet8bf, 8, StorageOrder, false, 8>(block1, lhs2, 0 * vectorSize, i);
           bload<DataMapper, Packet8bf, 8, StorageOrder, false, 8>(block2, lhs2, 1 * vectorSize, i);
 
           Packet4ui v1[8], v2[8];
 
-          v1[0] = vec_mergeh(reinterpret_cast<Packet4ui>(block1.packet[0].m_val), reinterpret_cast<Packet4ui>(block1.packet[1].m_val));
-          v1[1] = vec_mergel(reinterpret_cast<Packet4ui>(block1.packet[0].m_val), reinterpret_cast<Packet4ui>(block1.packet[1].m_val));
-          v1[2] = vec_mergeh(reinterpret_cast<Packet4ui>(block1.packet[2].m_val), reinterpret_cast<Packet4ui>(block1.packet[3].m_val));
-          v1[3] = vec_mergel(reinterpret_cast<Packet4ui>(block1.packet[2].m_val), reinterpret_cast<Packet4ui>(block1.packet[3].m_val));
-          v1[4] = vec_mergeh(reinterpret_cast<Packet4ui>(block1.packet[4].m_val), reinterpret_cast<Packet4ui>(block1.packet[5].m_val));
-          v1[5] = vec_mergel(reinterpret_cast<Packet4ui>(block1.packet[4].m_val), reinterpret_cast<Packet4ui>(block1.packet[5].m_val));
-          v1[6] = vec_mergeh(reinterpret_cast<Packet4ui>(block1.packet[6].m_val), reinterpret_cast<Packet4ui>(block1.packet[7].m_val));
-          v1[7] = vec_mergel(reinterpret_cast<Packet4ui>(block1.packet[6].m_val), reinterpret_cast<Packet4ui>(block1.packet[7].m_val));
-          v2[0] = vec_mergeh(reinterpret_cast<Packet4ui>(block2.packet[0].m_val), reinterpret_cast<Packet4ui>(block2.packet[1].m_val));
-          v2[1] = vec_mergel(reinterpret_cast<Packet4ui>(block2.packet[0].m_val), reinterpret_cast<Packet4ui>(block2.packet[1].m_val));
-          v2[2] = vec_mergeh(reinterpret_cast<Packet4ui>(block2.packet[2].m_val), reinterpret_cast<Packet4ui>(block2.packet[3].m_val));
-          v2[3] = vec_mergel(reinterpret_cast<Packet4ui>(block2.packet[2].m_val), reinterpret_cast<Packet4ui>(block2.packet[3].m_val));
-          v2[4] = vec_mergeh(reinterpret_cast<Packet4ui>(block2.packet[4].m_val), reinterpret_cast<Packet4ui>(block2.packet[5].m_val));
-          v2[5] = vec_mergel(reinterpret_cast<Packet4ui>(block2.packet[4].m_val), reinterpret_cast<Packet4ui>(block2.packet[5].m_val));
-          v2[6] = vec_mergeh(reinterpret_cast<Packet4ui>(block2.packet[6].m_val), reinterpret_cast<Packet4ui>(block2.packet[7].m_val));
-          v2[7] = vec_mergel(reinterpret_cast<Packet4ui>(block2.packet[6].m_val), reinterpret_cast<Packet4ui>(block2.packet[7].m_val));
+          v1[0] = vec_mergeh(reinterpret_cast<Packet4ui>(block1.packet[0].m_val),
+                             reinterpret_cast<Packet4ui>(block1.packet[1].m_val));
+          v1[1] = vec_mergel(reinterpret_cast<Packet4ui>(block1.packet[0].m_val),
+                             reinterpret_cast<Packet4ui>(block1.packet[1].m_val));
+          v1[2] = vec_mergeh(reinterpret_cast<Packet4ui>(block1.packet[2].m_val),
+                             reinterpret_cast<Packet4ui>(block1.packet[3].m_val));
+          v1[3] = vec_mergel(reinterpret_cast<Packet4ui>(block1.packet[2].m_val),
+                             reinterpret_cast<Packet4ui>(block1.packet[3].m_val));
+          v1[4] = vec_mergeh(reinterpret_cast<Packet4ui>(block1.packet[4].m_val),
+                             reinterpret_cast<Packet4ui>(block1.packet[5].m_val));
+          v1[5] = vec_mergel(reinterpret_cast<Packet4ui>(block1.packet[4].m_val),
+                             reinterpret_cast<Packet4ui>(block1.packet[5].m_val));
+          v1[6] = vec_mergeh(reinterpret_cast<Packet4ui>(block1.packet[6].m_val),
+                             reinterpret_cast<Packet4ui>(block1.packet[7].m_val));
+          v1[7] = vec_mergel(reinterpret_cast<Packet4ui>(block1.packet[6].m_val),
+                             reinterpret_cast<Packet4ui>(block1.packet[7].m_val));
+          v2[0] = vec_mergeh(reinterpret_cast<Packet4ui>(block2.packet[0].m_val),
+                             reinterpret_cast<Packet4ui>(block2.packet[1].m_val));
+          v2[1] = vec_mergel(reinterpret_cast<Packet4ui>(block2.packet[0].m_val),
+                             reinterpret_cast<Packet4ui>(block2.packet[1].m_val));
+          v2[2] = vec_mergeh(reinterpret_cast<Packet4ui>(block2.packet[2].m_val),
+                             reinterpret_cast<Packet4ui>(block2.packet[3].m_val));
+          v2[3] = vec_mergel(reinterpret_cast<Packet4ui>(block2.packet[2].m_val),
+                             reinterpret_cast<Packet4ui>(block2.packet[3].m_val));
+          v2[4] = vec_mergeh(reinterpret_cast<Packet4ui>(block2.packet[4].m_val),
+                             reinterpret_cast<Packet4ui>(block2.packet[5].m_val));
+          v2[5] = vec_mergel(reinterpret_cast<Packet4ui>(block2.packet[4].m_val),
+                             reinterpret_cast<Packet4ui>(block2.packet[5].m_val));
+          v2[6] = vec_mergeh(reinterpret_cast<Packet4ui>(block2.packet[6].m_val),
+                             reinterpret_cast<Packet4ui>(block2.packet[7].m_val));
+          v2[7] = vec_mergel(reinterpret_cast<Packet4ui>(block2.packet[6].m_val),
+                             reinterpret_cast<Packet4ui>(block2.packet[7].m_val));
 
 #ifdef EIGEN_VECTORIZE_VSX
-          block1.packet[0] = reinterpret_cast<Packet8us>(vec_mergeh(reinterpret_cast<Packet2ul>(v1[0]),reinterpret_cast<Packet2ul>(v1[2])));
-          block1.packet[2] = reinterpret_cast<Packet8us>(vec_mergel(reinterpret_cast<Packet2ul>(v1[0]),reinterpret_cast<Packet2ul>(v1[2])));
-          block1.packet[4] = reinterpret_cast<Packet8us>(vec_mergeh(reinterpret_cast<Packet2ul>(v1[1]),reinterpret_cast<Packet2ul>(v1[3])));
-          block1.packet[6] = reinterpret_cast<Packet8us>(vec_mergel(reinterpret_cast<Packet2ul>(v1[1]),reinterpret_cast<Packet2ul>(v1[3])));
-          block1.packet[1] = reinterpret_cast<Packet8us>(vec_mergeh(reinterpret_cast<Packet2ul>(v1[4]),reinterpret_cast<Packet2ul>(v1[6])));
-          block1.packet[3] = reinterpret_cast<Packet8us>(vec_mergel(reinterpret_cast<Packet2ul>(v1[4]),reinterpret_cast<Packet2ul>(v1[6])));
-          block1.packet[5] = reinterpret_cast<Packet8us>(vec_mergeh(reinterpret_cast<Packet2ul>(v1[5]),reinterpret_cast<Packet2ul>(v1[7])));
-          block1.packet[7] = reinterpret_cast<Packet8us>(vec_mergel(reinterpret_cast<Packet2ul>(v1[5]),reinterpret_cast<Packet2ul>(v1[7])));
-          block2.packet[0] = reinterpret_cast<Packet8us>(vec_mergeh(reinterpret_cast<Packet2ul>(v2[0]),reinterpret_cast<Packet2ul>(v2[2])));
-          block2.packet[2] = reinterpret_cast<Packet8us>(vec_mergel(reinterpret_cast<Packet2ul>(v2[0]),reinterpret_cast<Packet2ul>(v2[2])));
-          block2.packet[4] = reinterpret_cast<Packet8us>(vec_mergeh(reinterpret_cast<Packet2ul>(v2[1]),reinterpret_cast<Packet2ul>(v2[3])));
-          block2.packet[6] = reinterpret_cast<Packet8us>(vec_mergel(reinterpret_cast<Packet2ul>(v2[1]),reinterpret_cast<Packet2ul>(v2[3])));
-          block2.packet[1] = reinterpret_cast<Packet8us>(vec_mergeh(reinterpret_cast<Packet2ul>(v2[4]),reinterpret_cast<Packet2ul>(v2[6])));
-          block2.packet[3] = reinterpret_cast<Packet8us>(vec_mergel(reinterpret_cast<Packet2ul>(v2[4]),reinterpret_cast<Packet2ul>(v2[6])));
-          block2.packet[5] = reinterpret_cast<Packet8us>(vec_mergeh(reinterpret_cast<Packet2ul>(v2[5]),reinterpret_cast<Packet2ul>(v2[7])));
-          block2.packet[7] = reinterpret_cast<Packet8us>(vec_mergel(reinterpret_cast<Packet2ul>(v2[5]),reinterpret_cast<Packet2ul>(v2[7])));
+          block1.packet[0] = reinterpret_cast<Packet8us>(
+              vec_mergeh(reinterpret_cast<Packet2ul>(v1[0]), reinterpret_cast<Packet2ul>(v1[2])));
+          block1.packet[2] = reinterpret_cast<Packet8us>(
+              vec_mergel(reinterpret_cast<Packet2ul>(v1[0]), reinterpret_cast<Packet2ul>(v1[2])));
+          block1.packet[4] = reinterpret_cast<Packet8us>(
+              vec_mergeh(reinterpret_cast<Packet2ul>(v1[1]), reinterpret_cast<Packet2ul>(v1[3])));
+          block1.packet[6] = reinterpret_cast<Packet8us>(
+              vec_mergel(reinterpret_cast<Packet2ul>(v1[1]), reinterpret_cast<Packet2ul>(v1[3])));
+          block1.packet[1] = reinterpret_cast<Packet8us>(
+              vec_mergeh(reinterpret_cast<Packet2ul>(v1[4]), reinterpret_cast<Packet2ul>(v1[6])));
+          block1.packet[3] = reinterpret_cast<Packet8us>(
+              vec_mergel(reinterpret_cast<Packet2ul>(v1[4]), reinterpret_cast<Packet2ul>(v1[6])));
+          block1.packet[5] = reinterpret_cast<Packet8us>(
+              vec_mergeh(reinterpret_cast<Packet2ul>(v1[5]), reinterpret_cast<Packet2ul>(v1[7])));
+          block1.packet[7] = reinterpret_cast<Packet8us>(
+              vec_mergel(reinterpret_cast<Packet2ul>(v1[5]), reinterpret_cast<Packet2ul>(v1[7])));
+          block2.packet[0] = reinterpret_cast<Packet8us>(
+              vec_mergeh(reinterpret_cast<Packet2ul>(v2[0]), reinterpret_cast<Packet2ul>(v2[2])));
+          block2.packet[2] = reinterpret_cast<Packet8us>(
+              vec_mergel(reinterpret_cast<Packet2ul>(v2[0]), reinterpret_cast<Packet2ul>(v2[2])));
+          block2.packet[4] = reinterpret_cast<Packet8us>(
+              vec_mergeh(reinterpret_cast<Packet2ul>(v2[1]), reinterpret_cast<Packet2ul>(v2[3])));
+          block2.packet[6] = reinterpret_cast<Packet8us>(
+              vec_mergel(reinterpret_cast<Packet2ul>(v2[1]), reinterpret_cast<Packet2ul>(v2[3])));
+          block2.packet[1] = reinterpret_cast<Packet8us>(
+              vec_mergeh(reinterpret_cast<Packet2ul>(v2[4]), reinterpret_cast<Packet2ul>(v2[6])));
+          block2.packet[3] = reinterpret_cast<Packet8us>(
+              vec_mergel(reinterpret_cast<Packet2ul>(v2[4]), reinterpret_cast<Packet2ul>(v2[6])));
+          block2.packet[5] = reinterpret_cast<Packet8us>(
+              vec_mergeh(reinterpret_cast<Packet2ul>(v2[5]), reinterpret_cast<Packet2ul>(v2[7])));
+          block2.packet[7] = reinterpret_cast<Packet8us>(
+              vec_mergel(reinterpret_cast<Packet2ul>(v2[5]), reinterpret_cast<Packet2ul>(v2[7])));
 #else
-          block1.packet[0] = reinterpret_cast<Packet8us>(vec_perm(v1[0],v1[2],p16uc_TRANSPOSE64_HI));
-          block1.packet[2] = reinterpret_cast<Packet8us>(vec_perm(v1[0],v1[2],p16uc_TRANSPOSE64_LO));
-          block1.packet[4] = reinterpret_cast<Packet8us>(vec_perm(v1[1],v1[3],p16uc_TRANSPOSE64_HI));
-          block1.packet[6] = reinterpret_cast<Packet8us>(vec_perm(v1[1],v1[3],p16uc_TRANSPOSE64_LO));
-          block1.packet[1] = reinterpret_cast<Packet8us>(vec_perm(v1[4],v1[6],p16uc_TRANSPOSE64_HI));
-          block1.packet[3] = reinterpret_cast<Packet8us>(vec_perm(v1[4],v1[6],p16uc_TRANSPOSE64_LO));
-          block1.packet[5] = reinterpret_cast<Packet8us>(vec_perm(v1[5],v1[7],p16uc_TRANSPOSE64_HI));
-          block1.packet[7] = reinterpret_cast<Packet8us>(vec_perm(v1[5],v1[7],p16uc_TRANSPOSE64_LO));
-          block2.packet[0] = reinterpret_cast<Packet8us>(vec_perm(v2[0],v2[2],p16uc_TRANSPOSE64_HI));
-          block2.packet[2] = reinterpret_cast<Packet8us>(vec_perm(v2[0],v2[2],p16uc_TRANSPOSE64_LO));
-          block2.packet[4] = reinterpret_cast<Packet8us>(vec_perm(v2[1],v2[3],p16uc_TRANSPOSE64_HI));
-          block2.packet[6] = reinterpret_cast<Packet8us>(vec_perm(v2[1],v2[3],p16uc_TRANSPOSE64_LO));
-          block2.packet[1] = reinterpret_cast<Packet8us>(vec_perm(v2[4],v2[6],p16uc_TRANSPOSE64_HI));
-          block2.packet[3] = reinterpret_cast<Packet8us>(vec_perm(v2[4],v2[6],p16uc_TRANSPOSE64_LO));
-          block2.packet[5] = reinterpret_cast<Packet8us>(vec_perm(v2[5],v2[7],p16uc_TRANSPOSE64_HI));
-          block2.packet[7] = reinterpret_cast<Packet8us>(vec_perm(v2[5],v2[7],p16uc_TRANSPOSE64_LO));
+          block1.packet[0] = reinterpret_cast<Packet8us>(vec_perm(v1[0], v1[2], p16uc_TRANSPOSE64_HI));
+          block1.packet[2] = reinterpret_cast<Packet8us>(vec_perm(v1[0], v1[2], p16uc_TRANSPOSE64_LO));
+          block1.packet[4] = reinterpret_cast<Packet8us>(vec_perm(v1[1], v1[3], p16uc_TRANSPOSE64_HI));
+          block1.packet[6] = reinterpret_cast<Packet8us>(vec_perm(v1[1], v1[3], p16uc_TRANSPOSE64_LO));
+          block1.packet[1] = reinterpret_cast<Packet8us>(vec_perm(v1[4], v1[6], p16uc_TRANSPOSE64_HI));
+          block1.packet[3] = reinterpret_cast<Packet8us>(vec_perm(v1[4], v1[6], p16uc_TRANSPOSE64_LO));
+          block1.packet[5] = reinterpret_cast<Packet8us>(vec_perm(v1[5], v1[7], p16uc_TRANSPOSE64_HI));
+          block1.packet[7] = reinterpret_cast<Packet8us>(vec_perm(v1[5], v1[7], p16uc_TRANSPOSE64_LO));
+          block2.packet[0] = reinterpret_cast<Packet8us>(vec_perm(v2[0], v2[2], p16uc_TRANSPOSE64_HI));
+          block2.packet[2] = reinterpret_cast<Packet8us>(vec_perm(v2[0], v2[2], p16uc_TRANSPOSE64_LO));
+          block2.packet[4] = reinterpret_cast<Packet8us>(vec_perm(v2[1], v2[3], p16uc_TRANSPOSE64_HI));
+          block2.packet[6] = reinterpret_cast<Packet8us>(vec_perm(v2[1], v2[3], p16uc_TRANSPOSE64_LO));
+          block2.packet[1] = reinterpret_cast<Packet8us>(vec_perm(v2[4], v2[6], p16uc_TRANSPOSE64_HI));
+          block2.packet[3] = reinterpret_cast<Packet8us>(vec_perm(v2[4], v2[6], p16uc_TRANSPOSE64_LO));
+          block2.packet[5] = reinterpret_cast<Packet8us>(vec_perm(v2[5], v2[7], p16uc_TRANSPOSE64_HI));
+          block2.packet[7] = reinterpret_cast<Packet8us>(vec_perm(v2[5], v2[7], p16uc_TRANSPOSE64_LO));
 #endif
 
-          for(Index M = 0; M < 8; M+=2) {
-            pstore<bfloat16>(blockA + ri + (0 * vectorSize) + (2*vectorSize * M), block1.packet[M+0]);
-            pstore<bfloat16>(blockA + ri + (1 * vectorSize) + (2*vectorSize * M), block1.packet[M+1]);
-            pstore<bfloat16>(blockA + ri + (2 * vectorSize) + (2*vectorSize * M), block2.packet[M+0]);
-            pstore<bfloat16>(blockA + ri + (3 * vectorSize) + (2*vectorSize * M), block2.packet[M+1]);
+          for (Index M = 0; M < 8; M += 2) {
+            pstore<bfloat16>(blockA + ri + (0 * vectorSize) + (2 * vectorSize * M), block1.packet[M + 0]);
+            pstore<bfloat16>(blockA + ri + (1 * vectorSize) + (2 * vectorSize * M), block1.packet[M + 1]);
+            pstore<bfloat16>(blockA + ri + (2 * vectorSize) + (2 * vectorSize * M), block2.packet[M + 0]);
+            pstore<bfloat16>(blockA + ri + (3 * vectorSize) + (2 * vectorSize * M), block2.packet[M + 1]);
           }
 
-          ri += 2*vectorSize*vectorSize;
+          ri += 2 * vectorSize * vectorSize;
         }
-        for(; i + 2 <= depth; i+=2)
-        {
-          for(Index M = 0; M < 2*vectorSize; M++) {
+        for (; i + 2 <= depth; i += 2) {
+          for (Index M = 0; M < 2 * vectorSize; M++) {
             blockA[ri + (M * 2) + 0] = lhs2(M, i + 0);
             blockA[ri + (M * 2) + 1] = lhs2(M, i + 1);
           }
 
-          ri += 2*2*vectorSize;
+          ri += 2 * 2 * vectorSize;
         }
-        if (depth & 1)
-        {
-          for(Index M = 0; M < 2*vectorSize; M++) {
+        if (depth & 1) {
+          for (Index M = 0; M < 2 * vectorSize; M++) {
             blockA[ri + M] = lhs2(M, i);
           }
-          ri += 2*vectorSize;
+          ri += 2 * vectorSize;
         }
       }
 
-      if(PanelMode) ri += 2*vectorSize*(stride - offset - depth);
+      if (PanelMode) ri += 2 * vectorSize * (stride - offset - depth);
     }
-    for(; j + vectorSize <= rows; j+=vectorSize)
-    {
+    for (; j + vectorSize <= rows; j += vectorSize) {
       const DataMapper lhs2 = lhs.getSubMapper(j, 0);
       Index i = 0;
 
-      if(PanelMode) ri += vectorSize*offset;
+      if (PanelMode) ri += vectorSize * offset;
 
-      if(StorageOrder == ColMajor)
-      {
-        for(; i + 2 <= depth; i+=2)
-        {
-          PacketBlock<Packet8bf,2> block;
+      if (StorageOrder == ColMajor) {
+        for (; i + 2 <= depth; i += 2) {
+          PacketBlock<Packet8bf, 2> block;
 
           block.packet[0] = lhs2.template loadPacket<Packet8bf>(0 * vectorSize, i + 0);
           block.packet[1] = lhs2.template loadPacket<Packet8bf>(0 * vectorSize, i + 1);
 
           Packet8bf t0;
-          t0              = vec_mergeh(block.packet[0].m_val, block.packet[1].m_val);
+          t0 = vec_mergeh(block.packet[0].m_val, block.packet[1].m_val);
           block.packet[1] = vec_mergel(block.packet[0].m_val, block.packet[1].m_val);
           block.packet[0] = t0;
 
           storeBlock<bfloat16, Packet8bf, 2>(blockA + ri, block);
 
-          ri += 2*vectorSize;
+          ri += 2 * vectorSize;
         }
-        if (depth & 1)
-        {
+        if (depth & 1) {
           Packet8bf lhsV = lhs2.template loadPacket<Packet8bf>(0 * vectorSize, i + 0);
           pstore<bfloat16>(blockA + ri, lhsV);
 
           ri += vectorSize;
         }
       } else {
-        for(; i + vectorSize <= depth; i+=vectorSize)
-        {
-          PacketBlock<Packet8bf,8> block1;
+        for (; i + vectorSize <= depth; i += vectorSize) {
+          PacketBlock<Packet8bf, 8> block1;
 
           bload<DataMapper, Packet8bf, 8, StorageOrder, false, 8>(block1, lhs2, 0 * vectorSize, i);
 
           Packet4ui v1[8];
 
           // This is transposing and interleaving data
-          v1[0] = vec_mergeh(reinterpret_cast<Packet4ui>(block1.packet[0].m_val), reinterpret_cast<Packet4ui>(block1.packet[1].m_val));
-          v1[1] = vec_mergel(reinterpret_cast<Packet4ui>(block1.packet[0].m_val), reinterpret_cast<Packet4ui>(block1.packet[1].m_val));
-          v1[2] = vec_mergeh(reinterpret_cast<Packet4ui>(block1.packet[2].m_val), reinterpret_cast<Packet4ui>(block1.packet[3].m_val));
-          v1[3] = vec_mergel(reinterpret_cast<Packet4ui>(block1.packet[2].m_val), reinterpret_cast<Packet4ui>(block1.packet[3].m_val));
-          v1[4] = vec_mergeh(reinterpret_cast<Packet4ui>(block1.packet[4].m_val), reinterpret_cast<Packet4ui>(block1.packet[5].m_val));
-          v1[5] = vec_mergel(reinterpret_cast<Packet4ui>(block1.packet[4].m_val), reinterpret_cast<Packet4ui>(block1.packet[5].m_val));
-          v1[6] = vec_mergeh(reinterpret_cast<Packet4ui>(block1.packet[6].m_val), reinterpret_cast<Packet4ui>(block1.packet[7].m_val));
-          v1[7] = vec_mergel(reinterpret_cast<Packet4ui>(block1.packet[6].m_val), reinterpret_cast<Packet4ui>(block1.packet[7].m_val));
+          v1[0] = vec_mergeh(reinterpret_cast<Packet4ui>(block1.packet[0].m_val),
+                             reinterpret_cast<Packet4ui>(block1.packet[1].m_val));
+          v1[1] = vec_mergel(reinterpret_cast<Packet4ui>(block1.packet[0].m_val),
+                             reinterpret_cast<Packet4ui>(block1.packet[1].m_val));
+          v1[2] = vec_mergeh(reinterpret_cast<Packet4ui>(block1.packet[2].m_val),
+                             reinterpret_cast<Packet4ui>(block1.packet[3].m_val));
+          v1[3] = vec_mergel(reinterpret_cast<Packet4ui>(block1.packet[2].m_val),
+                             reinterpret_cast<Packet4ui>(block1.packet[3].m_val));
+          v1[4] = vec_mergeh(reinterpret_cast<Packet4ui>(block1.packet[4].m_val),
+                             reinterpret_cast<Packet4ui>(block1.packet[5].m_val));
+          v1[5] = vec_mergel(reinterpret_cast<Packet4ui>(block1.packet[4].m_val),
+                             reinterpret_cast<Packet4ui>(block1.packet[5].m_val));
+          v1[6] = vec_mergeh(reinterpret_cast<Packet4ui>(block1.packet[6].m_val),
+                             reinterpret_cast<Packet4ui>(block1.packet[7].m_val));
+          v1[7] = vec_mergel(reinterpret_cast<Packet4ui>(block1.packet[6].m_val),
+                             reinterpret_cast<Packet4ui>(block1.packet[7].m_val));
 
 #ifdef EIGEN_VECTORIZE_VSX
-          block1.packet[0] = reinterpret_cast<Packet8us>(vec_mergeh(reinterpret_cast<Packet2ul>(v1[0]),reinterpret_cast<Packet2ul>(v1[2])));
-          block1.packet[2] = reinterpret_cast<Packet8us>(vec_mergel(reinterpret_cast<Packet2ul>(v1[0]),reinterpret_cast<Packet2ul>(v1[2])));
-          block1.packet[4] = reinterpret_cast<Packet8us>(vec_mergeh(reinterpret_cast<Packet2ul>(v1[1]),reinterpret_cast<Packet2ul>(v1[3])));
-          block1.packet[6] = reinterpret_cast<Packet8us>(vec_mergel(reinterpret_cast<Packet2ul>(v1[1]),reinterpret_cast<Packet2ul>(v1[3])));
-          block1.packet[1] = reinterpret_cast<Packet8us>(vec_mergeh(reinterpret_cast<Packet2ul>(v1[4]),reinterpret_cast<Packet2ul>(v1[6])));
-          block1.packet[3] = reinterpret_cast<Packet8us>(vec_mergel(reinterpret_cast<Packet2ul>(v1[4]),reinterpret_cast<Packet2ul>(v1[6])));
-          block1.packet[5] = reinterpret_cast<Packet8us>(vec_mergeh(reinterpret_cast<Packet2ul>(v1[5]),reinterpret_cast<Packet2ul>(v1[7])));
-          block1.packet[7] = reinterpret_cast<Packet8us>(vec_mergel(reinterpret_cast<Packet2ul>(v1[5]),reinterpret_cast<Packet2ul>(v1[7])));
+          block1.packet[0] = reinterpret_cast<Packet8us>(
+              vec_mergeh(reinterpret_cast<Packet2ul>(v1[0]), reinterpret_cast<Packet2ul>(v1[2])));
+          block1.packet[2] = reinterpret_cast<Packet8us>(
+              vec_mergel(reinterpret_cast<Packet2ul>(v1[0]), reinterpret_cast<Packet2ul>(v1[2])));
+          block1.packet[4] = reinterpret_cast<Packet8us>(
+              vec_mergeh(reinterpret_cast<Packet2ul>(v1[1]), reinterpret_cast<Packet2ul>(v1[3])));
+          block1.packet[6] = reinterpret_cast<Packet8us>(
+              vec_mergel(reinterpret_cast<Packet2ul>(v1[1]), reinterpret_cast<Packet2ul>(v1[3])));
+          block1.packet[1] = reinterpret_cast<Packet8us>(
+              vec_mergeh(reinterpret_cast<Packet2ul>(v1[4]), reinterpret_cast<Packet2ul>(v1[6])));
+          block1.packet[3] = reinterpret_cast<Packet8us>(
+              vec_mergel(reinterpret_cast<Packet2ul>(v1[4]), reinterpret_cast<Packet2ul>(v1[6])));
+          block1.packet[5] = reinterpret_cast<Packet8us>(
+              vec_mergeh(reinterpret_cast<Packet2ul>(v1[5]), reinterpret_cast<Packet2ul>(v1[7])));
+          block1.packet[7] = reinterpret_cast<Packet8us>(
+              vec_mergel(reinterpret_cast<Packet2ul>(v1[5]), reinterpret_cast<Packet2ul>(v1[7])));
 #else
-          block1.packet[0] = reinterpret_cast<Packet8us>(vec_perm(v1[0],v1[2],p16uc_TRANSPOSE64_HI));
-          block1.packet[2] = reinterpret_cast<Packet8us>(vec_perm(v1[0],v1[2],p16uc_TRANSPOSE64_LO));
-          block1.packet[4] = reinterpret_cast<Packet8us>(vec_perm(v1[1],v1[3],p16uc_TRANSPOSE64_HI));
-          block1.packet[6] = reinterpret_cast<Packet8us>(vec_perm(v1[1],v1[3],p16uc_TRANSPOSE64_LO));
-          block1.packet[1] = reinterpret_cast<Packet8us>(vec_perm(v1[4],v1[6],p16uc_TRANSPOSE64_HI));
-          block1.packet[3] = reinterpret_cast<Packet8us>(vec_perm(v1[4],v1[6],p16uc_TRANSPOSE64_LO));
-          block1.packet[5] = reinterpret_cast<Packet8us>(vec_perm(v1[5],v1[7],p16uc_TRANSPOSE64_HI));
-          block1.packet[7] = reinterpret_cast<Packet8us>(vec_perm(v1[5],v1[7],p16uc_TRANSPOSE64_LO));
+          block1.packet[0] = reinterpret_cast<Packet8us>(vec_perm(v1[0], v1[2], p16uc_TRANSPOSE64_HI));
+          block1.packet[2] = reinterpret_cast<Packet8us>(vec_perm(v1[0], v1[2], p16uc_TRANSPOSE64_LO));
+          block1.packet[4] = reinterpret_cast<Packet8us>(vec_perm(v1[1], v1[3], p16uc_TRANSPOSE64_HI));
+          block1.packet[6] = reinterpret_cast<Packet8us>(vec_perm(v1[1], v1[3], p16uc_TRANSPOSE64_LO));
+          block1.packet[1] = reinterpret_cast<Packet8us>(vec_perm(v1[4], v1[6], p16uc_TRANSPOSE64_HI));
+          block1.packet[3] = reinterpret_cast<Packet8us>(vec_perm(v1[4], v1[6], p16uc_TRANSPOSE64_LO));
+          block1.packet[5] = reinterpret_cast<Packet8us>(vec_perm(v1[5], v1[7], p16uc_TRANSPOSE64_HI));
+          block1.packet[7] = reinterpret_cast<Packet8us>(vec_perm(v1[5], v1[7], p16uc_TRANSPOSE64_LO));
 #endif
 
-          for(Index M = 0; M < 8; M++) {
+          for (Index M = 0; M < 8; M++) {
             pstore<bfloat16>(blockA + ri + (vectorSize * M), block1.packet[M]);
           }
 
-          ri += vectorSize*vectorSize;
+          ri += vectorSize * vectorSize;
         }
-        for(; i + 2 <= depth; i+=2)
-        {
-          for(Index M = 0; M < vectorSize; M++) {
+        for (; i + 2 <= depth; i += 2) {
+          for (Index M = 0; M < vectorSize; M++) {
             blockA[ri + (M * 2) + 0] = lhs2(M, i + 0);
             blockA[ri + (M * 2) + 1] = lhs2(M, i + 1);
           }
 
-          ri += 2*vectorSize;
+          ri += 2 * vectorSize;
         }
-        if (depth & 1)
-        {
-          for(Index M = 0; M < vectorSize; M++) {
+        if (depth & 1) {
+          for (Index M = 0; M < vectorSize; M++) {
             blockA[ri + M] = lhs2(M, i);
           }
 
@@ -1175,20 +1102,17 @@
         }
       }
 
-      if(PanelMode) ri += vectorSize*(stride - offset - depth);
+      if (PanelMode) ri += vectorSize * (stride - offset - depth);
     }
-    if(j + 4 <= rows)
-    {
+    if (j + 4 <= rows) {
       const DataMapper lhs2 = lhs.getSubMapper(j, 0);
       Index i = 0;
 
-      if(PanelMode) ri += 4*offset;
+      if (PanelMode) ri += 4 * offset;
 
-      for(; i + 2 <= depth; i+=2)
-      {
-        if(StorageOrder == ColMajor)
-        {
-          PacketBlock<Packet8bf,2> block;
+      for (; i + 2 <= depth; i += 2) {
+        if (StorageOrder == ColMajor) {
+          PacketBlock<Packet8bf, 2> block;
 
           block.packet[0] = lhs2.template loadPacketPartial<Packet8bf>(0, i + 0, 4);
           block.packet[1] = lhs2.template loadPacketPartial<Packet8bf>(0, i + 1, 4);
@@ -1197,58 +1121,51 @@
 
           pstore<bfloat16>(blockA + ri, block.packet[0]);
         } else {
-          blockA[ri+0] = lhs2(0, i + 0);
-          blockA[ri+1] = lhs2(0, i + 1);
-          blockA[ri+2] = lhs2(1, i + 0);
-          blockA[ri+3] = lhs2(1, i + 1);
-          blockA[ri+4] = lhs2(2, i + 0);
-          blockA[ri+5] = lhs2(2, i + 1);
-          blockA[ri+6] = lhs2(3, i + 0);
-          blockA[ri+7] = lhs2(3, i + 1);
+          blockA[ri + 0] = lhs2(0, i + 0);
+          blockA[ri + 1] = lhs2(0, i + 1);
+          blockA[ri + 2] = lhs2(1, i + 0);
+          blockA[ri + 3] = lhs2(1, i + 1);
+          blockA[ri + 4] = lhs2(2, i + 0);
+          blockA[ri + 5] = lhs2(2, i + 1);
+          blockA[ri + 6] = lhs2(3, i + 0);
+          blockA[ri + 7] = lhs2(3, i + 1);
         }
 
-        ri += 2*4;
+        ri += 2 * 4;
       }
-      if (depth & 1)
-      {
-        if(StorageOrder == ColMajor)
-        {
+      if (depth & 1) {
+        if (StorageOrder == ColMajor) {
           Packet8bf lhsV = lhs2.template loadPacketPartial<Packet8bf>(0, i + 0, 4);
 
           pstore_partial<bfloat16>(blockA + ri, lhsV, 4);
         } else {
-          blockA[ri+0] = lhs2(0, i);
-          blockA[ri+1] = lhs2(1, i);
-          blockA[ri+2] = lhs2(2, i);
-          blockA[ri+3] = lhs2(3, i);
+          blockA[ri + 0] = lhs2(0, i);
+          blockA[ri + 1] = lhs2(1, i);
+          blockA[ri + 2] = lhs2(2, i);
+          blockA[ri + 3] = lhs2(3, i);
         }
 
         ri += 4;
       }
 
-      if(PanelMode) ri += 4*(stride - offset - depth);
+      if (PanelMode) ri += 4 * (stride - offset - depth);
       j += 4;
     }
 
-    if (j < rows)
-    {
-      if(PanelMode) ri += offset*(rows - j);
+    if (j < rows) {
+      if (PanelMode) ri += offset * (rows - j);
 
       Index i = 0;
-      for(; i + 2 <= depth; i+=2)
-      {
+      for (; i + 2 <= depth; i += 2) {
         Index k = j;
-        for(; k < rows; k++)
-        {
-          blockA[ri+0] = lhs(k, i + 0);
-          blockA[ri+1] = lhs(k, i + 1);
+        for (; k < rows; k++) {
+          blockA[ri + 0] = lhs(k, i + 0);
+          blockA[ri + 1] = lhs(k, i + 1);
           ri += 2;
         }
       }
-      if (depth & 1)
-      {
-        for(; j < rows; j++)
-        {
+      if (depth & 1) {
+        for (; j < rows; j++) {
           blockA[ri] = lhs(j, i);
           ri += 1;
         }
@@ -1258,51 +1175,55 @@
 };
 
 // General template for rhs packing, bfloat16 specialization.
-template<typename DataMapper, int StorageOrder, bool PanelMode>
-struct dhs_pack<bfloat16, DataMapper, Packet8bf, StorageOrder, PanelMode, false>
-{
-  EIGEN_STRONG_INLINE void operator()(bfloat16* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride, Index offset)
-  {
+template <typename DataMapper, int StorageOrder, bool PanelMode>
+struct dhs_pack<bfloat16, DataMapper, Packet8bf, StorageOrder, PanelMode, false> {
+  EIGEN_STRONG_INLINE void operator()(bfloat16* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride,
+                                      Index offset) {
     const Index vectorSize = quad_traits<bfloat16>::vectorsize;
     Index ri = 0, j = 0;
 
-    for(; j + 4 <= cols; j+=4)
-    {
+    for (; j + 4 <= cols; j += 4) {
       const DataMapper rhs2 = rhs.getSubMapper(0, j);
       Index i = 0;
 
-      if(PanelMode) ri += 4*offset;
+      if (PanelMode) ri += 4 * offset;
 
-      for(; i + vectorSize <= depth; i+=vectorSize)
-      {
-        if(StorageOrder == ColMajor)
-        {
-          PacketBlock<Packet8bf,4> block;
+      for (; i + vectorSize <= depth; i += vectorSize) {
+        if (StorageOrder == ColMajor) {
+          PacketBlock<Packet8bf, 4> block;
 
           bload<DataMapper, Packet8bf, 4, StorageOrder, false, 4>(block, rhs2, i, 0);
 
           Packet4ui t0, t1, t2, t3;
 
-          t0 = vec_mergeh(reinterpret_cast<Packet4ui>(block.packet[0].m_val), reinterpret_cast<Packet4ui>(block.packet[1].m_val));
-          t1 = vec_mergel(reinterpret_cast<Packet4ui>(block.packet[0].m_val), reinterpret_cast<Packet4ui>(block.packet[1].m_val));
-          t2 = vec_mergeh(reinterpret_cast<Packet4ui>(block.packet[2].m_val), reinterpret_cast<Packet4ui>(block.packet[3].m_val));
-          t3 = vec_mergel(reinterpret_cast<Packet4ui>(block.packet[2].m_val), reinterpret_cast<Packet4ui>(block.packet[3].m_val));
+          t0 = vec_mergeh(reinterpret_cast<Packet4ui>(block.packet[0].m_val),
+                          reinterpret_cast<Packet4ui>(block.packet[1].m_val));
+          t1 = vec_mergel(reinterpret_cast<Packet4ui>(block.packet[0].m_val),
+                          reinterpret_cast<Packet4ui>(block.packet[1].m_val));
+          t2 = vec_mergeh(reinterpret_cast<Packet4ui>(block.packet[2].m_val),
+                          reinterpret_cast<Packet4ui>(block.packet[3].m_val));
+          t3 = vec_mergel(reinterpret_cast<Packet4ui>(block.packet[2].m_val),
+                          reinterpret_cast<Packet4ui>(block.packet[3].m_val));
 
 #ifdef EIGEN_VECTORIZE_VSX
-          block.packet[0] = reinterpret_cast<Packet8us>(vec_mergeh(reinterpret_cast<Packet2ul>(t0),reinterpret_cast<Packet2ul>(t2)));
-          block.packet[1] = reinterpret_cast<Packet8us>(vec_mergel(reinterpret_cast<Packet2ul>(t0),reinterpret_cast<Packet2ul>(t2)));
-          block.packet[2] = reinterpret_cast<Packet8us>(vec_mergeh(reinterpret_cast<Packet2ul>(t1),reinterpret_cast<Packet2ul>(t3)));
-          block.packet[3] = reinterpret_cast<Packet8us>(vec_mergel(reinterpret_cast<Packet2ul>(t1),reinterpret_cast<Packet2ul>(t3)));
+          block.packet[0] =
+              reinterpret_cast<Packet8us>(vec_mergeh(reinterpret_cast<Packet2ul>(t0), reinterpret_cast<Packet2ul>(t2)));
+          block.packet[1] =
+              reinterpret_cast<Packet8us>(vec_mergel(reinterpret_cast<Packet2ul>(t0), reinterpret_cast<Packet2ul>(t2)));
+          block.packet[2] =
+              reinterpret_cast<Packet8us>(vec_mergeh(reinterpret_cast<Packet2ul>(t1), reinterpret_cast<Packet2ul>(t3)));
+          block.packet[3] =
+              reinterpret_cast<Packet8us>(vec_mergel(reinterpret_cast<Packet2ul>(t1), reinterpret_cast<Packet2ul>(t3)));
 #else
-          block.packet[0] = reinterpret_cast<Packet8us>(vec_perm(t0,t2,p16uc_TRANSPOSE64_HI));
-          block.packet[1] = reinterpret_cast<Packet8us>(vec_perm(t0,t2,p16uc_TRANSPOSE64_LO));
-          block.packet[2] = reinterpret_cast<Packet8us>(vec_perm(t1,t3,p16uc_TRANSPOSE64_HI));
-          block.packet[3] = reinterpret_cast<Packet8us>(vec_perm(t1,t3,p16uc_TRANSPOSE64_LO));
+          block.packet[0] = reinterpret_cast<Packet8us>(vec_perm(t0, t2, p16uc_TRANSPOSE64_HI));
+          block.packet[1] = reinterpret_cast<Packet8us>(vec_perm(t0, t2, p16uc_TRANSPOSE64_LO));
+          block.packet[2] = reinterpret_cast<Packet8us>(vec_perm(t1, t3, p16uc_TRANSPOSE64_HI));
+          block.packet[3] = reinterpret_cast<Packet8us>(vec_perm(t1, t3, p16uc_TRANSPOSE64_LO));
 #endif
 
           storeBlock<bfloat16, Packet8bf, 4>(blockB + ri, block);
         } else {
-          PacketBlock<Packet8bf,8> block;
+          PacketBlock<Packet8bf, 8> block;
 
           for (int M = 0; M < 8; M++) {
             block.packet[M] = rhs2.template loadPacketPartial<Packet8bf>(i + M, 0, 4);
@@ -1320,21 +1241,20 @@
           }
         }
 
-        ri += 4*vectorSize;
+        ri += 4 * vectorSize;
       }
       for (; i + 2 <= depth; i += 2) {
-        if(StorageOrder == ColMajor)
-        {
-          blockB[ri+0] = rhs2(i + 0, 0);
-          blockB[ri+1] = rhs2(i + 1, 0);
-          blockB[ri+2] = rhs2(i + 0, 1);
-          blockB[ri+3] = rhs2(i + 1, 1);
-          blockB[ri+4] = rhs2(i + 0, 2);
-          blockB[ri+5] = rhs2(i + 1, 2);
-          blockB[ri+6] = rhs2(i + 0, 3);
-          blockB[ri+7] = rhs2(i + 1, 3);
+        if (StorageOrder == ColMajor) {
+          blockB[ri + 0] = rhs2(i + 0, 0);
+          blockB[ri + 1] = rhs2(i + 1, 0);
+          blockB[ri + 2] = rhs2(i + 0, 1);
+          blockB[ri + 3] = rhs2(i + 1, 1);
+          blockB[ri + 4] = rhs2(i + 0, 2);
+          blockB[ri + 5] = rhs2(i + 1, 2);
+          blockB[ri + 6] = rhs2(i + 0, 3);
+          blockB[ri + 7] = rhs2(i + 1, 3);
         } else {
-          PacketBlock<Packet8bf,2> block;
+          PacketBlock<Packet8bf, 2> block;
 
           for (int M = 0; M < 2; M++) {
             block.packet[M] = rhs2.template loadPacketPartial<Packet8bf>(i + M, 0, 4);
@@ -1345,40 +1265,34 @@
           pstore<bfloat16>(blockB + ri, block.packet[0]);
         }
 
-        ri += 4*2;
+        ri += 4 * 2;
       }
-      if (depth & 1)
-      {
-        blockB[ri+0] = rhs2(i, 0);
-        blockB[ri+1] = rhs2(i, 1);
-        blockB[ri+2] = rhs2(i, 2);
-        blockB[ri+3] = rhs2(i, 3);
+      if (depth & 1) {
+        blockB[ri + 0] = rhs2(i, 0);
+        blockB[ri + 1] = rhs2(i, 1);
+        blockB[ri + 2] = rhs2(i, 2);
+        blockB[ri + 3] = rhs2(i, 3);
 
         ri += 4;
       }
 
-      if(PanelMode) ri += 4*(stride - offset - depth);
+      if (PanelMode) ri += 4 * (stride - offset - depth);
     }
 
-    if (j < cols)
-    {
-      if(PanelMode) ri += offset*(cols - j);
+    if (j < cols) {
+      if (PanelMode) ri += offset * (cols - j);
 
       Index i = 0;
-      for(; i + 2 <= depth; i+=2)
-      {
+      for (; i + 2 <= depth; i += 2) {
         Index k = j;
-        for(; k < cols; k++)
-        {
-          blockB[ri+0] = rhs(i + 0, k);
-          blockB[ri+1] = rhs(i + 1, k);
+        for (; k < cols; k++) {
+          blockB[ri + 0] = rhs(i + 0, k);
+          blockB[ri + 1] = rhs(i + 1, k);
           ri += 2;
         }
       }
-      if (depth & 1)
-      {
-        for(; j < cols; j++)
-        {
+      if (depth & 1) {
+        for (; j < cols; j++) {
           blockB[ri] = rhs(i, j);
           ri += 1;
         }
@@ -1388,45 +1302,41 @@
 };
 
 // General template for lhs complex packing, float64 specialization.
-template<typename DataMapper, typename Packet, typename PacketC, int StorageOrder, bool Conjugate, bool PanelMode>
-struct dhs_cpack<double, DataMapper, Packet, PacketC, StorageOrder, Conjugate, PanelMode, true>
-{
-  EIGEN_ALWAYS_INLINE void dhs_ccopy(double* blockAt, const DataMapper& lhs2, Index& i, Index& rir, Index& rii, Index depth, const Index vectorSize)
-  {
-    PacketBlock<Packet,2> blockr, blocki;
-    PacketBlock<PacketC,4> cblock;
+template <typename DataMapper, typename Packet, typename PacketC, int StorageOrder, bool Conjugate, bool PanelMode>
+struct dhs_cpack<double, DataMapper, Packet, PacketC, StorageOrder, Conjugate, PanelMode, true> {
+  EIGEN_ALWAYS_INLINE void dhs_ccopy(double* blockAt, const DataMapper& lhs2, Index& i, Index& rir, Index& rii,
+                                     Index depth, const Index vectorSize) {
+    PacketBlock<Packet, 2> blockr, blocki;
+    PacketBlock<PacketC, 4> cblock;
 
-    for(; i + vectorSize <= depth; i+=vectorSize)
-    {
-      if(StorageOrder == ColMajor)
-      {
-        cblock.packet[0] = lhs2.template loadPacket<PacketC>(0, i + 0); //[a1 a1i]
-        cblock.packet[1] = lhs2.template loadPacket<PacketC>(0, i + 1); //[b1 b1i]
+    for (; i + vectorSize <= depth; i += vectorSize) {
+      if (StorageOrder == ColMajor) {
+        cblock.packet[0] = lhs2.template loadPacket<PacketC>(0, i + 0);  //[a1 a1i]
+        cblock.packet[1] = lhs2.template loadPacket<PacketC>(0, i + 1);  //[b1 b1i]
 
-        cblock.packet[2] = lhs2.template loadPacket<PacketC>(1, i + 0); //[a2 a2i]
-        cblock.packet[3] = lhs2.template loadPacket<PacketC>(1, i + 1); //[b2 b2i]
+        cblock.packet[2] = lhs2.template loadPacket<PacketC>(1, i + 0);  //[a2 a2i]
+        cblock.packet[3] = lhs2.template loadPacket<PacketC>(1, i + 1);  //[b2 b2i]
 
-        blockr.packet[0] = vec_mergeh(cblock.packet[0].v, cblock.packet[2].v); //[a1 a2]
-        blockr.packet[1] = vec_mergeh(cblock.packet[1].v, cblock.packet[3].v); //[b1 b2]
+        blockr.packet[0] = vec_mergeh(cblock.packet[0].v, cblock.packet[2].v);  //[a1 a2]
+        blockr.packet[1] = vec_mergeh(cblock.packet[1].v, cblock.packet[3].v);  //[b1 b2]
 
         blocki.packet[0] = vec_mergel(cblock.packet[0].v, cblock.packet[2].v);
         blocki.packet[1] = vec_mergel(cblock.packet[1].v, cblock.packet[3].v);
       } else {
-        cblock.packet[0] = lhs2.template loadPacket<PacketC>(0, i); //[a1 a1i]
-        cblock.packet[1] = lhs2.template loadPacket<PacketC>(1, i); //[a2 a2i]
+        cblock.packet[0] = lhs2.template loadPacket<PacketC>(0, i);  //[a1 a1i]
+        cblock.packet[1] = lhs2.template loadPacket<PacketC>(1, i);  //[a2 a2i]
 
-        cblock.packet[2] = lhs2.template loadPacket<PacketC>(0, i + 1); //[b1 b1i]
-        cblock.packet[3] = lhs2.template loadPacket<PacketC>(1, i + 1); //[b2 b2i
+        cblock.packet[2] = lhs2.template loadPacket<PacketC>(0, i + 1);  //[b1 b1i]
+        cblock.packet[3] = lhs2.template loadPacket<PacketC>(1, i + 1);  //[b2 b2i
 
-        blockr.packet[0] = vec_mergeh(cblock.packet[0].v, cblock.packet[1].v); //[a1 a2]
-        blockr.packet[1] = vec_mergeh(cblock.packet[2].v, cblock.packet[3].v); //[b1 b2]
+        blockr.packet[0] = vec_mergeh(cblock.packet[0].v, cblock.packet[1].v);  //[a1 a2]
+        blockr.packet[1] = vec_mergeh(cblock.packet[2].v, cblock.packet[3].v);  //[b1 b2]
 
         blocki.packet[0] = vec_mergel(cblock.packet[0].v, cblock.packet[1].v);
         blocki.packet[1] = vec_mergel(cblock.packet[2].v, cblock.packet[3].v);
       }
 
-      if(Conjugate)
-      {
+      if (Conjugate) {
         blocki.packet[0] = -blocki.packet[0];
         blocki.packet[1] = -blocki.packet[1];
       }
@@ -1434,21 +1344,20 @@
       storeBlock<double, Packet, 2>(blockAt + rir, blockr);
       storeBlock<double, Packet, 2>(blockAt + rii, blocki);
 
-      rir += 2*vectorSize;
-      rii += 2*vectorSize;
+      rir += 2 * vectorSize;
+      rii += 2 * vectorSize;
     }
   }
 
-  EIGEN_STRONG_INLINE void operator()(std::complex<double>* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride, Index offset)
-  {
+  EIGEN_STRONG_INLINE void operator()(std::complex<double>* blockA, const DataMapper& lhs, Index depth, Index rows,
+                                      Index stride, Index offset) {
     const Index vectorSize = quad_traits<double>::vectorsize;
     const Index vectorDelta = vectorSize * ((PanelMode) ? stride : depth);
-    Index rir = ((PanelMode) ? (vectorSize*offset) : 0), rii;
-    double* blockAt = reinterpret_cast<double *>(blockA);
+    Index rir = ((PanelMode) ? (vectorSize * offset) : 0), rii;
+    double* blockAt = reinterpret_cast<double*>(blockA);
     Index j = 0;
 
-    for(; j + vectorSize <= rows; j+=vectorSize)
-    {
+    for (; j + vectorSize <= rows; j += vectorSize) {
       const DataMapper lhs2 = lhs.getSubMapper(j, 0);
       Index i = 0;
 
@@ -1456,10 +1365,9 @@
 
       dhs_ccopy(blockAt, lhs2, i, rir, rii, depth, vectorSize);
 
-      for(; i < depth; i++)
-      {
-        PacketBlock<Packet,1> blockr, blocki;
-        PacketBlock<PacketC,2> cblock;
+      for (; i < depth; i++) {
+        PacketBlock<Packet, 1> blockr, blocki;
+        PacketBlock<PacketC, 2> cblock;
 
         cblock.packet[0] = lhs2.template loadPacket<PacketC>(0, i);
         cblock.packet[1] = lhs2.template loadPacket<PacketC>(1, i);
@@ -1467,8 +1375,7 @@
         blockr.packet[0] = vec_mergeh(cblock.packet[0].v, cblock.packet[1].v);
         blocki.packet[0] = vec_mergel(cblock.packet[0].v, cblock.packet[1].v);
 
-        if(Conjugate)
-        {
+        if (Conjugate) {
           blocki.packet[0] = -blocki.packet[0];
         }
 
@@ -1479,25 +1386,22 @@
         rii += vectorSize;
       }
 
-      rir += ((PanelMode) ? (vectorSize*(2*stride - depth)) : vectorDelta);
+      rir += ((PanelMode) ? (vectorSize * (2 * stride - depth)) : vectorDelta);
     }
 
-    if (j < rows)
-    {
-      if(PanelMode) rir += (offset*(rows - j - vectorSize));
+    if (j < rows) {
+      if (PanelMode) rir += (offset * (rows - j - vectorSize));
       rii = rir + (((PanelMode) ? stride : depth) * (rows - j));
 
-      for(Index i = 0; i < depth; i++)
-      {
+      for (Index i = 0; i < depth; i++) {
         Index k = j;
-        for(; k < rows; k++)
-        {
+        for (; k < rows; k++) {
           blockAt[rir] = lhs(k, i).real();
 
-          if(Conjugate)
+          if (Conjugate)
             blockAt[rii] = -lhs(k, i).imag();
           else
-            blockAt[rii] =  lhs(k, i).imag();
+            blockAt[rii] = lhs(k, i).imag();
 
           rir += 1;
           rii += 1;
@@ -1508,15 +1412,13 @@
 };
 
 // General template for rhs complex packing, float64 specialization.
-template<typename DataMapper, typename Packet, typename PacketC, int StorageOrder, bool Conjugate, bool PanelMode>
-struct dhs_cpack<double, DataMapper, Packet, PacketC, StorageOrder, Conjugate, PanelMode, false>
-{
-  EIGEN_ALWAYS_INLINE void dhs_ccopy(double* blockBt, const DataMapper& rhs2, Index& i, Index& rir, Index& rii, Index depth, const Index vectorSize)
-  {
-    for(; i < depth; i++)
-    {
-      PacketBlock<PacketC,4> cblock;
-      PacketBlock<Packet,2> blockr, blocki;
+template <typename DataMapper, typename Packet, typename PacketC, int StorageOrder, bool Conjugate, bool PanelMode>
+struct dhs_cpack<double, DataMapper, Packet, PacketC, StorageOrder, Conjugate, PanelMode, false> {
+  EIGEN_ALWAYS_INLINE void dhs_ccopy(double* blockBt, const DataMapper& rhs2, Index& i, Index& rir, Index& rii,
+                                     Index depth, const Index vectorSize) {
+    for (; i < depth; i++) {
+      PacketBlock<PacketC, 4> cblock;
+      PacketBlock<Packet, 2> blockr, blocki;
 
       bload<DataMapper, PacketC, 2, ColMajor, false, 4>(cblock, rhs2, i, 0);
 
@@ -1526,8 +1428,7 @@
       blocki.packet[0] = vec_mergel(cblock.packet[0].v, cblock.packet[1].v);
       blocki.packet[1] = vec_mergel(cblock.packet[2].v, cblock.packet[3].v);
 
-      if(Conjugate)
-      {
+      if (Conjugate) {
         blocki.packet[0] = -blocki.packet[0];
         blocki.packet[1] = -blocki.packet[1];
       }
@@ -1535,21 +1436,20 @@
       storeBlock<double, Packet, 2>(blockBt + rir, blockr);
       storeBlock<double, Packet, 2>(blockBt + rii, blocki);
 
-      rir += 2*vectorSize;
-      rii += 2*vectorSize;
+      rir += 2 * vectorSize;
+      rii += 2 * vectorSize;
     }
   }
 
-  EIGEN_STRONG_INLINE void operator()(std::complex<double>* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride, Index offset)
-  {
+  EIGEN_STRONG_INLINE void operator()(std::complex<double>* blockB, const DataMapper& rhs, Index depth, Index cols,
+                                      Index stride, Index offset) {
     const Index vectorSize = quad_traits<double>::vectorsize;
-    const Index vectorDelta = 2*vectorSize * ((PanelMode) ? stride : depth);
-    Index rir = ((PanelMode) ? (2*vectorSize*offset) : 0), rii;
-    double* blockBt = reinterpret_cast<double *>(blockB);
+    const Index vectorDelta = 2 * vectorSize * ((PanelMode) ? stride : depth);
+    Index rir = ((PanelMode) ? (2 * vectorSize * offset) : 0), rii;
+    double* blockBt = reinterpret_cast<double*>(blockB);
     Index j = 0;
 
-    for(; j + 2*vectorSize <= cols; j+=2*vectorSize)
-    {
+    for (; j + 2 * vectorSize <= cols; j += 2 * vectorSize) {
       const DataMapper rhs2 = rhs.getSubMapper(0, j);
       Index i = 0;
 
@@ -1557,30 +1457,28 @@
 
       dhs_ccopy(blockBt, rhs2, i, rir, rii, depth, vectorSize);
 
-      rir += ((PanelMode) ? (2*vectorSize*(2*stride - depth)) : vectorDelta);
+      rir += ((PanelMode) ? (2 * vectorSize * (2 * stride - depth)) : vectorDelta);
     }
 
-    if(PanelMode) rir -= (offset*(2*vectorSize - 1));
+    if (PanelMode) rir -= (offset * (2 * vectorSize - 1));
 
-    for(; j < cols; j++)
-    {
+    for (; j < cols; j++) {
       const DataMapper rhs2 = rhs.getSubMapper(0, j);
       rii = rir + ((PanelMode) ? stride : depth);
 
-      for(Index i = 0; i < depth; i++)
-      {
+      for (Index i = 0; i < depth; i++) {
         blockBt[rir] = rhs2(i, 0).real();
 
-        if(Conjugate)
+        if (Conjugate)
           blockBt[rii] = -rhs2(i, 0).imag();
         else
-          blockBt[rii] =  rhs2(i, 0).imag();
+          blockBt[rii] = rhs2(i, 0).imag();
 
         rir += 1;
         rii += 1;
       }
 
-      rir += ((PanelMode) ? (2*stride - depth) : depth);
+      rir += ((PanelMode) ? (2 * stride - depth) : depth);
     }
   }
 };
@@ -1590,11 +1488,9 @@
  **************/
 
 // 512-bits rank1-update of acc. It can either positive or negative accumulate (useful for complex gemm).
-template<typename Packet, bool NegativeAccumulate, int N>
-EIGEN_ALWAYS_INLINE void pger_common(PacketBlock<Packet,N>* acc, const Packet& lhsV, const Packet* rhsV)
-{
-  if(NegativeAccumulate)
-  {
+template <typename Packet, bool NegativeAccumulate, int N>
+EIGEN_ALWAYS_INLINE void pger_common(PacketBlock<Packet, N>* acc, const Packet& lhsV, const Packet* rhsV) {
+  if (NegativeAccumulate) {
     for (int M = 0; M < N; M++) {
       acc->packet[M] = vec_nmsub(lhsV, rhsV[M], acc->packet[M]);
     }
@@ -1605,21 +1501,20 @@
   }
 }
 
-template<int N, typename Scalar, typename Packet, bool NegativeAccumulate>
-EIGEN_ALWAYS_INLINE void pger(PacketBlock<Packet,N>* acc, const Scalar* lhs, const Packet* rhsV)
-{
+template <int N, typename Scalar, typename Packet, bool NegativeAccumulate>
+EIGEN_ALWAYS_INLINE void pger(PacketBlock<Packet, N>* acc, const Scalar* lhs, const Packet* rhsV) {
   Packet lhsV = pload<Packet>(lhs);
 
   pger_common<Packet, NegativeAccumulate, N>(acc, lhsV, rhsV);
 }
 
-// 512-bits rank1-update of complex acc. It takes decoupled accumulators as entries. It also takes cares of mixed types real * complex and complex * real.
-template<int N, typename Packet, bool ConjugateLhs, bool ConjugateRhs, bool LhsIsReal, bool RhsIsReal>
-EIGEN_ALWAYS_INLINE void pgerc_common(PacketBlock<Packet,N>* accReal, PacketBlock<Packet,N>* accImag, const Packet &lhsV, Packet &lhsVi, const Packet* rhsV, const Packet* rhsVi)
-{
+// 512-bits rank1-update of complex acc. It takes decoupled accumulators as entries. It also takes cares of mixed types
+// real * complex and complex * real.
+template <int N, typename Packet, bool ConjugateLhs, bool ConjugateRhs, bool LhsIsReal, bool RhsIsReal>
+EIGEN_ALWAYS_INLINE void pgerc_common(PacketBlock<Packet, N>* accReal, PacketBlock<Packet, N>* accImag,
+                                      const Packet& lhsV, Packet& lhsVi, const Packet* rhsV, const Packet* rhsVi) {
   pger_common<Packet, false, N>(accReal, lhsV, rhsV);
-  if(LhsIsReal)
-  {
+  if (LhsIsReal) {
     pger_common<Packet, ConjugateRhs, N>(accImag, lhsV, rhsVi);
     EIGEN_UNUSED_VARIABLE(lhsVi);
   } else {
@@ -1633,52 +1528,52 @@
   }
 }
 
-template<int N, typename Scalar, typename Packet, bool ConjugateLhs, bool ConjugateRhs, bool LhsIsReal, bool RhsIsReal>
-EIGEN_ALWAYS_INLINE void pgerc(PacketBlock<Packet,N>* accReal, PacketBlock<Packet,N>* accImag, const Scalar* lhs_ptr, const Scalar* lhs_ptr_imag, const Packet* rhsV, const Packet* rhsVi)
-{
+template <int N, typename Scalar, typename Packet, bool ConjugateLhs, bool ConjugateRhs, bool LhsIsReal, bool RhsIsReal>
+EIGEN_ALWAYS_INLINE void pgerc(PacketBlock<Packet, N>* accReal, PacketBlock<Packet, N>* accImag, const Scalar* lhs_ptr,
+                               const Scalar* lhs_ptr_imag, const Packet* rhsV, const Packet* rhsVi) {
   Packet lhsV = ploadLhs<Packet>(lhs_ptr);
   Packet lhsVi;
-  if(!LhsIsReal) lhsVi = ploadLhs<Packet>(lhs_ptr_imag);
-  else EIGEN_UNUSED_VARIABLE(lhs_ptr_imag);
+  if (!LhsIsReal)
+    lhsVi = ploadLhs<Packet>(lhs_ptr_imag);
+  else
+    EIGEN_UNUSED_VARIABLE(lhs_ptr_imag);
 
   pgerc_common<N, Packet, ConjugateLhs, ConjugateRhs, LhsIsReal, RhsIsReal>(accReal, accImag, lhsV, lhsVi, rhsV, rhsVi);
 }
 
-template<typename Packet>
-EIGEN_ALWAYS_INLINE Packet ploadLhs(const __UNPACK_TYPE__(Packet)* lhs)
-{
+template <typename Packet>
+EIGEN_ALWAYS_INLINE Packet ploadLhs(const __UNPACK_TYPE__(Packet) * lhs) {
   return ploadu<Packet>(lhs);
 }
 
 // Zero the accumulator on PacketBlock.
-template<typename Packet, int N>
-EIGEN_ALWAYS_INLINE void bsetzero(PacketBlock<Packet,N>& acc)
-{
+template <typename Packet, int N>
+EIGEN_ALWAYS_INLINE void bsetzero(PacketBlock<Packet, N>& acc) {
   for (int M = 0; M < N; M++) {
     acc.packet[M] = pset1<Packet>((__UNPACK_TYPE__(Packet))0);
   }
 }
 
-template<typename Packet, int N>
-EIGEN_ALWAYS_INLINE void bscalec_common(PacketBlock<Packet,N>& acc, PacketBlock<Packet,N>& accZ, const Packet& pAlpha)
-{
+template <typename Packet, int N>
+EIGEN_ALWAYS_INLINE void bscalec_common(PacketBlock<Packet, N>& acc, PacketBlock<Packet, N>& accZ,
+                                        const Packet& pAlpha) {
   for (int M = 0; M < N; M++) {
     acc.packet[M] = vec_mul(accZ.packet[M], pAlpha);
   }
 }
 
-template<typename Packet, int N>
-EIGEN_ALWAYS_INLINE void band(PacketBlock<Packet,N>& acc, const Packet& pMask)
-{
+template <typename Packet, int N>
+EIGEN_ALWAYS_INLINE void band(PacketBlock<Packet, N>& acc, const Packet& pMask) {
   for (int M = 0; M < N; M++) {
     acc.packet[M] = pand<Packet>(acc.packet[M], pMask);
   }
 }
 
 // Complex version of PacketBlock scaling.
-template<typename Packet, int N, bool mask>
-EIGEN_ALWAYS_INLINE void bscalec(PacketBlock<Packet,N>& aReal, PacketBlock<Packet,N>& aImag, const Packet& bReal, const Packet& bImag, PacketBlock<Packet,N>& cReal, PacketBlock<Packet,N>& cImag, const Packet& pMask)
-{
+template <typename Packet, int N, bool mask>
+EIGEN_ALWAYS_INLINE void bscalec(PacketBlock<Packet, N>& aReal, PacketBlock<Packet, N>& aImag, const Packet& bReal,
+                                 const Packet& bImag, PacketBlock<Packet, N>& cReal, PacketBlock<Packet, N>& cImag,
+                                 const Packet& pMask) {
   if (mask && (sizeof(__UNPACK_TYPE__(Packet)) == sizeof(float))) {
     band<Packet, N>(aReal, pMask);
     band<Packet, N>(aImag, pMask);
@@ -1698,16 +1593,16 @@
 // Load a PacketBlock, the N parameters make tunning gemm easier so we can add more accumulators as needed.
 //
 // full = operate (load) on the entire PacketBlock or only half
-template<typename DataMapper, typename Packet, const Index accCols, int StorageOrder, bool Complex, int N, bool full>
-EIGEN_ALWAYS_INLINE void bload(PacketBlock<Packet,N*(Complex?2:1)>& acc, const DataMapper& res, Index row, Index col)
-{
+template <typename DataMapper, typename Packet, const Index accCols, int StorageOrder, bool Complex, int N, bool full>
+EIGEN_ALWAYS_INLINE void bload(PacketBlock<Packet, N*(Complex ? 2 : 1)>& acc, const DataMapper& res, Index row,
+                               Index col) {
   if (StorageOrder == RowMajor) {
     for (int M = 0; M < N; M++) {
       acc.packet[M] = res.template loadPacket<Packet>(row + M, col);
     }
     if (Complex) {
       for (int M = 0; M < N; M++) {
-        acc.packet[M+N] = res.template loadPacket<Packet>(row + M, col + accCols);
+        acc.packet[M + N] = res.template loadPacket<Packet>(row + M, col + accCols);
       }
     }
   } else {
@@ -1716,37 +1611,35 @@
     }
     if (Complex && full) {
       for (int M = 0; M < N; M++) {
-        acc.packet[M+N] = res.template loadPacket<Packet>(row + accCols, col + M);
+        acc.packet[M + N] = res.template loadPacket<Packet>(row + accCols, col + M);
       }
     }
   }
 }
 
-template<typename DataMapper, typename Packet, int N>
-EIGEN_ALWAYS_INLINE void bstore(PacketBlock<Packet,N>& acc, const DataMapper& res, Index row)
-{
+template <typename DataMapper, typename Packet, int N>
+EIGEN_ALWAYS_INLINE void bstore(PacketBlock<Packet, N>& acc, const DataMapper& res, Index row) {
   for (int M = 0; M < N; M++) {
     res.template storePacket<Packet>(row, M, acc.packet[M]);
   }
 }
 
 #ifdef USE_PARTIAL_PACKETS
-template<typename DataMapper, typename Packet, const Index accCols, bool Complex, Index N, bool full>
-EIGEN_ALWAYS_INLINE void bload_partial(PacketBlock<Packet,N*(Complex?2:1)>& acc, const DataMapper& res, Index row, Index elements)
-{
+template <typename DataMapper, typename Packet, const Index accCols, bool Complex, Index N, bool full>
+EIGEN_ALWAYS_INLINE void bload_partial(PacketBlock<Packet, N*(Complex ? 2 : 1)>& acc, const DataMapper& res, Index row,
+                                       Index elements) {
   for (Index M = 0; M < N; M++) {
     acc.packet[M] = res.template loadPacketPartial<Packet>(row, M, elements);
   }
   if (Complex && full) {
     for (Index M = 0; M < N; M++) {
-      acc.packet[M+N] = res.template loadPacketPartial<Packet>(row + accCols, M, elements);
+      acc.packet[M + N] = res.template loadPacketPartial<Packet>(row + accCols, M, elements);
     }
   }
 }
 
-template<typename DataMapper, typename Packet, Index N>
-EIGEN_ALWAYS_INLINE void bstore_partial(PacketBlock<Packet,N>& acc, const DataMapper& res, Index row, Index elements)
-{
+template <typename DataMapper, typename Packet, Index N>
+EIGEN_ALWAYS_INLINE void bstore_partial(PacketBlock<Packet, N>& acc, const DataMapper& res, Index row, Index elements) {
   for (Index M = 0; M < N; M++) {
     res.template storePacketPartial<Packet>(row, M, acc.packet[M], elements);
   }
@@ -1760,12 +1653,11 @@
 #endif
 
 #if !USE_P10_AND_PVIPR2_0
-const static Packet4i mask4[4] = { {  0,  0,  0,  0 }, { -1,  0,  0,  0 }, { -1, -1,  0,  0 }, { -1, -1, -1,  0 } };
+const static Packet4i mask4[4] = {{0, 0, 0, 0}, {-1, 0, 0, 0}, {-1, -1, 0, 0}, {-1, -1, -1, 0}};
 #endif
 
-template<typename Packet>
-EIGEN_ALWAYS_INLINE Packet bmask(const Index remaining_rows)
-{
+template <typename Packet>
+EIGEN_ALWAYS_INLINE Packet bmask(const Index remaining_rows) {
 #if USE_P10_AND_PVIPR2_0
 #ifdef _BIG_ENDIAN
   return Packet(vec_reve(vec_genwm((1 << remaining_rows) - 1)));
@@ -1777,9 +1669,8 @@
 #endif
 }
 
-template<>
-EIGEN_ALWAYS_INLINE Packet2d bmask<Packet2d>(const Index remaining_rows)
-{
+template <>
+EIGEN_ALWAYS_INLINE Packet2d bmask<Packet2d>(const Index remaining_rows) {
 #if USE_P10_AND_PVIPR2_0
   Packet2d mask2 = Packet2d(vec_gendm(remaining_rows));
 #ifdef _BIG_ENDIAN
@@ -1788,23 +1679,22 @@
   return mask2;
 #endif
 #else
-  Packet2l ret = { -remaining_rows, 0 };
+  Packet2l ret = {-remaining_rows, 0};
   return Packet2d(ret);
 #endif
 }
 
-template<typename Packet, int N>
-EIGEN_ALWAYS_INLINE void bscale(PacketBlock<Packet,N>& acc, PacketBlock<Packet,N>& accZ, const Packet& pAlpha)
-{
+template <typename Packet, int N>
+EIGEN_ALWAYS_INLINE void bscale(PacketBlock<Packet, N>& acc, PacketBlock<Packet, N>& accZ, const Packet& pAlpha) {
   for (int M = 0; M < N; M++) {
     acc.packet[M] = pmadd<Packet>(pAlpha, accZ.packet[M], acc.packet[M]);
   }
 }
 
 // Scale the PacketBlock vectors by alpha.
-template<typename Packet, int N, bool mask>
-EIGEN_ALWAYS_INLINE void bscale(PacketBlock<Packet,N>& acc, PacketBlock<Packet,N>& accZ, const Packet& pAlpha, const Packet& pMask)
-{
+template <typename Packet, int N, bool mask>
+EIGEN_ALWAYS_INLINE void bscale(PacketBlock<Packet, N>& acc, PacketBlock<Packet, N>& accZ, const Packet& pAlpha,
+                                const Packet& pMask) {
   if (mask) {
     band<Packet, N>(accZ, pMask);
   } else {
@@ -1814,11 +1704,10 @@
   bscale<Packet, N>(acc, accZ, pAlpha);
 }
 
-template<typename Packet, int N, bool real>
-EIGEN_ALWAYS_INLINE void pbroadcastN(const __UNPACK_TYPE__(Packet) *ap0,
-        const __UNPACK_TYPE__(Packet) *ap1, const __UNPACK_TYPE__(Packet) *ap2,
-        Packet& a0, Packet& a1, Packet& a2, Packet& a3)
-{
+template <typename Packet, int N, bool real>
+EIGEN_ALWAYS_INLINE void pbroadcastN(const __UNPACK_TYPE__(Packet) * ap0, const __UNPACK_TYPE__(Packet) * ap1,
+                                     const __UNPACK_TYPE__(Packet) * ap2, Packet& a0, Packet& a1, Packet& a2,
+                                     Packet& a3) {
   a0 = pset1<Packet>(ap0[0]);
   if (N == 4) {
     a1 = pset1<Packet>(ap0[1]);
@@ -1842,24 +1731,21 @@
   }
 }
 
-template<> EIGEN_ALWAYS_INLINE void
-pbroadcastN<Packet4f,4,true>(const float *ap0, const float *, const float *,
-                             Packet4f& a0, Packet4f& a1, Packet4f& a2, Packet4f& a3)
-{
+template <>
+EIGEN_ALWAYS_INLINE void pbroadcastN<Packet4f, 4, true>(const float* ap0, const float*, const float*, Packet4f& a0,
+                                                        Packet4f& a1, Packet4f& a2, Packet4f& a3) {
   pbroadcast4<Packet4f>(ap0, a0, a1, a2, a3);
 }
 
-template<> EIGEN_ALWAYS_INLINE void
-pbroadcastN<Packet4f,4,false>(const float *ap0, const float *ap1, const float *ap2,
-                              Packet4f& a0, Packet4f& a1, Packet4f& a2, Packet4f& a3)
-{
-  pbroadcastN<Packet4f,4,true>(ap0, ap1, ap2, a0, a1, a2, a3);
+template <>
+EIGEN_ALWAYS_INLINE void pbroadcastN<Packet4f, 4, false>(const float* ap0, const float* ap1, const float* ap2,
+                                                         Packet4f& a0, Packet4f& a1, Packet4f& a2, Packet4f& a3) {
+  pbroadcastN<Packet4f, 4, true>(ap0, ap1, ap2, a0, a1, a2, a3);
 }
 
-template<>
-EIGEN_ALWAYS_INLINE void pbroadcastN<Packet2d,4,false>(const double* ap0, const double *,
-    const double *, Packet2d& a0, Packet2d& a1, Packet2d& a2, Packet2d& a3)
-{
+template <>
+EIGEN_ALWAYS_INLINE void pbroadcastN<Packet2d, 4, false>(const double* ap0, const double*, const double*, Packet2d& a0,
+                                                         Packet2d& a1, Packet2d& a2, Packet2d& a3) {
   a1 = pload<Packet2d>(ap0);
   a3 = pload<Packet2d>(ap0 + 2);
   a0 = vec_splat(a1, 0);
@@ -1869,9 +1755,9 @@
 }
 
 // Grab two decouples real/imaginary PacketBlocks and return two coupled (real/imaginary pairs) PacketBlocks.
-template<typename Packet, typename Packetc, int N, bool full>
-EIGEN_ALWAYS_INLINE void bcouple_common(PacketBlock<Packet,N>& taccReal, PacketBlock<Packet,N>& taccImag, PacketBlock<Packetc, N>& acc1, PacketBlock<Packetc, N>& acc2)
-{
+template <typename Packet, typename Packetc, int N, bool full>
+EIGEN_ALWAYS_INLINE void bcouple_common(PacketBlock<Packet, N>& taccReal, PacketBlock<Packet, N>& taccImag,
+                                        PacketBlock<Packetc, N>& acc1, PacketBlock<Packetc, N>& acc2) {
   for (int M = 0; M < N; M++) {
     acc1.packet[M].v = vec_mergeh(taccReal.packet[M], taccImag.packet[M]);
   }
@@ -1883,9 +1769,10 @@
   }
 }
 
-template<typename Packet, typename Packetc, int N, bool full>
-EIGEN_ALWAYS_INLINE void bcouple(PacketBlock<Packet,N>& taccReal, PacketBlock<Packet,N>& taccImag, PacketBlock<Packetc,N*2>& tRes, PacketBlock<Packetc, N>& acc1, PacketBlock<Packetc, N>& acc2)
-{
+template <typename Packet, typename Packetc, int N, bool full>
+EIGEN_ALWAYS_INLINE void bcouple(PacketBlock<Packet, N>& taccReal, PacketBlock<Packet, N>& taccImag,
+                                 PacketBlock<Packetc, N * 2>& tRes, PacketBlock<Packetc, N>& acc1,
+                                 PacketBlock<Packetc, N>& acc2) {
   bcouple_common<Packet, Packetc, N, full>(taccReal, taccImag, acc1, acc2);
 
   for (int M = 0; M < N; M++) {
@@ -1894,7 +1781,7 @@
 
   if (full) {
     for (int M = 0; M < N; M++) {
-      acc2.packet[M] = padd<Packetc>(tRes.packet[M+N], acc2.packet[M]);
+      acc2.packet[M] = padd<Packetc>(tRes.packet[M + N], acc2.packet[M]);
     }
   }
 }
@@ -1903,143 +1790,132 @@
 #define PEEL 7
 #define PEEL_ROW 7
 
-#define MICRO_UNROLL(func) \
-  func(0) func(1) func(2) func(3) func(4) func(5) func(6) func(7)
+#define MICRO_UNROLL(func) func(0) func(1) func(2) func(3) func(4) func(5) func(6) func(7)
 
-#define MICRO_NORMAL_ROWS \
-  accRows == quad_traits<Scalar>::rows || accRows == 1
+#define MICRO_NORMAL_ROWS accRows == quad_traits<Scalar>::rows || accRows == 1
 
 #define MICRO_NEW_ROWS ((MICRO_NORMAL_ROWS) ? accRows : 1)
 
 #define MICRO_RHS(ptr, N) rhs_##ptr##N
 
-#define MICRO_ZERO_PEEL(peel) \
-  if ((PEEL_ROW > peel) && (peel != 0)) { \
+#define MICRO_ZERO_PEEL(peel)                 \
+  if ((PEEL_ROW > peel) && (peel != 0)) {     \
     bsetzero<Packet, accRows>(accZero##peel); \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(accZero##peel); \
+  } else {                                    \
+    EIGEN_UNUSED_VARIABLE(accZero##peel);     \
   }
 
-#define MICRO_ADD(ptr, N) \
-  if (MICRO_NORMAL_ROWS) { \
-    MICRO_RHS(ptr,0) += (accRows * N); \
-  } else { \
-    MICRO_RHS(ptr,0) += N; \
-    MICRO_RHS(ptr,1) += N; \
-    if (accRows == 3) { \
-       MICRO_RHS(ptr,2) += N; \
-    } \
+#define MICRO_ADD(ptr, N)               \
+  if (MICRO_NORMAL_ROWS) {              \
+    MICRO_RHS(ptr, 0) += (accRows * N); \
+  } else {                              \
+    MICRO_RHS(ptr, 0) += N;             \
+    MICRO_RHS(ptr, 1) += N;             \
+    if (accRows == 3) {                 \
+      MICRO_RHS(ptr, 2) += N;           \
+    }                                   \
   }
 
 #define MICRO_ADD_ROWS(N) MICRO_ADD(ptr, N)
 
-#define MICRO_BROADCAST1(peel, ptr, rhsV, real) \
-  if (MICRO_NORMAL_ROWS) { \
-    pbroadcastN<Packet,accRows,real>(MICRO_RHS(ptr,0) + (accRows * peel), MICRO_RHS(ptr,0), MICRO_RHS(ptr,0), rhsV##peel[0], rhsV##peel[1], rhsV##peel[2], rhsV##peel[3]); \
-  } else { \
-    pbroadcastN<Packet,accRows,real>(MICRO_RHS(ptr,0) + peel, MICRO_RHS(ptr,1) + peel, MICRO_RHS(ptr,2) + peel, rhsV##peel[0], rhsV##peel[1], rhsV##peel[2], rhsV##peel[3]); \
+#define MICRO_BROADCAST1(peel, ptr, rhsV, real)                                                                      \
+  if (MICRO_NORMAL_ROWS) {                                                                                           \
+    pbroadcastN<Packet, accRows, real>(MICRO_RHS(ptr, 0) + (accRows * peel), MICRO_RHS(ptr, 0), MICRO_RHS(ptr, 0),   \
+                                       rhsV##peel[0], rhsV##peel[1], rhsV##peel[2], rhsV##peel[3]);                  \
+  } else {                                                                                                           \
+    pbroadcastN<Packet, accRows, real>(MICRO_RHS(ptr, 0) + peel, MICRO_RHS(ptr, 1) + peel, MICRO_RHS(ptr, 2) + peel, \
+                                       rhsV##peel[0], rhsV##peel[1], rhsV##peel[2], rhsV##peel[3]);                  \
   }
 
 #define MICRO_BROADCAST(peel) MICRO_BROADCAST1(peel, ptr, rhsV, true)
 
-#define MICRO_BROADCAST_EXTRA1(ptr, rhsV, real) \
-  pbroadcastN<Packet,accRows,real>(MICRO_RHS(ptr,0), MICRO_RHS(ptr,1), MICRO_RHS(ptr,2), rhsV[0], rhsV[1], rhsV[2], rhsV[3]);
+#define MICRO_BROADCAST_EXTRA1(ptr, rhsV, real)                                                                 \
+  pbroadcastN<Packet, accRows, real>(MICRO_RHS(ptr, 0), MICRO_RHS(ptr, 1), MICRO_RHS(ptr, 2), rhsV[0], rhsV[1], \
+                                     rhsV[2], rhsV[3]);
 
-#define MICRO_BROADCAST_EXTRA \
-  Packet rhsV[4]; \
+#define MICRO_BROADCAST_EXTRA             \
+  Packet rhsV[4];                         \
   MICRO_BROADCAST_EXTRA1(ptr, rhsV, true) \
   MICRO_ADD_ROWS(1)
 
-#define MICRO_SRC2(ptr, N, M) \
-  if (MICRO_NORMAL_ROWS) { \
-    EIGEN_UNUSED_VARIABLE(strideB); \
-    EIGEN_UNUSED_VARIABLE(MICRO_RHS(ptr,1)); \
-    EIGEN_UNUSED_VARIABLE(MICRO_RHS(ptr,2)); \
-  } else { \
-    MICRO_RHS(ptr,1) = rhs_base + N + M; \
-    if (accRows == 3) { \
-      MICRO_RHS(ptr,2) = rhs_base + N*2 + M; \
-    } else { \
-      EIGEN_UNUSED_VARIABLE(MICRO_RHS(ptr,2)); \
-    } \
+#define MICRO_SRC2(ptr, N, M)                   \
+  if (MICRO_NORMAL_ROWS) {                      \
+    EIGEN_UNUSED_VARIABLE(strideB);             \
+    EIGEN_UNUSED_VARIABLE(MICRO_RHS(ptr, 1));   \
+    EIGEN_UNUSED_VARIABLE(MICRO_RHS(ptr, 2));   \
+  } else {                                      \
+    MICRO_RHS(ptr, 1) = rhs_base + N + M;       \
+    if (accRows == 3) {                         \
+      MICRO_RHS(ptr, 2) = rhs_base + N * 2 + M; \
+    } else {                                    \
+      EIGEN_UNUSED_VARIABLE(MICRO_RHS(ptr, 2)); \
+    }                                           \
   }
 
 #define MICRO_SRC2_PTR MICRO_SRC2(ptr, strideB, 0)
 
 #define MICRO_ZERO_PEEL_ROW MICRO_UNROLL(MICRO_ZERO_PEEL)
 
-#define MICRO_WORK_PEEL(peel) \
-  if (PEEL_ROW > peel) { \
-    MICRO_BROADCAST(peel) \
+#define MICRO_WORK_PEEL(peel)                                                                            \
+  if (PEEL_ROW > peel) {                                                                                 \
+    MICRO_BROADCAST(peel)                                                                                \
     pger<accRows, Scalar, Packet, false>(&accZero##peel, lhs_ptr + (remaining_rows * peel), rhsV##peel); \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(rhsV##peel); \
+  } else {                                                                                               \
+    EIGEN_UNUSED_VARIABLE(rhsV##peel);                                                                   \
   }
 
-#define MICRO_WORK_PEEL_ROW \
+#define MICRO_WORK_PEEL_ROW                                                              \
   Packet rhsV0[4], rhsV1[4], rhsV2[4], rhsV3[4], rhsV4[4], rhsV5[4], rhsV6[4], rhsV7[4]; \
-  MICRO_UNROLL(MICRO_WORK_PEEL) \
-  lhs_ptr += (remaining_rows * PEEL_ROW); \
+  MICRO_UNROLL(MICRO_WORK_PEEL)                                                          \
+  lhs_ptr += (remaining_rows * PEEL_ROW);                                                \
   MICRO_ADD_ROWS(PEEL_ROW)
 
-#define MICRO_ADD_PEEL(peel, sum) \
-  if (PEEL_ROW > peel) { \
-    for (Index i = 0; i < accRows; i++) { \
+#define MICRO_ADD_PEEL(peel, sum)                        \
+  if (PEEL_ROW > peel) {                                 \
+    for (Index i = 0; i < accRows; i++) {                \
       accZero##sum.packet[i] += accZero##peel.packet[i]; \
-    } \
+    }                                                    \
   }
 
 #define MICRO_ADD_PEEL_ROW \
-  MICRO_ADD_PEEL(4, 0) MICRO_ADD_PEEL(5, 1) MICRO_ADD_PEEL(6, 2) MICRO_ADD_PEEL(7, 3) \
-  MICRO_ADD_PEEL(2, 0) MICRO_ADD_PEEL(3, 1) MICRO_ADD_PEEL(1, 0)
+  MICRO_ADD_PEEL(4, 0)     \
+  MICRO_ADD_PEEL(5, 1)     \
+  MICRO_ADD_PEEL(6, 2) MICRO_ADD_PEEL(7, 3) MICRO_ADD_PEEL(2, 0) MICRO_ADD_PEEL(3, 1) MICRO_ADD_PEEL(1, 0)
 
-#define MICRO_PREFETCHN1(ptr, N) \
-  EIGEN_POWER_PREFETCH(MICRO_RHS(ptr,0)); \
-  if (N == 2 || N == 3) { \
-    EIGEN_POWER_PREFETCH(MICRO_RHS(ptr,1)); \
-    if (N == 3) { \
-      EIGEN_POWER_PREFETCH(MICRO_RHS(ptr,2)); \
-    } \
+#define MICRO_PREFETCHN1(ptr, N)               \
+  EIGEN_POWER_PREFETCH(MICRO_RHS(ptr, 0));     \
+  if (N == 2 || N == 3) {                      \
+    EIGEN_POWER_PREFETCH(MICRO_RHS(ptr, 1));   \
+    if (N == 3) {                              \
+      EIGEN_POWER_PREFETCH(MICRO_RHS(ptr, 2)); \
+    }                                          \
   }
 
 #define MICRO_PREFETCHN(N) MICRO_PREFETCHN1(ptr, N)
 
 #define MICRO_COMPLEX_PREFETCHN(N) \
-  MICRO_PREFETCHN1(ptr_real, N); \
-  if(!RhsIsReal) { \
+  MICRO_PREFETCHN1(ptr_real, N);   \
+  if (!RhsIsReal) {                \
     MICRO_PREFETCHN1(ptr_imag, N); \
   }
 
-template<typename Scalar, typename Packet, const Index accRows, const Index remaining_rows>
-EIGEN_ALWAYS_INLINE void MICRO_EXTRA_ROW(
-  const Scalar* &lhs_ptr,
-  const Scalar* &rhs_ptr0,
-  const Scalar* &rhs_ptr1,
-  const Scalar* &rhs_ptr2,
-  PacketBlock<Packet,accRows> &accZero)
-{
+template <typename Scalar, typename Packet, const Index accRows, const Index remaining_rows>
+EIGEN_ALWAYS_INLINE void MICRO_EXTRA_ROW(const Scalar*& lhs_ptr, const Scalar*& rhs_ptr0, const Scalar*& rhs_ptr1,
+                                         const Scalar*& rhs_ptr2, PacketBlock<Packet, accRows>& accZero) {
   MICRO_BROADCAST_EXTRA
   pger<accRows, Scalar, Packet, false>(&accZero, lhs_ptr, rhsV);
   lhs_ptr += remaining_rows;
 }
 
-template<typename Scalar, typename Packet, typename DataMapper, const Index accRows, const Index accCols, const Index remaining_rows>
-EIGEN_ALWAYS_INLINE void gemm_unrolled_row_iteration(
-  const DataMapper& res,
-  const Scalar* lhs_base,
-  const Scalar* rhs_base,
-  Index depth,
-  Index strideA,
-  Index offsetA,
-  Index strideB,
-  Index row,
-  Index rows,
-  const Packet& pAlpha,
-  const Packet& pMask)
-{
-  const Scalar* rhs_ptr0 = rhs_base, * rhs_ptr1 = NULL, * rhs_ptr2 = NULL;
-  const Scalar* lhs_ptr = lhs_base + row*strideA + remaining_rows*offsetA;
-  PacketBlock<Packet,accRows> accZero0, accZero1, accZero2, accZero3, accZero4, accZero5, accZero6, accZero7, acc;
+template <typename Scalar, typename Packet, typename DataMapper, const Index accRows, const Index accCols,
+          const Index remaining_rows>
+EIGEN_ALWAYS_INLINE void gemm_unrolled_row_iteration(const DataMapper& res, const Scalar* lhs_base,
+                                                     const Scalar* rhs_base, Index depth, Index strideA, Index offsetA,
+                                                     Index strideB, Index row, Index rows, const Packet& pAlpha,
+                                                     const Packet& pMask) {
+  const Scalar *rhs_ptr0 = rhs_base, *rhs_ptr1 = NULL, *rhs_ptr2 = NULL;
+  const Scalar* lhs_ptr = lhs_base + row * strideA + remaining_rows * offsetA;
+  PacketBlock<Packet, accRows> accZero0, accZero1, accZero2, accZero3, accZero4, accZero5, accZero6, accZero7, acc;
 
   MICRO_SRC2_PTR
   bsetzero<Packet, accRows>(accZero0);
@@ -2048,16 +1924,14 @@
   Index k = 0;
   if (remaining_depth >= PEEL_ROW) {
     MICRO_ZERO_PEEL_ROW
-    do
-    {
+    do {
       MICRO_PREFETCHN(accRows)
       EIGEN_POWER_PREFETCH(lhs_ptr);
       MICRO_WORK_PEEL_ROW
     } while ((k += PEEL_ROW) + PEEL_ROW <= remaining_depth);
     MICRO_ADD_PEEL_ROW
   }
-  for(; k < depth; k++)
-  {
+  for (; k < depth; k++) {
     MICRO_EXTRA_ROW<Scalar, Packet, accRows, remaining_rows>(lhs_ptr, rhs_ptr0, rhs_ptr1, rhs_ptr2, accZero0);
   }
 
@@ -2065,18 +1939,17 @@
   EIGEN_UNUSED_VARIABLE(rows);
   EIGEN_UNUSED_VARIABLE(pMask);
   bload_partial<DataMapper, Packet, 0, false, accRows>(acc, res, row, remaining_rows);
-  bscale<Packet,accRows>(acc, accZero0, pAlpha);
+  bscale<Packet, accRows>(acc, accZero0, pAlpha);
   bstore_partial<DataMapper, Packet, accRows>(acc, res, row, remaining_rows);
 #else
   bload<DataMapper, Packet, 0, ColMajor, false, accRows>(acc, res, row, 0);
-  if ((accRows == 1) || (rows >= accCols))
-  {
-    bscale<Packet,accRows,true>(acc, accZero0, pAlpha, pMask);
+  if ((accRows == 1) || (rows >= accCols)) {
+    bscale<Packet, accRows, true>(acc, accZero0, pAlpha, pMask);
     bstore<DataMapper, Packet, accRows>(acc, res, row);
   } else {
-    bscale<Packet,accRows,false>(acc, accZero0, pAlpha, pMask);
-    for(Index j = 0; j < accRows; j++) {
-      for(Index i = 0; i < remaining_rows; i++) {
+    bscale<Packet, accRows, false>(acc, accZero0, pAlpha, pMask);
+    for (Index j = 0; j < accRows; j++) {
+      for (Index i = 0; i < remaining_rows; i++) {
         res(row + i, j) = acc.packet[j][i];
       }
     }
@@ -2084,75 +1957,62 @@
 #endif
 }
 
-#define MICRO_EXTRA(MICRO_EXTRA_UNROLL, value, is_col) \
-  switch(value) { \
-    default: \
-      MICRO_EXTRA_UNROLL(1) \
-      break; \
-    case 2: \
+#define MICRO_EXTRA(MICRO_EXTRA_UNROLL, value, is_col)   \
+  switch (value) {                                       \
+    default:                                             \
+      MICRO_EXTRA_UNROLL(1)                              \
+      break;                                             \
+    case 2:                                              \
       if (is_col || (sizeof(Scalar) == sizeof(float))) { \
-        MICRO_EXTRA_UNROLL(2) \
-      } \
-      break; \
-    case 3: \
+        MICRO_EXTRA_UNROLL(2)                            \
+      }                                                  \
+      break;                                             \
+    case 3:                                              \
       if (is_col || (sizeof(Scalar) == sizeof(float))) { \
-        MICRO_EXTRA_UNROLL(3) \
-      } \
-      break; \
+        MICRO_EXTRA_UNROLL(3)                            \
+      }                                                  \
+      break;                                             \
   }
 
-#define MICRO_EXTRA_ROWS(N) \
-  gemm_unrolled_row_iteration<Scalar, Packet, DataMapper, accRows, accCols, N>(res, lhs_base, rhs_base, depth, strideA, offsetA, strideB, row, rows, pAlpha, pMask);
+#define MICRO_EXTRA_ROWS(N)                                                     \
+  gemm_unrolled_row_iteration<Scalar, Packet, DataMapper, accRows, accCols, N>( \
+      res, lhs_base, rhs_base, depth, strideA, offsetA, strideB, row, rows, pAlpha, pMask);
 
-template<typename Scalar, typename Packet, typename DataMapper, const Index accRows, const Index accCols>
-EIGEN_ALWAYS_INLINE void gemm_extra_row(
-  const DataMapper& res,
-  const Scalar* lhs_base,
-  const Scalar* rhs_base,
-  Index depth,
-  Index strideA,
-  Index offsetA,
-  Index strideB,
-  Index row,
-  Index rows,
-  Index remaining_rows,
-  const Packet& pAlpha,
-  const Packet& pMask)
-{
+template <typename Scalar, typename Packet, typename DataMapper, const Index accRows, const Index accCols>
+EIGEN_ALWAYS_INLINE void gemm_extra_row(const DataMapper& res, const Scalar* lhs_base, const Scalar* rhs_base,
+                                        Index depth, Index strideA, Index offsetA, Index strideB, Index row, Index rows,
+                                        Index remaining_rows, const Packet& pAlpha, const Packet& pMask) {
   MICRO_EXTRA(MICRO_EXTRA_ROWS, remaining_rows, false)
 }
 
 #define MICRO_UNROLL_WORK(func, func2, peel) \
-  MICRO_UNROLL(func2); \
-  func(0,peel) func(1,peel) func(2,peel) func(3,peel) \
-  func(4,peel) func(5,peel) func(6,peel) func(7,peel)
+  MICRO_UNROLL(func2);                       \
+  func(0, peel) func(1, peel) func(2, peel) func(3, peel) func(4, peel) func(5, peel) func(6, peel) func(7, peel)
 
-#define MICRO_WORK_ONE(iter, peel) \
-  if (unroll_factor > iter) { \
+#define MICRO_WORK_ONE(iter, peel)                                               \
+  if (unroll_factor > iter) {                                                    \
     pger_common<Packet, false, accRows>(&accZero##iter, lhsV##iter, rhsV##peel); \
   }
 
-#define MICRO_TYPE_PEEL4(func, func2, peel) \
-  if (PEEL > peel) { \
+#define MICRO_TYPE_PEEL4(func, func2, peel)                        \
+  if (PEEL > peel) {                                               \
     Packet lhsV0, lhsV1, lhsV2, lhsV3, lhsV4, lhsV5, lhsV6, lhsV7; \
-    MICRO_BROADCAST(peel) \
-    MICRO_UNROLL_WORK(func, func2, peel) \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(rhsV##peel); \
+    MICRO_BROADCAST(peel)                                          \
+    MICRO_UNROLL_WORK(func, func2, peel)                           \
+  } else {                                                         \
+    EIGEN_UNUSED_VARIABLE(rhsV##peel);                             \
   }
 
-#define MICRO_UNROLL_TYPE_PEEL(M, func, func1, func2) \
-  Packet rhsV0[M], rhsV1[M], rhsV2[M], rhsV3[M], rhsV4[M], rhsV5[M], rhsV6[M], rhsV7[M]; \
-  func(func1,func2,0) func(func1,func2,1) \
-  func(func1,func2,2) func(func1,func2,3) \
-  func(func1,func2,4) func(func1,func2,5) \
-  func(func1,func2,6) func(func1,func2,7)
+#define MICRO_UNROLL_TYPE_PEEL(M, func, func1, func2)                                                           \
+  Packet rhsV0[M], rhsV1[M], rhsV2[M], rhsV3[M], rhsV4[M], rhsV5[M], rhsV6[M], rhsV7[M];                        \
+  func(func1, func2, 0) func(func1, func2, 1) func(func1, func2, 2) func(func1, func2, 3) func(func1, func2, 4) \
+      func(func1, func2, 5) func(func1, func2, 6) func(func1, func2, 7)
 
 #define MICRO_UNROLL_TYPE_ONE(M, func, func1, func2) \
-  Packet rhsV0[M]; \
-  func(func1,func2,0)
+  Packet rhsV0[M];                                   \
+  func(func1, func2, 0)
 
-#define MICRO_UNROLL_TYPE(MICRO_TYPE, size) \
+#define MICRO_UNROLL_TYPE(MICRO_TYPE, size)                       \
   MICRO_TYPE(4, MICRO_TYPE_PEEL4, MICRO_WORK_ONE, MICRO_LOAD_ONE) \
   MICRO_ADD_ROWS(size)
 
@@ -2160,11 +2020,11 @@
 
 #define MICRO_ONE4 MICRO_UNROLL_TYPE(MICRO_UNROLL_TYPE_ONE, 1)
 
-#define MICRO_DST_PTR_ONE(iter) \
-  if (unroll_factor > iter) { \
+#define MICRO_DST_PTR_ONE(iter)               \
+  if (unroll_factor > iter) {                 \
     bsetzero<Packet, accRows>(accZero##iter); \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(accZero##iter); \
+  } else {                                    \
+    EIGEN_UNUSED_VARIABLE(accZero##iter);     \
   }
 
 #define MICRO_DST_PTR MICRO_UNROLL(MICRO_DST_PTR_ONE)
@@ -2174,69 +2034,62 @@
 #define MICRO_PREFETCH MICRO_UNROLL(MICRO_PREFETCH_ONE)
 
 #ifdef USE_PARTIAL_PACKETS
-#define MICRO_STORE_ONE(iter) \
-  if (unroll_factor > iter) { \
-    if (MICRO_NORMAL_PARTIAL(iter)) { \
-      bload<DataMapper, Packet, 0, ColMajor, false, accRows>(acc, res, row + iter*accCols, 0); \
-      bscale<Packet,accRows>(acc, accZero##iter, pAlpha); \
-      bstore<DataMapper, Packet, accRows>(acc, res, row + iter*accCols); \
-    } else { \
-      bload_partial<DataMapper, Packet, 0, false, accRows>(acc, res, row + iter*accCols, accCols2); \
-      bscale<Packet,accRows>(acc, accZero##iter, pAlpha); \
-      bstore_partial<DataMapper, Packet, accRows>(acc, res, row + iter*accCols, accCols2); \
-    } \
+#define MICRO_STORE_ONE(iter)                                                                         \
+  if (unroll_factor > iter) {                                                                         \
+    if (MICRO_NORMAL_PARTIAL(iter)) {                                                                 \
+      bload<DataMapper, Packet, 0, ColMajor, false, accRows>(acc, res, row + iter * accCols, 0);      \
+      bscale<Packet, accRows>(acc, accZero##iter, pAlpha);                                            \
+      bstore<DataMapper, Packet, accRows>(acc, res, row + iter * accCols);                            \
+    } else {                                                                                          \
+      bload_partial<DataMapper, Packet, 0, false, accRows>(acc, res, row + iter * accCols, accCols2); \
+      bscale<Packet, accRows>(acc, accZero##iter, pAlpha);                                            \
+      bstore_partial<DataMapper, Packet, accRows>(acc, res, row + iter * accCols, accCols2);          \
+    }                                                                                                 \
   }
 #else
-#define MICRO_STORE_ONE(iter) \
-  if (unroll_factor > iter) { \
-    bload<DataMapper, Packet, 0, ColMajor, false, accRows>(acc, res, row + iter*accCols, 0); \
-    bscale<Packet,accRows,!(MICRO_NORMAL(iter))>(acc, accZero##iter, pAlpha, pMask); \
-    bstore<DataMapper, Packet, accRows>(acc, res, row + iter*accCols); \
+#define MICRO_STORE_ONE(iter)                                                                  \
+  if (unroll_factor > iter) {                                                                  \
+    bload<DataMapper, Packet, 0, ColMajor, false, accRows>(acc, res, row + iter * accCols, 0); \
+    bscale<Packet, accRows, !(MICRO_NORMAL(iter))>(acc, accZero##iter, pAlpha, pMask);         \
+    bstore<DataMapper, Packet, accRows>(acc, res, row + iter * accCols);                       \
   }
 #endif
 
 #define MICRO_STORE MICRO_UNROLL(MICRO_STORE_ONE)
 
 #ifdef USE_PARTIAL_PACKETS
-template<int unroll_factor, typename Scalar, typename Packet, typename DataMapper, const Index accRows, const Index accCols, bool full>
+template <int unroll_factor, typename Scalar, typename Packet, typename DataMapper, const Index accRows,
+          const Index accCols, bool full>
 #else
-template<int unroll_factor, typename Scalar, typename Packet, typename DataMapper, const Index accRows, const Index accCols, const Index accCols2>
+template <int unroll_factor, typename Scalar, typename Packet, typename DataMapper, const Index accRows,
+          const Index accCols, const Index accCols2>
 #endif
-EIGEN_ALWAYS_INLINE void gemm_unrolled_iteration(
-  const DataMapper& res,
-  const Scalar* lhs_base,
-  const Scalar* rhs_base,
-  Index depth,
-  Index strideA,
-  Index offsetA,
-  Index strideB,
-  Index& row,
-  const Packet& pAlpha,
+EIGEN_ALWAYS_INLINE void gemm_unrolled_iteration(const DataMapper& res, const Scalar* lhs_base, const Scalar* rhs_base,
+                                                 Index depth, Index strideA, Index offsetA, Index strideB, Index& row,
+                                                 const Packet& pAlpha,
 #ifdef USE_PARTIAL_PACKETS
-  Index accCols2
+                                                 Index accCols2
 #else
-  const Packet& pMask
+                                                 const Packet& pMask
 #endif
-  )
-{
-  const Scalar* rhs_ptr0 = rhs_base, * rhs_ptr1 = NULL, * rhs_ptr2 = NULL;
-  const Scalar* lhs_ptr0 = NULL, * lhs_ptr1 = NULL, * lhs_ptr2 = NULL, * lhs_ptr3 = NULL, * lhs_ptr4 = NULL, * lhs_ptr5 = NULL, * lhs_ptr6 = NULL, * lhs_ptr7 = NULL;
-  PacketBlock<Packet,accRows> accZero0, accZero1, accZero2, accZero3, accZero4, accZero5, accZero6, accZero7;
-  PacketBlock<Packet,accRows> acc;
+) {
+  const Scalar *rhs_ptr0 = rhs_base, *rhs_ptr1 = NULL, *rhs_ptr2 = NULL;
+  const Scalar *lhs_ptr0 = NULL, *lhs_ptr1 = NULL, *lhs_ptr2 = NULL, *lhs_ptr3 = NULL, *lhs_ptr4 = NULL,
+               *lhs_ptr5 = NULL, *lhs_ptr6 = NULL, *lhs_ptr7 = NULL;
+  PacketBlock<Packet, accRows> accZero0, accZero1, accZero2, accZero3, accZero4, accZero5, accZero6, accZero7;
+  PacketBlock<Packet, accRows> acc;
 
   MICRO_SRC2_PTR
   MICRO_SRC_PTR
   MICRO_DST_PTR
 
   Index k = 0;
-  for(; k + PEEL <= depth; k+= PEEL)
-  {
+  for (; k + PEEL <= depth; k += PEEL) {
     MICRO_PREFETCHN(accRows)
     MICRO_PREFETCH
     MICRO_ONE_PEEL4
   }
-  for(; k < depth; k++)
-  {
+  for (; k < depth; k++) {
     MICRO_ONE4
   }
   MICRO_STORE
@@ -2245,42 +2098,32 @@
 }
 
 #ifdef USE_PARTIAL_PACKETS
-#define MICRO_UNROLL_ITER2(N, M) \
-  gemm_unrolled_iteration<N + ((M) ? 1 : 0), Scalar, Packet, DataMapper, accRows, accCols, !M>(res3, lhs_base, rhs_base, depth, strideA, offsetA, strideB, row, pAlpha, M ? remaining_rows : accCols); \
+#define MICRO_UNROLL_ITER2(N, M)                                                                              \
+  gemm_unrolled_iteration<N + ((M) ? 1 : 0), Scalar, Packet, DataMapper, accRows, accCols, !M>(               \
+      res3, lhs_base, rhs_base, depth, strideA, offsetA, strideB, row, pAlpha, M ? remaining_rows : accCols); \
   if (M) return;
 #else
-#define MICRO_UNROLL_ITER2(N, M) \
-  gemm_unrolled_iteration<N + ((M) ? 1 : 0), Scalar, Packet, DataMapper, accRows, accCols, M ? M : accCols>(res3, lhs_base, rhs_base, depth, strideA, offsetA, strideB, row, pAlpha, pMask); \
+#define MICRO_UNROLL_ITER2(N, M)                                                                             \
+  gemm_unrolled_iteration<N + ((M) ? 1 : 0), Scalar, Packet, DataMapper, accRows, accCols, M ? M : accCols>( \
+      res3, lhs_base, rhs_base, depth, strideA, offsetA, strideB, row, pAlpha, pMask);                       \
   if (M) return;
 #endif
 
-template<typename Scalar, typename Packet, typename DataMapper, const Index accRows, const Index accCols>
-EIGEN_ALWAYS_INLINE void gemm_cols(
-  const DataMapper& res,
-  const Scalar* blockA,
-  const Scalar* blockB,
-  Index depth,
-  Index strideA,
-  Index offsetA,
-  Index strideB,
-  Index offsetB,
-  Index col,
-  Index rows,
-  Index remaining_rows,
-  const Packet& pAlpha,
-  const Packet& pMask)
-{
+template <typename Scalar, typename Packet, typename DataMapper, const Index accRows, const Index accCols>
+EIGEN_ALWAYS_INLINE void gemm_cols(const DataMapper& res, const Scalar* blockA, const Scalar* blockB, Index depth,
+                                   Index strideA, Index offsetA, Index strideB, Index offsetB, Index col, Index rows,
+                                   Index remaining_rows, const Packet& pAlpha, const Packet& pMask) {
   const DataMapper res3 = res.getSubMapper(0, col);
 
-  const Scalar* rhs_base = blockB + col*strideB + MICRO_NEW_ROWS*offsetB;
-  const Scalar* lhs_base = blockA + accCols*offsetA;
+  const Scalar* rhs_base = blockB + col * strideB + MICRO_NEW_ROWS * offsetB;
+  const Scalar* lhs_base = blockA + accCols * offsetA;
   Index row = 0;
 
 #define MAX_UNROLL 7
-  while(row + MAX_UNROLL*accCols <= rows) {
+  while (row + MAX_UNROLL * accCols <= rows) {
     MICRO_UNROLL_ITER2(MAX_UNROLL, 0);
   }
-  switch( (rows-row)/accCols ) {
+  switch ((rows - row) / accCols) {
 #if MAX_UNROLL > 7
     case 7:
       MICRO_UNROLL_ITER(MICRO_UNROLL_ITER2, 7)
@@ -2321,59 +2164,50 @@
   }
 #undef MAX_UNROLL
 
-  if(remaining_rows > 0)
-  {
-    gemm_extra_row<Scalar, Packet, DataMapper, accRows, accCols>(res3, blockA, rhs_base, depth, strideA, offsetA, strideB, row, rows, remaining_rows, pAlpha, pMask);
+  if (remaining_rows > 0) {
+    gemm_extra_row<Scalar, Packet, DataMapper, accRows, accCols>(res3, blockA, rhs_base, depth, strideA, offsetA,
+                                                                 strideB, row, rows, remaining_rows, pAlpha, pMask);
   }
 }
 
-#define MICRO_EXTRA_COLS(N) \
-  gemm_cols<Scalar, Packet, DataMapper, N, accCols>(res, blockA, blockB, depth, strideA, offsetA, strideB, offsetB, col, rows, remaining_rows, pAlpha, pMask);
+#define MICRO_EXTRA_COLS(N)                                                                                         \
+  gemm_cols<Scalar, Packet, DataMapper, N, accCols>(res, blockA, blockB, depth, strideA, offsetA, strideB, offsetB, \
+                                                    col, rows, remaining_rows, pAlpha, pMask);
 
-template<typename Scalar, typename Packet, typename DataMapper, const Index accCols>
-EIGEN_ALWAYS_INLINE void gemm_extra_cols(
-  const DataMapper& res,
-  const Scalar* blockA,
-  const Scalar* blockB,
-  Index depth,
-  Index strideA,
-  Index offsetA,
-  Index strideB,
-  Index offsetB,
-  Index col,
-  Index rows,
-  Index cols,
-  Index remaining_rows,
-  const Packet& pAlpha,
-  const Packet& pMask)
-{
-  MICRO_EXTRA(MICRO_EXTRA_COLS, cols-col, true)
+template <typename Scalar, typename Packet, typename DataMapper, const Index accCols>
+EIGEN_ALWAYS_INLINE void gemm_extra_cols(const DataMapper& res, const Scalar* blockA, const Scalar* blockB, Index depth,
+                                         Index strideA, Index offsetA, Index strideB, Index offsetB, Index col,
+                                         Index rows, Index cols, Index remaining_rows, const Packet& pAlpha,
+                                         const Packet& pMask) {
+  MICRO_EXTRA(MICRO_EXTRA_COLS, cols - col, true)
 }
 
 /****************
  * GEMM kernels *
  * **************/
-template<typename Scalar, typename Packet, typename RhsPacket, typename DataMapper, const Index accRows, const Index accCols>
-EIGEN_STRONG_INLINE void gemm(const DataMapper& res, const Scalar* blockA, const Scalar* blockB, Index rows, Index depth, Index cols, Scalar alpha, Index strideA, Index strideB, Index offsetA, Index offsetB)
-{
-      const Index remaining_rows = rows % accCols;
+template <typename Scalar, typename Packet, typename RhsPacket, typename DataMapper, const Index accRows,
+          const Index accCols>
+EIGEN_STRONG_INLINE void gemm(const DataMapper& res, const Scalar* blockA, const Scalar* blockB, Index rows,
+                              Index depth, Index cols, Scalar alpha, Index strideA, Index strideB, Index offsetA,
+                              Index offsetB) {
+  const Index remaining_rows = rows % accCols;
 
-      if( strideA == -1 ) strideA = depth;
-      if( strideB == -1 ) strideB = depth;
+  if (strideA == -1) strideA = depth;
+  if (strideB == -1) strideB = depth;
 
-      const Packet pAlpha = pset1<Packet>(alpha);
-      const Packet pMask  = bmask<Packet>(remaining_rows);
+  const Packet pAlpha = pset1<Packet>(alpha);
+  const Packet pMask = bmask<Packet>(remaining_rows);
 
-      Index col = 0;
-      for(; col + accRows <= cols; col += accRows)
-      {
-        gemm_cols<Scalar, Packet, DataMapper, accRows, accCols>(res, blockA, blockB, depth, strideA, offsetA, strideB, offsetB, col, rows, remaining_rows, pAlpha, pMask);
-      }
+  Index col = 0;
+  for (; col + accRows <= cols; col += accRows) {
+    gemm_cols<Scalar, Packet, DataMapper, accRows, accCols>(res, blockA, blockB, depth, strideA, offsetA, strideB,
+                                                            offsetB, col, rows, remaining_rows, pAlpha, pMask);
+  }
 
-      if (col != cols)
-      {
-        gemm_extra_cols<Scalar, Packet, DataMapper, accCols>(res, blockA, blockB, depth, strideA, offsetA, strideB, offsetB, col, rows, cols, remaining_rows, pAlpha, pMask);
-      }
+  if (col != cols) {
+    gemm_extra_cols<Scalar, Packet, DataMapper, accCols>(res, blockA, blockB, depth, strideA, offsetA, strideB, offsetB,
+                                                         col, rows, cols, remaining_rows, pAlpha, pMask);
+  }
 }
 
 #define accColsC (accCols / 2)
@@ -2384,129 +2218,128 @@
 #define PEEL_COMPLEX 3
 #define PEEL_COMPLEX_ROW 3
 
-#define MICRO_COMPLEX_UNROLL(func) \
-  func(0) func(1) func(2) func(3)
+#define MICRO_COMPLEX_UNROLL(func) func(0) func(1) func(2) func(3)
 
-#define MICRO_COMPLEX_ZERO_PEEL(peel) \
+#define MICRO_COMPLEX_ZERO_PEEL(peel)             \
   if ((PEEL_COMPLEX_ROW > peel) && (peel != 0)) { \
-    bsetzero<Packet, accRows>(accReal##peel); \
-    bsetzero<Packet, accRows>(accImag##peel); \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(accReal##peel); \
-    EIGEN_UNUSED_VARIABLE(accImag##peel); \
+    bsetzero<Packet, accRows>(accReal##peel);     \
+    bsetzero<Packet, accRows>(accImag##peel);     \
+  } else {                                        \
+    EIGEN_UNUSED_VARIABLE(accReal##peel);         \
+    EIGEN_UNUSED_VARIABLE(accImag##peel);         \
   }
 
-#define MICRO_COMPLEX_ADD_ROWS(N, used) \
-  MICRO_ADD(ptr_real, N) \
-  if (!RhsIsReal) { \
-    MICRO_ADD(ptr_imag, N) \
-  } else if (used) { \
-    EIGEN_UNUSED_VARIABLE(MICRO_RHS(ptr_imag,0)); \
-    EIGEN_UNUSED_VARIABLE(MICRO_RHS(ptr_imag,1)); \
-    EIGEN_UNUSED_VARIABLE(MICRO_RHS(ptr_imag,2)); \
+#define MICRO_COMPLEX_ADD_ROWS(N, used)            \
+  MICRO_ADD(ptr_real, N)                           \
+  if (!RhsIsReal) {                                \
+    MICRO_ADD(ptr_imag, N)                         \
+  } else if (used) {                               \
+    EIGEN_UNUSED_VARIABLE(MICRO_RHS(ptr_imag, 0)); \
+    EIGEN_UNUSED_VARIABLE(MICRO_RHS(ptr_imag, 1)); \
+    EIGEN_UNUSED_VARIABLE(MICRO_RHS(ptr_imag, 2)); \
   }
 
-#define MICRO_COMPLEX_BROADCAST(peel) \
-  MICRO_BROADCAST1(peel, ptr_real, rhsV, false) \
-  if (!RhsIsReal) { \
+#define MICRO_COMPLEX_BROADCAST(peel)              \
+  MICRO_BROADCAST1(peel, ptr_real, rhsV, false)    \
+  if (!RhsIsReal) {                                \
     MICRO_BROADCAST1(peel, ptr_imag, rhsVi, false) \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(rhsVi##peel); \
+  } else {                                         \
+    EIGEN_UNUSED_VARIABLE(rhsVi##peel);            \
   }
 
-#define MICRO_COMPLEX_BROADCAST_EXTRA \
-  Packet rhsV[4], rhsVi[4]; \
-  MICRO_BROADCAST_EXTRA1(ptr_real, rhsV, false) \
-  if(!RhsIsReal) { \
+#define MICRO_COMPLEX_BROADCAST_EXTRA              \
+  Packet rhsV[4], rhsVi[4];                        \
+  MICRO_BROADCAST_EXTRA1(ptr_real, rhsV, false)    \
+  if (!RhsIsReal) {                                \
     MICRO_BROADCAST_EXTRA1(ptr_imag, rhsVi, false) \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(rhsVi); \
-  } \
+  } else {                                         \
+    EIGEN_UNUSED_VARIABLE(rhsVi);                  \
+  }                                                \
   MICRO_COMPLEX_ADD_ROWS(1, true)
 
-#define MICRO_COMPLEX_SRC2_PTR \
-  MICRO_SRC2(ptr_real, strideB*advanceCols, 0) \
-  if (!RhsIsReal) { \
-    MICRO_RHS(ptr_imag,0) = rhs_base + MICRO_NEW_ROWS*strideB; \
-    MICRO_SRC2(ptr_imag, strideB*advanceCols, strideB) \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(MICRO_RHS(ptr_imag,0)); \
-    EIGEN_UNUSED_VARIABLE(MICRO_RHS(ptr_imag,1)); \
-    EIGEN_UNUSED_VARIABLE(MICRO_RHS(ptr_imag,2)); \
+#define MICRO_COMPLEX_SRC2_PTR                                    \
+  MICRO_SRC2(ptr_real, strideB* advanceCols, 0)                   \
+  if (!RhsIsReal) {                                               \
+    MICRO_RHS(ptr_imag, 0) = rhs_base + MICRO_NEW_ROWS * strideB; \
+    MICRO_SRC2(ptr_imag, strideB* advanceCols, strideB)           \
+  } else {                                                        \
+    EIGEN_UNUSED_VARIABLE(MICRO_RHS(ptr_imag, 0));                \
+    EIGEN_UNUSED_VARIABLE(MICRO_RHS(ptr_imag, 1));                \
+    EIGEN_UNUSED_VARIABLE(MICRO_RHS(ptr_imag, 2));                \
   }
 
 #define MICRO_COMPLEX_ZERO_PEEL_ROW MICRO_COMPLEX_UNROLL(MICRO_COMPLEX_ZERO_PEEL)
 
-#define MICRO_COMPLEX_WORK_PEEL(peel) \
-  if (PEEL_COMPLEX_ROW > peel) { \
-    MICRO_COMPLEX_BROADCAST(peel) \
-    pgerc<accRows, Scalar, Packet, ConjugateLhs, ConjugateRhs, LhsIsReal, RhsIsReal>(&accReal##peel, &accImag##peel, lhs_ptr_real + (remaining_rows * peel), lhs_ptr_imag + (remaining_rows * peel), rhsV##peel, rhsVi##peel); \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(rhsV##peel); \
-    EIGEN_UNUSED_VARIABLE(rhsVi##peel); \
+#define MICRO_COMPLEX_WORK_PEEL(peel)                                                 \
+  if (PEEL_COMPLEX_ROW > peel) {                                                      \
+    MICRO_COMPLEX_BROADCAST(peel)                                                     \
+    pgerc<accRows, Scalar, Packet, ConjugateLhs, ConjugateRhs, LhsIsReal, RhsIsReal>( \
+        &accReal##peel, &accImag##peel, lhs_ptr_real + (remaining_rows * peel),       \
+        lhs_ptr_imag + (remaining_rows * peel), rhsV##peel, rhsVi##peel);             \
+  } else {                                                                            \
+    EIGEN_UNUSED_VARIABLE(rhsV##peel);                                                \
+    EIGEN_UNUSED_VARIABLE(rhsVi##peel);                                               \
   }
 
-#define MICRO_COMPLEX_ADD_COLS(size) \
-  lhs_ptr_real += (remaining_rows * size); \
-  if(!LhsIsReal) lhs_ptr_imag += (remaining_rows * size); \
-  else EIGEN_UNUSED_VARIABLE(lhs_ptr_imag);
+#define MICRO_COMPLEX_ADD_COLS(size)         \
+  lhs_ptr_real += (remaining_rows * size);   \
+  if (!LhsIsReal)                            \
+    lhs_ptr_imag += (remaining_rows * size); \
+  else                                       \
+    EIGEN_UNUSED_VARIABLE(lhs_ptr_imag);
 
-#define MICRO_COMPLEX_WORK_PEEL_ROW \
-  Packet rhsV0[4], rhsV1[4], rhsV2[4], rhsV3[4]; \
+#define MICRO_COMPLEX_WORK_PEEL_ROW                  \
+  Packet rhsV0[4], rhsV1[4], rhsV2[4], rhsV3[4];     \
   Packet rhsVi0[4], rhsVi1[4], rhsVi2[4], rhsVi3[4]; \
-  MICRO_COMPLEX_UNROLL(MICRO_COMPLEX_WORK_PEEL) \
-  MICRO_COMPLEX_ADD_COLS(PEEL_COMPLEX_ROW) \
+  MICRO_COMPLEX_UNROLL(MICRO_COMPLEX_WORK_PEEL)      \
+  MICRO_COMPLEX_ADD_COLS(PEEL_COMPLEX_ROW)           \
   MICRO_COMPLEX_ADD_ROWS(PEEL_COMPLEX_ROW, false)
 
-#define MICRO_COMPLEX_ADD_PEEL(peel, sum) \
-  if (PEEL_COMPLEX_ROW > peel) { \
-    for (Index i = 0; i < accRows; i++) { \
+#define MICRO_COMPLEX_ADD_PEEL(peel, sum)                \
+  if (PEEL_COMPLEX_ROW > peel) {                         \
+    for (Index i = 0; i < accRows; i++) {                \
       accReal##sum.packet[i] += accReal##peel.packet[i]; \
       accImag##sum.packet[i] += accImag##peel.packet[i]; \
-    } \
+    }                                                    \
   }
 
 #define MICRO_COMPLEX_ADD_PEEL_ROW \
-  MICRO_COMPLEX_ADD_PEEL(2, 0) MICRO_COMPLEX_ADD_PEEL(3, 1) \
-  MICRO_COMPLEX_ADD_PEEL(1, 0)
+  MICRO_COMPLEX_ADD_PEEL(2, 0) MICRO_COMPLEX_ADD_PEEL(3, 1) MICRO_COMPLEX_ADD_PEEL(1, 0)
 
-template<typename Scalar, typename Packet, const Index accRows, bool ConjugateLhs, bool ConjugateRhs, bool LhsIsReal, bool RhsIsReal, const Index remaining_rows>
-EIGEN_ALWAYS_INLINE void MICRO_COMPLEX_EXTRA_ROW(
-  const Scalar* &lhs_ptr_real, const Scalar* &lhs_ptr_imag,
-  const Scalar* &rhs_ptr_real0, const Scalar* &rhs_ptr_real1, const Scalar* &rhs_ptr_real2,
-  const Scalar* &rhs_ptr_imag0, const Scalar* &rhs_ptr_imag1, const Scalar* &rhs_ptr_imag2,
-  PacketBlock<Packet,accRows> &accReal, PacketBlock<Packet,accRows> &accImag)
-{
+template <typename Scalar, typename Packet, const Index accRows, bool ConjugateLhs, bool ConjugateRhs, bool LhsIsReal,
+          bool RhsIsReal, const Index remaining_rows>
+EIGEN_ALWAYS_INLINE void MICRO_COMPLEX_EXTRA_ROW(const Scalar*& lhs_ptr_real, const Scalar*& lhs_ptr_imag,
+                                                 const Scalar*& rhs_ptr_real0, const Scalar*& rhs_ptr_real1,
+                                                 const Scalar*& rhs_ptr_real2, const Scalar*& rhs_ptr_imag0,
+                                                 const Scalar*& rhs_ptr_imag1, const Scalar*& rhs_ptr_imag2,
+                                                 PacketBlock<Packet, accRows>& accReal,
+                                                 PacketBlock<Packet, accRows>& accImag) {
   MICRO_COMPLEX_BROADCAST_EXTRA
-  pgerc<accRows, Scalar, Packet, ConjugateLhs, ConjugateRhs, LhsIsReal, RhsIsReal>(&accReal, &accImag, lhs_ptr_real, lhs_ptr_imag, rhsV, rhsVi);
+  pgerc<accRows, Scalar, Packet, ConjugateLhs, ConjugateRhs, LhsIsReal, RhsIsReal>(&accReal, &accImag, lhs_ptr_real,
+                                                                                   lhs_ptr_imag, rhsV, rhsVi);
   MICRO_COMPLEX_ADD_COLS(1)
 }
 
-template<typename Scalar, typename Packet, typename Packetc, typename DataMapper, const Index accRows, const Index accCols, bool ConjugateLhs, bool ConjugateRhs, bool LhsIsReal, bool RhsIsReal, const Index remaining_rows>
-EIGEN_ALWAYS_INLINE void gemm_unrolled_complex_row_iteration(
-  const DataMapper& res,
-  const Scalar* lhs_base,
-  const Scalar* rhs_base,
-  Index depth,
-  Index strideA,
-  Index offsetA,
-  Index strideB,
-  Index row,
-  Index rows,
-  const Packet& pAlphaReal,
-  const Packet& pAlphaImag,
-  const Packet& pMask)
-{
-  const Scalar* rhs_ptr_real0 = rhs_base, * rhs_ptr_real1 = NULL, * rhs_ptr_real2 = NULL;
-  const Scalar* rhs_ptr_imag0 = NULL, * rhs_ptr_imag1 = NULL, * rhs_ptr_imag2 = NULL;
-  const Scalar* lhs_ptr_real = lhs_base + advanceRows*row*strideA + remaining_rows*offsetA;
+template <typename Scalar, typename Packet, typename Packetc, typename DataMapper, const Index accRows,
+          const Index accCols, bool ConjugateLhs, bool ConjugateRhs, bool LhsIsReal, bool RhsIsReal,
+          const Index remaining_rows>
+EIGEN_ALWAYS_INLINE void gemm_unrolled_complex_row_iteration(const DataMapper& res, const Scalar* lhs_base,
+                                                             const Scalar* rhs_base, Index depth, Index strideA,
+                                                             Index offsetA, Index strideB, Index row, Index rows,
+                                                             const Packet& pAlphaReal, const Packet& pAlphaImag,
+                                                             const Packet& pMask) {
+  const Scalar *rhs_ptr_real0 = rhs_base, *rhs_ptr_real1 = NULL, *rhs_ptr_real2 = NULL;
+  const Scalar *rhs_ptr_imag0 = NULL, *rhs_ptr_imag1 = NULL, *rhs_ptr_imag2 = NULL;
+  const Scalar* lhs_ptr_real = lhs_base + advanceRows * row * strideA + remaining_rows * offsetA;
   const Scalar* lhs_ptr_imag = NULL;
-  if(!LhsIsReal) lhs_ptr_imag = lhs_ptr_real + remaining_rows*strideA;
-  else EIGEN_UNUSED_VARIABLE(lhs_ptr_imag);
-  PacketBlock<Packet,accRows> accReal0, accImag0, accReal1, accImag1, accReal2, accImag2, accReal3, accImag3;
-  PacketBlock<Packet,accRows> taccReal, taccImag;
-  PacketBlock<Packetc,accRows> acc0, acc1;
-  PacketBlock<Packetc,accRows*2> tRes;
+  if (!LhsIsReal)
+    lhs_ptr_imag = lhs_ptr_real + remaining_rows * strideA;
+  else
+    EIGEN_UNUSED_VARIABLE(lhs_ptr_imag);
+  PacketBlock<Packet, accRows> accReal0, accImag0, accReal1, accImag1, accReal2, accImag2, accReal3, accImag3;
+  PacketBlock<Packet, accRows> taccReal, taccImag;
+  PacketBlock<Packetc, accRows> acc0, acc1;
+  PacketBlock<Packetc, accRows * 2> tRes;
 
   MICRO_COMPLEX_SRC2_PTR
 
@@ -2517,45 +2350,43 @@
   Index k = 0;
   if (remaining_depth >= PEEL_COMPLEX_ROW) {
     MICRO_COMPLEX_ZERO_PEEL_ROW
-    do
-    {
+    do {
       MICRO_COMPLEX_PREFETCHN(accRows)
       EIGEN_POWER_PREFETCH(lhs_ptr_real);
-      if(!LhsIsReal) {
+      if (!LhsIsReal) {
         EIGEN_POWER_PREFETCH(lhs_ptr_imag);
       }
       MICRO_COMPLEX_WORK_PEEL_ROW
     } while ((k += PEEL_COMPLEX_ROW) + PEEL_COMPLEX_ROW <= remaining_depth);
     MICRO_COMPLEX_ADD_PEEL_ROW
   }
-  for(; k < depth; k++)
-  {
-    MICRO_COMPLEX_EXTRA_ROW<Scalar, Packet, accRows, ConjugateLhs, ConjugateRhs, LhsIsReal, RhsIsReal, remaining_rows>(lhs_ptr_real, lhs_ptr_imag, rhs_ptr_real0, rhs_ptr_real1, rhs_ptr_real2, rhs_ptr_imag0, rhs_ptr_imag1, rhs_ptr_imag2, accReal0, accImag0);
+  for (; k < depth; k++) {
+    MICRO_COMPLEX_EXTRA_ROW<Scalar, Packet, accRows, ConjugateLhs, ConjugateRhs, LhsIsReal, RhsIsReal, remaining_rows>(
+        lhs_ptr_real, lhs_ptr_imag, rhs_ptr_real0, rhs_ptr_real1, rhs_ptr_real2, rhs_ptr_imag0, rhs_ptr_imag1,
+        rhs_ptr_imag2, accReal0, accImag0);
   }
 
   constexpr bool full = (remaining_rows > accColsC);
   bload<DataMapper, Packetc, accColsC, ColMajor, true, accRows, full>(tRes, res, row, 0);
-  if ((accRows == 1) || (rows >= accCols))
-  {
-    bscalec<Packet,accRows,true>(accReal0, accImag0, pAlphaReal, pAlphaImag, taccReal, taccImag, pMask);
+  if ((accRows == 1) || (rows >= accCols)) {
+    bscalec<Packet, accRows, true>(accReal0, accImag0, pAlphaReal, pAlphaImag, taccReal, taccImag, pMask);
     bcouple<Packet, Packetc, accRows, full>(taccReal, taccImag, tRes, acc0, acc1);
     bstore<DataMapper, Packetc, accRows>(acc0, res, row + 0);
     if (full) {
       bstore<DataMapper, Packetc, accRows>(acc1, res, row + accColsC);
     }
   } else {
-    bscalec<Packet,accRows,false>(accReal0, accImag0, pAlphaReal, pAlphaImag, taccReal, taccImag, pMask);
+    bscalec<Packet, accRows, false>(accReal0, accImag0, pAlphaReal, pAlphaImag, taccReal, taccImag, pMask);
     bcouple<Packet, Packetc, accRows, full>(taccReal, taccImag, tRes, acc0, acc1);
 
-    if ((sizeof(Scalar) == sizeof(float)) && (remaining_rows == 1))
-    {
-      for(Index j = 0; j < accRows; j++) {
+    if ((sizeof(Scalar) == sizeof(float)) && (remaining_rows == 1)) {
+      for (Index j = 0; j < accRows; j++) {
         res(row + 0, j) = pfirst<Packetc>(acc0.packet[j]);
       }
     } else {
       bstore<DataMapper, Packetc, accRows>(acc0, res, row + 0);
       if (full) {
-        for(Index j = 0; j < accRows; j++) {
+        for (Index j = 0; j < accRows; j++) {
           res(row + accColsC, j) = pfirst<Packetc>(acc1.packet[j]);
         }
       }
@@ -2563,59 +2394,51 @@
   }
 }
 
-#define MICRO_COMPLEX_EXTRA_ROWS(N) \
-  gemm_unrolled_complex_row_iteration<Scalar, Packet, Packetc, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, LhsIsReal, RhsIsReal, N>(res, lhs_base, rhs_base, depth, strideA, offsetA, strideB, row, rows, pAlphaReal, pAlphaImag, pMask);
+#define MICRO_COMPLEX_EXTRA_ROWS(N)                                                                        \
+  gemm_unrolled_complex_row_iteration<Scalar, Packet, Packetc, DataMapper, accRows, accCols, ConjugateLhs, \
+                                      ConjugateRhs, LhsIsReal, RhsIsReal, N>(                              \
+      res, lhs_base, rhs_base, depth, strideA, offsetA, strideB, row, rows, pAlphaReal, pAlphaImag, pMask);
 
-template<typename Scalar, typename Packet, typename Packetc, typename DataMapper, const Index accRows, const Index accCols, bool ConjugateLhs, bool ConjugateRhs, bool LhsIsReal, bool RhsIsReal>
-EIGEN_ALWAYS_INLINE void gemm_complex_extra_row(
-  const DataMapper& res,
-  const Scalar* lhs_base,
-  const Scalar* rhs_base,
-  Index depth,
-  Index strideA,
-  Index offsetA,
-  Index strideB,
-  Index row,
-  Index rows,
-  Index remaining_rows,
-  const Packet& pAlphaReal,
-  const Packet& pAlphaImag,
-  const Packet& pMask)
-{
+template <typename Scalar, typename Packet, typename Packetc, typename DataMapper, const Index accRows,
+          const Index accCols, bool ConjugateLhs, bool ConjugateRhs, bool LhsIsReal, bool RhsIsReal>
+EIGEN_ALWAYS_INLINE void gemm_complex_extra_row(const DataMapper& res, const Scalar* lhs_base, const Scalar* rhs_base,
+                                                Index depth, Index strideA, Index offsetA, Index strideB, Index row,
+                                                Index rows, Index remaining_rows, const Packet& pAlphaReal,
+                                                const Packet& pAlphaImag, const Packet& pMask) {
   MICRO_EXTRA(MICRO_COMPLEX_EXTRA_ROWS, remaining_rows, false)
 }
 
 #define MICRO_COMPLEX_UNROLL_WORK(func, func2, peel) \
-  MICRO_COMPLEX_UNROLL(func2); \
-  func(0,peel) func(1,peel) func(2,peel) func(3,peel)
+  MICRO_COMPLEX_UNROLL(func2);                       \
+  func(0, peel) func(1, peel) func(2, peel) func(3, peel)
 
-#define MICRO_COMPLEX_WORK_ONE4(iter, peel) \
-  if (unroll_factor > iter) { \
-    pgerc_common<accRows, Packet, ConjugateLhs, ConjugateRhs, LhsIsReal, RhsIsReal>(&accReal##iter, &accImag##iter, lhsV##iter, lhsVi##iter, rhsV##peel, rhsVi##peel); \
+#define MICRO_COMPLEX_WORK_ONE4(iter, peel)                                                \
+  if (unroll_factor > iter) {                                                              \
+    pgerc_common<accRows, Packet, ConjugateLhs, ConjugateRhs, LhsIsReal, RhsIsReal>(       \
+        &accReal##iter, &accImag##iter, lhsV##iter, lhsVi##iter, rhsV##peel, rhsVi##peel); \
   }
 
 #define MICRO_COMPLEX_TYPE_PEEL4(func, func2, peel) \
-  if (PEEL_COMPLEX > peel) { \
-    Packet lhsV0, lhsV1, lhsV2, lhsV3; \
-    Packet lhsVi0, lhsVi1, lhsVi2, lhsVi3; \
-    MICRO_COMPLEX_BROADCAST(peel) \
-    MICRO_COMPLEX_UNROLL_WORK(func, func2, peel) \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(rhsV##peel); \
-    EIGEN_UNUSED_VARIABLE(rhsVi##peel); \
+  if (PEEL_COMPLEX > peel) {                        \
+    Packet lhsV0, lhsV1, lhsV2, lhsV3;              \
+    Packet lhsVi0, lhsVi1, lhsVi2, lhsVi3;          \
+    MICRO_COMPLEX_BROADCAST(peel)                   \
+    MICRO_COMPLEX_UNROLL_WORK(func, func2, peel)    \
+  } else {                                          \
+    EIGEN_UNUSED_VARIABLE(rhsV##peel);              \
+    EIGEN_UNUSED_VARIABLE(rhsVi##peel);             \
   }
 
 #define MICRO_COMPLEX_UNROLL_TYPE_PEEL(M, func, func1, func2) \
-  Packet rhsV0[M], rhsV1[M], rhsV2[M], rhsV3[M]; \
-  Packet rhsVi0[M], rhsVi1[M], rhsVi2[M], rhsVi3[M]; \
-  func(func1,func2,0) func(func1,func2,1) \
-  func(func1,func2,2) func(func1,func2,3)
+  Packet rhsV0[M], rhsV1[M], rhsV2[M], rhsV3[M];              \
+  Packet rhsVi0[M], rhsVi1[M], rhsVi2[M], rhsVi3[M];          \
+  func(func1, func2, 0) func(func1, func2, 1) func(func1, func2, 2) func(func1, func2, 3)
 
 #define MICRO_COMPLEX_UNROLL_TYPE_ONE(M, func, func1, func2) \
-  Packet rhsV0[M], rhsVi0[M];\
-  func(func1,func2,0)
+  Packet rhsV0[M], rhsVi0[M];                                \
+  func(func1, func2, 0)
 
-#define MICRO_COMPLEX_UNROLL_TYPE(MICRO_COMPLEX_TYPE, size) \
+#define MICRO_COMPLEX_UNROLL_TYPE(MICRO_COMPLEX_TYPE, size)                                        \
   MICRO_COMPLEX_TYPE(4, MICRO_COMPLEX_TYPE_PEEL4, MICRO_COMPLEX_WORK_ONE4, MICRO_COMPLEX_LOAD_ONE) \
   MICRO_COMPLEX_ADD_ROWS(size, false)
 
@@ -2623,13 +2446,13 @@
 
 #define MICRO_COMPLEX_ONE4 MICRO_COMPLEX_UNROLL_TYPE(MICRO_COMPLEX_UNROLL_TYPE_ONE, 1)
 
-#define MICRO_COMPLEX_DST_PTR_ONE(iter) \
-  if (unroll_factor > iter) { \
+#define MICRO_COMPLEX_DST_PTR_ONE(iter)       \
+  if (unroll_factor > iter) {                 \
     bsetzero<Packet, accRows>(accReal##iter); \
     bsetzero<Packet, accRows>(accImag##iter); \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(accReal##iter); \
-    EIGEN_UNUSED_VARIABLE(accImag##iter); \
+  } else {                                    \
+    EIGEN_UNUSED_VARIABLE(accReal##iter);     \
+    EIGEN_UNUSED_VARIABLE(accImag##iter);     \
   }
 
 #define MICRO_COMPLEX_DST_PTR MICRO_COMPLEX_UNROLL(MICRO_COMPLEX_DST_PTR_ONE)
@@ -2638,59 +2461,52 @@
 
 #define MICRO_COMPLEX_PREFETCH MICRO_COMPLEX_UNROLL(MICRO_COMPLEX_PREFETCH_ONE)
 
-#define MICRO_COMPLEX_STORE_ONE(iter) \
-  if (unroll_factor > iter) { \
-    constexpr bool full = ((MICRO_NORMAL(iter)) || (accCols2 > accColsC)); \
-    bload<DataMapper, Packetc, accColsC, ColMajor, true, accRows, full>(tRes, res, row + iter*accCols, 0); \
-    bscalec<Packet,accRows,!(MICRO_NORMAL(iter))>(accReal##iter, accImag##iter, pAlphaReal, pAlphaImag, taccReal, taccImag, pMask); \
-    bcouple<Packet, Packetc, accRows, full>(taccReal, taccImag, tRes, acc0, acc1); \
-    bstore<DataMapper, Packetc, accRows>(acc0, res, row + iter*accCols + 0); \
-    if (full) { \
-      bstore<DataMapper, Packetc, accRows>(acc1, res, row + iter*accCols + accColsC); \
-    } \
+#define MICRO_COMPLEX_STORE_ONE(iter)                                                                               \
+  if (unroll_factor > iter) {                                                                                       \
+    constexpr bool full = ((MICRO_NORMAL(iter)) || (accCols2 > accColsC));                                          \
+    bload<DataMapper, Packetc, accColsC, ColMajor, true, accRows, full>(tRes, res, row + iter * accCols, 0);        \
+    bscalec<Packet, accRows, !(MICRO_NORMAL(iter))>(accReal##iter, accImag##iter, pAlphaReal, pAlphaImag, taccReal, \
+                                                    taccImag, pMask);                                               \
+    bcouple<Packet, Packetc, accRows, full>(taccReal, taccImag, tRes, acc0, acc1);                                  \
+    bstore<DataMapper, Packetc, accRows>(acc0, res, row + iter * accCols + 0);                                      \
+    if (full) {                                                                                                     \
+      bstore<DataMapper, Packetc, accRows>(acc1, res, row + iter * accCols + accColsC);                             \
+    }                                                                                                               \
   }
 
 #define MICRO_COMPLEX_STORE MICRO_COMPLEX_UNROLL(MICRO_COMPLEX_STORE_ONE)
 
-template<int unroll_factor, typename Scalar, typename Packet, typename Packetc, typename DataMapper, const Index accRows, const Index accCols, const Index accCols2, bool ConjugateLhs, bool ConjugateRhs, bool LhsIsReal, bool RhsIsReal>
-EIGEN_ALWAYS_INLINE void gemm_complex_unrolled_iteration(
-  const DataMapper& res,
-  const Scalar* lhs_base,
-  const Scalar* rhs_base,
-  Index depth,
-  Index strideA,
-  Index offsetA,
-  Index strideB,
-  Index& row,
-  const Packet& pAlphaReal,
-  const Packet& pAlphaImag,
-  const Packet& pMask)
-{
-  const Scalar* rhs_ptr_real0 = rhs_base, * rhs_ptr_real1 = NULL, * rhs_ptr_real2 = NULL;
-  const Scalar* rhs_ptr_imag0 = NULL, * rhs_ptr_imag1 = NULL, * rhs_ptr_imag2 = NULL;
-  const Index imag_delta = accCols*strideA;
-  const Index imag_delta2 = accCols2*strideA;
-  const Scalar* lhs_ptr_real0 = NULL, * lhs_ptr_real1 = NULL;
-  const Scalar* lhs_ptr_real2 = NULL, * lhs_ptr_real3 = NULL;
-  PacketBlock<Packet,accRows> accReal0, accImag0, accReal1, accImag1;
-  PacketBlock<Packet,accRows> accReal2, accImag2, accReal3, accImag3;
-  PacketBlock<Packet,accRows> taccReal, taccImag;
-  PacketBlock<Packetc,accRows> acc0, acc1;
-  PacketBlock<Packetc,accRows*2> tRes;
+template <int unroll_factor, typename Scalar, typename Packet, typename Packetc, typename DataMapper,
+          const Index accRows, const Index accCols, const Index accCols2, bool ConjugateLhs, bool ConjugateRhs,
+          bool LhsIsReal, bool RhsIsReal>
+EIGEN_ALWAYS_INLINE void gemm_complex_unrolled_iteration(const DataMapper& res, const Scalar* lhs_base,
+                                                         const Scalar* rhs_base, Index depth, Index strideA,
+                                                         Index offsetA, Index strideB, Index& row,
+                                                         const Packet& pAlphaReal, const Packet& pAlphaImag,
+                                                         const Packet& pMask) {
+  const Scalar *rhs_ptr_real0 = rhs_base, *rhs_ptr_real1 = NULL, *rhs_ptr_real2 = NULL;
+  const Scalar *rhs_ptr_imag0 = NULL, *rhs_ptr_imag1 = NULL, *rhs_ptr_imag2 = NULL;
+  const Index imag_delta = accCols * strideA;
+  const Index imag_delta2 = accCols2 * strideA;
+  const Scalar *lhs_ptr_real0 = NULL, *lhs_ptr_real1 = NULL;
+  const Scalar *lhs_ptr_real2 = NULL, *lhs_ptr_real3 = NULL;
+  PacketBlock<Packet, accRows> accReal0, accImag0, accReal1, accImag1;
+  PacketBlock<Packet, accRows> accReal2, accImag2, accReal3, accImag3;
+  PacketBlock<Packet, accRows> taccReal, taccImag;
+  PacketBlock<Packetc, accRows> acc0, acc1;
+  PacketBlock<Packetc, accRows * 2> tRes;
 
   MICRO_COMPLEX_SRC2_PTR
   MICRO_COMPLEX_SRC_PTR
   MICRO_COMPLEX_DST_PTR
 
   Index k = 0;
-  for(; k + PEEL_COMPLEX <= depth; k+= PEEL_COMPLEX)
-  {
+  for (; k + PEEL_COMPLEX <= depth; k += PEEL_COMPLEX) {
     MICRO_COMPLEX_PREFETCHN(accRows)
     MICRO_COMPLEX_PREFETCH
     MICRO_COMPLEX_ONE_PEEL4
   }
-  for(; k < depth; k++)
-  {
+  for (; k < depth; k++) {
     MICRO_COMPLEX_ONE4
   }
   MICRO_COMPLEX_STORE
@@ -2698,38 +2514,29 @@
   MICRO_COMPLEX_UPDATE
 }
 
-#define MICRO_COMPLEX_UNROLL_ITER2(N, M) \
-  gemm_complex_unrolled_iteration<N + (M ? 1 : 0), Scalar, Packet, Packetc, DataMapper, accRows, accCols, M ? M : accCols, ConjugateLhs, ConjugateRhs, LhsIsReal, RhsIsReal>(res3, lhs_base, rhs_base, depth, strideA, offsetA, strideB, row, pAlphaReal, pAlphaImag, pMask); \
+#define MICRO_COMPLEX_UNROLL_ITER2(N, M)                                                                  \
+  gemm_complex_unrolled_iteration<N + (M ? 1 : 0), Scalar, Packet, Packetc, DataMapper, accRows, accCols, \
+                                  M ? M : accCols, ConjugateLhs, ConjugateRhs, LhsIsReal, RhsIsReal>(     \
+      res3, lhs_base, rhs_base, depth, strideA, offsetA, strideB, row, pAlphaReal, pAlphaImag, pMask);    \
   if (M) return;
 
-template<typename Scalar, typename Packet, typename Packetc, typename DataMapper, const Index accRows, const Index accCols, bool ConjugateLhs, bool ConjugateRhs, bool LhsIsReal, bool RhsIsReal>
-EIGEN_ALWAYS_INLINE void gemm_complex_cols(
-  const DataMapper& res,
-  const Scalar* blockA,
-  const Scalar* blockB,
-  Index depth,
-  Index strideA,
-  Index offsetA,
-  Index strideB,
-  Index offsetB,
-  Index col,
-  Index rows,
-  Index remaining_rows,
-  const Packet& pAlphaReal,
-  const Packet& pAlphaImag,
-  const Packet& pMask)
-{
+template <typename Scalar, typename Packet, typename Packetc, typename DataMapper, const Index accRows,
+          const Index accCols, bool ConjugateLhs, bool ConjugateRhs, bool LhsIsReal, bool RhsIsReal>
+EIGEN_ALWAYS_INLINE void gemm_complex_cols(const DataMapper& res, const Scalar* blockA, const Scalar* blockB,
+                                           Index depth, Index strideA, Index offsetA, Index strideB, Index offsetB,
+                                           Index col, Index rows, Index remaining_rows, const Packet& pAlphaReal,
+                                           const Packet& pAlphaImag, const Packet& pMask) {
   const DataMapper res3 = res.getSubMapper(0, col);
 
-  const Scalar* rhs_base = blockB + advanceCols*col*strideB + MICRO_NEW_ROWS*offsetB;
-  const Scalar* lhs_base = blockA + accCols*offsetA;
+  const Scalar* rhs_base = blockB + advanceCols * col * strideB + MICRO_NEW_ROWS * offsetB;
+  const Scalar* lhs_base = blockA + accCols * offsetA;
   Index row = 0;
 
 #define MAX_COMPLEX_UNROLL 4
-  while(row + MAX_COMPLEX_UNROLL*accCols <= rows) {
+  while (row + MAX_COMPLEX_UNROLL * accCols <= rows) {
     MICRO_COMPLEX_UNROLL_ITER2(MAX_COMPLEX_UNROLL, 0);
   }
-  switch( (rows-row)/accCols ) {
+  switch ((rows - row) / accCols) {
 #if MAX_COMPLEX_UNROLL > 4
     case 4:
       MICRO_COMPLEX_UNROLL_ITER(MICRO_COMPLEX_UNROLL_ITER2, 4)
@@ -2755,87 +2562,81 @@
   }
 #undef MAX_COMPLEX_UNROLL
 
-  if(remaining_rows > 0)
-  {
-    gemm_complex_extra_row<Scalar, Packet, Packetc, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, LhsIsReal, RhsIsReal>(res3, blockA, rhs_base, depth, strideA, offsetA, strideB, row, rows, remaining_rows, pAlphaReal, pAlphaImag, pMask);
+  if (remaining_rows > 0) {
+    gemm_complex_extra_row<Scalar, Packet, Packetc, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, LhsIsReal,
+                           RhsIsReal>(res3, blockA, rhs_base, depth, strideA, offsetA, strideB, row, rows,
+                                      remaining_rows, pAlphaReal, pAlphaImag, pMask);
   }
 }
 
-#define MICRO_COMPLEX_EXTRA_COLS(N) \
-  gemm_complex_cols<Scalar, Packet, Packetc, DataMapper, N, accCols, ConjugateLhs, ConjugateRhs, LhsIsReal, RhsIsReal>(res, blockA, blockB, depth, strideA, offsetA, strideB, offsetB, col, rows, remaining_rows, pAlphaReal, pAlphaImag, pMask);
+#define MICRO_COMPLEX_EXTRA_COLS(N)                                                                         \
+  gemm_complex_cols<Scalar, Packet, Packetc, DataMapper, N, accCols, ConjugateLhs, ConjugateRhs, LhsIsReal, \
+                    RhsIsReal>(res, blockA, blockB, depth, strideA, offsetA, strideB, offsetB, col, rows,   \
+                               remaining_rows, pAlphaReal, pAlphaImag, pMask);
 
-template<typename Scalar, typename Packet, typename Packetc, typename DataMapper, const Index accCols, bool ConjugateLhs, bool ConjugateRhs, bool LhsIsReal, bool RhsIsReal>
-EIGEN_ALWAYS_INLINE void gemm_complex_extra_cols(
-  const DataMapper& res,
-  const Scalar* blockA,
-  const Scalar* blockB,
-  Index depth,
-  Index strideA,
-  Index offsetA,
-  Index strideB,
-  Index offsetB,
-  Index col,
-  Index rows,
-  Index cols,
-  Index remaining_rows,
-  const Packet& pAlphaReal,
-  const Packet& pAlphaImag,
-  const Packet& pMask)
-{
-  MICRO_EXTRA(MICRO_COMPLEX_EXTRA_COLS, cols-col, true)
+template <typename Scalar, typename Packet, typename Packetc, typename DataMapper, const Index accCols,
+          bool ConjugateLhs, bool ConjugateRhs, bool LhsIsReal, bool RhsIsReal>
+EIGEN_ALWAYS_INLINE void gemm_complex_extra_cols(const DataMapper& res, const Scalar* blockA, const Scalar* blockB,
+                                                 Index depth, Index strideA, Index offsetA, Index strideB,
+                                                 Index offsetB, Index col, Index rows, Index cols, Index remaining_rows,
+                                                 const Packet& pAlphaReal, const Packet& pAlphaImag,
+                                                 const Packet& pMask) {
+  MICRO_EXTRA(MICRO_COMPLEX_EXTRA_COLS, cols - col, true)
 }
 
-template<typename LhsScalar, typename RhsScalar, typename Scalarc, typename Scalar, typename Packet, typename Packetc, typename RhsPacket, typename DataMapper, const Index accRows, const Index accCols, bool ConjugateLhs, bool ConjugateRhs, bool LhsIsReal, bool RhsIsReal>
-EIGEN_STRONG_INLINE void gemm_complex(const DataMapper& res, const LhsScalar* blockAc, const RhsScalar* blockBc, Index rows, Index depth, Index cols, Scalarc alpha, Index strideA, Index strideB, Index offsetA, Index offsetB)
-{
-      const Index remaining_rows = rows % accCols;
+template <typename LhsScalar, typename RhsScalar, typename Scalarc, typename Scalar, typename Packet, typename Packetc,
+          typename RhsPacket, typename DataMapper, const Index accRows, const Index accCols, bool ConjugateLhs,
+          bool ConjugateRhs, bool LhsIsReal, bool RhsIsReal>
+EIGEN_STRONG_INLINE void gemm_complex(const DataMapper& res, const LhsScalar* blockAc, const RhsScalar* blockBc,
+                                      Index rows, Index depth, Index cols, Scalarc alpha, Index strideA, Index strideB,
+                                      Index offsetA, Index offsetB) {
+  const Index remaining_rows = rows % accCols;
 
-      if( strideA == -1 ) strideA = depth;
-      if( strideB == -1 ) strideB = depth;
+  if (strideA == -1) strideA = depth;
+  if (strideB == -1) strideB = depth;
 
-      const Packet pAlphaReal = pset1<Packet>(alpha.real());
-      const Packet pAlphaImag = pset1<Packet>(alpha.imag());
-      const Packet pMask = bmask<Packet>(remaining_rows);
+  const Packet pAlphaReal = pset1<Packet>(alpha.real());
+  const Packet pAlphaImag = pset1<Packet>(alpha.imag());
+  const Packet pMask = bmask<Packet>(remaining_rows);
 
-      const Scalar* blockA = (Scalar *) blockAc;
-      const Scalar* blockB = (Scalar *) blockBc;
+  const Scalar* blockA = (Scalar*)blockAc;
+  const Scalar* blockB = (Scalar*)blockBc;
 
-      Index col = 0;
-      for(; col + accRows <= cols; col += accRows)
-      {
-        gemm_complex_cols<Scalar, Packet, Packetc, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, LhsIsReal, RhsIsReal>(res, blockA, blockB, depth, strideA, offsetA, strideB, offsetB, col, rows, remaining_rows, pAlphaReal, pAlphaImag, pMask);
-      }
+  Index col = 0;
+  for (; col + accRows <= cols; col += accRows) {
+    gemm_complex_cols<Scalar, Packet, Packetc, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, LhsIsReal,
+                      RhsIsReal>(res, blockA, blockB, depth, strideA, offsetA, strideB, offsetB, col, rows,
+                                 remaining_rows, pAlphaReal, pAlphaImag, pMask);
+  }
 
-      if (col != cols)
-      {
-        gemm_complex_extra_cols<Scalar, Packet, Packetc, DataMapper, accCols, ConjugateLhs, ConjugateRhs, LhsIsReal, RhsIsReal>(res, blockA, blockB, depth, strideA, offsetA, strideB, offsetB, col, rows, cols, remaining_rows, pAlphaReal, pAlphaImag, pMask);
-      }
+  if (col != cols) {
+    gemm_complex_extra_cols<Scalar, Packet, Packetc, DataMapper, accCols, ConjugateLhs, ConjugateRhs, LhsIsReal,
+                            RhsIsReal>(res, blockA, blockB, depth, strideA, offsetA, strideB, offsetB, col, rows, cols,
+                                       remaining_rows, pAlphaReal, pAlphaImag, pMask);
+  }
 }
 
 #undef accColsC
 #undef advanceCols
 #undef advanceRows
 
-EIGEN_ALWAYS_INLINE bool supportsMMA()
-{
+EIGEN_ALWAYS_INLINE bool supportsMMA() {
 #if defined(EIGEN_ALTIVEC_MMA_ONLY)
   return true;
 #elif defined(EIGEN_ALTIVEC_MMA_DYNAMIC_DISPATCH) && defined(__BUILTIN_CPU_SUPPORTS__)
-  return __builtin_cpu_supports ("arch_3_1") && __builtin_cpu_supports ("mma");
+  return __builtin_cpu_supports("arch_3_1") && __builtin_cpu_supports("mma");
 #else
   return false;  // No dynamic dispatch for LLVM or older GCC
 #endif
 }
 
-EIGEN_ALWAYS_INLINE Packet4f loadAndMultiplyF32(Packet4f acc, const Packet4f pAlpha, float* result)
-{
+EIGEN_ALWAYS_INLINE Packet4f loadAndMultiplyF32(Packet4f acc, const Packet4f pAlpha, float* result) {
   Packet4f result_block = ploadu<Packet4f>(result);
   return pmadd(acc, pAlpha, result_block);
 }
 
-template<bool lhsExtraRows>
-EIGEN_ALWAYS_INLINE void storeF32(float*& result, Packet4f result_block, Index rows, Index extra_rows)
-{
+template <bool lhsExtraRows>
+EIGEN_ALWAYS_INLINE void storeF32(float*& result, Packet4f result_block, Index rows, Index extra_rows) {
   if (lhsExtraRows) {
     pstoreu_partial(result, result_block, extra_rows);
   } else {
@@ -2844,31 +2645,30 @@
   result += rows;
 }
 
-template<bool rhsExtraCols, bool lhsExtraRows>
-EIGEN_ALWAYS_INLINE void storeResults(Packet4f (&acc)[4], Index rows, const Packet4f pAlpha, float* result, Index extra_cols, Index extra_rows)
-{
+template <bool rhsExtraCols, bool lhsExtraRows>
+EIGEN_ALWAYS_INLINE void storeResults(Packet4f (&acc)[4], Index rows, const Packet4f pAlpha, float* result,
+                                      Index extra_cols, Index extra_rows) {
   Index x = 0;
   if (rhsExtraCols) {
-    do{
+    do {
       Packet4f result_block = loadAndMultiplyF32(acc[x], pAlpha, result);
       storeF32<lhsExtraRows>(result, result_block, rows, extra_rows);
     } while (++x < extra_cols);
   } else {
     Packet4f result_block[4];
-    float *result2 = result;
-    do{
+    float* result2 = result;
+    do {
       result_block[x] = loadAndMultiplyF32(acc[x], pAlpha, result);
       result += rows;
     } while (++x < 4);
     x = 0;
-    do{
+    do {
       storeF32<lhsExtraRows>(result2, result_block[x], rows, extra_rows);
     } while (++x < 4);
   }
 }
 
-EIGEN_ALWAYS_INLINE Packet4f oneConvertBF16Hi(Packet8us data)
-{
+EIGEN_ALWAYS_INLINE Packet4f oneConvertBF16Hi(Packet8us data) {
   Packet8us z = pset1<Packet8us>(0);
 #ifdef _BIG_ENDIAN
   return reinterpret_cast<Packet4f>(vec_mergeh(data, z));
@@ -2877,8 +2677,7 @@
 #endif
 }
 
-EIGEN_ALWAYS_INLINE Packet4f oneConvertBF16Lo(Packet8us data)
-{
+EIGEN_ALWAYS_INLINE Packet4f oneConvertBF16Lo(Packet8us data) {
   Packet8us z = pset1<Packet8us>(0);
 #ifdef _BIG_ENDIAN
   return reinterpret_cast<Packet4f>(vec_mergel(data, z));
@@ -2887,12 +2686,11 @@
 #endif
 }
 
-template<Index N, Index M>
-EIGEN_ALWAYS_INLINE void storeConvertTwoBF16(float* to, PacketBlock<Packet8bf,(N+7)/8>& block, Index extra = 0)
-{
+template <Index N, Index M>
+EIGEN_ALWAYS_INLINE void storeConvertTwoBF16(float* to, PacketBlock<Packet8bf, (N + 7) / 8>& block, Index extra = 0) {
   if (N < 4) {
-    pstoreu_partial(to +  0, oneConvertBF16Hi(block.packet[0].m_val), extra);
-  } else if (N >= (M*8+4)) {
+    pstoreu_partial(to + 0, oneConvertBF16Hi(block.packet[0].m_val), extra);
+  } else if (N >= (M * 8 + 4)) {
     pstoreu(to + 0, oneConvertBF16Hi(block.packet[M].m_val));
     if (N >= 8) {
       pstoreu(to + 4, oneConvertBF16Lo(block.packet[M].m_val));
@@ -2900,9 +2698,8 @@
   }
 }
 
-template<Index N>
-EIGEN_ALWAYS_INLINE void storeConvertBlockBF16(float* to, PacketBlock<Packet8bf,(N+7)/8>& block, Index extra)
-{
+template <Index N>
+EIGEN_ALWAYS_INLINE void storeConvertBlockBF16(float* to, PacketBlock<Packet8bf, (N + 7) / 8>& block, Index extra) {
   storeConvertTwoBF16<N, 0>(to + 0, block, extra);
   if (N >= 16) {
     storeConvertTwoBF16<N, 1>(to + 8, block);
@@ -2913,28 +2710,26 @@
   }
 }
 
-template<bool non_unit_stride, Index delta>
-EIGEN_ALWAYS_INLINE Packet8bf loadBF16fromResult(bfloat16* src, Index resInc)
-{
+template <bool non_unit_stride, Index delta>
+EIGEN_ALWAYS_INLINE Packet8bf loadBF16fromResult(bfloat16* src, Index resInc) {
   if (non_unit_stride) {
-    return pgather<bfloat16, Packet8bf>(src + delta*resInc, resInc);
+    return pgather<bfloat16, Packet8bf>(src + delta * resInc, resInc);
   } else {
     return ploadu<Packet8bf>(src + delta);
   }
 }
 
-static Packet16uc p16uc_MERGE16_32_1 = {  0, 1, 16,17,  2, 3, 18,19,  0, 1, 16,17,  2, 3, 18,19 };
-static Packet16uc p16uc_MERGE16_32_2 = {  4, 5, 20,21,  6, 7, 22,23,  4, 5, 20,21,  6, 7, 22,23 };
-static Packet16uc p16uc_MERGE16_32_3 = {  8, 9, 24,25, 10,11, 26,27,  8, 9, 24,25, 10,11, 26,27 };
-static Packet16uc p16uc_MERGE16_32_4 = { 12,13, 28,29, 14,15, 30,31, 12,13, 28,29, 14,15, 30,31 };
+static Packet16uc p16uc_MERGE16_32_1 = {0, 1, 16, 17, 2, 3, 18, 19, 0, 1, 16, 17, 2, 3, 18, 19};
+static Packet16uc p16uc_MERGE16_32_2 = {4, 5, 20, 21, 6, 7, 22, 23, 4, 5, 20, 21, 6, 7, 22, 23};
+static Packet16uc p16uc_MERGE16_32_3 = {8, 9, 24, 25, 10, 11, 26, 27, 8, 9, 24, 25, 10, 11, 26, 27};
+static Packet16uc p16uc_MERGE16_32_4 = {12, 13, 28, 29, 14, 15, 30, 31, 12, 13, 28, 29, 14, 15, 30, 31};
 
-static Packet16uc p16uc_MERGE16_32_5 = { 0,1, 16,17, 16,17, 16,17, 0,1, 16,17, 16,17, 16,17 };
-static Packet16uc p16uc_MERGE16_32_6 = { 2,3, 18,19, 18,19, 18,19, 2,3, 18,19, 18,19, 18,19 };
-static Packet16uc p16uc_MERGE16_32_7 = { 4,5, 20,21, 20,21, 20,21, 4,5, 20,21, 20,21, 20,21 };
-static Packet16uc p16uc_MERGE16_32_8 = { 6,7, 22,23, 22,23, 22,23, 6,7, 22,23, 22,23, 22,23 };
+static Packet16uc p16uc_MERGE16_32_5 = {0, 1, 16, 17, 16, 17, 16, 17, 0, 1, 16, 17, 16, 17, 16, 17};
+static Packet16uc p16uc_MERGE16_32_6 = {2, 3, 18, 19, 18, 19, 18, 19, 2, 3, 18, 19, 18, 19, 18, 19};
+static Packet16uc p16uc_MERGE16_32_7 = {4, 5, 20, 21, 20, 21, 20, 21, 4, 5, 20, 21, 20, 21, 20, 21};
+static Packet16uc p16uc_MERGE16_32_8 = {6, 7, 22, 23, 22, 23, 22, 23, 6, 7, 22, 23, 22, 23, 22, 23};
 
-EIGEN_ALWAYS_INLINE Packet4f oneConvertBF16Perm(Packet8us data, Packet16uc mask)
-{
+EIGEN_ALWAYS_INLINE Packet4f oneConvertBF16Perm(Packet8us data, Packet16uc mask) {
   Packet8us z = pset1<Packet8us>(0);
 #ifdef _BIG_ENDIAN
   return reinterpret_cast<Packet4f>(vec_perm(data, z, mask));
@@ -2943,63 +2738,62 @@
 #endif
 }
 
-template<bool lhsExtraRows, bool odd, Index size>
-EIGEN_ALWAYS_INLINE void convertArrayPointerBF16toF32DupOne(float *result, Index rows, const bfloat16* src, Index extra_rows)
-{
-  Packet4f dup[4*4];
+template <bool lhsExtraRows, bool odd, Index size>
+EIGEN_ALWAYS_INLINE void convertArrayPointerBF16toF32DupOne(float* result, Index rows, const bfloat16* src,
+                                                            Index extra_rows) {
+  Packet4f dup[4 * 4];
   Packet8bf data[4];
 
   for (Index i = 0; i < size; i++) {
-    data[i] = ploadu<Packet8bf>(src + rows*i);
+    data[i] = ploadu<Packet8bf>(src + rows * i);
   }
 
   for (Index i = 0, j = 0; i < size; i++, j += 4) {
-    dup[j+0] = oneConvertBF16Perm(data[i].m_val, odd ? p16uc_MERGE16_32_5 : p16uc_MERGE16_32_1);
-    dup[j+1] = oneConvertBF16Perm(data[i].m_val, odd ? p16uc_MERGE16_32_6 : p16uc_MERGE16_32_2);
-    dup[j+2] = oneConvertBF16Perm(data[i].m_val, odd ? p16uc_MERGE16_32_7 : p16uc_MERGE16_32_3);
-    dup[j+3] = oneConvertBF16Perm(data[i].m_val, odd ? p16uc_MERGE16_32_8 : p16uc_MERGE16_32_4);
+    dup[j + 0] = oneConvertBF16Perm(data[i].m_val, odd ? p16uc_MERGE16_32_5 : p16uc_MERGE16_32_1);
+    dup[j + 1] = oneConvertBF16Perm(data[i].m_val, odd ? p16uc_MERGE16_32_6 : p16uc_MERGE16_32_2);
+    dup[j + 2] = oneConvertBF16Perm(data[i].m_val, odd ? p16uc_MERGE16_32_7 : p16uc_MERGE16_32_3);
+    dup[j + 3] = oneConvertBF16Perm(data[i].m_val, odd ? p16uc_MERGE16_32_8 : p16uc_MERGE16_32_4);
   }
 
-  for (Index j = 0; j < 4*size; j += 4) {
+  for (Index j = 0; j < 4 * size; j += 4) {
     if (lhsExtraRows) {
       Packet4f z = pset1<Packet4f>(float(0));
       Index i = 0;
       do {
-        pstoreu(result + (j+i)*4, dup[j+i]);
+        pstoreu(result + (j + i) * 4, dup[j + i]);
       } while (++i < extra_rows);
       do {
-        pstoreu(result + (j+i)*4, z);
+        pstoreu(result + (j + i) * 4, z);
       } while (++i < 4);
     } else {
       for (Index i = 0; i < 4; i++) {
-        pstoreu(result + (j+i)*4, dup[j+i]);
+        pstoreu(result + (j + i) * 4, dup[j + i]);
       }
     }
   }
 }
 
-template<bool lhsExtraRows>
-EIGEN_ALWAYS_INLINE void convertArrayPointerBF16toF32Dup(float *result, Index cols, Index rows, const bfloat16* src, Index delta, Index extra_rows)
-{
+template <bool lhsExtraRows>
+EIGEN_ALWAYS_INLINE void convertArrayPointerBF16toF32Dup(float* result, Index cols, Index rows, const bfloat16* src,
+                                                         Index delta, Index extra_rows) {
   Index col = 0;
-  src += delta*2;
-  for(; col + 4*2 <= cols; col += 4*2, result += 4*4*4, src += 4*rows) {
-    convertArrayPointerBF16toF32DupOne<lhsExtraRows,false,4>(result, rows, src, extra_rows);
+  src += delta * 2;
+  for (; col + 4 * 2 <= cols; col += 4 * 2, result += 4 * 4 * 4, src += 4 * rows) {
+    convertArrayPointerBF16toF32DupOne<lhsExtraRows, false, 4>(result, rows, src, extra_rows);
   }
-  for(; col + 2 <= cols; col += 2, result += 4*4, src += rows) {
-    convertArrayPointerBF16toF32DupOne<lhsExtraRows,false,1>(result, rows, src, extra_rows);
+  for (; col + 2 <= cols; col += 2, result += 4 * 4, src += rows) {
+    convertArrayPointerBF16toF32DupOne<lhsExtraRows, false, 1>(result, rows, src, extra_rows);
   }
   if (cols & 1) {
-    convertArrayPointerBF16toF32DupOne<lhsExtraRows,true,1>(result, rows, src - delta, extra_rows);
+    convertArrayPointerBF16toF32DupOne<lhsExtraRows, true, 1>(result, rows, src - delta, extra_rows);
   }
 }
 
-template<const Index size, bool non_unit_stride>
-EIGEN_ALWAYS_INLINE void convertPointerBF16toF32(Index& i, float *result, Index rows, bfloat16*& src, Index resInc)
-{
+template <const Index size, bool non_unit_stride>
+EIGEN_ALWAYS_INLINE void convertPointerBF16toF32(Index& i, float* result, Index rows, bfloat16*& src, Index resInc) {
   constexpr Index extra = ((size < 4) ? 4 : size);
   while (i + size <= rows) {
-    PacketBlock<Packet8bf,(size+7)/8> r32;
+    PacketBlock<Packet8bf, (size + 7) / 8> r32;
     r32.packet[0] = loadBF16fromResult<non_unit_stride, 0>(src, resInc);
     if (size >= 16) {
       r32.packet[1] = loadBF16fromResult<non_unit_stride, 8>(src, resInc);
@@ -3009,41 +2803,40 @@
       r32.packet[3] = loadBF16fromResult<non_unit_stride, 24>(src, resInc);
     }
     storeConvertBlockBF16<size>(result + i, r32, rows & 3);
-    i += extra; src += extra*resInc;
+    i += extra;
+    src += extra * resInc;
     if (size != 32) break;
   }
 }
 
-template<bool non_unit_stride>
-EIGEN_ALWAYS_INLINE void convertArrayPointerBF16toF32(float *result, Index cols, Index rows, bfloat16* src, Index resInc)
-{
-  for(Index col = 0; col < cols; col++, src += (rows*resInc), result += rows) {
+template <bool non_unit_stride>
+EIGEN_ALWAYS_INLINE void convertArrayPointerBF16toF32(float* result, Index cols, Index rows, bfloat16* src,
+                                                      Index resInc) {
+  for (Index col = 0; col < cols; col++, src += (rows * resInc), result += rows) {
     Index i = 0;
     bfloat16* src2 = src;
     convertPointerBF16toF32<32, non_unit_stride>(i, result, rows, src2, resInc);
     convertPointerBF16toF32<16, non_unit_stride>(i, result, rows, src2, resInc);
-    convertPointerBF16toF32<8,  non_unit_stride>(i, result, rows, src2, resInc);
-    convertPointerBF16toF32<4,  non_unit_stride>(i, result, rows, src2, resInc);
-    convertPointerBF16toF32<1,  non_unit_stride>(i, result, rows, src2, resInc);
+    convertPointerBF16toF32<8, non_unit_stride>(i, result, rows, src2, resInc);
+    convertPointerBF16toF32<4, non_unit_stride>(i, result, rows, src2, resInc);
+    convertPointerBF16toF32<1, non_unit_stride>(i, result, rows, src2, resInc);
   }
 }
 
-template<Index num_acc, Index size = 4>
-EIGEN_ALWAYS_INLINE void zeroAccumulators(Packet4f (&acc)[num_acc][size])
-{
+template <Index num_acc, Index size = 4>
+EIGEN_ALWAYS_INLINE void zeroAccumulators(Packet4f (&acc)[num_acc][size]) {
   Packet4f z = pset1<Packet4f>(float(0));
 
-  for(Index k = 0; k < num_acc; k++) {
-    for(Index j = 0; j < size; j++) {
+  for (Index k = 0; k < num_acc; k++) {
+    for (Index j = 0; j < size; j++) {
       acc[k][j] = z;
     }
   }
 }
 
-template<Index num_acc>
-EIGEN_ALWAYS_INLINE void tranposeResults(Packet4f (&acc)[num_acc][4])
-{
-  for(Index i = 0; i < num_acc; i++) {
+template <Index num_acc>
+EIGEN_ALWAYS_INLINE void tranposeResults(Packet4f (&acc)[num_acc][4]) {
+  for (Index i = 0; i < num_acc; i++) {
     Packet4ui t0, t1, t2, t3;
     t0 = vec_mergeh(reinterpret_cast<Packet4ui>(acc[i][0]), reinterpret_cast<Packet4ui>(acc[i][2]));
     t1 = vec_mergel(reinterpret_cast<Packet4ui>(acc[i][0]), reinterpret_cast<Packet4ui>(acc[i][2]));
@@ -3056,85 +2849,75 @@
   }
 }
 
-template<Index num_acc>
-EIGEN_ALWAYS_INLINE void addResults(Packet4f (&acc)[num_acc][4])
-{
-  for(Index i = 0, j = 0; j < num_acc; i++, j += 2) {
-    for(Index x = 0, y = 0; x < 2; x++, y += 2) {
-      for(Index w = 0, z = 0; w < 2; w++, z += 2) {
-        acc[i][y+w] = acc[j+x][z+0] + acc[j+x][z+1];
+template <Index num_acc>
+EIGEN_ALWAYS_INLINE void addResults(Packet4f (&acc)[num_acc][4]) {
+  for (Index i = 0, j = 0; j < num_acc; i++, j += 2) {
+    for (Index x = 0, y = 0; x < 2; x++, y += 2) {
+      for (Index w = 0, z = 0; w < 2; w++, z += 2) {
+        acc[i][y + w] = acc[j + x][z + 0] + acc[j + x][z + 1];
       }
     }
   }
 }
 
-template<Index num_acc, bool rhsExtraCols, bool lhsExtraRows, Index num_rhs>
-EIGEN_ALWAYS_INLINE void outputResultsVSX(Packet4f (&acc)[num_acc][4], Index rows, const Packet4f pAlpha, float* result, const Index extra_cols, Index extra_rows)
-{
+template <Index num_acc, bool rhsExtraCols, bool lhsExtraRows, Index num_rhs>
+EIGEN_ALWAYS_INLINE void outputResultsVSX(Packet4f (&acc)[num_acc][4], Index rows, const Packet4f pAlpha, float* result,
+                                          const Index extra_cols, Index extra_rows) {
   tranposeResults<num_acc>(acc);
   addResults<num_acc>(acc);
 
   constexpr Index real_rhs = ((num_rhs / 2) - (rhsExtraCols ? 1 : 0));
   Index k = 0;
-  for(Index i = 0; i < real_rhs; i++, result += 4*rows, k++){
+  for (Index i = 0; i < real_rhs; i++, result += 4 * rows, k++) {
     storeResults<false, lhsExtraRows>(acc[k], rows, pAlpha, result, extra_cols, extra_rows);
   }
-  if(rhsExtraCols) {
+  if (rhsExtraCols) {
     storeResults<rhsExtraCols, lhsExtraRows>(acc[k], rows, pAlpha, result, extra_cols, extra_rows);
   }
 }
 
-template<bool zero>
-EIGEN_ALWAYS_INLINE void loadTwoRhsFloat32(const float* block, Index strideB, Index i, Packet4f& dhs0, Packet4f &dhs1)
-{
-  dhs0 = ploadu<Packet4f>(block + strideB*i + 0);
+template <bool zero>
+EIGEN_ALWAYS_INLINE void loadTwoRhsFloat32(const float* block, Index strideB, Index i, Packet4f& dhs0, Packet4f& dhs1) {
+  dhs0 = ploadu<Packet4f>(block + strideB * i + 0);
   if (zero) {
     Packet4f dhs2 = pset1<Packet4f>(float(0));
     dhs1 = vec_mergel(dhs0, dhs2);
     dhs0 = vec_mergeh(dhs0, dhs2);
   } else {
-    dhs1 = ploadu<Packet4f>(block + strideB*i + 4);
+    dhs1 = ploadu<Packet4f>(block + strideB * i + 4);
   }
 }
 
-template<Index num_acc, bool zero, bool rhsExtraCols, Index num_rhs>
-EIGEN_ALWAYS_INLINE void KLoop
-(
-  const float* indexA,
-  const float* indexB,
-  Packet4f (&acc)[num_acc][4],
-  Index strideB,
-  Index k,
-  Index offsetB,
-  Index extra_cols
-)
-{
+template <Index num_acc, bool zero, bool rhsExtraCols, Index num_rhs>
+EIGEN_ALWAYS_INLINE void KLoop(const float* indexA, const float* indexB, Packet4f (&acc)[num_acc][4], Index strideB,
+                               Index k, Index offsetB, Index extra_cols) {
   constexpr Index num_lhs = 4;
   Packet4f lhs[num_lhs], rhs[num_rhs];
 
   constexpr Index real_rhs = (num_rhs - (rhsExtraCols ? 2 : 0));
-  for(Index i = 0; i < real_rhs; i += 2){
-    loadTwoRhsFloat32<zero>(indexB + k*4, strideB, i, rhs[i + 0], rhs[i + 1]);
+  for (Index i = 0; i < real_rhs; i += 2) {
+    loadTwoRhsFloat32<zero>(indexB + k * 4, strideB, i, rhs[i + 0], rhs[i + 1]);
   }
-  if(rhsExtraCols) {
-    loadTwoRhsFloat32<zero>(indexB + k*extra_cols - offsetB, strideB, real_rhs, rhs[real_rhs + 0], rhs[real_rhs + 1]);
+  if (rhsExtraCols) {
+    loadTwoRhsFloat32<zero>(indexB + k * extra_cols - offsetB, strideB, real_rhs, rhs[real_rhs + 0], rhs[real_rhs + 1]);
   }
 
-  indexA += 2*k*4;
-  for(Index j = 0; j < num_lhs; j++) {
-    lhs[j] = ploadu<Packet4f>(indexA + j*4);
+  indexA += 2 * k * 4;
+  for (Index j = 0; j < num_lhs; j++) {
+    lhs[j] = ploadu<Packet4f>(indexA + j * 4);
   }
 
-  for(Index j = 0; j < num_rhs; j++) {
-    for(Index i = 0; i < num_lhs; i++) {
+  for (Index j = 0; j < num_rhs; j++) {
+    for (Index i = 0; i < num_lhs; i++) {
       acc[j][i] = pmadd(rhs[j], lhs[i], acc[j][i]);
     }
   }
 }
 
-template<const Index num_acc, bool rhsExtraCols, bool lhsExtraRows>
-EIGEN_ALWAYS_INLINE void colVSXLoopBodyIter(Index depth, Index rows, const Packet4f pAlpha, const float* indexA, const float* indexB, Index strideB, Index offsetB, float* result, const Index extra_cols, const Index extra_rows)
-{
+template <const Index num_acc, bool rhsExtraCols, bool lhsExtraRows>
+EIGEN_ALWAYS_INLINE void colVSXLoopBodyIter(Index depth, Index rows, const Packet4f pAlpha, const float* indexA,
+                                            const float* indexB, Index strideB, Index offsetB, float* result,
+                                            const Index extra_cols, const Index extra_rows) {
   constexpr Index num_rhs = num_acc;
 
   Packet4f acc[num_acc][4];
@@ -3142,10 +2925,10 @@
   zeroAccumulators<num_acc>(acc);
 
   Index k;
-  for(k = 0; k + 2 <= depth; k += 2){
+  for (k = 0; k + 2 <= depth; k += 2) {
     KLoop<num_acc, false, rhsExtraCols, num_rhs>(indexA, indexB, acc, strideB, k, offsetB, extra_cols);
   }
-  if(depth&1){
+  if (depth & 1) {
     KLoop<num_acc, true, rhsExtraCols, num_rhs>(indexA, indexB, acc, strideB, k, offsetB, extra_cols);
   }
 
@@ -3153,97 +2936,108 @@
 }
 
 // No more than 4 (uses 2X the accumulators or 8X the number of VSX registers)
-#define MAX_BFLOAT16_ACC_VSX   4
+#define MAX_BFLOAT16_ACC_VSX 4
 
-template<const Index num_acc, bool rhsExtraCols, bool lhsExtraRows>
-void colVSXLoopBody(Index& col, Index depth, Index cols, Index rows, const Packet4f pAlpha, const float* indexA, const float* indexB, Index strideB, Index offsetB, float* result)
-{
-  constexpr Index step = (num_acc * 4); // each accumulator has 4 elements
+template <const Index num_acc, bool rhsExtraCols, bool lhsExtraRows>
+void colVSXLoopBody(Index& col, Index depth, Index cols, Index rows, const Packet4f pAlpha, const float* indexA,
+                    const float* indexB, Index strideB, Index offsetB, float* result) {
+  constexpr Index step = (num_acc * 4);  // each accumulator has 4 elements
   const Index extra_cols = (rhsExtraCols) ? (cols & 3) : 0;
   const Index extra_rows = (lhsExtraRows) ? (rows & 3) : 0;
   constexpr bool multiIters = !rhsExtraCols && (num_acc == MAX_BFLOAT16_ACC_VSX);
 
-  do{
-    colVSXLoopBodyIter<num_acc*2, rhsExtraCols, lhsExtraRows>(depth, rows, pAlpha, indexA, indexB, strideB, offsetB, result, extra_cols, extra_rows);
+  do {
+    colVSXLoopBodyIter<num_acc * 2, rhsExtraCols, lhsExtraRows>(depth, rows, pAlpha, indexA, indexB, strideB, offsetB,
+                                                                result, extra_cols, extra_rows);
 
-    indexB += strideB*(num_acc * 2);
-    result += rows*step;
-  } while(multiIters && (step <= cols - (col += step)));
+    indexB += strideB * (num_acc * 2);
+    result += rows * step;
+  } while (multiIters && (step <= cols - (col += step)));
 }
 
-template<const Index num_acc, bool rhsExtraCols, bool lhsExtraRows>
-EIGEN_ALWAYS_INLINE void colVSXLoopBodyExtraN(Index col, Index depth, Index cols, Index rows, const Packet4f pAlpha, const float* indexA, const float* blockB, Index strideB, Index offsetB, float* result)
-{
+template <const Index num_acc, bool rhsExtraCols, bool lhsExtraRows>
+EIGEN_ALWAYS_INLINE void colVSXLoopBodyExtraN(Index col, Index depth, Index cols, Index rows, const Packet4f pAlpha,
+                                              const float* indexA, const float* blockB, Index strideB, Index offsetB,
+                                              float* result) {
   if (MAX_BFLOAT16_ACC_VSX > num_acc) {
-    colVSXLoopBody<num_acc + (rhsExtraCols ? 1 : 0), rhsExtraCols, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB, strideB, offsetB, result);
+    colVSXLoopBody<num_acc + (rhsExtraCols ? 1 : 0), rhsExtraCols, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA,
+                                                                                 blockB, strideB, offsetB, result);
   }
 }
 
-template<bool rhsExtraCols, bool lhsExtraRows>
-void colVSXLoopBodyExtra(Index col, Index depth, Index cols, Index rows, const Packet4f pAlpha, const float* indexA, const float* blockB, Index strideB, Index offsetB, float* result)
-{
+template <bool rhsExtraCols, bool lhsExtraRows>
+void colVSXLoopBodyExtra(Index col, Index depth, Index cols, Index rows, const Packet4f pAlpha, const float* indexA,
+                         const float* blockB, Index strideB, Index offsetB, float* result) {
   switch ((cols - col) >> 2) {
-  case 3:
-    colVSXLoopBodyExtraN<3, rhsExtraCols, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB, strideB, offsetB, result);
-    break;
-  case 2:
-    colVSXLoopBodyExtraN<2, rhsExtraCols, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB, strideB, offsetB, result);
-    break;
-  case 1:
-    colVSXLoopBodyExtraN<1, rhsExtraCols, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB, strideB, offsetB, result);
-    break;
-  default:
-    if (rhsExtraCols) {
-      colVSXLoopBody<1, true, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB, strideB, offsetB, result);
-    }
-    break;
+    case 3:
+      colVSXLoopBodyExtraN<3, rhsExtraCols, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB, strideB,
+                                                          offsetB, result);
+      break;
+    case 2:
+      colVSXLoopBodyExtraN<2, rhsExtraCols, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB, strideB,
+                                                          offsetB, result);
+      break;
+    case 1:
+      colVSXLoopBodyExtraN<1, rhsExtraCols, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB, strideB,
+                                                          offsetB, result);
+      break;
+    default:
+      if (rhsExtraCols) {
+        colVSXLoopBody<1, true, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB, strideB, offsetB, result);
+      }
+      break;
   }
 }
 
-template<Index size, bool lhsExtraRows = false>
-EIGEN_ALWAYS_INLINE void colVSXLoops(Index depth, Index cols, Index rows, const Packet4f pAlpha, const bfloat16* indexA, const float* indexA2, const float* blockB2, Index strideA, Index strideB, Index offsetB, float* result2)
-{
-  Index delta_rows = 2*(lhsExtraRows ? (rows & 3) : size);
+template <Index size, bool lhsExtraRows = false>
+EIGEN_ALWAYS_INLINE void colVSXLoops(Index depth, Index cols, Index rows, const Packet4f pAlpha, const bfloat16* indexA,
+                                     const float* indexA2, const float* blockB2, Index strideA, Index strideB,
+                                     Index offsetB, float* result2) {
+  Index delta_rows = 2 * (lhsExtraRows ? (rows & 3) : size);
   for (Index row = 0; row < size; row += 4) {
-    convertArrayPointerBF16toF32Dup<lhsExtraRows>(const_cast<float *>(indexA2), strideA, delta_rows, indexA, row, rows & 3);
+    convertArrayPointerBF16toF32Dup<lhsExtraRows>(const_cast<float*>(indexA2), strideA, delta_rows, indexA, row,
+                                                  rows & 3);
 
-    const float *blockB = blockB2;
-    float *result = result2 + row;
+    const float* blockB = blockB2;
+    float* result = result2 + row;
 
     Index col = 0;
     if (cols >= (MAX_BFLOAT16_ACC_VSX * 4)) {
-      colVSXLoopBody<MAX_BFLOAT16_ACC_VSX, false, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA2, blockB, strideB, 0, result);
-      blockB += (strideB >> 1)*col;
-      result += rows*col;
+      colVSXLoopBody<MAX_BFLOAT16_ACC_VSX, false, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA2, blockB,
+                                                                strideB, 0, result);
+      blockB += (strideB >> 1) * col;
+      result += rows * col;
     }
     if (cols & 3) {
-      colVSXLoopBodyExtra<true, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA2, blockB, strideB, offsetB, result);
+      colVSXLoopBodyExtra<true, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA2, blockB, strideB, offsetB,
+                                              result);
     } else {
       colVSXLoopBodyExtra<false, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA2, blockB, strideB, 0, result);
     }
   }
 }
 
-template<Index size>
-EIGEN_ALWAYS_INLINE void calcVSXColLoops(const bfloat16*& indexA, const float* indexA2, Index& row, Index depth, Index cols, Index rows, const Packet4f pAlpha, const float* indexB, Index strideA, Index strideB, Index offsetA, Index offsetB, Index bigSuffix, float *result)
-{
+template <Index size>
+EIGEN_ALWAYS_INLINE void calcVSXColLoops(const bfloat16*& indexA, const float* indexA2, Index& row, Index depth,
+                                         Index cols, Index rows, const Packet4f pAlpha, const float* indexB,
+                                         Index strideA, Index strideB, Index offsetA, Index offsetB, Index bigSuffix,
+                                         float* result) {
   if ((size == 16) || (rows & size)) {
-    indexA += size*offsetA;
+    indexA += size * offsetA;
     colVSXLoops<size>(depth, cols, rows, pAlpha, indexA, indexA2, indexB, strideA, strideB, offsetB, result + row);
     row += size;
-    indexA += bigSuffix*size/16;
+    indexA += bigSuffix * size / 16;
   }
 }
 
-template<const Index size, typename DataMapper>
-EIGEN_ALWAYS_INLINE void convertBF16toF32(Index& i, float *result, Index rows, const DataMapper& src)
-{
+template <const Index size, typename DataMapper>
+EIGEN_ALWAYS_INLINE void convertBF16toF32(Index& i, float* result, Index rows, const DataMapper& src) {
   constexpr Index extra = ((size < 4) ? 4 : size);
   while (i + size <= rows) {
-    PacketBlock<Packet8bf,(size+7)/8> r32;
-    r32.packet[0] = src.template loadPacket<Packet8bf>(i +  0);
+    PacketBlock<Packet8bf, (size + 7) / 8> r32;
+    r32.packet[0] = src.template loadPacket<Packet8bf>(i + 0);
     if (size >= 16) {
-      r32.packet[1] = src.template loadPacket<Packet8bf>(i +  8);
+      r32.packet[1] = src.template loadPacket<Packet8bf>(i + 8);
     }
     if (size >= 32) {
       r32.packet[2] = src.template loadPacket<Packet8bf>(i + 16);
@@ -3255,104 +3049,104 @@
   }
 }
 
-template<typename DataMapper>
-EIGEN_ALWAYS_INLINE void convertArrayBF16toF32(float *result, Index cols, Index rows, const DataMapper& src)
-{
+template <typename DataMapper>
+EIGEN_ALWAYS_INLINE void convertArrayBF16toF32(float* result, Index cols, Index rows, const DataMapper& src) {
   typedef typename DataMapper::LinearMapper LinearMapper;
-  for(Index j = 0; j < cols; j++, result += rows){
+  for (Index j = 0; j < cols; j++, result += rows) {
     const LinearMapper src2 = src.getLinearMapper(0, j);
     Index i = 0;
     convertBF16toF32<32, LinearMapper>(i, result, rows, src2);
     convertBF16toF32<16, LinearMapper>(i, result, rows, src2);
-    convertBF16toF32<8,  LinearMapper>(i, result, rows, src2);
-    convertBF16toF32<4,  LinearMapper>(i, result, rows, src2);
-    convertBF16toF32<1,  LinearMapper>(i, result, rows, src2);
+    convertBF16toF32<8, LinearMapper>(i, result, rows, src2);
+    convertBF16toF32<4, LinearMapper>(i, result, rows, src2);
+    convertBF16toF32<1, LinearMapper>(i, result, rows, src2);
   }
 }
 
-EIGEN_ALWAYS_INLINE Packet8bf convertF32toBF16VSX(const float *res)
-{
+EIGEN_ALWAYS_INLINE Packet8bf convertF32toBF16VSX(const float* res) {
   return F32ToBf16Both(ploadu<Packet4f>(res + 0), ploadu<Packet4f>(res + 4));
 }
 
-template<typename DataMapper, const Index size>
-EIGEN_ALWAYS_INLINE void convertArrayF32toBF16ColVSX(float *result, Index col, Index rows, const DataMapper& res)
-{
+template <typename DataMapper, const Index size>
+EIGEN_ALWAYS_INLINE void convertArrayF32toBF16ColVSX(float* result, Index col, Index rows, const DataMapper& res) {
   const DataMapper res2 = res.getSubMapper(0, col);
   Index row;
-  float *result2 = result + col*rows;
-  for(row = 0; row + 8 <= rows; row += 8, result2 += 8){
+  float* result2 = result + col * rows;
+  for (row = 0; row + 8 <= rows; row += 8, result2 += 8) {
     // get and save block
-    PacketBlock<Packet8bf,size> block;
-    for(Index j = 0; j < size; j++){
-      block.packet[j] = convertF32toBF16VSX(result2 + j*rows);
+    PacketBlock<Packet8bf, size> block;
+    for (Index j = 0; j < size; j++) {
+      block.packet[j] = convertF32toBF16VSX(result2 + j * rows);
     }
-    res2.template storePacketBlock<Packet8bf,size>(row, 0, block);
+    res2.template storePacketBlock<Packet8bf, size>(row, 0, block);
   }
   // extra rows
-  if(row < rows){
-    for(Index j = 0; j < size; j++){
-      Packet8bf fp16 = convertF32toBF16VSX(result2 + j*rows);
+  if (row < rows) {
+    for (Index j = 0; j < size; j++) {
+      Packet8bf fp16 = convertF32toBF16VSX(result2 + j * rows);
       res2.template storePacketPartial<Packet8bf>(row, j, fp16, rows & 7);
     }
   }
 }
 
-template<typename DataMapper>
-EIGEN_ALWAYS_INLINE void convertArrayF32toBF16VSX(float *result, Index cols, Index rows, const DataMapper& res)
-{
+template <typename DataMapper>
+EIGEN_ALWAYS_INLINE void convertArrayF32toBF16VSX(float* result, Index cols, Index rows, const DataMapper& res) {
   Index col;
-  for(col = 0; col + 4 <= cols; col += 4){
-    convertArrayF32toBF16ColVSX<DataMapper,4>(result, col, rows, res);
+  for (col = 0; col + 4 <= cols; col += 4) {
+    convertArrayF32toBF16ColVSX<DataMapper, 4>(result, col, rows, res);
   }
   // extra cols
   switch (cols - col) {
-  case 1:
-    convertArrayF32toBF16ColVSX<DataMapper,1>(result, col, rows, res);
-    break;
-  case 2:
-    convertArrayF32toBF16ColVSX<DataMapper,2>(result, col, rows, res);
-    break;
-  case 3:
-    convertArrayF32toBF16ColVSX<DataMapper,3>(result, col, rows, res);
-    break;
+    case 1:
+      convertArrayF32toBF16ColVSX<DataMapper, 1>(result, col, rows, res);
+      break;
+    case 2:
+      convertArrayF32toBF16ColVSX<DataMapper, 2>(result, col, rows, res);
+      break;
+    case 3:
+      convertArrayF32toBF16ColVSX<DataMapper, 3>(result, col, rows, res);
+      break;
   }
 }
 
-template<typename DataMapper>
-void gemmbfloat16(const DataMapper& res, const bfloat16* indexA, const bfloat16* indexB, Index rows, Index depth, Index cols, bfloat16 alpha, Index strideA, Index strideB, Index offsetA, Index offsetB)
-{
+template <typename DataMapper>
+void gemmbfloat16(const DataMapper& res, const bfloat16* indexA, const bfloat16* indexB, Index rows, Index depth,
+                  Index cols, bfloat16 alpha, Index strideA, Index strideB, Index offsetA, Index offsetB) {
   float falpha = Eigen::bfloat16_impl::bfloat16_to_float(alpha);
   const Packet4f pAlpha = pset1<Packet4f>(falpha);
 
-  if( strideA == -1 ) strideA = depth;
-  if( strideB == -1 ) strideB = depth;
+  if (strideA == -1) strideA = depth;
+  if (strideB == -1) strideB = depth;
 
-  ei_declare_aligned_stack_constructed_variable(float, result, cols*rows, 0);
-  ei_declare_aligned_stack_constructed_variable(float, indexB2, strideB*cols, 0);
-  ei_declare_aligned_stack_constructed_variable(float, indexA2, ((strideA + 1) & -2)*4*2, 0);
+  ei_declare_aligned_stack_constructed_variable(float, result, cols* rows, 0);
+  ei_declare_aligned_stack_constructed_variable(float, indexB2, strideB* cols, 0);
+  ei_declare_aligned_stack_constructed_variable(float, indexA2, ((strideA + 1) & -2) * 4 * 2, 0);
 
   convertArrayBF16toF32<DataMapper>(result, cols, rows, res);
-  convertArrayPointerBF16toF32(indexB2, cols, strideB, const_cast<bfloat16 *>(indexB));
+  convertArrayPointerBF16toF32(indexB2, cols, strideB, const_cast<bfloat16*>(indexB));
 
-  Index bigSuffix = 2*8*(strideA-offsetA);
-  float* indexBF32 = indexB2 + 4*offsetB;
+  Index bigSuffix = 2 * 8 * (strideA - offsetA);
+  float* indexBF32 = indexB2 + 4 * offsetB;
   offsetB *= 3;
   strideB *= 2;
 
   Index row = 0;
   // LHS (8x16) block
-  while(row + 16 <= rows){
-    calcVSXColLoops<16>(indexA, indexA2, row, depth, cols, rows, pAlpha, indexBF32, strideA, strideB, offsetA, offsetB, bigSuffix, result);
+  while (row + 16 <= rows) {
+    calcVSXColLoops<16>(indexA, indexA2, row, depth, cols, rows, pAlpha, indexBF32, strideA, strideB, offsetA, offsetB,
+                        bigSuffix, result);
   }
   // LHS (8x8) block
-  calcVSXColLoops<8>(indexA, indexA2, row, depth, cols, rows, pAlpha, indexBF32, strideA, strideB, offsetA, offsetB, bigSuffix, result);
+  calcVSXColLoops<8>(indexA, indexA2, row, depth, cols, rows, pAlpha, indexBF32, strideA, strideB, offsetA, offsetB,
+                     bigSuffix, result);
   // LHS (8x4) block
-  calcVSXColLoops<4>(indexA, indexA2, row, depth, cols, rows, pAlpha, indexBF32, strideA, strideB, offsetA, offsetB, bigSuffix, result);
+  calcVSXColLoops<4>(indexA, indexA2, row, depth, cols, rows, pAlpha, indexBF32, strideA, strideB, offsetA, offsetB,
+                     bigSuffix, result);
   // extra rows
-  if(rows & 3){
+  if (rows & 3) {
     // This index is the beginning of remaining block.
-    colVSXLoops<4, true>(depth, cols, rows, pAlpha, indexA, indexA2, indexBF32, strideA, strideB, offsetB, result + row);
+    colVSXLoops<4, true>(depth, cols, rows, pAlpha, indexA, indexA2, indexBF32, strideA, strideB, offsetB,
+                         result + row);
   }
 
   // Convert back to bfloat16
@@ -3366,554 +3160,527 @@
 /************************************
  * ppc64le template specializations *
  * **********************************/
-template<typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
-struct gemm_pack_lhs<double, Index, DataMapper, Pack1, Pack2, Packet, ColMajor, Conjugate, PanelMode>
-{
-  void operator()(double* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride=0, Index offset=0);
+template <typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
+struct gemm_pack_lhs<double, Index, DataMapper, Pack1, Pack2, Packet, ColMajor, Conjugate, PanelMode> {
+  void operator()(double* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride = 0, Index offset = 0);
 };
 
-template<typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
-void gemm_pack_lhs<double, Index, DataMapper, Pack1, Pack2, Packet, ColMajor, Conjugate, PanelMode>
-  ::operator()(double* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride, Index offset)
-{
-    dhs_pack<double, DataMapper, Packet2d, ColMajor, PanelMode, true> pack;
-    pack(blockA, lhs, depth, rows, stride, offset);
+template <typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
+void gemm_pack_lhs<double, Index, DataMapper, Pack1, Pack2, Packet, ColMajor, Conjugate, PanelMode>::operator()(
+    double* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride, Index offset) {
+  dhs_pack<double, DataMapper, Packet2d, ColMajor, PanelMode, true> pack;
+  pack(blockA, lhs, depth, rows, stride, offset);
 }
 
-template<typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
-struct gemm_pack_lhs<double, Index, DataMapper, Pack1, Pack2, Packet, RowMajor, Conjugate, PanelMode>
-{
-  void operator()(double* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride=0, Index offset=0);
+template <typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
+struct gemm_pack_lhs<double, Index, DataMapper, Pack1, Pack2, Packet, RowMajor, Conjugate, PanelMode> {
+  void operator()(double* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride = 0, Index offset = 0);
 };
 
-template<typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
-void gemm_pack_lhs<double, Index, DataMapper, Pack1, Pack2, Packet, RowMajor, Conjugate, PanelMode>
-  ::operator()(double* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride, Index offset)
-{
-    dhs_pack<double, DataMapper, Packet2d, RowMajor, PanelMode, true> pack;
-    pack(blockA, lhs, depth, rows, stride, offset);
+template <typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
+void gemm_pack_lhs<double, Index, DataMapper, Pack1, Pack2, Packet, RowMajor, Conjugate, PanelMode>::operator()(
+    double* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride, Index offset) {
+  dhs_pack<double, DataMapper, Packet2d, RowMajor, PanelMode, true> pack;
+  pack(blockA, lhs, depth, rows, stride, offset);
 }
 
 #if EIGEN_ALTIVEC_USE_CUSTOM_PACK
-template<typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
-struct gemm_pack_rhs<double, Index, DataMapper, nr, ColMajor, Conjugate, PanelMode>
-{
-  void operator()(double* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride=0, Index offset=0);
+template <typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
+struct gemm_pack_rhs<double, Index, DataMapper, nr, ColMajor, Conjugate, PanelMode> {
+  void operator()(double* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride = 0, Index offset = 0);
 };
 
-template<typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
-void gemm_pack_rhs<double, Index, DataMapper, nr, ColMajor, Conjugate, PanelMode>
-  ::operator()(double* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride, Index offset)
-{
+template <typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
+void gemm_pack_rhs<double, Index, DataMapper, nr, ColMajor, Conjugate, PanelMode>::operator()(
+    double* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride, Index offset) {
   dhs_pack<double, DataMapper, Packet2d, ColMajor, PanelMode, false> pack;
   pack(blockB, rhs, depth, cols, stride, offset);
 }
 
-template<typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
-struct gemm_pack_rhs<double, Index, DataMapper, nr, RowMajor, Conjugate, PanelMode>
-{
-  void operator()(double* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride=0, Index offset=0);
+template <typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
+struct gemm_pack_rhs<double, Index, DataMapper, nr, RowMajor, Conjugate, PanelMode> {
+  void operator()(double* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride = 0, Index offset = 0);
 };
 
-template<typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
-void gemm_pack_rhs<double, Index, DataMapper, nr, RowMajor, Conjugate, PanelMode>
-  ::operator()(double* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride, Index offset)
-{
+template <typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
+void gemm_pack_rhs<double, Index, DataMapper, nr, RowMajor, Conjugate, PanelMode>::operator()(
+    double* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride, Index offset) {
   dhs_pack<double, DataMapper, Packet2d, RowMajor, PanelMode, false> pack;
   pack(blockB, rhs, depth, cols, stride, offset);
 }
 
-template<typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
-struct gemm_pack_rhs<bfloat16, Index, DataMapper, nr, ColMajor, Conjugate, PanelMode>
-{
-  void operator()(bfloat16* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride=0, Index offset=0);
+template <typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
+struct gemm_pack_rhs<bfloat16, Index, DataMapper, nr, ColMajor, Conjugate, PanelMode> {
+  void operator()(bfloat16* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride = 0, Index offset = 0);
 };
 
-template<typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
-void gemm_pack_rhs<bfloat16, Index, DataMapper, nr, ColMajor, Conjugate, PanelMode>
-  ::operator()(bfloat16* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride, Index offset)
-{
+template <typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
+void gemm_pack_rhs<bfloat16, Index, DataMapper, nr, ColMajor, Conjugate, PanelMode>::operator()(
+    bfloat16* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride, Index offset) {
   dhs_pack<bfloat16, DataMapper, Packet8bf, ColMajor, PanelMode, false> pack;
   pack(blockB, rhs, depth, cols, stride, offset);
 }
 
-template<typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
-struct gemm_pack_rhs<bfloat16, Index, DataMapper, nr, RowMajor, Conjugate, PanelMode>
-{
-  void operator()(bfloat16* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride=0, Index offset=0);
+template <typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
+struct gemm_pack_rhs<bfloat16, Index, DataMapper, nr, RowMajor, Conjugate, PanelMode> {
+  void operator()(bfloat16* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride = 0, Index offset = 0);
 };
 
-template<typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
-void gemm_pack_rhs<bfloat16, Index, DataMapper, nr, RowMajor, Conjugate, PanelMode>
-  ::operator()(bfloat16* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride, Index offset)
-{
+template <typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
+void gemm_pack_rhs<bfloat16, Index, DataMapper, nr, RowMajor, Conjugate, PanelMode>::operator()(
+    bfloat16* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride, Index offset) {
   dhs_pack<bfloat16, DataMapper, Packet8bf, RowMajor, PanelMode, false> pack;
   pack(blockB, rhs, depth, cols, stride, offset);
 }
 #endif
 
-template<typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
-struct gemm_pack_lhs<bfloat16, Index, DataMapper, Pack1, Pack2, Packet, ColMajor, Conjugate, PanelMode>
-{
-  void operator()(bfloat16* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride=0, Index offset=0);
+template <typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
+struct gemm_pack_lhs<bfloat16, Index, DataMapper, Pack1, Pack2, Packet, ColMajor, Conjugate, PanelMode> {
+  void operator()(bfloat16* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride = 0, Index offset = 0);
 };
 
-template<typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
-void gemm_pack_lhs<bfloat16, Index, DataMapper, Pack1, Pack2, Packet, ColMajor, Conjugate, PanelMode>
-  ::operator()(bfloat16* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride, Index offset)
-{
+template <typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
+void gemm_pack_lhs<bfloat16, Index, DataMapper, Pack1, Pack2, Packet, ColMajor, Conjugate, PanelMode>::operator()(
+    bfloat16* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride, Index offset) {
   dhs_pack<bfloat16, DataMapper, Packet8bf, ColMajor, PanelMode, true> pack;
   pack(blockA, lhs, depth, rows, stride, offset);
 }
 
-template<typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
-struct gemm_pack_lhs<bfloat16, Index, DataMapper, Pack1, Pack2, Packet, RowMajor, Conjugate, PanelMode>
-{
-  void operator()(bfloat16* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride=0, Index offset=0);
+template <typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
+struct gemm_pack_lhs<bfloat16, Index, DataMapper, Pack1, Pack2, Packet, RowMajor, Conjugate, PanelMode> {
+  void operator()(bfloat16* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride = 0, Index offset = 0);
 };
 
-template<typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
-void gemm_pack_lhs<bfloat16, Index, DataMapper, Pack1, Pack2, Packet, RowMajor, Conjugate, PanelMode>
-  ::operator()(bfloat16* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride, Index offset)
-{
+template <typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
+void gemm_pack_lhs<bfloat16, Index, DataMapper, Pack1, Pack2, Packet, RowMajor, Conjugate, PanelMode>::operator()(
+    bfloat16* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride, Index offset) {
   dhs_pack<bfloat16, DataMapper, Packet8bf, RowMajor, PanelMode, true> pack;
   pack(blockA, lhs, depth, rows, stride, offset);
 }
 
-template<typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
-struct gemm_pack_lhs<float, Index, DataMapper, Pack1, Pack2, Packet, RowMajor, Conjugate, PanelMode>
-{
-  void operator()(float* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride=0, Index offset=0);
+template <typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
+struct gemm_pack_lhs<float, Index, DataMapper, Pack1, Pack2, Packet, RowMajor, Conjugate, PanelMode> {
+  void operator()(float* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride = 0, Index offset = 0);
 };
 
-template<typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
-void gemm_pack_lhs<float, Index, DataMapper, Pack1, Pack2, Packet, RowMajor, Conjugate, PanelMode>
-  ::operator()(float* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride, Index offset)
-{
+template <typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
+void gemm_pack_lhs<float, Index, DataMapper, Pack1, Pack2, Packet, RowMajor, Conjugate, PanelMode>::operator()(
+    float* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride, Index offset) {
   dhs_pack<float, DataMapper, Packet4f, RowMajor, PanelMode, true> pack;
   pack(blockA, lhs, depth, rows, stride, offset);
 }
 
-template<typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
-struct gemm_pack_lhs<float, Index, DataMapper, Pack1, Pack2, Packet, ColMajor, Conjugate, PanelMode>
-{
-  void operator()(float* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride=0, Index offset=0);
+template <typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
+struct gemm_pack_lhs<float, Index, DataMapper, Pack1, Pack2, Packet, ColMajor, Conjugate, PanelMode> {
+  void operator()(float* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride = 0, Index offset = 0);
 };
 
-template<typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
-void gemm_pack_lhs<float, Index, DataMapper, Pack1, Pack2, Packet, ColMajor, Conjugate, PanelMode>
-  ::operator()(float* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride, Index offset)
-{
+template <typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
+void gemm_pack_lhs<float, Index, DataMapper, Pack1, Pack2, Packet, ColMajor, Conjugate, PanelMode>::operator()(
+    float* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride, Index offset) {
   dhs_pack<float, DataMapper, Packet4f, ColMajor, PanelMode, true> pack;
   pack(blockA, lhs, depth, rows, stride, offset);
 }
 
-template<typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
-struct gemm_pack_lhs<std::complex<float>, Index, DataMapper, Pack1, Pack2, Packet, RowMajor, Conjugate, PanelMode>
-{
-  void operator()(std::complex<float>* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride=0, Index offset=0);
+template <typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
+struct gemm_pack_lhs<std::complex<float>, Index, DataMapper, Pack1, Pack2, Packet, RowMajor, Conjugate, PanelMode> {
+  void operator()(std::complex<float>* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride = 0,
+                  Index offset = 0);
 };
 
-template<typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
-void gemm_pack_lhs<std::complex<float>, Index, DataMapper, Pack1, Pack2, Packet, RowMajor, Conjugate, PanelMode>
-  ::operator()(std::complex<float>* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride, Index offset)
-{
+template <typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
+void gemm_pack_lhs<std::complex<float>, Index, DataMapper, Pack1, Pack2, Packet, RowMajor, Conjugate,
+                   PanelMode>::operator()(std::complex<float>* blockA, const DataMapper& lhs, Index depth, Index rows,
+                                          Index stride, Index offset) {
   dhs_cpack<float, DataMapper, Packet4f, Packet2cf, RowMajor, Conjugate, PanelMode, true> pack;
   pack(blockA, lhs, depth, rows, stride, offset);
 }
 
-template<typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
-struct gemm_pack_lhs<std::complex<float>, Index, DataMapper, Pack1, Pack2, Packet, ColMajor, Conjugate, PanelMode>
-{
-  void operator()(std::complex<float>* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride=0, Index offset=0);
+template <typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
+struct gemm_pack_lhs<std::complex<float>, Index, DataMapper, Pack1, Pack2, Packet, ColMajor, Conjugate, PanelMode> {
+  void operator()(std::complex<float>* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride = 0,
+                  Index offset = 0);
 };
 
-template<typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
-void gemm_pack_lhs<std::complex<float>, Index, DataMapper, Pack1, Pack2, Packet, ColMajor, Conjugate, PanelMode>
-  ::operator()(std::complex<float>* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride, Index offset)
-{
+template <typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
+void gemm_pack_lhs<std::complex<float>, Index, DataMapper, Pack1, Pack2, Packet, ColMajor, Conjugate,
+                   PanelMode>::operator()(std::complex<float>* blockA, const DataMapper& lhs, Index depth, Index rows,
+                                          Index stride, Index offset) {
   dhs_cpack<float, DataMapper, Packet4f, Packet2cf, ColMajor, Conjugate, PanelMode, true> pack;
   pack(blockA, lhs, depth, rows, stride, offset);
 }
 
 #if EIGEN_ALTIVEC_USE_CUSTOM_PACK
-template<typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
-struct gemm_pack_rhs<float, Index, DataMapper, nr, ColMajor, Conjugate, PanelMode>
-{
-  void operator()(float* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride=0, Index offset=0);
+template <typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
+struct gemm_pack_rhs<float, Index, DataMapper, nr, ColMajor, Conjugate, PanelMode> {
+  void operator()(float* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride = 0, Index offset = 0);
 };
 
-template<typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
-void gemm_pack_rhs<float, Index, DataMapper, nr, ColMajor, Conjugate, PanelMode>
-  ::operator()(float* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride, Index offset)
-{
+template <typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
+void gemm_pack_rhs<float, Index, DataMapper, nr, ColMajor, Conjugate, PanelMode>::operator()(
+    float* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride, Index offset) {
   dhs_pack<float, DataMapper, Packet4f, ColMajor, PanelMode, false> pack;
   pack(blockB, rhs, depth, cols, stride, offset);
 }
 
-template<typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
-struct gemm_pack_rhs<float, Index, DataMapper, nr, RowMajor, Conjugate, PanelMode>
-{
-  void operator()(float* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride=0, Index offset=0);
+template <typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
+struct gemm_pack_rhs<float, Index, DataMapper, nr, RowMajor, Conjugate, PanelMode> {
+  void operator()(float* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride = 0, Index offset = 0);
 };
 
-template<typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
-void gemm_pack_rhs<float, Index, DataMapper, nr, RowMajor, Conjugate, PanelMode>
-  ::operator()(float* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride, Index offset)
-{
+template <typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
+void gemm_pack_rhs<float, Index, DataMapper, nr, RowMajor, Conjugate, PanelMode>::operator()(
+    float* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride, Index offset) {
   dhs_pack<float, DataMapper, Packet4f, RowMajor, PanelMode, false> pack;
   pack(blockB, rhs, depth, cols, stride, offset);
 }
 #endif
 
-template<typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
-struct gemm_pack_rhs<std::complex<float>, Index, DataMapper, nr, ColMajor, Conjugate, PanelMode>
-{
-  void operator()(std::complex<float>* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride=0, Index offset=0);
+template <typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
+struct gemm_pack_rhs<std::complex<float>, Index, DataMapper, nr, ColMajor, Conjugate, PanelMode> {
+  void operator()(std::complex<float>* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride = 0,
+                  Index offset = 0);
 };
 
-template<typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
-void gemm_pack_rhs<std::complex<float>, Index, DataMapper, nr, ColMajor, Conjugate, PanelMode>
-  ::operator()(std::complex<float>* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride, Index offset)
-{
+template <typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
+void gemm_pack_rhs<std::complex<float>, Index, DataMapper, nr, ColMajor, Conjugate, PanelMode>::operator()(
+    std::complex<float>* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride, Index offset) {
   dhs_cpack<float, DataMapper, Packet4f, Packet2cf, ColMajor, Conjugate, PanelMode, false> pack;
   pack(blockB, rhs, depth, cols, stride, offset);
 }
 
-template<typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
-struct gemm_pack_rhs<std::complex<float>, Index, DataMapper, nr, RowMajor, Conjugate, PanelMode>
-{
-  void operator()(std::complex<float>* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride=0, Index offset=0);
+template <typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
+struct gemm_pack_rhs<std::complex<float>, Index, DataMapper, nr, RowMajor, Conjugate, PanelMode> {
+  void operator()(std::complex<float>* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride = 0,
+                  Index offset = 0);
 };
 
-template<typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
-void gemm_pack_rhs<std::complex<float>, Index, DataMapper, nr, RowMajor, Conjugate, PanelMode>
-  ::operator()(std::complex<float>* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride, Index offset)
-{
+template <typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
+void gemm_pack_rhs<std::complex<float>, Index, DataMapper, nr, RowMajor, Conjugate, PanelMode>::operator()(
+    std::complex<float>* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride, Index offset) {
   dhs_cpack<float, DataMapper, Packet4f, Packet2cf, RowMajor, Conjugate, PanelMode, false> pack;
   pack(blockB, rhs, depth, cols, stride, offset);
 }
 
-template<typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
-struct gemm_pack_lhs<std::complex<double>, Index, DataMapper, Pack1, Pack2, Packet, RowMajor, Conjugate, PanelMode>
-{
-  void operator()(std::complex<double>* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride=0, Index offset=0);
+template <typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
+struct gemm_pack_lhs<std::complex<double>, Index, DataMapper, Pack1, Pack2, Packet, RowMajor, Conjugate, PanelMode> {
+  void operator()(std::complex<double>* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride = 0,
+                  Index offset = 0);
 };
 
-template<typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
-void gemm_pack_lhs<std::complex<double>, Index, DataMapper, Pack1, Pack2, Packet, RowMajor, Conjugate, PanelMode>
-  ::operator()(std::complex<double>* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride, Index offset)
-{
+template <typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
+void gemm_pack_lhs<std::complex<double>, Index, DataMapper, Pack1, Pack2, Packet, RowMajor, Conjugate,
+                   PanelMode>::operator()(std::complex<double>* blockA, const DataMapper& lhs, Index depth, Index rows,
+                                          Index stride, Index offset) {
   dhs_cpack<double, DataMapper, Packet2d, Packet1cd, RowMajor, Conjugate, PanelMode, true> pack;
   pack(blockA, lhs, depth, rows, stride, offset);
 }
 
-template<typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
-struct gemm_pack_lhs<std::complex<double>, Index, DataMapper, Pack1, Pack2, Packet, ColMajor, Conjugate, PanelMode>
-{
-  void operator()(std::complex<double>* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride=0, Index offset=0);
+template <typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
+struct gemm_pack_lhs<std::complex<double>, Index, DataMapper, Pack1, Pack2, Packet, ColMajor, Conjugate, PanelMode> {
+  void operator()(std::complex<double>* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride = 0,
+                  Index offset = 0);
 };
 
-template<typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
-void gemm_pack_lhs<std::complex<double>, Index, DataMapper, Pack1, Pack2, Packet, ColMajor, Conjugate, PanelMode>
-  ::operator()(std::complex<double>* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride, Index offset)
-{
+template <typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
+void gemm_pack_lhs<std::complex<double>, Index, DataMapper, Pack1, Pack2, Packet, ColMajor, Conjugate,
+                   PanelMode>::operator()(std::complex<double>* blockA, const DataMapper& lhs, Index depth, Index rows,
+                                          Index stride, Index offset) {
   dhs_cpack<double, DataMapper, Packet2d, Packet1cd, ColMajor, Conjugate, PanelMode, true> pack;
   pack(blockA, lhs, depth, rows, stride, offset);
 }
 
-template<typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
-struct gemm_pack_rhs<std::complex<double>, Index, DataMapper, nr, ColMajor, Conjugate, PanelMode>
-{
-  void operator()(std::complex<double>* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride=0, Index offset=0);
+template <typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
+struct gemm_pack_rhs<std::complex<double>, Index, DataMapper, nr, ColMajor, Conjugate, PanelMode> {
+  void operator()(std::complex<double>* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride = 0,
+                  Index offset = 0);
 };
 
-template<typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
-void gemm_pack_rhs<std::complex<double>, Index, DataMapper, nr, ColMajor, Conjugate, PanelMode>
-  ::operator()(std::complex<double>* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride, Index offset)
-{
+template <typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
+void gemm_pack_rhs<std::complex<double>, Index, DataMapper, nr, ColMajor, Conjugate, PanelMode>::operator()(
+    std::complex<double>* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride, Index offset) {
   dhs_cpack<double, DataMapper, Packet2d, Packet1cd, ColMajor, Conjugate, PanelMode, false> pack;
   pack(blockB, rhs, depth, cols, stride, offset);
 }
 
-template<typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
-struct gemm_pack_rhs<std::complex<double>, Index, DataMapper, nr, RowMajor, Conjugate, PanelMode>
-{
-  void operator()(std::complex<double>* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride=0, Index offset=0);
+template <typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
+struct gemm_pack_rhs<std::complex<double>, Index, DataMapper, nr, RowMajor, Conjugate, PanelMode> {
+  void operator()(std::complex<double>* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride = 0,
+                  Index offset = 0);
 };
 
-template<typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
-void gemm_pack_rhs<std::complex<double>, Index, DataMapper, nr, RowMajor, Conjugate, PanelMode>
-  ::operator()(std::complex<double>* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride, Index offset)
-{
+template <typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
+void gemm_pack_rhs<std::complex<double>, Index, DataMapper, nr, RowMajor, Conjugate, PanelMode>::operator()(
+    std::complex<double>* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride, Index offset) {
   dhs_cpack<double, DataMapper, Packet2d, Packet1cd, RowMajor, Conjugate, PanelMode, false> pack;
   pack(blockB, rhs, depth, cols, stride, offset);
 }
 
 // ********* gebp specializations *********
-template<typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
-struct gebp_kernel<float, float, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs>
-{
-  typedef typename quad_traits<float>::vectortype   Packet;
-  typedef typename quad_traits<float>::rhstype      RhsPacket;
+template <typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
+struct gebp_kernel<float, float, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs> {
+  typedef typename quad_traits<float>::vectortype Packet;
+  typedef typename quad_traits<float>::rhstype RhsPacket;
 
-  void operator()(const DataMapper& res, const float* blockA, const float* blockB,
-                  Index rows, Index depth, Index cols, float alpha,
-                  Index strideA=-1, Index strideB=-1, Index offsetA=0, Index offsetB=0);
+  void operator()(const DataMapper& res, const float* blockA, const float* blockB, Index rows, Index depth, Index cols,
+                  float alpha, Index strideA = -1, Index strideB = -1, Index offsetA = 0, Index offsetB = 0);
 };
 
-template<typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
-void gebp_kernel<float, float, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs>
-  ::operator()(const DataMapper& res, const float* blockA, const float* blockB,
-               Index rows, Index depth, Index cols, float alpha,
-               Index strideA, Index strideB, Index offsetA, Index offsetB)
-  {
-    const Index accRows = quad_traits<float>::rows;
-    const Index accCols = quad_traits<float>::size;
-    static void (*gemm_function)(const DataMapper&, const float*, const float*, Index, Index, Index, float, Index, Index, Index, Index) =
-    #ifdef EIGEN_MATRIX_PRODUCT_MMA_ALTIVEC_H
-      (supportsMMA()) ?
-        &Eigen::internal::gemmMMA<float, Packet, RhsPacket, DataMapper, accRows, accCols> :
-    #endif
-        &Eigen::internal::gemm<float, Packet, RhsPacket, DataMapper, accRows, accCols>;
-    gemm_function(res, blockA, blockB, rows, depth, cols, alpha, strideA, strideB, offsetA, offsetB);
-  }
+template <typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
+void gebp_kernel<float, float, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs>::operator()(
+    const DataMapper& res, const float* blockA, const float* blockB, Index rows, Index depth, Index cols, float alpha,
+    Index strideA, Index strideB, Index offsetA, Index offsetB) {
+  const Index accRows = quad_traits<float>::rows;
+  const Index accCols = quad_traits<float>::size;
+  static void (*gemm_function)(const DataMapper&, const float*, const float*, Index, Index, Index, float, Index, Index,
+                               Index, Index) =
+#ifdef EIGEN_MATRIX_PRODUCT_MMA_ALTIVEC_H
+      (supportsMMA()) ? &Eigen::internal::gemmMMA<float, Packet, RhsPacket, DataMapper, accRows, accCols> :
+#endif
+                      &Eigen::internal::gemm<float, Packet, RhsPacket, DataMapper, accRows, accCols>;
+  gemm_function(res, blockA, blockB, rows, depth, cols, alpha, strideA, strideB, offsetA, offsetB);
+}
 
-template<typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
-struct gebp_kernel<std::complex<float>, std::complex<float>, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs>
-{
-  typedef Packet4f   Packet;
-  typedef Packet2cf  Packetc;
-  typedef Packet4f   RhsPacket;
+template <typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
+struct gebp_kernel<std::complex<float>, std::complex<float>, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs> {
+  typedef Packet4f Packet;
+  typedef Packet2cf Packetc;
+  typedef Packet4f RhsPacket;
 
   void operator()(const DataMapper& res, const std::complex<float>* blockA, const std::complex<float>* blockB,
-                  Index rows, Index depth, Index cols, std::complex<float> alpha,
-                  Index strideA=-1, Index strideB=-1, Index offsetA=0, Index offsetB=0);
+                  Index rows, Index depth, Index cols, std::complex<float> alpha, Index strideA = -1,
+                  Index strideB = -1, Index offsetA = 0, Index offsetB = 0);
 };
 
-template<typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
-void gebp_kernel<std::complex<float>, std::complex<float>, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs>
-  ::operator()(const DataMapper& res, const std::complex<float>* blockA, const std::complex<float>* blockB,
-               Index rows, Index depth, Index cols, std::complex<float> alpha,
-               Index strideA, Index strideB, Index offsetA, Index offsetB)
-  {
-    const Index accRows = quad_traits<float>::rows;
-    const Index accCols = quad_traits<float>::size;
-    static void (*gemm_function)(const DataMapper&, const std::complex<float>*, const std::complex<float>*,
-          Index, Index, Index, std::complex<float>, Index, Index, Index, Index) =
-    #ifdef EIGEN_MATRIX_PRODUCT_MMA_ALTIVEC_H
-      (supportsMMA()) ?
-        &Eigen::internal::gemm_complexMMA<std::complex<float>, std::complex<float>, std::complex<float>, float, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, false, false> :
-    #endif
-        &Eigen::internal::gemm_complex<std::complex<float>, std::complex<float>, std::complex<float>, float, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, false, false>;
-    gemm_function(res, blockA, blockB, rows, depth, cols, alpha, strideA, strideB, offsetA, offsetB);
-  }
+template <typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
+void gebp_kernel<std::complex<float>, std::complex<float>, Index, DataMapper, mr, nr, ConjugateLhs,
+                 ConjugateRhs>::operator()(const DataMapper& res, const std::complex<float>* blockA,
+                                           const std::complex<float>* blockB, Index rows, Index depth, Index cols,
+                                           std::complex<float> alpha, Index strideA, Index strideB, Index offsetA,
+                                           Index offsetB) {
+  const Index accRows = quad_traits<float>::rows;
+  const Index accCols = quad_traits<float>::size;
+  static void (*gemm_function)(const DataMapper&, const std::complex<float>*, const std::complex<float>*, Index, Index,
+                               Index, std::complex<float>, Index, Index, Index, Index) =
+#ifdef EIGEN_MATRIX_PRODUCT_MMA_ALTIVEC_H
+      (supportsMMA()) ? &Eigen::internal::gemm_complexMMA<std::complex<float>, std::complex<float>, std::complex<float>,
+                                                          float, Packet, Packetc, RhsPacket, DataMapper, accRows,
+                                                          accCols, ConjugateLhs, ConjugateRhs, false, false>
+                      :
+#endif
+                      &Eigen::internal::gemm_complex<std::complex<float>, std::complex<float>, std::complex<float>,
+                                                     float, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols,
+                                                     ConjugateLhs, ConjugateRhs, false, false>;
+  gemm_function(res, blockA, blockB, rows, depth, cols, alpha, strideA, strideB, offsetA, offsetB);
+}
 
-template<typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
-struct gebp_kernel<float, std::complex<float>, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs>
-{
-  typedef Packet4f   Packet;
-  typedef Packet2cf  Packetc;
-  typedef Packet4f   RhsPacket;
+template <typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
+struct gebp_kernel<float, std::complex<float>, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs> {
+  typedef Packet4f Packet;
+  typedef Packet2cf Packetc;
+  typedef Packet4f RhsPacket;
 
-  void operator()(const DataMapper& res, const float* blockA, const std::complex<float>* blockB,
-                  Index rows, Index depth, Index cols, std::complex<float> alpha,
-                  Index strideA=-1, Index strideB=-1, Index offsetA=0, Index offsetB=0);
+  void operator()(const DataMapper& res, const float* blockA, const std::complex<float>* blockB, Index rows,
+                  Index depth, Index cols, std::complex<float> alpha, Index strideA = -1, Index strideB = -1,
+                  Index offsetA = 0, Index offsetB = 0);
 };
 
-template<typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
-void gebp_kernel<float, std::complex<float>, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs>
-  ::operator()(const DataMapper& res, const float* blockA, const std::complex<float>* blockB,
-               Index rows, Index depth, Index cols, std::complex<float> alpha,
-               Index strideA, Index strideB, Index offsetA, Index offsetB)
-  {
-    const Index accRows = quad_traits<float>::rows;
-    const Index accCols = quad_traits<float>::size;
-    static void (*gemm_function)(const DataMapper&, const float*, const std::complex<float>*,
-          Index, Index, Index, std::complex<float>, Index, Index, Index, Index) =
-    #ifdef EIGEN_MATRIX_PRODUCT_MMA_ALTIVEC_H
-      (supportsMMA()) ?
-        &Eigen::internal::gemm_complexMMA<float, std::complex<float>, std::complex<float>, float, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, true, false> :
-    #endif
-        &Eigen::internal::gemm_complex<float, std::complex<float>, std::complex<float>, float, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, true, false>;
-    gemm_function(res, blockA, blockB, rows, depth, cols, alpha, strideA, strideB, offsetA, offsetB);
-  }
+template <typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
+void gebp_kernel<float, std::complex<float>, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs>::operator()(
+    const DataMapper& res, const float* blockA, const std::complex<float>* blockB, Index rows, Index depth, Index cols,
+    std::complex<float> alpha, Index strideA, Index strideB, Index offsetA, Index offsetB) {
+  const Index accRows = quad_traits<float>::rows;
+  const Index accCols = quad_traits<float>::size;
+  static void (*gemm_function)(const DataMapper&, const float*, const std::complex<float>*, Index, Index, Index,
+                               std::complex<float>, Index, Index, Index, Index) =
+#ifdef EIGEN_MATRIX_PRODUCT_MMA_ALTIVEC_H
+      (supportsMMA()) ? &Eigen::internal::gemm_complexMMA<float, std::complex<float>, std::complex<float>, float,
+                                                          Packet, Packetc, RhsPacket, DataMapper, accRows, accCols,
+                                                          ConjugateLhs, ConjugateRhs, true, false>
+                      :
+#endif
+                      &Eigen::internal::gemm_complex<float, std::complex<float>, std::complex<float>, float, Packet,
+                                                     Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs,
+                                                     ConjugateRhs, true, false>;
+  gemm_function(res, blockA, blockB, rows, depth, cols, alpha, strideA, strideB, offsetA, offsetB);
+}
 
-template<typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
-struct gebp_kernel<std::complex<float>, float, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs>
-{
-  typedef Packet4f   Packet;
-  typedef Packet2cf  Packetc;
-  typedef Packet4f   RhsPacket;
+template <typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
+struct gebp_kernel<std::complex<float>, float, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs> {
+  typedef Packet4f Packet;
+  typedef Packet2cf Packetc;
+  typedef Packet4f RhsPacket;
 
-  void operator()(const DataMapper& res, const std::complex<float>* blockA, const float* blockB,
-                  Index rows, Index depth, Index cols, std::complex<float> alpha,
-                  Index strideA=-1, Index strideB=-1, Index offsetA=0, Index offsetB=0);
+  void operator()(const DataMapper& res, const std::complex<float>* blockA, const float* blockB, Index rows,
+                  Index depth, Index cols, std::complex<float> alpha, Index strideA = -1, Index strideB = -1,
+                  Index offsetA = 0, Index offsetB = 0);
 };
 
-template<typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
-void gebp_kernel<std::complex<float>, float, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs>
-  ::operator()(const DataMapper& res, const std::complex<float>* blockA, const float* blockB,
-               Index rows, Index depth, Index cols, std::complex<float> alpha,
-               Index strideA, Index strideB, Index offsetA, Index offsetB)
-  {
-    const Index accRows = quad_traits<float>::rows;
-    const Index accCols = quad_traits<float>::size;
-    static void (*gemm_function)(const DataMapper&, const std::complex<float>*, const float*,
-          Index, Index, Index, std::complex<float>, Index, Index, Index, Index) =
-    #ifdef EIGEN_MATRIX_PRODUCT_MMA_ALTIVEC_H
-      (supportsMMA()) ?
-        &Eigen::internal::gemm_complexMMA<std::complex<float>, float, std::complex<float>, float, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, false, true> :
-    #endif
-        &Eigen::internal::gemm_complex<std::complex<float>, float, std::complex<float>, float, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, false, true>;
-    gemm_function(res, blockA, blockB, rows, depth, cols, alpha, strideA, strideB, offsetA, offsetB);
-  }
+template <typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
+void gebp_kernel<std::complex<float>, float, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs>::operator()(
+    const DataMapper& res, const std::complex<float>* blockA, const float* blockB, Index rows, Index depth, Index cols,
+    std::complex<float> alpha, Index strideA, Index strideB, Index offsetA, Index offsetB) {
+  const Index accRows = quad_traits<float>::rows;
+  const Index accCols = quad_traits<float>::size;
+  static void (*gemm_function)(const DataMapper&, const std::complex<float>*, const float*, Index, Index, Index,
+                               std::complex<float>, Index, Index, Index, Index) =
+#ifdef EIGEN_MATRIX_PRODUCT_MMA_ALTIVEC_H
+      (supportsMMA()) ? &Eigen::internal::gemm_complexMMA<std::complex<float>, float, std::complex<float>, float,
+                                                          Packet, Packetc, RhsPacket, DataMapper, accRows, accCols,
+                                                          ConjugateLhs, ConjugateRhs, false, true>
+                      :
+#endif
+                      &Eigen::internal::gemm_complex<std::complex<float>, float, std::complex<float>, float, Packet,
+                                                     Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs,
+                                                     ConjugateRhs, false, true>;
+  gemm_function(res, blockA, blockB, rows, depth, cols, alpha, strideA, strideB, offsetA, offsetB);
+}
 
-template<typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
-struct gebp_kernel<double, double, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs>
-{
-  typedef typename quad_traits<double>::vectortype  Packet;
-  typedef typename quad_traits<double>::rhstype     RhsPacket;
+template <typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
+struct gebp_kernel<double, double, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs> {
+  typedef typename quad_traits<double>::vectortype Packet;
+  typedef typename quad_traits<double>::rhstype RhsPacket;
 
-  void operator()(const DataMapper& res, const double* blockA, const double* blockB,
-                  Index rows, Index depth, Index cols, double alpha,
-                  Index strideA=-1, Index strideB=-1, Index offsetA=0, Index offsetB=0);
+  void operator()(const DataMapper& res, const double* blockA, const double* blockB, Index rows, Index depth,
+                  Index cols, double alpha, Index strideA = -1, Index strideB = -1, Index offsetA = 0,
+                  Index offsetB = 0);
 };
 
-template<typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
-void gebp_kernel<double, double, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs>
-  ::operator()(const DataMapper& res, const double* blockA, const double* blockB,
-               Index rows, Index depth, Index cols, double alpha,
-               Index strideA, Index strideB, Index offsetA, Index offsetB)
-  {
-    const Index accRows = quad_traits<double>::rows;
-    const Index accCols = quad_traits<double>::size;
-    static void (*gemm_function)(const DataMapper&, const double*, const double*, Index, Index, Index, double, Index, Index, Index, Index) =
-    #ifdef EIGEN_MATRIX_PRODUCT_MMA_ALTIVEC_H
-      (supportsMMA()) ?
-        &Eigen::internal::gemmMMA<double, Packet, RhsPacket, DataMapper, accRows, accCols> :
-    #endif
-        &Eigen::internal::gemm<double, Packet, RhsPacket, DataMapper, accRows, accCols>;
-    gemm_function(res, blockA, blockB, rows, depth, cols, alpha, strideA, strideB, offsetA, offsetB);
-  }
+template <typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
+void gebp_kernel<double, double, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs>::operator()(
+    const DataMapper& res, const double* blockA, const double* blockB, Index rows, Index depth, Index cols,
+    double alpha, Index strideA, Index strideB, Index offsetA, Index offsetB) {
+  const Index accRows = quad_traits<double>::rows;
+  const Index accCols = quad_traits<double>::size;
+  static void (*gemm_function)(const DataMapper&, const double*, const double*, Index, Index, Index, double, Index,
+                               Index, Index, Index) =
+#ifdef EIGEN_MATRIX_PRODUCT_MMA_ALTIVEC_H
+      (supportsMMA()) ? &Eigen::internal::gemmMMA<double, Packet, RhsPacket, DataMapper, accRows, accCols> :
+#endif
+                      &Eigen::internal::gemm<double, Packet, RhsPacket, DataMapper, accRows, accCols>;
+  gemm_function(res, blockA, blockB, rows, depth, cols, alpha, strideA, strideB, offsetA, offsetB);
+}
 
-template<typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
-struct gebp_kernel<std::complex<double>, std::complex<double>, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs>
-{
-  typedef quad_traits<double>::vectortype   Packet;
-  typedef Packet1cd  Packetc;
-  typedef quad_traits<double>::rhstype   RhsPacket;
+template <typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
+struct gebp_kernel<std::complex<double>, std::complex<double>, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs> {
+  typedef quad_traits<double>::vectortype Packet;
+  typedef Packet1cd Packetc;
+  typedef quad_traits<double>::rhstype RhsPacket;
 
   void operator()(const DataMapper& res, const std::complex<double>* blockA, const std::complex<double>* blockB,
-                  Index rows, Index depth, Index cols, std::complex<double> alpha,
-                  Index strideA=-1, Index strideB=-1, Index offsetA=0, Index offsetB=0);
+                  Index rows, Index depth, Index cols, std::complex<double> alpha, Index strideA = -1,
+                  Index strideB = -1, Index offsetA = 0, Index offsetB = 0);
 };
 
-template<typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
-void gebp_kernel<std::complex<double>, std::complex<double>, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs>
-  ::operator()(const DataMapper& res, const std::complex<double>* blockA, const std::complex<double>* blockB,
-               Index rows, Index depth, Index cols, std::complex<double> alpha,
-               Index strideA, Index strideB, Index offsetA, Index offsetB)
-  {
-    const Index accRows = quad_traits<double>::rows;
-    const Index accCols = quad_traits<double>::size;
-    static void (*gemm_function)(const DataMapper&, const std::complex<double>*, const std::complex<double>*,
-          Index, Index, Index, std::complex<double>, Index, Index, Index, Index) =
-    #ifdef EIGEN_MATRIX_PRODUCT_MMA_ALTIVEC_H
-      (supportsMMA()) ?
-        &Eigen::internal::gemm_complexMMA<std::complex<double>, std::complex<double>, std::complex<double>, double, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, false, false> :
-    #endif
-        &Eigen::internal::gemm_complex<std::complex<double>, std::complex<double>, std::complex<double>, double, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, false, false>;
-    gemm_function(res, blockA, blockB, rows, depth, cols, alpha, strideA, strideB, offsetA, offsetB);
-  }
+template <typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
+void gebp_kernel<std::complex<double>, std::complex<double>, Index, DataMapper, mr, nr, ConjugateLhs,
+                 ConjugateRhs>::operator()(const DataMapper& res, const std::complex<double>* blockA,
+                                           const std::complex<double>* blockB, Index rows, Index depth, Index cols,
+                                           std::complex<double> alpha, Index strideA, Index strideB, Index offsetA,
+                                           Index offsetB) {
+  const Index accRows = quad_traits<double>::rows;
+  const Index accCols = quad_traits<double>::size;
+  static void (*gemm_function)(const DataMapper&, const std::complex<double>*, const std::complex<double>*, Index,
+                               Index, Index, std::complex<double>, Index, Index, Index, Index) =
+#ifdef EIGEN_MATRIX_PRODUCT_MMA_ALTIVEC_H
+      (supportsMMA())
+          ? &Eigen::internal::gemm_complexMMA<std::complex<double>, std::complex<double>, std::complex<double>, double,
+                                              Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs,
+                                              ConjugateRhs, false, false>
+          :
+#endif
+          &Eigen::internal::gemm_complex<std::complex<double>, std::complex<double>, std::complex<double>, double,
+                                         Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs,
+                                         ConjugateRhs, false, false>;
+  gemm_function(res, blockA, blockB, rows, depth, cols, alpha, strideA, strideB, offsetA, offsetB);
+}
 
-template<typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
-struct gebp_kernel<std::complex<double>, double, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs>
-{
-  typedef quad_traits<double>::vectortype   Packet;
-  typedef Packet1cd  Packetc;
-  typedef quad_traits<double>::rhstype   RhsPacket;
+template <typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
+struct gebp_kernel<std::complex<double>, double, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs> {
+  typedef quad_traits<double>::vectortype Packet;
+  typedef Packet1cd Packetc;
+  typedef quad_traits<double>::rhstype RhsPacket;
 
-  void operator()(const DataMapper& res, const std::complex<double>* blockA, const double* blockB,
-                  Index rows, Index depth, Index cols, std::complex<double> alpha,
-                  Index strideA=-1, Index strideB=-1, Index offsetA=0, Index offsetB=0);
+  void operator()(const DataMapper& res, const std::complex<double>* blockA, const double* blockB, Index rows,
+                  Index depth, Index cols, std::complex<double> alpha, Index strideA = -1, Index strideB = -1,
+                  Index offsetA = 0, Index offsetB = 0);
 };
 
-template<typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
-void gebp_kernel<std::complex<double>, double, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs>
-  ::operator()(const DataMapper& res, const std::complex<double>* blockA, const double* blockB,
-               Index rows, Index depth, Index cols, std::complex<double> alpha,
-               Index strideA, Index strideB, Index offsetA, Index offsetB)
-  {
-    const Index accRows = quad_traits<double>::rows;
-    const Index accCols = quad_traits<double>::size;
-    static void (*gemm_function)(const DataMapper&, const std::complex<double>*, const double*,
-          Index, Index, Index, std::complex<double>, Index, Index, Index, Index) =
-    #ifdef EIGEN_MATRIX_PRODUCT_MMA_ALTIVEC_H
-      (supportsMMA()) ?
-        &Eigen::internal::gemm_complexMMA<std::complex<double>, double, std::complex<double>, double, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, false, true> :
-    #endif
-        &Eigen::internal::gemm_complex<std::complex<double>, double, std::complex<double>, double, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, false, true>;
-    gemm_function(res, blockA, blockB, rows, depth, cols, alpha, strideA, strideB, offsetA, offsetB);
-  }
+template <typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
+void gebp_kernel<std::complex<double>, double, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs>::operator()(
+    const DataMapper& res, const std::complex<double>* blockA, const double* blockB, Index rows, Index depth,
+    Index cols, std::complex<double> alpha, Index strideA, Index strideB, Index offsetA, Index offsetB) {
+  const Index accRows = quad_traits<double>::rows;
+  const Index accCols = quad_traits<double>::size;
+  static void (*gemm_function)(const DataMapper&, const std::complex<double>*, const double*, Index, Index, Index,
+                               std::complex<double>, Index, Index, Index, Index) =
+#ifdef EIGEN_MATRIX_PRODUCT_MMA_ALTIVEC_H
+      (supportsMMA()) ? &Eigen::internal::gemm_complexMMA<std::complex<double>, double, std::complex<double>, double,
+                                                          Packet, Packetc, RhsPacket, DataMapper, accRows, accCols,
+                                                          ConjugateLhs, ConjugateRhs, false, true>
+                      :
+#endif
+                      &Eigen::internal::gemm_complex<std::complex<double>, double, std::complex<double>, double, Packet,
+                                                     Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs,
+                                                     ConjugateRhs, false, true>;
+  gemm_function(res, blockA, blockB, rows, depth, cols, alpha, strideA, strideB, offsetA, offsetB);
+}
 
-template<typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
-struct gebp_kernel<double, std::complex<double>, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs>
-{
-  typedef quad_traits<double>::vectortype   Packet;
-  typedef Packet1cd  Packetc;
-  typedef quad_traits<double>::rhstype   RhsPacket;
+template <typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
+struct gebp_kernel<double, std::complex<double>, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs> {
+  typedef quad_traits<double>::vectortype Packet;
+  typedef Packet1cd Packetc;
+  typedef quad_traits<double>::rhstype RhsPacket;
 
-  void operator()(const DataMapper& res, const double* blockA, const std::complex<double>* blockB,
-                  Index rows, Index depth, Index cols, std::complex<double> alpha,
-                  Index strideA=-1, Index strideB=-1, Index offsetA=0, Index offsetB=0);
+  void operator()(const DataMapper& res, const double* blockA, const std::complex<double>* blockB, Index rows,
+                  Index depth, Index cols, std::complex<double> alpha, Index strideA = -1, Index strideB = -1,
+                  Index offsetA = 0, Index offsetB = 0);
 };
 
-template<typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
-void gebp_kernel<double, std::complex<double>, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs>
-  ::operator()(const DataMapper& res, const double* blockA, const std::complex<double>* blockB,
-               Index rows, Index depth, Index cols, std::complex<double> alpha,
-               Index strideA, Index strideB, Index offsetA, Index offsetB)
-  {
-    const Index accRows = quad_traits<double>::rows;
-    const Index accCols = quad_traits<double>::size;
-    static void (*gemm_function)(const DataMapper&, const double*, const std::complex<double>*,
-          Index, Index, Index, std::complex<double>, Index, Index, Index, Index) =
-    #ifdef EIGEN_MATRIX_PRODUCT_MMA_ALTIVEC_H
-      (supportsMMA()) ?
-        &Eigen::internal::gemm_complexMMA<double, std::complex<double>, std::complex<double>, double, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, true, false> :
-    #endif
-        &Eigen::internal::gemm_complex<double, std::complex<double>, std::complex<double>, double, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, true, false>;
-    gemm_function(res, blockA, blockB, rows, depth, cols, alpha, strideA, strideB, offsetA, offsetB);
-  }
+template <typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
+void gebp_kernel<double, std::complex<double>, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs>::operator()(
+    const DataMapper& res, const double* blockA, const std::complex<double>* blockB, Index rows, Index depth,
+    Index cols, std::complex<double> alpha, Index strideA, Index strideB, Index offsetA, Index offsetB) {
+  const Index accRows = quad_traits<double>::rows;
+  const Index accCols = quad_traits<double>::size;
+  static void (*gemm_function)(const DataMapper&, const double*, const std::complex<double>*, Index, Index, Index,
+                               std::complex<double>, Index, Index, Index, Index) =
+#ifdef EIGEN_MATRIX_PRODUCT_MMA_ALTIVEC_H
+      (supportsMMA()) ? &Eigen::internal::gemm_complexMMA<double, std::complex<double>, std::complex<double>, double,
+                                                          Packet, Packetc, RhsPacket, DataMapper, accRows, accCols,
+                                                          ConjugateLhs, ConjugateRhs, true, false>
+                      :
+#endif
+                      &Eigen::internal::gemm_complex<double, std::complex<double>, std::complex<double>, double, Packet,
+                                                     Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs,
+                                                     ConjugateRhs, true, false>;
+  gemm_function(res, blockA, blockB, rows, depth, cols, alpha, strideA, strideB, offsetA, offsetB);
+}
 
-template<typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
-struct gebp_kernel<bfloat16, bfloat16, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs>
-{
-  typedef typename quad_traits<bfloat16>::vectortype   Packet;
-  typedef typename quad_traits<bfloat16>::rhstype      RhsPacket;
+template <typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
+struct gebp_kernel<bfloat16, bfloat16, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs> {
+  typedef typename quad_traits<bfloat16>::vectortype Packet;
+  typedef typename quad_traits<bfloat16>::rhstype RhsPacket;
 
-  void operator()(const DataMapper& res, const bfloat16* blockA, const bfloat16* blockB,
-                  Index rows, Index depth, Index cols, bfloat16 alpha,
-                  Index strideA=-1, Index strideB=-1, Index offsetA=0, Index offsetB=0);
+  void operator()(const DataMapper& res, const bfloat16* blockA, const bfloat16* blockB, Index rows, Index depth,
+                  Index cols, bfloat16 alpha, Index strideA = -1, Index strideB = -1, Index offsetA = 0,
+                  Index offsetB = 0);
 };
 
-template<typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
-void gebp_kernel<bfloat16, bfloat16, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs>
-  ::operator()(const DataMapper& res, const bfloat16* blockA, const bfloat16* blockB,
-               Index rows, Index depth, Index cols, bfloat16 alpha,
-               Index strideA, Index strideB, Index offsetA, Index offsetB)
-  {
-    static void (*gemm_function)(const DataMapper&, const bfloat16*, const bfloat16*, Index, Index, Index, bfloat16, Index, Index, Index, Index) =
-    #ifdef EIGEN_MATRIX_PRODUCT_MMA_ALTIVEC_H
-      (supportsMMA()) ?
-        &Eigen::internal::gemmMMAbfloat16<DataMapper> :
-    #endif
-        &Eigen::internal::gemmbfloat16<DataMapper>;
-    gemm_function(res, blockA, blockB, rows, depth, cols, alpha, strideA, strideB, offsetA, offsetB);
-  }
-} // end namespace internal
+template <typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
+void gebp_kernel<bfloat16, bfloat16, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs>::operator()(
+    const DataMapper& res, const bfloat16* blockA, const bfloat16* blockB, Index rows, Index depth, Index cols,
+    bfloat16 alpha, Index strideA, Index strideB, Index offsetA, Index offsetB) {
+  static void (*gemm_function)(const DataMapper&, const bfloat16*, const bfloat16*, Index, Index, Index, bfloat16,
+                               Index, Index, Index, Index) =
+#ifdef EIGEN_MATRIX_PRODUCT_MMA_ALTIVEC_H
+      (supportsMMA()) ? &Eigen::internal::gemmMMAbfloat16<DataMapper> :
+#endif
+                      &Eigen::internal::gemmbfloat16<DataMapper>;
+  gemm_function(res, blockA, blockB, rows, depth, cols, alpha, strideA, strideB, offsetA, offsetB);
+}
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_MATRIX_PRODUCT_ALTIVEC_H
+#endif  // EIGEN_MATRIX_PRODUCT_ALTIVEC_H
diff --git a/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h b/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h
index fa1755f..e78ca5a 100644
--- a/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h
+++ b/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h
@@ -1,6 +1,6 @@
-//#define EIGEN_POWER_USE_PREFETCH  // Use prefetching in gemm routines
+// #define EIGEN_POWER_USE_PREFETCH  // Use prefetching in gemm routines
 #ifdef EIGEN_POWER_USE_PREFETCH
-#define EIGEN_POWER_PREFETCH(p)  prefetch(p)
+#define EIGEN_POWER_PREFETCH(p) prefetch(p)
 #else
 #define EIGEN_POWER_PREFETCH(p)
 #endif
@@ -16,158 +16,125 @@
 
 namespace internal {
 
-template<typename Scalar, typename Packet, typename DataMapper, const Index accRows, const Index accCols>
-EIGEN_ALWAYS_INLINE void gemm_extra_row(
-  const DataMapper& res,
-  const Scalar* lhs_base,
-  const Scalar* rhs_base,
-  Index depth,
-  Index strideA,
-  Index offsetA,
-  Index strideB,
-  Index row,
-  Index rows,
-  Index remaining_rows,
-  const Packet& pAlpha,
-  const Packet& pMask);
+template <typename Scalar, typename Packet, typename DataMapper, const Index accRows, const Index accCols>
+EIGEN_ALWAYS_INLINE void gemm_extra_row(const DataMapper& res, const Scalar* lhs_base, const Scalar* rhs_base,
+                                        Index depth, Index strideA, Index offsetA, Index strideB, Index row, Index rows,
+                                        Index remaining_rows, const Packet& pAlpha, const Packet& pMask);
 
-template<typename Scalar, typename Packet, typename DataMapper, const Index accCols>
-EIGEN_ALWAYS_INLINE void gemm_extra_cols(
-  const DataMapper& res,
-  const Scalar* blockA,
-  const Scalar* blockB,
-  Index depth,
-  Index strideA,
-  Index offsetA,
-  Index strideB,
-  Index offsetB,
-  Index col,
-  Index rows,
-  Index cols,
-  Index remaining_rows,
-  const Packet& pAlpha,
-  const Packet& pMask);
+template <typename Scalar, typename Packet, typename DataMapper, const Index accCols>
+EIGEN_ALWAYS_INLINE void gemm_extra_cols(const DataMapper& res, const Scalar* blockA, const Scalar* blockB, Index depth,
+                                         Index strideA, Index offsetA, Index strideB, Index offsetB, Index col,
+                                         Index rows, Index cols, Index remaining_rows, const Packet& pAlpha,
+                                         const Packet& pMask);
 
-template<typename Packet>
+template <typename Packet>
 EIGEN_ALWAYS_INLINE Packet bmask(const Index remaining_rows);
 
-template<typename Scalar, typename Packet, typename Packetc, typename DataMapper, const Index accRows, const Index accCols, bool ConjugateLhs, bool ConjugateRhs, bool LhsIsReal, bool RhsIsReal>
-EIGEN_ALWAYS_INLINE void gemm_complex_extra_row(
-  const DataMapper& res,
-  const Scalar* lhs_base,
-  const Scalar* rhs_base,
-  Index depth,
-  Index strideA,
-  Index offsetA,
-  Index strideB,
-  Index row,
-  Index rows,
-  Index remaining_rows,
-  const Packet& pAlphaReal,
-  const Packet& pAlphaImag,
-  const Packet& pMask);
+template <typename Scalar, typename Packet, typename Packetc, typename DataMapper, const Index accRows,
+          const Index accCols, bool ConjugateLhs, bool ConjugateRhs, bool LhsIsReal, bool RhsIsReal>
+EIGEN_ALWAYS_INLINE void gemm_complex_extra_row(const DataMapper& res, const Scalar* lhs_base, const Scalar* rhs_base,
+                                                Index depth, Index strideA, Index offsetA, Index strideB, Index row,
+                                                Index rows, Index remaining_rows, const Packet& pAlphaReal,
+                                                const Packet& pAlphaImag, const Packet& pMask);
 
-template<typename Scalar, typename Packet, typename Packetc, typename DataMapper, const Index accCols, bool ConjugateLhs, bool ConjugateRhs, bool LhsIsReal, bool RhsIsReal>
-EIGEN_ALWAYS_INLINE void gemm_complex_extra_cols(
-  const DataMapper& res,
-  const Scalar* blockA,
-  const Scalar* blockB,
-  Index depth,
-  Index strideA,
-  Index offsetA,
-  Index strideB,
-  Index offsetB,
-  Index col,
-  Index rows,
-  Index cols,
-  Index remaining_rows,
-  const Packet& pAlphaReal,
-  const Packet& pAlphaImag,
-  const Packet& pMask);
+template <typename Scalar, typename Packet, typename Packetc, typename DataMapper, const Index accCols,
+          bool ConjugateLhs, bool ConjugateRhs, bool LhsIsReal, bool RhsIsReal>
+EIGEN_ALWAYS_INLINE void gemm_complex_extra_cols(const DataMapper& res, const Scalar* blockA, const Scalar* blockB,
+                                                 Index depth, Index strideA, Index offsetA, Index strideB,
+                                                 Index offsetB, Index col, Index rows, Index cols, Index remaining_rows,
+                                                 const Packet& pAlphaReal, const Packet& pAlphaImag,
+                                                 const Packet& pMask);
 
-template<typename DataMapper>
-EIGEN_ALWAYS_INLINE void convertArrayBF16toF32(float *result, Index cols, Index rows, const DataMapper& src);
+template <typename DataMapper>
+EIGEN_ALWAYS_INLINE void convertArrayBF16toF32(float* result, Index cols, Index rows, const DataMapper& src);
 
-template<const Index size, bool non_unit_stride, Index delta>
+template <const Index size, bool non_unit_stride, Index delta>
 EIGEN_ALWAYS_INLINE void storeBF16fromResult(bfloat16* dst, Packet8bf data, Index resInc, Index extra = 0);
 
-template<bool non_unit_stride = false>
-EIGEN_ALWAYS_INLINE void convertArrayPointerBF16toF32(float *result, Index cols, Index rows, bfloat16* src, Index resInc = 1);
+template <bool non_unit_stride = false>
+EIGEN_ALWAYS_INLINE void convertArrayPointerBF16toF32(float* result, Index cols, Index rows, bfloat16* src,
+                                                      Index resInc = 1);
 
-template<bool rhsExtraCols, bool lhsExtraRows>
-EIGEN_ALWAYS_INLINE void storeResults(Packet4f (&acc)[4], Index rows, const Packet4f pAlpha, float* result, Index extra_cols, Index extra_rows);
+template <bool rhsExtraCols, bool lhsExtraRows>
+EIGEN_ALWAYS_INLINE void storeResults(Packet4f (&acc)[4], Index rows, const Packet4f pAlpha, float* result,
+                                      Index extra_cols, Index extra_rows);
 
-template<Index num_acc, bool extraRows, Index size = 4>
-EIGEN_ALWAYS_INLINE void outputVecColResults(Packet4f (&acc)[num_acc][size], float *result, Packet4f pAlpha, Index extra_rows);
+template <Index num_acc, bool extraRows, Index size = 4>
+EIGEN_ALWAYS_INLINE void outputVecColResults(Packet4f (&acc)[num_acc][size], float* result, Packet4f pAlpha,
+                                             Index extra_rows);
 
-template<Index num_acc, Index size = 4>
-EIGEN_ALWAYS_INLINE void outputVecResults(Packet4f (&acc)[num_acc][size], float *result, Packet4f pAlpha);
+template <Index num_acc, Index size = 4>
+EIGEN_ALWAYS_INLINE void outputVecResults(Packet4f (&acc)[num_acc][size], float* result, Packet4f pAlpha);
 
-template<typename RhsMapper, bool linear>
+template <typename RhsMapper, bool linear>
 EIGEN_ALWAYS_INLINE Packet8bf loadColData(RhsMapper& rhs, Index j);
 
-template<typename Packet>
-EIGEN_ALWAYS_INLINE Packet ploadLhs(const __UNPACK_TYPE__(Packet)* lhs);
+template <typename Packet>
+EIGEN_ALWAYS_INLINE Packet ploadLhs(const __UNPACK_TYPE__(Packet) * lhs);
 
-template<typename DataMapper, typename Packet, const Index accCols, int StorageOrder, bool Complex, int N, bool full = true>
-EIGEN_ALWAYS_INLINE void bload(PacketBlock<Packet,N*(Complex?2:1)>& acc, const DataMapper& res, Index row, Index col);
+template <typename DataMapper, typename Packet, const Index accCols, int StorageOrder, bool Complex, int N,
+          bool full = true>
+EIGEN_ALWAYS_INLINE void bload(PacketBlock<Packet, N*(Complex ? 2 : 1)>& acc, const DataMapper& res, Index row,
+                               Index col);
 
-template<typename DataMapper, typename Packet, int N>
-EIGEN_ALWAYS_INLINE void bstore(PacketBlock<Packet,N>& acc, const DataMapper& res, Index row);
+template <typename DataMapper, typename Packet, int N>
+EIGEN_ALWAYS_INLINE void bstore(PacketBlock<Packet, N>& acc, const DataMapper& res, Index row);
 
 #ifdef USE_PARTIAL_PACKETS
-template<typename DataMapper, typename Packet, const Index accCols, bool Complex, Index N, bool full = true>
-EIGEN_ALWAYS_INLINE void bload_partial(PacketBlock<Packet,N*(Complex?2:1)>& acc, const DataMapper& res, Index row, Index elements);
+template <typename DataMapper, typename Packet, const Index accCols, bool Complex, Index N, bool full = true>
+EIGEN_ALWAYS_INLINE void bload_partial(PacketBlock<Packet, N*(Complex ? 2 : 1)>& acc, const DataMapper& res, Index row,
+                                       Index elements);
 
-template<typename DataMapper, typename Packet, Index N>
-EIGEN_ALWAYS_INLINE void bstore_partial(PacketBlock<Packet,N>& acc, const DataMapper& res, Index row, Index elements);
+template <typename DataMapper, typename Packet, Index N>
+EIGEN_ALWAYS_INLINE void bstore_partial(PacketBlock<Packet, N>& acc, const DataMapper& res, Index row, Index elements);
 #endif
 
-template<typename Packet, int N>
-EIGEN_ALWAYS_INLINE void bscale(PacketBlock<Packet,N>& acc, PacketBlock<Packet,N>& accZ, const Packet& pAlpha);
+template <typename Packet, int N>
+EIGEN_ALWAYS_INLINE void bscale(PacketBlock<Packet, N>& acc, PacketBlock<Packet, N>& accZ, const Packet& pAlpha);
 
-template<typename Packet, int N, bool mask>
-EIGEN_ALWAYS_INLINE void bscale(PacketBlock<Packet,N>& acc, PacketBlock<Packet,N>& accZ, const Packet& pAlpha, const Packet& pMask);
+template <typename Packet, int N, bool mask>
+EIGEN_ALWAYS_INLINE void bscale(PacketBlock<Packet, N>& acc, PacketBlock<Packet, N>& accZ, const Packet& pAlpha,
+                                const Packet& pMask);
 
-template<typename Packet, int N, bool mask>
-EIGEN_ALWAYS_INLINE void bscalec(PacketBlock<Packet,N>& aReal, PacketBlock<Packet,N>& aImag, const Packet& bReal, const Packet& bImag, PacketBlock<Packet,N>& cReal, PacketBlock<Packet,N>& cImag, const Packet& pMask);
+template <typename Packet, int N, bool mask>
+EIGEN_ALWAYS_INLINE void bscalec(PacketBlock<Packet, N>& aReal, PacketBlock<Packet, N>& aImag, const Packet& bReal,
+                                 const Packet& bImag, PacketBlock<Packet, N>& cReal, PacketBlock<Packet, N>& cImag,
+                                 const Packet& pMask);
 
-template<typename Packet, typename Packetc, int N, bool full>
-EIGEN_ALWAYS_INLINE void bcouple(PacketBlock<Packet,N>& taccReal, PacketBlock<Packet,N>& taccImag, PacketBlock<Packetc,N*2>& tRes, PacketBlock<Packetc, N>& acc1, PacketBlock<Packetc, N>& acc2);
+template <typename Packet, typename Packetc, int N, bool full>
+EIGEN_ALWAYS_INLINE void bcouple(PacketBlock<Packet, N>& taccReal, PacketBlock<Packet, N>& taccImag,
+                                 PacketBlock<Packetc, N * 2>& tRes, PacketBlock<Packetc, N>& acc1,
+                                 PacketBlock<Packetc, N>& acc2);
 
-#define MICRO_NORMAL(iter) \
-  (accCols == accCols2) || (unroll_factor != (iter + 1))
+#define MICRO_NORMAL(iter) (accCols == accCols2) || (unroll_factor != (iter + 1))
 
-#define MICRO_UNROLL_ITER1(func, N) \
-  switch (remaining_rows) { \
-    default: \
-      func(N, 0) \
-      break; \
-    case 1: \
-      func(N, 1) \
-      break; \
-    case 2: \
+#define MICRO_UNROLL_ITER1(func, N)          \
+  switch (remaining_rows) {                  \
+    default:                                 \
+      func(N, 0) break;                      \
+    case 1:                                  \
+      func(N, 1) break;                      \
+    case 2:                                  \
       if (sizeof(Scalar) == sizeof(float)) { \
-        func(N, 2) \
-      } \
-      break; \
-    case 3: \
+        func(N, 2)                           \
+      }                                      \
+      break;                                 \
+    case 3:                                  \
       if (sizeof(Scalar) == sizeof(float)) { \
-        func(N, 3) \
-      } \
-      break; \
+        func(N, 3)                           \
+      }                                      \
+      break;                                 \
   }
 
 #ifdef USE_PARTIAL_PACKETS
 #define MICRO_UNROLL_ITER(func, N) \
-  if (remaining_rows) { \
-    func(N, true); \
-  } else { \
-    func(N, false); \
+  if (remaining_rows) {            \
+    func(N, true);                 \
+  } else {                         \
+    func(N, false);                \
   }
 
-#define MICRO_NORMAL_PARTIAL(iter) \
-  full || (unroll_factor != (iter + 1))
+#define MICRO_NORMAL_PARTIAL(iter) full || (unroll_factor != (iter + 1))
 #else
 #define MICRO_UNROLL_ITER(func, N) MICRO_UNROLL_ITER1(func, N)
 #endif
@@ -176,37 +143,38 @@
 
 #define MICRO_NORMAL_COLS(iter, a, b) ((MICRO_NORMAL(iter)) ? a : b)
 
-#define MICRO_LOAD1(lhs_ptr, iter) \
-  if (unroll_factor > iter) { \
-    lhsV##iter = ploadLhs<Packet>(lhs_ptr##iter); \
+#define MICRO_LOAD1(lhs_ptr, iter)                               \
+  if (unroll_factor > iter) {                                    \
+    lhsV##iter = ploadLhs<Packet>(lhs_ptr##iter);                \
     lhs_ptr##iter += MICRO_NORMAL_COLS(iter, accCols, accCols2); \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(lhsV##iter); \
+  } else {                                                       \
+    EIGEN_UNUSED_VARIABLE(lhsV##iter);                           \
   }
 
 #define MICRO_LOAD_ONE(iter) MICRO_LOAD1(lhs_ptr, iter)
 
-#define MICRO_COMPLEX_LOAD_ONE(iter) \
-  if (!LhsIsReal && (unroll_factor > iter)) { \
+#define MICRO_COMPLEX_LOAD_ONE(iter)                                                                       \
+  if (!LhsIsReal && (unroll_factor > iter)) {                                                              \
     lhsVi##iter = ploadLhs<Packet>(lhs_ptr_real##iter + MICRO_NORMAL_COLS(iter, imag_delta, imag_delta2)); \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(lhsVi##iter); \
-  } \
-  MICRO_LOAD1(lhs_ptr_real, iter) \
+  } else {                                                                                                 \
+    EIGEN_UNUSED_VARIABLE(lhsVi##iter);                                                                    \
+  }                                                                                                        \
+  MICRO_LOAD1(lhs_ptr_real, iter)
 
-#define MICRO_SRC_PTR1(lhs_ptr, advRows, iter) \
-  if (unroll_factor > iter) { \
-    lhs_ptr##iter = lhs_base + (row+(iter*accCols))*strideA*advRows - MICRO_NORMAL_COLS(iter, 0, (accCols-accCols2)*offsetA); \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(lhs_ptr##iter); \
+#define MICRO_SRC_PTR1(lhs_ptr, advRows, iter)                                  \
+  if (unroll_factor > iter) {                                                   \
+    lhs_ptr##iter = lhs_base + (row + (iter * accCols)) * strideA * advRows -   \
+                    MICRO_NORMAL_COLS(iter, 0, (accCols - accCols2) * offsetA); \
+  } else {                                                                      \
+    EIGEN_UNUSED_VARIABLE(lhs_ptr##iter);                                       \
   }
 
 #define MICRO_SRC_PTR_ONE(iter) MICRO_SRC_PTR1(lhs_ptr, 1, iter)
 
 #define MICRO_COMPLEX_SRC_PTR_ONE(iter) MICRO_SRC_PTR1(lhs_ptr_real, advanceRows, iter)
 
-#define MICRO_PREFETCH1(lhs_ptr, iter) \
-  if (unroll_factor > iter) { \
+#define MICRO_PREFETCH1(lhs_ptr, iter)   \
+  if (unroll_factor > iter) {            \
     EIGEN_POWER_PREFETCH(lhs_ptr##iter); \
   }
 
@@ -220,19 +188,18 @@
 #define MICRO_UPDATE_MASK EIGEN_UNUSED_VARIABLE(pMask);
 #endif
 
-#define MICRO_UPDATE \
-  if (accCols == accCols2) { \
-    MICRO_UPDATE_MASK \
+#define MICRO_UPDATE                \
+  if (accCols == accCols2) {        \
+    MICRO_UPDATE_MASK               \
     EIGEN_UNUSED_VARIABLE(offsetA); \
-    row += unroll_factor*accCols; \
+    row += unroll_factor * accCols; \
   }
 
-#define MICRO_COMPLEX_UPDATE \
-  MICRO_UPDATE \
-  if(LhsIsReal || (accCols == accCols2)) { \
-    EIGEN_UNUSED_VARIABLE(imag_delta2); \
+#define MICRO_COMPLEX_UPDATE                \
+  MICRO_UPDATE                              \
+  if (LhsIsReal || (accCols == accCols2)) { \
+    EIGEN_UNUSED_VARIABLE(imag_delta2);     \
   }
 
-
-} // end namespace internal
-} // end namespace Eigen
+}  // end namespace internal
+}  // end namespace Eigen
diff --git a/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h b/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h
index 72e8c31..94c5dd2 100644
--- a/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h
+++ b/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h
@@ -37,14 +37,11 @@
 
 #define accColsC (accCols / 2)
 
-EIGEN_ALWAYS_INLINE void bsetzeroMMA(__vector_quad* acc)
-{
-  __builtin_mma_xxsetaccz(acc);
-}
+EIGEN_ALWAYS_INLINE void bsetzeroMMA(__vector_quad* acc) { __builtin_mma_xxsetaccz(acc); }
 
-template<typename DataMapper, typename Packet, bool full>
-EIGEN_ALWAYS_INLINE void storeAccumulator(Index i, const DataMapper& data, const Packet& alpha, const Index elements, __vector_quad* acc)
-{
+template <typename DataMapper, typename Packet, bool full>
+EIGEN_ALWAYS_INLINE void storeAccumulator(Index i, const DataMapper& data, const Packet& alpha, const Index elements,
+                                          __vector_quad* acc) {
   PacketBlock<Packet, 4> result;
   __builtin_mma_disassemble_acc(&result.packet, acc);
 
@@ -61,9 +58,10 @@
   }
 }
 
-template<typename DataMapper, typename Packet, typename Packetc, const Index accCols, const Index accCols2>
-EIGEN_ALWAYS_INLINE void storeComplexAccumulator(Index i, const DataMapper& data, const Packet& alphaReal, const Packet& alphaImag, const Packet& pMask, __vector_quad* accReal, __vector_quad* accImag)
-{
+template <typename DataMapper, typename Packet, typename Packetc, const Index accCols, const Index accCols2>
+EIGEN_ALWAYS_INLINE void storeComplexAccumulator(Index i, const DataMapper& data, const Packet& alphaReal,
+                                                 const Packet& alphaImag, const Packet& pMask, __vector_quad* accReal,
+                                                 __vector_quad* accImag) {
   constexpr bool full = (accCols2 > accColsC);
   PacketBlock<Packet, 4> resultReal, resultImag;
   __builtin_mma_disassemble_acc(&resultReal.packet, accReal);
@@ -85,80 +83,70 @@
 }
 
 // Defaults to float32, since Eigen still supports C++03 we can't use default template arguments
-template<typename LhsPacket, typename RhsPacket, bool NegativeAccumulate>
-EIGEN_ALWAYS_INLINE void pgerMMA(__vector_quad* acc, const RhsPacket& a, const LhsPacket& b)
-{
-  if(NegativeAccumulate)
-  {
+template <typename LhsPacket, typename RhsPacket, bool NegativeAccumulate>
+EIGEN_ALWAYS_INLINE void pgerMMA(__vector_quad* acc, const RhsPacket& a, const LhsPacket& b) {
+  if (NegativeAccumulate) {
     __builtin_mma_xvf32gernp(acc, (__vector unsigned char)a, (__vector unsigned char)b);
   } else {
     __builtin_mma_xvf32gerpp(acc, (__vector unsigned char)a, (__vector unsigned char)b);
   }
 }
 
-template<typename LhsPacket, typename RhsPacket, bool NegativeAccumulate>
-EIGEN_ALWAYS_INLINE void pgerMMA(__vector_quad* acc, const __vector_pair& a, const Packet2d& b)
-{
-  if(NegativeAccumulate)
-  {
+template <typename LhsPacket, typename RhsPacket, bool NegativeAccumulate>
+EIGEN_ALWAYS_INLINE void pgerMMA(__vector_quad* acc, const __vector_pair& a, const Packet2d& b) {
+  if (NegativeAccumulate) {
     __builtin_mma_xvf64gernp(acc, (__vector_pair)a, (__vector unsigned char)b);
   } else {
     __builtin_mma_xvf64gerpp(acc, (__vector_pair)a, (__vector unsigned char)b);
   }
 }
 
-template<typename Packet, typename RhsPacket, bool ConjugateLhs, bool ConjugateRhs, bool LhsIsReal, bool RhsIsReal>
-EIGEN_ALWAYS_INLINE void pgercMMA(__vector_quad* accReal, __vector_quad* accImag, const Packet& lhsV, Packet& lhsVi, const RhsPacket& rhsV, RhsPacket& rhsVi)
-{
-  pgerMMA<Packet, RhsPacket, false>(accReal,  rhsV,  lhsV);
-  if(LhsIsReal) {
-    pgerMMA<Packet, RhsPacket, ConjugateRhs>(accImag, rhsVi,  lhsV);
+template <typename Packet, typename RhsPacket, bool ConjugateLhs, bool ConjugateRhs, bool LhsIsReal, bool RhsIsReal>
+EIGEN_ALWAYS_INLINE void pgercMMA(__vector_quad* accReal, __vector_quad* accImag, const Packet& lhsV, Packet& lhsVi,
+                                  const RhsPacket& rhsV, RhsPacket& rhsVi) {
+  pgerMMA<Packet, RhsPacket, false>(accReal, rhsV, lhsV);
+  if (LhsIsReal) {
+    pgerMMA<Packet, RhsPacket, ConjugateRhs>(accImag, rhsVi, lhsV);
     EIGEN_UNUSED_VARIABLE(lhsVi);
   } else {
-    if(!RhsIsReal) {
+    if (!RhsIsReal) {
       pgerMMA<Packet, RhsPacket, ConjugateLhs == ConjugateRhs>(accReal, rhsVi, lhsVi);
-      pgerMMA<Packet, RhsPacket, ConjugateRhs>(accImag, rhsVi,  lhsV);
+      pgerMMA<Packet, RhsPacket, ConjugateRhs>(accImag, rhsVi, lhsV);
     } else {
       EIGEN_UNUSED_VARIABLE(rhsVi);
     }
-    pgerMMA<Packet, RhsPacket, ConjugateLhs>(accImag,  rhsV, lhsVi);
+    pgerMMA<Packet, RhsPacket, ConjugateLhs>(accImag, rhsV, lhsVi);
   }
 }
 
 // This is necessary because ploadRhs for double returns a pair of vectors when MMA is enabled.
-template<typename Packet>
-EIGEN_ALWAYS_INLINE Packet ploadRhs(const __UNPACK_TYPE__(Packet)* rhs)
-{
+template <typename Packet>
+EIGEN_ALWAYS_INLINE Packet ploadRhs(const __UNPACK_TYPE__(Packet) * rhs) {
   return ploadu<Packet>(rhs);
 }
 
-template<typename Scalar, typename Packet>
-EIGEN_ALWAYS_INLINE void ploadRhsMMA(const Scalar* rhs, Packet& rhsV)
-{
+template <typename Scalar, typename Packet>
+EIGEN_ALWAYS_INLINE void ploadRhsMMA(const Scalar* rhs, Packet& rhsV) {
   rhsV = ploadRhs<Packet>(rhs);
-} 
+}
 
-template<>
-EIGEN_ALWAYS_INLINE void ploadRhsMMA(const double* rhs, __vector_pair& rhsV)
-{
+template <>
+EIGEN_ALWAYS_INLINE void ploadRhsMMA(const double* rhs, __vector_pair& rhsV) {
 #if EIGEN_COMP_LLVM
-  __builtin_vsx_assemble_pair(&rhsV,
-    reinterpret_cast<__vector unsigned char>(ploadRhs<Packet2d>(rhs + (sizeof(Packet2d) / sizeof(double)))),
-    reinterpret_cast<__vector unsigned char>(ploadRhs<Packet2d>(rhs)));
+  __builtin_vsx_assemble_pair(
+      &rhsV, reinterpret_cast<__vector unsigned char>(ploadRhs<Packet2d>(rhs + (sizeof(Packet2d) / sizeof(double)))),
+      reinterpret_cast<__vector unsigned char>(ploadRhs<Packet2d>(rhs)));
 #else
-  rhsV = *reinterpret_cast<__vector_pair *>(const_cast<double *>(rhs));
+  rhsV = *reinterpret_cast<__vector_pair*>(const_cast<double*>(rhs));
 #endif
 }
 
-EIGEN_ALWAYS_INLINE void ploadLhsMMA(const double* lhs, __vector_pair& lhsV)
-{
-  ploadRhsMMA(lhs, lhsV);
-}
+EIGEN_ALWAYS_INLINE void ploadLhsMMA(const double* lhs, __vector_pair& lhsV) { ploadRhsMMA(lhs, lhsV); }
 
 #define GEMM_MULTIPLE_COLS
 
 // Disable in GCC until unnecessary register moves are fixed
-//#if (EIGEN_COMP_LLVM || (__GNUC__ >= 11))
+// #if (EIGEN_COMP_LLVM || (__GNUC__ >= 11))
 #if EIGEN_COMP_LLVM
 #define VECTOR_PAIR_LOADS_LHS
 #endif
@@ -175,134 +163,127 @@
 #endif
 #endif
 
-#define MICRO_MMA_UNROLL(func) \
-  func(0) func(1) func(2) func(3) func(4) func(5) func(6) func(7)
+#define MICRO_MMA_UNROLL(func) func(0) func(1) func(2) func(3) func(4) func(5) func(6) func(7)
 
-#define MICRO_MMA_WORK(func, type, peel) \
-  if (accItr == 1) { \
-    func(0,type,peel,0,0) func(1,type,peel,1,0) func(2,type,peel,2,0) func(3,type,peel,3,0) \
-    func(4,type,peel,4,0) func(5,type,peel,5,0) func(6,type,peel,6,0) func(7,type,peel,7,0) \
-  } else if (accItr == 2) { \
-    func(0,type,peel,0,0) func(1,type,peel,0,1) func(2,type,peel,1,0) func(3,type,peel,1,1) \
-    func(4,type,peel,2,0) func(5,type,peel,2,1) func(6,type,peel,3,0) func(7,type,peel,3,1) \
-  } else { \
-    func(0,type,peel,0,0) func(1,type,peel,0,1) func(2,type,peel,0,2) func(3,type,peel,0,3) \
-    func(4,type,peel,1,0) func(5,type,peel,1,1) func(6,type,peel,1,2) func(7,type,peel,1,3) \
+#define MICRO_MMA_WORK(func, type, peel)                                                                        \
+  if (accItr == 1) {                                                                                            \
+    func(0, type, peel, 0, 0) func(1, type, peel, 1, 0) func(2, type, peel, 2, 0) func(3, type, peel, 3, 0)     \
+        func(4, type, peel, 4, 0) func(5, type, peel, 5, 0) func(6, type, peel, 6, 0) func(7, type, peel, 7, 0) \
+  } else if (accItr == 2) {                                                                                     \
+    func(0, type, peel, 0, 0) func(1, type, peel, 0, 1) func(2, type, peel, 1, 0) func(3, type, peel, 1, 1)     \
+        func(4, type, peel, 2, 0) func(5, type, peel, 2, 1) func(6, type, peel, 3, 0) func(7, type, peel, 3, 1) \
+  } else {                                                                                                      \
+    func(0, type, peel, 0, 0) func(1, type, peel, 0, 1) func(2, type, peel, 0, 2) func(3, type, peel, 0, 3)     \
+        func(4, type, peel, 1, 0) func(5, type, peel, 1, 1) func(6, type, peel, 1, 2) func(7, type, peel, 1, 3) \
   }
 
-#define MICRO_MMA_WORK_ONE(iter, type, peel, left, right) \
-  if (unroll_factor > left) { \
+#define MICRO_MMA_WORK_ONE(iter, type, peel, left, right)                        \
+  if (unroll_factor > left) {                                                    \
     pgerMMA<Packet, type, false>(&accZero##iter, rhsV##right[peel], lhsV##left); \
   }
 
 #ifdef VECTOR_PAIR_LOADS_LHS
-#define MICRO_MMA_WORK_TWO(iter, type, peel, left, right) \
-  if (unroll_factor > left) { \
+#define MICRO_MMA_WORK_TWO(iter, type, peel, left, right)                                          \
+  if (unroll_factor > left) {                                                                      \
     pgerMMA<Packet, type, false>(&accZero##iter, rhsV##right[peel], lhsV2##left.packet[peel & 1]); \
   }
 
-#define MICRO_MMA_LOAD1_TWO(lhs_ptr, left) \
-  if (unroll_factor > left) { \
-    if (MICRO_NORMAL(left)) { \
-      ploadLhsMMA(reinterpret_cast<const double*>(lhs_ptr##left), plhsV##left); \
+#define MICRO_MMA_LOAD1_TWO(lhs_ptr, left)                                                        \
+  if (unroll_factor > left) {                                                                     \
+    if (MICRO_NORMAL(left)) {                                                                     \
+      ploadLhsMMA(reinterpret_cast<const double*>(lhs_ptr##left), plhsV##left);                   \
       __builtin_vsx_disassemble_pair(reinterpret_cast<void*>(&lhsV2##left.packet), &plhsV##left); \
-      lhs_ptr##left += accCols*2; \
-    } else { \
-      lhsV2##left.packet[0] = ploadLhs<Packet>(lhs_ptr##left); \
-      lhsV2##left.packet[1] = ploadLhs<Packet>(lhs_ptr##left + accCols2); \
-      lhs_ptr##left += accCols2*2; \
-      EIGEN_UNUSED_VARIABLE(plhsV##left); \
-    } \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(lhsV2##left); \
-    EIGEN_UNUSED_VARIABLE(plhsV##left); \
+      lhs_ptr##left += accCols * 2;                                                               \
+    } else {                                                                                      \
+      lhsV2##left.packet[0] = ploadLhs<Packet>(lhs_ptr##left);                                    \
+      lhsV2##left.packet[1] = ploadLhs<Packet>(lhs_ptr##left + accCols2);                         \
+      lhs_ptr##left += accCols2 * 2;                                                              \
+      EIGEN_UNUSED_VARIABLE(plhsV##left);                                                         \
+    }                                                                                             \
+  } else {                                                                                        \
+    EIGEN_UNUSED_VARIABLE(lhsV2##left);                                                           \
+    EIGEN_UNUSED_VARIABLE(plhsV##left);                                                           \
   }
 
 #define MICRO_MMA_LOAD_TWO(left) MICRO_MMA_LOAD1_TWO(lhs_ptr, left)
 #endif
 
-#define MICRO_MMA_UNROLL_ITER(func, val) \
-  func(val,0) \
-  if (accItr > 1) { \
-    func(val,1) \
-    if (accItr > 2) { \
-      func(val,2) \
-      func(val,3) \
-    } \
+#define MICRO_MMA_UNROLL_ITER(func, val)                       \
+  func(val, 0) if (accItr > 1) {                               \
+    func(val, 1) if (accItr > 2) { func(val, 2) func(val, 3) } \
   }
 
-#define MICRO_MMA_LOAD_ONE_RHS1(peel, right) \
-  ploadRhsMMA(rhs_ptr##right + (accRows * peel), rhsV##right[peel]);
+#define MICRO_MMA_LOAD_ONE_RHS1(peel, right) ploadRhsMMA(rhs_ptr##right + (accRows * peel), rhsV##right[peel]);
 
-#define MICRO_MMA_LOAD_ONE_RHS(peel) \
-  MICRO_MMA_UNROLL_ITER(MICRO_MMA_LOAD_ONE_RHS1, peel)
+#define MICRO_MMA_LOAD_ONE_RHS(peel) MICRO_MMA_UNROLL_ITER(MICRO_MMA_LOAD_ONE_RHS1, peel)
 
-#define MICRO_MMA_TYPE_PEEL(funcw, funcl, type, peel) \
-  if (PEEL_MMA > peel) { \
+#define MICRO_MMA_TYPE_PEEL(funcw, funcl, type, peel)              \
+  if (PEEL_MMA > peel) {                                           \
     Packet lhsV0, lhsV1, lhsV2, lhsV3, lhsV4, lhsV5, lhsV6, lhsV7; \
-    MICRO_MMA_LOAD_ONE_RHS(peel) \
-    MICRO_MMA_UNROLL(funcl) \
-    MICRO_MMA_WORK(funcw, type, peel) \
+    MICRO_MMA_LOAD_ONE_RHS(peel)                                   \
+    MICRO_MMA_UNROLL(funcl)                                        \
+    MICRO_MMA_WORK(funcw, type, peel)                              \
   }
 
 #ifndef VECTOR_PAIR_LOADS_LHS
-#define MICRO_MMA_UNROLL_TYPE_PEEL(funcw, funcl, type) \
+#define MICRO_MMA_UNROLL_TYPE_PEEL(funcw, funcl, type)                                                  \
   type rhsV0[8], rhsV1[(accItr > 1) ? 8 : 1], rhsV2[(accItr > 2) ? 8 : 1], rhsV3[(accItr > 2) ? 8 : 1]; \
-  MICRO_MMA_TYPE_PEEL(funcw,funcl,type,0) MICRO_MMA_TYPE_PEEL(funcw,funcl,type,1) \
-  MICRO_MMA_TYPE_PEEL(funcw,funcl,type,2) MICRO_MMA_TYPE_PEEL(funcw,funcl,type,3) \
-  MICRO_MMA_TYPE_PEEL(funcw,funcl,type,4) MICRO_MMA_TYPE_PEEL(funcw,funcl,type,5) \
-  MICRO_MMA_TYPE_PEEL(funcw,funcl,type,6) MICRO_MMA_TYPE_PEEL(funcw,funcl,type,7)
+  MICRO_MMA_TYPE_PEEL(funcw, funcl, type, 0)                                                            \
+  MICRO_MMA_TYPE_PEEL(funcw, funcl, type, 1)                                                            \
+  MICRO_MMA_TYPE_PEEL(funcw, funcl, type, 2)                                                            \
+  MICRO_MMA_TYPE_PEEL(funcw, funcl, type, 3)                                                            \
+  MICRO_MMA_TYPE_PEEL(funcw, funcl, type, 4)                                                            \
+  MICRO_MMA_TYPE_PEEL(funcw, funcl, type, 5)                                                            \
+  MICRO_MMA_TYPE_PEEL(funcw, funcl, type, 6) MICRO_MMA_TYPE_PEEL(funcw, funcl, type, 7)
 #else
-#define MICRO_MMA_LOAD_TWO_RHS(peel1, right) \
+#define MICRO_MMA_LOAD_TWO_RHS(peel1, right)                                                      \
   ploadRhsMMA(reinterpret_cast<const double*>(rhs_ptr##right + (accRows * peel1)), prhsV##peel1); \
   __builtin_vsx_disassemble_pair(reinterpret_cast<void*>(&rhsV##right[peel1]), &prhsV##peel1);
 
-#define MICRO_MMA_TYPE_PEEL2(funcw1, funcl1, funcw2, funcl2, type, peel1, peel2) \
-  if (PEEL_MMA > peel2) { \
-    PacketBlock<Packet,2> lhsV20, lhsV21, lhsV22, lhsV23, lhsV24, lhsV25, lhsV26, lhsV27; \
-    __vector_pair plhsV0, plhsV1, plhsV2, plhsV3, plhsV4, plhsV5, plhsV6, plhsV7; \
-    if (sizeof(type) == 16) { \
-      MICRO_MMA_UNROLL_ITER(MICRO_MMA_LOAD_TWO_RHS, peel1) \
-    } else { \
-      EIGEN_UNUSED_VARIABLE(prhsV##peel1); \
-      MICRO_MMA_LOAD_ONE_RHS(peel1) \
-      MICRO_MMA_LOAD_ONE_RHS(peel2) \
-    } \
-    MICRO_MMA_UNROLL(funcl2) \
-    MICRO_MMA_WORK(funcw2, type, peel1) \
-    MICRO_MMA_WORK(funcw2, type, peel2) \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(prhsV##peel1); \
-    MICRO_MMA_TYPE_PEEL(funcw1, funcl1, type, peel1) \
+#define MICRO_MMA_TYPE_PEEL2(funcw1, funcl1, funcw2, funcl2, type, peel1, peel2)           \
+  if (PEEL_MMA > peel2) {                                                                  \
+    PacketBlock<Packet, 2> lhsV20, lhsV21, lhsV22, lhsV23, lhsV24, lhsV25, lhsV26, lhsV27; \
+    __vector_pair plhsV0, plhsV1, plhsV2, plhsV3, plhsV4, plhsV5, plhsV6, plhsV7;          \
+    if (sizeof(type) == 16) {                                                              \
+      MICRO_MMA_UNROLL_ITER(MICRO_MMA_LOAD_TWO_RHS, peel1)                                 \
+    } else {                                                                               \
+      EIGEN_UNUSED_VARIABLE(prhsV##peel1);                                                 \
+      MICRO_MMA_LOAD_ONE_RHS(peel1)                                                        \
+      MICRO_MMA_LOAD_ONE_RHS(peel2)                                                        \
+    }                                                                                      \
+    MICRO_MMA_UNROLL(funcl2)                                                               \
+    MICRO_MMA_WORK(funcw2, type, peel1)                                                    \
+    MICRO_MMA_WORK(funcw2, type, peel2)                                                    \
+  } else {                                                                                 \
+    EIGEN_UNUSED_VARIABLE(prhsV##peel1);                                                   \
+    MICRO_MMA_TYPE_PEEL(funcw1, funcl1, type, peel1)                                       \
   }
 
-#define MICRO_MMA_UNROLL_TYPE_PEEL2(funcw1, funcl1, funcw2, funcl2, type) \
+#define MICRO_MMA_UNROLL_TYPE_PEEL2(funcw1, funcl1, funcw2, funcl2, type)                               \
   type rhsV0[8], rhsV1[(accItr > 1) ? 8 : 1], rhsV2[(accItr > 2) ? 8 : 1], rhsV3[(accItr > 2) ? 8 : 1]; \
-  __vector_pair prhsV0, prhsV2, prhsV4, prhsV6; \
-  MICRO_MMA_TYPE_PEEL2(funcw1,funcl1,funcw2,funcl2,type,0,1) \
-  MICRO_MMA_TYPE_PEEL2(funcw1,funcl1,funcw2,funcl2,type,2,3) \
-  MICRO_MMA_TYPE_PEEL2(funcw1,funcl1,funcw2,funcl2,type,4,5) \
-  MICRO_MMA_TYPE_PEEL2(funcw1,funcl1,funcw2,funcl2,type,6,7)
+  __vector_pair prhsV0, prhsV2, prhsV4, prhsV6;                                                         \
+  MICRO_MMA_TYPE_PEEL2(funcw1, funcl1, funcw2, funcl2, type, 0, 1)                                      \
+  MICRO_MMA_TYPE_PEEL2(funcw1, funcl1, funcw2, funcl2, type, 2, 3)                                      \
+  MICRO_MMA_TYPE_PEEL2(funcw1, funcl1, funcw2, funcl2, type, 4, 5)                                      \
+  MICRO_MMA_TYPE_PEEL2(funcw1, funcl1, funcw2, funcl2, type, 6, 7)
 #endif
 
 #define MICRO_MMA_UNROLL_TYPE_ONE(funcw, funcl, type) \
-  type rhsV0[1], rhsV1[1], rhsV2[1], rhsV3[1]; \
-  MICRO_MMA_TYPE_PEEL(funcw,funcl,type,0)
+  type rhsV0[1], rhsV1[1], rhsV2[1], rhsV3[1];        \
+  MICRO_MMA_TYPE_PEEL(funcw, funcl, type, 0)
 
-#define MICRO_MMA_UPDATE_RHS1(size, right) \
-  rhs_ptr##right += (accRows * size);
+#define MICRO_MMA_UPDATE_RHS1(size, right) rhs_ptr##right += (accRows * size);
 
-#define MICRO_MMA_UPDATE_RHS(size) \
-  MICRO_MMA_UNROLL_ITER(MICRO_MMA_UPDATE_RHS1, size)
+#define MICRO_MMA_UPDATE_RHS(size) MICRO_MMA_UNROLL_ITER(MICRO_MMA_UPDATE_RHS1, size)
 
-#define MICRO_MMA_UNROLL_TYPE(MICRO_MMA_TYPE, size) \
+#define MICRO_MMA_UNROLL_TYPE(MICRO_MMA_TYPE, size)             \
   MICRO_MMA_TYPE(MICRO_MMA_WORK_ONE, MICRO_LOAD_ONE, RhsPacket) \
   MICRO_MMA_UPDATE_RHS(size)
 
 #ifndef VECTOR_PAIR_LOADS_LHS
 #define MICRO_MMA_ONE_PEEL MICRO_MMA_UNROLL_TYPE(MICRO_MMA_UNROLL_TYPE_PEEL, PEEL_MMA)
 #else
-#define MICRO_MMA_UNROLL_TYPE2(MICRO_MMA_TYPE, size) \
+#define MICRO_MMA_UNROLL_TYPE2(MICRO_MMA_TYPE, size)                                                    \
   MICRO_MMA_TYPE(MICRO_MMA_WORK_ONE, MICRO_LOAD_ONE, MICRO_MMA_WORK_TWO, MICRO_MMA_LOAD_TWO, RhsPacket) \
   MICRO_MMA_UPDATE_RHS(size)
 
@@ -311,10 +292,10 @@
 
 #define MICRO_MMA_ONE MICRO_MMA_UNROLL_TYPE(MICRO_MMA_UNROLL_TYPE_ONE, 1)
 
-#define MICRO_MMA_DST_PTR_ONE(iter) \
-  if (unroll_factor * accItr > iter) { \
-    bsetzeroMMA(&accZero##iter); \
-  } else { \
+#define MICRO_MMA_DST_PTR_ONE(iter)       \
+  if (unroll_factor * accItr > iter) {    \
+    bsetzeroMMA(&accZero##iter);          \
+  } else {                                \
     EIGEN_UNUSED_VARIABLE(accZero##iter); \
   }
 
@@ -324,50 +305,40 @@
 
 #define MICRO_MMA_PREFETCH MICRO_MMA_UNROLL(MICRO_PREFETCH_ONE)
 
-#define MICRO_MMA_STORE_ONE(iter, left, right) \
-  if (unroll_factor > left) { \
-    storeAccumulator<DataMapper, Packet, MICRO_NORMAL_PARTIAL(left)>(row + left*accCols, res##right, pAlpha, accCols2, &accZero##iter); \
+#define MICRO_MMA_STORE_ONE(iter, left, right)                                                                 \
+  if (unroll_factor > left) {                                                                                  \
+    storeAccumulator<DataMapper, Packet, MICRO_NORMAL_PARTIAL(left)>(row + left * accCols, res##right, pAlpha, \
+                                                                     accCols2, &accZero##iter);                \
   }
 
-#define MICRO_MMA_ITER_UNROLL(func) \
-  if (accItr == 1) { \
-    func(0,0,0) func(1,1,0) func(2,2,0) func(3,3,0) \
-    func(4,4,0) func(5,5,0) func(6,6,0) func(7,7,0) \
-  } else if (accItr == 2) { \
-    func(0,0,0) func(1,0,1) func(2,1,0) func(3,1,1) \
-    func(4,2,0) func(5,2,1) func(6,3,0) func(7,3,1) \
-  } else { \
-    func(0,0,0) func(1,0,1) func(2,0,2) func(3,0,3) \
-    func(4,1,0) func(5,1,1) func(6,1,2) func(7,1,3) \
+#define MICRO_MMA_ITER_UNROLL(func)                                                                                 \
+  if (accItr == 1) {                                                                                                \
+    func(0, 0, 0) func(1, 1, 0) func(2, 2, 0) func(3, 3, 0) func(4, 4, 0) func(5, 5, 0) func(6, 6, 0) func(7, 7, 0) \
+  } else if (accItr == 2) {                                                                                         \
+    func(0, 0, 0) func(1, 0, 1) func(2, 1, 0) func(3, 1, 1) func(4, 2, 0) func(5, 2, 1) func(6, 3, 0) func(7, 3, 1) \
+  } else {                                                                                                          \
+    func(0, 0, 0) func(1, 0, 1) func(2, 0, 2) func(3, 0, 3) func(4, 1, 0) func(5, 1, 1) func(6, 1, 2) func(7, 1, 3) \
   }
 
 #define MICRO_MMA_STORE MICRO_MMA_ITER_UNROLL(MICRO_MMA_STORE_ONE)
 
-#define MICRO_MMA_EXTRA_ROWS(right) \
-  gemm_extra_row<Scalar, Packet, DataMapper, accRows, accCols>(res3##right, blockA, rhs_base + right*accRows*strideB, depth, strideA, offsetA, strideB, row, rows, remaining_rows, pAlpha, pMask);
+#define MICRO_MMA_EXTRA_ROWS(right)                                                                           \
+  gemm_extra_row<Scalar, Packet, DataMapper, accRows, accCols>(                                               \
+      res3##right, blockA, rhs_base + right * accRows * strideB, depth, strideA, offsetA, strideB, row, rows, \
+      remaining_rows, pAlpha, pMask);
 
-#define MICRO_MMA_EXTRA_ROWS1(val, right) \
-  MICRO_MMA_EXTRA_ROWS(right);
+#define MICRO_MMA_EXTRA_ROWS1(val, right) MICRO_MMA_EXTRA_ROWS(right);
 
-template<int unroll_factor, typename Scalar, typename Packet, typename RhsPacket, typename DataMapper, const Index accRows, const Index accCols, bool full, const Index accItr>
-EIGEN_ALWAYS_INLINE void gemm_unrolled_MMA_iteration(
-  const DataMapper& res0,
-  const DataMapper& res1,
-  const DataMapper& res2,
-  const DataMapper& res3,
-  const Scalar* lhs_base,
-  const Scalar* rhs_base,
-  Index depth,
-  Index strideA,
-  Index strideB,
-  Index offsetA,
-  Index& row,
-  const Packet& pAlpha,
-  Index accCols2
-  )
-{
-  const Scalar* rhs_ptr0 = rhs_base, * rhs_ptr1 = NULL, * rhs_ptr2 = NULL, * rhs_ptr3 = NULL;
-  const Scalar* lhs_ptr0 = NULL, * lhs_ptr1 = NULL, * lhs_ptr2 = NULL, * lhs_ptr3 = NULL, * lhs_ptr4 = NULL, * lhs_ptr5 = NULL, * lhs_ptr6 = NULL, * lhs_ptr7 = NULL;
+template <int unroll_factor, typename Scalar, typename Packet, typename RhsPacket, typename DataMapper,
+          const Index accRows, const Index accCols, bool full, const Index accItr>
+EIGEN_ALWAYS_INLINE void gemm_unrolled_MMA_iteration(const DataMapper& res0, const DataMapper& res1,
+                                                     const DataMapper& res2, const DataMapper& res3,
+                                                     const Scalar* lhs_base, const Scalar* rhs_base, Index depth,
+                                                     Index strideA, Index strideB, Index offsetA, Index& row,
+                                                     const Packet& pAlpha, Index accCols2) {
+  const Scalar *rhs_ptr0 = rhs_base, *rhs_ptr1 = NULL, *rhs_ptr2 = NULL, *rhs_ptr3 = NULL;
+  const Scalar *lhs_ptr0 = NULL, *lhs_ptr1 = NULL, *lhs_ptr2 = NULL, *lhs_ptr3 = NULL, *lhs_ptr4 = NULL,
+               *lhs_ptr5 = NULL, *lhs_ptr6 = NULL, *lhs_ptr7 = NULL;
   __vector_quad accZero0, accZero1, accZero2, accZero3, accZero4, accZero5, accZero6, accZero7;
 
   if (accItr > 1) {
@@ -391,14 +362,12 @@
   MICRO_MMA_DST_PTR
 
   Index k = 0, depth2 = depth - PEEL_MMA;
-  for(; k <= depth2; k += PEEL_MMA)
-  {
+  for (; k <= depth2; k += PEEL_MMA) {
     EIGEN_POWER_PREFETCH(rhs_ptr);
     MICRO_MMA_PREFETCH
     MICRO_MMA_ONE_PEEL
   }
-  for(; k < depth; k++)
-  {
+  for (; k < depth; k++) {
     MICRO_MMA_ONE
   }
   MICRO_MMA_STORE
@@ -406,38 +375,29 @@
   MICRO_UPDATE
 }
 
-#define MICRO_MMA_UNROLL_ITER2(N, M) \
-  gemm_unrolled_MMA_iteration<N + (M ? 1 : 0), Scalar, Packet, RhsPacket, DataMapper, accRows, accCols, !M, accItr>(res30, res31, res32, res33, lhs_base, rhs_base, depth, strideA, strideB, offsetA, row, pAlpha, M ? remaining_rows : accCols); \
+#define MICRO_MMA_UNROLL_ITER2(N, M)                                                                                 \
+  gemm_unrolled_MMA_iteration<N + (M ? 1 : 0), Scalar, Packet, RhsPacket, DataMapper, accRows, accCols, !M, accItr>( \
+      res30, res31, res32, res33, lhs_base, rhs_base, depth, strideA, strideB, offsetA, row, pAlpha,                 \
+      M ? remaining_rows : accCols);                                                                                 \
   if (M) return;
 
-#define MICRO_MMA_ROWS(n) \
-  while(row + n*accCols <= rows) { \
-    MICRO_MMA_UNROLL_ITER2(n, 0); \
+#define MICRO_MMA_ROWS(n)             \
+  while (row + n * accCols <= rows) { \
+    MICRO_MMA_UNROLL_ITER2(n, 0);     \
   }
 
-template<typename Scalar, typename Packet, typename RhsPacket, typename DataMapper, const Index accRows, const Index accCols, const Index accItr>
-EIGEN_ALWAYS_INLINE void gemmMMA_cols(
-  const DataMapper& res,
-  const Scalar* blockA,
-  const Scalar* blockB,
-  Index depth,
-  Index strideA,
-  Index offsetA,
-  Index strideB,
-  Index offsetB,
-  Index col,
-  Index rows,
-  Index remaining_rows,
-  const Packet& pAlpha,
-  const Packet& pMask)
-{
+template <typename Scalar, typename Packet, typename RhsPacket, typename DataMapper, const Index accRows,
+          const Index accCols, const Index accItr>
+EIGEN_ALWAYS_INLINE void gemmMMA_cols(const DataMapper& res, const Scalar* blockA, const Scalar* blockB, Index depth,
+                                      Index strideA, Index offsetA, Index strideB, Index offsetB, Index col, Index rows,
+                                      Index remaining_rows, const Packet& pAlpha, const Packet& pMask) {
   const DataMapper res30 = res.getSubMapper(0, col);
-  const DataMapper res31 = (accItr > 1) ? res30.getSubMapper(0, accRows*1) : res30;
-  const DataMapper res32 = (accItr > 2) ? res30.getSubMapper(0, accRows*2) : res30;
-  const DataMapper res33 = (accItr > 2) ? res30.getSubMapper(0, accRows*3) : res30;
+  const DataMapper res31 = (accItr > 1) ? res30.getSubMapper(0, accRows * 1) : res30;
+  const DataMapper res32 = (accItr > 2) ? res30.getSubMapper(0, accRows * 2) : res30;
+  const DataMapper res33 = (accItr > 2) ? res30.getSubMapper(0, accRows * 3) : res30;
 
-  const Scalar* rhs_base = blockB + col*strideB + accRows*offsetB;
-  const Scalar* lhs_base = blockA + accCols*offsetA;
+  const Scalar* rhs_base = blockB + col * strideB + accRows * offsetB;
+  const Scalar* lhs_base = blockA + accCols * offsetA;
   Index row = 0;
 
 #define MAX_MMA_UNROLL 7
@@ -455,7 +415,7 @@
   } else {
     MICRO_MMA_ROWS(2);
   }
-  switch( (rows-row)/accCols ) {
+  switch ((rows - row) / accCols) {
 #if MAX_MMA_UNROLL > 7
     case 7:
       if (accItr == 1) {
@@ -508,42 +468,42 @@
   }
 #undef MAX_MMA_UNROLL
 
-  if(remaining_rows > 0)
-  {
+  if (remaining_rows > 0) {
     MICRO_MMA_UNROLL_ITER(MICRO_MMA_EXTRA_ROWS1, 0)
   }
 }
 
-#define MICRO_MMA_COLS(n) \
-  for(; col + n*accRows <= cols; col += n*accRows) \
-  { \
-    gemmMMA_cols<Scalar, Packet, RhsPacket2, DataMapper, accRows, accCols, n>(res, blockA, blockB, depth, strideA, offsetA, strideB, offsetB, col, rows, remaining_rows, pAlpha, pMask); \
+#define MICRO_MMA_COLS(n)                                                                                          \
+  for (; col + n * accRows <= cols; col += n * accRows) {                                                          \
+    gemmMMA_cols<Scalar, Packet, RhsPacket2, DataMapper, accRows, accCols, n>(                                     \
+        res, blockA, blockB, depth, strideA, offsetA, strideB, offsetB, col, rows, remaining_rows, pAlpha, pMask); \
   }
 
-template<typename Scalar, typename Packet, typename RhsPacket, typename DataMapper, const Index accRows, const Index accCols>
-void gemmMMA(const DataMapper& res, const Scalar* blockA, const Scalar* blockB, Index rows, Index depth, Index cols, Scalar alpha, Index strideA, Index strideB, Index offsetA, Index offsetB)
-{
-      const Index remaining_rows = rows % accCols;
+template <typename Scalar, typename Packet, typename RhsPacket, typename DataMapper, const Index accRows,
+          const Index accCols>
+void gemmMMA(const DataMapper& res, const Scalar* blockA, const Scalar* blockB, Index rows, Index depth, Index cols,
+             Scalar alpha, Index strideA, Index strideB, Index offsetA, Index offsetB) {
+  const Index remaining_rows = rows % accCols;
 
-      if( strideA == -1 ) strideA = depth;
-      if( strideB == -1 ) strideB = depth;
+  if (strideA == -1) strideA = depth;
+  if (strideB == -1) strideB = depth;
 
-      const Packet pAlpha = pset1<Packet>(alpha);
-      const Packet pMask  = bmask<Packet>(remaining_rows);
+  const Packet pAlpha = pset1<Packet>(alpha);
+  const Packet pMask = bmask<Packet>(remaining_rows);
 
-      typedef typename std::conditional_t<(sizeof(Scalar) == sizeof(float)), RhsPacket, __vector_pair> RhsPacket2;
+  typedef typename std::conditional_t<(sizeof(Scalar) == sizeof(float)), RhsPacket, __vector_pair> RhsPacket2;
 
-      Index col = 0;
+  Index col = 0;
 #ifdef GEMM_MULTIPLE_COLS
-      MICRO_MMA_COLS(4);
-      MICRO_MMA_COLS(2);
+  MICRO_MMA_COLS(4);
+  MICRO_MMA_COLS(2);
 #endif
-      MICRO_MMA_COLS(1);
+  MICRO_MMA_COLS(1);
 
-      if (col != cols)
-      {
-        gemm_extra_cols<Scalar, Packet, DataMapper, accCols>(res, blockA, blockB, depth, strideA, offsetA, strideB, offsetB, col, rows, cols, remaining_rows, pAlpha, pMask);
-      }
+  if (col != cols) {
+    gemm_extra_cols<Scalar, Packet, DataMapper, accCols>(res, blockA, blockB, depth, strideA, offsetA, strideB, offsetB,
+                                                         col, rows, cols, remaining_rows, pAlpha, pMask);
+  }
 }
 
 #define advanceRows ((LhsIsReal) ? 1 : 2)
@@ -556,133 +516,137 @@
 #define PEEL_COMPLEX_MMA 3
 #endif
 
-#define MICRO_COMPLEX_MMA_UNROLL(func) \
-  func(0) func(1) func(2) func(3)
+#define MICRO_COMPLEX_MMA_UNROLL(func) func(0) func(1) func(2) func(3)
 
-#define MICRO_COMPLEX_MMA_WORK(func, type, peel) \
-  if (accItr == 1) { \
-    func(0,type,peel,0,0) func(1,type,peel,1,0) func(2,type,peel,2,0) func(3,type,peel,3,0) \
-  } else if (accItr == 2) { \
-    func(0,type,peel,0,0) func(1,type,peel,0,1) func(2,type,peel,1,0) func(3,type,peel,1,1) \
-  } else { \
-    func(0,type,peel,0,0) func(1,type,peel,0,1) func(2,type,peel,0,2) func(3,type,peel,0,3) \
+#define MICRO_COMPLEX_MMA_WORK(func, type, peel)                                                            \
+  if (accItr == 1) {                                                                                        \
+    func(0, type, peel, 0, 0) func(1, type, peel, 1, 0) func(2, type, peel, 2, 0) func(3, type, peel, 3, 0) \
+  } else if (accItr == 2) {                                                                                 \
+    func(0, type, peel, 0, 0) func(1, type, peel, 0, 1) func(2, type, peel, 1, 0) func(3, type, peel, 1, 1) \
+  } else {                                                                                                  \
+    func(0, type, peel, 0, 0) func(1, type, peel, 0, 1) func(2, type, peel, 0, 2) func(3, type, peel, 0, 3) \
   }
 
-#define MICRO_COMPLEX_MMA_WORK_ONE(iter, type, peel, left, right) \
-  if (unroll_factor > left) { \
-    pgercMMA<Packet, type, ConjugateLhs, ConjugateRhs, LhsIsReal, RhsIsReal>(&accReal##iter, &accImag##iter, lhsV##left, lhsVi##left, rhsV##right[peel], rhsVi##right[peel]); \
+#define MICRO_COMPLEX_MMA_WORK_ONE(iter, type, peel, left, right)                                        \
+  if (unroll_factor > left) {                                                                            \
+    pgercMMA<Packet, type, ConjugateLhs, ConjugateRhs, LhsIsReal, RhsIsReal>(                            \
+        &accReal##iter, &accImag##iter, lhsV##left, lhsVi##left, rhsV##right[peel], rhsVi##right[peel]); \
   }
 
 #ifdef VECTOR_PAIR_LOADS_LHS
-#define MICRO_COMPLEX_MMA_WORK_TWO(iter, type, peel, left, right) \
-  if (unroll_factor > left) { \
-    pgercMMA<Packet, type, ConjugateLhs, ConjugateRhs, LhsIsReal, RhsIsReal>(&accReal##iter, &accImag##iter, lhsV2##left.packet[peel & 1], lhsVi2##left.packet[peel & 1], rhsV##right[peel], rhsVi##right[peel]); \
+#define MICRO_COMPLEX_MMA_WORK_TWO(iter, type, peel, left, right)                                    \
+  if (unroll_factor > left) {                                                                        \
+    pgercMMA<Packet, type, ConjugateLhs, ConjugateRhs, LhsIsReal, RhsIsReal>(                        \
+        &accReal##iter, &accImag##iter, lhsV2##left.packet[peel & 1], lhsVi2##left.packet[peel & 1], \
+        rhsV##right[peel], rhsVi##right[peel]);                                                      \
   }
 
-#define MICRO_COMPLEX_MMA_LOAD1_TWO(lhs_ptr, left) \
-  if (!LhsIsReal && (unroll_factor > left)) { \
-    if (MICRO_NORMAL(left)) { \
-      ploadLhsMMA(reinterpret_cast<const double*>(lhs_ptr_real##left + imag_delta), plhsVi##left); \
+#define MICRO_COMPLEX_MMA_LOAD1_TWO(lhs_ptr, left)                                                  \
+  if (!LhsIsReal && (unroll_factor > left)) {                                                       \
+    if (MICRO_NORMAL(left)) {                                                                       \
+      ploadLhsMMA(reinterpret_cast<const double*>(lhs_ptr_real##left + imag_delta), plhsVi##left);  \
       __builtin_vsx_disassemble_pair(reinterpret_cast<void*>(&lhsVi2##left.packet), &plhsVi##left); \
-    } else { \
-      lhsVi2##left.packet[0] = ploadLhs<Packet>(lhs_ptr_real##left + imag_delta2); \
-      lhsVi2##left.packet[1] = ploadLhs<Packet>(lhs_ptr_real##left + imag_delta2 + accCols2); \
-      EIGEN_UNUSED_VARIABLE(plhsVi##left); \
-    } \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(lhsVi2##left); \
-    EIGEN_UNUSED_VARIABLE(plhsVi##left); \
-  } \
+    } else {                                                                                        \
+      lhsVi2##left.packet[0] = ploadLhs<Packet>(lhs_ptr_real##left + imag_delta2);                  \
+      lhsVi2##left.packet[1] = ploadLhs<Packet>(lhs_ptr_real##left + imag_delta2 + accCols2);       \
+      EIGEN_UNUSED_VARIABLE(plhsVi##left);                                                          \
+    }                                                                                               \
+  } else {                                                                                          \
+    EIGEN_UNUSED_VARIABLE(lhsVi2##left);                                                            \
+    EIGEN_UNUSED_VARIABLE(plhsVi##left);                                                            \
+  }                                                                                                 \
   MICRO_MMA_LOAD1_TWO(lhs_ptr_real, left)
 
 #define MICRO_COMPLEX_MMA_LOAD_TWO(left) MICRO_COMPLEX_MMA_LOAD1_TWO(lhs_ptr, left)
 #endif
 
-#define MICRO_COMPLEX_MMA_LOAD_RHS1(peel, right) \
-  ploadRhsMMA(rhs_ptr_real##right + (accRows * peel), rhsV##right[peel]); \
-  if (!RhsIsReal) { \
+#define MICRO_COMPLEX_MMA_LOAD_RHS1(peel, right)                             \
+  ploadRhsMMA(rhs_ptr_real##right + (accRows * peel), rhsV##right[peel]);    \
+  if (!RhsIsReal) {                                                          \
     ploadRhsMMA(rhs_ptr_imag##right + (accRows * peel), rhsVi##right[peel]); \
   }
 
-#define MICRO_COMPLEX_MMA_LOAD_ONE_RHS(peel) \
-  MICRO_MMA_UNROLL_ITER(MICRO_COMPLEX_MMA_LOAD_RHS1, peel)
+#define MICRO_COMPLEX_MMA_LOAD_ONE_RHS(peel) MICRO_MMA_UNROLL_ITER(MICRO_COMPLEX_MMA_LOAD_RHS1, peel)
 
 #define MICRO_COMPLEX_MMA_TYPE_PEEL(funcw, funcl, type, peel) \
-  if (PEEL_COMPLEX_MMA > peel) { \
-    Packet lhsV0, lhsV1, lhsV2, lhsV3; \
-    Packet lhsVi0, lhsVi1, lhsVi2, lhsVi3; \
-    MICRO_COMPLEX_MMA_LOAD_ONE_RHS(peel) \
-    MICRO_COMPLEX_MMA_UNROLL(funcl) \
-    MICRO_COMPLEX_MMA_WORK(funcw, type, peel) \
+  if (PEEL_COMPLEX_MMA > peel) {                              \
+    Packet lhsV0, lhsV1, lhsV2, lhsV3;                        \
+    Packet lhsVi0, lhsVi1, lhsVi2, lhsVi3;                    \
+    MICRO_COMPLEX_MMA_LOAD_ONE_RHS(peel)                      \
+    MICRO_COMPLEX_MMA_UNROLL(funcl)                           \
+    MICRO_COMPLEX_MMA_WORK(funcw, type, peel)                 \
   }
 
 #ifndef VECTOR_PAIR_LOADS_LHS
-#define MICRO_COMPLEX_MMA_UNROLL_TYPE_PEEL(funcw, funcl, type) \
-  type rhsV0[4], rhsVi0[4], rhsV1[(accItr > 1) ? 4 : 1], rhsVi1[(accItr > 1) ? 4 : 1], rhsV2[(accItr > 2) ? 4 : 1], rhsVi2[(accItr > 2) ? 4 : 1], rhsV3[(accItr > 2) ? 4 : 1], rhsVi3[(accItr > 2) ? 4 : 1]; \
-  MICRO_COMPLEX_MMA_TYPE_PEEL(funcw,funcl,type,0) MICRO_COMPLEX_MMA_TYPE_PEEL(funcw,funcl,type,1) \
-  MICRO_COMPLEX_MMA_TYPE_PEEL(funcw,funcl,type,2) MICRO_COMPLEX_MMA_TYPE_PEEL(funcw,funcl,type,3)
+#define MICRO_COMPLEX_MMA_UNROLL_TYPE_PEEL(funcw, funcl, type)                                                      \
+  type rhsV0[4], rhsVi0[4], rhsV1[(accItr > 1) ? 4 : 1], rhsVi1[(accItr > 1) ? 4 : 1], rhsV2[(accItr > 2) ? 4 : 1], \
+      rhsVi2[(accItr > 2) ? 4 : 1], rhsV3[(accItr > 2) ? 4 : 1], rhsVi3[(accItr > 2) ? 4 : 1];                      \
+  MICRO_COMPLEX_MMA_TYPE_PEEL(funcw, funcl, type, 0)                                                                \
+  MICRO_COMPLEX_MMA_TYPE_PEEL(funcw, funcl, type, 1)                                                                \
+  MICRO_COMPLEX_MMA_TYPE_PEEL(funcw, funcl, type, 2) MICRO_COMPLEX_MMA_TYPE_PEEL(funcw, funcl, type, 3)
 #else
-#define MICRO_COMPLEX_MMA_LOAD_TWO_RHS(peel1, right) \
-  ploadRhsMMA(reinterpret_cast<const double*>(rhs_ptr_real##right + (accRows * peel1)), prhsV##peel1); \
-  __builtin_vsx_disassemble_pair(reinterpret_cast<void*>(&rhsV##right[peel1]), &prhsV##peel1); \
-  if(!RhsIsReal) { \
+#define MICRO_COMPLEX_MMA_LOAD_TWO_RHS(peel1, right)                                                      \
+  ploadRhsMMA(reinterpret_cast<const double*>(rhs_ptr_real##right + (accRows * peel1)), prhsV##peel1);    \
+  __builtin_vsx_disassemble_pair(reinterpret_cast<void*>(&rhsV##right[peel1]), &prhsV##peel1);            \
+  if (!RhsIsReal) {                                                                                       \
     ploadRhsMMA(reinterpret_cast<const double*>(rhs_ptr_imag##right + (accRows * peel1)), prhsVi##peel1); \
-    __builtin_vsx_disassemble_pair(reinterpret_cast<void*>(&rhsVi##right[peel1]), &prhsVi##peel1); \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(prhsVi##peel1); \
+    __builtin_vsx_disassemble_pair(reinterpret_cast<void*>(&rhsVi##right[peel1]), &prhsVi##peel1);        \
+  } else {                                                                                                \
+    EIGEN_UNUSED_VARIABLE(prhsVi##peel1);                                                                 \
   }
 
 #define MICRO_COMPLEX_MMA_TYPE_PEEL2(funcw1, funcl1, funcw2, funcl2, type, peel1, peel2) \
-  if (PEEL_COMPLEX_MMA > peel2) { \
-    PacketBlock<Packet,2> lhsV20, lhsV21, lhsV22, lhsV23; \
-    PacketBlock<Packet,2> lhsVi20, lhsVi21, lhsVi22, lhsVi23; \
-    __vector_pair plhsV0, plhsV1, plhsV2, plhsV3; \
-    __vector_pair plhsVi0, plhsVi1, plhsVi2, plhsVi3; \
-    if (sizeof(type) == 16) { \
-      MICRO_MMA_UNROLL_ITER(MICRO_COMPLEX_MMA_LOAD_TWO_RHS, peel1) \
-    } else { \
-      EIGEN_UNUSED_VARIABLE(prhsV##peel1); \
-      EIGEN_UNUSED_VARIABLE(prhsVi##peel1); \
-      MICRO_COMPLEX_MMA_LOAD_ONE_RHS(peel1); \
-      MICRO_COMPLEX_MMA_LOAD_ONE_RHS(peel2); \
-    } \
-    MICRO_COMPLEX_MMA_UNROLL(funcl2) \
-    MICRO_COMPLEX_MMA_WORK(funcw2, type, peel1) \
-    MICRO_COMPLEX_MMA_WORK(funcw2, type, peel2) \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(prhsV##peel1); \
-    EIGEN_UNUSED_VARIABLE(prhsVi##peel1); \
-    MICRO_COMPLEX_MMA_TYPE_PEEL(funcw1, funcl1, type, peel1) \
+  if (PEEL_COMPLEX_MMA > peel2) {                                                        \
+    PacketBlock<Packet, 2> lhsV20, lhsV21, lhsV22, lhsV23;                               \
+    PacketBlock<Packet, 2> lhsVi20, lhsVi21, lhsVi22, lhsVi23;                           \
+    __vector_pair plhsV0, plhsV1, plhsV2, plhsV3;                                        \
+    __vector_pair plhsVi0, plhsVi1, plhsVi2, plhsVi3;                                    \
+    if (sizeof(type) == 16) {                                                            \
+      MICRO_MMA_UNROLL_ITER(MICRO_COMPLEX_MMA_LOAD_TWO_RHS, peel1)                       \
+    } else {                                                                             \
+      EIGEN_UNUSED_VARIABLE(prhsV##peel1);                                               \
+      EIGEN_UNUSED_VARIABLE(prhsVi##peel1);                                              \
+      MICRO_COMPLEX_MMA_LOAD_ONE_RHS(peel1);                                             \
+      MICRO_COMPLEX_MMA_LOAD_ONE_RHS(peel2);                                             \
+    }                                                                                    \
+    MICRO_COMPLEX_MMA_UNROLL(funcl2)                                                     \
+    MICRO_COMPLEX_MMA_WORK(funcw2, type, peel1)                                          \
+    MICRO_COMPLEX_MMA_WORK(funcw2, type, peel2)                                          \
+  } else {                                                                               \
+    EIGEN_UNUSED_VARIABLE(prhsV##peel1);                                                 \
+    EIGEN_UNUSED_VARIABLE(prhsVi##peel1);                                                \
+    MICRO_COMPLEX_MMA_TYPE_PEEL(funcw1, funcl1, type, peel1)                             \
   }
 
-#define MICRO_COMPLEX_MMA_UNROLL_TYPE_PEEL2(funcw1, funcl1, funcw2, funcl2, type) \
-  type rhsV0[4], rhsVi0[4], rhsV1[(accItr > 1) ? 4 : 1], rhsVi1[(accItr > 1) ? 4 : 1], rhsV2[(accItr > 2) ? 4 : 1], rhsVi2[(accItr > 2) ? 4 : 1], rhsV3[(accItr > 2) ? 4 : 1], rhsVi3[(accItr > 2) ? 4 : 1]; \
-  __vector_pair prhsV0, prhsV2; \
-  __vector_pair prhsVi0, prhsVi2; \
-  MICRO_COMPLEX_MMA_TYPE_PEEL2(funcw1,funcl1,funcw2,funcl2,type,0,1) \
-  MICRO_COMPLEX_MMA_TYPE_PEEL2(funcw1,funcl1,funcw2,funcl2,type,2,3)
+#define MICRO_COMPLEX_MMA_UNROLL_TYPE_PEEL2(funcw1, funcl1, funcw2, funcl2, type)                                   \
+  type rhsV0[4], rhsVi0[4], rhsV1[(accItr > 1) ? 4 : 1], rhsVi1[(accItr > 1) ? 4 : 1], rhsV2[(accItr > 2) ? 4 : 1], \
+      rhsVi2[(accItr > 2) ? 4 : 1], rhsV3[(accItr > 2) ? 4 : 1], rhsVi3[(accItr > 2) ? 4 : 1];                      \
+  __vector_pair prhsV0, prhsV2;                                                                                     \
+  __vector_pair prhsVi0, prhsVi2;                                                                                   \
+  MICRO_COMPLEX_MMA_TYPE_PEEL2(funcw1, funcl1, funcw2, funcl2, type, 0, 1)                                          \
+  MICRO_COMPLEX_MMA_TYPE_PEEL2(funcw1, funcl1, funcw2, funcl2, type, 2, 3)
 #endif
 
-#define MICRO_COMPLEX_MMA_UNROLL_TYPE_ONE(funcw, funcl, type) \
+#define MICRO_COMPLEX_MMA_UNROLL_TYPE_ONE(funcw, funcl, type)                              \
   type rhsV0[1], rhsVi0[1], rhsV1[1], rhsVi1[1], rhsV2[1], rhsVi2[1], rhsV3[1], rhsVi3[1]; \
-  MICRO_COMPLEX_MMA_TYPE_PEEL(funcw,funcl,type,0)
+  MICRO_COMPLEX_MMA_TYPE_PEEL(funcw, funcl, type, 0)
 
 #define MICRO_COMPLEX_MMA_UPDATE_RHS1(size, right) \
-  rhs_ptr_real##right += (accRows * size); \
-  if(!RhsIsReal) rhs_ptr_imag##right += (accRows * size);
+  rhs_ptr_real##right += (accRows * size);         \
+  if (!RhsIsReal) rhs_ptr_imag##right += (accRows * size);
 
-#define MICRO_COMPLEX_MMA_UPDATE_RHS(size) \
-  MICRO_MMA_UNROLL_ITER(MICRO_COMPLEX_MMA_UPDATE_RHS1, size)
+#define MICRO_COMPLEX_MMA_UPDATE_RHS(size) MICRO_MMA_UNROLL_ITER(MICRO_COMPLEX_MMA_UPDATE_RHS1, size)
 
-#define MICRO_COMPLEX_MMA_UNROLL_TYPE(MICRO_COMPLEX_MMA_TYPE, size) \
+#define MICRO_COMPLEX_MMA_UNROLL_TYPE(MICRO_COMPLEX_MMA_TYPE, size)                     \
   MICRO_COMPLEX_MMA_TYPE(MICRO_COMPLEX_MMA_WORK_ONE, MICRO_COMPLEX_LOAD_ONE, RhsPacket) \
   MICRO_COMPLEX_MMA_UPDATE_RHS(size);
 
 #ifndef VECTOR_PAIR_LOADS_LHS
 #define MICRO_COMPLEX_MMA_ONE_PEEL MICRO_COMPLEX_MMA_UNROLL_TYPE(MICRO_COMPLEX_MMA_UNROLL_TYPE_PEEL, PEEL_COMPLEX_MMA)
 #else
-#define MICRO_COMPLEX_MMA_UNROLL_TYPE2(MICRO_COMPLEX_MMA_TYPE, size) \
-  MICRO_COMPLEX_MMA_TYPE(MICRO_COMPLEX_MMA_WORK_ONE, MICRO_COMPLEX_LOAD_ONE, MICRO_COMPLEX_MMA_WORK_TWO, MICRO_COMPLEX_MMA_LOAD_TWO, RhsPacket) \
+#define MICRO_COMPLEX_MMA_UNROLL_TYPE2(MICRO_COMPLEX_MMA_TYPE, size)                                     \
+  MICRO_COMPLEX_MMA_TYPE(MICRO_COMPLEX_MMA_WORK_ONE, MICRO_COMPLEX_LOAD_ONE, MICRO_COMPLEX_MMA_WORK_TWO, \
+                         MICRO_COMPLEX_MMA_LOAD_TWO, RhsPacket)                                          \
   MICRO_COMPLEX_MMA_UPDATE_RHS(size);
 
 #define MICRO_COMPLEX_MMA_ONE_PEEL MICRO_COMPLEX_MMA_UNROLL_TYPE2(MICRO_COMPLEX_MMA_UNROLL_TYPE_PEEL2, PEEL_COMPLEX_MMA)
@@ -691,12 +655,12 @@
 #define MICRO_COMPLEX_MMA_ONE MICRO_COMPLEX_MMA_UNROLL_TYPE(MICRO_COMPLEX_MMA_UNROLL_TYPE_ONE, 1)
 
 #define MICRO_COMPLEX_MMA_DST_PTR_ONE(iter) \
-  if (unroll_factor * accItr > iter) { \
-    bsetzeroMMA(&accReal##iter); \
-    bsetzeroMMA(&accImag##iter); \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(accReal##iter); \
-    EIGEN_UNUSED_VARIABLE(accImag##iter); \
+  if (unroll_factor * accItr > iter) {      \
+    bsetzeroMMA(&accReal##iter);            \
+    bsetzeroMMA(&accImag##iter);            \
+  } else {                                  \
+    EIGEN_UNUSED_VARIABLE(accReal##iter);   \
+    EIGEN_UNUSED_VARIABLE(accImag##iter);   \
   }
 
 #define MICRO_COMPLEX_MMA_DST_PTR MICRO_COMPLEX_MMA_UNROLL(MICRO_COMPLEX_MMA_DST_PTR_ONE)
@@ -705,61 +669,56 @@
 
 #define MICRO_COMPLEX_MMA_PREFETCH MICRO_COMPLEX_MMA_UNROLL(MICRO_COMPLEX_PREFETCH_ONE)
 
-#define MICRO_COMPLEX_MMA_STORE_ONE(iter, left, right) \
-  if (unroll_factor > left) { \
-    storeComplexAccumulator<DataMapper, Packet, Packetc, accCols, (unroll_factor != (left + 1)) ? accCols : accCols2>(row + left*accCols, res##right, pAlphaReal, pAlphaImag, pMask, &accReal##iter, &accImag##iter); \
+#define MICRO_COMPLEX_MMA_STORE_ONE(iter, left, right)                                                                 \
+  if (unroll_factor > left) {                                                                                          \
+    storeComplexAccumulator<DataMapper, Packet, Packetc, accCols, (unroll_factor != (left + 1)) ? accCols : accCols2>( \
+        row + left * accCols, res##right, pAlphaReal, pAlphaImag, pMask, &accReal##iter, &accImag##iter);              \
   }
 
-#define MICRO_COMPLEX_MMA_ITER_UNROLL(func) \
-  if (accItr == 1) { \
-    func(0,0,0) func(1,1,0) func(2,2,0) func(3,3,0) \
-  } else if (accItr == 2) { \
-    func(0,0,0) func(1,0,1) func(2,1,0) func(3,1,1) \
-  } else { \
-    func(0,0,0) func(1,0,1) func(2,0,2) func(3,0,3) \
+#define MICRO_COMPLEX_MMA_ITER_UNROLL(func)                 \
+  if (accItr == 1) {                                        \
+    func(0, 0, 0) func(1, 1, 0) func(2, 2, 0) func(3, 3, 0) \
+  } else if (accItr == 2) {                                 \
+    func(0, 0, 0) func(1, 0, 1) func(2, 1, 0) func(3, 1, 1) \
+  } else {                                                  \
+    func(0, 0, 0) func(1, 0, 1) func(2, 0, 2) func(3, 0, 3) \
   }
 
 #define MICRO_COMPLEX_MMA_STORE MICRO_COMPLEX_MMA_ITER_UNROLL(MICRO_COMPLEX_MMA_STORE_ONE)
 
-#define MICRO_COMPLEX_MMA_EXTRA_ROWS(right) \
-  gemm_complex_extra_row<Scalar, Packet, Packetc, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, LhsIsReal, RhsIsReal>(res3##right, blockA, rhs_base + right*accRows*(RhsIsReal ? 1 : 2)*strideB, depth, strideA, offsetA, strideB, row, rows, remaining_rows, pAlphaReal, pAlphaImag, pMask);
+#define MICRO_COMPLEX_MMA_EXTRA_ROWS(right)                                                                            \
+  gemm_complex_extra_row<Scalar, Packet, Packetc, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, LhsIsReal, \
+                         RhsIsReal>(res3##right, blockA, rhs_base + right * accRows * (RhsIsReal ? 1 : 2) * strideB,   \
+                                    depth, strideA, offsetA, strideB, row, rows, remaining_rows, pAlphaReal,           \
+                                    pAlphaImag, pMask);
 
-#define MICRO_COMPLEX_MMA_EXTRA_ROWS1(val, right) \
-  MICRO_COMPLEX_MMA_EXTRA_ROWS(right);
+#define MICRO_COMPLEX_MMA_EXTRA_ROWS1(val, right) MICRO_COMPLEX_MMA_EXTRA_ROWS(right);
 
-template<int unroll_factor, typename Scalar, typename Packet, typename Packetc, typename RhsPacket, typename DataMapper, const Index accRows, const Index accCols, const Index accCols2, bool ConjugateLhs, bool ConjugateRhs, bool LhsIsReal, bool RhsIsReal, const Index accItr>
-EIGEN_ALWAYS_INLINE void gemm_complex_unrolled_MMA_iteration(
-  const DataMapper& res0,
-  const DataMapper& res1,
-  const DataMapper& res2,
-  const DataMapper& res3,
-  const Scalar* lhs_base,
-  const Scalar* rhs_base,
-  Index depth,
-  Index strideA,
-  Index offsetA,
-  Index strideB,
-  Index& row,
-  const Packet& pAlphaReal,
-  const Packet& pAlphaImag,
-  const Packet& pMask)
-{
-  const Scalar* rhs_ptr_real0 = rhs_base, * rhs_ptr_real1 = NULL, * rhs_ptr_real2 = NULL, * rhs_ptr_real3 = NULL;
-  const Scalar* rhs_ptr_imag0 = NULL, * rhs_ptr_imag1 = NULL, * rhs_ptr_imag2 = NULL, * rhs_ptr_imag3 = NULL;
-  const Index imag_delta = accCols*strideA;
-  const Index imag_delta2 = accCols2*strideA;
+template <int unroll_factor, typename Scalar, typename Packet, typename Packetc, typename RhsPacket,
+          typename DataMapper, const Index accRows, const Index accCols, const Index accCols2, bool ConjugateLhs,
+          bool ConjugateRhs, bool LhsIsReal, bool RhsIsReal, const Index accItr>
+EIGEN_ALWAYS_INLINE void gemm_complex_unrolled_MMA_iteration(const DataMapper& res0, const DataMapper& res1,
+                                                             const DataMapper& res2, const DataMapper& res3,
+                                                             const Scalar* lhs_base, const Scalar* rhs_base,
+                                                             Index depth, Index strideA, Index offsetA, Index strideB,
+                                                             Index& row, const Packet& pAlphaReal,
+                                                             const Packet& pAlphaImag, const Packet& pMask) {
+  const Scalar *rhs_ptr_real0 = rhs_base, *rhs_ptr_real1 = NULL, *rhs_ptr_real2 = NULL, *rhs_ptr_real3 = NULL;
+  const Scalar *rhs_ptr_imag0 = NULL, *rhs_ptr_imag1 = NULL, *rhs_ptr_imag2 = NULL, *rhs_ptr_imag3 = NULL;
+  const Index imag_delta = accCols * strideA;
+  const Index imag_delta2 = accCols2 * strideA;
 
-  if(!RhsIsReal) {
-    rhs_ptr_imag0 = rhs_base + accRows*strideB;
+  if (!RhsIsReal) {
+    rhs_ptr_imag0 = rhs_base + accRows * strideB;
   } else {
     EIGEN_UNUSED_VARIABLE(rhs_ptr_imag0);
   }
   if (accItr > 1) {
-    if(!RhsIsReal) {
-      rhs_ptr_real1 = rhs_base + (2*accRows*strideB);
-      rhs_ptr_imag1 = rhs_base + (3*accRows*strideB);
+    if (!RhsIsReal) {
+      rhs_ptr_real1 = rhs_base + (2 * accRows * strideB);
+      rhs_ptr_imag1 = rhs_base + (3 * accRows * strideB);
     } else {
-      rhs_ptr_real1 = rhs_base + accRows*strideB;
+      rhs_ptr_real1 = rhs_base + accRows * strideB;
       EIGEN_UNUSED_VARIABLE(rhs_ptr_imag1);
     }
   } else {
@@ -768,14 +727,14 @@
     EIGEN_UNUSED_VARIABLE(res1);
   }
   if (accItr > 2) {
-    if(!RhsIsReal) {
-      rhs_ptr_real2 = rhs_base + (4*accRows*strideB);
-      rhs_ptr_imag2 = rhs_base + (5*accRows*strideB);
-      rhs_ptr_real3 = rhs_base + (6*accRows*strideB);
-      rhs_ptr_imag3 = rhs_base + (7*accRows*strideB);
+    if (!RhsIsReal) {
+      rhs_ptr_real2 = rhs_base + (4 * accRows * strideB);
+      rhs_ptr_imag2 = rhs_base + (5 * accRows * strideB);
+      rhs_ptr_real3 = rhs_base + (6 * accRows * strideB);
+      rhs_ptr_imag3 = rhs_base + (7 * accRows * strideB);
     } else {
-      rhs_ptr_real2 = rhs_base + (2*accRows*strideB);
-      rhs_ptr_real3 = rhs_base + (3*accRows*strideB);
+      rhs_ptr_real2 = rhs_base + (2 * accRows * strideB);
+      rhs_ptr_real3 = rhs_base + (3 * accRows * strideB);
       EIGEN_UNUSED_VARIABLE(rhs_ptr_imag2);
       EIGEN_UNUSED_VARIABLE(rhs_ptr_imag3);
     }
@@ -787,25 +746,23 @@
     EIGEN_UNUSED_VARIABLE(res2);
     EIGEN_UNUSED_VARIABLE(res3);
   }
-  const Scalar* lhs_ptr_real0 = NULL, * lhs_ptr_real1 = NULL;
-  const Scalar* lhs_ptr_real2 = NULL, * lhs_ptr_real3 = NULL;
+  const Scalar *lhs_ptr_real0 = NULL, *lhs_ptr_real1 = NULL;
+  const Scalar *lhs_ptr_real2 = NULL, *lhs_ptr_real3 = NULL;
   __vector_quad accReal0, accImag0, accReal1, accImag1, accReal2, accImag2, accReal3, accImag3;
 
   MICRO_COMPLEX_MMA_SRC_PTR
   MICRO_COMPLEX_MMA_DST_PTR
 
   Index k = 0, depth2 = depth - PEEL_COMPLEX_MMA;
-  for(; k <= depth2; k += PEEL_COMPLEX_MMA)
-  {
+  for (; k <= depth2; k += PEEL_COMPLEX_MMA) {
     EIGEN_POWER_PREFETCH(rhs_ptr_real);
-    if(!RhsIsReal) {
+    if (!RhsIsReal) {
       EIGEN_POWER_PREFETCH(rhs_ptr_imag);
     }
     MICRO_COMPLEX_MMA_PREFETCH
     MICRO_COMPLEX_MMA_ONE_PEEL
   }
-  for(; k < depth; k++)
-  {
+  for (; k < depth; k++) {
     MICRO_COMPLEX_MMA_ONE
   }
   MICRO_COMPLEX_MMA_STORE
@@ -813,39 +770,32 @@
   MICRO_COMPLEX_UPDATE
 }
 
-#define MICRO_COMPLEX_MMA_UNROLL_ITER2(N, M) \
-  gemm_complex_unrolled_MMA_iteration<N + (M ? 1 : 0), Scalar, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, M ? M : accCols, ConjugateLhs, ConjugateRhs, LhsIsReal, RhsIsReal, accItr>(res30, res31, res32, res33, lhs_base, rhs_base, depth, strideA, offsetA, strideB, row, pAlphaReal, pAlphaImag, pMask); \
+#define MICRO_COMPLEX_MMA_UNROLL_ITER2(N, M)                                                                           \
+  gemm_complex_unrolled_MMA_iteration<N + (M ? 1 : 0), Scalar, Packet, Packetc, RhsPacket, DataMapper, accRows,        \
+                                      accCols, M ? M : accCols, ConjugateLhs, ConjugateRhs, LhsIsReal, RhsIsReal,      \
+                                      accItr>(res30, res31, res32, res33, lhs_base, rhs_base, depth, strideA, offsetA, \
+                                              strideB, row, pAlphaReal, pAlphaImag, pMask);                            \
   if (M) return;
 
-#define MICRO_COMPLEX_MMA_ROWS(n) \
-  while(row + n*accCols <= rows) { \
+#define MICRO_COMPLEX_MMA_ROWS(n)         \
+  while (row + n * accCols <= rows) {     \
     MICRO_COMPLEX_MMA_UNROLL_ITER2(n, 0); \
   }
 
-template<typename Scalar, typename Packet, typename Packetc, typename RhsPacket, typename DataMapper, const Index accRows, const Index accCols, bool ConjugateLhs, bool ConjugateRhs, bool LhsIsReal, bool RhsIsReal, const Index accItr>
-EIGEN_ALWAYS_INLINE void gemmMMA_complex_cols(
-  const DataMapper& res,
-  const Scalar* blockA,
-  const Scalar* blockB,
-  Index depth,
-  Index strideA,
-  Index offsetA,
-  Index strideB,
-  Index offsetB,
-  Index col,
-  Index rows,
-  Index remaining_rows,
-  const Packet& pAlphaReal,
-  const Packet& pAlphaImag,
-  const Packet& pMask)
-{
+template <typename Scalar, typename Packet, typename Packetc, typename RhsPacket, typename DataMapper,
+          const Index accRows, const Index accCols, bool ConjugateLhs, bool ConjugateRhs, bool LhsIsReal,
+          bool RhsIsReal, const Index accItr>
+EIGEN_ALWAYS_INLINE void gemmMMA_complex_cols(const DataMapper& res, const Scalar* blockA, const Scalar* blockB,
+                                              Index depth, Index strideA, Index offsetA, Index strideB, Index offsetB,
+                                              Index col, Index rows, Index remaining_rows, const Packet& pAlphaReal,
+                                              const Packet& pAlphaImag, const Packet& pMask) {
   const DataMapper res30 = res.getSubMapper(0, col);
-  const DataMapper res31 = (accItr > 1) ? res30.getSubMapper(0, accRows*1) : res30;
-  const DataMapper res32 = (accItr > 2) ? res30.getSubMapper(0, accRows*2) : res30;
-  const DataMapper res33 = (accItr > 2) ? res30.getSubMapper(0, accRows*3) : res30;
+  const DataMapper res31 = (accItr > 1) ? res30.getSubMapper(0, accRows * 1) : res30;
+  const DataMapper res32 = (accItr > 2) ? res30.getSubMapper(0, accRows * 2) : res30;
+  const DataMapper res33 = (accItr > 2) ? res30.getSubMapper(0, accRows * 3) : res30;
 
-  const Scalar* rhs_base = blockB + advanceCols*col*strideB + accRows*offsetB;
-  const Scalar* lhs_base = blockA + accCols*offsetA;
+  const Scalar* rhs_base = blockB + advanceCols * col * strideB + accRows * offsetB;
+  const Scalar* lhs_base = blockA + accCols * offsetA;
   Index row = 0;
 
 #define MAX_COMPLEX_MMA_UNROLL 4
@@ -863,7 +813,7 @@
   } else {
     MICRO_COMPLEX_MMA_ROWS(1);
   }
-  switch( (rows-row)/accCols ) {
+  switch ((rows - row) / accCols) {
 #if MAX_COMPLEX_MMA_UNROLL > 3
     case 3:
       if (accItr == 1) {
@@ -890,59 +840,62 @@
   }
 #undef MAX_COMPLEX_MMA_UNROLL
 
-  if(remaining_rows > 0)
-  {
+  if (remaining_rows > 0) {
     MICRO_MMA_UNROLL_ITER(MICRO_COMPLEX_MMA_EXTRA_ROWS1, 0)
   }
 }
 
-#define MICRO_COMPLEX_MMA_COLS(n) \
-  for(; col + n*accRows <= cols; col += n*accRows) \
-  { \
-    gemmMMA_complex_cols<Scalar, Packet, Packetc, RhsPacket2, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, LhsIsReal, RhsIsReal, n>(res, blockA, blockB, depth, strideA, offsetA, strideB, offsetB, col, rows, remaining_rows, pAlphaReal, pAlphaImag, pMask); \
+#define MICRO_COMPLEX_MMA_COLS(n)                                                                                      \
+  for (; col + n * accRows <= cols; col += n * accRows) {                                                              \
+    gemmMMA_complex_cols<Scalar, Packet, Packetc, RhsPacket2, DataMapper, accRows, accCols, ConjugateLhs,              \
+                         ConjugateRhs, LhsIsReal, RhsIsReal, n>(res, blockA, blockB, depth, strideA, offsetA, strideB, \
+                                                                offsetB, col, rows, remaining_rows, pAlphaReal,        \
+                                                                pAlphaImag, pMask);                                    \
   }
 
-template<typename LhsScalar, typename RhsScalar, typename Scalarc, typename Scalar, typename Packet, typename Packetc, typename RhsPacket, typename DataMapper, const Index accRows, const Index accCols, bool ConjugateLhs, bool ConjugateRhs, bool LhsIsReal, bool RhsIsReal>
-void gemm_complexMMA(const DataMapper& res, const LhsScalar* blockAc, const RhsScalar* blockBc, Index rows, Index depth, Index cols, Scalarc alpha, Index strideA, Index strideB, Index offsetA, Index offsetB)
-{
-      const Index remaining_rows = rows % accCols;
+template <typename LhsScalar, typename RhsScalar, typename Scalarc, typename Scalar, typename Packet, typename Packetc,
+          typename RhsPacket, typename DataMapper, const Index accRows, const Index accCols, bool ConjugateLhs,
+          bool ConjugateRhs, bool LhsIsReal, bool RhsIsReal>
+void gemm_complexMMA(const DataMapper& res, const LhsScalar* blockAc, const RhsScalar* blockBc, Index rows, Index depth,
+                     Index cols, Scalarc alpha, Index strideA, Index strideB, Index offsetA, Index offsetB) {
+  const Index remaining_rows = rows % accCols;
 
-      if( strideA == -1 ) strideA = depth;
-      if( strideB == -1 ) strideB = depth;
+  if (strideA == -1) strideA = depth;
+  if (strideB == -1) strideB = depth;
 
-      const Packet pAlphaReal = pset1<Packet>(alpha.real());
-      const Packet pAlphaImag = pset1<Packet>(alpha.imag());
-      const Packet pMask = bmask<Packet>(remaining_rows);
+  const Packet pAlphaReal = pset1<Packet>(alpha.real());
+  const Packet pAlphaImag = pset1<Packet>(alpha.imag());
+  const Packet pMask = bmask<Packet>(remaining_rows);
 
-      const Scalar* blockA = (Scalar *) blockAc;
-      const Scalar* blockB = (Scalar *) blockBc;
+  const Scalar* blockA = (Scalar*)blockAc;
+  const Scalar* blockB = (Scalar*)blockBc;
 
-      typedef typename std::conditional_t<(sizeof(Scalar) == sizeof(float)), RhsPacket, __vector_pair> RhsPacket2;
+  typedef typename std::conditional_t<(sizeof(Scalar) == sizeof(float)), RhsPacket, __vector_pair> RhsPacket2;
 
-      Index col = 0;
+  Index col = 0;
 #ifdef GEMM_MULTIPLE_COLS
-      MICRO_COMPLEX_MMA_COLS(4);
-      MICRO_COMPLEX_MMA_COLS(2);
+  MICRO_COMPLEX_MMA_COLS(4);
+  MICRO_COMPLEX_MMA_COLS(2);
 #endif
-      MICRO_COMPLEX_MMA_COLS(1);
+  MICRO_COMPLEX_MMA_COLS(1);
 
-      if (col != cols)
-      {
-        gemm_complex_extra_cols<Scalar, Packet, Packetc, DataMapper, accCols, ConjugateLhs, ConjugateRhs, LhsIsReal, RhsIsReal>(res, blockA, blockB, depth, strideA, offsetA, strideB, offsetB, col, rows, cols, remaining_rows, pAlphaReal, pAlphaImag, pMask);
-      }
+  if (col != cols) {
+    gemm_complex_extra_cols<Scalar, Packet, Packetc, DataMapper, accCols, ConjugateLhs, ConjugateRhs, LhsIsReal,
+                            RhsIsReal>(res, blockA, blockB, depth, strideA, offsetA, strideB, offsetB, col, rows, cols,
+                                       remaining_rows, pAlphaReal, pAlphaImag, pMask);
+  }
 }
 
 #undef accColsC
 #undef advanceRows
 #undef advanceCols
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
 #if defined(EIGEN_ALTIVEC_MMA_DYNAMIC_DISPATCH)
 #pragma GCC pop_options
 #endif
 
-#endif // EIGEN_MATRIX_PRODUCT_MMA_ALTIVEC_H
-
+#endif  // EIGEN_MATRIX_PRODUCT_MMA_ALTIVEC_H
diff --git a/Eigen/src/Core/arch/AltiVec/MatrixProductMMAbfloat16.h b/Eigen/src/Core/arch/AltiVec/MatrixProductMMAbfloat16.h
index 5094118..6ecec0e 100644
--- a/Eigen/src/Core/arch/AltiVec/MatrixProductMMAbfloat16.h
+++ b/Eigen/src/Core/arch/AltiVec/MatrixProductMMAbfloat16.h
@@ -11,11 +11,10 @@
 
 namespace internal {
 
-template<bool zero>
-EIGEN_ALWAYS_INLINE Packet8bf loadBfloat16(const bfloat16* indexA)
-{
+template <bool zero>
+EIGEN_ALWAYS_INLINE Packet8bf loadBfloat16(const bfloat16* indexA) {
   Packet8bf lhs1 = ploadu<Packet8bf>(indexA);
-  if(zero){
+  if (zero) {
     Packet8bf lhs2 = pset1<Packet8bf>(Eigen::bfloat16(0));
     return vec_mergeh(lhs1.m_val, lhs2.m_val);
   } else {
@@ -23,239 +22,243 @@
   }
 }
 
-template<bool zero>
-EIGEN_ALWAYS_INLINE Packet8bf loadRhsBfloat16(const bfloat16* blockB, Index strideB, Index i)
-{
-  return loadBfloat16<zero>(blockB + strideB*i);
+template <bool zero>
+EIGEN_ALWAYS_INLINE Packet8bf loadRhsBfloat16(const bfloat16* blockB, Index strideB, Index i) {
+  return loadBfloat16<zero>(blockB + strideB * i);
 }
 
-template<Index num_acc, Index num_packets, bool zero, bool rhsExtraCols, bool lhsExtraRows, Index num_rhs, Index num_lhs>
-EIGEN_ALWAYS_INLINE void KLoop
-(
-  const bfloat16* indexA,
-  const bfloat16* indexB,
-  __vector_quad (&quad_acc)[num_acc],
-  Index strideB,
-  Index k,
-  Index offsetB,
-  Index extra_cols,
-  Index extra_rows
-)
-{
+template <Index num_acc, Index num_packets, bool zero, bool rhsExtraCols, bool lhsExtraRows, Index num_rhs,
+          Index num_lhs>
+EIGEN_ALWAYS_INLINE void KLoop(const bfloat16* indexA, const bfloat16* indexB, __vector_quad (&quad_acc)[num_acc],
+                               Index strideB, Index k, Index offsetB, Index extra_cols, Index extra_rows) {
   Packet8bf lhs[num_lhs], rhs[num_rhs];
 
   BFLOAT16_UNROLL
-  for(Index i = 0; i < (num_rhs - (rhsExtraCols ? 1 : 0)); i++){
-    rhs[i] = loadRhsBfloat16<zero>(indexB + k*4, strideB, i);
+  for (Index i = 0; i < (num_rhs - (rhsExtraCols ? 1 : 0)); i++) {
+    rhs[i] = loadRhsBfloat16<zero>(indexB + k * 4, strideB, i);
   }
-  if(rhsExtraCols) {
-    rhs[num_rhs - 1] = loadRhsBfloat16<zero>(indexB + k*extra_cols - offsetB, strideB, num_rhs - 1);
+  if (rhsExtraCols) {
+    rhs[num_rhs - 1] = loadRhsBfloat16<zero>(indexB + k * extra_cols - offsetB, strideB, num_rhs - 1);
   }
 
-  indexA += k*(lhsExtraRows ? extra_rows : num_packets);
+  indexA += k * (lhsExtraRows ? extra_rows : num_packets);
   if (num_lhs == 1) {
     lhs[0] = loadBfloat16<zero>(indexA);
   } else {
     BFLOAT16_UNROLL
-    for(Index j = 0; j < num_lhs; j += 2) {
-      Packet8bf lhs1 = ploadu<Packet8bf>(indexA + (j + 0)*(zero ? 4 : 8));
+    for (Index j = 0; j < num_lhs; j += 2) {
+      Packet8bf lhs1 = ploadu<Packet8bf>(indexA + (j + 0) * (zero ? 4 : 8));
       if (zero) {
         Packet8bf lhs2 = pset1<Packet8bf>(Eigen::bfloat16(0));
         lhs[j + 0] = vec_mergeh(lhs1.m_val, lhs2.m_val);
         lhs[j + 1] = vec_mergel(lhs1.m_val, lhs2.m_val);
       } else {
         lhs[j + 0] = lhs1;
-        lhs[j + 1] = ploadu<Packet8bf>(indexA + (j + 1)*8);
+        lhs[j + 1] = ploadu<Packet8bf>(indexA + (j + 1) * 8);
       }
     }
   }
 
   BFLOAT16_UNROLL
-  for(Index i = 0, x = 0; i < num_rhs; i++) {
+  for (Index i = 0, x = 0; i < num_rhs; i++) {
     BFLOAT16_UNROLL
-    for(Index j = 0; j < num_lhs; j++, x++) {
-      __builtin_mma_xvbf16ger2pp(&(quad_acc[x]), reinterpret_cast<Packet16uc>(rhs[i].m_val), reinterpret_cast<Packet16uc>(lhs[j].m_val));
+    for (Index j = 0; j < num_lhs; j++, x++) {
+      __builtin_mma_xvbf16ger2pp(&(quad_acc[x]), reinterpret_cast<Packet16uc>(rhs[i].m_val),
+                                 reinterpret_cast<Packet16uc>(lhs[j].m_val));
     }
   }
 }
 
-template<Index num_acc>
-EIGEN_ALWAYS_INLINE void zeroAccumulators(__vector_quad (&quad_acc)[num_acc])
-{
+template <Index num_acc>
+EIGEN_ALWAYS_INLINE void zeroAccumulators(__vector_quad (&quad_acc)[num_acc]) {
   BFLOAT16_UNROLL
-  for(Index k = 0; k < num_acc; k++)
-    __builtin_mma_xxsetaccz(&(quad_acc[k]));
+  for (Index k = 0; k < num_acc; k++) __builtin_mma_xxsetaccz(&(quad_acc[k]));
 }
 
-template<Index num_acc>
-EIGEN_ALWAYS_INLINE void disassembleAccumulators(__vector_quad (&quad_acc)[num_acc], Packet4f (&acc)[num_acc][4])
-{
+template <Index num_acc>
+EIGEN_ALWAYS_INLINE void disassembleAccumulators(__vector_quad (&quad_acc)[num_acc], Packet4f (&acc)[num_acc][4]) {
   BFLOAT16_UNROLL
-  for(Index k = 0; k < num_acc; k++)
-    __builtin_mma_disassemble_acc((void*)acc[k], &(quad_acc[k]));
+  for (Index k = 0; k < num_acc; k++) __builtin_mma_disassemble_acc((void*)acc[k], &(quad_acc[k]));
 }
 
-template<Index num_acc, bool rhsExtraCols, bool lhsExtraRows, Index num_rhs, Index num_lhs>
-EIGEN_ALWAYS_INLINE void outputResults(Packet4f (&acc)[num_acc][4], Index rows, const Packet4f pAlpha, float* result, const Index extra_cols, Index extra_rows)
-{
+template <Index num_acc, bool rhsExtraCols, bool lhsExtraRows, Index num_rhs, Index num_lhs>
+EIGEN_ALWAYS_INLINE void outputResults(Packet4f (&acc)[num_acc][4], Index rows, const Packet4f pAlpha, float* result,
+                                       const Index extra_cols, Index extra_rows) {
   BFLOAT16_UNROLL
-  for(Index i = 0, k = 0; i < num_rhs - (rhsExtraCols ? 1 : 0); i++, result += 4*rows){
+  for (Index i = 0, k = 0; i < num_rhs - (rhsExtraCols ? 1 : 0); i++, result += 4 * rows) {
     BFLOAT16_UNROLL
-    for(Index j = 0; j < num_lhs; j++, k++) {
-      storeResults<false, lhsExtraRows>(acc[k], rows, pAlpha, result + j*4, extra_cols, extra_rows);
+    for (Index j = 0; j < num_lhs; j++, k++) {
+      storeResults<false, lhsExtraRows>(acc[k], rows, pAlpha, result + j * 4, extra_cols, extra_rows);
     }
   }
-  if(rhsExtraCols) {
+  if (rhsExtraCols) {
     storeResults<rhsExtraCols, lhsExtraRows>(acc[num_acc - 1], rows, pAlpha, result, extra_cols, extra_rows);
   }
 }
 
-template<const Index num_acc, const Index num_packets, bool rhsExtraCols, bool lhsExtraRows, bool multiIter = false>
-EIGEN_ALWAYS_INLINE void colLoopBodyIter(Index depth, Index rows, const Packet4f pAlpha, const bfloat16* indexA, const bfloat16* indexB, Index strideB, Index offsetB, float* result, const Index extra_cols, const Index extra_rows)
-{
+template <const Index num_acc, const Index num_packets, bool rhsExtraCols, bool lhsExtraRows, bool multiIter = false>
+EIGEN_ALWAYS_INLINE void colLoopBodyIter(Index depth, Index rows, const Packet4f pAlpha, const bfloat16* indexA,
+                                         const bfloat16* indexB, Index strideB, Index offsetB, float* result,
+                                         const Index extra_cols, const Index extra_rows) {
   constexpr Index num_lhs = multiIter ? (num_packets / 4) : 1;
   constexpr Index num_rhs = (num_acc + num_lhs - 1) / num_lhs;
 
-  for(Index offset_row = 0; offset_row < num_packets; offset_row += 4, indexA += (multiIter ? 0 : 8), indexB += (multiIter ? (num_rhs*strideB) : 0), result += (multiIter ? (4*rows*num_rhs) : 4)) {
+  for (Index offset_row = 0; offset_row < num_packets; offset_row += 4, indexA += (multiIter ? 0 : 8),
+             indexB += (multiIter ? (num_rhs * strideB) : 0), result += (multiIter ? (4 * rows * num_rhs) : 4)) {
     Packet4f acc[num_acc][4];
     __vector_quad quad_acc[num_acc];
 
     zeroAccumulators<num_acc>(quad_acc);
 
     Index k;
-    for(k = 0; k + 2 <= depth; k += 2){
-      KLoop<num_acc, num_packets, false, rhsExtraCols, lhsExtraRows, num_rhs, num_lhs>(indexA, indexB, quad_acc, strideB, k, offsetB, extra_cols, extra_rows);
+    for (k = 0; k + 2 <= depth; k += 2) {
+      KLoop<num_acc, num_packets, false, rhsExtraCols, lhsExtraRows, num_rhs, num_lhs>(
+          indexA, indexB, quad_acc, strideB, k, offsetB, extra_cols, extra_rows);
     }
-    if(depth&1){
-      KLoop<num_acc, num_packets, true, rhsExtraCols, lhsExtraRows, num_rhs, num_lhs>(indexA - (multiIter ? 0 : offset_row), indexB, quad_acc, strideB, k, offsetB, extra_cols, extra_rows);
+    if (depth & 1) {
+      KLoop<num_acc, num_packets, true, rhsExtraCols, lhsExtraRows, num_rhs, num_lhs>(
+          indexA - (multiIter ? 0 : offset_row), indexB, quad_acc, strideB, k, offsetB, extra_cols, extra_rows);
     }
 
     disassembleAccumulators<num_acc>(quad_acc, acc);
 
-    outputResults<num_acc, rhsExtraCols, lhsExtraRows, num_rhs, num_lhs>(acc, rows, pAlpha, result, extra_cols, extra_rows);
+    outputResults<num_acc, rhsExtraCols, lhsExtraRows, num_rhs, num_lhs>(acc, rows, pAlpha, result, extra_cols,
+                                                                         extra_rows);
   }
 }
 
-#define MAX_BFLOAT16_ACC   8
+#define MAX_BFLOAT16_ACC 8
 
-template<const Index num_acc, const Index num_packets, bool rhsExtraCols, bool lhsExtraRows>
-void colLoopBody(Index& col, Index depth, Index cols, Index rows, const Packet4f pAlpha, const bfloat16* indexA, const bfloat16* indexB, Index strideB, Index offsetB, float* result)
-{
-  constexpr Index step = (num_acc * 4); // each accumulator has 4 elements
+template <const Index num_acc, const Index num_packets, bool rhsExtraCols, bool lhsExtraRows>
+void colLoopBody(Index& col, Index depth, Index cols, Index rows, const Packet4f pAlpha, const bfloat16* indexA,
+                 const bfloat16* indexB, Index strideB, Index offsetB, float* result) {
+  constexpr Index step = (num_acc * 4);  // each accumulator has 4 elements
   const Index extra_cols = (rhsExtraCols) ? (cols & 3) : 0;
   const Index extra_rows = (lhsExtraRows) ? (rows & 3) : 0;
   constexpr bool multiIters = !rhsExtraCols && (num_acc == MAX_BFLOAT16_ACC);
   constexpr bool normIters = multiIters && ((num_acc % (num_packets / 4)) == 0);
 
-  do{
-    colLoopBodyIter<num_acc, num_packets, rhsExtraCols, lhsExtraRows, normIters>(depth, rows, pAlpha, indexA, indexB, strideB, offsetB, result, extra_cols, extra_rows);
+  do {
+    colLoopBodyIter<num_acc, num_packets, rhsExtraCols, lhsExtraRows, normIters>(
+        depth, rows, pAlpha, indexA, indexB, strideB, offsetB, result, extra_cols, extra_rows);
 
-    indexB += strideB*num_acc;
-    result += rows*step;
-  } while(multiIters && (step <= cols - (col += step)));
+    indexB += strideB * num_acc;
+    result += rows * step;
+  } while (multiIters && (step <= cols - (col += step)));
 }
 
-template<const Index num_acc, const Index num_packets, bool rhsExtraCols, bool lhsExtraRows>
-EIGEN_ALWAYS_INLINE void colLoopBodyExtraN(Index col, Index depth, Index cols, Index rows, const Packet4f pAlpha, const bfloat16* indexA, const bfloat16* blockB, Index strideB, Index offsetB, float* result)
-{
+template <const Index num_acc, const Index num_packets, bool rhsExtraCols, bool lhsExtraRows>
+EIGEN_ALWAYS_INLINE void colLoopBodyExtraN(Index col, Index depth, Index cols, Index rows, const Packet4f pAlpha,
+                                           const bfloat16* indexA, const bfloat16* blockB, Index strideB, Index offsetB,
+                                           float* result) {
   if (MAX_BFLOAT16_ACC > num_acc) {
-    colLoopBody<num_acc + (rhsExtraCols ? 1 : 0), num_packets, rhsExtraCols, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB, strideB, offsetB, result);
+    colLoopBody<num_acc + (rhsExtraCols ? 1 : 0), num_packets, rhsExtraCols, lhsExtraRows>(
+        col, depth, cols, rows, pAlpha, indexA, blockB, strideB, offsetB, result);
   }
 }
 
-template<const Index num_packets, bool rhsExtraCols, bool lhsExtraRows>
-void colLoopBodyExtra(Index col, Index depth, Index cols, Index rows, const Packet4f pAlpha, const bfloat16* indexA, const bfloat16* blockB, Index strideB, Index offsetB, float* result)
-{
+template <const Index num_packets, bool rhsExtraCols, bool lhsExtraRows>
+void colLoopBodyExtra(Index col, Index depth, Index cols, Index rows, const Packet4f pAlpha, const bfloat16* indexA,
+                      const bfloat16* blockB, Index strideB, Index offsetB, float* result) {
   switch ((cols - col) >> 2) {
-  case 7:
-    colLoopBodyExtraN<7, num_packets, rhsExtraCols, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB, strideB, offsetB, result);
-    break;
-  case 6:
-    colLoopBodyExtraN<6, num_packets, rhsExtraCols, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB, strideB, offsetB, result);
-    break;
-  case 5:
-    colLoopBodyExtraN<5, num_packets, rhsExtraCols, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB, strideB, offsetB, result);
-    break;
-  case 4:
-    colLoopBodyExtraN<4, num_packets, rhsExtraCols, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB, strideB, offsetB, result);
-    break;
-  case 3:
-    colLoopBodyExtraN<3, num_packets, rhsExtraCols, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB, strideB, offsetB, result);
-    break;
-  case 2:
-    colLoopBodyExtraN<2, num_packets, rhsExtraCols, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB, strideB, offsetB, result);
-    break;
-  case 1:
-    colLoopBodyExtraN<1, num_packets, rhsExtraCols, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB, strideB, offsetB, result);
-    break;
-  default:
-    if (rhsExtraCols) {
-      colLoopBody<1, num_packets, true, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB, strideB, offsetB, result);
-    }
-    break;
+    case 7:
+      colLoopBodyExtraN<7, num_packets, rhsExtraCols, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB,
+                                                                    strideB, offsetB, result);
+      break;
+    case 6:
+      colLoopBodyExtraN<6, num_packets, rhsExtraCols, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB,
+                                                                    strideB, offsetB, result);
+      break;
+    case 5:
+      colLoopBodyExtraN<5, num_packets, rhsExtraCols, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB,
+                                                                    strideB, offsetB, result);
+      break;
+    case 4:
+      colLoopBodyExtraN<4, num_packets, rhsExtraCols, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB,
+                                                                    strideB, offsetB, result);
+      break;
+    case 3:
+      colLoopBodyExtraN<3, num_packets, rhsExtraCols, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB,
+                                                                    strideB, offsetB, result);
+      break;
+    case 2:
+      colLoopBodyExtraN<2, num_packets, rhsExtraCols, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB,
+                                                                    strideB, offsetB, result);
+      break;
+    case 1:
+      colLoopBodyExtraN<1, num_packets, rhsExtraCols, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB,
+                                                                    strideB, offsetB, result);
+      break;
+    default:
+      if (rhsExtraCols) {
+        colLoopBody<1, num_packets, true, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB, strideB,
+                                                        offsetB, result);
+      }
+      break;
   }
 }
 
-template<const Index num_packets, bool lhsExtraRows = false>
-EIGEN_ALWAYS_INLINE void colLoops(Index depth, Index cols, Index rows, const Packet4f pAlpha, const bfloat16* indexA, const bfloat16* blockB, Index strideB, Index offsetB, float* result)
-{
+template <const Index num_packets, bool lhsExtraRows = false>
+EIGEN_ALWAYS_INLINE void colLoops(Index depth, Index cols, Index rows, const Packet4f pAlpha, const bfloat16* indexA,
+                                  const bfloat16* blockB, Index strideB, Index offsetB, float* result) {
   Index col = 0;
   if (cols >= (MAX_BFLOAT16_ACC * 4)) {
-    colLoopBody<MAX_BFLOAT16_ACC, num_packets, false, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB, strideB, 0, result);
-    blockB += (strideB >> 2)*col;
-    result += rows*col;
+    colLoopBody<MAX_BFLOAT16_ACC, num_packets, false, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB,
+                                                                    strideB, 0, result);
+    blockB += (strideB >> 2) * col;
+    result += rows * col;
   }
   if (cols & 3) {
-    colLoopBodyExtra<num_packets, true, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB, strideB, offsetB, result);
+    colLoopBodyExtra<num_packets, true, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB, strideB, offsetB,
+                                                      result);
   } else {
-    colLoopBodyExtra<num_packets, false, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB, strideB, 0, result);
+    colLoopBodyExtra<num_packets, false, lhsExtraRows>(col, depth, cols, rows, pAlpha, indexA, blockB, strideB, 0,
+                                                       result);
   }
 }
 
-EIGEN_ALWAYS_INLINE Packet8bf convertF32toBF16(const float *res)
-{
+EIGEN_ALWAYS_INLINE Packet8bf convertF32toBF16(const float* res) {
   Packet16uc fp16[2];
-  __vector_pair fp16_vp = *reinterpret_cast<__vector_pair *>(const_cast<float *>(res));
+  __vector_pair fp16_vp = *reinterpret_cast<__vector_pair*>(const_cast<float*>(res));
   __builtin_vsx_disassemble_pair(reinterpret_cast<void*>(fp16), &fp16_vp);
   fp16[0] = __builtin_vsx_xvcvspbf16(fp16[0]);
   fp16[1] = __builtin_vsx_xvcvspbf16(fp16[1]);
   return vec_pack(reinterpret_cast<Packet4ui>(fp16[0]), reinterpret_cast<Packet4ui>(fp16[1]));
 }
 
-template<typename DataMapper, const Index size>
-EIGEN_ALWAYS_INLINE void convertArrayF32toBF16Col(float *result, Index col, Index rows, const DataMapper& res)
-{
+template <typename DataMapper, const Index size>
+EIGEN_ALWAYS_INLINE void convertArrayF32toBF16Col(float* result, Index col, Index rows, const DataMapper& res) {
   const DataMapper res2 = res.getSubMapper(0, col);
   Index row;
-  float *result2 = result + col*rows;
-  for(row = 0; row + 8 <= rows; row += 8, result2 += 8){
+  float* result2 = result + col * rows;
+  for (row = 0; row + 8 <= rows; row += 8, result2 += 8) {
     // get and save block
-    PacketBlock<Packet8bf,size> block;
+    PacketBlock<Packet8bf, size> block;
     BFLOAT16_UNROLL
-    for(Index j = 0; j < size; j++){
-      block.packet[j] = convertF32toBF16(result2 + j*rows);
+    for (Index j = 0; j < size; j++) {
+      block.packet[j] = convertF32toBF16(result2 + j * rows);
     }
-    res2.template storePacketBlock<Packet8bf,size>(row, 0, block);
+    res2.template storePacketBlock<Packet8bf, size>(row, 0, block);
   }
   // extra rows
-  if(row < rows){
+  if (row < rows) {
     BFLOAT16_UNROLL
-    for(Index j = 0; j < size; j++){
-      Packet8bf fp16 = convertF32toBF16(result2 + j*rows);
+    for (Index j = 0; j < size; j++) {
+      Packet8bf fp16 = convertF32toBF16(result2 + j * rows);
       res2.template storePacketPartial<Packet8bf>(row, j, fp16, rows & 7);
     }
   }
 }
 
-template<const Index size, bool non_unit_stride = false>
-EIGEN_ALWAYS_INLINE void convertPointerF32toBF16(Index& i, float* result, Index rows, bfloat16*& dst, Index resInc = 1)
-{
+template <const Index size, bool non_unit_stride = false>
+EIGEN_ALWAYS_INLINE void convertPointerF32toBF16(Index& i, float* result, Index rows, bfloat16*& dst,
+                                                 Index resInc = 1) {
   constexpr Index extra = ((size < 8) ? 8 : size);
-  while (i + size <= rows){
-    PacketBlock<Packet8bf,(size+7)/8> r32;
-    r32.packet[0] = convertF32toBF16(result + i +  0);
+  while (i + size <= rows) {
+    PacketBlock<Packet8bf, (size + 7) / 8> r32;
+    r32.packet[0] = convertF32toBF16(result + i + 0);
     if (size >= 16) {
-      r32.packet[1] = convertF32toBF16(result + i +  8);
+      r32.packet[1] = convertF32toBF16(result + i + 8);
     }
     if (size >= 32) {
       r32.packet[2] = convertF32toBF16(result + i + 16);
@@ -269,64 +272,64 @@
       storeBF16fromResult<size, non_unit_stride, 16>(dst, r32.packet[2], resInc);
       storeBF16fromResult<size, non_unit_stride, 24>(dst, r32.packet[3], resInc);
     }
-    i += extra; dst += extra*resInc;
+    i += extra;
+    dst += extra * resInc;
     if (size != 32) break;
   }
 }
 
-template<bool non_unit_stride = false>
-EIGEN_ALWAYS_INLINE void convertArrayPointerF32toBF16(float *result, Index rows, bfloat16* dst, Index resInc = 1)
-{
+template <bool non_unit_stride = false>
+EIGEN_ALWAYS_INLINE void convertArrayPointerF32toBF16(float* result, Index rows, bfloat16* dst, Index resInc = 1) {
   Index i = 0;
-  convertPointerF32toBF16<32,non_unit_stride>(i, result, rows, dst, resInc);
-  convertPointerF32toBF16<16,non_unit_stride>(i, result, rows, dst, resInc);
-  convertPointerF32toBF16<8,non_unit_stride>(i, result, rows, dst, resInc);
-  convertPointerF32toBF16<1,non_unit_stride>(i, result, rows, dst, resInc);
+  convertPointerF32toBF16<32, non_unit_stride>(i, result, rows, dst, resInc);
+  convertPointerF32toBF16<16, non_unit_stride>(i, result, rows, dst, resInc);
+  convertPointerF32toBF16<8, non_unit_stride>(i, result, rows, dst, resInc);
+  convertPointerF32toBF16<1, non_unit_stride>(i, result, rows, dst, resInc);
 }
 
-template<typename DataMapper>
-EIGEN_ALWAYS_INLINE void convertArrayF32toBF16(float *result, Index cols, Index rows, const DataMapper& res)
-{
+template <typename DataMapper>
+EIGEN_ALWAYS_INLINE void convertArrayF32toBF16(float* result, Index cols, Index rows, const DataMapper& res) {
   Index col;
-  for(col = 0; col + 4 <= cols; col += 4){
-    convertArrayF32toBF16Col<DataMapper,4>(result, col, rows, res);
+  for (col = 0; col + 4 <= cols; col += 4) {
+    convertArrayF32toBF16Col<DataMapper, 4>(result, col, rows, res);
   }
   // extra cols
   switch (cols - col) {
-  case 1:
-    convertArrayF32toBF16Col<DataMapper,1>(result, col, rows, res);
-    break;
-  case 2:
-    convertArrayF32toBF16Col<DataMapper,2>(result, col, rows, res);
-    break;
-  case 3:
-    convertArrayF32toBF16Col<DataMapper,3>(result, col, rows, res);
-    break;
+    case 1:
+      convertArrayF32toBF16Col<DataMapper, 1>(result, col, rows, res);
+      break;
+    case 2:
+      convertArrayF32toBF16Col<DataMapper, 2>(result, col, rows, res);
+      break;
+    case 3:
+      convertArrayF32toBF16Col<DataMapper, 3>(result, col, rows, res);
+      break;
   }
 }
 
-template<Index size>
-EIGEN_ALWAYS_INLINE void calcColLoops(const bfloat16*& indexA, Index& row, Index depth, Index cols, Index rows, const Packet4f pAlpha, const bfloat16* indexB, Index strideB, Index offsetA, Index offsetB, Index bigSuffix, float *result)
-{
+template <Index size>
+EIGEN_ALWAYS_INLINE void calcColLoops(const bfloat16*& indexA, Index& row, Index depth, Index cols, Index rows,
+                                      const Packet4f pAlpha, const bfloat16* indexB, Index strideB, Index offsetA,
+                                      Index offsetB, Index bigSuffix, float* result) {
   if ((size == 16) || (rows & size)) {
-    indexA += size*offsetA;
+    indexA += size * offsetA;
     colLoops<size>(depth, cols, rows, pAlpha, indexA, indexB, strideB, offsetB, result + row);
     row += size;
-    indexA += bigSuffix*size/16;
+    indexA += bigSuffix * size / 16;
   }
 }
 
-template<typename DataMapper>
-void gemmMMAbfloat16(const DataMapper& res, const bfloat16* indexA, const bfloat16* indexB, Index rows, Index depth, Index cols, bfloat16 alpha, Index strideA, Index strideB, Index offsetA, Index offsetB)
-{
+template <typename DataMapper>
+void gemmMMAbfloat16(const DataMapper& res, const bfloat16* indexA, const bfloat16* indexB, Index rows, Index depth,
+                     Index cols, bfloat16 alpha, Index strideA, Index strideB, Index offsetA, Index offsetB) {
   float falpha = Eigen::bfloat16_impl::bfloat16_to_float(alpha);
   const Packet4f pAlpha = pset1<Packet4f>(falpha);
-  ei_declare_aligned_stack_constructed_variable(float, result, cols*rows, 0);
+  ei_declare_aligned_stack_constructed_variable(float, result, cols* rows, 0);
 
   convertArrayBF16toF32<DataMapper>(result, cols, rows, res);
 
-  if( strideA == -1 ) strideA = depth;
-  if( strideB == -1 ) strideB = depth;
+  if (strideA == -1) strideA = depth;
+  if (strideB == -1) strideB = depth;
   // Packing is done in blocks.
   // There's 4 possible sizes of blocks
   // Blocks of 8 columns with 16 elements (8x16)
@@ -335,13 +338,13 @@
   // Blocks of 8 columns with < 4 elements. This happens when there's less than 4 remaining rows
 
   // Loop for LHS standard block (8x16)
-  Index bigSuffix = (2*8) * (strideA-offsetA);
-  indexB += 4*offsetB;
+  Index bigSuffix = (2 * 8) * (strideA - offsetA);
+  indexB += 4 * offsetB;
   strideB *= 4;
   offsetB *= 3;
 
   Index row = 0;
-  while(row + 16 <= rows){
+  while (row + 16 <= rows) {
     calcColLoops<16>(indexA, row, depth, cols, rows, pAlpha, indexB, strideB, offsetA, offsetB, bigSuffix, result);
   }
   // LHS (8x8) block
@@ -349,7 +352,7 @@
   // LHS (8x4) block
   calcColLoops<4>(indexA, row, depth, cols, rows, pAlpha, indexB, strideB, offsetA, offsetB, bigSuffix, result);
   // extra rows
-  if(rows & 3){
+  if (rows & 3) {
     // This index is the beginning of remaining block.
     colLoops<4, true>(depth, cols, rows, pAlpha, indexA, indexB, strideB, offsetB, result + row);
   }
@@ -361,12 +364,11 @@
 #undef MAX_BFLOAT16_ACC
 
 #if !EIGEN_ALTIVEC_DISABLE_MMA
-template<Index num_acc, typename LhsMapper, bool zero>
-EIGEN_ALWAYS_INLINE void loadVecLoop(Index k, LhsMapper& lhs, Packet8bf (&a0)[num_acc], Packet8bf b1)
-{
-  a0[k + 0] = lhs.template loadPacket<Packet8bf>(k*4, 0);
+template <Index num_acc, typename LhsMapper, bool zero>
+EIGEN_ALWAYS_INLINE void loadVecLoop(Index k, LhsMapper& lhs, Packet8bf (&a0)[num_acc], Packet8bf b1) {
+  a0[k + 0] = lhs.template loadPacket<Packet8bf>(k * 4, 0);
   if (!zero) {
-    b1 = lhs.template loadPacket<Packet8bf>(k*4, 1);
+    b1 = lhs.template loadPacket<Packet8bf>(k * 4, 1);
   }
   if (num_acc > (k + 1)) {
     a0[k + 1] = vec_mergel(a0[k + 0].m_val, b1.m_val);
@@ -374,18 +376,17 @@
   a0[k + 0] = vec_mergeh(a0[k + 0].m_val, b1.m_val);
 }
 
-template<Index num_acc>
-EIGEN_ALWAYS_INLINE void multVec(__vector_quad (&quad_acc)[num_acc], Packet8bf (&a0)[num_acc], Packet8bf b0)
-{
+template <Index num_acc>
+EIGEN_ALWAYS_INLINE void multVec(__vector_quad (&quad_acc)[num_acc], Packet8bf (&a0)[num_acc], Packet8bf b0) {
   BFLOAT16_UNROLL
-  for(Index k = 0; k < num_acc; k++) {
-    __builtin_mma_xvbf16ger2pp(&(quad_acc[k]), reinterpret_cast<Packet16uc>(b0.m_val), reinterpret_cast<Packet16uc>(a0[k].m_val));
+  for (Index k = 0; k < num_acc; k++) {
+    __builtin_mma_xvbf16ger2pp(&(quad_acc[k]), reinterpret_cast<Packet16uc>(b0.m_val),
+                               reinterpret_cast<Packet16uc>(a0[k].m_val));
   }
 }
 
-template<Index num_acc, typename LhsMapper, typename RhsMapper, bool zero, bool linear>
-EIGEN_ALWAYS_INLINE void vecColLoop(Index j, LhsMapper& lhs, RhsMapper& rhs, __vector_quad (&quad_acc)[num_acc])
-{
+template <Index num_acc, typename LhsMapper, typename RhsMapper, bool zero, bool linear>
+EIGEN_ALWAYS_INLINE void vecColLoop(Index j, LhsMapper& lhs, RhsMapper& rhs, __vector_quad (&quad_acc)[num_acc]) {
   Packet8bf a0[num_acc];
   Packet8bf b1 = pset1<Packet8bf>(Eigen::bfloat16(0));
   Packet8bf b0 = loadColData<RhsMapper, linear>(rhs, j);
@@ -398,23 +399,23 @@
 
   LhsSubMapper lhs2 = lhs.getSubMapper(0, j);
   BFLOAT16_UNROLL
-  for(Index k = 0; k < num_acc; k += 2) {
+  for (Index k = 0; k < num_acc; k += 2) {
     loadVecLoop<num_acc, LhsSubMapper, zero>(k, lhs2, a0, b1);
   }
 
   multVec<num_acc>(quad_acc, a0, b0);
 }
 
-#define MAX_BFLOAT16_VEC_ACC   8
+#define MAX_BFLOAT16_VEC_ACC 8
 
-template<const Index num_acc, typename LhsMapper, typename RhsMapper, bool extraRows, bool linear>
-void colVecColLoopBody(Index& row, Index cend, Index rows, LhsMapper& lhs, RhsMapper& rhs, const Packet4f pAlpha, float *result)
-{
+template <const Index num_acc, typename LhsMapper, typename RhsMapper, bool extraRows, bool linear>
+void colVecColLoopBody(Index& row, Index cend, Index rows, LhsMapper& lhs, RhsMapper& rhs, const Packet4f pAlpha,
+                       float* result) {
   constexpr Index step = (num_acc * 4);
   const Index extra_rows = (extraRows) ? (rows & 3) : 0;
   constexpr bool multiIters = !extraRows && (num_acc == MAX_BFLOAT16_VEC_ACC);
 
-  do{
+  do {
     Packet4f acc[num_acc][4];
     __vector_quad quad_acc[num_acc];
 
@@ -423,7 +424,7 @@
     using LhsSubMapper = typename LhsMapper::SubMapper;
 
     LhsSubMapper lhs2 = lhs.getSubMapper(row, 0);
-    for(Index j = 0; j + 2 <= cend; j += 2) {
+    for (Index j = 0; j + 2 <= cend; j += 2) {
       vecColLoop<num_acc, LhsSubMapper, RhsMapper, false, linear>(j, lhs2, rhs, quad_acc);
     }
     if (cend & 1) {
@@ -435,56 +436,58 @@
     outputVecColResults<num_acc, extraRows>(acc, result, pAlpha, extra_rows);
 
     result += step;
-  } while(multiIters && (step <= rows - (row += step)));
+  } while (multiIters && (step <= rows - (row += step)));
 }
 
-template<const Index num_acc, typename LhsMapper, typename RhsMapper, bool extraRows, bool linear>
-EIGEN_ALWAYS_INLINE void colVecColLoopBodyExtraN(Index& row, Index cend, Index rows, LhsMapper& lhs, RhsMapper& rhs, const Packet4f pAlpha, float *result)
-{
+template <const Index num_acc, typename LhsMapper, typename RhsMapper, bool extraRows, bool linear>
+EIGEN_ALWAYS_INLINE void colVecColLoopBodyExtraN(Index& row, Index cend, Index rows, LhsMapper& lhs, RhsMapper& rhs,
+                                                 const Packet4f pAlpha, float* result) {
   if (MAX_BFLOAT16_VEC_ACC > num_acc) {
-    colVecColLoopBody<num_acc + (extraRows ? 1 : 0), LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
+    colVecColLoopBody<num_acc + (extraRows ? 1 : 0), LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs,
+                                                                                              pAlpha, result);
   }
 }
 
-template<typename LhsMapper, typename RhsMapper, bool extraRows, bool linear>
-EIGEN_ALWAYS_INLINE void colVecColLoopBodyExtra(Index& row, Index cend, Index rows, LhsMapper& lhs, RhsMapper& rhs, const Packet4f pAlpha, float *result)
-{
+template <typename LhsMapper, typename RhsMapper, bool extraRows, bool linear>
+EIGEN_ALWAYS_INLINE void colVecColLoopBodyExtra(Index& row, Index cend, Index rows, LhsMapper& lhs, RhsMapper& rhs,
+                                                const Packet4f pAlpha, float* result) {
   switch ((rows - row) >> 2) {
-  case 7:
-    colVecColLoopBodyExtraN<7, LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
-    break;
-  case 6:
-    colVecColLoopBodyExtraN<6, LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
-    break;
-  case 5:
-    colVecColLoopBodyExtraN<5, LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
-    break;
-  case 4:
-    colVecColLoopBodyExtraN<4, LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
-    break;
-  case 3:
-    colVecColLoopBodyExtraN<3, LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
-    break;
-  case 2:
-    colVecColLoopBodyExtraN<2, LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
-    break;
-  case 1:
-    colVecColLoopBodyExtraN<1, LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
-    break;
-  default:
-    if (extraRows) {
-      colVecColLoopBody<1, LhsMapper, RhsMapper, true, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
-    }
-    break;
+    case 7:
+      colVecColLoopBodyExtraN<7, LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
+      break;
+    case 6:
+      colVecColLoopBodyExtraN<6, LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
+      break;
+    case 5:
+      colVecColLoopBodyExtraN<5, LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
+      break;
+    case 4:
+      colVecColLoopBodyExtraN<4, LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
+      break;
+    case 3:
+      colVecColLoopBodyExtraN<3, LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
+      break;
+    case 2:
+      colVecColLoopBodyExtraN<2, LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
+      break;
+    case 1:
+      colVecColLoopBodyExtraN<1, LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
+      break;
+    default:
+      if (extraRows) {
+        colVecColLoopBody<1, LhsMapper, RhsMapper, true, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
+      }
+      break;
   }
 }
 
-template<typename LhsMapper, typename RhsMapper, bool linear>
-EIGEN_ALWAYS_INLINE void calcVecColLoops(Index cend, Index rows, LhsMapper& lhs, RhsMapper& rhs, const Packet4f pAlpha, float *result)
-{
+template <typename LhsMapper, typename RhsMapper, bool linear>
+EIGEN_ALWAYS_INLINE void calcVecColLoops(Index cend, Index rows, LhsMapper& lhs, RhsMapper& rhs, const Packet4f pAlpha,
+                                         float* result) {
   Index row = 0;
   if (rows >= (MAX_BFLOAT16_VEC_ACC * 4)) {
-    colVecColLoopBody<MAX_BFLOAT16_VEC_ACC, LhsMapper, RhsMapper, false, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
+    colVecColLoopBody<MAX_BFLOAT16_VEC_ACC, LhsMapper, RhsMapper, false, linear>(row, cend, rows, lhs, rhs, pAlpha,
+                                                                                 result);
     result += row;
   }
   if (rows & 3) {
@@ -494,10 +497,10 @@
   }
 }
 
-template<typename RhsMapper, typename LhsMapper, typename = void>
+template <typename RhsMapper, typename LhsMapper, typename = void>
 struct UseMMAStride : std::false_type {
-  static EIGEN_ALWAYS_INLINE void run(Index j2, Index jend, Index rows, LhsMapper& lhs, RhsMapper& rhs, Packet4f pAlpha, float *result)
-  {
+  static EIGEN_ALWAYS_INLINE void run(Index j2, Index jend, Index rows, LhsMapper& lhs, RhsMapper& rhs, Packet4f pAlpha,
+                                      float* result) {
     using RhsSubMapper = typename RhsMapper::SubMapper;
 
     RhsSubMapper rhs2 = rhs.getSubMapper(j2, 0);
@@ -505,11 +508,12 @@
   }
 };
 
-template<typename RhsMapper, typename LhsMapper>
-struct UseMMAStride<RhsMapper, LhsMapper, std::enable_if_t<std::is_member_function_pointer<
-                           decltype(&RhsMapper::stride)>::value>> : std::true_type {
-  static EIGEN_ALWAYS_INLINE void run(Index j2, Index jend, Index rows, LhsMapper& lhs, RhsMapper& rhs, Packet4f pAlpha, float *result)
-  {
+template <typename RhsMapper, typename LhsMapper>
+struct UseMMAStride<RhsMapper, LhsMapper,
+                    std::enable_if_t<std::is_member_function_pointer<decltype(&RhsMapper::stride)>::value>>
+    : std::true_type {
+  static EIGEN_ALWAYS_INLINE void run(Index j2, Index jend, Index rows, LhsMapper& lhs, RhsMapper& rhs, Packet4f pAlpha,
+                                      float* result) {
     using RhsSubMapper = typename RhsMapper::SubMapper;
 
     RhsSubMapper rhs2 = rhs.getSubMapper(j2, 0);
@@ -521,14 +525,9 @@
   }
 };
 
-template<typename LhsMapper, typename RhsMapper>
-void gemvMMA_bfloat16_col(
-  Index rows, Index cols,
-  const LhsMapper& alhs,
-  const RhsMapper& rhs,
-  bfloat16* res, Index resIncr,
-  bfloat16 alpha)
-{
+template <typename LhsMapper, typename RhsMapper>
+void gemvMMA_bfloat16_col(Index rows, Index cols, const LhsMapper& alhs, const RhsMapper& rhs, bfloat16* res,
+                          Index resIncr, bfloat16 alpha) {
   EIGEN_UNUSED_VARIABLE(resIncr);
   eigen_internal_assert(resIncr == 1);
 
@@ -548,8 +547,7 @@
 
   convertArrayPointerBF16toF32(result, 1, rows, res);
 
-  for (Index j2 = 0; j2 < cols; j2 += block_cols)
-  {
+  for (Index j2 = 0; j2 < cols; j2 += block_cols) {
     Index jend = numext::mini(j2 + block_cols, cols);
 
     using LhsSubMapper = typename LhsMapper::SubMapper;
@@ -561,11 +559,11 @@
   convertArrayPointerF32toBF16(result, rows, res);
 }
 
-static Packet16uc p16uc_ELEMENT_VEC3 = { 0x0c,0x0d,0x0e,0x0f, 0x1c,0x1d,0x1e,0x1f, 0x0c,0x0d,0x0e,0x0f, 0x1c,0x1d,0x1e,0x1f };
+static Packet16uc p16uc_ELEMENT_VEC3 = {0x0c, 0x0d, 0x0e, 0x0f, 0x1c, 0x1d, 0x1e, 0x1f,
+                                        0x0c, 0x0d, 0x0e, 0x0f, 0x1c, 0x1d, 0x1e, 0x1f};
 
-template<Index num_acc>
-EIGEN_ALWAYS_INLINE void preduxVecResults2(Packet4f (&acc)[num_acc][4], Index k)
-{
+template <Index num_acc>
+EIGEN_ALWAYS_INLINE void preduxVecResults2(Packet4f (&acc)[num_acc][4], Index k) {
   if (num_acc > (k + 1)) {
     acc[k][0] = vec_mergeh(acc[k][0], acc[k + 1][0]);
     acc[k][1] = vec_mergeo(acc[k][1], acc[k + 1][1]);
@@ -584,22 +582,22 @@
   }
 }
 
-template<Index num_acc>
-EIGEN_ALWAYS_INLINE void preduxVecResults(Packet4f (&acc)[num_acc][4])
-{
+template <Index num_acc>
+EIGEN_ALWAYS_INLINE void preduxVecResults(Packet4f (&acc)[num_acc][4]) {
   BFLOAT16_UNROLL
-  for(Index k = 0; k < num_acc; k += 4) {
+  for (Index k = 0; k < num_acc; k += 4) {
     preduxVecResults2<num_acc>(acc, k + 0);
     if (num_acc > (k + 2)) {
       preduxVecResults2<num_acc>(acc, k + 2);
-      acc[k + 0][0] = reinterpret_cast<Packet4f>(vec_mergeh(reinterpret_cast<Packet2ul>(acc[k + 0][0]), reinterpret_cast<Packet2ul>(acc[k + 2][0])));
+      acc[k + 0][0] = reinterpret_cast<Packet4f>(
+          vec_mergeh(reinterpret_cast<Packet2ul>(acc[k + 0][0]), reinterpret_cast<Packet2ul>(acc[k + 2][0])));
     }
   }
 }
 
-template<Index num_acc, typename LhsMapper, typename RhsMapper, bool extra>
-EIGEN_ALWAYS_INLINE void multVecLoop(__vector_quad (&quad_acc)[num_acc], const LhsMapper& lhs, RhsMapper& rhs, Index j, Index extra_cols)
-{
+template <Index num_acc, typename LhsMapper, typename RhsMapper, bool extra>
+EIGEN_ALWAYS_INLINE void multVecLoop(__vector_quad (&quad_acc)[num_acc], const LhsMapper& lhs, RhsMapper& rhs, Index j,
+                                     Index extra_cols) {
   Packet8bf a0[num_acc], b0;
 
   if (extra) {
@@ -610,7 +608,7 @@
 
   const LhsMapper lhs2 = lhs.getSubMapper(0, j);
   BFLOAT16_UNROLL
-  for(Index k = 0; k < num_acc; k++) {
+  for (Index k = 0; k < num_acc; k++) {
     if (extra) {
       a0[k] = lhs2.template loadPacketPartial<Packet8bf>(k, 0, extra_cols);
     } else {
@@ -621,11 +619,11 @@
   multVec<num_acc>(quad_acc, a0, b0);
 }
 
-template<Index num_acc, typename LhsMapper, typename RhsMapper>
-EIGEN_ALWAYS_INLINE void vecLoop(Index cols, const LhsMapper& lhs, RhsMapper& rhs, __vector_quad (&quad_acc)[num_acc], Index extra_cols)
-{
+template <Index num_acc, typename LhsMapper, typename RhsMapper>
+EIGEN_ALWAYS_INLINE void vecLoop(Index cols, const LhsMapper& lhs, RhsMapper& rhs, __vector_quad (&quad_acc)[num_acc],
+                                 Index extra_cols) {
   Index j = 0;
-  for(; j + 8 <= cols; j += 8){
+  for (; j + 8 <= cols; j += 8) {
     multVecLoop<num_acc, LhsMapper, RhsMapper, false>(quad_acc, lhs, rhs, j, extra_cols);
   }
 
@@ -634,13 +632,13 @@
   }
 }
 
-template<const Index num_acc, typename LhsMapper, typename RhsMapper>
-void colVecLoopBody(Index& row, Index cols, Index rows, LhsMapper& lhs, RhsMapper& rhs, const Packet4f pAlpha, float *result)
-{
+template <const Index num_acc, typename LhsMapper, typename RhsMapper>
+void colVecLoopBody(Index& row, Index cols, Index rows, LhsMapper& lhs, RhsMapper& rhs, const Packet4f pAlpha,
+                    float* result) {
   constexpr bool multiIters = (num_acc == MAX_BFLOAT16_VEC_ACC);
   const Index extra_cols = (cols & 7);
 
-  do{
+  do {
     Packet4f acc[num_acc][4];
     __vector_quad quad_acc[num_acc];
 
@@ -656,48 +654,48 @@
     outputVecResults<num_acc>(acc, result, pAlpha);
 
     result += num_acc;
-  } while(multiIters && (num_acc <= rows - (row += num_acc)));
+  } while (multiIters && (num_acc <= rows - (row += num_acc)));
 }
 
-template<const Index num_acc, typename LhsMapper, typename RhsMapper>
-EIGEN_ALWAYS_INLINE void colVecLoopBodyExtraN(Index& row, Index cols, Index rows, LhsMapper& lhs, RhsMapper& rhs, const Packet4f pAlpha, float *result)
-{
+template <const Index num_acc, typename LhsMapper, typename RhsMapper>
+EIGEN_ALWAYS_INLINE void colVecLoopBodyExtraN(Index& row, Index cols, Index rows, LhsMapper& lhs, RhsMapper& rhs,
+                                              const Packet4f pAlpha, float* result) {
   if (MAX_BFLOAT16_VEC_ACC > num_acc) {
     colVecLoopBody<num_acc, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
   }
 }
 
-template<typename LhsMapper, typename RhsMapper>
-EIGEN_ALWAYS_INLINE void colVecLoopBodyExtra(Index& row, Index cols, Index rows, LhsMapper& lhs, RhsMapper& rhs, const Packet4f pAlpha, float *result)
-{
+template <typename LhsMapper, typename RhsMapper>
+EIGEN_ALWAYS_INLINE void colVecLoopBodyExtra(Index& row, Index cols, Index rows, LhsMapper& lhs, RhsMapper& rhs,
+                                             const Packet4f pAlpha, float* result) {
   switch (rows - row) {
-  case 7:
-    colVecLoopBodyExtraN<7, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
-    break;
-  case 6:
-    colVecLoopBodyExtraN<6, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
-    break;
-  case 5:
-    colVecLoopBodyExtraN<5, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
-    break;
-  case 4:
-    colVecLoopBodyExtraN<4, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
-    break;
-  case 3:
-    colVecLoopBodyExtraN<3, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
-    break;
-  case 2:
-    colVecLoopBodyExtraN<2, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
-    break;
-  case 1:
-    colVecLoopBodyExtraN<1, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
-    break;
+    case 7:
+      colVecLoopBodyExtraN<7, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
+      break;
+    case 6:
+      colVecLoopBodyExtraN<6, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
+      break;
+    case 5:
+      colVecLoopBodyExtraN<5, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
+      break;
+    case 4:
+      colVecLoopBodyExtraN<4, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
+      break;
+    case 3:
+      colVecLoopBodyExtraN<3, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
+      break;
+    case 2:
+      colVecLoopBodyExtraN<2, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
+      break;
+    case 1:
+      colVecLoopBodyExtraN<1, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
+      break;
   }
 }
 
-template<typename LhsMapper, typename RhsMapper>
-EIGEN_ALWAYS_INLINE void calcVecLoops(Index cols, Index rows, LhsMapper& lhs, RhsMapper& rhs, const Packet4f pAlpha, float *result)
-{
+template <typename LhsMapper, typename RhsMapper>
+EIGEN_ALWAYS_INLINE void calcVecLoops(Index cols, Index rows, LhsMapper& lhs, RhsMapper& rhs, const Packet4f pAlpha,
+                                      float* result) {
   Index row = 0;
   if (rows >= MAX_BFLOAT16_VEC_ACC) {
     colVecLoopBody<MAX_BFLOAT16_VEC_ACC, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
@@ -706,14 +704,9 @@
   colVecLoopBodyExtra<LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
 }
 
-template<typename LhsMapper, typename RhsMapper>
-EIGEN_STRONG_INLINE void gemvMMA_bfloat16_row(
-  Index rows, Index cols,
-  const LhsMapper& alhs,
-  const RhsMapper& rhs,
-  bfloat16* res, Index resIncr,
-  bfloat16 alpha)
-{
+template <typename LhsMapper, typename RhsMapper>
+EIGEN_STRONG_INLINE void gemvMMA_bfloat16_row(Index rows, Index cols, const LhsMapper& alhs, const RhsMapper& rhs,
+                                              bfloat16* res, Index resIncr, bfloat16 alpha) {
   typedef typename RhsMapper::LinearMapper LinearMapper;
 
   // The following copy tells the compiler that lhs's attributes are not modified outside this function
@@ -744,6 +737,6 @@
 #undef MAX_BFLOAT16_VEC_ACC
 #undef BFLOAT16_UNROLL
 
-}
-}
-#endif //EIGEN_MATRIX_PRODUCT_MMA_BFLOAT16_ALTIVEC_H
+}  // namespace internal
+}  // namespace Eigen
+#endif  // EIGEN_MATRIX_PRODUCT_MMA_BFLOAT16_ALTIVEC_H
diff --git a/Eigen/src/Core/arch/AltiVec/MatrixVectorProduct.h b/Eigen/src/Core/arch/AltiVec/MatrixVectorProduct.h
index 66e1088..90c0d39 100644
--- a/Eigen/src/Core/arch/AltiVec/MatrixVectorProduct.h
+++ b/Eigen/src/Core/arch/AltiVec/MatrixVectorProduct.h
@@ -24,11 +24,12 @@
 #endif
 #endif
 
-//#define USE_SLOWER_GEMV_MMA   // MMA is currently not as fast as VSX in complex double GEMV (revisit when gcc is improved)
+// #define USE_SLOWER_GEMV_MMA   // MMA is currently not as fast as VSX in complex double GEMV (revisit when gcc is
+// improved)
 
-//#define EIGEN_POWER_USE_GEMV_PREFETCH
+// #define EIGEN_POWER_USE_GEMV_PREFETCH
 #ifdef EIGEN_POWER_USE_GEMV_PREFETCH
-#define EIGEN_POWER_GEMV_PREFETCH(p)  prefetch(p)
+#define EIGEN_POWER_GEMV_PREFETCH(p) prefetch(p)
 #else
 #define EIGEN_POWER_GEMV_PREFETCH(p)
 #endif
@@ -61,58 +62,50 @@
 #endif
 
 #define GEMV_IS_COMPLEX_COMPLEX ((sizeof(LhsPacket) == 16) && (sizeof(RhsPacket) == 16))
-#define GEMV_IS_FLOAT           (ResPacketSize == (16 / sizeof(float)))
-#define GEMV_IS_SCALAR          (sizeof(ResPacket) != 16)
-#define GEMV_IS_COMPLEX_FLOAT   (ResPacketSize == (16 / sizeof(std::complex<float>)))
+#define GEMV_IS_FLOAT (ResPacketSize == (16 / sizeof(float)))
+#define GEMV_IS_SCALAR (sizeof(ResPacket) != 16)
+#define GEMV_IS_COMPLEX_FLOAT (ResPacketSize == (16 / sizeof(std::complex<float>)))
 
 /** \internal multiply and add and store results */
-template<typename ResPacket, typename ResScalar>
-EIGEN_ALWAYS_INLINE void storeMaddData(ResScalar* res, ResPacket& palpha, ResPacket& data)
-{
-    pstoreu(res, pmadd(data, palpha, ploadu<ResPacket>(res)));
+template <typename ResPacket, typename ResScalar>
+EIGEN_ALWAYS_INLINE void storeMaddData(ResScalar* res, ResPacket& palpha, ResPacket& data) {
+  pstoreu(res, pmadd(data, palpha, ploadu<ResPacket>(res)));
 }
 
-template<typename ResScalar>
-EIGEN_ALWAYS_INLINE void storeMaddData(ResScalar* res, ResScalar& alpha, ResScalar& data)
-{
-    *res += (alpha * data);
+template <typename ResScalar>
+EIGEN_ALWAYS_INLINE void storeMaddData(ResScalar* res, ResScalar& alpha, ResScalar& data) {
+  *res += (alpha * data);
 }
 
-#define GEMV_UNROLL(func, N) \
-  func(0, N) func(1, N) func(2, N) func(3, N) \
-  func(4, N) func(5, N) func(6, N) func(7, N)
+#define GEMV_UNROLL(func, N) func(0, N) func(1, N) func(2, N) func(3, N) func(4, N) func(5, N) func(6, N) func(7, N)
 
-#define GEMV_UNROLL_HALF(func, N) \
-  func(0, 0, 1, N) func(1, 2, 3, N) func(2, 4, 5, N) func(3, 6, 7, N)
+#define GEMV_UNROLL_HALF(func, N) func(0, 0, 1, N) func(1, 2, 3, N) func(2, 4, 5, N) func(3, 6, 7, N)
 
 #define GEMV_GETN(N) (((N) * ResPacketSize) >> 2)
 
-#define GEMV_LOADPACKET_COL(iter) \
-  lhs.template load<LhsPacket, LhsAlignment>(i + ((iter) * LhsPacketSize), j)
+#define GEMV_LOADPACKET_COL(iter) lhs.template load<LhsPacket, LhsAlignment>(i + ((iter) * LhsPacketSize), j)
 
 #ifdef USE_GEMV_MMA
-#define GEMV_UNROLL3(func, N, which) \
-  func(0, N, which) func(1, N, which) func(2, N, which) func(3, N, which) \
-  func(4, N, which) func(5, N, which) func(6, N, which) func(7, N, which)
+#define GEMV_UNROLL3(func, N, which)                                                                          \
+  func(0, N, which) func(1, N, which) func(2, N, which) func(3, N, which) func(4, N, which) func(5, N, which) \
+      func(6, N, which) func(7, N, which)
 
 #define GEMV_UNUSED_VAR(iter, N, which) \
-  if (GEMV_GETN(N) <= iter) { \
+  if (GEMV_GETN(N) <= iter) {           \
     EIGEN_UNUSED_VARIABLE(which##iter); \
   }
 
 #define GEMV_UNUSED_EXTRA_VAR(iter, N, which) \
-  if (N <= iter) { \
-    EIGEN_UNUSED_VARIABLE(which##iter); \
+  if (N <= iter) {                            \
+    EIGEN_UNUSED_VARIABLE(which##iter);       \
   }
 
-#define GEMV_UNUSED_EXTRA(N, which) \
-  GEMV_UNROLL3(GEMV_UNUSED_EXTRA_VAR, N, which)
+#define GEMV_UNUSED_EXTRA(N, which) GEMV_UNROLL3(GEMV_UNUSED_EXTRA_VAR, N, which)
 
-#define GEMV_UNUSED(N, which) \
-  GEMV_UNROLL3(GEMV_UNUSED_VAR, N, which)
+#define GEMV_UNUSED(N, which) GEMV_UNROLL3(GEMV_UNUSED_VAR, N, which)
 
-#define GEMV_INIT_MMA(iter, N) \
-  if (GEMV_GETN(N) > iter) { \
+#define GEMV_INIT_MMA(iter, N)         \
+  if (GEMV_GETN(N) > iter) {           \
     __builtin_mma_xxsetaccz(&e##iter); \
   }
 
@@ -120,354 +113,336 @@
 #define GEMV_LOADPAIR_COL_MMA(iter1, iter2) \
   GEMV_BUILDPAIR_MMA(b##iter1, GEMV_LOADPACKET_COL(iter2), GEMV_LOADPACKET_COL((iter2) + 1));
 #else
-#define GEMV_LOADPAIR_COL_MMA(iter1, iter2) \
+#define GEMV_LOADPAIR_COL_MMA(iter1, iter2)                                     \
   const LhsScalar& src##iter1 = lhs(i + ((iter1 * 32) / sizeof(LhsScalar)), j); \
-  b##iter1 = *reinterpret_cast<__vector_pair *>(const_cast<LhsScalar *>(&src##iter1));
+  b##iter1 = *reinterpret_cast<__vector_pair*>(const_cast<LhsScalar*>(&src##iter1));
 #endif
 
-#define GEMV_LOAD1A_COL_MMA(iter, N) \
-  if (GEMV_GETN(N) > iter) { \
-    if (GEMV_IS_FLOAT) { \
-      g##iter = GEMV_LOADPACKET_COL(iter); \
-      EIGEN_UNUSED_VARIABLE(b##iter); \
-    } else { \
+#define GEMV_LOAD1A_COL_MMA(iter, N)         \
+  if (GEMV_GETN(N) > iter) {                 \
+    if (GEMV_IS_FLOAT) {                     \
+      g##iter = GEMV_LOADPACKET_COL(iter);   \
+      EIGEN_UNUSED_VARIABLE(b##iter);        \
+    } else {                                 \
       GEMV_LOADPAIR_COL_MMA(iter, iter << 1) \
-      EIGEN_UNUSED_VARIABLE(g##iter); \
-    } \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(b##iter); \
-    EIGEN_UNUSED_VARIABLE(g##iter); \
+      EIGEN_UNUSED_VARIABLE(g##iter);        \
+    }                                        \
+  } else {                                   \
+    EIGEN_UNUSED_VARIABLE(b##iter);          \
+    EIGEN_UNUSED_VARIABLE(g##iter);          \
   }
 
-#define GEMV_WORK1A_COL_MMA(iter, N) \
-  if (GEMV_GETN(N) > iter) { \
-    if (GEMV_IS_FLOAT) { \
+#define GEMV_WORK1A_COL_MMA(iter, N)                                      \
+  if (GEMV_GETN(N) > iter) {                                              \
+    if (GEMV_IS_FLOAT) {                                                  \
       pger_vecMMA_acc<LhsPacket, RhsPacket, true>(&e##iter, a0, g##iter); \
-    } else { \
+    } else {                                                              \
       pger_vecMMA_acc<LhsPacket, RhsPacket, true>(&e##iter, b##iter, a0); \
-    } \
+    }                                                                     \
   }
 
 #define GEMV_LOAD1B_COL_MMA(iter1, iter2, iter3, N) \
-  if (GEMV_GETN(N) > iter1) { \
-    if (GEMV_IS_FLOAT) { \
-      GEMV_LOADPAIR_COL_MMA(iter2, iter2) \
-      EIGEN_UNUSED_VARIABLE(b##iter3); \
-    } else { \
-      GEMV_LOADPAIR_COL_MMA(iter2, iter2 << 1) \
-      GEMV_LOADPAIR_COL_MMA(iter3, iter3 << 1) \
-    } \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(b##iter2); \
-    EIGEN_UNUSED_VARIABLE(b##iter3); \
-  } \
-  EIGEN_UNUSED_VARIABLE(g##iter2); \
+  if (GEMV_GETN(N) > iter1) {                       \
+    if (GEMV_IS_FLOAT) {                            \
+      GEMV_LOADPAIR_COL_MMA(iter2, iter2)           \
+      EIGEN_UNUSED_VARIABLE(b##iter3);              \
+    } else {                                        \
+      GEMV_LOADPAIR_COL_MMA(iter2, iter2 << 1)      \
+      GEMV_LOADPAIR_COL_MMA(iter3, iter3 << 1)      \
+    }                                               \
+  } else {                                          \
+    EIGEN_UNUSED_VARIABLE(b##iter2);                \
+    EIGEN_UNUSED_VARIABLE(b##iter3);                \
+  }                                                 \
+  EIGEN_UNUSED_VARIABLE(g##iter2);                  \
   EIGEN_UNUSED_VARIABLE(g##iter3);
 
-#define GEMV_WORK1B_COL_MMA(iter1, iter2, iter3, N) \
-  if (GEMV_GETN(N) > iter1) { \
-    if (GEMV_IS_FLOAT) { \
-      LhsPacket h[2]; \
+#define GEMV_WORK1B_COL_MMA(iter1, iter2, iter3, N)                          \
+  if (GEMV_GETN(N) > iter1) {                                                \
+    if (GEMV_IS_FLOAT) {                                                     \
+      LhsPacket h[2];                                                        \
       __builtin_vsx_disassemble_pair(reinterpret_cast<void*>(h), &b##iter2); \
-      pger_vecMMA_acc<LhsPacket, RhsPacket, true>(&e##iter2, a0, h[0]); \
-      pger_vecMMA_acc<LhsPacket, RhsPacket, true>(&e##iter3, a0, h[1]); \
-    } else { \
-      pger_vecMMA_acc<LhsPacket, RhsPacket, true>(&e##iter2, b##iter2, a0); \
-      pger_vecMMA_acc<LhsPacket, RhsPacket, true>(&e##iter3, b##iter3, a0); \
-    } \
+      pger_vecMMA_acc<LhsPacket, RhsPacket, true>(&e##iter2, a0, h[0]);      \
+      pger_vecMMA_acc<LhsPacket, RhsPacket, true>(&e##iter3, a0, h[1]);      \
+    } else {                                                                 \
+      pger_vecMMA_acc<LhsPacket, RhsPacket, true>(&e##iter2, b##iter2, a0);  \
+      pger_vecMMA_acc<LhsPacket, RhsPacket, true>(&e##iter3, b##iter3, a0);  \
+    }                                                                        \
   }
 
 #if EIGEN_COMP_LLVM
-#define GEMV_LOAD_COL_MMA(N) \
-  if (GEMV_GETN(N) > 1) { \
+#define GEMV_LOAD_COL_MMA(N)                        \
+  if (GEMV_GETN(N) > 1) {                           \
     GEMV_UNROLL_HALF(GEMV_LOAD1B_COL_MMA, (N >> 1)) \
-  } else { \
-    GEMV_UNROLL(GEMV_LOAD1A_COL_MMA, N) \
+  } else {                                          \
+    GEMV_UNROLL(GEMV_LOAD1A_COL_MMA, N)             \
   }
 
-#define GEMV_WORK_COL_MMA(N) \
-  if (GEMV_GETN(N) > 1) { \
+#define GEMV_WORK_COL_MMA(N)                        \
+  if (GEMV_GETN(N) > 1) {                           \
     GEMV_UNROLL_HALF(GEMV_WORK1B_COL_MMA, (N >> 1)) \
-  } else { \
-    GEMV_UNROLL(GEMV_WORK1A_COL_MMA, N) \
+  } else {                                          \
+    GEMV_UNROLL(GEMV_WORK1A_COL_MMA, N)             \
   }
 #else
-#define GEMV_LOAD_COL_MMA(N) \
-  GEMV_UNROLL(GEMV_LOAD1A_COL_MMA, N)
+#define GEMV_LOAD_COL_MMA(N) GEMV_UNROLL(GEMV_LOAD1A_COL_MMA, N)
 
-#define GEMV_WORK_COL_MMA(N) \
-  GEMV_UNROLL(GEMV_WORK1A_COL_MMA, N)
+#define GEMV_WORK_COL_MMA(N) GEMV_UNROLL(GEMV_WORK1A_COL_MMA, N)
 #endif
 
-#define GEMV_DISASSEMBLE_MMA(iter, N) \
-  if (GEMV_GETN(N) > iter) { \
+#define GEMV_DISASSEMBLE_MMA(iter, N)                              \
+  if (GEMV_GETN(N) > iter) {                                       \
     __builtin_mma_disassemble_acc(&result##iter.packet, &e##iter); \
-    if (!GEMV_IS_FLOAT) { \
-      result##iter.packet[0][1] = result##iter.packet[1][0]; \
-      result##iter.packet[2][1] = result##iter.packet[3][0]; \
-    } \
+    if (!GEMV_IS_FLOAT) {                                          \
+      result##iter.packet[0][1] = result##iter.packet[1][0];       \
+      result##iter.packet[2][1] = result##iter.packet[3][0];       \
+    }                                                              \
   }
 
 #define GEMV_LOADPAIR2_COL_MMA(iter1, iter2) \
-  b##iter1 = *reinterpret_cast<__vector_pair *>(res + i + ((iter2) * ResPacketSize));
+  b##iter1 = *reinterpret_cast<__vector_pair*>(res + i + ((iter2) * ResPacketSize));
 
 #define GEMV_LOAD2_COL_MMA(iter1, iter2, iter3, N) \
-  if (GEMV_GETN(N) > iter1) { \
-    if (GEMV_IS_FLOAT) { \
-      GEMV_LOADPAIR2_COL_MMA(iter2, iter2); \
-      EIGEN_UNUSED_VARIABLE(b##iter3); \
-    } else { \
-      GEMV_LOADPAIR2_COL_MMA(iter2, iter2 << 1); \
-      GEMV_LOADPAIR2_COL_MMA(iter3, iter3 << 1); \
-    } \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(b##iter2); \
-    EIGEN_UNUSED_VARIABLE(b##iter3); \
+  if (GEMV_GETN(N) > iter1) {                      \
+    if (GEMV_IS_FLOAT) {                           \
+      GEMV_LOADPAIR2_COL_MMA(iter2, iter2);        \
+      EIGEN_UNUSED_VARIABLE(b##iter3);             \
+    } else {                                       \
+      GEMV_LOADPAIR2_COL_MMA(iter2, iter2 << 1);   \
+      GEMV_LOADPAIR2_COL_MMA(iter3, iter3 << 1);   \
+    }                                              \
+  } else {                                         \
+    EIGEN_UNUSED_VARIABLE(b##iter2);               \
+    EIGEN_UNUSED_VARIABLE(b##iter3);               \
   }
 
 #if EIGEN_COMP_LLVM
-#define GEMV_WORKPAIR2_COL_MMA(iter2, iter3, iter4) \
-  ResPacket f##iter2[2]; \
-  __builtin_vsx_disassemble_pair(reinterpret_cast<void*>(f##iter2), &b##iter2); \
-  f##iter2[0] = pmadd(result##iter2.packet[0], palpha, f##iter2[0]); \
+#define GEMV_WORKPAIR2_COL_MMA(iter2, iter3, iter4)                                         \
+  ResPacket f##iter2[2];                                                                    \
+  __builtin_vsx_disassemble_pair(reinterpret_cast<void*>(f##iter2), &b##iter2);             \
+  f##iter2[0] = pmadd(result##iter2.packet[0], palpha, f##iter2[0]);                        \
   f##iter2[1] = pmadd(result##iter3.packet[(iter2 == iter3) ? 2 : 0], palpha, f##iter2[1]); \
   GEMV_BUILDPAIR_MMA(b##iter2, f##iter2[0], f##iter2[1]);
 #else
-#define GEMV_WORKPAIR2_COL_MMA(iter2, iter3, iter4) \
-  if (GEMV_IS_FLOAT) { \
-    __asm__ ("xvmaddasp %0,%x1,%x3\n\txvmaddasp %L0,%x2,%x3" : "+&d" (b##iter2) : "wa" (result##iter3.packet[0]), "wa" (result##iter2.packet[0]), "wa" (palpha)); \
-  } else { \
-    __asm__ ("xvmaddadp %0,%x1,%x3\n\txvmaddadp %L0,%x2,%x3" : "+&d" (b##iter2) : "wa" (result##iter2.packet[2]), "wa" (result##iter2.packet[0]), "wa" (palpha)); \
+#define GEMV_WORKPAIR2_COL_MMA(iter2, iter3, iter4)                                        \
+  if (GEMV_IS_FLOAT) {                                                                     \
+    __asm__("xvmaddasp %0,%x1,%x3\n\txvmaddasp %L0,%x2,%x3"                                \
+            : "+&d"(b##iter2)                                                              \
+            : "wa"(result##iter3.packet[0]), "wa"(result##iter2.packet[0]), "wa"(palpha)); \
+  } else {                                                                                 \
+    __asm__("xvmaddadp %0,%x1,%x3\n\txvmaddadp %L0,%x2,%x3"                                \
+            : "+&d"(b##iter2)                                                              \
+            : "wa"(result##iter2.packet[2]), "wa"(result##iter2.packet[0]), "wa"(palpha)); \
   }
 #endif
 
-#define GEMV_WORK2_COL_MMA(iter1, iter2, iter3, N) \
-  if (GEMV_GETN(N) > iter1) { \
-    if (GEMV_IS_FLOAT) { \
-      GEMV_WORKPAIR2_COL_MMA(iter2, iter3, iter2); \
-    } else { \
+#define GEMV_WORK2_COL_MMA(iter1, iter2, iter3, N)      \
+  if (GEMV_GETN(N) > iter1) {                           \
+    if (GEMV_IS_FLOAT) {                                \
+      GEMV_WORKPAIR2_COL_MMA(iter2, iter3, iter2);      \
+    } else {                                            \
       GEMV_WORKPAIR2_COL_MMA(iter2, iter2, iter2 << 1); \
       GEMV_WORKPAIR2_COL_MMA(iter3, iter3, iter3 << 1); \
-    } \
+    }                                                   \
   }
 
 #define GEMV_STOREPAIR2_COL_MMA(iter1, iter2) \
-  *reinterpret_cast<__vector_pair *>(res + i + ((iter2) * ResPacketSize)) = b##iter1;
+  *reinterpret_cast<__vector_pair*>(res + i + ((iter2) * ResPacketSize)) = b##iter1;
 
-#define GEMV_STORE_COL_MMA(iter, N) \
-  if (GEMV_GETN(N) > iter) { \
-    if (GEMV_IS_FLOAT) { \
+#define GEMV_STORE_COL_MMA(iter, N)                                                                          \
+  if (GEMV_GETN(N) > iter) {                                                                                 \
+    if (GEMV_IS_FLOAT) {                                                                                     \
       storeMaddData<ResPacket, ResScalar>(res + i + (iter * ResPacketSize), palpha, result##iter.packet[0]); \
-    } else { \
-      GEMV_LOADPAIR2_COL_MMA(iter, iter << 1) \
-      GEMV_WORKPAIR2_COL_MMA(iter, iter, iter << 1) \
-      GEMV_STOREPAIR2_COL_MMA(iter, iter << 1) \
-    } \
+    } else {                                                                                                 \
+      GEMV_LOADPAIR2_COL_MMA(iter, iter << 1)                                                                \
+      GEMV_WORKPAIR2_COL_MMA(iter, iter, iter << 1)                                                          \
+      GEMV_STOREPAIR2_COL_MMA(iter, iter << 1)                                                               \
+    }                                                                                                        \
   }
 
 #define GEMV_STORE2_COL_MMA(iter1, iter2, iter3, N) \
-  if (GEMV_GETN(N) > iter1) { \
-    if (GEMV_IS_FLOAT) { \
-      GEMV_STOREPAIR2_COL_MMA(iter2, iter2); \
-    } else { \
-      GEMV_STOREPAIR2_COL_MMA(iter2, iter2 << 1) \
-      GEMV_STOREPAIR2_COL_MMA(iter3, iter3 << 1) \
-    } \
+  if (GEMV_GETN(N) > iter1) {                       \
+    if (GEMV_IS_FLOAT) {                            \
+      GEMV_STOREPAIR2_COL_MMA(iter2, iter2);        \
+    } else {                                        \
+      GEMV_STOREPAIR2_COL_MMA(iter2, iter2 << 1)    \
+      GEMV_STOREPAIR2_COL_MMA(iter3, iter3 << 1)    \
+    }                                               \
   }
 
-#define GEMV_PROCESS_COL_ONE_MMA(N) \
-  GEMV_UNROLL(GEMV_INIT_MMA, N) \
-  Index j = j2; \
-  __vector_pair b0, b1, b2, b3, b4, b5, b6, b7; \
-  do { \
-    LhsPacket g0, g1, g2, g3, g4, g5, g6, g7; \
-    RhsPacket a0 = pset1<RhsPacket>(rhs2(j, 0)); \
-    GEMV_UNROLL(GEMV_PREFETCH, N) \
-    GEMV_LOAD_COL_MMA(N) \
-    GEMV_WORK_COL_MMA(N) \
-  } while (++j < jend); \
-  GEMV_UNROLL(GEMV_DISASSEMBLE_MMA, N) \
-  if (GEMV_GETN(N) <= 1) { \
-    GEMV_UNROLL(GEMV_STORE_COL_MMA, N) \
-  } else { \
-    GEMV_UNROLL_HALF(GEMV_LOAD2_COL_MMA, (N >> 1)) \
-    GEMV_UNROLL_HALF(GEMV_WORK2_COL_MMA, (N >> 1)) \
+#define GEMV_PROCESS_COL_ONE_MMA(N)                 \
+  GEMV_UNROLL(GEMV_INIT_MMA, N)                     \
+  Index j = j2;                                     \
+  __vector_pair b0, b1, b2, b3, b4, b5, b6, b7;     \
+  do {                                              \
+    LhsPacket g0, g1, g2, g3, g4, g5, g6, g7;       \
+    RhsPacket a0 = pset1<RhsPacket>(rhs2(j, 0));    \
+    GEMV_UNROLL(GEMV_PREFETCH, N)                   \
+    GEMV_LOAD_COL_MMA(N)                            \
+    GEMV_WORK_COL_MMA(N)                            \
+  } while (++j < jend);                             \
+  GEMV_UNROLL(GEMV_DISASSEMBLE_MMA, N)              \
+  if (GEMV_GETN(N) <= 1) {                          \
+    GEMV_UNROLL(GEMV_STORE_COL_MMA, N)              \
+  } else {                                          \
+    GEMV_UNROLL_HALF(GEMV_LOAD2_COL_MMA, (N >> 1))  \
+    GEMV_UNROLL_HALF(GEMV_WORK2_COL_MMA, (N >> 1))  \
     GEMV_UNROLL_HALF(GEMV_STORE2_COL_MMA, (N >> 1)) \
-  } \
+  }                                                 \
   i += (ResPacketSize * N);
 #endif
 
-#define GEMV_INIT(iter, N) \
-  if (N > iter) { \
+#define GEMV_INIT(iter, N)                    \
+  if (N > iter) {                             \
     c##iter = pset1<ResPacket>(ResScalar(0)); \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(c##iter); \
+  } else {                                    \
+    EIGEN_UNUSED_VARIABLE(c##iter);           \
   }
 
 #ifdef EIGEN_POWER_USE_GEMV_PREFETCH
-#define GEMV_PREFETCH(iter, N) \
-  if (GEMV_GETN(N) > ((iter >> 1) + ((N >> 1) * (iter & 1)))) { \
+#define GEMV_PREFETCH(iter, N)                                   \
+  if (GEMV_GETN(N) > ((iter >> 1) + ((N >> 1) * (iter & 1)))) {  \
     lhs.prefetch(i + (iter * LhsPacketSize) + prefetch_dist, j); \
   }
 #else
 #define GEMV_PREFETCH(iter, N)
 #endif
 
-#define GEMV_WORK_COL(iter, N) \
-  if (N > iter) { \
+#define GEMV_WORK_COL(iter, N)                                   \
+  if (N > iter) {                                                \
     c##iter = pcj.pmadd(GEMV_LOADPACKET_COL(iter), a0, c##iter); \
   }
 
-#define GEMV_STORE_COL(iter, N) \
-  if (N > iter) { \
-    pstoreu(res + i + (iter * ResPacketSize), pmadd(c##iter, palpha, ploadu<ResPacket>(res + i + (iter * ResPacketSize)))); \
+#define GEMV_STORE_COL(iter, N)                                                           \
+  if (N > iter) {                                                                         \
+    pstoreu(res + i + (iter * ResPacketSize),                                             \
+            pmadd(c##iter, palpha, ploadu<ResPacket>(res + i + (iter * ResPacketSize)))); \
   }
 
 /** \internal main macro for gemv_col - initialize accumulators, multiply and add inputs, and store results */
-#define GEMV_PROCESS_COL_ONE(N) \
-  GEMV_UNROLL(GEMV_INIT, N) \
-  Index j = j2; \
-  do { \
+#define GEMV_PROCESS_COL_ONE(N)                  \
+  GEMV_UNROLL(GEMV_INIT, N)                      \
+  Index j = j2;                                  \
+  do {                                           \
     RhsPacket a0 = pset1<RhsPacket>(rhs2(j, 0)); \
-    GEMV_UNROLL(GEMV_PREFETCH, N) \
-    GEMV_UNROLL(GEMV_WORK_COL, N) \
-  } while (++j < jend); \
-  GEMV_UNROLL(GEMV_STORE_COL, N) \
+    GEMV_UNROLL(GEMV_PREFETCH, N)                \
+    GEMV_UNROLL(GEMV_WORK_COL, N)                \
+  } while (++j < jend);                          \
+  GEMV_UNROLL(GEMV_STORE_COL, N)                 \
   i += (ResPacketSize * N);
 
 #ifdef USE_GEMV_MMA
-#define GEMV_PROCESS_COL(N) \
-  GEMV_PROCESS_COL_ONE_MMA(N)
+#define GEMV_PROCESS_COL(N) GEMV_PROCESS_COL_ONE_MMA(N)
 #else
-#define GEMV_PROCESS_COL(N) \
-  GEMV_PROCESS_COL_ONE(N)
+#define GEMV_PROCESS_COL(N) GEMV_PROCESS_COL_ONE(N)
 #endif
 
 /** \internal perform a matrix multiply and accumulate of packet a and packet b */
 #ifdef USE_GEMV_MMA
-template<typename LhsPacket, typename RhsPacket, bool accumulate>
-EIGEN_ALWAYS_INLINE void pger_vecMMA_acc(__vector_quad* acc, const RhsPacket& a, const LhsPacket& b)
-{
-    if (accumulate)
-    {
-        __builtin_mma_xvf32gerpp(acc, (__vector unsigned char)a, (__vector unsigned char)b);
-    }
-    else
-    {
-        __builtin_mma_xvf32ger(acc, (__vector unsigned char)a, (__vector unsigned char)b);
-    }
+template <typename LhsPacket, typename RhsPacket, bool accumulate>
+EIGEN_ALWAYS_INLINE void pger_vecMMA_acc(__vector_quad* acc, const RhsPacket& a, const LhsPacket& b) {
+  if (accumulate) {
+    __builtin_mma_xvf32gerpp(acc, (__vector unsigned char)a, (__vector unsigned char)b);
+  } else {
+    __builtin_mma_xvf32ger(acc, (__vector unsigned char)a, (__vector unsigned char)b);
+  }
 }
 
 /** \internal perform a matrix multiply and accumulate of vector_pair a and packet b */
-template<typename LhsPacket, typename RhsPacket, bool accumulate>
-EIGEN_ALWAYS_INLINE void pger_vecMMA_acc(__vector_quad* acc, __vector_pair& a, const LhsPacket& b)
-{
-    if (accumulate)
-    {
-        __builtin_mma_xvf64gerpp(acc, a, (__vector unsigned char)b);
-    }
-    else
-    {
-        __builtin_mma_xvf64ger(acc, a, (__vector unsigned char)b);
-    }
+template <typename LhsPacket, typename RhsPacket, bool accumulate>
+EIGEN_ALWAYS_INLINE void pger_vecMMA_acc(__vector_quad* acc, __vector_pair& a, const LhsPacket& b) {
+  if (accumulate) {
+    __builtin_mma_xvf64gerpp(acc, a, (__vector unsigned char)b);
+  } else {
+    __builtin_mma_xvf64ger(acc, a, (__vector unsigned char)b);
+  }
 }
 #endif
 
-template<typename LhsScalar, typename LhsMapper, typename RhsScalar, typename RhsMapper, typename ResScalar>
-EIGEN_STRONG_INLINE void gemv_col(
-    Index rows, Index cols,
-    const LhsMapper& alhs,
-    const RhsMapper& rhs,
-    ResScalar* res, Index resIncr,
-    ResScalar alpha)
-{
-    typedef gemv_traits<LhsScalar, RhsScalar> Traits;
+template <typename LhsScalar, typename LhsMapper, typename RhsScalar, typename RhsMapper, typename ResScalar>
+EIGEN_STRONG_INLINE void gemv_col(Index rows, Index cols, const LhsMapper& alhs, const RhsMapper& rhs, ResScalar* res,
+                                  Index resIncr, ResScalar alpha) {
+  typedef gemv_traits<LhsScalar, RhsScalar> Traits;
 
-    typedef typename Traits::LhsPacket LhsPacket;
-    typedef typename Traits::RhsPacket RhsPacket;
-    typedef typename Traits::ResPacket ResPacket;
+  typedef typename Traits::LhsPacket LhsPacket;
+  typedef typename Traits::RhsPacket RhsPacket;
+  typedef typename Traits::ResPacket ResPacket;
 
-    EIGEN_UNUSED_VARIABLE(resIncr);
-    eigen_internal_assert(resIncr == 1);
+  EIGEN_UNUSED_VARIABLE(resIncr);
+  eigen_internal_assert(resIncr == 1);
 
-    // The following copy tells the compiler that lhs's attributes are not modified outside this function
-    // This helps GCC to generate proper code.
-    LhsMapper lhs(alhs);
-    RhsMapper rhs2(rhs);
+  // The following copy tells the compiler that lhs's attributes are not modified outside this function
+  // This helps GCC to generate proper code.
+  LhsMapper lhs(alhs);
+  RhsMapper rhs2(rhs);
 
-    conj_helper<LhsScalar, RhsScalar, false, false> cj;
-    conj_helper<LhsPacket, RhsPacket, false, false> pcj;
+  conj_helper<LhsScalar, RhsScalar, false, false> cj;
+  conj_helper<LhsPacket, RhsPacket, false, false> pcj;
 
-    const Index lhsStride = lhs.stride();
-    // TODO: for padded aligned inputs, we could enable aligned reads
-    enum {
-        LhsAlignment = Unaligned,
-        ResPacketSize = Traits::ResPacketSize,
-        LhsPacketSize = Traits::LhsPacketSize,
-        RhsPacketSize = Traits::RhsPacketSize,
-    };
+  const Index lhsStride = lhs.stride();
+  // TODO: for padded aligned inputs, we could enable aligned reads
+  enum {
+    LhsAlignment = Unaligned,
+    ResPacketSize = Traits::ResPacketSize,
+    LhsPacketSize = Traits::LhsPacketSize,
+    RhsPacketSize = Traits::RhsPacketSize,
+  };
 
 #ifndef GCC_ONE_VECTORPAIR_BUG
-    const Index n8 = rows - 8 * ResPacketSize + 1;
-    const Index n4 = rows - 4 * ResPacketSize + 1;
-    const Index n2 = rows - 2 * ResPacketSize + 1;
+  const Index n8 = rows - 8 * ResPacketSize + 1;
+  const Index n4 = rows - 4 * ResPacketSize + 1;
+  const Index n2 = rows - 2 * ResPacketSize + 1;
 #endif
-    const Index n1 = rows - 1 * ResPacketSize + 1;
+  const Index n1 = rows - 1 * ResPacketSize + 1;
 #ifdef EIGEN_POWER_USE_GEMV_PREFETCH
-    const Index prefetch_dist = 64 * LhsPacketSize;
+  const Index prefetch_dist = 64 * LhsPacketSize;
 #endif
 
-    // TODO: improve the following heuristic:
-    const Index block_cols = cols < 128 ? cols : (lhsStride * sizeof(LhsScalar) < 16000 ? 16 : 8);
-    ResPacket palpha = pset1<ResPacket>(alpha);
+  // TODO: improve the following heuristic:
+  const Index block_cols = cols < 128 ? cols : (lhsStride * sizeof(LhsScalar) < 16000 ? 16 : 8);
+  ResPacket palpha = pset1<ResPacket>(alpha);
 
-    for (Index j2 = 0; j2 < cols; j2 += block_cols)
-    {
-        Index jend = numext::mini(j2 + block_cols, cols);
-        Index i = 0;
-        ResPacket c0, c1, c2, c3, c4, c5, c6, c7;
+  for (Index j2 = 0; j2 < cols; j2 += block_cols) {
+    Index jend = numext::mini(j2 + block_cols, cols);
+    Index i = 0;
+    ResPacket c0, c1, c2, c3, c4, c5, c6, c7;
 #ifdef USE_GEMV_MMA
-        __vector_quad e0, e1, e2, e3, e4, e5, e6, e7;
-        PacketBlock<ResPacket, 4> result0, result1, result2, result3, result4, result5, result6, result7;
-        GEMV_UNUSED(8, e)
-        GEMV_UNUSED(8, result)
-        GEMV_UNUSED_EXTRA(1, c)
+    __vector_quad e0, e1, e2, e3, e4, e5, e6, e7;
+    PacketBlock<ResPacket, 4> result0, result1, result2, result3, result4, result5, result6, result7;
+    GEMV_UNUSED(8, e)
+    GEMV_UNUSED(8, result)
+    GEMV_UNUSED_EXTRA(1, c)
 #endif
 #ifndef GCC_ONE_VECTORPAIR_BUG
-        while (i < n8)
-        {
-            GEMV_PROCESS_COL(8)
-        }
-        if (i < n4)
-        {
-            GEMV_PROCESS_COL(4)
-        }
-        if (i < n2)
-        {
-            GEMV_PROCESS_COL(2)
-        }
-        if (i < n1)
-#else
-        while (i < n1)
-#endif
-        {
-            GEMV_PROCESS_COL_ONE(1)
-        }
-        for (;i < rows;++i)
-        {
-            ResScalar d0(0);
-            Index j = j2;
-            do {
-                d0 += cj.pmul(lhs(i, j), rhs2(j, 0));
-            } while (++j < jend);
-            res[i] += alpha * d0;
-        }
+    while (i < n8) {
+      GEMV_PROCESS_COL(8)
     }
+    if (i < n4) {
+      GEMV_PROCESS_COL(4)
+    }
+    if (i < n2) {
+      GEMV_PROCESS_COL(2)
+    }
+    if (i < n1)
+#else
+    while (i < n1)
+#endif
+    {
+      GEMV_PROCESS_COL_ONE(1)
+    }
+    for (; i < rows; ++i) {
+      ResScalar d0(0);
+      Index j = j2;
+      do {
+        d0 += cj.pmul(lhs(i, j), rhs2(j, 0));
+      } while (++j < jend);
+      res[i] += alpha * d0;
+    }
+  }
 }
 
-template<bool extraRows>
-EIGEN_ALWAYS_INLINE void outputVecCol(Packet4f acc, float *result, Packet4f pAlpha, Index extra_rows)
-{
+template <bool extraRows>
+EIGEN_ALWAYS_INLINE void outputVecCol(Packet4f acc, float* result, Packet4f pAlpha, Index extra_rows) {
   Packet4f d0 = ploadu<Packet4f>(result);
   d0 = pmadd(acc, pAlpha, d0);
   if (extraRows) {
@@ -477,28 +452,27 @@
   }
 }
 
-template<Index num_acc, bool extraRows, Index size>
-EIGEN_ALWAYS_INLINE void outputVecColResults(Packet4f (&acc)[num_acc][size], float *result, Packet4f pAlpha, Index extra_rows)
-{
+template <Index num_acc, bool extraRows, Index size>
+EIGEN_ALWAYS_INLINE void outputVecColResults(Packet4f (&acc)[num_acc][size], float* result, Packet4f pAlpha,
+                                             Index extra_rows) {
   constexpr Index real_acc = (num_acc - (extraRows ? 1 : 0));
-  for(Index k = 0; k < real_acc; k++) {
-    outputVecCol<false>(acc[k][0], result + k*4, pAlpha, extra_rows);
+  for (Index k = 0; k < real_acc; k++) {
+    outputVecCol<false>(acc[k][0], result + k * 4, pAlpha, extra_rows);
   }
   if (extraRows) {
-    outputVecCol<true>(acc[real_acc][0], result + real_acc*4, pAlpha, extra_rows);
+    outputVecCol<true>(acc[real_acc][0], result + real_acc * 4, pAlpha, extra_rows);
   }
 }
 
-static Packet16uc p16uc_MERGE16_32_V1 = {  0, 1, 16,17,  0, 1, 16,17,  0, 1, 16,17,  0, 1, 16,17 };
-static Packet16uc p16uc_MERGE16_32_V2 = {  2, 3, 18,19,  2, 3, 18,19,  2, 3, 18,19,  2, 3, 18,19 };
+static Packet16uc p16uc_MERGE16_32_V1 = {0, 1, 16, 17, 0, 1, 16, 17, 0, 1, 16, 17, 0, 1, 16, 17};
+static Packet16uc p16uc_MERGE16_32_V2 = {2, 3, 18, 19, 2, 3, 18, 19, 2, 3, 18, 19, 2, 3, 18, 19};
 
-template<Index num_acc, typename LhsMapper, bool zero>
-EIGEN_ALWAYS_INLINE void loadVecLoopVSX(Index k, LhsMapper& lhs, Packet4f (&a0)[num_acc][2])
-{
-  Packet8bf c0 = lhs.template loadPacket<Packet8bf>(k*4, 0);
+template <Index num_acc, typename LhsMapper, bool zero>
+EIGEN_ALWAYS_INLINE void loadVecLoopVSX(Index k, LhsMapper& lhs, Packet4f (&a0)[num_acc][2]) {
+  Packet8bf c0 = lhs.template loadPacket<Packet8bf>(k * 4, 0);
   Packet8bf b1;
   if (!zero) {
-    b1 = lhs.template loadPacket<Packet8bf>(k*4, 1);
+    b1 = lhs.template loadPacket<Packet8bf>(k * 4, 1);
 
     a0[k + 0][1] = oneConvertBF16Hi(b1.m_val);
   }
@@ -512,22 +486,19 @@
   }
 }
 
-template<Index num_acc, bool zero>
-EIGEN_ALWAYS_INLINE void multVecVSX(Packet4f (&acc)[num_acc][2], Packet4f (&a0)[num_acc][2], Packet4f (&b0)[2])
-{
-  for(Index k = 0; k < num_acc; k++) {
-    for(Index i = 0; i < (zero ? 1 : 2); i++) {
+template <Index num_acc, bool zero>
+EIGEN_ALWAYS_INLINE void multVecVSX(Packet4f (&acc)[num_acc][2], Packet4f (&a0)[num_acc][2], Packet4f (&b0)[2]) {
+  for (Index k = 0; k < num_acc; k++) {
+    for (Index i = 0; i < (zero ? 1 : 2); i++) {
       acc[k][i] = pmadd(b0[i], a0[k][i], acc[k][i]);
     }
   }
 }
 
-template<typename RhsMapper, bool linear>
-struct loadColData_impl
-{
+template <typename RhsMapper, bool linear>
+struct loadColData_impl {
   // linear == false
-  static EIGEN_ALWAYS_INLINE Packet8bf run(RhsMapper& rhs, Index j)
-  {
+  static EIGEN_ALWAYS_INLINE Packet8bf run(RhsMapper& rhs, Index j) {
     const Index n = unpacket_traits<Packet8bf>::size;
     EIGEN_ALIGN16 bfloat16 to[n];
     LOAD_STORE_UNROLL_16
@@ -538,25 +509,21 @@
   }
 };
 
-template<typename RhsMapper>
-struct loadColData_impl<RhsMapper, true>
-{
+template <typename RhsMapper>
+struct loadColData_impl<RhsMapper, true> {
   // linear == true
-  static EIGEN_ALWAYS_INLINE Packet8bf run(RhsMapper& rhs, Index j)
-  {
+  static EIGEN_ALWAYS_INLINE Packet8bf run(RhsMapper& rhs, Index j) {
     return rhs.template loadPacket<Packet8bf>(j + 0, 0);
   }
 };
 
-template<typename RhsMapper, bool linear>
-EIGEN_ALWAYS_INLINE Packet8bf loadColData(RhsMapper& rhs, Index j)
-{
+template <typename RhsMapper, bool linear>
+EIGEN_ALWAYS_INLINE Packet8bf loadColData(RhsMapper& rhs, Index j) {
   return loadColData_impl<RhsMapper, linear>::run(rhs, j);
 }
 
-template<Index num_acc, typename LhsMapper, typename RhsMapper, bool zero, bool linear>
-EIGEN_ALWAYS_INLINE void vecColLoopVSX(Index j, LhsMapper& lhs, RhsMapper& rhs, Packet4f (&acc)[num_acc][2])
-{
+template <Index num_acc, typename LhsMapper, typename RhsMapper, bool zero, bool linear>
+EIGEN_ALWAYS_INLINE void vecColLoopVSX(Index j, LhsMapper& lhs, RhsMapper& rhs, Packet4f (&acc)[num_acc][2]) {
   Packet4f a0[num_acc][2], b0[2];
   Packet8bf b2 = loadColData<RhsMapper, linear>(rhs, j);
 
@@ -568,32 +535,31 @@
   using LhsSubMapper = typename LhsMapper::SubMapper;
 
   LhsSubMapper lhs2 = lhs.getSubMapper(0, j);
-  for(Index k = 0; k < num_acc; k += 2) {
+  for (Index k = 0; k < num_acc; k += 2) {
     loadVecLoopVSX<num_acc, LhsSubMapper, zero>(k, lhs2, a0);
   }
 
   multVecVSX<num_acc, zero>(acc, a0, b0);
 }
 
-template<Index num_acc>
-EIGEN_ALWAYS_INLINE void addResultsVSX(Packet4f (&acc)[num_acc][2])
-{
-  for(Index i = 0; i < num_acc; i++) {
+template <Index num_acc>
+EIGEN_ALWAYS_INLINE void addResultsVSX(Packet4f (&acc)[num_acc][2]) {
+  for (Index i = 0; i < num_acc; i++) {
     acc[i][0] = acc[i][0] + acc[i][1];
   }
 }
 
 // Uses 2X the accumulators or 4X the number of VSX registers
-#define MAX_BFLOAT16_VEC_ACC_VSX   8
+#define MAX_BFLOAT16_VEC_ACC_VSX 8
 
-template<const Index num_acc, typename LhsMapper, typename RhsMapper, bool extraRows, bool linear>
-void colVSXVecColLoopBody(Index& row, Index cend, Index rows, LhsMapper& lhs, RhsMapper& rhs, const Packet4f pAlpha, float *result)
-{
+template <const Index num_acc, typename LhsMapper, typename RhsMapper, bool extraRows, bool linear>
+void colVSXVecColLoopBody(Index& row, Index cend, Index rows, LhsMapper& lhs, RhsMapper& rhs, const Packet4f pAlpha,
+                          float* result) {
   constexpr Index step = (num_acc * 4);
   const Index extra_rows = (extraRows) ? (rows & 3) : 0;
   constexpr bool multiIters = !extraRows && (num_acc == MAX_BFLOAT16_VEC_ACC_VSX);
 
-  do{
+  do {
     Packet4f acc[num_acc][2];
 
     zeroAccumulators<num_acc, 2>(acc);
@@ -601,7 +567,7 @@
     using LhsSubMapper = typename LhsMapper::SubMapper;
 
     LhsSubMapper lhs2 = lhs.getSubMapper(row, 0);
-    for(Index j = 0; j + 2 <= cend; j += 2) {
+    for (Index j = 0; j + 2 <= cend; j += 2) {
       vecColLoopVSX<num_acc, LhsSubMapper, RhsMapper, false, linear>(j, lhs2, rhs, acc);
     }
     if (cend & 1) {
@@ -613,56 +579,58 @@
     outputVecColResults<num_acc, extraRows, 2>(acc, result, pAlpha, extra_rows);
 
     result += step;
-  } while(multiIters && (step <= rows - (row += step)));
+  } while (multiIters && (step <= rows - (row += step)));
 }
 
-template<const Index num_acc, typename LhsMapper, typename RhsMapper, bool extraRows, bool linear>
-EIGEN_ALWAYS_INLINE void colVSXVecColLoopBodyExtraN(Index& row, Index cend, Index rows, LhsMapper& lhs, RhsMapper& rhs, const Packet4f pAlpha, float *result)
-{
+template <const Index num_acc, typename LhsMapper, typename RhsMapper, bool extraRows, bool linear>
+EIGEN_ALWAYS_INLINE void colVSXVecColLoopBodyExtraN(Index& row, Index cend, Index rows, LhsMapper& lhs, RhsMapper& rhs,
+                                                    const Packet4f pAlpha, float* result) {
   if (MAX_BFLOAT16_VEC_ACC_VSX > num_acc) {
-    colVSXVecColLoopBody<num_acc + (extraRows ? 1 : 0), LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
+    colVSXVecColLoopBody<num_acc + (extraRows ? 1 : 0), LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs,
+                                                                                                 rhs, pAlpha, result);
   }
 }
 
-template<typename LhsMapper, typename RhsMapper, bool extraRows, bool linear>
-EIGEN_ALWAYS_INLINE void colVSXVecColLoopBodyExtra(Index& row, Index cend, Index rows, LhsMapper& lhs, RhsMapper& rhs, const Packet4f pAlpha, float *result)
-{
+template <typename LhsMapper, typename RhsMapper, bool extraRows, bool linear>
+EIGEN_ALWAYS_INLINE void colVSXVecColLoopBodyExtra(Index& row, Index cend, Index rows, LhsMapper& lhs, RhsMapper& rhs,
+                                                   const Packet4f pAlpha, float* result) {
   switch ((rows - row) >> 2) {
-  case 7:
-    colVSXVecColLoopBodyExtraN<7, LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
-    break;
-  case 6:
-    colVSXVecColLoopBodyExtraN<6, LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
-    break;
-  case 5:
-    colVSXVecColLoopBodyExtraN<5, LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
-    break;
-  case 4:
-    colVSXVecColLoopBodyExtraN<4, LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
-    break;
-  case 3:
-    colVSXVecColLoopBodyExtraN<3, LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
-    break;
-  case 2:
-    colVSXVecColLoopBodyExtraN<2, LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
-    break;
-  case 1:
-    colVSXVecColLoopBodyExtraN<1, LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
-    break;
-  default:
-    if (extraRows) {
-      colVSXVecColLoopBody<1, LhsMapper, RhsMapper, true, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
-    }
-    break;
+    case 7:
+      colVSXVecColLoopBodyExtraN<7, LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
+      break;
+    case 6:
+      colVSXVecColLoopBodyExtraN<6, LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
+      break;
+    case 5:
+      colVSXVecColLoopBodyExtraN<5, LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
+      break;
+    case 4:
+      colVSXVecColLoopBodyExtraN<4, LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
+      break;
+    case 3:
+      colVSXVecColLoopBodyExtraN<3, LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
+      break;
+    case 2:
+      colVSXVecColLoopBodyExtraN<2, LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
+      break;
+    case 1:
+      colVSXVecColLoopBodyExtraN<1, LhsMapper, RhsMapper, extraRows, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
+      break;
+    default:
+      if (extraRows) {
+        colVSXVecColLoopBody<1, LhsMapper, RhsMapper, true, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
+      }
+      break;
   }
 }
 
-template<typename LhsMapper, typename RhsMapper, bool linear>
-EIGEN_ALWAYS_INLINE void calcVSXVecColLoops(Index cend, Index rows, LhsMapper& lhs, RhsMapper& rhs, const Packet4f pAlpha, float *result)
-{
+template <typename LhsMapper, typename RhsMapper, bool linear>
+EIGEN_ALWAYS_INLINE void calcVSXVecColLoops(Index cend, Index rows, LhsMapper& lhs, RhsMapper& rhs,
+                                            const Packet4f pAlpha, float* result) {
   Index row = 0;
   if (rows >= (MAX_BFLOAT16_VEC_ACC_VSX * 4)) {
-    colVSXVecColLoopBody<MAX_BFLOAT16_VEC_ACC_VSX, LhsMapper, RhsMapper, false, linear>(row, cend, rows, lhs, rhs, pAlpha, result);
+    colVSXVecColLoopBody<MAX_BFLOAT16_VEC_ACC_VSX, LhsMapper, RhsMapper, false, linear>(row, cend, rows, lhs, rhs,
+                                                                                        pAlpha, result);
     result += row;
   }
   if (rows & 3) {
@@ -672,14 +640,13 @@
   }
 }
 
-template<const Index size, bool inc, Index delta>
-EIGEN_ALWAYS_INLINE void storeBF16fromResult(bfloat16* dst, Packet8bf data, Index resInc, Index extra)
-{
+template <const Index size, bool inc, Index delta>
+EIGEN_ALWAYS_INLINE void storeBF16fromResult(bfloat16* dst, Packet8bf data, Index resInc, Index extra) {
   if (inc) {
     if (size < 8) {
-      pscatter_partial(dst + delta*resInc, data, resInc, extra);
+      pscatter_partial(dst + delta * resInc, data, resInc, extra);
     } else {
-      pscatter(dst + delta*resInc, data, resInc);
+      pscatter(dst + delta * resInc, data, resInc);
     }
   } else {
     if (size < 8) {
@@ -690,15 +657,15 @@
   }
 }
 
-template<const Index size, bool inc = false>
-EIGEN_ALWAYS_INLINE void convertPointerF32toBF16VSX(Index& i, float* result, Index rows, bfloat16*& dst, Index resInc = 1)
-{
+template <const Index size, bool inc = false>
+EIGEN_ALWAYS_INLINE void convertPointerF32toBF16VSX(Index& i, float* result, Index rows, bfloat16*& dst,
+                                                    Index resInc = 1) {
   constexpr Index extra = ((size < 8) ? 8 : size);
   while (i + size <= rows) {
-    PacketBlock<Packet8bf,(size+7)/8> r32;
-    r32.packet[0] = convertF32toBF16VSX(result + i +  0);
+    PacketBlock<Packet8bf, (size + 7) / 8> r32;
+    r32.packet[0] = convertF32toBF16VSX(result + i + 0);
     if (size >= 16) {
-      r32.packet[1] = convertF32toBF16VSX(result + i +  8);
+      r32.packet[1] = convertF32toBF16VSX(result + i + 8);
     }
     if (size >= 32) {
       r32.packet[2] = convertF32toBF16VSX(result + i + 16);
@@ -712,25 +679,25 @@
       storeBF16fromResult<size, inc, 16>(dst, r32.packet[2], resInc);
       storeBF16fromResult<size, inc, 24>(dst, r32.packet[3], resInc);
     }
-    i += extra; dst += extra*resInc;
+    i += extra;
+    dst += extra * resInc;
     if (size != 32) break;
   }
 }
 
-template<bool inc = false>
-EIGEN_ALWAYS_INLINE void convertArrayPointerF32toBF16VSX(float *result, Index rows, bfloat16* dst, Index resInc = 1)
-{
+template <bool inc = false>
+EIGEN_ALWAYS_INLINE void convertArrayPointerF32toBF16VSX(float* result, Index rows, bfloat16* dst, Index resInc = 1) {
   Index i = 0;
-  convertPointerF32toBF16VSX<32,inc>(i, result, rows, dst, resInc);
-  convertPointerF32toBF16VSX<16,inc>(i, result, rows, dst, resInc);
-  convertPointerF32toBF16VSX<8,inc>(i, result, rows, dst, resInc);
-  convertPointerF32toBF16VSX<1,inc>(i, result, rows, dst, resInc);
+  convertPointerF32toBF16VSX<32, inc>(i, result, rows, dst, resInc);
+  convertPointerF32toBF16VSX<16, inc>(i, result, rows, dst, resInc);
+  convertPointerF32toBF16VSX<8, inc>(i, result, rows, dst, resInc);
+  convertPointerF32toBF16VSX<1, inc>(i, result, rows, dst, resInc);
 }
 
-template<typename RhsMapper, typename LhsMapper, typename = void>
+template <typename RhsMapper, typename LhsMapper, typename = void>
 struct UseStride : std::false_type {
-  static EIGEN_ALWAYS_INLINE void run(Index j2, Index jend, Index rows, LhsMapper& lhs, RhsMapper& rhs, Packet4f pAlpha, float *result)
-  {
+  static EIGEN_ALWAYS_INLINE void run(Index j2, Index jend, Index rows, LhsMapper& lhs, RhsMapper& rhs, Packet4f pAlpha,
+                                      float* result) {
     using RhsSubMapper = typename RhsMapper::SubMapper;
 
     RhsSubMapper rhs2 = rhs.getSubMapper(j2, 0);
@@ -738,11 +705,12 @@
   }
 };
 
-template<typename RhsMapper, typename LhsMapper>
-struct UseStride<RhsMapper, LhsMapper, std::enable_if_t<std::is_member_function_pointer<
-                           decltype(&RhsMapper::stride)>::value>> : std::true_type {
-  static EIGEN_ALWAYS_INLINE void run(Index j2, Index jend, Index rows, LhsMapper& lhs, RhsMapper& rhs, Packet4f pAlpha, float *result)
-  {
+template <typename RhsMapper, typename LhsMapper>
+struct UseStride<RhsMapper, LhsMapper,
+                 std::enable_if_t<std::is_member_function_pointer<decltype(&RhsMapper::stride)>::value>>
+    : std::true_type {
+  static EIGEN_ALWAYS_INLINE void run(Index j2, Index jend, Index rows, LhsMapper& lhs, RhsMapper& rhs, Packet4f pAlpha,
+                                      float* result) {
     using RhsSubMapper = typename RhsMapper::SubMapper;
 
     RhsSubMapper rhs2 = rhs.getSubMapper(j2, 0);
@@ -754,14 +722,9 @@
   }
 };
 
-template<typename LhsMapper, typename RhsMapper>
-void gemv_bfloat16_col(
-  Index rows, Index cols,
-  const LhsMapper& alhs,
-  const RhsMapper& rhs,
-  bfloat16* res, Index resIncr,
-  bfloat16 alpha)
-{
+template <typename LhsMapper, typename RhsMapper>
+void gemv_bfloat16_col(Index rows, Index cols, const LhsMapper& alhs, const RhsMapper& rhs, bfloat16* res,
+                       Index resIncr, bfloat16 alpha) {
   EIGEN_UNUSED_VARIABLE(resIncr);
   eigen_internal_assert(resIncr == 1);
 
@@ -781,8 +744,7 @@
 
   convertArrayPointerBF16toF32(result, 1, rows, res);
 
-  for (Index j2 = 0; j2 < cols; j2 += block_cols)
-  {
+  for (Index j2 = 0; j2 < cols; j2 += block_cols) {
     Index jend = numext::mini(j2 + block_cols, cols);
 
     using LhsSubMapper = typename LhsMapper::SubMapper;
@@ -794,12 +756,11 @@
   convertArrayPointerF32toBF16VSX(result, rows, res);
 }
 
-template<Index num_acc, Index size>
-EIGEN_ALWAYS_INLINE void outputVecResults(Packet4f (&acc)[num_acc][size], float *result, Packet4f pAlpha)
-{
+template <Index num_acc, Index size>
+EIGEN_ALWAYS_INLINE void outputVecResults(Packet4f (&acc)[num_acc][size], float* result, Packet4f pAlpha) {
   constexpr Index extra = num_acc & 3;
 
-  for(Index k = 0; k < num_acc; k += 4) {
+  for (Index k = 0; k < num_acc; k += 4) {
     Packet4f d0 = ploadu<Packet4f>(result + k);
     d0 = pmadd(acc[k + 0][0], pAlpha, d0);
 
@@ -809,15 +770,14 @@
       if (extra == 3) {
         pstoreu_partial(result + k, d0, extra);
       } else {
-        memcpy((void *)(result + k), (void *)(&d0), sizeof(float) * extra);
+        memcpy((void*)(result + k), (void*)(&d0), sizeof(float) * extra);
       }
     }
   }
 }
 
-template<Index num_acc>
-EIGEN_ALWAYS_INLINE void preduxVecResults2VSX(Packet4f (&acc)[num_acc][2], Index k)
-{
+template <Index num_acc>
+EIGEN_ALWAYS_INLINE void preduxVecResults2VSX(Packet4f (&acc)[num_acc][2], Index k) {
   if (num_acc > (k + 1)) {
     acc[k][1] = vec_mergel(acc[k + 0][0], acc[k + 1][0]);
     acc[k][0] = vec_mergeh(acc[k + 0][0], acc[k + 1][0]);
@@ -833,25 +793,24 @@
   }
 }
 
-template<Index num_acc>
-EIGEN_ALWAYS_INLINE void preduxVecResultsVSX(Packet4f (&acc)[num_acc][2])
-{
-  for(Index k = 0; k < num_acc; k += 4) {
+template <Index num_acc>
+EIGEN_ALWAYS_INLINE void preduxVecResultsVSX(Packet4f (&acc)[num_acc][2]) {
+  for (Index k = 0; k < num_acc; k += 4) {
     preduxVecResults2VSX<num_acc>(acc, k + 0);
     if (num_acc > (k + 2)) {
       preduxVecResults2VSX<num_acc>(acc, k + 2);
 #ifdef EIGEN_VECTORIZE_VSX
-      acc[k + 0][0] = reinterpret_cast<Packet4f>(vec_mergeh(reinterpret_cast<Packet2ul>(acc[k + 0][0]), reinterpret_cast<Packet2ul>(acc[k + 2][0])));
+      acc[k + 0][0] = reinterpret_cast<Packet4f>(
+          vec_mergeh(reinterpret_cast<Packet2ul>(acc[k + 0][0]), reinterpret_cast<Packet2ul>(acc[k + 2][0])));
 #else
-      acc[k + 0][0] = reinterpret_cast<Packet4f>(vec_perm(acc[k + 0][0],acc[k + 2][0],p16uc_TRANSPOSE64_HI));
+      acc[k + 0][0] = reinterpret_cast<Packet4f>(vec_perm(acc[k + 0][0], acc[k + 2][0], p16uc_TRANSPOSE64_HI));
 #endif
     }
   }
 }
 
 #ifndef _ARCH_PWR9
-EIGEN_ALWAYS_INLINE Packet8us loadPacketPartialZero(Packet8us data, Index extra_cols)
-{
+EIGEN_ALWAYS_INLINE Packet8us loadPacketPartialZero(Packet8us data, Index extra_cols) {
   Packet16uc shift = pset1<Packet16uc>(8 * 2 * (8 - extra_cols));
 #ifdef _BIG_ENDIAN
   return reinterpret_cast<Packet8us>(vec_slo(vec_sro(reinterpret_cast<Packet16uc>(data), shift), shift));
@@ -861,9 +820,9 @@
 }
 #endif
 
-template<Index num_acc, typename LhsMapper, typename RhsMapper, bool extra>
-EIGEN_ALWAYS_INLINE void multVSXVecLoop(Packet4f (&acc)[num_acc][2], const LhsMapper& lhs, RhsMapper& rhs, Index j, Index extra_cols)
-{
+template <Index num_acc, typename LhsMapper, typename RhsMapper, bool extra>
+EIGEN_ALWAYS_INLINE void multVSXVecLoop(Packet4f (&acc)[num_acc][2], const LhsMapper& lhs, RhsMapper& rhs, Index j,
+                                        Index extra_cols) {
   Packet4f a0[num_acc][2], b0[2];
   Packet8bf a1, b1;
 
@@ -879,7 +838,7 @@
   b0[1] = oneConvertBF16Lo(b1.m_val);
 
   const LhsMapper lhs2 = lhs.getSubMapper(0, j);
-  for(Index k = 0; k < num_acc; k++) {
+  for (Index k = 0; k < num_acc; k++) {
     if (extra) {
       a1 = lhs2.template loadPacketPartial<Packet8bf>(k, 0, extra_cols);
 #ifndef _ARCH_PWR9
@@ -895,11 +854,11 @@
   multVecVSX<num_acc, false>(acc, a0, b0);
 }
 
-template<Index num_acc, typename LhsMapper, typename RhsMapper>
-EIGEN_ALWAYS_INLINE void vecVSXLoop(Index cols, const LhsMapper& lhs, RhsMapper& rhs, Packet4f (&acc)[num_acc][2], Index extra_cols)
-{
+template <Index num_acc, typename LhsMapper, typename RhsMapper>
+EIGEN_ALWAYS_INLINE void vecVSXLoop(Index cols, const LhsMapper& lhs, RhsMapper& rhs, Packet4f (&acc)[num_acc][2],
+                                    Index extra_cols) {
   Index j = 0;
-  for(; j + 8 <= cols; j += 8){
+  for (; j + 8 <= cols; j += 8) {
     multVSXVecLoop<num_acc, LhsMapper, RhsMapper, false>(acc, lhs, rhs, j, extra_cols);
   }
 
@@ -908,13 +867,13 @@
   }
 }
 
-template<const Index num_acc, typename LhsMapper, typename RhsMapper>
-void colVSXVecLoopBody(Index& row, Index cols, Index rows, LhsMapper& lhs, RhsMapper& rhs, const Packet4f pAlpha, float *result)
-{
+template <const Index num_acc, typename LhsMapper, typename RhsMapper>
+void colVSXVecLoopBody(Index& row, Index cols, Index rows, LhsMapper& lhs, RhsMapper& rhs, const Packet4f pAlpha,
+                       float* result) {
   constexpr bool multiIters = (num_acc == MAX_BFLOAT16_VEC_ACC_VSX);
   const Index extra_cols = (cols & 7);
 
-  do{
+  do {
     Packet4f acc[num_acc][2];
 
     zeroAccumulators<num_acc, 2>(acc);
@@ -929,48 +888,48 @@
     outputVecResults<num_acc, 2>(acc, result, pAlpha);
 
     result += num_acc;
-  } while(multiIters && (num_acc <= rows - (row += num_acc)));
+  } while (multiIters && (num_acc <= rows - (row += num_acc)));
 }
 
-template<const Index num_acc, typename LhsMapper, typename RhsMapper>
-EIGEN_ALWAYS_INLINE void colVSXVecLoopBodyExtraN(Index& row, Index cols, Index rows, LhsMapper& lhs, RhsMapper& rhs, const Packet4f pAlpha, float *result)
-{
+template <const Index num_acc, typename LhsMapper, typename RhsMapper>
+EIGEN_ALWAYS_INLINE void colVSXVecLoopBodyExtraN(Index& row, Index cols, Index rows, LhsMapper& lhs, RhsMapper& rhs,
+                                                 const Packet4f pAlpha, float* result) {
   if (MAX_BFLOAT16_VEC_ACC_VSX > num_acc) {
     colVSXVecLoopBody<num_acc, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
   }
 }
 
-template<typename LhsMapper, typename RhsMapper>
-EIGEN_ALWAYS_INLINE void colVSXVecLoopBodyExtra(Index& row, Index cols, Index rows, LhsMapper& lhs, RhsMapper& rhs, const Packet4f pAlpha, float *result)
-{
+template <typename LhsMapper, typename RhsMapper>
+EIGEN_ALWAYS_INLINE void colVSXVecLoopBodyExtra(Index& row, Index cols, Index rows, LhsMapper& lhs, RhsMapper& rhs,
+                                                const Packet4f pAlpha, float* result) {
   switch (rows - row) {
-  case 7:
-    colVSXVecLoopBodyExtraN<7, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
-    break;
-  case 6:
-    colVSXVecLoopBodyExtraN<6, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
-    break;
-  case 5:
-    colVSXVecLoopBodyExtraN<5, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
-    break;
-  case 4:
-    colVSXVecLoopBodyExtraN<4, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
-    break;
-  case 3:
-    colVSXVecLoopBodyExtraN<3, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
-    break;
-  case 2:
-    colVSXVecLoopBodyExtraN<2, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
-    break;
-  case 1:
-    colVSXVecLoopBodyExtraN<1, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
-    break;
+    case 7:
+      colVSXVecLoopBodyExtraN<7, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
+      break;
+    case 6:
+      colVSXVecLoopBodyExtraN<6, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
+      break;
+    case 5:
+      colVSXVecLoopBodyExtraN<5, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
+      break;
+    case 4:
+      colVSXVecLoopBodyExtraN<4, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
+      break;
+    case 3:
+      colVSXVecLoopBodyExtraN<3, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
+      break;
+    case 2:
+      colVSXVecLoopBodyExtraN<2, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
+      break;
+    case 1:
+      colVSXVecLoopBodyExtraN<1, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
+      break;
   }
 }
 
-template<typename LhsMapper, typename RhsMapper>
-EIGEN_ALWAYS_INLINE void calcVSXVecLoops(Index cols, Index rows, LhsMapper& lhs, RhsMapper& rhs, const Packet4f pAlpha, float *result)
-{
+template <typename LhsMapper, typename RhsMapper>
+EIGEN_ALWAYS_INLINE void calcVSXVecLoops(Index cols, Index rows, LhsMapper& lhs, RhsMapper& rhs, const Packet4f pAlpha,
+                                         float* result) {
   Index row = 0;
   if (rows >= MAX_BFLOAT16_VEC_ACC_VSX) {
     colVSXVecLoopBody<MAX_BFLOAT16_VEC_ACC_VSX, LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
@@ -979,14 +938,9 @@
   colVSXVecLoopBodyExtra<LhsMapper, RhsMapper>(row, cols, rows, lhs, rhs, pAlpha, result);
 }
 
-template<typename LhsMapper, typename RhsMapper>
-EIGEN_STRONG_INLINE void gemv_bfloat16_row(
-  Index rows, Index cols,
-  const LhsMapper& alhs,
-  const RhsMapper& rhs,
-  bfloat16* res, Index resIncr,
-  bfloat16 alpha)
-{
+template <typename LhsMapper, typename RhsMapper>
+EIGEN_STRONG_INLINE void gemv_bfloat16_row(Index rows, Index cols, const LhsMapper& alhs, const RhsMapper& rhs,
+                                           bfloat16* res, Index resIncr, bfloat16 alpha) {
   typedef typename RhsMapper::LinearMapper LinearMapper;
 
   // The following copy tells the compiler that lhs's attributes are not modified outside this function
@@ -1015,51 +969,65 @@
 
 #undef MAX_BFLOAT16_VEC_ACC_VSX
 
-const Packet16uc p16uc_COMPLEX32_XORFLIP = { 0x44,0x55,0x66,0x77, 0x00,0x11,0x22,0x33, 0xcc,0xdd,0xee,0xff, 0x88,0x99,0xaa,0xbb };
-const Packet16uc p16uc_COMPLEX64_XORFLIP = { 0x88,0x99,0xaa,0xbb, 0xcc,0xdd,0xee,0xff, 0x00,0x11,0x22,0x33, 0x44,0x55,0x66,0x77 };
+const Packet16uc p16uc_COMPLEX32_XORFLIP = {0x44, 0x55, 0x66, 0x77, 0x00, 0x11, 0x22, 0x33,
+                                            0xcc, 0xdd, 0xee, 0xff, 0x88, 0x99, 0xaa, 0xbb};
+const Packet16uc p16uc_COMPLEX64_XORFLIP = {0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
+                                            0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77};
 
 #ifdef _BIG_ENDIAN
-const Packet16uc p16uc_COMPLEX32_CONJ_XOR  = { 0x00,0x00,0x00,0x00, 0x80,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x80,0x00,0x00,0x00 };
-const Packet16uc p16uc_COMPLEX64_CONJ_XOR  = { 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x80,0x00,0x00,0x00, 0x00,0x00,0x00,0x00 };
-const Packet16uc p16uc_COMPLEX32_CONJ_XOR2 = { 0x80,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x80,0x00,0x00,0x00, 0x00,0x00,0x00,0x00 };
-const Packet16uc p16uc_COMPLEX64_CONJ_XOR2 = { 0x80,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00 };
-const Packet16uc p16uc_COMPLEX32_NEGATE    = { 0x80,0x00,0x00,0x00, 0x80,0x00,0x00,0x00, 0x80,0x00,0x00,0x00, 0x80,0x00,0x00,0x00 };
-const Packet16uc p16uc_COMPLEX64_NEGATE    = { 0x80,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x80,0x00,0x00,0x00, 0x00,0x00,0x00,0x00 };
+const Packet16uc p16uc_COMPLEX32_CONJ_XOR = {0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
+                                             0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00};
+const Packet16uc p16uc_COMPLEX64_CONJ_XOR = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                                             0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+const Packet16uc p16uc_COMPLEX32_CONJ_XOR2 = {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                                              0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+const Packet16uc p16uc_COMPLEX64_CONJ_XOR2 = {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                                              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+const Packet16uc p16uc_COMPLEX32_NEGATE = {0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
+                                           0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00};
+const Packet16uc p16uc_COMPLEX64_NEGATE = {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                                           0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
 #else
-const Packet16uc p16uc_COMPLEX32_CONJ_XOR  = { 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80 };
-const Packet16uc p16uc_COMPLEX64_CONJ_XOR  = { 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80 };
-const Packet16uc p16uc_COMPLEX32_CONJ_XOR2 = { 0x00,0x00,0x00,0x80, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80, 0x00,0x00,0x00,0x00 };
-const Packet16uc p16uc_COMPLEX64_CONJ_XOR2 = { 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00 };
-const Packet16uc p16uc_COMPLEX32_NEGATE    = { 0x00,0x00,0x00,0x80, 0x00,0x00,0x00,0x80, 0x00,0x00,0x00,0x80, 0x00,0x00,0x00,0x80 };
-const Packet16uc p16uc_COMPLEX64_NEGATE    = { 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80 };
+const Packet16uc p16uc_COMPLEX32_CONJ_XOR = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
+                                             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80};
+const Packet16uc p16uc_COMPLEX64_CONJ_XOR = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                                             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80};
+const Packet16uc p16uc_COMPLEX32_CONJ_XOR2 = {0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
+                                              0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00};
+const Packet16uc p16uc_COMPLEX64_CONJ_XOR2 = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
+                                              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+const Packet16uc p16uc_COMPLEX32_NEGATE = {0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
+                                           0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80};
+const Packet16uc p16uc_COMPLEX64_NEGATE = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
+                                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80};
 #endif
 
 #ifdef _BIG_ENDIAN
-#define COMPLEX_DELTA  0
+#define COMPLEX_DELTA 0
 #else
-#define COMPLEX_DELTA  2
+#define COMPLEX_DELTA 2
 #endif
 
 /** \internal packet conjugate (same as pconj but uses the constants in pcplxflipconj for better code generation) */
 EIGEN_ALWAYS_INLINE Packet2cf pconj2(const Packet2cf& a) {
-    return Packet2cf(pxor(a.v, reinterpret_cast<Packet4f>(p16uc_COMPLEX32_CONJ_XOR)));
+  return Packet2cf(pxor(a.v, reinterpret_cast<Packet4f>(p16uc_COMPLEX32_CONJ_XOR)));
 }
 
 EIGEN_ALWAYS_INLINE Packet1cd pconj2(const Packet1cd& a) {
-    return Packet1cd(pxor(a.v, reinterpret_cast<Packet2d>(p16uc_COMPLEX64_CONJ_XOR)));
+  return Packet1cd(pxor(a.v, reinterpret_cast<Packet2d>(p16uc_COMPLEX64_CONJ_XOR)));
 }
 
 /** \internal packet conjugate with real & imaginary operation inverted */
 EIGEN_ALWAYS_INLINE Packet2cf pconjinv(const Packet2cf& a) {
 #ifdef __POWER8_VECTOR__
-    return Packet2cf(Packet4f(vec_neg(Packet2d(a.v))));
+  return Packet2cf(Packet4f(vec_neg(Packet2d(a.v))));
 #else
-    return Packet2cf(pxor(a.v, reinterpret_cast<Packet4f>(p16uc_COMPLEX32_CONJ_XOR2)));
+  return Packet2cf(pxor(a.v, reinterpret_cast<Packet4f>(p16uc_COMPLEX32_CONJ_XOR2)));
 #endif
 }
 
 EIGEN_ALWAYS_INLINE Packet1cd pconjinv(const Packet1cd& a) {
-    return Packet1cd(pxor(a.v, reinterpret_cast<Packet2d>(p16uc_COMPLEX64_CONJ_XOR2)));
+  return Packet1cd(pxor(a.v, reinterpret_cast<Packet2d>(p16uc_COMPLEX64_CONJ_XOR2)));
 }
 
 #if defined(_ARCH_PWR8) && (!EIGEN_COMP_LLVM || __clang_major__ >= 12)
@@ -1067,883 +1035,773 @@
 #endif
 
 /** \internal flip the real & imaginary results and packet conjugate */
-EIGEN_ALWAYS_INLINE Packet2cf pcplxflipconj(Packet2cf a)
-{
+EIGEN_ALWAYS_INLINE Packet2cf pcplxflipconj(Packet2cf a) {
 #ifdef PERMXOR_GOOD
-    return Packet2cf(Packet4f(vec_permxor(Packet16uc(a.v), p16uc_COMPLEX32_CONJ_XOR, p16uc_COMPLEX32_XORFLIP)));
+  return Packet2cf(Packet4f(vec_permxor(Packet16uc(a.v), p16uc_COMPLEX32_CONJ_XOR, p16uc_COMPLEX32_XORFLIP)));
 #else
-    return pcplxflip(pconj2(a));
+  return pcplxflip(pconj2(a));
 #endif
 }
 
-EIGEN_ALWAYS_INLINE Packet1cd pcplxflipconj(Packet1cd a)
-{
+EIGEN_ALWAYS_INLINE Packet1cd pcplxflipconj(Packet1cd a) {
 #ifdef PERMXOR_GOOD
-    return Packet1cd(Packet2d(vec_permxor(Packet16uc(a.v), p16uc_COMPLEX64_CONJ_XOR, p16uc_COMPLEX64_XORFLIP)));
+  return Packet1cd(Packet2d(vec_permxor(Packet16uc(a.v), p16uc_COMPLEX64_CONJ_XOR, p16uc_COMPLEX64_XORFLIP)));
 #else
-    return pcplxflip(pconj2(a));
+  return pcplxflip(pconj2(a));
 #endif
 }
 
 /** \internal packet conjugate and flip the real & imaginary results */
-EIGEN_ALWAYS_INLINE Packet2cf pcplxconjflip(Packet2cf a)
-{
+EIGEN_ALWAYS_INLINE Packet2cf pcplxconjflip(Packet2cf a) {
 #ifdef PERMXOR_GOOD
-    return Packet2cf(Packet4f(vec_permxor(Packet16uc(a.v), p16uc_COMPLEX32_CONJ_XOR2, p16uc_COMPLEX32_XORFLIP)));
+  return Packet2cf(Packet4f(vec_permxor(Packet16uc(a.v), p16uc_COMPLEX32_CONJ_XOR2, p16uc_COMPLEX32_XORFLIP)));
 #else
-    return pconj2(pcplxflip(a));
+  return pconj2(pcplxflip(a));
 #endif
 }
 
-EIGEN_ALWAYS_INLINE Packet1cd pcplxconjflip(Packet1cd a)
-{
+EIGEN_ALWAYS_INLINE Packet1cd pcplxconjflip(Packet1cd a) {
 #ifdef PERMXOR_GOOD
-    return Packet1cd(Packet2d(vec_permxor(Packet16uc(a.v), p16uc_COMPLEX64_CONJ_XOR2, p16uc_COMPLEX64_XORFLIP)));
+  return Packet1cd(Packet2d(vec_permxor(Packet16uc(a.v), p16uc_COMPLEX64_CONJ_XOR2, p16uc_COMPLEX64_XORFLIP)));
 #else
-    return pconj2(pcplxflip(a));
+  return pconj2(pcplxflip(a));
 #endif
 }
 
 /** \internal packet negate */
-EIGEN_ALWAYS_INLINE Packet2cf pnegate2(Packet2cf a)
-{
+EIGEN_ALWAYS_INLINE Packet2cf pnegate2(Packet2cf a) {
 #ifdef __POWER8_VECTOR__
-    return Packet2cf(vec_neg(a.v));
+  return Packet2cf(vec_neg(a.v));
 #else
-    return Packet2cf(pxor(a.v, reinterpret_cast<Packet4f>(p16uc_COMPLEX32_NEGATE)));
+  return Packet2cf(pxor(a.v, reinterpret_cast<Packet4f>(p16uc_COMPLEX32_NEGATE)));
 #endif
 }
 
-EIGEN_ALWAYS_INLINE Packet1cd pnegate2(Packet1cd a)
-{
+EIGEN_ALWAYS_INLINE Packet1cd pnegate2(Packet1cd a) {
 #ifdef __POWER8_VECTOR__
-    return Packet1cd(vec_neg(a.v));
+  return Packet1cd(vec_neg(a.v));
 #else
-    return Packet1cd(pxor(a.v, reinterpret_cast<Packet2d>(p16uc_COMPLEX64_NEGATE)));
+  return Packet1cd(pxor(a.v, reinterpret_cast<Packet2d>(p16uc_COMPLEX64_NEGATE)));
 #endif
 }
 
 /** \internal flip the real & imaginary results and negate */
-EIGEN_ALWAYS_INLINE Packet2cf pcplxflipnegate(Packet2cf a)
-{
+EIGEN_ALWAYS_INLINE Packet2cf pcplxflipnegate(Packet2cf a) {
 #ifdef PERMXOR_GOOD
-    return Packet2cf(Packet4f(vec_permxor(Packet16uc(a.v), p16uc_COMPLEX32_NEGATE, p16uc_COMPLEX32_XORFLIP)));
+  return Packet2cf(Packet4f(vec_permxor(Packet16uc(a.v), p16uc_COMPLEX32_NEGATE, p16uc_COMPLEX32_XORFLIP)));
 #else
-    return pcplxflip(pnegate2(a));
+  return pcplxflip(pnegate2(a));
 #endif
 }
 
-EIGEN_ALWAYS_INLINE Packet1cd pcplxflipnegate(Packet1cd a)
-{
+EIGEN_ALWAYS_INLINE Packet1cd pcplxflipnegate(Packet1cd a) {
 #ifdef PERMXOR_GOOD
-    return Packet1cd(Packet2d(vec_permxor(Packet16uc(a.v), p16uc_COMPLEX64_NEGATE, p16uc_COMPLEX64_XORFLIP)));
+  return Packet1cd(Packet2d(vec_permxor(Packet16uc(a.v), p16uc_COMPLEX64_NEGATE, p16uc_COMPLEX64_XORFLIP)));
 #else
-    return pcplxflip(pnegate2(a));
+  return pcplxflip(pnegate2(a));
 #endif
 }
 
 /** \internal flip the real & imaginary results */
-EIGEN_ALWAYS_INLINE Packet2cf pcplxflip2(Packet2cf a)
-{
-    return Packet2cf(Packet4f(vec_perm(Packet16uc(a.v), Packet16uc(a.v), p16uc_COMPLEX32_XORFLIP)));
+EIGEN_ALWAYS_INLINE Packet2cf pcplxflip2(Packet2cf a) {
+  return Packet2cf(Packet4f(vec_perm(Packet16uc(a.v), Packet16uc(a.v), p16uc_COMPLEX32_XORFLIP)));
 }
 
-EIGEN_ALWAYS_INLINE Packet1cd pcplxflip2(Packet1cd a)
-{
+EIGEN_ALWAYS_INLINE Packet1cd pcplxflip2(Packet1cd a) {
 #ifdef EIGEN_VECTORIZE_VSX
-    return Packet1cd(__builtin_vsx_xxpermdi(a.v, a.v, 2));
+  return Packet1cd(__builtin_vsx_xxpermdi(a.v, a.v, 2));
 #else
-    return Packet1cd(Packet2d(vec_perm(Packet16uc(a.v), Packet16uc(a.v), p16uc_COMPLEX64_XORFLIP)));
+  return Packet1cd(Packet2d(vec_perm(Packet16uc(a.v), Packet16uc(a.v), p16uc_COMPLEX64_XORFLIP)));
 #endif
 }
 
 /** \internal load half a vector with one complex value */
-EIGEN_ALWAYS_INLINE Packet4f pload_complex_half(std::complex<float>* src)
-{
-    Packet4f t;
+EIGEN_ALWAYS_INLINE Packet4f pload_complex_half(std::complex<float>* src) {
+  Packet4f t;
 #ifdef EIGEN_VECTORIZE_VSX
-    // Load float64/two float32 (doubleword alignment)
-    __asm__("lxsdx %x0,%y1" : "=wa" (t) : "Z" (*src));
+  // Load float64/two float32 (doubleword alignment)
+  __asm__("lxsdx %x0,%y1" : "=wa"(t) : "Z"(*src));
 #else
-    *reinterpret_cast<std::complex<float>*>(reinterpret_cast<float*>(&t) + COMPLEX_DELTA) = *src;
+  *reinterpret_cast<std::complex<float>*>(reinterpret_cast<float*>(&t) + COMPLEX_DELTA) = *src;
 #endif
-    return t;
+  return t;
 }
 
 /** \internal load two vectors from the real and imaginary portions of a complex value */
-template<typename RhsScalar>
-EIGEN_ALWAYS_INLINE void pload_realimag(RhsScalar* src, Packet4f& r, Packet4f& i)
-{
+template <typename RhsScalar>
+EIGEN_ALWAYS_INLINE void pload_realimag(RhsScalar* src, Packet4f& r, Packet4f& i) {
 #ifdef _ARCH_PWR9
-    __asm__("lxvwsx %x0,%y1" : "=wa" (r) : "Z" (*(reinterpret_cast<float*>(src) + 0)));
-    __asm__("lxvwsx %x0,%y1" : "=wa" (i) : "Z" (*(reinterpret_cast<float*>(src) + 1)));
+  __asm__("lxvwsx %x0,%y1" : "=wa"(r) : "Z"(*(reinterpret_cast<float*>(src) + 0)));
+  __asm__("lxvwsx %x0,%y1" : "=wa"(i) : "Z"(*(reinterpret_cast<float*>(src) + 1)));
 #else
-    Packet4f t = pload_complex_half(src);
-    r = vec_splat(t, COMPLEX_DELTA + 0);
-    i = vec_splat(t, COMPLEX_DELTA + 1);
+  Packet4f t = pload_complex_half(src);
+  r = vec_splat(t, COMPLEX_DELTA + 0);
+  i = vec_splat(t, COMPLEX_DELTA + 1);
 #endif
 }
 
-template<typename RhsScalar>
-EIGEN_ALWAYS_INLINE void pload_realimag(RhsScalar* src, Packet2d& r, Packet2d& i)
-{
+template <typename RhsScalar>
+EIGEN_ALWAYS_INLINE void pload_realimag(RhsScalar* src, Packet2d& r, Packet2d& i) {
 #ifdef EIGEN_VECTORIZE_VSX
-    __asm__("lxvdsx %x0,%y1" : "=wa" (r) : "Z" (*(reinterpret_cast<double*>(src) + 0)));
-    __asm__("lxvdsx %x0,%y1" : "=wa" (i) : "Z" (*(reinterpret_cast<double*>(src) + 1)));
+  __asm__("lxvdsx %x0,%y1" : "=wa"(r) : "Z"(*(reinterpret_cast<double*>(src) + 0)));
+  __asm__("lxvdsx %x0,%y1" : "=wa"(i) : "Z"(*(reinterpret_cast<double*>(src) + 1)));
 #else
-    Packet2d t = ploadu<Packet2d>(reinterpret_cast<double*>(src));
-    r = vec_splat(t, 0);
-    i = vec_splat(t, 1);
+  Packet2d t = ploadu<Packet2d>(reinterpret_cast<double*>(src));
+  r = vec_splat(t, 0);
+  i = vec_splat(t, 1);
 #endif
 }
 
 #ifndef __POWER8_VECTOR__
-const Packet16uc p16uc_MERGEE = { 0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13, 0x08, 0x09, 0x0A, 0x0B, 0x18, 0x19, 0x1A, 0x1B };
+const Packet16uc p16uc_MERGEE = {0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13,
+                                 0x08, 0x09, 0x0A, 0x0B, 0x18, 0x19, 0x1A, 0x1B};
 
-const Packet16uc p16uc_MERGEO = { 0x04, 0x05, 0x06, 0x07, 0x14, 0x15, 0x16, 0x17, 0x0C, 0x0D, 0x0E, 0x0F, 0x1C, 0x1D, 0x1E, 0x1F };
+const Packet16uc p16uc_MERGEO = {0x04, 0x05, 0x06, 0x07, 0x14, 0x15, 0x16, 0x17,
+                                 0x0C, 0x0D, 0x0E, 0x0F, 0x1C, 0x1D, 0x1E, 0x1F};
 #endif
 
 /** \internal load two vectors from the interleaved real & imaginary values of src */
-template<typename RhsScalar>
-EIGEN_ALWAYS_INLINE void pload_realimag_row(RhsScalar* src, Packet4f& r, Packet4f& i)
-{
-    Packet4f t = ploadu<Packet4f>(reinterpret_cast<float*>(src));
+template <typename RhsScalar>
+EIGEN_ALWAYS_INLINE void pload_realimag_row(RhsScalar* src, Packet4f& r, Packet4f& i) {
+  Packet4f t = ploadu<Packet4f>(reinterpret_cast<float*>(src));
 #ifdef __POWER8_VECTOR__
-    r = vec_mergee(t, t);
-    i = vec_mergeo(t, t);
+  r = vec_mergee(t, t);
+  i = vec_mergeo(t, t);
 #else
-    r = vec_perm(t, t, p16uc_MERGEE);
-    i = vec_perm(t, t, p16uc_MERGEO);
+  r = vec_perm(t, t, p16uc_MERGEE);
+  i = vec_perm(t, t, p16uc_MERGEO);
 #endif
 }
 
-template<typename RhsScalar>
-EIGEN_ALWAYS_INLINE void pload_realimag_row(RhsScalar* src, Packet2d& r, Packet2d& i)
-{
-    return pload_realimag(src, r, i);
+template <typename RhsScalar>
+EIGEN_ALWAYS_INLINE void pload_realimag_row(RhsScalar* src, Packet2d& r, Packet2d& i) {
+  return pload_realimag(src, r, i);
 }
 
 /** \internal load and splat a complex value into a vector - column-wise */
-EIGEN_ALWAYS_INLINE Packet4f pload_realimag_combine(std::complex<float>* src)
-{
+EIGEN_ALWAYS_INLINE Packet4f pload_realimag_combine(std::complex<float>* src) {
 #ifdef EIGEN_VECTORIZE_VSX
-    Packet4f ret;
-    __asm__("lxvdsx %x0,%y1" : "=wa" (ret) : "Z" (*(reinterpret_cast<double*>(src) + 0)));
-    return ret;
+  Packet4f ret;
+  __asm__("lxvdsx %x0,%y1" : "=wa"(ret) : "Z"(*(reinterpret_cast<double*>(src) + 0)));
+  return ret;
 #else
-    return Packet4f(ploaddup<Packet2d>(reinterpret_cast<double *>(src)));
+  return Packet4f(ploaddup<Packet2d>(reinterpret_cast<double*>(src)));
 #endif
 }
 
-EIGEN_ALWAYS_INLINE Packet2d pload_realimag_combine(std::complex<double>* src)
-{
-    return ploadu<Packet1cd>(src).v;
-}
+EIGEN_ALWAYS_INLINE Packet2d pload_realimag_combine(std::complex<double>* src) { return ploadu<Packet1cd>(src).v; }
 
 /** \internal load a complex value into a vector - row-wise */
-EIGEN_ALWAYS_INLINE Packet4f pload_realimag_combine_row(std::complex<float>* src)
-{
-    return ploadu<Packet2cf>(src).v;
-}
+EIGEN_ALWAYS_INLINE Packet4f pload_realimag_combine_row(std::complex<float>* src) { return ploadu<Packet2cf>(src).v; }
 
-EIGEN_ALWAYS_INLINE Packet2d pload_realimag_combine_row(std::complex<double>* src)
-{
-    return ploadu<Packet1cd>(src).v;
-}
+EIGEN_ALWAYS_INLINE Packet2d pload_realimag_combine_row(std::complex<double>* src) { return ploadu<Packet1cd>(src).v; }
 
 /** \internal load a scalar or a vector from complex location */
-template<typename ResPacket>
-EIGEN_ALWAYS_INLINE Packet4f pload_complex(std::complex<float>* src)
-{
-    if (GEMV_IS_SCALAR) {
-        return pload_complex_half(src);
-    }
-    else
-    {
-        return ploadu<Packet4f>(reinterpret_cast<float*>(src));
-    }
+template <typename ResPacket>
+EIGEN_ALWAYS_INLINE Packet4f pload_complex(std::complex<float>* src) {
+  if (GEMV_IS_SCALAR) {
+    return pload_complex_half(src);
+  } else {
+    return ploadu<Packet4f>(reinterpret_cast<float*>(src));
+  }
 }
 
-template<typename ResPacket>
-EIGEN_ALWAYS_INLINE Packet2d pload_complex(std::complex<double>* src)
-{
-    return ploadu<Packet2d>(reinterpret_cast<double*>(src));
+template <typename ResPacket>
+EIGEN_ALWAYS_INLINE Packet2d pload_complex(std::complex<double>* src) {
+  return ploadu<Packet2d>(reinterpret_cast<double*>(src));
 }
 
 /** \internal load from a complex vector and convert to a real vector */
-template<typename ResPacket>
-EIGEN_ALWAYS_INLINE Packet4f pload_complex(Packet2cf* src)
-{
-    return src->v;
+template <typename ResPacket>
+EIGEN_ALWAYS_INLINE Packet4f pload_complex(Packet2cf* src) {
+  return src->v;
 }
 
-template<typename ResPacket>
-EIGEN_ALWAYS_INLINE Packet2d pload_complex(Packet1cd* src)
-{
-    return src->v;
+template <typename ResPacket>
+EIGEN_ALWAYS_INLINE Packet2d pload_complex(Packet1cd* src) {
+  return src->v;
 }
 
 /** \internal load a full vector from complex location - column-wise */
-EIGEN_ALWAYS_INLINE Packet4f pload_complex_full(std::complex<float>* src)
-{
-    return Packet4f(ploaddup<Packet2d>(reinterpret_cast<double *>(src)));
+EIGEN_ALWAYS_INLINE Packet4f pload_complex_full(std::complex<float>* src) {
+  return Packet4f(ploaddup<Packet2d>(reinterpret_cast<double*>(src)));
 }
 
-EIGEN_ALWAYS_INLINE Packet2d pload_complex_full(std::complex<double>* src)
-{
-    return ploadu<Packet1cd>(src).v;
-}
+EIGEN_ALWAYS_INLINE Packet2d pload_complex_full(std::complex<double>* src) { return ploadu<Packet1cd>(src).v; }
 
 /** \internal load a full vector from complex location - row-wise */
-EIGEN_ALWAYS_INLINE Packet4f pload_complex_full_row(std::complex<float>* src)
-{
-    return ploadu<Packet2cf>(src).v;
-}
+EIGEN_ALWAYS_INLINE Packet4f pload_complex_full_row(std::complex<float>* src) { return ploadu<Packet2cf>(src).v; }
 
-EIGEN_ALWAYS_INLINE Packet2d pload_complex_full_row(std::complex<double>* src)
-{
-    return pload_complex_full(src);
-}
+EIGEN_ALWAYS_INLINE Packet2d pload_complex_full_row(std::complex<double>* src) { return pload_complex_full(src); }
 
 /** \internal load a vector from a real-only scalar location - column-wise */
-EIGEN_ALWAYS_INLINE Packet4f pload_real(float* src)
-{
-    return pset1<Packet4f>(*src);
-}
+EIGEN_ALWAYS_INLINE Packet4f pload_real(float* src) { return pset1<Packet4f>(*src); }
 
-EIGEN_ALWAYS_INLINE Packet2d pload_real(double* src)
-{
-    return pset1<Packet2d>(*src);
-}
+EIGEN_ALWAYS_INLINE Packet2d pload_real(double* src) { return pset1<Packet2d>(*src); }
 
-EIGEN_ALWAYS_INLINE Packet4f pload_real(Packet4f& src)
-{
-    return src;
-}
+EIGEN_ALWAYS_INLINE Packet4f pload_real(Packet4f& src) { return src; }
 
-EIGEN_ALWAYS_INLINE Packet2d pload_real(Packet2d& src)
-{
-    return src;
-}
+EIGEN_ALWAYS_INLINE Packet2d pload_real(Packet2d& src) { return src; }
 
 /** \internal load a vector from a real-only vector location */
-EIGEN_ALWAYS_INLINE Packet4f pload_real_full(float* src)
-{
-    Packet4f ret = ploadu<Packet4f>(src);
-    return vec_mergeh(ret, ret);
+EIGEN_ALWAYS_INLINE Packet4f pload_real_full(float* src) {
+  Packet4f ret = ploadu<Packet4f>(src);
+  return vec_mergeh(ret, ret);
 }
 
-EIGEN_ALWAYS_INLINE Packet2d pload_real_full(double* src)
-{
-    return pload_real(src);
+EIGEN_ALWAYS_INLINE Packet2d pload_real_full(double* src) { return pload_real(src); }
+
+EIGEN_ALWAYS_INLINE Packet4f pload_real_full(std::complex<float>* src) {
+  return pload_complex_full(src);  // Just for compilation
 }
 
-EIGEN_ALWAYS_INLINE Packet4f pload_real_full(std::complex<float>* src)
-{
-    return pload_complex_full(src);   // Just for compilation
-}
-
-EIGEN_ALWAYS_INLINE Packet2d pload_real_full(std::complex<double>* src)
-{
-    return pload_complex_full(src);   // Just for compilation
+EIGEN_ALWAYS_INLINE Packet2d pload_real_full(std::complex<double>* src) {
+  return pload_complex_full(src);  // Just for compilation
 }
 
 /** \internal load a vector from a real-only scalar location - row-wise */
-template<typename ResPacket>
-EIGEN_ALWAYS_INLINE Packet4f pload_real_row(float* src)
-{
-    if (GEMV_IS_SCALAR) {
-        return pload_real_full(src);
-    }
-    else {
-        return ploadu<Packet4f>(src);
-    }
+template <typename ResPacket>
+EIGEN_ALWAYS_INLINE Packet4f pload_real_row(float* src) {
+  if (GEMV_IS_SCALAR) {
+    return pload_real_full(src);
+  } else {
+    return ploadu<Packet4f>(src);
+  }
 }
 
-template<typename ResPacket>
-EIGEN_ALWAYS_INLINE Packet2d pload_real_row(double* src)
-{
-    return pload_real(src);
+template <typename ResPacket>
+EIGEN_ALWAYS_INLINE Packet2d pload_real_row(double* src) {
+  return pload_real(src);
 }
 
-EIGEN_ALWAYS_INLINE Packet2cf padd(Packet2cf& a, std::complex<float>& b)
-{
-    EIGEN_UNUSED_VARIABLE(b);
-    return a;  // Just for compilation
+EIGEN_ALWAYS_INLINE Packet2cf padd(Packet2cf& a, std::complex<float>& b) {
+  EIGEN_UNUSED_VARIABLE(b);
+  return a;  // Just for compilation
 }
 
-EIGEN_ALWAYS_INLINE Packet1cd padd(Packet1cd& a, std::complex<double>& b)
-{
-    EIGEN_UNUSED_VARIABLE(b);
-    return a;  // Just for compilation
+EIGEN_ALWAYS_INLINE Packet1cd padd(Packet1cd& a, std::complex<double>& b) {
+  EIGEN_UNUSED_VARIABLE(b);
+  return a;  // Just for compilation
 }
 
 /** \internal set a scalar from complex location */
-template<typename Scalar, typename ResScalar>
-EIGEN_ALWAYS_INLINE Scalar pset1_realimag(ResScalar& alpha, int which, int conj)
-{
-    return (which) ? ((conj) ? -alpha.real() : alpha.real()) : ((conj) ? -alpha.imag() : alpha.imag());
+template <typename Scalar, typename ResScalar>
+EIGEN_ALWAYS_INLINE Scalar pset1_realimag(ResScalar& alpha, int which, int conj) {
+  return (which) ? ((conj) ? -alpha.real() : alpha.real()) : ((conj) ? -alpha.imag() : alpha.imag());
 }
 
 /** \internal set a vector from complex location */
-template<typename Scalar, typename ResScalar, typename ResPacket, int which>
-EIGEN_ALWAYS_INLINE Packet2cf pset1_complex(std::complex<float>& alpha)
-{
-    Packet2cf ret;
-    ret.v[COMPLEX_DELTA + 0] = pset1_realimag<Scalar, ResScalar>(alpha, (which & 0x01), (which & 0x04));
-    ret.v[COMPLEX_DELTA + 1] = pset1_realimag<Scalar, ResScalar>(alpha, (which & 0x02), (which & 0x08));
-    ret.v[2 - COMPLEX_DELTA] = ret.v[COMPLEX_DELTA + 0];
-    ret.v[3 - COMPLEX_DELTA] = ret.v[COMPLEX_DELTA + 1];
-    return ret;
+template <typename Scalar, typename ResScalar, typename ResPacket, int which>
+EIGEN_ALWAYS_INLINE Packet2cf pset1_complex(std::complex<float>& alpha) {
+  Packet2cf ret;
+  ret.v[COMPLEX_DELTA + 0] = pset1_realimag<Scalar, ResScalar>(alpha, (which & 0x01), (which & 0x04));
+  ret.v[COMPLEX_DELTA + 1] = pset1_realimag<Scalar, ResScalar>(alpha, (which & 0x02), (which & 0x08));
+  ret.v[2 - COMPLEX_DELTA] = ret.v[COMPLEX_DELTA + 0];
+  ret.v[3 - COMPLEX_DELTA] = ret.v[COMPLEX_DELTA + 1];
+  return ret;
 }
 
-template<typename Scalar, typename ResScalar, typename ResPacket, int which>
-EIGEN_ALWAYS_INLINE Packet1cd pset1_complex(std::complex<double>& alpha)
-{
-    Packet1cd ret;
-    ret.v[0] = pset1_realimag<Scalar, ResScalar>(alpha, (which & 0x01), (which & 0x04));
-    ret.v[1] = pset1_realimag<Scalar, ResScalar>(alpha, (which & 0x02), (which & 0x08));
-    return ret;
+template <typename Scalar, typename ResScalar, typename ResPacket, int which>
+EIGEN_ALWAYS_INLINE Packet1cd pset1_complex(std::complex<double>& alpha) {
+  Packet1cd ret;
+  ret.v[0] = pset1_realimag<Scalar, ResScalar>(alpha, (which & 0x01), (which & 0x04));
+  ret.v[1] = pset1_realimag<Scalar, ResScalar>(alpha, (which & 0x02), (which & 0x08));
+  return ret;
 }
 
 /** \internal zero out a vector for real or complex forms */
-template<typename Packet>
-EIGEN_ALWAYS_INLINE Packet pset_zero()
-{
-    return pset1<Packet>(__UNPACK_TYPE__(Packet)(0));
+template <typename Packet>
+EIGEN_ALWAYS_INLINE Packet pset_zero() {
+  return pset1<Packet>(__UNPACK_TYPE__(Packet)(0));
 }
 
-template<>
-EIGEN_ALWAYS_INLINE Packet2cf pset_zero<Packet2cf>()
-{
-    return Packet2cf(pset1<Packet4f>(float(0)));
+template <>
+EIGEN_ALWAYS_INLINE Packet2cf pset_zero<Packet2cf>() {
+  return Packet2cf(pset1<Packet4f>(float(0)));
 }
 
-template<>
-EIGEN_ALWAYS_INLINE Packet1cd pset_zero<Packet1cd>()
-{
-    return Packet1cd(pset1<Packet2d>(double(0)));
+template <>
+EIGEN_ALWAYS_INLINE Packet1cd pset_zero<Packet1cd>() {
+  return Packet1cd(pset1<Packet2d>(double(0)));
 }
 
 /** \internal initialize a vector from another vector */
-template<typename Packet, typename LhsPacket, typename RhsPacket>
-EIGEN_ALWAYS_INLINE Packet pset_init(Packet& c1)
-{
-    if (GEMV_IS_COMPLEX_COMPLEX) {
-        EIGEN_UNUSED_VARIABLE(c1);
-        return pset_zero<Packet>();
-    }
-    else
-    {
-        return c1;  // Intentionally left uninitialized
-    }
+template <typename Packet, typename LhsPacket, typename RhsPacket>
+EIGEN_ALWAYS_INLINE Packet pset_init(Packet& c1) {
+  if (GEMV_IS_COMPLEX_COMPLEX) {
+    EIGEN_UNUSED_VARIABLE(c1);
+    return pset_zero<Packet>();
+  } else {
+    return c1;  // Intentionally left uninitialized
+  }
 }
 
-template<typename PResPacket, typename ResPacket, typename ResScalar, typename Scalar>
-struct alpha_store
-{
-    alpha_store(ResScalar& alpha) {
-        separate.r = pset1_complex<Scalar, ResScalar, ResPacket, 0x3>(alpha);
-        separate.i = pset1_complex<Scalar, ResScalar, ResPacket, 0x0>(alpha);
-    }
-    struct ri {
-        PResPacket r;
-        PResPacket i;
-    } separate;
+template <typename PResPacket, typename ResPacket, typename ResScalar, typename Scalar>
+struct alpha_store {
+  alpha_store(ResScalar& alpha) {
+    separate.r = pset1_complex<Scalar, ResScalar, ResPacket, 0x3>(alpha);
+    separate.i = pset1_complex<Scalar, ResScalar, ResPacket, 0x0>(alpha);
+  }
+  struct ri {
+    PResPacket r;
+    PResPacket i;
+  } separate;
 };
 
 /** \internal multiply and add for complex math */
-template<typename ScalarPacket, typename AlphaData>
-EIGEN_ALWAYS_INLINE ScalarPacket pmadd_complex(ScalarPacket& c0, ScalarPacket& c2, ScalarPacket& c4, AlphaData& b0)
-{
-    return pmadd(c2, b0.separate.i.v, pmadd(c0, b0.separate.r.v, c4));
+template <typename ScalarPacket, typename AlphaData>
+EIGEN_ALWAYS_INLINE ScalarPacket pmadd_complex(ScalarPacket& c0, ScalarPacket& c2, ScalarPacket& c4, AlphaData& b0) {
+  return pmadd(c2, b0.separate.i.v, pmadd(c0, b0.separate.r.v, c4));
 }
 
 /** \internal store and madd for complex math */
-template<typename Scalar, typename ScalarPacket, typename PResPacket, typename ResPacket, typename ResScalar, typename AlphaData>
-EIGEN_ALWAYS_INLINE void pstoreu_pmadd_complex(PResPacket& c0, AlphaData& b0, ResScalar* res)
-{
-    PResPacket c2 = pcplxflipconj(c0);
-    if (GEMV_IS_SCALAR) {
-        ScalarPacket c4 = ploadu<ScalarPacket>(reinterpret_cast<Scalar*>(res));
-        ScalarPacket c3 = pmadd_complex<ScalarPacket, AlphaData>(c0.v, c2.v, c4, b0);
-        pstoreu(reinterpret_cast<Scalar*>(res), c3);
-    } else {
-        ScalarPacket c4 = pload_complex<ResPacket>(res);
-        PResPacket c3 = PResPacket(pmadd_complex<ScalarPacket, AlphaData>(c0.v, c2.v, c4, b0));
-        pstoreu(res, c3);
-    }
+template <typename Scalar, typename ScalarPacket, typename PResPacket, typename ResPacket, typename ResScalar,
+          typename AlphaData>
+EIGEN_ALWAYS_INLINE void pstoreu_pmadd_complex(PResPacket& c0, AlphaData& b0, ResScalar* res) {
+  PResPacket c2 = pcplxflipconj(c0);
+  if (GEMV_IS_SCALAR) {
+    ScalarPacket c4 = ploadu<ScalarPacket>(reinterpret_cast<Scalar*>(res));
+    ScalarPacket c3 = pmadd_complex<ScalarPacket, AlphaData>(c0.v, c2.v, c4, b0);
+    pstoreu(reinterpret_cast<Scalar*>(res), c3);
+  } else {
+    ScalarPacket c4 = pload_complex<ResPacket>(res);
+    PResPacket c3 = PResPacket(pmadd_complex<ScalarPacket, AlphaData>(c0.v, c2.v, c4, b0));
+    pstoreu(res, c3);
+  }
 }
 
-template<typename ScalarPacket, typename PResPacket, typename ResPacket, typename ResScalar, typename AlphaData, Index ResPacketSize, Index iter2>
-EIGEN_ALWAYS_INLINE void pstoreu_pmadd_complex(PResPacket& c0, PResPacket& c1, AlphaData& b0, ResScalar* res)
-{
-    PResPacket c2 = pcplxflipconj(c0);
-    PResPacket c3 = pcplxflipconj(c1);
+template <typename ScalarPacket, typename PResPacket, typename ResPacket, typename ResScalar, typename AlphaData,
+          Index ResPacketSize, Index iter2>
+EIGEN_ALWAYS_INLINE void pstoreu_pmadd_complex(PResPacket& c0, PResPacket& c1, AlphaData& b0, ResScalar* res) {
+  PResPacket c2 = pcplxflipconj(c0);
+  PResPacket c3 = pcplxflipconj(c1);
 #if !defined(_ARCH_PWR10)
-    ScalarPacket c4 = pload_complex<ResPacket>(res + (iter2 * ResPacketSize));
-    ScalarPacket c5 = pload_complex<ResPacket>(res + ((iter2 + 1) * ResPacketSize));
-    PResPacket c6 = PResPacket(pmadd_complex<ScalarPacket, AlphaData>(c0.v, c2.v, c4, b0));
-    PResPacket c7 = PResPacket(pmadd_complex<ScalarPacket, AlphaData>(c1.v, c3.v, c5, b0));
-    pstoreu(res + (iter2 * ResPacketSize), c6);
-    pstoreu(res + ((iter2 + 1) * ResPacketSize), c7);
+  ScalarPacket c4 = pload_complex<ResPacket>(res + (iter2 * ResPacketSize));
+  ScalarPacket c5 = pload_complex<ResPacket>(res + ((iter2 + 1) * ResPacketSize));
+  PResPacket c6 = PResPacket(pmadd_complex<ScalarPacket, AlphaData>(c0.v, c2.v, c4, b0));
+  PResPacket c7 = PResPacket(pmadd_complex<ScalarPacket, AlphaData>(c1.v, c3.v, c5, b0));
+  pstoreu(res + (iter2 * ResPacketSize), c6);
+  pstoreu(res + ((iter2 + 1) * ResPacketSize), c7);
 #else
-    __vector_pair a = *reinterpret_cast<__vector_pair *>(res + (iter2 * ResPacketSize));
+  __vector_pair a = *reinterpret_cast<__vector_pair*>(res + (iter2 * ResPacketSize));
 #if EIGEN_COMP_LLVM
-    PResPacket c6[2];
-    __builtin_vsx_disassemble_pair(reinterpret_cast<void*>(c6), &a);
-    c6[0] = PResPacket(pmadd_complex<ScalarPacket, AlphaData>(c0.v, c2.v, c6[0].v, b0));
-    c6[1] = PResPacket(pmadd_complex<ScalarPacket, AlphaData>(c1.v, c3.v, c6[1].v, b0));
-    GEMV_BUILDPAIR_MMA(a, c6[0].v, c6[1].v);
+  PResPacket c6[2];
+  __builtin_vsx_disassemble_pair(reinterpret_cast<void*>(c6), &a);
+  c6[0] = PResPacket(pmadd_complex<ScalarPacket, AlphaData>(c0.v, c2.v, c6[0].v, b0));
+  c6[1] = PResPacket(pmadd_complex<ScalarPacket, AlphaData>(c1.v, c3.v, c6[1].v, b0));
+  GEMV_BUILDPAIR_MMA(a, c6[0].v, c6[1].v);
 #else
-    if (GEMV_IS_COMPLEX_FLOAT) {
-        __asm__ ("xvmaddasp %L0,%x1,%x2\n\txvmaddasp %0,%x1,%x3" : "+&d" (a) : "wa" (b0.separate.r.v), "wa" (c0.v), "wa" (c1.v));
-        __asm__ ("xvmaddasp %L0,%x1,%x2\n\txvmaddasp %0,%x1,%x3" : "+&d" (a) : "wa" (b0.separate.i.v), "wa" (c2.v), "wa" (c3.v));
-    } else {
-        __asm__ ("xvmaddadp %L0,%x1,%x2\n\txvmaddadp %0,%x1,%x3" : "+&d" (a) : "wa" (b0.separate.r.v), "wa" (c0.v), "wa" (c1.v));
-        __asm__ ("xvmaddadp %L0,%x1,%x2\n\txvmaddadp %0,%x1,%x3" : "+&d" (a) : "wa" (b0.separate.i.v), "wa" (c2.v), "wa" (c3.v));
-    }
+  if (GEMV_IS_COMPLEX_FLOAT) {
+    __asm__("xvmaddasp %L0,%x1,%x2\n\txvmaddasp %0,%x1,%x3" : "+&d"(a) : "wa"(b0.separate.r.v), "wa"(c0.v), "wa"(c1.v));
+    __asm__("xvmaddasp %L0,%x1,%x2\n\txvmaddasp %0,%x1,%x3" : "+&d"(a) : "wa"(b0.separate.i.v), "wa"(c2.v), "wa"(c3.v));
+  } else {
+    __asm__("xvmaddadp %L0,%x1,%x2\n\txvmaddadp %0,%x1,%x3" : "+&d"(a) : "wa"(b0.separate.r.v), "wa"(c0.v), "wa"(c1.v));
+    __asm__("xvmaddadp %L0,%x1,%x2\n\txvmaddadp %0,%x1,%x3" : "+&d"(a) : "wa"(b0.separate.i.v), "wa"(c2.v), "wa"(c3.v));
+  }
 #endif
-    *reinterpret_cast<__vector_pair *>(res + (iter2 * ResPacketSize)) = a;
+  *reinterpret_cast<__vector_pair*>(res + (iter2 * ResPacketSize)) = a;
 #endif
 }
 
 /** \internal load lhs packet */
-template<typename Scalar, typename LhsScalar, typename LhsMapper, typename LhsPacket>
-EIGEN_ALWAYS_INLINE LhsPacket loadLhsPacket(LhsMapper& lhs, Index i, Index j)
-{
-    if (sizeof(Scalar) == sizeof(LhsScalar)) {
-        const LhsScalar& src = lhs(i + 0, j);
-        return LhsPacket(pload_real_full(const_cast<LhsScalar*>(&src)));
-    }
-    return lhs.template load<LhsPacket, Unaligned>(i + 0, j);
+template <typename Scalar, typename LhsScalar, typename LhsMapper, typename LhsPacket>
+EIGEN_ALWAYS_INLINE LhsPacket loadLhsPacket(LhsMapper& lhs, Index i, Index j) {
+  if (sizeof(Scalar) == sizeof(LhsScalar)) {
+    const LhsScalar& src = lhs(i + 0, j);
+    return LhsPacket(pload_real_full(const_cast<LhsScalar*>(&src)));
+  }
+  return lhs.template load<LhsPacket, Unaligned>(i + 0, j);
 }
 
 /** \internal madd for complex times complex */
-template<typename ComplexPacket, typename RealPacket, bool ConjugateLhs, bool ConjugateRhs, bool Negate>
-EIGEN_ALWAYS_INLINE RealPacket pmadd_complex_complex(RealPacket& a, RealPacket& b, RealPacket& c)
-{
-    if (ConjugateLhs && ConjugateRhs) {
-        return vec_madd(a, pconj2(ComplexPacket(b)).v, c);
-    }
-    else if (Negate && !ConjugateLhs && ConjugateRhs) {
-        return vec_nmsub(a, b, c);
-    }
-    else {
-        return vec_madd(a, b, c);
-    }
+template <typename ComplexPacket, typename RealPacket, bool ConjugateLhs, bool ConjugateRhs, bool Negate>
+EIGEN_ALWAYS_INLINE RealPacket pmadd_complex_complex(RealPacket& a, RealPacket& b, RealPacket& c) {
+  if (ConjugateLhs && ConjugateRhs) {
+    return vec_madd(a, pconj2(ComplexPacket(b)).v, c);
+  } else if (Negate && !ConjugateLhs && ConjugateRhs) {
+    return vec_nmsub(a, b, c);
+  } else {
+    return vec_madd(a, b, c);
+  }
 }
 
 /** \internal madd for complex times real */
-template<typename ComplexPacket, typename RealPacket, bool Conjugate>
-EIGEN_ALWAYS_INLINE RealPacket pmadd_complex_real(RealPacket& a, RealPacket& b, RealPacket& c)
-{
-    if (Conjugate) {
-        return vec_madd(a, pconj2(ComplexPacket(b)).v, c);
-    }
-    else {
-        return vec_madd(a, b, c);
-    }
+template <typename ComplexPacket, typename RealPacket, bool Conjugate>
+EIGEN_ALWAYS_INLINE RealPacket pmadd_complex_real(RealPacket& a, RealPacket& b, RealPacket& c) {
+  if (Conjugate) {
+    return vec_madd(a, pconj2(ComplexPacket(b)).v, c);
+  } else {
+    return vec_madd(a, b, c);
+  }
 }
 
-template<typename LhsPacket, typename RhsScalar, typename RhsPacket, typename PResPacket, bool ConjugateLhs, bool ConjugateRhs, int StorageOrder>
-EIGEN_ALWAYS_INLINE void gemv_mult_generic(LhsPacket& a0, RhsScalar* b, PResPacket& c0)
-{
-    conj_helper<LhsPacket, RhsPacket, ConjugateLhs, ConjugateRhs> pcj;
-    RhsPacket b0;
-    if (StorageOrder == ColMajor) {
-        b0 = pset1<RhsPacket>(*b);
-    }
-    else {
-        b0 = ploadu<RhsPacket>(b);
-    }
-    c0 = pcj.pmadd(a0, b0, c0);
+template <typename LhsPacket, typename RhsScalar, typename RhsPacket, typename PResPacket, bool ConjugateLhs,
+          bool ConjugateRhs, int StorageOrder>
+EIGEN_ALWAYS_INLINE void gemv_mult_generic(LhsPacket& a0, RhsScalar* b, PResPacket& c0) {
+  conj_helper<LhsPacket, RhsPacket, ConjugateLhs, ConjugateRhs> pcj;
+  RhsPacket b0;
+  if (StorageOrder == ColMajor) {
+    b0 = pset1<RhsPacket>(*b);
+  } else {
+    b0 = ploadu<RhsPacket>(b);
+  }
+  c0 = pcj.pmadd(a0, b0, c0);
 }
 
 /** \internal core multiply operation for vectors - complex times complex */
-template<typename ScalarPacket, typename LhsPacket, typename RhsScalar, typename RhsPacket, typename PResPacket, typename ResPacket, bool ConjugateLhs, bool ConjugateRhs, int StorageOrder>
-EIGEN_ALWAYS_INLINE void gemv_mult_complex_complex(LhsPacket& a0, RhsScalar* b, PResPacket& c0, ResPacket& c1)
-{
-    ScalarPacket br, bi;
-    if (StorageOrder == ColMajor) {
-        pload_realimag<RhsScalar>(b, br, bi);
-    }
-    else {
-        pload_realimag_row<RhsScalar>(b, br, bi);
-    }
-    if (ConjugateLhs && !ConjugateRhs) a0 = pconj2(a0);
-    LhsPacket a1 = pcplxflipconj(a0);
-    ScalarPacket cr = pmadd_complex_complex<LhsPacket, ScalarPacket, ConjugateLhs, ConjugateRhs, false>(a0.v, br, c0.v);
-    ScalarPacket ci = pmadd_complex_complex<LhsPacket, ScalarPacket, ConjugateLhs, ConjugateRhs, true>(a1.v, bi, c1.v);
-    c1 = ResPacket(ci);
-    c0 = PResPacket(cr);
+template <typename ScalarPacket, typename LhsPacket, typename RhsScalar, typename RhsPacket, typename PResPacket,
+          typename ResPacket, bool ConjugateLhs, bool ConjugateRhs, int StorageOrder>
+EIGEN_ALWAYS_INLINE void gemv_mult_complex_complex(LhsPacket& a0, RhsScalar* b, PResPacket& c0, ResPacket& c1) {
+  ScalarPacket br, bi;
+  if (StorageOrder == ColMajor) {
+    pload_realimag<RhsScalar>(b, br, bi);
+  } else {
+    pload_realimag_row<RhsScalar>(b, br, bi);
+  }
+  if (ConjugateLhs && !ConjugateRhs) a0 = pconj2(a0);
+  LhsPacket a1 = pcplxflipconj(a0);
+  ScalarPacket cr = pmadd_complex_complex<LhsPacket, ScalarPacket, ConjugateLhs, ConjugateRhs, false>(a0.v, br, c0.v);
+  ScalarPacket ci = pmadd_complex_complex<LhsPacket, ScalarPacket, ConjugateLhs, ConjugateRhs, true>(a1.v, bi, c1.v);
+  c1 = ResPacket(ci);
+  c0 = PResPacket(cr);
 }
 
 /** \internal core multiply operation for vectors - real times complex */
-template<typename ScalarPacket, typename LhsPacket, typename RhsScalar, typename RhsPacket, typename PResPacket, typename ResPacket, bool ConjugateLhs, bool ConjugateRhs, int StorageOrder>
-EIGEN_ALWAYS_INLINE void gemv_mult_real_complex(LhsPacket& a0, RhsScalar* b, PResPacket& c0)
-{
-    ScalarPacket b0;
-    if (StorageOrder == ColMajor) {
-        b0 = pload_complex_full(b);
-    }
-    else {
-        b0 = pload_complex_full_row(b);
-    }
-    ScalarPacket cri = pmadd_complex_real<PResPacket, ScalarPacket, ConjugateRhs>(a0, b0, c0.v);
-    c0 = PResPacket(cri);
+template <typename ScalarPacket, typename LhsPacket, typename RhsScalar, typename RhsPacket, typename PResPacket,
+          typename ResPacket, bool ConjugateLhs, bool ConjugateRhs, int StorageOrder>
+EIGEN_ALWAYS_INLINE void gemv_mult_real_complex(LhsPacket& a0, RhsScalar* b, PResPacket& c0) {
+  ScalarPacket b0;
+  if (StorageOrder == ColMajor) {
+    b0 = pload_complex_full(b);
+  } else {
+    b0 = pload_complex_full_row(b);
+  }
+  ScalarPacket cri = pmadd_complex_real<PResPacket, ScalarPacket, ConjugateRhs>(a0, b0, c0.v);
+  c0 = PResPacket(cri);
 }
 
 /** \internal core multiply operation for vectors - complex times real */
-template<typename ScalarPacket, typename LhsPacket, typename RhsScalar, typename RhsPacket, typename PResPacket, typename ResPacket, bool ConjugateLhs, bool ConjugateRhs, int StorageOrder>
-EIGEN_ALWAYS_INLINE void gemv_mult_complex_real(LhsPacket& a0, RhsScalar* b, PResPacket& c0)
-{
-    ScalarPacket a1 = pload_complex<ResPacket>(&a0);
-    ScalarPacket b0;
-    if (StorageOrder == ColMajor) {
-        b0 = pload_real(b);
-    }
-    else {
-        b0 = pload_real_row<ResPacket>(b);
-    }
-    ScalarPacket cri = pmadd_complex_real<PResPacket, ScalarPacket, ConjugateLhs>(a1, b0, c0.v);
-    c0 = PResPacket(cri);
+template <typename ScalarPacket, typename LhsPacket, typename RhsScalar, typename RhsPacket, typename PResPacket,
+          typename ResPacket, bool ConjugateLhs, bool ConjugateRhs, int StorageOrder>
+EIGEN_ALWAYS_INLINE void gemv_mult_complex_real(LhsPacket& a0, RhsScalar* b, PResPacket& c0) {
+  ScalarPacket a1 = pload_complex<ResPacket>(&a0);
+  ScalarPacket b0;
+  if (StorageOrder == ColMajor) {
+    b0 = pload_real(b);
+  } else {
+    b0 = pload_real_row<ResPacket>(b);
+  }
+  ScalarPacket cri = pmadd_complex_real<PResPacket, ScalarPacket, ConjugateLhs>(a1, b0, c0.v);
+  c0 = PResPacket(cri);
 }
 
-#define GEMV_MULT_COMPLEX_COMPLEX(LhsType, RhsType, ResType) \
-template<typename ScalarPacket, typename LhsPacket, typename RhsScalar, typename RhsPacket, typename PResPacket, typename ResPacket, bool ConjugateLhs, bool ConjugateRhs, int StorageOrder> \
-EIGEN_ALWAYS_INLINE void gemv_mult_complex(LhsType& a0, RhsType* b, ResType& c0, ResType& c1) \
-{ \
-    gemv_mult_complex_complex<ScalarPacket, LhsPacket, RhsScalar, RhsPacket, PResPacket, ResPacket, ConjugateLhs, ConjugateRhs, StorageOrder>(a0, b, c0, c1); \
-}
+#define GEMV_MULT_COMPLEX_COMPLEX(LhsType, RhsType, ResType)                                                        \
+  template <typename ScalarPacket, typename LhsPacket, typename RhsScalar, typename RhsPacket, typename PResPacket, \
+            typename ResPacket, bool ConjugateLhs, bool ConjugateRhs, int StorageOrder>                             \
+  EIGEN_ALWAYS_INLINE void gemv_mult_complex(LhsType& a0, RhsType* b, ResType& c0, ResType& c1) {                   \
+    gemv_mult_complex_complex<ScalarPacket, LhsPacket, RhsScalar, RhsPacket, PResPacket, ResPacket, ConjugateLhs,   \
+                              ConjugateRhs, StorageOrder>(a0, b, c0, c1);                                           \
+  }
 
-GEMV_MULT_COMPLEX_COMPLEX(Packet2cf, std::complex<float>,  Packet2cf)
+GEMV_MULT_COMPLEX_COMPLEX(Packet2cf, std::complex<float>, Packet2cf)
 GEMV_MULT_COMPLEX_COMPLEX(Packet1cd, std::complex<double>, Packet1cd)
 
-#define GEMV_MULT_REAL_COMPLEX(LhsType, RhsType, ResType) \
-template<typename ScalarPacket, typename LhsPacket, typename RhsScalar, typename RhsPacket, typename PResPacket, typename ResPacket, bool ConjugateLhs, bool ConjugateRhs, int StorageOrder> \
-EIGEN_ALWAYS_INLINE void gemv_mult_complex(LhsType& a0, RhsType* b, ResType& c0, RhsType&) \
-{ \
-    gemv_mult_real_complex<ScalarPacket, LhsPacket, RhsScalar, RhsPacket, PResPacket, ResPacket, ConjugateLhs, ConjugateRhs, StorageOrder>(a0, b, c0); \
-}
+#define GEMV_MULT_REAL_COMPLEX(LhsType, RhsType, ResType)                                                           \
+  template <typename ScalarPacket, typename LhsPacket, typename RhsScalar, typename RhsPacket, typename PResPacket, \
+            typename ResPacket, bool ConjugateLhs, bool ConjugateRhs, int StorageOrder>                             \
+  EIGEN_ALWAYS_INLINE void gemv_mult_complex(LhsType& a0, RhsType* b, ResType& c0, RhsType&) {                      \
+    gemv_mult_real_complex<ScalarPacket, LhsPacket, RhsScalar, RhsPacket, PResPacket, ResPacket, ConjugateLhs,      \
+                           ConjugateRhs, StorageOrder>(a0, b, c0);                                                  \
+  }
 
-GEMV_MULT_REAL_COMPLEX(float,    std::complex<float>,  Packet2cf)
-GEMV_MULT_REAL_COMPLEX(double,   std::complex<double>, Packet1cd)
-GEMV_MULT_REAL_COMPLEX(Packet4f, std::complex<float>,  Packet2cf)
+GEMV_MULT_REAL_COMPLEX(float, std::complex<float>, Packet2cf)
+GEMV_MULT_REAL_COMPLEX(double, std::complex<double>, Packet1cd)
+GEMV_MULT_REAL_COMPLEX(Packet4f, std::complex<float>, Packet2cf)
 GEMV_MULT_REAL_COMPLEX(Packet2d, std::complex<double>, Packet1cd)
 
-#define GEMV_MULT_COMPLEX_REAL(LhsType, RhsType, ResType1, ResType2) \
-template<typename ScalarPacket, typename LhsPacket, typename RhsScalar, typename RhsPacket, typename PResPacket, typename ResPacket, bool ConjugateLhs, bool ConjugateRhs, int StorageOrder> \
-EIGEN_ALWAYS_INLINE void gemv_mult_complex(LhsType& a0, RhsType* b, ResType1& c0, ResType2&) \
-{ \
-    gemv_mult_complex_real<ScalarPacket, LhsPacket, RhsScalar, RhsPacket, PResPacket, ResPacket, ConjugateLhs, ConjugateRhs, StorageOrder>(a0, b, c0); \
-}
+#define GEMV_MULT_COMPLEX_REAL(LhsType, RhsType, ResType1, ResType2)                                                \
+  template <typename ScalarPacket, typename LhsPacket, typename RhsScalar, typename RhsPacket, typename PResPacket, \
+            typename ResPacket, bool ConjugateLhs, bool ConjugateRhs, int StorageOrder>                             \
+  EIGEN_ALWAYS_INLINE void gemv_mult_complex(LhsType& a0, RhsType* b, ResType1& c0, ResType2&) {                    \
+    gemv_mult_complex_real<ScalarPacket, LhsPacket, RhsScalar, RhsPacket, PResPacket, ResPacket, ConjugateLhs,      \
+                           ConjugateRhs, StorageOrder>(a0, b, c0);                                                  \
+  }
 
-GEMV_MULT_COMPLEX_REAL(Packet2cf,             float, Packet2cf, std::complex<float>)
-GEMV_MULT_COMPLEX_REAL(Packet1cd,            double, Packet1cd, std::complex<double>)
-GEMV_MULT_COMPLEX_REAL(std::complex<float>,   float, Packet2cf, std::complex<float>)
+GEMV_MULT_COMPLEX_REAL(Packet2cf, float, Packet2cf, std::complex<float>)
+GEMV_MULT_COMPLEX_REAL(Packet1cd, double, Packet1cd, std::complex<double>)
+GEMV_MULT_COMPLEX_REAL(std::complex<float>, float, Packet2cf, std::complex<float>)
 GEMV_MULT_COMPLEX_REAL(std::complex<double>, double, Packet1cd, std::complex<double>)
 
 #ifdef USE_GEMV_MMA
 /** \internal convert packet to real form */
-template<typename T>
-EIGEN_ALWAYS_INLINE T convertReal(T a)
-{
-    return a;
+template <typename T>
+EIGEN_ALWAYS_INLINE T convertReal(T a) {
+  return a;
 }
 
-EIGEN_ALWAYS_INLINE Packet4f convertReal(Packet2cf a)
-{
-    return a.v;
-}
+EIGEN_ALWAYS_INLINE Packet4f convertReal(Packet2cf a) { return a.v; }
 
-EIGEN_ALWAYS_INLINE Packet2d convertReal(Packet1cd a)
-{
-    return a.v;
-}
+EIGEN_ALWAYS_INLINE Packet2d convertReal(Packet1cd a) { return a.v; }
 
 /** \internal convert packet to complex form */
-template<typename T>
-EIGEN_ALWAYS_INLINE T convertComplex(T a)
-{
-    return a;
+template <typename T>
+EIGEN_ALWAYS_INLINE T convertComplex(T a) {
+  return a;
 }
 
-EIGEN_ALWAYS_INLINE Packet2cf convertComplex(Packet4f a)
-{
-    return Packet2cf(a);
-}
+EIGEN_ALWAYS_INLINE Packet2cf convertComplex(Packet4f a) { return Packet2cf(a); }
 
-EIGEN_ALWAYS_INLINE Packet1cd convertComplex(Packet2d a)
-{
-    return Packet1cd(a);
-}
+EIGEN_ALWAYS_INLINE Packet1cd convertComplex(Packet2d a) { return Packet1cd(a); }
 
 /** \internal load a vector from a complex location (for MMA version) */
-template<typename ScalarPacket, typename LhsPacket, typename SLhsPacket, typename ResPacket>
-EIGEN_ALWAYS_INLINE void pload_complex_MMA(SLhsPacket& a)
-{
-    a = SLhsPacket(pload_complex<ResPacket>(&a));
+template <typename ScalarPacket, typename LhsPacket, typename SLhsPacket, typename ResPacket>
+EIGEN_ALWAYS_INLINE void pload_complex_MMA(SLhsPacket& a) {
+  a = SLhsPacket(pload_complex<ResPacket>(&a));
 }
 
-template<typename ScalarPacket, typename LhsPacket, typename SLhsPacket, typename ResPacket>
-EIGEN_ALWAYS_INLINE void pload_complex_MMA(__vector_pair&)
-{
-    // Pass thru
+template <typename ScalarPacket, typename LhsPacket, typename SLhsPacket, typename ResPacket>
+EIGEN_ALWAYS_INLINE void pload_complex_MMA(__vector_pair&) {
+  // Pass thru
 }
 
 /** \internal perform a matrix multiply and accumulate (positive and negative) of packet a and packet b */
-template<typename LhsPacket, typename RhsPacket, bool NegativeAccumulate>
-EIGEN_ALWAYS_INLINE void pger_vecMMA(__vector_quad* acc, RhsPacket& a, LhsPacket& b)
-{
-    if (NegativeAccumulate)
-    {
-        __builtin_mma_xvf32gernp(acc, (__vector unsigned char)a, (__vector unsigned char)b);
-    }
-    else {
-        __builtin_mma_xvf32gerpp(acc, (__vector unsigned char)a, (__vector unsigned char)b);
-    }
+template <typename LhsPacket, typename RhsPacket, bool NegativeAccumulate>
+EIGEN_ALWAYS_INLINE void pger_vecMMA(__vector_quad* acc, RhsPacket& a, LhsPacket& b) {
+  if (NegativeAccumulate) {
+    __builtin_mma_xvf32gernp(acc, (__vector unsigned char)a, (__vector unsigned char)b);
+  } else {
+    __builtin_mma_xvf32gerpp(acc, (__vector unsigned char)a, (__vector unsigned char)b);
+  }
 }
 
 /** \internal perform a matrix multiply and accumulate (positive and negative) of vector_pair a and packet b */
-template<typename LhsPacket, typename RhsPacket, bool NegativeAccumulate>
-EIGEN_ALWAYS_INLINE void pger_vecMMA(__vector_quad* acc, __vector_pair& a, Packet2d& b)
-{
-    if (NegativeAccumulate)
-    {
-        __builtin_mma_xvf64gernp(acc, (__vector_pair)a, (__vector unsigned char)b);
-    }
-    else {
-        __builtin_mma_xvf64gerpp(acc, (__vector_pair)a, (__vector unsigned char)b);
-    }
+template <typename LhsPacket, typename RhsPacket, bool NegativeAccumulate>
+EIGEN_ALWAYS_INLINE void pger_vecMMA(__vector_quad* acc, __vector_pair& a, Packet2d& b) {
+  if (NegativeAccumulate) {
+    __builtin_mma_xvf64gernp(acc, (__vector_pair)a, (__vector unsigned char)b);
+  } else {
+    __builtin_mma_xvf64gerpp(acc, (__vector_pair)a, (__vector unsigned char)b);
+  }
 }
 
-template<typename LhsPacket, typename RhsPacket, bool NegativeAccumulate>
-EIGEN_ALWAYS_INLINE void pger_vecMMA(__vector_quad*, __vector_pair&, Packet4f&)
-{
-    // Just for compilation
+template <typename LhsPacket, typename RhsPacket, bool NegativeAccumulate>
+EIGEN_ALWAYS_INLINE void pger_vecMMA(__vector_quad*, __vector_pair&, Packet4f&) {
+  // Just for compilation
 }
 
 /** \internal madd for complex times complex (MMA version) */
-template<typename RealPacket, typename LhsPacket, bool ConjugateLhs, bool ConjugateRhs, bool Negate>
-EIGEN_ALWAYS_INLINE void pmadd_complex_complex_MMA(LhsPacket& a, RealPacket& b, __vector_quad* c)
-{
-    if (ConjugateLhs && ConjugateRhs) {
-        RealPacket b2 = pconj2(convertComplex(b)).v;
-        return pger_vecMMA<RealPacket, RealPacket, false>(c, b2, a.v);
-    }
-    else if (Negate && !ConjugateLhs && ConjugateRhs) {
-        return pger_vecMMA<RealPacket, RealPacket, true>(c, b, a.v);
-    }
-    else {
-        return pger_vecMMA<RealPacket, RealPacket, false>(c, b, a.v);
-    }
+template <typename RealPacket, typename LhsPacket, bool ConjugateLhs, bool ConjugateRhs, bool Negate>
+EIGEN_ALWAYS_INLINE void pmadd_complex_complex_MMA(LhsPacket& a, RealPacket& b, __vector_quad* c) {
+  if (ConjugateLhs && ConjugateRhs) {
+    RealPacket b2 = pconj2(convertComplex(b)).v;
+    return pger_vecMMA<RealPacket, RealPacket, false>(c, b2, a.v);
+  } else if (Negate && !ConjugateLhs && ConjugateRhs) {
+    return pger_vecMMA<RealPacket, RealPacket, true>(c, b, a.v);
+  } else {
+    return pger_vecMMA<RealPacket, RealPacket, false>(c, b, a.v);
+  }
 }
 
-template<typename RealPacket, typename LhsPacket, bool ConjugateLhs, bool ConjugateRhs, bool Negate>
-EIGEN_ALWAYS_INLINE void pmadd_complex_complex_MMA(__vector_pair& a, RealPacket& b, __vector_quad* c)
-{
-    if (ConjugateLhs && ConjugateRhs) {
-        RealPacket b2 = pconj2(convertComplex(b)).v;
-        return pger_vecMMA<RealPacket, __vector_pair, false>(c, a, b2);
-    }
-    else if (Negate && !ConjugateLhs && ConjugateRhs) {
-        return pger_vecMMA<RealPacket, __vector_pair, true>(c, a, b);
-    }
-    else {
-        return pger_vecMMA<RealPacket, __vector_pair, false>(c, a, b);
-    }
+template <typename RealPacket, typename LhsPacket, bool ConjugateLhs, bool ConjugateRhs, bool Negate>
+EIGEN_ALWAYS_INLINE void pmadd_complex_complex_MMA(__vector_pair& a, RealPacket& b, __vector_quad* c) {
+  if (ConjugateLhs && ConjugateRhs) {
+    RealPacket b2 = pconj2(convertComplex(b)).v;
+    return pger_vecMMA<RealPacket, __vector_pair, false>(c, a, b2);
+  } else if (Negate && !ConjugateLhs && ConjugateRhs) {
+    return pger_vecMMA<RealPacket, __vector_pair, true>(c, a, b);
+  } else {
+    return pger_vecMMA<RealPacket, __vector_pair, false>(c, a, b);
+  }
 }
 
 /** \internal madd for complex times real (MMA version) */
-template<typename RealPacket, typename LhsPacket, bool Conjugate, int StorageOrder>
-EIGEN_ALWAYS_INLINE void pmadd_complex_real_MMA(LhsPacket& a, RealPacket& b, __vector_quad* c)
-{
-    RealPacket a2 = convertReal(a);
-    if (Conjugate) {
-        RealPacket b2 = pconj2(convertComplex(b)).v;
-        if (StorageOrder == ColMajor) {
-            return pger_vecMMA<RealPacket, RealPacket, false>(c, b2, a2);
-        } else {
-            return pger_vecMMA<RealPacket, RealPacket, false>(c, a2, b2);
-        }
+template <typename RealPacket, typename LhsPacket, bool Conjugate, int StorageOrder>
+EIGEN_ALWAYS_INLINE void pmadd_complex_real_MMA(LhsPacket& a, RealPacket& b, __vector_quad* c) {
+  RealPacket a2 = convertReal(a);
+  if (Conjugate) {
+    RealPacket b2 = pconj2(convertComplex(b)).v;
+    if (StorageOrder == ColMajor) {
+      return pger_vecMMA<RealPacket, RealPacket, false>(c, b2, a2);
+    } else {
+      return pger_vecMMA<RealPacket, RealPacket, false>(c, a2, b2);
     }
-    else {
-        if (StorageOrder == ColMajor) {
-            return pger_vecMMA<RealPacket, RealPacket, false>(c, b, a2);
-        } else {
-            return pger_vecMMA<RealPacket, RealPacket, false>(c, a2, b);
-        }
+  } else {
+    if (StorageOrder == ColMajor) {
+      return pger_vecMMA<RealPacket, RealPacket, false>(c, b, a2);
+    } else {
+      return pger_vecMMA<RealPacket, RealPacket, false>(c, a2, b);
     }
+  }
 }
 
 /** \internal madd for real times complex (MMA version) */
-template<typename RealPacket, typename LhsPacket, bool Conjugate, int StorageOrder>
-EIGEN_ALWAYS_INLINE void pmadd_complex_real_MMA(__vector_pair& a, RealPacket& b, __vector_quad* c)
-{
-    if (Conjugate) {
-        RealPacket b2 = pconj2(convertComplex(b)).v;
-        return pger_vecMMA<RealPacket, __vector_pair, false>(c, a, b2);
-    }
-    else {
-        return pger_vecMMA<RealPacket, __vector_pair, false>(c, a, b);
-    }
+template <typename RealPacket, typename LhsPacket, bool Conjugate, int StorageOrder>
+EIGEN_ALWAYS_INLINE void pmadd_complex_real_MMA(__vector_pair& a, RealPacket& b, __vector_quad* c) {
+  if (Conjugate) {
+    RealPacket b2 = pconj2(convertComplex(b)).v;
+    return pger_vecMMA<RealPacket, __vector_pair, false>(c, a, b2);
+  } else {
+    return pger_vecMMA<RealPacket, __vector_pair, false>(c, a, b);
+  }
 }
 
 /** \internal core multiply operation for vectors (MMA version) - complex times complex */
-template<typename ScalarPacket, typename LhsPacket, typename SLhsPacket, typename RhsScalar, typename ResPacket, bool ConjugateLhs, bool ConjugateRhs, int StorageOrder>
-EIGEN_ALWAYS_INLINE void gemv_mult_complex_complex_MMA(SLhsPacket& a0, RhsScalar* b, __vector_quad* c0)
-{
-    ScalarPacket b0;
-    if (StorageOrder == ColMajor) {
-        b0 = pload_realimag_combine(b);
-    } else {
-        b0 = pload_realimag_combine_row(b);
-    }
-    pmadd_complex_complex_MMA<ScalarPacket, LhsPacket, ConjugateLhs, ConjugateRhs, false>(a0, b0, c0);
+template <typename ScalarPacket, typename LhsPacket, typename SLhsPacket, typename RhsScalar, typename ResPacket,
+          bool ConjugateLhs, bool ConjugateRhs, int StorageOrder>
+EIGEN_ALWAYS_INLINE void gemv_mult_complex_complex_MMA(SLhsPacket& a0, RhsScalar* b, __vector_quad* c0) {
+  ScalarPacket b0;
+  if (StorageOrder == ColMajor) {
+    b0 = pload_realimag_combine(b);
+  } else {
+    b0 = pload_realimag_combine_row(b);
+  }
+  pmadd_complex_complex_MMA<ScalarPacket, LhsPacket, ConjugateLhs, ConjugateRhs, false>(a0, b0, c0);
 }
 
 /** \internal core multiply operation for vectors (MMA version) - complex times real */
-template<typename ScalarPacket, typename LhsPacket, typename SLhsPacket, typename RhsScalar, typename ResPacket, bool ConjugateLhs, bool ConjugateRhs, int StorageOrder>
-EIGEN_ALWAYS_INLINE void gemv_mult_complex_real_MMA(SLhsPacket& a0, RhsScalar* b, __vector_quad* c0)
-{
-    pload_complex_MMA<ScalarPacket, LhsPacket, SLhsPacket, ResPacket>(a0);
-    ScalarPacket b0;
-    if (StorageOrder == ColMajor) {
-        b0 = pload_real(b);
-    }
-    else {
-        b0 = pload_real_row<ResPacket>(b);
-    }
-    pmadd_complex_real_MMA<ScalarPacket, LhsPacket, ConjugateLhs, ColMajor>(a0, b0, c0);
+template <typename ScalarPacket, typename LhsPacket, typename SLhsPacket, typename RhsScalar, typename ResPacket,
+          bool ConjugateLhs, bool ConjugateRhs, int StorageOrder>
+EIGEN_ALWAYS_INLINE void gemv_mult_complex_real_MMA(SLhsPacket& a0, RhsScalar* b, __vector_quad* c0) {
+  pload_complex_MMA<ScalarPacket, LhsPacket, SLhsPacket, ResPacket>(a0);
+  ScalarPacket b0;
+  if (StorageOrder == ColMajor) {
+    b0 = pload_real(b);
+  } else {
+    b0 = pload_real_row<ResPacket>(b);
+  }
+  pmadd_complex_real_MMA<ScalarPacket, LhsPacket, ConjugateLhs, ColMajor>(a0, b0, c0);
 }
 
 /** \internal core multiply operation for vectors (MMA version) - real times complex */
-template<typename ScalarPacket, typename LhsPacket, typename SLhsPacket, typename RhsScalar, typename ResPacket, bool ConjugateLhs, bool ConjugateRhs, int StorageOrder>
-EIGEN_ALWAYS_INLINE void gemv_mult_real_complex_MMA(SLhsPacket& a0, RhsScalar* b, __vector_quad* c0)
-{
-    ScalarPacket b0;
-    if (StorageOrder == ColMajor) {
-        b0 = pload_complex_full(b);
-    }
-    else {
-        b0 = pload_complex_full_row(b);
-    }
-    pmadd_complex_real_MMA<ScalarPacket, LhsPacket, ConjugateRhs, (sizeof(RhsScalar) == sizeof(std::complex<float>)) ? StorageOrder : ColMajor>(a0, b0, c0);
+template <typename ScalarPacket, typename LhsPacket, typename SLhsPacket, typename RhsScalar, typename ResPacket,
+          bool ConjugateLhs, bool ConjugateRhs, int StorageOrder>
+EIGEN_ALWAYS_INLINE void gemv_mult_real_complex_MMA(SLhsPacket& a0, RhsScalar* b, __vector_quad* c0) {
+  ScalarPacket b0;
+  if (StorageOrder == ColMajor) {
+    b0 = pload_complex_full(b);
+  } else {
+    b0 = pload_complex_full_row(b);
+  }
+  pmadd_complex_real_MMA<ScalarPacket, LhsPacket, ConjugateRhs,
+                         (sizeof(RhsScalar) == sizeof(std::complex<float>)) ? StorageOrder : ColMajor>(a0, b0, c0);
 }
 
-#define GEMV_MULT_COMPLEX_COMPLEX_MMA(LhsType, RhsType) \
-template<typename ScalarPacket, typename LhsScalar, typename LhsPacket, typename SLhsPacket, typename RhsScalar, typename RhsPacket, typename ResPacket, bool ConjugateLhs, bool ConjugateRhs, int StorageOrder> \
-EIGEN_ALWAYS_INLINE void gemv_mult_complex_MMA(LhsType& a0, RhsType* b, __vector_quad* c0) \
-{ \
-    gemv_mult_complex_complex_MMA<ScalarPacket, LhsPacket, SLhsPacket, RhsScalar, ResPacket, ConjugateLhs, ConjugateRhs, StorageOrder>(a0, b, c0); \
-}
+#define GEMV_MULT_COMPLEX_COMPLEX_MMA(LhsType, RhsType)                                                             \
+  template <typename ScalarPacket, typename LhsScalar, typename LhsPacket, typename SLhsPacket, typename RhsScalar, \
+            typename RhsPacket, typename ResPacket, bool ConjugateLhs, bool ConjugateRhs, int StorageOrder>         \
+  EIGEN_ALWAYS_INLINE void gemv_mult_complex_MMA(LhsType& a0, RhsType* b, __vector_quad* c0) {                      \
+    gemv_mult_complex_complex_MMA<ScalarPacket, LhsPacket, SLhsPacket, RhsScalar, ResPacket, ConjugateLhs,          \
+                                  ConjugateRhs, StorageOrder>(a0, b, c0);                                           \
+  }
 
-GEMV_MULT_COMPLEX_COMPLEX_MMA(Packet2cf,     std::complex<float>)
+GEMV_MULT_COMPLEX_COMPLEX_MMA(Packet2cf, std::complex<float>)
 GEMV_MULT_COMPLEX_COMPLEX_MMA(__vector_pair, std::complex<float>)
-GEMV_MULT_COMPLEX_COMPLEX_MMA(Packet1cd,     std::complex<double>)
+GEMV_MULT_COMPLEX_COMPLEX_MMA(Packet1cd, std::complex<double>)
 
 /** \internal core multiply operation for vectors (MMA version) - complex times complex */
-template<typename ScalarPacket, typename LhsScalar, typename LhsPacket, typename SLhsPacket, typename RhsScalar, typename RhsPacket, typename ResPacket, bool ConjugateLhs, bool ConjugateRhs, int StorageOrder>
-EIGEN_ALWAYS_INLINE void gemv_mult_complex_MMA(__vector_pair& a0, std::complex<double>* b, __vector_quad* c0)
-{
-    if (sizeof(LhsScalar) == 16) {
-        gemv_mult_complex_complex_MMA<ScalarPacket, LhsPacket, SLhsPacket, RhsScalar, ResPacket, ConjugateLhs, ConjugateRhs, StorageOrder>(a0, b, c0);
-    }
-    else {
-        gemv_mult_real_complex_MMA<ScalarPacket, LhsPacket, SLhsPacket, RhsScalar, ResPacket, ConjugateLhs, ConjugateRhs, StorageOrder>(a0, b, c0);
-    }
+template <typename ScalarPacket, typename LhsScalar, typename LhsPacket, typename SLhsPacket, typename RhsScalar,
+          typename RhsPacket, typename ResPacket, bool ConjugateLhs, bool ConjugateRhs, int StorageOrder>
+EIGEN_ALWAYS_INLINE void gemv_mult_complex_MMA(__vector_pair& a0, std::complex<double>* b, __vector_quad* c0) {
+  if (sizeof(LhsScalar) == 16) {
+    gemv_mult_complex_complex_MMA<ScalarPacket, LhsPacket, SLhsPacket, RhsScalar, ResPacket, ConjugateLhs, ConjugateRhs,
+                                  StorageOrder>(a0, b, c0);
+  } else {
+    gemv_mult_real_complex_MMA<ScalarPacket, LhsPacket, SLhsPacket, RhsScalar, ResPacket, ConjugateLhs, ConjugateRhs,
+                               StorageOrder>(a0, b, c0);
+  }
 }
 
-#define GEMV_MULT_REAL_COMPLEX_MMA(LhsType, RhsType) \
-template<typename ScalarPacket, typename LhsScalar, typename LhsPacket, typename SLhsPacket, typename RhsScalar, typename RhsPacket, typename ResPacket, bool ConjugateLhs, bool ConjugateRhs, int StorageOrder> \
-EIGEN_ALWAYS_INLINE void gemv_mult_complex_MMA(LhsType& a0, RhsType* b, __vector_quad* c0) \
-{ \
-    gemv_mult_real_complex_MMA<ScalarPacket, LhsPacket, SLhsPacket, RhsScalar, ResPacket, ConjugateLhs, ConjugateRhs, StorageOrder>(a0, b, c0); \
-}
+#define GEMV_MULT_REAL_COMPLEX_MMA(LhsType, RhsType)                                                                  \
+  template <typename ScalarPacket, typename LhsScalar, typename LhsPacket, typename SLhsPacket, typename RhsScalar,   \
+            typename RhsPacket, typename ResPacket, bool ConjugateLhs, bool ConjugateRhs, int StorageOrder>           \
+  EIGEN_ALWAYS_INLINE void gemv_mult_complex_MMA(LhsType& a0, RhsType* b, __vector_quad* c0) {                        \
+    gemv_mult_real_complex_MMA<ScalarPacket, LhsPacket, SLhsPacket, RhsScalar, ResPacket, ConjugateLhs, ConjugateRhs, \
+                               StorageOrder>(a0, b, c0);                                                              \
+  }
 
 GEMV_MULT_REAL_COMPLEX_MMA(Packet4f, std::complex<float>)
 GEMV_MULT_REAL_COMPLEX_MMA(Packet2d, std::complex<double>)
 
-#define GEMV_MULT_COMPLEX_REAL_MMA(LhsType, RhsType) \
-template<typename ScalarPacket, typename LhsScalar, typename LhsPacket, typename SLhsPacket, typename RhsScalar, typename RhsPacket, typename ResPacket, bool ConjugateLhs, bool ConjugateRhs, int StorageOrder> \
-EIGEN_ALWAYS_INLINE void gemv_mult_complex_MMA(LhsType& a0, RhsType* b, __vector_quad* c0) \
-{ \
-    gemv_mult_complex_real_MMA<ScalarPacket, LhsPacket, SLhsPacket, RhsScalar, ResPacket, ConjugateLhs, ConjugateRhs, StorageOrder>(a0, b, c0); \
-}
+#define GEMV_MULT_COMPLEX_REAL_MMA(LhsType, RhsType)                                                                  \
+  template <typename ScalarPacket, typename LhsScalar, typename LhsPacket, typename SLhsPacket, typename RhsScalar,   \
+            typename RhsPacket, typename ResPacket, bool ConjugateLhs, bool ConjugateRhs, int StorageOrder>           \
+  EIGEN_ALWAYS_INLINE void gemv_mult_complex_MMA(LhsType& a0, RhsType* b, __vector_quad* c0) {                        \
+    gemv_mult_complex_real_MMA<ScalarPacket, LhsPacket, SLhsPacket, RhsScalar, ResPacket, ConjugateLhs, ConjugateRhs, \
+                               StorageOrder>(a0, b, c0);                                                              \
+  }
 
-GEMV_MULT_COMPLEX_REAL_MMA(Packet2cf,     float)
-GEMV_MULT_COMPLEX_REAL_MMA(Packet1cd,     double)
+GEMV_MULT_COMPLEX_REAL_MMA(Packet2cf, float)
+GEMV_MULT_COMPLEX_REAL_MMA(Packet1cd, double)
 GEMV_MULT_COMPLEX_REAL_MMA(__vector_pair, float)
 GEMV_MULT_COMPLEX_REAL_MMA(__vector_pair, double)
 
 /** \internal disassemble MMA accumulator results into packets */
-template <typename Scalar, typename ScalarPacket, typename LhsPacket, typename RhsPacket, bool ConjugateLhs, bool ConjugateRhs>
-EIGEN_ALWAYS_INLINE void disassembleResults2(__vector_quad* c0, PacketBlock<ScalarPacket, 4>& result0)
-{
-    __builtin_mma_disassemble_acc(&result0.packet, c0);
-    if (sizeof(LhsPacket) == 16) {
-        if (sizeof(RhsPacket) == 16) {
-            ScalarPacket tmp0, tmp2;
-            tmp2 = vec_mergeh(result0.packet[2], result0.packet[3]);
-            tmp0 = vec_mergeh(result0.packet[0], result0.packet[1]);
-            result0.packet[3] = vec_mergel(result0.packet[3], result0.packet[2]);
-            result0.packet[1] = vec_mergel(result0.packet[1], result0.packet[0]);
-            result0.packet[2] = tmp2;
-            result0.packet[0] = tmp0;
+template <typename Scalar, typename ScalarPacket, typename LhsPacket, typename RhsPacket, bool ConjugateLhs,
+          bool ConjugateRhs>
+EIGEN_ALWAYS_INLINE void disassembleResults2(__vector_quad* c0, PacketBlock<ScalarPacket, 4>& result0) {
+  __builtin_mma_disassemble_acc(&result0.packet, c0);
+  if (sizeof(LhsPacket) == 16) {
+    if (sizeof(RhsPacket) == 16) {
+      ScalarPacket tmp0, tmp2;
+      tmp2 = vec_mergeh(result0.packet[2], result0.packet[3]);
+      tmp0 = vec_mergeh(result0.packet[0], result0.packet[1]);
+      result0.packet[3] = vec_mergel(result0.packet[3], result0.packet[2]);
+      result0.packet[1] = vec_mergel(result0.packet[1], result0.packet[0]);
+      result0.packet[2] = tmp2;
+      result0.packet[0] = tmp0;
 
-            if (ConjugateLhs) {
-                result0.packet[0] = pconj2(convertComplex(result0.packet[0])).v;
-                result0.packet[2] = pconj2(convertComplex(result0.packet[2])).v;
-            } else if (ConjugateRhs) {
-                result0.packet[1] = pconj2(convertComplex(result0.packet[1])).v;
-                result0.packet[3] = pconj2(convertComplex(result0.packet[3])).v;
-            } else {
-                result0.packet[1] = pconjinv(convertComplex(result0.packet[1])).v;
-                result0.packet[3] = pconjinv(convertComplex(result0.packet[3])).v;
-            }
-            result0.packet[0] = vec_add(result0.packet[0], result0.packet[1]);
-            result0.packet[2] = vec_add(result0.packet[2], result0.packet[3]);
-        } else {
-            result0.packet[0][1] = result0.packet[1][1];
-            result0.packet[2][1] = result0.packet[3][1];
-        }
+      if (ConjugateLhs) {
+        result0.packet[0] = pconj2(convertComplex(result0.packet[0])).v;
+        result0.packet[2] = pconj2(convertComplex(result0.packet[2])).v;
+      } else if (ConjugateRhs) {
+        result0.packet[1] = pconj2(convertComplex(result0.packet[1])).v;
+        result0.packet[3] = pconj2(convertComplex(result0.packet[3])).v;
+      } else {
+        result0.packet[1] = pconjinv(convertComplex(result0.packet[1])).v;
+        result0.packet[3] = pconjinv(convertComplex(result0.packet[3])).v;
+      }
+      result0.packet[0] = vec_add(result0.packet[0], result0.packet[1]);
+      result0.packet[2] = vec_add(result0.packet[2], result0.packet[3]);
+    } else {
+      result0.packet[0][1] = result0.packet[1][1];
+      result0.packet[2][1] = result0.packet[3][1];
     }
+  }
 }
 
-template <typename Scalar, typename ScalarPacket, typename LhsPacket, typename RhsPacket, bool ConjugateLhs, bool ConjugateRhs>
-EIGEN_ALWAYS_INLINE void disassembleResults4(__vector_quad* c0, PacketBlock<ScalarPacket, 4>& result0)
-{
-    __builtin_mma_disassemble_acc(&result0.packet, c0);
-    if (GEMV_IS_COMPLEX_COMPLEX) {
-        if (ConjugateLhs) {
-            result0.packet[0] = pconj2(convertComplex(result0.packet[0])).v;
-            result0.packet[1] = pcplxflip2(convertComplex(result0.packet[1])).v;
-        } else {
-            if (ConjugateRhs) {
-                result0.packet[1] = pcplxconjflip(convertComplex(result0.packet[1])).v;
-            } else {
-                result0.packet[1] = pcplxflipconj(convertComplex(result0.packet[1])).v;
-            }
-        }
-        result0.packet[0] = vec_add(result0.packet[0], result0.packet[1]);
-    } else if (sizeof(LhsPacket) == sizeof(std::complex<float>)) {
-        if (ConjugateLhs) {
-            result0.packet[0] = pconj2(convertComplex(result0.packet[0])).v;
-        }
+template <typename Scalar, typename ScalarPacket, typename LhsPacket, typename RhsPacket, bool ConjugateLhs,
+          bool ConjugateRhs>
+EIGEN_ALWAYS_INLINE void disassembleResults4(__vector_quad* c0, PacketBlock<ScalarPacket, 4>& result0) {
+  __builtin_mma_disassemble_acc(&result0.packet, c0);
+  if (GEMV_IS_COMPLEX_COMPLEX) {
+    if (ConjugateLhs) {
+      result0.packet[0] = pconj2(convertComplex(result0.packet[0])).v;
+      result0.packet[1] = pcplxflip2(convertComplex(result0.packet[1])).v;
     } else {
-        result0.packet[0] = vec_mergee(result0.packet[0], result0.packet[1]);
+      if (ConjugateRhs) {
+        result0.packet[1] = pcplxconjflip(convertComplex(result0.packet[1])).v;
+      } else {
+        result0.packet[1] = pcplxflipconj(convertComplex(result0.packet[1])).v;
+      }
     }
+    result0.packet[0] = vec_add(result0.packet[0], result0.packet[1]);
+  } else if (sizeof(LhsPacket) == sizeof(std::complex<float>)) {
+    if (ConjugateLhs) {
+      result0.packet[0] = pconj2(convertComplex(result0.packet[0])).v;
+    }
+  } else {
+    result0.packet[0] = vec_mergee(result0.packet[0], result0.packet[1]);
+  }
 }
 
-template <typename Scalar, typename ScalarPacket, int ResPacketSize, typename LhsPacket, typename RhsPacket, bool ConjugateLhs, bool ConjugateRhs>
-EIGEN_ALWAYS_INLINE void disassembleResults(__vector_quad* c0, PacketBlock<ScalarPacket, 4>& result0)
-{
-    if (!GEMV_IS_COMPLEX_FLOAT) {
-        disassembleResults2<Scalar, ScalarPacket, LhsPacket, RhsPacket, ConjugateLhs, ConjugateRhs>(c0, result0);
-    } else {
-        disassembleResults4<Scalar, ScalarPacket, LhsPacket, RhsPacket, ConjugateLhs, ConjugateRhs>(c0, result0);
-    }
+template <typename Scalar, typename ScalarPacket, int ResPacketSize, typename LhsPacket, typename RhsPacket,
+          bool ConjugateLhs, bool ConjugateRhs>
+EIGEN_ALWAYS_INLINE void disassembleResults(__vector_quad* c0, PacketBlock<ScalarPacket, 4>& result0) {
+  if (!GEMV_IS_COMPLEX_FLOAT) {
+    disassembleResults2<Scalar, ScalarPacket, LhsPacket, RhsPacket, ConjugateLhs, ConjugateRhs>(c0, result0);
+  } else {
+    disassembleResults4<Scalar, ScalarPacket, LhsPacket, RhsPacket, ConjugateLhs, ConjugateRhs>(c0, result0);
+  }
 }
 #endif
 
@@ -1952,194 +1810,207 @@
 #define GEMV_LOADPACKET_COL_COMPLEX(iter) \
   loadLhsPacket<Scalar, LhsScalar, LhsMapper, PLhsPacket>(lhs, i + ((iter) * ResPacketSize), j)
 
-#define GEMV_LOADPACKET_COL_COMPLEX_DATA(iter) \
-  convertReal(GEMV_LOADPACKET_COL_COMPLEX(iter))
+#define GEMV_LOADPACKET_COL_COMPLEX_DATA(iter) convertReal(GEMV_LOADPACKET_COL_COMPLEX(iter))
 
 #ifdef USE_GEMV_MMA
 #define GEMV_INIT_COL_COMPLEX_MMA(iter, N) \
-  if (GEMV_GETN_COMPLEX(N) > iter) { \
-    __builtin_mma_xxsetaccz(&e0##iter); \
+  if (GEMV_GETN_COMPLEX(N) > iter) {       \
+    __builtin_mma_xxsetaccz(&e0##iter);    \
   }
 
 #if EIGEN_COMP_LLVM
-#define GEMV_LOADPAIR_COL_COMPLEX_MMA(iter1, iter2) \
-  GEMV_BUILDPAIR_MMA(a##iter1, GEMV_LOADPACKET_COL_COMPLEX_DATA(iter2), GEMV_LOADPACKET_COL_COMPLEX_DATA((iter2) + 1)); \
+#define GEMV_LOADPAIR_COL_COMPLEX_MMA(iter1, iter2)                     \
+  GEMV_BUILDPAIR_MMA(a##iter1, GEMV_LOADPACKET_COL_COMPLEX_DATA(iter2), \
+                     GEMV_LOADPACKET_COL_COMPLEX_DATA((iter2) + 1));    \
   EIGEN_UNUSED_VARIABLE(f##iter1);
 #else
-#define GEMV_LOADPAIR_COL_COMPLEX_MMA(iter1, iter2) \
-  if (sizeof(LhsPacket) == 16) { \
-    const LhsScalar& src = lhs(i + ((32 * iter1) / sizeof(LhsScalar)), j); \
-    a##iter1 = *reinterpret_cast<__vector_pair *>(const_cast<LhsScalar *>(&src)); \
-    EIGEN_UNUSED_VARIABLE(f##iter1); \
-  } else { \
-    f##iter1 = lhs.template load<PLhsPacket, Unaligned>(i + ((iter2) * ResPacketSize), j); \
+#define GEMV_LOADPAIR_COL_COMPLEX_MMA(iter1, iter2)                                                         \
+  if (sizeof(LhsPacket) == 16) {                                                                            \
+    const LhsScalar& src = lhs(i + ((32 * iter1) / sizeof(LhsScalar)), j);                                  \
+    a##iter1 = *reinterpret_cast<__vector_pair*>(const_cast<LhsScalar*>(&src));                             \
+    EIGEN_UNUSED_VARIABLE(f##iter1);                                                                        \
+  } else {                                                                                                  \
+    f##iter1 = lhs.template load<PLhsPacket, Unaligned>(i + ((iter2) * ResPacketSize), j);                  \
     GEMV_BUILDPAIR_MMA(a##iter1, vec_splat(convertReal(f##iter1), 0), vec_splat(convertReal(f##iter1), 1)); \
   }
 #endif
 
-#define GEMV_LOAD1_COL_COMPLEX_MMA(iter, N) \
-  if (GEMV_GETN_COMPLEX(N) > iter) { \
-    if (GEMV_IS_COMPLEX_FLOAT) { \
-      f##iter = GEMV_LOADPACKET_COL_COMPLEX(iter); \
-      EIGEN_UNUSED_VARIABLE(a##iter); \
-    } else { \
+#define GEMV_LOAD1_COL_COMPLEX_MMA(iter, N)          \
+  if (GEMV_GETN_COMPLEX(N) > iter) {                 \
+    if (GEMV_IS_COMPLEX_FLOAT) {                     \
+      f##iter = GEMV_LOADPACKET_COL_COMPLEX(iter);   \
+      EIGEN_UNUSED_VARIABLE(a##iter);                \
+    } else {                                         \
       GEMV_LOADPAIR_COL_COMPLEX_MMA(iter, iter << 1) \
-    } \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(a##iter); \
-    EIGEN_UNUSED_VARIABLE(f##iter); \
+    }                                                \
+  } else {                                           \
+    EIGEN_UNUSED_VARIABLE(a##iter);                  \
+    EIGEN_UNUSED_VARIABLE(f##iter);                  \
   }
 
-#define GEMV_WORK1_COL_COMPLEX_MMA(iter, N) \
-  if (GEMV_GETN_COMPLEX(N) > iter) { \
-    if (GEMV_IS_COMPLEX_FLOAT) { \
-      gemv_mult_complex_MMA<ScalarPacket, LhsScalar, PLhsPacket, PLhsPacket, RhsScalar, RhsPacket, ResPacket, ConjugateLhs, ConjugateRhs, ColMajor>(f##iter, b, &e0##iter); \
-    } else { \
-      gemv_mult_complex_MMA<ScalarPacket, LhsScalar, PLhsPacket, __vector_pair, RhsScalar, RhsPacket, ResPacket, ConjugateLhs, ConjugateRhs, ColMajor>(a##iter, b, &e0##iter); \
-    } \
+#define GEMV_WORK1_COL_COMPLEX_MMA(iter, N)                                                                      \
+  if (GEMV_GETN_COMPLEX(N) > iter) {                                                                             \
+    if (GEMV_IS_COMPLEX_FLOAT) {                                                                                 \
+      gemv_mult_complex_MMA<ScalarPacket, LhsScalar, PLhsPacket, PLhsPacket, RhsScalar, RhsPacket, ResPacket,    \
+                            ConjugateLhs, ConjugateRhs, ColMajor>(f##iter, b, &e0##iter);                        \
+    } else {                                                                                                     \
+      gemv_mult_complex_MMA<ScalarPacket, LhsScalar, PLhsPacket, __vector_pair, RhsScalar, RhsPacket, ResPacket, \
+                            ConjugateLhs, ConjugateRhs, ColMajor>(a##iter, b, &e0##iter);                        \
+    }                                                                                                            \
   }
 
 #define GEMV_LOADPAIR2_COL_COMPLEX_MMA(iter1, iter2) \
   GEMV_BUILDPAIR_MMA(a##iter1, GEMV_LOADPACKET_COL_COMPLEX_DATA(iter2), GEMV_LOADPACKET_COL_COMPLEX_DATA((iter2) + 1));
 
 #define GEMV_LOAD2_COL_COMPLEX_MMA(iter1, iter2, iter3, N) \
-  if (GEMV_GETN_COMPLEX(N) > iter1) { \
-    if (GEMV_IS_COMPLEX_FLOAT) { \
-      GEMV_LOADPAIR2_COL_COMPLEX_MMA(iter2, iter2); \
-      EIGEN_UNUSED_VARIABLE(a##iter3) \
-    } else { \
-      GEMV_LOADPAIR2_COL_COMPLEX_MMA(iter2, iter2 << 1); \
-      GEMV_LOADPAIR2_COL_COMPLEX_MMA(iter3, iter3 << 1); \
-    } \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(a##iter2); \
-    EIGEN_UNUSED_VARIABLE(a##iter3); \
-  } \
-  EIGEN_UNUSED_VARIABLE(f##iter2); \
+  if (GEMV_GETN_COMPLEX(N) > iter1) {                      \
+    if (GEMV_IS_COMPLEX_FLOAT) {                           \
+      GEMV_LOADPAIR2_COL_COMPLEX_MMA(iter2, iter2);        \
+      EIGEN_UNUSED_VARIABLE(a##iter3)                      \
+    } else {                                               \
+      GEMV_LOADPAIR2_COL_COMPLEX_MMA(iter2, iter2 << 1);   \
+      GEMV_LOADPAIR2_COL_COMPLEX_MMA(iter3, iter3 << 1);   \
+    }                                                      \
+  } else {                                                 \
+    EIGEN_UNUSED_VARIABLE(a##iter2);                       \
+    EIGEN_UNUSED_VARIABLE(a##iter3);                       \
+  }                                                        \
+  EIGEN_UNUSED_VARIABLE(f##iter2);                         \
   EIGEN_UNUSED_VARIABLE(f##iter3);
 
-#define GEMV_WORK2_COL_COMPLEX_MMA(iter1, iter2, iter3, N) \
-  if (GEMV_GETN_COMPLEX(N) > iter1) { \
-    if (GEMV_IS_COMPLEX_FLOAT) { \
-      PLhsPacket g[2]; \
-      __builtin_vsx_disassemble_pair(reinterpret_cast<void*>(g), &a##iter2); \
-      gemv_mult_complex_MMA<ScalarPacket, LhsScalar, PLhsPacket, PLhsPacket, RhsScalar, RhsPacket, ResPacket, ConjugateLhs, ConjugateRhs, ColMajor>(g[0], b, &e0##iter2); \
-      gemv_mult_complex_MMA<ScalarPacket, LhsScalar, PLhsPacket, PLhsPacket, RhsScalar, RhsPacket, ResPacket, ConjugateLhs, ConjugateRhs, ColMajor>(g[1], b, &e0##iter3); \
-    } else { \
-      gemv_mult_complex_MMA<ScalarPacket, LhsScalar, PLhsPacket, __vector_pair, RhsScalar, RhsPacket, ResPacket, ConjugateLhs, ConjugateRhs, ColMajor>(a##iter2, b, &e0##iter2); \
-      gemv_mult_complex_MMA<ScalarPacket, LhsScalar, PLhsPacket, __vector_pair, RhsScalar, RhsPacket, ResPacket, ConjugateLhs, ConjugateRhs, ColMajor>(a##iter3, b, &e0##iter3); \
-    } \
+#define GEMV_WORK2_COL_COMPLEX_MMA(iter1, iter2, iter3, N)                                                       \
+  if (GEMV_GETN_COMPLEX(N) > iter1) {                                                                            \
+    if (GEMV_IS_COMPLEX_FLOAT) {                                                                                 \
+      PLhsPacket g[2];                                                                                           \
+      __builtin_vsx_disassemble_pair(reinterpret_cast<void*>(g), &a##iter2);                                     \
+      gemv_mult_complex_MMA<ScalarPacket, LhsScalar, PLhsPacket, PLhsPacket, RhsScalar, RhsPacket, ResPacket,    \
+                            ConjugateLhs, ConjugateRhs, ColMajor>(g[0], b, &e0##iter2);                          \
+      gemv_mult_complex_MMA<ScalarPacket, LhsScalar, PLhsPacket, PLhsPacket, RhsScalar, RhsPacket, ResPacket,    \
+                            ConjugateLhs, ConjugateRhs, ColMajor>(g[1], b, &e0##iter3);                          \
+    } else {                                                                                                     \
+      gemv_mult_complex_MMA<ScalarPacket, LhsScalar, PLhsPacket, __vector_pair, RhsScalar, RhsPacket, ResPacket, \
+                            ConjugateLhs, ConjugateRhs, ColMajor>(a##iter2, b, &e0##iter2);                      \
+      gemv_mult_complex_MMA<ScalarPacket, LhsScalar, PLhsPacket, __vector_pair, RhsScalar, RhsPacket, ResPacket, \
+                            ConjugateLhs, ConjugateRhs, ColMajor>(a##iter3, b, &e0##iter3);                      \
+    }                                                                                                            \
   }
 
 #if EIGEN_COMP_LLVM
-#define GEMV_LOAD_COL_COMPLEX_MMA(N) \
-  if (GEMV_GETN_COMPLEX(N) > 1) { \
+#define GEMV_LOAD_COL_COMPLEX_MMA(N)                       \
+  if (GEMV_GETN_COMPLEX(N) > 1) {                          \
     GEMV_UNROLL_HALF(GEMV_LOAD2_COL_COMPLEX_MMA, (N >> 1)) \
-  } else { \
-    GEMV_UNROLL(GEMV_LOAD1_COL_COMPLEX_MMA, N) \
+  } else {                                                 \
+    GEMV_UNROLL(GEMV_LOAD1_COL_COMPLEX_MMA, N)             \
   }
 
-#define GEMV_WORK_COL_COMPLEX_MMA(N) \
-  if (GEMV_GETN_COMPLEX(N) > 1) { \
+#define GEMV_WORK_COL_COMPLEX_MMA(N)                       \
+  if (GEMV_GETN_COMPLEX(N) > 1) {                          \
     GEMV_UNROLL_HALF(GEMV_WORK2_COL_COMPLEX_MMA, (N >> 1)) \
-  } else { \
-    GEMV_UNROLL(GEMV_WORK1_COL_COMPLEX_MMA, N) \
+  } else {                                                 \
+    GEMV_UNROLL(GEMV_WORK1_COL_COMPLEX_MMA, N)             \
   }
 #else
-#define GEMV_LOAD_COL_COMPLEX_MMA(N) \
-  GEMV_UNROLL(GEMV_LOAD1_COL_COMPLEX_MMA, N)
+#define GEMV_LOAD_COL_COMPLEX_MMA(N) GEMV_UNROLL(GEMV_LOAD1_COL_COMPLEX_MMA, N)
 
-#define GEMV_WORK_COL_COMPLEX_MMA(N) \
-  GEMV_UNROLL(GEMV_WORK1_COL_COMPLEX_MMA, N)
+#define GEMV_WORK_COL_COMPLEX_MMA(N) GEMV_UNROLL(GEMV_WORK1_COL_COMPLEX_MMA, N)
 #endif
 
-#define GEMV_DISASSEMBLE_COMPLEX_MMA(iter) \
-  disassembleResults<Scalar, ScalarPacket, ResPacketSize, LhsPacket, RhsPacket, ConjugateLhs, ConjugateRhs>(&e0##iter, result0##iter);
+#define GEMV_DISASSEMBLE_COMPLEX_MMA(iter)                                                                   \
+  disassembleResults<Scalar, ScalarPacket, ResPacketSize, LhsPacket, RhsPacket, ConjugateLhs, ConjugateRhs>( \
+      &e0##iter, result0##iter);
 
-#define GEMV_STORE_COL_COMPLEX_MMA(iter, N) \
-  if (GEMV_GETN_COMPLEX(N) > iter) { \
-    GEMV_DISASSEMBLE_COMPLEX_MMA(iter); \
-    c0##iter = PResPacket(result0##iter.packet[0]); \
-    if (GEMV_IS_COMPLEX_FLOAT) { \
-      pstoreu_pmadd_complex<Scalar, ScalarPacket, PResPacket, ResPacket, ResScalar, AlphaData>(c0##iter, alpha_data, res + i + (iter * ResPacketSize)); \
-    } else { \
-      pstoreu_pmadd_complex<Scalar, ScalarPacket, PResPacket, ResPacket, ResScalar, AlphaData>(c0##iter, alpha_data, res + i + ((iter << 1) * ResPacketSize)); \
-      c0##iter = PResPacket(result0##iter.packet[2]); \
-      pstoreu_pmadd_complex<Scalar, ScalarPacket, PResPacket, ResPacket, ResScalar, AlphaData>(c0##iter, alpha_data, res + i + (((iter << 1) + 1) * ResPacketSize)); \
-    } \
+#define GEMV_STORE_COL_COMPLEX_MMA(iter, N)                                                     \
+  if (GEMV_GETN_COMPLEX(N) > iter) {                                                            \
+    GEMV_DISASSEMBLE_COMPLEX_MMA(iter);                                                         \
+    c0##iter = PResPacket(result0##iter.packet[0]);                                             \
+    if (GEMV_IS_COMPLEX_FLOAT) {                                                                \
+      pstoreu_pmadd_complex<Scalar, ScalarPacket, PResPacket, ResPacket, ResScalar, AlphaData>( \
+          c0##iter, alpha_data, res + i + (iter * ResPacketSize));                              \
+    } else {                                                                                    \
+      pstoreu_pmadd_complex<Scalar, ScalarPacket, PResPacket, ResPacket, ResScalar, AlphaData>( \
+          c0##iter, alpha_data, res + i + ((iter << 1) * ResPacketSize));                       \
+      c0##iter = PResPacket(result0##iter.packet[2]);                                           \
+      pstoreu_pmadd_complex<Scalar, ScalarPacket, PResPacket, ResPacket, ResScalar, AlphaData>( \
+          c0##iter, alpha_data, res + i + (((iter << 1) + 1) * ResPacketSize));                 \
+    }                                                                                           \
   }
 
-#define GEMV_STORE2_COL_COMPLEX_MMA(iter1, iter2, iter3, N) \
-  if (GEMV_GETN_COMPLEX(N) > iter1) { \
-    GEMV_DISASSEMBLE_COMPLEX_MMA(iter2); \
-    GEMV_DISASSEMBLE_COMPLEX_MMA(iter3); \
-    c0##iter2 = PResPacket(result0##iter2.packet[0]); \
-    if (GEMV_IS_COMPLEX_FLOAT) { \
-      c0##iter3 = PResPacket(result0##iter3.packet[0]); \
-      pstoreu_pmadd_complex<ScalarPacket, PResPacket, ResPacket, ResScalar, AlphaData, ResPacketSize, iter2>(c0##iter2, c0##iter3, alpha_data, res + i); \
-    } else { \
-      c0##iter3 = PResPacket(result0##iter2.packet[2]); \
-      pstoreu_pmadd_complex<ScalarPacket, PResPacket, ResPacket, ResScalar, AlphaData, ResPacketSize, iter2 << 1>(c0##iter2, c0##iter3, alpha_data, res + i); \
-      c0##iter2 = PResPacket(result0##iter3.packet[0]); \
-      c0##iter3 = PResPacket(result0##iter3.packet[2]); \
-      pstoreu_pmadd_complex<ScalarPacket, PResPacket, ResPacket, ResScalar, AlphaData, ResPacketSize, iter3 << 1>(c0##iter2, c0##iter3, alpha_data, res + i); \
-    } \
+#define GEMV_STORE2_COL_COMPLEX_MMA(iter1, iter2, iter3, N)                                                        \
+  if (GEMV_GETN_COMPLEX(N) > iter1) {                                                                              \
+    GEMV_DISASSEMBLE_COMPLEX_MMA(iter2);                                                                           \
+    GEMV_DISASSEMBLE_COMPLEX_MMA(iter3);                                                                           \
+    c0##iter2 = PResPacket(result0##iter2.packet[0]);                                                              \
+    if (GEMV_IS_COMPLEX_FLOAT) {                                                                                   \
+      c0##iter3 = PResPacket(result0##iter3.packet[0]);                                                            \
+      pstoreu_pmadd_complex<ScalarPacket, PResPacket, ResPacket, ResScalar, AlphaData, ResPacketSize, iter2>(      \
+          c0##iter2, c0##iter3, alpha_data, res + i);                                                              \
+    } else {                                                                                                       \
+      c0##iter3 = PResPacket(result0##iter2.packet[2]);                                                            \
+      pstoreu_pmadd_complex<ScalarPacket, PResPacket, ResPacket, ResScalar, AlphaData, ResPacketSize, iter2 << 1>( \
+          c0##iter2, c0##iter3, alpha_data, res + i);                                                              \
+      c0##iter2 = PResPacket(result0##iter3.packet[0]);                                                            \
+      c0##iter3 = PResPacket(result0##iter3.packet[2]);                                                            \
+      pstoreu_pmadd_complex<ScalarPacket, PResPacket, ResPacket, ResScalar, AlphaData, ResPacketSize, iter3 << 1>( \
+          c0##iter2, c0##iter3, alpha_data, res + i);                                                              \
+    }                                                                                                              \
   }
 
-#define GEMV_PROCESS_COL_COMPLEX_ONE_MMA(N) \
-  GEMV_UNROLL(GEMV_INIT_COL_COMPLEX_MMA, N) \
-  Index j = j2; \
-  do { \
-    const RhsScalar& b1 = rhs2(j, 0); \
-    RhsScalar* b = const_cast<RhsScalar *>(&b1); \
-    GEMV_UNROLL(GEMV_PREFETCH, N) \
-    GEMV_LOAD_COL_COMPLEX_MMA(N) \
-    GEMV_WORK_COL_COMPLEX_MMA(N) \
-  } while (++j < jend); \
-  if (GEMV_GETN(N) <= 2) { \
-    GEMV_UNROLL(GEMV_STORE_COL_COMPLEX_MMA, N) \
-  } else { \
+#define GEMV_PROCESS_COL_COMPLEX_ONE_MMA(N)                 \
+  GEMV_UNROLL(GEMV_INIT_COL_COMPLEX_MMA, N)                 \
+  Index j = j2;                                             \
+  do {                                                      \
+    const RhsScalar& b1 = rhs2(j, 0);                       \
+    RhsScalar* b = const_cast<RhsScalar*>(&b1);             \
+    GEMV_UNROLL(GEMV_PREFETCH, N)                           \
+    GEMV_LOAD_COL_COMPLEX_MMA(N)                            \
+    GEMV_WORK_COL_COMPLEX_MMA(N)                            \
+  } while (++j < jend);                                     \
+  if (GEMV_GETN(N) <= 2) {                                  \
+    GEMV_UNROLL(GEMV_STORE_COL_COMPLEX_MMA, N)              \
+  } else {                                                  \
     GEMV_UNROLL_HALF(GEMV_STORE2_COL_COMPLEX_MMA, (N >> 1)) \
-  } \
+  }                                                         \
   i += (ResPacketSize * N);
 #endif
 
-#define GEMV_INIT_COMPLEX(iter, N) \
-  if (N > iter) { \
-    c0##iter = pset_zero<PResPacket>(); \
+#define GEMV_INIT_COMPLEX(iter, N)                                   \
+  if (N > iter) {                                                    \
+    c0##iter = pset_zero<PResPacket>();                              \
     c1##iter = pset_init<ResPacket, LhsPacket, RhsPacket>(c1##iter); \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(c0##iter); \
-    EIGEN_UNUSED_VARIABLE(c1##iter); \
+  } else {                                                           \
+    EIGEN_UNUSED_VARIABLE(c0##iter);                                 \
+    EIGEN_UNUSED_VARIABLE(c1##iter);                                 \
   }
 
-#define GEMV_WORK_COL_COMPLEX(iter, N) \
-  if (N > iter) { \
-    f##iter = GEMV_LOADPACKET_COL_COMPLEX(iter); \
-    gemv_mult_complex<ScalarPacket, PLhsPacket, RhsScalar, RhsPacket, PResPacket, ResPacket, ConjugateLhs, ConjugateRhs, ColMajor>(f##iter, b, c0##iter, c1##iter); \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(f##iter); \
+#define GEMV_WORK_COL_COMPLEX(iter, N)                                                                     \
+  if (N > iter) {                                                                                          \
+    f##iter = GEMV_LOADPACKET_COL_COMPLEX(iter);                                                           \
+    gemv_mult_complex<ScalarPacket, PLhsPacket, RhsScalar, RhsPacket, PResPacket, ResPacket, ConjugateLhs, \
+                      ConjugateRhs, ColMajor>(f##iter, b, c0##iter, c1##iter);                             \
+  } else {                                                                                                 \
+    EIGEN_UNUSED_VARIABLE(f##iter);                                                                        \
   }
 
-#define GEMV_STORE_COL_COMPLEX(iter, N) \
-  if (N > iter) { \
-    if (GEMV_IS_COMPLEX_COMPLEX) { \
-      c0##iter = padd(c0##iter, c1##iter); \
-    } \
-    pstoreu_pmadd_complex<Scalar, ScalarPacket, PResPacket, ResPacket, ResScalar, AlphaData>(c0##iter, alpha_data, res + i + (iter * ResPacketSize)); \
+#define GEMV_STORE_COL_COMPLEX(iter, N)                                                       \
+  if (N > iter) {                                                                             \
+    if (GEMV_IS_COMPLEX_COMPLEX) {                                                            \
+      c0##iter = padd(c0##iter, c1##iter);                                                    \
+    }                                                                                         \
+    pstoreu_pmadd_complex<Scalar, ScalarPacket, PResPacket, ResPacket, ResScalar, AlphaData>( \
+        c0##iter, alpha_data, res + i + (iter * ResPacketSize));                              \
   }
 
 /** \internal main macro for gemv_complex_col - initialize accumulators, multiply and add inputs, and store results */
-#define GEMV_PROCESS_COL_COMPLEX_ONE(N) \
-  GEMV_UNROLL(GEMV_INIT_COMPLEX, N) \
-  Index j = j2; \
-  do { \
-    const RhsScalar& b1 = rhs2(j, 0); \
-    RhsScalar* b = const_cast<RhsScalar *>(&b1); \
-    GEMV_UNROLL(GEMV_PREFETCH, N) \
-    GEMV_UNROLL(GEMV_WORK_COL_COMPLEX, N) \
-  } while (++j < jend); \
-  GEMV_UNROLL(GEMV_STORE_COL_COMPLEX, N) \
+#define GEMV_PROCESS_COL_COMPLEX_ONE(N)         \
+  GEMV_UNROLL(GEMV_INIT_COMPLEX, N)             \
+  Index j = j2;                                 \
+  do {                                          \
+    const RhsScalar& b1 = rhs2(j, 0);           \
+    RhsScalar* b = const_cast<RhsScalar*>(&b1); \
+    GEMV_UNROLL(GEMV_PREFETCH, N)               \
+    GEMV_UNROLL(GEMV_WORK_COL_COMPLEX, N)       \
+  } while (++j < jend);                         \
+  GEMV_UNROLL(GEMV_STORE_COL_COMPLEX, N)        \
   i += (ResPacketSize * N);
 
 #if defined(USE_GEMV_MMA) && (EIGEN_COMP_LLVM || defined(USE_SLOWER_GEMV_MMA))
@@ -2147,465 +2018,440 @@
 #endif
 
 #ifdef USE_GEMV_COL_COMPLEX_MMA
-#define GEMV_PROCESS_COL_COMPLEX(N) \
-  GEMV_PROCESS_COL_COMPLEX_ONE_MMA(N)
+#define GEMV_PROCESS_COL_COMPLEX(N) GEMV_PROCESS_COL_COMPLEX_ONE_MMA(N)
 #else
 #if defined(USE_GEMV_MMA) && (__GNUC__ > 10)
-#define GEMV_PROCESS_COL_COMPLEX(N) \
+#define GEMV_PROCESS_COL_COMPLEX(N)          \
   if (sizeof(Scalar) != sizeof(LhsPacket)) { \
-    GEMV_PROCESS_COL_COMPLEX_ONE_MMA(N) \
-  } else { \
-    GEMV_PROCESS_COL_COMPLEX_ONE(N) \
+    GEMV_PROCESS_COL_COMPLEX_ONE_MMA(N)      \
+  } else {                                   \
+    GEMV_PROCESS_COL_COMPLEX_ONE(N)          \
   }
 #else
-#define GEMV_PROCESS_COL_COMPLEX(N) \
-  GEMV_PROCESS_COL_COMPLEX_ONE(N)
+#define GEMV_PROCESS_COL_COMPLEX(N) GEMV_PROCESS_COL_COMPLEX_ONE(N)
 #endif
 #endif
 
-template<typename Scalar, typename LhsScalar, typename LhsMapper, bool ConjugateLhs, bool LhsIsReal, typename RhsScalar, typename RhsMapper, bool ConjugateRhs, bool RhsIsReal, typename ResScalar>
-EIGEN_STRONG_INLINE void gemv_complex_col(
-    Index rows, Index cols,
-    const LhsMapper& alhs,
-    const RhsMapper& rhs,
-    ResScalar* res, Index resIncr,
-    ResScalar alpha)
-{
-    typedef gemv_traits<LhsScalar, RhsScalar> Traits;
+template <typename Scalar, typename LhsScalar, typename LhsMapper, bool ConjugateLhs, bool LhsIsReal,
+          typename RhsScalar, typename RhsMapper, bool ConjugateRhs, bool RhsIsReal, typename ResScalar>
+EIGEN_STRONG_INLINE void gemv_complex_col(Index rows, Index cols, const LhsMapper& alhs, const RhsMapper& rhs,
+                                          ResScalar* res, Index resIncr, ResScalar alpha) {
+  typedef gemv_traits<LhsScalar, RhsScalar> Traits;
 
-    typedef typename Traits::LhsPacket LhsPacket;
-    typedef typename Traits::RhsPacket RhsPacket;
-    typedef typename Traits::ResPacket ResPacket;
+  typedef typename Traits::LhsPacket LhsPacket;
+  typedef typename Traits::RhsPacket RhsPacket;
+  typedef typename Traits::ResPacket ResPacket;
 
-    typedef typename packet_traits<Scalar>::type ScalarPacket;
-    typedef typename packet_traits<LhsScalar>::type PLhsPacket;
-    typedef typename packet_traits<ResScalar>::type PResPacket;
-    typedef gemv_traits<ResPacket, ResPacket> PTraits;
+  typedef typename packet_traits<Scalar>::type ScalarPacket;
+  typedef typename packet_traits<LhsScalar>::type PLhsPacket;
+  typedef typename packet_traits<ResScalar>::type PResPacket;
+  typedef gemv_traits<ResPacket, ResPacket> PTraits;
 
-    EIGEN_UNUSED_VARIABLE(resIncr);
-    eigen_internal_assert(resIncr == 1);
+  EIGEN_UNUSED_VARIABLE(resIncr);
+  eigen_internal_assert(resIncr == 1);
 
-    // The following copy tells the compiler that lhs's attributes are not modified outside this function
-    // This helps GCC to generate proper code.
-    LhsMapper lhs(alhs);
-    RhsMapper rhs2(rhs);
+  // The following copy tells the compiler that lhs's attributes are not modified outside this function
+  // This helps GCC to generate proper code.
+  LhsMapper lhs(alhs);
+  RhsMapper rhs2(rhs);
 
-    conj_helper<LhsScalar, RhsScalar, ConjugateLhs, ConjugateRhs> cj;
+  conj_helper<LhsScalar, RhsScalar, ConjugateLhs, ConjugateRhs> cj;
 
-    const Index lhsStride = lhs.stride();
-    // TODO: for padded aligned inputs, we could enable aligned reads
-    enum {
-        LhsAlignment = Unaligned,
-        ResPacketSize = PTraits::ResPacketSize,
-        LhsPacketSize = PTraits::LhsPacketSize,
-        RhsPacketSize = PTraits::RhsPacketSize,
-    };
+  const Index lhsStride = lhs.stride();
+  // TODO: for padded aligned inputs, we could enable aligned reads
+  enum {
+    LhsAlignment = Unaligned,
+    ResPacketSize = PTraits::ResPacketSize,
+    LhsPacketSize = PTraits::LhsPacketSize,
+    RhsPacketSize = PTraits::RhsPacketSize,
+  };
 #ifdef EIGEN_POWER_USE_GEMV_PREFETCH
-    const Index prefetch_dist = 64 * LhsPacketSize;
+  const Index prefetch_dist = 64 * LhsPacketSize;
 #endif
 
 #ifndef GCC_ONE_VECTORPAIR_BUG
-    const Index n8 = rows - 8 * ResPacketSize + 1;
-    const Index n4 = rows - 4 * ResPacketSize + 1;
-    const Index n2 = rows - 2 * ResPacketSize + 1;
+  const Index n8 = rows - 8 * ResPacketSize + 1;
+  const Index n4 = rows - 4 * ResPacketSize + 1;
+  const Index n2 = rows - 2 * ResPacketSize + 1;
 #endif
-    const Index n1 = rows - 1 * ResPacketSize + 1;
+  const Index n1 = rows - 1 * ResPacketSize + 1;
 
-    // TODO: improve the following heuristic:
-    const Index block_cols = cols < 128 ? cols : (lhsStride * sizeof(LhsScalar) < 16000 ? 16 : 8);
+  // TODO: improve the following heuristic:
+  const Index block_cols = cols < 128 ? cols : (lhsStride * sizeof(LhsScalar) < 16000 ? 16 : 8);
 
-    typedef alpha_store<PResPacket, ResPacket, ResScalar, Scalar> AlphaData;
-    AlphaData alpha_data(alpha);
+  typedef alpha_store<PResPacket, ResPacket, ResScalar, Scalar> AlphaData;
+  AlphaData alpha_data(alpha);
 
-    for (Index j2 = 0; j2 < cols; j2 += block_cols)
-    {
-        Index jend = numext::mini(j2 + block_cols, cols);
-        Index i = 0;
-        PResPacket c00, c01, c02, c03, c04, c05, c06, c07;
-        ResPacket c10, c11, c12, c13, c14, c15, c16, c17;
-        PLhsPacket f0, f1, f2, f3, f4, f5, f6, f7;
+  for (Index j2 = 0; j2 < cols; j2 += block_cols) {
+    Index jend = numext::mini(j2 + block_cols, cols);
+    Index i = 0;
+    PResPacket c00, c01, c02, c03, c04, c05, c06, c07;
+    ResPacket c10, c11, c12, c13, c14, c15, c16, c17;
+    PLhsPacket f0, f1, f2, f3, f4, f5, f6, f7;
 #ifdef USE_GEMV_MMA
-        __vector_quad e00, e01, e02, e03, e04, e05, e06, e07;
-        __vector_pair a0, a1, a2, a3, a4, a5, a6, a7;
-        PacketBlock<ScalarPacket, 4> result00, result01, result02, result03, result04, result05, result06, result07;
-        GEMV_UNUSED(8, e0)
-        GEMV_UNUSED(8, result0)
-        GEMV_UNUSED(8, a)
-        GEMV_UNUSED(8, f)
+    __vector_quad e00, e01, e02, e03, e04, e05, e06, e07;
+    __vector_pair a0, a1, a2, a3, a4, a5, a6, a7;
+    PacketBlock<ScalarPacket, 4> result00, result01, result02, result03, result04, result05, result06, result07;
+    GEMV_UNUSED(8, e0)
+    GEMV_UNUSED(8, result0)
+    GEMV_UNUSED(8, a)
+    GEMV_UNUSED(8, f)
 #if !defined(GCC_ONE_VECTORPAIR_BUG) && defined(USE_GEMV_COL_COMPLEX_MMA)
-        if (GEMV_IS_COMPLEX_COMPLEX || !GEMV_IS_COMPLEX_FLOAT)
+    if (GEMV_IS_COMPLEX_COMPLEX || !GEMV_IS_COMPLEX_FLOAT)
 #endif
 #endif
 #ifndef GCC_ONE_VECTORPAIR_BUG
-        {
-            while (i < n8)
-            {
-                GEMV_PROCESS_COL_COMPLEX(8)
-            }
-        }
-        while (i < n4)
-        {
-            GEMV_PROCESS_COL_COMPLEX(4)
-        }
-        if (i < n2)
-        {
-            GEMV_PROCESS_COL_COMPLEX(2)
-        }
-        if (i < n1)
-#else
-        while (i < n1)
-#endif
-        {
-            GEMV_PROCESS_COL_COMPLEX_ONE(1)
-        }
-        for (;i < rows;++i)
-        {
-            ResScalar d0(0);
-            Index j = j2;
-            do {
-                d0 += cj.pmul(lhs(i, j), rhs2(j, 0));
-            } while (++j < jend);
-            res[i] += alpha * d0;
-        }
+    {
+      while (i < n8) {
+        GEMV_PROCESS_COL_COMPLEX(8)
+      }
     }
+    while (i < n4) {
+      GEMV_PROCESS_COL_COMPLEX(4)
+    }
+    if (i < n2) {
+      GEMV_PROCESS_COL_COMPLEX(2)
+    }
+    if (i < n1)
+#else
+    while (i < n1)
+#endif
+    {
+      GEMV_PROCESS_COL_COMPLEX_ONE(1)
+    }
+    for (; i < rows; ++i) {
+      ResScalar d0(0);
+      Index j = j2;
+      do {
+        d0 += cj.pmul(lhs(i, j), rhs2(j, 0));
+      } while (++j < jend);
+      res[i] += alpha * d0;
+    }
+  }
 }
 
-template <typename Scalar, int N> struct ScalarBlock {
-    Scalar scalar[N];
+template <typename Scalar, int N>
+struct ScalarBlock {
+  Scalar scalar[N];
 };
 
 #ifdef USE_GEMV_MMA
-static Packet16uc p16uc_ELEMENT_3 = { 0x0c,0x0d,0x0e,0x0f, 0x1c,0x1d,0x1e,0x1f, 0x0c,0x0d,0x0e,0x0f, 0x1c,0x1d,0x1e,0x1f };
+static Packet16uc p16uc_ELEMENT_3 = {0x0c, 0x0d, 0x0e, 0x0f, 0x1c, 0x1d, 0x1e, 0x1f,
+                                     0x0c, 0x0d, 0x0e, 0x0f, 0x1c, 0x1d, 0x1e, 0x1f};
 
 /** \internal predux (add elements of a vector) from a MMA accumulator - real results */
-template<typename ResScalar, typename ResPacket>
-EIGEN_ALWAYS_INLINE ScalarBlock<ResScalar, 2> predux_real(__vector_quad* acc0, __vector_quad* acc1)
-{
-    PacketBlock<ResPacket, 4> result0, result1;
-    __builtin_mma_disassemble_acc(&result0.packet, acc0);
-    __builtin_mma_disassemble_acc(&result1.packet, acc1);
-    result0.packet[0] = vec_mergeh(result0.packet[0], result1.packet[0]);
-    result0.packet[1] = vec_mergeo(result0.packet[1], result1.packet[1]);
-    result0.packet[2] = vec_mergel(result0.packet[2], result1.packet[2]);
-    result0.packet[3] = vec_perm(result0.packet[3], result1.packet[3], p16uc_ELEMENT_3);
-    result0.packet[0] = vec_add(vec_add(result0.packet[0], result0.packet[2]), vec_add(result0.packet[1], result0.packet[3]));
-    return *reinterpret_cast<ScalarBlock<ResScalar, 2> *>(&result0.packet[0]);
+template <typename ResScalar, typename ResPacket>
+EIGEN_ALWAYS_INLINE ScalarBlock<ResScalar, 2> predux_real(__vector_quad* acc0, __vector_quad* acc1) {
+  PacketBlock<ResPacket, 4> result0, result1;
+  __builtin_mma_disassemble_acc(&result0.packet, acc0);
+  __builtin_mma_disassemble_acc(&result1.packet, acc1);
+  result0.packet[0] = vec_mergeh(result0.packet[0], result1.packet[0]);
+  result0.packet[1] = vec_mergeo(result0.packet[1], result1.packet[1]);
+  result0.packet[2] = vec_mergel(result0.packet[2], result1.packet[2]);
+  result0.packet[3] = vec_perm(result0.packet[3], result1.packet[3], p16uc_ELEMENT_3);
+  result0.packet[0] =
+      vec_add(vec_add(result0.packet[0], result0.packet[2]), vec_add(result0.packet[1], result0.packet[3]));
+  return *reinterpret_cast<ScalarBlock<ResScalar, 2>*>(&result0.packet[0]);
 }
 
-template<>
-EIGEN_ALWAYS_INLINE ScalarBlock<double, 2> predux_real<double, Packet2d>(__vector_quad* acc0, __vector_quad* acc1)
-{
-    PacketBlock<Packet2d, 4> result0, result1;
-    __builtin_mma_disassemble_acc(&result0.packet, acc0);
-    __builtin_mma_disassemble_acc(&result1.packet, acc1);
-    result0.packet[0] = vec_add(vec_mergeh(result0.packet[0], result1.packet[0]), vec_mergel(result0.packet[1], result1.packet[1]));
-    return *reinterpret_cast<ScalarBlock<double, 2> *>(&result0.packet[0]);
+template <>
+EIGEN_ALWAYS_INLINE ScalarBlock<double, 2> predux_real<double, Packet2d>(__vector_quad* acc0, __vector_quad* acc1) {
+  PacketBlock<Packet2d, 4> result0, result1;
+  __builtin_mma_disassemble_acc(&result0.packet, acc0);
+  __builtin_mma_disassemble_acc(&result1.packet, acc1);
+  result0.packet[0] =
+      vec_add(vec_mergeh(result0.packet[0], result1.packet[0]), vec_mergel(result0.packet[1], result1.packet[1]));
+  return *reinterpret_cast<ScalarBlock<double, 2>*>(&result0.packet[0]);
 }
 
 /** \internal add complex results together */
-template<typename LhsPacket, typename RhsPacket, bool ConjugateLhs, bool ConjugateRhs>
-EIGEN_ALWAYS_INLINE ScalarBlock<std::complex<float>, 2> addComplexResults(PacketBlock<Packet4f, 4>& result0, PacketBlock<Packet4f, 4>& result1)
-{
-    ScalarBlock<std::complex<float>, 2> cc0;
-    result0.packet[0] = reinterpret_cast<Packet4f>(vec_mergeh(reinterpret_cast<Packet2d>(result0.packet[0]), reinterpret_cast<Packet2d>(result1.packet[0])));
-    result0.packet[2] = reinterpret_cast<Packet4f>(vec_mergel(reinterpret_cast<Packet2d>(result0.packet[2]), reinterpret_cast<Packet2d>(result1.packet[2])));
-    result0.packet[0] = vec_add(result0.packet[0], result0.packet[2]);
-    if (GEMV_IS_COMPLEX_COMPLEX) {
-        result0.packet[1] = reinterpret_cast<Packet4f>(vec_mergeh(reinterpret_cast<Packet2d>(result0.packet[1]), reinterpret_cast<Packet2d>(result1.packet[1])));
-        result0.packet[3] = reinterpret_cast<Packet4f>(vec_mergel(reinterpret_cast<Packet2d>(result0.packet[3]), reinterpret_cast<Packet2d>(result1.packet[3])));
-        result0.packet[1] = vec_add(result0.packet[1], result0.packet[3]);
-        if (ConjugateLhs) {
-            result0.packet[0] = pconj2(convertComplex(result0.packet[0])).v;
-            result0.packet[1] = pcplxflip2(convertComplex(result0.packet[1])).v;
-        } else if (ConjugateRhs) {
-            result0.packet[1] = pcplxconjflip(convertComplex(result0.packet[1])).v;
-        } else {
-            result0.packet[1] = pcplxflipconj(convertComplex(result0.packet[1])).v;
-        }
-        result0.packet[0] = vec_add(result0.packet[0], result0.packet[1]);
+template <typename LhsPacket, typename RhsPacket, bool ConjugateLhs, bool ConjugateRhs>
+EIGEN_ALWAYS_INLINE ScalarBlock<std::complex<float>, 2> addComplexResults(PacketBlock<Packet4f, 4>& result0,
+                                                                          PacketBlock<Packet4f, 4>& result1) {
+  ScalarBlock<std::complex<float>, 2> cc0;
+  result0.packet[0] = reinterpret_cast<Packet4f>(
+      vec_mergeh(reinterpret_cast<Packet2d>(result0.packet[0]), reinterpret_cast<Packet2d>(result1.packet[0])));
+  result0.packet[2] = reinterpret_cast<Packet4f>(
+      vec_mergel(reinterpret_cast<Packet2d>(result0.packet[2]), reinterpret_cast<Packet2d>(result1.packet[2])));
+  result0.packet[0] = vec_add(result0.packet[0], result0.packet[2]);
+  if (GEMV_IS_COMPLEX_COMPLEX) {
+    result0.packet[1] = reinterpret_cast<Packet4f>(
+        vec_mergeh(reinterpret_cast<Packet2d>(result0.packet[1]), reinterpret_cast<Packet2d>(result1.packet[1])));
+    result0.packet[3] = reinterpret_cast<Packet4f>(
+        vec_mergel(reinterpret_cast<Packet2d>(result0.packet[3]), reinterpret_cast<Packet2d>(result1.packet[3])));
+    result0.packet[1] = vec_add(result0.packet[1], result0.packet[3]);
+    if (ConjugateLhs) {
+      result0.packet[0] = pconj2(convertComplex(result0.packet[0])).v;
+      result0.packet[1] = pcplxflip2(convertComplex(result0.packet[1])).v;
+    } else if (ConjugateRhs) {
+      result0.packet[1] = pcplxconjflip(convertComplex(result0.packet[1])).v;
     } else {
-        if (ConjugateLhs && (sizeof(LhsPacket) == sizeof(std::complex<float>))) {
-            result0.packet[0] = pconj2(convertComplex(result0.packet[0])).v;
-        }
+      result0.packet[1] = pcplxflipconj(convertComplex(result0.packet[1])).v;
     }
-    cc0.scalar[0].real(result0.packet[0][0]);
-    cc0.scalar[0].imag(result0.packet[0][1]);
-    cc0.scalar[1].real(result0.packet[0][2]);
-    cc0.scalar[1].imag(result0.packet[0][3]);
-    return cc0;
+    result0.packet[0] = vec_add(result0.packet[0], result0.packet[1]);
+  } else {
+    if (ConjugateLhs && (sizeof(LhsPacket) == sizeof(std::complex<float>))) {
+      result0.packet[0] = pconj2(convertComplex(result0.packet[0])).v;
+    }
+  }
+  cc0.scalar[0].real(result0.packet[0][0]);
+  cc0.scalar[0].imag(result0.packet[0][1]);
+  cc0.scalar[1].real(result0.packet[0][2]);
+  cc0.scalar[1].imag(result0.packet[0][3]);
+  return cc0;
 }
 
-template<typename LhsPacket, typename RhsPacket, bool ConjugateLhs, bool ConjugateRhs>
-EIGEN_ALWAYS_INLINE ScalarBlock<std::complex<double>, 2> addComplexResults(PacketBlock<Packet2d, 4>&, PacketBlock<Packet2d, 4>&)
-{
-    ScalarBlock<std::complex<double>, 2> cc0;
-    EIGEN_UNUSED_VARIABLE(cc0);
-    return cc0;  // Just for compilation
+template <typename LhsPacket, typename RhsPacket, bool ConjugateLhs, bool ConjugateRhs>
+EIGEN_ALWAYS_INLINE ScalarBlock<std::complex<double>, 2> addComplexResults(PacketBlock<Packet2d, 4>&,
+                                                                           PacketBlock<Packet2d, 4>&) {
+  ScalarBlock<std::complex<double>, 2> cc0;
+  EIGEN_UNUSED_VARIABLE(cc0);
+  return cc0;  // Just for compilation
 }
 
 /** \internal predux (add elements of a vector) from a MMA accumulator - complex results */
-template<typename ResScalar, typename ResPacket, typename LhsPacket, typename RhsPacket, bool ConjugateLhs, bool ConjugateRhs>
-EIGEN_ALWAYS_INLINE ScalarBlock<ResScalar, 2> predux_complex(__vector_quad* acc0, __vector_quad* acc1)
-{
-    PacketBlock<ResPacket, 4> result0, result1;
-    __builtin_mma_disassemble_acc(&result0.packet, acc0);
-    __builtin_mma_disassemble_acc(&result1.packet, acc1);
-    return addComplexResults<LhsPacket, RhsPacket, ConjugateLhs, ConjugateRhs>(result0, result1);
+template <typename ResScalar, typename ResPacket, typename LhsPacket, typename RhsPacket, bool ConjugateLhs,
+          bool ConjugateRhs>
+EIGEN_ALWAYS_INLINE ScalarBlock<ResScalar, 2> predux_complex(__vector_quad* acc0, __vector_quad* acc1) {
+  PacketBlock<ResPacket, 4> result0, result1;
+  __builtin_mma_disassemble_acc(&result0.packet, acc0);
+  __builtin_mma_disassemble_acc(&result1.packet, acc1);
+  return addComplexResults<LhsPacket, RhsPacket, ConjugateLhs, ConjugateRhs>(result0, result1);
 }
 
-template<typename ResScalar, typename ResPacket>
-EIGEN_ALWAYS_INLINE ScalarBlock<ResScalar, 2> predux_real(__vector_quad* acc0)
-{
-    PacketBlock<ResPacket, 4> result0;
-    __builtin_mma_disassemble_acc(&result0.packet, acc0);
-    result0.packet[0] = vec_add(vec_mergeh(result0.packet[0], result0.packet[2]), vec_mergel(result0.packet[1], result0.packet[3]));
-    return *reinterpret_cast<ScalarBlock<ResScalar, 2> *>(&result0.packet[0]);
+template <typename ResScalar, typename ResPacket>
+EIGEN_ALWAYS_INLINE ScalarBlock<ResScalar, 2> predux_real(__vector_quad* acc0) {
+  PacketBlock<ResPacket, 4> result0;
+  __builtin_mma_disassemble_acc(&result0.packet, acc0);
+  result0.packet[0] =
+      vec_add(vec_mergeh(result0.packet[0], result0.packet[2]), vec_mergel(result0.packet[1], result0.packet[3]));
+  return *reinterpret_cast<ScalarBlock<ResScalar, 2>*>(&result0.packet[0]);
 }
 
-template<typename ResScalar, typename ResPacket, typename LhsPacket, typename RhsPacket, bool ConjugateLhs, bool ConjugateRhs>
-EIGEN_ALWAYS_INLINE ScalarBlock<ResScalar, 2> predux_complex(__vector_quad* acc0)
-{
-    ScalarBlock<ResScalar, 2> cc0;
-    PacketBlock<ResPacket, 4> result0;
-    __builtin_mma_disassemble_acc(&result0.packet, acc0);
-    if (GEMV_IS_COMPLEX_COMPLEX) {
-        if (ConjugateLhs) {
-            result0.packet[1] = pconjinv(convertComplex(result0.packet[1])).v;
-            result0.packet[3] = pconjinv(convertComplex(result0.packet[3])).v;
-        } else if (ConjugateRhs) {
-            result0.packet[0] = pconj2(convertComplex(result0.packet[0])).v;
-            result0.packet[2] = pconj2(convertComplex(result0.packet[2])).v;
-        } else {
-            result0.packet[1] = pconj2(convertComplex(result0.packet[1])).v;
-            result0.packet[3] = pconj2(convertComplex(result0.packet[3])).v;
-        }
-        result0.packet[0] = vec_add(result0.packet[0], __builtin_vsx_xxpermdi(result0.packet[1], result0.packet[1], 2));
-        result0.packet[2] = vec_add(result0.packet[2], __builtin_vsx_xxpermdi(result0.packet[3], result0.packet[3], 2));
+template <typename ResScalar, typename ResPacket, typename LhsPacket, typename RhsPacket, bool ConjugateLhs,
+          bool ConjugateRhs>
+EIGEN_ALWAYS_INLINE ScalarBlock<ResScalar, 2> predux_complex(__vector_quad* acc0) {
+  ScalarBlock<ResScalar, 2> cc0;
+  PacketBlock<ResPacket, 4> result0;
+  __builtin_mma_disassemble_acc(&result0.packet, acc0);
+  if (GEMV_IS_COMPLEX_COMPLEX) {
+    if (ConjugateLhs) {
+      result0.packet[1] = pconjinv(convertComplex(result0.packet[1])).v;
+      result0.packet[3] = pconjinv(convertComplex(result0.packet[3])).v;
+    } else if (ConjugateRhs) {
+      result0.packet[0] = pconj2(convertComplex(result0.packet[0])).v;
+      result0.packet[2] = pconj2(convertComplex(result0.packet[2])).v;
     } else {
-        result0.packet[0] = __builtin_vsx_xxpermdi(result0.packet[0], result0.packet[1], 1);
-        result0.packet[2] = __builtin_vsx_xxpermdi(result0.packet[2], result0.packet[3], 1);
+      result0.packet[1] = pconj2(convertComplex(result0.packet[1])).v;
+      result0.packet[3] = pconj2(convertComplex(result0.packet[3])).v;
     }
-    cc0.scalar[0].real(result0.packet[0][0]);
-    cc0.scalar[0].imag(result0.packet[0][1]);
-    cc0.scalar[1].real(result0.packet[2][0]);
-    cc0.scalar[1].imag(result0.packet[2][1]);
-    return cc0;
+    result0.packet[0] = vec_add(result0.packet[0], __builtin_vsx_xxpermdi(result0.packet[1], result0.packet[1], 2));
+    result0.packet[2] = vec_add(result0.packet[2], __builtin_vsx_xxpermdi(result0.packet[3], result0.packet[3], 2));
+  } else {
+    result0.packet[0] = __builtin_vsx_xxpermdi(result0.packet[0], result0.packet[1], 1);
+    result0.packet[2] = __builtin_vsx_xxpermdi(result0.packet[2], result0.packet[3], 1);
+  }
+  cc0.scalar[0].real(result0.packet[0][0]);
+  cc0.scalar[0].imag(result0.packet[0][1]);
+  cc0.scalar[1].real(result0.packet[2][0]);
+  cc0.scalar[1].imag(result0.packet[2][1]);
+  return cc0;
 }
 #endif
 
-template<typename ResScalar, typename ResPacket>
-EIGEN_ALWAYS_INLINE ScalarBlock<ResScalar, 2> predux_real(ResPacket& a, ResPacket& b)
-{
-    ScalarBlock<ResScalar, 2> cc0;
-    cc0.scalar[0] = predux(a);
-    cc0.scalar[1] = predux(b);
-    return cc0;
+template <typename ResScalar, typename ResPacket>
+EIGEN_ALWAYS_INLINE ScalarBlock<ResScalar, 2> predux_real(ResPacket& a, ResPacket& b) {
+  ScalarBlock<ResScalar, 2> cc0;
+  cc0.scalar[0] = predux(a);
+  cc0.scalar[1] = predux(b);
+  return cc0;
 }
 
-template<typename ResScalar, typename ResPacket>
-EIGEN_ALWAYS_INLINE ScalarBlock<ResScalar, 2> predux_complex(ResPacket& a, ResPacket& b)
-{
-    return predux_real<ResScalar, ResPacket>(a, b);
+template <typename ResScalar, typename ResPacket>
+EIGEN_ALWAYS_INLINE ScalarBlock<ResScalar, 2> predux_complex(ResPacket& a, ResPacket& b) {
+  return predux_real<ResScalar, ResPacket>(a, b);
 }
 
-#define GEMV_UNROLL_ROW(func, N) \
-  func(0, N) func(1, N) func(2, N) func(3, N) func(4, N) func(5, N) func(6, N) func(7, N)
+#define GEMV_UNROLL_ROW(func, N) func(0, N) func(1, N) func(2, N) func(3, N) func(4, N) func(5, N) func(6, N) func(7, N)
 
-#define GEMV_UNROLL_ROW_HALF(func, N) \
-  func(0, 0, 1, N) func(1, 2, 3, N) func(2, 4, 5, N) func(3, 6, 7, N)
+#define GEMV_UNROLL_ROW_HALF(func, N) func(0, 0, 1, N) func(1, 2, 3, N) func(2, 4, 5, N) func(3, 6, 7, N)
 
-#define GEMV_LOADPACKET_ROW(iter) \
-  lhs.template load<LhsPacket, Unaligned>(i + (iter), j)
+#define GEMV_LOADPACKET_ROW(iter) lhs.template load<LhsPacket, Unaligned>(i + (iter), j)
 
 #ifdef USE_GEMV_MMA
-#define GEMV_UNROLL3_ROW(func, N, which) \
-  func(0, N, which) func(1, N, which) func(2, N, which) func(3, N, which) \
-  func(4, N, which) func(5, N, which) func(6, N, which) func(7, N, which)
+#define GEMV_UNROLL3_ROW(func, N, which)                                                                      \
+  func(0, N, which) func(1, N, which) func(2, N, which) func(3, N, which) func(4, N, which) func(5, N, which) \
+      func(6, N, which) func(7, N, which)
 
-#define GEMV_UNUSED_ROW(N, which) \
-  GEMV_UNROLL3_ROW(GEMV_UNUSED_VAR, N, which)
+#define GEMV_UNUSED_ROW(N, which) GEMV_UNROLL3_ROW(GEMV_UNUSED_VAR, N, which)
 
-#define GEMV_INIT_ROW(iter, N) \
-  if (GEMV_GETN(N) > iter) { \
+#define GEMV_INIT_ROW(iter, N)         \
+  if (GEMV_GETN(N) > iter) {           \
     __builtin_mma_xxsetaccz(&c##iter); \
   }
 
 #define GEMV_LOADPAIR_ROW(iter1, iter2) \
   GEMV_BUILDPAIR_MMA(b##iter1, GEMV_LOADPACKET_ROW(iter2), GEMV_LOADPACKET_ROW((iter2) + 1));
 
-#define GEMV_WORK_ROW(iter, N) \
-  if (GEMV_GETN(N) > iter) { \
-    if (GEMV_IS_FLOAT) { \
+#define GEMV_WORK_ROW(iter, N)                                                              \
+  if (GEMV_GETN(N) > iter) {                                                                \
+    if (GEMV_IS_FLOAT) {                                                                    \
       pger_vecMMA_acc<LhsPacket, RhsPacket, true>(&c##iter, a0, GEMV_LOADPACKET_ROW(iter)); \
-    } else { \
-      __vector_pair b##iter; \
-      GEMV_LOADPAIR_ROW(iter, iter << 1) \
-      pger_vecMMA_acc<LhsPacket, RhsPacket, true>(&c##iter, b##iter, a0); \
-    } \
+    } else {                                                                                \
+      __vector_pair b##iter;                                                                \
+      GEMV_LOADPAIR_ROW(iter, iter << 1)                                                    \
+      pger_vecMMA_acc<LhsPacket, RhsPacket, true>(&c##iter, b##iter, a0);                   \
+    }                                                                                       \
   }
 
-#define GEMV_PREDUX2(iter1, iter2, iter3, N) \
-  if (N > iter1) { \
-    if (GEMV_IS_FLOAT) { \
+#define GEMV_PREDUX2(iter1, iter2, iter3, N)                               \
+  if (N > iter1) {                                                         \
+    if (GEMV_IS_FLOAT) {                                                   \
       cc##iter1 = predux_real<ResScalar, ResPacket>(&c##iter2, &c##iter3); \
-    } else { \
-      cc##iter1 = predux_real<ResScalar, ResPacket>(&c##iter1); \
-    } \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(cc##iter1); \
+    } else {                                                               \
+      cc##iter1 = predux_real<ResScalar, ResPacket>(&c##iter1);            \
+    }                                                                      \
+  } else {                                                                 \
+    EIGEN_UNUSED_VARIABLE(cc##iter1);                                      \
   }
 #else
-#define GEMV_INIT_ROW(iter, N) \
-  if (N > iter) { \
+#define GEMV_INIT_ROW(iter, N)                \
+  if (N > iter) {                             \
     c##iter = pset1<ResPacket>(ResScalar(0)); \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(c##iter); \
+  } else {                                    \
+    EIGEN_UNUSED_VARIABLE(c##iter);           \
   }
 
-#define GEMV_WORK_ROW(iter, N) \
-  if (N > iter) { \
+#define GEMV_WORK_ROW(iter, N)                                   \
+  if (N > iter) {                                                \
     c##iter = pcj.pmadd(GEMV_LOADPACKET_ROW(iter), a0, c##iter); \
   }
 
-#define GEMV_PREDUX2(iter1, iter2, iter3, N) \
-  if (N > iter1) { \
+#define GEMV_PREDUX2(iter1, iter2, iter3, N)                           \
+  if (N > iter1) {                                                     \
     cc##iter1 = predux_real<ResScalar, ResPacket>(c##iter2, c##iter3); \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(cc##iter1); \
+  } else {                                                             \
+    EIGEN_UNUSED_VARIABLE(cc##iter1);                                  \
   }
 #endif
 
-#define GEMV_MULT(iter1, iter2, iter3, N) \
-  if (N > iter1) { \
+#define GEMV_MULT(iter1, iter2, iter3, N)                  \
+  if (N > iter1) {                                         \
     cc##iter1.scalar[0] += cj.pmul(lhs(i + iter2, j), a0); \
     cc##iter1.scalar[1] += cj.pmul(lhs(i + iter3, j), a0); \
   }
 
-#define GEMV_STORE_ROW(iter1, iter2, iter3, N) \
-  if (N > iter1) { \
+#define GEMV_STORE_ROW(iter1, iter2, iter3, N)                                           \
+  if (N > iter1) {                                                                       \
     storeMaddData<ResScalar>(res + ((i + iter2) * resIncr), alpha, cc##iter1.scalar[0]); \
     storeMaddData<ResScalar>(res + ((i + iter3) * resIncr), alpha, cc##iter1.scalar[1]); \
   }
 
 /** \internal main macro for gemv_row - initialize accumulators, multiply and add inputs, predux and store results */
-#define GEMV_PROCESS_ROW(N) \
-  for (; i < n##N; i += N) { \
-    GEMV_UNROLL_ROW(GEMV_INIT_ROW, N) \
-    Index j = 0; \
-    for (; j + LhsPacketSize <= cols; j += LhsPacketSize) { \
+#define GEMV_PROCESS_ROW(N)                                       \
+  for (; i < n##N; i += N) {                                      \
+    GEMV_UNROLL_ROW(GEMV_INIT_ROW, N)                             \
+    Index j = 0;                                                  \
+    for (; j + LhsPacketSize <= cols; j += LhsPacketSize) {       \
       RhsPacket a0 = rhs2.template load<RhsPacket, Unaligned>(j); \
-      GEMV_UNROLL_ROW(GEMV_WORK_ROW, N) \
-    } \
-    GEMV_UNROLL_ROW_HALF(GEMV_PREDUX2, (N >> 1)) \
-    for (; j < cols; ++j) { \
-      RhsScalar a0 = rhs2(j); \
-      GEMV_UNROLL_ROW_HALF(GEMV_MULT, (N >> 1)) \
-    } \
-    GEMV_UNROLL_ROW_HALF(GEMV_STORE_ROW, (N >> 1)) \
+      GEMV_UNROLL_ROW(GEMV_WORK_ROW, N)                           \
+    }                                                             \
+    GEMV_UNROLL_ROW_HALF(GEMV_PREDUX2, (N >> 1))                  \
+    for (; j < cols; ++j) {                                       \
+      RhsScalar a0 = rhs2(j);                                     \
+      GEMV_UNROLL_ROW_HALF(GEMV_MULT, (N >> 1))                   \
+    }                                                             \
+    GEMV_UNROLL_ROW_HALF(GEMV_STORE_ROW, (N >> 1))                \
   }
 
-template<typename LhsScalar, typename LhsMapper, typename RhsScalar, typename RhsMapper, typename ResScalar>
-EIGEN_STRONG_INLINE void gemv_row(
-    Index rows, Index cols,
-    const LhsMapper& alhs,
-    const RhsMapper& rhs,
-    ResScalar* res, Index resIncr,
-    ResScalar alpha)
-{
-    typedef gemv_traits<LhsScalar, RhsScalar> Traits;
+template <typename LhsScalar, typename LhsMapper, typename RhsScalar, typename RhsMapper, typename ResScalar>
+EIGEN_STRONG_INLINE void gemv_row(Index rows, Index cols, const LhsMapper& alhs, const RhsMapper& rhs, ResScalar* res,
+                                  Index resIncr, ResScalar alpha) {
+  typedef gemv_traits<LhsScalar, RhsScalar> Traits;
 
-    typedef typename Traits::LhsPacket LhsPacket;
-    typedef typename Traits::RhsPacket RhsPacket;
-    typedef typename Traits::ResPacket ResPacket;
+  typedef typename Traits::LhsPacket LhsPacket;
+  typedef typename Traits::RhsPacket RhsPacket;
+  typedef typename Traits::ResPacket ResPacket;
 
-    // The following copy tells the compiler that lhs's attributes are not modified outside this function
-    // This helps GCC to generate proper code.
-    LhsMapper lhs(alhs);
-    typename RhsMapper::LinearMapper rhs2 = rhs.getLinearMapper(0, 0);
+  // The following copy tells the compiler that lhs's attributes are not modified outside this function
+  // This helps GCC to generate proper code.
+  LhsMapper lhs(alhs);
+  typename RhsMapper::LinearMapper rhs2 = rhs.getLinearMapper(0, 0);
 
-    eigen_internal_assert(rhs.stride() == 1);
-    conj_helper<LhsScalar, RhsScalar, false, false> cj;
-    conj_helper<LhsPacket, RhsPacket, false, false> pcj;
+  eigen_internal_assert(rhs.stride() == 1);
+  conj_helper<LhsScalar, RhsScalar, false, false> cj;
+  conj_helper<LhsPacket, RhsPacket, false, false> pcj;
 
-    // TODO: fine tune the following heuristic. The rationale is that if the matrix is very large,
-    //       processing 8 rows at once might be counter productive wrt cache.
+  // TODO: fine tune the following heuristic. The rationale is that if the matrix is very large,
+  //       processing 8 rows at once might be counter productive wrt cache.
 #ifndef GCC_ONE_VECTORPAIR_BUG
-    const Index n8 = lhs.stride() * sizeof(LhsScalar) > 32000 ? (rows - 7) : (rows - 7);
-    const Index n4 = rows - 3;
-    const Index n2 = rows - 1;
+  const Index n8 = lhs.stride() * sizeof(LhsScalar) > 32000 ? (rows - 7) : (rows - 7);
+  const Index n4 = rows - 3;
+  const Index n2 = rows - 1;
 #endif
 
-    // TODO: for padded aligned inputs, we could enable aligned reads
-    enum {
-        LhsAlignment = Unaligned,
-        ResPacketSize = Traits::ResPacketSize,
-        LhsPacketSize = Traits::LhsPacketSize,
-        RhsPacketSize = Traits::RhsPacketSize,
-    };
+  // TODO: for padded aligned inputs, we could enable aligned reads
+  enum {
+    LhsAlignment = Unaligned,
+    ResPacketSize = Traits::ResPacketSize,
+    LhsPacketSize = Traits::LhsPacketSize,
+    RhsPacketSize = Traits::RhsPacketSize,
+  };
 
-    Index i = 0;
+  Index i = 0;
 #ifdef USE_GEMV_MMA
-    __vector_quad c0, c1, c2, c3, c4, c5, c6, c7;
-    GEMV_UNUSED_ROW(8, c)
+  __vector_quad c0, c1, c2, c3, c4, c5, c6, c7;
+  GEMV_UNUSED_ROW(8, c)
 #else
-    ResPacket c0, c1, c2, c3, c4, c5, c6, c7;
+  ResPacket c0, c1, c2, c3, c4, c5, c6, c7;
 #endif
 #ifndef GCC_ONE_VECTORPAIR_BUG
-    ScalarBlock<ResScalar, 2> cc0, cc1, cc2, cc3;
-    GEMV_PROCESS_ROW(8)
-    GEMV_PROCESS_ROW(4)
-    GEMV_PROCESS_ROW(2)
+  ScalarBlock<ResScalar, 2> cc0, cc1, cc2, cc3;
+  GEMV_PROCESS_ROW(8)
+  GEMV_PROCESS_ROW(4)
+  GEMV_PROCESS_ROW(2)
 #endif
-    for (; i < rows; ++i)
-    {
-        ResPacket d0 = pset1<ResPacket>(ResScalar(0));
-        Index j = 0;
-        for (; j + LhsPacketSize <= cols; j += LhsPacketSize)
-        {
-            RhsPacket b0 = rhs2.template load<RhsPacket, Unaligned>(j);
+  for (; i < rows; ++i) {
+    ResPacket d0 = pset1<ResPacket>(ResScalar(0));
+    Index j = 0;
+    for (; j + LhsPacketSize <= cols; j += LhsPacketSize) {
+      RhsPacket b0 = rhs2.template load<RhsPacket, Unaligned>(j);
 
-            d0 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + 0, j), b0, d0);
-        }
-        ResScalar dd0 = predux(d0);
-        for (; j < cols; ++j)
-        {
-            dd0 += cj.pmul(lhs(i, j), rhs2(j));
-        }
-        res[i * resIncr] += alpha * dd0;
+      d0 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + 0, j), b0, d0);
     }
+    ResScalar dd0 = predux(d0);
+    for (; j < cols; ++j) {
+      dd0 += cj.pmul(lhs(i, j), rhs2(j));
+    }
+    res[i * resIncr] += alpha * dd0;
+  }
 }
 
-#define EIGEN_POWER_GEMV_REAL_SPECIALIZE_COL(Scalar) \
-template<typename Index, typename LhsMapper, bool ConjugateLhs, typename RhsMapper, bool ConjugateRhs, int Version> \
-struct general_matrix_vector_product<Index, Scalar, LhsMapper, ColMajor, ConjugateLhs, Scalar, RhsMapper, ConjugateRhs, Version> \
-{ \
-    typedef typename ScalarBinaryOpTraits<Scalar, Scalar>::ReturnType ResScalar; \
-\
-    EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE static void run( \
-        Index rows, Index cols, \
-        const LhsMapper& lhs, \
-        const RhsMapper& rhs, \
-        ResScalar* res, Index resIncr, \
-        ResScalar alpha) { \
-        gemv_col<Scalar, LhsMapper, Scalar, RhsMapper, ResScalar>(rows, cols, lhs, rhs, res, resIncr, alpha); \
-    } \
-};
+#define EIGEN_POWER_GEMV_REAL_SPECIALIZE_COL(Scalar)                                                                   \
+  template <typename Index, typename LhsMapper, bool ConjugateLhs, typename RhsMapper, bool ConjugateRhs, int Version> \
+  struct general_matrix_vector_product<Index, Scalar, LhsMapper, ColMajor, ConjugateLhs, Scalar, RhsMapper,            \
+                                       ConjugateRhs, Version> {                                                        \
+    typedef typename ScalarBinaryOpTraits<Scalar, Scalar>::ReturnType ResScalar;                                       \
+                                                                                                                       \
+    EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE static void run(Index rows, Index cols, const LhsMapper& lhs,                  \
+                                                        const RhsMapper& rhs, ResScalar* res, Index resIncr,           \
+                                                        ResScalar alpha) {                                             \
+      gemv_col<Scalar, LhsMapper, Scalar, RhsMapper, ResScalar>(rows, cols, lhs, rhs, res, resIncr, alpha);            \
+    }                                                                                                                  \
+  };
 
-#define EIGEN_POWER_GEMV_REAL_SPECIALIZE_ROW(Scalar) \
-template<typename Index, typename LhsMapper, bool ConjugateLhs, typename RhsMapper, bool ConjugateRhs, int Version> \
-struct general_matrix_vector_product<Index, Scalar, LhsMapper, RowMajor, ConjugateLhs, Scalar, RhsMapper, ConjugateRhs, Version> \
-{ \
-    typedef typename ScalarBinaryOpTraits<Scalar, Scalar>::ReturnType ResScalar; \
-\
-    EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE static void run( \
-        Index rows, Index cols, \
-        const LhsMapper& lhs, \
-        const RhsMapper& rhs, \
-        ResScalar* res, Index resIncr, \
-        ResScalar alpha) { \
-        gemv_row<Scalar, LhsMapper, Scalar, RhsMapper, ResScalar>(rows, cols, lhs, rhs, res, resIncr, alpha); \
-    } \
-};
+#define EIGEN_POWER_GEMV_REAL_SPECIALIZE_ROW(Scalar)                                                                   \
+  template <typename Index, typename LhsMapper, bool ConjugateLhs, typename RhsMapper, bool ConjugateRhs, int Version> \
+  struct general_matrix_vector_product<Index, Scalar, LhsMapper, RowMajor, ConjugateLhs, Scalar, RhsMapper,            \
+                                       ConjugateRhs, Version> {                                                        \
+    typedef typename ScalarBinaryOpTraits<Scalar, Scalar>::ReturnType ResScalar;                                       \
+                                                                                                                       \
+    EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE static void run(Index rows, Index cols, const LhsMapper& lhs,                  \
+                                                        const RhsMapper& rhs, ResScalar* res, Index resIncr,           \
+                                                        ResScalar alpha) {                                             \
+      gemv_row<Scalar, LhsMapper, Scalar, RhsMapper, ResScalar>(rows, cols, lhs, rhs, res, resIncr, alpha);            \
+    }                                                                                                                  \
+  };
 
 EIGEN_POWER_GEMV_REAL_SPECIALIZE_COL(float)
 EIGEN_POWER_GEMV_REAL_SPECIALIZE_COL(double)
@@ -2613,378 +2459,360 @@
 EIGEN_POWER_GEMV_REAL_SPECIALIZE_ROW(double)
 
 #ifdef USE_GEMV_MMA
-#define gemv_bf16_col  gemvMMA_bfloat16_col
-#define gemv_bf16_row  gemvMMA_bfloat16_row
+#define gemv_bf16_col gemvMMA_bfloat16_col
+#define gemv_bf16_row gemvMMA_bfloat16_row
 #else
-#define gemv_bf16_col  gemv_bfloat16_col
-#define gemv_bf16_row  gemv_bfloat16_row
+#define gemv_bf16_col gemv_bfloat16_col
+#define gemv_bf16_row gemv_bfloat16_row
 #endif
 
-#define EIGEN_POWER_GEMV_REAL_SPECIALIZE_COL_BFLOAT16() \
-template<typename Index, typename LhsMapper, bool ConjugateLhs, typename RhsMapper, bool ConjugateRhs, int Version> \
-struct general_matrix_vector_product<Index, bfloat16, LhsMapper, ColMajor, ConjugateLhs, bfloat16, RhsMapper, ConjugateRhs, Version> \
-{ \
-    EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE static void run( \
-        Index rows, Index cols, \
-        const LhsMapper& lhs, \
-        const RhsMapper& rhs, \
-        bfloat16* res, Index resIncr, \
-        bfloat16 alpha) { \
-        gemv_bf16_col<LhsMapper, RhsMapper>(rows, cols, lhs, rhs, res, resIncr, alpha); \
-    } \
-};
+#define EIGEN_POWER_GEMV_REAL_SPECIALIZE_COL_BFLOAT16()                                                                \
+  template <typename Index, typename LhsMapper, bool ConjugateLhs, typename RhsMapper, bool ConjugateRhs, int Version> \
+  struct general_matrix_vector_product<Index, bfloat16, LhsMapper, ColMajor, ConjugateLhs, bfloat16, RhsMapper,        \
+                                       ConjugateRhs, Version> {                                                        \
+    EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE static void run(Index rows, Index cols, const LhsMapper& lhs,                  \
+                                                        const RhsMapper& rhs, bfloat16* res, Index resIncr,            \
+                                                        bfloat16 alpha) {                                              \
+      gemv_bf16_col<LhsMapper, RhsMapper>(rows, cols, lhs, rhs, res, resIncr, alpha);                                  \
+    }                                                                                                                  \
+  };
 
-#define EIGEN_POWER_GEMV_REAL_SPECIALIZE_ROW_BFLOAT16() \
-template<typename Index, typename LhsMapper, bool ConjugateLhs, typename RhsMapper, bool ConjugateRhs, int Version> \
-struct general_matrix_vector_product<Index, bfloat16, LhsMapper, RowMajor, ConjugateLhs, bfloat16, RhsMapper, ConjugateRhs, Version> \
-{ \
-    EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE static void run( \
-        Index rows, Index cols, \
-        const LhsMapper& lhs, \
-        const RhsMapper& rhs, \
-        bfloat16* res, Index resIncr, \
-        bfloat16 alpha) { \
-        gemv_bf16_row<LhsMapper, RhsMapper>(rows, cols, lhs, rhs, res, resIncr, alpha); \
-    } \
-};
+#define EIGEN_POWER_GEMV_REAL_SPECIALIZE_ROW_BFLOAT16()                                                                \
+  template <typename Index, typename LhsMapper, bool ConjugateLhs, typename RhsMapper, bool ConjugateRhs, int Version> \
+  struct general_matrix_vector_product<Index, bfloat16, LhsMapper, RowMajor, ConjugateLhs, bfloat16, RhsMapper,        \
+                                       ConjugateRhs, Version> {                                                        \
+    EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE static void run(Index rows, Index cols, const LhsMapper& lhs,                  \
+                                                        const RhsMapper& rhs, bfloat16* res, Index resIncr,            \
+                                                        bfloat16 alpha) {                                              \
+      gemv_bf16_row<LhsMapper, RhsMapper>(rows, cols, lhs, rhs, res, resIncr, alpha);                                  \
+    }                                                                                                                  \
+  };
 
 EIGEN_POWER_GEMV_REAL_SPECIALIZE_COL_BFLOAT16()
 EIGEN_POWER_GEMV_REAL_SPECIALIZE_ROW_BFLOAT16()
 
-template<typename ResScalar, typename PResPacket, typename ResPacket, typename LhsPacket, typename RhsPacket>
-EIGEN_ALWAYS_INLINE ScalarBlock<ResScalar, 2> predux_complex(PResPacket& a0, PResPacket& b0, ResPacket& a1, ResPacket& b1)
-{
-    if (GEMV_IS_COMPLEX_COMPLEX) {
-        a0 = padd(a0, a1);
-        b0 = padd(b0, b1);
-    }
-    return predux_complex<ResScalar, PResPacket>(a0, b0);
+template <typename ResScalar, typename PResPacket, typename ResPacket, typename LhsPacket, typename RhsPacket>
+EIGEN_ALWAYS_INLINE ScalarBlock<ResScalar, 2> predux_complex(PResPacket& a0, PResPacket& b0, ResPacket& a1,
+                                                             ResPacket& b1) {
+  if (GEMV_IS_COMPLEX_COMPLEX) {
+    a0 = padd(a0, a1);
+    b0 = padd(b0, b1);
+  }
+  return predux_complex<ResScalar, PResPacket>(a0, b0);
 }
 
-#define GEMV_LOADPACKET_ROW_COMPLEX(iter) \
-  loadLhsPacket<Scalar, LhsScalar, LhsMapper, PLhsPacket>(lhs, i + (iter), j)
+#define GEMV_LOADPACKET_ROW_COMPLEX(iter) loadLhsPacket<Scalar, LhsScalar, LhsMapper, PLhsPacket>(lhs, i + (iter), j)
 
-#define GEMV_LOADPACKET_ROW_COMPLEX_DATA(iter) \
-  convertReal(GEMV_LOADPACKET_ROW_COMPLEX(iter))
+#define GEMV_LOADPACKET_ROW_COMPLEX_DATA(iter) convertReal(GEMV_LOADPACKET_ROW_COMPLEX(iter))
 
-#define GEMV_PROCESS_ROW_COMPLEX_SINGLE_WORK(which, N) \
-  j = 0; \
+#define GEMV_PROCESS_ROW_COMPLEX_SINGLE_WORK(which, N)    \
+  j = 0;                                                  \
   for (; j + LhsPacketSize <= cols; j += LhsPacketSize) { \
-    const RhsScalar& b1 = rhs2(j); \
-    RhsScalar* b = const_cast<RhsScalar *>(&b1); \
-    GEMV_UNROLL_ROW(which, N) \
+    const RhsScalar& b1 = rhs2(j);                        \
+    RhsScalar* b = const_cast<RhsScalar*>(&b1);           \
+    GEMV_UNROLL_ROW(which, N)                             \
   }
 
-#define GEMV_PROCESS_END_ROW_COMPLEX(N) \
-  for (; j < cols; ++j) { \
-    RhsScalar b0 = rhs2(j); \
+#define GEMV_PROCESS_END_ROW_COMPLEX(N)               \
+  for (; j < cols; ++j) {                             \
+    RhsScalar b0 = rhs2(j);                           \
     GEMV_UNROLL_ROW_HALF(GEMV_MULT_COMPLEX, (N >> 1)) \
-  } \
+  }                                                   \
   GEMV_UNROLL_ROW_HALF(GEMV_STORE_ROW_COMPLEX, (N >> 1))
 
 #ifdef USE_GEMV_MMA
 #define GEMV_INIT_ROW_COMPLEX_MMA(iter, N) \
-  if (GEMV_GETN_COMPLEX(N) > iter) { \
-    __builtin_mma_xxsetaccz(&e0##iter); \
+  if (GEMV_GETN_COMPLEX(N) > iter) {       \
+    __builtin_mma_xxsetaccz(&e0##iter);    \
   }
 
 #define GEMV_LOADPAIR_ROW_COMPLEX_MMA(iter1, iter2) \
   GEMV_BUILDPAIR_MMA(a##iter1, GEMV_LOADPACKET_ROW_COMPLEX_DATA(iter2), GEMV_LOADPACKET_ROW_COMPLEX_DATA((iter2) + 1));
 
-#define GEMV_WORK_ROW_COMPLEX_MMA(iter, N) \
-  if (GEMV_GETN_COMPLEX(N) > iter) { \
-    if (GEMV_IS_COMPLEX_FLOAT) { \
-      PLhsPacket a##iter = GEMV_LOADPACKET_ROW_COMPLEX(iter); \
-      gemv_mult_complex_MMA<ScalarPacket, LhsScalar, PLhsPacket, PLhsPacket, RhsScalar, RhsPacket, ResPacket, ConjugateLhs, ConjugateRhs, RowMajor>(a##iter, b, &e0##iter); \
-    } else { \
-      __vector_pair a##iter; \
-      GEMV_LOADPAIR_ROW_COMPLEX_MMA(iter, iter << 1) \
-      gemv_mult_complex_MMA<ScalarPacket, LhsScalar, PLhsPacket, __vector_pair, RhsScalar, RhsPacket, ResPacket, ConjugateLhs, ConjugateRhs, RowMajor>(a##iter, b, &e0##iter); \
-    } \
+#define GEMV_WORK_ROW_COMPLEX_MMA(iter, N)                                                                       \
+  if (GEMV_GETN_COMPLEX(N) > iter) {                                                                             \
+    if (GEMV_IS_COMPLEX_FLOAT) {                                                                                 \
+      PLhsPacket a##iter = GEMV_LOADPACKET_ROW_COMPLEX(iter);                                                    \
+      gemv_mult_complex_MMA<ScalarPacket, LhsScalar, PLhsPacket, PLhsPacket, RhsScalar, RhsPacket, ResPacket,    \
+                            ConjugateLhs, ConjugateRhs, RowMajor>(a##iter, b, &e0##iter);                        \
+    } else {                                                                                                     \
+      __vector_pair a##iter;                                                                                     \
+      GEMV_LOADPAIR_ROW_COMPLEX_MMA(iter, iter << 1)                                                             \
+      gemv_mult_complex_MMA<ScalarPacket, LhsScalar, PLhsPacket, __vector_pair, RhsScalar, RhsPacket, ResPacket, \
+                            ConjugateLhs, ConjugateRhs, RowMajor>(a##iter, b, &e0##iter);                        \
+    }                                                                                                            \
   }
 
-#define GEMV_PREDUX4_COMPLEX_MMA(iter1, iter2, iter3, N) \
-  if (N > iter1) { \
-    if (GEMV_IS_COMPLEX_FLOAT) { \
-      cc##iter1 = predux_complex<ResScalar, ScalarPacket, LhsPacket, RhsPacket, ConjugateLhs, ConjugateRhs>(&e0##iter2, &e0##iter3); \
-    } else { \
-      cc##iter1 = predux_complex<ResScalar, ScalarPacket, LhsPacket, RhsPacket, ConjugateLhs, ConjugateRhs>(&e0##iter1); \
-    } \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(cc##iter1); \
+#define GEMV_PREDUX4_COMPLEX_MMA(iter1, iter2, iter3, N)                                                         \
+  if (N > iter1) {                                                                                               \
+    if (GEMV_IS_COMPLEX_FLOAT) {                                                                                 \
+      cc##iter1 = predux_complex<ResScalar, ScalarPacket, LhsPacket, RhsPacket, ConjugateLhs, ConjugateRhs>(     \
+          &e0##iter2, &e0##iter3);                                                                               \
+    } else {                                                                                                     \
+      cc##iter1 =                                                                                                \
+          predux_complex<ResScalar, ScalarPacket, LhsPacket, RhsPacket, ConjugateLhs, ConjugateRhs>(&e0##iter1); \
+    }                                                                                                            \
+  } else {                                                                                                       \
+    EIGEN_UNUSED_VARIABLE(cc##iter1);                                                                            \
   }
 
-#define GEMV_PROCESS_ROW_COMPLEX_SINGLE_MMA(N) \
+#define GEMV_PROCESS_ROW_COMPLEX_SINGLE_MMA(N)  \
   GEMV_UNROLL_ROW(GEMV_INIT_ROW_COMPLEX_MMA, N) \
   GEMV_PROCESS_ROW_COMPLEX_SINGLE_WORK(GEMV_WORK_ROW_COMPLEX_MMA, N)
 
-#define GEMV_PROCESS_ROW_COMPLEX_ONE_MMA(N) \
-  for (; i < n##N; i += N) { \
-    GEMV_PROCESS_ROW_COMPLEX_SINGLE_MMA(N) \
+#define GEMV_PROCESS_ROW_COMPLEX_ONE_MMA(N)                  \
+  for (; i < n##N; i += N) {                                 \
+    GEMV_PROCESS_ROW_COMPLEX_SINGLE_MMA(N)                   \
     GEMV_UNROLL_ROW_HALF(GEMV_PREDUX4_COMPLEX_MMA, (N >> 1)) \
-    GEMV_PROCESS_END_ROW_COMPLEX(N); \
+    GEMV_PROCESS_END_ROW_COMPLEX(N);                         \
   }
 #endif
 
-#define GEMV_WORK_ROW_COMPLEX(iter, N) \
-  if (N > iter) { \
-    PLhsPacket a##iter = GEMV_LOADPACKET_ROW_COMPLEX(iter); \
-    gemv_mult_complex<ScalarPacket, PLhsPacket, RhsScalar, RhsPacket, PResPacket, ResPacket, ConjugateLhs, ConjugateRhs, RowMajor>(a##iter, b, c0##iter, c1##iter); \
+#define GEMV_WORK_ROW_COMPLEX(iter, N)                                                                     \
+  if (N > iter) {                                                                                          \
+    PLhsPacket a##iter = GEMV_LOADPACKET_ROW_COMPLEX(iter);                                                \
+    gemv_mult_complex<ScalarPacket, PLhsPacket, RhsScalar, RhsPacket, PResPacket, ResPacket, ConjugateLhs, \
+                      ConjugateRhs, RowMajor>(a##iter, b, c0##iter, c1##iter);                             \
   }
 
-#define GEMV_PREDUX4_COMPLEX(iter1, iter2, iter3, N) \
-  if (N > iter1) { \
-    cc##iter1 = predux_complex<ResScalar, PResPacket, ResPacket, LhsPacket, RhsPacket>(c0##iter2, c0##iter3, c1##iter2, c1##iter3); \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(cc##iter1); \
+#define GEMV_PREDUX4_COMPLEX(iter1, iter2, iter3, N)                                                          \
+  if (N > iter1) {                                                                                            \
+    cc##iter1 = predux_complex<ResScalar, PResPacket, ResPacket, LhsPacket, RhsPacket>(c0##iter2, c0##iter3,  \
+                                                                                       c1##iter2, c1##iter3); \
+  } else {                                                                                                    \
+    EIGEN_UNUSED_VARIABLE(cc##iter1);                                                                         \
   }
 
-#define GEMV_MULT_COMPLEX(iter1, iter2, iter3, N) \
-  if (N > iter1) { \
+#define GEMV_MULT_COMPLEX(iter1, iter2, iter3, N)          \
+  if (N > iter1) {                                         \
     cc##iter1.scalar[0] += cj.pmul(lhs(i + iter2, j), b0); \
     cc##iter1.scalar[1] += cj.pmul(lhs(i + iter3, j), b0); \
   }
 
-#define GEMV_STORE_ROW_COMPLEX(iter1, iter2, iter3, N) \
-  if (N > iter1) { \
+#define GEMV_STORE_ROW_COMPLEX(iter1, iter2, iter3, N)                                   \
+  if (N > iter1) {                                                                       \
     storeMaddData<ResScalar>(res + ((i + iter2) * resIncr), alpha, cc##iter1.scalar[0]); \
     storeMaddData<ResScalar>(res + ((i + iter3) * resIncr), alpha, cc##iter1.scalar[1]); \
   }
 
 #define GEMV_PROCESS_ROW_COMPLEX_SINGLE_NEW(N) \
-  GEMV_UNROLL_ROW(GEMV_INIT_COMPLEX, N) \
+  GEMV_UNROLL_ROW(GEMV_INIT_COMPLEX, N)        \
   GEMV_PROCESS_ROW_COMPLEX_SINGLE_WORK(GEMV_WORK_ROW_COMPLEX, N)
 
-/** \internal main macro for gemv_complex_row - initialize accumulators, multiply and add inputs, predux and store results */
-#define GEMV_PROCESS_ROW_COMPLEX_ONE_NEW(N) \
-  for (; i < n##N; i += N) { \
-    GEMV_PROCESS_ROW_COMPLEX_SINGLE_NEW(N) \
+/** \internal main macro for gemv_complex_row - initialize accumulators, multiply and add inputs, predux and store
+ * results */
+#define GEMV_PROCESS_ROW_COMPLEX_ONE_NEW(N)              \
+  for (; i < n##N; i += N) {                             \
+    GEMV_PROCESS_ROW_COMPLEX_SINGLE_NEW(N)               \
     GEMV_UNROLL_ROW_HALF(GEMV_PREDUX4_COMPLEX, (N >> 1)) \
-    GEMV_PROCESS_END_ROW_COMPLEX(N); \
+    GEMV_PROCESS_END_ROW_COMPLEX(N);                     \
   }
 
 #define GEMV_PROCESS_ROW_COMPLEX_PREDUX_NEW(iter) \
-  if (GEMV_IS_COMPLEX_COMPLEX) { \
-    c0##iter = padd(c0##iter, c1##iter); \
-  } \
+  if (GEMV_IS_COMPLEX_COMPLEX) {                  \
+    c0##iter = padd(c0##iter, c1##iter);          \
+  }                                               \
   dd0 = predux(c0##iter);
 
 #if EIGEN_COMP_LLVM
-#define GEMV_PROCESS_ROW_COMPLEX_SINGLE(N) \
-  GEMV_PROCESS_ROW_COMPLEX_SINGLE_NEW(N)
+#define GEMV_PROCESS_ROW_COMPLEX_SINGLE(N) GEMV_PROCESS_ROW_COMPLEX_SINGLE_NEW(N)
 
-#define GEMV_PROCESS_ROW_COMPLEX_ONE(N) \
-  GEMV_PROCESS_ROW_COMPLEX_ONE_NEW(N)
+#define GEMV_PROCESS_ROW_COMPLEX_ONE(N) GEMV_PROCESS_ROW_COMPLEX_ONE_NEW(N)
 
-#define GEMV_PROCESS_ROW_COMPLEX_PREDUX(iter) \
-  GEMV_PROCESS_ROW_COMPLEX_PREDUX_NEW(iter)
+#define GEMV_PROCESS_ROW_COMPLEX_PREDUX(iter) GEMV_PROCESS_ROW_COMPLEX_PREDUX_NEW(iter)
 #else
 // gcc seems to be reading and writing registers unnecessarily to memory.
 // Use the old way for complex double until it is fixed.
 
-#define GEMV_LOADPACKET_ROW_COMPLEX_OLD(iter) \
-  lhs.template load<LhsPacket, LhsAlignment>(i + (iter), j)
+#define GEMV_LOADPACKET_ROW_COMPLEX_OLD(iter) lhs.template load<LhsPacket, LhsAlignment>(i + (iter), j)
 
 #define GEMV_INIT_COMPLEX_OLD(iter, N) \
-  EIGEN_UNUSED_VARIABLE(c0##iter); \
-  if (N > iter) { \
+  EIGEN_UNUSED_VARIABLE(c0##iter);     \
+  if (N > iter) {                      \
     c1##iter = pset_zero<ResPacket>(); \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(c1##iter); \
+  } else {                             \
+    EIGEN_UNUSED_VARIABLE(c1##iter);   \
   }
 
-#define GEMV_WORK_ROW_COMPLEX_OLD(iter, N) \
-  if (N > iter) { \
+#define GEMV_WORK_ROW_COMPLEX_OLD(iter, N)                     \
+  if (N > iter) {                                              \
     LhsPacket a##iter = GEMV_LOADPACKET_ROW_COMPLEX_OLD(iter); \
-    c1##iter = pcj.pmadd(a##iter, b0, c1##iter); \
+    c1##iter = pcj.pmadd(a##iter, b0, c1##iter);               \
   }
 
 #define GEMV_PREDUX4_COMPLEX_OLD(iter1, iter2, iter3, N) \
-  if (N > iter1) { \
-    cc##iter1.scalar[0] = predux(c1##iter2); \
-    cc##iter1.scalar[1] = predux(c1##iter3); \
-  } else { \
-    EIGEN_UNUSED_VARIABLE(cc##iter1); \
+  if (N > iter1) {                                       \
+    cc##iter1.scalar[0] = predux(c1##iter2);             \
+    cc##iter1.scalar[1] = predux(c1##iter3);             \
+  } else {                                               \
+    EIGEN_UNUSED_VARIABLE(cc##iter1);                    \
   }
 
-#define GEMV_PROCESS_ROW_COMPLEX_SINGLE_OLD(N) \
-  GEMV_UNROLL_ROW(GEMV_INIT_COMPLEX_OLD, N) \
-  j = 0; \
-  for (; j + LhsPacketSize <= cols; j += LhsPacketSize) { \
+#define GEMV_PROCESS_ROW_COMPLEX_SINGLE_OLD(N)                  \
+  GEMV_UNROLL_ROW(GEMV_INIT_COMPLEX_OLD, N)                     \
+  j = 0;                                                        \
+  for (; j + LhsPacketSize <= cols; j += LhsPacketSize) {       \
     RhsPacket b0 = rhs2.template load<RhsPacket, Unaligned>(j); \
-    GEMV_UNROLL_ROW(GEMV_WORK_ROW_COMPLEX_OLD, N) \
+    GEMV_UNROLL_ROW(GEMV_WORK_ROW_COMPLEX_OLD, N)               \
   }
 
-#define GEMV_PROCESS_ROW_COMPLEX_ONE_OLD(N) \
-  for (; i < n##N; i += N) { \
-    GEMV_PROCESS_ROW_COMPLEX_SINGLE_OLD(N) \
+#define GEMV_PROCESS_ROW_COMPLEX_ONE_OLD(N)                  \
+  for (; i < n##N; i += N) {                                 \
+    GEMV_PROCESS_ROW_COMPLEX_SINGLE_OLD(N)                   \
     GEMV_UNROLL_ROW_HALF(GEMV_PREDUX4_COMPLEX_OLD, (N >> 1)) \
-    GEMV_PROCESS_END_ROW_COMPLEX(N) \
+    GEMV_PROCESS_END_ROW_COMPLEX(N)                          \
   }
 
-#define GEMV_PROCESS_ROW_COMPLEX_PREDUX_OLD(iter) \
-  dd0 = predux(c1##iter);
+#define GEMV_PROCESS_ROW_COMPLEX_PREDUX_OLD(iter) dd0 = predux(c1##iter);
 
 #if (__GNUC__ > 10)
-#define GEMV_PROCESS_ROW_COMPLEX_IS_NEW  1
+#define GEMV_PROCESS_ROW_COMPLEX_IS_NEW 1
 #else
-#define GEMV_PROCESS_ROW_COMPLEX_IS_NEW  \
-  (sizeof(Scalar) == sizeof(float)) || GEMV_IS_COMPLEX_COMPLEX
+#define GEMV_PROCESS_ROW_COMPLEX_IS_NEW (sizeof(Scalar) == sizeof(float)) || GEMV_IS_COMPLEX_COMPLEX
 #endif
 
 #define GEMV_PROCESS_ROW_COMPLEX_SINGLE(N) \
-  if (GEMV_PROCESS_ROW_COMPLEX_IS_NEW) { \
+  if (GEMV_PROCESS_ROW_COMPLEX_IS_NEW) {   \
     GEMV_PROCESS_ROW_COMPLEX_SINGLE_NEW(N) \
-  } else { \
+  } else {                                 \
     GEMV_PROCESS_ROW_COMPLEX_SINGLE_OLD(N) \
   }
 
-#define GEMV_PROCESS_ROW_COMPLEX_ONE(N) \
+#define GEMV_PROCESS_ROW_COMPLEX_ONE(N)  \
   if (GEMV_PROCESS_ROW_COMPLEX_IS_NEW) { \
-    GEMV_PROCESS_ROW_COMPLEX_ONE_NEW(N) \
-  } else { \
-    GEMV_PROCESS_ROW_COMPLEX_ONE_OLD(N) \
+    GEMV_PROCESS_ROW_COMPLEX_ONE_NEW(N)  \
+  } else {                               \
+    GEMV_PROCESS_ROW_COMPLEX_ONE_OLD(N)  \
   }
 
 #define GEMV_PROCESS_ROW_COMPLEX_PREDUX(iter) \
-  if (GEMV_PROCESS_ROW_COMPLEX_IS_NEW) { \
+  if (GEMV_PROCESS_ROW_COMPLEX_IS_NEW) {      \
     GEMV_PROCESS_ROW_COMPLEX_PREDUX_NEW(iter) \
-  } else { \
+  } else {                                    \
     GEMV_PROCESS_ROW_COMPLEX_PREDUX_OLD(iter) \
   }
 #endif
 
 #ifdef USE_GEMV_MMA
-#define GEMV_PROCESS_ROW_COMPLEX(N) \
-  GEMV_PROCESS_ROW_COMPLEX_ONE_MMA(N)
+#define GEMV_PROCESS_ROW_COMPLEX(N) GEMV_PROCESS_ROW_COMPLEX_ONE_MMA(N)
 #else
-#define GEMV_PROCESS_ROW_COMPLEX(N) \
-  GEMV_PROCESS_ROW_COMPLEX_ONE(N)
+#define GEMV_PROCESS_ROW_COMPLEX(N) GEMV_PROCESS_ROW_COMPLEX_ONE(N)
 #endif
 
-template<typename Scalar, typename LhsScalar, typename LhsMapper, bool ConjugateLhs, bool LhsIsReal, typename RhsScalar, typename RhsMapper, bool ConjugateRhs, bool RhsIsReal, typename ResScalar>
-EIGEN_STRONG_INLINE void gemv_complex_row(
-    Index rows, Index cols,
-    const LhsMapper& alhs,
-    const RhsMapper& rhs,
-    ResScalar* res, Index resIncr,
-    ResScalar alpha)
-{
-    typedef gemv_traits<LhsScalar, RhsScalar> Traits;
+template <typename Scalar, typename LhsScalar, typename LhsMapper, bool ConjugateLhs, bool LhsIsReal,
+          typename RhsScalar, typename RhsMapper, bool ConjugateRhs, bool RhsIsReal, typename ResScalar>
+EIGEN_STRONG_INLINE void gemv_complex_row(Index rows, Index cols, const LhsMapper& alhs, const RhsMapper& rhs,
+                                          ResScalar* res, Index resIncr, ResScalar alpha) {
+  typedef gemv_traits<LhsScalar, RhsScalar> Traits;
 
-    typedef typename Traits::LhsPacket LhsPacket;
-    typedef typename Traits::RhsPacket RhsPacket;
-    typedef typename Traits::ResPacket ResPacket;
+  typedef typename Traits::LhsPacket LhsPacket;
+  typedef typename Traits::RhsPacket RhsPacket;
+  typedef typename Traits::ResPacket ResPacket;
 
-    typedef typename packet_traits<Scalar>::type ScalarPacket;
-    typedef typename packet_traits<LhsScalar>::type PLhsPacket;
-    typedef typename packet_traits<ResScalar>::type PResPacket;
-    typedef gemv_traits<ResPacket, ResPacket> PTraits;
+  typedef typename packet_traits<Scalar>::type ScalarPacket;
+  typedef typename packet_traits<LhsScalar>::type PLhsPacket;
+  typedef typename packet_traits<ResScalar>::type PResPacket;
+  typedef gemv_traits<ResPacket, ResPacket> PTraits;
 
-    // The following copy tells the compiler that lhs's attributes are not modified outside this function
-    // This helps GCC to generate proper code.
-    LhsMapper lhs(alhs);
-    typename RhsMapper::LinearMapper rhs2 = rhs.getLinearMapper(0, 0);
+  // The following copy tells the compiler that lhs's attributes are not modified outside this function
+  // This helps GCC to generate proper code.
+  LhsMapper lhs(alhs);
+  typename RhsMapper::LinearMapper rhs2 = rhs.getLinearMapper(0, 0);
 
-    eigen_internal_assert(rhs.stride() == 1);
-    conj_helper<LhsScalar, RhsScalar, ConjugateLhs, ConjugateRhs> cj;
+  eigen_internal_assert(rhs.stride() == 1);
+  conj_helper<LhsScalar, RhsScalar, ConjugateLhs, ConjugateRhs> cj;
 #if !EIGEN_COMP_LLVM
-    conj_helper<LhsPacket, RhsPacket, ConjugateLhs, ConjugateRhs> pcj;
+  conj_helper<LhsPacket, RhsPacket, ConjugateLhs, ConjugateRhs> pcj;
 #endif
 
-    // TODO: fine tune the following heuristic. The rationale is that if the matrix is very large,
-    //       processing 8 rows at once might be counter productive wrt cache.
+  // TODO: fine tune the following heuristic. The rationale is that if the matrix is very large,
+  //       processing 8 rows at once might be counter productive wrt cache.
 #ifndef GCC_ONE_VECTORPAIR_BUG
-    const Index n8 = lhs.stride() * sizeof(LhsScalar) > 32000 ? (rows - 7) : (rows - 7);
-    const Index n4 = rows - 3;
-    const Index n2 = rows - 1;
+  const Index n8 = lhs.stride() * sizeof(LhsScalar) > 32000 ? (rows - 7) : (rows - 7);
+  const Index n4 = rows - 3;
+  const Index n2 = rows - 1;
 #endif
 
-    // TODO: for padded aligned inputs, we could enable aligned reads
-    enum {
-        LhsAlignment = Unaligned,
-        ResPacketSize = PTraits::ResPacketSize,
-        LhsPacketSize = PTraits::LhsPacketSize,
-        RhsPacketSize = PTraits::RhsPacketSize,
-    };
+  // TODO: for padded aligned inputs, we could enable aligned reads
+  enum {
+    LhsAlignment = Unaligned,
+    ResPacketSize = PTraits::ResPacketSize,
+    LhsPacketSize = PTraits::LhsPacketSize,
+    RhsPacketSize = PTraits::RhsPacketSize,
+  };
 
-    Index i = 0, j;
-    PResPacket c00, c01, c02, c03, c04, c05, c06, c07;
-    ResPacket c10, c11, c12, c13, c14, c15, c16, c17;
+  Index i = 0, j;
+  PResPacket c00, c01, c02, c03, c04, c05, c06, c07;
+  ResPacket c10, c11, c12, c13, c14, c15, c16, c17;
 #ifdef USE_GEMV_MMA
-    __vector_quad e00, e01, e02, e03, e04, e05, e06, e07;
-    GEMV_UNUSED_ROW(8, e0)
-    GEMV_UNUSED_EXTRA(1, c0)
-    GEMV_UNUSED_EXTRA(1, c1)
+  __vector_quad e00, e01, e02, e03, e04, e05, e06, e07;
+  GEMV_UNUSED_ROW(8, e0)
+  GEMV_UNUSED_EXTRA(1, c0)
+  GEMV_UNUSED_EXTRA(1, c1)
 #endif
-    ResScalar dd0;
+  ResScalar dd0;
 #ifndef GCC_ONE_VECTORPAIR_BUG
-    ScalarBlock<ResScalar, 2> cc0, cc1, cc2, cc3;
+  ScalarBlock<ResScalar, 2> cc0, cc1, cc2, cc3;
 #ifdef USE_GEMV_MMA
-    if (!GEMV_IS_COMPLEX_COMPLEX)
+  if (!GEMV_IS_COMPLEX_COMPLEX)
 #endif
-    {
-        GEMV_PROCESS_ROW_COMPLEX(8)
-    }
-    GEMV_PROCESS_ROW_COMPLEX(4)
-    GEMV_PROCESS_ROW_COMPLEX(2)
+  {
+    GEMV_PROCESS_ROW_COMPLEX(8)
+  }
+  GEMV_PROCESS_ROW_COMPLEX(4)
+  GEMV_PROCESS_ROW_COMPLEX(2)
 #endif
-    for (; i < rows; ++i)
-    {
-        GEMV_PROCESS_ROW_COMPLEX_SINGLE(1)
-        GEMV_PROCESS_ROW_COMPLEX_PREDUX(0)
-        for (; j < cols; ++j)
-        {
-            dd0 += cj.pmul(lhs(i, j), rhs2(j));
-        }
-        res[i * resIncr] += alpha * dd0;
+  for (; i < rows; ++i) {
+    GEMV_PROCESS_ROW_COMPLEX_SINGLE(1)
+    GEMV_PROCESS_ROW_COMPLEX_PREDUX(0)
+    for (; j < cols; ++j) {
+      dd0 += cj.pmul(lhs(i, j), rhs2(j));
     }
+    res[i * resIncr] += alpha * dd0;
+  }
 }
 
-#define EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_COL(Scalar, LhsScalar, RhsScalar) \
-template<typename Index, typename LhsMapper, bool ConjugateLhs, typename RhsMapper, bool ConjugateRhs, int Version> \
-struct general_matrix_vector_product<Index, LhsScalar, LhsMapper, ColMajor, ConjugateLhs, RhsScalar, RhsMapper, ConjugateRhs, Version> \
-{ \
-    typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar>::ReturnType ResScalar; \
-\
-    EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE static void run( \
-        Index rows, Index cols, \
-        const LhsMapper& lhs, \
-        const RhsMapper& rhs, \
-        ResScalar* res, Index resIncr, \
-        ResScalar alpha) { \
-        gemv_complex_col<Scalar, LhsScalar, LhsMapper, ConjugateLhs, sizeof(Scalar) == sizeof(LhsScalar), RhsScalar, RhsMapper, ConjugateRhs, sizeof(Scalar) == sizeof(RhsScalar), ResScalar>(rows, cols, lhs, rhs, res, resIncr, alpha); \
-    } \
-};
+#define EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_COL(Scalar, LhsScalar, RhsScalar)                                          \
+  template <typename Index, typename LhsMapper, bool ConjugateLhs, typename RhsMapper, bool ConjugateRhs, int Version> \
+  struct general_matrix_vector_product<Index, LhsScalar, LhsMapper, ColMajor, ConjugateLhs, RhsScalar, RhsMapper,      \
+                                       ConjugateRhs, Version> {                                                        \
+    typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar>::ReturnType ResScalar;                                 \
+                                                                                                                       \
+    EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE static void run(Index rows, Index cols, const LhsMapper& lhs,                  \
+                                                        const RhsMapper& rhs, ResScalar* res, Index resIncr,           \
+                                                        ResScalar alpha) {                                             \
+      gemv_complex_col<Scalar, LhsScalar, LhsMapper, ConjugateLhs, sizeof(Scalar) == sizeof(LhsScalar), RhsScalar,     \
+                       RhsMapper, ConjugateRhs, sizeof(Scalar) == sizeof(RhsScalar), ResScalar>(rows, cols, lhs, rhs,  \
+                                                                                                res, resIncr, alpha);  \
+    }                                                                                                                  \
+  };
 
-#define EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_ROW(Scalar, LhsScalar, RhsScalar) \
-template<typename Index, typename LhsMapper, bool ConjugateLhs, typename RhsMapper, bool ConjugateRhs, int Version> \
-struct general_matrix_vector_product<Index, LhsScalar, LhsMapper, RowMajor, ConjugateLhs, RhsScalar, RhsMapper, ConjugateRhs, Version> \
-{ \
-    typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar>::ReturnType ResScalar; \
-\
-    EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE static void run( \
-        Index rows, Index cols, \
-        const LhsMapper& lhs, \
-        const RhsMapper& rhs, \
-        ResScalar* res, Index resIncr, \
-        ResScalar alpha) { \
-        gemv_complex_row<Scalar, LhsScalar, LhsMapper, ConjugateLhs, sizeof(Scalar) == sizeof(LhsScalar), RhsScalar, RhsMapper, ConjugateRhs, sizeof(Scalar) == sizeof(RhsScalar), ResScalar>(rows, cols, lhs, rhs, res, resIncr, alpha); \
-    } \
-};
+#define EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_ROW(Scalar, LhsScalar, RhsScalar)                                          \
+  template <typename Index, typename LhsMapper, bool ConjugateLhs, typename RhsMapper, bool ConjugateRhs, int Version> \
+  struct general_matrix_vector_product<Index, LhsScalar, LhsMapper, RowMajor, ConjugateLhs, RhsScalar, RhsMapper,      \
+                                       ConjugateRhs, Version> {                                                        \
+    typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar>::ReturnType ResScalar;                                 \
+                                                                                                                       \
+    EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE static void run(Index rows, Index cols, const LhsMapper& lhs,                  \
+                                                        const RhsMapper& rhs, ResScalar* res, Index resIncr,           \
+                                                        ResScalar alpha) {                                             \
+      gemv_complex_row<Scalar, LhsScalar, LhsMapper, ConjugateLhs, sizeof(Scalar) == sizeof(LhsScalar), RhsScalar,     \
+                       RhsMapper, ConjugateRhs, sizeof(Scalar) == sizeof(RhsScalar), ResScalar>(rows, cols, lhs, rhs,  \
+                                                                                                res, resIncr, alpha);  \
+    }                                                                                                                  \
+  };
 
-EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_COL(float,  float,                std::complex<float>)
-EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_COL(float,  std::complex<float>,  float)
-EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_COL(float,  std::complex<float>,  std::complex<float>)
-EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_COL(double, double,               std::complex<double>)
+EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_COL(float, float, std::complex<float>)
+EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_COL(float, std::complex<float>, float)
+EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_COL(float, std::complex<float>, std::complex<float>)
+EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_COL(double, double, std::complex<double>)
 EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_COL(double, std::complex<double>, double)
 EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_COL(double, std::complex<double>, std::complex<double>)
-EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_ROW(float,  float,                std::complex<float>)
-EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_ROW(float,  std::complex<float>,  float)
-EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_ROW(float,  std::complex<float>,  std::complex<float>)
-EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_ROW(double, double,               std::complex<double>)
+EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_ROW(float, float, std::complex<float>)
+EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_ROW(float, std::complex<float>, float)
+EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_ROW(float, std::complex<float>, std::complex<float>)
+EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_ROW(double, double, std::complex<double>)
 EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_ROW(double, std::complex<double>, double)
 EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_ROW(double, std::complex<double>, std::complex<double>)
 
-#endif // EIGEN_MATRIX_VECTOR_PRODUCT_ALTIVEC_H
-
+#endif  // EIGEN_MATRIX_VECTOR_PRODUCT_ALTIVEC_H
diff --git a/Eigen/src/Core/arch/AltiVec/PacketMath.h b/Eigen/src/Core/arch/AltiVec/PacketMath.h
index b945b33..414f05c 100644
--- a/Eigen/src/Core/arch/AltiVec/PacketMath.h
+++ b/Eigen/src/Core/arch/AltiVec/PacketMath.h
@@ -27,127 +27,132 @@
 
 // NOTE Altivec has 32 registers, but Eigen only accepts a value of 8 or 16
 #ifndef EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS
-#define EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS  32
+#define EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS 32
 #endif
 
-typedef __vector float                   Packet4f;
-typedef __vector int                     Packet4i;
-typedef __vector unsigned int            Packet4ui;
-typedef __vector __bool int              Packet4bi;
-typedef __vector short int               Packet8s;
-typedef __vector unsigned short int      Packet8us;
-typedef __vector __bool short            Packet8bi;
-typedef __vector signed char             Packet16c;
-typedef __vector unsigned char           Packet16uc;
-typedef eigen_packet_wrapper<__vector unsigned short int,0> Packet8bf;
+typedef __vector float Packet4f;
+typedef __vector int Packet4i;
+typedef __vector unsigned int Packet4ui;
+typedef __vector __bool int Packet4bi;
+typedef __vector short int Packet8s;
+typedef __vector unsigned short int Packet8us;
+typedef __vector __bool short Packet8bi;
+typedef __vector signed char Packet16c;
+typedef __vector unsigned char Packet16uc;
+typedef eigen_packet_wrapper<__vector unsigned short int, 0> Packet8bf;
 
 // We don't want to write the same code all the time, but we need to reuse the constants
 // and it doesn't really work to declare them global, so we define macros instead
-#define EIGEN_DECLARE_CONST_FAST_Packet4f(NAME,X) \
-  Packet4f p4f_##NAME = {X, X, X, X}
+#define EIGEN_DECLARE_CONST_FAST_Packet4f(NAME, X) Packet4f p4f_##NAME = {X, X, X, X}
 
-#define EIGEN_DECLARE_CONST_FAST_Packet4i(NAME,X) \
-  Packet4i p4i_##NAME = vec_splat_s32(X)
+#define EIGEN_DECLARE_CONST_FAST_Packet4i(NAME, X) Packet4i p4i_##NAME = vec_splat_s32(X)
 
-#define EIGEN_DECLARE_CONST_FAST_Packet4ui(NAME,X) \
-  Packet4ui p4ui_##NAME = {X, X, X, X}
+#define EIGEN_DECLARE_CONST_FAST_Packet4ui(NAME, X) Packet4ui p4ui_##NAME = {X, X, X, X}
 
-#define EIGEN_DECLARE_CONST_FAST_Packet8us(NAME,X) \
-  Packet8us p8us_##NAME = {X, X, X, X, X, X, X, X}
+#define EIGEN_DECLARE_CONST_FAST_Packet8us(NAME, X) Packet8us p8us_##NAME = {X, X, X, X, X, X, X, X}
 
-#define EIGEN_DECLARE_CONST_FAST_Packet16uc(NAME,X) \
+#define EIGEN_DECLARE_CONST_FAST_Packet16uc(NAME, X) \
   Packet16uc p16uc_##NAME = {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X}
 
-#define EIGEN_DECLARE_CONST_Packet4f(NAME,X) \
-  Packet4f p4f_##NAME = pset1<Packet4f>(X)
+#define EIGEN_DECLARE_CONST_Packet4f(NAME, X) Packet4f p4f_##NAME = pset1<Packet4f>(X)
 
-#define EIGEN_DECLARE_CONST_Packet4i(NAME,X) \
-  Packet4i p4i_##NAME = pset1<Packet4i>(X)
+#define EIGEN_DECLARE_CONST_Packet4i(NAME, X) Packet4i p4i_##NAME = pset1<Packet4i>(X)
 
-#define EIGEN_DECLARE_CONST_Packet2d(NAME,X) \
-  Packet2d p2d_##NAME = pset1<Packet2d>(X)
+#define EIGEN_DECLARE_CONST_Packet2d(NAME, X) Packet2d p2d_##NAME = pset1<Packet2d>(X)
 
-#define EIGEN_DECLARE_CONST_Packet2l(NAME,X) \
-  Packet2l p2l_##NAME = pset1<Packet2l>(X)
+#define EIGEN_DECLARE_CONST_Packet2l(NAME, X) Packet2l p2l_##NAME = pset1<Packet2l>(X)
 
-#define EIGEN_DECLARE_CONST_Packet4f_FROM_INT(NAME,X) \
+#define EIGEN_DECLARE_CONST_Packet4f_FROM_INT(NAME, X) \
   const Packet4f p4f_##NAME = reinterpret_cast<Packet4f>(pset1<Packet4i>(X))
 
 #define DST_CHAN 1
 #define DST_CTRL(size, count, stride) (((size) << 24) | ((count) << 16) | (stride))
-#define __UNPACK_TYPE__(PACKETNAME) typename unpacket_traits<PACKETNAME>::type 
+#define __UNPACK_TYPE__(PACKETNAME) typename unpacket_traits<PACKETNAME>::type
 
 // These constants are endian-agnostic
-static EIGEN_DECLARE_CONST_FAST_Packet4f(ZERO, 0); //{ 0.0, 0.0, 0.0, 0.0}
-static EIGEN_DECLARE_CONST_FAST_Packet4i(ZERO, 0); //{ 0, 0, 0, 0,}
-static EIGEN_DECLARE_CONST_FAST_Packet4i(ONE,1); //{ 1, 1, 1, 1}
-static EIGEN_DECLARE_CONST_FAST_Packet4i(MINUS16,-16); //{ -16, -16, -16, -16}
-static EIGEN_DECLARE_CONST_FAST_Packet4i(MINUS1,-1); //{ -1, -1, -1, -1}
+static EIGEN_DECLARE_CONST_FAST_Packet4f(ZERO, 0);       //{ 0.0, 0.0, 0.0, 0.0}
+static EIGEN_DECLARE_CONST_FAST_Packet4i(ZERO, 0);       //{ 0, 0, 0, 0,}
+static EIGEN_DECLARE_CONST_FAST_Packet4i(ONE, 1);        //{ 1, 1, 1, 1}
+static EIGEN_DECLARE_CONST_FAST_Packet4i(MINUS16, -16);  //{ -16, -16, -16, -16}
+static EIGEN_DECLARE_CONST_FAST_Packet4i(MINUS1, -1);    //{ -1, -1, -1, -1}
 static EIGEN_DECLARE_CONST_FAST_Packet4ui(SIGN, 0x80000000u);
 static EIGEN_DECLARE_CONST_FAST_Packet4ui(PREV0DOT5, 0x3EFFFFFFu);
-static EIGEN_DECLARE_CONST_FAST_Packet8us(ONE,1); //{ 1, 1, 1, 1, 1, 1, 1, 1}
-static Packet4f p4f_MZERO = (Packet4f) vec_sl((Packet4ui)p4i_MINUS1, (Packet4ui)p4i_MINUS1); //{ 0x80000000, 0x80000000, 0x80000000, 0x80000000}
+static EIGEN_DECLARE_CONST_FAST_Packet8us(ONE, 1);  //{ 1, 1, 1, 1, 1, 1, 1, 1}
+static Packet4f p4f_MZERO =
+    (Packet4f)vec_sl((Packet4ui)p4i_MINUS1, (Packet4ui)p4i_MINUS1);  //{ 0x80000000, 0x80000000, 0x80000000, 0x80000000}
 #ifndef __VSX__
-static Packet4f p4f_ONE = vec_ctf(p4i_ONE, 0); //{ 1.0, 1.0, 1.0, 1.0}
+static Packet4f p4f_ONE = vec_ctf(p4i_ONE, 0);  //{ 1.0, 1.0, 1.0, 1.0}
 #endif
 
-static Packet4f  p4f_COUNTDOWN  = { 0.0, 1.0, 2.0, 3.0 };
-static Packet4i  p4i_COUNTDOWN  = { 0, 1, 2, 3 };
-static Packet8s  p8s_COUNTDOWN  = { 0, 1, 2, 3, 4, 5, 6, 7 };
-static Packet8us p8us_COUNTDOWN = { 0, 1, 2, 3, 4, 5, 6, 7 };
+static Packet4f p4f_COUNTDOWN = {0.0, 1.0, 2.0, 3.0};
+static Packet4i p4i_COUNTDOWN = {0, 1, 2, 3};
+static Packet8s p8s_COUNTDOWN = {0, 1, 2, 3, 4, 5, 6, 7};
+static Packet8us p8us_COUNTDOWN = {0, 1, 2, 3, 4, 5, 6, 7};
 
-static Packet16c  p16c_COUNTDOWN = { 0, 1, 2, 3, 4, 5, 6, 7,
-                                    8, 9, 10, 11, 12, 13, 14, 15};
-static Packet16uc p16uc_COUNTDOWN = { 0, 1, 2, 3, 4, 5, 6, 7, 
-                                    8, 9, 10, 11, 12, 13, 14, 15};
+static Packet16c p16c_COUNTDOWN = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
+static Packet16uc p16uc_COUNTDOWN = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
 
-static Packet16uc p16uc_REVERSE32 = { 12,13,14,15, 8,9,10,11, 4,5,6,7, 0,1,2,3 };
-static Packet16uc p16uc_REVERSE16 = { 14,15, 12,13, 10,11, 8,9, 6,7, 4,5, 2,3, 0,1 };
+static Packet16uc p16uc_REVERSE32 = {12, 13, 14, 15, 8, 9, 10, 11, 4, 5, 6, 7, 0, 1, 2, 3};
+static Packet16uc p16uc_REVERSE16 = {14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1};
 #ifndef _ARCH_PWR9
-static Packet16uc p16uc_REVERSE8 = { 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 };
+static Packet16uc p16uc_REVERSE8 = {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
 #endif
 
 #ifdef _BIG_ENDIAN
-static Packet16uc p16uc_DUPLICATE32_HI = { 0,1,2,3, 0,1,2,3, 4,5,6,7, 4,5,6,7 };
+static Packet16uc p16uc_DUPLICATE32_HI = {0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 6, 7, 4, 5, 6, 7};
 #endif
-static const Packet16uc p16uc_DUPLICATE16_EVEN= { 0,1 ,0,1, 4,5, 4,5, 8,9, 8,9, 12,13, 12,13 };
-static const Packet16uc p16uc_DUPLICATE16_ODD = { 2,3 ,2,3, 6,7, 6,7, 10,11, 10,11, 14,15, 14,15 };
+static const Packet16uc p16uc_DUPLICATE16_EVEN = {0, 1, 0, 1, 4, 5, 4, 5, 8, 9, 8, 9, 12, 13, 12, 13};
+static const Packet16uc p16uc_DUPLICATE16_ODD = {2, 3, 2, 3, 6, 7, 6, 7, 10, 11, 10, 11, 14, 15, 14, 15};
 
-static Packet16uc p16uc_QUADRUPLICATE16_HI = { 0,1,0,1,0,1,0,1, 2,3,2,3,2,3,2,3 };
+static Packet16uc p16uc_QUADRUPLICATE16_HI = {0, 1, 0, 1, 0, 1, 0, 1, 2, 3, 2, 3, 2, 3, 2, 3};
 
-static Packet16uc p16uc_MERGEE16 = { 0,1, 16,17, 4,5, 20,21, 8,9, 24,25, 12,13, 28,29 };
-static Packet16uc p16uc_MERGEO16 = { 2,3, 18,19, 6,7, 22,23, 10,11, 26,27, 14,15, 30,31 };
+static Packet16uc p16uc_MERGEE16 = {0, 1, 16, 17, 4, 5, 20, 21, 8, 9, 24, 25, 12, 13, 28, 29};
+static Packet16uc p16uc_MERGEO16 = {2, 3, 18, 19, 6, 7, 22, 23, 10, 11, 26, 27, 14, 15, 30, 31};
 #ifdef _BIG_ENDIAN
-static Packet16uc p16uc_MERGEH16 = { 0,1, 4,5, 8,9, 12,13, 16,17, 20,21, 24,25, 28,29 };
+static Packet16uc p16uc_MERGEH16 = {0, 1, 4, 5, 8, 9, 12, 13, 16, 17, 20, 21, 24, 25, 28, 29};
 #else
-static Packet16uc p16uc_MERGEL16 = { 2,3, 6,7, 10,11, 14,15, 18,19, 22,23, 26,27, 30,31 };
+static Packet16uc p16uc_MERGEL16 = {2, 3, 6, 7, 10, 11, 14, 15, 18, 19, 22, 23, 26, 27, 30, 31};
 #endif
 
 // Handle endianness properly while loading constants
 // Define global static constants:
 #ifdef _BIG_ENDIAN
 static Packet16uc p16uc_FORWARD = vec_lvsl(0, (float*)0);
-static Packet16uc p16uc_PSET32_WODD   = vec_sld((Packet16uc) vec_splat((Packet4ui)p16uc_FORWARD, 0), (Packet16uc) vec_splat((Packet4ui)p16uc_FORWARD, 2), 8);//{ 0,1,2,3, 0,1,2,3, 8,9,10,11, 8,9,10,11 };
-static Packet16uc p16uc_PSET32_WEVEN  = vec_sld(p16uc_DUPLICATE32_HI, (Packet16uc) vec_splat((Packet4ui)p16uc_FORWARD, 3), 8);//{ 4,5,6,7, 4,5,6,7, 12,13,14,15, 12,13,14,15 };
-static Packet16uc p16uc_HALF64_0_16 = vec_sld((Packet16uc)p4i_ZERO, vec_splat((Packet16uc) vec_abs(p4i_MINUS16), 3), 8);      //{ 0,0,0,0, 0,0,0,0, 16,16,16,16, 16,16,16,16};
+static Packet16uc p16uc_PSET32_WODD =
+    vec_sld((Packet16uc)vec_splat((Packet4ui)p16uc_FORWARD, 0), (Packet16uc)vec_splat((Packet4ui)p16uc_FORWARD, 2),
+            8);  //{ 0,1,2,3, 0,1,2,3, 8,9,10,11, 8,9,10,11 };
+static Packet16uc p16uc_PSET32_WEVEN = vec_sld(p16uc_DUPLICATE32_HI, (Packet16uc)vec_splat((Packet4ui)p16uc_FORWARD, 3),
+                                               8);  //{ 4,5,6,7, 4,5,6,7, 12,13,14,15, 12,13,14,15 };
+static Packet16uc p16uc_HALF64_0_16 = vec_sld((Packet16uc)p4i_ZERO, vec_splat((Packet16uc)vec_abs(p4i_MINUS16), 3),
+                                              8);  //{ 0,0,0,0, 0,0,0,0, 16,16,16,16, 16,16,16,16};
 #else
 static Packet16uc p16uc_FORWARD = p16uc_REVERSE32;
-static Packet16uc p16uc_PSET32_WODD = vec_sld((Packet16uc) vec_splat((Packet4ui)p16uc_FORWARD, 1), (Packet16uc) vec_splat((Packet4ui)p16uc_FORWARD, 3), 8);//{ 0,1,2,3, 0,1,2,3, 8,9,10,11, 8,9,10,11 };
-static Packet16uc p16uc_PSET32_WEVEN = vec_sld((Packet16uc) vec_splat((Packet4ui)p16uc_FORWARD, 0), (Packet16uc) vec_splat((Packet4ui)p16uc_FORWARD, 2), 8);//{ 4,5,6,7, 4,5,6,7, 12,13,14,15, 12,13,14,15 };
-static Packet16uc p16uc_HALF64_0_16 = vec_sld(vec_splat((Packet16uc) vec_abs(p4i_MINUS16), 0), (Packet16uc)p4i_ZERO, 8);      //{ 0,0,0,0, 0,0,0,0, 16,16,16,16, 16,16,16,16};
-#endif // _BIG_ENDIAN
+static Packet16uc p16uc_PSET32_WODD =
+    vec_sld((Packet16uc)vec_splat((Packet4ui)p16uc_FORWARD, 1), (Packet16uc)vec_splat((Packet4ui)p16uc_FORWARD, 3),
+            8);  //{ 0,1,2,3, 0,1,2,3, 8,9,10,11, 8,9,10,11 };
+static Packet16uc p16uc_PSET32_WEVEN =
+    vec_sld((Packet16uc)vec_splat((Packet4ui)p16uc_FORWARD, 0), (Packet16uc)vec_splat((Packet4ui)p16uc_FORWARD, 2),
+            8);  //{ 4,5,6,7, 4,5,6,7, 12,13,14,15, 12,13,14,15 };
+static Packet16uc p16uc_HALF64_0_16 = vec_sld(vec_splat((Packet16uc)vec_abs(p4i_MINUS16), 0), (Packet16uc)p4i_ZERO,
+                                              8);  //{ 0,0,0,0, 0,0,0,0, 16,16,16,16, 16,16,16,16};
+#endif  // _BIG_ENDIAN
 
-static Packet16uc p16uc_PSET64_HI = (Packet16uc) vec_mergeh((Packet4ui)p16uc_PSET32_WODD, (Packet4ui)p16uc_PSET32_WEVEN);     //{ 0,1,2,3, 4,5,6,7, 0,1,2,3, 4,5,6,7 };
-static Packet16uc p16uc_PSET64_LO = (Packet16uc) vec_mergel((Packet4ui)p16uc_PSET32_WODD, (Packet4ui)p16uc_PSET32_WEVEN);     //{ 8,9,10,11, 12,13,14,15, 8,9,10,11, 12,13,14,15 };
-static Packet16uc p16uc_TRANSPOSE64_HI = p16uc_PSET64_HI + p16uc_HALF64_0_16;                                         //{ 0,1,2,3, 4,5,6,7, 16,17,18,19, 20,21,22,23};
-static Packet16uc p16uc_TRANSPOSE64_LO = p16uc_PSET64_LO + p16uc_HALF64_0_16;                                         //{ 8,9,10,11, 12,13,14,15, 24,25,26,27, 28,29,30,31};
+static Packet16uc p16uc_PSET64_HI = (Packet16uc)vec_mergeh(
+    (Packet4ui)p16uc_PSET32_WODD, (Packet4ui)p16uc_PSET32_WEVEN);  //{ 0,1,2,3, 4,5,6,7, 0,1,2,3, 4,5,6,7 };
+static Packet16uc p16uc_PSET64_LO = (Packet16uc)vec_mergel(
+    (Packet4ui)p16uc_PSET32_WODD, (Packet4ui)p16uc_PSET32_WEVEN);  //{ 8,9,10,11, 12,13,14,15, 8,9,10,11, 12,13,14,15 };
+static Packet16uc p16uc_TRANSPOSE64_HI =
+    p16uc_PSET64_HI + p16uc_HALF64_0_16;  //{ 0,1,2,3, 4,5,6,7, 16,17,18,19, 20,21,22,23};
+static Packet16uc p16uc_TRANSPOSE64_LO =
+    p16uc_PSET64_LO + p16uc_HALF64_0_16;  //{ 8,9,10,11, 12,13,14,15, 24,25,26,27, 28,29,30,31};
 
-static Packet16uc p16uc_COMPLEX32_REV = vec_sld(p16uc_REVERSE32, p16uc_REVERSE32, 8);                                         //{ 4,5,6,7, 0,1,2,3, 12,13,14,15, 8,9,10,11 };
+static Packet16uc p16uc_COMPLEX32_REV =
+    vec_sld(p16uc_REVERSE32, p16uc_REVERSE32, 8);  //{ 4,5,6,7, 0,1,2,3, 12,13,14,15, 8,9,10,11 };
 
 #if EIGEN_HAS_BUILTIN(__builtin_prefetch) || EIGEN_COMP_GNUC
-  #define EIGEN_PPC_PREFETCH(ADDR) __builtin_prefetch(ADDR);
+#define EIGEN_PPC_PREFETCH(ADDR) __builtin_prefetch(ADDR);
 #else
-  #define EIGEN_PPC_PREFETCH(ADDR) asm( "   dcbt [%[addr]]\n" :: [addr] "r" (ADDR) : "cc" );
+#define EIGEN_PPC_PREFETCH(ADDR) asm("   dcbt [%[addr]]\n" ::[addr] "r"(ADDR) : "cc");
 #endif
 
 #if EIGEN_COMP_LLVM
@@ -256,14 +261,14 @@
     AlignedOnScalar = 1,
     size = 4,
 
-    HasAdd   = 1,
-    HasSub   = 1,
+    HasAdd = 1,
+    HasSub = 1,
     HasShift = 1,
-    HasMul   = 1,
-#if defined(_ARCH_PWR10) && (EIGEN_COMP_LLVM || EIGEN_GNUC_STRICT_AT_LEAST(11,0,0))
-    HasDiv   = 1,
+    HasMul = 1,
+#if defined(_ARCH_PWR10) && (EIGEN_COMP_LLVM || EIGEN_GNUC_STRICT_AT_LEAST(11, 0, 0))
+    HasDiv = 1,
 #else
-    HasDiv   = 0,
+    HasDiv = 0,
 #endif
     HasBlend = 1,
     HasCmp = 1
@@ -279,10 +284,10 @@
     AlignedOnScalar = 1,
     size = 8,
 
-    HasAdd  = 1,
-    HasSub  = 1,
-    HasMul  = 1,
-    HasDiv  = 0,
+    HasAdd = 1,
+    HasSub = 1,
+    HasMul = 1,
+    HasDiv = 0,
     HasBlend = 1,
     HasCmp = 1
   };
@@ -297,10 +302,10 @@
     AlignedOnScalar = 1,
     size = 8,
 
-    HasAdd  = 1,
-    HasSub  = 1,
-    HasMul  = 1,
-    HasDiv  = 0,
+    HasAdd = 1,
+    HasSub = 1,
+    HasMul = 1,
+    HasDiv = 0,
     HasBlend = 1,
     HasCmp = 1
   };
@@ -315,10 +320,10 @@
     AlignedOnScalar = 1,
     size = 16,
 
-    HasAdd  = 1,
-    HasSub  = 1,
-    HasMul  = 1,
-    HasDiv  = 0,
+    HasAdd = 1,
+    HasSub = 1,
+    HasMul = 1,
+    HasDiv = 0,
     HasBlend = 1,
     HasCmp = 1
   };
@@ -333,88 +338,125 @@
     AlignedOnScalar = 1,
     size = 16,
 
-    HasAdd  = 1,
-    HasSub  = 1,
-    HasMul  = 1,
-    HasDiv  = 0,
+    HasAdd = 1,
+    HasSub = 1,
+    HasMul = 1,
+    HasDiv = 0,
     HasBlend = 1,
     HasCmp = 1
   };
 };
 
-template<> struct unpacket_traits<Packet4f>
-{
-  typedef float     type;
-  typedef Packet4f  half;
-  typedef Packet4i  integer_packet;
-  enum {size=4, alignment=Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false};
+template <>
+struct unpacket_traits<Packet4f> {
+  typedef float type;
+  typedef Packet4f half;
+  typedef Packet4i integer_packet;
+  enum {
+    size = 4,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
 };
-template<> struct unpacket_traits<Packet4i>
-{
-  typedef int       type;
-  typedef Packet4i  half;
-  enum {size=4, alignment=Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false};
+template <>
+struct unpacket_traits<Packet4i> {
+  typedef int type;
+  typedef Packet4i half;
+  enum {
+    size = 4,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
 };
-template<> struct unpacket_traits<Packet8s>
-{
+template <>
+struct unpacket_traits<Packet8s> {
   typedef short int type;
-  typedef Packet8s  half;
-  enum {size=8, alignment=Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false};
+  typedef Packet8s half;
+  enum {
+    size = 8,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
 };
-template<> struct unpacket_traits<Packet8us>
-{
+template <>
+struct unpacket_traits<Packet8us> {
   typedef unsigned short int type;
-  typedef Packet8us          half;
-  enum {size=8, alignment=Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false};
+  typedef Packet8us half;
+  enum {
+    size = 8,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
 };
 
-template<> struct unpacket_traits<Packet16c>
-{
+template <>
+struct unpacket_traits<Packet16c> {
   typedef signed char type;
-  typedef Packet16c  half;
-  enum {size=16, alignment=Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false};
+  typedef Packet16c half;
+  enum {
+    size = 16,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
 };
-template<> struct unpacket_traits<Packet16uc>
-{
+template <>
+struct unpacket_traits<Packet16uc> {
   typedef unsigned char type;
-  typedef Packet16uc  half;
-  enum {size=16, alignment=Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false};
+  typedef Packet16uc half;
+  enum {
+    size = 16,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
 };
 
-template<> struct unpacket_traits<Packet8bf>
-{
+template <>
+struct unpacket_traits<Packet8bf> {
   typedef bfloat16 type;
-  typedef Packet8bf          half;
-  enum {size=8, alignment=Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false};
+  typedef Packet8bf half;
+  enum {
+    size = 8,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
 };
-inline std::ostream & operator <<(std::ostream & s, const Packet16c & v)
-{
+inline std::ostream& operator<<(std::ostream& s, const Packet16c& v) {
   union {
-    Packet16c   v;
+    Packet16c v;
     signed char n[16];
   } vt;
   vt.v = v;
-  for (int i=0; i< 16; i++)
-    s << vt.n[i] << ", ";
+  for (int i = 0; i < 16; i++) s << vt.n[i] << ", ";
   return s;
 }
 
-inline std::ostream & operator <<(std::ostream & s, const Packet16uc & v)
-{
+inline std::ostream& operator<<(std::ostream& s, const Packet16uc& v) {
   union {
-    Packet16uc   v;
+    Packet16uc v;
     unsigned char n[16];
   } vt;
   vt.v = v;
-  for (int i=0; i< 16; i++)
-    s << vt.n[i] << ", ";
+  for (int i = 0; i < 16; i++) s << vt.n[i] << ", ";
   return s;
 }
 
-inline std::ostream & operator <<(std::ostream & s, const Packet4f & v)
-{
+inline std::ostream& operator<<(std::ostream& s, const Packet4f& v) {
   union {
-    Packet4f   v;
+    Packet4f v;
     float n[4];
   } vt;
   vt.v = v;
@@ -422,10 +464,9 @@
   return s;
 }
 
-inline std::ostream & operator <<(std::ostream & s, const Packet4i & v)
-{
+inline std::ostream& operator<<(std::ostream& s, const Packet4i& v) {
   union {
-    Packet4i   v;
+    Packet4i v;
     int n[4];
   } vt;
   vt.v = v;
@@ -433,10 +474,9 @@
   return s;
 }
 
-inline std::ostream & operator <<(std::ostream & s, const Packet4ui & v)
-{
+inline std::ostream& operator<<(std::ostream& s, const Packet4ui& v) {
   union {
-    Packet4ui   v;
+    Packet4ui v;
     unsigned int n[4];
   } vt;
   vt.v = v;
@@ -445,8 +485,7 @@
 }
 
 template <typename Packet>
-EIGEN_STRONG_INLINE Packet pload_common(const __UNPACK_TYPE__(Packet)* from)
-{
+EIGEN_STRONG_INLINE Packet pload_common(const __UNPACK_TYPE__(Packet) * from) {
   // some versions of GCC throw "unused-but-set-parameter".
   // ignoring these warnings for now.
   EIGEN_UNUSED_VARIABLE(from);
@@ -459,52 +498,51 @@
 }
 
 // Need to define them first or we get specialization after instantiation errors
-template<> EIGEN_STRONG_INLINE Packet4f pload<Packet4f>(const float* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f pload<Packet4f>(const float* from) {
   return pload_common<Packet4f>(from);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4i pload<Packet4i>(const int*     from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4i pload<Packet4i>(const int* from) {
   return pload_common<Packet4i>(from);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8s pload<Packet8s>(const short int* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8s pload<Packet8s>(const short int* from) {
   return pload_common<Packet8s>(from);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8us pload<Packet8us>(const unsigned short int* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8us pload<Packet8us>(const unsigned short int* from) {
   return pload_common<Packet8us>(from);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16c pload<Packet16c>(const signed char*     from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet16c pload<Packet16c>(const signed char* from) {
   return pload_common<Packet16c>(from);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16uc pload<Packet16uc>(const unsigned char*     from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet16uc pload<Packet16uc>(const unsigned char* from) {
   return pload_common<Packet16uc>(from);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf pload<Packet8bf>(const bfloat16*     from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8bf pload<Packet8bf>(const bfloat16* from) {
   return pload_common<Packet8us>(reinterpret_cast<const unsigned short int*>(from));
 }
 
 template <typename Packet>
-EIGEN_ALWAYS_INLINE Packet pload_ignore(const __UNPACK_TYPE__(Packet)* from)
-{
+EIGEN_ALWAYS_INLINE Packet pload_ignore(const __UNPACK_TYPE__(Packet) * from) {
   // some versions of GCC throw "unused-but-set-parameter".
   // ignoring these warnings for now.
   EIGEN_UNUSED_VARIABLE(from);
   EIGEN_DEBUG_ALIGNED_LOAD
   // Ignore partial input memory initialized
 #if !EIGEN_COMP_LLVM
-  #pragma GCC diagnostic push
-  #pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
 #endif
 #ifdef EIGEN_VECTORIZE_VSX
   return vec_xl(0, const_cast<__UNPACK_TYPE__(Packet)*>(from));
@@ -512,18 +550,18 @@
   return vec_ld(0, from);
 #endif
 #if !EIGEN_COMP_LLVM
-  #pragma GCC diagnostic pop
+#pragma GCC diagnostic pop
 #endif
 }
 
-template<> EIGEN_ALWAYS_INLINE Packet8bf pload_ignore<Packet8bf>(const bfloat16*     from)
-{
+template <>
+EIGEN_ALWAYS_INLINE Packet8bf pload_ignore<Packet8bf>(const bfloat16* from) {
   return pload_ignore<Packet8us>(reinterpret_cast<const unsigned short int*>(from));
 }
 
 template <typename Packet>
-EIGEN_ALWAYS_INLINE Packet pload_partial_common(const __UNPACK_TYPE__(Packet)* from, const Index n, const Index offset)
-{
+EIGEN_ALWAYS_INLINE Packet pload_partial_common(const __UNPACK_TYPE__(Packet) * from, const Index n,
+                                                const Index offset) {
   // some versions of GCC throw "unused-but-set-parameter".
   // ignoring these warnings for now.
   const Index packet_size = unpacket_traits<Packet>::size;
@@ -546,13 +584,13 @@
 #else
   if (n) {
     EIGEN_ALIGN16 __UNPACK_TYPE__(Packet) load[packet_size];
-    unsigned char* load2 = reinterpret_cast<unsigned char *>(load + offset);
-    unsigned char* from2 = reinterpret_cast<unsigned char *>(const_cast<__UNPACK_TYPE__(Packet)*>(from));
+    unsigned char* load2 = reinterpret_cast<unsigned char*>(load + offset);
+    unsigned char* from2 = reinterpret_cast<unsigned char*>(const_cast<__UNPACK_TYPE__(Packet)*>(from));
     Index n2 = n * size;
     if (16 <= n2) {
       pstoreu(load2, ploadu<Packet16uc>(from2));
     } else {
-      memcpy((void *)load2, (void *)from2, n2);
+      memcpy((void*)load2, (void*)from2, n2);
     }
     return pload_ignore<Packet>(load);
   } else {
@@ -561,43 +599,44 @@
 #endif
 }
 
-template<> EIGEN_ALWAYS_INLINE Packet4f pload_partial<Packet4f>(const float* from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE Packet4f pload_partial<Packet4f>(const float* from, const Index n, const Index offset) {
   return pload_partial_common<Packet4f>(from, n, offset);
 }
 
-template<> EIGEN_ALWAYS_INLINE Packet4i pload_partial<Packet4i>(const int* from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE Packet4i pload_partial<Packet4i>(const int* from, const Index n, const Index offset) {
   return pload_partial_common<Packet4i>(from, n, offset);
 }
 
-template<> EIGEN_ALWAYS_INLINE Packet8s pload_partial<Packet8s>(const short int* from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE Packet8s pload_partial<Packet8s>(const short int* from, const Index n, const Index offset) {
   return pload_partial_common<Packet8s>(from, n, offset);
 }
 
-template<> EIGEN_ALWAYS_INLINE Packet8us pload_partial<Packet8us>(const unsigned short int* from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE Packet8us pload_partial<Packet8us>(const unsigned short int* from, const Index n,
+                                                       const Index offset) {
   return pload_partial_common<Packet8us>(from, n, offset);
 }
 
-template<> EIGEN_ALWAYS_INLINE Packet8bf pload_partial<Packet8bf>(const bfloat16* from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE Packet8bf pload_partial<Packet8bf>(const bfloat16* from, const Index n, const Index offset) {
   return pload_partial_common<Packet8us>(reinterpret_cast<const unsigned short int*>(from), n, offset);
 }
 
-template<> EIGEN_ALWAYS_INLINE Packet16c pload_partial<Packet16c>(const signed char* from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE Packet16c pload_partial<Packet16c>(const signed char* from, const Index n, const Index offset) {
   return pload_partial_common<Packet16c>(from, n, offset);
 }
 
-template<> EIGEN_ALWAYS_INLINE Packet16uc pload_partial<Packet16uc>(const unsigned char* from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE Packet16uc pload_partial<Packet16uc>(const unsigned char* from, const Index n, const Index offset) {
   return pload_partial_common<Packet16uc>(from, n, offset);
 }
 
 template <typename Packet>
-EIGEN_STRONG_INLINE void pstore_common(__UNPACK_TYPE__(Packet)* to, const Packet& from){
+EIGEN_STRONG_INLINE void pstore_common(__UNPACK_TYPE__(Packet) * to, const Packet& from) {
   // some versions of GCC throw "unused-but-set-parameter" (float *to).
   // ignoring these warnings for now.
   EIGEN_UNUSED_VARIABLE(to);
@@ -609,43 +648,44 @@
 #endif
 }
 
-template<> EIGEN_STRONG_INLINE void pstore<float>(float*   to, const Packet4f& from)
-{
+template <>
+EIGEN_STRONG_INLINE void pstore<float>(float* to, const Packet4f& from) {
   pstore_common<Packet4f>(to, from);
 }
 
-template<> EIGEN_STRONG_INLINE void pstore<int>(int*       to, const Packet4i& from)
-{
+template <>
+EIGEN_STRONG_INLINE void pstore<int>(int* to, const Packet4i& from) {
   pstore_common<Packet4i>(to, from);
 }
 
-template<> EIGEN_STRONG_INLINE void pstore<short int>(short int*       to, const Packet8s& from)
-{
+template <>
+EIGEN_STRONG_INLINE void pstore<short int>(short int* to, const Packet8s& from) {
   pstore_common<Packet8s>(to, from);
 }
 
-template<> EIGEN_STRONG_INLINE void pstore<unsigned short int>(unsigned short int*       to, const Packet8us& from)
-{
+template <>
+EIGEN_STRONG_INLINE void pstore<unsigned short int>(unsigned short int* to, const Packet8us& from) {
   pstore_common<Packet8us>(to, from);
 }
 
-template<> EIGEN_STRONG_INLINE void pstore<bfloat16>(bfloat16*       to, const Packet8bf& from)
-{
+template <>
+EIGEN_STRONG_INLINE void pstore<bfloat16>(bfloat16* to, const Packet8bf& from) {
   pstore_common<Packet8us>(reinterpret_cast<unsigned short int*>(to), from.m_val);
 }
 
-template<> EIGEN_STRONG_INLINE void pstore<signed char>(signed char*       to, const Packet16c& from)
-{
+template <>
+EIGEN_STRONG_INLINE void pstore<signed char>(signed char* to, const Packet16c& from) {
   pstore_common<Packet16c>(to, from);
 }
 
-template<> EIGEN_STRONG_INLINE void pstore<unsigned char>(unsigned char*       to, const Packet16uc& from)
-{
+template <>
+EIGEN_STRONG_INLINE void pstore<unsigned char>(unsigned char* to, const Packet16uc& from) {
   pstore_common<Packet16uc>(to, from);
 }
 
-template<typename Packet> EIGEN_ALWAYS_INLINE void pstore_partial_common(__UNPACK_TYPE__(Packet)*  to, const Packet& from, const Index n, const Index offset)
-{
+template <typename Packet>
+EIGEN_ALWAYS_INLINE void pstore_partial_common(__UNPACK_TYPE__(Packet) * to, const Packet& from, const Index n,
+                                               const Index offset) {
   // some versions of GCC throw "unused-but-set-parameter" (float *to).
   // ignoring these warnings for now.
   const Index packet_size = unpacket_traits<Packet>::size;
@@ -669,110 +709,119 @@
   if (n) {
     EIGEN_ALIGN16 __UNPACK_TYPE__(Packet) store[packet_size];
     pstore(store, from);
-    unsigned char* store2 = reinterpret_cast<unsigned char *>(store + offset);
-    unsigned char* to2 = reinterpret_cast<unsigned char *>(to);
+    unsigned char* store2 = reinterpret_cast<unsigned char*>(store + offset);
+    unsigned char* to2 = reinterpret_cast<unsigned char*>(to);
     Index n2 = n * size;
     if (16 <= n2) {
       pstore(to2, ploadu<Packet16uc>(store2));
     } else {
-      memcpy((void *)to2, (void *)store2, n2);
+      memcpy((void*)to2, (void*)store2, n2);
     }
   }
 #endif
 }
 
-template<> EIGEN_ALWAYS_INLINE void pstore_partial<float>(float*  to, const Packet4f& from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE void pstore_partial<float>(float* to, const Packet4f& from, const Index n, const Index offset) {
   pstore_partial_common<Packet4f>(to, from, n, offset);
 }
 
-template<> EIGEN_ALWAYS_INLINE void pstore_partial<int>(int*  to, const Packet4i& from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE void pstore_partial<int>(int* to, const Packet4i& from, const Index n, const Index offset) {
   pstore_partial_common<Packet4i>(to, from, n, offset);
 }
 
-template<> EIGEN_ALWAYS_INLINE void pstore_partial<short int>(short int*  to, const Packet8s& from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE void pstore_partial<short int>(short int* to, const Packet8s& from, const Index n,
+                                                   const Index offset) {
   pstore_partial_common<Packet8s>(to, from, n, offset);
 }
 
-template<> EIGEN_ALWAYS_INLINE void pstore_partial<unsigned short int>(unsigned short int*  to, const Packet8us& from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE void pstore_partial<unsigned short int>(unsigned short int* to, const Packet8us& from,
+                                                            const Index n, const Index offset) {
   pstore_partial_common<Packet8us>(to, from, n, offset);
 }
 
-template<> EIGEN_ALWAYS_INLINE void pstore_partial<bfloat16>(bfloat16*      to, const Packet8bf& from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE void pstore_partial<bfloat16>(bfloat16* to, const Packet8bf& from, const Index n,
+                                                  const Index offset) {
   pstore_partial_common<Packet8us>(reinterpret_cast<unsigned short int*>(to), from.m_val, n, offset);
 }
 
-template<> EIGEN_ALWAYS_INLINE void pstore_partial<signed char>(signed char*  to, const Packet16c& from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE void pstore_partial<signed char>(signed char* to, const Packet16c& from, const Index n,
+                                                     const Index offset) {
   pstore_partial_common<Packet16c>(to, from, n, offset);
 }
 
-template<> EIGEN_ALWAYS_INLINE void pstore_partial<unsigned char>(unsigned char*  to, const Packet16uc& from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE void pstore_partial<unsigned char>(unsigned char* to, const Packet16uc& from, const Index n,
+                                                       const Index offset) {
   pstore_partial_common<Packet16uc>(to, from, n, offset);
 }
 
-template<typename Packet>
-EIGEN_STRONG_INLINE Packet pset1_size4(const __UNPACK_TYPE__(Packet)& from)
-{
+template <typename Packet>
+EIGEN_STRONG_INLINE Packet pset1_size4(const __UNPACK_TYPE__(Packet) & from) {
   Packet v = {from, from, from, from};
   return v;
 }
 
-template<typename Packet>
-EIGEN_STRONG_INLINE Packet pset1_size8(const __UNPACK_TYPE__(Packet)& from)
-{
+template <typename Packet>
+EIGEN_STRONG_INLINE Packet pset1_size8(const __UNPACK_TYPE__(Packet) & from) {
   Packet v = {from, from, from, from, from, from, from, from};
   return v;
 }
 
-template<typename Packet>
-EIGEN_STRONG_INLINE Packet pset1_size16(const __UNPACK_TYPE__(Packet)& from)
-{
+template <typename Packet>
+EIGEN_STRONG_INLINE Packet pset1_size16(const __UNPACK_TYPE__(Packet) & from) {
   Packet v = {from, from, from, from, from, from, from, from, from, from, from, from, from, from, from, from};
   return v;
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pset1<Packet4f>(const float&  from) {
+template <>
+EIGEN_STRONG_INLINE Packet4f pset1<Packet4f>(const float& from) {
   return pset1_size4<Packet4f>(from);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4i pset1<Packet4i>(const int&    from)   {
+template <>
+EIGEN_STRONG_INLINE Packet4i pset1<Packet4i>(const int& from) {
   return pset1_size4<Packet4i>(from);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8s pset1<Packet8s>(const short int&    from)   {
+template <>
+EIGEN_STRONG_INLINE Packet8s pset1<Packet8s>(const short int& from) {
   return pset1_size8<Packet8s>(from);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8us pset1<Packet8us>(const unsigned short int&    from)   {
+template <>
+EIGEN_STRONG_INLINE Packet8us pset1<Packet8us>(const unsigned short int& from) {
   return pset1_size8<Packet8us>(from);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16c pset1<Packet16c>(const signed char&    from)   {
+template <>
+EIGEN_STRONG_INLINE Packet16c pset1<Packet16c>(const signed char& from) {
   return pset1_size16<Packet16c>(from);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16uc pset1<Packet16uc>(const unsigned char&    from)   {
+template <>
+EIGEN_STRONG_INLINE Packet16uc pset1<Packet16uc>(const unsigned char& from) {
   return pset1_size16<Packet16uc>(from);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pset1frombits<Packet4f>(unsigned int from) {
+template <>
+EIGEN_STRONG_INLINE Packet4f pset1frombits<Packet4f>(unsigned int from) {
   return reinterpret_cast<Packet4f>(pset1<Packet4i>(from));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf pset1<Packet8bf>(const bfloat16&    from)   {
+template <>
+EIGEN_STRONG_INLINE Packet8bf pset1<Packet8bf>(const bfloat16& from) {
   return pset1_size8<Packet8us>(reinterpret_cast<const unsigned short int&>(from));
 }
 
-template<typename Packet> EIGEN_STRONG_INLINE void
-pbroadcast4_common(const __UNPACK_TYPE__(Packet) *a,
-                      Packet& a0, Packet& a1, Packet& a2, Packet& a3)
-{
+template <typename Packet>
+EIGEN_STRONG_INLINE void pbroadcast4_common(const __UNPACK_TYPE__(Packet) * a, Packet& a0, Packet& a1, Packet& a2,
+                                            Packet& a3) {
   a3 = pload<Packet>(a);
   a0 = vec_splat(a3, 0);
   a1 = vec_splat(a3, 1);
@@ -780,21 +829,18 @@
   a3 = vec_splat(a3, 3);
 }
 
-template<> EIGEN_STRONG_INLINE void
-pbroadcast4<Packet4f>(const float *a,
-                      Packet4f& a0, Packet4f& a1, Packet4f& a2, Packet4f& a3)
-{
+template <>
+EIGEN_STRONG_INLINE void pbroadcast4<Packet4f>(const float* a, Packet4f& a0, Packet4f& a1, Packet4f& a2, Packet4f& a3) {
   pbroadcast4_common<Packet4f>(a, a0, a1, a2, a3);
 }
-template<> EIGEN_STRONG_INLINE void
-pbroadcast4<Packet4i>(const int *a,
-                      Packet4i& a0, Packet4i& a1, Packet4i& a2, Packet4i& a3)
-{
+template <>
+EIGEN_STRONG_INLINE void pbroadcast4<Packet4i>(const int* a, Packet4i& a0, Packet4i& a1, Packet4i& a2, Packet4i& a3) {
   pbroadcast4_common<Packet4i>(a, a0, a1, a2, a3);
 }
 
-template<typename Packet> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet pgather_common(const __UNPACK_TYPE__(Packet)* from, Index stride, const Index n = unpacket_traits<Packet>::size)
-{
+template <typename Packet>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet pgather_common(const __UNPACK_TYPE__(Packet) * from, Index stride,
+                                                            const Index n = unpacket_traits<Packet>::size) {
   EIGEN_ALIGN16 __UNPACK_TYPE__(Packet) a[unpacket_traits<Packet>::size];
   eigen_internal_assert(n <= unpacket_traits<Packet>::size && "number of elements will gather past end of packet");
   if (stride == 1) {
@@ -806,85 +852,97 @@
   } else {
     LOAD_STORE_UNROLL_16
     for (Index i = 0; i < n; i++) {
-      a[i] = from[i*stride];
+      a[i] = from[i * stride];
     }
     // Leave rest of the array uninitialized
     return pload_ignore<Packet>(a);
   }
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet4f pgather<float, Packet4f>(const float* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet4f pgather<float, Packet4f>(const float* from, Index stride) {
   return pgather_common<Packet4f>(from, stride);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet4i pgather<int, Packet4i>(const int* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet4i pgather<int, Packet4i>(const int* from, Index stride) {
   return pgather_common<Packet4i>(from, stride);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet8s pgather<short int, Packet8s>(const short int* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet8s pgather<short int, Packet8s>(const short int* from, Index stride) {
   return pgather_common<Packet8s>(from, stride);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet8us pgather<unsigned short int, Packet8us>(const unsigned short int* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet8us pgather<unsigned short int, Packet8us>(const unsigned short int* from,
+                                                                                       Index stride) {
   return pgather_common<Packet8us>(from, stride);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet8bf pgather<bfloat16, Packet8bf>(const bfloat16* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet8bf pgather<bfloat16, Packet8bf>(const bfloat16* from, Index stride) {
   return pgather_common<Packet8bf>(from, stride);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet16c pgather<signed char, Packet16c>(const signed char* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet16c pgather<signed char, Packet16c>(const signed char* from, Index stride) {
   return pgather_common<Packet16c>(from, stride);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet16uc pgather<unsigned char, Packet16uc>(const unsigned char* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet16uc pgather<unsigned char, Packet16uc>(const unsigned char* from,
+                                                                                    Index stride) {
   return pgather_common<Packet16uc>(from, stride);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet4f pgather_partial<float, Packet4f>(const float* from, Index stride, const Index n)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet4f pgather_partial<float, Packet4f>(const float* from, Index stride,
+                                                                                const Index n) {
   return pgather_common<Packet4f>(from, stride, n);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet4i pgather_partial<int, Packet4i>(const int* from, Index stride, const Index n)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet4i pgather_partial<int, Packet4i>(const int* from, Index stride,
+                                                                              const Index n) {
   return pgather_common<Packet4i>(from, stride, n);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet8s pgather_partial<short int, Packet8s>(const short int* from, Index stride, const Index n)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet8s pgather_partial<short int, Packet8s>(const short int* from, Index stride,
+                                                                                    const Index n) {
   return pgather_common<Packet8s>(from, stride, n);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet8us pgather_partial<unsigned short int, Packet8us>(const unsigned short int* from, Index stride, const Index n)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet8us
+pgather_partial<unsigned short int, Packet8us>(const unsigned short int* from, Index stride, const Index n) {
   return pgather_common<Packet8us>(from, stride, n);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet8bf pgather_partial<bfloat16, Packet8bf>(const bfloat16* from, Index stride, const Index n)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet8bf pgather_partial<bfloat16, Packet8bf>(const bfloat16* from, Index stride,
+                                                                                     const Index n) {
   return pgather_common<Packet8bf>(from, stride, n);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet16c pgather_partial<signed char, Packet16c>(const signed char* from, Index stride, const Index n)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet16c pgather_partial<signed char, Packet16c>(const signed char* from,
+                                                                                        Index stride, const Index n) {
   return pgather_common<Packet16c>(from, stride, n);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet16uc pgather_partial<unsigned char, Packet16uc>(const unsigned char* from, Index stride, const Index n)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet16uc pgather_partial<unsigned char, Packet16uc>(const unsigned char* from,
+                                                                                            Index stride,
+                                                                                            const Index n) {
   return pgather_common<Packet16uc>(from, stride, n);
 }
 
-template<typename Packet> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter_common(__UNPACK_TYPE__(Packet)* to, const Packet& from, Index stride, const Index n = unpacket_traits<Packet>::size)
-{
+template <typename Packet>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter_common(__UNPACK_TYPE__(Packet) * to, const Packet& from,
+                                                           Index stride,
+                                                           const Index n = unpacket_traits<Packet>::size) {
   EIGEN_ALIGN16 __UNPACK_TYPE__(Packet) a[unpacket_traits<Packet>::size];
   eigen_internal_assert(n <= unpacket_traits<Packet>::size && "number of elements will scatter past end of packet");
   if (stride == 1) {
@@ -897,129 +955,203 @@
     pstore<__UNPACK_TYPE__(Packet)>(a, from);
     LOAD_STORE_UNROLL_16
     for (Index i = 0; i < n; i++) {
-      to[i*stride] = a[i];
+      to[i * stride] = a[i];
     }
   }
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter<float, Packet4f>(float* to, const Packet4f& from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter<float, Packet4f>(float* to, const Packet4f& from, Index stride) {
   pscatter_common<Packet4f>(to, from, stride);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter<int, Packet4i>(int* to, const Packet4i& from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter<int, Packet4i>(int* to, const Packet4i& from, Index stride) {
   pscatter_common<Packet4i>(to, from, stride);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter<short int, Packet8s>(short int* to, const Packet8s& from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter<short int, Packet8s>(short int* to, const Packet8s& from,
+                                                                         Index stride) {
   pscatter_common<Packet8s>(to, from, stride);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter<unsigned short int, Packet8us>(unsigned short int* to, const Packet8us& from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter<unsigned short int, Packet8us>(unsigned short int* to,
+                                                                                   const Packet8us& from,
+                                                                                   Index stride) {
   pscatter_common<Packet8us>(to, from, stride);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter<bfloat16, Packet8bf>(bfloat16* to, const Packet8bf& from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter<bfloat16, Packet8bf>(bfloat16* to, const Packet8bf& from,
+                                                                         Index stride) {
   pscatter_common<Packet8bf>(to, from, stride);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter<signed char, Packet16c>(signed char* to, const Packet16c& from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter<signed char, Packet16c>(signed char* to, const Packet16c& from,
+                                                                            Index stride) {
   pscatter_common<Packet16c>(to, from, stride);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter<unsigned char, Packet16uc>(unsigned char* to, const Packet16uc& from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter<unsigned char, Packet16uc>(unsigned char* to,
+                                                                               const Packet16uc& from, Index stride) {
   pscatter_common<Packet16uc>(to, from, stride);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter_partial<float, Packet4f>(float* to, const Packet4f& from, Index stride, const Index n)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter_partial<float, Packet4f>(float* to, const Packet4f& from,
+                                                                             Index stride, const Index n) {
   pscatter_common<Packet4f>(to, from, stride, n);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter_partial<int, Packet4i>(int* to, const Packet4i& from, Index stride, const Index n)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter_partial<int, Packet4i>(int* to, const Packet4i& from, Index stride,
+                                                                           const Index n) {
   pscatter_common<Packet4i>(to, from, stride, n);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter_partial<short int, Packet8s>(short int* to, const Packet8s& from, Index stride, const Index n)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter_partial<short int, Packet8s>(short int* to, const Packet8s& from,
+                                                                                 Index stride, const Index n) {
   pscatter_common<Packet8s>(to, from, stride, n);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter_partial<unsigned short int, Packet8us>(unsigned short int* to, const Packet8us& from, Index stride, const Index n)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter_partial<unsigned short int, Packet8us>(unsigned short int* to,
+                                                                                           const Packet8us& from,
+                                                                                           Index stride,
+                                                                                           const Index n) {
   pscatter_common<Packet8us>(to, from, stride, n);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter_partial<bfloat16, Packet8bf>(bfloat16* to, const Packet8bf& from, Index stride, const Index n)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter_partial<bfloat16, Packet8bf>(bfloat16* to, const Packet8bf& from,
+                                                                                 Index stride, const Index n) {
   pscatter_common<Packet8bf>(to, from, stride, n);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter_partial<signed char, Packet16c>(signed char* to, const Packet16c& from, Index stride, const Index n)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter_partial<signed char, Packet16c>(signed char* to,
+                                                                                    const Packet16c& from, Index stride,
+                                                                                    const Index n) {
   pscatter_common<Packet16c>(to, from, stride, n);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter_partial<unsigned char, Packet16uc>(unsigned char* to, const Packet16uc& from, Index stride, const Index n)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter_partial<unsigned char, Packet16uc>(unsigned char* to,
+                                                                                       const Packet16uc& from,
+                                                                                       Index stride, const Index n) {
   pscatter_common<Packet16uc>(to, from, stride, n);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f   plset<Packet4f>(const float&     a) { return pset1<Packet4f>(a) + p4f_COUNTDOWN;  }
-template<> EIGEN_STRONG_INLINE Packet4i   plset<Packet4i>(const int&       a) { return pset1<Packet4i>(a) + p4i_COUNTDOWN;  }
-template<> EIGEN_STRONG_INLINE Packet8s   plset<Packet8s>(const short int& a) { return pset1<Packet8s>(a) + p8s_COUNTDOWN; }
-template<> EIGEN_STRONG_INLINE Packet8us  plset<Packet8us>(const unsigned short int& a) { return pset1<Packet8us>(a) + p8us_COUNTDOWN; }
-template<> EIGEN_STRONG_INLINE Packet16c  plset<Packet16c>(const signed char& a)   { return pset1<Packet16c>(a) + p16c_COUNTDOWN; }
-template<> EIGEN_STRONG_INLINE Packet16uc plset<Packet16uc>(const unsigned char& a)   { return pset1<Packet16uc>(a) + p16uc_COUNTDOWN; }
+template <>
+EIGEN_STRONG_INLINE Packet4f plset<Packet4f>(const float& a) {
+  return pset1<Packet4f>(a) + p4f_COUNTDOWN;
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i plset<Packet4i>(const int& a) {
+  return pset1<Packet4i>(a) + p4i_COUNTDOWN;
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s plset<Packet8s>(const short int& a) {
+  return pset1<Packet8s>(a) + p8s_COUNTDOWN;
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us plset<Packet8us>(const unsigned short int& a) {
+  return pset1<Packet8us>(a) + p8us_COUNTDOWN;
+}
+template <>
+EIGEN_STRONG_INLINE Packet16c plset<Packet16c>(const signed char& a) {
+  return pset1<Packet16c>(a) + p16c_COUNTDOWN;
+}
+template <>
+EIGEN_STRONG_INLINE Packet16uc plset<Packet16uc>(const unsigned char& a) {
+  return pset1<Packet16uc>(a) + p16uc_COUNTDOWN;
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f   padd<Packet4f>  (const Packet4f&   a, const Packet4f&   b) { return a + b; }
-template<> EIGEN_STRONG_INLINE Packet4i   padd<Packet4i>  (const Packet4i&   a, const Packet4i&   b) { return a + b; }
-template<> EIGEN_STRONG_INLINE Packet4ui   padd<Packet4ui>  (const Packet4ui&   a, const Packet4ui&   b) { return a + b; }
-template<> EIGEN_STRONG_INLINE Packet8s   padd<Packet8s>  (const Packet8s&   a, const Packet8s&   b) { return a + b; }
-template<> EIGEN_STRONG_INLINE Packet8us  padd<Packet8us> (const Packet8us&  a, const Packet8us&  b) { return a + b; }
-template<> EIGEN_STRONG_INLINE Packet16c  padd<Packet16c> (const Packet16c&  a, const Packet16c&  b) { return a + b; }
-template<> EIGEN_STRONG_INLINE Packet16uc padd<Packet16uc>(const Packet16uc& a, const Packet16uc& b) { return a + b; }
+template <>
+EIGEN_STRONG_INLINE Packet4f padd<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return a + b;
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i padd<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return a + b;
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui padd<Packet4ui>(const Packet4ui& a, const Packet4ui& b) {
+  return a + b;
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s padd<Packet8s>(const Packet8s& a, const Packet8s& b) {
+  return a + b;
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us padd<Packet8us>(const Packet8us& a, const Packet8us& b) {
+  return a + b;
+}
+template <>
+EIGEN_STRONG_INLINE Packet16c padd<Packet16c>(const Packet16c& a, const Packet16c& b) {
+  return a + b;
+}
+template <>
+EIGEN_STRONG_INLINE Packet16uc padd<Packet16uc>(const Packet16uc& a, const Packet16uc& b) {
+  return a + b;
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f   psub<Packet4f>  (const Packet4f&   a, const Packet4f&   b) { return a - b; }
-template<> EIGEN_STRONG_INLINE Packet4i   psub<Packet4i>  (const Packet4i&   a, const Packet4i&   b) { return a - b; }
-template<> EIGEN_STRONG_INLINE Packet8s   psub<Packet8s>  (const Packet8s&   a, const Packet8s&   b) { return a - b; }
-template<> EIGEN_STRONG_INLINE Packet8us  psub<Packet8us> (const Packet8us&  a, const Packet8us&  b) { return a - b; }
-template<> EIGEN_STRONG_INLINE Packet16c  psub<Packet16c> (const Packet16c&  a, const Packet16c&  b) { return a - b; }
-template<> EIGEN_STRONG_INLINE Packet16uc psub<Packet16uc>(const Packet16uc& a, const Packet16uc& b) { return a - b; }
+template <>
+EIGEN_STRONG_INLINE Packet4f psub<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return a - b;
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i psub<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return a - b;
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s psub<Packet8s>(const Packet8s& a, const Packet8s& b) {
+  return a - b;
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us psub<Packet8us>(const Packet8us& a, const Packet8us& b) {
+  return a - b;
+}
+template <>
+EIGEN_STRONG_INLINE Packet16c psub<Packet16c>(const Packet16c& a, const Packet16c& b) {
+  return a - b;
+}
+template <>
+EIGEN_STRONG_INLINE Packet16uc psub<Packet16uc>(const Packet16uc& a, const Packet16uc& b) {
+  return a - b;
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f pnegate(const Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f pnegate(const Packet4f& a) {
 #ifdef __POWER8_VECTOR__
   return vec_neg(a);
 #else
   return vec_xor(a, p4f_MZERO);
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet16c pnegate(const Packet16c& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet16c pnegate(const Packet16c& a) {
 #ifdef __POWER8_VECTOR__
   return vec_neg(a);
 #else
   return reinterpret_cast<Packet16c>(p4i_ZERO) - a;
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet8s pnegate(const Packet8s& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8s pnegate(const Packet8s& a) {
 #ifdef __POWER8_VECTOR__
   return vec_neg(a);
 #else
   return reinterpret_cast<Packet8s>(p4i_ZERO) - a;
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet4i pnegate(const Packet4i& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4i pnegate(const Packet4i& a) {
 #ifdef __POWER8_VECTOR__
   return vec_neg(a);
 #else
@@ -1027,19 +1159,42 @@
 #endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pconj(const Packet4f& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet4i pconj(const Packet4i& a) { return a; }
+template <>
+EIGEN_STRONG_INLINE Packet4f pconj(const Packet4f& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pconj(const Packet4i& a) {
+  return a;
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f   pmul<Packet4f>  (const Packet4f&   a, const Packet4f&   b) { return vec_madd(a,b, p4f_MZERO); }
-template<> EIGEN_STRONG_INLINE Packet4i   pmul<Packet4i>  (const Packet4i&   a, const Packet4i&   b) { return a * b; }
-template<> EIGEN_STRONG_INLINE Packet8s   pmul<Packet8s>  (const Packet8s&   a, const Packet8s&   b) { return vec_mul(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8us  pmul<Packet8us> (const Packet8us&  a, const Packet8us&  b) { return vec_mul(a,b); }
-template<> EIGEN_STRONG_INLINE Packet16c  pmul<Packet16c> (const Packet16c&  a, const Packet16c&  b) { return vec_mul(a,b); }
-template<> EIGEN_STRONG_INLINE Packet16uc pmul<Packet16uc>(const Packet16uc& a, const Packet16uc& b) { return vec_mul(a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet4f pmul<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return vec_madd(a, b, p4f_MZERO);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pmul<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return a * b;
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s pmul<Packet8s>(const Packet8s& a, const Packet8s& b) {
+  return vec_mul(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us pmul<Packet8us>(const Packet8us& a, const Packet8us& b) {
+  return vec_mul(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16c pmul<Packet16c>(const Packet16c& a, const Packet16c& b) {
+  return vec_mul(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16uc pmul<Packet16uc>(const Packet16uc& a, const Packet16uc& b) {
+  return vec_mul(a, b);
+}
 
-
-template<> EIGEN_STRONG_INLINE Packet4f pdiv<Packet4f>(const Packet4f& a, const Packet4f& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f pdiv<Packet4f>(const Packet4f& a, const Packet4f& b) {
 #ifndef __VSX__  // VSX actually provides a div instruction
   Packet4f t, y_0, y_1;
 
@@ -1047,7 +1202,7 @@
   y_0 = vec_re(b);
 
   // Do one Newton-Raphson iteration to get the needed accuracy
-  t   = vec_nmsub(y_0, b, p4f_ONE);
+  t = vec_nmsub(y_0, b, p4f_ONE);
   y_1 = vec_madd(y_0, t, y_0);
 
   return vec_madd(a, y_1, p4f_MZERO);
@@ -1056,9 +1211,9 @@
 #endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet4i pdiv<Packet4i>(const Packet4i& a, const Packet4i& b)
-{
-#if defined(_ARCH_PWR10) && (EIGEN_COMP_LLVM || EIGEN_GNUC_STRICT_AT_LEAST(11,0,0))
+template <>
+EIGEN_STRONG_INLINE Packet4i pdiv<Packet4i>(const Packet4i& a, const Packet4i& b) {
+#if defined(_ARCH_PWR10) && (EIGEN_COMP_LLVM || EIGEN_GNUC_STRICT_AT_LEAST(11, 0, 0))
   return vec_div(a, b);
 #else
   EIGEN_UNUSED_VARIABLE(a);
@@ -1069,154 +1224,302 @@
 }
 
 // for some weird raisons, it has to be overloaded for packet of integers
-template<> EIGEN_STRONG_INLINE Packet4f pmadd(const Packet4f& a, const Packet4f& b, const Packet4f& c) { return vec_madd(a,b,c); }
-template<> EIGEN_STRONG_INLINE Packet4i pmadd(const Packet4i& a, const Packet4i& b, const Packet4i& c) { return a*b + c; }
-template<> EIGEN_STRONG_INLINE Packet8s pmadd(const Packet8s& a, const Packet8s& b, const Packet8s& c) { return vec_madd(a,b,c); }
-template<> EIGEN_STRONG_INLINE Packet8us pmadd(const Packet8us& a, const Packet8us& b, const Packet8us& c) { return vec_madd(a,b,c); }
+template <>
+EIGEN_STRONG_INLINE Packet4f pmadd(const Packet4f& a, const Packet4f& b, const Packet4f& c) {
+  return vec_madd(a, b, c);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pmadd(const Packet4i& a, const Packet4i& b, const Packet4i& c) {
+  return a * b + c;
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s pmadd(const Packet8s& a, const Packet8s& b, const Packet8s& c) {
+  return vec_madd(a, b, c);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us pmadd(const Packet8us& a, const Packet8us& b, const Packet8us& c) {
+  return vec_madd(a, b, c);
+}
 
 #ifdef EIGEN_VECTORIZE_VSX
-template<> EIGEN_STRONG_INLINE Packet4f pmsub(const Packet4f& a, const Packet4f& b, const Packet4f& c) { return vec_msub(a,b,c); }
-template<> EIGEN_STRONG_INLINE Packet4f pnmadd(const Packet4f& a, const Packet4f& b, const Packet4f& c) { return vec_nmsub(a,b,c); }
-template<> EIGEN_STRONG_INLINE Packet4f pnmsub(const Packet4f& a, const Packet4f& b, const Packet4f& c) { return vec_nmadd(a,b,c); }
+template <>
+EIGEN_STRONG_INLINE Packet4f pmsub(const Packet4f& a, const Packet4f& b, const Packet4f& c) {
+  return vec_msub(a, b, c);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pnmadd(const Packet4f& a, const Packet4f& b, const Packet4f& c) {
+  return vec_nmsub(a, b, c);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pnmsub(const Packet4f& a, const Packet4f& b, const Packet4f& c) {
+  return vec_nmadd(a, b, c);
+}
 #endif
 
-template<> EIGEN_STRONG_INLINE Packet4f pmin<Packet4f>(const Packet4f& a, const Packet4f& b)
-{
-  #ifdef EIGEN_VECTORIZE_VSX
+template <>
+EIGEN_STRONG_INLINE Packet4f pmin<Packet4f>(const Packet4f& a, const Packet4f& b) {
+#ifdef EIGEN_VECTORIZE_VSX
   // NOTE: about 10% slower than vec_min, but consistent with std::min and SSE regarding NaN
   Packet4f ret;
-  __asm__ ("xvcmpgesp %x0,%x1,%x2\n\txxsel %x0,%x1,%x2,%x0" : "=&wa" (ret) : "wa" (a), "wa" (b));
+  __asm__("xvcmpgesp %x0,%x1,%x2\n\txxsel %x0,%x1,%x2,%x0" : "=&wa"(ret) : "wa"(a), "wa"(b));
   return ret;
-  #else
+#else
   return vec_min(a, b);
-  #endif
+#endif
 }
-template<> EIGEN_STRONG_INLINE Packet4i pmin<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_min(a, b); }
-template<> EIGEN_STRONG_INLINE Packet8s pmin<Packet8s>(const Packet8s& a, const Packet8s& b) { return vec_min(a, b); }
-template<> EIGEN_STRONG_INLINE Packet8us pmin<Packet8us>(const Packet8us& a, const Packet8us& b) { return vec_min(a, b); }
-template<> EIGEN_STRONG_INLINE Packet16c pmin<Packet16c>(const Packet16c& a, const Packet16c& b) { return vec_min(a, b); }
-template<> EIGEN_STRONG_INLINE Packet16uc pmin<Packet16uc>(const Packet16uc& a, const Packet16uc& b) { return vec_min(a, b); }
+template <>
+EIGEN_STRONG_INLINE Packet4i pmin<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return vec_min(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s pmin<Packet8s>(const Packet8s& a, const Packet8s& b) {
+  return vec_min(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us pmin<Packet8us>(const Packet8us& a, const Packet8us& b) {
+  return vec_min(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16c pmin<Packet16c>(const Packet16c& a, const Packet16c& b) {
+  return vec_min(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16uc pmin<Packet16uc>(const Packet16uc& a, const Packet16uc& b) {
+  return vec_min(a, b);
+}
 
-
-template<> EIGEN_STRONG_INLINE Packet4f pmax<Packet4f>(const Packet4f& a, const Packet4f& b)
-{
-  #ifdef EIGEN_VECTORIZE_VSX
+template <>
+EIGEN_STRONG_INLINE Packet4f pmax<Packet4f>(const Packet4f& a, const Packet4f& b) {
+#ifdef EIGEN_VECTORIZE_VSX
   // NOTE: about 10% slower than vec_max, but consistent with std::max and SSE regarding NaN
   Packet4f ret;
-  __asm__ ("xvcmpgtsp %x0,%x2,%x1\n\txxsel %x0,%x1,%x2,%x0" : "=&wa" (ret) : "wa" (a), "wa" (b));
+  __asm__("xvcmpgtsp %x0,%x2,%x1\n\txxsel %x0,%x1,%x2,%x0" : "=&wa"(ret) : "wa"(a), "wa"(b));
   return ret;
-  #else
+#else
   return vec_max(a, b);
-  #endif
+#endif
 }
-template<> EIGEN_STRONG_INLINE Packet4i pmax<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_max(a, b); }
-template<> EIGEN_STRONG_INLINE Packet8s pmax<Packet8s>(const Packet8s& a, const Packet8s& b) { return vec_max(a, b); }
-template<> EIGEN_STRONG_INLINE Packet8us pmax<Packet8us>(const Packet8us& a, const Packet8us& b) { return vec_max(a, b); }
-template<> EIGEN_STRONG_INLINE Packet16c pmax<Packet16c>(const Packet16c& a, const Packet16c& b) { return vec_max(a, b); }
-template<> EIGEN_STRONG_INLINE Packet16uc pmax<Packet16uc>(const Packet16uc& a, const Packet16uc& b) { return vec_max(a, b); }
+template <>
+EIGEN_STRONG_INLINE Packet4i pmax<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return vec_max(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s pmax<Packet8s>(const Packet8s& a, const Packet8s& b) {
+  return vec_max(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us pmax<Packet8us>(const Packet8us& a, const Packet8us& b) {
+  return vec_max(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16c pmax<Packet16c>(const Packet16c& a, const Packet16c& b) {
+  return vec_max(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16uc pmax<Packet16uc>(const Packet16uc& a, const Packet16uc& b) {
+  return vec_max(a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f pcmp_le(const Packet4f& a, const Packet4f& b) { return reinterpret_cast<Packet4f>(vec_cmple(a,b)); }
+template <>
+EIGEN_STRONG_INLINE Packet4f pcmp_le(const Packet4f& a, const Packet4f& b) {
+  return reinterpret_cast<Packet4f>(vec_cmple(a, b));
+}
 // To fix bug with vec_cmplt on older versions
 #ifdef EIGEN_VECTORIZE_VSX
-template<> EIGEN_STRONG_INLINE Packet4f pcmp_lt(const Packet4f& a, const Packet4f& b) { return reinterpret_cast<Packet4f>(vec_cmplt(a,b)); }
+template <>
+EIGEN_STRONG_INLINE Packet4f pcmp_lt(const Packet4f& a, const Packet4f& b) {
+  return reinterpret_cast<Packet4f>(vec_cmplt(a, b));
+}
 #endif
-template<> EIGEN_STRONG_INLINE Packet4f pcmp_eq(const Packet4f& a, const Packet4f& b) { return reinterpret_cast<Packet4f>(vec_cmpeq(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet4f pcmp_lt_or_nan(const Packet4f& a, const Packet4f& b) {
-  Packet4f c = reinterpret_cast<Packet4f>(vec_cmpge(a,b));
-  return vec_nor(c,c);
+template <>
+EIGEN_STRONG_INLINE Packet4f pcmp_eq(const Packet4f& a, const Packet4f& b) {
+  return reinterpret_cast<Packet4f>(vec_cmpeq(a, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pcmp_lt_or_nan(const Packet4f& a, const Packet4f& b) {
+  Packet4f c = reinterpret_cast<Packet4f>(vec_cmpge(a, b));
+  return vec_nor(c, c);
 }
 
 #ifdef EIGEN_VECTORIZE_VSX
-template<> EIGEN_STRONG_INLINE Packet4i pcmp_le(const Packet4i& a, const Packet4i& b) { return reinterpret_cast<Packet4i>(vec_cmple(a,b)); }
+template <>
+EIGEN_STRONG_INLINE Packet4i pcmp_le(const Packet4i& a, const Packet4i& b) {
+  return reinterpret_cast<Packet4i>(vec_cmple(a, b));
+}
 #endif
-template<> EIGEN_STRONG_INLINE Packet4i pcmp_lt(const Packet4i& a, const Packet4i& b) { return reinterpret_cast<Packet4i>(vec_cmplt(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet4i pcmp_eq(const Packet4i& a, const Packet4i& b) { return reinterpret_cast<Packet4i>(vec_cmpeq(a,b)); }
+template <>
+EIGEN_STRONG_INLINE Packet4i pcmp_lt(const Packet4i& a, const Packet4i& b) {
+  return reinterpret_cast<Packet4i>(vec_cmplt(a, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pcmp_eq(const Packet4i& a, const Packet4i& b) {
+  return reinterpret_cast<Packet4i>(vec_cmpeq(a, b));
+}
 #ifdef EIGEN_VECTORIZE_VSX
-template<> EIGEN_STRONG_INLINE Packet8s pcmp_le(const Packet8s& a, const Packet8s& b) { return reinterpret_cast<Packet8s>(vec_cmple(a,b)); }
+template <>
+EIGEN_STRONG_INLINE Packet8s pcmp_le(const Packet8s& a, const Packet8s& b) {
+  return reinterpret_cast<Packet8s>(vec_cmple(a, b));
+}
 #endif
-template<> EIGEN_STRONG_INLINE Packet8s pcmp_lt(const Packet8s& a, const Packet8s& b) { return reinterpret_cast<Packet8s>(vec_cmplt(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet8s pcmp_eq(const Packet8s& a, const Packet8s& b) { return reinterpret_cast<Packet8s>(vec_cmpeq(a,b)); }
+template <>
+EIGEN_STRONG_INLINE Packet8s pcmp_lt(const Packet8s& a, const Packet8s& b) {
+  return reinterpret_cast<Packet8s>(vec_cmplt(a, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s pcmp_eq(const Packet8s& a, const Packet8s& b) {
+  return reinterpret_cast<Packet8s>(vec_cmpeq(a, b));
+}
 #ifdef EIGEN_VECTORIZE_VSX
-template<> EIGEN_STRONG_INLINE Packet8us pcmp_le(const Packet8us& a, const Packet8us& b) { return reinterpret_cast<Packet8us>(vec_cmple(a,b)); }
+template <>
+EIGEN_STRONG_INLINE Packet8us pcmp_le(const Packet8us& a, const Packet8us& b) {
+  return reinterpret_cast<Packet8us>(vec_cmple(a, b));
+}
 #endif
-template<> EIGEN_STRONG_INLINE Packet8us pcmp_lt(const Packet8us& a, const Packet8us& b) { return reinterpret_cast<Packet8us>(vec_cmplt(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet8us pcmp_eq(const Packet8us& a, const Packet8us& b) { return reinterpret_cast<Packet8us>(vec_cmpeq(a,b)); }
+template <>
+EIGEN_STRONG_INLINE Packet8us pcmp_lt(const Packet8us& a, const Packet8us& b) {
+  return reinterpret_cast<Packet8us>(vec_cmplt(a, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us pcmp_eq(const Packet8us& a, const Packet8us& b) {
+  return reinterpret_cast<Packet8us>(vec_cmpeq(a, b));
+}
 #ifdef EIGEN_VECTORIZE_VSX
-template<> EIGEN_STRONG_INLINE Packet16c pcmp_le(const Packet16c& a, const Packet16c& b) { return reinterpret_cast<Packet16c>(vec_cmple(a,b)); }
+template <>
+EIGEN_STRONG_INLINE Packet16c pcmp_le(const Packet16c& a, const Packet16c& b) {
+  return reinterpret_cast<Packet16c>(vec_cmple(a, b));
+}
 #endif
-template<> EIGEN_STRONG_INLINE Packet16c pcmp_lt(const Packet16c& a, const Packet16c& b) { return reinterpret_cast<Packet16c>(vec_cmplt(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet16c pcmp_eq(const Packet16c& a, const Packet16c& b) { return reinterpret_cast<Packet16c>(vec_cmpeq(a,b)); }
+template <>
+EIGEN_STRONG_INLINE Packet16c pcmp_lt(const Packet16c& a, const Packet16c& b) {
+  return reinterpret_cast<Packet16c>(vec_cmplt(a, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet16c pcmp_eq(const Packet16c& a, const Packet16c& b) {
+  return reinterpret_cast<Packet16c>(vec_cmpeq(a, b));
+}
 #ifdef EIGEN_VECTORIZE_VSX
-template<> EIGEN_STRONG_INLINE Packet16uc pcmp_le(const Packet16uc& a, const Packet16uc& b) { return reinterpret_cast<Packet16uc>(vec_cmple(a,b)); }
+template <>
+EIGEN_STRONG_INLINE Packet16uc pcmp_le(const Packet16uc& a, const Packet16uc& b) {
+  return reinterpret_cast<Packet16uc>(vec_cmple(a, b));
+}
 #endif
-template<> EIGEN_STRONG_INLINE Packet16uc pcmp_lt(const Packet16uc& a, const Packet16uc& b) { return reinterpret_cast<Packet16uc>(vec_cmplt(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet16uc pcmp_eq(const Packet16uc& a, const Packet16uc& b) { return reinterpret_cast<Packet16uc>(vec_cmpeq(a,b)); }
+template <>
+EIGEN_STRONG_INLINE Packet16uc pcmp_lt(const Packet16uc& a, const Packet16uc& b) {
+  return reinterpret_cast<Packet16uc>(vec_cmplt(a, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet16uc pcmp_eq(const Packet16uc& a, const Packet16uc& b) {
+  return reinterpret_cast<Packet16uc>(vec_cmpeq(a, b));
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f pand<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_and(a, b); }
-template<> EIGEN_STRONG_INLINE Packet4i pand<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_and(a, b); }
-template<> EIGEN_STRONG_INLINE Packet4ui pand<Packet4ui>(const Packet4ui& a, const Packet4ui& b) { return vec_and(a, b); }
-template<> EIGEN_STRONG_INLINE Packet8us pand<Packet8us>(const Packet8us& a, const Packet8us& b) { return vec_and(a, b); }
-template<> EIGEN_STRONG_INLINE Packet8bf pand<Packet8bf>(const Packet8bf& a, const Packet8bf& b) {
+template <>
+EIGEN_STRONG_INLINE Packet4f pand<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return vec_and(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pand<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return vec_and(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui pand<Packet4ui>(const Packet4ui& a, const Packet4ui& b) {
+  return vec_and(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us pand<Packet8us>(const Packet8us& a, const Packet8us& b) {
+  return vec_and(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8bf pand<Packet8bf>(const Packet8bf& a, const Packet8bf& b) {
   return pand<Packet8us>(a, b);
 }
 
-
-template<> EIGEN_STRONG_INLINE Packet4f por<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_or(a, b); }
-template<> EIGEN_STRONG_INLINE Packet4i por<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_or(a, b); }
-template<> EIGEN_STRONG_INLINE Packet8s por<Packet8s>(const Packet8s& a, const Packet8s& b) { return vec_or(a, b); }
-template<> EIGEN_STRONG_INLINE Packet8us por<Packet8us>(const Packet8us& a, const Packet8us& b) { return vec_or(a, b); }
-template<> EIGEN_STRONG_INLINE Packet8bf por<Packet8bf>(const Packet8bf& a, const Packet8bf& b) {
+template <>
+EIGEN_STRONG_INLINE Packet4f por<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return vec_or(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i por<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return vec_or(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s por<Packet8s>(const Packet8s& a, const Packet8s& b) {
+  return vec_or(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us por<Packet8us>(const Packet8us& a, const Packet8us& b) {
+  return vec_or(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8bf por<Packet8bf>(const Packet8bf& a, const Packet8bf& b) {
   return por<Packet8us>(a, b);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pxor<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_xor(a, b); }
-template<> EIGEN_STRONG_INLINE Packet4i pxor<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_xor(a, b); }
-template<> EIGEN_STRONG_INLINE Packet8us pxor<Packet8us>(const Packet8us& a, const Packet8us& b) { return vec_xor(a, b); }
-template<> EIGEN_STRONG_INLINE Packet8bf pxor<Packet8bf>(const Packet8bf& a, const Packet8bf& b) { 
+template <>
+EIGEN_STRONG_INLINE Packet4f pxor<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return vec_xor(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pxor<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return vec_xor(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us pxor<Packet8us>(const Packet8us& a, const Packet8us& b) {
+  return vec_xor(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8bf pxor<Packet8bf>(const Packet8bf& a, const Packet8bf& b) {
   return pxor<Packet8us>(a, b);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pandnot<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_andc(a, b); }
-template<> EIGEN_STRONG_INLINE Packet4i pandnot<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_andc(a, b); }
+template <>
+EIGEN_STRONG_INLINE Packet4f pandnot<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return vec_andc(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pandnot<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return vec_andc(a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f pselect(const Packet4f& mask, const Packet4f& a, const Packet4f& b) {
+template <>
+EIGEN_STRONG_INLINE Packet4f pselect(const Packet4f& mask, const Packet4f& a, const Packet4f& b) {
   return vec_sel(b, a, reinterpret_cast<Packet4ui>(mask));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pround<Packet4f>(const Packet4f& a)
-{
-    Packet4f t = vec_add(reinterpret_cast<Packet4f>(vec_or(vec_and(reinterpret_cast<Packet4ui>(a), p4ui_SIGN), p4ui_PREV0DOT5)), a);
-    Packet4f res;
+template <>
+EIGEN_STRONG_INLINE Packet4f pround<Packet4f>(const Packet4f& a) {
+  Packet4f t = vec_add(
+      reinterpret_cast<Packet4f>(vec_or(vec_and(reinterpret_cast<Packet4ui>(a), p4ui_SIGN), p4ui_PREV0DOT5)), a);
+  Packet4f res;
 
 #ifdef EIGEN_VECTORIZE_VSX
-    __asm__("xvrspiz %x0, %x1\n\t"
-        : "=&wa" (res)
-        : "wa" (t));
+  __asm__("xvrspiz %x0, %x1\n\t" : "=&wa"(res) : "wa"(t));
 #else
-    __asm__("vrfiz %0, %1\n\t"
-        : "=v" (res)
-        : "v" (t));
+  __asm__("vrfiz %0, %1\n\t" : "=v"(res) : "v"(t));
 #endif
 
-    return res;
+  return res;
 }
-template<> EIGEN_STRONG_INLINE Packet4f pceil<Packet4f>(const  Packet4f& a) { return vec_ceil(a); }
-template<> EIGEN_STRONG_INLINE Packet4f pfloor<Packet4f>(const Packet4f& a) { return vec_floor(a); }
+template <>
+EIGEN_STRONG_INLINE Packet4f pceil<Packet4f>(const Packet4f& a) {
+  return vec_ceil(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pfloor<Packet4f>(const Packet4f& a) {
+  return vec_floor(a);
+}
 #ifdef EIGEN_VECTORIZE_VSX
-template<> EIGEN_STRONG_INLINE Packet4f print<Packet4f>(const Packet4f& a)
-{
-    Packet4f res;
+template <>
+EIGEN_STRONG_INLINE Packet4f print<Packet4f>(const Packet4f& a) {
+  Packet4f res;
 
-    __asm__("xvrspic %x0, %x1\n\t"
-        : "=&wa" (res)
-        : "wa" (a));
+  __asm__("xvrspic %x0, %x1\n\t" : "=&wa"(res) : "wa"(a));
 
-    return res;
+  return res;
 }
 #endif
 
-template<typename Packet> EIGEN_STRONG_INLINE Packet ploadu_common(const __UNPACK_TYPE__(Packet)* from)
-{
+template <typename Packet>
+EIGEN_STRONG_INLINE Packet ploadu_common(const __UNPACK_TYPE__(Packet) * from) {
   EIGEN_DEBUG_ALIGNED_LOAD
 #if defined(EIGEN_VECTORIZE_VSX) || !defined(_BIG_ENDIAN)
   EIGEN_DEBUG_UNALIGNED_LOAD
@@ -1224,45 +1527,46 @@
 #else
   Packet16uc MSQ, LSQ;
   Packet16uc mask;
-  MSQ = vec_ld(0, (unsigned char *)from);          // most significant quadword
-  LSQ = vec_ld(15, (unsigned char *)from);         // least significant quadword
-  mask = vec_lvsl(0, from);                        // create the permute mask
-  //TODO: Add static_cast here
-  return (Packet) vec_perm(MSQ, LSQ, mask);           // align the data
+  MSQ = vec_ld(0, (unsigned char*)from);   // most significant quadword
+  LSQ = vec_ld(15, (unsigned char*)from);  // least significant quadword
+  mask = vec_lvsl(0, from);                // create the permute mask
+  // TODO: Add static_cast here
+  return (Packet)vec_perm(MSQ, LSQ, mask);  // align the data
 #endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f ploadu<Packet4f>(const float* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f ploadu<Packet4f>(const float* from) {
   return ploadu_common<Packet4f>(from);
 }
-template<> EIGEN_STRONG_INLINE Packet4i ploadu<Packet4i>(const int* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4i ploadu<Packet4i>(const int* from) {
   return ploadu_common<Packet4i>(from);
 }
-template<> EIGEN_STRONG_INLINE Packet8s ploadu<Packet8s>(const short int* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8s ploadu<Packet8s>(const short int* from) {
   return ploadu_common<Packet8s>(from);
 }
-template<> EIGEN_STRONG_INLINE Packet8us ploadu<Packet8us>(const unsigned short int* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8us ploadu<Packet8us>(const unsigned short int* from) {
   return ploadu_common<Packet8us>(from);
 }
-template<> EIGEN_STRONG_INLINE Packet8bf ploadu<Packet8bf>(const bfloat16* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8bf ploadu<Packet8bf>(const bfloat16* from) {
   return ploadu_common<Packet8us>(reinterpret_cast<const unsigned short int*>(from));
 }
-template<> EIGEN_STRONG_INLINE Packet16c ploadu<Packet16c>(const signed char* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet16c ploadu<Packet16c>(const signed char* from) {
   return ploadu_common<Packet16c>(from);
 }
-template<> EIGEN_STRONG_INLINE Packet16uc ploadu<Packet16uc>(const unsigned char* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet16uc ploadu<Packet16uc>(const unsigned char* from) {
   return ploadu_common<Packet16uc>(from);
 }
 
-template<typename Packet> EIGEN_ALWAYS_INLINE Packet ploadu_partial_common(const __UNPACK_TYPE__(Packet)* from, const Index n, const Index offset)
-{
+template <typename Packet>
+EIGEN_ALWAYS_INLINE Packet ploadu_partial_common(const __UNPACK_TYPE__(Packet) * from, const Index n,
+                                                 const Index offset) {
   const Index packet_size = unpacket_traits<Packet>::size;
   eigen_internal_assert(n + offset <= packet_size && "number of elements plus offset will read past end of packet");
   const Index size = sizeof(__UNPACK_TYPE__(Packet));
@@ -1283,13 +1587,13 @@
 #else
   if (n) {
     EIGEN_ALIGN16 __UNPACK_TYPE__(Packet) load[packet_size];
-    unsigned char* load2 = reinterpret_cast<unsigned char *>(load + offset);
-    unsigned char* from2 = reinterpret_cast<unsigned char *>(const_cast<__UNPACK_TYPE__(Packet)*>(from));
+    unsigned char* load2 = reinterpret_cast<unsigned char*>(load + offset);
+    unsigned char* from2 = reinterpret_cast<unsigned char*>(const_cast<__UNPACK_TYPE__(Packet)*>(from));
     Index n2 = n * size;
     if (16 <= n2) {
       pstoreu(load2, ploadu<Packet16uc>(from2));
     } else {
-      memcpy((void *)load2, (void *)from2, n2);
+      memcpy((void*)load2, (void*)from2, n2);
     }
     return pload_ignore<Packet>(load);
   } else {
@@ -1298,106 +1602,122 @@
 #endif
 }
 
-template<> EIGEN_ALWAYS_INLINE Packet4f ploadu_partial<Packet4f>(const float* from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE Packet4f ploadu_partial<Packet4f>(const float* from, const Index n, const Index offset) {
   return ploadu_partial_common<Packet4f>(from, n, offset);
 }
-template<> EIGEN_ALWAYS_INLINE Packet4i ploadu_partial<Packet4i>(const int* from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE Packet4i ploadu_partial<Packet4i>(const int* from, const Index n, const Index offset) {
   return ploadu_partial_common<Packet4i>(from, n, offset);
 }
-template<> EIGEN_ALWAYS_INLINE Packet8s ploadu_partial<Packet8s>(const short int* from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE Packet8s ploadu_partial<Packet8s>(const short int* from, const Index n, const Index offset) {
   return ploadu_partial_common<Packet8s>(from, n, offset);
 }
-template<> EIGEN_ALWAYS_INLINE Packet8us ploadu_partial<Packet8us>(const unsigned short int* from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE Packet8us ploadu_partial<Packet8us>(const unsigned short int* from, const Index n,
+                                                        const Index offset) {
   return ploadu_partial_common<Packet8us>(from, n, offset);
 }
-template<> EIGEN_ALWAYS_INLINE Packet8bf ploadu_partial<Packet8bf>(const bfloat16* from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE Packet8bf ploadu_partial<Packet8bf>(const bfloat16* from, const Index n, const Index offset) {
   return ploadu_partial_common<Packet8us>(reinterpret_cast<const unsigned short int*>(from), n, offset);
 }
-template<> EIGEN_ALWAYS_INLINE Packet16c ploadu_partial<Packet16c>(const signed char* from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE Packet16c ploadu_partial<Packet16c>(const signed char* from, const Index n, const Index offset) {
   return ploadu_partial_common<Packet16c>(from, n, offset);
 }
-template<> EIGEN_ALWAYS_INLINE Packet16uc ploadu_partial<Packet16uc>(const unsigned char* from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE Packet16uc ploadu_partial<Packet16uc>(const unsigned char* from, const Index n,
+                                                          const Index offset) {
   return ploadu_partial_common<Packet16uc>(from, n, offset);
 }
 
-template<typename Packet> EIGEN_STRONG_INLINE Packet ploaddup_common(const __UNPACK_TYPE__(Packet)*   from)
-{
+template <typename Packet>
+EIGEN_STRONG_INLINE Packet ploaddup_common(const __UNPACK_TYPE__(Packet) * from) {
   Packet p;
-  if((std::ptrdiff_t(from) % 16) == 0)  p = pload<Packet>(from);
-  else                                  p = ploadu<Packet>(from);
+  if ((std::ptrdiff_t(from) % 16) == 0)
+    p = pload<Packet>(from);
+  else
+    p = ploadu<Packet>(from);
   return vec_mergeh(p, p);
 }
-template<> EIGEN_STRONG_INLINE Packet4f ploaddup<Packet4f>(const float*   from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f ploaddup<Packet4f>(const float* from) {
   return ploaddup_common<Packet4f>(from);
 }
-template<> EIGEN_STRONG_INLINE Packet4i ploaddup<Packet4i>(const int*     from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4i ploaddup<Packet4i>(const int* from) {
   return ploaddup_common<Packet4i>(from);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8s ploaddup<Packet8s>(const short int*     from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8s ploaddup<Packet8s>(const short int* from) {
   Packet8s p;
-  if((std::ptrdiff_t(from) % 16) == 0)  p = pload<Packet8s>(from);
-  else                                  p = ploadu<Packet8s>(from);
+  if ((std::ptrdiff_t(from) % 16) == 0)
+    p = pload<Packet8s>(from);
+  else
+    p = ploadu<Packet8s>(from);
   return vec_mergeh(p, p);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8us ploaddup<Packet8us>(const unsigned short int*     from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8us ploaddup<Packet8us>(const unsigned short int* from) {
   Packet8us p;
-  if((std::ptrdiff_t(from) % 16) == 0)  p = pload<Packet8us>(from);
-  else                                  p = ploadu<Packet8us>(from);
+  if ((std::ptrdiff_t(from) % 16) == 0)
+    p = pload<Packet8us>(from);
+  else
+    p = ploadu<Packet8us>(from);
   return vec_mergeh(p, p);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8s ploadquad<Packet8s>(const short int*     from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8s ploadquad<Packet8s>(const short int* from) {
   Packet8s p;
-  if((std::ptrdiff_t(from) % 16) == 0)  p = pload<Packet8s>(from);
-  else                                  p = ploadu<Packet8s>(from);
+  if ((std::ptrdiff_t(from) % 16) == 0)
+    p = pload<Packet8s>(from);
+  else
+    p = ploadu<Packet8s>(from);
   return vec_perm(p, p, p16uc_QUADRUPLICATE16_HI);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8us ploadquad<Packet8us>(const unsigned short int*     from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8us ploadquad<Packet8us>(const unsigned short int* from) {
   Packet8us p;
-  if((std::ptrdiff_t(from) % 16) == 0)  p = pload<Packet8us>(from);
-  else                                  p = ploadu<Packet8us>(from);
+  if ((std::ptrdiff_t(from) % 16) == 0)
+    p = pload<Packet8us>(from);
+  else
+    p = ploadu<Packet8us>(from);
   return vec_perm(p, p, p16uc_QUADRUPLICATE16_HI);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf ploadquad<Packet8bf>(const bfloat16*     from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8bf ploadquad<Packet8bf>(const bfloat16* from) {
   return ploadquad<Packet8us>(reinterpret_cast<const unsigned short int*>(from));
 }
 
-template<> EIGEN_STRONG_INLINE Packet16c ploaddup<Packet16c>(const signed char*     from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet16c ploaddup<Packet16c>(const signed char* from) {
   Packet16c p;
-  if((std::ptrdiff_t(from) % 16) == 0)  p = pload<Packet16c>(from);
-  else                                  p = ploadu<Packet16c>(from);
+  if ((std::ptrdiff_t(from) % 16) == 0)
+    p = pload<Packet16c>(from);
+  else
+    p = ploadu<Packet16c>(from);
   return vec_mergeh(p, p);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16uc ploaddup<Packet16uc>(const unsigned char*     from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet16uc ploaddup<Packet16uc>(const unsigned char* from) {
   Packet16uc p;
-  if((std::ptrdiff_t(from) % 16) == 0)  p = pload<Packet16uc>(from);
-  else                                  p = ploadu<Packet16uc>(from);
+  if ((std::ptrdiff_t(from) % 16) == 0)
+    p = pload<Packet16uc>(from);
+  else
+    p = ploadu<Packet16uc>(from);
   return vec_mergeh(p, p);
 }
 
-template<typename Packet> EIGEN_STRONG_INLINE void pstoreu_common(__UNPACK_TYPE__(Packet)*  to, const Packet& from)
-{
+template <typename Packet>
+EIGEN_STRONG_INLINE void pstoreu_common(__UNPACK_TYPE__(Packet) * to, const Packet& from) {
   EIGEN_DEBUG_UNALIGNED_STORE
 #if defined(EIGEN_VECTORIZE_VSX) || !defined(_BIG_ENDIAN)
   vec_xst(from, 0, to);
@@ -1407,48 +1727,49 @@
   Packet16uc MSQ, LSQ, edges;
   Packet16uc edgeAlign, align;
 
-  MSQ = vec_ld(0, (unsigned char *)to);                     // most significant quadword
-  LSQ = vec_ld(15, (unsigned char *)to);                    // least significant quadword
-  edgeAlign = vec_lvsl(0, to);                              // permute map to extract edges
-  edges=vec_perm(LSQ,MSQ,edgeAlign);                        // extract the edges
-  align = vec_lvsr( 0, to );                                // permute map to misalign data
-  MSQ = vec_perm(edges,(Packet16uc)from,align);             // misalign the data (MSQ)
-  LSQ = vec_perm((Packet16uc)from,edges,align);             // misalign the data (LSQ)
-  vec_st( LSQ, 15, (unsigned char *)to );                   // Store the LSQ part first
-  vec_st( MSQ, 0, (unsigned char *)to );                   // Store the MSQ part second
+  MSQ = vec_ld(0, (unsigned char*)to);             // most significant quadword
+  LSQ = vec_ld(15, (unsigned char*)to);            // least significant quadword
+  edgeAlign = vec_lvsl(0, to);                     // permute map to extract edges
+  edges = vec_perm(LSQ, MSQ, edgeAlign);           // extract the edges
+  align = vec_lvsr(0, to);                         // permute map to misalign data
+  MSQ = vec_perm(edges, (Packet16uc)from, align);  // misalign the data (MSQ)
+  LSQ = vec_perm((Packet16uc)from, edges, align);  // misalign the data (LSQ)
+  vec_st(LSQ, 15, (unsigned char*)to);             // Store the LSQ part first
+  vec_st(MSQ, 0, (unsigned char*)to);              // Store the MSQ part second
 #endif
 }
-template<> EIGEN_STRONG_INLINE void pstoreu<float>(float*  to, const Packet4f& from)
-{
+template <>
+EIGEN_STRONG_INLINE void pstoreu<float>(float* to, const Packet4f& from) {
   pstoreu_common<Packet4f>(to, from);
 }
-template<> EIGEN_STRONG_INLINE void pstoreu<int>(int*      to, const Packet4i& from)
-{
+template <>
+EIGEN_STRONG_INLINE void pstoreu<int>(int* to, const Packet4i& from) {
   pstoreu_common<Packet4i>(to, from);
 }
-template<> EIGEN_STRONG_INLINE void pstoreu<short int>(short int*      to, const Packet8s& from)
-{
+template <>
+EIGEN_STRONG_INLINE void pstoreu<short int>(short int* to, const Packet8s& from) {
   pstoreu_common<Packet8s>(to, from);
 }
-template<> EIGEN_STRONG_INLINE void pstoreu<unsigned short int>(unsigned short int*      to, const Packet8us& from)
-{
+template <>
+EIGEN_STRONG_INLINE void pstoreu<unsigned short int>(unsigned short int* to, const Packet8us& from) {
   pstoreu_common<Packet8us>(to, from);
 }
-template<> EIGEN_STRONG_INLINE void pstoreu<bfloat16>(bfloat16*      to, const Packet8bf& from)
-{
+template <>
+EIGEN_STRONG_INLINE void pstoreu<bfloat16>(bfloat16* to, const Packet8bf& from) {
   pstoreu_common<Packet8us>(reinterpret_cast<unsigned short int*>(to), from.m_val);
 }
-template<> EIGEN_STRONG_INLINE void pstoreu<signed char>(signed char*      to, const Packet16c& from)
-{
+template <>
+EIGEN_STRONG_INLINE void pstoreu<signed char>(signed char* to, const Packet16c& from) {
   pstoreu_common<Packet16c>(to, from);
 }
-template<> EIGEN_STRONG_INLINE void pstoreu<unsigned char>(unsigned char*      to, const Packet16uc& from)
-{
+template <>
+EIGEN_STRONG_INLINE void pstoreu<unsigned char>(unsigned char* to, const Packet16uc& from) {
   pstoreu_common<Packet16uc>(to, from);
 }
 
-template<typename Packet> EIGEN_ALWAYS_INLINE void pstoreu_partial_common(__UNPACK_TYPE__(Packet)*  to, const Packet& from, const Index n, const Index offset)
-{
+template <typename Packet>
+EIGEN_ALWAYS_INLINE void pstoreu_partial_common(__UNPACK_TYPE__(Packet) * to, const Packet& from, const Index n,
+                                                const Index offset) {
   const Index packet_size = unpacket_traits<Packet>::size;
   eigen_internal_assert(n + offset <= packet_size && "number of elements plus offset will write past end of packet");
   const Index size = sizeof(__UNPACK_TYPE__(Packet));
@@ -1469,181 +1790,237 @@
   if (n) {
     EIGEN_ALIGN16 __UNPACK_TYPE__(Packet) store[packet_size];
     pstore(store, from);
-    unsigned char* store2 = reinterpret_cast<unsigned char *>(store + offset);
-    unsigned char* to2 = reinterpret_cast<unsigned char *>(to);
+    unsigned char* store2 = reinterpret_cast<unsigned char*>(store + offset);
+    unsigned char* to2 = reinterpret_cast<unsigned char*>(to);
     Index n2 = n * size;
     if (16 <= n2) {
       pstoreu(to2, ploadu<Packet16uc>(store2));
     } else {
-      memcpy((void *)to2, (void *)store2, n2);
+      memcpy((void*)to2, (void*)store2, n2);
     }
   }
 #endif
 }
 
-template<> EIGEN_ALWAYS_INLINE void pstoreu_partial<float>(float*  to, const Packet4f& from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE void pstoreu_partial<float>(float* to, const Packet4f& from, const Index n, const Index offset) {
   pstoreu_partial_common<Packet4f>(to, from, n, offset);
 }
-template<> EIGEN_ALWAYS_INLINE void pstoreu_partial<int>(int*  to, const Packet4i& from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE void pstoreu_partial<int>(int* to, const Packet4i& from, const Index n, const Index offset) {
   pstoreu_partial_common<Packet4i>(to, from, n, offset);
 }
-template<> EIGEN_ALWAYS_INLINE void pstoreu_partial<short int>(short int*  to, const Packet8s& from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE void pstoreu_partial<short int>(short int* to, const Packet8s& from, const Index n,
+                                                    const Index offset) {
   pstoreu_partial_common<Packet8s>(to, from, n, offset);
 }
-template<> EIGEN_ALWAYS_INLINE void pstoreu_partial<unsigned short int>(unsigned short int*  to, const Packet8us& from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE void pstoreu_partial<unsigned short int>(unsigned short int* to, const Packet8us& from,
+                                                             const Index n, const Index offset) {
   pstoreu_partial_common<Packet8us>(to, from, n, offset);
 }
-template<> EIGEN_ALWAYS_INLINE void pstoreu_partial<bfloat16>(bfloat16*      to, const Packet8bf& from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE void pstoreu_partial<bfloat16>(bfloat16* to, const Packet8bf& from, const Index n,
+                                                   const Index offset) {
   pstoreu_partial_common<Packet8us>(reinterpret_cast<unsigned short int*>(to), from, n, offset);
 }
-template<> EIGEN_ALWAYS_INLINE void pstoreu_partial<signed char>(signed char*  to, const Packet16c& from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE void pstoreu_partial<signed char>(signed char* to, const Packet16c& from, const Index n,
+                                                      const Index offset) {
   pstoreu_partial_common<Packet16c>(to, from, n, offset);
 }
-template<> EIGEN_ALWAYS_INLINE void pstoreu_partial<unsigned char>(unsigned char*  to, const Packet16uc& from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE void pstoreu_partial<unsigned char>(unsigned char* to, const Packet16uc& from, const Index n,
+                                                        const Index offset) {
   pstoreu_partial_common<Packet16uc>(to, from, n, offset);
 }
 
-template<> EIGEN_STRONG_INLINE void prefetch<float>(const float* addr)    { EIGEN_PPC_PREFETCH(addr); }
-template<> EIGEN_STRONG_INLINE void prefetch<int>(const int*     addr)    { EIGEN_PPC_PREFETCH(addr); }
+template <>
+EIGEN_STRONG_INLINE void prefetch<float>(const float* addr) {
+  EIGEN_PPC_PREFETCH(addr);
+}
+template <>
+EIGEN_STRONG_INLINE void prefetch<int>(const int* addr) {
+  EIGEN_PPC_PREFETCH(addr);
+}
 
-template<> EIGEN_STRONG_INLINE float  pfirst<Packet4f>(const Packet4f& a) { EIGEN_ALIGN16 float x; vec_ste(a, 0, &x); return x; }
-template<> EIGEN_STRONG_INLINE int    pfirst<Packet4i>(const Packet4i& a) { EIGEN_ALIGN16 int   x; vec_ste(a, 0, &x); return x; }
+template <>
+EIGEN_STRONG_INLINE float pfirst<Packet4f>(const Packet4f& a) {
+  EIGEN_ALIGN16 float x;
+  vec_ste(a, 0, &x);
+  return x;
+}
+template <>
+EIGEN_STRONG_INLINE int pfirst<Packet4i>(const Packet4i& a) {
+  EIGEN_ALIGN16 int x;
+  vec_ste(a, 0, &x);
+  return x;
+}
 
-template<typename Packet> EIGEN_STRONG_INLINE __UNPACK_TYPE__(Packet) pfirst_common(const Packet& a) {
+template <typename Packet>
+EIGEN_STRONG_INLINE __UNPACK_TYPE__(Packet) pfirst_common(const Packet& a) {
   EIGEN_ALIGN16 __UNPACK_TYPE__(Packet) x;
   vec_ste(a, 0, &x);
   return x;
 }
 
-template<> EIGEN_STRONG_INLINE short int pfirst<Packet8s>(const Packet8s& a) {
+template <>
+EIGEN_STRONG_INLINE short int pfirst<Packet8s>(const Packet8s& a) {
   return pfirst_common<Packet8s>(a);
 }
 
-template<> EIGEN_STRONG_INLINE unsigned short int pfirst<Packet8us>(const Packet8us& a) {
+template <>
+EIGEN_STRONG_INLINE unsigned short int pfirst<Packet8us>(const Packet8us& a) {
   return pfirst_common<Packet8us>(a);
 }
 
-template<> EIGEN_STRONG_INLINE signed char pfirst<Packet16c>(const Packet16c& a)
-{
+template <>
+EIGEN_STRONG_INLINE signed char pfirst<Packet16c>(const Packet16c& a) {
   return pfirst_common<Packet16c>(a);
 }
 
-template<> EIGEN_STRONG_INLINE unsigned char pfirst<Packet16uc>(const Packet16uc& a)
-{
+template <>
+EIGEN_STRONG_INLINE unsigned char pfirst<Packet16uc>(const Packet16uc& a) {
   return pfirst_common<Packet16uc>(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f preverse(const Packet4f& a)
-{
-  return reinterpret_cast<Packet4f>(vec_perm(reinterpret_cast<Packet16uc>(a), reinterpret_cast<Packet16uc>(a), p16uc_REVERSE32));
+template <>
+EIGEN_STRONG_INLINE Packet4f preverse(const Packet4f& a) {
+  return reinterpret_cast<Packet4f>(
+      vec_perm(reinterpret_cast<Packet16uc>(a), reinterpret_cast<Packet16uc>(a), p16uc_REVERSE32));
 }
-template<> EIGEN_STRONG_INLINE Packet4i preverse(const Packet4i& a)
-{
-  return reinterpret_cast<Packet4i>(vec_perm(reinterpret_cast<Packet16uc>(a), reinterpret_cast<Packet16uc>(a), p16uc_REVERSE32));
+template <>
+EIGEN_STRONG_INLINE Packet4i preverse(const Packet4i& a) {
+  return reinterpret_cast<Packet4i>(
+      vec_perm(reinterpret_cast<Packet16uc>(a), reinterpret_cast<Packet16uc>(a), p16uc_REVERSE32));
 }
-template<> EIGEN_STRONG_INLINE Packet8s preverse(const Packet8s& a)
-{
-  return reinterpret_cast<Packet8s>(vec_perm(reinterpret_cast<Packet16uc>(a), reinterpret_cast<Packet16uc>(a), p16uc_REVERSE16));
+template <>
+EIGEN_STRONG_INLINE Packet8s preverse(const Packet8s& a) {
+  return reinterpret_cast<Packet8s>(
+      vec_perm(reinterpret_cast<Packet16uc>(a), reinterpret_cast<Packet16uc>(a), p16uc_REVERSE16));
 }
-template<> EIGEN_STRONG_INLINE Packet8us preverse(const Packet8us& a)
-{
-  return reinterpret_cast<Packet8us>(vec_perm(reinterpret_cast<Packet16uc>(a), reinterpret_cast<Packet16uc>(a), p16uc_REVERSE16));
+template <>
+EIGEN_STRONG_INLINE Packet8us preverse(const Packet8us& a) {
+  return reinterpret_cast<Packet8us>(
+      vec_perm(reinterpret_cast<Packet16uc>(a), reinterpret_cast<Packet16uc>(a), p16uc_REVERSE16));
 }
-template<> EIGEN_STRONG_INLINE Packet16c preverse(const Packet16c& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet16c preverse(const Packet16c& a) {
 #ifdef _ARCH_PWR9
   return vec_revb(a);
 #else
   return vec_perm(a, a, p16uc_REVERSE8);
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet16uc preverse(const Packet16uc& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet16uc preverse(const Packet16uc& a) {
 #ifdef _ARCH_PWR9
   return vec_revb(a);
 #else
   return vec_perm(a, a, p16uc_REVERSE8);
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet8bf preverse(const Packet8bf& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8bf preverse(const Packet8bf& a) {
   return preverse<Packet8us>(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pabs(const Packet4f& a) { return vec_abs(a); }
-template<> EIGEN_STRONG_INLINE Packet4i pabs(const Packet4i& a) { return vec_abs(a); }
-template<> EIGEN_STRONG_INLINE Packet8s pabs(const Packet8s& a) { return vec_abs(a); }
-template<> EIGEN_STRONG_INLINE Packet8us pabs(const Packet8us& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet16c pabs(const Packet16c& a) { return vec_abs(a); }
-template<> EIGEN_STRONG_INLINE Packet16uc pabs(const Packet16uc& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet8bf  pabs(const Packet8bf& a) {
-  EIGEN_DECLARE_CONST_FAST_Packet8us(abs_mask,0x7FFF);
+template <>
+EIGEN_STRONG_INLINE Packet4f pabs(const Packet4f& a) {
+  return vec_abs(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pabs(const Packet4i& a) {
+  return vec_abs(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s pabs(const Packet8s& a) {
+  return vec_abs(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us pabs(const Packet8us& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet16c pabs(const Packet16c& a) {
+  return vec_abs(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16uc pabs(const Packet16uc& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet8bf pabs(const Packet8bf& a) {
+  EIGEN_DECLARE_CONST_FAST_Packet8us(abs_mask, 0x7FFF);
   return pand<Packet8us>(p8us_abs_mask, a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf psignbit(const Packet8bf& a) { return vec_sra(a.m_val, vec_splat_u16(15)); }
-template<> EIGEN_STRONG_INLINE Packet4f  psignbit(const Packet4f&  a) { return  (Packet4f)vec_sra((Packet4i)a, vec_splats((unsigned int)(31))); }
+template <>
+EIGEN_STRONG_INLINE Packet8bf psignbit(const Packet8bf& a) {
+  return vec_sra(a.m_val, vec_splat_u16(15));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f psignbit(const Packet4f& a) {
+  return (Packet4f)vec_sra((Packet4i)a, vec_splats((unsigned int)(31)));
+}
 
-template<int N> EIGEN_STRONG_INLINE Packet4i parithmetic_shift_right(const Packet4i& a)
-{ return vec_sra(a,reinterpret_cast<Packet4ui>(pset1<Packet4i>(N))); }
-template<int N> EIGEN_STRONG_INLINE Packet4i plogical_shift_right(const Packet4i& a)
-{ return vec_sr(a,reinterpret_cast<Packet4ui>(pset1<Packet4i>(N))); }
-template<int N> EIGEN_STRONG_INLINE Packet4i plogical_shift_left(const Packet4i& a)
-{ return vec_sl(a,reinterpret_cast<Packet4ui>(pset1<Packet4i>(N))); }
-template<int N> EIGEN_STRONG_INLINE Packet4f plogical_shift_left(const Packet4f& a)
-{
+template <int N>
+EIGEN_STRONG_INLINE Packet4i parithmetic_shift_right(const Packet4i& a) {
+  return vec_sra(a, reinterpret_cast<Packet4ui>(pset1<Packet4i>(N)));
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet4i plogical_shift_right(const Packet4i& a) {
+  return vec_sr(a, reinterpret_cast<Packet4ui>(pset1<Packet4i>(N)));
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet4i plogical_shift_left(const Packet4i& a) {
+  return vec_sl(a, reinterpret_cast<Packet4ui>(pset1<Packet4i>(N)));
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet4f plogical_shift_left(const Packet4f& a) {
   const EIGEN_DECLARE_CONST_FAST_Packet4ui(mask, N);
   Packet4ui r = vec_sl(reinterpret_cast<Packet4ui>(a), p4ui_mask);
   return reinterpret_cast<Packet4f>(r);
 }
 
-template<int N> EIGEN_STRONG_INLINE Packet4f plogical_shift_right(const Packet4f& a)
-{
+template <int N>
+EIGEN_STRONG_INLINE Packet4f plogical_shift_right(const Packet4f& a) {
   const EIGEN_DECLARE_CONST_FAST_Packet4ui(mask, N);
   Packet4ui r = vec_sr(reinterpret_cast<Packet4ui>(a), p4ui_mask);
   return reinterpret_cast<Packet4f>(r);
 }
 
-template<int N> EIGEN_STRONG_INLINE Packet4ui plogical_shift_right(const Packet4ui& a)
-{
+template <int N>
+EIGEN_STRONG_INLINE Packet4ui plogical_shift_right(const Packet4ui& a) {
   const EIGEN_DECLARE_CONST_FAST_Packet4ui(mask, N);
   return vec_sr(a, p4ui_mask);
 }
 
-template<int N> EIGEN_STRONG_INLINE Packet4ui plogical_shift_left(const Packet4ui& a)
-{
+template <int N>
+EIGEN_STRONG_INLINE Packet4ui plogical_shift_left(const Packet4ui& a) {
   const EIGEN_DECLARE_CONST_FAST_Packet4ui(mask, N);
   return vec_sl(a, p4ui_mask);
 }
 
-template<int N> EIGEN_STRONG_INLINE Packet8us plogical_shift_left(const Packet8us& a)
-{
+template <int N>
+EIGEN_STRONG_INLINE Packet8us plogical_shift_left(const Packet8us& a) {
   const EIGEN_DECLARE_CONST_FAST_Packet8us(mask, N);
   return vec_sl(a, p8us_mask);
 }
-template<int N> EIGEN_STRONG_INLINE Packet8us plogical_shift_right(const Packet8us& a)
-{
+template <int N>
+EIGEN_STRONG_INLINE Packet8us plogical_shift_right(const Packet8us& a) {
   const EIGEN_DECLARE_CONST_FAST_Packet8us(mask, N);
   return vec_sr(a, p8us_mask);
 }
 
-EIGEN_STRONG_INLINE Packet4f Bf16ToF32Even(const Packet8bf& bf){
+EIGEN_STRONG_INLINE Packet4f Bf16ToF32Even(const Packet8bf& bf) {
   return plogical_shift_left<16>(reinterpret_cast<Packet4f>(bf.m_val));
 }
 
-EIGEN_STRONG_INLINE Packet4f Bf16ToF32Odd(const Packet8bf& bf){
+EIGEN_STRONG_INLINE Packet4f Bf16ToF32Odd(const Packet8bf& bf) {
   const EIGEN_DECLARE_CONST_FAST_Packet4ui(high_mask, 0xFFFF0000);
-  return pand<Packet4f>(
-    reinterpret_cast<Packet4f>(bf.m_val),
-    reinterpret_cast<Packet4f>(p4ui_high_mask)
-  );
+  return pand<Packet4f>(reinterpret_cast<Packet4f>(bf.m_val), reinterpret_cast<Packet4f>(p4ui_high_mask));
 }
 
 EIGEN_ALWAYS_INLINE Packet8us pmerge(Packet4ui even, Packet4ui odd) {
@@ -1660,20 +2037,20 @@
   return pmerge(reinterpret_cast<Packet4ui>(even), reinterpret_cast<Packet4ui>(odd));
 }
 
-//#define SUPPORT_BF16_SUBNORMALS
+// #define SUPPORT_BF16_SUBNORMALS
 
 #ifndef __VEC_CLASS_FP_NAN
-#define __VEC_CLASS_FP_NAN (1<<6)
+#define __VEC_CLASS_FP_NAN (1 << 6)
 #endif
 
 #if defined(SUPPORT_BF16_SUBNORMALS) && !defined(__VEC_CLASS_FP_SUBNORMAL)
-#define __VEC_CLASS_FP_SUBNORMAL_P (1<<1)
-#define __VEC_CLASS_FP_SUBNORMAL_N (1<<0)
+#define __VEC_CLASS_FP_SUBNORMAL_P (1 << 1)
+#define __VEC_CLASS_FP_SUBNORMAL_N (1 << 0)
 
 #define __VEC_CLASS_FP_SUBNORMAL (__VEC_CLASS_FP_SUBNORMAL_P | __VEC_CLASS_FP_SUBNORMAL_N)
 #endif
 
-EIGEN_STRONG_INLINE Packet8bf F32ToBf16(Packet4f p4f){
+EIGEN_STRONG_INLINE Packet8bf F32ToBf16(Packet4f p4f) {
 #ifdef _ARCH_PWR10
   return reinterpret_cast<Packet8us>(__builtin_vsx_xvcvspbf16(reinterpret_cast<Packet16uc>(p4f)));
 #else
@@ -1681,7 +2058,7 @@
   Packet4ui lsb = plogical_shift_right<16>(input);
   lsb = pand<Packet4ui>(lsb, reinterpret_cast<Packet4ui>(p4i_ONE));
 
-  EIGEN_DECLARE_CONST_FAST_Packet4ui(BIAS,0x7FFFu);
+  EIGEN_DECLARE_CONST_FAST_Packet4ui(BIAS, 0x7FFFu);
   Packet4ui rounding_bias = padd<Packet4ui>(lsb, p4ui_BIAS);
   input = padd<Packet4ui>(input, rounding_bias);
 
@@ -1696,7 +2073,7 @@
 #endif
 #else
 #ifdef SUPPORT_BF16_SUBNORMALS
-  //Test NaN and Subnormal
+  // Test NaN and Subnormal
   const EIGEN_DECLARE_CONST_FAST_Packet4ui(exp_mask, 0x7F800000);
   Packet4ui exp = pand<Packet4ui>(p4ui_exp_mask, reinterpret_cast<Packet4ui>(p4f));
 
@@ -1706,22 +2083,18 @@
   Packet4bi is_max_exp = vec_cmpeq(exp, p4ui_exp_mask);
   Packet4bi is_mant_zero = vec_cmpeq(mantissa, reinterpret_cast<Packet4ui>(p4i_ZERO));
 
-  Packet4ui nan_selector = pandnot<Packet4ui>(
-      reinterpret_cast<Packet4ui>(is_max_exp),
-      reinterpret_cast<Packet4ui>(is_mant_zero)
-  );
+  Packet4ui nan_selector =
+      pandnot<Packet4ui>(reinterpret_cast<Packet4ui>(is_max_exp), reinterpret_cast<Packet4ui>(is_mant_zero));
 
   Packet4bi is_zero_exp = vec_cmpeq(exp, reinterpret_cast<Packet4ui>(p4i_ZERO));
 
-  Packet4ui subnormal_selector = pandnot<Packet4ui>(
-      reinterpret_cast<Packet4ui>(is_zero_exp),
-      reinterpret_cast<Packet4ui>(is_mant_zero)
-  );
+  Packet4ui subnormal_selector =
+      pandnot<Packet4ui>(reinterpret_cast<Packet4ui>(is_zero_exp), reinterpret_cast<Packet4ui>(is_mant_zero));
 
   input = vec_sel(input, p4ui_nan, nan_selector);
   input = vec_sel(input, reinterpret_cast<Packet4ui>(p4f), subnormal_selector);
 #else
-  //Test only NaN
+  // Test only NaN
   Packet4bi nan_selector = vec_cmpeq(p4f, p4f);
 
   input = vec_sel(p4ui_nan, input, nan_selector);
@@ -1739,9 +2112,8 @@
  *
  * @param lohi to expect either a low & high OR odd & even order
  */
-template<bool lohi>
-EIGEN_ALWAYS_INLINE Packet8bf Bf16PackHigh(Packet4f lo, Packet4f hi)
-{
+template <bool lohi>
+EIGEN_ALWAYS_INLINE Packet8bf Bf16PackHigh(Packet4f lo, Packet4f hi) {
   if (lohi) {
     return vec_perm(reinterpret_cast<Packet8us>(lo), reinterpret_cast<Packet8us>(hi), p16uc_MERGEH16);
   } else {
@@ -1754,9 +2126,8 @@
  *
  * @param lohi to expect either a low & high OR odd & even order
  */
-template<bool lohi>
-EIGEN_ALWAYS_INLINE Packet8bf Bf16PackLow(Packet4f lo, Packet4f hi)
-{
+template <bool lohi>
+EIGEN_ALWAYS_INLINE Packet8bf Bf16PackLow(Packet4f lo, Packet4f hi) {
   if (lohi) {
     return vec_pack(reinterpret_cast<Packet4ui>(lo), reinterpret_cast<Packet4ui>(hi));
   } else {
@@ -1764,9 +2135,8 @@
   }
 }
 #else
-template<bool lohi>
-EIGEN_ALWAYS_INLINE Packet8bf Bf16PackLow(Packet4f hi, Packet4f lo)
-{
+template <bool lohi>
+EIGEN_ALWAYS_INLINE Packet8bf Bf16PackLow(Packet4f hi, Packet4f lo) {
   if (lohi) {
     return vec_pack(reinterpret_cast<Packet4ui>(hi), reinterpret_cast<Packet4ui>(lo));
   } else {
@@ -1774,9 +2144,8 @@
   }
 }
 
-template<bool lohi>
-EIGEN_ALWAYS_INLINE Packet8bf Bf16PackHigh(Packet4f hi, Packet4f lo)
-{
+template <bool lohi>
+EIGEN_ALWAYS_INLINE Packet8bf Bf16PackHigh(Packet4f hi, Packet4f lo) {
   if (lohi) {
     return vec_perm(reinterpret_cast<Packet8us>(hi), reinterpret_cast<Packet8us>(lo), p16uc_MERGEL16);
   } else {
@@ -1790,14 +2159,13 @@
  *
  * @param lohi to expect either a low & high OR odd & even order
  */
-template<bool lohi = true>
-EIGEN_ALWAYS_INLINE Packet8bf F32ToBf16Two(Packet4f lo, Packet4f hi)
-{
+template <bool lohi = true>
+EIGEN_ALWAYS_INLINE Packet8bf F32ToBf16Two(Packet4f lo, Packet4f hi) {
   Packet8us p4f = Bf16PackHigh<lohi>(lo, hi);
   Packet8us p4f2 = Bf16PackLow<lohi>(lo, hi);
 
   Packet8us lsb = pand<Packet8us>(p4f, p8us_ONE);
-  EIGEN_DECLARE_CONST_FAST_Packet8us(BIAS,0x7FFFu);
+  EIGEN_DECLARE_CONST_FAST_Packet8us(BIAS, 0x7FFFu);
   lsb = padd<Packet8us>(lsb, p8us_BIAS);
   lsb = padd<Packet8us>(lsb, p4f2);
 
@@ -1807,20 +2175,22 @@
 #ifdef _ARCH_PWR9
   Packet4bi nan_selector_lo = vec_test_data_class(lo, __VEC_CLASS_FP_NAN);
   Packet4bi nan_selector_hi = vec_test_data_class(hi, __VEC_CLASS_FP_NAN);
-  Packet8us nan_selector = Bf16PackLow<lohi>(reinterpret_cast<Packet4f>(nan_selector_lo), reinterpret_cast<Packet4f>(nan_selector_hi));
+  Packet8us nan_selector =
+      Bf16PackLow<lohi>(reinterpret_cast<Packet4f>(nan_selector_lo), reinterpret_cast<Packet4f>(nan_selector_hi));
 
   input = vec_sel(input, p8us_BIAS, nan_selector);
 
 #ifdef SUPPORT_BF16_SUBNORMALS
   Packet4bi subnormal_selector_lo = vec_test_data_class(lo, __VEC_CLASS_FP_SUBNORMAL);
   Packet4bi subnormal_selector_hi = vec_test_data_class(hi, __VEC_CLASS_FP_SUBNORMAL);
-  Packet8us subnormal_selector = Bf16PackLow<lohi>(reinterpret_cast<Packet4f>(subnormal_selector_lo), reinterpret_cast<Packet4f>(subnormal_selector_hi));
+  Packet8us subnormal_selector = Bf16PackLow<lohi>(reinterpret_cast<Packet4f>(subnormal_selector_lo),
+                                                   reinterpret_cast<Packet4f>(subnormal_selector_hi));
 
   input = vec_sel(input, reinterpret_cast<Packet8us>(p4f), subnormal_selector);
 #endif
 #else
 #ifdef SUPPORT_BF16_SUBNORMALS
-  //Test NaN and Subnormal
+  // Test NaN and Subnormal
   const EIGEN_DECLARE_CONST_FAST_Packet8us(exp_mask, 0x7F80);
   Packet8us exp = pand<Packet8us>(p8us_exp_mask, p4f);
 
@@ -1830,26 +2200,23 @@
   Packet8bi is_max_exp = vec_cmpeq(exp, p8us_exp_mask);
   Packet8bi is_mant_zero = vec_cmpeq(mantissa, reinterpret_cast<Packet8us>(p4i_ZERO));
 
-  Packet8us nan_selector = pandnot<Packet8us>(
-      reinterpret_cast<Packet8us>(is_max_exp),
-      reinterpret_cast<Packet8us>(is_mant_zero)
-  );
+  Packet8us nan_selector =
+      pandnot<Packet8us>(reinterpret_cast<Packet8us>(is_max_exp), reinterpret_cast<Packet8us>(is_mant_zero));
 
   Packet8bi is_zero_exp = vec_cmpeq(exp, reinterpret_cast<Packet8us>(p4i_ZERO));
 
-  Packet8us subnormal_selector = pandnot<Packet8us>(
-      reinterpret_cast<Packet8us>(is_zero_exp),
-      reinterpret_cast<Packet8us>(is_mant_zero)
-  );
+  Packet8us subnormal_selector =
+      pandnot<Packet8us>(reinterpret_cast<Packet8us>(is_zero_exp), reinterpret_cast<Packet8us>(is_mant_zero));
 
   // Using BIAS as NaN (since any or all of the last 7 bits can be set)
   input = vec_sel(input, p8us_BIAS, nan_selector);
   input = vec_sel(input, reinterpret_cast<Packet8us>(p4f), subnormal_selector);
 #else
-  //Test only NaN
+  // Test only NaN
   Packet4bi nan_selector_lo = vec_cmpeq(lo, lo);
   Packet4bi nan_selector_hi = vec_cmpeq(hi, hi);
-  Packet8us nan_selector = Bf16PackLow<lohi>(reinterpret_cast<Packet4f>(nan_selector_lo), reinterpret_cast<Packet4f>(nan_selector_hi));
+  Packet8us nan_selector =
+      Bf16PackLow<lohi>(reinterpret_cast<Packet4f>(nan_selector_lo), reinterpret_cast<Packet4f>(nan_selector_hi));
 
   input = vec_sel(p8us_BIAS, input, nan_selector);
 #endif
@@ -1861,8 +2228,7 @@
 /**
  * Convert and pack two float Packets into one bfloat16 Packet - low & high order
  */
-EIGEN_STRONG_INLINE Packet8bf F32ToBf16Both(Packet4f lo, Packet4f hi)
-{
+EIGEN_STRONG_INLINE Packet8bf F32ToBf16Both(Packet4f lo, Packet4f hi) {
 #ifdef _ARCH_PWR10
   Packet8bf fp16_0 = F32ToBf16(lo);
   Packet8bf fp16_1 = F32ToBf16(hi);
@@ -1875,7 +2241,7 @@
 /**
  * Convert and pack two float Packets into one bfloat16 Packet - odd & even order
  */
-EIGEN_STRONG_INLINE Packet8bf F32ToBf16(Packet4f even, Packet4f odd){
+EIGEN_STRONG_INLINE Packet8bf F32ToBf16(Packet4f even, Packet4f odd) {
 #ifdef _ARCH_PWR10
   return pmerge(reinterpret_cast<Packet4ui>(F32ToBf16(even).m_val), reinterpret_cast<Packet4ui>(F32ToBf16(odd).m_val));
 #else
@@ -1883,66 +2249,76 @@
 #endif
 }
 #define BF16_TO_F32_UNARY_OP_WRAPPER(OP, A) \
-  Packet4f a_even = Bf16ToF32Even(A);\
-  Packet4f a_odd = Bf16ToF32Odd(A);\
-  Packet4f op_even = OP(a_even);\
-  Packet4f op_odd = OP(a_odd);\
-  return F32ToBf16(op_even, op_odd);\
+  Packet4f a_even = Bf16ToF32Even(A);       \
+  Packet4f a_odd = Bf16ToF32Odd(A);         \
+  Packet4f op_even = OP(a_even);            \
+  Packet4f op_odd = OP(a_odd);              \
+  return F32ToBf16(op_even, op_odd);
 
 #define BF16_TO_F32_BINARY_OP_WRAPPER(OP, A, B) \
-  Packet4f a_even = Bf16ToF32Even(A);\
-  Packet4f a_odd = Bf16ToF32Odd(A);\
-  Packet4f b_even = Bf16ToF32Even(B);\
-  Packet4f b_odd = Bf16ToF32Odd(B);\
-  Packet4f op_even = OP(a_even, b_even);\
-  Packet4f op_odd = OP(a_odd, b_odd);\
-  return F32ToBf16(op_even, op_odd);\
+  Packet4f a_even = Bf16ToF32Even(A);           \
+  Packet4f a_odd = Bf16ToF32Odd(A);             \
+  Packet4f b_even = Bf16ToF32Even(B);           \
+  Packet4f b_odd = Bf16ToF32Odd(B);             \
+  Packet4f op_even = OP(a_even, b_even);        \
+  Packet4f op_odd = OP(a_odd, b_odd);           \
+  return F32ToBf16(op_even, op_odd);
 
 #define BF16_TO_F32_BINARY_OP_WRAPPER_BOOL(OP, A, B) \
-  Packet4f a_even = Bf16ToF32Even(A);\
-  Packet4f a_odd = Bf16ToF32Odd(A);\
-  Packet4f b_even = Bf16ToF32Even(B);\
-  Packet4f b_odd = Bf16ToF32Odd(B);\
-  Packet4f op_even = OP(a_even, b_even);\
-  Packet4f op_odd = OP(a_odd, b_odd);\
-  return F32ToBf16Bool(op_even, op_odd);\
+  Packet4f a_even = Bf16ToF32Even(A);                \
+  Packet4f a_odd = Bf16ToF32Odd(A);                  \
+  Packet4f b_even = Bf16ToF32Even(B);                \
+  Packet4f b_odd = Bf16ToF32Odd(B);                  \
+  Packet4f op_even = OP(a_even, b_even);             \
+  Packet4f op_odd = OP(a_odd, b_odd);                \
+  return F32ToBf16Bool(op_even, op_odd);
 
-template<> EIGEN_STRONG_INLINE Packet8bf padd<Packet8bf>(const Packet8bf& a, const Packet8bf& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf padd<Packet8bf>(const Packet8bf& a, const Packet8bf& b) {
   BF16_TO_F32_BINARY_OP_WRAPPER(padd<Packet4f>, a, b);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf pmul<Packet8bf>(const Packet8bf& a, const Packet8bf& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf pmul<Packet8bf>(const Packet8bf& a, const Packet8bf& b) {
   BF16_TO_F32_BINARY_OP_WRAPPER(pmul<Packet4f>, a, b);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf pdiv<Packet8bf>(const Packet8bf& a, const Packet8bf& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf pdiv<Packet8bf>(const Packet8bf& a, const Packet8bf& b) {
   BF16_TO_F32_BINARY_OP_WRAPPER(pdiv<Packet4f>, a, b);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf pnegate<Packet8bf>(const Packet8bf& a) {
-  EIGEN_DECLARE_CONST_FAST_Packet8us(neg_mask,0x8000);
+template <>
+EIGEN_STRONG_INLINE Packet8bf pnegate<Packet8bf>(const Packet8bf& a) {
+  EIGEN_DECLARE_CONST_FAST_Packet8us(neg_mask, 0x8000);
   return pxor<Packet8us>(p8us_neg_mask, a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf psub<Packet8bf>(const Packet8bf& a, const Packet8bf& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf psub<Packet8bf>(const Packet8bf& a, const Packet8bf& b) {
   BF16_TO_F32_BINARY_OP_WRAPPER(psub<Packet4f>, a, b);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf pexp<Packet8bf> (const Packet8bf& a){
+template <>
+EIGEN_STRONG_INLINE Packet8bf pexp<Packet8bf>(const Packet8bf& a) {
   BF16_TO_F32_UNARY_OP_WRAPPER(pexp_float, a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pldexp<Packet4f>(const Packet4f& a, const Packet4f& exponent) {
-  return pldexp_generic(a,exponent);
+template <>
+EIGEN_STRONG_INLINE Packet4f pldexp<Packet4f>(const Packet4f& a, const Packet4f& exponent) {
+  return pldexp_generic(a, exponent);
 }
-template<> EIGEN_STRONG_INLINE Packet8bf pldexp<Packet8bf> (const Packet8bf& a, const Packet8bf& exponent){
+template <>
+EIGEN_STRONG_INLINE Packet8bf pldexp<Packet8bf>(const Packet8bf& a, const Packet8bf& exponent) {
   BF16_TO_F32_BINARY_OP_WRAPPER(pldexp<Packet4f>, a, exponent);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pfrexp<Packet4f>(const Packet4f& a, Packet4f& exponent) {
-  return pfrexp_generic(a,exponent);
+template <>
+EIGEN_STRONG_INLINE Packet4f pfrexp<Packet4f>(const Packet4f& a, Packet4f& exponent) {
+  return pfrexp_generic(a, exponent);
 }
-template<> EIGEN_STRONG_INLINE Packet8bf pfrexp<Packet8bf> (const Packet8bf& a, Packet8bf& e){
+template <>
+EIGEN_STRONG_INLINE Packet8bf pfrexp<Packet8bf>(const Packet8bf& a, Packet8bf& e) {
   Packet4f a_even = Bf16ToF32Even(a);
   Packet4f a_odd = Bf16ToF32Odd(a);
   Packet4f e_even;
@@ -1953,30 +2329,38 @@
   return F32ToBf16(op_even, op_odd);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf psin<Packet8bf> (const Packet8bf& a){
+template <>
+EIGEN_STRONG_INLINE Packet8bf psin<Packet8bf>(const Packet8bf& a) {
   BF16_TO_F32_UNARY_OP_WRAPPER(psin_float, a);
 }
-template<> EIGEN_STRONG_INLINE Packet8bf pcos<Packet8bf> (const Packet8bf& a){
+template <>
+EIGEN_STRONG_INLINE Packet8bf pcos<Packet8bf>(const Packet8bf& a) {
   BF16_TO_F32_UNARY_OP_WRAPPER(pcos_float, a);
 }
-template<> EIGEN_STRONG_INLINE Packet8bf plog<Packet8bf> (const Packet8bf& a){
+template <>
+EIGEN_STRONG_INLINE Packet8bf plog<Packet8bf>(const Packet8bf& a) {
   BF16_TO_F32_UNARY_OP_WRAPPER(plog_float, a);
 }
-template<> EIGEN_STRONG_INLINE Packet8bf pfloor<Packet8bf> (const Packet8bf& a){
+template <>
+EIGEN_STRONG_INLINE Packet8bf pfloor<Packet8bf>(const Packet8bf& a) {
   BF16_TO_F32_UNARY_OP_WRAPPER(pfloor<Packet4f>, a);
 }
-template<> EIGEN_STRONG_INLINE Packet8bf pceil<Packet8bf> (const Packet8bf& a){
+template <>
+EIGEN_STRONG_INLINE Packet8bf pceil<Packet8bf>(const Packet8bf& a) {
   BF16_TO_F32_UNARY_OP_WRAPPER(pceil<Packet4f>, a);
 }
-template<> EIGEN_STRONG_INLINE Packet8bf pround<Packet8bf> (const Packet8bf& a){
+template <>
+EIGEN_STRONG_INLINE Packet8bf pround<Packet8bf>(const Packet8bf& a) {
   BF16_TO_F32_UNARY_OP_WRAPPER(pround<Packet4f>, a);
 }
 #ifdef EIGEN_VECTORIZE_VSX
-template<> EIGEN_STRONG_INLINE Packet8bf print<Packet8bf> (const Packet8bf& a){
+template <>
+EIGEN_STRONG_INLINE Packet8bf print<Packet8bf>(const Packet8bf& a) {
   BF16_TO_F32_UNARY_OP_WRAPPER(print<Packet4f>, a);
 }
 #endif
-template<> EIGEN_STRONG_INLINE Packet8bf pmadd(const Packet8bf& a, const Packet8bf& b, const Packet8bf& c) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf pmadd(const Packet8bf& a, const Packet8bf& b, const Packet8bf& c) {
   Packet4f a_even = Bf16ToF32Even(a);
   Packet4f a_odd = Bf16ToF32Odd(a);
   Packet4f b_even = Bf16ToF32Even(b);
@@ -1988,54 +2372,62 @@
   return F32ToBf16(pmadd_even, pmadd_odd);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf pmin<Packet8bf>(const Packet8bf& a, const Packet8bf& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf pmin<Packet8bf>(const Packet8bf& a, const Packet8bf& b) {
   BF16_TO_F32_BINARY_OP_WRAPPER(pmin<Packet4f>, a, b);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf pmax<Packet8bf>(const Packet8bf& a, const Packet8bf& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf pmax<Packet8bf>(const Packet8bf& a, const Packet8bf& b) {
   BF16_TO_F32_BINARY_OP_WRAPPER(pmax<Packet4f>, a, b);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf pcmp_lt(const Packet8bf& a, const Packet8bf& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf pcmp_lt(const Packet8bf& a, const Packet8bf& b) {
   BF16_TO_F32_BINARY_OP_WRAPPER_BOOL(pcmp_lt<Packet4f>, a, b);
 }
-template<> EIGEN_STRONG_INLINE Packet8bf pcmp_lt_or_nan(const Packet8bf& a, const Packet8bf& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf pcmp_lt_or_nan(const Packet8bf& a, const Packet8bf& b) {
   BF16_TO_F32_BINARY_OP_WRAPPER_BOOL(pcmp_lt_or_nan<Packet4f>, a, b);
 }
-template<> EIGEN_STRONG_INLINE Packet8bf pcmp_le(const Packet8bf& a, const Packet8bf& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf pcmp_le(const Packet8bf& a, const Packet8bf& b) {
   BF16_TO_F32_BINARY_OP_WRAPPER_BOOL(pcmp_le<Packet4f>, a, b);
 }
-template<> EIGEN_STRONG_INLINE Packet8bf pcmp_eq(const Packet8bf& a, const Packet8bf& b) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf pcmp_eq(const Packet8bf& a, const Packet8bf& b) {
   BF16_TO_F32_BINARY_OP_WRAPPER_BOOL(pcmp_eq<Packet4f>, a, b);
 }
 
-template<> EIGEN_STRONG_INLINE bfloat16 pfirst(const Packet8bf& a) {
+template <>
+EIGEN_STRONG_INLINE bfloat16 pfirst(const Packet8bf& a) {
   return Eigen::bfloat16_impl::raw_uint16_to_bfloat16((pfirst<Packet8us>(a)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf ploaddup<Packet8bf>(const  bfloat16*     from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8bf ploaddup<Packet8bf>(const bfloat16* from) {
   return ploaddup<Packet8us>(reinterpret_cast<const unsigned short int*>(from));
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf plset<Packet8bf>(const bfloat16& a) {
-  bfloat16 countdown[8] = { bfloat16(0), bfloat16(1), bfloat16(2), bfloat16(3),
-                            bfloat16(4), bfloat16(5), bfloat16(6), bfloat16(7) };
+template <>
+EIGEN_STRONG_INLINE Packet8bf plset<Packet8bf>(const bfloat16& a) {
+  bfloat16 countdown[8] = {bfloat16(0), bfloat16(1), bfloat16(2), bfloat16(3),
+                           bfloat16(4), bfloat16(5), bfloat16(6), bfloat16(7)};
   return padd<Packet8bf>(pset1<Packet8bf>(a), pload<Packet8bf>(countdown));
 }
 
-template<> EIGEN_STRONG_INLINE float predux<Packet4f>(const Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE float predux<Packet4f>(const Packet4f& a) {
   Packet4f b, sum;
-  b   = vec_sld(a, a, 8);
+  b = vec_sld(a, a, 8);
   sum = a + b;
-  b   = vec_sld(sum, sum, 4);
+  b = vec_sld(sum, sum, 4);
   sum += b;
   return pfirst(sum);
 }
 
-template<> EIGEN_STRONG_INLINE int predux<Packet4i>(const Packet4i& a)
-{
+template <>
+EIGEN_STRONG_INLINE int predux<Packet4i>(const Packet4i& a) {
   Packet4i sum;
   sum = vec_sums(a, p4i_ZERO);
 #ifdef _BIG_ENDIAN
@@ -2046,89 +2438,89 @@
   return pfirst(sum);
 }
 
-template<> EIGEN_STRONG_INLINE bfloat16 predux<Packet8bf>(const Packet8bf& a)
-{
+template <>
+EIGEN_STRONG_INLINE bfloat16 predux<Packet8bf>(const Packet8bf& a) {
   float redux_even = predux<Packet4f>(Bf16ToF32Even(a));
-  float redux_odd  = predux<Packet4f>(Bf16ToF32Odd(a));
+  float redux_odd = predux<Packet4f>(Bf16ToF32Odd(a));
   float f32_result = redux_even + redux_odd;
   return bfloat16(f32_result);
 }
-template<typename Packet> EIGEN_STRONG_INLINE __UNPACK_TYPE__(Packet) predux_size8(const Packet& a)
-{
-  union{
+template <typename Packet>
+EIGEN_STRONG_INLINE __UNPACK_TYPE__(Packet) predux_size8(const Packet& a) {
+  union {
     Packet v;
     __UNPACK_TYPE__(Packet) n[8];
   } vt;
   vt.v = a;
 
-  EIGEN_ALIGN16 int first_loader[4] = { vt.n[0], vt.n[1], vt.n[2], vt.n[3] };
-  EIGEN_ALIGN16 int second_loader[4] = { vt.n[4], vt.n[5], vt.n[6], vt.n[7] };
-  Packet4i first_half  = pload<Packet4i>(first_loader);
+  EIGEN_ALIGN16 int first_loader[4] = {vt.n[0], vt.n[1], vt.n[2], vt.n[3]};
+  EIGEN_ALIGN16 int second_loader[4] = {vt.n[4], vt.n[5], vt.n[6], vt.n[7]};
+  Packet4i first_half = pload<Packet4i>(first_loader);
   Packet4i second_half = pload<Packet4i>(second_loader);
 
   return static_cast<__UNPACK_TYPE__(Packet)>(predux(first_half) + predux(second_half));
 }
 
-template<> EIGEN_STRONG_INLINE short int predux<Packet8s>(const Packet8s& a)
-{
+template <>
+EIGEN_STRONG_INLINE short int predux<Packet8s>(const Packet8s& a) {
   return predux_size8<Packet8s>(a);
 }
 
-template<> EIGEN_STRONG_INLINE unsigned short int predux<Packet8us>(const Packet8us& a)
-{
+template <>
+EIGEN_STRONG_INLINE unsigned short int predux<Packet8us>(const Packet8us& a) {
   return predux_size8<Packet8us>(a);
 }
 
-template<typename Packet> EIGEN_STRONG_INLINE __UNPACK_TYPE__(Packet) predux_size16(const Packet& a)
-{
-  union{
+template <typename Packet>
+EIGEN_STRONG_INLINE __UNPACK_TYPE__(Packet) predux_size16(const Packet& a) {
+  union {
     Packet v;
     __UNPACK_TYPE__(Packet) n[16];
   } vt;
   vt.v = a;
 
-  EIGEN_ALIGN16 int first_loader[4] = { vt.n[0], vt.n[1], vt.n[2], vt.n[3] };
-  EIGEN_ALIGN16 int second_loader[4] = { vt.n[4], vt.n[5], vt.n[6], vt.n[7] };
-  EIGEN_ALIGN16 int third_loader[4] = { vt.n[8], vt.n[9], vt.n[10], vt.n[11] };
-  EIGEN_ALIGN16 int fourth_loader[4] = { vt.n[12], vt.n[13], vt.n[14], vt.n[15] };
+  EIGEN_ALIGN16 int first_loader[4] = {vt.n[0], vt.n[1], vt.n[2], vt.n[3]};
+  EIGEN_ALIGN16 int second_loader[4] = {vt.n[4], vt.n[5], vt.n[6], vt.n[7]};
+  EIGEN_ALIGN16 int third_loader[4] = {vt.n[8], vt.n[9], vt.n[10], vt.n[11]};
+  EIGEN_ALIGN16 int fourth_loader[4] = {vt.n[12], vt.n[13], vt.n[14], vt.n[15]};
 
   Packet4i first_quarter = pload<Packet4i>(first_loader);
   Packet4i second_quarter = pload<Packet4i>(second_loader);
   Packet4i third_quarter = pload<Packet4i>(third_loader);
   Packet4i fourth_quarter = pload<Packet4i>(fourth_loader);
 
-  return static_cast<__UNPACK_TYPE__(Packet)>(predux(first_quarter) + predux(second_quarter)
-		                  + predux(third_quarter) + predux(fourth_quarter));
+  return static_cast<__UNPACK_TYPE__(Packet)>(predux(first_quarter) + predux(second_quarter) + predux(third_quarter) +
+                                              predux(fourth_quarter));
 }
 
-template<> EIGEN_STRONG_INLINE signed char predux<Packet16c>(const Packet16c& a)
-{
+template <>
+EIGEN_STRONG_INLINE signed char predux<Packet16c>(const Packet16c& a) {
   return predux_size16<Packet16c>(a);
 }
 
-template<> EIGEN_STRONG_INLINE unsigned char predux<Packet16uc>(const Packet16uc& a)
-{
+template <>
+EIGEN_STRONG_INLINE unsigned char predux<Packet16uc>(const Packet16uc& a) {
   return predux_size16<Packet16uc>(a);
 }
 
 // Other reduction functions:
 // mul
-template<> EIGEN_STRONG_INLINE float predux_mul<Packet4f>(const Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE float predux_mul<Packet4f>(const Packet4f& a) {
   Packet4f prod;
   prod = pmul(a, vec_sld(a, a, 8));
   return pfirst(pmul(prod, vec_sld(prod, prod, 4)));
 }
 
-template<> EIGEN_STRONG_INLINE int predux_mul<Packet4i>(const Packet4i& a)
-{
+template <>
+EIGEN_STRONG_INLINE int predux_mul<Packet4i>(const Packet4i& a) {
   EIGEN_ALIGN16 int aux[4];
   pstore(aux, a);
   return aux[0] * aux[1] * aux[2] * aux[3];
 }
 
-template<> EIGEN_STRONG_INLINE short int predux_mul<Packet8s>(const Packet8s& a)
-{
+template <>
+EIGEN_STRONG_INLINE short int predux_mul<Packet8s>(const Packet8s& a) {
   Packet8s pair, quad, octo;
 
   pair = vec_mul(a, vec_sld(a, a, 8));
@@ -2138,8 +2530,8 @@
   return pfirst(octo);
 }
 
-template<> EIGEN_STRONG_INLINE unsigned short int predux_mul<Packet8us>(const Packet8us& a)
-{
+template <>
+EIGEN_STRONG_INLINE unsigned short int predux_mul<Packet8us>(const Packet8us& a) {
   Packet8us pair, quad, octo;
 
   pair = vec_mul(a, vec_sld(a, a, 8));
@@ -2149,17 +2541,16 @@
   return pfirst(octo);
 }
 
-template<> EIGEN_STRONG_INLINE bfloat16 predux_mul<Packet8bf>(const Packet8bf& a)
-{
+template <>
+EIGEN_STRONG_INLINE bfloat16 predux_mul<Packet8bf>(const Packet8bf& a) {
   float redux_even = predux_mul<Packet4f>(Bf16ToF32Even(a));
-  float redux_odd  = predux_mul<Packet4f>(Bf16ToF32Odd(a));
+  float redux_odd = predux_mul<Packet4f>(Bf16ToF32Odd(a));
   float f32_result = redux_even * redux_odd;
   return bfloat16(f32_result);
 }
 
-
-template<> EIGEN_STRONG_INLINE signed char predux_mul<Packet16c>(const Packet16c& a)
-{
+template <>
+EIGEN_STRONG_INLINE signed char predux_mul<Packet16c>(const Packet16c& a) {
   Packet16c pair, quad, octo, result;
 
   pair = vec_mul(a, vec_sld(a, a, 8));
@@ -2170,8 +2561,8 @@
   return pfirst(result);
 }
 
-template<> EIGEN_STRONG_INLINE unsigned char predux_mul<Packet16uc>(const Packet16uc& a)
-{
+template <>
+EIGEN_STRONG_INLINE unsigned char predux_mul<Packet16uc>(const Packet16uc& a) {
   Packet16uc pair, quad, octo, result;
 
   pair = vec_mul(a, vec_sld(a, a, 8));
@@ -2183,66 +2574,64 @@
 }
 
 // min
-template<typename Packet> EIGEN_STRONG_INLINE
-__UNPACK_TYPE__(Packet) predux_min4(const Packet& a)
-{
+template <typename Packet>
+EIGEN_STRONG_INLINE __UNPACK_TYPE__(Packet) predux_min4(const Packet& a) {
   Packet b, res;
   b = vec_min(a, vec_sld(a, a, 8));
   res = vec_min(b, vec_sld(b, b, 4));
   return pfirst(res);
 }
 
-
-template<> EIGEN_STRONG_INLINE float predux_min<Packet4f>(const Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE float predux_min<Packet4f>(const Packet4f& a) {
   return predux_min4<Packet4f>(a);
 }
 
-template<> EIGEN_STRONG_INLINE int predux_min<Packet4i>(const Packet4i& a)
-{
+template <>
+EIGEN_STRONG_INLINE int predux_min<Packet4i>(const Packet4i& a) {
   return predux_min4<Packet4i>(a);
 }
 
-template<> EIGEN_STRONG_INLINE bfloat16 predux_min<Packet8bf>(const Packet8bf& a)
-{
+template <>
+EIGEN_STRONG_INLINE bfloat16 predux_min<Packet8bf>(const Packet8bf& a) {
   float redux_even = predux_min<Packet4f>(Bf16ToF32Even(a));
-  float redux_odd  = predux_min<Packet4f>(Bf16ToF32Odd(a));
+  float redux_odd = predux_min<Packet4f>(Bf16ToF32Odd(a));
   float f32_result = (std::min)(redux_even, redux_odd);
   return bfloat16(f32_result);
 }
 
-template<> EIGEN_STRONG_INLINE short int predux_min<Packet8s>(const Packet8s& a)
-{
+template <>
+EIGEN_STRONG_INLINE short int predux_min<Packet8s>(const Packet8s& a) {
   Packet8s pair, quad, octo;
-  
-  //pair = { Min(a0,a4), Min(a1,a5), Min(a2,a6), Min(a3,a7) }
-  pair = vec_min(a, vec_sld(a, a, 8)); 
 
-  //quad = { Min(a0, a4, a2, a6), Min(a1, a5, a3, a7) }
+  // pair = { Min(a0,a4), Min(a1,a5), Min(a2,a6), Min(a3,a7) }
+  pair = vec_min(a, vec_sld(a, a, 8));
+
+  // quad = { Min(a0, a4, a2, a6), Min(a1, a5, a3, a7) }
   quad = vec_min(pair, vec_sld(pair, pair, 4));
 
-  //octo = { Min(a0, a4, a2, a6, a1, a5, a3, a7) }
+  // octo = { Min(a0, a4, a2, a6, a1, a5, a3, a7) }
   octo = vec_min(quad, vec_sld(quad, quad, 2));
   return pfirst(octo);
 }
 
-template<> EIGEN_STRONG_INLINE unsigned short int predux_min<Packet8us>(const Packet8us& a)
-{
+template <>
+EIGEN_STRONG_INLINE unsigned short int predux_min<Packet8us>(const Packet8us& a) {
   Packet8us pair, quad, octo;
-  
-  //pair = { Min(a0,a4), Min(a1,a5), Min(a2,a6), Min(a3,a7) }
-  pair = vec_min(a, vec_sld(a, a, 8)); 
 
-  //quad = { Min(a0, a4, a2, a6), Min(a1, a5, a3, a7) }
+  // pair = { Min(a0,a4), Min(a1,a5), Min(a2,a6), Min(a3,a7) }
+  pair = vec_min(a, vec_sld(a, a, 8));
+
+  // quad = { Min(a0, a4, a2, a6), Min(a1, a5, a3, a7) }
   quad = vec_min(pair, vec_sld(pair, pair, 4));
 
-  //octo = { Min(a0, a4, a2, a6, a1, a5, a3, a7) }
+  // octo = { Min(a0, a4, a2, a6, a1, a5, a3, a7) }
   octo = vec_min(quad, vec_sld(quad, quad, 2));
   return pfirst(octo);
 }
 
-template<> EIGEN_STRONG_INLINE signed char predux_min<Packet16c>(const Packet16c& a)
-{
+template <>
+EIGEN_STRONG_INLINE signed char predux_min<Packet16c>(const Packet16c& a) {
   Packet16c pair, quad, octo, result;
 
   pair = vec_min(a, vec_sld(a, a, 8));
@@ -2253,8 +2642,8 @@
   return pfirst(result);
 }
 
-template<> EIGEN_STRONG_INLINE unsigned char predux_min<Packet16uc>(const Packet16uc& a)
-{
+template <>
+EIGEN_STRONG_INLINE unsigned char predux_min<Packet16uc>(const Packet16uc& a) {
   Packet16uc pair, quad, octo, result;
 
   pair = vec_min(a, vec_sld(a, a, 8));
@@ -2265,64 +2654,64 @@
   return pfirst(result);
 }
 // max
-template<typename Packet> EIGEN_STRONG_INLINE __UNPACK_TYPE__(Packet) predux_max4(const Packet& a)
-{
+template <typename Packet>
+EIGEN_STRONG_INLINE __UNPACK_TYPE__(Packet) predux_max4(const Packet& a) {
   Packet b, res;
   b = vec_max(a, vec_sld(a, a, 8));
   res = vec_max(b, vec_sld(b, b, 4));
   return pfirst(res);
 }
 
-template<> EIGEN_STRONG_INLINE float predux_max<Packet4f>(const Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE float predux_max<Packet4f>(const Packet4f& a) {
   return predux_max4<Packet4f>(a);
 }
 
-template<> EIGEN_STRONG_INLINE int predux_max<Packet4i>(const Packet4i& a)
-{
+template <>
+EIGEN_STRONG_INLINE int predux_max<Packet4i>(const Packet4i& a) {
   return predux_max4<Packet4i>(a);
 }
 
-template<> EIGEN_STRONG_INLINE bfloat16 predux_max<Packet8bf>(const Packet8bf& a)
-{
+template <>
+EIGEN_STRONG_INLINE bfloat16 predux_max<Packet8bf>(const Packet8bf& a) {
   float redux_even = predux_max<Packet4f>(Bf16ToF32Even(a));
-  float redux_odd  = predux_max<Packet4f>(Bf16ToF32Odd(a));
+  float redux_odd = predux_max<Packet4f>(Bf16ToF32Odd(a));
   float f32_result = (std::max)(redux_even, redux_odd);
   return bfloat16(f32_result);
 }
 
-template<> EIGEN_STRONG_INLINE short int predux_max<Packet8s>(const Packet8s& a)
-{
+template <>
+EIGEN_STRONG_INLINE short int predux_max<Packet8s>(const Packet8s& a) {
   Packet8s pair, quad, octo;
-  
-  //pair = { Max(a0,a4), Max(a1,a5), Max(a2,a6), Max(a3,a7) }
-  pair = vec_max(a, vec_sld(a, a, 8)); 
 
-  //quad = { Max(a0, a4, a2, a6), Max(a1, a5, a3, a7) }
+  // pair = { Max(a0,a4), Max(a1,a5), Max(a2,a6), Max(a3,a7) }
+  pair = vec_max(a, vec_sld(a, a, 8));
+
+  // quad = { Max(a0, a4, a2, a6), Max(a1, a5, a3, a7) }
   quad = vec_max(pair, vec_sld(pair, pair, 4));
 
-  //octo = { Max(a0, a4, a2, a6, a1, a5, a3, a7) }
+  // octo = { Max(a0, a4, a2, a6, a1, a5, a3, a7) }
   octo = vec_max(quad, vec_sld(quad, quad, 2));
   return pfirst(octo);
 }
 
-template<> EIGEN_STRONG_INLINE unsigned short int predux_max<Packet8us>(const Packet8us& a)
-{
+template <>
+EIGEN_STRONG_INLINE unsigned short int predux_max<Packet8us>(const Packet8us& a) {
   Packet8us pair, quad, octo;
-  
-  //pair = { Max(a0,a4), Max(a1,a5), Max(a2,a6), Max(a3,a7) }
-  pair = vec_max(a, vec_sld(a, a, 8)); 
 
-  //quad = { Max(a0, a4, a2, a6), Max(a1, a5, a3, a7) }
+  // pair = { Max(a0,a4), Max(a1,a5), Max(a2,a6), Max(a3,a7) }
+  pair = vec_max(a, vec_sld(a, a, 8));
+
+  // quad = { Max(a0, a4, a2, a6), Max(a1, a5, a3, a7) }
   quad = vec_max(pair, vec_sld(pair, pair, 4));
 
-  //octo = { Max(a0, a4, a2, a6, a1, a5, a3, a7) }
+  // octo = { Max(a0, a4, a2, a6, a1, a5, a3, a7) }
   octo = vec_max(quad, vec_sld(quad, quad, 2));
   return pfirst(octo);
 }
 
-template<> EIGEN_STRONG_INLINE signed char predux_max<Packet16c>(const Packet16c& a)
-{
+template <>
+EIGEN_STRONG_INLINE signed char predux_max<Packet16c>(const Packet16c& a) {
   Packet16c pair, quad, octo, result;
 
   pair = vec_max(a, vec_sld(a, a, 8));
@@ -2333,8 +2722,8 @@
   return pfirst(result);
 }
 
-template<> EIGEN_STRONG_INLINE unsigned char predux_max<Packet16uc>(const Packet16uc& a)
-{
+template <>
+EIGEN_STRONG_INLINE unsigned char predux_max<Packet16uc>(const Packet16uc& a) {
   Packet16uc pair, quad, octo, result;
 
   pair = vec_max(a, vec_sld(a, a, 8));
@@ -2345,13 +2734,13 @@
   return pfirst(result);
 }
 
-template<> EIGEN_STRONG_INLINE bool predux_any(const Packet4f& x)
-{
+template <>
+EIGEN_STRONG_INLINE bool predux_any(const Packet4f& x) {
   return vec_any_ne(x, pzero(x));
 }
 
-template <typename T> EIGEN_DEVICE_FUNC inline void
-ptranpose_common(PacketBlock<T,4>& kernel){
+template <typename T>
+EIGEN_DEVICE_FUNC inline void ptranpose_common(PacketBlock<T, 4>& kernel) {
   T t0, t1, t2, t3;
   t0 = vec_mergeh(kernel.packet[0], kernel.packet[2]);
   t1 = vec_mergel(kernel.packet[0], kernel.packet[2]);
@@ -2363,18 +2752,11 @@
   kernel.packet[3] = vec_mergel(t1, t3);
 }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet4f,4>& kernel) {
-  ptranpose_common<Packet4f>(kernel);
-}
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet4f, 4>& kernel) { ptranpose_common<Packet4f>(kernel); }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet4i,4>& kernel) {
-  ptranpose_common<Packet4i>(kernel);
-}
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet4i, 4>& kernel) { ptranpose_common<Packet4i>(kernel); }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet8s,4>& kernel) {
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet8s, 4>& kernel) {
   Packet8s t0, t1, t2, t3;
   t0 = vec_mergeh(kernel.packet[0], kernel.packet[2]);
   t1 = vec_mergel(kernel.packet[0], kernel.packet[2]);
@@ -2386,8 +2768,7 @@
   kernel.packet[3] = vec_mergel(t1, t3);
 }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet8us,4>& kernel) {
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet8us, 4>& kernel) {
   Packet8us t0, t1, t2, t3;
   t0 = vec_mergeh(kernel.packet[0], kernel.packet[2]);
   t1 = vec_mergel(kernel.packet[0], kernel.packet[2]);
@@ -2399,9 +2780,7 @@
   kernel.packet[3] = vec_mergel(t1, t3);
 }
 
-
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet8bf,4>& kernel) {
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet8bf, 4>& kernel) {
   Packet8us t0, t1, t2, t3;
 
   t0 = vec_mergeh(kernel.packet[0].m_val, kernel.packet[2].m_val);
@@ -2414,8 +2793,7 @@
   kernel.packet[3] = vec_mergel(t1, t3);
 }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet16c,4>& kernel) {
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet16c, 4>& kernel) {
   Packet16c t0, t1, t2, t3;
   t0 = vec_mergeh(kernel.packet[0], kernel.packet[2]);
   t1 = vec_mergel(kernel.packet[0], kernel.packet[2]);
@@ -2427,9 +2805,7 @@
   kernel.packet[3] = vec_mergel(t1, t3);
 }
 
-
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet16uc,4>& kernel) {
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet16uc, 4>& kernel) {
   Packet16uc t0, t1, t2, t3;
   t0 = vec_mergeh(kernel.packet[0], kernel.packet[2]);
   t1 = vec_mergel(kernel.packet[0], kernel.packet[2]);
@@ -2441,8 +2817,7 @@
   kernel.packet[3] = vec_mergel(t1, t3);
 }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet8s,8>& kernel) {
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet8s, 8>& kernel) {
   Packet8s v[8], sum[8];
 
   v[0] = vec_mergeh(kernel.packet[0], kernel.packet[4]);
@@ -2472,8 +2847,7 @@
   kernel.packet[7] = vec_mergel(sum[3], sum[7]);
 }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet8us,8>& kernel) {
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet8us, 8>& kernel) {
   Packet8us v[8], sum[8];
 
   v[0] = vec_mergeh(kernel.packet[0], kernel.packet[4]);
@@ -2503,8 +2877,7 @@
   kernel.packet[7] = vec_mergel(sum[3], sum[7]);
 }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet8bf,8>& kernel) {
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet8bf, 8>& kernel) {
   Packet8bf v[8], sum[8];
 
   v[0] = vec_mergeh(kernel.packet[0].m_val, kernel.packet[4].m_val);
@@ -2534,8 +2907,7 @@
   kernel.packet[7] = vec_mergel(sum[3].m_val, sum[7].m_val);
 }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet16c,16>& kernel) {
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet16c, 16>& kernel) {
   Packet16c step1[16], step2[16], step3[16];
 
   step1[0] = vec_mergeh(kernel.packet[0], kernel.packet[8]);
@@ -2555,16 +2927,16 @@
   step1[14] = vec_mergeh(kernel.packet[7], kernel.packet[15]);
   step1[15] = vec_mergel(kernel.packet[7], kernel.packet[15]);
 
-  step2[0]  = vec_mergeh(step1[0], step1[8]);
-  step2[1]  = vec_mergel(step1[0], step1[8]);
-  step2[2]  = vec_mergeh(step1[1], step1[9]);
-  step2[3]  = vec_mergel(step1[1], step1[9]);
-  step2[4]  = vec_mergeh(step1[2], step1[10]);
-  step2[5]  = vec_mergel(step1[2], step1[10]);
-  step2[6]  = vec_mergeh(step1[3], step1[11]);
-  step2[7]  = vec_mergel(step1[3], step1[11]);
-  step2[8]  = vec_mergeh(step1[4], step1[12]);
-  step2[9]  = vec_mergel(step1[4], step1[12]);
+  step2[0] = vec_mergeh(step1[0], step1[8]);
+  step2[1] = vec_mergel(step1[0], step1[8]);
+  step2[2] = vec_mergeh(step1[1], step1[9]);
+  step2[3] = vec_mergel(step1[1], step1[9]);
+  step2[4] = vec_mergeh(step1[2], step1[10]);
+  step2[5] = vec_mergel(step1[2], step1[10]);
+  step2[6] = vec_mergeh(step1[3], step1[11]);
+  step2[7] = vec_mergel(step1[3], step1[11]);
+  step2[8] = vec_mergeh(step1[4], step1[12]);
+  step2[9] = vec_mergel(step1[4], step1[12]);
   step2[10] = vec_mergeh(step1[5], step1[13]);
   step2[11] = vec_mergel(step1[5], step1[13]);
   step2[12] = vec_mergeh(step1[6], step1[14]);
@@ -2572,16 +2944,16 @@
   step2[14] = vec_mergeh(step1[7], step1[15]);
   step2[15] = vec_mergel(step1[7], step1[15]);
 
-  step3[0]  = vec_mergeh(step2[0], step2[8]);
-  step3[1]  = vec_mergel(step2[0], step2[8]);
-  step3[2]  = vec_mergeh(step2[1], step2[9]);
-  step3[3]  = vec_mergel(step2[1], step2[9]);
-  step3[4]  = vec_mergeh(step2[2], step2[10]);
-  step3[5]  = vec_mergel(step2[2], step2[10]);
-  step3[6]  = vec_mergeh(step2[3], step2[11]);
-  step3[7]  = vec_mergel(step2[3], step2[11]);
-  step3[8]  = vec_mergeh(step2[4], step2[12]);
-  step3[9]  = vec_mergel(step2[4], step2[12]);
+  step3[0] = vec_mergeh(step2[0], step2[8]);
+  step3[1] = vec_mergel(step2[0], step2[8]);
+  step3[2] = vec_mergeh(step2[1], step2[9]);
+  step3[3] = vec_mergel(step2[1], step2[9]);
+  step3[4] = vec_mergeh(step2[2], step2[10]);
+  step3[5] = vec_mergel(step2[2], step2[10]);
+  step3[6] = vec_mergeh(step2[3], step2[11]);
+  step3[7] = vec_mergel(step2[3], step2[11]);
+  step3[8] = vec_mergeh(step2[4], step2[12]);
+  step3[9] = vec_mergel(step2[4], step2[12]);
   step3[10] = vec_mergeh(step2[5], step2[13]);
   step3[11] = vec_mergel(step2[5], step2[13]);
   step3[12] = vec_mergeh(step2[6], step2[14]);
@@ -2589,16 +2961,16 @@
   step3[14] = vec_mergeh(step2[7], step2[15]);
   step3[15] = vec_mergel(step2[7], step2[15]);
 
-  kernel.packet[0]  = vec_mergeh(step3[0], step3[8]);
-  kernel.packet[1]  = vec_mergel(step3[0], step3[8]);
-  kernel.packet[2]  = vec_mergeh(step3[1], step3[9]);
-  kernel.packet[3]  = vec_mergel(step3[1], step3[9]);
-  kernel.packet[4]  = vec_mergeh(step3[2], step3[10]);
-  kernel.packet[5]  = vec_mergel(step3[2], step3[10]);
-  kernel.packet[6]  = vec_mergeh(step3[3], step3[11]);
-  kernel.packet[7]  = vec_mergel(step3[3], step3[11]);
-  kernel.packet[8]  = vec_mergeh(step3[4], step3[12]);
-  kernel.packet[9]  = vec_mergel(step3[4], step3[12]);
+  kernel.packet[0] = vec_mergeh(step3[0], step3[8]);
+  kernel.packet[1] = vec_mergel(step3[0], step3[8]);
+  kernel.packet[2] = vec_mergeh(step3[1], step3[9]);
+  kernel.packet[3] = vec_mergel(step3[1], step3[9]);
+  kernel.packet[4] = vec_mergeh(step3[2], step3[10]);
+  kernel.packet[5] = vec_mergel(step3[2], step3[10]);
+  kernel.packet[6] = vec_mergeh(step3[3], step3[11]);
+  kernel.packet[7] = vec_mergel(step3[3], step3[11]);
+  kernel.packet[8] = vec_mergeh(step3[4], step3[12]);
+  kernel.packet[9] = vec_mergel(step3[4], step3[12]);
   kernel.packet[10] = vec_mergeh(step3[5], step3[13]);
   kernel.packet[11] = vec_mergel(step3[5], step3[13]);
   kernel.packet[12] = vec_mergeh(step3[6], step3[14]);
@@ -2607,8 +2979,7 @@
   kernel.packet[15] = vec_mergel(step3[7], step3[15]);
 }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet16uc,16>& kernel) {
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet16uc, 16>& kernel) {
   Packet16uc step1[16], step2[16], step3[16];
 
   step1[0] = vec_mergeh(kernel.packet[0], kernel.packet[8]);
@@ -2628,16 +2999,16 @@
   step1[14] = vec_mergeh(kernel.packet[7], kernel.packet[15]);
   step1[15] = vec_mergel(kernel.packet[7], kernel.packet[15]);
 
-  step2[0]  = vec_mergeh(step1[0], step1[8]);
-  step2[1]  = vec_mergel(step1[0], step1[8]);
-  step2[2]  = vec_mergeh(step1[1], step1[9]);
-  step2[3]  = vec_mergel(step1[1], step1[9]);
-  step2[4]  = vec_mergeh(step1[2], step1[10]);
-  step2[5]  = vec_mergel(step1[2], step1[10]);
-  step2[6]  = vec_mergeh(step1[3], step1[11]);
-  step2[7]  = vec_mergel(step1[3], step1[11]);
-  step2[8]  = vec_mergeh(step1[4], step1[12]);
-  step2[9]  = vec_mergel(step1[4], step1[12]);
+  step2[0] = vec_mergeh(step1[0], step1[8]);
+  step2[1] = vec_mergel(step1[0], step1[8]);
+  step2[2] = vec_mergeh(step1[1], step1[9]);
+  step2[3] = vec_mergel(step1[1], step1[9]);
+  step2[4] = vec_mergeh(step1[2], step1[10]);
+  step2[5] = vec_mergel(step1[2], step1[10]);
+  step2[6] = vec_mergeh(step1[3], step1[11]);
+  step2[7] = vec_mergel(step1[3], step1[11]);
+  step2[8] = vec_mergeh(step1[4], step1[12]);
+  step2[9] = vec_mergel(step1[4], step1[12]);
   step2[10] = vec_mergeh(step1[5], step1[13]);
   step2[11] = vec_mergel(step1[5], step1[13]);
   step2[12] = vec_mergeh(step1[6], step1[14]);
@@ -2645,16 +3016,16 @@
   step2[14] = vec_mergeh(step1[7], step1[15]);
   step2[15] = vec_mergel(step1[7], step1[15]);
 
-  step3[0]  = vec_mergeh(step2[0], step2[8]);
-  step3[1]  = vec_mergel(step2[0], step2[8]);
-  step3[2]  = vec_mergeh(step2[1], step2[9]);
-  step3[3]  = vec_mergel(step2[1], step2[9]);
-  step3[4]  = vec_mergeh(step2[2], step2[10]);
-  step3[5]  = vec_mergel(step2[2], step2[10]);
-  step3[6]  = vec_mergeh(step2[3], step2[11]);
-  step3[7]  = vec_mergel(step2[3], step2[11]);
-  step3[8]  = vec_mergeh(step2[4], step2[12]);
-  step3[9]  = vec_mergel(step2[4], step2[12]);
+  step3[0] = vec_mergeh(step2[0], step2[8]);
+  step3[1] = vec_mergel(step2[0], step2[8]);
+  step3[2] = vec_mergeh(step2[1], step2[9]);
+  step3[3] = vec_mergel(step2[1], step2[9]);
+  step3[4] = vec_mergeh(step2[2], step2[10]);
+  step3[5] = vec_mergel(step2[2], step2[10]);
+  step3[6] = vec_mergeh(step2[3], step2[11]);
+  step3[7] = vec_mergel(step2[3], step2[11]);
+  step3[8] = vec_mergeh(step2[4], step2[12]);
+  step3[9] = vec_mergel(step2[4], step2[12]);
   step3[10] = vec_mergeh(step2[5], step2[13]);
   step3[11] = vec_mergel(step2[5], step2[13]);
   step3[12] = vec_mergeh(step2[6], step2[14]);
@@ -2662,16 +3033,16 @@
   step3[14] = vec_mergeh(step2[7], step2[15]);
   step3[15] = vec_mergel(step2[7], step2[15]);
 
-  kernel.packet[0]  = vec_mergeh(step3[0], step3[8]);
-  kernel.packet[1]  = vec_mergel(step3[0], step3[8]);
-  kernel.packet[2]  = vec_mergeh(step3[1], step3[9]);
-  kernel.packet[3]  = vec_mergel(step3[1], step3[9]);
-  kernel.packet[4]  = vec_mergeh(step3[2], step3[10]);
-  kernel.packet[5]  = vec_mergel(step3[2], step3[10]);
-  kernel.packet[6]  = vec_mergeh(step3[3], step3[11]);
-  kernel.packet[7]  = vec_mergel(step3[3], step3[11]);
-  kernel.packet[8]  = vec_mergeh(step3[4], step3[12]);
-  kernel.packet[9]  = vec_mergel(step3[4], step3[12]);
+  kernel.packet[0] = vec_mergeh(step3[0], step3[8]);
+  kernel.packet[1] = vec_mergel(step3[0], step3[8]);
+  kernel.packet[2] = vec_mergeh(step3[1], step3[9]);
+  kernel.packet[3] = vec_mergel(step3[1], step3[9]);
+  kernel.packet[4] = vec_mergeh(step3[2], step3[10]);
+  kernel.packet[5] = vec_mergel(step3[2], step3[10]);
+  kernel.packet[6] = vec_mergeh(step3[3], step3[11]);
+  kernel.packet[7] = vec_mergel(step3[3], step3[11]);
+  kernel.packet[8] = vec_mergeh(step3[4], step3[12]);
+  kernel.packet[9] = vec_mergel(step3[4], step3[12]);
   kernel.packet[10] = vec_mergeh(step3[5], step3[13]);
   kernel.packet[11] = vec_mergel(step3[5], step3[13]);
   kernel.packet[12] = vec_mergeh(step3[6], step3[14]);
@@ -2680,112 +3051,127 @@
   kernel.packet[15] = vec_mergel(step3[7], step3[15]);
 }
 
-template<typename Packet> EIGEN_STRONG_INLINE
-Packet pblend4(const Selector<4>& ifPacket, const Packet& thenPacket, const Packet& elsePacket) {
-  Packet4ui select = { ifPacket.select[0], ifPacket.select[1], ifPacket.select[2], ifPacket.select[3] };
+template <typename Packet>
+EIGEN_STRONG_INLINE Packet pblend4(const Selector<4>& ifPacket, const Packet& thenPacket, const Packet& elsePacket) {
+  Packet4ui select = {ifPacket.select[0], ifPacket.select[1], ifPacket.select[2], ifPacket.select[3]};
   Packet4ui mask = reinterpret_cast<Packet4ui>(pnegate(reinterpret_cast<Packet4i>(select)));
   return vec_sel(elsePacket, thenPacket, mask);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4i pblend(const Selector<4>& ifPacket, const Packet4i& thenPacket, const Packet4i& elsePacket) {
+template <>
+EIGEN_STRONG_INLINE Packet4i pblend(const Selector<4>& ifPacket, const Packet4i& thenPacket,
+                                    const Packet4i& elsePacket) {
   return pblend4<Packet4i>(ifPacket, thenPacket, elsePacket);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pblend(const Selector<4>& ifPacket, const Packet4f& thenPacket, const Packet4f& elsePacket) {
+template <>
+EIGEN_STRONG_INLINE Packet4f pblend(const Selector<4>& ifPacket, const Packet4f& thenPacket,
+                                    const Packet4f& elsePacket) {
   return pblend4<Packet4f>(ifPacket, thenPacket, elsePacket);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8s pblend(const Selector<8>& ifPacket, const Packet8s& thenPacket, const Packet8s& elsePacket) {
-  Packet8us select = { ifPacket.select[0], ifPacket.select[1], ifPacket.select[2], ifPacket.select[3],
-                       ifPacket.select[4], ifPacket.select[5], ifPacket.select[6], ifPacket.select[7] };
+template <>
+EIGEN_STRONG_INLINE Packet8s pblend(const Selector<8>& ifPacket, const Packet8s& thenPacket,
+                                    const Packet8s& elsePacket) {
+  Packet8us select = {ifPacket.select[0], ifPacket.select[1], ifPacket.select[2], ifPacket.select[3],
+                      ifPacket.select[4], ifPacket.select[5], ifPacket.select[6], ifPacket.select[7]};
   Packet8us mask = reinterpret_cast<Packet8us>(pnegate(reinterpret_cast<Packet8s>(select)));
   Packet8s result = vec_sel(elsePacket, thenPacket, mask);
   return result;
 }
 
-template<> EIGEN_STRONG_INLINE Packet8us pblend(const Selector<8>& ifPacket, const Packet8us& thenPacket, const Packet8us& elsePacket) {
-  Packet8us select = { ifPacket.select[0], ifPacket.select[1], ifPacket.select[2], ifPacket.select[3],
-                       ifPacket.select[4], ifPacket.select[5], ifPacket.select[6], ifPacket.select[7] };
+template <>
+EIGEN_STRONG_INLINE Packet8us pblend(const Selector<8>& ifPacket, const Packet8us& thenPacket,
+                                     const Packet8us& elsePacket) {
+  Packet8us select = {ifPacket.select[0], ifPacket.select[1], ifPacket.select[2], ifPacket.select[3],
+                      ifPacket.select[4], ifPacket.select[5], ifPacket.select[6], ifPacket.select[7]};
   Packet8us mask = reinterpret_cast<Packet8us>(pnegate(reinterpret_cast<Packet8s>(select)));
   return vec_sel(elsePacket, thenPacket, mask);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf pblend(const Selector<8>& ifPacket, const Packet8bf& thenPacket, const Packet8bf& elsePacket) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf pblend(const Selector<8>& ifPacket, const Packet8bf& thenPacket,
+                                     const Packet8bf& elsePacket) {
   return pblend<Packet8us>(ifPacket, thenPacket, elsePacket);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16c pblend(const Selector<16>& ifPacket, const Packet16c& thenPacket, const Packet16c& elsePacket) {
-  Packet16uc select = { ifPacket.select[0], ifPacket.select[1], ifPacket.select[2], ifPacket.select[3],
-                       ifPacket.select[4], ifPacket.select[5], ifPacket.select[6], ifPacket.select[7],
-                       ifPacket.select[8], ifPacket.select[9], ifPacket.select[10], ifPacket.select[11],
-                       ifPacket.select[12], ifPacket.select[13], ifPacket.select[14], ifPacket.select[15] };
+template <>
+EIGEN_STRONG_INLINE Packet16c pblend(const Selector<16>& ifPacket, const Packet16c& thenPacket,
+                                     const Packet16c& elsePacket) {
+  Packet16uc select = {ifPacket.select[0],  ifPacket.select[1],  ifPacket.select[2],  ifPacket.select[3],
+                       ifPacket.select[4],  ifPacket.select[5],  ifPacket.select[6],  ifPacket.select[7],
+                       ifPacket.select[8],  ifPacket.select[9],  ifPacket.select[10], ifPacket.select[11],
+                       ifPacket.select[12], ifPacket.select[13], ifPacket.select[14], ifPacket.select[15]};
 
   Packet16uc mask = reinterpret_cast<Packet16uc>(pnegate(reinterpret_cast<Packet16c>(select)));
   return vec_sel(elsePacket, thenPacket, mask);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16uc pblend(const Selector<16>& ifPacket, const Packet16uc& thenPacket, const Packet16uc& elsePacket) {
-  Packet16uc select = { ifPacket.select[0], ifPacket.select[1], ifPacket.select[2], ifPacket.select[3],
-                       ifPacket.select[4], ifPacket.select[5], ifPacket.select[6], ifPacket.select[7],
-                       ifPacket.select[8], ifPacket.select[9], ifPacket.select[10], ifPacket.select[11],
-                       ifPacket.select[12], ifPacket.select[13], ifPacket.select[14], ifPacket.select[15] };
+template <>
+EIGEN_STRONG_INLINE Packet16uc pblend(const Selector<16>& ifPacket, const Packet16uc& thenPacket,
+                                      const Packet16uc& elsePacket) {
+  Packet16uc select = {ifPacket.select[0],  ifPacket.select[1],  ifPacket.select[2],  ifPacket.select[3],
+                       ifPacket.select[4],  ifPacket.select[5],  ifPacket.select[6],  ifPacket.select[7],
+                       ifPacket.select[8],  ifPacket.select[9],  ifPacket.select[10], ifPacket.select[11],
+                       ifPacket.select[12], ifPacket.select[13], ifPacket.select[14], ifPacket.select[15]};
 
   Packet16uc mask = reinterpret_cast<Packet16uc>(pnegate(reinterpret_cast<Packet16c>(select)));
   return vec_sel(elsePacket, thenPacket, mask);
 }
 
-
 //---------- double ----------
 #ifdef EIGEN_VECTORIZE_VSX
-typedef __vector double              Packet2d;
-typedef __vector unsigned long long  Packet2ul;
-typedef __vector long long           Packet2l;
+typedef __vector double Packet2d;
+typedef __vector unsigned long long Packet2ul;
+typedef __vector long long Packet2l;
 #if EIGEN_COMP_CLANG
-typedef Packet2ul                    Packet2bl;
+typedef Packet2ul Packet2bl;
 #else
-typedef __vector __bool long         Packet2bl;
+typedef __vector __bool long Packet2bl;
 #endif
 
-static Packet2l  p2l_ZERO = reinterpret_cast<Packet2l>(p4i_ZERO);
-static Packet2ul p2ul_SIGN = { 0x8000000000000000ull, 0x8000000000000000ull };
-static Packet2ul p2ul_PREV0DOT5 = { 0x3FDFFFFFFFFFFFFFull, 0x3FDFFFFFFFFFFFFFull };
-static Packet2d  p2d_ONE  = { 1.0, 1.0 };
-static Packet2d  p2d_ZERO = reinterpret_cast<Packet2d>(p4f_ZERO);
-static Packet2d  p2d_MZERO = { numext::bit_cast<double>(0x8000000000000000ull),
-                               numext::bit_cast<double>(0x8000000000000000ull) };
+static Packet2l p2l_ZERO = reinterpret_cast<Packet2l>(p4i_ZERO);
+static Packet2ul p2ul_SIGN = {0x8000000000000000ull, 0x8000000000000000ull};
+static Packet2ul p2ul_PREV0DOT5 = {0x3FDFFFFFFFFFFFFFull, 0x3FDFFFFFFFFFFFFFull};
+static Packet2d p2d_ONE = {1.0, 1.0};
+static Packet2d p2d_ZERO = reinterpret_cast<Packet2d>(p4f_ZERO);
+static Packet2d p2d_MZERO = {numext::bit_cast<double>(0x8000000000000000ull),
+                             numext::bit_cast<double>(0x8000000000000000ull)};
 
 #ifdef _BIG_ENDIAN
-static Packet2d p2d_COUNTDOWN = reinterpret_cast<Packet2d>(vec_sld(reinterpret_cast<Packet4f>(p2d_ZERO), reinterpret_cast<Packet4f>(p2d_ONE), 8));
+static Packet2d p2d_COUNTDOWN =
+    reinterpret_cast<Packet2d>(vec_sld(reinterpret_cast<Packet4f>(p2d_ZERO), reinterpret_cast<Packet4f>(p2d_ONE), 8));
 #else
-static Packet2d p2d_COUNTDOWN = reinterpret_cast<Packet2d>(vec_sld(reinterpret_cast<Packet4f>(p2d_ONE), reinterpret_cast<Packet4f>(p2d_ZERO), 8));
+static Packet2d p2d_COUNTDOWN =
+    reinterpret_cast<Packet2d>(vec_sld(reinterpret_cast<Packet4f>(p2d_ONE), reinterpret_cast<Packet4f>(p2d_ZERO), 8));
 #endif
 
-template<int index> Packet2d vec_splat_dbl(Packet2d& a)
-{
+template <int index>
+Packet2d vec_splat_dbl(Packet2d& a) {
   return vec_splat(a, index);
 }
 
-template<> struct packet_traits<double> : default_packet_traits
-{
+template <>
+struct packet_traits<double> : default_packet_traits {
   typedef Packet2d type;
   typedef Packet2d half;
   enum {
     Vectorizable = 1,
     AlignedOnScalar = 1,
-    size=2,
+    size = 2,
 
-    HasAdd  = 1,
-    HasSub  = 1,
-    HasMul  = 1,
-    HasDiv  = 1,
-    HasMin  = 1,
-    HasMax  = 1,
-    HasAbs  = 1,
-    HasSin  = 0,
-    HasCos  = 0,
+    HasAdd = 1,
+    HasSub = 1,
+    HasMul = 1,
+    HasDiv = 1,
+    HasMin = 1,
+    HasMax = 1,
+    HasAbs = 1,
+    HasSin = 0,
+    HasCos = 0,
     HasATan = 0,
-    HasLog  = 0,
-    HasExp  = 1,
+    HasLog = 0,
+    HasExp = 1,
     HasSqrt = 1,
 #if !EIGEN_COMP_CLANG
     HasRsqrt = 1,
@@ -2801,12 +3187,22 @@
   };
 };
 
-template<> struct unpacket_traits<Packet2d> { typedef double type; enum {size=2, alignment=Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false}; typedef Packet2d half; };
+template <>
+struct unpacket_traits<Packet2d> {
+  typedef double type;
+  enum {
+    size = 2,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
+  typedef Packet2d half;
+};
 
-inline std::ostream & operator <<(std::ostream & s, const Packet2l & v)
-{
+inline std::ostream& operator<<(std::ostream& s, const Packet2l& v) {
   union {
-    Packet2l   v;
+    Packet2l v;
     int64_t n[2];
   } vt;
   vt.v = v;
@@ -2814,10 +3210,9 @@
   return s;
 }
 
-inline std::ostream & operator <<(std::ostream & s, const Packet2d & v)
-{
+inline std::ostream& operator<<(std::ostream& s, const Packet2d& v) {
   union {
-    Packet2d   v;
+    Packet2d v;
     double n[2];
   } vt;
   vt.v = v;
@@ -2826,74 +3221,86 @@
 }
 
 // Need to define them first or we get specialization after instantiation errors
-template<> EIGEN_STRONG_INLINE Packet2d pload<Packet2d>(const double* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2d pload<Packet2d>(const double* from) {
   EIGEN_DEBUG_ALIGNED_LOAD
-  return vec_xl(0, const_cast<double *>(from)); // cast needed by Clang
+  return vec_xl(0, const_cast<double*>(from));  // cast needed by Clang
 }
 
-template<> EIGEN_ALWAYS_INLINE Packet2d pload_partial<Packet2d>(const double* from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE Packet2d pload_partial<Packet2d>(const double* from, const Index n, const Index offset) {
   return pload_partial_common<Packet2d>(from, n, offset);
 }
 
-template<> EIGEN_STRONG_INLINE void pstore<double>(double*   to, const Packet2d& from)
-{
+template <>
+EIGEN_STRONG_INLINE void pstore<double>(double* to, const Packet2d& from) {
   EIGEN_DEBUG_ALIGNED_STORE
   vec_xst(from, 0, to);
 }
 
-template<> EIGEN_ALWAYS_INLINE void pstore_partial<double>(double*  to, const Packet2d& from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE void pstore_partial<double>(double* to, const Packet2d& from, const Index n, const Index offset) {
   pstore_partial_common<Packet2d>(to, from, n, offset);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2d pset1<Packet2d>(const double&  from) {
+template <>
+EIGEN_STRONG_INLINE Packet2d pset1<Packet2d>(const double& from) {
   Packet2d v = {from, from};
   return v;
 }
 
-template<> EIGEN_STRONG_INLINE Packet2d pset1frombits<Packet2d>(unsigned long from) {
+template <>
+EIGEN_STRONG_INLINE Packet2d pset1frombits<Packet2d>(unsigned long from) {
   Packet2l v = {static_cast<long long>(from), static_cast<long long>(from)};
   return reinterpret_cast<Packet2d>(v);
 }
 
-template<> EIGEN_STRONG_INLINE void
-pbroadcast4<Packet2d>(const double *a,
-                      Packet2d& a0, Packet2d& a1, Packet2d& a2, Packet2d& a3)
-{
-  //This way is faster than vec_splat (at least for doubles in Power 9)
+template <>
+EIGEN_STRONG_INLINE void pbroadcast4<Packet2d>(const double* a, Packet2d& a0, Packet2d& a1, Packet2d& a2,
+                                               Packet2d& a3) {
+  // This way is faster than vec_splat (at least for doubles in Power 9)
   a0 = pset1<Packet2d>(a[0]);
   a1 = pset1<Packet2d>(a[1]);
   a2 = pset1<Packet2d>(a[2]);
   a3 = pset1<Packet2d>(a[3]);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet2d pgather<double, Packet2d>(const double* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet2d pgather<double, Packet2d>(const double* from, Index stride) {
   return pgather_common<Packet2d>(from, stride);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet2d pgather_partial<double, Packet2d>(const double* from, Index stride, const Index n)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet2d pgather_partial<double, Packet2d>(const double* from, Index stride,
+                                                                                 const Index n) {
   return pgather_common<Packet2d>(from, stride, n);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter<double, Packet2d>(double* to, const Packet2d& from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter<double, Packet2d>(double* to, const Packet2d& from, Index stride) {
   pscatter_common<Packet2d>(to, from, stride);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter_partial<double, Packet2d>(double* to, const Packet2d& from, Index stride, const Index n)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pscatter_partial<double, Packet2d>(double* to, const Packet2d& from,
+                                                                              Index stride, const Index n) {
   pscatter_common<Packet2d>(to, from, stride, n);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2d plset<Packet2d>(const double& a) { return pset1<Packet2d>(a) + p2d_COUNTDOWN; }
+template <>
+EIGEN_STRONG_INLINE Packet2d plset<Packet2d>(const double& a) {
+  return pset1<Packet2d>(a) + p2d_COUNTDOWN;
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d padd<Packet2d>(const Packet2d& a, const Packet2d& b) { return a + b; }
+template <>
+EIGEN_STRONG_INLINE Packet2d padd<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return a + b;
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d psub<Packet2d>(const Packet2d& a, const Packet2d& b) { return a - b; }
+template <>
+EIGEN_STRONG_INLINE Packet2d psub<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return a - b;
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d pnegate(const Packet2d& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2d pnegate(const Packet2d& a) {
 #ifdef __POWER8_VECTOR__
   return vec_neg(a);
 #else
@@ -2901,150 +3308,214 @@
 #endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet2d pconj(const Packet2d& a) { return a; }
+template <>
+EIGEN_STRONG_INLINE Packet2d pconj(const Packet2d& a) {
+  return a;
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d pmul<Packet2d>(const Packet2d& a, const Packet2d& b) { return vec_madd(a,b,p2d_MZERO); }
-template<> EIGEN_STRONG_INLINE Packet2d pdiv<Packet2d>(const Packet2d& a, const Packet2d& b) { return vec_div(a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet2d pmul<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return vec_madd(a, b, p2d_MZERO);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pdiv<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return vec_div(a, b);
+}
 
 // for some weird raisons, it has to be overloaded for packet of integers
-template<> EIGEN_STRONG_INLINE Packet2d pmadd(const Packet2d& a, const Packet2d& b, const Packet2d& c) { return vec_madd(a, b, c); }
-template<> EIGEN_STRONG_INLINE Packet2d pmsub(const Packet2d& a, const Packet2d& b, const Packet2d& c) { return vec_msub(a,b,c); }
-template<> EIGEN_STRONG_INLINE Packet2d pnmadd(const Packet2d& a, const Packet2d& b, const Packet2d& c) { return vec_nmsub(a,b,c); }
-template<> EIGEN_STRONG_INLINE Packet2d pnmsub(const Packet2d& a, const Packet2d& b, const Packet2d& c) { return vec_nmadd(a,b,c); }
+template <>
+EIGEN_STRONG_INLINE Packet2d pmadd(const Packet2d& a, const Packet2d& b, const Packet2d& c) {
+  return vec_madd(a, b, c);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pmsub(const Packet2d& a, const Packet2d& b, const Packet2d& c) {
+  return vec_msub(a, b, c);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pnmadd(const Packet2d& a, const Packet2d& b, const Packet2d& c) {
+  return vec_nmsub(a, b, c);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pnmsub(const Packet2d& a, const Packet2d& b, const Packet2d& c) {
+  return vec_nmadd(a, b, c);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d pmin<Packet2d>(const Packet2d& a, const Packet2d& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2d pmin<Packet2d>(const Packet2d& a, const Packet2d& b) {
   // NOTE: about 10% slower than vec_min, but consistent with std::min and SSE regarding NaN
   Packet2d ret;
-  __asm__ ("xvcmpgedp %x0,%x1,%x2\n\txxsel %x0,%x1,%x2,%x0" : "=&wa" (ret) : "wa" (a), "wa" (b));
+  __asm__("xvcmpgedp %x0,%x1,%x2\n\txxsel %x0,%x1,%x2,%x0" : "=&wa"(ret) : "wa"(a), "wa"(b));
   return ret;
- }
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d pmax<Packet2d>(const Packet2d& a, const Packet2d& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2d pmax<Packet2d>(const Packet2d& a, const Packet2d& b) {
   // NOTE: about 10% slower than vec_max, but consistent with std::max and SSE regarding NaN
   Packet2d ret;
-  __asm__ ("xvcmpgtdp %x0,%x2,%x1\n\txxsel %x0,%x1,%x2,%x0" : "=&wa" (ret) : "wa" (a), "wa" (b));
+  __asm__("xvcmpgtdp %x0,%x2,%x1\n\txxsel %x0,%x1,%x2,%x0" : "=&wa"(ret) : "wa"(a), "wa"(b));
   return ret;
 }
 
-template<> EIGEN_STRONG_INLINE Packet2d pcmp_le(const Packet2d& a, const Packet2d& b) { return reinterpret_cast<Packet2d>(vec_cmple(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet2d pcmp_lt(const Packet2d& a, const Packet2d& b) { return reinterpret_cast<Packet2d>(vec_cmplt(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet2d pcmp_eq(const Packet2d& a, const Packet2d& b) { return reinterpret_cast<Packet2d>(vec_cmpeq(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet2d pcmp_lt_or_nan(const Packet2d& a, const Packet2d& b) {
-  Packet2d c = reinterpret_cast<Packet2d>(vec_cmpge(a,b));
-  return vec_nor(c,c);
+template <>
+EIGEN_STRONG_INLINE Packet2d pcmp_le(const Packet2d& a, const Packet2d& b) {
+  return reinterpret_cast<Packet2d>(vec_cmple(a, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pcmp_lt(const Packet2d& a, const Packet2d& b) {
+  return reinterpret_cast<Packet2d>(vec_cmplt(a, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pcmp_eq(const Packet2d& a, const Packet2d& b) {
+  return reinterpret_cast<Packet2d>(vec_cmpeq(a, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pcmp_lt_or_nan(const Packet2d& a, const Packet2d& b) {
+  Packet2d c = reinterpret_cast<Packet2d>(vec_cmpge(a, b));
+  return vec_nor(c, c);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2d pand<Packet2d>(const Packet2d& a, const Packet2d& b) { return vec_and(a, b); }
-
-template<> EIGEN_STRONG_INLINE Packet2d por<Packet2d>(const Packet2d& a, const Packet2d& b) { return vec_or(a, b); }
-
-template<> EIGEN_STRONG_INLINE Packet2d pxor<Packet2d>(const Packet2d& a, const Packet2d& b) { return vec_xor(a, b); }
-
-template<> EIGEN_STRONG_INLINE Packet2d pandnot<Packet2d>(const Packet2d& a, const Packet2d& b) { return vec_and(a, vec_nor(b, b)); }
-
-template<> EIGEN_STRONG_INLINE Packet2d pround<Packet2d>(const Packet2d& a)
-{
-    Packet2d t = vec_add(reinterpret_cast<Packet2d>(vec_or(vec_and(reinterpret_cast<Packet2ul>(a), p2ul_SIGN), p2ul_PREV0DOT5)), a);
-    Packet2d res;
-
-    __asm__("xvrdpiz %x0, %x1\n\t"
-        : "=&wa" (res)
-        : "wa" (t));
-
-    return res;
-}
-template<> EIGEN_STRONG_INLINE Packet2d pceil<Packet2d>(const  Packet2d& a) { return vec_ceil(a); }
-template<> EIGEN_STRONG_INLINE Packet2d pfloor<Packet2d>(const Packet2d& a) { return vec_floor(a); }
-template<> EIGEN_STRONG_INLINE Packet2d print<Packet2d>(const Packet2d& a)
-{
-    Packet2d res;
-
-    __asm__("xvrdpic %x0, %x1\n\t"
-        : "=&wa" (res)
-        : "wa" (a));
-
-    return res;
+template <>
+EIGEN_STRONG_INLINE Packet2d pand<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return vec_and(a, b);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2d ploadu<Packet2d>(const double* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2d por<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return vec_or(a, b);
+}
+
+template <>
+EIGEN_STRONG_INLINE Packet2d pxor<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return vec_xor(a, b);
+}
+
+template <>
+EIGEN_STRONG_INLINE Packet2d pandnot<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return vec_and(a, vec_nor(b, b));
+}
+
+template <>
+EIGEN_STRONG_INLINE Packet2d pround<Packet2d>(const Packet2d& a) {
+  Packet2d t = vec_add(
+      reinterpret_cast<Packet2d>(vec_or(vec_and(reinterpret_cast<Packet2ul>(a), p2ul_SIGN), p2ul_PREV0DOT5)), a);
+  Packet2d res;
+
+  __asm__("xvrdpiz %x0, %x1\n\t" : "=&wa"(res) : "wa"(t));
+
+  return res;
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pceil<Packet2d>(const Packet2d& a) {
+  return vec_ceil(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pfloor<Packet2d>(const Packet2d& a) {
+  return vec_floor(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d print<Packet2d>(const Packet2d& a) {
+  Packet2d res;
+
+  __asm__("xvrdpic %x0, %x1\n\t" : "=&wa"(res) : "wa"(a));
+
+  return res;
+}
+
+template <>
+EIGEN_STRONG_INLINE Packet2d ploadu<Packet2d>(const double* from) {
   EIGEN_DEBUG_UNALIGNED_LOAD
   return vec_xl(0, const_cast<double*>(from));
 }
 
-template<> EIGEN_ALWAYS_INLINE Packet2d ploadu_partial<Packet2d>(const double* from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE Packet2d ploadu_partial<Packet2d>(const double* from, const Index n, const Index offset) {
   return ploadu_partial_common<Packet2d>(from, n, offset);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2d ploaddup<Packet2d>(const double*   from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2d ploaddup<Packet2d>(const double* from) {
   Packet2d p;
-  if((std::ptrdiff_t(from) % 16) == 0)  p = pload<Packet2d>(from);
-  else                                  p = ploadu<Packet2d>(from);
+  if ((std::ptrdiff_t(from) % 16) == 0)
+    p = pload<Packet2d>(from);
+  else
+    p = ploadu<Packet2d>(from);
   return vec_splat_dbl<0>(p);
 }
 
-template<> EIGEN_STRONG_INLINE void pstoreu<double>(double*  to, const Packet2d& from)
-{
+template <>
+EIGEN_STRONG_INLINE void pstoreu<double>(double* to, const Packet2d& from) {
   EIGEN_DEBUG_UNALIGNED_STORE
   vec_xst(from, 0, to);
 }
 
-template<> EIGEN_ALWAYS_INLINE void pstoreu_partial<double>(double*  to, const Packet2d& from, const Index n, const Index offset)
-{
+template <>
+EIGEN_ALWAYS_INLINE void pstoreu_partial<double>(double* to, const Packet2d& from, const Index n, const Index offset) {
   pstoreu_partial_common<Packet2d>(to, from, n, offset);
 }
 
-template<> EIGEN_STRONG_INLINE void prefetch<double>(const double* addr) { EIGEN_PPC_PREFETCH(addr); }
+template <>
+EIGEN_STRONG_INLINE void prefetch<double>(const double* addr) {
+  EIGEN_PPC_PREFETCH(addr);
+}
 
-template<> EIGEN_STRONG_INLINE double  pfirst<Packet2d>(const Packet2d& a) { EIGEN_ALIGN16 double x[2]; pstore<double>(x, a); return x[0]; }
+template <>
+EIGEN_STRONG_INLINE double pfirst<Packet2d>(const Packet2d& a) {
+  EIGEN_ALIGN16 double x[2];
+  pstore<double>(x, a);
+  return x[0];
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d preverse(const Packet2d& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2d preverse(const Packet2d& a) {
   return vec_sld(a, a, 8);
 }
-template<> EIGEN_STRONG_INLINE Packet2d pabs(const Packet2d& a) { return vec_abs(a); }
+template <>
+EIGEN_STRONG_INLINE Packet2d pabs(const Packet2d& a) {
+  return vec_abs(a);
+}
 #ifdef __POWER8_VECTOR__
-template<> EIGEN_STRONG_INLINE Packet2d psignbit(const Packet2d&  a) { return (Packet2d)vec_sra((Packet2l)a, vec_splats((unsigned long long)(63))); }
+template <>
+EIGEN_STRONG_INLINE Packet2d psignbit(const Packet2d& a) {
+  return (Packet2d)vec_sra((Packet2l)a, vec_splats((unsigned long long)(63)));
+}
 #else
 #ifdef _BIG_ENDIAN
-static Packet16uc p16uc_DUPSIGN = { 0,0,0,0, 0,0,0,0, 8,8,8,8, 8,8,8,8 };
+static Packet16uc p16uc_DUPSIGN = {0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8};
 #else
-static Packet16uc p16uc_DUPSIGN = { 7,7,7,7, 7,7,7,7, 15,15,15,15, 15,15,15,15 };
+static Packet16uc p16uc_DUPSIGN = {7, 7, 7, 7, 7, 7, 7, 7, 15, 15, 15, 15, 15, 15, 15, 15};
 #endif
 
-template<> EIGEN_STRONG_INLINE Packet2d psignbit(const Packet2d&  a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2d psignbit(const Packet2d& a) {
   Packet16c tmp = vec_sra(reinterpret_cast<Packet16c>(a), vec_splats((unsigned char)(7)));
   return reinterpret_cast<Packet2d>(vec_perm(tmp, tmp, p16uc_DUPSIGN));
 }
 #endif
 
-template<> inline Packet2l pcast<Packet2d, Packet2l>(const Packet2d& x);
+template <>
+inline Packet2l pcast<Packet2d, Packet2l>(const Packet2d& x);
 
-template<> inline Packet2d pcast<Packet2l, Packet2d>(const Packet2l& x);
+template <>
+inline Packet2d pcast<Packet2l, Packet2d>(const Packet2l& x);
 
 // Packet2l shifts.
-// For POWER8 we simply use vec_sr/l. 
+// For POWER8 we simply use vec_sr/l.
 //
 // Things are more complicated for POWER7. There is actually a
 // vec_xxsxdi intrinsic but it is not supported by some gcc versions.
 // So we need to shift by N % 32 and rearrage bytes.
 #ifdef __POWER8_VECTOR__
 
-template<int N>
+template <int N>
 EIGEN_STRONG_INLINE Packet2l plogical_shift_left(const Packet2l& a) {
-  const Packet2ul shift = { N, N };
-  return vec_sl(a, shift); 
+  const Packet2ul shift = {N, N};
+  return vec_sl(a, shift);
 }
 
-template<int N>
+template <int N>
 EIGEN_STRONG_INLINE Packet2l plogical_shift_right(const Packet2l& a) {
-  const Packet2ul shift = { N, N };
-  return vec_sr(a, shift); 
+  const Packet2ul shift = {N, N};
+  return vec_sr(a, shift);
 }
 
 #else
@@ -3052,34 +3523,32 @@
 // Shifts [A, B, C, D] to [B, 0, D, 0].
 // Used to implement left shifts for Packet2l.
 EIGEN_ALWAYS_INLINE Packet4i shift_even_left(const Packet4i& a) {
-  static const Packet16uc perm = {
-      0x14, 0x15, 0x16, 0x17, 0x00, 0x01, 0x02, 0x03, 
-      0x1c, 0x1d, 0x1e, 0x1f, 0x08, 0x09, 0x0a, 0x0b };
-  #ifdef  _BIG_ENDIAN
-    return vec_perm(p4i_ZERO, a, perm);
-  #else
-    return vec_perm(a, p4i_ZERO, perm);
-  #endif
+  static const Packet16uc perm = {0x14, 0x15, 0x16, 0x17, 0x00, 0x01, 0x02, 0x03,
+                                  0x1c, 0x1d, 0x1e, 0x1f, 0x08, 0x09, 0x0a, 0x0b};
+#ifdef _BIG_ENDIAN
+  return vec_perm(p4i_ZERO, a, perm);
+#else
+  return vec_perm(a, p4i_ZERO, perm);
+#endif
 }
 
 // Shifts [A, B, C, D] to [0, A, 0, C].
 // Used to implement right shifts for Packet2l.
 EIGEN_ALWAYS_INLINE Packet4i shift_odd_right(const Packet4i& a) {
-  static const Packet16uc perm = {
-      0x04, 0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13, 
-      0x0c, 0x0d, 0x0e, 0x0f, 0x18, 0x19, 0x1a, 0x1b };
-  #ifdef  _BIG_ENDIAN
-    return vec_perm(p4i_ZERO, a, perm);
-  #else
-    return vec_perm(a, p4i_ZERO, perm);
-  #endif
+  static const Packet16uc perm = {0x04, 0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13,
+                                  0x0c, 0x0d, 0x0e, 0x0f, 0x18, 0x19, 0x1a, 0x1b};
+#ifdef _BIG_ENDIAN
+  return vec_perm(p4i_ZERO, a, perm);
+#else
+  return vec_perm(a, p4i_ZERO, perm);
+#endif
 }
 
-template<int N, typename EnableIf = void>
+template <int N, typename EnableIf = void>
 struct plogical_shift_left_impl;
 
-template<int N>
-struct plogical_shift_left_impl<N, std::enable_if_t<(N < 32) && (N >= 0)>> {
+template <int N>
+struct plogical_shift_left_impl<N, std::enable_if_t<(N < 32) && (N >= 0)> > {
   static EIGEN_STRONG_INLINE Packet2l run(const Packet2l& a) {
     static const unsigned n = static_cast<unsigned>(N);
     const Packet4ui shift = {n, n, n, n};
@@ -3092,8 +3561,8 @@
   }
 };
 
-template<int N>
-struct plogical_shift_left_impl<N, std::enable_if_t<(N >= 32)>> {
+template <int N>
+struct plogical_shift_left_impl<N, std::enable_if_t<(N >= 32)> > {
   static EIGEN_STRONG_INLINE Packet2l run(const Packet2l& a) {
     static const unsigned m = static_cast<unsigned>(N - 32);
     const Packet4ui shift = {m, m, m, m};
@@ -3102,16 +3571,16 @@
   }
 };
 
-template<int N>
+template <int N>
 EIGEN_STRONG_INLINE Packet2l plogical_shift_left(const Packet2l& a) {
-  return plogical_shift_left_impl<N>::run(a); 
+  return plogical_shift_left_impl<N>::run(a);
 }
 
-template<int N, typename EnableIf = void>
+template <int N, typename EnableIf = void>
 struct plogical_shift_right_impl;
 
-template<int N>
-struct plogical_shift_right_impl<N, std::enable_if_t<(N < 32) && (N >= 0)>> {
+template <int N>
+struct plogical_shift_right_impl<N, std::enable_if_t<(N < 32) && (N >= 0)> > {
   static EIGEN_STRONG_INLINE Packet2l run(const Packet2l& a) {
     static const unsigned n = static_cast<unsigned>(N);
     const Packet4ui shift = {n, n, n, n};
@@ -3124,8 +3593,8 @@
   }
 };
 
-template<int N>
-struct plogical_shift_right_impl<N, std::enable_if_t<(N >= 32)>> {
+template <int N>
+struct plogical_shift_right_impl<N, std::enable_if_t<(N >= 32)> > {
   static EIGEN_STRONG_INLINE Packet2l run(const Packet2l& a) {
     static const unsigned m = static_cast<unsigned>(N - 32);
     const Packet4ui shift = {m, m, m, m};
@@ -3134,69 +3603,71 @@
   }
 };
 
-template<int N>
+template <int N>
 EIGEN_STRONG_INLINE Packet2l plogical_shift_right(const Packet2l& a) {
-  return plogical_shift_right_impl<N>::run(a); 
+  return plogical_shift_right_impl<N>::run(a);
 }
 #endif
 
-template<> EIGEN_STRONG_INLINE Packet2d pldexp<Packet2d>(const Packet2d& a, const Packet2d& exponent) {
+template <>
+EIGEN_STRONG_INLINE Packet2d pldexp<Packet2d>(const Packet2d& a, const Packet2d& exponent) {
   // Clamp exponent to [-2099, 2099]
   const Packet2d max_exponent = pset1<Packet2d>(2099.0);
   const Packet2l e = pcast<Packet2d, Packet2l>(pmin(pmax(exponent, pnegate(max_exponent)), max_exponent));
 
   // Split 2^e into four factors and multiply:
-  const Packet2l  bias = { 1023, 1023 };
+  const Packet2l bias = {1023, 1023};
   Packet2l b = plogical_shift_right<2>(e);  // floor(e/4)
   Packet2d c = reinterpret_cast<Packet2d>(plogical_shift_left<52>(b + bias));
-  Packet2d out = pmul(pmul(pmul(a, c), c), c); // a * 2^(3b)
-  b = psub(psub(psub(e, b), b), b);  // e - 3b
-  c = reinterpret_cast<Packet2d>(plogical_shift_left<52>(b + bias)); // 2^(e - 3b)
-  out = pmul(out, c); // a * 2^e
+  Packet2d out = pmul(pmul(pmul(a, c), c), c);                        // a * 2^(3b)
+  b = psub(psub(psub(e, b), b), b);                                   // e - 3b
+  c = reinterpret_cast<Packet2d>(plogical_shift_left<52>(b + bias));  // 2^(e - 3b)
+  out = pmul(out, c);                                                 // a * 2^e
   return out;
 }
 
-
 // Extract exponent without existence of Packet2l.
-template<>
-EIGEN_STRONG_INLINE  
-Packet2d pfrexp_generic_get_biased_exponent(const Packet2d& a) {
+template <>
+EIGEN_STRONG_INLINE Packet2d pfrexp_generic_get_biased_exponent(const Packet2d& a) {
   return pcast<Packet2l, Packet2d>(plogical_shift_right<52>(reinterpret_cast<Packet2l>(pabs(a))));
 }
 
-template<> EIGEN_STRONG_INLINE Packet2d pfrexp<Packet2d> (const Packet2d& a, Packet2d& exponent) {
+template <>
+EIGEN_STRONG_INLINE Packet2d pfrexp<Packet2d>(const Packet2d& a, Packet2d& exponent) {
   return pfrexp_generic(a, exponent);
 }
 
-template<> EIGEN_STRONG_INLINE double predux<Packet2d>(const Packet2d& a)
-{
+template <>
+EIGEN_STRONG_INLINE double predux<Packet2d>(const Packet2d& a) {
   Packet2d b, sum;
-  b   = reinterpret_cast<Packet2d>(vec_sld(reinterpret_cast<Packet4f>(a), reinterpret_cast<Packet4f>(a), 8));
+  b = reinterpret_cast<Packet2d>(vec_sld(reinterpret_cast<Packet4f>(a), reinterpret_cast<Packet4f>(a), 8));
   sum = a + b;
   return pfirst<Packet2d>(sum);
 }
 
 // Other reduction functions:
 // mul
-template<> EIGEN_STRONG_INLINE double predux_mul<Packet2d>(const Packet2d& a)
-{
-  return pfirst(pmul(a, reinterpret_cast<Packet2d>(vec_sld(reinterpret_cast<Packet4ui>(a), reinterpret_cast<Packet4ui>(a), 8))));
+template <>
+EIGEN_STRONG_INLINE double predux_mul<Packet2d>(const Packet2d& a) {
+  return pfirst(
+      pmul(a, reinterpret_cast<Packet2d>(vec_sld(reinterpret_cast<Packet4ui>(a), reinterpret_cast<Packet4ui>(a), 8))));
 }
 
 // min
-template<> EIGEN_STRONG_INLINE double predux_min<Packet2d>(const Packet2d& a)
-{
-  return pfirst(pmin(a, reinterpret_cast<Packet2d>(vec_sld(reinterpret_cast<Packet4ui>(a), reinterpret_cast<Packet4ui>(a), 8))));
+template <>
+EIGEN_STRONG_INLINE double predux_min<Packet2d>(const Packet2d& a) {
+  return pfirst(
+      pmin(a, reinterpret_cast<Packet2d>(vec_sld(reinterpret_cast<Packet4ui>(a), reinterpret_cast<Packet4ui>(a), 8))));
 }
 
 // max
-template<> EIGEN_STRONG_INLINE double predux_max<Packet2d>(const Packet2d& a)
-{
-  return pfirst(pmax(a, reinterpret_cast<Packet2d>(vec_sld(reinterpret_cast<Packet4ui>(a), reinterpret_cast<Packet4ui>(a), 8))));
+template <>
+EIGEN_STRONG_INLINE double predux_max<Packet2d>(const Packet2d& a) {
+  return pfirst(
+      pmax(a, reinterpret_cast<Packet2d>(vec_sld(reinterpret_cast<Packet4ui>(a), reinterpret_cast<Packet4ui>(a), 8))));
 }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet2d,2>& kernel) {
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet2d, 2>& kernel) {
   Packet2d t0, t1;
   t0 = vec_mergeh(kernel.packet[0], kernel.packet[1]);
   t1 = vec_mergel(kernel.packet[0], kernel.packet[1]);
@@ -3204,16 +3675,17 @@
   kernel.packet[1] = t1;
 }
 
-template<> EIGEN_STRONG_INLINE Packet2d pblend(const Selector<2>& ifPacket, const Packet2d& thenPacket, const Packet2d& elsePacket) {
-  Packet2l select = { ifPacket.select[0], ifPacket.select[1] };
+template <>
+EIGEN_STRONG_INLINE Packet2d pblend(const Selector<2>& ifPacket, const Packet2d& thenPacket,
+                                    const Packet2d& elsePacket) {
+  Packet2l select = {ifPacket.select[0], ifPacket.select[1]};
   Packet2ul mask = reinterpret_cast<Packet2ul>(pnegate(reinterpret_cast<Packet2l>(select)));
   return vec_sel(elsePacket, thenPacket, mask);
 }
 
+#endif  // __VSX__
+}  // end namespace internal
 
-#endif // __VSX__
-} // end namespace internal
+}  // end namespace Eigen
 
-} // end namespace Eigen
-
-#endif // EIGEN_PACKET_MATH_ALTIVEC_H
+#endif  // EIGEN_PACKET_MATH_ALTIVEC_H
diff --git a/Eigen/src/Core/arch/AltiVec/TypeCasting.h b/Eigen/src/Core/arch/AltiVec/TypeCasting.h
index 361c69f..fdabeb9 100644
--- a/Eigen/src/Core/arch/AltiVec/TypeCasting.h
+++ b/Eigen/src/Core/arch/AltiVec/TypeCasting.h
@@ -19,57 +19,46 @@
 namespace internal {
 template <>
 struct type_casting_traits<float, int> {
-  enum {
-    VectorizedCast = 1,
-    SrcCoeffRatio = 1,
-    TgtCoeffRatio = 1
-  };
+  enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
 };
 
 template <>
 struct type_casting_traits<int, float> {
-  enum {
-    VectorizedCast = 1,
-    SrcCoeffRatio = 1,
-    TgtCoeffRatio = 1
-  };
+  enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
 };
 
 template <>
 struct type_casting_traits<bfloat16, unsigned short int> {
-  enum {
-    VectorizedCast = 1,
-    SrcCoeffRatio = 1,
-    TgtCoeffRatio = 1
-  };
+  enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
 };
 
 template <>
 struct type_casting_traits<unsigned short int, bfloat16> {
-  enum {
-    VectorizedCast = 1,
-    SrcCoeffRatio = 1,
-    TgtCoeffRatio = 1
-  };
+  enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 1 };
 };
 
-template<> EIGEN_STRONG_INLINE Packet4i pcast<Packet4f, Packet4i>(const Packet4f& a) {
-  return vec_cts(a,0);
+template <>
+EIGEN_STRONG_INLINE Packet4i pcast<Packet4f, Packet4i>(const Packet4f& a) {
+  return vec_cts(a, 0);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4ui pcast<Packet4f, Packet4ui>(const Packet4f& a) {
-  return vec_ctu(a,0);
+template <>
+EIGEN_STRONG_INLINE Packet4ui pcast<Packet4f, Packet4ui>(const Packet4f& a) {
+  return vec_ctu(a, 0);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pcast<Packet4i, Packet4f>(const Packet4i& a) {
-  return vec_ctf(a,0);
+template <>
+EIGEN_STRONG_INLINE Packet4f pcast<Packet4i, Packet4f>(const Packet4i& a) {
+  return vec_ctf(a, 0);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pcast<Packet4ui, Packet4f>(const Packet4ui& a) {
-  return vec_ctf(a,0);
+template <>
+EIGEN_STRONG_INLINE Packet4f pcast<Packet4ui, Packet4f>(const Packet4ui& a) {
+  return vec_ctf(a, 0);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8us pcast<Packet8bf, Packet8us>(const Packet8bf& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8us pcast<Packet8bf, Packet8us>(const Packet8bf& a) {
   Packet4f float_even = Bf16ToF32Even(a);
   Packet4f float_odd = Bf16ToF32Odd(a);
   Packet4ui int_even = pcast<Packet4f, Packet4ui>(float_even);
@@ -78,13 +67,13 @@
   Packet4ui low_even = pand<Packet4ui>(int_even, p4ui_low_mask);
   Packet4ui low_odd = pand<Packet4ui>(int_odd, p4ui_low_mask);
 
-  //Check values that are bigger than USHRT_MAX (0xFFFF)
+  // Check values that are bigger than USHRT_MAX (0xFFFF)
   Packet4bi overflow_selector;
-  if(vec_any_gt(int_even, p4ui_low_mask)){
+  if (vec_any_gt(int_even, p4ui_low_mask)) {
     overflow_selector = vec_cmpgt(int_even, p4ui_low_mask);
     low_even = vec_sel(low_even, p4ui_low_mask, overflow_selector);
   }
-  if(vec_any_gt(int_odd, p4ui_low_mask)){
+  if (vec_any_gt(int_odd, p4ui_low_mask)) {
     overflow_selector = vec_cmpgt(int_odd, p4ui_low_mask);
     low_odd = vec_sel(low_even, p4ui_low_mask, overflow_selector);
   }
@@ -92,8 +81,9 @@
   return pmerge(low_even, low_odd);
 }
 
-template<> EIGEN_STRONG_INLINE Packet8bf pcast<Packet8us, Packet8bf>(const Packet8us& a) {
-  //short -> int -> float -> bfloat16
+template <>
+EIGEN_STRONG_INLINE Packet8bf pcast<Packet8us, Packet8bf>(const Packet8us& a) {
+  // short -> int -> float -> bfloat16
   const EIGEN_DECLARE_CONST_FAST_Packet4ui(low_mask, 0x0000FFFF);
   Packet4ui int_cast = reinterpret_cast<Packet4ui>(a);
   Packet4ui int_even = pand<Packet4ui>(int_cast, p4ui_low_mask);
@@ -105,14 +95,11 @@
 
 template <>
 struct type_casting_traits<bfloat16, float> {
-  enum {
-    VectorizedCast = 1,
-    SrcCoeffRatio = 1,
-    TgtCoeffRatio = 2
-  };
+  enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
 };
 
-template<> EIGEN_STRONG_INLINE Packet4f pcast<Packet8bf, Packet4f>(const Packet8bf& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4f pcast<Packet8bf, Packet4f>(const Packet8bf& a) {
   Packet8us z = pset1<Packet8us>(0);
 #ifdef _BIG_ENDIAN
   return reinterpret_cast<Packet4f>(vec_mergeh(a.m_val, z));
@@ -123,22 +110,21 @@
 
 template <>
 struct type_casting_traits<float, bfloat16> {
-  enum {
-    VectorizedCast = 1,
-    SrcCoeffRatio = 2,
-    TgtCoeffRatio = 1
-  };
+  enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
 };
 
-template<> EIGEN_STRONG_INLINE Packet8bf pcast<Packet4f, Packet8bf>(const Packet4f& a, const Packet4f &b) {
+template <>
+EIGEN_STRONG_INLINE Packet8bf pcast<Packet4f, Packet8bf>(const Packet4f& a, const Packet4f& b) {
   return F32ToBf16Both(a, b);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4i preinterpret<Packet4i,Packet4f>(const Packet4f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4i preinterpret<Packet4i, Packet4f>(const Packet4f& a) {
   return reinterpret_cast<Packet4i>(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f preinterpret<Packet4f,Packet4i>(const Packet4i& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4f preinterpret<Packet4f, Packet4i>(const Packet4i& a) {
   return reinterpret_cast<Packet4f>(a);
 }
 
@@ -149,31 +135,29 @@
 // a slow version that works with older compilers.
 // Update: apparently vec_cts/vec_ctf intrinsics for 64-bit doubles
 // are buggy, https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70963
-template<>
+template <>
 inline Packet2l pcast<Packet2d, Packet2l>(const Packet2d& x) {
-#if EIGEN_GNUC_STRICT_AT_LEAST(7,1,0)
-  return vec_cts(x, 0);    // TODO: check clang version.
+#if EIGEN_GNUC_STRICT_AT_LEAST(7, 1, 0)
+  return vec_cts(x, 0);  // TODO: check clang version.
 #else
   double tmp[2];
   memcpy(tmp, &x, sizeof(tmp));
-  Packet2l l = { static_cast<long long>(tmp[0]),
-                 static_cast<long long>(tmp[1]) };
+  Packet2l l = {static_cast<long long>(tmp[0]), static_cast<long long>(tmp[1])};
   return l;
 #endif
 }
 
-template<>
+template <>
 inline Packet2d pcast<Packet2l, Packet2d>(const Packet2l& x) {
   unsigned long long tmp[2];
   memcpy(tmp, &x, sizeof(tmp));
-  Packet2d d = { static_cast<double>(tmp[0]),
-                 static_cast<double>(tmp[1]) };
+  Packet2d d = {static_cast<double>(tmp[0]), static_cast<double>(tmp[1])};
   return d;
 }
 #endif
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_TYPE_CASTING_ALTIVEC_H
+#endif  // EIGEN_TYPE_CASTING_ALTIVEC_H
diff --git a/Eigen/src/Core/arch/Default/BFloat16.h b/Eigen/src/Core/arch/Default/BFloat16.h
index 93e8714..68b48f9 100644
--- a/Eigen/src/Core/arch/Default/BFloat16.h
+++ b/Eigen/src/Core/arch/Default/BFloat16.h
@@ -26,16 +26,16 @@
 // As a consequence, we get compile failures when compiling Eigen with
 // GPU support. Hence the need to disable EIGEN_CONSTEXPR when building
 // Eigen with GPU support
-  #pragma push_macro("EIGEN_CONSTEXPR")
-  #undef EIGEN_CONSTEXPR
-  #define EIGEN_CONSTEXPR
+#pragma push_macro("EIGEN_CONSTEXPR")
+#undef EIGEN_CONSTEXPR
+#define EIGEN_CONSTEXPR
 #endif
 
-#define BF16_PACKET_FUNCTION(PACKET_F, PACKET_BF16, METHOD)         \
-  template <>                                                       \
-  EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED  \
-  PACKET_BF16 METHOD<PACKET_BF16>(const PACKET_BF16& _x) {          \
-    return F32ToBf16(METHOD<PACKET_F>(Bf16ToF32(_x)));              \
+#define BF16_PACKET_FUNCTION(PACKET_F, PACKET_BF16, METHOD)                                         \
+  template <>                                                                                       \
+  EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED PACKET_BF16 METHOD<PACKET_BF16>( \
+      const PACKET_BF16& _x) {                                                                      \
+    return F32ToBf16(METHOD<PACKET_F>(Bf16ToF32(_x)));                                              \
   }
 
 // Only use HIP GPU bf16 in kernels
@@ -77,7 +77,7 @@
   unsigned short value;
 };
 
-#endif // defined(EIGEN_USE_HIP_BF16)
+#endif  // defined(EIGEN_USE_HIP_BF16)
 
 EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR __bfloat16_raw raw_uint16_to_bfloat16(unsigned short value);
 template <bool AssumeArgumentIsNormalOrInfinityOrZero>
@@ -95,11 +95,10 @@
   EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR bfloat16_base(const __bfloat16_raw& h) : __bfloat16_raw(h) {}
 };
 
-} // namespace bfloat16_impl
+}  // namespace bfloat16_impl
 
 // Class definition.
 struct bfloat16 : public bfloat16_impl::bfloat16_base {
-
   typedef bfloat16_impl::__bfloat16_raw __bfloat16_raw;
 
   EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR bfloat16() {}
@@ -109,16 +108,17 @@
   explicit EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR bfloat16(bool b)
       : bfloat16_impl::bfloat16_base(bfloat16_impl::raw_uint16_to_bfloat16(b ? 0x3f80 : 0)) {}
 
-  template<class T>
+  template <class T>
   explicit EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR bfloat16(T val)
-      : bfloat16_impl::bfloat16_base(bfloat16_impl::float_to_bfloat16_rtne<internal::is_integral<T>::value>(static_cast<float>(val))) {}
+      : bfloat16_impl::bfloat16_base(
+            bfloat16_impl::float_to_bfloat16_rtne<internal::is_integral<T>::value>(static_cast<float>(val))) {}
 
   explicit EIGEN_DEVICE_FUNC bfloat16(float f)
       : bfloat16_impl::bfloat16_base(bfloat16_impl::float_to_bfloat16_rtne<false>(f)) {}
 
   // Following the convention of numpy, converting between complex and
   // float will lead to loss of imag value.
-  template<typename RealScalar>
+  template <typename RealScalar>
   explicit EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR bfloat16(const std::complex<RealScalar>& val)
       : bfloat16_impl::bfloat16_base(bfloat16_impl::float_to_bfloat16_rtne<false>(static_cast<float>(val.real()))) {}
 
@@ -160,62 +160,64 @@
   // detect tininess in the same way for all operations in radix two"
   static EIGEN_CONSTEXPR const bool tinyness_before = std::numeric_limits<float>::tinyness_before;
 
-  static EIGEN_CONSTEXPR Eigen::bfloat16 (min)() { return Eigen::bfloat16_impl::raw_uint16_to_bfloat16(0x0080); }
+  static EIGEN_CONSTEXPR Eigen::bfloat16(min)() { return Eigen::bfloat16_impl::raw_uint16_to_bfloat16(0x0080); }
   static EIGEN_CONSTEXPR Eigen::bfloat16 lowest() { return Eigen::bfloat16_impl::raw_uint16_to_bfloat16(0xff7f); }
-  static EIGEN_CONSTEXPR Eigen::bfloat16 (max)() { return Eigen::bfloat16_impl::raw_uint16_to_bfloat16(0x7f7f); }
+  static EIGEN_CONSTEXPR Eigen::bfloat16(max)() { return Eigen::bfloat16_impl::raw_uint16_to_bfloat16(0x7f7f); }
   static EIGEN_CONSTEXPR Eigen::bfloat16 epsilon() { return Eigen::bfloat16_impl::raw_uint16_to_bfloat16(0x3c00); }
   static EIGEN_CONSTEXPR Eigen::bfloat16 round_error() { return Eigen::bfloat16_impl::raw_uint16_to_bfloat16(0x3f00); }
   static EIGEN_CONSTEXPR Eigen::bfloat16 infinity() { return Eigen::bfloat16_impl::raw_uint16_to_bfloat16(0x7f80); }
   static EIGEN_CONSTEXPR Eigen::bfloat16 quiet_NaN() { return Eigen::bfloat16_impl::raw_uint16_to_bfloat16(0x7fc0); }
-  static EIGEN_CONSTEXPR Eigen::bfloat16 signaling_NaN() { return Eigen::bfloat16_impl::raw_uint16_to_bfloat16(0x7fa0); }
+  static EIGEN_CONSTEXPR Eigen::bfloat16 signaling_NaN() {
+    return Eigen::bfloat16_impl::raw_uint16_to_bfloat16(0x7fa0);
+  }
   static EIGEN_CONSTEXPR Eigen::bfloat16 denorm_min() { return Eigen::bfloat16_impl::raw_uint16_to_bfloat16(0x0001); }
 };
 
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const bool numeric_limits_bfloat16_impl<T>::is_specialized;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const bool numeric_limits_bfloat16_impl<T>::is_signed;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const bool numeric_limits_bfloat16_impl<T>::is_integer;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const bool numeric_limits_bfloat16_impl<T>::is_exact;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const bool numeric_limits_bfloat16_impl<T>::has_infinity;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const bool numeric_limits_bfloat16_impl<T>::has_quiet_NaN;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const bool numeric_limits_bfloat16_impl<T>::has_signaling_NaN;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const std::float_denorm_style numeric_limits_bfloat16_impl<T>::has_denorm;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const bool numeric_limits_bfloat16_impl<T>::has_denorm_loss;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const std::float_round_style numeric_limits_bfloat16_impl<T>::round_style;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const bool numeric_limits_bfloat16_impl<T>::is_iec559;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const bool numeric_limits_bfloat16_impl<T>::is_bounded;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const bool numeric_limits_bfloat16_impl<T>::is_modulo;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const int numeric_limits_bfloat16_impl<T>::digits;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const int numeric_limits_bfloat16_impl<T>::digits10;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const int numeric_limits_bfloat16_impl<T>::max_digits10;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const int numeric_limits_bfloat16_impl<T>::radix;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const int numeric_limits_bfloat16_impl<T>::min_exponent;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const int numeric_limits_bfloat16_impl<T>::min_exponent10;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const int numeric_limits_bfloat16_impl<T>::max_exponent;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const int numeric_limits_bfloat16_impl<T>::max_exponent10;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const bool numeric_limits_bfloat16_impl<T>::traps;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const bool numeric_limits_bfloat16_impl<T>::tinyness_before;
 }  // end namespace bfloat16_impl
 }  // end namespace Eigen
@@ -225,13 +227,13 @@
 // std::numeric_limits<const T>, std::numeric_limits<volatile T>, and
 // std::numeric_limits<const volatile T>
 // https://stackoverflow.com/a/16519653/
-template<>
+template <>
 class numeric_limits<Eigen::bfloat16> : public Eigen::bfloat16_impl::numeric_limits_bfloat16_impl<> {};
-template<>
+template <>
 class numeric_limits<const Eigen::bfloat16> : public numeric_limits<Eigen::bfloat16> {};
-template<>
+template <>
 class numeric_limits<volatile Eigen::bfloat16> : public numeric_limits<Eigen::bfloat16> {};
-template<>
+template <>
 class numeric_limits<const volatile Eigen::bfloat16> : public numeric_limits<Eigen::bfloat16> {};
 }  // end namespace std
 
@@ -242,7 +244,7 @@
 // We need to distinguish ‘clang as the CUDA compiler’ from ‘clang as the host compiler,
 // invoked by NVCC’ (e.g. on MacOS). The former needs to see both host and device implementation
 // of the functions, while the latter can only deal with one of them.
-#if !defined(EIGEN_HAS_NATIVE_BF16) || (EIGEN_COMP_CLANG && !EIGEN_COMP_NVCC) // Emulate support for bfloat16 floats
+#if !defined(EIGEN_HAS_NATIVE_BF16) || (EIGEN_COMP_CLANG && !EIGEN_COMP_NVCC)  // Emulate support for bfloat16 floats
 
 #if EIGEN_COMP_CLANG && defined(EIGEN_CUDACC)
 // We need to provide emulated *host-side* BF16 operators for clang.
@@ -250,7 +252,7 @@
 #undef EIGEN_DEVICE_FUNC
 #if (defined(EIGEN_HAS_GPU_BF16) && defined(EIGEN_HAS_NATIVE_BF16))
 #define EIGEN_DEVICE_FUNC __host__
-#else // both host and device need emulated ops.
+#else  // both host and device need emulated ops.
 #define EIGEN_DEVICE_FUNC __host__ __device__
 #endif
 #endif
@@ -258,41 +260,41 @@
 // Definitions for CPUs, mostly working through conversion
 // to/from fp32.
 
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 operator + (const bfloat16& a, const bfloat16& b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 operator+(const bfloat16& a, const bfloat16& b) {
   return bfloat16(float(a) + float(b));
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 operator + (const bfloat16& a, const int& b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 operator+(const bfloat16& a, const int& b) {
   return bfloat16(float(a) + static_cast<float>(b));
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 operator + (const int& a, const bfloat16& b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 operator+(const int& a, const bfloat16& b) {
   return bfloat16(static_cast<float>(a) + float(b));
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 operator * (const bfloat16& a, const bfloat16& b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 operator*(const bfloat16& a, const bfloat16& b) {
   return bfloat16(float(a) * float(b));
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 operator - (const bfloat16& a, const bfloat16& b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 operator-(const bfloat16& a, const bfloat16& b) {
   return bfloat16(float(a) - float(b));
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 operator / (const bfloat16& a, const bfloat16& b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 operator/(const bfloat16& a, const bfloat16& b) {
   return bfloat16(float(a) / float(b));
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 operator - (const bfloat16& a) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 operator-(const bfloat16& a) {
   numext::uint16_t x = numext::bit_cast<uint16_t>(a) ^ 0x8000;
   return numext::bit_cast<bfloat16>(x);
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16& operator += (bfloat16& a, const bfloat16& b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16& operator+=(bfloat16& a, const bfloat16& b) {
   a = bfloat16(float(a) + float(b));
   return a;
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16& operator *= (bfloat16& a, const bfloat16& b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16& operator*=(bfloat16& a, const bfloat16& b) {
   a = bfloat16(float(a) * float(b));
   return a;
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16& operator -= (bfloat16& a, const bfloat16& b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16& operator-=(bfloat16& a, const bfloat16& b) {
   a = bfloat16(float(a) - float(b));
   return a;
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16& operator /= (bfloat16& a, const bfloat16& b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16& operator/=(bfloat16& a, const bfloat16& b) {
   a = bfloat16(float(a) / float(b));
   return a;
 }
@@ -314,22 +316,22 @@
   --a;
   return original_value;
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator == (const bfloat16& a, const bfloat16& b) {
-  return numext::equal_strict(float(a),float(b));
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator==(const bfloat16& a, const bfloat16& b) {
+  return numext::equal_strict(float(a), float(b));
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator != (const bfloat16& a, const bfloat16& b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator!=(const bfloat16& a, const bfloat16& b) {
   return numext::not_equal_strict(float(a), float(b));
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator < (const bfloat16& a, const bfloat16& b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator<(const bfloat16& a, const bfloat16& b) {
   return float(a) < float(b);
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator <= (const bfloat16& a, const bfloat16& b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator<=(const bfloat16& a, const bfloat16& b) {
   return float(a) <= float(b);
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator > (const bfloat16& a, const bfloat16& b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator>(const bfloat16& a, const bfloat16& b) {
   return float(a) > float(b);
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator >= (const bfloat16& a, const bfloat16& b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator>=(const bfloat16& a, const bfloat16& b) {
   return float(a) >= float(b);
 }
 
@@ -340,7 +342,7 @@
 
 // Division by an index. Do it in full float precision to avoid accuracy
 // issues in converting the denominator to bfloat16.
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 operator / (const bfloat16& a, Index b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 operator/(const bfloat16& a, Index b) {
   return bfloat16(static_cast<float>(a) / static_cast<float>(b));
 }
 
@@ -350,7 +352,7 @@
 #else
   __bfloat16_raw output;
   if (numext::isnan EIGEN_NOT_A_MACRO(v)) {
-    output.value = std::signbit(v) ? 0xFFC0: 0x7FC0;
+    output.value = std::signbit(v) ? 0xFFC0 : 0x7FC0;
     return output;
   }
   output.value = static_cast<numext::uint16_t>(numext::bit_cast<numext::uint32_t>(v) >> 16);
@@ -368,7 +370,8 @@
 #endif
 }
 
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR numext::uint16_t raw_bfloat16_as_uint16(const __bfloat16_raw& bf) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR numext::uint16_t raw_bfloat16_as_uint16(
+    const __bfloat16_raw& bf) {
 #if defined(EIGEN_USE_HIP_BF16)
   return bf.data;
 #else
@@ -391,7 +394,7 @@
     //
     // qNaN magic: All exponent bits set + most significant bit of fraction
     // set.
-    output.value = std::signbit(ff) ? 0xFFC0: 0x7FC0;
+    output.value = std::signbit(ff) ? 0xFFC0 : 0x7FC0;
   } else {
     // Fast rounding algorithm that rounds a half value to nearest even. This
     // reduces expected error when we convert a large number of floats. Here
@@ -555,140 +558,96 @@
 template <>
 EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC __bfloat16_raw float_to_bfloat16_rtne<true>(float ff) {
 #if defined(EIGEN_USE_HIP_BF16)
-    return __bfloat16_raw(__bfloat16_raw::round_to_bfloat16(ff));
+  return __bfloat16_raw(__bfloat16_raw::round_to_bfloat16(ff));
 #else
-    numext::uint32_t input = numext::bit_cast<numext::uint32_t>(ff);
-    __bfloat16_raw output;
+  numext::uint32_t input = numext::bit_cast<numext::uint32_t>(ff);
+  __bfloat16_raw output;
 
-    // Least significant bit of resulting bfloat.
-    numext::uint32_t lsb = (input >> 16) & 1;
-    numext::uint32_t rounding_bias = 0x7fff + lsb;
-    input += rounding_bias;
-    output.value = static_cast<numext::uint16_t>(input >> 16);
-    return output;
+  // Least significant bit of resulting bfloat.
+  numext::uint32_t lsb = (input >> 16) & 1;
+  numext::uint32_t rounding_bias = 0x7fff + lsb;
+  input += rounding_bias;
+  output.value = static_cast<numext::uint16_t>(input >> 16);
+  return output;
 #endif
 }
 
 EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC float bfloat16_to_float(__bfloat16_raw h) {
 #if defined(EIGEN_USE_HIP_BF16)
-    return static_cast<float>(h);
+  return static_cast<float>(h);
 #else
-    return numext::bit_cast<float>(static_cast<numext::uint32_t>(h.value) << 16);
+  return numext::bit_cast<float>(static_cast<numext::uint32_t>(h.value) << 16);
 #endif
 }
 
 // --- standard functions ---
 
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool (isinf)(const bfloat16& a) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool(isinf)(const bfloat16& a) {
   EIGEN_USING_STD(isinf);
 #if defined(EIGEN_USE_HIP_BF16)
-  return (isinf)(a); // Uses HIP hip_bfloat16 isinf operator
+  return (isinf)(a);  // Uses HIP hip_bfloat16 isinf operator
 #else
   return (isinf)(float(a));
 #endif
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool (isnan)(const bfloat16& a) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool(isnan)(const bfloat16& a) {
   EIGEN_USING_STD(isnan);
 #if defined(EIGEN_USE_HIP_BF16)
-  return (isnan)(a); // Uses HIP hip_bfloat16 isnan operator
+  return (isnan)(a);  // Uses HIP hip_bfloat16 isnan operator
 #else
   return (isnan)(float(a));
 #endif
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool (isfinite)(const bfloat16& a) {
-  return !(isinf EIGEN_NOT_A_MACRO (a)) && !(isnan EIGEN_NOT_A_MACRO (a));
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool(isfinite)(const bfloat16& a) {
+  return !(isinf EIGEN_NOT_A_MACRO(a)) && !(isnan EIGEN_NOT_A_MACRO(a));
 }
 
 EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 abs(const bfloat16& a) {
   numext::uint16_t x = numext::bit_cast<numext::uint16_t>(a) & 0x7FFF;
   return numext::bit_cast<bfloat16>(x);
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 exp(const bfloat16& a) {
-  return bfloat16(::expf(float(a)));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 expm1(const bfloat16& a) {
-  return bfloat16(numext::expm1(float(a)));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 log(const bfloat16& a) {
-  return bfloat16(::logf(float(a)));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 log1p(const bfloat16& a) {
-  return bfloat16(numext::log1p(float(a)));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 log10(const bfloat16& a) {
-  return bfloat16(::log10f(float(a)));
-}
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 exp(const bfloat16& a) { return bfloat16(::expf(float(a))); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 expm1(const bfloat16& a) { return bfloat16(numext::expm1(float(a))); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 log(const bfloat16& a) { return bfloat16(::logf(float(a))); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 log1p(const bfloat16& a) { return bfloat16(numext::log1p(float(a))); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 log10(const bfloat16& a) { return bfloat16(::log10f(float(a))); }
 EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 log2(const bfloat16& a) {
   return bfloat16(static_cast<float>(EIGEN_LOG2E) * ::logf(float(a)));
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 sqrt(const bfloat16& a) {
-  return bfloat16(::sqrtf(float(a)));
-}
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 sqrt(const bfloat16& a) { return bfloat16(::sqrtf(float(a))); }
 EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 pow(const bfloat16& a, const bfloat16& b) {
   return bfloat16(::powf(float(a), float(b)));
 }
 EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 atan2(const bfloat16& a, const bfloat16& b) {
   return bfloat16(::atan2f(float(a), float(b)));
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 sin(const bfloat16& a) {
-  return bfloat16(::sinf(float(a)));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 cos(const bfloat16& a) {
-  return bfloat16(::cosf(float(a)));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 tan(const bfloat16& a) {
-  return bfloat16(::tanf(float(a)));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 asin(const bfloat16& a) {
-  return bfloat16(::asinf(float(a)));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 acos(const bfloat16& a) {
-  return bfloat16(::acosf(float(a)));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 atan(const bfloat16& a) {
-  return bfloat16(::atanf(float(a)));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 sinh(const bfloat16& a) {
-  return bfloat16(::sinhf(float(a)));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 cosh(const bfloat16& a) {
-  return bfloat16(::coshf(float(a)));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 tanh(const bfloat16& a) {
-  return bfloat16(::tanhf(float(a)));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 asinh(const bfloat16& a) {
-  return bfloat16(::asinhf(float(a)));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 acosh(const bfloat16& a) {
-  return bfloat16(::acoshf(float(a)));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 atanh(const bfloat16& a) {
-  return bfloat16(::atanhf(float(a)));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 floor(const bfloat16& a) {
-  return bfloat16(::floorf(float(a)));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 ceil(const bfloat16& a) {
-  return bfloat16(::ceilf(float(a)));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 rint(const bfloat16& a) {
-  return bfloat16(::rintf(float(a)));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 round(const bfloat16& a) {
-  return bfloat16(::roundf(float(a)));
-}
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 sin(const bfloat16& a) { return bfloat16(::sinf(float(a))); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 cos(const bfloat16& a) { return bfloat16(::cosf(float(a))); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 tan(const bfloat16& a) { return bfloat16(::tanf(float(a))); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 asin(const bfloat16& a) { return bfloat16(::asinf(float(a))); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 acos(const bfloat16& a) { return bfloat16(::acosf(float(a))); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 atan(const bfloat16& a) { return bfloat16(::atanf(float(a))); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 sinh(const bfloat16& a) { return bfloat16(::sinhf(float(a))); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 cosh(const bfloat16& a) { return bfloat16(::coshf(float(a))); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 tanh(const bfloat16& a) { return bfloat16(::tanhf(float(a))); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 asinh(const bfloat16& a) { return bfloat16(::asinhf(float(a))); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 acosh(const bfloat16& a) { return bfloat16(::acoshf(float(a))); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 atanh(const bfloat16& a) { return bfloat16(::atanhf(float(a))); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 floor(const bfloat16& a) { return bfloat16(::floorf(float(a))); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 ceil(const bfloat16& a) { return bfloat16(::ceilf(float(a))); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 rint(const bfloat16& a) { return bfloat16(::rintf(float(a))); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 round(const bfloat16& a) { return bfloat16(::roundf(float(a))); }
 EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 fmod(const bfloat16& a, const bfloat16& b) {
   return bfloat16(::fmodf(float(a), float(b)));
 }
 
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 (min)(const bfloat16& a, const bfloat16& b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16(min)(const bfloat16& a, const bfloat16& b) {
   const float f1 = static_cast<float>(a);
   const float f2 = static_cast<float>(b);
   return f2 < f1 ? b : a;
 }
 
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 (max)(const bfloat16& a, const bfloat16& b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16(max)(const bfloat16& a, const bfloat16& b) {
   const float f1 = static_cast<float>(a);
   const float f2 = static_cast<float>(b);
   return f1 < f2 ? b : a;
@@ -707,42 +666,34 @@
 }
 
 #ifndef EIGEN_NO_IO
-EIGEN_ALWAYS_INLINE std::ostream& operator << (std::ostream& os, const bfloat16& v) {
+EIGEN_ALWAYS_INLINE std::ostream& operator<<(std::ostream& os, const bfloat16& v) {
   os << static_cast<float>(v);
   return os;
 }
 #endif
 
-} // namespace bfloat16_impl
+}  // namespace bfloat16_impl
 
 namespace internal {
 
-template<>
-struct random_default_impl<bfloat16, false, false>
-{
-  static inline bfloat16 run(const bfloat16& x, const bfloat16& y)
-  {
-    return x + (y-x) * bfloat16(float(std::rand()) / float(RAND_MAX));
+template <>
+struct random_default_impl<bfloat16, false, false> {
+  static inline bfloat16 run(const bfloat16& x, const bfloat16& y) {
+    return x + (y - x) * bfloat16(float(std::rand()) / float(RAND_MAX));
   }
-  static inline bfloat16 run()
-  {
-    return run(bfloat16(-1.f), bfloat16(1.f));
-  }
+  static inline bfloat16 run() { return run(bfloat16(-1.f), bfloat16(1.f)); }
 };
 
-template<> struct is_arithmetic<bfloat16> { enum { value = true }; };
+template <>
+struct is_arithmetic<bfloat16> {
+  enum { value = true };
+};
 
-} // namespace internal
+}  // namespace internal
 
-template<> struct NumTraits<Eigen::bfloat16>
-    : GenericNumTraits<Eigen::bfloat16>
-{
-  enum {
-    IsSigned = true,
-    IsInteger = false,
-    IsComplex = false,
-    RequireInitialization = false
-  };
+template <>
+struct NumTraits<Eigen::bfloat16> : GenericNumTraits<Eigen::bfloat16> {
+  enum { IsSigned = true, IsInteger = false, IsComplex = false, RequireInitialization = false };
 
   EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static EIGEN_STRONG_INLINE Eigen::bfloat16 epsilon() {
     return bfloat16_impl::raw_uint16_to_bfloat16(0x3c00);
@@ -764,31 +715,27 @@
   }
 };
 
-} // namespace Eigen
-
+}  // namespace Eigen
 
 #if defined(EIGEN_HAS_HIP_BF16)
-  #pragma pop_macro("EIGEN_CONSTEXPR")
+#pragma pop_macro("EIGEN_CONSTEXPR")
 #endif
 
 namespace Eigen {
 namespace numext {
 
-template<>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-bool (isnan)(const Eigen::bfloat16& h) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool(isnan)(const Eigen::bfloat16& h) {
   return (bfloat16_impl::isnan)(h);
 }
 
-template<>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-bool (isinf)(const Eigen::bfloat16& h) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool(isinf)(const Eigen::bfloat16& h) {
   return (bfloat16_impl::isinf)(h);
 }
 
-template<>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-bool (isfinite)(const Eigen::bfloat16& h) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool(isfinite)(const Eigen::bfloat16& h) {
   return (bfloat16_impl::isfinite)(h);
 }
 
@@ -813,7 +760,7 @@
     return static_cast<std::size_t>(Eigen::numext::bit_cast<Eigen::numext::uint16_t>(a));
   }
 };
-} // namespace std
+}  // namespace std
 #endif
 
 // Add the missing shfl* intrinsics.
@@ -831,34 +778,39 @@
 
 #if defined(EIGEN_HAS_HIP_BF16)
 
-__device__ EIGEN_STRONG_INLINE Eigen::bfloat16 __shfl(Eigen::bfloat16 var, int srcLane, int width=warpSize) {
+__device__ EIGEN_STRONG_INLINE Eigen::bfloat16 __shfl(Eigen::bfloat16 var, int srcLane, int width = warpSize) {
   const int ivar = static_cast<int>(Eigen::numext::bit_cast<Eigen::numext::uint16_t>(var));
   return Eigen::numext::bit_cast<Eigen::bfloat16>(static_cast<Eigen::numext::uint16_t>(__shfl(ivar, srcLane, width)));
 }
 
-__device__ EIGEN_STRONG_INLINE Eigen::bfloat16 __shfl_up(Eigen::bfloat16 var, unsigned int delta, int width=warpSize) {
+__device__ EIGEN_STRONG_INLINE Eigen::bfloat16 __shfl_up(Eigen::bfloat16 var, unsigned int delta,
+                                                         int width = warpSize) {
   const int ivar = static_cast<int>(Eigen::numext::bit_cast<Eigen::numext::uint16_t>(var));
   return Eigen::numext::bit_cast<Eigen::bfloat16>(static_cast<Eigen::numext::uint16_t>(__shfl_up(ivar, delta, width)));
 }
 
-__device__ EIGEN_STRONG_INLINE Eigen::bfloat16 __shfl_down(Eigen::bfloat16 var, unsigned int delta, int width=warpSize) {
+__device__ EIGEN_STRONG_INLINE Eigen::bfloat16 __shfl_down(Eigen::bfloat16 var, unsigned int delta,
+                                                           int width = warpSize) {
   const int ivar = static_cast<int>(Eigen::numext::bit_cast<Eigen::numext::uint16_t>(var));
-  return Eigen::numext::bit_cast<Eigen::bfloat16>(static_cast<Eigen::numext::uint16_t>(__shfl_down(ivar, delta, width)));
+  return Eigen::numext::bit_cast<Eigen::bfloat16>(
+      static_cast<Eigen::numext::uint16_t>(__shfl_down(ivar, delta, width)));
 }
 
-__device__ EIGEN_STRONG_INLINE Eigen::bfloat16 __shfl_xor(Eigen::bfloat16 var, int laneMask, int width=warpSize) {
+__device__ EIGEN_STRONG_INLINE Eigen::bfloat16 __shfl_xor(Eigen::bfloat16 var, int laneMask, int width = warpSize) {
   const int ivar = static_cast<int>(Eigen::numext::bit_cast<Eigen::numext::uint16_t>(var));
-  return Eigen::numext::bit_cast<Eigen::bfloat16>(static_cast<Eigen::numext::uint16_t>(__shfl_xor(ivar, laneMask, width)));
+  return Eigen::numext::bit_cast<Eigen::bfloat16>(
+      static_cast<Eigen::numext::uint16_t>(__shfl_xor(ivar, laneMask, width)));
 }
 
-#endif // HIP
+#endif  // HIP
 
-#endif // __shfl*
+#endif  // __shfl*
 
 #if defined(EIGEN_HIPCC)
 EIGEN_STRONG_INLINE __device__ Eigen::bfloat16 __ldg(const Eigen::bfloat16* ptr) {
-  return Eigen::bfloat16_impl::raw_uint16_to_bfloat16(__ldg(Eigen::numext::bit_cast<const Eigen::numext::uint16_t*>(ptr)));
+  return Eigen::bfloat16_impl::raw_uint16_to_bfloat16(
+      __ldg(Eigen::numext::bit_cast<const Eigen::numext::uint16_t*>(ptr)));
 }
-#endif // __ldg
+#endif  // __ldg
 
-#endif // EIGEN_BFLOAT16_H
+#endif  // EIGEN_BFLOAT16_H
diff --git a/Eigen/src/Core/arch/Default/ConjHelper.h b/Eigen/src/Core/arch/Default/ConjHelper.h
index 84da47f..fd7923e 100644
--- a/Eigen/src/Core/arch/Default/ConjHelper.h
+++ b/Eigen/src/Core/arch/Default/ConjHelper.h
@@ -11,31 +11,25 @@
 #ifndef EIGEN_ARCH_CONJ_HELPER_H
 #define EIGEN_ARCH_CONJ_HELPER_H
 
-#define EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(PACKET_CPLX, PACKET_REAL)      \
-  template <>                                                           \
-  struct conj_helper<PACKET_REAL, PACKET_CPLX, false, false> {          \
-    EIGEN_STRONG_INLINE PACKET_CPLX pmadd(const PACKET_REAL& x,         \
-                                          const PACKET_CPLX& y,         \
-                                          const PACKET_CPLX& c) const { \
-      return padd(c, this->pmul(x, y));                                 \
-    }                                                                   \
-    EIGEN_STRONG_INLINE PACKET_CPLX pmul(const PACKET_REAL& x,          \
-                                         const PACKET_CPLX& y) const {  \
-      return PACKET_CPLX(Eigen::internal::pmul<PACKET_REAL>(x, y.v));   \
-    }                                                                   \
-  };                                                                    \
-                                                                        \
-  template <>                                                           \
-  struct conj_helper<PACKET_CPLX, PACKET_REAL, false, false> {          \
-    EIGEN_STRONG_INLINE PACKET_CPLX pmadd(const PACKET_CPLX& x,         \
-                                          const PACKET_REAL& y,         \
-                                          const PACKET_CPLX& c) const { \
-      return padd(c, this->pmul(x, y));                                 \
-    }                                                                   \
-    EIGEN_STRONG_INLINE PACKET_CPLX pmul(const PACKET_CPLX& x,          \
-                                         const PACKET_REAL& y) const {  \
-      return PACKET_CPLX(Eigen::internal::pmul<PACKET_REAL>(x.v, y));   \
-    }                                                                   \
+#define EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(PACKET_CPLX, PACKET_REAL)                                                  \
+  template <>                                                                                                       \
+  struct conj_helper<PACKET_REAL, PACKET_CPLX, false, false> {                                                      \
+    EIGEN_STRONG_INLINE PACKET_CPLX pmadd(const PACKET_REAL& x, const PACKET_CPLX& y, const PACKET_CPLX& c) const { \
+      return padd(c, this->pmul(x, y));                                                                             \
+    }                                                                                                               \
+    EIGEN_STRONG_INLINE PACKET_CPLX pmul(const PACKET_REAL& x, const PACKET_CPLX& y) const {                        \
+      return PACKET_CPLX(Eigen::internal::pmul<PACKET_REAL>(x, y.v));                                               \
+    }                                                                                                               \
+  };                                                                                                                \
+                                                                                                                    \
+  template <>                                                                                                       \
+  struct conj_helper<PACKET_CPLX, PACKET_REAL, false, false> {                                                      \
+    EIGEN_STRONG_INLINE PACKET_CPLX pmadd(const PACKET_CPLX& x, const PACKET_REAL& y, const PACKET_CPLX& c) const { \
+      return padd(c, this->pmul(x, y));                                                                             \
+    }                                                                                                               \
+    EIGEN_STRONG_INLINE PACKET_CPLX pmul(const PACKET_CPLX& x, const PACKET_REAL& y) const {                        \
+      return PACKET_CPLX(Eigen::internal::pmul<PACKET_REAL>(x.v, y));                                               \
+    }                                                                                                               \
   };
 
 // IWYU pragma: private
@@ -44,74 +38,88 @@
 namespace Eigen {
 namespace internal {
 
-template<bool Conjugate> struct conj_if;
+template <bool Conjugate>
+struct conj_if;
 
-template<> struct conj_if<true> {
-  template<typename T>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T operator()(const T& x) const { return numext::conj(x); }
-  template<typename T>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T pconj(const T& x) const { return internal::pconj(x); }
+template <>
+struct conj_if<true> {
+  template <typename T>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T operator()(const T& x) const {
+    return numext::conj(x);
+  }
+  template <typename T>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T pconj(const T& x) const {
+    return internal::pconj(x);
+  }
 };
 
-template<> struct conj_if<false> {
-  template<typename T>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T& operator()(const T& x) const { return x; }
-  template<typename T>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T& pconj(const T& x) const { return x; }
+template <>
+struct conj_if<false> {
+  template <typename T>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T& operator()(const T& x) const {
+    return x;
+  }
+  template <typename T>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T& pconj(const T& x) const {
+    return x;
+  }
 };
 
 // Generic Implementation, assume scalars since the packet-version is
 // specialized below.
-template<typename LhsType, typename RhsType, bool ConjLhs, bool ConjRhs>
+template <typename LhsType, typename RhsType, bool ConjLhs, bool ConjRhs>
 struct conj_helper {
   typedef typename ScalarBinaryOpTraits<LhsType, RhsType>::ReturnType ResultType;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ResultType
-  pmadd(const LhsType& x, const RhsType& y, const ResultType& c) const
-  { return this->pmul(x, y) + c; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ResultType pmadd(const LhsType& x, const RhsType& y,
+                                                         const ResultType& c) const {
+    return this->pmul(x, y) + c;
+  }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ResultType
-  pmul(const LhsType& x, const RhsType& y) const
-  { return conj_if<ConjLhs>()(x) * conj_if<ConjRhs>()(y); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ResultType pmul(const LhsType& x, const RhsType& y) const {
+    return conj_if<ConjLhs>()(x) * conj_if<ConjRhs>()(y);
+  }
 };
 
-template<typename LhsScalar, typename RhsScalar>
+template <typename LhsScalar, typename RhsScalar>
 struct conj_helper<LhsScalar, RhsScalar, true, true> {
-  typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar>::ReturnType ResultType;
+  typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar>::ReturnType ResultType;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ResultType
-  pmadd(const LhsScalar& x, const RhsScalar& y, const ResultType& c) const
-  { return this->pmul(x, y) + c; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ResultType pmadd(const LhsScalar& x, const RhsScalar& y,
+                                                         const ResultType& c) const {
+    return this->pmul(x, y) + c;
+  }
 
   // We save a conjuation by using the identity conj(a)*conj(b) = conj(a*b).
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ResultType
-  pmul(const LhsScalar& x, const RhsScalar& y) const
-  { return numext::conj(x * y); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ResultType pmul(const LhsScalar& x, const RhsScalar& y) const {
+    return numext::conj(x * y);
+  }
 };
 
 // Implementation with equal type, use packet operations.
-template<typename Packet, bool ConjLhs, bool ConjRhs>
-struct conj_helper<Packet, Packet, ConjLhs, ConjRhs>
-{
+template <typename Packet, bool ConjLhs, bool ConjRhs>
+struct conj_helper<Packet, Packet, ConjLhs, ConjRhs> {
   typedef Packet ResultType;
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet pmadd(const Packet& x, const Packet& y, const Packet& c) const
-  { return Eigen::internal::pmadd(conj_if<ConjLhs>().pconj(x), conj_if<ConjRhs>().pconj(y), c); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet pmadd(const Packet& x, const Packet& y, const Packet& c) const {
+    return Eigen::internal::pmadd(conj_if<ConjLhs>().pconj(x), conj_if<ConjRhs>().pconj(y), c);
+  }
 
-
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet pmul(const Packet& x, const Packet& y) const
-  { return Eigen::internal::pmul(conj_if<ConjLhs>().pconj(x), conj_if<ConjRhs>().pconj(y)); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet pmul(const Packet& x, const Packet& y) const {
+    return Eigen::internal::pmul(conj_if<ConjLhs>().pconj(x), conj_if<ConjRhs>().pconj(y));
+  }
 };
 
-template<typename Packet>
-struct conj_helper<Packet, Packet, true, true>
-{
+template <typename Packet>
+struct conj_helper<Packet, Packet, true, true> {
   typedef Packet ResultType;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet pmadd(const Packet& x, const Packet& y, const Packet& c) const
-  { return Eigen::internal::pmadd(pconj(x), pconj(y), c); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet pmadd(const Packet& x, const Packet& y, const Packet& c) const {
+    return Eigen::internal::pmadd(pconj(x), pconj(y), c);
+  }
   // We save a conjuation by using the identity conj(a)*conj(b) = conj(a*b).
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet pmul(const Packet& x, const Packet& y) const
-  { return pconj(Eigen::internal::pmul(x, y)); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet pmul(const Packet& x, const Packet& y) const {
+    return pconj(Eigen::internal::pmul(x, y));
+  }
 };
 
 }  // namespace internal
diff --git a/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h b/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h
index 3d4a2a5..8fb5b68 100644
--- a/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h
+++ b/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h
@@ -23,14 +23,27 @@
 namespace internal {
 
 // Creates a Scalar integer type with same bit-width.
-template<typename T> struct make_integer;
-template<> struct make_integer<float>    { typedef numext::int32_t type; };
-template<> struct make_integer<double>   { typedef numext::int64_t type; };
-template<> struct make_integer<half>     { typedef numext::int16_t type; };
-template<> struct make_integer<bfloat16> { typedef numext::int16_t type; };
+template <typename T>
+struct make_integer;
+template <>
+struct make_integer<float> {
+  typedef numext::int32_t type;
+};
+template <>
+struct make_integer<double> {
+  typedef numext::int64_t type;
+};
+template <>
+struct make_integer<half> {
+  typedef numext::int16_t type;
+};
+template <>
+struct make_integer<bfloat16> {
+  typedef numext::int16_t type;
+};
 
-template<typename Packet> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
-Packet pfrexp_generic_get_biased_exponent(const Packet& a) {
+template <typename Packet>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Packet pfrexp_generic_get_biased_exponent(const Packet& a) {
   typedef typename unpacket_traits<Packet>::type Scalar;
   typedef typename unpacket_traits<Packet>::integer_packet PacketI;
   static constexpr int mantissa_bits = numext::numeric_limits<Scalar>::digits - 1;
@@ -39,34 +52,32 @@
 
 // Safely applies frexp, correctly handles denormals.
 // Assumes IEEE floating point format.
-template<typename Packet> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
-Packet pfrexp_generic(const Packet& a, Packet& exponent) {
+template <typename Packet>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Packet pfrexp_generic(const Packet& a, Packet& exponent) {
   typedef typename unpacket_traits<Packet>::type Scalar;
   typedef typename make_unsigned<typename make_integer<Scalar>::type>::type ScalarUI;
-  static constexpr int
-    TotalBits = sizeof(Scalar) * CHAR_BIT,
-    MantissaBits = numext::numeric_limits<Scalar>::digits - 1,
-    ExponentBits = TotalBits - MantissaBits - 1;
+  static constexpr int TotalBits = sizeof(Scalar) * CHAR_BIT, MantissaBits = numext::numeric_limits<Scalar>::digits - 1,
+                       ExponentBits = TotalBits - MantissaBits - 1;
 
   EIGEN_CONSTEXPR ScalarUI scalar_sign_mantissa_mask =
-      ~(((ScalarUI(1) << ExponentBits) - ScalarUI(1)) << MantissaBits); // ~0x7f800000
+      ~(((ScalarUI(1) << ExponentBits) - ScalarUI(1)) << MantissaBits);  // ~0x7f800000
   const Packet sign_mantissa_mask = pset1frombits<Packet>(static_cast<ScalarUI>(scalar_sign_mantissa_mask));
   const Packet half = pset1<Packet>(Scalar(0.5));
   const Packet zero = pzero(a);
-  const Packet normal_min = pset1<Packet>((numext::numeric_limits<Scalar>::min)()); // Minimum normal value, 2^-126
+  const Packet normal_min = pset1<Packet>((numext::numeric_limits<Scalar>::min)());  // Minimum normal value, 2^-126
 
   // To handle denormals, normalize by multiplying by 2^(int(MantissaBits)+1).
   const Packet is_denormal = pcmp_lt(pabs(a), normal_min);
-  EIGEN_CONSTEXPR ScalarUI scalar_normalization_offset = ScalarUI(MantissaBits + 1); // 24
+  EIGEN_CONSTEXPR ScalarUI scalar_normalization_offset = ScalarUI(MantissaBits + 1);  // 24
   // The following cannot be constexpr because bfloat16(uint16_t) is not constexpr.
-  const Scalar scalar_normalization_factor = Scalar(ScalarUI(1) << int(scalar_normalization_offset)); // 2^24
+  const Scalar scalar_normalization_factor = Scalar(ScalarUI(1) << int(scalar_normalization_offset));  // 2^24
   const Packet normalization_factor = pset1<Packet>(scalar_normalization_factor);
   const Packet normalized_a = pselect(is_denormal, pmul(a, normalization_factor), a);
 
   // Determine exponent offset: -126 if normal, -126-24 if denormal
-  const Scalar scalar_exponent_offset = -Scalar((ScalarUI(1)<<(ExponentBits-1)) - ScalarUI(2)); // -126
+  const Scalar scalar_exponent_offset = -Scalar((ScalarUI(1) << (ExponentBits - 1)) - ScalarUI(2));  // -126
   Packet exponent_offset = pset1<Packet>(scalar_exponent_offset);
-  const Packet normalization_offset = pset1<Packet>(-Scalar(scalar_normalization_offset)); // -24
+  const Packet normalization_offset = pset1<Packet>(-Scalar(scalar_normalization_offset));  // -24
   exponent_offset = pselect(is_denormal, padd(exponent_offset, normalization_offset), exponent_offset);
 
   // Determine exponent and mantissa from normalized_a.
@@ -83,8 +94,8 @@
 
 // Safely applies ldexp, correctly handles overflows, underflows and denormals.
 // Assumes IEEE floating point format.
-template<typename Packet> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
-Packet pldexp_generic(const Packet& a, const Packet& exponent) {
+template <typename Packet>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Packet pldexp_generic(const Packet& a, const Packet& exponent) {
   // We want to return a * 2^exponent, allowing for all possible integer
   // exponents without overflowing or underflowing in intermediate
   // computations.
@@ -93,7 +104,7 @@
   // to consider for a float is:
   //   -255-23 -> 255+23
   // Below -278 any finite float 'a' will become zero, and above +278 any
-  // finite float will become inf, including when 'a' is the smallest possible 
+  // finite float will become inf, including when 'a' is the smallest possible
   // denormal.
   //
   // Unfortunately, 2^(278) cannot be represented using either one or two
@@ -110,19 +121,17 @@
   typedef typename unpacket_traits<Packet>::integer_packet PacketI;
   typedef typename unpacket_traits<Packet>::type Scalar;
   typedef typename unpacket_traits<PacketI>::type ScalarI;
-  static constexpr int
-    TotalBits = sizeof(Scalar) * CHAR_BIT,
-    MantissaBits = numext::numeric_limits<Scalar>::digits - 1,
-    ExponentBits = TotalBits - MantissaBits - 1;
+  static constexpr int TotalBits = sizeof(Scalar) * CHAR_BIT, MantissaBits = numext::numeric_limits<Scalar>::digits - 1,
+                       ExponentBits = TotalBits - MantissaBits - 1;
 
-  const Packet max_exponent = pset1<Packet>(Scalar((ScalarI(1)<<ExponentBits) + ScalarI(MantissaBits - 1)));  // 278
-  const PacketI bias = pset1<PacketI>((ScalarI(1)<<(ExponentBits-1)) - ScalarI(1));  // 127
+  const Packet max_exponent = pset1<Packet>(Scalar((ScalarI(1) << ExponentBits) + ScalarI(MantissaBits - 1)));  // 278
+  const PacketI bias = pset1<PacketI>((ScalarI(1) << (ExponentBits - 1)) - ScalarI(1));                         // 127
   const PacketI e = pcast<Packet, PacketI>(pmin(pmax(exponent, pnegate(max_exponent)), max_exponent));
-  PacketI b = parithmetic_shift_right<2>(e); // floor(e/4);
+  PacketI b = parithmetic_shift_right<2>(e);                                          // floor(e/4);
   Packet c = preinterpret<Packet>(plogical_shift_left<MantissaBits>(padd(b, bias)));  // 2^b
-  Packet out = pmul(pmul(pmul(a, c), c), c);  // a * 2^(3b)
-  b = psub(psub(psub(e, b), b), b); // e - 3b
-  c = preinterpret<Packet>(plogical_shift_left<MantissaBits>(padd(b, bias)));  // 2^(e-3*b)
+  Packet out = pmul(pmul(pmul(a, c), c), c);                                          // a * 2^(3b)
+  b = psub(psub(psub(e, b), b), b);                                                   // e - 3b
+  c = preinterpret<Packet>(plogical_shift_left<MantissaBits>(padd(b, bias)));         // 2^(e-3*b)
   out = pmul(out, c);
   return out;
 }
@@ -136,22 +145,19 @@
 // if 2^e doesn't fit into a normal floating-point Scalar.
 //
 // Assumes IEEE floating point format
-template<typename Packet>
+template <typename Packet>
 struct pldexp_fast_impl {
   typedef typename unpacket_traits<Packet>::integer_packet PacketI;
   typedef typename unpacket_traits<Packet>::type Scalar;
   typedef typename unpacket_traits<PacketI>::type ScalarI;
-  static constexpr int
-    TotalBits = sizeof(Scalar) * CHAR_BIT,
-    MantissaBits = numext::numeric_limits<Scalar>::digits - 1,
-    ExponentBits = TotalBits - MantissaBits - 1;
+  static constexpr int TotalBits = sizeof(Scalar) * CHAR_BIT, MantissaBits = numext::numeric_limits<Scalar>::digits - 1,
+                       ExponentBits = TotalBits - MantissaBits - 1;
 
-  static EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
-  Packet run(const Packet& a, const Packet& exponent) {
-    const Packet bias = pset1<Packet>(Scalar((ScalarI(1)<<(ExponentBits-1)) - ScalarI(1)));  // 127
-    const Packet limit = pset1<Packet>(Scalar((ScalarI(1)<<ExponentBits) - ScalarI(1)));     // 255
+  static EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Packet run(const Packet& a, const Packet& exponent) {
+    const Packet bias = pset1<Packet>(Scalar((ScalarI(1) << (ExponentBits - 1)) - ScalarI(1)));  // 127
+    const Packet limit = pset1<Packet>(Scalar((ScalarI(1) << ExponentBits) - ScalarI(1)));       // 255
     // restrict biased exponent between 0 and 255 for float.
-    const PacketI e = pcast<Packet, PacketI>(pmin(pmax(padd(exponent, bias), pzero(limit)), limit)); // exponent + 127
+    const PacketI e = pcast<Packet, PacketI>(pmin(pmax(padd(exponent, bias), pzero(limit)), limit));  // exponent + 127
     // return a * (2^e)
     return pmul(a, preinterpret<Packet>(plogical_shift_left<MantissaBits>(e)));
   }
@@ -164,17 +170,15 @@
 // TODO(gonnet): Further reduce the interval allowing for lower-degree
 //               polynomial interpolants -> ... -> profit!
 template <typename Packet, bool base2>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet plog_impl_float(const Packet _x)
-{
-  const Packet cst_1              = pset1<Packet>(1.0f);
-  const Packet cst_minus_inf      = pset1frombits<Packet>(static_cast<Eigen::numext::uint32_t>(0xff800000u));
-  const Packet cst_pos_inf        = pset1frombits<Packet>(static_cast<Eigen::numext::uint32_t>(0x7f800000u));
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog_impl_float(const Packet _x) {
+  const Packet cst_1 = pset1<Packet>(1.0f);
+  const Packet cst_minus_inf = pset1frombits<Packet>(static_cast<Eigen::numext::uint32_t>(0xff800000u));
+  const Packet cst_pos_inf = pset1frombits<Packet>(static_cast<Eigen::numext::uint32_t>(0x7f800000u));
 
   const Packet cst_cephes_SQRTHF = pset1<Packet>(0.707106781186547524f);
   Packet e, x;
   // extract significant in the range [0.5,1) and exponent
-  x = pfrexp(_x,e);
+  x = pfrexp(_x, e);
 
   // part2: Shift the inputs from the range [0.5,1) to [sqrt(1/2),sqrt(2))
   // and shift by -1. The values are then centered around 0, which improves
@@ -216,27 +220,22 @@
   }
 
   Packet invalid_mask = pcmp_lt_or_nan(_x, pzero(_x));
-  Packet iszero_mask  = pcmp_eq(_x,pzero(_x));
-  Packet pos_inf_mask = pcmp_eq(_x,cst_pos_inf);
+  Packet iszero_mask = pcmp_eq(_x, pzero(_x));
+  Packet pos_inf_mask = pcmp_eq(_x, cst_pos_inf);
   // Filter out invalid inputs, i.e.:
   //  - negative arg will be NAN
   //  - 0 will be -INF
   //  - +INF will be +INF
-  return pselect(iszero_mask, cst_minus_inf,
-                              por(pselect(pos_inf_mask,cst_pos_inf,x), invalid_mask));
+  return pselect(iszero_mask, cst_minus_inf, por(pselect(pos_inf_mask, cst_pos_inf, x), invalid_mask));
 }
 
 template <typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet plog_float(const Packet _x)
-{
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog_float(const Packet _x) {
   return plog_impl_float<Packet, /* base2 */ false>(_x);
 }
 
 template <typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet plog2_float(const Packet _x)
-{
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog2_float(const Packet _x) {
   return plog_impl_float<Packet, /* base2 */ true>(_x);
 }
 
@@ -250,19 +249,16 @@
  * for more detail see: http://www.netlib.org/cephes/
  */
 template <typename Packet, bool base2>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet plog_impl_double(const Packet _x)
-{
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog_impl_double(const Packet _x) {
   Packet x = _x;
 
-  const Packet cst_1              = pset1<Packet>(1.0);
-  const Packet cst_neg_half       = pset1<Packet>(-0.5);
-  const Packet cst_minus_inf      = pset1frombits<Packet>( static_cast<uint64_t>(0xfff0000000000000ull));
-  const Packet cst_pos_inf        = pset1frombits<Packet>( static_cast<uint64_t>(0x7ff0000000000000ull));
+  const Packet cst_1 = pset1<Packet>(1.0);
+  const Packet cst_neg_half = pset1<Packet>(-0.5);
+  const Packet cst_minus_inf = pset1frombits<Packet>(static_cast<uint64_t>(0xfff0000000000000ull));
+  const Packet cst_pos_inf = pset1frombits<Packet>(static_cast<uint64_t>(0x7ff0000000000000ull));
 
-
- // Polynomial Coefficients for log(1+x) = x - x**2/2 + x**3 P(x)/Q(x)
- //                             1/sqrt(2) <= x < sqrt(2)
+  // Polynomial Coefficients for log(1+x) = x - x**2/2 + x**3 P(x)/Q(x)
+  //                             1/sqrt(2) <= x < sqrt(2)
   const Packet cst_cephes_SQRTHF = pset1<Packet>(0.70710678118654752440E0);
   const Packet cst_cephes_log_p0 = pset1<Packet>(1.01875663804580931796E-4);
   const Packet cst_cephes_log_p1 = pset1<Packet>(4.97494994976747001425E-1);
@@ -280,8 +276,8 @@
 
   Packet e;
   // extract significant in the range [0.5,1) and exponent
-  x = pfrexp(x,e);
-  
+  x = pfrexp(x, e);
+
   // Shift the inputs from the range [0.5,1) to [sqrt(1/2),sqrt(2))
   // and shift by -1. The values are then centered around 0, which improves
   // the stability of the polynomial evaluation.
@@ -301,20 +297,20 @@
   // Evaluate the polynomial approximant , probably to improve instruction-level parallelism.
   // y = x - 0.5*x^2 + x^3 * polevl( x, P, 5 ) / p1evl( x, Q, 5 ) );
   Packet y, y1, y_;
-  y  = pmadd(cst_cephes_log_p0, x, cst_cephes_log_p1);
+  y = pmadd(cst_cephes_log_p0, x, cst_cephes_log_p1);
   y1 = pmadd(cst_cephes_log_p3, x, cst_cephes_log_p4);
-  y  = pmadd(y, x, cst_cephes_log_p2);
+  y = pmadd(y, x, cst_cephes_log_p2);
   y1 = pmadd(y1, x, cst_cephes_log_p5);
   y_ = pmadd(y, x3, y1);
 
-  y  = pmadd(cst_cephes_log_q0, x, cst_cephes_log_q1);
+  y = pmadd(cst_cephes_log_q0, x, cst_cephes_log_q1);
   y1 = pmadd(cst_cephes_log_q3, x, cst_cephes_log_q4);
-  y  = pmadd(y, x, cst_cephes_log_q2);
+  y = pmadd(y, x, cst_cephes_log_q2);
   y1 = pmadd(y1, x, cst_cephes_log_q5);
-  y  = pmadd(y, x3, y1);
+  y = pmadd(y, x3, y1);
 
   y_ = pmul(y_, x3);
-  y  = pdiv(y_, y);
+  y = pdiv(y_, y);
 
   y = pmadd(cst_neg_half, x2, y);
   x = padd(x, y);
@@ -329,36 +325,30 @@
   }
 
   Packet invalid_mask = pcmp_lt_or_nan(_x, pzero(_x));
-  Packet iszero_mask  = pcmp_eq(_x,pzero(_x));
-  Packet pos_inf_mask = pcmp_eq(_x,cst_pos_inf);
+  Packet iszero_mask = pcmp_eq(_x, pzero(_x));
+  Packet pos_inf_mask = pcmp_eq(_x, cst_pos_inf);
   // Filter out invalid inputs, i.e.:
   //  - negative arg will be NAN
   //  - 0 will be -INF
   //  - +INF will be +INF
-  return pselect(iszero_mask, cst_minus_inf,
-                              por(pselect(pos_inf_mask,cst_pos_inf,x), invalid_mask));
+  return pselect(iszero_mask, cst_minus_inf, por(pselect(pos_inf_mask, cst_pos_inf, x), invalid_mask));
 }
 
 template <typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet plog_double(const Packet _x)
-{
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog_double(const Packet _x) {
   return plog_impl_double<Packet, /* base2 */ false>(_x);
 }
 
 template <typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet plog2_double(const Packet _x)
-{
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog2_double(const Packet _x) {
   return plog_impl_double<Packet, /* base2 */ true>(_x);
 }
 
 /** \internal \returns log(1 + x) computed using W. Kahan's formula.
     See: http://www.plunk.org/~hatch/rightway.php
  */
-template<typename Packet>
-Packet generic_plog1p(const Packet& x)
-{
+template <typename Packet>
+Packet generic_plog1p(const Packet& x) {
   typedef typename unpacket_traits<Packet>::type ScalarType;
   const Packet one = pset1<Packet>(ScalarType(1));
   Packet xp1 = padd(x, one);
@@ -372,9 +362,8 @@
 /** \internal \returns exp(x)-1 computed using W. Kahan's formula.
     See: http://www.plunk.org/~hatch/rightway.php
  */
-template<typename Packet>
-Packet generic_expm1(const Packet& x)
-{
+template <typename Packet>
+Packet generic_expm1(const Packet& x) {
   typedef typename unpacket_traits<Packet>::type ScalarType;
   const Packet one = pset1<Packet>(ScalarType(1));
   const Packet neg_one = pset1<Packet>(ScalarType(-1));
@@ -390,25 +379,18 @@
   Packet pos_inf_mask = pcmp_eq(logu, u);
   Packet expm1 = pmul(u_minus_one, pdiv(x, logu));
   expm1 = pselect(pos_inf_mask, u, expm1);
-  return pselect(one_mask,
-                 x,
-                 pselect(neg_one_mask,
-                         neg_one,
-                         expm1));
+  return pselect(one_mask, x, pselect(neg_one_mask, neg_one, expm1));
 }
 
-
 // Exponential function. Works by writing "x = m*log(2) + r" where
 // "m = floor(x/log(2)+1/2)" and "r" is the remainder. The result is then
 // "exp(x) = 2^m*exp(r)" where exp(r) is in the range [-1,1).
 // exp(r) is computed using a 6th order minimax polynomial approximation.
 template <typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pexp_float(const Packet _x)
-{
-  const Packet cst_zero   = pset1<Packet>(0.0f);
-  const Packet cst_one    = pset1<Packet>(1.0f);
-  const Packet cst_half   = pset1<Packet>(0.5f);
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pexp_float(const Packet _x) {
+  const Packet cst_zero = pset1<Packet>(0.0f);
+  const Packet cst_one = pset1<Packet>(1.0f);
+  const Packet cst_half = pset1<Packet>(0.5f);
   const Packet cst_exp_hi = pset1<Packet>(88.723f);
   const Packet cst_exp_lo = pset1<Packet>(-104.f);
 
@@ -447,13 +429,11 @@
 
   // Return 2^m * exp(r).
   // TODO: replace pldexp with faster implementation since y in [-1, 1).
-  return pselect(zero_mask, cst_zero, pmax(pldexp(y,m), _x));
+  return pselect(zero_mask, cst_zero, pmax(pldexp(y, m), _x));
 }
 
 template <typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pexp_double(const Packet _x)
-{
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pexp_double(const Packet _x) {
   Packet x = _x;
   const Packet cst_zero = pset1<Packet>(0.0);
   const Packet cst_1 = pset1<Packet>(1.0);
@@ -516,7 +496,7 @@
   // Construct the result 2^n * exp(g) = e * x. The max is used to catch
   // non-finite values in the input.
   // TODO: replace pldexp with faster implementation since x in [-1, 1).
-  return pselect(zero_mask, cst_zero, pmax(pldexp(x,fx), _x));
+  return pselect(zero_mask, cst_zero, pmax(pldexp(x, fx), _x));
 }
 
 // The following code is inspired by the following stack-overflow answer:
@@ -528,29 +508,22 @@
 //    aligned on 8-bits, and (2) replicating the storage of the bits of 2/pi.
 //  - Avoid a branch in rounding and extraction of the remaining fractional part.
 // Overall, I measured a speed up higher than x2 on x86-64.
-inline float trig_reduce_huge (float xf, Eigen::numext::int32_t *quadrant)
-{
+inline float trig_reduce_huge(float xf, Eigen::numext::int32_t* quadrant) {
   using Eigen::numext::int32_t;
-  using Eigen::numext::uint32_t;
   using Eigen::numext::int64_t;
+  using Eigen::numext::uint32_t;
   using Eigen::numext::uint64_t;
 
-  const double pio2_62 = 3.4061215800865545e-19;    // pi/2 * 2^-62
-  const uint64_t zero_dot_five = uint64_t(1) << 61; // 0.5 in 2.62-bit fixed-point format
+  const double pio2_62 = 3.4061215800865545e-19;     // pi/2 * 2^-62
+  const uint64_t zero_dot_five = uint64_t(1) << 61;  // 0.5 in 2.62-bit fixed-point format
 
   // 192 bits of 2/pi for Payne-Hanek reduction
   // Bits are introduced by packet of 8 to enable aligned reads.
-  static const uint32_t two_over_pi [] = 
-  {
-    0x00000028, 0x000028be, 0x0028be60, 0x28be60db,
-    0xbe60db93, 0x60db9391, 0xdb939105, 0x9391054a,
-    0x91054a7f, 0x054a7f09, 0x4a7f09d5, 0x7f09d5f4,
-    0x09d5f47d, 0xd5f47d4d, 0xf47d4d37, 0x7d4d3770,
-    0x4d377036, 0x377036d8, 0x7036d8a5, 0x36d8a566,
-    0xd8a5664f, 0xa5664f10, 0x664f10e4, 0x4f10e410,
-    0x10e41000, 0xe4100000
-  };
-  
+  static const uint32_t two_over_pi[] = {
+      0x00000028, 0x000028be, 0x0028be60, 0x28be60db, 0xbe60db93, 0x60db9391, 0xdb939105, 0x9391054a, 0x91054a7f,
+      0x054a7f09, 0x4a7f09d5, 0x7f09d5f4, 0x09d5f47d, 0xd5f47d4d, 0xf47d4d37, 0x7d4d3770, 0x4d377036, 0x377036d8,
+      0x7036d8a5, 0x36d8a566, 0xd8a5664f, 0xa5664f10, 0x664f10e4, 0x4f10e410, 0x10e41000, 0xe4100000};
+
   uint32_t xi = numext::bit_cast<uint32_t>(xf);
   // Below, -118 = -126 + 8.
   //   -126 is to get the exponent,
@@ -558,12 +531,12 @@
   // This is possible because the fractional part of x as only 24 meaningful bits.
   uint32_t e = (xi >> 23) - 118;
   // Extract the mantissa and shift it to align it wrt the exponent
-  xi = ((xi & 0x007fffffu)| 0x00800000u) << (e & 0x7);
+  xi = ((xi & 0x007fffffu) | 0x00800000u) << (e & 0x7);
 
   uint32_t i = e >> 3;
-  uint32_t twoopi_1  = two_over_pi[i-1];
-  uint32_t twoopi_2  = two_over_pi[i+3];
-  uint32_t twoopi_3  = two_over_pi[i+7];
+  uint32_t twoopi_1 = two_over_pi[i - 1];
+  uint32_t twoopi_2 = two_over_pi[i + 3];
+  uint32_t twoopi_3 = two_over_pi[i + 7];
 
   // Compute x * 2/pi in 2.62-bit fixed-point format.
   uint64_t p;
@@ -578,23 +551,23 @@
   // since we have p=x/(pi/2) with high accuracy, we can more efficiently compute r as:
   //   r = (p-q)*pi/2,
   // where the product can be be carried out with sufficient accuracy using double precision.
-  p -= q<<62;
+  p -= q << 62;
   return float(double(int64_t(p)) * pio2_62);
 }
 
-template<bool ComputeSine,typename Packet>
+template <bool ComputeSine, typename Packet>
 EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
 #if EIGEN_COMP_GNUC_STRICT
-__attribute__((optimize("-fno-unsafe-math-optimizations")))
+    __attribute__((optimize("-fno-unsafe-math-optimizations")))
 #endif
-Packet psincos_float(const Packet& _x)
-{
+    Packet
+    psincos_float(const Packet& _x) {
   typedef typename unpacket_traits<Packet>::integer_packet PacketI;
 
-  const Packet  cst_2oPI            = pset1<Packet>(0.636619746685028076171875f); // 2/PI
-  const Packet  cst_rounding_magic  = pset1<Packet>(12582912); // 2^23 for rounding
-  const PacketI csti_1              = pset1<PacketI>(1);
-  const Packet  cst_sign_mask       = pset1frombits<Packet>(static_cast<Eigen::numext::uint32_t>(0x80000000u));
+  const Packet cst_2oPI = pset1<Packet>(0.636619746685028076171875f);  // 2/PI
+  const Packet cst_rounding_magic = pset1<Packet>(12582912);           // 2^23 for rounding
+  const PacketI csti_1 = pset1<PacketI>(1);
+  const Packet cst_sign_mask = pset1frombits<Packet>(static_cast<Eigen::numext::uint32_t>(0x80000000u));
 
   Packet x = pabs(_x);
 
@@ -604,19 +577,19 @@
   // Rounding trick to find nearest integer:
   Packet y_round = padd(y, cst_rounding_magic);
   EIGEN_OPTIMIZATION_BARRIER(y_round)
-  PacketI y_int = preinterpret<PacketI>(y_round); // last 23 digits represent integer (if abs(x)<2^24)
-  y = psub(y_round, cst_rounding_magic); // nearest integer to x * (2/pi)
+  PacketI y_int = preinterpret<PacketI>(y_round);  // last 23 digits represent integer (if abs(x)<2^24)
+  y = psub(y_round, cst_rounding_magic);           // nearest integer to x * (2/pi)
 
-  // Subtract y * Pi/2 to reduce x to the interval -Pi/4 <= x <= +Pi/4
-  // using "Extended precision modular arithmetic"
-  #if defined(EIGEN_HAS_SINGLE_INSTRUCTION_MADD)
+// Subtract y * Pi/2 to reduce x to the interval -Pi/4 <= x <= +Pi/4
+// using "Extended precision modular arithmetic"
+#if defined(EIGEN_HAS_SINGLE_INSTRUCTION_MADD)
   // This version requires true FMA for high accuracy
   // It provides a max error of 1ULP up to (with absolute_error < 5.9605e-08):
   const float huge_th = ComputeSine ? 117435.992f : 71476.0625f;
   x = pmadd(y, pset1<Packet>(-1.57079601287841796875f), x);
   x = pmadd(y, pset1<Packet>(-3.1391647326017846353352069854736328125e-07f), x);
   x = pmadd(y, pset1<Packet>(-5.390302529957764765544681040410068817436695098876953125e-15f), x);
-  #else
+#else
   // Without true FMA, the previous set of coefficients maintain 1ULP accuracy
   // up to x<15.7 (for sin), but accuracy is immediately lost for x>15.7.
   // We thus use one more iteration to maintain 2ULPs up to reasonably large inputs.
@@ -624,29 +597,28 @@
   // The following set of coefficients maintain 1ULP up to 9.43 and 14.16 for sin and cos respectively.
   // and 2 ULP up to:
   const float huge_th = ComputeSine ? 25966.f : 18838.f;
-  x = pmadd(y, pset1<Packet>(-1.5703125), x); // = 0xbfc90000
+  x = pmadd(y, pset1<Packet>(-1.5703125), x);  // = 0xbfc90000
   EIGEN_OPTIMIZATION_BARRIER(x)
-  x = pmadd(y, pset1<Packet>(-0.000483989715576171875), x); // = 0xb9fdc000
+  x = pmadd(y, pset1<Packet>(-0.000483989715576171875), x);  // = 0xb9fdc000
   EIGEN_OPTIMIZATION_BARRIER(x)
-  x = pmadd(y, pset1<Packet>(1.62865035235881805419921875e-07), x); // = 0x342ee000
-  x = pmadd(y, pset1<Packet>(5.5644315544167710640977020375430583953857421875e-11), x); // = 0x2e74b9ee
+  x = pmadd(y, pset1<Packet>(1.62865035235881805419921875e-07), x);                      // = 0x342ee000
+  x = pmadd(y, pset1<Packet>(5.5644315544167710640977020375430583953857421875e-11), x);  // = 0x2e74b9ee
 
-  // For the record, the following set of coefficients maintain 2ULP up
-  // to a slightly larger range:
-  // const float huge_th = ComputeSine ? 51981.f : 39086.125f;
-  // but it slightly fails to maintain 1ULP for two values of sin below pi.
-  // x = pmadd(y, pset1<Packet>(-3.140625/2.), x);
-  // x = pmadd(y, pset1<Packet>(-0.00048351287841796875), x);
-  // x = pmadd(y, pset1<Packet>(-3.13855707645416259765625e-07), x);
-  // x = pmadd(y, pset1<Packet>(-6.0771006282767103812147979624569416046142578125e-11), x);
+// For the record, the following set of coefficients maintain 2ULP up
+// to a slightly larger range:
+// const float huge_th = ComputeSine ? 51981.f : 39086.125f;
+// but it slightly fails to maintain 1ULP for two values of sin below pi.
+// x = pmadd(y, pset1<Packet>(-3.140625/2.), x);
+// x = pmadd(y, pset1<Packet>(-0.00048351287841796875), x);
+// x = pmadd(y, pset1<Packet>(-3.13855707645416259765625e-07), x);
+// x = pmadd(y, pset1<Packet>(-6.0771006282767103812147979624569416046142578125e-11), x);
 
-  // For the record, with only 3 iterations it is possible to maintain
-  // 1 ULP up to 3PI (maybe more) and 2ULP up to 255.
-  // The coefficients are: 0xbfc90f80, 0xb7354480, 0x2e74b9ee
-  #endif
+// For the record, with only 3 iterations it is possible to maintain
+// 1 ULP up to 3PI (maybe more) and 2ULP up to 255.
+// The coefficients are: 0xbfc90f80, 0xb7354480, 0x2e74b9ee
+#endif
 
-  if(predux_any(pcmp_le(pset1<Packet>(huge_th),pabs(_x))))
-  {
+  if (predux_any(pcmp_le(pset1<Packet>(huge_th), pabs(_x)))) {
     const int PacketSize = unpacket_traits<Packet>::size;
     EIGEN_ALIGN_TO_BOUNDARY(sizeof(Packet)) float vals[PacketSize];
     EIGEN_ALIGN_TO_BOUNDARY(sizeof(Packet)) float x_cpy[PacketSize];
@@ -654,11 +626,9 @@
     pstoreu(vals, pabs(_x));
     pstoreu(x_cpy, x);
     pstoreu(y_int2, y_int);
-    for(int k=0; k<PacketSize;++k)
-    {
+    for (int k = 0; k < PacketSize; ++k) {
       float val = vals[k];
-      if(val>=huge_th && (numext::isfinite)(val))
-        x_cpy[k] = trig_reduce_huge(val,&y_int2[k]);
+      if (val >= huge_th && (numext::isfinite)(val)) x_cpy[k] = trig_reduce_huge(val, &y_int2[k]);
     }
     x = ploadu<Packet>(x_cpy);
     y_int = ploadu<PacketI>(y_int2);
@@ -668,19 +638,19 @@
   // sin: sign = second_bit(y_int) xor signbit(_x)
   // cos: sign = second_bit(y_int+1)
   Packet sign_bit = ComputeSine ? pxor(_x, preinterpret<Packet>(plogical_shift_left<30>(y_int)))
-                                : preinterpret<Packet>(plogical_shift_left<30>(padd(y_int,csti_1)));
-  sign_bit = pand(sign_bit, cst_sign_mask); // clear all but left most bit
+                                : preinterpret<Packet>(plogical_shift_left<30>(padd(y_int, csti_1)));
+  sign_bit = pand(sign_bit, cst_sign_mask);  // clear all but left most bit
 
   // Get the polynomial selection mask from the second bit of y_int
   // We'll calculate both (sin and cos) polynomials and then select from the two.
   Packet poly_mask = preinterpret<Packet>(pcmp_eq(pand(y_int, csti_1), pzero(y_int)));
 
-  Packet x2 = pmul(x,x);
+  Packet x2 = pmul(x, x);
 
   // Evaluate the cos(x) polynomial. (-Pi/4 <= x <= Pi/4)
-  Packet y1 =        pset1<Packet>(2.4372266125283204019069671630859375e-05f);
-  y1 = pmadd(y1, x2, pset1<Packet>(-0.00138865201734006404876708984375f     ));
-  y1 = pmadd(y1, x2, pset1<Packet>(0.041666619479656219482421875f           ));
+  Packet y1 = pset1<Packet>(2.4372266125283204019069671630859375e-05f);
+  y1 = pmadd(y1, x2, pset1<Packet>(-0.00138865201734006404876708984375f));
+  y1 = pmadd(y1, x2, pset1<Packet>(0.041666619479656219482421875f));
   y1 = pmadd(y1, x2, pset1<Packet>(-0.5f));
   y1 = pmadd(y1, x2, pset1<Packet>(1.f));
 
@@ -692,38 +662,32 @@
   //    c = (A'*diag(w)*A)\(A'*diag(w)*(sin(x)-x)); # weighted LS, linear coeff forced to 1
   //    printf('%.64f\n %.64f\n%.64f\n', c(3), c(2), c(1))
   //
-  Packet y2 =        pset1<Packet>(-0.0001959234114083702898469196984621021329076029360294342041015625f);
-  y2 = pmadd(y2, x2, pset1<Packet>( 0.0083326873655616851693794799871284340042620897293090820312500000f));
+  Packet y2 = pset1<Packet>(-0.0001959234114083702898469196984621021329076029360294342041015625f);
+  y2 = pmadd(y2, x2, pset1<Packet>(0.0083326873655616851693794799871284340042620897293090820312500000f));
   y2 = pmadd(y2, x2, pset1<Packet>(-0.1666666203982298255503735617821803316473960876464843750000000000f));
   y2 = pmul(y2, x2);
   y2 = pmadd(y2, x, x);
 
   // Select the correct result from the two polynomials.
-  y = ComputeSine ? pselect(poly_mask,y2,y1)
-                  : pselect(poly_mask,y1,y2);
+  y = ComputeSine ? pselect(poly_mask, y2, y1) : pselect(poly_mask, y1, y2);
 
   // Update the sign and filter huge inputs
   return pxor(y, sign_bit);
 }
 
-template<typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet psin_float(const Packet& x)
-{
+template <typename Packet>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet psin_float(const Packet& x) {
   return psincos_float<true>(x);
 }
 
-template<typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pcos_float(const Packet& x)
-{
+template <typename Packet>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pcos_float(const Packet& x) {
   return psincos_float<false>(x);
 }
 
 // Generic implementation of acos(x).
-template<typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pacos_float(const Packet& x_in) {
+template <typename Packet>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pacos_float(const Packet& x_in) {
   typedef typename unpacket_traits<Packet>::type Scalar;
   static_assert(std::is_same<Scalar, float>::value, "Scalar type must be float");
 
@@ -747,7 +711,7 @@
   //   P(x) = p0 + x * (p1 +  x * (p2 + ... (p5 + x * p6)) ... ) .
   // We evaluate even and odd terms independently to increase
   // instruction level parallelism.
-  Packet x2 = pmul(x_in,x_in);
+  Packet x2 = pmul(x_in, x_in);
   Packet p_even = pmadd(p6, x2, p4);
   Packet p_odd = pmadd(p5, x2, p3);
   p_even = pmadd(p_even, x2, p2);
@@ -765,9 +729,8 @@
 }
 
 // Generic implementation of asin(x).
-template<typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pasin_float(const Packet& x_in) {
+template <typename Packet>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pasin_float(const Packet& x_in) {
   typedef typename unpacket_traits<Packet>::type Scalar;
   static_assert(std::is_same<Scalar, float>::value, "Scalar type must be float");
 
@@ -817,9 +780,8 @@
 }
 
 // Computes elementwise atan(x) for x in [-1:1] with 2 ulp accuracy.
-template<typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet patan_reduced_float(const Packet& x) {
+template <typename Packet>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet patan_reduced_float(const Packet& x) {
   const Packet q0 = pset1<Packet>(-0.3333314359188079833984375f);
   const Packet q2 = pset1<Packet>(0.19993579387664794921875f);
   const Packet q4 = pset1<Packet>(-0.14209578931331634521484375f);
@@ -849,9 +811,8 @@
   return pmadd(q, pmul(x, x2), x);
 }
 
-template<typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet patan_float(const Packet& x_in) {
+template <typename Packet>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet patan_float(const Packet& x_in) {
   typedef typename unpacket_traits<Packet>::type Scalar;
   static_assert(std::is_same<Scalar, float>::value, "Scalar type must be float");
 
@@ -879,28 +840,17 @@
 // Computes elementwise atan(x) for x in [-tan(pi/8):tan(pi/8)]
 // with 2 ulp accuracy.
 template <typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet
-patan_reduced_double(const Packet& x) {
-  const Packet q0 =
-      pset1<Packet>(-0.33333333333330028569463365784031338989734649658203);
-  const Packet q2 =
-      pset1<Packet>(0.199999999990664090177006073645316064357757568359375);
-  const Packet q4 =
-      pset1<Packet>(-0.142857141937123677255527809393242932856082916259766);
-  const Packet q6 =
-      pset1<Packet>(0.111111065991039953404495577160560060292482376098633);
-  const Packet q8 =
-      pset1<Packet>(-9.0907812986129224452902519715280504897236824035645e-2);
-  const Packet q10 =
-      pset1<Packet>(7.6900542950704739442180368769186316058039665222168e-2);
-  const Packet q12 =
-      pset1<Packet>(-6.6410112986494976294871150912513257935643196105957e-2);
-  const Packet q14 =
-      pset1<Packet>(5.6920144995467943094258345126945641823112964630127e-2);
-  const Packet q16 =
-      pset1<Packet>(-4.3577020814990513608577771265117917209863662719727e-2);
-  const Packet q18 =
-      pset1<Packet>(2.1244050233624342527427586446719942614436149597168e-2);
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet patan_reduced_double(const Packet& x) {
+  const Packet q0 = pset1<Packet>(-0.33333333333330028569463365784031338989734649658203);
+  const Packet q2 = pset1<Packet>(0.199999999990664090177006073645316064357757568359375);
+  const Packet q4 = pset1<Packet>(-0.142857141937123677255527809393242932856082916259766);
+  const Packet q6 = pset1<Packet>(0.111111065991039953404495577160560060292482376098633);
+  const Packet q8 = pset1<Packet>(-9.0907812986129224452902519715280504897236824035645e-2);
+  const Packet q10 = pset1<Packet>(7.6900542950704739442180368769186316058039665222168e-2);
+  const Packet q12 = pset1<Packet>(-6.6410112986494976294871150912513257935643196105957e-2);
+  const Packet q14 = pset1<Packet>(5.6920144995467943094258345126945641823112964630127e-2);
+  const Packet q16 = pset1<Packet>(-4.3577020814990513608577771265117917209863662719727e-2);
+  const Packet q18 = pset1<Packet>(2.1244050233624342527427586446719942614436149597168e-2);
 
   // Approximate atan(x) on [0:tan(pi/8)] by a polynomial of the form
   //   P(x) = x + x^3 * Q(x^2),
@@ -922,9 +872,8 @@
   return pmadd(p, pmul(x, x2), x);
 }
 
-template<typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet patan_double(const Packet& x_in) {
+template <typename Packet>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet patan_double(const Packet& x_in) {
   typedef typename unpacket_traits<Packet>::type Scalar;
   static_assert(std::is_same<Scalar, double>::value, "Scalar type must be double");
 
@@ -968,9 +917,8 @@
   return pxor(p, x_signmask);
 }
 
-template<typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet patanh_float(const Packet& x) {
+template <typename Packet>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet patanh_float(const Packet& x) {
   typedef typename unpacket_traits<Packet>::type Scalar;
   static_assert(std::is_same<Scalar, float>::value, "Scalar type must be float");
   const Packet half = pset1<Packet>(0.5f);
@@ -982,12 +930,12 @@
   const Packet C7 = pset1<Packet>(0.14672131836414337158203125f);
   const Packet C9 = pset1<Packet>(8.2311116158962249755859375e-2f);
   const Packet C11 = pset1<Packet>(0.1819281280040740966796875f);
-  const Packet x2 = pmul(x,x);
+  const Packet x2 = pmul(x, x);
   Packet p = pmadd(C11, x2, C9);
   p = pmadd(x2, p, C7);
   p = pmadd(x2, p, C5);
   p = pmadd(x2, p, C3);
-  p = pmadd(pmul(x,x2), p, x);
+  p = pmadd(pmul(x, x2), p, x);
 
   // For |x| in ]0.5:1.0] we use atanh = 0.5*ln((1+x)/(1-x));
   const Packet one = pset1<Packet>(1.0f);
@@ -996,19 +944,18 @@
   return pselect(x_gt_half, r, p);
 }
 
-template<typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pdiv_complex(const Packet& x, const Packet& y) {
+template <typename Packet>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pdiv_complex(const Packet& x, const Packet& y) {
   typedef typename unpacket_traits<Packet>::as_real RealPacket;
   // In the following we annotate the code for the case where the inputs
   // are a pair length-2 SIMD vectors representing a single pair of complex
   // numbers x = a + i*b, y = c + i*d.
-  const RealPacket y_abs = pabs(y.v);  // |c|, |d|
-  const RealPacket y_abs_flip = pcplxflip(Packet(y_abs)).v; // |d|, |c|
-  const RealPacket y_max = pmax(y_abs, y_abs_flip); // max(|c|, |d|), max(|c|, |d|)
-  const RealPacket y_scaled = pdiv(y.v, y_max);  // c / max(|c|, |d|), d / max(|c|, |d|)
+  const RealPacket y_abs = pabs(y.v);                        // |c|, |d|
+  const RealPacket y_abs_flip = pcplxflip(Packet(y_abs)).v;  // |d|, |c|
+  const RealPacket y_max = pmax(y_abs, y_abs_flip);          // max(|c|, |d|), max(|c|, |d|)
+  const RealPacket y_scaled = pdiv(y.v, y_max);              // c / max(|c|, |d|), d / max(|c|, |d|)
   // Compute scaled denominator.
-  const RealPacket y_scaled_sq = pmul(y_scaled, y_scaled); // c'**2, d'**2
+  const RealPacket y_scaled_sq = pmul(y_scaled, y_scaled);  // c'**2, d'**2
   const RealPacket denom = padd(y_scaled_sq, pcplxflip(Packet(y_scaled_sq)).v);
   Packet result_scaled = pmul(x, pconj(Packet(y_scaled)));  // a * c' + b * d', -a * d + b * c
   // Divide elementwise by denom.
@@ -1017,9 +964,8 @@
   return Packet(pdiv(result_scaled.v, y_max));
 }
 
-template<typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet psqrt_complex(const Packet& a) {
+template <typename Packet>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet psqrt_complex(const Packet& a) {
   typedef typename unpacket_traits<Packet>::type Scalar;
   typedef typename Scalar::value_type RealScalar;
   typedef typename unpacket_traits<Packet>::as_real RealPacket;
@@ -1060,14 +1006,14 @@
   //    l0 = (min0 == 0 ? max0 : max0 * sqrt(1 + (min0/max0)**2)),
   // where max0 = max(|x0|, |y0|), min0 = min(|x0|, |y0|), and similarly for l1.
 
-  RealPacket a_abs = pabs(a.v);           // [|x0|, |y0|, |x1|, |y1|]
-  RealPacket a_abs_flip = pcplxflip(Packet(a_abs)).v; // [|y0|, |x0|, |y1|, |x1|]
+  RealPacket a_abs = pabs(a.v);                        // [|x0|, |y0|, |x1|, |y1|]
+  RealPacket a_abs_flip = pcplxflip(Packet(a_abs)).v;  // [|y0|, |x0|, |y1|, |x1|]
   RealPacket a_max = pmax(a_abs, a_abs_flip);
   RealPacket a_min = pmin(a_abs, a_abs_flip);
   RealPacket a_min_zero_mask = pcmp_eq(a_min, pzero(a_min));
   RealPacket a_max_zero_mask = pcmp_eq(a_max, pzero(a_max));
   RealPacket r = pdiv(a_min, a_max);
-  const RealPacket cst_one  = pset1<RealPacket>(RealScalar(1));
+  const RealPacket cst_one = pset1<RealPacket>(RealScalar(1));
   RealPacket l = pmul(a_max, psqrt(padd(cst_one, pmul(r, r))));  // [l0, l0, l1, l1]
   // Set l to a_max if a_min is zero.
   l = pselect(a_min_zero_mask, a_max, l);
@@ -1090,8 +1036,7 @@
 
   // Step 4. Compute solution for inputs with negative real part:
   //         [|eta0|, sign(y0)*rho0, |eta1|, sign(y1)*rho1]
-  const RealPacket cst_imag_sign_mask =
-      pset1<Packet>(Scalar(RealScalar(0.0), RealScalar(-0.0))).v;
+  const RealPacket cst_imag_sign_mask = pset1<Packet>(Scalar(RealScalar(0.0), RealScalar(-0.0))).v;
   RealPacket imag_signs = pand(a.v, cst_imag_sign_mask);
   Packet negative_real_result;
   // Notice that rho is positive, so taking it's absolute value is a noop.
@@ -1131,7 +1076,6 @@
   return pselect(is_imag_inf, imag_inf_result, pselect(is_real_inf, real_inf_result, result));
 }
 
-
 template <typename Packet>
 struct psign_impl<Packet, std::enable_if_t<!NumTraits<typename unpacket_traits<Packet>::type>::IsComplex &&
                                            !NumTraits<typename unpacket_traits<Packet>::type>::IsInteger>> {
@@ -1222,18 +1166,16 @@
 
 // This function splits x into the nearest integer n and fractional part r,
 // such that x = n + r holds exactly.
-template<typename Packet>
-EIGEN_STRONG_INLINE
-void absolute_split(const Packet& x, Packet& n, Packet& r) {
+template <typename Packet>
+EIGEN_STRONG_INLINE void absolute_split(const Packet& x, Packet& n, Packet& r) {
   n = pround(x);
   r = psub(x, n);
 }
 
 // This function computes the sum {s, r}, such that x + y = s_hi + s_lo
 // holds exactly, and s_hi = fl(x+y), if |x| >= |y|.
-template<typename Packet>
-EIGEN_STRONG_INLINE
-void fast_twosum(const Packet& x, const Packet& y, Packet& s_hi, Packet& s_lo) {
+template <typename Packet>
+EIGEN_STRONG_INLINE void fast_twosum(const Packet& x, const Packet& y, Packet& s_hi, Packet& s_lo) {
   s_hi = padd(x, y);
   const Packet t = psub(s_hi, x);
   s_lo = psub(y, t);
@@ -1244,10 +1186,8 @@
 // a pair of floating point numbers. Given {x, y}, it computes the pair
 // {p_hi, p_lo} such that x * y = p_hi + p_lo holds exactly and
 // p_hi = fl(x * y).
-template<typename Packet>
-EIGEN_STRONG_INLINE
-void twoprod(const Packet& x, const Packet& y,
-             Packet& p_hi, Packet& p_lo) {
+template <typename Packet>
+EIGEN_STRONG_INLINE void twoprod(const Packet& x, const Packet& y, Packet& p_hi, Packet& p_lo) {
   p_hi = pmul(x, y);
   p_lo = pmsub(x, y, p_hi);
 }
@@ -1259,9 +1199,8 @@
 // exactly and that half of the significant of x fits in x_hi.
 // This is Algorithm 3 from Jean-Michel Muller, "Elementary Functions",
 // 3rd edition, Birkh\"auser, 2016.
-template<typename Packet>
-EIGEN_STRONG_INLINE
-void veltkamp_splitting(const Packet& x, Packet& x_hi, Packet& x_lo) {
+template <typename Packet>
+EIGEN_STRONG_INLINE void veltkamp_splitting(const Packet& x, Packet& x_hi, Packet& x_lo) {
   typedef typename unpacket_traits<Packet>::type Scalar;
   EIGEN_CONSTEXPR int shift = (NumTraits<Scalar>::digits() + 1) / 2;
   const Scalar shift_scale = Scalar(uint64_t(1) << shift);  // Scalar constructor not necessarily constexpr.
@@ -1275,10 +1214,8 @@
 // Given floating point numbers {x, y} computes the pair
 // {p_hi, p_lo} such that x * y = p_hi + p_lo holds exactly and
 // p_hi = fl(x * y).
-template<typename Packet>
-EIGEN_STRONG_INLINE
-void twoprod(const Packet& x, const Packet& y,
-             Packet& p_hi, Packet& p_lo) {
+template <typename Packet>
+EIGEN_STRONG_INLINE void twoprod(const Packet& x, const Packet& y, Packet& p_hi, Packet& p_lo) {
   Packet x_hi, x_lo, y_hi, y_lo;
   veltkamp_splitting(x, x_hi, x_lo);
   veltkamp_splitting(y, y_hi, y_lo);
@@ -1292,23 +1229,20 @@
 
 #endif  // EIGEN_HAS_SINGLE_INSTRUCTION_MADD
 
-
 // This function implements Dekker's algorithm for the addition
 // of two double word numbers represented by {x_hi, x_lo} and {y_hi, y_lo}.
 // It returns the result as a pair {s_hi, s_lo} such that
 // x_hi + x_lo + y_hi + y_lo = s_hi + s_lo holds exactly.
 // This is Algorithm 5 from Jean-Michel Muller, "Elementary Functions",
 // 3rd edition, Birkh\"auser, 2016.
-template<typename Packet>
-EIGEN_STRONG_INLINE
-  void twosum(const Packet& x_hi, const Packet& x_lo,
-              const Packet& y_hi, const Packet& y_lo,
-              Packet& s_hi, Packet& s_lo) {
+template <typename Packet>
+EIGEN_STRONG_INLINE void twosum(const Packet& x_hi, const Packet& x_lo, const Packet& y_hi, const Packet& y_lo,
+                                Packet& s_hi, Packet& s_lo) {
   const Packet x_greater_mask = pcmp_lt(pabs(y_hi), pabs(x_hi));
   Packet r_hi_1, r_lo_1;
-  fast_twosum(x_hi, y_hi,r_hi_1, r_lo_1);
+  fast_twosum(x_hi, y_hi, r_hi_1, r_lo_1);
   Packet r_hi_2, r_lo_2;
-  fast_twosum(y_hi, x_hi,r_hi_2, r_lo_2);
+  fast_twosum(y_hi, x_hi, r_hi_2, r_lo_2);
   const Packet r_hi = pselect(x_greater_mask, r_hi_1, r_hi_2);
 
   const Packet s1 = padd(padd(y_lo, r_lo_1), x_lo);
@@ -1320,11 +1254,9 @@
 
 // This is a version of twosum for double word numbers,
 // which assumes that |x_hi| >= |y_hi|.
-template<typename Packet>
-EIGEN_STRONG_INLINE
-  void fast_twosum(const Packet& x_hi, const Packet& x_lo,
-              const Packet& y_hi, const Packet& y_lo,
-              Packet& s_hi, Packet& s_lo) {
+template <typename Packet>
+EIGEN_STRONG_INLINE void fast_twosum(const Packet& x_hi, const Packet& x_lo, const Packet& y_hi, const Packet& y_lo,
+                                     Packet& s_hi, Packet& s_lo) {
   Packet r_hi, r_lo;
   fast_twosum(x_hi, y_hi, r_hi, r_lo);
   const Packet s = padd(padd(y_lo, r_lo), x_lo);
@@ -1334,11 +1266,9 @@
 // This is a version of twosum for adding a floating point number x to
 // double word number {y_hi, y_lo} number, with the assumption
 // that |x| >= |y_hi|.
-template<typename Packet>
-EIGEN_STRONG_INLINE
-void fast_twosum(const Packet& x,
-                 const Packet& y_hi, const Packet& y_lo,
-                 Packet& s_hi, Packet& s_lo) {
+template <typename Packet>
+EIGEN_STRONG_INLINE void fast_twosum(const Packet& x, const Packet& y_hi, const Packet& y_lo, Packet& s_hi,
+                                     Packet& s_lo) {
   Packet r_hi, r_lo;
   fast_twosum(x, y_hi, r_hi, r_lo);
   const Packet s = padd(y_lo, r_lo);
@@ -1353,10 +1283,8 @@
 // in the floating point type.
 // This is Algorithm 7 from Jean-Michel Muller, "Elementary Functions",
 // 3rd edition, Birkh\"auser, 2016.
-template<typename Packet>
-EIGEN_STRONG_INLINE
-void twoprod(const Packet& x_hi, const Packet& x_lo, const Packet& y,
-             Packet& p_hi, Packet& p_lo) {
+template <typename Packet>
+EIGEN_STRONG_INLINE void twoprod(const Packet& x_hi, const Packet& x_lo, const Packet& y, Packet& p_hi, Packet& p_lo) {
   Packet c_hi, c_lo1;
   twoprod(x_hi, y, c_hi, c_lo1);
   const Packet c_lo2 = pmul(x_lo, y);
@@ -1372,11 +1300,9 @@
 // (x_hi + x_lo) * (y_hi + y_lo) = p_hi + p_lo holds with a relative error
 // of less than 2*2^{-2p}, where p is the number of significand bit
 // in the floating point type.
-template<typename Packet>
-EIGEN_STRONG_INLINE
-void twoprod(const Packet& x_hi, const Packet& x_lo,
-             const Packet& y_hi, const Packet& y_lo,
-             Packet& p_hi, Packet& p_lo) {
+template <typename Packet>
+EIGEN_STRONG_INLINE void twoprod(const Packet& x_hi, const Packet& x_lo, const Packet& y_hi, const Packet& y_lo,
+                                 Packet& p_hi, Packet& p_lo) {
   Packet p_hi_hi, p_hi_lo;
   twoprod(x_hi, x_lo, y_hi, p_hi_hi, p_hi_lo);
   Packet p_lo_hi, p_lo_lo;
@@ -1389,8 +1315,7 @@
 // for basic building blocks of double-word arithmetic", Joldes, Muller, & Popescu,
 // 2017. https://hal.archives-ouvertes.fr/hal-01351529
 template <typename Packet>
-void doubleword_div_fp(const Packet& x_hi, const Packet& x_lo, const Packet& y,
-                           Packet& z_hi, Packet& z_lo) {
+void doubleword_div_fp(const Packet& x_hi, const Packet& x_lo, const Packet& y, Packet& z_hi, Packet& z_lo) {
   const Packet t_hi = pdiv(x_hi, y);
   Packet pi_hi, pi_lo;
   twoprod(t_hi, y, pi_hi, pi_lo);
@@ -1405,8 +1330,7 @@
 template <typename Scalar>
 struct accurate_log2 {
   template <typename Packet>
-  EIGEN_STRONG_INLINE
-  void operator()(const Packet& x, Packet& log2_x_hi, Packet& log2_x_lo) {
+  EIGEN_STRONG_INLINE void operator()(const Packet& x, Packet& log2_x_hi, Packet& log2_x_lo) {
     log2_x_hi = plog2(x);
     log2_x_lo = pzero(x);
   }
@@ -1421,8 +1345,7 @@
 template <>
 struct accurate_log2<float> {
   template <typename Packet>
-  EIGEN_STRONG_INLINE
-  void operator()(const Packet& z, Packet& log2_x_hi, Packet& log2_x_lo) {
+  EIGEN_STRONG_INLINE void operator()(const Packet& z, Packet& log2_x_hi, Packet& log2_x_lo) {
     // The function log(1+x)/x is approximated in the interval
     // [1/sqrt(2)-1;sqrt(2)-1] by a degree 10 polynomial of the form
     //  Q(x) = (C0 + x * (C1 + x * (C2 + x * (C3 + x * P(x))))),
@@ -1437,14 +1360,14 @@
     // > f = log2(1+x)/x;
     // > interval = [sqrt(0.5)-1;sqrt(2)-1];
     // > p = fpminimax(f,n,[|double,double,double,double,single...|],interval,relative,floating);
-    
-    const Packet p6 = pset1<Packet>( 9.703654795885e-2f);
+
+    const Packet p6 = pset1<Packet>(9.703654795885e-2f);
     const Packet p5 = pset1<Packet>(-0.1690667718648f);
-    const Packet p4 = pset1<Packet>( 0.1720575392246f);
+    const Packet p4 = pset1<Packet>(0.1720575392246f);
     const Packet p3 = pset1<Packet>(-0.1789081543684f);
-    const Packet p2 = pset1<Packet>( 0.2050433009862f);
+    const Packet p2 = pset1<Packet>(0.2050433009862f);
     const Packet p1 = pset1<Packet>(-0.2404672354459f);
-    const Packet p0 = pset1<Packet>( 0.2885761857032f);
+    const Packet p0 = pset1<Packet>(0.2885761857032f);
 
     const Packet C3_hi = pset1<Packet>(-0.360674142838f);
     const Packet C3_lo = pset1<Packet>(-6.13283912543e-09f);
@@ -1460,7 +1383,7 @@
     // Evaluate P(x) in working precision.
     // We evaluate it in multiple parts to improve instruction level
     // parallelism.
-    Packet x2 = pmul(x,x);
+    Packet x2 = pmul(x, x);
     Packet p_even = pmadd(p6, x2, p4);
     p_even = pmadd(p_even, x2, p2);
     p_even = pmadd(p_even, x2, p0);
@@ -1502,8 +1425,7 @@
 template <>
 struct accurate_log2<double> {
   template <typename Packet>
-  EIGEN_STRONG_INLINE
-  void operator()(const Packet& x, Packet& log2_x_hi, Packet& log2_x_lo) {
+  EIGEN_STRONG_INLINE void operator()(const Packet& x, Packet& log2_x_hi, Packet& log2_x_lo) {
     // We use a transformation of variables:
     //    r = c * (x-1) / (x+1),
     // such that
@@ -1588,8 +1510,7 @@
 template <typename Scalar>
 struct fast_accurate_exp2 {
   template <typename Packet>
-  EIGEN_STRONG_INLINE
-  Packet operator()(const Packet& x) {
+  EIGEN_STRONG_INLINE Packet operator()(const Packet& x) {
     // TODO(rmlarsen): Add a pexp2 packetop.
     return pexp(pmul(pset1<Packet>(Scalar(EIGEN_LN2)), x));
   }
@@ -1602,8 +1523,7 @@
 template <>
 struct fast_accurate_exp2<float> {
   template <typename Packet>
-  EIGEN_STRONG_INLINE
-  Packet operator()(const Packet& x) {
+  EIGEN_STRONG_INLINE Packet operator()(const Packet& x) {
     // This function approximates exp2(x) by a degree 6 polynomial of the form
     // Q(x) = 1 + x * (C + x * P(x)), where the degree 4 polynomial P(x) is evaluated in
     // single precision, and the remaining steps are evaluated with extra precision using
@@ -1628,7 +1548,7 @@
     // Evaluate P(x) in working precision.
     // We evaluate even and odd parts of the polynomial separately
     // to gain some instruction level parallelism.
-    Packet x2 = pmul(x,x);
+    Packet x2 = pmul(x, x);
     Packet p_even = pmadd(p4, x2, p2);
     Packet p_odd = pmadd(p3, x2, p1);
     p_even = pmadd(p_even, x2, p0);
@@ -1660,8 +1580,7 @@
 template <>
 struct fast_accurate_exp2<double> {
   template <typename Packet>
-  EIGEN_STRONG_INLINE
-  Packet operator()(const Packet& x) {
+  EIGEN_STRONG_INLINE Packet operator()(const Packet& x) {
     // This function approximates exp2(x) by a degree 10 polynomial of the form
     // Q(x) = 1 + x * (C + x * P(x)), where the degree 8 polynomial P(x) is evaluated in
     // single precision, and the remaining steps are evaluated with extra precision using
@@ -1683,14 +1602,14 @@
     const Packet p2 = pset1<Packet>(9.618129107593478832e-3);
     const Packet p1 = pset1<Packet>(5.550410866481961247e-2);
     const Packet p0 = pset1<Packet>(0.240226506959101332);
-    const Packet C_hi = pset1<Packet>(0.693147180559945286); 
+    const Packet C_hi = pset1<Packet>(0.693147180559945286);
     const Packet C_lo = pset1<Packet>(4.81927865669806721e-17);
     const Packet one = pset1<Packet>(1.0);
 
     // Evaluate P(x) in working precision.
     // We evaluate even and odd parts of the polynomial separately
     // to gain some instruction level parallelism.
-    Packet x2 = pmul(x,x);
+    Packet x2 = pmul(x, x);
     Packet p_even = pmadd(p8, x2, p6);
     Packet p_odd = pmadd(p9, x2, p7);
     p_even = pmadd(p_even, x2, p4);
@@ -1885,15 +1804,17 @@
  */
 template <typename Packet, int N>
 struct ppolevl {
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet run(const Packet& x, const typename unpacket_traits<Packet>::type coeff[]) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet run(const Packet& x,
+                                                          const typename unpacket_traits<Packet>::type coeff[]) {
     EIGEN_STATIC_ASSERT((N > 0), YOU_MADE_A_PROGRAMMING_MISTAKE);
-    return pmadd(ppolevl<Packet, N-1>::run(x, coeff), x, pset1<Packet>(coeff[N]));
+    return pmadd(ppolevl<Packet, N - 1>::run(x, coeff), x, pset1<Packet>(coeff[N]));
   }
 };
 
 template <typename Packet>
 struct ppolevl<Packet, 0> {
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet run(const Packet& x, const typename unpacket_traits<Packet>::type coeff[]) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet run(const Packet& x,
+                                                          const typename unpacket_traits<Packet>::type coeff[]) {
     EIGEN_UNUSED_VARIABLE(x);
     return pset1<Packet>(coeff[0]);
   }
@@ -1953,8 +1874,8 @@
 
 template <typename Packet, int N>
 struct pchebevl {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE Packet run(Packet x, const typename unpacket_traits<Packet>::type coef[]) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Packet run(Packet x,
+                                                          const typename unpacket_traits<Packet>::type coef[]) {
     typedef typename unpacket_traits<Packet>::type Scalar;
     Packet b0 = pset1<Packet>(coef[0]);
     Packet b1 = pset1<Packet>(static_cast<Scalar>(0.f));
@@ -2052,14 +1973,14 @@
 
 template <typename Packet>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet gen_pow(const Packet& x,
-                                                            const typename unpacket_traits<Packet>::type& exponent) {
+                                                     const typename unpacket_traits<Packet>::type& exponent) {
   const Packet exponent_packet = pset1<Packet>(exponent);
   return generic_pow_impl(x, exponent_packet);
 }
 
 template <typename Packet, typename ScalarExponent>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet handle_nonint_nonint_errors(const Packet& x, const Packet& powx,
-                                                                                const ScalarExponent& exponent) {
+                                                                         const ScalarExponent& exponent) {
   using Scalar = typename unpacket_traits<Packet>::type;
 
   // non-integer base and exponent case
@@ -2153,7 +2074,6 @@
   return pand(x_is_one, x);
 }
 
-
 }  // end namespace unary_pow
 
 template <typename Packet, typename ScalarExponent,
@@ -2205,7 +2125,7 @@
   }
 };
 
-} // end namespace internal
-} // end namespace Eigen
+}  // end namespace internal
+}  // end namespace Eigen
 
-#endif // EIGEN_ARCH_GENERIC_PACKET_MATH_FUNCTIONS_H
+#endif  // EIGEN_ARCH_GENERIC_PACKET_MATH_FUNCTIONS_H
diff --git a/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h b/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h
index 9e038ab..ade9f3f 100644
--- a/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h
+++ b/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h
@@ -22,110 +22,96 @@
 
 /***************************************************************************
  * Some generic implementations to be used by implementors
-***************************************************************************/
+ ***************************************************************************/
 
 /** Default implementation of pfrexp.
-  * It is expected to be called by implementers of template<> pfrexp.
-  */
-template<typename Packet> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
-Packet pfrexp_generic(const Packet& a, Packet& exponent);
+ * It is expected to be called by implementers of template<> pfrexp.
+ */
+template <typename Packet>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Packet pfrexp_generic(const Packet& a, Packet& exponent);
 
 // Extracts the biased exponent value from Packet p, and casts the results to
 // a floating-point Packet type. Used by pfrexp_generic. Override this if
 // there is no unpacket_traits<Packet>::integer_packet.
-template<typename Packet> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
-Packet pfrexp_generic_get_biased_exponent(const Packet& p);
+template <typename Packet>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Packet pfrexp_generic_get_biased_exponent(const Packet& p);
 
 /** Default implementation of pldexp.
-  * It is expected to be called by implementers of template<> pldexp.
-  */
-template<typename Packet> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
-Packet pldexp_generic(const Packet& a, const Packet& exponent);
+ * It is expected to be called by implementers of template<> pldexp.
+ */
+template <typename Packet>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Packet pldexp_generic(const Packet& a, const Packet& exponent);
 
 /** \internal \returns log(x) for single precision float */
 template <typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet plog_float(const Packet _x);
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog_float(const Packet _x);
 
 /** \internal \returns log2(x) for single precision float */
 template <typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet plog2_float(const Packet _x);
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog2_float(const Packet _x);
 
 /** \internal \returns log(x) for single precision float */
 template <typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet plog_double(const Packet _x);
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog_double(const Packet _x);
 
 /** \internal \returns log2(x) for single precision float */
 template <typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet plog2_double(const Packet _x);
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog2_double(const Packet _x);
 
 /** \internal \returns log(1 + x) */
-template<typename Packet>
+template <typename Packet>
 Packet generic_plog1p(const Packet& x);
 
 /** \internal \returns exp(x)-1 */
-template<typename Packet>
+template <typename Packet>
 Packet generic_expm1(const Packet& x);
 
 /** \internal \returns exp(x) for single precision float */
 template <typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pexp_float(const Packet _x);
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pexp_float(const Packet _x);
 
 /** \internal \returns exp(x) for double precision real numbers */
 template <typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pexp_double(const Packet _x);
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pexp_double(const Packet _x);
 
 /** \internal \returns sin(x) for single precision float */
-template<typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet psin_float(const Packet& x);
+template <typename Packet>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet psin_float(const Packet& x);
 
 /** \internal \returns cos(x) for single precision float */
-template<typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pcos_float(const Packet& x);
+template <typename Packet>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pcos_float(const Packet& x);
 
 /** \internal \returns asin(x) for single precision float */
-template<typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pasin_float(const Packet& x);
+template <typename Packet>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pasin_float(const Packet& x);
 
 /** \internal \returns acos(x) for single precision float */
-template<typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pacos_float(const Packet& x);
+template <typename Packet>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pacos_float(const Packet& x);
 
 /** \internal \returns atan(x) for single precision float */
-template<typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet patan_float(const Packet& x);
+template <typename Packet>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet patan_float(const Packet& x);
 
 /** \internal \returns atan(x) for double precision float */
-template<typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet patan_double(const Packet& x);
+template <typename Packet>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet patan_double(const Packet& x);
 
 /** \internal \returns atanh(x) for single precision float */
-template<typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet patanh_float(const Packet& x);
+template <typename Packet>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet patanh_float(const Packet& x);
 
 /** \internal \returns sqrt(x) for complex types */
-template<typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet psqrt_complex(const Packet& a);
+template <typename Packet>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet psqrt_complex(const Packet& a);
 
 /** \internal \returns x / y for complex types */
-template<typename Packet>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pdiv_complex(const Packet& x, const Packet& y);
+template <typename Packet>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pdiv_complex(const Packet& x, const Packet& y);
 
-template <typename Packet, int N> struct ppolevl;
+template <typename Packet, int N>
+struct ppolevl;
 
 // Macros for instantiating these generic functions for different backends.
 #define EIGEN_PACKET_FUNCTION(METHOD, SCALAR, PACKET)                                             \
@@ -166,7 +152,7 @@
   EIGEN_DOUBLE_PACKET_FUNCTION(log2, PACKET)                \
   EIGEN_DOUBLE_PACKET_FUNCTION(exp, PACKET)
 
-} // end namespace internal
-} // end namespace Eigen
+}  // end namespace internal
+}  // end namespace Eigen
 
-#endif // EIGEN_ARCH_GENERIC_PACKET_MATH_FUNCTIONS_FWD_H
+#endif  // EIGEN_ARCH_GENERIC_PACKET_MATH_FUNCTIONS_FWD_H
diff --git a/Eigen/src/Core/arch/Default/Half.h b/Eigen/src/Core/arch/Default/Half.h
index c652318..92516c7 100644
--- a/Eigen/src/Core/arch/Default/Half.h
+++ b/Eigen/src/Core/arch/Default/Half.h
@@ -24,7 +24,6 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-
 // Standard 16-bit float type, mostly useful for GPUs. Defines a new
 // type Eigen::half (inheriting either from CUDA's or HIP's __half struct) with
 // operator overloads such that it behaves basically as an arithmetic
@@ -32,7 +31,6 @@
 // in fp32 for CPUs, except for simple parameter conversions, I/O
 // to disk and the likes), but fast on GPUs.
 
-
 #ifndef EIGEN_HALF_H
 #define EIGEN_HALF_H
 
@@ -46,16 +44,15 @@
 // As a consequence, we get compile failures when compiling Eigen with
 // GPU support. Hence the need to disable EIGEN_CONSTEXPR when building
 // Eigen with GPU support
-  #pragma push_macro("EIGEN_CONSTEXPR")
-  #undef EIGEN_CONSTEXPR
-  #define EIGEN_CONSTEXPR
+#pragma push_macro("EIGEN_CONSTEXPR")
+#undef EIGEN_CONSTEXPR
+#define EIGEN_CONSTEXPR
 #endif
 
-#define F16_PACKET_FUNCTION(PACKET_F, PACKET_F16, METHOD)           \
-  template <>                                                       \
-  EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC EIGEN_UNUSED                \
-  PACKET_F16 METHOD<PACKET_F16>(const PACKET_F16& _x) {             \
-    return float2half(METHOD<PACKET_F>(half2float(_x)));            \
+#define F16_PACKET_FUNCTION(PACKET_F, PACKET_F16, METHOD)                                                  \
+  template <>                                                                                              \
+  EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC EIGEN_UNUSED PACKET_F16 METHOD<PACKET_F16>(const PACKET_F16& _x) { \
+    return float2half(METHOD<PACKET_F>(half2float(_x)));                                                   \
   }
 
 namespace Eigen {
@@ -97,8 +94,7 @@
   EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR __half_raw() : x(0) {}
 #endif
 #if defined(EIGEN_HAS_ARM64_FP16_SCALAR_ARITHMETIC)
-  explicit EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR __half_raw(numext::uint16_t raw) : x(numext::bit_cast<__fp16>(raw)) {
-  }
+  explicit EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR __half_raw(numext::uint16_t raw) : x(numext::bit_cast<__fp16>(raw)) {}
   __fp16 x;
 #else
   explicit EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR __half_raw(numext::uint16_t raw) : x(raw) {}
@@ -107,15 +103,15 @@
 };
 
 #elif defined(EIGEN_HAS_HIP_FP16)
-  // Nothing to do here
-  // HIP fp16 header file has a definition for __half_raw
+// Nothing to do here
+// HIP fp16 header file has a definition for __half_raw
 #elif defined(EIGEN_HAS_CUDA_FP16)
-  #if EIGEN_CUDA_SDK_VER < 90000
-    // In CUDA < 9.0, __half is the equivalent of CUDA 9's __half_raw
-    typedef __half __half_raw;
-  #endif // defined(EIGEN_HAS_CUDA_FP16)
+#if EIGEN_CUDA_SDK_VER < 90000
+// In CUDA < 9.0, __half is the equivalent of CUDA 9's __half_raw
+typedef __half __half_raw;
+#endif  // defined(EIGEN_HAS_CUDA_FP16)
 #elif defined(SYCL_DEVICE_ONLY)
-  typedef cl::sycl::half __half_raw;
+typedef cl::sycl::half __half_raw;
 #endif
 
 EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR __half_raw raw_uint16_to_half(numext::uint16_t x);
@@ -127,21 +123,20 @@
   EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR half_base(const __half_raw& h) : __half_raw(h) {}
 
 #if defined(EIGEN_HAS_GPU_FP16)
- #if defined(EIGEN_HAS_HIP_FP16)
+#if defined(EIGEN_HAS_HIP_FP16)
   EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR half_base(const __half& h) { x = __half_as_ushort(h); }
- #elif defined(EIGEN_HAS_CUDA_FP16)
-  #if EIGEN_CUDA_SDK_VER >= 90000
+#elif defined(EIGEN_HAS_CUDA_FP16)
+#if EIGEN_CUDA_SDK_VER >= 90000
   EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR half_base(const __half& h) : __half_raw(*(__half_raw*)&h) {}
-  #endif
- #endif
+#endif
+#endif
 #endif
 };
 
-} // namespace half_impl
+}  // namespace half_impl
 
 // Class definition.
 struct half : public half_impl::half_base {
-
   // Writing this out as separate #if-else blocks to make the code easier to follow
   // The same applies to most #if-else blocks in this file
 #if !defined(EIGEN_HAS_GPU_FP16) || !defined(EIGEN_GPU_COMPILE_PHASE)
@@ -153,12 +148,12 @@
   // Nothing to do here
   // HIP fp16 header file has a definition for __half_raw
 #elif defined(EIGEN_HAS_CUDA_FP16)
-  // Note that EIGEN_CUDA_SDK_VER is set to 0 even when compiling with HIP, so
-  // (EIGEN_CUDA_SDK_VER < 90000) is true even for HIP!  So keeping this within
-  // #if defined(EIGEN_HAS_CUDA_FP16) is needed
-  #if defined(EIGEN_CUDA_SDK_VER) && EIGEN_CUDA_SDK_VER < 90000
-    typedef half_impl::__half_raw __half_raw;
-  #endif
+// Note that EIGEN_CUDA_SDK_VER is set to 0 even when compiling with HIP, so
+// (EIGEN_CUDA_SDK_VER < 90000) is true even for HIP!  So keeping this within
+// #if defined(EIGEN_HAS_CUDA_FP16) is needed
+#if defined(EIGEN_CUDA_SDK_VER) && EIGEN_CUDA_SDK_VER < 90000
+  typedef half_impl::__half_raw __half_raw;
+#endif
 #endif
 
   EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR half() {}
@@ -166,31 +161,29 @@
   EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR half(const __half_raw& h) : half_impl::half_base(h) {}
 
 #if defined(EIGEN_HAS_GPU_FP16)
- #if defined(EIGEN_HAS_HIP_FP16)
+#if defined(EIGEN_HAS_HIP_FP16)
   EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR half(const __half& h) : half_impl::half_base(h) {}
- #elif defined(EIGEN_HAS_CUDA_FP16)
-  #if defined(EIGEN_CUDA_SDK_VER) && EIGEN_CUDA_SDK_VER >= 90000
+#elif defined(EIGEN_HAS_CUDA_FP16)
+#if defined(EIGEN_CUDA_SDK_VER) && EIGEN_CUDA_SDK_VER >= 90000
   EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR half(const __half& h) : half_impl::half_base(h) {}
-  #endif
- #endif
 #endif
-
+#endif
+#endif
 
   explicit EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR half(bool b)
       : half_impl::half_base(half_impl::raw_uint16_to_half(b ? 0x3c00 : 0)) {}
-  template<class T>
+  template <class T>
   explicit EIGEN_DEVICE_FUNC half(T val)
       : half_impl::half_base(half_impl::float_to_half_rtne(static_cast<float>(val))) {}
-  explicit EIGEN_DEVICE_FUNC half(float f)
-      : half_impl::half_base(half_impl::float_to_half_rtne(f)) {}
+  explicit EIGEN_DEVICE_FUNC half(float f) : half_impl::half_base(half_impl::float_to_half_rtne(f)) {}
 
   // Following the convention of numpy, converting between complex and
   // float will lead to loss of imag value.
-  template<typename RealScalar>
+  template <typename RealScalar>
   explicit EIGEN_DEVICE_FUNC half(std::complex<RealScalar> c)
       : half_impl::half_base(half_impl::float_to_half_rtne(static_cast<float>(c.real()))) {}
 
-   EIGEN_DEVICE_FUNC operator float() const {  // NOLINT: Allow implicit conversion to float, because it is lossless.
+  EIGEN_DEVICE_FUNC operator float() const {  // NOLINT: Allow implicit conversion to float, because it is lossless.
     return half_impl::half_to_float(*this);
   }
 
@@ -224,8 +217,10 @@
   static EIGEN_CONSTEXPR const bool is_bounded = true;
   static EIGEN_CONSTEXPR const bool is_modulo = false;
   static EIGEN_CONSTEXPR const int digits = 11;
-  static EIGEN_CONSTEXPR const int digits10 = 3;      // according to http://half.sourceforge.net/structstd_1_1numeric__limits_3_01half__float_1_1half_01_4.html
-  static EIGEN_CONSTEXPR const int max_digits10 = 5;  // according to http://half.sourceforge.net/structstd_1_1numeric__limits_3_01half__float_1_1half_01_4.html
+  static EIGEN_CONSTEXPR const int digits10 =
+      3;  // according to http://half.sourceforge.net/structstd_1_1numeric__limits_3_01half__float_1_1half_01_4.html
+  static EIGEN_CONSTEXPR const int max_digits10 =
+      5;  // according to http://half.sourceforge.net/structstd_1_1numeric__limits_3_01half__float_1_1half_01_4.html
   static EIGEN_CONSTEXPR const int radix = std::numeric_limits<float>::radix;
   static EIGEN_CONSTEXPR const int min_exponent = -13;
   static EIGEN_CONSTEXPR const int min_exponent10 = -4;
@@ -236,9 +231,9 @@
   // detect tininess in the same way for all operations in radix two"
   static EIGEN_CONSTEXPR const bool tinyness_before = std::numeric_limits<float>::tinyness_before;
 
-  static EIGEN_CONSTEXPR Eigen::half (min)() { return Eigen::half_impl::raw_uint16_to_half(0x0400); }
+  static EIGEN_CONSTEXPR Eigen::half(min)() { return Eigen::half_impl::raw_uint16_to_half(0x0400); }
   static EIGEN_CONSTEXPR Eigen::half lowest() { return Eigen::half_impl::raw_uint16_to_half(0xfbff); }
-  static EIGEN_CONSTEXPR Eigen::half (max)() { return Eigen::half_impl::raw_uint16_to_half(0x7bff); }
+  static EIGEN_CONSTEXPR Eigen::half(max)() { return Eigen::half_impl::raw_uint16_to_half(0x7bff); }
   static EIGEN_CONSTEXPR Eigen::half epsilon() { return Eigen::half_impl::raw_uint16_to_half(0x1400); }
   static EIGEN_CONSTEXPR Eigen::half round_error() { return Eigen::half_impl::raw_uint16_to_half(0x3800); }
   static EIGEN_CONSTEXPR Eigen::half infinity() { return Eigen::half_impl::raw_uint16_to_half(0x7c00); }
@@ -247,51 +242,51 @@
   static EIGEN_CONSTEXPR Eigen::half denorm_min() { return Eigen::half_impl::raw_uint16_to_half(0x0001); }
 };
 
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const bool numeric_limits_half_impl<T>::is_specialized;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const bool numeric_limits_half_impl<T>::is_signed;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const bool numeric_limits_half_impl<T>::is_integer;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const bool numeric_limits_half_impl<T>::is_exact;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const bool numeric_limits_half_impl<T>::has_infinity;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const bool numeric_limits_half_impl<T>::has_quiet_NaN;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const bool numeric_limits_half_impl<T>::has_signaling_NaN;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const std::float_denorm_style numeric_limits_half_impl<T>::has_denorm;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const bool numeric_limits_half_impl<T>::has_denorm_loss;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const std::float_round_style numeric_limits_half_impl<T>::round_style;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const bool numeric_limits_half_impl<T>::is_iec559;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const bool numeric_limits_half_impl<T>::is_bounded;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const bool numeric_limits_half_impl<T>::is_modulo;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const int numeric_limits_half_impl<T>::digits;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const int numeric_limits_half_impl<T>::digits10;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const int numeric_limits_half_impl<T>::max_digits10;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const int numeric_limits_half_impl<T>::radix;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const int numeric_limits_half_impl<T>::min_exponent;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const int numeric_limits_half_impl<T>::min_exponent10;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const int numeric_limits_half_impl<T>::max_exponent;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const int numeric_limits_half_impl<T>::max_exponent10;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const bool numeric_limits_half_impl<T>::traps;
-template<typename T>
+template <typename T>
 EIGEN_CONSTEXPR const bool numeric_limits_half_impl<T>::tinyness_before;
 }  // end namespace half_impl
 }  // end namespace Eigen
@@ -301,13 +296,13 @@
 // std::numeric_limits<const T>, std::numeric_limits<volatile T>, and
 // std::numeric_limits<const volatile T>
 // https://stackoverflow.com/a/16519653/
-template<>
+template <>
 class numeric_limits<Eigen::half> : public Eigen::half_impl::numeric_limits_half_impl<> {};
-template<>
+template <>
 class numeric_limits<const Eigen::half> : public numeric_limits<Eigen::half> {};
-template<>
+template <>
 class numeric_limits<volatile Eigen::half> : public numeric_limits<Eigen::half> {};
-template<>
+template <>
 class numeric_limits<const volatile Eigen::half> : public numeric_limits<Eigen::half> {};
 }  // end namespace std
 
@@ -315,8 +310,7 @@
 
 namespace half_impl {
 
-#if (defined(EIGEN_HAS_CUDA_FP16) && defined(EIGEN_CUDA_ARCH) && \
-     EIGEN_CUDA_ARCH >= 530) ||                                  \
+#if (defined(EIGEN_HAS_CUDA_FP16) && defined(EIGEN_CUDA_ARCH) && EIGEN_CUDA_ARCH >= 530) || \
     (defined(EIGEN_HAS_HIP_FP16) && defined(HIP_DEVICE_COMPILE))
 // Note: We deliberately do *not* define this to 1 even if we have Arm's native
 // fp16 type since GPU halfs are rather different from native CPU halfs.
@@ -330,20 +324,16 @@
 // conversion steps back and forth.
 
 #if defined(EIGEN_HAS_NATIVE_FP16)
-EIGEN_STRONG_INLINE __device__ half operator + (const half& a, const half& b) {
+EIGEN_STRONG_INLINE __device__ half operator+(const half& a, const half& b) {
 #if defined(EIGEN_CUDA_SDK_VER) && EIGEN_CUDA_SDK_VER >= 90000
   return __hadd(::__half(a), ::__half(b));
 #else
   return __hadd(a, b);
 #endif
 }
-EIGEN_STRONG_INLINE __device__ half operator * (const half& a, const half& b) {
-  return __hmul(a, b);
-}
-EIGEN_STRONG_INLINE __device__ half operator - (const half& a, const half& b) {
-  return __hsub(a, b);
-}
-EIGEN_STRONG_INLINE __device__ half operator / (const half& a, const half& b) {
+EIGEN_STRONG_INLINE __device__ half operator*(const half& a, const half& b) { return __hmul(a, b); }
+EIGEN_STRONG_INLINE __device__ half operator-(const half& a, const half& b) { return __hsub(a, b); }
+EIGEN_STRONG_INLINE __device__ half operator/(const half& a, const half& b) {
 #if defined(EIGEN_CUDA_SDK_VER) && EIGEN_CUDA_SDK_VER >= 90000
   return __hdiv(a, b);
 #else
@@ -352,99 +342,63 @@
   return __float2half(num / denom);
 #endif
 }
-EIGEN_STRONG_INLINE __device__ half operator - (const half& a) {
-  return __hneg(a);
-}
-EIGEN_STRONG_INLINE __device__ half& operator += (half& a, const half& b) {
+EIGEN_STRONG_INLINE __device__ half operator-(const half& a) { return __hneg(a); }
+EIGEN_STRONG_INLINE __device__ half& operator+=(half& a, const half& b) {
   a = a + b;
   return a;
 }
-EIGEN_STRONG_INLINE __device__ half& operator *= (half& a, const half& b) {
+EIGEN_STRONG_INLINE __device__ half& operator*=(half& a, const half& b) {
   a = a * b;
   return a;
 }
-EIGEN_STRONG_INLINE __device__ half& operator -= (half& a, const half& b) {
+EIGEN_STRONG_INLINE __device__ half& operator-=(half& a, const half& b) {
   a = a - b;
   return a;
 }
-EIGEN_STRONG_INLINE __device__ half& operator /= (half& a, const half& b) {
+EIGEN_STRONG_INLINE __device__ half& operator/=(half& a, const half& b) {
   a = a / b;
   return a;
 }
-EIGEN_STRONG_INLINE __device__ bool operator == (const half& a, const half& b) {
-  return __heq(a, b);
-}
-EIGEN_STRONG_INLINE __device__ bool operator != (const half& a, const half& b) {
-  return __hne(a, b);
-}
-EIGEN_STRONG_INLINE __device__ bool operator < (const half& a, const half& b) {
-  return __hlt(a, b);
-}
-EIGEN_STRONG_INLINE __device__ bool operator <= (const half& a, const half& b) {
-  return __hle(a, b);
-}
-EIGEN_STRONG_INLINE __device__ bool operator > (const half& a, const half& b) {
-  return __hgt(a, b);
-}
-EIGEN_STRONG_INLINE __device__ bool operator >= (const half& a, const half& b) {
-  return __hge(a, b);
-}
+EIGEN_STRONG_INLINE __device__ bool operator==(const half& a, const half& b) { return __heq(a, b); }
+EIGEN_STRONG_INLINE __device__ bool operator!=(const half& a, const half& b) { return __hne(a, b); }
+EIGEN_STRONG_INLINE __device__ bool operator<(const half& a, const half& b) { return __hlt(a, b); }
+EIGEN_STRONG_INLINE __device__ bool operator<=(const half& a, const half& b) { return __hle(a, b); }
+EIGEN_STRONG_INLINE __device__ bool operator>(const half& a, const half& b) { return __hgt(a, b); }
+EIGEN_STRONG_INLINE __device__ bool operator>=(const half& a, const half& b) { return __hge(a, b); }
 #endif
 
 #if defined(EIGEN_HAS_ARM64_FP16_SCALAR_ARITHMETIC) && !defined(EIGEN_GPU_COMPILE_PHASE)
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half operator + (const half& a, const half& b) {
-  return half(vaddh_f16(a.x, b.x));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half operator * (const half& a, const half& b) {
-  return half(vmulh_f16(a.x, b.x));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half operator - (const half& a, const half& b) {
-  return half(vsubh_f16(a.x, b.x));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half operator / (const half& a, const half& b) {
-  return half(vdivh_f16(a.x, b.x));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half operator - (const half& a) {
-  return half(vnegh_f16(a.x));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half& operator += (half& a, const half& b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half operator+(const half& a, const half& b) { return half(vaddh_f16(a.x, b.x)); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half operator*(const half& a, const half& b) { return half(vmulh_f16(a.x, b.x)); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half operator-(const half& a, const half& b) { return half(vsubh_f16(a.x, b.x)); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half operator/(const half& a, const half& b) { return half(vdivh_f16(a.x, b.x)); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half operator-(const half& a) { return half(vnegh_f16(a.x)); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half& operator+=(half& a, const half& b) {
   a = half(vaddh_f16(a.x, b.x));
   return a;
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half& operator *= (half& a, const half& b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half& operator*=(half& a, const half& b) {
   a = half(vmulh_f16(a.x, b.x));
   return a;
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half& operator -= (half& a, const half& b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half& operator-=(half& a, const half& b) {
   a = half(vsubh_f16(a.x, b.x));
   return a;
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half& operator /= (half& a, const half& b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half& operator/=(half& a, const half& b) {
   a = half(vdivh_f16(a.x, b.x));
   return a;
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator == (const half& a, const half& b) {
-  return vceqh_f16(a.x, b.x);
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator != (const half& a, const half& b) {
-  return !vceqh_f16(a.x, b.x);
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator < (const half& a, const half& b) {
-  return vclth_f16(a.x, b.x);
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator <= (const half& a, const half& b) {
-  return vcleh_f16(a.x, b.x);
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator > (const half& a, const half& b) {
-  return vcgth_f16(a.x, b.x);
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator >= (const half& a, const half& b) {
-  return vcgeh_f16(a.x, b.x);
-}
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator==(const half& a, const half& b) { return vceqh_f16(a.x, b.x); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator!=(const half& a, const half& b) { return !vceqh_f16(a.x, b.x); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator<(const half& a, const half& b) { return vclth_f16(a.x, b.x); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator<=(const half& a, const half& b) { return vcleh_f16(a.x, b.x); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator>(const half& a, const half& b) { return vcgth_f16(a.x, b.x); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator>=(const half& a, const half& b) { return vcgeh_f16(a.x, b.x); }
 // We need to distinguish ‘clang as the CUDA compiler’ from ‘clang as the host compiler,
 // invoked by NVCC’ (e.g. on MacOS). The former needs to see both host and device implementation
 // of the functions, while the latter can only deal with one of them.
-#elif !defined(EIGEN_HAS_NATIVE_FP16) || (EIGEN_COMP_CLANG && !EIGEN_COMP_NVCC) // Emulate support for half floats
+#elif !defined(EIGEN_HAS_NATIVE_FP16) || (EIGEN_COMP_CLANG && !EIGEN_COMP_NVCC)  // Emulate support for half floats
 
 #if EIGEN_COMP_CLANG && defined(EIGEN_GPUCC)
 // We need to provide emulated *host-side* FP16 operators for clang.
@@ -452,64 +406,48 @@
 #undef EIGEN_DEVICE_FUNC
 #if defined(EIGEN_HAS_CUDA_FP16) && defined(EIGEN_HAS_NATIVE_FP16)
 #define EIGEN_DEVICE_FUNC __host__
-#else // both host and device need emulated ops.
+#else  // both host and device need emulated ops.
 #define EIGEN_DEVICE_FUNC __host__ __device__
 #endif
 #endif
 
 // Definitions for CPUs and older HIP+CUDA, mostly working through conversion
 // to/from fp32.
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half operator + (const half& a, const half& b) {
-  return half(float(a) + float(b));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half operator * (const half& a, const half& b) {
-  return half(float(a) * float(b));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half operator - (const half& a, const half& b) {
-  return half(float(a) - float(b));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half operator / (const half& a, const half& b) {
-  return half(float(a) / float(b));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half operator - (const half& a) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half operator+(const half& a, const half& b) { return half(float(a) + float(b)); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half operator*(const half& a, const half& b) { return half(float(a) * float(b)); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half operator-(const half& a, const half& b) { return half(float(a) - float(b)); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half operator/(const half& a, const half& b) { return half(float(a) / float(b)); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half operator-(const half& a) {
   half result;
   result.x = a.x ^ 0x8000;
   return result;
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half& operator += (half& a, const half& b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half& operator+=(half& a, const half& b) {
   a = half(float(a) + float(b));
   return a;
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half& operator *= (half& a, const half& b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half& operator*=(half& a, const half& b) {
   a = half(float(a) * float(b));
   return a;
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half& operator -= (half& a, const half& b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half& operator-=(half& a, const half& b) {
   a = half(float(a) - float(b));
   return a;
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half& operator /= (half& a, const half& b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half& operator/=(half& a, const half& b) {
   a = half(float(a) / float(b));
   return a;
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator == (const half& a, const half& b) {
-  return numext::equal_strict(float(a),float(b));
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator==(const half& a, const half& b) {
+  return numext::equal_strict(float(a), float(b));
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator != (const half& a, const half& b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator!=(const half& a, const half& b) {
   return numext::not_equal_strict(float(a), float(b));
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator < (const half& a, const half& b) {
-  return float(a) < float(b);
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator <= (const half& a, const half& b) {
-  return float(a) <= float(b);
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator > (const half& a, const half& b) {
-  return float(a) > float(b);
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator >= (const half& a, const half& b) {
-  return float(a) >= float(b);
-}
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator<(const half& a, const half& b) { return float(a) < float(b); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator<=(const half& a, const half& b) { return float(a) <= float(b); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator>(const half& a, const half& b) { return float(a) > float(b); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool operator>=(const half& a, const half& b) { return float(a) >= float(b); }
 
 #if EIGEN_COMP_CLANG && defined(EIGEN_GPUCC)
 #pragma pop_macro("EIGEN_DEVICE_FUNC")
@@ -518,7 +456,7 @@
 
 // Division by an index. Do it in full float precision to avoid accuracy
 // issues in converting the denominator to half.
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half operator / (const half& a, Index b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half operator/(const half& a, Index b) {
   return half(static_cast<float>(a) / static_cast<float>(b));
 }
 
@@ -557,8 +495,8 @@
   // Fortunately, since we need to disable EIGEN_CONSTEXPR for GPU anyway, we can get out
   // of this catch22 by having separate bodies for GPU / non GPU
 #if defined(EIGEN_HAS_GPU_FP16)
-   __half_raw h;
-   h.x = x;
+  __half_raw h;
+  h.x = x;
   return h;
 #else
   return __half_raw(x);
@@ -585,18 +523,18 @@
 
 EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC __half_raw float_to_half_rtne(float ff) {
 #if (defined(EIGEN_HAS_CUDA_FP16) && defined(EIGEN_CUDA_ARCH) && EIGEN_CUDA_ARCH >= 300) || \
-  (defined(EIGEN_HAS_HIP_FP16) && defined(EIGEN_HIP_DEVICE_COMPILE))
+    (defined(EIGEN_HAS_HIP_FP16) && defined(EIGEN_HIP_DEVICE_COMPILE))
   __half tmp_ff = __float2half(ff);
   return *(__half_raw*)&tmp_ff;
 
 #elif defined(EIGEN_HAS_FP16_C)
   __half_raw h;
-  #if EIGEN_COMP_MSVC
-    // MSVC does not have scalar instructions.
-    h.x =_mm_extract_epi16(_mm_cvtps_ph(_mm_set_ss(ff), 0), 0);
-  #else
-    h.x = _cvtss_sh(ff, 0);
-  #endif
+#if EIGEN_COMP_MSVC
+  // MSVC does not have scalar instructions.
+  h.x = _mm_extract_epi16(_mm_cvtps_ph(_mm_set_ss(ff), 0), 0);
+#else
+  h.x = _cvtss_sh(ff, 0);
+#endif
   return h;
 
 #elif defined(EIGEN_HAS_ARM64_FP16_SCALAR_ARITHMETIC)
@@ -605,11 +543,12 @@
   return h;
 
 #else
-  float32_bits f; f.f = ff;
+  float32_bits f;
+  f.f = ff;
 
-  const float32_bits f32infty = { 255 << 23 };
-  const float32_bits f16max = { (127 + 16) << 23 };
-  const float32_bits denorm_magic = { ((127 - 15) + (23 - 10) + 1) << 23 };
+  const float32_bits f32infty = {255 << 23};
+  const float32_bits f16max = {(127 + 16) << 23};
+  const float32_bits denorm_magic = {((127 - 15) + (23 - 10) + 1) << 23};
   unsigned int sign_mask = 0x80000000u;
   __half_raw o;
   o.x = static_cast<numext::uint16_t>(0x0u);
@@ -622,10 +561,10 @@
   // 0x80000000. Important if you want fast straight SSE2 code
   // (since there's no unsigned PCMPGTD).
 
-  if (f.u >= f16max.u) {  // result is Inf or NaN (all exponent bits set)
-    o.x = (f.u > f32infty.u) ? 0x7e00 : 0x7c00; // NaN->qNaN and Inf->Inf
-  } else {  // (De)normalized number or zero
-    if (f.u < (113 << 23)) {  // resulting FP16 is subnormal or zero
+  if (f.u >= f16max.u) {                         // result is Inf or NaN (all exponent bits set)
+    o.x = (f.u > f32infty.u) ? 0x7e00 : 0x7c00;  // NaN->qNaN and Inf->Inf
+  } else {                                       // (De)normalized number or zero
+    if (f.u < (113 << 23)) {                     // resulting FP16 is subnormal or zero
       // use a magic value to align our 10 mantissa bits at the bottom of
       // the float. as long as FP addition is round-to-nearest-even this
       // just works.
@@ -634,7 +573,7 @@
       // and one integer subtract of the bias later, we have our final float!
       o.x = static_cast<numext::uint16_t>(f.u - denorm_magic.u);
     } else {
-      unsigned int mant_odd = (f.u >> 13) & 1; // resulting mantissa is odd
+      unsigned int mant_odd = (f.u >> 13) & 1;  // resulting mantissa is odd
 
       // update exponent, rounding bias part 1
       // Equivalent to `f.u += ((unsigned int)(15 - 127) << 23) + 0xfff`, but
@@ -654,51 +593,51 @@
 
 EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC float half_to_float(__half_raw h) {
 #if (defined(EIGEN_HAS_CUDA_FP16) && defined(EIGEN_CUDA_ARCH) && EIGEN_CUDA_ARCH >= 300) || \
-  (defined(EIGEN_HAS_HIP_FP16) && defined(EIGEN_HIP_DEVICE_COMPILE))
+    (defined(EIGEN_HAS_HIP_FP16) && defined(EIGEN_HIP_DEVICE_COMPILE))
   return __half2float(h);
 #elif defined(EIGEN_HAS_FP16_C)
-  #if EIGEN_COMP_MSVC
-    // MSVC does not have scalar instructions.
-    return _mm_cvtss_f32(_mm_cvtph_ps(_mm_set1_epi16(h.x)));
-  #else
-    return _cvtsh_ss(h.x);
-  #endif
+#if EIGEN_COMP_MSVC
+  // MSVC does not have scalar instructions.
+  return _mm_cvtss_f32(_mm_cvtph_ps(_mm_set1_epi16(h.x)));
+#else
+  return _cvtsh_ss(h.x);
+#endif
 #elif defined(EIGEN_HAS_ARM64_FP16_SCALAR_ARITHMETIC)
   return static_cast<float>(h.x);
 #else
-  const float32_bits magic = { 113 << 23 };
-  const unsigned int shifted_exp = 0x7c00 << 13; // exponent mask after shift
+  const float32_bits magic = {113 << 23};
+  const unsigned int shifted_exp = 0x7c00 << 13;  // exponent mask after shift
   float32_bits o;
 
-  o.u = (h.x & 0x7fff) << 13;             // exponent/mantissa bits
-  unsigned int exp = shifted_exp & o.u;   // just the exponent
-  o.u += (127 - 15) << 23;                // exponent adjust
+  o.u = (h.x & 0x7fff) << 13;            // exponent/mantissa bits
+  unsigned int exp = shifted_exp & o.u;  // just the exponent
+  o.u += (127 - 15) << 23;               // exponent adjust
 
   // handle exponent special cases
-  if (exp == shifted_exp) {     // Inf/NaN?
-    o.u += (128 - 16) << 23;    // extra exp adjust
-  } else if (exp == 0) {        // Zero/Denormal?
-    o.u += 1 << 23;             // extra exp adjust
-    o.f -= magic.f;             // renormalize
+  if (exp == shifted_exp) {   // Inf/NaN?
+    o.u += (128 - 16) << 23;  // extra exp adjust
+  } else if (exp == 0) {      // Zero/Denormal?
+    o.u += 1 << 23;           // extra exp adjust
+    o.f -= magic.f;           // renormalize
   }
 
-  o.u |= (h.x & 0x8000) << 16;    // sign bit
+  o.u |= (h.x & 0x8000) << 16;  // sign bit
   return o.f;
 #endif
 }
 
 // --- standard functions ---
 
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool (isinf)(const half& a) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool(isinf)(const half& a) {
 #ifdef EIGEN_HAS_ARM64_FP16_SCALAR_ARITHMETIC
   return (numext::bit_cast<numext::uint16_t>(a.x) & 0x7fff) == 0x7c00;
 #else
   return (a.x & 0x7fff) == 0x7c00;
 #endif
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool (isnan)(const half& a) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool(isnan)(const half& a) {
 #if (defined(EIGEN_HAS_CUDA_FP16) && defined(EIGEN_CUDA_ARCH) && EIGEN_CUDA_ARCH >= 530) || \
-  (defined(EIGEN_HAS_HIP_FP16) && defined(EIGEN_HIP_DEVICE_COMPILE))
+    (defined(EIGEN_HAS_HIP_FP16) && defined(EIGEN_HIP_DEVICE_COMPILE))
   return __hisnan(a);
 #elif defined(EIGEN_HAS_ARM64_FP16_SCALAR_ARITHMETIC)
   return (numext::bit_cast<numext::uint16_t>(a.x) & 0x7fff) > 0x7c00;
@@ -706,8 +645,8 @@
   return (a.x & 0x7fff) > 0x7c00;
 #endif
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool (isfinite)(const half& a) {
-  return !(isinf EIGEN_NOT_A_MACRO (a)) && !(isnan EIGEN_NOT_A_MACRO (a));
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool(isfinite)(const half& a) {
+  return !(isinf EIGEN_NOT_A_MACRO(a)) && !(isnan EIGEN_NOT_A_MACRO(a));
 }
 
 EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half abs(const half& a) {
@@ -721,39 +660,34 @@
 }
 EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half exp(const half& a) {
 #if (EIGEN_CUDA_SDK_VER >= 80000 && defined EIGEN_CUDA_ARCH && EIGEN_CUDA_ARCH >= 530) || \
-  defined(EIGEN_HIP_DEVICE_COMPILE)
+    defined(EIGEN_HIP_DEVICE_COMPILE)
   return half(hexp(a));
 #else
-   return half(::expf(float(a)));
+  return half(::expf(float(a)));
 #endif
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half expm1(const half& a) {
-  return half(numext::expm1(float(a)));
-}
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half expm1(const half& a) { return half(numext::expm1(float(a))); }
 EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half log(const half& a) {
-#if (defined(EIGEN_HAS_CUDA_FP16) && EIGEN_CUDA_SDK_VER >= 80000 && defined(EIGEN_CUDA_ARCH) && EIGEN_CUDA_ARCH >= 530) || \
-  (defined(EIGEN_HAS_HIP_FP16) && defined(EIGEN_HIP_DEVICE_COMPILE))
+#if (defined(EIGEN_HAS_CUDA_FP16) && EIGEN_CUDA_SDK_VER >= 80000 && defined(EIGEN_CUDA_ARCH) && \
+     EIGEN_CUDA_ARCH >= 530) ||                                                                 \
+    (defined(EIGEN_HAS_HIP_FP16) && defined(EIGEN_HIP_DEVICE_COMPILE))
   return half(::hlog(a));
 #else
   return half(::logf(float(a)));
 #endif
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half log1p(const half& a) {
-  return half(numext::log1p(float(a)));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half log10(const half& a) {
-  return half(::log10f(float(a)));
-}
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half log1p(const half& a) { return half(numext::log1p(float(a))); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half log10(const half& a) { return half(::log10f(float(a))); }
 EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half log2(const half& a) {
   return half(static_cast<float>(EIGEN_LOG2E) * ::logf(float(a)));
 }
 
 EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half sqrt(const half& a) {
 #if (EIGEN_CUDA_SDK_VER >= 80000 && defined EIGEN_CUDA_ARCH && EIGEN_CUDA_ARCH >= 530) || \
-  defined(EIGEN_HIP_DEVICE_COMPILE)
+    defined(EIGEN_HIP_DEVICE_COMPILE)
   return half(hsqrt(a));
 #else
-    return half(::sqrtf(float(a)));
+  return half(::sqrtf(float(a)));
 #endif
 }
 EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half pow(const half& a, const half& b) {
@@ -762,33 +696,17 @@
 EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half atan2(const half& a, const half& b) {
   return half(::atan2f(float(a), float(b)));
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half sin(const half& a) {
-  return half(::sinf(float(a)));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half cos(const half& a) {
-  return half(::cosf(float(a)));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half tan(const half& a) {
-  return half(::tanf(float(a)));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half tanh(const half& a) {
-  return half(::tanhf(float(a)));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half asin(const half& a) {
-  return half(::asinf(float(a)));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half acos(const half& a) {
-  return half(::acosf(float(a)));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half atan(const half& a) {
-  return half(::atanf(float(a)));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half atanh(const half& a) {
-  return half(::atanhf(float(a)));
-}
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half sin(const half& a) { return half(::sinf(float(a))); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half cos(const half& a) { return half(::cosf(float(a))); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half tan(const half& a) { return half(::tanf(float(a))); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half tanh(const half& a) { return half(::tanhf(float(a))); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half asin(const half& a) { return half(::asinf(float(a))); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half acos(const half& a) { return half(::acosf(float(a))); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half atan(const half& a) { return half(::atanf(float(a))); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half atanh(const half& a) { return half(::atanhf(float(a))); }
 EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half floor(const half& a) {
 #if (EIGEN_CUDA_SDK_VER >= 80000 && defined EIGEN_CUDA_ARCH && EIGEN_CUDA_ARCH >= 300) || \
-  defined(EIGEN_HIP_DEVICE_COMPILE)
+    defined(EIGEN_HIP_DEVICE_COMPILE)
   return half(hfloor(a));
 #else
   return half(::floorf(float(a)));
@@ -796,25 +714,21 @@
 }
 EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half ceil(const half& a) {
 #if (EIGEN_CUDA_SDK_VER >= 80000 && defined EIGEN_CUDA_ARCH && EIGEN_CUDA_ARCH >= 300) || \
-  defined(EIGEN_HIP_DEVICE_COMPILE)
+    defined(EIGEN_HIP_DEVICE_COMPILE)
   return half(hceil(a));
 #else
   return half(::ceilf(float(a)));
 #endif
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half rint(const half& a) {
-  return half(::rintf(float(a)));
-}
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half round(const half& a) {
-  return half(::roundf(float(a)));
-}
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half rint(const half& a) { return half(::rintf(float(a))); }
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half round(const half& a) { return half(::roundf(float(a))); }
 EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half fmod(const half& a, const half& b) {
   return half(::fmodf(float(a), float(b)));
 }
 
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half (min)(const half& a, const half& b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half(min)(const half& a, const half& b) {
 #if (defined(EIGEN_HAS_CUDA_FP16) && defined(EIGEN_CUDA_ARCH) && EIGEN_CUDA_ARCH >= 530) || \
-  (defined(EIGEN_HAS_HIP_FP16) && defined(EIGEN_HIP_DEVICE_COMPILE))
+    (defined(EIGEN_HAS_HIP_FP16) && defined(EIGEN_HIP_DEVICE_COMPILE))
   return __hlt(b, a) ? b : a;
 #else
   const float f1 = static_cast<float>(a);
@@ -822,9 +736,9 @@
   return f2 < f1 ? b : a;
 #endif
 }
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half (max)(const half& a, const half& b) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half(max)(const half& a, const half& b) {
 #if (defined(EIGEN_HAS_CUDA_FP16) && defined(EIGEN_CUDA_ARCH) && EIGEN_CUDA_ARCH >= 530) || \
-  (defined(EIGEN_HAS_HIP_FP16) && defined(EIGEN_HIP_DEVICE_COMPILE))
+    (defined(EIGEN_HAS_HIP_FP16) && defined(EIGEN_HIP_DEVICE_COMPILE))
   return __hlt(a, b) ? b : a;
 #else
   const float f1 = static_cast<float>(a);
@@ -834,51 +748,43 @@
 }
 
 #ifndef EIGEN_NO_IO
-EIGEN_ALWAYS_INLINE std::ostream& operator << (std::ostream& os, const half& v) {
+EIGEN_ALWAYS_INLINE std::ostream& operator<<(std::ostream& os, const half& v) {
   os << static_cast<float>(v);
   return os;
 }
 #endif
 
-} // end namespace half_impl
+}  // end namespace half_impl
 
 // import Eigen::half_impl::half into Eigen namespace
 // using half_impl::half;
 
 namespace internal {
 
-template<>
-struct random_default_impl<half, false, false>
-{
-  static inline half run(const half& x, const half& y)
-  {
-    return x + (y-x) * half(float(std::rand()) / float(RAND_MAX));
+template <>
+struct random_default_impl<half, false, false> {
+  static inline half run(const half& x, const half& y) {
+    return x + (y - x) * half(float(std::rand()) / float(RAND_MAX));
   }
-  static inline half run()
-  {
-    return run(half(-1.f), half(1.f));
-  }
+  static inline half run() { return run(half(-1.f), half(1.f)); }
 };
 
-template<> struct is_arithmetic<half> { enum { value = true }; };
+template <>
+struct is_arithmetic<half> {
+  enum { value = true };
+};
 
-} // end namespace internal
+}  // end namespace internal
 
-template<> struct NumTraits<Eigen::half>
-    : GenericNumTraits<Eigen::half>
-{
-  enum {
-    IsSigned = true,
-    IsInteger = false,
-    IsComplex = false,
-    RequireInitialization = false
-  };
+template <>
+struct NumTraits<Eigen::half> : GenericNumTraits<Eigen::half> {
+  enum { IsSigned = true, IsInteger = false, IsComplex = false, RequireInitialization = false };
 
   EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static EIGEN_STRONG_INLINE Eigen::half epsilon() {
     return half_impl::raw_uint16_to_half(0x0800);
   }
   EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static EIGEN_STRONG_INLINE Eigen::half dummy_precision() {
-    return half_impl::raw_uint16_to_half(0x211f); //  Eigen::half(1e-2f);
+    return half_impl::raw_uint16_to_half(0x211f);  //  Eigen::half(1e-2f);
   }
   EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static EIGEN_STRONG_INLINE Eigen::half highest() {
     return half_impl::raw_uint16_to_half(0x7bff);
@@ -894,10 +800,10 @@
   }
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
 #if defined(EIGEN_HAS_GPU_FP16) || defined(EIGEN_HAS_ARM64_FP16_SCALAR_ARITHMETIC)
-  #pragma pop_macro("EIGEN_CONSTEXPR")
+#pragma pop_macro("EIGEN_CONSTEXPR")
 #endif
 
 namespace Eigen {
@@ -946,63 +852,65 @@
 //    with native support for __half and __nv_bfloat16
 //
 // Note that the following are __device__ - only functions.
-#if (defined(EIGEN_CUDACC) && (!defined(EIGEN_CUDA_ARCH) || EIGEN_CUDA_ARCH >= 300)) \
-    || defined(EIGEN_HIPCC)
+#if (defined(EIGEN_CUDACC) && (!defined(EIGEN_CUDA_ARCH) || EIGEN_CUDA_ARCH >= 300)) || defined(EIGEN_HIPCC)
 
 #if defined(EIGEN_HAS_CUDA_FP16) && EIGEN_CUDA_SDK_VER >= 90000
 
-__device__ EIGEN_STRONG_INLINE Eigen::half __shfl_sync(unsigned mask, Eigen::half var, int srcLane, int width=warpSize) {
+__device__ EIGEN_STRONG_INLINE Eigen::half __shfl_sync(unsigned mask, Eigen::half var, int srcLane,
+                                                       int width = warpSize) {
   const __half h = var;
   return static_cast<Eigen::half>(__shfl_sync(mask, h, srcLane, width));
 }
 
-__device__ EIGEN_STRONG_INLINE Eigen::half __shfl_up_sync(unsigned mask, Eigen::half var, unsigned int delta, int width=warpSize) {
+__device__ EIGEN_STRONG_INLINE Eigen::half __shfl_up_sync(unsigned mask, Eigen::half var, unsigned int delta,
+                                                          int width = warpSize) {
   const __half h = var;
   return static_cast<Eigen::half>(__shfl_up_sync(mask, h, delta, width));
 }
 
-__device__ EIGEN_STRONG_INLINE Eigen::half __shfl_down_sync(unsigned mask, Eigen::half var, unsigned int delta, int width=warpSize) {
+__device__ EIGEN_STRONG_INLINE Eigen::half __shfl_down_sync(unsigned mask, Eigen::half var, unsigned int delta,
+                                                            int width = warpSize) {
   const __half h = var;
   return static_cast<Eigen::half>(__shfl_down_sync(mask, h, delta, width));
 }
 
-__device__ EIGEN_STRONG_INLINE Eigen::half __shfl_xor_sync(unsigned mask, Eigen::half var, int laneMask, int width=warpSize) {
+__device__ EIGEN_STRONG_INLINE Eigen::half __shfl_xor_sync(unsigned mask, Eigen::half var, int laneMask,
+                                                           int width = warpSize) {
   const __half h = var;
   return static_cast<Eigen::half>(__shfl_xor_sync(mask, h, laneMask, width));
 }
 
-#else // HIP or CUDA SDK < 9.0
+#else  // HIP or CUDA SDK < 9.0
 
-__device__ EIGEN_STRONG_INLINE Eigen::half __shfl(Eigen::half var, int srcLane, int width=warpSize) {
+__device__ EIGEN_STRONG_INLINE Eigen::half __shfl(Eigen::half var, int srcLane, int width = warpSize) {
   const int ivar = static_cast<int>(Eigen::numext::bit_cast<Eigen::numext::uint16_t>(var));
   return Eigen::numext::bit_cast<Eigen::half>(static_cast<Eigen::numext::uint16_t>(__shfl(ivar, srcLane, width)));
 }
 
-__device__ EIGEN_STRONG_INLINE Eigen::half __shfl_up(Eigen::half var, unsigned int delta, int width=warpSize) {
+__device__ EIGEN_STRONG_INLINE Eigen::half __shfl_up(Eigen::half var, unsigned int delta, int width = warpSize) {
   const int ivar = static_cast<int>(Eigen::numext::bit_cast<Eigen::numext::uint16_t>(var));
   return Eigen::numext::bit_cast<Eigen::half>(static_cast<Eigen::numext::uint16_t>(__shfl_up(ivar, delta, width)));
 }
 
-__device__ EIGEN_STRONG_INLINE Eigen::half __shfl_down(Eigen::half var, unsigned int delta, int width=warpSize) {
+__device__ EIGEN_STRONG_INLINE Eigen::half __shfl_down(Eigen::half var, unsigned int delta, int width = warpSize) {
   const int ivar = static_cast<int>(Eigen::numext::bit_cast<Eigen::numext::uint16_t>(var));
   return Eigen::numext::bit_cast<Eigen::half>(static_cast<Eigen::numext::uint16_t>(__shfl_down(ivar, delta, width)));
 }
 
-__device__ EIGEN_STRONG_INLINE Eigen::half __shfl_xor(Eigen::half var, int laneMask, int width=warpSize) {
+__device__ EIGEN_STRONG_INLINE Eigen::half __shfl_xor(Eigen::half var, int laneMask, int width = warpSize) {
   const int ivar = static_cast<int>(Eigen::numext::bit_cast<Eigen::numext::uint16_t>(var));
   return Eigen::numext::bit_cast<Eigen::half>(static_cast<Eigen::numext::uint16_t>(__shfl_xor(ivar, laneMask, width)));
 }
 
-#endif // HIP vs CUDA
-#endif // __shfl*
+#endif  // HIP vs CUDA
+#endif  // __shfl*
 
 // ldg() has an overload for __half_raw, but we also need one for Eigen::half.
-#if (defined(EIGEN_CUDACC) && (!defined(EIGEN_CUDA_ARCH) || EIGEN_CUDA_ARCH >= 350)) \
-    || defined(EIGEN_HIPCC)
+#if (defined(EIGEN_CUDACC) && (!defined(EIGEN_CUDA_ARCH) || EIGEN_CUDA_ARCH >= 350)) || defined(EIGEN_HIPCC)
 EIGEN_STRONG_INLINE __device__ Eigen::half __ldg(const Eigen::half* ptr) {
   return Eigen::half_impl::raw_uint16_to_half(__ldg(reinterpret_cast<const Eigen::numext::uint16_t*>(ptr)));
 }
-#endif // __ldg
+#endif  // __ldg
 
 #if EIGEN_HAS_STD_HASH
 namespace std {
@@ -1012,7 +920,7 @@
     return static_cast<std::size_t>(Eigen::numext::bit_cast<Eigen::numext::uint16_t>(a));
   }
 };
-} // end namespace std
+}  // end namespace std
 #endif
 
 namespace Eigen {
@@ -1020,8 +928,7 @@
 
 template <>
 struct cast_impl<float, half> {
-  EIGEN_DEVICE_FUNC
-  static inline half run(const float& a) {
+  EIGEN_DEVICE_FUNC static inline half run(const float& a) {
 #if (defined(EIGEN_HAS_CUDA_FP16) && defined(EIGEN_CUDA_ARCH) && EIGEN_CUDA_ARCH >= 300) || \
     (defined(EIGEN_HAS_HIP_FP16) && defined(EIGEN_HIP_DEVICE_COMPILE))
     return __float2half(a);
@@ -1033,8 +940,7 @@
 
 template <>
 struct cast_impl<int, half> {
-  EIGEN_DEVICE_FUNC
-  static inline half run(const int& a) {
+  EIGEN_DEVICE_FUNC static inline half run(const int& a) {
 #if (defined(EIGEN_HAS_CUDA_FP16) && defined(EIGEN_CUDA_ARCH) && EIGEN_CUDA_ARCH >= 300) || \
     (defined(EIGEN_HAS_HIP_FP16) && defined(EIGEN_HIP_DEVICE_COMPILE))
     return __float2half(static_cast<float>(a));
@@ -1046,8 +952,7 @@
 
 template <>
 struct cast_impl<half, float> {
-  EIGEN_DEVICE_FUNC
-  static inline float run(const half& a) {
+  EIGEN_DEVICE_FUNC static inline float run(const half& a) {
 #if (defined(EIGEN_HAS_CUDA_FP16) && defined(EIGEN_CUDA_ARCH) && EIGEN_CUDA_ARCH >= 300) || \
     (defined(EIGEN_HAS_HIP_FP16) && defined(EIGEN_HIP_DEVICE_COMPILE))
     return __half2float(a);
@@ -1060,4 +965,4 @@
 }  // namespace internal
 }  // namespace Eigen
 
-#endif // EIGEN_HALF_H
+#endif  // EIGEN_HALF_H
diff --git a/Eigen/src/Core/arch/Default/Settings.h b/Eigen/src/Core/arch/Default/Settings.h
index a5c3ada..7e3a970 100644
--- a/Eigen/src/Core/arch/Default/Settings.h
+++ b/Eigen/src/Core/arch/Default/Settings.h
@@ -8,7 +8,6 @@
 // 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/.
 
-
 /* All the parameters defined in this file can be specialized in the
  * architecture specific files, and/or by the user.
  * More to come... */
@@ -17,33 +16,32 @@
 #define EIGEN_DEFAULT_SETTINGS_H
 
 /** Defines the maximal loop size to enable meta unrolling of loops.
-  * Note that the value here is expressed in Eigen's own notion of "number of FLOPS",
-  * it does not correspond to the number of iterations or the number of instructions
-  */
+ * Note that the value here is expressed in Eigen's own notion of "number of FLOPS",
+ * it does not correspond to the number of iterations or the number of instructions
+ */
 #ifndef EIGEN_UNROLLING_LIMIT
 #define EIGEN_UNROLLING_LIMIT 110
 #endif
 
 /** Defines the threshold between a "small" and a "large" matrix.
-  * This threshold is mainly used to select the proper product implementation.
-  */
+ * This threshold is mainly used to select the proper product implementation.
+ */
 #ifndef EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD
 #define EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD 8
 #endif
 
 /** Defines the maximal width of the blocks used in the triangular product and solver
-  * for vectors (level 2 blas xTRMV and xTRSV). The default is 8.
-  */
+ * for vectors (level 2 blas xTRMV and xTRSV). The default is 8.
+ */
 #ifndef EIGEN_TUNE_TRIANGULAR_PANEL_WIDTH
 #define EIGEN_TUNE_TRIANGULAR_PANEL_WIDTH 8
 #endif
 
-
 /** Defines the default number of registers available for that architecture.
-  * Currently it must be 8 or 16. Other values will fail.
-  */
+ * Currently it must be 8 or 16. Other values will fail.
+ */
 #ifndef EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS
 #define EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS 8
 #endif
 
-#endif // EIGEN_DEFAULT_SETTINGS_H
+#endif  // EIGEN_DEFAULT_SETTINGS_H
diff --git a/Eigen/src/Core/arch/GPU/Complex.h b/Eigen/src/Core/arch/GPU/Complex.h
index 8a7869c..fa46aec 100644
--- a/Eigen/src/Core/arch/GPU/Complex.h
+++ b/Eigen/src/Core/arch/GPU/Complex.h
@@ -31,7 +31,7 @@
 //    to the first inclusion of <complex>.
 
 #if defined(EIGEN_GPUCC) && defined(EIGEN_GPU_COMPILE_PHASE)
-    
+
 // ICC already specializes std::complex<float> and std::complex<double>
 // operators, preventing us from making them device functions here.
 // This will lead to silent runtime errors if the operators are used on device.
@@ -62,33 +62,30 @@
 // Specialized std::complex overloads.
 namespace complex_operator_detail {
 
-template<typename T>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-std::complex<T> complex_multiply(const std::complex<T>& a, const std::complex<T>& b) {
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> complex_multiply(const std::complex<T>& a,
+                                                                       const std::complex<T>& b) {
   const T a_real = numext::real(a);
   const T a_imag = numext::imag(a);
   const T b_real = numext::real(b);
   const T b_imag = numext::imag(b);
-  return std::complex<T>(
-      a_real * b_real - a_imag * b_imag,
-      a_imag * b_real + a_real * b_imag);
+  return std::complex<T>(a_real * b_real - a_imag * b_imag, a_imag * b_real + a_real * b_imag);
 }
 
-template<typename T>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-std::complex<T> complex_divide_fast(const std::complex<T>& a, const std::complex<T>& b) {
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> complex_divide_fast(const std::complex<T>& a,
+                                                                          const std::complex<T>& b) {
   const T a_real = numext::real(a);
   const T a_imag = numext::imag(a);
   const T b_real = numext::real(b);
   const T b_imag = numext::imag(b);
   const T norm = (b_real * b_real + b_imag * b_imag);
-  return std::complex<T>((a_real * b_real + a_imag * b_imag) / norm,
-                          (a_imag * b_real - a_real * b_imag) / norm);
+  return std::complex<T>((a_real * b_real + a_imag * b_imag) / norm, (a_imag * b_real - a_real * b_imag) / norm);
 }
 
-template<typename T>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-std::complex<T> complex_divide_stable(const std::complex<T>& a, const std::complex<T>& b) {
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> complex_divide_stable(const std::complex<T>& a,
+                                                                            const std::complex<T>& b) {
   const T a_real = numext::real(a);
   const T a_imag = numext::imag(a);
   const T b_real = numext::real(b);
@@ -99,13 +96,13 @@
   const T rscale = scale_imag ? T(1) : b_real / b_imag;
   const T iscale = scale_imag ? b_imag / b_real : T(1);
   const T denominator = b_real * rscale + b_imag * iscale;
-  return std::complex<T>((a_real * rscale + a_imag * iscale) / denominator, 
+  return std::complex<T>((a_real * rscale + a_imag * iscale) / denominator,
                          (a_imag * rscale - a_real * iscale) / denominator);
 }
 
-template<typename T>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-std::complex<T> complex_divide(const std::complex<T>& a, const std::complex<T>& b) {
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> complex_divide(const std::complex<T>& a,
+                                                                     const std::complex<T>& b) {
 #if EIGEN_FAST_MATH
   return complex_divide_fast(a, b);
 #else
@@ -118,131 +115,107 @@
 //       since they are already specialized for float/double/long double within
 //       the standard <complex> header. We also do not specialize the stream
 //       operators.
-#define EIGEN_CREATE_STD_COMPLEX_OPERATOR_SPECIALIZATIONS(T)                                    \
-                                                                                                \
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                                                           \
-std::complex<T> operator+(const std::complex<T>& a) { return a; }                               \
-                                                                                                \
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                                                           \
-std::complex<T> operator-(const std::complex<T>& a) {                                           \
-  return std::complex<T>(-numext::real(a), -numext::imag(a));                                   \
-}                                                                                               \
-                                                                                                \
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                                                           \
-std::complex<T> operator+(const std::complex<T>& a, const std::complex<T>& b) {                 \
-  return std::complex<T>(numext::real(a) + numext::real(b), numext::imag(a) + numext::imag(b)); \
-}                                                                                               \
-                                                                                                \
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                                                           \
-std::complex<T> operator+(const std::complex<T>& a, const T& b) {                               \
-  return std::complex<T>(numext::real(a) + b, numext::imag(a));                                 \
-}                                                                                               \
-                                                                                                \
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                                                           \
-std::complex<T> operator+(const T& a, const std::complex<T>& b) {                               \
-  return std::complex<T>(a + numext::real(b), numext::imag(b));                                 \
-}                                                                                               \
-                                                                                                \
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                                                           \
-std::complex<T> operator-(const std::complex<T>& a, const std::complex<T>& b) {                 \
-  return std::complex<T>(numext::real(a) - numext::real(b), numext::imag(a) - numext::imag(b)); \
-}                                                                                               \
-                                                                                                \
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                                                           \
-std::complex<T> operator-(const std::complex<T>& a, const T& b) {                               \
-  return std::complex<T>(numext::real(a) - b, numext::imag(a));                                 \
-}                                                                                               \
-                                                                                                \
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                                                           \
-std::complex<T> operator-(const T& a, const std::complex<T>& b) {                               \
-  return std::complex<T>(a - numext::real(b), -numext::imag(b));                                \
-}                                                                                               \
-                                                                                                \
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                                                           \
-std::complex<T> operator*(const std::complex<T>& a, const std::complex<T>& b) {                 \
-  return complex_multiply(a, b);                                                                \
-}                                                                                               \
-                                                                                                \
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                                                           \
-std::complex<T> operator*(const std::complex<T>& a, const T& b) {                               \
-  return std::complex<T>(numext::real(a) * b, numext::imag(a) * b);                             \
-}                                                                                               \
-                                                                                                \
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                                                           \
-std::complex<T> operator*(const T& a, const std::complex<T>& b) {                               \
-  return std::complex<T>(a * numext::real(b), a * numext::imag(b));                             \
-}                                                                                               \
-                                                                                                \
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                                                           \
-std::complex<T> operator/(const std::complex<T>& a, const std::complex<T>& b) {                 \
-  return complex_divide(a, b);                                                                  \
-}                                                                                               \
-                                                                                                \
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                                                           \
-std::complex<T> operator/(const std::complex<T>& a, const T& b) {                               \
-  return std::complex<T>(numext::real(a) / b, numext::imag(a) / b);                             \
-}                                                                                               \
-                                                                                                \
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                                                           \
-std::complex<T> operator/(const T& a, const std::complex<T>& b) {                               \
-  return complex_divide(std::complex<T>(a, 0), b);                                              \
-}                                                                                               \
-                                                                                                \
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                                                           \
-std::complex<T>& operator+=(std::complex<T>& a, const std::complex<T>& b) {                     \
-  numext::real_ref(a) += numext::real(b);                                                       \
-  numext::imag_ref(a) += numext::imag(b);                                                       \
-  return a;                                                                                     \
-}                                                                                               \
-                                                                                                \
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                                                           \
-std::complex<T>& operator-=(std::complex<T>& a, const std::complex<T>& b) {                     \
-  numext::real_ref(a) -= numext::real(b);                                                       \
-  numext::imag_ref(a) -= numext::imag(b);                                                       \
-  return a;                                                                                     \
-}                                                                                               \
-                                                                                                \
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                                                           \
-std::complex<T>& operator*=(std::complex<T>& a, const std::complex<T>& b) {                     \
-  a = complex_multiply(a, b);                                                                   \
-  return a;                                                                                     \
-}                                                                                               \
-                                                                                                \
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                                                           \
-std::complex<T>& operator/=(std::complex<T>& a, const std::complex<T>& b) {                     \
-  a = complex_divide(a, b);                                                                     \
-  return  a;                                                                                    \
-}                                                                                               \
-                                                                                                \
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                                                           \
-bool operator==(const std::complex<T>& a, const std::complex<T>& b) {                           \
-  return numext::real(a) == numext::real(b) && numext::imag(a) == numext::imag(b);              \
-}                                                                                               \
-                                                                                                \
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                                                           \
-bool operator==(const std::complex<T>& a, const T& b) {                                         \
-  return numext::real(a) == b && numext::imag(a) == 0;                                          \
-}                                                                                               \
-                                                                                                \
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                                                           \
-bool operator==(const T& a, const std::complex<T>& b) {                                         \
-  return a  == numext::real(b) && 0 == numext::imag(b);                                         \
-}                                                                                               \
-                                                                                                \
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                                                           \
-bool operator!=(const std::complex<T>& a, const std::complex<T>& b) {                           \
-  return !(a == b);                                                                             \
-}                                                                                               \
-                                                                                                \
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                                                           \
-bool operator!=(const std::complex<T>& a, const T& b) {                                         \
-  return !(a == b);                                                                             \
-}                                                                                               \
-                                                                                                \
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                                                           \
-bool operator!=(const T& a, const std::complex<T>& b) {                                         \
-  return !(a == b);                                                                             \
-}
+#define EIGEN_CREATE_STD_COMPLEX_OPERATOR_SPECIALIZATIONS(T)                                                        \
+                                                                                                                    \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> operator+(const std::complex<T>& a) { return a; }           \
+                                                                                                                    \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> operator-(const std::complex<T>& a) {                       \
+    return std::complex<T>(-numext::real(a), -numext::imag(a));                                                     \
+  }                                                                                                                 \
+                                                                                                                    \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> operator+(const std::complex<T>& a,                         \
+                                                                  const std::complex<T>& b) {                       \
+    return std::complex<T>(numext::real(a) + numext::real(b), numext::imag(a) + numext::imag(b));                   \
+  }                                                                                                                 \
+                                                                                                                    \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> operator+(const std::complex<T>& a, const T& b) {           \
+    return std::complex<T>(numext::real(a) + b, numext::imag(a));                                                   \
+  }                                                                                                                 \
+                                                                                                                    \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> operator+(const T& a, const std::complex<T>& b) {           \
+    return std::complex<T>(a + numext::real(b), numext::imag(b));                                                   \
+  }                                                                                                                 \
+                                                                                                                    \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> operator-(const std::complex<T>& a,                         \
+                                                                  const std::complex<T>& b) {                       \
+    return std::complex<T>(numext::real(a) - numext::real(b), numext::imag(a) - numext::imag(b));                   \
+  }                                                                                                                 \
+                                                                                                                    \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> operator-(const std::complex<T>& a, const T& b) {           \
+    return std::complex<T>(numext::real(a) - b, numext::imag(a));                                                   \
+  }                                                                                                                 \
+                                                                                                                    \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> operator-(const T& a, const std::complex<T>& b) {           \
+    return std::complex<T>(a - numext::real(b), -numext::imag(b));                                                  \
+  }                                                                                                                 \
+                                                                                                                    \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> operator*(const std::complex<T>& a,                         \
+                                                                  const std::complex<T>& b) {                       \
+    return complex_multiply(a, b);                                                                                  \
+  }                                                                                                                 \
+                                                                                                                    \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> operator*(const std::complex<T>& a, const T& b) {           \
+    return std::complex<T>(numext::real(a) * b, numext::imag(a) * b);                                               \
+  }                                                                                                                 \
+                                                                                                                    \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> operator*(const T& a, const std::complex<T>& b) {           \
+    return std::complex<T>(a * numext::real(b), a * numext::imag(b));                                               \
+  }                                                                                                                 \
+                                                                                                                    \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> operator/(const std::complex<T>& a,                         \
+                                                                  const std::complex<T>& b) {                       \
+    return complex_divide(a, b);                                                                                    \
+  }                                                                                                                 \
+                                                                                                                    \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> operator/(const std::complex<T>& a, const T& b) {           \
+    return std::complex<T>(numext::real(a) / b, numext::imag(a) / b);                                               \
+  }                                                                                                                 \
+                                                                                                                    \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T> operator/(const T& a, const std::complex<T>& b) {           \
+    return complex_divide(std::complex<T>(a, 0), b);                                                                \
+  }                                                                                                                 \
+                                                                                                                    \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T>& operator+=(std::complex<T>& a, const std::complex<T>& b) { \
+    numext::real_ref(a) += numext::real(b);                                                                         \
+    numext::imag_ref(a) += numext::imag(b);                                                                         \
+    return a;                                                                                                       \
+  }                                                                                                                 \
+                                                                                                                    \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T>& operator-=(std::complex<T>& a, const std::complex<T>& b) { \
+    numext::real_ref(a) -= numext::real(b);                                                                         \
+    numext::imag_ref(a) -= numext::imag(b);                                                                         \
+    return a;                                                                                                       \
+  }                                                                                                                 \
+                                                                                                                    \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T>& operator*=(std::complex<T>& a, const std::complex<T>& b) { \
+    a = complex_multiply(a, b);                                                                                     \
+    return a;                                                                                                       \
+  }                                                                                                                 \
+                                                                                                                    \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<T>& operator/=(std::complex<T>& a, const std::complex<T>& b) { \
+    a = complex_divide(a, b);                                                                                       \
+    return a;                                                                                                       \
+  }                                                                                                                 \
+                                                                                                                    \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator==(const std::complex<T>& a, const std::complex<T>& b) {       \
+    return numext::real(a) == numext::real(b) && numext::imag(a) == numext::imag(b);                                \
+  }                                                                                                                 \
+                                                                                                                    \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator==(const std::complex<T>& a, const T& b) {                     \
+    return numext::real(a) == b && numext::imag(a) == 0;                                                            \
+  }                                                                                                                 \
+                                                                                                                    \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator==(const T& a, const std::complex<T>& b) {                     \
+    return a == numext::real(b) && 0 == numext::imag(b);                                                            \
+  }                                                                                                                 \
+                                                                                                                    \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator!=(const std::complex<T>& a, const std::complex<T>& b) {       \
+    return !(a == b);                                                                                               \
+  }                                                                                                                 \
+                                                                                                                    \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator!=(const std::complex<T>& a, const T& b) { return !(a == b); } \
+                                                                                                                    \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator!=(const T& a, const std::complex<T>& b) { return !(a == b); }
 
 // Do not specialize for long double, since that reduces to double on device.
 EIGEN_CREATE_STD_COMPLEX_OPERATOR_SPECIALIZATIONS(float)
@@ -250,7 +223,6 @@
 
 #undef EIGEN_CREATE_STD_COMPLEX_OPERATOR_SPECIALIZATIONS
 
-  
 }  // namespace complex_operator_detail
 
 EIGEN_USING_STD_COMPLEX_OPERATORS
diff --git a/Eigen/src/Core/arch/GPU/MathFunctions.h b/Eigen/src/Core/arch/GPU/MathFunctions.h
index f8191db..606215f 100644
--- a/Eigen/src/Core/arch/GPU/MathFunctions.h
+++ b/Eigen/src/Core/arch/GPU/MathFunctions.h
@@ -21,86 +21,73 @@
 // introduce conflicts between these packet_traits definitions and the ones
 // we'll use on the host side (SSE, AVX, ...)
 #if defined(EIGEN_GPUCC) && defined(EIGEN_USE_GPU)
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-float4 plog<float4>(const float4& a)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 plog<float4>(const float4& a) {
   return make_float4(logf(a.x), logf(a.y), logf(a.z), logf(a.w));
 }
 
-template<>  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-double2 plog<double2>(const double2& a)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 plog<double2>(const double2& a) {
   using ::log;
   return make_double2(log(a.x), log(a.y));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-float4 plog1p<float4>(const float4& a)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 plog1p<float4>(const float4& a) {
   return make_float4(log1pf(a.x), log1pf(a.y), log1pf(a.z), log1pf(a.w));
 }
 
-template<>  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-double2 plog1p<double2>(const double2& a)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 plog1p<double2>(const double2& a) {
   return make_double2(log1p(a.x), log1p(a.y));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-float4 pexp<float4>(const float4& a)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pexp<float4>(const float4& a) {
   return make_float4(expf(a.x), expf(a.y), expf(a.z), expf(a.w));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-double2 pexp<double2>(const double2& a)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pexp<double2>(const double2& a) {
   using ::exp;
   return make_double2(exp(a.x), exp(a.y));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-float4 pexpm1<float4>(const float4& a)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pexpm1<float4>(const float4& a) {
   return make_float4(expm1f(a.x), expm1f(a.y), expm1f(a.z), expm1f(a.w));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-double2 pexpm1<double2>(const double2& a)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pexpm1<double2>(const double2& a) {
   return make_double2(expm1(a.x), expm1(a.y));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-float4 psqrt<float4>(const float4& a)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 psqrt<float4>(const float4& a) {
   return make_float4(sqrtf(a.x), sqrtf(a.y), sqrtf(a.z), sqrtf(a.w));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-double2 psqrt<double2>(const double2& a)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 psqrt<double2>(const double2& a) {
   using ::sqrt;
   return make_double2(sqrt(a.x), sqrt(a.y));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-float4 prsqrt<float4>(const float4& a)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 prsqrt<float4>(const float4& a) {
   return make_float4(rsqrtf(a.x), rsqrtf(a.y), rsqrtf(a.z), rsqrtf(a.w));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-double2 prsqrt<double2>(const double2& a)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 prsqrt<double2>(const double2& a) {
   return make_double2(rsqrt(a.x), rsqrt(a.y));
 }
 
-
 #endif
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_MATH_FUNCTIONS_GPU_H
+#endif  // EIGEN_MATH_FUNCTIONS_GPU_H
diff --git a/Eigen/src/Core/arch/GPU/PacketMath.h b/Eigen/src/Core/arch/GPU/PacketMath.h
index 5c959ed..7900b0e 100644
--- a/Eigen/src/Core/arch/GPU/PacketMath.h
+++ b/Eigen/src/Core/arch/GPU/PacketMath.h
@@ -36,23 +36,29 @@
 // we'll use on the host side (SSE, AVX, ...)
 #if defined(EIGEN_GPUCC) && defined(EIGEN_USE_GPU)
 
-template<> struct is_arithmetic<float4>  { enum { value = true }; };
-template<> struct is_arithmetic<double2> { enum { value = true }; };
+template <>
+struct is_arithmetic<float4> {
+  enum { value = true };
+};
+template <>
+struct is_arithmetic<double2> {
+  enum { value = true };
+};
 
-template<> struct packet_traits<float> : default_packet_traits
-{
+template <>
+struct packet_traits<float> : default_packet_traits {
   typedef float4 type;
   typedef float4 half;
   enum {
     Vectorizable = 1,
     AlignedOnScalar = 1,
-    size=4,
+    size = 4,
 
-    HasDiv  = 1,
-    HasSin  = 0,
-    HasCos  = 0,
-    HasLog  = 1,
-    HasExp  = 1,
+    HasDiv = 1,
+    HasSin = 0,
+    HasCos = 0,
+    HasLog = 1,
+    HasExp = 1,
     HasSqrt = 1,
     HasRsqrt = 1,
     HasLGamma = 1,
@@ -74,18 +80,18 @@
   };
 };
 
-template<> struct packet_traits<double> : default_packet_traits
-{
+template <>
+struct packet_traits<double> : default_packet_traits {
   typedef double2 type;
   typedef double2 half;
   enum {
     Vectorizable = 1,
     AlignedOnScalar = 1,
-    size=2,
+    size = 2,
 
-    HasDiv  = 1,
-    HasLog  = 1,
-    HasExp  = 1,
+    HasDiv = 1,
+    HasLog = 1,
+    HasExp = 1,
     HasSqrt = 1,
     HasRsqrt = 1,
     HasLGamma = 1,
@@ -107,14 +113,37 @@
   };
 };
 
+template <>
+struct unpacket_traits<float4> {
+  typedef float type;
+  enum {
+    size = 4,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
+  typedef float4 half;
+};
+template <>
+struct unpacket_traits<double2> {
+  typedef double type;
+  enum {
+    size = 2,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
+  typedef double2 half;
+};
 
-template<> struct unpacket_traits<float4>  { typedef float  type; enum {size=4, alignment=Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false}; typedef float4 half; };
-template<> struct unpacket_traits<double2> { typedef double type; enum {size=2, alignment=Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false}; typedef double2 half; };
-
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pset1<float4>(const float&  from) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pset1<float4>(const float& from) {
   return make_float4(from, from, from, from);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pset1<double2>(const double& from) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pset1<double2>(const double& from) {
   return make_double2(from, from);
 }
 
@@ -123,259 +152,254 @@
 // of the functions, while the latter can only deal with one of them.
 #if defined(EIGEN_CUDA_ARCH) || defined(EIGEN_HIPCC) || (defined(EIGEN_CUDACC) && EIGEN_COMP_CLANG && !EIGEN_COMP_NVCC)
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float bitwise_and(const float& a,
-                                                        const float& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float bitwise_and(const float& a, const float& b) {
   return __int_as_float(__float_as_int(a) & __float_as_int(b));
 }
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double bitwise_and(const double& a,
-                                                         const double& b) {
-  return __longlong_as_double(__double_as_longlong(a) &
-                              __double_as_longlong(b));
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double bitwise_and(const double& a, const double& b) {
+  return __longlong_as_double(__double_as_longlong(a) & __double_as_longlong(b));
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float bitwise_or(const float& a,
-                                                       const float& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float bitwise_or(const float& a, const float& b) {
   return __int_as_float(__float_as_int(a) | __float_as_int(b));
 }
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double bitwise_or(const double& a,
-                                                        const double& b) {
-  return __longlong_as_double(__double_as_longlong(a) |
-                              __double_as_longlong(b));
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double bitwise_or(const double& a, const double& b) {
+  return __longlong_as_double(__double_as_longlong(a) | __double_as_longlong(b));
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float bitwise_xor(const float& a,
-                                                        const float& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float bitwise_xor(const float& a, const float& b) {
   return __int_as_float(__float_as_int(a) ^ __float_as_int(b));
 }
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double bitwise_xor(const double& a,
-                                                         const double& b) {
-  return __longlong_as_double(__double_as_longlong(a) ^
-                              __double_as_longlong(b));
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double bitwise_xor(const double& a, const double& b) {
+  return __longlong_as_double(__double_as_longlong(a) ^ __double_as_longlong(b));
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float bitwise_andnot(const float& a,
-                                                           const float& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float bitwise_andnot(const float& a, const float& b) {
   return __int_as_float(__float_as_int(a) & ~__float_as_int(b));
 }
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double bitwise_andnot(const double& a,
-                                                            const double& b) {
-  return __longlong_as_double(__double_as_longlong(a) &
-                              ~__double_as_longlong(b));
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double bitwise_andnot(const double& a, const double& b) {
+  return __longlong_as_double(__double_as_longlong(a) & ~__double_as_longlong(b));
 }
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float eq_mask(const float& a,
-                                                    const float& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float eq_mask(const float& a, const float& b) {
   return __int_as_float(a == b ? 0xffffffffu : 0u);
 }
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double eq_mask(const double& a,
-                                                     const double& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double eq_mask(const double& a, const double& b) {
   return __longlong_as_double(a == b ? 0xffffffffffffffffull : 0ull);
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float lt_mask(const float& a,
-                                                    const float& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float lt_mask(const float& a, const float& b) {
   return __int_as_float(a < b ? 0xffffffffu : 0u);
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double lt_mask(const double& a,
-                                                     const double& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double lt_mask(const double& a, const double& b) {
   return __longlong_as_double(a < b ? 0xffffffffffffffffull : 0ull);
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float le_mask(const float& a,
-                                                    const float& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float le_mask(const float& a, const float& b) {
   return __int_as_float(a <= b ? 0xffffffffu : 0u);
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double le_mask(const double& a,
-                                                     const double& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double le_mask(const double& a, const double& b) {
   return __longlong_as_double(a <= b ? 0xffffffffffffffffull : 0ull);
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pand<float4>(const float4& a,
-                                                          const float4& b) {
-  return make_float4(bitwise_and(a.x, b.x), bitwise_and(a.y, b.y),
-                     bitwise_and(a.z, b.z), bitwise_and(a.w, b.w));
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pand<float4>(const float4& a, const float4& b) {
+  return make_float4(bitwise_and(a.x, b.x), bitwise_and(a.y, b.y), bitwise_and(a.z, b.z), bitwise_and(a.w, b.w));
 }
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pand<double2>(const double2& a,
-                                                            const double2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pand<double2>(const double2& a, const double2& b) {
   return make_double2(bitwise_and(a.x, b.x), bitwise_and(a.y, b.y));
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 por<float4>(const float4& a,
-                                                         const float4& b) {
-  return make_float4(bitwise_or(a.x, b.x), bitwise_or(a.y, b.y),
-                     bitwise_or(a.z, b.z), bitwise_or(a.w, b.w));
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 por<float4>(const float4& a, const float4& b) {
+  return make_float4(bitwise_or(a.x, b.x), bitwise_or(a.y, b.y), bitwise_or(a.z, b.z), bitwise_or(a.w, b.w));
 }
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 por<double2>(const double2& a,
-                                                           const double2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 por<double2>(const double2& a, const double2& b) {
   return make_double2(bitwise_or(a.x, b.x), bitwise_or(a.y, b.y));
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pxor<float4>(const float4& a,
-                                                          const float4& b) {
-  return make_float4(bitwise_xor(a.x, b.x), bitwise_xor(a.y, b.y),
-                     bitwise_xor(a.z, b.z), bitwise_xor(a.w, b.w));
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pxor<float4>(const float4& a, const float4& b) {
+  return make_float4(bitwise_xor(a.x, b.x), bitwise_xor(a.y, b.y), bitwise_xor(a.z, b.z), bitwise_xor(a.w, b.w));
 }
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pxor<double2>(const double2& a,
-                                                            const double2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pxor<double2>(const double2& a, const double2& b) {
   return make_double2(bitwise_xor(a.x, b.x), bitwise_xor(a.y, b.y));
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pandnot<float4>(const float4& a,
-                                                             const float4& b) {
-  return make_float4(bitwise_andnot(a.x, b.x), bitwise_andnot(a.y, b.y),
-                     bitwise_andnot(a.z, b.z), bitwise_andnot(a.w, b.w));
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pandnot<float4>(const float4& a, const float4& b) {
+  return make_float4(bitwise_andnot(a.x, b.x), bitwise_andnot(a.y, b.y), bitwise_andnot(a.z, b.z),
+                     bitwise_andnot(a.w, b.w));
 }
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2
-pandnot<double2>(const double2& a, const double2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pandnot<double2>(const double2& a, const double2& b) {
   return make_double2(bitwise_andnot(a.x, b.x), bitwise_andnot(a.y, b.y));
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pcmp_eq<float4>(const float4& a,
-                                                             const float4& b) {
-  return make_float4(eq_mask(a.x, b.x), eq_mask(a.y, b.y), eq_mask(a.z, b.z),
-                     eq_mask(a.w, b.w));
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pcmp_eq<float4>(const float4& a, const float4& b) {
+  return make_float4(eq_mask(a.x, b.x), eq_mask(a.y, b.y), eq_mask(a.z, b.z), eq_mask(a.w, b.w));
 }
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pcmp_lt<float4>(const float4& a,
-                                                             const float4& b) {
-  return make_float4(lt_mask(a.x, b.x), lt_mask(a.y, b.y), lt_mask(a.z, b.z),
-                     lt_mask(a.w, b.w));
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pcmp_lt<float4>(const float4& a, const float4& b) {
+  return make_float4(lt_mask(a.x, b.x), lt_mask(a.y, b.y), lt_mask(a.z, b.z), lt_mask(a.w, b.w));
 }
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pcmp_le<float4>(const float4& a,
-                                                             const float4& b) {
-  return make_float4(le_mask(a.x, b.x), le_mask(a.y, b.y), le_mask(a.z, b.z),
-                     le_mask(a.w, b.w));
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pcmp_le<float4>(const float4& a, const float4& b) {
+  return make_float4(le_mask(a.x, b.x), le_mask(a.y, b.y), le_mask(a.z, b.z), le_mask(a.w, b.w));
 }
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2
-pcmp_eq<double2>(const double2& a, const double2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pcmp_eq<double2>(const double2& a, const double2& b) {
   return make_double2(eq_mask(a.x, b.x), eq_mask(a.y, b.y));
 }
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2
-pcmp_lt<double2>(const double2& a, const double2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pcmp_lt<double2>(const double2& a, const double2& b) {
   return make_double2(lt_mask(a.x, b.x), lt_mask(a.y, b.y));
 }
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2
-pcmp_le<double2>(const double2& a, const double2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pcmp_le<double2>(const double2& a, const double2& b) {
   return make_double2(le_mask(a.x, b.x), le_mask(a.y, b.y));
 }
-#endif // defined(EIGEN_CUDA_ARCH) || defined(EIGEN_HIPCC) || (defined(EIGEN_CUDACC) && EIGEN_COMP_CLANG && !EIGEN_COMP_NVCC)
+#endif  // defined(EIGEN_CUDA_ARCH) || defined(EIGEN_HIPCC) || (defined(EIGEN_CUDACC) && EIGEN_COMP_CLANG &&
+        // !EIGEN_COMP_NVCC)
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 plset<float4>(const float& a) {
-  return make_float4(a, a+1, a+2, a+3);
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 plset<float4>(const float& a) {
+  return make_float4(a, a + 1, a + 2, a + 3);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 plset<double2>(const double& a) {
-  return make_double2(a, a+1);
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 plset<double2>(const double& a) {
+  return make_double2(a, a + 1);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 padd<float4>(const float4& a, const float4& b) {
-  return make_float4(a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w);
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 padd<float4>(const float4& a, const float4& b) {
+  return make_float4(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 padd<double2>(const double2& a, const double2& b) {
-  return make_double2(a.x+b.x, a.y+b.y);
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 padd<double2>(const double2& a, const double2& b) {
+  return make_double2(a.x + b.x, a.y + b.y);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 psub<float4>(const float4& a, const float4& b) {
-  return make_float4(a.x-b.x, a.y-b.y, a.z-b.z, a.w-b.w);
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 psub<float4>(const float4& a, const float4& b) {
+  return make_float4(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 psub<double2>(const double2& a, const double2& b) {
-  return make_double2(a.x-b.x, a.y-b.y);
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 psub<double2>(const double2& a, const double2& b) {
+  return make_double2(a.x - b.x, a.y - b.y);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pnegate(const float4& a) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pnegate(const float4& a) {
   return make_float4(-a.x, -a.y, -a.z, -a.w);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pnegate(const double2& a) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pnegate(const double2& a) {
   return make_double2(-a.x, -a.y);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pconj(const float4& a) { return a; }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pconj(const double2& a) { return a; }
-
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pmul<float4>(const float4& a, const float4& b) {
-  return make_float4(a.x*b.x, a.y*b.y, a.z*b.z, a.w*b.w);
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pconj(const float4& a) {
+  return a;
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pmul<double2>(const double2& a, const double2& b) {
-  return make_double2(a.x*b.x, a.y*b.y);
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pconj(const double2& a) {
+  return a;
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pdiv<float4>(const float4& a, const float4& b) {
-  return make_float4(a.x/b.x, a.y/b.y, a.z/b.z, a.w/b.w);
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pmul<float4>(const float4& a, const float4& b) {
+  return make_float4(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pdiv<double2>(const double2& a, const double2& b) {
-  return make_double2(a.x/b.x, a.y/b.y);
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pmul<double2>(const double2& a, const double2& b) {
+  return make_double2(a.x * b.x, a.y * b.y);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pmin<float4>(const float4& a, const float4& b) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pdiv<float4>(const float4& a, const float4& b) {
+  return make_float4(a.x / b.x, a.y / b.y, a.z / b.z, a.w / b.w);
+}
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pdiv<double2>(const double2& a, const double2& b) {
+  return make_double2(a.x / b.x, a.y / b.y);
+}
+
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pmin<float4>(const float4& a, const float4& b) {
   return make_float4(fminf(a.x, b.x), fminf(a.y, b.y), fminf(a.z, b.z), fminf(a.w, b.w));
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pmin<double2>(const double2& a, const double2& b) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pmin<double2>(const double2& a, const double2& b) {
   return make_double2(fmin(a.x, b.x), fmin(a.y, b.y));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pmax<float4>(const float4& a, const float4& b) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pmax<float4>(const float4& a, const float4& b) {
   return make_float4(fmaxf(a.x, b.x), fmaxf(a.y, b.y), fmaxf(a.z, b.z), fmaxf(a.w, b.w));
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pmax<double2>(const double2& a, const double2& b) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pmax<double2>(const double2& a, const double2& b) {
   return make_double2(fmax(a.x, b.x), fmax(a.y, b.y));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pload<float4>(const float* from) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pload<float4>(const float* from) {
   return *reinterpret_cast<const float4*>(from);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pload<double2>(const double* from) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pload<double2>(const double* from) {
   return *reinterpret_cast<const double2*>(from);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 ploadu<float4>(const float* from) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 ploadu<float4>(const float* from) {
   return make_float4(from[0], from[1], from[2], from[3]);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 ploadu<double2>(const double* from) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 ploadu<double2>(const double* from) {
   return make_double2(from[0], from[1]);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 ploaddup<float4>(const float*   from) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 ploaddup<float4>(const float* from) {
   return make_float4(from[0], from[0], from[1], from[1]);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 ploaddup<double2>(const double*  from) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 ploaddup<double2>(const double* from) {
   return make_double2(from[0], from[0]);
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pstore<float>(float*   to, const float4& from) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pstore<float>(float* to, const float4& from) {
   *reinterpret_cast<float4*>(to) = from;
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pstore<double>(double* to, const double2& from) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pstore<double>(double* to, const double2& from) {
   *reinterpret_cast<double2*>(to) = from;
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pstoreu<float>(float*  to, const float4& from) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pstoreu<float>(float* to, const float4& from) {
   to[0] = from.x;
   to[1] = from.y;
   to[2] = from.z;
   to[3] = from.w;
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pstoreu<double>(double* to, const double2& from) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pstoreu<double>(double* to, const double2& from) {
   to[0] = from.x;
   to[1] = from.y;
 }
 
-template<>
+template <>
 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float4 ploadt_ro<float4, Aligned>(const float* from) {
 #if defined(EIGEN_GPU_HAS_LDG)
   return __ldg(reinterpret_cast<const float4*>(from));
@@ -383,7 +407,7 @@
   return make_float4(from[0], from[1], from[2], from[3]);
 #endif
 }
-template<>
+template <>
 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double2 ploadt_ro<double2, Aligned>(const double* from) {
 #if defined(EIGEN_GPU_HAS_LDG)
   return __ldg(reinterpret_cast<const double2*>(from));
@@ -392,93 +416,110 @@
 #endif
 }
 
-template<>
+template <>
 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float4 ploadt_ro<float4, Unaligned>(const float* from) {
 #if defined(EIGEN_GPU_HAS_LDG)
-  return make_float4(__ldg(from+0), __ldg(from+1), __ldg(from+2), __ldg(from+3));
+  return make_float4(__ldg(from + 0), __ldg(from + 1), __ldg(from + 2), __ldg(from + 3));
 #else
   return make_float4(from[0], from[1], from[2], from[3]);
 #endif
 }
-template<>
+template <>
 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double2 ploadt_ro<double2, Unaligned>(const double* from) {
 #if defined(EIGEN_GPU_HAS_LDG)
-  return make_double2(__ldg(from+0), __ldg(from+1));
+  return make_double2(__ldg(from + 0), __ldg(from + 1));
 #else
   return make_double2(from[0], from[1]);
 #endif
 }
 
-template<> EIGEN_DEVICE_FUNC inline float4 pgather<float, float4>(const float* from, Index stride) {
-  return make_float4(from[0*stride], from[1*stride], from[2*stride], from[3*stride]);
+template <>
+EIGEN_DEVICE_FUNC inline float4 pgather<float, float4>(const float* from, Index stride) {
+  return make_float4(from[0 * stride], from[1 * stride], from[2 * stride], from[3 * stride]);
 }
 
-template<> EIGEN_DEVICE_FUNC inline double2 pgather<double, double2>(const double* from, Index stride) {
-  return make_double2(from[0*stride], from[1*stride]);
+template <>
+EIGEN_DEVICE_FUNC inline double2 pgather<double, double2>(const double* from, Index stride) {
+  return make_double2(from[0 * stride], from[1 * stride]);
 }
 
-template<> EIGEN_DEVICE_FUNC inline void pscatter<float, float4>(float* to, const float4& from, Index stride) {
-  to[stride*0] = from.x;
-  to[stride*1] = from.y;
-  to[stride*2] = from.z;
-  to[stride*3] = from.w;
+template <>
+EIGEN_DEVICE_FUNC inline void pscatter<float, float4>(float* to, const float4& from, Index stride) {
+  to[stride * 0] = from.x;
+  to[stride * 1] = from.y;
+  to[stride * 2] = from.z;
+  to[stride * 3] = from.w;
 }
-template<> EIGEN_DEVICE_FUNC inline void pscatter<double, double2>(double* to, const double2& from, Index stride) {
-  to[stride*0] = from.x;
-  to[stride*1] = from.y;
+template <>
+EIGEN_DEVICE_FUNC inline void pscatter<double, double2>(double* to, const double2& from, Index stride) {
+  to[stride * 0] = from.x;
+  to[stride * 1] = from.y;
 }
 
-template<> EIGEN_DEVICE_FUNC inline float  pfirst<float4>(const float4& a) {
+template <>
+EIGEN_DEVICE_FUNC inline float pfirst<float4>(const float4& a) {
   return a.x;
 }
-template<> EIGEN_DEVICE_FUNC inline double pfirst<double2>(const double2& a) {
+template <>
+EIGEN_DEVICE_FUNC inline double pfirst<double2>(const double2& a) {
   return a.x;
 }
 
-template<> EIGEN_DEVICE_FUNC inline float  predux<float4>(const float4& a) {
+template <>
+EIGEN_DEVICE_FUNC inline float predux<float4>(const float4& a) {
   return a.x + a.y + a.z + a.w;
 }
-template<> EIGEN_DEVICE_FUNC inline double predux<double2>(const double2& a) {
+template <>
+EIGEN_DEVICE_FUNC inline double predux<double2>(const double2& a) {
   return a.x + a.y;
 }
 
-template<> EIGEN_DEVICE_FUNC inline float  predux_max<float4>(const float4& a) {
+template <>
+EIGEN_DEVICE_FUNC inline float predux_max<float4>(const float4& a) {
   return fmaxf(fmaxf(a.x, a.y), fmaxf(a.z, a.w));
 }
-template<> EIGEN_DEVICE_FUNC inline double predux_max<double2>(const double2& a) {
+template <>
+EIGEN_DEVICE_FUNC inline double predux_max<double2>(const double2& a) {
   return fmax(a.x, a.y);
 }
 
-template<> EIGEN_DEVICE_FUNC inline float  predux_min<float4>(const float4& a) {
+template <>
+EIGEN_DEVICE_FUNC inline float predux_min<float4>(const float4& a) {
   return fminf(fminf(a.x, a.y), fminf(a.z, a.w));
 }
-template<> EIGEN_DEVICE_FUNC inline double predux_min<double2>(const double2& a) {
+template <>
+EIGEN_DEVICE_FUNC inline double predux_min<double2>(const double2& a) {
   return fmin(a.x, a.y);
 }
 
-template<> EIGEN_DEVICE_FUNC inline float  predux_mul<float4>(const float4& a) {
+template <>
+EIGEN_DEVICE_FUNC inline float predux_mul<float4>(const float4& a) {
   return a.x * a.y * a.z * a.w;
 }
-template<> EIGEN_DEVICE_FUNC inline double predux_mul<double2>(const double2& a) {
+template <>
+EIGEN_DEVICE_FUNC inline double predux_mul<double2>(const double2& a) {
   return a.x * a.y;
 }
 
-template<> EIGEN_DEVICE_FUNC inline float4  pabs<float4>(const float4& a) {
+template <>
+EIGEN_DEVICE_FUNC inline float4 pabs<float4>(const float4& a) {
   return make_float4(fabsf(a.x), fabsf(a.y), fabsf(a.z), fabsf(a.w));
 }
-template<> EIGEN_DEVICE_FUNC inline double2 pabs<double2>(const double2& a) {
+template <>
+EIGEN_DEVICE_FUNC inline double2 pabs<double2>(const double2& a) {
   return make_double2(fabs(a.x), fabs(a.y));
 }
 
-template<> EIGEN_DEVICE_FUNC inline float4  pfloor<float4>(const float4& a) {
+template <>
+EIGEN_DEVICE_FUNC inline float4 pfloor<float4>(const float4& a) {
   return make_float4(floorf(a.x), floorf(a.y), floorf(a.z), floorf(a.w));
 }
-template<> EIGEN_DEVICE_FUNC inline double2 pfloor<double2>(const double2& a) {
+template <>
+EIGEN_DEVICE_FUNC inline double2 pfloor<double2>(const double2& a) {
   return make_double2(floor(a.x), floor(a.y));
 }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<float4,4>& kernel) {
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<float4, 4>& kernel) {
   float tmp = kernel.packet[0].y;
   kernel.packet[0].y = kernel.packet[1].x;
   kernel.packet[1].x = tmp;
@@ -504,14 +545,13 @@
   kernel.packet[3].z = tmp;
 }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<double2,2>& kernel) {
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<double2, 2>& kernel) {
   double tmp = kernel.packet[0].y;
   kernel.packet[0].y = kernel.packet[1].x;
   kernel.packet[1].x = tmp;
 }
 
-#endif // defined(EIGEN_GPUCC) && defined(EIGEN_USE_GPU)
+#endif  // defined(EIGEN_GPUCC) && defined(EIGEN_USE_GPU)
 
 // Half-packet functions are not available on the host for CUDA 9.0-9.2, only
 // on device. There is no benefit to using them on the host anyways, since they are
@@ -519,41 +559,68 @@
 #if (defined(EIGEN_HAS_CUDA_FP16) || defined(EIGEN_HAS_HIP_FP16)) && defined(EIGEN_GPU_COMPILE_PHASE)
 
 typedef ulonglong2 Packet4h2;
-template<> struct unpacket_traits<Packet4h2> { typedef Eigen::half type; enum {size=8, alignment=Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false}; typedef Packet4h2 half; };
-template<> struct is_arithmetic<Packet4h2> { enum { value = true }; };
+template <>
+struct unpacket_traits<Packet4h2> {
+  typedef Eigen::half type;
+  enum {
+    size = 8,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
+  typedef Packet4h2 half;
+};
+template <>
+struct is_arithmetic<Packet4h2> {
+  enum { value = true };
+};
 
-template<> struct unpacket_traits<half2> { typedef Eigen::half type; enum {size=2, alignment=Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false}; typedef half2 half; };
-template<> struct is_arithmetic<half2> { enum { value = true }; };
+template <>
+struct unpacket_traits<half2> {
+  typedef Eigen::half type;
+  enum {
+    size = 2,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
+  typedef half2 half;
+};
+template <>
+struct is_arithmetic<half2> {
+  enum { value = true };
+};
 
-template<> struct packet_traits<Eigen::half> : default_packet_traits
-{
+template <>
+struct packet_traits<Eigen::half> : default_packet_traits {
   typedef Packet4h2 type;
   typedef Packet4h2 half;
   enum {
     Vectorizable = 1,
     AlignedOnScalar = 1,
-    size=8,
-    HasAdd    = 1,
-    HasSub    = 1,
-    HasMul    = 1,
-    HasDiv    = 1,
-    HasSqrt   = 1,
-    HasRsqrt  = 1,
-    HasExp    = 1,
-    HasExpm1  = 1,
-    HasLog    = 1,
-    HasLog1p  = 1
+    size = 8,
+    HasAdd = 1,
+    HasSub = 1,
+    HasMul = 1,
+    HasDiv = 1,
+    HasSqrt = 1,
+    HasRsqrt = 1,
+    HasExp = 1,
+    HasExpm1 = 1,
+    HasLog = 1,
+    HasLog1p = 1
   };
 };
 
-template<>
+template <>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pset1<half2>(const Eigen::half& from) {
   return __half2half2(from);
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2
-pset1<Packet4h2>(const Eigen::half& from) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 pset1<Packet4h2>(const Eigen::half& from) {
   Packet4h2 r;
   half2* p_alias = reinterpret_cast<half2*>(&r);
   p_alias[0] = pset1<half2>(from);
@@ -569,59 +636,48 @@
   return *reinterpret_cast<const half2*>(from);
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 ploadu(const Eigen::half* from) {
-  return __halves2half2(from[0], from[1]);
-}
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 ploadu(const Eigen::half* from) { return __halves2half2(from[0], from[1]); }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 ploaddup(const Eigen::half*  from) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 ploaddup(const Eigen::half* from) {
   return __halves2half2(from[0], from[0]);
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pstore(Eigen::half* to,
-                                                  const half2& from) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pstore(Eigen::half* to, const half2& from) {
   *reinterpret_cast<half2*>(to) = from;
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pstoreu(Eigen::half* to,
-                                                   const half2& from) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pstoreu(Eigen::half* to, const half2& from) {
   to[0] = __low2half(from);
   to[1] = __high2half(from);
 }
 
-
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE half2 ploadt_ro_aligned(
-    const Eigen::half* from) {
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE half2 ploadt_ro_aligned(const Eigen::half* from) {
 #if defined(EIGEN_GPU_HAS_LDG)
   // Input is guaranteed to be properly aligned.
   return __ldg(reinterpret_cast<const half2*>(from));
 #else
-  return __halves2half2(*(from+0), *(from+1));
+  return __halves2half2(*(from + 0), *(from + 1));
 #endif
 }
 
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE half2 ploadt_ro_unaligned(
-    const Eigen::half* from) {
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE half2 ploadt_ro_unaligned(const Eigen::half* from) {
 #if defined(EIGEN_GPU_HAS_LDG)
-  return __halves2half2(__ldg(from+0), __ldg(from+1));
+  return __halves2half2(__ldg(from + 0), __ldg(from + 1));
 #else
-  return __halves2half2(*(from+0), *(from+1));
+  return __halves2half2(*(from + 0), *(from + 1));
 #endif
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pgather(const Eigen::half* from,
-                                                    Index stride) {
-  return __halves2half2(from[0*stride], from[1*stride]);
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pgather(const Eigen::half* from, Index stride) {
+  return __halves2half2(from[0 * stride], from[1 * stride]);
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter(
-    Eigen::half* to, const half2& from, Index stride) {
-  to[stride*0] = __low2half(from);
-  to[stride*1] = __high2half(from);
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter(Eigen::half* to, const half2& from, Index stride) {
+  to[stride * 0] = __low2half(from);
+  to[stride * 1] = __high2half(from);
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Eigen::half pfirst(const half2& a) {
-  return __low2half(a);
-}
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Eigen::half pfirst(const half2& a) { return __low2half(a); }
 
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pabs(const half2& a) {
   half a1 = __low2half(a);
@@ -641,8 +697,7 @@
   return pset1<half2>(false_half);
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void
-ptranspose(PacketBlock<half2,2>& kernel) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void ptranspose(PacketBlock<half2, 2>& kernel) {
   __half a1 = __low2half(kernel.packet[0]);
   __half a2 = __high2half(kernel.packet[0]);
   __half b1 = __low2half(kernel.packet[1]);
@@ -660,9 +715,7 @@
 #endif
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pselect(const half2& mask,
-                                                    const half2& a,
-                                                    const half2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pselect(const half2& mask, const half2& a, const half2& b) {
   half mask_low = __low2half(mask);
   half mask_high = __high2half(mask);
   half result_low = mask_low == half(0) ? __low2half(b) : __low2half(a);
@@ -670,8 +723,7 @@
   return __halves2half2(result_low, result_high);
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pcmp_eq(const half2& a,
-                                                    const half2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pcmp_eq(const half2& a, const half2& b) {
   half true_half = half_impl::raw_uint16_to_half(0xffffu);
   half false_half = half_impl::raw_uint16_to_half(0x0000u);
   half a1 = __low2half(a);
@@ -683,8 +735,7 @@
   return __halves2half2(eq1, eq2);
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pcmp_lt(const half2& a,
-                                                    const half2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pcmp_lt(const half2& a, const half2& b) {
   half true_half = half_impl::raw_uint16_to_half(0xffffu);
   half false_half = half_impl::raw_uint16_to_half(0x0000u);
   half a1 = __low2half(a);
@@ -696,8 +747,7 @@
   return __halves2half2(eq1, eq2);
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pcmp_le(const half2& a,
-                                                    const half2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pcmp_le(const half2& a, const half2& b) {
   half true_half = half_impl::raw_uint16_to_half(0xffffu);
   half false_half = half_impl::raw_uint16_to_half(0x0000u);
   half a1 = __low2half(a);
@@ -709,8 +759,7 @@
   return __halves2half2(eq1, eq2);
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pand(const half2& a,
-                                                 const half2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pand(const half2& a, const half2& b) {
   half a1 = __low2half(a);
   half a2 = __high2half(a);
   half b1 = __low2half(b);
@@ -720,8 +769,7 @@
   return __halves2half2(result1, result2);
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 por(const half2& a,
-                                                const half2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 por(const half2& a, const half2& b) {
   half a1 = __low2half(a);
   half a2 = __high2half(a);
   half b1 = __low2half(b);
@@ -731,8 +779,7 @@
   return __halves2half2(result1, result2);
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pxor(const half2& a,
-                                                 const half2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pxor(const half2& a, const half2& b) {
   half a1 = __low2half(a);
   half a2 = __high2half(a);
   half b1 = __low2half(b);
@@ -742,8 +789,7 @@
   return __halves2half2(result1, result2);
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pandnot(const half2& a,
-                                                    const half2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pandnot(const half2& a, const half2& b) {
   half a1 = __low2half(a);
   half a2 = __high2half(a);
   half b1 = __low2half(b);
@@ -753,8 +799,7 @@
   return __halves2half2(result1, result2);
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 padd(const half2& a,
-                                                 const half2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 padd(const half2& a, const half2& b) {
 #if defined(EIGEN_GPU_HAS_FP16_ARITHMETIC)
   return __hadd2(a, b);
 #else
@@ -768,8 +813,7 @@
 #endif
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 psub(const half2& a,
-                                                 const half2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 psub(const half2& a, const half2& b) {
 #if defined(EIGEN_GPU_HAS_FP16_ARITHMETIC)
   return __hsub2(a, b);
 #else
@@ -795,8 +839,7 @@
 
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pconj(const half2& a) { return a; }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pmul(const half2& a,
-                                                 const half2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pmul(const half2& a, const half2& b) {
 #if defined(EIGEN_GPU_HAS_FP16_ARITHMETIC)
   return __hmul2(a, b);
 #else
@@ -810,11 +853,9 @@
 #endif
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pmadd(const half2& a,
-                                                  const half2& b,
-                                                  const half2& c) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pmadd(const half2& a, const half2& b, const half2& c) {
 #if defined(EIGEN_GPU_HAS_FP16_ARITHMETIC)
-   return __hfma2(a, b, c);
+  return __hfma2(a, b, c);
 #else
   float a1 = __low2float(a);
   float a2 = __high2float(a);
@@ -828,8 +869,7 @@
 #endif
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pdiv(const half2& a,
-                                                 const half2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pdiv(const half2& a, const half2& b) {
 #if defined(EIGEN_GPU_HAS_FP16_ARITHMETIC)
   return __h2div(a, b);
 #else
@@ -843,8 +883,7 @@
 #endif
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pmin(const half2& a,
-                                                 const half2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pmin(const half2& a, const half2& b) {
   float a1 = __low2float(a);
   float a2 = __high2float(a);
   float b1 = __low2float(b);
@@ -854,8 +893,7 @@
   return __halves2half2(r1, r2);
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pmax(const half2& a,
-                                                 const half2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pmax(const half2& a, const half2& b) {
   float a1 = __low2float(a);
   float a2 = __high2float(a);
   float b1 = __low2float(b);
@@ -925,28 +963,15 @@
   return __floats2half2_rn(r1, r2);
 }
 
-#if (EIGEN_CUDA_SDK_VER >= 80000 && defined(EIGEN_CUDA_HAS_FP16_ARITHMETIC)) || \
-  defined(EIGEN_HIP_DEVICE_COMPILE)
+#if (EIGEN_CUDA_SDK_VER >= 80000 && defined(EIGEN_CUDA_HAS_FP16_ARITHMETIC)) || defined(EIGEN_HIP_DEVICE_COMPILE)
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-half2 plog(const half2& a) {
-  return h2log(a);
-}
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 plog(const half2& a) { return h2log(a); }
 
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-half2 pexp(const half2& a) {
-  return h2exp(a);
-}
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pexp(const half2& a) { return h2exp(a); }
 
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-half2 psqrt(const half2& a) {
-  return h2sqrt(a);
-}
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 psqrt(const half2& a) { return h2sqrt(a); }
 
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-half2 prsqrt(const half2& a) {
-  return h2rsqrt(a);
-}
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 prsqrt(const half2& a) { return h2rsqrt(a); }
 
 #else
 
@@ -982,18 +1007,16 @@
   return __floats2half2_rn(r1, r2);
 }
 #endif
-} // namespace
+}  // namespace
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2
-pload<Packet4h2>(const Eigen::half* from) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 pload<Packet4h2>(const Eigen::half* from) {
   return *reinterpret_cast<const Packet4h2*>(from);
 }
 
 // unaligned load;
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2
-ploadu<Packet4h2>(const Eigen::half* from) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 ploadu<Packet4h2>(const Eigen::half* from) {
   Packet4h2 r;
   half2* p_alias = reinterpret_cast<half2*>(&r);
   p_alias[0] = ploadu(from + 0);
@@ -1004,8 +1027,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2
-ploaddup<Packet4h2>(const Eigen::half* from) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 ploaddup<Packet4h2>(const Eigen::half* from) {
   Packet4h2 r;
   half2* p_alias = reinterpret_cast<half2*>(&r);
   p_alias[0] = ploaddup(from + 0);
@@ -1016,24 +1038,21 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pstore<Eigen::half>(
-    Eigen::half* to, const Packet4h2& from) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pstore<Eigen::half>(Eigen::half* to, const Packet4h2& from) {
   *reinterpret_cast<Packet4h2*>(to) = from;
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pstoreu<Eigen::half>(
-    Eigen::half* to, const Packet4h2& from) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pstoreu<Eigen::half>(Eigen::half* to, const Packet4h2& from) {
   const half2* from_alias = reinterpret_cast<const half2*>(&from);
-  pstoreu(to + 0,from_alias[0]);
-  pstoreu(to + 2,from_alias[1]);
-  pstoreu(to + 4,from_alias[2]);
-  pstoreu(to + 6,from_alias[3]);
+  pstoreu(to + 0, from_alias[0]);
+  pstoreu(to + 2, from_alias[1]);
+  pstoreu(to + 4, from_alias[2]);
+  pstoreu(to + 6, from_alias[3]);
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet4h2
-ploadt_ro<Packet4h2, Aligned>(const Eigen::half* from) {
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet4h2 ploadt_ro<Packet4h2, Aligned>(const Eigen::half* from) {
 #if defined(EIGEN_GPU_HAS_LDG)
   Packet4h2 r;
   r = __ldg(reinterpret_cast<const Packet4h2*>(from));
@@ -1050,8 +1069,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet4h2
-ploadt_ro<Packet4h2, Unaligned>(const Eigen::half* from) {
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet4h2 ploadt_ro<Packet4h2, Unaligned>(const Eigen::half* from) {
   Packet4h2 r;
   half2* r_alias = reinterpret_cast<half2*>(&r);
   r_alias[0] = ploadt_ro_unaligned(from + 0);
@@ -1062,8 +1080,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2
-pgather<Eigen::half, Packet4h2>(const Eigen::half* from, Index stride) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 pgather<Eigen::half, Packet4h2>(const Eigen::half* from, Index stride) {
   Packet4h2 r;
   half2* p_alias = reinterpret_cast<half2*>(&r);
   p_alias[0] = __halves2half2(from[0 * stride], from[1 * stride]);
@@ -1074,8 +1091,8 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<Eigen::half, Packet4h2>(
-    Eigen::half* to, const Packet4h2& from, Index stride) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<Eigen::half, Packet4h2>(Eigen::half* to, const Packet4h2& from,
+                                                                            Index stride) {
   const half2* from_alias = reinterpret_cast<const half2*>(&from);
   pscatter(to + stride * 0, from_alias[0], stride);
   pscatter(to + stride * 2, from_alias[1], stride);
@@ -1084,14 +1101,12 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Eigen::half pfirst<Packet4h2>(
-    const Packet4h2& a) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Eigen::half pfirst<Packet4h2>(const Packet4h2& a) {
   return pfirst(*(reinterpret_cast<const half2*>(&a)));
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 pabs<Packet4h2>(
-    const Packet4h2& a) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 pabs<Packet4h2>(const Packet4h2& a) {
   Packet4h2 r;
   half2* p_alias = reinterpret_cast<half2*>(&r);
   const half2* a_alias = reinterpret_cast<const half2*>(&a);
@@ -1103,8 +1118,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 ptrue<Packet4h2>(
-    const Packet4h2& /*a*/) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 ptrue<Packet4h2>(const Packet4h2& /*a*/) {
   half true_half = half_impl::raw_uint16_to_half(0xffffu);
   return pset1<Packet4h2>(true_half);
 }
@@ -1115,9 +1129,9 @@
   return pset1<Packet4h2>(false_half);
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void ptranspose_double(
-    double* d_row0, double* d_row1, double* d_row2, double* d_row3,
-    double* d_row4, double* d_row5, double* d_row6, double* d_row7) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void ptranspose_double(double* d_row0, double* d_row1, double* d_row2,
+                                                             double* d_row3, double* d_row4, double* d_row5,
+                                                             double* d_row6, double* d_row7) {
   double d_tmp;
   d_tmp = d_row0[1];
   d_row0[1] = d_row4[0];
@@ -1136,8 +1150,8 @@
   d_row7[0] = d_tmp;
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void ptranspose_half2(
-    half2* f_row0, half2* f_row1, half2* f_row2, half2* f_row3) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void ptranspose_half2(half2* f_row0, half2* f_row1, half2* f_row2,
+                                                            half2* f_row3) {
   half2 f_tmp;
   f_tmp = f_row0[1];
   f_row0[1] = f_row2[0];
@@ -1148,8 +1162,7 @@
   f_row3[0] = f_tmp;
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void
-ptranspose_half(half2& f0, half2& f1) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void ptranspose_half(half2& f0, half2& f1) {
   __half a1 = __low2half(f0);
   __half a2 = __high2half(f0);
   __half b1 = __low2half(f1);
@@ -1158,8 +1171,7 @@
   f1 = __halves2half2(a2, b2);
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void
-ptranspose(PacketBlock<Packet4h2,8>& kernel) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet4h2, 8>& kernel) {
   double* d_row0 = reinterpret_cast<double*>(&kernel.packet[0]);
   double* d_row1 = reinterpret_cast<double*>(&kernel.packet[1]);
   double* d_row2 = reinterpret_cast<double*>(&kernel.packet[2]);
@@ -1168,9 +1180,7 @@
   double* d_row5 = reinterpret_cast<double*>(&kernel.packet[5]);
   double* d_row6 = reinterpret_cast<double*>(&kernel.packet[6]);
   double* d_row7 = reinterpret_cast<double*>(&kernel.packet[7]);
-  ptranspose_double(d_row0, d_row1, d_row2, d_row3,
-                    d_row4, d_row5, d_row6, d_row7);
-
+  ptranspose_double(d_row0, d_row1, d_row2, d_row3, d_row4, d_row5, d_row6, d_row7);
 
   half2* f_row0 = reinterpret_cast<half2*>(d_row0);
   half2* f_row1 = reinterpret_cast<half2*>(d_row1);
@@ -1211,23 +1221,18 @@
   ptranspose_half(f_row0[1], f_row1[1]);
   ptranspose_half(f_row2[0], f_row3[0]);
   ptranspose_half(f_row2[1], f_row3[1]);
-
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2
-plset<Packet4h2>(const Eigen::half& a) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 plset<Packet4h2>(const Eigen::half& a) {
 #if defined(EIGEN_HIP_DEVICE_COMPILE)
 
   Packet4h2 r;
   half2* p_alias = reinterpret_cast<half2*>(&r);
   p_alias[0] = __halves2half2(a, __hadd(a, __float2half(1.0f)));
-  p_alias[1] = __halves2half2(__hadd(a, __float2half(2.0f)),
-                              __hadd(a, __float2half(3.0f)));
-  p_alias[2] = __halves2half2(__hadd(a, __float2half(4.0f)),
-                              __hadd(a, __float2half(5.0f)));
-  p_alias[3] = __halves2half2(__hadd(a, __float2half(6.0f)),
-                              __hadd(a, __float2half(7.0f)));
+  p_alias[1] = __halves2half2(__hadd(a, __float2half(2.0f)), __hadd(a, __float2half(3.0f)));
+  p_alias[2] = __halves2half2(__hadd(a, __float2half(4.0f)), __hadd(a, __float2half(5.0f)));
+  p_alias[3] = __halves2half2(__hadd(a, __float2half(6.0f)), __hadd(a, __float2half(7.0f)));
   return r;
 #elif defined(EIGEN_CUDA_HAS_FP16_ARITHMETIC)
   Packet4h2 r;
@@ -1235,8 +1240,8 @@
 
   half2 b = pset1<half2>(a);
   half2 c;
-  half2 half_offset0 = __halves2half2(__float2half(0.0f),__float2half(2.0f));
-  half2 half_offset1 = __halves2half2(__float2half(4.0f),__float2half(6.0f));
+  half2 half_offset0 = __halves2half2(__float2half(0.0f), __float2half(2.0f));
+  half2 half_offset1 = __halves2half2(__float2half(4.0f), __float2half(6.0f));
 
   c = __hadd2(b, half_offset0);
   r_alias[0] = plset(__low2half(c));
@@ -1261,9 +1266,8 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2
-pselect<Packet4h2>(const Packet4h2& mask, const Packet4h2& a,
-                   const Packet4h2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 pselect<Packet4h2>(const Packet4h2& mask, const Packet4h2& a,
+                                                                   const Packet4h2& b) {
   Packet4h2 r;
   half2* r_alias = reinterpret_cast<half2*>(&r);
   const half2* mask_alias = reinterpret_cast<const half2*>(&mask);
@@ -1277,8 +1281,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2
-pcmp_eq<Packet4h2>(const Packet4h2& a, const Packet4h2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 pcmp_eq<Packet4h2>(const Packet4h2& a, const Packet4h2& b) {
   Packet4h2 r;
   half2* r_alias = reinterpret_cast<half2*>(&r);
   const half2* a_alias = reinterpret_cast<const half2*>(&a);
@@ -1291,8 +1294,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2
-pcmp_lt<Packet4h2>(const Packet4h2& a, const Packet4h2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 pcmp_lt<Packet4h2>(const Packet4h2& a, const Packet4h2& b) {
   Packet4h2 r;
   half2* r_alias = reinterpret_cast<half2*>(&r);
   const half2* a_alias = reinterpret_cast<const half2*>(&a);
@@ -1305,8 +1307,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2
-pcmp_le<Packet4h2>(const Packet4h2& a, const Packet4h2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 pcmp_le<Packet4h2>(const Packet4h2& a, const Packet4h2& b) {
   Packet4h2 r;
   half2* r_alias = reinterpret_cast<half2*>(&r);
   const half2* a_alias = reinterpret_cast<const half2*>(&a);
@@ -1319,8 +1320,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 pand<Packet4h2>(
-    const Packet4h2& a, const Packet4h2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 pand<Packet4h2>(const Packet4h2& a, const Packet4h2& b) {
   Packet4h2 r;
   half2* r_alias = reinterpret_cast<half2*>(&r);
   const half2* a_alias = reinterpret_cast<const half2*>(&a);
@@ -1333,8 +1333,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 por<Packet4h2>(
-    const Packet4h2& a, const Packet4h2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 por<Packet4h2>(const Packet4h2& a, const Packet4h2& b) {
   Packet4h2 r;
   half2* r_alias = reinterpret_cast<half2*>(&r);
   const half2* a_alias = reinterpret_cast<const half2*>(&a);
@@ -1347,8 +1346,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 pxor<Packet4h2>(
-    const Packet4h2& a, const Packet4h2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 pxor<Packet4h2>(const Packet4h2& a, const Packet4h2& b) {
   Packet4h2 r;
   half2* r_alias = reinterpret_cast<half2*>(&r);
   const half2* a_alias = reinterpret_cast<const half2*>(&a);
@@ -1361,8 +1359,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2
-pandnot<Packet4h2>(const Packet4h2& a, const Packet4h2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 pandnot<Packet4h2>(const Packet4h2& a, const Packet4h2& b) {
   Packet4h2 r;
   half2* r_alias = reinterpret_cast<half2*>(&r);
   const half2* a_alias = reinterpret_cast<const half2*>(&a);
@@ -1375,8 +1372,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 padd<Packet4h2>(
-    const Packet4h2& a, const Packet4h2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 padd<Packet4h2>(const Packet4h2& a, const Packet4h2& b) {
   Packet4h2 r;
   half2* r_alias = reinterpret_cast<half2*>(&r);
   const half2* a_alias = reinterpret_cast<const half2*>(&a);
@@ -1389,8 +1385,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 psub<Packet4h2>(
-    const Packet4h2& a, const Packet4h2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 psub<Packet4h2>(const Packet4h2& a, const Packet4h2& b) {
   Packet4h2 r;
   half2* r_alias = reinterpret_cast<half2*>(&r);
   const half2* a_alias = reinterpret_cast<const half2*>(&a);
@@ -1420,8 +1415,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 pmul<Packet4h2>(
-    const Packet4h2& a, const Packet4h2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 pmul<Packet4h2>(const Packet4h2& a, const Packet4h2& b) {
   Packet4h2 r;
   half2* r_alias = reinterpret_cast<half2*>(&r);
   const half2* a_alias = reinterpret_cast<const half2*>(&a);
@@ -1434,8 +1428,8 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 pmadd<Packet4h2>(
-    const Packet4h2& a, const Packet4h2& b, const Packet4h2& c) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 pmadd<Packet4h2>(const Packet4h2& a, const Packet4h2& b,
+                                                                 const Packet4h2& c) {
   Packet4h2 r;
   half2* r_alias = reinterpret_cast<half2*>(&r);
   const half2* a_alias = reinterpret_cast<const half2*>(&a);
@@ -1449,8 +1443,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 pdiv<Packet4h2>(
-    const Packet4h2& a, const Packet4h2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 pdiv<Packet4h2>(const Packet4h2& a, const Packet4h2& b) {
   Packet4h2 r;
   half2* r_alias = reinterpret_cast<half2*>(&r);
   const half2* a_alias = reinterpret_cast<const half2*>(&a);
@@ -1463,8 +1456,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 pmin<Packet4h2>(
-    const Packet4h2& a, const Packet4h2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 pmin<Packet4h2>(const Packet4h2& a, const Packet4h2& b) {
   Packet4h2 r;
   half2* r_alias = reinterpret_cast<half2*>(&r);
   const half2* a_alias = reinterpret_cast<const half2*>(&a);
@@ -1477,8 +1469,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 pmax<Packet4h2>(
-    const Packet4h2& a, const Packet4h2& b) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 pmax<Packet4h2>(const Packet4h2& a, const Packet4h2& b) {
   Packet4h2 r;
   half2* r_alias = reinterpret_cast<half2*>(&r);
   const half2* a_alias = reinterpret_cast<const half2*>(&a);
@@ -1491,64 +1482,53 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Eigen::half predux<Packet4h2>(
-    const Packet4h2& a) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Eigen::half predux<Packet4h2>(const Packet4h2& a) {
   const half2* a_alias = reinterpret_cast<const half2*>(&a);
 
-  return predux(a_alias[0]) + predux(a_alias[1]) +
-         predux(a_alias[2]) + predux(a_alias[3]);
+  return predux(a_alias[0]) + predux(a_alias[1]) + predux(a_alias[2]) + predux(a_alias[3]);
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Eigen::half predux_max<Packet4h2>(
-    const Packet4h2& a) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Eigen::half predux_max<Packet4h2>(const Packet4h2& a) {
   const half2* a_alias = reinterpret_cast<const half2*>(&a);
-  half2 m0 = __halves2half2(predux_max(a_alias[0]),
-                            predux_max(a_alias[1]));
-  half2 m1 = __halves2half2(predux_max(a_alias[2]),
-                            predux_max(a_alias[3]));
-  __half first  = predux_max(m0);
+  half2 m0 = __halves2half2(predux_max(a_alias[0]), predux_max(a_alias[1]));
+  half2 m1 = __halves2half2(predux_max(a_alias[2]), predux_max(a_alias[3]));
+  __half first = predux_max(m0);
   __half second = predux_max(m1);
 #if defined(EIGEN_CUDA_HAS_FP16_ARITHMETIC)
   return (__hgt(first, second) ? first : second);
 #else
-  float ffirst  = __half2float(first);
+  float ffirst = __half2float(first);
   float fsecond = __half2float(second);
-  return (ffirst > fsecond)? first: second;
+  return (ffirst > fsecond) ? first : second;
 #endif
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Eigen::half predux_min<Packet4h2>(
-    const Packet4h2& a) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Eigen::half predux_min<Packet4h2>(const Packet4h2& a) {
   const half2* a_alias = reinterpret_cast<const half2*>(&a);
-  half2 m0 = __halves2half2(predux_min(a_alias[0]),
-                            predux_min(a_alias[1]));
-  half2 m1 = __halves2half2(predux_min(a_alias[2]),
-                            predux_min(a_alias[3]));
-  __half first  = predux_min(m0);
+  half2 m0 = __halves2half2(predux_min(a_alias[0]), predux_min(a_alias[1]));
+  half2 m1 = __halves2half2(predux_min(a_alias[2]), predux_min(a_alias[3]));
+  __half first = predux_min(m0);
   __half second = predux_min(m1);
 #if defined(EIGEN_CUDA_HAS_FP16_ARITHMETIC)
   return (__hlt(first, second) ? first : second);
 #else
-  float ffirst  = __half2float(first);
+  float ffirst = __half2float(first);
   float fsecond = __half2float(second);
-  return (ffirst < fsecond)? first: second;
+  return (ffirst < fsecond) ? first : second;
 #endif
 }
 
 // likely overflow/underflow
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Eigen::half predux_mul<Packet4h2>(
-    const Packet4h2& a) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Eigen::half predux_mul<Packet4h2>(const Packet4h2& a) {
   const half2* a_alias = reinterpret_cast<const half2*>(&a);
-  return predux_mul(pmul(pmul(a_alias[0], a_alias[1]),
-                                       pmul(a_alias[2], a_alias[3])));
+  return predux_mul(pmul(pmul(a_alias[0], a_alias[1]), pmul(a_alias[2], a_alias[3])));
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2
-plog1p<Packet4h2>(const Packet4h2& a) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 plog1p<Packet4h2>(const Packet4h2& a) {
   Packet4h2 r;
   half2* r_alias = reinterpret_cast<half2*>(&r);
   const half2* a_alias = reinterpret_cast<const half2*>(&a);
@@ -1560,8 +1540,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2
-pexpm1<Packet4h2>(const Packet4h2& a) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 pexpm1<Packet4h2>(const Packet4h2& a) {
   Packet4h2 r;
   half2* r_alias = reinterpret_cast<half2*>(&r);
   const half2* a_alias = reinterpret_cast<const half2*>(&a);
@@ -1609,8 +1588,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2
-prsqrt<Packet4h2>(const Packet4h2& a) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 prsqrt<Packet4h2>(const Packet4h2& a) {
   Packet4h2 r;
   half2* r_alias = reinterpret_cast<half2*>(&r);
   const half2* a_alias = reinterpret_cast<const half2*>(&a);
@@ -1623,9 +1601,8 @@
 
 // The following specialized padd, pmul, pdiv, pmin, pmax, pset1 are needed for
 // the implementation of GPU half reduction.
-template<>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 padd<half2>(const half2& a,
-                                                        const half2& b) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 padd<half2>(const half2& a, const half2& b) {
 #if defined(EIGEN_GPU_HAS_FP16_ARITHMETIC)
   return __hadd2(a, b);
 #else
@@ -1639,9 +1616,8 @@
 #endif
 }
 
-template<>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pmul<half2>(const half2& a,
-                                                        const half2& b) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pmul<half2>(const half2& a, const half2& b) {
 #if defined(EIGEN_GPU_HAS_FP16_ARITHMETIC)
   return __hmul2(a, b);
 #else
@@ -1655,9 +1631,8 @@
 #endif
 }
 
-template<>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pdiv<half2>(const half2& a,
-                                                        const half2& b) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pdiv<half2>(const half2& a, const half2& b) {
 #if defined(EIGEN_GPU_HAS_FP16_ARITHMETIC)
   return __h2div(a, b);
 #else
@@ -1671,9 +1646,8 @@
 #endif
 }
 
-template<>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pmin<half2>(const half2& a,
-                                                        const half2& b) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pmin<half2>(const half2& a, const half2& b) {
   float a1 = __low2float(a);
   float a2 = __high2float(a);
   float b1 = __low2float(b);
@@ -1683,9 +1657,8 @@
   return __halves2half2(r1, r2);
 }
 
-template<>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pmax<half2>(const half2& a,
-                                                        const half2& b) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pmax<half2>(const half2& a, const half2& b) {
   float a1 = __low2float(a);
   float a2 = __high2float(a);
   float b1 = __low2float(b);
@@ -1695,15 +1668,14 @@
   return __halves2half2(r1, r2);
 }
 
-#endif // (defined(EIGEN_HAS_CUDA_FP16) || defined(EIGEN_HAS_HIP_FP16)) && defined(EIGEN_GPU_COMPILE_PHASE)
+#endif  // (defined(EIGEN_HAS_CUDA_FP16) || defined(EIGEN_HAS_HIP_FP16)) && defined(EIGEN_GPU_COMPILE_PHASE)
 
 #undef EIGEN_GPU_HAS_LDG
 #undef EIGEN_CUDA_HAS_FP16_ARITHMETIC
 #undef EIGEN_GPU_HAS_FP16_ARITHMETIC
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-
-#endif // EIGEN_PACKET_MATH_GPU_H
+#endif  // EIGEN_PACKET_MATH_GPU_H
diff --git a/Eigen/src/Core/arch/GPU/Tuple.h b/Eigen/src/Core/arch/GPU/Tuple.h
index e223ca1..6bea9ac 100644
--- a/Eigen/src/Core/arch/GPU/Tuple.h
+++ b/Eigen/src/Core/arch/GPU/Tuple.h
@@ -20,196 +20,173 @@
 namespace tuple_impl {
 
 // Internal tuple implementation.
-template<size_t N, typename... Types>
+template <size_t N, typename... Types>
 class TupleImpl;
 
 // Generic recursive tuple.
-template<size_t N, typename T1, typename... Ts>
+template <size_t N, typename T1, typename... Ts>
 class TupleImpl<N, T1, Ts...> {
  public:
   // Tuple may contain Eigen types.
   EIGEN_MAKE_ALIGNED_OPERATOR_NEW
-  
+
   // Default constructor, enable if all types are default-constructible.
-  template<typename U1 = T1, typename EnableIf = std::enable_if_t<
-      std::is_default_constructible<U1>::value
-      && reduce_all<std::is_default_constructible<Ts>::value...>::value
-    >>
-  EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC
-  TupleImpl() : head_{}, tail_{} {}
- 
+  template <typename U1 = T1,
+            typename EnableIf = std::enable_if_t<std::is_default_constructible<U1>::value &&
+                                                 reduce_all<std::is_default_constructible<Ts>::value...>::value>>
+  EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC TupleImpl() : head_{}, tail_{} {}
+
   // Element constructor.
-  template<typename U1, typename... Us, 
-           // Only enable if...
-           typename EnableIf = std::enable_if_t<
-              // the number of input arguments match, and ...
-              sizeof...(Us) == sizeof...(Ts) && (
-                // this does not look like a copy/move constructor.
-                N > 1 || std::is_convertible<U1, T1>::value)
-           >>
-  EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC
-  TupleImpl(U1&& arg1, Us&&... args) 
-    : head_(std::forward<U1>(arg1)), tail_(std::forward<Us>(args)...) {}
- 
-  // The first stored value. 
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-  T1& head() {
-    return head_;
-  }
-  
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-  const T1& head() const {
-    return head_;
-  }
-  
+  template <typename U1, typename... Us,
+            // Only enable if...
+            typename EnableIf = std::enable_if_t<
+                // the number of input arguments match, and ...
+                sizeof...(Us) == sizeof...(Ts) && (
+                                                      // this does not look like a copy/move constructor.
+                                                      N > 1 || std::is_convertible<U1, T1>::value)>>
+  EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC TupleImpl(U1&& arg1, Us&&... args)
+      : head_(std::forward<U1>(arg1)), tail_(std::forward<Us>(args)...) {}
+
+  // The first stored value.
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T1& head() { return head_; }
+
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE const T1& head() const { return head_; }
+
   // The tail values.
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-  TupleImpl<N-1, Ts...>& tail() {
-    return tail_;
-  }
-  
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-  const TupleImpl<N-1, Ts...>& tail() const {
-    return tail_;
-  }
-  
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  void swap(TupleImpl& other) {
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE TupleImpl<N - 1, Ts...>& tail() { return tail_; }
+
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE const TupleImpl<N - 1, Ts...>& tail() const { return tail_; }
+
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void swap(TupleImpl& other) {
     using numext::swap;
     swap(head_, other.head_);
     swap(tail_, other.tail_);
   }
-  
-  template<typename... UTypes>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  TupleImpl& operator=(const TupleImpl<N, UTypes...>& other) {
+
+  template <typename... UTypes>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TupleImpl& operator=(const TupleImpl<N, UTypes...>& other) {
     head_ = other.head_;
     tail_ = other.tail_;
     return *this;
   }
-  
-  template<typename... UTypes>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  TupleImpl& operator=(TupleImpl<N, UTypes...>&& other) {
+
+  template <typename... UTypes>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TupleImpl& operator=(TupleImpl<N, UTypes...>&& other) {
     head_ = std::move(other.head_);
     tail_ = std::move(other.tail_);
     return *this;
   }
-  
+
  private:
   // Allow related tuples to reference head_/tail_.
-  template<size_t M, typename... UTypes>
+  template <size_t M, typename... UTypes>
   friend class TupleImpl;
- 
+
   T1 head_;
-  TupleImpl<N-1, Ts...> tail_;
+  TupleImpl<N - 1, Ts...> tail_;
 };
 
 // Empty tuple specialization.
-template<>
+template <>
 class TupleImpl<size_t(0)> {};
 
-template<typename TupleType>
+template <typename TupleType>
 struct is_tuple : std::false_type {};
 
-template<typename... Types>
-struct is_tuple< TupleImpl<sizeof...(Types), Types...> > : std::true_type {};
+template <typename... Types>
+struct is_tuple<TupleImpl<sizeof...(Types), Types...>> : std::true_type {};
 
 // Gets an element from a tuple.
-template<size_t Idx, typename T1, typename... Ts>
+template <size_t Idx, typename T1, typename... Ts>
 struct tuple_get_impl {
   using TupleType = TupleImpl<sizeof...(Ts) + 1, T1, Ts...>;
   using ReturnType = typename tuple_get_impl<Idx - 1, Ts...>::ReturnType;
-  
-  static EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-  ReturnType& run(TupleType& tuple) {
-    return tuple_get_impl<Idx-1, Ts...>::run(tuple.tail());
+
+  static EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE ReturnType& run(TupleType& tuple) {
+    return tuple_get_impl<Idx - 1, Ts...>::run(tuple.tail());
   }
 
-  static EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-  const ReturnType& run(const TupleType& tuple) {
-    return tuple_get_impl<Idx-1, Ts...>::run(tuple.tail());
+  static EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE const ReturnType& run(const TupleType& tuple) {
+    return tuple_get_impl<Idx - 1, Ts...>::run(tuple.tail());
   }
 };
 
 // Base case, getting the head element.
-template<typename T1, typename... Ts>
+template <typename T1, typename... Ts>
 struct tuple_get_impl<0, T1, Ts...> {
   using TupleType = TupleImpl<sizeof...(Ts) + 1, T1, Ts...>;
   using ReturnType = T1;
 
-  static EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-  T1& run(TupleType& tuple) {
-    return tuple.head();
-  }
+  static EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T1& run(TupleType& tuple) { return tuple.head(); }
 
-  static EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-  const T1& run(const TupleType& tuple) {
+  static EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE const T1& run(const TupleType& tuple) {
     return tuple.head();
   }
 };
 
 // Concatenates N Tuples.
-template<size_t NTuples, typename... Tuples>
+template <size_t NTuples, typename... Tuples>
 struct tuple_cat_impl;
 
-template<size_t NTuples, size_t N1, typename... Args1, size_t N2, typename... Args2, typename... Tuples>
+template <size_t NTuples, size_t N1, typename... Args1, size_t N2, typename... Args2, typename... Tuples>
 struct tuple_cat_impl<NTuples, TupleImpl<N1, Args1...>, TupleImpl<N2, Args2...>, Tuples...> {
   using TupleType1 = TupleImpl<N1, Args1...>;
   using TupleType2 = TupleImpl<N2, Args2...>;
   using MergedTupleType = TupleImpl<N1 + N2, Args1..., Args2...>;
-  
-  using ReturnType = typename tuple_cat_impl<NTuples-1, MergedTupleType, Tuples...>::ReturnType;
-  
+
+  using ReturnType = typename tuple_cat_impl<NTuples - 1, MergedTupleType, Tuples...>::ReturnType;
+
   // Uses the index sequences to extract and merge elements from tuple1 and tuple2,
   // then recursively calls again.
-  template<typename Tuple1, size_t... I1s, typename Tuple2, size_t... I2s, typename... MoreTuples>
-  static EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  ReturnType run(Tuple1&& tuple1, std::index_sequence<I1s...>,
-                 Tuple2&& tuple2, std::index_sequence<I2s...>,
-                 MoreTuples&&... tuples) {
-    return tuple_cat_impl<NTuples-1, MergedTupleType, Tuples...>::run(
+  template <typename Tuple1, size_t... I1s, typename Tuple2, size_t... I2s, typename... MoreTuples>
+  static EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ReturnType run(Tuple1&& tuple1,
+                                                                              std::index_sequence<I1s...>,
+                                                                              Tuple2&& tuple2,
+                                                                              std::index_sequence<I2s...>,
+                                                                              MoreTuples&&... tuples) {
+    return tuple_cat_impl<NTuples - 1, MergedTupleType, Tuples...>::run(
         MergedTupleType(tuple_get_impl<I1s, Args1...>::run(std::forward<Tuple1>(tuple1))...,
                         tuple_get_impl<I2s, Args2...>::run(std::forward<Tuple2>(tuple2))...),
         std::forward<MoreTuples>(tuples)...);
   }
-  
+
   // Concatenates the first two tuples.
-  template<typename Tuple1, typename Tuple2, typename... MoreTuples>
-  static EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  ReturnType run(Tuple1&& tuple1, Tuple2&& tuple2, MoreTuples&&... tuples) {
-    return run(std::forward<Tuple1>(tuple1), std::make_index_sequence<N1>{},
-               std::forward<Tuple2>(tuple2), std::make_index_sequence<N2>{},
-               std::forward<MoreTuples>(tuples)...);
+  template <typename Tuple1, typename Tuple2, typename... MoreTuples>
+  static EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ReturnType run(Tuple1&& tuple1, Tuple2&& tuple2,
+                                                                              MoreTuples&&... tuples) {
+    return run(std::forward<Tuple1>(tuple1), std::make_index_sequence<N1>{}, std::forward<Tuple2>(tuple2),
+               std::make_index_sequence<N2>{}, std::forward<MoreTuples>(tuples)...);
   }
 };
 
 // Base case with a single tuple.
-template<size_t N, typename... Args>
-struct tuple_cat_impl<1, TupleImpl<N, Args...> > { 
+template <size_t N, typename... Args>
+struct tuple_cat_impl<1, TupleImpl<N, Args...>> {
   using ReturnType = TupleImpl<N, Args...>;
-  
-  template<typename Tuple1>
-  static EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  ReturnType run(Tuple1&& tuple1) {
+
+  template <typename Tuple1>
+  static EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ReturnType run(Tuple1&& tuple1) {
     return tuple1;
   }
 };
 
 // Special case of no tuples.
-template<>
-struct tuple_cat_impl<0> { 
+template <>
+struct tuple_cat_impl<0> {
   using ReturnType = TupleImpl<0>;
-  static EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  ReturnType run() {return ReturnType{}; }
+  static EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ReturnType run() { return ReturnType{}; }
 };
 
 // For use in make_tuple, unwraps a reference_wrapper.
 template <typename T>
-struct unwrap_reference_wrapper { using type = T; };
- 
+struct unwrap_reference_wrapper {
+  using type = T;
+};
+
 template <typename T>
-struct unwrap_reference_wrapper<std::reference_wrapper<T> > { using type = T&; };
+struct unwrap_reference_wrapper<std::reference_wrapper<T>> {
+  using type = T&;
+};
 
 // For use in make_tuple, decays a type and unwraps a reference_wrapper.
 template <typename T>
@@ -220,11 +197,11 @@
 /**
  * Utility for determining a tuple's size.
  */
-template<typename Tuple>
+template <typename Tuple>
 struct tuple_size;
 
-template<typename... Types >
-struct tuple_size< TupleImpl<sizeof...(Types), Types...> > : std::integral_constant<size_t, sizeof...(Types)> {};
+template <typename... Types>
+struct tuple_size<TupleImpl<sizeof...(Types), Types...>> : std::integral_constant<size_t, sizeof...(Types)> {};
 
 /**
  * Gets an element of a tuple.
@@ -233,17 +210,15 @@
  * \param tuple the tuple.
  * \return a reference to the desired element.
  */
-template<size_t Idx, typename... Types>
-EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-const typename tuple_get_impl<Idx, Types...>::ReturnType&
-get(const TupleImpl<sizeof...(Types), Types...>& tuple) {
+template <size_t Idx, typename... Types>
+EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename tuple_get_impl<Idx, Types...>::ReturnType& get(
+    const TupleImpl<sizeof...(Types), Types...>& tuple) {
   return tuple_get_impl<Idx, Types...>::run(tuple);
 }
 
-template<size_t Idx, typename... Types>
-EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename tuple_get_impl<Idx, Types...>::ReturnType&
-get(TupleImpl<sizeof...(Types), Types...>& tuple) {
+template <size_t Idx, typename... Types>
+EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename tuple_get_impl<Idx, Types...>::ReturnType& get(
+    TupleImpl<sizeof...(Types), Types...>& tuple) {
   return tuple_get_impl<Idx, Types...>::run(tuple);
 }
 
@@ -252,31 +227,27 @@
  * \param tuples ... list of tuples.
  * \return concatenated tuple.
  */
-template<typename... Tuples,
-          typename EnableIf = std::enable_if_t<
-            internal::reduce_all<
-              is_tuple<typename std::decay<Tuples>::type>::value...>::value>>
+template <typename... Tuples, typename EnableIf = std::enable_if_t<
+                                  internal::reduce_all<is_tuple<typename std::decay<Tuples>::type>::value...>::value>>
 EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename tuple_cat_impl<sizeof...(Tuples), typename std::decay<Tuples>::type...>::ReturnType
-tuple_cat(Tuples&&... tuples) {
+    typename tuple_cat_impl<sizeof...(Tuples), typename std::decay<Tuples>::type...>::ReturnType
+    tuple_cat(Tuples&&... tuples) {
   return tuple_cat_impl<sizeof...(Tuples), typename std::decay<Tuples>::type...>::run(std::forward<Tuples>(tuples)...);
 }
 
 /**
  * Tie arguments together into a tuple.
  */
-template <typename... Args, typename ReturnType = TupleImpl<sizeof...(Args), Args&...> >
-EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-ReturnType tie(Args&... args) EIGEN_NOEXCEPT {
-    return ReturnType{args...};
+template <typename... Args, typename ReturnType = TupleImpl<sizeof...(Args), Args&...>>
+EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ReturnType tie(Args&... args) EIGEN_NOEXCEPT {
+  return ReturnType{args...};
 }
 
 /**
  * Create a tuple of l-values with the supplied arguments.
  */
-template <typename... Args, typename ReturnType = TupleImpl<sizeof...(Args), typename unwrap_decay<Args>::type...> >
-EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-ReturnType make_tuple(Args&&... args) {
+template <typename... Args, typename ReturnType = TupleImpl<sizeof...(Args), typename unwrap_decay<Args>::type...>>
+EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ReturnType make_tuple(Args&&... args) {
   return ReturnType{std::forward<Args>(args)...};
 }
 
@@ -284,15 +255,15 @@
  * Forward a set of arguments as a tuple.
  */
 template <typename... Args>
-EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-TupleImpl<sizeof...(Args), Args...> forward_as_tuple(Args&&... args) {
+EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TupleImpl<sizeof...(Args), Args...> forward_as_tuple(
+    Args&&... args) {
   return TupleImpl<sizeof...(Args), Args...>(std::forward<Args>(args)...);
 }
 
 /**
  * Alternative to std::tuple that can be used on device.
  */
-template<typename... Types>
+template <typename... Types>
 using tuple = TupleImpl<sizeof...(Types), Types...>;
 
 }  // namespace tuple_impl
diff --git a/Eigen/src/Core/arch/GPU/TypeCasting.h b/Eigen/src/Core/arch/GPU/TypeCasting.h
index aa89cd2..ae43f8e 100644
--- a/Eigen/src/Core/arch/GPU/TypeCasting.h
+++ b/Eigen/src/Core/arch/GPU/TypeCasting.h
@@ -22,61 +22,56 @@
 
 template <>
 struct type_casting_traits<Eigen::half, float> {
-  enum {
-    VectorizedCast = 1,
-    SrcCoeffRatio = 1,
-    TgtCoeffRatio = 2
-  };
+  enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
 };
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pcast<half2, float4>(const half2& a, const half2& b) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pcast<half2, float4>(const half2& a, const half2& b) {
   float2 r1 = __half22float2(a);
   float2 r2 = __half22float2(b);
   return make_float4(r1.x, r1.y, r2.x, r2.y);
 }
 
-
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 pcast<float4, Packet4h2>(const float4& a, const float4& b) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4h2 pcast<float4, Packet4h2>(const float4& a, const float4& b) {
   Packet4h2 r;
-  half2* r_alias=reinterpret_cast<half2*>(&r);
-  r_alias[0]=__floats2half2_rn(a.x,a.y);
-  r_alias[1]=__floats2half2_rn(a.z,a.w);
-  r_alias[2]=__floats2half2_rn(b.x,b.y);
-  r_alias[3]=__floats2half2_rn(b.z,b.w);
+  half2* r_alias = reinterpret_cast<half2*>(&r);
+  r_alias[0] = __floats2half2_rn(a.x, a.y);
+  r_alias[1] = __floats2half2_rn(a.z, a.w);
+  r_alias[2] = __floats2half2_rn(b.x, b.y);
+  r_alias[3] = __floats2half2_rn(b.z, b.w);
   return r;
 }
 
 template <>
 struct type_casting_traits<float, Eigen::half> {
-  enum {
-    VectorizedCast = 1,
-    SrcCoeffRatio = 2,
-    TgtCoeffRatio = 1
-  };
+  enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
 };
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pcast<Packet4h2, float4>(const Packet4h2& a) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pcast<Packet4h2, float4>(const Packet4h2& a) {
   // Simply discard the second half of the input
   float4 r;
-  const half2* a_alias=reinterpret_cast<const half2*>(&a);
+  const half2* a_alias = reinterpret_cast<const half2*>(&a);
   float2 r1 = __half22float2(a_alias[0]);
   float2 r2 = __half22float2(a_alias[1]);
-  r.x=static_cast<float>(r1.x);
-  r.y=static_cast<float>(r1.y);
-  r.z=static_cast<float>(r2.x);
-  r.w=static_cast<float>(r2.y);
+  r.x = static_cast<float>(r1.x);
+  r.y = static_cast<float>(r1.y);
+  r.z = static_cast<float>(r2.x);
+  r.w = static_cast<float>(r2.y);
   return r;
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pcast<float4, half2>(const float4& a) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE half2 pcast<float4, half2>(const float4& a) {
   // Simply discard the second half of the input
   return __floats2half2_rn(a.x, a.y);
 }
 
 #endif
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_TYPE_CASTING_GPU_H
+#endif  // EIGEN_TYPE_CASTING_GPU_H
diff --git a/Eigen/src/Core/arch/HIP/hcc/math_constants.h b/Eigen/src/Core/arch/HIP/hcc/math_constants.h
index 25375a0..99dd3ae 100644
--- a/Eigen/src/Core/arch/HIP/hcc/math_constants.h
+++ b/Eigen/src/Core/arch/HIP/hcc/math_constants.h
@@ -1,5 +1,5 @@
 /*
- * math_constants.h - 
+ * math_constants.h -
  *  HIP equivalent of the CUDA header of the same name
  */
 
@@ -8,16 +8,16 @@
 
 /* single precision constants */
 
-#define HIPRT_INF_F        __int_as_float(0x7f800000)
-#define HIPRT_NAN_F        __int_as_float(0x7fffffff)
+#define HIPRT_INF_F __int_as_float(0x7f800000)
+#define HIPRT_NAN_F __int_as_float(0x7fffffff)
 #define HIPRT_MIN_DENORM_F __int_as_float(0x00000001)
 #define HIPRT_MAX_NORMAL_F __int_as_float(0x7f7fffff)
-#define HIPRT_NEG_ZERO_F   __int_as_float(0x80000000)
-#define HIPRT_ZERO_F       0.0f
-#define HIPRT_ONE_F        1.0f
+#define HIPRT_NEG_ZERO_F __int_as_float(0x80000000)
+#define HIPRT_ZERO_F 0.0f
+#define HIPRT_ONE_F 1.0f
 
 /* double precision constants */
-#define HIPRT_INF          __hiloint2double(0x7ff00000, 0x00000000)
-#define HIPRT_NAN          __hiloint2double(0xfff80000, 0x00000000)
+#define HIPRT_INF __hiloint2double(0x7ff00000, 0x00000000)
+#define HIPRT_NAN __hiloint2double(0xfff80000, 0x00000000)
 
 #endif
diff --git a/Eigen/src/Core/arch/HVX/GeneralBlockPanelKernel.h b/Eigen/src/Core/arch/HVX/GeneralBlockPanelKernel.h
index 51f37fa..a159739 100644
--- a/Eigen/src/Core/arch/HVX/GeneralBlockPanelKernel.h
+++ b/Eigen/src/Core/arch/HVX/GeneralBlockPanelKernel.h
@@ -9,31 +9,26 @@
 namespace internal {
 
 template <bool ConjLhs_, bool ConjRhs_, int PacketSize_>
-class gebp_traits<float, float, ConjLhs_, ConjRhs_, Architecture::Target,
-                  PacketSize_>
-    : public gebp_traits<float, float, ConjLhs_, ConjRhs_,
-                         Architecture::Generic, PacketSize_> {
+class gebp_traits<float, float, ConjLhs_, ConjRhs_, Architecture::Target, PacketSize_>
+    : public gebp_traits<float, float, ConjLhs_, ConjRhs_, Architecture::Generic, PacketSize_> {
  public:
   typedef Packet32qf AccPacket;
 
   EIGEN_STRONG_INLINE void initAcc(Packet32qf& p) { p = pzero<Packet32qf>(p); }
 
   template <typename LaneIdType>
-  EIGEN_STRONG_INLINE void madd(const Packet32f& a, const Packet32f& b,
-                                Packet32qf& c, Packet32f& /*tmp*/,
+  EIGEN_STRONG_INLINE void madd(const Packet32f& a, const Packet32f& b, Packet32qf& c, Packet32f& /*tmp*/,
                                 const LaneIdType&) const {
     c = pmadd_f32_to_qf32(a, b, c);
   }
 
   template <typename LaneIdType>
-  EIGEN_STRONG_INLINE void madd(const Packet32f& a,
-                                const QuadPacket<Packet32f>& b, Packet32qf& c,
-                                Packet32f& tmp, const LaneIdType& lane) const {
+  EIGEN_STRONG_INLINE void madd(const Packet32f& a, const QuadPacket<Packet32f>& b, Packet32qf& c, Packet32f& tmp,
+                                const LaneIdType& lane) const {
     madd(a, b.get(lane), c, tmp, lane);
   }
 
-  EIGEN_STRONG_INLINE void acc(const Packet32qf& c, const Packet32f& alpha,
-                               Packet32f& r) const {
+  EIGEN_STRONG_INLINE void acc(const Packet32qf& c, const Packet32f& alpha, Packet32f& r) const {
     r = pmadd_qf32_to_f32(c, alpha, r);
   }
 };
diff --git a/Eigen/src/Core/arch/HVX/PacketMath.h b/Eigen/src/Core/arch/HVX/PacketMath.h
index cc8722f..7c69f3b 100644
--- a/Eigen/src/Core/arch/HVX/PacketMath.h
+++ b/Eigen/src/Core/arch/HVX/PacketMath.h
@@ -18,21 +18,13 @@
 namespace Eigen {
 namespace internal {
 
-EIGEN_STRONG_INLINE HVX_Vector HVX_load(const void* mem) {
-  return *((HVX_Vector*)mem);
-}
+EIGEN_STRONG_INLINE HVX_Vector HVX_load(const void* mem) { return *((HVX_Vector*)mem); }
 
-EIGEN_STRONG_INLINE HVX_Vector HVX_loadu(const void* mem) {
-  return *((HVX_UVector*)mem);
-}
+EIGEN_STRONG_INLINE HVX_Vector HVX_loadu(const void* mem) { return *((HVX_UVector*)mem); }
 
-EIGEN_STRONG_INLINE void HVX_store(void* mem, HVX_Vector v) {
-  *((HVX_Vector*)mem) = v;
-}
+EIGEN_STRONG_INLINE void HVX_store(void* mem, HVX_Vector v) { *((HVX_Vector*)mem) = v; }
 
-EIGEN_STRONG_INLINE void HVX_storeu(void* mem, HVX_Vector v) {
-  *((HVX_UVector*)mem) = v;
-}
+EIGEN_STRONG_INLINE void HVX_storeu(void* mem, HVX_Vector v) { *((HVX_UVector*)mem) = v; }
 
 // Hexagon compiler uses same HVX_Vector to represent all HVX vector types.
 // Wrap different vector type (float32, int32, etc) to different class with
@@ -106,24 +98,18 @@
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet32f pmul<Packet32f>(const Packet32f& a,
-                                              const Packet32f& b) {
-  return Packet32f::Create(
-      Q6_Vsf_equals_Vqf32(Q6_Vqf32_vmpy_VsfVsf(a.Get(), b.Get())));
+EIGEN_STRONG_INLINE Packet32f pmul<Packet32f>(const Packet32f& a, const Packet32f& b) {
+  return Packet32f::Create(Q6_Vsf_equals_Vqf32(Q6_Vqf32_vmpy_VsfVsf(a.Get(), b.Get())));
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet32f padd<Packet32f>(const Packet32f& a,
-                                              const Packet32f& b) {
-  return Packet32f::Create(
-      Q6_Vsf_equals_Vqf32(Q6_Vqf32_vadd_VsfVsf(a.Get(), b.Get())));
+EIGEN_STRONG_INLINE Packet32f padd<Packet32f>(const Packet32f& a, const Packet32f& b) {
+  return Packet32f::Create(Q6_Vsf_equals_Vqf32(Q6_Vqf32_vadd_VsfVsf(a.Get(), b.Get())));
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet32f psub<Packet32f>(const Packet32f& a,
-                                              const Packet32f& b) {
-  return Packet32f::Create(
-      Q6_Vsf_equals_Vqf32(Q6_Vqf32_vsub_VsfVsf(a.Get(), b.Get())));
+EIGEN_STRONG_INLINE Packet32f psub<Packet32f>(const Packet32f& a, const Packet32f& b) {
+  return Packet32f::Create(Q6_Vsf_equals_Vqf32(Q6_Vqf32_vsub_VsfVsf(a.Get(), b.Get())));
 }
 
 template <>
@@ -153,8 +139,7 @@
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet32f pcmp_lt_or_nan(const Packet32f& a,
-                                             const Packet32f& b) {
+EIGEN_STRONG_INLINE Packet32f pcmp_lt_or_nan(const Packet32f& a, const Packet32f& b) {
   HVX_Vector v_true = Q6_Vb_vsplat_R(0xff);
   HVX_VectorPred pred = Q6_Q_vcmp_gt_VsfVsf(b.Get(), a.Get());
   return Packet32f::Create(Q6_V_vmux_QVV(pred, v_true, Q6_V_vzero()));
@@ -175,16 +160,12 @@
 
 EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet32f, 4>& kernel) {
   // Shuffle the 32-bit lanes.
-  HVX_VectorPair v_0_1_0 =
-      Q6_W_vshuff_VVR(kernel.packet[1].Get(), kernel.packet[0].Get(), -4);
-  HVX_VectorPair v_0_3_2 =
-      Q6_W_vshuff_VVR(kernel.packet[3].Get(), kernel.packet[2].Get(), -4);
+  HVX_VectorPair v_0_1_0 = Q6_W_vshuff_VVR(kernel.packet[1].Get(), kernel.packet[0].Get(), -4);
+  HVX_VectorPair v_0_3_2 = Q6_W_vshuff_VVR(kernel.packet[3].Get(), kernel.packet[2].Get(), -4);
 
   // Shuffle the 64-bit lanes.
-  HVX_VectorPair v_1_1_0 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_3_2),
-                                           HEXAGON_HVX_GET_V0(v_0_1_0), -8);
-  HVX_VectorPair v_1_3_2 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_3_2),
-                                           HEXAGON_HVX_GET_V1(v_0_1_0), -8);
+  HVX_VectorPair v_1_1_0 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_3_2), HEXAGON_HVX_GET_V0(v_0_1_0), -8);
+  HVX_VectorPair v_1_3_2 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_3_2), HEXAGON_HVX_GET_V1(v_0_1_0), -8);
 
   kernel.packet[0] = Packet32f::Create(HEXAGON_HVX_GET_V0(v_1_1_0));
   kernel.packet[1] = Packet32f::Create(HEXAGON_HVX_GET_V1(v_1_1_0));
@@ -194,174 +175,94 @@
 
 EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet32f, 32>& kernel) {
   // Shuffle the 32-bit lanes.
-  HVX_VectorPair v_0_1_0 =
-      Q6_W_vshuff_VVR(kernel.packet[1].Get(), kernel.packet[0].Get(), -4);
-  HVX_VectorPair v_0_3_2 =
-      Q6_W_vshuff_VVR(kernel.packet[3].Get(), kernel.packet[2].Get(), -4);
-  HVX_VectorPair v_0_5_4 =
-      Q6_W_vshuff_VVR(kernel.packet[5].Get(), kernel.packet[4].Get(), -4);
-  HVX_VectorPair v_0_7_6 =
-      Q6_W_vshuff_VVR(kernel.packet[7].Get(), kernel.packet[6].Get(), -4);
-  HVX_VectorPair v_0_9_8 =
-      Q6_W_vshuff_VVR(kernel.packet[9].Get(), kernel.packet[8].Get(), -4);
-  HVX_VectorPair v_0_11_10 =
-      Q6_W_vshuff_VVR(kernel.packet[11].Get(), kernel.packet[10].Get(), -4);
-  HVX_VectorPair v_0_13_12 =
-      Q6_W_vshuff_VVR(kernel.packet[13].Get(), kernel.packet[12].Get(), -4);
-  HVX_VectorPair v_0_15_14 =
-      Q6_W_vshuff_VVR(kernel.packet[15].Get(), kernel.packet[14].Get(), -4);
-  HVX_VectorPair v_0_17_16 =
-      Q6_W_vshuff_VVR(kernel.packet[17].Get(), kernel.packet[16].Get(), -4);
-  HVX_VectorPair v_0_19_18 =
-      Q6_W_vshuff_VVR(kernel.packet[19].Get(), kernel.packet[18].Get(), -4);
-  HVX_VectorPair v_0_21_20 =
-      Q6_W_vshuff_VVR(kernel.packet[21].Get(), kernel.packet[20].Get(), -4);
-  HVX_VectorPair v_0_23_22 =
-      Q6_W_vshuff_VVR(kernel.packet[23].Get(), kernel.packet[22].Get(), -4);
-  HVX_VectorPair v_0_25_24 =
-      Q6_W_vshuff_VVR(kernel.packet[25].Get(), kernel.packet[24].Get(), -4);
-  HVX_VectorPair v_0_27_26 =
-      Q6_W_vshuff_VVR(kernel.packet[27].Get(), kernel.packet[26].Get(), -4);
-  HVX_VectorPair v_0_29_28 =
-      Q6_W_vshuff_VVR(kernel.packet[29].Get(), kernel.packet[28].Get(), -4);
-  HVX_VectorPair v_0_31_30 =
-      Q6_W_vshuff_VVR(kernel.packet[31].Get(), kernel.packet[30].Get(), -4);
+  HVX_VectorPair v_0_1_0 = Q6_W_vshuff_VVR(kernel.packet[1].Get(), kernel.packet[0].Get(), -4);
+  HVX_VectorPair v_0_3_2 = Q6_W_vshuff_VVR(kernel.packet[3].Get(), kernel.packet[2].Get(), -4);
+  HVX_VectorPair v_0_5_4 = Q6_W_vshuff_VVR(kernel.packet[5].Get(), kernel.packet[4].Get(), -4);
+  HVX_VectorPair v_0_7_6 = Q6_W_vshuff_VVR(kernel.packet[7].Get(), kernel.packet[6].Get(), -4);
+  HVX_VectorPair v_0_9_8 = Q6_W_vshuff_VVR(kernel.packet[9].Get(), kernel.packet[8].Get(), -4);
+  HVX_VectorPair v_0_11_10 = Q6_W_vshuff_VVR(kernel.packet[11].Get(), kernel.packet[10].Get(), -4);
+  HVX_VectorPair v_0_13_12 = Q6_W_vshuff_VVR(kernel.packet[13].Get(), kernel.packet[12].Get(), -4);
+  HVX_VectorPair v_0_15_14 = Q6_W_vshuff_VVR(kernel.packet[15].Get(), kernel.packet[14].Get(), -4);
+  HVX_VectorPair v_0_17_16 = Q6_W_vshuff_VVR(kernel.packet[17].Get(), kernel.packet[16].Get(), -4);
+  HVX_VectorPair v_0_19_18 = Q6_W_vshuff_VVR(kernel.packet[19].Get(), kernel.packet[18].Get(), -4);
+  HVX_VectorPair v_0_21_20 = Q6_W_vshuff_VVR(kernel.packet[21].Get(), kernel.packet[20].Get(), -4);
+  HVX_VectorPair v_0_23_22 = Q6_W_vshuff_VVR(kernel.packet[23].Get(), kernel.packet[22].Get(), -4);
+  HVX_VectorPair v_0_25_24 = Q6_W_vshuff_VVR(kernel.packet[25].Get(), kernel.packet[24].Get(), -4);
+  HVX_VectorPair v_0_27_26 = Q6_W_vshuff_VVR(kernel.packet[27].Get(), kernel.packet[26].Get(), -4);
+  HVX_VectorPair v_0_29_28 = Q6_W_vshuff_VVR(kernel.packet[29].Get(), kernel.packet[28].Get(), -4);
+  HVX_VectorPair v_0_31_30 = Q6_W_vshuff_VVR(kernel.packet[31].Get(), kernel.packet[30].Get(), -4);
 
   // Shuffle the 64-bit lanes.
-  HVX_VectorPair v_1_1_0 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_3_2),
-                                           HEXAGON_HVX_GET_V0(v_0_1_0), -8);
-  HVX_VectorPair v_1_3_2 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_3_2),
-                                           HEXAGON_HVX_GET_V1(v_0_1_0), -8);
-  HVX_VectorPair v_1_5_4 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_7_6),
-                                           HEXAGON_HVX_GET_V0(v_0_5_4), -8);
-  HVX_VectorPair v_1_7_6 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_7_6),
-                                           HEXAGON_HVX_GET_V1(v_0_5_4), -8);
-  HVX_VectorPair v_1_9_8 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_11_10),
-                                           HEXAGON_HVX_GET_V0(v_0_9_8), -8);
-  HVX_VectorPair v_1_11_10 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_11_10),
-                                             HEXAGON_HVX_GET_V1(v_0_9_8), -8);
-  HVX_VectorPair v_1_13_12 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_15_14),
-                                             HEXAGON_HVX_GET_V0(v_0_13_12), -8);
-  HVX_VectorPair v_1_15_14 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_15_14),
-                                             HEXAGON_HVX_GET_V1(v_0_13_12), -8);
-  HVX_VectorPair v_1_17_16 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_19_18),
-                                             HEXAGON_HVX_GET_V0(v_0_17_16), -8);
-  HVX_VectorPair v_1_19_18 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_19_18),
-                                             HEXAGON_HVX_GET_V1(v_0_17_16), -8);
-  HVX_VectorPair v_1_21_20 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_23_22),
-                                             HEXAGON_HVX_GET_V0(v_0_21_20), -8);
-  HVX_VectorPair v_1_23_22 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_23_22),
-                                             HEXAGON_HVX_GET_V1(v_0_21_20), -8);
-  HVX_VectorPair v_1_25_24 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_27_26),
-                                             HEXAGON_HVX_GET_V0(v_0_25_24), -8);
-  HVX_VectorPair v_1_27_26 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_27_26),
-                                             HEXAGON_HVX_GET_V1(v_0_25_24), -8);
-  HVX_VectorPair v_1_29_28 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_31_30),
-                                             HEXAGON_HVX_GET_V0(v_0_29_28), -8);
-  HVX_VectorPair v_1_31_30 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_31_30),
-                                             HEXAGON_HVX_GET_V1(v_0_29_28), -8);
+  HVX_VectorPair v_1_1_0 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_3_2), HEXAGON_HVX_GET_V0(v_0_1_0), -8);
+  HVX_VectorPair v_1_3_2 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_3_2), HEXAGON_HVX_GET_V1(v_0_1_0), -8);
+  HVX_VectorPair v_1_5_4 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_7_6), HEXAGON_HVX_GET_V0(v_0_5_4), -8);
+  HVX_VectorPair v_1_7_6 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_7_6), HEXAGON_HVX_GET_V1(v_0_5_4), -8);
+  HVX_VectorPair v_1_9_8 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_11_10), HEXAGON_HVX_GET_V0(v_0_9_8), -8);
+  HVX_VectorPair v_1_11_10 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_11_10), HEXAGON_HVX_GET_V1(v_0_9_8), -8);
+  HVX_VectorPair v_1_13_12 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_15_14), HEXAGON_HVX_GET_V0(v_0_13_12), -8);
+  HVX_VectorPair v_1_15_14 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_15_14), HEXAGON_HVX_GET_V1(v_0_13_12), -8);
+  HVX_VectorPair v_1_17_16 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_19_18), HEXAGON_HVX_GET_V0(v_0_17_16), -8);
+  HVX_VectorPair v_1_19_18 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_19_18), HEXAGON_HVX_GET_V1(v_0_17_16), -8);
+  HVX_VectorPair v_1_21_20 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_23_22), HEXAGON_HVX_GET_V0(v_0_21_20), -8);
+  HVX_VectorPair v_1_23_22 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_23_22), HEXAGON_HVX_GET_V1(v_0_21_20), -8);
+  HVX_VectorPair v_1_25_24 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_27_26), HEXAGON_HVX_GET_V0(v_0_25_24), -8);
+  HVX_VectorPair v_1_27_26 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_27_26), HEXAGON_HVX_GET_V1(v_0_25_24), -8);
+  HVX_VectorPair v_1_29_28 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_31_30), HEXAGON_HVX_GET_V0(v_0_29_28), -8);
+  HVX_VectorPair v_1_31_30 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_31_30), HEXAGON_HVX_GET_V1(v_0_29_28), -8);
 
   // Shuffle the 128-bit lanes.
-  v_0_1_0 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_5_4),
-                            HEXAGON_HVX_GET_V0(v_1_1_0), -16);
-  v_0_3_2 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_5_4),
-                            HEXAGON_HVX_GET_V1(v_1_1_0), -16);
-  v_0_5_4 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_7_6),
-                            HEXAGON_HVX_GET_V0(v_1_3_2), -16);
-  v_0_7_6 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_7_6),
-                            HEXAGON_HVX_GET_V1(v_1_3_2), -16);
-  v_0_9_8 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_13_12),
-                            HEXAGON_HVX_GET_V0(v_1_9_8), -16);
-  v_0_11_10 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_13_12),
-                              HEXAGON_HVX_GET_V1(v_1_9_8), -16);
-  v_0_13_12 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_15_14),
-                              HEXAGON_HVX_GET_V0(v_1_11_10), -16);
-  v_0_15_14 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_15_14),
-                              HEXAGON_HVX_GET_V1(v_1_11_10), -16);
-  v_0_17_16 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_21_20),
-                              HEXAGON_HVX_GET_V0(v_1_17_16), -16);
-  v_0_19_18 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_21_20),
-                              HEXAGON_HVX_GET_V1(v_1_17_16), -16);
-  v_0_21_20 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_23_22),
-                              HEXAGON_HVX_GET_V0(v_1_19_18), -16);
-  v_0_23_22 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_23_22),
-                              HEXAGON_HVX_GET_V1(v_1_19_18), -16);
-  v_0_25_24 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_29_28),
-                              HEXAGON_HVX_GET_V0(v_1_25_24), -16);
-  v_0_27_26 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_29_28),
-                              HEXAGON_HVX_GET_V1(v_1_25_24), -16);
-  v_0_29_28 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_31_30),
-                              HEXAGON_HVX_GET_V0(v_1_27_26), -16);
-  v_0_31_30 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_31_30),
-                              HEXAGON_HVX_GET_V1(v_1_27_26), -16);
+  v_0_1_0 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_5_4), HEXAGON_HVX_GET_V0(v_1_1_0), -16);
+  v_0_3_2 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_5_4), HEXAGON_HVX_GET_V1(v_1_1_0), -16);
+  v_0_5_4 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_7_6), HEXAGON_HVX_GET_V0(v_1_3_2), -16);
+  v_0_7_6 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_7_6), HEXAGON_HVX_GET_V1(v_1_3_2), -16);
+  v_0_9_8 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_13_12), HEXAGON_HVX_GET_V0(v_1_9_8), -16);
+  v_0_11_10 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_13_12), HEXAGON_HVX_GET_V1(v_1_9_8), -16);
+  v_0_13_12 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_15_14), HEXAGON_HVX_GET_V0(v_1_11_10), -16);
+  v_0_15_14 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_15_14), HEXAGON_HVX_GET_V1(v_1_11_10), -16);
+  v_0_17_16 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_21_20), HEXAGON_HVX_GET_V0(v_1_17_16), -16);
+  v_0_19_18 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_21_20), HEXAGON_HVX_GET_V1(v_1_17_16), -16);
+  v_0_21_20 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_23_22), HEXAGON_HVX_GET_V0(v_1_19_18), -16);
+  v_0_23_22 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_23_22), HEXAGON_HVX_GET_V1(v_1_19_18), -16);
+  v_0_25_24 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_29_28), HEXAGON_HVX_GET_V0(v_1_25_24), -16);
+  v_0_27_26 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_29_28), HEXAGON_HVX_GET_V1(v_1_25_24), -16);
+  v_0_29_28 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_31_30), HEXAGON_HVX_GET_V0(v_1_27_26), -16);
+  v_0_31_30 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_31_30), HEXAGON_HVX_GET_V1(v_1_27_26), -16);
 
   // Shuffle the 256-bit lanes.
-  v_1_1_0 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_9_8),
-                            HEXAGON_HVX_GET_V0(v_0_1_0), -32);
-  v_1_3_2 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_9_8),
-                            HEXAGON_HVX_GET_V1(v_0_1_0), -32);
-  v_1_5_4 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_11_10),
-                            HEXAGON_HVX_GET_V0(v_0_3_2), -32);
-  v_1_7_6 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_11_10),
-                            HEXAGON_HVX_GET_V1(v_0_3_2), -32);
-  v_1_9_8 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_13_12),
-                            HEXAGON_HVX_GET_V0(v_0_5_4), -32);
-  v_1_11_10 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_13_12),
-                              HEXAGON_HVX_GET_V1(v_0_5_4), -32);
-  v_1_13_12 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_15_14),
-                              HEXAGON_HVX_GET_V0(v_0_7_6), -32);
-  v_1_15_14 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_15_14),
-                              HEXAGON_HVX_GET_V1(v_0_7_6), -32);
-  v_1_17_16 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_25_24),
-                              HEXAGON_HVX_GET_V0(v_0_17_16), -32);
-  v_1_19_18 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_25_24),
-                              HEXAGON_HVX_GET_V1(v_0_17_16), -32);
-  v_1_21_20 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_27_26),
-                              HEXAGON_HVX_GET_V0(v_0_19_18), -32);
-  v_1_23_22 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_27_26),
-                              HEXAGON_HVX_GET_V1(v_0_19_18), -32);
-  v_1_25_24 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_29_28),
-                              HEXAGON_HVX_GET_V0(v_0_21_20), -32);
-  v_1_27_26 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_29_28),
-                              HEXAGON_HVX_GET_V1(v_0_21_20), -32);
-  v_1_29_28 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_31_30),
-                              HEXAGON_HVX_GET_V0(v_0_23_22), -32);
-  v_1_31_30 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_31_30),
-                              HEXAGON_HVX_GET_V1(v_0_23_22), -32);
+  v_1_1_0 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_9_8), HEXAGON_HVX_GET_V0(v_0_1_0), -32);
+  v_1_3_2 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_9_8), HEXAGON_HVX_GET_V1(v_0_1_0), -32);
+  v_1_5_4 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_11_10), HEXAGON_HVX_GET_V0(v_0_3_2), -32);
+  v_1_7_6 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_11_10), HEXAGON_HVX_GET_V1(v_0_3_2), -32);
+  v_1_9_8 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_13_12), HEXAGON_HVX_GET_V0(v_0_5_4), -32);
+  v_1_11_10 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_13_12), HEXAGON_HVX_GET_V1(v_0_5_4), -32);
+  v_1_13_12 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_15_14), HEXAGON_HVX_GET_V0(v_0_7_6), -32);
+  v_1_15_14 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_15_14), HEXAGON_HVX_GET_V1(v_0_7_6), -32);
+  v_1_17_16 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_25_24), HEXAGON_HVX_GET_V0(v_0_17_16), -32);
+  v_1_19_18 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_25_24), HEXAGON_HVX_GET_V1(v_0_17_16), -32);
+  v_1_21_20 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_27_26), HEXAGON_HVX_GET_V0(v_0_19_18), -32);
+  v_1_23_22 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_27_26), HEXAGON_HVX_GET_V1(v_0_19_18), -32);
+  v_1_25_24 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_29_28), HEXAGON_HVX_GET_V0(v_0_21_20), -32);
+  v_1_27_26 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_29_28), HEXAGON_HVX_GET_V1(v_0_21_20), -32);
+  v_1_29_28 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_0_31_30), HEXAGON_HVX_GET_V0(v_0_23_22), -32);
+  v_1_31_30 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_0_31_30), HEXAGON_HVX_GET_V1(v_0_23_22), -32);
 
   // Shuffle the 512-bit lanes.
-  v_0_1_0 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_17_16),
-                            HEXAGON_HVX_GET_V0(v_1_1_0), -64);
-  v_0_3_2 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_17_16),
-                            HEXAGON_HVX_GET_V1(v_1_1_0), -64);
-  v_0_5_4 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_19_18),
-                            HEXAGON_HVX_GET_V0(v_1_3_2), -64);
-  v_0_7_6 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_19_18),
-                            HEXAGON_HVX_GET_V1(v_1_3_2), -64);
-  v_0_9_8 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_21_20),
-                            HEXAGON_HVX_GET_V0(v_1_5_4), -64);
-  v_0_11_10 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_21_20),
-                              HEXAGON_HVX_GET_V1(v_1_5_4), -64);
-  v_0_13_12 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_23_22),
-                              HEXAGON_HVX_GET_V0(v_1_7_6), -64);
-  v_0_15_14 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_23_22),
-                              HEXAGON_HVX_GET_V1(v_1_7_6), -64);
-  v_0_17_16 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_25_24),
-                              HEXAGON_HVX_GET_V0(v_1_9_8), -64);
-  v_0_19_18 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_25_24),
-                              HEXAGON_HVX_GET_V1(v_1_9_8), -64);
-  v_0_21_20 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_27_26),
-                              HEXAGON_HVX_GET_V0(v_1_11_10), -64);
-  v_0_23_22 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_27_26),
-                              HEXAGON_HVX_GET_V1(v_1_11_10), -64);
-  v_0_25_24 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_29_28),
-                              HEXAGON_HVX_GET_V0(v_1_13_12), -64);
-  v_0_27_26 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_29_28),
-                              HEXAGON_HVX_GET_V1(v_1_13_12), -64);
-  v_0_29_28 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_31_30),
-                              HEXAGON_HVX_GET_V0(v_1_15_14), -64);
-  v_0_31_30 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_31_30),
-                              HEXAGON_HVX_GET_V1(v_1_15_14), -64);
+  v_0_1_0 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_17_16), HEXAGON_HVX_GET_V0(v_1_1_0), -64);
+  v_0_3_2 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_17_16), HEXAGON_HVX_GET_V1(v_1_1_0), -64);
+  v_0_5_4 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_19_18), HEXAGON_HVX_GET_V0(v_1_3_2), -64);
+  v_0_7_6 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_19_18), HEXAGON_HVX_GET_V1(v_1_3_2), -64);
+  v_0_9_8 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_21_20), HEXAGON_HVX_GET_V0(v_1_5_4), -64);
+  v_0_11_10 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_21_20), HEXAGON_HVX_GET_V1(v_1_5_4), -64);
+  v_0_13_12 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_23_22), HEXAGON_HVX_GET_V0(v_1_7_6), -64);
+  v_0_15_14 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_23_22), HEXAGON_HVX_GET_V1(v_1_7_6), -64);
+  v_0_17_16 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_25_24), HEXAGON_HVX_GET_V0(v_1_9_8), -64);
+  v_0_19_18 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_25_24), HEXAGON_HVX_GET_V1(v_1_9_8), -64);
+  v_0_21_20 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_27_26), HEXAGON_HVX_GET_V0(v_1_11_10), -64);
+  v_0_23_22 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_27_26), HEXAGON_HVX_GET_V1(v_1_11_10), -64);
+  v_0_25_24 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_29_28), HEXAGON_HVX_GET_V0(v_1_13_12), -64);
+  v_0_27_26 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_29_28), HEXAGON_HVX_GET_V1(v_1_13_12), -64);
+  v_0_29_28 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(v_1_31_30), HEXAGON_HVX_GET_V0(v_1_15_14), -64);
+  v_0_31_30 = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V1(v_1_31_30), HEXAGON_HVX_GET_V1(v_1_15_14), -64);
 
   kernel.packet[0] = Packet32f::Create(HEXAGON_HVX_GET_V0(v_0_1_0));
   kernel.packet[1] = Packet32f::Create(HEXAGON_HVX_GET_V1(v_0_1_0));
@@ -401,12 +302,9 @@
 EIGEN_STRONG_INLINE float predux<Packet32f>(const Packet32f& a) {
   HVX_Vector vsum_4 = Q6_Vqf32_vadd_VsfVsf(Q6_V_vror_VR(a.Get(), 4), a.Get());
   HVX_Vector vsum_8 = Q6_Vqf32_vadd_Vqf32Vqf32(Q6_V_vror_VR(vsum_4, 8), vsum_4);
-  HVX_Vector vsum_16 =
-      Q6_Vqf32_vadd_Vqf32Vqf32(Q6_V_vror_VR(vsum_8, 16), vsum_8);
-  HVX_Vector vsum_32 =
-      Q6_Vqf32_vadd_Vqf32Vqf32(Q6_V_vror_VR(vsum_16, 32), vsum_16);
-  HVX_Vector vsum_64 =
-      Q6_Vqf32_vadd_Vqf32Vqf32(Q6_V_vror_VR(vsum_32, 64), vsum_32);
+  HVX_Vector vsum_16 = Q6_Vqf32_vadd_Vqf32Vqf32(Q6_V_vror_VR(vsum_8, 16), vsum_8);
+  HVX_Vector vsum_32 = Q6_Vqf32_vadd_Vqf32Vqf32(Q6_V_vror_VR(vsum_16, 32), vsum_16);
+  HVX_Vector vsum_64 = Q6_Vqf32_vadd_Vqf32Vqf32(Q6_V_vror_VR(vsum_32, 64), vsum_32);
   return pfirst(Packet32f::Create(Q6_Vsf_equals_Vqf32(vsum_64)));
 }
 
@@ -421,8 +319,7 @@
 EIGEN_STRONG_INLINE Packet32f ploadquad(const float* from) {
   HVX_Vector load = HVX_loadu(from);
   HVX_VectorPair dup = Q6_W_vshuff_VVR(load, load, -4);
-  HVX_VectorPair quad =
-      Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(dup), HEXAGON_HVX_GET_V0(dup), -8);
+  HVX_VectorPair quad = Q6_W_vshuff_VVR(HEXAGON_HVX_GET_V0(dup), HEXAGON_HVX_GET_V0(dup), -8);
   return Packet32f::Create(HEXAGON_HVX_GET_V0(quad));
 }
 
@@ -463,8 +360,7 @@
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet32f pselect(const Packet32f& mask, const Packet32f& a,
-                                      const Packet32f& b) {
+EIGEN_STRONG_INLINE Packet32f pselect(const Packet32f& mask, const Packet32f& a, const Packet32f& b) {
   HVX_VectorPred pred = Q6_Q_vcmp_eq_VwVw(mask.Get(), Q6_V_vzero());
   return Packet32f::Create(Q6_V_vmux_QVV(pred, b.Get(), a.Get()));
 }
@@ -472,14 +368,10 @@
 template <typename Op>
 EIGEN_STRONG_INLINE float predux_generic(const Packet32f& a, Op op) {
   Packet32f vredux_4 = op(Packet32f::Create(Q6_V_vror_VR(a.Get(), 4)), a);
-  Packet32f vredux_8 =
-      op(Packet32f::Create(Q6_V_vror_VR(vredux_4.Get(), 8)), vredux_4);
-  Packet32f vredux_16 =
-      op(Packet32f::Create(Q6_V_vror_VR(vredux_8.Get(), 16)), vredux_8);
-  Packet32f vredux_32 =
-      op(Packet32f::Create(Q6_V_vror_VR(vredux_16.Get(), 32)), vredux_16);
-  Packet32f vredux_64 =
-      op(Packet32f::Create(Q6_V_vror_VR(vredux_32.Get(), 64)), vredux_32);
+  Packet32f vredux_8 = op(Packet32f::Create(Q6_V_vror_VR(vredux_4.Get(), 8)), vredux_4);
+  Packet32f vredux_16 = op(Packet32f::Create(Q6_V_vror_VR(vredux_8.Get(), 16)), vredux_8);
+  Packet32f vredux_32 = op(Packet32f::Create(Q6_V_vror_VR(vredux_16.Get(), 32)), vredux_16);
+  Packet32f vredux_64 = op(Packet32f::Create(Q6_V_vror_VR(vredux_32.Get(), 64)), vredux_32);
   return pfirst(vredux_64);
 }
 
@@ -498,9 +390,9 @@
   return predux_generic(a, por<Packet32f>) != 0.0f;
 }
 
-static const float index_vsf[32] __attribute__((aligned(128))) = {
-    0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14, 15,
-    16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31};
+static const float index_vsf[32]
+    __attribute__((aligned(128))) = {0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14, 15,
+                                     16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31};
 
 template <>
 EIGEN_STRONG_INLINE Packet32f plset(const float& a) {
@@ -514,30 +406,23 @@
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet32qf pmul<Packet32qf>(const Packet32qf& a,
-                                                const Packet32qf& b) {
+EIGEN_STRONG_INLINE Packet32qf pmul<Packet32qf>(const Packet32qf& a, const Packet32qf& b) {
   return Packet32qf::Create(Q6_Vqf32_vmpy_Vqf32Vqf32(a.Get(), b.Get()));
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet32qf padd<Packet32qf>(const Packet32qf& a,
-                                                const Packet32qf& b) {
+EIGEN_STRONG_INLINE Packet32qf padd<Packet32qf>(const Packet32qf& a, const Packet32qf& b) {
   return Packet32qf::Create(Q6_Vqf32_vadd_Vqf32Vqf32(a.Get(), b.Get()));
 }
 
 // Mixed float32 and qfloat32 operations.
-EIGEN_STRONG_INLINE Packet32qf pmadd_f32_to_qf32(const Packet32f& a,
-                                                 const Packet32f& b,
-                                                 const Packet32qf& c) {
-  return Packet32qf::Create(Q6_Vqf32_vadd_Vqf32Vqf32(
-      Q6_Vqf32_vmpy_VsfVsf(a.Get(), b.Get()), c.Get()));
+EIGEN_STRONG_INLINE Packet32qf pmadd_f32_to_qf32(const Packet32f& a, const Packet32f& b, const Packet32qf& c) {
+  return Packet32qf::Create(Q6_Vqf32_vadd_Vqf32Vqf32(Q6_Vqf32_vmpy_VsfVsf(a.Get(), b.Get()), c.Get()));
 }
 
-EIGEN_STRONG_INLINE Packet32f pmadd_qf32_to_f32(const Packet32qf& a,
-                                                const Packet32f& b,
-                                                const Packet32f& c) {
-  return Packet32f::Create(Q6_Vsf_equals_Vqf32(Q6_Vqf32_vadd_Vqf32Vsf(
-      Q6_Vqf32_vmpy_VsfVsf(Q6_Vsf_equals_Vqf32(a.Get()), b.Get()), c.Get())));
+EIGEN_STRONG_INLINE Packet32f pmadd_qf32_to_f32(const Packet32qf& a, const Packet32f& b, const Packet32f& c) {
+  return Packet32f::Create(Q6_Vsf_equals_Vqf32(
+      Q6_Vqf32_vadd_Vqf32Vsf(Q6_Vqf32_vmpy_VsfVsf(Q6_Vsf_equals_Vqf32(a.Get()), b.Get()), c.Get())));
 }
 
 }  // end namespace internal
diff --git a/Eigen/src/Core/arch/MSA/Complex.h b/Eigen/src/Core/arch/MSA/Complex.h
index b64bd8d..2d2fbbc 100644
--- a/Eigen/src/Core/arch/MSA/Complex.h
+++ b/Eigen/src/Core/arch/MSA/Complex.h
@@ -24,17 +24,13 @@
 
 //---------- float ----------
 struct Packet2cf {
-  EIGEN_STRONG_INLINE Packet2cf() {
-  }
-  EIGEN_STRONG_INLINE explicit Packet2cf(const std::complex<float>& a,
-                                         const std::complex<float>& b) {
-    Packet4f t = { std::real(a), std::imag(a), std::real(b), std::imag(b) };
+  EIGEN_STRONG_INLINE Packet2cf() {}
+  EIGEN_STRONG_INLINE explicit Packet2cf(const std::complex<float>& a, const std::complex<float>& b) {
+    Packet4f t = {std::real(a), std::imag(a), std::real(b), std::imag(b)};
     v = t;
   }
-  EIGEN_STRONG_INLINE explicit Packet2cf(const Packet4f& a) : v(a) {
-  }
-  EIGEN_STRONG_INLINE Packet2cf(const Packet2cf& a) : v(a.v) {
-  }
+  EIGEN_STRONG_INLINE explicit Packet2cf(const Packet4f& a) : v(a) {}
+  EIGEN_STRONG_INLINE Packet2cf(const Packet2cf& a) : v(a.v) {}
   EIGEN_STRONG_INLINE Packet2cf& operator=(const Packet2cf& b) {
     v = b.v;
     return *this;
@@ -61,33 +57,23 @@
     v = padd(v1, v2);
     return *this;
   }
-  EIGEN_STRONG_INLINE Packet2cf operator*(const Packet2cf& b) const {
-    return Packet2cf(*this) *= b;
-  }
+  EIGEN_STRONG_INLINE Packet2cf operator*(const Packet2cf& b) const { return Packet2cf(*this) *= b; }
   EIGEN_STRONG_INLINE Packet2cf& operator+=(const Packet2cf& b) {
     v = padd(v, b.v);
     return *this;
   }
-  EIGEN_STRONG_INLINE Packet2cf operator+(const Packet2cf& b) const {
-    return Packet2cf(*this) += b;
-  }
+  EIGEN_STRONG_INLINE Packet2cf operator+(const Packet2cf& b) const { return Packet2cf(*this) += b; }
   EIGEN_STRONG_INLINE Packet2cf& operator-=(const Packet2cf& b) {
     v = psub(v, b.v);
     return *this;
   }
-  EIGEN_STRONG_INLINE Packet2cf operator-(const Packet2cf& b) const {
-    return Packet2cf(*this) -= b;
-  }
-  EIGEN_STRONG_INLINE Packet2cf operator/(const Packet2cf& b) const {
-    return pdiv_complex(Packet2cf(*this), b);
-  }
+  EIGEN_STRONG_INLINE Packet2cf operator-(const Packet2cf& b) const { return Packet2cf(*this) -= b; }
+  EIGEN_STRONG_INLINE Packet2cf operator/(const Packet2cf& b) const { return pdiv_complex(Packet2cf(*this), b); }
   EIGEN_STRONG_INLINE Packet2cf& operator/=(const Packet2cf& b) {
     *this = Packet2cf(*this) / b;
     return *this;
   }
-  EIGEN_STRONG_INLINE Packet2cf operator-(void) const {
-    return Packet2cf(pnegate(v));
-  }
+  EIGEN_STRONG_INLINE Packet2cf operator-(void) const { return Packet2cf(pnegate(v)); }
 
   Packet4f v;
 };
@@ -126,7 +112,13 @@
 template <>
 struct unpacket_traits<Packet2cf> {
   typedef std::complex<float> type;
-  enum { size = 2, alignment = Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false };
+  enum {
+    size = 2,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
   typedef Packet2cf half;
 };
 
@@ -135,8 +127,8 @@
   EIGEN_MSA_DEBUG;
 
   float f0 = from.real(), f1 = from.imag();
-  Packet4f v0 = { f0, f0, f0, f0 };
-  Packet4f v1 = { f1, f1, f1, f1 };
+  Packet4f v0 = {f0, f0, f0, f0};
+  Packet4f v1 = {f1, f1, f1, f1};
   return Packet2cf((Packet4f)__builtin_msa_ilvr_w((Packet4i)v1, (Packet4i)v0));
 }
 
@@ -225,32 +217,29 @@
 }
 
 template <>
-EIGEN_STRONG_INLINE void pstore<std::complex<float> >(std::complex<float>* to,
-                                                      const Packet2cf& from) {
+EIGEN_STRONG_INLINE void pstore<std::complex<float> >(std::complex<float>* to, const Packet2cf& from) {
   EIGEN_MSA_DEBUG;
 
   EIGEN_DEBUG_ALIGNED_STORE pstore<float>((float*)to, from.v);
 }
 
 template <>
-EIGEN_STRONG_INLINE void pstoreu<std::complex<float> >(std::complex<float>* to,
-                                                       const Packet2cf& from) {
+EIGEN_STRONG_INLINE void pstoreu<std::complex<float> >(std::complex<float>* to, const Packet2cf& from) {
   EIGEN_MSA_DEBUG;
 
   EIGEN_DEBUG_UNALIGNED_STORE pstoreu<float>((float*)to, from.v);
 }
 
 template <>
-EIGEN_DEVICE_FUNC inline Packet2cf pgather<std::complex<float>, Packet2cf>(
-    const std::complex<float>* from, Index stride) {
+EIGEN_DEVICE_FUNC inline Packet2cf pgather<std::complex<float>, Packet2cf>(const std::complex<float>* from,
+                                                                           Index stride) {
   EIGEN_MSA_DEBUG;
 
   return Packet2cf(from[0 * stride], from[1 * stride]);
 }
 
 template <>
-EIGEN_DEVICE_FUNC inline void pscatter<std::complex<float>, Packet2cf>(std::complex<float>* to,
-                                                                       const Packet2cf& from,
+EIGEN_DEVICE_FUNC inline void pscatter<std::complex<float>, Packet2cf>(std::complex<float>* to, const Packet2cf& from,
                                                                        Index stride) {
   EIGEN_MSA_DEBUG;
 
@@ -300,8 +289,7 @@
 EIGEN_STRONG_INLINE std::complex<float> predux_mul<Packet2cf>(const Packet2cf& a) {
   EIGEN_MSA_DEBUG;
 
-  return std::complex<float>((a.v[0] * a.v[2]) - (a.v[1] * a.v[3]),
-                             (a.v[0] * a.v[3]) + (a.v[1] * a.v[2]));
+  return std::complex<float>((a.v[0] * a.v[2]) - (a.v[1] * a.v[3]), (a.v[0] * a.v[3]) + (a.v[1] * a.v[2]));
 }
 
 EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet2cf, Packet4f)
@@ -321,39 +309,33 @@
 EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet2cf, 2>& kernel) {
   EIGEN_MSA_DEBUG;
 
-  Packet4f tmp =
-      (Packet4f)__builtin_msa_ilvl_d((v2i64)kernel.packet[1].v, (v2i64)kernel.packet[0].v);
-  kernel.packet[0].v =
-      (Packet4f)__builtin_msa_ilvr_d((v2i64)kernel.packet[1].v, (v2i64)kernel.packet[0].v);
+  Packet4f tmp = (Packet4f)__builtin_msa_ilvl_d((v2i64)kernel.packet[1].v, (v2i64)kernel.packet[0].v);
+  kernel.packet[0].v = (Packet4f)__builtin_msa_ilvr_d((v2i64)kernel.packet[1].v, (v2i64)kernel.packet[0].v);
   kernel.packet[1].v = tmp;
 }
 
 template <>
 EIGEN_STRONG_INLINE Packet2cf pblend(const Selector<2>& ifPacket, const Packet2cf& thenPacket,
                                      const Packet2cf& elsePacket) {
-  return (Packet2cf)(Packet4f)pblend<Packet2d>(ifPacket, (Packet2d)thenPacket.v,
-                                               (Packet2d)elsePacket.v);
+  return (Packet2cf)(Packet4f)pblend<Packet2d>(ifPacket, (Packet2d)thenPacket.v, (Packet2d)elsePacket.v);
 }
 
 //---------- double ----------
 
 struct Packet1cd {
-  EIGEN_STRONG_INLINE Packet1cd() {
-  }
+  EIGEN_STRONG_INLINE Packet1cd() {}
   EIGEN_STRONG_INLINE explicit Packet1cd(const std::complex<double>& a) {
     v[0] = std::real(a);
     v[1] = std::imag(a);
   }
-  EIGEN_STRONG_INLINE explicit Packet1cd(const Packet2d& a) : v(a) {
-  }
-  EIGEN_STRONG_INLINE Packet1cd(const Packet1cd& a) : v(a.v) {
-  }
+  EIGEN_STRONG_INLINE explicit Packet1cd(const Packet2d& a) : v(a) {}
+  EIGEN_STRONG_INLINE Packet1cd(const Packet1cd& a) : v(a.v) {}
   EIGEN_STRONG_INLINE Packet1cd& operator=(const Packet1cd& b) {
     v = b.v;
     return *this;
   }
   EIGEN_STRONG_INLINE Packet1cd conjugate(void) const {
-    static const v2u64 p2ul_CONJ_XOR = { 0x0, 0x8000000000000000 };
+    static const v2u64 p2ul_CONJ_XOR = {0x0, 0x8000000000000000};
     return (Packet1cd)pxor(v, (Packet2d)p2ul_CONJ_XOR);
   }
   EIGEN_STRONG_INLINE Packet1cd& operator*=(const Packet1cd& b) {
@@ -375,23 +357,17 @@
     v = padd(v1, v2);
     return *this;
   }
-  EIGEN_STRONG_INLINE Packet1cd operator*(const Packet1cd& b) const {
-    return Packet1cd(*this) *= b;
-  }
+  EIGEN_STRONG_INLINE Packet1cd operator*(const Packet1cd& b) const { return Packet1cd(*this) *= b; }
   EIGEN_STRONG_INLINE Packet1cd& operator+=(const Packet1cd& b) {
     v = padd(v, b.v);
     return *this;
   }
-  EIGEN_STRONG_INLINE Packet1cd operator+(const Packet1cd& b) const {
-    return Packet1cd(*this) += b;
-  }
+  EIGEN_STRONG_INLINE Packet1cd operator+(const Packet1cd& b) const { return Packet1cd(*this) += b; }
   EIGEN_STRONG_INLINE Packet1cd& operator-=(const Packet1cd& b) {
     v = psub(v, b.v);
     return *this;
   }
-  EIGEN_STRONG_INLINE Packet1cd operator-(const Packet1cd& b) const {
-    return Packet1cd(*this) -= b;
-  }
+  EIGEN_STRONG_INLINE Packet1cd operator-(const Packet1cd& b) const { return Packet1cd(*this) -= b; }
   EIGEN_STRONG_INLINE Packet1cd& operator/=(const Packet1cd& b) {
     *this *= b.conjugate();
     Packet2d s = pmul<Packet2d>(b.v, b.v);
@@ -399,12 +375,8 @@
     v = pdiv(v, s);
     return *this;
   }
-  EIGEN_STRONG_INLINE Packet1cd operator/(const Packet1cd& b) const {
-    return Packet1cd(*this) /= b;
-  }
-  EIGEN_STRONG_INLINE Packet1cd operator-(void) const {
-    return Packet1cd(pnegate(v));
-  }
+  EIGEN_STRONG_INLINE Packet1cd operator/(const Packet1cd& b) const { return Packet1cd(*this) /= b; }
+  EIGEN_STRONG_INLINE Packet1cd operator-(void) const { return Packet1cd(pnegate(v)); }
 
   Packet2d v;
 };
@@ -439,7 +411,13 @@
 template <>
 struct unpacket_traits<Packet1cd> {
   typedef std::complex<double> type;
-  enum { size = 1, alignment = Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false };
+  enum {
+    size = 1,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
   typedef Packet1cd half;
 };
 
@@ -535,16 +513,14 @@
 }
 
 template <>
-EIGEN_STRONG_INLINE void pstore<std::complex<double> >(std::complex<double>* to,
-                                                       const Packet1cd& from) {
+EIGEN_STRONG_INLINE void pstore<std::complex<double> >(std::complex<double>* to, const Packet1cd& from) {
   EIGEN_MSA_DEBUG;
 
   EIGEN_DEBUG_ALIGNED_STORE pstore<double>((double*)to, from.v);
 }
 
 template <>
-EIGEN_STRONG_INLINE void pstoreu<std::complex<double> >(std::complex<double>* to,
-                                                        const Packet1cd& from) {
+EIGEN_STRONG_INLINE void pstoreu<std::complex<double> >(std::complex<double>* to, const Packet1cd& from) {
   EIGEN_MSA_DEBUG;
 
   EIGEN_DEBUG_UNALIGNED_STORE pstoreu<double>((double*)to, from.v);
@@ -558,8 +534,8 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC inline Packet1cd pgather<std::complex<double>, Packet1cd>(
-    const std::complex<double>* from, Index stride __attribute__((unused))) {
+EIGEN_DEVICE_FUNC inline Packet1cd pgather<std::complex<double>, Packet1cd>(const std::complex<double>* from,
+                                                                            Index stride __attribute__((unused))) {
   EIGEN_MSA_DEBUG;
 
   Packet1cd res;
@@ -569,10 +545,8 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC inline void pscatter<std::complex<double>, Packet1cd>(std::complex<double>* to,
-                                                                        const Packet1cd& from,
-                                                                        Index stride
-                                                                        __attribute__((unused))) {
+EIGEN_DEVICE_FUNC inline void pscatter<std::complex<double>, Packet1cd>(std::complex<double>* to, const Packet1cd& from,
+                                                                        Index stride __attribute__((unused))) {
   EIGEN_MSA_DEBUG;
 
   pstore(to, from);
diff --git a/Eigen/src/Core/arch/MSA/MathFunctions.h b/Eigen/src/Core/arch/MSA/MathFunctions.h
index 3e77329..f68d254 100644
--- a/Eigen/src/Core/arch/MSA/MathFunctions.h
+++ b/Eigen/src/Core/arch/MSA/MathFunctions.h
@@ -34,8 +34,7 @@
 namespace internal {
 
 template <>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet4f
-plog<Packet4f>(const Packet4f& _x) {
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet4f plog<Packet4f>(const Packet4f& _x) {
   static EIGEN_DECLARE_CONST_Packet4f(cephes_SQRTHF, 0.707106781186547524f);
   static EIGEN_DECLARE_CONST_Packet4f(cephes_log_p0, 7.0376836292e-2f);
   static EIGEN_DECLARE_CONST_Packet4f(cephes_log_p1, -1.1514610310e-1f);
@@ -122,8 +121,7 @@
 }
 
 template <>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet4f
-pexp<Packet4f>(const Packet4f& _x) {
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet4f pexp<Packet4f>(const Packet4f& _x) {
   // Limiting single-precision pexp's argument to [-128, +128] lets pexp
   // reach 0 and INFINITY naturally.
   static EIGEN_DECLARE_CONST_Packet4f(exp_lo, -128.0f);
@@ -143,10 +141,8 @@
   Packet4f x = _x;
 
   // Clamp x.
-  x = (Packet4f)__builtin_msa_bsel_v((v16u8)__builtin_msa_fclt_w(x, p4f_exp_lo), (v16u8)x,
-                                     (v16u8)p4f_exp_lo);
-  x = (Packet4f)__builtin_msa_bsel_v((v16u8)__builtin_msa_fclt_w(p4f_exp_hi, x), (v16u8)x,
-                                     (v16u8)p4f_exp_hi);
+  x = (Packet4f)__builtin_msa_bsel_v((v16u8)__builtin_msa_fclt_w(x, p4f_exp_lo), (v16u8)x, (v16u8)p4f_exp_lo);
+  x = (Packet4f)__builtin_msa_bsel_v((v16u8)__builtin_msa_fclt_w(p4f_exp_hi, x), (v16u8)x, (v16u8)p4f_exp_hi);
 
   // Round to nearest integer by adding 0.5 (with x's sign) and truncating.
   Packet4f x2_add = (Packet4f)__builtin_msa_binsli_w((v4u32)p4f_half, (v4u32)x, 0);
@@ -175,8 +171,7 @@
 }
 
 template <>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet4f
-ptanh<Packet4f>(const Packet4f& _x) {
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet4f ptanh<Packet4f>(const Packet4f& _x) {
   static EIGEN_DECLARE_CONST_Packet4f(tanh_tiny, 1e-4f);
   static EIGEN_DECLARE_CONST_Packet4f(tanh_hi, 9.0f);
   // The monomial coefficients of the numerator polynomial (odd).
@@ -198,8 +193,7 @@
 
   // Clamp the inputs to the range [-9, 9] since anything outside
   // this range is -/+1.0f in single-precision.
-  x = (Packet4f)__builtin_msa_bsel_v((v16u8)__builtin_msa_fclt_w(p4f_tanh_hi, x), (v16u8)x,
-                                     (v16u8)p4f_tanh_hi);
+  x = (Packet4f)__builtin_msa_bsel_v((v16u8)__builtin_msa_fclt_w(p4f_tanh_hi, x), (v16u8)x, (v16u8)p4f_tanh_hi);
 
   // Since the polynomials are odd/even, we need x**2.
   Packet4f x2 = pmul(x, x);
@@ -264,7 +258,7 @@
   // x's from odd-numbered octants will translate to octant -1: [-Pi/4, 0].
   // Adjustment for odd-numbered octants: octant = (octant + 1) & (~1).
   Packet4i y_int1 = __builtin_msa_addvi_w(y_int, 1);
-  Packet4i y_int2 = (Packet4i)__builtin_msa_bclri_w((Packet4ui)y_int1, 0); // bclri = bit-clear
+  Packet4i y_int2 = (Packet4i)__builtin_msa_bclri_w((Packet4ui)y_int1, 0);  // bclri = bit-clear
   y = __builtin_msa_ffint_s_w(y_int2);
 
   // Compute the sign to apply to the polynomial.
@@ -308,25 +302,22 @@
 
   // Update the sign.
   sign_mask = pxor(sign_mask, (Packet4i)y);
-  y = (Packet4f)__builtin_msa_binsli_w((v4u32)y, (v4u32)sign_mask, 0); // binsli = bit-insert-left
+  y = (Packet4f)__builtin_msa_binsli_w((v4u32)y, (v4u32)sign_mask, 0);  // binsli = bit-insert-left
   return y;
 }
 
 template <>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet4f
-psin<Packet4f>(const Packet4f& x) {
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet4f psin<Packet4f>(const Packet4f& x) {
   return psincos_inner_msa_float</* sine */ true>(x);
 }
 
 template <>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet4f
-pcos<Packet4f>(const Packet4f& x) {
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet4f pcos<Packet4f>(const Packet4f& x) {
   return psincos_inner_msa_float</* sine */ false>(x);
 }
 
 template <>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet2d
-pexp<Packet2d>(const Packet2d& _x) {
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet2d pexp<Packet2d>(const Packet2d& _x) {
   // Limiting double-precision pexp's argument to [-1024, +1024] lets pexp
   // reach 0 and INFINITY naturally.
   static EIGEN_DECLARE_CONST_Packet2d(exp_lo, -1024.0);
@@ -348,10 +339,8 @@
   Packet2d x = _x;
 
   // Clamp x.
-  x = (Packet2d)__builtin_msa_bsel_v((v16u8)__builtin_msa_fclt_d(x, p2d_exp_lo), (v16u8)x,
-                                     (v16u8)p2d_exp_lo);
-  x = (Packet2d)__builtin_msa_bsel_v((v16u8)__builtin_msa_fclt_d(p2d_exp_hi, x), (v16u8)x,
-                                     (v16u8)p2d_exp_hi);
+  x = (Packet2d)__builtin_msa_bsel_v((v16u8)__builtin_msa_fclt_d(x, p2d_exp_lo), (v16u8)x, (v16u8)p2d_exp_lo);
+  x = (Packet2d)__builtin_msa_bsel_v((v16u8)__builtin_msa_fclt_d(p2d_exp_hi, x), (v16u8)x, (v16u8)p2d_exp_hi);
 
   // Round to nearest integer by adding 0.5 (with x's sign) and truncating.
   Packet2d x2_add = (Packet2d)__builtin_msa_binsli_d((v2u64)p2d_half, (v2u64)x, 0);
diff --git a/Eigen/src/Core/arch/MSA/PacketMath.h b/Eigen/src/Core/arch/MSA/PacketMath.h
index b36f024..c1843c3 100644
--- a/Eigen/src/Core/arch/MSA/PacketMath.h
+++ b/Eigen/src/Core/arch/MSA/PacketMath.h
@@ -54,9 +54,9 @@
 typedef v4i32 Packet4i;
 typedef v4u32 Packet4ui;
 
-#define EIGEN_DECLARE_CONST_Packet4f(NAME, X) const Packet4f p4f_##NAME = { X, X, X, X }
-#define EIGEN_DECLARE_CONST_Packet4i(NAME, X) const Packet4i p4i_##NAME = { X, X, X, X }
-#define EIGEN_DECLARE_CONST_Packet4ui(NAME, X) const Packet4ui p4ui_##NAME = { X, X, X, X }
+#define EIGEN_DECLARE_CONST_Packet4f(NAME, X) const Packet4f p4f_##NAME = {X, X, X, X}
+#define EIGEN_DECLARE_CONST_Packet4i(NAME, X) const Packet4i p4i_##NAME = {X, X, X, X}
+#define EIGEN_DECLARE_CONST_Packet4ui(NAME, X) const Packet4ui p4ui_##NAME = {X, X, X, X}
 
 inline std::ostream& operator<<(std::ostream& os, const Packet4f& value) {
   os << "[ " << value[0] << ", " << value[1] << ", " << value[2] << ", " << value[3] << " ]";
@@ -115,14 +115,26 @@
 template <>
 struct unpacket_traits<Packet4f> {
   typedef float type;
-  enum { size = 4, alignment = Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false };
+  enum {
+    size = 4,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
   typedef Packet4f half;
 };
 
 template <>
 struct unpacket_traits<Packet4i> {
   typedef int32_t type;
-  enum { size = 4, alignment = Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false };
+  enum {
+    size = 4,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
   typedef Packet4i half;
 };
 
@@ -130,7 +142,7 @@
 EIGEN_STRONG_INLINE Packet4f pset1<Packet4f>(const float& from) {
   EIGEN_MSA_DEBUG;
 
-  Packet4f v = { from, from, from, from };
+  Packet4f v = {from, from, from, from};
   return v;
 }
 
@@ -146,7 +158,7 @@
   EIGEN_MSA_DEBUG;
 
   float f = *from;
-  Packet4f v = { f, f, f, f };
+  Packet4f v = {f, f, f, f};
   return v;
 }
 
@@ -175,7 +187,7 @@
 EIGEN_STRONG_INLINE Packet4f plset<Packet4f>(const float& a) {
   EIGEN_MSA_DEBUG;
 
-  static const Packet4f countdown = { 0.0f, 1.0f, 2.0f, 3.0f };
+  static const Packet4f countdown = {0.0f, 1.0f, 2.0f, 3.0f};
   return padd(pset1<Packet4f>(a), countdown);
 }
 
@@ -183,7 +195,7 @@
 EIGEN_STRONG_INLINE Packet4i plset<Packet4i>(const int32_t& a) {
   EIGEN_MSA_DEBUG;
 
-  static const Packet4i countdown = { 0, 1, 2, 3 };
+  static const Packet4i countdown = {0, 1, 2, 3};
   return padd(pset1<Packet4i>(a), countdown);
 }
 
@@ -411,8 +423,8 @@
   EIGEN_MSA_DEBUG;
 
   float f0 = from[0], f1 = from[1];
-  Packet4f v0 = { f0, f0, f0, f0 };
-  Packet4f v1 = { f1, f1, f1, f1 };
+  Packet4f v0 = {f0, f0, f0, f0};
+  Packet4f v1 = {f1, f1, f1, f1};
   return (Packet4f)__builtin_msa_ilvr_d((v2i64)v1, (v2i64)v0);
 }
 
@@ -421,8 +433,8 @@
   EIGEN_MSA_DEBUG;
 
   int32_t i0 = from[0], i1 = from[1];
-  Packet4i v0 = { i0, i0, i0, i0 };
-  Packet4i v1 = { i1, i1, i1, i1 };
+  Packet4i v0 = {i0, i0, i0, i0};
+  Packet4i v1 = {i1, i1, i1, i1};
   return (Packet4i)__builtin_msa_ilvr_d((v2i64)v1, (v2i64)v0);
 }
 
@@ -459,7 +471,7 @@
   EIGEN_MSA_DEBUG;
 
   float f = *from;
-  Packet4f v = { f, f, f, f };
+  Packet4f v = {f, f, f, f};
   v[1] = from[stride];
   v[2] = from[2 * stride];
   v[3] = from[3 * stride];
@@ -471,7 +483,7 @@
   EIGEN_MSA_DEBUG;
 
   int32_t i = *from;
-  Packet4i v = { i, i, i, i };
+  Packet4i v = {i, i, i, i};
   v[1] = from[stride];
   v[2] = from[2 * stride];
   v[3] = from[3 * stride];
@@ -479,8 +491,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC inline void pscatter<float, Packet4f>(float* to, const Packet4f& from,
-                                                        Index stride) {
+EIGEN_DEVICE_FUNC inline void pscatter<float, Packet4f>(float* to, const Packet4f& from, Index stride) {
   EIGEN_MSA_DEBUG;
 
   *to = from[0];
@@ -493,8 +504,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC inline void pscatter<int32_t, Packet4i>(int32_t* to, const Packet4i& from,
-                                                          Index stride) {
+EIGEN_DEVICE_FUNC inline void pscatter<int32_t, Packet4i>(int32_t* to, const Packet4i& from, Index stride) {
   EIGEN_MSA_DEBUG;
 
   *to = from[0];
@@ -572,7 +582,6 @@
   return s[0];
 }
 
-
 template <>
 EIGEN_STRONG_INLINE int32_t predux<Packet4i>(const Packet4i& a) {
   EIGEN_MSA_DEBUG;
@@ -618,8 +627,7 @@
 #endif
   // Continue with min computation.
   Packet4f v = __builtin_msa_fmin_w(a, swapped);
-  v = __builtin_msa_fmin_w(
-      v, (Packet4f)__builtin_msa_shf_w((Packet4i)v, EIGEN_MSA_SHF_I8(1, 0, 3, 2)));
+  v = __builtin_msa_fmin_w(v, (Packet4f)__builtin_msa_shf_w((Packet4i)v, EIGEN_MSA_SHF_I8(1, 0, 3, 2)));
 #if !EIGEN_FAST_MATH
   // Based on the mask select between v and 4 qNaNs.
   v16u8 qnans = (v16u8)__builtin_msa_fill_w(0x7FC00000);
@@ -653,8 +661,7 @@
 #endif
   // Continue with max computation.
   Packet4f v = __builtin_msa_fmax_w(a, swapped);
-  v = __builtin_msa_fmax_w(
-      v, (Packet4f)__builtin_msa_shf_w((Packet4i)v, EIGEN_MSA_SHF_I8(1, 0, 3, 2)));
+  v = __builtin_msa_fmax_w(v, (Packet4f)__builtin_msa_shf_w((Packet4i)v, EIGEN_MSA_SHF_I8(1, 0, 3, 2)));
 #if !EIGEN_FAST_MATH
   // Based on the mask select between v and 4 qNaNs.
   v16u8 qnans = (v16u8)__builtin_msa_fill_w(0x7FC00000);
@@ -801,8 +808,7 @@
 template <>
 EIGEN_STRONG_INLINE Packet4f pblend(const Selector<4>& ifPacket, const Packet4f& thenPacket,
                                     const Packet4f& elsePacket) {
-  Packet4ui select = { ifPacket.select[0], ifPacket.select[1], ifPacket.select[2],
-                       ifPacket.select[3] };
+  Packet4ui select = {ifPacket.select[0], ifPacket.select[1], ifPacket.select[2], ifPacket.select[3]};
   Packet4i mask = __builtin_msa_ceqi_w((Packet4i)select, 0);
   return (Packet4f)__builtin_msa_bsel_v((v16u8)mask, (v16u8)thenPacket, (v16u8)elsePacket);
 }
@@ -810,8 +816,7 @@
 template <>
 EIGEN_STRONG_INLINE Packet4i pblend(const Selector<4>& ifPacket, const Packet4i& thenPacket,
                                     const Packet4i& elsePacket) {
-  Packet4ui select = { ifPacket.select[0], ifPacket.select[1], ifPacket.select[2],
-                       ifPacket.select[3] };
+  Packet4ui select = {ifPacket.select[0], ifPacket.select[1], ifPacket.select[2], ifPacket.select[3]};
   Packet4i mask = __builtin_msa_ceqi_w((Packet4i)select, 0);
   return (Packet4i)__builtin_msa_bsel_v((v16u8)mask, (v16u8)thenPacket, (v16u8)elsePacket);
 }
@@ -822,9 +827,9 @@
 typedef v2i64 Packet2l;
 typedef v2u64 Packet2ul;
 
-#define EIGEN_DECLARE_CONST_Packet2d(NAME, X) const Packet2d p2d_##NAME = { X, X }
-#define EIGEN_DECLARE_CONST_Packet2l(NAME, X) const Packet2l p2l_##NAME = { X, X }
-#define EIGEN_DECLARE_CONST_Packet2ul(NAME, X) const Packet2ul p2ul_##NAME = { X, X }
+#define EIGEN_DECLARE_CONST_Packet2d(NAME, X) const Packet2d p2d_##NAME = {X, X}
+#define EIGEN_DECLARE_CONST_Packet2l(NAME, X) const Packet2l p2l_##NAME = {X, X}
+#define EIGEN_DECLARE_CONST_Packet2ul(NAME, X) const Packet2ul p2ul_##NAME = {X, X}
 
 inline std::ostream& operator<<(std::ostream& os, const Packet2d& value) {
   os << "[ " << value[0] << ", " << value[1] << " ]";
@@ -864,7 +869,13 @@
 template <>
 struct unpacket_traits<Packet2d> {
   typedef double type;
-  enum { size = 2, alignment = Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false };
+  enum {
+    size = 2,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
   typedef Packet2d half;
 };
 
@@ -872,7 +883,7 @@
 EIGEN_STRONG_INLINE Packet2d pset1<Packet2d>(const double& from) {
   EIGEN_MSA_DEBUG;
 
-  Packet2d value = { from, from };
+  Packet2d value = {from, from};
   return value;
 }
 
@@ -887,7 +898,7 @@
 EIGEN_STRONG_INLINE Packet2d plset<Packet2d>(const double& a) {
   EIGEN_MSA_DEBUG;
 
-  static const Packet2d countdown = { 0.0, 1.0 };
+  static const Packet2d countdown = {0.0, 1.0};
   return padd(pset1<Packet2d>(a), countdown);
 }
 
@@ -1011,7 +1022,7 @@
 EIGEN_STRONG_INLINE Packet2d ploaddup<Packet2d>(const double* from) {
   EIGEN_MSA_DEBUG;
 
-  Packet2d value = { *from, *from };
+  Packet2d value = {*from, *from};
   return value;
 }
 
@@ -1041,8 +1052,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC inline void pscatter<double, Packet2d>(double* to, const Packet2d& from,
-                                                         Index stride) {
+EIGEN_DEVICE_FUNC inline void pscatter<double, Packet2d>(double* to, const Packet2d& from, Index stride) {
   EIGEN_MSA_DEBUG;
 
   *to = from[0];
@@ -1221,7 +1231,7 @@
 template <>
 EIGEN_STRONG_INLINE Packet2d pblend(const Selector<2>& ifPacket, const Packet2d& thenPacket,
                                     const Packet2d& elsePacket) {
-  Packet2ul select = { ifPacket.select[0], ifPacket.select[1] };
+  Packet2ul select = {ifPacket.select[0], ifPacket.select[1]};
   Packet2l mask = __builtin_msa_ceqi_d((Packet2l)select, 0);
   return (Packet2d)__builtin_msa_bsel_v((v16u8)mask, (v16u8)thenPacket, (v16u8)elsePacket);
 }
diff --git a/Eigen/src/Core/arch/NEON/Complex.h b/Eigen/src/Core/arch/NEON/Complex.h
index 98b76da..8240847 100644
--- a/Eigen/src/Core/arch/NEON/Complex.h
+++ b/Eigen/src/Core/arch/NEON/Complex.h
@@ -18,70 +18,64 @@
 
 namespace internal {
 
-inline uint32x4_t p4ui_CONJ_XOR()
-{
+inline uint32x4_t p4ui_CONJ_XOR() {
 // See bug 1325, clang fails to call vld1q_u64.
 #if EIGEN_COMP_CLANG || EIGEN_COMP_CASTXML
-  uint32x4_t ret = { 0x00000000, 0x80000000, 0x00000000, 0x80000000 };
+  uint32x4_t ret = {0x00000000, 0x80000000, 0x00000000, 0x80000000};
   return ret;
 #else
-  static const uint32_t conj_XOR_DATA[] = { 0x00000000, 0x80000000, 0x00000000, 0x80000000 };
-  return vld1q_u32( conj_XOR_DATA );
+  static const uint32_t conj_XOR_DATA[] = {0x00000000, 0x80000000, 0x00000000, 0x80000000};
+  return vld1q_u32(conj_XOR_DATA);
 #endif
 }
 
-inline uint32x2_t p2ui_CONJ_XOR()
-{
-  static const uint32_t conj_XOR_DATA[] = { 0x00000000, 0x80000000 };
-  return vld1_u32( conj_XOR_DATA );
+inline uint32x2_t p2ui_CONJ_XOR() {
+  static const uint32_t conj_XOR_DATA[] = {0x00000000, 0x80000000};
+  return vld1_u32(conj_XOR_DATA);
 }
 
 //---------- float ----------
 
-struct Packet1cf
-{
+struct Packet1cf {
   EIGEN_STRONG_INLINE Packet1cf() {}
   EIGEN_STRONG_INLINE explicit Packet1cf(const Packet2f& a) : v(a) {}
   Packet2f v;
 };
-struct Packet2cf
-{
+struct Packet2cf {
   EIGEN_STRONG_INLINE Packet2cf() {}
   EIGEN_STRONG_INLINE explicit Packet2cf(const Packet4f& a) : v(a) {}
   Packet4f v;
 };
 
-template<> struct packet_traits<std::complex<float> > : default_packet_traits
-{
+template <>
+struct packet_traits<std::complex<float> > : default_packet_traits {
   typedef Packet2cf type;
   typedef Packet1cf half;
-  enum
-  {
+  enum {
     Vectorizable = 1,
     AlignedOnScalar = 1,
     size = 2,
 
-    HasAdd       = 1,
-    HasSub       = 1,
-    HasMul       = 1,
-    HasDiv       = 1,
-    HasNegate    = 1,
-    HasSqrt      = 1,
-    HasAbs       = 0,
-    HasAbs2      = 0,
-    HasMin       = 0,
-    HasMax       = 0,
+    HasAdd = 1,
+    HasSub = 1,
+    HasMul = 1,
+    HasDiv = 1,
+    HasNegate = 1,
+    HasSqrt = 1,
+    HasAbs = 0,
+    HasAbs2 = 0,
+    HasMin = 0,
+    HasMax = 0,
     HasSetLinear = 0
   };
 };
 
-template<> struct unpacket_traits<Packet1cf>
-{
+template <>
+struct unpacket_traits<Packet1cf> {
   typedef std::complex<float> type;
   typedef Packet1cf half;
   typedef Packet2f as_real;
-  enum
-  {
+  enum {
     size = 1,
     alignment = Aligned16,
     vectorizable = true,
@@ -89,13 +83,12 @@
     masked_store_available = false
   };
 };
-template<> struct unpacket_traits<Packet2cf>
-{
+template <>
+struct unpacket_traits<Packet2cf> {
   typedef std::complex<float> type;
   typedef Packet1cf half;
   typedef Packet4f as_real;
-  enum
-  {
+  enum {
     size = 2,
     alignment = Aligned16,
     vectorizable = true,
@@ -104,45 +97,65 @@
   };
 };
 
-template<> EIGEN_STRONG_INLINE Packet1cf pcast<float,Packet1cf>(const float& a)
-{ return Packet1cf(vset_lane_f32(a, vdup_n_f32(0.f), 0)); }
-template<> EIGEN_STRONG_INLINE Packet2cf pcast<Packet2f,Packet2cf>(const Packet2f& a)
-{ return Packet2cf(vreinterpretq_f32_u64(vmovl_u32(vreinterpret_u32_f32(a)))); }
+template <>
+EIGEN_STRONG_INLINE Packet1cf pcast<float, Packet1cf>(const float& a) {
+  return Packet1cf(vset_lane_f32(a, vdup_n_f32(0.f), 0));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf pcast<Packet2f, Packet2cf>(const Packet2f& a) {
+  return Packet2cf(vreinterpretq_f32_u64(vmovl_u32(vreinterpret_u32_f32(a))));
+}
 
-template<> EIGEN_STRONG_INLINE Packet1cf pset1<Packet1cf>(const std::complex<float>& from)
-{ return Packet1cf(vld1_f32(reinterpret_cast<const float*>(&from))); }
-template<> EIGEN_STRONG_INLINE Packet2cf pset1<Packet2cf>(const std::complex<float>& from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet1cf pset1<Packet1cf>(const std::complex<float>& from) {
+  return Packet1cf(vld1_f32(reinterpret_cast<const float*>(&from)));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf pset1<Packet2cf>(const std::complex<float>& from) {
   const float32x2_t r64 = vld1_f32(reinterpret_cast<const float*>(&from));
   return Packet2cf(vcombine_f32(r64, r64));
 }
 
-template<> EIGEN_STRONG_INLINE Packet1cf padd<Packet1cf>(const Packet1cf& a, const Packet1cf& b)
-{ return Packet1cf(padd<Packet2f>(a.v, b.v)); }
-template<> EIGEN_STRONG_INLINE Packet2cf padd<Packet2cf>(const Packet2cf& a, const Packet2cf& b)
-{ return Packet2cf(padd<Packet4f>(a.v, b.v)); }
+template <>
+EIGEN_STRONG_INLINE Packet1cf padd<Packet1cf>(const Packet1cf& a, const Packet1cf& b) {
+  return Packet1cf(padd<Packet2f>(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf padd<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
+  return Packet2cf(padd<Packet4f>(a.v, b.v));
+}
 
-template<> EIGEN_STRONG_INLINE Packet1cf psub<Packet1cf>(const Packet1cf& a, const Packet1cf& b)
-{ return Packet1cf(psub<Packet2f>(a.v, b.v)); }
-template<> EIGEN_STRONG_INLINE Packet2cf psub<Packet2cf>(const Packet2cf& a, const Packet2cf& b)
-{ return Packet2cf(psub<Packet4f>(a.v, b.v)); }
+template <>
+EIGEN_STRONG_INLINE Packet1cf psub<Packet1cf>(const Packet1cf& a, const Packet1cf& b) {
+  return Packet1cf(psub<Packet2f>(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf psub<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
+  return Packet2cf(psub<Packet4f>(a.v, b.v));
+}
 
-template<> EIGEN_STRONG_INLINE Packet1cf pnegate(const Packet1cf& a) { return Packet1cf(pnegate<Packet2f>(a.v)); }
-template<> EIGEN_STRONG_INLINE Packet2cf pnegate(const Packet2cf& a) { return Packet2cf(pnegate<Packet4f>(a.v)); }
+template <>
+EIGEN_STRONG_INLINE Packet1cf pnegate(const Packet1cf& a) {
+  return Packet1cf(pnegate<Packet2f>(a.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf pnegate(const Packet2cf& a) {
+  return Packet2cf(pnegate<Packet4f>(a.v));
+}
 
-template<> EIGEN_STRONG_INLINE Packet1cf pconj(const Packet1cf& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet1cf pconj(const Packet1cf& a) {
   const Packet2ui b = Packet2ui(vreinterpret_u32_f32(a.v));
   return Packet1cf(vreinterpret_f32_u32(veor_u32(b, p2ui_CONJ_XOR())));
 }
-template<> EIGEN_STRONG_INLINE Packet2cf pconj(const Packet2cf& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2cf pconj(const Packet2cf& a) {
   const Packet4ui b = Packet4ui(vreinterpretq_u32_f32(a.v));
   return Packet2cf(vreinterpretq_f32_u32(veorq_u32(b, p4ui_CONJ_XOR())));
 }
 
-template<> EIGEN_STRONG_INLINE Packet1cf pmul<Packet1cf>(const Packet1cf& a, const Packet1cf& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet1cf pmul<Packet1cf>(const Packet1cf& a, const Packet1cf& b) {
   Packet2f v1, v2;
 
   // Get the real values of a | a1_re | a1_re |
@@ -160,8 +173,8 @@
   // Add and return the result
   return Packet1cf(vadd_f32(v1, v2));
 }
-template<> EIGEN_STRONG_INLINE Packet2cf pmul<Packet2cf>(const Packet2cf& a, const Packet2cf& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2cf pmul<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
   Packet4f v1, v2;
 
   // Get the real values of a | a1_re | a1_re | a2_re | a2_re |
@@ -180,8 +193,8 @@
   return Packet2cf(vaddq_f32(v1, v2));
 }
 
-template<> EIGEN_STRONG_INLINE Packet1cf pcmp_eq(const Packet1cf& a, const Packet1cf& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet1cf pcmp_eq(const Packet1cf& a, const Packet1cf& b) {
   // Compare real and imaginary parts of a and b to get the mask vector:
   // [re(a[0])==re(b[0]), im(a[0])==im(b[0])]
   Packet2f eq = pcmp_eq<Packet2f>(a.v, b.v);
@@ -191,8 +204,8 @@
   // Return re(a)==re(b) && im(a)==im(b) by computing bitwise AND of eq and eq_swapped
   return Packet1cf(pand<Packet2f>(eq, eq_swapped));
 }
-template<> EIGEN_STRONG_INLINE Packet2cf pcmp_eq(const Packet2cf& a, const Packet2cf& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2cf pcmp_eq(const Packet2cf& a, const Packet2cf& b) {
   // Compare real and imaginary parts of a and b to get the mask vector:
   // [re(a[0])==re(b[0]), im(a[0])==im(b[0]), re(a[1])==re(b[1]), im(a[1])==im(b[1])]
   Packet4f eq = pcmp_eq<Packet4f>(a.v, b.v);
@@ -203,129 +216,178 @@
   return Packet2cf(pand<Packet4f>(eq, eq_swapped));
 }
 
-template<> EIGEN_STRONG_INLINE Packet1cf pand<Packet1cf>(const Packet1cf& a, const Packet1cf& b)
-{ return Packet1cf(vreinterpret_f32_u32(vand_u32(vreinterpret_u32_f32(a.v), vreinterpret_u32_f32(b.v)))); }
-template<> EIGEN_STRONG_INLINE Packet2cf pand<Packet2cf>(const Packet2cf& a, const Packet2cf& b)
-{ return Packet2cf(vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(a.v), vreinterpretq_u32_f32(b.v)))); }
-
-template<> EIGEN_STRONG_INLINE Packet1cf por<Packet1cf>(const Packet1cf& a, const Packet1cf& b)
-{ return Packet1cf(vreinterpret_f32_u32(vorr_u32(vreinterpret_u32_f32(a.v), vreinterpret_u32_f32(b.v)))); }
-template<> EIGEN_STRONG_INLINE Packet2cf por<Packet2cf>(const Packet2cf& a, const Packet2cf& b)
-{ return Packet2cf(vreinterpretq_f32_u32(vorrq_u32(vreinterpretq_u32_f32(a.v), vreinterpretq_u32_f32(b.v)))); }
-
-template<> EIGEN_STRONG_INLINE Packet1cf pxor<Packet1cf>(const Packet1cf& a, const Packet1cf& b)
-{ return Packet1cf(vreinterpret_f32_u32(veor_u32(vreinterpret_u32_f32(a.v), vreinterpret_u32_f32(b.v)))); }
-template<> EIGEN_STRONG_INLINE Packet2cf pxor<Packet2cf>(const Packet2cf& a, const Packet2cf& b)
-{ return Packet2cf(vreinterpretq_f32_u32(veorq_u32(vreinterpretq_u32_f32(a.v), vreinterpretq_u32_f32(b.v)))); }
-
-template<> EIGEN_STRONG_INLINE Packet1cf pandnot<Packet1cf>(const Packet1cf& a, const Packet1cf& b)
-{ return Packet1cf(vreinterpret_f32_u32(vbic_u32(vreinterpret_u32_f32(a.v), vreinterpret_u32_f32(b.v)))); }
-template<> EIGEN_STRONG_INLINE Packet2cf pandnot<Packet2cf>(const Packet2cf& a, const Packet2cf& b)
-{ return Packet2cf(vreinterpretq_f32_u32(vbicq_u32(vreinterpretq_u32_f32(a.v), vreinterpretq_u32_f32(b.v)))); }
-
-template<> EIGEN_STRONG_INLINE Packet1cf pload<Packet1cf>(const std::complex<float>* from)
-{ EIGEN_DEBUG_ALIGNED_LOAD return Packet1cf(pload<Packet2f>((const float*)from)); }
-template<> EIGEN_STRONG_INLINE Packet2cf pload<Packet2cf>(const std::complex<float>* from)
-{ EIGEN_DEBUG_ALIGNED_LOAD return Packet2cf(pload<Packet4f>(reinterpret_cast<const float*>(from))); }
-
-template<> EIGEN_STRONG_INLINE Packet1cf ploadu<Packet1cf>(const std::complex<float>* from)
-{ EIGEN_DEBUG_UNALIGNED_LOAD return Packet1cf(ploadu<Packet2f>((const float*)from)); }
-template<> EIGEN_STRONG_INLINE Packet2cf ploadu<Packet2cf>(const std::complex<float>* from)
-{ EIGEN_DEBUG_UNALIGNED_LOAD return Packet2cf(ploadu<Packet4f>(reinterpret_cast<const float*>(from))); }
-
-template<> EIGEN_STRONG_INLINE Packet1cf ploaddup<Packet1cf>(const std::complex<float>* from)
-{ return pset1<Packet1cf>(*from); }
-template<> EIGEN_STRONG_INLINE Packet2cf ploaddup<Packet2cf>(const std::complex<float>* from)
-{ return pset1<Packet2cf>(*from); }
-
-template<> EIGEN_STRONG_INLINE void pstore <std::complex<float> >(std::complex<float> *to, const Packet1cf& from)
-{ EIGEN_DEBUG_ALIGNED_STORE pstore((float*)to, from.v); }
-template<> EIGEN_STRONG_INLINE void pstore <std::complex<float> >(std::complex<float> *to, const Packet2cf& from)
-{ EIGEN_DEBUG_ALIGNED_STORE pstore(reinterpret_cast<float*>(to), from.v); }
-
-template<> EIGEN_STRONG_INLINE void pstoreu<std::complex<float> >(std::complex<float> *to, const Packet1cf& from)
-{ EIGEN_DEBUG_UNALIGNED_STORE pstoreu((float*)to, from.v); }
-template<> EIGEN_STRONG_INLINE void pstoreu<std::complex<float> >(std::complex<float> *to, const Packet2cf& from)
-{ EIGEN_DEBUG_UNALIGNED_STORE pstoreu(reinterpret_cast<float*>(to), from.v); }
-
-template<> EIGEN_DEVICE_FUNC inline Packet1cf pgather<std::complex<float>, Packet1cf>(
-    const std::complex<float>* from, Index stride)
-{
-  const Packet2f tmp = vdup_n_f32(std::real(from[0*stride]));
-  return Packet1cf(vset_lane_f32(std::imag(from[0*stride]), tmp, 1));
+template <>
+EIGEN_STRONG_INLINE Packet1cf pand<Packet1cf>(const Packet1cf& a, const Packet1cf& b) {
+  return Packet1cf(vreinterpret_f32_u32(vand_u32(vreinterpret_u32_f32(a.v), vreinterpret_u32_f32(b.v))));
 }
-template<> EIGEN_DEVICE_FUNC inline Packet2cf pgather<std::complex<float>, Packet2cf>(
-    const std::complex<float>* from, Index stride)
-{
-  Packet4f res = vdupq_n_f32(std::real(from[0*stride]));
-  res = vsetq_lane_f32(std::imag(from[0*stride]), res, 1);
-  res = vsetq_lane_f32(std::real(from[1*stride]), res, 2);
-  res = vsetq_lane_f32(std::imag(from[1*stride]), res, 3);
+template <>
+EIGEN_STRONG_INLINE Packet2cf pand<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
+  return Packet2cf(vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(a.v), vreinterpretq_u32_f32(b.v))));
+}
+
+template <>
+EIGEN_STRONG_INLINE Packet1cf por<Packet1cf>(const Packet1cf& a, const Packet1cf& b) {
+  return Packet1cf(vreinterpret_f32_u32(vorr_u32(vreinterpret_u32_f32(a.v), vreinterpret_u32_f32(b.v))));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf por<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
+  return Packet2cf(vreinterpretq_f32_u32(vorrq_u32(vreinterpretq_u32_f32(a.v), vreinterpretq_u32_f32(b.v))));
+}
+
+template <>
+EIGEN_STRONG_INLINE Packet1cf pxor<Packet1cf>(const Packet1cf& a, const Packet1cf& b) {
+  return Packet1cf(vreinterpret_f32_u32(veor_u32(vreinterpret_u32_f32(a.v), vreinterpret_u32_f32(b.v))));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf pxor<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
+  return Packet2cf(vreinterpretq_f32_u32(veorq_u32(vreinterpretq_u32_f32(a.v), vreinterpretq_u32_f32(b.v))));
+}
+
+template <>
+EIGEN_STRONG_INLINE Packet1cf pandnot<Packet1cf>(const Packet1cf& a, const Packet1cf& b) {
+  return Packet1cf(vreinterpret_f32_u32(vbic_u32(vreinterpret_u32_f32(a.v), vreinterpret_u32_f32(b.v))));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf pandnot<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
+  return Packet2cf(vreinterpretq_f32_u32(vbicq_u32(vreinterpretq_u32_f32(a.v), vreinterpretq_u32_f32(b.v))));
+}
+
+template <>
+EIGEN_STRONG_INLINE Packet1cf pload<Packet1cf>(const std::complex<float>* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return Packet1cf(pload<Packet2f>((const float*)from));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf pload<Packet2cf>(const std::complex<float>* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return Packet2cf(pload<Packet4f>(reinterpret_cast<const float*>(from)));
+}
+
+template <>
+EIGEN_STRONG_INLINE Packet1cf ploadu<Packet1cf>(const std::complex<float>* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return Packet1cf(ploadu<Packet2f>((const float*)from));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf ploadu<Packet2cf>(const std::complex<float>* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return Packet2cf(ploadu<Packet4f>(reinterpret_cast<const float*>(from)));
+}
+
+template <>
+EIGEN_STRONG_INLINE Packet1cf ploaddup<Packet1cf>(const std::complex<float>* from) {
+  return pset1<Packet1cf>(*from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf ploaddup<Packet2cf>(const std::complex<float>* from) {
+  return pset1<Packet2cf>(*from);
+}
+
+template <>
+EIGEN_STRONG_INLINE void pstore<std::complex<float> >(std::complex<float>* to, const Packet1cf& from) {
+  EIGEN_DEBUG_ALIGNED_STORE pstore((float*)to, from.v);
+}
+template <>
+EIGEN_STRONG_INLINE void pstore<std::complex<float> >(std::complex<float>* to, const Packet2cf& from) {
+  EIGEN_DEBUG_ALIGNED_STORE pstore(reinterpret_cast<float*>(to), from.v);
+}
+
+template <>
+EIGEN_STRONG_INLINE void pstoreu<std::complex<float> >(std::complex<float>* to, const Packet1cf& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE pstoreu((float*)to, from.v);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<std::complex<float> >(std::complex<float>* to, const Packet2cf& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE pstoreu(reinterpret_cast<float*>(to), from.v);
+}
+
+template <>
+EIGEN_DEVICE_FUNC inline Packet1cf pgather<std::complex<float>, Packet1cf>(const std::complex<float>* from,
+                                                                           Index stride) {
+  const Packet2f tmp = vdup_n_f32(std::real(from[0 * stride]));
+  return Packet1cf(vset_lane_f32(std::imag(from[0 * stride]), tmp, 1));
+}
+template <>
+EIGEN_DEVICE_FUNC inline Packet2cf pgather<std::complex<float>, Packet2cf>(const std::complex<float>* from,
+                                                                           Index stride) {
+  Packet4f res = vdupq_n_f32(std::real(from[0 * stride]));
+  res = vsetq_lane_f32(std::imag(from[0 * stride]), res, 1);
+  res = vsetq_lane_f32(std::real(from[1 * stride]), res, 2);
+  res = vsetq_lane_f32(std::imag(from[1 * stride]), res, 3);
   return Packet2cf(res);
 }
 
-template<> EIGEN_DEVICE_FUNC inline void pscatter<std::complex<float>, Packet1cf>(
-    std::complex<float>* to, const Packet1cf& from, Index stride)
-{ to[stride*0] = std::complex<float>(vget_lane_f32(from.v, 0), vget_lane_f32(from.v, 1)); }
-template<> EIGEN_DEVICE_FUNC inline void pscatter<std::complex<float>, Packet2cf>(
-    std::complex<float>* to, const Packet2cf& from, Index stride)
-{
-  to[stride*0] = std::complex<float>(vgetq_lane_f32(from.v, 0), vgetq_lane_f32(from.v, 1));
-  to[stride*1] = std::complex<float>(vgetq_lane_f32(from.v, 2), vgetq_lane_f32(from.v, 3));
+template <>
+EIGEN_DEVICE_FUNC inline void pscatter<std::complex<float>, Packet1cf>(std::complex<float>* to, const Packet1cf& from,
+                                                                       Index stride) {
+  to[stride * 0] = std::complex<float>(vget_lane_f32(from.v, 0), vget_lane_f32(from.v, 1));
+}
+template <>
+EIGEN_DEVICE_FUNC inline void pscatter<std::complex<float>, Packet2cf>(std::complex<float>* to, const Packet2cf& from,
+                                                                       Index stride) {
+  to[stride * 0] = std::complex<float>(vgetq_lane_f32(from.v, 0), vgetq_lane_f32(from.v, 1));
+  to[stride * 1] = std::complex<float>(vgetq_lane_f32(from.v, 2), vgetq_lane_f32(from.v, 3));
 }
 
-template<> EIGEN_STRONG_INLINE void prefetch<std::complex<float> >(const std::complex<float> *addr)
-{ EIGEN_ARM_PREFETCH(reinterpret_cast<const float*>(addr)); }
+template <>
+EIGEN_STRONG_INLINE void prefetch<std::complex<float> >(const std::complex<float>* addr) {
+  EIGEN_ARM_PREFETCH(reinterpret_cast<const float*>(addr));
+}
 
-template<> EIGEN_STRONG_INLINE std::complex<float> pfirst<Packet1cf>(const Packet1cf& a)
-{
+template <>
+EIGEN_STRONG_INLINE std::complex<float> pfirst<Packet1cf>(const Packet1cf& a) {
   EIGEN_ALIGN16 std::complex<float> x;
   vst1_f32(reinterpret_cast<float*>(&x), a.v);
   return x;
 }
-template<> EIGEN_STRONG_INLINE std::complex<float> pfirst<Packet2cf>(const Packet2cf& a)
-{
+template <>
+EIGEN_STRONG_INLINE std::complex<float> pfirst<Packet2cf>(const Packet2cf& a) {
   EIGEN_ALIGN16 std::complex<float> x[2];
   vst1q_f32(reinterpret_cast<float*>(x), a.v);
   return x[0];
 }
 
-template<> EIGEN_STRONG_INLINE Packet1cf preverse(const Packet1cf& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet2cf preverse(const Packet2cf& a)
-{ return Packet2cf(vcombine_f32(vget_high_f32(a.v), vget_low_f32(a.v))); }
+template <>
+EIGEN_STRONG_INLINE Packet1cf preverse(const Packet1cf& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf preverse(const Packet2cf& a) {
+  return Packet2cf(vcombine_f32(vget_high_f32(a.v), vget_low_f32(a.v)));
+}
 
-template<> EIGEN_STRONG_INLINE Packet1cf pcplxflip<Packet1cf>(const Packet1cf& a)
-{ return Packet1cf(vrev64_f32(a.v)); }
-template<> EIGEN_STRONG_INLINE Packet2cf pcplxflip<Packet2cf>(const Packet2cf& a)
-{ return Packet2cf(vrev64q_f32(a.v)); }
+template <>
+EIGEN_STRONG_INLINE Packet1cf pcplxflip<Packet1cf>(const Packet1cf& a) {
+  return Packet1cf(vrev64_f32(a.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf pcplxflip<Packet2cf>(const Packet2cf& a) {
+  return Packet2cf(vrev64q_f32(a.v));
+}
 
-template<> EIGEN_STRONG_INLINE std::complex<float> predux<Packet1cf>(const Packet1cf& a)
-{
+template <>
+EIGEN_STRONG_INLINE std::complex<float> predux<Packet1cf>(const Packet1cf& a) {
   std::complex<float> s;
-  vst1_f32((float *)&s, a.v);
+  vst1_f32((float*)&s, a.v);
   return s;
 }
-template<> EIGEN_STRONG_INLINE std::complex<float> predux<Packet2cf>(const Packet2cf& a)
-{
+template <>
+EIGEN_STRONG_INLINE std::complex<float> predux<Packet2cf>(const Packet2cf& a) {
   std::complex<float> s;
   vst1_f32(reinterpret_cast<float*>(&s), vadd_f32(vget_low_f32(a.v), vget_high_f32(a.v)));
   return s;
 }
 
-template<> EIGEN_STRONG_INLINE std::complex<float> predux_mul<Packet1cf>(const Packet1cf& a)
-{
+template <>
+EIGEN_STRONG_INLINE std::complex<float> predux_mul<Packet1cf>(const Packet1cf& a) {
   std::complex<float> s;
-  vst1_f32((float *)&s, a.v);
+  vst1_f32((float*)&s, a.v);
   return s;
 }
-template<> EIGEN_STRONG_INLINE std::complex<float> predux_mul<Packet2cf>(const Packet2cf& a)
-{
+template <>
+EIGEN_STRONG_INLINE std::complex<float> predux_mul<Packet2cf>(const Packet2cf& a) {
   float32x2_t a1, a2, v1, v2, prod;
   std::complex<float> s;
 
   a1 = vget_low_f32(a.v);
   a2 = vget_high_f32(a.v);
-   // Get the real values of a | a1_re | a1_re | a2_re | a2_re |
+  // Get the real values of a | a1_re | a1_re | a2_re | a2_re |
   v1 = vdup_lane_f32(a1, 0);
   // Get the real values of a | a1_im | a1_im | a2_im | a2_im |
   v2 = vdup_lane_f32(a1, 1);
@@ -345,31 +407,32 @@
   return s;
 }
 
-EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet1cf,Packet2f)
-EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet2cf,Packet4f)
+EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet1cf, Packet2f)
+EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet2cf, Packet4f)
 
-template<> EIGEN_STRONG_INLINE Packet1cf pdiv<Packet1cf>(const Packet1cf& a, const Packet1cf& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet1cf pdiv<Packet1cf>(const Packet1cf& a, const Packet1cf& b) {
   return pdiv_complex(a, b);
 }
-template<> EIGEN_STRONG_INLINE Packet2cf pdiv<Packet2cf>(const Packet2cf& a, const Packet2cf& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2cf pdiv<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
   return pdiv_complex(a, b);
 }
 
 EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet1cf, 1>& /*kernel*/) {}
-EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet2cf, 2>& kernel)
-{
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet2cf, 2>& kernel) {
   Packet4f tmp = vcombine_f32(vget_high_f32(kernel.packet[0].v), vget_high_f32(kernel.packet[1].v));
   kernel.packet[0].v = vcombine_f32(vget_low_f32(kernel.packet[0].v), vget_low_f32(kernel.packet[1].v));
   kernel.packet[1].v = tmp;
 }
 
-template<> EIGEN_STRONG_INLINE Packet1cf psqrt<Packet1cf>(const Packet1cf& a) {
+template <>
+EIGEN_STRONG_INLINE Packet1cf psqrt<Packet1cf>(const Packet1cf& a) {
   return psqrt_complex<Packet1cf>(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2cf psqrt<Packet2cf>(const Packet2cf& a) {
+template <>
+EIGEN_STRONG_INLINE Packet2cf psqrt<Packet2cf>(const Packet2cf& a) {
   return psqrt_complex<Packet2cf>(a);
 }
 
@@ -378,84 +441,93 @@
 
 // See bug 1325, clang fails to call vld1q_u64.
 #if EIGEN_COMP_CLANG || EIGEN_COMP_CASTXML || EIGEN_COMP_CPE
-  static uint64x2_t p2ul_CONJ_XOR = {0x0, 0x8000000000000000};
+static uint64x2_t p2ul_CONJ_XOR = {0x0, 0x8000000000000000};
 #else
-  const uint64_t  p2ul_conj_XOR_DATA[] = { 0x0, 0x8000000000000000 };
-  static uint64x2_t p2ul_CONJ_XOR = vld1q_u64( p2ul_conj_XOR_DATA );
+const uint64_t p2ul_conj_XOR_DATA[] = {0x0, 0x8000000000000000};
+static uint64x2_t p2ul_CONJ_XOR = vld1q_u64(p2ul_conj_XOR_DATA);
 #endif
 
-struct Packet1cd
-{
+struct Packet1cd {
   EIGEN_STRONG_INLINE Packet1cd() {}
   EIGEN_STRONG_INLINE explicit Packet1cd(const Packet2d& a) : v(a) {}
   Packet2d v;
 };
 
-template<> struct packet_traits<std::complex<double> >  : default_packet_traits
-{
+template <>
+struct packet_traits<std::complex<double> > : default_packet_traits {
   typedef Packet1cd type;
   typedef Packet1cd half;
-  enum
-  {
+  enum {
     Vectorizable = 1,
     AlignedOnScalar = 0,
     size = 1,
 
-    HasAdd    = 1,
-    HasSub    = 1,
-    HasMul    = 1,
-    HasDiv    = 1,
+    HasAdd = 1,
+    HasSub = 1,
+    HasMul = 1,
+    HasDiv = 1,
     HasNegate = 1,
-    HasSqrt   = 1,
-    HasAbs    = 0,
-    HasAbs2   = 0,
-    HasMin    = 0,
-    HasMax    = 0,
+    HasSqrt = 1,
+    HasAbs = 0,
+    HasAbs2 = 0,
+    HasMin = 0,
+    HasMax = 0,
     HasSetLinear = 0
   };
 };
 
-template<> struct unpacket_traits<Packet1cd>
-{
+template <>
+struct unpacket_traits<Packet1cd> {
   typedef std::complex<double> type;
   typedef Packet1cd half;
   typedef Packet2d as_real;
-  enum
-  {
-    size=1,
-    alignment=Aligned16,
-    vectorizable=true,
-    masked_load_available=false,
-    masked_store_available=false
+  enum {
+    size = 1,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
   };
 };
 
-template<> EIGEN_STRONG_INLINE Packet1cd pload<Packet1cd>(const std::complex<double>* from)
-{ EIGEN_DEBUG_ALIGNED_LOAD return Packet1cd(pload<Packet2d>(reinterpret_cast<const double*>(from))); }
+template <>
+EIGEN_STRONG_INLINE Packet1cd pload<Packet1cd>(const std::complex<double>* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return Packet1cd(pload<Packet2d>(reinterpret_cast<const double*>(from)));
+}
 
-template<> EIGEN_STRONG_INLINE Packet1cd ploadu<Packet1cd>(const std::complex<double>* from)
-{ EIGEN_DEBUG_UNALIGNED_LOAD return Packet1cd(ploadu<Packet2d>(reinterpret_cast<const double*>(from))); }
+template <>
+EIGEN_STRONG_INLINE Packet1cd ploadu<Packet1cd>(const std::complex<double>* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return Packet1cd(ploadu<Packet2d>(reinterpret_cast<const double*>(from)));
+}
 
-template<> EIGEN_STRONG_INLINE Packet1cd pset1<Packet1cd>(const std::complex<double>& from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet1cd pset1<Packet1cd>(const std::complex<double>& from) {
   /* here we really have to use unaligned loads :( */
   return ploadu<Packet1cd>(&from);
 }
 
-template<> EIGEN_STRONG_INLINE Packet1cd padd<Packet1cd>(const Packet1cd& a, const Packet1cd& b)
-{ return Packet1cd(padd<Packet2d>(a.v, b.v)); }
+template <>
+EIGEN_STRONG_INLINE Packet1cd padd<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
+  return Packet1cd(padd<Packet2d>(a.v, b.v));
+}
 
-template<> EIGEN_STRONG_INLINE Packet1cd psub<Packet1cd>(const Packet1cd& a, const Packet1cd& b)
-{ return Packet1cd(psub<Packet2d>(a.v, b.v)); }
+template <>
+EIGEN_STRONG_INLINE Packet1cd psub<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
+  return Packet1cd(psub<Packet2d>(a.v, b.v));
+}
 
-template<> EIGEN_STRONG_INLINE Packet1cd pnegate(const Packet1cd& a)
-{ return Packet1cd(pnegate<Packet2d>(a.v)); }
+template <>
+EIGEN_STRONG_INLINE Packet1cd pnegate(const Packet1cd& a) {
+  return Packet1cd(pnegate<Packet2d>(a.v));
+}
 
-template<> EIGEN_STRONG_INLINE Packet1cd pconj(const Packet1cd& a)
-{ return Packet1cd(vreinterpretq_f64_u64(veorq_u64(vreinterpretq_u64_f64(a.v), p2ul_CONJ_XOR))); }
+template <>
+EIGEN_STRONG_INLINE Packet1cd pconj(const Packet1cd& a) {
+  return Packet1cd(vreinterpretq_f64_u64(veorq_u64(vreinterpretq_u64_f64(a.v), p2ul_CONJ_XOR)));
+}
 
-template<> EIGEN_STRONG_INLINE Packet1cd pmul<Packet1cd>(const Packet1cd& a, const Packet1cd& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet1cd pmul<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
   Packet2d v1, v2;
 
   // Get the real values of a
@@ -474,8 +546,8 @@
   return Packet1cd(vaddq_f64(v1, v2));
 }
 
-template<> EIGEN_STRONG_INLINE Packet1cd pcmp_eq(const Packet1cd& a, const Packet1cd& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet1cd pcmp_eq(const Packet1cd& a, const Packet1cd& b) {
   // Compare real and imaginary parts of a and b to get the mask vector:
   // [re(a)==re(b), im(a)==im(b)]
   Packet2d eq = pcmp_eq<Packet2d>(a.v, b.v);
@@ -486,81 +558,109 @@
   return Packet1cd(pand<Packet2d>(eq, eq_swapped));
 }
 
-template<> EIGEN_STRONG_INLINE Packet1cd pand<Packet1cd>(const Packet1cd& a, const Packet1cd& b)
-{ return Packet1cd(vreinterpretq_f64_u64(vandq_u64(vreinterpretq_u64_f64(a.v),vreinterpretq_u64_f64(b.v)))); }
+template <>
+EIGEN_STRONG_INLINE Packet1cd pand<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
+  return Packet1cd(vreinterpretq_f64_u64(vandq_u64(vreinterpretq_u64_f64(a.v), vreinterpretq_u64_f64(b.v))));
+}
 
-template<> EIGEN_STRONG_INLINE Packet1cd por<Packet1cd>(const Packet1cd& a, const Packet1cd& b)
-{ return Packet1cd(vreinterpretq_f64_u64(vorrq_u64(vreinterpretq_u64_f64(a.v),vreinterpretq_u64_f64(b.v)))); }
+template <>
+EIGEN_STRONG_INLINE Packet1cd por<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
+  return Packet1cd(vreinterpretq_f64_u64(vorrq_u64(vreinterpretq_u64_f64(a.v), vreinterpretq_u64_f64(b.v))));
+}
 
-template<> EIGEN_STRONG_INLINE Packet1cd pxor<Packet1cd>(const Packet1cd& a, const Packet1cd& b)
-{ return Packet1cd(vreinterpretq_f64_u64(veorq_u64(vreinterpretq_u64_f64(a.v),vreinterpretq_u64_f64(b.v)))); }
+template <>
+EIGEN_STRONG_INLINE Packet1cd pxor<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
+  return Packet1cd(vreinterpretq_f64_u64(veorq_u64(vreinterpretq_u64_f64(a.v), vreinterpretq_u64_f64(b.v))));
+}
 
-template<> EIGEN_STRONG_INLINE Packet1cd pandnot<Packet1cd>(const Packet1cd& a, const Packet1cd& b)
-{ return Packet1cd(vreinterpretq_f64_u64(vbicq_u64(vreinterpretq_u64_f64(a.v),vreinterpretq_u64_f64(b.v)))); }
+template <>
+EIGEN_STRONG_INLINE Packet1cd pandnot<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
+  return Packet1cd(vreinterpretq_f64_u64(vbicq_u64(vreinterpretq_u64_f64(a.v), vreinterpretq_u64_f64(b.v))));
+}
 
-template<> EIGEN_STRONG_INLINE Packet1cd ploaddup<Packet1cd>(const std::complex<double>* from)
-{ return pset1<Packet1cd>(*from); }
+template <>
+EIGEN_STRONG_INLINE Packet1cd ploaddup<Packet1cd>(const std::complex<double>* from) {
+  return pset1<Packet1cd>(*from);
+}
 
-template<> EIGEN_STRONG_INLINE void pstore <std::complex<double> >(std::complex<double> *to, const Packet1cd& from)
-{ EIGEN_DEBUG_ALIGNED_STORE pstore(reinterpret_cast<double*>(to), from.v); }
+template <>
+EIGEN_STRONG_INLINE void pstore<std::complex<double> >(std::complex<double>* to, const Packet1cd& from) {
+  EIGEN_DEBUG_ALIGNED_STORE pstore(reinterpret_cast<double*>(to), from.v);
+}
 
-template<> EIGEN_STRONG_INLINE void pstoreu<std::complex<double> >(std::complex<double> *to, const Packet1cd& from)
-{ EIGEN_DEBUG_UNALIGNED_STORE pstoreu(reinterpret_cast<double*>(to), from.v); }
+template <>
+EIGEN_STRONG_INLINE void pstoreu<std::complex<double> >(std::complex<double>* to, const Packet1cd& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE pstoreu(reinterpret_cast<double*>(to), from.v);
+}
 
-template<> EIGEN_STRONG_INLINE void prefetch<std::complex<double> >(const std::complex<double> *addr)
-{ EIGEN_ARM_PREFETCH(reinterpret_cast<const double*>(addr)); }
+template <>
+EIGEN_STRONG_INLINE void prefetch<std::complex<double> >(const std::complex<double>* addr) {
+  EIGEN_ARM_PREFETCH(reinterpret_cast<const double*>(addr));
+}
 
-template<> EIGEN_DEVICE_FUNC inline Packet1cd pgather<std::complex<double>, Packet1cd>(
-    const std::complex<double>* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC inline Packet1cd pgather<std::complex<double>, Packet1cd>(const std::complex<double>* from,
+                                                                            Index stride) {
   Packet2d res = pset1<Packet2d>(0.0);
-  res = vsetq_lane_f64(std::real(from[0*stride]), res, 0);
-  res = vsetq_lane_f64(std::imag(from[0*stride]), res, 1);
+  res = vsetq_lane_f64(std::real(from[0 * stride]), res, 0);
+  res = vsetq_lane_f64(std::imag(from[0 * stride]), res, 1);
   return Packet1cd(res);
 }
 
-template<> EIGEN_DEVICE_FUNC inline void pscatter<std::complex<double>, Packet1cd>(
-    std::complex<double>* to, const Packet1cd& from, Index stride)
-{ to[stride*0] = std::complex<double>(vgetq_lane_f64(from.v, 0), vgetq_lane_f64(from.v, 1)); }
+template <>
+EIGEN_DEVICE_FUNC inline void pscatter<std::complex<double>, Packet1cd>(std::complex<double>* to, const Packet1cd& from,
+                                                                        Index stride) {
+  to[stride * 0] = std::complex<double>(vgetq_lane_f64(from.v, 0), vgetq_lane_f64(from.v, 1));
+}
 
-template<> EIGEN_STRONG_INLINE std::complex<double> pfirst<Packet1cd>(const Packet1cd& a)
-{
+template <>
+EIGEN_STRONG_INLINE std::complex<double> pfirst<Packet1cd>(const Packet1cd& a) {
   EIGEN_ALIGN16 std::complex<double> res;
   pstore<std::complex<double> >(&res, a);
   return res;
 }
 
-template<> EIGEN_STRONG_INLINE Packet1cd preverse(const Packet1cd& a) { return a; }
+template <>
+EIGEN_STRONG_INLINE Packet1cd preverse(const Packet1cd& a) {
+  return a;
+}
 
-template<> EIGEN_STRONG_INLINE std::complex<double> predux<Packet1cd>(const Packet1cd& a) { return pfirst(a); }
+template <>
+EIGEN_STRONG_INLINE std::complex<double> predux<Packet1cd>(const Packet1cd& a) {
+  return pfirst(a);
+}
 
-template<> EIGEN_STRONG_INLINE std::complex<double> predux_mul<Packet1cd>(const Packet1cd& a) { return pfirst(a); }
+template <>
+EIGEN_STRONG_INLINE std::complex<double> predux_mul<Packet1cd>(const Packet1cd& a) {
+  return pfirst(a);
+}
 
-EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet1cd,Packet2d)
+EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet1cd, Packet2d)
 
-template<> EIGEN_STRONG_INLINE Packet1cd pdiv<Packet1cd>(const Packet1cd& a, const Packet1cd& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet1cd pdiv<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
   return pdiv_complex(a, b);
 }
 
-EIGEN_STRONG_INLINE Packet1cd pcplxflip/*<Packet1cd>*/(const Packet1cd& x)
-{ return Packet1cd(preverse(Packet2d(x.v))); }
+EIGEN_STRONG_INLINE Packet1cd pcplxflip /*<Packet1cd>*/ (const Packet1cd& x) {
+  return Packet1cd(preverse(Packet2d(x.v)));
+}
 
-EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet1cd,2>& kernel)
-{
+EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet1cd, 2>& kernel) {
   Packet2d tmp = vcombine_f64(vget_high_f64(kernel.packet[0].v), vget_high_f64(kernel.packet[1].v));
   kernel.packet[0].v = vcombine_f64(vget_low_f64(kernel.packet[0].v), vget_low_f64(kernel.packet[1].v));
   kernel.packet[1].v = tmp;
 }
 
-template<> EIGEN_STRONG_INLINE Packet1cd psqrt<Packet1cd>(const Packet1cd& a) {
+template <>
+EIGEN_STRONG_INLINE Packet1cd psqrt<Packet1cd>(const Packet1cd& a) {
   return psqrt_complex<Packet1cd>(a);
 }
 
-#endif // EIGEN_ARCH_ARM64
+#endif  // EIGEN_ARCH_ARM64
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_COMPLEX_NEON_H
+#endif  // EIGEN_COMPLEX_NEON_H
diff --git a/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h b/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h
index 48410c5..4ecf7d1 100644
--- a/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h
+++ b/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h
@@ -9,38 +9,28 @@
 // Clang seems to excessively spill registers in the GEBP kernel on 32-bit arm.
 // Here we specialize gebp_traits to eliminate these register spills.
 // See #2138.
-template<>
-struct gebp_traits <float,float,false,false,Architecture::NEON,GEBPPacketFull>
- : gebp_traits<float,float,false,false,Architecture::Generic,GEBPPacketFull>
-{
-  EIGEN_STRONG_INLINE void acc(const AccPacket& c, const ResPacket& alpha, ResPacket& r) const
-  { 
+template <>
+struct gebp_traits<float, float, false, false, Architecture::NEON, GEBPPacketFull>
+    : gebp_traits<float, float, false, false, Architecture::Generic, GEBPPacketFull> {
+  EIGEN_STRONG_INLINE void acc(const AccPacket& c, const ResPacket& alpha, ResPacket& r) const {
     // This volatile inline ASM both acts as a barrier to prevent reordering,
     // as well as enforces strict register use.
-    asm volatile(
-      "vmla.f32 %q[r], %q[c], %q[alpha]"
-      : [r] "+w" (r)
-      : [c] "w" (c),
-        [alpha] "w" (alpha)
-      : );
+    asm volatile("vmla.f32 %q[r], %q[c], %q[alpha]" : [r] "+w"(r) : [c] "w"(c), [alpha] "w"(alpha) :);
   }
 
   template <typename LaneIdType>
-  EIGEN_STRONG_INLINE void madd(const Packet4f& a, const Packet4f& b,
-                                Packet4f& c, Packet4f&,
-                                const LaneIdType&) const {
+  EIGEN_STRONG_INLINE void madd(const Packet4f& a, const Packet4f& b, Packet4f& c, Packet4f&, const LaneIdType&) const {
     acc(a, b, c);
   }
-  
+
   template <typename LaneIdType>
-  EIGEN_STRONG_INLINE void madd(const Packet4f& a, const QuadPacket<Packet4f>& b,
-                                Packet4f& c, Packet4f& tmp,
+  EIGEN_STRONG_INLINE void madd(const Packet4f& a, const QuadPacket<Packet4f>& b, Packet4f& c, Packet4f& tmp,
                                 const LaneIdType& lane) const {
     madd(a, b.get(lane), c, tmp, lane);
   }
 };
 
-#endif // EIGEN_ARCH_ARM && EIGEN_COMP_CLANG
+#endif  // EIGEN_ARCH_ARM && EIGEN_COMP_CLANG
 
 #if EIGEN_ARCH_ARM64
 
@@ -48,139 +38,139 @@
 #define EIGEN_NEON_GEBP_NR 8
 #endif
 
-template<>
-struct gebp_traits <float,float,false,false,Architecture::NEON,GEBPPacketFull>
- : gebp_traits<float,float,false,false,Architecture::Generic,GEBPPacketFull>
-{
+template <>
+struct gebp_traits<float, float, false, false, Architecture::NEON, GEBPPacketFull>
+    : gebp_traits<float, float, false, false, Architecture::Generic, GEBPPacketFull> {
   typedef float RhsPacket;
   typedef float32x4_t RhsPacketx4;
   enum { nr = EIGEN_NEON_GEBP_NR };
-  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacket& dest) const {
-    dest = *b;
-  }
+  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacket& dest) const { dest = *b; }
 
-  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacketx4& dest) const
-  {
-    dest = vld1q_f32(b);
-  }
+  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacketx4& dest) const { dest = vld1q_f32(b); }
 
-  EIGEN_STRONG_INLINE void updateRhs(const RhsScalar* b, RhsPacket& dest) const
-  {
-    dest = *b;
-  }
+  EIGEN_STRONG_INLINE void updateRhs(const RhsScalar* b, RhsPacket& dest) const { dest = *b; }
 
-  EIGEN_STRONG_INLINE void updateRhs(const RhsScalar*, RhsPacketx4&) const
-  {}
+  EIGEN_STRONG_INLINE void updateRhs(const RhsScalar*, RhsPacketx4&) const {}
 
-  EIGEN_STRONG_INLINE void loadRhsQuad(const RhsScalar* b, RhsPacket& dest) const
-  {
-    loadRhs(b,dest);
-  }
+  EIGEN_STRONG_INLINE void loadRhsQuad(const RhsScalar* b, RhsPacket& dest) const { loadRhs(b, dest); }
 
-  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacket& b, AccPacket& c, RhsPacket& /*tmp*/, const FixedInt<0>&) const
-  {
+  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacket& b, AccPacket& c, RhsPacket& /*tmp*/,
+                                const FixedInt<0>&) const {
     c = vfmaq_n_f32(c, a, b);
   }
   // NOTE: Template parameter inference failed when compiled with Android NDK:
   // "candidate template ignored: could not match 'FixedInt<N>' against 'Eigen::internal::FixedInt<0>".
 
-  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c, RhsPacket& /*tmp*/, const FixedInt<0>&) const
-  { madd_helper<0>(a, b, c); }
-  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c, RhsPacket& /*tmp*/, const FixedInt<1>&) const
-  { madd_helper<1>(a, b, c); }
-  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c, RhsPacket& /*tmp*/, const FixedInt<2>&) const
-  { madd_helper<2>(a, b, c); }
-  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c, RhsPacket& /*tmp*/, const FixedInt<3>&) const
-  { madd_helper<3>(a, b, c); }
+  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c, RhsPacket& /*tmp*/,
+                                const FixedInt<0>&) const {
+    madd_helper<0>(a, b, c);
+  }
+  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c, RhsPacket& /*tmp*/,
+                                const FixedInt<1>&) const {
+    madd_helper<1>(a, b, c);
+  }
+  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c, RhsPacket& /*tmp*/,
+                                const FixedInt<2>&) const {
+    madd_helper<2>(a, b, c);
+  }
+  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c, RhsPacket& /*tmp*/,
+                                const FixedInt<3>&) const {
+    madd_helper<3>(a, b, c);
+  }
 
  private:
-  template<int LaneID>
-  EIGEN_STRONG_INLINE void madd_helper(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c) const
-  {
-    #if EIGEN_GNUC_STRICT_LESS_THAN(9,0,0)
+  template <int LaneID>
+  EIGEN_STRONG_INLINE void madd_helper(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c) const {
+#if EIGEN_GNUC_STRICT_LESS_THAN(9, 0, 0)
     // 1. workaround gcc issue https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89101
     //    vfmaq_laneq_f32 is implemented through a costly dup, which was fixed in gcc9
     // 2. workaround the gcc register split problem on arm64-neon
-         if(LaneID==0)  asm("fmla %0.4s, %1.4s, %2.s[0]\n" : "+w" (c) : "w" (a), "w" (b) :  );
-    else if(LaneID==1)  asm("fmla %0.4s, %1.4s, %2.s[1]\n" : "+w" (c) : "w" (a), "w" (b) :  );
-    else if(LaneID==2)  asm("fmla %0.4s, %1.4s, %2.s[2]\n" : "+w" (c) : "w" (a), "w" (b) :  );
-    else if(LaneID==3)  asm("fmla %0.4s, %1.4s, %2.s[3]\n" : "+w" (c) : "w" (a), "w" (b) :  );
-    #else
+    if (LaneID == 0)
+      asm("fmla %0.4s, %1.4s, %2.s[0]\n" : "+w"(c) : "w"(a), "w"(b) :);
+    else if (LaneID == 1)
+      asm("fmla %0.4s, %1.4s, %2.s[1]\n" : "+w"(c) : "w"(a), "w"(b) :);
+    else if (LaneID == 2)
+      asm("fmla %0.4s, %1.4s, %2.s[2]\n" : "+w"(c) : "w"(a), "w"(b) :);
+    else if (LaneID == 3)
+      asm("fmla %0.4s, %1.4s, %2.s[3]\n" : "+w"(c) : "w"(a), "w"(b) :);
+#else
     c = vfmaq_laneq_f32(c, a, b, LaneID);
-    #endif
+#endif
   }
 };
 
-
-template<>
-struct gebp_traits <double,double,false,false,Architecture::NEON>
- : gebp_traits<double,double,false,false,Architecture::Generic>
-{
+template <>
+struct gebp_traits<double, double, false, false, Architecture::NEON>
+    : gebp_traits<double, double, false, false, Architecture::Generic> {
   typedef double RhsPacket;
   enum { nr = EIGEN_NEON_GEBP_NR };
   struct RhsPacketx4 {
     float64x2_t B_0, B_1;
   };
 
-  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacket& dest) const
-  {
-    dest = *b;
-  }
+  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacket& dest) const { dest = *b; }
 
-  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacketx4& dest) const
-  {
+  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacketx4& dest) const {
     dest.B_0 = vld1q_f64(b);
-    dest.B_1 = vld1q_f64(b+2);
+    dest.B_1 = vld1q_f64(b + 2);
   }
 
-  EIGEN_STRONG_INLINE void updateRhs(const RhsScalar* b, RhsPacket& dest) const
-  {
-    loadRhs(b,dest);
-  }
+  EIGEN_STRONG_INLINE void updateRhs(const RhsScalar* b, RhsPacket& dest) const { loadRhs(b, dest); }
 
-  EIGEN_STRONG_INLINE void updateRhs(const RhsScalar*, RhsPacketx4&) const
-  {}
+  EIGEN_STRONG_INLINE void updateRhs(const RhsScalar*, RhsPacketx4&) const {}
 
-  EIGEN_STRONG_INLINE void loadRhsQuad(const RhsScalar* b, RhsPacket& dest) const
-  {
-    loadRhs(b,dest);
-  }
+  EIGEN_STRONG_INLINE void loadRhsQuad(const RhsScalar* b, RhsPacket& dest) const { loadRhs(b, dest); }
 
-  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacket& b, AccPacket& c, RhsPacket& /*tmp*/, const FixedInt<0>&) const
-  {
+  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacket& b, AccPacket& c, RhsPacket& /*tmp*/,
+                                const FixedInt<0>&) const {
     c = vfmaq_n_f64(c, a, b);
   }
 
   // NOTE: Template parameter inference failed when compiled with Android NDK:
   // "candidate template ignored: could not match 'FixedInt<N>' against 'Eigen::internal::FixedInt<0>".
 
-  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c, RhsPacket& /*tmp*/, const FixedInt<0>&) const
-  { madd_helper<0>(a, b, c); }
-  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c, RhsPacket& /*tmp*/, const FixedInt<1>&) const
-  { madd_helper<1>(a, b, c); }
-  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c, RhsPacket& /*tmp*/, const FixedInt<2>&) const
-  { madd_helper<2>(a, b, c); }
-  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c, RhsPacket& /*tmp*/, const FixedInt<3>&) const
-  { madd_helper<3>(a, b, c); }
+  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c, RhsPacket& /*tmp*/,
+                                const FixedInt<0>&) const {
+    madd_helper<0>(a, b, c);
+  }
+  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c, RhsPacket& /*tmp*/,
+                                const FixedInt<1>&) const {
+    madd_helper<1>(a, b, c);
+  }
+  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c, RhsPacket& /*tmp*/,
+                                const FixedInt<2>&) const {
+    madd_helper<2>(a, b, c);
+  }
+  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c, RhsPacket& /*tmp*/,
+                                const FixedInt<3>&) const {
+    madd_helper<3>(a, b, c);
+  }
 
  private:
   template <int LaneID>
-  EIGEN_STRONG_INLINE void madd_helper(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c) const
-  {
-    #if EIGEN_GNUC_STRICT_LESS_THAN(9,0,0)
+  EIGEN_STRONG_INLINE void madd_helper(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c) const {
+#if EIGEN_GNUC_STRICT_LESS_THAN(9, 0, 0)
     // 1. workaround gcc issue https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89101
     //    vfmaq_laneq_f64 is implemented through a costly dup, which was fixed in gcc9
     // 2. workaround the gcc register split problem on arm64-neon
-         if(LaneID==0)  asm("fmla %0.2d, %1.2d, %2.d[0]\n" : "+w" (c) : "w" (a), "w" (b.B_0) :  );
-    else if(LaneID==1)  asm("fmla %0.2d, %1.2d, %2.d[1]\n" : "+w" (c) : "w" (a), "w" (b.B_0) :  );
-    else if(LaneID==2)  asm("fmla %0.2d, %1.2d, %2.d[0]\n" : "+w" (c) : "w" (a), "w" (b.B_1) :  );
-    else if(LaneID==3)  asm("fmla %0.2d, %1.2d, %2.d[1]\n" : "+w" (c) : "w" (a), "w" (b.B_1) :  );
-    #else
-         if(LaneID==0) c = vfmaq_laneq_f64(c, a, b.B_0, 0);
-    else if(LaneID==1) c = vfmaq_laneq_f64(c, a, b.B_0, 1);
-    else if(LaneID==2) c = vfmaq_laneq_f64(c, a, b.B_1, 0);
-    else if(LaneID==3) c = vfmaq_laneq_f64(c, a, b.B_1, 1);
-    #endif
+    if (LaneID == 0)
+      asm("fmla %0.2d, %1.2d, %2.d[0]\n" : "+w"(c) : "w"(a), "w"(b.B_0) :);
+    else if (LaneID == 1)
+      asm("fmla %0.2d, %1.2d, %2.d[1]\n" : "+w"(c) : "w"(a), "w"(b.B_0) :);
+    else if (LaneID == 2)
+      asm("fmla %0.2d, %1.2d, %2.d[0]\n" : "+w"(c) : "w"(a), "w"(b.B_1) :);
+    else if (LaneID == 3)
+      asm("fmla %0.2d, %1.2d, %2.d[1]\n" : "+w"(c) : "w"(a), "w"(b.B_1) :);
+#else
+    if (LaneID == 0)
+      c = vfmaq_laneq_f64(c, a, b.B_0, 0);
+    else if (LaneID == 1)
+      c = vfmaq_laneq_f64(c, a, b.B_0, 1);
+    else if (LaneID == 2)
+      c = vfmaq_laneq_f64(c, a, b.B_1, 0);
+    else if (LaneID == 3)
+      c = vfmaq_laneq_f64(c, a, b.B_1, 1);
+#endif
   }
 };
 
@@ -190,68 +180,64 @@
 // through a costly dup in gcc compiler.
 #if EIGEN_HAS_ARM64_FP16_VECTOR_ARITHMETIC && EIGEN_COMP_CLANG
 
-template<>
-struct gebp_traits <half,half,false,false,Architecture::NEON>
- : gebp_traits<half,half,false,false,Architecture::Generic>
-{
+template <>
+struct gebp_traits<half, half, false, false, Architecture::NEON>
+    : gebp_traits<half, half, false, false, Architecture::Generic> {
   typedef half RhsPacket;
   typedef float16x4_t RhsPacketx4;
   typedef float16x4_t PacketHalf;
   enum { nr = EIGEN_NEON_GEBP_NR };
 
-  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacket& dest) const
-  {
-    dest = *b;
-  }
+  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacket& dest) const { dest = *b; }
 
-  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacketx4& dest) const
-  {
-    dest = vld1_f16((const __fp16 *)b);
-  }
+  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacketx4& dest) const { dest = vld1_f16((const __fp16*)b); }
 
-  EIGEN_STRONG_INLINE void updateRhs(const RhsScalar* b, RhsPacket& dest) const
-  {
-    dest = *b;
-  }
+  EIGEN_STRONG_INLINE void updateRhs(const RhsScalar* b, RhsPacket& dest) const { dest = *b; }
 
-  EIGEN_STRONG_INLINE void updateRhs(const RhsScalar*, RhsPacketx4&) const
-  {}
+  EIGEN_STRONG_INLINE void updateRhs(const RhsScalar*, RhsPacketx4&) const {}
 
-  EIGEN_STRONG_INLINE void loadRhsQuad(const RhsScalar*, RhsPacket&) const
-  {
+  EIGEN_STRONG_INLINE void loadRhsQuad(const RhsScalar*, RhsPacket&) const {
     // If LHS is a Packet8h, we cannot correctly mimic a ploadquad of the RHS
     // using a single scalar value.
     eigen_assert(false && "Cannot loadRhsQuad for a scalar RHS.");
   }
 
-  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacket& b, AccPacket& c, RhsPacket& /*tmp*/, const FixedInt<0>&) const
-  {
+  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacket& b, AccPacket& c, RhsPacket& /*tmp*/,
+                                const FixedInt<0>&) const {
     c = vfmaq_n_f16(c, a, b);
   }
-  EIGEN_STRONG_INLINE void madd(const PacketHalf& a, const RhsPacket& b, PacketHalf& c, RhsPacket& /*tmp*/, const FixedInt<0>&) const
-  {
+  EIGEN_STRONG_INLINE void madd(const PacketHalf& a, const RhsPacket& b, PacketHalf& c, RhsPacket& /*tmp*/,
+                                const FixedInt<0>&) const {
     c = vfma_n_f16(c, a, b);
   }
 
   // NOTE: Template parameter inference failed when compiled with Android NDK:
   // "candidate template ignored: could not match 'FixedInt<N>' against 'Eigen::internal::FixedInt<0>".
-  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c, RhsPacket& /*tmp*/, const FixedInt<0>&) const
-  { madd_helper<0>(a, b, c); }
-  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c, RhsPacket& /*tmp*/, const FixedInt<1>&) const
-  { madd_helper<1>(a, b, c); }
-  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c, RhsPacket& /*tmp*/, const FixedInt<2>&) const
-  { madd_helper<2>(a, b, c); }
-  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c, RhsPacket& /*tmp*/, const FixedInt<3>&) const
-  { madd_helper<3>(a, b, c); }
+  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c, RhsPacket& /*tmp*/,
+                                const FixedInt<0>&) const {
+    madd_helper<0>(a, b, c);
+  }
+  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c, RhsPacket& /*tmp*/,
+                                const FixedInt<1>&) const {
+    madd_helper<1>(a, b, c);
+  }
+  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c, RhsPacket& /*tmp*/,
+                                const FixedInt<2>&) const {
+    madd_helper<2>(a, b, c);
+  }
+  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c, RhsPacket& /*tmp*/,
+                                const FixedInt<3>&) const {
+    madd_helper<3>(a, b, c);
+  }
+
  private:
-  template<int LaneID>
-  EIGEN_STRONG_INLINE void madd_helper(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c) const
-  {
+  template <int LaneID>
+  EIGEN_STRONG_INLINE void madd_helper(const LhsPacket& a, const RhsPacketx4& b, AccPacket& c) const {
     c = vfmaq_lane_f16(c, a, b, LaneID);
   }
 };
-#endif // EIGEN_HAS_ARM64_FP16_VECTOR_ARITHMETIC && EIGEN_COMP_CLANG
-#endif // EIGEN_ARCH_ARM64
+#endif  // EIGEN_HAS_ARM64_FP16_VECTOR_ARITHMETIC && EIGEN_COMP_CLANG
+#endif  // EIGEN_ARCH_ARM64
 
 }  // namespace internal
 }  // namespace Eigen
diff --git a/Eigen/src/Core/arch/NEON/MathFunctions.h b/Eigen/src/Core/arch/NEON/MathFunctions.h
index 8611810..3d2e7bd 100644
--- a/Eigen/src/Core/arch/NEON/MathFunctions.h
+++ b/Eigen/src/Core/arch/NEON/MathFunctions.h
@@ -20,21 +20,18 @@
 
 #if EIGEN_HAS_ARM64_FP16_VECTOR_ARITHMETIC
 template <>
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
-Packet4hf ptanh<Packet4hf>(const Packet4hf& x) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Packet4hf ptanh<Packet4hf>(const Packet4hf& x) {
   // Convert to float, call the float ptanh, and then convert back.
   return vcvt_f16_f32(ptanh<Packet4f>(vcvt_f32_f16(x)));
 }
 
 template <>
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
-Packet8hf ptanh<Packet8hf>(const Packet8hf& x) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Packet8hf ptanh<Packet8hf>(const Packet8hf& x) {
   // Convert each 4 halfs to float, call the float ptanh, and then convert back.
-  return vcombine_f16(
-    vcvt_f16_f32(ptanh<Packet4f>(vcvt_f32_f16(vget_low_f16(x)))),
-    vcvt_f16_f32(ptanh<Packet4f>(vcvt_high_f32_f16(x))));
+  return vcombine_f16(vcvt_f16_f32(ptanh<Packet4f>(vcvt_f32_f16(vget_low_f16(x)))),
+                      vcvt_f16_f32(ptanh<Packet4f>(vcvt_high_f32_f16(x))));
 }
-#endif // EIGEN_HAS_ARM64_FP16_VECTOR_ARITHMETIC
+#endif  // EIGEN_HAS_ARM64_FP16_VECTOR_ARITHMETIC
 
 BF16_PACKET_FUNCTION(Packet4f, Packet4bf, psin)
 BF16_PACKET_FUNCTION(Packet4f, Packet4bf, pcos)
@@ -63,8 +60,8 @@
 
 #endif
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_MATH_FUNCTIONS_NEON_H
+#endif  // EIGEN_MATH_FUNCTIONS_NEON_H
diff --git a/Eigen/src/Core/arch/NEON/PacketMath.h b/Eigen/src/Core/arch/NEON/PacketMath.h
index e70f8b0..4e3a14d 100644
--- a/Eigen/src/Core/arch/NEON/PacketMath.h
+++ b/Eigen/src/Core/arch/NEON/PacketMath.h
@@ -41,24 +41,24 @@
 // are aliases to the same underlying type __n128.
 // We thus have to wrap them to make them different C++ types.
 // (See also bug 1428)
-typedef eigen_packet_wrapper<float32x2_t,0>  Packet2f;
-typedef eigen_packet_wrapper<float32x4_t,1>  Packet4f;
-typedef eigen_packet_wrapper<int32_t    ,2>  Packet4c;
-typedef eigen_packet_wrapper<int8x8_t   ,3>  Packet8c;
-typedef eigen_packet_wrapper<int8x16_t  ,4>  Packet16c;
-typedef eigen_packet_wrapper<uint32_t   ,5>  Packet4uc;
-typedef eigen_packet_wrapper<uint8x8_t  ,6>  Packet8uc;
-typedef eigen_packet_wrapper<uint8x16_t ,7>  Packet16uc;
-typedef eigen_packet_wrapper<int16x4_t  ,8>  Packet4s;
-typedef eigen_packet_wrapper<int16x8_t  ,9>  Packet8s;
-typedef eigen_packet_wrapper<uint16x4_t ,10> Packet4us;
-typedef eigen_packet_wrapper<uint16x8_t ,11> Packet8us;
-typedef eigen_packet_wrapper<int32x2_t  ,12> Packet2i;
-typedef eigen_packet_wrapper<int32x4_t  ,13> Packet4i;
-typedef eigen_packet_wrapper<uint32x2_t ,14> Packet2ui;
-typedef eigen_packet_wrapper<uint32x4_t ,15> Packet4ui;
-typedef eigen_packet_wrapper<int64x2_t  ,16> Packet2l;
-typedef eigen_packet_wrapper<uint64x2_t ,17> Packet2ul;
+typedef eigen_packet_wrapper<float32x2_t, 0> Packet2f;
+typedef eigen_packet_wrapper<float32x4_t, 1> Packet4f;
+typedef eigen_packet_wrapper<int32_t, 2> Packet4c;
+typedef eigen_packet_wrapper<int8x8_t, 3> Packet8c;
+typedef eigen_packet_wrapper<int8x16_t, 4> Packet16c;
+typedef eigen_packet_wrapper<uint32_t, 5> Packet4uc;
+typedef eigen_packet_wrapper<uint8x8_t, 6> Packet8uc;
+typedef eigen_packet_wrapper<uint8x16_t, 7> Packet16uc;
+typedef eigen_packet_wrapper<int16x4_t, 8> Packet4s;
+typedef eigen_packet_wrapper<int16x8_t, 9> Packet8s;
+typedef eigen_packet_wrapper<uint16x4_t, 10> Packet4us;
+typedef eigen_packet_wrapper<uint16x8_t, 11> Packet8us;
+typedef eigen_packet_wrapper<int32x2_t, 12> Packet2i;
+typedef eigen_packet_wrapper<int32x4_t, 13> Packet4i;
+typedef eigen_packet_wrapper<uint32x2_t, 14> Packet2ui;
+typedef eigen_packet_wrapper<uint32x4_t, 15> Packet4ui;
+typedef eigen_packet_wrapper<int64x2_t, 16> Packet2l;
+typedef eigen_packet_wrapper<uint64x2_t, 17> Packet2ul;
 
 EIGEN_ALWAYS_INLINE Packet4f make_packet4f(float a, float b, float c, float d) {
   float from[4] = {a, b, c, d};
@@ -72,405 +72,380 @@
 
 #else
 
-typedef float32x2_t                          Packet2f;
-typedef float32x4_t                          Packet4f;
-typedef eigen_packet_wrapper<int32_t    ,2>  Packet4c;
-typedef int8x8_t                             Packet8c;
-typedef int8x16_t                            Packet16c;
-typedef eigen_packet_wrapper<uint32_t   ,5>  Packet4uc;
-typedef uint8x8_t                            Packet8uc;
-typedef uint8x16_t                           Packet16uc;
-typedef int16x4_t                            Packet4s;
-typedef int16x8_t                            Packet8s;
-typedef uint16x4_t                           Packet4us;
-typedef uint16x8_t                           Packet8us;
-typedef int32x2_t                            Packet2i;
-typedef int32x4_t                            Packet4i;
-typedef uint32x2_t                           Packet2ui;
-typedef uint32x4_t                           Packet4ui;
-typedef int64x2_t                            Packet2l;
-typedef uint64x2_t                           Packet2ul;
+typedef float32x2_t Packet2f;
+typedef float32x4_t Packet4f;
+typedef eigen_packet_wrapper<int32_t, 2> Packet4c;
+typedef int8x8_t Packet8c;
+typedef int8x16_t Packet16c;
+typedef eigen_packet_wrapper<uint32_t, 5> Packet4uc;
+typedef uint8x8_t Packet8uc;
+typedef uint8x16_t Packet16uc;
+typedef int16x4_t Packet4s;
+typedef int16x8_t Packet8s;
+typedef uint16x4_t Packet4us;
+typedef uint16x8_t Packet8us;
+typedef int32x2_t Packet2i;
+typedef int32x4_t Packet4i;
+typedef uint32x2_t Packet2ui;
+typedef uint32x4_t Packet4ui;
+typedef int64x2_t Packet2l;
+typedef uint64x2_t Packet2ul;
 
 EIGEN_ALWAYS_INLINE Packet4f make_packet4f(float a, float b, float c, float d) { return Packet4f{a, b, c, d}; }
 EIGEN_ALWAYS_INLINE Packet2f make_packet2f(float a, float b) { return Packet2f{a, b}; }
 
-#endif // EIGEN_COMP_MSVC_STRICT
+#endif  // EIGEN_COMP_MSVC_STRICT
 
-EIGEN_STRONG_INLINE Packet4f shuffle1(const Packet4f& m, int mask){
+EIGEN_STRONG_INLINE Packet4f shuffle1(const Packet4f& m, int mask) {
   const float* a = reinterpret_cast<const float*>(&m);
-  Packet4f res = make_packet4f(*(a + (mask & 3)), *(a + ((mask >> 2) & 3)), *(a + ((mask >> 4) & 3 )), *(a + ((mask >> 6) & 3)));
+  Packet4f res =
+      make_packet4f(*(a + (mask & 3)), *(a + ((mask >> 2) & 3)), *(a + ((mask >> 4) & 3)), *(a + ((mask >> 6) & 3)));
   return res;
 }
 
 // fuctionally equivalent to _mm_shuffle_ps in SSE when interleave
 // == false (i.e. shuffle<false>(m, n, mask) equals _mm_shuffle_ps(m, n, mask)),
 // interleave m and n when interleave == true. Currently used in LU/arch/InverseSize4.h
-// to enable a shared implementation for fast inversion of matrices of size 4. 
-template<bool interleave> 
-EIGEN_STRONG_INLINE Packet4f shuffle2(const Packet4f &m, const Packet4f &n, int mask)
-{
+// to enable a shared implementation for fast inversion of matrices of size 4.
+template <bool interleave>
+EIGEN_STRONG_INLINE Packet4f shuffle2(const Packet4f& m, const Packet4f& n, int mask) {
   const float* a = reinterpret_cast<const float*>(&m);
   const float* b = reinterpret_cast<const float*>(&n);
-  Packet4f res = make_packet4f(*(a + (mask & 3)), *(a + ((mask >> 2) & 3)), *(b + ((mask >> 4) & 3)), *(b + ((mask >> 6) & 3)));
+  Packet4f res =
+      make_packet4f(*(a + (mask & 3)), *(a + ((mask >> 2) & 3)), *(b + ((mask >> 4) & 3)), *(b + ((mask >> 6) & 3)));
   return res;
 }
 
-template<> 
-EIGEN_STRONG_INLINE Packet4f shuffle2<true>(const Packet4f &m, const Packet4f &n, int mask) 
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f shuffle2<true>(const Packet4f& m, const Packet4f& n, int mask) {
   const float* a = reinterpret_cast<const float*>(&m);
   const float* b = reinterpret_cast<const float*>(&n);
-  Packet4f res = make_packet4f(*(a + (mask & 3)), *(b + ((mask >> 2) & 3)), *(a + ((mask >> 4) & 3)), *(b + ((mask >> 6) & 3)));
+  Packet4f res =
+      make_packet4f(*(a + (mask & 3)), *(b + ((mask >> 2) & 3)), *(a + ((mask >> 4) & 3)), *(b + ((mask >> 6) & 3)));
   return res;
 }
 
-EIGEN_STRONG_INLINE static int eigen_neon_shuffle_mask(int p, int q, int r, int s) {return ((s)<<6|(r)<<4|(q)<<2|(p));}
+EIGEN_STRONG_INLINE static int eigen_neon_shuffle_mask(int p, int q, int r, int s) {
+  return ((s) << 6 | (r) << 4 | (q) << 2 | (p));
+}
 
-EIGEN_STRONG_INLINE Packet4f vec4f_swizzle1(const Packet4f& a, int p, int q, int r, int s)
-{ 
+EIGEN_STRONG_INLINE Packet4f vec4f_swizzle1(const Packet4f& a, int p, int q, int r, int s) {
   return shuffle1(a, eigen_neon_shuffle_mask(p, q, r, s));
 }
-EIGEN_STRONG_INLINE Packet4f vec4f_swizzle2(const Packet4f& a, const Packet4f& b, int p, int q, int r, int s)
-{ 
-  return shuffle2<false>(a,b,eigen_neon_shuffle_mask(p, q, r, s));
+EIGEN_STRONG_INLINE Packet4f vec4f_swizzle2(const Packet4f& a, const Packet4f& b, int p, int q, int r, int s) {
+  return shuffle2<false>(a, b, eigen_neon_shuffle_mask(p, q, r, s));
 }
-EIGEN_STRONG_INLINE Packet4f vec4f_movelh(const Packet4f& a, const Packet4f& b)
-{
-  return shuffle2<false>(a,b,eigen_neon_shuffle_mask(0, 1, 0, 1));
+EIGEN_STRONG_INLINE Packet4f vec4f_movelh(const Packet4f& a, const Packet4f& b) {
+  return shuffle2<false>(a, b, eigen_neon_shuffle_mask(0, 1, 0, 1));
 }
-EIGEN_STRONG_INLINE Packet4f vec4f_movehl(const Packet4f& a, const Packet4f& b)
-{
-  return shuffle2<false>(b,a,eigen_neon_shuffle_mask(2, 3, 2, 3));
+EIGEN_STRONG_INLINE Packet4f vec4f_movehl(const Packet4f& a, const Packet4f& b) {
+  return shuffle2<false>(b, a, eigen_neon_shuffle_mask(2, 3, 2, 3));
 }
-EIGEN_STRONG_INLINE Packet4f vec4f_unpacklo(const Packet4f& a, const Packet4f& b)
-{
-  return shuffle2<true>(a,b,eigen_neon_shuffle_mask(0, 0, 1, 1));
+EIGEN_STRONG_INLINE Packet4f vec4f_unpacklo(const Packet4f& a, const Packet4f& b) {
+  return shuffle2<true>(a, b, eigen_neon_shuffle_mask(0, 0, 1, 1));
 }
-EIGEN_STRONG_INLINE Packet4f vec4f_unpackhi(const Packet4f& a, const Packet4f& b)
-{
-  return shuffle2<true>(a,b,eigen_neon_shuffle_mask(2, 2, 3, 3));
+EIGEN_STRONG_INLINE Packet4f vec4f_unpackhi(const Packet4f& a, const Packet4f& b) {
+  return shuffle2<true>(a, b, eigen_neon_shuffle_mask(2, 2, 3, 3));
 }
-#define vec4f_duplane(a, p) \
-  Packet4f(vdupq_lane_f32(vget_low_f32(a), p))
+#define vec4f_duplane(a, p) Packet4f(vdupq_lane_f32(vget_low_f32(a), p))
 
-#define EIGEN_DECLARE_CONST_Packet4f(NAME,X) \
-  const Packet4f p4f_##NAME = pset1<Packet4f>(X)
+#define EIGEN_DECLARE_CONST_Packet4f(NAME, X) const Packet4f p4f_##NAME = pset1<Packet4f>(X)
 
-#define EIGEN_DECLARE_CONST_Packet4f_FROM_INT(NAME,X) \
+#define EIGEN_DECLARE_CONST_Packet4f_FROM_INT(NAME, X) \
   const Packet4f p4f_##NAME = vreinterpretq_f32_u32(pset1<int32_t>(X))
 
-#define EIGEN_DECLARE_CONST_Packet4i(NAME,X) \
-  const Packet4i p4i_##NAME = pset1<Packet4i>(X)
+#define EIGEN_DECLARE_CONST_Packet4i(NAME, X) const Packet4i p4i_##NAME = pset1<Packet4i>(X)
 
 #if EIGEN_ARCH_ARM64 && EIGEN_COMP_GNUC
-  // __builtin_prefetch tends to do nothing on ARM64 compilers because the
-  // prefetch instructions there are too detailed for __builtin_prefetch to map
-  // meaningfully to them.
-  #define EIGEN_ARM_PREFETCH(ADDR)  __asm__ __volatile__("prfm pldl1keep, [%[addr]]\n" ::[addr] "r"(ADDR) : );
+// __builtin_prefetch tends to do nothing on ARM64 compilers because the
+// prefetch instructions there are too detailed for __builtin_prefetch to map
+// meaningfully to them.
+#define EIGEN_ARM_PREFETCH(ADDR) __asm__ __volatile__("prfm pldl1keep, [%[addr]]\n" ::[addr] "r"(ADDR) :);
 #elif EIGEN_HAS_BUILTIN(__builtin_prefetch) || EIGEN_COMP_GNUC
-  #define EIGEN_ARM_PREFETCH(ADDR) __builtin_prefetch(ADDR);
+#define EIGEN_ARM_PREFETCH(ADDR) __builtin_prefetch(ADDR);
 #elif defined __pld
-  #define EIGEN_ARM_PREFETCH(ADDR) __pld(ADDR)
+#define EIGEN_ARM_PREFETCH(ADDR) __pld(ADDR)
 #elif EIGEN_ARCH_ARM
-  #define EIGEN_ARM_PREFETCH(ADDR) __asm__ __volatile__ ("pld [%[addr]]\n" :: [addr] "r" (ADDR) : );
+#define EIGEN_ARM_PREFETCH(ADDR) __asm__ __volatile__("pld [%[addr]]\n" ::[addr] "r"(ADDR) :);
 #else
-  // by default no explicit prefetching
-  #define EIGEN_ARM_PREFETCH(ADDR)
+// by default no explicit prefetching
+#define EIGEN_ARM_PREFETCH(ADDR)
 #endif
 
 template <>
-struct packet_traits<float> : default_packet_traits
-{
+struct packet_traits<float> : default_packet_traits {
   typedef Packet4f type;
   typedef Packet2f half;
-  enum
-  {
+  enum {
     Vectorizable = 1,
     AlignedOnScalar = 1,
     size = 4,
 
-    HasCmp       = 1,
-    HasAdd       = 1,
-    HasSub       = 1,
-    HasShift     = 1,
-    HasMul       = 1,
-    HasNegate    = 1,
-    HasAbs       = 1,
-    HasArg       = 0,
-    HasAbs2      = 1,
-    HasAbsDiff   = 1,
-    HasMin       = 1,
-    HasMax       = 1,
-    HasConj      = 1,
+    HasCmp = 1,
+    HasAdd = 1,
+    HasSub = 1,
+    HasShift = 1,
+    HasMul = 1,
+    HasNegate = 1,
+    HasAbs = 1,
+    HasArg = 0,
+    HasAbs2 = 1,
+    HasAbsDiff = 1,
+    HasMin = 1,
+    HasMax = 1,
+    HasConj = 1,
     HasSetLinear = 1,
-    HasBlend     = 0,
+    HasBlend = 0,
 
-    HasDiv   = 1,
+    HasDiv = 1,
     HasFloor = 1,
     HasCeil = 1,
     HasRint = 1,
 
-    HasSin  = EIGEN_FAST_MATH,
-    HasCos  = EIGEN_FAST_MATH,
-    HasACos  = 1,
-    HasASin  = 1,
-    HasATan  = 1,
+    HasSin = EIGEN_FAST_MATH,
+    HasCos = EIGEN_FAST_MATH,
+    HasACos = 1,
+    HasASin = 1,
+    HasATan = 1,
     HasATanh = 1,
-    HasLog  = 1,
-    HasExp  = 1,
+    HasLog = 1,
+    HasExp = 1,
     HasSqrt = 1,
     HasRsqrt = 1,
     HasTanh = EIGEN_FAST_MATH,
-    HasErf  = EIGEN_FAST_MATH,
+    HasErf = EIGEN_FAST_MATH,
     HasBessel = 0,  // Issues with accuracy.
     HasNdtri = 0
   };
 };
 
 template <>
-struct packet_traits<int8_t> : default_packet_traits
-{
+struct packet_traits<int8_t> : default_packet_traits {
   typedef Packet16c type;
   typedef Packet8c half;
-  enum
-  {
+  enum {
     Vectorizable = 1,
     AlignedOnScalar = 1,
     size = 16,
 
-    HasCmp       = 1,
-    HasAdd       = 1,
-    HasSub       = 1,
-    HasShift     = 1,
-    HasMul       = 1,
-    HasNegate    = 1,
-    HasAbs       = 1,
-    HasAbsDiff   = 1,
-    HasArg       = 0,
-    HasAbs2      = 1,
-    HasMin       = 1,
-    HasMax       = 1,
-    HasConj      = 1,
+    HasCmp = 1,
+    HasAdd = 1,
+    HasSub = 1,
+    HasShift = 1,
+    HasMul = 1,
+    HasNegate = 1,
+    HasAbs = 1,
+    HasAbsDiff = 1,
+    HasArg = 0,
+    HasAbs2 = 1,
+    HasMin = 1,
+    HasMax = 1,
+    HasConj = 1,
     HasSetLinear = 1,
-    HasBlend     = 0
+    HasBlend = 0
   };
 };
 
 template <>
-struct packet_traits<uint8_t> : default_packet_traits
-{
+struct packet_traits<uint8_t> : default_packet_traits {
   typedef Packet16uc type;
   typedef Packet8uc half;
-  enum
-  {
+  enum {
     Vectorizable = 1,
     AlignedOnScalar = 1,
     size = 16,
 
-    HasCmp       = 1,
-    HasAdd       = 1,
-    HasSub       = 1,
-    HasShift     = 1,
-    HasMul       = 1,
-    HasNegate    = 0,
-    HasAbs       = 1,
-    HasAbsDiff   = 1,
-    HasArg       = 0,
-    HasAbs2      = 1,
-    HasMin       = 1,
-    HasMax       = 1,
-    HasConj      = 1,
+    HasCmp = 1,
+    HasAdd = 1,
+    HasSub = 1,
+    HasShift = 1,
+    HasMul = 1,
+    HasNegate = 0,
+    HasAbs = 1,
+    HasAbsDiff = 1,
+    HasArg = 0,
+    HasAbs2 = 1,
+    HasMin = 1,
+    HasMax = 1,
+    HasConj = 1,
     HasSetLinear = 1,
-    HasBlend     = 0,
+    HasBlend = 0,
 
     HasSqrt = 1
   };
 };
 
 template <>
-struct packet_traits<int16_t> : default_packet_traits
-{
+struct packet_traits<int16_t> : default_packet_traits {
   typedef Packet8s type;
   typedef Packet4s half;
-  enum
-  {
+  enum {
     Vectorizable = 1,
     AlignedOnScalar = 1,
     size = 8,
 
-    HasCmp       = 1,
-    HasAdd       = 1,
-    HasSub       = 1,
-    HasShift     = 1,
-    HasMul       = 1,
-    HasNegate    = 1,
-    HasAbs       = 1,
-    HasAbsDiff   = 1,
-    HasArg       = 0,
-    HasAbs2      = 1,
-    HasMin       = 1,
-    HasMax       = 1,
-    HasConj      = 1,
+    HasCmp = 1,
+    HasAdd = 1,
+    HasSub = 1,
+    HasShift = 1,
+    HasMul = 1,
+    HasNegate = 1,
+    HasAbs = 1,
+    HasAbsDiff = 1,
+    HasArg = 0,
+    HasAbs2 = 1,
+    HasMin = 1,
+    HasMax = 1,
+    HasConj = 1,
     HasSetLinear = 1,
-    HasBlend     = 0
+    HasBlend = 0
   };
 };
 
 template <>
-struct packet_traits<uint16_t> : default_packet_traits
-{
+struct packet_traits<uint16_t> : default_packet_traits {
   typedef Packet8us type;
   typedef Packet4us half;
-  enum
-  {
+  enum {
     Vectorizable = 1,
     AlignedOnScalar = 1,
     size = 8,
 
-    HasCmp       = 1,
-    HasAdd       = 1,
-    HasSub       = 1,
-    HasShift     = 1,
-    HasMul       = 1,
-    HasNegate    = 0,
-    HasAbs       = 1,
-    HasAbsDiff   = 1,
-    HasArg       = 0,
-    HasAbs2      = 1,
-    HasMin       = 1,
-    HasMax       = 1,
-    HasConj      = 1,
+    HasCmp = 1,
+    HasAdd = 1,
+    HasSub = 1,
+    HasShift = 1,
+    HasMul = 1,
+    HasNegate = 0,
+    HasAbs = 1,
+    HasAbsDiff = 1,
+    HasArg = 0,
+    HasAbs2 = 1,
+    HasMin = 1,
+    HasMax = 1,
+    HasConj = 1,
     HasSetLinear = 1,
-    HasBlend     = 0,
+    HasBlend = 0,
     HasSqrt = 1
   };
 };
 
 template <>
-struct packet_traits<int32_t> : default_packet_traits
-{
+struct packet_traits<int32_t> : default_packet_traits {
   typedef Packet4i type;
   typedef Packet2i half;
-  enum
-  {
+  enum {
     Vectorizable = 1,
     AlignedOnScalar = 1,
     size = 4,
 
-    HasCmp       = 1,
-    HasAdd       = 1,
-    HasSub       = 1,
-    HasShift     = 1,
-    HasMul       = 1,
-    HasNegate    = 1,
-    HasAbs       = 1,
-    HasArg       = 0,
-    HasAbs2      = 1,
-    HasAbsDiff   = 1,
-    HasMin       = 1,
-    HasMax       = 1,
-    HasConj      = 1,
+    HasCmp = 1,
+    HasAdd = 1,
+    HasSub = 1,
+    HasShift = 1,
+    HasMul = 1,
+    HasNegate = 1,
+    HasAbs = 1,
+    HasArg = 0,
+    HasAbs2 = 1,
+    HasAbsDiff = 1,
+    HasMin = 1,
+    HasMax = 1,
+    HasConj = 1,
     HasSetLinear = 1,
-    HasBlend     = 0
+    HasBlend = 0
   };
 };
 
 template <>
-struct packet_traits<uint32_t> : default_packet_traits
-{
+struct packet_traits<uint32_t> : default_packet_traits {
   typedef Packet4ui type;
   typedef Packet2ui half;
-  enum
-  {
+  enum {
     Vectorizable = 1,
     AlignedOnScalar = 1,
     size = 4,
 
-    HasCmp       = 1,
-    HasAdd       = 1,
-    HasSub       = 1,
-    HasShift     = 1,
-    HasMul       = 1,
-    HasNegate    = 0,
-    HasAbs       = 1,
-    HasArg       = 0,
-    HasAbs2      = 1,
-    HasAbsDiff   = 1,
-    HasMin       = 1,
-    HasMax       = 1,
-    HasConj      = 1,
+    HasCmp = 1,
+    HasAdd = 1,
+    HasSub = 1,
+    HasShift = 1,
+    HasMul = 1,
+    HasNegate = 0,
+    HasAbs = 1,
+    HasArg = 0,
+    HasAbs2 = 1,
+    HasAbsDiff = 1,
+    HasMin = 1,
+    HasMax = 1,
+    HasConj = 1,
     HasSetLinear = 1,
-    HasBlend     = 0,
+    HasBlend = 0,
 
     HasSqrt = 1
   };
 };
 
 template <>
-struct packet_traits<int64_t> : default_packet_traits
-{
+struct packet_traits<int64_t> : default_packet_traits {
   typedef Packet2l type;
   typedef Packet2l half;
-  enum
-  {
+  enum {
     Vectorizable = 1,
     AlignedOnScalar = 1,
     size = 2,
 
-    HasCmp       = 1,
-    HasAdd       = 1,
-    HasSub       = 1,
-    HasShift     = 1,
-    HasMul       = 1,
-    HasNegate    = 1,
-    HasAbs       = 1,
-    HasArg       = 0,
-    HasAbs2      = 1,
-    HasAbsDiff   = 1,
-    HasMin       = 1,
-    HasMax       = 1,
-    HasConj      = 1,
+    HasCmp = 1,
+    HasAdd = 1,
+    HasSub = 1,
+    HasShift = 1,
+    HasMul = 1,
+    HasNegate = 1,
+    HasAbs = 1,
+    HasArg = 0,
+    HasAbs2 = 1,
+    HasAbsDiff = 1,
+    HasMin = 1,
+    HasMax = 1,
+    HasConj = 1,
     HasSetLinear = 1,
-    HasBlend     = 0
+    HasBlend = 0
   };
 };
 
 template <>
-struct packet_traits<uint64_t> : default_packet_traits
-{
+struct packet_traits<uint64_t> : default_packet_traits {
   typedef Packet2ul type;
   typedef Packet2ul half;
-  enum
-  {
+  enum {
     Vectorizable = 1,
     AlignedOnScalar = 1,
     size = 2,
 
-    HasCmp       = 1,
-    HasAdd       = 1,
-    HasSub       = 1,
-    HasShift     = 1,
-    HasMul       = 1,
-    HasNegate    = 0,
-    HasAbs       = 1,
-    HasArg       = 0,
-    HasAbs2      = 1,
-    HasAbsDiff   = 1,
-    HasMin       = 1,
-    HasMax       = 1,
-    HasConj      = 1,
+    HasCmp = 1,
+    HasAdd = 1,
+    HasSub = 1,
+    HasShift = 1,
+    HasMul = 1,
+    HasNegate = 0,
+    HasAbs = 1,
+    HasArg = 0,
+    HasAbs2 = 1,
+    HasAbsDiff = 1,
+    HasMin = 1,
+    HasMax = 1,
+    HasConj = 1,
     HasSetLinear = 1,
-    HasBlend     = 0
+    HasBlend = 0
   };
 };
 
-template<> struct unpacket_traits<Packet2f>
-{
+template <>
+struct unpacket_traits<Packet2f> {
   typedef float type;
   typedef Packet2f half;
   typedef Packet2i integer_packet;
-  enum
-  {
+  enum {
     size = 2,
     alignment = Aligned16,
     vectorizable = true,
@@ -478,13 +453,12 @@
     masked_store_available = false
   };
 };
-template<> struct unpacket_traits<Packet4f>
-{
+template <>
+struct unpacket_traits<Packet4f> {
   typedef float type;
   typedef Packet2f half;
   typedef Packet4i integer_packet;
-  enum
-  {
+  enum {
     size = 4,
     alignment = Aligned16,
     vectorizable = true,
@@ -492,12 +466,11 @@
     masked_store_available = false
   };
 };
-template<> struct unpacket_traits<Packet4c>
-{
+template <>
+struct unpacket_traits<Packet4c> {
   typedef int8_t type;
   typedef Packet4c half;
-  enum
-  {
+  enum {
     size = 4,
     alignment = Unaligned,
     vectorizable = true,
@@ -505,12 +478,11 @@
     masked_store_available = false
   };
 };
-template<> struct unpacket_traits<Packet8c>
-{
+template <>
+struct unpacket_traits<Packet8c> {
   typedef int8_t type;
   typedef Packet4c half;
-  enum
-  {
+  enum {
     size = 8,
     alignment = Aligned16,
     vectorizable = true,
@@ -518,12 +490,11 @@
     masked_store_available = false
   };
 };
-template<> struct unpacket_traits<Packet16c>
-{
+template <>
+struct unpacket_traits<Packet16c> {
   typedef int8_t type;
   typedef Packet8c half;
-  enum
-  {
+  enum {
     size = 16,
     alignment = Aligned16,
     vectorizable = true,
@@ -531,12 +502,11 @@
     masked_store_available = false
   };
 };
-template<> struct unpacket_traits<Packet4uc>
-{
+template <>
+struct unpacket_traits<Packet4uc> {
   typedef uint8_t type;
   typedef Packet4uc half;
-  enum
-  {
+  enum {
     size = 4,
     alignment = Unaligned,
     vectorizable = true,
@@ -544,12 +514,11 @@
     masked_store_available = false
   };
 };
-template<> struct unpacket_traits<Packet8uc>
-{
+template <>
+struct unpacket_traits<Packet8uc> {
   typedef uint8_t type;
   typedef Packet4uc half;
-  enum
-  {
+  enum {
     size = 8,
     alignment = Aligned16,
     vectorizable = true,
@@ -557,24 +526,23 @@
     masked_store_available = false
   };
 };
-template<> struct unpacket_traits<Packet16uc>
-{
+template <>
+struct unpacket_traits<Packet16uc> {
   typedef uint8_t type;
   typedef Packet8uc half;
-  enum
-  {
+  enum {
     size = 16,
     alignment = Aligned16,
     vectorizable = true,
     masked_load_available = false,
-    masked_store_available = false};
+    masked_store_available = false
+  };
 };
-template<> struct unpacket_traits<Packet4s>
-{
+template <>
+struct unpacket_traits<Packet4s> {
   typedef int16_t type;
   typedef Packet4s half;
-  enum
-  {
+  enum {
     size = 4,
     alignment = Aligned16,
     vectorizable = true,
@@ -582,12 +550,11 @@
     masked_store_available = false
   };
 };
-template<> struct unpacket_traits<Packet8s>
-{
+template <>
+struct unpacket_traits<Packet8s> {
   typedef int16_t type;
   typedef Packet4s half;
-  enum
-  {
+  enum {
     size = 8,
     alignment = Aligned16,
     vectorizable = true,
@@ -595,12 +562,11 @@
     masked_store_available = false
   };
 };
-template<> struct unpacket_traits<Packet4us>
-{
+template <>
+struct unpacket_traits<Packet4us> {
   typedef uint16_t type;
   typedef Packet4us half;
-  enum
-  {
+  enum {
     size = 4,
     alignment = Aligned16,
     vectorizable = true,
@@ -608,12 +574,11 @@
     masked_store_available = false
   };
 };
-template<> struct unpacket_traits<Packet8us>
-{
+template <>
+struct unpacket_traits<Packet8us> {
   typedef uint16_t type;
   typedef Packet4us half;
-  enum
-  {
+  enum {
     size = 8,
     alignment = Aligned16,
     vectorizable = true,
@@ -621,12 +586,11 @@
     masked_store_available = false
   };
 };
-template<> struct unpacket_traits<Packet2i>
-{
+template <>
+struct unpacket_traits<Packet2i> {
   typedef int32_t type;
   typedef Packet2i half;
-  enum
-  {
+  enum {
     size = 2,
     alignment = Aligned16,
     vectorizable = true,
@@ -634,12 +598,11 @@
     masked_store_available = false
   };
 };
-template<> struct unpacket_traits<Packet4i>
-{
+template <>
+struct unpacket_traits<Packet4i> {
   typedef int32_t type;
   typedef Packet2i half;
-  enum
-  {
+  enum {
     size = 4,
     alignment = Aligned16,
     vectorizable = true,
@@ -647,12 +610,11 @@
     masked_store_available = false
   };
 };
-template<> struct unpacket_traits<Packet2ui>
-{
+template <>
+struct unpacket_traits<Packet2ui> {
   typedef uint32_t type;
   typedef Packet2ui half;
-  enum
-  {
+  enum {
     size = 2,
     alignment = Aligned16,
     vectorizable = true,
@@ -660,12 +622,11 @@
     masked_store_available = false
   };
 };
-template<> struct unpacket_traits<Packet4ui>
-{
+template <>
+struct unpacket_traits<Packet4ui> {
   typedef uint32_t type;
   typedef Packet2ui half;
-  enum
-  {
+  enum {
     size = 4,
     alignment = Aligned16,
     vectorizable = true,
@@ -673,12 +634,11 @@
     masked_store_available = false
   };
 };
-template<> struct unpacket_traits<Packet2l>
-{
+template <>
+struct unpacket_traits<Packet2l> {
   typedef int64_t type;
   typedef Packet2l half;
-  enum
-  {
+  enum {
     size = 2,
     alignment = Aligned16,
     vectorizable = true,
@@ -686,12 +646,11 @@
     masked_store_available = false
   };
 };
-template<> struct unpacket_traits<Packet2ul>
-{
+template <>
+struct unpacket_traits<Packet2ul> {
   typedef uint64_t type;
   typedef Packet2ul half;
-  enum
-  {
+  enum {
     size = 2,
     alignment = Aligned16,
     vectorizable = true,
@@ -700,1637 +659,2767 @@
   };
 };
 
-template<> EIGEN_STRONG_INLINE Packet2f pset1<Packet2f>(const float& from) { return vdup_n_f32(from); }
-template<> EIGEN_STRONG_INLINE Packet4f pset1<Packet4f>(const float& from) { return vdupq_n_f32(from); }
-template<> EIGEN_STRONG_INLINE Packet4c pset1<Packet4c>(const int8_t& from)
-{ return vget_lane_s32(vreinterpret_s32_s8(vdup_n_s8(from)), 0); }
-template<> EIGEN_STRONG_INLINE Packet8c pset1<Packet8c>(const int8_t& from) { return vdup_n_s8(from); }
-template<> EIGEN_STRONG_INLINE Packet16c pset1<Packet16c>(const int8_t& from) { return vdupq_n_s8(from); }
-template<> EIGEN_STRONG_INLINE Packet4uc pset1<Packet4uc>(const uint8_t& from)
-{ return vget_lane_u32(vreinterpret_u32_u8(vdup_n_u8(from)), 0); }
-template<> EIGEN_STRONG_INLINE Packet8uc pset1<Packet8uc>(const uint8_t& from) { return vdup_n_u8(from); }
-template<> EIGEN_STRONG_INLINE Packet16uc pset1<Packet16uc>(const uint8_t& from) { return vdupq_n_u8(from); }
-template<> EIGEN_STRONG_INLINE Packet4s pset1<Packet4s>(const int16_t& from) { return vdup_n_s16(from); }
-template<> EIGEN_STRONG_INLINE Packet8s pset1<Packet8s>(const int16_t& from) { return vdupq_n_s16(from); }
-template<> EIGEN_STRONG_INLINE Packet4us pset1<Packet4us>(const uint16_t& from) { return vdup_n_u16(from); }
-template<> EIGEN_STRONG_INLINE Packet8us pset1<Packet8us>(const uint16_t& from) { return vdupq_n_u16(from); }
-template<> EIGEN_STRONG_INLINE Packet2i pset1<Packet2i>(const int32_t& from) { return vdup_n_s32(from); }
-template<> EIGEN_STRONG_INLINE Packet4i pset1<Packet4i>(const int32_t& from) { return vdupq_n_s32(from); }
-template<> EIGEN_STRONG_INLINE Packet2ui pset1<Packet2ui>(const uint32_t& from) { return vdup_n_u32(from); }
-template<> EIGEN_STRONG_INLINE Packet4ui pset1<Packet4ui>(const uint32_t& from) { return vdupq_n_u32(from); }
-template<> EIGEN_STRONG_INLINE Packet2l pset1<Packet2l>(const int64_t& from) { return vdupq_n_s64(from); }
-template<> EIGEN_STRONG_INLINE Packet2ul pset1<Packet2ul>(const uint64_t& from) { return vdupq_n_u64(from); }
+template <>
+EIGEN_STRONG_INLINE Packet2f pset1<Packet2f>(const float& from) {
+  return vdup_n_f32(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pset1<Packet4f>(const float& from) {
+  return vdupq_n_f32(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4c pset1<Packet4c>(const int8_t& from) {
+  return vget_lane_s32(vreinterpret_s32_s8(vdup_n_s8(from)), 0);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8c pset1<Packet8c>(const int8_t& from) {
+  return vdup_n_s8(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16c pset1<Packet16c>(const int8_t& from) {
+  return vdupq_n_s8(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4uc pset1<Packet4uc>(const uint8_t& from) {
+  return vget_lane_u32(vreinterpret_u32_u8(vdup_n_u8(from)), 0);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8uc pset1<Packet8uc>(const uint8_t& from) {
+  return vdup_n_u8(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16uc pset1<Packet16uc>(const uint8_t& from) {
+  return vdupq_n_u8(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4s pset1<Packet4s>(const int16_t& from) {
+  return vdup_n_s16(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s pset1<Packet8s>(const int16_t& from) {
+  return vdupq_n_s16(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4us pset1<Packet4us>(const uint16_t& from) {
+  return vdup_n_u16(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us pset1<Packet8us>(const uint16_t& from) {
+  return vdupq_n_u16(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2i pset1<Packet2i>(const int32_t& from) {
+  return vdup_n_s32(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pset1<Packet4i>(const int32_t& from) {
+  return vdupq_n_s32(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ui pset1<Packet2ui>(const uint32_t& from) {
+  return vdup_n_u32(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui pset1<Packet4ui>(const uint32_t& from) {
+  return vdupq_n_u32(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2l pset1<Packet2l>(const int64_t& from) {
+  return vdupq_n_s64(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ul pset1<Packet2ul>(const uint64_t& from) {
+  return vdupq_n_u64(from);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2f pset1frombits<Packet2f>(uint32_t from)
-{ return vreinterpret_f32_u32(vdup_n_u32(from)); }
-template<> EIGEN_STRONG_INLINE Packet4f pset1frombits<Packet4f>(uint32_t from)
-{ return vreinterpretq_f32_u32(vdupq_n_u32(from)); }
+template <>
+EIGEN_STRONG_INLINE Packet2f pset1frombits<Packet2f>(uint32_t from) {
+  return vreinterpret_f32_u32(vdup_n_u32(from));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pset1frombits<Packet4f>(uint32_t from) {
+  return vreinterpretq_f32_u32(vdupq_n_u32(from));
+}
 
-template<> EIGEN_STRONG_INLINE Packet2f plset<Packet2f>(const float& a)
-{
-  const float c[] = {0.0f,1.0f};
+template <>
+EIGEN_STRONG_INLINE Packet2f plset<Packet2f>(const float& a) {
+  const float c[] = {0.0f, 1.0f};
   return vadd_f32(pset1<Packet2f>(a), vld1_f32(c));
 }
-template<> EIGEN_STRONG_INLINE Packet4f plset<Packet4f>(const float& a)
-{
-  const float c[] = {0.0f,1.0f,2.0f,3.0f};
+template <>
+EIGEN_STRONG_INLINE Packet4f plset<Packet4f>(const float& a) {
+  const float c[] = {0.0f, 1.0f, 2.0f, 3.0f};
   return vaddq_f32(pset1<Packet4f>(a), vld1q_f32(c));
 }
-template<> EIGEN_STRONG_INLINE Packet4c plset<Packet4c>(const int8_t& a)
-{ return vget_lane_s32(vreinterpret_s32_s8(vadd_s8(vreinterpret_s8_u32(vdup_n_u32(0x03020100)), vdup_n_s8(a))), 0); }
-template<> EIGEN_STRONG_INLINE Packet8c plset<Packet8c>(const int8_t& a)
-{
-  const int8_t c[] = {0,1,2,3,4,5,6,7};
+template <>
+EIGEN_STRONG_INLINE Packet4c plset<Packet4c>(const int8_t& a) {
+  return vget_lane_s32(vreinterpret_s32_s8(vadd_s8(vreinterpret_s8_u32(vdup_n_u32(0x03020100)), vdup_n_s8(a))), 0);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8c plset<Packet8c>(const int8_t& a) {
+  const int8_t c[] = {0, 1, 2, 3, 4, 5, 6, 7};
   return vadd_s8(pset1<Packet8c>(a), vld1_s8(c));
 }
-template<> EIGEN_STRONG_INLINE Packet16c plset<Packet16c>(const int8_t& a)
-{
-  const int8_t c[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
+template <>
+EIGEN_STRONG_INLINE Packet16c plset<Packet16c>(const int8_t& a) {
+  const int8_t c[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
   return vaddq_s8(pset1<Packet16c>(a), vld1q_s8(c));
 }
-template<> EIGEN_STRONG_INLINE Packet4uc plset<Packet4uc>(const uint8_t& a)
-{ return vget_lane_u32(vreinterpret_u32_u8(vadd_u8(vreinterpret_u8_u32(vdup_n_u32(0x03020100)), vdup_n_u8(a))), 0); }
-template<> EIGEN_STRONG_INLINE Packet8uc plset<Packet8uc>(const uint8_t& a)
-{
-  const uint8_t c[] = {0,1,2,3,4,5,6,7};
+template <>
+EIGEN_STRONG_INLINE Packet4uc plset<Packet4uc>(const uint8_t& a) {
+  return vget_lane_u32(vreinterpret_u32_u8(vadd_u8(vreinterpret_u8_u32(vdup_n_u32(0x03020100)), vdup_n_u8(a))), 0);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8uc plset<Packet8uc>(const uint8_t& a) {
+  const uint8_t c[] = {0, 1, 2, 3, 4, 5, 6, 7};
   return vadd_u8(pset1<Packet8uc>(a), vld1_u8(c));
 }
-template<> EIGEN_STRONG_INLINE Packet16uc plset<Packet16uc>(const uint8_t& a)
-{
-  const uint8_t c[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
+template <>
+EIGEN_STRONG_INLINE Packet16uc plset<Packet16uc>(const uint8_t& a) {
+  const uint8_t c[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
   return vaddq_u8(pset1<Packet16uc>(a), vld1q_u8(c));
 }
-template<> EIGEN_STRONG_INLINE Packet4s plset<Packet4s>(const int16_t& a)
-{
-  const int16_t c[] = {0,1,2,3};
+template <>
+EIGEN_STRONG_INLINE Packet4s plset<Packet4s>(const int16_t& a) {
+  const int16_t c[] = {0, 1, 2, 3};
   return vadd_s16(pset1<Packet4s>(a), vld1_s16(c));
 }
-template<> EIGEN_STRONG_INLINE Packet4us plset<Packet4us>(const uint16_t& a)
-{
-  const uint16_t c[] = {0,1,2,3};
+template <>
+EIGEN_STRONG_INLINE Packet4us plset<Packet4us>(const uint16_t& a) {
+  const uint16_t c[] = {0, 1, 2, 3};
   return vadd_u16(pset1<Packet4us>(a), vld1_u16(c));
 }
-template<> EIGEN_STRONG_INLINE Packet8s plset<Packet8s>(const int16_t& a)
-{
-  const int16_t c[] = {0,1,2,3,4,5,6,7};
+template <>
+EIGEN_STRONG_INLINE Packet8s plset<Packet8s>(const int16_t& a) {
+  const int16_t c[] = {0, 1, 2, 3, 4, 5, 6, 7};
   return vaddq_s16(pset1<Packet8s>(a), vld1q_s16(c));
 }
-template<> EIGEN_STRONG_INLINE Packet8us plset<Packet8us>(const uint16_t& a)
-{
-  const uint16_t c[] = {0,1,2,3,4,5,6,7};
+template <>
+EIGEN_STRONG_INLINE Packet8us plset<Packet8us>(const uint16_t& a) {
+  const uint16_t c[] = {0, 1, 2, 3, 4, 5, 6, 7};
   return vaddq_u16(pset1<Packet8us>(a), vld1q_u16(c));
 }
-template<> EIGEN_STRONG_INLINE Packet2i plset<Packet2i>(const int32_t& a)
-{
-  const int32_t c[] = {0,1};
+template <>
+EIGEN_STRONG_INLINE Packet2i plset<Packet2i>(const int32_t& a) {
+  const int32_t c[] = {0, 1};
   return vadd_s32(pset1<Packet2i>(a), vld1_s32(c));
 }
-template<> EIGEN_STRONG_INLINE Packet4i plset<Packet4i>(const int32_t& a)
-{
-  const int32_t c[] = {0,1,2,3};
+template <>
+EIGEN_STRONG_INLINE Packet4i plset<Packet4i>(const int32_t& a) {
+  const int32_t c[] = {0, 1, 2, 3};
   return vaddq_s32(pset1<Packet4i>(a), vld1q_s32(c));
 }
-template<> EIGEN_STRONG_INLINE Packet2ui plset<Packet2ui>(const uint32_t& a)
-{
-  const uint32_t c[] = {0,1};
+template <>
+EIGEN_STRONG_INLINE Packet2ui plset<Packet2ui>(const uint32_t& a) {
+  const uint32_t c[] = {0, 1};
   return vadd_u32(pset1<Packet2ui>(a), vld1_u32(c));
 }
-template<> EIGEN_STRONG_INLINE Packet4ui plset<Packet4ui>(const uint32_t& a)
-{
-  const uint32_t c[] = {0,1,2,3};
+template <>
+EIGEN_STRONG_INLINE Packet4ui plset<Packet4ui>(const uint32_t& a) {
+  const uint32_t c[] = {0, 1, 2, 3};
   return vaddq_u32(pset1<Packet4ui>(a), vld1q_u32(c));
 }
-template<> EIGEN_STRONG_INLINE Packet2l plset<Packet2l>(const int64_t& a)
-{
-  const int64_t c[] = {0,1};
+template <>
+EIGEN_STRONG_INLINE Packet2l plset<Packet2l>(const int64_t& a) {
+  const int64_t c[] = {0, 1};
   return vaddq_s64(pset1<Packet2l>(a), vld1q_s64(c));
 }
-template<> EIGEN_STRONG_INLINE Packet2ul plset<Packet2ul>(const uint64_t& a)
-{
-  const uint64_t c[] = {0,1};
+template <>
+EIGEN_STRONG_INLINE Packet2ul plset<Packet2ul>(const uint64_t& a) {
+  const uint64_t c[] = {0, 1};
   return vaddq_u64(pset1<Packet2ul>(a), vld1q_u64(c));
 }
 
-template<> EIGEN_STRONG_INLINE Packet2f padd<Packet2f>(const Packet2f& a, const Packet2f& b) { return vadd_f32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4f padd<Packet4f>(const Packet4f& a, const Packet4f& b) { return vaddq_f32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4c padd<Packet4c>(const Packet4c& a, const Packet4c& b)
-{
-  return vget_lane_s32(vreinterpret_s32_s8(vadd_s8(
-      vreinterpret_s8_s32(vdup_n_s32(a)),
-      vreinterpret_s8_s32(vdup_n_s32(b)))), 0);
+template <>
+EIGEN_STRONG_INLINE Packet2f padd<Packet2f>(const Packet2f& a, const Packet2f& b) {
+  return vadd_f32(a, b);
 }
-template<> EIGEN_STRONG_INLINE Packet8c padd<Packet8c>(const Packet8c& a, const Packet8c& b) { return vadd_s8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet16c padd<Packet16c>(const Packet16c& a, const Packet16c& b) { return vaddq_s8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4uc padd<Packet4uc>(const Packet4uc& a, const Packet4uc& b)
-{
-  return vget_lane_u32(vreinterpret_u32_u8(vadd_u8(
-      vreinterpret_u8_u32(vdup_n_u32(a)),
-      vreinterpret_u8_u32(vdup_n_u32(b)))), 0);
+template <>
+EIGEN_STRONG_INLINE Packet4f padd<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return vaddq_f32(a, b);
 }
-template<> EIGEN_STRONG_INLINE Packet8uc padd<Packet8uc>(const Packet8uc& a, const Packet8uc& b) { return vadd_u8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet16uc padd<Packet16uc>(const Packet16uc& a, const Packet16uc& b) { return vaddq_u8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4s padd<Packet4s>(const Packet4s& a, const Packet4s& b) { return vadd_s16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8s padd<Packet8s>(const Packet8s& a, const Packet8s& b) { return vaddq_s16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4us padd<Packet4us>(const Packet4us& a, const Packet4us& b) { return vadd_u16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8us padd<Packet8us>(const Packet8us& a, const Packet8us& b) { return vaddq_u16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2i padd<Packet2i>(const Packet2i& a, const Packet2i& b) { return vadd_s32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4i padd<Packet4i>(const Packet4i& a, const Packet4i& b) { return vaddq_s32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2ui padd<Packet2ui>(const Packet2ui& a, const Packet2ui& b) { return vadd_u32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4ui padd<Packet4ui>(const Packet4ui& a, const Packet4ui& b) { return vaddq_u32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2l padd<Packet2l>(const Packet2l& a, const Packet2l& b) { return vaddq_s64(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2ul padd<Packet2ul>(const Packet2ul& a, const Packet2ul& b) { return vaddq_u64(a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet4c padd<Packet4c>(const Packet4c& a, const Packet4c& b) {
+  return vget_lane_s32(
+      vreinterpret_s32_s8(vadd_s8(vreinterpret_s8_s32(vdup_n_s32(a)), vreinterpret_s8_s32(vdup_n_s32(b)))), 0);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8c padd<Packet8c>(const Packet8c& a, const Packet8c& b) {
+  return vadd_s8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16c padd<Packet16c>(const Packet16c& a, const Packet16c& b) {
+  return vaddq_s8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4uc padd<Packet4uc>(const Packet4uc& a, const Packet4uc& b) {
+  return vget_lane_u32(
+      vreinterpret_u32_u8(vadd_u8(vreinterpret_u8_u32(vdup_n_u32(a)), vreinterpret_u8_u32(vdup_n_u32(b)))), 0);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8uc padd<Packet8uc>(const Packet8uc& a, const Packet8uc& b) {
+  return vadd_u8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16uc padd<Packet16uc>(const Packet16uc& a, const Packet16uc& b) {
+  return vaddq_u8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4s padd<Packet4s>(const Packet4s& a, const Packet4s& b) {
+  return vadd_s16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s padd<Packet8s>(const Packet8s& a, const Packet8s& b) {
+  return vaddq_s16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4us padd<Packet4us>(const Packet4us& a, const Packet4us& b) {
+  return vadd_u16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us padd<Packet8us>(const Packet8us& a, const Packet8us& b) {
+  return vaddq_u16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2i padd<Packet2i>(const Packet2i& a, const Packet2i& b) {
+  return vadd_s32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i padd<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return vaddq_s32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ui padd<Packet2ui>(const Packet2ui& a, const Packet2ui& b) {
+  return vadd_u32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui padd<Packet4ui>(const Packet4ui& a, const Packet4ui& b) {
+  return vaddq_u32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2l padd<Packet2l>(const Packet2l& a, const Packet2l& b) {
+  return vaddq_s64(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ul padd<Packet2ul>(const Packet2ul& a, const Packet2ul& b) {
+  return vaddq_u64(a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2f psub<Packet2f>(const Packet2f& a, const Packet2f& b) { return vsub_f32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4f psub<Packet4f>(const Packet4f& a, const Packet4f& b) { return vsubq_f32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4c psub<Packet4c>(const Packet4c& a, const Packet4c& b)
-{
-  return vget_lane_s32(vreinterpret_s32_s8(vsub_s8(
-      vreinterpret_s8_s32(vdup_n_s32(a)),
-      vreinterpret_s8_s32(vdup_n_s32(b)))), 0);
+template <>
+EIGEN_STRONG_INLINE Packet2f psub<Packet2f>(const Packet2f& a, const Packet2f& b) {
+  return vsub_f32(a, b);
 }
-template<> EIGEN_STRONG_INLINE Packet8c psub<Packet8c>(const Packet8c& a, const Packet8c& b) { return vsub_s8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet16c psub<Packet16c>(const Packet16c& a, const Packet16c& b) { return vsubq_s8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4uc psub<Packet4uc>(const Packet4uc& a, const Packet4uc& b)
-{
-  return vget_lane_u32(vreinterpret_u32_u8(vsub_u8(
-      vreinterpret_u8_u32(vdup_n_u32(a)),
-      vreinterpret_u8_u32(vdup_n_u32(b)))), 0);
+template <>
+EIGEN_STRONG_INLINE Packet4f psub<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return vsubq_f32(a, b);
 }
-template<> EIGEN_STRONG_INLINE Packet8uc psub<Packet8uc>(const Packet8uc& a, const Packet8uc& b) { return vsub_u8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet16uc psub<Packet16uc>(const Packet16uc& a, const Packet16uc& b) { return vsubq_u8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4s psub<Packet4s>(const Packet4s& a, const Packet4s& b) { return vsub_s16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8s psub<Packet8s>(const Packet8s& a, const Packet8s& b) { return vsubq_s16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4us psub<Packet4us>(const Packet4us& a, const Packet4us& b) { return vsub_u16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8us psub<Packet8us>(const Packet8us& a, const Packet8us& b) { return vsubq_u16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2i psub<Packet2i>(const Packet2i& a, const Packet2i& b) { return vsub_s32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4i psub<Packet4i>(const Packet4i& a, const Packet4i& b) { return vsubq_s32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2ui psub<Packet2ui>(const Packet2ui& a, const Packet2ui& b) { return vsub_u32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4ui psub<Packet4ui>(const Packet4ui& a, const Packet4ui& b) { return vsubq_u32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2l psub<Packet2l>(const Packet2l& a, const Packet2l& b) { return vsubq_s64(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2ul psub<Packet2ul>(const Packet2ul& a, const Packet2ul& b) { return vsubq_u64(a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet4c psub<Packet4c>(const Packet4c& a, const Packet4c& b) {
+  return vget_lane_s32(
+      vreinterpret_s32_s8(vsub_s8(vreinterpret_s8_s32(vdup_n_s32(a)), vreinterpret_s8_s32(vdup_n_s32(b)))), 0);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8c psub<Packet8c>(const Packet8c& a, const Packet8c& b) {
+  return vsub_s8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16c psub<Packet16c>(const Packet16c& a, const Packet16c& b) {
+  return vsubq_s8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4uc psub<Packet4uc>(const Packet4uc& a, const Packet4uc& b) {
+  return vget_lane_u32(
+      vreinterpret_u32_u8(vsub_u8(vreinterpret_u8_u32(vdup_n_u32(a)), vreinterpret_u8_u32(vdup_n_u32(b)))), 0);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8uc psub<Packet8uc>(const Packet8uc& a, const Packet8uc& b) {
+  return vsub_u8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16uc psub<Packet16uc>(const Packet16uc& a, const Packet16uc& b) {
+  return vsubq_u8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4s psub<Packet4s>(const Packet4s& a, const Packet4s& b) {
+  return vsub_s16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s psub<Packet8s>(const Packet8s& a, const Packet8s& b) {
+  return vsubq_s16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4us psub<Packet4us>(const Packet4us& a, const Packet4us& b) {
+  return vsub_u16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us psub<Packet8us>(const Packet8us& a, const Packet8us& b) {
+  return vsubq_u16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2i psub<Packet2i>(const Packet2i& a, const Packet2i& b) {
+  return vsub_s32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i psub<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return vsubq_s32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ui psub<Packet2ui>(const Packet2ui& a, const Packet2ui& b) {
+  return vsub_u32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui psub<Packet4ui>(const Packet4ui& a, const Packet4ui& b) {
+  return vsubq_u32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2l psub<Packet2l>(const Packet2l& a, const Packet2l& b) {
+  return vsubq_s64(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ul psub<Packet2ul>(const Packet2ul& a, const Packet2ul& b) {
+  return vsubq_u64(a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2f pxor<Packet2f>(const Packet2f& a, const Packet2f& b);
-template<> EIGEN_STRONG_INLINE Packet2f paddsub<Packet2f>(const Packet2f& a, const Packet2f & b) {
+template <>
+EIGEN_STRONG_INLINE Packet2f pxor<Packet2f>(const Packet2f& a, const Packet2f& b);
+template <>
+EIGEN_STRONG_INLINE Packet2f paddsub<Packet2f>(const Packet2f& a, const Packet2f& b) {
   Packet2f mask = make_packet2f(numext::bit_cast<float>(0x80000000u), 0.0f);
   return padd(a, pxor(mask, b));
 }
-template<> EIGEN_STRONG_INLINE Packet4f pxor<Packet4f>(const Packet4f& a, const Packet4f& b);
-template<> EIGEN_STRONG_INLINE Packet4f paddsub<Packet4f>(const Packet4f& a, const Packet4f& b) {
+template <>
+EIGEN_STRONG_INLINE Packet4f pxor<Packet4f>(const Packet4f& a, const Packet4f& b);
+template <>
+EIGEN_STRONG_INLINE Packet4f paddsub<Packet4f>(const Packet4f& a, const Packet4f& b) {
   Packet4f mask = make_packet4f(numext::bit_cast<float>(0x80000000u), 0.0f, numext::bit_cast<float>(0x80000000u), 0.0f);
   return padd(a, pxor(mask, b));
 }
 
-template<> EIGEN_STRONG_INLINE Packet2f pnegate(const Packet2f& a) { return vneg_f32(a); }
-template<> EIGEN_STRONG_INLINE Packet4f pnegate(const Packet4f& a) { return vnegq_f32(a); }
-template<> EIGEN_STRONG_INLINE Packet4c pnegate(const Packet4c& a)
-{ return vget_lane_s32(vreinterpret_s32_s8(vneg_s8(vreinterpret_s8_s32(vdup_n_s32(a)))), 0); }
-template<> EIGEN_STRONG_INLINE Packet8c pnegate(const Packet8c& a) { return vneg_s8(a); }
-template<> EIGEN_STRONG_INLINE Packet16c pnegate(const Packet16c& a) { return vnegq_s8(a); }
-template<> EIGEN_STRONG_INLINE Packet4s pnegate(const Packet4s& a) { return vneg_s16(a); }
-template<> EIGEN_STRONG_INLINE Packet8s pnegate(const Packet8s& a) { return vnegq_s16(a); }
-template<> EIGEN_STRONG_INLINE Packet2i pnegate(const Packet2i& a) { return vneg_s32(a); }
-template<> EIGEN_STRONG_INLINE Packet4i pnegate(const Packet4i& a) { return vnegq_s32(a); }
-template<> EIGEN_STRONG_INLINE Packet2l pnegate(const Packet2l& a) {
+template <>
+EIGEN_STRONG_INLINE Packet2f pnegate(const Packet2f& a) {
+  return vneg_f32(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pnegate(const Packet4f& a) {
+  return vnegq_f32(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4c pnegate(const Packet4c& a) {
+  return vget_lane_s32(vreinterpret_s32_s8(vneg_s8(vreinterpret_s8_s32(vdup_n_s32(a)))), 0);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8c pnegate(const Packet8c& a) {
+  return vneg_s8(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16c pnegate(const Packet16c& a) {
+  return vnegq_s8(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4s pnegate(const Packet4s& a) {
+  return vneg_s16(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s pnegate(const Packet8s& a) {
+  return vnegq_s16(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2i pnegate(const Packet2i& a) {
+  return vneg_s32(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pnegate(const Packet4i& a) {
+  return vnegq_s32(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2l pnegate(const Packet2l& a) {
 #if EIGEN_ARCH_ARM64
   return vnegq_s64(a);
 #else
-  return vcombine_s64(
-      vdup_n_s64(-vgetq_lane_s64(a, 0)),
-      vdup_n_s64(-vgetq_lane_s64(a, 1)));
+  return vcombine_s64(vdup_n_s64(-vgetq_lane_s64(a, 0)), vdup_n_s64(-vgetq_lane_s64(a, 1)));
 #endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet2f pconj(const Packet2f& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet4f pconj(const Packet4f& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet4c pconj(const Packet4c& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet8c pconj(const Packet8c& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet16c pconj(const Packet16c& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet4uc pconj(const Packet4uc& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet8uc pconj(const Packet8uc& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet16uc pconj(const Packet16uc& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet4s pconj(const Packet4s& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet8s pconj(const Packet8s& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet4us pconj(const Packet4us& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet8us pconj(const Packet8us& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet2i pconj(const Packet2i& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet4i pconj(const Packet4i& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet2ui pconj(const Packet2ui& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet4ui pconj(const Packet4ui& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet2l pconj(const Packet2l& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet2ul pconj(const Packet2ul& a) { return a; }
-
-template<> EIGEN_STRONG_INLINE Packet2f pmul<Packet2f>(const Packet2f& a, const Packet2f& b) { return vmul_f32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4f pmul<Packet4f>(const Packet4f& a, const Packet4f& b) { return vmulq_f32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4c pmul<Packet4c>(const Packet4c& a, const Packet4c& b)
-{
-  return vget_lane_s32(vreinterpret_s32_s8(vmul_s8(
-      vreinterpret_s8_s32(vdup_n_s32(a)),
-      vreinterpret_s8_s32(vdup_n_s32(b)))), 0);
+template <>
+EIGEN_STRONG_INLINE Packet2f pconj(const Packet2f& a) {
+  return a;
 }
-template<> EIGEN_STRONG_INLINE Packet8c pmul<Packet8c>(const Packet8c& a, const Packet8c& b) { return vmul_s8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet16c pmul<Packet16c>(const Packet16c& a, const Packet16c& b) { return vmulq_s8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4uc pmul<Packet4uc>(const Packet4uc& a, const Packet4uc& b)
-{
-  return vget_lane_u32(vreinterpret_u32_u8(vmul_u8(
-      vreinterpret_u8_u32(vdup_n_u32(a)),
-      vreinterpret_u8_u32(vdup_n_u32(b)))), 0);
+template <>
+EIGEN_STRONG_INLINE Packet4f pconj(const Packet4f& a) {
+  return a;
 }
-template<> EIGEN_STRONG_INLINE Packet8uc pmul<Packet8uc>(const Packet8uc& a, const Packet8uc& b) { return vmul_u8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet16uc pmul<Packet16uc>(const Packet16uc& a, const Packet16uc& b) { return vmulq_u8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4s pmul<Packet4s>(const Packet4s& a, const Packet4s& b) { return vmul_s16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8s pmul<Packet8s>(const Packet8s& a, const Packet8s& b) { return vmulq_s16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4us pmul<Packet4us>(const Packet4us& a, const Packet4us& b) { return vmul_u16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8us pmul<Packet8us>(const Packet8us& a, const Packet8us& b) { return vmulq_u16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2i pmul<Packet2i>(const Packet2i& a, const Packet2i& b) { return vmul_s32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4i pmul<Packet4i>(const Packet4i& a, const Packet4i& b) { return vmulq_s32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2ui pmul<Packet2ui>(const Packet2ui& a, const Packet2ui& b) { return vmul_u32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4ui pmul<Packet4ui>(const Packet4ui& a, const Packet4ui& b) { return vmulq_u32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2l pmul<Packet2l>(const Packet2l& a, const Packet2l& b) {
-  return vcombine_s64(
-    vdup_n_s64(vgetq_lane_s64(a, 0)*vgetq_lane_s64(b, 0)),
-    vdup_n_s64(vgetq_lane_s64(a, 1)*vgetq_lane_s64(b, 1)));
+template <>
+EIGEN_STRONG_INLINE Packet4c pconj(const Packet4c& a) {
+  return a;
 }
-template<> EIGEN_STRONG_INLINE Packet2ul pmul<Packet2ul>(const Packet2ul& a, const Packet2ul& b) {
-  return vcombine_u64(
-    vdup_n_u64(vgetq_lane_u64(a, 0)*vgetq_lane_u64(b, 0)),
-    vdup_n_u64(vgetq_lane_u64(a, 1)*vgetq_lane_u64(b, 1)));
+template <>
+EIGEN_STRONG_INLINE Packet8c pconj(const Packet8c& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet16c pconj(const Packet16c& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet4uc pconj(const Packet4uc& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet8uc pconj(const Packet8uc& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet16uc pconj(const Packet16uc& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet4s pconj(const Packet4s& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s pconj(const Packet8s& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet4us pconj(const Packet4us& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us pconj(const Packet8us& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet2i pconj(const Packet2i& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pconj(const Packet4i& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ui pconj(const Packet2ui& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui pconj(const Packet4ui& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet2l pconj(const Packet2l& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ul pconj(const Packet2ul& a) {
+  return a;
 }
 
-template<> EIGEN_STRONG_INLINE Packet4c pdiv<Packet4c>(const Packet4c& /*a*/, const Packet4c& /*b*/)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2f pmul<Packet2f>(const Packet2f& a, const Packet2f& b) {
+  return vmul_f32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pmul<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return vmulq_f32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4c pmul<Packet4c>(const Packet4c& a, const Packet4c& b) {
+  return vget_lane_s32(
+      vreinterpret_s32_s8(vmul_s8(vreinterpret_s8_s32(vdup_n_s32(a)), vreinterpret_s8_s32(vdup_n_s32(b)))), 0);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8c pmul<Packet8c>(const Packet8c& a, const Packet8c& b) {
+  return vmul_s8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16c pmul<Packet16c>(const Packet16c& a, const Packet16c& b) {
+  return vmulq_s8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4uc pmul<Packet4uc>(const Packet4uc& a, const Packet4uc& b) {
+  return vget_lane_u32(
+      vreinterpret_u32_u8(vmul_u8(vreinterpret_u8_u32(vdup_n_u32(a)), vreinterpret_u8_u32(vdup_n_u32(b)))), 0);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8uc pmul<Packet8uc>(const Packet8uc& a, const Packet8uc& b) {
+  return vmul_u8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16uc pmul<Packet16uc>(const Packet16uc& a, const Packet16uc& b) {
+  return vmulq_u8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4s pmul<Packet4s>(const Packet4s& a, const Packet4s& b) {
+  return vmul_s16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s pmul<Packet8s>(const Packet8s& a, const Packet8s& b) {
+  return vmulq_s16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4us pmul<Packet4us>(const Packet4us& a, const Packet4us& b) {
+  return vmul_u16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us pmul<Packet8us>(const Packet8us& a, const Packet8us& b) {
+  return vmulq_u16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2i pmul<Packet2i>(const Packet2i& a, const Packet2i& b) {
+  return vmul_s32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pmul<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return vmulq_s32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ui pmul<Packet2ui>(const Packet2ui& a, const Packet2ui& b) {
+  return vmul_u32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui pmul<Packet4ui>(const Packet4ui& a, const Packet4ui& b) {
+  return vmulq_u32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2l pmul<Packet2l>(const Packet2l& a, const Packet2l& b) {
+  return vcombine_s64(vdup_n_s64(vgetq_lane_s64(a, 0) * vgetq_lane_s64(b, 0)),
+                      vdup_n_s64(vgetq_lane_s64(a, 1) * vgetq_lane_s64(b, 1)));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ul pmul<Packet2ul>(const Packet2ul& a, const Packet2ul& b) {
+  return vcombine_u64(vdup_n_u64(vgetq_lane_u64(a, 0) * vgetq_lane_u64(b, 0)),
+                      vdup_n_u64(vgetq_lane_u64(a, 1) * vgetq_lane_u64(b, 1)));
+}
+
+template <>
+EIGEN_STRONG_INLINE Packet4c pdiv<Packet4c>(const Packet4c& /*a*/, const Packet4c& /*b*/) {
   eigen_assert(false && "packet integer division are not supported by NEON");
   return pset1<Packet4c>(0);
 }
-template<> EIGEN_STRONG_INLINE Packet8c pdiv<Packet8c>(const Packet8c& /*a*/, const Packet8c& /*b*/)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8c pdiv<Packet8c>(const Packet8c& /*a*/, const Packet8c& /*b*/) {
   eigen_assert(false && "packet integer division are not supported by NEON");
   return pset1<Packet8c>(0);
 }
-template<> EIGEN_STRONG_INLINE Packet16c pdiv<Packet16c>(const Packet16c& /*a*/, const Packet16c& /*b*/)
-{
+template <>
+EIGEN_STRONG_INLINE Packet16c pdiv<Packet16c>(const Packet16c& /*a*/, const Packet16c& /*b*/) {
   eigen_assert(false && "packet integer division are not supported by NEON");
   return pset1<Packet16c>(0);
 }
-template<> EIGEN_STRONG_INLINE Packet4uc pdiv<Packet4uc>(const Packet4uc& /*a*/, const Packet4uc& /*b*/)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4uc pdiv<Packet4uc>(const Packet4uc& /*a*/, const Packet4uc& /*b*/) {
   eigen_assert(false && "packet integer division are not supported by NEON");
   return pset1<Packet4uc>(0);
 }
-template<> EIGEN_STRONG_INLINE Packet8uc pdiv<Packet8uc>(const Packet8uc& /*a*/, const Packet8uc& /*b*/)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8uc pdiv<Packet8uc>(const Packet8uc& /*a*/, const Packet8uc& /*b*/) {
   eigen_assert(false && "packet integer division are not supported by NEON");
   return pset1<Packet8uc>(0);
 }
-template<> EIGEN_STRONG_INLINE Packet16uc pdiv<Packet16uc>(const Packet16uc& /*a*/, const Packet16uc& /*b*/)
-{
+template <>
+EIGEN_STRONG_INLINE Packet16uc pdiv<Packet16uc>(const Packet16uc& /*a*/, const Packet16uc& /*b*/) {
   eigen_assert(false && "packet integer division are not supported by NEON");
   return pset1<Packet16uc>(0);
 }
-template<> EIGEN_STRONG_INLINE Packet4s pdiv<Packet4s>(const Packet4s& /*a*/, const Packet4s& /*b*/)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4s pdiv<Packet4s>(const Packet4s& /*a*/, const Packet4s& /*b*/) {
   eigen_assert(false && "packet integer division are not supported by NEON");
   return pset1<Packet4s>(0);
 }
-template<> EIGEN_STRONG_INLINE Packet8s pdiv<Packet8s>(const Packet8s& /*a*/, const Packet8s& /*b*/)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8s pdiv<Packet8s>(const Packet8s& /*a*/, const Packet8s& /*b*/) {
   eigen_assert(false && "packet integer division are not supported by NEON");
   return pset1<Packet8s>(0);
 }
-template<> EIGEN_STRONG_INLINE Packet4us pdiv<Packet4us>(const Packet4us& /*a*/, const Packet4us& /*b*/)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4us pdiv<Packet4us>(const Packet4us& /*a*/, const Packet4us& /*b*/) {
   eigen_assert(false && "packet integer division are not supported by NEON");
   return pset1<Packet4us>(0);
 }
-template<> EIGEN_STRONG_INLINE Packet8us pdiv<Packet8us>(const Packet8us& /*a*/, const Packet8us& /*b*/)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8us pdiv<Packet8us>(const Packet8us& /*a*/, const Packet8us& /*b*/) {
   eigen_assert(false && "packet integer division are not supported by NEON");
   return pset1<Packet8us>(0);
 }
-template<> EIGEN_STRONG_INLINE Packet2i pdiv<Packet2i>(const Packet2i& /*a*/, const Packet2i& /*b*/)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2i pdiv<Packet2i>(const Packet2i& /*a*/, const Packet2i& /*b*/) {
   eigen_assert(false && "packet integer division are not supported by NEON");
   return pset1<Packet2i>(0);
 }
-template<> EIGEN_STRONG_INLINE Packet4i pdiv<Packet4i>(const Packet4i& /*a*/, const Packet4i& /*b*/)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4i pdiv<Packet4i>(const Packet4i& /*a*/, const Packet4i& /*b*/) {
   eigen_assert(false && "packet integer division are not supported by NEON");
   return pset1<Packet4i>(0);
 }
-template<> EIGEN_STRONG_INLINE Packet2ui pdiv<Packet2ui>(const Packet2ui& /*a*/, const Packet2ui& /*b*/)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2ui pdiv<Packet2ui>(const Packet2ui& /*a*/, const Packet2ui& /*b*/) {
   eigen_assert(false && "packet integer division are not supported by NEON");
   return pset1<Packet2ui>(0);
 }
-template<> EIGEN_STRONG_INLINE Packet4ui pdiv<Packet4ui>(const Packet4ui& /*a*/, const Packet4ui& /*b*/)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4ui pdiv<Packet4ui>(const Packet4ui& /*a*/, const Packet4ui& /*b*/) {
   eigen_assert(false && "packet integer division are not supported by NEON");
   return pset1<Packet4ui>(0);
 }
-template<> EIGEN_STRONG_INLINE Packet2l pdiv<Packet2l>(const Packet2l& /*a*/, const Packet2l& /*b*/)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2l pdiv<Packet2l>(const Packet2l& /*a*/, const Packet2l& /*b*/) {
   eigen_assert(false && "packet integer division are not supported by NEON");
   return pset1<Packet2l>(0LL);
 }
-template<> EIGEN_STRONG_INLINE Packet2ul pdiv<Packet2ul>(const Packet2ul& /*a*/, const Packet2ul& /*b*/)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2ul pdiv<Packet2ul>(const Packet2ul& /*a*/, const Packet2ul& /*b*/) {
   eigen_assert(false && "packet integer division are not supported by NEON");
   return pset1<Packet2ul>(0ULL);
 }
 
-
 #ifdef __ARM_FEATURE_FMA
-template<> EIGEN_STRONG_INLINE Packet4f pmadd(const Packet4f& a, const Packet4f& b, const Packet4f& c)
-{ return vfmaq_f32(c,a,b); }
-template<> EIGEN_STRONG_INLINE Packet2f pmadd(const Packet2f& a, const Packet2f& b, const Packet2f& c)
-{ return vfma_f32(c,a,b); }
-#else
-template<> EIGEN_STRONG_INLINE Packet4f pmadd(const Packet4f& a, const Packet4f& b, const Packet4f& c)
-{
-  return vmlaq_f32(c,a,b);
+template <>
+EIGEN_STRONG_INLINE Packet4f pmadd(const Packet4f& a, const Packet4f& b, const Packet4f& c) {
+  return vfmaq_f32(c, a, b);
 }
-template<> EIGEN_STRONG_INLINE Packet2f pmadd(const Packet2f& a, const Packet2f& b, const Packet2f& c)
-{
-  return vmla_f32(c,a,b);
+template <>
+EIGEN_STRONG_INLINE Packet2f pmadd(const Packet2f& a, const Packet2f& b, const Packet2f& c) {
+  return vfma_f32(c, a, b);
+}
+#else
+template <>
+EIGEN_STRONG_INLINE Packet4f pmadd(const Packet4f& a, const Packet4f& b, const Packet4f& c) {
+  return vmlaq_f32(c, a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2f pmadd(const Packet2f& a, const Packet2f& b, const Packet2f& c) {
+  return vmla_f32(c, a, b);
 }
 #endif
 
 // No FMA instruction for int, so use MLA unconditionally.
-template<> EIGEN_STRONG_INLINE Packet4c pmadd(const Packet4c& a, const Packet4c& b, const Packet4c& c)
-{
-  return vget_lane_s32(vreinterpret_s32_s8(vmla_s8(
-      vreinterpret_s8_s32(vdup_n_s32(c)),
-      vreinterpret_s8_s32(vdup_n_s32(a)),
-      vreinterpret_s8_s32(vdup_n_s32(b)))), 0);
+template <>
+EIGEN_STRONG_INLINE Packet4c pmadd(const Packet4c& a, const Packet4c& b, const Packet4c& c) {
+  return vget_lane_s32(
+      vreinterpret_s32_s8(vmla_s8(vreinterpret_s8_s32(vdup_n_s32(c)), vreinterpret_s8_s32(vdup_n_s32(a)),
+                                  vreinterpret_s8_s32(vdup_n_s32(b)))),
+      0);
 }
-template<> EIGEN_STRONG_INLINE Packet8c pmadd(const Packet8c& a, const Packet8c& b, const Packet8c& c)
-{ return vmla_s8(c,a,b); }
-template<> EIGEN_STRONG_INLINE Packet16c pmadd(const Packet16c& a, const Packet16c& b, const Packet16c& c)
-{ return vmlaq_s8(c,a,b); }
-template<> EIGEN_STRONG_INLINE Packet4uc pmadd(const Packet4uc& a, const Packet4uc& b, const Packet4uc& c)
-{
-  return vget_lane_u32(vreinterpret_u32_u8(vmla_u8(
-      vreinterpret_u8_u32(vdup_n_u32(c)),
-      vreinterpret_u8_u32(vdup_n_u32(a)),
-      vreinterpret_u8_u32(vdup_n_u32(b)))), 0);
+template <>
+EIGEN_STRONG_INLINE Packet8c pmadd(const Packet8c& a, const Packet8c& b, const Packet8c& c) {
+  return vmla_s8(c, a, b);
 }
-template<> EIGEN_STRONG_INLINE Packet8uc pmadd(const Packet8uc& a, const Packet8uc& b, const Packet8uc& c)
-{ return vmla_u8(c,a,b); }
-template<> EIGEN_STRONG_INLINE Packet16uc pmadd(const Packet16uc& a, const Packet16uc& b, const Packet16uc& c)
-{ return vmlaq_u8(c,a,b); }
-template<> EIGEN_STRONG_INLINE Packet4s pmadd(const Packet4s& a, const Packet4s& b, const Packet4s& c)
-{ return vmla_s16(c,a,b); }
-template<> EIGEN_STRONG_INLINE Packet8s pmadd(const Packet8s& a, const Packet8s& b, const Packet8s& c)
-{ return vmlaq_s16(c,a,b); }
-template<> EIGEN_STRONG_INLINE Packet4us pmadd(const Packet4us& a, const Packet4us& b, const Packet4us& c)
-{ return vmla_u16(c,a,b); }
-template<> EIGEN_STRONG_INLINE Packet8us pmadd(const Packet8us& a, const Packet8us& b, const Packet8us& c)
-{ return vmlaq_u16(c,a,b); }
-template<> EIGEN_STRONG_INLINE Packet2i pmadd(const Packet2i& a, const Packet2i& b, const Packet2i& c)
-{ return vmla_s32(c,a,b); }
-template<> EIGEN_STRONG_INLINE Packet4i pmadd(const Packet4i& a, const Packet4i& b, const Packet4i& c)
-{ return vmlaq_s32(c,a,b); }
-template<> EIGEN_STRONG_INLINE Packet2ui pmadd(const Packet2ui& a, const Packet2ui& b, const Packet2ui& c)
-{ return vmla_u32(c,a,b); }
-template<> EIGEN_STRONG_INLINE Packet4ui pmadd(const Packet4ui& a, const Packet4ui& b, const Packet4ui& c)
-{ return vmlaq_u32(c,a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet16c pmadd(const Packet16c& a, const Packet16c& b, const Packet16c& c) {
+  return vmlaq_s8(c, a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4uc pmadd(const Packet4uc& a, const Packet4uc& b, const Packet4uc& c) {
+  return vget_lane_u32(
+      vreinterpret_u32_u8(vmla_u8(vreinterpret_u8_u32(vdup_n_u32(c)), vreinterpret_u8_u32(vdup_n_u32(a)),
+                                  vreinterpret_u8_u32(vdup_n_u32(b)))),
+      0);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8uc pmadd(const Packet8uc& a, const Packet8uc& b, const Packet8uc& c) {
+  return vmla_u8(c, a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16uc pmadd(const Packet16uc& a, const Packet16uc& b, const Packet16uc& c) {
+  return vmlaq_u8(c, a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4s pmadd(const Packet4s& a, const Packet4s& b, const Packet4s& c) {
+  return vmla_s16(c, a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s pmadd(const Packet8s& a, const Packet8s& b, const Packet8s& c) {
+  return vmlaq_s16(c, a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4us pmadd(const Packet4us& a, const Packet4us& b, const Packet4us& c) {
+  return vmla_u16(c, a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us pmadd(const Packet8us& a, const Packet8us& b, const Packet8us& c) {
+  return vmlaq_u16(c, a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2i pmadd(const Packet2i& a, const Packet2i& b, const Packet2i& c) {
+  return vmla_s32(c, a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pmadd(const Packet4i& a, const Packet4i& b, const Packet4i& c) {
+  return vmlaq_s32(c, a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ui pmadd(const Packet2ui& a, const Packet2ui& b, const Packet2ui& c) {
+  return vmla_u32(c, a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui pmadd(const Packet4ui& a, const Packet4ui& b, const Packet4ui& c) {
+  return vmlaq_u32(c, a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2f pabsdiff<Packet2f>(const Packet2f& a, const Packet2f& b)
-{ return vabd_f32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4f pabsdiff<Packet4f>(const Packet4f& a, const Packet4f& b)
-{ return vabdq_f32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4c pabsdiff<Packet4c>(const Packet4c& a, const Packet4c& b)
-{
-  return vget_lane_s32(vreinterpret_s32_s8(vabd_s8(
-      vreinterpret_s8_s32(vdup_n_s32(a)),
-      vreinterpret_s8_s32(vdup_n_s32(b)))), 0);
+template <>
+EIGEN_STRONG_INLINE Packet2f pabsdiff<Packet2f>(const Packet2f& a, const Packet2f& b) {
+  return vabd_f32(a, b);
 }
-template<> EIGEN_STRONG_INLINE Packet8c pabsdiff<Packet8c>(const Packet8c& a, const Packet8c& b)
-{ return vabd_s8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet16c pabsdiff<Packet16c>(const Packet16c& a, const Packet16c& b)
-{ return vabdq_s8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4uc pabsdiff<Packet4uc>(const Packet4uc& a, const Packet4uc& b)
-{
-  return vget_lane_u32(vreinterpret_u32_u8(vabd_u8(
-      vreinterpret_u8_u32(vdup_n_u32(a)),
-      vreinterpret_u8_u32(vdup_n_u32(b)))), 0);
+template <>
+EIGEN_STRONG_INLINE Packet4f pabsdiff<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return vabdq_f32(a, b);
 }
-template<> EIGEN_STRONG_INLINE Packet8uc pabsdiff<Packet8uc>(const Packet8uc& a, const Packet8uc& b)
-{ return vabd_u8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet16uc pabsdiff<Packet16uc>(const Packet16uc& a, const Packet16uc& b)
-{ return vabdq_u8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4s pabsdiff<Packet4s>(const Packet4s& a, const Packet4s& b)
-{ return vabd_s16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8s pabsdiff<Packet8s>(const Packet8s& a, const Packet8s& b)
-{ return vabdq_s16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4us pabsdiff<Packet4us>(const Packet4us& a, const Packet4us& b)
-{ return vabd_u16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8us pabsdiff<Packet8us>(const Packet8us& a, const Packet8us& b)
-{ return vabdq_u16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2i pabsdiff<Packet2i>(const Packet2i& a, const Packet2i& b)
-{ return vabd_s32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4i pabsdiff<Packet4i>(const Packet4i& a, const Packet4i& b)
-{ return vabdq_s32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2ui pabsdiff<Packet2ui>(const Packet2ui& a, const Packet2ui& b)
-{ return vabd_u32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4ui pabsdiff<Packet4ui>(const Packet4ui& a, const Packet4ui& b)
-{ return vabdq_u32(a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet4c pabsdiff<Packet4c>(const Packet4c& a, const Packet4c& b) {
+  return vget_lane_s32(
+      vreinterpret_s32_s8(vabd_s8(vreinterpret_s8_s32(vdup_n_s32(a)), vreinterpret_s8_s32(vdup_n_s32(b)))), 0);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8c pabsdiff<Packet8c>(const Packet8c& a, const Packet8c& b) {
+  return vabd_s8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16c pabsdiff<Packet16c>(const Packet16c& a, const Packet16c& b) {
+  return vabdq_s8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4uc pabsdiff<Packet4uc>(const Packet4uc& a, const Packet4uc& b) {
+  return vget_lane_u32(
+      vreinterpret_u32_u8(vabd_u8(vreinterpret_u8_u32(vdup_n_u32(a)), vreinterpret_u8_u32(vdup_n_u32(b)))), 0);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8uc pabsdiff<Packet8uc>(const Packet8uc& a, const Packet8uc& b) {
+  return vabd_u8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16uc pabsdiff<Packet16uc>(const Packet16uc& a, const Packet16uc& b) {
+  return vabdq_u8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4s pabsdiff<Packet4s>(const Packet4s& a, const Packet4s& b) {
+  return vabd_s16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s pabsdiff<Packet8s>(const Packet8s& a, const Packet8s& b) {
+  return vabdq_s16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4us pabsdiff<Packet4us>(const Packet4us& a, const Packet4us& b) {
+  return vabd_u16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us pabsdiff<Packet8us>(const Packet8us& a, const Packet8us& b) {
+  return vabdq_u16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2i pabsdiff<Packet2i>(const Packet2i& a, const Packet2i& b) {
+  return vabd_s32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pabsdiff<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return vabdq_s32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ui pabsdiff<Packet2ui>(const Packet2ui& a, const Packet2ui& b) {
+  return vabd_u32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui pabsdiff<Packet4ui>(const Packet4ui& a, const Packet4ui& b) {
+  return vabdq_u32(a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2f pmin<Packet2f>(const Packet2f& a, const Packet2f& b) { return vmin_f32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4f pmin<Packet4f>(const Packet4f& a, const Packet4f& b) { return vminq_f32(a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet2f pmin<Packet2f>(const Packet2f& a, const Packet2f& b) {
+  return vmin_f32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pmin<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return vminq_f32(a, b);
+}
 
 #ifdef __ARM_FEATURE_NUMERIC_MAXMIN
-// numeric max and min are only available if ARM_FEATURE_NUMERIC_MAXMIN is defined (which can only be the case for Armv8 systems).
-template<> EIGEN_STRONG_INLINE Packet4f pmin<PropagateNumbers, Packet4f>(const Packet4f& a, const Packet4f& b) { return vminnmq_f32(a, b); }
-template<> EIGEN_STRONG_INLINE Packet2f pmin<PropagateNumbers, Packet2f>(const Packet2f& a, const Packet2f& b) { return vminnm_f32(a, b); }
+// numeric max and min are only available if ARM_FEATURE_NUMERIC_MAXMIN is defined (which can only be the case for Armv8
+// systems).
+template <>
+EIGEN_STRONG_INLINE Packet4f pmin<PropagateNumbers, Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return vminnmq_f32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2f pmin<PropagateNumbers, Packet2f>(const Packet2f& a, const Packet2f& b) {
+  return vminnm_f32(a, b);
+}
 #endif
 
-template<> EIGEN_STRONG_INLINE Packet4f pmin<PropagateNaN, Packet4f>(const Packet4f& a, const Packet4f& b) { return pmin<Packet4f>(a, b); }
-
-template<> EIGEN_STRONG_INLINE Packet2f pmin<PropagateNaN, Packet2f>(const Packet2f& a, const Packet2f& b) { return pmin<Packet2f>(a, b); }
-
-template<> EIGEN_STRONG_INLINE Packet4c pmin<Packet4c>(const Packet4c& a, const Packet4c& b)
-{
-  return vget_lane_s32(vreinterpret_s32_s8(vmin_s8(
-      vreinterpret_s8_s32(vdup_n_s32(a)),
-      vreinterpret_s8_s32(vdup_n_s32(b)))), 0);
-}
-template<> EIGEN_STRONG_INLINE Packet8c pmin<Packet8c>(const Packet8c& a, const Packet8c& b) { return vmin_s8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet16c pmin<Packet16c>(const Packet16c& a, const Packet16c& b) { return vminq_s8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4uc pmin<Packet4uc>(const Packet4uc& a, const Packet4uc& b)
-{
-  return vget_lane_u32(vreinterpret_u32_u8(vmin_u8(
-      vreinterpret_u8_u32(vdup_n_u32(a)),
-      vreinterpret_u8_u32(vdup_n_u32(b)))), 0);
-}
-template<> EIGEN_STRONG_INLINE Packet8uc pmin<Packet8uc>(const Packet8uc& a, const Packet8uc& b) { return vmin_u8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet16uc pmin<Packet16uc>(const Packet16uc& a, const Packet16uc& b) { return vminq_u8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4s pmin<Packet4s>(const Packet4s& a, const Packet4s& b) { return vmin_s16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8s pmin<Packet8s>(const Packet8s& a, const Packet8s& b) { return vminq_s16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4us pmin<Packet4us>(const Packet4us& a, const Packet4us& b) { return vmin_u16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8us pmin<Packet8us>(const Packet8us& a, const Packet8us& b) { return vminq_u16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2i pmin<Packet2i>(const Packet2i& a, const Packet2i& b) { return vmin_s32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4i pmin<Packet4i>(const Packet4i& a, const Packet4i& b) { return vminq_s32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2ui pmin<Packet2ui>(const Packet2ui& a, const Packet2ui& b) { return vmin_u32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4ui pmin<Packet4ui>(const Packet4ui& a, const Packet4ui& b) { return vminq_u32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2l pmin<Packet2l>(const Packet2l& a, const Packet2l& b) {
-  return vcombine_s64(
-      vdup_n_s64((std::min)(vgetq_lane_s64(a, 0), vgetq_lane_s64(b, 0))),
-      vdup_n_s64((std::min)(vgetq_lane_s64(a, 1), vgetq_lane_s64(b, 1))));
-}
-template<> EIGEN_STRONG_INLINE Packet2ul pmin<Packet2ul>(const Packet2ul& a, const Packet2ul& b) {
-  return vcombine_u64(
-      vdup_n_u64((std::min)(vgetq_lane_u64(a, 0), vgetq_lane_u64(b, 0))),
-      vdup_n_u64((std::min)(vgetq_lane_u64(a, 1), vgetq_lane_u64(b, 1))));
+template <>
+EIGEN_STRONG_INLINE Packet4f pmin<PropagateNaN, Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return pmin<Packet4f>(a, b);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2f pmax<Packet2f>(const Packet2f& a, const Packet2f& b) { return vmax_f32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4f pmax<Packet4f>(const Packet4f& a, const Packet4f& b) { return vmaxq_f32(a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet2f pmin<PropagateNaN, Packet2f>(const Packet2f& a, const Packet2f& b) {
+  return pmin<Packet2f>(a, b);
+}
+
+template <>
+EIGEN_STRONG_INLINE Packet4c pmin<Packet4c>(const Packet4c& a, const Packet4c& b) {
+  return vget_lane_s32(
+      vreinterpret_s32_s8(vmin_s8(vreinterpret_s8_s32(vdup_n_s32(a)), vreinterpret_s8_s32(vdup_n_s32(b)))), 0);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8c pmin<Packet8c>(const Packet8c& a, const Packet8c& b) {
+  return vmin_s8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16c pmin<Packet16c>(const Packet16c& a, const Packet16c& b) {
+  return vminq_s8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4uc pmin<Packet4uc>(const Packet4uc& a, const Packet4uc& b) {
+  return vget_lane_u32(
+      vreinterpret_u32_u8(vmin_u8(vreinterpret_u8_u32(vdup_n_u32(a)), vreinterpret_u8_u32(vdup_n_u32(b)))), 0);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8uc pmin<Packet8uc>(const Packet8uc& a, const Packet8uc& b) {
+  return vmin_u8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16uc pmin<Packet16uc>(const Packet16uc& a, const Packet16uc& b) {
+  return vminq_u8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4s pmin<Packet4s>(const Packet4s& a, const Packet4s& b) {
+  return vmin_s16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s pmin<Packet8s>(const Packet8s& a, const Packet8s& b) {
+  return vminq_s16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4us pmin<Packet4us>(const Packet4us& a, const Packet4us& b) {
+  return vmin_u16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us pmin<Packet8us>(const Packet8us& a, const Packet8us& b) {
+  return vminq_u16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2i pmin<Packet2i>(const Packet2i& a, const Packet2i& b) {
+  return vmin_s32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pmin<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return vminq_s32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ui pmin<Packet2ui>(const Packet2ui& a, const Packet2ui& b) {
+  return vmin_u32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui pmin<Packet4ui>(const Packet4ui& a, const Packet4ui& b) {
+  return vminq_u32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2l pmin<Packet2l>(const Packet2l& a, const Packet2l& b) {
+  return vcombine_s64(vdup_n_s64((std::min)(vgetq_lane_s64(a, 0), vgetq_lane_s64(b, 0))),
+                      vdup_n_s64((std::min)(vgetq_lane_s64(a, 1), vgetq_lane_s64(b, 1))));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ul pmin<Packet2ul>(const Packet2ul& a, const Packet2ul& b) {
+  return vcombine_u64(vdup_n_u64((std::min)(vgetq_lane_u64(a, 0), vgetq_lane_u64(b, 0))),
+                      vdup_n_u64((std::min)(vgetq_lane_u64(a, 1), vgetq_lane_u64(b, 1))));
+}
+
+template <>
+EIGEN_STRONG_INLINE Packet2f pmax<Packet2f>(const Packet2f& a, const Packet2f& b) {
+  return vmax_f32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pmax<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return vmaxq_f32(a, b);
+}
 
 #ifdef __ARM_FEATURE_NUMERIC_MAXMIN
-// numeric max and min are only available if ARM_FEATURE_NUMERIC_MAXMIN is defined (which can only be the case for Armv8 systems).
-template<> EIGEN_STRONG_INLINE Packet4f pmax<PropagateNumbers, Packet4f>(const Packet4f& a, const Packet4f& b) { return vmaxnmq_f32(a, b); }
-template<> EIGEN_STRONG_INLINE Packet2f pmax<PropagateNumbers, Packet2f>(const Packet2f& a, const Packet2f& b) { return vmaxnm_f32(a, b); }
+// numeric max and min are only available if ARM_FEATURE_NUMERIC_MAXMIN is defined (which can only be the case for Armv8
+// systems).
+template <>
+EIGEN_STRONG_INLINE Packet4f pmax<PropagateNumbers, Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return vmaxnmq_f32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2f pmax<PropagateNumbers, Packet2f>(const Packet2f& a, const Packet2f& b) {
+  return vmaxnm_f32(a, b);
+}
 #endif
 
-template<> EIGEN_STRONG_INLINE Packet4f pmax<PropagateNaN, Packet4f>(const Packet4f& a, const Packet4f& b) { return pmax<Packet4f>(a, b); }
-
-template<> EIGEN_STRONG_INLINE Packet2f pmax<PropagateNaN, Packet2f>(const Packet2f& a, const Packet2f& b) { return pmax<Packet2f>(a, b); }
-
-template<> EIGEN_STRONG_INLINE Packet4c pmax<Packet4c>(const Packet4c& a, const Packet4c& b)
-{
-  return vget_lane_s32(vreinterpret_s32_s8(vmax_s8(
-      vreinterpret_s8_s32(vdup_n_s32(a)),
-      vreinterpret_s8_s32(vdup_n_s32(b)))), 0);
-}
-template<> EIGEN_STRONG_INLINE Packet8c pmax<Packet8c>(const Packet8c& a, const Packet8c& b) { return vmax_s8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet16c pmax<Packet16c>(const Packet16c& a, const Packet16c& b) { return vmaxq_s8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4uc pmax<Packet4uc>(const Packet4uc& a, const Packet4uc& b)
-{
-  return vget_lane_u32(vreinterpret_u32_u8(vmax_u8(
-      vreinterpret_u8_u32(vdup_n_u32(a)),
-      vreinterpret_u8_u32(vdup_n_u32(b)))), 0);
-}
-template<> EIGEN_STRONG_INLINE Packet8uc pmax<Packet8uc>(const Packet8uc& a, const Packet8uc& b) { return vmax_u8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet16uc pmax<Packet16uc>(const Packet16uc& a, const Packet16uc& b) { return vmaxq_u8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4s pmax<Packet4s>(const Packet4s& a, const Packet4s& b) { return vmax_s16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8s pmax<Packet8s>(const Packet8s& a, const Packet8s& b) { return vmaxq_s16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4us pmax<Packet4us>(const Packet4us& a, const Packet4us& b) { return vmax_u16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8us pmax<Packet8us>(const Packet8us& a, const Packet8us& b) { return vmaxq_u16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2i pmax<Packet2i>(const Packet2i& a, const Packet2i& b) { return vmax_s32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4i pmax<Packet4i>(const Packet4i& a, const Packet4i& b) { return vmaxq_s32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2ui pmax<Packet2ui>(const Packet2ui& a, const Packet2ui& b) { return vmax_u32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4ui pmax<Packet4ui>(const Packet4ui& a, const Packet4ui& b) { return vmaxq_u32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2l pmax<Packet2l>(const Packet2l& a, const Packet2l& b) {
-  return vcombine_s64(
-      vdup_n_s64((std::max)(vgetq_lane_s64(a, 0), vgetq_lane_s64(b, 0))),
-      vdup_n_s64((std::max)(vgetq_lane_s64(a, 1), vgetq_lane_s64(b, 1))));
-}
-template<> EIGEN_STRONG_INLINE Packet2ul pmax<Packet2ul>(const Packet2ul& a, const Packet2ul& b) {
-  return vcombine_u64(
-      vdup_n_u64((std::max)(vgetq_lane_u64(a, 0), vgetq_lane_u64(b, 0))),
-      vdup_n_u64((std::max)(vgetq_lane_u64(a, 1), vgetq_lane_u64(b, 1))));
+template <>
+EIGEN_STRONG_INLINE Packet4f pmax<PropagateNaN, Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return pmax<Packet4f>(a, b);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2f pcmp_le<Packet2f>(const Packet2f& a, const Packet2f& b)
-{ return vreinterpret_f32_u32(vcle_f32(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet4f pcmp_le<Packet4f>(const Packet4f& a, const Packet4f& b)
-{ return vreinterpretq_f32_u32(vcleq_f32(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet4c pcmp_le<Packet4c>(const Packet4c& a, const Packet4c& b)
-{
-  return vget_lane_s32(vreinterpret_s32_u8(vcle_s8(
-      vreinterpret_s8_s32(vdup_n_s32(a)),
-      vreinterpret_s8_s32(vdup_n_s32(b)))), 0);
+template <>
+EIGEN_STRONG_INLINE Packet2f pmax<PropagateNaN, Packet2f>(const Packet2f& a, const Packet2f& b) {
+  return pmax<Packet2f>(a, b);
 }
-template<> EIGEN_STRONG_INLINE Packet8c pcmp_le<Packet8c>(const Packet8c& a, const Packet8c& b)
-{ return vreinterpret_s8_u8(vcle_s8(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet16c pcmp_le<Packet16c>(const Packet16c& a, const Packet16c& b)
-{ return vreinterpretq_s8_u8(vcleq_s8(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet4uc pcmp_le<Packet4uc>(const Packet4uc& a, const Packet4uc& b)
-{
-  return vget_lane_u32(vreinterpret_u32_u8(vcle_u8(
-      vreinterpret_u8_u32(vdup_n_u32(a)),
-      vreinterpret_u8_u32(vdup_n_u32(b)))), 0);
+
+template <>
+EIGEN_STRONG_INLINE Packet4c pmax<Packet4c>(const Packet4c& a, const Packet4c& b) {
+  return vget_lane_s32(
+      vreinterpret_s32_s8(vmax_s8(vreinterpret_s8_s32(vdup_n_s32(a)), vreinterpret_s8_s32(vdup_n_s32(b)))), 0);
 }
-template<> EIGEN_STRONG_INLINE Packet8uc pcmp_le<Packet8uc>(const Packet8uc& a, const Packet8uc& b)
-{ return vcle_u8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet16uc pcmp_le<Packet16uc>(const Packet16uc& a, const Packet16uc& b)
-{ return vcleq_u8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4s pcmp_le<Packet4s>(const Packet4s& a, const Packet4s& b)
-{ return vreinterpret_s16_u16(vcle_s16(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet8s pcmp_le<Packet8s>(const Packet8s& a, const Packet8s& b)
-{ return vreinterpretq_s16_u16(vcleq_s16(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet4us pcmp_le<Packet4us>(const Packet4us& a, const Packet4us& b)
-{ return vcle_u16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8us pcmp_le<Packet8us>(const Packet8us& a, const Packet8us& b)
-{ return vcleq_u16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2i pcmp_le<Packet2i>(const Packet2i& a, const Packet2i& b)
-{ return vreinterpret_s32_u32(vcle_s32(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet4i pcmp_le<Packet4i>(const Packet4i& a, const Packet4i& b)
-{ return vreinterpretq_s32_u32(vcleq_s32(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet2ui pcmp_le<Packet2ui>(const Packet2ui& a, const Packet2ui& b)
-{ return vcle_u32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4ui pcmp_le<Packet4ui>(const Packet4ui& a, const Packet4ui& b)
-{ return vcleq_u32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2l pcmp_le<Packet2l>(const Packet2l& a, const Packet2l& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8c pmax<Packet8c>(const Packet8c& a, const Packet8c& b) {
+  return vmax_s8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16c pmax<Packet16c>(const Packet16c& a, const Packet16c& b) {
+  return vmaxq_s8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4uc pmax<Packet4uc>(const Packet4uc& a, const Packet4uc& b) {
+  return vget_lane_u32(
+      vreinterpret_u32_u8(vmax_u8(vreinterpret_u8_u32(vdup_n_u32(a)), vreinterpret_u8_u32(vdup_n_u32(b)))), 0);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8uc pmax<Packet8uc>(const Packet8uc& a, const Packet8uc& b) {
+  return vmax_u8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16uc pmax<Packet16uc>(const Packet16uc& a, const Packet16uc& b) {
+  return vmaxq_u8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4s pmax<Packet4s>(const Packet4s& a, const Packet4s& b) {
+  return vmax_s16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s pmax<Packet8s>(const Packet8s& a, const Packet8s& b) {
+  return vmaxq_s16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4us pmax<Packet4us>(const Packet4us& a, const Packet4us& b) {
+  return vmax_u16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us pmax<Packet8us>(const Packet8us& a, const Packet8us& b) {
+  return vmaxq_u16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2i pmax<Packet2i>(const Packet2i& a, const Packet2i& b) {
+  return vmax_s32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pmax<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return vmaxq_s32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ui pmax<Packet2ui>(const Packet2ui& a, const Packet2ui& b) {
+  return vmax_u32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui pmax<Packet4ui>(const Packet4ui& a, const Packet4ui& b) {
+  return vmaxq_u32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2l pmax<Packet2l>(const Packet2l& a, const Packet2l& b) {
+  return vcombine_s64(vdup_n_s64((std::max)(vgetq_lane_s64(a, 0), vgetq_lane_s64(b, 0))),
+                      vdup_n_s64((std::max)(vgetq_lane_s64(a, 1), vgetq_lane_s64(b, 1))));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ul pmax<Packet2ul>(const Packet2ul& a, const Packet2ul& b) {
+  return vcombine_u64(vdup_n_u64((std::max)(vgetq_lane_u64(a, 0), vgetq_lane_u64(b, 0))),
+                      vdup_n_u64((std::max)(vgetq_lane_u64(a, 1), vgetq_lane_u64(b, 1))));
+}
+
+template <>
+EIGEN_STRONG_INLINE Packet2f pcmp_le<Packet2f>(const Packet2f& a, const Packet2f& b) {
+  return vreinterpret_f32_u32(vcle_f32(a, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pcmp_le<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return vreinterpretq_f32_u32(vcleq_f32(a, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4c pcmp_le<Packet4c>(const Packet4c& a, const Packet4c& b) {
+  return vget_lane_s32(
+      vreinterpret_s32_u8(vcle_s8(vreinterpret_s8_s32(vdup_n_s32(a)), vreinterpret_s8_s32(vdup_n_s32(b)))), 0);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8c pcmp_le<Packet8c>(const Packet8c& a, const Packet8c& b) {
+  return vreinterpret_s8_u8(vcle_s8(a, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet16c pcmp_le<Packet16c>(const Packet16c& a, const Packet16c& b) {
+  return vreinterpretq_s8_u8(vcleq_s8(a, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4uc pcmp_le<Packet4uc>(const Packet4uc& a, const Packet4uc& b) {
+  return vget_lane_u32(
+      vreinterpret_u32_u8(vcle_u8(vreinterpret_u8_u32(vdup_n_u32(a)), vreinterpret_u8_u32(vdup_n_u32(b)))), 0);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8uc pcmp_le<Packet8uc>(const Packet8uc& a, const Packet8uc& b) {
+  return vcle_u8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16uc pcmp_le<Packet16uc>(const Packet16uc& a, const Packet16uc& b) {
+  return vcleq_u8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4s pcmp_le<Packet4s>(const Packet4s& a, const Packet4s& b) {
+  return vreinterpret_s16_u16(vcle_s16(a, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s pcmp_le<Packet8s>(const Packet8s& a, const Packet8s& b) {
+  return vreinterpretq_s16_u16(vcleq_s16(a, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4us pcmp_le<Packet4us>(const Packet4us& a, const Packet4us& b) {
+  return vcle_u16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us pcmp_le<Packet8us>(const Packet8us& a, const Packet8us& b) {
+  return vcleq_u16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2i pcmp_le<Packet2i>(const Packet2i& a, const Packet2i& b) {
+  return vreinterpret_s32_u32(vcle_s32(a, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pcmp_le<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return vreinterpretq_s32_u32(vcleq_s32(a, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ui pcmp_le<Packet2ui>(const Packet2ui& a, const Packet2ui& b) {
+  return vcle_u32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui pcmp_le<Packet4ui>(const Packet4ui& a, const Packet4ui& b) {
+  return vcleq_u32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2l pcmp_le<Packet2l>(const Packet2l& a, const Packet2l& b) {
 #if EIGEN_ARCH_ARM64
-  return vreinterpretq_s64_u64(vcleq_s64(a,b));
+  return vreinterpretq_s64_u64(vcleq_s64(a, b));
 #else
-  return vcombine_s64(
-      vdup_n_s64(vgetq_lane_s64(a, 0) <= vgetq_lane_s64(b, 0) ? numext::int64_t(-1) : 0),
-      vdup_n_s64(vgetq_lane_s64(a, 1) <= vgetq_lane_s64(b, 1) ? numext::int64_t(-1) : 0));
+  return vcombine_s64(vdup_n_s64(vgetq_lane_s64(a, 0) <= vgetq_lane_s64(b, 0) ? numext::int64_t(-1) : 0),
+                      vdup_n_s64(vgetq_lane_s64(a, 1) <= vgetq_lane_s64(b, 1) ? numext::int64_t(-1) : 0));
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet2ul pcmp_le<Packet2ul>(const Packet2ul& a, const Packet2ul& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2ul pcmp_le<Packet2ul>(const Packet2ul& a, const Packet2ul& b) {
 #if EIGEN_ARCH_ARM64
-  return vcleq_u64(a,b);
+  return vcleq_u64(a, b);
 #else
-  return vcombine_u64(
-      vdup_n_u64(vgetq_lane_u64(a, 0) <= vgetq_lane_u64(b, 0) ? numext::uint64_t(-1) : 0),
-      vdup_n_u64(vgetq_lane_u64(a, 1) <= vgetq_lane_u64(b, 1) ? numext::uint64_t(-1) : 0));
+  return vcombine_u64(vdup_n_u64(vgetq_lane_u64(a, 0) <= vgetq_lane_u64(b, 0) ? numext::uint64_t(-1) : 0),
+                      vdup_n_u64(vgetq_lane_u64(a, 1) <= vgetq_lane_u64(b, 1) ? numext::uint64_t(-1) : 0));
 #endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet2f pcmp_lt<Packet2f>(const Packet2f& a, const Packet2f& b)
-{ return vreinterpret_f32_u32(vclt_f32(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet4f pcmp_lt<Packet4f>(const Packet4f& a, const Packet4f& b)
-{ return vreinterpretq_f32_u32(vcltq_f32(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet4c pcmp_lt<Packet4c>(const Packet4c& a, const Packet4c& b)
-{
-  return vget_lane_s32(vreinterpret_s32_u8(vclt_s8(
-      vreinterpret_s8_s32(vdup_n_s32(a)),
-      vreinterpret_s8_s32(vdup_n_s32(b)))), 0);
+template <>
+EIGEN_STRONG_INLINE Packet2f pcmp_lt<Packet2f>(const Packet2f& a, const Packet2f& b) {
+  return vreinterpret_f32_u32(vclt_f32(a, b));
 }
-template<> EIGEN_STRONG_INLINE Packet8c pcmp_lt<Packet8c>(const Packet8c& a, const Packet8c& b)
-{ return vreinterpret_s8_u8(vclt_s8(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet16c pcmp_lt<Packet16c>(const Packet16c& a, const Packet16c& b)
-{ return vreinterpretq_s8_u8(vcltq_s8(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet4uc pcmp_lt<Packet4uc>(const Packet4uc& a, const Packet4uc& b)
-{
-  return vget_lane_u32(vreinterpret_u32_u8(vclt_u8(
-      vreinterpret_u8_u32(vdup_n_u32(a)),
-      vreinterpret_u8_u32(vdup_n_u32(b)))), 0);
+template <>
+EIGEN_STRONG_INLINE Packet4f pcmp_lt<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return vreinterpretq_f32_u32(vcltq_f32(a, b));
 }
-template<> EIGEN_STRONG_INLINE Packet8uc pcmp_lt<Packet8uc>(const Packet8uc& a, const Packet8uc& b)
-{ return vclt_u8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet16uc pcmp_lt<Packet16uc>(const Packet16uc& a, const Packet16uc& b)
-{ return vcltq_u8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4s pcmp_lt<Packet4s>(const Packet4s& a, const Packet4s& b)
-{ return vreinterpret_s16_u16(vclt_s16(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet8s pcmp_lt<Packet8s>(const Packet8s& a, const Packet8s& b)
-{ return vreinterpretq_s16_u16(vcltq_s16(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet4us pcmp_lt<Packet4us>(const Packet4us& a, const Packet4us& b)
-{ return vclt_u16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8us pcmp_lt<Packet8us>(const Packet8us& a, const Packet8us& b)
-{ return vcltq_u16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2i pcmp_lt<Packet2i>(const Packet2i& a, const Packet2i& b)
-{ return vreinterpret_s32_u32(vclt_s32(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet4i pcmp_lt<Packet4i>(const Packet4i& a, const Packet4i& b)
-{ return vreinterpretq_s32_u32(vcltq_s32(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet2ui pcmp_lt<Packet2ui>(const Packet2ui& a, const Packet2ui& b)
-{ return vclt_u32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4ui pcmp_lt<Packet4ui>(const Packet4ui& a, const Packet4ui& b)
-{ return vcltq_u32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2l pcmp_lt<Packet2l>(const Packet2l& a, const Packet2l& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4c pcmp_lt<Packet4c>(const Packet4c& a, const Packet4c& b) {
+  return vget_lane_s32(
+      vreinterpret_s32_u8(vclt_s8(vreinterpret_s8_s32(vdup_n_s32(a)), vreinterpret_s8_s32(vdup_n_s32(b)))), 0);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8c pcmp_lt<Packet8c>(const Packet8c& a, const Packet8c& b) {
+  return vreinterpret_s8_u8(vclt_s8(a, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet16c pcmp_lt<Packet16c>(const Packet16c& a, const Packet16c& b) {
+  return vreinterpretq_s8_u8(vcltq_s8(a, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4uc pcmp_lt<Packet4uc>(const Packet4uc& a, const Packet4uc& b) {
+  return vget_lane_u32(
+      vreinterpret_u32_u8(vclt_u8(vreinterpret_u8_u32(vdup_n_u32(a)), vreinterpret_u8_u32(vdup_n_u32(b)))), 0);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8uc pcmp_lt<Packet8uc>(const Packet8uc& a, const Packet8uc& b) {
+  return vclt_u8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16uc pcmp_lt<Packet16uc>(const Packet16uc& a, const Packet16uc& b) {
+  return vcltq_u8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4s pcmp_lt<Packet4s>(const Packet4s& a, const Packet4s& b) {
+  return vreinterpret_s16_u16(vclt_s16(a, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s pcmp_lt<Packet8s>(const Packet8s& a, const Packet8s& b) {
+  return vreinterpretq_s16_u16(vcltq_s16(a, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4us pcmp_lt<Packet4us>(const Packet4us& a, const Packet4us& b) {
+  return vclt_u16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us pcmp_lt<Packet8us>(const Packet8us& a, const Packet8us& b) {
+  return vcltq_u16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2i pcmp_lt<Packet2i>(const Packet2i& a, const Packet2i& b) {
+  return vreinterpret_s32_u32(vclt_s32(a, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pcmp_lt<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return vreinterpretq_s32_u32(vcltq_s32(a, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ui pcmp_lt<Packet2ui>(const Packet2ui& a, const Packet2ui& b) {
+  return vclt_u32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui pcmp_lt<Packet4ui>(const Packet4ui& a, const Packet4ui& b) {
+  return vcltq_u32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2l pcmp_lt<Packet2l>(const Packet2l& a, const Packet2l& b) {
 #if EIGEN_ARCH_ARM64
-  return vreinterpretq_s64_u64(vcltq_s64(a,b));
+  return vreinterpretq_s64_u64(vcltq_s64(a, b));
 #else
-  return vcombine_s64(
-      vdup_n_s64(vgetq_lane_s64(a, 0) < vgetq_lane_s64(b, 0) ? numext::int64_t(-1) : 0),
-      vdup_n_s64(vgetq_lane_s64(a, 1) < vgetq_lane_s64(b, 1) ? numext::int64_t(-1) : 0));
+  return vcombine_s64(vdup_n_s64(vgetq_lane_s64(a, 0) < vgetq_lane_s64(b, 0) ? numext::int64_t(-1) : 0),
+                      vdup_n_s64(vgetq_lane_s64(a, 1) < vgetq_lane_s64(b, 1) ? numext::int64_t(-1) : 0));
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet2ul pcmp_lt<Packet2ul>(const Packet2ul& a, const Packet2ul& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2ul pcmp_lt<Packet2ul>(const Packet2ul& a, const Packet2ul& b) {
 #if EIGEN_ARCH_ARM64
-  return vcltq_u64(a,b);
+  return vcltq_u64(a, b);
 #else
-  return vcombine_u64(
-      vdup_n_u64(vgetq_lane_u64(a, 0) < vgetq_lane_u64(b, 0) ? numext::uint64_t(-1) : 0),
-      vdup_n_u64(vgetq_lane_u64(a, 1) < vgetq_lane_u64(b, 1) ? numext::uint64_t(-1) : 0));
+  return vcombine_u64(vdup_n_u64(vgetq_lane_u64(a, 0) < vgetq_lane_u64(b, 0) ? numext::uint64_t(-1) : 0),
+                      vdup_n_u64(vgetq_lane_u64(a, 1) < vgetq_lane_u64(b, 1) ? numext::uint64_t(-1) : 0));
 #endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet2f pcmp_eq<Packet2f>(const Packet2f& a, const Packet2f& b)
-{ return vreinterpret_f32_u32(vceq_f32(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet4f pcmp_eq<Packet4f>(const Packet4f& a, const Packet4f& b)
-{ return vreinterpretq_f32_u32(vceqq_f32(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet4c pcmp_eq<Packet4c>(const Packet4c& a, const Packet4c& b)
-{
-  return vget_lane_s32(vreinterpret_s32_u8(vceq_s8(
-      vreinterpret_s8_s32(vdup_n_s32(a)),
-      vreinterpret_s8_s32(vdup_n_s32(b)))), 0);
+template <>
+EIGEN_STRONG_INLINE Packet2f pcmp_eq<Packet2f>(const Packet2f& a, const Packet2f& b) {
+  return vreinterpret_f32_u32(vceq_f32(a, b));
 }
-template<> EIGEN_STRONG_INLINE Packet8c pcmp_eq<Packet8c>(const Packet8c& a, const Packet8c& b)
-{ return vreinterpret_s8_u8(vceq_s8(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet16c pcmp_eq<Packet16c>(const Packet16c& a, const Packet16c& b)
-{ return vreinterpretq_s8_u8(vceqq_s8(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet4uc pcmp_eq<Packet4uc>(const Packet4uc& a, const Packet4uc& b)
-{
-  return vget_lane_u32(vreinterpret_u32_u8(vceq_u8(
-      vreinterpret_u8_u32(vdup_n_u32(a)),
-      vreinterpret_u8_u32(vdup_n_u32(b)))), 0);
+template <>
+EIGEN_STRONG_INLINE Packet4f pcmp_eq<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return vreinterpretq_f32_u32(vceqq_f32(a, b));
 }
-template<> EIGEN_STRONG_INLINE Packet8uc pcmp_eq<Packet8uc>(const Packet8uc& a, const Packet8uc& b)
-{ return vceq_u8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet16uc pcmp_eq<Packet16uc>(const Packet16uc& a, const Packet16uc& b)
-{ return vceqq_u8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4s pcmp_eq<Packet4s>(const Packet4s& a, const Packet4s& b)
-{ return vreinterpret_s16_u16(vceq_s16(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet8s pcmp_eq<Packet8s>(const Packet8s& a, const Packet8s& b)
-{ return vreinterpretq_s16_u16(vceqq_s16(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet4us pcmp_eq<Packet4us>(const Packet4us& a, const Packet4us& b)
-{ return vceq_u16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8us pcmp_eq<Packet8us>(const Packet8us& a, const Packet8us& b)
-{ return vceqq_u16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2i pcmp_eq<Packet2i>(const Packet2i& a, const Packet2i& b)
-{ return vreinterpret_s32_u32(vceq_s32(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet4i pcmp_eq<Packet4i>(const Packet4i& a, const Packet4i& b)
-{ return vreinterpretq_s32_u32(vceqq_s32(a,b)); }
-template<> EIGEN_STRONG_INLINE Packet2ui pcmp_eq<Packet2ui>(const Packet2ui& a, const Packet2ui& b)
-{ return vceq_u32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4ui pcmp_eq<Packet4ui>(const Packet4ui& a, const Packet4ui& b)
-{ return vceqq_u32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2l pcmp_eq<Packet2l>(const Packet2l& a, const Packet2l& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4c pcmp_eq<Packet4c>(const Packet4c& a, const Packet4c& b) {
+  return vget_lane_s32(
+      vreinterpret_s32_u8(vceq_s8(vreinterpret_s8_s32(vdup_n_s32(a)), vreinterpret_s8_s32(vdup_n_s32(b)))), 0);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8c pcmp_eq<Packet8c>(const Packet8c& a, const Packet8c& b) {
+  return vreinterpret_s8_u8(vceq_s8(a, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet16c pcmp_eq<Packet16c>(const Packet16c& a, const Packet16c& b) {
+  return vreinterpretq_s8_u8(vceqq_s8(a, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4uc pcmp_eq<Packet4uc>(const Packet4uc& a, const Packet4uc& b) {
+  return vget_lane_u32(
+      vreinterpret_u32_u8(vceq_u8(vreinterpret_u8_u32(vdup_n_u32(a)), vreinterpret_u8_u32(vdup_n_u32(b)))), 0);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8uc pcmp_eq<Packet8uc>(const Packet8uc& a, const Packet8uc& b) {
+  return vceq_u8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16uc pcmp_eq<Packet16uc>(const Packet16uc& a, const Packet16uc& b) {
+  return vceqq_u8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4s pcmp_eq<Packet4s>(const Packet4s& a, const Packet4s& b) {
+  return vreinterpret_s16_u16(vceq_s16(a, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s pcmp_eq<Packet8s>(const Packet8s& a, const Packet8s& b) {
+  return vreinterpretq_s16_u16(vceqq_s16(a, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4us pcmp_eq<Packet4us>(const Packet4us& a, const Packet4us& b) {
+  return vceq_u16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us pcmp_eq<Packet8us>(const Packet8us& a, const Packet8us& b) {
+  return vceqq_u16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2i pcmp_eq<Packet2i>(const Packet2i& a, const Packet2i& b) {
+  return vreinterpret_s32_u32(vceq_s32(a, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pcmp_eq<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return vreinterpretq_s32_u32(vceqq_s32(a, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ui pcmp_eq<Packet2ui>(const Packet2ui& a, const Packet2ui& b) {
+  return vceq_u32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui pcmp_eq<Packet4ui>(const Packet4ui& a, const Packet4ui& b) {
+  return vceqq_u32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2l pcmp_eq<Packet2l>(const Packet2l& a, const Packet2l& b) {
 #if EIGEN_ARCH_ARM64
-  return vreinterpretq_s64_u64(vceqq_s64(a,b));
+  return vreinterpretq_s64_u64(vceqq_s64(a, b));
 #else
-  return vcombine_s64(
-      vdup_n_s64(vgetq_lane_s64(a, 0) == vgetq_lane_s64(b, 0) ? numext::int64_t(-1) : 0),
-      vdup_n_s64(vgetq_lane_s64(a, 1) == vgetq_lane_s64(b, 1) ? numext::int64_t(-1) : 0));
+  return vcombine_s64(vdup_n_s64(vgetq_lane_s64(a, 0) == vgetq_lane_s64(b, 0) ? numext::int64_t(-1) : 0),
+                      vdup_n_s64(vgetq_lane_s64(a, 1) == vgetq_lane_s64(b, 1) ? numext::int64_t(-1) : 0));
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet2ul pcmp_eq<Packet2ul>(const Packet2ul& a, const Packet2ul& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2ul pcmp_eq<Packet2ul>(const Packet2ul& a, const Packet2ul& b) {
 #if EIGEN_ARCH_ARM64
-  return vceqq_u64(a,b);
+  return vceqq_u64(a, b);
 #else
-  return vcombine_u64(
-      vdup_n_u64(vgetq_lane_u64(a, 0) == vgetq_lane_u64(b, 0) ? numext::uint64_t(-1) : 0),
-      vdup_n_u64(vgetq_lane_u64(a, 1) == vgetq_lane_u64(b, 1) ? numext::uint64_t(-1) : 0));
+  return vcombine_u64(vdup_n_u64(vgetq_lane_u64(a, 0) == vgetq_lane_u64(b, 0) ? numext::uint64_t(-1) : 0),
+                      vdup_n_u64(vgetq_lane_u64(a, 1) == vgetq_lane_u64(b, 1) ? numext::uint64_t(-1) : 0));
 #endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet2f pcmp_lt_or_nan<Packet2f>(const Packet2f& a, const Packet2f& b)
-{ return vreinterpret_f32_u32(vmvn_u32(vcge_f32(a,b))); }
-template<> EIGEN_STRONG_INLINE Packet4f pcmp_lt_or_nan<Packet4f>(const Packet4f& a, const Packet4f& b)
-{ return vreinterpretq_f32_u32(vmvnq_u32(vcgeq_f32(a,b))); }
+template <>
+EIGEN_STRONG_INLINE Packet2f pcmp_lt_or_nan<Packet2f>(const Packet2f& a, const Packet2f& b) {
+  return vreinterpret_f32_u32(vmvn_u32(vcge_f32(a, b)));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pcmp_lt_or_nan<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return vreinterpretq_f32_u32(vmvnq_u32(vcgeq_f32(a, b)));
+}
 
 // Logical Operations are not supported for float, so we have to reinterpret casts using NEON intrinsics
-template<> EIGEN_STRONG_INLINE Packet2f pand<Packet2f>(const Packet2f& a, const Packet2f& b)
-{ return vreinterpret_f32_u32(vand_u32(vreinterpret_u32_f32(a),vreinterpret_u32_f32(b))); }
-template<> EIGEN_STRONG_INLINE Packet4f pand<Packet4f>(const Packet4f& a, const Packet4f& b)
-{ return vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(a),vreinterpretq_u32_f32(b))); }
-template<> EIGEN_STRONG_INLINE Packet4c pand<Packet4c>(const Packet4c& a, const Packet4c& b)
-{ return a & b; }
-template<> EIGEN_STRONG_INLINE Packet8c pand<Packet8c>(const Packet8c& a, const Packet8c& b)
-{ return vand_s8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet16c pand<Packet16c>(const Packet16c& a, const Packet16c& b)
-{ return vandq_s8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4uc pand<Packet4uc>(const Packet4uc& a, const Packet4uc& b)
-{ return a & b; }
-template<> EIGEN_STRONG_INLINE Packet8uc pand<Packet8uc>(const Packet8uc& a, const Packet8uc& b)
-{ return vand_u8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet16uc pand<Packet16uc>(const Packet16uc& a, const Packet16uc& b)
-{ return vandq_u8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4s pand<Packet4s>(const Packet4s& a, const Packet4s& b) { return vand_s16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8s pand<Packet8s>(const Packet8s& a, const Packet8s& b) { return vandq_s16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4us pand<Packet4us>(const Packet4us& a, const Packet4us& b)
-{ return vand_u16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8us pand<Packet8us>(const Packet8us& a, const Packet8us& b)
-{ return vandq_u16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2i pand<Packet2i>(const Packet2i& a, const Packet2i& b) { return vand_s32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4i pand<Packet4i>(const Packet4i& a, const Packet4i& b) { return vandq_s32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2ui pand<Packet2ui>(const Packet2ui& a, const Packet2ui& b)
-{ return vand_u32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4ui pand<Packet4ui>(const Packet4ui& a, const Packet4ui& b)
-{ return vandq_u32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2l pand<Packet2l>(const Packet2l& a, const Packet2l& b) { return vandq_s64(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2ul pand<Packet2ul>(const Packet2ul& a, const Packet2ul& b)
-{ return vandq_u64(a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet2f pand<Packet2f>(const Packet2f& a, const Packet2f& b) {
+  return vreinterpret_f32_u32(vand_u32(vreinterpret_u32_f32(a), vreinterpret_u32_f32(b)));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pand<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(a), vreinterpretq_u32_f32(b)));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4c pand<Packet4c>(const Packet4c& a, const Packet4c& b) {
+  return a & b;
+}
+template <>
+EIGEN_STRONG_INLINE Packet8c pand<Packet8c>(const Packet8c& a, const Packet8c& b) {
+  return vand_s8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16c pand<Packet16c>(const Packet16c& a, const Packet16c& b) {
+  return vandq_s8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4uc pand<Packet4uc>(const Packet4uc& a, const Packet4uc& b) {
+  return a & b;
+}
+template <>
+EIGEN_STRONG_INLINE Packet8uc pand<Packet8uc>(const Packet8uc& a, const Packet8uc& b) {
+  return vand_u8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16uc pand<Packet16uc>(const Packet16uc& a, const Packet16uc& b) {
+  return vandq_u8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4s pand<Packet4s>(const Packet4s& a, const Packet4s& b) {
+  return vand_s16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s pand<Packet8s>(const Packet8s& a, const Packet8s& b) {
+  return vandq_s16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4us pand<Packet4us>(const Packet4us& a, const Packet4us& b) {
+  return vand_u16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us pand<Packet8us>(const Packet8us& a, const Packet8us& b) {
+  return vandq_u16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2i pand<Packet2i>(const Packet2i& a, const Packet2i& b) {
+  return vand_s32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pand<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return vandq_s32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ui pand<Packet2ui>(const Packet2ui& a, const Packet2ui& b) {
+  return vand_u32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui pand<Packet4ui>(const Packet4ui& a, const Packet4ui& b) {
+  return vandq_u32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2l pand<Packet2l>(const Packet2l& a, const Packet2l& b) {
+  return vandq_s64(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ul pand<Packet2ul>(const Packet2ul& a, const Packet2ul& b) {
+  return vandq_u64(a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2f por<Packet2f>(const Packet2f& a, const Packet2f& b)
-{ return vreinterpret_f32_u32(vorr_u32(vreinterpret_u32_f32(a),vreinterpret_u32_f32(b))); }
-template<> EIGEN_STRONG_INLINE Packet4f por<Packet4f>(const Packet4f& a, const Packet4f& b)
-{ return vreinterpretq_f32_u32(vorrq_u32(vreinterpretq_u32_f32(a),vreinterpretq_u32_f32(b))); }
-template<> EIGEN_STRONG_INLINE Packet4c por<Packet4c>(const Packet4c& a, const Packet4c& b)
-{ return a | b; }
-template<> EIGEN_STRONG_INLINE Packet8c por<Packet8c>(const Packet8c& a, const Packet8c& b) { return vorr_s8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet16c por<Packet16c>(const Packet16c& a, const Packet16c& b)
-{ return vorrq_s8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4uc por<Packet4uc>(const Packet4uc& a, const Packet4uc& b)
-{ return a | b; }
-template<> EIGEN_STRONG_INLINE Packet8uc por<Packet8uc>(const Packet8uc& a, const Packet8uc& b)
-{ return vorr_u8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet16uc por<Packet16uc>(const Packet16uc& a, const Packet16uc& b)
-{ return vorrq_u8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4s por<Packet4s>(const Packet4s& a, const Packet4s& b)
-{ return vorr_s16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8s por<Packet8s>(const Packet8s& a, const Packet8s& b)
-{ return vorrq_s16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4us por<Packet4us>(const Packet4us& a, const Packet4us& b)
-{ return vorr_u16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8us por<Packet8us>(const Packet8us& a, const Packet8us& b)
-{ return vorrq_u16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2i por<Packet2i>(const Packet2i& a, const Packet2i& b) { return vorr_s32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4i por<Packet4i>(const Packet4i& a, const Packet4i& b) { return vorrq_s32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2ui por<Packet2ui>(const Packet2ui& a, const Packet2ui& b)
-{ return vorr_u32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4ui por<Packet4ui>(const Packet4ui& a, const Packet4ui& b)
-{ return vorrq_u32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2l por<Packet2l>(const Packet2l& a, const Packet2l& b)
-{ return vorrq_s64(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2ul por<Packet2ul>(const Packet2ul& a, const Packet2ul& b)
-{ return vorrq_u64(a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet2f por<Packet2f>(const Packet2f& a, const Packet2f& b) {
+  return vreinterpret_f32_u32(vorr_u32(vreinterpret_u32_f32(a), vreinterpret_u32_f32(b)));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f por<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return vreinterpretq_f32_u32(vorrq_u32(vreinterpretq_u32_f32(a), vreinterpretq_u32_f32(b)));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4c por<Packet4c>(const Packet4c& a, const Packet4c& b) {
+  return a | b;
+}
+template <>
+EIGEN_STRONG_INLINE Packet8c por<Packet8c>(const Packet8c& a, const Packet8c& b) {
+  return vorr_s8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16c por<Packet16c>(const Packet16c& a, const Packet16c& b) {
+  return vorrq_s8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4uc por<Packet4uc>(const Packet4uc& a, const Packet4uc& b) {
+  return a | b;
+}
+template <>
+EIGEN_STRONG_INLINE Packet8uc por<Packet8uc>(const Packet8uc& a, const Packet8uc& b) {
+  return vorr_u8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16uc por<Packet16uc>(const Packet16uc& a, const Packet16uc& b) {
+  return vorrq_u8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4s por<Packet4s>(const Packet4s& a, const Packet4s& b) {
+  return vorr_s16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s por<Packet8s>(const Packet8s& a, const Packet8s& b) {
+  return vorrq_s16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4us por<Packet4us>(const Packet4us& a, const Packet4us& b) {
+  return vorr_u16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us por<Packet8us>(const Packet8us& a, const Packet8us& b) {
+  return vorrq_u16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2i por<Packet2i>(const Packet2i& a, const Packet2i& b) {
+  return vorr_s32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i por<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return vorrq_s32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ui por<Packet2ui>(const Packet2ui& a, const Packet2ui& b) {
+  return vorr_u32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui por<Packet4ui>(const Packet4ui& a, const Packet4ui& b) {
+  return vorrq_u32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2l por<Packet2l>(const Packet2l& a, const Packet2l& b) {
+  return vorrq_s64(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ul por<Packet2ul>(const Packet2ul& a, const Packet2ul& b) {
+  return vorrq_u64(a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2f pxor<Packet2f>(const Packet2f& a, const Packet2f& b)
-{ return vreinterpret_f32_u32(veor_u32(vreinterpret_u32_f32(a),vreinterpret_u32_f32(b))); }
-template<> EIGEN_STRONG_INLINE Packet4f pxor<Packet4f>(const Packet4f& a, const Packet4f& b)
-{ return vreinterpretq_f32_u32(veorq_u32(vreinterpretq_u32_f32(a),vreinterpretq_u32_f32(b))); }
-template<> EIGEN_STRONG_INLINE Packet4c pxor<Packet4c>(const Packet4c& a, const Packet4c& b)
-{ return a ^ b; }
-template<> EIGEN_STRONG_INLINE Packet8c pxor<Packet8c>(const Packet8c& a, const Packet8c& b)
-{ return veor_s8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet16c pxor<Packet16c>(const Packet16c& a, const Packet16c& b)
-{ return veorq_s8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4uc pxor<Packet4uc>(const Packet4uc& a, const Packet4uc& b)
-{ return a ^ b; }
-template<> EIGEN_STRONG_INLINE Packet8uc pxor<Packet8uc>(const Packet8uc& a, const Packet8uc& b)
-{ return veor_u8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet16uc pxor<Packet16uc>(const Packet16uc& a, const Packet16uc& b)
-{ return veorq_u8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4s pxor<Packet4s>(const Packet4s& a, const Packet4s& b) { return veor_s16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8s pxor<Packet8s>(const Packet8s& a, const Packet8s& b) { return veorq_s16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4us pxor<Packet4us>(const Packet4us& a, const Packet4us& b)
-{ return veor_u16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8us pxor<Packet8us>(const Packet8us& a, const Packet8us& b)
-{ return veorq_u16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2i pxor<Packet2i>(const Packet2i& a, const Packet2i& b) { return veor_s32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4i pxor<Packet4i>(const Packet4i& a, const Packet4i& b) { return veorq_s32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2ui pxor<Packet2ui>(const Packet2ui& a, const Packet2ui& b)
-{ return veor_u32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4ui pxor<Packet4ui>(const Packet4ui& a, const Packet4ui& b)
-{ return veorq_u32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2l pxor<Packet2l>(const Packet2l& a, const Packet2l& b)
-{ return veorq_s64(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2ul pxor<Packet2ul>(const Packet2ul& a, const Packet2ul& b)
-{ return veorq_u64(a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet2f pxor<Packet2f>(const Packet2f& a, const Packet2f& b) {
+  return vreinterpret_f32_u32(veor_u32(vreinterpret_u32_f32(a), vreinterpret_u32_f32(b)));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pxor<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return vreinterpretq_f32_u32(veorq_u32(vreinterpretq_u32_f32(a), vreinterpretq_u32_f32(b)));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4c pxor<Packet4c>(const Packet4c& a, const Packet4c& b) {
+  return a ^ b;
+}
+template <>
+EIGEN_STRONG_INLINE Packet8c pxor<Packet8c>(const Packet8c& a, const Packet8c& b) {
+  return veor_s8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16c pxor<Packet16c>(const Packet16c& a, const Packet16c& b) {
+  return veorq_s8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4uc pxor<Packet4uc>(const Packet4uc& a, const Packet4uc& b) {
+  return a ^ b;
+}
+template <>
+EIGEN_STRONG_INLINE Packet8uc pxor<Packet8uc>(const Packet8uc& a, const Packet8uc& b) {
+  return veor_u8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16uc pxor<Packet16uc>(const Packet16uc& a, const Packet16uc& b) {
+  return veorq_u8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4s pxor<Packet4s>(const Packet4s& a, const Packet4s& b) {
+  return veor_s16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s pxor<Packet8s>(const Packet8s& a, const Packet8s& b) {
+  return veorq_s16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4us pxor<Packet4us>(const Packet4us& a, const Packet4us& b) {
+  return veor_u16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us pxor<Packet8us>(const Packet8us& a, const Packet8us& b) {
+  return veorq_u16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2i pxor<Packet2i>(const Packet2i& a, const Packet2i& b) {
+  return veor_s32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pxor<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return veorq_s32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ui pxor<Packet2ui>(const Packet2ui& a, const Packet2ui& b) {
+  return veor_u32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui pxor<Packet4ui>(const Packet4ui& a, const Packet4ui& b) {
+  return veorq_u32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2l pxor<Packet2l>(const Packet2l& a, const Packet2l& b) {
+  return veorq_s64(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ul pxor<Packet2ul>(const Packet2ul& a, const Packet2ul& b) {
+  return veorq_u64(a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2f pandnot<Packet2f>(const Packet2f& a, const Packet2f& b)
-{ return vreinterpret_f32_u32(vbic_u32(vreinterpret_u32_f32(a),vreinterpret_u32_f32(b))); }
-template<> EIGEN_STRONG_INLINE Packet4f pandnot<Packet4f>(const Packet4f& a, const Packet4f& b)
-{ return vreinterpretq_f32_u32(vbicq_u32(vreinterpretq_u32_f32(a),vreinterpretq_u32_f32(b))); }
-template<> EIGEN_STRONG_INLINE Packet4c pandnot<Packet4c>(const Packet4c& a, const Packet4c& b)
-{ return a & ~b; }
-template<> EIGEN_STRONG_INLINE Packet8c pandnot<Packet8c>(const Packet8c& a, const Packet8c& b) { return vbic_s8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet16c pandnot<Packet16c>(const Packet16c& a, const Packet16c& b) { return vbicq_s8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4uc pandnot<Packet4uc>(const Packet4uc& a, const Packet4uc& b)
-{ return a & ~b; }
-template<> EIGEN_STRONG_INLINE Packet8uc pandnot<Packet8uc>(const Packet8uc& a, const Packet8uc& b)
-{ return vbic_u8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet16uc pandnot<Packet16uc>(const Packet16uc& a, const Packet16uc& b)
-{ return vbicq_u8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4s pandnot<Packet4s>(const Packet4s& a, const Packet4s& b)
-{ return vbic_s16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8s pandnot<Packet8s>(const Packet8s& a, const Packet8s& b)
-{ return vbicq_s16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4us pandnot<Packet4us>(const Packet4us& a, const Packet4us& b)
-{ return vbic_u16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet8us pandnot<Packet8us>(const Packet8us& a, const Packet8us& b)
-{ return vbicq_u16(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2i pandnot<Packet2i>(const Packet2i& a, const Packet2i& b)
-{ return vbic_s32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4i pandnot<Packet4i>(const Packet4i& a, const Packet4i& b)
-{ return vbicq_s32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2ui pandnot<Packet2ui>(const Packet2ui& a, const Packet2ui& b)
-{ return vbic_u32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4ui pandnot<Packet4ui>(const Packet4ui& a, const Packet4ui& b)
-{ return vbicq_u32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2l pandnot<Packet2l>(const Packet2l& a, const Packet2l& b)
-{ return vbicq_s64(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2ul pandnot<Packet2ul>(const Packet2ul& a, const Packet2ul& b)
-{ return vbicq_u64(a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet2f pandnot<Packet2f>(const Packet2f& a, const Packet2f& b) {
+  return vreinterpret_f32_u32(vbic_u32(vreinterpret_u32_f32(a), vreinterpret_u32_f32(b)));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pandnot<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return vreinterpretq_f32_u32(vbicq_u32(vreinterpretq_u32_f32(a), vreinterpretq_u32_f32(b)));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4c pandnot<Packet4c>(const Packet4c& a, const Packet4c& b) {
+  return a & ~b;
+}
+template <>
+EIGEN_STRONG_INLINE Packet8c pandnot<Packet8c>(const Packet8c& a, const Packet8c& b) {
+  return vbic_s8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16c pandnot<Packet16c>(const Packet16c& a, const Packet16c& b) {
+  return vbicq_s8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4uc pandnot<Packet4uc>(const Packet4uc& a, const Packet4uc& b) {
+  return a & ~b;
+}
+template <>
+EIGEN_STRONG_INLINE Packet8uc pandnot<Packet8uc>(const Packet8uc& a, const Packet8uc& b) {
+  return vbic_u8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16uc pandnot<Packet16uc>(const Packet16uc& a, const Packet16uc& b) {
+  return vbicq_u8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4s pandnot<Packet4s>(const Packet4s& a, const Packet4s& b) {
+  return vbic_s16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s pandnot<Packet8s>(const Packet8s& a, const Packet8s& b) {
+  return vbicq_s16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4us pandnot<Packet4us>(const Packet4us& a, const Packet4us& b) {
+  return vbic_u16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us pandnot<Packet8us>(const Packet8us& a, const Packet8us& b) {
+  return vbicq_u16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2i pandnot<Packet2i>(const Packet2i& a, const Packet2i& b) {
+  return vbic_s32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pandnot<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return vbicq_s32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ui pandnot<Packet2ui>(const Packet2ui& a, const Packet2ui& b) {
+  return vbic_u32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui pandnot<Packet4ui>(const Packet4ui& a, const Packet4ui& b) {
+  return vbicq_u32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2l pandnot<Packet2l>(const Packet2l& a, const Packet2l& b) {
+  return vbicq_s64(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ul pandnot<Packet2ul>(const Packet2ul& a, const Packet2ul& b) {
+  return vbicq_u64(a, b);
+}
 
+template <int N>
+EIGEN_STRONG_INLINE Packet4c parithmetic_shift_right(Packet4c& a) {
+  return vget_lane_s32(vreinterpret_s32_s8(vshr_n_s8(vreinterpret_s8_s32(vdup_n_s32(a)), N)), 0);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet8c parithmetic_shift_right(Packet8c a) {
+  return vshr_n_s8(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet16c parithmetic_shift_right(Packet16c a) {
+  return vshrq_n_s8(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet4uc parithmetic_shift_right(Packet4uc& a) {
+  return vget_lane_u32(vreinterpret_u32_u8(vshr_n_u8(vreinterpret_u8_u32(vdup_n_u32(a)), N)), 0);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet8uc parithmetic_shift_right(Packet8uc a) {
+  return vshr_n_u8(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet16uc parithmetic_shift_right(Packet16uc a) {
+  return vshrq_n_u8(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet4s parithmetic_shift_right(Packet4s a) {
+  return vshr_n_s16(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet8s parithmetic_shift_right(Packet8s a) {
+  return vshrq_n_s16(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet4us parithmetic_shift_right(Packet4us a) {
+  return vshr_n_u16(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet8us parithmetic_shift_right(Packet8us a) {
+  return vshrq_n_u16(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet2i parithmetic_shift_right(Packet2i a) {
+  return vshr_n_s32(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet4i parithmetic_shift_right(Packet4i a) {
+  return vshrq_n_s32(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet2ui parithmetic_shift_right(Packet2ui a) {
+  return vshr_n_u32(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet4ui parithmetic_shift_right(Packet4ui a) {
+  return vshrq_n_u32(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet2l parithmetic_shift_right(Packet2l a) {
+  return vshrq_n_s64(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet2ul parithmetic_shift_right(Packet2ul a) {
+  return vshrq_n_u64(a, N);
+}
 
-template<int N> EIGEN_STRONG_INLINE Packet4c parithmetic_shift_right(Packet4c& a)
-{ return vget_lane_s32(vreinterpret_s32_s8(vshr_n_s8(vreinterpret_s8_s32(vdup_n_s32(a)), N)), 0); }
-template<int N> EIGEN_STRONG_INLINE Packet8c parithmetic_shift_right(Packet8c a) { return vshr_n_s8(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet16c parithmetic_shift_right(Packet16c a) { return vshrq_n_s8(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet4uc parithmetic_shift_right(Packet4uc& a)
-{ return vget_lane_u32(vreinterpret_u32_u8(vshr_n_u8(vreinterpret_u8_u32(vdup_n_u32(a)), N)), 0); }
-template<int N> EIGEN_STRONG_INLINE Packet8uc parithmetic_shift_right(Packet8uc a) { return vshr_n_u8(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet16uc parithmetic_shift_right(Packet16uc a) { return vshrq_n_u8(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet4s parithmetic_shift_right(Packet4s a) { return vshr_n_s16(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet8s parithmetic_shift_right(Packet8s a) { return vshrq_n_s16(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet4us parithmetic_shift_right(Packet4us a) { return vshr_n_u16(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet8us parithmetic_shift_right(Packet8us a) { return vshrq_n_u16(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet2i parithmetic_shift_right(Packet2i a) { return vshr_n_s32(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet4i parithmetic_shift_right(Packet4i a) { return vshrq_n_s32(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet2ui parithmetic_shift_right(Packet2ui a) { return vshr_n_u32(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet4ui parithmetic_shift_right(Packet4ui a) { return vshrq_n_u32(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet2l parithmetic_shift_right(Packet2l a) { return vshrq_n_s64(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet2ul parithmetic_shift_right(Packet2ul a) { return vshrq_n_u64(a,N); }
+template <int N>
+EIGEN_STRONG_INLINE Packet4c plogical_shift_right(Packet4c& a) {
+  return vget_lane_s32(vreinterpret_s32_u8(vshr_n_u8(vreinterpret_u8_s32(vdup_n_s32(a)), N)), 0);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet8c plogical_shift_right(Packet8c a) {
+  return vreinterpret_s8_u8(vshr_n_u8(vreinterpret_u8_s8(a), N));
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet16c plogical_shift_right(Packet16c a) {
+  return vreinterpretq_s8_u8(vshrq_n_u8(vreinterpretq_u8_s8(a), N));
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet4uc plogical_shift_right(Packet4uc& a) {
+  return vget_lane_u32(vreinterpret_u32_s8(vshr_n_s8(vreinterpret_s8_u32(vdup_n_u32(a)), N)), 0);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet8uc plogical_shift_right(Packet8uc a) {
+  return vshr_n_u8(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet16uc plogical_shift_right(Packet16uc a) {
+  return vshrq_n_u8(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet4s plogical_shift_right(Packet4s a) {
+  return vreinterpret_s16_u16(vshr_n_u16(vreinterpret_u16_s16(a), N));
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet8s plogical_shift_right(Packet8s a) {
+  return vreinterpretq_s16_u16(vshrq_n_u16(vreinterpretq_u16_s16(a), N));
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet4us plogical_shift_right(Packet4us a) {
+  return vshr_n_u16(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet8us plogical_shift_right(Packet8us a) {
+  return vshrq_n_u16(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet2i plogical_shift_right(Packet2i a) {
+  return vreinterpret_s32_u32(vshr_n_u32(vreinterpret_u32_s32(a), N));
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet4i plogical_shift_right(Packet4i a) {
+  return vreinterpretq_s32_u32(vshrq_n_u32(vreinterpretq_u32_s32(a), N));
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet2ui plogical_shift_right(Packet2ui a) {
+  return vshr_n_u32(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet4ui plogical_shift_right(Packet4ui a) {
+  return vshrq_n_u32(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet2l plogical_shift_right(Packet2l a) {
+  return vreinterpretq_s64_u64(vshrq_n_u64(vreinterpretq_u64_s64(a), N));
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet2ul plogical_shift_right(Packet2ul a) {
+  return vshrq_n_u64(a, N);
+}
 
-template<int N> EIGEN_STRONG_INLINE Packet4c plogical_shift_right(Packet4c& a)
-{ return vget_lane_s32(vreinterpret_s32_u8(vshr_n_u8(vreinterpret_u8_s32(vdup_n_s32(a)), N)), 0); }
-template<int N> EIGEN_STRONG_INLINE Packet8c plogical_shift_right(Packet8c a)
-{ return vreinterpret_s8_u8(vshr_n_u8(vreinterpret_u8_s8(a),N)); }
-template<int N> EIGEN_STRONG_INLINE Packet16c plogical_shift_right(Packet16c a)
-{ return vreinterpretq_s8_u8(vshrq_n_u8(vreinterpretq_u8_s8(a),N)); }
-template<int N> EIGEN_STRONG_INLINE Packet4uc plogical_shift_right(Packet4uc& a)
-{ return vget_lane_u32(vreinterpret_u32_s8(vshr_n_s8(vreinterpret_s8_u32(vdup_n_u32(a)), N)), 0); }
-template<int N> EIGEN_STRONG_INLINE Packet8uc plogical_shift_right(Packet8uc a) { return vshr_n_u8(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet16uc plogical_shift_right(Packet16uc a) { return vshrq_n_u8(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet4s plogical_shift_right(Packet4s a)
-{ return vreinterpret_s16_u16(vshr_n_u16(vreinterpret_u16_s16(a),N)); }
-template<int N> EIGEN_STRONG_INLINE Packet8s plogical_shift_right(Packet8s a)
-{ return vreinterpretq_s16_u16(vshrq_n_u16(vreinterpretq_u16_s16(a),N)); }
-template<int N> EIGEN_STRONG_INLINE Packet4us plogical_shift_right(Packet4us a) { return vshr_n_u16(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet8us plogical_shift_right(Packet8us a) { return vshrq_n_u16(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet2i plogical_shift_right(Packet2i a)
-{ return vreinterpret_s32_u32(vshr_n_u32(vreinterpret_u32_s32(a),N)); }
-template<int N> EIGEN_STRONG_INLINE Packet4i plogical_shift_right(Packet4i a)
-{ return vreinterpretq_s32_u32(vshrq_n_u32(vreinterpretq_u32_s32(a),N)); }
-template<int N> EIGEN_STRONG_INLINE Packet2ui plogical_shift_right(Packet2ui a) { return vshr_n_u32(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet4ui plogical_shift_right(Packet4ui a) { return vshrq_n_u32(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet2l plogical_shift_right(Packet2l a)
-{ return vreinterpretq_s64_u64(vshrq_n_u64(vreinterpretq_u64_s64(a),N)); }
-template<int N> EIGEN_STRONG_INLINE Packet2ul plogical_shift_right(Packet2ul a) { return vshrq_n_u64(a,N); }
+template <int N>
+EIGEN_STRONG_INLINE Packet4c plogical_shift_left(Packet4c& a) {
+  return vget_lane_s32(vreinterpret_s32_s8(vshl_n_s8(vreinterpret_s8_s32(vdup_n_s32(a)), N)), 0);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet8c plogical_shift_left(Packet8c a) {
+  return vshl_n_s8(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet16c plogical_shift_left(Packet16c a) {
+  return vshlq_n_s8(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet4uc plogical_shift_left(Packet4uc& a) {
+  return vget_lane_u32(vreinterpret_u32_u8(vshl_n_u8(vreinterpret_u8_u32(vdup_n_u32(a)), N)), 0);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet8uc plogical_shift_left(Packet8uc a) {
+  return vshl_n_u8(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet16uc plogical_shift_left(Packet16uc a) {
+  return vshlq_n_u8(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet4s plogical_shift_left(Packet4s a) {
+  return vshl_n_s16(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet8s plogical_shift_left(Packet8s a) {
+  return vshlq_n_s16(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet4us plogical_shift_left(Packet4us a) {
+  return vshl_n_u16(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet8us plogical_shift_left(Packet8us a) {
+  return vshlq_n_u16(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet2i plogical_shift_left(Packet2i a) {
+  return vshl_n_s32(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet4i plogical_shift_left(Packet4i a) {
+  return vshlq_n_s32(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet2ui plogical_shift_left(Packet2ui a) {
+  return vshl_n_u32(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet4ui plogical_shift_left(Packet4ui a) {
+  return vshlq_n_u32(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet2l plogical_shift_left(Packet2l a) {
+  return vshlq_n_s64(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet2ul plogical_shift_left(Packet2ul a) {
+  return vshlq_n_u64(a, N);
+}
 
-template<int N> EIGEN_STRONG_INLINE Packet4c plogical_shift_left(Packet4c& a)
-{ return vget_lane_s32(vreinterpret_s32_s8(vshl_n_s8(vreinterpret_s8_s32(vdup_n_s32(a)), N)), 0); }
-template<int N> EIGEN_STRONG_INLINE Packet8c plogical_shift_left(Packet8c a) { return vshl_n_s8(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet16c plogical_shift_left(Packet16c a) { return vshlq_n_s8(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet4uc plogical_shift_left(Packet4uc& a)
-{ return vget_lane_u32(vreinterpret_u32_u8(vshl_n_u8(vreinterpret_u8_u32(vdup_n_u32(a)), N)), 0); }
-template<int N> EIGEN_STRONG_INLINE Packet8uc plogical_shift_left(Packet8uc a) { return vshl_n_u8(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet16uc plogical_shift_left(Packet16uc a) { return vshlq_n_u8(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet4s plogical_shift_left(Packet4s a) { return vshl_n_s16(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet8s plogical_shift_left(Packet8s a) { return vshlq_n_s16(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet4us plogical_shift_left(Packet4us a) { return vshl_n_u16(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet8us plogical_shift_left(Packet8us a) { return vshlq_n_u16(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet2i plogical_shift_left(Packet2i a) { return vshl_n_s32(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet4i plogical_shift_left(Packet4i a) { return vshlq_n_s32(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet2ui plogical_shift_left(Packet2ui a) { return vshl_n_u32(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet4ui plogical_shift_left(Packet4ui a) { return vshlq_n_u32(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet2l plogical_shift_left(Packet2l a) { return vshlq_n_s64(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet2ul plogical_shift_left(Packet2ul a) { return vshlq_n_u64(a,N); }
-
-template<> EIGEN_STRONG_INLINE Packet2f pload<Packet2f>(const float* from)
-{ EIGEN_DEBUG_ALIGNED_LOAD return vld1_f32(from); }
-template<> EIGEN_STRONG_INLINE Packet4f pload<Packet4f>(const float* from)
-{ EIGEN_DEBUG_ALIGNED_LOAD return vld1q_f32(from); }
-template<> EIGEN_STRONG_INLINE Packet4c pload<Packet4c>(const int8_t* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2f pload<Packet2f>(const float* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return vld1_f32(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pload<Packet4f>(const float* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return vld1q_f32(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4c pload<Packet4c>(const int8_t* from) {
   Packet4c res;
   memcpy(&res, from, sizeof(Packet4c));
   return res;
 }
-template<> EIGEN_STRONG_INLINE Packet8c pload<Packet8c>(const int8_t* from)
-{ EIGEN_DEBUG_ALIGNED_LOAD return vld1_s8(from); }
-template<> EIGEN_STRONG_INLINE Packet16c pload<Packet16c>(const int8_t* from)
-{ EIGEN_DEBUG_ALIGNED_LOAD return vld1q_s8(from); }
-template<> EIGEN_STRONG_INLINE Packet4uc pload<Packet4uc>(const uint8_t* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8c pload<Packet8c>(const int8_t* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return vld1_s8(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16c pload<Packet16c>(const int8_t* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return vld1q_s8(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4uc pload<Packet4uc>(const uint8_t* from) {
   Packet4uc res;
   memcpy(&res, from, sizeof(Packet4uc));
   return res;
 }
-template<> EIGEN_STRONG_INLINE Packet8uc pload<Packet8uc>(const uint8_t* from)
-{ EIGEN_DEBUG_ALIGNED_LOAD return vld1_u8(from); }
-template<> EIGEN_STRONG_INLINE Packet16uc pload<Packet16uc>(const uint8_t* from)
-{ EIGEN_DEBUG_ALIGNED_LOAD return vld1q_u8(from); }
-template<> EIGEN_STRONG_INLINE Packet4s pload<Packet4s>(const int16_t* from)
-{ EIGEN_DEBUG_ALIGNED_LOAD return vld1_s16(from); }
-template<> EIGEN_STRONG_INLINE Packet8s pload<Packet8s>(const int16_t* from)
-{ EIGEN_DEBUG_ALIGNED_LOAD return vld1q_s16(from); }
-template<> EIGEN_STRONG_INLINE Packet4us pload<Packet4us>(const uint16_t* from)
-{ EIGEN_DEBUG_ALIGNED_LOAD return vld1_u16(from); }
-template<> EIGEN_STRONG_INLINE Packet8us pload<Packet8us>(const uint16_t* from)
-{ EIGEN_DEBUG_ALIGNED_LOAD return vld1q_u16(from); }
-template<> EIGEN_STRONG_INLINE Packet2i pload<Packet2i>(const int32_t* from)
-{ EIGEN_DEBUG_ALIGNED_LOAD return vld1_s32(from); }
-template<> EIGEN_STRONG_INLINE Packet4i pload<Packet4i>(const int32_t* from)
-{ EIGEN_DEBUG_ALIGNED_LOAD return vld1q_s32(from); }
-template<> EIGEN_STRONG_INLINE Packet2ui pload<Packet2ui>(const uint32_t* from)
-{ EIGEN_DEBUG_ALIGNED_LOAD return vld1_u32(from); }
-template<> EIGEN_STRONG_INLINE Packet4ui pload<Packet4ui>(const uint32_t* from)
-{ EIGEN_DEBUG_ALIGNED_LOAD return vld1q_u32(from); }
-template<> EIGEN_STRONG_INLINE Packet2l pload<Packet2l>(const int64_t* from)
-{ EIGEN_DEBUG_ALIGNED_LOAD return vld1q_s64(from); }
-template<> EIGEN_STRONG_INLINE Packet2ul pload<Packet2ul>(const uint64_t* from)
-{ EIGEN_DEBUG_ALIGNED_LOAD return vld1q_u64(from); }
+template <>
+EIGEN_STRONG_INLINE Packet8uc pload<Packet8uc>(const uint8_t* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return vld1_u8(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16uc pload<Packet16uc>(const uint8_t* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return vld1q_u8(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4s pload<Packet4s>(const int16_t* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return vld1_s16(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s pload<Packet8s>(const int16_t* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return vld1q_s16(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4us pload<Packet4us>(const uint16_t* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return vld1_u16(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us pload<Packet8us>(const uint16_t* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return vld1q_u16(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2i pload<Packet2i>(const int32_t* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return vld1_s32(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pload<Packet4i>(const int32_t* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return vld1q_s32(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ui pload<Packet2ui>(const uint32_t* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return vld1_u32(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui pload<Packet4ui>(const uint32_t* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return vld1q_u32(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2l pload<Packet2l>(const int64_t* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return vld1q_s64(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ul pload<Packet2ul>(const uint64_t* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return vld1q_u64(from);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2f ploadu<Packet2f>(const float* from)
-{ EIGEN_DEBUG_UNALIGNED_LOAD return vld1_f32(from); }
-template<> EIGEN_STRONG_INLINE Packet4f ploadu<Packet4f>(const float* from)
-{ EIGEN_DEBUG_UNALIGNED_LOAD return vld1q_f32(from); }
-template<> EIGEN_STRONG_INLINE Packet4c ploadu<Packet4c>(const int8_t* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2f ploadu<Packet2f>(const float* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return vld1_f32(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f ploadu<Packet4f>(const float* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return vld1q_f32(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4c ploadu<Packet4c>(const int8_t* from) {
   Packet4c res;
   memcpy(&res, from, sizeof(Packet4c));
   return res;
 }
-template<> EIGEN_STRONG_INLINE Packet8c ploadu<Packet8c>(const int8_t* from)
-{ EIGEN_DEBUG_UNALIGNED_LOAD return vld1_s8(from); }
-template<> EIGEN_STRONG_INLINE Packet16c ploadu<Packet16c>(const int8_t* from)
-{ EIGEN_DEBUG_UNALIGNED_LOAD return vld1q_s8(from); }
-template<> EIGEN_STRONG_INLINE Packet4uc ploadu<Packet4uc>(const uint8_t* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8c ploadu<Packet8c>(const int8_t* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return vld1_s8(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16c ploadu<Packet16c>(const int8_t* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return vld1q_s8(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4uc ploadu<Packet4uc>(const uint8_t* from) {
   Packet4uc res;
   memcpy(&res, from, sizeof(Packet4uc));
   return res;
 }
-template<> EIGEN_STRONG_INLINE Packet8uc ploadu<Packet8uc>(const uint8_t* from)
-{ EIGEN_DEBUG_UNALIGNED_LOAD return vld1_u8(from); }
-template<> EIGEN_STRONG_INLINE Packet16uc ploadu<Packet16uc>(const uint8_t* from)
-{ EIGEN_DEBUG_UNALIGNED_LOAD return vld1q_u8(from); }
-template<> EIGEN_STRONG_INLINE Packet4s ploadu<Packet4s>(const int16_t* from)
-{ EIGEN_DEBUG_UNALIGNED_LOAD return vld1_s16(from); }
-template<> EIGEN_STRONG_INLINE Packet8s ploadu<Packet8s>(const int16_t* from)
-{ EIGEN_DEBUG_UNALIGNED_LOAD return vld1q_s16(from); }
-template<> EIGEN_STRONG_INLINE Packet4us ploadu<Packet4us>(const uint16_t* from)
-{ EIGEN_DEBUG_UNALIGNED_LOAD return vld1_u16(from); }
-template<> EIGEN_STRONG_INLINE Packet8us ploadu<Packet8us>(const uint16_t* from)
-{ EIGEN_DEBUG_UNALIGNED_LOAD return vld1q_u16(from); }
-template<> EIGEN_STRONG_INLINE Packet2i ploadu<Packet2i>(const int32_t* from)
-{ EIGEN_DEBUG_UNALIGNED_LOAD return vld1_s32(from); }
-template<> EIGEN_STRONG_INLINE Packet4i ploadu<Packet4i>(const int32_t* from)
-{ EIGEN_DEBUG_UNALIGNED_LOAD return vld1q_s32(from); }
-template<> EIGEN_STRONG_INLINE Packet2ui ploadu<Packet2ui>(const uint32_t* from)
-{ EIGEN_DEBUG_UNALIGNED_LOAD return vld1_u32(from); }
-template<> EIGEN_STRONG_INLINE Packet4ui ploadu<Packet4ui>(const uint32_t* from)
-{ EIGEN_DEBUG_UNALIGNED_LOAD return vld1q_u32(from); }
-template<> EIGEN_STRONG_INLINE Packet2l ploadu<Packet2l>(const int64_t* from)
-{ EIGEN_DEBUG_UNALIGNED_LOAD return vld1q_s64(from); }
-template<> EIGEN_STRONG_INLINE Packet2ul ploadu<Packet2ul>(const uint64_t* from)
-{ EIGEN_DEBUG_UNALIGNED_LOAD return vld1q_u64(from); }
+template <>
+EIGEN_STRONG_INLINE Packet8uc ploadu<Packet8uc>(const uint8_t* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return vld1_u8(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16uc ploadu<Packet16uc>(const uint8_t* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return vld1q_u8(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4s ploadu<Packet4s>(const int16_t* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return vld1_s16(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s ploadu<Packet8s>(const int16_t* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return vld1q_s16(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4us ploadu<Packet4us>(const uint16_t* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return vld1_u16(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us ploadu<Packet8us>(const uint16_t* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return vld1q_u16(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2i ploadu<Packet2i>(const int32_t* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return vld1_s32(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i ploadu<Packet4i>(const int32_t* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return vld1q_s32(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ui ploadu<Packet2ui>(const uint32_t* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return vld1_u32(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui ploadu<Packet4ui>(const uint32_t* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return vld1q_u32(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2l ploadu<Packet2l>(const int64_t* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return vld1q_s64(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ul ploadu<Packet2ul>(const uint64_t* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return vld1q_u64(from);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2f ploaddup<Packet2f>(const float* from)
-{ return vld1_dup_f32(from); }
-template<> EIGEN_STRONG_INLINE Packet4f ploaddup<Packet4f>(const float* from)
-{ return vcombine_f32(vld1_dup_f32(from), vld1_dup_f32(from+1)); }
-template<> EIGEN_STRONG_INLINE Packet4c ploaddup<Packet4c>(const int8_t* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2f ploaddup<Packet2f>(const float* from) {
+  return vld1_dup_f32(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f ploaddup<Packet4f>(const float* from) {
+  return vcombine_f32(vld1_dup_f32(from), vld1_dup_f32(from + 1));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4c ploaddup<Packet4c>(const int8_t* from) {
   const int8x8_t a = vreinterpret_s8_s32(vdup_n_s32(pload<Packet4c>(from)));
-  return vget_lane_s32(vreinterpret_s32_s8(vzip_s8(a,a).val[0]), 0);
+  return vget_lane_s32(vreinterpret_s32_s8(vzip_s8(a, a).val[0]), 0);
 }
-template<> EIGEN_STRONG_INLINE Packet8c ploaddup<Packet8c>(const int8_t* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8c ploaddup<Packet8c>(const int8_t* from) {
   const int8x8_t a = vld1_s8(from);
-  return vzip_s8(a,a).val[0];
+  return vzip_s8(a, a).val[0];
 }
-template<> EIGEN_STRONG_INLINE Packet16c ploaddup<Packet16c>(const int8_t* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet16c ploaddup<Packet16c>(const int8_t* from) {
   const int8x8_t a = vld1_s8(from);
-  const int8x8x2_t b = vzip_s8(a,a);
+  const int8x8x2_t b = vzip_s8(a, a);
   return vcombine_s8(b.val[0], b.val[1]);
 }
-template<> EIGEN_STRONG_INLINE Packet4uc ploaddup<Packet4uc>(const uint8_t* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4uc ploaddup<Packet4uc>(const uint8_t* from) {
   const uint8x8_t a = vreinterpret_u8_u32(vdup_n_u32(pload<Packet4uc>(from)));
-  return vget_lane_u32(vreinterpret_u32_u8(vzip_u8(a,a).val[0]), 0);
+  return vget_lane_u32(vreinterpret_u32_u8(vzip_u8(a, a).val[0]), 0);
 }
-template<> EIGEN_STRONG_INLINE Packet8uc ploaddup<Packet8uc>(const uint8_t* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8uc ploaddup<Packet8uc>(const uint8_t* from) {
   const uint8x8_t a = vld1_u8(from);
-  return vzip_u8(a,a).val[0];
+  return vzip_u8(a, a).val[0];
 }
-template<> EIGEN_STRONG_INLINE Packet16uc ploaddup<Packet16uc>(const uint8_t* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet16uc ploaddup<Packet16uc>(const uint8_t* from) {
   const uint8x8_t a = vld1_u8(from);
-  const uint8x8x2_t b = vzip_u8(a,a);
+  const uint8x8x2_t b = vzip_u8(a, a);
   return vcombine_u8(b.val[0], b.val[1]);
 }
-template<> EIGEN_STRONG_INLINE Packet4s ploaddup<Packet4s>(const int16_t* from)
-{
-  return vreinterpret_s16_u32(vzip_u32(vreinterpret_u32_s16(vld1_dup_s16(from)),
-      vreinterpret_u32_s16(vld1_dup_s16(from+1))).val[0]);
+template <>
+EIGEN_STRONG_INLINE Packet4s ploaddup<Packet4s>(const int16_t* from) {
+  return vreinterpret_s16_u32(
+      vzip_u32(vreinterpret_u32_s16(vld1_dup_s16(from)), vreinterpret_u32_s16(vld1_dup_s16(from + 1))).val[0]);
 }
-template<> EIGEN_STRONG_INLINE Packet8s ploaddup<Packet8s>(const int16_t* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8s ploaddup<Packet8s>(const int16_t* from) {
   const int16x4_t a = vld1_s16(from);
-  const int16x4x2_t b = vzip_s16(a,a);
+  const int16x4x2_t b = vzip_s16(a, a);
   return vcombine_s16(b.val[0], b.val[1]);
 }
-template<> EIGEN_STRONG_INLINE Packet4us ploaddup<Packet4us>(const uint16_t* from)
-{
-  return vreinterpret_u16_u32(vzip_u32(vreinterpret_u32_u16(vld1_dup_u16(from)),
-      vreinterpret_u32_u16(vld1_dup_u16(from+1))).val[0]);
+template <>
+EIGEN_STRONG_INLINE Packet4us ploaddup<Packet4us>(const uint16_t* from) {
+  return vreinterpret_u16_u32(
+      vzip_u32(vreinterpret_u32_u16(vld1_dup_u16(from)), vreinterpret_u32_u16(vld1_dup_u16(from + 1))).val[0]);
 }
-template<> EIGEN_STRONG_INLINE Packet8us ploaddup<Packet8us>(const uint16_t* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet8us ploaddup<Packet8us>(const uint16_t* from) {
   const uint16x4_t a = vld1_u16(from);
-  const uint16x4x2_t b = vzip_u16(a,a);
+  const uint16x4x2_t b = vzip_u16(a, a);
   return vcombine_u16(b.val[0], b.val[1]);
 }
-template<> EIGEN_STRONG_INLINE Packet2i ploaddup<Packet2i>(const int32_t* from)
-{ return vld1_dup_s32(from); }
-template<> EIGEN_STRONG_INLINE Packet4i ploaddup<Packet4i>(const int32_t* from)
-{ return vcombine_s32(vld1_dup_s32(from), vld1_dup_s32(from+1)); }
-template<> EIGEN_STRONG_INLINE Packet2ui ploaddup<Packet2ui>(const uint32_t* from)
-{ return vld1_dup_u32(from); }
-template<> EIGEN_STRONG_INLINE Packet4ui ploaddup<Packet4ui>(const uint32_t* from)
-{ return vcombine_u32(vld1_dup_u32(from), vld1_dup_u32(from+1)); }
-template<> EIGEN_STRONG_INLINE Packet2l ploaddup<Packet2l>(const int64_t* from)
-{ return vld1q_dup_s64(from); }
-template<> EIGEN_STRONG_INLINE Packet2ul ploaddup<Packet2ul>(const uint64_t* from)
-{ return vld1q_dup_u64(from); }
-
-template<> EIGEN_STRONG_INLINE Packet4f ploadquad<Packet4f>(const float* from) { return vld1q_dup_f32(from); }
-template<> EIGEN_STRONG_INLINE Packet4c ploadquad<Packet4c>(const int8_t* from)
-{ return vget_lane_s32(vreinterpret_s32_s8(vld1_dup_s8(from)), 0); }
-template<> EIGEN_STRONG_INLINE Packet8c ploadquad<Packet8c>(const int8_t* from)
-{
-  return vreinterpret_s8_u32(vzip_u32(
-      vreinterpret_u32_s8(vld1_dup_s8(from)),
-      vreinterpret_u32_s8(vld1_dup_s8(from+1))).val[0]);
+template <>
+EIGEN_STRONG_INLINE Packet2i ploaddup<Packet2i>(const int32_t* from) {
+  return vld1_dup_s32(from);
 }
-template<> EIGEN_STRONG_INLINE Packet16c ploadquad<Packet16c>(const int8_t* from)
-{
-  const int8x8_t a = vreinterpret_s8_u32(vzip_u32(
-      vreinterpret_u32_s8(vld1_dup_s8(from)),
-      vreinterpret_u32_s8(vld1_dup_s8(from+1))).val[0]);
-  const int8x8_t b = vreinterpret_s8_u32(vzip_u32(
-      vreinterpret_u32_s8(vld1_dup_s8(from+2)),
-      vreinterpret_u32_s8(vld1_dup_s8(from+3))).val[0]);
-  return vcombine_s8(a,b);
+template <>
+EIGEN_STRONG_INLINE Packet4i ploaddup<Packet4i>(const int32_t* from) {
+  return vcombine_s32(vld1_dup_s32(from), vld1_dup_s32(from + 1));
 }
-template<> EIGEN_STRONG_INLINE Packet4uc ploadquad<Packet4uc>(const uint8_t* from)
-{ return vget_lane_u32(vreinterpret_u32_u8(vld1_dup_u8(from)), 0); }
-template<> EIGEN_STRONG_INLINE Packet8uc ploadquad<Packet8uc>(const uint8_t* from)
-{
-  return vreinterpret_u8_u32(vzip_u32(
-      vreinterpret_u32_u8(vld1_dup_u8(from)),
-      vreinterpret_u32_u8(vld1_dup_u8(from+1))).val[0]);
+template <>
+EIGEN_STRONG_INLINE Packet2ui ploaddup<Packet2ui>(const uint32_t* from) {
+  return vld1_dup_u32(from);
 }
-template<> EIGEN_STRONG_INLINE Packet16uc ploadquad<Packet16uc>(const uint8_t* from)
-{
-  const uint8x8_t a = vreinterpret_u8_u32(vzip_u32(
-      vreinterpret_u32_u8(vld1_dup_u8(from)),
-      vreinterpret_u32_u8(vld1_dup_u8(from+1))).val[0]);
-  const uint8x8_t b = vreinterpret_u8_u32(vzip_u32(
-      vreinterpret_u32_u8(vld1_dup_u8(from+2)),
-      vreinterpret_u32_u8(vld1_dup_u8(from+3))).val[0]);
-  return vcombine_u8(a,b);
+template <>
+EIGEN_STRONG_INLINE Packet4ui ploaddup<Packet4ui>(const uint32_t* from) {
+  return vcombine_u32(vld1_dup_u32(from), vld1_dup_u32(from + 1));
 }
-template<> EIGEN_STRONG_INLINE Packet8s ploadquad<Packet8s>(const int16_t* from)
-{ return vcombine_s16(vld1_dup_s16(from), vld1_dup_s16(from+1)); }
-template<> EIGEN_STRONG_INLINE Packet8us ploadquad<Packet8us>(const uint16_t* from)
-{ return vcombine_u16(vld1_dup_u16(from), vld1_dup_u16(from+1)); }
-template<> EIGEN_STRONG_INLINE Packet4i ploadquad<Packet4i>(const int32_t* from) { return vld1q_dup_s32(from); }
-template<> EIGEN_STRONG_INLINE Packet4ui ploadquad<Packet4ui>(const uint32_t* from) { return vld1q_dup_u32(from); }
+template <>
+EIGEN_STRONG_INLINE Packet2l ploaddup<Packet2l>(const int64_t* from) {
+  return vld1q_dup_s64(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ul ploaddup<Packet2ul>(const uint64_t* from) {
+  return vld1q_dup_u64(from);
+}
 
-template<> EIGEN_STRONG_INLINE void pstore<float>(float* to, const Packet2f& from)
-{ EIGEN_DEBUG_ALIGNED_STORE vst1_f32(to,from); }
-template<> EIGEN_STRONG_INLINE void pstore<float>(float* to, const Packet4f& from)
-{ EIGEN_DEBUG_ALIGNED_STORE vst1q_f32(to,from); }
-template<> EIGEN_STRONG_INLINE void pstore<int8_t>(int8_t* to, const Packet4c& from)
-{ memcpy(to, &from, sizeof(from)); }
-template<> EIGEN_STRONG_INLINE void pstore<int8_t>(int8_t* to, const Packet8c& from)
-{ EIGEN_DEBUG_ALIGNED_STORE vst1_s8(to,from); }
-template<> EIGEN_STRONG_INLINE void pstore<int8_t>(int8_t* to, const Packet16c& from)
-{ EIGEN_DEBUG_ALIGNED_STORE vst1q_s8(to,from); }
-template<> EIGEN_STRONG_INLINE void pstore<uint8_t>(uint8_t* to, const Packet4uc& from)
-{ memcpy(to, &from, sizeof(from)); }
-template<> EIGEN_STRONG_INLINE void pstore<uint8_t>(uint8_t* to, const Packet8uc& from)
-{ EIGEN_DEBUG_ALIGNED_STORE vst1_u8(to,from); }
-template<> EIGEN_STRONG_INLINE void pstore<uint8_t>(uint8_t* to, const Packet16uc& from)
-{ EIGEN_DEBUG_ALIGNED_STORE vst1q_u8(to,from); }
-template<> EIGEN_STRONG_INLINE void pstore<int16_t>(int16_t* to, const Packet4s& from)
-{ EIGEN_DEBUG_ALIGNED_STORE vst1_s16(to,from); }
-template<> EIGEN_STRONG_INLINE void pstore<int16_t>(int16_t* to, const Packet8s& from)
-{ EIGEN_DEBUG_ALIGNED_STORE vst1q_s16(to,from); }
-template<> EIGEN_STRONG_INLINE void pstore<uint16_t>(uint16_t* to, const Packet4us& from)
-{ EIGEN_DEBUG_ALIGNED_STORE vst1_u16(to,from); }
-template<> EIGEN_STRONG_INLINE void pstore<uint16_t>(uint16_t* to, const Packet8us& from)
-{ EIGEN_DEBUG_ALIGNED_STORE vst1q_u16(to,from); }
-template<> EIGEN_STRONG_INLINE void pstore<int32_t>(int32_t* to, const Packet2i& from)
-{ EIGEN_DEBUG_ALIGNED_STORE vst1_s32(to,from); }
-template<> EIGEN_STRONG_INLINE void pstore<int32_t>(int32_t* to, const Packet4i& from)
-{ EIGEN_DEBUG_ALIGNED_STORE vst1q_s32(to,from); }
-template<> EIGEN_STRONG_INLINE void pstore<uint32_t>(uint32_t* to, const Packet2ui& from)
-{ EIGEN_DEBUG_ALIGNED_STORE vst1_u32(to,from); }
-template<> EIGEN_STRONG_INLINE void pstore<uint32_t>(uint32_t* to, const Packet4ui& from)
-{ EIGEN_DEBUG_ALIGNED_STORE vst1q_u32(to,from); }
-template<> EIGEN_STRONG_INLINE void pstore<int64_t>(int64_t* to, const Packet2l& from)
-{ EIGEN_DEBUG_ALIGNED_STORE vst1q_s64(to,from); }
-template<> EIGEN_STRONG_INLINE void pstore<uint64_t>(uint64_t* to, const Packet2ul& from)
-{ EIGEN_DEBUG_ALIGNED_STORE vst1q_u64(to,from); }
+template <>
+EIGEN_STRONG_INLINE Packet4f ploadquad<Packet4f>(const float* from) {
+  return vld1q_dup_f32(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4c ploadquad<Packet4c>(const int8_t* from) {
+  return vget_lane_s32(vreinterpret_s32_s8(vld1_dup_s8(from)), 0);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8c ploadquad<Packet8c>(const int8_t* from) {
+  return vreinterpret_s8_u32(
+      vzip_u32(vreinterpret_u32_s8(vld1_dup_s8(from)), vreinterpret_u32_s8(vld1_dup_s8(from + 1))).val[0]);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16c ploadquad<Packet16c>(const int8_t* from) {
+  const int8x8_t a = vreinterpret_s8_u32(
+      vzip_u32(vreinterpret_u32_s8(vld1_dup_s8(from)), vreinterpret_u32_s8(vld1_dup_s8(from + 1))).val[0]);
+  const int8x8_t b = vreinterpret_s8_u32(
+      vzip_u32(vreinterpret_u32_s8(vld1_dup_s8(from + 2)), vreinterpret_u32_s8(vld1_dup_s8(from + 3))).val[0]);
+  return vcombine_s8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4uc ploadquad<Packet4uc>(const uint8_t* from) {
+  return vget_lane_u32(vreinterpret_u32_u8(vld1_dup_u8(from)), 0);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8uc ploadquad<Packet8uc>(const uint8_t* from) {
+  return vreinterpret_u8_u32(
+      vzip_u32(vreinterpret_u32_u8(vld1_dup_u8(from)), vreinterpret_u32_u8(vld1_dup_u8(from + 1))).val[0]);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16uc ploadquad<Packet16uc>(const uint8_t* from) {
+  const uint8x8_t a = vreinterpret_u8_u32(
+      vzip_u32(vreinterpret_u32_u8(vld1_dup_u8(from)), vreinterpret_u32_u8(vld1_dup_u8(from + 1))).val[0]);
+  const uint8x8_t b = vreinterpret_u8_u32(
+      vzip_u32(vreinterpret_u32_u8(vld1_dup_u8(from + 2)), vreinterpret_u32_u8(vld1_dup_u8(from + 3))).val[0]);
+  return vcombine_u8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s ploadquad<Packet8s>(const int16_t* from) {
+  return vcombine_s16(vld1_dup_s16(from), vld1_dup_s16(from + 1));
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us ploadquad<Packet8us>(const uint16_t* from) {
+  return vcombine_u16(vld1_dup_u16(from), vld1_dup_u16(from + 1));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i ploadquad<Packet4i>(const int32_t* from) {
+  return vld1q_dup_s32(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui ploadquad<Packet4ui>(const uint32_t* from) {
+  return vld1q_dup_u32(from);
+}
 
-template<> EIGEN_STRONG_INLINE void pstoreu<float>(float* to, const Packet2f& from)
-{ EIGEN_DEBUG_UNALIGNED_STORE vst1_f32(to,from); }
-template<> EIGEN_STRONG_INLINE void pstoreu<float>(float* to, const Packet4f& from)
-{ EIGEN_DEBUG_UNALIGNED_STORE vst1q_f32(to,from); }
-template<> EIGEN_STRONG_INLINE void pstoreu<int8_t>(int8_t* to, const Packet4c& from)
-{ memcpy(to, &from, sizeof(from)); }
-template<> EIGEN_STRONG_INLINE void pstoreu<int8_t>(int8_t* to, const Packet8c& from)
-{ EIGEN_DEBUG_UNALIGNED_STORE vst1_s8(to,from); }
-template<> EIGEN_STRONG_INLINE void pstoreu<int8_t>(int8_t* to, const Packet16c& from)
-{ EIGEN_DEBUG_UNALIGNED_STORE vst1q_s8(to,from); }
-template<> EIGEN_STRONG_INLINE void pstoreu<uint8_t>(uint8_t* to, const Packet4uc& from)
-{ memcpy(to, &from, sizeof(from)); }
-template<> EIGEN_STRONG_INLINE void pstoreu<uint8_t>(uint8_t* to, const Packet8uc& from)
-{ EIGEN_DEBUG_UNALIGNED_STORE vst1_u8(to,from); }
-template<> EIGEN_STRONG_INLINE void pstoreu<uint8_t>(uint8_t* to, const Packet16uc& from)
-{ EIGEN_DEBUG_UNALIGNED_STORE vst1q_u8(to,from); }
-template<> EIGEN_STRONG_INLINE void pstoreu<int16_t>(int16_t* to, const Packet4s& from)
-{ EIGEN_DEBUG_UNALIGNED_STORE vst1_s16(to,from); }
-template<> EIGEN_STRONG_INLINE void pstoreu<int16_t>(int16_t* to, const Packet8s& from)
-{ EIGEN_DEBUG_UNALIGNED_STORE vst1q_s16(to,from); }
-template<> EIGEN_STRONG_INLINE void pstoreu<uint16_t>(uint16_t* to, const Packet4us& from)
-{ EIGEN_DEBUG_UNALIGNED_STORE vst1_u16(to,from); }
-template<> EIGEN_STRONG_INLINE void pstoreu<uint16_t>(uint16_t* to, const Packet8us& from)
-{ EIGEN_DEBUG_UNALIGNED_STORE vst1q_u16(to,from); }
-template<> EIGEN_STRONG_INLINE void pstoreu<int32_t>(int32_t* to, const Packet2i& from)
-{ EIGEN_DEBUG_UNALIGNED_STORE vst1_s32(to,from); }
-template<> EIGEN_STRONG_INLINE void pstoreu<int32_t>(int32_t* to, const Packet4i& from)
-{ EIGEN_DEBUG_UNALIGNED_STORE vst1q_s32(to,from); }
-template<> EIGEN_STRONG_INLINE void pstoreu<uint32_t>(uint32_t* to, const Packet2ui& from)
-{ EIGEN_DEBUG_UNALIGNED_STORE vst1_u32(to,from); }
-template<> EIGEN_STRONG_INLINE void pstoreu<uint32_t>(uint32_t* to, const Packet4ui& from)
-{ EIGEN_DEBUG_UNALIGNED_STORE vst1q_u32(to,from); }
-template<> EIGEN_STRONG_INLINE void pstoreu<int64_t>(int64_t* to, const Packet2l& from)
-{ EIGEN_DEBUG_UNALIGNED_STORE vst1q_s64(to,from); }
-template<> EIGEN_STRONG_INLINE void pstoreu<uint64_t>(uint64_t* to, const Packet2ul& from)
-{ EIGEN_DEBUG_UNALIGNED_STORE vst1q_u64(to,from); }
+template <>
+EIGEN_STRONG_INLINE void pstore<float>(float* to, const Packet2f& from) {
+  EIGEN_DEBUG_ALIGNED_STORE vst1_f32(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstore<float>(float* to, const Packet4f& from) {
+  EIGEN_DEBUG_ALIGNED_STORE vst1q_f32(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstore<int8_t>(int8_t* to, const Packet4c& from) {
+  memcpy(to, &from, sizeof(from));
+}
+template <>
+EIGEN_STRONG_INLINE void pstore<int8_t>(int8_t* to, const Packet8c& from) {
+  EIGEN_DEBUG_ALIGNED_STORE vst1_s8(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstore<int8_t>(int8_t* to, const Packet16c& from) {
+  EIGEN_DEBUG_ALIGNED_STORE vst1q_s8(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstore<uint8_t>(uint8_t* to, const Packet4uc& from) {
+  memcpy(to, &from, sizeof(from));
+}
+template <>
+EIGEN_STRONG_INLINE void pstore<uint8_t>(uint8_t* to, const Packet8uc& from) {
+  EIGEN_DEBUG_ALIGNED_STORE vst1_u8(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstore<uint8_t>(uint8_t* to, const Packet16uc& from) {
+  EIGEN_DEBUG_ALIGNED_STORE vst1q_u8(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstore<int16_t>(int16_t* to, const Packet4s& from) {
+  EIGEN_DEBUG_ALIGNED_STORE vst1_s16(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstore<int16_t>(int16_t* to, const Packet8s& from) {
+  EIGEN_DEBUG_ALIGNED_STORE vst1q_s16(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstore<uint16_t>(uint16_t* to, const Packet4us& from) {
+  EIGEN_DEBUG_ALIGNED_STORE vst1_u16(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstore<uint16_t>(uint16_t* to, const Packet8us& from) {
+  EIGEN_DEBUG_ALIGNED_STORE vst1q_u16(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstore<int32_t>(int32_t* to, const Packet2i& from) {
+  EIGEN_DEBUG_ALIGNED_STORE vst1_s32(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstore<int32_t>(int32_t* to, const Packet4i& from) {
+  EIGEN_DEBUG_ALIGNED_STORE vst1q_s32(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstore<uint32_t>(uint32_t* to, const Packet2ui& from) {
+  EIGEN_DEBUG_ALIGNED_STORE vst1_u32(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstore<uint32_t>(uint32_t* to, const Packet4ui& from) {
+  EIGEN_DEBUG_ALIGNED_STORE vst1q_u32(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstore<int64_t>(int64_t* to, const Packet2l& from) {
+  EIGEN_DEBUG_ALIGNED_STORE vst1q_s64(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstore<uint64_t>(uint64_t* to, const Packet2ul& from) {
+  EIGEN_DEBUG_ALIGNED_STORE vst1q_u64(to, from);
+}
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet2f pgather<float, Packet2f>(const float* from, Index stride)
-{
+template <>
+EIGEN_STRONG_INLINE void pstoreu<float>(float* to, const Packet2f& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE vst1_f32(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<float>(float* to, const Packet4f& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE vst1q_f32(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<int8_t>(int8_t* to, const Packet4c& from) {
+  memcpy(to, &from, sizeof(from));
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<int8_t>(int8_t* to, const Packet8c& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE vst1_s8(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<int8_t>(int8_t* to, const Packet16c& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE vst1q_s8(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<uint8_t>(uint8_t* to, const Packet4uc& from) {
+  memcpy(to, &from, sizeof(from));
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<uint8_t>(uint8_t* to, const Packet8uc& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE vst1_u8(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<uint8_t>(uint8_t* to, const Packet16uc& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE vst1q_u8(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<int16_t>(int16_t* to, const Packet4s& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE vst1_s16(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<int16_t>(int16_t* to, const Packet8s& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE vst1q_s16(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<uint16_t>(uint16_t* to, const Packet4us& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE vst1_u16(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<uint16_t>(uint16_t* to, const Packet8us& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE vst1q_u16(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<int32_t>(int32_t* to, const Packet2i& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE vst1_s32(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<int32_t>(int32_t* to, const Packet4i& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE vst1q_s32(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<uint32_t>(uint32_t* to, const Packet2ui& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE vst1_u32(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<uint32_t>(uint32_t* to, const Packet4ui& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE vst1q_u32(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<int64_t>(int64_t* to, const Packet2l& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE vst1q_s64(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<uint64_t>(uint64_t* to, const Packet2ul& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE vst1q_u64(to, from);
+}
+
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet2f pgather<float, Packet2f>(const float* from, Index stride) {
   Packet2f res = vld1_dup_f32(from);
-  res = vld1_lane_f32(from + 1*stride, res, 1);
+  res = vld1_lane_f32(from + 1 * stride, res, 1);
   return res;
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4f pgather<float, Packet4f>(const float* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4f pgather<float, Packet4f>(const float* from, Index stride) {
   Packet4f res = vld1q_dup_f32(from);
-  res = vld1q_lane_f32(from + 1*stride, res, 1);
-  res = vld1q_lane_f32(from + 2*stride, res, 2);
-  res = vld1q_lane_f32(from + 3*stride, res, 3);
+  res = vld1q_lane_f32(from + 1 * stride, res, 1);
+  res = vld1q_lane_f32(from + 2 * stride, res, 2);
+  res = vld1q_lane_f32(from + 3 * stride, res, 3);
   return res;
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4c pgather<int8_t, Packet4c>(const int8_t* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4c pgather<int8_t, Packet4c>(const int8_t* from, Index stride) {
   Packet4c res;
-  for (int i = 0; i != 4; i++)
-    reinterpret_cast<int8_t*>(&res)[i] = *(from + i * stride);
+  for (int i = 0; i != 4; i++) reinterpret_cast<int8_t*>(&res)[i] = *(from + i * stride);
   return res;
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet8c pgather<int8_t, Packet8c>(const int8_t* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet8c pgather<int8_t, Packet8c>(const int8_t* from, Index stride) {
   Packet8c res = vld1_dup_s8(from);
-  res = vld1_lane_s8(from + 1*stride, res, 1);
-  res = vld1_lane_s8(from + 2*stride, res, 2);
-  res = vld1_lane_s8(from + 3*stride, res, 3);
-  res = vld1_lane_s8(from + 4*stride, res, 4);
-  res = vld1_lane_s8(from + 5*stride, res, 5);
-  res = vld1_lane_s8(from + 6*stride, res, 6);
-  res = vld1_lane_s8(from + 7*stride, res, 7);
+  res = vld1_lane_s8(from + 1 * stride, res, 1);
+  res = vld1_lane_s8(from + 2 * stride, res, 2);
+  res = vld1_lane_s8(from + 3 * stride, res, 3);
+  res = vld1_lane_s8(from + 4 * stride, res, 4);
+  res = vld1_lane_s8(from + 5 * stride, res, 5);
+  res = vld1_lane_s8(from + 6 * stride, res, 6);
+  res = vld1_lane_s8(from + 7 * stride, res, 7);
   return res;
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet16c pgather<int8_t, Packet16c>(const int8_t* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet16c pgather<int8_t, Packet16c>(const int8_t* from, Index stride) {
   Packet16c res = vld1q_dup_s8(from);
-  res = vld1q_lane_s8(from + 1*stride, res, 1);
-  res = vld1q_lane_s8(from + 2*stride, res, 2);
-  res = vld1q_lane_s8(from + 3*stride, res, 3);
-  res = vld1q_lane_s8(from + 4*stride, res, 4);
-  res = vld1q_lane_s8(from + 5*stride, res, 5);
-  res = vld1q_lane_s8(from + 6*stride, res, 6);
-  res = vld1q_lane_s8(from + 7*stride, res, 7);
-  res = vld1q_lane_s8(from + 8*stride, res, 8);
-  res = vld1q_lane_s8(from + 9*stride, res, 9);
-  res = vld1q_lane_s8(from + 10*stride, res, 10);
-  res = vld1q_lane_s8(from + 11*stride, res, 11);
-  res = vld1q_lane_s8(from + 12*stride, res, 12);
-  res = vld1q_lane_s8(from + 13*stride, res, 13);
-  res = vld1q_lane_s8(from + 14*stride, res, 14);
-  res = vld1q_lane_s8(from + 15*stride, res, 15);
+  res = vld1q_lane_s8(from + 1 * stride, res, 1);
+  res = vld1q_lane_s8(from + 2 * stride, res, 2);
+  res = vld1q_lane_s8(from + 3 * stride, res, 3);
+  res = vld1q_lane_s8(from + 4 * stride, res, 4);
+  res = vld1q_lane_s8(from + 5 * stride, res, 5);
+  res = vld1q_lane_s8(from + 6 * stride, res, 6);
+  res = vld1q_lane_s8(from + 7 * stride, res, 7);
+  res = vld1q_lane_s8(from + 8 * stride, res, 8);
+  res = vld1q_lane_s8(from + 9 * stride, res, 9);
+  res = vld1q_lane_s8(from + 10 * stride, res, 10);
+  res = vld1q_lane_s8(from + 11 * stride, res, 11);
+  res = vld1q_lane_s8(from + 12 * stride, res, 12);
+  res = vld1q_lane_s8(from + 13 * stride, res, 13);
+  res = vld1q_lane_s8(from + 14 * stride, res, 14);
+  res = vld1q_lane_s8(from + 15 * stride, res, 15);
   return res;
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4uc pgather<uint8_t, Packet4uc>(const uint8_t* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4uc pgather<uint8_t, Packet4uc>(const uint8_t* from, Index stride) {
   Packet4uc res;
-  for (int i = 0; i != 4; i++)
-    reinterpret_cast<uint8_t*>(&res)[i] = *(from + i * stride);
+  for (int i = 0; i != 4; i++) reinterpret_cast<uint8_t*>(&res)[i] = *(from + i * stride);
   return res;
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet8uc pgather<uint8_t, Packet8uc>(const uint8_t* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet8uc pgather<uint8_t, Packet8uc>(const uint8_t* from, Index stride) {
   Packet8uc res = vld1_dup_u8(from);
-  res = vld1_lane_u8(from + 1*stride, res, 1);
-  res = vld1_lane_u8(from + 2*stride, res, 2);
-  res = vld1_lane_u8(from + 3*stride, res, 3);
-  res = vld1_lane_u8(from + 4*stride, res, 4);
-  res = vld1_lane_u8(from + 5*stride, res, 5);
-  res = vld1_lane_u8(from + 6*stride, res, 6);
-  res = vld1_lane_u8(from + 7*stride, res, 7);
+  res = vld1_lane_u8(from + 1 * stride, res, 1);
+  res = vld1_lane_u8(from + 2 * stride, res, 2);
+  res = vld1_lane_u8(from + 3 * stride, res, 3);
+  res = vld1_lane_u8(from + 4 * stride, res, 4);
+  res = vld1_lane_u8(from + 5 * stride, res, 5);
+  res = vld1_lane_u8(from + 6 * stride, res, 6);
+  res = vld1_lane_u8(from + 7 * stride, res, 7);
   return res;
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet16uc pgather<uint8_t, Packet16uc>(const uint8_t* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet16uc pgather<uint8_t, Packet16uc>(const uint8_t* from, Index stride) {
   Packet16uc res = vld1q_dup_u8(from);
-  res = vld1q_lane_u8(from + 1*stride, res, 1);
-  res = vld1q_lane_u8(from + 2*stride, res, 2);
-  res = vld1q_lane_u8(from + 3*stride, res, 3);
-  res = vld1q_lane_u8(from + 4*stride, res, 4);
-  res = vld1q_lane_u8(from + 5*stride, res, 5);
-  res = vld1q_lane_u8(from + 6*stride, res, 6);
-  res = vld1q_lane_u8(from + 7*stride, res, 7);
-  res = vld1q_lane_u8(from + 8*stride, res, 8);
-  res = vld1q_lane_u8(from + 9*stride, res, 9);
-  res = vld1q_lane_u8(from + 10*stride, res, 10);
-  res = vld1q_lane_u8(from + 11*stride, res, 11);
-  res = vld1q_lane_u8(from + 12*stride, res, 12);
-  res = vld1q_lane_u8(from + 13*stride, res, 13);
-  res = vld1q_lane_u8(from + 14*stride, res, 14);
-  res = vld1q_lane_u8(from + 15*stride, res, 15);
+  res = vld1q_lane_u8(from + 1 * stride, res, 1);
+  res = vld1q_lane_u8(from + 2 * stride, res, 2);
+  res = vld1q_lane_u8(from + 3 * stride, res, 3);
+  res = vld1q_lane_u8(from + 4 * stride, res, 4);
+  res = vld1q_lane_u8(from + 5 * stride, res, 5);
+  res = vld1q_lane_u8(from + 6 * stride, res, 6);
+  res = vld1q_lane_u8(from + 7 * stride, res, 7);
+  res = vld1q_lane_u8(from + 8 * stride, res, 8);
+  res = vld1q_lane_u8(from + 9 * stride, res, 9);
+  res = vld1q_lane_u8(from + 10 * stride, res, 10);
+  res = vld1q_lane_u8(from + 11 * stride, res, 11);
+  res = vld1q_lane_u8(from + 12 * stride, res, 12);
+  res = vld1q_lane_u8(from + 13 * stride, res, 13);
+  res = vld1q_lane_u8(from + 14 * stride, res, 14);
+  res = vld1q_lane_u8(from + 15 * stride, res, 15);
   return res;
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4s pgather<int16_t, Packet4s>(const int16_t* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4s pgather<int16_t, Packet4s>(const int16_t* from, Index stride) {
   Packet4s res = vld1_dup_s16(from);
-  res = vld1_lane_s16(from + 1*stride, res, 1);
-  res = vld1_lane_s16(from + 2*stride, res, 2);
-  res = vld1_lane_s16(from + 3*stride, res, 3);
+  res = vld1_lane_s16(from + 1 * stride, res, 1);
+  res = vld1_lane_s16(from + 2 * stride, res, 2);
+  res = vld1_lane_s16(from + 3 * stride, res, 3);
   return res;
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet8s pgather<int16_t, Packet8s>(const int16_t* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet8s pgather<int16_t, Packet8s>(const int16_t* from, Index stride) {
   Packet8s res = vld1q_dup_s16(from);
-  res = vld1q_lane_s16(from + 1*stride, res, 1);
-  res = vld1q_lane_s16(from + 2*stride, res, 2);
-  res = vld1q_lane_s16(from + 3*stride, res, 3);
-  res = vld1q_lane_s16(from + 4*stride, res, 4);
-  res = vld1q_lane_s16(from + 5*stride, res, 5);
-  res = vld1q_lane_s16(from + 6*stride, res, 6);
-  res = vld1q_lane_s16(from + 7*stride, res, 7);
+  res = vld1q_lane_s16(from + 1 * stride, res, 1);
+  res = vld1q_lane_s16(from + 2 * stride, res, 2);
+  res = vld1q_lane_s16(from + 3 * stride, res, 3);
+  res = vld1q_lane_s16(from + 4 * stride, res, 4);
+  res = vld1q_lane_s16(from + 5 * stride, res, 5);
+  res = vld1q_lane_s16(from + 6 * stride, res, 6);
+  res = vld1q_lane_s16(from + 7 * stride, res, 7);
   return res;
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4us pgather<uint16_t, Packet4us>(const uint16_t* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4us pgather<uint16_t, Packet4us>(const uint16_t* from, Index stride) {
   Packet4us res = vld1_dup_u16(from);
-  res = vld1_lane_u16(from + 1*stride, res, 1);
-  res = vld1_lane_u16(from + 2*stride, res, 2);
-  res = vld1_lane_u16(from + 3*stride, res, 3);
+  res = vld1_lane_u16(from + 1 * stride, res, 1);
+  res = vld1_lane_u16(from + 2 * stride, res, 2);
+  res = vld1_lane_u16(from + 3 * stride, res, 3);
   return res;
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet8us pgather<uint16_t, Packet8us>(const uint16_t* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet8us pgather<uint16_t, Packet8us>(const uint16_t* from, Index stride) {
   Packet8us res = vld1q_dup_u16(from);
-  res = vld1q_lane_u16(from + 1*stride, res, 1);
-  res = vld1q_lane_u16(from + 2*stride, res, 2);
-  res = vld1q_lane_u16(from + 3*stride, res, 3);
-  res = vld1q_lane_u16(from + 4*stride, res, 4);
-  res = vld1q_lane_u16(from + 5*stride, res, 5);
-  res = vld1q_lane_u16(from + 6*stride, res, 6);
-  res = vld1q_lane_u16(from + 7*stride, res, 7);
+  res = vld1q_lane_u16(from + 1 * stride, res, 1);
+  res = vld1q_lane_u16(from + 2 * stride, res, 2);
+  res = vld1q_lane_u16(from + 3 * stride, res, 3);
+  res = vld1q_lane_u16(from + 4 * stride, res, 4);
+  res = vld1q_lane_u16(from + 5 * stride, res, 5);
+  res = vld1q_lane_u16(from + 6 * stride, res, 6);
+  res = vld1q_lane_u16(from + 7 * stride, res, 7);
   return res;
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet2i pgather<int32_t, Packet2i>(const int32_t* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet2i pgather<int32_t, Packet2i>(const int32_t* from, Index stride) {
   Packet2i res = vld1_dup_s32(from);
-  res = vld1_lane_s32(from + 1*stride, res, 1);
+  res = vld1_lane_s32(from + 1 * stride, res, 1);
   return res;
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4i pgather<int32_t, Packet4i>(const int32_t* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4i pgather<int32_t, Packet4i>(const int32_t* from, Index stride) {
   Packet4i res = vld1q_dup_s32(from);
-  res = vld1q_lane_s32(from + 1*stride, res, 1);
-  res = vld1q_lane_s32(from + 2*stride, res, 2);
-  res = vld1q_lane_s32(from + 3*stride, res, 3);
+  res = vld1q_lane_s32(from + 1 * stride, res, 1);
+  res = vld1q_lane_s32(from + 2 * stride, res, 2);
+  res = vld1q_lane_s32(from + 3 * stride, res, 3);
   return res;
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet2ui pgather<uint32_t, Packet2ui>(const uint32_t* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet2ui pgather<uint32_t, Packet2ui>(const uint32_t* from, Index stride) {
   Packet2ui res = vld1_dup_u32(from);
-  res = vld1_lane_u32(from + 1*stride, res, 1);
+  res = vld1_lane_u32(from + 1 * stride, res, 1);
   return res;
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4ui pgather<uint32_t, Packet4ui>(const uint32_t* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4ui pgather<uint32_t, Packet4ui>(const uint32_t* from, Index stride) {
   Packet4ui res = vld1q_dup_u32(from);
-  res = vld1q_lane_u32(from + 1*stride, res, 1);
-  res = vld1q_lane_u32(from + 2*stride, res, 2);
-  res = vld1q_lane_u32(from + 3*stride, res, 3);
+  res = vld1q_lane_u32(from + 1 * stride, res, 1);
+  res = vld1q_lane_u32(from + 2 * stride, res, 2);
+  res = vld1q_lane_u32(from + 3 * stride, res, 3);
   return res;
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet2l pgather<int64_t, Packet2l>(const int64_t* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet2l pgather<int64_t, Packet2l>(const int64_t* from, Index stride) {
   Packet2l res = vld1q_dup_s64(from);
-  res = vld1q_lane_s64(from + 1*stride, res, 1);
+  res = vld1q_lane_s64(from + 1 * stride, res, 1);
   return res;
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet2ul pgather<uint64_t, Packet2ul>(const uint64_t* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet2ul pgather<uint64_t, Packet2ul>(const uint64_t* from, Index stride) {
   Packet2ul res = vld1q_dup_u64(from);
-  res = vld1q_lane_u64(from + 1*stride, res, 1);
+  res = vld1q_lane_u64(from + 1 * stride, res, 1);
   return res;
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<float, Packet2f>(float* to, const Packet2f& from, Index stride)
-{
-  vst1_lane_f32(to + stride*0, from, 0);
-  vst1_lane_f32(to + stride*1, from, 1);
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<float, Packet2f>(float* to, const Packet2f& from, Index stride) {
+  vst1_lane_f32(to + stride * 0, from, 0);
+  vst1_lane_f32(to + stride * 1, from, 1);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<float, Packet4f>(float* to, const Packet4f& from, Index stride)
-{
-  vst1q_lane_f32(to + stride*0, from, 0);
-  vst1q_lane_f32(to + stride*1, from, 1);
-  vst1q_lane_f32(to + stride*2, from, 2);
-  vst1q_lane_f32(to + stride*3, from, 3);
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<float, Packet4f>(float* to, const Packet4f& from, Index stride) {
+  vst1q_lane_f32(to + stride * 0, from, 0);
+  vst1q_lane_f32(to + stride * 1, from, 1);
+  vst1q_lane_f32(to + stride * 2, from, 2);
+  vst1q_lane_f32(to + stride * 3, from, 3);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<int8_t, Packet4c>(int8_t* to, const Packet4c& from, Index stride)
-{
-  for (int i = 0; i != 4; i++)
-    *(to + i * stride) = reinterpret_cast<const int8_t*>(&from)[i];
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<int8_t, Packet4c>(int8_t* to, const Packet4c& from, Index stride) {
+  for (int i = 0; i != 4; i++) *(to + i * stride) = reinterpret_cast<const int8_t*>(&from)[i];
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<int8_t, Packet8c>(int8_t* to, const Packet8c& from, Index stride)
-{
-  vst1_lane_s8(to + stride*0, from, 0);
-  vst1_lane_s8(to + stride*1, from, 1);
-  vst1_lane_s8(to + stride*2, from, 2);
-  vst1_lane_s8(to + stride*3, from, 3);
-  vst1_lane_s8(to + stride*4, from, 4);
-  vst1_lane_s8(to + stride*5, from, 5);
-  vst1_lane_s8(to + stride*6, from, 6);
-  vst1_lane_s8(to + stride*7, from, 7);
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<int8_t, Packet8c>(int8_t* to, const Packet8c& from, Index stride) {
+  vst1_lane_s8(to + stride * 0, from, 0);
+  vst1_lane_s8(to + stride * 1, from, 1);
+  vst1_lane_s8(to + stride * 2, from, 2);
+  vst1_lane_s8(to + stride * 3, from, 3);
+  vst1_lane_s8(to + stride * 4, from, 4);
+  vst1_lane_s8(to + stride * 5, from, 5);
+  vst1_lane_s8(to + stride * 6, from, 6);
+  vst1_lane_s8(to + stride * 7, from, 7);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<int8_t, Packet16c>(int8_t* to, const Packet16c& from, Index stride)
-{
-  vst1q_lane_s8(to + stride*0, from, 0);
-  vst1q_lane_s8(to + stride*1, from, 1);
-  vst1q_lane_s8(to + stride*2, from, 2);
-  vst1q_lane_s8(to + stride*3, from, 3);
-  vst1q_lane_s8(to + stride*4, from, 4);
-  vst1q_lane_s8(to + stride*5, from, 5);
-  vst1q_lane_s8(to + stride*6, from, 6);
-  vst1q_lane_s8(to + stride*7, from, 7);
-  vst1q_lane_s8(to + stride*8, from, 8);
-  vst1q_lane_s8(to + stride*9, from, 9);
-  vst1q_lane_s8(to + stride*10, from, 10);
-  vst1q_lane_s8(to + stride*11, from, 11);
-  vst1q_lane_s8(to + stride*12, from, 12);
-  vst1q_lane_s8(to + stride*13, from, 13);
-  vst1q_lane_s8(to + stride*14, from, 14);
-  vst1q_lane_s8(to + stride*15, from, 15);
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<int8_t, Packet16c>(int8_t* to, const Packet16c& from,
+                                                                       Index stride) {
+  vst1q_lane_s8(to + stride * 0, from, 0);
+  vst1q_lane_s8(to + stride * 1, from, 1);
+  vst1q_lane_s8(to + stride * 2, from, 2);
+  vst1q_lane_s8(to + stride * 3, from, 3);
+  vst1q_lane_s8(to + stride * 4, from, 4);
+  vst1q_lane_s8(to + stride * 5, from, 5);
+  vst1q_lane_s8(to + stride * 6, from, 6);
+  vst1q_lane_s8(to + stride * 7, from, 7);
+  vst1q_lane_s8(to + stride * 8, from, 8);
+  vst1q_lane_s8(to + stride * 9, from, 9);
+  vst1q_lane_s8(to + stride * 10, from, 10);
+  vst1q_lane_s8(to + stride * 11, from, 11);
+  vst1q_lane_s8(to + stride * 12, from, 12);
+  vst1q_lane_s8(to + stride * 13, from, 13);
+  vst1q_lane_s8(to + stride * 14, from, 14);
+  vst1q_lane_s8(to + stride * 15, from, 15);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<uint8_t, Packet4uc>(uint8_t* to, const Packet4uc& from, Index stride)
-{
-  for (int i = 0; i != 4; i++)
-    *(to + i * stride) = reinterpret_cast<const uint8_t*>(&from)[i];
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<uint8_t, Packet4uc>(uint8_t* to, const Packet4uc& from,
+                                                                        Index stride) {
+  for (int i = 0; i != 4; i++) *(to + i * stride) = reinterpret_cast<const uint8_t*>(&from)[i];
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<uint8_t, Packet8uc>(uint8_t* to, const Packet8uc& from, Index stride)
-{
-  vst1_lane_u8(to + stride*0, from, 0);
-  vst1_lane_u8(to + stride*1, from, 1);
-  vst1_lane_u8(to + stride*2, from, 2);
-  vst1_lane_u8(to + stride*3, from, 3);
-  vst1_lane_u8(to + stride*4, from, 4);
-  vst1_lane_u8(to + stride*5, from, 5);
-  vst1_lane_u8(to + stride*6, from, 6);
-  vst1_lane_u8(to + stride*7, from, 7);
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<uint8_t, Packet8uc>(uint8_t* to, const Packet8uc& from,
+                                                                        Index stride) {
+  vst1_lane_u8(to + stride * 0, from, 0);
+  vst1_lane_u8(to + stride * 1, from, 1);
+  vst1_lane_u8(to + stride * 2, from, 2);
+  vst1_lane_u8(to + stride * 3, from, 3);
+  vst1_lane_u8(to + stride * 4, from, 4);
+  vst1_lane_u8(to + stride * 5, from, 5);
+  vst1_lane_u8(to + stride * 6, from, 6);
+  vst1_lane_u8(to + stride * 7, from, 7);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<uint8_t, Packet16uc>(uint8_t* to, const Packet16uc& from, Index stride)
-{
-  vst1q_lane_u8(to + stride*0, from, 0);
-  vst1q_lane_u8(to + stride*1, from, 1);
-  vst1q_lane_u8(to + stride*2, from, 2);
-  vst1q_lane_u8(to + stride*3, from, 3);
-  vst1q_lane_u8(to + stride*4, from, 4);
-  vst1q_lane_u8(to + stride*5, from, 5);
-  vst1q_lane_u8(to + stride*6, from, 6);
-  vst1q_lane_u8(to + stride*7, from, 7);
-  vst1q_lane_u8(to + stride*8, from, 8);
-  vst1q_lane_u8(to + stride*9, from, 9);
-  vst1q_lane_u8(to + stride*10, from, 10);
-  vst1q_lane_u8(to + stride*11, from, 11);
-  vst1q_lane_u8(to + stride*12, from, 12);
-  vst1q_lane_u8(to + stride*13, from, 13);
-  vst1q_lane_u8(to + stride*14, from, 14);
-  vst1q_lane_u8(to + stride*15, from, 15);
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<uint8_t, Packet16uc>(uint8_t* to, const Packet16uc& from,
+                                                                         Index stride) {
+  vst1q_lane_u8(to + stride * 0, from, 0);
+  vst1q_lane_u8(to + stride * 1, from, 1);
+  vst1q_lane_u8(to + stride * 2, from, 2);
+  vst1q_lane_u8(to + stride * 3, from, 3);
+  vst1q_lane_u8(to + stride * 4, from, 4);
+  vst1q_lane_u8(to + stride * 5, from, 5);
+  vst1q_lane_u8(to + stride * 6, from, 6);
+  vst1q_lane_u8(to + stride * 7, from, 7);
+  vst1q_lane_u8(to + stride * 8, from, 8);
+  vst1q_lane_u8(to + stride * 9, from, 9);
+  vst1q_lane_u8(to + stride * 10, from, 10);
+  vst1q_lane_u8(to + stride * 11, from, 11);
+  vst1q_lane_u8(to + stride * 12, from, 12);
+  vst1q_lane_u8(to + stride * 13, from, 13);
+  vst1q_lane_u8(to + stride * 14, from, 14);
+  vst1q_lane_u8(to + stride * 15, from, 15);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<int16_t, Packet4s>(int16_t* to, const Packet4s& from, Index stride)
-{
-  vst1_lane_s16(to + stride*0, from, 0);
-  vst1_lane_s16(to + stride*1, from, 1);
-  vst1_lane_s16(to + stride*2, from, 2);
-  vst1_lane_s16(to + stride*3, from, 3);
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<int16_t, Packet4s>(int16_t* to, const Packet4s& from,
+                                                                       Index stride) {
+  vst1_lane_s16(to + stride * 0, from, 0);
+  vst1_lane_s16(to + stride * 1, from, 1);
+  vst1_lane_s16(to + stride * 2, from, 2);
+  vst1_lane_s16(to + stride * 3, from, 3);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<int16_t, Packet8s>(int16_t* to, const Packet8s& from, Index stride)
-{
-  vst1q_lane_s16(to + stride*0, from, 0);
-  vst1q_lane_s16(to + stride*1, from, 1);
-  vst1q_lane_s16(to + stride*2, from, 2);
-  vst1q_lane_s16(to + stride*3, from, 3);
-  vst1q_lane_s16(to + stride*4, from, 4);
-  vst1q_lane_s16(to + stride*5, from, 5);
-  vst1q_lane_s16(to + stride*6, from, 6);
-  vst1q_lane_s16(to + stride*7, from, 7);
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<int16_t, Packet8s>(int16_t* to, const Packet8s& from,
+                                                                       Index stride) {
+  vst1q_lane_s16(to + stride * 0, from, 0);
+  vst1q_lane_s16(to + stride * 1, from, 1);
+  vst1q_lane_s16(to + stride * 2, from, 2);
+  vst1q_lane_s16(to + stride * 3, from, 3);
+  vst1q_lane_s16(to + stride * 4, from, 4);
+  vst1q_lane_s16(to + stride * 5, from, 5);
+  vst1q_lane_s16(to + stride * 6, from, 6);
+  vst1q_lane_s16(to + stride * 7, from, 7);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<uint16_t, Packet4us>(uint16_t* to, const Packet4us& from, Index stride)
-{
-  vst1_lane_u16(to + stride*0, from, 0);
-  vst1_lane_u16(to + stride*1, from, 1);
-  vst1_lane_u16(to + stride*2, from, 2);
-  vst1_lane_u16(to + stride*3, from, 3);
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<uint16_t, Packet4us>(uint16_t* to, const Packet4us& from,
+                                                                         Index stride) {
+  vst1_lane_u16(to + stride * 0, from, 0);
+  vst1_lane_u16(to + stride * 1, from, 1);
+  vst1_lane_u16(to + stride * 2, from, 2);
+  vst1_lane_u16(to + stride * 3, from, 3);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<uint16_t, Packet8us>(uint16_t* to, const Packet8us& from, Index stride)
-{
-  vst1q_lane_u16(to + stride*0, from, 0);
-  vst1q_lane_u16(to + stride*1, from, 1);
-  vst1q_lane_u16(to + stride*2, from, 2);
-  vst1q_lane_u16(to + stride*3, from, 3);
-  vst1q_lane_u16(to + stride*4, from, 4);
-  vst1q_lane_u16(to + stride*5, from, 5);
-  vst1q_lane_u16(to + stride*6, from, 6);
-  vst1q_lane_u16(to + stride*7, from, 7);
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<uint16_t, Packet8us>(uint16_t* to, const Packet8us& from,
+                                                                         Index stride) {
+  vst1q_lane_u16(to + stride * 0, from, 0);
+  vst1q_lane_u16(to + stride * 1, from, 1);
+  vst1q_lane_u16(to + stride * 2, from, 2);
+  vst1q_lane_u16(to + stride * 3, from, 3);
+  vst1q_lane_u16(to + stride * 4, from, 4);
+  vst1q_lane_u16(to + stride * 5, from, 5);
+  vst1q_lane_u16(to + stride * 6, from, 6);
+  vst1q_lane_u16(to + stride * 7, from, 7);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<int32_t, Packet2i>(int32_t* to, const Packet2i& from, Index stride)
-{
-  vst1_lane_s32(to + stride*0, from, 0);
-  vst1_lane_s32(to + stride*1, from, 1);
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<int32_t, Packet2i>(int32_t* to, const Packet2i& from,
+                                                                       Index stride) {
+  vst1_lane_s32(to + stride * 0, from, 0);
+  vst1_lane_s32(to + stride * 1, from, 1);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<int32_t, Packet4i>(int32_t* to, const Packet4i& from, Index stride)
-{
-  vst1q_lane_s32(to + stride*0, from, 0);
-  vst1q_lane_s32(to + stride*1, from, 1);
-  vst1q_lane_s32(to + stride*2, from, 2);
-  vst1q_lane_s32(to + stride*3, from, 3);
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<int32_t, Packet4i>(int32_t* to, const Packet4i& from,
+                                                                       Index stride) {
+  vst1q_lane_s32(to + stride * 0, from, 0);
+  vst1q_lane_s32(to + stride * 1, from, 1);
+  vst1q_lane_s32(to + stride * 2, from, 2);
+  vst1q_lane_s32(to + stride * 3, from, 3);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<uint32_t, Packet2ui>(uint32_t* to, const Packet2ui& from, Index stride)
-{
-  vst1_lane_u32(to + stride*0, from, 0);
-  vst1_lane_u32(to + stride*1, from, 1);
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<uint32_t, Packet2ui>(uint32_t* to, const Packet2ui& from,
+                                                                         Index stride) {
+  vst1_lane_u32(to + stride * 0, from, 0);
+  vst1_lane_u32(to + stride * 1, from, 1);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<uint32_t, Packet4ui>(uint32_t* to, const Packet4ui& from, Index stride)
-{
-  vst1q_lane_u32(to + stride*0, from, 0);
-  vst1q_lane_u32(to + stride*1, from, 1);
-  vst1q_lane_u32(to + stride*2, from, 2);
-  vst1q_lane_u32(to + stride*3, from, 3);
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<uint32_t, Packet4ui>(uint32_t* to, const Packet4ui& from,
+                                                                         Index stride) {
+  vst1q_lane_u32(to + stride * 0, from, 0);
+  vst1q_lane_u32(to + stride * 1, from, 1);
+  vst1q_lane_u32(to + stride * 2, from, 2);
+  vst1q_lane_u32(to + stride * 3, from, 3);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<int64_t, Packet2l>(int64_t* to, const Packet2l& from, Index stride)
-{
-  vst1q_lane_s64(to + stride*0, from, 0);
-  vst1q_lane_s64(to + stride*1, from, 1);
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<int64_t, Packet2l>(int64_t* to, const Packet2l& from,
+                                                                       Index stride) {
+  vst1q_lane_s64(to + stride * 0, from, 0);
+  vst1q_lane_s64(to + stride * 1, from, 1);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<uint64_t, Packet2ul>(uint64_t* to, const Packet2ul& from, Index stride)
-{
-  vst1q_lane_u64(to + stride*0, from, 0);
-  vst1q_lane_u64(to + stride*1, from, 1);
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<uint64_t, Packet2ul>(uint64_t* to, const Packet2ul& from,
+                                                                         Index stride) {
+  vst1q_lane_u64(to + stride * 0, from, 0);
+  vst1q_lane_u64(to + stride * 1, from, 1);
 }
 
-template<> EIGEN_STRONG_INLINE void prefetch<float>(const float* addr) { EIGEN_ARM_PREFETCH(addr); }
-template<> EIGEN_STRONG_INLINE void prefetch<int8_t>(const int8_t* addr) { EIGEN_ARM_PREFETCH(addr); }
-template<> EIGEN_STRONG_INLINE void prefetch<uint8_t>(const uint8_t* addr) { EIGEN_ARM_PREFETCH(addr); }
-template<> EIGEN_STRONG_INLINE void prefetch<int16_t>(const int16_t* addr) { EIGEN_ARM_PREFETCH(addr); }
-template<> EIGEN_STRONG_INLINE void prefetch<uint16_t>(const uint16_t* addr) { EIGEN_ARM_PREFETCH(addr); }
-template<> EIGEN_STRONG_INLINE void prefetch<int32_t>(const int32_t* addr) { EIGEN_ARM_PREFETCH(addr); }
-template<> EIGEN_STRONG_INLINE void prefetch<uint32_t>(const uint32_t* addr) { EIGEN_ARM_PREFETCH(addr); }
-template<> EIGEN_STRONG_INLINE void prefetch<int64_t>(const int64_t* addr) { EIGEN_ARM_PREFETCH(addr); }
-template<> EIGEN_STRONG_INLINE void prefetch<uint64_t>(const uint64_t* addr) { EIGEN_ARM_PREFETCH(addr); }
+template <>
+EIGEN_STRONG_INLINE void prefetch<float>(const float* addr) {
+  EIGEN_ARM_PREFETCH(addr);
+}
+template <>
+EIGEN_STRONG_INLINE void prefetch<int8_t>(const int8_t* addr) {
+  EIGEN_ARM_PREFETCH(addr);
+}
+template <>
+EIGEN_STRONG_INLINE void prefetch<uint8_t>(const uint8_t* addr) {
+  EIGEN_ARM_PREFETCH(addr);
+}
+template <>
+EIGEN_STRONG_INLINE void prefetch<int16_t>(const int16_t* addr) {
+  EIGEN_ARM_PREFETCH(addr);
+}
+template <>
+EIGEN_STRONG_INLINE void prefetch<uint16_t>(const uint16_t* addr) {
+  EIGEN_ARM_PREFETCH(addr);
+}
+template <>
+EIGEN_STRONG_INLINE void prefetch<int32_t>(const int32_t* addr) {
+  EIGEN_ARM_PREFETCH(addr);
+}
+template <>
+EIGEN_STRONG_INLINE void prefetch<uint32_t>(const uint32_t* addr) {
+  EIGEN_ARM_PREFETCH(addr);
+}
+template <>
+EIGEN_STRONG_INLINE void prefetch<int64_t>(const int64_t* addr) {
+  EIGEN_ARM_PREFETCH(addr);
+}
+template <>
+EIGEN_STRONG_INLINE void prefetch<uint64_t>(const uint64_t* addr) {
+  EIGEN_ARM_PREFETCH(addr);
+}
 
-template<> EIGEN_STRONG_INLINE float pfirst<Packet2f>(const Packet2f& a) { return vget_lane_f32(a,0); }
-template<> EIGEN_STRONG_INLINE float pfirst<Packet4f>(const Packet4f& a) { return vgetq_lane_f32(a,0); }
-template<> EIGEN_STRONG_INLINE int8_t pfirst<Packet4c>(const Packet4c& a) { return static_cast<int8_t>(a & 0xff); }
-template<> EIGEN_STRONG_INLINE int8_t pfirst<Packet8c>(const Packet8c& a) { return vget_lane_s8(a,0); }
-template<> EIGEN_STRONG_INLINE int8_t pfirst<Packet16c>(const Packet16c& a) { return vgetq_lane_s8(a,0); }
-template<> EIGEN_STRONG_INLINE uint8_t pfirst<Packet4uc>(const Packet4uc& a) { return static_cast<uint8_t>(a & 0xff); }
-template<> EIGEN_STRONG_INLINE uint8_t pfirst<Packet8uc>(const Packet8uc& a) { return vget_lane_u8(a,0); }
-template<> EIGEN_STRONG_INLINE uint8_t pfirst<Packet16uc>(const Packet16uc& a) { return vgetq_lane_u8(a,0); }
-template<> EIGEN_STRONG_INLINE int16_t pfirst<Packet4s>(const Packet4s& a) { return vget_lane_s16(a,0); }
-template<> EIGEN_STRONG_INLINE int16_t pfirst<Packet8s>(const Packet8s& a) { return vgetq_lane_s16(a,0); }
-template<> EIGEN_STRONG_INLINE uint16_t pfirst<Packet4us>(const Packet4us& a) { return vget_lane_u16(a,0); }
-template<> EIGEN_STRONG_INLINE uint16_t pfirst<Packet8us>(const Packet8us& a) { return vgetq_lane_u16(a,0); }
-template<> EIGEN_STRONG_INLINE int32_t pfirst<Packet2i>(const Packet2i& a) { return vget_lane_s32(a,0); }
-template<> EIGEN_STRONG_INLINE int32_t pfirst<Packet4i>(const Packet4i& a) { return vgetq_lane_s32(a,0); }
-template<> EIGEN_STRONG_INLINE uint32_t pfirst<Packet2ui>(const Packet2ui& a) { return vget_lane_u32(a,0); }
-template<> EIGEN_STRONG_INLINE uint32_t pfirst<Packet4ui>(const Packet4ui& a) { return vgetq_lane_u32(a,0); }
-template<> EIGEN_STRONG_INLINE int64_t pfirst<Packet2l>(const Packet2l& a) { return vgetq_lane_s64(a,0); }
-template<> EIGEN_STRONG_INLINE uint64_t pfirst<Packet2ul>(const Packet2ul& a) { return vgetq_lane_u64(a,0); }
+template <>
+EIGEN_STRONG_INLINE float pfirst<Packet2f>(const Packet2f& a) {
+  return vget_lane_f32(a, 0);
+}
+template <>
+EIGEN_STRONG_INLINE float pfirst<Packet4f>(const Packet4f& a) {
+  return vgetq_lane_f32(a, 0);
+}
+template <>
+EIGEN_STRONG_INLINE int8_t pfirst<Packet4c>(const Packet4c& a) {
+  return static_cast<int8_t>(a & 0xff);
+}
+template <>
+EIGEN_STRONG_INLINE int8_t pfirst<Packet8c>(const Packet8c& a) {
+  return vget_lane_s8(a, 0);
+}
+template <>
+EIGEN_STRONG_INLINE int8_t pfirst<Packet16c>(const Packet16c& a) {
+  return vgetq_lane_s8(a, 0);
+}
+template <>
+EIGEN_STRONG_INLINE uint8_t pfirst<Packet4uc>(const Packet4uc& a) {
+  return static_cast<uint8_t>(a & 0xff);
+}
+template <>
+EIGEN_STRONG_INLINE uint8_t pfirst<Packet8uc>(const Packet8uc& a) {
+  return vget_lane_u8(a, 0);
+}
+template <>
+EIGEN_STRONG_INLINE uint8_t pfirst<Packet16uc>(const Packet16uc& a) {
+  return vgetq_lane_u8(a, 0);
+}
+template <>
+EIGEN_STRONG_INLINE int16_t pfirst<Packet4s>(const Packet4s& a) {
+  return vget_lane_s16(a, 0);
+}
+template <>
+EIGEN_STRONG_INLINE int16_t pfirst<Packet8s>(const Packet8s& a) {
+  return vgetq_lane_s16(a, 0);
+}
+template <>
+EIGEN_STRONG_INLINE uint16_t pfirst<Packet4us>(const Packet4us& a) {
+  return vget_lane_u16(a, 0);
+}
+template <>
+EIGEN_STRONG_INLINE uint16_t pfirst<Packet8us>(const Packet8us& a) {
+  return vgetq_lane_u16(a, 0);
+}
+template <>
+EIGEN_STRONG_INLINE int32_t pfirst<Packet2i>(const Packet2i& a) {
+  return vget_lane_s32(a, 0);
+}
+template <>
+EIGEN_STRONG_INLINE int32_t pfirst<Packet4i>(const Packet4i& a) {
+  return vgetq_lane_s32(a, 0);
+}
+template <>
+EIGEN_STRONG_INLINE uint32_t pfirst<Packet2ui>(const Packet2ui& a) {
+  return vget_lane_u32(a, 0);
+}
+template <>
+EIGEN_STRONG_INLINE uint32_t pfirst<Packet4ui>(const Packet4ui& a) {
+  return vgetq_lane_u32(a, 0);
+}
+template <>
+EIGEN_STRONG_INLINE int64_t pfirst<Packet2l>(const Packet2l& a) {
+  return vgetq_lane_s64(a, 0);
+}
+template <>
+EIGEN_STRONG_INLINE uint64_t pfirst<Packet2ul>(const Packet2ul& a) {
+  return vgetq_lane_u64(a, 0);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2f preverse(const Packet2f& a) { return vrev64_f32(a); }
-template<> EIGEN_STRONG_INLINE Packet4f preverse(const Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2f preverse(const Packet2f& a) {
+  return vrev64_f32(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f preverse(const Packet4f& a) {
   const float32x4_t a_r64 = vrev64q_f32(a);
   return vcombine_f32(vget_high_f32(a_r64), vget_low_f32(a_r64));
 }
-template<> EIGEN_STRONG_INLINE Packet4c preverse(const Packet4c& a)
-{ return vget_lane_s32(vreinterpret_s32_s8(vrev64_s8(vreinterpret_s8_s32(vdup_n_s32(a)))), 0); }
-template<> EIGEN_STRONG_INLINE Packet8c preverse(const Packet8c& a) { return vrev64_s8(a); }
-template<> EIGEN_STRONG_INLINE Packet16c preverse(const Packet16c& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4c preverse(const Packet4c& a) {
+  return vget_lane_s32(vreinterpret_s32_s8(vrev64_s8(vreinterpret_s8_s32(vdup_n_s32(a)))), 0);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8c preverse(const Packet8c& a) {
+  return vrev64_s8(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16c preverse(const Packet16c& a) {
   const int8x16_t a_r64 = vrev64q_s8(a);
   return vcombine_s8(vget_high_s8(a_r64), vget_low_s8(a_r64));
 }
-template<> EIGEN_STRONG_INLINE Packet4uc preverse(const Packet4uc& a)
-{ return vget_lane_u32(vreinterpret_u32_u8(vrev64_u8(vreinterpret_u8_u32(vdup_n_u32(a)))), 0); }
-template<> EIGEN_STRONG_INLINE Packet8uc preverse(const Packet8uc& a) { return vrev64_u8(a); }
-template<> EIGEN_STRONG_INLINE Packet16uc preverse(const Packet16uc& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4uc preverse(const Packet4uc& a) {
+  return vget_lane_u32(vreinterpret_u32_u8(vrev64_u8(vreinterpret_u8_u32(vdup_n_u32(a)))), 0);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8uc preverse(const Packet8uc& a) {
+  return vrev64_u8(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16uc preverse(const Packet16uc& a) {
   const uint8x16_t a_r64 = vrev64q_u8(a);
   return vcombine_u8(vget_high_u8(a_r64), vget_low_u8(a_r64));
 }
-template<> EIGEN_STRONG_INLINE Packet4s preverse(const Packet4s& a) { return vrev64_s16(a); }
-template<> EIGEN_STRONG_INLINE Packet8s preverse(const Packet8s& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4s preverse(const Packet4s& a) {
+  return vrev64_s16(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s preverse(const Packet8s& a) {
   const int16x8_t a_r64 = vrev64q_s16(a);
   return vcombine_s16(vget_high_s16(a_r64), vget_low_s16(a_r64));
 }
-template<> EIGEN_STRONG_INLINE Packet4us preverse(const Packet4us& a) { return vrev64_u16(a); }
-template<> EIGEN_STRONG_INLINE Packet8us preverse(const Packet8us& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4us preverse(const Packet4us& a) {
+  return vrev64_u16(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us preverse(const Packet8us& a) {
   const uint16x8_t a_r64 = vrev64q_u16(a);
   return vcombine_u16(vget_high_u16(a_r64), vget_low_u16(a_r64));
 }
-template<> EIGEN_STRONG_INLINE Packet2i preverse(const Packet2i& a) { return vrev64_s32(a); }
-template<> EIGEN_STRONG_INLINE Packet4i preverse(const Packet4i& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2i preverse(const Packet2i& a) {
+  return vrev64_s32(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i preverse(const Packet4i& a) {
   const int32x4_t a_r64 = vrev64q_s32(a);
   return vcombine_s32(vget_high_s32(a_r64), vget_low_s32(a_r64));
 }
-template<> EIGEN_STRONG_INLINE Packet2ui preverse(const Packet2ui& a) { return vrev64_u32(a); }
-template<> EIGEN_STRONG_INLINE Packet4ui preverse(const Packet4ui& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2ui preverse(const Packet2ui& a) {
+  return vrev64_u32(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui preverse(const Packet4ui& a) {
   const uint32x4_t a_r64 = vrev64q_u32(a);
   return vcombine_u32(vget_high_u32(a_r64), vget_low_u32(a_r64));
 }
-template<> EIGEN_STRONG_INLINE Packet2l preverse(const Packet2l& a)
-{ return vcombine_s64(vget_high_s64(a), vget_low_s64(a)); }
-template<> EIGEN_STRONG_INLINE Packet2ul preverse(const Packet2ul& a)
-{ return vcombine_u64(vget_high_u64(a), vget_low_u64(a)); }
+template <>
+EIGEN_STRONG_INLINE Packet2l preverse(const Packet2l& a) {
+  return vcombine_s64(vget_high_s64(a), vget_low_s64(a));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ul preverse(const Packet2ul& a) {
+  return vcombine_u64(vget_high_u64(a), vget_low_u64(a));
+}
 
-template<> EIGEN_STRONG_INLINE Packet2f pabs(const Packet2f& a) { return vabs_f32(a); }
-template<> EIGEN_STRONG_INLINE Packet4f pabs(const Packet4f& a) { return vabsq_f32(a); }
-template<> EIGEN_STRONG_INLINE Packet4c pabs<Packet4c>(const Packet4c& a)
-{ return vget_lane_s32(vreinterpret_s32_s8(vabs_s8(vreinterpret_s8_s32(vdup_n_s32(a)))), 0); }
-template<> EIGEN_STRONG_INLINE Packet8c pabs(const Packet8c& a) { return vabs_s8(a); }
-template<> EIGEN_STRONG_INLINE Packet16c pabs(const Packet16c& a) { return vabsq_s8(a); }
-template<> EIGEN_STRONG_INLINE Packet4uc pabs(const Packet4uc& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet8uc pabs(const Packet8uc& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet16uc pabs(const Packet16uc& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet4s pabs(const Packet4s& a) { return vabs_s16(a); }
-template<> EIGEN_STRONG_INLINE Packet8s pabs(const Packet8s& a) { return vabsq_s16(a); }
-template<> EIGEN_STRONG_INLINE Packet4us pabs(const Packet4us& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet8us pabs(const Packet8us& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet2i pabs(const Packet2i& a) { return vabs_s32(a); }
-template<> EIGEN_STRONG_INLINE Packet4i pabs(const Packet4i& a) { return vabsq_s32(a); }
-template<> EIGEN_STRONG_INLINE Packet2ui pabs(const Packet2ui& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet4ui pabs(const Packet4ui& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet2l pabs(const Packet2l& a) {
+template <>
+EIGEN_STRONG_INLINE Packet2f pabs(const Packet2f& a) {
+  return vabs_f32(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pabs(const Packet4f& a) {
+  return vabsq_f32(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4c pabs<Packet4c>(const Packet4c& a) {
+  return vget_lane_s32(vreinterpret_s32_s8(vabs_s8(vreinterpret_s8_s32(vdup_n_s32(a)))), 0);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8c pabs(const Packet8c& a) {
+  return vabs_s8(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16c pabs(const Packet16c& a) {
+  return vabsq_s8(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4uc pabs(const Packet4uc& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet8uc pabs(const Packet8uc& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet16uc pabs(const Packet16uc& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet4s pabs(const Packet4s& a) {
+  return vabs_s16(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8s pabs(const Packet8s& a) {
+  return vabsq_s16(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4us pabs(const Packet4us& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet8us pabs(const Packet8us& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet2i pabs(const Packet2i& a) {
+  return vabs_s32(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pabs(const Packet4i& a) {
+  return vabsq_s32(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2ui pabs(const Packet2ui& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui pabs(const Packet4ui& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet2l pabs(const Packet2l& a) {
 #if EIGEN_ARCH_ARM64
   return vabsq_s64(a);
 #else
-  return vcombine_s64(
-      vdup_n_s64((std::abs)(vgetq_lane_s64(a, 0))),
-      vdup_n_s64((std::abs)(vgetq_lane_s64(a, 1))));
+  return vcombine_s64(vdup_n_s64((std::abs)(vgetq_lane_s64(a, 0))), vdup_n_s64((std::abs)(vgetq_lane_s64(a, 1))));
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet2ul pabs(const Packet2ul& a) { return a; }
+template <>
+EIGEN_STRONG_INLINE Packet2ul pabs(const Packet2ul& a) {
+  return a;
+}
 
 template <>
 EIGEN_STRONG_INLINE Packet2f psignbit(const Packet2f& a) {
@@ -2341,47 +3430,70 @@
   return vreinterpretq_f32_s32(vshrq_n_s32(vreinterpretq_s32_f32(a), 31));
 }
 
-template<> EIGEN_STRONG_INLINE Packet2f pfrexp<Packet2f>(const Packet2f& a, Packet2f& exponent)
-{ return pfrexp_generic(a,exponent); }
-template<> EIGEN_STRONG_INLINE Packet4f pfrexp<Packet4f>(const Packet4f& a, Packet4f& exponent)
-{ return pfrexp_generic(a,exponent); }
+template <>
+EIGEN_STRONG_INLINE Packet2f pfrexp<Packet2f>(const Packet2f& a, Packet2f& exponent) {
+  return pfrexp_generic(a, exponent);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pfrexp<Packet4f>(const Packet4f& a, Packet4f& exponent) {
+  return pfrexp_generic(a, exponent);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2f pldexp<Packet2f>(const Packet2f& a, const Packet2f& exponent)
-{ return pldexp_generic(a,exponent); }
-template<> EIGEN_STRONG_INLINE Packet4f pldexp<Packet4f>(const Packet4f& a, const Packet4f& exponent)
-{ return pldexp_generic(a,exponent); }
+template <>
+EIGEN_STRONG_INLINE Packet2f pldexp<Packet2f>(const Packet2f& a, const Packet2f& exponent) {
+  return pldexp_generic(a, exponent);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pldexp<Packet4f>(const Packet4f& a, const Packet4f& exponent) {
+  return pldexp_generic(a, exponent);
+}
 
 #if EIGEN_ARCH_ARM64
-template<> EIGEN_STRONG_INLINE float predux<Packet2f>(const Packet2f& a) { return vaddv_f32(a); }
-template<> EIGEN_STRONG_INLINE float predux<Packet4f>(const Packet4f& a) { return vaddvq_f32(a); }
+template <>
+EIGEN_STRONG_INLINE float predux<Packet2f>(const Packet2f& a) {
+  return vaddv_f32(a);
+}
+template <>
+EIGEN_STRONG_INLINE float predux<Packet4f>(const Packet4f& a) {
+  return vaddvq_f32(a);
+}
 #else
-template<> EIGEN_STRONG_INLINE float predux<Packet2f>(const Packet2f& a) { return vget_lane_f32(vpadd_f32(a,a), 0); }
-template<> EIGEN_STRONG_INLINE float predux<Packet4f>(const Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE float predux<Packet2f>(const Packet2f& a) {
+  return vget_lane_f32(vpadd_f32(a, a), 0);
+}
+template <>
+EIGEN_STRONG_INLINE float predux<Packet4f>(const Packet4f& a) {
   const float32x2_t sum = vadd_f32(vget_low_f32(a), vget_high_f32(a));
   return vget_lane_f32(vpadd_f32(sum, sum), 0);
 }
 #endif
-template<> EIGEN_STRONG_INLINE int8_t predux<Packet4c>(const Packet4c& a)
-{
+template <>
+EIGEN_STRONG_INLINE int8_t predux<Packet4c>(const Packet4c& a) {
   const int8x8_t a_dup = vreinterpret_s8_s32(vdup_n_s32(a));
   int8x8_t sum = vpadd_s8(a_dup, a_dup);
   sum = vpadd_s8(sum, sum);
   return vget_lane_s8(sum, 0);
 }
 #if EIGEN_ARCH_ARM64
-template<> EIGEN_STRONG_INLINE int8_t predux<Packet8c>(const Packet8c& a) { return vaddv_s8(a); }
-template<> EIGEN_STRONG_INLINE int8_t predux<Packet16c>(const Packet16c& a) { return vaddvq_s8(a); }
+template <>
+EIGEN_STRONG_INLINE int8_t predux<Packet8c>(const Packet8c& a) {
+  return vaddv_s8(a);
+}
+template <>
+EIGEN_STRONG_INLINE int8_t predux<Packet16c>(const Packet16c& a) {
+  return vaddvq_s8(a);
+}
 #else
-template<> EIGEN_STRONG_INLINE int8_t predux<Packet8c>(const Packet8c& a)
-{
-  int8x8_t sum = vpadd_s8(a,a);
+template <>
+EIGEN_STRONG_INLINE int8_t predux<Packet8c>(const Packet8c& a) {
+  int8x8_t sum = vpadd_s8(a, a);
   sum = vpadd_s8(sum, sum);
   sum = vpadd_s8(sum, sum);
   return vget_lane_s8(sum, 0);
 }
-template<> EIGEN_STRONG_INLINE int8_t predux<Packet16c>(const Packet16c& a)
-{
+template <>
+EIGEN_STRONG_INLINE int8_t predux<Packet16c>(const Packet16c& a) {
   int8x8_t sum = vadd_s8(vget_low_s8(a), vget_high_s8(a));
   sum = vpadd_s8(sum, sum);
   sum = vpadd_s8(sum, sum);
@@ -2389,144 +3501,204 @@
   return vget_lane_s8(sum, 0);
 }
 #endif
-template<> EIGEN_STRONG_INLINE uint8_t predux<Packet4uc>(const Packet4uc& a)
-{
+template <>
+EIGEN_STRONG_INLINE uint8_t predux<Packet4uc>(const Packet4uc& a) {
   const uint8x8_t a_dup = vreinterpret_u8_u32(vdup_n_u32(a));
   uint8x8_t sum = vpadd_u8(a_dup, a_dup);
   sum = vpadd_u8(sum, sum);
   return vget_lane_u8(sum, 0);
 }
 #if EIGEN_ARCH_ARM64
-template<> EIGEN_STRONG_INLINE uint8_t predux<Packet8uc>(const Packet8uc& a) { return vaddv_u8(a); }
-template<> EIGEN_STRONG_INLINE uint8_t predux<Packet16uc>(const Packet16uc& a) { return vaddvq_u8(a); }
-template<> EIGEN_STRONG_INLINE int16_t predux<Packet4s>(const Packet4s& a) { return vaddv_s16(a); }
-template<> EIGEN_STRONG_INLINE int16_t predux<Packet8s>(const Packet8s& a) { return vaddvq_s16(a); }
-template<> EIGEN_STRONG_INLINE uint16_t predux<Packet4us>(const Packet4us& a) { return vaddv_u16(a); }
-template<> EIGEN_STRONG_INLINE uint16_t predux<Packet8us>(const Packet8us& a) { return vaddvq_u16(a); }
-template<> EIGEN_STRONG_INLINE int32_t predux<Packet2i>(const Packet2i& a) { return vaddv_s32(a); }
-template<> EIGEN_STRONG_INLINE int32_t predux<Packet4i>(const Packet4i& a) { return vaddvq_s32(a); }
-template<> EIGEN_STRONG_INLINE uint32_t predux<Packet2ui>(const Packet2ui& a) { return vaddv_u32(a); }
-template<> EIGEN_STRONG_INLINE uint32_t predux<Packet4ui>(const Packet4ui& a) { return vaddvq_u32(a); }
-template<> EIGEN_STRONG_INLINE int64_t predux<Packet2l>(const Packet2l& a) { return vaddvq_s64(a); }
-template<> EIGEN_STRONG_INLINE uint64_t predux<Packet2ul>(const Packet2ul& a) { return vaddvq_u64(a); }
+template <>
+EIGEN_STRONG_INLINE uint8_t predux<Packet8uc>(const Packet8uc& a) {
+  return vaddv_u8(a);
+}
+template <>
+EIGEN_STRONG_INLINE uint8_t predux<Packet16uc>(const Packet16uc& a) {
+  return vaddvq_u8(a);
+}
+template <>
+EIGEN_STRONG_INLINE int16_t predux<Packet4s>(const Packet4s& a) {
+  return vaddv_s16(a);
+}
+template <>
+EIGEN_STRONG_INLINE int16_t predux<Packet8s>(const Packet8s& a) {
+  return vaddvq_s16(a);
+}
+template <>
+EIGEN_STRONG_INLINE uint16_t predux<Packet4us>(const Packet4us& a) {
+  return vaddv_u16(a);
+}
+template <>
+EIGEN_STRONG_INLINE uint16_t predux<Packet8us>(const Packet8us& a) {
+  return vaddvq_u16(a);
+}
+template <>
+EIGEN_STRONG_INLINE int32_t predux<Packet2i>(const Packet2i& a) {
+  return vaddv_s32(a);
+}
+template <>
+EIGEN_STRONG_INLINE int32_t predux<Packet4i>(const Packet4i& a) {
+  return vaddvq_s32(a);
+}
+template <>
+EIGEN_STRONG_INLINE uint32_t predux<Packet2ui>(const Packet2ui& a) {
+  return vaddv_u32(a);
+}
+template <>
+EIGEN_STRONG_INLINE uint32_t predux<Packet4ui>(const Packet4ui& a) {
+  return vaddvq_u32(a);
+}
+template <>
+EIGEN_STRONG_INLINE int64_t predux<Packet2l>(const Packet2l& a) {
+  return vaddvq_s64(a);
+}
+template <>
+EIGEN_STRONG_INLINE uint64_t predux<Packet2ul>(const Packet2ul& a) {
+  return vaddvq_u64(a);
+}
 #else
-template<> EIGEN_STRONG_INLINE uint8_t predux<Packet8uc>(const Packet8uc& a)
-{
-  uint8x8_t sum = vpadd_u8(a,a);
+template <>
+EIGEN_STRONG_INLINE uint8_t predux<Packet8uc>(const Packet8uc& a) {
+  uint8x8_t sum = vpadd_u8(a, a);
   sum = vpadd_u8(sum, sum);
   sum = vpadd_u8(sum, sum);
   return vget_lane_u8(sum, 0);
 }
-template<> EIGEN_STRONG_INLINE uint8_t predux<Packet16uc>(const Packet16uc& a)
-{
+template <>
+EIGEN_STRONG_INLINE uint8_t predux<Packet16uc>(const Packet16uc& a) {
   uint8x8_t sum = vadd_u8(vget_low_u8(a), vget_high_u8(a));
   sum = vpadd_u8(sum, sum);
   sum = vpadd_u8(sum, sum);
   sum = vpadd_u8(sum, sum);
   return vget_lane_u8(sum, 0);
 }
-template<> EIGEN_STRONG_INLINE int16_t predux<Packet4s>(const Packet4s& a)
-{
-  const int16x4_t sum = vpadd_s16(a,a);
+template <>
+EIGEN_STRONG_INLINE int16_t predux<Packet4s>(const Packet4s& a) {
+  const int16x4_t sum = vpadd_s16(a, a);
   return vget_lane_s16(vpadd_s16(sum, sum), 0);
 }
-template<> EIGEN_STRONG_INLINE int16_t predux<Packet8s>(const Packet8s& a)
-{
+template <>
+EIGEN_STRONG_INLINE int16_t predux<Packet8s>(const Packet8s& a) {
   int16x4_t sum = vadd_s16(vget_low_s16(a), vget_high_s16(a));
   sum = vpadd_s16(sum, sum);
   sum = vpadd_s16(sum, sum);
   return vget_lane_s16(sum, 0);
 }
-template<> EIGEN_STRONG_INLINE uint16_t predux<Packet4us>(const Packet4us& a)
-{
-  const uint16x4_t sum = vpadd_u16(a,a);
+template <>
+EIGEN_STRONG_INLINE uint16_t predux<Packet4us>(const Packet4us& a) {
+  const uint16x4_t sum = vpadd_u16(a, a);
   return vget_lane_u16(vpadd_u16(sum, sum), 0);
 }
-template<> EIGEN_STRONG_INLINE uint16_t predux<Packet8us>(const Packet8us& a)
-{
+template <>
+EIGEN_STRONG_INLINE uint16_t predux<Packet8us>(const Packet8us& a) {
   uint16x4_t sum = vadd_u16(vget_low_u16(a), vget_high_u16(a));
   sum = vpadd_u16(sum, sum);
   sum = vpadd_u16(sum, sum);
   return vget_lane_u16(sum, 0);
 }
-template<> EIGEN_STRONG_INLINE int32_t predux<Packet2i>(const Packet2i& a) { return vget_lane_s32(vpadd_s32(a,a), 0); }
-template<> EIGEN_STRONG_INLINE int32_t predux<Packet4i>(const Packet4i& a)
-{
+template <>
+EIGEN_STRONG_INLINE int32_t predux<Packet2i>(const Packet2i& a) {
+  return vget_lane_s32(vpadd_s32(a, a), 0);
+}
+template <>
+EIGEN_STRONG_INLINE int32_t predux<Packet4i>(const Packet4i& a) {
   const int32x2_t sum = vadd_s32(vget_low_s32(a), vget_high_s32(a));
   return vget_lane_s32(vpadd_s32(sum, sum), 0);
 }
-template<> EIGEN_STRONG_INLINE uint32_t predux<Packet2ui>(const Packet2ui& a) { return vget_lane_u32(vpadd_u32(a,a), 0); }
-template<> EIGEN_STRONG_INLINE uint32_t predux<Packet4ui>(const Packet4ui& a)
-{
+template <>
+EIGEN_STRONG_INLINE uint32_t predux<Packet2ui>(const Packet2ui& a) {
+  return vget_lane_u32(vpadd_u32(a, a), 0);
+}
+template <>
+EIGEN_STRONG_INLINE uint32_t predux<Packet4ui>(const Packet4ui& a) {
   const uint32x2_t sum = vadd_u32(vget_low_u32(a), vget_high_u32(a));
   return vget_lane_u32(vpadd_u32(sum, sum), 0);
 }
-template<> EIGEN_STRONG_INLINE int64_t predux<Packet2l>(const Packet2l& a)
-{ return vgetq_lane_s64(a, 0) + vgetq_lane_s64(a, 1); }
-template<> EIGEN_STRONG_INLINE uint64_t predux<Packet2ul>(const Packet2ul& a)
-{ return vgetq_lane_u64(a, 0) + vgetq_lane_u64(a, 1); }
+template <>
+EIGEN_STRONG_INLINE int64_t predux<Packet2l>(const Packet2l& a) {
+  return vgetq_lane_s64(a, 0) + vgetq_lane_s64(a, 1);
+}
+template <>
+EIGEN_STRONG_INLINE uint64_t predux<Packet2ul>(const Packet2ul& a) {
+  return vgetq_lane_u64(a, 0) + vgetq_lane_u64(a, 1);
+}
 #endif
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4c predux_half_dowto4(const Packet8c& a)
-{
-  return vget_lane_s32(vreinterpret_s32_s8(vadd_s8(a,
-      vreinterpret_s8_s32(vrev64_s32(vreinterpret_s32_s8(a))))), 0);
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4c predux_half_dowto4(const Packet8c& a) {
+  return vget_lane_s32(vreinterpret_s32_s8(vadd_s8(a, vreinterpret_s8_s32(vrev64_s32(vreinterpret_s32_s8(a))))), 0);
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet8c predux_half_dowto4(const Packet16c& a)
-{ return vadd_s8(vget_high_s8(a), vget_low_s8(a)); }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4uc predux_half_dowto4(const Packet8uc& a)
-{
-  return vget_lane_u32(vreinterpret_u32_u8(vadd_u8(a,
-      vreinterpret_u8_u32(vrev64_u32(vreinterpret_u32_u8(a))))), 0);
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet8c predux_half_dowto4(const Packet16c& a) {
+  return vadd_s8(vget_high_s8(a), vget_low_s8(a));
 }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet8uc predux_half_dowto4(const Packet16uc& a)
-{ return vadd_u8(vget_high_u8(a), vget_low_u8(a)); }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4s predux_half_dowto4(const Packet8s& a)
-{ return vadd_s16(vget_high_s16(a), vget_low_s16(a)); }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4us predux_half_dowto4(const Packet8us& a)
-{ return vadd_u16(vget_high_u16(a), vget_low_u16(a)); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4uc predux_half_dowto4(const Packet8uc& a) {
+  return vget_lane_u32(vreinterpret_u32_u8(vadd_u8(a, vreinterpret_u8_u32(vrev64_u32(vreinterpret_u32_u8(a))))), 0);
+}
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet8uc predux_half_dowto4(const Packet16uc& a) {
+  return vadd_u8(vget_high_u8(a), vget_low_u8(a));
+}
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4s predux_half_dowto4(const Packet8s& a) {
+  return vadd_s16(vget_high_s16(a), vget_low_s16(a));
+}
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4us predux_half_dowto4(const Packet8us& a) {
+  return vadd_u16(vget_high_u16(a), vget_low_u16(a));
+}
 
 // Other reduction functions:
 // mul
-template<> EIGEN_STRONG_INLINE float predux_mul<Packet2f>(const Packet2f& a)
-{ return vget_lane_f32(a, 0) * vget_lane_f32(a, 1); }
-template<> EIGEN_STRONG_INLINE float predux_mul<Packet4f>(const Packet4f& a)
-{ return predux_mul<Packet2f>(vmul_f32(vget_low_f32(a), vget_high_f32(a))); }
-template<> EIGEN_STRONG_INLINE int8_t predux_mul<Packet4c>(const Packet4c& a)
-{
+template <>
+EIGEN_STRONG_INLINE float predux_mul<Packet2f>(const Packet2f& a) {
+  return vget_lane_f32(a, 0) * vget_lane_f32(a, 1);
+}
+template <>
+EIGEN_STRONG_INLINE float predux_mul<Packet4f>(const Packet4f& a) {
+  return predux_mul<Packet2f>(vmul_f32(vget_low_f32(a), vget_high_f32(a)));
+}
+template <>
+EIGEN_STRONG_INLINE int8_t predux_mul<Packet4c>(const Packet4c& a) {
   int8x8_t prod = vreinterpret_s8_s32(vdup_n_s32(a));
   prod = vmul_s8(prod, vrev16_s8(prod));
   return vget_lane_s8(prod, 0) * vget_lane_s8(prod, 2);
 }
-template<> EIGEN_STRONG_INLINE int8_t predux_mul<Packet8c>(const Packet8c& a)
-{
+template <>
+EIGEN_STRONG_INLINE int8_t predux_mul<Packet8c>(const Packet8c& a) {
   int8x8_t prod = vmul_s8(a, vrev16_s8(a));
   prod = vmul_s8(prod, vrev32_s8(prod));
   return vget_lane_s8(prod, 0) * vget_lane_s8(prod, 4);
 }
-template<> EIGEN_STRONG_INLINE int8_t predux_mul<Packet16c>(const Packet16c& a)
-{ return predux_mul<Packet8c>(vmul_s8(vget_low_s8(a), vget_high_s8(a))); }
-template<> EIGEN_STRONG_INLINE uint8_t predux_mul<Packet4uc>(const Packet4uc& a)
-{
+template <>
+EIGEN_STRONG_INLINE int8_t predux_mul<Packet16c>(const Packet16c& a) {
+  return predux_mul<Packet8c>(vmul_s8(vget_low_s8(a), vget_high_s8(a)));
+}
+template <>
+EIGEN_STRONG_INLINE uint8_t predux_mul<Packet4uc>(const Packet4uc& a) {
   uint8x8_t prod = vreinterpret_u8_u32(vdup_n_u32(a));
   prod = vmul_u8(prod, vrev16_u8(prod));
   return vget_lane_u8(prod, 0) * vget_lane_u8(prod, 2);
 }
-template<> EIGEN_STRONG_INLINE uint8_t predux_mul<Packet8uc>(const Packet8uc& a)
-{
+template <>
+EIGEN_STRONG_INLINE uint8_t predux_mul<Packet8uc>(const Packet8uc& a) {
   uint8x8_t prod = vmul_u8(a, vrev16_u8(a));
   prod = vmul_u8(prod, vrev32_u8(prod));
   return vget_lane_u8(prod, 0) * vget_lane_u8(prod, 4);
 }
-template<> EIGEN_STRONG_INLINE uint8_t predux_mul<Packet16uc>(const Packet16uc& a)
-{ return predux_mul<Packet8uc>(vmul_u8(vget_low_u8(a), vget_high_u8(a))); }
-template<> EIGEN_STRONG_INLINE int16_t predux_mul<Packet4s>(const Packet4s& a)
-{
+template <>
+EIGEN_STRONG_INLINE uint8_t predux_mul<Packet16uc>(const Packet16uc& a) {
+  return predux_mul<Packet8uc>(vmul_u8(vget_low_u8(a), vget_high_u8(a)));
+}
+template <>
+EIGEN_STRONG_INLINE int16_t predux_mul<Packet4s>(const Packet4s& a) {
   const int16x4_t prod = vmul_s16(a, vrev32_s16(a));
   return vget_lane_s16(prod, 0) * vget_lane_s16(prod, 2);
 }
-template<> EIGEN_STRONG_INLINE int16_t predux_mul<Packet8s>(const Packet8s& a)
-{
+template <>
+EIGEN_STRONG_INLINE int16_t predux_mul<Packet8s>(const Packet8s& a) {
   int16x4_t prod;
 
   // Get the product of a_lo * a_hi -> |a1*a5|a2*a6|a3*a7|a4*a8|
@@ -2536,13 +3708,13 @@
   // Multiply |a1*a5*a2*a6*a3*a7*a4*a8|
   return vget_lane_s16(prod, 0) * vget_lane_s16(prod, 2);
 }
-template<> EIGEN_STRONG_INLINE uint16_t predux_mul<Packet4us>(const Packet4us& a)
-{
+template <>
+EIGEN_STRONG_INLINE uint16_t predux_mul<Packet4us>(const Packet4us& a) {
   const uint16x4_t prod = vmul_u16(a, vrev32_u16(a));
   return vget_lane_u16(prod, 0) * vget_lane_u16(prod, 2);
 }
-template<> EIGEN_STRONG_INLINE uint16_t predux_mul<Packet8us>(const Packet8us& a)
-{
+template <>
+EIGEN_STRONG_INLINE uint16_t predux_mul<Packet8us>(const Packet8us& a) {
   uint16x4_t prod;
 
   // Get the product of a_lo * a_hi -> |a1*a5|a2*a6|a3*a7|a4*a8|
@@ -2552,52 +3724,78 @@
   // Multiply |a1*a5*a2*a6*a3*a7*a4*a8|
   return vget_lane_u16(prod, 0) * vget_lane_u16(prod, 2);
 }
-template<> EIGEN_STRONG_INLINE int32_t predux_mul<Packet2i>(const Packet2i& a)
-{ return vget_lane_s32(a, 0) * vget_lane_s32(a, 1); }
-template<> EIGEN_STRONG_INLINE int32_t predux_mul<Packet4i>(const Packet4i& a)
-{ return predux_mul<Packet2i>(vmul_s32(vget_low_s32(a), vget_high_s32(a))); }
-template<> EIGEN_STRONG_INLINE uint32_t predux_mul<Packet2ui>(const Packet2ui& a)
-{ return vget_lane_u32(a, 0) * vget_lane_u32(a, 1); }
-template<> EIGEN_STRONG_INLINE uint32_t predux_mul<Packet4ui>(const Packet4ui& a)
-{ return predux_mul<Packet2ui>(vmul_u32(vget_low_u32(a), vget_high_u32(a))); }
-template<> EIGEN_STRONG_INLINE int64_t predux_mul<Packet2l>(const Packet2l& a)
-{ return vgetq_lane_s64(a, 0) * vgetq_lane_s64(a, 1); }
-template<> EIGEN_STRONG_INLINE uint64_t predux_mul<Packet2ul>(const Packet2ul& a)
-{ return vgetq_lane_u64(a, 0) * vgetq_lane_u64(a, 1); }
+template <>
+EIGEN_STRONG_INLINE int32_t predux_mul<Packet2i>(const Packet2i& a) {
+  return vget_lane_s32(a, 0) * vget_lane_s32(a, 1);
+}
+template <>
+EIGEN_STRONG_INLINE int32_t predux_mul<Packet4i>(const Packet4i& a) {
+  return predux_mul<Packet2i>(vmul_s32(vget_low_s32(a), vget_high_s32(a)));
+}
+template <>
+EIGEN_STRONG_INLINE uint32_t predux_mul<Packet2ui>(const Packet2ui& a) {
+  return vget_lane_u32(a, 0) * vget_lane_u32(a, 1);
+}
+template <>
+EIGEN_STRONG_INLINE uint32_t predux_mul<Packet4ui>(const Packet4ui& a) {
+  return predux_mul<Packet2ui>(vmul_u32(vget_low_u32(a), vget_high_u32(a)));
+}
+template <>
+EIGEN_STRONG_INLINE int64_t predux_mul<Packet2l>(const Packet2l& a) {
+  return vgetq_lane_s64(a, 0) * vgetq_lane_s64(a, 1);
+}
+template <>
+EIGEN_STRONG_INLINE uint64_t predux_mul<Packet2ul>(const Packet2ul& a) {
+  return vgetq_lane_u64(a, 0) * vgetq_lane_u64(a, 1);
+}
 
 // min
 #if EIGEN_ARCH_ARM64
-template<> EIGEN_STRONG_INLINE float predux_min<Packet2f>(const Packet2f& a) { return vminv_f32(a); }
-template<> EIGEN_STRONG_INLINE float predux_min<Packet4f>(const Packet4f& a) { return vminvq_f32(a); }
+template <>
+EIGEN_STRONG_INLINE float predux_min<Packet2f>(const Packet2f& a) {
+  return vminv_f32(a);
+}
+template <>
+EIGEN_STRONG_INLINE float predux_min<Packet4f>(const Packet4f& a) {
+  return vminvq_f32(a);
+}
 #else
-template<> EIGEN_STRONG_INLINE float predux_min<Packet2f>(const Packet2f& a)
-{ return vget_lane_f32(vpmin_f32(a,a), 0); }
-template<> EIGEN_STRONG_INLINE float predux_min<Packet4f>(const Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE float predux_min<Packet2f>(const Packet2f& a) {
+  return vget_lane_f32(vpmin_f32(a, a), 0);
+}
+template <>
+EIGEN_STRONG_INLINE float predux_min<Packet4f>(const Packet4f& a) {
   const float32x2_t min = vmin_f32(vget_low_f32(a), vget_high_f32(a));
   return vget_lane_f32(vpmin_f32(min, min), 0);
 }
 #endif
-template<> EIGEN_STRONG_INLINE int8_t predux_min<Packet4c>(const Packet4c& a)
-{
+template <>
+EIGEN_STRONG_INLINE int8_t predux_min<Packet4c>(const Packet4c& a) {
   const int8x8_t a_dup = vreinterpret_s8_s32(vdup_n_s32(a));
   int8x8_t min = vpmin_s8(a_dup, a_dup);
   min = vpmin_s8(min, min);
   return vget_lane_s8(min, 0);
 }
 #if EIGEN_ARCH_ARM64
-template<> EIGEN_STRONG_INLINE int8_t predux_min<Packet8c>(const Packet8c& a) { return vminv_s8(a); }
-template<> EIGEN_STRONG_INLINE int8_t predux_min<Packet16c>(const Packet16c& a) { return vminvq_s8(a); }
+template <>
+EIGEN_STRONG_INLINE int8_t predux_min<Packet8c>(const Packet8c& a) {
+  return vminv_s8(a);
+}
+template <>
+EIGEN_STRONG_INLINE int8_t predux_min<Packet16c>(const Packet16c& a) {
+  return vminvq_s8(a);
+}
 #else
-template<> EIGEN_STRONG_INLINE int8_t predux_min<Packet8c>(const Packet8c& a)
-{
-  int8x8_t min = vpmin_s8(a,a);
+template <>
+EIGEN_STRONG_INLINE int8_t predux_min<Packet8c>(const Packet8c& a) {
+  int8x8_t min = vpmin_s8(a, a);
   min = vpmin_s8(min, min);
   min = vpmin_s8(min, min);
   return vget_lane_s8(min, 0);
 }
-template<> EIGEN_STRONG_INLINE int8_t predux_min<Packet16c>(const Packet16c& a)
-{
+template <>
+EIGEN_STRONG_INLINE int8_t predux_min<Packet16c>(const Packet16c& a) {
   int8x8_t min = vmin_s8(vget_low_s8(a), vget_high_s8(a));
   min = vpmin_s8(min, min);
   min = vpmin_s8(min, min);
@@ -2605,117 +3803,169 @@
   return vget_lane_s8(min, 0);
 }
 #endif
-template<> EIGEN_STRONG_INLINE uint8_t predux_min<Packet4uc>(const Packet4uc& a)
-{
+template <>
+EIGEN_STRONG_INLINE uint8_t predux_min<Packet4uc>(const Packet4uc& a) {
   const uint8x8_t a_dup = vreinterpret_u8_u32(vdup_n_u32(a));
   uint8x8_t min = vpmin_u8(a_dup, a_dup);
   min = vpmin_u8(min, min);
   return vget_lane_u8(min, 0);
 }
 #if EIGEN_ARCH_ARM64
-template<> EIGEN_STRONG_INLINE uint8_t predux_min<Packet8uc>(const Packet8uc& a) { return vminv_u8(a); }
-template<> EIGEN_STRONG_INLINE uint8_t predux_min<Packet16uc>(const Packet16uc& a) { return vminvq_u8(a); }
-template<> EIGEN_STRONG_INLINE int16_t predux_min<Packet4s>(const Packet4s& a) { return vminv_s16(a); }
-template<> EIGEN_STRONG_INLINE int16_t predux_min<Packet8s>(const Packet8s& a) { return vminvq_s16(a); }
-template<> EIGEN_STRONG_INLINE uint16_t predux_min<Packet4us>(const Packet4us& a) { return vminv_u16(a); }
-template<> EIGEN_STRONG_INLINE uint16_t predux_min<Packet8us>(const Packet8us& a) { return vminvq_u16(a); }
-template<> EIGEN_STRONG_INLINE int32_t predux_min<Packet2i>(const Packet2i& a) { return vminv_s32(a); }
-template<> EIGEN_STRONG_INLINE int32_t predux_min<Packet4i>(const Packet4i& a) { return vminvq_s32(a); }
-template<> EIGEN_STRONG_INLINE uint32_t predux_min<Packet2ui>(const Packet2ui& a) { return vminv_u32(a); }
-template<> EIGEN_STRONG_INLINE uint32_t predux_min<Packet4ui>(const Packet4ui& a) { return vminvq_u32(a); }
+template <>
+EIGEN_STRONG_INLINE uint8_t predux_min<Packet8uc>(const Packet8uc& a) {
+  return vminv_u8(a);
+}
+template <>
+EIGEN_STRONG_INLINE uint8_t predux_min<Packet16uc>(const Packet16uc& a) {
+  return vminvq_u8(a);
+}
+template <>
+EIGEN_STRONG_INLINE int16_t predux_min<Packet4s>(const Packet4s& a) {
+  return vminv_s16(a);
+}
+template <>
+EIGEN_STRONG_INLINE int16_t predux_min<Packet8s>(const Packet8s& a) {
+  return vminvq_s16(a);
+}
+template <>
+EIGEN_STRONG_INLINE uint16_t predux_min<Packet4us>(const Packet4us& a) {
+  return vminv_u16(a);
+}
+template <>
+EIGEN_STRONG_INLINE uint16_t predux_min<Packet8us>(const Packet8us& a) {
+  return vminvq_u16(a);
+}
+template <>
+EIGEN_STRONG_INLINE int32_t predux_min<Packet2i>(const Packet2i& a) {
+  return vminv_s32(a);
+}
+template <>
+EIGEN_STRONG_INLINE int32_t predux_min<Packet4i>(const Packet4i& a) {
+  return vminvq_s32(a);
+}
+template <>
+EIGEN_STRONG_INLINE uint32_t predux_min<Packet2ui>(const Packet2ui& a) {
+  return vminv_u32(a);
+}
+template <>
+EIGEN_STRONG_INLINE uint32_t predux_min<Packet4ui>(const Packet4ui& a) {
+  return vminvq_u32(a);
+}
 #else
-template<> EIGEN_STRONG_INLINE uint8_t predux_min<Packet8uc>(const Packet8uc& a)
-{
-  uint8x8_t min = vpmin_u8(a,a);
+template <>
+EIGEN_STRONG_INLINE uint8_t predux_min<Packet8uc>(const Packet8uc& a) {
+  uint8x8_t min = vpmin_u8(a, a);
   min = vpmin_u8(min, min);
   min = vpmin_u8(min, min);
   return vget_lane_u8(min, 0);
 }
-template<> EIGEN_STRONG_INLINE uint8_t predux_min<Packet16uc>(const Packet16uc& a)
-{
+template <>
+EIGEN_STRONG_INLINE uint8_t predux_min<Packet16uc>(const Packet16uc& a) {
   uint8x8_t min = vmin_u8(vget_low_u8(a), vget_high_u8(a));
   min = vpmin_u8(min, min);
   min = vpmin_u8(min, min);
   min = vpmin_u8(min, min);
   return vget_lane_u8(min, 0);
 }
-template<> EIGEN_STRONG_INLINE int16_t predux_min<Packet4s>(const Packet4s& a)
-{
-  const int16x4_t min = vpmin_s16(a,a);
+template <>
+EIGEN_STRONG_INLINE int16_t predux_min<Packet4s>(const Packet4s& a) {
+  const int16x4_t min = vpmin_s16(a, a);
   return vget_lane_s16(vpmin_s16(min, min), 0);
 }
-template<> EIGEN_STRONG_INLINE int16_t predux_min<Packet8s>(const Packet8s& a)
-{
+template <>
+EIGEN_STRONG_INLINE int16_t predux_min<Packet8s>(const Packet8s& a) {
   int16x4_t min = vmin_s16(vget_low_s16(a), vget_high_s16(a));
   min = vpmin_s16(min, min);
   min = vpmin_s16(min, min);
   return vget_lane_s16(min, 0);
 }
-template<> EIGEN_STRONG_INLINE uint16_t predux_min<Packet4us>(const Packet4us& a)
-{
-  const uint16x4_t min = vpmin_u16(a,a);
+template <>
+EIGEN_STRONG_INLINE uint16_t predux_min<Packet4us>(const Packet4us& a) {
+  const uint16x4_t min = vpmin_u16(a, a);
   return vget_lane_u16(vpmin_u16(min, min), 0);
 }
-template<> EIGEN_STRONG_INLINE uint16_t predux_min<Packet8us>(const Packet8us& a)
-{
+template <>
+EIGEN_STRONG_INLINE uint16_t predux_min<Packet8us>(const Packet8us& a) {
   uint16x4_t min = vmin_u16(vget_low_u16(a), vget_high_u16(a));
   min = vpmin_u16(min, min);
   min = vpmin_u16(min, min);
   return vget_lane_u16(min, 0);
 }
-template<> EIGEN_STRONG_INLINE int32_t predux_min<Packet2i>(const Packet2i& a)
-{ return vget_lane_s32(vpmin_s32(a,a), 0); }
-template<> EIGEN_STRONG_INLINE int32_t predux_min<Packet4i>(const Packet4i& a)
-{
+template <>
+EIGEN_STRONG_INLINE int32_t predux_min<Packet2i>(const Packet2i& a) {
+  return vget_lane_s32(vpmin_s32(a, a), 0);
+}
+template <>
+EIGEN_STRONG_INLINE int32_t predux_min<Packet4i>(const Packet4i& a) {
   const int32x2_t min = vmin_s32(vget_low_s32(a), vget_high_s32(a));
   return vget_lane_s32(vpmin_s32(min, min), 0);
 }
-template<> EIGEN_STRONG_INLINE uint32_t predux_min<Packet2ui>(const Packet2ui& a)
-{ return vget_lane_u32(vpmin_u32(a,a), 0); }
-template<> EIGEN_STRONG_INLINE uint32_t predux_min<Packet4ui>(const Packet4ui& a)
-{
+template <>
+EIGEN_STRONG_INLINE uint32_t predux_min<Packet2ui>(const Packet2ui& a) {
+  return vget_lane_u32(vpmin_u32(a, a), 0);
+}
+template <>
+EIGEN_STRONG_INLINE uint32_t predux_min<Packet4ui>(const Packet4ui& a) {
   const uint32x2_t min = vmin_u32(vget_low_u32(a), vget_high_u32(a));
   return vget_lane_u32(vpmin_u32(min, min), 0);
 }
 #endif
-template<> EIGEN_STRONG_INLINE int64_t predux_min<Packet2l>(const Packet2l& a)
-{ return (std::min)(vgetq_lane_s64(a, 0), vgetq_lane_s64(a, 1)); }
-template<> EIGEN_STRONG_INLINE uint64_t predux_min<Packet2ul>(const Packet2ul& a)
-{ return (std::min)(vgetq_lane_u64(a, 0), vgetq_lane_u64(a, 1)); }
+template <>
+EIGEN_STRONG_INLINE int64_t predux_min<Packet2l>(const Packet2l& a) {
+  return (std::min)(vgetq_lane_s64(a, 0), vgetq_lane_s64(a, 1));
+}
+template <>
+EIGEN_STRONG_INLINE uint64_t predux_min<Packet2ul>(const Packet2ul& a) {
+  return (std::min)(vgetq_lane_u64(a, 0), vgetq_lane_u64(a, 1));
+}
 
 // max
 #if EIGEN_ARCH_ARM64
-template<> EIGEN_STRONG_INLINE float predux_max<Packet2f>(const Packet2f& a) { return vmaxv_f32(a); }
-template<> EIGEN_STRONG_INLINE float predux_max<Packet4f>(const Packet4f& a) { return vmaxvq_f32(a); }
+template <>
+EIGEN_STRONG_INLINE float predux_max<Packet2f>(const Packet2f& a) {
+  return vmaxv_f32(a);
+}
+template <>
+EIGEN_STRONG_INLINE float predux_max<Packet4f>(const Packet4f& a) {
+  return vmaxvq_f32(a);
+}
 #else
-template<> EIGEN_STRONG_INLINE float predux_max<Packet2f>(const Packet2f& a)
-{ return vget_lane_f32(vpmax_f32(a,a), 0); }
-template<> EIGEN_STRONG_INLINE float predux_max<Packet4f>(const Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE float predux_max<Packet2f>(const Packet2f& a) {
+  return vget_lane_f32(vpmax_f32(a, a), 0);
+}
+template <>
+EIGEN_STRONG_INLINE float predux_max<Packet4f>(const Packet4f& a) {
   const float32x2_t max = vmax_f32(vget_low_f32(a), vget_high_f32(a));
   return vget_lane_f32(vpmax_f32(max, max), 0);
 }
 #endif
-template<> EIGEN_STRONG_INLINE int8_t predux_max<Packet4c>(const Packet4c& a)
-{
+template <>
+EIGEN_STRONG_INLINE int8_t predux_max<Packet4c>(const Packet4c& a) {
   const int8x8_t a_dup = vreinterpret_s8_s32(vdup_n_s32(a));
   int8x8_t max = vpmax_s8(a_dup, a_dup);
   max = vpmax_s8(max, max);
   return vget_lane_s8(max, 0);
 }
 #if EIGEN_ARCH_ARM64
-template<> EIGEN_STRONG_INLINE int8_t predux_max<Packet8c>(const Packet8c& a) { return vmaxv_s8(a); }
-template<> EIGEN_STRONG_INLINE int8_t predux_max<Packet16c>(const Packet16c& a) { return vmaxvq_s8(a); }
+template <>
+EIGEN_STRONG_INLINE int8_t predux_max<Packet8c>(const Packet8c& a) {
+  return vmaxv_s8(a);
+}
+template <>
+EIGEN_STRONG_INLINE int8_t predux_max<Packet16c>(const Packet16c& a) {
+  return vmaxvq_s8(a);
+}
 #else
-template<> EIGEN_STRONG_INLINE int8_t predux_max<Packet8c>(const Packet8c& a)
-{
-  int8x8_t max = vpmax_s8(a,a);
+template <>
+EIGEN_STRONG_INLINE int8_t predux_max<Packet8c>(const Packet8c& a) {
+  int8x8_t max = vpmax_s8(a, a);
   max = vpmax_s8(max, max);
   max = vpmax_s8(max, max);
   return vget_lane_s8(max, 0);
 }
-template<> EIGEN_STRONG_INLINE int8_t predux_max<Packet16c>(const Packet16c& a)
-{
+template <>
+EIGEN_STRONG_INLINE int8_t predux_max<Packet16c>(const Packet16c& a) {
   int8x8_t max = vmax_s8(vget_low_s8(a), vget_high_s8(a));
   max = vpmax_s8(max, max);
   max = vpmax_s8(max, max);
@@ -2723,201 +3973,238 @@
   return vget_lane_s8(max, 0);
 }
 #endif
-template<> EIGEN_STRONG_INLINE uint8_t predux_max<Packet4uc>(const Packet4uc& a)
-{
+template <>
+EIGEN_STRONG_INLINE uint8_t predux_max<Packet4uc>(const Packet4uc& a) {
   const uint8x8_t a_dup = vreinterpret_u8_u32(vdup_n_u32(a));
   uint8x8_t max = vpmax_u8(a_dup, a_dup);
   max = vpmax_u8(max, max);
   return vget_lane_u8(max, 0);
 }
 #if EIGEN_ARCH_ARM64
-template<> EIGEN_STRONG_INLINE uint8_t predux_max<Packet8uc>(const Packet8uc& a) { return vmaxv_u8(a); }
-template<> EIGEN_STRONG_INLINE uint8_t predux_max<Packet16uc>(const Packet16uc& a) { return vmaxvq_u8(a); }
-template<> EIGEN_STRONG_INLINE int16_t predux_max<Packet4s>(const Packet4s& a) { return vmaxv_s16(a); }
-template<> EIGEN_STRONG_INLINE int16_t predux_max<Packet8s>(const Packet8s& a) { return vmaxvq_s16(a); }
-template<> EIGEN_STRONG_INLINE uint16_t predux_max<Packet4us>(const Packet4us& a) { return vmaxv_u16(a); }
-template<> EIGEN_STRONG_INLINE uint16_t predux_max<Packet8us>(const Packet8us& a) { return vmaxvq_u16(a); }
-template<> EIGEN_STRONG_INLINE int32_t predux_max<Packet2i>(const Packet2i& a) { return vmaxv_s32(a); }
-template<> EIGEN_STRONG_INLINE int32_t predux_max<Packet4i>(const Packet4i& a) { return vmaxvq_s32(a); }
-template<> EIGEN_STRONG_INLINE uint32_t predux_max<Packet2ui>(const Packet2ui& a) { return vmaxv_u32(a); }
-template<> EIGEN_STRONG_INLINE uint32_t predux_max<Packet4ui>(const Packet4ui& a) { return vmaxvq_u32(a); }
+template <>
+EIGEN_STRONG_INLINE uint8_t predux_max<Packet8uc>(const Packet8uc& a) {
+  return vmaxv_u8(a);
+}
+template <>
+EIGEN_STRONG_INLINE uint8_t predux_max<Packet16uc>(const Packet16uc& a) {
+  return vmaxvq_u8(a);
+}
+template <>
+EIGEN_STRONG_INLINE int16_t predux_max<Packet4s>(const Packet4s& a) {
+  return vmaxv_s16(a);
+}
+template <>
+EIGEN_STRONG_INLINE int16_t predux_max<Packet8s>(const Packet8s& a) {
+  return vmaxvq_s16(a);
+}
+template <>
+EIGEN_STRONG_INLINE uint16_t predux_max<Packet4us>(const Packet4us& a) {
+  return vmaxv_u16(a);
+}
+template <>
+EIGEN_STRONG_INLINE uint16_t predux_max<Packet8us>(const Packet8us& a) {
+  return vmaxvq_u16(a);
+}
+template <>
+EIGEN_STRONG_INLINE int32_t predux_max<Packet2i>(const Packet2i& a) {
+  return vmaxv_s32(a);
+}
+template <>
+EIGEN_STRONG_INLINE int32_t predux_max<Packet4i>(const Packet4i& a) {
+  return vmaxvq_s32(a);
+}
+template <>
+EIGEN_STRONG_INLINE uint32_t predux_max<Packet2ui>(const Packet2ui& a) {
+  return vmaxv_u32(a);
+}
+template <>
+EIGEN_STRONG_INLINE uint32_t predux_max<Packet4ui>(const Packet4ui& a) {
+  return vmaxvq_u32(a);
+}
 #else
-template<> EIGEN_STRONG_INLINE uint8_t predux_max<Packet8uc>(const Packet8uc& a)
-{
-  uint8x8_t max = vpmax_u8(a,a);
+template <>
+EIGEN_STRONG_INLINE uint8_t predux_max<Packet8uc>(const Packet8uc& a) {
+  uint8x8_t max = vpmax_u8(a, a);
   max = vpmax_u8(max, max);
   max = vpmax_u8(max, max);
   return vget_lane_u8(max, 0);
 }
-template<> EIGEN_STRONG_INLINE uint8_t predux_max<Packet16uc>(const Packet16uc& a)
-{
+template <>
+EIGEN_STRONG_INLINE uint8_t predux_max<Packet16uc>(const Packet16uc& a) {
   uint8x8_t max = vmax_u8(vget_low_u8(a), vget_high_u8(a));
   max = vpmax_u8(max, max);
   max = vpmax_u8(max, max);
   max = vpmax_u8(max, max);
   return vget_lane_u8(max, 0);
 }
-template<> EIGEN_STRONG_INLINE int16_t predux_max<Packet4s>(const Packet4s& a)
-{
-  const int16x4_t max = vpmax_s16(a,a);
+template <>
+EIGEN_STRONG_INLINE int16_t predux_max<Packet4s>(const Packet4s& a) {
+  const int16x4_t max = vpmax_s16(a, a);
   return vget_lane_s16(vpmax_s16(max, max), 0);
 }
-template<> EIGEN_STRONG_INLINE int16_t predux_max<Packet8s>(const Packet8s& a)
-{
+template <>
+EIGEN_STRONG_INLINE int16_t predux_max<Packet8s>(const Packet8s& a) {
   int16x4_t max = vmax_s16(vget_low_s16(a), vget_high_s16(a));
   max = vpmax_s16(max, max);
   max = vpmax_s16(max, max);
   return vget_lane_s16(max, 0);
 }
-template<> EIGEN_STRONG_INLINE uint16_t predux_max<Packet4us>(const Packet4us& a)
-{
-  const uint16x4_t max = vpmax_u16(a,a);
+template <>
+EIGEN_STRONG_INLINE uint16_t predux_max<Packet4us>(const Packet4us& a) {
+  const uint16x4_t max = vpmax_u16(a, a);
   return vget_lane_u16(vpmax_u16(max, max), 0);
 }
-template<> EIGEN_STRONG_INLINE uint16_t predux_max<Packet8us>(const Packet8us& a)
-{
+template <>
+EIGEN_STRONG_INLINE uint16_t predux_max<Packet8us>(const Packet8us& a) {
   uint16x4_t max = vmax_u16(vget_low_u16(a), vget_high_u16(a));
   max = vpmax_u16(max, max);
   max = vpmax_u16(max, max);
   return vget_lane_u16(max, 0);
 }
-template<> EIGEN_STRONG_INLINE int32_t predux_max<Packet2i>(const Packet2i& a)
-{ return vget_lane_s32(vpmax_s32(a,a), 0); }
-template<> EIGEN_STRONG_INLINE int32_t predux_max<Packet4i>(const Packet4i& a)
-{
+template <>
+EIGEN_STRONG_INLINE int32_t predux_max<Packet2i>(const Packet2i& a) {
+  return vget_lane_s32(vpmax_s32(a, a), 0);
+}
+template <>
+EIGEN_STRONG_INLINE int32_t predux_max<Packet4i>(const Packet4i& a) {
   const int32x2_t max = vmax_s32(vget_low_s32(a), vget_high_s32(a));
   return vget_lane_s32(vpmax_s32(max, max), 0);
 }
-template<> EIGEN_STRONG_INLINE uint32_t predux_max<Packet2ui>(const Packet2ui& a)
-{ return vget_lane_u32(vpmax_u32(a,a), 0); }
-template<> EIGEN_STRONG_INLINE uint32_t predux_max<Packet4ui>(const Packet4ui& a)
-{
+template <>
+EIGEN_STRONG_INLINE uint32_t predux_max<Packet2ui>(const Packet2ui& a) {
+  return vget_lane_u32(vpmax_u32(a, a), 0);
+}
+template <>
+EIGEN_STRONG_INLINE uint32_t predux_max<Packet4ui>(const Packet4ui& a) {
   const uint32x2_t max = vmax_u32(vget_low_u32(a), vget_high_u32(a));
   return vget_lane_u32(vpmax_u32(max, max), 0);
 }
 #endif
-template<> EIGEN_STRONG_INLINE int64_t predux_max<Packet2l>(const Packet2l& a)
-{ return (std::max)(vgetq_lane_s64(a, 0), vgetq_lane_s64(a, 1)); }
-template<> EIGEN_STRONG_INLINE uint64_t predux_max<Packet2ul>(const Packet2ul& a)
-{ return (std::max)(vgetq_lane_u64(a, 0), vgetq_lane_u64(a, 1)); }
+template <>
+EIGEN_STRONG_INLINE int64_t predux_max<Packet2l>(const Packet2l& a) {
+  return (std::max)(vgetq_lane_s64(a, 0), vgetq_lane_s64(a, 1));
+}
+template <>
+EIGEN_STRONG_INLINE uint64_t predux_max<Packet2ul>(const Packet2ul& a) {
+  return (std::max)(vgetq_lane_u64(a, 0), vgetq_lane_u64(a, 1));
+}
 
-template<> EIGEN_STRONG_INLINE bool predux_any(const Packet4f& x)
-{
-  uint32x2_t tmp = vorr_u32(vget_low_u32( vreinterpretq_u32_f32(x)),
-                            vget_high_u32(vreinterpretq_u32_f32(x)));
+template <>
+EIGEN_STRONG_INLINE bool predux_any(const Packet4f& x) {
+  uint32x2_t tmp = vorr_u32(vget_low_u32(vreinterpretq_u32_f32(x)), vget_high_u32(vreinterpretq_u32_f32(x)));
   return vget_lane_u32(vpmax_u32(tmp, tmp), 0);
 }
 
 // Helpers for ptranspose.
 namespace detail {
-  
-template<typename Packet>
+
+template <typename Packet>
 void zip_in_place(Packet& p1, Packet& p2);
 
-template<>
+template <>
 EIGEN_ALWAYS_INLINE void zip_in_place<Packet2f>(Packet2f& p1, Packet2f& p2) {
   const float32x2x2_t tmp = vzip_f32(p1, p2);
   p1 = tmp.val[0];
   p2 = tmp.val[1];
 }
 
-template<>
+template <>
 EIGEN_ALWAYS_INLINE void zip_in_place<Packet4f>(Packet4f& p1, Packet4f& p2) {
   const float32x4x2_t tmp = vzipq_f32(p1, p2);
   p1 = tmp.val[0];
   p2 = tmp.val[1];
 }
 
-template<>
+template <>
 EIGEN_ALWAYS_INLINE void zip_in_place<Packet8c>(Packet8c& p1, Packet8c& p2) {
   const int8x8x2_t tmp = vzip_s8(p1, p2);
   p1 = tmp.val[0];
   p2 = tmp.val[1];
 }
 
-template<>
+template <>
 EIGEN_ALWAYS_INLINE void zip_in_place<Packet16c>(Packet16c& p1, Packet16c& p2) {
   const int8x16x2_t tmp = vzipq_s8(p1, p2);
   p1 = tmp.val[0];
   p2 = tmp.val[1];
 }
 
-template<>
+template <>
 EIGEN_ALWAYS_INLINE void zip_in_place<Packet8uc>(Packet8uc& p1, Packet8uc& p2) {
   const uint8x8x2_t tmp = vzip_u8(p1, p2);
   p1 = tmp.val[0];
   p2 = tmp.val[1];
 }
 
-template<>
+template <>
 EIGEN_ALWAYS_INLINE void zip_in_place<Packet16uc>(Packet16uc& p1, Packet16uc& p2) {
   const uint8x16x2_t tmp = vzipq_u8(p1, p2);
   p1 = tmp.val[0];
   p2 = tmp.val[1];
 }
 
-template<>
+template <>
 EIGEN_ALWAYS_INLINE void zip_in_place<Packet2i>(Packet2i& p1, Packet2i& p2) {
   const int32x2x2_t tmp = vzip_s32(p1, p2);
   p1 = tmp.val[0];
   p2 = tmp.val[1];
 }
 
-template<>
+template <>
 EIGEN_ALWAYS_INLINE void zip_in_place<Packet4i>(Packet4i& p1, Packet4i& p2) {
   const int32x4x2_t tmp = vzipq_s32(p1, p2);
   p1 = tmp.val[0];
   p2 = tmp.val[1];
 }
 
-template<>
+template <>
 EIGEN_ALWAYS_INLINE void zip_in_place<Packet2ui>(Packet2ui& p1, Packet2ui& p2) {
   const uint32x2x2_t tmp = vzip_u32(p1, p2);
   p1 = tmp.val[0];
   p2 = tmp.val[1];
 }
 
-template<>
+template <>
 EIGEN_ALWAYS_INLINE void zip_in_place<Packet4ui>(Packet4ui& p1, Packet4ui& p2) {
   const uint32x4x2_t tmp = vzipq_u32(p1, p2);
   p1 = tmp.val[0];
   p2 = tmp.val[1];
 }
 
-template<>
+template <>
 EIGEN_ALWAYS_INLINE void zip_in_place<Packet4s>(Packet4s& p1, Packet4s& p2) {
   const int16x4x2_t tmp = vzip_s16(p1, p2);
   p1 = tmp.val[0];
   p2 = tmp.val[1];
 }
 
-template<>
+template <>
 EIGEN_ALWAYS_INLINE void zip_in_place<Packet8s>(Packet8s& p1, Packet8s& p2) {
   const int16x8x2_t tmp = vzipq_s16(p1, p2);
   p1 = tmp.val[0];
   p2 = tmp.val[1];
 }
 
-template<>
+template <>
 EIGEN_ALWAYS_INLINE void zip_in_place<Packet4us>(Packet4us& p1, Packet4us& p2) {
   const uint16x4x2_t tmp = vzip_u16(p1, p2);
   p1 = tmp.val[0];
   p2 = tmp.val[1];
 }
 
-template<>
+template <>
 EIGEN_ALWAYS_INLINE void zip_in_place<Packet8us>(Packet8us& p1, Packet8us& p2) {
   const uint16x8x2_t tmp = vzipq_u16(p1, p2);
   p1 = tmp.val[0];
   p2 = tmp.val[1];
 }
 
-template<typename Packet>
+template <typename Packet>
 EIGEN_ALWAYS_INLINE void ptranspose_impl(PacketBlock<Packet, 2>& kernel) {
   zip_in_place(kernel.packet[0], kernel.packet[1]);
 }
 
-template<typename Packet>
+template <typename Packet>
 EIGEN_ALWAYS_INLINE void ptranspose_impl(PacketBlock<Packet, 4>& kernel) {
   zip_in_place(kernel.packet[0], kernel.packet[2]);
   zip_in_place(kernel.packet[1], kernel.packet[3]);
@@ -2925,7 +4212,7 @@
   zip_in_place(kernel.packet[2], kernel.packet[3]);
 }
 
-template<typename Packet>
+template <typename Packet>
 EIGEN_ALWAYS_INLINE void ptranspose_impl(PacketBlock<Packet, 8>& kernel) {
   zip_in_place(kernel.packet[0], kernel.packet[4]);
   zip_in_place(kernel.packet[1], kernel.packet[5]);
@@ -2936,31 +4223,31 @@
   zip_in_place(kernel.packet[1], kernel.packet[3]);
   zip_in_place(kernel.packet[4], kernel.packet[6]);
   zip_in_place(kernel.packet[5], kernel.packet[7]);
-  
+
   zip_in_place(kernel.packet[0], kernel.packet[1]);
   zip_in_place(kernel.packet[2], kernel.packet[3]);
   zip_in_place(kernel.packet[4], kernel.packet[5]);
   zip_in_place(kernel.packet[6], kernel.packet[7]);
 }
 
-template<typename Packet>
+template <typename Packet>
 EIGEN_ALWAYS_INLINE void ptranspose_impl(PacketBlock<Packet, 16>& kernel) {
   EIGEN_UNROLL_LOOP
-  for (int i=0; i<4; ++i) {
+  for (int i = 0; i < 4; ++i) {
     const int m = (1 << i);
     EIGEN_UNROLL_LOOP
-    for (int j=0; j<m; ++j) {
-      const int n = (1 << (3-i));
+    for (int j = 0; j < m; ++j) {
+      const int n = (1 << (3 - i));
       EIGEN_UNROLL_LOOP
-      for (int k=0; k<n; ++k) {
-        const int idx = 2*j*n+k;
+      for (int k = 0; k < n; ++k) {
+        const int idx = 2 * j * n + k;
         zip_in_place(kernel.packet[idx], kernel.packet[idx + n]);
       }
     }
   }
 }
 
-} // namespace detail
+}  // namespace detail
 
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet2f, 2>& kernel) {
   detail::ptranspose_impl(kernel);
@@ -2969,12 +4256,11 @@
   detail::ptranspose_impl(kernel);
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet4c, 4>& kernel)
-{
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet4c, 4>& kernel) {
   const int8x8_t a = vreinterpret_s8_s32(vset_lane_s32(kernel.packet[2], vdup_n_s32(kernel.packet[0]), 1));
   const int8x8_t b = vreinterpret_s8_s32(vset_lane_s32(kernel.packet[3], vdup_n_s32(kernel.packet[1]), 1));
 
-  const int8x8x2_t zip8 = vzip_s8(a,b);
+  const int8x8x2_t zip8 = vzip_s8(a, b);
   const int16x4x2_t zip16 = vzip_s16(vreinterpret_s16_s8(zip8.val[0]), vreinterpret_s16_s8(zip8.val[1]));
 
   kernel.packet[0] = vget_lane_s32(vreinterpret_s32_s16(zip16.val[0]), 0);
@@ -2998,12 +4284,11 @@
   detail::ptranspose_impl(kernel);
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet4uc, 4>& kernel)
-{
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet4uc, 4>& kernel) {
   const uint8x8_t a = vreinterpret_u8_u32(vset_lane_u32(kernel.packet[2], vdup_n_u32(kernel.packet[0]), 1));
   const uint8x8_t b = vreinterpret_u8_u32(vset_lane_u32(kernel.packet[3], vdup_n_u32(kernel.packet[1]), 1));
 
-  const uint8x8x2_t zip8 = vzip_u8(a,b);
+  const uint8x8x2_t zip8 = vzip_u8(a, b);
   const uint16x4x2_t zip16 = vzip_u16(vreinterpret_u16_u8(zip8.val[0]), vreinterpret_u16_u8(zip8.val[1]));
 
   kernel.packet[0] = vget_lane_u32(vreinterpret_u32_u16(zip16.val[0]), 0);
@@ -3051,7 +4336,7 @@
   detail::ptranspose_impl(kernel);
 }
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet4i, 4>& kernel) {
-    detail::ptranspose_impl(kernel);
+  detail::ptranspose_impl(kernel);
 }
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet2ui, 2>& kernel) {
   detail::zip_in_place(kernel.packet[0], kernel.packet[1]);
@@ -3060,158 +4345,195 @@
   detail::ptranspose_impl(kernel);
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void
-ptranspose(PacketBlock<Packet2l, 2>& kernel)
-{
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet2l, 2>& kernel) {
 #if EIGEN_ARCH_ARM64
   const int64x2_t tmp1 = vzip1q_s64(kernel.packet[0], kernel.packet[1]);
   kernel.packet[1] = vzip2q_s64(kernel.packet[0], kernel.packet[1]);
   kernel.packet[0] = tmp1;
 #else
-  const int64x1_t tmp[2][2] = {
-    { vget_low_s64(kernel.packet[0]), vget_high_s64(kernel.packet[0]) },
-    { vget_low_s64(kernel.packet[1]), vget_high_s64(kernel.packet[1]) }
-  };
+  const int64x1_t tmp[2][2] = {{vget_low_s64(kernel.packet[0]), vget_high_s64(kernel.packet[0])},
+                               {vget_low_s64(kernel.packet[1]), vget_high_s64(kernel.packet[1])}};
 
   kernel.packet[0] = vcombine_s64(tmp[0][0], tmp[1][0]);
   kernel.packet[1] = vcombine_s64(tmp[0][1], tmp[1][1]);
 #endif
 }
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void
-ptranspose(PacketBlock<Packet2ul, 2>& kernel)
-{
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet2ul, 2>& kernel) {
 #if EIGEN_ARCH_ARM64
   const uint64x2_t tmp1 = vzip1q_u64(kernel.packet[0], kernel.packet[1]);
   kernel.packet[1] = vzip2q_u64(kernel.packet[0], kernel.packet[1]);
   kernel.packet[0] = tmp1;
 #else
-  const uint64x1_t tmp[2][2] = {
-    { vget_low_u64(kernel.packet[0]), vget_high_u64(kernel.packet[0]) },
-    { vget_low_u64(kernel.packet[1]), vget_high_u64(kernel.packet[1]) }
-  };
+  const uint64x1_t tmp[2][2] = {{vget_low_u64(kernel.packet[0]), vget_high_u64(kernel.packet[0])},
+                                {vget_low_u64(kernel.packet[1]), vget_high_u64(kernel.packet[1])}};
 
   kernel.packet[0] = vcombine_u64(tmp[0][0], tmp[1][0]);
   kernel.packet[1] = vcombine_u64(tmp[0][1], tmp[1][1]);
 #endif
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet2f pselect( const Packet2f& mask, const Packet2f& a, const Packet2f& b)
-{ return vbsl_f32(vreinterpret_u32_f32(mask), a, b); }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4f pselect(const Packet4f& mask, const Packet4f& a, const Packet4f& b)
-{ return vbslq_f32(vreinterpretq_u32_f32(mask), a, b); }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet8c pselect(const Packet8c& mask, const Packet8c& a, const Packet8c& b)
-{ return vbsl_s8(vreinterpret_u8_s8(mask), a, b); }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet16c pselect(const Packet16c& mask, const Packet16c& a, const Packet16c& b)
-{ return vbslq_s8(vreinterpretq_u8_s8(mask), a, b); }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet8uc pselect(const Packet8uc& mask, const Packet8uc& a, const Packet8uc& b)
-{ return vbsl_u8(mask, a, b); }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet16uc pselect(const Packet16uc& mask, const Packet16uc& a, const Packet16uc& b)
-{ return vbslq_u8(mask, a, b); }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4s pselect(const Packet4s& mask, const Packet4s& a, const Packet4s& b)
-{ return vbsl_s16(vreinterpret_u16_s16(mask), a, b); }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet8s pselect(const Packet8s& mask, const Packet8s& a, const Packet8s& b)
-{ return vbslq_s16(vreinterpretq_u16_s16(mask), a, b); }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4us pselect(const Packet4us& mask, const Packet4us& a, const Packet4us& b)
-{ return vbsl_u16(mask, a, b); }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet8us pselect(const Packet8us& mask, const Packet8us& a, const Packet8us& b)
-{ return vbslq_u16(mask, a, b); }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet2i pselect(const Packet2i& mask, const Packet2i& a, const Packet2i& b)
-{ return vbsl_s32(vreinterpret_u32_s32(mask), a, b); }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4i pselect(const Packet4i& mask, const Packet4i& a, const Packet4i& b)
-{ return vbslq_s32(vreinterpretq_u32_s32(mask), a, b); }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet2ui pselect(const Packet2ui& mask, const Packet2ui& a, const Packet2ui& b)
-{ return vbsl_u32(mask, a, b); }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4ui pselect(const Packet4ui& mask, const Packet4ui& a, const Packet4ui& b)
-{ return vbslq_u32(mask, a, b); }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet2l pselect(const Packet2l& mask, const Packet2l& a, const Packet2l& b)
-{ return vbslq_s64(vreinterpretq_u64_s64(mask), a, b); }
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet2ul pselect(const Packet2ul& mask, const Packet2ul& a, const Packet2ul& b)
-{ return vbslq_u64(mask, a, b); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet2f pselect(const Packet2f& mask, const Packet2f& a, const Packet2f& b) {
+  return vbsl_f32(vreinterpret_u32_f32(mask), a, b);
+}
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4f pselect(const Packet4f& mask, const Packet4f& a, const Packet4f& b) {
+  return vbslq_f32(vreinterpretq_u32_f32(mask), a, b);
+}
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet8c pselect(const Packet8c& mask, const Packet8c& a, const Packet8c& b) {
+  return vbsl_s8(vreinterpret_u8_s8(mask), a, b);
+}
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet16c pselect(const Packet16c& mask, const Packet16c& a, const Packet16c& b) {
+  return vbslq_s8(vreinterpretq_u8_s8(mask), a, b);
+}
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet8uc pselect(const Packet8uc& mask, const Packet8uc& a, const Packet8uc& b) {
+  return vbsl_u8(mask, a, b);
+}
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet16uc pselect(const Packet16uc& mask, const Packet16uc& a,
+                                                         const Packet16uc& b) {
+  return vbslq_u8(mask, a, b);
+}
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4s pselect(const Packet4s& mask, const Packet4s& a, const Packet4s& b) {
+  return vbsl_s16(vreinterpret_u16_s16(mask), a, b);
+}
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet8s pselect(const Packet8s& mask, const Packet8s& a, const Packet8s& b) {
+  return vbslq_s16(vreinterpretq_u16_s16(mask), a, b);
+}
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4us pselect(const Packet4us& mask, const Packet4us& a, const Packet4us& b) {
+  return vbsl_u16(mask, a, b);
+}
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet8us pselect(const Packet8us& mask, const Packet8us& a, const Packet8us& b) {
+  return vbslq_u16(mask, a, b);
+}
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet2i pselect(const Packet2i& mask, const Packet2i& a, const Packet2i& b) {
+  return vbsl_s32(vreinterpret_u32_s32(mask), a, b);
+}
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4i pselect(const Packet4i& mask, const Packet4i& a, const Packet4i& b) {
+  return vbslq_s32(vreinterpretq_u32_s32(mask), a, b);
+}
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet2ui pselect(const Packet2ui& mask, const Packet2ui& a, const Packet2ui& b) {
+  return vbsl_u32(mask, a, b);
+}
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4ui pselect(const Packet4ui& mask, const Packet4ui& a, const Packet4ui& b) {
+  return vbslq_u32(mask, a, b);
+}
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet2l pselect(const Packet2l& mask, const Packet2l& a, const Packet2l& b) {
+  return vbslq_s64(vreinterpretq_u64_s64(mask), a, b);
+}
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet2ul pselect(const Packet2ul& mask, const Packet2ul& a, const Packet2ul& b) {
+  return vbslq_u64(mask, a, b);
+}
 
 // Use armv8 rounding intinsics if available.
 #if EIGEN_ARCH_ARMV8
-template<> EIGEN_STRONG_INLINE Packet2f print<Packet2f>(const Packet2f& a)
-{ return vrndn_f32(a); }
+template <>
+EIGEN_STRONG_INLINE Packet2f print<Packet2f>(const Packet2f& a) {
+  return vrndn_f32(a);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f print<Packet4f>(const Packet4f& a)
-{ return vrndnq_f32(a); }
+template <>
+EIGEN_STRONG_INLINE Packet4f print<Packet4f>(const Packet4f& a) {
+  return vrndnq_f32(a);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2f pfloor<Packet2f>(const Packet2f& a)
-{ return vrndm_f32(a); }
+template <>
+EIGEN_STRONG_INLINE Packet2f pfloor<Packet2f>(const Packet2f& a) {
+  return vrndm_f32(a);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f pfloor<Packet4f>(const Packet4f& a)
-{ return vrndmq_f32(a); }
+template <>
+EIGEN_STRONG_INLINE Packet4f pfloor<Packet4f>(const Packet4f& a) {
+  return vrndmq_f32(a);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2f pceil<Packet2f>(const Packet2f& a)
-{ return vrndp_f32(a); }
+template <>
+EIGEN_STRONG_INLINE Packet2f pceil<Packet2f>(const Packet2f& a) {
+  return vrndp_f32(a);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f pceil<Packet4f>(const Packet4f& a)
-{ return vrndpq_f32(a); }
+template <>
+EIGEN_STRONG_INLINE Packet4f pceil<Packet4f>(const Packet4f& a) {
+  return vrndpq_f32(a);
+}
 
 #else
 
-template<> EIGEN_STRONG_INLINE Packet4f print(const Packet4f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4f print(const Packet4f& a) {
   // Adds and subtracts signum(a) * 2^23 to force rounding.
-  const Packet4f limit = pset1<Packet4f>(static_cast<float>(1<<23));
+  const Packet4f limit = pset1<Packet4f>(static_cast<float>(1 << 23));
   const Packet4f abs_a = pabs(a);
   Packet4f r = padd(abs_a, limit);
   // Don't compile-away addition and subtraction.
   EIGEN_OPTIMIZATION_BARRIER(r);
   r = psub(r, limit);
   // If greater than limit, simply return a.  Otherwise, account for sign.
-  r = pselect(pcmp_lt(abs_a, limit),
-              pselect(pcmp_lt(a, pzero(a)), pnegate(r), r), a);
+  r = pselect(pcmp_lt(abs_a, limit), pselect(pcmp_lt(a, pzero(a)), pnegate(r), r), a);
   return r;
 }
 
-template<> EIGEN_STRONG_INLINE Packet2f print(const Packet2f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet2f print(const Packet2f& a) {
   // Adds and subtracts signum(a) * 2^23 to force rounding.
-  const Packet2f limit = pset1<Packet2f>(static_cast<float>(1<<23));
+  const Packet2f limit = pset1<Packet2f>(static_cast<float>(1 << 23));
   const Packet2f abs_a = pabs(a);
   Packet2f r = padd(abs_a, limit);
   // Don't compile-away addition and subtraction.
   EIGEN_OPTIMIZATION_BARRIER(r);
   r = psub(r, limit);
   // If greater than limit, simply return a.  Otherwise, account for sign.
-  r = pselect(pcmp_lt(abs_a, limit),
-              pselect(pcmp_lt(a, pzero(a)), pnegate(r), r), a);
+  r = pselect(pcmp_lt(abs_a, limit), pselect(pcmp_lt(a, pzero(a)), pnegate(r), r), a);
   return r;
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pfloor<Packet4f>(const Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f pfloor<Packet4f>(const Packet4f& a) {
   const Packet4f cst_1 = pset1<Packet4f>(1.0f);
-  Packet4f tmp  = print<Packet4f>(a);
+  Packet4f tmp = print<Packet4f>(a);
   // If greater, subtract one.
   Packet4f mask = pcmp_lt(a, tmp);
   mask = pand(mask, cst_1);
   return psub(tmp, mask);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2f pfloor<Packet2f>(const Packet2f& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2f pfloor<Packet2f>(const Packet2f& a) {
   const Packet2f cst_1 = pset1<Packet2f>(1.0f);
-  Packet2f tmp  = print<Packet2f>(a);
+  Packet2f tmp = print<Packet2f>(a);
   // If greater, subtract one.
   Packet2f mask = pcmp_lt(a, tmp);
   mask = pand(mask, cst_1);
   return psub(tmp, mask);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pceil<Packet4f>(const Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f pceil<Packet4f>(const Packet4f& a) {
   const Packet4f cst_1 = pset1<Packet4f>(1.0f);
-  Packet4f tmp  = print<Packet4f>(a);
+  Packet4f tmp = print<Packet4f>(a);
   // If smaller, add one.
   Packet4f mask = pcmp_lt(tmp, a);
   mask = pand(mask, cst_1);
   return padd(tmp, mask);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2f pceil<Packet2f>(const Packet2f& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2f pceil<Packet2f>(const Packet2f& a) {
   const Packet2f cst_1 = pset1<Packet2f>(1.0);
-  Packet2f tmp  = print<Packet2f>(a);
+  Packet2f tmp = print<Packet2f>(a);
   // If smaller, add one.
   Packet2f mask = pcmp_lt(tmp, a);
   mask = pand(mask, cst_1);
@@ -3226,12 +4548,12 @@
  *   and tests whether setting that digit to 1 would cause the square of the value to be greater than the argument
  *   value. The algorithm is described in detail here: http://ww1.microchip.com/downloads/en/AppNotes/91040a.pdf .
  */
-template<> EIGEN_STRONG_INLINE Packet4uc psqrt(const Packet4uc& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4uc psqrt(const Packet4uc& a) {
   uint8x8_t x = vreinterpret_u8_u32(vdup_n_u32(a));
   uint8x8_t res = vdup_n_u8(0);
   uint8x8_t add = vdup_n_u8(0x8);
-  for (int i = 0; i < 4; i++)
-  {
+  for (int i = 0; i < 4; i++) {
     const uint8x8_t temp = vorr_u8(res, add);
     res = vbsl_u8(vcge_u8(x, vmul_u8(temp, temp)), temp, res);
     add = vshr_n_u8(add, 1);
@@ -3239,11 +4561,11 @@
   return vget_lane_u32(vreinterpret_u32_u8(res), 0);
 }
 /// @copydoc Eigen::internal::psqrt(const Packet4uc& a)
-template<> EIGEN_STRONG_INLINE Packet8uc psqrt(const Packet8uc& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8uc psqrt(const Packet8uc& a) {
   uint8x8_t res = vdup_n_u8(0);
   uint8x8_t add = vdup_n_u8(0x8);
-  for (int i = 0; i < 4; i++)
-  {
+  for (int i = 0; i < 4; i++) {
     const uint8x8_t temp = vorr_u8(res, add);
     res = vbsl_u8(vcge_u8(a, vmul_u8(temp, temp)), temp, res);
     add = vshr_n_u8(add, 1);
@@ -3251,11 +4573,11 @@
   return res;
 }
 /// @copydoc Eigen::internal::psqrt(const Packet4uc& a)
-template<> EIGEN_STRONG_INLINE Packet16uc psqrt(const Packet16uc& a) {
+template <>
+EIGEN_STRONG_INLINE Packet16uc psqrt(const Packet16uc& a) {
   uint8x16_t res = vdupq_n_u8(0);
   uint8x16_t add = vdupq_n_u8(0x8);
-  for (int i = 0; i < 4; i++)
-  {
+  for (int i = 0; i < 4; i++) {
     const uint8x16_t temp = vorrq_u8(res, add);
     res = vbslq_u8(vcgeq_u8(a, vmulq_u8(temp, temp)), temp, res);
     add = vshrq_n_u8(add, 1);
@@ -3263,11 +4585,11 @@
   return res;
 }
 /// @copydoc Eigen::internal::psqrt(const Packet4uc& a)
-template<> EIGEN_STRONG_INLINE Packet4us psqrt(const Packet4us& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4us psqrt(const Packet4us& a) {
   uint16x4_t res = vdup_n_u16(0);
   uint16x4_t add = vdup_n_u16(0x80);
-  for (int i = 0; i < 8; i++)
-  {
+  for (int i = 0; i < 8; i++) {
     const uint16x4_t temp = vorr_u16(res, add);
     res = vbsl_u16(vcge_u16(a, vmul_u16(temp, temp)), temp, res);
     add = vshr_n_u16(add, 1);
@@ -3275,11 +4597,11 @@
   return res;
 }
 /// @copydoc Eigen::internal::psqrt(const Packet4uc& a)
-template<> EIGEN_STRONG_INLINE Packet8us psqrt(const Packet8us& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8us psqrt(const Packet8us& a) {
   uint16x8_t res = vdupq_n_u16(0);
   uint16x8_t add = vdupq_n_u16(0x80);
-  for (int i = 0; i < 8; i++)
-  {
+  for (int i = 0; i < 8; i++) {
     const uint16x8_t temp = vorrq_u16(res, add);
     res = vbslq_u16(vcgeq_u16(a, vmulq_u16(temp, temp)), temp, res);
     add = vshrq_n_u16(add, 1);
@@ -3287,11 +4609,11 @@
   return res;
 }
 /// @copydoc Eigen::internal::psqrt(const Packet4uc& a)
-template<> EIGEN_STRONG_INLINE Packet2ui psqrt(const Packet2ui& a) {
+template <>
+EIGEN_STRONG_INLINE Packet2ui psqrt(const Packet2ui& a) {
   uint32x2_t res = vdup_n_u32(0);
   uint32x2_t add = vdup_n_u32(0x8000);
-  for (int i = 0; i < 16; i++)
-  {
+  for (int i = 0; i < 16; i++) {
     const uint32x2_t temp = vorr_u32(res, add);
     res = vbsl_u32(vcge_u32(a, vmul_u32(temp, temp)), temp, res);
     add = vshr_n_u32(add, 1);
@@ -3299,11 +4621,11 @@
   return res;
 }
 /// @copydoc Eigen::internal::psqrt(const Packet4uc& a)
-template<> EIGEN_STRONG_INLINE Packet4ui psqrt(const Packet4ui& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4ui psqrt(const Packet4ui& a) {
   uint32x4_t res = vdupq_n_u32(0);
   uint32x4_t add = vdupq_n_u32(0x8000);
-  for (int i = 0; i < 16; i++)
-  {
+  for (int i = 0; i < 16; i++) {
     const uint32x4_t temp = vorrq_u32(res, add);
     res = vbslq_u32(vcgeq_u32(a, vmulq_u32(temp, temp)), temp, res);
     add = vshrq_n_u32(add, 1);
@@ -3329,7 +4651,8 @@
   return result;
 }
 
-template<typename Packet> Packet prsqrt_float_common(const Packet& a) {
+template <typename Packet>
+Packet prsqrt_float_common(const Packet& a) {
   const Packet cst_zero = pzero(a);
   const Packet cst_inf = pset1<Packet>(NumTraits<float>::infinity());
   Packet return_zero = pcmp_eq(a, cst_inf);
@@ -3340,16 +4663,18 @@
   return result;
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f prsqrt(const Packet4f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4f prsqrt(const Packet4f& a) {
   return prsqrt_float_common(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2f prsqrt(const Packet2f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet2f prsqrt(const Packet2f& a) {
   return prsqrt_float_common(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f preciprocal<Packet4f>(const Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f preciprocal<Packet4f>(const Packet4f& a) {
   // Compute approximate reciprocal.
   float32x4_t result = vrecpeq_f32(a);
   result = vmulq_f32(vrecpsq_f32(a, result), result);
@@ -3357,8 +4682,8 @@
   return result;
 }
 
-template<> EIGEN_STRONG_INLINE Packet2f preciprocal<Packet2f>(const Packet2f& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2f preciprocal<Packet2f>(const Packet2f& a) {
   // Compute approximate reciprocal.
   float32x2_t result = vrecpe_f32(a);
   result = vmul_f32(vrecps_f32(a, result), result);
@@ -3368,37 +4693,51 @@
 
 // Unfortunately vsqrt_f32 is only available for A64.
 #if EIGEN_ARCH_ARM64
-template<> EIGEN_STRONG_INLINE Packet4f psqrt(const Packet4f& a) { return vsqrtq_f32(a); }
+template <>
+EIGEN_STRONG_INLINE Packet4f psqrt(const Packet4f& a) {
+  return vsqrtq_f32(a);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2f psqrt(const Packet2f& a) { return vsqrt_f32(a); }
+template <>
+EIGEN_STRONG_INLINE Packet2f psqrt(const Packet2f& a) {
+  return vsqrt_f32(a);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f pdiv(const Packet4f& a, const Packet4f& b) { return vdivq_f32(a, b); }
+template <>
+EIGEN_STRONG_INLINE Packet4f pdiv(const Packet4f& a, const Packet4f& b) {
+  return vdivq_f32(a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2f pdiv(const Packet2f& a, const Packet2f& b) { return vdiv_f32(a, b); }
+template <>
+EIGEN_STRONG_INLINE Packet2f pdiv(const Packet2f& a, const Packet2f& b) {
+  return vdiv_f32(a, b);
+}
 #else
-template<typename Packet>
+template <typename Packet>
 EIGEN_STRONG_INLINE Packet psqrt_float_common(const Packet& a) {
   const Packet cst_zero = pzero(a);
   const Packet cst_inf = pset1<Packet>(NumTraits<float>::infinity());
-  
-  Packet result = pmul(a, prsqrt_float_unsafe(a));  
+
+  Packet result = pmul(a, prsqrt_float_unsafe(a));
   Packet a_is_zero = pcmp_eq(a, cst_zero);
   Packet a_is_inf = pcmp_eq(a, cst_inf);
   Packet return_a = por(a_is_zero, a_is_inf);
-  
+
   result = pselect(return_a, a, result);
   return result;
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f psqrt(const Packet4f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4f psqrt(const Packet4f& a) {
   return psqrt_float_common(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2f psqrt(const Packet2f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet2f psqrt(const Packet2f& a) {
   return psqrt_float_common(a);
 }
 
-template<typename Packet>
+template <typename Packet>
 EIGEN_STRONG_INLINE Packet pdiv_float_common(const Packet& a, const Packet& b) {
   // if b is large, NEON intrinsics will flush preciprocal(b) to zero
   // avoid underflow with the following manipulation:
@@ -3407,18 +4746,20 @@
   const Packet cst_one = pset1<Packet>(1.0f);
   const Packet cst_quarter = pset1<Packet>(0.25f);
   const Packet cst_thresh = pset1<Packet>(NumTraits<float>::highest() / 4.0f);
-  
+
   Packet b_will_underflow = pcmp_le(cst_thresh, pabs(b));
   Packet f = pselect(b_will_underflow, cst_quarter, cst_one);
   Packet result = pmul(f, pmul(a, preciprocal(pmul(b, f))));
   return result;
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pdiv<Packet4f>(const Packet4f& a, const Packet4f& b) {
+template <>
+EIGEN_STRONG_INLINE Packet4f pdiv<Packet4f>(const Packet4f& a, const Packet4f& b) {
   return pdiv_float_common(a, b);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2f pdiv<Packet2f>(const Packet2f& a, const Packet2f& b) {
+template <>
+EIGEN_STRONG_INLINE Packet2f pdiv<Packet2f>(const Packet2f& a, const Packet2f& b) {
   return pdiv_float_common(a, b);
 }
 #endif
@@ -3429,56 +4770,57 @@
 // TODO: Guard if we have native bfloat16 support
 typedef eigen_packet_wrapper<uint16x4_t, 19> Packet4bf;
 
-template<> struct is_arithmetic<Packet4bf> { enum { value = true }; };
+template <>
+struct is_arithmetic<Packet4bf> {
+  enum { value = true };
+};
 
-template<> struct packet_traits<bfloat16> : default_packet_traits
-{
+template <>
+struct packet_traits<bfloat16> : default_packet_traits {
   typedef Packet4bf type;
   typedef Packet4bf half;
-  enum
-  {
+  enum {
     Vectorizable = 1,
     AlignedOnScalar = 1,
     size = 4,
 
-    HasCmp       = 1,
-    HasAdd       = 1,
-    HasSub       = 1,
-    HasShift     = 1,
-    HasMul       = 1,
-    HasNegate    = 1,
-    HasAbs       = 1,
-    HasArg       = 0,
-    HasAbs2      = 1,
-    HasAbsDiff   = 1,
-    HasMin       = 1,
-    HasMax       = 1,
-    HasConj      = 1,
+    HasCmp = 1,
+    HasAdd = 1,
+    HasSub = 1,
+    HasShift = 1,
+    HasMul = 1,
+    HasNegate = 1,
+    HasAbs = 1,
+    HasArg = 0,
+    HasAbs2 = 1,
+    HasAbsDiff = 1,
+    HasMin = 1,
+    HasMax = 1,
+    HasConj = 1,
     HasSetLinear = 1,
-    HasBlend     = 0,
-    HasDiv       = 1,
-    HasFloor     = 1,
-    HasCeil      = 1,
-    HasRint      = 1,
+    HasBlend = 0,
+    HasDiv = 1,
+    HasFloor = 1,
+    HasCeil = 1,
+    HasRint = 1,
 
-    HasSin  = EIGEN_FAST_MATH,
-    HasCos  = EIGEN_FAST_MATH,
-    HasLog  = 1,
-    HasExp  = 1,
+    HasSin = EIGEN_FAST_MATH,
+    HasCos = EIGEN_FAST_MATH,
+    HasLog = 1,
+    HasExp = 1,
     HasSqrt = 0,
     HasTanh = EIGEN_FAST_MATH,
-    HasErf  = EIGEN_FAST_MATH,
+    HasErf = EIGEN_FAST_MATH,
     HasBessel = 0,  // Issues with accuracy.
     HasNdtri = 0
   };
 };
 
-template<> struct unpacket_traits<Packet4bf>
-{
+template <>
+struct unpacket_traits<Packet4bf> {
   typedef bfloat16 type;
   typedef Packet4bf half;
-  enum
-  {
+  enum {
     size = 4,
     alignment = Aligned16,
     vectorizable = true,
@@ -3487,23 +4829,22 @@
   };
 };
 
-namespace detail {  
-template<>
+namespace detail {
+template <>
 EIGEN_ALWAYS_INLINE void zip_in_place<Packet4bf>(Packet4bf& p1, Packet4bf& p2) {
   const uint16x4x2_t tmp = vzip_u16(p1, p2);
   p1 = tmp.val[0];
   p2 = tmp.val[1];
 }
-} // namespace detail
+}  // namespace detail
 
-EIGEN_STRONG_INLINE Packet4bf F32ToBf16(const Packet4f& p)
-{
+EIGEN_STRONG_INLINE Packet4bf F32ToBf16(const Packet4f& p) {
   // See the scalar implementation in BFloat16.h for a comprehensible explanation
   // of this fast rounding algorithm
   Packet4ui input = Packet4ui(vreinterpretq_u32_f32(p));
 
   // lsb = (input >> 16) & 1
-  Packet4ui lsb =  vandq_u32(vshrq_n_u32(input, 16), vdupq_n_u32(1));
+  Packet4ui lsb = vandq_u32(vshrq_n_u32(input, 16), vdupq_n_u32(1));
 
   // rounding_bias = 0x7fff + lsb
   Packet4ui rounding_bias = vaddq_u32(lsb, vdupq_n_u32(0x7fff));
@@ -3523,215 +4864,216 @@
   return vmovn_u32(input);
 }
 
-EIGEN_STRONG_INLINE Packet4f Bf16ToF32(const Packet4bf& p)
-{
+EIGEN_STRONG_INLINE Packet4f Bf16ToF32(const Packet4bf& p) {
   return Packet4f(vreinterpretq_f32_u32(vshlq_n_u32(vmovl_u16(p), 16)));
 }
 
-EIGEN_STRONG_INLINE Packet4bf F32MaskToBf16Mask(const Packet4f& p) {
-  return vmovn_u32(vreinterpretq_u32_f32(p));
-}
+EIGEN_STRONG_INLINE Packet4bf F32MaskToBf16Mask(const Packet4f& p) { return vmovn_u32(vreinterpretq_u32_f32(p)); }
 
-template<> EIGEN_STRONG_INLINE Packet4bf pset1<Packet4bf>(const bfloat16& from) {
+template <>
+EIGEN_STRONG_INLINE Packet4bf pset1<Packet4bf>(const bfloat16& from) {
   return Packet4bf(pset1<Packet4us>(from.value));
 }
 
-template<> EIGEN_STRONG_INLINE bfloat16 pfirst<Packet4bf>(const Packet4bf& from) {
+template <>
+EIGEN_STRONG_INLINE bfloat16 pfirst<Packet4bf>(const Packet4bf& from) {
   return bfloat16_impl::raw_uint16_to_bfloat16(static_cast<uint16_t>(pfirst<Packet4us>(Packet4us(from))));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4bf pload<Packet4bf>(const bfloat16* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4bf pload<Packet4bf>(const bfloat16* from) {
   return Packet4bf(pload<Packet4us>(reinterpret_cast<const uint16_t*>(from)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4bf ploadu<Packet4bf>(const bfloat16* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4bf ploadu<Packet4bf>(const bfloat16* from) {
   return Packet4bf(ploadu<Packet4us>(reinterpret_cast<const uint16_t*>(from)));
 }
 
-template<> EIGEN_STRONG_INLINE void pstore<bfloat16>(bfloat16* to, const Packet4bf& from)
-{
+template <>
+EIGEN_STRONG_INLINE void pstore<bfloat16>(bfloat16* to, const Packet4bf& from) {
   EIGEN_DEBUG_ALIGNED_STORE vst1_u16(reinterpret_cast<uint16_t*>(to), from);
 }
 
-template<> EIGEN_STRONG_INLINE void pstoreu<bfloat16>(bfloat16* to, const Packet4bf& from)
-{
+template <>
+EIGEN_STRONG_INLINE void pstoreu<bfloat16>(bfloat16* to, const Packet4bf& from) {
   EIGEN_DEBUG_UNALIGNED_STORE vst1_u16(reinterpret_cast<uint16_t*>(to), from);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4bf ploaddup<Packet4bf>(const bfloat16* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4bf ploaddup<Packet4bf>(const bfloat16* from) {
   return Packet4bf(ploaddup<Packet4us>(reinterpret_cast<const uint16_t*>(from)));
 }
 
-template <> EIGEN_STRONG_INLINE Packet4bf pabs(const Packet4bf& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4bf pabs(const Packet4bf& a) {
   return F32ToBf16(pabs<Packet4f>(Bf16ToF32(a)));
 }
 
-template <> EIGEN_STRONG_INLINE Packet4bf pmin<PropagateNumbers, Packet4bf>(const Packet4bf &a,
-                                                                            const Packet4bf &b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4bf pmin<PropagateNumbers, Packet4bf>(const Packet4bf& a, const Packet4bf& b) {
   return F32ToBf16(pmin<PropagateNumbers, Packet4f>(Bf16ToF32(a), Bf16ToF32(b)));
 }
-template <> EIGEN_STRONG_INLINE Packet4bf pmin<PropagateNaN, Packet4bf>(const Packet4bf &a,
-                                                                        const Packet4bf &b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4bf pmin<PropagateNaN, Packet4bf>(const Packet4bf& a, const Packet4bf& b) {
   return F32ToBf16(pmin<PropagateNaN, Packet4f>(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
-template <> EIGEN_STRONG_INLINE Packet4bf pmin<Packet4bf>(const Packet4bf &a,
-                                                          const Packet4bf &b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4bf pmin<Packet4bf>(const Packet4bf& a, const Packet4bf& b) {
   return F32ToBf16(pmin<Packet4f>(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
-template <> EIGEN_STRONG_INLINE Packet4bf pmax<PropagateNumbers, Packet4bf>(const Packet4bf &a,
-                                                                            const Packet4bf &b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4bf pmax<PropagateNumbers, Packet4bf>(const Packet4bf& a, const Packet4bf& b) {
   return F32ToBf16(pmax<PropagateNumbers, Packet4f>(Bf16ToF32(a), Bf16ToF32(b)));
 }
-template <> EIGEN_STRONG_INLINE Packet4bf pmax<PropagateNaN, Packet4bf>(const Packet4bf &a,
-                                                                        const Packet4bf &b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4bf pmax<PropagateNaN, Packet4bf>(const Packet4bf& a, const Packet4bf& b) {
   return F32ToBf16(pmax<PropagateNaN, Packet4f>(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
-template <> EIGEN_STRONG_INLINE Packet4bf pmax<Packet4bf>(const Packet4bf &a,
-                                                          const Packet4bf &b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4bf pmax<Packet4bf>(const Packet4bf& a, const Packet4bf& b) {
   return F32ToBf16(pmax<Packet4f>(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4bf plset<Packet4bf>(const bfloat16& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4bf plset<Packet4bf>(const bfloat16& a) {
   return F32ToBf16(plset<Packet4f>(static_cast<float>(a)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4bf por(const Packet4bf& a,const Packet4bf& b) {
+template <>
+EIGEN_STRONG_INLINE Packet4bf por(const Packet4bf& a, const Packet4bf& b) {
   return Packet4bf(por<Packet4us>(Packet4us(a), Packet4us(b)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4bf pxor(const Packet4bf& a,const Packet4bf& b) {
+template <>
+EIGEN_STRONG_INLINE Packet4bf pxor(const Packet4bf& a, const Packet4bf& b) {
   return Packet4bf(pxor<Packet4us>(Packet4us(a), Packet4us(b)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4bf pand(const Packet4bf& a,const Packet4bf& b) {
+template <>
+EIGEN_STRONG_INLINE Packet4bf pand(const Packet4bf& a, const Packet4bf& b) {
   return Packet4bf(pand<Packet4us>(Packet4us(a), Packet4us(b)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4bf pandnot(const Packet4bf& a,const Packet4bf& b) {
+template <>
+EIGEN_STRONG_INLINE Packet4bf pandnot(const Packet4bf& a, const Packet4bf& b) {
   return Packet4bf(pandnot<Packet4us>(Packet4us(a), Packet4us(b)));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4bf pselect(const Packet4bf& mask, const Packet4bf& a,
-                                                      const Packet4bf& b)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4bf pselect(const Packet4bf& mask, const Packet4bf& a, const Packet4bf& b) {
   return Packet4bf(pselect<Packet4us>(Packet4us(mask), Packet4us(a), Packet4us(b)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4bf print<Packet4bf>(const Packet4bf& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4bf print<Packet4bf>(const Packet4bf& a) {
   return F32ToBf16(print<Packet4f>(Bf16ToF32(a)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4bf pfloor<Packet4bf>(const Packet4bf& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4bf pfloor<Packet4bf>(const Packet4bf& a) {
   return F32ToBf16(pfloor<Packet4f>(Bf16ToF32(a)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4bf pceil<Packet4bf>(const Packet4bf& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4bf pceil<Packet4bf>(const Packet4bf& a) {
   return F32ToBf16(pceil<Packet4f>(Bf16ToF32(a)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4bf pconj(const Packet4bf& a) { return a; }
+template <>
+EIGEN_STRONG_INLINE Packet4bf pconj(const Packet4bf& a) {
+  return a;
+}
 
-template<> EIGEN_STRONG_INLINE Packet4bf padd<Packet4bf>(const Packet4bf& a, const Packet4bf& b) {
+template <>
+EIGEN_STRONG_INLINE Packet4bf padd<Packet4bf>(const Packet4bf& a, const Packet4bf& b) {
   return F32ToBf16(padd<Packet4f>(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4bf psub<Packet4bf>(const Packet4bf& a, const Packet4bf& b) {
+template <>
+EIGEN_STRONG_INLINE Packet4bf psub<Packet4bf>(const Packet4bf& a, const Packet4bf& b) {
   return F32ToBf16(psub<Packet4f>(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4bf pmul<Packet4bf>(const Packet4bf& a, const Packet4bf& b) {
+template <>
+EIGEN_STRONG_INLINE Packet4bf pmul<Packet4bf>(const Packet4bf& a, const Packet4bf& b) {
   return F32ToBf16(pmul<Packet4f>(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4bf pdiv<Packet4bf>(const Packet4bf& a, const Packet4bf& b) {
+template <>
+EIGEN_STRONG_INLINE Packet4bf pdiv<Packet4bf>(const Packet4bf& a, const Packet4bf& b) {
   return F32ToBf16(pdiv<Packet4f>(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
-template<>
-EIGEN_STRONG_INLINE Packet4bf pgather<bfloat16, Packet4bf>(const bfloat16* from, Index stride)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4bf pgather<bfloat16, Packet4bf>(const bfloat16* from, Index stride) {
   return Packet4bf(pgather<uint16_t, Packet4us>(reinterpret_cast<const uint16_t*>(from), stride));
 }
 
-template<>
-EIGEN_STRONG_INLINE void pscatter<bfloat16, Packet4bf>(bfloat16* to, const Packet4bf& from, Index stride)
-{
+template <>
+EIGEN_STRONG_INLINE void pscatter<bfloat16, Packet4bf>(bfloat16* to, const Packet4bf& from, Index stride) {
   pscatter<uint16_t, Packet4us>(reinterpret_cast<uint16_t*>(to), Packet4us(from), stride);
 }
 
-template<> EIGEN_STRONG_INLINE bfloat16 predux<Packet4bf>(const Packet4bf& a)
-{
+template <>
+EIGEN_STRONG_INLINE bfloat16 predux<Packet4bf>(const Packet4bf& a) {
   return static_cast<bfloat16>(predux<Packet4f>(Bf16ToF32(a)));
 }
 
-template<> EIGEN_STRONG_INLINE bfloat16 predux_max<Packet4bf>(const Packet4bf& a)
-{
+template <>
+EIGEN_STRONG_INLINE bfloat16 predux_max<Packet4bf>(const Packet4bf& a) {
   return static_cast<bfloat16>(predux_max<Packet4f>(Bf16ToF32(a)));
 }
 
-template<> EIGEN_STRONG_INLINE bfloat16 predux_min<Packet4bf>(const Packet4bf& a)
-{
+template <>
+EIGEN_STRONG_INLINE bfloat16 predux_min<Packet4bf>(const Packet4bf& a) {
   return static_cast<bfloat16>(predux_min<Packet4f>(Bf16ToF32(a)));
 }
 
-template<> EIGEN_STRONG_INLINE bfloat16 predux_mul<Packet4bf>(const Packet4bf& a)
-{
+template <>
+EIGEN_STRONG_INLINE bfloat16 predux_mul<Packet4bf>(const Packet4bf& a) {
   return static_cast<bfloat16>(predux_mul<Packet4f>(Bf16ToF32(a)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4bf preverse<Packet4bf>(const Packet4bf& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4bf preverse<Packet4bf>(const Packet4bf& a) {
   return Packet4bf(preverse<Packet4us>(Packet4us(a)));
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet4bf, 4>& kernel)
-{
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet4bf, 4>& kernel) {
   detail::ptranspose_impl(kernel);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4bf pabsdiff<Packet4bf>(const Packet4bf& a, const Packet4bf& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4bf pabsdiff<Packet4bf>(const Packet4bf& a, const Packet4bf& b) {
   return F32ToBf16(pabsdiff<Packet4f>(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4bf pcmp_eq<Packet4bf>(const Packet4bf& a, const Packet4bf& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4bf pcmp_eq<Packet4bf>(const Packet4bf& a, const Packet4bf& b) {
   return F32MaskToBf16Mask(pcmp_eq<Packet4f>(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4bf pcmp_lt<Packet4bf>(const Packet4bf& a, const Packet4bf& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4bf pcmp_lt<Packet4bf>(const Packet4bf& a, const Packet4bf& b) {
   return F32MaskToBf16Mask(pcmp_lt<Packet4f>(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4bf pcmp_lt_or_nan<Packet4bf>(const Packet4bf& a, const Packet4bf& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4bf pcmp_lt_or_nan<Packet4bf>(const Packet4bf& a, const Packet4bf& b) {
   return F32MaskToBf16Mask(pcmp_lt_or_nan<Packet4f>(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4bf pcmp_le<Packet4bf>(const Packet4bf& a, const Packet4bf& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4bf pcmp_le<Packet4bf>(const Packet4bf& a, const Packet4bf& b) {
   return F32MaskToBf16Mask(pcmp_le<Packet4f>(Bf16ToF32(a), Bf16ToF32(b)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4bf pnegate<Packet4bf>(const Packet4bf& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4bf pnegate<Packet4bf>(const Packet4bf& a) {
   return Packet4bf(pxor<Packet4us>(Packet4us(a), pset1<Packet4us>(static_cast<uint16_t>(0x8000))));
 }
 
@@ -3756,9 +5098,15 @@
 // already defined in arm_neon.h, then our workaround doesn't cause a conflict
 // and has lower priority in overload resolution.
 // This doesn't work with MSVC though, since the function names are macros.
-template <typename T> uint64x2_t vreinterpretq_u64_f64(T a) { return (uint64x2_t) a; }
+template <typename T>
+uint64x2_t vreinterpretq_u64_f64(T a) {
+  return (uint64x2_t)a;
+}
 
-template <typename T> float64x2_t vreinterpretq_f64_u64(T a) { return (float64x2_t) a; }
+template <typename T>
+float64x2_t vreinterpretq_f64_u64(T a) {
+  return (float64x2_t)a;
+}
 #endif
 
 #if EIGEN_COMP_MSVC_STRICT
@@ -3777,85 +5125,73 @@
 EIGEN_ALWAYS_INLINE Packet2d make_packet2d(double a, double b) { return Packet2d{a, b}; }
 #endif
 
-
 // fuctionally equivalent to _mm_shuffle_pd in SSE (i.e. shuffle(m, n, mask) equals _mm_shuffle_pd(m,n,mask))
 // Currently used in LU/arch/InverseSize4.h to enable a shared implementation
 // for fast inversion of matrices of size 4.
-EIGEN_STRONG_INLINE Packet2d shuffle(const Packet2d& m, const Packet2d& n, int mask)
-{
+EIGEN_STRONG_INLINE Packet2d shuffle(const Packet2d& m, const Packet2d& n, int mask) {
   const double* a = reinterpret_cast<const double*>(&m);
   const double* b = reinterpret_cast<const double*>(&n);
   Packet2d res = make_packet2d(*(a + (mask & 1)), *(b + ((mask >> 1) & 1)));
   return res;
 }
 
-EIGEN_STRONG_INLINE Packet2d vec2d_swizzle2(const Packet2d& a, const Packet2d& b, int mask)
-{
+EIGEN_STRONG_INLINE Packet2d vec2d_swizzle2(const Packet2d& a, const Packet2d& b, int mask) {
   return shuffle(a, b, mask);
 }
-EIGEN_STRONG_INLINE Packet2d vec2d_unpacklo(const Packet2d& a,const Packet2d& b)
-{
-  return shuffle(a, b, 0);
-}
-EIGEN_STRONG_INLINE Packet2d vec2d_unpackhi(const Packet2d& a,const Packet2d& b)
-{
-  return shuffle(a, b, 3);
-}
-#define vec2d_duplane(a, p) \
-  Packet2d(vdupq_laneq_f64(a, p))
+EIGEN_STRONG_INLINE Packet2d vec2d_unpacklo(const Packet2d& a, const Packet2d& b) { return shuffle(a, b, 0); }
+EIGEN_STRONG_INLINE Packet2d vec2d_unpackhi(const Packet2d& a, const Packet2d& b) { return shuffle(a, b, 3); }
+#define vec2d_duplane(a, p) Packet2d(vdupq_laneq_f64(a, p))
 
-template<> struct packet_traits<double>  : default_packet_traits
-{
+template <>
+struct packet_traits<double> : default_packet_traits {
   typedef Packet2d type;
   typedef Packet2d half;
-  enum
-  {
+  enum {
     Vectorizable = 1,
     AlignedOnScalar = 1,
     size = 2,
 
-    HasCmp       = 1,
-    HasAdd       = 1,
-    HasSub       = 1,
-    HasShift     = 1,
-    HasMul       = 1,
-    HasNegate    = 1,
-    HasAbs       = 1,
-    HasArg       = 0,
-    HasAbs2      = 1,
-    HasAbsDiff   = 1,
-    HasMin       = 1,
-    HasMax       = 1,
-    HasConj      = 1,
+    HasCmp = 1,
+    HasAdd = 1,
+    HasSub = 1,
+    HasShift = 1,
+    HasMul = 1,
+    HasNegate = 1,
+    HasAbs = 1,
+    HasArg = 0,
+    HasAbs2 = 1,
+    HasAbsDiff = 1,
+    HasMin = 1,
+    HasMax = 1,
+    HasConj = 1,
     HasSetLinear = 1,
-    HasBlend     = 0,
+    HasBlend = 0,
 
-    HasDiv   = 1,
+    HasDiv = 1,
     HasFloor = 1,
     HasCeil = 1,
     HasRint = 1,
 
 #if EIGEN_ARCH_ARM64 && !EIGEN_APPLE_DOUBLE_NEON_BUG
-    HasExp  = 1,
-    HasLog  = 1,
+    HasExp = 1,
+    HasLog = 1,
     HasATan = 1,
 #endif
-    HasSin  = 0,
-    HasCos  = 0,
+    HasSin = 0,
+    HasCos = 0,
     HasSqrt = 1,
     HasRsqrt = 1,
     HasTanh = 0,
-    HasErf  = 0
+    HasErf = 0
   };
 };
 
-template<> struct unpacket_traits<Packet2d>
-{
+template <>
+struct unpacket_traits<Packet2d> {
   typedef double type;
   typedef Packet2d half;
   typedef Packet2l integer_packet;
-  enum
-  {
+  enum {
     size = 2,
     alignment = Aligned16,
     vectorizable = true,
@@ -3864,149 +5200,239 @@
   };
 };
 
-template<> EIGEN_STRONG_INLINE Packet2d pset1<Packet2d>(const double&  from) { return vdupq_n_f64(from); }
+template <>
+EIGEN_STRONG_INLINE Packet2d pset1<Packet2d>(const double& from) {
+  return vdupq_n_f64(from);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d plset<Packet2d>(const double& a)
-{
-  const double c[] = {0.0,1.0};
+template <>
+EIGEN_STRONG_INLINE Packet2d plset<Packet2d>(const double& a) {
+  const double c[] = {0.0, 1.0};
   return vaddq_f64(pset1<Packet2d>(a), vld1q_f64(c));
 }
 
-template<> EIGEN_STRONG_INLINE Packet2d padd<Packet2d>(const Packet2d& a, const Packet2d& b) { return vaddq_f64(a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet2d padd<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return vaddq_f64(a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d psub<Packet2d>(const Packet2d& a, const Packet2d& b) { return vsubq_f64(a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet2d psub<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return vsubq_f64(a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d pxor<Packet2d>(const Packet2d& , const Packet2d& );
-template<> EIGEN_STRONG_INLINE Packet2d paddsub<Packet2d>(const Packet2d& a, const Packet2d& b){
+template <>
+EIGEN_STRONG_INLINE Packet2d pxor<Packet2d>(const Packet2d&, const Packet2d&);
+template <>
+EIGEN_STRONG_INLINE Packet2d paddsub<Packet2d>(const Packet2d& a, const Packet2d& b) {
   const Packet2d mask = make_packet2d(numext::bit_cast<double>(0x8000000000000000ull), 0.0);
   return padd(a, pxor(mask, b));
 }
 
-template<> EIGEN_STRONG_INLINE Packet2d pnegate(const Packet2d& a) { return vnegq_f64(a); }
+template <>
+EIGEN_STRONG_INLINE Packet2d pnegate(const Packet2d& a) {
+  return vnegq_f64(a);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d pconj(const Packet2d& a) { return a; }
+template <>
+EIGEN_STRONG_INLINE Packet2d pconj(const Packet2d& a) {
+  return a;
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d pmul<Packet2d>(const Packet2d& a, const Packet2d& b) { return vmulq_f64(a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet2d pmul<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return vmulq_f64(a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d pdiv<Packet2d>(const Packet2d& a, const Packet2d& b) { return vdivq_f64(a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet2d pdiv<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return vdivq_f64(a, b);
+}
 
 #ifdef __ARM_FEATURE_FMA
 // See bug 936. See above comment about FMA for float.
-template<> EIGEN_STRONG_INLINE Packet2d pmadd(const Packet2d& a, const Packet2d& b, const Packet2d& c)
-{ return vfmaq_f64(c,a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet2d pmadd(const Packet2d& a, const Packet2d& b, const Packet2d& c) {
+  return vfmaq_f64(c, a, b);
+}
 #else
-template<> EIGEN_STRONG_INLINE Packet2d pmadd(const Packet2d& a, const Packet2d& b, const Packet2d& c)
-{ return vmlaq_f64(c,a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet2d pmadd(const Packet2d& a, const Packet2d& b, const Packet2d& c) {
+  return vmlaq_f64(c, a, b);
+}
 #endif
 
-template<> EIGEN_STRONG_INLINE Packet2d pmin<Packet2d>(const Packet2d& a, const Packet2d& b) { return vminq_f64(a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet2d pmin<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return vminq_f64(a, b);
+}
 
 #ifdef __ARM_FEATURE_NUMERIC_MAXMIN
-// numeric max and min are only available if ARM_FEATURE_NUMERIC_MAXMIN is defined (which can only be the case for Armv8 systems).
-template<> EIGEN_STRONG_INLINE Packet2d pmin<PropagateNumbers, Packet2d>(const Packet2d& a, const Packet2d& b) { return vminnmq_f64(a, b); }
-template<> EIGEN_STRONG_INLINE Packet2d pmax<PropagateNumbers, Packet2d>(const Packet2d& a, const Packet2d& b) { return vmaxnmq_f64(a, b); }
+// numeric max and min are only available if ARM_FEATURE_NUMERIC_MAXMIN is defined (which can only be the case for Armv8
+// systems).
+template <>
+EIGEN_STRONG_INLINE Packet2d pmin<PropagateNumbers, Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return vminnmq_f64(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pmax<PropagateNumbers, Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return vmaxnmq_f64(a, b);
+}
 
 #endif
 
-template<> EIGEN_STRONG_INLINE Packet2d pmin<PropagateNaN, Packet2d>(const Packet2d& a, const Packet2d& b) { return pmin<Packet2d>(a, b); }
+template <>
+EIGEN_STRONG_INLINE Packet2d pmin<PropagateNaN, Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return pmin<Packet2d>(a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d pmax<Packet2d>(const Packet2d& a, const Packet2d& b) { return vmaxq_f64(a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet2d pmax<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return vmaxq_f64(a, b);
+}
 
-
-template<> EIGEN_STRONG_INLINE Packet2d pmax<PropagateNaN, Packet2d>(const Packet2d& a, const Packet2d& b) { return pmax<Packet2d>(a, b); }
+template <>
+EIGEN_STRONG_INLINE Packet2d pmax<PropagateNaN, Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return pmax<Packet2d>(a, b);
+}
 
 // Logical Operations are not supported for float, so we have to reinterpret casts using NEON intrinsics
-template<> EIGEN_STRONG_INLINE Packet2d pand<Packet2d>(const Packet2d& a, const Packet2d& b)
-{ return vreinterpretq_f64_u64(vandq_u64(vreinterpretq_u64_f64(a),vreinterpretq_u64_f64(b))); }
+template <>
+EIGEN_STRONG_INLINE Packet2d pand<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return vreinterpretq_f64_u64(vandq_u64(vreinterpretq_u64_f64(a), vreinterpretq_u64_f64(b)));
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d por<Packet2d>(const Packet2d& a, const Packet2d& b)
-{ return vreinterpretq_f64_u64(vorrq_u64(vreinterpretq_u64_f64(a),vreinterpretq_u64_f64(b))); }
+template <>
+EIGEN_STRONG_INLINE Packet2d por<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return vreinterpretq_f64_u64(vorrq_u64(vreinterpretq_u64_f64(a), vreinterpretq_u64_f64(b)));
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d pxor<Packet2d>(const Packet2d& a, const Packet2d& b)
-{ return vreinterpretq_f64_u64(veorq_u64(vreinterpretq_u64_f64(a),vreinterpretq_u64_f64(b))); }
+template <>
+EIGEN_STRONG_INLINE Packet2d pxor<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return vreinterpretq_f64_u64(veorq_u64(vreinterpretq_u64_f64(a), vreinterpretq_u64_f64(b)));
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d pandnot<Packet2d>(const Packet2d& a, const Packet2d& b)
-{ return vreinterpretq_f64_u64(vbicq_u64(vreinterpretq_u64_f64(a),vreinterpretq_u64_f64(b))); }
+template <>
+EIGEN_STRONG_INLINE Packet2d pandnot<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return vreinterpretq_f64_u64(vbicq_u64(vreinterpretq_u64_f64(a), vreinterpretq_u64_f64(b)));
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d pcmp_le(const Packet2d& a, const Packet2d& b)
-{ return vreinterpretq_f64_u64(vcleq_f64(a,b)); }
+template <>
+EIGEN_STRONG_INLINE Packet2d pcmp_le(const Packet2d& a, const Packet2d& b) {
+  return vreinterpretq_f64_u64(vcleq_f64(a, b));
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d pcmp_lt(const Packet2d& a, const Packet2d& b)
-{ return vreinterpretq_f64_u64(vcltq_f64(a,b)); }
+template <>
+EIGEN_STRONG_INLINE Packet2d pcmp_lt(const Packet2d& a, const Packet2d& b) {
+  return vreinterpretq_f64_u64(vcltq_f64(a, b));
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d pcmp_lt_or_nan(const Packet2d& a, const Packet2d& b)
-{ return vreinterpretq_f64_u32(vmvnq_u32(vreinterpretq_u32_u64(vcgeq_f64(a,b)))); }
+template <>
+EIGEN_STRONG_INLINE Packet2d pcmp_lt_or_nan(const Packet2d& a, const Packet2d& b) {
+  return vreinterpretq_f64_u32(vmvnq_u32(vreinterpretq_u32_u64(vcgeq_f64(a, b))));
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d pcmp_eq(const Packet2d& a, const Packet2d& b)
-{ return vreinterpretq_f64_u64(vceqq_f64(a,b)); }
+template <>
+EIGEN_STRONG_INLINE Packet2d pcmp_eq(const Packet2d& a, const Packet2d& b) {
+  return vreinterpretq_f64_u64(vceqq_f64(a, b));
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d pload<Packet2d>(const double* from)
-{ EIGEN_DEBUG_ALIGNED_LOAD return vld1q_f64(from); }
+template <>
+EIGEN_STRONG_INLINE Packet2d pload<Packet2d>(const double* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return vld1q_f64(from);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d ploadu<Packet2d>(const double* from)
-{ EIGEN_DEBUG_UNALIGNED_LOAD return vld1q_f64(from); }
+template <>
+EIGEN_STRONG_INLINE Packet2d ploadu<Packet2d>(const double* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return vld1q_f64(from);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d ploaddup<Packet2d>(const double* from) { return vld1q_dup_f64(from); }
-template<> EIGEN_STRONG_INLINE void pstore<double>(double* to, const Packet2d& from)
-{ EIGEN_DEBUG_ALIGNED_STORE vst1q_f64(to,from); }
+template <>
+EIGEN_STRONG_INLINE Packet2d ploaddup<Packet2d>(const double* from) {
+  return vld1q_dup_f64(from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstore<double>(double* to, const Packet2d& from) {
+  EIGEN_DEBUG_ALIGNED_STORE vst1q_f64(to, from);
+}
 
-template<> EIGEN_STRONG_INLINE void pstoreu<double>(double* to, const Packet2d& from)
-{ EIGEN_DEBUG_UNALIGNED_STORE vst1q_f64(to,from); }
+template <>
+EIGEN_STRONG_INLINE void pstoreu<double>(double* to, const Packet2d& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE vst1q_f64(to, from);
+}
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet2d pgather<double, Packet2d>(const double* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet2d pgather<double, Packet2d>(const double* from, Index stride) {
   Packet2d res = pset1<Packet2d>(0.0);
-  res = vld1q_lane_f64(from + 0*stride, res, 0);
-  res = vld1q_lane_f64(from + 1*stride, res, 1);
+  res = vld1q_lane_f64(from + 0 * stride, res, 0);
+  res = vld1q_lane_f64(from + 1 * stride, res, 1);
   return res;
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<double, Packet2d>(double* to, const Packet2d& from, Index stride)
-{
-  vst1q_lane_f64(to + stride*0, from, 0);
-  vst1q_lane_f64(to + stride*1, from, 1);
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<double, Packet2d>(double* to, const Packet2d& from, Index stride) {
+  vst1q_lane_f64(to + stride * 0, from, 0);
+  vst1q_lane_f64(to + stride * 1, from, 1);
 }
 
-template<> EIGEN_STRONG_INLINE void prefetch<double>(const double* addr) { EIGEN_ARM_PREFETCH(addr); }
+template <>
+EIGEN_STRONG_INLINE void prefetch<double>(const double* addr) {
+  EIGEN_ARM_PREFETCH(addr);
+}
 
 // FIXME only store the 2 first elements ?
-template<> EIGEN_STRONG_INLINE double pfirst<Packet2d>(const Packet2d& a) { return vgetq_lane_f64(a,0); }
+template <>
+EIGEN_STRONG_INLINE double pfirst<Packet2d>(const Packet2d& a) {
+  return vgetq_lane_f64(a, 0);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d preverse(const Packet2d& a)
-{ return vcombine_f64(vget_high_f64(a), vget_low_f64(a)); }
+template <>
+EIGEN_STRONG_INLINE Packet2d preverse(const Packet2d& a) {
+  return vcombine_f64(vget_high_f64(a), vget_low_f64(a));
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d pabs(const Packet2d& a) { return vabsq_f64(a); }
+template <>
+EIGEN_STRONG_INLINE Packet2d pabs(const Packet2d& a) {
+  return vabsq_f64(a);
+}
 
 template <>
 EIGEN_STRONG_INLINE Packet2d psignbit(const Packet2d& a) {
   return vreinterpretq_f64_s64(vshrq_n_s64(vreinterpretq_s64_f64(a), 63));
 }
 
-template<> EIGEN_STRONG_INLINE double predux<Packet2d>(const Packet2d& a)
-{ return vaddvq_f64(a); }
+template <>
+EIGEN_STRONG_INLINE double predux<Packet2d>(const Packet2d& a) {
+  return vaddvq_f64(a);
+}
 
 // Other reduction functions:
 // mul
 #if EIGEN_COMP_CLANGAPPLE
-template<> EIGEN_STRONG_INLINE double predux_mul<Packet2d>(const Packet2d& a)
-{ return (vget_low_f64(a) * vget_high_f64(a))[0]; }
+template <>
+EIGEN_STRONG_INLINE double predux_mul<Packet2d>(const Packet2d& a) {
+  return (vget_low_f64(a) * vget_high_f64(a))[0];
+}
 #else
-template<> EIGEN_STRONG_INLINE double predux_mul<Packet2d>(const Packet2d& a)
-{ return vget_lane_f64(vmul_f64(vget_low_f64(a), vget_high_f64(a)), 0); }
+template <>
+EIGEN_STRONG_INLINE double predux_mul<Packet2d>(const Packet2d& a) {
+  return vget_lane_f64(vmul_f64(vget_low_f64(a), vget_high_f64(a)), 0);
+}
 #endif
 
 // min
-template<> EIGEN_STRONG_INLINE double predux_min<Packet2d>(const Packet2d& a)
-{ return vminvq_f64(a); }
+template <>
+EIGEN_STRONG_INLINE double predux_min<Packet2d>(const Packet2d& a) {
+  return vminvq_f64(a);
+}
 
 // max
-template<> EIGEN_STRONG_INLINE double predux_max<Packet2d>(const Packet2d& a)
-{ return vmaxvq_f64(a); }
+template <>
+EIGEN_STRONG_INLINE double predux_max<Packet2d>(const Packet2d& a) {
+  return vmaxvq_f64(a);
+}
 
-
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void
-ptranspose(PacketBlock<Packet2d, 2>& kernel)
-{
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet2d, 2>& kernel) {
   const float64x2_t tmp1 = vzip1q_f64(kernel.packet[0], kernel.packet[1]);
   const float64x2_t tmp2 = vzip2q_f64(kernel.packet[0], kernel.packet[1]);
 
@@ -4014,35 +5440,53 @@
   kernel.packet[1] = tmp2;
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet2d pselect( const Packet2d& mask, const Packet2d& a, const Packet2d& b)
-{ return vbslq_f64(vreinterpretq_u64_f64(mask), a, b); }
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet2d pselect(const Packet2d& mask, const Packet2d& a, const Packet2d& b) {
+  return vbslq_f64(vreinterpretq_u64_f64(mask), a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d print<Packet2d>(const Packet2d& a)
-{ return vrndnq_f64(a); }
+template <>
+EIGEN_STRONG_INLINE Packet2d print<Packet2d>(const Packet2d& a) {
+  return vrndnq_f64(a);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d pfloor<Packet2d>(const Packet2d& a)
-{ return vrndmq_f64(a); }
+template <>
+EIGEN_STRONG_INLINE Packet2d pfloor<Packet2d>(const Packet2d& a) {
+  return vrndmq_f64(a);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d pceil<Packet2d>(const Packet2d& a)
-{ return vrndpq_f64(a); }
+template <>
+EIGEN_STRONG_INLINE Packet2d pceil<Packet2d>(const Packet2d& a) {
+  return vrndpq_f64(a);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d pldexp<Packet2d>(const Packet2d& a, const Packet2d& exponent)
-{ return pldexp_generic(a, exponent); }
+template <>
+EIGEN_STRONG_INLINE Packet2d pldexp<Packet2d>(const Packet2d& a, const Packet2d& exponent) {
+  return pldexp_generic(a, exponent);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d pfrexp<Packet2d>(const Packet2d& a, Packet2d& exponent)
-{ return pfrexp_generic(a,exponent); }
+template <>
+EIGEN_STRONG_INLINE Packet2d pfrexp<Packet2d>(const Packet2d& a, Packet2d& exponent) {
+  return pfrexp_generic(a, exponent);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d pset1frombits<Packet2d>(uint64_t from)
-{ return vreinterpretq_f64_u64(vdupq_n_u64(from)); }
+template <>
+EIGEN_STRONG_INLINE Packet2d pset1frombits<Packet2d>(uint64_t from) {
+  return vreinterpretq_f64_u64(vdupq_n_u64(from));
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d prsqrt(const Packet2d& a) {
+template <>
+EIGEN_STRONG_INLINE Packet2d prsqrt(const Packet2d& a) {
   // Do Newton iterations for 1/sqrt(x).
   return generic_rsqrt_newton_step<Packet2d, /*Steps=*/3>::run(a, vrsqrteq_f64(a));
 }
 
-template<> EIGEN_STRONG_INLINE Packet2d psqrt(const Packet2d& _x){ return vsqrtq_f64(_x); }
+template <>
+EIGEN_STRONG_INLINE Packet2d psqrt(const Packet2d& _x) {
+  return vsqrtq_f64(_x);
+}
 
-#endif // EIGEN_ARCH_ARM64 && !EIGEN_APPLE_DOUBLE_NEON_BUG
+#endif  // EIGEN_ARCH_ARM64 && !EIGEN_APPLE_DOUBLE_NEON_BUG
 
 // Do we have an fp16 types and supporting Neon intrinsics?
 #if EIGEN_HAS_ARM64_FP16_VECTOR_ARITHMETIC
@@ -4119,7 +5563,7 @@
   };
 };
 
-template<>
+template <>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4hf predux_half_dowto4<Packet8hf>(const Packet8hf& a) {
   return vadd_f16(vget_low_f16(a), vget_high_f16(a));
 }
@@ -4229,14 +5673,27 @@
 }
 
 #ifdef __ARM_FEATURE_NUMERIC_MAXMIN
-// numeric max and min are only available if ARM_FEATURE_NUMERIC_MAXMIN is defined (which can only be the case for Armv8 systems).
-template<> EIGEN_STRONG_INLINE Packet4hf pmin<PropagateNumbers, Packet4hf>(const Packet4hf& a, const Packet4hf& b) { return vminnm_f16(a, b); }
-template<> EIGEN_STRONG_INLINE Packet8hf pmin<PropagateNumbers, Packet8hf>(const Packet8hf& a, const Packet8hf& b) { return vminnmq_f16(a, b); }
+// numeric max and min are only available if ARM_FEATURE_NUMERIC_MAXMIN is defined (which can only be the case for Armv8
+// systems).
+template <>
+EIGEN_STRONG_INLINE Packet4hf pmin<PropagateNumbers, Packet4hf>(const Packet4hf& a, const Packet4hf& b) {
+  return vminnm_f16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8hf pmin<PropagateNumbers, Packet8hf>(const Packet8hf& a, const Packet8hf& b) {
+  return vminnmq_f16(a, b);
+}
 #endif
 
-template<> EIGEN_STRONG_INLINE Packet4hf pmin<PropagateNaN, Packet4hf>(const Packet4hf& a, const Packet4hf& b) { return pmin<Packet4hf>(a, b); }
+template <>
+EIGEN_STRONG_INLINE Packet4hf pmin<PropagateNaN, Packet4hf>(const Packet4hf& a, const Packet4hf& b) {
+  return pmin<Packet4hf>(a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet8hf pmin<PropagateNaN, Packet8hf>(const Packet8hf& a, const Packet8hf& b) { return pmin<Packet8hf>(a, b); }
+template <>
+EIGEN_STRONG_INLINE Packet8hf pmin<PropagateNaN, Packet8hf>(const Packet8hf& a, const Packet8hf& b) {
+  return pmin<Packet8hf>(a, b);
+}
 
 template <>
 EIGEN_STRONG_INLINE Packet8hf pmax<Packet8hf>(const Packet8hf& a, const Packet8hf& b) {
@@ -4249,14 +5706,27 @@
 }
 
 #ifdef __ARM_FEATURE_NUMERIC_MAXMIN
-// numeric max and min are only available if ARM_FEATURE_NUMERIC_MAXMIN is defined (which can only be the case for Armv8 systems).
-template<> EIGEN_STRONG_INLINE Packet4hf pmax<PropagateNumbers, Packet4hf>(const Packet4hf& a, const Packet4hf& b) { return vmaxnm_f16(a, b); }
-template<> EIGEN_STRONG_INLINE Packet8hf pmax<PropagateNumbers, Packet8hf>(const Packet8hf& a, const Packet8hf& b) { return vmaxnmq_f16(a, b); }
+// numeric max and min are only available if ARM_FEATURE_NUMERIC_MAXMIN is defined (which can only be the case for Armv8
+// systems).
+template <>
+EIGEN_STRONG_INLINE Packet4hf pmax<PropagateNumbers, Packet4hf>(const Packet4hf& a, const Packet4hf& b) {
+  return vmaxnm_f16(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet8hf pmax<PropagateNumbers, Packet8hf>(const Packet8hf& a, const Packet8hf& b) {
+  return vmaxnmq_f16(a, b);
+}
 #endif
 
-template<> EIGEN_STRONG_INLINE Packet4hf pmax<PropagateNaN, Packet4hf>(const Packet4hf& a, const Packet4hf& b) { return pmax<Packet4hf>(a, b); }
+template <>
+EIGEN_STRONG_INLINE Packet4hf pmax<PropagateNaN, Packet4hf>(const Packet4hf& a, const Packet4hf& b) {
+  return pmax<Packet4hf>(a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet8hf pmax<PropagateNaN, Packet8hf>(const Packet8hf& a, const Packet8hf& b) { return pmax<Packet8hf>(a, b); }
+template <>
+EIGEN_STRONG_INLINE Packet8hf pmax<PropagateNaN, Packet8hf>(const Packet8hf& a, const Packet8hf& b) {
+  return pmax<Packet8hf>(a, b);
+}
 
 #define EIGEN_MAKE_ARM_FP16_CMP_8(name)                                               \
   template <>                                                                         \
@@ -4292,28 +5762,34 @@
 }
 
 template <>
-EIGEN_STRONG_INLINE Packet8hf print<Packet8hf>(const Packet8hf& a)
-{ return vrndnq_f16(a); }
+EIGEN_STRONG_INLINE Packet8hf print<Packet8hf>(const Packet8hf& a) {
+  return vrndnq_f16(a);
+}
 
 template <>
-EIGEN_STRONG_INLINE Packet4hf print<Packet4hf>(const Packet4hf& a)
-{ return vrndn_f16(a); }
+EIGEN_STRONG_INLINE Packet4hf print<Packet4hf>(const Packet4hf& a) {
+  return vrndn_f16(a);
+}
 
 template <>
-EIGEN_STRONG_INLINE Packet8hf pfloor<Packet8hf>(const Packet8hf& a)
-{ return vrndmq_f16(a); }
+EIGEN_STRONG_INLINE Packet8hf pfloor<Packet8hf>(const Packet8hf& a) {
+  return vrndmq_f16(a);
+}
 
 template <>
-EIGEN_STRONG_INLINE Packet4hf pfloor<Packet4hf>(const Packet4hf& a)
-{ return vrndm_f16(a); }
+EIGEN_STRONG_INLINE Packet4hf pfloor<Packet4hf>(const Packet4hf& a) {
+  return vrndm_f16(a);
+}
 
 template <>
-EIGEN_STRONG_INLINE Packet8hf pceil<Packet8hf>(const Packet8hf& a)
-{ return vrndpq_f16(a); }
+EIGEN_STRONG_INLINE Packet8hf pceil<Packet8hf>(const Packet8hf& a) {
+  return vrndpq_f16(a);
+}
 
 template <>
-EIGEN_STRONG_INLINE Packet4hf pceil<Packet4hf>(const Packet4hf& a)
-{ return vrndp_f16(a); }
+EIGEN_STRONG_INLINE Packet4hf pceil<Packet4hf>(const Packet4hf& a) {
+  return vrndp_f16(a);
+}
 
 template <>
 EIGEN_STRONG_INLINE Packet8hf psqrt<Packet8hf>(const Packet8hf& a) {
@@ -4415,13 +5891,17 @@
 EIGEN_STRONG_INLINE Packet8hf ploadquad<Packet8hf>(const Eigen::half* from) {
   Packet4hf lo, hi;
   lo = vld1_dup_f16(reinterpret_cast<const float16_t*>(from));
-  hi = vld1_dup_f16(reinterpret_cast<const float16_t*>(from+1));
+  hi = vld1_dup_f16(reinterpret_cast<const float16_t*>(from + 1));
   return vcombine_f16(lo, hi);
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet8hf pinsertfirst(const Packet8hf& a, Eigen::half b) { return vsetq_lane_f16(b.x, a, 0); }
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet8hf pinsertfirst(const Packet8hf& a, Eigen::half b) {
+  return vsetq_lane_f16(b.x, a, 0);
+}
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4hf pinsertfirst(const Packet4hf& a, Eigen::half b) { return vset_lane_f16(b.x, a, 0); }
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4hf pinsertfirst(const Packet4hf& a, Eigen::half b) {
+  return vset_lane_f16(b.x, a, 0);
+}
 
 template <>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet8hf pselect(const Packet8hf& mask, const Packet8hf& a, const Packet8hf& b) {
@@ -4433,9 +5913,13 @@
   return vbsl_f16(vreinterpret_u16_f16(mask), a, b);
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet8hf pinsertlast(const Packet8hf& a, Eigen::half b) { return vsetq_lane_f16(b.x, a, 7); }
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet8hf pinsertlast(const Packet8hf& a, Eigen::half b) {
+  return vsetq_lane_f16(b.x, a, 7);
+}
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4hf pinsertlast(const Packet4hf& a, Eigen::half b) { return vset_lane_f16(b.x, a, 3); }
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4hf pinsertlast(const Packet4hf& a, Eigen::half b) {
+  return vset_lane_f16(b.x, a, 3);
+}
 
 template <>
 EIGEN_STRONG_INLINE void pstore<Eigen::half>(Eigen::half* to, const Packet8hf& from) {
@@ -4482,7 +5966,8 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<Eigen::half, Packet8hf>(Eigen::half* to, const Packet8hf& from, Index stride) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<Eigen::half, Packet8hf>(Eigen::half* to, const Packet8hf& from,
+                                                                            Index stride) {
   to[stride * 0].x = vgetq_lane_f16(from, 0);
   to[stride * 1].x = vgetq_lane_f16(from, 1);
   to[stride * 2].x = vgetq_lane_f16(from, 2);
@@ -4494,7 +5979,8 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<Eigen::half, Packet4hf>(Eigen::half* to, const Packet4hf& from, Index stride) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<Eigen::half, Packet4hf>(Eigen::half* to, const Packet4hf& from,
+                                                                            Index stride) {
   to[stride * 0].x = vget_lane_f16(from, 0);
   to[stride * 1].x = vget_lane_f16(from, 1);
   to[stride * 2].x = vget_lane_f16(from, 2);
@@ -4524,7 +6010,8 @@
   return h;
 }
 
-template<> EIGEN_STRONG_INLINE Packet8hf preverse(const Packet8hf& a) {
+template <>
+EIGEN_STRONG_INLINE Packet8hf preverse(const Packet8hf& a) {
   float16x4_t a_lo, a_hi;
   Packet8hf a_r64;
 
@@ -4544,7 +6031,7 @@
   return vabsq_f16(a);
 }
 
-template<>
+template <>
 EIGEN_STRONG_INLINE Packet8hf psignbit(const Packet8hf& a) {
   return vreinterpretq_f16_s16(vshrq_n_s16(vreinterpretq_s16_f16(a), 15));
 }
@@ -4556,7 +6043,7 @@
 
 template <>
 EIGEN_STRONG_INLINE Packet4hf psignbit(const Packet4hf& a) {
-  return vreinterpret_f16_s16( vshr_n_s16( vreinterpret_s16_f16(a), 15)); 
+  return vreinterpret_f16_s16(vshr_n_s16(vreinterpret_s16_f16(a), 15));
 }
 
 template <>
@@ -4636,8 +6123,7 @@
   return h;
 }
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet8hf, 4>& kernel)
-{
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet8hf, 4>& kernel) {
   const float16x8x2_t zip16_1 = vzipq_f16(kernel.packet[0], kernel.packet[1]);
   const float16x8x2_t zip16_2 = vzipq_f16(kernel.packet[2], kernel.packet[3]);
 
@@ -4690,10 +6176,10 @@
   kernel.packet[6] = T_3[1].val[1];
   kernel.packet[7] = T_3[3].val[1];
 }
-#endif // end EIGEN_HAS_ARM64_FP16_VECTOR_ARITHMETIC
+#endif  // end EIGEN_HAS_ARM64_FP16_VECTOR_ARITHMETIC
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_PACKET_MATH_NEON_H
+#endif  // EIGEN_PACKET_MATH_NEON_H
diff --git a/Eigen/src/Core/arch/NEON/TypeCasting.h b/Eigen/src/Core/arch/NEON/TypeCasting.h
index 68566b0..58d7b8c 100644
--- a/Eigen/src/Core/arch/NEON/TypeCasting.h
+++ b/Eigen/src/Core/arch/NEON/TypeCasting.h
@@ -18,7 +18,6 @@
 
 namespace internal {
 
-
 //==============================================================================
 // preinterpret (truncation operations)
 //==============================================================================
@@ -93,7 +92,6 @@
   return Packet4f(vreinterpretq_f32_u32(a));
 }
 
-
 template <>
 EIGEN_STRONG_INLINE Packet4c preinterpret<Packet4c, Packet4uc>(const Packet4uc& a) {
   return static_cast<Packet4c>(a);
@@ -107,7 +105,6 @@
   return Packet16c(vreinterpretq_s8_u8(a));
 }
 
-
 template <>
 EIGEN_STRONG_INLINE Packet4uc preinterpret<Packet4uc, Packet4c>(const Packet4c& a) {
   return static_cast<Packet4uc>(a);
@@ -185,7 +182,6 @@
 // pcast, SrcType = float
 //==============================================================================
 
-
 template <>
 struct type_casting_traits<float, numext::int64_t> {
   enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
@@ -415,7 +411,6 @@
   return vget_low_s32(vmovl_s16(vget_low_s16(vmovl_s8(a))));
 }
 
-
 template <>
 struct type_casting_traits<numext::int8_t, numext::uint32_t> {
   enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 4 };
@@ -477,7 +472,6 @@
   return preinterpret<Packet4us>(pcast<Packet4c, Packet4s>(a));
 }
 
-
 //==============================================================================
 // pcast, SrcType = uint8_t
 //==============================================================================
@@ -577,7 +571,6 @@
   return vget_low_u16(vmovl_u8(vreinterpret_u8_u32(vdup_n_u32(a))));
 }
 
-
 template <>
 struct type_casting_traits<numext::uint8_t, numext::int16_t> {
   enum { VectorizedCast = 1, SrcCoeffRatio = 1, TgtCoeffRatio = 2 };
@@ -595,7 +588,6 @@
   return preinterpret<Packet4s>(pcast<Packet4uc, Packet4us>(a));
 }
 
-
 //==============================================================================
 // pcast, SrcType = int16_t
 //==============================================================================
@@ -673,7 +665,6 @@
   return preinterpret<Packet2ui>(pcast<Packet4s, Packet2i>(a));
 }
 
-
 template <>
 struct type_casting_traits<numext::int16_t, numext::int8_t> {
   enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
@@ -794,7 +785,6 @@
   return preinterpret<Packet2i>(pcast<Packet4us, Packet2ui>(a));
 }
 
-
 template <>
 struct type_casting_traits<numext::uint16_t, numext::uint8_t> {
   enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
@@ -881,7 +871,6 @@
   return preinterpret<Packet2ul>(pcast<Packet2i, Packet2l>(a));
 }
 
-
 template <>
 struct type_casting_traits<numext::int32_t, numext::int16_t> {
   enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
@@ -1013,7 +1002,6 @@
   return preinterpret<Packet2l>(pcast<Packet2ui, Packet2ul>(a));
 }
 
-
 template <>
 struct type_casting_traits<numext::uint32_t, numext::uint16_t> {
   enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
@@ -1273,7 +1261,6 @@
 #endif
 }
 
-
 template <>
 struct type_casting_traits<numext::uint64_t, numext::uint32_t> {
   enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
@@ -1407,7 +1394,6 @@
   return Packet4i(vreinterpretq_s32_f64(a));
 }
 
-
 template <>
 struct type_casting_traits<double, float> {
   enum { VectorizedCast = 1, SrcCoeffRatio = 2, TgtCoeffRatio = 1 };
@@ -1534,7 +1520,7 @@
 }
 template <>
 EIGEN_STRONG_INLINE Packet8uc pcast<Packet2d, Packet8uc>(const Packet2d& a, const Packet2d& b, const Packet2d& c,
-                                                           const Packet2d& d) {
+                                                         const Packet2d& d) {
   return preinterpret<Packet8uc>(pcast<Packet2d, Packet8c>(a, b, c, d));
 }
 template <>
diff --git a/Eigen/src/Core/arch/NEON/UnaryFunctors.h b/Eigen/src/Core/arch/NEON/UnaryFunctors.h
index 09da91c..8be5bb0 100644
--- a/Eigen/src/Core/arch/NEON/UnaryFunctors.h
+++ b/Eigen/src/Core/arch/NEON/UnaryFunctors.h
@@ -17,38 +17,31 @@
 
 #if EIGEN_HAS_ARM64_FP16_VECTOR_ARITHMETIC
 /** \internal
-  * \brief Template specialization of the logistic function for Eigen::half.
-  */
+ * \brief Template specialization of the logistic function for Eigen::half.
+ */
 template <>
 struct scalar_logistic_op<Eigen::half> {
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Eigen::half operator()(const Eigen::half& x) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Eigen::half operator()(const Eigen::half& x) const {
     // Convert to float and call scalar_logistic_op<float>.
     const scalar_logistic_op<float> float_op;
     return Eigen::half(float_op(float(x)));
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Eigen::half packetOp(const Eigen::half& x) const {
-    return this->operator()(x);
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Eigen::half packetOp(const Eigen::half& x) const { return this->operator()(x); }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Packet4hf packetOp(const Packet4hf& x) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4hf packetOp(const Packet4hf& x) const {
     const scalar_logistic_op<float> float_op;
     return vcvt_f16_f32(float_op.packetOp(vcvt_f32_f16(x)));
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Packet8hf packetOp(const Packet8hf& x) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet8hf packetOp(const Packet8hf& x) const {
     const scalar_logistic_op<float> float_op;
-    return vcombine_f16(
-      vcvt_f16_f32(float_op.packetOp(vcvt_f32_f16(vget_low_f16(x)))),
-      vcvt_f16_f32(float_op.packetOp(vcvt_high_f32_f16(x))));
+    return vcombine_f16(vcvt_f16_f32(float_op.packetOp(vcvt_f32_f16(vget_low_f16(x)))),
+                        vcvt_f16_f32(float_op.packetOp(vcvt_high_f32_f16(x))));
   }
 };
 
-template<>
+template <>
 struct functor_traits<scalar_logistic_op<Eigen::half>> {
   enum {
     Cost = functor_traits<scalar_logistic_op<float>>::Cost,
@@ -57,8 +50,8 @@
 };
 #endif  // EIGEN_HAS_ARM64_FP16_VECTOR_ARITHMETIC
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_NEON_UNARY_FUNCTORS_H
+#endif  // EIGEN_NEON_UNARY_FUNCTORS_H
diff --git a/Eigen/src/Core/arch/SSE/Complex.h b/Eigen/src/Core/arch/SSE/Complex.h
index d068806..4c5c499 100644
--- a/Eigen/src/Core/arch/SSE/Complex.h
+++ b/Eigen/src/Core/arch/SSE/Complex.h
@@ -18,8 +18,7 @@
 namespace internal {
 
 //---------- float ----------
-struct Packet2cf
-{
+struct Packet2cf {
   EIGEN_STRONG_INLINE Packet2cf() {}
   EIGEN_STRONG_INLINE explicit Packet2cf(const __m128& a) : v(a) {}
   Packet4f v;
@@ -28,8 +27,8 @@
 // Use the packet_traits defined in AVX/PacketMath.h instead if we're going
 // to leverage AVX instructions.
 #ifndef EIGEN_VECTORIZE_AVX
-template<> struct packet_traits<std::complex<float> >  : default_packet_traits
-{
+template <>
+struct packet_traits<std::complex<float> > : default_packet_traits {
   typedef Packet2cf type;
   typedef Packet2cf half;
   enum {
@@ -37,138 +36,179 @@
     AlignedOnScalar = 1,
     size = 2,
 
-    HasAdd    = 1,
-    HasSub    = 1,
-    HasMul    = 1,
-    HasDiv    = 1,
+    HasAdd = 1,
+    HasSub = 1,
+    HasMul = 1,
+    HasDiv = 1,
     HasNegate = 1,
-    HasSqrt   = 1,
-    HasAbs    = 0,
-    HasAbs2   = 0,
-    HasMin    = 0,
-    HasMax    = 0,
+    HasSqrt = 1,
+    HasAbs = 0,
+    HasAbs2 = 0,
+    HasMin = 0,
+    HasMax = 0,
     HasSetLinear = 0,
-    HasBlend  = 1
+    HasBlend = 1
   };
 };
 #endif
 
-template<> struct unpacket_traits<Packet2cf> {
+template <>
+struct unpacket_traits<Packet2cf> {
   typedef std::complex<float> type;
   typedef Packet2cf half;
   typedef Packet4f as_real;
   enum {
-    size=2,
-    alignment=Aligned16,
-    vectorizable=true,
-    masked_load_available=false,
-    masked_store_available=false
+    size = 2,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
   };
 };
 
-template<> EIGEN_STRONG_INLINE Packet2cf padd<Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(_mm_add_ps(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet2cf psub<Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(_mm_sub_ps(a.v,b.v)); }
-
-template<> EIGEN_STRONG_INLINE Packet2cf pnegate(const Packet2cf& a)
-{
-  const __m128 mask = _mm_castsi128_ps(_mm_setr_epi32(0x80000000,0x80000000,0x80000000,0x80000000));
-  return Packet2cf(_mm_xor_ps(a.v,mask));
+template <>
+EIGEN_STRONG_INLINE Packet2cf padd<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
+  return Packet2cf(_mm_add_ps(a.v, b.v));
 }
-template<> EIGEN_STRONG_INLINE Packet2cf pconj(const Packet2cf& a)
-{
-  const __m128 mask = _mm_castsi128_ps(_mm_setr_epi32(0x00000000,0x80000000,0x00000000,0x80000000));
-  return Packet2cf(_mm_xor_ps(a.v,mask));
+template <>
+EIGEN_STRONG_INLINE Packet2cf psub<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
+  return Packet2cf(_mm_sub_ps(a.v, b.v));
 }
 
-template<> EIGEN_STRONG_INLINE Packet2cf pmul<Packet2cf>(const Packet2cf& a, const Packet2cf& b)
-{
-  #ifdef EIGEN_VECTORIZE_SSE3
+template <>
+EIGEN_STRONG_INLINE Packet2cf pnegate(const Packet2cf& a) {
+  const __m128 mask = _mm_castsi128_ps(_mm_setr_epi32(0x80000000, 0x80000000, 0x80000000, 0x80000000));
+  return Packet2cf(_mm_xor_ps(a.v, mask));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf pconj(const Packet2cf& a) {
+  const __m128 mask = _mm_castsi128_ps(_mm_setr_epi32(0x00000000, 0x80000000, 0x00000000, 0x80000000));
+  return Packet2cf(_mm_xor_ps(a.v, mask));
+}
+
+template <>
+EIGEN_STRONG_INLINE Packet2cf pmul<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
+#ifdef EIGEN_VECTORIZE_SSE3
   return Packet2cf(_mm_addsub_ps(_mm_mul_ps(_mm_moveldup_ps(a.v), b.v),
-                                 _mm_mul_ps(_mm_movehdup_ps(a.v),
-                                            vec4f_swizzle1(b.v, 1, 0, 3, 2))));
-//   return Packet2cf(_mm_addsub_ps(_mm_mul_ps(vec4f_swizzle1(a.v, 0, 0, 2, 2), b.v),
-//                                  _mm_mul_ps(vec4f_swizzle1(a.v, 1, 1, 3, 3),
-//                                             vec4f_swizzle1(b.v, 1, 0, 3, 2))));
-  #else
-  const __m128 mask = _mm_castsi128_ps(_mm_setr_epi32(0x80000000,0x00000000,0x80000000,0x00000000));
-  return Packet2cf(_mm_add_ps(_mm_mul_ps(vec4f_swizzle1(a.v, 0, 0, 2, 2), b.v),
-                              _mm_xor_ps(_mm_mul_ps(vec4f_swizzle1(a.v, 1, 1, 3, 3),
-                                                    vec4f_swizzle1(b.v, 1, 0, 3, 2)), mask)));
-  #endif
+                                 _mm_mul_ps(_mm_movehdup_ps(a.v), vec4f_swizzle1(b.v, 1, 0, 3, 2))));
+  //   return Packet2cf(_mm_addsub_ps(_mm_mul_ps(vec4f_swizzle1(a.v, 0, 0, 2, 2), b.v),
+  //                                  _mm_mul_ps(vec4f_swizzle1(a.v, 1, 1, 3, 3),
+  //                                             vec4f_swizzle1(b.v, 1, 0, 3, 2))));
+#else
+  const __m128 mask = _mm_castsi128_ps(_mm_setr_epi32(0x80000000, 0x00000000, 0x80000000, 0x00000000));
+  return Packet2cf(
+      _mm_add_ps(_mm_mul_ps(vec4f_swizzle1(a.v, 0, 0, 2, 2), b.v),
+                 _mm_xor_ps(_mm_mul_ps(vec4f_swizzle1(a.v, 1, 1, 3, 3), vec4f_swizzle1(b.v, 1, 0, 3, 2)), mask)));
+#endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet2cf ptrue  <Packet2cf>(const Packet2cf& a) { return Packet2cf(ptrue(Packet4f(a.v))); }
-template<> EIGEN_STRONG_INLINE Packet2cf pand   <Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(_mm_and_ps(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet2cf por    <Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(_mm_or_ps(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet2cf pxor   <Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(_mm_xor_ps(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet2cf pandnot<Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(_mm_andnot_ps(b.v,a.v)); }
+template <>
+EIGEN_STRONG_INLINE Packet2cf ptrue<Packet2cf>(const Packet2cf& a) {
+  return Packet2cf(ptrue(Packet4f(a.v)));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf pand<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
+  return Packet2cf(_mm_and_ps(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf por<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
+  return Packet2cf(_mm_or_ps(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf pxor<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
+  return Packet2cf(_mm_xor_ps(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf pandnot<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
+  return Packet2cf(_mm_andnot_ps(b.v, a.v));
+}
 
-template<> EIGEN_STRONG_INLINE Packet2cf pload <Packet2cf>(const std::complex<float>* from) { EIGEN_DEBUG_ALIGNED_LOAD return Packet2cf(pload<Packet4f>(&numext::real_ref(*from))); }
-template<> EIGEN_STRONG_INLINE Packet2cf ploadu<Packet2cf>(const std::complex<float>* from) { EIGEN_DEBUG_UNALIGNED_LOAD return Packet2cf(ploadu<Packet4f>(&numext::real_ref(*from))); }
+template <>
+EIGEN_STRONG_INLINE Packet2cf pload<Packet2cf>(const std::complex<float>* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return Packet2cf(pload<Packet4f>(&numext::real_ref(*from)));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf ploadu<Packet2cf>(const std::complex<float>* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return Packet2cf(ploadu<Packet4f>(&numext::real_ref(*from)));
+}
 
-template<> EIGEN_STRONG_INLINE Packet2cf pset1<Packet2cf>(const std::complex<float>&  from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2cf pset1<Packet2cf>(const std::complex<float>& from) {
   const float re = std::real(from);
   const float im = std::imag(from);
   return Packet2cf(_mm_set_ps(im, re, im, re));
 }
 
-template<> EIGEN_STRONG_INLINE Packet2cf ploaddup<Packet2cf>(const std::complex<float>* from) { return pset1<Packet2cf>(*from); }
-
-template<> EIGEN_STRONG_INLINE void pstore <std::complex<float> >(std::complex<float> *   to, const Packet2cf& from) { EIGEN_DEBUG_ALIGNED_STORE pstore(&numext::real_ref(*to), Packet4f(from.v)); }
-template<> EIGEN_STRONG_INLINE void pstoreu<std::complex<float> >(std::complex<float> *   to, const Packet2cf& from) { EIGEN_DEBUG_UNALIGNED_STORE pstoreu(&numext::real_ref(*to), Packet4f(from.v)); }
-
-
-template<> EIGEN_DEVICE_FUNC inline Packet2cf pgather<std::complex<float>, Packet2cf>(const std::complex<float>* from, Index stride)
-{
-  return Packet2cf(_mm_set_ps(std::imag(from[1*stride]), std::real(from[1*stride]),
-                              std::imag(from[0*stride]), std::real(from[0*stride])));
+template <>
+EIGEN_STRONG_INLINE Packet2cf ploaddup<Packet2cf>(const std::complex<float>* from) {
+  return pset1<Packet2cf>(*from);
 }
 
-template<> EIGEN_DEVICE_FUNC inline void pscatter<std::complex<float>, Packet2cf>(std::complex<float>* to, const Packet2cf& from, Index stride)
-{
-  to[stride*0] = std::complex<float>(_mm_cvtss_f32(_mm_shuffle_ps(from.v, from.v, 0)),
-                                     _mm_cvtss_f32(_mm_shuffle_ps(from.v, from.v, 1)));
-  to[stride*1] = std::complex<float>(_mm_cvtss_f32(_mm_shuffle_ps(from.v, from.v, 2)),
-                                     _mm_cvtss_f32(_mm_shuffle_ps(from.v, from.v, 3)));
+template <>
+EIGEN_STRONG_INLINE void pstore<std::complex<float> >(std::complex<float>* to, const Packet2cf& from) {
+  EIGEN_DEBUG_ALIGNED_STORE pstore(&numext::real_ref(*to), Packet4f(from.v));
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<std::complex<float> >(std::complex<float>* to, const Packet2cf& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE pstoreu(&numext::real_ref(*to), Packet4f(from.v));
 }
 
-template<> EIGEN_STRONG_INLINE void prefetch<std::complex<float> >(const std::complex<float> *   addr) { _mm_prefetch((SsePrefetchPtrType)(addr), _MM_HINT_T0); }
+template <>
+EIGEN_DEVICE_FUNC inline Packet2cf pgather<std::complex<float>, Packet2cf>(const std::complex<float>* from,
+                                                                           Index stride) {
+  return Packet2cf(_mm_set_ps(std::imag(from[1 * stride]), std::real(from[1 * stride]), std::imag(from[0 * stride]),
+                              std::real(from[0 * stride])));
+}
 
-template<> EIGEN_STRONG_INLINE std::complex<float>  pfirst<Packet2cf>(const Packet2cf& a)
-{
+template <>
+EIGEN_DEVICE_FUNC inline void pscatter<std::complex<float>, Packet2cf>(std::complex<float>* to, const Packet2cf& from,
+                                                                       Index stride) {
+  to[stride * 0] = std::complex<float>(_mm_cvtss_f32(_mm_shuffle_ps(from.v, from.v, 0)),
+                                       _mm_cvtss_f32(_mm_shuffle_ps(from.v, from.v, 1)));
+  to[stride * 1] = std::complex<float>(_mm_cvtss_f32(_mm_shuffle_ps(from.v, from.v, 2)),
+                                       _mm_cvtss_f32(_mm_shuffle_ps(from.v, from.v, 3)));
+}
+
+template <>
+EIGEN_STRONG_INLINE void prefetch<std::complex<float> >(const std::complex<float>* addr) {
+  _mm_prefetch((SsePrefetchPtrType)(addr), _MM_HINT_T0);
+}
+
+template <>
+EIGEN_STRONG_INLINE std::complex<float> pfirst<Packet2cf>(const Packet2cf& a) {
   alignas(alignof(__m64)) std::complex<float> res;
   _mm_storel_pi((__m64*)&res, a.v);
   return res;
 }
 
-template<> EIGEN_STRONG_INLINE Packet2cf preverse(const Packet2cf& a) { return Packet2cf(_mm_castpd_ps(preverse(Packet2d(_mm_castps_pd(a.v))))); }
-
-template<> EIGEN_STRONG_INLINE std::complex<float> predux<Packet2cf>(const Packet2cf& a)
-{
-  return pfirst(Packet2cf(_mm_add_ps(a.v, _mm_movehl_ps(a.v,a.v))));
+template <>
+EIGEN_STRONG_INLINE Packet2cf preverse(const Packet2cf& a) {
+  return Packet2cf(_mm_castpd_ps(preverse(Packet2d(_mm_castps_pd(a.v)))));
 }
 
-template<> EIGEN_STRONG_INLINE std::complex<float> predux_mul<Packet2cf>(const Packet2cf& a)
-{
-  return pfirst(pmul(a, Packet2cf(_mm_movehl_ps(a.v,a.v))));
+template <>
+EIGEN_STRONG_INLINE std::complex<float> predux<Packet2cf>(const Packet2cf& a) {
+  return pfirst(Packet2cf(_mm_add_ps(a.v, _mm_movehl_ps(a.v, a.v))));
 }
 
-EIGEN_STRONG_INLINE Packet2cf pcplxflip/* <Packet2cf> */(const Packet2cf& x)
-{
+template <>
+EIGEN_STRONG_INLINE std::complex<float> predux_mul<Packet2cf>(const Packet2cf& a) {
+  return pfirst(pmul(a, Packet2cf(_mm_movehl_ps(a.v, a.v))));
+}
+
+EIGEN_STRONG_INLINE Packet2cf pcplxflip /* <Packet2cf> */ (const Packet2cf& x) {
   return Packet2cf(vec4f_swizzle1(x.v, 1, 0, 3, 2));
 }
 
-EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet2cf,Packet4f)
+EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet2cf, Packet4f)
 
-template<> EIGEN_STRONG_INLINE Packet2cf pdiv<Packet2cf>(const Packet2cf& a, const Packet2cf& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2cf pdiv<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
   return pdiv_complex(a, b);
 }
 
 //---------- double ----------
-struct Packet1cd
-{
+struct Packet1cd {
   EIGEN_STRONG_INLINE Packet1cd() {}
   EIGEN_STRONG_INLINE explicit Packet1cd(const __m128d& a) : v(a) {}
   Packet2d v;
@@ -177,8 +217,8 @@
 // Use the packet_traits defined in AVX/PacketMath.h instead if we're going
 // to leverage AVX instructions.
 #ifndef EIGEN_VECTORIZE_AVX
-template<> struct packet_traits<std::complex<double> >  : default_packet_traits
-{
+template <>
+struct packet_traits<std::complex<double> > : default_packet_traits {
   typedef Packet1cd type;
   typedef Packet1cd half;
   enum {
@@ -186,112 +226,155 @@
     AlignedOnScalar = 0,
     size = 1,
 
-    HasAdd    = 1,
-    HasSub    = 1,
-    HasMul    = 1,
-    HasDiv    = 1,
+    HasAdd = 1,
+    HasSub = 1,
+    HasMul = 1,
+    HasDiv = 1,
     HasNegate = 1,
-    HasSqrt   = 1,
-    HasAbs    = 0,
-    HasAbs2   = 0,
-    HasMin    = 0,
-    HasMax    = 0,
+    HasSqrt = 1,
+    HasAbs = 0,
+    HasAbs2 = 0,
+    HasMin = 0,
+    HasMax = 0,
     HasSetLinear = 0
   };
 };
 #endif
 
-template<> struct unpacket_traits<Packet1cd> {
+template <>
+struct unpacket_traits<Packet1cd> {
   typedef std::complex<double> type;
   typedef Packet1cd half;
   typedef Packet2d as_real;
   enum {
-    size=1,
-    alignment=Aligned16,
-    vectorizable=true,
-    masked_load_available=false,
-    masked_store_available=false
+    size = 1,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
   };
 };
 
-template<> EIGEN_STRONG_INLINE Packet1cd padd<Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(_mm_add_pd(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet1cd psub<Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(_mm_sub_pd(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet1cd pnegate(const Packet1cd& a) { return Packet1cd(pnegate(Packet2d(a.v))); }
-template<> EIGEN_STRONG_INLINE Packet1cd pconj(const Packet1cd& a)
-{
-  const __m128d mask = _mm_castsi128_pd(_mm_set_epi32(0x80000000,0x0,0x0,0x0));
-  return Packet1cd(_mm_xor_pd(a.v,mask));
+template <>
+EIGEN_STRONG_INLINE Packet1cd padd<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
+  return Packet1cd(_mm_add_pd(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet1cd psub<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
+  return Packet1cd(_mm_sub_pd(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet1cd pnegate(const Packet1cd& a) {
+  return Packet1cd(pnegate(Packet2d(a.v)));
+}
+template <>
+EIGEN_STRONG_INLINE Packet1cd pconj(const Packet1cd& a) {
+  const __m128d mask = _mm_castsi128_pd(_mm_set_epi32(0x80000000, 0x0, 0x0, 0x0));
+  return Packet1cd(_mm_xor_pd(a.v, mask));
 }
 
-template<> EIGEN_STRONG_INLINE Packet1cd pmul<Packet1cd>(const Packet1cd& a, const Packet1cd& b)
-{
-  #ifdef EIGEN_VECTORIZE_SSE3
+template <>
+EIGEN_STRONG_INLINE Packet1cd pmul<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
+#ifdef EIGEN_VECTORIZE_SSE3
   return Packet1cd(_mm_addsub_pd(_mm_mul_pd(_mm_movedup_pd(a.v), b.v),
-                                 _mm_mul_pd(vec2d_swizzle1(a.v, 1, 1),
-                                            vec2d_swizzle1(b.v, 1, 0))));
-  #else
-  const __m128d mask = _mm_castsi128_pd(_mm_set_epi32(0x0,0x0,0x80000000,0x0));
+                                 _mm_mul_pd(vec2d_swizzle1(a.v, 1, 1), vec2d_swizzle1(b.v, 1, 0))));
+#else
+  const __m128d mask = _mm_castsi128_pd(_mm_set_epi32(0x0, 0x0, 0x80000000, 0x0));
   return Packet1cd(_mm_add_pd(_mm_mul_pd(vec2d_swizzle1(a.v, 0, 0), b.v),
-                              _mm_xor_pd(_mm_mul_pd(vec2d_swizzle1(a.v, 1, 1),
-                                                    vec2d_swizzle1(b.v, 1, 0)), mask)));
-  #endif
+                              _mm_xor_pd(_mm_mul_pd(vec2d_swizzle1(a.v, 1, 1), vec2d_swizzle1(b.v, 1, 0)), mask)));
+#endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet1cd ptrue  <Packet1cd>(const Packet1cd& a) { return Packet1cd(ptrue(Packet2d(a.v))); }
-template<> EIGEN_STRONG_INLINE Packet1cd pand   <Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(_mm_and_pd(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet1cd por    <Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(_mm_or_pd(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet1cd pxor   <Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(_mm_xor_pd(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet1cd pandnot<Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(_mm_andnot_pd(b.v,a.v)); }
+template <>
+EIGEN_STRONG_INLINE Packet1cd ptrue<Packet1cd>(const Packet1cd& a) {
+  return Packet1cd(ptrue(Packet2d(a.v)));
+}
+template <>
+EIGEN_STRONG_INLINE Packet1cd pand<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
+  return Packet1cd(_mm_and_pd(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet1cd por<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
+  return Packet1cd(_mm_or_pd(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet1cd pxor<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
+  return Packet1cd(_mm_xor_pd(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet1cd pandnot<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
+  return Packet1cd(_mm_andnot_pd(b.v, a.v));
+}
 
 // FIXME force unaligned load, this is a temporary fix
-template<> EIGEN_STRONG_INLINE Packet1cd pload <Packet1cd>(const std::complex<double>* from)
-{ EIGEN_DEBUG_ALIGNED_LOAD return Packet1cd(pload<Packet2d>((const double*)from)); }
-template<> EIGEN_STRONG_INLINE Packet1cd ploadu<Packet1cd>(const std::complex<double>* from)
-{ EIGEN_DEBUG_UNALIGNED_LOAD return Packet1cd(ploadu<Packet2d>((const double*)from)); }
-template<> EIGEN_STRONG_INLINE Packet1cd pset1<Packet1cd>(const std::complex<double>&  from)
-{ /* here we really have to use unaligned loads :( */ return ploadu<Packet1cd>(&from); }
+template <>
+EIGEN_STRONG_INLINE Packet1cd pload<Packet1cd>(const std::complex<double>* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return Packet1cd(pload<Packet2d>((const double*)from));
+}
+template <>
+EIGEN_STRONG_INLINE Packet1cd ploadu<Packet1cd>(const std::complex<double>* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return Packet1cd(ploadu<Packet2d>((const double*)from));
+}
+template <>
+EIGEN_STRONG_INLINE Packet1cd
+pset1<Packet1cd>(const std::complex<double>& from) { /* here we really have to use unaligned loads :( */
+  return ploadu<Packet1cd>(&from);
+}
 
-template<> EIGEN_STRONG_INLINE Packet1cd ploaddup<Packet1cd>(const std::complex<double>* from) { return pset1<Packet1cd>(*from); }
+template <>
+EIGEN_STRONG_INLINE Packet1cd ploaddup<Packet1cd>(const std::complex<double>* from) {
+  return pset1<Packet1cd>(*from);
+}
 
 // FIXME force unaligned store, this is a temporary fix
-template<> EIGEN_STRONG_INLINE void pstore <std::complex<double> >(std::complex<double> *   to, const Packet1cd& from) { EIGEN_DEBUG_ALIGNED_STORE pstore((double*)to, Packet2d(from.v)); }
-template<> EIGEN_STRONG_INLINE void pstoreu<std::complex<double> >(std::complex<double> *   to, const Packet1cd& from) { EIGEN_DEBUG_UNALIGNED_STORE pstoreu((double*)to, Packet2d(from.v)); }
+template <>
+EIGEN_STRONG_INLINE void pstore<std::complex<double> >(std::complex<double>* to, const Packet1cd& from) {
+  EIGEN_DEBUG_ALIGNED_STORE pstore((double*)to, Packet2d(from.v));
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<std::complex<double> >(std::complex<double>* to, const Packet1cd& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE pstoreu((double*)to, Packet2d(from.v));
+}
 
-template<> EIGEN_STRONG_INLINE void prefetch<std::complex<double> >(const std::complex<double> *   addr) { _mm_prefetch((SsePrefetchPtrType)(addr), _MM_HINT_T0); }
+template <>
+EIGEN_STRONG_INLINE void prefetch<std::complex<double> >(const std::complex<double>* addr) {
+  _mm_prefetch((SsePrefetchPtrType)(addr), _MM_HINT_T0);
+}
 
-template<> EIGEN_STRONG_INLINE std::complex<double>  pfirst<Packet1cd>(const Packet1cd& a)
-{
+template <>
+EIGEN_STRONG_INLINE std::complex<double> pfirst<Packet1cd>(const Packet1cd& a) {
   EIGEN_ALIGN16 double res[2];
   _mm_store_pd(res, a.v);
-  return std::complex<double>(res[0],res[1]);
+  return std::complex<double>(res[0], res[1]);
 }
 
-template<> EIGEN_STRONG_INLINE Packet1cd preverse(const Packet1cd& a) { return a; }
+template <>
+EIGEN_STRONG_INLINE Packet1cd preverse(const Packet1cd& a) {
+  return a;
+}
 
-template<> EIGEN_STRONG_INLINE std::complex<double> predux<Packet1cd>(const Packet1cd& a)
-{
+template <>
+EIGEN_STRONG_INLINE std::complex<double> predux<Packet1cd>(const Packet1cd& a) {
   return pfirst(a);
 }
 
-template<> EIGEN_STRONG_INLINE std::complex<double> predux_mul<Packet1cd>(const Packet1cd& a)
-{
+template <>
+EIGEN_STRONG_INLINE std::complex<double> predux_mul<Packet1cd>(const Packet1cd& a) {
   return pfirst(a);
 }
 
-EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet1cd,Packet2d)
+EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet1cd, Packet2d)
 
-template<> EIGEN_STRONG_INLINE Packet1cd pdiv<Packet1cd>(const Packet1cd& a, const Packet1cd& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet1cd pdiv<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
   return pdiv_complex(a, b);
 }
 
-EIGEN_STRONG_INLINE Packet1cd pcplxflip/* <Packet1cd> */(const Packet1cd& x)
-{
+EIGEN_STRONG_INLINE Packet1cd pcplxflip /* <Packet1cd> */ (const Packet1cd& x) {
   return Packet1cd(preverse(Packet2d(x.v)));
 }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet2cf,2>& kernel) {
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet2cf, 2>& kernel) {
   __m128d w1 = _mm_castps_pd(kernel.packet[0].v);
   __m128d w2 = _mm_castps_pd(kernel.packet[1].v);
 
@@ -300,32 +383,36 @@
   kernel.packet[1].v = tmp;
 }
 
-template<> EIGEN_STRONG_INLINE Packet2cf pcmp_eq(const Packet2cf& a, const Packet2cf& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2cf pcmp_eq(const Packet2cf& a, const Packet2cf& b) {
   __m128 eq = _mm_cmpeq_ps(a.v, b.v);
   return Packet2cf(pand<Packet4f>(eq, vec4f_swizzle1(eq, 1, 0, 3, 2)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet1cd pcmp_eq(const Packet1cd& a, const Packet1cd& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet1cd pcmp_eq(const Packet1cd& a, const Packet1cd& b) {
   __m128d eq = _mm_cmpeq_pd(a.v, b.v);
   return Packet1cd(pand<Packet2d>(eq, vec2d_swizzle1(eq, 1, 0)));
 }
 
-template<>  EIGEN_STRONG_INLINE Packet2cf pblend(const Selector<2>& ifPacket, const Packet2cf& thenPacket, const Packet2cf& elsePacket) {
+template <>
+EIGEN_STRONG_INLINE Packet2cf pblend(const Selector<2>& ifPacket, const Packet2cf& thenPacket,
+                                     const Packet2cf& elsePacket) {
   __m128d result = pblend<Packet2d>(ifPacket, _mm_castps_pd(thenPacket.v), _mm_castps_pd(elsePacket.v));
   return Packet2cf(_mm_castpd_ps(result));
 }
 
-template<> EIGEN_STRONG_INLINE Packet1cd psqrt<Packet1cd>(const Packet1cd& a) {
+template <>
+EIGEN_STRONG_INLINE Packet1cd psqrt<Packet1cd>(const Packet1cd& a) {
   return psqrt_complex<Packet1cd>(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2cf psqrt<Packet2cf>(const Packet2cf& a) {
+template <>
+EIGEN_STRONG_INLINE Packet2cf psqrt<Packet2cf>(const Packet2cf& a) {
   return psqrt_complex<Packet2cf>(a);
 }
 
-} // end namespace internal
-} // end namespace Eigen
+}  // end namespace internal
+}  // end namespace Eigen
 
-#endif // EIGEN_COMPLEX_SSE_H
+#endif  // EIGEN_COMPLEX_SSE_H
diff --git a/Eigen/src/Core/arch/SSE/MathFunctions.h b/Eigen/src/Core/arch/SSE/MathFunctions.h
index 0f86bcf..30c1f07 100644
--- a/Eigen/src/Core/arch/SSE/MathFunctions.h
+++ b/Eigen/src/Core/arch/SSE/MathFunctions.h
@@ -29,17 +29,23 @@
 // iteration for square root. In particular, Skylake and Zen2 processors
 // have approximately doubled throughput of the _mm_sqrt_ps instruction
 // compared to their predecessors.
-template<>EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet4f psqrt<Packet4f>(const Packet4f& x) { return _mm_sqrt_ps(x); }
-template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet2d psqrt<Packet2d>(const Packet2d& x) { return _mm_sqrt_pd(x); }
-template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet16b psqrt<Packet16b>(const Packet16b& x) { return x; }
+template <>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet4f psqrt<Packet4f>(const Packet4f& x) {
+  return _mm_sqrt_ps(x);
+}
+template <>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet2d psqrt<Packet2d>(const Packet2d& x) {
+  return _mm_sqrt_pd(x);
+}
+template <>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet16b psqrt<Packet16b>(const Packet16b& x) {
+  return x;
+}
 
 #if EIGEN_FAST_MATH
 // Even on Skylake, using Newton iteration is a win for reciprocal square root.
-template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
-Packet4f prsqrt<Packet4f>(const Packet4f& x) {
+template <>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet4f prsqrt<Packet4f>(const Packet4f& x) {
   return generic_rsqrt_newton_step<Packet4f, /*Steps=*/1>::run(x, _mm_rsqrt_ps(x));
 }
 
@@ -47,28 +53,25 @@
 // Trying to speed up reciprocal using Newton-Raphson is counterproductive
 // unless FMA is available. Without FMA pdiv(pset1<Packet>(Scalar(1),a)) is
 // 30% faster.
-template<> EIGEN_STRONG_INLINE Packet4f preciprocal<Packet4f>(const Packet4f& x) {
+template <>
+EIGEN_STRONG_INLINE Packet4f preciprocal<Packet4f>(const Packet4f& x) {
   return generic_reciprocal_newton_step<Packet4f, /*Steps=*/1>::run(x, _mm_rcp_ps(x));
 }
 #endif
 
 #endif
 
-} // end namespace internal
+}  // end namespace internal
 
 namespace numext {
 
-template<>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-float sqrt(const float &x)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float sqrt(const float& x) {
   return internal::pfirst(internal::Packet4f(_mm_sqrt_ss(_mm_set_ss(x))));
 }
 
-template<>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-double sqrt(const double &x)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double sqrt(const double& x) {
 #if EIGEN_COMP_GNUC_STRICT
   // This works around a GCC bug generating poor code for _mm_sqrt_pd
   // See https://gitlab.com/libeigen/eigen/commit/8dca9f97e38970
@@ -78,8 +81,8 @@
 #endif
 }
 
-} // end namespace numex
+}  // namespace numext
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_MATH_FUNCTIONS_SSE_H
+#endif  // EIGEN_MATH_FUNCTIONS_SSE_H
diff --git a/Eigen/src/Core/arch/SSE/PacketMath.h b/Eigen/src/Core/arch/SSE/PacketMath.h
index 8dd553d..be8183c 100644
--- a/Eigen/src/Core/arch/SSE/PacketMath.h
+++ b/Eigen/src/Core/arch/SSE/PacketMath.h
@@ -25,7 +25,7 @@
 #if !defined(EIGEN_VECTORIZE_AVX) && !defined(EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS)
 // 32 bits =>  8 registers
 // 64 bits => 16 registers
-#define EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS (2*sizeof(void*))
+#define EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS (2 * sizeof(void*))
 #endif
 
 #ifdef EIGEN_VECTORIZE_FMA
@@ -34,16 +34,18 @@
 #endif
 #endif
 
-#if ((defined EIGEN_VECTORIZE_AVX) && (EIGEN_COMP_GNUC_STRICT || EIGEN_COMP_MINGW || EIGEN_COMP_LCC) && (__GXX_ABI_VERSION < 1004)) || EIGEN_OS_QNX
+#if ((defined EIGEN_VECTORIZE_AVX) && (EIGEN_COMP_GNUC_STRICT || EIGEN_COMP_MINGW || EIGEN_COMP_LCC) && \
+     (__GXX_ABI_VERSION < 1004)) ||                                                                     \
+    EIGEN_OS_QNX
 // With GCC's default ABI version, a __m128 or __m256 are the same types and therefore we cannot
 // have overloads for both types without linking error.
 // One solution is to increase ABI version using -fabi-version=4 (or greater).
 // Otherwise, we workaround this inconvenience by wrapping 128bit types into the following helper
 // structure:
-typedef eigen_packet_wrapper<__m128>  Packet4f;
+typedef eigen_packet_wrapper<__m128> Packet4f;
 typedef eigen_packet_wrapper<__m128d> Packet2d;
 #else
-typedef __m128  Packet4f;
+typedef __m128 Packet4f;
 typedef __m128d Packet2d;
 #endif
 
@@ -51,87 +53,90 @@
 typedef eigen_packet_wrapper<__m128i, 1> Packet16b;
 typedef eigen_packet_wrapper<__m128i, 4> Packet4ui;
 
-template<> struct is_arithmetic<__m128>  { enum { value = true }; };
-template<> struct is_arithmetic<__m128i> { enum { value = true }; };
-template<> struct is_arithmetic<__m128d> { enum { value = true }; };
-template<> struct is_arithmetic<Packet4i>  { enum { value = true }; };
+template <>
+struct is_arithmetic<__m128> {
+  enum { value = true };
+};
+template <>
+struct is_arithmetic<__m128i> {
+  enum { value = true };
+};
+template <>
+struct is_arithmetic<__m128d> {
+  enum { value = true };
+};
+template <>
+struct is_arithmetic<Packet4i> {
+  enum { value = true };
+};
 // Note that `Packet4ui` uses the underlying type `__m128i`, which is
 // interpreted as a vector of _signed_ `int32`s, which breaks some arithmetic
 // operations used in `GenericPacketMath.h`.
-template<> struct is_arithmetic<Packet4ui> { enum { value = false }; };
-template<> struct is_arithmetic<Packet16b>  { enum { value = true }; };
+template <>
+struct is_arithmetic<Packet4ui> {
+  enum { value = false };
+};
+template <>
+struct is_arithmetic<Packet16b> {
+  enum { value = true };
+};
 
-template<int p, int q, int r, int s>
-struct shuffle_mask{
- enum { mask = (s)<<6|(r)<<4|(q)<<2|(p) };
+template <int p, int q, int r, int s>
+struct shuffle_mask {
+  enum { mask = (s) << 6 | (r) << 4 | (q) << 2 | (p) };
 };
 
 // TODO: change the implementation of all swizzle* ops from macro to template,
-#define vec4f_swizzle1(v,p,q,r,s) \
-  Packet4f(_mm_castsi128_ps(_mm_shuffle_epi32( _mm_castps_si128(v), (shuffle_mask<p,q,r,s>::mask))))
+#define vec4f_swizzle1(v, p, q, r, s) \
+  Packet4f(_mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(v), (shuffle_mask<p, q, r, s>::mask))))
 
-#define vec4i_swizzle1(v,p,q,r,s) \
-  Packet4i(_mm_shuffle_epi32( v, (shuffle_mask<p,q,r,s>::mask)))
+#define vec4i_swizzle1(v, p, q, r, s) Packet4i(_mm_shuffle_epi32(v, (shuffle_mask<p, q, r, s>::mask)))
 
-#define vec4ui_swizzle1(v, p, q, r, s) \
-  Packet4ui(vec4i_swizzle1(v,p,q,r,s))
+#define vec4ui_swizzle1(v, p, q, r, s) Packet4ui(vec4i_swizzle1(v, p, q, r, s))
 
-#define vec2d_swizzle1(v,p,q) \
-  Packet2d(_mm_castsi128_pd(_mm_shuffle_epi32( _mm_castpd_si128(v), (shuffle_mask<2*p,2*p+1,2*q,2*q+1>::mask))))
+#define vec2d_swizzle1(v, p, q) \
+  Packet2d(_mm_castsi128_pd(    \
+      _mm_shuffle_epi32(_mm_castpd_si128(v), (shuffle_mask<2 * p, 2 * p + 1, 2 * q, 2 * q + 1>::mask))))
 
-#define vec4f_swizzle2(a,b,p,q,r,s) \
-  Packet4f(_mm_shuffle_ps( (a), (b), (shuffle_mask<p,q,r,s>::mask)))
+#define vec4f_swizzle2(a, b, p, q, r, s) Packet4f(_mm_shuffle_ps((a), (b), (shuffle_mask<p, q, r, s>::mask)))
 
-#define vec4i_swizzle2(a,b,p,q,r,s) \
-  Packet4i(_mm_castps_si128( (_mm_shuffle_ps( _mm_castsi128_ps(a), _mm_castsi128_ps(b), (shuffle_mask<p,q,r,s>::mask)))))
+#define vec4i_swizzle2(a, b, p, q, r, s) \
+  Packet4i(                              \
+      _mm_castps_si128((_mm_shuffle_ps(_mm_castsi128_ps(a), _mm_castsi128_ps(b), (shuffle_mask<p, q, r, s>::mask)))))
 
-#define vec4ui_swizzle2(a,b,p,q,r,s) \
-  Packet4i(vec4i_swizzle2(a,b,p,q,r,s))
+#define vec4ui_swizzle2(a, b, p, q, r, s) Packet4i(vec4i_swizzle2(a, b, p, q, r, s))
 
-EIGEN_STRONG_INLINE Packet4f vec4f_movelh(const Packet4f& a, const Packet4f& b)
-{
-  return Packet4f(_mm_movelh_ps(a,b));
+EIGEN_STRONG_INLINE Packet4f vec4f_movelh(const Packet4f& a, const Packet4f& b) {
+  return Packet4f(_mm_movelh_ps(a, b));
 }
-EIGEN_STRONG_INLINE Packet4f vec4f_movehl(const Packet4f& a, const Packet4f& b)
-{
-  return Packet4f(_mm_movehl_ps(a,b));
+EIGEN_STRONG_INLINE Packet4f vec4f_movehl(const Packet4f& a, const Packet4f& b) {
+  return Packet4f(_mm_movehl_ps(a, b));
 }
-EIGEN_STRONG_INLINE Packet4f vec4f_unpacklo(const Packet4f& a, const Packet4f& b)
-{
-  return Packet4f(_mm_unpacklo_ps(a,b));
+EIGEN_STRONG_INLINE Packet4f vec4f_unpacklo(const Packet4f& a, const Packet4f& b) {
+  return Packet4f(_mm_unpacklo_ps(a, b));
 }
-EIGEN_STRONG_INLINE Packet4f vec4f_unpackhi(const Packet4f& a, const Packet4f& b)
-{
-  return Packet4f(_mm_unpackhi_ps(a,b));
+EIGEN_STRONG_INLINE Packet4f vec4f_unpackhi(const Packet4f& a, const Packet4f& b) {
+  return Packet4f(_mm_unpackhi_ps(a, b));
 }
-#define vec4f_duplane(a,p) \
-  vec4f_swizzle2(a,a,p,p,p,p)
+#define vec4f_duplane(a, p) vec4f_swizzle2(a, a, p, p, p, p)
 
-#define vec2d_swizzle2(a,b,mask) \
-  Packet2d(_mm_shuffle_pd(a,b,mask))
+#define vec2d_swizzle2(a, b, mask) Packet2d(_mm_shuffle_pd(a, b, mask))
 
-EIGEN_STRONG_INLINE Packet2d vec2d_unpacklo(const Packet2d& a, const Packet2d& b)
-{
-  return Packet2d(_mm_unpacklo_pd(a,b));
+EIGEN_STRONG_INLINE Packet2d vec2d_unpacklo(const Packet2d& a, const Packet2d& b) {
+  return Packet2d(_mm_unpacklo_pd(a, b));
 }
-EIGEN_STRONG_INLINE Packet2d vec2d_unpackhi(const Packet2d& a, const Packet2d& b)
-{
-  return Packet2d(_mm_unpackhi_pd(a,b));
+EIGEN_STRONG_INLINE Packet2d vec2d_unpackhi(const Packet2d& a, const Packet2d& b) {
+  return Packet2d(_mm_unpackhi_pd(a, b));
 }
-#define vec2d_duplane(a,p) \
-  vec2d_swizzle2(a,a,(p<<1)|p)
+#define vec2d_duplane(a, p) vec2d_swizzle2(a, a, (p << 1) | p)
 
-#define EIGEN_DECLARE_CONST_Packet4f(NAME,X) \
-  const Packet4f p4f_##NAME = pset1<Packet4f>(X)
+#define EIGEN_DECLARE_CONST_Packet4f(NAME, X) const Packet4f p4f_##NAME = pset1<Packet4f>(X)
 
-#define EIGEN_DECLARE_CONST_Packet2d(NAME,X) \
-  const Packet2d p2d_##NAME = pset1<Packet2d>(X)
+#define EIGEN_DECLARE_CONST_Packet2d(NAME, X) const Packet2d p2d_##NAME = pset1<Packet2d>(X)
 
-#define EIGEN_DECLARE_CONST_Packet4f_FROM_INT(NAME,X) \
-  const Packet4f p4f_##NAME = pset1frombits<Packet4f>(X)
+#define EIGEN_DECLARE_CONST_Packet4f_FROM_INT(NAME, X) const Packet4f p4f_##NAME = pset1frombits<Packet4f>(X)
 
-#define EIGEN_DECLARE_CONST_Packet4i(NAME,X) \
-  const Packet4i p4i_##NAME = pset1<Packet4i>(X)
+#define EIGEN_DECLARE_CONST_Packet4i(NAME, X) const Packet4i p4i_##NAME = pset1<Packet4i>(X)
 
 #define EIGEN_DECLARE_CONST_Packet4ui(NAME, X) const Packet4ui p4ui_##NAME = pset1<Packet4ui>(X)
 
@@ -147,7 +152,7 @@
     AlignedOnScalar = 1,
     size = 4,
 
-    HasCmp  = 1,
+    HasCmp = 1,
     HasDiv = 1,
     HasReciprocal = EIGEN_FAST_MATH,
     HasSin = EIGEN_FAST_MATH,
@@ -173,7 +178,7 @@
     HasRound = 1,
 #endif
     HasRint = 1,
-    HasSign = 0   // The manually vectorized version is slightly slower for SSE.
+    HasSign = 0  // The manually vectorized version is slightly slower for SSE.
   };
 };
 template <>
@@ -183,12 +188,12 @@
   enum {
     Vectorizable = 1,
     AlignedOnScalar = 1,
-    size=2,
+    size = 2,
 
-    HasCmp  = 1,
-    HasDiv  = 1,
-    HasLog  = 1,
-    HasExp  = 1,
+    HasCmp = 1,
+    HasDiv = 1,
+    HasLog = 1,
+    HasExp = 1,
     HasSqrt = 1,
     HasRsqrt = 1,
     HasATan = 1,
@@ -201,23 +206,23 @@
     HasRint = 1
   };
 };
-template<> struct packet_traits<int>    : default_packet_traits
-{
+template <>
+struct packet_traits<int> : default_packet_traits {
   typedef Packet4i type;
   typedef Packet4i half;
   enum {
     Vectorizable = 1,
     AlignedOnScalar = 1,
     HasCmp = 1,
-    HasDiv=1,
-    size=4,
+    HasDiv = 1,
+    size = 4,
 
     HasShift = 1,
     HasBlend = 1
   };
 };
-template<> struct packet_traits<uint32_t> : default_packet_traits
-{
+template <>
+struct packet_traits<uint32_t> : default_packet_traits {
   typedef Packet4ui type;
   typedef Packet4ui half;
   enum {
@@ -236,81 +241,167 @@
   };
 };
 #endif
-template<> struct packet_traits<bool> : default_packet_traits
-{
+template <>
+struct packet_traits<bool> : default_packet_traits {
   typedef Packet16b type;
   typedef Packet16b half;
   enum {
     Vectorizable = 1,
     AlignedOnScalar = 1,
-    size=16,
+    size = 16,
 
-    HasAdd       = 1,
-    HasSub       = 1,
-    HasCmp       = 1, // note -- only pcmp_eq is defined
-    HasShift     = 0,
-    HasMul       = 1,
-    HasNegate    = 1,
-    HasAbs       = 0,
-    HasAbs2      = 0,
-    HasMin       = 0,
-    HasMax       = 0,
-    HasConj      = 0,
-    HasSqrt      = 1,
-    HasSign      = 0   // Don't try to vectorize psign<bool> = identity.
+    HasAdd = 1,
+    HasSub = 1,
+    HasCmp = 1,  // note -- only pcmp_eq is defined
+    HasShift = 0,
+    HasMul = 1,
+    HasNegate = 1,
+    HasAbs = 0,
+    HasAbs2 = 0,
+    HasMin = 0,
+    HasMax = 0,
+    HasConj = 0,
+    HasSqrt = 1,
+    HasSign = 0  // Don't try to vectorize psign<bool> = identity.
   };
 };
 
-template<> struct unpacket_traits<Packet4f> {
-  typedef float     type;
-  typedef Packet4f  half;
-  typedef Packet4i  integer_packet;
-  enum {size=4, alignment=Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false};
+template <>
+struct unpacket_traits<Packet4f> {
+  typedef float type;
+  typedef Packet4f half;
+  typedef Packet4i integer_packet;
+  enum {
+    size = 4,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
 };
-template<> struct unpacket_traits<Packet2d> {
-  typedef double    type;
-  typedef Packet2d  half;
-  enum {size=2, alignment=Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false};
+template <>
+struct unpacket_traits<Packet2d> {
+  typedef double type;
+  typedef Packet2d half;
+  enum {
+    size = 2,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
 };
-template<> struct unpacket_traits<Packet4i> {
-  typedef int       type;
-  typedef Packet4i  half;
-  enum {size=4, alignment=Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false};
+template <>
+struct unpacket_traits<Packet4i> {
+  typedef int type;
+  typedef Packet4i half;
+  enum {
+    size = 4,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
 };
-template<> struct unpacket_traits<Packet4ui> {
+template <>
+struct unpacket_traits<Packet4ui> {
   typedef uint32_t type;
   typedef Packet4ui half;
-  enum {size = 4, alignment = Aligned16, vectorizable = true, masked_load_available = false, masked_store_available = false};
+  enum {
+    size = 4,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
 };
-template<> struct unpacket_traits<Packet16b> {
-  typedef bool       type;
-  typedef Packet16b  half;
-  enum {size=16, alignment=Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false};
+template <>
+struct unpacket_traits<Packet16b> {
+  typedef bool type;
+  typedef Packet16b half;
+  enum {
+    size = 16,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
 };
 
 #ifndef EIGEN_VECTORIZE_AVX
-template<> struct scalar_div_cost<float,true> { enum { value = 7 }; };
-template<> struct scalar_div_cost<double,true> { enum { value = 8 }; };
+template <>
+struct scalar_div_cost<float, true> {
+  enum { value = 7 };
+};
+template <>
+struct scalar_div_cost<double, true> {
+  enum { value = 8 };
+};
 #endif
 
-template<> EIGEN_STRONG_INLINE Packet4f pset1<Packet4f>(const float&  from) { return _mm_set_ps1(from); }
-template<> EIGEN_STRONG_INLINE Packet2d pset1<Packet2d>(const double& from) { return _mm_set1_pd(from); }
-template<> EIGEN_STRONG_INLINE Packet4i pset1<Packet4i>(const int&    from) { return _mm_set1_epi32(from); }
-template<> EIGEN_STRONG_INLINE Packet4ui pset1<Packet4ui>(const uint32_t& from) { return _mm_set1_epi32(numext::bit_cast<int32_t>(from)); }
-template<> EIGEN_STRONG_INLINE Packet16b pset1<Packet16b>(const bool&    from) { return _mm_set1_epi8(static_cast<char>(from)); }
+template <>
+EIGEN_STRONG_INLINE Packet4f pset1<Packet4f>(const float& from) {
+  return _mm_set_ps1(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pset1<Packet2d>(const double& from) {
+  return _mm_set1_pd(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pset1<Packet4i>(const int& from) {
+  return _mm_set1_epi32(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui pset1<Packet4ui>(const uint32_t& from) {
+  return _mm_set1_epi32(numext::bit_cast<int32_t>(from));
+}
+template <>
+EIGEN_STRONG_INLINE Packet16b pset1<Packet16b>(const bool& from) {
+  return _mm_set1_epi8(static_cast<char>(from));
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f pset1frombits<Packet4f>(unsigned int from) { return _mm_castsi128_ps(pset1<Packet4i>(from)); }
-template<> EIGEN_STRONG_INLINE Packet2d pset1frombits<Packet2d>(uint64_t from) { return _mm_castsi128_pd(_mm_set1_epi64x(from)); }
+template <>
+EIGEN_STRONG_INLINE Packet4f pset1frombits<Packet4f>(unsigned int from) {
+  return _mm_castsi128_ps(pset1<Packet4i>(from));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pset1frombits<Packet2d>(uint64_t from) {
+  return _mm_castsi128_pd(_mm_set1_epi64x(from));
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f peven_mask(const Packet4f& /*a*/) { return _mm_castsi128_ps(_mm_set_epi32(0, -1, 0, -1)); }
-template<> EIGEN_STRONG_INLINE Packet4i peven_mask(const Packet4i& /*a*/) { return _mm_set_epi32(0, -1, 0, -1); }
-template<> EIGEN_STRONG_INLINE Packet4ui peven_mask(const Packet4ui& /*a*/) { return _mm_set_epi32(0, -1, 0, -1); }
-template<> EIGEN_STRONG_INLINE Packet2d peven_mask(const Packet2d& /*a*/) { return _mm_castsi128_pd(_mm_set_epi32(0, 0, -1, -1)); }
+template <>
+EIGEN_STRONG_INLINE Packet4f peven_mask(const Packet4f& /*a*/) {
+  return _mm_castsi128_ps(_mm_set_epi32(0, -1, 0, -1));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i peven_mask(const Packet4i& /*a*/) {
+  return _mm_set_epi32(0, -1, 0, -1);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui peven_mask(const Packet4ui& /*a*/) {
+  return _mm_set_epi32(0, -1, 0, -1);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d peven_mask(const Packet2d& /*a*/) {
+  return _mm_castsi128_pd(_mm_set_epi32(0, 0, -1, -1));
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f pzero(const Packet4f& /*a*/) { return _mm_setzero_ps(); }
-template<> EIGEN_STRONG_INLINE Packet2d pzero(const Packet2d& /*a*/) { return _mm_setzero_pd(); }
-template<> EIGEN_STRONG_INLINE Packet4i pzero(const Packet4i& /*a*/) { return _mm_setzero_si128(); }
-template<> EIGEN_STRONG_INLINE Packet4ui pzero(const Packet4ui& /*a*/) { return _mm_setzero_si128(); }
+template <>
+EIGEN_STRONG_INLINE Packet4f pzero(const Packet4f& /*a*/) {
+  return _mm_setzero_ps();
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pzero(const Packet2d& /*a*/) {
+  return _mm_setzero_pd();
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pzero(const Packet4i& /*a*/) {
+  return _mm_setzero_si128();
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui pzero(const Packet4ui& /*a*/) {
+  return _mm_setzero_si128();
+}
 
 // GCC generates a shufps instruction for _mm_set1_ps/_mm_load1_ps instead of the more efficient pshufd instruction.
 // However, using inrinsics for pset1 makes gcc to generate crappy code in some cases (see bug 203)
@@ -318,242 +409,455 @@
 // Therefore, we introduced the pload1 functions to be used in product kernels for which bug 203 does not apply.
 // Also note that with AVX, we want it to generate a vbroadcastss.
 #if EIGEN_COMP_GNUC_STRICT && (!defined __AVX__)
-template<> EIGEN_STRONG_INLINE Packet4f pload1<Packet4f>(const float *from) {
-  return vec4f_swizzle1(_mm_load_ss(from),0,0,0,0);
+template <>
+EIGEN_STRONG_INLINE Packet4f pload1<Packet4f>(const float* from) {
+  return vec4f_swizzle1(_mm_load_ss(from), 0, 0, 0, 0);
 }
 #endif
 
-template<> EIGEN_STRONG_INLINE Packet4f plset<Packet4f>(const float& a) { return _mm_add_ps(pset1<Packet4f>(a), _mm_set_ps(3,2,1,0)); }
-template<> EIGEN_STRONG_INLINE Packet2d plset<Packet2d>(const double& a) { return _mm_add_pd(pset1<Packet2d>(a),_mm_set_pd(1,0)); }
-template<> EIGEN_STRONG_INLINE Packet4i plset<Packet4i>(const int& a) { return _mm_add_epi32(pset1<Packet4i>(a),_mm_set_epi32(3,2,1,0)); }
-template<> EIGEN_STRONG_INLINE Packet4ui plset<Packet4ui>(const uint32_t& a) { return _mm_add_epi32(pset1<Packet4ui>(a), _mm_set_epi32(3, 2, 1, 0)); }
+template <>
+EIGEN_STRONG_INLINE Packet4f plset<Packet4f>(const float& a) {
+  return _mm_add_ps(pset1<Packet4f>(a), _mm_set_ps(3, 2, 1, 0));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d plset<Packet2d>(const double& a) {
+  return _mm_add_pd(pset1<Packet2d>(a), _mm_set_pd(1, 0));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i plset<Packet4i>(const int& a) {
+  return _mm_add_epi32(pset1<Packet4i>(a), _mm_set_epi32(3, 2, 1, 0));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui plset<Packet4ui>(const uint32_t& a) {
+  return _mm_add_epi32(pset1<Packet4ui>(a), _mm_set_epi32(3, 2, 1, 0));
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f padd<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_add_ps(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2d padd<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_add_pd(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4i padd<Packet4i>(const Packet4i& a, const Packet4i& b) { return _mm_add_epi32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4ui padd<Packet4ui>(const Packet4ui& a, const Packet4ui& b) { return _mm_add_epi32(a, b); }
+template <>
+EIGEN_STRONG_INLINE Packet4f padd<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return _mm_add_ps(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d padd<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return _mm_add_pd(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i padd<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return _mm_add_epi32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui padd<Packet4ui>(const Packet4ui& a, const Packet4ui& b) {
+  return _mm_add_epi32(a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet16b padd<Packet16b>(const Packet16b& a, const Packet16b& b) { return _mm_or_si128(a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet16b padd<Packet16b>(const Packet16b& a, const Packet16b& b) {
+  return _mm_or_si128(a, b);
+}
 
-template<typename Packet> EIGEN_STRONG_INLINE Packet padds(const Packet& a, const Packet& b);
-template<> EIGEN_STRONG_INLINE Packet4f padds<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_add_ss(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2d padds<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_add_sd(a,b); }
+template <typename Packet>
+EIGEN_STRONG_INLINE Packet padds(const Packet& a, const Packet& b);
+template <>
+EIGEN_STRONG_INLINE Packet4f padds<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return _mm_add_ss(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d padds<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return _mm_add_sd(a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f psub<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_sub_ps(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2d psub<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_sub_pd(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4i psub<Packet4i>(const Packet4i& a, const Packet4i& b) { return _mm_sub_epi32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4ui psub<Packet4ui>(const Packet4ui& a, const Packet4ui& b) { return _mm_sub_epi32(a, b); }
-template<> EIGEN_STRONG_INLINE Packet16b psub<Packet16b>(const Packet16b& a, const Packet16b& b) { return _mm_xor_si128(a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet4f psub<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return _mm_sub_ps(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d psub<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return _mm_sub_pd(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i psub<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return _mm_sub_epi32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui psub<Packet4ui>(const Packet4ui& a, const Packet4ui& b) {
+  return _mm_sub_epi32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16b psub<Packet16b>(const Packet16b& a, const Packet16b& b) {
+  return _mm_xor_si128(a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f pxor<Packet4f>(const Packet4f& a, const Packet4f& b);
-template<> EIGEN_STRONG_INLINE Packet4f paddsub<Packet4f>(const Packet4f& a, const Packet4f& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f pxor<Packet4f>(const Packet4f& a, const Packet4f& b);
+template <>
+EIGEN_STRONG_INLINE Packet4f paddsub<Packet4f>(const Packet4f& a, const Packet4f& b) {
 #ifdef EIGEN_VECTORIZE_SSE3
-  return _mm_addsub_ps(a,b);
+  return _mm_addsub_ps(a, b);
 #else
-  const Packet4f mask = _mm_castsi128_ps(_mm_setr_epi32(0x80000000,0x0,0x80000000,0x0));
+  const Packet4f mask = _mm_castsi128_ps(_mm_setr_epi32(0x80000000, 0x0, 0x80000000, 0x0));
   return padd(a, pxor(mask, b));
 #endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet2d pxor<Packet2d>(const Packet2d& , const Packet2d& );
-template<> EIGEN_STRONG_INLINE Packet2d paddsub<Packet2d>(const Packet2d& a, const Packet2d& b) 
-{
+template <>
+EIGEN_STRONG_INLINE Packet2d pxor<Packet2d>(const Packet2d&, const Packet2d&);
+template <>
+EIGEN_STRONG_INLINE Packet2d paddsub<Packet2d>(const Packet2d& a, const Packet2d& b) {
 #ifdef EIGEN_VECTORIZE_SSE3
-  return _mm_addsub_pd(a,b); 
+  return _mm_addsub_pd(a, b);
 #else
-  const Packet2d mask = _mm_castsi128_pd(_mm_setr_epi32(0x0,0x80000000,0x0,0x0)); 
+  const Packet2d mask = _mm_castsi128_pd(_mm_setr_epi32(0x0, 0x80000000, 0x0, 0x0));
   return padd(a, pxor(mask, b));
 #endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pnegate(const Packet4f& a)
-{
-  const Packet4f mask = _mm_castsi128_ps(_mm_setr_epi32(0x80000000,0x80000000,0x80000000,0x80000000));
-  return _mm_xor_ps(a,mask);
+template <>
+EIGEN_STRONG_INLINE Packet4f pnegate(const Packet4f& a) {
+  const Packet4f mask = _mm_castsi128_ps(_mm_setr_epi32(0x80000000, 0x80000000, 0x80000000, 0x80000000));
+  return _mm_xor_ps(a, mask);
 }
-template<> EIGEN_STRONG_INLINE Packet2d pnegate(const Packet2d& a)
-{
-  const Packet2d mask = _mm_castsi128_pd(_mm_setr_epi32(0x0,0x80000000,0x0,0x80000000));
-  return _mm_xor_pd(a,mask);
+template <>
+EIGEN_STRONG_INLINE Packet2d pnegate(const Packet2d& a) {
+  const Packet2d mask = _mm_castsi128_pd(_mm_setr_epi32(0x0, 0x80000000, 0x0, 0x80000000));
+  return _mm_xor_pd(a, mask);
 }
-template<> EIGEN_STRONG_INLINE Packet4i pnegate(const Packet4i& a)
-{
-  return psub(Packet4i(_mm_setr_epi32(0,0,0,0)), a);
+template <>
+EIGEN_STRONG_INLINE Packet4i pnegate(const Packet4i& a) {
+  return psub(Packet4i(_mm_setr_epi32(0, 0, 0, 0)), a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet16b pnegate(const Packet16b& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet16b pnegate(const Packet16b& a) {
   return psub(pset1<Packet16b>(false), a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pconj(const Packet4f& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet2d pconj(const Packet2d& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet4i pconj(const Packet4i& a) { return a; }
+template <>
+EIGEN_STRONG_INLINE Packet4f pconj(const Packet4f& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pconj(const Packet2d& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pconj(const Packet4i& a) {
+  return a;
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f pmul<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_mul_ps(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2d pmul<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_mul_pd(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4i pmul<Packet4i>(const Packet4i& a, const Packet4i& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f pmul<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return _mm_mul_ps(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pmul<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return _mm_mul_pd(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pmul<Packet4i>(const Packet4i& a, const Packet4i& b) {
 #ifdef EIGEN_VECTORIZE_SSE4_1
-  return _mm_mullo_epi32(a,b);
+  return _mm_mullo_epi32(a, b);
 #else
   // this version is slightly faster than 4 scalar products
   return vec4i_swizzle1(
-            vec4i_swizzle2(
-              _mm_mul_epu32(a,b),
-              _mm_mul_epu32(vec4i_swizzle1(a,1,0,3,2),
-                            vec4i_swizzle1(b,1,0,3,2)),
-              0,2,0,2),
-            0,2,1,3);
+      vec4i_swizzle2(_mm_mul_epu32(a, b), _mm_mul_epu32(vec4i_swizzle1(a, 1, 0, 3, 2), vec4i_swizzle1(b, 1, 0, 3, 2)),
+                     0, 2, 0, 2),
+      0, 2, 1, 3);
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet4ui pmul<Packet4ui>(const Packet4ui& a, const Packet4ui& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4ui pmul<Packet4ui>(const Packet4ui& a, const Packet4ui& b) {
 #ifdef EIGEN_VECTORIZE_SSE4_1
-  return _mm_mullo_epi32(a,b);
+  return _mm_mullo_epi32(a, b);
 #else
   // this version is slightly faster than 4 scalar products
   return vec4ui_swizzle1(
-            vec4ui_swizzle2(
-              _mm_mul_epu32(a,b),
-              _mm_mul_epu32(vec4ui_swizzle1(a,1,0,3,2),
-                            vec4ui_swizzle1(b,1,0,3,2)),
-              0,2,0,2),
-            0,2,1,3);
+      vec4ui_swizzle2(_mm_mul_epu32(a, b),
+                      _mm_mul_epu32(vec4ui_swizzle1(a, 1, 0, 3, 2), vec4ui_swizzle1(b, 1, 0, 3, 2)), 0, 2, 0, 2),
+      0, 2, 1, 3);
 #endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet16b pmul<Packet16b>(const Packet16b& a, const Packet16b& b) { return _mm_and_si128(a,b); }
-
-template<> EIGEN_STRONG_INLINE Packet4f pdiv<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_div_ps(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2d pdiv<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_div_pd(a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet16b pmul<Packet16b>(const Packet16b& a, const Packet16b& b) {
+  return _mm_and_si128(a, b);
+}
 
 template <>
-EIGEN_STRONG_INLINE Packet4i pdiv<Packet4i>(const Packet4i& a,
-                                            const Packet4i& b) {
+EIGEN_STRONG_INLINE Packet4f pdiv<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return _mm_div_ps(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pdiv<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return _mm_div_pd(a, b);
+}
+
+template <>
+EIGEN_STRONG_INLINE Packet4i pdiv<Packet4i>(const Packet4i& a, const Packet4i& b) {
 #ifdef EIGEN_VECTORIZE_AVX
-  return _mm256_cvttpd_epi32(
-      _mm256_div_pd(_mm256_cvtepi32_pd(a), _mm256_cvtepi32_pd(b)));
+  return _mm256_cvttpd_epi32(_mm256_div_pd(_mm256_cvtepi32_pd(a), _mm256_cvtepi32_pd(b)));
 #else
   __m128i q_lo = _mm_cvttpd_epi32(_mm_div_pd(_mm_cvtepi32_pd(a), _mm_cvtepi32_pd(b)));
-  __m128i q_hi =
-      _mm_cvttpd_epi32(_mm_div_pd(_mm_cvtepi32_pd(vec4i_swizzle1(a, 2, 3, 0, 1)),
-                                 _mm_cvtepi32_pd(vec4i_swizzle1(b, 2, 3, 0, 1))));
+  __m128i q_hi = _mm_cvttpd_epi32(
+      _mm_div_pd(_mm_cvtepi32_pd(vec4i_swizzle1(a, 2, 3, 0, 1)), _mm_cvtepi32_pd(vec4i_swizzle1(b, 2, 3, 0, 1))));
   return vec4i_swizzle1(_mm_unpacklo_epi32(q_lo, q_hi), 0, 2, 1, 3);
 #endif
 }
 
-
 // for some weird raisons, it has to be overloaded for packet of integers
-template<> EIGEN_STRONG_INLINE Packet4i pmadd(const Packet4i& a, const Packet4i& b, const Packet4i& c) { return padd(pmul(a,b), c); }
-template<> EIGEN_STRONG_INLINE Packet4ui pmadd(const Packet4ui& a, const Packet4ui& b, const Packet4ui& c) { return padd(pmul(a, b), c); }
+template <>
+EIGEN_STRONG_INLINE Packet4i pmadd(const Packet4i& a, const Packet4i& b, const Packet4i& c) {
+  return padd(pmul(a, b), c);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui pmadd(const Packet4ui& a, const Packet4ui& b, const Packet4ui& c) {
+  return padd(pmul(a, b), c);
+}
 #ifdef EIGEN_VECTORIZE_FMA
-template<> EIGEN_STRONG_INLINE Packet4f pmadd(const Packet4f& a, const Packet4f& b, const Packet4f& c) { return _mm_fmadd_ps(a,b,c); }
-template<> EIGEN_STRONG_INLINE Packet2d pmadd(const Packet2d& a, const Packet2d& b, const Packet2d& c) { return _mm_fmadd_pd(a,b,c); }
-template<> EIGEN_STRONG_INLINE Packet4f pmsub(const Packet4f& a, const Packet4f& b, const Packet4f& c) { return _mm_fmsub_ps(a,b,c); }
-template<> EIGEN_STRONG_INLINE Packet2d pmsub(const Packet2d& a, const Packet2d& b, const Packet2d& c) { return _mm_fmsub_pd(a,b,c); }
-template<> EIGEN_STRONG_INLINE Packet4f pnmadd(const Packet4f& a, const Packet4f& b, const Packet4f& c) { return _mm_fnmadd_ps(a,b,c); }
-template<> EIGEN_STRONG_INLINE Packet2d pnmadd(const Packet2d& a, const Packet2d& b, const Packet2d& c) { return _mm_fnmadd_pd(a,b,c); }
-template<> EIGEN_STRONG_INLINE Packet4f pnmsub(const Packet4f& a, const Packet4f& b, const Packet4f& c) { return _mm_fnmsub_ps(a,b,c); }
-template<> EIGEN_STRONG_INLINE Packet2d pnmsub(const Packet2d& a, const Packet2d& b, const Packet2d& c) { return _mm_fnmsub_pd(a,b,c); }
+template <>
+EIGEN_STRONG_INLINE Packet4f pmadd(const Packet4f& a, const Packet4f& b, const Packet4f& c) {
+  return _mm_fmadd_ps(a, b, c);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pmadd(const Packet2d& a, const Packet2d& b, const Packet2d& c) {
+  return _mm_fmadd_pd(a, b, c);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pmsub(const Packet4f& a, const Packet4f& b, const Packet4f& c) {
+  return _mm_fmsub_ps(a, b, c);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pmsub(const Packet2d& a, const Packet2d& b, const Packet2d& c) {
+  return _mm_fmsub_pd(a, b, c);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pnmadd(const Packet4f& a, const Packet4f& b, const Packet4f& c) {
+  return _mm_fnmadd_ps(a, b, c);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pnmadd(const Packet2d& a, const Packet2d& b, const Packet2d& c) {
+  return _mm_fnmadd_pd(a, b, c);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pnmsub(const Packet4f& a, const Packet4f& b, const Packet4f& c) {
+  return _mm_fnmsub_ps(a, b, c);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pnmsub(const Packet2d& a, const Packet2d& b, const Packet2d& c) {
+  return _mm_fnmsub_pd(a, b, c);
+}
 
-template<typename Packet> EIGEN_STRONG_INLINE Packet pmadds(const Packet& a, const Packet& b, const Packet& c);
-template<> EIGEN_STRONG_INLINE Packet4f pmadds<Packet4f>(const Packet4f& a, const Packet4f& b, const Packet4f& c) { return _mm_fmadd_ss(a,b,c); }
-template<> EIGEN_STRONG_INLINE Packet2d pmadds<Packet2d>(const Packet2d& a, const Packet2d& b, const Packet2d& c) { return _mm_fmadd_sd(a,b,c); }
+template <typename Packet>
+EIGEN_STRONG_INLINE Packet pmadds(const Packet& a, const Packet& b, const Packet& c);
+template <>
+EIGEN_STRONG_INLINE Packet4f pmadds<Packet4f>(const Packet4f& a, const Packet4f& b, const Packet4f& c) {
+  return _mm_fmadd_ss(a, b, c);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pmadds<Packet2d>(const Packet2d& a, const Packet2d& b, const Packet2d& c) {
+  return _mm_fmadd_sd(a, b, c);
+}
 #endif
 
 #ifdef EIGEN_VECTORIZE_SSE4_1
-template<> EIGEN_DEVICE_FUNC inline Packet4f pselect(const Packet4f& mask, const Packet4f& a, const Packet4f& b) {
-  return _mm_blendv_ps(b,a,mask);
+template <>
+EIGEN_DEVICE_FUNC inline Packet4f pselect(const Packet4f& mask, const Packet4f& a, const Packet4f& b) {
+  return _mm_blendv_ps(b, a, mask);
 }
 
-template<> EIGEN_DEVICE_FUNC inline Packet4i pselect(const Packet4i& mask, const Packet4i& a, const Packet4i& b) {
-  return _mm_castps_si128(_mm_blendv_ps(_mm_castsi128_ps(b),_mm_castsi128_ps(a),_mm_castsi128_ps(mask)));
+template <>
+EIGEN_DEVICE_FUNC inline Packet4i pselect(const Packet4i& mask, const Packet4i& a, const Packet4i& b) {
+  return _mm_castps_si128(_mm_blendv_ps(_mm_castsi128_ps(b), _mm_castsi128_ps(a), _mm_castsi128_ps(mask)));
 }
 
-template<> EIGEN_DEVICE_FUNC inline Packet4ui pselect(const Packet4ui& mask, const Packet4ui& a, const Packet4ui& b) {
-  return _mm_castps_si128(_mm_blendv_ps(_mm_castsi128_ps(b),_mm_castsi128_ps(a),_mm_castsi128_ps(mask)));
+template <>
+EIGEN_DEVICE_FUNC inline Packet4ui pselect(const Packet4ui& mask, const Packet4ui& a, const Packet4ui& b) {
+  return _mm_castps_si128(_mm_blendv_ps(_mm_castsi128_ps(b), _mm_castsi128_ps(a), _mm_castsi128_ps(mask)));
 }
 
-template<> EIGEN_DEVICE_FUNC inline Packet2d pselect(const Packet2d& mask, const Packet2d& a, const Packet2d& b) {  return _mm_blendv_pd(b,a,mask); }
+template <>
+EIGEN_DEVICE_FUNC inline Packet2d pselect(const Packet2d& mask, const Packet2d& a, const Packet2d& b) {
+  return _mm_blendv_pd(b, a, mask);
+}
 
-template<> EIGEN_DEVICE_FUNC inline Packet16b pselect(const Packet16b& mask, const Packet16b& a, const Packet16b& b) {
-  return _mm_blendv_epi8(b,a,mask);
+template <>
+EIGEN_DEVICE_FUNC inline Packet16b pselect(const Packet16b& mask, const Packet16b& a, const Packet16b& b) {
+  return _mm_blendv_epi8(b, a, mask);
 }
 #else
-template<> EIGEN_DEVICE_FUNC inline Packet16b pselect(const Packet16b& mask, const Packet16b& a, const Packet16b& b) {
+template <>
+EIGEN_DEVICE_FUNC inline Packet16b pselect(const Packet16b& mask, const Packet16b& a, const Packet16b& b) {
   Packet16b a_part = _mm_and_si128(mask, a);
   Packet16b b_part = _mm_andnot_si128(mask, b);
   return _mm_or_si128(a_part, b_part);
 }
 #endif
 
-template<> EIGEN_STRONG_INLINE Packet4i ptrue<Packet4i>(const Packet4i& a) { return _mm_cmpeq_epi32(a, a); }
-template<> EIGEN_STRONG_INLINE Packet16b ptrue<Packet16b>(const Packet16b& a) { return _mm_cmpeq_epi8(a, a); }
-template<> EIGEN_STRONG_INLINE Packet4f
-ptrue<Packet4f>(const Packet4f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4i ptrue<Packet4i>(const Packet4i& a) {
+  return _mm_cmpeq_epi32(a, a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16b ptrue<Packet16b>(const Packet16b& a) {
+  return _mm_cmpeq_epi8(a, a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f ptrue<Packet4f>(const Packet4f& a) {
   Packet4i b = _mm_castps_si128(a);
   return _mm_castsi128_ps(_mm_cmpeq_epi32(b, b));
 }
-template<> EIGEN_STRONG_INLINE Packet2d
-ptrue<Packet2d>(const Packet2d& a) {
+template <>
+EIGEN_STRONG_INLINE Packet2d ptrue<Packet2d>(const Packet2d& a) {
   Packet4i b = _mm_castpd_si128(a);
   return _mm_castsi128_pd(_mm_cmpeq_epi32(b, b));
 }
 
+template <>
+EIGEN_STRONG_INLINE Packet4f pand<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return _mm_and_ps(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pand<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return _mm_and_pd(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pand<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return _mm_and_si128(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui pand<Packet4ui>(const Packet4ui& a, const Packet4ui& b) {
+  return _mm_and_si128(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16b pand<Packet16b>(const Packet16b& a, const Packet16b& b) {
+  return _mm_and_si128(a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f pand<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_and_ps(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2d pand<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_and_pd(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4i pand<Packet4i>(const Packet4i& a, const Packet4i& b) { return _mm_and_si128(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4ui pand<Packet4ui>(const Packet4ui& a, const Packet4ui& b) { return _mm_and_si128(a, b); }
-template<> EIGEN_STRONG_INLINE Packet16b pand<Packet16b>(const Packet16b& a, const Packet16b& b) { return _mm_and_si128(a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet4f por<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return _mm_or_ps(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d por<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return _mm_or_pd(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i por<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return _mm_or_si128(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui por<Packet4ui>(const Packet4ui& a, const Packet4ui& b) {
+  return _mm_or_si128(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16b por<Packet16b>(const Packet16b& a, const Packet16b& b) {
+  return _mm_or_si128(a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f por<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_or_ps(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2d por<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_or_pd(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4i por<Packet4i>(const Packet4i& a, const Packet4i& b) { return _mm_or_si128(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4ui por<Packet4ui>(const Packet4ui& a, const Packet4ui& b) { return _mm_or_si128(a, b); }
-template<> EIGEN_STRONG_INLINE Packet16b por<Packet16b>(const Packet16b& a, const Packet16b& b) { return _mm_or_si128(a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet4f pxor<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return _mm_xor_ps(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pxor<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return _mm_xor_pd(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pxor<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return _mm_xor_si128(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui pxor<Packet4ui>(const Packet4ui& a, const Packet4ui& b) {
+  return _mm_xor_si128(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16b pxor<Packet16b>(const Packet16b& a, const Packet16b& b) {
+  return _mm_xor_si128(a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f pxor<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_xor_ps(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2d pxor<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_xor_pd(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4i pxor<Packet4i>(const Packet4i& a, const Packet4i& b) { return _mm_xor_si128(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4ui pxor<Packet4ui>(const Packet4ui& a, const Packet4ui& b) { return _mm_xor_si128(a, b); }
-template<> EIGEN_STRONG_INLINE Packet16b pxor<Packet16b>(const Packet16b& a, const Packet16b& b) { return _mm_xor_si128(a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet4f pandnot<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return _mm_andnot_ps(b, a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pandnot<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return _mm_andnot_pd(b, a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pandnot<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return _mm_andnot_si128(b, a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui pandnot<Packet4ui>(const Packet4ui& a, const Packet4ui& b) {
+  return _mm_andnot_si128(b, a);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f pandnot<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_andnot_ps(b,a); }
-template<> EIGEN_STRONG_INLINE Packet2d pandnot<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_andnot_pd(b,a); }
-template<> EIGEN_STRONG_INLINE Packet4i pandnot<Packet4i>(const Packet4i& a, const Packet4i& b) { return _mm_andnot_si128(b,a); }
-template<> EIGEN_STRONG_INLINE Packet4ui pandnot<Packet4ui>(const Packet4ui& a, const Packet4ui& b) { return _mm_andnot_si128(b, a); }
+template <>
+EIGEN_STRONG_INLINE Packet4f pcmp_le(const Packet4f& a, const Packet4f& b) {
+  return _mm_cmple_ps(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pcmp_lt(const Packet4f& a, const Packet4f& b) {
+  return _mm_cmplt_ps(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pcmp_lt_or_nan(const Packet4f& a, const Packet4f& b) {
+  return _mm_cmpnge_ps(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pcmp_eq(const Packet4f& a, const Packet4f& b) {
+  return _mm_cmpeq_ps(a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f pcmp_le(const Packet4f& a, const Packet4f& b) { return _mm_cmple_ps(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4f pcmp_lt(const Packet4f& a, const Packet4f& b) { return _mm_cmplt_ps(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4f pcmp_lt_or_nan(const Packet4f& a, const Packet4f& b) { return _mm_cmpnge_ps(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4f pcmp_eq(const Packet4f& a, const Packet4f& b) { return _mm_cmpeq_ps(a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet2d pcmp_le(const Packet2d& a, const Packet2d& b) {
+  return _mm_cmple_pd(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pcmp_lt(const Packet2d& a, const Packet2d& b) {
+  return _mm_cmplt_pd(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pcmp_lt_or_nan(const Packet2d& a, const Packet2d& b) {
+  return _mm_cmpnge_pd(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pcmp_eq(const Packet2d& a, const Packet2d& b) {
+  return _mm_cmpeq_pd(a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d pcmp_le(const Packet2d& a, const Packet2d& b) { return _mm_cmple_pd(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2d pcmp_lt(const Packet2d& a, const Packet2d& b) { return _mm_cmplt_pd(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2d pcmp_lt_or_nan(const Packet2d& a, const Packet2d& b) { return _mm_cmpnge_pd(a,b); }
-template<> EIGEN_STRONG_INLINE Packet2d pcmp_eq(const Packet2d& a, const Packet2d& b) { return _mm_cmpeq_pd(a,b); }
+template <>
+EIGEN_STRONG_INLINE Packet4i pcmp_lt(const Packet4i& a, const Packet4i& b) {
+  return _mm_cmplt_epi32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pcmp_eq(const Packet4i& a, const Packet4i& b) {
+  return _mm_cmpeq_epi32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui pcmp_eq(const Packet4ui& a, const Packet4ui& b) {
+  return _mm_cmpeq_epi32(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16b pcmp_eq(const Packet16b& a, const Packet16b& b) {
+  return _mm_cmpeq_epi8(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pcmp_le(const Packet4i& a, const Packet4i& b) {
+  return por(pcmp_lt(a, b), pcmp_eq(a, b));
+}
 
-template<> EIGEN_STRONG_INLINE Packet4i pcmp_lt(const Packet4i& a, const Packet4i& b) { return _mm_cmplt_epi32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4i pcmp_eq(const Packet4i& a, const Packet4i& b) { return _mm_cmpeq_epi32(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4ui pcmp_eq(const Packet4ui& a, const Packet4ui& b) { return _mm_cmpeq_epi32(a, b); }
-template<> EIGEN_STRONG_INLINE Packet16b pcmp_eq(const Packet16b& a, const Packet16b& b) { return _mm_cmpeq_epi8(a,b); }
-template<> EIGEN_STRONG_INLINE Packet4i pcmp_le(const Packet4i& a, const Packet4i& b) { return por(pcmp_lt(a,b), pcmp_eq(a,b)); }
-
-template<> EIGEN_STRONG_INLINE Packet4f pmin<Packet4f>(const Packet4f& a, const Packet4f& b) {
-#if EIGEN_GNUC_STRICT_LESS_THAN(6,3,0)
+template <>
+EIGEN_STRONG_INLINE Packet4f pmin<Packet4f>(const Packet4f& a, const Packet4f& b) {
+#if EIGEN_GNUC_STRICT_LESS_THAN(6, 3, 0)
 // There appears to be a bug in GCC, by which the optimizer may
 // flip the argument order in calls to _mm_min_ps, so we have to
 // resort to inline ASM here. This is supposed to be fixed in gcc6.3,
 // see also: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=72867
 #ifdef EIGEN_VECTORIZE_AVX
   Packet4f res;
-  asm("vminps %[a], %[b], %[res]" : [res] "=x" (res) : [a] "x" (a), [b] "x" (b));
+  asm("vminps %[a], %[b], %[res]" : [res] "=x"(res) : [a] "x"(a), [b] "x"(b));
 #else
   Packet4f res = b;
-  asm("minps %[a], %[res]" : [res] "+x" (res) : [a] "x" (a));
+  asm("minps %[a], %[res]" : [res] "+x"(res) : [a] "x"(a));
 #endif
   return res;
 #else
@@ -561,18 +865,19 @@
   return _mm_min_ps(b, a);
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet2d pmin<Packet2d>(const Packet2d& a, const Packet2d& b) {
-#if EIGEN_GNUC_STRICT_LESS_THAN(6,3,0)
+template <>
+EIGEN_STRONG_INLINE Packet2d pmin<Packet2d>(const Packet2d& a, const Packet2d& b) {
+#if EIGEN_GNUC_STRICT_LESS_THAN(6, 3, 0)
 // There appears to be a bug in GCC, by which the optimizer may
 // flip the argument order in calls to _mm_min_pd, so we have to
 // resort to inline ASM here. This is supposed to be fixed in gcc6.3,
 // see also: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=72867
 #ifdef EIGEN_VECTORIZE_AVX
   Packet2d res;
-  asm("vminpd %[a], %[b], %[res]" : [res] "=x" (res) : [a] "x" (a), [b] "x" (b));
+  asm("vminpd %[a], %[b], %[res]" : [res] "=x"(res) : [a] "x"(a), [b] "x"(b));
 #else
   Packet2d res = b;
-  asm("minpd %[a], %[res]" : [res] "+x" (res) : [a] "x" (a));
+  asm("minpd %[a], %[res]" : [res] "+x"(res) : [a] "x"(a));
 #endif
   return res;
 #else
@@ -580,17 +885,18 @@
   return _mm_min_pd(b, a);
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet4i pmin<Packet4i>(const Packet4i& a, const Packet4i& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4i pmin<Packet4i>(const Packet4i& a, const Packet4i& b) {
 #ifdef EIGEN_VECTORIZE_SSE4_1
-  return _mm_min_epi32(a,b);
+  return _mm_min_epi32(a, b);
 #else
   // after some bench, this version *is* faster than a scalar implementation
-  Packet4i mask = _mm_cmplt_epi32(a,b);
-  return _mm_or_si128(_mm_and_si128(mask,a),_mm_andnot_si128(mask,b));
+  Packet4i mask = _mm_cmplt_epi32(a, b);
+  return _mm_or_si128(_mm_and_si128(mask, a), _mm_andnot_si128(mask, b));
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet4ui pmin<Packet4ui>(const Packet4ui& a, const Packet4ui& b) {
+template <>
+EIGEN_STRONG_INLINE Packet4ui pmin<Packet4ui>(const Packet4ui& a, const Packet4ui& b) {
 #ifdef EIGEN_VECTORIZE_SSE4_1
   return _mm_min_epu32(a, b);
 #else
@@ -600,19 +906,19 @@
 #endif
 }
 
-
-template<> EIGEN_STRONG_INLINE Packet4f pmax<Packet4f>(const Packet4f& a, const Packet4f& b) {
-#if EIGEN_GNUC_STRICT_LESS_THAN(6,3,0)
+template <>
+EIGEN_STRONG_INLINE Packet4f pmax<Packet4f>(const Packet4f& a, const Packet4f& b) {
+#if EIGEN_GNUC_STRICT_LESS_THAN(6, 3, 0)
 // There appears to be a bug in GCC, by which the optimizer may
 // flip the argument order in calls to _mm_max_ps, so we have to
 // resort to inline ASM here. This is supposed to be fixed in gcc6.3,
 // see also: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=72867
 #ifdef EIGEN_VECTORIZE_AVX
   Packet4f res;
-  asm("vmaxps %[a], %[b], %[res]" : [res] "=x" (res) : [a] "x" (a), [b] "x" (b));
+  asm("vmaxps %[a], %[b], %[res]" : [res] "=x"(res) : [a] "x"(a), [b] "x"(b));
 #else
   Packet4f res = b;
-  asm("maxps %[a], %[res]" : [res] "+x" (res) : [a] "x" (a));
+  asm("maxps %[a], %[res]" : [res] "+x"(res) : [a] "x"(a));
 #endif
   return res;
 #else
@@ -620,18 +926,19 @@
   return _mm_max_ps(b, a);
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet2d pmax<Packet2d>(const Packet2d& a, const Packet2d& b) {
-#if EIGEN_GNUC_STRICT_LESS_THAN(6,3,0)
+template <>
+EIGEN_STRONG_INLINE Packet2d pmax<Packet2d>(const Packet2d& a, const Packet2d& b) {
+#if EIGEN_GNUC_STRICT_LESS_THAN(6, 3, 0)
 // There appears to be a bug in GCC, by which the optimizer may
 // flip the argument order in calls to _mm_max_pd, so we have to
 // resort to inline ASM here. This is supposed to be fixed in gcc6.3,
 // see also: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=72867
 #ifdef EIGEN_VECTORIZE_AVX
   Packet2d res;
-  asm("vmaxpd %[a], %[b], %[res]" : [res] "=x" (res) : [a] "x" (a), [b] "x" (b));
+  asm("vmaxpd %[a], %[b], %[res]" : [res] "=x"(res) : [a] "x"(a), [b] "x"(b));
 #else
   Packet2d res = b;
-  asm("maxpd %[a], %[res]" : [res] "+x" (res) : [a] "x" (a));
+  asm("maxpd %[a], %[res]" : [res] "+x"(res) : [a] "x"(a));
 #endif
   return res;
 #else
@@ -639,17 +946,18 @@
   return _mm_max_pd(b, a);
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet4i pmax<Packet4i>(const Packet4i& a, const Packet4i& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4i pmax<Packet4i>(const Packet4i& a, const Packet4i& b) {
 #ifdef EIGEN_VECTORIZE_SSE4_1
-  return _mm_max_epi32(a,b);
+  return _mm_max_epi32(a, b);
 #else
   // after some bench, this version *is* faster than a scalar implementation
-  Packet4i mask = _mm_cmpgt_epi32(a,b);
-  return _mm_or_si128(_mm_and_si128(mask,a),_mm_andnot_si128(mask,b));
+  Packet4i mask = _mm_cmpgt_epi32(a, b);
+  return _mm_or_si128(_mm_and_si128(mask, a), _mm_andnot_si128(mask, b));
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet4ui pmax<Packet4ui>(const Packet4ui& a, const Packet4ui& b) {
+template <>
+EIGEN_STRONG_INLINE Packet4ui pmax<Packet4ui>(const Packet4ui& a, const Packet4ui& b) {
 #ifdef EIGEN_VECTORIZE_SSE4_1
   return _mm_max_epu32(a, b);
 #else
@@ -659,7 +967,8 @@
 #endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet4ui pcmp_lt(const Packet4ui& a, const Packet4ui& b) {
+template <>
+EIGEN_STRONG_INLINE Packet4ui pcmp_lt(const Packet4ui& a, const Packet4ui& b) {
 #ifdef EIGEN_VECTORIZE_SSE4_1
   return pxor(pcmp_eq(a, pmax(a, b)), ptrue(a));
 #else
@@ -667,7 +976,8 @@
                             (Packet4i)psub(b, pset1<Packet4ui>(0x80000000UL)));
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet4ui pcmp_le(const Packet4ui& a, const Packet4ui& b) {
+template <>
+EIGEN_STRONG_INLINE Packet4ui pcmp_le(const Packet4ui& a, const Packet4ui& b) {
 #ifdef EIGEN_VECTORIZE_SSE4_1
   return pcmp_eq(a, pmin(a, b));
 #else
@@ -695,167 +1005,212 @@
 }
 
 // Add specializations for min/max with prescribed NaN progation.
-template<>
+template <>
 EIGEN_STRONG_INLINE Packet4f pmin<PropagateNumbers, Packet4f>(const Packet4f& a, const Packet4f& b) {
   return pminmax_propagate_numbers(a, b, pmin<Packet4f>);
 }
-template<>
+template <>
 EIGEN_STRONG_INLINE Packet2d pmin<PropagateNumbers, Packet2d>(const Packet2d& a, const Packet2d& b) {
   return pminmax_propagate_numbers(a, b, pmin<Packet2d>);
 }
-template<>
+template <>
 EIGEN_STRONG_INLINE Packet4f pmax<PropagateNumbers, Packet4f>(const Packet4f& a, const Packet4f& b) {
   return pminmax_propagate_numbers(a, b, pmax<Packet4f>);
 }
-template<>
+template <>
 EIGEN_STRONG_INLINE Packet2d pmax<PropagateNumbers, Packet2d>(const Packet2d& a, const Packet2d& b) {
   return pminmax_propagate_numbers(a, b, pmax<Packet2d>);
 }
-template<>
+template <>
 EIGEN_STRONG_INLINE Packet4f pmin<PropagateNaN, Packet4f>(const Packet4f& a, const Packet4f& b) {
   return pminmax_propagate_nan(a, b, pmin<Packet4f>);
 }
-template<>
+template <>
 EIGEN_STRONG_INLINE Packet2d pmin<PropagateNaN, Packet2d>(const Packet2d& a, const Packet2d& b) {
   return pminmax_propagate_nan(a, b, pmin<Packet2d>);
 }
-template<>
+template <>
 EIGEN_STRONG_INLINE Packet4f pmax<PropagateNaN, Packet4f>(const Packet4f& a, const Packet4f& b) {
   return pminmax_propagate_nan(a, b, pmax<Packet4f>);
 }
-template<>
+template <>
 EIGEN_STRONG_INLINE Packet2d pmax<PropagateNaN, Packet2d>(const Packet2d& a, const Packet2d& b) {
   return pminmax_propagate_nan(a, b, pmax<Packet2d>);
 }
 
-template<int N> EIGEN_STRONG_INLINE Packet4i parithmetic_shift_right(const Packet4i& a) { return _mm_srai_epi32(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet4i plogical_shift_right   (const Packet4i& a) { return _mm_srli_epi32(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet4i plogical_shift_left    (const Packet4i& a) { return _mm_slli_epi32(a,N); }
-
-template<int N> EIGEN_STRONG_INLINE Packet4ui parithmetic_shift_right(const Packet4ui& a) { return _mm_srli_epi32(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet4ui plogical_shift_right   (const Packet4ui& a) { return _mm_srli_epi32(a,N); }
-template<int N> EIGEN_STRONG_INLINE Packet4ui plogical_shift_left    (const Packet4ui& a) { return _mm_slli_epi32(a,N); }
-
-template<> EIGEN_STRONG_INLINE Packet4f pabs(const Packet4f& a)
-{
-  const Packet4f mask = _mm_castsi128_ps(_mm_setr_epi32(0x7FFFFFFF,0x7FFFFFFF,0x7FFFFFFF,0x7FFFFFFF));
-  return _mm_and_ps(a,mask);
+template <int N>
+EIGEN_STRONG_INLINE Packet4i parithmetic_shift_right(const Packet4i& a) {
+  return _mm_srai_epi32(a, N);
 }
-template<> EIGEN_STRONG_INLINE Packet2d pabs(const Packet2d& a)
-{
-  const Packet2d mask = _mm_castsi128_pd(_mm_setr_epi32(0xFFFFFFFF,0x7FFFFFFF,0xFFFFFFFF,0x7FFFFFFF));
-  return _mm_and_pd(a,mask);
+template <int N>
+EIGEN_STRONG_INLINE Packet4i plogical_shift_right(const Packet4i& a) {
+  return _mm_srli_epi32(a, N);
 }
-template<> EIGEN_STRONG_INLINE Packet4i pabs(const Packet4i& a)
-{
+template <int N>
+EIGEN_STRONG_INLINE Packet4i plogical_shift_left(const Packet4i& a) {
+  return _mm_slli_epi32(a, N);
+}
+
+template <int N>
+EIGEN_STRONG_INLINE Packet4ui parithmetic_shift_right(const Packet4ui& a) {
+  return _mm_srli_epi32(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet4ui plogical_shift_right(const Packet4ui& a) {
+  return _mm_srli_epi32(a, N);
+}
+template <int N>
+EIGEN_STRONG_INLINE Packet4ui plogical_shift_left(const Packet4ui& a) {
+  return _mm_slli_epi32(a, N);
+}
+
+template <>
+EIGEN_STRONG_INLINE Packet4f pabs(const Packet4f& a) {
+  const Packet4f mask = _mm_castsi128_ps(_mm_setr_epi32(0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF));
+  return _mm_and_ps(a, mask);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pabs(const Packet2d& a) {
+  const Packet2d mask = _mm_castsi128_pd(_mm_setr_epi32(0xFFFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF));
+  return _mm_and_pd(a, mask);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pabs(const Packet4i& a) {
 #ifdef EIGEN_VECTORIZE_SSSE3
   return _mm_abs_epi32(a);
 #else
-  Packet4i aux = _mm_srai_epi32(a,31);
-  return _mm_sub_epi32(_mm_xor_si128(a,aux),aux);
+  Packet4i aux = _mm_srai_epi32(a, 31);
+  return _mm_sub_epi32(_mm_xor_si128(a, aux), aux);
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet4ui pabs(const Packet4ui& a) { return a; }
+template <>
+EIGEN_STRONG_INLINE Packet4ui pabs(const Packet4ui& a) {
+  return a;
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f psignbit(const Packet4f& a) { return _mm_castsi128_ps(_mm_srai_epi32(_mm_castps_si128(a), 31)); }
-template<> EIGEN_STRONG_INLINE Packet2d psignbit(const Packet2d& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f psignbit(const Packet4f& a) {
+  return _mm_castsi128_ps(_mm_srai_epi32(_mm_castps_si128(a), 31));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d psignbit(const Packet2d& a) {
   Packet4f tmp = psignbit<Packet4f>(_mm_castpd_ps(a));
 #ifdef EIGEN_VECTORIZE_AVX
   return _mm_castps_pd(_mm_permute_ps(tmp, (shuffle_mask<1, 1, 3, 3>::mask)));
 #else
   return _mm_castps_pd(_mm_shuffle_ps(tmp, tmp, (shuffle_mask<1, 1, 3, 3>::mask)));
-#endif // EIGEN_VECTORIZE_AVX
+#endif  // EIGEN_VECTORIZE_AVX
 }
-template<> EIGEN_STRONG_INLINE Packet4ui  psignbit(const Packet4ui& a)  { return pzero(a); }
+template <>
+EIGEN_STRONG_INLINE Packet4ui psignbit(const Packet4ui& a) {
+  return pzero(a);
+}
 
 #ifdef EIGEN_VECTORIZE_SSE4_1
-template<> EIGEN_STRONG_INLINE Packet4f pround<Packet4f>(const Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f pround<Packet4f>(const Packet4f& a) {
   // Unfortunately _mm_round_ps doesn't have a rounding mode to implement numext::round.
   const Packet4f mask = pset1frombits<Packet4f>(0x80000000u);
   const Packet4f prev0dot5 = pset1frombits<Packet4f>(0x3EFFFFFFu);
   return _mm_round_ps(padd(por(pand(a, mask), prev0dot5), a), _MM_FROUND_TO_ZERO);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2d pround<Packet2d>(const Packet2d& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2d pround<Packet2d>(const Packet2d& a) {
   const Packet2d mask = _mm_castsi128_pd(_mm_set_epi64x(0x8000000000000000ull, 0x8000000000000000ull));
   const Packet2d prev0dot5 = _mm_castsi128_pd(_mm_set_epi64x(0x3FDFFFFFFFFFFFFFull, 0x3FDFFFFFFFFFFFFFull));
   return _mm_round_pd(padd(por(pand(a, mask), prev0dot5), a), _MM_FROUND_TO_ZERO);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f print<Packet4f>(const Packet4f& a) { return _mm_round_ps(a, _MM_FROUND_CUR_DIRECTION); }
-template<> EIGEN_STRONG_INLINE Packet2d print<Packet2d>(const Packet2d& a) { return _mm_round_pd(a, _MM_FROUND_CUR_DIRECTION); }
+template <>
+EIGEN_STRONG_INLINE Packet4f print<Packet4f>(const Packet4f& a) {
+  return _mm_round_ps(a, _MM_FROUND_CUR_DIRECTION);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d print<Packet2d>(const Packet2d& a) {
+  return _mm_round_pd(a, _MM_FROUND_CUR_DIRECTION);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f pceil<Packet4f>(const Packet4f& a) { return _mm_ceil_ps(a); }
-template<> EIGEN_STRONG_INLINE Packet2d pceil<Packet2d>(const Packet2d& a) { return _mm_ceil_pd(a); }
+template <>
+EIGEN_STRONG_INLINE Packet4f pceil<Packet4f>(const Packet4f& a) {
+  return _mm_ceil_ps(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pceil<Packet2d>(const Packet2d& a) {
+  return _mm_ceil_pd(a);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f pfloor<Packet4f>(const Packet4f& a) { return _mm_floor_ps(a); }
-template<> EIGEN_STRONG_INLINE Packet2d pfloor<Packet2d>(const Packet2d& a) { return _mm_floor_pd(a); }
+template <>
+EIGEN_STRONG_INLINE Packet4f pfloor<Packet4f>(const Packet4f& a) {
+  return _mm_floor_ps(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pfloor<Packet2d>(const Packet2d& a) {
+  return _mm_floor_pd(a);
+}
 #else
-template<> EIGEN_STRONG_INLINE Packet4f print(const Packet4f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4f print(const Packet4f& a) {
   // Adds and subtracts signum(a) * 2^23 to force rounding.
-  const Packet4f limit = pset1<Packet4f>(static_cast<float>(1<<23));
+  const Packet4f limit = pset1<Packet4f>(static_cast<float>(1 << 23));
   const Packet4f abs_a = pabs(a);
   Packet4f r = padd(abs_a, limit);
   // Don't compile-away addition and subtraction.
   EIGEN_OPTIMIZATION_BARRIER(r);
   r = psub(r, limit);
   // If greater than limit, simply return a.  Otherwise, account for sign.
-  r = pselect(pcmp_lt(abs_a, limit),
-              pselect(pcmp_lt(a, pzero(a)), pnegate(r), r), a);
+  r = pselect(pcmp_lt(abs_a, limit), pselect(pcmp_lt(a, pzero(a)), pnegate(r), r), a);
   return r;
 }
 
-template<> EIGEN_STRONG_INLINE Packet2d print(const Packet2d& a) {
+template <>
+EIGEN_STRONG_INLINE Packet2d print(const Packet2d& a) {
   // Adds and subtracts signum(a) * 2^52 to force rounding.
-  const Packet2d limit = pset1<Packet2d>(static_cast<double>(1ull<<52));
+  const Packet2d limit = pset1<Packet2d>(static_cast<double>(1ull << 52));
   const Packet2d abs_a = pabs(a);
   Packet2d r = padd(abs_a, limit);
   // Don't compile-away addition and subtraction.
   EIGEN_OPTIMIZATION_BARRIER(r);
   r = psub(r, limit);
   // If greater than limit, simply return a.  Otherwise, account for sign.
-  r = pselect(pcmp_lt(abs_a, limit),
-              pselect(pcmp_lt(a, pzero(a)), pnegate(r), r), a);
+  r = pselect(pcmp_lt(abs_a, limit), pselect(pcmp_lt(a, pzero(a)), pnegate(r), r), a);
   return r;
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pfloor<Packet4f>(const Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f pfloor<Packet4f>(const Packet4f& a) {
   const Packet4f cst_1 = pset1<Packet4f>(1.0f);
-  Packet4f tmp  = print<Packet4f>(a);
+  Packet4f tmp = print<Packet4f>(a);
   // If greater, subtract one.
   Packet4f mask = _mm_cmpgt_ps(tmp, a);
   mask = pand(mask, cst_1);
   return psub(tmp, mask);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2d pfloor<Packet2d>(const Packet2d& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2d pfloor<Packet2d>(const Packet2d& a) {
   const Packet2d cst_1 = pset1<Packet2d>(1.0);
-  Packet2d tmp  = print<Packet2d>(a);
+  Packet2d tmp = print<Packet2d>(a);
   // If greater, subtract one.
   Packet2d mask = _mm_cmpgt_pd(tmp, a);
   mask = pand(mask, cst_1);
   return psub(tmp, mask);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pceil<Packet4f>(const Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f pceil<Packet4f>(const Packet4f& a) {
   const Packet4f cst_1 = pset1<Packet4f>(1.0f);
-  Packet4f tmp  = print<Packet4f>(a);
+  Packet4f tmp = print<Packet4f>(a);
   // If smaller, add one.
   Packet4f mask = _mm_cmplt_ps(tmp, a);
   mask = pand(mask, cst_1);
   return padd(tmp, mask);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2d pceil<Packet2d>(const Packet2d& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2d pceil<Packet2d>(const Packet2d& a) {
   const Packet2d cst_1 = pset1<Packet2d>(1.0);
-  Packet2d tmp  = print<Packet2d>(a);
+  Packet2d tmp = print<Packet2d>(a);
   // If smaller, add one.
   Packet2d mask = _mm_cmplt_pd(tmp, a);
   mask = pand(mask, cst_1);
@@ -863,71 +1218,104 @@
 }
 #endif
 
-template<> EIGEN_STRONG_INLINE Packet4f pload<Packet4f>(const float*   from) { EIGEN_DEBUG_ALIGNED_LOAD return _mm_load_ps(from); }
-template<> EIGEN_STRONG_INLINE Packet2d pload<Packet2d>(const double*  from) { EIGEN_DEBUG_ALIGNED_LOAD return _mm_load_pd(from); }
-template<> EIGEN_STRONG_INLINE Packet4i pload<Packet4i>(const int*     from) { EIGEN_DEBUG_ALIGNED_LOAD return _mm_load_si128(reinterpret_cast<const __m128i*>(from)); }
-template<> EIGEN_STRONG_INLINE Packet4ui pload<Packet4ui>(const uint32_t* from) { EIGEN_DEBUG_ALIGNED_LOAD return _mm_load_si128(reinterpret_cast<const __m128i*>(from)); }
-template<> EIGEN_STRONG_INLINE Packet16b pload<Packet16b>(const bool*     from) { EIGEN_DEBUG_ALIGNED_LOAD return  _mm_load_si128(reinterpret_cast<const __m128i*>(from)); }
+template <>
+EIGEN_STRONG_INLINE Packet4f pload<Packet4f>(const float* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return _mm_load_ps(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pload<Packet2d>(const double* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return _mm_load_pd(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i pload<Packet4i>(const int* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return _mm_load_si128(reinterpret_cast<const __m128i*>(from));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui pload<Packet4ui>(const uint32_t* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return _mm_load_si128(reinterpret_cast<const __m128i*>(from));
+}
+template <>
+EIGEN_STRONG_INLINE Packet16b pload<Packet16b>(const bool* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return _mm_load_si128(reinterpret_cast<const __m128i*>(from));
+}
 
 #if EIGEN_COMP_MSVC
-  template<> EIGEN_STRONG_INLINE Packet4f ploadu<Packet4f>(const float*  from) {
+template <>
+EIGEN_STRONG_INLINE Packet4f ploadu<Packet4f>(const float* from) {
   EIGEN_DEBUG_UNALIGNED_LOAD
   return _mm_loadu_ps(from);
 }
 #else
 // NOTE: with the code below, MSVC's compiler crashes!
 
-template<> EIGEN_STRONG_INLINE Packet4f ploadu<Packet4f>(const float* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f ploadu<Packet4f>(const float* from) {
   EIGEN_DEBUG_UNALIGNED_LOAD
   return _mm_loadu_ps(from);
 }
 #endif
 
-template<> EIGEN_STRONG_INLINE Packet2d ploadu<Packet2d>(const double* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2d ploadu<Packet2d>(const double* from) {
   EIGEN_DEBUG_UNALIGNED_LOAD
   return _mm_loadu_pd(from);
 }
-template<> EIGEN_STRONG_INLINE Packet4i ploadu<Packet4i>(const int* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4i ploadu<Packet4i>(const int* from) {
   EIGEN_DEBUG_UNALIGNED_LOAD
   return _mm_loadu_si128(reinterpret_cast<const __m128i*>(from));
 }
-template<> EIGEN_STRONG_INLINE Packet4ui ploadu<Packet4ui>(const uint32_t* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4ui ploadu<Packet4ui>(const uint32_t* from) {
   EIGEN_DEBUG_UNALIGNED_LOAD
   return _mm_loadu_si128(reinterpret_cast<const __m128i*>(from));
 }
-template<> EIGEN_STRONG_INLINE Packet16b ploadu<Packet16b>(const bool*     from) {
+template <>
+EIGEN_STRONG_INLINE Packet16b ploadu<Packet16b>(const bool* from) {
   EIGEN_DEBUG_UNALIGNED_LOAD
   return _mm_loadu_si128(reinterpret_cast<const __m128i*>(from));
 }
 
 // Load lower part of packet zero extending.
-template<typename Packet> EIGEN_STRONG_INLINE Packet ploadl(const typename unpacket_traits<Packet>::type* from);
-template<> EIGEN_STRONG_INLINE Packet4f ploadl<Packet4f>(const float*  from) { EIGEN_DEBUG_UNALIGNED_LOAD return _mm_castpd_ps(_mm_load_sd(reinterpret_cast<const double*>(from))); }
-template<> EIGEN_STRONG_INLINE Packet2d ploadl<Packet2d>(const double* from) { EIGEN_DEBUG_UNALIGNED_LOAD return _mm_load_sd(from); }
+template <typename Packet>
+EIGEN_STRONG_INLINE Packet ploadl(const typename unpacket_traits<Packet>::type* from);
+template <>
+EIGEN_STRONG_INLINE Packet4f ploadl<Packet4f>(const float* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return _mm_castpd_ps(_mm_load_sd(reinterpret_cast<const double*>(from)));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d ploadl<Packet2d>(const double* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return _mm_load_sd(from);
+}
 
 // Load scalar
-template<typename Packet> EIGEN_STRONG_INLINE Packet ploads(const typename unpacket_traits<Packet>::type* from);
-template<> EIGEN_STRONG_INLINE Packet4f ploads<Packet4f>(const float*  from) { EIGEN_DEBUG_UNALIGNED_LOAD return _mm_load_ss(from); }
-template<> EIGEN_STRONG_INLINE Packet2d ploads<Packet2d>(const double* from) { EIGEN_DEBUG_UNALIGNED_LOAD return _mm_load_sd(from); }
+template <typename Packet>
+EIGEN_STRONG_INLINE Packet ploads(const typename unpacket_traits<Packet>::type* from);
+template <>
+EIGEN_STRONG_INLINE Packet4f ploads<Packet4f>(const float* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return _mm_load_ss(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d ploads<Packet2d>(const double* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return _mm_load_sd(from);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f ploaddup<Packet4f>(const float*   from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f ploaddup<Packet4f>(const float* from) {
   return vec4f_swizzle1(_mm_castpd_ps(_mm_load_sd(reinterpret_cast<const double*>(from))), 0, 0, 1, 1);
 }
-template<> EIGEN_STRONG_INLINE Packet2d ploaddup<Packet2d>(const double*  from)
-{ return pset1<Packet2d>(from[0]); }
-template<> EIGEN_STRONG_INLINE Packet4i ploaddup<Packet4i>(const int*     from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2d ploaddup<Packet2d>(const double* from) {
+  return pset1<Packet2d>(from[0]);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i ploaddup<Packet4i>(const int* from) {
   Packet4i tmp;
   tmp = _mm_loadl_epi64(reinterpret_cast<const __m128i*>(from));
   return vec4i_swizzle1(tmp, 0, 0, 1, 1);
 }
-template<> EIGEN_STRONG_INLINE Packet4ui ploaddup<Packet4ui>(const uint32_t* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4ui ploaddup<Packet4ui>(const uint32_t* from) {
   Packet4ui tmp;
   tmp = _mm_loadl_epi64(reinterpret_cast<const __m128i*>(from));
   return vec4ui_swizzle1(tmp, 0, 0, 1, 1);
@@ -935,154 +1323,268 @@
 
 // Loads 8 bools from memory and returns the packet
 // {b0, b0, b1, b1, b2, b2, b3, b3, b4, b4, b5, b5, b6, b6, b7, b7}
-template<> EIGEN_STRONG_INLINE Packet16b ploaddup<Packet16b>(const bool*     from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet16b ploaddup<Packet16b>(const bool* from) {
   __m128i tmp = _mm_castpd_si128(pload1<Packet2d>(reinterpret_cast<const double*>(from)));
-  return  _mm_unpacklo_epi8(tmp, tmp);
+  return _mm_unpacklo_epi8(tmp, tmp);
 }
 
 // Loads 4 bools from memory and returns the packet
 // {b0, b0  b0, b0, b1, b1, b1, b1, b2, b2, b2, b2, b3, b3, b3, b3}
-template<> EIGEN_STRONG_INLINE Packet16b
-ploadquad<Packet16b>(const bool* from) {
+template <>
+EIGEN_STRONG_INLINE Packet16b ploadquad<Packet16b>(const bool* from) {
   __m128i tmp = _mm_castps_si128(pload1<Packet4f>(reinterpret_cast<const float*>(from)));
   tmp = _mm_unpacklo_epi8(tmp, tmp);
-  return  _mm_unpacklo_epi16(tmp, tmp);
+  return _mm_unpacklo_epi16(tmp, tmp);
 }
 
-template<> EIGEN_STRONG_INLINE void pstore<float>(float*   to, const Packet4f& from) { EIGEN_DEBUG_ALIGNED_STORE _mm_store_ps(to, from); }
-template<> EIGEN_STRONG_INLINE void pstore<double>(double* to, const Packet2d& from) { EIGEN_DEBUG_ALIGNED_STORE _mm_store_pd(to, from); }
-template<> EIGEN_STRONG_INLINE void pstore<int>(int*       to, const Packet4i& from) { EIGEN_DEBUG_ALIGNED_STORE _mm_store_si128(reinterpret_cast<__m128i*>(to), from); }
-template<> EIGEN_STRONG_INLINE void pstore<uint32_t>(uint32_t* to, const Packet4ui& from) { EIGEN_DEBUG_ALIGNED_STORE _mm_store_si128(reinterpret_cast<__m128i*>(to), from); }
-template<> EIGEN_STRONG_INLINE void pstore<bool>(bool*     to, const Packet16b& from) { EIGEN_DEBUG_ALIGNED_STORE _mm_store_si128(reinterpret_cast<__m128i*>(to), from); }
-
-template<> EIGEN_STRONG_INLINE void pstoreu<double>(double* to, const Packet2d& from) { EIGEN_DEBUG_UNALIGNED_STORE _mm_storeu_pd(to, from); }
-template<> EIGEN_STRONG_INLINE void pstoreu<float>(float*   to, const Packet4f& from) { EIGEN_DEBUG_UNALIGNED_STORE _mm_storeu_ps(to, from); }
-template<> EIGEN_STRONG_INLINE void pstoreu<int>(int*       to, const Packet4i& from) { EIGEN_DEBUG_UNALIGNED_STORE _mm_storeu_si128(reinterpret_cast<__m128i*>(to), from); }
-template<> EIGEN_STRONG_INLINE void pstoreu<uint32_t>(uint32_t* to, const Packet4ui& from) { EIGEN_DEBUG_UNALIGNED_STORE _mm_storeu_si128(reinterpret_cast<__m128i*>(to), from); }
-template<> EIGEN_STRONG_INLINE void pstoreu<bool>(bool*     to, const Packet16b& from) { EIGEN_DEBUG_ALIGNED_STORE _mm_storeu_si128(reinterpret_cast<__m128i*>(to), from); }
-
-template<typename Scalar, typename Packet> EIGEN_STRONG_INLINE void pstorel(Scalar* to, const Packet& from);
-template<> EIGEN_STRONG_INLINE void pstorel(float*   to, const Packet4f& from) { EIGEN_DEBUG_UNALIGNED_STORE _mm_storel_pi(reinterpret_cast<__m64*>(to), from); }
-template<> EIGEN_STRONG_INLINE void pstorel(double*  to, const Packet2d& from) { EIGEN_DEBUG_UNALIGNED_STORE _mm_storel_pd(to, from); }
-
-template<typename Scalar, typename Packet> EIGEN_STRONG_INLINE void pstores(Scalar* to, const Packet& from);
-template<> EIGEN_STRONG_INLINE void pstores(float*   to, const Packet4f& from) { EIGEN_DEBUG_UNALIGNED_STORE _mm_store_ss(to, from); }
-template<> EIGEN_STRONG_INLINE void pstores(double*  to, const Packet2d& from) { EIGEN_DEBUG_UNALIGNED_STORE _mm_store_sd(to, from); }
-
-template<> EIGEN_DEVICE_FUNC inline Packet4f pgather<float, Packet4f>(const float* from, Index stride)
-{
- return _mm_set_ps(from[3*stride], from[2*stride], from[1*stride], from[0*stride]);
+template <>
+EIGEN_STRONG_INLINE void pstore<float>(float* to, const Packet4f& from) {
+  EIGEN_DEBUG_ALIGNED_STORE _mm_store_ps(to, from);
 }
-template<> EIGEN_DEVICE_FUNC inline Packet2d pgather<double, Packet2d>(const double* from, Index stride)
-{
- return _mm_set_pd(from[1*stride], from[0*stride]);
+template <>
+EIGEN_STRONG_INLINE void pstore<double>(double* to, const Packet2d& from) {
+  EIGEN_DEBUG_ALIGNED_STORE _mm_store_pd(to, from);
 }
-template<> EIGEN_DEVICE_FUNC inline Packet4i pgather<int, Packet4i>(const int* from, Index stride)
-{
- return _mm_set_epi32(from[3*stride], from[2*stride], from[1*stride], from[0*stride]);
+template <>
+EIGEN_STRONG_INLINE void pstore<int>(int* to, const Packet4i& from) {
+  EIGEN_DEBUG_ALIGNED_STORE _mm_store_si128(reinterpret_cast<__m128i*>(to), from);
 }
-template<> EIGEN_DEVICE_FUNC inline Packet4ui pgather<uint32_t, Packet4ui>(const uint32_t* from, Index stride)
-{
+template <>
+EIGEN_STRONG_INLINE void pstore<uint32_t>(uint32_t* to, const Packet4ui& from) {
+  EIGEN_DEBUG_ALIGNED_STORE _mm_store_si128(reinterpret_cast<__m128i*>(to), from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstore<bool>(bool* to, const Packet16b& from) {
+  EIGEN_DEBUG_ALIGNED_STORE _mm_store_si128(reinterpret_cast<__m128i*>(to), from);
+}
+
+template <>
+EIGEN_STRONG_INLINE void pstoreu<double>(double* to, const Packet2d& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE _mm_storeu_pd(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<float>(float* to, const Packet4f& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE _mm_storeu_ps(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<int>(int* to, const Packet4i& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE _mm_storeu_si128(reinterpret_cast<__m128i*>(to), from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<uint32_t>(uint32_t* to, const Packet4ui& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE _mm_storeu_si128(reinterpret_cast<__m128i*>(to), from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<bool>(bool* to, const Packet16b& from) {
+  EIGEN_DEBUG_ALIGNED_STORE _mm_storeu_si128(reinterpret_cast<__m128i*>(to), from);
+}
+
+template <typename Scalar, typename Packet>
+EIGEN_STRONG_INLINE void pstorel(Scalar* to, const Packet& from);
+template <>
+EIGEN_STRONG_INLINE void pstorel(float* to, const Packet4f& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE _mm_storel_pi(reinterpret_cast<__m64*>(to), from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstorel(double* to, const Packet2d& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE _mm_storel_pd(to, from);
+}
+
+template <typename Scalar, typename Packet>
+EIGEN_STRONG_INLINE void pstores(Scalar* to, const Packet& from);
+template <>
+EIGEN_STRONG_INLINE void pstores(float* to, const Packet4f& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE _mm_store_ss(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstores(double* to, const Packet2d& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE _mm_store_sd(to, from);
+}
+
+template <>
+EIGEN_DEVICE_FUNC inline Packet4f pgather<float, Packet4f>(const float* from, Index stride) {
+  return _mm_set_ps(from[3 * stride], from[2 * stride], from[1 * stride], from[0 * stride]);
+}
+template <>
+EIGEN_DEVICE_FUNC inline Packet2d pgather<double, Packet2d>(const double* from, Index stride) {
+  return _mm_set_pd(from[1 * stride], from[0 * stride]);
+}
+template <>
+EIGEN_DEVICE_FUNC inline Packet4i pgather<int, Packet4i>(const int* from, Index stride) {
+  return _mm_set_epi32(from[3 * stride], from[2 * stride], from[1 * stride], from[0 * stride]);
+}
+template <>
+EIGEN_DEVICE_FUNC inline Packet4ui pgather<uint32_t, Packet4ui>(const uint32_t* from, Index stride) {
   return _mm_set_epi32(numext::bit_cast<int32_t>(from[3 * stride]), numext::bit_cast<int32_t>(from[2 * stride]),
                        numext::bit_cast<int32_t>(from[1 * stride]), numext::bit_cast<int32_t>(from[0 * stride]));
 }
 
-template<> EIGEN_DEVICE_FUNC inline Packet16b pgather<bool, Packet16b>(const bool* from, Index stride)
-{
-  return _mm_set_epi8(from[15*stride], from[14*stride], from[13*stride], from[12*stride],
-                      from[11*stride], from[10*stride], from[9*stride], from[8*stride],
-                      from[7*stride], from[6*stride], from[5*stride], from[4*stride],
-                      from[3*stride], from[2*stride], from[1*stride], from[0*stride]);
+template <>
+EIGEN_DEVICE_FUNC inline Packet16b pgather<bool, Packet16b>(const bool* from, Index stride) {
+  return _mm_set_epi8(from[15 * stride], from[14 * stride], from[13 * stride], from[12 * stride], from[11 * stride],
+                      from[10 * stride], from[9 * stride], from[8 * stride], from[7 * stride], from[6 * stride],
+                      from[5 * stride], from[4 * stride], from[3 * stride], from[2 * stride], from[1 * stride],
+                      from[0 * stride]);
 }
 
-template<> EIGEN_DEVICE_FUNC inline void pscatter<float, Packet4f>(float* to, const Packet4f& from, Index stride)
-{
-  to[stride*0] = _mm_cvtss_f32(from);
-  to[stride*1] = _mm_cvtss_f32(_mm_shuffle_ps(from, from, 1));
-  to[stride*2] = _mm_cvtss_f32(_mm_shuffle_ps(from, from, 2));
-  to[stride*3] = _mm_cvtss_f32(_mm_shuffle_ps(from, from, 3));
+template <>
+EIGEN_DEVICE_FUNC inline void pscatter<float, Packet4f>(float* to, const Packet4f& from, Index stride) {
+  to[stride * 0] = _mm_cvtss_f32(from);
+  to[stride * 1] = _mm_cvtss_f32(_mm_shuffle_ps(from, from, 1));
+  to[stride * 2] = _mm_cvtss_f32(_mm_shuffle_ps(from, from, 2));
+  to[stride * 3] = _mm_cvtss_f32(_mm_shuffle_ps(from, from, 3));
 }
-template<> EIGEN_DEVICE_FUNC inline void pscatter<double, Packet2d>(double* to, const Packet2d& from, Index stride)
-{
-  to[stride*0] = _mm_cvtsd_f64(from);
-  to[stride*1] = _mm_cvtsd_f64(_mm_shuffle_pd(from, from, 1));
+template <>
+EIGEN_DEVICE_FUNC inline void pscatter<double, Packet2d>(double* to, const Packet2d& from, Index stride) {
+  to[stride * 0] = _mm_cvtsd_f64(from);
+  to[stride * 1] = _mm_cvtsd_f64(_mm_shuffle_pd(from, from, 1));
 }
-template<> EIGEN_DEVICE_FUNC inline void pscatter<int, Packet4i>(int* to, const Packet4i& from, Index stride)
-{
-  to[stride*0] = _mm_cvtsi128_si32(from);
-  to[stride*1] = _mm_cvtsi128_si32(_mm_shuffle_epi32(from, 1));
-  to[stride*2] = _mm_cvtsi128_si32(_mm_shuffle_epi32(from, 2));
-  to[stride*3] = _mm_cvtsi128_si32(_mm_shuffle_epi32(from, 3));
+template <>
+EIGEN_DEVICE_FUNC inline void pscatter<int, Packet4i>(int* to, const Packet4i& from, Index stride) {
+  to[stride * 0] = _mm_cvtsi128_si32(from);
+  to[stride * 1] = _mm_cvtsi128_si32(_mm_shuffle_epi32(from, 1));
+  to[stride * 2] = _mm_cvtsi128_si32(_mm_shuffle_epi32(from, 2));
+  to[stride * 3] = _mm_cvtsi128_si32(_mm_shuffle_epi32(from, 3));
 }
-template<> EIGEN_DEVICE_FUNC inline void pscatter<uint32_t, Packet4ui>(uint32_t* to, const Packet4ui& from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC inline void pscatter<uint32_t, Packet4ui>(uint32_t* to, const Packet4ui& from, Index stride) {
   to[stride * 0] = numext::bit_cast<uint32_t>(_mm_cvtsi128_si32(from));
   to[stride * 1] = numext::bit_cast<uint32_t>(_mm_cvtsi128_si32(_mm_shuffle_epi32(from, 1)));
   to[stride * 2] = numext::bit_cast<uint32_t>(_mm_cvtsi128_si32(_mm_shuffle_epi32(from, 2)));
   to[stride * 3] = numext::bit_cast<uint32_t>(_mm_cvtsi128_si32(_mm_shuffle_epi32(from, 3)));
 }
-template<> EIGEN_DEVICE_FUNC inline void pscatter<bool, Packet16b>(bool* to, const Packet16b& from, Index stride)
-{
-  to[4*stride*0] = _mm_cvtsi128_si32(from);
-  to[4*stride*1] = _mm_cvtsi128_si32(_mm_shuffle_epi32(from, 1));
-  to[4*stride*2] = _mm_cvtsi128_si32(_mm_shuffle_epi32(from, 2));
-  to[4*stride*3] = _mm_cvtsi128_si32(_mm_shuffle_epi32(from, 3));
+template <>
+EIGEN_DEVICE_FUNC inline void pscatter<bool, Packet16b>(bool* to, const Packet16b& from, Index stride) {
+  to[4 * stride * 0] = _mm_cvtsi128_si32(from);
+  to[4 * stride * 1] = _mm_cvtsi128_si32(_mm_shuffle_epi32(from, 1));
+  to[4 * stride * 2] = _mm_cvtsi128_si32(_mm_shuffle_epi32(from, 2));
+  to[4 * stride * 3] = _mm_cvtsi128_si32(_mm_shuffle_epi32(from, 3));
 }
 
-
 // some compilers might be tempted to perform multiple moves instead of using a vector path.
-template<> EIGEN_STRONG_INLINE void pstore1<Packet4f>(float* to, const float& a)
-{
+template <>
+EIGEN_STRONG_INLINE void pstore1<Packet4f>(float* to, const float& a) {
   Packet4f pa = _mm_set_ss(a);
-  pstore(to, Packet4f(vec4f_swizzle1(pa,0,0,0,0)));
+  pstore(to, Packet4f(vec4f_swizzle1(pa, 0, 0, 0, 0)));
 }
 // some compilers might be tempted to perform multiple moves instead of using a vector path.
-template<> EIGEN_STRONG_INLINE void pstore1<Packet2d>(double* to, const double& a)
-{
+template <>
+EIGEN_STRONG_INLINE void pstore1<Packet2d>(double* to, const double& a) {
   Packet2d pa = _mm_set_sd(a);
-  pstore(to, Packet2d(vec2d_swizzle1(pa,0,0)));
+  pstore(to, Packet2d(vec2d_swizzle1(pa, 0, 0)));
 }
 
 #if EIGEN_COMP_PGI && EIGEN_COMP_PGI < 1900
-typedef const void * SsePrefetchPtrType;
+typedef const void* SsePrefetchPtrType;
 #else
-typedef const char * SsePrefetchPtrType;
+typedef const char* SsePrefetchPtrType;
 #endif
 
 #ifndef EIGEN_VECTORIZE_AVX
-template<> EIGEN_STRONG_INLINE void prefetch<float>(const float*   addr) { _mm_prefetch((SsePrefetchPtrType)(addr), _MM_HINT_T0); }
-template<> EIGEN_STRONG_INLINE void prefetch<double>(const double* addr) { _mm_prefetch((SsePrefetchPtrType)(addr), _MM_HINT_T0); }
-template<> EIGEN_STRONG_INLINE void prefetch<int>(const int*       addr) { _mm_prefetch((SsePrefetchPtrType)(addr), _MM_HINT_T0); }
-template<> EIGEN_STRONG_INLINE void prefetch<uint32_t>(const uint32_t*       addr) { _mm_prefetch((SsePrefetchPtrType)(addr), _MM_HINT_T0); }
+template <>
+EIGEN_STRONG_INLINE void prefetch<float>(const float* addr) {
+  _mm_prefetch((SsePrefetchPtrType)(addr), _MM_HINT_T0);
+}
+template <>
+EIGEN_STRONG_INLINE void prefetch<double>(const double* addr) {
+  _mm_prefetch((SsePrefetchPtrType)(addr), _MM_HINT_T0);
+}
+template <>
+EIGEN_STRONG_INLINE void prefetch<int>(const int* addr) {
+  _mm_prefetch((SsePrefetchPtrType)(addr), _MM_HINT_T0);
+}
+template <>
+EIGEN_STRONG_INLINE void prefetch<uint32_t>(const uint32_t* addr) {
+  _mm_prefetch((SsePrefetchPtrType)(addr), _MM_HINT_T0);
+}
 #endif
 
 #if EIGEN_COMP_MSVC_STRICT && EIGEN_OS_WIN64
 // The temporary variable fixes an internal compilation error in vs <= 2008 and a wrong-result bug in vs 2010
 // Direct of the struct members fixed bug #62.
-template<> EIGEN_STRONG_INLINE float  pfirst<Packet4f>(const Packet4f& a) { return a.m128_f32[0]; }
-template<> EIGEN_STRONG_INLINE double pfirst<Packet2d>(const Packet2d& a) { return a.m128d_f64[0]; }
-template<> EIGEN_STRONG_INLINE int    pfirst<Packet4i>(const Packet4i& a) { int x = _mm_cvtsi128_si32(a); return x; }
-template<> EIGEN_STRONG_INLINE uint32_t    pfirst<Packet4ui>(const Packet4ui& a) { uint32_t x = numext::bit_cast<uint32_t>(_mm_cvtsi128_si32(a)); return x; }
+template <>
+EIGEN_STRONG_INLINE float pfirst<Packet4f>(const Packet4f& a) {
+  return a.m128_f32[0];
+}
+template <>
+EIGEN_STRONG_INLINE double pfirst<Packet2d>(const Packet2d& a) {
+  return a.m128d_f64[0];
+}
+template <>
+EIGEN_STRONG_INLINE int pfirst<Packet4i>(const Packet4i& a) {
+  int x = _mm_cvtsi128_si32(a);
+  return x;
+}
+template <>
+EIGEN_STRONG_INLINE uint32_t pfirst<Packet4ui>(const Packet4ui& a) {
+  uint32_t x = numext::bit_cast<uint32_t>(_mm_cvtsi128_si32(a));
+  return x;
+}
 #elif EIGEN_COMP_MSVC_STRICT
 // The temporary variable fixes an internal compilation error in vs <= 2008 and a wrong-result bug in vs 2010
-template<> EIGEN_STRONG_INLINE float  pfirst<Packet4f>(const Packet4f& a) { float x = _mm_cvtss_f32(a); return x; }
-template<> EIGEN_STRONG_INLINE double pfirst<Packet2d>(const Packet2d& a) { double x = _mm_cvtsd_f64(a); return x; }
-template<> EIGEN_STRONG_INLINE int    pfirst<Packet4i>(const Packet4i& a) { int x = _mm_cvtsi128_si32(a); return x; }
-template<> EIGEN_STRONG_INLINE uint32_t pfirst<Packet4ui>(const Packet4ui& a) { uint32_t x = numext::bit_cast<uint32_t>(_mm_cvtsi128_si32(a)); return x; }
+template <>
+EIGEN_STRONG_INLINE float pfirst<Packet4f>(const Packet4f& a) {
+  float x = _mm_cvtss_f32(a);
+  return x;
+}
+template <>
+EIGEN_STRONG_INLINE double pfirst<Packet2d>(const Packet2d& a) {
+  double x = _mm_cvtsd_f64(a);
+  return x;
+}
+template <>
+EIGEN_STRONG_INLINE int pfirst<Packet4i>(const Packet4i& a) {
+  int x = _mm_cvtsi128_si32(a);
+  return x;
+}
+template <>
+EIGEN_STRONG_INLINE uint32_t pfirst<Packet4ui>(const Packet4ui& a) {
+  uint32_t x = numext::bit_cast<uint32_t>(_mm_cvtsi128_si32(a));
+  return x;
+}
 #else
-template<> EIGEN_STRONG_INLINE float  pfirst<Packet4f>(const Packet4f& a) { return _mm_cvtss_f32(a); }
-template<> EIGEN_STRONG_INLINE double pfirst<Packet2d>(const Packet2d& a) { return _mm_cvtsd_f64(a); }
-template<> EIGEN_STRONG_INLINE int    pfirst<Packet4i>(const Packet4i& a) { return _mm_cvtsi128_si32(a); }
-template<> EIGEN_STRONG_INLINE uint32_t pfirst<Packet4ui>(const Packet4ui& a) { return numext::bit_cast<uint32_t>(_mm_cvtsi128_si32(a)); }
+template <>
+EIGEN_STRONG_INLINE float pfirst<Packet4f>(const Packet4f& a) {
+  return _mm_cvtss_f32(a);
+}
+template <>
+EIGEN_STRONG_INLINE double pfirst<Packet2d>(const Packet2d& a) {
+  return _mm_cvtsd_f64(a);
+}
+template <>
+EIGEN_STRONG_INLINE int pfirst<Packet4i>(const Packet4i& a) {
+  return _mm_cvtsi128_si32(a);
+}
+template <>
+EIGEN_STRONG_INLINE uint32_t pfirst<Packet4ui>(const Packet4ui& a) {
+  return numext::bit_cast<uint32_t>(_mm_cvtsi128_si32(a));
+}
 #endif
-template<> EIGEN_STRONG_INLINE bool   pfirst<Packet16b>(const Packet16b& a) { int x = _mm_cvtsi128_si32(a); return static_cast<bool>(x & 1); }
+template <>
+EIGEN_STRONG_INLINE bool pfirst<Packet16b>(const Packet16b& a) {
+  int x = _mm_cvtsi128_si32(a);
+  return static_cast<bool>(x & 1);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f preverse(const Packet4f& a) { return _mm_shuffle_ps(a,a,0x1B); }
-template<> EIGEN_STRONG_INLINE Packet2d preverse(const Packet2d& a) { return _mm_shuffle_pd(a,a,0x1); }
-template<> EIGEN_STRONG_INLINE Packet4i preverse(const Packet4i& a) { return _mm_shuffle_epi32(a,0x1B); }
-template<> EIGEN_STRONG_INLINE Packet4ui preverse(const Packet4ui& a) { return _mm_shuffle_epi32(a, 0x1B); }
-template<> EIGEN_STRONG_INLINE Packet16b preverse(const Packet16b& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4f preverse(const Packet4f& a) {
+  return _mm_shuffle_ps(a, a, 0x1B);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d preverse(const Packet2d& a) {
+  return _mm_shuffle_pd(a, a, 0x1);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4i preverse(const Packet4i& a) {
+  return _mm_shuffle_epi32(a, 0x1B);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4ui preverse(const Packet4ui& a) {
+  return _mm_shuffle_epi32(a, 0x1B);
+}
+template <>
+EIGEN_STRONG_INLINE Packet16b preverse(const Packet16b& a) {
 #ifdef EIGEN_VECTORIZE_SSSE3
   __m128i mask = _mm_set_epi8(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
   return _mm_shuffle_epi8(a, mask);
@@ -1093,30 +1595,33 @@
 #endif
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pfrexp<Packet4f>(const Packet4f& a, Packet4f& exponent) {
-  return pfrexp_generic(a,exponent);
+template <>
+EIGEN_STRONG_INLINE Packet4f pfrexp<Packet4f>(const Packet4f& a, Packet4f& exponent) {
+  return pfrexp_generic(a, exponent);
 }
 
 // Extract exponent without existence of Packet2l.
-template<>
-EIGEN_STRONG_INLINE  
-Packet2d pfrexp_generic_get_biased_exponent(const Packet2d& a) {
-  const Packet2d cst_exp_mask  = pset1frombits<Packet2d>(static_cast<uint64_t>(0x7ff0000000000000ull));
+template <>
+EIGEN_STRONG_INLINE Packet2d pfrexp_generic_get_biased_exponent(const Packet2d& a) {
+  const Packet2d cst_exp_mask = pset1frombits<Packet2d>(static_cast<uint64_t>(0x7ff0000000000000ull));
   __m128i a_expo = _mm_srli_epi64(_mm_castpd_si128(pand(a, cst_exp_mask)), 52);
   return _mm_cvtepi32_pd(vec4i_swizzle1(a_expo, 0, 2, 1, 3));
 }
 
-template<> EIGEN_STRONG_INLINE Packet2d pfrexp<Packet2d>(const Packet2d& a, Packet2d& exponent) {
+template <>
+EIGEN_STRONG_INLINE Packet2d pfrexp<Packet2d>(const Packet2d& a, Packet2d& exponent) {
   return pfrexp_generic(a, exponent);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pldexp<Packet4f>(const Packet4f& a, const Packet4f& exponent) {
-  return pldexp_generic(a,exponent);
+template <>
+EIGEN_STRONG_INLINE Packet4f pldexp<Packet4f>(const Packet4f& a, const Packet4f& exponent) {
+  return pldexp_generic(a, exponent);
 }
 
 // We specialize pldexp here, since the generic implementation uses Packet2l, which is not well
 // supported by SSE, and has more range than is needed for exponents.
-template<> EIGEN_STRONG_INLINE Packet2d pldexp<Packet2d>(const Packet2d& a, const Packet2d& exponent) {
+template <>
+EIGEN_STRONG_INLINE Packet2d pldexp<Packet2d>(const Packet2d& a, const Packet2d& exponent) {
   // Clamp exponent to [-2099, 2099]
   const Packet2d max_exponent = pset1<Packet2d>(2099.0);
   const Packet2d e = pmin(pmax(exponent, pnegate(max_exponent)), max_exponent);
@@ -1126,226 +1631,223 @@
 
   // Split 2^e into four factors and multiply:
   const Packet4i bias = _mm_set_epi32(0, 1023, 0, 1023);
-  Packet4i b = parithmetic_shift_right<2>(ei);  // floor(e/4)
+  Packet4i b = parithmetic_shift_right<2>(ei);                       // floor(e/4)
   Packet2d c = _mm_castsi128_pd(_mm_slli_epi64(padd(b, bias), 52));  // 2^b
-  Packet2d out = pmul(pmul(pmul(a, c), c), c); // a * 2^(3b)
-  b = psub(psub(psub(ei, b), b), b);  // e - 3b
-  c = _mm_castsi128_pd(_mm_slli_epi64(padd(b, bias), 52));  // 2^(e - 3b)
-  out = pmul(out, c);  // a * 2^e
+  Packet2d out = pmul(pmul(pmul(a, c), c), c);                       // a * 2^(3b)
+  b = psub(psub(psub(ei, b), b), b);                                 // e - 3b
+  c = _mm_castsi128_pd(_mm_slli_epi64(padd(b, bias), 52));           // 2^(e - 3b)
+  out = pmul(out, c);                                                // a * 2^e
   return out;
 }
 
 // with AVX, the default implementations based on pload1 are faster
 #ifndef __AVX__
-template<> EIGEN_STRONG_INLINE void
-pbroadcast4<Packet4f>(const float *a,
-                      Packet4f& a0, Packet4f& a1, Packet4f& a2, Packet4f& a3)
-{
+template <>
+EIGEN_STRONG_INLINE void pbroadcast4<Packet4f>(const float* a, Packet4f& a0, Packet4f& a1, Packet4f& a2, Packet4f& a3) {
   a3 = pload<Packet4f>(a);
-  a0 = vec4f_swizzle1(a3, 0,0,0,0);
-  a1 = vec4f_swizzle1(a3, 1,1,1,1);
-  a2 = vec4f_swizzle1(a3, 2,2,2,2);
-  a3 = vec4f_swizzle1(a3, 3,3,3,3);
+  a0 = vec4f_swizzle1(a3, 0, 0, 0, 0);
+  a1 = vec4f_swizzle1(a3, 1, 1, 1, 1);
+  a2 = vec4f_swizzle1(a3, 2, 2, 2, 2);
+  a3 = vec4f_swizzle1(a3, 3, 3, 3, 3);
 }
-template<> EIGEN_STRONG_INLINE void
-pbroadcast4<Packet2d>(const double *a,
-                      Packet2d& a0, Packet2d& a1, Packet2d& a2, Packet2d& a3)
-{
+template <>
+EIGEN_STRONG_INLINE void pbroadcast4<Packet2d>(const double* a, Packet2d& a0, Packet2d& a1, Packet2d& a2,
+                                               Packet2d& a3) {
 #ifdef EIGEN_VECTORIZE_SSE3
-  a0 = _mm_loaddup_pd(a+0);
-  a1 = _mm_loaddup_pd(a+1);
-  a2 = _mm_loaddup_pd(a+2);
-  a3 = _mm_loaddup_pd(a+3);
+  a0 = _mm_loaddup_pd(a + 0);
+  a1 = _mm_loaddup_pd(a + 1);
+  a2 = _mm_loaddup_pd(a + 2);
+  a3 = _mm_loaddup_pd(a + 3);
 #else
   a1 = pload<Packet2d>(a);
-  a0 = vec2d_swizzle1(a1, 0,0);
-  a1 = vec2d_swizzle1(a1, 1,1);
-  a3 = pload<Packet2d>(a+2);
-  a2 = vec2d_swizzle1(a3, 0,0);
-  a3 = vec2d_swizzle1(a3, 1,1);
+  a0 = vec2d_swizzle1(a1, 0, 0);
+  a1 = vec2d_swizzle1(a1, 1, 1);
+  a3 = pload<Packet2d>(a + 2);
+  a2 = vec2d_swizzle1(a3, 0, 0);
+  a3 = vec2d_swizzle1(a3, 1, 1);
 #endif
 }
 #endif
 
-EIGEN_STRONG_INLINE void punpackp(Packet4f* vecs)
-{
+EIGEN_STRONG_INLINE void punpackp(Packet4f* vecs) {
   vecs[1] = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(vecs[0]), 0x55));
   vecs[2] = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(vecs[0]), 0xAA));
   vecs[3] = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(vecs[0]), 0xFF));
   vecs[0] = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(vecs[0]), 0x00));
 }
 
-template<> EIGEN_STRONG_INLINE float predux<Packet4f>(const Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE float predux<Packet4f>(const Packet4f& a) {
   // Disable SSE3 _mm_hadd_pd that is extremely slow on all existing Intel's architectures
   // (from Nehalem to Haswell)
   // #ifdef EIGEN_VECTORIZE_SSE3
   //   Packet4f tmp = _mm_add_ps(a, vec4f_swizzle1(a,2,3,2,3));
   //   return pfirst<Packet4f>(_mm_hadd_ps(tmp, tmp));
   // #else
-  Packet4f tmp = _mm_add_ps(a, _mm_movehl_ps(a,a));
-  return pfirst<Packet4f>(_mm_add_ss(tmp, _mm_shuffle_ps(tmp,tmp, 1)));
+  Packet4f tmp = _mm_add_ps(a, _mm_movehl_ps(a, a));
+  return pfirst<Packet4f>(_mm_add_ss(tmp, _mm_shuffle_ps(tmp, tmp, 1)));
   // #endif
 }
 
-template<> EIGEN_STRONG_INLINE double predux<Packet2d>(const Packet2d& a)
-{
+template <>
+EIGEN_STRONG_INLINE double predux<Packet2d>(const Packet2d& a) {
   // Disable SSE3 _mm_hadd_pd that is extremely slow on all existing Intel's architectures
   // (from Nehalem to Haswell)
   // #ifdef EIGEN_VECTORIZE_SSE3
   //   return pfirst<Packet2d>(_mm_hadd_pd(a, a));
   // #else
-  return pfirst<Packet2d>(_mm_add_sd(a, _mm_unpackhi_pd(a,a)));
+  return pfirst<Packet2d>(_mm_add_sd(a, _mm_unpackhi_pd(a, a)));
   // #endif
 }
 
 #ifdef EIGEN_VECTORIZE_SSSE3
-template<> EIGEN_STRONG_INLINE int predux<Packet4i>(const Packet4i& a)
-{
-  Packet4i tmp0 = _mm_hadd_epi32(a,a);
-  return pfirst<Packet4i>(_mm_hadd_epi32(tmp0,tmp0));
+template <>
+EIGEN_STRONG_INLINE int predux<Packet4i>(const Packet4i& a) {
+  Packet4i tmp0 = _mm_hadd_epi32(a, a);
+  return pfirst<Packet4i>(_mm_hadd_epi32(tmp0, tmp0));
 }
-template<> EIGEN_STRONG_INLINE uint32_t predux<Packet4ui>(const Packet4ui& a)
-{
+template <>
+EIGEN_STRONG_INLINE uint32_t predux<Packet4ui>(const Packet4ui& a) {
   Packet4ui tmp0 = _mm_hadd_epi32(a, a);
   return pfirst<Packet4ui>(_mm_hadd_epi32(tmp0, tmp0));
 }
 
 #else
-template<> EIGEN_STRONG_INLINE int predux<Packet4i>(const Packet4i& a)
-{
-  Packet4i tmp = _mm_add_epi32(a, _mm_unpackhi_epi64(a,a));
+template <>
+EIGEN_STRONG_INLINE int predux<Packet4i>(const Packet4i& a) {
+  Packet4i tmp = _mm_add_epi32(a, _mm_unpackhi_epi64(a, a));
   return pfirst(tmp) + pfirst<Packet4i>(_mm_shuffle_epi32(tmp, 1));
 }
-template<> EIGEN_STRONG_INLINE uint32_t predux<Packet4ui>(const Packet4ui& a) {
+template <>
+EIGEN_STRONG_INLINE uint32_t predux<Packet4ui>(const Packet4ui& a) {
   Packet4ui tmp = _mm_add_epi32(a, _mm_unpackhi_epi64(a, a));
   return pfirst(tmp) + pfirst<Packet4ui>(_mm_shuffle_epi32(tmp, 1));
 }
 #endif
 
-template<> EIGEN_STRONG_INLINE bool predux<Packet16b>(const Packet16b& a) {
-  Packet4i tmp = _mm_or_si128(a, _mm_unpackhi_epi64(a,a));
+template <>
+EIGEN_STRONG_INLINE bool predux<Packet16b>(const Packet16b& a) {
+  Packet4i tmp = _mm_or_si128(a, _mm_unpackhi_epi64(a, a));
   return (pfirst(tmp) != 0) || (pfirst<Packet4i>(_mm_shuffle_epi32(tmp, 1)) != 0);
 }
 
 // Other reduction functions:
 
-
 // mul
-template<> EIGEN_STRONG_INLINE float predux_mul<Packet4f>(const Packet4f& a)
-{
-  Packet4f tmp = _mm_mul_ps(a, _mm_movehl_ps(a,a));
-  return pfirst<Packet4f>(_mm_mul_ss(tmp, _mm_shuffle_ps(tmp,tmp, 1)));
+template <>
+EIGEN_STRONG_INLINE float predux_mul<Packet4f>(const Packet4f& a) {
+  Packet4f tmp = _mm_mul_ps(a, _mm_movehl_ps(a, a));
+  return pfirst<Packet4f>(_mm_mul_ss(tmp, _mm_shuffle_ps(tmp, tmp, 1)));
 }
-template<> EIGEN_STRONG_INLINE double predux_mul<Packet2d>(const Packet2d& a)
-{
-  return pfirst<Packet2d>(_mm_mul_sd(a, _mm_unpackhi_pd(a,a)));
+template <>
+EIGEN_STRONG_INLINE double predux_mul<Packet2d>(const Packet2d& a) {
+  return pfirst<Packet2d>(_mm_mul_sd(a, _mm_unpackhi_pd(a, a)));
 }
-template<> EIGEN_STRONG_INLINE int predux_mul<Packet4i>(const Packet4i& a)
-{
+template <>
+EIGEN_STRONG_INLINE int predux_mul<Packet4i>(const Packet4i& a) {
   // after some experiments, it is seems this is the fastest way to implement it
   // for GCC (eg., reusing pmul is very slow !)
   // TODO try to call _mm_mul_epu32 directly
   EIGEN_ALIGN16 int aux[4];
   pstore(aux, a);
-  return  (aux[0] * aux[1]) * (aux[2] * aux[3]);
+  return (aux[0] * aux[1]) * (aux[2] * aux[3]);
 }
-template<> EIGEN_STRONG_INLINE uint32_t predux_mul<Packet4ui>(const Packet4ui& a)
-{
+template <>
+EIGEN_STRONG_INLINE uint32_t predux_mul<Packet4ui>(const Packet4ui& a) {
   // after some experiments, it is seems this is the fastest way to implement it
   // for GCC (eg., reusing pmul is very slow !)
   // TODO try to call _mm_mul_epu32 directly
   EIGEN_ALIGN16 uint32_t aux[4];
   pstore(aux, a);
-  return  (aux[0] * aux[1]) * (aux[2] * aux[3]);
+  return (aux[0] * aux[1]) * (aux[2] * aux[3]);
 }
 
-template<> EIGEN_STRONG_INLINE bool predux_mul<Packet16b>(const Packet16b& a) {
-  Packet4i tmp = _mm_and_si128(a, _mm_unpackhi_epi64(a,a));
-  return ((pfirst<Packet4i>(tmp) == 0x01010101) &&
-          (pfirst<Packet4i>(_mm_shuffle_epi32(tmp, 1)) == 0x01010101));
+template <>
+EIGEN_STRONG_INLINE bool predux_mul<Packet16b>(const Packet16b& a) {
+  Packet4i tmp = _mm_and_si128(a, _mm_unpackhi_epi64(a, a));
+  return ((pfirst<Packet4i>(tmp) == 0x01010101) && (pfirst<Packet4i>(_mm_shuffle_epi32(tmp, 1)) == 0x01010101));
 }
 
 // min
-template<> EIGEN_STRONG_INLINE float predux_min<Packet4f>(const Packet4f& a)
-{
-  Packet4f tmp = _mm_min_ps(a, _mm_movehl_ps(a,a));
-  return pfirst<Packet4f>(_mm_min_ss(tmp, _mm_shuffle_ps(tmp,tmp, 1)));
+template <>
+EIGEN_STRONG_INLINE float predux_min<Packet4f>(const Packet4f& a) {
+  Packet4f tmp = _mm_min_ps(a, _mm_movehl_ps(a, a));
+  return pfirst<Packet4f>(_mm_min_ss(tmp, _mm_shuffle_ps(tmp, tmp, 1)));
 }
-template<> EIGEN_STRONG_INLINE double predux_min<Packet2d>(const Packet2d& a)
-{
-  return pfirst<Packet2d>(_mm_min_sd(a, _mm_unpackhi_pd(a,a)));
+template <>
+EIGEN_STRONG_INLINE double predux_min<Packet2d>(const Packet2d& a) {
+  return pfirst<Packet2d>(_mm_min_sd(a, _mm_unpackhi_pd(a, a)));
 }
-template<> EIGEN_STRONG_INLINE int predux_min<Packet4i>(const Packet4i& a)
-{
+template <>
+EIGEN_STRONG_INLINE int predux_min<Packet4i>(const Packet4i& a) {
 #ifdef EIGEN_VECTORIZE_SSE4_1
-  Packet4i tmp = _mm_min_epi32(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(0,0,3,2)));
-  return pfirst<Packet4i>(_mm_min_epi32(tmp,_mm_shuffle_epi32(tmp, 1)));
+  Packet4i tmp = _mm_min_epi32(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(0, 0, 3, 2)));
+  return pfirst<Packet4i>(_mm_min_epi32(tmp, _mm_shuffle_epi32(tmp, 1)));
 #else
   // after some experiments, it is seems this is the fastest way to implement it
   // for GCC (eg., it does not like using std::min after the pstore !!)
   EIGEN_ALIGN16 int aux[4];
   pstore(aux, a);
-  int aux0 = aux[0]<aux[1] ? aux[0] : aux[1];
-  int aux2 = aux[2]<aux[3] ? aux[2] : aux[3];
-  return aux0<aux2 ? aux0 : aux2;
-#endif // EIGEN_VECTORIZE_SSE4_1
+  int aux0 = aux[0] < aux[1] ? aux[0] : aux[1];
+  int aux2 = aux[2] < aux[3] ? aux[2] : aux[3];
+  return aux0 < aux2 ? aux0 : aux2;
+#endif  // EIGEN_VECTORIZE_SSE4_1
 }
-template<> EIGEN_STRONG_INLINE uint32_t predux_min<Packet4ui>(const Packet4ui& a)
-{
+template <>
+EIGEN_STRONG_INLINE uint32_t predux_min<Packet4ui>(const Packet4ui& a) {
 #ifdef EIGEN_VECTORIZE_SSE4_1
-  Packet4ui tmp = _mm_min_epu32(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(0,0,3,2)));
-  return pfirst<Packet4ui>(_mm_min_epu32(tmp,_mm_shuffle_epi32(tmp, 1)));
+  Packet4ui tmp = _mm_min_epu32(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(0, 0, 3, 2)));
+  return pfirst<Packet4ui>(_mm_min_epu32(tmp, _mm_shuffle_epi32(tmp, 1)));
 #else
   // after some experiments, it is seems this is the fastest way to implement it
   // for GCC (eg., it does not like using std::min after the pstore !!)
   EIGEN_ALIGN16 uint32_t aux[4];
   pstore(aux, a);
-  uint32_t aux0 = aux[0]<aux[1] ? aux[0] : aux[1];
-  uint32_t aux2 = aux[2]<aux[3] ? aux[2] : aux[3];
-  return aux0<aux2 ? aux0 : aux2;
-#endif // EIGEN_VECTORIZE_SSE4_1
+  uint32_t aux0 = aux[0] < aux[1] ? aux[0] : aux[1];
+  uint32_t aux2 = aux[2] < aux[3] ? aux[2] : aux[3];
+  return aux0 < aux2 ? aux0 : aux2;
+#endif  // EIGEN_VECTORIZE_SSE4_1
 }
 
 // max
-template<> EIGEN_STRONG_INLINE float predux_max<Packet4f>(const Packet4f& a)
-{
-  Packet4f tmp = _mm_max_ps(a, _mm_movehl_ps(a,a));
-  return pfirst<Packet4f>(_mm_max_ss(tmp, _mm_shuffle_ps(tmp,tmp, 1)));
+template <>
+EIGEN_STRONG_INLINE float predux_max<Packet4f>(const Packet4f& a) {
+  Packet4f tmp = _mm_max_ps(a, _mm_movehl_ps(a, a));
+  return pfirst<Packet4f>(_mm_max_ss(tmp, _mm_shuffle_ps(tmp, tmp, 1)));
 }
-template<> EIGEN_STRONG_INLINE double predux_max<Packet2d>(const Packet2d& a)
-{
-  return pfirst<Packet2d>(_mm_max_sd(a, _mm_unpackhi_pd(a,a)));
+template <>
+EIGEN_STRONG_INLINE double predux_max<Packet2d>(const Packet2d& a) {
+  return pfirst<Packet2d>(_mm_max_sd(a, _mm_unpackhi_pd(a, a)));
 }
-template<> EIGEN_STRONG_INLINE int predux_max<Packet4i>(const Packet4i& a)
-{
+template <>
+EIGEN_STRONG_INLINE int predux_max<Packet4i>(const Packet4i& a) {
 #ifdef EIGEN_VECTORIZE_SSE4_1
-  Packet4i tmp = _mm_max_epi32(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(0,0,3,2)));
-  return pfirst<Packet4i>(_mm_max_epi32(tmp,_mm_shuffle_epi32(tmp, 1)));
+  Packet4i tmp = _mm_max_epi32(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(0, 0, 3, 2)));
+  return pfirst<Packet4i>(_mm_max_epi32(tmp, _mm_shuffle_epi32(tmp, 1)));
 #else
   // after some experiments, it is seems this is the fastest way to implement it
   // for GCC (eg., it does not like using std::min after the pstore !!)
   EIGEN_ALIGN16 int aux[4];
   pstore(aux, a);
-  int aux0 = aux[0]>aux[1] ? aux[0] : aux[1];
-  int aux2 = aux[2]>aux[3] ? aux[2] : aux[3];
-  return aux0>aux2 ? aux0 : aux2;
-#endif // EIGEN_VECTORIZE_SSE4_1
+  int aux0 = aux[0] > aux[1] ? aux[0] : aux[1];
+  int aux2 = aux[2] > aux[3] ? aux[2] : aux[3];
+  return aux0 > aux2 ? aux0 : aux2;
+#endif  // EIGEN_VECTORIZE_SSE4_1
 }
-template<> EIGEN_STRONG_INLINE uint32_t predux_max<Packet4ui>(const Packet4ui& a)
-{
+template <>
+EIGEN_STRONG_INLINE uint32_t predux_max<Packet4ui>(const Packet4ui& a) {
 #ifdef EIGEN_VECTORIZE_SSE4_1
-  Packet4ui tmp = _mm_max_epu32(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(0,0,3,2)));
-  return pfirst<Packet4ui>(_mm_max_epu32(tmp,_mm_shuffle_epi32(tmp, 1)));
+  Packet4ui tmp = _mm_max_epu32(a, _mm_shuffle_epi32(a, _MM_SHUFFLE(0, 0, 3, 2)));
+  return pfirst<Packet4ui>(_mm_max_epu32(tmp, _mm_shuffle_epi32(tmp, 1)));
 #else
   // after some experiments, it is seems this is the fastest way to implement it
   // for GCC (eg., it does not like using std::min after the pstore !!)
   EIGEN_ALIGN16 uint32_t aux[4];
   pstore(aux, a);
-  uint32_t aux0 = aux[0]>aux[1] ? aux[0] : aux[1];
-  uint32_t aux2 = aux[2]>aux[3] ? aux[2] : aux[3];
-  return aux0>aux2 ? aux0 : aux2;
-#endif // EIGEN_VECTORIZE_SSE4_1
+  uint32_t aux0 = aux[0] > aux[1] ? aux[0] : aux[1];
+  uint32_t aux2 = aux[2] > aux[3] ? aux[2] : aux[3];
+  return aux0 > aux2 ? aux0 : aux2;
+#endif  // EIGEN_VECTORIZE_SSE4_1
 }
 
 // not needed yet
@@ -1354,34 +1856,31 @@
 //   return _mm_movemask_ps(x) == 0xF;
 // }
 
-template<> EIGEN_STRONG_INLINE bool predux_any(const Packet4f& x)
-{
+template <>
+EIGEN_STRONG_INLINE bool predux_any(const Packet4f& x) {
   return _mm_movemask_ps(x) != 0x0;
 }
 
-template<> EIGEN_STRONG_INLINE bool predux_any(const Packet4i& x)
-{
+template <>
+EIGEN_STRONG_INLINE bool predux_any(const Packet4i& x) {
   return _mm_movemask_ps(_mm_castsi128_ps(x)) != 0x0;
 }
-template<> EIGEN_STRONG_INLINE bool predux_any(const Packet4ui& x)
-{
+template <>
+EIGEN_STRONG_INLINE bool predux_any(const Packet4ui& x) {
   return _mm_movemask_ps(_mm_castsi128_ps(x)) != 0x0;
 }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet4f,4>& kernel) {
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet4f, 4>& kernel) {
   _MM_TRANSPOSE4_PS(kernel.packet[0], kernel.packet[1], kernel.packet[2], kernel.packet[3]);
 }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet2d,2>& kernel) {
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet2d, 2>& kernel) {
   __m128d tmp = _mm_unpackhi_pd(kernel.packet[0], kernel.packet[1]);
   kernel.packet[0] = _mm_unpacklo_pd(kernel.packet[0], kernel.packet[1]);
   kernel.packet[1] = tmp;
 }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet4i,4>& kernel) {
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet4i, 4>& kernel) {
   __m128i T0 = _mm_unpacklo_epi32(kernel.packet[0], kernel.packet[1]);
   __m128i T1 = _mm_unpacklo_epi32(kernel.packet[2], kernel.packet[3]);
   __m128i T2 = _mm_unpackhi_epi32(kernel.packet[0], kernel.packet[1]);
@@ -1396,20 +1895,18 @@
   ptranspose((PacketBlock<Packet4i, 4>&)kernel);
 }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet16b,4>& kernel) {
-  __m128i T0 =  _mm_unpacklo_epi8(kernel.packet[0], kernel.packet[1]);
-  __m128i T1 =  _mm_unpackhi_epi8(kernel.packet[0], kernel.packet[1]);
-  __m128i T2 =  _mm_unpacklo_epi8(kernel.packet[2], kernel.packet[3]);
-  __m128i T3 =  _mm_unpackhi_epi8(kernel.packet[2], kernel.packet[3]);
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet16b, 4>& kernel) {
+  __m128i T0 = _mm_unpacklo_epi8(kernel.packet[0], kernel.packet[1]);
+  __m128i T1 = _mm_unpackhi_epi8(kernel.packet[0], kernel.packet[1]);
+  __m128i T2 = _mm_unpacklo_epi8(kernel.packet[2], kernel.packet[3]);
+  __m128i T3 = _mm_unpackhi_epi8(kernel.packet[2], kernel.packet[3]);
   kernel.packet[0] = _mm_unpacklo_epi16(T0, T2);
   kernel.packet[1] = _mm_unpackhi_epi16(T0, T2);
   kernel.packet[2] = _mm_unpacklo_epi16(T1, T3);
   kernel.packet[3] = _mm_unpackhi_epi16(T1, T3);
 }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet16b,16>& kernel) {
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet16b, 16>& kernel) {
   // If we number the elements in the input thus:
   // kernel.packet[ 0] = {00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 0a, 0b, 0c, 0d, 0e, 0f}
   // kernel.packet[ 1] = {10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1a, 1b, 1c, 1d, 1e, 1f}
@@ -1421,67 +1918,72 @@
   // kernel.packet[ 1] = {01, 11, 21, 31, 41, 51, 61, 71, 81, 91, a1, b1, c1, d1, e1, f1}
   // ...
   // kernel.packet[15] = {0f, 1f, 2f, 3f, 4f, 5f, 6f, 7f, 8f, 9f, af, bf, cf, df, ef, ff},
-  __m128i t0 =  _mm_unpacklo_epi8(kernel.packet[0], kernel.packet[1]); // 00 10 01 11 02 12 03 13 04 14 05 15 06 16 07 17
-  __m128i t1 =  _mm_unpackhi_epi8(kernel.packet[0], kernel.packet[1]); // 08 18 09 19 0a 1a 0b 1b 0c 1c 0d 1d 0e 1e 0f 1f
-  __m128i t2 =  _mm_unpacklo_epi8(kernel.packet[2], kernel.packet[3]); // 20 30 21 31 22 32 ...                     27 37
-  __m128i t3 =  _mm_unpackhi_epi8(kernel.packet[2], kernel.packet[3]); // 28 38 29 39 2a 3a ...                     2f 3f
-  __m128i t4 =  _mm_unpacklo_epi8(kernel.packet[4], kernel.packet[5]); // 40 50 41 51 42 52                         47 57
-  __m128i t5 =  _mm_unpackhi_epi8(kernel.packet[4], kernel.packet[5]); // 48 58 49 59 4a 5a
-  __m128i t6 =  _mm_unpacklo_epi8(kernel.packet[6], kernel.packet[7]);
-  __m128i t7 =  _mm_unpackhi_epi8(kernel.packet[6], kernel.packet[7]);
-  __m128i t8 =  _mm_unpacklo_epi8(kernel.packet[8], kernel.packet[9]);
-  __m128i t9 =  _mm_unpackhi_epi8(kernel.packet[8], kernel.packet[9]);
-  __m128i ta =  _mm_unpacklo_epi8(kernel.packet[10], kernel.packet[11]);
-  __m128i tb =  _mm_unpackhi_epi8(kernel.packet[10], kernel.packet[11]);
-  __m128i tc =  _mm_unpacklo_epi8(kernel.packet[12], kernel.packet[13]);
-  __m128i td =  _mm_unpackhi_epi8(kernel.packet[12], kernel.packet[13]);
-  __m128i te =  _mm_unpacklo_epi8(kernel.packet[14], kernel.packet[15]);
-  __m128i tf =  _mm_unpackhi_epi8(kernel.packet[14], kernel.packet[15]);
+  __m128i t0 =
+      _mm_unpacklo_epi8(kernel.packet[0], kernel.packet[1]);  // 00 10 01 11 02 12 03 13 04 14 05 15 06 16 07 17
+  __m128i t1 =
+      _mm_unpackhi_epi8(kernel.packet[0], kernel.packet[1]);  // 08 18 09 19 0a 1a 0b 1b 0c 1c 0d 1d 0e 1e 0f 1f
+  __m128i t2 =
+      _mm_unpacklo_epi8(kernel.packet[2], kernel.packet[3]);  // 20 30 21 31 22 32 ...                     27 37
+  __m128i t3 =
+      _mm_unpackhi_epi8(kernel.packet[2], kernel.packet[3]);  // 28 38 29 39 2a 3a ...                     2f 3f
+  __m128i t4 =
+      _mm_unpacklo_epi8(kernel.packet[4], kernel.packet[5]);  // 40 50 41 51 42 52                         47 57
+  __m128i t5 = _mm_unpackhi_epi8(kernel.packet[4], kernel.packet[5]);  // 48 58 49 59 4a 5a
+  __m128i t6 = _mm_unpacklo_epi8(kernel.packet[6], kernel.packet[7]);
+  __m128i t7 = _mm_unpackhi_epi8(kernel.packet[6], kernel.packet[7]);
+  __m128i t8 = _mm_unpacklo_epi8(kernel.packet[8], kernel.packet[9]);
+  __m128i t9 = _mm_unpackhi_epi8(kernel.packet[8], kernel.packet[9]);
+  __m128i ta = _mm_unpacklo_epi8(kernel.packet[10], kernel.packet[11]);
+  __m128i tb = _mm_unpackhi_epi8(kernel.packet[10], kernel.packet[11]);
+  __m128i tc = _mm_unpacklo_epi8(kernel.packet[12], kernel.packet[13]);
+  __m128i td = _mm_unpackhi_epi8(kernel.packet[12], kernel.packet[13]);
+  __m128i te = _mm_unpacklo_epi8(kernel.packet[14], kernel.packet[15]);
+  __m128i tf = _mm_unpackhi_epi8(kernel.packet[14], kernel.packet[15]);
 
-  __m128i s0 =  _mm_unpacklo_epi16(t0, t2); // 00 10 20 30 01 11 21 31 02 12 22 32 03 13 23 33
-  __m128i s1 =  _mm_unpackhi_epi16(t0, t2); // 04 14 24 34
-  __m128i s2 =  _mm_unpacklo_epi16(t1, t3); // 08 18 28 38 ...
-  __m128i s3 =  _mm_unpackhi_epi16(t1, t3); // 0c 1c 2c 3c ...
-  __m128i s4 =  _mm_unpacklo_epi16(t4, t6); // 40 50 60 70 41 51 61 71 42 52 62 72 43 53 63 73
-  __m128i s5 =  _mm_unpackhi_epi16(t4, t6); // 44 54 64 74 ...
-  __m128i s6 =  _mm_unpacklo_epi16(t5, t7);
-  __m128i s7 =  _mm_unpackhi_epi16(t5, t7);
-  __m128i s8 =  _mm_unpacklo_epi16(t8, ta);
-  __m128i s9 =  _mm_unpackhi_epi16(t8, ta);
-  __m128i sa =  _mm_unpacklo_epi16(t9, tb);
-  __m128i sb =  _mm_unpackhi_epi16(t9, tb);
-  __m128i sc =  _mm_unpacklo_epi16(tc, te);
-  __m128i sd =  _mm_unpackhi_epi16(tc, te);
-  __m128i se =  _mm_unpacklo_epi16(td, tf);
-  __m128i sf =  _mm_unpackhi_epi16(td, tf);
+  __m128i s0 = _mm_unpacklo_epi16(t0, t2);  // 00 10 20 30 01 11 21 31 02 12 22 32 03 13 23 33
+  __m128i s1 = _mm_unpackhi_epi16(t0, t2);  // 04 14 24 34
+  __m128i s2 = _mm_unpacklo_epi16(t1, t3);  // 08 18 28 38 ...
+  __m128i s3 = _mm_unpackhi_epi16(t1, t3);  // 0c 1c 2c 3c ...
+  __m128i s4 = _mm_unpacklo_epi16(t4, t6);  // 40 50 60 70 41 51 61 71 42 52 62 72 43 53 63 73
+  __m128i s5 = _mm_unpackhi_epi16(t4, t6);  // 44 54 64 74 ...
+  __m128i s6 = _mm_unpacklo_epi16(t5, t7);
+  __m128i s7 = _mm_unpackhi_epi16(t5, t7);
+  __m128i s8 = _mm_unpacklo_epi16(t8, ta);
+  __m128i s9 = _mm_unpackhi_epi16(t8, ta);
+  __m128i sa = _mm_unpacklo_epi16(t9, tb);
+  __m128i sb = _mm_unpackhi_epi16(t9, tb);
+  __m128i sc = _mm_unpacklo_epi16(tc, te);
+  __m128i sd = _mm_unpackhi_epi16(tc, te);
+  __m128i se = _mm_unpacklo_epi16(td, tf);
+  __m128i sf = _mm_unpackhi_epi16(td, tf);
 
-  __m128i u0 =  _mm_unpacklo_epi32(s0, s4); // 00 10 20 30 40 50 60 70 01 11 21 31 41 51 61 71
-  __m128i u1 =  _mm_unpackhi_epi32(s0, s4); // 02 12 22 32 42 52 62 72 03 13 23 33 43 53 63 73
-  __m128i u2 =  _mm_unpacklo_epi32(s1, s5);
-  __m128i u3 =  _mm_unpackhi_epi32(s1, s5);
-  __m128i u4 =  _mm_unpacklo_epi32(s2, s6);
-  __m128i u5 =  _mm_unpackhi_epi32(s2, s6);
-  __m128i u6 =  _mm_unpacklo_epi32(s3, s7);
-  __m128i u7 =  _mm_unpackhi_epi32(s3, s7);
-  __m128i u8 =  _mm_unpacklo_epi32(s8, sc);
-  __m128i u9 =  _mm_unpackhi_epi32(s8, sc);
-  __m128i ua =  _mm_unpacklo_epi32(s9, sd);
-  __m128i ub =  _mm_unpackhi_epi32(s9, sd);
-  __m128i uc =  _mm_unpacklo_epi32(sa, se);
-  __m128i ud =  _mm_unpackhi_epi32(sa, se);
-  __m128i ue =  _mm_unpacklo_epi32(sb, sf);
-  __m128i uf =  _mm_unpackhi_epi32(sb, sf);
+  __m128i u0 = _mm_unpacklo_epi32(s0, s4);  // 00 10 20 30 40 50 60 70 01 11 21 31 41 51 61 71
+  __m128i u1 = _mm_unpackhi_epi32(s0, s4);  // 02 12 22 32 42 52 62 72 03 13 23 33 43 53 63 73
+  __m128i u2 = _mm_unpacklo_epi32(s1, s5);
+  __m128i u3 = _mm_unpackhi_epi32(s1, s5);
+  __m128i u4 = _mm_unpacklo_epi32(s2, s6);
+  __m128i u5 = _mm_unpackhi_epi32(s2, s6);
+  __m128i u6 = _mm_unpacklo_epi32(s3, s7);
+  __m128i u7 = _mm_unpackhi_epi32(s3, s7);
+  __m128i u8 = _mm_unpacklo_epi32(s8, sc);
+  __m128i u9 = _mm_unpackhi_epi32(s8, sc);
+  __m128i ua = _mm_unpacklo_epi32(s9, sd);
+  __m128i ub = _mm_unpackhi_epi32(s9, sd);
+  __m128i uc = _mm_unpacklo_epi32(sa, se);
+  __m128i ud = _mm_unpackhi_epi32(sa, se);
+  __m128i ue = _mm_unpacklo_epi32(sb, sf);
+  __m128i uf = _mm_unpackhi_epi32(sb, sf);
 
-  kernel.packet[0]  = _mm_unpacklo_epi64(u0, u8);
-  kernel.packet[1]  = _mm_unpackhi_epi64(u0, u8);
-  kernel.packet[2]  = _mm_unpacklo_epi64(u1, u9);
-  kernel.packet[3]  = _mm_unpackhi_epi64(u1, u9);
-  kernel.packet[4]  = _mm_unpacklo_epi64(u2, ua);
-  kernel.packet[5]  = _mm_unpackhi_epi64(u2, ua);
-  kernel.packet[6]  = _mm_unpacklo_epi64(u3, ub);
-  kernel.packet[7]  = _mm_unpackhi_epi64(u3, ub);
-  kernel.packet[8]  = _mm_unpacklo_epi64(u4, uc);
-  kernel.packet[9]  = _mm_unpackhi_epi64(u4, uc);
+  kernel.packet[0] = _mm_unpacklo_epi64(u0, u8);
+  kernel.packet[1] = _mm_unpackhi_epi64(u0, u8);
+  kernel.packet[2] = _mm_unpacklo_epi64(u1, u9);
+  kernel.packet[3] = _mm_unpackhi_epi64(u1, u9);
+  kernel.packet[4] = _mm_unpacklo_epi64(u2, ua);
+  kernel.packet[5] = _mm_unpackhi_epi64(u2, ua);
+  kernel.packet[6] = _mm_unpacklo_epi64(u3, ub);
+  kernel.packet[7] = _mm_unpackhi_epi64(u3, ub);
+  kernel.packet[8] = _mm_unpacklo_epi64(u4, uc);
+  kernel.packet[9] = _mm_unpackhi_epi64(u4, uc);
   kernel.packet[10] = _mm_unpacklo_epi64(u5, ud);
   kernel.packet[11] = _mm_unpackhi_epi64(u5, ud);
   kernel.packet[12] = _mm_unpacklo_epi64(u6, ue);
@@ -1490,7 +1992,9 @@
   kernel.packet[15] = _mm_unpackhi_epi64(u7, uf);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4i pblend(const Selector<4>& ifPacket, const Packet4i& thenPacket, const Packet4i& elsePacket) {
+template <>
+EIGEN_STRONG_INLINE Packet4i pblend(const Selector<4>& ifPacket, const Packet4i& thenPacket,
+                                    const Packet4i& elsePacket) {
   const __m128i zero = _mm_setzero_si128();
   const __m128i select = _mm_set_epi32(ifPacket.select[3], ifPacket.select[2], ifPacket.select[1], ifPacket.select[0]);
   __m128i false_mask = _mm_cmpeq_epi32(select, zero);
@@ -1500,11 +2004,14 @@
   return _mm_or_si128(_mm_andnot_si128(false_mask, thenPacket), _mm_and_si128(false_mask, elsePacket));
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet4ui pblend(const Selector<4>& ifPacket, const Packet4ui& thenPacket,
-                                    const Packet4ui& elsePacket) {
+template <>
+EIGEN_STRONG_INLINE Packet4ui pblend(const Selector<4>& ifPacket, const Packet4ui& thenPacket,
+                                     const Packet4ui& elsePacket) {
   return (Packet4ui)pblend(ifPacket, (Packet4i)thenPacket, (Packet4i)elsePacket);
 }
-template<> EIGEN_STRONG_INLINE Packet4f pblend(const Selector<4>& ifPacket, const Packet4f& thenPacket, const Packet4f& elsePacket) {
+template <>
+EIGEN_STRONG_INLINE Packet4f pblend(const Selector<4>& ifPacket, const Packet4f& thenPacket,
+                                    const Packet4f& elsePacket) {
   const __m128 zero = _mm_setzero_ps();
   const __m128 select = _mm_set_ps(ifPacket.select[3], ifPacket.select[2], ifPacket.select[1], ifPacket.select[0]);
   __m128 false_mask = _mm_cmpeq_ps(select, zero);
@@ -1514,7 +2021,9 @@
   return _mm_or_ps(_mm_andnot_ps(false_mask, thenPacket), _mm_and_ps(false_mask, elsePacket));
 #endif
 }
-template<> EIGEN_STRONG_INLINE Packet2d pblend(const Selector<2>& ifPacket, const Packet2d& thenPacket, const Packet2d& elsePacket) {
+template <>
+EIGEN_STRONG_INLINE Packet2d pblend(const Selector<2>& ifPacket, const Packet2d& thenPacket,
+                                    const Packet2d& elsePacket) {
   const __m128d zero = _mm_setzero_pd();
   const __m128d select = _mm_set_pd(ifPacket.select[1], ifPacket.select[0]);
   __m128d false_mask = _mm_cmpeq_pd(select, zero);
@@ -1527,29 +2036,37 @@
 
 // Scalar path for pmadd with FMA to ensure consistency with vectorized path.
 #ifdef EIGEN_VECTORIZE_FMA
-template<> EIGEN_STRONG_INLINE float pmadd(const float& a, const float& b, const float& c) {
-  return ::fmaf(a,b,c);
+template <>
+EIGEN_STRONG_INLINE float pmadd(const float& a, const float& b, const float& c) {
+  return ::fmaf(a, b, c);
 }
-template<> EIGEN_STRONG_INLINE double pmadd(const double& a, const double& b, const double& c) {
-  return ::fma(a,b,c);
+template <>
+EIGEN_STRONG_INLINE double pmadd(const double& a, const double& b, const double& c) {
+  return ::fma(a, b, c);
 }
-template<> EIGEN_STRONG_INLINE float pmsub(const float& a, const float& b, const float& c) {
-  return ::fmaf(a,b,-c);
+template <>
+EIGEN_STRONG_INLINE float pmsub(const float& a, const float& b, const float& c) {
+  return ::fmaf(a, b, -c);
 }
-template<> EIGEN_STRONG_INLINE double pmsub(const double& a, const double& b, const double& c) {
-  return ::fma(a,b,-c);
+template <>
+EIGEN_STRONG_INLINE double pmsub(const double& a, const double& b, const double& c) {
+  return ::fma(a, b, -c);
 }
-template<> EIGEN_STRONG_INLINE float pnmadd(const float& a, const float& b, const float& c) {
-  return ::fmaf(-a,b,c);
+template <>
+EIGEN_STRONG_INLINE float pnmadd(const float& a, const float& b, const float& c) {
+  return ::fmaf(-a, b, c);
 }
-template<> EIGEN_STRONG_INLINE double pnmadd(const double& a, const double& b, const double& c) {
-  return ::fma(-a,b,c);
+template <>
+EIGEN_STRONG_INLINE double pnmadd(const double& a, const double& b, const double& c) {
+  return ::fma(-a, b, c);
 }
-template<> EIGEN_STRONG_INLINE float pnmsub(const float& a, const float& b, const float& c) {
-  return ::fmaf(-a,b,-c);
+template <>
+EIGEN_STRONG_INLINE float pnmsub(const float& a, const float& b, const float& c) {
+  return ::fmaf(-a, b, -c);
 }
-template<> EIGEN_STRONG_INLINE double pnmsub(const double& a, const double& b, const double& c) {
-  return ::fma(-a,b,-c);
+template <>
+EIGEN_STRONG_INLINE double pnmsub(const double& a, const double& b, const double& c) {
+  return ::fma(-a, b, -c);
 }
 #endif
 
@@ -1571,8 +2088,7 @@
   // Inf/NaN?
   __m128i naninf_mask = _mm_cmpeq_epi32(exp, shifted_exp);
   // Inf/NaN adjust
-  __m128i naninf_adj =
-      _mm_and_si128(_mm_set1_epi32((128 - 16) << 23), naninf_mask);
+  __m128i naninf_adj = _mm_and_si128(_mm_set1_epi32((128 - 16) << 23), naninf_mask);
   // extra exp adjust for  Inf/NaN
   ou = _mm_add_epi32(ou, naninf_adj);
 
@@ -1584,11 +2100,9 @@
   // magic.u = 113 << 23
   __m128i magic = _mm_and_si128(zeroden_mask, _mm_set1_epi32(113 << 23));
   // o.f -= magic.f
-  ou = _mm_castps_si128(
-      _mm_sub_ps(_mm_castsi128_ps(ou), _mm_castsi128_ps(magic)));
+  ou = _mm_castps_si128(_mm_sub_ps(_mm_castsi128_ps(ou), _mm_castsi128_ps(magic)));
 
-  __m128i sign =
-      _mm_slli_epi32(_mm_and_si128(input, _mm_set1_epi32(0x8000)), 16);
+  __m128i sign = _mm_slli_epi32(_mm_and_si128(input, _mm_set1_epi32(0x8000)), 16);
   // o.u |= (h.x & 0x8000) << 16;    // sign bit
   ou = _mm_or_si128(ou, sign);
   // return o.f;
@@ -1622,8 +2136,7 @@
   __m128i naninf_value = _mm_or_si128(inf_value, nan_value);
 
   __m128i denorm_magic = _mm_set1_epi32(((127 - 15) + (23 - 10) + 1) << 23);
-  __m128i subnorm_mask =
-      _mm_cmplt_epi32(_mm_castps_si128(f), _mm_set1_epi32(113 << 23));
+  __m128i subnorm_mask = _mm_cmplt_epi32(_mm_castps_si128(f), _mm_set1_epi32(113 << 23));
   //  f.f += denorm_magic.f;
   f = _mm_add_ps(f, _mm_castsi128_ps(denorm_magic));
   // f.u - denorm_magic.u
@@ -1656,7 +2169,7 @@
 
 // Packet math for Eigen::half
 // Disable the following code since it's broken on too many platforms / compilers.
-//#elif defined(EIGEN_VECTORIZE_SSE) && (!EIGEN_ARCH_x86_64) && (!EIGEN_COMP_MSVC)
+// #elif defined(EIGEN_VECTORIZE_SSE) && (!EIGEN_ARCH_x86_64) && (!EIGEN_COMP_MSVC)
 #if 0
 
 typedef struct {
@@ -1859,19 +2372,18 @@
 
 #endif
 
+}  // end namespace internal
 
-} // end namespace internal
-
-} // end namespace Eigen
+}  // end namespace Eigen
 
 #if EIGEN_COMP_PGI && EIGEN_COMP_PGI < 1900
 // PGI++ does not define the following intrinsics in C++ mode.
-static inline __m128  _mm_castpd_ps   (__m128d x) { return reinterpret_cast<__m128&>(x);  }
+static inline __m128 _mm_castpd_ps(__m128d x) { return reinterpret_cast<__m128&>(x); }
 static inline __m128i _mm_castpd_si128(__m128d x) { return reinterpret_cast<__m128i&>(x); }
-static inline __m128d _mm_castps_pd   (__m128  x) { return reinterpret_cast<__m128d&>(x); }
-static inline __m128i _mm_castps_si128(__m128  x) { return reinterpret_cast<__m128i&>(x); }
-static inline __m128  _mm_castsi128_ps(__m128i x) { return reinterpret_cast<__m128&>(x);  }
+static inline __m128d _mm_castps_pd(__m128 x) { return reinterpret_cast<__m128d&>(x); }
+static inline __m128i _mm_castps_si128(__m128 x) { return reinterpret_cast<__m128i&>(x); }
+static inline __m128 _mm_castsi128_ps(__m128i x) { return reinterpret_cast<__m128&>(x); }
 static inline __m128d _mm_castsi128_pd(__m128i x) { return reinterpret_cast<__m128d&>(x); }
 #endif
 
-#endif // EIGEN_PACKET_MATH_SSE_H
+#endif  // EIGEN_PACKET_MATH_SSE_H
diff --git a/Eigen/src/Core/arch/SSE/TypeCasting.h b/Eigen/src/Core/arch/SSE/TypeCasting.h
index 7e3099b..cbc6d47 100644
--- a/Eigen/src/Core/arch/SSE/TypeCasting.h
+++ b/Eigen/src/Core/arch/SSE/TypeCasting.h
@@ -18,23 +18,29 @@
 namespace internal {
 
 #ifndef EIGEN_VECTORIZE_AVX
-template<> struct type_casting_traits<float, bool> : vectorized_type_casting_traits<float, bool> {};
-template<> struct type_casting_traits<bool, float> : vectorized_type_casting_traits<bool, float> {};
+template <>
+struct type_casting_traits<float, bool> : vectorized_type_casting_traits<float, bool> {};
+template <>
+struct type_casting_traits<bool, float> : vectorized_type_casting_traits<bool, float> {};
 
-template<> struct type_casting_traits<float, int> : vectorized_type_casting_traits<float, int> {};
-template<> struct type_casting_traits<int, float> : vectorized_type_casting_traits<int, float> {};
+template <>
+struct type_casting_traits<float, int> : vectorized_type_casting_traits<float, int> {};
+template <>
+struct type_casting_traits<int, float> : vectorized_type_casting_traits<int, float> {};
 
-template<> struct type_casting_traits<float, double> : vectorized_type_casting_traits<float, double> {};
-template<> struct type_casting_traits<double, float> : vectorized_type_casting_traits<double, float> {};
+template <>
+struct type_casting_traits<float, double> : vectorized_type_casting_traits<float, double> {};
+template <>
+struct type_casting_traits<double, float> : vectorized_type_casting_traits<double, float> {};
 
-template<> struct type_casting_traits<double, int> : vectorized_type_casting_traits<double, int> {};
-template<> struct type_casting_traits<int, double> : vectorized_type_casting_traits<int, double> {};
+template <>
+struct type_casting_traits<double, int> : vectorized_type_casting_traits<double, int> {};
+template <>
+struct type_casting_traits<int, double> : vectorized_type_casting_traits<int, double> {};
 #endif
 
 template <>
-EIGEN_STRONG_INLINE Packet16b pcast<Packet4f, Packet16b>(const Packet4f& a,
-                                                         const Packet4f& b,
-                                                         const Packet4f& c,
+EIGEN_STRONG_INLINE Packet16b pcast<Packet4f, Packet16b>(const Packet4f& a, const Packet4f& b, const Packet4f& c,
                                                          const Packet4f& d) {
   __m128 zero = pzero(a);
   __m128 nonzero_a = _mm_cmpneq_ps(a, zero);
@@ -50,79 +56,92 @@
 template <>
 EIGEN_STRONG_INLINE Packet4f pcast<Packet16b, Packet4f>(const Packet16b& a) {
   const __m128 cst_one = _mm_set_ps1(1.0f);
-  #ifdef EIGEN_VECTORIZE_SSE4_1
+#ifdef EIGEN_VECTORIZE_SSE4_1
   __m128i a_extended = _mm_cvtepi8_epi32(a);
   __m128i abcd = _mm_cmpeq_epi32(a_extended, _mm_setzero_si128());
-  #else
+#else
   __m128i abcd_efhg_ijkl_mnop = _mm_cmpeq_epi8(a, _mm_setzero_si128());
   __m128i aabb_ccdd_eeff_gghh = _mm_unpacklo_epi8(abcd_efhg_ijkl_mnop, abcd_efhg_ijkl_mnop);
   __m128i abcd = _mm_unpacklo_epi8(aabb_ccdd_eeff_gghh, aabb_ccdd_eeff_gghh);
-  #endif
+#endif
   __m128 result = _mm_andnot_ps(_mm_castsi128_ps(abcd), cst_one);
   return result;
 }
 
-template<> EIGEN_STRONG_INLINE Packet4i pcast<Packet4f, Packet4i>(const Packet4f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4i pcast<Packet4f, Packet4i>(const Packet4f& a) {
   return _mm_cvttps_epi32(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4i pcast<Packet2d, Packet4i>(const Packet2d& a, const Packet2d& b) {
-  return _mm_castps_si128(_mm_shuffle_ps(_mm_castsi128_ps(_mm_cvttpd_epi32(a)),
-                                         _mm_castsi128_ps(_mm_cvttpd_epi32(b)),
+template <>
+EIGEN_STRONG_INLINE Packet4i pcast<Packet2d, Packet4i>(const Packet2d& a, const Packet2d& b) {
+  return _mm_castps_si128(_mm_shuffle_ps(_mm_castsi128_ps(_mm_cvttpd_epi32(a)), _mm_castsi128_ps(_mm_cvttpd_epi32(b)),
                                          (1 << 2) | (1 << 6)));
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pcast<Packet4i, Packet4f>(const Packet4i& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4f pcast<Packet4i, Packet4f>(const Packet4i& a) {
   return _mm_cvtepi32_ps(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pcast<Packet2d, Packet4f>(const Packet2d& a, const Packet2d& b) {
+template <>
+EIGEN_STRONG_INLINE Packet4f pcast<Packet2d, Packet4f>(const Packet2d& a, const Packet2d& b) {
   return _mm_shuffle_ps(_mm_cvtpd_ps(a), _mm_cvtpd_ps(b), (1 << 2) | (1 << 6));
 }
 
-template<> EIGEN_STRONG_INLINE Packet2d pcast<Packet4i, Packet2d>(const Packet4i& a) {
+template <>
+EIGEN_STRONG_INLINE Packet2d pcast<Packet4i, Packet2d>(const Packet4i& a) {
   // Simply discard the second half of the input
   return _mm_cvtepi32_pd(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2d pcast<Packet4f, Packet2d>(const Packet4f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet2d pcast<Packet4f, Packet2d>(const Packet4f& a) {
   // Simply discard the second half of the input
   return _mm_cvtps_pd(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2d preinterpret<Packet2d, Packet4f>(const Packet4f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet2d preinterpret<Packet2d, Packet4f>(const Packet4f& a) {
   return _mm_castps_pd(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f preinterpret<Packet4f, Packet2d>(const Packet2d& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4f preinterpret<Packet4f, Packet2d>(const Packet2d& a) {
   return _mm_castpd_ps(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4i preinterpret<Packet4i,Packet4f>(const Packet4f& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4i preinterpret<Packet4i, Packet4f>(const Packet4f& a) {
   return _mm_castps_si128(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f preinterpret<Packet4f,Packet4i>(const Packet4i& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4f preinterpret<Packet4f, Packet4i>(const Packet4i& a) {
   return _mm_castsi128_ps(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2d preinterpret<Packet2d,Packet4i>(const Packet4i& a) {
+template <>
+EIGEN_STRONG_INLINE Packet2d preinterpret<Packet2d, Packet4i>(const Packet4i& a) {
   return _mm_castsi128_pd(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4i preinterpret<Packet4i,Packet2d>(const Packet2d& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4i preinterpret<Packet4i, Packet2d>(const Packet2d& a) {
   return _mm_castpd_si128(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4ui preinterpret<Packet4ui, Packet4i>(const Packet4i& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4ui preinterpret<Packet4ui, Packet4i>(const Packet4i& a) {
   return Packet4ui(a);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4i preinterpret<Packet4i, Packet4ui>(const Packet4ui& a) {
+template <>
+EIGEN_STRONG_INLINE Packet4i preinterpret<Packet4i, Packet4ui>(const Packet4ui& a) {
   return Packet4i(a);
 }
 // Disable the following code since it's broken on too many platforms / compilers.
-//#elif defined(EIGEN_VECTORIZE_SSE) && (!EIGEN_ARCH_x86_64) && (!EIGEN_COMP_MSVC)
+// #elif defined(EIGEN_VECTORIZE_SSE) && (!EIGEN_ARCH_x86_64) && (!EIGEN_COMP_MSVC)
 #if 0
 
 template <>
@@ -171,8 +190,8 @@
 
 #endif
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_TYPE_CASTING_SSE_H
+#endif  // EIGEN_TYPE_CASTING_SSE_H
diff --git a/Eigen/src/Core/arch/SVE/PacketMath.h b/Eigen/src/Core/arch/SVE/PacketMath.h
index 64b710f..6a03de9 100644
--- a/Eigen/src/Core/arch/SVE/PacketMath.h
+++ b/Eigen/src/Core/arch/SVE/PacketMath.h
@@ -13,10 +13,8 @@
 // IWYU pragma: private
 #include "../../InternalHeaderCheck.h"
 
-namespace Eigen
-{
-namespace internal
-{
+namespace Eigen {
+namespace internal {
 #ifndef EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD
 #define EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD 8
 #endif
@@ -75,174 +73,146 @@
 };
 
 template <>
-EIGEN_STRONG_INLINE void prefetch<numext::int32_t>(const numext::int32_t* addr)
-{
+EIGEN_STRONG_INLINE void prefetch<numext::int32_t>(const numext::int32_t* addr) {
   svprfw(svptrue_b32(), addr, SV_PLDL1KEEP);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXi pset1<PacketXi>(const numext::int32_t& from)
-{
+EIGEN_STRONG_INLINE PacketXi pset1<PacketXi>(const numext::int32_t& from) {
   return svdup_n_s32(from);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXi plset<PacketXi>(const numext::int32_t& a)
-{
+EIGEN_STRONG_INLINE PacketXi plset<PacketXi>(const numext::int32_t& a) {
   numext::int32_t c[packet_traits<numext::int32_t>::size];
   for (int i = 0; i < packet_traits<numext::int32_t>::size; i++) c[i] = i;
   return svadd_s32_z(svptrue_b32(), pset1<PacketXi>(a), svld1_s32(svptrue_b32(), c));
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXi padd<PacketXi>(const PacketXi& a, const PacketXi& b)
-{
+EIGEN_STRONG_INLINE PacketXi padd<PacketXi>(const PacketXi& a, const PacketXi& b) {
   return svadd_s32_z(svptrue_b32(), a, b);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXi psub<PacketXi>(const PacketXi& a, const PacketXi& b)
-{
+EIGEN_STRONG_INLINE PacketXi psub<PacketXi>(const PacketXi& a, const PacketXi& b) {
   return svsub_s32_z(svptrue_b32(), a, b);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXi pnegate(const PacketXi& a)
-{
+EIGEN_STRONG_INLINE PacketXi pnegate(const PacketXi& a) {
   return svneg_s32_z(svptrue_b32(), a);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXi pconj(const PacketXi& a)
-{
+EIGEN_STRONG_INLINE PacketXi pconj(const PacketXi& a) {
   return a;
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXi pmul<PacketXi>(const PacketXi& a, const PacketXi& b)
-{
+EIGEN_STRONG_INLINE PacketXi pmul<PacketXi>(const PacketXi& a, const PacketXi& b) {
   return svmul_s32_z(svptrue_b32(), a, b);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXi pdiv<PacketXi>(const PacketXi& a, const PacketXi& b)
-{
+EIGEN_STRONG_INLINE PacketXi pdiv<PacketXi>(const PacketXi& a, const PacketXi& b) {
   return svdiv_s32_z(svptrue_b32(), a, b);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXi pmadd(const PacketXi& a, const PacketXi& b, const PacketXi& c)
-{
+EIGEN_STRONG_INLINE PacketXi pmadd(const PacketXi& a, const PacketXi& b, const PacketXi& c) {
   return svmla_s32_z(svptrue_b32(), c, a, b);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXi pmin<PacketXi>(const PacketXi& a, const PacketXi& b)
-{
+EIGEN_STRONG_INLINE PacketXi pmin<PacketXi>(const PacketXi& a, const PacketXi& b) {
   return svmin_s32_z(svptrue_b32(), a, b);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXi pmax<PacketXi>(const PacketXi& a, const PacketXi& b)
-{
+EIGEN_STRONG_INLINE PacketXi pmax<PacketXi>(const PacketXi& a, const PacketXi& b) {
   return svmax_s32_z(svptrue_b32(), a, b);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXi pcmp_le<PacketXi>(const PacketXi& a, const PacketXi& b)
-{
+EIGEN_STRONG_INLINE PacketXi pcmp_le<PacketXi>(const PacketXi& a, const PacketXi& b) {
   return svdup_n_s32_z(svcmple_s32(svptrue_b32(), a, b), 0xffffffffu);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXi pcmp_lt<PacketXi>(const PacketXi& a, const PacketXi& b)
-{
+EIGEN_STRONG_INLINE PacketXi pcmp_lt<PacketXi>(const PacketXi& a, const PacketXi& b) {
   return svdup_n_s32_z(svcmplt_s32(svptrue_b32(), a, b), 0xffffffffu);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXi pcmp_eq<PacketXi>(const PacketXi& a, const PacketXi& b)
-{
+EIGEN_STRONG_INLINE PacketXi pcmp_eq<PacketXi>(const PacketXi& a, const PacketXi& b) {
   return svdup_n_s32_z(svcmpeq_s32(svptrue_b32(), a, b), 0xffffffffu);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXi ptrue<PacketXi>(const PacketXi& /*a*/)
-{
+EIGEN_STRONG_INLINE PacketXi ptrue<PacketXi>(const PacketXi& /*a*/) {
   return svdup_n_s32_z(svptrue_b32(), 0xffffffffu);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXi pzero<PacketXi>(const PacketXi& /*a*/)
-{
+EIGEN_STRONG_INLINE PacketXi pzero<PacketXi>(const PacketXi& /*a*/) {
   return svdup_n_s32_z(svptrue_b32(), 0);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXi pand<PacketXi>(const PacketXi& a, const PacketXi& b)
-{
+EIGEN_STRONG_INLINE PacketXi pand<PacketXi>(const PacketXi& a, const PacketXi& b) {
   return svand_s32_z(svptrue_b32(), a, b);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXi por<PacketXi>(const PacketXi& a, const PacketXi& b)
-{
+EIGEN_STRONG_INLINE PacketXi por<PacketXi>(const PacketXi& a, const PacketXi& b) {
   return svorr_s32_z(svptrue_b32(), a, b);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXi pxor<PacketXi>(const PacketXi& a, const PacketXi& b)
-{
+EIGEN_STRONG_INLINE PacketXi pxor<PacketXi>(const PacketXi& a, const PacketXi& b) {
   return sveor_s32_z(svptrue_b32(), a, b);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXi pandnot<PacketXi>(const PacketXi& a, const PacketXi& b)
-{
+EIGEN_STRONG_INLINE PacketXi pandnot<PacketXi>(const PacketXi& a, const PacketXi& b) {
   return svbic_s32_z(svptrue_b32(), a, b);
 }
 
 template <int N>
-EIGEN_STRONG_INLINE PacketXi parithmetic_shift_right(PacketXi a)
-{
+EIGEN_STRONG_INLINE PacketXi parithmetic_shift_right(PacketXi a) {
   return svasrd_n_s32_z(svptrue_b32(), a, N);
 }
 
 template <int N>
-EIGEN_STRONG_INLINE PacketXi plogical_shift_right(PacketXi a)
-{
+EIGEN_STRONG_INLINE PacketXi plogical_shift_right(PacketXi a) {
   return svreinterpret_s32_u32(svlsr_n_u32_z(svptrue_b32(), svreinterpret_u32_s32(a), N));
 }
 
 template <int N>
-EIGEN_STRONG_INLINE PacketXi plogical_shift_left(PacketXi a)
-{
+EIGEN_STRONG_INLINE PacketXi plogical_shift_left(PacketXi a) {
   return svlsl_n_s32_z(svptrue_b32(), a, N);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXi pload<PacketXi>(const numext::int32_t* from)
-{
+EIGEN_STRONG_INLINE PacketXi pload<PacketXi>(const numext::int32_t* from) {
   EIGEN_DEBUG_ALIGNED_LOAD return svld1_s32(svptrue_b32(), from);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXi ploadu<PacketXi>(const numext::int32_t* from)
-{
+EIGEN_STRONG_INLINE PacketXi ploadu<PacketXi>(const numext::int32_t* from) {
   EIGEN_DEBUG_UNALIGNED_LOAD return svld1_s32(svptrue_b32(), from);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXi ploaddup<PacketXi>(const numext::int32_t* from)
-{
+EIGEN_STRONG_INLINE PacketXi ploaddup<PacketXi>(const numext::int32_t* from) {
   svuint32_t indices = svindex_u32(0, 1);  // index {base=0, base+step=1, base+step*2, ...}
   indices = svzip1_u32(indices, indices);  // index in the format {a0, a0, a1, a1, a2, a2, ...}
   return svld1_gather_u32index_s32(svptrue_b32(), from, indices);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXi ploadquad<PacketXi>(const numext::int32_t* from)
-{
+EIGEN_STRONG_INLINE PacketXi ploadquad<PacketXi>(const numext::int32_t* from) {
   svuint32_t indices = svindex_u32(0, 1);  // index {base=0, base+step=1, base+step*2, ...}
   indices = svzip1_u32(indices, indices);  // index in the format {a0, a0, a1, a1, a2, a2, ...}
   indices = svzip1_u32(indices, indices);  // index in the format {a0, a0, a0, a0, a1, a1, a1, a1, ...}
@@ -250,63 +220,54 @@
 }
 
 template <>
-EIGEN_STRONG_INLINE void pstore<numext::int32_t>(numext::int32_t* to, const PacketXi& from)
-{
+EIGEN_STRONG_INLINE void pstore<numext::int32_t>(numext::int32_t* to, const PacketXi& from) {
   EIGEN_DEBUG_ALIGNED_STORE svst1_s32(svptrue_b32(), to, from);
 }
 
 template <>
-EIGEN_STRONG_INLINE void pstoreu<numext::int32_t>(numext::int32_t* to, const PacketXi& from)
-{
+EIGEN_STRONG_INLINE void pstoreu<numext::int32_t>(numext::int32_t* to, const PacketXi& from) {
   EIGEN_DEBUG_UNALIGNED_STORE svst1_s32(svptrue_b32(), to, from);
 }
 
 template <>
-EIGEN_DEVICE_FUNC inline PacketXi pgather<numext::int32_t, PacketXi>(const numext::int32_t* from, Index stride)
-{
+EIGEN_DEVICE_FUNC inline PacketXi pgather<numext::int32_t, PacketXi>(const numext::int32_t* from, Index stride) {
   // Indice format: {base=0, base+stride, base+stride*2, base+stride*3, ...}
   svint32_t indices = svindex_s32(0, stride);
   return svld1_gather_s32index_s32(svptrue_b32(), from, indices);
 }
 
 template <>
-EIGEN_DEVICE_FUNC inline void pscatter<numext::int32_t, PacketXi>(numext::int32_t* to, const PacketXi& from, Index stride)
-{
+EIGEN_DEVICE_FUNC inline void pscatter<numext::int32_t, PacketXi>(numext::int32_t* to, const PacketXi& from,
+                                                                  Index stride) {
   // Indice format: {base=0, base+stride, base+stride*2, base+stride*3, ...}
   svint32_t indices = svindex_s32(0, stride);
   svst1_scatter_s32index_s32(svptrue_b32(), to, indices, from);
 }
 
 template <>
-EIGEN_STRONG_INLINE numext::int32_t pfirst<PacketXi>(const PacketXi& a)
-{
+EIGEN_STRONG_INLINE numext::int32_t pfirst<PacketXi>(const PacketXi& a) {
   // svlasta returns the first element if all predicate bits are 0
   return svlasta_s32(svpfalse_b(), a);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXi preverse(const PacketXi& a)
-{
+EIGEN_STRONG_INLINE PacketXi preverse(const PacketXi& a) {
   return svrev_s32(a);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXi pabs(const PacketXi& a)
-{
+EIGEN_STRONG_INLINE PacketXi pabs(const PacketXi& a) {
   return svabs_s32_z(svptrue_b32(), a);
 }
 
 template <>
-EIGEN_STRONG_INLINE numext::int32_t predux<PacketXi>(const PacketXi& a)
-{
+EIGEN_STRONG_INLINE numext::int32_t predux<PacketXi>(const PacketXi& a) {
   return static_cast<numext::int32_t>(svaddv_s32(svptrue_b32(), a));
 }
 
 template <>
-EIGEN_STRONG_INLINE numext::int32_t predux_mul<PacketXi>(const PacketXi& a)
-{
-  EIGEN_STATIC_ASSERT((EIGEN_ARM64_SVE_VL % 128 == 0),
-                      EIGEN_INTERNAL_ERROR_PLEASE_FILE_A_BUG_REPORT);
+EIGEN_STRONG_INLINE numext::int32_t predux_mul<PacketXi>(const PacketXi& a) {
+  EIGEN_STATIC_ASSERT((EIGEN_ARM64_SVE_VL % 128 == 0), EIGEN_INTERNAL_ERROR_PLEASE_FILE_A_BUG_REPORT);
 
   // Multiply the vector by its reverse
   svint32_t prod = svmul_s32_z(svptrue_b32(), a, svrev_s32(a));
@@ -338,14 +299,12 @@
 }
 
 template <>
-EIGEN_STRONG_INLINE numext::int32_t predux_min<PacketXi>(const PacketXi& a)
-{
+EIGEN_STRONG_INLINE numext::int32_t predux_min<PacketXi>(const PacketXi& a) {
   return svminv_s32(svptrue_b32(), a);
 }
 
 template <>
-EIGEN_STRONG_INLINE numext::int32_t predux_max<PacketXi>(const PacketXi& a)
-{
+EIGEN_STRONG_INLINE numext::int32_t predux_max<PacketXi>(const PacketXi& a) {
   return svmaxv_s32(svptrue_b32(), a);
 }
 
@@ -422,120 +381,101 @@
 };
 
 template <>
-EIGEN_STRONG_INLINE PacketXf pset1<PacketXf>(const float& from)
-{
+EIGEN_STRONG_INLINE PacketXf pset1<PacketXf>(const float& from) {
   return svdup_n_f32(from);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXf pset1frombits<PacketXf>(numext::uint32_t from)
-{
+EIGEN_STRONG_INLINE PacketXf pset1frombits<PacketXf>(numext::uint32_t from) {
   return svreinterpret_f32_u32(svdup_n_u32_z(svptrue_b32(), from));
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXf plset<PacketXf>(const float& a)
-{
+EIGEN_STRONG_INLINE PacketXf plset<PacketXf>(const float& a) {
   float c[packet_traits<float>::size];
   for (int i = 0; i < packet_traits<float>::size; i++) c[i] = i;
   return svadd_f32_z(svptrue_b32(), pset1<PacketXf>(a), svld1_f32(svptrue_b32(), c));
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXf padd<PacketXf>(const PacketXf& a, const PacketXf& b)
-{
+EIGEN_STRONG_INLINE PacketXf padd<PacketXf>(const PacketXf& a, const PacketXf& b) {
   return svadd_f32_z(svptrue_b32(), a, b);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXf psub<PacketXf>(const PacketXf& a, const PacketXf& b)
-{
+EIGEN_STRONG_INLINE PacketXf psub<PacketXf>(const PacketXf& a, const PacketXf& b) {
   return svsub_f32_z(svptrue_b32(), a, b);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXf pnegate(const PacketXf& a)
-{
+EIGEN_STRONG_INLINE PacketXf pnegate(const PacketXf& a) {
   return svneg_f32_z(svptrue_b32(), a);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXf pconj(const PacketXf& a)
-{
+EIGEN_STRONG_INLINE PacketXf pconj(const PacketXf& a) {
   return a;
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXf pmul<PacketXf>(const PacketXf& a, const PacketXf& b)
-{
+EIGEN_STRONG_INLINE PacketXf pmul<PacketXf>(const PacketXf& a, const PacketXf& b) {
   return svmul_f32_z(svptrue_b32(), a, b);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXf pdiv<PacketXf>(const PacketXf& a, const PacketXf& b)
-{
+EIGEN_STRONG_INLINE PacketXf pdiv<PacketXf>(const PacketXf& a, const PacketXf& b) {
   return svdiv_f32_z(svptrue_b32(), a, b);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXf pmadd(const PacketXf& a, const PacketXf& b, const PacketXf& c)
-{
+EIGEN_STRONG_INLINE PacketXf pmadd(const PacketXf& a, const PacketXf& b, const PacketXf& c) {
   return svmla_f32_z(svptrue_b32(), c, a, b);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXf pmin<PacketXf>(const PacketXf& a, const PacketXf& b)
-{
+EIGEN_STRONG_INLINE PacketXf pmin<PacketXf>(const PacketXf& a, const PacketXf& b) {
   return svmin_f32_z(svptrue_b32(), a, b);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXf pmin<PropagateNaN, PacketXf>(const PacketXf& a, const PacketXf& b)
-{
+EIGEN_STRONG_INLINE PacketXf pmin<PropagateNaN, PacketXf>(const PacketXf& a, const PacketXf& b) {
   return pmin<PacketXf>(a, b);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXf pmin<PropagateNumbers, PacketXf>(const PacketXf& a, const PacketXf& b)
-{
+EIGEN_STRONG_INLINE PacketXf pmin<PropagateNumbers, PacketXf>(const PacketXf& a, const PacketXf& b) {
   return svminnm_f32_z(svptrue_b32(), a, b);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXf pmax<PacketXf>(const PacketXf& a, const PacketXf& b)
-{
+EIGEN_STRONG_INLINE PacketXf pmax<PacketXf>(const PacketXf& a, const PacketXf& b) {
   return svmax_f32_z(svptrue_b32(), a, b);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXf pmax<PropagateNaN, PacketXf>(const PacketXf& a, const PacketXf& b)
-{
+EIGEN_STRONG_INLINE PacketXf pmax<PropagateNaN, PacketXf>(const PacketXf& a, const PacketXf& b) {
   return pmax<PacketXf>(a, b);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXf pmax<PropagateNumbers, PacketXf>(const PacketXf& a, const PacketXf& b)
-{
+EIGEN_STRONG_INLINE PacketXf pmax<PropagateNumbers, PacketXf>(const PacketXf& a, const PacketXf& b) {
   return svmaxnm_f32_z(svptrue_b32(), a, b);
 }
 
 // Float comparisons in SVE return svbool (predicate). Use svdup to set active
 // lanes to 1 (0xffffffffu) and inactive lanes to 0.
 template <>
-EIGEN_STRONG_INLINE PacketXf pcmp_le<PacketXf>(const PacketXf& a, const PacketXf& b)
-{
+EIGEN_STRONG_INLINE PacketXf pcmp_le<PacketXf>(const PacketXf& a, const PacketXf& b) {
   return svreinterpret_f32_u32(svdup_n_u32_z(svcmple_f32(svptrue_b32(), a, b), 0xffffffffu));
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXf pcmp_lt<PacketXf>(const PacketXf& a, const PacketXf& b)
-{
+EIGEN_STRONG_INLINE PacketXf pcmp_lt<PacketXf>(const PacketXf& a, const PacketXf& b) {
   return svreinterpret_f32_u32(svdup_n_u32_z(svcmplt_f32(svptrue_b32(), a, b), 0xffffffffu));
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXf pcmp_eq<PacketXf>(const PacketXf& a, const PacketXf& b)
-{
+EIGEN_STRONG_INLINE PacketXf pcmp_eq<PacketXf>(const PacketXf& a, const PacketXf& b) {
   return svreinterpret_f32_u32(svdup_n_u32_z(svcmpeq_f32(svptrue_b32(), a, b), 0xffffffffu));
 }
 
@@ -543,71 +483,60 @@
 // greater/equal comparison (svcmpge_f32). Then fill a float vector with the
 // active elements.
 template <>
-EIGEN_STRONG_INLINE PacketXf pcmp_lt_or_nan<PacketXf>(const PacketXf& a, const PacketXf& b)
-{
+EIGEN_STRONG_INLINE PacketXf pcmp_lt_or_nan<PacketXf>(const PacketXf& a, const PacketXf& b) {
   return svreinterpret_f32_u32(svdup_n_u32_z(svnot_b_z(svptrue_b32(), svcmpge_f32(svptrue_b32(), a, b)), 0xffffffffu));
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXf pfloor<PacketXf>(const PacketXf& a)
-{
+EIGEN_STRONG_INLINE PacketXf pfloor<PacketXf>(const PacketXf& a) {
   return svrintm_f32_z(svptrue_b32(), a);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXf ptrue<PacketXf>(const PacketXf& /*a*/)
-{
+EIGEN_STRONG_INLINE PacketXf ptrue<PacketXf>(const PacketXf& /*a*/) {
   return svreinterpret_f32_u32(svdup_n_u32_z(svptrue_b32(), 0xffffffffu));
 }
 
 // Logical Operations are not supported for float, so reinterpret casts
 template <>
-EIGEN_STRONG_INLINE PacketXf pand<PacketXf>(const PacketXf& a, const PacketXf& b)
-{
+EIGEN_STRONG_INLINE PacketXf pand<PacketXf>(const PacketXf& a, const PacketXf& b) {
   return svreinterpret_f32_u32(svand_u32_z(svptrue_b32(), svreinterpret_u32_f32(a), svreinterpret_u32_f32(b)));
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXf por<PacketXf>(const PacketXf& a, const PacketXf& b)
-{
+EIGEN_STRONG_INLINE PacketXf por<PacketXf>(const PacketXf& a, const PacketXf& b) {
   return svreinterpret_f32_u32(svorr_u32_z(svptrue_b32(), svreinterpret_u32_f32(a), svreinterpret_u32_f32(b)));
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXf pxor<PacketXf>(const PacketXf& a, const PacketXf& b)
-{
+EIGEN_STRONG_INLINE PacketXf pxor<PacketXf>(const PacketXf& a, const PacketXf& b) {
   return svreinterpret_f32_u32(sveor_u32_z(svptrue_b32(), svreinterpret_u32_f32(a), svreinterpret_u32_f32(b)));
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXf pandnot<PacketXf>(const PacketXf& a, const PacketXf& b)
-{
+EIGEN_STRONG_INLINE PacketXf pandnot<PacketXf>(const PacketXf& a, const PacketXf& b) {
   return svreinterpret_f32_u32(svbic_u32_z(svptrue_b32(), svreinterpret_u32_f32(a), svreinterpret_u32_f32(b)));
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXf pload<PacketXf>(const float* from)
-{
+EIGEN_STRONG_INLINE PacketXf pload<PacketXf>(const float* from) {
   EIGEN_DEBUG_ALIGNED_LOAD return svld1_f32(svptrue_b32(), from);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXf ploadu<PacketXf>(const float* from)
-{
+EIGEN_STRONG_INLINE PacketXf ploadu<PacketXf>(const float* from) {
   EIGEN_DEBUG_UNALIGNED_LOAD return svld1_f32(svptrue_b32(), from);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXf ploaddup<PacketXf>(const float* from)
-{
+EIGEN_STRONG_INLINE PacketXf ploaddup<PacketXf>(const float* from) {
   svuint32_t indices = svindex_u32(0, 1);  // index {base=0, base+step=1, base+step*2, ...}
   indices = svzip1_u32(indices, indices);  // index in the format {a0, a0, a1, a1, a2, a2, ...}
   return svld1_gather_u32index_f32(svptrue_b32(), from, indices);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXf ploadquad<PacketXf>(const float* from)
-{
+EIGEN_STRONG_INLINE PacketXf ploadquad<PacketXf>(const float* from) {
   svuint32_t indices = svindex_u32(0, 1);  // index {base=0, base+step=1, base+step*2, ...}
   indices = svzip1_u32(indices, indices);  // index in the format {a0, a0, a1, a1, a2, a2, ...}
   indices = svzip1_u32(indices, indices);  // index in the format {a0, a0, a0, a0, a1, a1, a1, a1, ...}
@@ -615,63 +544,54 @@
 }
 
 template <>
-EIGEN_STRONG_INLINE void pstore<float>(float* to, const PacketXf& from)
-{
+EIGEN_STRONG_INLINE void pstore<float>(float* to, const PacketXf& from) {
   EIGEN_DEBUG_ALIGNED_STORE svst1_f32(svptrue_b32(), to, from);
 }
 
 template <>
-EIGEN_STRONG_INLINE void pstoreu<float>(float* to, const PacketXf& from)
-{
+EIGEN_STRONG_INLINE void pstoreu<float>(float* to, const PacketXf& from) {
   EIGEN_DEBUG_UNALIGNED_STORE svst1_f32(svptrue_b32(), to, from);
 }
 
 template <>
-EIGEN_DEVICE_FUNC inline PacketXf pgather<float, PacketXf>(const float* from, Index stride)
-{
+EIGEN_DEVICE_FUNC inline PacketXf pgather<float, PacketXf>(const float* from, Index stride) {
   // Indice format: {base=0, base+stride, base+stride*2, base+stride*3, ...}
   svint32_t indices = svindex_s32(0, stride);
   return svld1_gather_s32index_f32(svptrue_b32(), from, indices);
 }
 
 template <>
-EIGEN_DEVICE_FUNC inline void pscatter<float, PacketXf>(float* to, const PacketXf& from, Index stride)
-{
+EIGEN_DEVICE_FUNC inline void pscatter<float, PacketXf>(float* to, const PacketXf& from, Index stride) {
   // Indice format: {base=0, base+stride, base+stride*2, base+stride*3, ...}
   svint32_t indices = svindex_s32(0, stride);
   svst1_scatter_s32index_f32(svptrue_b32(), to, indices, from);
 }
 
 template <>
-EIGEN_STRONG_INLINE float pfirst<PacketXf>(const PacketXf& a)
-{
+EIGEN_STRONG_INLINE float pfirst<PacketXf>(const PacketXf& a) {
   // svlasta returns the first element if all predicate bits are 0
   return svlasta_f32(svpfalse_b(), a);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXf preverse(const PacketXf& a)
-{
+EIGEN_STRONG_INLINE PacketXf preverse(const PacketXf& a) {
   return svrev_f32(a);
 }
 
 template <>
-EIGEN_STRONG_INLINE PacketXf pabs(const PacketXf& a)
-{
+EIGEN_STRONG_INLINE PacketXf pabs(const PacketXf& a) {
   return svabs_f32_z(svptrue_b32(), a);
 }
 
-// TODO(tellenbach): Should this go into MathFunctions.h? If so, change for 
+// TODO(tellenbach): Should this go into MathFunctions.h? If so, change for
 // all vector extensions and the generic version.
 template <>
-EIGEN_STRONG_INLINE PacketXf pfrexp<PacketXf>(const PacketXf& a, PacketXf& exponent)
-{
+EIGEN_STRONG_INLINE PacketXf pfrexp<PacketXf>(const PacketXf& a, PacketXf& exponent) {
   return pfrexp_generic(a, exponent);
 }
 
 template <>
-EIGEN_STRONG_INLINE float predux<PacketXf>(const PacketXf& a)
-{
+EIGEN_STRONG_INLINE float predux<PacketXf>(const PacketXf& a) {
   return svaddv_f32(svptrue_b32(), a);
 }
 
@@ -679,10 +599,8 @@
 // mul
 // Only works for SVE Vls multiple of 128
 template <>
-EIGEN_STRONG_INLINE float predux_mul<PacketXf>(const PacketXf& a)
-{
-  EIGEN_STATIC_ASSERT((EIGEN_ARM64_SVE_VL % 128 == 0),
-                      EIGEN_INTERNAL_ERROR_PLEASE_FILE_A_BUG_REPORT);
+EIGEN_STRONG_INLINE float predux_mul<PacketXf>(const PacketXf& a) {
+  EIGEN_STATIC_ASSERT((EIGEN_ARM64_SVE_VL % 128 == 0), EIGEN_INTERNAL_ERROR_PLEASE_FILE_A_BUG_REPORT);
   // Multiply the vector by its reverse
   svfloat32_t prod = svmul_f32_z(svptrue_b32(), a, svrev_f32(a));
   svfloat32_t half_prod;
@@ -713,20 +631,17 @@
 }
 
 template <>
-EIGEN_STRONG_INLINE float predux_min<PacketXf>(const PacketXf& a)
-{
+EIGEN_STRONG_INLINE float predux_min<PacketXf>(const PacketXf& a) {
   return svminv_f32(svptrue_b32(), a);
 }
 
 template <>
-EIGEN_STRONG_INLINE float predux_max<PacketXf>(const PacketXf& a)
-{
+EIGEN_STRONG_INLINE float predux_max<PacketXf>(const PacketXf& a) {
   return svmaxv_f32(svptrue_b32(), a);
 }
 
-template<int N>
-EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<PacketXf, N>& kernel)
-{
+template <int N>
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<PacketXf, N>& kernel) {
   float buffer[packet_traits<float>::size * N] = {0};
   int i = 0;
 
@@ -741,9 +656,8 @@
   }
 }
 
-template<>
-EIGEN_STRONG_INLINE PacketXf pldexp<PacketXf>(const PacketXf& a, const PacketXf& exponent)
-{
+template <>
+EIGEN_STRONG_INLINE PacketXf pldexp<PacketXf>(const PacketXf& a, const PacketXf& exponent) {
   return pldexp_generic(a, exponent);
 }
 
diff --git a/Eigen/src/Core/arch/SVE/TypeCasting.h b/Eigen/src/Core/arch/SVE/TypeCasting.h
index 068ff48..b451676 100644
--- a/Eigen/src/Core/arch/SVE/TypeCasting.h
+++ b/Eigen/src/Core/arch/SVE/TypeCasting.h
@@ -49,4 +49,4 @@
 }  // namespace internal
 }  // namespace Eigen
 
-#endif // EIGEN_TYPE_CASTING_SVE_H
+#endif  // EIGEN_TYPE_CASTING_SVE_H
diff --git a/Eigen/src/Core/arch/SYCL/InteropHeaders.h b/Eigen/src/Core/arch/SYCL/InteropHeaders.h
index 27d9a82..578e0f3 100644
--- a/Eigen/src/Core/arch/SYCL/InteropHeaders.h
+++ b/Eigen/src/Core/arch/SYCL/InteropHeaders.h
@@ -78,12 +78,11 @@
 };
 
 #ifdef SYCL_DEVICE_ONLY
-#define SYCL_PACKET_TRAITS(packet_type, has_blend, unpacket_type, lengths) \
-  template <>                                                              \
-  struct packet_traits<unpacket_type>                                      \
-      : sycl_packet_traits<has_blend, lengths> {                           \
-    typedef packet_type type;                                              \
-    typedef packet_type half;                                              \
+#define SYCL_PACKET_TRAITS(packet_type, has_blend, unpacket_type, lengths)       \
+  template <>                                                                    \
+  struct packet_traits<unpacket_type> : sycl_packet_traits<has_blend, lengths> { \
+    typedef packet_type type;                                                    \
+    typedef packet_type half;                                                    \
   };
 
 SYCL_PACKET_TRAITS(cl::sycl::cl_half8, 1, Eigen::half, 8)
@@ -134,15 +133,13 @@
 #ifndef SYCL_DEVICE_ONLY
 template <typename PacketReturnType, int PacketSize>
 struct PacketWrapper {
-  typedef typename ::Eigen::internal::unpacket_traits<PacketReturnType>::type
-      Scalar;
+  typedef typename ::Eigen::internal::unpacket_traits<PacketReturnType>::type Scalar;
   template <typename Index>
   EIGEN_DEVICE_FUNC static Scalar scalarize(Index, PacketReturnType &) {
     eigen_assert(false && "THERE IS NO PACKETIZE VERSION FOR  THE CHOSEN TYPE");
     abort();
   }
-  EIGEN_DEVICE_FUNC static PacketReturnType convert_to_packet_type(Scalar in,
-                                                                   Scalar) {
+  EIGEN_DEVICE_FUNC static PacketReturnType convert_to_packet_type(Scalar in, Scalar) {
     return ::Eigen::internal::template plset<PacketReturnType>(in);
   }
   EIGEN_DEVICE_FUNC static void set_packet(PacketReturnType, Scalar *) {
@@ -154,8 +151,7 @@
 #elif defined(SYCL_DEVICE_ONLY)
 template <typename PacketReturnType>
 struct PacketWrapper<PacketReturnType, 4> {
-  typedef typename ::Eigen::internal::unpacket_traits<PacketReturnType>::type
-      Scalar;
+  typedef typename ::Eigen::internal::unpacket_traits<PacketReturnType>::type Scalar;
   template <typename Index>
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE static Scalar scalarize(Index index, PacketReturnType &in) {
     switch (index) {
@@ -168,15 +164,14 @@
       case 3:
         return in.w();
       default:
-      //INDEX MUST BE BETWEEN 0 and 3.There is no abort function in SYCL kernel. so we cannot use abort here. 
-      // The code will never reach here
-      __builtin_unreachable();
+        // INDEX MUST BE BETWEEN 0 and 3.There is no abort function in SYCL kernel. so we cannot use abort here.
+        //  The code will never reach here
+        __builtin_unreachable();
     }
     __builtin_unreachable();
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE static PacketReturnType convert_to_packet_type(
-      Scalar in, Scalar other) {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE static PacketReturnType convert_to_packet_type(Scalar in, Scalar other) {
     return PacketReturnType(in, other, other, other);
   }
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE static void set_packet(PacketReturnType &lhs, Scalar *rhs) {
@@ -186,25 +181,20 @@
 
 template <typename PacketReturnType>
 struct PacketWrapper<PacketReturnType, 1> {
-  typedef typename ::Eigen::internal::unpacket_traits<PacketReturnType>::type
-      Scalar;
+  typedef typename ::Eigen::internal::unpacket_traits<PacketReturnType>::type Scalar;
   template <typename Index>
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE static Scalar scalarize(Index, PacketReturnType &in) {
     return in;
   }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE static PacketReturnType convert_to_packet_type(Scalar in,
-                                                                   Scalar) {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE static PacketReturnType convert_to_packet_type(Scalar in, Scalar) {
     return PacketReturnType(in);
   }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE static void set_packet(PacketReturnType &lhs, Scalar *rhs) {
-    lhs = rhs[0];
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE static void set_packet(PacketReturnType &lhs, Scalar *rhs) { lhs = rhs[0]; }
 };
 
 template <typename PacketReturnType>
 struct PacketWrapper<PacketReturnType, 2> {
-  typedef typename ::Eigen::internal::unpacket_traits<PacketReturnType>::type
-      Scalar;
+  typedef typename ::Eigen::internal::unpacket_traits<PacketReturnType>::type Scalar;
   template <typename Index>
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE static Scalar scalarize(Index index, PacketReturnType &in) {
     switch (index) {
@@ -213,15 +203,14 @@
       case 1:
         return in.y();
       default:
-        //INDEX MUST BE BETWEEN 0 and 1.There is no abort function in SYCL kernel. so we cannot use abort here. 
-      // The code will never reach here
+        // INDEX MUST BE BETWEEN 0 and 1.There is no abort function in SYCL kernel. so we cannot use abort here.
+        // The code will never reach here
         __builtin_unreachable();
     }
     __builtin_unreachable();
   }
-  
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE static PacketReturnType convert_to_packet_type(
-      Scalar in, Scalar other) {
+
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE static PacketReturnType convert_to_packet_type(Scalar in, Scalar other) {
     return PacketReturnType(in, other);
   }
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE static void set_packet(PacketReturnType &lhs, Scalar *rhs) {
diff --git a/Eigen/src/Core/arch/SYCL/MathFunctions.h b/Eigen/src/Core/arch/SYCL/MathFunctions.h
index a8adc46..b20c32b 100644
--- a/Eigen/src/Core/arch/SYCL/MathFunctions.h
+++ b/Eigen/src/Core/arch/SYCL/MathFunctions.h
@@ -31,11 +31,10 @@
 // introduce conflicts between these packet_traits definitions and the ones
 // we'll use on the host side (SSE, AVX, ...)
 #if defined(SYCL_DEVICE_ONLY)
-#define SYCL_PLOG(packet_type)                                         \
-  template <>                                                          \
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type plog<packet_type>( \
-      const packet_type& a) {                                          \
-    return cl::sycl::log(a);                                           \
+#define SYCL_PLOG(packet_type)                                                                \
+  template <>                                                                                 \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type plog<packet_type>(const packet_type& a) { \
+    return cl::sycl::log(a);                                                                  \
   }
 
 SYCL_PLOG(cl::sycl::cl_half8)
@@ -43,11 +42,10 @@
 SYCL_PLOG(cl::sycl::cl_double2)
 #undef SYCL_PLOG
 
-#define SYCL_PLOG1P(packet_type)                                         \
-  template <>                                                            \
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type plog1p<packet_type>( \
-      const packet_type& a) {                                            \
-    return cl::sycl::log1p(a);                                           \
+#define SYCL_PLOG1P(packet_type)                                                                \
+  template <>                                                                                   \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type plog1p<packet_type>(const packet_type& a) { \
+    return cl::sycl::log1p(a);                                                                  \
   }
 
 SYCL_PLOG1P(cl::sycl::cl_half8)
@@ -55,11 +53,10 @@
 SYCL_PLOG1P(cl::sycl::cl_double2)
 #undef SYCL_PLOG1P
 
-#define SYCL_PLOG10(packet_type)                                         \
-  template <>                                                            \
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type plog10<packet_type>( \
-      const packet_type& a) {                                            \
-    return cl::sycl::log10(a);                                           \
+#define SYCL_PLOG10(packet_type)                                                                \
+  template <>                                                                                   \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type plog10<packet_type>(const packet_type& a) { \
+    return cl::sycl::log10(a);                                                                  \
   }
 
 SYCL_PLOG10(cl::sycl::cl_half8)
@@ -67,11 +64,10 @@
 SYCL_PLOG10(cl::sycl::cl_double2)
 #undef SYCL_PLOG10
 
-#define SYCL_PEXP(packet_type)                                         \
-  template <>                                                          \
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type pexp<packet_type>( \
-      const packet_type& a) {                                          \
-    return cl::sycl::exp(a);                                           \
+#define SYCL_PEXP(packet_type)                                                                \
+  template <>                                                                                 \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type pexp<packet_type>(const packet_type& a) { \
+    return cl::sycl::exp(a);                                                                  \
   }
 
 SYCL_PEXP(cl::sycl::cl_half8)
@@ -81,11 +77,10 @@
 SYCL_PEXP(cl::sycl::cl_double2)
 #undef SYCL_PEXP
 
-#define SYCL_PEXPM1(packet_type)                                         \
-  template <>                                                            \
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type pexpm1<packet_type>( \
-      const packet_type& a) {                                            \
-    return cl::sycl::expm1(a);                                           \
+#define SYCL_PEXPM1(packet_type)                                                                \
+  template <>                                                                                   \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type pexpm1<packet_type>(const packet_type& a) { \
+    return cl::sycl::expm1(a);                                                                  \
   }
 
 SYCL_PEXPM1(cl::sycl::cl_half8)
@@ -93,11 +88,10 @@
 SYCL_PEXPM1(cl::sycl::cl_double2)
 #undef SYCL_PEXPM1
 
-#define SYCL_PSQRT(packet_type)                                         \
-  template <>                                                           \
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type psqrt<packet_type>( \
-      const packet_type& a) {                                           \
-    return cl::sycl::sqrt(a);                                           \
+#define SYCL_PSQRT(packet_type)                                                                \
+  template <>                                                                                  \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type psqrt<packet_type>(const packet_type& a) { \
+    return cl::sycl::sqrt(a);                                                                  \
   }
 
 SYCL_PSQRT(cl::sycl::cl_half8)
@@ -105,11 +99,10 @@
 SYCL_PSQRT(cl::sycl::cl_double2)
 #undef SYCL_PSQRT
 
-#define SYCL_PRSQRT(packet_type)                                         \
-  template <>                                                            \
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type prsqrt<packet_type>( \
-      const packet_type& a) {                                            \
-    return cl::sycl::rsqrt(a);                                           \
+#define SYCL_PRSQRT(packet_type)                                                                \
+  template <>                                                                                   \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type prsqrt<packet_type>(const packet_type& a) { \
+    return cl::sycl::rsqrt(a);                                                                  \
   }
 
 SYCL_PRSQRT(cl::sycl::cl_half8)
@@ -118,11 +111,10 @@
 #undef SYCL_PRSQRT
 
 /** \internal \returns the hyperbolic sine of \a a (coeff-wise) */
-#define SYCL_PSIN(packet_type)                                         \
-  template <>                                                          \
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type psin<packet_type>( \
-      const packet_type& a) {                                          \
-    return cl::sycl::sin(a);                                           \
+#define SYCL_PSIN(packet_type)                                                                \
+  template <>                                                                                 \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type psin<packet_type>(const packet_type& a) { \
+    return cl::sycl::sin(a);                                                                  \
   }
 
 SYCL_PSIN(cl::sycl::cl_half8)
@@ -131,11 +123,10 @@
 #undef SYCL_PSIN
 
 /** \internal \returns the hyperbolic cosine of \a a (coeff-wise) */
-#define SYCL_PCOS(packet_type)                                         \
-  template <>                                                          \
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type pcos<packet_type>( \
-      const packet_type& a) {                                          \
-    return cl::sycl::cos(a);                                           \
+#define SYCL_PCOS(packet_type)                                                                \
+  template <>                                                                                 \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type pcos<packet_type>(const packet_type& a) { \
+    return cl::sycl::cos(a);                                                                  \
   }
 
 SYCL_PCOS(cl::sycl::cl_half8)
@@ -144,11 +135,10 @@
 #undef SYCL_PCOS
 
 /** \internal \returns the hyperbolic tan of \a a (coeff-wise) */
-#define SYCL_PTAN(packet_type)                                         \
-  template <>                                                          \
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type ptan<packet_type>( \
-      const packet_type& a) {                                          \
-    return cl::sycl::tan(a);                                           \
+#define SYCL_PTAN(packet_type)                                                                \
+  template <>                                                                                 \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type ptan<packet_type>(const packet_type& a) { \
+    return cl::sycl::tan(a);                                                                  \
   }
 
 SYCL_PTAN(cl::sycl::cl_half8)
@@ -157,11 +147,10 @@
 #undef SYCL_PTAN
 
 /** \internal \returns the hyperbolic sine of \a a (coeff-wise) */
-#define SYCL_PASIN(packet_type)                                         \
-  template <>                                                           \
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type pasin<packet_type>( \
-      const packet_type& a) {                                           \
-    return cl::sycl::asin(a);                                           \
+#define SYCL_PASIN(packet_type)                                                                \
+  template <>                                                                                  \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type pasin<packet_type>(const packet_type& a) { \
+    return cl::sycl::asin(a);                                                                  \
   }
 
 SYCL_PASIN(cl::sycl::cl_half8)
@@ -170,11 +159,10 @@
 #undef SYCL_PASIN
 
 /** \internal \returns the hyperbolic cosine of \a a (coeff-wise) */
-#define SYCL_PACOS(packet_type)                                         \
-  template <>                                                           \
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type pacos<packet_type>( \
-      const packet_type& a) {                                           \
-    return cl::sycl::acos(a);                                           \
+#define SYCL_PACOS(packet_type)                                                                \
+  template <>                                                                                  \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type pacos<packet_type>(const packet_type& a) { \
+    return cl::sycl::acos(a);                                                                  \
   }
 
 SYCL_PACOS(cl::sycl::cl_half8)
@@ -183,11 +171,10 @@
 #undef SYCL_PACOS
 
 /** \internal \returns the hyperbolic tan of \a a (coeff-wise) */
-#define SYCL_PATAN(packet_type)                                         \
-  template <>                                                           \
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type patan<packet_type>( \
-      const packet_type& a) {                                           \
-    return cl::sycl::atan(a);                                           \
+#define SYCL_PATAN(packet_type)                                                                \
+  template <>                                                                                  \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type patan<packet_type>(const packet_type& a) { \
+    return cl::sycl::atan(a);                                                                  \
   }
 
 SYCL_PATAN(cl::sycl::cl_half8)
@@ -196,11 +183,10 @@
 #undef SYCL_PATAN
 
 /** \internal \returns the hyperbolic sine of \a a (coeff-wise) */
-#define SYCL_PSINH(packet_type)                                         \
-  template <>                                                           \
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type psinh<packet_type>( \
-      const packet_type& a) {                                           \
-    return cl::sycl::sinh(a);                                           \
+#define SYCL_PSINH(packet_type)                                                                \
+  template <>                                                                                  \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type psinh<packet_type>(const packet_type& a) { \
+    return cl::sycl::sinh(a);                                                                  \
   }
 
 SYCL_PSINH(cl::sycl::cl_half8)
@@ -209,11 +195,10 @@
 #undef SYCL_PSINH
 
 /** \internal \returns the hyperbolic cosine of \a a (coeff-wise) */
-#define SYCL_PCOSH(packet_type)                                         \
-  template <>                                                           \
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type pcosh<packet_type>( \
-      const packet_type& a) {                                           \
-    return cl::sycl::cosh(a);                                           \
+#define SYCL_PCOSH(packet_type)                                                                \
+  template <>                                                                                  \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type pcosh<packet_type>(const packet_type& a) { \
+    return cl::sycl::cosh(a);                                                                  \
   }
 
 SYCL_PCOSH(cl::sycl::cl_half8)
@@ -222,11 +207,10 @@
 #undef SYCL_PCOSH
 
 /** \internal \returns the hyperbolic tan of \a a (coeff-wise) */
-#define SYCL_PTANH(packet_type)                                         \
-  template <>                                                           \
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type ptanh<packet_type>( \
-      const packet_type& a) {                                           \
-    return cl::sycl::tanh(a);                                           \
+#define SYCL_PTANH(packet_type)                                                                \
+  template <>                                                                                  \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type ptanh<packet_type>(const packet_type& a) { \
+    return cl::sycl::tanh(a);                                                                  \
   }
 
 SYCL_PTANH(cl::sycl::cl_half8)
@@ -234,11 +218,10 @@
 SYCL_PTANH(cl::sycl::cl_double2)
 #undef SYCL_PTANH
 
-#define SYCL_PCEIL(packet_type)                                         \
-  template <>                                                           \
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type pceil<packet_type>( \
-      const packet_type& a) {                                           \
-    return cl::sycl::ceil(a);                                           \
+#define SYCL_PCEIL(packet_type)                                                                \
+  template <>                                                                                  \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type pceil<packet_type>(const packet_type& a) { \
+    return cl::sycl::ceil(a);                                                                  \
   }
 
 SYCL_PCEIL(cl::sycl::cl_half)
@@ -246,11 +229,10 @@
 SYCL_PCEIL(cl::sycl::cl_double2)
 #undef SYCL_PCEIL
 
-#define SYCL_PROUND(packet_type)                                         \
-  template <>                                                            \
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type pround<packet_type>( \
-      const packet_type& a) {                                            \
-    return cl::sycl::round(a);                                           \
+#define SYCL_PROUND(packet_type)                                                                \
+  template <>                                                                                   \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type pround<packet_type>(const packet_type& a) { \
+    return cl::sycl::round(a);                                                                  \
   }
 
 SYCL_PROUND(cl::sycl::cl_half8)
@@ -258,11 +240,10 @@
 SYCL_PROUND(cl::sycl::cl_double2)
 #undef SYCL_PROUND
 
-#define SYCL_PRINT(packet_type)                                         \
-  template <>                                                           \
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type print<packet_type>( \
-      const packet_type& a) {                                           \
-    return cl::sycl::rint(a);                                           \
+#define SYCL_PRINT(packet_type)                                                                \
+  template <>                                                                                  \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type print<packet_type>(const packet_type& a) { \
+    return cl::sycl::rint(a);                                                                  \
   }
 
 SYCL_PRINT(cl::sycl::cl_half8)
@@ -270,11 +251,10 @@
 SYCL_PRINT(cl::sycl::cl_double2)
 #undef SYCL_PRINT
 
-#define SYCL_FLOOR(packet_type)                                          \
-  template <>                                                            \
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type pfloor<packet_type>( \
-      const packet_type& a) {                                            \
-    return cl::sycl::floor(a);                                           \
+#define SYCL_FLOOR(packet_type)                                                                 \
+  template <>                                                                                   \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type pfloor<packet_type>(const packet_type& a) { \
+    return cl::sycl::floor(a);                                                                  \
   }
 
 SYCL_FLOOR(cl::sycl::cl_half8)
@@ -282,11 +262,10 @@
 SYCL_FLOOR(cl::sycl::cl_double2)
 #undef SYCL_FLOOR
 
-#define SYCL_PMIN(packet_type, expr)                                   \
-  template <>                                                          \
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type pmin<packet_type>( \
-      const packet_type& a, const packet_type& b) {                    \
-    return expr;                                                       \
+#define SYCL_PMIN(packet_type, expr)                                                                                \
+  template <>                                                                                                       \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type pmin<packet_type>(const packet_type& a, const packet_type& b) { \
+    return expr;                                                                                                    \
   }
 
 SYCL_PMIN(cl::sycl::cl_half8, cl::sycl::fmin(a, b))
@@ -294,11 +273,10 @@
 SYCL_PMIN(cl::sycl::cl_double2, cl::sycl::fmin(a, b))
 #undef SYCL_PMIN
 
-#define SYCL_PMAX(packet_type, expr)                                   \
-  template <>                                                          \
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type pmax<packet_type>( \
-      const packet_type& a, const packet_type& b) {                    \
-    return expr;                                                       \
+#define SYCL_PMAX(packet_type, expr)                                                                                \
+  template <>                                                                                                       \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type pmax<packet_type>(const packet_type& a, const packet_type& b) { \
+    return expr;                                                                                                    \
   }
 
 SYCL_PMAX(cl::sycl::cl_half8, cl::sycl::fmax(a, b))
@@ -306,13 +284,10 @@
 SYCL_PMAX(cl::sycl::cl_double2, cl::sycl::fmax(a, b))
 #undef SYCL_PMAX
 
-#define SYCL_PLDEXP(packet_type)                                             \
-  template <>                                                                \
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type pldexp(                  \
-      const packet_type& a, const packet_type& exponent) {                   \
-    return cl::sycl::ldexp(                                                  \
-        a, exponent.template convert<cl::sycl::cl_int,                       \
-                                     cl::sycl::rounding_mode::automatic>()); \
+#define SYCL_PLDEXP(packet_type)                                                                                  \
+  template <>                                                                                                     \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type pldexp(const packet_type& a, const packet_type& exponent) {   \
+    return cl::sycl::ldexp(a, exponent.template convert<cl::sycl::cl_int, cl::sycl::rounding_mode::automatic>()); \
   }
 
 SYCL_PLDEXP(cl::sycl::cl_half8)
diff --git a/Eigen/src/Core/arch/SYCL/PacketMath.h b/Eigen/src/Core/arch/SYCL/PacketMath.h
index 4b0b1c6..6b6bfe4 100644
--- a/Eigen/src/Core/arch/SYCL/PacketMath.h
+++ b/Eigen/src/Core/arch/SYCL/PacketMath.h
@@ -29,15 +29,16 @@
 
 namespace internal {
 #ifdef SYCL_DEVICE_ONLY
-#define SYCL_PLOAD(packet_type, AlignedType)                          \
-  template <>                                                         \
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE packet_type                   \
-      pload##AlignedType<packet_type>(                                \
-          const typename unpacket_traits<packet_type>::type* from) {  \
-   auto ptr = cl::sycl::address_space_cast<cl::sycl::access::address_space::generic_space, cl::sycl::access::decorated::no>(from);\
-    packet_type res{};                                                \
-    res.load(0, ptr);                                     \
-    return res;                                                       \
+#define SYCL_PLOAD(packet_type, AlignedType)                                                                           \
+  template <>                                                                                                          \
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE packet_type pload##AlignedType<packet_type>(                                   \
+      const typename unpacket_traits<packet_type>::type* from) {                                                       \
+    auto ptr =                                                                                                         \
+        cl::sycl::address_space_cast<cl::sycl::access::address_space::generic_space, cl::sycl::access::decorated::no>( \
+            from);                                                                                                     \
+    packet_type res{};                                                                                                 \
+    res.load(0, ptr);                                                                                                  \
+    return res;                                                                                                        \
   }
 
 SYCL_PLOAD(cl::sycl::cl_float4, u)
@@ -47,37 +48,34 @@
 #undef SYCL_PLOAD
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE cl::sycl::cl_half8
-    pload<cl::sycl::cl_half8>(
-        const typename unpacket_traits<cl::sycl::cl_half8>::type* from) {
-  auto ptr = cl::sycl::address_space_cast<
-      cl::sycl::access::address_space::generic_space,
-      cl::sycl::access::decorated::no>(
-      reinterpret_cast<const cl::sycl::cl_half*>(from));
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE cl::sycl::cl_half8 pload<cl::sycl::cl_half8>(
+    const typename unpacket_traits<cl::sycl::cl_half8>::type* from) {
+  auto ptr =
+      cl::sycl::address_space_cast<cl::sycl::access::address_space::generic_space, cl::sycl::access::decorated::no>(
+          reinterpret_cast<const cl::sycl::cl_half*>(from));
   cl::sycl::cl_half8 res{};
   res.load(0, ptr);
   return res;
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE cl::sycl::cl_half8
-ploadu<cl::sycl::cl_half8>(
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE cl::sycl::cl_half8 ploadu<cl::sycl::cl_half8>(
     const typename unpacket_traits<cl::sycl::cl_half8>::type* from) {
-  auto ptr = cl::sycl::address_space_cast<
-      cl::sycl::access::address_space::generic_space,
-      cl::sycl::access::decorated::no>(
-      reinterpret_cast<const cl::sycl::cl_half*>(from));
+  auto ptr =
+      cl::sycl::address_space_cast<cl::sycl::access::address_space::generic_space, cl::sycl::access::decorated::no>(
+          reinterpret_cast<const cl::sycl::cl_half*>(from));
   cl::sycl::cl_half8 res{};
   res.load(0, ptr);
   return res;
 }
 
-#define SYCL_PSTORE(scalar, packet_type, alignment)             \
-  template <>                                                   \
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pstore##alignment( \
-      scalar* to, const packet_type& from) {                    \
-    auto ptr = cl::sycl::address_space_cast<cl::sycl::access::address_space::generic_space, cl::sycl::access::decorated::no>(to);\
-    from.store(0, ptr);                               \
+#define SYCL_PSTORE(scalar, packet_type, alignment)                                                                    \
+  template <>                                                                                                          \
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pstore##alignment(scalar* to, const packet_type& from) {                  \
+    auto ptr =                                                                                                         \
+        cl::sycl::address_space_cast<cl::sycl::access::address_space::generic_space, cl::sycl::access::decorated::no>( \
+            to);                                                                                                       \
+    from.store(0, ptr);                                                                                                \
   }
 
 SYCL_PSTORE(float, cl::sycl::cl_float4, )
@@ -87,22 +85,18 @@
 #undef SYCL_PSTORE
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pstoreu(
-    Eigen::half* to, const cl::sycl::cl_half8& from) {
-  auto ptr = cl::sycl::address_space_cast<
-      cl::sycl::access::address_space::generic_space,
-      cl::sycl::access::decorated::no>(
-      reinterpret_cast<cl::sycl::cl_half*>(to));
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pstoreu(Eigen::half* to, const cl::sycl::cl_half8& from) {
+  auto ptr =
+      cl::sycl::address_space_cast<cl::sycl::access::address_space::generic_space, cl::sycl::access::decorated::no>(
+          reinterpret_cast<cl::sycl::cl_half*>(to));
   from.store(0, ptr);
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pstore(
-    Eigen::half* to, const cl::sycl::cl_half8& from) {
-  auto ptr = cl::sycl::address_space_cast<
-      cl::sycl::access::address_space::generic_space,
-      cl::sycl::access::decorated::no>(
-      reinterpret_cast<cl::sycl::cl_half*>(to));
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pstore(Eigen::half* to, const cl::sycl::cl_half8& from) {
+  auto ptr =
+      cl::sycl::address_space_cast<cl::sycl::access::address_space::generic_space, cl::sycl::access::decorated::no>(
+          reinterpret_cast<cl::sycl::cl_half*>(to));
   from.store(0, ptr);
 }
 
@@ -123,44 +117,33 @@
 template <typename packet_type>
 struct get_base_packet {
   template <typename sycl_multi_pointer>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type
-  get_ploaddup(sycl_multi_pointer) {}
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type get_ploaddup(sycl_multi_pointer) {}
 
   template <typename sycl_multi_pointer>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type
-  get_pgather(sycl_multi_pointer, Index) {}
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type get_pgather(sycl_multi_pointer, Index) {}
 };
 
 template <>
 struct get_base_packet<cl::sycl::cl_half8> {
   template <typename sycl_multi_pointer>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE cl::sycl::cl_half8 get_ploaddup(
-      sycl_multi_pointer from) {
-    return cl::sycl::cl_half8(static_cast<cl::sycl::half>(from[0]),
-                              static_cast<cl::sycl::half>(from[0]),
-                              static_cast<cl::sycl::half>(from[1]),
-                              static_cast<cl::sycl::half>(from[1]),
-                              static_cast<cl::sycl::half>(from[2]),
-                              static_cast<cl::sycl::half>(from[2]),
-                              static_cast<cl::sycl::half>(from[3]),
-                              static_cast<cl::sycl::half>(from[3]));
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE cl::sycl::cl_half8 get_ploaddup(sycl_multi_pointer from) {
+    return cl::sycl::cl_half8(static_cast<cl::sycl::half>(from[0]), static_cast<cl::sycl::half>(from[0]),
+                              static_cast<cl::sycl::half>(from[1]), static_cast<cl::sycl::half>(from[1]),
+                              static_cast<cl::sycl::half>(from[2]), static_cast<cl::sycl::half>(from[2]),
+                              static_cast<cl::sycl::half>(from[3]), static_cast<cl::sycl::half>(from[3]));
   }
   template <typename sycl_multi_pointer>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE cl::sycl::cl_half8 get_pgather(
-      sycl_multi_pointer from, Index stride) {
-    return cl::sycl::cl_half8(static_cast<cl::sycl::half>(from[0 * stride]),
-                              static_cast<cl::sycl::half>(from[1 * stride]),
-                              static_cast<cl::sycl::half>(from[2 * stride]),
-                              static_cast<cl::sycl::half>(from[3 * stride]),
-                              static_cast<cl::sycl::half>(from[4 * stride]),
-                              static_cast<cl::sycl::half>(from[5 * stride]),
-                              static_cast<cl::sycl::half>(from[6 * stride]),
-                              static_cast<cl::sycl::half>(from[7 * stride]));
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE cl::sycl::cl_half8 get_pgather(sycl_multi_pointer from, Index stride) {
+    return cl::sycl::cl_half8(
+        static_cast<cl::sycl::half>(from[0 * stride]), static_cast<cl::sycl::half>(from[1 * stride]),
+        static_cast<cl::sycl::half>(from[2 * stride]), static_cast<cl::sycl::half>(from[3 * stride]),
+        static_cast<cl::sycl::half>(from[4 * stride]), static_cast<cl::sycl::half>(from[5 * stride]),
+        static_cast<cl::sycl::half>(from[6 * stride]), static_cast<cl::sycl::half>(from[7 * stride]));
   }
 
   template <typename sycl_multi_pointer>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void set_pscatter(
-      sycl_multi_pointer to, const cl::sycl::cl_half8& from, Index stride) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void set_pscatter(sycl_multi_pointer to, const cl::sycl::cl_half8& from,
+                                                                 Index stride) {
     auto tmp = stride;
     to[0] = Eigen::half(from.s0());
     to[tmp] = Eigen::half(from.s1());
@@ -171,45 +154,36 @@
     to[tmp += stride] = Eigen::half(from.s6());
     to[tmp += stride] = Eigen::half(from.s7());
   }
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE cl::sycl::cl_half8 set_plset(
-      const cl::sycl::half& a) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE cl::sycl::cl_half8 set_plset(const cl::sycl::half& a) {
     return cl::sycl::cl_half8(static_cast<cl::sycl::half>(a), static_cast<cl::sycl::half>(a + 1),
-                              static_cast<cl::sycl::half>(a + 2),
-                              static_cast<cl::sycl::half>(a + 3),
-                              static_cast<cl::sycl::half>(a + 4),
-                              static_cast<cl::sycl::half>(a + 5),
-                              static_cast<cl::sycl::half>(a + 6),
-                              static_cast<cl::sycl::half>(a + 7));
+                              static_cast<cl::sycl::half>(a + 2), static_cast<cl::sycl::half>(a + 3),
+                              static_cast<cl::sycl::half>(a + 4), static_cast<cl::sycl::half>(a + 5),
+                              static_cast<cl::sycl::half>(a + 6), static_cast<cl::sycl::half>(a + 7));
   }
 };
 
 template <>
 struct get_base_packet<cl::sycl::cl_float4> {
   template <typename sycl_multi_pointer>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE cl::sycl::cl_float4 get_ploaddup(
-      sycl_multi_pointer from) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE cl::sycl::cl_float4 get_ploaddup(sycl_multi_pointer from) {
     return cl::sycl::cl_float4(from[0], from[0], from[1], from[1]);
   }
   template <typename sycl_multi_pointer>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE cl::sycl::cl_float4 get_pgather(
-      sycl_multi_pointer from, Index stride) {
-    return cl::sycl::cl_float4(from[0 * stride], from[1 * stride],
-                               from[2 * stride], from[3 * stride]);
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE cl::sycl::cl_float4 get_pgather(sycl_multi_pointer from, Index stride) {
+    return cl::sycl::cl_float4(from[0 * stride], from[1 * stride], from[2 * stride], from[3 * stride]);
   }
 
   template <typename sycl_multi_pointer>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void set_pscatter(
-      sycl_multi_pointer to, const cl::sycl::cl_float4& from, Index stride) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void set_pscatter(sycl_multi_pointer to, const cl::sycl::cl_float4& from,
+                                                                 Index stride) {
     auto tmp = stride;
     to[0] = from.x();
     to[tmp] = from.y();
     to[tmp += stride] = from.z();
     to[tmp += stride] = from.w();
   }
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE cl::sycl::cl_float4 set_plset(
-      const float& a) {
-    return cl::sycl::cl_float4(static_cast<float>(a), static_cast<float>(a + 1),
-                               static_cast<float>(a + 2),
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE cl::sycl::cl_float4 set_plset(const float& a) {
+    return cl::sycl::cl_float4(static_cast<float>(a), static_cast<float>(a + 1), static_cast<float>(a + 2),
                                static_cast<float>(a + 3));
   }
 };
@@ -217,28 +191,25 @@
 template <>
 struct get_base_packet<cl::sycl::cl_double2> {
   template <typename sycl_multi_pointer>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE cl::sycl::cl_double2
-  get_ploaddup(const sycl_multi_pointer from) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE cl::sycl::cl_double2 get_ploaddup(const sycl_multi_pointer from) {
     return cl::sycl::cl_double2(from[0], from[0]);
   }
 
   template <typename sycl_multi_pointer, typename Index>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE cl::sycl::cl_double2 get_pgather(
-      const sycl_multi_pointer from, Index stride) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE cl::sycl::cl_double2 get_pgather(const sycl_multi_pointer from,
+                                                                                Index stride) {
     return cl::sycl::cl_double2(from[0 * stride], from[1 * stride]);
   }
 
   template <typename sycl_multi_pointer>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void set_pscatter(
-      sycl_multi_pointer to, const cl::sycl::cl_double2& from, Index stride) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void set_pscatter(sycl_multi_pointer to,
+                                                                 const cl::sycl::cl_double2& from, Index stride) {
     to[0] = from.x();
     to[stride] = from.y();
   }
 
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE cl::sycl::cl_double2 set_plset(
-      const double& a) {
-    return cl::sycl::cl_double2(static_cast<double>(a),
-                                static_cast<double>(a + 1));
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE cl::sycl::cl_double2 set_plset(const double& a) {
+    return cl::sycl::cl_double2(static_cast<double>(a), static_cast<double>(a + 1));
   }
 };
 
@@ -268,15 +239,14 @@
 template <>
 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE cl::sycl::cl_half8 plset<cl::sycl::cl_half8>(
     const typename unpacket_traits<cl::sycl::cl_half8>::type& a) {
-  return get_base_packet<cl::sycl::cl_half8>::set_plset((const cl::sycl::half &) a);
+  return get_base_packet<cl::sycl::cl_half8>::set_plset((const cl::sycl::half&)a);
 }
 
-#define SYCL_PGATHER_SPECILIZE(scalar, packet_type)                            \
-  template <>                                                                  \
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type                            \
-  pgather<scalar, packet_type>(                                                \
-      const typename unpacket_traits<packet_type>::type* from, Index stride) { \
-    return get_base_packet<packet_type>::get_pgather(from, stride);            \
+#define SYCL_PGATHER_SPECILIZE(scalar, packet_type)                               \
+  template <>                                                                     \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type pgather<scalar, packet_type>( \
+      const typename unpacket_traits<packet_type>::type* from, Index stride) {    \
+    return get_base_packet<packet_type>::get_pgather(from, stride);               \
   }
 
 SYCL_PGATHER_SPECILIZE(Eigen::half, cl::sycl::cl_half8)
@@ -284,12 +254,11 @@
 SYCL_PGATHER_SPECILIZE(double, cl::sycl::cl_double2)
 #undef SYCL_PGATHER_SPECILIZE
 
-#define SYCL_PSCATTER_SPECILIZE(scalar, packet_type)                        \
-  template <>                                                               \
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<scalar, packet_type>( \
-      typename unpacket_traits<packet_type>::type * to,                     \
-      const packet_type& from, Index stride) {                              \
-    get_base_packet<packet_type>::set_pscatter(to, from, stride);           \
+#define SYCL_PSCATTER_SPECILIZE(scalar, packet_type)                                             \
+  template <>                                                                                    \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<scalar, packet_type>(                      \
+      typename unpacket_traits<packet_type>::type * to, const packet_type& from, Index stride) { \
+    get_base_packet<packet_type>::set_pscatter(to, from, stride);                                \
   }
 
 SYCL_PSCATTER_SPECILIZE(Eigen::half, cl::sycl::cl_half8)
@@ -298,11 +267,11 @@
 
 #undef SYCL_PSCATTER_SPECILIZE
 
-#define SYCL_PMAD(packet_type)                                            \
-  template <>                                                             \
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE packet_type pmadd(                \
-      const packet_type& a, const packet_type& b, const packet_type& c) { \
-    return cl::sycl::mad(a, b, c);                                        \
+#define SYCL_PMAD(packet_type)                                                                        \
+  template <>                                                                                         \
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE packet_type pmadd(const packet_type& a, const packet_type& b, \
+                                                          const packet_type& c) {                     \
+    return cl::sycl::mad(a, b, c);                                                                    \
   }
 
 SYCL_PMAD(cl::sycl::cl_half8)
@@ -311,146 +280,109 @@
 #undef SYCL_PMAD
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Eigen::half pfirst<cl::sycl::cl_half8>(
-    const cl::sycl::cl_half8& a) {
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Eigen::half pfirst<cl::sycl::cl_half8>(const cl::sycl::cl_half8& a) {
   return Eigen::half(a.s0());
 }
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float pfirst<cl::sycl::cl_float4>(
-    const cl::sycl::cl_float4& a) {
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float pfirst<cl::sycl::cl_float4>(const cl::sycl::cl_float4& a) {
   return a.x();
 }
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double pfirst<cl::sycl::cl_double2>(
-    const cl::sycl::cl_double2& a) {
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double pfirst<cl::sycl::cl_double2>(const cl::sycl::cl_double2& a) {
   return a.x();
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Eigen::half predux<cl::sycl::cl_half8>(
-    const cl::sycl::cl_half8& a) {
-  return Eigen::half(a.s0() + a.s1() + a.s2() + a.s3() + a.s4() + a.s5()
-                     + a.s6() + a.s7());
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Eigen::half predux<cl::sycl::cl_half8>(const cl::sycl::cl_half8& a) {
+  return Eigen::half(a.s0() + a.s1() + a.s2() + a.s3() + a.s4() + a.s5() + a.s6() + a.s7());
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float predux<cl::sycl::cl_float4>(
-    const cl::sycl::cl_float4& a) {
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float predux<cl::sycl::cl_float4>(const cl::sycl::cl_float4& a) {
   return a.x() + a.y() + a.z() + a.w();
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double predux<cl::sycl::cl_double2>(
-    const cl::sycl::cl_double2& a) {
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double predux<cl::sycl::cl_double2>(const cl::sycl::cl_double2& a) {
   return a.x() + a.y();
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Eigen::half predux_max<cl::sycl::cl_half8>(
-    const cl::sycl::cl_half8& a) {
-  return Eigen::half(cl::sycl::fmax(
-          cl::sycl::fmax(
-            cl::sycl::fmax(a.s0(), a.s1()),
-            cl::sycl::fmax(a.s2(), a.s3())),
-          cl::sycl::fmax(
-            cl::sycl::fmax(a.s4(), a.s5()),
-            cl::sycl::fmax(a.s6(), a.s7()))));
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Eigen::half predux_max<cl::sycl::cl_half8>(const cl::sycl::cl_half8& a) {
+  return Eigen::half(cl::sycl::fmax(cl::sycl::fmax(cl::sycl::fmax(a.s0(), a.s1()), cl::sycl::fmax(a.s2(), a.s3())),
+                                    cl::sycl::fmax(cl::sycl::fmax(a.s4(), a.s5()), cl::sycl::fmax(a.s6(), a.s7()))));
 }
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float predux_max<cl::sycl::cl_float4>(
-    const cl::sycl::cl_float4& a) {
-  return cl::sycl::fmax(cl::sycl::fmax(a.x(), a.y()),
-                        cl::sycl::fmax(a.z(), a.w()));
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float predux_max<cl::sycl::cl_float4>(const cl::sycl::cl_float4& a) {
+  return cl::sycl::fmax(cl::sycl::fmax(a.x(), a.y()), cl::sycl::fmax(a.z(), a.w()));
 }
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double predux_max<cl::sycl::cl_double2>(
-    const cl::sycl::cl_double2& a) {
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double predux_max<cl::sycl::cl_double2>(const cl::sycl::cl_double2& a) {
   return cl::sycl::fmax(a.x(), a.y());
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Eigen::half predux_min<cl::sycl::cl_half8>(
-    const cl::sycl::cl_half8& a) {
-  return Eigen::half(cl::sycl::fmin(
-      cl::sycl::fmin(
-          cl::sycl::fmin(a.s0(), a.s1()),
-          cl::sycl::fmin(a.s2(), a.s3())),
-      cl::sycl::fmin(
-          cl::sycl::fmin(a.s4(), a.s5()),
-          cl::sycl::fmin(a.s6(), a.s7()))));
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Eigen::half predux_min<cl::sycl::cl_half8>(const cl::sycl::cl_half8& a) {
+  return Eigen::half(cl::sycl::fmin(cl::sycl::fmin(cl::sycl::fmin(a.s0(), a.s1()), cl::sycl::fmin(a.s2(), a.s3())),
+                                    cl::sycl::fmin(cl::sycl::fmin(a.s4(), a.s5()), cl::sycl::fmin(a.s6(), a.s7()))));
 }
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float predux_min<cl::sycl::cl_float4>(
-    const cl::sycl::cl_float4& a) {
-  return cl::sycl::fmin(cl::sycl::fmin(a.x(), a.y()),
-                        cl::sycl::fmin(a.z(), a.w()));
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float predux_min<cl::sycl::cl_float4>(const cl::sycl::cl_float4& a) {
+  return cl::sycl::fmin(cl::sycl::fmin(a.x(), a.y()), cl::sycl::fmin(a.z(), a.w()));
 }
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double predux_min<cl::sycl::cl_double2>(
-    const cl::sycl::cl_double2& a) {
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double predux_min<cl::sycl::cl_double2>(const cl::sycl::cl_double2& a) {
   return cl::sycl::fmin(a.x(), a.y());
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Eigen::half predux_mul<cl::sycl::cl_half8>(
-    const cl::sycl::cl_half8& a) {
-  return Eigen::half(a.s0() * a.s1() * a.s2() * a.s3() * a.s4() * a.s5() *
-                     a.s6() * a.s7());
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Eigen::half predux_mul<cl::sycl::cl_half8>(const cl::sycl::cl_half8& a) {
+  return Eigen::half(a.s0() * a.s1() * a.s2() * a.s3() * a.s4() * a.s5() * a.s6() * a.s7());
 }
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float predux_mul<cl::sycl::cl_float4>(
-    const cl::sycl::cl_float4& a) {
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float predux_mul<cl::sycl::cl_float4>(const cl::sycl::cl_float4& a) {
   return a.x() * a.y() * a.z() * a.w();
 }
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double predux_mul<cl::sycl::cl_double2>(
-    const cl::sycl::cl_double2& a) {
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double predux_mul<cl::sycl::cl_double2>(const cl::sycl::cl_double2& a) {
   return a.x() * a.y();
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE cl::sycl::cl_half8
-pabs<cl::sycl::cl_half8>(const cl::sycl::cl_half8& a) {
-  return cl::sycl::cl_half8(cl::sycl::fabs(a.s0()), cl::sycl::fabs(a.s1()),
-                            cl::sycl::fabs(a.s2()), cl::sycl::fabs(a.s3()),
-                            cl::sycl::fabs(a.s4()), cl::sycl::fabs(a.s5()),
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE cl::sycl::cl_half8 pabs<cl::sycl::cl_half8>(const cl::sycl::cl_half8& a) {
+  return cl::sycl::cl_half8(cl::sycl::fabs(a.s0()), cl::sycl::fabs(a.s1()), cl::sycl::fabs(a.s2()),
+                            cl::sycl::fabs(a.s3()), cl::sycl::fabs(a.s4()), cl::sycl::fabs(a.s5()),
                             cl::sycl::fabs(a.s6()), cl::sycl::fabs(a.s7()));
 }
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE cl::sycl::cl_float4
-pabs<cl::sycl::cl_float4>(const cl::sycl::cl_float4& a) {
-  return cl::sycl::cl_float4(cl::sycl::fabs(a.x()), cl::sycl::fabs(a.y()),
-                             cl::sycl::fabs(a.z()), cl::sycl::fabs(a.w()));
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE cl::sycl::cl_float4 pabs<cl::sycl::cl_float4>(const cl::sycl::cl_float4& a) {
+  return cl::sycl::cl_float4(cl::sycl::fabs(a.x()), cl::sycl::fabs(a.y()), cl::sycl::fabs(a.z()),
+                             cl::sycl::fabs(a.w()));
 }
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE cl::sycl::cl_double2
-pabs<cl::sycl::cl_double2>(const cl::sycl::cl_double2& a) {
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE cl::sycl::cl_double2 pabs<cl::sycl::cl_double2>(const cl::sycl::cl_double2& a) {
   return cl::sycl::cl_double2(cl::sycl::fabs(a.x()), cl::sycl::fabs(a.y()));
 }
 
 template <typename Packet>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet sycl_pcmp_le(const Packet &a,
-                                                          const Packet &b) {
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet sycl_pcmp_le(const Packet& a, const Packet& b) {
   return (a <= b).template as<Packet>();
 }
 
 template <typename Packet>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet sycl_pcmp_lt(const Packet &a,
-                                                          const Packet &b) {
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet sycl_pcmp_lt(const Packet& a, const Packet& b) {
   return (a < b).template as<Packet>();
 }
 
 template <typename Packet>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet sycl_pcmp_eq(const Packet &a,
-                                                          const Packet &b) {
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet sycl_pcmp_eq(const Packet& a, const Packet& b) {
   return (a == b).template as<Packet>();
 }
 
-#define SYCL_PCMP(OP, TYPE)                                                    \
-  template <>                                                                  \
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE TYPE pcmp_##OP<TYPE>(const TYPE &a,    \
-                                                             const TYPE &b) {  \
-    return sycl_pcmp_##OP<TYPE>(a, b);                                         \
+#define SYCL_PCMP(OP, TYPE)                                                                  \
+  template <>                                                                                \
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE TYPE pcmp_##OP<TYPE>(const TYPE& a, const TYPE& b) { \
+    return sycl_pcmp_##OP<TYPE>(a, b);                                                       \
   }
 
 SYCL_PCMP(le, cl::sycl::cl_half8)
@@ -464,8 +396,7 @@
 SYCL_PCMP(eq, cl::sycl::cl_double2)
 #undef SYCL_PCMP
 
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void ptranspose(
-    PacketBlock<cl::sycl::cl_half8, 8>& kernel) {
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void ptranspose(PacketBlock<cl::sycl::cl_half8, 8>& kernel) {
   cl::sycl::cl_half tmp = kernel.packet[0].s1();
   kernel.packet[0].s1() = kernel.packet[1].s0();
   kernel.packet[1].s0() = tmp;
@@ -579,8 +510,7 @@
   kernel.packet[7].s6() = tmp;
 }
 
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void ptranspose(
-    PacketBlock<cl::sycl::cl_float4, 4>& kernel) {
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void ptranspose(PacketBlock<cl::sycl::cl_float4, 4>& kernel) {
   float tmp = kernel.packet[0].y();
   kernel.packet[0].y() = kernel.packet[1].x();
   kernel.packet[1].x() = tmp;
@@ -606,8 +536,7 @@
   kernel.packet[3].z() = tmp;
 }
 
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void ptranspose(
-    PacketBlock<cl::sycl::cl_double2, 2>& kernel) {
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void ptranspose(PacketBlock<cl::sycl::cl_double2, 2>& kernel) {
   double tmp = kernel.packet[0].y();
   kernel.packet[0].y() = kernel.packet[1].x();
   kernel.packet[1].x() = tmp;
@@ -615,35 +544,27 @@
 
 template <>
 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE cl::sycl::cl_half8 pblend(
-    const Selector<unpacket_traits<cl::sycl::cl_half8>::size>& ifPacket,
-    const cl::sycl::cl_half8& thenPacket,
+    const Selector<unpacket_traits<cl::sycl::cl_half8>::size>& ifPacket, const cl::sycl::cl_half8& thenPacket,
     const cl::sycl::cl_half8& elsePacket) {
-  cl::sycl::cl_short8 condition(
-      ifPacket.select[0] ? 0 : -1, ifPacket.select[1] ? 0 : -1,
-      ifPacket.select[2] ? 0 : -1, ifPacket.select[3] ? 0 : -1,
-      ifPacket.select[4] ? 0 : -1, ifPacket.select[5] ? 0 : -1,
-      ifPacket.select[6] ? 0 : -1, ifPacket.select[7] ? 0 : -1);
+  cl::sycl::cl_short8 condition(ifPacket.select[0] ? 0 : -1, ifPacket.select[1] ? 0 : -1, ifPacket.select[2] ? 0 : -1,
+                                ifPacket.select[3] ? 0 : -1, ifPacket.select[4] ? 0 : -1, ifPacket.select[5] ? 0 : -1,
+                                ifPacket.select[6] ? 0 : -1, ifPacket.select[7] ? 0 : -1);
   return cl::sycl::select(thenPacket, elsePacket, condition);
 }
 
 template <>
 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE cl::sycl::cl_float4 pblend(
-    const Selector<unpacket_traits<cl::sycl::cl_float4>::size>& ifPacket,
-    const cl::sycl::cl_float4& thenPacket,
+    const Selector<unpacket_traits<cl::sycl::cl_float4>::size>& ifPacket, const cl::sycl::cl_float4& thenPacket,
     const cl::sycl::cl_float4& elsePacket) {
-  cl::sycl::cl_int4 condition(
-      ifPacket.select[0] ? 0 : -1, ifPacket.select[1] ? 0 : -1,
-      ifPacket.select[2] ? 0 : -1, ifPacket.select[3] ? 0 : -1);
+  cl::sycl::cl_int4 condition(ifPacket.select[0] ? 0 : -1, ifPacket.select[1] ? 0 : -1, ifPacket.select[2] ? 0 : -1,
+                              ifPacket.select[3] ? 0 : -1);
   return cl::sycl::select(thenPacket, elsePacket, condition);
 }
 
 template <>
-inline cl::sycl::cl_double2 pblend(
-    const Selector<unpacket_traits<cl::sycl::cl_double2>::size>& ifPacket,
-    const cl::sycl::cl_double2& thenPacket,
-    const cl::sycl::cl_double2& elsePacket) {
-  cl::sycl::cl_long2 condition(ifPacket.select[0] ? 0 : -1,
-                               ifPacket.select[1] ? 0 : -1);
+inline cl::sycl::cl_double2 pblend(const Selector<unpacket_traits<cl::sycl::cl_double2>::size>& ifPacket,
+                                   const cl::sycl::cl_double2& thenPacket, const cl::sycl::cl_double2& elsePacket) {
+  cl::sycl::cl_long2 condition(ifPacket.select[0] ? 0 : -1, ifPacket.select[1] ? 0 : -1);
   return cl::sycl::select(thenPacket, elsePacket, condition);
 }
 #endif  // SYCL_DEVICE_ONLY
diff --git a/Eigen/src/Core/arch/SYCL/TypeCasting.h b/Eigen/src/Core/arch/SYCL/TypeCasting.h
index 9f193c1..6e3fa4f 100644
--- a/Eigen/src/Core/arch/SYCL/TypeCasting.h
+++ b/Eigen/src/Core/arch/SYCL/TypeCasting.h
@@ -34,10 +34,9 @@
 };
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE cl::sycl::cl_int4
-pcast<cl::sycl::cl_float4, cl::sycl::cl_int4>(const cl::sycl::cl_float4& a) {
-  return a
-      .template convert<cl::sycl::cl_int, cl::sycl::rounding_mode::automatic>();
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE cl::sycl::cl_int4 pcast<cl::sycl::cl_float4, cl::sycl::cl_int4>(
+    const cl::sycl::cl_float4& a) {
+  return a.template convert<cl::sycl::cl_int, cl::sycl::rounding_mode::automatic>();
 }
 
 template <>
@@ -46,10 +45,9 @@
 };
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE cl::sycl::cl_float4
-pcast<cl::sycl::cl_int4, cl::sycl::cl_float4>(const cl::sycl::cl_int4& a) {
-  return a.template convert<cl::sycl::cl_float,
-                            cl::sycl::rounding_mode::automatic>();
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE cl::sycl::cl_float4 pcast<cl::sycl::cl_int4, cl::sycl::cl_float4>(
+    const cl::sycl::cl_int4& a) {
+  return a.template convert<cl::sycl::cl_float, cl::sycl::rounding_mode::automatic>();
 }
 
 template <>
@@ -58,13 +56,10 @@
 };
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE cl::sycl::cl_float4
-pcast<cl::sycl::cl_double2, cl::sycl::cl_float4>(
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE cl::sycl::cl_float4 pcast<cl::sycl::cl_double2, cl::sycl::cl_float4>(
     const cl::sycl::cl_double2& a, const cl::sycl::cl_double2& b) {
-  auto a1 = a.template convert<cl::sycl::cl_float,
-                               cl::sycl::rounding_mode::automatic>();
-  auto b1 = b.template convert<cl::sycl::cl_float,
-                               cl::sycl::rounding_mode::automatic>();
+  auto a1 = a.template convert<cl::sycl::cl_float, cl::sycl::rounding_mode::automatic>();
+  auto b1 = b.template convert<cl::sycl::cl_float, cl::sycl::rounding_mode::automatic>();
   return cl::sycl::cl_float4(a1.x(), a1.y(), b1.x(), b1.y());
 }
 
@@ -74,8 +69,8 @@
 };
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE cl::sycl::cl_double2
-pcast<cl::sycl::cl_float4, cl::sycl::cl_double2>(const cl::sycl::cl_float4& a) {
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE cl::sycl::cl_double2 pcast<cl::sycl::cl_float4, cl::sycl::cl_double2>(
+    const cl::sycl::cl_float4& a) {
   // Simply discard the second half of the input
   return cl::sycl::cl_double2(a.x(), a.y());
 }
diff --git a/Eigen/src/Core/arch/ZVector/Complex.h b/Eigen/src/Core/arch/ZVector/Complex.h
index 4d74d3d..4000e05 100644
--- a/Eigen/src/Core/arch/ZVector/Complex.h
+++ b/Eigen/src/Core/arch/ZVector/Complex.h
@@ -19,21 +19,22 @@
 namespace internal {
 
 #if !defined(__ARCH__) || (defined(__ARCH__) && __ARCH__ >= 12)
-static Packet4ui  p4ui_CONJ_XOR = { 0x00000000, 0x80000000, 0x00000000, 0x80000000 }; //vec_mergeh((Packet4ui)p4i_ZERO, (Packet4ui)p4f_MZERO);
+static Packet4ui p4ui_CONJ_XOR = {0x00000000, 0x80000000, 0x00000000,
+                                  0x80000000};  // vec_mergeh((Packet4ui)p4i_ZERO, (Packet4ui)p4f_MZERO);
 #endif
 
-static Packet2ul  p2ul_CONJ_XOR1 = (Packet2ul) vec_sld((Packet4ui) p2d_ZERO_, (Packet4ui) p2l_ZERO, 8);//{ 0x8000000000000000, 0x0000000000000000 };
-static Packet2ul  p2ul_CONJ_XOR2 = (Packet2ul) vec_sld((Packet4ui) p2l_ZERO,  (Packet4ui) p2d_ZERO_, 8);//{ 0x8000000000000000, 0x0000000000000000 };
+static Packet2ul p2ul_CONJ_XOR1 =
+    (Packet2ul)vec_sld((Packet4ui)p2d_ZERO_, (Packet4ui)p2l_ZERO, 8);  //{ 0x8000000000000000, 0x0000000000000000 };
+static Packet2ul p2ul_CONJ_XOR2 =
+    (Packet2ul)vec_sld((Packet4ui)p2l_ZERO, (Packet4ui)p2d_ZERO_, 8);  //{ 0x8000000000000000, 0x0000000000000000 };
 
-struct Packet1cd
-{
+struct Packet1cd {
   EIGEN_STRONG_INLINE Packet1cd() {}
   EIGEN_STRONG_INLINE explicit Packet1cd(const Packet2d& a) : v(a) {}
   Packet2d v;
 };
 
-struct Packet2cf
-{
+struct Packet2cf {
   EIGEN_STRONG_INLINE Packet2cf() {}
   EIGEN_STRONG_INLINE explicit Packet2cf(const Packet4f& a) : v(a) {}
 #if !defined(__ARCH__) || (defined(__ARCH__) && __ARCH__ < 12)
@@ -46,8 +47,8 @@
 #endif
 };
 
-template<> struct packet_traits<std::complex<float> >  : default_packet_traits
-{
+template <>
+struct packet_traits<std::complex<float> > : default_packet_traits {
   typedef Packet2cf type;
   typedef Packet2cf half;
   enum {
@@ -55,23 +56,22 @@
     AlignedOnScalar = 1,
     size = 2,
 
-    HasAdd    = 1,
-    HasSub    = 1,
-    HasMul    = 1,
-    HasDiv    = 1,
+    HasAdd = 1,
+    HasSub = 1,
+    HasMul = 1,
+    HasDiv = 1,
     HasNegate = 1,
-    HasAbs    = 0,
-    HasAbs2   = 0,
-    HasMin    = 0,
-    HasMax    = 0,
-    HasBlend  = 1,
+    HasAbs = 0,
+    HasAbs2 = 0,
+    HasMin = 0,
+    HasMax = 0,
+    HasBlend = 1,
     HasSetLinear = 0
   };
 };
 
-
-template<> struct packet_traits<std::complex<double> >  : default_packet_traits
-{
+template <>
+struct packet_traits<std::complex<double> > : default_packet_traits {
   typedef Packet1cd type;
   typedef Packet1cd half;
   enum {
@@ -79,58 +79,101 @@
     AlignedOnScalar = 1,
     size = 1,
 
-    HasAdd    = 1,
-    HasSub    = 1,
-    HasMul    = 1,
-    HasDiv    = 1,
+    HasAdd = 1,
+    HasSub = 1,
+    HasMul = 1,
+    HasDiv = 1,
     HasNegate = 1,
-    HasAbs    = 0,
-    HasAbs2   = 0,
-    HasMin    = 0,
-    HasMax    = 0,
+    HasAbs = 0,
+    HasAbs2 = 0,
+    HasMin = 0,
+    HasMax = 0,
     HasSetLinear = 0
   };
 };
 
-template<> struct unpacket_traits<Packet2cf> {
-  typedef std::complex<float>  type;
-  enum {size=2, alignment=Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false};
+template <>
+struct unpacket_traits<Packet2cf> {
+  typedef std::complex<float> type;
+  enum {
+    size = 2,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
   typedef Packet2cf half;
   typedef Packet4f as_real;
 };
-template<> struct unpacket_traits<Packet1cd> {
+template <>
+struct unpacket_traits<Packet1cd> {
   typedef std::complex<double> type;
-  enum {size=1, alignment=Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false};
+  enum {
+    size = 1,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
   typedef Packet1cd half;
   typedef Packet2d as_real;
 };
 
 /* Forward declaration */
-EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet2cf,2>& kernel);
+EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet2cf, 2>& kernel);
 
 /* complex<double> first */
-template<> EIGEN_STRONG_INLINE Packet1cd pload <Packet1cd>(const std::complex<double>* from) { EIGEN_DEBUG_ALIGNED_LOAD return Packet1cd(pload<Packet2d>((const double*)from)); }
-template<> EIGEN_STRONG_INLINE Packet1cd ploadu<Packet1cd>(const std::complex<double>* from) { EIGEN_DEBUG_UNALIGNED_LOAD return Packet1cd(ploadu<Packet2d>((const double*)from)); }
-template<> EIGEN_STRONG_INLINE void pstore <std::complex<double> >(std::complex<double> *   to, const Packet1cd& from) { EIGEN_DEBUG_ALIGNED_STORE pstore((double*)to, from.v); }
-template<> EIGEN_STRONG_INLINE void pstoreu<std::complex<double> >(std::complex<double> *   to, const Packet1cd& from) { EIGEN_DEBUG_UNALIGNED_STORE pstoreu((double*)to, from.v); }
+template <>
+EIGEN_STRONG_INLINE Packet1cd pload<Packet1cd>(const std::complex<double>* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return Packet1cd(pload<Packet2d>((const double*)from));
+}
+template <>
+EIGEN_STRONG_INLINE Packet1cd ploadu<Packet1cd>(const std::complex<double>* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return Packet1cd(ploadu<Packet2d>((const double*)from));
+}
+template <>
+EIGEN_STRONG_INLINE void pstore<std::complex<double> >(std::complex<double>* to, const Packet1cd& from) {
+  EIGEN_DEBUG_ALIGNED_STORE pstore((double*)to, from.v);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<std::complex<double> >(std::complex<double>* to, const Packet1cd& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE pstoreu((double*)to, from.v);
+}
 
-template<> EIGEN_STRONG_INLINE Packet1cd pset1<Packet1cd>(const std::complex<double>&  from)
-{ /* here we really have to use unaligned loads :( */ return ploadu<Packet1cd>(&from); }
+template <>
+EIGEN_STRONG_INLINE Packet1cd
+pset1<Packet1cd>(const std::complex<double>& from) { /* here we really have to use unaligned loads :( */
+  return ploadu<Packet1cd>(&from);
+}
 
-template<> EIGEN_DEVICE_FUNC inline Packet1cd pgather<std::complex<double>, Packet1cd>(const std::complex<double>* from, Index stride EIGEN_UNUSED)
-{
+template <>
+EIGEN_DEVICE_FUNC inline Packet1cd pgather<std::complex<double>, Packet1cd>(const std::complex<double>* from,
+                                                                            Index stride EIGEN_UNUSED) {
   return pload<Packet1cd>(from);
 }
-template<> EIGEN_DEVICE_FUNC inline void pscatter<std::complex<double>, Packet1cd>(std::complex<double>* to, const Packet1cd& from, Index stride EIGEN_UNUSED)
-{
+template <>
+EIGEN_DEVICE_FUNC inline void pscatter<std::complex<double>, Packet1cd>(std::complex<double>* to, const Packet1cd& from,
+                                                                        Index stride EIGEN_UNUSED) {
   pstore<std::complex<double> >(to, from);
 }
-template<> EIGEN_STRONG_INLINE Packet1cd padd<Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(a.v + b.v); }
-template<> EIGEN_STRONG_INLINE Packet1cd psub<Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(a.v - b.v); }
-template<> EIGEN_STRONG_INLINE Packet1cd pnegate(const Packet1cd& a) { return Packet1cd(pnegate(Packet2d(a.v))); }
-template<> EIGEN_STRONG_INLINE Packet1cd pconj(const Packet1cd& a) { return Packet1cd((Packet2d)vec_xor((Packet2d)a.v, (Packet2d)p2ul_CONJ_XOR2)); }
-template<> EIGEN_STRONG_INLINE Packet1cd pmul<Packet1cd>(const Packet1cd& a, const Packet1cd& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet1cd padd<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
+  return Packet1cd(a.v + b.v);
+}
+template <>
+EIGEN_STRONG_INLINE Packet1cd psub<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
+  return Packet1cd(a.v - b.v);
+}
+template <>
+EIGEN_STRONG_INLINE Packet1cd pnegate(const Packet1cd& a) {
+  return Packet1cd(pnegate(Packet2d(a.v)));
+}
+template <>
+EIGEN_STRONG_INLINE Packet1cd pconj(const Packet1cd& a) {
+  return Packet1cd((Packet2d)vec_xor((Packet2d)a.v, (Packet2d)p2ul_CONJ_XOR2));
+}
+template <>
+EIGEN_STRONG_INLINE Packet1cd pmul<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
   Packet2d a_re, a_im, v1, v2;
 
   // Permute and multiply the real parts of a and b
@@ -141,219 +184,285 @@
   v1 = vec_madd(a_re, b.v, p2d_ZERO);
   // multiply a_im * b and get the conjugate result
   v2 = vec_madd(a_im, b.v, p2d_ZERO);
-  v2 = (Packet2d) vec_sld((Packet4ui)v2, (Packet4ui)v2, 8);
-  v2 = (Packet2d) vec_xor((Packet2d)v2, (Packet2d) p2ul_CONJ_XOR1);
+  v2 = (Packet2d)vec_sld((Packet4ui)v2, (Packet4ui)v2, 8);
+  v2 = (Packet2d)vec_xor((Packet2d)v2, (Packet2d)p2ul_CONJ_XOR1);
 
   return Packet1cd(v1 + v2);
 }
-template<> EIGEN_STRONG_INLINE Packet1cd pand    <Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(vec_and(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet1cd por     <Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(vec_or(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet1cd pxor    <Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(vec_xor(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet1cd pandnot <Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(vec_and(a.v, vec_nor(b.v,b.v))); }
-template<> EIGEN_STRONG_INLINE Packet1cd ploaddup<Packet1cd>(const std::complex<double>*     from) {  return pset1<Packet1cd>(*from); }
-template<> EIGEN_STRONG_INLINE Packet1cd pcmp_eq(const Packet1cd& a, const Packet1cd& b) {
-  Packet2d eq = vec_cmpeq (a.v, b.v);
-  Packet2d tmp = { eq[1], eq[0] };
+template <>
+EIGEN_STRONG_INLINE Packet1cd pand<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
+  return Packet1cd(vec_and(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet1cd por<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
+  return Packet1cd(vec_or(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet1cd pxor<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
+  return Packet1cd(vec_xor(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet1cd pandnot<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
+  return Packet1cd(vec_and(a.v, vec_nor(b.v, b.v)));
+}
+template <>
+EIGEN_STRONG_INLINE Packet1cd ploaddup<Packet1cd>(const std::complex<double>* from) {
+  return pset1<Packet1cd>(*from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet1cd pcmp_eq(const Packet1cd& a, const Packet1cd& b) {
+  Packet2d eq = vec_cmpeq(a.v, b.v);
+  Packet2d tmp = {eq[1], eq[0]};
   return (Packet1cd)pand<Packet2d>(eq, tmp);
 }
 
-template<> EIGEN_STRONG_INLINE void prefetch<std::complex<double> >(const std::complex<double> *   addr) { EIGEN_ZVECTOR_PREFETCH(addr); }
+template <>
+EIGEN_STRONG_INLINE void prefetch<std::complex<double> >(const std::complex<double>* addr) {
+  EIGEN_ZVECTOR_PREFETCH(addr);
+}
 
-template<> EIGEN_STRONG_INLINE std::complex<double>  pfirst<Packet1cd>(const Packet1cd& a)
-{
+template <>
+EIGEN_STRONG_INLINE std::complex<double> pfirst<Packet1cd>(const Packet1cd& a) {
   EIGEN_ALIGN16 std::complex<double> res;
   pstore<std::complex<double> >(&res, a);
 
   return res;
 }
 
-template<> EIGEN_STRONG_INLINE Packet1cd preverse(const Packet1cd& a) { return a; }
-template<> EIGEN_STRONG_INLINE std::complex<double> predux<Packet1cd>(const Packet1cd& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet1cd preverse(const Packet1cd& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE std::complex<double> predux<Packet1cd>(const Packet1cd& a) {
   return pfirst(a);
 }
-template<> EIGEN_STRONG_INLINE std::complex<double> predux_mul<Packet1cd>(const Packet1cd& a)
-{
+template <>
+EIGEN_STRONG_INLINE std::complex<double> predux_mul<Packet1cd>(const Packet1cd& a) {
   return pfirst(a);
 }
-EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet1cd,Packet2d)
+EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet1cd, Packet2d)
 
-template<> EIGEN_STRONG_INLINE Packet1cd pdiv<Packet1cd>(const Packet1cd& a, const Packet1cd& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet1cd pdiv<Packet1cd>(const Packet1cd& a, const Packet1cd& b) {
   return pdiv_complex(a, b);
 }
 
-EIGEN_STRONG_INLINE Packet1cd pcplxflip/*<Packet1cd>*/(const Packet1cd& x)
-{
+EIGEN_STRONG_INLINE Packet1cd pcplxflip /*<Packet1cd>*/ (const Packet1cd& x) {
   return Packet1cd(preverse(Packet2d(x.v)));
 }
 
-EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet1cd,2>& kernel)
-{
+EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet1cd, 2>& kernel) {
   Packet2d tmp = vec_perm(kernel.packet[0].v, kernel.packet[1].v, p16uc_TRANSPOSE64_HI);
   kernel.packet[1].v = vec_perm(kernel.packet[0].v, kernel.packet[1].v, p16uc_TRANSPOSE64_LO);
   kernel.packet[0].v = tmp;
 }
 
 /* complex<float> follows */
-template<> EIGEN_STRONG_INLINE Packet2cf pload <Packet2cf>(const std::complex<float>* from)  { EIGEN_DEBUG_ALIGNED_LOAD return Packet2cf(pload<Packet4f>((const float*)from)); }
-template<> EIGEN_STRONG_INLINE Packet2cf ploadu<Packet2cf>(const std::complex<float>* from)  { EIGEN_DEBUG_UNALIGNED_LOAD return Packet2cf(ploadu<Packet4f>((const float*)from)); }
-template<> EIGEN_STRONG_INLINE void pstore <std::complex<float> >(std::complex<float> *     to, const Packet2cf& from) { EIGEN_DEBUG_ALIGNED_STORE pstore((float*)to, from.v); }
-template<> EIGEN_STRONG_INLINE void pstoreu<std::complex<float> >(std::complex<float> *     to, const Packet2cf& from) { EIGEN_DEBUG_UNALIGNED_STORE pstoreu((float*)to, from.v); }
+template <>
+EIGEN_STRONG_INLINE Packet2cf pload<Packet2cf>(const std::complex<float>* from) {
+  EIGEN_DEBUG_ALIGNED_LOAD return Packet2cf(pload<Packet4f>((const float*)from));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf ploadu<Packet2cf>(const std::complex<float>* from) {
+  EIGEN_DEBUG_UNALIGNED_LOAD return Packet2cf(ploadu<Packet4f>((const float*)from));
+}
+template <>
+EIGEN_STRONG_INLINE void pstore<std::complex<float> >(std::complex<float>* to, const Packet2cf& from) {
+  EIGEN_DEBUG_ALIGNED_STORE pstore((float*)to, from.v);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<std::complex<float> >(std::complex<float>* to, const Packet2cf& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE pstoreu((float*)to, from.v);
+}
 
-template<> EIGEN_STRONG_INLINE std::complex<float>  pfirst<Packet2cf>(const Packet2cf& a)
-{
+template <>
+EIGEN_STRONG_INLINE std::complex<float> pfirst<Packet2cf>(const Packet2cf& a) {
   EIGEN_ALIGN16 std::complex<float> res[2];
   pstore<std::complex<float> >(res, a);
 
   return res[0];
 }
 
-
 #if !defined(__ARCH__) || (defined(__ARCH__) && __ARCH__ < 12)
-template<> EIGEN_STRONG_INLINE Packet2cf pset1<Packet2cf>(const std::complex<float>&  from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2cf pset1<Packet2cf>(const std::complex<float>& from) {
   Packet2cf res;
-  res.cd[0] = Packet1cd(vec_ld2f((const float *)&from));
+  res.cd[0] = Packet1cd(vec_ld2f((const float*)&from));
   res.cd[1] = res.cd[0];
   return res;
 }
 #else
-template<> EIGEN_STRONG_INLINE Packet2cf pset1<Packet2cf>(const std::complex<float>&  from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2cf pset1<Packet2cf>(const std::complex<float>& from) {
   Packet2cf res;
-  if((std::ptrdiff_t(&from) % 16) == 0)
-    res.v = pload<Packet4f>((const float *)&from);
+  if ((std::ptrdiff_t(&from) % 16) == 0)
+    res.v = pload<Packet4f>((const float*)&from);
   else
-    res.v = ploadu<Packet4f>((const float *)&from);
+    res.v = ploadu<Packet4f>((const float*)&from);
   res.v = vec_perm(res.v, res.v, p16uc_PSET64_HI);
   return res;
 }
 #endif
 
-template<> EIGEN_DEVICE_FUNC inline Packet2cf pgather<std::complex<float>, Packet2cf>(const std::complex<float>* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC inline Packet2cf pgather<std::complex<float>, Packet2cf>(const std::complex<float>* from,
+                                                                           Index stride) {
   EIGEN_ALIGN16 std::complex<float> af[2];
-  af[0] = from[0*stride];
-  af[1] = from[1*stride];
+  af[0] = from[0 * stride];
+  af[1] = from[1 * stride];
   return pload<Packet2cf>(af);
 }
-template<> EIGEN_DEVICE_FUNC inline void pscatter<std::complex<float>, Packet2cf>(std::complex<float>* to, const Packet2cf& from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC inline void pscatter<std::complex<float>, Packet2cf>(std::complex<float>* to, const Packet2cf& from,
+                                                                       Index stride) {
   EIGEN_ALIGN16 std::complex<float> af[2];
-  pstore<std::complex<float> >((std::complex<float> *) af, from);
-  to[0*stride] = af[0];
-  to[1*stride] = af[1];
+  pstore<std::complex<float> >((std::complex<float>*)af, from);
+  to[0 * stride] = af[0];
+  to[1 * stride] = af[1];
 }
 
-template<> EIGEN_STRONG_INLINE Packet2cf padd<Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(padd<Packet4f>(a.v, b.v)); }
-template<> EIGEN_STRONG_INLINE Packet2cf psub<Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(psub<Packet4f>(a.v, b.v)); }
-template<> EIGEN_STRONG_INLINE Packet2cf pnegate(const Packet2cf& a) { return Packet2cf(pnegate(Packet4f(a.v))); }
+template <>
+EIGEN_STRONG_INLINE Packet2cf padd<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
+  return Packet2cf(padd<Packet4f>(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf psub<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
+  return Packet2cf(psub<Packet4f>(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf pnegate(const Packet2cf& a) {
+  return Packet2cf(pnegate(Packet4f(a.v)));
+}
 
-template<> EIGEN_STRONG_INLINE Packet2cf pand   <Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(pand<Packet4f>(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet2cf por    <Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(por<Packet4f>(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet2cf pxor   <Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(pxor<Packet4f>(a.v,b.v)); }
-template<> EIGEN_STRONG_INLINE Packet2cf pandnot<Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(pandnot<Packet4f>(a.v,b.v)); }
+template <>
+EIGEN_STRONG_INLINE Packet2cf pand<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
+  return Packet2cf(pand<Packet4f>(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf por<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
+  return Packet2cf(por<Packet4f>(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf pxor<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
+  return Packet2cf(pxor<Packet4f>(a.v, b.v));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf pandnot<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
+  return Packet2cf(pandnot<Packet4f>(a.v, b.v));
+}
 
-template<> EIGEN_STRONG_INLINE Packet2cf ploaddup<Packet2cf>(const std::complex<float>*      from) {  return pset1<Packet2cf>(*from); }
+template <>
+EIGEN_STRONG_INLINE Packet2cf ploaddup<Packet2cf>(const std::complex<float>* from) {
+  return pset1<Packet2cf>(*from);
+}
 
-template<> EIGEN_STRONG_INLINE void prefetch<std::complex<float> >(const std::complex<float> *     addr) { EIGEN_ZVECTOR_PREFETCH(addr); }
-
+template <>
+EIGEN_STRONG_INLINE void prefetch<std::complex<float> >(const std::complex<float>* addr) {
+  EIGEN_ZVECTOR_PREFETCH(addr);
+}
 
 #if !defined(__ARCH__) || (defined(__ARCH__) && __ARCH__ < 12)
 
-template<> EIGEN_STRONG_INLINE Packet2cf pcmp_eq(const Packet2cf& a, const Packet2cf& b) {
-  Packet4f eq = pcmp_eq<Packet4f> (a.v, b.v);
+template <>
+EIGEN_STRONG_INLINE Packet2cf pcmp_eq(const Packet2cf& a, const Packet2cf& b) {
+  Packet4f eq = pcmp_eq<Packet4f>(a.v, b.v);
   Packet2cf res;
-  Packet2d tmp1 = { eq.v4f[0][1], eq.v4f[0][0] };
-  Packet2d tmp2 = { eq.v4f[1][1], eq.v4f[1][0] };
+  Packet2d tmp1 = {eq.v4f[0][1], eq.v4f[0][0]};
+  Packet2d tmp2 = {eq.v4f[1][1], eq.v4f[1][0]};
   res.v.v4f[0] = pand<Packet2d>(eq.v4f[0], tmp1);
   res.v.v4f[1] = pand<Packet2d>(eq.v4f[1], tmp2);
   return res;
 }
 
-template<> EIGEN_STRONG_INLINE Packet2cf pconj(const Packet2cf& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2cf pconj(const Packet2cf& a) {
   Packet2cf res;
   res.v.v4f[0] = pconj(Packet1cd(reinterpret_cast<Packet2d>(a.v.v4f[0]))).v;
   res.v.v4f[1] = pconj(Packet1cd(reinterpret_cast<Packet2d>(a.v.v4f[1]))).v;
   return res;
 }
 
-template<> EIGEN_STRONG_INLINE Packet2cf pmul<Packet2cf>(const Packet2cf& a, const Packet2cf& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2cf pmul<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
   Packet2cf res;
-  res.v.v4f[0] = pmul(Packet1cd(reinterpret_cast<Packet2d>(a.v.v4f[0])), Packet1cd(reinterpret_cast<Packet2d>(b.v.v4f[0]))).v;
-  res.v.v4f[1] = pmul(Packet1cd(reinterpret_cast<Packet2d>(a.v.v4f[1])), Packet1cd(reinterpret_cast<Packet2d>(b.v.v4f[1]))).v;
+  res.v.v4f[0] =
+      pmul(Packet1cd(reinterpret_cast<Packet2d>(a.v.v4f[0])), Packet1cd(reinterpret_cast<Packet2d>(b.v.v4f[0]))).v;
+  res.v.v4f[1] =
+      pmul(Packet1cd(reinterpret_cast<Packet2d>(a.v.v4f[1])), Packet1cd(reinterpret_cast<Packet2d>(b.v.v4f[1]))).v;
   return res;
 }
 
-template<> EIGEN_STRONG_INLINE Packet2cf preverse(const Packet2cf& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2cf preverse(const Packet2cf& a) {
   Packet2cf res;
   res.cd[0] = a.cd[1];
   res.cd[1] = a.cd[0];
   return res;
 }
 
-template<> EIGEN_STRONG_INLINE std::complex<float> predux<Packet2cf>(const Packet2cf& a)
-{
+template <>
+EIGEN_STRONG_INLINE std::complex<float> predux<Packet2cf>(const Packet2cf& a) {
   std::complex<float> res;
   Packet1cd b = padd<Packet1cd>(a.cd[0], a.cd[1]);
   vec_st2f(b.v, (float*)&res);
   return res;
 }
 
-template<> EIGEN_STRONG_INLINE std::complex<float> predux_mul<Packet2cf>(const Packet2cf& a)
-{
+template <>
+EIGEN_STRONG_INLINE std::complex<float> predux_mul<Packet2cf>(const Packet2cf& a) {
   std::complex<float> res;
   Packet1cd b = pmul<Packet1cd>(a.cd[0], a.cd[1]);
   vec_st2f(b.v, (float*)&res);
   return res;
 }
 
-EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet2cf,Packet4f)
+EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet2cf, Packet4f)
 
-template<> EIGEN_STRONG_INLINE Packet2cf pdiv<Packet2cf>(const Packet2cf& a, const Packet2cf& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2cf pdiv<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
   return pdiv_complex(a, b);
 }
 
-EIGEN_STRONG_INLINE Packet2cf pcplxflip/*<Packet2cf>*/(const Packet2cf& x)
-{
+EIGEN_STRONG_INLINE Packet2cf pcplxflip /*<Packet2cf>*/ (const Packet2cf& x) {
   Packet2cf res;
   res.cd[0] = pcplxflip(x.cd[0]);
   res.cd[1] = pcplxflip(x.cd[1]);
   return res;
 }
 
-EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet2cf,2>& kernel)
-{
+EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet2cf, 2>& kernel) {
   Packet1cd tmp = kernel.packet[0].cd[1];
   kernel.packet[0].cd[1] = kernel.packet[1].cd[0];
   kernel.packet[1].cd[0] = tmp;
 }
 
-template<> EIGEN_STRONG_INLINE Packet2cf pblend(const Selector<2>& ifPacket, const Packet2cf& thenPacket, const Packet2cf& elsePacket) {
+template <>
+EIGEN_STRONG_INLINE Packet2cf pblend(const Selector<2>& ifPacket, const Packet2cf& thenPacket,
+                                     const Packet2cf& elsePacket) {
   Packet2cf result;
-  const Selector<4> ifPacket4 = { ifPacket.select[0], ifPacket.select[0], ifPacket.select[1], ifPacket.select[1] };
+  const Selector<4> ifPacket4 = {ifPacket.select[0], ifPacket.select[0], ifPacket.select[1], ifPacket.select[1]};
   result.v = pblend<Packet4f>(ifPacket4, thenPacket.v, elsePacket.v);
   return result;
 }
 #else
-template<> EIGEN_STRONG_INLINE Packet2cf pcmp_eq(const Packet2cf& a, const Packet2cf& b) {
-  Packet4f eq = vec_cmpeq (a.v, b.v);
-  Packet4f tmp = { eq[1], eq[0], eq[3], eq[2] };
+template <>
+EIGEN_STRONG_INLINE Packet2cf pcmp_eq(const Packet2cf& a, const Packet2cf& b) {
+  Packet4f eq = vec_cmpeq(a.v, b.v);
+  Packet4f tmp = {eq[1], eq[0], eq[3], eq[2]};
   return (Packet2cf)pand<Packet4f>(eq, tmp);
 }
-template<> EIGEN_STRONG_INLINE Packet2cf pconj(const Packet2cf& a) { return Packet2cf(pxor<Packet4f>(a.v, reinterpret_cast<Packet4f>(p4ui_CONJ_XOR))); }
-template<> EIGEN_STRONG_INLINE Packet2cf pmul<Packet2cf>(const Packet2cf& a, const Packet2cf& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2cf pconj(const Packet2cf& a) {
+  return Packet2cf(pxor<Packet4f>(a.v, reinterpret_cast<Packet4f>(p4ui_CONJ_XOR)));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2cf pmul<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
   Packet4f a_re, a_im, prod, prod_im;
 
   // Permute and multiply the real parts of a and b
   a_re = vec_perm(a.v, a.v, p16uc_PSET32_WODD);
-  
+
   // Get the imaginary parts of a
   a_im = vec_perm(a.v, a.v, p16uc_PSET32_WEVEN);
 
@@ -365,27 +474,27 @@
 
   // multiply a_re * b, add prod_im
   prod = pmadd<Packet4f>(a_re, b.v, prod_im);
- 
+
   return Packet2cf(prod);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2cf preverse(const Packet2cf& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2cf preverse(const Packet2cf& a) {
   Packet4f rev_a;
   rev_a = vec_perm(a.v, a.v, p16uc_COMPLEX32_REV2);
   return Packet2cf(rev_a);
 }
 
-template<> EIGEN_STRONG_INLINE std::complex<float> predux<Packet2cf>(const Packet2cf& a)
-{
+template <>
+EIGEN_STRONG_INLINE std::complex<float> predux<Packet2cf>(const Packet2cf& a) {
   Packet4f b;
   b = vec_sld(a.v, a.v, 8);
   b = padd<Packet4f>(a.v, b);
   return pfirst<Packet2cf>(Packet2cf(b));
 }
 
-template<> EIGEN_STRONG_INLINE std::complex<float> predux_mul<Packet2cf>(const Packet2cf& a)
-{
+template <>
+EIGEN_STRONG_INLINE std::complex<float> predux_mul<Packet2cf>(const Packet2cf& a) {
   Packet4f b;
   Packet2cf prod;
   b = vec_sld(a.v, a.v, 8);
@@ -394,34 +503,36 @@
   return pfirst<Packet2cf>(prod);
 }
 
-EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet2cf,Packet4f)
+EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(Packet2cf, Packet4f)
 
-template<> EIGEN_STRONG_INLINE Packet2cf pdiv<Packet2cf>(const Packet2cf& a, const Packet2cf& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2cf pdiv<Packet2cf>(const Packet2cf& a, const Packet2cf& b) {
   return pdiv_complex(a, b);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2cf pcplxflip<Packet2cf>(const Packet2cf& x)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2cf pcplxflip<Packet2cf>(const Packet2cf& x) {
   return Packet2cf(vec_perm(x.v, x.v, p16uc_COMPLEX32_REV));
 }
 
-EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet2cf,2>& kernel)
-{
+EIGEN_STRONG_INLINE void ptranspose(PacketBlock<Packet2cf, 2>& kernel) {
   Packet4f tmp = vec_perm(kernel.packet[0].v, kernel.packet[1].v, p16uc_TRANSPOSE64_HI);
   kernel.packet[1].v = vec_perm(kernel.packet[0].v, kernel.packet[1].v, p16uc_TRANSPOSE64_LO);
   kernel.packet[0].v = tmp;
 }
 
-template<> EIGEN_STRONG_INLINE Packet2cf pblend(const Selector<2>& ifPacket, const Packet2cf& thenPacket, const Packet2cf& elsePacket) {
+template <>
+EIGEN_STRONG_INLINE Packet2cf pblend(const Selector<2>& ifPacket, const Packet2cf& thenPacket,
+                                     const Packet2cf& elsePacket) {
   Packet2cf result;
-  result.v = reinterpret_cast<Packet4f>(pblend<Packet2d>(ifPacket, reinterpret_cast<Packet2d>(thenPacket.v), reinterpret_cast<Packet2d>(elsePacket.v)));
+  result.v = reinterpret_cast<Packet4f>(
+      pblend<Packet2d>(ifPacket, reinterpret_cast<Packet2d>(thenPacket.v), reinterpret_cast<Packet2d>(elsePacket.v)));
   return result;
 }
 #endif
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_COMPLEX32_ZVECTOR_H
+#endif  // EIGEN_COMPLEX32_ZVECTOR_H
diff --git a/Eigen/src/Core/arch/ZVector/MathFunctions.h b/Eigen/src/Core/arch/ZVector/MathFunctions.h
index 1b43878..5c55350 100644
--- a/Eigen/src/Core/arch/ZVector/MathFunctions.h
+++ b/Eigen/src/Core/arch/ZVector/MathFunctions.h
@@ -24,7 +24,7 @@
 namespace internal {
 
 #if !defined(__ARCH__) || (defined(__ARCH__) && __ARCH__ >= 12)
-static EIGEN_DECLARE_CONST_Packet4f(1 , 1.0f);
+static EIGEN_DECLARE_CONST_Packet4f(1, 1.0f);
 static EIGEN_DECLARE_CONST_Packet4f(half, 0.5f);
 static EIGEN_DECLARE_CONST_Packet4i(0x7f, 0x7f);
 static EIGEN_DECLARE_CONST_Packet4i(23, 23);
@@ -32,27 +32,27 @@
 static EIGEN_DECLARE_CONST_Packet4f_FROM_INT(inv_mant_mask, ~0x7f800000);
 
 /* the smallest non denormalized float number */
-static EIGEN_DECLARE_CONST_Packet4f_FROM_INT(min_norm_pos,  0x00800000);
-static EIGEN_DECLARE_CONST_Packet4f_FROM_INT(minus_inf,     0xff800000); // -1.f/0.f
-static EIGEN_DECLARE_CONST_Packet4f_FROM_INT(minus_nan,     0xffffffff);
-  
+static EIGEN_DECLARE_CONST_Packet4f_FROM_INT(min_norm_pos, 0x00800000);
+static EIGEN_DECLARE_CONST_Packet4f_FROM_INT(minus_inf, 0xff800000);  // -1.f/0.f
+static EIGEN_DECLARE_CONST_Packet4f_FROM_INT(minus_nan, 0xffffffff);
+
 /* natural logarithm computed for 4 simultaneous float
   return NaN for x <= 0
 */
 static EIGEN_DECLARE_CONST_Packet4f(cephes_SQRTHF, 0.707106781186547524f);
 static EIGEN_DECLARE_CONST_Packet4f(cephes_log_p0, 7.0376836292E-2f);
-static EIGEN_DECLARE_CONST_Packet4f(cephes_log_p1, - 1.1514610310E-1f);
+static EIGEN_DECLARE_CONST_Packet4f(cephes_log_p1, -1.1514610310E-1f);
 static EIGEN_DECLARE_CONST_Packet4f(cephes_log_p2, 1.1676998740E-1f);
-static EIGEN_DECLARE_CONST_Packet4f(cephes_log_p3, - 1.2420140846E-1f);
-static EIGEN_DECLARE_CONST_Packet4f(cephes_log_p4, + 1.4249322787E-1f);
-static EIGEN_DECLARE_CONST_Packet4f(cephes_log_p5, - 1.6668057665E-1f);
-static EIGEN_DECLARE_CONST_Packet4f(cephes_log_p6, + 2.0000714765E-1f);
-static EIGEN_DECLARE_CONST_Packet4f(cephes_log_p7, - 2.4999993993E-1f);
-static EIGEN_DECLARE_CONST_Packet4f(cephes_log_p8, + 3.3333331174E-1f);
+static EIGEN_DECLARE_CONST_Packet4f(cephes_log_p3, -1.2420140846E-1f);
+static EIGEN_DECLARE_CONST_Packet4f(cephes_log_p4, +1.4249322787E-1f);
+static EIGEN_DECLARE_CONST_Packet4f(cephes_log_p5, -1.6668057665E-1f);
+static EIGEN_DECLARE_CONST_Packet4f(cephes_log_p6, +2.0000714765E-1f);
+static EIGEN_DECLARE_CONST_Packet4f(cephes_log_p7, -2.4999993993E-1f);
+static EIGEN_DECLARE_CONST_Packet4f(cephes_log_p8, +3.3333331174E-1f);
 static EIGEN_DECLARE_CONST_Packet4f(cephes_log_q1, -2.12194440e-4f);
 static EIGEN_DECLARE_CONST_Packet4f(cephes_log_q2, 0.693359375f);
 
-static EIGEN_DECLARE_CONST_Packet4f(exp_hi,  88.3762626647950f);
+static EIGEN_DECLARE_CONST_Packet4f(exp_hi, 88.3762626647950f);
 static EIGEN_DECLARE_CONST_Packet4f(exp_lo, -88.3762626647949f);
 
 static EIGEN_DECLARE_CONST_Packet4f(cephes_LOG2EF, 1.44269504088896341f);
@@ -67,11 +67,11 @@
 static EIGEN_DECLARE_CONST_Packet4f(cephes_exp_p5, 5.0000001201E-1f);
 #endif
 
-static EIGEN_DECLARE_CONST_Packet2d(1 , 1.0);
-static EIGEN_DECLARE_CONST_Packet2d(2 , 2.0);
+static EIGEN_DECLARE_CONST_Packet2d(1, 1.0);
+static EIGEN_DECLARE_CONST_Packet2d(2, 2.0);
 static EIGEN_DECLARE_CONST_Packet2d(half, 0.5);
 
-static EIGEN_DECLARE_CONST_Packet2d(exp_hi,  709.437);
+static EIGEN_DECLARE_CONST_Packet2d(exp_hi, 709.437);
 static EIGEN_DECLARE_CONST_Packet2d(exp_lo, -709.436139303);
 
 static EIGEN_DECLARE_CONST_Packet2d(cephes_LOG2EF, 1.4426950408889634073599);
@@ -88,9 +88,8 @@
 static EIGEN_DECLARE_CONST_Packet2d(cephes_exp_C1, 0.693145751953125);
 static EIGEN_DECLARE_CONST_Packet2d(cephes_exp_C2, 1.42860682030941723212e-6);
 
-template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet2d pexp<Packet2d>(const Packet2d& _x)
-{
+template <>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet2d pexp<Packet2d>(const Packet2d& _x) {
   Packet2d x = _x;
 
   Packet2d tmp, fx;
@@ -108,40 +107,38 @@
   x = psub(x, tmp);
   x = psub(x, z);
 
-  Packet2d x2 = pmul(x,x);
+  Packet2d x2 = pmul(x, x);
 
   Packet2d px = p2d_cephes_exp_p0;
   px = pmadd(px, x2, p2d_cephes_exp_p1);
   px = pmadd(px, x2, p2d_cephes_exp_p2);
-  px = pmul (px, x);
+  px = pmul(px, x);
 
   Packet2d qx = p2d_cephes_exp_q0;
   qx = pmadd(qx, x2, p2d_cephes_exp_q1);
   qx = pmadd(qx, x2, p2d_cephes_exp_q2);
   qx = pmadd(qx, x2, p2d_cephes_exp_q3);
 
-  x = pdiv(px,psub(qx,px));
-  x = pmadd(p2d_2,x,p2d_1);
+  x = pdiv(px, psub(qx, px));
+  x = pmadd(p2d_2, x, p2d_1);
 
   // build 2^n
   emm0 = vec_ctsl(fx, 0);
 
-  static const Packet2l p2l_1023 = { 1023, 1023 };
-  static const Packet2ul p2ul_52 = { 52, 52 };
+  static const Packet2l p2l_1023 = {1023, 1023};
+  static const Packet2ul p2ul_52 = {52, 52};
 
   emm0 = emm0 + p2l_1023;
   emm0 = emm0 << reinterpret_cast<Packet2l>(p2ul_52);
 
-  // Altivec's max & min operators just drop silent NaNs. Check NaNs in 
+  // Altivec's max & min operators just drop silent NaNs. Check NaNs in
   // inputs and return them unmodified.
   Packet2ul isnumber_mask = reinterpret_cast<Packet2ul>(vec_cmpeq(_x, _x));
-  return vec_sel(_x, pmax(pmul(x, reinterpret_cast<Packet2d>(emm0)), _x),
-                 isnumber_mask);
+  return vec_sel(_x, pmax(pmul(x, reinterpret_cast<Packet2d>(emm0)), _x), isnumber_mask);
 }
 
-template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet4f pexp<Packet4f>(const Packet4f& _x)
-{
+template <>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet4f pexp<Packet4f>(const Packet4f& _x) {
 #if !defined(__ARCH__) || (defined(__ARCH__) && __ARCH__ >= 12)
   Packet4f x = _x;
 
@@ -161,7 +158,7 @@
   x = psub(x, tmp);
   x = psub(x, z);
 
-  z = pmul(x,x);
+  z = pmul(x, x);
 
   Packet4f y = p4f_cephes_exp_p0;
   y = pmadd(y, x, p4f_cephes_exp_p1);
@@ -173,7 +170,7 @@
   y = padd(y, p4f_1);
 
   // build 2^n
-  emm0 = (Packet4i){ (int)fx[0], (int)fx[1], (int)fx[2], (int)fx[3] };
+  emm0 = (Packet4i){(int)fx[0], (int)fx[1], (int)fx[2], (int)fx[3]};
   emm0 = emm0 + p4i_0x7f;
   emm0 = emm0 << reinterpret_cast<Packet4i>(p4i_23);
 
@@ -186,15 +183,13 @@
 #endif
 }
 
-template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet2d psqrt<Packet2d>(const Packet2d& x)
-{
+template <>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet2d psqrt<Packet2d>(const Packet2d& x) {
   return vec_sqrt(x);
 }
 
-template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet4f psqrt<Packet4f>(const Packet4f& x)
-{
+template <>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet4f psqrt<Packet4f>(const Packet4f& x) {
   Packet4f res;
 #if !defined(__ARCH__) || (defined(__ARCH__) && __ARCH__ >= 12)
   res = vec_sqrt(x);
@@ -205,13 +200,13 @@
   return res;
 }
 
-template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet2d prsqrt<Packet2d>(const Packet2d& x) {
+template <>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet2d prsqrt<Packet2d>(const Packet2d& x) {
   return pset1<Packet2d>(1.0) / psqrt<Packet2d>(x);
 }
 
-template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet4f prsqrt<Packet4f>(const Packet4f& x) {
+template <>
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet4f prsqrt<Packet4f>(const Packet4f& x) {
   Packet4f res;
 #if !defined(__ARCH__) || (defined(__ARCH__) && __ARCH__ >= 12)
   res = pset1<Packet4f>(1.0) / psqrt<Packet4f>(x);
@@ -224,8 +219,7 @@
 
 // Hyperbolic Tangent function.
 template <>
-EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet4f
-ptanh<Packet4f>(const Packet4f& x) {
+EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet4f ptanh<Packet4f>(const Packet4f& x) {
   return internal::generic_fast_tanh_float(x);
 }
 
diff --git a/Eigen/src/Core/arch/ZVector/PacketMath.h b/Eigen/src/Core/arch/ZVector/PacketMath.h
index 07de778..8ac8f77 100644
--- a/Eigen/src/Core/arch/ZVector/PacketMath.h
+++ b/Eigen/src/Core/arch/ZVector/PacketMath.h
@@ -26,135 +26,136 @@
 #endif
 
 #ifndef EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS
-#define EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS  32
+#define EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS 32
 #endif
 
-typedef __vector int                 Packet4i;
-typedef __vector unsigned int        Packet4ui;
-typedef __vector __bool int          Packet4bi;
-typedef __vector short int           Packet8i;
-typedef __vector unsigned char       Packet16uc;
-typedef __vector double              Packet2d;
-typedef __vector unsigned long long  Packet2ul;
-typedef __vector long long           Packet2l;
+typedef __vector int Packet4i;
+typedef __vector unsigned int Packet4ui;
+typedef __vector __bool int Packet4bi;
+typedef __vector short int Packet8i;
+typedef __vector unsigned char Packet16uc;
+typedef __vector double Packet2d;
+typedef __vector unsigned long long Packet2ul;
+typedef __vector long long Packet2l;
 
 // Z14 has builtin support for float vectors
 #if !defined(__ARCH__) || (defined(__ARCH__) && __ARCH__ >= 12)
-typedef __vector float               Packet4f;
+typedef __vector float Packet4f;
 #else
 typedef struct {
-	Packet2d  v4f[2];
+  Packet2d v4f[2];
 } Packet4f;
 #endif
 
 typedef union {
-  numext::int32_t   i[4];
+  numext::int32_t i[4];
   numext::uint32_t ui[4];
-  numext::int64_t   l[2];
+  numext::int64_t l[2];
   numext::uint64_t ul[2];
-  double    d[2];
-  float     f[4];
-  Packet4i  v4i;
+  double d[2];
+  float f[4];
+  Packet4i v4i;
   Packet4ui v4ui;
-  Packet2l  v2l;
+  Packet2l v2l;
   Packet2ul v2ul;
-  Packet2d  v2d;
+  Packet2d v2d;
 #if !defined(__ARCH__) || (defined(__ARCH__) && __ARCH__ >= 12)
-  Packet4f  v4f;
+  Packet4f v4f;
 #endif
 } Packet;
 
 // We don't want to write the same code all the time, but we need to reuse the constants
 // and it doesn't really work to declare them global, so we define macros instead
 
-#define EIGEN_DECLARE_CONST_FAST_Packet4i(NAME,X) \
-  Packet4i p4i_##NAME = reinterpret_cast<Packet4i>(vec_splat_s32(X))
+#define EIGEN_DECLARE_CONST_FAST_Packet4i(NAME, X) Packet4i p4i_##NAME = reinterpret_cast<Packet4i>(vec_splat_s32(X))
 
-#define EIGEN_DECLARE_CONST_FAST_Packet2d(NAME,X) \
-  Packet2d p2d_##NAME = reinterpret_cast<Packet2d>(vec_splat_s64(X))
+#define EIGEN_DECLARE_CONST_FAST_Packet2d(NAME, X) Packet2d p2d_##NAME = reinterpret_cast<Packet2d>(vec_splat_s64(X))
 
-#define EIGEN_DECLARE_CONST_FAST_Packet2l(NAME,X) \
-  Packet2l p2l_##NAME = reinterpret_cast<Packet2l>(vec_splat_s64(X))
+#define EIGEN_DECLARE_CONST_FAST_Packet2l(NAME, X) Packet2l p2l_##NAME = reinterpret_cast<Packet2l>(vec_splat_s64(X))
 
-#define EIGEN_DECLARE_CONST_Packet4i(NAME,X) \
-  Packet4i p4i_##NAME = pset1<Packet4i>(X)
+#define EIGEN_DECLARE_CONST_Packet4i(NAME, X) Packet4i p4i_##NAME = pset1<Packet4i>(X)
 
-#define EIGEN_DECLARE_CONST_Packet2d(NAME,X) \
-  Packet2d p2d_##NAME = pset1<Packet2d>(X)
+#define EIGEN_DECLARE_CONST_Packet2d(NAME, X) Packet2d p2d_##NAME = pset1<Packet2d>(X)
 
-#define EIGEN_DECLARE_CONST_Packet2l(NAME,X) \
-  Packet2l p2l_##NAME = pset1<Packet2l>(X)
+#define EIGEN_DECLARE_CONST_Packet2l(NAME, X) Packet2l p2l_##NAME = pset1<Packet2l>(X)
 
 // These constants are endian-agnostic
-static EIGEN_DECLARE_CONST_FAST_Packet4i(ZERO, 0); //{ 0, 0, 0, 0,}
-static EIGEN_DECLARE_CONST_FAST_Packet4i(ONE, 1); //{ 1, 1, 1, 1}
+static EIGEN_DECLARE_CONST_FAST_Packet4i(ZERO, 0);  //{ 0, 0, 0, 0,}
+static EIGEN_DECLARE_CONST_FAST_Packet4i(ONE, 1);   //{ 1, 1, 1, 1}
 
 static EIGEN_DECLARE_CONST_FAST_Packet2d(ZERO, 0);
 static EIGEN_DECLARE_CONST_FAST_Packet2l(ZERO, 0);
 static EIGEN_DECLARE_CONST_FAST_Packet2l(ONE, 1);
 
-static Packet2d p2d_ONE = { 1.0, 1.0 };
-static Packet2d p2d_ZERO_ = { numext::bit_cast<double>(0x8000000000000000ull),
-                              numext::bit_cast<double>(0x8000000000000000ull) };
+static Packet2d p2d_ONE = {1.0, 1.0};
+static Packet2d p2d_ZERO_ = {numext::bit_cast<double>(0x8000000000000000ull),
+                             numext::bit_cast<double>(0x8000000000000000ull)};
 
 #if !defined(__ARCH__) || (defined(__ARCH__) && __ARCH__ >= 12)
-#define EIGEN_DECLARE_CONST_FAST_Packet4f(NAME,X) \
-  Packet4f p4f_##NAME = reinterpret_cast<Packet4f>(vec_splat_s32(X))
+#define EIGEN_DECLARE_CONST_FAST_Packet4f(NAME, X) Packet4f p4f_##NAME = reinterpret_cast<Packet4f>(vec_splat_s32(X))
 
-#define EIGEN_DECLARE_CONST_Packet4f(NAME,X) \
-  Packet4f p4f_##NAME = pset1<Packet4f>(X)
+#define EIGEN_DECLARE_CONST_Packet4f(NAME, X) Packet4f p4f_##NAME = pset1<Packet4f>(X)
 
-#define EIGEN_DECLARE_CONST_Packet4f_FROM_INT(NAME,X) \
+#define EIGEN_DECLARE_CONST_Packet4f_FROM_INT(NAME, X) \
   const Packet4f p4f_##NAME = reinterpret_cast<Packet4f>(pset1<Packet4i>(X))
 
-static EIGEN_DECLARE_CONST_FAST_Packet4f(ZERO, 0); //{ 0.0, 0.0, 0.0, 0.0}
-static EIGEN_DECLARE_CONST_FAST_Packet4i(MINUS1,-1); //{ -1, -1, -1, -1}
-static Packet4f p4f_MZERO = { 0x80000000, 0x80000000, 0x80000000, 0x80000000};
+static EIGEN_DECLARE_CONST_FAST_Packet4f(ZERO, 0);     //{ 0.0, 0.0, 0.0, 0.0}
+static EIGEN_DECLARE_CONST_FAST_Packet4i(MINUS1, -1);  //{ -1, -1, -1, -1}
+static Packet4f p4f_MZERO = {0x80000000, 0x80000000, 0x80000000, 0x80000000};
 #endif
 
-static Packet4i p4i_COUNTDOWN = { 0, 1, 2, 3 };
-static Packet4f p4f_COUNTDOWN = { 0.0, 1.0, 2.0, 3.0 };
-static Packet2d p2d_COUNTDOWN = reinterpret_cast<Packet2d>(vec_sld(reinterpret_cast<Packet16uc>(p2d_ZERO), reinterpret_cast<Packet16uc>(p2d_ONE), 8));
+static Packet4i p4i_COUNTDOWN = {0, 1, 2, 3};
+static Packet4f p4f_COUNTDOWN = {0.0, 1.0, 2.0, 3.0};
+static Packet2d p2d_COUNTDOWN = reinterpret_cast<Packet2d>(
+    vec_sld(reinterpret_cast<Packet16uc>(p2d_ZERO), reinterpret_cast<Packet16uc>(p2d_ONE), 8));
 
-static Packet16uc p16uc_PSET64_HI = { 0,1,2,3, 4,5,6,7, 0,1,2,3, 4,5,6,7 };
-static Packet16uc p16uc_DUPLICATE32_HI = { 0,1,2,3, 0,1,2,3, 4,5,6,7, 4,5,6,7 };
+static Packet16uc p16uc_PSET64_HI = {0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7};
+static Packet16uc p16uc_DUPLICATE32_HI = {0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 6, 7, 4, 5, 6, 7};
 
 // Mask alignment
-#define EIGEN_MASK_ALIGNMENT	0xfffffffffffffff0
+#define EIGEN_MASK_ALIGNMENT 0xfffffffffffffff0
 
-#define EIGEN_ALIGNED_PTR(x)	((std::ptrdiff_t)(x) & EIGEN_MASK_ALIGNMENT)
+#define EIGEN_ALIGNED_PTR(x) ((std::ptrdiff_t)(x) & EIGEN_MASK_ALIGNMENT)
 
 // Handle endianness properly while loading constants
 // Define global static constants:
 
-static Packet16uc p16uc_FORWARD =   { 0,1,2,3, 4,5,6,7, 8,9,10,11, 12,13,14,15 };
-static Packet16uc p16uc_REVERSE32 = { 12,13,14,15, 8,9,10,11, 4,5,6,7, 0,1,2,3 };
-static Packet16uc p16uc_REVERSE64 = { 8,9,10,11, 12,13,14,15, 0,1,2,3, 4,5,6,7 };
+static Packet16uc p16uc_FORWARD = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
+static Packet16uc p16uc_REVERSE32 = {12, 13, 14, 15, 8, 9, 10, 11, 4, 5, 6, 7, 0, 1, 2, 3};
+static Packet16uc p16uc_REVERSE64 = {8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7};
 
-static Packet16uc p16uc_PSET32_WODD   = vec_sld((Packet16uc) vec_splat((Packet4ui)p16uc_FORWARD, 0), (Packet16uc) vec_splat((Packet4ui)p16uc_FORWARD, 2), 8);//{ 0,1,2,3, 0,1,2,3, 8,9,10,11, 8,9,10,11 };
-static Packet16uc p16uc_PSET32_WEVEN  = vec_sld(p16uc_DUPLICATE32_HI, (Packet16uc) vec_splat((Packet4ui)p16uc_FORWARD, 3), 8);//{ 4,5,6,7, 4,5,6,7, 12,13,14,15, 12,13,14,15 };
-/*static Packet16uc p16uc_HALF64_0_16 = vec_sld((Packet16uc)p4i_ZERO, vec_splat((Packet16uc) vec_abs(p4i_MINUS16), 3), 8);      //{ 0,0,0,0, 0,0,0,0, 16,16,16,16, 16,16,16,16};
+static Packet16uc p16uc_PSET32_WODD =
+    vec_sld((Packet16uc)vec_splat((Packet4ui)p16uc_FORWARD, 0), (Packet16uc)vec_splat((Packet4ui)p16uc_FORWARD, 2),
+            8);  //{ 0,1,2,3, 0,1,2,3, 8,9,10,11, 8,9,10,11 };
+static Packet16uc p16uc_PSET32_WEVEN = vec_sld(p16uc_DUPLICATE32_HI, (Packet16uc)vec_splat((Packet4ui)p16uc_FORWARD, 3),
+                                               8);  //{ 4,5,6,7, 4,5,6,7, 12,13,14,15, 12,13,14,15 };
+/*static Packet16uc p16uc_HALF64_0_16 = vec_sld((Packet16uc)p4i_ZERO, vec_splat((Packet16uc) vec_abs(p4i_MINUS16), 3),
+8);      //{ 0,0,0,0, 0,0,0,0, 16,16,16,16, 16,16,16,16};
 
-static Packet16uc p16uc_PSET64_HI = (Packet16uc) vec_mergeh((Packet4ui)p16uc_PSET32_WODD, (Packet4ui)p16uc_PSET32_WEVEN);     //{ 0,1,2,3, 4,5,6,7, 0,1,2,3, 4,5,6,7 };*/
-static Packet16uc p16uc_PSET64_LO = (Packet16uc) vec_mergel((Packet4ui)p16uc_PSET32_WODD, (Packet4ui)p16uc_PSET32_WEVEN);     //{ 8,9,10,11, 12,13,14,15, 8,9,10,11, 12,13,14,15 };
-/*static Packet16uc p16uc_TRANSPOSE64_HI = vec_add(p16uc_PSET64_HI, p16uc_HALF64_0_16);                                         //{ 0,1,2,3, 4,5,6,7, 16,17,18,19, 20,21,22,23};
-static Packet16uc p16uc_TRANSPOSE64_LO = vec_add(p16uc_PSET64_LO, p16uc_HALF64_0_16);                                         //{ 8,9,10,11, 12,13,14,15, 24,25,26,27, 28,29,30,31};*/
-static Packet16uc p16uc_TRANSPOSE64_HI = { 0,1,2,3, 4,5,6,7, 16,17,18,19, 20,21,22,23};
-static Packet16uc p16uc_TRANSPOSE64_LO = { 8,9,10,11, 12,13,14,15, 24,25,26,27, 28,29,30,31};
+static Packet16uc p16uc_PSET64_HI = (Packet16uc) vec_mergeh((Packet4ui)p16uc_PSET32_WODD,
+(Packet4ui)p16uc_PSET32_WEVEN);     //{ 0,1,2,3, 4,5,6,7, 0,1,2,3, 4,5,6,7 };*/
+static Packet16uc p16uc_PSET64_LO = (Packet16uc)vec_mergel(
+    (Packet4ui)p16uc_PSET32_WODD, (Packet4ui)p16uc_PSET32_WEVEN);  //{ 8,9,10,11, 12,13,14,15, 8,9,10,11, 12,13,14,15 };
+/*static Packet16uc p16uc_TRANSPOSE64_HI = vec_add(p16uc_PSET64_HI, p16uc_HALF64_0_16); //{ 0,1,2,3, 4,5,6,7,
+16,17,18,19, 20,21,22,23}; static Packet16uc p16uc_TRANSPOSE64_LO = vec_add(p16uc_PSET64_LO, p16uc_HALF64_0_16); //{
+8,9,10,11, 12,13,14,15, 24,25,26,27, 28,29,30,31};*/
+static Packet16uc p16uc_TRANSPOSE64_HI = {0, 1, 2, 3, 4, 5, 6, 7, 16, 17, 18, 19, 20, 21, 22, 23};
+static Packet16uc p16uc_TRANSPOSE64_LO = {8, 9, 10, 11, 12, 13, 14, 15, 24, 25, 26, 27, 28, 29, 30, 31};
 
-static Packet16uc p16uc_COMPLEX32_REV = vec_sld(p16uc_REVERSE32, p16uc_REVERSE32, 8);                                         //{ 4,5,6,7, 0,1,2,3, 12,13,14,15, 8,9,10,11 };
+static Packet16uc p16uc_COMPLEX32_REV =
+    vec_sld(p16uc_REVERSE32, p16uc_REVERSE32, 8);  //{ 4,5,6,7, 0,1,2,3, 12,13,14,15, 8,9,10,11 };
 
-static Packet16uc p16uc_COMPLEX32_REV2 = vec_sld(p16uc_FORWARD, p16uc_FORWARD, 8);                                            //{ 8,9,10,11, 12,13,14,15, 0,1,2,3, 4,5,6,7 };
-
+static Packet16uc p16uc_COMPLEX32_REV2 =
+    vec_sld(p16uc_FORWARD, p16uc_FORWARD, 8);  //{ 8,9,10,11, 12,13,14,15, 0,1,2,3, 4,5,6,7 };
 
 #if EIGEN_HAS_BUILTIN(__builtin_prefetch) || EIGEN_COMP_GNUC
-  #define EIGEN_ZVECTOR_PREFETCH(ADDR) __builtin_prefetch(ADDR);
+#define EIGEN_ZVECTOR_PREFETCH(ADDR) __builtin_prefetch(ADDR);
 #else
-  #define EIGEN_ZVECTOR_PREFETCH(ADDR) asm( "   pfd [%[addr]]\n" :: [addr] "r" (ADDR) : "cc" );
+#define EIGEN_ZVECTOR_PREFETCH(ADDR) asm("   pfd [%[addr]]\n" ::[addr] "r"(ADDR) : "cc");
 #endif
 
-template<> struct packet_traits<int>    : default_packet_traits
-{
+template <>
+struct packet_traits<int> : default_packet_traits {
   typedef Packet4i type;
   typedef Packet4i half;
   enum {
@@ -162,10 +163,10 @@
     AlignedOnScalar = 1,
     size = 4,
 
-    HasAdd  = 1,
-    HasSub  = 1,
-    HasMul  = 1,
-    HasDiv  = 1,
+    HasAdd = 1,
+    HasSub = 1,
+    HasMul = 1,
+    HasDiv = 1,
     HasBlend = 1
   };
 };
@@ -202,26 +203,26 @@
   };
 };
 
-template<> struct packet_traits<double> : default_packet_traits
-{
+template <>
+struct packet_traits<double> : default_packet_traits {
   typedef Packet2d type;
   typedef Packet2d half;
   enum {
     Vectorizable = 1,
     AlignedOnScalar = 1,
-    size=2,
+    size = 2,
 
-    HasAdd  = 1,
-    HasSub  = 1,
-    HasMul  = 1,
-    HasDiv  = 1,
-    HasMin  = 1,
-    HasMax  = 1,
-    HasAbs  = 1,
-    HasSin  = 0,
-    HasCos  = 0,
-    HasLog  = 0,
-    HasExp  = 1,
+    HasAdd = 1,
+    HasSub = 1,
+    HasMul = 1,
+    HasDiv = 1,
+    HasMin = 1,
+    HasMax = 1,
+    HasAbs = 1,
+    HasSin = 0,
+    HasCos = 0,
+    HasLog = 0,
+    HasExp = 1,
     HasSqrt = 1,
     HasRsqrt = 1,
     HasRound = 1,
@@ -232,47 +233,75 @@
   };
 };
 
-template<> struct unpacket_traits<Packet4i> { typedef int    type; enum {size=4, alignment=Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false}; typedef Packet4i half; };
-template<> struct unpacket_traits<Packet4f> { typedef float  type; enum {size=4, alignment=Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false}; typedef Packet4f half; };
-template<> struct unpacket_traits<Packet2d> { typedef double type; enum {size=2, alignment=Aligned16, vectorizable=true, masked_load_available=false, masked_store_available=false}; typedef Packet2d half; };
+template <>
+struct unpacket_traits<Packet4i> {
+  typedef int type;
+  enum {
+    size = 4,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
+  typedef Packet4i half;
+};
+template <>
+struct unpacket_traits<Packet4f> {
+  typedef float type;
+  enum {
+    size = 4,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
+  typedef Packet4f half;
+};
+template <>
+struct unpacket_traits<Packet2d> {
+  typedef double type;
+  enum {
+    size = 2,
+    alignment = Aligned16,
+    vectorizable = true,
+    masked_load_available = false,
+    masked_store_available = false
+  };
+  typedef Packet2d half;
+};
 
 /* Forward declaration */
-EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet4f,4>& kernel);
- 
-inline std::ostream & operator <<(std::ostream & s, const Packet4i & v)
-{
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet4f, 4>& kernel);
+
+inline std::ostream& operator<<(std::ostream& s, const Packet4i& v) {
   Packet vt;
   vt.v4i = v;
   s << vt.i[0] << ", " << vt.i[1] << ", " << vt.i[2] << ", " << vt.i[3];
   return s;
 }
 
-inline std::ostream & operator <<(std::ostream & s, const Packet4ui & v)
-{
+inline std::ostream& operator<<(std::ostream& s, const Packet4ui& v) {
   Packet vt;
   vt.v4ui = v;
   s << vt.ui[0] << ", " << vt.ui[1] << ", " << vt.ui[2] << ", " << vt.ui[3];
   return s;
 }
 
-inline std::ostream & operator <<(std::ostream & s, const Packet2l & v)
-{
+inline std::ostream& operator<<(std::ostream& s, const Packet2l& v) {
   Packet vt;
   vt.v2l = v;
   s << vt.l[0] << ", " << vt.l[1];
   return s;
 }
 
-inline std::ostream & operator <<(std::ostream & s, const Packet2ul & v)
-{
+inline std::ostream& operator<<(std::ostream& s, const Packet2ul& v) {
   Packet vt;
   vt.v2ul = v;
-  s << vt.ul[0] << ", " << vt.ul[1] ;
+  s << vt.ul[0] << ", " << vt.ul[1];
   return s;
 }
 
-inline std::ostream & operator <<(std::ostream & s, const Packet2d & v)
-{
+inline std::ostream& operator<<(std::ostream& s, const Packet2d& v) {
   Packet vt;
   vt.v2d = v;
   s << vt.d[0] << ", " << vt.d[1];
@@ -280,8 +309,7 @@
 }
 
 #if !defined(__ARCH__) || (defined(__ARCH__) && __ARCH__ >= 12)
-inline std::ostream & operator <<(std::ostream & s, const Packet4f & v)
-{
+inline std::ostream& operator<<(std::ostream& s, const Packet4f& v) {
   Packet vt;
   vt.v4f = v;
   s << vt.f[0] << ", " << vt.f[1] << ", " << vt.f[2] << ", " << vt.f[3];
@@ -289,54 +317,53 @@
 }
 #endif
 
-template<> EIGEN_STRONG_INLINE Packet4i pload<Packet4i>(const int*     from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4i pload<Packet4i>(const int* from) {
   // FIXME: No intrinsic yet
   EIGEN_DEBUG_ALIGNED_LOAD
-  Packet *vfrom;
-  vfrom = (Packet *) from;
+  Packet* vfrom;
+  vfrom = (Packet*)from;
   return vfrom->v4i;
 }
 
-template<> EIGEN_STRONG_INLINE Packet2d pload<Packet2d>(const double* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2d pload<Packet2d>(const double* from) {
   // FIXME: No intrinsic yet
   EIGEN_DEBUG_ALIGNED_LOAD
-  Packet *vfrom;
-  vfrom = (Packet *) from;
+  Packet* vfrom;
+  vfrom = (Packet*)from;
   return vfrom->v2d;
 }
 
-template<> EIGEN_STRONG_INLINE void pstore<int>(int*       to, const Packet4i& from)
-{
+template <>
+EIGEN_STRONG_INLINE void pstore<int>(int* to, const Packet4i& from) {
   // FIXME: No intrinsic yet
   EIGEN_DEBUG_ALIGNED_STORE
-  Packet *vto;
-  vto = (Packet *) to;
+  Packet* vto;
+  vto = (Packet*)to;
   vto->v4i = from;
 }
 
-template<> EIGEN_STRONG_INLINE void pstore<double>(double*   to, const Packet2d& from)
-{
+template <>
+EIGEN_STRONG_INLINE void pstore<double>(double* to, const Packet2d& from) {
   // FIXME: No intrinsic yet
   EIGEN_DEBUG_ALIGNED_STORE
-  Packet *vto;
-  vto = (Packet *) to;
+  Packet* vto;
+  vto = (Packet*)to;
   vto->v2d = from;
 }
 
-template<> EIGEN_STRONG_INLINE Packet4i pset1<Packet4i>(const int&    from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4i pset1<Packet4i>(const int& from) {
   return vec_splats(from);
 }
-template<> EIGEN_STRONG_INLINE Packet2d pset1<Packet2d>(const double& from) {
+template <>
+EIGEN_STRONG_INLINE Packet2d pset1<Packet2d>(const double& from) {
   return vec_splats(from);
 }
 
-template<> EIGEN_STRONG_INLINE void
-pbroadcast4<Packet4i>(const int *a,
-                      Packet4i& a0, Packet4i& a1, Packet4i& a2, Packet4i& a3)
-{
+template <>
+EIGEN_STRONG_INLINE void pbroadcast4<Packet4i>(const int* a, Packet4i& a0, Packet4i& a1, Packet4i& a2, Packet4i& a3) {
   a3 = pload<Packet4i>(a);
   a0 = vec_splat(a3, 0);
   a1 = vec_splat(a3, 1);
@@ -344,187 +371,316 @@
   a3 = vec_splat(a3, 3);
 }
 
-template<> EIGEN_STRONG_INLINE void
-pbroadcast4<Packet2d>(const double *a,
-                      Packet2d& a0, Packet2d& a1, Packet2d& a2, Packet2d& a3)
-{
+template <>
+EIGEN_STRONG_INLINE void pbroadcast4<Packet2d>(const double* a, Packet2d& a0, Packet2d& a1, Packet2d& a2,
+                                               Packet2d& a3) {
   a1 = pload<Packet2d>(a);
   a0 = vec_splat(a1, 0);
   a1 = vec_splat(a1, 1);
-  a3 = pload<Packet2d>(a+2);
+  a3 = pload<Packet2d>(a + 2);
   a2 = vec_splat(a3, 0);
   a3 = vec_splat(a3, 1);
 }
 
-template<> EIGEN_DEVICE_FUNC inline Packet4i pgather<int, Packet4i>(const int* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC inline Packet4i pgather<int, Packet4i>(const int* from, Index stride) {
   EIGEN_ALIGN16 int ai[4];
-  ai[0] = from[0*stride];
-  ai[1] = from[1*stride];
-  ai[2] = from[2*stride];
-  ai[3] = from[3*stride];
- return pload<Packet4i>(ai);
+  ai[0] = from[0 * stride];
+  ai[1] = from[1 * stride];
+  ai[2] = from[2 * stride];
+  ai[3] = from[3 * stride];
+  return pload<Packet4i>(ai);
 }
 
-template<> EIGEN_DEVICE_FUNC inline Packet2d pgather<double, Packet2d>(const double* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC inline Packet2d pgather<double, Packet2d>(const double* from, Index stride) {
   EIGEN_ALIGN16 double af[2];
-  af[0] = from[0*stride];
-  af[1] = from[1*stride];
- return pload<Packet2d>(af);
+  af[0] = from[0 * stride];
+  af[1] = from[1 * stride];
+  return pload<Packet2d>(af);
 }
 
-template<> EIGEN_DEVICE_FUNC inline void pscatter<int, Packet4i>(int* to, const Packet4i& from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC inline void pscatter<int, Packet4i>(int* to, const Packet4i& from, Index stride) {
   EIGEN_ALIGN16 int ai[4];
-  pstore<int>((int *)ai, from);
-  to[0*stride] = ai[0];
-  to[1*stride] = ai[1];
-  to[2*stride] = ai[2];
-  to[3*stride] = ai[3];
+  pstore<int>((int*)ai, from);
+  to[0 * stride] = ai[0];
+  to[1 * stride] = ai[1];
+  to[2 * stride] = ai[2];
+  to[3 * stride] = ai[3];
 }
 
-template<> EIGEN_DEVICE_FUNC inline void pscatter<double, Packet2d>(double* to, const Packet2d& from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC inline void pscatter<double, Packet2d>(double* to, const Packet2d& from, Index stride) {
   EIGEN_ALIGN16 double af[2];
   pstore<double>(af, from);
-  to[0*stride] = af[0];
-  to[1*stride] = af[1];
+  to[0 * stride] = af[0];
+  to[1 * stride] = af[1];
 }
 
-template<> EIGEN_STRONG_INLINE Packet4i padd<Packet4i>(const Packet4i& a, const Packet4i& b) { return (a + b); }
-template<> EIGEN_STRONG_INLINE Packet2d padd<Packet2d>(const Packet2d& a, const Packet2d& b) { return (a + b); }
+template <>
+EIGEN_STRONG_INLINE Packet4i padd<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return (a + b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d padd<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return (a + b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4i psub<Packet4i>(const Packet4i& a, const Packet4i& b) { return (a - b); }
-template<> EIGEN_STRONG_INLINE Packet2d psub<Packet2d>(const Packet2d& a, const Packet2d& b) { return (a - b); }
+template <>
+EIGEN_STRONG_INLINE Packet4i psub<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return (a - b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d psub<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return (a - b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4i pmul<Packet4i>(const Packet4i& a, const Packet4i& b) { return (a * b); }
-template<> EIGEN_STRONG_INLINE Packet2d pmul<Packet2d>(const Packet2d& a, const Packet2d& b) { return (a * b); }
+template <>
+EIGEN_STRONG_INLINE Packet4i pmul<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return (a * b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pmul<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return (a * b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4i pdiv<Packet4i>(const Packet4i& a, const Packet4i& b) { return (a / b); }
-template<> EIGEN_STRONG_INLINE Packet2d pdiv<Packet2d>(const Packet2d& a, const Packet2d& b) { return (a / b); }
+template <>
+EIGEN_STRONG_INLINE Packet4i pdiv<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return (a / b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pdiv<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return (a / b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4i pnegate(const Packet4i& a) { return (-a); }
-template<> EIGEN_STRONG_INLINE Packet2d pnegate(const Packet2d& a) { return (-a); }
+template <>
+EIGEN_STRONG_INLINE Packet4i pnegate(const Packet4i& a) {
+  return (-a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pnegate(const Packet2d& a) {
+  return (-a);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4i pconj(const Packet4i& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet2d pconj(const Packet2d& a) { return a; }
+template <>
+EIGEN_STRONG_INLINE Packet4i pconj(const Packet4i& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pconj(const Packet2d& a) {
+  return a;
+}
 
-template<> EIGEN_STRONG_INLINE Packet4i pmadd(const Packet4i& a, const Packet4i& b, const Packet4i& c) { return padd<Packet4i>(pmul<Packet4i>(a, b), c); }
-template<> EIGEN_STRONG_INLINE Packet2d pmadd(const Packet2d& a, const Packet2d& b, const Packet2d& c) { return vec_madd(a, b, c); }
+template <>
+EIGEN_STRONG_INLINE Packet4i pmadd(const Packet4i& a, const Packet4i& b, const Packet4i& c) {
+  return padd<Packet4i>(pmul<Packet4i>(a, b), c);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pmadd(const Packet2d& a, const Packet2d& b, const Packet2d& c) {
+  return vec_madd(a, b, c);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4i plset<Packet4i>(const int& a)    { return padd<Packet4i>(pset1<Packet4i>(a), p4i_COUNTDOWN); }
-template<> EIGEN_STRONG_INLINE Packet2d plset<Packet2d>(const double& a) { return padd<Packet2d>(pset1<Packet2d>(a), p2d_COUNTDOWN); }
+template <>
+EIGEN_STRONG_INLINE Packet4i plset<Packet4i>(const int& a) {
+  return padd<Packet4i>(pset1<Packet4i>(a), p4i_COUNTDOWN);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d plset<Packet2d>(const double& a) {
+  return padd<Packet2d>(pset1<Packet2d>(a), p2d_COUNTDOWN);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4i pmin<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_min(a, b); }
-template<> EIGEN_STRONG_INLINE Packet2d pmin<Packet2d>(const Packet2d& a, const Packet2d& b) { return vec_min(a, b); }
+template <>
+EIGEN_STRONG_INLINE Packet4i pmin<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return vec_min(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pmin<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return vec_min(a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4i pmax<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_max(a, b); }
-template<> EIGEN_STRONG_INLINE Packet2d pmax<Packet2d>(const Packet2d& a, const Packet2d& b) { return vec_max(a, b); }
+template <>
+EIGEN_STRONG_INLINE Packet4i pmax<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return vec_max(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pmax<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return vec_max(a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4i pand<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_and(a, b); }
-template<> EIGEN_STRONG_INLINE Packet2d pand<Packet2d>(const Packet2d& a, const Packet2d& b) { return vec_and(a, b); }
+template <>
+EIGEN_STRONG_INLINE Packet4i pand<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return vec_and(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pand<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return vec_and(a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4i por<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_or(a, b); }
-template<> EIGEN_STRONG_INLINE Packet2d por<Packet2d>(const Packet2d& a, const Packet2d& b) { return vec_or(a, b); }
+template <>
+EIGEN_STRONG_INLINE Packet4i por<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return vec_or(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d por<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return vec_or(a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4i pxor<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_xor(a, b); }
-template<> EIGEN_STRONG_INLINE Packet2d pxor<Packet2d>(const Packet2d& a, const Packet2d& b) { return vec_xor(a, b); }
+template <>
+EIGEN_STRONG_INLINE Packet4i pxor<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return vec_xor(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pxor<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return vec_xor(a, b);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4i pandnot<Packet4i>(const Packet4i& a, const Packet4i& b) { return pand<Packet4i>(a, vec_nor(b, b)); }
-template<> EIGEN_STRONG_INLINE Packet2d pandnot<Packet2d>(const Packet2d& a, const Packet2d& b) { return vec_and(a, vec_nor(b, b)); }
+template <>
+EIGEN_STRONG_INLINE Packet4i pandnot<Packet4i>(const Packet4i& a, const Packet4i& b) {
+  return pand<Packet4i>(a, vec_nor(b, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pandnot<Packet2d>(const Packet2d& a, const Packet2d& b) {
+  return vec_and(a, vec_nor(b, b));
+}
 
-template<> EIGEN_STRONG_INLINE Packet2d pround<Packet2d>(const Packet2d& a) { return vec_round(a); }
-template<> EIGEN_STRONG_INLINE Packet2d pceil<Packet2d>(const  Packet2d& a) { return vec_ceil(a); }
-template<> EIGEN_STRONG_INLINE Packet2d pfloor<Packet2d>(const Packet2d& a) { return vec_floor(a); }
+template <>
+EIGEN_STRONG_INLINE Packet2d pround<Packet2d>(const Packet2d& a) {
+  return vec_round(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pceil<Packet2d>(const Packet2d& a) {
+  return vec_ceil(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pfloor<Packet2d>(const Packet2d& a) {
+  return vec_floor(a);
+}
 
-template<> EIGEN_STRONG_INLINE Packet4i ploadu<Packet4i>(const int*       from) { return pload<Packet4i>(from); }
-template<> EIGEN_STRONG_INLINE Packet2d ploadu<Packet2d>(const double*    from) { return pload<Packet2d>(from); }
+template <>
+EIGEN_STRONG_INLINE Packet4i ploadu<Packet4i>(const int* from) {
+  return pload<Packet4i>(from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d ploadu<Packet2d>(const double* from) {
+  return pload<Packet2d>(from);
+}
 
-
-template<> EIGEN_STRONG_INLINE Packet4i ploaddup<Packet4i>(const int*     from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4i ploaddup<Packet4i>(const int* from) {
   Packet4i p = pload<Packet4i>(from);
   return vec_perm(p, p, p16uc_DUPLICATE32_HI);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2d ploaddup<Packet2d>(const double*   from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet2d ploaddup<Packet2d>(const double* from) {
   Packet2d p = pload<Packet2d>(from);
   return vec_perm(p, p, p16uc_PSET64_HI);
 }
 
-template<> EIGEN_STRONG_INLINE void pstoreu<int>(int*        to, const Packet4i& from) { pstore<int>(to, from); }
-template<> EIGEN_STRONG_INLINE void pstoreu<double>(double*  to, const Packet2d& from) { pstore<double>(to, from); }
-
-template<> EIGEN_STRONG_INLINE void prefetch<int>(const int*       addr) { EIGEN_ZVECTOR_PREFETCH(addr); }
-template<> EIGEN_STRONG_INLINE void prefetch<double>(const double* addr) { EIGEN_ZVECTOR_PREFETCH(addr); }
-
-template<> EIGEN_STRONG_INLINE int    pfirst<Packet4i>(const Packet4i& a) { EIGEN_ALIGN16 int    x[4]; pstore(x, a); return x[0]; }
-template<> EIGEN_STRONG_INLINE double pfirst<Packet2d>(const Packet2d& a) { EIGEN_ALIGN16 double x[2]; pstore(x, a); return x[0]; }
-
-template<> EIGEN_STRONG_INLINE Packet4i preverse(const Packet4i& a)
-{
-  return reinterpret_cast<Packet4i>(vec_perm(reinterpret_cast<Packet16uc>(a), reinterpret_cast<Packet16uc>(a), p16uc_REVERSE32));
+template <>
+EIGEN_STRONG_INLINE void pstoreu<int>(int* to, const Packet4i& from) {
+  pstore<int>(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<double>(double* to, const Packet2d& from) {
+  pstore<double>(to, from);
 }
 
-template<> EIGEN_STRONG_INLINE Packet2d preverse(const Packet2d& a)
-{
-  return reinterpret_cast<Packet2d>(vec_perm(reinterpret_cast<Packet16uc>(a), reinterpret_cast<Packet16uc>(a), p16uc_REVERSE64));
+template <>
+EIGEN_STRONG_INLINE void prefetch<int>(const int* addr) {
+  EIGEN_ZVECTOR_PREFETCH(addr);
+}
+template <>
+EIGEN_STRONG_INLINE void prefetch<double>(const double* addr) {
+  EIGEN_ZVECTOR_PREFETCH(addr);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4i pabs<Packet4i>(const Packet4i& a) { return vec_abs(a); }
-template<> EIGEN_STRONG_INLINE Packet2d pabs<Packet2d>(const Packet2d& a) { return vec_abs(a); }
+template <>
+EIGEN_STRONG_INLINE int pfirst<Packet4i>(const Packet4i& a) {
+  EIGEN_ALIGN16 int x[4];
+  pstore(x, a);
+  return x[0];
+}
+template <>
+EIGEN_STRONG_INLINE double pfirst<Packet2d>(const Packet2d& a) {
+  EIGEN_ALIGN16 double x[2];
+  pstore(x, a);
+  return x[0];
+}
 
-template<> EIGEN_STRONG_INLINE int predux<Packet4i>(const Packet4i& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4i preverse(const Packet4i& a) {
+  return reinterpret_cast<Packet4i>(
+      vec_perm(reinterpret_cast<Packet16uc>(a), reinterpret_cast<Packet16uc>(a), p16uc_REVERSE32));
+}
+
+template <>
+EIGEN_STRONG_INLINE Packet2d preverse(const Packet2d& a) {
+  return reinterpret_cast<Packet2d>(
+      vec_perm(reinterpret_cast<Packet16uc>(a), reinterpret_cast<Packet16uc>(a), p16uc_REVERSE64));
+}
+
+template <>
+EIGEN_STRONG_INLINE Packet4i pabs<Packet4i>(const Packet4i& a) {
+  return vec_abs(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet2d pabs<Packet2d>(const Packet2d& a) {
+  return vec_abs(a);
+}
+
+template <>
+EIGEN_STRONG_INLINE int predux<Packet4i>(const Packet4i& a) {
   Packet4i b, sum;
-  b   = vec_sld(a, a, 8);
+  b = vec_sld(a, a, 8);
   sum = padd<Packet4i>(a, b);
-  b   = vec_sld(sum, sum, 4);
+  b = vec_sld(sum, sum, 4);
   sum = padd<Packet4i>(sum, b);
   return pfirst(sum);
 }
 
-template<> EIGEN_STRONG_INLINE double predux<Packet2d>(const Packet2d& a)
-{
+template <>
+EIGEN_STRONG_INLINE double predux<Packet2d>(const Packet2d& a) {
   Packet2d b, sum;
-  b   = reinterpret_cast<Packet2d>(vec_sld(reinterpret_cast<Packet4i>(a), reinterpret_cast<Packet4i>(a), 8));
+  b = reinterpret_cast<Packet2d>(vec_sld(reinterpret_cast<Packet4i>(a), reinterpret_cast<Packet4i>(a), 8));
   sum = padd<Packet2d>(a, b);
   return pfirst(sum);
 }
 
 // Other reduction functions:
 // mul
-template<> EIGEN_STRONG_INLINE int predux_mul<Packet4i>(const Packet4i& a)
-{
+template <>
+EIGEN_STRONG_INLINE int predux_mul<Packet4i>(const Packet4i& a) {
   EIGEN_ALIGN16 int aux[4];
   pstore(aux, a);
   return aux[0] * aux[1] * aux[2] * aux[3];
 }
 
-template<> EIGEN_STRONG_INLINE double predux_mul<Packet2d>(const Packet2d& a)
-{
-  return pfirst(pmul(a, reinterpret_cast<Packet2d>(vec_sld(reinterpret_cast<Packet4i>(a), reinterpret_cast<Packet4i>(a), 8))));
+template <>
+EIGEN_STRONG_INLINE double predux_mul<Packet2d>(const Packet2d& a) {
+  return pfirst(
+      pmul(a, reinterpret_cast<Packet2d>(vec_sld(reinterpret_cast<Packet4i>(a), reinterpret_cast<Packet4i>(a), 8))));
 }
 
 // min
-template<> EIGEN_STRONG_INLINE int predux_min<Packet4i>(const Packet4i& a)
-{
+template <>
+EIGEN_STRONG_INLINE int predux_min<Packet4i>(const Packet4i& a) {
   Packet4i b, res;
-  b   = pmin<Packet4i>(a, vec_sld(a, a, 8));
+  b = pmin<Packet4i>(a, vec_sld(a, a, 8));
   res = pmin<Packet4i>(b, vec_sld(b, b, 4));
   return pfirst(res);
 }
 
-template<> EIGEN_STRONG_INLINE double predux_min<Packet2d>(const Packet2d& a)
-{
-  return pfirst(pmin<Packet2d>(a, reinterpret_cast<Packet2d>(vec_sld(reinterpret_cast<Packet4i>(a), reinterpret_cast<Packet4i>(a), 8))));
+template <>
+EIGEN_STRONG_INLINE double predux_min<Packet2d>(const Packet2d& a) {
+  return pfirst(pmin<Packet2d>(
+      a, reinterpret_cast<Packet2d>(vec_sld(reinterpret_cast<Packet4i>(a), reinterpret_cast<Packet4i>(a), 8))));
 }
 
 // max
-template<> EIGEN_STRONG_INLINE int predux_max<Packet4i>(const Packet4i& a)
-{
+template <>
+EIGEN_STRONG_INLINE int predux_max<Packet4i>(const Packet4i& a) {
   Packet4i b, res;
   b = pmax<Packet4i>(a, vec_sld(a, a, 8));
   res = pmax<Packet4i>(b, vec_sld(b, b, 4));
@@ -532,13 +688,13 @@
 }
 
 // max
-template<> EIGEN_STRONG_INLINE double predux_max<Packet2d>(const Packet2d& a)
-{
-  return pfirst(pmax<Packet2d>(a, reinterpret_cast<Packet2d>(vec_sld(reinterpret_cast<Packet4i>(a), reinterpret_cast<Packet4i>(a), 8))));
+template <>
+EIGEN_STRONG_INLINE double predux_max<Packet2d>(const Packet2d& a) {
+  return pfirst(pmax<Packet2d>(
+      a, reinterpret_cast<Packet2d>(vec_sld(reinterpret_cast<Packet4i>(a), reinterpret_cast<Packet4i>(a), 8))));
 }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet4i,4>& kernel) {
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet4i, 4>& kernel) {
   Packet4i t0 = vec_mergeh(kernel.packet[0], kernel.packet[2]);
   Packet4i t1 = vec_mergel(kernel.packet[0], kernel.packet[2]);
   Packet4i t2 = vec_mergeh(kernel.packet[1], kernel.packet[3]);
@@ -549,23 +705,25 @@
   kernel.packet[3] = vec_mergel(t1, t3);
 }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet2d,2>& kernel) {
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet2d, 2>& kernel) {
   Packet2d t0 = vec_perm(kernel.packet[0], kernel.packet[1], p16uc_TRANSPOSE64_HI);
   Packet2d t1 = vec_perm(kernel.packet[0], kernel.packet[1], p16uc_TRANSPOSE64_LO);
   kernel.packet[0] = t0;
   kernel.packet[1] = t1;
 }
 
-template<> EIGEN_STRONG_INLINE Packet4i pblend(const Selector<4>& ifPacket, const Packet4i& thenPacket, const Packet4i& elsePacket) {
-  Packet4ui select = { ifPacket.select[0], ifPacket.select[1], ifPacket.select[2], ifPacket.select[3] };
+template <>
+EIGEN_STRONG_INLINE Packet4i pblend(const Selector<4>& ifPacket, const Packet4i& thenPacket,
+                                    const Packet4i& elsePacket) {
+  Packet4ui select = {ifPacket.select[0], ifPacket.select[1], ifPacket.select[2], ifPacket.select[3]};
   Packet4ui mask = vec_cmpeq(select, reinterpret_cast<Packet4ui>(p4i_ONE));
   return vec_sel(elsePacket, thenPacket, mask);
 }
 
-
-template<> EIGEN_STRONG_INLINE Packet2d pblend(const Selector<2>& ifPacket, const Packet2d& thenPacket, const Packet2d& elsePacket) {
-  Packet2ul select = { ifPacket.select[0], ifPacket.select[1] };
+template <>
+EIGEN_STRONG_INLINE Packet2d pblend(const Selector<2>& ifPacket, const Packet2d& thenPacket,
+                                    const Packet2d& elsePacket) {
+  Packet2ul select = {ifPacket.select[0], ifPacket.select[1]};
   Packet2ul mask = vec_cmpeq(select, reinterpret_cast<Packet2ul>(p2l_ONE));
   return vec_sel(elsePacket, thenPacket, mask);
 }
@@ -576,32 +734,32 @@
 #if !defined(__ARCH__) || (defined(__ARCH__) && __ARCH__ < 12)
 /* Helper function to simulate a vec_splat_packet4f
  */
-template<int element> EIGEN_STRONG_INLINE Packet4f vec_splat_packet4f(const Packet4f&   from)
-{
+template <int element>
+EIGEN_STRONG_INLINE Packet4f vec_splat_packet4f(const Packet4f& from) {
   Packet4f splat;
   switch (element) {
-  case 0:
-    splat.v4f[0] = vec_splat(from.v4f[0], 0);
-    splat.v4f[1] = splat.v4f[0];
-    break;
-  case 1:
-    splat.v4f[0] = vec_splat(from.v4f[0], 1);
-    splat.v4f[1] = splat.v4f[0];
-    break;
-  case 2:
-    splat.v4f[0] = vec_splat(from.v4f[1], 0);
-    splat.v4f[1] = splat.v4f[0];
-    break;
-  case 3:
-    splat.v4f[0] = vec_splat(from.v4f[1], 1);
-    splat.v4f[1] = splat.v4f[0];
-    break;
+    case 0:
+      splat.v4f[0] = vec_splat(from.v4f[0], 0);
+      splat.v4f[1] = splat.v4f[0];
+      break;
+    case 1:
+      splat.v4f[0] = vec_splat(from.v4f[0], 1);
+      splat.v4f[1] = splat.v4f[0];
+      break;
+    case 2:
+      splat.v4f[0] = vec_splat(from.v4f[1], 0);
+      splat.v4f[1] = splat.v4f[0];
+      break;
+    case 3:
+      splat.v4f[0] = vec_splat(from.v4f[1], 1);
+      splat.v4f[1] = splat.v4f[0];
+      break;
   }
   return splat;
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pload<Packet4f>(const float*   from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f pload<Packet4f>(const float* from) {
   // FIXME: No intrinsic yet
   EIGEN_DEBUG_ALIGNED_LOAD
   Packet4f vfrom;
@@ -610,26 +768,24 @@
   return vfrom;
 }
 
-template<> EIGEN_STRONG_INLINE void pstore<float>(float*   to, const Packet4f& from)
-{
+template <>
+EIGEN_STRONG_INLINE void pstore<float>(float* to, const Packet4f& from) {
   // FIXME: No intrinsic yet
   EIGEN_DEBUG_ALIGNED_STORE
   vec_st2f(from.v4f[0], &to[0]);
   vec_st2f(from.v4f[1], &to[2]);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pset1<Packet4f>(const float&    from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f pset1<Packet4f>(const float& from) {
   Packet4f to;
   to.v4f[0] = pset1<Packet2d>(static_cast<const double&>(from));
   to.v4f[1] = to.v4f[0];
   return to;
 }
 
-template<> EIGEN_STRONG_INLINE void
-pbroadcast4<Packet4f>(const float *a,
-                      Packet4f& a0, Packet4f& a1, Packet4f& a2, Packet4f& a3)
-{
+template <>
+EIGEN_STRONG_INLINE void pbroadcast4<Packet4f>(const float* a, Packet4f& a0, Packet4f& a1, Packet4f& a2, Packet4f& a3) {
   a3 = pload<Packet4f>(a);
   a0 = vec_splat_packet4f<0>(a3);
   a1 = vec_splat_packet4f<1>(a3);
@@ -637,207 +793,213 @@
   a3 = vec_splat_packet4f<3>(a3);
 }
 
-template<> EIGEN_DEVICE_FUNC inline Packet4f pgather<float, Packet4f>(const float* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC inline Packet4f pgather<float, Packet4f>(const float* from, Index stride) {
   EIGEN_ALIGN16 float ai[4];
-  ai[0] = from[0*stride];
-  ai[1] = from[1*stride];
-  ai[2] = from[2*stride];
-  ai[3] = from[3*stride];
- return pload<Packet4f>(ai);
+  ai[0] = from[0 * stride];
+  ai[1] = from[1 * stride];
+  ai[2] = from[2 * stride];
+  ai[3] = from[3 * stride];
+  return pload<Packet4f>(ai);
 }
 
-template<> EIGEN_DEVICE_FUNC inline void pscatter<float, Packet4f>(float* to, const Packet4f& from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC inline void pscatter<float, Packet4f>(float* to, const Packet4f& from, Index stride) {
   EIGEN_ALIGN16 float ai[4];
-  pstore<float>((float *)ai, from);
-  to[0*stride] = ai[0];
-  to[1*stride] = ai[1];
-  to[2*stride] = ai[2];
-  to[3*stride] = ai[3];
+  pstore<float>((float*)ai, from);
+  to[0 * stride] = ai[0];
+  to[1 * stride] = ai[1];
+  to[2 * stride] = ai[2];
+  to[3 * stride] = ai[3];
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f padd<Packet4f>(const Packet4f& a, const Packet4f& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f padd<Packet4f>(const Packet4f& a, const Packet4f& b) {
   Packet4f c;
   c.v4f[0] = a.v4f[0] + b.v4f[0];
   c.v4f[1] = a.v4f[1] + b.v4f[1];
   return c;
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f psub<Packet4f>(const Packet4f& a, const Packet4f& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f psub<Packet4f>(const Packet4f& a, const Packet4f& b) {
   Packet4f c;
   c.v4f[0] = a.v4f[0] - b.v4f[0];
   c.v4f[1] = a.v4f[1] - b.v4f[1];
   return c;
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pmul<Packet4f>(const Packet4f& a, const Packet4f& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f pmul<Packet4f>(const Packet4f& a, const Packet4f& b) {
   Packet4f c;
   c.v4f[0] = a.v4f[0] * b.v4f[0];
   c.v4f[1] = a.v4f[1] * b.v4f[1];
   return c;
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pdiv<Packet4f>(const Packet4f& a, const Packet4f& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f pdiv<Packet4f>(const Packet4f& a, const Packet4f& b) {
   Packet4f c;
   c.v4f[0] = a.v4f[0] / b.v4f[0];
   c.v4f[1] = a.v4f[1] / b.v4f[1];
   return c;
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pnegate(const Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f pnegate(const Packet4f& a) {
   Packet4f c;
   c.v4f[0] = -a.v4f[0];
   c.v4f[1] = -a.v4f[1];
   return c;
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pmadd(const Packet4f& a, const Packet4f& b, const Packet4f& c)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f pmadd(const Packet4f& a, const Packet4f& b, const Packet4f& c) {
   Packet4f res;
   res.v4f[0] = vec_madd(a.v4f[0], b.v4f[0], c.v4f[0]);
   res.v4f[1] = vec_madd(a.v4f[1], b.v4f[1], c.v4f[1]);
   return res;
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pmin<Packet4f>(const Packet4f& a, const Packet4f& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f pmin<Packet4f>(const Packet4f& a, const Packet4f& b) {
   Packet4f res;
   res.v4f[0] = pmin(a.v4f[0], b.v4f[0]);
   res.v4f[1] = pmin(a.v4f[1], b.v4f[1]);
   return res;
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pmax<Packet4f>(const Packet4f& a, const Packet4f& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f pmax<Packet4f>(const Packet4f& a, const Packet4f& b) {
   Packet4f res;
   res.v4f[0] = pmax(a.v4f[0], b.v4f[0]);
   res.v4f[1] = pmax(a.v4f[1], b.v4f[1]);
   return res;
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pand<Packet4f>(const Packet4f& a, const Packet4f& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f pand<Packet4f>(const Packet4f& a, const Packet4f& b) {
   Packet4f res;
   res.v4f[0] = pand(a.v4f[0], b.v4f[0]);
   res.v4f[1] = pand(a.v4f[1], b.v4f[1]);
   return res;
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f por<Packet4f>(const Packet4f& a, const Packet4f& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f por<Packet4f>(const Packet4f& a, const Packet4f& b) {
   Packet4f res;
   res.v4f[0] = por(a.v4f[0], b.v4f[0]);
   res.v4f[1] = por(a.v4f[1], b.v4f[1]);
   return res;
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pxor<Packet4f>(const Packet4f& a, const Packet4f& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f pxor<Packet4f>(const Packet4f& a, const Packet4f& b) {
   Packet4f res;
   res.v4f[0] = pxor(a.v4f[0], b.v4f[0]);
   res.v4f[1] = pxor(a.v4f[1], b.v4f[1]);
   return res;
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pandnot<Packet4f>(const Packet4f& a, const Packet4f& b)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f pandnot<Packet4f>(const Packet4f& a, const Packet4f& b) {
   Packet4f res;
   res.v4f[0] = pandnot(a.v4f[0], b.v4f[0]);
   res.v4f[1] = pandnot(a.v4f[1], b.v4f[1]);
   return res;
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pround<Packet4f>(const Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f pround<Packet4f>(const Packet4f& a) {
   Packet4f res;
   res.v4f[0] = vec_round(a.v4f[0]);
   res.v4f[1] = vec_round(a.v4f[1]);
   return res;
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pceil<Packet4f>(const  Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f pceil<Packet4f>(const Packet4f& a) {
   Packet4f res;
   res.v4f[0] = vec_ceil(a.v4f[0]);
   res.v4f[1] = vec_ceil(a.v4f[1]);
   return res;
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pfloor<Packet4f>(const Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f pfloor<Packet4f>(const Packet4f& a) {
   Packet4f res;
   res.v4f[0] = vec_floor(a.v4f[0]);
   res.v4f[1] = vec_floor(a.v4f[1]);
   return res;
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f ploaddup<Packet4f>(const float*    from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f ploaddup<Packet4f>(const float* from) {
   Packet4f p = pload<Packet4f>(from);
   p.v4f[1] = vec_splat(p.v4f[0], 1);
   p.v4f[0] = vec_splat(p.v4f[0], 0);
   return p;
 }
 
-template<> EIGEN_STRONG_INLINE float  pfirst<Packet4f>(const Packet4f& a) { EIGEN_ALIGN16 float x[2]; vec_st2f(a.v4f[0], &x[0]); return x[0]; }
+template <>
+EIGEN_STRONG_INLINE float pfirst<Packet4f>(const Packet4f& a) {
+  EIGEN_ALIGN16 float x[2];
+  vec_st2f(a.v4f[0], &x[0]);
+  return x[0];
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f preverse(const Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f preverse(const Packet4f& a) {
   Packet4f rev;
   rev.v4f[0] = preverse<Packet2d>(a.v4f[1]);
   rev.v4f[1] = preverse<Packet2d>(a.v4f[0]);
   return rev;
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pabs<Packet4f>(const Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f pabs<Packet4f>(const Packet4f& a) {
   Packet4f res;
   res.v4f[0] = pabs(a.v4f[0]);
   res.v4f[1] = pabs(a.v4f[1]);
   return res;
 }
 
-template<> EIGEN_STRONG_INLINE float predux<Packet4f>(const Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE float predux<Packet4f>(const Packet4f& a) {
   Packet2d sum;
   sum = padd<Packet2d>(a.v4f[0], a.v4f[1]);
   double first = predux<Packet2d>(sum);
   return static_cast<float>(first);
 }
 
-template<> EIGEN_STRONG_INLINE float predux_mul<Packet4f>(const Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE float predux_mul<Packet4f>(const Packet4f& a) {
   // Return predux_mul<Packet2d> of the subvectors product
   return static_cast<float>(pfirst(predux_mul(pmul(a.v4f[0], a.v4f[1]))));
 }
 
-template<> EIGEN_STRONG_INLINE float predux_min<Packet4f>(const Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE float predux_min<Packet4f>(const Packet4f& a) {
   Packet2d b, res;
-  b   = pmin<Packet2d>(a.v4f[0], a.v4f[1]);
-  res = pmin<Packet2d>(b, reinterpret_cast<Packet2d>(vec_sld(reinterpret_cast<Packet4i>(b), reinterpret_cast<Packet4i>(b), 8)));
+  b = pmin<Packet2d>(a.v4f[0], a.v4f[1]);
+  res = pmin<Packet2d>(
+      b, reinterpret_cast<Packet2d>(vec_sld(reinterpret_cast<Packet4i>(b), reinterpret_cast<Packet4i>(b), 8)));
   return static_cast<float>(pfirst(res));
 }
 
-template<> EIGEN_STRONG_INLINE float predux_max<Packet4f>(const Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE float predux_max<Packet4f>(const Packet4f& a) {
   Packet2d b, res;
-  b   = pmax<Packet2d>(a.v4f[0], a.v4f[1]);
-  res = pmax<Packet2d>(b, reinterpret_cast<Packet2d>(vec_sld(reinterpret_cast<Packet4i>(b), reinterpret_cast<Packet4i>(b), 8)));
+  b = pmax<Packet2d>(a.v4f[0], a.v4f[1]);
+  res = pmax<Packet2d>(
+      b, reinterpret_cast<Packet2d>(vec_sld(reinterpret_cast<Packet4i>(b), reinterpret_cast<Packet4i>(b), 8)));
   return static_cast<float>(pfirst(res));
 }
 
 /* Split the Packet4f PacketBlock into 4 Packet2d PacketBlocks and transpose each one
  */
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet4f,4>& kernel) {
-  PacketBlock<Packet2d,2> t0,t1,t2,t3;
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet4f, 4>& kernel) {
+  PacketBlock<Packet2d, 2> t0, t1, t2, t3;
   // copy top-left 2x2 Packet2d block
   t0.packet[0] = kernel.packet[0].v4f[0];
   t0.packet[1] = kernel.packet[1].v4f[0];
@@ -871,9 +1033,11 @@
   kernel.packet[3].v4f[1] = t3.packet[1];
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pblend(const Selector<4>& ifPacket, const Packet4f& thenPacket, const Packet4f& elsePacket) {
-  Packet2ul select_hi = { ifPacket.select[0], ifPacket.select[1] };
-  Packet2ul select_lo = { ifPacket.select[2], ifPacket.select[3] };
+template <>
+EIGEN_STRONG_INLINE Packet4f pblend(const Selector<4>& ifPacket, const Packet4f& thenPacket,
+                                    const Packet4f& elsePacket) {
+  Packet2ul select_hi = {ifPacket.select[0], ifPacket.select[1]};
+  Packet2ul select_lo = {ifPacket.select[2], ifPacket.select[3]};
   Packet2ul mask_hi = vec_cmpeq(select_hi, reinterpret_cast<Packet2ul>(p2l_ONE));
   Packet2ul mask_lo = vec_cmpeq(select_lo, reinterpret_cast<Packet2ul>(p2l_ONE));
   Packet4f result;
@@ -882,24 +1046,24 @@
   return result;
 }
 
-template<> Packet4f EIGEN_STRONG_INLINE pcmp_le<Packet4f>(const Packet4f& a, const Packet4f& b)
-{
+template <>
+Packet4f EIGEN_STRONG_INLINE pcmp_le<Packet4f>(const Packet4f& a, const Packet4f& b) {
   Packet4f res;
   res.v4f[0] = pcmp_le(a.v4f[0], b.v4f[0]);
   res.v4f[1] = pcmp_le(a.v4f[1], b.v4f[1]);
   return res;
 }
 
-template<> Packet4f EIGEN_STRONG_INLINE pcmp_lt<Packet4f>(const Packet4f& a, const Packet4f& b)
-{
+template <>
+Packet4f EIGEN_STRONG_INLINE pcmp_lt<Packet4f>(const Packet4f& a, const Packet4f& b) {
   Packet4f res;
   res.v4f[0] = pcmp_lt(a.v4f[0], b.v4f[0]);
   res.v4f[1] = pcmp_lt(a.v4f[1], b.v4f[1]);
   return res;
 }
 
-template<> Packet4f EIGEN_STRONG_INLINE pcmp_eq<Packet4f>(const Packet4f& a, const Packet4f& b)
-{
+template <>
+Packet4f EIGEN_STRONG_INLINE pcmp_eq<Packet4f>(const Packet4f& a, const Packet4f& b) {
   Packet4f res;
   res.v4f[0] = pcmp_eq(a.v4f[0], b.v4f[0]);
   res.v4f[1] = pcmp_eq(a.v4f[1], b.v4f[1]);
@@ -907,33 +1071,31 @@
 }
 
 #else
-template<> EIGEN_STRONG_INLINE Packet4f pload<Packet4f>(const float* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f pload<Packet4f>(const float* from) {
   // FIXME: No intrinsic yet
   EIGEN_DEBUG_ALIGNED_LOAD
-  Packet *vfrom;
-  vfrom = (Packet *) from;
+  Packet* vfrom;
+  vfrom = (Packet*)from;
   return vfrom->v4f;
 }
 
-template<> EIGEN_STRONG_INLINE void pstore<float>(float* to, const Packet4f& from)
-{
+template <>
+EIGEN_STRONG_INLINE void pstore<float>(float* to, const Packet4f& from) {
   // FIXME: No intrinsic yet
   EIGEN_DEBUG_ALIGNED_STORE
-  Packet *vto;
-  vto = (Packet *) to;
+  Packet* vto;
+  vto = (Packet*)to;
   vto->v4f = from;
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pset1<Packet4f>(const float& from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f pset1<Packet4f>(const float& from) {
   return vec_splats(from);
 }
 
-template<> EIGEN_STRONG_INLINE void
-pbroadcast4<Packet4f>(const float *a,
-                      Packet4f& a0, Packet4f& a1, Packet4f& a2, Packet4f& a3)
-{
+template <>
+EIGEN_STRONG_INLINE void pbroadcast4<Packet4f>(const float* a, Packet4f& a0, Packet4f& a1, Packet4f& a2, Packet4f& a3) {
   a3 = pload<Packet4f>(a);
   a0 = vec_splat(a3, 0);
   a1 = vec_splat(a3, 1);
@@ -941,95 +1103,151 @@
   a3 = vec_splat(a3, 3);
 }
 
-template<> EIGEN_DEVICE_FUNC inline Packet4f pgather<float, Packet4f>(const float* from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC inline Packet4f pgather<float, Packet4f>(const float* from, Index stride) {
   EIGEN_ALIGN16 float af[4];
-  af[0] = from[0*stride];
-  af[1] = from[1*stride];
-  af[2] = from[2*stride];
-  af[3] = from[3*stride];
- return pload<Packet4f>(af);
+  af[0] = from[0 * stride];
+  af[1] = from[1 * stride];
+  af[2] = from[2 * stride];
+  af[3] = from[3 * stride];
+  return pload<Packet4f>(af);
 }
 
-template<> EIGEN_DEVICE_FUNC inline void pscatter<float, Packet4f>(float* to, const Packet4f& from, Index stride)
-{
+template <>
+EIGEN_DEVICE_FUNC inline void pscatter<float, Packet4f>(float* to, const Packet4f& from, Index stride) {
   EIGEN_ALIGN16 float af[4];
   pstore<float>((float*)af, from);
-  to[0*stride] = af[0];
-  to[1*stride] = af[1];
-  to[2*stride] = af[2];
-  to[3*stride] = af[3];
+  to[0 * stride] = af[0];
+  to[1 * stride] = af[1];
+  to[2 * stride] = af[2];
+  to[3 * stride] = af[3];
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f padd<Packet4f>(const Packet4f& a, const Packet4f& b) { return (a + b); }
-template<> EIGEN_STRONG_INLINE Packet4f psub<Packet4f>(const Packet4f& a, const Packet4f& b) { return (a - b); }
-template<> EIGEN_STRONG_INLINE Packet4f pmul<Packet4f>(const Packet4f& a, const Packet4f& b) { return (a * b); }
-template<> EIGEN_STRONG_INLINE Packet4f pdiv<Packet4f>(const Packet4f& a, const Packet4f& b) { return (a / b); }
-template<> EIGEN_STRONG_INLINE Packet4f pnegate<Packet4f>(const Packet4f& a) { return (-a); }
-template<> EIGEN_STRONG_INLINE Packet4f pconj<Packet4f>  (const Packet4f& a) { return a; }
-template<> EIGEN_STRONG_INLINE Packet4f pmadd<Packet4f>  (const Packet4f& a, const Packet4f& b, const Packet4f& c) { return vec_madd(a, b, c); }
-template<> EIGEN_STRONG_INLINE Packet4f pmin<Packet4f>   (const Packet4f& a, const Packet4f& b) { return vec_min(a, b); }
-template<> EIGEN_STRONG_INLINE Packet4f pmax<Packet4f>   (const Packet4f& a, const Packet4f& b) { return vec_max(a, b); }
-template<> EIGEN_STRONG_INLINE Packet4f pand<Packet4f>   (const Packet4f& a, const Packet4f& b) { return vec_and(a, b); }
-template<> EIGEN_STRONG_INLINE Packet4f por<Packet4f>    (const Packet4f& a, const Packet4f& b) { return vec_or(a, b); }
-template<> EIGEN_STRONG_INLINE Packet4f pxor<Packet4f>   (const Packet4f& a, const Packet4f& b) { return vec_xor(a, b); }
-template<> EIGEN_STRONG_INLINE Packet4f pandnot<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_and(a, vec_nor(b, b)); }
-template<> EIGEN_STRONG_INLINE Packet4f pround<Packet4f> (const Packet4f& a) { return vec_round(a); }
-template<> EIGEN_STRONG_INLINE Packet4f pceil<Packet4f>  (const Packet4f& a) { return vec_ceil(a); }
-template<> EIGEN_STRONG_INLINE Packet4f pfloor<Packet4f> (const Packet4f& a) { return vec_floor(a); }
-template<> EIGEN_STRONG_INLINE Packet4f pabs<Packet4f>   (const Packet4f& a) { return vec_abs(a); }
-template<> EIGEN_STRONG_INLINE float pfirst<Packet4f>(const Packet4f& a) { EIGEN_ALIGN16 float x[4]; pstore(x, a); return x[0]; }
+template <>
+EIGEN_STRONG_INLINE Packet4f padd<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return (a + b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f psub<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return (a - b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pmul<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return (a * b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pdiv<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return (a / b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pnegate<Packet4f>(const Packet4f& a) {
+  return (-a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pconj<Packet4f>(const Packet4f& a) {
+  return a;
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pmadd<Packet4f>(const Packet4f& a, const Packet4f& b, const Packet4f& c) {
+  return vec_madd(a, b, c);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pmin<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return vec_min(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pmax<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return vec_max(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pand<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return vec_and(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f por<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return vec_or(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pxor<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return vec_xor(a, b);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pandnot<Packet4f>(const Packet4f& a, const Packet4f& b) {
+  return vec_and(a, vec_nor(b, b));
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pround<Packet4f>(const Packet4f& a) {
+  return vec_round(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pceil<Packet4f>(const Packet4f& a) {
+  return vec_ceil(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pfloor<Packet4f>(const Packet4f& a) {
+  return vec_floor(a);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f pabs<Packet4f>(const Packet4f& a) {
+  return vec_abs(a);
+}
+template <>
+EIGEN_STRONG_INLINE float pfirst<Packet4f>(const Packet4f& a) {
+  EIGEN_ALIGN16 float x[4];
+  pstore(x, a);
+  return x[0];
+}
 
-template<> EIGEN_STRONG_INLINE Packet4f ploaddup<Packet4f>(const float* from)
-{
+template <>
+EIGEN_STRONG_INLINE Packet4f ploaddup<Packet4f>(const float* from) {
   Packet4f p = pload<Packet4f>(from);
   return vec_perm(p, p, p16uc_DUPLICATE32_HI);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f preverse(const Packet4f& a)
-{
-  return reinterpret_cast<Packet4f>(vec_perm(reinterpret_cast<Packet16uc>(a), reinterpret_cast<Packet16uc>(a), p16uc_REVERSE32));
+template <>
+EIGEN_STRONG_INLINE Packet4f preverse(const Packet4f& a) {
+  return reinterpret_cast<Packet4f>(
+      vec_perm(reinterpret_cast<Packet16uc>(a), reinterpret_cast<Packet16uc>(a), p16uc_REVERSE32));
 }
 
-template<> EIGEN_STRONG_INLINE float predux<Packet4f>(const Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE float predux<Packet4f>(const Packet4f& a) {
   Packet4f b, sum;
-  b   = vec_sld(a, a, 8);
+  b = vec_sld(a, a, 8);
   sum = padd<Packet4f>(a, b);
-  b   = vec_sld(sum, sum, 4);
+  b = vec_sld(sum, sum, 4);
   sum = padd<Packet4f>(sum, b);
   return pfirst(sum);
 }
 
 // Other reduction functions:
 // mul
-template<> EIGEN_STRONG_INLINE float predux_mul<Packet4f>(const Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE float predux_mul<Packet4f>(const Packet4f& a) {
   Packet4f prod;
   prod = pmul(a, vec_sld(a, a, 8));
   return pfirst(pmul(prod, vec_sld(prod, prod, 4)));
 }
 
 // min
-template<> EIGEN_STRONG_INLINE float predux_min<Packet4f>(const Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE float predux_min<Packet4f>(const Packet4f& a) {
   Packet4f b, res;
-  b   = pmin<Packet4f>(a, vec_sld(a, a, 8));
+  b = pmin<Packet4f>(a, vec_sld(a, a, 8));
   res = pmin<Packet4f>(b, vec_sld(b, b, 4));
   return pfirst(res);
 }
 
 // max
-template<> EIGEN_STRONG_INLINE float predux_max<Packet4f>(const Packet4f& a)
-{
+template <>
+EIGEN_STRONG_INLINE float predux_max<Packet4f>(const Packet4f& a) {
   Packet4f b, res;
   b = pmax<Packet4f>(a, vec_sld(a, a, 8));
   res = pmax<Packet4f>(b, vec_sld(b, b, 4));
   return pfirst(res);
 }
 
-EIGEN_DEVICE_FUNC inline void
-ptranspose(PacketBlock<Packet4f,4>& kernel) {
+EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<Packet4f, 4>& kernel) {
   Packet4f t0 = vec_mergeh(kernel.packet[0], kernel.packet[2]);
   Packet4f t1 = vec_mergel(kernel.packet[0], kernel.packet[2]);
   Packet4f t2 = vec_mergeh(kernel.packet[1], kernel.packet[3]);
@@ -1040,21 +1258,35 @@
   kernel.packet[3] = vec_mergel(t1, t3);
 }
 
-template<> EIGEN_STRONG_INLINE Packet4f pblend(const Selector<4>& ifPacket, const Packet4f& thenPacket, const Packet4f& elsePacket) {
-  Packet4ui select = { ifPacket.select[0], ifPacket.select[1], ifPacket.select[2], ifPacket.select[3] };
+template <>
+EIGEN_STRONG_INLINE Packet4f pblend(const Selector<4>& ifPacket, const Packet4f& thenPacket,
+                                    const Packet4f& elsePacket) {
+  Packet4ui select = {ifPacket.select[0], ifPacket.select[1], ifPacket.select[2], ifPacket.select[3]};
   Packet4ui mask = vec_cmpeq(select, reinterpret_cast<Packet4ui>(p4i_ONE));
   return vec_sel(elsePacket, thenPacket, mask);
 }
 
 #endif
 
-template<> EIGEN_STRONG_INLINE void prefetch<float>(const float*   addr) { EIGEN_ZVECTOR_PREFETCH(addr); }
-template<> EIGEN_STRONG_INLINE Packet4f ploadu<Packet4f> (const float* from) { return pload<Packet4f>(from); }
-template<> EIGEN_STRONG_INLINE void pstoreu<float>(float* to, const Packet4f& from) { pstore<float>(to, from); }
-template<> EIGEN_STRONG_INLINE Packet4f plset<Packet4f>  (const float& a)  { return padd<Packet4f>(pset1<Packet4f>(a), p4f_COUNTDOWN); }
+template <>
+EIGEN_STRONG_INLINE void prefetch<float>(const float* addr) {
+  EIGEN_ZVECTOR_PREFETCH(addr);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f ploadu<Packet4f>(const float* from) {
+  return pload<Packet4f>(from);
+}
+template <>
+EIGEN_STRONG_INLINE void pstoreu<float>(float* to, const Packet4f& from) {
+  pstore<float>(to, from);
+}
+template <>
+EIGEN_STRONG_INLINE Packet4f plset<Packet4f>(const float& a) {
+  return padd<Packet4f>(pset1<Packet4f>(a), p4f_COUNTDOWN);
+}
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_PACKET_MATH_ZVECTOR_H
+#endif  // EIGEN_PACKET_MATH_ZVECTOR_H
diff --git a/Eigen/src/Core/functors/AssignmentFunctors.h b/Eigen/src/Core/functors/AssignmentFunctors.h
index 8688fbd..09d1da8 100644
--- a/Eigen/src/Core/functors/AssignmentFunctors.h
+++ b/Eigen/src/Core/functors/AssignmentFunctors.h
@@ -16,159 +16,166 @@
 namespace Eigen {
 
 namespace internal {
-  
-/** \internal
-  * \brief Template functor for scalar/packet assignment
-  *
-  */
-template<typename DstScalar,typename SrcScalar> struct assign_op {
 
+/** \internal
+ * \brief Template functor for scalar/packet assignment
+ *
+ */
+template <typename DstScalar, typename SrcScalar>
+struct assign_op {
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a = b; }
 
-  template<int Alignment, typename Packet>
-  EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const
-  { internal::pstoret<DstScalar,Packet,Alignment>(a,b); }
+  template <int Alignment, typename Packet>
+  EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const {
+    internal::pstoret<DstScalar, Packet, Alignment>(a, b);
+  }
 };
 
 // Empty overload for void type (used by PermutationMatrix)
-template<typename DstScalar> struct assign_op<DstScalar,void> {};
+template <typename DstScalar>
+struct assign_op<DstScalar, void> {};
 
-template<typename DstScalar,typename SrcScalar>
-struct functor_traits<assign_op<DstScalar,SrcScalar> > {
+template <typename DstScalar, typename SrcScalar>
+struct functor_traits<assign_op<DstScalar, SrcScalar> > {
   enum {
     Cost = NumTraits<DstScalar>::ReadCost,
-    PacketAccess = is_same<DstScalar,SrcScalar>::value && packet_traits<DstScalar>::Vectorizable && packet_traits<SrcScalar>::Vectorizable
+    PacketAccess = is_same<DstScalar, SrcScalar>::value && packet_traits<DstScalar>::Vectorizable &&
+                   packet_traits<SrcScalar>::Vectorizable
   };
 };
 
 /** \internal
-  * \brief Template functor for scalar/packet assignment with addition
-  *
-  */
-template<typename DstScalar,typename SrcScalar> struct add_assign_op {
-
+ * \brief Template functor for scalar/packet assignment with addition
+ *
+ */
+template <typename DstScalar, typename SrcScalar>
+struct add_assign_op {
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a += b; }
 
-  template<int Alignment, typename Packet>
-  EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const
-  { internal::pstoret<DstScalar,Packet,Alignment>(a,internal::padd(internal::ploadt<Packet,Alignment>(a),b)); }
+  template <int Alignment, typename Packet>
+  EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const {
+    internal::pstoret<DstScalar, Packet, Alignment>(a, internal::padd(internal::ploadt<Packet, Alignment>(a), b));
+  }
 };
-template<typename DstScalar,typename SrcScalar>
-struct functor_traits<add_assign_op<DstScalar,SrcScalar> > {
+template <typename DstScalar, typename SrcScalar>
+struct functor_traits<add_assign_op<DstScalar, SrcScalar> > {
   enum {
     Cost = NumTraits<DstScalar>::ReadCost + NumTraits<DstScalar>::AddCost,
-    PacketAccess = is_same<DstScalar,SrcScalar>::value && packet_traits<DstScalar>::HasAdd
+    PacketAccess = is_same<DstScalar, SrcScalar>::value && packet_traits<DstScalar>::HasAdd
   };
 };
 
 /** \internal
-  * \brief Template functor for scalar/packet assignment with subtraction
-  *
-  */
-template<typename DstScalar,typename SrcScalar> struct sub_assign_op {
-
+ * \brief Template functor for scalar/packet assignment with subtraction
+ *
+ */
+template <typename DstScalar, typename SrcScalar>
+struct sub_assign_op {
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a -= b; }
 
-  template<int Alignment, typename Packet>
-  EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const
-  { internal::pstoret<DstScalar,Packet,Alignment>(a,internal::psub(internal::ploadt<Packet,Alignment>(a),b)); }
+  template <int Alignment, typename Packet>
+  EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const {
+    internal::pstoret<DstScalar, Packet, Alignment>(a, internal::psub(internal::ploadt<Packet, Alignment>(a), b));
+  }
 };
-template<typename DstScalar,typename SrcScalar>
-struct functor_traits<sub_assign_op<DstScalar,SrcScalar> > {
+template <typename DstScalar, typename SrcScalar>
+struct functor_traits<sub_assign_op<DstScalar, SrcScalar> > {
   enum {
     Cost = NumTraits<DstScalar>::ReadCost + NumTraits<DstScalar>::AddCost,
-    PacketAccess = is_same<DstScalar,SrcScalar>::value && packet_traits<DstScalar>::HasSub
+    PacketAccess = is_same<DstScalar, SrcScalar>::value && packet_traits<DstScalar>::HasSub
   };
 };
 
 /** \internal
-  * \brief Template functor for scalar/packet assignment with multiplication
-  *
-  */
-template<typename DstScalar, typename SrcScalar=DstScalar>
+ * \brief Template functor for scalar/packet assignment with multiplication
+ *
+ */
+template <typename DstScalar, typename SrcScalar = DstScalar>
 struct mul_assign_op {
-
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a *= b; }
 
-  template<int Alignment, typename Packet>
-  EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const
-  { internal::pstoret<DstScalar,Packet,Alignment>(a,internal::pmul(internal::ploadt<Packet,Alignment>(a),b)); }
+  template <int Alignment, typename Packet>
+  EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const {
+    internal::pstoret<DstScalar, Packet, Alignment>(a, internal::pmul(internal::ploadt<Packet, Alignment>(a), b));
+  }
 };
-template<typename DstScalar, typename SrcScalar>
-struct functor_traits<mul_assign_op<DstScalar,SrcScalar> > {
+template <typename DstScalar, typename SrcScalar>
+struct functor_traits<mul_assign_op<DstScalar, SrcScalar> > {
   enum {
     Cost = NumTraits<DstScalar>::ReadCost + NumTraits<DstScalar>::MulCost,
-    PacketAccess = is_same<DstScalar,SrcScalar>::value && packet_traits<DstScalar>::HasMul
+    PacketAccess = is_same<DstScalar, SrcScalar>::value && packet_traits<DstScalar>::HasMul
   };
 };
 
 /** \internal
-  * \brief Template functor for scalar/packet assignment with diviving
-  *
-  */
-template<typename DstScalar, typename SrcScalar=DstScalar> struct div_assign_op {
-
+ * \brief Template functor for scalar/packet assignment with diviving
+ *
+ */
+template <typename DstScalar, typename SrcScalar = DstScalar>
+struct div_assign_op {
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a /= b; }
 
-  template<int Alignment, typename Packet>
-  EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const
-  { internal::pstoret<DstScalar,Packet,Alignment>(a,internal::pdiv(internal::ploadt<Packet,Alignment>(a),b)); }
+  template <int Alignment, typename Packet>
+  EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const {
+    internal::pstoret<DstScalar, Packet, Alignment>(a, internal::pdiv(internal::ploadt<Packet, Alignment>(a), b));
+  }
 };
-template<typename DstScalar, typename SrcScalar>
-struct functor_traits<div_assign_op<DstScalar,SrcScalar> > {
+template <typename DstScalar, typename SrcScalar>
+struct functor_traits<div_assign_op<DstScalar, SrcScalar> > {
   enum {
     Cost = NumTraits<DstScalar>::ReadCost + NumTraits<DstScalar>::MulCost,
-    PacketAccess = is_same<DstScalar,SrcScalar>::value && packet_traits<DstScalar>::HasDiv
+    PacketAccess = is_same<DstScalar, SrcScalar>::value && packet_traits<DstScalar>::HasDiv
   };
 };
 
 /** \internal
-  * \brief Template functor for scalar/packet assignment with swapping
-  *
-  * It works as follow. For a non-vectorized evaluation loop, we have:
-  *   for(i) func(A.coeffRef(i), B.coeff(i));
-  * where B is a SwapWrapper expression. The trick is to make SwapWrapper::coeff behaves like a non-const coeffRef.
-  * Actually, SwapWrapper might not even be needed since even if B is a plain expression, since it has to be writable
-  * B.coeff already returns a const reference to the underlying scalar value.
-  * 
-  * The case of a vectorized loop is more tricky:
-  *   for(i,j) func.assignPacket<A_Align>(&A.coeffRef(i,j), B.packet<B_Align>(i,j));
-  * Here, B must be a SwapWrapper whose packet function actually returns a proxy object holding a Scalar*,
-  * the actual alignment and Packet type.
-  *
-  */
-template<typename Scalar> struct swap_assign_op {
-
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(Scalar& a, const Scalar& b) const
-  {
+ * \brief Template functor for scalar/packet assignment with swapping
+ *
+ * It works as follow. For a non-vectorized evaluation loop, we have:
+ *   for(i) func(A.coeffRef(i), B.coeff(i));
+ * where B is a SwapWrapper expression. The trick is to make SwapWrapper::coeff behaves like a non-const coeffRef.
+ * Actually, SwapWrapper might not even be needed since even if B is a plain expression, since it has to be writable
+ * B.coeff already returns a const reference to the underlying scalar value.
+ *
+ * The case of a vectorized loop is more tricky:
+ *   for(i,j) func.assignPacket<A_Align>(&A.coeffRef(i,j), B.packet<B_Align>(i,j));
+ * Here, B must be a SwapWrapper whose packet function actually returns a proxy object holding a Scalar*,
+ * the actual alignment and Packet type.
+ *
+ */
+template <typename Scalar>
+struct swap_assign_op {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(Scalar& a, const Scalar& b) const {
 #ifdef EIGEN_GPUCC
     // FIXME is there some kind of cuda::swap?
-    Scalar t=b; const_cast<Scalar&>(b)=a; a=t;
+    Scalar t = b;
+    const_cast<Scalar&>(b) = a;
+    a = t;
 #else
     using std::swap;
-    swap(a,const_cast<Scalar&>(b));
+    swap(a, const_cast<Scalar&>(b));
 #endif
   }
 };
-template<typename Scalar>
+template <typename Scalar>
 struct functor_traits<swap_assign_op<Scalar> > {
   enum {
     Cost = 3 * NumTraits<Scalar>::ReadCost,
-    PacketAccess = 
-    #if defined(EIGEN_VECTORIZE_AVX) && (EIGEN_CLANG_STRICT_LESS_THAN(8,0,0) || EIGEN_COMP_CLANGAPPLE)
-    // This is a partial workaround for a bug in clang generating bad code
-    // when mixing 256/512 bits loads and 128 bits moves.
-    // See http://eigen.tuxfamily.org/bz/show_bug.cgi?id=1684
-    //     https://bugs.llvm.org/show_bug.cgi?id=40815
+    PacketAccess =
+#if defined(EIGEN_VECTORIZE_AVX) && (EIGEN_CLANG_STRICT_LESS_THAN(8, 0, 0) || EIGEN_COMP_CLANGAPPLE)
+        // This is a partial workaround for a bug in clang generating bad code
+        // when mixing 256/512 bits loads and 128 bits moves.
+        // See http://eigen.tuxfamily.org/bz/show_bug.cgi?id=1684
+        //     https://bugs.llvm.org/show_bug.cgi?id=40815
     0
-    #else
-    packet_traits<Scalar>::Vectorizable
-    #endif
+#else
+        packet_traits<Scalar>::Vectorizable
+#endif
   };
 };
 
-} // namespace internal
+}  // namespace internal
 
-} // namespace Eigen
+}  // namespace Eigen
 
-#endif // EIGEN_ASSIGNMENT_FUNCTORS_H
+#endif  // EIGEN_ASSIGNMENT_FUNCTORS_H
diff --git a/Eigen/src/Core/functors/BinaryFunctors.h b/Eigen/src/Core/functors/BinaryFunctors.h
index ce8cf1a..c91e6bb 100644
--- a/Eigen/src/Core/functors/BinaryFunctors.h
+++ b/Eigen/src/Core/functors/BinaryFunctors.h
@@ -19,108 +19,114 @@
 
 //---------- associative binary functors ----------
 
-template<typename Arg1, typename Arg2>
-struct binary_op_base
-{
+template <typename Arg1, typename Arg2>
+struct binary_op_base {
   typedef Arg1 first_argument_type;
   typedef Arg2 second_argument_type;
 };
 
 /** \internal
-  * \brief Template functor to compute the sum of two scalars
-  *
-  * \sa class CwiseBinaryOp, MatrixBase::operator+, class VectorwiseOp, DenseBase::sum()
-  */
-template<typename LhsScalar,typename RhsScalar>
-struct scalar_sum_op : binary_op_base<LhsScalar,RhsScalar>
-{
-  typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_sum_op>::ReturnType result_type;
+ * \brief Template functor to compute the sum of two scalars
+ *
+ * \sa class CwiseBinaryOp, MatrixBase::operator+, class VectorwiseOp, DenseBase::sum()
+ */
+template <typename LhsScalar, typename RhsScalar>
+struct scalar_sum_op : binary_op_base<LhsScalar, RhsScalar> {
+  typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar, scalar_sum_op>::ReturnType result_type;
 #ifdef EIGEN_SCALAR_BINARY_OP_PLUGIN
-  scalar_sum_op() {
-    EIGEN_SCALAR_BINARY_OP_PLUGIN
-  }
+  scalar_sum_op(){EIGEN_SCALAR_BINARY_OP_PLUGIN}
 #endif
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a + b; }
-  template<typename Packet>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const
-  { return internal::padd(a,b); }
-  template<typename Packet>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(const Packet& a) const
-  { return internal::predux(a); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type
+  operator()(const LhsScalar& a, const RhsScalar& b) const {
+    return a + b;
+  }
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
+    return internal::padd(a, b);
+  }
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(const Packet& a) const {
+    return internal::predux(a);
+  }
 };
-template<typename LhsScalar,typename RhsScalar>
-struct functor_traits<scalar_sum_op<LhsScalar,RhsScalar> > {
+template <typename LhsScalar, typename RhsScalar>
+struct functor_traits<scalar_sum_op<LhsScalar, RhsScalar>> {
   enum {
-    Cost = (int(NumTraits<LhsScalar>::AddCost) + int(NumTraits<RhsScalar>::AddCost)) / 2, // rough estimate!
-    PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasAdd && packet_traits<RhsScalar>::HasAdd
+    Cost = (int(NumTraits<LhsScalar>::AddCost) + int(NumTraits<RhsScalar>::AddCost)) / 2,  // rough estimate!
+    PacketAccess =
+        is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasAdd && packet_traits<RhsScalar>::HasAdd
     // TODO vectorize mixed sum
   };
 };
 
-
-template<>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool scalar_sum_op<bool,bool>::operator() (const bool& a, const bool& b) const { return a || b; }
-
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool scalar_sum_op<bool, bool>::operator()(const bool& a, const bool& b) const {
+  return a || b;
+}
 
 /** \internal
-  * \brief Template functor to compute the product of two scalars
-  *
-  * \sa class CwiseBinaryOp, Cwise::operator*(), class VectorwiseOp, MatrixBase::redux()
-  */
-template<typename LhsScalar,typename RhsScalar>
-struct scalar_product_op  : binary_op_base<LhsScalar,RhsScalar>
-{
-  typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_product_op>::ReturnType result_type;
+ * \brief Template functor to compute the product of two scalars
+ *
+ * \sa class CwiseBinaryOp, Cwise::operator*(), class VectorwiseOp, MatrixBase::redux()
+ */
+template <typename LhsScalar, typename RhsScalar>
+struct scalar_product_op : binary_op_base<LhsScalar, RhsScalar> {
+  typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar, scalar_product_op>::ReturnType result_type;
 #ifdef EIGEN_SCALAR_BINARY_OP_PLUGIN
-  scalar_product_op() {
-    EIGEN_SCALAR_BINARY_OP_PLUGIN
-  }
+  scalar_product_op(){EIGEN_SCALAR_BINARY_OP_PLUGIN}
 #endif
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a * b; }
-  template<typename Packet>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const
-  { return internal::pmul(a,b); }
-  template<typename Packet>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(const Packet& a) const
-  { return internal::predux_mul(a); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type
+  operator()(const LhsScalar& a, const RhsScalar& b) const {
+    return a * b;
+  }
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
+    return internal::pmul(a, b);
+  }
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(const Packet& a) const {
+    return internal::predux_mul(a);
+  }
 };
-template<typename LhsScalar,typename RhsScalar>
-struct functor_traits<scalar_product_op<LhsScalar,RhsScalar> > {
+template <typename LhsScalar, typename RhsScalar>
+struct functor_traits<scalar_product_op<LhsScalar, RhsScalar>> {
   enum {
-    Cost = (int(NumTraits<LhsScalar>::MulCost) + int(NumTraits<RhsScalar>::MulCost))/2, // rough estimate!
-    PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasMul && packet_traits<RhsScalar>::HasMul
+    Cost = (int(NumTraits<LhsScalar>::MulCost) + int(NumTraits<RhsScalar>::MulCost)) / 2,  // rough estimate!
+    PacketAccess =
+        is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMul && packet_traits<RhsScalar>::HasMul
     // TODO vectorize mixed product
   };
 };
 
-template<>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool scalar_product_op<bool,bool>::operator() (const bool& a, const bool& b) const { return a && b; }
-
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool scalar_product_op<bool, bool>::operator()(const bool& a,
+                                                                                     const bool& b) const {
+  return a && b;
+}
 
 /** \internal
-  * \brief Template functor to compute the conjugate product of two scalars
-  *
-  * This is a short cut for conj(x) * y which is needed for optimization purpose; in Eigen2 support mode, this becomes x * conj(y)
-  */
-template<typename LhsScalar,typename RhsScalar>
-struct scalar_conj_product_op  : binary_op_base<LhsScalar,RhsScalar>
-{
+ * \brief Template functor to compute the conjugate product of two scalars
+ *
+ * This is a short cut for conj(x) * y which is needed for optimization purpose; in Eigen2 support mode, this becomes x
+ * * conj(y)
+ */
+template <typename LhsScalar, typename RhsScalar>
+struct scalar_conj_product_op : binary_op_base<LhsScalar, RhsScalar> {
+  enum { Conj = NumTraits<LhsScalar>::IsComplex };
 
-  enum {
-    Conj = NumTraits<LhsScalar>::IsComplex
-  };
+  typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar, scalar_conj_product_op>::ReturnType result_type;
 
-  typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_conj_product_op>::ReturnType result_type;
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const LhsScalar& a, const RhsScalar& b) const {
+    return conj_helper<LhsScalar, RhsScalar, Conj, false>().pmul(a, b);
+  }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const LhsScalar& a, const RhsScalar& b) const
-  { return conj_helper<LhsScalar,RhsScalar,Conj,false>().pmul(a,b); }
-
-  template<typename Packet>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const
-  { return conj_helper<Packet,Packet,Conj,false>().pmul(a,b); }
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
+    return conj_helper<Packet, Packet, Conj, false>().pmul(a, b);
+  }
 };
-template<typename LhsScalar,typename RhsScalar>
-struct functor_traits<scalar_conj_product_op<LhsScalar,RhsScalar> > {
+template <typename LhsScalar, typename RhsScalar>
+struct functor_traits<scalar_conj_product_op<LhsScalar, RhsScalar>> {
   enum {
     Cost = NumTraits<LhsScalar>::MulCost,
     PacketAccess = internal::is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMul
@@ -128,65 +134,59 @@
 };
 
 /** \internal
-  * \brief Template functor to compute the min of two scalars
-  *
-  * \sa class CwiseBinaryOp, MatrixBase::cwiseMin, class VectorwiseOp, MatrixBase::minCoeff()
-  */
-template<typename LhsScalar,typename RhsScalar, int NaNPropagation>
-struct scalar_min_op : binary_op_base<LhsScalar,RhsScalar>
-{
-  typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_min_op>::ReturnType result_type;
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const LhsScalar& a, const RhsScalar& b) const {
+ * \brief Template functor to compute the min of two scalars
+ *
+ * \sa class CwiseBinaryOp, MatrixBase::cwiseMin, class VectorwiseOp, MatrixBase::minCoeff()
+ */
+template <typename LhsScalar, typename RhsScalar, int NaNPropagation>
+struct scalar_min_op : binary_op_base<LhsScalar, RhsScalar> {
+  typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar, scalar_min_op>::ReturnType result_type;
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const LhsScalar& a, const RhsScalar& b) const {
     return internal::pmin<NaNPropagation>(a, b);
   }
-  template<typename Packet>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const
-  {
-    return internal::pmin<NaNPropagation>(a,b);
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
+    return internal::pmin<NaNPropagation>(a, b);
   }
-  template<typename Packet>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(const Packet& a) const
-  {
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(const Packet& a) const {
     return internal::predux_min<NaNPropagation>(a);
   }
 };
 
-template<typename LhsScalar,typename RhsScalar, int NaNPropagation>
-struct functor_traits<scalar_min_op<LhsScalar,RhsScalar, NaNPropagation> > {
+template <typename LhsScalar, typename RhsScalar, int NaNPropagation>
+struct functor_traits<scalar_min_op<LhsScalar, RhsScalar, NaNPropagation>> {
   enum {
-    Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2,
+    Cost = (NumTraits<LhsScalar>::AddCost + NumTraits<RhsScalar>::AddCost) / 2,
     PacketAccess = internal::is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMin
   };
 };
 
 /** \internal
-  * \brief Template functor to compute the max of two scalars
-  *
-  * \sa class CwiseBinaryOp, MatrixBase::cwiseMax, class VectorwiseOp, MatrixBase::maxCoeff()
-  */
-template<typename LhsScalar,typename RhsScalar, int NaNPropagation>
-struct scalar_max_op : binary_op_base<LhsScalar,RhsScalar>
-{
-  typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_max_op>::ReturnType result_type;
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const LhsScalar& a, const RhsScalar& b) const {
-    return internal::pmax<NaNPropagation>(a,b);
+ * \brief Template functor to compute the max of two scalars
+ *
+ * \sa class CwiseBinaryOp, MatrixBase::cwiseMax, class VectorwiseOp, MatrixBase::maxCoeff()
+ */
+template <typename LhsScalar, typename RhsScalar, int NaNPropagation>
+struct scalar_max_op : binary_op_base<LhsScalar, RhsScalar> {
+  typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar, scalar_max_op>::ReturnType result_type;
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const LhsScalar& a, const RhsScalar& b) const {
+    return internal::pmax<NaNPropagation>(a, b);
   }
-  template<typename Packet>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const
-  {
-    return internal::pmax<NaNPropagation>(a,b);
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
+    return internal::pmax<NaNPropagation>(a, b);
   }
-  template<typename Packet>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(const Packet& a) const
-  {
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(const Packet& a) const {
     return internal::predux_max<NaNPropagation>(a);
   }
 };
 
-template<typename LhsScalar,typename RhsScalar, int NaNPropagation>
-struct functor_traits<scalar_max_op<LhsScalar,RhsScalar, NaNPropagation> > {
+template <typename LhsScalar, typename RhsScalar, int NaNPropagation>
+struct functor_traits<scalar_max_op<LhsScalar, RhsScalar, NaNPropagation>> {
   enum {
-    Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2,
+    Cost = (NumTraits<LhsScalar>::AddCost + NumTraits<RhsScalar>::AddCost) / 2,
     PacketAccess = internal::is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMax
   };
 };
@@ -195,8 +195,7 @@
  * \brief Template functors for comparison of two scalars
  * \todo Implement packet-comparisons
  */
-template <typename LhsScalar, typename RhsScalar, ComparisonName cmp,
-          bool UseTypedComparators = false>
+template <typename LhsScalar, typename RhsScalar, ComparisonName cmp, bool UseTypedComparators = false>
 struct scalar_cmp_op;
 
 template <typename LhsScalar, typename RhsScalar, ComparisonName cmp, bool UseTypedComparators>
@@ -311,42 +310,36 @@
 };
 
 /** \internal
-  * \brief Template functor to compute the hypot of two \b positive \b and \b real scalars
-  *
-  * \sa MatrixBase::stableNorm(), class Redux
-  */
-template<typename Scalar>
-struct scalar_hypot_op<Scalar,Scalar> : binary_op_base<Scalar,Scalar>
-{
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar &x, const Scalar &y) const
-  {
+ * \brief Template functor to compute the hypot of two \b positive \b and \b real scalars
+ *
+ * \sa MatrixBase::stableNorm(), class Redux
+ */
+template <typename Scalar>
+struct scalar_hypot_op<Scalar, Scalar> : binary_op_base<Scalar, Scalar> {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& x, const Scalar& y) const {
     // This functor is used by hypotNorm only for which it is faster to first apply abs
     // on all coefficients prior to reduction through hypot.
     // This way we avoid calling abs on positive and real entries, and this also permits
     // to seamlessly handle complexes. Otherwise we would have to handle both real and complexes
     // through the same functor...
-    return internal::positive_real_hypot(x,y);
+    return internal::positive_real_hypot(x, y);
   }
 };
-template<typename Scalar>
-struct functor_traits<scalar_hypot_op<Scalar,Scalar> > {
-  enum
-  {
-    Cost = 3 * NumTraits<Scalar>::AddCost +
-           2 * NumTraits<Scalar>::MulCost +
-           2 * scalar_div_cost<Scalar,false>::value,
+template <typename Scalar>
+struct functor_traits<scalar_hypot_op<Scalar, Scalar>> {
+  enum {
+    Cost = 3 * NumTraits<Scalar>::AddCost + 2 * NumTraits<Scalar>::MulCost + 2 * scalar_div_cost<Scalar, false>::value,
     PacketAccess = false
   };
 };
 
 /** \internal
-  * \brief Template functor to compute the pow of two scalars
-  * See the specification of pow in https://en.cppreference.com/w/cpp/numeric/math/pow
-  */
-template<typename Scalar, typename Exponent>
-struct scalar_pow_op  : binary_op_base<Scalar,Exponent>
-{
-  typedef typename ScalarBinaryOpTraits<Scalar,Exponent,scalar_pow_op>::ReturnType result_type;
+ * \brief Template functor to compute the pow of two scalars
+ * See the specification of pow in https://en.cppreference.com/w/cpp/numeric/math/pow
+ */
+template <typename Scalar, typename Exponent>
+struct scalar_pow_op : binary_op_base<Scalar, Exponent> {
+  typedef typename ScalarBinaryOpTraits<Scalar, Exponent, scalar_pow_op>::ReturnType result_type;
 #ifdef EIGEN_SCALAR_BINARY_OP_PLUGIN
   scalar_pow_op() {
     typedef Scalar LhsScalar;
@@ -355,64 +348,62 @@
   }
 #endif
 
-  EIGEN_DEVICE_FUNC
-  inline result_type operator() (const Scalar& a, const Exponent& b) const { return numext::pow(a, b); }
+  EIGEN_DEVICE_FUNC inline result_type operator()(const Scalar& a, const Exponent& b) const {
+    return numext::pow(a, b);
+  }
 
-  template<typename Packet>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
-  {
-    return generic_pow(a,b);
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const {
+    return generic_pow(a, b);
   }
 };
 
-template<typename Scalar, typename Exponent>
-struct functor_traits<scalar_pow_op<Scalar,Exponent> > {
+template <typename Scalar, typename Exponent>
+struct functor_traits<scalar_pow_op<Scalar, Exponent>> {
   enum {
     Cost = 5 * NumTraits<Scalar>::MulCost,
-    PacketAccess = (!NumTraits<Scalar>::IsComplex && !NumTraits<Scalar>::IsInteger &&
-                    packet_traits<Scalar>::HasExp && packet_traits<Scalar>::HasLog &&
-                    packet_traits<Scalar>::HasRound && packet_traits<Scalar>::HasCmp &&
+    PacketAccess = (!NumTraits<Scalar>::IsComplex && !NumTraits<Scalar>::IsInteger && packet_traits<Scalar>::HasExp &&
+                    packet_traits<Scalar>::HasLog && packet_traits<Scalar>::HasRound && packet_traits<Scalar>::HasCmp &&
                     // Temporarily disable packet access for half/bfloat16 until
                     // accuracy is improved.
-                    !is_same<Scalar, half>::value && !is_same<Scalar, bfloat16>::value
-                    )
+                    !is_same<Scalar, half>::value && !is_same<Scalar, bfloat16>::value)
   };
 };
 
 //---------- non associative binary functors ----------
 
 /** \internal
-  * \brief Template functor to compute the difference of two scalars
-  *
-  * \sa class CwiseBinaryOp, MatrixBase::operator-
-  */
-template<typename LhsScalar,typename RhsScalar>
-struct scalar_difference_op : binary_op_base<LhsScalar,RhsScalar>
-{
-  typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_difference_op>::ReturnType result_type;
+ * \brief Template functor to compute the difference of two scalars
+ *
+ * \sa class CwiseBinaryOp, MatrixBase::operator-
+ */
+template <typename LhsScalar, typename RhsScalar>
+struct scalar_difference_op : binary_op_base<LhsScalar, RhsScalar> {
+  typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar, scalar_difference_op>::ReturnType result_type;
 #ifdef EIGEN_SCALAR_BINARY_OP_PLUGIN
-  scalar_difference_op() {
-    EIGEN_SCALAR_BINARY_OP_PLUGIN
-  }
+  scalar_difference_op(){EIGEN_SCALAR_BINARY_OP_PLUGIN}
 #endif
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a - b; }
-  template<typename Packet>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
-  { return internal::psub(a,b); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type
+  operator()(const LhsScalar& a, const RhsScalar& b) const {
+    return a - b;
+  }
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const {
+    return internal::psub(a, b);
+  }
 };
-template<typename LhsScalar,typename RhsScalar>
-struct functor_traits<scalar_difference_op<LhsScalar,RhsScalar> > {
+template <typename LhsScalar, typename RhsScalar>
+struct functor_traits<scalar_difference_op<LhsScalar, RhsScalar>> {
   enum {
     Cost = (int(NumTraits<LhsScalar>::AddCost) + int(NumTraits<RhsScalar>::AddCost)) / 2,
-    PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasSub && packet_traits<RhsScalar>::HasSub
+    PacketAccess =
+        is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasSub && packet_traits<RhsScalar>::HasSub
   };
 };
 
 template <typename Packet, bool IsInteger = NumTraits<typename unpacket_traits<Packet>::type>::IsInteger>
 struct maybe_raise_div_by_zero {
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Packet x) {
-    EIGEN_UNUSED_VARIABLE(x);
-  }
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Packet x) { EIGEN_UNUSED_VARIABLE(x); }
 };
 
 #ifndef EIGEN_GPU_COMPILE_PHASE
@@ -431,40 +422,41 @@
 #endif
 
 /** \internal
-  * \brief Template functor to compute the quotient of two scalars
-  *
-  * \sa class CwiseBinaryOp, Cwise::operator/()
-  */
-template<typename LhsScalar,typename RhsScalar>
-struct scalar_quotient_op  : binary_op_base<LhsScalar,RhsScalar>
-{
-  typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_quotient_op>::ReturnType result_type;
+ * \brief Template functor to compute the quotient of two scalars
+ *
+ * \sa class CwiseBinaryOp, Cwise::operator/()
+ */
+template <typename LhsScalar, typename RhsScalar>
+struct scalar_quotient_op : binary_op_base<LhsScalar, RhsScalar> {
+  typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar, scalar_quotient_op>::ReturnType result_type;
 #ifdef EIGEN_SCALAR_BINARY_OP_PLUGIN
-  scalar_quotient_op() {
-    EIGEN_SCALAR_BINARY_OP_PLUGIN
-  }
+  scalar_quotient_op(){EIGEN_SCALAR_BINARY_OP_PLUGIN}
 #endif
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a / b; }
-  template<typename Packet>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type
+  operator()(const LhsScalar& a, const RhsScalar& b) const {
+    return a / b;
+  }
+  template <typename Packet>
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const {
     maybe_raise_div_by_zero<Packet>::run(b);
-    return internal::pdiv(a,b);
+    return internal::pdiv(a, b);
   }
 };
-template<typename LhsScalar,typename RhsScalar>
-struct functor_traits<scalar_quotient_op<LhsScalar,RhsScalar> > {
-  typedef typename scalar_quotient_op<LhsScalar,RhsScalar>::result_type result_type;
+template <typename LhsScalar, typename RhsScalar>
+struct functor_traits<scalar_quotient_op<LhsScalar, RhsScalar>> {
+  typedef typename scalar_quotient_op<LhsScalar, RhsScalar>::result_type result_type;
   enum {
-    PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasDiv && packet_traits<RhsScalar>::HasDiv,
-    Cost = scalar_div_cost<result_type,PacketAccess>::value
+    PacketAccess =
+        is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasDiv && packet_traits<RhsScalar>::HasDiv,
+    Cost = scalar_div_cost<result_type, PacketAccess>::value
   };
 };
 
 /** \internal
-  * \brief Template functor to compute the and of two scalars as if they were booleans
-  *
-  * \sa class CwiseBinaryOp, ArrayBase::operator&&
-  */
+ * \brief Template functor to compute the and of two scalars as if they were booleans
+ *
+ * \sa class CwiseBinaryOp, ArrayBase::operator&&
+ */
 template <typename Scalar>
 struct scalar_boolean_and_op {
   using result_type = Scalar;
@@ -489,10 +481,10 @@
 };
 
 /** \internal
-  * \brief Template functor to compute the or of two scalars as if they were booleans
-  *
-  * \sa class CwiseBinaryOp, ArrayBase::operator||
-  */
+ * \brief Template functor to compute the or of two scalars as if they were booleans
+ *
+ * \sa class CwiseBinaryOp, ArrayBase::operator||
+ */
 template <typename Scalar>
 struct scalar_boolean_or_op {
   using result_type = Scalar;
@@ -588,10 +580,10 @@
 };
 
 /** \internal
-  * \brief Template functor to compute the bitwise and of two scalars
-  *
-  * \sa class CwiseBinaryOp, ArrayBase::operator&
-  */
+ * \brief Template functor to compute the bitwise and of two scalars
+ *
+ * \sa class CwiseBinaryOp, ArrayBase::operator&
+ */
 template <typename Scalar>
 struct scalar_bitwise_and_op {
   EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::RequireInitialization,
@@ -612,10 +604,10 @@
 };
 
 /** \internal
-  * \brief Template functor to compute the bitwise or of two scalars
-  *
-  * \sa class CwiseBinaryOp, ArrayBase::operator|
-  */
+ * \brief Template functor to compute the bitwise or of two scalars
+ *
+ * \sa class CwiseBinaryOp, ArrayBase::operator|
+ */
 template <typename Scalar>
 struct scalar_bitwise_or_op {
   EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::RequireInitialization,
@@ -636,10 +628,10 @@
 };
 
 /** \internal
-  * \brief Template functor to compute the bitwise xor of two scalars
-  *
-  * \sa class CwiseBinaryOp, ArrayBase::operator^
-  */
+ * \brief Template functor to compute the bitwise xor of two scalars
+ *
+ * \sa class CwiseBinaryOp, ArrayBase::operator^
+ */
 template <typename Scalar>
 struct scalar_bitwise_xor_op {
   EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::RequireInitialization,
@@ -660,39 +652,39 @@
 };
 
 /** \internal
-  * \brief Template functor to compute the absolute difference of two scalars
-  *
-  * \sa class CwiseBinaryOp, MatrixBase::absolute_difference
-  */
-template<typename LhsScalar,typename RhsScalar>
-struct scalar_absolute_difference_op : binary_op_base<LhsScalar,RhsScalar>
-{
-  typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_absolute_difference_op>::ReturnType result_type;
+ * \brief Template functor to compute the absolute difference of two scalars
+ *
+ * \sa class CwiseBinaryOp, MatrixBase::absolute_difference
+ */
+template <typename LhsScalar, typename RhsScalar>
+struct scalar_absolute_difference_op : binary_op_base<LhsScalar, RhsScalar> {
+  typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar, scalar_absolute_difference_op>::ReturnType result_type;
 #ifdef EIGEN_SCALAR_BINARY_OP_PLUGIN
-  scalar_absolute_difference_op() {
-    EIGEN_SCALAR_BINARY_OP_PLUGIN
-  }
+  scalar_absolute_difference_op(){EIGEN_SCALAR_BINARY_OP_PLUGIN}
 #endif
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const
-  { return numext::absdiff(a,b); }
-  template<typename Packet>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
-  { return internal::pabsdiff(a,b); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type
+  operator()(const LhsScalar& a, const RhsScalar& b) const {
+    return numext::absdiff(a, b);
+  }
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const {
+    return internal::pabsdiff(a, b);
+  }
 };
-template<typename LhsScalar,typename RhsScalar>
-struct functor_traits<scalar_absolute_difference_op<LhsScalar,RhsScalar> > {
+template <typename LhsScalar, typename RhsScalar>
+struct functor_traits<scalar_absolute_difference_op<LhsScalar, RhsScalar>> {
   enum {
-    Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2,
-    PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasAbsDiff
+    Cost = (NumTraits<LhsScalar>::AddCost + NumTraits<RhsScalar>::AddCost) / 2,
+    PacketAccess = is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasAbsDiff
   };
 };
 
-
 template <typename LhsScalar, typename RhsScalar>
 struct scalar_atan2_op {
   using Scalar = LhsScalar;
 
-  static constexpr bool Enable = is_same<LhsScalar, RhsScalar>::value && !NumTraits<Scalar>::IsInteger && !NumTraits<Scalar>::IsComplex;
+  static constexpr bool Enable =
+      is_same<LhsScalar, RhsScalar>::value && !NumTraits<Scalar>::IsInteger && !NumTraits<Scalar>::IsComplex;
   EIGEN_STATIC_ASSERT(Enable, "LhsScalar and RhsScalar must be the same non-integer, non-complex type")
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& y, const Scalar& x) const {
@@ -704,61 +696,68 @@
   }
 };
 
-template<typename LhsScalar,typename RhsScalar>
-    struct functor_traits<scalar_atan2_op<LhsScalar, RhsScalar>> {
+template <typename LhsScalar, typename RhsScalar>
+struct functor_traits<scalar_atan2_op<LhsScalar, RhsScalar>> {
   using Scalar = LhsScalar;
   enum {
-    PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<Scalar>::HasATan && packet_traits<Scalar>::HasDiv && !NumTraits<Scalar>::IsInteger && !NumTraits<Scalar>::IsComplex,
+    PacketAccess = is_same<LhsScalar, RhsScalar>::value && packet_traits<Scalar>::HasATan &&
+                   packet_traits<Scalar>::HasDiv && !NumTraits<Scalar>::IsInteger && !NumTraits<Scalar>::IsComplex,
     Cost = int(scalar_div_cost<Scalar, PacketAccess>::value) + int(functor_traits<scalar_atan_op<Scalar>>::Cost)
   };
 };
 
 //---------- binary functors bound to a constant, thus appearing as a unary functor ----------
 
-// The following two classes permits to turn any binary functor into a unary one with one argument bound to a constant value.
-// They are analogues to std::binder1st/binder2nd but with the following differences:
+// The following two classes permits to turn any binary functor into a unary one with one argument bound to a constant
+// value. They are analogues to std::binder1st/binder2nd but with the following differences:
 //  - they are compatible with packetOp
 //  - they are portable across C++ versions (the std::binder* are deprecated in C++11)
-template<typename BinaryOp> struct bind1st_op : BinaryOp {
-
-  typedef typename BinaryOp::first_argument_type  first_argument_type;
+template <typename BinaryOp>
+struct bind1st_op : BinaryOp {
+  typedef typename BinaryOp::first_argument_type first_argument_type;
   typedef typename BinaryOp::second_argument_type second_argument_type;
-  typedef typename BinaryOp::result_type          result_type;
+  typedef typename BinaryOp::result_type result_type;
 
-  EIGEN_DEVICE_FUNC explicit bind1st_op(const first_argument_type &val) : m_value(val) {}
+  EIGEN_DEVICE_FUNC explicit bind1st_op(const first_argument_type& val) : m_value(val) {}
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const second_argument_type& b) const { return BinaryOp::operator()(m_value,b); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()(const second_argument_type& b) const {
+    return BinaryOp::operator()(m_value, b);
+  }
 
-  template<typename Packet>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& b) const
-  { return BinaryOp::packetOp(internal::pset1<Packet>(m_value), b); }
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& b) const {
+    return BinaryOp::packetOp(internal::pset1<Packet>(m_value), b);
+  }
 
   first_argument_type m_value;
 };
-template<typename BinaryOp> struct functor_traits<bind1st_op<BinaryOp> > : functor_traits<BinaryOp> {};
+template <typename BinaryOp>
+struct functor_traits<bind1st_op<BinaryOp>> : functor_traits<BinaryOp> {};
 
-
-template<typename BinaryOp> struct bind2nd_op : BinaryOp {
-
-  typedef typename BinaryOp::first_argument_type  first_argument_type;
+template <typename BinaryOp>
+struct bind2nd_op : BinaryOp {
+  typedef typename BinaryOp::first_argument_type first_argument_type;
   typedef typename BinaryOp::second_argument_type second_argument_type;
-  typedef typename BinaryOp::result_type          result_type;
+  typedef typename BinaryOp::result_type result_type;
 
-  EIGEN_DEVICE_FUNC explicit bind2nd_op(const second_argument_type &val) : m_value(val) {}
+  EIGEN_DEVICE_FUNC explicit bind2nd_op(const second_argument_type& val) : m_value(val) {}
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const first_argument_type& a) const { return BinaryOp::operator()(a,m_value); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()(const first_argument_type& a) const {
+    return BinaryOp::operator()(a, m_value);
+  }
 
-  template<typename Packet>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
-  { return BinaryOp::packetOp(a,internal::pset1<Packet>(m_value)); }
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
+    return BinaryOp::packetOp(a, internal::pset1<Packet>(m_value));
+  }
 
   second_argument_type m_value;
 };
-template<typename BinaryOp> struct functor_traits<bind2nd_op<BinaryOp> > : functor_traits<BinaryOp> {};
+template <typename BinaryOp>
+struct functor_traits<bind2nd_op<BinaryOp>> : functor_traits<BinaryOp> {};
 
+}  // end namespace internal
 
-} // end namespace internal
+}  // end namespace Eigen
 
-} // end namespace Eigen
-
-#endif // EIGEN_BINARY_FUNCTORS_H
+#endif  // EIGEN_BINARY_FUNCTORS_H
diff --git a/Eigen/src/Core/functors/NullaryFunctors.h b/Eigen/src/Core/functors/NullaryFunctors.h
index fde36be..c53bb90 100644
--- a/Eigen/src/Core/functors/NullaryFunctors.h
+++ b/Eigen/src/Core/functors/NullaryFunctors.h
@@ -17,67 +17,75 @@
 
 namespace internal {
 
-template<typename Scalar>
+template <typename Scalar>
 struct scalar_constant_op {
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE scalar_constant_op(const scalar_constant_op& other) : m_other(other.m_other) { }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE scalar_constant_op(const Scalar& other) : m_other(other) { }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() () const { return m_other; }
-  template<typename PacketType>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const PacketType packetOp() const { return internal::pset1<PacketType>(m_other); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE scalar_constant_op(const scalar_constant_op& other) : m_other(other.m_other) {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE scalar_constant_op(const Scalar& other) : m_other(other) {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()() const { return m_other; }
+  template <typename PacketType>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const PacketType packetOp() const {
+    return internal::pset1<PacketType>(m_other);
+  }
   const Scalar m_other;
 };
-template<typename Scalar>
-struct functor_traits<scalar_constant_op<Scalar> >
-{ enum { Cost = 0 /* as the constant value should be loaded in register only once for the whole expression */,
-         PacketAccess = packet_traits<Scalar>::Vectorizable, IsRepeatable = true }; };
-
-template<typename Scalar> struct scalar_identity_op {
-  template<typename IndexType>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (IndexType row, IndexType col) const { return row==col ? Scalar(1) : Scalar(0); }
+template <typename Scalar>
+struct functor_traits<scalar_constant_op<Scalar> > {
+  enum {
+    Cost = 0 /* as the constant value should be loaded in register only once for the whole expression */,
+    PacketAccess = packet_traits<Scalar>::Vectorizable,
+    IsRepeatable = true
+  };
 };
-template<typename Scalar>
-struct functor_traits<scalar_identity_op<Scalar> >
-{ enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = false, IsRepeatable = true }; };
-
-template <typename Scalar, bool IsInteger> struct linspaced_op_impl;
 
 template <typename Scalar>
-struct linspaced_op_impl<Scalar,/*IsInteger*/false>
-{
+struct scalar_identity_op {
+  template <typename IndexType>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(IndexType row, IndexType col) const {
+    return row == col ? Scalar(1) : Scalar(0);
+  }
+};
+template <typename Scalar>
+struct functor_traits<scalar_identity_op<Scalar> > {
+  enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = false, IsRepeatable = true };
+};
+
+template <typename Scalar, bool IsInteger>
+struct linspaced_op_impl;
+
+template <typename Scalar>
+struct linspaced_op_impl<Scalar, /*IsInteger*/ false> {
   typedef typename NumTraits<Scalar>::Real RealScalar;
 
-  EIGEN_DEVICE_FUNC linspaced_op_impl(const Scalar& low, const Scalar& high, Index num_steps) :
-    m_low(low), m_high(high), m_size1(num_steps==1 ? 1 : num_steps-1), m_step(num_steps==1 ? Scalar() : Scalar((high-low)/RealScalar(num_steps-1))),
-    m_flip(numext::abs(high)<numext::abs(low))
-  {}
+  EIGEN_DEVICE_FUNC linspaced_op_impl(const Scalar& low, const Scalar& high, Index num_steps)
+      : m_low(low),
+        m_high(high),
+        m_size1(num_steps == 1 ? 1 : num_steps - 1),
+        m_step(num_steps == 1 ? Scalar() : Scalar((high - low) / RealScalar(num_steps - 1))),
+        m_flip(numext::abs(high) < numext::abs(low)) {}
 
-  template<typename IndexType>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (IndexType i) const {
-    if(m_flip)
-      return (i==0)? m_low : Scalar(m_high - RealScalar(m_size1-i)*m_step);
+  template <typename IndexType>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(IndexType i) const {
+    if (m_flip)
+      return (i == 0) ? m_low : Scalar(m_high - RealScalar(m_size1 - i) * m_step);
     else
-      return (i==m_size1)? m_high : Scalar(m_low + RealScalar(i)*m_step);
+      return (i == m_size1) ? m_high : Scalar(m_low + RealScalar(i) * m_step);
   }
 
-  template<typename Packet, typename IndexType>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(IndexType i) const
-  {
+  template <typename Packet, typename IndexType>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(IndexType i) const {
     // Principle:
     // [low, ..., low] + ( [step, ..., step] * ( [i, ..., i] + [0, ..., size] ) )
-    if(m_flip)
-    {
-      Packet pi = plset<Packet>(Scalar(i-m_size1));
+    if (m_flip) {
+      Packet pi = plset<Packet>(Scalar(i - m_size1));
       Packet res = padd(pset1<Packet>(m_high), pmul(pset1<Packet>(m_step), pi));
       if (EIGEN_PREDICT_TRUE(i != 0)) return res;
       Packet mask = pcmp_lt(pset1<Packet>(0), plset<Packet>(0));
       return pselect<Packet>(mask, res, pset1<Packet>(m_low));
-    }
-    else
-    {
+    } else {
       Packet pi = plset<Packet>(Scalar(i));
       Packet res = padd(pset1<Packet>(m_low), pmul(pset1<Packet>(m_step), pi));
-      if(EIGEN_PREDICT_TRUE(i != m_size1-unpacket_traits<Packet>::size+1)) return res;
-      Packet mask = pcmp_lt(plset<Packet>(0), pset1<Packet>(unpacket_traits<Packet>::size-1));
+      if (EIGEN_PREDICT_TRUE(i != m_size1 - unpacket_traits<Packet>::size + 1)) return res;
+      Packet mask = pcmp_lt(plset<Packet>(0), pset1<Packet>(unpacket_traits<Packet>::size - 1));
       return pselect<Packet>(mask, res, pset1<Packet>(m_high));
     }
   }
@@ -90,21 +98,20 @@
 };
 
 template <typename Scalar>
-struct linspaced_op_impl<Scalar,/*IsInteger*/true>
-{
-  EIGEN_DEVICE_FUNC linspaced_op_impl(const Scalar& low, const Scalar& high, Index num_steps) :
-    m_low(low),
-    m_multiplier((high-low)/convert_index<Scalar>(num_steps<=1 ? 1 : num_steps-1)),
-    m_divisor(convert_index<Scalar>((high>=low?num_steps:-num_steps)+(high-low))/((numext::abs(high-low)+1)==0?1:(numext::abs(high-low)+1))),
-    m_use_divisor(num_steps>1 && (numext::abs(high-low)+1)<num_steps)
-  {}
+struct linspaced_op_impl<Scalar, /*IsInteger*/ true> {
+  EIGEN_DEVICE_FUNC linspaced_op_impl(const Scalar& low, const Scalar& high, Index num_steps)
+      : m_low(low),
+        m_multiplier((high - low) / convert_index<Scalar>(num_steps <= 1 ? 1 : num_steps - 1)),
+        m_divisor(convert_index<Scalar>((high >= low ? num_steps : -num_steps) + (high - low)) /
+                  ((numext::abs(high - low) + 1) == 0 ? 1 : (numext::abs(high - low) + 1))),
+        m_use_divisor(num_steps > 1 && (numext::abs(high - low) + 1) < num_steps) {}
 
-  template<typename IndexType>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  const Scalar operator() (IndexType i) const
-  {
-    if(m_use_divisor) return m_low + convert_index<Scalar>(i)/m_divisor;
-    else              return m_low + convert_index<Scalar>(i)*m_multiplier;
+  template <typename IndexType>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(IndexType i) const {
+    if (m_use_divisor)
+      return m_low + convert_index<Scalar>(i) / m_divisor;
+    else
+      return m_low + convert_index<Scalar>(i) * m_multiplier;
   }
 
   const Scalar m_low;
@@ -118,32 +125,37 @@
 // Forward declaration (we default to random access which does not really give
 // us a speed gain when using packet access but it allows to use the functor in
 // nested expressions).
-template <typename Scalar> struct linspaced_op;
-template <typename Scalar> struct functor_traits< linspaced_op<Scalar> >
-{
-  enum
-  {
+template <typename Scalar>
+struct linspaced_op;
+template <typename Scalar>
+struct functor_traits<linspaced_op<Scalar> > {
+  enum {
     Cost = 1,
-    PacketAccess =   (!NumTraits<Scalar>::IsInteger) && packet_traits<Scalar>::HasSetLinear && packet_traits<Scalar>::HasBlend,
-                  /*&& ((!NumTraits<Scalar>::IsInteger) || packet_traits<Scalar>::HasDiv),*/ // <- vectorization for integer is currently disabled
+    PacketAccess =
+        (!NumTraits<Scalar>::IsInteger) && packet_traits<Scalar>::HasSetLinear && packet_traits<Scalar>::HasBlend,
+    /*&& ((!NumTraits<Scalar>::IsInteger) || packet_traits<Scalar>::HasDiv),*/  // <- vectorization for integer is
+                                                                                // currently disabled
     IsRepeatable = true
   };
 };
-template <typename Scalar> struct linspaced_op
-{
+template <typename Scalar>
+struct linspaced_op {
   EIGEN_DEVICE_FUNC linspaced_op(const Scalar& low, const Scalar& high, Index num_steps)
-    : impl((num_steps==1 ? high : low),high,num_steps)
-  {}
+      : impl((num_steps == 1 ? high : low), high, num_steps) {}
 
-  template<typename IndexType>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (IndexType i) const { return impl(i); }
+  template <typename IndexType>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(IndexType i) const {
+    return impl(i);
+  }
 
-  template<typename Packet,typename IndexType>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(IndexType i) const { return impl.template packetOp<Packet>(i); }
+  template <typename Packet, typename IndexType>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(IndexType i) const {
+    return impl.template packetOp<Packet>(i);
+  }
 
   // This proxy object handles the actual required temporaries and the different
   // implementations (integer vs. floating point).
-  const linspaced_op_impl<Scalar,NumTraits<Scalar>::IsInteger> impl;
+  const linspaced_op_impl<Scalar, NumTraits<Scalar>::IsInteger> impl;
 };
 
 template <typename Scalar>
@@ -183,42 +195,69 @@
 // If it exposes an operator()(i,j), then we assume the i and j coefficients are required independently
 // and linear access is not possible. In all other cases, linear access is enabled.
 // Users should not have to deal with this structure.
-template<typename Functor> struct functor_has_linear_access { enum { ret = !has_binary_operator<Functor>::value }; };
+template <typename Functor>
+struct functor_has_linear_access {
+  enum { ret = !has_binary_operator<Functor>::value };
+};
 
 // For unreliable compilers, let's specialize the has_*ary_operator
 // helpers so that at least built-in nullary functors work fine.
-#if !( EIGEN_COMP_MSVC || EIGEN_COMP_GNUC || (EIGEN_COMP_ICC>=1600))
-template<typename Scalar,typename IndexType>
-struct has_nullary_operator<scalar_constant_op<Scalar>,IndexType> { enum { value = 1}; };
-template<typename Scalar,typename IndexType>
-struct has_unary_operator<scalar_constant_op<Scalar>,IndexType> { enum { value = 0}; };
-template<typename Scalar,typename IndexType>
-struct has_binary_operator<scalar_constant_op<Scalar>,IndexType> { enum { value = 0}; };
+#if !(EIGEN_COMP_MSVC || EIGEN_COMP_GNUC || (EIGEN_COMP_ICC >= 1600))
+template <typename Scalar, typename IndexType>
+struct has_nullary_operator<scalar_constant_op<Scalar>, IndexType> {
+  enum { value = 1 };
+};
+template <typename Scalar, typename IndexType>
+struct has_unary_operator<scalar_constant_op<Scalar>, IndexType> {
+  enum { value = 0 };
+};
+template <typename Scalar, typename IndexType>
+struct has_binary_operator<scalar_constant_op<Scalar>, IndexType> {
+  enum { value = 0 };
+};
 
-template<typename Scalar,typename IndexType>
-struct has_nullary_operator<scalar_identity_op<Scalar>,IndexType> { enum { value = 0}; };
-template<typename Scalar,typename IndexType>
-struct has_unary_operator<scalar_identity_op<Scalar>,IndexType> { enum { value = 0}; };
-template<typename Scalar,typename IndexType>
-struct has_binary_operator<scalar_identity_op<Scalar>,IndexType> { enum { value = 1}; };
+template <typename Scalar, typename IndexType>
+struct has_nullary_operator<scalar_identity_op<Scalar>, IndexType> {
+  enum { value = 0 };
+};
+template <typename Scalar, typename IndexType>
+struct has_unary_operator<scalar_identity_op<Scalar>, IndexType> {
+  enum { value = 0 };
+};
+template <typename Scalar, typename IndexType>
+struct has_binary_operator<scalar_identity_op<Scalar>, IndexType> {
+  enum { value = 1 };
+};
 
-template<typename Scalar,typename IndexType>
-struct has_nullary_operator<linspaced_op<Scalar>,IndexType> { enum { value = 0}; };
-template<typename Scalar,typename IndexType>
-struct has_unary_operator<linspaced_op<Scalar>,IndexType> { enum { value = 1}; };
-template<typename Scalar,typename IndexType>
-struct has_binary_operator<linspaced_op<Scalar>,IndexType> { enum { value = 0}; };
+template <typename Scalar, typename IndexType>
+struct has_nullary_operator<linspaced_op<Scalar>, IndexType> {
+  enum { value = 0 };
+};
+template <typename Scalar, typename IndexType>
+struct has_unary_operator<linspaced_op<Scalar>, IndexType> {
+  enum { value = 1 };
+};
+template <typename Scalar, typename IndexType>
+struct has_binary_operator<linspaced_op<Scalar>, IndexType> {
+  enum { value = 0 };
+};
 
-template<typename Scalar,typename IndexType>
-struct has_nullary_operator<scalar_random_op<Scalar>,IndexType> { enum { value = 1}; };
-template<typename Scalar,typename IndexType>
-struct has_unary_operator<scalar_random_op<Scalar>,IndexType> { enum { value = 0}; };
-template<typename Scalar,typename IndexType>
-struct has_binary_operator<scalar_random_op<Scalar>,IndexType> { enum { value = 0}; };
+template <typename Scalar, typename IndexType>
+struct has_nullary_operator<scalar_random_op<Scalar>, IndexType> {
+  enum { value = 1 };
+};
+template <typename Scalar, typename IndexType>
+struct has_unary_operator<scalar_random_op<Scalar>, IndexType> {
+  enum { value = 0 };
+};
+template <typename Scalar, typename IndexType>
+struct has_binary_operator<scalar_random_op<Scalar>, IndexType> {
+  enum { value = 0 };
+};
 #endif
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_NULLARY_FUNCTORS_H
+#endif  // EIGEN_NULLARY_FUNCTORS_H
diff --git a/Eigen/src/Core/functors/StlFunctors.h b/Eigen/src/Core/functors/StlFunctors.h
index 8ee1de5..0599ce3 100644
--- a/Eigen/src/Core/functors/StlFunctors.h
+++ b/Eigen/src/Core/functors/StlFunctors.h
@@ -18,101 +18,123 @@
 
 // default functor traits for STL functors:
 
-template<typename T>
-struct functor_traits<std::multiplies<T> >
-{ enum { Cost = NumTraits<T>::MulCost, PacketAccess = false }; };
+template <typename T>
+struct functor_traits<std::multiplies<T> > {
+  enum { Cost = NumTraits<T>::MulCost, PacketAccess = false };
+};
 
-template<typename T>
-struct functor_traits<std::divides<T> >
-{ enum { Cost = NumTraits<T>::MulCost, PacketAccess = false }; };
+template <typename T>
+struct functor_traits<std::divides<T> > {
+  enum { Cost = NumTraits<T>::MulCost, PacketAccess = false };
+};
 
-template<typename T>
-struct functor_traits<std::plus<T> >
-{ enum { Cost = NumTraits<T>::AddCost, PacketAccess = false }; };
+template <typename T>
+struct functor_traits<std::plus<T> > {
+  enum { Cost = NumTraits<T>::AddCost, PacketAccess = false };
+};
 
-template<typename T>
-struct functor_traits<std::minus<T> >
-{ enum { Cost = NumTraits<T>::AddCost, PacketAccess = false }; };
+template <typename T>
+struct functor_traits<std::minus<T> > {
+  enum { Cost = NumTraits<T>::AddCost, PacketAccess = false };
+};
 
-template<typename T>
-struct functor_traits<std::negate<T> >
-{ enum { Cost = NumTraits<T>::AddCost, PacketAccess = false }; };
+template <typename T>
+struct functor_traits<std::negate<T> > {
+  enum { Cost = NumTraits<T>::AddCost, PacketAccess = false };
+};
 
-template<typename T>
-struct functor_traits<std::logical_or<T> >
-{ enum { Cost = 1, PacketAccess = false }; };
+template <typename T>
+struct functor_traits<std::logical_or<T> > {
+  enum { Cost = 1, PacketAccess = false };
+};
 
-template<typename T>
-struct functor_traits<std::logical_and<T> >
-{ enum { Cost = 1, PacketAccess = false }; };
+template <typename T>
+struct functor_traits<std::logical_and<T> > {
+  enum { Cost = 1, PacketAccess = false };
+};
 
-template<typename T>
-struct functor_traits<std::logical_not<T> >
-{ enum { Cost = 1, PacketAccess = false }; };
+template <typename T>
+struct functor_traits<std::logical_not<T> > {
+  enum { Cost = 1, PacketAccess = false };
+};
 
-template<typename T>
-struct functor_traits<std::greater<T> >
-{ enum { Cost = 1, PacketAccess = false }; };
+template <typename T>
+struct functor_traits<std::greater<T> > {
+  enum { Cost = 1, PacketAccess = false };
+};
 
-template<typename T>
-struct functor_traits<std::less<T> >
-{ enum { Cost = 1, PacketAccess = false }; };
+template <typename T>
+struct functor_traits<std::less<T> > {
+  enum { Cost = 1, PacketAccess = false };
+};
 
-template<typename T>
-struct functor_traits<std::greater_equal<T> >
-{ enum { Cost = 1, PacketAccess = false }; };
+template <typename T>
+struct functor_traits<std::greater_equal<T> > {
+  enum { Cost = 1, PacketAccess = false };
+};
 
-template<typename T>
-struct functor_traits<std::less_equal<T> >
-{ enum { Cost = 1, PacketAccess = false }; };
+template <typename T>
+struct functor_traits<std::less_equal<T> > {
+  enum { Cost = 1, PacketAccess = false };
+};
 
-template<typename T>
-struct functor_traits<std::equal_to<T> >
-{ enum { Cost = 1, PacketAccess = false }; };
+template <typename T>
+struct functor_traits<std::equal_to<T> > {
+  enum { Cost = 1, PacketAccess = false };
+};
 
-template<typename T>
-struct functor_traits<std::not_equal_to<T> >
-{ enum { Cost = 1, PacketAccess = false }; };
+template <typename T>
+struct functor_traits<std::not_equal_to<T> > {
+  enum { Cost = 1, PacketAccess = false };
+};
 
 #if (EIGEN_COMP_CXXVER < 17)
 // std::unary_negate is deprecated since c++17 and will be removed in c++20
-template<typename T>
-struct functor_traits<std::unary_negate<T> >
-{ enum { Cost = 1 + functor_traits<T>::Cost, PacketAccess = false }; };
+template <typename T>
+struct functor_traits<std::unary_negate<T> > {
+  enum { Cost = 1 + functor_traits<T>::Cost, PacketAccess = false };
+};
 
 // std::binary_negate is deprecated since c++17 and will be removed in c++20
-template<typename T>
-struct functor_traits<std::binary_negate<T> >
-{ enum { Cost = 1 + functor_traits<T>::Cost, PacketAccess = false }; };
+template <typename T>
+struct functor_traits<std::binary_negate<T> > {
+  enum { Cost = 1 + functor_traits<T>::Cost, PacketAccess = false };
+};
 #endif
 
 #ifdef EIGEN_STDEXT_SUPPORT
 
-template<typename T0,typename T1>
-struct functor_traits<std::project1st<T0,T1> >
-{ enum { Cost = 0, PacketAccess = false }; };
+template <typename T0, typename T1>
+struct functor_traits<std::project1st<T0, T1> > {
+  enum { Cost = 0, PacketAccess = false };
+};
 
-template<typename T0,typename T1>
-struct functor_traits<std::project2nd<T0,T1> >
-{ enum { Cost = 0, PacketAccess = false }; };
+template <typename T0, typename T1>
+struct functor_traits<std::project2nd<T0, T1> > {
+  enum { Cost = 0, PacketAccess = false };
+};
 
-template<typename T0,typename T1>
-struct functor_traits<std::select2nd<std::pair<T0,T1> > >
-{ enum { Cost = 0, PacketAccess = false }; };
+template <typename T0, typename T1>
+struct functor_traits<std::select2nd<std::pair<T0, T1> > > {
+  enum { Cost = 0, PacketAccess = false };
+};
 
-template<typename T0,typename T1>
-struct functor_traits<std::select1st<std::pair<T0,T1> > >
-{ enum { Cost = 0, PacketAccess = false }; };
+template <typename T0, typename T1>
+struct functor_traits<std::select1st<std::pair<T0, T1> > > {
+  enum { Cost = 0, PacketAccess = false };
+};
 
-template<typename T0,typename T1>
-struct functor_traits<std::unary_compose<T0,T1> >
-{ enum { Cost = functor_traits<T0>::Cost + functor_traits<T1>::Cost, PacketAccess = false }; };
+template <typename T0, typename T1>
+struct functor_traits<std::unary_compose<T0, T1> > {
+  enum { Cost = functor_traits<T0>::Cost + functor_traits<T1>::Cost, PacketAccess = false };
+};
 
-template<typename T0,typename T1,typename T2>
-struct functor_traits<std::binary_compose<T0,T1,T2> >
-{ enum { Cost = functor_traits<T0>::Cost + functor_traits<T1>::Cost + functor_traits<T2>::Cost, PacketAccess = false }; };
+template <typename T0, typename T1, typename T2>
+struct functor_traits<std::binary_compose<T0, T1, T2> > {
+  enum { Cost = functor_traits<T0>::Cost + functor_traits<T1>::Cost + functor_traits<T2>::Cost, PacketAccess = false };
+};
 
-#endif // EIGEN_STDEXT_SUPPORT
+#endif  // EIGEN_STDEXT_SUPPORT
 
 // allow to add new functors and specializations of functor_traits from outside Eigen.
 // this macro is really needed because functor_traits must be specialized after it is declared but before it is used...
@@ -120,8 +142,8 @@
 #include EIGEN_FUNCTORS_PLUGIN
 #endif
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_STL_FUNCTORS_H
+#endif  // EIGEN_STL_FUNCTORS_H
diff --git a/Eigen/src/Core/functors/TernaryFunctors.h b/Eigen/src/Core/functors/TernaryFunctors.h
index 859cd19..745779a 100644
--- a/Eigen/src/Core/functors/TernaryFunctors.h
+++ b/Eigen/src/Core/functors/TernaryFunctors.h
@@ -25,26 +25,28 @@
   EIGEN_STATIC_ASSERT(ThenElseAreSame, THEN AND ELSE MUST BE SAME TYPE)
   using Scalar = ThenScalar;
   using result_type = Scalar;
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const ThenScalar& a, const ElseScalar& b, const ConditionScalar& cond) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const ThenScalar& a, const ElseScalar& b,
+                                                          const ConditionScalar& cond) const {
     return cond == ConditionScalar(0) ? b : a;
   }
   template <typename Packet>
-      EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b, const Packet& cond) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b, const Packet& cond) const {
     return pselect(pcmp_eq(cond, pzero(cond)), b, a);
   }
 };
 
 template <typename ThenScalar, typename ElseScalar, typename ConditionScalar>
-    struct functor_traits<scalar_boolean_select_op<ThenScalar, ElseScalar, ConditionScalar>> {
+struct functor_traits<scalar_boolean_select_op<ThenScalar, ElseScalar, ConditionScalar>> {
   using Scalar = ThenScalar;
   enum {
     Cost = 1,
-    PacketAccess = is_same<ThenScalar, ElseScalar>::value && is_same<ConditionScalar, Scalar>::value && packet_traits<Scalar>::HasCmp
+    PacketAccess = is_same<ThenScalar, ElseScalar>::value && is_same<ConditionScalar, Scalar>::value &&
+                   packet_traits<Scalar>::HasCmp
   };
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_TERNARY_FUNCTORS_H
+#endif  // EIGEN_TERNARY_FUNCTORS_H
diff --git a/Eigen/src/Core/functors/UnaryFunctors.h b/Eigen/src/Core/functors/UnaryFunctors.h
index d988eb1..3c7dfb7 100644
--- a/Eigen/src/Core/functors/UnaryFunctors.h
+++ b/Eigen/src/Core/functors/UnaryFunctors.h
@@ -18,101 +18,106 @@
 namespace internal {
 
 /** \internal
-  * \brief Template functor to compute the opposite of a scalar
-  *
-  * \sa class CwiseUnaryOp, MatrixBase::operator-
-  */
-template<typename Scalar> struct scalar_opposite_op {
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return -a; }
-  template<typename Packet>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
-  { return internal::pnegate(a); }
+ * \brief Template functor to compute the opposite of a scalar
+ *
+ * \sa class CwiseUnaryOp, MatrixBase::operator-
+ */
+template <typename Scalar>
+struct scalar_opposite_op {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const { return -a; }
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
+    return internal::pnegate(a);
+  }
 };
-template<typename Scalar>
-struct functor_traits<scalar_opposite_op<Scalar> >
-{ enum {
-    Cost = NumTraits<Scalar>::AddCost,
-    PacketAccess = packet_traits<Scalar>::HasNegate };
+template <typename Scalar>
+struct functor_traits<scalar_opposite_op<Scalar>> {
+  enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasNegate };
 };
 
 /** \internal
-  * \brief Template functor to compute the absolute value of a scalar
-  *
-  * \sa class CwiseUnaryOp, Cwise::abs
-  */
-template<typename Scalar> struct scalar_abs_op {
+ * \brief Template functor to compute the absolute value of a scalar
+ *
+ * \sa class CwiseUnaryOp, Cwise::abs
+ */
+template <typename Scalar>
+struct scalar_abs_op {
   typedef typename NumTraits<Scalar>::Real result_type;
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const { return numext::abs(a); }
-  template<typename Packet>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
-  { return internal::pabs(a); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()(const Scalar& a) const { return numext::abs(a); }
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
+    return internal::pabs(a);
+  }
 };
-template<typename Scalar>
-struct functor_traits<scalar_abs_op<Scalar> >
-{
-  enum {
-    Cost = NumTraits<Scalar>::AddCost,
-    PacketAccess = packet_traits<Scalar>::HasAbs
-  };
+template <typename Scalar>
+struct functor_traits<scalar_abs_op<Scalar>> {
+  enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasAbs };
 };
 
 /** \internal
-  * \brief Template functor to compute the score of a scalar, to chose a pivot
-  *
-  * \sa class CwiseUnaryOp
-  */
-template<typename Scalar> struct scalar_score_coeff_op : scalar_abs_op<Scalar>
-{
+ * \brief Template functor to compute the score of a scalar, to chose a pivot
+ *
+ * \sa class CwiseUnaryOp
+ */
+template <typename Scalar>
+struct scalar_score_coeff_op : scalar_abs_op<Scalar> {
   typedef void Score_is_abs;
 };
-template<typename Scalar>
-struct functor_traits<scalar_score_coeff_op<Scalar> > : functor_traits<scalar_abs_op<Scalar> > {};
+template <typename Scalar>
+struct functor_traits<scalar_score_coeff_op<Scalar>> : functor_traits<scalar_abs_op<Scalar>> {};
 
 /* Avoid recomputing abs when we know the score and they are the same. Not a true Eigen functor.  */
-template<typename Scalar, typename=void> struct abs_knowing_score
-{
+template <typename Scalar, typename = void>
+struct abs_knowing_score {
   typedef typename NumTraits<Scalar>::Real result_type;
-  template<typename Score>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a, const Score&) const { return numext::abs(a); }
+  template <typename Score>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()(const Scalar& a, const Score&) const {
+    return numext::abs(a);
+  }
 };
-template<typename Scalar> struct abs_knowing_score<Scalar, typename scalar_score_coeff_op<Scalar>::Score_is_abs>
-{
+template <typename Scalar>
+struct abs_knowing_score<Scalar, typename scalar_score_coeff_op<Scalar>::Score_is_abs> {
   typedef typename NumTraits<Scalar>::Real result_type;
-  template<typename Scal>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const Scal&, const result_type& a) const { return a; }
+  template <typename Scal>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()(const Scal&, const result_type& a) const {
+    return a;
+  }
 };
 
 /** \internal
-  * \brief Template functor to compute the squared absolute value of a scalar
-  *
-  * \sa class CwiseUnaryOp, Cwise::abs2
-  */
-template<typename Scalar> struct scalar_abs2_op {
+ * \brief Template functor to compute the squared absolute value of a scalar
+ *
+ * \sa class CwiseUnaryOp, Cwise::abs2
+ */
+template <typename Scalar>
+struct scalar_abs2_op {
   typedef typename NumTraits<Scalar>::Real result_type;
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const { return numext::abs2(a); }
-  template<typename Packet>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
-  { return internal::pmul(a,a); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()(const Scalar& a) const { return numext::abs2(a); }
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
+    return internal::pmul(a, a);
+  }
 };
-template<typename Scalar>
-struct functor_traits<scalar_abs2_op<Scalar> >
-{ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasAbs2 }; };
+template <typename Scalar>
+struct functor_traits<scalar_abs2_op<Scalar>> {
+  enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasAbs2 };
+};
 
 /** \internal
-  * \brief Template functor to compute the conjugate of a complex value
-  *
-  * \sa class CwiseUnaryOp, MatrixBase::conjugate()
-  */
-template<typename Scalar> struct scalar_conjugate_op {
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return numext::conj(a); }
-  template<typename Packet>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const { return internal::pconj(a); }
+ * \brief Template functor to compute the conjugate of a complex value
+ *
+ * \sa class CwiseUnaryOp, MatrixBase::conjugate()
+ */
+template <typename Scalar>
+struct scalar_conjugate_op {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const { return numext::conj(a); }
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
+    return internal::pconj(a);
+  }
 };
-template<typename Scalar>
-struct functor_traits<scalar_conjugate_op<Scalar> >
-{
+template <typename Scalar>
+struct functor_traits<scalar_conjugate_op<Scalar>> {
   enum {
     Cost = 0,
     // Yes the cost is zero even for complexes because in most cases for which
@@ -128,20 +133,21 @@
 };
 
 /** \internal
-  * \brief Template functor to compute the phase angle of a complex
-  *
-  * \sa class CwiseUnaryOp, Cwise::arg
-  */
-template<typename Scalar> struct scalar_arg_op {
+ * \brief Template functor to compute the phase angle of a complex
+ *
+ * \sa class CwiseUnaryOp, Cwise::arg
+ */
+template <typename Scalar>
+struct scalar_arg_op {
   typedef typename NumTraits<Scalar>::Real result_type;
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const { return numext::arg(a); }
-  template<typename Packet>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
-  { return internal::parg(a); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()(const Scalar& a) const { return numext::arg(a); }
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
+    return internal::parg(a);
+  }
 };
-template<typename Scalar>
-struct functor_traits<scalar_arg_op<Scalar> >
-{
+template <typename Scalar>
+struct functor_traits<scalar_arg_op<Scalar>> {
   enum {
     Cost = NumTraits<Scalar>::IsComplex ? 5 * NumTraits<Scalar>::MulCost : NumTraits<Scalar>::AddCost,
     PacketAccess = packet_traits<Scalar>::HasArg
@@ -149,15 +155,16 @@
 };
 
 /** \internal
-  * \brief Template functor to compute the complex argument, returned as a complex type
-  *
-  * \sa class CwiseUnaryOp, Cwise::carg
-  */
+ * \brief Template functor to compute the complex argument, returned as a complex type
+ *
+ * \sa class CwiseUnaryOp, Cwise::carg
+ */
 template <typename Scalar>
 struct scalar_carg_op {
   using result_type = Scalar;
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const { return Scalar(numext::arg(a)); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const {
+    return Scalar(numext::arg(a));
+  }
   template <typename Packet>
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
     return pcarg(a);
@@ -170,23 +177,26 @@
 };
 
 /** \internal
-  * \brief Template functor to cast a scalar to another type
-  *
-  * \sa class CwiseUnaryOp, MatrixBase::cast()
-  */
-template<typename Scalar, typename NewType>
+ * \brief Template functor to cast a scalar to another type
+ *
+ * \sa class CwiseUnaryOp, MatrixBase::cast()
+ */
+template <typename Scalar, typename NewType>
 struct scalar_cast_op {
   typedef NewType result_type;
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const NewType operator() (const Scalar& a) const { return cast<Scalar, NewType>(a); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const NewType operator()(const Scalar& a) const {
+    return cast<Scalar, NewType>(a);
+  }
 };
 
-template<typename Scalar, typename NewType>
-struct functor_traits<scalar_cast_op<Scalar,NewType> >
-{ enum { Cost = is_same<Scalar, NewType>::value ? 0 : NumTraits<NewType>::AddCost, PacketAccess = false }; };
+template <typename Scalar, typename NewType>
+struct functor_traits<scalar_cast_op<Scalar, NewType>> {
+  enum { Cost = is_same<Scalar, NewType>::value ? 0 : NumTraits<NewType>::AddCost, PacketAccess = false };
+};
 
 /** \internal
- * `core_cast_op` serves to distinguish the vectorized implementation from that of the legacy `scalar_cast_op` for backwards
- * compatibility. The manner in which packet ops are handled is defined by the specialized unary_evaluator:
+ * `core_cast_op` serves to distinguish the vectorized implementation from that of the legacy `scalar_cast_op` for
+ * backwards compatibility. The manner in which packet ops are handled is defined by the specialized unary_evaluator:
  * `unary_evaluator<CwiseUnaryOp<core_cast_op<SrcType, DstType>, ArgType>, IndexBased>` in CoreEvaluators.h
  * Otherwise, the non-vectorized behavior is identical to that of `scalar_cast_op`
  */
@@ -203,255 +213,279 @@
 };
 
 /** \internal
-  * \brief Template functor to arithmetically shift a scalar right by a number of bits
-  *
-  * \sa class CwiseUnaryOp, MatrixBase::shift_right()
-  */
-template<typename Scalar, int N>
+ * \brief Template functor to arithmetically shift a scalar right by a number of bits
+ *
+ * \sa class CwiseUnaryOp, MatrixBase::shift_right()
+ */
+template <typename Scalar, int N>
 struct scalar_shift_right_op {
-
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const
-  { return a >> N; }
-  template<typename Packet>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
-  { return internal::parithmetic_shift_right<N>(a); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const { return a >> N; }
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
+    return internal::parithmetic_shift_right<N>(a);
+  }
 };
-template<typename Scalar, int N>
-struct functor_traits<scalar_shift_right_op<Scalar,N> >
-{ enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasShift }; };
+template <typename Scalar, int N>
+struct functor_traits<scalar_shift_right_op<Scalar, N>> {
+  enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasShift };
+};
 
 /** \internal
-  * \brief Template functor to logically shift a scalar left by a number of bits
-  *
-  * \sa class CwiseUnaryOp, MatrixBase::shift_left()
-  */
-template<typename Scalar, int N>
+ * \brief Template functor to logically shift a scalar left by a number of bits
+ *
+ * \sa class CwiseUnaryOp, MatrixBase::shift_left()
+ */
+template <typename Scalar, int N>
 struct scalar_shift_left_op {
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const
-  { return a << N; }
-  template<typename Packet>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
-  { return internal::plogical_shift_left<N>(a); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const { return a << N; }
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
+    return internal::plogical_shift_left<N>(a);
+  }
 };
-template<typename Scalar, int N>
-struct functor_traits<scalar_shift_left_op<Scalar,N> >
-{ enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasShift }; };
+template <typename Scalar, int N>
+struct functor_traits<scalar_shift_left_op<Scalar, N>> {
+  enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasShift };
+};
 
 /** \internal
-  * \brief Template functor to extract the real part of a complex
-  *
-  * \sa class CwiseUnaryOp, MatrixBase::real()
-  */
-template<typename Scalar>
+ * \brief Template functor to extract the real part of a complex
+ *
+ * \sa class CwiseUnaryOp, MatrixBase::real()
+ */
+template <typename Scalar>
 struct scalar_real_op {
   typedef typename NumTraits<Scalar>::Real result_type;
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return numext::real(a); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const Scalar& a) const { return numext::real(a); }
 };
-template<typename Scalar>
-struct functor_traits<scalar_real_op<Scalar> >
-{ enum { Cost = 0, PacketAccess = false }; };
+template <typename Scalar>
+struct functor_traits<scalar_real_op<Scalar>> {
+  enum { Cost = 0, PacketAccess = false };
+};
 
 /** \internal
-  * \brief Template functor to extract the imaginary part of a complex
-  *
-  * \sa class CwiseUnaryOp, MatrixBase::imag()
-  */
-template<typename Scalar>
+ * \brief Template functor to extract the imaginary part of a complex
+ *
+ * \sa class CwiseUnaryOp, MatrixBase::imag()
+ */
+template <typename Scalar>
 struct scalar_imag_op {
   typedef typename NumTraits<Scalar>::Real result_type;
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return numext::imag(a); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const Scalar& a) const { return numext::imag(a); }
 };
-template<typename Scalar>
-struct functor_traits<scalar_imag_op<Scalar> >
-{ enum { Cost = 0, PacketAccess = false }; };
+template <typename Scalar>
+struct functor_traits<scalar_imag_op<Scalar>> {
+  enum { Cost = 0, PacketAccess = false };
+};
 
 /** \internal
-  * \brief Template functor to extract the real part of a complex as a reference
-  *
-  * \sa class CwiseUnaryOp, MatrixBase::real()
-  */
-template<typename Scalar>
+ * \brief Template functor to extract the real part of a complex as a reference
+ *
+ * \sa class CwiseUnaryOp, MatrixBase::real()
+ */
+template <typename Scalar>
 struct scalar_real_ref_op {
   typedef typename NumTraits<Scalar>::Real result_type;
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE result_type& operator() (const Scalar& a) const { return numext::real_ref(*const_cast<Scalar*>(&a)); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type& operator()(const Scalar& a) const {
+    return numext::real_ref(*const_cast<Scalar*>(&a));
+  }
 };
-template<typename Scalar>
-struct functor_traits<scalar_real_ref_op<Scalar> >
-{ enum { Cost = 0, PacketAccess = false }; };
+template <typename Scalar>
+struct functor_traits<scalar_real_ref_op<Scalar>> {
+  enum { Cost = 0, PacketAccess = false };
+};
 
 /** \internal
-  * \brief Template functor to extract the imaginary part of a complex as a reference
-  *
-  * \sa class CwiseUnaryOp, MatrixBase::imag()
-  */
-template<typename Scalar>
+ * \brief Template functor to extract the imaginary part of a complex as a reference
+ *
+ * \sa class CwiseUnaryOp, MatrixBase::imag()
+ */
+template <typename Scalar>
 struct scalar_imag_ref_op {
   typedef typename NumTraits<Scalar>::Real result_type;
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE result_type& operator() (const Scalar& a) const { return numext::imag_ref(*const_cast<Scalar*>(&a)); }
-};
-template<typename Scalar>
-struct functor_traits<scalar_imag_ref_op<Scalar> >
-{ enum { Cost = 0, PacketAccess = false }; };
-
-/** \internal
-  *
-  * \brief Template functor to compute the exponential of a scalar
-  *
-  * \sa class CwiseUnaryOp, Cwise::exp()
-  */
-template<typename Scalar> struct scalar_exp_op {
-  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return internal::pexp(a); }
-  template <typename Packet>
-  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pexp(a); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type& operator()(const Scalar& a) const {
+    return numext::imag_ref(*const_cast<Scalar*>(&a));
+  }
 };
 template <typename Scalar>
-struct functor_traits<scalar_exp_op<Scalar> > {
+struct functor_traits<scalar_imag_ref_op<Scalar>> {
+  enum { Cost = 0, PacketAccess = false };
+};
+
+/** \internal
+ *
+ * \brief Template functor to compute the exponential of a scalar
+ *
+ * \sa class CwiseUnaryOp, Cwise::exp()
+ */
+template <typename Scalar>
+struct scalar_exp_op {
+  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return internal::pexp(a); }
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
+    return internal::pexp(a);
+  }
+};
+template <typename Scalar>
+struct functor_traits<scalar_exp_op<Scalar>> {
   enum {
     PacketAccess = packet_traits<Scalar>::HasExp,
-    // The following numbers are based on the AVX implementation.
+  // The following numbers are based on the AVX implementation.
 #ifdef EIGEN_VECTORIZE_FMA
     // Haswell can issue 2 add/mul/madd per cycle.
-    Cost =
-    (sizeof(Scalar) == 4
-     // float: 8 pmadd, 4 pmul, 2 padd/psub, 6 other
-     ? (8 * NumTraits<Scalar>::AddCost + 6 * NumTraits<Scalar>::MulCost)
-     // double: 7 pmadd, 5 pmul, 3 padd/psub, 1 div,  13 other
-     : (14 * NumTraits<Scalar>::AddCost +
-        6 * NumTraits<Scalar>::MulCost +
-        scalar_div_cost<Scalar,packet_traits<Scalar>::HasDiv>::value))
+    Cost = (sizeof(Scalar) == 4
+                // float: 8 pmadd, 4 pmul, 2 padd/psub, 6 other
+                ? (8 * NumTraits<Scalar>::AddCost + 6 * NumTraits<Scalar>::MulCost)
+                // double: 7 pmadd, 5 pmul, 3 padd/psub, 1 div,  13 other
+                : (14 * NumTraits<Scalar>::AddCost + 6 * NumTraits<Scalar>::MulCost +
+                   scalar_div_cost<Scalar, packet_traits<Scalar>::HasDiv>::value))
 #else
-    Cost =
-    (sizeof(Scalar) == 4
-     // float: 7 pmadd, 6 pmul, 4 padd/psub, 10 other
-     ? (21 * NumTraits<Scalar>::AddCost + 13 * NumTraits<Scalar>::MulCost)
-     // double: 7 pmadd, 5 pmul, 3 padd/psub, 1 div,  13 other
-     : (23 * NumTraits<Scalar>::AddCost +
-        12 * NumTraits<Scalar>::MulCost +
-        scalar_div_cost<Scalar,packet_traits<Scalar>::HasDiv>::value))
+    Cost = (sizeof(Scalar) == 4
+                // float: 7 pmadd, 6 pmul, 4 padd/psub, 10 other
+                ? (21 * NumTraits<Scalar>::AddCost + 13 * NumTraits<Scalar>::MulCost)
+                // double: 7 pmadd, 5 pmul, 3 padd/psub, 1 div,  13 other
+                : (23 * NumTraits<Scalar>::AddCost + 12 * NumTraits<Scalar>::MulCost +
+                   scalar_div_cost<Scalar, packet_traits<Scalar>::HasDiv>::value))
 #endif
   };
 };
 
 /** \internal
-  *
-  * \brief Template functor to compute the exponential of a scalar - 1.
-  *
-  * \sa class CwiseUnaryOp, ArrayBase::expm1()
-  */
-template<typename Scalar> struct scalar_expm1_op {
-  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::expm1(a); }
+ *
+ * \brief Template functor to compute the exponential of a scalar - 1.
+ *
+ * \sa class CwiseUnaryOp, ArrayBase::expm1()
+ */
+template <typename Scalar>
+struct scalar_expm1_op {
+  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::expm1(a); }
   template <typename Packet>
-  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pexpm1(a); }
+  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
+    return internal::pexpm1(a);
+  }
 };
 template <typename Scalar>
-struct functor_traits<scalar_expm1_op<Scalar> > {
+struct functor_traits<scalar_expm1_op<Scalar>> {
   enum {
     PacketAccess = packet_traits<Scalar>::HasExpm1,
-    Cost = functor_traits<scalar_exp_op<Scalar> >::Cost // TODO measure cost of expm1
+    Cost = functor_traits<scalar_exp_op<Scalar>>::Cost  // TODO measure cost of expm1
   };
 };
 
 /** \internal
-  *
-  * \brief Template functor to compute the logarithm of a scalar
-  *
-  * \sa class CwiseUnaryOp, ArrayBase::log()
-  */
-template<typename Scalar> struct scalar_log_op {
-  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::log(a); }
+ *
+ * \brief Template functor to compute the logarithm of a scalar
+ *
+ * \sa class CwiseUnaryOp, ArrayBase::log()
+ */
+template <typename Scalar>
+struct scalar_log_op {
+  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::log(a); }
   template <typename Packet>
-  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::plog(a); }
+  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
+    return internal::plog(a);
+  }
 };
 template <typename Scalar>
-struct functor_traits<scalar_log_op<Scalar> > {
+struct functor_traits<scalar_log_op<Scalar>> {
   enum {
     PacketAccess = packet_traits<Scalar>::HasLog,
-    Cost =
-    (PacketAccess
-     // The following numbers are based on the AVX implementation.
+    Cost = (PacketAccess
+  // The following numbers are based on the AVX implementation.
 #ifdef EIGEN_VECTORIZE_FMA
-     // 8 pmadd, 6 pmul, 8 padd/psub, 16 other, can issue 2 add/mul/madd per cycle.
-     ? (20 * NumTraits<Scalar>::AddCost + 7 * NumTraits<Scalar>::MulCost)
+                // 8 pmadd, 6 pmul, 8 padd/psub, 16 other, can issue 2 add/mul/madd per cycle.
+                ? (20 * NumTraits<Scalar>::AddCost + 7 * NumTraits<Scalar>::MulCost)
 #else
-     // 8 pmadd, 6 pmul, 8 padd/psub, 20 other
-     ? (36 * NumTraits<Scalar>::AddCost + 14 * NumTraits<Scalar>::MulCost)
+                // 8 pmadd, 6 pmul, 8 padd/psub, 20 other
+                ? (36 * NumTraits<Scalar>::AddCost + 14 * NumTraits<Scalar>::MulCost)
 #endif
-     // Measured cost of std::log.
-     : sizeof(Scalar)==4 ? 40 : 85)
+                // Measured cost of std::log.
+                : sizeof(Scalar) == 4 ? 40 : 85)
   };
 };
 
 /** \internal
-  *
-  * \brief Template functor to compute the logarithm of 1 plus a scalar value
-  *
-  * \sa class CwiseUnaryOp, ArrayBase::log1p()
-  */
-template<typename Scalar> struct scalar_log1p_op {
-  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::log1p(a); }
+ *
+ * \brief Template functor to compute the logarithm of 1 plus a scalar value
+ *
+ * \sa class CwiseUnaryOp, ArrayBase::log1p()
+ */
+template <typename Scalar>
+struct scalar_log1p_op {
+  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::log1p(a); }
   template <typename Packet>
-  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::plog1p(a); }
+  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
+    return internal::plog1p(a);
+  }
 };
 template <typename Scalar>
-struct functor_traits<scalar_log1p_op<Scalar> > {
+struct functor_traits<scalar_log1p_op<Scalar>> {
   enum {
     PacketAccess = packet_traits<Scalar>::HasLog1p,
-    Cost = functor_traits<scalar_log_op<Scalar> >::Cost // TODO measure cost of log1p
+    Cost = functor_traits<scalar_log_op<Scalar>>::Cost  // TODO measure cost of log1p
   };
 };
 
 /** \internal
-  *
-  * \brief Template functor to compute the base-10 logarithm of a scalar
-  *
-  * \sa class CwiseUnaryOp, Cwise::log10()
-  */
-template<typename Scalar> struct scalar_log10_op {
-  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { EIGEN_USING_STD(log10) return log10(a); }
+ *
+ * \brief Template functor to compute the base-10 logarithm of a scalar
+ *
+ * \sa class CwiseUnaryOp, Cwise::log10()
+ */
+template <typename Scalar>
+struct scalar_log10_op {
+  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { EIGEN_USING_STD(log10) return log10(a); }
   template <typename Packet>
-  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::plog10(a); }
-};
-template<typename Scalar>
-struct functor_traits<scalar_log10_op<Scalar> >
-{ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog10 }; };
-
-/** \internal
-  *
-  * \brief Template functor to compute the base-2 logarithm of a scalar
-  *
-  * \sa class CwiseUnaryOp, Cwise::log2()
-  */
-template<typename Scalar> struct scalar_log2_op {
-  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return Scalar(EIGEN_LOG2E) * numext::log(a); }
-  template <typename Packet>
-  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::plog2(a); }
-};
-template<typename Scalar>
-struct functor_traits<scalar_log2_op<Scalar> >
-{ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog }; };
-
-/** \internal
-  * \brief Template functor to compute the square root of a scalar
-  * \sa class CwiseUnaryOp, Cwise::sqrt()
-  */
-template<typename Scalar> struct scalar_sqrt_op {
-  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::sqrt(a); }
-  template <typename Packet>
-  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psqrt(a); }
+  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
+    return internal::plog10(a);
+  }
 };
 template <typename Scalar>
-struct functor_traits<scalar_sqrt_op<Scalar> > {
+struct functor_traits<scalar_log10_op<Scalar>> {
+  enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog10 };
+};
+
+/** \internal
+ *
+ * \brief Template functor to compute the base-2 logarithm of a scalar
+ *
+ * \sa class CwiseUnaryOp, Cwise::log2()
+ */
+template <typename Scalar>
+struct scalar_log2_op {
+  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const {
+    return Scalar(EIGEN_LOG2E) * numext::log(a);
+  }
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
+    return internal::plog2(a);
+  }
+};
+template <typename Scalar>
+struct functor_traits<scalar_log2_op<Scalar>> {
+  enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog };
+};
+
+/** \internal
+ * \brief Template functor to compute the square root of a scalar
+ * \sa class CwiseUnaryOp, Cwise::sqrt()
+ */
+template <typename Scalar>
+struct scalar_sqrt_op {
+  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::sqrt(a); }
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
+    return internal::psqrt(a);
+  }
+};
+template <typename Scalar>
+struct functor_traits<scalar_sqrt_op<Scalar>> {
   enum {
 #if EIGEN_FAST_MATH
     // The following numbers are based on the AVX implementation.
     Cost = (sizeof(Scalar) == 8 ? 28
                                 // 4 pmul, 1 pmadd, 3 other
-                                : (3 * NumTraits<Scalar>::AddCost +
-                                   5 * NumTraits<Scalar>::MulCost)),
+                                : (3 * NumTraits<Scalar>::AddCost + 5 * NumTraits<Scalar>::MulCost)),
 #else
     // The following numbers are based on min VSQRT throughput on Haswell.
     Cost = (sizeof(Scalar) == 8 ? 28 : 14),
@@ -461,367 +495,368 @@
 };
 
 // Boolean specialization to eliminate -Wimplicit-conversion-floating-point-to-bool warnings.
-template<> struct scalar_sqrt_op<bool> {
-  EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator() (const bool& a) const { return a; }
+template <>
+struct scalar_sqrt_op<bool> {
+  EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator()(const bool& a) const { return a; }
   template <typename Packet>
-  EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return a; }
+  EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
+    return a;
+  }
 };
 template <>
-struct functor_traits<scalar_sqrt_op<bool> > {
+struct functor_traits<scalar_sqrt_op<bool>> {
   enum { Cost = 1, PacketAccess = packet_traits<bool>::Vectorizable };
 };
 
 /** \internal
-  * \brief Template functor to compute the cube root of a scalar
-  * \sa class CwiseUnaryOp, Cwise::sqrt()
-  */
+ * \brief Template functor to compute the cube root of a scalar
+ * \sa class CwiseUnaryOp, Cwise::sqrt()
+ */
 template <typename Scalar>
 struct scalar_cbrt_op {
   EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::cbrt(a); }
 };
 
 template <typename Scalar>
-struct functor_traits<scalar_cbrt_op<Scalar> > {
+struct functor_traits<scalar_cbrt_op<Scalar>> {
   enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false };
 };
 
 /** \internal
-  * \brief Template functor to compute the reciprocal square root of a scalar
-  * \sa class CwiseUnaryOp, Cwise::rsqrt()
-  */
-template<typename Scalar> struct scalar_rsqrt_op {
-  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::rsqrt(a); }
+ * \brief Template functor to compute the reciprocal square root of a scalar
+ * \sa class CwiseUnaryOp, Cwise::rsqrt()
+ */
+template <typename Scalar>
+struct scalar_rsqrt_op {
+  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::rsqrt(a); }
   template <typename Packet>
-  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::prsqrt(a); }
+  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
+    return internal::prsqrt(a);
+  }
 };
 
-template<typename Scalar>
-struct functor_traits<scalar_rsqrt_op<Scalar> >
-{ enum {
-    Cost = 5 * NumTraits<Scalar>::MulCost,
-    PacketAccess = packet_traits<Scalar>::HasRsqrt
-  };
+template <typename Scalar>
+struct functor_traits<scalar_rsqrt_op<Scalar>> {
+  enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasRsqrt };
 };
 
 /** \internal
-  * \brief Template functor to compute the cosine of a scalar
-  * \sa class CwiseUnaryOp, ArrayBase::cos()
-  */
-template<typename Scalar> struct scalar_cos_op {
-  EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a) const { return numext::cos(a); }
+ * \brief Template functor to compute the cosine of a scalar
+ * \sa class CwiseUnaryOp, ArrayBase::cos()
+ */
+template <typename Scalar>
+struct scalar_cos_op {
+  EIGEN_DEVICE_FUNC inline Scalar operator()(const Scalar& a) const { return numext::cos(a); }
   template <typename Packet>
-  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pcos(a); }
+  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
+    return internal::pcos(a);
+  }
 };
-template<typename Scalar>
-struct functor_traits<scalar_cos_op<Scalar> >
-{
-  enum {
-    Cost = 5 * NumTraits<Scalar>::MulCost,
-    PacketAccess = packet_traits<Scalar>::HasCos
-  };
+template <typename Scalar>
+struct functor_traits<scalar_cos_op<Scalar>> {
+  enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasCos };
 };
 
 /** \internal
-  * \brief Template functor to compute the sine of a scalar
-  * \sa class CwiseUnaryOp, ArrayBase::sin()
-  */
-template<typename Scalar> struct scalar_sin_op {
-  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::sin(a); }
+ * \brief Template functor to compute the sine of a scalar
+ * \sa class CwiseUnaryOp, ArrayBase::sin()
+ */
+template <typename Scalar>
+struct scalar_sin_op {
+  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::sin(a); }
   template <typename Packet>
-  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psin(a); }
+  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
+    return internal::psin(a);
+  }
 };
-template<typename Scalar>
-struct functor_traits<scalar_sin_op<Scalar> >
-{
-  enum {
-    Cost = 5 * NumTraits<Scalar>::MulCost,
-    PacketAccess = packet_traits<Scalar>::HasSin
-  };
-};
-
-
-/** \internal
-  * \brief Template functor to compute the tan of a scalar
-  * \sa class CwiseUnaryOp, ArrayBase::tan()
-  */
-template<typename Scalar> struct scalar_tan_op {
-  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::tan(a); }
-  template <typename Packet>
-  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::ptan(a); }
-};
-template<typename Scalar>
-struct functor_traits<scalar_tan_op<Scalar> >
-{
-  enum {
-    Cost = 5 * NumTraits<Scalar>::MulCost,
-    PacketAccess = packet_traits<Scalar>::HasTan
-  };
+template <typename Scalar>
+struct functor_traits<scalar_sin_op<Scalar>> {
+  enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasSin };
 };
 
 /** \internal
-  * \brief Template functor to compute the arc cosine of a scalar
-  * \sa class CwiseUnaryOp, ArrayBase::acos()
-  */
-template<typename Scalar> struct scalar_acos_op {
-  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::acos(a); }
+ * \brief Template functor to compute the tan of a scalar
+ * \sa class CwiseUnaryOp, ArrayBase::tan()
+ */
+template <typename Scalar>
+struct scalar_tan_op {
+  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::tan(a); }
   template <typename Packet>
-  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pacos(a); }
+  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
+    return internal::ptan(a);
+  }
 };
-template<typename Scalar>
-struct functor_traits<scalar_acos_op<Scalar> >
-{
-  enum {
-    Cost = 5 * NumTraits<Scalar>::MulCost,
-    PacketAccess = packet_traits<Scalar>::HasACos
-  };
+template <typename Scalar>
+struct functor_traits<scalar_tan_op<Scalar>> {
+  enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasTan };
 };
 
 /** \internal
-  * \brief Template functor to compute the arc sine of a scalar
-  * \sa class CwiseUnaryOp, ArrayBase::asin()
-  */
-template<typename Scalar> struct scalar_asin_op {
-  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::asin(a); }
+ * \brief Template functor to compute the arc cosine of a scalar
+ * \sa class CwiseUnaryOp, ArrayBase::acos()
+ */
+template <typename Scalar>
+struct scalar_acos_op {
+  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::acos(a); }
   template <typename Packet>
-  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pasin(a); }
+  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
+    return internal::pacos(a);
+  }
 };
-template<typename Scalar>
-struct functor_traits<scalar_asin_op<Scalar> >
-{
-  enum {
-    Cost = 5 * NumTraits<Scalar>::MulCost,
-    PacketAccess = packet_traits<Scalar>::HasASin
-  };
-};
-
-
-/** \internal
-  * \brief Template functor to compute the atan of a scalar
-  * \sa class CwiseUnaryOp, ArrayBase::atan()
-  */
-template<typename Scalar> struct scalar_atan_op {
-  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::atan(a); }
-  template <typename Packet>
-  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::patan(a); }
-};
-template<typename Scalar>
-struct functor_traits<scalar_atan_op<Scalar> >
-{
-  enum {
-    Cost = 5 * NumTraits<Scalar>::MulCost,
-    PacketAccess = packet_traits<Scalar>::HasATan
-  };
+template <typename Scalar>
+struct functor_traits<scalar_acos_op<Scalar>> {
+  enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasACos };
 };
 
 /** \internal
-  * \brief Template functor to compute the tanh of a scalar
-  * \sa class CwiseUnaryOp, ArrayBase::tanh()
-  */
+ * \brief Template functor to compute the arc sine of a scalar
+ * \sa class CwiseUnaryOp, ArrayBase::asin()
+ */
+template <typename Scalar>
+struct scalar_asin_op {
+  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::asin(a); }
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
+    return internal::pasin(a);
+  }
+};
+template <typename Scalar>
+struct functor_traits<scalar_asin_op<Scalar>> {
+  enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasASin };
+};
+
+/** \internal
+ * \brief Template functor to compute the atan of a scalar
+ * \sa class CwiseUnaryOp, ArrayBase::atan()
+ */
+template <typename Scalar>
+struct scalar_atan_op {
+  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::atan(a); }
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
+    return internal::patan(a);
+  }
+};
+template <typename Scalar>
+struct functor_traits<scalar_atan_op<Scalar>> {
+  enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasATan };
+};
+
+/** \internal
+ * \brief Template functor to compute the tanh of a scalar
+ * \sa class CwiseUnaryOp, ArrayBase::tanh()
+ */
 template <typename Scalar>
 struct scalar_tanh_op {
   EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::tanh(a); }
   template <typename Packet>
-  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& x) const { return ptanh(x); }
+  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& x) const {
+    return ptanh(x);
+  }
 };
 
 template <typename Scalar>
-struct functor_traits<scalar_tanh_op<Scalar> > {
+struct functor_traits<scalar_tanh_op<Scalar>> {
   enum {
     PacketAccess = packet_traits<Scalar>::HasTanh,
-    Cost = ( (EIGEN_FAST_MATH && is_same<Scalar,float>::value)
+    Cost = ((EIGEN_FAST_MATH && is_same<Scalar, float>::value)
 // The following numbers are based on the AVX implementation,
 #ifdef EIGEN_VECTORIZE_FMA
                 // Haswell can issue 2 add/mul/madd per cycle.
                 // 9 pmadd, 2 pmul, 1 div, 2 other
-                ? (2 * NumTraits<Scalar>::AddCost +
-                   6 * NumTraits<Scalar>::MulCost +
-                   scalar_div_cost<Scalar,packet_traits<Scalar>::HasDiv>::value)
+                ? (2 * NumTraits<Scalar>::AddCost + 6 * NumTraits<Scalar>::MulCost +
+                   scalar_div_cost<Scalar, packet_traits<Scalar>::HasDiv>::value)
 #else
-                ? (11 * NumTraits<Scalar>::AddCost +
-                   11 * NumTraits<Scalar>::MulCost +
-                   scalar_div_cost<Scalar,packet_traits<Scalar>::HasDiv>::value)
+                ? (11 * NumTraits<Scalar>::AddCost + 11 * NumTraits<Scalar>::MulCost +
+                   scalar_div_cost<Scalar, packet_traits<Scalar>::HasDiv>::value)
 #endif
                 // This number assumes a naive implementation of tanh
-                : (6 * NumTraits<Scalar>::AddCost +
-                   3 * NumTraits<Scalar>::MulCost +
-                   2 * scalar_div_cost<Scalar,packet_traits<Scalar>::HasDiv>::value +
-                   functor_traits<scalar_exp_op<Scalar> >::Cost))
+                : (6 * NumTraits<Scalar>::AddCost + 3 * NumTraits<Scalar>::MulCost +
+                   2 * scalar_div_cost<Scalar, packet_traits<Scalar>::HasDiv>::value +
+                   functor_traits<scalar_exp_op<Scalar>>::Cost))
   };
 };
 
 /** \internal
-  * \brief Template functor to compute the atanh of a scalar
-  * \sa class CwiseUnaryOp, ArrayBase::atanh()
-  */
+ * \brief Template functor to compute the atanh of a scalar
+ * \sa class CwiseUnaryOp, ArrayBase::atanh()
+ */
 template <typename Scalar>
 struct scalar_atanh_op {
   EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::atanh(a); }
   template <typename Packet>
-  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& x) const { return patanh(x); }
+  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& x) const {
+    return patanh(x);
+  }
 };
 
 template <typename Scalar>
-struct functor_traits<scalar_atanh_op<Scalar> > {
-  enum {
-    Cost = 5 * NumTraits<Scalar>::MulCost,
-    PacketAccess = packet_traits<Scalar>::HasATanh
-  };
+struct functor_traits<scalar_atanh_op<Scalar>> {
+  enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasATanh };
 };
 
 /** \internal
-  * \brief Template functor to compute the sinh of a scalar
-  * \sa class CwiseUnaryOp, ArrayBase::sinh()
-  */
-template<typename Scalar> struct scalar_sinh_op {
-  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::sinh(a); }
+ * \brief Template functor to compute the sinh of a scalar
+ * \sa class CwiseUnaryOp, ArrayBase::sinh()
+ */
+template <typename Scalar>
+struct scalar_sinh_op {
+  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::sinh(a); }
   template <typename Packet>
-  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psinh(a); }
+  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
+    return internal::psinh(a);
+  }
 };
-template<typename Scalar>
-struct functor_traits<scalar_sinh_op<Scalar> >
-{
-  enum {
-    Cost = 5 * NumTraits<Scalar>::MulCost,
-    PacketAccess = packet_traits<Scalar>::HasSinh
-  };
+template <typename Scalar>
+struct functor_traits<scalar_sinh_op<Scalar>> {
+  enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasSinh };
 };
 
 /** \internal
-  * \brief Template functor to compute the asinh of a scalar
-  * \sa class CwiseUnaryOp, ArrayBase::asinh()
-  */
+ * \brief Template functor to compute the asinh of a scalar
+ * \sa class CwiseUnaryOp, ArrayBase::asinh()
+ */
 template <typename Scalar>
 struct scalar_asinh_op {
   EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::asinh(a); }
 };
 
 template <typename Scalar>
-struct functor_traits<scalar_asinh_op<Scalar> > {
+struct functor_traits<scalar_asinh_op<Scalar>> {
   enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false };
 };
 
 /** \internal
-  * \brief Template functor to compute the cosh of a scalar
-  * \sa class CwiseUnaryOp, ArrayBase::cosh()
-  */
-template<typename Scalar> struct scalar_cosh_op {
-  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::cosh(a); }
+ * \brief Template functor to compute the cosh of a scalar
+ * \sa class CwiseUnaryOp, ArrayBase::cosh()
+ */
+template <typename Scalar>
+struct scalar_cosh_op {
+  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::cosh(a); }
   template <typename Packet>
-  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pcosh(a); }
+  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
+    return internal::pcosh(a);
+  }
 };
-template<typename Scalar>
-struct functor_traits<scalar_cosh_op<Scalar> >
-{
-  enum {
-    Cost = 5 * NumTraits<Scalar>::MulCost,
-    PacketAccess = packet_traits<Scalar>::HasCosh
-  };
+template <typename Scalar>
+struct functor_traits<scalar_cosh_op<Scalar>> {
+  enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasCosh };
 };
 
 /** \internal
-  * \brief Template functor to compute the acosh of a scalar
-  * \sa class CwiseUnaryOp, ArrayBase::acosh()
-  */
+ * \brief Template functor to compute the acosh of a scalar
+ * \sa class CwiseUnaryOp, ArrayBase::acosh()
+ */
 template <typename Scalar>
 struct scalar_acosh_op {
   EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::acosh(a); }
 };
 
 template <typename Scalar>
-struct functor_traits<scalar_acosh_op<Scalar> > {
+struct functor_traits<scalar_acosh_op<Scalar>> {
   enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false };
 };
 
 /** \internal
-  * \brief Template functor to compute the inverse of a scalar
-  * \sa class CwiseUnaryOp, Cwise::inverse()
-  */
-template<typename Scalar>
+ * \brief Template functor to compute the inverse of a scalar
+ * \sa class CwiseUnaryOp, Cwise::inverse()
+ */
+template <typename Scalar>
 struct scalar_inverse_op {
-  EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a) const { return Scalar(1)/a; }
-  template<typename Packet>
-  EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const
-  { return internal::preciprocal(a); }
+  EIGEN_DEVICE_FUNC inline Scalar operator()(const Scalar& a) const { return Scalar(1) / a; }
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const {
+    return internal::preciprocal(a);
+  }
 };
 template <typename Scalar>
-struct functor_traits<scalar_inverse_op<Scalar> > {
+struct functor_traits<scalar_inverse_op<Scalar>> {
   enum {
     PacketAccess = packet_traits<Scalar>::HasDiv,
     // If packet_traits<Scalar>::HasReciprocal then the Estimated cost is that
     // of computing an approximation plus a single Newton-Raphson step, which
     // consists of 1 pmul + 1 pmadd.
-    Cost = (packet_traits<Scalar>::HasReciprocal
-                ? 4 * NumTraits<Scalar>::MulCost
-                : scalar_div_cost<Scalar, PacketAccess>::value)
+    Cost = (packet_traits<Scalar>::HasReciprocal ? 4 * NumTraits<Scalar>::MulCost
+                                                 : scalar_div_cost<Scalar, PacketAccess>::value)
   };
 };
 
 /** \internal
-  * \brief Template functor to compute the square of a scalar
-  * \sa class CwiseUnaryOp, Cwise::square()
-  */
-template<typename Scalar>
+ * \brief Template functor to compute the square of a scalar
+ * \sa class CwiseUnaryOp, Cwise::square()
+ */
+template <typename Scalar>
 struct scalar_square_op {
-  EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a) const { return a*a; }
-  template<typename Packet>
-  EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const
-  { return internal::pmul(a,a); }
-};
-template<typename Scalar>
-struct functor_traits<scalar_square_op<Scalar> >
-{ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };
-
-// Boolean specialization to avoid -Wint-in-bool-context warnings on GCC.
-template<>
-struct scalar_square_op<bool> {
-  EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator() (const bool& a) const { return a; }
-  template<typename Packet>
-  EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const
-  { return a; }
-};
-template<>
-struct functor_traits<scalar_square_op<bool> >
-{ enum { Cost = 0, PacketAccess = packet_traits<bool>::Vectorizable }; };
-
-/** \internal
-  * \brief Template functor to compute the cube of a scalar
-  * \sa class CwiseUnaryOp, Cwise::cube()
-  */
-template<typename Scalar>
-struct scalar_cube_op {
-  EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a) const { return a*a*a; }
-  template<typename Packet>
-  EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const
-  { return internal::pmul(a,pmul(a,a)); }
-};
-template<typename Scalar>
-struct functor_traits<scalar_cube_op<Scalar> >
-{ enum { Cost = 2*NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };
-
-// Boolean specialization to avoid -Wint-in-bool-context warnings on GCC.
-template<>
-struct scalar_cube_op<bool> {
-  EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator() (const bool& a) const { return a; }
-  template<typename Packet>
-  EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const
-  { return a; }
-};
-template<>
-struct functor_traits<scalar_cube_op<bool> >
-{ enum { Cost = 0, PacketAccess = packet_traits<bool>::Vectorizable }; };
-
-/** \internal
-  * \brief Template functor to compute the rounded value of a scalar
-  * \sa class CwiseUnaryOp, ArrayBase::round()
-  */
-template<typename Scalar> struct scalar_round_op {
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return numext::round(a); }
+  EIGEN_DEVICE_FUNC inline Scalar operator()(const Scalar& a) const { return a * a; }
   template <typename Packet>
-  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pround(a); }
+  EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const {
+    return internal::pmul(a, a);
+  }
 };
-template<typename Scalar>
-struct functor_traits<scalar_round_op<Scalar> >
-{
+template <typename Scalar>
+struct functor_traits<scalar_square_op<Scalar>> {
+  enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul };
+};
+
+// Boolean specialization to avoid -Wint-in-bool-context warnings on GCC.
+template <>
+struct scalar_square_op<bool> {
+  EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator()(const bool& a) const { return a; }
+  template <typename Packet>
+  EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const {
+    return a;
+  }
+};
+template <>
+struct functor_traits<scalar_square_op<bool>> {
+  enum { Cost = 0, PacketAccess = packet_traits<bool>::Vectorizable };
+};
+
+/** \internal
+ * \brief Template functor to compute the cube of a scalar
+ * \sa class CwiseUnaryOp, Cwise::cube()
+ */
+template <typename Scalar>
+struct scalar_cube_op {
+  EIGEN_DEVICE_FUNC inline Scalar operator()(const Scalar& a) const { return a * a * a; }
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const {
+    return internal::pmul(a, pmul(a, a));
+  }
+};
+template <typename Scalar>
+struct functor_traits<scalar_cube_op<Scalar>> {
+  enum { Cost = 2 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul };
+};
+
+// Boolean specialization to avoid -Wint-in-bool-context warnings on GCC.
+template <>
+struct scalar_cube_op<bool> {
+  EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator()(const bool& a) const { return a; }
+  template <typename Packet>
+  EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const {
+    return a;
+  }
+};
+template <>
+struct functor_traits<scalar_cube_op<bool>> {
+  enum { Cost = 0, PacketAccess = packet_traits<bool>::Vectorizable };
+};
+
+/** \internal
+ * \brief Template functor to compute the rounded value of a scalar
+ * \sa class CwiseUnaryOp, ArrayBase::round()
+ */
+template <typename Scalar>
+struct scalar_round_op {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const { return numext::round(a); }
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
+    return internal::pround(a);
+  }
+};
+template <typename Scalar>
+struct functor_traits<scalar_round_op<Scalar>> {
   enum {
     Cost = NumTraits<Scalar>::MulCost,
     PacketAccess = packet_traits<Scalar>::HasRound || NumTraits<Scalar>::IsInteger
@@ -829,17 +864,19 @@
 };
 
 /** \internal
-  * \brief Template functor to compute the floor of a scalar
-  * \sa class CwiseUnaryOp, ArrayBase::floor()
-  */
-template<typename Scalar> struct scalar_floor_op {
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return numext::floor(a); }
+ * \brief Template functor to compute the floor of a scalar
+ * \sa class CwiseUnaryOp, ArrayBase::floor()
+ */
+template <typename Scalar>
+struct scalar_floor_op {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const { return numext::floor(a); }
   template <typename Packet>
-  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pfloor(a); }
+  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
+    return internal::pfloor(a);
+  }
 };
-template<typename Scalar>
-struct functor_traits<scalar_floor_op<Scalar> >
-{
+template <typename Scalar>
+struct functor_traits<scalar_floor_op<Scalar>> {
   enum {
     Cost = NumTraits<Scalar>::MulCost,
     PacketAccess = packet_traits<Scalar>::HasFloor || NumTraits<Scalar>::IsInteger
@@ -847,17 +884,19 @@
 };
 
 /** \internal
-  * \brief Template functor to compute the rounded (with current rounding mode)  value of a scalar
-  * \sa class CwiseUnaryOp, ArrayBase::rint()
-  */
-template<typename Scalar> struct scalar_rint_op {
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return numext::rint(a); }
+ * \brief Template functor to compute the rounded (with current rounding mode)  value of a scalar
+ * \sa class CwiseUnaryOp, ArrayBase::rint()
+ */
+template <typename Scalar>
+struct scalar_rint_op {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const { return numext::rint(a); }
   template <typename Packet>
-  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::print(a); }
+  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
+    return internal::print(a);
+  }
 };
-template<typename Scalar>
-struct functor_traits<scalar_rint_op<Scalar> >
-{
+template <typename Scalar>
+struct functor_traits<scalar_rint_op<Scalar>> {
   enum {
     Cost = NumTraits<Scalar>::MulCost,
     PacketAccess = packet_traits<Scalar>::HasRint || NumTraits<Scalar>::IsInteger
@@ -865,17 +904,19 @@
 };
 
 /** \internal
-  * \brief Template functor to compute the ceil of a scalar
-  * \sa class CwiseUnaryOp, ArrayBase::ceil()
-  */
-template<typename Scalar> struct scalar_ceil_op {
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return numext::ceil(a); }
+ * \brief Template functor to compute the ceil of a scalar
+ * \sa class CwiseUnaryOp, ArrayBase::ceil()
+ */
+template <typename Scalar>
+struct scalar_ceil_op {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const { return numext::ceil(a); }
   template <typename Packet>
-  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pceil(a); }
+  EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
+    return internal::pceil(a);
+  }
 };
-template<typename Scalar>
-struct functor_traits<scalar_ceil_op<Scalar> >
-{
+template <typename Scalar>
+struct functor_traits<scalar_ceil_op<Scalar>> {
   enum {
     Cost = NumTraits<Scalar>::MulCost,
     PacketAccess = packet_traits<Scalar>::HasCeil || NumTraits<Scalar>::IsInteger
@@ -883,28 +924,27 @@
 };
 
 /** \internal
-  * \brief Template functor to compute whether a scalar is NaN
-  * \sa class CwiseUnaryOp, ArrayBase::isnan()
-  */
-template<typename Scalar, bool UseTypedPredicate=false>
+ * \brief Template functor to compute whether a scalar is NaN
+ * \sa class CwiseUnaryOp, ArrayBase::isnan()
+ */
+template <typename Scalar, bool UseTypedPredicate = false>
 struct scalar_isnan_op {
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator() (const Scalar& a) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const Scalar& a) const {
 #if defined(SYCL_DEVICE_ONLY)
     return numext::isnan(a);
 #else
-    return numext::isnan EIGEN_NOT_A_MACRO (a);
+    return numext::isnan EIGEN_NOT_A_MACRO(a);
 #endif
   }
 };
 
-
-template<typename Scalar>
+template <typename Scalar>
 struct scalar_isnan_op<Scalar, true> {
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator() (const Scalar& a) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a) const {
 #if defined(SYCL_DEVICE_ONLY)
     return (numext::isnan(a) ? ptrue(a) : pzero(a));
 #else
-    return (numext::isnan EIGEN_NOT_A_MACRO (a)  ? ptrue(a) : pzero(a));
+    return (numext::isnan EIGEN_NOT_A_MACRO(a) ? ptrue(a) : pzero(a));
 #endif
   }
   template <typename Packet>
@@ -913,22 +953,19 @@
   }
 };
 
-template<typename Scalar, bool UseTypedPredicate>
-struct functor_traits<scalar_isnan_op<Scalar, UseTypedPredicate> >
-{
-  enum {
-    Cost = NumTraits<Scalar>::MulCost,
-    PacketAccess = packet_traits<Scalar>::HasCmp && UseTypedPredicate
-  };
+template <typename Scalar, bool UseTypedPredicate>
+struct functor_traits<scalar_isnan_op<Scalar, UseTypedPredicate>> {
+  enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasCmp && UseTypedPredicate };
 };
 
 /** \internal
-  * \brief Template functor to check whether a scalar is +/-inf
-  * \sa class CwiseUnaryOp, ArrayBase::isinf()
-  */
-template<typename Scalar> struct scalar_isinf_op {
+ * \brief Template functor to check whether a scalar is +/-inf
+ * \sa class CwiseUnaryOp, ArrayBase::isinf()
+ */
+template <typename Scalar>
+struct scalar_isinf_op {
   typedef bool result_type;
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const Scalar& a) const {
 #if defined(SYCL_DEVICE_ONLY)
     return numext::isinf(a);
 #else
@@ -936,22 +973,19 @@
 #endif
   }
 };
-template<typename Scalar>
-struct functor_traits<scalar_isinf_op<Scalar> >
-{
-  enum {
-    Cost = NumTraits<Scalar>::MulCost,
-    PacketAccess = false
-  };
+template <typename Scalar>
+struct functor_traits<scalar_isinf_op<Scalar>> {
+  enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = false };
 };
 
 /** \internal
-  * \brief Template functor to check whether a scalar has a finite value
-  * \sa class CwiseUnaryOp, ArrayBase::isfinite()
-  */
-template<typename Scalar> struct scalar_isfinite_op {
+ * \brief Template functor to check whether a scalar has a finite value
+ * \sa class CwiseUnaryOp, ArrayBase::isfinite()
+ */
+template <typename Scalar>
+struct scalar_isfinite_op {
   typedef bool result_type;
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const Scalar& a) const {
 #if defined(SYCL_DEVICE_ONLY)
     return numext::isfinite(a);
 #else
@@ -959,20 +993,16 @@
 #endif
   }
 };
-template<typename Scalar>
-struct functor_traits<scalar_isfinite_op<Scalar> >
-{
-  enum {
-    Cost = NumTraits<Scalar>::MulCost,
-    PacketAccess = false
-  };
+template <typename Scalar>
+struct functor_traits<scalar_isfinite_op<Scalar>> {
+  enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = false };
 };
 
 /** \internal
-  * \brief Template functor to compute the logical not of a scalar as if it were a boolean
-  *
-  * \sa class CwiseUnaryOp, ArrayBase::operator!
-  */
+ * \brief Template functor to compute the logical not of a scalar as if it were a boolean
+ *
+ * \sa class CwiseUnaryOp, ArrayBase::operator!
+ */
 template <typename Scalar>
 struct scalar_boolean_not_op {
   using result_type = Scalar;
@@ -1015,13 +1045,14 @@
 };
 
 /** \internal
-  * \brief Template functor to compute the bitwise not of a scalar
-  *
-  * \sa class CwiseUnaryOp, ArrayBase::operator~
+ * \brief Template functor to compute the bitwise not of a scalar
+ *
+ * \sa class CwiseUnaryOp, ArrayBase::operator~
  */
 template <typename Scalar>
 struct scalar_bitwise_not_op {
-  EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::RequireInitialization, BITWISE OPERATIONS MAY ONLY BE PERFORMED ON PLAIN DATA TYPES)
+  EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::RequireInitialization,
+                      BITWISE OPERATIONS MAY ONLY BE PERFORMED ON PLAIN DATA TYPES)
   EIGEN_STATIC_ASSERT((!internal::is_same<Scalar, bool>::value), DONT USE BITWISE OPS ON BOOLEAN TYPES)
   using result_type = Scalar;
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a) const {
@@ -1038,15 +1069,12 @@
 };
 
 /** \internal
-  * \brief Template functor to compute the signum of a scalar
-  * \sa class CwiseUnaryOp, Cwise::sign()
-  */
-template<typename Scalar>
+ * \brief Template functor to compute the signum of a scalar
+ * \sa class CwiseUnaryOp, Cwise::sign()
+ */
+template <typename Scalar>
 struct scalar_sign_op {
-  EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const
-  {
-    return numext::sign(a);
-  }
+  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::sign(a); }
 
   template <typename Packet>
   EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
@@ -1054,29 +1082,25 @@
   }
 };
 
-template<typename Scalar>
-struct functor_traits<scalar_sign_op<Scalar> >
-{ enum {
-    Cost =
-        NumTraits<Scalar>::IsComplex
-        ? ( 8*NumTraits<Scalar>::MulCost  ) // roughly
-        : ( 3*NumTraits<Scalar>::AddCost),
+template <typename Scalar>
+struct functor_traits<scalar_sign_op<Scalar>> {
+  enum {
+    Cost = NumTraits<Scalar>::IsComplex ? (8 * NumTraits<Scalar>::MulCost)  // roughly
+                                        : (3 * NumTraits<Scalar>::AddCost),
     PacketAccess = packet_traits<Scalar>::HasSign && packet_traits<Scalar>::Vectorizable
   };
 };
 
 /** \internal
-  * \brief Template functor to compute the logistic function of a scalar
-  * \sa class CwiseUnaryOp, ArrayBase::logistic()
-  */
+ * \brief Template functor to compute the logistic function of a scalar
+ * \sa class CwiseUnaryOp, ArrayBase::logistic()
+ */
 template <typename T>
 struct scalar_logistic_op {
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T operator()(const T& x) const {
-    return packetOp(x);
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T operator()(const T& x) const { return packetOp(x); }
 
-  template <typename Packet> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Packet packetOp(const Packet& x) const {
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const {
     const Packet one = pset1<Packet>(T(1));
     const Packet inf = pset1<Packet>(NumTraits<T>::infinity());
     const Packet e = pexp(x);
@@ -1090,20 +1114,20 @@
 #ifdef EIGEN_GPU_CC
 
 /** \internal
-  * \brief Template specialization of the logistic function for float.
-  * Computes S(x) = exp(x) / (1 + exp(x)), where exp(x) is implemented
-  * using an algorithm partly adopted from the implementation of
-  * pexp_float. See the individual steps described in the code below.
-  * Note that compared to pexp, we use an additional outer multiplicative
-  * range reduction step using the identity exp(x) = exp(x/2)^2.
-  * This prevert us from having to call ldexp on values that could produce
-  * a denormal result, which allows us to call the faster implementation in
-  * pldexp_fast_impl<Packet>::run(p, m).
-  * The final squaring, however, doubles the error bound on the final
-  * approximation. Exhaustive testing shows that we have a worst case error
-  * of 4.5 ulps (compared to computing S(x) in double precision), which is
-  * acceptable.
-  */
+ * \brief Template specialization of the logistic function for float.
+ * Computes S(x) = exp(x) / (1 + exp(x)), where exp(x) is implemented
+ * using an algorithm partly adopted from the implementation of
+ * pexp_float. See the individual steps described in the code below.
+ * Note that compared to pexp, we use an additional outer multiplicative
+ * range reduction step using the identity exp(x) = exp(x/2)^2.
+ * This prevert us from having to call ldexp on values that could produce
+ * a denormal result, which allows us to call the faster implementation in
+ * pldexp_fast_impl<Packet>::run(p, m).
+ * The final squaring, however, doubles the error bound on the final
+ * approximation. Exhaustive testing shows that we have a worst case error
+ * of 4.5 ulps (compared to computing S(x) in double precision), which is
+ * acceptable.
+ */
 template <>
 struct scalar_logistic_op<float> {
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(const float& x) const {
@@ -1114,8 +1138,7 @@
   }
 
   template <typename Packet>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet
-  packetOp(const Packet& _x) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& _x) const {
     const Packet cst_zero = pset1<Packet>(0.0f);
     const Packet cst_one = pset1<Packet>(1.0f);
     const Packet cst_half = pset1<Packet>(0.5f);
@@ -1175,35 +1198,30 @@
 };
 #endif  // #ifndef EIGEN_GPU_COMPILE_PHASE
 
-
 template <typename T>
-struct functor_traits<scalar_logistic_op<T> > {
+struct functor_traits<scalar_logistic_op<T>> {
   enum {
     // The cost estimate for float here here is for the common(?) case where
     // all arguments are greater than -9.
     Cost = scalar_div_cost<T, packet_traits<T>::HasDiv>::value +
-           (internal::is_same<T, float>::value
-                ? NumTraits<T>::AddCost * 15 + NumTraits<T>::MulCost * 11
-                : NumTraits<T>::AddCost * 2 +
-                      functor_traits<scalar_exp_op<T> >::Cost),
-    PacketAccess =
-        packet_traits<T>::HasAdd && packet_traits<T>::HasDiv &&
-        (internal::is_same<T, float>::value
-             ? packet_traits<T>::HasMul && packet_traits<T>::HasMax &&
-                   packet_traits<T>::HasMin
-             : packet_traits<T>::HasNegate && packet_traits<T>::HasExp)
+           (internal::is_same<T, float>::value ? NumTraits<T>::AddCost * 15 + NumTraits<T>::MulCost * 11
+                                               : NumTraits<T>::AddCost * 2 + functor_traits<scalar_exp_op<T>>::Cost),
+    PacketAccess = packet_traits<T>::HasAdd && packet_traits<T>::HasDiv &&
+                   (internal::is_same<T, float>::value
+                        ? packet_traits<T>::HasMul && packet_traits<T>::HasMax && packet_traits<T>::HasMin
+                        : packet_traits<T>::HasNegate && packet_traits<T>::HasExp)
   };
 };
 
-template <typename Scalar, typename ExponentScalar, 
-          bool IsBaseInteger = NumTraits<Scalar>::IsInteger,
+template <typename Scalar, typename ExponentScalar, bool IsBaseInteger = NumTraits<Scalar>::IsInteger,
           bool IsExponentInteger = NumTraits<ExponentScalar>::IsInteger,
           bool IsBaseComplex = NumTraits<Scalar>::IsComplex,
           bool IsExponentComplex = NumTraits<ExponentScalar>::IsComplex>
 struct scalar_unary_pow_op {
   typedef typename internal::promote_scalar_arg<
       Scalar, ExponentScalar,
-      internal::has_ReturnType<ScalarBinaryOpTraits<Scalar,ExponentScalar,scalar_unary_pow_op> >::value>::type PromotedExponent;
+      internal::has_ReturnType<ScalarBinaryOpTraits<Scalar, ExponentScalar, scalar_unary_pow_op>>::value>::type
+      PromotedExponent;
   typedef typename ScalarBinaryOpTraits<Scalar, PromotedExponent, scalar_unary_pow_op>::ReturnType result_type;
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE scalar_unary_pow_op(const ExponentScalar& exponent) : m_exponent(exponent) {}
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const Scalar& a) const {
@@ -1221,15 +1239,14 @@
   return CHAR_BIT * sizeof(T) - NumTraits<T>::digits() - NumTraits<T>::IsSigned;
 }
 
-template<typename From, typename To>
+template <typename From, typename To>
 struct is_floating_exactly_representable {
   // TODO(rmlarsen): Add radix to NumTraits and enable this check.
   // (NumTraits<To>::radix == NumTraits<From>::radix) &&
-  static constexpr bool value = (exponent_digits<To>() >= exponent_digits<From>() &&
-                                  NumTraits<To>::digits() >= NumTraits<From>::digits());
+  static constexpr bool value =
+      (exponent_digits<To>() >= exponent_digits<From>() && NumTraits<To>::digits() >= NumTraits<From>::digits());
 };
 
-
 // Specialization for real, non-integer types, non-complex types.
 template <typename Scalar, typename ExponentScalar>
 struct scalar_unary_pow_op<Scalar, ExponentScalar, false, false, false, false> {
@@ -1240,8 +1257,8 @@
   template <bool IsExactlyRepresentable = is_floating_exactly_representable<ExponentScalar, Scalar>::value>
   EIGEN_DEPRECATED std::enable_if_t<!IsExactlyRepresentable, void> check_is_representable() const {}
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-      scalar_unary_pow_op(const ExponentScalar& exponent) : m_exponent(static_cast<Scalar>(exponent)) {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE scalar_unary_pow_op(const ExponentScalar& exponent)
+      : m_exponent(static_cast<Scalar>(exponent)) {
     check_is_representable();
   }
 
@@ -1280,14 +1297,15 @@
 struct functor_traits<scalar_unary_pow_op<Scalar, ExponentScalar>> {
   enum {
     GenPacketAccess = functor_traits<scalar_pow_op<Scalar, ExponentScalar>>::PacketAccess,
-    IntPacketAccess = !NumTraits<Scalar>::IsComplex && packet_traits<Scalar>::HasMul && (packet_traits<Scalar>::HasDiv || NumTraits<Scalar>::IsInteger) && packet_traits<Scalar>::HasCmp,
+    IntPacketAccess = !NumTraits<Scalar>::IsComplex && packet_traits<Scalar>::HasMul &&
+                      (packet_traits<Scalar>::HasDiv || NumTraits<Scalar>::IsInteger) && packet_traits<Scalar>::HasCmp,
     PacketAccess = NumTraits<ExponentScalar>::IsInteger ? IntPacketAccess : (IntPacketAccess && GenPacketAccess),
     Cost = functor_traits<scalar_pow_op<Scalar, ExponentScalar>>::Cost
   };
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_FUNCTORS_H
+#endif  // EIGEN_FUNCTORS_H
diff --git a/Eigen/src/Core/products/GeneralBlockPanelKernel.h b/Eigen/src/Core/products/GeneralBlockPanelKernel.h
index 0a349b0..647a7dd 100644
--- a/Eigen/src/Core/products/GeneralBlockPanelKernel.h
+++ b/Eigen/src/Core/products/GeneralBlockPanelKernel.h
@@ -10,7 +10,6 @@
 #ifndef EIGEN_GENERAL_BLOCK_PANEL_H
 #define EIGEN_GENERAL_BLOCK_PANEL_H
 
-
 // IWYU pragma: private
 #include "../InternalHeaderCheck.h"
 
@@ -18,57 +17,50 @@
 
 namespace internal {
 
-enum GEBPPacketSizeType {
-  GEBPPacketFull = 0,
-  GEBPPacketHalf,
-  GEBPPacketQuarter
-};
+enum GEBPPacketSizeType { GEBPPacketFull = 0, GEBPPacketHalf, GEBPPacketQuarter };
 
-template<typename LhsScalar_, typename RhsScalar_, bool ConjLhs_=false, bool ConjRhs_=false, int Arch=Architecture::Target, int PacketSize_=GEBPPacketFull>
+template <typename LhsScalar_, typename RhsScalar_, bool ConjLhs_ = false, bool ConjRhs_ = false,
+          int Arch = Architecture::Target, int PacketSize_ = GEBPPacketFull>
 class gebp_traits;
 
-
 /** \internal \returns b if a<=0, and returns a otherwise. */
-inline std::ptrdiff_t manage_caching_sizes_helper(std::ptrdiff_t a, std::ptrdiff_t b)
-{
-  return a<=0 ? b : a;
-}
+inline std::ptrdiff_t manage_caching_sizes_helper(std::ptrdiff_t a, std::ptrdiff_t b) { return a <= 0 ? b : a; }
 
 #if defined(EIGEN_DEFAULT_L1_CACHE_SIZE)
 #define EIGEN_SET_DEFAULT_L1_CACHE_SIZE(val) EIGEN_DEFAULT_L1_CACHE_SIZE
 #else
 #define EIGEN_SET_DEFAULT_L1_CACHE_SIZE(val) val
-#endif // defined(EIGEN_DEFAULT_L1_CACHE_SIZE)
+#endif  // defined(EIGEN_DEFAULT_L1_CACHE_SIZE)
 
 #if defined(EIGEN_DEFAULT_L2_CACHE_SIZE)
 #define EIGEN_SET_DEFAULT_L2_CACHE_SIZE(val) EIGEN_DEFAULT_L2_CACHE_SIZE
 #else
 #define EIGEN_SET_DEFAULT_L2_CACHE_SIZE(val) val
-#endif // defined(EIGEN_DEFAULT_L2_CACHE_SIZE)
+#endif  // defined(EIGEN_DEFAULT_L2_CACHE_SIZE)
 
 #if defined(EIGEN_DEFAULT_L3_CACHE_SIZE)
 #define EIGEN_SET_DEFAULT_L3_CACHE_SIZE(val) EIGEN_DEFAULT_L3_CACHE_SIZE
 #else
 #define EIGEN_SET_DEFAULT_L3_CACHE_SIZE(val) val
-#endif // defined(EIGEN_DEFAULT_L3_CACHE_SIZE)
-  
+#endif  // defined(EIGEN_DEFAULT_L3_CACHE_SIZE)
+
 #if EIGEN_ARCH_i386_OR_x86_64
-const std::ptrdiff_t defaultL1CacheSize = EIGEN_SET_DEFAULT_L1_CACHE_SIZE(32*1024);
-const std::ptrdiff_t defaultL2CacheSize = EIGEN_SET_DEFAULT_L2_CACHE_SIZE(256*1024);
-const std::ptrdiff_t defaultL3CacheSize = EIGEN_SET_DEFAULT_L3_CACHE_SIZE(2*1024*1024);
+const std::ptrdiff_t defaultL1CacheSize = EIGEN_SET_DEFAULT_L1_CACHE_SIZE(32 * 1024);
+const std::ptrdiff_t defaultL2CacheSize = EIGEN_SET_DEFAULT_L2_CACHE_SIZE(256 * 1024);
+const std::ptrdiff_t defaultL3CacheSize = EIGEN_SET_DEFAULT_L3_CACHE_SIZE(2 * 1024 * 1024);
 #elif EIGEN_ARCH_PPC
-const std::ptrdiff_t defaultL1CacheSize = EIGEN_SET_DEFAULT_L1_CACHE_SIZE(64*1024);
+const std::ptrdiff_t defaultL1CacheSize = EIGEN_SET_DEFAULT_L1_CACHE_SIZE(64 * 1024);
 #ifdef _ARCH_PWR10
-const std::ptrdiff_t defaultL2CacheSize = EIGEN_SET_DEFAULT_L2_CACHE_SIZE(2*1024*1024);
-const std::ptrdiff_t defaultL3CacheSize = EIGEN_SET_DEFAULT_L3_CACHE_SIZE(8*1024*1024);
+const std::ptrdiff_t defaultL2CacheSize = EIGEN_SET_DEFAULT_L2_CACHE_SIZE(2 * 1024 * 1024);
+const std::ptrdiff_t defaultL3CacheSize = EIGEN_SET_DEFAULT_L3_CACHE_SIZE(8 * 1024 * 1024);
 #else
-const std::ptrdiff_t defaultL2CacheSize = EIGEN_SET_DEFAULT_L2_CACHE_SIZE(512*1024);
-const std::ptrdiff_t defaultL3CacheSize = EIGEN_SET_DEFAULT_L3_CACHE_SIZE(4*1024*1024);
+const std::ptrdiff_t defaultL2CacheSize = EIGEN_SET_DEFAULT_L2_CACHE_SIZE(512 * 1024);
+const std::ptrdiff_t defaultL3CacheSize = EIGEN_SET_DEFAULT_L3_CACHE_SIZE(4 * 1024 * 1024);
 #endif
 #else
-const std::ptrdiff_t defaultL1CacheSize = EIGEN_SET_DEFAULT_L1_CACHE_SIZE(16*1024);
-const std::ptrdiff_t defaultL2CacheSize = EIGEN_SET_DEFAULT_L2_CACHE_SIZE(512*1024);
-const std::ptrdiff_t defaultL3CacheSize = EIGEN_SET_DEFAULT_L3_CACHE_SIZE(512*1024);
+const std::ptrdiff_t defaultL1CacheSize = EIGEN_SET_DEFAULT_L1_CACHE_SIZE(16 * 1024);
+const std::ptrdiff_t defaultL2CacheSize = EIGEN_SET_DEFAULT_L2_CACHE_SIZE(512 * 1024);
+const std::ptrdiff_t defaultL3CacheSize = EIGEN_SET_DEFAULT_L3_CACHE_SIZE(512 * 1024);
 #endif
 
 #undef EIGEN_SET_DEFAULT_L1_CACHE_SIZE
@@ -77,7 +69,7 @@
 
 /** \internal */
 struct CacheSizes {
-  CacheSizes(): m_l1(-1),m_l2(-1),m_l3(-1) {
+  CacheSizes() : m_l1(-1), m_l2(-1), m_l3(-1) {
     int l1CacheSize, l2CacheSize, l3CacheSize;
     queryCacheSizes(l1CacheSize, l2CacheSize, l3CacheSize);
     m_l1 = manage_caching_sizes_helper(l1CacheSize, defaultL1CacheSize);
@@ -91,27 +83,21 @@
 };
 
 /** \internal */
-inline void manage_caching_sizes(Action action, std::ptrdiff_t* l1, std::ptrdiff_t* l2, std::ptrdiff_t* l3)
-{
+inline void manage_caching_sizes(Action action, std::ptrdiff_t* l1, std::ptrdiff_t* l2, std::ptrdiff_t* l3) {
   static CacheSizes m_cacheSizes;
 
-  if(action==SetAction)
-  {
+  if (action == SetAction) {
     // set the cpu cache size and cache all block sizes from a global cache size in byte
-    eigen_internal_assert(l1!=0 && l2!=0);
+    eigen_internal_assert(l1 != 0 && l2 != 0);
     m_cacheSizes.m_l1 = *l1;
     m_cacheSizes.m_l2 = *l2;
     m_cacheSizes.m_l3 = *l3;
-  }
-  else if(action==GetAction)
-  {
-    eigen_internal_assert(l1!=0 && l2!=0);
+  } else if (action == GetAction) {
+    eigen_internal_assert(l1 != 0 && l2 != 0);
     *l1 = m_cacheSizes.m_l1;
     *l2 = m_cacheSizes.m_l2;
     *l3 = m_cacheSizes.m_l3;
-  }
-  else
-  {
+  } else {
     eigen_internal_assert(false);
   }
 }
@@ -128,10 +114,9 @@
  *
  * \sa setCpuCacheSizes */
 
-template<typename LhsScalar, typename RhsScalar, int KcFactor, typename Index>
-void evaluateProductBlockingSizesHeuristic(Index& k, Index& m, Index& n, Index num_threads = 1)
-{
-  typedef gebp_traits<LhsScalar,RhsScalar> Traits;
+template <typename LhsScalar, typename RhsScalar, int KcFactor, typename Index>
+void evaluateProductBlockingSizesHeuristic(Index& k, Index& m, Index& n, Index num_threads = 1) {
+  typedef gebp_traits<LhsScalar, RhsScalar> Traits;
 
   // Explanations:
   // Let's recall that the product algorithms form mc x kc vertical panels A' on the lhs and
@@ -140,7 +125,7 @@
   // at the register level. This small horizontal panel has to stay within L1 cache.
   std::ptrdiff_t l1, l2, l3;
   manage_caching_sizes(GetAction, &l1, &l2, &l3);
-  #ifdef EIGEN_VECTORIZE_AVX512
+#ifdef EIGEN_VECTORIZE_AVX512
   // We need to find a rationale for that, but without this adjustment,
   // performance with AVX512 is pretty bad, like -20% slower.
   // One reason is that with increasing packet-size, the blocking size k
@@ -149,7 +134,7 @@
   //   k*(3*64 + 4*8) Bytes, with l1=32kBytes, and k%8=0, we have k=144.
   // This is quite small for a good reuse of the accumulation registers.
   l1 *= 4;
-  #endif
+#endif
 
   if (num_threads > 1) {
     typedef typename Traits::ResScalar ResScalar;
@@ -165,13 +150,13 @@
     // increasing the value of k, so we'll cap it at 320 (value determined
     // experimentally).
     // To avoid that k vanishes, we make k_cache at least as big as kr
-    const Index k_cache = numext::maxi<Index>(kr, (numext::mini<Index>)((l1-ksub)/kdiv, 320));
+    const Index k_cache = numext::maxi<Index>(kr, (numext::mini<Index>)((l1 - ksub) / kdiv, 320));
     if (k_cache < k) {
       k = k_cache - (k_cache % kr);
       eigen_internal_assert(k > 0);
     }
 
-    const Index n_cache = (l2-l1) / (nr * sizeof(RhsScalar) * k);
+    const Index n_cache = (l2 - l1) / (nr * sizeof(RhsScalar) * k);
     const Index n_per_thread = numext::div_ceil(n, num_threads);
     if (n_cache <= n_per_thread) {
       // Don't exceed the capacity of the l2 cache.
@@ -184,31 +169,29 @@
 
     if (l3 > l2) {
       // l3 is shared between all cores, so we'll give each thread its own chunk of l3.
-      const Index m_cache = (l3-l2) / (sizeof(LhsScalar) * k * num_threads);
+      const Index m_cache = (l3 - l2) / (sizeof(LhsScalar) * k * num_threads);
       const Index m_per_thread = numext::div_ceil(m, num_threads);
-      if(m_cache < m_per_thread && m_cache >= static_cast<Index>(mr)) {
+      if (m_cache < m_per_thread && m_cache >= static_cast<Index>(mr)) {
         m = m_cache - (m_cache % mr);
         eigen_internal_assert(m > 0);
       } else {
         m = (numext::mini<Index>)(m, (m_per_thread + mr - 1) - ((m_per_thread + mr - 1) % mr));
       }
     }
-  }
-  else {
+  } else {
     // In unit tests we do not want to use extra large matrices,
     // so we reduce the cache size to check the blocking strategy is not flawed
 #ifdef EIGEN_DEBUG_SMALL_PRODUCT_BLOCKS
-    l1 = 9*1024;
-    l2 = 32*1024;
-    l3 = 512*1024;
+    l1 = 9 * 1024;
+    l2 = 32 * 1024;
+    l3 = 512 * 1024;
 #endif
 
     // Early return for small problems because the computation below are time consuming for small problems.
     // Perhaps it would make more sense to consider k*n*m??
     // Note that for very tiny problem, this function should be bypassed anyway
     // because we use the coefficient-based implementation for them.
-    if((numext::maxi)(k,(numext::maxi)(m,n))<48)
-      return;
+    if ((numext::maxi)(k, (numext::maxi)(m, n)) < 48) return;
 
     typedef typename Traits::ResScalar ResScalar;
     enum {
@@ -224,30 +207,29 @@
     // We also include a register-level block of the result (mx x nr).
     // (In an ideal world only the lhs panel would stay in L1)
     // Moreover, kc has to be a multiple of 8 to be compatible with loop peeling, leading to a maximum blocking size of:
-    const Index max_kc = numext::maxi<Index>(((l1-k_sub)/k_div) & (~(k_peeling-1)),1);
+    const Index max_kc = numext::maxi<Index>(((l1 - k_sub) / k_div) & (~(k_peeling - 1)), 1);
     const Index old_k = k;
-    if(k>max_kc)
-    {
+    if (k > max_kc) {
       // We are really blocking on the third dimension:
       // -> reduce blocking size to make sure the last block is as large as possible
       //    while keeping the same number of sweeps over the result.
-      k = (k%max_kc)==0 ? max_kc
-                        : max_kc - k_peeling * ((max_kc-1-(k%max_kc))/(k_peeling*(k/max_kc+1)));
+      k = (k % max_kc) == 0 ? max_kc
+                            : max_kc - k_peeling * ((max_kc - 1 - (k % max_kc)) / (k_peeling * (k / max_kc + 1)));
 
-      eigen_internal_assert(((old_k/k) == (old_k/max_kc)) && "the number of sweeps has to remain the same");
+      eigen_internal_assert(((old_k / k) == (old_k / max_kc)) && "the number of sweeps has to remain the same");
     }
 
-    // ---- 2nd level of blocking on max(L2,L3), yields nc ----
+// ---- 2nd level of blocking on max(L2,L3), yields nc ----
 
-    // TODO find a reliable way to get the actual amount of cache per core to use for 2nd level blocking, that is:
-    //      actual_l2 = max(l2, l3/nb_core_sharing_l3)
-    // The number below is quite conservative: it is better to underestimate the cache size rather than overestimating it)
-    // For instance, it corresponds to 6MB of L3 shared among 4 cores.
-    #ifdef EIGEN_DEBUG_SMALL_PRODUCT_BLOCKS
+// TODO find a reliable way to get the actual amount of cache per core to use for 2nd level blocking, that is:
+//      actual_l2 = max(l2, l3/nb_core_sharing_l3)
+// The number below is quite conservative: it is better to underestimate the cache size rather than overestimating it)
+// For instance, it corresponds to 6MB of L3 shared among 4 cores.
+#ifdef EIGEN_DEBUG_SMALL_PRODUCT_BLOCKS
     const Index actual_l2 = l3;
-    #else
-    const Index actual_l2 = 1572864; // == 1.5 MB
-    #endif
+#else
+    const Index actual_l2 = 1572864;  // == 1.5 MB
+#endif
 
     // Here, nc is chosen such that a block of kc x nc of the rhs fit within half of L2.
     // The second half is implicitly reserved to access the result and lhs coefficients.
@@ -257,61 +239,52 @@
     // and it becomes fruitful to keep the packed rhs blocks in L1 if there is enough remaining space.
     Index max_nc;
     const Index lhs_bytes = m * k * sizeof(LhsScalar);
-    const Index remaining_l1 = l1- k_sub - lhs_bytes;
-    if(remaining_l1 >= Index(Traits::nr*sizeof(RhsScalar))*k)
-    {
+    const Index remaining_l1 = l1 - k_sub - lhs_bytes;
+    if (remaining_l1 >= Index(Traits::nr * sizeof(RhsScalar)) * k) {
       // L1 blocking
-      max_nc = remaining_l1 / (k*sizeof(RhsScalar));
-    }
-    else
-    {
+      max_nc = remaining_l1 / (k * sizeof(RhsScalar));
+    } else {
       // L2 blocking
-      max_nc = (3*actual_l2)/(2*2*max_kc*sizeof(RhsScalar));
+      max_nc = (3 * actual_l2) / (2 * 2 * max_kc * sizeof(RhsScalar));
     }
     // WARNING Below, we assume that Traits::nr is a power of two.
-    Index nc = numext::mini<Index>(actual_l2/(2*k*sizeof(RhsScalar)), max_nc) & (~(Traits::nr-1));
-    if(n>nc)
-    {
+    Index nc = numext::mini<Index>(actual_l2 / (2 * k * sizeof(RhsScalar)), max_nc) & (~(Traits::nr - 1));
+    if (n > nc) {
       // We are really blocking over the columns:
       // -> reduce blocking size to make sure the last block is as large as possible
       //    while keeping the same number of sweeps over the packed lhs.
       //    Here we allow one more sweep if this gives us a perfect match, thus the commented "-1"
-      n = (n%nc)==0 ? nc
-                    : (nc - Traits::nr * ((nc/*-1*/-(n%nc))/(Traits::nr*(n/nc+1))));
-    }
-    else if(old_k==k)
-    {
+      n = (n % nc) == 0 ? nc : (nc - Traits::nr * ((nc /*-1*/ - (n % nc)) / (Traits::nr * (n / nc + 1))));
+    } else if (old_k == k) {
       // So far, no blocking at all, i.e., kc==k, and nc==n.
       // In this case, let's perform a blocking over the rows such that the packed lhs data is kept in cache L1/L2
-      // TODO: part of this blocking strategy is now implemented within the kernel itself, so the L1-based heuristic here should be obsolete.
-      Index problem_size = k*n*sizeof(LhsScalar);
+      // TODO: part of this blocking strategy is now implemented within the kernel itself, so the L1-based heuristic
+      // here should be obsolete.
+      Index problem_size = k * n * sizeof(LhsScalar);
       Index actual_lm = actual_l2;
       Index max_mc = m;
-      if(problem_size<=1024)
-      {
+      if (problem_size <= 1024) {
         // problem is small enough to keep in L1
         // Let's choose m such that lhs's block fit in 1/3 of L1
         actual_lm = l1;
-      }
-      else if(l3!=0 && problem_size<=32768)
-      {
+      } else if (l3 != 0 && problem_size <= 32768) {
         // we have both L2 and L3, and problem is small enough to be kept in L2
         // Let's choose m such that lhs's block fit in 1/3 of L2
         actual_lm = l2;
-        max_mc = (numext::mini<Index>)(576,max_mc);
+        max_mc = (numext::mini<Index>)(576, max_mc);
       }
-      Index mc = (numext::mini<Index>)(actual_lm/(3*k*sizeof(LhsScalar)), max_mc);
-      if (mc > Traits::mr) mc -= mc % Traits::mr;
-      else if (mc==0) return;
-      m = (m%mc)==0 ? mc
-                    : (mc - Traits::mr * ((mc/*-1*/-(m%mc))/(Traits::mr*(m/mc+1))));
+      Index mc = (numext::mini<Index>)(actual_lm / (3 * k * sizeof(LhsScalar)), max_mc);
+      if (mc > Traits::mr)
+        mc -= mc % Traits::mr;
+      else if (mc == 0)
+        return;
+      m = (m % mc) == 0 ? mc : (mc - Traits::mr * ((mc /*-1*/ - (m % mc)) / (Traits::mr * (m / mc + 1))));
     }
   }
 }
 
 template <typename Index>
-inline bool useSpecificBlockingSizes(Index& k, Index& m, Index& n)
-{
+inline bool useSpecificBlockingSizes(Index& k, Index& m, Index& n) {
 #ifdef EIGEN_TEST_SPECIFIC_BLOCKING_SIZES
   if (EIGEN_TEST_SPECIFIC_BLOCKING_SIZES) {
     k = numext::mini<Index>(k, EIGEN_TEST_SPECIFIC_BLOCKING_SIZE_K);
@@ -328,46 +301,46 @@
 }
 
 /** \brief Computes the blocking parameters for a m x k times k x n matrix product
-  *
-  * \param[in,out] k Input: the third dimension of the product. Output: the blocking size along the same dimension.
-  * \param[in,out] m Input: the number of rows of the left hand side. Output: the blocking size along the same dimension.
-  * \param[in,out] n Input: the number of columns of the right hand side. Output: the blocking size along the same dimension.
-  *
-  * Given a m x k times k x n matrix product of scalar types \c LhsScalar and \c RhsScalar,
-  * this function computes the blocking size parameters along the respective dimensions
-  * for matrix products and related algorithms.
-  *
-  * The blocking size parameters may be evaluated:
-  *   - either by a heuristic based on cache sizes;
-  *   - or using fixed prescribed values (for testing purposes).
-  *
-  * \sa setCpuCacheSizes */
+ *
+ * \param[in,out] k Input: the third dimension of the product. Output: the blocking size along the same dimension.
+ * \param[in,out] m Input: the number of rows of the left hand side. Output: the blocking size along the same dimension.
+ * \param[in,out] n Input: the number of columns of the right hand side. Output: the blocking size along the same
+ * dimension.
+ *
+ * Given a m x k times k x n matrix product of scalar types \c LhsScalar and \c RhsScalar,
+ * this function computes the blocking size parameters along the respective dimensions
+ * for matrix products and related algorithms.
+ *
+ * The blocking size parameters may be evaluated:
+ *   - either by a heuristic based on cache sizes;
+ *   - or using fixed prescribed values (for testing purposes).
+ *
+ * \sa setCpuCacheSizes */
 
-template<typename LhsScalar, typename RhsScalar, int KcFactor, typename Index>
-void computeProductBlockingSizes(Index& k, Index& m, Index& n, Index num_threads = 1)
-{
+template <typename LhsScalar, typename RhsScalar, int KcFactor, typename Index>
+void computeProductBlockingSizes(Index& k, Index& m, Index& n, Index num_threads = 1) {
   if (!useSpecificBlockingSizes(k, m, n)) {
     evaluateProductBlockingSizesHeuristic<LhsScalar, RhsScalar, KcFactor, Index>(k, m, n, num_threads);
   }
 }
 
-template<typename LhsScalar, typename RhsScalar, typename Index>
-inline void computeProductBlockingSizes(Index& k, Index& m, Index& n, Index num_threads = 1)
-{
-  computeProductBlockingSizes<LhsScalar,RhsScalar,1,Index>(k, m, n, num_threads);
+template <typename LhsScalar, typename RhsScalar, typename Index>
+inline void computeProductBlockingSizes(Index& k, Index& m, Index& n, Index num_threads = 1) {
+  computeProductBlockingSizes<LhsScalar, RhsScalar, 1, Index>(k, m, n, num_threads);
 }
 
 template <typename RhsPacket, typename RhsPacketx4, int registers_taken>
 struct RhsPanelHelper {
  private:
-  static constexpr int remaining_registers = (std::max)(int(EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS) - registers_taken, 0);
+  static constexpr int remaining_registers =
+      (std::max)(int(EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS) - registers_taken, 0);
+
  public:
-  typedef std::conditional_t<remaining_registers>=4, RhsPacketx4, RhsPacket> type;
+  typedef std::conditional_t<remaining_registers >= 4, RhsPacketx4, RhsPacket> type;
 };
 
 template <typename Packet>
-struct QuadPacket
-{
+struct QuadPacket {
   Packet B_0, B1, B2, B3;
   const Packet& get(const FixedInt<0>&) const { return B_0; }
   const Packet& get(const FixedInt<1>&) const { return B1; }
@@ -376,56 +349,53 @@
 };
 
 template <int N, typename T1, typename T2, typename T3>
-struct packet_conditional { typedef T3 type; };
+struct packet_conditional {
+  typedef T3 type;
+};
 
 template <typename T1, typename T2, typename T3>
-struct packet_conditional<GEBPPacketFull, T1, T2, T3> { typedef T1 type; };
+struct packet_conditional<GEBPPacketFull, T1, T2, T3> {
+  typedef T1 type;
+};
 
 template <typename T1, typename T2, typename T3>
-struct packet_conditional<GEBPPacketHalf, T1, T2, T3> { typedef T2 type; };
+struct packet_conditional<GEBPPacketHalf, T1, T2, T3> {
+  typedef T2 type;
+};
 
-#define PACKET_DECL_COND_POSTFIX(postfix, name, packet_size)       \
-  typedef typename packet_conditional<packet_size,                 \
-                                      typename packet_traits<name ## Scalar>::type, \
-                                      typename packet_traits<name ## Scalar>::half, \
-                                      typename unpacket_traits<typename packet_traits<name ## Scalar>::half>::half>::type \
-  name ## Packet ## postfix
+#define PACKET_DECL_COND_POSTFIX(postfix, name, packet_size)                                               \
+  typedef typename packet_conditional<                                                                     \
+      packet_size, typename packet_traits<name##Scalar>::type, typename packet_traits<name##Scalar>::half, \
+      typename unpacket_traits<typename packet_traits<name##Scalar>::half>::half>::type name##Packet##postfix
 
-#define PACKET_DECL_COND(name, packet_size)                        \
-  typedef typename packet_conditional<packet_size,                 \
-                                      typename packet_traits<name ## Scalar>::type, \
-                                      typename packet_traits<name ## Scalar>::half, \
-                                      typename unpacket_traits<typename packet_traits<name ## Scalar>::half>::half>::type \
-  name ## Packet
+#define PACKET_DECL_COND(name, packet_size)                                                                \
+  typedef typename packet_conditional<                                                                     \
+      packet_size, typename packet_traits<name##Scalar>::type, typename packet_traits<name##Scalar>::half, \
+      typename unpacket_traits<typename packet_traits<name##Scalar>::half>::half>::type name##Packet
 
-#define PACKET_DECL_COND_SCALAR_POSTFIX(postfix, packet_size)      \
-  typedef typename packet_conditional<packet_size,                 \
-                                      typename packet_traits<Scalar>::type, \
-                                      typename packet_traits<Scalar>::half, \
-                                      typename unpacket_traits<typename packet_traits<Scalar>::half>::half>::type \
-  ScalarPacket ## postfix
+#define PACKET_DECL_COND_SCALAR_POSTFIX(postfix, packet_size)                                  \
+  typedef typename packet_conditional<                                                         \
+      packet_size, typename packet_traits<Scalar>::type, typename packet_traits<Scalar>::half, \
+      typename unpacket_traits<typename packet_traits<Scalar>::half>::half>::type ScalarPacket##postfix
 
-#define PACKET_DECL_COND_SCALAR(packet_size)                       \
-  typedef typename packet_conditional<packet_size,                 \
-                                      typename packet_traits<Scalar>::type, \
-                                      typename packet_traits<Scalar>::half, \
-                                      typename unpacket_traits<typename packet_traits<Scalar>::half>::half>::type \
-  ScalarPacket
+#define PACKET_DECL_COND_SCALAR(packet_size)                                                   \
+  typedef typename packet_conditional<                                                         \
+      packet_size, typename packet_traits<Scalar>::type, typename packet_traits<Scalar>::half, \
+      typename unpacket_traits<typename packet_traits<Scalar>::half>::half>::type ScalarPacket
 
 /* Vectorization logic
  *  real*real: unpack rhs to constant packets, ...
- * 
+ *
  *  cd*cd : unpack rhs to (b_r,b_r), (b_i,b_i), mul to get (a_r b_r,a_i b_r) (a_r b_i,a_i b_i),
  *          storing each res packet into two packets (2x2),
- *          at the end combine them: swap the second and addsub them 
+ *          at the end combine them: swap the second and addsub them
  *  cf*cf : same but with 2x4 blocks
  *  cplx*real : unpack rhs to constant packets, ...
  *  real*cplx : load lhs as (a0,a0,a1,a1), and mul as usual
  */
-template<typename LhsScalar_, typename RhsScalar_, bool ConjLhs_, bool ConjRhs_, int Arch, int PacketSize_>
-class gebp_traits
-{
-public:
+template <typename LhsScalar_, typename RhsScalar_, bool ConjLhs_, bool ConjRhs_, int Arch, int PacketSize_>
+class gebp_traits {
+ public:
   typedef LhsScalar_ LhsScalar;
   typedef RhsScalar_ RhsScalar;
   typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar>::ReturnType ResScalar;
@@ -441,120 +411,104 @@
     LhsPacketSize = Vectorizable ? unpacket_traits<LhsPacket_>::size : 1,
     RhsPacketSize = Vectorizable ? unpacket_traits<RhsPacket_>::size : 1,
     ResPacketSize = Vectorizable ? unpacket_traits<ResPacket_>::size : 1,
-    
+
     NumberOfRegisters = EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS,
 
     // register block size along the N direction must be 1 or 4
     nr = 4,
 
     // register block size along the M direction (currently, this one cannot be modified)
-    default_mr = (plain_enum_min(16, NumberOfRegisters)/2/nr)*LhsPacketSize,
-#if defined(EIGEN_HAS_SINGLE_INSTRUCTION_MADD) && !defined(EIGEN_VECTORIZE_ALTIVEC) && !defined(EIGEN_VECTORIZE_VSX) \
-    && ((!EIGEN_COMP_MSVC) || (EIGEN_COMP_MSVC>=1914))
+    default_mr = (plain_enum_min(16, NumberOfRegisters) / 2 / nr) * LhsPacketSize,
+#if defined(EIGEN_HAS_SINGLE_INSTRUCTION_MADD) && !defined(EIGEN_VECTORIZE_ALTIVEC) && \
+    !defined(EIGEN_VECTORIZE_VSX) && ((!EIGEN_COMP_MSVC) || (EIGEN_COMP_MSVC >= 1914))
     // we assume 16 registers or more
     // See bug 992, if the scalar type is not vectorizable but that EIGEN_HAS_SINGLE_INSTRUCTION_MADD is defined,
     // then using 3*LhsPacketSize triggers non-implemented paths in syrk.
     // Bug 1515: MSVC prior to v19.14 yields to register spilling.
-    mr = Vectorizable ? 3*LhsPacketSize : default_mr,
+    mr = Vectorizable ? 3 * LhsPacketSize : default_mr,
 #else
     mr = default_mr,
 #endif
-    
+
     LhsProgress = LhsPacketSize,
     RhsProgress = 1
   };
 
-
-  typedef std::conditional_t<Vectorizable,LhsPacket_,LhsScalar> LhsPacket;
-  typedef std::conditional_t<Vectorizable,RhsPacket_,RhsScalar> RhsPacket;
-  typedef std::conditional_t<Vectorizable,ResPacket_,ResScalar> ResPacket;
+  typedef std::conditional_t<Vectorizable, LhsPacket_, LhsScalar> LhsPacket;
+  typedef std::conditional_t<Vectorizable, RhsPacket_, RhsScalar> RhsPacket;
+  typedef std::conditional_t<Vectorizable, ResPacket_, ResScalar> ResPacket;
   typedef LhsPacket LhsPacket4Packing;
 
   typedef QuadPacket<RhsPacket> RhsPacketx4;
   typedef ResPacket AccPacket;
-  
-  EIGEN_STRONG_INLINE void initAcc(AccPacket& p)
-  {
-    p = pset1<ResPacket>(ResScalar(0));
-  }
 
-  template<typename RhsPacketType>
-  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacketType& dest) const
-  {
+  EIGEN_STRONG_INLINE void initAcc(AccPacket& p) { p = pset1<ResPacket>(ResScalar(0)); }
+
+  template <typename RhsPacketType>
+  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacketType& dest) const {
     dest = pset1<RhsPacketType>(*b);
   }
 
-  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacketx4& dest) const
-  {
+  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacketx4& dest) const {
     pbroadcast4(b, dest.B_0, dest.B1, dest.B2, dest.B3);
   }
 
-  template<typename RhsPacketType>
-  EIGEN_STRONG_INLINE void updateRhs(const RhsScalar* b, RhsPacketType& dest) const
-  {
+  template <typename RhsPacketType>
+  EIGEN_STRONG_INLINE void updateRhs(const RhsScalar* b, RhsPacketType& dest) const {
     loadRhs(b, dest);
   }
 
-  EIGEN_STRONG_INLINE void updateRhs(const RhsScalar*, RhsPacketx4&) const
-  {
-  }
+  EIGEN_STRONG_INLINE void updateRhs(const RhsScalar*, RhsPacketx4&) const {}
 
-  EIGEN_STRONG_INLINE void loadRhsQuad(const RhsScalar* b, RhsPacket& dest) const
-  {
-    dest = ploadquad<RhsPacket>(b);
-  }
+  EIGEN_STRONG_INLINE void loadRhsQuad(const RhsScalar* b, RhsPacket& dest) const { dest = ploadquad<RhsPacket>(b); }
 
-  template<typename LhsPacketType>
-  EIGEN_STRONG_INLINE void loadLhs(const LhsScalar* a, LhsPacketType& dest) const
-  {
+  template <typename LhsPacketType>
+  EIGEN_STRONG_INLINE void loadLhs(const LhsScalar* a, LhsPacketType& dest) const {
     dest = pload<LhsPacketType>(a);
   }
 
-  template<typename LhsPacketType>
-  EIGEN_STRONG_INLINE void loadLhsUnaligned(const LhsScalar* a, LhsPacketType& dest) const
-  {
+  template <typename LhsPacketType>
+  EIGEN_STRONG_INLINE void loadLhsUnaligned(const LhsScalar* a, LhsPacketType& dest) const {
     dest = ploadu<LhsPacketType>(a);
   }
 
-  template<typename LhsPacketType, typename RhsPacketType, typename AccPacketType, typename LaneIdType>
-  EIGEN_STRONG_INLINE void madd(const LhsPacketType& a, const RhsPacketType& b, AccPacketType& c, RhsPacketType& tmp, const LaneIdType&) const
-  {
-    conj_helper<LhsPacketType,RhsPacketType,ConjLhs,ConjRhs> cj;
+  template <typename LhsPacketType, typename RhsPacketType, typename AccPacketType, typename LaneIdType>
+  EIGEN_STRONG_INLINE void madd(const LhsPacketType& a, const RhsPacketType& b, AccPacketType& c, RhsPacketType& tmp,
+                                const LaneIdType&) const {
+    conj_helper<LhsPacketType, RhsPacketType, ConjLhs, ConjRhs> cj;
     // It would be a lot cleaner to call pmadd all the time. Unfortunately if we
     // let gcc allocate the register in which to store the result of the pmul
     // (in the case where there is no FMA) gcc fails to figure out how to avoid
     // spilling register.
 #ifdef EIGEN_HAS_SINGLE_INSTRUCTION_MADD
     EIGEN_UNUSED_VARIABLE(tmp);
-    c = cj.pmadd(a,b,c);
+    c = cj.pmadd(a, b, c);
 #else
-    tmp = b; tmp = cj.pmul(a,tmp); c = padd(c,tmp);
+    tmp = b;
+    tmp = cj.pmul(a, tmp);
+    c = padd(c, tmp);
 #endif
   }
 
-  template<typename LhsPacketType, typename AccPacketType, typename LaneIdType>
-  EIGEN_STRONG_INLINE void madd(const LhsPacketType& a, const RhsPacketx4& b, AccPacketType& c, RhsPacket& tmp, const LaneIdType& lane) const
-  {
+  template <typename LhsPacketType, typename AccPacketType, typename LaneIdType>
+  EIGEN_STRONG_INLINE void madd(const LhsPacketType& a, const RhsPacketx4& b, AccPacketType& c, RhsPacket& tmp,
+                                const LaneIdType& lane) const {
     madd(a, b.get(lane), c, tmp, lane);
   }
 
-  EIGEN_STRONG_INLINE void acc(const AccPacket& c, const ResPacket& alpha, ResPacket& r) const
-  {
-    r = pmadd(c,alpha,r);
-  }
-  
-  template<typename ResPacketHalf>
-  EIGEN_STRONG_INLINE void acc(const ResPacketHalf& c, const ResPacketHalf& alpha, ResPacketHalf& r) const
-  {
-    r = pmadd(c,alpha,r);
+  EIGEN_STRONG_INLINE void acc(const AccPacket& c, const ResPacket& alpha, ResPacket& r) const {
+    r = pmadd(c, alpha, r);
   }
 
+  template <typename ResPacketHalf>
+  EIGEN_STRONG_INLINE void acc(const ResPacketHalf& c, const ResPacketHalf& alpha, ResPacketHalf& r) const {
+    r = pmadd(c, alpha, r);
+  }
 };
 
-template<typename RealScalar, bool ConjLhs_, int Arch, int PacketSize_>
-class gebp_traits<std::complex<RealScalar>, RealScalar, ConjLhs_, false, Arch, PacketSize_>
-{
-public:
+template <typename RealScalar, bool ConjLhs_, int Arch, int PacketSize_>
+class gebp_traits<std::complex<RealScalar>, RealScalar, ConjLhs_, false, Arch, PacketSize_> {
+ public:
   typedef std::complex<RealScalar> LhsScalar;
   typedef RealScalar RhsScalar;
   typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar>::ReturnType ResScalar;
@@ -570,135 +524,120 @@
     LhsPacketSize = Vectorizable ? unpacket_traits<LhsPacket_>::size : 1,
     RhsPacketSize = Vectorizable ? unpacket_traits<RhsPacket_>::size : 1,
     ResPacketSize = Vectorizable ? unpacket_traits<ResPacket_>::size : 1,
-    
+
     NumberOfRegisters = EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS,
     nr = 4,
 #if defined(EIGEN_HAS_SINGLE_INSTRUCTION_MADD) && !defined(EIGEN_VECTORIZE_ALTIVEC) && !defined(EIGEN_VECTORIZE_VSX)
     // we assume 16 registers
-    mr = 3*LhsPacketSize,
+    mr = 3 * LhsPacketSize,
 #else
-    mr = (plain_enum_min(16, NumberOfRegisters)/2/nr)*LhsPacketSize,
+    mr = (plain_enum_min(16, NumberOfRegisters) / 2 / nr) * LhsPacketSize,
 #endif
 
     LhsProgress = LhsPacketSize,
     RhsProgress = 1
   };
 
-  typedef std::conditional_t<Vectorizable,LhsPacket_,LhsScalar> LhsPacket;
-  typedef std::conditional_t<Vectorizable,RhsPacket_,RhsScalar> RhsPacket;
-  typedef std::conditional_t<Vectorizable,ResPacket_,ResScalar> ResPacket;
+  typedef std::conditional_t<Vectorizable, LhsPacket_, LhsScalar> LhsPacket;
+  typedef std::conditional_t<Vectorizable, RhsPacket_, RhsScalar> RhsPacket;
+  typedef std::conditional_t<Vectorizable, ResPacket_, ResScalar> ResPacket;
   typedef LhsPacket LhsPacket4Packing;
 
   typedef QuadPacket<RhsPacket> RhsPacketx4;
 
   typedef ResPacket AccPacket;
 
-  EIGEN_STRONG_INLINE void initAcc(AccPacket& p)
-  {
-    p = pset1<ResPacket>(ResScalar(0));
-  }
+  EIGEN_STRONG_INLINE void initAcc(AccPacket& p) { p = pset1<ResPacket>(ResScalar(0)); }
 
-  template<typename RhsPacketType>
-  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacketType& dest) const
-  {
+  template <typename RhsPacketType>
+  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacketType& dest) const {
     dest = pset1<RhsPacketType>(*b);
   }
 
-  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacketx4& dest) const
-  {
+  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacketx4& dest) const {
     pbroadcast4(b, dest.B_0, dest.B1, dest.B2, dest.B3);
   }
 
-  template<typename RhsPacketType>
-  EIGEN_STRONG_INLINE void updateRhs(const RhsScalar* b, RhsPacketType& dest) const
-  {
+  template <typename RhsPacketType>
+  EIGEN_STRONG_INLINE void updateRhs(const RhsScalar* b, RhsPacketType& dest) const {
     loadRhs(b, dest);
   }
 
-  EIGEN_STRONG_INLINE void updateRhs(const RhsScalar*, RhsPacketx4&) const
-  {}
-  
-  EIGEN_STRONG_INLINE void loadRhsQuad(const RhsScalar* b, RhsPacket& dest) const
-  {
-    loadRhsQuad_impl(b,dest, std::conditional_t<RhsPacketSize==16,true_type,false_type>());
+  EIGEN_STRONG_INLINE void updateRhs(const RhsScalar*, RhsPacketx4&) const {}
+
+  EIGEN_STRONG_INLINE void loadRhsQuad(const RhsScalar* b, RhsPacket& dest) const {
+    loadRhsQuad_impl(b, dest, std::conditional_t<RhsPacketSize == 16, true_type, false_type>());
   }
 
-  EIGEN_STRONG_INLINE void loadRhsQuad_impl(const RhsScalar* b, RhsPacket& dest, const true_type&) const
-  {
+  EIGEN_STRONG_INLINE void loadRhsQuad_impl(const RhsScalar* b, RhsPacket& dest, const true_type&) const {
     // FIXME we can do better!
     // what we want here is a ploadheight
-    RhsScalar tmp[4] = {b[0],b[0],b[1],b[1]};
+    RhsScalar tmp[4] = {b[0], b[0], b[1], b[1]};
     dest = ploadquad<RhsPacket>(tmp);
   }
 
-  EIGEN_STRONG_INLINE void loadRhsQuad_impl(const RhsScalar* b, RhsPacket& dest, const false_type&) const
-  {
-    eigen_internal_assert(RhsPacketSize<=8);
+  EIGEN_STRONG_INLINE void loadRhsQuad_impl(const RhsScalar* b, RhsPacket& dest, const false_type&) const {
+    eigen_internal_assert(RhsPacketSize <= 8);
     dest = pset1<RhsPacket>(*b);
   }
 
-  EIGEN_STRONG_INLINE void loadLhs(const LhsScalar* a, LhsPacket& dest) const
-  {
-    dest = pload<LhsPacket>(a);
-  }
+  EIGEN_STRONG_INLINE void loadLhs(const LhsScalar* a, LhsPacket& dest) const { dest = pload<LhsPacket>(a); }
 
-  template<typename LhsPacketType>
-  EIGEN_STRONG_INLINE void loadLhsUnaligned(const LhsScalar* a, LhsPacketType& dest) const
-  {
+  template <typename LhsPacketType>
+  EIGEN_STRONG_INLINE void loadLhsUnaligned(const LhsScalar* a, LhsPacketType& dest) const {
     dest = ploadu<LhsPacketType>(a);
   }
 
   template <typename LhsPacketType, typename RhsPacketType, typename AccPacketType, typename LaneIdType>
-  EIGEN_STRONG_INLINE void madd(const LhsPacketType& a, const RhsPacketType& b, AccPacketType& c, RhsPacketType& tmp, const LaneIdType&) const
-  {
-    madd_impl(a, b, c, tmp, std::conditional_t<Vectorizable,true_type,false_type>());
+  EIGEN_STRONG_INLINE void madd(const LhsPacketType& a, const RhsPacketType& b, AccPacketType& c, RhsPacketType& tmp,
+                                const LaneIdType&) const {
+    madd_impl(a, b, c, tmp, std::conditional_t<Vectorizable, true_type, false_type>());
   }
 
   template <typename LhsPacketType, typename RhsPacketType, typename AccPacketType>
-  EIGEN_STRONG_INLINE void madd_impl(const LhsPacketType& a, const RhsPacketType& b, AccPacketType& c, RhsPacketType& tmp, const true_type&) const
-  {
+  EIGEN_STRONG_INLINE void madd_impl(const LhsPacketType& a, const RhsPacketType& b, AccPacketType& c,
+                                     RhsPacketType& tmp, const true_type&) const {
 #ifdef EIGEN_HAS_SINGLE_INSTRUCTION_MADD
     EIGEN_UNUSED_VARIABLE(tmp);
-    c.v = pmadd(a.v,b,c.v);
+    c.v = pmadd(a.v, b, c.v);
 #else
-    tmp = b; tmp = pmul(a.v,tmp); c.v = padd(c.v,tmp);
+    tmp = b;
+    tmp = pmul(a.v, tmp);
+    c.v = padd(c.v, tmp);
 #endif
   }
 
-  EIGEN_STRONG_INLINE void madd_impl(const LhsScalar& a, const RhsScalar& b, ResScalar& c, RhsScalar& /*tmp*/, const false_type&) const
-  {
+  EIGEN_STRONG_INLINE void madd_impl(const LhsScalar& a, const RhsScalar& b, ResScalar& c, RhsScalar& /*tmp*/,
+                                     const false_type&) const {
     c += a * b;
   }
 
-  template<typename LhsPacketType, typename AccPacketType, typename LaneIdType>
-  EIGEN_STRONG_INLINE void madd(const LhsPacketType& a, const RhsPacketx4& b, AccPacketType& c, RhsPacket& tmp, const LaneIdType& lane) const
-  {
+  template <typename LhsPacketType, typename AccPacketType, typename LaneIdType>
+  EIGEN_STRONG_INLINE void madd(const LhsPacketType& a, const RhsPacketx4& b, AccPacketType& c, RhsPacket& tmp,
+                                const LaneIdType& lane) const {
     madd(a, b.get(lane), c, tmp, lane);
   }
 
   template <typename ResPacketType, typename AccPacketType>
-  EIGEN_STRONG_INLINE void acc(const AccPacketType& c, const ResPacketType& alpha, ResPacketType& r) const
-  {
-    conj_helper<ResPacketType,ResPacketType,ConjLhs,false> cj;
-    r = cj.pmadd(c,alpha,r);
+  EIGEN_STRONG_INLINE void acc(const AccPacketType& c, const ResPacketType& alpha, ResPacketType& r) const {
+    conj_helper<ResPacketType, ResPacketType, ConjLhs, false> cj;
+    r = cj.pmadd(c, alpha, r);
   }
 
-protected:
+ protected:
 };
 
-template<typename Packet>
-struct DoublePacket
-{
+template <typename Packet>
+struct DoublePacket {
   Packet first;
   Packet second;
 };
 
-template<typename Packet>
-DoublePacket<Packet> padd(const DoublePacket<Packet> &a, const DoublePacket<Packet> &b)
-{
+template <typename Packet>
+DoublePacket<Packet> padd(const DoublePacket<Packet>& a, const DoublePacket<Packet>& b) {
   DoublePacket<Packet> res;
-  res.first  = padd(a.first, b.first);
-  res.second = padd(a.second,b.second);
+  res.first = padd(a.first, b.first);
+  res.second = padd(a.second, b.second);
   return res;
 }
 
@@ -706,55 +645,47 @@
 // corresponds to the number of complexes, so it means "8"
 // it terms of real coefficients.
 
-template<typename Packet>
-const DoublePacket<Packet>&
-predux_half_dowto4(const DoublePacket<Packet> &a,
-                   std::enable_if_t<unpacket_traits<Packet>::size<=8>* = 0)
-{
+template <typename Packet>
+const DoublePacket<Packet>& predux_half_dowto4(const DoublePacket<Packet>& a,
+                                               std::enable_if_t<unpacket_traits<Packet>::size <= 8>* = 0) {
   return a;
 }
 
-template<typename Packet>
-DoublePacket<typename unpacket_traits<Packet>::half>
-predux_half_dowto4(const DoublePacket<Packet> &a,
-                   std::enable_if_t<unpacket_traits<Packet>::size==16>* = 0)
-{
+template <typename Packet>
+DoublePacket<typename unpacket_traits<Packet>::half> predux_half_dowto4(
+    const DoublePacket<Packet>& a, std::enable_if_t<unpacket_traits<Packet>::size == 16>* = 0) {
   // yes, that's pretty hackish :(
   DoublePacket<typename unpacket_traits<Packet>::half> res;
   typedef std::complex<typename unpacket_traits<Packet>::type> Cplx;
   typedef typename packet_traits<Cplx>::type CplxPacket;
-  res.first  = predux_half_dowto4(CplxPacket(a.first)).v;
+  res.first = predux_half_dowto4(CplxPacket(a.first)).v;
   res.second = predux_half_dowto4(CplxPacket(a.second)).v;
   return res;
 }
 
 // same here, "quad" actually means "8" in terms of real coefficients
-template<typename Scalar, typename RealPacket>
+template <typename Scalar, typename RealPacket>
 void loadQuadToDoublePacket(const Scalar* b, DoublePacket<RealPacket>& dest,
-                            std::enable_if_t<unpacket_traits<RealPacket>::size<=8>* = 0)
-{
-  dest.first  = pset1<RealPacket>(numext::real(*b));
+                            std::enable_if_t<unpacket_traits<RealPacket>::size <= 8>* = 0) {
+  dest.first = pset1<RealPacket>(numext::real(*b));
   dest.second = pset1<RealPacket>(numext::imag(*b));
 }
 
-template<typename Scalar, typename RealPacket>
+template <typename Scalar, typename RealPacket>
 void loadQuadToDoublePacket(const Scalar* b, DoublePacket<RealPacket>& dest,
-                            std::enable_if_t<unpacket_traits<RealPacket>::size==16>* = 0)
-{
+                            std::enable_if_t<unpacket_traits<RealPacket>::size == 16>* = 0) {
   // yes, that's pretty hackish too :(
   typedef typename NumTraits<Scalar>::Real RealScalar;
   RealScalar r[4] = {numext::real(b[0]), numext::real(b[0]), numext::real(b[1]), numext::real(b[1])};
   RealScalar i[4] = {numext::imag(b[0]), numext::imag(b[0]), numext::imag(b[1]), numext::imag(b[1])};
-  dest.first  = ploadquad<RealPacket>(r);
+  dest.first = ploadquad<RealPacket>(r);
   dest.second = ploadquad<RealPacket>(i);
 }
 
-
-template<typename Packet> struct unpacket_traits<DoublePacket<Packet> > {
+template <typename Packet>
+struct unpacket_traits<DoublePacket<Packet> > {
   typedef DoublePacket<typename unpacket_traits<Packet>::half> half;
-  enum{
-    size = 2 * unpacket_traits<Packet>::size
-  };
+  enum { size = 2 * unpacket_traits<Packet>::size };
 };
 // template<typename Packet>
 // DoublePacket<Packet> pmadd(const DoublePacket<Packet> &a, const DoublePacket<Packet> &b)
@@ -765,15 +696,14 @@
 //   return res;
 // }
 
-template<typename RealScalar, bool ConjLhs_, bool ConjRhs_, int Arch, int PacketSize_>
-class gebp_traits<std::complex<RealScalar>, std::complex<RealScalar>, ConjLhs_, ConjRhs_, Arch, PacketSize_ >
-{
-public:
-  typedef std::complex<RealScalar>  Scalar;
-  typedef std::complex<RealScalar>  LhsScalar;
-  typedef std::complex<RealScalar>  RhsScalar;
-  typedef std::complex<RealScalar>  ResScalar;
-  
+template <typename RealScalar, bool ConjLhs_, bool ConjRhs_, int Arch, int PacketSize_>
+class gebp_traits<std::complex<RealScalar>, std::complex<RealScalar>, ConjLhs_, ConjRhs_, Arch, PacketSize_> {
+ public:
+  typedef std::complex<RealScalar> Scalar;
+  typedef std::complex<RealScalar> LhsScalar;
+  typedef std::complex<RealScalar> RhsScalar;
+  typedef std::complex<RealScalar> ResScalar;
+
   PACKET_DECL_COND_POSTFIX(_, Lhs, PacketSize_);
   PACKET_DECL_COND_POSTFIX(_, Rhs, PacketSize_);
   PACKET_DECL_COND_POSTFIX(_, Res, PacketSize_);
@@ -783,12 +713,11 @@
   enum {
     ConjLhs = ConjLhs_,
     ConjRhs = ConjRhs_,
-    Vectorizable = unpacket_traits<RealPacket>::vectorizable
-                && unpacket_traits<ScalarPacket>::vectorizable,
-    ResPacketSize   = Vectorizable ? unpacket_traits<ResPacket_>::size : 1,
+    Vectorizable = unpacket_traits<RealPacket>::vectorizable && unpacket_traits<ScalarPacket>::vectorizable,
+    ResPacketSize = Vectorizable ? unpacket_traits<ResPacket_>::size : 1,
     LhsPacketSize = Vectorizable ? unpacket_traits<LhsPacket_>::size : 1,
     RhsPacketSize = Vectorizable ? unpacket_traits<RhsScalar>::size : 1,
-    RealPacketSize  = Vectorizable ? unpacket_traits<RealPacket>::size : 1,
+    RealPacketSize = Vectorizable ? unpacket_traits<RealPacket>::size : 1,
 
     // FIXME: should depend on NumberOfRegisters
     nr = 4,
@@ -797,42 +726,36 @@
     LhsProgress = ResPacketSize,
     RhsProgress = 1
   };
-  
-  typedef DoublePacket<RealPacket>                 DoublePacketType;
 
-  typedef std::conditional_t<Vectorizable,ScalarPacket,Scalar> LhsPacket4Packing;
-  typedef std::conditional_t<Vectorizable,RealPacket,  Scalar> LhsPacket;
-  typedef std::conditional_t<Vectorizable,DoublePacketType,Scalar> RhsPacket;
-  typedef std::conditional_t<Vectorizable,ScalarPacket,Scalar> ResPacket;
-  typedef std::conditional_t<Vectorizable,DoublePacketType,Scalar> AccPacket;
+  typedef DoublePacket<RealPacket> DoublePacketType;
+
+  typedef std::conditional_t<Vectorizable, ScalarPacket, Scalar> LhsPacket4Packing;
+  typedef std::conditional_t<Vectorizable, RealPacket, Scalar> LhsPacket;
+  typedef std::conditional_t<Vectorizable, DoublePacketType, Scalar> RhsPacket;
+  typedef std::conditional_t<Vectorizable, ScalarPacket, Scalar> ResPacket;
+  typedef std::conditional_t<Vectorizable, DoublePacketType, Scalar> AccPacket;
 
   // this actually holds 8 packets!
   typedef QuadPacket<RhsPacket> RhsPacketx4;
-  
+
   EIGEN_STRONG_INLINE void initAcc(Scalar& p) { p = Scalar(0); }
 
-  EIGEN_STRONG_INLINE void initAcc(DoublePacketType& p)
-  {
-    p.first   = pset1<RealPacket>(RealScalar(0));
-    p.second  = pset1<RealPacket>(RealScalar(0));
+  EIGEN_STRONG_INLINE void initAcc(DoublePacketType& p) {
+    p.first = pset1<RealPacket>(RealScalar(0));
+    p.second = pset1<RealPacket>(RealScalar(0));
   }
 
   // Scalar path
-  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, ScalarPacket& dest) const
-  {
-    dest = pset1<ScalarPacket>(*b);
-  }
+  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, ScalarPacket& dest) const { dest = pset1<ScalarPacket>(*b); }
 
   // Vectorized path
-  template<typename RealPacketType>
-  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, DoublePacket<RealPacketType>& dest) const
-  {
-    dest.first  = pset1<RealPacketType>(numext::real(*b));
+  template <typename RealPacketType>
+  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, DoublePacket<RealPacketType>& dest) const {
+    dest.first = pset1<RealPacketType>(numext::real(*b));
     dest.second = pset1<RealPacketType>(numext::imag(*b));
   }
 
-  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacketx4& dest) const
-  {
+  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacketx4& dest) const {
     loadRhs(b, dest.B_0);
     loadRhs(b + 1, dest.B1);
     loadRhs(b + 2, dest.B2);
@@ -840,105 +763,89 @@
   }
 
   // Scalar path
-  EIGEN_STRONG_INLINE void updateRhs(const RhsScalar* b, ScalarPacket& dest) const
-  {
-    loadRhs(b, dest);
-  }
+  EIGEN_STRONG_INLINE void updateRhs(const RhsScalar* b, ScalarPacket& dest) const { loadRhs(b, dest); }
 
   // Vectorized path
-  template<typename RealPacketType>
-  EIGEN_STRONG_INLINE void updateRhs(const RhsScalar* b, DoublePacket<RealPacketType>& dest) const
-  {
+  template <typename RealPacketType>
+  EIGEN_STRONG_INLINE void updateRhs(const RhsScalar* b, DoublePacket<RealPacketType>& dest) const {
     loadRhs(b, dest);
   }
 
   EIGEN_STRONG_INLINE void updateRhs(const RhsScalar*, RhsPacketx4&) const {}
-  
-  EIGEN_STRONG_INLINE void loadRhsQuad(const RhsScalar* b, ResPacket& dest) const
-  {
-    loadRhs(b,dest);
-  }
-  EIGEN_STRONG_INLINE void loadRhsQuad(const RhsScalar* b, DoublePacketType& dest) const
-  {
-    loadQuadToDoublePacket(b,dest);
+
+  EIGEN_STRONG_INLINE void loadRhsQuad(const RhsScalar* b, ResPacket& dest) const { loadRhs(b, dest); }
+  EIGEN_STRONG_INLINE void loadRhsQuad(const RhsScalar* b, DoublePacketType& dest) const {
+    loadQuadToDoublePacket(b, dest);
   }
 
   // nothing special here
-  EIGEN_STRONG_INLINE void loadLhs(const LhsScalar* a, LhsPacket& dest) const
-  {
+  EIGEN_STRONG_INLINE void loadLhs(const LhsScalar* a, LhsPacket& dest) const {
     dest = pload<LhsPacket>((const typename unpacket_traits<LhsPacket>::type*)(a));
   }
 
-  template<typename LhsPacketType>
-  EIGEN_STRONG_INLINE void loadLhsUnaligned(const LhsScalar* a, LhsPacketType& dest) const
-  {
+  template <typename LhsPacketType>
+  EIGEN_STRONG_INLINE void loadLhsUnaligned(const LhsScalar* a, LhsPacketType& dest) const {
     dest = ploadu<LhsPacketType>((const typename unpacket_traits<LhsPacketType>::type*)(a));
   }
 
-  template<typename LhsPacketType, typename RhsPacketType, typename ResPacketType, typename TmpType, typename LaneIdType>
-  EIGEN_STRONG_INLINE
-  std::enable_if_t<!is_same<RhsPacketType,RhsPacketx4>::value>
-  madd(const LhsPacketType& a, const RhsPacketType& b, DoublePacket<ResPacketType>& c, TmpType& /*tmp*/, const LaneIdType&) const
-  {
-    c.first   = padd(pmul(a,b.first), c.first);
-    c.second  = padd(pmul(a,b.second),c.second);
+  template <typename LhsPacketType, typename RhsPacketType, typename ResPacketType, typename TmpType,
+            typename LaneIdType>
+  EIGEN_STRONG_INLINE std::enable_if_t<!is_same<RhsPacketType, RhsPacketx4>::value> madd(const LhsPacketType& a,
+                                                                                         const RhsPacketType& b,
+                                                                                         DoublePacket<ResPacketType>& c,
+                                                                                         TmpType& /*tmp*/,
+                                                                                         const LaneIdType&) const {
+    c.first = padd(pmul(a, b.first), c.first);
+    c.second = padd(pmul(a, b.second), c.second);
   }
 
-  template<typename LaneIdType>
-  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacket& b, ResPacket& c, RhsPacket& /*tmp*/, const LaneIdType&) const
-  {
-    c = cj.pmadd(a,b,c);
+  template <typename LaneIdType>
+  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacket& b, ResPacket& c, RhsPacket& /*tmp*/,
+                                const LaneIdType&) const {
+    c = cj.pmadd(a, b, c);
   }
 
-  template<typename LhsPacketType, typename AccPacketType, typename LaneIdType>
-  EIGEN_STRONG_INLINE void madd(const LhsPacketType& a, const RhsPacketx4& b, AccPacketType& c, RhsPacket& tmp, const LaneIdType& lane) const
-  {
+  template <typename LhsPacketType, typename AccPacketType, typename LaneIdType>
+  EIGEN_STRONG_INLINE void madd(const LhsPacketType& a, const RhsPacketx4& b, AccPacketType& c, RhsPacket& tmp,
+                                const LaneIdType& lane) const {
     madd(a, b.get(lane), c, tmp, lane);
   }
-  
+
   EIGEN_STRONG_INLINE void acc(const Scalar& c, const Scalar& alpha, Scalar& r) const { r += alpha * c; }
-  
-  template<typename RealPacketType, typename ResPacketType>
-  EIGEN_STRONG_INLINE void acc(const DoublePacket<RealPacketType>& c, const ResPacketType& alpha, ResPacketType& r) const
-  {
+
+  template <typename RealPacketType, typename ResPacketType>
+  EIGEN_STRONG_INLINE void acc(const DoublePacket<RealPacketType>& c, const ResPacketType& alpha,
+                               ResPacketType& r) const {
     // assemble c
     ResPacketType tmp;
-    if((!ConjLhs)&&(!ConjRhs))
-    {
+    if ((!ConjLhs) && (!ConjRhs)) {
       tmp = pcplxflip(pconj(ResPacketType(c.second)));
-      tmp = padd(ResPacketType(c.first),tmp);
-    }
-    else if((!ConjLhs)&&(ConjRhs))
-    {
+      tmp = padd(ResPacketType(c.first), tmp);
+    } else if ((!ConjLhs) && (ConjRhs)) {
       tmp = pconj(pcplxflip(ResPacketType(c.second)));
-      tmp = padd(ResPacketType(c.first),tmp);
-    }
-    else if((ConjLhs)&&(!ConjRhs))
-    {
+      tmp = padd(ResPacketType(c.first), tmp);
+    } else if ((ConjLhs) && (!ConjRhs)) {
       tmp = pcplxflip(ResPacketType(c.second));
-      tmp = padd(pconj(ResPacketType(c.first)),tmp);
-    }
-    else if((ConjLhs)&&(ConjRhs))
-    {
+      tmp = padd(pconj(ResPacketType(c.first)), tmp);
+    } else if ((ConjLhs) && (ConjRhs)) {
       tmp = pcplxflip(ResPacketType(c.second));
-      tmp = psub(pconj(ResPacketType(c.first)),tmp);
+      tmp = psub(pconj(ResPacketType(c.first)), tmp);
     }
-    
-    r = pmadd(tmp,alpha,r);
+
+    r = pmadd(tmp, alpha, r);
   }
 
-protected:
-  conj_helper<LhsScalar,RhsScalar,ConjLhs,ConjRhs> cj;
+ protected:
+  conj_helper<LhsScalar, RhsScalar, ConjLhs, ConjRhs> cj;
 };
 
-template<typename RealScalar, bool ConjRhs_, int Arch, int PacketSize_>
-class gebp_traits<RealScalar, std::complex<RealScalar>, false, ConjRhs_, Arch, PacketSize_ >
-{
-public:
-  typedef std::complex<RealScalar>  Scalar;
-  typedef RealScalar  LhsScalar;
-  typedef Scalar      RhsScalar;
-  typedef Scalar      ResScalar;
+template <typename RealScalar, bool ConjRhs_, int Arch, int PacketSize_>
+class gebp_traits<RealScalar, std::complex<RealScalar>, false, ConjRhs_, Arch, PacketSize_> {
+ public:
+  typedef std::complex<RealScalar> Scalar;
+  typedef RealScalar LhsScalar;
+  typedef Scalar RhsScalar;
+  typedef Scalar ResScalar;
 
   PACKET_DECL_COND_POSTFIX(_, Lhs, PacketSize_);
   PACKET_DECL_COND_POSTFIX(_, Rhs, PacketSize_);
@@ -954,107 +861,91 @@
   enum {
     ConjLhs = false,
     ConjRhs = ConjRhs_,
-    Vectorizable = unpacket_traits<RealPacket_>::vectorizable
-                && unpacket_traits<ScalarPacket_>::vectorizable,
+    Vectorizable = unpacket_traits<RealPacket_>::vectorizable && unpacket_traits<ScalarPacket_>::vectorizable,
     LhsPacketSize = Vectorizable ? unpacket_traits<LhsPacket_>::size : 1,
     RhsPacketSize = Vectorizable ? unpacket_traits<RhsPacket_>::size : 1,
     ResPacketSize = Vectorizable ? unpacket_traits<ResPacket_>::size : 1,
-    
+
     NumberOfRegisters = EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS,
     // FIXME: should depend on NumberOfRegisters
     nr = 4,
-    mr = (plain_enum_min(16, NumberOfRegisters)/2/nr)*ResPacketSize,
+    mr = (plain_enum_min(16, NumberOfRegisters) / 2 / nr) * ResPacketSize,
 
     LhsProgress = ResPacketSize,
     RhsProgress = 1
   };
 
-  typedef std::conditional_t<Vectorizable,LhsPacket_,LhsScalar> LhsPacket;
-  typedef std::conditional_t<Vectorizable,RhsPacket_,RhsScalar> RhsPacket;
-  typedef std::conditional_t<Vectorizable,ResPacket_,ResScalar> ResPacket;
+  typedef std::conditional_t<Vectorizable, LhsPacket_, LhsScalar> LhsPacket;
+  typedef std::conditional_t<Vectorizable, RhsPacket_, RhsScalar> RhsPacket;
+  typedef std::conditional_t<Vectorizable, ResPacket_, ResScalar> ResPacket;
   typedef LhsPacket LhsPacket4Packing;
   typedef QuadPacket<RhsPacket> RhsPacketx4;
   typedef ResPacket AccPacket;
 
-  EIGEN_STRONG_INLINE void initAcc(AccPacket& p)
-  {
-    p = pset1<ResPacket>(ResScalar(0));
-  }
+  EIGEN_STRONG_INLINE void initAcc(AccPacket& p) { p = pset1<ResPacket>(ResScalar(0)); }
 
-  template<typename RhsPacketType>
-  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacketType& dest) const
-  {
+  template <typename RhsPacketType>
+  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacketType& dest) const {
     dest = pset1<RhsPacketType>(*b);
   }
 
-  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacketx4& dest) const
-  {
+  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacketx4& dest) const {
     pbroadcast4(b, dest.B_0, dest.B1, dest.B2, dest.B3);
   }
 
-  template<typename RhsPacketType>
-  EIGEN_STRONG_INLINE void updateRhs(const RhsScalar* b, RhsPacketType& dest) const
-  {
+  template <typename RhsPacketType>
+  EIGEN_STRONG_INLINE void updateRhs(const RhsScalar* b, RhsPacketType& dest) const {
     loadRhs(b, dest);
   }
 
-  EIGEN_STRONG_INLINE void updateRhs(const RhsScalar*, RhsPacketx4&) const
-  {}
+  EIGEN_STRONG_INLINE void updateRhs(const RhsScalar*, RhsPacketx4&) const {}
 
-  EIGEN_STRONG_INLINE void loadLhs(const LhsScalar* a, LhsPacket& dest) const
-  {
-    dest = ploaddup<LhsPacket>(a);
-  }
-  
-  EIGEN_STRONG_INLINE void loadRhsQuad(const RhsScalar* b, RhsPacket& dest) const
-  {
-    dest = ploadquad<RhsPacket>(b);
-  }
+  EIGEN_STRONG_INLINE void loadLhs(const LhsScalar* a, LhsPacket& dest) const { dest = ploaddup<LhsPacket>(a); }
 
-  template<typename LhsPacketType>
-  EIGEN_STRONG_INLINE void loadLhsUnaligned(const LhsScalar* a, LhsPacketType& dest) const
-  {
+  EIGEN_STRONG_INLINE void loadRhsQuad(const RhsScalar* b, RhsPacket& dest) const { dest = ploadquad<RhsPacket>(b); }
+
+  template <typename LhsPacketType>
+  EIGEN_STRONG_INLINE void loadLhsUnaligned(const LhsScalar* a, LhsPacketType& dest) const {
     dest = ploaddup<LhsPacketType>(a);
   }
 
   template <typename LhsPacketType, typename RhsPacketType, typename AccPacketType, typename LaneIdType>
-  EIGEN_STRONG_INLINE void madd(const LhsPacketType& a, const RhsPacketType& b, AccPacketType& c, RhsPacketType& tmp, const LaneIdType&) const
-  {
-    madd_impl(a, b, c, tmp, std::conditional_t<Vectorizable,true_type,false_type>());
+  EIGEN_STRONG_INLINE void madd(const LhsPacketType& a, const RhsPacketType& b, AccPacketType& c, RhsPacketType& tmp,
+                                const LaneIdType&) const {
+    madd_impl(a, b, c, tmp, std::conditional_t<Vectorizable, true_type, false_type>());
   }
 
   template <typename LhsPacketType, typename RhsPacketType, typename AccPacketType>
-  EIGEN_STRONG_INLINE void madd_impl(const LhsPacketType& a, const RhsPacketType& b, AccPacketType& c, RhsPacketType& tmp, const true_type&) const
-  {
+  EIGEN_STRONG_INLINE void madd_impl(const LhsPacketType& a, const RhsPacketType& b, AccPacketType& c,
+                                     RhsPacketType& tmp, const true_type&) const {
 #ifdef EIGEN_HAS_SINGLE_INSTRUCTION_MADD
     EIGEN_UNUSED_VARIABLE(tmp);
-    c.v = pmadd(a,b.v,c.v);
+    c.v = pmadd(a, b.v, c.v);
 #else
-    tmp = b; tmp.v = pmul(a,tmp.v); c = padd(c,tmp);
+    tmp = b;
+    tmp.v = pmul(a, tmp.v);
+    c = padd(c, tmp);
 #endif
-    
   }
 
-  EIGEN_STRONG_INLINE void madd_impl(const LhsScalar& a, const RhsScalar& b, ResScalar& c, RhsScalar& /*tmp*/, const false_type&) const
-  {
+  EIGEN_STRONG_INLINE void madd_impl(const LhsScalar& a, const RhsScalar& b, ResScalar& c, RhsScalar& /*tmp*/,
+                                     const false_type&) const {
     c += a * b;
   }
 
-  template<typename LhsPacketType, typename AccPacketType, typename LaneIdType>
-  EIGEN_STRONG_INLINE void madd(const LhsPacketType& a, const RhsPacketx4& b, AccPacketType& c, RhsPacket& tmp, const LaneIdType& lane) const
-  {
+  template <typename LhsPacketType, typename AccPacketType, typename LaneIdType>
+  EIGEN_STRONG_INLINE void madd(const LhsPacketType& a, const RhsPacketx4& b, AccPacketType& c, RhsPacket& tmp,
+                                const LaneIdType& lane) const {
     madd(a, b.get(lane), c, tmp, lane);
   }
 
   template <typename ResPacketType, typename AccPacketType>
-  EIGEN_STRONG_INLINE void acc(const AccPacketType& c, const ResPacketType& alpha, ResPacketType& r) const
-  {
-    conj_helper<ResPacketType,ResPacketType,false,ConjRhs> cj;
-    r = cj.pmadd(alpha,c,r);
+  EIGEN_STRONG_INLINE void acc(const AccPacketType& c, const ResPacketType& alpha, ResPacketType& r) const {
+    conj_helper<ResPacketType, ResPacketType, false, ConjRhs> cj;
+    r = cj.pmadd(alpha, c, r);
   }
 
-protected:
-
+ protected:
 };
 
 /* optimized General packed Block * packed Panel product kernel
@@ -1064,13 +955,15 @@
  *  |real |cplx | no vectorization yet, would require to pack A with duplication
  *  |cplx |real | easy vectorization
  */
-template<typename LhsScalar, typename RhsScalar, typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
-struct gebp_kernel
-{
-  typedef gebp_traits<LhsScalar,RhsScalar,ConjugateLhs,ConjugateRhs,Architecture::Target> Traits;
-  typedef gebp_traits<LhsScalar,RhsScalar,ConjugateLhs,ConjugateRhs,Architecture::Target,GEBPPacketHalf> HalfTraits;
-  typedef gebp_traits<LhsScalar,RhsScalar,ConjugateLhs,ConjugateRhs,Architecture::Target,GEBPPacketQuarter> QuarterTraits;
-  
+template <typename LhsScalar, typename RhsScalar, typename Index, typename DataMapper, int mr, int nr,
+          bool ConjugateLhs, bool ConjugateRhs>
+struct gebp_kernel {
+  typedef gebp_traits<LhsScalar, RhsScalar, ConjugateLhs, ConjugateRhs, Architecture::Target> Traits;
+  typedef gebp_traits<LhsScalar, RhsScalar, ConjugateLhs, ConjugateRhs, Architecture::Target, GEBPPacketHalf>
+      HalfTraits;
+  typedef gebp_traits<LhsScalar, RhsScalar, ConjugateLhs, ConjugateRhs, Architecture::Target, GEBPPacketQuarter>
+      QuarterTraits;
+
   typedef typename Traits::ResScalar ResScalar;
   typedef typename Traits::LhsPacket LhsPacket;
   typedef typename Traits::RhsPacket RhsPacket;
@@ -1081,7 +974,7 @@
   typedef typename RhsPanelHelper<RhsPacket, RhsPacketx4, 15>::type RhsPanel15;
   typedef typename RhsPanelHelper<RhsPacket, RhsPacketx4, 27>::type RhsPanel27;
 
-  typedef gebp_traits<RhsScalar,LhsScalar,ConjugateRhs,ConjugateLhs,Architecture::Target> SwappedTraits;
+  typedef gebp_traits<RhsScalar, LhsScalar, ConjugateRhs, ConjugateLhs, Architecture::Target> SwappedTraits;
 
   typedef typename SwappedTraits::ResScalar SResScalar;
   typedef typename SwappedTraits::LhsPacket SLhsPacket;
@@ -1102,28 +995,28 @@
   typedef typename DataMapper::LinearMapper LinearMapper;
 
   enum {
-    Vectorizable  = Traits::Vectorizable,
-    LhsProgress   = Traits::LhsProgress,
-    LhsProgressHalf      = HalfTraits::LhsProgress,
-    LhsProgressQuarter   = QuarterTraits::LhsProgress,
-    RhsProgress   = Traits::RhsProgress,
-    RhsProgressHalf      = HalfTraits::RhsProgress,
-    RhsProgressQuarter   = QuarterTraits::RhsProgress,
+    Vectorizable = Traits::Vectorizable,
+    LhsProgress = Traits::LhsProgress,
+    LhsProgressHalf = HalfTraits::LhsProgress,
+    LhsProgressQuarter = QuarterTraits::LhsProgress,
+    RhsProgress = Traits::RhsProgress,
+    RhsProgressHalf = HalfTraits::RhsProgress,
+    RhsProgressQuarter = QuarterTraits::RhsProgress,
     ResPacketSize = Traits::ResPacketSize
   };
 
-  EIGEN_DONT_INLINE
-  void operator()(const DataMapper& res, const LhsScalar* blockA, const RhsScalar* blockB,
-                  Index rows, Index depth, Index cols, ResScalar alpha,
-                  Index strideA=-1, Index strideB=-1, Index offsetA=0, Index offsetB=0);
+  EIGEN_DONT_INLINE void operator()(const DataMapper& res, const LhsScalar* blockA, const RhsScalar* blockB, Index rows,
+                                    Index depth, Index cols, ResScalar alpha, Index strideA = -1, Index strideB = -1,
+                                    Index offsetA = 0, Index offsetB = 0);
 };
 
-template<typename LhsScalar, typename RhsScalar, typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs,
-int SwappedLhsProgress = gebp_traits<RhsScalar,LhsScalar,ConjugateRhs,ConjugateLhs,Architecture::Target>::LhsProgress>
-struct last_row_process_16_packets
-{
-  typedef gebp_traits<LhsScalar,RhsScalar,ConjugateLhs,ConjugateRhs,Architecture::Target> Traits;
-  typedef gebp_traits<RhsScalar,LhsScalar,ConjugateRhs,ConjugateLhs,Architecture::Target> SwappedTraits;
+template <typename LhsScalar, typename RhsScalar, typename Index, typename DataMapper, int mr, int nr,
+          bool ConjugateLhs, bool ConjugateRhs,
+          int SwappedLhsProgress =
+              gebp_traits<RhsScalar, LhsScalar, ConjugateRhs, ConjugateLhs, Architecture::Target>::LhsProgress>
+struct last_row_process_16_packets {
+  typedef gebp_traits<LhsScalar, RhsScalar, ConjugateLhs, ConjugateRhs, Architecture::Target> Traits;
+  typedef gebp_traits<RhsScalar, LhsScalar, ConjugateRhs, ConjugateLhs, Architecture::Target> SwappedTraits;
 
   typedef typename Traits::ResScalar ResScalar;
   typedef typename SwappedTraits::LhsPacket SLhsPacket;
@@ -1131,28 +1024,27 @@
   typedef typename SwappedTraits::ResPacket SResPacket;
   typedef typename SwappedTraits::AccPacket SAccPacket;
 
-  EIGEN_STRONG_INLINE void operator()(const DataMapper& res, SwappedTraits &straits, const LhsScalar* blA,
-                  const RhsScalar* blB, Index depth, const Index endk, Index i, Index j2,
-                  ResScalar alpha, SAccPacket &C0)
-    {
-      EIGEN_UNUSED_VARIABLE(res);
-      EIGEN_UNUSED_VARIABLE(straits);
-      EIGEN_UNUSED_VARIABLE(blA);
-      EIGEN_UNUSED_VARIABLE(blB);
-      EIGEN_UNUSED_VARIABLE(depth);
-      EIGEN_UNUSED_VARIABLE(endk);
-      EIGEN_UNUSED_VARIABLE(i);
-      EIGEN_UNUSED_VARIABLE(j2);
-      EIGEN_UNUSED_VARIABLE(alpha);
-      EIGEN_UNUSED_VARIABLE(C0);
-    }
+  EIGEN_STRONG_INLINE void operator()(const DataMapper& res, SwappedTraits& straits, const LhsScalar* blA,
+                                      const RhsScalar* blB, Index depth, const Index endk, Index i, Index j2,
+                                      ResScalar alpha, SAccPacket& C0) {
+    EIGEN_UNUSED_VARIABLE(res);
+    EIGEN_UNUSED_VARIABLE(straits);
+    EIGEN_UNUSED_VARIABLE(blA);
+    EIGEN_UNUSED_VARIABLE(blB);
+    EIGEN_UNUSED_VARIABLE(depth);
+    EIGEN_UNUSED_VARIABLE(endk);
+    EIGEN_UNUSED_VARIABLE(i);
+    EIGEN_UNUSED_VARIABLE(j2);
+    EIGEN_UNUSED_VARIABLE(alpha);
+    EIGEN_UNUSED_VARIABLE(C0);
+  }
 };
 
-
-template<typename LhsScalar, typename RhsScalar, typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
-struct last_row_process_16_packets<LhsScalar, RhsScalar, Index, DataMapper,  mr,  nr, ConjugateLhs,  ConjugateRhs, 16> {
-  typedef gebp_traits<LhsScalar,RhsScalar,ConjugateLhs,ConjugateRhs,Architecture::Target> Traits;
-  typedef gebp_traits<RhsScalar,LhsScalar,ConjugateRhs,ConjugateLhs,Architecture::Target> SwappedTraits;
+template <typename LhsScalar, typename RhsScalar, typename Index, typename DataMapper, int mr, int nr,
+          bool ConjugateLhs, bool ConjugateRhs>
+struct last_row_process_16_packets<LhsScalar, RhsScalar, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs, 16> {
+  typedef gebp_traits<LhsScalar, RhsScalar, ConjugateLhs, ConjugateRhs, Architecture::Target> Traits;
+  typedef gebp_traits<RhsScalar, LhsScalar, ConjugateRhs, ConjugateLhs, Architecture::Target> SwappedTraits;
 
   typedef typename Traits::ResScalar ResScalar;
   typedef typename SwappedTraits::LhsPacket SLhsPacket;
@@ -1160,10 +1052,9 @@
   typedef typename SwappedTraits::ResPacket SResPacket;
   typedef typename SwappedTraits::AccPacket SAccPacket;
 
-  EIGEN_STRONG_INLINE void operator()(const DataMapper& res, SwappedTraits &straits, const LhsScalar* blA,
-                  const RhsScalar* blB, Index depth, const Index endk, Index i, Index j2,
-                  ResScalar alpha, SAccPacket &C0)
-  {
+  EIGEN_STRONG_INLINE void operator()(const DataMapper& res, SwappedTraits& straits, const LhsScalar* blA,
+                                      const RhsScalar* blB, Index depth, const Index endk, Index i, Index j2,
+                                      ResScalar alpha, SAccPacket& C0) {
     typedef typename unpacket_traits<typename unpacket_traits<SResPacket>::half>::half SResPacketQuarter;
     typedef typename unpacket_traits<typename unpacket_traits<SLhsPacket>::half>::half SLhsPacketQuarter;
     typedef typename unpacket_traits<typename unpacket_traits<SRhsPacket>::half>::half SRhsPacketQuarter;
@@ -1172,128 +1063,122 @@
     SResPacketQuarter R = res.template gatherPacket<SResPacketQuarter>(i, j2);
     SResPacketQuarter alphav = pset1<SResPacketQuarter>(alpha);
 
-    if (depth - endk > 0)
-      {
-	// We have to handle the last row(s) of the rhs, which
-	// correspond to a half-packet
-	SAccPacketQuarter c0 = predux_half_dowto4(predux_half_dowto4(C0));
+    if (depth - endk > 0) {
+      // We have to handle the last row(s) of the rhs, which
+      // correspond to a half-packet
+      SAccPacketQuarter c0 = predux_half_dowto4(predux_half_dowto4(C0));
 
-	for (Index kk = endk; kk < depth; kk++)
-	  {
-	    SLhsPacketQuarter a0;
-	    SRhsPacketQuarter b0;
-	    straits.loadLhsUnaligned(blB, a0);
-	    straits.loadRhs(blA, b0);
-	    straits.madd(a0,b0,c0,b0, fix<0>);
-	    blB += SwappedTraits::LhsProgress/4;
-	    blA += 1;
-	  }
-	straits.acc(c0, alphav, R);
+      for (Index kk = endk; kk < depth; kk++) {
+        SLhsPacketQuarter a0;
+        SRhsPacketQuarter b0;
+        straits.loadLhsUnaligned(blB, a0);
+        straits.loadRhs(blA, b0);
+        straits.madd(a0, b0, c0, b0, fix<0>);
+        blB += SwappedTraits::LhsProgress / 4;
+        blA += 1;
       }
-    else
-      {
-	straits.acc(predux_half_dowto4(predux_half_dowto4(C0)), alphav, R);
-      }
+      straits.acc(c0, alphav, R);
+    } else {
+      straits.acc(predux_half_dowto4(predux_half_dowto4(C0)), alphav, R);
+    }
     res.scatterPacket(i, j2, R);
   }
 };
 
-template<int nr, Index LhsProgress, Index RhsProgress, typename LhsScalar, typename RhsScalar, typename ResScalar, typename AccPacket, typename LhsPacket, typename RhsPacket, typename ResPacket, typename GEBPTraits, typename LinearMapper, typename DataMapper>
-struct lhs_process_one_packet
-{
+template <int nr, Index LhsProgress, Index RhsProgress, typename LhsScalar, typename RhsScalar, typename ResScalar,
+          typename AccPacket, typename LhsPacket, typename RhsPacket, typename ResPacket, typename GEBPTraits,
+          typename LinearMapper, typename DataMapper>
+struct lhs_process_one_packet {
   typedef typename GEBPTraits::RhsPacketx4 RhsPacketx4;
 
-  EIGEN_STRONG_INLINE void peeled_kc_onestep(Index K, const LhsScalar* blA, const RhsScalar* blB, GEBPTraits traits, LhsPacket *A0, RhsPacketx4 *rhs_panel, RhsPacket *T0, AccPacket *C0, AccPacket *C1, AccPacket *C2, AccPacket *C3)
-  {
+  EIGEN_STRONG_INLINE void peeled_kc_onestep(Index K, const LhsScalar* blA, const RhsScalar* blB, GEBPTraits traits,
+                                             LhsPacket* A0, RhsPacketx4* rhs_panel, RhsPacket* T0, AccPacket* C0,
+                                             AccPacket* C1, AccPacket* C2, AccPacket* C3) {
     EIGEN_ASM_COMMENT("begin step of gebp micro kernel 1X4");
     EIGEN_ASM_COMMENT("Note: these asm comments work around bug 935!");
-    traits.loadLhs(&blA[(0+1*K)*LhsProgress], *A0);
-    traits.loadRhs(&blB[(0+4*K)*RhsProgress], *rhs_panel);
+    traits.loadLhs(&blA[(0 + 1 * K) * LhsProgress], *A0);
+    traits.loadRhs(&blB[(0 + 4 * K) * RhsProgress], *rhs_panel);
     traits.madd(*A0, *rhs_panel, *C0, *T0, fix<0>);
     traits.madd(*A0, *rhs_panel, *C1, *T0, fix<1>);
     traits.madd(*A0, *rhs_panel, *C2, *T0, fix<2>);
     traits.madd(*A0, *rhs_panel, *C3, *T0, fix<3>);
-    #if EIGEN_GNUC_STRICT_AT_LEAST(6,0,0) && defined(EIGEN_VECTORIZE_SSE) && !(EIGEN_COMP_LCC)
-    __asm__  ("" : "+x,m" (*A0));
-    #endif
+#if EIGEN_GNUC_STRICT_AT_LEAST(6, 0, 0) && defined(EIGEN_VECTORIZE_SSE) && !(EIGEN_COMP_LCC)
+    __asm__("" : "+x,m"(*A0));
+#endif
     EIGEN_ASM_COMMENT("end step of gebp micro kernel 1X4");
   }
 
-  EIGEN_STRONG_INLINE void operator()(
-    const DataMapper& res, const LhsScalar* blockA, const RhsScalar* blockB, ResScalar alpha,
-    Index peelStart, Index peelEnd, Index strideA, Index strideB, Index offsetA, Index offsetB,
-    int prefetch_res_offset, Index peeled_kc, Index pk, Index cols, Index depth, Index packet_cols4)
-  {
+  EIGEN_STRONG_INLINE void operator()(const DataMapper& res, const LhsScalar* blockA, const RhsScalar* blockB,
+                                      ResScalar alpha, Index peelStart, Index peelEnd, Index strideA, Index strideB,
+                                      Index offsetA, Index offsetB, int prefetch_res_offset, Index peeled_kc, Index pk,
+                                      Index cols, Index depth, Index packet_cols4) {
     GEBPTraits traits;
-    Index packet_cols8 = nr>=8 ? (cols/8) * 8 : 0;
+    Index packet_cols8 = nr >= 8 ? (cols / 8) * 8 : 0;
     // loops on each largest micro horizontal panel of lhs
     // (LhsProgress x depth)
-    for(Index i=peelStart; i<peelEnd; i+=LhsProgress)
-    {
+    for (Index i = peelStart; i < peelEnd; i += LhsProgress) {
 #if EIGEN_ARCH_ARM64
-      EIGEN_IF_CONSTEXPR(nr>=8) {
-      for(Index j2=0; j2<packet_cols8; j2+=8)
-      {
-        const LhsScalar* blA = &blockA[i*strideA+offsetA*(LhsProgress)];
-        prefetch(&blA[0]);
+      EIGEN_IF_CONSTEXPR(nr >= 8) {
+        for (Index j2 = 0; j2 < packet_cols8; j2 += 8) {
+          const LhsScalar* blA = &blockA[i * strideA + offsetA * (LhsProgress)];
+          prefetch(&blA[0]);
 
-        // gets res block as register
-        AccPacket C0, C1, C2, C3, C4, C5, C6, C7;
-        traits.initAcc(C0);
-        traits.initAcc(C1);
-        traits.initAcc(C2);
-        traits.initAcc(C3);
-        traits.initAcc(C4);
-        traits.initAcc(C5);
-        traits.initAcc(C6);
-        traits.initAcc(C7);
+          // gets res block as register
+          AccPacket C0, C1, C2, C3, C4, C5, C6, C7;
+          traits.initAcc(C0);
+          traits.initAcc(C1);
+          traits.initAcc(C2);
+          traits.initAcc(C3);
+          traits.initAcc(C4);
+          traits.initAcc(C5);
+          traits.initAcc(C6);
+          traits.initAcc(C7);
 
-        LinearMapper r0 = res.getLinearMapper(i, j2 + 0);
-        LinearMapper r1 = res.getLinearMapper(i, j2 + 1);
-        LinearMapper r2 = res.getLinearMapper(i, j2 + 2);
-        LinearMapper r3 = res.getLinearMapper(i, j2 + 3);
-        LinearMapper r4 = res.getLinearMapper(i, j2 + 4);
-        LinearMapper r5 = res.getLinearMapper(i, j2 + 5);
-        LinearMapper r6 = res.getLinearMapper(i, j2 + 6);
-        LinearMapper r7 = res.getLinearMapper(i, j2 + 7);
-        r0.prefetch(prefetch_res_offset);
-        r1.prefetch(prefetch_res_offset);
-        r2.prefetch(prefetch_res_offset);
-        r3.prefetch(prefetch_res_offset);
-        r4.prefetch(prefetch_res_offset);
-        r5.prefetch(prefetch_res_offset);
-        r6.prefetch(prefetch_res_offset);
-        r7.prefetch(prefetch_res_offset);
-        const RhsScalar* blB = &blockB[j2*strideB+offsetB*8];
-        prefetch(&blB[0]);
+          LinearMapper r0 = res.getLinearMapper(i, j2 + 0);
+          LinearMapper r1 = res.getLinearMapper(i, j2 + 1);
+          LinearMapper r2 = res.getLinearMapper(i, j2 + 2);
+          LinearMapper r3 = res.getLinearMapper(i, j2 + 3);
+          LinearMapper r4 = res.getLinearMapper(i, j2 + 4);
+          LinearMapper r5 = res.getLinearMapper(i, j2 + 5);
+          LinearMapper r6 = res.getLinearMapper(i, j2 + 6);
+          LinearMapper r7 = res.getLinearMapper(i, j2 + 7);
+          r0.prefetch(prefetch_res_offset);
+          r1.prefetch(prefetch_res_offset);
+          r2.prefetch(prefetch_res_offset);
+          r3.prefetch(prefetch_res_offset);
+          r4.prefetch(prefetch_res_offset);
+          r5.prefetch(prefetch_res_offset);
+          r6.prefetch(prefetch_res_offset);
+          r7.prefetch(prefetch_res_offset);
+          const RhsScalar* blB = &blockB[j2 * strideB + offsetB * 8];
+          prefetch(&blB[0]);
 
-        LhsPacket A0;
-        for(Index k=0; k<peeled_kc; k+=pk)
-        {
+          LhsPacket A0;
+          for (Index k = 0; k < peeled_kc; k += pk) {
             RhsPacketx4 rhs_panel;
             RhsPacket T0;
-#define EIGEN_GEBGP_ONESTEP(K)                                                \
-            do {                                                              \
-                EIGEN_ASM_COMMENT("begin step of gebp micro kernel 1pX8");    \
-                traits.loadLhs(&blA[(0 + 1 * K) * LhsProgress], A0);          \
-                traits.loadRhs(&blB[(0 + 8 * K) * RhsProgress], rhs_panel);   \
-                traits.madd(A0, rhs_panel, C0, T0, fix<0>);                   \
-                traits.updateRhs(&blB[(1 + 8 * K) * RhsProgress], rhs_panel); \
-                traits.madd(A0, rhs_panel, C1, T0, fix<1>);                   \
-                traits.updateRhs(&blB[(2 + 8 * K) * RhsProgress], rhs_panel); \
-                traits.madd(A0, rhs_panel, C2, T0, fix<2>);                   \
-                traits.updateRhs(&blB[(3 + 8 * K) * RhsProgress], rhs_panel); \
-                traits.madd(A0, rhs_panel, C3, T0, fix<3>);                   \
-                traits.loadRhs(&blB[(4 + 8 * K) * RhsProgress], rhs_panel);   \
-                traits.madd(A0, rhs_panel, C4, T0, fix<0>);                   \
-                traits.updateRhs(&blB[(5 + 8 * K) * RhsProgress], rhs_panel); \
-                traits.madd(A0, rhs_panel, C5, T0, fix<1>);                   \
-                traits.updateRhs(&blB[(6 + 8 * K) * RhsProgress], rhs_panel); \
-                traits.madd(A0, rhs_panel, C6, T0, fix<2>);                   \
-                traits.updateRhs(&blB[(7 + 8 * K) * RhsProgress], rhs_panel); \
-                traits.madd(A0, rhs_panel, C7, T0, fix<3>);                   \
-                EIGEN_ASM_COMMENT("end step of gebp micro kernel 1pX8");      \
-            } while (false)
+#define EIGEN_GEBGP_ONESTEP(K)                                    \
+  do {                                                            \
+    EIGEN_ASM_COMMENT("begin step of gebp micro kernel 1pX8");    \
+    traits.loadLhs(&blA[(0 + 1 * K) * LhsProgress], A0);          \
+    traits.loadRhs(&blB[(0 + 8 * K) * RhsProgress], rhs_panel);   \
+    traits.madd(A0, rhs_panel, C0, T0, fix<0>);                   \
+    traits.updateRhs(&blB[(1 + 8 * K) * RhsProgress], rhs_panel); \
+    traits.madd(A0, rhs_panel, C1, T0, fix<1>);                   \
+    traits.updateRhs(&blB[(2 + 8 * K) * RhsProgress], rhs_panel); \
+    traits.madd(A0, rhs_panel, C2, T0, fix<2>);                   \
+    traits.updateRhs(&blB[(3 + 8 * K) * RhsProgress], rhs_panel); \
+    traits.madd(A0, rhs_panel, C3, T0, fix<3>);                   \
+    traits.loadRhs(&blB[(4 + 8 * K) * RhsProgress], rhs_panel);   \
+    traits.madd(A0, rhs_panel, C4, T0, fix<0>);                   \
+    traits.updateRhs(&blB[(5 + 8 * K) * RhsProgress], rhs_panel); \
+    traits.madd(A0, rhs_panel, C5, T0, fix<1>);                   \
+    traits.updateRhs(&blB[(6 + 8 * K) * RhsProgress], rhs_panel); \
+    traits.madd(A0, rhs_panel, C6, T0, fix<2>);                   \
+    traits.updateRhs(&blB[(7 + 8 * K) * RhsProgress], rhs_panel); \
+    traits.madd(A0, rhs_panel, C7, T0, fix<3>);                   \
+    EIGEN_ASM_COMMENT("end step of gebp micro kernel 1pX8");      \
+  } while (false)
 
             EIGEN_ASM_COMMENT("begin gebp micro kernel 1pX8");
 
@@ -1306,19 +1191,18 @@
             EIGEN_GEBGP_ONESTEP(6);
             EIGEN_GEBGP_ONESTEP(7);
 
-            blB += pk*8*RhsProgress;
-            blA += pk*(1*LhsProgress);
+            blB += pk * 8 * RhsProgress;
+            blA += pk * (1 * LhsProgress);
 
             EIGEN_ASM_COMMENT("end gebp micro kernel 1pX8");
           }
           // process remaining peeled loop
-          for(Index k=peeled_kc; k<depth; k++)
-          {
+          for (Index k = peeled_kc; k < depth; k++) {
             RhsPacketx4 rhs_panel;
             RhsPacket T0;
             EIGEN_GEBGP_ONESTEP(0);
-            blB += 8*RhsProgress;
-            blA += 1*LhsProgress;
+            blB += 8 * RhsProgress;
+            blA += 1 * LhsProgress;
           }
 
 #undef EIGEN_GEBGP_ONESTEP
@@ -1335,15 +1219,15 @@
 
           R0 = r2.template loadPacket<ResPacket>(0);
           R1 = r3.template loadPacket<ResPacket>(0);
-          traits.acc(C2,  alphav, R0);
-          traits.acc(C3,  alphav, R1);
+          traits.acc(C2, alphav, R0);
+          traits.acc(C3, alphav, R1);
           r2.storePacket(0, R0);
           r3.storePacket(0, R1);
 
           R0 = r4.template loadPacket<ResPacket>(0);
           R1 = r5.template loadPacket<ResPacket>(0);
-          traits.acc(C4,  alphav, R0);
-          traits.acc(C5,  alphav, R1);
+          traits.acc(C4, alphav, R0);
+          traits.acc(C5, alphav, R1);
           r4.storePacket(0, R0);
           r5.storePacket(0, R1);
 
@@ -1353,17 +1237,16 @@
           traits.acc(C7, alphav, R1);
           r6.storePacket(0, R0);
           r7.storePacket(0, R1);
-      }
+        }
       }
 #endif
-      
+
       // loops on each largest micro vertical panel of rhs (depth * nr)
-      for(Index j2=packet_cols8; j2<packet_cols4; j2+=4)
-      {
+      for (Index j2 = packet_cols8; j2 < packet_cols4; j2 += 4) {
         // We select a LhsProgress x nr micro block of res
         // which is entirely stored into 1 x nr registers.
 
-        const LhsScalar* blA = &blockA[i*strideA+offsetA*(LhsProgress)];
+        const LhsScalar* blA = &blockA[i * strideA + offsetA * (LhsProgress)];
         prefetch(&blA[0]);
 
         // gets res block as register
@@ -1374,7 +1257,7 @@
         traits.initAcc(C3);
         // To improve instruction pipelining, let's double the accumulation registers:
         //  even k will accumulate in C*, while odd k will accumulate in D*.
-        // This trick is crutial to get good performance with FMA, otherwise it is 
+        // This trick is crutial to get good performance with FMA, otherwise it is
         // actually faster to perform separated MUL+ADD because of a naturally
         // better instruction-level parallelism.
         AccPacket D0, D1, D2, D3;
@@ -1394,44 +1277,42 @@
         r3.prefetch(prefetch_res_offset);
 
         // performs "inner" products
-        const RhsScalar* blB = &blockB[j2*strideB+offsetB*4];
+        const RhsScalar* blB = &blockB[j2 * strideB + offsetB * 4];
         prefetch(&blB[0]);
         LhsPacket A0, A1;
 
-        for(Index k=0; k<peeled_kc; k+=pk)
-        {
+        for (Index k = 0; k < peeled_kc; k += pk) {
           EIGEN_ASM_COMMENT("begin gebp micro kernel 1/half/quarterX4");
           RhsPacketx4 rhs_panel;
           RhsPacket T0;
 
-          internal::prefetch(blB+(48+0));
+          internal::prefetch(blB + (48 + 0));
           peeled_kc_onestep(0, blA, blB, traits, &A0, &rhs_panel, &T0, &C0, &C1, &C2, &C3);
           peeled_kc_onestep(1, blA, blB, traits, &A1, &rhs_panel, &T0, &D0, &D1, &D2, &D3);
           peeled_kc_onestep(2, blA, blB, traits, &A0, &rhs_panel, &T0, &C0, &C1, &C2, &C3);
           peeled_kc_onestep(3, blA, blB, traits, &A1, &rhs_panel, &T0, &D0, &D1, &D2, &D3);
-          internal::prefetch(blB+(48+16));
+          internal::prefetch(blB + (48 + 16));
           peeled_kc_onestep(4, blA, blB, traits, &A0, &rhs_panel, &T0, &C0, &C1, &C2, &C3);
           peeled_kc_onestep(5, blA, blB, traits, &A1, &rhs_panel, &T0, &D0, &D1, &D2, &D3);
           peeled_kc_onestep(6, blA, blB, traits, &A0, &rhs_panel, &T0, &C0, &C1, &C2, &C3);
           peeled_kc_onestep(7, blA, blB, traits, &A1, &rhs_panel, &T0, &D0, &D1, &D2, &D3);
 
-          blB += pk*4*RhsProgress;
-          blA += pk*LhsProgress;
+          blB += pk * 4 * RhsProgress;
+          blA += pk * LhsProgress;
 
           EIGEN_ASM_COMMENT("end gebp micro kernel 1/half/quarterX4");
         }
-        C0 = padd(C0,D0);
-        C1 = padd(C1,D1);
-        C2 = padd(C2,D2);
-        C3 = padd(C3,D3);
+        C0 = padd(C0, D0);
+        C1 = padd(C1, D1);
+        C2 = padd(C2, D2);
+        C3 = padd(C3, D3);
 
         // process remaining peeled loop
-        for(Index k=peeled_kc; k<depth; k++)
-        {
+        for (Index k = peeled_kc; k < depth; k++) {
           RhsPacketx4 rhs_panel;
           RhsPacket T0;
           peeled_kc_onestep(0, blA, blB, traits, &A0, &rhs_panel, &T0, &C0, &C1, &C2, &C3);
-          blB += 4*RhsProgress;
+          blB += 4 * RhsProgress;
           blA += LhsProgress;
         }
 
@@ -1441,23 +1322,22 @@
         R0 = r0.template loadPacket<ResPacket>(0);
         R1 = r1.template loadPacket<ResPacket>(0);
         traits.acc(C0, alphav, R0);
-        traits.acc(C1,  alphav, R1);
+        traits.acc(C1, alphav, R1);
         r0.storePacket(0, R0);
         r1.storePacket(0, R1);
 
         R0 = r2.template loadPacket<ResPacket>(0);
         R1 = r3.template loadPacket<ResPacket>(0);
-        traits.acc(C2,  alphav, R0);
-        traits.acc(C3,  alphav, R1);
+        traits.acc(C2, alphav, R0);
+        traits.acc(C3, alphav, R1);
         r2.storePacket(0, R0);
         r3.storePacket(0, R1);
       }
 
       // Deal with remaining columns of the rhs
-      for(Index j2=packet_cols4; j2<cols; j2++)
-      {
+      for (Index j2 = packet_cols4; j2 < cols; j2++) {
         // One column at a time
-        const LhsScalar* blA = &blockA[i*strideA+offsetA*(LhsProgress)];
+        const LhsScalar* blA = &blockA[i * strideA + offsetA * (LhsProgress)];
         prefetch(&blA[0]);
 
         // gets res block as register
@@ -1467,24 +1347,23 @@
         LinearMapper r0 = res.getLinearMapper(i, j2);
 
         // performs "inner" products
-        const RhsScalar* blB = &blockB[j2*strideB+offsetB];
+        const RhsScalar* blB = &blockB[j2 * strideB + offsetB];
         LhsPacket A0;
 
-        for(Index k= 0; k<peeled_kc; k+=pk)
-        {
+        for (Index k = 0; k < peeled_kc; k += pk) {
           EIGEN_ASM_COMMENT("begin gebp micro kernel 1/half/quarterX1");
           RhsPacket B_0;
 
-#define EIGEN_GEBGP_ONESTEP(K)                                          \
-	      do {                                                      \
-		EIGEN_ASM_COMMENT("begin step of gebp micro kernel 1/half/quarterX1"); \
-		EIGEN_ASM_COMMENT("Note: these asm comments work around bug 935!"); \
-    /* FIXME: why unaligned???? */ \
-		traits.loadLhsUnaligned(&blA[(0+1*K)*LhsProgress], A0); \
-		traits.loadRhs(&blB[(0+K)*RhsProgress], B_0);		\
-		traits.madd(A0, B_0, C0, B_0, fix<0>);				\
-		EIGEN_ASM_COMMENT("end step of gebp micro kernel 1/half/quarterX1"); \
-	      } while(false);
+#define EIGEN_GEBGP_ONESTEP(K)                                             \
+  do {                                                                     \
+    EIGEN_ASM_COMMENT("begin step of gebp micro kernel 1/half/quarterX1"); \
+    EIGEN_ASM_COMMENT("Note: these asm comments work around bug 935!");    \
+    /* FIXME: why unaligned???? */                                         \
+    traits.loadLhsUnaligned(&blA[(0 + 1 * K) * LhsProgress], A0);          \
+    traits.loadRhs(&blB[(0 + K) * RhsProgress], B_0);                      \
+    traits.madd(A0, B_0, C0, B_0, fix<0>);                                 \
+    EIGEN_ASM_COMMENT("end step of gebp micro kernel 1/half/quarterX1");   \
+  } while (false);
 
           EIGEN_GEBGP_ONESTEP(0);
           EIGEN_GEBGP_ONESTEP(1);
@@ -1495,15 +1374,14 @@
           EIGEN_GEBGP_ONESTEP(6);
           EIGEN_GEBGP_ONESTEP(7);
 
-          blB += pk*RhsProgress;
-          blA += pk*LhsProgress;
+          blB += pk * RhsProgress;
+          blA += pk * LhsProgress;
 
           EIGEN_ASM_COMMENT("end gebp micro kernel 1/half/quarterX1");
         }
 
         // process remaining peeled loop
-        for(Index k=peeled_kc; k<depth; k++)
-        {
+        for (Index k = peeled_kc; k < depth; k++) {
           RhsPacket B_0;
           EIGEN_GEBGP_ONESTEP(0);
           blB += RhsProgress;
@@ -1520,85 +1398,108 @@
   }
 };
 
-template<int nr, Index LhsProgress, Index RhsProgress, typename LhsScalar, typename RhsScalar, typename ResScalar, typename AccPacket, typename LhsPacket, typename RhsPacket, typename ResPacket, typename GEBPTraits, typename LinearMapper, typename DataMapper>
-struct lhs_process_fraction_of_packet : lhs_process_one_packet<nr, LhsProgress, RhsProgress, LhsScalar, RhsScalar, ResScalar, AccPacket, LhsPacket, RhsPacket, ResPacket, GEBPTraits, LinearMapper, DataMapper>
-{
-
-EIGEN_STRONG_INLINE void peeled_kc_onestep(Index K, const LhsScalar* blA, const RhsScalar* blB, GEBPTraits traits, LhsPacket *A0, RhsPacket *B_0, RhsPacket *B1, RhsPacket *B2, RhsPacket *B3, AccPacket *C0, AccPacket *C1, AccPacket *C2, AccPacket *C3)
-  {
-        EIGEN_ASM_COMMENT("begin step of gebp micro kernel 1X4");
-        EIGEN_ASM_COMMENT("Note: these asm comments work around bug 935!");
-        traits.loadLhsUnaligned(&blA[(0+1*K)*(LhsProgress)], *A0);
-        traits.broadcastRhs(&blB[(0+4*K)*RhsProgress], *B_0, *B1, *B2, *B3);
-        traits.madd(*A0, *B_0, *C0, *B_0);
-        traits.madd(*A0, *B1,  *C1, *B1);
-        traits.madd(*A0, *B2,  *C2, *B2);
-        traits.madd(*A0, *B3,  *C3, *B3);
-        EIGEN_ASM_COMMENT("end step of gebp micro kernel 1X4");
+template <int nr, Index LhsProgress, Index RhsProgress, typename LhsScalar, typename RhsScalar, typename ResScalar,
+          typename AccPacket, typename LhsPacket, typename RhsPacket, typename ResPacket, typename GEBPTraits,
+          typename LinearMapper, typename DataMapper>
+struct lhs_process_fraction_of_packet
+    : lhs_process_one_packet<nr, LhsProgress, RhsProgress, LhsScalar, RhsScalar, ResScalar, AccPacket, LhsPacket,
+                             RhsPacket, ResPacket, GEBPTraits, LinearMapper, DataMapper> {
+  EIGEN_STRONG_INLINE void peeled_kc_onestep(Index K, const LhsScalar* blA, const RhsScalar* blB, GEBPTraits traits,
+                                             LhsPacket* A0, RhsPacket* B_0, RhsPacket* B1, RhsPacket* B2, RhsPacket* B3,
+                                             AccPacket* C0, AccPacket* C1, AccPacket* C2, AccPacket* C3) {
+    EIGEN_ASM_COMMENT("begin step of gebp micro kernel 1X4");
+    EIGEN_ASM_COMMENT("Note: these asm comments work around bug 935!");
+    traits.loadLhsUnaligned(&blA[(0 + 1 * K) * (LhsProgress)], *A0);
+    traits.broadcastRhs(&blB[(0 + 4 * K) * RhsProgress], *B_0, *B1, *B2, *B3);
+    traits.madd(*A0, *B_0, *C0, *B_0);
+    traits.madd(*A0, *B1, *C1, *B1);
+    traits.madd(*A0, *B2, *C2, *B2);
+    traits.madd(*A0, *B3, *C3, *B3);
+    EIGEN_ASM_COMMENT("end step of gebp micro kernel 1X4");
   }
 };
 
-template<typename LhsScalar, typename RhsScalar, typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
-EIGEN_DONT_INLINE
-void gebp_kernel<LhsScalar,RhsScalar,Index,DataMapper,mr,nr,ConjugateLhs,ConjugateRhs>
-  ::operator()(const DataMapper& res, const LhsScalar* blockA, const RhsScalar* blockB,
-               Index rows, Index depth, Index cols, ResScalar alpha,
-               Index strideA, Index strideB, Index offsetA, Index offsetB)
-  {
-    Traits traits;
-    SwappedTraits straits;
-    
-    if(strideA==-1) strideA = depth;
-    if(strideB==-1) strideB = depth;
-    conj_helper<LhsScalar,RhsScalar,ConjugateLhs,ConjugateRhs> cj;
-    Index packet_cols4 = nr>=4 ? (cols/4) * 4 : 0;
-    Index packet_cols8 = nr>=8 ? (cols/8) * 8 : 0;
-    const Index peeled_mc3 = mr>=3*Traits::LhsProgress ? (rows/(3*LhsProgress))*(3*LhsProgress) : 0;
-    const Index peeled_mc2 = mr>=2*Traits::LhsProgress ? peeled_mc3+((rows-peeled_mc3)/(2*LhsProgress))*(2*LhsProgress) : 0;
-    const Index peeled_mc1 = mr>=1*Traits::LhsProgress ? peeled_mc2+((rows-peeled_mc2)/(1*LhsProgress))*(1*LhsProgress) : 0;
-    const Index peeled_mc_half = mr>=LhsProgressHalf ? peeled_mc1+((rows-peeled_mc1)/(LhsProgressHalf))*(LhsProgressHalf) : 0;
-    const Index peeled_mc_quarter = mr>=LhsProgressQuarter ? peeled_mc_half+((rows-peeled_mc_half)/(LhsProgressQuarter))*(LhsProgressQuarter) : 0;
-    enum { pk = 8 }; // NOTE Such a large peeling factor is important for large matrices (~ +5% when >1000 on Haswell)
-    const Index peeled_kc  = depth & ~(pk-1);
-    const int prefetch_res_offset = 32/sizeof(ResScalar);    
-//     const Index depth2     = depth & ~1;
+template <typename LhsScalar, typename RhsScalar, typename Index, typename DataMapper, int mr, int nr,
+          bool ConjugateLhs, bool ConjugateRhs>
+EIGEN_DONT_INLINE void gebp_kernel<LhsScalar, RhsScalar, Index, DataMapper, mr, nr, ConjugateLhs,
+                                   ConjugateRhs>::operator()(const DataMapper& res, const LhsScalar* blockA,
+                                                             const RhsScalar* blockB, Index rows, Index depth,
+                                                             Index cols, ResScalar alpha, Index strideA, Index strideB,
+                                                             Index offsetA, Index offsetB) {
+  Traits traits;
+  SwappedTraits straits;
 
-    //---------- Process 3 * LhsProgress rows at once ----------
-    // This corresponds to 3*LhsProgress x nr register blocks.
-    // Usually, make sense only with FMA
-    if(mr>=3*Traits::LhsProgress)
-    {
-      // Here, the general idea is to loop on each largest micro horizontal panel of the lhs (3*Traits::LhsProgress x depth)
-      // and on each largest micro vertical panel of the rhs (depth * nr).
-      // Blocking sizes, i.e., 'depth' has been computed so that the micro horizontal panel of the lhs fit in L1.
-      // However, if depth is too small, we can extend the number of rows of these horizontal panels.
-      // This actual number of rows is computed as follow:
-      const Index l1 = defaultL1CacheSize; // in Bytes, TODO, l1 should be passed to this function.
-      // The max(1, ...) here is needed because we may be using blocking params larger than what our known l1 cache size
-      // suggests we should be using: either because our known l1 cache size is inaccurate (e.g. on Android, we can only guess),
-      // or because we are testing specific blocking sizes.
-      const Index actual_panel_rows = (3*LhsProgress) * std::max<Index>(1,( (l1 - sizeof(ResScalar)*mr*nr - depth*nr*sizeof(RhsScalar)) / (depth * sizeof(LhsScalar) * 3*LhsProgress) ));
-      for(Index i1=0; i1<peeled_mc3; i1+=actual_panel_rows)
-      {
-        const Index actual_panel_end = (std::min)(i1+actual_panel_rows, peeled_mc3);
+  if (strideA == -1) strideA = depth;
+  if (strideB == -1) strideB = depth;
+  conj_helper<LhsScalar, RhsScalar, ConjugateLhs, ConjugateRhs> cj;
+  Index packet_cols4 = nr >= 4 ? (cols / 4) * 4 : 0;
+  Index packet_cols8 = nr >= 8 ? (cols / 8) * 8 : 0;
+  const Index peeled_mc3 = mr >= 3 * Traits::LhsProgress ? (rows / (3 * LhsProgress)) * (3 * LhsProgress) : 0;
+  const Index peeled_mc2 =
+      mr >= 2 * Traits::LhsProgress ? peeled_mc3 + ((rows - peeled_mc3) / (2 * LhsProgress)) * (2 * LhsProgress) : 0;
+  const Index peeled_mc1 =
+      mr >= 1 * Traits::LhsProgress ? peeled_mc2 + ((rows - peeled_mc2) / (1 * LhsProgress)) * (1 * LhsProgress) : 0;
+  const Index peeled_mc_half =
+      mr >= LhsProgressHalf ? peeled_mc1 + ((rows - peeled_mc1) / (LhsProgressHalf)) * (LhsProgressHalf) : 0;
+  const Index peeled_mc_quarter =
+      mr >= LhsProgressQuarter
+          ? peeled_mc_half + ((rows - peeled_mc_half) / (LhsProgressQuarter)) * (LhsProgressQuarter)
+          : 0;
+  enum { pk = 8 };  // NOTE Such a large peeling factor is important for large matrices (~ +5% when >1000 on Haswell)
+  const Index peeled_kc = depth & ~(pk - 1);
+  const int prefetch_res_offset = 32 / sizeof(ResScalar);
+  //     const Index depth2     = depth & ~1;
+
+  //---------- Process 3 * LhsProgress rows at once ----------
+  // This corresponds to 3*LhsProgress x nr register blocks.
+  // Usually, make sense only with FMA
+  if (mr >= 3 * Traits::LhsProgress) {
+    // Here, the general idea is to loop on each largest micro horizontal panel of the lhs (3*Traits::LhsProgress x
+    // depth) and on each largest micro vertical panel of the rhs (depth * nr). Blocking sizes, i.e., 'depth' has been
+    // computed so that the micro horizontal panel of the lhs fit in L1. However, if depth is too small, we can extend
+    // the number of rows of these horizontal panels. This actual number of rows is computed as follow:
+    const Index l1 = defaultL1CacheSize;  // in Bytes, TODO, l1 should be passed to this function.
+    // The max(1, ...) here is needed because we may be using blocking params larger than what our known l1 cache size
+    // suggests we should be using: either because our known l1 cache size is inaccurate (e.g. on Android, we can only
+    // guess), or because we are testing specific blocking sizes.
+    const Index actual_panel_rows =
+        (3 * LhsProgress) * std::max<Index>(1, ((l1 - sizeof(ResScalar) * mr * nr - depth * nr * sizeof(RhsScalar)) /
+                                                (depth * sizeof(LhsScalar) * 3 * LhsProgress)));
+    for (Index i1 = 0; i1 < peeled_mc3; i1 += actual_panel_rows) {
+      const Index actual_panel_end = (std::min)(i1 + actual_panel_rows, peeled_mc3);
 #if EIGEN_ARCH_ARM64
-        EIGEN_IF_CONSTEXPR(nr>=8) {
-        for(Index j2=0; j2<packet_cols8; j2+=8)
-        {
-          for(Index i=i1; i<actual_panel_end; i+=3*LhsProgress)
-          {
-            const LhsScalar* blA = &blockA[i*strideA+offsetA*(3*LhsProgress)];
+      EIGEN_IF_CONSTEXPR(nr >= 8) {
+        for (Index j2 = 0; j2 < packet_cols8; j2 += 8) {
+          for (Index i = i1; i < actual_panel_end; i += 3 * LhsProgress) {
+            const LhsScalar* blA = &blockA[i * strideA + offsetA * (3 * LhsProgress)];
             prefetch(&blA[0]);
             // gets res block as register
-            AccPacket C0, C1, C2, C3, C4, C5, C6, C7,
-                      C8, C9, C10, C11, C12, C13, C14, C15,
-                      C16, C17, C18, C19, C20, C21, C22, C23;
-            traits.initAcc(C0);  traits.initAcc(C1);  traits.initAcc(C2);  traits.initAcc(C3);
-            traits.initAcc(C4);  traits.initAcc(C5);  traits.initAcc(C6);  traits.initAcc(C7);
-            traits.initAcc(C8);  traits.initAcc(C9);  traits.initAcc(C10); traits.initAcc(C11);
-            traits.initAcc(C12);  traits.initAcc(C13);  traits.initAcc(C14);  traits.initAcc(C15);
-            traits.initAcc(C16);  traits.initAcc(C17);  traits.initAcc(C18);  traits.initAcc(C19);
-            traits.initAcc(C20);  traits.initAcc(C21);  traits.initAcc(C22); traits.initAcc(C23);
+            AccPacket C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20,
+                C21, C22, C23;
+            traits.initAcc(C0);
+            traits.initAcc(C1);
+            traits.initAcc(C2);
+            traits.initAcc(C3);
+            traits.initAcc(C4);
+            traits.initAcc(C5);
+            traits.initAcc(C6);
+            traits.initAcc(C7);
+            traits.initAcc(C8);
+            traits.initAcc(C9);
+            traits.initAcc(C10);
+            traits.initAcc(C11);
+            traits.initAcc(C12);
+            traits.initAcc(C13);
+            traits.initAcc(C14);
+            traits.initAcc(C15);
+            traits.initAcc(C16);
+            traits.initAcc(C17);
+            traits.initAcc(C18);
+            traits.initAcc(C19);
+            traits.initAcc(C20);
+            traits.initAcc(C21);
+            traits.initAcc(C22);
+            traits.initAcc(C23);
 
             LinearMapper r0 = res.getLinearMapper(i, j2 + 0);
             LinearMapper r1 = res.getLinearMapper(i, j2 + 1);
@@ -1619,94 +1520,90 @@
             r7.prefetch(0);
 
             // performs "inner" products
-            const RhsScalar* blB = &blockB[j2*strideB+offsetB*8];
+            const RhsScalar* blB = &blockB[j2 * strideB + offsetB * 8];
             prefetch(&blB[0]);
             LhsPacket A0, A1;
-            for(Index k=0; k<peeled_kc; k+=pk)
-            {
+            for (Index k = 0; k < peeled_kc; k += pk) {
               EIGEN_ASM_COMMENT("begin gebp micro kernel 3pX8");
               // 27 registers are taken (24 for acc, 3 for lhs).
               RhsPanel27 rhs_panel;
               RhsPacket T0;
               LhsPacket A2;
-            #if EIGEN_ARCH_ARM64 && defined(EIGEN_VECTORIZE_NEON) && EIGEN_GNUC_STRICT_LESS_THAN(9,0,0)
-            // see http://eigen.tuxfamily.org/bz/show_bug.cgi?id=1633
-            // without this workaround A0, A1, and A2 are loaded in the same register,
-            // which is not good for pipelining
-            #define EIGEN_GEBP_3Px8_REGISTER_ALLOC_WORKAROUND __asm__  ("" : "+w,m" (A0), "+w,m" (A1), "+w,m" (A2));
-            #else
-            #define EIGEN_GEBP_3Px8_REGISTER_ALLOC_WORKAROUND
-            #endif
+#if EIGEN_ARCH_ARM64 && defined(EIGEN_VECTORIZE_NEON) && EIGEN_GNUC_STRICT_LESS_THAN(9, 0, 0)
+// see http://eigen.tuxfamily.org/bz/show_bug.cgi?id=1633
+// without this workaround A0, A1, and A2 are loaded in the same register,
+// which is not good for pipelining
+#define EIGEN_GEBP_3Px8_REGISTER_ALLOC_WORKAROUND __asm__("" : "+w,m"(A0), "+w,m"(A1), "+w,m"(A2));
+#else
+#define EIGEN_GEBP_3Px8_REGISTER_ALLOC_WORKAROUND
+#endif
 
-#define EIGEN_GEBP_ONESTEP(K)                                                         \
-            do {                                                                      \
-                EIGEN_ASM_COMMENT("begin step of gebp micro kernel 3pX8");            \
-                traits.loadLhs(&blA[(0 + 3 * K) * LhsProgress], A0);                  \
-                traits.loadLhs(&blA[(1 + 3 * K) * LhsProgress], A1);                  \
-                traits.loadLhs(&blA[(2 + 3 * K) * LhsProgress], A2);                  \
-                EIGEN_GEBP_3Px8_REGISTER_ALLOC_WORKAROUND                             \
-                traits.loadRhs(blB + (0 + 8 * K) * Traits::RhsProgress, rhs_panel);   \
-                traits.madd(A0, rhs_panel, C0, T0, fix<0>);                           \
-                traits.madd(A1, rhs_panel, C8, T0, fix<0>);                           \
-                traits.madd(A2, rhs_panel, C16, T0, fix<0>);                          \
-                traits.updateRhs(blB + (1 + 8 * K) * Traits::RhsProgress, rhs_panel); \
-                traits.madd(A0, rhs_panel, C1, T0, fix<1>);                           \
-                traits.madd(A1, rhs_panel, C9, T0, fix<1>);                           \
-                traits.madd(A2, rhs_panel, C17, T0, fix<1>);                          \
-                traits.updateRhs(blB + (2 + 8 * K) * Traits::RhsProgress, rhs_panel); \
-                traits.madd(A0, rhs_panel, C2, T0, fix<2>);                           \
-                traits.madd(A1, rhs_panel, C10, T0, fix<2>);                          \
-                traits.madd(A2, rhs_panel, C18, T0, fix<2>);                          \
-                traits.updateRhs(blB + (3 + 8 * K) * Traits::RhsProgress, rhs_panel); \
-                traits.madd(A0, rhs_panel, C3, T0, fix<3>);                           \
-                traits.madd(A1, rhs_panel, C11, T0, fix<3>);                          \
-                traits.madd(A2, rhs_panel, C19, T0, fix<3>);                          \
-                traits.loadRhs(blB + (4 + 8 * K) * Traits::RhsProgress, rhs_panel);   \
-                traits.madd(A0, rhs_panel, C4, T0, fix<0>);                           \
-                traits.madd(A1, rhs_panel, C12, T0, fix<0>);                          \
-                traits.madd(A2, rhs_panel, C20, T0, fix<0>);                          \
-                traits.updateRhs(blB + (5 + 8 * K) * Traits::RhsProgress, rhs_panel); \
-                traits.madd(A0, rhs_panel, C5, T0, fix<1>);                           \
-                traits.madd(A1, rhs_panel, C13, T0, fix<1>);                          \
-                traits.madd(A2, rhs_panel, C21, T0, fix<1>);                          \
-                traits.updateRhs(blB + (6 + 8 * K) * Traits::RhsProgress, rhs_panel); \
-                traits.madd(A0, rhs_panel, C6, T0, fix<2>);                           \
-                traits.madd(A1, rhs_panel, C14, T0, fix<2>);                          \
-                traits.madd(A2, rhs_panel, C22, T0, fix<2>);                          \
-                traits.updateRhs(blB + (7 + 8 * K) * Traits::RhsProgress, rhs_panel); \
-                traits.madd(A0, rhs_panel, C7, T0, fix<3>);                           \
-                traits.madd(A1, rhs_panel, C15, T0, fix<3>);                          \
-                traits.madd(A2, rhs_panel, C23, T0, fix<3>);                          \
-                EIGEN_ASM_COMMENT("end step of gebp micro kernel 3pX8");              \
-            } while (false)
+#define EIGEN_GEBP_ONESTEP(K)                                                                                     \
+  do {                                                                                                            \
+    EIGEN_ASM_COMMENT("begin step of gebp micro kernel 3pX8");                                                    \
+    traits.loadLhs(&blA[(0 + 3 * K) * LhsProgress], A0);                                                          \
+    traits.loadLhs(&blA[(1 + 3 * K) * LhsProgress], A1);                                                          \
+    traits.loadLhs(&blA[(2 + 3 * K) * LhsProgress], A2);                                                          \
+    EIGEN_GEBP_3Px8_REGISTER_ALLOC_WORKAROUND traits.loadRhs(blB + (0 + 8 * K) * Traits::RhsProgress, rhs_panel); \
+    traits.madd(A0, rhs_panel, C0, T0, fix<0>);                                                                   \
+    traits.madd(A1, rhs_panel, C8, T0, fix<0>);                                                                   \
+    traits.madd(A2, rhs_panel, C16, T0, fix<0>);                                                                  \
+    traits.updateRhs(blB + (1 + 8 * K) * Traits::RhsProgress, rhs_panel);                                         \
+    traits.madd(A0, rhs_panel, C1, T0, fix<1>);                                                                   \
+    traits.madd(A1, rhs_panel, C9, T0, fix<1>);                                                                   \
+    traits.madd(A2, rhs_panel, C17, T0, fix<1>);                                                                  \
+    traits.updateRhs(blB + (2 + 8 * K) * Traits::RhsProgress, rhs_panel);                                         \
+    traits.madd(A0, rhs_panel, C2, T0, fix<2>);                                                                   \
+    traits.madd(A1, rhs_panel, C10, T0, fix<2>);                                                                  \
+    traits.madd(A2, rhs_panel, C18, T0, fix<2>);                                                                  \
+    traits.updateRhs(blB + (3 + 8 * K) * Traits::RhsProgress, rhs_panel);                                         \
+    traits.madd(A0, rhs_panel, C3, T0, fix<3>);                                                                   \
+    traits.madd(A1, rhs_panel, C11, T0, fix<3>);                                                                  \
+    traits.madd(A2, rhs_panel, C19, T0, fix<3>);                                                                  \
+    traits.loadRhs(blB + (4 + 8 * K) * Traits::RhsProgress, rhs_panel);                                           \
+    traits.madd(A0, rhs_panel, C4, T0, fix<0>);                                                                   \
+    traits.madd(A1, rhs_panel, C12, T0, fix<0>);                                                                  \
+    traits.madd(A2, rhs_panel, C20, T0, fix<0>);                                                                  \
+    traits.updateRhs(blB + (5 + 8 * K) * Traits::RhsProgress, rhs_panel);                                         \
+    traits.madd(A0, rhs_panel, C5, T0, fix<1>);                                                                   \
+    traits.madd(A1, rhs_panel, C13, T0, fix<1>);                                                                  \
+    traits.madd(A2, rhs_panel, C21, T0, fix<1>);                                                                  \
+    traits.updateRhs(blB + (6 + 8 * K) * Traits::RhsProgress, rhs_panel);                                         \
+    traits.madd(A0, rhs_panel, C6, T0, fix<2>);                                                                   \
+    traits.madd(A1, rhs_panel, C14, T0, fix<2>);                                                                  \
+    traits.madd(A2, rhs_panel, C22, T0, fix<2>);                                                                  \
+    traits.updateRhs(blB + (7 + 8 * K) * Traits::RhsProgress, rhs_panel);                                         \
+    traits.madd(A0, rhs_panel, C7, T0, fix<3>);                                                                   \
+    traits.madd(A1, rhs_panel, C15, T0, fix<3>);                                                                  \
+    traits.madd(A2, rhs_panel, C23, T0, fix<3>);                                                                  \
+    EIGEN_ASM_COMMENT("end step of gebp micro kernel 3pX8");                                                      \
+  } while (false)
 
-                EIGEN_GEBP_ONESTEP(0);
-                EIGEN_GEBP_ONESTEP(1);
-                EIGEN_GEBP_ONESTEP(2);
-                EIGEN_GEBP_ONESTEP(3);
-                EIGEN_GEBP_ONESTEP(4);
-                EIGEN_GEBP_ONESTEP(5);
-                EIGEN_GEBP_ONESTEP(6);
-                EIGEN_GEBP_ONESTEP(7);
+              EIGEN_GEBP_ONESTEP(0);
+              EIGEN_GEBP_ONESTEP(1);
+              EIGEN_GEBP_ONESTEP(2);
+              EIGEN_GEBP_ONESTEP(3);
+              EIGEN_GEBP_ONESTEP(4);
+              EIGEN_GEBP_ONESTEP(5);
+              EIGEN_GEBP_ONESTEP(6);
+              EIGEN_GEBP_ONESTEP(7);
 
-                blB += pk * 8 * RhsProgress;
-                blA += pk * 3 * Traits::LhsProgress;
-                EIGEN_ASM_COMMENT("end gebp micro kernel 3pX8");
+              blB += pk * 8 * RhsProgress;
+              blA += pk * 3 * Traits::LhsProgress;
+              EIGEN_ASM_COMMENT("end gebp micro kernel 3pX8");
             }
 
             // process remaining peeled loop
-            for (Index k = peeled_kc; k < depth; k++)
-            {
-
-                RhsPanel27 rhs_panel;
-                RhsPacket T0;
-                LhsPacket A2;
-                EIGEN_GEBP_ONESTEP(0);
-                blB += 8 * RhsProgress;
-                blA += 3 * Traits::LhsProgress;
+            for (Index k = peeled_kc; k < depth; k++) {
+              RhsPanel27 rhs_panel;
+              RhsPacket T0;
+              LhsPacket A2;
+              EIGEN_GEBP_ONESTEP(0);
+              blB += 8 * RhsProgress;
+              blA += 3 * Traits::LhsProgress;
             }
 
-            #undef EIGEN_GEBP_ONESTEP
+#undef EIGEN_GEBP_ONESTEP
 
             ResPacket R0, R1, R2;
             ResPacket alphav = pset1<ResPacket>(alpha);
@@ -1792,26 +1689,30 @@
             r7.storePacket(2 * Traits::ResPacketSize, R2);
           }
         }
-        }
+      }
 #endif
-        for(Index j2=packet_cols8; j2<packet_cols4; j2+=4)
-        {
-          for(Index i=i1; i<actual_panel_end; i+=3*LhsProgress)
-          {
-          
+      for (Index j2 = packet_cols8; j2 < packet_cols4; j2 += 4) {
+        for (Index i = i1; i < actual_panel_end; i += 3 * LhsProgress) {
           // We selected a 3*Traits::LhsProgress x nr micro block of res which is entirely
           // stored into 3 x nr registers.
-          
-          const LhsScalar* blA = &blockA[i*strideA+offsetA*(3*LhsProgress)];
+
+          const LhsScalar* blA = &blockA[i * strideA + offsetA * (3 * LhsProgress)];
           prefetch(&blA[0]);
 
           // gets res block as register
-          AccPacket C0, C1, C2,  C3,
-                    C4, C5, C6,  C7,
-                    C8, C9, C10, C11;
-          traits.initAcc(C0);  traits.initAcc(C1);  traits.initAcc(C2);  traits.initAcc(C3);
-          traits.initAcc(C4);  traits.initAcc(C5);  traits.initAcc(C6);  traits.initAcc(C7);
-          traits.initAcc(C8);  traits.initAcc(C9);  traits.initAcc(C10); traits.initAcc(C11);
+          AccPacket C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11;
+          traits.initAcc(C0);
+          traits.initAcc(C1);
+          traits.initAcc(C2);
+          traits.initAcc(C3);
+          traits.initAcc(C4);
+          traits.initAcc(C5);
+          traits.initAcc(C6);
+          traits.initAcc(C7);
+          traits.initAcc(C8);
+          traits.initAcc(C9);
+          traits.initAcc(C10);
+          traits.initAcc(C11);
 
           LinearMapper r0 = res.getLinearMapper(i, j2 + 0);
           LinearMapper r1 = res.getLinearMapper(i, j2 + 1);
@@ -1824,55 +1725,54 @@
           r3.prefetch(0);
 
           // performs "inner" products
-          const RhsScalar* blB = &blockB[j2*strideB+offsetB*4];
+          const RhsScalar* blB = &blockB[j2 * strideB + offsetB * 4];
           prefetch(&blB[0]);
           LhsPacket A0, A1;
 
-          for(Index k=0; k<peeled_kc; k+=pk)
-          {
+          for (Index k = 0; k < peeled_kc; k += pk) {
             EIGEN_ASM_COMMENT("begin gebp micro kernel 3pX4");
             // 15 registers are taken (12 for acc, 3 for lhs).
             RhsPanel15 rhs_panel;
             RhsPacket T0;
             LhsPacket A2;
-            #if EIGEN_ARCH_ARM64 && defined(EIGEN_VECTORIZE_NEON) && EIGEN_GNUC_STRICT_LESS_THAN(9,0,0)
-            // see http://eigen.tuxfamily.org/bz/show_bug.cgi?id=1633
-            // without this workaround A0, A1, and A2 are loaded in the same register,
-            // which is not good for pipelining
-            #define EIGEN_GEBP_3PX4_REGISTER_ALLOC_WORKAROUND __asm__  ("" : "+w,m" (A0), "+w,m" (A1), "+w,m" (A2));
-            #else
-            #define EIGEN_GEBP_3PX4_REGISTER_ALLOC_WORKAROUND
-            #endif
-#define EIGEN_GEBP_ONESTEP(K)                                                     \
-            do {                                                                  \
-              EIGEN_ASM_COMMENT("begin step of gebp micro kernel 3pX4");          \
-              EIGEN_ASM_COMMENT("Note: these asm comments work around bug 935!"); \
-              internal::prefetch(blA + (3 * K + 16) * LhsProgress);               \
-              if (EIGEN_ARCH_ARM || EIGEN_ARCH_MIPS) {                            \
-                internal::prefetch(blB + (4 * K + 16) * RhsProgress);             \
-              } /* Bug 953 */                                                     \
-              traits.loadLhs(&blA[(0 + 3 * K) * LhsProgress], A0);                \
-              traits.loadLhs(&blA[(1 + 3 * K) * LhsProgress], A1);                \
-              traits.loadLhs(&blA[(2 + 3 * K) * LhsProgress], A2);                \
-              EIGEN_GEBP_3PX4_REGISTER_ALLOC_WORKAROUND \
-              traits.loadRhs(blB + (0+4*K) * Traits::RhsProgress, rhs_panel);     \
-              traits.madd(A0, rhs_panel, C0, T0, fix<0>);                         \
-              traits.madd(A1, rhs_panel, C4, T0, fix<0>);                         \
-              traits.madd(A2, rhs_panel, C8, T0, fix<0>);                         \
-              traits.updateRhs(blB + (1+4*K) * Traits::RhsProgress, rhs_panel);   \
-              traits.madd(A0, rhs_panel, C1, T0, fix<1>);                         \
-              traits.madd(A1, rhs_panel, C5, T0, fix<1>);                         \
-              traits.madd(A2, rhs_panel, C9, T0, fix<1>);                         \
-              traits.updateRhs(blB + (2+4*K) * Traits::RhsProgress, rhs_panel);   \
-              traits.madd(A0, rhs_panel, C2, T0, fix<2>);                         \
-              traits.madd(A1, rhs_panel, C6, T0, fix<2>);                         \
-              traits.madd(A2, rhs_panel, C10, T0, fix<2>);                        \
-              traits.updateRhs(blB + (3+4*K) * Traits::RhsProgress, rhs_panel);   \
-              traits.madd(A0, rhs_panel, C3, T0, fix<3>);                         \
-              traits.madd(A1, rhs_panel, C7, T0, fix<3>);                         \
-              traits.madd(A2, rhs_panel, C11, T0, fix<3>);                        \
-              EIGEN_ASM_COMMENT("end step of gebp micro kernel 3pX4");            \
-            } while (false)
+#if EIGEN_ARCH_ARM64 && defined(EIGEN_VECTORIZE_NEON) && EIGEN_GNUC_STRICT_LESS_THAN(9, 0, 0)
+// see http://eigen.tuxfamily.org/bz/show_bug.cgi?id=1633
+// without this workaround A0, A1, and A2 are loaded in the same register,
+// which is not good for pipelining
+#define EIGEN_GEBP_3PX4_REGISTER_ALLOC_WORKAROUND __asm__("" : "+w,m"(A0), "+w,m"(A1), "+w,m"(A2));
+#else
+#define EIGEN_GEBP_3PX4_REGISTER_ALLOC_WORKAROUND
+#endif
+#define EIGEN_GEBP_ONESTEP(K)                                             \
+  do {                                                                    \
+    EIGEN_ASM_COMMENT("begin step of gebp micro kernel 3pX4");            \
+    EIGEN_ASM_COMMENT("Note: these asm comments work around bug 935!");   \
+    internal::prefetch(blA + (3 * K + 16) * LhsProgress);                 \
+    if (EIGEN_ARCH_ARM || EIGEN_ARCH_MIPS) {                              \
+      internal::prefetch(blB + (4 * K + 16) * RhsProgress);               \
+    } /* Bug 953 */                                                       \
+    traits.loadLhs(&blA[(0 + 3 * K) * LhsProgress], A0);                  \
+    traits.loadLhs(&blA[(1 + 3 * K) * LhsProgress], A1);                  \
+    traits.loadLhs(&blA[(2 + 3 * K) * LhsProgress], A2);                  \
+    EIGEN_GEBP_3PX4_REGISTER_ALLOC_WORKAROUND                             \
+    traits.loadRhs(blB + (0 + 4 * K) * Traits::RhsProgress, rhs_panel);   \
+    traits.madd(A0, rhs_panel, C0, T0, fix<0>);                           \
+    traits.madd(A1, rhs_panel, C4, T0, fix<0>);                           \
+    traits.madd(A2, rhs_panel, C8, T0, fix<0>);                           \
+    traits.updateRhs(blB + (1 + 4 * K) * Traits::RhsProgress, rhs_panel); \
+    traits.madd(A0, rhs_panel, C1, T0, fix<1>);                           \
+    traits.madd(A1, rhs_panel, C5, T0, fix<1>);                           \
+    traits.madd(A2, rhs_panel, C9, T0, fix<1>);                           \
+    traits.updateRhs(blB + (2 + 4 * K) * Traits::RhsProgress, rhs_panel); \
+    traits.madd(A0, rhs_panel, C2, T0, fix<2>);                           \
+    traits.madd(A1, rhs_panel, C6, T0, fix<2>);                           \
+    traits.madd(A2, rhs_panel, C10, T0, fix<2>);                          \
+    traits.updateRhs(blB + (3 + 4 * K) * Traits::RhsProgress, rhs_panel); \
+    traits.madd(A0, rhs_panel, C3, T0, fix<3>);                           \
+    traits.madd(A1, rhs_panel, C7, T0, fix<3>);                           \
+    traits.madd(A2, rhs_panel, C11, T0, fix<3>);                          \
+    EIGEN_ASM_COMMENT("end step of gebp micro kernel 3pX4");              \
+  } while (false)
 
             internal::prefetch(blB);
             EIGEN_GEBP_ONESTEP(0);
@@ -1884,20 +1784,19 @@
             EIGEN_GEBP_ONESTEP(6);
             EIGEN_GEBP_ONESTEP(7);
 
-            blB += pk*4*RhsProgress;
-            blA += pk*3*Traits::LhsProgress;
+            blB += pk * 4 * RhsProgress;
+            blA += pk * 3 * Traits::LhsProgress;
 
             EIGEN_ASM_COMMENT("end gebp micro kernel 3pX4");
           }
           // process remaining peeled loop
-          for(Index k=peeled_kc; k<depth; k++)
-          {
+          for (Index k = peeled_kc; k < depth; k++) {
             RhsPanel15 rhs_panel;
             RhsPacket T0;
             LhsPacket A2;
             EIGEN_GEBP_ONESTEP(0);
-            blB += 4*RhsProgress;
-            blA += 3*Traits::LhsProgress;
+            blB += 4 * RhsProgress;
+            blA += 3 * Traits::LhsProgress;
           }
 
 #undef EIGEN_GEBP_ONESTEP
@@ -1943,17 +1842,15 @@
           traits.acc(C11, alphav, R2);
           r3.storePacket(0 * Traits::ResPacketSize, R0);
           r3.storePacket(1 * Traits::ResPacketSize, R1);
-          r3.storePacket(2 * Traits::ResPacketSize, R2);          
-          }
+          r3.storePacket(2 * Traits::ResPacketSize, R2);
         }
+      }
 
-        // Deal with remaining columns of the rhs
-        for(Index j2=packet_cols4; j2<cols; j2++)
-        {
-          for(Index i=i1; i<actual_panel_end; i+=3*LhsProgress)
-          {
+      // Deal with remaining columns of the rhs
+      for (Index j2 = packet_cols4; j2 < cols; j2++) {
+        for (Index i = i1; i < actual_panel_end; i += 3 * LhsProgress) {
           // One column at a time
-          const LhsScalar* blA = &blockA[i*strideA+offsetA*(3*Traits::LhsProgress)];
+          const LhsScalar* blA = &blockA[i * strideA + offsetA * (3 * Traits::LhsProgress)];
           prefetch(&blA[0]);
 
           // gets res block as register
@@ -1966,26 +1863,25 @@
           r0.prefetch(0);
 
           // performs "inner" products
-          const RhsScalar* blB = &blockB[j2*strideB+offsetB];
+          const RhsScalar* blB = &blockB[j2 * strideB + offsetB];
           LhsPacket A0, A1, A2;
-          
-          for(Index k=0; k<peeled_kc; k+=pk)
-          {
+
+          for (Index k = 0; k < peeled_kc; k += pk) {
             EIGEN_ASM_COMMENT("begin gebp micro kernel 3pX1");
             RhsPacket B_0;
-#define EIGEN_GEBGP_ONESTEP(K)                                                    \
-            do {                                                                  \
-              EIGEN_ASM_COMMENT("begin step of gebp micro kernel 3pX1");          \
-              EIGEN_ASM_COMMENT("Note: these asm comments work around bug 935!"); \
-              traits.loadLhs(&blA[(0 + 3 * K) * LhsProgress], A0);                \
-              traits.loadLhs(&blA[(1 + 3 * K) * LhsProgress], A1);                \
-              traits.loadLhs(&blA[(2 + 3 * K) * LhsProgress], A2);                \
-              traits.loadRhs(&blB[(0 + K) * RhsProgress], B_0);                   \
-              traits.madd(A0, B_0, C0, B_0, fix<0>);                              \
-              traits.madd(A1, B_0, C4, B_0, fix<0>);                              \
-              traits.madd(A2, B_0, C8, B_0, fix<0>);                              \
-              EIGEN_ASM_COMMENT("end step of gebp micro kernel 3pX1");            \
-            } while (false)
+#define EIGEN_GEBGP_ONESTEP(K)                                          \
+  do {                                                                  \
+    EIGEN_ASM_COMMENT("begin step of gebp micro kernel 3pX1");          \
+    EIGEN_ASM_COMMENT("Note: these asm comments work around bug 935!"); \
+    traits.loadLhs(&blA[(0 + 3 * K) * LhsProgress], A0);                \
+    traits.loadLhs(&blA[(1 + 3 * K) * LhsProgress], A1);                \
+    traits.loadLhs(&blA[(2 + 3 * K) * LhsProgress], A2);                \
+    traits.loadRhs(&blB[(0 + K) * RhsProgress], B_0);                   \
+    traits.madd(A0, B_0, C0, B_0, fix<0>);                              \
+    traits.madd(A1, B_0, C4, B_0, fix<0>);                              \
+    traits.madd(A2, B_0, C8, B_0, fix<0>);                              \
+    EIGEN_ASM_COMMENT("end step of gebp micro kernel 3pX1");            \
+  } while (false)
 
             EIGEN_GEBGP_ONESTEP(0);
             EIGEN_GEBGP_ONESTEP(1);
@@ -2003,12 +1899,11 @@
           }
 
           // process remaining peeled loop
-          for(Index k=peeled_kc; k<depth; k++)
-          {
+          for (Index k = peeled_kc; k < depth; k++) {
             RhsPacket B_0;
             EIGEN_GEBGP_ONESTEP(0);
             blB += RhsProgress;
-            blA += 3*Traits::LhsProgress;
+            blA += 3 * Traits::LhsProgress;
           }
 #undef EIGEN_GEBGP_ONESTEP
           ResPacket R0, R1, R2;
@@ -2022,39 +1917,48 @@
           traits.acc(C8, alphav, R2);
           r0.storePacket(0 * Traits::ResPacketSize, R0);
           r0.storePacket(1 * Traits::ResPacketSize, R1);
-          r0.storePacket(2 * Traits::ResPacketSize, R2);          
-          }
+          r0.storePacket(2 * Traits::ResPacketSize, R2);
         }
       }
     }
+  }
 
-    //---------- Process 2 * LhsProgress rows at once ----------
-    if(mr>=2*Traits::LhsProgress)
-    {
-      const Index l1 = defaultL1CacheSize; // in Bytes, TODO, l1 should be passed to this function.
-      // The max(1, ...) here is needed because we may be using blocking params larger than what our known l1 cache size
-      // suggests we should be using: either because our known l1 cache size is inaccurate (e.g. on Android, we can only guess),
-      // or because we are testing specific blocking sizes.
-      Index actual_panel_rows = (2*LhsProgress) * std::max<Index>(1,( (l1 - sizeof(ResScalar)*mr*nr - depth*nr*sizeof(RhsScalar)) / (depth * sizeof(LhsScalar) * 2*LhsProgress) ));
+  //---------- Process 2 * LhsProgress rows at once ----------
+  if (mr >= 2 * Traits::LhsProgress) {
+    const Index l1 = defaultL1CacheSize;  // in Bytes, TODO, l1 should be passed to this function.
+    // The max(1, ...) here is needed because we may be using blocking params larger than what our known l1 cache size
+    // suggests we should be using: either because our known l1 cache size is inaccurate (e.g. on Android, we can only
+    // guess), or because we are testing specific blocking sizes.
+    Index actual_panel_rows =
+        (2 * LhsProgress) * std::max<Index>(1, ((l1 - sizeof(ResScalar) * mr * nr - depth * nr * sizeof(RhsScalar)) /
+                                                (depth * sizeof(LhsScalar) * 2 * LhsProgress)));
 
-      for(Index i1=peeled_mc3; i1<peeled_mc2; i1+=actual_panel_rows)
-      {
-        Index actual_panel_end = (std::min)(i1+actual_panel_rows, peeled_mc2);
+    for (Index i1 = peeled_mc3; i1 < peeled_mc2; i1 += actual_panel_rows) {
+      Index actual_panel_end = (std::min)(i1 + actual_panel_rows, peeled_mc2);
 #if EIGEN_ARCH_ARM64
-        EIGEN_IF_CONSTEXPR(nr>=8) {
-        for(Index j2=0; j2<packet_cols8; j2+=8)
-        {
-          for(Index i=i1; i<actual_panel_end; i+=2*LhsProgress)
-          {
-            const LhsScalar* blA = &blockA[i*strideA+offsetA*(2*Traits::LhsProgress)];
+      EIGEN_IF_CONSTEXPR(nr >= 8) {
+        for (Index j2 = 0; j2 < packet_cols8; j2 += 8) {
+          for (Index i = i1; i < actual_panel_end; i += 2 * LhsProgress) {
+            const LhsScalar* blA = &blockA[i * strideA + offsetA * (2 * Traits::LhsProgress)];
             prefetch(&blA[0]);
 
-            AccPacket C0, C1, C2, C3, C4, C5, C6, C7,
-                      C8, C9, C10, C11, C12, C13, C14, C15;
-            traits.initAcc(C0); traits.initAcc(C1); traits.initAcc(C2); traits.initAcc(C3);
-            traits.initAcc(C4); traits.initAcc(C5); traits.initAcc(C6); traits.initAcc(C7);
-            traits.initAcc(C8); traits.initAcc(C9); traits.initAcc(C10); traits.initAcc(C11);
-            traits.initAcc(C12); traits.initAcc(C13); traits.initAcc(C14); traits.initAcc(C15);
+            AccPacket C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15;
+            traits.initAcc(C0);
+            traits.initAcc(C1);
+            traits.initAcc(C2);
+            traits.initAcc(C3);
+            traits.initAcc(C4);
+            traits.initAcc(C5);
+            traits.initAcc(C6);
+            traits.initAcc(C7);
+            traits.initAcc(C8);
+            traits.initAcc(C9);
+            traits.initAcc(C10);
+            traits.initAcc(C11);
+            traits.initAcc(C12);
+            traits.initAcc(C13);
+            traits.initAcc(C14);
+            traits.initAcc(C15);
 
             LinearMapper r0 = res.getLinearMapper(i, j2 + 0);
             LinearMapper r1 = res.getLinearMapper(i, j2 + 1);
@@ -2073,52 +1977,50 @@
             r6.prefetch(prefetch_res_offset);
             r7.prefetch(prefetch_res_offset);
 
-            const RhsScalar* blB = &blockB[j2*strideB+offsetB*8];
+            const RhsScalar* blB = &blockB[j2 * strideB + offsetB * 8];
             prefetch(&blB[0]);
             LhsPacket A0, A1;
-            for(Index k=0; k<peeled_kc; k+=pk)
-            {
+            for (Index k = 0; k < peeled_kc; k += pk) {
               RhsPacketx4 rhs_panel;
               RhsPacket T0;
-              // NOTE: the begin/end asm comments below work around bug 935!
-              // but they are not enough for gcc>=6 without FMA (bug 1637)
-              #if EIGEN_GNUC_STRICT_AT_LEAST(6,0,0) && defined(EIGEN_VECTORIZE_SSE)
-                #define EIGEN_GEBP_2Px8_SPILLING_WORKAROUND __asm__  ("" : [a0] "+x,m" (A0),[a1] "+x,m" (A1));
-              #else
-                #define EIGEN_GEBP_2Px8_SPILLING_WORKAROUND
-              #endif
-#define EIGEN_GEBGP_ONESTEP(K)                                                \
-            do {                                                              \
-              EIGEN_ASM_COMMENT("begin step of gebp micro kernel 2pX8");      \
-              traits.loadLhs(&blA[(0 + 2 * K) * LhsProgress], A0);            \
-              traits.loadLhs(&blA[(1 + 2 * K) * LhsProgress], A1);            \
-              traits.loadRhs(&blB[(0 + 8 * K) * RhsProgress], rhs_panel);     \
-              traits.madd(A0, rhs_panel, C0, T0, fix<0>);                     \
-              traits.madd(A1, rhs_panel, C8, T0, fix<0>);                     \
-              traits.updateRhs(&blB[(1 + 8 * K) * RhsProgress], rhs_panel);   \
-              traits.madd(A0, rhs_panel, C1, T0, fix<1>);                     \
-              traits.madd(A1, rhs_panel, C9, T0, fix<1>);                     \
-              traits.updateRhs(&blB[(2 + 8 * K) * RhsProgress], rhs_panel);   \
-              traits.madd(A0, rhs_panel, C2, T0, fix<2>);                     \
-              traits.madd(A1, rhs_panel, C10, T0, fix<2>);                    \
-              traits.updateRhs(&blB[(3 + 8 * K) * RhsProgress], rhs_panel);   \
-              traits.madd(A0, rhs_panel, C3, T0, fix<3>);                     \
-              traits.madd(A1, rhs_panel, C11, T0, fix<3>);                    \
-              traits.loadRhs(&blB[(4 + 8 * K) * RhsProgress], rhs_panel);     \
-              traits.madd(A0, rhs_panel, C4, T0, fix<0>);                     \
-              traits.madd(A1, rhs_panel, C12, T0, fix<0>);                    \
-              traits.updateRhs(&blB[(5 + 8 * K) * RhsProgress], rhs_panel);   \
-              traits.madd(A0, rhs_panel, C5, T0, fix<1>);                     \
-              traits.madd(A1, rhs_panel, C13, T0, fix<1>);                    \
-              traits.updateRhs(&blB[(6 + 8 * K) * RhsProgress], rhs_panel);   \
-              traits.madd(A0, rhs_panel, C6, T0, fix<2>);                     \
-              traits.madd(A1, rhs_panel, C14, T0, fix<2>);                    \
-              traits.updateRhs(&blB[(7 + 8 * K) * RhsProgress], rhs_panel);   \
-              traits.madd(A0, rhs_panel, C7, T0, fix<3>);                     \
-              traits.madd(A1, rhs_panel, C15, T0, fix<3>);                    \
-              EIGEN_GEBP_2Px8_SPILLING_WORKAROUND                             \
-              EIGEN_ASM_COMMENT("end step of gebp micro kernel 2pX8");        \
-            } while (false)
+// NOTE: the begin/end asm comments below work around bug 935!
+// but they are not enough for gcc>=6 without FMA (bug 1637)
+#if EIGEN_GNUC_STRICT_AT_LEAST(6, 0, 0) && defined(EIGEN_VECTORIZE_SSE)
+#define EIGEN_GEBP_2Px8_SPILLING_WORKAROUND __asm__("" : [a0] "+x,m"(A0), [a1] "+x,m"(A1));
+#else
+#define EIGEN_GEBP_2Px8_SPILLING_WORKAROUND
+#endif
+#define EIGEN_GEBGP_ONESTEP(K)                                                                   \
+  do {                                                                                           \
+    EIGEN_ASM_COMMENT("begin step of gebp micro kernel 2pX8");                                   \
+    traits.loadLhs(&blA[(0 + 2 * K) * LhsProgress], A0);                                         \
+    traits.loadLhs(&blA[(1 + 2 * K) * LhsProgress], A1);                                         \
+    traits.loadRhs(&blB[(0 + 8 * K) * RhsProgress], rhs_panel);                                  \
+    traits.madd(A0, rhs_panel, C0, T0, fix<0>);                                                  \
+    traits.madd(A1, rhs_panel, C8, T0, fix<0>);                                                  \
+    traits.updateRhs(&blB[(1 + 8 * K) * RhsProgress], rhs_panel);                                \
+    traits.madd(A0, rhs_panel, C1, T0, fix<1>);                                                  \
+    traits.madd(A1, rhs_panel, C9, T0, fix<1>);                                                  \
+    traits.updateRhs(&blB[(2 + 8 * K) * RhsProgress], rhs_panel);                                \
+    traits.madd(A0, rhs_panel, C2, T0, fix<2>);                                                  \
+    traits.madd(A1, rhs_panel, C10, T0, fix<2>);                                                 \
+    traits.updateRhs(&blB[(3 + 8 * K) * RhsProgress], rhs_panel);                                \
+    traits.madd(A0, rhs_panel, C3, T0, fix<3>);                                                  \
+    traits.madd(A1, rhs_panel, C11, T0, fix<3>);                                                 \
+    traits.loadRhs(&blB[(4 + 8 * K) * RhsProgress], rhs_panel);                                  \
+    traits.madd(A0, rhs_panel, C4, T0, fix<0>);                                                  \
+    traits.madd(A1, rhs_panel, C12, T0, fix<0>);                                                 \
+    traits.updateRhs(&blB[(5 + 8 * K) * RhsProgress], rhs_panel);                                \
+    traits.madd(A0, rhs_panel, C5, T0, fix<1>);                                                  \
+    traits.madd(A1, rhs_panel, C13, T0, fix<1>);                                                 \
+    traits.updateRhs(&blB[(6 + 8 * K) * RhsProgress], rhs_panel);                                \
+    traits.madd(A0, rhs_panel, C6, T0, fix<2>);                                                  \
+    traits.madd(A1, rhs_panel, C14, T0, fix<2>);                                                 \
+    traits.updateRhs(&blB[(7 + 8 * K) * RhsProgress], rhs_panel);                                \
+    traits.madd(A0, rhs_panel, C7, T0, fix<3>);                                                  \
+    traits.madd(A1, rhs_panel, C15, T0, fix<3>);                                                 \
+    EIGEN_GEBP_2Px8_SPILLING_WORKAROUND EIGEN_ASM_COMMENT("end step of gebp micro kernel 2pX8"); \
+  } while (false)
 
               EIGEN_ASM_COMMENT("begin gebp micro kernel 2pX8");
 
@@ -2131,19 +2033,18 @@
               EIGEN_GEBGP_ONESTEP(6);
               EIGEN_GEBGP_ONESTEP(7);
 
-              blB += pk*8*RhsProgress;
-              blA += pk*(2*Traits::LhsProgress);
+              blB += pk * 8 * RhsProgress;
+              blA += pk * (2 * Traits::LhsProgress);
 
               EIGEN_ASM_COMMENT("end gebp micro kernel 2pX8");
             }
             // process remaining peeled loop
-            for(Index k=peeled_kc; k<depth; k++)
-            {
+            for (Index k = peeled_kc; k < depth; k++) {
               RhsPacketx4 rhs_panel;
               RhsPacket T0;
               EIGEN_GEBGP_ONESTEP(0);
-              blB += 8*RhsProgress;
-              blA += 2*Traits::LhsProgress;
+              blB += 8 * RhsProgress;
+              blA += 2 * Traits::LhsProgress;
             }
 
 #undef EIGEN_GEBGP_ONESTEP
@@ -2168,10 +2069,10 @@
             R1 = r2.template loadPacket<ResPacket>(1 * Traits::ResPacketSize);
             R2 = r3.template loadPacket<ResPacket>(0 * Traits::ResPacketSize);
             R3 = r3.template loadPacket<ResPacket>(1 * Traits::ResPacketSize);
-            traits.acc(C2,  alphav, R0);
-            traits.acc(C10,  alphav, R1);
-            traits.acc(C3,  alphav, R2);
-            traits.acc(C11,  alphav, R3);
+            traits.acc(C2, alphav, R0);
+            traits.acc(C10, alphav, R1);
+            traits.acc(C3, alphav, R2);
+            traits.acc(C11, alphav, R3);
             r2.storePacket(0 * Traits::ResPacketSize, R0);
             r2.storePacket(1 * Traits::ResPacketSize, R1);
             r3.storePacket(0 * Traits::ResPacketSize, R2);
@@ -2181,10 +2082,10 @@
             R1 = r4.template loadPacket<ResPacket>(1 * Traits::ResPacketSize);
             R2 = r5.template loadPacket<ResPacket>(0 * Traits::ResPacketSize);
             R3 = r5.template loadPacket<ResPacket>(1 * Traits::ResPacketSize);
-            traits.acc(C4,  alphav, R0);
-            traits.acc(C12,  alphav, R1);
-            traits.acc(C5,  alphav, R2);
-            traits.acc(C13,  alphav, R3);
+            traits.acc(C4, alphav, R0);
+            traits.acc(C12, alphav, R1);
+            traits.acc(C5, alphav, R2);
+            traits.acc(C13, alphav, R3);
             r4.storePacket(0 * Traits::ResPacketSize, R0);
             r4.storePacket(1 * Traits::ResPacketSize, R1);
             r5.storePacket(0 * Traits::ResPacketSize, R2);
@@ -2194,34 +2095,36 @@
             R1 = r6.template loadPacket<ResPacket>(1 * Traits::ResPacketSize);
             R2 = r7.template loadPacket<ResPacket>(0 * Traits::ResPacketSize);
             R3 = r7.template loadPacket<ResPacket>(1 * Traits::ResPacketSize);
-            traits.acc(C6,  alphav, R0);
-            traits.acc(C14,  alphav, R1);
-            traits.acc(C7,  alphav, R2);
-            traits.acc(C15,  alphav, R3);
+            traits.acc(C6, alphav, R0);
+            traits.acc(C14, alphav, R1);
+            traits.acc(C7, alphav, R2);
+            traits.acc(C15, alphav, R3);
             r6.storePacket(0 * Traits::ResPacketSize, R0);
             r6.storePacket(1 * Traits::ResPacketSize, R1);
             r7.storePacket(0 * Traits::ResPacketSize, R2);
             r7.storePacket(1 * Traits::ResPacketSize, R3);
           }
         }
-        }
+      }
 #endif
-        for(Index j2=packet_cols8; j2<packet_cols4; j2+=4)
-        {
-          for(Index i=i1; i<actual_panel_end; i+=2*LhsProgress)
-          {
-          
+      for (Index j2 = packet_cols8; j2 < packet_cols4; j2 += 4) {
+        for (Index i = i1; i < actual_panel_end; i += 2 * LhsProgress) {
           // We selected a 2*Traits::LhsProgress x nr micro block of res which is entirely
           // stored into 2 x nr registers.
-          
-          const LhsScalar* blA = &blockA[i*strideA+offsetA*(2*Traits::LhsProgress)];
+
+          const LhsScalar* blA = &blockA[i * strideA + offsetA * (2 * Traits::LhsProgress)];
           prefetch(&blA[0]);
 
           // gets res block as register
-          AccPacket C0, C1, C2, C3,
-                    C4, C5, C6, C7;
-          traits.initAcc(C0); traits.initAcc(C1); traits.initAcc(C2); traits.initAcc(C3);
-          traits.initAcc(C4); traits.initAcc(C5); traits.initAcc(C6); traits.initAcc(C7);
+          AccPacket C0, C1, C2, C3, C4, C5, C6, C7;
+          traits.initAcc(C0);
+          traits.initAcc(C1);
+          traits.initAcc(C2);
+          traits.initAcc(C3);
+          traits.initAcc(C4);
+          traits.initAcc(C5);
+          traits.initAcc(C6);
+          traits.initAcc(C7);
 
           LinearMapper r0 = res.getLinearMapper(i, j2 + 0);
           LinearMapper r1 = res.getLinearMapper(i, j2 + 1);
@@ -2234,65 +2137,63 @@
           r3.prefetch(prefetch_res_offset);
 
           // performs "inner" products
-          const RhsScalar* blB = &blockB[j2*strideB+offsetB*4];
+          const RhsScalar* blB = &blockB[j2 * strideB + offsetB * 4];
           prefetch(&blB[0]);
           LhsPacket A0, A1;
 
-          for(Index k=0; k<peeled_kc; k+=pk)
-          {
+          for (Index k = 0; k < peeled_kc; k += pk) {
             EIGEN_ASM_COMMENT("begin gebp micro kernel 2pX4");
             RhsPacketx4 rhs_panel;
             RhsPacket T0;
 
-          // NOTE: the begin/end asm comments below work around bug 935!
-          // but they are not enough for gcc>=6 without FMA (bug 1637)
-          #if EIGEN_GNUC_STRICT_AT_LEAST(6,0,0) && defined(EIGEN_VECTORIZE_SSE) && !(EIGEN_COMP_LCC)
-            #define EIGEN_GEBP_2PX4_SPILLING_WORKAROUND __asm__  ("" : [a0] "+x,m" (A0),[a1] "+x,m" (A1));
-          #else
-            #define EIGEN_GEBP_2PX4_SPILLING_WORKAROUND
-          #endif
-#define EIGEN_GEBGP_ONESTEP(K)                                            \
-            do {                                                          \
-              EIGEN_ASM_COMMENT("begin step of gebp micro kernel 2pX4");  \
-              traits.loadLhs(&blA[(0 + 2 * K) * LhsProgress], A0);        \
-              traits.loadLhs(&blA[(1 + 2 * K) * LhsProgress], A1);        \
-              traits.loadRhs(&blB[(0 + 4 * K) * RhsProgress], rhs_panel); \
-              traits.madd(A0, rhs_panel, C0, T0, fix<0>);                 \
-              traits.madd(A1, rhs_panel, C4, T0, fix<0>);                 \
-              traits.madd(A0, rhs_panel, C1, T0, fix<1>);                 \
-              traits.madd(A1, rhs_panel, C5, T0, fix<1>);                 \
-              traits.madd(A0, rhs_panel, C2, T0, fix<2>);                 \
-              traits.madd(A1, rhs_panel, C6, T0, fix<2>);                 \
-              traits.madd(A0, rhs_panel, C3, T0, fix<3>);                 \
-              traits.madd(A1, rhs_panel, C7, T0, fix<3>);                 \
-              EIGEN_GEBP_2PX4_SPILLING_WORKAROUND                         \
-              EIGEN_ASM_COMMENT("end step of gebp micro kernel 2pX4");    \
-            } while (false)
+// NOTE: the begin/end asm comments below work around bug 935!
+// but they are not enough for gcc>=6 without FMA (bug 1637)
+#if EIGEN_GNUC_STRICT_AT_LEAST(6, 0, 0) && defined(EIGEN_VECTORIZE_SSE) && !(EIGEN_COMP_LCC)
+#define EIGEN_GEBP_2PX4_SPILLING_WORKAROUND __asm__("" : [a0] "+x,m"(A0), [a1] "+x,m"(A1));
+#else
+#define EIGEN_GEBP_2PX4_SPILLING_WORKAROUND
+#endif
+#define EIGEN_GEBGP_ONESTEP(K)                                  \
+  do {                                                          \
+    EIGEN_ASM_COMMENT("begin step of gebp micro kernel 2pX4");  \
+    traits.loadLhs(&blA[(0 + 2 * K) * LhsProgress], A0);        \
+    traits.loadLhs(&blA[(1 + 2 * K) * LhsProgress], A1);        \
+    traits.loadRhs(&blB[(0 + 4 * K) * RhsProgress], rhs_panel); \
+    traits.madd(A0, rhs_panel, C0, T0, fix<0>);                 \
+    traits.madd(A1, rhs_panel, C4, T0, fix<0>);                 \
+    traits.madd(A0, rhs_panel, C1, T0, fix<1>);                 \
+    traits.madd(A1, rhs_panel, C5, T0, fix<1>);                 \
+    traits.madd(A0, rhs_panel, C2, T0, fix<2>);                 \
+    traits.madd(A1, rhs_panel, C6, T0, fix<2>);                 \
+    traits.madd(A0, rhs_panel, C3, T0, fix<3>);                 \
+    traits.madd(A1, rhs_panel, C7, T0, fix<3>);                 \
+    EIGEN_GEBP_2PX4_SPILLING_WORKAROUND                         \
+    EIGEN_ASM_COMMENT("end step of gebp micro kernel 2pX4");    \
+  } while (false)
 
-            internal::prefetch(blB+(48+0));
+            internal::prefetch(blB + (48 + 0));
             EIGEN_GEBGP_ONESTEP(0);
             EIGEN_GEBGP_ONESTEP(1);
             EIGEN_GEBGP_ONESTEP(2);
             EIGEN_GEBGP_ONESTEP(3);
-            internal::prefetch(blB+(48+16));
+            internal::prefetch(blB + (48 + 16));
             EIGEN_GEBGP_ONESTEP(4);
             EIGEN_GEBGP_ONESTEP(5);
             EIGEN_GEBGP_ONESTEP(6);
             EIGEN_GEBGP_ONESTEP(7);
 
-            blB += pk*4*RhsProgress;
-            blA += pk*(2*Traits::LhsProgress);
+            blB += pk * 4 * RhsProgress;
+            blA += pk * (2 * Traits::LhsProgress);
 
             EIGEN_ASM_COMMENT("end gebp micro kernel 2pX4");
           }
           // process remaining peeled loop
-          for(Index k=peeled_kc; k<depth; k++)
-          {
+          for (Index k = peeled_kc; k < depth; k++) {
             RhsPacketx4 rhs_panel;
             RhsPacket T0;
             EIGEN_GEBGP_ONESTEP(0);
-            blB += 4*RhsProgress;
-            blA += 2*Traits::LhsProgress;
+            blB += 4 * RhsProgress;
+            blA += 2 * Traits::LhsProgress;
           }
 #undef EIGEN_GEBGP_ONESTEP
 
@@ -2316,24 +2217,22 @@
           R1 = r2.template loadPacket<ResPacket>(1 * Traits::ResPacketSize);
           R2 = r3.template loadPacket<ResPacket>(0 * Traits::ResPacketSize);
           R3 = r3.template loadPacket<ResPacket>(1 * Traits::ResPacketSize);
-          traits.acc(C2,  alphav, R0);
-          traits.acc(C6,  alphav, R1);
-          traits.acc(C3,  alphav, R2);
-          traits.acc(C7,  alphav, R3);
+          traits.acc(C2, alphav, R0);
+          traits.acc(C6, alphav, R1);
+          traits.acc(C3, alphav, R2);
+          traits.acc(C7, alphav, R3);
           r2.storePacket(0 * Traits::ResPacketSize, R0);
           r2.storePacket(1 * Traits::ResPacketSize, R1);
           r3.storePacket(0 * Traits::ResPacketSize, R2);
           r3.storePacket(1 * Traits::ResPacketSize, R3);
-          }
         }
-      
-        // Deal with remaining columns of the rhs
-        for(Index j2=packet_cols4; j2<cols; j2++)
-        {
-          for(Index i=i1; i<actual_panel_end; i+=2*LhsProgress)
-          {
+      }
+
+      // Deal with remaining columns of the rhs
+      for (Index j2 = packet_cols4; j2 < cols; j2++) {
+        for (Index i = i1; i < actual_panel_end; i += 2 * LhsProgress) {
           // One column at a time
-          const LhsScalar* blA = &blockA[i*strideA+offsetA*(2*Traits::LhsProgress)];
+          const LhsScalar* blA = &blockA[i * strideA + offsetA * (2 * Traits::LhsProgress)];
           prefetch(&blA[0]);
 
           // gets res block as register
@@ -2345,26 +2244,25 @@
           r0.prefetch(prefetch_res_offset);
 
           // performs "inner" products
-          const RhsScalar* blB = &blockB[j2*strideB+offsetB];
+          const RhsScalar* blB = &blockB[j2 * strideB + offsetB];
           LhsPacket A0, A1;
 
-          for(Index k=0; k<peeled_kc; k+=pk)
-          {
+          for (Index k = 0; k < peeled_kc; k += pk) {
             EIGEN_ASM_COMMENT("begin gebp micro kernel 2pX1");
             RhsPacket B_0, B1;
-        
-#define EIGEN_GEBGP_ONESTEP(K) \
-            do {                                                                  \
-              EIGEN_ASM_COMMENT("begin step of gebp micro kernel 2pX1");          \
-              EIGEN_ASM_COMMENT("Note: these asm comments work around bug 935!"); \
-              traits.loadLhs(&blA[(0+2*K)*LhsProgress], A0);                      \
-              traits.loadLhs(&blA[(1+2*K)*LhsProgress], A1);                      \
-              traits.loadRhs(&blB[(0+K)*RhsProgress], B_0);                       \
-              traits.madd(A0, B_0, C0, B1, fix<0>);                               \
-              traits.madd(A1, B_0, C4, B_0, fix<0>);                              \
-              EIGEN_ASM_COMMENT("end step of gebp micro kernel 2pX1");            \
-            } while(false)
-        
+
+#define EIGEN_GEBGP_ONESTEP(K)                                          \
+  do {                                                                  \
+    EIGEN_ASM_COMMENT("begin step of gebp micro kernel 2pX1");          \
+    EIGEN_ASM_COMMENT("Note: these asm comments work around bug 935!"); \
+    traits.loadLhs(&blA[(0 + 2 * K) * LhsProgress], A0);                \
+    traits.loadLhs(&blA[(1 + 2 * K) * LhsProgress], A1);                \
+    traits.loadRhs(&blB[(0 + K) * RhsProgress], B_0);                   \
+    traits.madd(A0, B_0, C0, B1, fix<0>);                               \
+    traits.madd(A1, B_0, C4, B_0, fix<0>);                              \
+    EIGEN_ASM_COMMENT("end step of gebp micro kernel 2pX1");            \
+  } while (false)
+
             EIGEN_GEBGP_ONESTEP(0);
             EIGEN_GEBGP_ONESTEP(1);
             EIGEN_GEBGP_ONESTEP(2);
@@ -2381,12 +2279,11 @@
           }
 
           // process remaining peeled loop
-          for(Index k=peeled_kc; k<depth; k++)
-          {
+          for (Index k = peeled_kc; k < depth; k++) {
             RhsPacket B_0, B1;
             EIGEN_GEBGP_ONESTEP(0);
             blB += RhsProgress;
-            blA += 2*Traits::LhsProgress;
+            blA += 2 * Traits::LhsProgress;
           }
 #undef EIGEN_GEBGP_ONESTEP
           ResPacket R0, R1;
@@ -2398,46 +2295,49 @@
           traits.acc(C4, alphav, R1);
           r0.storePacket(0 * Traits::ResPacketSize, R0);
           r0.storePacket(1 * Traits::ResPacketSize, R1);
-          }
         }
       }
     }
-    //---------- Process 1 * LhsProgress rows at once ----------
-    if(mr>=1*Traits::LhsProgress)
-    {
-      lhs_process_one_packet<nr, LhsProgress, RhsProgress, LhsScalar, RhsScalar, ResScalar, AccPacket, LhsPacket, RhsPacket, ResPacket, Traits, LinearMapper, DataMapper> p;
-      p(res, blockA, blockB, alpha, peeled_mc2, peeled_mc1, strideA, strideB, offsetA, offsetB, prefetch_res_offset, peeled_kc, pk, cols, depth, packet_cols4);
-    }
-    //---------- Process LhsProgressHalf rows at once ----------
-    if((LhsProgressHalf < LhsProgress) && mr>=LhsProgressHalf)
-    {
-      lhs_process_fraction_of_packet<nr, LhsProgressHalf, RhsProgressHalf, LhsScalar, RhsScalar, ResScalar, AccPacketHalf, LhsPacketHalf, RhsPacketHalf, ResPacketHalf, HalfTraits, LinearMapper, DataMapper> p;
-      p(res, blockA, blockB, alpha, peeled_mc1, peeled_mc_half, strideA, strideB, offsetA, offsetB, prefetch_res_offset, peeled_kc, pk, cols, depth, packet_cols4);
-    }
-    //---------- Process LhsProgressQuarter rows at once ----------
-    if((LhsProgressQuarter < LhsProgressHalf) && mr>=LhsProgressQuarter)
-    {
-      lhs_process_fraction_of_packet<nr, LhsProgressQuarter, RhsProgressQuarter, LhsScalar, RhsScalar, ResScalar, AccPacketQuarter, LhsPacketQuarter, RhsPacketQuarter, ResPacketQuarter, QuarterTraits, LinearMapper, DataMapper> p;
-      p(res, blockA, blockB, alpha, peeled_mc_half, peeled_mc_quarter, strideA, strideB, offsetA, offsetB, prefetch_res_offset, peeled_kc, pk, cols, depth, packet_cols4);
-    }
-    //---------- Process remaining rows, 1 at once ----------
-    if(peeled_mc_quarter<rows)
-    {
+  }
+  //---------- Process 1 * LhsProgress rows at once ----------
+  if (mr >= 1 * Traits::LhsProgress) {
+    lhs_process_one_packet<nr, LhsProgress, RhsProgress, LhsScalar, RhsScalar, ResScalar, AccPacket, LhsPacket,
+                           RhsPacket, ResPacket, Traits, LinearMapper, DataMapper>
+        p;
+    p(res, blockA, blockB, alpha, peeled_mc2, peeled_mc1, strideA, strideB, offsetA, offsetB, prefetch_res_offset,
+      peeled_kc, pk, cols, depth, packet_cols4);
+  }
+  //---------- Process LhsProgressHalf rows at once ----------
+  if ((LhsProgressHalf < LhsProgress) && mr >= LhsProgressHalf) {
+    lhs_process_fraction_of_packet<nr, LhsProgressHalf, RhsProgressHalf, LhsScalar, RhsScalar, ResScalar, AccPacketHalf,
+                                   LhsPacketHalf, RhsPacketHalf, ResPacketHalf, HalfTraits, LinearMapper, DataMapper>
+        p;
+    p(res, blockA, blockB, alpha, peeled_mc1, peeled_mc_half, strideA, strideB, offsetA, offsetB, prefetch_res_offset,
+      peeled_kc, pk, cols, depth, packet_cols4);
+  }
+  //---------- Process LhsProgressQuarter rows at once ----------
+  if ((LhsProgressQuarter < LhsProgressHalf) && mr >= LhsProgressQuarter) {
+    lhs_process_fraction_of_packet<nr, LhsProgressQuarter, RhsProgressQuarter, LhsScalar, RhsScalar, ResScalar,
+                                   AccPacketQuarter, LhsPacketQuarter, RhsPacketQuarter, ResPacketQuarter,
+                                   QuarterTraits, LinearMapper, DataMapper>
+        p;
+    p(res, blockA, blockB, alpha, peeled_mc_half, peeled_mc_quarter, strideA, strideB, offsetA, offsetB,
+      prefetch_res_offset, peeled_kc, pk, cols, depth, packet_cols4);
+  }
+  //---------- Process remaining rows, 1 at once ----------
+  if (peeled_mc_quarter < rows) {
 #if EIGEN_ARCH_ARM64
-      EIGEN_IF_CONSTEXPR(nr>=8) {
+    EIGEN_IF_CONSTEXPR(nr >= 8) {
       // loop on each panel of the rhs
-      for(Index j2=0; j2<packet_cols8; j2+=8)
-      {
+      for (Index j2 = 0; j2 < packet_cols8; j2 += 8) {
         // loop on each row of the lhs (1*LhsProgress x depth)
-        for(Index i=peeled_mc_quarter; i<rows; i+=1)
-        {
-          const LhsScalar* blA = &blockA[i*strideA+offsetA];
+        for (Index i = peeled_mc_quarter; i < rows; i += 1) {
+          const LhsScalar* blA = &blockA[i * strideA + offsetA];
           prefetch(&blA[0]);
           // gets a 1 x 1 res block as registers
-          ResScalar C0(0),C1(0),C2(0),C3(0),C4(0),C5(0),C6(0),C7(0);
-          const RhsScalar* blB = &blockB[j2*strideB+offsetB*8];
-          for(Index k=0; k<depth; k++)
-          {
+          ResScalar C0(0), C1(0), C2(0), C3(0), C4(0), C5(0), C6(0), C7(0);
+          const RhsScalar* blB = &blockB[j2 * strideB + offsetB * 8];
+          for (Index k = 0; k < depth; k++) {
             LhsScalar A0 = blA[k];
             RhsScalar B_0;
 
@@ -2477,180 +2377,170 @@
           res(i, j2 + 7) += alpha * C7;
         }
       }
-      }
+    }
 #endif
 
-      for(Index j2=packet_cols8; j2<packet_cols4; j2+=4)
-      {
-        // loop on each row of the lhs (1*LhsProgress x depth)
-        for(Index i=peeled_mc_quarter; i<rows; i+=1)
-        {
-          const LhsScalar* blA = &blockA[i*strideA+offsetA];
-          prefetch(&blA[0]);
-          const RhsScalar* blB = &blockB[j2*strideB+offsetB*4];
+    for (Index j2 = packet_cols8; j2 < packet_cols4; j2 += 4) {
+      // loop on each row of the lhs (1*LhsProgress x depth)
+      for (Index i = peeled_mc_quarter; i < rows; i += 1) {
+        const LhsScalar* blA = &blockA[i * strideA + offsetA];
+        prefetch(&blA[0]);
+        const RhsScalar* blB = &blockB[j2 * strideB + offsetB * 4];
 
-          // If LhsProgress is 8 or 16, it assumes that there is a
-          // half or quarter packet, respectively, of the same size as
-          // nr (which is currently 4) for the return type.
-          const int SResPacketHalfSize = unpacket_traits<typename unpacket_traits<SResPacket>::half>::size;
-          const int SResPacketQuarterSize = unpacket_traits<typename unpacket_traits<typename unpacket_traits<SResPacket>::half>::half>::size;
-          // The following code assumes we can load SRhsPacket in such a way that
-          // it multiplies blocks of 4 elements in SLhsPacket.  This is not the
-          // case for some customized kernels (i.e. NEON fp16).  If the assumption
-          // fails, drop down to the scalar path.
-          constexpr bool kCanLoadSRhsQuad = (unpacket_traits<SLhsPacket>::size < 4) || (unpacket_traits<SRhsPacket>::size % (unpacket_traits<SLhsPacket>::size / 4)) == 0;
-          if (kCanLoadSRhsQuad && 
-              (SwappedTraits::LhsProgress % 4) == 0 &&
-              (SwappedTraits::LhsProgress<=16) &&
-              (SwappedTraits::LhsProgress!=8  || SResPacketHalfSize==nr) &&
-              (SwappedTraits::LhsProgress!=16 || SResPacketQuarterSize==nr))
-          {
-            SAccPacket C0, C1, C2, C3;
-            straits.initAcc(C0);
-            straits.initAcc(C1);
-            straits.initAcc(C2);
-            straits.initAcc(C3);
+        // If LhsProgress is 8 or 16, it assumes that there is a
+        // half or quarter packet, respectively, of the same size as
+        // nr (which is currently 4) for the return type.
+        const int SResPacketHalfSize = unpacket_traits<typename unpacket_traits<SResPacket>::half>::size;
+        const int SResPacketQuarterSize =
+            unpacket_traits<typename unpacket_traits<typename unpacket_traits<SResPacket>::half>::half>::size;
+        // The following code assumes we can load SRhsPacket in such a way that
+        // it multiplies blocks of 4 elements in SLhsPacket.  This is not the
+        // case for some customized kernels (i.e. NEON fp16).  If the assumption
+        // fails, drop down to the scalar path.
+        constexpr bool kCanLoadSRhsQuad =
+            (unpacket_traits<SLhsPacket>::size < 4) ||
+            (unpacket_traits<SRhsPacket>::size % (unpacket_traits<SLhsPacket>::size / 4)) == 0;
+        if (kCanLoadSRhsQuad && (SwappedTraits::LhsProgress % 4) == 0 && (SwappedTraits::LhsProgress <= 16) &&
+            (SwappedTraits::LhsProgress != 8 || SResPacketHalfSize == nr) &&
+            (SwappedTraits::LhsProgress != 16 || SResPacketQuarterSize == nr)) {
+          SAccPacket C0, C1, C2, C3;
+          straits.initAcc(C0);
+          straits.initAcc(C1);
+          straits.initAcc(C2);
+          straits.initAcc(C3);
 
-            const Index spk   = (std::max)(1,SwappedTraits::LhsProgress/4);
-            const Index endk  = (depth/spk)*spk;
-            const Index endk4 = (depth/(spk*4))*(spk*4);
+          const Index spk = (std::max)(1, SwappedTraits::LhsProgress / 4);
+          const Index endk = (depth / spk) * spk;
+          const Index endk4 = (depth / (spk * 4)) * (spk * 4);
 
-            Index k=0;
-            for(; k<endk4; k+=4*spk)
-            {
-              SLhsPacket A0,A1;
-              SRhsPacket B_0,B_1;
+          Index k = 0;
+          for (; k < endk4; k += 4 * spk) {
+            SLhsPacket A0, A1;
+            SRhsPacket B_0, B_1;
 
-              straits.loadLhsUnaligned(blB+0*SwappedTraits::LhsProgress, A0);
-              straits.loadLhsUnaligned(blB+1*SwappedTraits::LhsProgress, A1);
+            straits.loadLhsUnaligned(blB + 0 * SwappedTraits::LhsProgress, A0);
+            straits.loadLhsUnaligned(blB + 1 * SwappedTraits::LhsProgress, A1);
 
-              straits.loadRhsQuad(blA+0*spk, B_0);
-              straits.loadRhsQuad(blA+1*spk, B_1);
-              straits.madd(A0,B_0,C0,B_0, fix<0>);
-              straits.madd(A1,B_1,C1,B_1, fix<0>);
+            straits.loadRhsQuad(blA + 0 * spk, B_0);
+            straits.loadRhsQuad(blA + 1 * spk, B_1);
+            straits.madd(A0, B_0, C0, B_0, fix<0>);
+            straits.madd(A1, B_1, C1, B_1, fix<0>);
 
-              straits.loadLhsUnaligned(blB+2*SwappedTraits::LhsProgress, A0);
-              straits.loadLhsUnaligned(blB+3*SwappedTraits::LhsProgress, A1);
-              straits.loadRhsQuad(blA+2*spk, B_0);
-              straits.loadRhsQuad(blA+3*spk, B_1);
-              straits.madd(A0,B_0,C2,B_0, fix<0>);
-              straits.madd(A1,B_1,C3,B_1, fix<0>);
+            straits.loadLhsUnaligned(blB + 2 * SwappedTraits::LhsProgress, A0);
+            straits.loadLhsUnaligned(blB + 3 * SwappedTraits::LhsProgress, A1);
+            straits.loadRhsQuad(blA + 2 * spk, B_0);
+            straits.loadRhsQuad(blA + 3 * spk, B_1);
+            straits.madd(A0, B_0, C2, B_0, fix<0>);
+            straits.madd(A1, B_1, C3, B_1, fix<0>);
 
-              blB += 4*SwappedTraits::LhsProgress;
-              blA += 4*spk;
-            }
-            C0 = padd(padd(C0,C1),padd(C2,C3));
-            for(; k<endk; k+=spk)
-            {
-              SLhsPacket A0;
-              SRhsPacket B_0;
-
-              straits.loadLhsUnaligned(blB, A0);
-              straits.loadRhsQuad(blA, B_0);
-              straits.madd(A0,B_0,C0,B_0, fix<0>);
-
-              blB += SwappedTraits::LhsProgress;
-              blA += spk;
-            }
-            if(SwappedTraits::LhsProgress==8)
-            {
-              // Special case where we have to first reduce the accumulation register C0
-              typedef std::conditional_t<SwappedTraits::LhsProgress>=8,typename unpacket_traits<SResPacket>::half,SResPacket> SResPacketHalf;
-              typedef std::conditional_t<SwappedTraits::LhsProgress>=8,typename unpacket_traits<SLhsPacket>::half,SLhsPacket> SLhsPacketHalf;
-              typedef std::conditional_t<SwappedTraits::LhsProgress>=8,typename unpacket_traits<SRhsPacket>::half,SRhsPacket> SRhsPacketHalf;
-              typedef std::conditional_t<SwappedTraits::LhsProgress>=8,typename unpacket_traits<SAccPacket>::half,SAccPacket> SAccPacketHalf;
-
-              SResPacketHalf R = res.template gatherPacket<SResPacketHalf>(i, j2);
-              SResPacketHalf alphav = pset1<SResPacketHalf>(alpha);
-
-              if(depth-endk>0)
-              {
-                // We have to handle the last row of the rhs which corresponds to a half-packet
-                SLhsPacketHalf a0;
-                SRhsPacketHalf b0;
-                straits.loadLhsUnaligned(blB, a0);
-                straits.loadRhs(blA, b0);
-                SAccPacketHalf c0 = predux_half_dowto4(C0);
-                straits.madd(a0,b0,c0,b0, fix<0>);
-                straits.acc(c0, alphav, R);
-              }
-              else
-              {
-                straits.acc(predux_half_dowto4(C0), alphav, R);
-              }
-              res.scatterPacket(i, j2, R);
-            }
-            else if (SwappedTraits::LhsProgress==16)
-            {
-              // Special case where we have to first reduce the
-              // accumulation register C0. We specialize the block in
-              // template form, so that LhsProgress < 16 paths don't
-              // fail to compile
-              last_row_process_16_packets<LhsScalar, RhsScalar, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs> p;
-	            p(res, straits, blA, blB, depth, endk, i, j2,alpha, C0);
-            }
-            else
-            {
-              SResPacket R = res.template gatherPacket<SResPacket>(i, j2);
-              SResPacket alphav = pset1<SResPacket>(alpha);
-              straits.acc(C0, alphav, R);
-              res.scatterPacket(i, j2, R);
-            }
+            blB += 4 * SwappedTraits::LhsProgress;
+            blA += 4 * spk;
           }
-          else // scalar path
-          {
-            // get a 1 x 4 res block as registers
-            ResScalar C0(0), C1(0), C2(0), C3(0);
+          C0 = padd(padd(C0, C1), padd(C2, C3));
+          for (; k < endk; k += spk) {
+            SLhsPacket A0;
+            SRhsPacket B_0;
 
-            for(Index k=0; k<depth; k++)
-            {
-              LhsScalar A0;
-              RhsScalar B_0, B_1;
+            straits.loadLhsUnaligned(blB, A0);
+            straits.loadRhsQuad(blA, B_0);
+            straits.madd(A0, B_0, C0, B_0, fix<0>);
 
-              A0 = blA[k];
-
-              B_0 = blB[0];
-              B_1 = blB[1];
-              C0 = cj.pmadd(A0,B_0,C0);
-              C1 = cj.pmadd(A0,B_1,C1);
-
-              B_0 = blB[2];
-              B_1 = blB[3];
-              C2 = cj.pmadd(A0,B_0,C2);
-              C3 = cj.pmadd(A0,B_1,C3);
-
-              blB += 4;
-            }
-            res(i, j2 + 0) += alpha * C0;
-            res(i, j2 + 1) += alpha * C1;
-            res(i, j2 + 2) += alpha * C2;
-            res(i, j2 + 3) += alpha * C3;
+            blB += SwappedTraits::LhsProgress;
+            blA += spk;
           }
-        }
-      }
-      // remaining columns
-      for(Index j2=packet_cols4; j2<cols; j2++)
-      {
-        // loop on each row of the lhs (1*LhsProgress x depth)
-        for(Index i=peeled_mc_quarter; i<rows; i+=1)
+          if (SwappedTraits::LhsProgress == 8) {
+            // Special case where we have to first reduce the accumulation register C0
+            typedef std::conditional_t<SwappedTraits::LhsProgress >= 8, typename unpacket_traits<SResPacket>::half,
+                                       SResPacket>
+                SResPacketHalf;
+            typedef std::conditional_t<SwappedTraits::LhsProgress >= 8, typename unpacket_traits<SLhsPacket>::half,
+                                       SLhsPacket>
+                SLhsPacketHalf;
+            typedef std::conditional_t<SwappedTraits::LhsProgress >= 8, typename unpacket_traits<SRhsPacket>::half,
+                                       SRhsPacket>
+                SRhsPacketHalf;
+            typedef std::conditional_t<SwappedTraits::LhsProgress >= 8, typename unpacket_traits<SAccPacket>::half,
+                                       SAccPacket>
+                SAccPacketHalf;
+
+            SResPacketHalf R = res.template gatherPacket<SResPacketHalf>(i, j2);
+            SResPacketHalf alphav = pset1<SResPacketHalf>(alpha);
+
+            if (depth - endk > 0) {
+              // We have to handle the last row of the rhs which corresponds to a half-packet
+              SLhsPacketHalf a0;
+              SRhsPacketHalf b0;
+              straits.loadLhsUnaligned(blB, a0);
+              straits.loadRhs(blA, b0);
+              SAccPacketHalf c0 = predux_half_dowto4(C0);
+              straits.madd(a0, b0, c0, b0, fix<0>);
+              straits.acc(c0, alphav, R);
+            } else {
+              straits.acc(predux_half_dowto4(C0), alphav, R);
+            }
+            res.scatterPacket(i, j2, R);
+          } else if (SwappedTraits::LhsProgress == 16) {
+            // Special case where we have to first reduce the
+            // accumulation register C0. We specialize the block in
+            // template form, so that LhsProgress < 16 paths don't
+            // fail to compile
+            last_row_process_16_packets<LhsScalar, RhsScalar, Index, DataMapper, mr, nr, ConjugateLhs, ConjugateRhs> p;
+            p(res, straits, blA, blB, depth, endk, i, j2, alpha, C0);
+          } else {
+            SResPacket R = res.template gatherPacket<SResPacket>(i, j2);
+            SResPacket alphav = pset1<SResPacket>(alpha);
+            straits.acc(C0, alphav, R);
+            res.scatterPacket(i, j2, R);
+          }
+        } else  // scalar path
         {
-          const LhsScalar* blA = &blockA[i*strideA+offsetA];
-          prefetch(&blA[0]);
-          // gets a 1 x 1 res block as registers
-          ResScalar C0(0);
-          const RhsScalar* blB = &blockB[j2*strideB+offsetB];
-          for(Index k=0; k<depth; k++)
-          {
-            LhsScalar A0 = blA[k];
-            RhsScalar B_0 = blB[k];
+          // get a 1 x 4 res block as registers
+          ResScalar C0(0), C1(0), C2(0), C3(0);
+
+          for (Index k = 0; k < depth; k++) {
+            LhsScalar A0;
+            RhsScalar B_0, B_1;
+
+            A0 = blA[k];
+
+            B_0 = blB[0];
+            B_1 = blB[1];
             C0 = cj.pmadd(A0, B_0, C0);
+            C1 = cj.pmadd(A0, B_1, C1);
+
+            B_0 = blB[2];
+            B_1 = blB[3];
+            C2 = cj.pmadd(A0, B_0, C2);
+            C3 = cj.pmadd(A0, B_1, C3);
+
+            blB += 4;
           }
-          res(i, j2) += alpha * C0;
+          res(i, j2 + 0) += alpha * C0;
+          res(i, j2 + 1) += alpha * C1;
+          res(i, j2 + 2) += alpha * C2;
+          res(i, j2 + 3) += alpha * C3;
         }
       }
     }
+    // remaining columns
+    for (Index j2 = packet_cols4; j2 < cols; j2++) {
+      // loop on each row of the lhs (1*LhsProgress x depth)
+      for (Index i = peeled_mc_quarter; i < rows; i += 1) {
+        const LhsScalar* blA = &blockA[i * strideA + offsetA];
+        prefetch(&blA[0]);
+        // gets a 1 x 1 res block as registers
+        ResScalar C0(0);
+        const RhsScalar* blB = &blockB[j2 * strideB + offsetB];
+        for (Index k = 0; k < depth; k++) {
+          LhsScalar A0 = blA[k];
+          RhsScalar B_0 = blB[k];
+          C0 = cj.pmadd(A0, B_0, C0);
+        }
+        res(i, j2) += alpha * C0;
+      }
+    }
   }
-
+}
 
 // pack a block of the lhs
 // The traversal is as follow (mr==4):
@@ -2666,131 +2556,129 @@
 //
 //  32 33 34 35 ...
 //  36 36 38 39 ...
-template<typename Scalar, typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
-struct gemm_pack_lhs<Scalar, Index, DataMapper, Pack1, Pack2, Packet, ColMajor, Conjugate, PanelMode>
-{
+template <typename Scalar, typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate,
+          bool PanelMode>
+struct gemm_pack_lhs<Scalar, Index, DataMapper, Pack1, Pack2, Packet, ColMajor, Conjugate, PanelMode> {
   typedef typename DataMapper::LinearMapper LinearMapper;
-  EIGEN_DONT_INLINE void operator()(Scalar* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride=0, Index offset=0);
+  EIGEN_DONT_INLINE void operator()(Scalar* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride = 0,
+                                    Index offset = 0);
 };
 
-template<typename Scalar, typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
-EIGEN_DONT_INLINE void gemm_pack_lhs<Scalar, Index, DataMapper, Pack1, Pack2, Packet, ColMajor, Conjugate, PanelMode>
-  ::operator()(Scalar* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride, Index offset)
-{
+template <typename Scalar, typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate,
+          bool PanelMode>
+EIGEN_DONT_INLINE void gemm_pack_lhs<Scalar, Index, DataMapper, Pack1, Pack2, Packet, ColMajor, Conjugate,
+                                     PanelMode>::operator()(Scalar* blockA, const DataMapper& lhs, Index depth,
+                                                            Index rows, Index stride, Index offset) {
   typedef typename unpacket_traits<Packet>::half HalfPacket;
   typedef typename unpacket_traits<typename unpacket_traits<Packet>::half>::half QuarterPacket;
-  enum { PacketSize = unpacket_traits<Packet>::size,
-         HalfPacketSize = unpacket_traits<HalfPacket>::size,
-         QuarterPacketSize = unpacket_traits<QuarterPacket>::size,
-         HasHalf = (int)HalfPacketSize < (int)PacketSize,
-         HasQuarter = (int)QuarterPacketSize < (int)HalfPacketSize};
+  enum {
+    PacketSize = unpacket_traits<Packet>::size,
+    HalfPacketSize = unpacket_traits<HalfPacket>::size,
+    QuarterPacketSize = unpacket_traits<QuarterPacket>::size,
+    HasHalf = (int)HalfPacketSize < (int)PacketSize,
+    HasQuarter = (int)QuarterPacketSize < (int)HalfPacketSize
+  };
 
   EIGEN_ASM_COMMENT("EIGEN PRODUCT PACK LHS");
   EIGEN_UNUSED_VARIABLE(stride);
   EIGEN_UNUSED_VARIABLE(offset);
-  eigen_assert(((!PanelMode) && stride==0 && offset==0) || (PanelMode && stride>=depth && offset<=stride));
-  eigen_assert( ((Pack1%PacketSize)==0 && Pack1<=4*PacketSize) || (Pack1<=4) );
+  eigen_assert(((!PanelMode) && stride == 0 && offset == 0) || (PanelMode && stride >= depth && offset <= stride));
+  eigen_assert(((Pack1 % PacketSize) == 0 && Pack1 <= 4 * PacketSize) || (Pack1 <= 4));
   conj_if<NumTraits<Scalar>::IsComplex && Conjugate> cj;
   Index count = 0;
 
-  const Index peeled_mc3 = Pack1>=3*PacketSize ? (rows/(3*PacketSize))*(3*PacketSize) : 0;
-  const Index peeled_mc2 = Pack1>=2*PacketSize ? peeled_mc3+((rows-peeled_mc3)/(2*PacketSize))*(2*PacketSize) : 0;
-  const Index peeled_mc1 = Pack1>=1*PacketSize ? peeled_mc2+((rows-peeled_mc2)/(1*PacketSize))*(1*PacketSize) : 0;
-  const Index peeled_mc_half = Pack1>=HalfPacketSize ? peeled_mc1+((rows-peeled_mc1)/(HalfPacketSize))*(HalfPacketSize) : 0;
-  const Index peeled_mc_quarter = Pack1>=QuarterPacketSize ? (rows/(QuarterPacketSize))*(QuarterPacketSize) : 0;
+  const Index peeled_mc3 = Pack1 >= 3 * PacketSize ? (rows / (3 * PacketSize)) * (3 * PacketSize) : 0;
+  const Index peeled_mc2 =
+      Pack1 >= 2 * PacketSize ? peeled_mc3 + ((rows - peeled_mc3) / (2 * PacketSize)) * (2 * PacketSize) : 0;
+  const Index peeled_mc1 =
+      Pack1 >= 1 * PacketSize ? peeled_mc2 + ((rows - peeled_mc2) / (1 * PacketSize)) * (1 * PacketSize) : 0;
+  const Index peeled_mc_half =
+      Pack1 >= HalfPacketSize ? peeled_mc1 + ((rows - peeled_mc1) / (HalfPacketSize)) * (HalfPacketSize) : 0;
+  const Index peeled_mc_quarter = Pack1 >= QuarterPacketSize ? (rows / (QuarterPacketSize)) * (QuarterPacketSize) : 0;
   const Index last_lhs_progress = rows > peeled_mc_quarter ? (rows - peeled_mc_quarter) & ~1 : 0;
-  const Index peeled_mc0 = Pack2>=PacketSize ? peeled_mc_quarter
-                         : Pack2>1 && last_lhs_progress ? (rows/last_lhs_progress)*last_lhs_progress : 0;
+  const Index peeled_mc0 = Pack2 >= PacketSize              ? peeled_mc_quarter
+                           : Pack2 > 1 && last_lhs_progress ? (rows / last_lhs_progress) * last_lhs_progress
+                                                            : 0;
 
-  Index i=0;
+  Index i = 0;
 
   // Pack 3 packets
-  if(Pack1>=3*PacketSize)
-  {
-    for(; i<peeled_mc3; i+=3*PacketSize)
-    {
-      if(PanelMode) count += (3*PacketSize) * offset;
+  if (Pack1 >= 3 * PacketSize) {
+    for (; i < peeled_mc3; i += 3 * PacketSize) {
+      if (PanelMode) count += (3 * PacketSize) * offset;
 
-      for(Index k=0; k<depth; k++)
-      {
+      for (Index k = 0; k < depth; k++) {
         Packet A, B, C;
-        A = lhs.template loadPacket<Packet>(i+0*PacketSize, k);
-        B = lhs.template loadPacket<Packet>(i+1*PacketSize, k);
-        C = lhs.template loadPacket<Packet>(i+2*PacketSize, k);
-        pstore(blockA+count, cj.pconj(A)); count+=PacketSize;
-        pstore(blockA+count, cj.pconj(B)); count+=PacketSize;
-        pstore(blockA+count, cj.pconj(C)); count+=PacketSize;
+        A = lhs.template loadPacket<Packet>(i + 0 * PacketSize, k);
+        B = lhs.template loadPacket<Packet>(i + 1 * PacketSize, k);
+        C = lhs.template loadPacket<Packet>(i + 2 * PacketSize, k);
+        pstore(blockA + count, cj.pconj(A));
+        count += PacketSize;
+        pstore(blockA + count, cj.pconj(B));
+        count += PacketSize;
+        pstore(blockA + count, cj.pconj(C));
+        count += PacketSize;
       }
-      if(PanelMode) count += (3*PacketSize) * (stride-offset-depth);
+      if (PanelMode) count += (3 * PacketSize) * (stride - offset - depth);
     }
   }
   // Pack 2 packets
-  if(Pack1>=2*PacketSize)
-  {
-    for(; i<peeled_mc2; i+=2*PacketSize)
-    {
-      if(PanelMode) count += (2*PacketSize) * offset;
+  if (Pack1 >= 2 * PacketSize) {
+    for (; i < peeled_mc2; i += 2 * PacketSize) {
+      if (PanelMode) count += (2 * PacketSize) * offset;
 
-      for(Index k=0; k<depth; k++)
-      {
+      for (Index k = 0; k < depth; k++) {
         Packet A, B;
-        A = lhs.template loadPacket<Packet>(i+0*PacketSize, k);
-        B = lhs.template loadPacket<Packet>(i+1*PacketSize, k);
-        pstore(blockA+count, cj.pconj(A)); count+=PacketSize;
-        pstore(blockA+count, cj.pconj(B)); count+=PacketSize;
+        A = lhs.template loadPacket<Packet>(i + 0 * PacketSize, k);
+        B = lhs.template loadPacket<Packet>(i + 1 * PacketSize, k);
+        pstore(blockA + count, cj.pconj(A));
+        count += PacketSize;
+        pstore(blockA + count, cj.pconj(B));
+        count += PacketSize;
       }
-      if(PanelMode) count += (2*PacketSize) * (stride-offset-depth);
+      if (PanelMode) count += (2 * PacketSize) * (stride - offset - depth);
     }
   }
   // Pack 1 packets
-  if(Pack1>=1*PacketSize)
-  {
-    for(; i<peeled_mc1; i+=1*PacketSize)
-    {
-      if(PanelMode) count += (1*PacketSize) * offset;
+  if (Pack1 >= 1 * PacketSize) {
+    for (; i < peeled_mc1; i += 1 * PacketSize) {
+      if (PanelMode) count += (1 * PacketSize) * offset;
 
-      for(Index k=0; k<depth; k++)
-      {
+      for (Index k = 0; k < depth; k++) {
         Packet A;
-        A = lhs.template loadPacket<Packet>(i+0*PacketSize, k);
-        pstore(blockA+count, cj.pconj(A));
-        count+=PacketSize;
+        A = lhs.template loadPacket<Packet>(i + 0 * PacketSize, k);
+        pstore(blockA + count, cj.pconj(A));
+        count += PacketSize;
       }
-      if(PanelMode) count += (1*PacketSize) * (stride-offset-depth);
+      if (PanelMode) count += (1 * PacketSize) * (stride - offset - depth);
     }
   }
   // Pack half packets
-  if(HasHalf && Pack1>=HalfPacketSize)
-  {
-    for(; i<peeled_mc_half; i+=HalfPacketSize)
-    {
-      if(PanelMode) count += (HalfPacketSize) * offset;
+  if (HasHalf && Pack1 >= HalfPacketSize) {
+    for (; i < peeled_mc_half; i += HalfPacketSize) {
+      if (PanelMode) count += (HalfPacketSize)*offset;
 
-      for(Index k=0; k<depth; k++)
-      {
+      for (Index k = 0; k < depth; k++) {
         HalfPacket A;
-        A = lhs.template loadPacket<HalfPacket>(i+0*(HalfPacketSize), k);
-        pstoreu(blockA+count, cj.pconj(A));
-        count+=HalfPacketSize;
+        A = lhs.template loadPacket<HalfPacket>(i + 0 * (HalfPacketSize), k);
+        pstoreu(blockA + count, cj.pconj(A));
+        count += HalfPacketSize;
       }
-      if(PanelMode) count += (HalfPacketSize) * (stride-offset-depth);
+      if (PanelMode) count += (HalfPacketSize) * (stride - offset - depth);
     }
   }
   // Pack quarter packets
-  if(HasQuarter && Pack1>=QuarterPacketSize)
-  {
-    for(; i<peeled_mc_quarter; i+=QuarterPacketSize)
-    {
-      if(PanelMode) count += (QuarterPacketSize) * offset;
+  if (HasQuarter && Pack1 >= QuarterPacketSize) {
+    for (; i < peeled_mc_quarter; i += QuarterPacketSize) {
+      if (PanelMode) count += (QuarterPacketSize)*offset;
 
-      for(Index k=0; k<depth; k++)
-      {
+      for (Index k = 0; k < depth; k++) {
         QuarterPacket A;
-        A = lhs.template loadPacket<QuarterPacket>(i+0*(QuarterPacketSize), k);
-        pstoreu(blockA+count, cj.pconj(A));
-        count+=QuarterPacketSize;
+        A = lhs.template loadPacket<QuarterPacket>(i + 0 * (QuarterPacketSize), k);
+        pstoreu(blockA + count, cj.pconj(A));
+        count += QuarterPacketSize;
       }
-      if(PanelMode) count += (QuarterPacketSize) * (stride-offset-depth);
+      if (PanelMode) count += (QuarterPacketSize) * (stride - offset - depth);
     }
   }
   // Pack2 may be *smaller* than PacketSize—that happens for
@@ -2799,52 +2687,51 @@
   // address both real & imaginary parts on the rhs. This portion will
   // pack those half ones until they match the number expected on the
   // last peeling loop at this point (for the rhs).
-  if(Pack2<PacketSize && Pack2>1)
-  {
-    for(; i<peeled_mc0; i+=last_lhs_progress)
-    {
-      if(PanelMode) count += last_lhs_progress * offset;
+  if (Pack2 < PacketSize && Pack2 > 1) {
+    for (; i < peeled_mc0; i += last_lhs_progress) {
+      if (PanelMode) count += last_lhs_progress * offset;
 
-      for(Index k=0; k<depth; k++)
-        for(Index w=0; w<last_lhs_progress; w++)
-          blockA[count++] = cj(lhs(i+w, k));
+      for (Index k = 0; k < depth; k++)
+        for (Index w = 0; w < last_lhs_progress; w++) blockA[count++] = cj(lhs(i + w, k));
 
-      if(PanelMode) count += last_lhs_progress * (stride-offset-depth);
+      if (PanelMode) count += last_lhs_progress * (stride - offset - depth);
     }
   }
   // Pack scalars
-  for(; i<rows; i++)
-  {
-    if(PanelMode) count += offset;
-    for(Index k=0; k<depth; k++)
-      blockA[count++] = cj(lhs(i, k));
-    if(PanelMode) count += (stride-offset-depth);
+  for (; i < rows; i++) {
+    if (PanelMode) count += offset;
+    for (Index k = 0; k < depth; k++) blockA[count++] = cj(lhs(i, k));
+    if (PanelMode) count += (stride - offset - depth);
   }
 }
 
-template<typename Scalar, typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
-struct gemm_pack_lhs<Scalar, Index, DataMapper, Pack1, Pack2, Packet, RowMajor, Conjugate, PanelMode>
-{
+template <typename Scalar, typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate,
+          bool PanelMode>
+struct gemm_pack_lhs<Scalar, Index, DataMapper, Pack1, Pack2, Packet, RowMajor, Conjugate, PanelMode> {
   typedef typename DataMapper::LinearMapper LinearMapper;
-  EIGEN_DONT_INLINE void operator()(Scalar* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride=0, Index offset=0);
+  EIGEN_DONT_INLINE void operator()(Scalar* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride = 0,
+                                    Index offset = 0);
 };
 
-template<typename Scalar, typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate, bool PanelMode>
-EIGEN_DONT_INLINE void gemm_pack_lhs<Scalar, Index, DataMapper, Pack1, Pack2, Packet, RowMajor, Conjugate, PanelMode>
-  ::operator()(Scalar* blockA, const DataMapper& lhs, Index depth, Index rows, Index stride, Index offset)
-{
+template <typename Scalar, typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, bool Conjugate,
+          bool PanelMode>
+EIGEN_DONT_INLINE void gemm_pack_lhs<Scalar, Index, DataMapper, Pack1, Pack2, Packet, RowMajor, Conjugate,
+                                     PanelMode>::operator()(Scalar* blockA, const DataMapper& lhs, Index depth,
+                                                            Index rows, Index stride, Index offset) {
   typedef typename unpacket_traits<Packet>::half HalfPacket;
   typedef typename unpacket_traits<typename unpacket_traits<Packet>::half>::half QuarterPacket;
-  enum { PacketSize = unpacket_traits<Packet>::size,
-         HalfPacketSize = unpacket_traits<HalfPacket>::size,
-         QuarterPacketSize = unpacket_traits<QuarterPacket>::size,
-         HasHalf = (int)HalfPacketSize < (int)PacketSize,
-         HasQuarter = (int)QuarterPacketSize < (int)HalfPacketSize};
+  enum {
+    PacketSize = unpacket_traits<Packet>::size,
+    HalfPacketSize = unpacket_traits<HalfPacket>::size,
+    QuarterPacketSize = unpacket_traits<QuarterPacket>::size,
+    HasHalf = (int)HalfPacketSize < (int)PacketSize,
+    HasQuarter = (int)QuarterPacketSize < (int)HalfPacketSize
+  };
 
   EIGEN_ASM_COMMENT("EIGEN PRODUCT PACK LHS");
   EIGEN_UNUSED_VARIABLE(stride);
   EIGEN_UNUSED_VARIABLE(offset);
-  eigen_assert(((!PanelMode) && stride==0 && offset==0) || (PanelMode && stride>=depth && offset<=stride));
+  eigen_assert(((!PanelMode) && stride == 0 && offset == 0) || (PanelMode && stride >= depth && offset <= stride));
   conj_if<NumTraits<Scalar>::IsComplex && Conjugate> cj;
   Index count = 0;
   bool gone_half = false, gone_quarter = false, gone_last = false;
@@ -2852,75 +2739,66 @@
   Index i = 0;
   Index pack = Pack1;
   Index psize = PacketSize;
-  while(pack>0)
-  {
-    Index remaining_rows = rows-i;
-    Index peeled_mc = gone_last ? Pack2>1 ? (rows/pack)*pack : 0 : i+(remaining_rows/pack)*pack;
+  while (pack > 0) {
+    Index remaining_rows = rows - i;
+    Index peeled_mc = gone_last ? Pack2 > 1 ? (rows / pack) * pack : 0 : i + (remaining_rows / pack) * pack;
     Index starting_pos = i;
-    for(; i<peeled_mc; i+=pack)
-    {
-      if(PanelMode) count += pack * offset;
+    for (; i < peeled_mc; i += pack) {
+      if (PanelMode) count += pack * offset;
 
-      Index k=0;
-      if(pack>=psize && psize >= QuarterPacketSize)
-      {
-        const Index peeled_k = (depth/psize)*psize;
-        for(; k<peeled_k; k+=psize)
-        {
-          for (Index m = 0; m < pack; m += psize)
-          {
+      Index k = 0;
+      if (pack >= psize && psize >= QuarterPacketSize) {
+        const Index peeled_k = (depth / psize) * psize;
+        for (; k < peeled_k; k += psize) {
+          for (Index m = 0; m < pack; m += psize) {
             if (psize == PacketSize) {
               PacketBlock<Packet> kernel;
-              for (Index p = 0; p < psize; ++p) kernel.packet[p] = lhs.template loadPacket<Packet>(i+p+m, k);
+              for (Index p = 0; p < psize; ++p) kernel.packet[p] = lhs.template loadPacket<Packet>(i + p + m, k);
               ptranspose(kernel);
-              for (Index p = 0; p < psize; ++p) pstore(blockA+count+m+(pack)*p, cj.pconj(kernel.packet[p]));
+              for (Index p = 0; p < psize; ++p) pstore(blockA + count + m + (pack)*p, cj.pconj(kernel.packet[p]));
             } else if (HasHalf && psize == HalfPacketSize) {
               gone_half = true;
               PacketBlock<HalfPacket> kernel_half;
-              for (Index p = 0; p < psize; ++p) kernel_half.packet[p] = lhs.template loadPacket<HalfPacket>(i+p+m, k);
+              for (Index p = 0; p < psize; ++p)
+                kernel_half.packet[p] = lhs.template loadPacket<HalfPacket>(i + p + m, k);
               ptranspose(kernel_half);
-              for (Index p = 0; p < psize; ++p) pstore(blockA+count+m+(pack)*p, cj.pconj(kernel_half.packet[p]));
+              for (Index p = 0; p < psize; ++p) pstore(blockA + count + m + (pack)*p, cj.pconj(kernel_half.packet[p]));
             } else if (HasQuarter && psize == QuarterPacketSize) {
               gone_quarter = true;
               PacketBlock<QuarterPacket> kernel_quarter;
-              for (Index p = 0; p < psize; ++p) kernel_quarter.packet[p] = lhs.template loadPacket<QuarterPacket>(i+p+m, k);
+              for (Index p = 0; p < psize; ++p)
+                kernel_quarter.packet[p] = lhs.template loadPacket<QuarterPacket>(i + p + m, k);
               ptranspose(kernel_quarter);
-              for (Index p = 0; p < psize; ++p) pstore(blockA+count+m+(pack)*p, cj.pconj(kernel_quarter.packet[p]));
-	    }
+              for (Index p = 0; p < psize; ++p)
+                pstore(blockA + count + m + (pack)*p, cj.pconj(kernel_quarter.packet[p]));
+            }
           }
-          count += psize*pack;
+          count += psize * pack;
         }
       }
 
-      for(; k<depth; k++)
-      {
-        Index w=0;
-        for(; w<pack-3; w+=4)
-        {
-          Scalar a(cj(lhs(i+w+0, k))),
-                 b(cj(lhs(i+w+1, k))),
-                 c(cj(lhs(i+w+2, k))),
-                 d(cj(lhs(i+w+3, k)));
+      for (; k < depth; k++) {
+        Index w = 0;
+        for (; w < pack - 3; w += 4) {
+          Scalar a(cj(lhs(i + w + 0, k))), b(cj(lhs(i + w + 1, k))), c(cj(lhs(i + w + 2, k))), d(cj(lhs(i + w + 3, k)));
           blockA[count++] = a;
           blockA[count++] = b;
           blockA[count++] = c;
           blockA[count++] = d;
         }
-        if(pack%4)
-          for(;w<pack;++w)
-            blockA[count++] = cj(lhs(i+w, k));
+        if (pack % 4)
+          for (; w < pack; ++w) blockA[count++] = cj(lhs(i + w, k));
       }
 
-      if(PanelMode) count += pack * (stride-offset-depth);
+      if (PanelMode) count += pack * (stride - offset - depth);
     }
 
     pack -= psize;
     Index left = rows - i;
     if (pack <= 0) {
-      if (!gone_last &&
-          (starting_pos == i || left >= psize/2 || left >= psize/4) &&
-          ((psize/2 == HalfPacketSize && HasHalf && !gone_half) ||
-           (psize/2 == QuarterPacketSize && HasQuarter && !gone_quarter))) {
+      if (!gone_last && (starting_pos == i || left >= psize / 2 || left >= psize / 4) &&
+          ((psize / 2 == HalfPacketSize && HasHalf && !gone_half) ||
+           (psize / 2 == QuarterPacketSize && HasQuarter && !gone_quarter))) {
         psize /= 2;
         pack = psize;
         continue;
@@ -2938,12 +2816,10 @@
     }
   }
 
-  for(; i<rows; i++)
-  {
-    if(PanelMode) count += offset;
-    for(Index k=0; k<depth; k++)
-      blockA[count++] = cj(lhs(i, k));
-    if(PanelMode) count += (stride-offset-depth);
+  for (; i < rows; i++) {
+    if (PanelMode) count += offset;
+    for (Index k = 0; k < depth; k++) blockA[count++] = cj(lhs(i, k));
+    if (PanelMode) count += (stride - offset - depth);
   }
 }
 
@@ -2954,36 +2830,33 @@
 //  4  5  6  7   16 17 18 19   25 28
 //  8  9 10 11   20 21 22 23   26 29
 //  .  .  .  .    .  .  .  .    .  .
-template<typename Scalar, typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
-struct gemm_pack_rhs<Scalar, Index, DataMapper, nr, ColMajor, Conjugate, PanelMode>
-{
+template <typename Scalar, typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
+struct gemm_pack_rhs<Scalar, Index, DataMapper, nr, ColMajor, Conjugate, PanelMode> {
   typedef typename packet_traits<Scalar>::type Packet;
   typedef typename DataMapper::LinearMapper LinearMapper;
   enum { PacketSize = packet_traits<Scalar>::size };
-  EIGEN_DONT_INLINE void operator()(Scalar* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride=0, Index offset=0);
+  EIGEN_DONT_INLINE void operator()(Scalar* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride = 0,
+                                    Index offset = 0);
 };
 
-template<typename Scalar, typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
-EIGEN_DONT_INLINE void gemm_pack_rhs<Scalar, Index, DataMapper, nr, ColMajor, Conjugate, PanelMode>
-  ::operator()(Scalar* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride, Index offset)
-{
+template <typename Scalar, typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
+EIGEN_DONT_INLINE void gemm_pack_rhs<Scalar, Index, DataMapper, nr, ColMajor, Conjugate, PanelMode>::operator()(
+    Scalar* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride, Index offset) {
   EIGEN_ASM_COMMENT("EIGEN PRODUCT PACK RHS COLMAJOR");
   EIGEN_UNUSED_VARIABLE(stride);
   EIGEN_UNUSED_VARIABLE(offset);
-  eigen_assert(((!PanelMode) && stride==0 && offset==0) || (PanelMode && stride>=depth && offset<=stride));
+  eigen_assert(((!PanelMode) && stride == 0 && offset == 0) || (PanelMode && stride >= depth && offset <= stride));
   conj_if<NumTraits<Scalar>::IsComplex && Conjugate> cj;
-  Index packet_cols8 = nr>=8 ? (cols/8) * 8 : 0;
-  Index packet_cols4 = nr>=4 ? (cols/4) * 4 : 0;
+  Index packet_cols8 = nr >= 8 ? (cols / 8) * 8 : 0;
+  Index packet_cols4 = nr >= 4 ? (cols / 4) * 4 : 0;
   Index count = 0;
-  const Index peeled_k = (depth/PacketSize)*PacketSize;
+  const Index peeled_k = (depth / PacketSize) * PacketSize;
 
 #if EIGEN_ARCH_ARM64
-  EIGEN_IF_CONSTEXPR(nr>=8)
-  {
-    for(Index j2=0; j2<packet_cols8; j2+=8)
-    {
+  EIGEN_IF_CONSTEXPR(nr >= 8) {
+    for (Index j2 = 0; j2 < packet_cols8; j2 += 8) {
       // skip what we have before
-      if(PanelMode) count += 8 * offset;
+      if (PanelMode) count += 8 * offset;
       const LinearMapper dm0 = rhs.getLinearMapper(0, j2 + 0);
       const LinearMapper dm1 = rhs.getLinearMapper(0, j2 + 1);
       const LinearMapper dm2 = rhs.getLinearMapper(0, j2 + 2);
@@ -2993,21 +2866,19 @@
       const LinearMapper dm6 = rhs.getLinearMapper(0, j2 + 6);
       const LinearMapper dm7 = rhs.getLinearMapper(0, j2 + 7);
       Index k = 0;
-      if (PacketSize % 2 == 0 && PacketSize <= 8) // 2 4 8
+      if (PacketSize % 2 == 0 && PacketSize <= 8)  // 2 4 8
       {
-        for (; k < peeled_k; k += PacketSize)
-        {
-          if (PacketSize == 2)
-          {
-            PacketBlock<Packet, PacketSize==2 ?2:PacketSize> kernel0, kernel1, kernel2, kernel3;
-            kernel0.packet[0%PacketSize] = dm0.template loadPacket<Packet>(k);
-            kernel0.packet[1%PacketSize] = dm1.template loadPacket<Packet>(k);
-            kernel1.packet[0%PacketSize] = dm2.template loadPacket<Packet>(k);
-            kernel1.packet[1%PacketSize] = dm3.template loadPacket<Packet>(k);
-            kernel2.packet[0%PacketSize] = dm4.template loadPacket<Packet>(k);
-            kernel2.packet[1%PacketSize] = dm5.template loadPacket<Packet>(k);
-            kernel3.packet[0%PacketSize] = dm6.template loadPacket<Packet>(k);
-            kernel3.packet[1%PacketSize] = dm7.template loadPacket<Packet>(k);
+        for (; k < peeled_k; k += PacketSize) {
+          if (PacketSize == 2) {
+            PacketBlock<Packet, PacketSize == 2 ? 2 : PacketSize> kernel0, kernel1, kernel2, kernel3;
+            kernel0.packet[0 % PacketSize] = dm0.template loadPacket<Packet>(k);
+            kernel0.packet[1 % PacketSize] = dm1.template loadPacket<Packet>(k);
+            kernel1.packet[0 % PacketSize] = dm2.template loadPacket<Packet>(k);
+            kernel1.packet[1 % PacketSize] = dm3.template loadPacket<Packet>(k);
+            kernel2.packet[0 % PacketSize] = dm4.template loadPacket<Packet>(k);
+            kernel2.packet[1 % PacketSize] = dm5.template loadPacket<Packet>(k);
+            kernel3.packet[0 % PacketSize] = dm6.template loadPacket<Packet>(k);
+            kernel3.packet[1 % PacketSize] = dm7.template loadPacket<Packet>(k);
             ptranspose(kernel0);
             ptranspose(kernel1);
             ptranspose(kernel2);
@@ -3022,257 +2893,238 @@
             pstoreu(blockB + count + 5 * PacketSize, cj.pconj(kernel1.packet[1 % PacketSize]));
             pstoreu(blockB + count + 6 * PacketSize, cj.pconj(kernel2.packet[1 % PacketSize]));
             pstoreu(blockB + count + 7 * PacketSize, cj.pconj(kernel3.packet[1 % PacketSize]));
-            count+=8*PacketSize;
-          }
-          else if (PacketSize == 4)
-          {
-            PacketBlock<Packet, PacketSize == 4?4:PacketSize> kernel0, kernel1;
+            count += 8 * PacketSize;
+          } else if (PacketSize == 4) {
+            PacketBlock<Packet, PacketSize == 4 ? 4 : PacketSize> kernel0, kernel1;
 
-            kernel0.packet[0%PacketSize] = dm0.template loadPacket<Packet>(k);
-            kernel0.packet[1%PacketSize] = dm1.template loadPacket<Packet>(k);
-            kernel0.packet[2%PacketSize] = dm2.template loadPacket<Packet>(k);
-            kernel0.packet[3%PacketSize] = dm3.template loadPacket<Packet>(k);
-            kernel1.packet[0%PacketSize] = dm4.template loadPacket<Packet>(k);
-            kernel1.packet[1%PacketSize] = dm5.template loadPacket<Packet>(k);
-            kernel1.packet[2%PacketSize] = dm6.template loadPacket<Packet>(k);
-            kernel1.packet[3%PacketSize] = dm7.template loadPacket<Packet>(k);
+            kernel0.packet[0 % PacketSize] = dm0.template loadPacket<Packet>(k);
+            kernel0.packet[1 % PacketSize] = dm1.template loadPacket<Packet>(k);
+            kernel0.packet[2 % PacketSize] = dm2.template loadPacket<Packet>(k);
+            kernel0.packet[3 % PacketSize] = dm3.template loadPacket<Packet>(k);
+            kernel1.packet[0 % PacketSize] = dm4.template loadPacket<Packet>(k);
+            kernel1.packet[1 % PacketSize] = dm5.template loadPacket<Packet>(k);
+            kernel1.packet[2 % PacketSize] = dm6.template loadPacket<Packet>(k);
+            kernel1.packet[3 % PacketSize] = dm7.template loadPacket<Packet>(k);
             ptranspose(kernel0);
             ptranspose(kernel1);
 
-            pstoreu(blockB+count+0*PacketSize, cj.pconj(kernel0.packet[0%PacketSize]));
-            pstoreu(blockB+count+1*PacketSize, cj.pconj(kernel1.packet[0%PacketSize]));
-            pstoreu(blockB+count+2*PacketSize, cj.pconj(kernel0.packet[1%PacketSize]));
-            pstoreu(blockB+count+3*PacketSize, cj.pconj(kernel1.packet[1%PacketSize]));
-            pstoreu(blockB+count+4*PacketSize, cj.pconj(kernel0.packet[2%PacketSize]));
-            pstoreu(blockB+count+5*PacketSize, cj.pconj(kernel1.packet[2%PacketSize]));
-            pstoreu(blockB+count+6*PacketSize, cj.pconj(kernel0.packet[3%PacketSize]));
-            pstoreu(blockB+count+7*PacketSize, cj.pconj(kernel1.packet[3%PacketSize]));
-            count+=8*PacketSize;
-          }
-          else if (PacketSize == 8)
-          {
-            PacketBlock<Packet, PacketSize==8?8:PacketSize> kernel0;
+            pstoreu(blockB + count + 0 * PacketSize, cj.pconj(kernel0.packet[0 % PacketSize]));
+            pstoreu(blockB + count + 1 * PacketSize, cj.pconj(kernel1.packet[0 % PacketSize]));
+            pstoreu(blockB + count + 2 * PacketSize, cj.pconj(kernel0.packet[1 % PacketSize]));
+            pstoreu(blockB + count + 3 * PacketSize, cj.pconj(kernel1.packet[1 % PacketSize]));
+            pstoreu(blockB + count + 4 * PacketSize, cj.pconj(kernel0.packet[2 % PacketSize]));
+            pstoreu(blockB + count + 5 * PacketSize, cj.pconj(kernel1.packet[2 % PacketSize]));
+            pstoreu(blockB + count + 6 * PacketSize, cj.pconj(kernel0.packet[3 % PacketSize]));
+            pstoreu(blockB + count + 7 * PacketSize, cj.pconj(kernel1.packet[3 % PacketSize]));
+            count += 8 * PacketSize;
+          } else if (PacketSize == 8) {
+            PacketBlock<Packet, PacketSize == 8 ? 8 : PacketSize> kernel0;
 
-            kernel0.packet[0%PacketSize] = dm0.template loadPacket<Packet>(k);
-            kernel0.packet[1%PacketSize] = dm1.template loadPacket<Packet>(k);
-            kernel0.packet[2%PacketSize] = dm2.template loadPacket<Packet>(k);
-            kernel0.packet[3%PacketSize] = dm3.template loadPacket<Packet>(k);
-            kernel0.packet[4%PacketSize] = dm4.template loadPacket<Packet>(k);
-            kernel0.packet[5%PacketSize] = dm5.template loadPacket<Packet>(k);
-            kernel0.packet[6%PacketSize] = dm6.template loadPacket<Packet>(k);
-            kernel0.packet[7%PacketSize] = dm7.template loadPacket<Packet>(k);
+            kernel0.packet[0 % PacketSize] = dm0.template loadPacket<Packet>(k);
+            kernel0.packet[1 % PacketSize] = dm1.template loadPacket<Packet>(k);
+            kernel0.packet[2 % PacketSize] = dm2.template loadPacket<Packet>(k);
+            kernel0.packet[3 % PacketSize] = dm3.template loadPacket<Packet>(k);
+            kernel0.packet[4 % PacketSize] = dm4.template loadPacket<Packet>(k);
+            kernel0.packet[5 % PacketSize] = dm5.template loadPacket<Packet>(k);
+            kernel0.packet[6 % PacketSize] = dm6.template loadPacket<Packet>(k);
+            kernel0.packet[7 % PacketSize] = dm7.template loadPacket<Packet>(k);
             ptranspose(kernel0);
 
-            pstoreu(blockB+count+0*PacketSize, cj.pconj(kernel0.packet[0%PacketSize]));
-            pstoreu(blockB+count+1*PacketSize, cj.pconj(kernel0.packet[1%PacketSize]));
-            pstoreu(blockB+count+2*PacketSize, cj.pconj(kernel0.packet[2%PacketSize]));
-            pstoreu(blockB+count+3*PacketSize, cj.pconj(kernel0.packet[3%PacketSize]));
-            pstoreu(blockB+count+4*PacketSize, cj.pconj(kernel0.packet[4%PacketSize]));
-            pstoreu(blockB+count+5*PacketSize, cj.pconj(kernel0.packet[5%PacketSize]));
-            pstoreu(blockB+count+6*PacketSize, cj.pconj(kernel0.packet[6%PacketSize]));
-            pstoreu(blockB+count+7*PacketSize, cj.pconj(kernel0.packet[7%PacketSize]));
-            count+=8*PacketSize;
+            pstoreu(blockB + count + 0 * PacketSize, cj.pconj(kernel0.packet[0 % PacketSize]));
+            pstoreu(blockB + count + 1 * PacketSize, cj.pconj(kernel0.packet[1 % PacketSize]));
+            pstoreu(blockB + count + 2 * PacketSize, cj.pconj(kernel0.packet[2 % PacketSize]));
+            pstoreu(blockB + count + 3 * PacketSize, cj.pconj(kernel0.packet[3 % PacketSize]));
+            pstoreu(blockB + count + 4 * PacketSize, cj.pconj(kernel0.packet[4 % PacketSize]));
+            pstoreu(blockB + count + 5 * PacketSize, cj.pconj(kernel0.packet[5 % PacketSize]));
+            pstoreu(blockB + count + 6 * PacketSize, cj.pconj(kernel0.packet[6 % PacketSize]));
+            pstoreu(blockB + count + 7 * PacketSize, cj.pconj(kernel0.packet[7 % PacketSize]));
+            count += 8 * PacketSize;
           }
         }
       }
 
-      for(; k<depth; k++)
-      {
-        blockB[count+0] = cj(dm0(k));
-        blockB[count+1] = cj(dm1(k));
-        blockB[count+2] = cj(dm2(k));
-        blockB[count+3] = cj(dm3(k));
-        blockB[count+4] = cj(dm4(k));
-        blockB[count+5] = cj(dm5(k));
-        blockB[count+6] = cj(dm6(k));
-        blockB[count+7] = cj(dm7(k));
+      for (; k < depth; k++) {
+        blockB[count + 0] = cj(dm0(k));
+        blockB[count + 1] = cj(dm1(k));
+        blockB[count + 2] = cj(dm2(k));
+        blockB[count + 3] = cj(dm3(k));
+        blockB[count + 4] = cj(dm4(k));
+        blockB[count + 5] = cj(dm5(k));
+        blockB[count + 6] = cj(dm6(k));
+        blockB[count + 7] = cj(dm7(k));
         count += 8;
       }
       // skip what we have after
-      if(PanelMode) count += 8 * (stride-offset-depth);
+      if (PanelMode) count += 8 * (stride - offset - depth);
     }
   }
 #endif
-  
-  EIGEN_IF_CONSTEXPR(nr>=4)
-  {
-    for(Index j2=packet_cols8; j2<packet_cols4; j2+=4)
-    {
+
+  EIGEN_IF_CONSTEXPR(nr >= 4) {
+    for (Index j2 = packet_cols8; j2 < packet_cols4; j2 += 4) {
       // skip what we have before
-      if(PanelMode) count += 4 * offset;
+      if (PanelMode) count += 4 * offset;
       const LinearMapper dm0 = rhs.getLinearMapper(0, j2 + 0);
       const LinearMapper dm1 = rhs.getLinearMapper(0, j2 + 1);
       const LinearMapper dm2 = rhs.getLinearMapper(0, j2 + 2);
       const LinearMapper dm3 = rhs.getLinearMapper(0, j2 + 3);
 
-      Index k=0;
-      if((PacketSize%4)==0) // TODO enable vectorized transposition for PacketSize==2 ??
+      Index k = 0;
+      if ((PacketSize % 4) == 0)  // TODO enable vectorized transposition for PacketSize==2 ??
       {
-        for(; k<peeled_k; k+=PacketSize) {
-          PacketBlock<Packet,(PacketSize%4)==0?4:PacketSize> kernel;
-          kernel.packet[0           ] = dm0.template loadPacket<Packet>(k);
-          kernel.packet[1%PacketSize] = dm1.template loadPacket<Packet>(k);
-          kernel.packet[2%PacketSize] = dm2.template loadPacket<Packet>(k);
-          kernel.packet[3%PacketSize] = dm3.template loadPacket<Packet>(k);
+        for (; k < peeled_k; k += PacketSize) {
+          PacketBlock<Packet, (PacketSize % 4) == 0 ? 4 : PacketSize> kernel;
+          kernel.packet[0] = dm0.template loadPacket<Packet>(k);
+          kernel.packet[1 % PacketSize] = dm1.template loadPacket<Packet>(k);
+          kernel.packet[2 % PacketSize] = dm2.template loadPacket<Packet>(k);
+          kernel.packet[3 % PacketSize] = dm3.template loadPacket<Packet>(k);
           ptranspose(kernel);
-          pstoreu(blockB+count+0*PacketSize, cj.pconj(kernel.packet[0]));
-          pstoreu(blockB+count+1*PacketSize, cj.pconj(kernel.packet[1%PacketSize]));
-          pstoreu(blockB+count+2*PacketSize, cj.pconj(kernel.packet[2%PacketSize]));
-          pstoreu(blockB+count+3*PacketSize, cj.pconj(kernel.packet[3%PacketSize]));
-          count+=4*PacketSize;
+          pstoreu(blockB + count + 0 * PacketSize, cj.pconj(kernel.packet[0]));
+          pstoreu(blockB + count + 1 * PacketSize, cj.pconj(kernel.packet[1 % PacketSize]));
+          pstoreu(blockB + count + 2 * PacketSize, cj.pconj(kernel.packet[2 % PacketSize]));
+          pstoreu(blockB + count + 3 * PacketSize, cj.pconj(kernel.packet[3 % PacketSize]));
+          count += 4 * PacketSize;
         }
       }
-      for(; k<depth; k++)
-      {
-        blockB[count+0] = cj(dm0(k));
-        blockB[count+1] = cj(dm1(k));
-        blockB[count+2] = cj(dm2(k));
-        blockB[count+3] = cj(dm3(k));
+      for (; k < depth; k++) {
+        blockB[count + 0] = cj(dm0(k));
+        blockB[count + 1] = cj(dm1(k));
+        blockB[count + 2] = cj(dm2(k));
+        blockB[count + 3] = cj(dm3(k));
         count += 4;
       }
       // skip what we have after
-      if(PanelMode) count += 4 * (stride-offset-depth);
+      if (PanelMode) count += 4 * (stride - offset - depth);
     }
   }
 
   // copy the remaining columns one at a time (nr==1)
-  for(Index j2=packet_cols4; j2<cols; ++j2)
-  {
-    if(PanelMode) count += offset;
+  for (Index j2 = packet_cols4; j2 < cols; ++j2) {
+    if (PanelMode) count += offset;
     const LinearMapper dm0 = rhs.getLinearMapper(0, j2);
-    for(Index k=0; k<depth; k++)
-    {
+    for (Index k = 0; k < depth; k++) {
       blockB[count] = cj(dm0(k));
       count += 1;
     }
-    if(PanelMode) count += (stride-offset-depth);
+    if (PanelMode) count += (stride - offset - depth);
   }
 }
 
 // this version is optimized for row major matrices
-template<typename Scalar, typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
-struct gemm_pack_rhs<Scalar, Index, DataMapper, nr, RowMajor, Conjugate, PanelMode>
-{
+template <typename Scalar, typename Index, typename DataMapper, int nr, bool Conjugate, bool PanelMode>
+struct gemm_pack_rhs<Scalar, Index, DataMapper, nr, RowMajor, Conjugate, PanelMode> {
   typedef typename packet_traits<Scalar>::type Packet;
   typedef typename unpacket_traits<Packet>::half HalfPacket;
   typedef typename unpacket_traits<typename unpacket_traits<Packet>::half>::half QuarterPacket;
   typedef typename DataMapper::LinearMapper LinearMapper;
-  enum { PacketSize = packet_traits<Scalar>::size,
-         HalfPacketSize = unpacket_traits<HalfPacket>::size,
-		 QuarterPacketSize = unpacket_traits<QuarterPacket>::size};
-  EIGEN_DONT_INLINE void operator()(Scalar* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride=0, Index offset=0)
-  {
+  enum {
+    PacketSize = packet_traits<Scalar>::size,
+    HalfPacketSize = unpacket_traits<HalfPacket>::size,
+    QuarterPacketSize = unpacket_traits<QuarterPacket>::size
+  };
+  EIGEN_DONT_INLINE void operator()(Scalar* blockB, const DataMapper& rhs, Index depth, Index cols, Index stride = 0,
+                                    Index offset = 0) {
     EIGEN_ASM_COMMENT("EIGEN PRODUCT PACK RHS ROWMAJOR");
     EIGEN_UNUSED_VARIABLE(stride);
     EIGEN_UNUSED_VARIABLE(offset);
-    eigen_assert(((!PanelMode) && stride==0 && offset==0) || (PanelMode && stride>=depth && offset<=stride));
+    eigen_assert(((!PanelMode) && stride == 0 && offset == 0) || (PanelMode && stride >= depth && offset <= stride));
     const bool HasHalf = (int)HalfPacketSize < (int)PacketSize;
     const bool HasQuarter = (int)QuarterPacketSize < (int)HalfPacketSize;
     conj_if<NumTraits<Scalar>::IsComplex && Conjugate> cj;
-    Index packet_cols8 = nr>=8 ? (cols/8) * 8 : 0;
-    Index packet_cols4 = nr>=4 ? (cols/4) * 4 : 0;
+    Index packet_cols8 = nr >= 8 ? (cols / 8) * 8 : 0;
+    Index packet_cols4 = nr >= 4 ? (cols / 4) * 4 : 0;
     Index count = 0;
 
 #if EIGEN_ARCH_ARM64
-    EIGEN_IF_CONSTEXPR(nr>=8)
-    {
-      for(Index j2=0; j2<packet_cols8; j2+=8)
-      {
+    EIGEN_IF_CONSTEXPR(nr >= 8) {
+      for (Index j2 = 0; j2 < packet_cols8; j2 += 8) {
         // skip what we have before
-        if(PanelMode) count += 8 * offset;
-        for(Index k=0; k<depth; k++)
-        {
-          if (PacketSize==8) {
+        if (PanelMode) count += 8 * offset;
+        for (Index k = 0; k < depth; k++) {
+          if (PacketSize == 8) {
             Packet A = rhs.template loadPacket<Packet>(k, j2);
-            pstoreu(blockB+count, cj.pconj(A));
+            pstoreu(blockB + count, cj.pconj(A));
             count += PacketSize;
-          } else if (PacketSize==4) {
+          } else if (PacketSize == 4) {
             Packet A = rhs.template loadPacket<Packet>(k, j2);
             Packet B = rhs.template loadPacket<Packet>(k, j2 + 4);
-            pstoreu(blockB+count, cj.pconj(A));
-            pstoreu(blockB+count+PacketSize, cj.pconj(B));
-            count += 2*PacketSize;
+            pstoreu(blockB + count, cj.pconj(A));
+            pstoreu(blockB + count + PacketSize, cj.pconj(B));
+            count += 2 * PacketSize;
           } else {
             const LinearMapper dm0 = rhs.getLinearMapper(k, j2);
-            blockB[count+0] = cj(dm0(0));
-            blockB[count+1] = cj(dm0(1));
-            blockB[count+2] = cj(dm0(2));
-            blockB[count+3] = cj(dm0(3));
-            blockB[count+4] = cj(dm0(4));
-            blockB[count+5] = cj(dm0(5));
-            blockB[count+6] = cj(dm0(6));
-            blockB[count+7] = cj(dm0(7));
+            blockB[count + 0] = cj(dm0(0));
+            blockB[count + 1] = cj(dm0(1));
+            blockB[count + 2] = cj(dm0(2));
+            blockB[count + 3] = cj(dm0(3));
+            blockB[count + 4] = cj(dm0(4));
+            blockB[count + 5] = cj(dm0(5));
+            blockB[count + 6] = cj(dm0(6));
+            blockB[count + 7] = cj(dm0(7));
             count += 8;
           }
         }
         // skip what we have after
-        if(PanelMode) count += 8 * (stride-offset-depth);
+        if (PanelMode) count += 8 * (stride - offset - depth);
       }
     }
 #endif
-    
-    if(nr>=4)
-    {
-      for(Index j2=packet_cols8; j2<packet_cols4; j2+=4)
-      {
+
+    if (nr >= 4) {
+      for (Index j2 = packet_cols8; j2 < packet_cols4; j2 += 4) {
         // skip what we have before
-        if(PanelMode) count += 4 * offset;
-        for(Index k=0; k<depth; k++)
-        {
-          if (PacketSize==4) {
+        if (PanelMode) count += 4 * offset;
+        for (Index k = 0; k < depth; k++) {
+          if (PacketSize == 4) {
             Packet A = rhs.template loadPacket<Packet>(k, j2);
-            pstoreu(blockB+count, cj.pconj(A));
+            pstoreu(blockB + count, cj.pconj(A));
             count += PacketSize;
-          } else if (HasHalf && HalfPacketSize==4) {
+          } else if (HasHalf && HalfPacketSize == 4) {
             HalfPacket A = rhs.template loadPacket<HalfPacket>(k, j2);
-            pstoreu(blockB+count, cj.pconj(A));
+            pstoreu(blockB + count, cj.pconj(A));
             count += HalfPacketSize;
-          } else if (HasQuarter && QuarterPacketSize==4) {
+          } else if (HasQuarter && QuarterPacketSize == 4) {
             QuarterPacket A = rhs.template loadPacket<QuarterPacket>(k, j2);
-            pstoreu(blockB+count, cj.pconj(A));
+            pstoreu(blockB + count, cj.pconj(A));
             count += QuarterPacketSize;
           } else {
             const LinearMapper dm0 = rhs.getLinearMapper(k, j2);
-            blockB[count+0] = cj(dm0(0));
-            blockB[count+1] = cj(dm0(1));
-            blockB[count+2] = cj(dm0(2));
-            blockB[count+3] = cj(dm0(3));
+            blockB[count + 0] = cj(dm0(0));
+            blockB[count + 1] = cj(dm0(1));
+            blockB[count + 2] = cj(dm0(2));
+            blockB[count + 3] = cj(dm0(3));
             count += 4;
           }
         }
         // skip what we have after
-        if(PanelMode) count += 4 * (stride-offset-depth);
+        if (PanelMode) count += 4 * (stride - offset - depth);
       }
     }
     // copy the remaining columns one at a time (nr==1)
-    for(Index j2=packet_cols4; j2<cols; ++j2)
-    {
-      if(PanelMode) count += offset;
-      for(Index k=0; k<depth; k++)
-      {
+    for (Index j2 = packet_cols4; j2 < cols; ++j2) {
+      if (PanelMode) count += offset;
+      for (Index k = 0; k < depth; k++) {
         blockB[count] = cj(rhs(k, j2));
         count += 1;
       }
-      if(PanelMode) count += stride-offset-depth;
+      if (PanelMode) count += stride - offset - depth;
     }
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \returns the currently set level 1 cpu cache size (in bytes) used to estimate the ideal blocking size parameters.
-  * \sa setCpuCacheSize */
-inline std::ptrdiff_t l1CacheSize()
-{
+ * \sa setCpuCacheSize */
+inline std::ptrdiff_t l1CacheSize() {
   std::ptrdiff_t l1, l2, l3;
   internal::manage_caching_sizes(GetAction, &l1, &l2, &l3);
   return l1;
 }
 
 /** \returns the currently set level 2 cpu cache size (in bytes) used to estimate the ideal blocking size parameters.
-  * \sa setCpuCacheSize */
-inline std::ptrdiff_t l2CacheSize()
-{
+ * \sa setCpuCacheSize */
+inline std::ptrdiff_t l2CacheSize() {
   std::ptrdiff_t l1, l2, l3;
   internal::manage_caching_sizes(GetAction, &l1, &l2, &l3);
   return l2;
@@ -3281,23 +3133,21 @@
 /** \returns the currently set level 3 cpu cache size (in bytes) used to estimate the ideal blocking size paramete\
 rs.
 * \sa setCpuCacheSize */
-inline std::ptrdiff_t l3CacheSize()
-{
+inline std::ptrdiff_t l3CacheSize() {
   std::ptrdiff_t l1, l2, l3;
   internal::manage_caching_sizes(GetAction, &l1, &l2, &l3);
   return l3;
 }
 
 /** Set the cpu L1 and L2 cache sizes (in bytes).
-  * These values are use to adjust the size of the blocks
-  * for the algorithms working per blocks.
-  *
-  * \sa computeProductBlockingSizes */
-inline void setCpuCacheSizes(std::ptrdiff_t l1, std::ptrdiff_t l2, std::ptrdiff_t l3)
-{
+ * These values are use to adjust the size of the blocks
+ * for the algorithms working per blocks.
+ *
+ * \sa computeProductBlockingSizes */
+inline void setCpuCacheSizes(std::ptrdiff_t l1, std::ptrdiff_t l2, std::ptrdiff_t l3) {
   internal::manage_caching_sizes(SetAction, &l1, &l2, &l3);
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_GENERAL_BLOCK_PANEL_H
+#endif  // EIGEN_GENERAL_BLOCK_PANEL_H
diff --git a/Eigen/src/Core/products/GeneralMatrixMatrix.h b/Eigen/src/Core/products/GeneralMatrixMatrix.h
index 3e7784d..55fa5ff 100644
--- a/Eigen/src/Core/products/GeneralMatrixMatrix.h
+++ b/Eigen/src/Core/products/GeneralMatrixMatrix.h
@@ -17,397 +17,349 @@
 
 namespace internal {
 
-template<typename LhsScalar_, typename RhsScalar_> class level3_blocking;
+template <typename LhsScalar_, typename RhsScalar_>
+class level3_blocking;
 
 /* Specialization for a row-major destination matrix => simple transposition of the product */
-template<
-  typename Index,
-  typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs,
-  typename RhsScalar, int RhsStorageOrder, bool ConjugateRhs,
-  int ResInnerStride>
-struct general_matrix_matrix_product<Index,LhsScalar,LhsStorageOrder,ConjugateLhs,RhsScalar,RhsStorageOrder,ConjugateRhs,RowMajor,ResInnerStride>
-{
-  typedef gebp_traits<RhsScalar,LhsScalar> Traits;
+template <typename Index, typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs, typename RhsScalar,
+          int RhsStorageOrder, bool ConjugateRhs, int ResInnerStride>
+struct general_matrix_matrix_product<Index, LhsScalar, LhsStorageOrder, ConjugateLhs, RhsScalar, RhsStorageOrder,
+                                     ConjugateRhs, RowMajor, ResInnerStride> {
+  typedef gebp_traits<RhsScalar, LhsScalar> Traits;
 
   typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar>::ReturnType ResScalar;
-  static EIGEN_STRONG_INLINE void run(
-    Index rows, Index cols, Index depth,
-    const LhsScalar* lhs, Index lhsStride,
-    const RhsScalar* rhs, Index rhsStride,
-    ResScalar* res, Index resIncr, Index resStride,
-    ResScalar alpha,
-    level3_blocking<RhsScalar,LhsScalar>& blocking,
-    GemmParallelInfo<Index>* info = 0)
-  {
+  static EIGEN_STRONG_INLINE void run(Index rows, Index cols, Index depth, const LhsScalar* lhs, Index lhsStride,
+                                      const RhsScalar* rhs, Index rhsStride, ResScalar* res, Index resIncr,
+                                      Index resStride, ResScalar alpha, level3_blocking<RhsScalar, LhsScalar>& blocking,
+                                      GemmParallelInfo<Index>* info = 0) {
     // transpose the product such that the result is column major
-    general_matrix_matrix_product<Index,
-      RhsScalar, RhsStorageOrder==RowMajor ? ColMajor : RowMajor, ConjugateRhs,
-      LhsScalar, LhsStorageOrder==RowMajor ? ColMajor : RowMajor, ConjugateLhs,
-      ColMajor,ResInnerStride>
-    ::run(cols,rows,depth,rhs,rhsStride,lhs,lhsStride,res,resIncr,resStride,alpha,blocking,info);
+    general_matrix_matrix_product<Index, RhsScalar, RhsStorageOrder == RowMajor ? ColMajor : RowMajor, ConjugateRhs,
+                                  LhsScalar, LhsStorageOrder == RowMajor ? ColMajor : RowMajor, ConjugateLhs, ColMajor,
+                                  ResInnerStride>::run(cols, rows, depth, rhs, rhsStride, lhs, lhsStride, res, resIncr,
+                                                       resStride, alpha, blocking, info);
   }
 };
 
 /*  Specialization for a col-major destination matrix
  *    => Blocking algorithm following Goto's paper */
-template<
-  typename Index,
-  typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs,
-  typename RhsScalar, int RhsStorageOrder, bool ConjugateRhs,
-  int ResInnerStride>
-struct general_matrix_matrix_product<Index,LhsScalar,LhsStorageOrder,ConjugateLhs,RhsScalar,RhsStorageOrder,ConjugateRhs,ColMajor,ResInnerStride>
-{
+template <typename Index, typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs, typename RhsScalar,
+          int RhsStorageOrder, bool ConjugateRhs, int ResInnerStride>
+struct general_matrix_matrix_product<Index, LhsScalar, LhsStorageOrder, ConjugateLhs, RhsScalar, RhsStorageOrder,
+                                     ConjugateRhs, ColMajor, ResInnerStride> {
+  typedef gebp_traits<LhsScalar, RhsScalar> Traits;
 
-typedef gebp_traits<LhsScalar,RhsScalar> Traits;
+  typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar>::ReturnType ResScalar;
+  static void run(Index rows, Index cols, Index depth, const LhsScalar* lhs_, Index lhsStride, const RhsScalar* rhs_,
+                  Index rhsStride, ResScalar* res_, Index resIncr, Index resStride, ResScalar alpha,
+                  level3_blocking<LhsScalar, RhsScalar>& blocking, GemmParallelInfo<Index>* info = 0) {
+    typedef const_blas_data_mapper<LhsScalar, Index, LhsStorageOrder> LhsMapper;
+    typedef const_blas_data_mapper<RhsScalar, Index, RhsStorageOrder> RhsMapper;
+    typedef blas_data_mapper<typename Traits::ResScalar, Index, ColMajor, Unaligned, ResInnerStride> ResMapper;
+    LhsMapper lhs(lhs_, lhsStride);
+    RhsMapper rhs(rhs_, rhsStride);
+    ResMapper res(res_, resStride, resIncr);
 
-typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar>::ReturnType ResScalar;
-static void run(Index rows, Index cols, Index depth,
-  const LhsScalar* lhs_, Index lhsStride,
-  const RhsScalar* rhs_, Index rhsStride,
-  ResScalar* res_, Index resIncr, Index resStride,
-  ResScalar alpha,
-  level3_blocking<LhsScalar,RhsScalar>& blocking,
-  GemmParallelInfo<Index>* info = 0)
-{
-  typedef const_blas_data_mapper<LhsScalar, Index, LhsStorageOrder> LhsMapper;
-  typedef const_blas_data_mapper<RhsScalar, Index, RhsStorageOrder> RhsMapper;
-  typedef blas_data_mapper<typename Traits::ResScalar, Index, ColMajor,Unaligned,ResInnerStride> ResMapper;
-  LhsMapper lhs(lhs_, lhsStride);
-  RhsMapper rhs(rhs_, rhsStride);
-  ResMapper res(res_, resStride, resIncr);
+    Index kc = blocking.kc();                    // cache block size along the K direction
+    Index mc = (std::min)(rows, blocking.mc());  // cache block size along the M direction
+    Index nc = (std::min)(cols, blocking.nc());  // cache block size along the N direction
 
-  Index kc = blocking.kc();                   // cache block size along the K direction
-  Index mc = (std::min)(rows,blocking.mc());  // cache block size along the M direction
-  Index nc = (std::min)(cols,blocking.nc());  // cache block size along the N direction
-
-  gemm_pack_lhs<LhsScalar, Index, LhsMapper, Traits::mr, Traits::LhsProgress, typename Traits::LhsPacket4Packing, LhsStorageOrder> pack_lhs;
-  gemm_pack_rhs<RhsScalar, Index, RhsMapper, Traits::nr, RhsStorageOrder> pack_rhs;
-  gebp_kernel<LhsScalar, RhsScalar, Index, ResMapper, Traits::mr, Traits::nr, ConjugateLhs, ConjugateRhs> gebp;
+    gemm_pack_lhs<LhsScalar, Index, LhsMapper, Traits::mr, Traits::LhsProgress, typename Traits::LhsPacket4Packing,
+                  LhsStorageOrder>
+        pack_lhs;
+    gemm_pack_rhs<RhsScalar, Index, RhsMapper, Traits::nr, RhsStorageOrder> pack_rhs;
+    gebp_kernel<LhsScalar, RhsScalar, Index, ResMapper, Traits::mr, Traits::nr, ConjugateLhs, ConjugateRhs> gebp;
 
 #if defined(EIGEN_HAS_OPENMP) || defined(EIGEN_GEMM_THREADPOOL)
-  if(info)
-  {
-    // this is the parallel version!
-    int tid = info->logical_thread_id;
-    int threads = info->num_threads;
+    if (info) {
+      // this is the parallel version!
+      int tid = info->logical_thread_id;
+      int threads = info->num_threads;
 
-    LhsScalar* blockA = blocking.blockA();
-    eigen_internal_assert(blockA!=0);
+      LhsScalar* blockA = blocking.blockA();
+      eigen_internal_assert(blockA != 0);
 
-    std::size_t sizeB = kc*nc;
-    ei_declare_aligned_stack_constructed_variable(RhsScalar, blockB, sizeB, 0);
+      std::size_t sizeB = kc * nc;
+      ei_declare_aligned_stack_constructed_variable(RhsScalar, blockB, sizeB, 0);
 
-    // For each horizontal panel of the rhs, and corresponding vertical panel of the lhs...
-    for(Index k=0; k<depth; k+=kc)
-    {
-      const Index actual_kc = (std::min)(k+kc,depth)-k; // => rows of B', and cols of the A'
+      // For each horizontal panel of the rhs, and corresponding vertical panel of the lhs...
+      for (Index k = 0; k < depth; k += kc) {
+        const Index actual_kc = (std::min)(k + kc, depth) - k;  // => rows of B', and cols of the A'
 
-      // In order to reduce the chance that a thread has to wait for the other,
-      // let's start by packing B'.
-      pack_rhs(blockB, rhs.getSubMapper(k,0), actual_kc, nc);
+        // In order to reduce the chance that a thread has to wait for the other,
+        // let's start by packing B'.
+        pack_rhs(blockB, rhs.getSubMapper(k, 0), actual_kc, nc);
 
-      // Pack A_k to A' in a parallel fashion:
-      // each thread packs the sub block A_k,i to A'_i where i is the thread id.
+        // Pack A_k to A' in a parallel fashion:
+        // each thread packs the sub block A_k,i to A'_i where i is the thread id.
 
-      // However, before copying to A'_i, we have to make sure that no other thread is still using it,
-      // i.e., we test that info->task_info[tid].users equals 0.
-      // Then, we set info->task_info[tid].users to the number of threads to mark that all other threads are going to use it.
-      while(info->task_info[tid].users!=0) {}
-      info->task_info[tid].users = threads;
+        // However, before copying to A'_i, we have to make sure that no other thread is still using it,
+        // i.e., we test that info->task_info[tid].users equals 0.
+        // Then, we set info->task_info[tid].users to the number of threads to mark that all other threads are going to
+        // use it.
+        while (info->task_info[tid].users != 0) {
+        }
+        info->task_info[tid].users = threads;
 
-      pack_lhs(blockA+info->task_info[tid].lhs_start*actual_kc, lhs.getSubMapper(info->task_info[tid].lhs_start,k), actual_kc, info->task_info[tid].lhs_length);
+        pack_lhs(blockA + info->task_info[tid].lhs_start * actual_kc,
+                 lhs.getSubMapper(info->task_info[tid].lhs_start, k), actual_kc, info->task_info[tid].lhs_length);
 
-      // Notify the other threads that the part A'_i is ready to go.
-      info->task_info[tid].sync = k;
+        // Notify the other threads that the part A'_i is ready to go.
+        info->task_info[tid].sync = k;
 
-      // Computes C_i += A' * B' per A'_i
-      for(int shift=0; shift<threads; ++shift)
-      {
-        int i = (tid+shift)%threads;
+        // Computes C_i += A' * B' per A'_i
+        for (int shift = 0; shift < threads; ++shift) {
+          int i = (tid + shift) % threads;
 
-        // At this point we have to make sure that A'_i has been updated by the thread i,
-        // we use testAndSetOrdered to mimic a volatile access.
-        // However, no need to wait for the B' part which has been updated by the current thread!
-        if (shift>0) {
-          while(info->task_info[i].sync!=k) {}
+          // At this point we have to make sure that A'_i has been updated by the thread i,
+          // we use testAndSetOrdered to mimic a volatile access.
+          // However, no need to wait for the B' part which has been updated by the current thread!
+          if (shift > 0) {
+            while (info->task_info[i].sync != k) {
+            }
+          }
+
+          gebp(res.getSubMapper(info->task_info[i].lhs_start, 0), blockA + info->task_info[i].lhs_start * actual_kc,
+               blockB, info->task_info[i].lhs_length, actual_kc, nc, alpha);
         }
 
-        gebp(res.getSubMapper(info->task_info[i].lhs_start, 0), blockA+info->task_info[i].lhs_start*actual_kc, blockB, info->task_info[i].lhs_length, actual_kc, nc, alpha);
+        // Then keep going as usual with the remaining B'
+        for (Index j = nc; j < cols; j += nc) {
+          const Index actual_nc = (std::min)(j + nc, cols) - j;
+
+          // pack B_k,j to B'
+          pack_rhs(blockB, rhs.getSubMapper(k, j), actual_kc, actual_nc);
+
+          // C_j += A' * B'
+          gebp(res.getSubMapper(0, j), blockA, blockB, rows, actual_kc, actual_nc, alpha);
+        }
+
+        // Release all the sub blocks A'_i of A' for the current thread,
+        // i.e., we simply decrement the number of users by 1
+        for (Index i = 0; i < threads; ++i) info->task_info[i].users -= 1;
       }
-
-      // Then keep going as usual with the remaining B'
-      for(Index j=nc; j<cols; j+=nc)
-      {
-        const Index actual_nc = (std::min)(j+nc,cols)-j;
-
-        // pack B_k,j to B'
-        pack_rhs(blockB, rhs.getSubMapper(k,j), actual_kc, actual_nc);
-
-        // C_j += A' * B'
-        gebp(res.getSubMapper(0, j), blockA, blockB, rows, actual_kc, actual_nc, alpha);
-      }
-
-      // Release all the sub blocks A'_i of A' for the current thread,
-      // i.e., we simply decrement the number of users by 1
-      for(Index i=0; i<threads; ++i)
-        info->task_info[i].users -= 1;
-    }
-  }
-  else
-#endif // defined(EIGEN_HAS_OPENMP) || defined(EIGEN_GEMM_THREADPOOL)
-  {
-    EIGEN_UNUSED_VARIABLE(info);
-
-    // this is the sequential version!
-    std::size_t sizeA = kc*mc;
-    std::size_t sizeB = kc*nc;
-
-    ei_declare_aligned_stack_constructed_variable(LhsScalar, blockA, sizeA, blocking.blockA());
-    ei_declare_aligned_stack_constructed_variable(RhsScalar, blockB, sizeB, blocking.blockB());
-
-    const bool pack_rhs_once = mc!=rows && kc==depth && nc==cols;
-
-    // For each horizontal panel of the rhs, and corresponding panel of the lhs...
-    for(Index i2=0; i2<rows; i2+=mc)
+    } else
+#endif  // defined(EIGEN_HAS_OPENMP) || defined(EIGEN_GEMM_THREADPOOL)
     {
-      const Index actual_mc = (std::min)(i2+mc,rows)-i2;
+      EIGEN_UNUSED_VARIABLE(info);
 
-      for(Index k2=0; k2<depth; k2+=kc)
-      {
-        const Index actual_kc = (std::min)(k2+kc,depth)-k2;
+      // this is the sequential version!
+      std::size_t sizeA = kc * mc;
+      std::size_t sizeB = kc * nc;
 
-        // OK, here we have selected one horizontal panel of rhs and one vertical panel of lhs.
-        // => Pack lhs's panel into a sequential chunk of memory (L2/L3 caching)
-        // Note that this panel will be read as many times as the number of blocks in the rhs's
-        // horizontal panel which is, in practice, a very low number.
-        pack_lhs(blockA, lhs.getSubMapper(i2,k2), actual_kc, actual_mc);
+      ei_declare_aligned_stack_constructed_variable(LhsScalar, blockA, sizeA, blocking.blockA());
+      ei_declare_aligned_stack_constructed_variable(RhsScalar, blockB, sizeB, blocking.blockB());
 
-        // For each kc x nc block of the rhs's horizontal panel...
-        for(Index j2=0; j2<cols; j2+=nc)
-        {
-          const Index actual_nc = (std::min)(j2+nc,cols)-j2;
+      const bool pack_rhs_once = mc != rows && kc == depth && nc == cols;
 
-          // We pack the rhs's block into a sequential chunk of memory (L2 caching)
-          // Note that this block will be read a very high number of times, which is equal to the number of
-          // micro horizontal panel of the large rhs's panel (e.g., rows/12 times).
-          if((!pack_rhs_once) || i2==0)
-            pack_rhs(blockB, rhs.getSubMapper(k2,j2), actual_kc, actual_nc);
+      // For each horizontal panel of the rhs, and corresponding panel of the lhs...
+      for (Index i2 = 0; i2 < rows; i2 += mc) {
+        const Index actual_mc = (std::min)(i2 + mc, rows) - i2;
 
-          // Everything is packed, we can now call the panel * block kernel:
-          gebp(res.getSubMapper(i2, j2), blockA, blockB, actual_mc, actual_kc, actual_nc, alpha);
+        for (Index k2 = 0; k2 < depth; k2 += kc) {
+          const Index actual_kc = (std::min)(k2 + kc, depth) - k2;
+
+          // OK, here we have selected one horizontal panel of rhs and one vertical panel of lhs.
+          // => Pack lhs's panel into a sequential chunk of memory (L2/L3 caching)
+          // Note that this panel will be read as many times as the number of blocks in the rhs's
+          // horizontal panel which is, in practice, a very low number.
+          pack_lhs(blockA, lhs.getSubMapper(i2, k2), actual_kc, actual_mc);
+
+          // For each kc x nc block of the rhs's horizontal panel...
+          for (Index j2 = 0; j2 < cols; j2 += nc) {
+            const Index actual_nc = (std::min)(j2 + nc, cols) - j2;
+
+            // We pack the rhs's block into a sequential chunk of memory (L2 caching)
+            // Note that this block will be read a very high number of times, which is equal to the number of
+            // micro horizontal panel of the large rhs's panel (e.g., rows/12 times).
+            if ((!pack_rhs_once) || i2 == 0) pack_rhs(blockB, rhs.getSubMapper(k2, j2), actual_kc, actual_nc);
+
+            // Everything is packed, we can now call the panel * block kernel:
+            gebp(res.getSubMapper(i2, j2), blockA, blockB, actual_mc, actual_kc, actual_nc, alpha);
+          }
         }
       }
     }
   }
-}
-
 };
 
 /*********************************************************************************
-*  Specialization of generic_product_impl for "large" GEMM, i.e.,
-*  implementation of the high level wrapper to general_matrix_matrix_product
-**********************************************************************************/
+ *  Specialization of generic_product_impl for "large" GEMM, i.e.,
+ *  implementation of the high level wrapper to general_matrix_matrix_product
+ **********************************************************************************/
 
-template<typename Scalar, typename Index, typename Gemm, typename Lhs, typename Rhs, typename Dest, typename BlockingType>
-struct gemm_functor
-{
+template <typename Scalar, typename Index, typename Gemm, typename Lhs, typename Rhs, typename Dest,
+          typename BlockingType>
+struct gemm_functor {
   gemm_functor(const Lhs& lhs, const Rhs& rhs, Dest& dest, const Scalar& actualAlpha, BlockingType& blocking)
-    : m_lhs(lhs), m_rhs(rhs), m_dest(dest), m_actualAlpha(actualAlpha), m_blocking(blocking)
-  {}
+      : m_lhs(lhs), m_rhs(rhs), m_dest(dest), m_actualAlpha(actualAlpha), m_blocking(blocking) {}
 
-  void initParallelSession(Index num_threads) const
-  {
+  void initParallelSession(Index num_threads) const {
     m_blocking.initParallel(m_lhs.rows(), m_rhs.cols(), m_lhs.cols(), num_threads);
     m_blocking.allocateA();
   }
 
-  void operator() (Index row, Index rows, Index col=0, Index cols=-1, GemmParallelInfo<Index>* info=0) const
-  {
-    if(cols==-1)
-      cols = m_rhs.cols();
+  void operator()(Index row, Index rows, Index col = 0, Index cols = -1, GemmParallelInfo<Index>* info = 0) const {
+    if (cols == -1) cols = m_rhs.cols();
 
-    Gemm::run(rows, cols, m_lhs.cols(),
-              &m_lhs.coeffRef(row,0), m_lhs.outerStride(),
-              &m_rhs.coeffRef(0,col), m_rhs.outerStride(),
-              (Scalar*)&(m_dest.coeffRef(row,col)), m_dest.innerStride(), m_dest.outerStride(),
+    Gemm::run(rows, cols, m_lhs.cols(), &m_lhs.coeffRef(row, 0), m_lhs.outerStride(), &m_rhs.coeffRef(0, col),
+              m_rhs.outerStride(), (Scalar*)&(m_dest.coeffRef(row, col)), m_dest.innerStride(), m_dest.outerStride(),
               m_actualAlpha, m_blocking, info);
   }
 
   typedef typename Gemm::Traits Traits;
 
-  protected:
-    const Lhs& m_lhs;
-    const Rhs& m_rhs;
-    Dest& m_dest;
-    Scalar m_actualAlpha;
-    BlockingType& m_blocking;
+ protected:
+  const Lhs& m_lhs;
+  const Rhs& m_rhs;
+  Dest& m_dest;
+  Scalar m_actualAlpha;
+  BlockingType& m_blocking;
 };
 
-template<int StorageOrder, typename LhsScalar, typename RhsScalar, int MaxRows, int MaxCols, int MaxDepth, int KcFactor=1,
-bool FiniteAtCompileTime = MaxRows!=Dynamic && MaxCols!=Dynamic && MaxDepth != Dynamic> class gemm_blocking_space;
+template <int StorageOrder, typename LhsScalar, typename RhsScalar, int MaxRows, int MaxCols, int MaxDepth,
+          int KcFactor = 1, bool FiniteAtCompileTime = MaxRows != Dynamic && MaxCols != Dynamic && MaxDepth != Dynamic>
+class gemm_blocking_space;
 
-template<typename LhsScalar_, typename RhsScalar_>
-class level3_blocking
-{
-    typedef LhsScalar_ LhsScalar;
-    typedef RhsScalar_ RhsScalar;
+template <typename LhsScalar_, typename RhsScalar_>
+class level3_blocking {
+  typedef LhsScalar_ LhsScalar;
+  typedef RhsScalar_ RhsScalar;
 
-  protected:
-    LhsScalar* m_blockA;
-    RhsScalar* m_blockB;
+ protected:
+  LhsScalar* m_blockA;
+  RhsScalar* m_blockB;
 
-    Index m_mc;
-    Index m_nc;
-    Index m_kc;
+  Index m_mc;
+  Index m_nc;
+  Index m_kc;
 
-  public:
+ public:
+  level3_blocking() : m_blockA(0), m_blockB(0), m_mc(0), m_nc(0), m_kc(0) {}
 
-    level3_blocking()
-      : m_blockA(0), m_blockB(0), m_mc(0), m_nc(0), m_kc(0)
-    {}
+  inline Index mc() const { return m_mc; }
+  inline Index nc() const { return m_nc; }
+  inline Index kc() const { return m_kc; }
 
-    inline Index mc() const { return m_mc; }
-    inline Index nc() const { return m_nc; }
-    inline Index kc() const { return m_kc; }
-
-    inline LhsScalar* blockA() { return m_blockA; }
-    inline RhsScalar* blockB() { return m_blockB; }
+  inline LhsScalar* blockA() { return m_blockA; }
+  inline RhsScalar* blockB() { return m_blockB; }
 };
 
-template<int StorageOrder, typename LhsScalar_, typename RhsScalar_, int MaxRows, int MaxCols, int MaxDepth, int KcFactor>
-class gemm_blocking_space<StorageOrder,LhsScalar_,RhsScalar_,MaxRows, MaxCols, MaxDepth, KcFactor, true /* == FiniteAtCompileTime */>
-  : public level3_blocking<
-      std::conditional_t<StorageOrder==RowMajor,RhsScalar_,LhsScalar_>,
-      std::conditional_t<StorageOrder==RowMajor,LhsScalar_,RhsScalar_>>
-{
-    enum {
-      Transpose = StorageOrder==RowMajor,
-      ActualRows = Transpose ? MaxCols : MaxRows,
-      ActualCols = Transpose ? MaxRows : MaxCols
-    };
-    typedef std::conditional_t<Transpose,RhsScalar_,LhsScalar_> LhsScalar;
-    typedef std::conditional_t<Transpose,LhsScalar_,RhsScalar_> RhsScalar;
-    enum {
-      SizeA = ActualRows * MaxDepth,
-      SizeB = ActualCols * MaxDepth
-    };
+template <int StorageOrder, typename LhsScalar_, typename RhsScalar_, int MaxRows, int MaxCols, int MaxDepth,
+          int KcFactor>
+class gemm_blocking_space<StorageOrder, LhsScalar_, RhsScalar_, MaxRows, MaxCols, MaxDepth, KcFactor,
+                          true /* == FiniteAtCompileTime */>
+    : public level3_blocking<std::conditional_t<StorageOrder == RowMajor, RhsScalar_, LhsScalar_>,
+                             std::conditional_t<StorageOrder == RowMajor, LhsScalar_, RhsScalar_>> {
+  enum {
+    Transpose = StorageOrder == RowMajor,
+    ActualRows = Transpose ? MaxCols : MaxRows,
+    ActualCols = Transpose ? MaxRows : MaxCols
+  };
+  typedef std::conditional_t<Transpose, RhsScalar_, LhsScalar_> LhsScalar;
+  typedef std::conditional_t<Transpose, LhsScalar_, RhsScalar_> RhsScalar;
+  enum { SizeA = ActualRows * MaxDepth, SizeB = ActualCols * MaxDepth };
 
 #if EIGEN_MAX_STATIC_ALIGN_BYTES >= EIGEN_DEFAULT_ALIGN_BYTES
-    EIGEN_ALIGN_MAX LhsScalar m_staticA[SizeA];
-    EIGEN_ALIGN_MAX RhsScalar m_staticB[SizeB];
+  EIGEN_ALIGN_MAX LhsScalar m_staticA[SizeA];
+  EIGEN_ALIGN_MAX RhsScalar m_staticB[SizeB];
 #else
-    EIGEN_ALIGN_MAX char m_staticA[SizeA * sizeof(LhsScalar) + EIGEN_DEFAULT_ALIGN_BYTES-1];
-    EIGEN_ALIGN_MAX char m_staticB[SizeB * sizeof(RhsScalar) + EIGEN_DEFAULT_ALIGN_BYTES-1];
+  EIGEN_ALIGN_MAX char m_staticA[SizeA * sizeof(LhsScalar) + EIGEN_DEFAULT_ALIGN_BYTES - 1];
+  EIGEN_ALIGN_MAX char m_staticB[SizeB * sizeof(RhsScalar) + EIGEN_DEFAULT_ALIGN_BYTES - 1];
 #endif
 
-  public:
-
-    gemm_blocking_space(Index /*rows*/, Index /*cols*/, Index /*depth*/, Index /*num_threads*/, bool /*full_rows = false*/)
-    {
-      this->m_mc = ActualRows;
-      this->m_nc = ActualCols;
-      this->m_kc = MaxDepth;
+ public:
+  gemm_blocking_space(Index /*rows*/, Index /*cols*/, Index /*depth*/, Index /*num_threads*/,
+                      bool /*full_rows = false*/) {
+    this->m_mc = ActualRows;
+    this->m_nc = ActualCols;
+    this->m_kc = MaxDepth;
 #if EIGEN_MAX_STATIC_ALIGN_BYTES >= EIGEN_DEFAULT_ALIGN_BYTES
-      this->m_blockA = m_staticA;
-      this->m_blockB = m_staticB;
+    this->m_blockA = m_staticA;
+    this->m_blockB = m_staticB;
 #else
-      this->m_blockA = reinterpret_cast<LhsScalar*>((std::uintptr_t(m_staticA) + (EIGEN_DEFAULT_ALIGN_BYTES-1)) & ~std::size_t(EIGEN_DEFAULT_ALIGN_BYTES-1));
-      this->m_blockB = reinterpret_cast<RhsScalar*>((std::uintptr_t(m_staticB) + (EIGEN_DEFAULT_ALIGN_BYTES-1)) & ~std::size_t(EIGEN_DEFAULT_ALIGN_BYTES-1));
+    this->m_blockA = reinterpret_cast<LhsScalar*>((std::uintptr_t(m_staticA) + (EIGEN_DEFAULT_ALIGN_BYTES - 1)) &
+                                                  ~std::size_t(EIGEN_DEFAULT_ALIGN_BYTES - 1));
+    this->m_blockB = reinterpret_cast<RhsScalar*>((std::uintptr_t(m_staticB) + (EIGEN_DEFAULT_ALIGN_BYTES - 1)) &
+                                                  ~std::size_t(EIGEN_DEFAULT_ALIGN_BYTES - 1));
 #endif
-    }
+  }
 
-    void initParallel(Index, Index, Index, Index)
-    {}
+  void initParallel(Index, Index, Index, Index) {}
 
-    inline void allocateA() {}
-    inline void allocateB() {}
-    inline void allocateAll() {}
+  inline void allocateA() {}
+  inline void allocateB() {}
+  inline void allocateAll() {}
 };
 
-template<int StorageOrder, typename LhsScalar_, typename RhsScalar_, int MaxRows, int MaxCols, int MaxDepth, int KcFactor>
-class gemm_blocking_space<StorageOrder,LhsScalar_,RhsScalar_,MaxRows, MaxCols, MaxDepth, KcFactor, false>
-  : public level3_blocking<
-      std::conditional_t<StorageOrder==RowMajor,RhsScalar_,LhsScalar_>,
-      std::conditional_t<StorageOrder==RowMajor,LhsScalar_,RhsScalar_>>
-{
-    enum {
-      Transpose = StorageOrder==RowMajor
-    };
-    typedef std::conditional_t<Transpose,RhsScalar_,LhsScalar_> LhsScalar;
-    typedef std::conditional_t<Transpose,LhsScalar_,RhsScalar_> RhsScalar;
+template <int StorageOrder, typename LhsScalar_, typename RhsScalar_, int MaxRows, int MaxCols, int MaxDepth,
+          int KcFactor>
+class gemm_blocking_space<StorageOrder, LhsScalar_, RhsScalar_, MaxRows, MaxCols, MaxDepth, KcFactor, false>
+    : public level3_blocking<std::conditional_t<StorageOrder == RowMajor, RhsScalar_, LhsScalar_>,
+                             std::conditional_t<StorageOrder == RowMajor, LhsScalar_, RhsScalar_>> {
+  enum { Transpose = StorageOrder == RowMajor };
+  typedef std::conditional_t<Transpose, RhsScalar_, LhsScalar_> LhsScalar;
+  typedef std::conditional_t<Transpose, LhsScalar_, RhsScalar_> RhsScalar;
 
-    Index m_sizeA;
-    Index m_sizeB;
+  Index m_sizeA;
+  Index m_sizeB;
 
-  public:
+ public:
+  gemm_blocking_space(Index rows, Index cols, Index depth, Index num_threads, bool l3_blocking) {
+    this->m_mc = Transpose ? cols : rows;
+    this->m_nc = Transpose ? rows : cols;
+    this->m_kc = depth;
 
-    gemm_blocking_space(Index rows, Index cols, Index depth, Index num_threads, bool l3_blocking)
+    if (l3_blocking) {
+      computeProductBlockingSizes<LhsScalar, RhsScalar, KcFactor>(this->m_kc, this->m_mc, this->m_nc, num_threads);
+    } else  // no l3 blocking
     {
-      this->m_mc = Transpose ? cols : rows;
-      this->m_nc = Transpose ? rows : cols;
-      this->m_kc = depth;
-
-      if(l3_blocking)
-      {
-        computeProductBlockingSizes<LhsScalar,RhsScalar,KcFactor>(this->m_kc, this->m_mc, this->m_nc, num_threads);
-      }
-      else  // no l3 blocking
-      {
-        Index n = this->m_nc;
-        computeProductBlockingSizes<LhsScalar,RhsScalar,KcFactor>(this->m_kc, this->m_mc, n, num_threads);
-      }
-
-      m_sizeA = this->m_mc * this->m_kc;
-      m_sizeB = this->m_kc * this->m_nc;
+      Index n = this->m_nc;
+      computeProductBlockingSizes<LhsScalar, RhsScalar, KcFactor>(this->m_kc, this->m_mc, n, num_threads);
     }
 
-    void initParallel(Index rows, Index cols, Index depth, Index num_threads)
-    {
-      this->m_mc = Transpose ? cols : rows;
-      this->m_nc = Transpose ? rows : cols;
-      this->m_kc = depth;
+    m_sizeA = this->m_mc * this->m_kc;
+    m_sizeB = this->m_kc * this->m_nc;
+  }
 
-      eigen_internal_assert(this->m_blockA==0 && this->m_blockB==0);
-      Index m = this->m_mc;
-      computeProductBlockingSizes<LhsScalar,RhsScalar,KcFactor>(this->m_kc, m, this->m_nc, num_threads);
-      m_sizeA = this->m_mc * this->m_kc;
-      m_sizeB = this->m_kc * this->m_nc;
-    }
+  void initParallel(Index rows, Index cols, Index depth, Index num_threads) {
+    this->m_mc = Transpose ? cols : rows;
+    this->m_nc = Transpose ? rows : cols;
+    this->m_kc = depth;
 
-    void allocateA()
-    {
-      if(this->m_blockA==0)
-        this->m_blockA = aligned_new<LhsScalar>(m_sizeA);
-    }
+    eigen_internal_assert(this->m_blockA == 0 && this->m_blockB == 0);
+    Index m = this->m_mc;
+    computeProductBlockingSizes<LhsScalar, RhsScalar, KcFactor>(this->m_kc, m, this->m_nc, num_threads);
+    m_sizeA = this->m_mc * this->m_kc;
+    m_sizeB = this->m_kc * this->m_nc;
+  }
 
-    void allocateB()
-    {
-      if(this->m_blockB==0)
-        this->m_blockB = aligned_new<RhsScalar>(m_sizeB);
-    }
+  void allocateA() {
+    if (this->m_blockA == 0) this->m_blockA = aligned_new<LhsScalar>(m_sizeA);
+  }
 
-    void allocateAll()
-    {
-      allocateA();
-      allocateB();
-    }
+  void allocateB() {
+    if (this->m_blockB == 0) this->m_blockB = aligned_new<RhsScalar>(m_sizeB);
+  }
 
-    ~gemm_blocking_space()
-    {
-      aligned_delete(this->m_blockA, m_sizeA);
-      aligned_delete(this->m_blockB, m_sizeB);
-    }
+  void allocateAll() {
+    allocateA();
+    allocateB();
+  }
+
+  ~gemm_blocking_space() {
+    aligned_delete(this->m_blockA, m_sizeA);
+    aligned_delete(this->m_blockB, m_sizeB);
+  }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 namespace internal {
 
-template<typename Lhs, typename Rhs>
-struct generic_product_impl<Lhs,Rhs,DenseShape,DenseShape,GemmProduct>
-  : generic_product_impl_base<Lhs,Rhs,generic_product_impl<Lhs,Rhs,DenseShape,DenseShape,GemmProduct> >
-{
-  typedef typename Product<Lhs,Rhs>::Scalar Scalar;
+template <typename Lhs, typename Rhs>
+struct generic_product_impl<Lhs, Rhs, DenseShape, DenseShape, GemmProduct>
+    : generic_product_impl_base<Lhs, Rhs, generic_product_impl<Lhs, Rhs, DenseShape, DenseShape, GemmProduct>> {
+  typedef typename Product<Lhs, Rhs>::Scalar Scalar;
   typedef typename Lhs::Scalar LhsScalar;
   typedef typename Rhs::Scalar RhsScalar;
 
@@ -419,68 +371,57 @@
   typedef typename RhsBlasTraits::DirectLinearAccessType ActualRhsType;
   typedef internal::remove_all_t<ActualRhsType> ActualRhsTypeCleaned;
 
-  enum {
-    MaxDepthAtCompileTime = min_size_prefer_fixed(Lhs::MaxColsAtCompileTime, Rhs::MaxRowsAtCompileTime)
-  };
+  enum { MaxDepthAtCompileTime = min_size_prefer_fixed(Lhs::MaxColsAtCompileTime, Rhs::MaxRowsAtCompileTime) };
 
-  typedef generic_product_impl<Lhs,Rhs,DenseShape,DenseShape,CoeffBasedProductMode> lazyproduct;
+  typedef generic_product_impl<Lhs, Rhs, DenseShape, DenseShape, CoeffBasedProductMode> lazyproduct;
 
-  template<typename Dst>
-  static void evalTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
-  {
+  template <typename Dst>
+  static void evalTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) {
     // See http://eigen.tuxfamily.org/bz/show_bug.cgi?id=404 for a discussion and helper program
     // to determine the following heuristic.
     // EIGEN_GEMM_TO_COEFFBASED_THRESHOLD is typically defined to 20 in GeneralProduct.h,
     // unless it has been specialized by the user or for a given architecture.
     // Note that the condition rhs.rows()>0 was required because lazy product is (was?) not happy with empty inputs.
     // I'm not sure it is still required.
-    if((rhs.rows()+dst.rows()+dst.cols())<EIGEN_GEMM_TO_COEFFBASED_THRESHOLD && rhs.rows()>0)
-      lazyproduct::eval_dynamic(dst, lhs, rhs, internal::assign_op<typename Dst::Scalar,Scalar>());
-    else
-    {
+    if ((rhs.rows() + dst.rows() + dst.cols()) < EIGEN_GEMM_TO_COEFFBASED_THRESHOLD && rhs.rows() > 0)
+      lazyproduct::eval_dynamic(dst, lhs, rhs, internal::assign_op<typename Dst::Scalar, Scalar>());
+    else {
       dst.setZero();
       scaleAndAddTo(dst, lhs, rhs, Scalar(1));
     }
   }
 
-  template<typename Dst>
-  static void addTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
-  {
-    if((rhs.rows()+dst.rows()+dst.cols())<EIGEN_GEMM_TO_COEFFBASED_THRESHOLD && rhs.rows()>0)
-      lazyproduct::eval_dynamic(dst, lhs, rhs, internal::add_assign_op<typename Dst::Scalar,Scalar>());
+  template <typename Dst>
+  static void addTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) {
+    if ((rhs.rows() + dst.rows() + dst.cols()) < EIGEN_GEMM_TO_COEFFBASED_THRESHOLD && rhs.rows() > 0)
+      lazyproduct::eval_dynamic(dst, lhs, rhs, internal::add_assign_op<typename Dst::Scalar, Scalar>());
     else
-      scaleAndAddTo(dst,lhs, rhs, Scalar(1));
+      scaleAndAddTo(dst, lhs, rhs, Scalar(1));
   }
 
-  template<typename Dst>
-  static void subTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
-  {
-    if((rhs.rows()+dst.rows()+dst.cols())<EIGEN_GEMM_TO_COEFFBASED_THRESHOLD && rhs.rows()>0)
-      lazyproduct::eval_dynamic(dst, lhs, rhs, internal::sub_assign_op<typename Dst::Scalar,Scalar>());
+  template <typename Dst>
+  static void subTo(Dst& dst, const Lhs& lhs, const Rhs& rhs) {
+    if ((rhs.rows() + dst.rows() + dst.cols()) < EIGEN_GEMM_TO_COEFFBASED_THRESHOLD && rhs.rows() > 0)
+      lazyproduct::eval_dynamic(dst, lhs, rhs, internal::sub_assign_op<typename Dst::Scalar, Scalar>());
     else
       scaleAndAddTo(dst, lhs, rhs, Scalar(-1));
   }
 
-  template<typename Dest>
-  static void scaleAndAddTo(Dest& dst, const Lhs& a_lhs, const Rhs& a_rhs, const Scalar& alpha)
-  {
-    eigen_assert(dst.rows()==a_lhs.rows() && dst.cols()==a_rhs.cols());
-    if(a_lhs.cols()==0 || a_lhs.rows()==0 || a_rhs.cols()==0)
-      return;
+  template <typename Dest>
+  static void scaleAndAddTo(Dest& dst, const Lhs& a_lhs, const Rhs& a_rhs, const Scalar& alpha) {
+    eigen_assert(dst.rows() == a_lhs.rows() && dst.cols() == a_rhs.cols());
+    if (a_lhs.cols() == 0 || a_lhs.rows() == 0 || a_rhs.cols() == 0) return;
 
-    if (dst.cols() == 1)
-    {
+    if (dst.cols() == 1) {
       // Fallback to GEMV if either the lhs or rhs is a runtime vector
       typename Dest::ColXpr dst_vec(dst.col(0));
-      return internal::generic_product_impl<Lhs,typename Rhs::ConstColXpr,DenseShape,DenseShape,GemvProduct>
-        ::scaleAndAddTo(dst_vec, a_lhs, a_rhs.col(0), alpha);
-    }
-    else if (dst.rows() == 1)
-    {
+      return internal::generic_product_impl<Lhs, typename Rhs::ConstColXpr, DenseShape, DenseShape,
+                                            GemvProduct>::scaleAndAddTo(dst_vec, a_lhs, a_rhs.col(0), alpha);
+    } else if (dst.rows() == 1) {
       // Fallback to GEMV if either the lhs or rhs is a runtime vector
       typename Dest::RowXpr dst_vec(dst.row(0));
-      return internal::generic_product_impl<typename Lhs::ConstRowXpr,Rhs,DenseShape,DenseShape,GemvProduct>
-        ::scaleAndAddTo(dst_vec, a_lhs.row(0), a_rhs, alpha);
+      return internal::generic_product_impl<typename Lhs::ConstRowXpr, Rhs, DenseShape, DenseShape,
+                                            GemvProduct>::scaleAndAddTo(dst_vec, a_lhs.row(0), a_rhs, alpha);
     }
 
     add_const_on_value_type_t<ActualLhsType> lhs = LhsBlasTraits::extract(a_lhs);
@@ -488,27 +429,29 @@
 
     Scalar actualAlpha = combine_scalar_factors(alpha, a_lhs, a_rhs);
 
-    typedef internal::gemm_blocking_space<(Dest::Flags&RowMajorBit) ? RowMajor : ColMajor,LhsScalar,RhsScalar,
-            Dest::MaxRowsAtCompileTime,Dest::MaxColsAtCompileTime,MaxDepthAtCompileTime> BlockingType;
+    typedef internal::gemm_blocking_space<(Dest::Flags & RowMajorBit) ? RowMajor : ColMajor, LhsScalar, RhsScalar,
+                                          Dest::MaxRowsAtCompileTime, Dest::MaxColsAtCompileTime, MaxDepthAtCompileTime>
+        BlockingType;
 
     typedef internal::gemm_functor<
-      Scalar, Index,
-      internal::general_matrix_matrix_product<
-        Index,
-        LhsScalar, (ActualLhsTypeCleaned::Flags&RowMajorBit) ? RowMajor : ColMajor, bool(LhsBlasTraits::NeedToConjugate),
-        RhsScalar, (ActualRhsTypeCleaned::Flags&RowMajorBit) ? RowMajor : ColMajor, bool(RhsBlasTraits::NeedToConjugate),
-        (Dest::Flags&RowMajorBit) ? RowMajor : ColMajor,
-        Dest::InnerStrideAtCompileTime>,
-      ActualLhsTypeCleaned, ActualRhsTypeCleaned, Dest, BlockingType> GemmFunctor;
+        Scalar, Index,
+        internal::general_matrix_matrix_product<
+            Index, LhsScalar, (ActualLhsTypeCleaned::Flags & RowMajorBit) ? RowMajor : ColMajor,
+            bool(LhsBlasTraits::NeedToConjugate), RhsScalar,
+            (ActualRhsTypeCleaned::Flags & RowMajorBit) ? RowMajor : ColMajor, bool(RhsBlasTraits::NeedToConjugate),
+            (Dest::Flags & RowMajorBit) ? RowMajor : ColMajor, Dest::InnerStrideAtCompileTime>,
+        ActualLhsTypeCleaned, ActualRhsTypeCleaned, Dest, BlockingType>
+        GemmFunctor;
 
     BlockingType blocking(dst.rows(), dst.cols(), lhs.cols(), 1, true);
-    internal::parallelize_gemm<(Dest::MaxRowsAtCompileTime>32 || Dest::MaxRowsAtCompileTime==Dynamic)>
-        (GemmFunctor(lhs, rhs, dst, actualAlpha, blocking), a_lhs.rows(), a_rhs.cols(), a_lhs.cols(), Dest::Flags&RowMajorBit);
+    internal::parallelize_gemm<(Dest::MaxRowsAtCompileTime > 32 || Dest::MaxRowsAtCompileTime == Dynamic)>(
+        GemmFunctor(lhs, rhs, dst, actualAlpha, blocking), a_lhs.rows(), a_rhs.cols(), a_lhs.cols(),
+        Dest::Flags & RowMajorBit);
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_GENERAL_MATRIX_MATRIX_H
+#endif  // EIGEN_GENERAL_MATRIX_MATRIX_H
diff --git a/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h b/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h
index 2e0dcb9..ac94b3f 100644
--- a/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h
+++ b/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h
@@ -13,101 +13,102 @@
 // IWYU pragma: private
 #include "../InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
-template<typename Scalar, typename Index, int StorageOrder, int UpLo, bool ConjLhs, bool ConjRhs>
+template <typename Scalar, typename Index, int StorageOrder, int UpLo, bool ConjLhs, bool ConjRhs>
 struct selfadjoint_rank1_update;
 
 namespace internal {
 
 /**********************************************************************
-* This file implements a general A * B product while
-* evaluating only one triangular part of the product.
-* This is a more general version of self adjoint product (C += A A^T)
-* as the level 3 SYRK Blas routine.
-**********************************************************************/
+ * This file implements a general A * B product while
+ * evaluating only one triangular part of the product.
+ * This is a more general version of self adjoint product (C += A A^T)
+ * as the level 3 SYRK Blas routine.
+ **********************************************************************/
 
 // forward declarations (defined at the end of this file)
-template<typename LhsScalar, typename RhsScalar, typename Index, int mr, int nr, bool ConjLhs, bool ConjRhs, int ResInnerStride, int UpLo>
+template <typename LhsScalar, typename RhsScalar, typename Index, int mr, int nr, bool ConjLhs, bool ConjRhs,
+          int ResInnerStride, int UpLo>
 struct tribb_kernel;
-  
+
 /* Optimized matrix-matrix product evaluating only one triangular half */
-template <typename Index,
-          typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs,
-          typename RhsScalar, int RhsStorageOrder, bool ConjugateRhs,
-                              int ResStorageOrder, int ResInnerStride, int  UpLo, int Version = Specialized>
+template <typename Index, typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs, typename RhsScalar,
+          int RhsStorageOrder, bool ConjugateRhs, int ResStorageOrder, int ResInnerStride, int UpLo,
+          int Version = Specialized>
 struct general_matrix_matrix_triangular_product;
 
 // as usual if the result is row major => we transpose the product
-template <typename Index, typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs,
-                          typename RhsScalar, int RhsStorageOrder, bool ConjugateRhs,
-                          int ResInnerStride, int  UpLo, int Version>
-struct general_matrix_matrix_triangular_product<Index,LhsScalar,LhsStorageOrder,ConjugateLhs,RhsScalar,RhsStorageOrder,ConjugateRhs,RowMajor,ResInnerStride,UpLo,Version>
-{
+template <typename Index, typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs, typename RhsScalar,
+          int RhsStorageOrder, bool ConjugateRhs, int ResInnerStride, int UpLo, int Version>
+struct general_matrix_matrix_triangular_product<Index, LhsScalar, LhsStorageOrder, ConjugateLhs, RhsScalar,
+                                                RhsStorageOrder, ConjugateRhs, RowMajor, ResInnerStride, UpLo,
+                                                Version> {
   typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar>::ReturnType ResScalar;
-  static EIGEN_STRONG_INLINE void run(Index size, Index depth,const LhsScalar* lhs, Index lhsStride,
-                                      const RhsScalar* rhs, Index rhsStride, ResScalar* res, Index resIncr, Index resStride,
-                                      const ResScalar& alpha, level3_blocking<RhsScalar,LhsScalar>& blocking)
-  {
-    general_matrix_matrix_triangular_product<Index,
-        RhsScalar, RhsStorageOrder==RowMajor ? ColMajor : RowMajor, ConjugateRhs,
-        LhsScalar, LhsStorageOrder==RowMajor ? ColMajor : RowMajor, ConjugateLhs,
-        ColMajor, ResInnerStride, UpLo==Lower?Upper:Lower>
-      ::run(size,depth,rhs,rhsStride,lhs,lhsStride,res,resIncr,resStride,alpha,blocking);
+  static EIGEN_STRONG_INLINE void run(Index size, Index depth, const LhsScalar* lhs, Index lhsStride,
+                                      const RhsScalar* rhs, Index rhsStride, ResScalar* res, Index resIncr,
+                                      Index resStride, const ResScalar& alpha,
+                                      level3_blocking<RhsScalar, LhsScalar>& blocking) {
+    general_matrix_matrix_triangular_product<Index, RhsScalar, RhsStorageOrder == RowMajor ? ColMajor : RowMajor,
+                                             ConjugateRhs, LhsScalar, LhsStorageOrder == RowMajor ? ColMajor : RowMajor,
+                                             ConjugateLhs, ColMajor, ResInnerStride,
+                                             UpLo == Lower ? Upper : Lower>::run(size, depth, rhs, rhsStride, lhs,
+                                                                                 lhsStride, res, resIncr, resStride,
+                                                                                 alpha, blocking);
   }
 };
 
-template <typename Index, typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs,
-                          typename RhsScalar, int RhsStorageOrder, bool ConjugateRhs,
-                          int ResInnerStride, int  UpLo, int Version>
-struct general_matrix_matrix_triangular_product<Index,LhsScalar,LhsStorageOrder,ConjugateLhs,RhsScalar,RhsStorageOrder,ConjugateRhs,ColMajor,ResInnerStride,UpLo,Version>
-{
+template <typename Index, typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs, typename RhsScalar,
+          int RhsStorageOrder, bool ConjugateRhs, int ResInnerStride, int UpLo, int Version>
+struct general_matrix_matrix_triangular_product<Index, LhsScalar, LhsStorageOrder, ConjugateLhs, RhsScalar,
+                                                RhsStorageOrder, ConjugateRhs, ColMajor, ResInnerStride, UpLo,
+                                                Version> {
   typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar>::ReturnType ResScalar;
-  static EIGEN_STRONG_INLINE void run(Index size, Index depth,const LhsScalar* lhs_, Index lhsStride,
-                                      const RhsScalar* rhs_, Index rhsStride,
-                                      ResScalar* res_, Index resIncr, Index resStride,
-                                      const ResScalar& alpha, level3_blocking<LhsScalar,RhsScalar>& blocking)
-  {
-    typedef gebp_traits<LhsScalar,RhsScalar> Traits;
+  static EIGEN_STRONG_INLINE void run(Index size, Index depth, const LhsScalar* lhs_, Index lhsStride,
+                                      const RhsScalar* rhs_, Index rhsStride, ResScalar* res_, Index resIncr,
+                                      Index resStride, const ResScalar& alpha,
+                                      level3_blocking<LhsScalar, RhsScalar>& blocking) {
+    typedef gebp_traits<LhsScalar, RhsScalar> Traits;
 
     typedef const_blas_data_mapper<LhsScalar, Index, LhsStorageOrder> LhsMapper;
     typedef const_blas_data_mapper<RhsScalar, Index, RhsStorageOrder> RhsMapper;
     typedef blas_data_mapper<typename Traits::ResScalar, Index, ColMajor, Unaligned, ResInnerStride> ResMapper;
-    LhsMapper lhs(lhs_,lhsStride);
-    RhsMapper rhs(rhs_,rhsStride);
+    LhsMapper lhs(lhs_, lhsStride);
+    RhsMapper rhs(rhs_, rhsStride);
     ResMapper res(res_, resStride, resIncr);
 
     Index kc = blocking.kc();
     // Ensure that mc >= nr and <= size
-    Index mc = (std::min)(size,(std::max)(static_cast<decltype(blocking.mc())>(Traits::nr),blocking.mc()));
+    Index mc = (std::min)(size, (std::max)(static_cast<decltype(blocking.mc())>(Traits::nr), blocking.mc()));
 
     // !!! mc must be a multiple of nr
     if (mc > Traits::nr) {
       using UnsignedIndex = typename make_unsigned<Index>::type;
-      mc = (UnsignedIndex(mc)/Traits::nr)*Traits::nr;
+      mc = (UnsignedIndex(mc) / Traits::nr) * Traits::nr;
     }
 
-    std::size_t sizeA = kc*mc;
-    std::size_t sizeB = kc*size;
+    std::size_t sizeA = kc * mc;
+    std::size_t sizeB = kc * size;
 
     ei_declare_aligned_stack_constructed_variable(LhsScalar, blockA, sizeA, blocking.blockA());
     ei_declare_aligned_stack_constructed_variable(RhsScalar, blockB, sizeB, blocking.blockB());
 
-    gemm_pack_lhs<LhsScalar, Index, LhsMapper, Traits::mr, Traits::LhsProgress, typename Traits::LhsPacket4Packing, LhsStorageOrder> pack_lhs;
+    gemm_pack_lhs<LhsScalar, Index, LhsMapper, Traits::mr, Traits::LhsProgress, typename Traits::LhsPacket4Packing,
+                  LhsStorageOrder>
+        pack_lhs;
     gemm_pack_rhs<RhsScalar, Index, RhsMapper, Traits::nr, RhsStorageOrder> pack_rhs;
     gebp_kernel<LhsScalar, RhsScalar, Index, ResMapper, Traits::mr, Traits::nr, ConjugateLhs, ConjugateRhs> gebp;
-    tribb_kernel<LhsScalar, RhsScalar, Index, Traits::mr, Traits::nr, ConjugateLhs, ConjugateRhs, ResInnerStride, UpLo> sybb;
+    tribb_kernel<LhsScalar, RhsScalar, Index, Traits::mr, Traits::nr, ConjugateLhs, ConjugateRhs, ResInnerStride, UpLo>
+        sybb;
 
-    for(Index k2=0; k2<depth; k2+=kc)
-    {
-      const Index actual_kc = (std::min)(k2+kc,depth)-k2;
+    for (Index k2 = 0; k2 < depth; k2 += kc) {
+      const Index actual_kc = (std::min)(k2 + kc, depth) - k2;
 
       // note that the actual rhs is the transpose/adjoint of mat
-      pack_rhs(blockB, rhs.getSubMapper(k2,0), actual_kc, size);
+      pack_rhs(blockB, rhs.getSubMapper(k2, 0), actual_kc, size);
 
-      for(Index i2=0; i2<size; i2+=mc)
-      {
-        const Index actual_mc = (std::min)(i2+mc,size)-i2;
+      for (Index i2 = 0; i2 < size; i2 += mc) {
+        const Index actual_mc = (std::min)(i2 + mc, size) - i2;
 
         pack_lhs(blockA, lhs.getSubMapper(i2, k2), actual_kc, actual_mc);
 
@@ -115,17 +116,17 @@
         //  1 - before the diagonal => processed with gebp or skipped
         //  2 - the actual_mc x actual_mc symmetric block => processed with a special kernel
         //  3 - after the diagonal => processed with gebp or skipped
-        if (UpLo==Lower)
-          gebp(res.getSubMapper(i2, 0), blockA, blockB, actual_mc, actual_kc,
-               (std::min)(size,i2), alpha, -1, -1, 0, 0);
+        if (UpLo == Lower)
+          gebp(res.getSubMapper(i2, 0), blockA, blockB, actual_mc, actual_kc, (std::min)(size, i2), alpha, -1, -1, 0,
+               0);
 
-        sybb(res_+resStride*i2 + resIncr*i2, resIncr, resStride, blockA, blockB + actual_kc*i2, actual_mc, actual_kc, alpha);
+        sybb(res_ + resStride * i2 + resIncr * i2, resIncr, resStride, blockA, blockB + actual_kc * i2, actual_mc,
+             actual_kc, alpha);
 
-        if (UpLo==Upper)
-        {
-          Index j2 = i2+actual_mc;
-          gebp(res.getSubMapper(i2, j2), blockA, blockB+actual_kc*j2, actual_mc,
-               actual_kc, (std::max)(Index(0), size-j2), alpha, -1, -1, 0, 0);
+        if (UpLo == Upper) {
+          Index j2 = i2 + actual_mc;
+          gebp(res.getSubMapper(i2, j2), blockA, blockB + actual_kc * j2, actual_mc, actual_kc,
+               (std::max)(Index(0), size - j2), alpha, -1, -1, 0, 0);
         }
       }
     }
@@ -141,183 +142,181 @@
 //   while the triangular block overlapping the diagonal is evaluated into a
 //   small temporary buffer which is then accumulated into the result using a
 //   triangular traversal.
-template<typename LhsScalar, typename RhsScalar, typename Index, int mr, int nr, bool ConjLhs, bool ConjRhs, int ResInnerStride, int UpLo>
-struct tribb_kernel
-{
-  typedef gebp_traits<LhsScalar,RhsScalar,ConjLhs,ConjRhs> Traits;
+template <typename LhsScalar, typename RhsScalar, typename Index, int mr, int nr, bool ConjLhs, bool ConjRhs,
+          int ResInnerStride, int UpLo>
+struct tribb_kernel {
+  typedef gebp_traits<LhsScalar, RhsScalar, ConjLhs, ConjRhs> Traits;
   typedef typename Traits::ResScalar ResScalar;
 
-  enum {
-    BlockSize  = meta_least_common_multiple<plain_enum_max(mr, nr), plain_enum_min(mr,nr)>::ret
-  };
-  void operator()(ResScalar* res_, Index resIncr, Index resStride, const LhsScalar* blockA, const RhsScalar* blockB, Index size, Index depth, const ResScalar& alpha)
-  {
+  enum { BlockSize = meta_least_common_multiple<plain_enum_max(mr, nr), plain_enum_min(mr, nr)>::ret };
+  void operator()(ResScalar* res_, Index resIncr, Index resStride, const LhsScalar* blockA, const RhsScalar* blockB,
+                  Index size, Index depth, const ResScalar& alpha) {
     typedef blas_data_mapper<ResScalar, Index, ColMajor, Unaligned, ResInnerStride> ResMapper;
     typedef blas_data_mapper<ResScalar, Index, ColMajor, Unaligned> BufferMapper;
     ResMapper res(res_, resStride, resIncr);
     gebp_kernel<LhsScalar, RhsScalar, Index, ResMapper, mr, nr, ConjLhs, ConjRhs> gebp_kernel1;
     gebp_kernel<LhsScalar, RhsScalar, Index, BufferMapper, mr, nr, ConjLhs, ConjRhs> gebp_kernel2;
 
-    Matrix<ResScalar,BlockSize,BlockSize,ColMajor> buffer((internal::constructor_without_unaligned_array_assert()));
+    Matrix<ResScalar, BlockSize, BlockSize, ColMajor> buffer((internal::constructor_without_unaligned_array_assert()));
 
     // let's process the block per panel of actual_mc x BlockSize,
     // again, each is split into three parts, etc.
-    for (Index j=0; j<size; j+=BlockSize)
-    {
-      Index actualBlockSize = std::min<Index>(BlockSize,size - j);
-      const RhsScalar* actual_b = blockB+j*depth;
+    for (Index j = 0; j < size; j += BlockSize) {
+      Index actualBlockSize = std::min<Index>(BlockSize, size - j);
+      const RhsScalar* actual_b = blockB + j * depth;
 
-      if(UpLo==Upper)
-        gebp_kernel1(res.getSubMapper(0, j), blockA, actual_b, j, depth, actualBlockSize, alpha,
-                     -1, -1, 0, 0);
-      
+      if (UpLo == Upper)
+        gebp_kernel1(res.getSubMapper(0, j), blockA, actual_b, j, depth, actualBlockSize, alpha, -1, -1, 0, 0);
+
       // selfadjoint micro block
       {
         Index i = j;
         buffer.setZero();
         // 1 - apply the kernel on the temporary buffer
-        gebp_kernel2(BufferMapper(buffer.data(), BlockSize), blockA+depth*i, actual_b, actualBlockSize, depth, actualBlockSize, alpha,
-                     -1, -1, 0, 0);
+        gebp_kernel2(BufferMapper(buffer.data(), BlockSize), blockA + depth * i, actual_b, actualBlockSize, depth,
+                     actualBlockSize, alpha, -1, -1, 0, 0);
 
         // 2 - triangular accumulation
-        for(Index j1=0; j1<actualBlockSize; ++j1)
-        {
-          typename ResMapper::LinearMapper r = res.getLinearMapper(i,j+j1);
-          for(Index i1=UpLo==Lower ? j1 : 0;
-              UpLo==Lower ? i1<actualBlockSize : i1<=j1; ++i1)
-            r(i1) += buffer(i1,j1);
+        for (Index j1 = 0; j1 < actualBlockSize; ++j1) {
+          typename ResMapper::LinearMapper r = res.getLinearMapper(i, j + j1);
+          for (Index i1 = UpLo == Lower ? j1 : 0; UpLo == Lower ? i1 < actualBlockSize : i1 <= j1; ++i1)
+            r(i1) += buffer(i1, j1);
         }
       }
 
-      if(UpLo==Lower)
-      {
-        Index i = j+actualBlockSize;
-        gebp_kernel1(res.getSubMapper(i, j), blockA+depth*i, actual_b, size-i, 
-                     depth, actualBlockSize, alpha, -1, -1, 0, 0);
+      if (UpLo == Lower) {
+        Index i = j + actualBlockSize;
+        gebp_kernel1(res.getSubMapper(i, j), blockA + depth * i, actual_b, size - i, depth, actualBlockSize, alpha, -1,
+                     -1, 0, 0);
       }
     }
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 // high level API
 
-template<typename MatrixType, typename ProductType, int UpLo, bool IsOuterProduct>
+template <typename MatrixType, typename ProductType, int UpLo, bool IsOuterProduct>
 struct general_product_to_triangular_selector;
 
-
-template<typename MatrixType, typename ProductType, int UpLo>
-struct general_product_to_triangular_selector<MatrixType,ProductType,UpLo,true>
-{
-  static void run(MatrixType& mat, const ProductType& prod, const typename MatrixType::Scalar& alpha, bool beta)
-  {
+template <typename MatrixType, typename ProductType, int UpLo>
+struct general_product_to_triangular_selector<MatrixType, ProductType, UpLo, true> {
+  static void run(MatrixType& mat, const ProductType& prod, const typename MatrixType::Scalar& alpha, bool beta) {
     typedef typename MatrixType::Scalar Scalar;
-    
+
     typedef internal::remove_all_t<typename ProductType::LhsNested> Lhs;
     typedef internal::blas_traits<Lhs> LhsBlasTraits;
     typedef typename LhsBlasTraits::DirectLinearAccessType ActualLhs;
     typedef internal::remove_all_t<ActualLhs> ActualLhs_;
     internal::add_const_on_value_type_t<ActualLhs> actualLhs = LhsBlasTraits::extract(prod.lhs());
-    
+
     typedef internal::remove_all_t<typename ProductType::RhsNested> Rhs;
     typedef internal::blas_traits<Rhs> RhsBlasTraits;
     typedef typename RhsBlasTraits::DirectLinearAccessType ActualRhs;
     typedef internal::remove_all_t<ActualRhs> ActualRhs_;
     internal::add_const_on_value_type_t<ActualRhs> actualRhs = RhsBlasTraits::extract(prod.rhs());
 
-    Scalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(prod.lhs().derived()) * RhsBlasTraits::extractScalarFactor(prod.rhs().derived());
+    Scalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(prod.lhs().derived()) *
+                         RhsBlasTraits::extractScalarFactor(prod.rhs().derived());
 
-    if(!beta)
-      mat.template triangularView<UpLo>().setZero();
+    if (!beta) mat.template triangularView<UpLo>().setZero();
 
     enum {
-      StorageOrder = (internal::traits<MatrixType>::Flags&RowMajorBit) ? RowMajor : ColMajor,
-      UseLhsDirectly = ActualLhs_::InnerStrideAtCompileTime==1,
-      UseRhsDirectly = ActualRhs_::InnerStrideAtCompileTime==1
+      StorageOrder = (internal::traits<MatrixType>::Flags & RowMajorBit) ? RowMajor : ColMajor,
+      UseLhsDirectly = ActualLhs_::InnerStrideAtCompileTime == 1,
+      UseRhsDirectly = ActualRhs_::InnerStrideAtCompileTime == 1
     };
-    
-    internal::gemv_static_vector_if<Scalar,Lhs::SizeAtCompileTime,Lhs::MaxSizeAtCompileTime,!UseLhsDirectly> static_lhs;
-    ei_declare_aligned_stack_constructed_variable(Scalar, actualLhsPtr, actualLhs.size(),
-      (UseLhsDirectly ? const_cast<Scalar*>(actualLhs.data()) : static_lhs.data()));
-    if(!UseLhsDirectly) Map<typename ActualLhs_::PlainObject>(actualLhsPtr, actualLhs.size()) = actualLhs;
-    
-    internal::gemv_static_vector_if<Scalar,Rhs::SizeAtCompileTime,Rhs::MaxSizeAtCompileTime,!UseRhsDirectly> static_rhs;
-    ei_declare_aligned_stack_constructed_variable(Scalar, actualRhsPtr, actualRhs.size(),
-      (UseRhsDirectly ? const_cast<Scalar*>(actualRhs.data()) : static_rhs.data()));
-    if(!UseRhsDirectly) Map<typename ActualRhs_::PlainObject>(actualRhsPtr, actualRhs.size()) = actualRhs;
-    
-    
-    selfadjoint_rank1_update<Scalar,Index,StorageOrder,UpLo,
-                              LhsBlasTraits::NeedToConjugate && NumTraits<Scalar>::IsComplex,
-                              RhsBlasTraits::NeedToConjugate && NumTraits<Scalar>::IsComplex>
-          ::run(actualLhs.size(), mat.data(), mat.outerStride(), actualLhsPtr, actualRhsPtr, actualAlpha);
+
+    internal::gemv_static_vector_if<Scalar, Lhs::SizeAtCompileTime, Lhs::MaxSizeAtCompileTime, !UseLhsDirectly>
+        static_lhs;
+    ei_declare_aligned_stack_constructed_variable(
+        Scalar, actualLhsPtr, actualLhs.size(),
+        (UseLhsDirectly ? const_cast<Scalar*>(actualLhs.data()) : static_lhs.data()));
+    if (!UseLhsDirectly) Map<typename ActualLhs_::PlainObject>(actualLhsPtr, actualLhs.size()) = actualLhs;
+
+    internal::gemv_static_vector_if<Scalar, Rhs::SizeAtCompileTime, Rhs::MaxSizeAtCompileTime, !UseRhsDirectly>
+        static_rhs;
+    ei_declare_aligned_stack_constructed_variable(
+        Scalar, actualRhsPtr, actualRhs.size(),
+        (UseRhsDirectly ? const_cast<Scalar*>(actualRhs.data()) : static_rhs.data()));
+    if (!UseRhsDirectly) Map<typename ActualRhs_::PlainObject>(actualRhsPtr, actualRhs.size()) = actualRhs;
+
+    selfadjoint_rank1_update<
+        Scalar, Index, StorageOrder, UpLo, LhsBlasTraits::NeedToConjugate && NumTraits<Scalar>::IsComplex,
+        RhsBlasTraits::NeedToConjugate && NumTraits<Scalar>::IsComplex>::run(actualLhs.size(), mat.data(),
+                                                                             mat.outerStride(), actualLhsPtr,
+                                                                             actualRhsPtr, actualAlpha);
   }
 };
 
-template<typename MatrixType, typename ProductType, int UpLo>
-struct general_product_to_triangular_selector<MatrixType,ProductType,UpLo,false>
-{
-  static void run(MatrixType& mat, const ProductType& prod, const typename MatrixType::Scalar& alpha, bool beta)
-  {
+template <typename MatrixType, typename ProductType, int UpLo>
+struct general_product_to_triangular_selector<MatrixType, ProductType, UpLo, false> {
+  static void run(MatrixType& mat, const ProductType& prod, const typename MatrixType::Scalar& alpha, bool beta) {
     typedef internal::remove_all_t<typename ProductType::LhsNested> Lhs;
     typedef internal::blas_traits<Lhs> LhsBlasTraits;
     typedef typename LhsBlasTraits::DirectLinearAccessType ActualLhs;
     typedef internal::remove_all_t<ActualLhs> ActualLhs_;
     internal::add_const_on_value_type_t<ActualLhs> actualLhs = LhsBlasTraits::extract(prod.lhs());
-    
+
     typedef internal::remove_all_t<typename ProductType::RhsNested> Rhs;
     typedef internal::blas_traits<Rhs> RhsBlasTraits;
     typedef typename RhsBlasTraits::DirectLinearAccessType ActualRhs;
     typedef internal::remove_all_t<ActualRhs> ActualRhs_;
     internal::add_const_on_value_type_t<ActualRhs> actualRhs = RhsBlasTraits::extract(prod.rhs());
 
-    typename ProductType::Scalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(prod.lhs().derived()) * RhsBlasTraits::extractScalarFactor(prod.rhs().derived());
+    typename ProductType::Scalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(prod.lhs().derived()) *
+                                               RhsBlasTraits::extractScalarFactor(prod.rhs().derived());
 
-    if(!beta)
-      mat.template triangularView<UpLo>().setZero();
+    if (!beta) mat.template triangularView<UpLo>().setZero();
 
     enum {
-      IsRowMajor = (internal::traits<MatrixType>::Flags&RowMajorBit) ? 1 : 0,
-      LhsIsRowMajor = ActualLhs_::Flags&RowMajorBit ? 1 : 0,
-      RhsIsRowMajor = ActualRhs_::Flags&RowMajorBit ? 1 : 0,
-      SkipDiag = (UpLo&(UnitDiag|ZeroDiag))!=0
+      IsRowMajor = (internal::traits<MatrixType>::Flags & RowMajorBit) ? 1 : 0,
+      LhsIsRowMajor = ActualLhs_::Flags & RowMajorBit ? 1 : 0,
+      RhsIsRowMajor = ActualRhs_::Flags & RowMajorBit ? 1 : 0,
+      SkipDiag = (UpLo & (UnitDiag | ZeroDiag)) != 0
     };
 
     Index size = mat.cols();
-    if(SkipDiag)
-      size--;
+    if (SkipDiag) size--;
     Index depth = actualLhs.cols();
 
-    typedef internal::gemm_blocking_space<IsRowMajor ? RowMajor : ColMajor,typename Lhs::Scalar,typename Rhs::Scalar,
-          MatrixType::MaxColsAtCompileTime, MatrixType::MaxColsAtCompileTime, ActualRhs_::MaxColsAtCompileTime> BlockingType;
+    typedef internal::gemm_blocking_space<IsRowMajor ? RowMajor : ColMajor, typename Lhs::Scalar, typename Rhs::Scalar,
+                                          MatrixType::MaxColsAtCompileTime, MatrixType::MaxColsAtCompileTime,
+                                          ActualRhs_::MaxColsAtCompileTime>
+        BlockingType;
 
     BlockingType blocking(size, size, depth, 1, false);
 
-    internal::general_matrix_matrix_triangular_product<Index,
-      typename Lhs::Scalar, LhsIsRowMajor ? RowMajor : ColMajor, LhsBlasTraits::NeedToConjugate,
-      typename Rhs::Scalar, RhsIsRowMajor ? RowMajor : ColMajor, RhsBlasTraits::NeedToConjugate,
-      IsRowMajor ? RowMajor : ColMajor, MatrixType::InnerStrideAtCompileTime, UpLo&(Lower|Upper)>
-      ::run(size, depth,
-            &actualLhs.coeffRef(SkipDiag&&(UpLo&Lower)==Lower ? 1 : 0,0), actualLhs.outerStride(),
-            &actualRhs.coeffRef(0,SkipDiag&&(UpLo&Upper)==Upper ? 1 : 0), actualRhs.outerStride(),
-            mat.data() + (SkipDiag ? (bool(IsRowMajor) != ((UpLo&Lower)==Lower) ? mat.innerStride() : mat.outerStride() ) : 0),
-            mat.innerStride(), mat.outerStride(), actualAlpha, blocking);
+    internal::general_matrix_matrix_triangular_product<
+        Index, typename Lhs::Scalar, LhsIsRowMajor ? RowMajor : ColMajor, LhsBlasTraits::NeedToConjugate,
+        typename Rhs::Scalar, RhsIsRowMajor ? RowMajor : ColMajor, RhsBlasTraits::NeedToConjugate,
+        IsRowMajor ? RowMajor : ColMajor, MatrixType::InnerStrideAtCompileTime,
+        UpLo&(Lower | Upper)>::run(size, depth, &actualLhs.coeffRef(SkipDiag && (UpLo & Lower) == Lower ? 1 : 0, 0),
+                                   actualLhs.outerStride(),
+                                   &actualRhs.coeffRef(0, SkipDiag && (UpLo & Upper) == Upper ? 1 : 0),
+                                   actualRhs.outerStride(),
+                                   mat.data() +
+                                       (SkipDiag ? (bool(IsRowMajor) != ((UpLo & Lower) == Lower) ? mat.innerStride()
+                                                                                                  : mat.outerStride())
+                                                 : 0),
+                                   mat.innerStride(), mat.outerStride(), actualAlpha, blocking);
   }
 };
 
-template<typename MatrixType, unsigned int UpLo>
-template<typename ProductType>
-EIGEN_DEVICE_FUNC TriangularView<MatrixType,UpLo>& TriangularViewImpl<MatrixType,UpLo,Dense>::_assignProduct(const ProductType& prod, const Scalar& alpha, bool beta)
-{
-  EIGEN_STATIC_ASSERT((UpLo&UnitDiag)==0, WRITING_TO_TRIANGULAR_PART_WITH_UNIT_DIAGONAL_IS_NOT_SUPPORTED);
+template <typename MatrixType, unsigned int UpLo>
+template <typename ProductType>
+EIGEN_DEVICE_FUNC TriangularView<MatrixType, UpLo>& TriangularViewImpl<MatrixType, UpLo, Dense>::_assignProduct(
+    const ProductType& prod, const Scalar& alpha, bool beta) {
+  EIGEN_STATIC_ASSERT((UpLo & UnitDiag) == 0, WRITING_TO_TRIANGULAR_PART_WITH_UNIT_DIAGONAL_IS_NOT_SUPPORTED);
   eigen_assert(derived().nestedExpression().rows() == prod.rows() && derived().cols() == prod.cols());
 
-  general_product_to_triangular_selector<MatrixType, ProductType, UpLo, internal::traits<ProductType>::InnerSize==1>::run(derived().nestedExpression().const_cast_derived(), prod, alpha, beta);
+  general_product_to_triangular_selector<MatrixType, ProductType, UpLo, internal::traits<ProductType>::InnerSize == 1>::
+      run(derived().nestedExpression().const_cast_derived(), prod, alpha, beta);
 
   return derived();
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_GENERAL_MATRIX_MATRIX_TRIANGULAR_H
+#endif  // EIGEN_GENERAL_MATRIX_MATRIX_TRIANGULAR_H
diff --git a/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h b/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h
index 8379f5b..f569907 100644
--- a/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h
+++ b/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h
@@ -41,32 +41,29 @@
 namespace internal {
 
 template <typename Index, typename Scalar, int AStorageOrder, bool ConjugateA, int ResStorageOrder, int UpLo>
-struct general_matrix_matrix_rankupdate :
-       general_matrix_matrix_triangular_product<
-         Index,Scalar,AStorageOrder,ConjugateA,Scalar,AStorageOrder,ConjugateA,ResStorageOrder,1,UpLo,BuiltIn> {};
-
+struct general_matrix_matrix_rankupdate
+    : general_matrix_matrix_triangular_product<Index, Scalar, AStorageOrder, ConjugateA, Scalar, AStorageOrder,
+                                               ConjugateA, ResStorageOrder, 1, UpLo, BuiltIn> {};
 
 // try to go to BLAS specialization
-#define EIGEN_BLAS_RANKUPDATE_SPECIALIZE(Scalar) \
-template <typename Index, int LhsStorageOrder, bool ConjugateLhs, \
-                          int RhsStorageOrder, bool ConjugateRhs, int  UpLo> \
-struct general_matrix_matrix_triangular_product<Index,Scalar,LhsStorageOrder,ConjugateLhs, \
-               Scalar,RhsStorageOrder,ConjugateRhs,ColMajor,1,UpLo,Specialized> { \
-  static EIGEN_STRONG_INLINE void run(Index size, Index depth,const Scalar* lhs, Index lhsStride, \
-                          const Scalar* rhs, Index rhsStride, Scalar* res, Index resIncr, Index resStride, Scalar alpha, level3_blocking<Scalar, Scalar>& blocking) \
-  { \
-    if ( lhs==rhs && ((UpLo&(Lower|Upper))==UpLo) ) { \
-      general_matrix_matrix_rankupdate<Index,Scalar,LhsStorageOrder,ConjugateLhs,ColMajor,UpLo> \
-      ::run(size,depth,lhs,lhsStride,rhs,rhsStride,res,resStride,alpha,blocking); \
-    } else { \
-      general_matrix_matrix_triangular_product<Index, \
-        Scalar, LhsStorageOrder, ConjugateLhs, \
-        Scalar, RhsStorageOrder, ConjugateRhs, \
-        ColMajor, 1, UpLo, BuiltIn> \
-      ::run(size,depth,lhs,lhsStride,rhs,rhsStride,res,resIncr,resStride,alpha,blocking); \
-    } \
-  } \
-};
+#define EIGEN_BLAS_RANKUPDATE_SPECIALIZE(Scalar)                                                                      \
+  template <typename Index, int LhsStorageOrder, bool ConjugateLhs, int RhsStorageOrder, bool ConjugateRhs, int UpLo> \
+  struct general_matrix_matrix_triangular_product<Index, Scalar, LhsStorageOrder, ConjugateLhs, Scalar,               \
+                                                  RhsStorageOrder, ConjugateRhs, ColMajor, 1, UpLo, Specialized> {    \
+    static EIGEN_STRONG_INLINE void run(Index size, Index depth, const Scalar* lhs, Index lhsStride,                  \
+                                        const Scalar* rhs, Index rhsStride, Scalar* res, Index resIncr,               \
+                                        Index resStride, Scalar alpha, level3_blocking<Scalar, Scalar>& blocking) {   \
+      if (lhs == rhs && ((UpLo & (Lower | Upper)) == UpLo)) {                                                         \
+        general_matrix_matrix_rankupdate<Index, Scalar, LhsStorageOrder, ConjugateLhs, ColMajor, UpLo>::run(          \
+            size, depth, lhs, lhsStride, rhs, rhsStride, res, resStride, alpha, blocking);                            \
+      } else {                                                                                                        \
+        general_matrix_matrix_triangular_product<Index, Scalar, LhsStorageOrder, ConjugateLhs, Scalar,                \
+                                                 RhsStorageOrder, ConjugateRhs, ColMajor, 1, UpLo,                    \
+                                                 BuiltIn>::run(size, depth, lhs, lhsStride, rhs, rhsStride, res,      \
+                                                               resIncr, resStride, alpha, blocking);                  \
+      }                                                                                                               \
+    }                                                                                                                 \
+  };
 
 EIGEN_BLAS_RANKUPDATE_SPECIALIZE(double)
 EIGEN_BLAS_RANKUPDATE_SPECIALIZE(float)
@@ -75,74 +72,77 @@
 // EIGEN_BLAS_RANKUPDATE_SPECIALIZE(scomplex)
 
 // SYRK for float/double
-#define EIGEN_BLAS_RANKUPDATE_R(EIGTYPE, BLASTYPE, BLASFUNC) \
-template <typename Index, int AStorageOrder, bool ConjugateA, int  UpLo> \
-struct general_matrix_matrix_rankupdate<Index,EIGTYPE,AStorageOrder,ConjugateA,ColMajor,UpLo> { \
-  enum { \
-    IsLower = (UpLo&Lower) == Lower, \
-    LowUp = IsLower ? Lower : Upper, \
-    conjA = ((AStorageOrder==ColMajor) && ConjugateA) ? 1 : 0 \
-  }; \
-  static EIGEN_STRONG_INLINE void run(Index size, Index depth,const EIGTYPE* lhs, Index lhsStride, \
-                          const EIGTYPE* /*rhs*/, Index /*rhsStride*/, EIGTYPE* res, Index resStride, EIGTYPE alpha, level3_blocking<EIGTYPE, EIGTYPE>& /*blocking*/) \
-  { \
-  /* typedef Matrix<EIGTYPE, Dynamic, Dynamic, RhsStorageOrder> MatrixRhs;*/ \
-\
-   BlasIndex lda=convert_index<BlasIndex>(lhsStride), ldc=convert_index<BlasIndex>(resStride), n=convert_index<BlasIndex>(size), k=convert_index<BlasIndex>(depth); \
-   char uplo=((IsLower) ? 'L' : 'U'), trans=((AStorageOrder==RowMajor) ? 'T':'N'); \
-   EIGTYPE beta(1); \
-   BLASFUNC(&uplo, &trans, &n, &k, (const BLASTYPE*)&numext::real_ref(alpha), lhs, &lda, (const BLASTYPE*)&numext::real_ref(beta), res, &ldc); \
-  } \
-};
+#define EIGEN_BLAS_RANKUPDATE_R(EIGTYPE, BLASTYPE, BLASFUNC)                                                        \
+  template <typename Index, int AStorageOrder, bool ConjugateA, int UpLo>                                           \
+  struct general_matrix_matrix_rankupdate<Index, EIGTYPE, AStorageOrder, ConjugateA, ColMajor, UpLo> {              \
+    enum {                                                                                                          \
+      IsLower = (UpLo & Lower) == Lower,                                                                            \
+      LowUp = IsLower ? Lower : Upper,                                                                              \
+      conjA = ((AStorageOrder == ColMajor) && ConjugateA) ? 1 : 0                                                   \
+    };                                                                                                              \
+    static EIGEN_STRONG_INLINE void run(Index size, Index depth, const EIGTYPE* lhs, Index lhsStride,               \
+                                        const EIGTYPE* /*rhs*/, Index /*rhsStride*/, EIGTYPE* res, Index resStride, \
+                                        EIGTYPE alpha, level3_blocking<EIGTYPE, EIGTYPE>& /*blocking*/) {           \
+      /* typedef Matrix<EIGTYPE, Dynamic, Dynamic, RhsStorageOrder> MatrixRhs;*/                                    \
+                                                                                                                    \
+      BlasIndex lda = convert_index<BlasIndex>(lhsStride), ldc = convert_index<BlasIndex>(resStride),               \
+                n = convert_index<BlasIndex>(size), k = convert_index<BlasIndex>(depth);                            \
+      char uplo = ((IsLower) ? 'L' : 'U'), trans = ((AStorageOrder == RowMajor) ? 'T' : 'N');                       \
+      EIGTYPE beta(1);                                                                                              \
+      BLASFUNC(&uplo, &trans, &n, &k, (const BLASTYPE*)&numext::real_ref(alpha), lhs, &lda,                         \
+               (const BLASTYPE*)&numext::real_ref(beta), res, &ldc);                                                \
+    }                                                                                                               \
+  };
 
 // HERK for complex data
-#define EIGEN_BLAS_RANKUPDATE_C(EIGTYPE, BLASTYPE, RTYPE, BLASFUNC) \
-template <typename Index, int AStorageOrder, bool ConjugateA, int  UpLo> \
-struct general_matrix_matrix_rankupdate<Index,EIGTYPE,AStorageOrder,ConjugateA,ColMajor,UpLo> { \
-  enum { \
-    IsLower = (UpLo&Lower) == Lower, \
-    LowUp = IsLower ? Lower : Upper, \
-    conjA = (((AStorageOrder==ColMajor) && ConjugateA) || ((AStorageOrder==RowMajor) && !ConjugateA)) ? 1 : 0 \
-  }; \
-  static EIGEN_STRONG_INLINE void run(Index size, Index depth,const EIGTYPE* lhs, Index lhsStride, \
-                          const EIGTYPE* /*rhs*/, Index /*rhsStride*/, EIGTYPE* res, Index resStride, EIGTYPE alpha, level3_blocking<EIGTYPE, EIGTYPE>& /*blocking*/) \
-  { \
-   typedef Matrix<EIGTYPE, Dynamic, Dynamic, AStorageOrder> MatrixType; \
-\
-   BlasIndex lda=convert_index<BlasIndex>(lhsStride), ldc=convert_index<BlasIndex>(resStride), n=convert_index<BlasIndex>(size), k=convert_index<BlasIndex>(depth); \
-   char uplo=((IsLower) ? 'L' : 'U'), trans=((AStorageOrder==RowMajor) ? 'C':'N'); \
-   RTYPE alpha_, beta_; \
-   const EIGTYPE* a_ptr; \
-\
-   alpha_ = alpha.real(); \
-   beta_ = 1.0; \
-/* Copy with conjugation in some cases*/ \
-   MatrixType a; \
-   if (conjA) { \
-     Map<const MatrixType, 0, OuterStride<> > mapA(lhs,n,k,OuterStride<>(lhsStride)); \
-     a = mapA.conjugate(); \
-     lda = a.outerStride(); \
-     a_ptr = a.data(); \
-   } else a_ptr=lhs; \
-   BLASFUNC(&uplo, &trans, &n, &k, &alpha_, (BLASTYPE*)a_ptr, &lda, &beta_, (BLASTYPE*)res, &ldc); \
-  } \
-};
+#define EIGEN_BLAS_RANKUPDATE_C(EIGTYPE, BLASTYPE, RTYPE, BLASFUNC)                                                 \
+  template <typename Index, int AStorageOrder, bool ConjugateA, int UpLo>                                           \
+  struct general_matrix_matrix_rankupdate<Index, EIGTYPE, AStorageOrder, ConjugateA, ColMajor, UpLo> {              \
+    enum {                                                                                                          \
+      IsLower = (UpLo & Lower) == Lower,                                                                            \
+      LowUp = IsLower ? Lower : Upper,                                                                              \
+      conjA = (((AStorageOrder == ColMajor) && ConjugateA) || ((AStorageOrder == RowMajor) && !ConjugateA)) ? 1 : 0 \
+    };                                                                                                              \
+    static EIGEN_STRONG_INLINE void run(Index size, Index depth, const EIGTYPE* lhs, Index lhsStride,               \
+                                        const EIGTYPE* /*rhs*/, Index /*rhsStride*/, EIGTYPE* res, Index resStride, \
+                                        EIGTYPE alpha, level3_blocking<EIGTYPE, EIGTYPE>& /*blocking*/) {           \
+      typedef Matrix<EIGTYPE, Dynamic, Dynamic, AStorageOrder> MatrixType;                                          \
+                                                                                                                    \
+      BlasIndex lda = convert_index<BlasIndex>(lhsStride), ldc = convert_index<BlasIndex>(resStride),               \
+                n = convert_index<BlasIndex>(size), k = convert_index<BlasIndex>(depth);                            \
+      char uplo = ((IsLower) ? 'L' : 'U'), trans = ((AStorageOrder == RowMajor) ? 'C' : 'N');                       \
+      RTYPE alpha_, beta_;                                                                                          \
+      const EIGTYPE* a_ptr;                                                                                         \
+                                                                                                                    \
+      alpha_ = alpha.real();                                                                                        \
+      beta_ = 1.0;                                                                                                  \
+      /* Copy with conjugation in some cases*/                                                                      \
+      MatrixType a;                                                                                                 \
+      if (conjA) {                                                                                                  \
+        Map<const MatrixType, 0, OuterStride<> > mapA(lhs, n, k, OuterStride<>(lhsStride));                         \
+        a = mapA.conjugate();                                                                                       \
+        lda = a.outerStride();                                                                                      \
+        a_ptr = a.data();                                                                                           \
+      } else                                                                                                        \
+        a_ptr = lhs;                                                                                                \
+      BLASFUNC(&uplo, &trans, &n, &k, &alpha_, (BLASTYPE*)a_ptr, &lda, &beta_, (BLASTYPE*)res, &ldc);               \
+    }                                                                                                               \
+  };
 
 #ifdef EIGEN_USE_MKL
 EIGEN_BLAS_RANKUPDATE_R(double, double, dsyrk)
-EIGEN_BLAS_RANKUPDATE_R(float,  float,  ssyrk)
+EIGEN_BLAS_RANKUPDATE_R(float, float, ssyrk)
 #else
 EIGEN_BLAS_RANKUPDATE_R(double, double, dsyrk_)
-EIGEN_BLAS_RANKUPDATE_R(float,  float,  ssyrk_)
+EIGEN_BLAS_RANKUPDATE_R(float, float, ssyrk_)
 #endif
 
 // TODO hanlde complex cases
 // EIGEN_BLAS_RANKUPDATE_C(dcomplex, double, double, zherk_)
 // EIGEN_BLAS_RANKUPDATE_C(scomplex, float,  float, cherk_)
 
+}  // end namespace internal
 
-} // end namespace internal
+}  // end namespace Eigen
 
-} // end namespace Eigen
-
-#endif // EIGEN_GENERAL_MATRIX_MATRIX_TRIANGULAR_BLAS_H
+#endif  // EIGEN_GENERAL_MATRIX_MATRIX_TRIANGULAR_BLAS_H
diff --git a/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h b/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h
index b40bcec..af64fd2 100644
--- a/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h
+++ b/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h
@@ -36,92 +36,88 @@
 // IWYU pragma: private
 #include "../InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
 /**********************************************************************
-* This file implements general matrix-matrix multiplication using BLAS
-* gemm function via partial specialization of
-* general_matrix_matrix_product::run(..) method for float, double,
-* std::complex<float> and std::complex<double> types
-**********************************************************************/
+ * This file implements general matrix-matrix multiplication using BLAS
+ * gemm function via partial specialization of
+ * general_matrix_matrix_product::run(..) method for float, double,
+ * std::complex<float> and std::complex<double> types
+ **********************************************************************/
 
 // gemm specialization
 
-#define GEMM_SPECIALIZATION(EIGTYPE, EIGPREFIX, BLASTYPE, BLASFUNC) \
-template< \
-  typename Index, \
-  int LhsStorageOrder, bool ConjugateLhs, \
-  int RhsStorageOrder, bool ConjugateRhs> \
-struct general_matrix_matrix_product<Index,EIGTYPE,LhsStorageOrder,ConjugateLhs,EIGTYPE,RhsStorageOrder,ConjugateRhs,ColMajor,1> \
-{ \
-typedef gebp_traits<EIGTYPE,EIGTYPE> Traits; \
-\
-static void run(Index rows, Index cols, Index depth, \
-  const EIGTYPE* _lhs, Index lhsStride, \
-  const EIGTYPE* _rhs, Index rhsStride, \
-  EIGTYPE* res, Index resIncr, Index resStride, \
-  EIGTYPE alpha, \
-  level3_blocking<EIGTYPE, EIGTYPE>& /*blocking*/, \
-  GemmParallelInfo<Index>* /*info = 0*/) \
-{ \
-  using std::conj; \
-\
-  EIGEN_ONLY_USED_FOR_DEBUG(resIncr); \
-  eigen_assert(resIncr == 1); \
-  char transa, transb; \
-  BlasIndex m, n, k, lda, ldb, ldc; \
-  const EIGTYPE *a, *b; \
-  EIGTYPE beta(1); \
-  MatrixX##EIGPREFIX a_tmp, b_tmp; \
-\
-/* Set transpose options */ \
-  transa = (LhsStorageOrder==RowMajor) ? ((ConjugateLhs) ? 'C' : 'T') : 'N'; \
-  transb = (RhsStorageOrder==RowMajor) ? ((ConjugateRhs) ? 'C' : 'T') : 'N'; \
-\
-/* Set m, n, k */ \
-  m = convert_index<BlasIndex>(rows);  \
-  n = convert_index<BlasIndex>(cols);  \
-  k = convert_index<BlasIndex>(depth); \
-\
-/* Set lda, ldb, ldc */ \
-  lda = convert_index<BlasIndex>(lhsStride); \
-  ldb = convert_index<BlasIndex>(rhsStride); \
-  ldc = convert_index<BlasIndex>(resStride); \
-\
-/* Set a, b, c */ \
-  if ((LhsStorageOrder==ColMajor) && (ConjugateLhs)) { \
-    Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > lhs(_lhs,m,k,OuterStride<>(lhsStride)); \
-    a_tmp = lhs.conjugate(); \
-    a = a_tmp.data(); \
-    lda = convert_index<BlasIndex>(a_tmp.outerStride()); \
-  } else a = _lhs; \
-\
-  if ((RhsStorageOrder==ColMajor) && (ConjugateRhs)) { \
-    Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > rhs(_rhs,k,n,OuterStride<>(rhsStride)); \
-    b_tmp = rhs.conjugate(); \
-    b = b_tmp.data(); \
-    ldb = convert_index<BlasIndex>(b_tmp.outerStride()); \
-  } else b = _rhs; \
-\
-  BLASFUNC(&transa, &transb, &m, &n, &k, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (const BLASTYPE*)b, &ldb, (const BLASTYPE*)&numext::real_ref(beta), (BLASTYPE*)res, &ldc); \
-}};
+#define GEMM_SPECIALIZATION(EIGTYPE, EIGPREFIX, BLASTYPE, BLASFUNC)                                                 \
+  template <typename Index, int LhsStorageOrder, bool ConjugateLhs, int RhsStorageOrder, bool ConjugateRhs>         \
+  struct general_matrix_matrix_product<Index, EIGTYPE, LhsStorageOrder, ConjugateLhs, EIGTYPE, RhsStorageOrder,     \
+                                       ConjugateRhs, ColMajor, 1> {                                                 \
+    typedef gebp_traits<EIGTYPE, EIGTYPE> Traits;                                                                   \
+                                                                                                                    \
+    static void run(Index rows, Index cols, Index depth, const EIGTYPE* _lhs, Index lhsStride, const EIGTYPE* _rhs, \
+                    Index rhsStride, EIGTYPE* res, Index resIncr, Index resStride, EIGTYPE alpha,                   \
+                    level3_blocking<EIGTYPE, EIGTYPE>& /*blocking*/, GemmParallelInfo<Index>* /*info = 0*/) {       \
+      using std::conj;                                                                                              \
+                                                                                                                    \
+      EIGEN_ONLY_USED_FOR_DEBUG(resIncr);                                                                           \
+      eigen_assert(resIncr == 1);                                                                                   \
+      char transa, transb;                                                                                          \
+      BlasIndex m, n, k, lda, ldb, ldc;                                                                             \
+      const EIGTYPE *a, *b;                                                                                         \
+      EIGTYPE beta(1);                                                                                              \
+      MatrixX##EIGPREFIX a_tmp, b_tmp;                                                                              \
+                                                                                                                    \
+      /* Set transpose options */                                                                                   \
+      transa = (LhsStorageOrder == RowMajor) ? ((ConjugateLhs) ? 'C' : 'T') : 'N';                                  \
+      transb = (RhsStorageOrder == RowMajor) ? ((ConjugateRhs) ? 'C' : 'T') : 'N';                                  \
+                                                                                                                    \
+      /* Set m, n, k */                                                                                             \
+      m = convert_index<BlasIndex>(rows);                                                                           \
+      n = convert_index<BlasIndex>(cols);                                                                           \
+      k = convert_index<BlasIndex>(depth);                                                                          \
+                                                                                                                    \
+      /* Set lda, ldb, ldc */                                                                                       \
+      lda = convert_index<BlasIndex>(lhsStride);                                                                    \
+      ldb = convert_index<BlasIndex>(rhsStride);                                                                    \
+      ldc = convert_index<BlasIndex>(resStride);                                                                    \
+                                                                                                                    \
+      /* Set a, b, c */                                                                                             \
+      if ((LhsStorageOrder == ColMajor) && (ConjugateLhs)) {                                                        \
+        Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > lhs(_lhs, m, k, OuterStride<>(lhsStride));                 \
+        a_tmp = lhs.conjugate();                                                                                    \
+        a = a_tmp.data();                                                                                           \
+        lda = convert_index<BlasIndex>(a_tmp.outerStride());                                                        \
+      } else                                                                                                        \
+        a = _lhs;                                                                                                   \
+                                                                                                                    \
+      if ((RhsStorageOrder == ColMajor) && (ConjugateRhs)) {                                                        \
+        Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > rhs(_rhs, k, n, OuterStride<>(rhsStride));                 \
+        b_tmp = rhs.conjugate();                                                                                    \
+        b = b_tmp.data();                                                                                           \
+        ldb = convert_index<BlasIndex>(b_tmp.outerStride());                                                        \
+      } else                                                                                                        \
+        b = _rhs;                                                                                                   \
+                                                                                                                    \
+      BLASFUNC(&transa, &transb, &m, &n, &k, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)a, &lda,   \
+               (const BLASTYPE*)b, &ldb, (const BLASTYPE*)&numext::real_ref(beta), (BLASTYPE*)res, &ldc);           \
+    }                                                                                                               \
+  };
 
 #ifdef EIGEN_USE_MKL
-GEMM_SPECIALIZATION(double,   d,  double, dgemm)
-GEMM_SPECIALIZATION(float,    f,  float,  sgemm)
+GEMM_SPECIALIZATION(double, d, double, dgemm)
+GEMM_SPECIALIZATION(float, f, float, sgemm)
 GEMM_SPECIALIZATION(dcomplex, cd, MKL_Complex16, zgemm)
-GEMM_SPECIALIZATION(scomplex, cf, MKL_Complex8,  cgemm)
+GEMM_SPECIALIZATION(scomplex, cf, MKL_Complex8, cgemm)
 #else
-GEMM_SPECIALIZATION(double,   d,  double, dgemm_)
-GEMM_SPECIALIZATION(float,    f,  float,  sgemm_)
+GEMM_SPECIALIZATION(double, d, double, dgemm_)
+GEMM_SPECIALIZATION(float, f, float, sgemm_)
 GEMM_SPECIALIZATION(dcomplex, cd, double, zgemm_)
-GEMM_SPECIALIZATION(scomplex, cf, float,  cgemm_)
+GEMM_SPECIALIZATION(scomplex, cf, float, cgemm_)
 #endif
 
-} // end namespase internal
+}  // namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_GENERAL_MATRIX_MATRIX_BLAS_H
+#endif  // EIGEN_GENERAL_MATRIX_MATRIX_BLAS_H
diff --git a/Eigen/src/Core/products/GeneralMatrixVector.h b/Eigen/src/Core/products/GeneralMatrixVector.h
index cef0ade..afd8155 100644
--- a/Eigen/src/Core/products/GeneralMatrixVector.h
+++ b/Eigen/src/Core/products/GeneralMatrixVector.h
@@ -17,54 +17,51 @@
 
 namespace internal {
 
-enum GEMVPacketSizeType {
-  GEMVPacketFull = 0,
-  GEMVPacketHalf,
-  GEMVPacketQuarter
-};
+enum GEMVPacketSizeType { GEMVPacketFull = 0, GEMVPacketHalf, GEMVPacketQuarter };
 
 template <int N, typename T1, typename T2, typename T3>
-struct gemv_packet_cond { typedef T3 type; };
+struct gemv_packet_cond {
+  typedef T3 type;
+};
 
 template <typename T1, typename T2, typename T3>
-struct gemv_packet_cond<GEMVPacketFull, T1, T2, T3> { typedef T1 type; };
+struct gemv_packet_cond<GEMVPacketFull, T1, T2, T3> {
+  typedef T1 type;
+};
 
 template <typename T1, typename T2, typename T3>
-struct gemv_packet_cond<GEMVPacketHalf, T1, T2, T3> { typedef T2 type; };
+struct gemv_packet_cond<GEMVPacketHalf, T1, T2, T3> {
+  typedef T2 type;
+};
 
-template<typename LhsScalar, typename RhsScalar, int PacketSize_=GEMVPacketFull>
-class gemv_traits
-{
+template <typename LhsScalar, typename RhsScalar, int PacketSize_ = GEMVPacketFull>
+class gemv_traits {
   typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar>::ReturnType ResScalar;
 
-#define PACKET_DECL_COND_POSTFIX(postfix, name, packet_size)                        \
-  typedef typename gemv_packet_cond<packet_size,                                  \
-                                    typename packet_traits<name ## Scalar>::type, \
-                                    typename packet_traits<name ## Scalar>::half, \
-                                    typename unpacket_traits<typename packet_traits<name ## Scalar>::half>::half>::type \
-  name ## Packet ## postfix
+#define PACKET_DECL_COND_POSTFIX(postfix, name, packet_size)                                               \
+  typedef typename gemv_packet_cond<                                                                       \
+      packet_size, typename packet_traits<name##Scalar>::type, typename packet_traits<name##Scalar>::half, \
+      typename unpacket_traits<typename packet_traits<name##Scalar>::half>::half>::type name##Packet##postfix
 
   PACKET_DECL_COND_POSTFIX(_, Lhs, PacketSize_);
   PACKET_DECL_COND_POSTFIX(_, Rhs, PacketSize_);
   PACKET_DECL_COND_POSTFIX(_, Res, PacketSize_);
 #undef PACKET_DECL_COND_POSTFIX
 
-public:
+ public:
   enum {
-        Vectorizable = unpacket_traits<LhsPacket_>::vectorizable &&
-        unpacket_traits<RhsPacket_>::vectorizable &&
-        int(unpacket_traits<LhsPacket_>::size)==int(unpacket_traits<RhsPacket_>::size),
-        LhsPacketSize = Vectorizable ? unpacket_traits<LhsPacket_>::size : 1,
-        RhsPacketSize = Vectorizable ? unpacket_traits<RhsPacket_>::size : 1,
-        ResPacketSize = Vectorizable ? unpacket_traits<ResPacket_>::size : 1
+    Vectorizable = unpacket_traits<LhsPacket_>::vectorizable && unpacket_traits<RhsPacket_>::vectorizable &&
+                   int(unpacket_traits<LhsPacket_>::size) == int(unpacket_traits<RhsPacket_>::size),
+    LhsPacketSize = Vectorizable ? unpacket_traits<LhsPacket_>::size : 1,
+    RhsPacketSize = Vectorizable ? unpacket_traits<RhsPacket_>::size : 1,
+    ResPacketSize = Vectorizable ? unpacket_traits<ResPacket_>::size : 1
   };
 
-  typedef std::conditional_t<Vectorizable,LhsPacket_,LhsScalar> LhsPacket;
-  typedef std::conditional_t<Vectorizable,RhsPacket_,RhsScalar> RhsPacket;
-  typedef std::conditional_t<Vectorizable,ResPacket_,ResScalar> ResPacket;
+  typedef std::conditional_t<Vectorizable, LhsPacket_, LhsScalar> LhsPacket;
+  typedef std::conditional_t<Vectorizable, RhsPacket_, RhsScalar> RhsPacket;
+  typedef std::conditional_t<Vectorizable, ResPacket_, ResScalar> ResPacket;
 };
 
-
 /* Optimized col-major matrix * vector product:
  * This algorithm processes the matrix per vertical panels,
  * which are then processed horizontally per chunck of 8*PacketSize x 1 vertical segments.
@@ -78,12 +75,13 @@
  *
  * The same reasoning apply for the transposed case.
  */
-template<typename Index, typename LhsScalar, typename LhsMapper, bool ConjugateLhs, typename RhsScalar, typename RhsMapper, bool ConjugateRhs, int Version>
-struct general_matrix_vector_product<Index,LhsScalar,LhsMapper,ColMajor,ConjugateLhs,RhsScalar,RhsMapper,ConjugateRhs,Version>
-{
-  typedef gemv_traits<LhsScalar,RhsScalar> Traits;
-  typedef gemv_traits<LhsScalar,RhsScalar,GEMVPacketHalf> HalfTraits;
-  typedef gemv_traits<LhsScalar,RhsScalar,GEMVPacketQuarter> QuarterTraits;
+template <typename Index, typename LhsScalar, typename LhsMapper, bool ConjugateLhs, typename RhsScalar,
+          typename RhsMapper, bool ConjugateRhs, int Version>
+struct general_matrix_vector_product<Index, LhsScalar, LhsMapper, ColMajor, ConjugateLhs, RhsScalar, RhsMapper,
+                                     ConjugateRhs, Version> {
+  typedef gemv_traits<LhsScalar, RhsScalar> Traits;
+  typedef gemv_traits<LhsScalar, RhsScalar, GEMVPacketHalf> HalfTraits;
+  typedef gemv_traits<LhsScalar, RhsScalar, GEMVPacketQuarter> QuarterTraits;
 
   typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar>::ReturnType ResScalar;
 
@@ -99,190 +97,163 @@
   typedef typename QuarterTraits::RhsPacket RhsPacketQuarter;
   typedef typename QuarterTraits::ResPacket ResPacketQuarter;
 
-EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE static void run(
-  Index rows, Index cols,
-  const LhsMapper& lhs,
-  const RhsMapper& rhs,
-        ResScalar* res, Index resIncr,
-  RhsScalar alpha);
+  EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE static void run(Index rows, Index cols, const LhsMapper& lhs,
+                                                      const RhsMapper& rhs, ResScalar* res, Index resIncr,
+                                                      RhsScalar alpha);
 };
 
-template<typename Index, typename LhsScalar, typename LhsMapper, bool ConjugateLhs, typename RhsScalar, typename RhsMapper, bool ConjugateRhs, int Version>
-EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE void general_matrix_vector_product<Index,LhsScalar,LhsMapper,ColMajor,ConjugateLhs,RhsScalar,RhsMapper,ConjugateRhs,Version>::run(
-  Index rows, Index cols,
-  const LhsMapper& alhs,
-  const RhsMapper& rhs,
-        ResScalar* res, Index resIncr,
-  RhsScalar alpha)
-{
+template <typename Index, typename LhsScalar, typename LhsMapper, bool ConjugateLhs, typename RhsScalar,
+          typename RhsMapper, bool ConjugateRhs, int Version>
+EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE void
+general_matrix_vector_product<Index, LhsScalar, LhsMapper, ColMajor, ConjugateLhs, RhsScalar, RhsMapper, ConjugateRhs,
+                              Version>::run(Index rows, Index cols, const LhsMapper& alhs, const RhsMapper& rhs,
+                                            ResScalar* res, Index resIncr, RhsScalar alpha) {
   EIGEN_UNUSED_VARIABLE(resIncr);
-  eigen_internal_assert(resIncr==1);
+  eigen_internal_assert(resIncr == 1);
 
   // The following copy tells the compiler that lhs's attributes are not modified outside this function
   // This helps GCC to generate propoer code.
   LhsMapper lhs(alhs);
 
-  conj_helper<LhsScalar,RhsScalar,ConjugateLhs,ConjugateRhs> cj;
-  conj_helper<LhsPacket,RhsPacket,ConjugateLhs,ConjugateRhs> pcj;
-  conj_helper<LhsPacketHalf,RhsPacketHalf,ConjugateLhs,ConjugateRhs> pcj_half;
-  conj_helper<LhsPacketQuarter,RhsPacketQuarter,ConjugateLhs,ConjugateRhs> pcj_quarter;
+  conj_helper<LhsScalar, RhsScalar, ConjugateLhs, ConjugateRhs> cj;
+  conj_helper<LhsPacket, RhsPacket, ConjugateLhs, ConjugateRhs> pcj;
+  conj_helper<LhsPacketHalf, RhsPacketHalf, ConjugateLhs, ConjugateRhs> pcj_half;
+  conj_helper<LhsPacketQuarter, RhsPacketQuarter, ConjugateLhs, ConjugateRhs> pcj_quarter;
 
   const Index lhsStride = lhs.stride();
   // TODO: for padded aligned inputs, we could enable aligned reads
-  enum { LhsAlignment = Unaligned,
-         ResPacketSize = Traits::ResPacketSize,
-         ResPacketSizeHalf = HalfTraits::ResPacketSize,
-         ResPacketSizeQuarter = QuarterTraits::ResPacketSize,
-         LhsPacketSize = Traits::LhsPacketSize,
-         HasHalf = (int)ResPacketSizeHalf < (int)ResPacketSize,
-         HasQuarter = (int)ResPacketSizeQuarter < (int)ResPacketSizeHalf
+  enum {
+    LhsAlignment = Unaligned,
+    ResPacketSize = Traits::ResPacketSize,
+    ResPacketSizeHalf = HalfTraits::ResPacketSize,
+    ResPacketSizeQuarter = QuarterTraits::ResPacketSize,
+    LhsPacketSize = Traits::LhsPacketSize,
+    HasHalf = (int)ResPacketSizeHalf < (int)ResPacketSize,
+    HasQuarter = (int)ResPacketSizeQuarter < (int)ResPacketSizeHalf
   };
 
-  const Index n8 = rows-8*ResPacketSize+1;
-  const Index n4 = rows-4*ResPacketSize+1;
-  const Index n3 = rows-3*ResPacketSize+1;
-  const Index n2 = rows-2*ResPacketSize+1;
-  const Index n1 = rows-1*ResPacketSize+1;
-  const Index n_half = rows-1*ResPacketSizeHalf+1;
-  const Index n_quarter = rows-1*ResPacketSizeQuarter+1;
+  const Index n8 = rows - 8 * ResPacketSize + 1;
+  const Index n4 = rows - 4 * ResPacketSize + 1;
+  const Index n3 = rows - 3 * ResPacketSize + 1;
+  const Index n2 = rows - 2 * ResPacketSize + 1;
+  const Index n1 = rows - 1 * ResPacketSize + 1;
+  const Index n_half = rows - 1 * ResPacketSizeHalf + 1;
+  const Index n_quarter = rows - 1 * ResPacketSizeQuarter + 1;
 
   // TODO: improve the following heuristic:
-  const Index block_cols = cols<128 ? cols : (lhsStride*sizeof(LhsScalar)<32000?16:4);
+  const Index block_cols = cols < 128 ? cols : (lhsStride * sizeof(LhsScalar) < 32000 ? 16 : 4);
   ResPacket palpha = pset1<ResPacket>(alpha);
   ResPacketHalf palpha_half = pset1<ResPacketHalf>(alpha);
   ResPacketQuarter palpha_quarter = pset1<ResPacketQuarter>(alpha);
 
-  for(Index j2=0; j2<cols; j2+=block_cols)
-  {
-    Index jend = numext::mini(j2+block_cols,cols);
-    Index i=0;
-    for(; i<n8; i+=ResPacketSize*8)
-    {
-      ResPacket c0 = pset1<ResPacket>(ResScalar(0)),
-                c1 = pset1<ResPacket>(ResScalar(0)),
-                c2 = pset1<ResPacket>(ResScalar(0)),
-                c3 = pset1<ResPacket>(ResScalar(0)),
-                c4 = pset1<ResPacket>(ResScalar(0)),
-                c5 = pset1<ResPacket>(ResScalar(0)),
-                c6 = pset1<ResPacket>(ResScalar(0)),
-                c7 = pset1<ResPacket>(ResScalar(0));
+  for (Index j2 = 0; j2 < cols; j2 += block_cols) {
+    Index jend = numext::mini(j2 + block_cols, cols);
+    Index i = 0;
+    for (; i < n8; i += ResPacketSize * 8) {
+      ResPacket c0 = pset1<ResPacket>(ResScalar(0)), c1 = pset1<ResPacket>(ResScalar(0)),
+                c2 = pset1<ResPacket>(ResScalar(0)), c3 = pset1<ResPacket>(ResScalar(0)),
+                c4 = pset1<ResPacket>(ResScalar(0)), c5 = pset1<ResPacket>(ResScalar(0)),
+                c6 = pset1<ResPacket>(ResScalar(0)), c7 = pset1<ResPacket>(ResScalar(0));
 
-      for(Index j=j2; j<jend; j+=1)
-      {
-        RhsPacket b0 = pset1<RhsPacket>(rhs(j,0));
-        c0 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+LhsPacketSize*0,j),b0,c0);
-        c1 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+LhsPacketSize*1,j),b0,c1);
-        c2 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+LhsPacketSize*2,j),b0,c2);
-        c3 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+LhsPacketSize*3,j),b0,c3);
-        c4 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+LhsPacketSize*4,j),b0,c4);
-        c5 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+LhsPacketSize*5,j),b0,c5);
-        c6 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+LhsPacketSize*6,j),b0,c6);
-        c7 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+LhsPacketSize*7,j),b0,c7);
+      for (Index j = j2; j < jend; j += 1) {
+        RhsPacket b0 = pset1<RhsPacket>(rhs(j, 0));
+        c0 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + LhsPacketSize * 0, j), b0, c0);
+        c1 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + LhsPacketSize * 1, j), b0, c1);
+        c2 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + LhsPacketSize * 2, j), b0, c2);
+        c3 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + LhsPacketSize * 3, j), b0, c3);
+        c4 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + LhsPacketSize * 4, j), b0, c4);
+        c5 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + LhsPacketSize * 5, j), b0, c5);
+        c6 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + LhsPacketSize * 6, j), b0, c6);
+        c7 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + LhsPacketSize * 7, j), b0, c7);
       }
-      pstoreu(res+i+ResPacketSize*0, pmadd(c0,palpha,ploadu<ResPacket>(res+i+ResPacketSize*0)));
-      pstoreu(res+i+ResPacketSize*1, pmadd(c1,palpha,ploadu<ResPacket>(res+i+ResPacketSize*1)));
-      pstoreu(res+i+ResPacketSize*2, pmadd(c2,palpha,ploadu<ResPacket>(res+i+ResPacketSize*2)));
-      pstoreu(res+i+ResPacketSize*3, pmadd(c3,palpha,ploadu<ResPacket>(res+i+ResPacketSize*3)));
-      pstoreu(res+i+ResPacketSize*4, pmadd(c4,palpha,ploadu<ResPacket>(res+i+ResPacketSize*4)));
-      pstoreu(res+i+ResPacketSize*5, pmadd(c5,palpha,ploadu<ResPacket>(res+i+ResPacketSize*5)));
-      pstoreu(res+i+ResPacketSize*6, pmadd(c6,palpha,ploadu<ResPacket>(res+i+ResPacketSize*6)));
-      pstoreu(res+i+ResPacketSize*7, pmadd(c7,palpha,ploadu<ResPacket>(res+i+ResPacketSize*7)));
+      pstoreu(res + i + ResPacketSize * 0, pmadd(c0, palpha, ploadu<ResPacket>(res + i + ResPacketSize * 0)));
+      pstoreu(res + i + ResPacketSize * 1, pmadd(c1, palpha, ploadu<ResPacket>(res + i + ResPacketSize * 1)));
+      pstoreu(res + i + ResPacketSize * 2, pmadd(c2, palpha, ploadu<ResPacket>(res + i + ResPacketSize * 2)));
+      pstoreu(res + i + ResPacketSize * 3, pmadd(c3, palpha, ploadu<ResPacket>(res + i + ResPacketSize * 3)));
+      pstoreu(res + i + ResPacketSize * 4, pmadd(c4, palpha, ploadu<ResPacket>(res + i + ResPacketSize * 4)));
+      pstoreu(res + i + ResPacketSize * 5, pmadd(c5, palpha, ploadu<ResPacket>(res + i + ResPacketSize * 5)));
+      pstoreu(res + i + ResPacketSize * 6, pmadd(c6, palpha, ploadu<ResPacket>(res + i + ResPacketSize * 6)));
+      pstoreu(res + i + ResPacketSize * 7, pmadd(c7, palpha, ploadu<ResPacket>(res + i + ResPacketSize * 7)));
     }
-    if(i<n4)
-    {
-      ResPacket c0 = pset1<ResPacket>(ResScalar(0)),
-                c1 = pset1<ResPacket>(ResScalar(0)),
-                c2 = pset1<ResPacket>(ResScalar(0)),
-                c3 = pset1<ResPacket>(ResScalar(0));
+    if (i < n4) {
+      ResPacket c0 = pset1<ResPacket>(ResScalar(0)), c1 = pset1<ResPacket>(ResScalar(0)),
+                c2 = pset1<ResPacket>(ResScalar(0)), c3 = pset1<ResPacket>(ResScalar(0));
 
-      for(Index j=j2; j<jend; j+=1)
-      {
-        RhsPacket b0 = pset1<RhsPacket>(rhs(j,0));
-        c0 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+LhsPacketSize*0,j),b0,c0);
-        c1 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+LhsPacketSize*1,j),b0,c1);
-        c2 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+LhsPacketSize*2,j),b0,c2);
-        c3 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+LhsPacketSize*3,j),b0,c3);
+      for (Index j = j2; j < jend; j += 1) {
+        RhsPacket b0 = pset1<RhsPacket>(rhs(j, 0));
+        c0 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + LhsPacketSize * 0, j), b0, c0);
+        c1 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + LhsPacketSize * 1, j), b0, c1);
+        c2 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + LhsPacketSize * 2, j), b0, c2);
+        c3 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + LhsPacketSize * 3, j), b0, c3);
       }
-      pstoreu(res+i+ResPacketSize*0, pmadd(c0,palpha,ploadu<ResPacket>(res+i+ResPacketSize*0)));
-      pstoreu(res+i+ResPacketSize*1, pmadd(c1,palpha,ploadu<ResPacket>(res+i+ResPacketSize*1)));
-      pstoreu(res+i+ResPacketSize*2, pmadd(c2,palpha,ploadu<ResPacket>(res+i+ResPacketSize*2)));
-      pstoreu(res+i+ResPacketSize*3, pmadd(c3,palpha,ploadu<ResPacket>(res+i+ResPacketSize*3)));
+      pstoreu(res + i + ResPacketSize * 0, pmadd(c0, palpha, ploadu<ResPacket>(res + i + ResPacketSize * 0)));
+      pstoreu(res + i + ResPacketSize * 1, pmadd(c1, palpha, ploadu<ResPacket>(res + i + ResPacketSize * 1)));
+      pstoreu(res + i + ResPacketSize * 2, pmadd(c2, palpha, ploadu<ResPacket>(res + i + ResPacketSize * 2)));
+      pstoreu(res + i + ResPacketSize * 3, pmadd(c3, palpha, ploadu<ResPacket>(res + i + ResPacketSize * 3)));
 
-      i+=ResPacketSize*4;
+      i += ResPacketSize * 4;
     }
-    if(i<n3)
-    {
-      ResPacket c0 = pset1<ResPacket>(ResScalar(0)),
-                c1 = pset1<ResPacket>(ResScalar(0)),
+    if (i < n3) {
+      ResPacket c0 = pset1<ResPacket>(ResScalar(0)), c1 = pset1<ResPacket>(ResScalar(0)),
                 c2 = pset1<ResPacket>(ResScalar(0));
 
-      for(Index j=j2; j<jend; j+=1)
-      {
-        RhsPacket b0 = pset1<RhsPacket>(rhs(j,0));
-        c0 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+LhsPacketSize*0,j),b0,c0);
-        c1 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+LhsPacketSize*1,j),b0,c1);
-        c2 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+LhsPacketSize*2,j),b0,c2);
+      for (Index j = j2; j < jend; j += 1) {
+        RhsPacket b0 = pset1<RhsPacket>(rhs(j, 0));
+        c0 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + LhsPacketSize * 0, j), b0, c0);
+        c1 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + LhsPacketSize * 1, j), b0, c1);
+        c2 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + LhsPacketSize * 2, j), b0, c2);
       }
-      pstoreu(res+i+ResPacketSize*0, pmadd(c0,palpha,ploadu<ResPacket>(res+i+ResPacketSize*0)));
-      pstoreu(res+i+ResPacketSize*1, pmadd(c1,palpha,ploadu<ResPacket>(res+i+ResPacketSize*1)));
-      pstoreu(res+i+ResPacketSize*2, pmadd(c2,palpha,ploadu<ResPacket>(res+i+ResPacketSize*2)));
+      pstoreu(res + i + ResPacketSize * 0, pmadd(c0, palpha, ploadu<ResPacket>(res + i + ResPacketSize * 0)));
+      pstoreu(res + i + ResPacketSize * 1, pmadd(c1, palpha, ploadu<ResPacket>(res + i + ResPacketSize * 1)));
+      pstoreu(res + i + ResPacketSize * 2, pmadd(c2, palpha, ploadu<ResPacket>(res + i + ResPacketSize * 2)));
 
-      i+=ResPacketSize*3;
+      i += ResPacketSize * 3;
     }
-    if(i<n2)
-    {
-      ResPacket c0 = pset1<ResPacket>(ResScalar(0)),
-                c1 = pset1<ResPacket>(ResScalar(0));
+    if (i < n2) {
+      ResPacket c0 = pset1<ResPacket>(ResScalar(0)), c1 = pset1<ResPacket>(ResScalar(0));
 
-      for(Index j=j2; j<jend; j+=1)
-      {
-        RhsPacket b0 = pset1<RhsPacket>(rhs(j,0));
-        c0 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+LhsPacketSize*0,j),b0,c0);
-        c1 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+LhsPacketSize*1,j),b0,c1);
+      for (Index j = j2; j < jend; j += 1) {
+        RhsPacket b0 = pset1<RhsPacket>(rhs(j, 0));
+        c0 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + LhsPacketSize * 0, j), b0, c0);
+        c1 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + LhsPacketSize * 1, j), b0, c1);
       }
-      pstoreu(res+i+ResPacketSize*0, pmadd(c0,palpha,ploadu<ResPacket>(res+i+ResPacketSize*0)));
-      pstoreu(res+i+ResPacketSize*1, pmadd(c1,palpha,ploadu<ResPacket>(res+i+ResPacketSize*1)));
-      i+=ResPacketSize*2;
+      pstoreu(res + i + ResPacketSize * 0, pmadd(c0, palpha, ploadu<ResPacket>(res + i + ResPacketSize * 0)));
+      pstoreu(res + i + ResPacketSize * 1, pmadd(c1, palpha, ploadu<ResPacket>(res + i + ResPacketSize * 1)));
+      i += ResPacketSize * 2;
     }
-    if(i<n1)
-    {
+    if (i < n1) {
       ResPacket c0 = pset1<ResPacket>(ResScalar(0));
-      for(Index j=j2; j<jend; j+=1)
-      {
-        RhsPacket b0 = pset1<RhsPacket>(rhs(j,0));
-        c0 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+0,j),b0,c0);
+      for (Index j = j2; j < jend; j += 1) {
+        RhsPacket b0 = pset1<RhsPacket>(rhs(j, 0));
+        c0 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + 0, j), b0, c0);
       }
-      pstoreu(res+i+ResPacketSize*0, pmadd(c0,palpha,ploadu<ResPacket>(res+i+ResPacketSize*0)));
-      i+=ResPacketSize;
+      pstoreu(res + i + ResPacketSize * 0, pmadd(c0, palpha, ploadu<ResPacket>(res + i + ResPacketSize * 0)));
+      i += ResPacketSize;
     }
-    if(HasHalf && i<n_half)
-    {
+    if (HasHalf && i < n_half) {
       ResPacketHalf c0 = pset1<ResPacketHalf>(ResScalar(0));
-      for(Index j=j2; j<jend; j+=1)
-      {
-        RhsPacketHalf b0 = pset1<RhsPacketHalf>(rhs(j,0));
-        c0 = pcj_half.pmadd(lhs.template load<LhsPacketHalf,LhsAlignment>(i+0,j),b0,c0);
+      for (Index j = j2; j < jend; j += 1) {
+        RhsPacketHalf b0 = pset1<RhsPacketHalf>(rhs(j, 0));
+        c0 = pcj_half.pmadd(lhs.template load<LhsPacketHalf, LhsAlignment>(i + 0, j), b0, c0);
       }
-      pstoreu(res+i+ResPacketSizeHalf*0, pmadd(c0,palpha_half,ploadu<ResPacketHalf>(res+i+ResPacketSizeHalf*0)));
-      i+=ResPacketSizeHalf;
+      pstoreu(res + i + ResPacketSizeHalf * 0,
+              pmadd(c0, palpha_half, ploadu<ResPacketHalf>(res + i + ResPacketSizeHalf * 0)));
+      i += ResPacketSizeHalf;
     }
-    if(HasQuarter && i<n_quarter)
-    {
+    if (HasQuarter && i < n_quarter) {
       ResPacketQuarter c0 = pset1<ResPacketQuarter>(ResScalar(0));
-      for(Index j=j2; j<jend; j+=1)
-      {
-        RhsPacketQuarter b0 = pset1<RhsPacketQuarter>(rhs(j,0));
-        c0 = pcj_quarter.pmadd(lhs.template load<LhsPacketQuarter,LhsAlignment>(i+0,j),b0,c0);
+      for (Index j = j2; j < jend; j += 1) {
+        RhsPacketQuarter b0 = pset1<RhsPacketQuarter>(rhs(j, 0));
+        c0 = pcj_quarter.pmadd(lhs.template load<LhsPacketQuarter, LhsAlignment>(i + 0, j), b0, c0);
       }
-      pstoreu(res+i+ResPacketSizeQuarter*0, pmadd(c0,palpha_quarter,ploadu<ResPacketQuarter>(res+i+ResPacketSizeQuarter*0)));
-      i+=ResPacketSizeQuarter;
+      pstoreu(res + i + ResPacketSizeQuarter * 0,
+              pmadd(c0, palpha_quarter, ploadu<ResPacketQuarter>(res + i + ResPacketSizeQuarter * 0)));
+      i += ResPacketSizeQuarter;
     }
-    for(;i<rows;++i)
-    {
+    for (; i < rows; ++i) {
       ResScalar c0(0);
-      for(Index j=j2; j<jend; j+=1)
-        c0 += cj.pmul(lhs(i,j), rhs(j,0));
-      res[i] += alpha*c0;
+      for (Index j = j2; j < jend; j += 1) c0 += cj.pmul(lhs(i, j), rhs(j, 0));
+      res[i] += alpha * c0;
     }
   }
 }
@@ -297,12 +268,13 @@
  *  - alpha is always a complex (or converted to a complex)
  *  - no vectorization
  */
-template<typename Index, typename LhsScalar, typename LhsMapper, bool ConjugateLhs, typename RhsScalar, typename RhsMapper, bool ConjugateRhs, int Version>
-struct general_matrix_vector_product<Index,LhsScalar,LhsMapper,RowMajor,ConjugateLhs,RhsScalar,RhsMapper,ConjugateRhs,Version>
-{
-  typedef gemv_traits<LhsScalar,RhsScalar> Traits;
-  typedef gemv_traits<LhsScalar,RhsScalar,GEMVPacketHalf> HalfTraits;
-  typedef gemv_traits<LhsScalar,RhsScalar,GEMVPacketQuarter> QuarterTraits;
+template <typename Index, typename LhsScalar, typename LhsMapper, bool ConjugateLhs, typename RhsScalar,
+          typename RhsMapper, bool ConjugateRhs, int Version>
+struct general_matrix_vector_product<Index, LhsScalar, LhsMapper, RowMajor, ConjugateLhs, RhsScalar, RhsMapper,
+                                     ConjugateRhs, Version> {
+  typedef gemv_traits<LhsScalar, RhsScalar> Traits;
+  typedef gemv_traits<LhsScalar, RhsScalar, GEMVPacketHalf> HalfTraits;
+  typedef gemv_traits<LhsScalar, RhsScalar, GEMVPacketQuarter> QuarterTraits;
 
   typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar>::ReturnType ResScalar;
 
@@ -318,48 +290,44 @@
   typedef typename QuarterTraits::RhsPacket RhsPacketQuarter;
   typedef typename QuarterTraits::ResPacket ResPacketQuarter;
 
-EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE static void run(
-  Index rows, Index cols,
-  const LhsMapper& lhs,
-  const RhsMapper& rhs,
-        ResScalar* res, Index resIncr,
-  ResScalar alpha);
+  EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE static void run(Index rows, Index cols, const LhsMapper& lhs,
+                                                      const RhsMapper& rhs, ResScalar* res, Index resIncr,
+                                                      ResScalar alpha);
 };
 
-template<typename Index, typename LhsScalar, typename LhsMapper, bool ConjugateLhs, typename RhsScalar, typename RhsMapper, bool ConjugateRhs, int Version>
-EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE void general_matrix_vector_product<Index,LhsScalar,LhsMapper,RowMajor,ConjugateLhs,RhsScalar,RhsMapper,ConjugateRhs,Version>::run(
-  Index rows, Index cols,
-  const LhsMapper& alhs,
-  const RhsMapper& rhs,
-  ResScalar* res, Index resIncr,
-  ResScalar alpha)
-{
+template <typename Index, typename LhsScalar, typename LhsMapper, bool ConjugateLhs, typename RhsScalar,
+          typename RhsMapper, bool ConjugateRhs, int Version>
+EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE void
+general_matrix_vector_product<Index, LhsScalar, LhsMapper, RowMajor, ConjugateLhs, RhsScalar, RhsMapper, ConjugateRhs,
+                              Version>::run(Index rows, Index cols, const LhsMapper& alhs, const RhsMapper& rhs,
+                                            ResScalar* res, Index resIncr, ResScalar alpha) {
   // The following copy tells the compiler that lhs's attributes are not modified outside this function
   // This helps GCC to generate propoer code.
   LhsMapper lhs(alhs);
 
-  eigen_internal_assert(rhs.stride()==1);
-  conj_helper<LhsScalar,RhsScalar,ConjugateLhs,ConjugateRhs> cj;
-  conj_helper<LhsPacket,RhsPacket,ConjugateLhs,ConjugateRhs> pcj;
-  conj_helper<LhsPacketHalf,RhsPacketHalf,ConjugateLhs,ConjugateRhs> pcj_half;
-  conj_helper<LhsPacketQuarter,RhsPacketQuarter,ConjugateLhs,ConjugateRhs> pcj_quarter;
+  eigen_internal_assert(rhs.stride() == 1);
+  conj_helper<LhsScalar, RhsScalar, ConjugateLhs, ConjugateRhs> cj;
+  conj_helper<LhsPacket, RhsPacket, ConjugateLhs, ConjugateRhs> pcj;
+  conj_helper<LhsPacketHalf, RhsPacketHalf, ConjugateLhs, ConjugateRhs> pcj_half;
+  conj_helper<LhsPacketQuarter, RhsPacketQuarter, ConjugateLhs, ConjugateRhs> pcj_quarter;
 
   // TODO: fine tune the following heuristic. The rationale is that if the matrix is very large,
   //       processing 8 rows at once might be counter productive wrt cache.
-  const Index n8 = lhs.stride()*sizeof(LhsScalar)>32000 ? 0 : rows-7;
-  const Index n4 = rows-3;
-  const Index n2 = rows-1;
+  const Index n8 = lhs.stride() * sizeof(LhsScalar) > 32000 ? 0 : rows - 7;
+  const Index n4 = rows - 3;
+  const Index n2 = rows - 1;
 
   // TODO: for padded aligned inputs, we could enable aligned reads
-  enum { LhsAlignment = Unaligned,
-         ResPacketSize = Traits::ResPacketSize,
-         ResPacketSizeHalf = HalfTraits::ResPacketSize,
-         ResPacketSizeQuarter = QuarterTraits::ResPacketSize,
-         LhsPacketSize = Traits::LhsPacketSize,
-         LhsPacketSizeHalf = HalfTraits::LhsPacketSize,
-         LhsPacketSizeQuarter = QuarterTraits::LhsPacketSize,
-         HasHalf = (int)ResPacketSizeHalf < (int)ResPacketSize,
-         HasQuarter = (int)ResPacketSizeQuarter < (int)ResPacketSizeHalf
+  enum {
+    LhsAlignment = Unaligned,
+    ResPacketSize = Traits::ResPacketSize,
+    ResPacketSizeHalf = HalfTraits::ResPacketSize,
+    ResPacketSizeQuarter = QuarterTraits::ResPacketSize,
+    LhsPacketSize = Traits::LhsPacketSize,
+    LhsPacketSizeHalf = HalfTraits::LhsPacketSize,
+    LhsPacketSizeQuarter = QuarterTraits::LhsPacketSize,
+    HasHalf = (int)ResPacketSizeHalf < (int)ResPacketSize,
+    HasQuarter = (int)ResPacketSizeQuarter < (int)ResPacketSizeHalf
   };
 
   using UnsignedIndex = typename make_unsigned<Index>::type;
@@ -367,30 +335,24 @@
   const Index halfColBlockEnd = LhsPacketSizeHalf * (UnsignedIndex(cols) / LhsPacketSizeHalf);
   const Index quarterColBlockEnd = LhsPacketSizeQuarter * (UnsignedIndex(cols) / LhsPacketSizeQuarter);
 
-  Index i=0;
-  for(; i<n8; i+=8)
-  {
-    ResPacket c0 = pset1<ResPacket>(ResScalar(0)),
-              c1 = pset1<ResPacket>(ResScalar(0)),
-              c2 = pset1<ResPacket>(ResScalar(0)),
-              c3 = pset1<ResPacket>(ResScalar(0)),
-              c4 = pset1<ResPacket>(ResScalar(0)),
-              c5 = pset1<ResPacket>(ResScalar(0)),
-              c6 = pset1<ResPacket>(ResScalar(0)),
-              c7 = pset1<ResPacket>(ResScalar(0));
+  Index i = 0;
+  for (; i < n8; i += 8) {
+    ResPacket c0 = pset1<ResPacket>(ResScalar(0)), c1 = pset1<ResPacket>(ResScalar(0)),
+              c2 = pset1<ResPacket>(ResScalar(0)), c3 = pset1<ResPacket>(ResScalar(0)),
+              c4 = pset1<ResPacket>(ResScalar(0)), c5 = pset1<ResPacket>(ResScalar(0)),
+              c6 = pset1<ResPacket>(ResScalar(0)), c7 = pset1<ResPacket>(ResScalar(0));
 
-    for (Index j = 0; j < fullColBlockEnd; j += LhsPacketSize)
-    {
-      RhsPacket b0 = rhs.template load<RhsPacket, Unaligned>(j,0);
+    for (Index j = 0; j < fullColBlockEnd; j += LhsPacketSize) {
+      RhsPacket b0 = rhs.template load<RhsPacket, Unaligned>(j, 0);
 
-      c0 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+0,j),b0,c0);
-      c1 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+1,j),b0,c1);
-      c2 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+2,j),b0,c2);
-      c3 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+3,j),b0,c3);
-      c4 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+4,j),b0,c4);
-      c5 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+5,j),b0,c5);
-      c6 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+6,j),b0,c6);
-      c7 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+7,j),b0,c7);
+      c0 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + 0, j), b0, c0);
+      c1 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + 1, j), b0, c1);
+      c2 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + 2, j), b0, c2);
+      c3 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + 3, j), b0, c3);
+      c4 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + 4, j), b0, c4);
+      c5 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + 5, j), b0, c5);
+      c6 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + 6, j), b0, c6);
+      c7 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + 7, j), b0, c7);
     }
     ResScalar cc0 = predux(c0);
     ResScalar cc1 = predux(c1);
@@ -401,126 +363,111 @@
     ResScalar cc6 = predux(c6);
     ResScalar cc7 = predux(c7);
 
-    for (Index j = fullColBlockEnd; j < cols; ++j)
-    {
-      RhsScalar b0 = rhs(j,0);
+    for (Index j = fullColBlockEnd; j < cols; ++j) {
+      RhsScalar b0 = rhs(j, 0);
 
-      cc0 += cj.pmul(lhs(i+0,j), b0);
-      cc1 += cj.pmul(lhs(i+1,j), b0);
-      cc2 += cj.pmul(lhs(i+2,j), b0);
-      cc3 += cj.pmul(lhs(i+3,j), b0);
-      cc4 += cj.pmul(lhs(i+4,j), b0);
-      cc5 += cj.pmul(lhs(i+5,j), b0);
-      cc6 += cj.pmul(lhs(i+6,j), b0);
-      cc7 += cj.pmul(lhs(i+7,j), b0);
+      cc0 += cj.pmul(lhs(i + 0, j), b0);
+      cc1 += cj.pmul(lhs(i + 1, j), b0);
+      cc2 += cj.pmul(lhs(i + 2, j), b0);
+      cc3 += cj.pmul(lhs(i + 3, j), b0);
+      cc4 += cj.pmul(lhs(i + 4, j), b0);
+      cc5 += cj.pmul(lhs(i + 5, j), b0);
+      cc6 += cj.pmul(lhs(i + 6, j), b0);
+      cc7 += cj.pmul(lhs(i + 7, j), b0);
     }
-    res[(i+0)*resIncr] += alpha*cc0;
-    res[(i+1)*resIncr] += alpha*cc1;
-    res[(i+2)*resIncr] += alpha*cc2;
-    res[(i+3)*resIncr] += alpha*cc3;
-    res[(i+4)*resIncr] += alpha*cc4;
-    res[(i+5)*resIncr] += alpha*cc5;
-    res[(i+6)*resIncr] += alpha*cc6;
-    res[(i+7)*resIncr] += alpha*cc7;
+    res[(i + 0) * resIncr] += alpha * cc0;
+    res[(i + 1) * resIncr] += alpha * cc1;
+    res[(i + 2) * resIncr] += alpha * cc2;
+    res[(i + 3) * resIncr] += alpha * cc3;
+    res[(i + 4) * resIncr] += alpha * cc4;
+    res[(i + 5) * resIncr] += alpha * cc5;
+    res[(i + 6) * resIncr] += alpha * cc6;
+    res[(i + 7) * resIncr] += alpha * cc7;
   }
-  for(; i<n4; i+=4)
-  {
-    ResPacket c0 = pset1<ResPacket>(ResScalar(0)),
-              c1 = pset1<ResPacket>(ResScalar(0)),
-              c2 = pset1<ResPacket>(ResScalar(0)),
-              c3 = pset1<ResPacket>(ResScalar(0));
+  for (; i < n4; i += 4) {
+    ResPacket c0 = pset1<ResPacket>(ResScalar(0)), c1 = pset1<ResPacket>(ResScalar(0)),
+              c2 = pset1<ResPacket>(ResScalar(0)), c3 = pset1<ResPacket>(ResScalar(0));
 
-    for (Index j = 0; j < fullColBlockEnd; j += LhsPacketSize)
-    {
-      RhsPacket b0 = rhs.template load<RhsPacket, Unaligned>(j,0);
+    for (Index j = 0; j < fullColBlockEnd; j += LhsPacketSize) {
+      RhsPacket b0 = rhs.template load<RhsPacket, Unaligned>(j, 0);
 
-      c0 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+0,j),b0,c0);
-      c1 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+1,j),b0,c1);
-      c2 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+2,j),b0,c2);
-      c3 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+3,j),b0,c3);
+      c0 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + 0, j), b0, c0);
+      c1 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + 1, j), b0, c1);
+      c2 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + 2, j), b0, c2);
+      c3 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + 3, j), b0, c3);
     }
     ResScalar cc0 = predux(c0);
     ResScalar cc1 = predux(c1);
     ResScalar cc2 = predux(c2);
     ResScalar cc3 = predux(c3);
 
-    for(Index j = fullColBlockEnd; j < cols; ++j)
-    {
-      RhsScalar b0 = rhs(j,0);
+    for (Index j = fullColBlockEnd; j < cols; ++j) {
+      RhsScalar b0 = rhs(j, 0);
 
-      cc0 += cj.pmul(lhs(i+0,j), b0);
-      cc1 += cj.pmul(lhs(i+1,j), b0);
-      cc2 += cj.pmul(lhs(i+2,j), b0);
-      cc3 += cj.pmul(lhs(i+3,j), b0);
+      cc0 += cj.pmul(lhs(i + 0, j), b0);
+      cc1 += cj.pmul(lhs(i + 1, j), b0);
+      cc2 += cj.pmul(lhs(i + 2, j), b0);
+      cc3 += cj.pmul(lhs(i + 3, j), b0);
     }
-    res[(i+0)*resIncr] += alpha*cc0;
-    res[(i+1)*resIncr] += alpha*cc1;
-    res[(i+2)*resIncr] += alpha*cc2;
-    res[(i+3)*resIncr] += alpha*cc3;
+    res[(i + 0) * resIncr] += alpha * cc0;
+    res[(i + 1) * resIncr] += alpha * cc1;
+    res[(i + 2) * resIncr] += alpha * cc2;
+    res[(i + 3) * resIncr] += alpha * cc3;
   }
-  for(; i<n2; i+=2)
-  {
-    ResPacket c0 = pset1<ResPacket>(ResScalar(0)),
-              c1 = pset1<ResPacket>(ResScalar(0));
+  for (; i < n2; i += 2) {
+    ResPacket c0 = pset1<ResPacket>(ResScalar(0)), c1 = pset1<ResPacket>(ResScalar(0));
 
-    for (Index j = 0; j < fullColBlockEnd; j += LhsPacketSize)
-    {
-      RhsPacket b0 = rhs.template load<RhsPacket, Unaligned>(j,0);
+    for (Index j = 0; j < fullColBlockEnd; j += LhsPacketSize) {
+      RhsPacket b0 = rhs.template load<RhsPacket, Unaligned>(j, 0);
 
-      c0 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+0,j),b0,c0);
-      c1 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i+1,j),b0,c1);
+      c0 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + 0, j), b0, c0);
+      c1 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i + 1, j), b0, c1);
     }
     ResScalar cc0 = predux(c0);
     ResScalar cc1 = predux(c1);
 
-    for(Index j = fullColBlockEnd; j < cols; ++j)
-    {
-      RhsScalar b0 = rhs(j,0);
+    for (Index j = fullColBlockEnd; j < cols; ++j) {
+      RhsScalar b0 = rhs(j, 0);
 
-      cc0 += cj.pmul(lhs(i+0,j), b0);
-      cc1 += cj.pmul(lhs(i+1,j), b0);
+      cc0 += cj.pmul(lhs(i + 0, j), b0);
+      cc1 += cj.pmul(lhs(i + 1, j), b0);
     }
-    res[(i+0)*resIncr] += alpha*cc0;
-    res[(i+1)*resIncr] += alpha*cc1;
+    res[(i + 0) * resIncr] += alpha * cc0;
+    res[(i + 1) * resIncr] += alpha * cc1;
   }
-  for(; i<rows; ++i)
-  {
+  for (; i < rows; ++i) {
     ResPacket c0 = pset1<ResPacket>(ResScalar(0));
     ResPacketHalf c0_h = pset1<ResPacketHalf>(ResScalar(0));
     ResPacketQuarter c0_q = pset1<ResPacketQuarter>(ResScalar(0));
 
-    for (Index j = 0; j < fullColBlockEnd; j += LhsPacketSize)
-    {
-      RhsPacket b0 = rhs.template load<RhsPacket,Unaligned>(j,0);
-      c0 = pcj.pmadd(lhs.template load<LhsPacket,LhsAlignment>(i,j),b0,c0);
+    for (Index j = 0; j < fullColBlockEnd; j += LhsPacketSize) {
+      RhsPacket b0 = rhs.template load<RhsPacket, Unaligned>(j, 0);
+      c0 = pcj.pmadd(lhs.template load<LhsPacket, LhsAlignment>(i, j), b0, c0);
     }
     ResScalar cc0 = predux(c0);
     if (HasHalf) {
-      for (Index j = fullColBlockEnd; j < halfColBlockEnd; j += LhsPacketSizeHalf)
-        {
-          RhsPacketHalf b0 = rhs.template load<RhsPacketHalf,Unaligned>(j,0);
-          c0_h = pcj_half.pmadd(lhs.template load<LhsPacketHalf,LhsAlignment>(i,j),b0,c0_h);
-        }
+      for (Index j = fullColBlockEnd; j < halfColBlockEnd; j += LhsPacketSizeHalf) {
+        RhsPacketHalf b0 = rhs.template load<RhsPacketHalf, Unaligned>(j, 0);
+        c0_h = pcj_half.pmadd(lhs.template load<LhsPacketHalf, LhsAlignment>(i, j), b0, c0_h);
+      }
       cc0 += predux(c0_h);
     }
     if (HasQuarter) {
-      for (Index j = halfColBlockEnd; j < quarterColBlockEnd; j += LhsPacketSizeQuarter)
-        {
-          RhsPacketQuarter b0 = rhs.template load<RhsPacketQuarter,Unaligned>(j,0);
-          c0_q = pcj_quarter.pmadd(lhs.template load<LhsPacketQuarter,LhsAlignment>(i,j),b0,c0_q);
-        }
+      for (Index j = halfColBlockEnd; j < quarterColBlockEnd; j += LhsPacketSizeQuarter) {
+        RhsPacketQuarter b0 = rhs.template load<RhsPacketQuarter, Unaligned>(j, 0);
+        c0_q = pcj_quarter.pmadd(lhs.template load<LhsPacketQuarter, LhsAlignment>(i, j), b0, c0_q);
+      }
       cc0 += predux(c0_q);
     }
-    for (Index j = quarterColBlockEnd; j < cols; ++j)
-    {
-      cc0 += cj.pmul(lhs(i,j), rhs(j,0));
+    for (Index j = quarterColBlockEnd; j < cols; ++j) {
+      cc0 += cj.pmul(lhs(i, j), rhs(j, 0));
     }
-    res[i*resIncr] += alpha*cc0;
+    res[i * resIncr] += alpha * cc0;
   }
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_GENERAL_MATRIX_VECTOR_H
+#endif  // EIGEN_GENERAL_MATRIX_VECTOR_H
diff --git a/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h b/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h
index 40fef1b..556c6ac 100644
--- a/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h
+++ b/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h
@@ -36,104 +36,102 @@
 // IWYU pragma: private
 #include "../InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
 /**********************************************************************
-* This file implements general matrix-vector multiplication using BLAS
-* gemv function via partial specialization of
-* general_matrix_vector_product::run(..) method for float, double,
-* std::complex<float> and std::complex<double> types
-**********************************************************************/
+ * This file implements general matrix-vector multiplication using BLAS
+ * gemv function via partial specialization of
+ * general_matrix_vector_product::run(..) method for float, double,
+ * std::complex<float> and std::complex<double> types
+ **********************************************************************/
 
 // gemv specialization
 
-template<typename Index, typename LhsScalar, int StorageOrder, bool ConjugateLhs, typename RhsScalar, bool ConjugateRhs>
+template <typename Index, typename LhsScalar, int StorageOrder, bool ConjugateLhs, typename RhsScalar,
+          bool ConjugateRhs>
 struct general_matrix_vector_product_gemv;
 
-#define EIGEN_BLAS_GEMV_SPECIALIZE(Scalar) \
-template<typename Index, bool ConjugateLhs, bool ConjugateRhs> \
-struct general_matrix_vector_product<Index,Scalar,const_blas_data_mapper<Scalar,Index,ColMajor>,ColMajor,ConjugateLhs,Scalar,const_blas_data_mapper<Scalar,Index,RowMajor>,ConjugateRhs,Specialized> { \
-static void run( \
-  Index rows, Index cols, \
-  const const_blas_data_mapper<Scalar,Index,ColMajor> &lhs, \
-  const const_blas_data_mapper<Scalar,Index,RowMajor> &rhs, \
-  Scalar* res, Index resIncr, Scalar alpha) \
-{ \
-  if (ConjugateLhs) { \
-    general_matrix_vector_product<Index,Scalar,const_blas_data_mapper<Scalar,Index,ColMajor>,ColMajor,ConjugateLhs,Scalar,const_blas_data_mapper<Scalar,Index,RowMajor>,ConjugateRhs,BuiltIn>::run( \
-      rows, cols, lhs, rhs, res, resIncr, alpha); \
-  } else { \
-    general_matrix_vector_product_gemv<Index,Scalar,ColMajor,ConjugateLhs,Scalar,ConjugateRhs>::run( \
-      rows, cols, lhs.data(), lhs.stride(), rhs.data(), rhs.stride(), res, resIncr, alpha); \
-  } \
-} \
-}; \
-template<typename Index, bool ConjugateLhs, bool ConjugateRhs> \
-struct general_matrix_vector_product<Index,Scalar,const_blas_data_mapper<Scalar,Index,RowMajor>,RowMajor,ConjugateLhs,Scalar,const_blas_data_mapper<Scalar,Index,ColMajor>,ConjugateRhs,Specialized> { \
-static void run( \
-  Index rows, Index cols, \
-  const const_blas_data_mapper<Scalar,Index,RowMajor> &lhs, \
-  const const_blas_data_mapper<Scalar,Index,ColMajor> &rhs, \
-  Scalar* res, Index resIncr, Scalar alpha) \
-{ \
-    general_matrix_vector_product_gemv<Index,Scalar,RowMajor,ConjugateLhs,Scalar,ConjugateRhs>::run( \
-      rows, cols, lhs.data(), lhs.stride(), rhs.data(), rhs.stride(), res, resIncr, alpha); \
-} \
-}; \
+#define EIGEN_BLAS_GEMV_SPECIALIZE(Scalar)                                                                       \
+  template <typename Index, bool ConjugateLhs, bool ConjugateRhs>                                                \
+  struct general_matrix_vector_product<Index, Scalar, const_blas_data_mapper<Scalar, Index, ColMajor>, ColMajor, \
+                                       ConjugateLhs, Scalar, const_blas_data_mapper<Scalar, Index, RowMajor>,    \
+                                       ConjugateRhs, Specialized> {                                              \
+    static void run(Index rows, Index cols, const const_blas_data_mapper<Scalar, Index, ColMajor>& lhs,          \
+                    const const_blas_data_mapper<Scalar, Index, RowMajor>& rhs, Scalar* res, Index resIncr,      \
+                    Scalar alpha) {                                                                              \
+      if (ConjugateLhs) {                                                                                        \
+        general_matrix_vector_product<Index, Scalar, const_blas_data_mapper<Scalar, Index, ColMajor>, ColMajor,  \
+                                      ConjugateLhs, Scalar, const_blas_data_mapper<Scalar, Index, RowMajor>,     \
+                                      ConjugateRhs, BuiltIn>::run(rows, cols, lhs, rhs, res, resIncr, alpha);    \
+      } else {                                                                                                   \
+        general_matrix_vector_product_gemv<Index, Scalar, ColMajor, ConjugateLhs, Scalar, ConjugateRhs>::run(    \
+            rows, cols, lhs.data(), lhs.stride(), rhs.data(), rhs.stride(), res, resIncr, alpha);                \
+      }                                                                                                          \
+    }                                                                                                            \
+  };                                                                                                             \
+  template <typename Index, bool ConjugateLhs, bool ConjugateRhs>                                                \
+  struct general_matrix_vector_product<Index, Scalar, const_blas_data_mapper<Scalar, Index, RowMajor>, RowMajor, \
+                                       ConjugateLhs, Scalar, const_blas_data_mapper<Scalar, Index, ColMajor>,    \
+                                       ConjugateRhs, Specialized> {                                              \
+    static void run(Index rows, Index cols, const const_blas_data_mapper<Scalar, Index, RowMajor>& lhs,          \
+                    const const_blas_data_mapper<Scalar, Index, ColMajor>& rhs, Scalar* res, Index resIncr,      \
+                    Scalar alpha) {                                                                              \
+      general_matrix_vector_product_gemv<Index, Scalar, RowMajor, ConjugateLhs, Scalar, ConjugateRhs>::run(      \
+          rows, cols, lhs.data(), lhs.stride(), rhs.data(), rhs.stride(), res, resIncr, alpha);                  \
+    }                                                                                                            \
+  };
 
 EIGEN_BLAS_GEMV_SPECIALIZE(double)
 EIGEN_BLAS_GEMV_SPECIALIZE(float)
 EIGEN_BLAS_GEMV_SPECIALIZE(dcomplex)
 EIGEN_BLAS_GEMV_SPECIALIZE(scomplex)
 
-#define EIGEN_BLAS_GEMV_SPECIALIZATION(EIGTYPE,BLASTYPE,BLASFUNC) \
-template<typename Index, int LhsStorageOrder, bool ConjugateLhs, bool ConjugateRhs> \
-struct general_matrix_vector_product_gemv<Index,EIGTYPE,LhsStorageOrder,ConjugateLhs,EIGTYPE,ConjugateRhs> \
-{ \
-typedef Matrix<EIGTYPE,Dynamic,1,ColMajor> GEMVVector;\
-\
-static void run( \
-  Index rows, Index cols, \
-  const EIGTYPE* lhs, Index lhsStride, \
-  const EIGTYPE* rhs, Index rhsIncr, \
-  EIGTYPE* res, Index resIncr, EIGTYPE alpha) \
-{ \
-  BlasIndex m=convert_index<BlasIndex>(rows), n=convert_index<BlasIndex>(cols), \
-            lda=convert_index<BlasIndex>(lhsStride), incx=convert_index<BlasIndex>(rhsIncr), incy=convert_index<BlasIndex>(resIncr); \
-  const EIGTYPE beta(1); \
-  const EIGTYPE *x_ptr; \
-  char trans=(LhsStorageOrder==ColMajor) ? 'N' : (ConjugateLhs) ? 'C' : 'T'; \
-  if (LhsStorageOrder==RowMajor) { \
-    m = convert_index<BlasIndex>(cols); \
-    n = convert_index<BlasIndex>(rows); \
-  }\
-  GEMVVector x_tmp; \
-  if (ConjugateRhs) { \
-    Map<const GEMVVector, 0, InnerStride<> > map_x(rhs,cols,1,InnerStride<>(incx)); \
-    x_tmp=map_x.conjugate(); \
-    x_ptr=x_tmp.data(); \
-    incx=1; \
-  } else x_ptr=rhs; \
-  BLASFUNC(&trans, &m, &n, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)lhs, &lda, (const BLASTYPE*)x_ptr, &incx, (const BLASTYPE*)&numext::real_ref(beta), (BLASTYPE*)res, &incy); \
-}\
-};
+#define EIGEN_BLAS_GEMV_SPECIALIZATION(EIGTYPE, BLASTYPE, BLASFUNC)                                                 \
+  template <typename Index, int LhsStorageOrder, bool ConjugateLhs, bool ConjugateRhs>                              \
+  struct general_matrix_vector_product_gemv<Index, EIGTYPE, LhsStorageOrder, ConjugateLhs, EIGTYPE, ConjugateRhs> { \
+    typedef Matrix<EIGTYPE, Dynamic, 1, ColMajor> GEMVVector;                                                       \
+                                                                                                                    \
+    static void run(Index rows, Index cols, const EIGTYPE* lhs, Index lhsStride, const EIGTYPE* rhs, Index rhsIncr, \
+                    EIGTYPE* res, Index resIncr, EIGTYPE alpha) {                                                   \
+      BlasIndex m = convert_index<BlasIndex>(rows), n = convert_index<BlasIndex>(cols),                             \
+                lda = convert_index<BlasIndex>(lhsStride), incx = convert_index<BlasIndex>(rhsIncr),                \
+                incy = convert_index<BlasIndex>(resIncr);                                                           \
+      const EIGTYPE beta(1);                                                                                        \
+      const EIGTYPE* x_ptr;                                                                                         \
+      char trans = (LhsStorageOrder == ColMajor) ? 'N' : (ConjugateLhs) ? 'C' : 'T';                                \
+      if (LhsStorageOrder == RowMajor) {                                                                            \
+        m = convert_index<BlasIndex>(cols);                                                                         \
+        n = convert_index<BlasIndex>(rows);                                                                         \
+      }                                                                                                             \
+      GEMVVector x_tmp;                                                                                             \
+      if (ConjugateRhs) {                                                                                           \
+        Map<const GEMVVector, 0, InnerStride<> > map_x(rhs, cols, 1, InnerStride<>(incx));                          \
+        x_tmp = map_x.conjugate();                                                                                  \
+        x_ptr = x_tmp.data();                                                                                       \
+        incx = 1;                                                                                                   \
+      } else                                                                                                        \
+        x_ptr = rhs;                                                                                                \
+      BLASFUNC(&trans, &m, &n, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)lhs, &lda,               \
+               (const BLASTYPE*)x_ptr, &incx, (const BLASTYPE*)&numext::real_ref(beta), (BLASTYPE*)res, &incy);     \
+    }                                                                                                               \
+  };
 
 #ifdef EIGEN_USE_MKL
-EIGEN_BLAS_GEMV_SPECIALIZATION(double,   double, dgemv)
-EIGEN_BLAS_GEMV_SPECIALIZATION(float,    float,  sgemv)
+EIGEN_BLAS_GEMV_SPECIALIZATION(double, double, dgemv)
+EIGEN_BLAS_GEMV_SPECIALIZATION(float, float, sgemv)
 EIGEN_BLAS_GEMV_SPECIALIZATION(dcomplex, MKL_Complex16, zgemv)
-EIGEN_BLAS_GEMV_SPECIALIZATION(scomplex, MKL_Complex8 , cgemv)
+EIGEN_BLAS_GEMV_SPECIALIZATION(scomplex, MKL_Complex8, cgemv)
 #else
-EIGEN_BLAS_GEMV_SPECIALIZATION(double,   double, dgemv_)
-EIGEN_BLAS_GEMV_SPECIALIZATION(float,    float,  sgemv_)
+EIGEN_BLAS_GEMV_SPECIALIZATION(double, double, dgemv_)
+EIGEN_BLAS_GEMV_SPECIALIZATION(float, float, sgemv_)
 EIGEN_BLAS_GEMV_SPECIALIZATION(dcomplex, double, zgemv_)
-EIGEN_BLAS_GEMV_SPECIALIZATION(scomplex, float,  cgemv_)
+EIGEN_BLAS_GEMV_SPECIALIZATION(scomplex, float, cgemv_)
 #endif
 
-} // end namespase internal
+}  // namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_GENERAL_MATRIX_VECTOR_BLAS_H
+#endif  // EIGEN_GENERAL_MATRIX_VECTOR_BLAS_H
diff --git a/Eigen/src/Core/products/Parallelizer.h b/Eigen/src/Core/products/Parallelizer.h
index 3e76827..667fea2 100644
--- a/Eigen/src/Core/products/Parallelizer.h
+++ b/Eigen/src/Core/products/Parallelizer.h
@@ -41,7 +41,7 @@
 namespace Eigen {
 
 namespace internal {
-   inline void manage_multi_threading(Action action, int* v);
+inline void manage_multi_threading(Action action, int* v);
 }
 
 // Public APIs.
@@ -50,20 +50,16 @@
 EIGEN_DEPRECATED inline void initParallel() {}
 
 /** \returns the max number of threads reserved for Eigen
-  * \sa setNbThreads */
-inline int nbThreads()
-{
+ * \sa setNbThreads */
+inline int nbThreads() {
   int ret;
   internal::manage_multi_threading(GetAction, &ret);
   return ret;
 }
 
 /** Sets the max number of threads reserved for Eigen
-  * \sa nbThreads */
-inline void setNbThreads(int v)
-{
-  internal::manage_multi_threading(SetAction, &v);
-}
+ * \sa nbThreads */
+inline void setNbThreads(int v) { internal::manage_multi_threading(SetAction, &v); }
 
 #ifdef EIGEN_GEMM_THREADPOOL
 // Sets the ThreadPool used by Eigen parallel Gemm.
@@ -87,12 +83,9 @@
 }
 
 // Gets the ThreadPool used by Eigen parallel Gemm.
-inline ThreadPool* getGemmThreadPool() {
-  return setGemmThreadPool(nullptr);
-}
+inline ThreadPool* getGemmThreadPool() { return setGemmThreadPool(nullptr); }
 #endif
 
-
 namespace internal {
 
 // Implementation.
@@ -109,16 +102,18 @@
     eigen_internal_assert(false);
   }
 }
-template<typename Index> struct GemmParallelInfo {};
+template <typename Index>
+struct GemmParallelInfo {};
 template <bool Condition, typename Functor, typename Index>
-EIGEN_STRONG_INLINE void parallelize_gemm(const Functor& func, Index rows, Index cols,
-                                          Index /*unused*/, bool /*unused*/) {
-  func(0,rows, 0,cols);
+EIGEN_STRONG_INLINE void parallelize_gemm(const Functor& func, Index rows, Index cols, Index /*unused*/,
+                                          bool /*unused*/) {
+  func(0, rows, 0, cols);
 }
 
 #else
 
-template<typename Index> struct GemmParallelTaskInfo {
+template <typename Index>
+struct GemmParallelTaskInfo {
   GemmParallelTaskInfo() : sync(-1), users(0), lhs_start(0), lhs_length(0) {}
   std::atomic<Index> sync;
   std::atomic<int> users;
@@ -126,16 +121,14 @@
   Index lhs_length;
 };
 
-template<typename Index> struct GemmParallelInfo {
+template <typename Index>
+struct GemmParallelInfo {
   const int logical_thread_id;
   const int num_threads;
   GemmParallelTaskInfo<Index>* task_info;
 
-  GemmParallelInfo(int logical_thread_id_, int num_threads_,
-                   GemmParallelTaskInfo<Index>* task_info_)
-      : logical_thread_id(logical_thread_id_),
-        num_threads(num_threads_),
-        task_info(task_info_) {}
+  GemmParallelInfo(int logical_thread_id_, int num_threads_, GemmParallelTaskInfo<Index>* task_info_)
+      : logical_thread_id(logical_thread_id_), num_threads(num_threads_), task_info(task_info_) {}
 };
 
 inline void manage_multi_threading(Action action, int* v) {
@@ -167,8 +160,7 @@
 }
 
 template <bool Condition, typename Functor, typename Index>
-EIGEN_STRONG_INLINE void parallelize_gemm(const Functor& func, Index rows, Index cols,
-                                          Index depth, bool transpose) {
+EIGEN_STRONG_INLINE void parallelize_gemm(const Functor& func, Index rows, Index cols, Index depth, bool transpose) {
   // Dynamically check whether we should even try to execute in parallel.
   // The conditions are:
   // - the max number of threads we can create is greater than 1
@@ -176,22 +168,22 @@
   // - the sizes are large enough
 
   // compute the maximal number of threads from the size of the product:
-  // This first heuristic takes into account that the product kernel is fully optimized when working with nr columns at once.
+  // This first heuristic takes into account that the product kernel is fully optimized when working with nr columns at
+  // once.
   Index size = transpose ? rows : cols;
-  Index pb_max_threads = std::max<Index>(1,size / Functor::Traits::nr);
+  Index pb_max_threads = std::max<Index>(1, size / Functor::Traits::nr);
 
   // compute the maximal number of threads from the total amount of work:
-  double work = static_cast<double>(rows) * static_cast<double>(cols) *
-      static_cast<double>(depth);
+  double work = static_cast<double>(rows) * static_cast<double>(cols) * static_cast<double>(depth);
   double kMinTaskSize = 50000;  // FIXME improve this heuristic.
-  pb_max_threads = std::max<Index>(1, std::min<Index>(pb_max_threads, static_cast<Index>( work / kMinTaskSize ) ));
+  pb_max_threads = std::max<Index>(1, std::min<Index>(pb_max_threads, static_cast<Index>(work / kMinTaskSize)));
 
   // compute the number of threads we are going to use
   int threads = std::min<int>(nbThreads(), static_cast<int>(pb_max_threads));
 
   // if multi-threading is explicitly disabled, not useful, or if we already are
   // inside a parallel session, then abort multi-threading
-  bool dont_parallelize = (!Condition) || (threads<=1);
+  bool dont_parallelize = (!Condition) || (threads <= 1);
 #if defined(EIGEN_HAS_OPENMP)
   // don't parallelize if we are executing in a parallel context already.
   dont_parallelize |= omp_get_num_threads() > 1;
@@ -203,19 +195,16 @@
   ThreadPool* pool = getGemmThreadPool();
   dont_parallelize |= (pool == nullptr || pool->CurrentThreadId() != -1);
 #endif
-  if (dont_parallelize)
-    return func(0,rows, 0,cols);
+  if (dont_parallelize) return func(0, rows, 0, cols);
 
   func.initParallelSession(threads);
 
-  if(transpose)
-    std::swap(rows,cols);
+  if (transpose) std::swap(rows, cols);
 
-  ei_declare_aligned_stack_constructed_variable(GemmParallelTaskInfo<Index>,task_info,threads,0);
-
+  ei_declare_aligned_stack_constructed_variable(GemmParallelTaskInfo<Index>, task_info, threads, 0);
 
 #if defined(EIGEN_HAS_OPENMP)
-  #pragma omp parallel num_threads(threads)
+#pragma omp parallel num_threads(threads)
   {
     Index i = omp_get_thread_num();
     // Note that the actual number of threads might be lower than the number of
@@ -225,50 +214,53 @@
 
     Index blockCols = (cols / actual_threads) & ~Index(0x3);
     Index blockRows = (rows / actual_threads);
-    blockRows = (blockRows/Functor::Traits::mr)*Functor::Traits::mr;
+    blockRows = (blockRows / Functor::Traits::mr) * Functor::Traits::mr;
 
-    Index r0 = i*blockRows;
-    Index actualBlockRows = (i+1==actual_threads) ? rows-r0 : blockRows;
+    Index r0 = i * blockRows;
+    Index actualBlockRows = (i + 1 == actual_threads) ? rows - r0 : blockRows;
 
-    Index c0 = i*blockCols;
-    Index actualBlockCols = (i+1==actual_threads) ? cols-c0 : blockCols;
+    Index c0 = i * blockCols;
+    Index actualBlockCols = (i + 1 == actual_threads) ? cols - c0 : blockCols;
 
     info.task_info[i].lhs_start = r0;
     info.task_info[i].lhs_length = actualBlockRows;
 
-    if(transpose) func(c0, actualBlockCols, 0, rows, &info);
-    else          func(0, rows, c0, actualBlockCols, &info);
+    if (transpose)
+      func(c0, actualBlockCols, 0, rows, &info);
+    else
+      func(0, rows, c0, actualBlockCols, &info);
   }
 
 #elif defined(EIGEN_GEMM_THREADPOOL)
-  ei_declare_aligned_stack_constructed_variable(GemmParallelTaskInfo<Index>,meta_info,threads,0);
+  ei_declare_aligned_stack_constructed_variable(GemmParallelTaskInfo<Index>, meta_info, threads, 0);
   Barrier barrier(threads);
-  auto task = [=, &func, &barrier, &task_info](int i)
-  {
+  auto task = [=, &func, &barrier, &task_info](int i) {
     Index actual_threads = threads;
     GemmParallelInfo<Index> info(i, static_cast<int>(actual_threads), task_info);
     Index blockCols = (cols / actual_threads) & ~Index(0x3);
     Index blockRows = (rows / actual_threads);
-    blockRows = (blockRows/Functor::Traits::mr)*Functor::Traits::mr;
+    blockRows = (blockRows / Functor::Traits::mr) * Functor::Traits::mr;
 
-    Index r0 = i*blockRows;
-    Index actualBlockRows = (i+1==actual_threads) ? rows-r0 : blockRows;
+    Index r0 = i * blockRows;
+    Index actualBlockRows = (i + 1 == actual_threads) ? rows - r0 : blockRows;
 
-    Index c0 = i*blockCols;
-    Index actualBlockCols = (i+1==actual_threads) ? cols-c0 : blockCols;
+    Index c0 = i * blockCols;
+    Index actualBlockCols = (i + 1 == actual_threads) ? cols - c0 : blockCols;
 
     info.task_info[i].lhs_start = r0;
     info.task_info[i].lhs_length = actualBlockRows;
 
-    if(transpose) func(c0, actualBlockCols, 0, rows, &info);
-    else          func(0, rows, c0, actualBlockCols, &info);
+    if (transpose)
+      func(c0, actualBlockCols, 0, rows, &info);
+    else
+      func(0, rows, c0, actualBlockCols, &info);
 
     barrier.Notify();
   };
   // Notice that we do not schedule more than "threads" tasks, which allows us to
   // limit number of running threads, even if the threadpool itself was constructed
   // with a larger number of threads.
-  for (int i=0; i < threads - 1; ++i) {
+  for (int i = 0; i < threads - 1; ++i) {
     pool->Schedule([=, task = std::move(task)] { task(i); });
   }
   task(threads - 1);
@@ -278,7 +270,7 @@
 
 #endif
 
-} // end namespace internal
-} // end namespace Eigen
+}  // end namespace internal
+}  // end namespace Eigen
 
-#endif // EIGEN_PARALLELIZER_H
+#endif  // EIGEN_PARALLELIZER_H
diff --git a/Eigen/src/Core/products/SelfadjointMatrixMatrix.h b/Eigen/src/Core/products/SelfadjointMatrixMatrix.h
index 8133880..899283d 100644
--- a/Eigen/src/Core/products/SelfadjointMatrixMatrix.h
+++ b/Eigen/src/Core/products/SelfadjointMatrixMatrix.h
@@ -13,278 +13,243 @@
 // IWYU pragma: private
 #include "../InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
 // pack a selfadjoint block diagonal for use with the gebp_kernel
-template<typename Scalar, typename Index, int Pack1, int Pack2_dummy, int StorageOrder>
-struct symm_pack_lhs
-{
-  template<int BlockRows> inline
-  void pack(Scalar* blockA, const const_blas_data_mapper<Scalar,Index,StorageOrder>& lhs, Index cols, Index i, Index& count)
-  {
+template <typename Scalar, typename Index, int Pack1, int Pack2_dummy, int StorageOrder>
+struct symm_pack_lhs {
+  template <int BlockRows>
+  inline void pack(Scalar* blockA, const const_blas_data_mapper<Scalar, Index, StorageOrder>& lhs, Index cols, Index i,
+                   Index& count) {
     // normal copy
-    for(Index k=0; k<i; k++)
-      for(Index w=0; w<BlockRows; w++)
-        blockA[count++] = lhs(i+w,k);           // normal
+    for (Index k = 0; k < i; k++)
+      for (Index w = 0; w < BlockRows; w++) blockA[count++] = lhs(i + w, k);  // normal
     // symmetric copy
     Index h = 0;
-    for(Index k=i; k<i+BlockRows; k++)
-    {
-      for(Index w=0; w<h; w++)
-        blockA[count++] = numext::conj(lhs(k, i+w)); // transposed
+    for (Index k = i; k < i + BlockRows; k++) {
+      for (Index w = 0; w < h; w++) blockA[count++] = numext::conj(lhs(k, i + w));  // transposed
 
-      blockA[count++] = numext::real(lhs(k,k));   // real (diagonal)
+      blockA[count++] = numext::real(lhs(k, k));  // real (diagonal)
 
-      for(Index w=h+1; w<BlockRows; w++)
-        blockA[count++] = lhs(i+w, k);          // normal
+      for (Index w = h + 1; w < BlockRows; w++) blockA[count++] = lhs(i + w, k);  // normal
       ++h;
     }
     // transposed copy
-    for(Index k=i+BlockRows; k<cols; k++)
-      for(Index w=0; w<BlockRows; w++)
-        blockA[count++] = numext::conj(lhs(k, i+w)); // transposed
+    for (Index k = i + BlockRows; k < cols; k++)
+      for (Index w = 0; w < BlockRows; w++) blockA[count++] = numext::conj(lhs(k, i + w));  // transposed
   }
-  void operator()(Scalar* blockA, const Scalar* lhs_, Index lhsStride, Index cols, Index rows)
-  {
+  void operator()(Scalar* blockA, const Scalar* lhs_, Index lhsStride, Index cols, Index rows) {
     typedef typename unpacket_traits<typename packet_traits<Scalar>::type>::half HalfPacket;
-    typedef typename unpacket_traits<typename unpacket_traits<typename packet_traits<Scalar>::type>::half>::half QuarterPacket;
-    enum { PacketSize = packet_traits<Scalar>::size,
-           HalfPacketSize = unpacket_traits<HalfPacket>::size,
-           QuarterPacketSize = unpacket_traits<QuarterPacket>::size,
-           HasHalf = (int)HalfPacketSize < (int)PacketSize,
-           HasQuarter = (int)QuarterPacketSize < (int)HalfPacketSize};
+    typedef typename unpacket_traits<typename unpacket_traits<typename packet_traits<Scalar>::type>::half>::half
+        QuarterPacket;
+    enum {
+      PacketSize = packet_traits<Scalar>::size,
+      HalfPacketSize = unpacket_traits<HalfPacket>::size,
+      QuarterPacketSize = unpacket_traits<QuarterPacket>::size,
+      HasHalf = (int)HalfPacketSize < (int)PacketSize,
+      HasQuarter = (int)QuarterPacketSize < (int)HalfPacketSize
+    };
 
-    const_blas_data_mapper<Scalar,Index,StorageOrder> lhs(lhs_,lhsStride);
+    const_blas_data_mapper<Scalar, Index, StorageOrder> lhs(lhs_, lhsStride);
     Index count = 0;
-    //Index peeled_mc3 = (rows/Pack1)*Pack1;
-    
-    const Index peeled_mc3 = Pack1>=3*PacketSize ? (rows/(3*PacketSize))*(3*PacketSize) : 0;
-    const Index peeled_mc2 = Pack1>=2*PacketSize ? peeled_mc3+((rows-peeled_mc3)/(2*PacketSize))*(2*PacketSize) : 0;
-    const Index peeled_mc1 = Pack1>=1*PacketSize ? peeled_mc2+((rows-peeled_mc2)/(1*PacketSize))*(1*PacketSize) : 0;
-    const Index peeled_mc_half = Pack1>=HalfPacketSize ? peeled_mc1+((rows-peeled_mc1)/(HalfPacketSize))*(HalfPacketSize) : 0;
-    const Index peeled_mc_quarter = Pack1>=QuarterPacketSize ? peeled_mc_half+((rows-peeled_mc_half)/(QuarterPacketSize))*(QuarterPacketSize) : 0;
-    
-    if(Pack1>=3*PacketSize)
-      for(Index i=0; i<peeled_mc3; i+=3*PacketSize)
-        pack<3*PacketSize>(blockA, lhs, cols, i, count);
-    
-    if(Pack1>=2*PacketSize)
-      for(Index i=peeled_mc3; i<peeled_mc2; i+=2*PacketSize)
-        pack<2*PacketSize>(blockA, lhs, cols, i, count);
-    
-    if(Pack1>=1*PacketSize)
-      for(Index i=peeled_mc2; i<peeled_mc1; i+=1*PacketSize)
-        pack<1*PacketSize>(blockA, lhs, cols, i, count);
+    // Index peeled_mc3 = (rows/Pack1)*Pack1;
 
-    if(HasHalf && Pack1>=HalfPacketSize)
-      for(Index i=peeled_mc1; i<peeled_mc_half; i+=HalfPacketSize)
+    const Index peeled_mc3 = Pack1 >= 3 * PacketSize ? (rows / (3 * PacketSize)) * (3 * PacketSize) : 0;
+    const Index peeled_mc2 =
+        Pack1 >= 2 * PacketSize ? peeled_mc3 + ((rows - peeled_mc3) / (2 * PacketSize)) * (2 * PacketSize) : 0;
+    const Index peeled_mc1 =
+        Pack1 >= 1 * PacketSize ? peeled_mc2 + ((rows - peeled_mc2) / (1 * PacketSize)) * (1 * PacketSize) : 0;
+    const Index peeled_mc_half =
+        Pack1 >= HalfPacketSize ? peeled_mc1 + ((rows - peeled_mc1) / (HalfPacketSize)) * (HalfPacketSize) : 0;
+    const Index peeled_mc_quarter =
+        Pack1 >= QuarterPacketSize
+            ? peeled_mc_half + ((rows - peeled_mc_half) / (QuarterPacketSize)) * (QuarterPacketSize)
+            : 0;
+
+    if (Pack1 >= 3 * PacketSize)
+      for (Index i = 0; i < peeled_mc3; i += 3 * PacketSize) pack<3 * PacketSize>(blockA, lhs, cols, i, count);
+
+    if (Pack1 >= 2 * PacketSize)
+      for (Index i = peeled_mc3; i < peeled_mc2; i += 2 * PacketSize) pack<2 * PacketSize>(blockA, lhs, cols, i, count);
+
+    if (Pack1 >= 1 * PacketSize)
+      for (Index i = peeled_mc2; i < peeled_mc1; i += 1 * PacketSize) pack<1 * PacketSize>(blockA, lhs, cols, i, count);
+
+    if (HasHalf && Pack1 >= HalfPacketSize)
+      for (Index i = peeled_mc1; i < peeled_mc_half; i += HalfPacketSize)
         pack<HalfPacketSize>(blockA, lhs, cols, i, count);
 
-    if(HasQuarter && Pack1>=QuarterPacketSize)
-      for(Index i=peeled_mc_half; i<peeled_mc_quarter; i+=QuarterPacketSize)
+    if (HasQuarter && Pack1 >= QuarterPacketSize)
+      for (Index i = peeled_mc_half; i < peeled_mc_quarter; i += QuarterPacketSize)
         pack<QuarterPacketSize>(blockA, lhs, cols, i, count);
 
     // do the same with mr==1
-    for(Index i=peeled_mc_quarter; i<rows; i++)
-    {
-      for(Index k=0; k<i; k++)
-        blockA[count++] = lhs(i, k);                   // normal
+    for (Index i = peeled_mc_quarter; i < rows; i++) {
+      for (Index k = 0; k < i; k++) blockA[count++] = lhs(i, k);  // normal
 
-      blockA[count++] = numext::real(lhs(i, i));       // real (diagonal)
+      blockA[count++] = numext::real(lhs(i, i));  // real (diagonal)
 
-      for(Index k=i+1; k<cols; k++)
-        blockA[count++] = numext::conj(lhs(k, i));     // transposed
+      for (Index k = i + 1; k < cols; k++) blockA[count++] = numext::conj(lhs(k, i));  // transposed
     }
   }
 };
 
-template<typename Scalar, typename Index, int nr, int StorageOrder>
-struct symm_pack_rhs
-{
+template <typename Scalar, typename Index, int nr, int StorageOrder>
+struct symm_pack_rhs {
   enum { PacketSize = packet_traits<Scalar>::size };
-  void operator()(Scalar* blockB, const Scalar* rhs_, Index rhsStride, Index rows, Index cols, Index k2)
-  {
+  void operator()(Scalar* blockB, const Scalar* rhs_, Index rhsStride, Index rows, Index cols, Index k2) {
     Index end_k = k2 + rows;
     Index count = 0;
-    const_blas_data_mapper<Scalar,Index,StorageOrder> rhs(rhs_,rhsStride);
-    Index packet_cols8 = nr>=8 ? (cols/8) * 8 : 0;
-    Index packet_cols4 = nr>=4 ? (cols/4) * 4 : 0;
+    const_blas_data_mapper<Scalar, Index, StorageOrder> rhs(rhs_, rhsStride);
+    Index packet_cols8 = nr >= 8 ? (cols / 8) * 8 : 0;
+    Index packet_cols4 = nr >= 4 ? (cols / 4) * 4 : 0;
 
     // first part: normal case
-    for(Index j2=0; j2<k2; j2+=nr)
-    {
-      for(Index k=k2; k<end_k; k++)
-      {
-        blockB[count+0] = rhs(k,j2+0);
-        blockB[count+1] = rhs(k,j2+1);
-        if (nr>=4)
-        {
-          blockB[count+2] = rhs(k,j2+2);
-          blockB[count+3] = rhs(k,j2+3);
+    for (Index j2 = 0; j2 < k2; j2 += nr) {
+      for (Index k = k2; k < end_k; k++) {
+        blockB[count + 0] = rhs(k, j2 + 0);
+        blockB[count + 1] = rhs(k, j2 + 1);
+        if (nr >= 4) {
+          blockB[count + 2] = rhs(k, j2 + 2);
+          blockB[count + 3] = rhs(k, j2 + 3);
         }
-        if (nr>=8)
-        {
-          blockB[count+4] = rhs(k,j2+4);
-          blockB[count+5] = rhs(k,j2+5);
-          blockB[count+6] = rhs(k,j2+6);
-          blockB[count+7] = rhs(k,j2+7);
+        if (nr >= 8) {
+          blockB[count + 4] = rhs(k, j2 + 4);
+          blockB[count + 5] = rhs(k, j2 + 5);
+          blockB[count + 6] = rhs(k, j2 + 6);
+          blockB[count + 7] = rhs(k, j2 + 7);
         }
         count += nr;
       }
     }
 
     // second part: diagonal block
-    Index end8 = nr>=8 ? (std::min)(k2+rows,packet_cols8) : k2;
-    if(nr>=8)
-    {
-      for(Index j2=k2; j2<end8; j2+=8)
-      {
+    Index end8 = nr >= 8 ? (std::min)(k2 + rows, packet_cols8) : k2;
+    if (nr >= 8) {
+      for (Index j2 = k2; j2 < end8; j2 += 8) {
         // again we can split vertically in three different parts (transpose, symmetric, normal)
         // transpose
-        for(Index k=k2; k<j2; k++)
-        {
-          blockB[count+0] = numext::conj(rhs(j2+0,k));
-          blockB[count+1] = numext::conj(rhs(j2+1,k));
-          blockB[count+2] = numext::conj(rhs(j2+2,k));
-          blockB[count+3] = numext::conj(rhs(j2+3,k));
-          blockB[count+4] = numext::conj(rhs(j2+4,k));
-          blockB[count+5] = numext::conj(rhs(j2+5,k));
-          blockB[count+6] = numext::conj(rhs(j2+6,k));
-          blockB[count+7] = numext::conj(rhs(j2+7,k));
+        for (Index k = k2; k < j2; k++) {
+          blockB[count + 0] = numext::conj(rhs(j2 + 0, k));
+          blockB[count + 1] = numext::conj(rhs(j2 + 1, k));
+          blockB[count + 2] = numext::conj(rhs(j2 + 2, k));
+          blockB[count + 3] = numext::conj(rhs(j2 + 3, k));
+          blockB[count + 4] = numext::conj(rhs(j2 + 4, k));
+          blockB[count + 5] = numext::conj(rhs(j2 + 5, k));
+          blockB[count + 6] = numext::conj(rhs(j2 + 6, k));
+          blockB[count + 7] = numext::conj(rhs(j2 + 7, k));
           count += 8;
         }
         // symmetric
         Index h = 0;
-        for(Index k=j2; k<j2+8; k++)
-        {
+        for (Index k = j2; k < j2 + 8; k++) {
           // normal
-          for (Index w=0 ; w<h; ++w)
-            blockB[count+w] = rhs(k,j2+w);
+          for (Index w = 0; w < h; ++w) blockB[count + w] = rhs(k, j2 + w);
 
-          blockB[count+h] = numext::real(rhs(k,k));
+          blockB[count + h] = numext::real(rhs(k, k));
 
           // transpose
-          for (Index w=h+1 ; w<8; ++w)
-            blockB[count+w] = numext::conj(rhs(j2+w,k));
+          for (Index w = h + 1; w < 8; ++w) blockB[count + w] = numext::conj(rhs(j2 + w, k));
           count += 8;
           ++h;
         }
         // normal
-        for(Index k=j2+8; k<end_k; k++)
-        {
-          blockB[count+0] = rhs(k,j2+0);
-          blockB[count+1] = rhs(k,j2+1);
-          blockB[count+2] = rhs(k,j2+2);
-          blockB[count+3] = rhs(k,j2+3);
-          blockB[count+4] = rhs(k,j2+4);
-          blockB[count+5] = rhs(k,j2+5);
-          blockB[count+6] = rhs(k,j2+6);
-          blockB[count+7] = rhs(k,j2+7);
+        for (Index k = j2 + 8; k < end_k; k++) {
+          blockB[count + 0] = rhs(k, j2 + 0);
+          blockB[count + 1] = rhs(k, j2 + 1);
+          blockB[count + 2] = rhs(k, j2 + 2);
+          blockB[count + 3] = rhs(k, j2 + 3);
+          blockB[count + 4] = rhs(k, j2 + 4);
+          blockB[count + 5] = rhs(k, j2 + 5);
+          blockB[count + 6] = rhs(k, j2 + 6);
+          blockB[count + 7] = rhs(k, j2 + 7);
           count += 8;
         }
       }
     }
-    if(nr>=4)
-    {
-      for(Index j2=end8; j2<(std::min)(k2+rows,packet_cols4); j2+=4)
-      {
+    if (nr >= 4) {
+      for (Index j2 = end8; j2 < (std::min)(k2 + rows, packet_cols4); j2 += 4) {
         // again we can split vertically in three different parts (transpose, symmetric, normal)
         // transpose
-        for(Index k=k2; k<j2; k++)
-        {
-          blockB[count+0] = numext::conj(rhs(j2+0,k));
-          blockB[count+1] = numext::conj(rhs(j2+1,k));
-          blockB[count+2] = numext::conj(rhs(j2+2,k));
-          blockB[count+3] = numext::conj(rhs(j2+3,k));
+        for (Index k = k2; k < j2; k++) {
+          blockB[count + 0] = numext::conj(rhs(j2 + 0, k));
+          blockB[count + 1] = numext::conj(rhs(j2 + 1, k));
+          blockB[count + 2] = numext::conj(rhs(j2 + 2, k));
+          blockB[count + 3] = numext::conj(rhs(j2 + 3, k));
           count += 4;
         }
         // symmetric
         Index h = 0;
-        for(Index k=j2; k<j2+4; k++)
-        {
+        for (Index k = j2; k < j2 + 4; k++) {
           // normal
-          for (Index w=0 ; w<h; ++w)
-            blockB[count+w] = rhs(k,j2+w);
+          for (Index w = 0; w < h; ++w) blockB[count + w] = rhs(k, j2 + w);
 
-          blockB[count+h] = numext::real(rhs(k,k));
+          blockB[count + h] = numext::real(rhs(k, k));
 
           // transpose
-          for (Index w=h+1 ; w<4; ++w)
-            blockB[count+w] = numext::conj(rhs(j2+w,k));
+          for (Index w = h + 1; w < 4; ++w) blockB[count + w] = numext::conj(rhs(j2 + w, k));
           count += 4;
           ++h;
         }
         // normal
-        for(Index k=j2+4; k<end_k; k++)
-        {
-          blockB[count+0] = rhs(k,j2+0);
-          blockB[count+1] = rhs(k,j2+1);
-          blockB[count+2] = rhs(k,j2+2);
-          blockB[count+3] = rhs(k,j2+3);
+        for (Index k = j2 + 4; k < end_k; k++) {
+          blockB[count + 0] = rhs(k, j2 + 0);
+          blockB[count + 1] = rhs(k, j2 + 1);
+          blockB[count + 2] = rhs(k, j2 + 2);
+          blockB[count + 3] = rhs(k, j2 + 3);
           count += 4;
         }
       }
     }
 
     // third part: transposed
-    if(nr>=8)
-    {
-      for(Index j2=k2+rows; j2<packet_cols8; j2+=8)
-      {
-        for(Index k=k2; k<end_k; k++)
-        {
-          blockB[count+0] = numext::conj(rhs(j2+0,k));
-          blockB[count+1] = numext::conj(rhs(j2+1,k));
-          blockB[count+2] = numext::conj(rhs(j2+2,k));
-          blockB[count+3] = numext::conj(rhs(j2+3,k));
-          blockB[count+4] = numext::conj(rhs(j2+4,k));
-          blockB[count+5] = numext::conj(rhs(j2+5,k));
-          blockB[count+6] = numext::conj(rhs(j2+6,k));
-          blockB[count+7] = numext::conj(rhs(j2+7,k));
+    if (nr >= 8) {
+      for (Index j2 = k2 + rows; j2 < packet_cols8; j2 += 8) {
+        for (Index k = k2; k < end_k; k++) {
+          blockB[count + 0] = numext::conj(rhs(j2 + 0, k));
+          blockB[count + 1] = numext::conj(rhs(j2 + 1, k));
+          blockB[count + 2] = numext::conj(rhs(j2 + 2, k));
+          blockB[count + 3] = numext::conj(rhs(j2 + 3, k));
+          blockB[count + 4] = numext::conj(rhs(j2 + 4, k));
+          blockB[count + 5] = numext::conj(rhs(j2 + 5, k));
+          blockB[count + 6] = numext::conj(rhs(j2 + 6, k));
+          blockB[count + 7] = numext::conj(rhs(j2 + 7, k));
           count += 8;
         }
       }
     }
-    if(nr>=4)
-    {
-      for(Index j2=(std::max)(packet_cols8,k2+rows); j2<packet_cols4; j2+=4)
-      {
-        for(Index k=k2; k<end_k; k++)
-        {
-          blockB[count+0] = numext::conj(rhs(j2+0,k));
-          blockB[count+1] = numext::conj(rhs(j2+1,k));
-          blockB[count+2] = numext::conj(rhs(j2+2,k));
-          blockB[count+3] = numext::conj(rhs(j2+3,k));
+    if (nr >= 4) {
+      for (Index j2 = (std::max)(packet_cols8, k2 + rows); j2 < packet_cols4; j2 += 4) {
+        for (Index k = k2; k < end_k; k++) {
+          blockB[count + 0] = numext::conj(rhs(j2 + 0, k));
+          blockB[count + 1] = numext::conj(rhs(j2 + 1, k));
+          blockB[count + 2] = numext::conj(rhs(j2 + 2, k));
+          blockB[count + 3] = numext::conj(rhs(j2 + 3, k));
           count += 4;
         }
       }
     }
 
     // copy the remaining columns one at a time (=> the same with nr==1)
-    for(Index j2=packet_cols4; j2<cols; ++j2)
-    {
+    for (Index j2 = packet_cols4; j2 < cols; ++j2) {
       // transpose
-      Index half = (std::min)(end_k,j2);
-      for(Index k=k2; k<half; k++)
-      {
-        blockB[count] = numext::conj(rhs(j2,k));
+      Index half = (std::min)(end_k, j2);
+      for (Index k = k2; k < half; k++) {
+        blockB[count] = numext::conj(rhs(j2, k));
         count += 1;
       }
 
-      if(half==j2 && half<k2+rows)
-      {
-        blockB[count] = numext::real(rhs(j2,j2));
+      if (half == j2 && half < k2 + rows) {
+        blockB[count] = numext::real(rhs(j2, j2));
         count += 1;
-      }
-      else
+      } else
         half--;
 
       // normal
-      for(Index k=half+1; k<k2+rows; k++)
-      {
-        blockB[count] = rhs(k,j2);
+      for (Index k = half + 1; k < k2 + rows; k++) {
+        blockB[count] = rhs(k, j2);
         count += 1;
       }
     }
@@ -294,254 +259,225 @@
 /* Optimized selfadjoint matrix * matrix (_SYMM) product built on top of
  * the general matrix matrix product.
  */
-template <typename Scalar, typename Index,
-          int LhsStorageOrder, bool LhsSelfAdjoint, bool ConjugateLhs,
-          int RhsStorageOrder, bool RhsSelfAdjoint, bool ConjugateRhs,
-          int ResStorageOrder, int ResInnerStride>
+template <typename Scalar, typename Index, int LhsStorageOrder, bool LhsSelfAdjoint, bool ConjugateLhs,
+          int RhsStorageOrder, bool RhsSelfAdjoint, bool ConjugateRhs, int ResStorageOrder, int ResInnerStride>
 struct product_selfadjoint_matrix;
 
-template <typename Scalar, typename Index,
-          int LhsStorageOrder, bool LhsSelfAdjoint, bool ConjugateLhs,
-          int RhsStorageOrder, bool RhsSelfAdjoint, bool ConjugateRhs,
-          int ResInnerStride>
-struct product_selfadjoint_matrix<Scalar,Index,LhsStorageOrder,LhsSelfAdjoint,ConjugateLhs, RhsStorageOrder,RhsSelfAdjoint,ConjugateRhs,RowMajor,ResInnerStride>
-{
-
-  static EIGEN_STRONG_INLINE void run(
-    Index rows, Index cols,
-    const Scalar* lhs, Index lhsStride,
-    const Scalar* rhs, Index rhsStride,
-    Scalar* res,       Index resIncr, Index resStride,
-    const Scalar& alpha, level3_blocking<Scalar,Scalar>& blocking)
-  {
-    product_selfadjoint_matrix<Scalar, Index,
-      logical_xor(RhsSelfAdjoint,RhsStorageOrder==RowMajor) ? ColMajor : RowMajor,
-      RhsSelfAdjoint, NumTraits<Scalar>::IsComplex && logical_xor(RhsSelfAdjoint, ConjugateRhs),
-      logical_xor(LhsSelfAdjoint,LhsStorageOrder==RowMajor) ? ColMajor : RowMajor,
-      LhsSelfAdjoint, NumTraits<Scalar>::IsComplex && logical_xor(LhsSelfAdjoint, ConjugateLhs),
-      ColMajor,ResInnerStride>
-      ::run(cols, rows,  rhs, rhsStride,  lhs, lhsStride,  res, resIncr, resStride,  alpha, blocking);
+template <typename Scalar, typename Index, int LhsStorageOrder, bool LhsSelfAdjoint, bool ConjugateLhs,
+          int RhsStorageOrder, bool RhsSelfAdjoint, bool ConjugateRhs, int ResInnerStride>
+struct product_selfadjoint_matrix<Scalar, Index, LhsStorageOrder, LhsSelfAdjoint, ConjugateLhs, RhsStorageOrder,
+                                  RhsSelfAdjoint, ConjugateRhs, RowMajor, ResInnerStride> {
+  static EIGEN_STRONG_INLINE void run(Index rows, Index cols, const Scalar* lhs, Index lhsStride, const Scalar* rhs,
+                                      Index rhsStride, Scalar* res, Index resIncr, Index resStride, const Scalar& alpha,
+                                      level3_blocking<Scalar, Scalar>& blocking) {
+    product_selfadjoint_matrix<
+        Scalar, Index, logical_xor(RhsSelfAdjoint, RhsStorageOrder == RowMajor) ? ColMajor : RowMajor, RhsSelfAdjoint,
+        NumTraits<Scalar>::IsComplex && logical_xor(RhsSelfAdjoint, ConjugateRhs),
+        logical_xor(LhsSelfAdjoint, LhsStorageOrder == RowMajor) ? ColMajor : RowMajor, LhsSelfAdjoint,
+        NumTraits<Scalar>::IsComplex && logical_xor(LhsSelfAdjoint, ConjugateLhs), ColMajor,
+        ResInnerStride>::run(cols, rows, rhs, rhsStride, lhs, lhsStride, res, resIncr, resStride, alpha, blocking);
   }
 };
 
-template <typename Scalar, typename Index,
-          int LhsStorageOrder, bool ConjugateLhs,
-          int RhsStorageOrder, bool ConjugateRhs,
-          int ResInnerStride>
-struct product_selfadjoint_matrix<Scalar,Index,LhsStorageOrder,true,ConjugateLhs, RhsStorageOrder,false,ConjugateRhs,ColMajor,ResInnerStride>
-{
-
-  static EIGEN_DONT_INLINE void run(
-    Index rows, Index cols,
-    const Scalar* lhs_, Index lhsStride,
-    const Scalar* rhs_, Index rhsStride,
-    Scalar* res,        Index resIncr, Index resStride,
-    const Scalar& alpha, level3_blocking<Scalar,Scalar>& blocking);
+template <typename Scalar, typename Index, int LhsStorageOrder, bool ConjugateLhs, int RhsStorageOrder,
+          bool ConjugateRhs, int ResInnerStride>
+struct product_selfadjoint_matrix<Scalar, Index, LhsStorageOrder, true, ConjugateLhs, RhsStorageOrder, false,
+                                  ConjugateRhs, ColMajor, ResInnerStride> {
+  static EIGEN_DONT_INLINE void run(Index rows, Index cols, const Scalar* lhs_, Index lhsStride, const Scalar* rhs_,
+                                    Index rhsStride, Scalar* res, Index resIncr, Index resStride, const Scalar& alpha,
+                                    level3_blocking<Scalar, Scalar>& blocking);
 };
 
-template <typename Scalar, typename Index,
-          int LhsStorageOrder, bool ConjugateLhs,
-          int RhsStorageOrder, bool ConjugateRhs,
-          int ResInnerStride>
-EIGEN_DONT_INLINE void product_selfadjoint_matrix<Scalar,Index,LhsStorageOrder,true,ConjugateLhs, RhsStorageOrder,false,ConjugateRhs,ColMajor,ResInnerStride>::run(
-    Index rows, Index cols,
-    const Scalar* lhs_, Index lhsStride,
-    const Scalar* rhs_, Index rhsStride,
-    Scalar* res_,       Index resIncr, Index resStride,
-    const Scalar& alpha, level3_blocking<Scalar,Scalar>& blocking)
-  {
-    Index size = rows;
+template <typename Scalar, typename Index, int LhsStorageOrder, bool ConjugateLhs, int RhsStorageOrder,
+          bool ConjugateRhs, int ResInnerStride>
+EIGEN_DONT_INLINE void
+product_selfadjoint_matrix<Scalar, Index, LhsStorageOrder, true, ConjugateLhs, RhsStorageOrder, false, ConjugateRhs,
+                           ColMajor, ResInnerStride>::run(Index rows, Index cols, const Scalar* lhs_, Index lhsStride,
+                                                          const Scalar* rhs_, Index rhsStride, Scalar* res_,
+                                                          Index resIncr, Index resStride, const Scalar& alpha,
+                                                          level3_blocking<Scalar, Scalar>& blocking) {
+  Index size = rows;
 
-    typedef gebp_traits<Scalar,Scalar> Traits;
+  typedef gebp_traits<Scalar, Scalar> Traits;
 
-    typedef const_blas_data_mapper<Scalar, Index, LhsStorageOrder> LhsMapper;
-    typedef const_blas_data_mapper<Scalar, Index, (LhsStorageOrder == RowMajor) ? ColMajor : RowMajor> LhsTransposeMapper;
-    typedef const_blas_data_mapper<Scalar, Index, RhsStorageOrder> RhsMapper;
-    typedef blas_data_mapper<typename Traits::ResScalar, Index, ColMajor, Unaligned, ResInnerStride> ResMapper;
-    LhsMapper lhs(lhs_,lhsStride);
-    LhsTransposeMapper lhs_transpose(lhs_,lhsStride);
-    RhsMapper rhs(rhs_,rhsStride);
-    ResMapper res(res_, resStride, resIncr);
+  typedef const_blas_data_mapper<Scalar, Index, LhsStorageOrder> LhsMapper;
+  typedef const_blas_data_mapper<Scalar, Index, (LhsStorageOrder == RowMajor) ? ColMajor : RowMajor> LhsTransposeMapper;
+  typedef const_blas_data_mapper<Scalar, Index, RhsStorageOrder> RhsMapper;
+  typedef blas_data_mapper<typename Traits::ResScalar, Index, ColMajor, Unaligned, ResInnerStride> ResMapper;
+  LhsMapper lhs(lhs_, lhsStride);
+  LhsTransposeMapper lhs_transpose(lhs_, lhsStride);
+  RhsMapper rhs(rhs_, rhsStride);
+  ResMapper res(res_, resStride, resIncr);
 
-    Index kc = blocking.kc();                   // cache block size along the K direction
-    Index mc = (std::min)(rows,blocking.mc());  // cache block size along the M direction
-    // kc must be smaller than mc
-    kc = (std::min)(kc,mc);
-    std::size_t sizeA = kc*mc;
-    std::size_t sizeB = kc*cols;
-    ei_declare_aligned_stack_constructed_variable(Scalar, blockA, sizeA, blocking.blockA());
-    ei_declare_aligned_stack_constructed_variable(Scalar, blockB, sizeB, blocking.blockB());
+  Index kc = blocking.kc();                    // cache block size along the K direction
+  Index mc = (std::min)(rows, blocking.mc());  // cache block size along the M direction
+  // kc must be smaller than mc
+  kc = (std::min)(kc, mc);
+  std::size_t sizeA = kc * mc;
+  std::size_t sizeB = kc * cols;
+  ei_declare_aligned_stack_constructed_variable(Scalar, blockA, sizeA, blocking.blockA());
+  ei_declare_aligned_stack_constructed_variable(Scalar, blockB, sizeB, blocking.blockB());
 
-    gebp_kernel<Scalar, Scalar, Index, ResMapper, Traits::mr, Traits::nr, ConjugateLhs, ConjugateRhs> gebp_kernel;
-    symm_pack_lhs<Scalar, Index, Traits::mr, Traits::LhsProgress, LhsStorageOrder> pack_lhs;
-    gemm_pack_rhs<Scalar, Index, RhsMapper, Traits::nr,RhsStorageOrder> pack_rhs;
-    gemm_pack_lhs<Scalar, Index, LhsTransposeMapper, Traits::mr, Traits::LhsProgress, typename Traits::LhsPacket4Packing, LhsStorageOrder==RowMajor?ColMajor:RowMajor, true> pack_lhs_transposed;
+  gebp_kernel<Scalar, Scalar, Index, ResMapper, Traits::mr, Traits::nr, ConjugateLhs, ConjugateRhs> gebp_kernel;
+  symm_pack_lhs<Scalar, Index, Traits::mr, Traits::LhsProgress, LhsStorageOrder> pack_lhs;
+  gemm_pack_rhs<Scalar, Index, RhsMapper, Traits::nr, RhsStorageOrder> pack_rhs;
+  gemm_pack_lhs<Scalar, Index, LhsTransposeMapper, Traits::mr, Traits::LhsProgress, typename Traits::LhsPacket4Packing,
+                LhsStorageOrder == RowMajor ? ColMajor : RowMajor, true>
+      pack_lhs_transposed;
 
-    for(Index k2=0; k2<size; k2+=kc)
+  for (Index k2 = 0; k2 < size; k2 += kc) {
+    const Index actual_kc = (std::min)(k2 + kc, size) - k2;
+
+    // we have selected one row panel of rhs and one column panel of lhs
+    // pack rhs's panel into a sequential chunk of memory
+    // and expand each coeff to a constant packet for further reuse
+    pack_rhs(blockB, rhs.getSubMapper(k2, 0), actual_kc, cols);
+
+    // the select lhs's panel has to be split in three different parts:
+    //  1 - the transposed panel above the diagonal block => transposed packed copy
+    //  2 - the diagonal block => special packed copy
+    //  3 - the panel below the diagonal block => generic packed copy
+    for (Index i2 = 0; i2 < k2; i2 += mc) {
+      const Index actual_mc = (std::min)(i2 + mc, k2) - i2;
+      // transposed packed copy
+      pack_lhs_transposed(blockA, lhs_transpose.getSubMapper(i2, k2), actual_kc, actual_mc);
+
+      gebp_kernel(res.getSubMapper(i2, 0), blockA, blockB, actual_mc, actual_kc, cols, alpha);
+    }
+    // the block diagonal
     {
-      const Index actual_kc = (std::min)(k2+kc,size)-k2;
+      const Index actual_mc = (std::min)(k2 + kc, size) - k2;
+      // symmetric packed copy
+      pack_lhs(blockA, &lhs(k2, k2), lhsStride, actual_kc, actual_mc);
 
-      // we have selected one row panel of rhs and one column panel of lhs
-      // pack rhs's panel into a sequential chunk of memory
-      // and expand each coeff to a constant packet for further reuse
-      pack_rhs(blockB, rhs.getSubMapper(k2,0), actual_kc, cols);
+      gebp_kernel(res.getSubMapper(k2, 0), blockA, blockB, actual_mc, actual_kc, cols, alpha);
+    }
 
-      // the select lhs's panel has to be split in three different parts:
-      //  1 - the transposed panel above the diagonal block => transposed packed copy
-      //  2 - the diagonal block => special packed copy
-      //  3 - the panel below the diagonal block => generic packed copy
-      for(Index i2=0; i2<k2; i2+=mc)
-      {
-        const Index actual_mc = (std::min)(i2+mc,k2)-i2;
-        // transposed packed copy
-        pack_lhs_transposed(blockA, lhs_transpose.getSubMapper(i2, k2), actual_kc, actual_mc);
+    for (Index i2 = k2 + kc; i2 < size; i2 += mc) {
+      const Index actual_mc = (std::min)(i2 + mc, size) - i2;
+      gemm_pack_lhs<Scalar, Index, LhsMapper, Traits::mr, Traits::LhsProgress, typename Traits::LhsPacket4Packing,
+                    LhsStorageOrder, false>()(blockA, lhs.getSubMapper(i2, k2), actual_kc, actual_mc);
 
-        gebp_kernel(res.getSubMapper(i2, 0), blockA, blockB, actual_mc, actual_kc, cols, alpha);
-      }
-      // the block diagonal
-      {
-        const Index actual_mc = (std::min)(k2+kc,size)-k2;
-        // symmetric packed copy
-        pack_lhs(blockA, &lhs(k2,k2), lhsStride, actual_kc, actual_mc);
-
-        gebp_kernel(res.getSubMapper(k2, 0), blockA, blockB, actual_mc, actual_kc, cols, alpha);
-      }
-
-      for(Index i2=k2+kc; i2<size; i2+=mc)
-      {
-        const Index actual_mc = (std::min)(i2+mc,size)-i2;
-        gemm_pack_lhs<Scalar, Index, LhsMapper, Traits::mr, Traits::LhsProgress, typename Traits::LhsPacket4Packing, LhsStorageOrder,false>()
-          (blockA, lhs.getSubMapper(i2, k2), actual_kc, actual_mc);
-
-        gebp_kernel(res.getSubMapper(i2, 0), blockA, blockB, actual_mc, actual_kc, cols, alpha);
-      }
+      gebp_kernel(res.getSubMapper(i2, 0), blockA, blockB, actual_mc, actual_kc, cols, alpha);
     }
   }
+}
 
 // matrix * selfadjoint product
-template <typename Scalar, typename Index,
-          int LhsStorageOrder, bool ConjugateLhs,
-          int RhsStorageOrder, bool ConjugateRhs,
-          int ResInnerStride>
-struct product_selfadjoint_matrix<Scalar,Index,LhsStorageOrder,false,ConjugateLhs, RhsStorageOrder,true,ConjugateRhs,ColMajor,ResInnerStride>
-{
-
-  static EIGEN_DONT_INLINE void run(
-    Index rows, Index cols,
-    const Scalar* lhs_, Index lhsStride,
-    const Scalar* rhs_, Index rhsStride,
-    Scalar* res,        Index resIncr, Index resStride,
-    const Scalar& alpha, level3_blocking<Scalar,Scalar>& blocking);
+template <typename Scalar, typename Index, int LhsStorageOrder, bool ConjugateLhs, int RhsStorageOrder,
+          bool ConjugateRhs, int ResInnerStride>
+struct product_selfadjoint_matrix<Scalar, Index, LhsStorageOrder, false, ConjugateLhs, RhsStorageOrder, true,
+                                  ConjugateRhs, ColMajor, ResInnerStride> {
+  static EIGEN_DONT_INLINE void run(Index rows, Index cols, const Scalar* lhs_, Index lhsStride, const Scalar* rhs_,
+                                    Index rhsStride, Scalar* res, Index resIncr, Index resStride, const Scalar& alpha,
+                                    level3_blocking<Scalar, Scalar>& blocking);
 };
 
-template <typename Scalar, typename Index,
-          int LhsStorageOrder, bool ConjugateLhs,
-          int RhsStorageOrder, bool ConjugateRhs,
-          int ResInnerStride>
-EIGEN_DONT_INLINE void product_selfadjoint_matrix<Scalar,Index,LhsStorageOrder,false,ConjugateLhs, RhsStorageOrder,true,ConjugateRhs,ColMajor,ResInnerStride>::run(
-    Index rows, Index cols,
-    const Scalar* lhs_, Index lhsStride,
-    const Scalar* rhs_, Index rhsStride,
-    Scalar* res_,       Index resIncr, Index resStride,
-    const Scalar& alpha, level3_blocking<Scalar,Scalar>& blocking)
-  {
-    Index size = cols;
+template <typename Scalar, typename Index, int LhsStorageOrder, bool ConjugateLhs, int RhsStorageOrder,
+          bool ConjugateRhs, int ResInnerStride>
+EIGEN_DONT_INLINE void
+product_selfadjoint_matrix<Scalar, Index, LhsStorageOrder, false, ConjugateLhs, RhsStorageOrder, true, ConjugateRhs,
+                           ColMajor, ResInnerStride>::run(Index rows, Index cols, const Scalar* lhs_, Index lhsStride,
+                                                          const Scalar* rhs_, Index rhsStride, Scalar* res_,
+                                                          Index resIncr, Index resStride, const Scalar& alpha,
+                                                          level3_blocking<Scalar, Scalar>& blocking) {
+  Index size = cols;
 
-    typedef gebp_traits<Scalar,Scalar> Traits;
+  typedef gebp_traits<Scalar, Scalar> Traits;
 
-    typedef const_blas_data_mapper<Scalar, Index, LhsStorageOrder> LhsMapper;
-    typedef blas_data_mapper<typename Traits::ResScalar, Index, ColMajor, Unaligned, ResInnerStride> ResMapper;
-    LhsMapper lhs(lhs_,lhsStride);
-    ResMapper res(res_,resStride, resIncr);
+  typedef const_blas_data_mapper<Scalar, Index, LhsStorageOrder> LhsMapper;
+  typedef blas_data_mapper<typename Traits::ResScalar, Index, ColMajor, Unaligned, ResInnerStride> ResMapper;
+  LhsMapper lhs(lhs_, lhsStride);
+  ResMapper res(res_, resStride, resIncr);
 
-    Index kc = blocking.kc();                   // cache block size along the K direction
-    Index mc = (std::min)(rows,blocking.mc());  // cache block size along the M direction
-    std::size_t sizeA = kc*mc;
-    std::size_t sizeB = kc*cols;
-    ei_declare_aligned_stack_constructed_variable(Scalar, blockA, sizeA, blocking.blockA());
-    ei_declare_aligned_stack_constructed_variable(Scalar, blockB, sizeB, blocking.blockB());
+  Index kc = blocking.kc();                    // cache block size along the K direction
+  Index mc = (std::min)(rows, blocking.mc());  // cache block size along the M direction
+  std::size_t sizeA = kc * mc;
+  std::size_t sizeB = kc * cols;
+  ei_declare_aligned_stack_constructed_variable(Scalar, blockA, sizeA, blocking.blockA());
+  ei_declare_aligned_stack_constructed_variable(Scalar, blockB, sizeB, blocking.blockB());
 
-    gebp_kernel<Scalar, Scalar, Index, ResMapper, Traits::mr, Traits::nr, ConjugateLhs, ConjugateRhs> gebp_kernel;
-    gemm_pack_lhs<Scalar, Index, LhsMapper, Traits::mr, Traits::LhsProgress, typename Traits::LhsPacket4Packing, LhsStorageOrder> pack_lhs;
-    symm_pack_rhs<Scalar, Index, Traits::nr,RhsStorageOrder> pack_rhs;
+  gebp_kernel<Scalar, Scalar, Index, ResMapper, Traits::mr, Traits::nr, ConjugateLhs, ConjugateRhs> gebp_kernel;
+  gemm_pack_lhs<Scalar, Index, LhsMapper, Traits::mr, Traits::LhsProgress, typename Traits::LhsPacket4Packing,
+                LhsStorageOrder>
+      pack_lhs;
+  symm_pack_rhs<Scalar, Index, Traits::nr, RhsStorageOrder> pack_rhs;
 
-    for(Index k2=0; k2<size; k2+=kc)
-    {
-      const Index actual_kc = (std::min)(k2+kc,size)-k2;
+  for (Index k2 = 0; k2 < size; k2 += kc) {
+    const Index actual_kc = (std::min)(k2 + kc, size) - k2;
 
-      pack_rhs(blockB, rhs_, rhsStride, actual_kc, cols, k2);
+    pack_rhs(blockB, rhs_, rhsStride, actual_kc, cols, k2);
 
-      // => GEPP
-      for(Index i2=0; i2<rows; i2+=mc)
-      {
-        const Index actual_mc = (std::min)(i2+mc,rows)-i2;
-        pack_lhs(blockA, lhs.getSubMapper(i2, k2), actual_kc, actual_mc);
+    // => GEPP
+    for (Index i2 = 0; i2 < rows; i2 += mc) {
+      const Index actual_mc = (std::min)(i2 + mc, rows) - i2;
+      pack_lhs(blockA, lhs.getSubMapper(i2, k2), actual_kc, actual_mc);
 
-        gebp_kernel(res.getSubMapper(i2, 0), blockA, blockB, actual_mc, actual_kc, cols, alpha);
-      }
+      gebp_kernel(res.getSubMapper(i2, 0), blockA, blockB, actual_mc, actual_kc, cols, alpha);
     }
   }
+}
 
-} // end namespace internal
+}  // end namespace internal
 
 /***************************************************************************
-* Wrapper to product_selfadjoint_matrix
-***************************************************************************/
+ * Wrapper to product_selfadjoint_matrix
+ ***************************************************************************/
 
 namespace internal {
-  
-template<typename Lhs, int LhsMode, typename Rhs, int RhsMode>
-struct selfadjoint_product_impl<Lhs,LhsMode,false,Rhs,RhsMode,false>
-{
-  typedef typename Product<Lhs,Rhs>::Scalar Scalar;
-  
+
+template <typename Lhs, int LhsMode, typename Rhs, int RhsMode>
+struct selfadjoint_product_impl<Lhs, LhsMode, false, Rhs, RhsMode, false> {
+  typedef typename Product<Lhs, Rhs>::Scalar Scalar;
+
   typedef internal::blas_traits<Lhs> LhsBlasTraits;
   typedef typename LhsBlasTraits::DirectLinearAccessType ActualLhsType;
   typedef internal::blas_traits<Rhs> RhsBlasTraits;
   typedef typename RhsBlasTraits::DirectLinearAccessType ActualRhsType;
-  
+
   enum {
-    LhsIsUpper = (LhsMode&(Upper|Lower))==Upper,
-    LhsIsSelfAdjoint = (LhsMode&SelfAdjoint)==SelfAdjoint,
-    RhsIsUpper = (RhsMode&(Upper|Lower))==Upper,
-    RhsIsSelfAdjoint = (RhsMode&SelfAdjoint)==SelfAdjoint
+    LhsIsUpper = (LhsMode & (Upper | Lower)) == Upper,
+    LhsIsSelfAdjoint = (LhsMode & SelfAdjoint) == SelfAdjoint,
+    RhsIsUpper = (RhsMode & (Upper | Lower)) == Upper,
+    RhsIsSelfAdjoint = (RhsMode & SelfAdjoint) == SelfAdjoint
   };
-  
-  template<typename Dest>
-  static void run(Dest &dst, const Lhs &a_lhs, const Rhs &a_rhs, const Scalar& alpha)
-  {
-    eigen_assert(dst.rows()==a_lhs.rows() && dst.cols()==a_rhs.cols());
+
+  template <typename Dest>
+  static void run(Dest& dst, const Lhs& a_lhs, const Rhs& a_rhs, const Scalar& alpha) {
+    eigen_assert(dst.rows() == a_lhs.rows() && dst.cols() == a_rhs.cols());
 
     add_const_on_value_type_t<ActualLhsType> lhs = LhsBlasTraits::extract(a_lhs);
     add_const_on_value_type_t<ActualRhsType> rhs = RhsBlasTraits::extract(a_rhs);
 
-    Scalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(a_lhs)
-                               * RhsBlasTraits::extractScalarFactor(a_rhs);
+    Scalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(a_lhs) * RhsBlasTraits::extractScalarFactor(a_rhs);
 
-    typedef internal::gemm_blocking_space<(Dest::Flags&RowMajorBit) ? RowMajor : ColMajor,Scalar,Scalar,
-              Lhs::MaxRowsAtCompileTime, Rhs::MaxColsAtCompileTime, Lhs::MaxColsAtCompileTime,1> BlockingType;
+    typedef internal::gemm_blocking_space<(Dest::Flags & RowMajorBit) ? RowMajor : ColMajor, Scalar, Scalar,
+                                          Lhs::MaxRowsAtCompileTime, Rhs::MaxColsAtCompileTime,
+                                          Lhs::MaxColsAtCompileTime, 1>
+        BlockingType;
 
     BlockingType blocking(lhs.rows(), rhs.cols(), lhs.cols(), 1, false);
 
-    internal::product_selfadjoint_matrix<Scalar, Index,
-      internal::logical_xor(LhsIsUpper, internal::traits<Lhs>::Flags &RowMajorBit) ? RowMajor : ColMajor, LhsIsSelfAdjoint,
-      NumTraits<Scalar>::IsComplex && internal::logical_xor(LhsIsUpper, bool(LhsBlasTraits::NeedToConjugate)),
-      internal::logical_xor(RhsIsUpper, internal::traits<Rhs>::Flags &RowMajorBit) ? RowMajor : ColMajor, RhsIsSelfAdjoint,
-      NumTraits<Scalar>::IsComplex && internal::logical_xor(RhsIsUpper, bool(RhsBlasTraits::NeedToConjugate)),
-      internal::traits<Dest>::Flags&RowMajorBit  ? RowMajor : ColMajor,
-      Dest::InnerStrideAtCompileTime>
-      ::run(
-        lhs.rows(), rhs.cols(),                 // sizes
-        &lhs.coeffRef(0,0), lhs.outerStride(),  // lhs info
-        &rhs.coeffRef(0,0), rhs.outerStride(),  // rhs info
-        &dst.coeffRef(0,0), dst.innerStride(), dst.outerStride(),  // result info
-        actualAlpha, blocking                   // alpha
-      );
+    internal::product_selfadjoint_matrix<
+        Scalar, Index,
+        internal::logical_xor(LhsIsUpper, internal::traits<Lhs>::Flags & RowMajorBit) ? RowMajor : ColMajor,
+        LhsIsSelfAdjoint,
+        NumTraits<Scalar>::IsComplex && internal::logical_xor(LhsIsUpper, bool(LhsBlasTraits::NeedToConjugate)),
+        internal::logical_xor(RhsIsUpper, internal::traits<Rhs>::Flags & RowMajorBit) ? RowMajor : ColMajor,
+        RhsIsSelfAdjoint,
+        NumTraits<Scalar>::IsComplex && internal::logical_xor(RhsIsUpper, bool(RhsBlasTraits::NeedToConjugate)),
+        internal::traits<Dest>::Flags & RowMajorBit ? RowMajor : ColMajor,
+        Dest::InnerStrideAtCompileTime>::run(lhs.rows(), rhs.cols(),                                     // sizes
+                                             &lhs.coeffRef(0, 0), lhs.outerStride(),                     // lhs info
+                                             &rhs.coeffRef(0, 0), rhs.outerStride(),                     // rhs info
+                                             &dst.coeffRef(0, 0), dst.innerStride(), dst.outerStride(),  // result info
+                                             actualAlpha, blocking                                       // alpha
+    );
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SELFADJOINT_MATRIX_MATRIX_H
+#endif  // EIGEN_SELFADJOINT_MATRIX_MATRIX_H
diff --git a/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h b/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h
index 9aa56a2..25daba6 100644
--- a/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h
+++ b/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h
@@ -36,125 +36,112 @@
 // IWYU pragma: private
 #include "../InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
-
 /* Optimized selfadjoint matrix * matrix (?SYMM/?HEMM) product */
 
-#define EIGEN_BLAS_SYMM_L(EIGTYPE, BLASTYPE, EIGPREFIX, BLASFUNC) \
-template <typename Index, \
-          int LhsStorageOrder, bool ConjugateLhs, \
-          int RhsStorageOrder, bool ConjugateRhs> \
-struct product_selfadjoint_matrix<EIGTYPE,Index,LhsStorageOrder,true,ConjugateLhs,RhsStorageOrder,false,ConjugateRhs,ColMajor,1> \
-{\
-\
-  static void run( \
-    Index rows, Index cols, \
-    const EIGTYPE* _lhs, Index lhsStride, \
-    const EIGTYPE* _rhs, Index rhsStride, \
-    EIGTYPE* res,        Index resIncr, Index resStride, \
-    EIGTYPE alpha, level3_blocking<EIGTYPE, EIGTYPE>& /*blocking*/) \
-  { \
-    EIGEN_ONLY_USED_FOR_DEBUG(resIncr); \
-    eigen_assert(resIncr == 1); \
-    char side='L', uplo='L'; \
-    BlasIndex m, n, lda, ldb, ldc; \
-    const EIGTYPE *a, *b; \
-    EIGTYPE beta(1); \
-    MatrixX##EIGPREFIX b_tmp; \
-\
-/* Set transpose options */ \
-/* Set m, n, k */ \
-    m = convert_index<BlasIndex>(rows);  \
-    n = convert_index<BlasIndex>(cols);  \
-\
-/* Set lda, ldb, ldc */ \
-    lda = convert_index<BlasIndex>(lhsStride); \
-    ldb = convert_index<BlasIndex>(rhsStride); \
-    ldc = convert_index<BlasIndex>(resStride); \
-\
-/* Set a, b, c */ \
-    if (LhsStorageOrder==RowMajor) uplo='U'; \
-    a = _lhs; \
-\
-    if (RhsStorageOrder==RowMajor) { \
-      Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > rhs(_rhs,n,m,OuterStride<>(rhsStride)); \
-      b_tmp = rhs.adjoint(); \
-      b = b_tmp.data(); \
-      ldb = convert_index<BlasIndex>(b_tmp.outerStride()); \
-    } else b = _rhs; \
-\
-    BLASFUNC(&side, &uplo, &m, &n, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (const BLASTYPE*)b, &ldb, (const BLASTYPE*)&numext::real_ref(beta), (BLASTYPE*)res, &ldc); \
-\
-  } \
-};
+#define EIGEN_BLAS_SYMM_L(EIGTYPE, BLASTYPE, EIGPREFIX, BLASFUNC)                                                \
+  template <typename Index, int LhsStorageOrder, bool ConjugateLhs, int RhsStorageOrder, bool ConjugateRhs>      \
+  struct product_selfadjoint_matrix<EIGTYPE, Index, LhsStorageOrder, true, ConjugateLhs, RhsStorageOrder, false, \
+                                    ConjugateRhs, ColMajor, 1> {                                                 \
+    static void run(Index rows, Index cols, const EIGTYPE* _lhs, Index lhsStride, const EIGTYPE* _rhs,           \
+                    Index rhsStride, EIGTYPE* res, Index resIncr, Index resStride, EIGTYPE alpha,                \
+                    level3_blocking<EIGTYPE, EIGTYPE>& /*blocking*/) {                                           \
+      EIGEN_ONLY_USED_FOR_DEBUG(resIncr);                                                                        \
+      eigen_assert(resIncr == 1);                                                                                \
+      char side = 'L', uplo = 'L';                                                                               \
+      BlasIndex m, n, lda, ldb, ldc;                                                                             \
+      const EIGTYPE *a, *b;                                                                                      \
+      EIGTYPE beta(1);                                                                                           \
+      MatrixX##EIGPREFIX b_tmp;                                                                                  \
+                                                                                                                 \
+      /* Set transpose options */                                                                                \
+      /* Set m, n, k */                                                                                          \
+      m = convert_index<BlasIndex>(rows);                                                                        \
+      n = convert_index<BlasIndex>(cols);                                                                        \
+                                                                                                                 \
+      /* Set lda, ldb, ldc */                                                                                    \
+      lda = convert_index<BlasIndex>(lhsStride);                                                                 \
+      ldb = convert_index<BlasIndex>(rhsStride);                                                                 \
+      ldc = convert_index<BlasIndex>(resStride);                                                                 \
+                                                                                                                 \
+      /* Set a, b, c */                                                                                          \
+      if (LhsStorageOrder == RowMajor) uplo = 'U';                                                               \
+      a = _lhs;                                                                                                  \
+                                                                                                                 \
+      if (RhsStorageOrder == RowMajor) {                                                                         \
+        Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > rhs(_rhs, n, m, OuterStride<>(rhsStride));              \
+        b_tmp = rhs.adjoint();                                                                                   \
+        b = b_tmp.data();                                                                                        \
+        ldb = convert_index<BlasIndex>(b_tmp.outerStride());                                                     \
+      } else                                                                                                     \
+        b = _rhs;                                                                                                \
+                                                                                                                 \
+      BLASFUNC(&side, &uplo, &m, &n, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)a, &lda,        \
+               (const BLASTYPE*)b, &ldb, (const BLASTYPE*)&numext::real_ref(beta), (BLASTYPE*)res, &ldc);        \
+    }                                                                                                            \
+  };
 
-
-#define EIGEN_BLAS_HEMM_L(EIGTYPE, BLASTYPE, EIGPREFIX, BLASFUNC) \
-template <typename Index, \
-          int LhsStorageOrder, bool ConjugateLhs, \
-          int RhsStorageOrder, bool ConjugateRhs> \
-struct product_selfadjoint_matrix<EIGTYPE,Index,LhsStorageOrder,true,ConjugateLhs,RhsStorageOrder,false,ConjugateRhs,ColMajor,1> \
-{\
-  static void run( \
-    Index rows, Index cols, \
-    const EIGTYPE* _lhs, Index lhsStride, \
-    const EIGTYPE* _rhs, Index rhsStride, \
-    EIGTYPE* res,        Index resIncr, Index resStride, \
-    EIGTYPE alpha, level3_blocking<EIGTYPE, EIGTYPE>& /*blocking*/) \
-  { \
-    EIGEN_ONLY_USED_FOR_DEBUG(resIncr); \
-    eigen_assert(resIncr == 1); \
-    char side='L', uplo='L'; \
-    BlasIndex m, n, lda, ldb, ldc; \
-    const EIGTYPE *a, *b; \
-    EIGTYPE beta(1); \
-    MatrixX##EIGPREFIX b_tmp; \
-    Matrix<EIGTYPE, Dynamic, Dynamic, LhsStorageOrder> a_tmp; \
-\
-/* Set transpose options */ \
-/* Set m, n, k */ \
-    m = convert_index<BlasIndex>(rows); \
-    n = convert_index<BlasIndex>(cols); \
-\
-/* Set lda, ldb, ldc */ \
-    lda = convert_index<BlasIndex>(lhsStride); \
-    ldb = convert_index<BlasIndex>(rhsStride); \
-    ldc = convert_index<BlasIndex>(resStride); \
-\
-/* Set a, b, c */ \
-    if (((LhsStorageOrder==ColMajor) && ConjugateLhs) || ((LhsStorageOrder==RowMajor) && (!ConjugateLhs))) { \
-      Map<const Matrix<EIGTYPE, Dynamic, Dynamic, LhsStorageOrder>, 0, OuterStride<> > lhs(_lhs,m,m,OuterStride<>(lhsStride)); \
-      a_tmp = lhs.conjugate(); \
-      a = a_tmp.data(); \
-      lda = convert_index<BlasIndex>(a_tmp.outerStride()); \
-    } else a = _lhs; \
-    if (LhsStorageOrder==RowMajor) uplo='U'; \
-\
-    if (RhsStorageOrder==ColMajor && (!ConjugateRhs)) { \
-       b = _rhs; } \
-    else { \
-      if (RhsStorageOrder==ColMajor && ConjugateRhs) { \
-        Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > rhs(_rhs,m,n,OuterStride<>(rhsStride)); \
-        b_tmp = rhs.conjugate(); \
-      } else \
-      if (ConjugateRhs) { \
-        Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > rhs(_rhs,n,m,OuterStride<>(rhsStride)); \
-        b_tmp = rhs.adjoint(); \
-      } else { \
-        Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > rhs(_rhs,n,m,OuterStride<>(rhsStride)); \
-        b_tmp = rhs.transpose(); \
-      } \
-      b = b_tmp.data(); \
-      ldb = convert_index<BlasIndex>(b_tmp.outerStride()); \
-    } \
-\
-    BLASFUNC(&side, &uplo, &m, &n, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (const BLASTYPE*)b, &ldb, (const BLASTYPE*)&numext::real_ref(beta), (BLASTYPE*)res, &ldc); \
-\
-  } \
-};
+#define EIGEN_BLAS_HEMM_L(EIGTYPE, BLASTYPE, EIGPREFIX, BLASFUNC)                                                  \
+  template <typename Index, int LhsStorageOrder, bool ConjugateLhs, int RhsStorageOrder, bool ConjugateRhs>        \
+  struct product_selfadjoint_matrix<EIGTYPE, Index, LhsStorageOrder, true, ConjugateLhs, RhsStorageOrder, false,   \
+                                    ConjugateRhs, ColMajor, 1> {                                                   \
+    static void run(Index rows, Index cols, const EIGTYPE* _lhs, Index lhsStride, const EIGTYPE* _rhs,             \
+                    Index rhsStride, EIGTYPE* res, Index resIncr, Index resStride, EIGTYPE alpha,                  \
+                    level3_blocking<EIGTYPE, EIGTYPE>& /*blocking*/) {                                             \
+      EIGEN_ONLY_USED_FOR_DEBUG(resIncr);                                                                          \
+      eigen_assert(resIncr == 1);                                                                                  \
+      char side = 'L', uplo = 'L';                                                                                 \
+      BlasIndex m, n, lda, ldb, ldc;                                                                               \
+      const EIGTYPE *a, *b;                                                                                        \
+      EIGTYPE beta(1);                                                                                             \
+      MatrixX##EIGPREFIX b_tmp;                                                                                    \
+      Matrix<EIGTYPE, Dynamic, Dynamic, LhsStorageOrder> a_tmp;                                                    \
+                                                                                                                   \
+      /* Set transpose options */                                                                                  \
+      /* Set m, n, k */                                                                                            \
+      m = convert_index<BlasIndex>(rows);                                                                          \
+      n = convert_index<BlasIndex>(cols);                                                                          \
+                                                                                                                   \
+      /* Set lda, ldb, ldc */                                                                                      \
+      lda = convert_index<BlasIndex>(lhsStride);                                                                   \
+      ldb = convert_index<BlasIndex>(rhsStride);                                                                   \
+      ldc = convert_index<BlasIndex>(resStride);                                                                   \
+                                                                                                                   \
+      /* Set a, b, c */                                                                                            \
+      if (((LhsStorageOrder == ColMajor) && ConjugateLhs) || ((LhsStorageOrder == RowMajor) && (!ConjugateLhs))) { \
+        Map<const Matrix<EIGTYPE, Dynamic, Dynamic, LhsStorageOrder>, 0, OuterStride<> > lhs(                      \
+            _lhs, m, m, OuterStride<>(lhsStride));                                                                 \
+        a_tmp = lhs.conjugate();                                                                                   \
+        a = a_tmp.data();                                                                                          \
+        lda = convert_index<BlasIndex>(a_tmp.outerStride());                                                       \
+      } else                                                                                                       \
+        a = _lhs;                                                                                                  \
+      if (LhsStorageOrder == RowMajor) uplo = 'U';                                                                 \
+                                                                                                                   \
+      if (RhsStorageOrder == ColMajor && (!ConjugateRhs)) {                                                        \
+        b = _rhs;                                                                                                  \
+      } else {                                                                                                     \
+        if (RhsStorageOrder == ColMajor && ConjugateRhs) {                                                         \
+          Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > rhs(_rhs, m, n, OuterStride<>(rhsStride));              \
+          b_tmp = rhs.conjugate();                                                                                 \
+        } else if (ConjugateRhs) {                                                                                 \
+          Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > rhs(_rhs, n, m, OuterStride<>(rhsStride));              \
+          b_tmp = rhs.adjoint();                                                                                   \
+        } else {                                                                                                   \
+          Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > rhs(_rhs, n, m, OuterStride<>(rhsStride));              \
+          b_tmp = rhs.transpose();                                                                                 \
+        }                                                                                                          \
+        b = b_tmp.data();                                                                                          \
+        ldb = convert_index<BlasIndex>(b_tmp.outerStride());                                                       \
+      }                                                                                                            \
+                                                                                                                   \
+      BLASFUNC(&side, &uplo, &m, &n, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)a, &lda,          \
+               (const BLASTYPE*)b, &ldb, (const BLASTYPE*)&numext::real_ref(beta), (BLASTYPE*)res, &ldc);          \
+    }                                                                                                              \
+  };
 
 #ifdef EIGEN_USE_MKL
 EIGEN_BLAS_SYMM_L(double, double, d, dsymm)
@@ -170,115 +157,104 @@
 
 /* Optimized matrix * selfadjoint matrix (?SYMM/?HEMM) product */
 
-#define EIGEN_BLAS_SYMM_R(EIGTYPE, BLASTYPE, EIGPREFIX, BLASFUNC) \
-template <typename Index, \
-          int LhsStorageOrder, bool ConjugateLhs, \
-          int RhsStorageOrder, bool ConjugateRhs> \
-struct product_selfadjoint_matrix<EIGTYPE,Index,LhsStorageOrder,false,ConjugateLhs,RhsStorageOrder,true,ConjugateRhs,ColMajor,1> \
-{\
-\
-  static void run( \
-    Index rows, Index cols, \
-    const EIGTYPE* _lhs, Index lhsStride, \
-    const EIGTYPE* _rhs, Index rhsStride, \
-    EIGTYPE* res,        Index resIncr, Index resStride, \
-    EIGTYPE alpha, level3_blocking<EIGTYPE, EIGTYPE>& /*blocking*/) \
-  { \
-    EIGEN_ONLY_USED_FOR_DEBUG(resIncr); \
-    eigen_assert(resIncr == 1); \
-    char side='R', uplo='L'; \
-    BlasIndex m, n, lda, ldb, ldc; \
-    const EIGTYPE *a, *b; \
-    EIGTYPE beta(1); \
-    MatrixX##EIGPREFIX b_tmp; \
-\
-/* Set m, n, k */ \
-    m = convert_index<BlasIndex>(rows);  \
-    n = convert_index<BlasIndex>(cols);  \
-\
-/* Set lda, ldb, ldc */ \
-    lda = convert_index<BlasIndex>(rhsStride); \
-    ldb = convert_index<BlasIndex>(lhsStride); \
-    ldc = convert_index<BlasIndex>(resStride); \
-\
-/* Set a, b, c */ \
-    if (RhsStorageOrder==RowMajor) uplo='U'; \
-    a = _rhs; \
-\
-    if (LhsStorageOrder==RowMajor) { \
-      Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > lhs(_lhs,n,m,OuterStride<>(rhsStride)); \
-      b_tmp = lhs.adjoint(); \
-      b = b_tmp.data(); \
-      ldb = convert_index<BlasIndex>(b_tmp.outerStride()); \
-    } else b = _lhs; \
-\
-    BLASFUNC(&side, &uplo, &m, &n, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (const BLASTYPE*)b, &ldb, (const BLASTYPE*)&numext::real_ref(beta), (BLASTYPE*)res, &ldc); \
-\
-  } \
-};
+#define EIGEN_BLAS_SYMM_R(EIGTYPE, BLASTYPE, EIGPREFIX, BLASFUNC)                                                \
+  template <typename Index, int LhsStorageOrder, bool ConjugateLhs, int RhsStorageOrder, bool ConjugateRhs>      \
+  struct product_selfadjoint_matrix<EIGTYPE, Index, LhsStorageOrder, false, ConjugateLhs, RhsStorageOrder, true, \
+                                    ConjugateRhs, ColMajor, 1> {                                                 \
+    static void run(Index rows, Index cols, const EIGTYPE* _lhs, Index lhsStride, const EIGTYPE* _rhs,           \
+                    Index rhsStride, EIGTYPE* res, Index resIncr, Index resStride, EIGTYPE alpha,                \
+                    level3_blocking<EIGTYPE, EIGTYPE>& /*blocking*/) {                                           \
+      EIGEN_ONLY_USED_FOR_DEBUG(resIncr);                                                                        \
+      eigen_assert(resIncr == 1);                                                                                \
+      char side = 'R', uplo = 'L';                                                                               \
+      BlasIndex m, n, lda, ldb, ldc;                                                                             \
+      const EIGTYPE *a, *b;                                                                                      \
+      EIGTYPE beta(1);                                                                                           \
+      MatrixX##EIGPREFIX b_tmp;                                                                                  \
+                                                                                                                 \
+      /* Set m, n, k */                                                                                          \
+      m = convert_index<BlasIndex>(rows);                                                                        \
+      n = convert_index<BlasIndex>(cols);                                                                        \
+                                                                                                                 \
+      /* Set lda, ldb, ldc */                                                                                    \
+      lda = convert_index<BlasIndex>(rhsStride);                                                                 \
+      ldb = convert_index<BlasIndex>(lhsStride);                                                                 \
+      ldc = convert_index<BlasIndex>(resStride);                                                                 \
+                                                                                                                 \
+      /* Set a, b, c */                                                                                          \
+      if (RhsStorageOrder == RowMajor) uplo = 'U';                                                               \
+      a = _rhs;                                                                                                  \
+                                                                                                                 \
+      if (LhsStorageOrder == RowMajor) {                                                                         \
+        Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > lhs(_lhs, n, m, OuterStride<>(rhsStride));              \
+        b_tmp = lhs.adjoint();                                                                                   \
+        b = b_tmp.data();                                                                                        \
+        ldb = convert_index<BlasIndex>(b_tmp.outerStride());                                                     \
+      } else                                                                                                     \
+        b = _lhs;                                                                                                \
+                                                                                                                 \
+      BLASFUNC(&side, &uplo, &m, &n, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)a, &lda,        \
+               (const BLASTYPE*)b, &ldb, (const BLASTYPE*)&numext::real_ref(beta), (BLASTYPE*)res, &ldc);        \
+    }                                                                                                            \
+  };
 
-
-#define EIGEN_BLAS_HEMM_R(EIGTYPE, BLASTYPE, EIGPREFIX, BLASFUNC) \
-template <typename Index, \
-          int LhsStorageOrder, bool ConjugateLhs, \
-          int RhsStorageOrder, bool ConjugateRhs> \
-struct product_selfadjoint_matrix<EIGTYPE,Index,LhsStorageOrder,false,ConjugateLhs,RhsStorageOrder,true,ConjugateRhs,ColMajor,1> \
-{\
-  static void run( \
-    Index rows, Index cols, \
-    const EIGTYPE* _lhs, Index lhsStride, \
-    const EIGTYPE* _rhs, Index rhsStride, \
-    EIGTYPE* res,        Index resIncr, Index resStride, \
-    EIGTYPE alpha, level3_blocking<EIGTYPE, EIGTYPE>& /*blocking*/) \
-  { \
-    EIGEN_ONLY_USED_FOR_DEBUG(resIncr); \
-    eigen_assert(resIncr == 1); \
-    char side='R', uplo='L'; \
-    BlasIndex m, n, lda, ldb, ldc; \
-    const EIGTYPE *a, *b; \
-    EIGTYPE beta(1); \
-    MatrixX##EIGPREFIX b_tmp; \
-    Matrix<EIGTYPE, Dynamic, Dynamic, RhsStorageOrder> a_tmp; \
-\
-/* Set m, n, k */ \
-    m = convert_index<BlasIndex>(rows); \
-    n = convert_index<BlasIndex>(cols); \
-\
-/* Set lda, ldb, ldc */ \
-    lda = convert_index<BlasIndex>(rhsStride); \
-    ldb = convert_index<BlasIndex>(lhsStride); \
-    ldc = convert_index<BlasIndex>(resStride); \
-\
-/* Set a, b, c */ \
-    if (((RhsStorageOrder==ColMajor) && ConjugateRhs) || ((RhsStorageOrder==RowMajor) && (!ConjugateRhs))) { \
-      Map<const Matrix<EIGTYPE, Dynamic, Dynamic, RhsStorageOrder>, 0, OuterStride<> > rhs(_rhs,n,n,OuterStride<>(rhsStride)); \
-      a_tmp = rhs.conjugate(); \
-      a = a_tmp.data(); \
-      lda = convert_index<BlasIndex>(a_tmp.outerStride()); \
-    } else a = _rhs; \
-    if (RhsStorageOrder==RowMajor) uplo='U'; \
-\
-    if (LhsStorageOrder==ColMajor && (!ConjugateLhs)) { \
-       b = _lhs; } \
-    else { \
-      if (LhsStorageOrder==ColMajor && ConjugateLhs) { \
-        Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > lhs(_lhs,m,n,OuterStride<>(lhsStride)); \
-        b_tmp = lhs.conjugate(); \
-      } else \
-      if (ConjugateLhs) { \
-        Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > lhs(_lhs,n,m,OuterStride<>(lhsStride)); \
-        b_tmp = lhs.adjoint(); \
-      } else { \
-        Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > lhs(_lhs,n,m,OuterStride<>(lhsStride)); \
-        b_tmp = lhs.transpose(); \
-      } \
-      b = b_tmp.data(); \
-      ldb = convert_index<BlasIndex>(b_tmp.outerStride()); \
-    } \
-\
-    BLASFUNC(&side, &uplo, &m, &n, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (const BLASTYPE*)b, &ldb, (const BLASTYPE*)&numext::real_ref(beta), (BLASTYPE*)res, &ldc); \
-  } \
-};
+#define EIGEN_BLAS_HEMM_R(EIGTYPE, BLASTYPE, EIGPREFIX, BLASFUNC)                                                  \
+  template <typename Index, int LhsStorageOrder, bool ConjugateLhs, int RhsStorageOrder, bool ConjugateRhs>        \
+  struct product_selfadjoint_matrix<EIGTYPE, Index, LhsStorageOrder, false, ConjugateLhs, RhsStorageOrder, true,   \
+                                    ConjugateRhs, ColMajor, 1> {                                                   \
+    static void run(Index rows, Index cols, const EIGTYPE* _lhs, Index lhsStride, const EIGTYPE* _rhs,             \
+                    Index rhsStride, EIGTYPE* res, Index resIncr, Index resStride, EIGTYPE alpha,                  \
+                    level3_blocking<EIGTYPE, EIGTYPE>& /*blocking*/) {                                             \
+      EIGEN_ONLY_USED_FOR_DEBUG(resIncr);                                                                          \
+      eigen_assert(resIncr == 1);                                                                                  \
+      char side = 'R', uplo = 'L';                                                                                 \
+      BlasIndex m, n, lda, ldb, ldc;                                                                               \
+      const EIGTYPE *a, *b;                                                                                        \
+      EIGTYPE beta(1);                                                                                             \
+      MatrixX##EIGPREFIX b_tmp;                                                                                    \
+      Matrix<EIGTYPE, Dynamic, Dynamic, RhsStorageOrder> a_tmp;                                                    \
+                                                                                                                   \
+      /* Set m, n, k */                                                                                            \
+      m = convert_index<BlasIndex>(rows);                                                                          \
+      n = convert_index<BlasIndex>(cols);                                                                          \
+                                                                                                                   \
+      /* Set lda, ldb, ldc */                                                                                      \
+      lda = convert_index<BlasIndex>(rhsStride);                                                                   \
+      ldb = convert_index<BlasIndex>(lhsStride);                                                                   \
+      ldc = convert_index<BlasIndex>(resStride);                                                                   \
+                                                                                                                   \
+      /* Set a, b, c */                                                                                            \
+      if (((RhsStorageOrder == ColMajor) && ConjugateRhs) || ((RhsStorageOrder == RowMajor) && (!ConjugateRhs))) { \
+        Map<const Matrix<EIGTYPE, Dynamic, Dynamic, RhsStorageOrder>, 0, OuterStride<> > rhs(                      \
+            _rhs, n, n, OuterStride<>(rhsStride));                                                                 \
+        a_tmp = rhs.conjugate();                                                                                   \
+        a = a_tmp.data();                                                                                          \
+        lda = convert_index<BlasIndex>(a_tmp.outerStride());                                                       \
+      } else                                                                                                       \
+        a = _rhs;                                                                                                  \
+      if (RhsStorageOrder == RowMajor) uplo = 'U';                                                                 \
+                                                                                                                   \
+      if (LhsStorageOrder == ColMajor && (!ConjugateLhs)) {                                                        \
+        b = _lhs;                                                                                                  \
+      } else {                                                                                                     \
+        if (LhsStorageOrder == ColMajor && ConjugateLhs) {                                                         \
+          Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > lhs(_lhs, m, n, OuterStride<>(lhsStride));              \
+          b_tmp = lhs.conjugate();                                                                                 \
+        } else if (ConjugateLhs) {                                                                                 \
+          Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > lhs(_lhs, n, m, OuterStride<>(lhsStride));              \
+          b_tmp = lhs.adjoint();                                                                                   \
+        } else {                                                                                                   \
+          Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > lhs(_lhs, n, m, OuterStride<>(lhsStride));              \
+          b_tmp = lhs.transpose();                                                                                 \
+        }                                                                                                          \
+        b = b_tmp.data();                                                                                          \
+        ldb = convert_index<BlasIndex>(b_tmp.outerStride());                                                       \
+      }                                                                                                            \
+                                                                                                                   \
+      BLASFUNC(&side, &uplo, &m, &n, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)a, &lda,          \
+               (const BLASTYPE*)b, &ldb, (const BLASTYPE*)&numext::real_ref(beta), (BLASTYPE*)res, &ldc);          \
+    }                                                                                                              \
+  };
 
 #ifdef EIGEN_USE_MKL
 EIGEN_BLAS_SYMM_R(double, double, d, dsymm)
@@ -291,8 +267,8 @@
 EIGEN_BLAS_HEMM_R(dcomplex, double, cd, zhemm_)
 EIGEN_BLAS_HEMM_R(scomplex, float, cf, chemm_)
 #endif
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SELFADJOINT_MATRIX_MATRIX_BLAS_H
+#endif  // EIGEN_SELFADJOINT_MATRIX_MATRIX_BLAS_H
diff --git a/Eigen/src/Core/products/SelfadjointMatrixVector.h b/Eigen/src/Core/products/SelfadjointMatrixVector.h
index 0aac52e..9333d16 100644
--- a/Eigen/src/Core/products/SelfadjointMatrixVector.h
+++ b/Eigen/src/Core/products/SelfadjointMatrixVector.h
@@ -13,7 +13,7 @@
 // IWYU pragma: private
 #include "../InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
@@ -23,63 +23,54 @@
  * the instruction dependency.
  */
 
-template<typename Scalar, typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs, int Version=Specialized>
+template <typename Scalar, typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs,
+          int Version = Specialized>
 struct selfadjoint_matrix_vector_product;
 
-template<typename Scalar, typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs, int Version>
+template <typename Scalar, typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs,
+          int Version>
 struct selfadjoint_matrix_vector_product
 
 {
-static EIGEN_DONT_INLINE EIGEN_DEVICE_FUNC
-void run(
-  Index size,
-  const Scalar*  lhs, Index lhsStride,
-  const Scalar*  rhs,
-  Scalar* res,
-  Scalar alpha);
+  static EIGEN_DONT_INLINE EIGEN_DEVICE_FUNC void run(Index size, const Scalar* lhs, Index lhsStride, const Scalar* rhs,
+                                                      Scalar* res, Scalar alpha);
 };
 
-template<typename Scalar, typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs, int Version>
-EIGEN_DONT_INLINE EIGEN_DEVICE_FUNC
-void selfadjoint_matrix_vector_product<Scalar,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs,Version>::run(
-  Index size,
-  const Scalar*  lhs, Index lhsStride,
-  const Scalar*  rhs,
-  Scalar* res,
-  Scalar alpha)
-{
+template <typename Scalar, typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs,
+          int Version>
+EIGEN_DONT_INLINE EIGEN_DEVICE_FUNC void
+selfadjoint_matrix_vector_product<Scalar, Index, StorageOrder, UpLo, ConjugateLhs, ConjugateRhs, Version>::run(
+    Index size, const Scalar* lhs, Index lhsStride, const Scalar* rhs, Scalar* res, Scalar alpha) {
   typedef typename packet_traits<Scalar>::type Packet;
   typedef typename NumTraits<Scalar>::Real RealScalar;
-  const Index PacketSize = sizeof(Packet)/sizeof(Scalar);
+  const Index PacketSize = sizeof(Packet) / sizeof(Scalar);
 
   enum {
-    IsRowMajor = StorageOrder==RowMajor ? 1 : 0,
+    IsRowMajor = StorageOrder == RowMajor ? 1 : 0,
     IsLower = UpLo == Lower ? 1 : 0,
     FirstTriangular = IsRowMajor == IsLower
   };
 
-  conj_helper<Scalar,Scalar,NumTraits<Scalar>::IsComplex && logical_xor(ConjugateLhs,  IsRowMajor), ConjugateRhs> cj0;
-  conj_helper<Scalar,Scalar,NumTraits<Scalar>::IsComplex && logical_xor(ConjugateLhs, !IsRowMajor), ConjugateRhs> cj1;
-  conj_helper<RealScalar,Scalar,false, ConjugateRhs> cjd;
+  conj_helper<Scalar, Scalar, NumTraits<Scalar>::IsComplex && logical_xor(ConjugateLhs, IsRowMajor), ConjugateRhs> cj0;
+  conj_helper<Scalar, Scalar, NumTraits<Scalar>::IsComplex && logical_xor(ConjugateLhs, !IsRowMajor), ConjugateRhs> cj1;
+  conj_helper<RealScalar, Scalar, false, ConjugateRhs> cjd;
 
-  conj_helper<Packet,Packet,NumTraits<Scalar>::IsComplex && logical_xor(ConjugateLhs,  IsRowMajor), ConjugateRhs> pcj0;
-  conj_helper<Packet,Packet,NumTraits<Scalar>::IsComplex && logical_xor(ConjugateLhs, !IsRowMajor), ConjugateRhs> pcj1;
+  conj_helper<Packet, Packet, NumTraits<Scalar>::IsComplex && logical_xor(ConjugateLhs, IsRowMajor), ConjugateRhs> pcj0;
+  conj_helper<Packet, Packet, NumTraits<Scalar>::IsComplex && logical_xor(ConjugateLhs, !IsRowMajor), ConjugateRhs>
+      pcj1;
 
   Scalar cjAlpha = ConjugateRhs ? numext::conj(alpha) : alpha;
 
-  Index bound = numext::maxi(Index(0), size-8) & 0xfffffffe;
-  if (FirstTriangular)
-    bound = size - bound;
+  Index bound = numext::maxi(Index(0), size - 8) & 0xfffffffe;
+  if (FirstTriangular) bound = size - bound;
 
-  for (Index j=FirstTriangular ? bound : 0;
-       j<(FirstTriangular ? size : bound);j+=2)
-  {
-    const Scalar* EIGEN_RESTRICT A0 = lhs + j*lhsStride;
-    const Scalar* EIGEN_RESTRICT A1 = lhs + (j+1)*lhsStride;
+  for (Index j = FirstTriangular ? bound : 0; j < (FirstTriangular ? size : bound); j += 2) {
+    const Scalar* EIGEN_RESTRICT A0 = lhs + j * lhsStride;
+    const Scalar* EIGEN_RESTRICT A1 = lhs + (j + 1) * lhsStride;
 
     Scalar t0 = cjAlpha * rhs[j];
     Packet ptmp0 = pset1<Packet>(t0);
-    Scalar t1 = cjAlpha * rhs[j+1];
+    Scalar t1 = cjAlpha * rhs[j + 1];
     Packet ptmp1 = pset1<Packet>(t1);
 
     Scalar t2(0);
@@ -87,67 +78,63 @@
     Scalar t3(0);
     Packet ptmp3 = pset1<Packet>(t3);
 
-    Index starti = FirstTriangular ? 0 : j+2;
-    Index endi   = FirstTriangular ? j : size;
-    Index alignedStart = (starti) + internal::first_default_aligned(&res[starti], endi-starti);
-    Index alignedEnd = alignedStart + ((endi-alignedStart)/(PacketSize))*(PacketSize);
+    Index starti = FirstTriangular ? 0 : j + 2;
+    Index endi = FirstTriangular ? j : size;
+    Index alignedStart = (starti) + internal::first_default_aligned(&res[starti], endi - starti);
+    Index alignedEnd = alignedStart + ((endi - alignedStart) / (PacketSize)) * (PacketSize);
 
-    res[j]   += cjd.pmul(numext::real(A0[j]), t0);
-    res[j+1] += cjd.pmul(numext::real(A1[j+1]), t1);
-    if(FirstTriangular)
-    {
-      res[j]   += cj0.pmul(A1[j],   t1);
-      t3       += cj1.pmul(A1[j],   rhs[j]);
-    }
-    else
-    {
-      res[j+1] += cj0.pmul(A0[j+1],t0);
-      t2 += cj1.pmul(A0[j+1], rhs[j+1]);
+    res[j] += cjd.pmul(numext::real(A0[j]), t0);
+    res[j + 1] += cjd.pmul(numext::real(A1[j + 1]), t1);
+    if (FirstTriangular) {
+      res[j] += cj0.pmul(A1[j], t1);
+      t3 += cj1.pmul(A1[j], rhs[j]);
+    } else {
+      res[j + 1] += cj0.pmul(A0[j + 1], t0);
+      t2 += cj1.pmul(A0[j + 1], rhs[j + 1]);
     }
 
-    for (Index i=starti; i<alignedStart; ++i)
-    {
-      res[i] += cj0.pmul(A0[i], t0) + cj0.pmul(A1[i],t1);
+    for (Index i = starti; i < alignedStart; ++i) {
+      res[i] += cj0.pmul(A0[i], t0) + cj0.pmul(A1[i], t1);
       t2 += cj1.pmul(A0[i], rhs[i]);
       t3 += cj1.pmul(A1[i], rhs[i]);
     }
     // Yes this an optimization for gcc 4.3 and 4.4 (=> huge speed up)
     // gcc 4.2 does this optimization automatically.
-    const Scalar* EIGEN_RESTRICT a0It  = A0  + alignedStart;
-    const Scalar* EIGEN_RESTRICT a1It  = A1  + alignedStart;
+    const Scalar* EIGEN_RESTRICT a0It = A0 + alignedStart;
+    const Scalar* EIGEN_RESTRICT a1It = A1 + alignedStart;
     const Scalar* EIGEN_RESTRICT rhsIt = rhs + alignedStart;
-          Scalar* EIGEN_RESTRICT resIt = res + alignedStart;
-    for (Index i=alignedStart; i<alignedEnd; i+=PacketSize)
-    {
-      Packet A0i = ploadu<Packet>(a0It);  a0It  += PacketSize;
-      Packet A1i = ploadu<Packet>(a1It);  a1It  += PacketSize;
-      Packet Bi  = ploadu<Packet>(rhsIt); rhsIt += PacketSize; // FIXME should be aligned in most cases
-      Packet Xi  = pload <Packet>(resIt);
+    Scalar* EIGEN_RESTRICT resIt = res + alignedStart;
+    for (Index i = alignedStart; i < alignedEnd; i += PacketSize) {
+      Packet A0i = ploadu<Packet>(a0It);
+      a0It += PacketSize;
+      Packet A1i = ploadu<Packet>(a1It);
+      a1It += PacketSize;
+      Packet Bi = ploadu<Packet>(rhsIt);
+      rhsIt += PacketSize;  // FIXME should be aligned in most cases
+      Packet Xi = pload<Packet>(resIt);
 
-      Xi    = pcj0.pmadd(A0i,ptmp0, pcj0.pmadd(A1i,ptmp1,Xi));
-      ptmp2 = pcj1.pmadd(A0i,  Bi, ptmp2);
-      ptmp3 = pcj1.pmadd(A1i,  Bi, ptmp3);
-      pstore(resIt,Xi); resIt += PacketSize;
+      Xi = pcj0.pmadd(A0i, ptmp0, pcj0.pmadd(A1i, ptmp1, Xi));
+      ptmp2 = pcj1.pmadd(A0i, Bi, ptmp2);
+      ptmp3 = pcj1.pmadd(A1i, Bi, ptmp3);
+      pstore(resIt, Xi);
+      resIt += PacketSize;
     }
-    for (Index i=alignedEnd; i<endi; i++)
-    {
-      res[i] += cj0.pmul(A0[i], t0) + cj0.pmul(A1[i],t1);
+    for (Index i = alignedEnd; i < endi; i++) {
+      res[i] += cj0.pmul(A0[i], t0) + cj0.pmul(A1[i], t1);
       t2 += cj1.pmul(A0[i], rhs[i]);
       t3 += cj1.pmul(A1[i], rhs[i]);
     }
 
-    res[j]   += alpha * (t2 + predux(ptmp2));
-    res[j+1] += alpha * (t3 + predux(ptmp3));
+    res[j] += alpha * (t2 + predux(ptmp2));
+    res[j + 1] += alpha * (t3 + predux(ptmp3));
   }
-  for (Index j=FirstTriangular ? 0 : bound;j<(FirstTriangular ? bound : size);j++)
-  {
-    const Scalar* EIGEN_RESTRICT A0 = lhs + j*lhsStride;
+  for (Index j = FirstTriangular ? 0 : bound; j < (FirstTriangular ? bound : size); j++) {
+    const Scalar* EIGEN_RESTRICT A0 = lhs + j * lhsStride;
 
     Scalar t1 = cjAlpha * rhs[j];
     Scalar t2(0);
     res[j] += cjd.pmul(numext::real(A0[j]), t1);
-    for (Index i=FirstTriangular ? 0 : j+1; i<(FirstTriangular ? j : size); i++)
-    {
+    for (Index i = FirstTriangular ? 0 : j + 1; i < (FirstTriangular ? j : size); i++) {
       res[i] += cj0.pmul(A0[i], t1);
       t2 += cj1.pmul(A0[i], rhs[i]);
     }
@@ -155,111 +142,105 @@
   }
 }
 
-} // end namespace internal 
+}  // end namespace internal
 
 /***************************************************************************
-* Wrapper to product_selfadjoint_vector
-***************************************************************************/
+ * Wrapper to product_selfadjoint_vector
+ ***************************************************************************/
 
 namespace internal {
 
-template<typename Lhs, int LhsMode, typename Rhs>
-struct selfadjoint_product_impl<Lhs,LhsMode,false,Rhs,0,true>
-{
-  typedef typename Product<Lhs,Rhs>::Scalar Scalar;
-  
+template <typename Lhs, int LhsMode, typename Rhs>
+struct selfadjoint_product_impl<Lhs, LhsMode, false, Rhs, 0, true> {
+  typedef typename Product<Lhs, Rhs>::Scalar Scalar;
+
   typedef internal::blas_traits<Lhs> LhsBlasTraits;
   typedef typename LhsBlasTraits::DirectLinearAccessType ActualLhsType;
   typedef internal::remove_all_t<ActualLhsType> ActualLhsTypeCleaned;
-  
+
   typedef internal::blas_traits<Rhs> RhsBlasTraits;
   typedef typename RhsBlasTraits::DirectLinearAccessType ActualRhsType;
   typedef internal::remove_all_t<ActualRhsType> ActualRhsTypeCleaned;
 
-  enum { LhsUpLo = LhsMode&(Upper|Lower) };
+  enum { LhsUpLo = LhsMode & (Upper | Lower) };
 
-  template<typename Dest>
-  static EIGEN_DEVICE_FUNC
-  void run(Dest& dest, const Lhs &a_lhs, const Rhs &a_rhs, const Scalar& alpha)
-  {
+  template <typename Dest>
+  static EIGEN_DEVICE_FUNC void run(Dest& dest, const Lhs& a_lhs, const Rhs& a_rhs, const Scalar& alpha) {
     typedef typename Dest::Scalar ResScalar;
     typedef typename Rhs::Scalar RhsScalar;
-    typedef Map<Matrix<ResScalar,Dynamic,1>, plain_enum_min(AlignedMax,internal::packet_traits<ResScalar>::size)> MappedDest;
-    
-    eigen_assert(dest.rows()==a_lhs.rows() && dest.cols()==a_rhs.cols());
+    typedef Map<Matrix<ResScalar, Dynamic, 1>, plain_enum_min(AlignedMax, internal::packet_traits<ResScalar>::size)>
+        MappedDest;
+
+    eigen_assert(dest.rows() == a_lhs.rows() && dest.cols() == a_rhs.cols());
 
     add_const_on_value_type_t<ActualLhsType> lhs = LhsBlasTraits::extract(a_lhs);
     add_const_on_value_type_t<ActualRhsType> rhs = RhsBlasTraits::extract(a_rhs);
 
-    Scalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(a_lhs)
-                               * RhsBlasTraits::extractScalarFactor(a_rhs);
+    Scalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(a_lhs) * RhsBlasTraits::extractScalarFactor(a_rhs);
 
     enum {
-      EvalToDest = (Dest::InnerStrideAtCompileTime==1),
-      UseRhs = (ActualRhsTypeCleaned::InnerStrideAtCompileTime==1)
+      EvalToDest = (Dest::InnerStrideAtCompileTime == 1),
+      UseRhs = (ActualRhsTypeCleaned::InnerStrideAtCompileTime == 1)
     };
-    
-    internal::gemv_static_vector_if<ResScalar,Dest::SizeAtCompileTime,Dest::MaxSizeAtCompileTime,!EvalToDest> static_dest;
-    internal::gemv_static_vector_if<RhsScalar,ActualRhsTypeCleaned::SizeAtCompileTime,ActualRhsTypeCleaned::MaxSizeAtCompileTime,!UseRhs> static_rhs;
 
-    ei_declare_aligned_stack_constructed_variable(ResScalar,actualDestPtr,dest.size(),
+    internal::gemv_static_vector_if<ResScalar, Dest::SizeAtCompileTime, Dest::MaxSizeAtCompileTime, !EvalToDest>
+        static_dest;
+    internal::gemv_static_vector_if<RhsScalar, ActualRhsTypeCleaned::SizeAtCompileTime,
+                                    ActualRhsTypeCleaned::MaxSizeAtCompileTime, !UseRhs>
+        static_rhs;
+
+    ei_declare_aligned_stack_constructed_variable(ResScalar, actualDestPtr, dest.size(),
                                                   EvalToDest ? dest.data() : static_dest.data());
-                                                  
-    ei_declare_aligned_stack_constructed_variable(RhsScalar,actualRhsPtr,rhs.size(),
-        UseRhs ? const_cast<RhsScalar*>(rhs.data()) : static_rhs.data());
-    
-    if(!EvalToDest)
-    {
-      #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
+
+    ei_declare_aligned_stack_constructed_variable(RhsScalar, actualRhsPtr, rhs.size(),
+                                                  UseRhs ? const_cast<RhsScalar*>(rhs.data()) : static_rhs.data());
+
+    if (!EvalToDest) {
+#ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
       Index size = dest.size();
       EIGEN_DENSE_STORAGE_CTOR_PLUGIN
-      #endif
+#endif
       MappedDest(actualDestPtr, dest.size()) = dest;
     }
-      
-    if(!UseRhs)
-    {
-      #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
+
+    if (!UseRhs) {
+#ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
       Index size = rhs.size();
       EIGEN_DENSE_STORAGE_CTOR_PLUGIN
-      #endif
+#endif
       Map<typename ActualRhsTypeCleaned::PlainObject>(actualRhsPtr, rhs.size()) = rhs;
     }
-      
-      
-    internal::selfadjoint_matrix_vector_product<Scalar, Index, (internal::traits<ActualLhsTypeCleaned>::Flags&RowMajorBit) ? RowMajor : ColMajor,
-                                                int(LhsUpLo), bool(LhsBlasTraits::NeedToConjugate), bool(RhsBlasTraits::NeedToConjugate)>::run
-      (
-        lhs.rows(),                             // size
-        &lhs.coeffRef(0,0),  lhs.outerStride(), // lhs info
-        actualRhsPtr,                           // rhs info
-        actualDestPtr,                          // result info
-        actualAlpha                             // scale factor
-      );
-    
-    if(!EvalToDest)
-      dest = MappedDest(actualDestPtr, dest.size());
+
+    internal::selfadjoint_matrix_vector_product<
+        Scalar, Index, (internal::traits<ActualLhsTypeCleaned>::Flags & RowMajorBit) ? RowMajor : ColMajor,
+        int(LhsUpLo), bool(LhsBlasTraits::NeedToConjugate),
+        bool(RhsBlasTraits::NeedToConjugate)>::run(lhs.rows(),                              // size
+                                                   &lhs.coeffRef(0, 0), lhs.outerStride(),  // lhs info
+                                                   actualRhsPtr,                            // rhs info
+                                                   actualDestPtr,                           // result info
+                                                   actualAlpha                              // scale factor
+    );
+
+    if (!EvalToDest) dest = MappedDest(actualDestPtr, dest.size());
   }
 };
 
-template<typename Lhs, typename Rhs, int RhsMode>
-struct selfadjoint_product_impl<Lhs,0,true,Rhs,RhsMode,false>
-{
-  typedef typename Product<Lhs,Rhs>::Scalar Scalar;
-  enum { RhsUpLo = RhsMode&(Upper|Lower)  };
+template <typename Lhs, typename Rhs, int RhsMode>
+struct selfadjoint_product_impl<Lhs, 0, true, Rhs, RhsMode, false> {
+  typedef typename Product<Lhs, Rhs>::Scalar Scalar;
+  enum { RhsUpLo = RhsMode & (Upper | Lower) };
 
-  template<typename Dest>
-  static void run(Dest& dest, const Lhs &a_lhs, const Rhs &a_rhs, const Scalar& alpha)
-  {
+  template <typename Dest>
+  static void run(Dest& dest, const Lhs& a_lhs, const Rhs& a_rhs, const Scalar& alpha) {
     // let's simply transpose the product
     Transpose<Dest> destT(dest);
-    selfadjoint_product_impl<Transpose<const Rhs>, int(RhsUpLo)==Upper ? Lower : Upper, false,
-                             Transpose<const Lhs>, 0, true>::run(destT, a_rhs.transpose(), a_lhs.transpose(), alpha);
+    selfadjoint_product_impl<Transpose<const Rhs>, int(RhsUpLo) == Upper ? Lower : Upper, false, Transpose<const Lhs>,
+                             0, true>::run(destT, a_rhs.transpose(), a_lhs.transpose(), alpha);
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SELFADJOINT_MATRIX_VECTOR_H
+#endif  // EIGEN_SELFADJOINT_MATRIX_VECTOR_H
diff --git a/Eigen/src/Core/products/SelfadjointMatrixVector_BLAS.h b/Eigen/src/Core/products/SelfadjointMatrixVector_BLAS.h
index 177ea09..c3311da 100644
--- a/Eigen/src/Core/products/SelfadjointMatrixVector_BLAS.h
+++ b/Eigen/src/Core/products/SelfadjointMatrixVector_BLAS.h
@@ -36,86 +36,79 @@
 // IWYU pragma: private
 #include "../InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
 /**********************************************************************
-* This file implements selfadjoint matrix-vector multiplication using BLAS
-**********************************************************************/
+ * This file implements selfadjoint matrix-vector multiplication using BLAS
+ **********************************************************************/
 
 // symv/hemv specialization
 
-template<typename Scalar, typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs>
-struct selfadjoint_matrix_vector_product_symv :
-  selfadjoint_matrix_vector_product<Scalar,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs,BuiltIn> {};
+template <typename Scalar, typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs>
+struct selfadjoint_matrix_vector_product_symv
+    : selfadjoint_matrix_vector_product<Scalar, Index, StorageOrder, UpLo, ConjugateLhs, ConjugateRhs, BuiltIn> {};
 
-#define EIGEN_BLAS_SYMV_SPECIALIZE(Scalar) \
-template<typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs> \
-struct selfadjoint_matrix_vector_product<Scalar,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs,Specialized> { \
-static void run( \
-  Index size, const Scalar*  lhs, Index lhsStride, \
-  const Scalar* _rhs, Scalar* res, Scalar alpha) { \
-    enum {\
-      IsColMajor = StorageOrder==ColMajor \
-    }; \
-    if (IsColMajor == ConjugateLhs) {\
-      selfadjoint_matrix_vector_product<Scalar,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs,BuiltIn>::run( \
-        size, lhs, lhsStride, _rhs, res, alpha);  \
-    } else {\
-      selfadjoint_matrix_vector_product_symv<Scalar,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs>::run( \
-        size, lhs, lhsStride, _rhs, res, alpha);  \
-    }\
-  } \
-}; \
+#define EIGEN_BLAS_SYMV_SPECIALIZE(Scalar)                                                                           \
+  template <typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs>                        \
+  struct selfadjoint_matrix_vector_product<Scalar, Index, StorageOrder, UpLo, ConjugateLhs, ConjugateRhs,            \
+                                           Specialized> {                                                            \
+    static void run(Index size, const Scalar* lhs, Index lhsStride, const Scalar* _rhs, Scalar* res, Scalar alpha) { \
+      enum { IsColMajor = StorageOrder == ColMajor };                                                                \
+      if (IsColMajor == ConjugateLhs) {                                                                              \
+        selfadjoint_matrix_vector_product<Scalar, Index, StorageOrder, UpLo, ConjugateLhs, ConjugateRhs,             \
+                                          BuiltIn>::run(size, lhs, lhsStride, _rhs, res, alpha);                     \
+      } else {                                                                                                       \
+        selfadjoint_matrix_vector_product_symv<Scalar, Index, StorageOrder, UpLo, ConjugateLhs, ConjugateRhs>::run(  \
+            size, lhs, lhsStride, _rhs, res, alpha);                                                                 \
+      }                                                                                                              \
+    }                                                                                                                \
+  };
 
 EIGEN_BLAS_SYMV_SPECIALIZE(double)
 EIGEN_BLAS_SYMV_SPECIALIZE(float)
 EIGEN_BLAS_SYMV_SPECIALIZE(dcomplex)
 EIGEN_BLAS_SYMV_SPECIALIZE(scomplex)
 
-#define EIGEN_BLAS_SYMV_SPECIALIZATION(EIGTYPE,BLASTYPE,BLASFUNC) \
-template<typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs> \
-struct selfadjoint_matrix_vector_product_symv<EIGTYPE,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs> \
-{ \
-typedef Matrix<EIGTYPE,Dynamic,1,ColMajor> SYMVVector;\
-\
-static void run( \
-Index size, const EIGTYPE*  lhs, Index lhsStride, \
-const EIGTYPE* _rhs, EIGTYPE* res, EIGTYPE alpha) \
-{ \
-  enum {\
-    IsRowMajor = StorageOrder==RowMajor ? 1 : 0, \
-    IsLower = UpLo == Lower ? 1 : 0 \
-  }; \
-  BlasIndex n=convert_index<BlasIndex>(size), lda=convert_index<BlasIndex>(lhsStride), incx=1, incy=1; \
-  EIGTYPE beta(1); \
-  const EIGTYPE *x_ptr; \
-  char uplo=(IsRowMajor) ? (IsLower ? 'U' : 'L') : (IsLower ? 'L' : 'U'); \
-  SYMVVector x_tmp; \
-  if (ConjugateRhs) { \
-    Map<const SYMVVector, 0 > map_x(_rhs,size,1); \
-    x_tmp=map_x.conjugate(); \
-    x_ptr=x_tmp.data(); \
-  } else x_ptr=_rhs; \
-  BLASFUNC(&uplo, &n, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)lhs, &lda, (const BLASTYPE*)x_ptr, &incx, (const BLASTYPE*)&numext::real_ref(beta), (BLASTYPE*)res, &incy); \
-}\
-};
+#define EIGEN_BLAS_SYMV_SPECIALIZATION(EIGTYPE, BLASTYPE, BLASFUNC)                                                \
+  template <typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs>                      \
+  struct selfadjoint_matrix_vector_product_symv<EIGTYPE, Index, StorageOrder, UpLo, ConjugateLhs, ConjugateRhs> {  \
+    typedef Matrix<EIGTYPE, Dynamic, 1, ColMajor> SYMVVector;                                                      \
+                                                                                                                   \
+    static void run(Index size, const EIGTYPE* lhs, Index lhsStride, const EIGTYPE* _rhs, EIGTYPE* res,            \
+                    EIGTYPE alpha) {                                                                               \
+      enum { IsRowMajor = StorageOrder == RowMajor ? 1 : 0, IsLower = UpLo == Lower ? 1 : 0 };                     \
+      BlasIndex n = convert_index<BlasIndex>(size), lda = convert_index<BlasIndex>(lhsStride), incx = 1, incy = 1; \
+      EIGTYPE beta(1);                                                                                             \
+      const EIGTYPE* x_ptr;                                                                                        \
+      char uplo = (IsRowMajor) ? (IsLower ? 'U' : 'L') : (IsLower ? 'L' : 'U');                                    \
+      SYMVVector x_tmp;                                                                                            \
+      if (ConjugateRhs) {                                                                                          \
+        Map<const SYMVVector, 0> map_x(_rhs, size, 1);                                                             \
+        x_tmp = map_x.conjugate();                                                                                 \
+        x_ptr = x_tmp.data();                                                                                      \
+      } else                                                                                                       \
+        x_ptr = _rhs;                                                                                              \
+      BLASFUNC(&uplo, &n, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)lhs, &lda,                   \
+               (const BLASTYPE*)x_ptr, &incx, (const BLASTYPE*)&numext::real_ref(beta), (BLASTYPE*)res, &incy);    \
+    }                                                                                                              \
+  };
 
 #ifdef EIGEN_USE_MKL
-EIGEN_BLAS_SYMV_SPECIALIZATION(double,   double, dsymv)
-EIGEN_BLAS_SYMV_SPECIALIZATION(float,    float,  ssymv)
+EIGEN_BLAS_SYMV_SPECIALIZATION(double, double, dsymv)
+EIGEN_BLAS_SYMV_SPECIALIZATION(float, float, ssymv)
 EIGEN_BLAS_SYMV_SPECIALIZATION(dcomplex, MKL_Complex16, zhemv)
-EIGEN_BLAS_SYMV_SPECIALIZATION(scomplex, MKL_Complex8,  chemv)
+EIGEN_BLAS_SYMV_SPECIALIZATION(scomplex, MKL_Complex8, chemv)
 #else
-EIGEN_BLAS_SYMV_SPECIALIZATION(double,   double, dsymv_)
-EIGEN_BLAS_SYMV_SPECIALIZATION(float,    float,  ssymv_)
+EIGEN_BLAS_SYMV_SPECIALIZATION(double, double, dsymv_)
+EIGEN_BLAS_SYMV_SPECIALIZATION(float, float, ssymv_)
 EIGEN_BLAS_SYMV_SPECIALIZATION(dcomplex, double, zhemv_)
-EIGEN_BLAS_SYMV_SPECIALIZATION(scomplex, float,  chemv_)
+EIGEN_BLAS_SYMV_SPECIALIZATION(scomplex, float, chemv_)
 #endif
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SELFADJOINT_MATRIX_VECTOR_BLAS_H
+#endif  // EIGEN_SELFADJOINT_MATRIX_VECTOR_BLAS_H
diff --git a/Eigen/src/Core/products/SelfadjointProduct.h b/Eigen/src/Core/products/SelfadjointProduct.h
index a208a15..f103465 100644
--- a/Eigen/src/Core/products/SelfadjointProduct.h
+++ b/Eigen/src/Core/products/SelfadjointProduct.h
@@ -11,50 +11,45 @@
 #define EIGEN_SELFADJOINT_PRODUCT_H
 
 /**********************************************************************
-* This file implements a self adjoint product: C += A A^T updating only
-* half of the selfadjoint matrix C.
-* It corresponds to the level 3 SYRK and level 2 SYR Blas routines.
-**********************************************************************/
+ * This file implements a self adjoint product: C += A A^T updating only
+ * half of the selfadjoint matrix C.
+ * It corresponds to the level 3 SYRK and level 2 SYR Blas routines.
+ **********************************************************************/
 
 // IWYU pragma: private
 #include "../InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
-
-template<typename Scalar, typename Index, int UpLo, bool ConjLhs, bool ConjRhs>
-struct selfadjoint_rank1_update<Scalar,Index,ColMajor,UpLo,ConjLhs,ConjRhs>
-{
-  static void run(Index size, Scalar* mat, Index stride, const Scalar* vecX, const Scalar* vecY, const Scalar& alpha)
-  {
+template <typename Scalar, typename Index, int UpLo, bool ConjLhs, bool ConjRhs>
+struct selfadjoint_rank1_update<Scalar, Index, ColMajor, UpLo, ConjLhs, ConjRhs> {
+  static void run(Index size, Scalar* mat, Index stride, const Scalar* vecX, const Scalar* vecY, const Scalar& alpha) {
     internal::conj_if<ConjRhs> cj;
-    typedef Map<const Matrix<Scalar,Dynamic,1> > OtherMap;
-    typedef std::conditional_t<ConjLhs,typename OtherMap::ConjugateReturnType,const OtherMap&> ConjLhsType;
-    for (Index i=0; i<size; ++i)
-    {
-      Map<Matrix<Scalar,Dynamic,1> >(mat+stride*i+(UpLo==Lower ? i : 0), (UpLo==Lower ? size-i : (i+1)))
-          += (alpha * cj(vecY[i])) * ConjLhsType(OtherMap(vecX+(UpLo==Lower ? i : 0),UpLo==Lower ? size-i : (i+1)));
+    typedef Map<const Matrix<Scalar, Dynamic, 1> > OtherMap;
+    typedef std::conditional_t<ConjLhs, typename OtherMap::ConjugateReturnType, const OtherMap&> ConjLhsType;
+    for (Index i = 0; i < size; ++i) {
+      Map<Matrix<Scalar, Dynamic, 1> >(mat + stride * i + (UpLo == Lower ? i : 0),
+                                       (UpLo == Lower ? size - i : (i + 1))) +=
+          (alpha * cj(vecY[i])) *
+          ConjLhsType(OtherMap(vecX + (UpLo == Lower ? i : 0), UpLo == Lower ? size - i : (i + 1)));
     }
   }
 };
 
-template<typename Scalar, typename Index, int UpLo, bool ConjLhs, bool ConjRhs>
-struct selfadjoint_rank1_update<Scalar,Index,RowMajor,UpLo,ConjLhs,ConjRhs>
-{
-  static void run(Index size, Scalar* mat, Index stride, const Scalar* vecX, const Scalar* vecY, const Scalar& alpha)
-  {
-    selfadjoint_rank1_update<Scalar,Index,ColMajor,UpLo==Lower?Upper:Lower,ConjRhs,ConjLhs>::run(size,mat,stride,vecY,vecX,alpha);
+template <typename Scalar, typename Index, int UpLo, bool ConjLhs, bool ConjRhs>
+struct selfadjoint_rank1_update<Scalar, Index, RowMajor, UpLo, ConjLhs, ConjRhs> {
+  static void run(Index size, Scalar* mat, Index stride, const Scalar* vecX, const Scalar* vecY, const Scalar& alpha) {
+    selfadjoint_rank1_update<Scalar, Index, ColMajor, UpLo == Lower ? Upper : Lower, ConjRhs, ConjLhs>::run(
+        size, mat, stride, vecY, vecX, alpha);
   }
 };
 
-template<typename MatrixType, typename OtherType, int UpLo, bool OtherIsVector = OtherType::IsVectorAtCompileTime>
+template <typename MatrixType, typename OtherType, int UpLo, bool OtherIsVector = OtherType::IsVectorAtCompileTime>
 struct selfadjoint_product_selector;
 
-template<typename MatrixType, typename OtherType, int UpLo>
-struct selfadjoint_product_selector<MatrixType,OtherType,UpLo,true>
-{
-  static void run(MatrixType& mat, const OtherType& other, const typename MatrixType::Scalar& alpha)
-  {
+template <typename MatrixType, typename OtherType, int UpLo>
+struct selfadjoint_product_selector<MatrixType, OtherType, UpLo, true> {
+  static void run(MatrixType& mat, const OtherType& other, const typename MatrixType::Scalar& alpha) {
     typedef typename MatrixType::Scalar Scalar;
     typedef internal::blas_traits<OtherType> OtherBlasTraits;
     typedef typename OtherBlasTraits::DirectLinearAccessType ActualOtherType;
@@ -64,29 +59,31 @@
     Scalar actualAlpha = alpha * OtherBlasTraits::extractScalarFactor(other.derived());
 
     enum {
-      StorageOrder = (internal::traits<MatrixType>::Flags&RowMajorBit) ? RowMajor : ColMajor,
-      UseOtherDirectly = ActualOtherType_::InnerStrideAtCompileTime==1
+      StorageOrder = (internal::traits<MatrixType>::Flags & RowMajorBit) ? RowMajor : ColMajor,
+      UseOtherDirectly = ActualOtherType_::InnerStrideAtCompileTime == 1
     };
-    internal::gemv_static_vector_if<Scalar,OtherType::SizeAtCompileTime,OtherType::MaxSizeAtCompileTime,!UseOtherDirectly> static_other;
+    internal::gemv_static_vector_if<Scalar, OtherType::SizeAtCompileTime, OtherType::MaxSizeAtCompileTime,
+                                    !UseOtherDirectly>
+        static_other;
 
-    ei_declare_aligned_stack_constructed_variable(Scalar, actualOtherPtr, other.size(),
-      (UseOtherDirectly ? const_cast<Scalar*>(actualOther.data()) : static_other.data()));
-      
-    if(!UseOtherDirectly)
+    ei_declare_aligned_stack_constructed_variable(
+        Scalar, actualOtherPtr, other.size(),
+        (UseOtherDirectly ? const_cast<Scalar*>(actualOther.data()) : static_other.data()));
+
+    if (!UseOtherDirectly)
       Map<typename ActualOtherType_::PlainObject>(actualOtherPtr, actualOther.size()) = actualOther;
-    
-    selfadjoint_rank1_update<Scalar,Index,StorageOrder,UpLo,
-                              OtherBlasTraits::NeedToConjugate  && NumTraits<Scalar>::IsComplex,
-                            (!OtherBlasTraits::NeedToConjugate) && NumTraits<Scalar>::IsComplex>
-          ::run(other.size(), mat.data(), mat.outerStride(), actualOtherPtr, actualOtherPtr, actualAlpha);
+
+    selfadjoint_rank1_update<
+        Scalar, Index, StorageOrder, UpLo, OtherBlasTraits::NeedToConjugate && NumTraits<Scalar>::IsComplex,
+        (!OtherBlasTraits::NeedToConjugate) && NumTraits<Scalar>::IsComplex>::run(other.size(), mat.data(),
+                                                                                  mat.outerStride(), actualOtherPtr,
+                                                                                  actualOtherPtr, actualAlpha);
   }
 };
 
-template<typename MatrixType, typename OtherType, int UpLo>
-struct selfadjoint_product_selector<MatrixType,OtherType,UpLo,false>
-{
-  static void run(MatrixType& mat, const OtherType& other, const typename MatrixType::Scalar& alpha)
-  {
+template <typename MatrixType, typename OtherType, int UpLo>
+struct selfadjoint_product_selector<MatrixType, OtherType, UpLo, false> {
+  static void run(MatrixType& mat, const OtherType& other, const typename MatrixType::Scalar& alpha) {
     typedef typename MatrixType::Scalar Scalar;
     typedef internal::blas_traits<OtherType> OtherBlasTraits;
     typedef typename OtherBlasTraits::DirectLinearAccessType ActualOtherType;
@@ -96,41 +93,41 @@
     Scalar actualAlpha = alpha * OtherBlasTraits::extractScalarFactor(other.derived());
 
     enum {
-      IsRowMajor = (internal::traits<MatrixType>::Flags&RowMajorBit) ? 1 : 0,
-      OtherIsRowMajor = ActualOtherType_::Flags&RowMajorBit ? 1 : 0
+      IsRowMajor = (internal::traits<MatrixType>::Flags & RowMajorBit) ? 1 : 0,
+      OtherIsRowMajor = ActualOtherType_::Flags & RowMajorBit ? 1 : 0
     };
 
     Index size = mat.cols();
     Index depth = actualOther.cols();
 
-    typedef internal::gemm_blocking_space<IsRowMajor ? RowMajor : ColMajor,Scalar,Scalar,
-              MatrixType::MaxColsAtCompileTime, MatrixType::MaxColsAtCompileTime, ActualOtherType_::MaxColsAtCompileTime> BlockingType;
+    typedef internal::gemm_blocking_space<IsRowMajor ? RowMajor : ColMajor, Scalar, Scalar,
+                                          MatrixType::MaxColsAtCompileTime, MatrixType::MaxColsAtCompileTime,
+                                          ActualOtherType_::MaxColsAtCompileTime>
+        BlockingType;
 
     BlockingType blocking(size, size, depth, 1, false);
 
-
-    internal::general_matrix_matrix_triangular_product<Index,
-      Scalar, OtherIsRowMajor ? RowMajor : ColMajor,   OtherBlasTraits::NeedToConjugate  && NumTraits<Scalar>::IsComplex,
-      Scalar, OtherIsRowMajor ? ColMajor : RowMajor, (!OtherBlasTraits::NeedToConjugate) && NumTraits<Scalar>::IsComplex,
-      IsRowMajor ? RowMajor : ColMajor, MatrixType::InnerStrideAtCompileTime, UpLo>
-      ::run(size, depth,
-            actualOther.data(), actualOther.outerStride(), actualOther.data(), actualOther.outerStride(),
-            mat.data(), mat.innerStride(), mat.outerStride(), actualAlpha, blocking);
+    internal::general_matrix_matrix_triangular_product<
+        Index, Scalar, OtherIsRowMajor ? RowMajor : ColMajor,
+        OtherBlasTraits::NeedToConjugate && NumTraits<Scalar>::IsComplex, Scalar, OtherIsRowMajor ? ColMajor : RowMajor,
+        (!OtherBlasTraits::NeedToConjugate) && NumTraits<Scalar>::IsComplex, IsRowMajor ? RowMajor : ColMajor,
+        MatrixType::InnerStrideAtCompileTime, UpLo>::run(size, depth, actualOther.data(), actualOther.outerStride(),
+                                                         actualOther.data(), actualOther.outerStride(), mat.data(),
+                                                         mat.innerStride(), mat.outerStride(), actualAlpha, blocking);
   }
 };
 
 // high level API
 
-template<typename MatrixType, unsigned int UpLo>
-template<typename DerivedU>
-EIGEN_DEVICE_FUNC SelfAdjointView<MatrixType,UpLo>& SelfAdjointView<MatrixType,UpLo>
-::rankUpdate(const MatrixBase<DerivedU>& u, const Scalar& alpha)
-{
-  selfadjoint_product_selector<MatrixType,DerivedU,UpLo>::run(_expression().const_cast_derived(), u.derived(), alpha);
+template <typename MatrixType, unsigned int UpLo>
+template <typename DerivedU>
+EIGEN_DEVICE_FUNC SelfAdjointView<MatrixType, UpLo>& SelfAdjointView<MatrixType, UpLo>::rankUpdate(
+    const MatrixBase<DerivedU>& u, const Scalar& alpha) {
+  selfadjoint_product_selector<MatrixType, DerivedU, UpLo>::run(_expression().const_cast_derived(), u.derived(), alpha);
 
   return *this;
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SELFADJOINT_PRODUCT_H
+#endif  // EIGEN_SELFADJOINT_PRODUCT_H
diff --git a/Eigen/src/Core/products/SelfadjointRank2Update.h b/Eigen/src/Core/products/SelfadjointRank2Update.h
index f433a21..9c234ec 100644
--- a/Eigen/src/Core/products/SelfadjointRank2Update.h
+++ b/Eigen/src/Core/products/SelfadjointRank2Update.h
@@ -13,7 +13,7 @@
 // IWYU pragma: private
 #include "../InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
@@ -21,48 +21,42 @@
  * It corresponds to the Level2 syr2 BLAS routine
  */
 
-template<typename Scalar, typename Index, typename UType, typename VType, int UpLo>
+template <typename Scalar, typename Index, typename UType, typename VType, int UpLo>
 struct selfadjoint_rank2_update_selector;
 
-template<typename Scalar, typename Index, typename UType, typename VType>
-struct selfadjoint_rank2_update_selector<Scalar,Index,UType,VType,Lower>
-{
-  static EIGEN_DEVICE_FUNC
-  void run(Scalar* mat, Index stride, const UType& u, const VType& v, const Scalar& alpha)
-  {
+template <typename Scalar, typename Index, typename UType, typename VType>
+struct selfadjoint_rank2_update_selector<Scalar, Index, UType, VType, Lower> {
+  static EIGEN_DEVICE_FUNC void run(Scalar* mat, Index stride, const UType& u, const VType& v, const Scalar& alpha) {
     const Index size = u.size();
-    for (Index i=0; i<size; ++i)
-    {
-      Map<Matrix<Scalar,Dynamic,1> >(mat+stride*i+i, size-i) +=
-                        (numext::conj(alpha) * numext::conj(u.coeff(i))) * v.tail(size-i)
-                      + (alpha * numext::conj(v.coeff(i))) * u.tail(size-i);
+    for (Index i = 0; i < size; ++i) {
+      Map<Matrix<Scalar, Dynamic, 1>>(mat + stride * i + i, size - i) +=
+          (numext::conj(alpha) * numext::conj(u.coeff(i))) * v.tail(size - i) +
+          (alpha * numext::conj(v.coeff(i))) * u.tail(size - i);
     }
   }
 };
 
-template<typename Scalar, typename Index, typename UType, typename VType>
-struct selfadjoint_rank2_update_selector<Scalar,Index,UType,VType,Upper>
-{
-  static void run(Scalar* mat, Index stride, const UType& u, const VType& v, const Scalar& alpha)
-  {
+template <typename Scalar, typename Index, typename UType, typename VType>
+struct selfadjoint_rank2_update_selector<Scalar, Index, UType, VType, Upper> {
+  static void run(Scalar* mat, Index stride, const UType& u, const VType& v, const Scalar& alpha) {
     const Index size = u.size();
-    for (Index i=0; i<size; ++i)
-      Map<Matrix<Scalar,Dynamic,1> >(mat+stride*i, i+1) +=
-                        (numext::conj(alpha)  * numext::conj(u.coeff(i))) * v.head(i+1)
-                      + (alpha * numext::conj(v.coeff(i))) * u.head(i+1);
+    for (Index i = 0; i < size; ++i)
+      Map<Matrix<Scalar, Dynamic, 1>>(mat + stride * i, i + 1) +=
+          (numext::conj(alpha) * numext::conj(u.coeff(i))) * v.head(i + 1) +
+          (alpha * numext::conj(v.coeff(i))) * u.head(i + 1);
   }
 };
 
-template<bool Cond, typename T>
-using conj_expr_if = std::conditional<!Cond, const T&, CwiseUnaryOp<scalar_conjugate_op<typename traits<T>::Scalar>,T>>;
+template <bool Cond, typename T>
+using conj_expr_if =
+    std::conditional<!Cond, const T&, CwiseUnaryOp<scalar_conjugate_op<typename traits<T>::Scalar>, T>>;
 
-} // end namespace internal
+}  // end namespace internal
 
-template<typename MatrixType, unsigned int UpLo>
-template<typename DerivedU, typename DerivedV>
-EIGEN_DEVICE_FUNC SelfAdjointView<MatrixType,UpLo>& SelfAdjointView<MatrixType,UpLo>
-::rankUpdate(const MatrixBase<DerivedU>& u, const MatrixBase<DerivedV>& v, const Scalar& alpha)
-{
+template <typename MatrixType, unsigned int UpLo>
+template <typename DerivedU, typename DerivedV>
+EIGEN_DEVICE_FUNC SelfAdjointView<MatrixType, UpLo>& SelfAdjointView<MatrixType, UpLo>::rankUpdate(
+    const MatrixBase<DerivedU>& u, const MatrixBase<DerivedV>& v, const Scalar& alpha) {
   typedef internal::blas_traits<DerivedU> UBlasTraits;
   typedef typename UBlasTraits::DirectLinearAccessType ActualUType;
   typedef internal::remove_all_t<ActualUType> ActualUType_;
@@ -76,21 +70,26 @@
   // If MatrixType is row major, then we use the routine for lower triangular in the upper triangular case and
   // vice versa, and take the complex conjugate of all coefficients and vector entries.
 
-  enum { IsRowMajor = (internal::traits<MatrixType>::Flags&RowMajorBit) ? 1 : 0 };
-  Scalar actualAlpha = alpha * UBlasTraits::extractScalarFactor(u.derived())
-                             * numext::conj(VBlasTraits::extractScalarFactor(v.derived()));
-  if (IsRowMajor)
-    actualAlpha = numext::conj(actualAlpha);
+  enum { IsRowMajor = (internal::traits<MatrixType>::Flags & RowMajorBit) ? 1 : 0 };
+  Scalar actualAlpha = alpha * UBlasTraits::extractScalarFactor(u.derived()) *
+                       numext::conj(VBlasTraits::extractScalarFactor(v.derived()));
+  if (IsRowMajor) actualAlpha = numext::conj(actualAlpha);
 
-  typedef internal::remove_all_t<typename internal::conj_expr_if<int(IsRowMajor) ^ int(UBlasTraits::NeedToConjugate), ActualUType_>::type> UType;
-  typedef internal::remove_all_t<typename internal::conj_expr_if<int(IsRowMajor) ^ int(VBlasTraits::NeedToConjugate), ActualVType_>::type> VType;
+  typedef internal::remove_all_t<
+      typename internal::conj_expr_if<int(IsRowMajor) ^ int(UBlasTraits::NeedToConjugate), ActualUType_>::type>
+      UType;
+  typedef internal::remove_all_t<
+      typename internal::conj_expr_if<int(IsRowMajor) ^ int(VBlasTraits::NeedToConjugate), ActualVType_>::type>
+      VType;
   internal::selfadjoint_rank2_update_selector<Scalar, Index, UType, VType,
-    (IsRowMajor ? int(UpLo==Upper ? Lower : Upper) : UpLo)>
-    ::run(_expression().const_cast_derived().data(),_expression().outerStride(),UType(actualU),VType(actualV),actualAlpha);
+                                              (IsRowMajor ? int(UpLo == Upper ? Lower : Upper)
+                                                          : UpLo)>::run(_expression().const_cast_derived().data(),
+                                                                        _expression().outerStride(), UType(actualU),
+                                                                        VType(actualV), actualAlpha);
 
   return *this;
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SELFADJOINTRANK2UPTADE_H
+#endif  // EIGEN_SELFADJOINTRANK2UPTADE_H
diff --git a/Eigen/src/Core/products/TriangularMatrixMatrix.h b/Eigen/src/Core/products/TriangularMatrixMatrix.h
index 22e9375..c541909 100644
--- a/Eigen/src/Core/products/TriangularMatrixMatrix.h
+++ b/Eigen/src/Core/products/TriangularMatrixMatrix.h
@@ -13,7 +13,7 @@
 // IWYU pragma: private
 #include "../InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
@@ -44,375 +44,301 @@
 /* Optimized triangular matrix * matrix (_TRMM++) product built on top of
  * the general matrix matrix product.
  */
-template <typename Scalar, typename Index,
-          int Mode, bool LhsIsTriangular,
-          int LhsStorageOrder, bool ConjugateLhs,
-          int RhsStorageOrder, bool ConjugateRhs,
-          int ResStorageOrder, int ResInnerStride,
-          int Version = Specialized>
+template <typename Scalar, typename Index, int Mode, bool LhsIsTriangular, int LhsStorageOrder, bool ConjugateLhs,
+          int RhsStorageOrder, bool ConjugateRhs, int ResStorageOrder, int ResInnerStride, int Version = Specialized>
 struct product_triangular_matrix_matrix;
 
-template <typename Scalar, typename Index,
-          int Mode, bool LhsIsTriangular,
-          int LhsStorageOrder, bool ConjugateLhs,
-          int RhsStorageOrder, bool ConjugateRhs,
-          int ResInnerStride, int Version>
-struct product_triangular_matrix_matrix<Scalar,Index,Mode,LhsIsTriangular,
-                                           LhsStorageOrder,ConjugateLhs,
-                                           RhsStorageOrder,ConjugateRhs,RowMajor,ResInnerStride,Version>
-{
-  static EIGEN_STRONG_INLINE void run(
-    Index rows, Index cols, Index depth,
-    const Scalar* lhs, Index lhsStride,
-    const Scalar* rhs, Index rhsStride,
-    Scalar* res,       Index resIncr, Index resStride,
-    const Scalar& alpha, level3_blocking<Scalar,Scalar>& blocking)
-  {
-    product_triangular_matrix_matrix<Scalar, Index,
-      (Mode&(UnitDiag|ZeroDiag)) | ((Mode&Upper) ? Lower : Upper),
-      (!LhsIsTriangular),
-      RhsStorageOrder==RowMajor ? ColMajor : RowMajor,
-      ConjugateRhs,
-      LhsStorageOrder==RowMajor ? ColMajor : RowMajor,
-      ConjugateLhs,
-      ColMajor, ResInnerStride>
-      ::run(cols, rows, depth, rhs, rhsStride, lhs, lhsStride, res, resIncr, resStride, alpha, blocking);
+template <typename Scalar, typename Index, int Mode, bool LhsIsTriangular, int LhsStorageOrder, bool ConjugateLhs,
+          int RhsStorageOrder, bool ConjugateRhs, int ResInnerStride, int Version>
+struct product_triangular_matrix_matrix<Scalar, Index, Mode, LhsIsTriangular, LhsStorageOrder, ConjugateLhs,
+                                        RhsStorageOrder, ConjugateRhs, RowMajor, ResInnerStride, Version> {
+  static EIGEN_STRONG_INLINE void run(Index rows, Index cols, Index depth, const Scalar* lhs, Index lhsStride,
+                                      const Scalar* rhs, Index rhsStride, Scalar* res, Index resIncr, Index resStride,
+                                      const Scalar& alpha, level3_blocking<Scalar, Scalar>& blocking) {
+    product_triangular_matrix_matrix<Scalar, Index, (Mode & (UnitDiag | ZeroDiag)) | ((Mode & Upper) ? Lower : Upper),
+                                     (!LhsIsTriangular), RhsStorageOrder == RowMajor ? ColMajor : RowMajor,
+                                     ConjugateRhs, LhsStorageOrder == RowMajor ? ColMajor : RowMajor, ConjugateLhs,
+                                     ColMajor, ResInnerStride>::run(cols, rows, depth, rhs, rhsStride, lhs, lhsStride,
+                                                                    res, resIncr, resStride, alpha, blocking);
   }
 };
 
 // implements col-major += alpha * op(triangular) * op(general)
-template <typename Scalar, typename Index, int Mode,
-          int LhsStorageOrder, bool ConjugateLhs,
-          int RhsStorageOrder, bool ConjugateRhs,
-          int ResInnerStride, int Version>
-struct product_triangular_matrix_matrix<Scalar,Index,Mode,true,
-                                           LhsStorageOrder,ConjugateLhs,
-                                           RhsStorageOrder,ConjugateRhs,ColMajor,ResInnerStride,Version>
-{
-  
-  typedef gebp_traits<Scalar,Scalar> Traits;
+template <typename Scalar, typename Index, int Mode, int LhsStorageOrder, bool ConjugateLhs, int RhsStorageOrder,
+          bool ConjugateRhs, int ResInnerStride, int Version>
+struct product_triangular_matrix_matrix<Scalar, Index, Mode, true, LhsStorageOrder, ConjugateLhs, RhsStorageOrder,
+                                        ConjugateRhs, ColMajor, ResInnerStride, Version> {
+  typedef gebp_traits<Scalar, Scalar> Traits;
   enum {
-    SmallPanelWidth   = 2 * plain_enum_max(Traits::mr, Traits::nr),
-    IsLower = (Mode&Lower) == Lower,
-    SetDiag = (Mode&(ZeroDiag|UnitDiag)) ? 0 : 1
+    SmallPanelWidth = 2 * plain_enum_max(Traits::mr, Traits::nr),
+    IsLower = (Mode & Lower) == Lower,
+    SetDiag = (Mode & (ZeroDiag | UnitDiag)) ? 0 : 1
   };
 
-  static EIGEN_DONT_INLINE void run(
-    Index _rows, Index _cols, Index _depth,
-    const Scalar* lhs_, Index lhsStride,
-    const Scalar* rhs_, Index rhsStride,
-    Scalar* res,        Index resIncr, Index resStride,
-    const Scalar& alpha, level3_blocking<Scalar,Scalar>& blocking);
+  static EIGEN_DONT_INLINE void run(Index _rows, Index _cols, Index _depth, const Scalar* lhs_, Index lhsStride,
+                                    const Scalar* rhs_, Index rhsStride, Scalar* res, Index resIncr, Index resStride,
+                                    const Scalar& alpha, level3_blocking<Scalar, Scalar>& blocking);
 };
 
-template <typename Scalar, typename Index, int Mode,
-          int LhsStorageOrder, bool ConjugateLhs,
-          int RhsStorageOrder, bool ConjugateRhs,
-          int ResInnerStride, int Version>
-EIGEN_DONT_INLINE void product_triangular_matrix_matrix<Scalar,Index,Mode,true,
-                                                        LhsStorageOrder,ConjugateLhs,
-                                                        RhsStorageOrder,ConjugateRhs,ColMajor,ResInnerStride,Version>::run(
-    Index _rows, Index _cols, Index _depth,
-    const Scalar* lhs_, Index lhsStride,
-    const Scalar* rhs_, Index rhsStride,
-    Scalar* res_,       Index resIncr, Index resStride,
-    const Scalar& alpha, level3_blocking<Scalar,Scalar>& blocking)
-  {
-    // strip zeros
-    Index diagSize  = (std::min)(_rows,_depth);
-    Index rows      = IsLower ? _rows : diagSize;
-    Index depth     = IsLower ? diagSize : _depth;
-    Index cols      = _cols;
-    
-    typedef const_blas_data_mapper<Scalar, Index, LhsStorageOrder> LhsMapper;
-    typedef const_blas_data_mapper<Scalar, Index, RhsStorageOrder> RhsMapper;
-    typedef blas_data_mapper<typename Traits::ResScalar, Index, ColMajor, Unaligned, ResInnerStride> ResMapper;
-    LhsMapper lhs(lhs_,lhsStride);
-    RhsMapper rhs(rhs_,rhsStride);
-    ResMapper res(res_, resStride, resIncr);
+template <typename Scalar, typename Index, int Mode, int LhsStorageOrder, bool ConjugateLhs, int RhsStorageOrder,
+          bool ConjugateRhs, int ResInnerStride, int Version>
+EIGEN_DONT_INLINE void product_triangular_matrix_matrix<
+    Scalar, Index, Mode, true, LhsStorageOrder, ConjugateLhs, RhsStorageOrder, ConjugateRhs, ColMajor, ResInnerStride,
+    Version>::run(Index _rows, Index _cols, Index _depth, const Scalar* lhs_, Index lhsStride, const Scalar* rhs_,
+                  Index rhsStride, Scalar* res_, Index resIncr, Index resStride, const Scalar& alpha,
+                  level3_blocking<Scalar, Scalar>& blocking) {
+  // strip zeros
+  Index diagSize = (std::min)(_rows, _depth);
+  Index rows = IsLower ? _rows : diagSize;
+  Index depth = IsLower ? diagSize : _depth;
+  Index cols = _cols;
 
-    Index kc = blocking.kc();                   // cache block size along the K direction
-    Index mc = (std::min)(rows,blocking.mc());  // cache block size along the M direction
-    // The small panel size must not be larger than blocking size.
-    // Usually this should never be the case because SmallPanelWidth^2 is very small
-    // compared to L2 cache size, but let's be safe:
-    Index panelWidth = (std::min)(Index(SmallPanelWidth),(std::min)(kc,mc));
+  typedef const_blas_data_mapper<Scalar, Index, LhsStorageOrder> LhsMapper;
+  typedef const_blas_data_mapper<Scalar, Index, RhsStorageOrder> RhsMapper;
+  typedef blas_data_mapper<typename Traits::ResScalar, Index, ColMajor, Unaligned, ResInnerStride> ResMapper;
+  LhsMapper lhs(lhs_, lhsStride);
+  RhsMapper rhs(rhs_, rhsStride);
+  ResMapper res(res_, resStride, resIncr);
 
-    std::size_t sizeA = kc*mc;
-    std::size_t sizeB = kc*cols;
+  Index kc = blocking.kc();                    // cache block size along the K direction
+  Index mc = (std::min)(rows, blocking.mc());  // cache block size along the M direction
+  // The small panel size must not be larger than blocking size.
+  // Usually this should never be the case because SmallPanelWidth^2 is very small
+  // compared to L2 cache size, but let's be safe:
+  Index panelWidth = (std::min)(Index(SmallPanelWidth), (std::min)(kc, mc));
 
-    ei_declare_aligned_stack_constructed_variable(Scalar, blockA, sizeA, blocking.blockA());
-    ei_declare_aligned_stack_constructed_variable(Scalar, blockB, sizeB, blocking.blockB());
+  std::size_t sizeA = kc * mc;
+  std::size_t sizeB = kc * cols;
 
-    // To work around an "error: member reference base type 'Matrix<...>
-    // (Eigen::internal::constructor_without_unaligned_array_assert (*)())' is
-    // not a structure or union" compilation error in nvcc (tested V8.0.61),
-    // create a dummy internal::constructor_without_unaligned_array_assert
-    // object to pass to the Matrix constructor.
-    internal::constructor_without_unaligned_array_assert a;
-    Matrix<Scalar,SmallPanelWidth,SmallPanelWidth,LhsStorageOrder> triangularBuffer(a);
-    triangularBuffer.setZero();
-    if((Mode&ZeroDiag)==ZeroDiag)
-      triangularBuffer.diagonal().setZero();
-    else
-      triangularBuffer.diagonal().setOnes();
+  ei_declare_aligned_stack_constructed_variable(Scalar, blockA, sizeA, blocking.blockA());
+  ei_declare_aligned_stack_constructed_variable(Scalar, blockB, sizeB, blocking.blockB());
 
-    gebp_kernel<Scalar, Scalar, Index, ResMapper, Traits::mr, Traits::nr, ConjugateLhs, ConjugateRhs> gebp_kernel;
-    gemm_pack_lhs<Scalar, Index, LhsMapper, Traits::mr, Traits::LhsProgress, typename Traits::LhsPacket4Packing, LhsStorageOrder> pack_lhs;
-    gemm_pack_rhs<Scalar, Index, RhsMapper, Traits::nr,RhsStorageOrder> pack_rhs;
+  // To work around an "error: member reference base type 'Matrix<...>
+  // (Eigen::internal::constructor_without_unaligned_array_assert (*)())' is
+  // not a structure or union" compilation error in nvcc (tested V8.0.61),
+  // create a dummy internal::constructor_without_unaligned_array_assert
+  // object to pass to the Matrix constructor.
+  internal::constructor_without_unaligned_array_assert a;
+  Matrix<Scalar, SmallPanelWidth, SmallPanelWidth, LhsStorageOrder> triangularBuffer(a);
+  triangularBuffer.setZero();
+  if ((Mode & ZeroDiag) == ZeroDiag)
+    triangularBuffer.diagonal().setZero();
+  else
+    triangularBuffer.diagonal().setOnes();
 
-    for(Index k2=IsLower ? depth : 0;
-        IsLower ? k2>0 : k2<depth;
-        IsLower ? k2-=kc : k2+=kc)
-    {
-      Index actual_kc = (std::min)(IsLower ? k2 : depth-k2, kc);
-      Index actual_k2 = IsLower ? k2-actual_kc : k2;
+  gebp_kernel<Scalar, Scalar, Index, ResMapper, Traits::mr, Traits::nr, ConjugateLhs, ConjugateRhs> gebp_kernel;
+  gemm_pack_lhs<Scalar, Index, LhsMapper, Traits::mr, Traits::LhsProgress, typename Traits::LhsPacket4Packing,
+                LhsStorageOrder>
+      pack_lhs;
+  gemm_pack_rhs<Scalar, Index, RhsMapper, Traits::nr, RhsStorageOrder> pack_rhs;
 
-      // align blocks with the end of the triangular part for trapezoidal lhs
-      if((!IsLower)&&(k2<rows)&&(k2+actual_kc>rows))
-      {
-        actual_kc = rows-k2;
-        k2 = k2+actual_kc-kc;
-      }
+  for (Index k2 = IsLower ? depth : 0; IsLower ? k2 > 0 : k2 < depth; IsLower ? k2 -= kc : k2 += kc) {
+    Index actual_kc = (std::min)(IsLower ? k2 : depth - k2, kc);
+    Index actual_k2 = IsLower ? k2 - actual_kc : k2;
 
-      pack_rhs(blockB, rhs.getSubMapper(actual_k2,0), actual_kc, cols);
+    // align blocks with the end of the triangular part for trapezoidal lhs
+    if ((!IsLower) && (k2 < rows) && (k2 + actual_kc > rows)) {
+      actual_kc = rows - k2;
+      k2 = k2 + actual_kc - kc;
+    }
 
-      // the selected lhs's panel has to be split in three different parts:
-      //  1 - the part which is zero => skip it
-      //  2 - the diagonal block => special kernel
-      //  3 - the dense panel below (lower case) or above (upper case) the diagonal block => GEPP
+    pack_rhs(blockB, rhs.getSubMapper(actual_k2, 0), actual_kc, cols);
 
-      // the block diagonal, if any:
-      if(IsLower || actual_k2<rows)
-      {
-        // for each small vertical panels of lhs
-        for (Index k1=0; k1<actual_kc; k1+=panelWidth)
-        {
-          Index actualPanelWidth = std::min<Index>(actual_kc-k1, panelWidth);
-          Index lengthTarget = IsLower ? actual_kc-k1-actualPanelWidth : k1;
-          Index startBlock   = actual_k2+k1;
-          Index blockBOffset = k1;
+    // the selected lhs's panel has to be split in three different parts:
+    //  1 - the part which is zero => skip it
+    //  2 - the diagonal block => special kernel
+    //  3 - the dense panel below (lower case) or above (upper case) the diagonal block => GEPP
 
-          // => GEBP with the micro triangular block
-          // The trick is to pack this micro block while filling the opposite triangular part with zeros.
-          // To this end we do an extra triangular copy to a small temporary buffer
-          for (Index k=0;k<actualPanelWidth;++k)
-          {
-            if (SetDiag)
-              triangularBuffer.coeffRef(k,k) = lhs(startBlock+k,startBlock+k);
-            for (Index i=IsLower ? k+1 : 0; IsLower ? i<actualPanelWidth : i<k; ++i)
-              triangularBuffer.coeffRef(i,k) = lhs(startBlock+i,startBlock+k);
-          }
-          pack_lhs(blockA, LhsMapper(triangularBuffer.data(), triangularBuffer.outerStride()), actualPanelWidth, actualPanelWidth);
+    // the block diagonal, if any:
+    if (IsLower || actual_k2 < rows) {
+      // for each small vertical panels of lhs
+      for (Index k1 = 0; k1 < actual_kc; k1 += panelWidth) {
+        Index actualPanelWidth = std::min<Index>(actual_kc - k1, panelWidth);
+        Index lengthTarget = IsLower ? actual_kc - k1 - actualPanelWidth : k1;
+        Index startBlock = actual_k2 + k1;
+        Index blockBOffset = k1;
 
-          gebp_kernel(res.getSubMapper(startBlock, 0), blockA, blockB,
-                      actualPanelWidth, actualPanelWidth, cols, alpha,
-                      actualPanelWidth, actual_kc, 0, blockBOffset);
-
-          // GEBP with remaining micro panel
-          if (lengthTarget>0)
-          {
-            Index startTarget  = IsLower ? actual_k2+k1+actualPanelWidth : actual_k2;
-
-            pack_lhs(blockA, lhs.getSubMapper(startTarget,startBlock), actualPanelWidth, lengthTarget);
-
-            gebp_kernel(res.getSubMapper(startTarget, 0), blockA, blockB,
-                        lengthTarget, actualPanelWidth, cols, alpha,
-                        actualPanelWidth, actual_kc, 0, blockBOffset);
-          }
+        // => GEBP with the micro triangular block
+        // The trick is to pack this micro block while filling the opposite triangular part with zeros.
+        // To this end we do an extra triangular copy to a small temporary buffer
+        for (Index k = 0; k < actualPanelWidth; ++k) {
+          if (SetDiag) triangularBuffer.coeffRef(k, k) = lhs(startBlock + k, startBlock + k);
+          for (Index i = IsLower ? k + 1 : 0; IsLower ? i < actualPanelWidth : i < k; ++i)
+            triangularBuffer.coeffRef(i, k) = lhs(startBlock + i, startBlock + k);
         }
-      }
-      // the part below (lower case) or above (upper case) the diagonal => GEPP
-      {
-        Index start = IsLower ? k2 : 0;
-        Index end   = IsLower ? rows : (std::min)(actual_k2,rows);
-        for(Index i2=start; i2<end; i2+=mc)
-        {
-          const Index actual_mc = (std::min)(i2+mc,end)-i2;
-          gemm_pack_lhs<Scalar, Index, LhsMapper, Traits::mr,Traits::LhsProgress, typename Traits::LhsPacket4Packing, LhsStorageOrder,false>()
-            (blockA, lhs.getSubMapper(i2, actual_k2), actual_kc, actual_mc);
+        pack_lhs(blockA, LhsMapper(triangularBuffer.data(), triangularBuffer.outerStride()), actualPanelWidth,
+                 actualPanelWidth);
 
-          gebp_kernel(res.getSubMapper(i2, 0), blockA, blockB, actual_mc,
-                      actual_kc, cols, alpha, -1, -1, 0, 0);
+        gebp_kernel(res.getSubMapper(startBlock, 0), blockA, blockB, actualPanelWidth, actualPanelWidth, cols, alpha,
+                    actualPanelWidth, actual_kc, 0, blockBOffset);
+
+        // GEBP with remaining micro panel
+        if (lengthTarget > 0) {
+          Index startTarget = IsLower ? actual_k2 + k1 + actualPanelWidth : actual_k2;
+
+          pack_lhs(blockA, lhs.getSubMapper(startTarget, startBlock), actualPanelWidth, lengthTarget);
+
+          gebp_kernel(res.getSubMapper(startTarget, 0), blockA, blockB, lengthTarget, actualPanelWidth, cols, alpha,
+                      actualPanelWidth, actual_kc, 0, blockBOffset);
         }
       }
     }
+    // the part below (lower case) or above (upper case) the diagonal => GEPP
+    {
+      Index start = IsLower ? k2 : 0;
+      Index end = IsLower ? rows : (std::min)(actual_k2, rows);
+      for (Index i2 = start; i2 < end; i2 += mc) {
+        const Index actual_mc = (std::min)(i2 + mc, end) - i2;
+        gemm_pack_lhs<Scalar, Index, LhsMapper, Traits::mr, Traits::LhsProgress, typename Traits::LhsPacket4Packing,
+                      LhsStorageOrder, false>()(blockA, lhs.getSubMapper(i2, actual_k2), actual_kc, actual_mc);
+
+        gebp_kernel(res.getSubMapper(i2, 0), blockA, blockB, actual_mc, actual_kc, cols, alpha, -1, -1, 0, 0);
+      }
+    }
   }
+}
 
 // implements col-major += alpha * op(general) * op(triangular)
-template <typename Scalar, typename Index, int Mode,
-          int LhsStorageOrder, bool ConjugateLhs,
-          int RhsStorageOrder, bool ConjugateRhs,
-          int ResInnerStride, int Version>
-struct product_triangular_matrix_matrix<Scalar,Index,Mode,false,
-                                        LhsStorageOrder,ConjugateLhs,
-                                        RhsStorageOrder,ConjugateRhs,ColMajor,ResInnerStride,Version>
-{
-  typedef gebp_traits<Scalar,Scalar> Traits;
+template <typename Scalar, typename Index, int Mode, int LhsStorageOrder, bool ConjugateLhs, int RhsStorageOrder,
+          bool ConjugateRhs, int ResInnerStride, int Version>
+struct product_triangular_matrix_matrix<Scalar, Index, Mode, false, LhsStorageOrder, ConjugateLhs, RhsStorageOrder,
+                                        ConjugateRhs, ColMajor, ResInnerStride, Version> {
+  typedef gebp_traits<Scalar, Scalar> Traits;
   enum {
-    SmallPanelWidth   = plain_enum_max(Traits::mr, Traits::nr),
-    IsLower = (Mode&Lower) == Lower,
-    SetDiag = (Mode&(ZeroDiag|UnitDiag)) ? 0 : 1
+    SmallPanelWidth = plain_enum_max(Traits::mr, Traits::nr),
+    IsLower = (Mode & Lower) == Lower,
+    SetDiag = (Mode & (ZeroDiag | UnitDiag)) ? 0 : 1
   };
 
-  static EIGEN_DONT_INLINE void run(
-    Index _rows, Index _cols, Index _depth,
-    const Scalar* lhs_, Index lhsStride,
-    const Scalar* rhs_, Index rhsStride,
-    Scalar* res,        Index resIncr, Index resStride,
-    const Scalar& alpha, level3_blocking<Scalar,Scalar>& blocking);
+  static EIGEN_DONT_INLINE void run(Index _rows, Index _cols, Index _depth, const Scalar* lhs_, Index lhsStride,
+                                    const Scalar* rhs_, Index rhsStride, Scalar* res, Index resIncr, Index resStride,
+                                    const Scalar& alpha, level3_blocking<Scalar, Scalar>& blocking);
 };
 
-template <typename Scalar, typename Index, int Mode,
-          int LhsStorageOrder, bool ConjugateLhs,
-          int RhsStorageOrder, bool ConjugateRhs,
-          int ResInnerStride, int Version>
-EIGEN_DONT_INLINE void product_triangular_matrix_matrix<Scalar,Index,Mode,false,
-                                                        LhsStorageOrder,ConjugateLhs,
-                                                        RhsStorageOrder,ConjugateRhs,ColMajor,ResInnerStride,Version>::run(
-    Index _rows, Index _cols, Index _depth,
-    const Scalar* lhs_, Index lhsStride,
-    const Scalar* rhs_, Index rhsStride,
-    Scalar* res_,       Index resIncr, Index resStride,
-    const Scalar& alpha, level3_blocking<Scalar,Scalar>& blocking)
-  {
-    const Index PacketBytes = packet_traits<Scalar>::size*sizeof(Scalar);
-    // strip zeros
-    Index diagSize  = (std::min)(_cols,_depth);
-    Index rows      = _rows;
-    Index depth     = IsLower ? _depth : diagSize;
-    Index cols      = IsLower ? diagSize : _cols;
-    
-    typedef const_blas_data_mapper<Scalar, Index, LhsStorageOrder> LhsMapper;
-    typedef const_blas_data_mapper<Scalar, Index, RhsStorageOrder> RhsMapper;
-    typedef blas_data_mapper<typename Traits::ResScalar, Index, ColMajor, Unaligned, ResInnerStride> ResMapper;
-    LhsMapper lhs(lhs_,lhsStride);
-    RhsMapper rhs(rhs_,rhsStride);
-    ResMapper res(res_, resStride, resIncr);
+template <typename Scalar, typename Index, int Mode, int LhsStorageOrder, bool ConjugateLhs, int RhsStorageOrder,
+          bool ConjugateRhs, int ResInnerStride, int Version>
+EIGEN_DONT_INLINE void product_triangular_matrix_matrix<
+    Scalar, Index, Mode, false, LhsStorageOrder, ConjugateLhs, RhsStorageOrder, ConjugateRhs, ColMajor, ResInnerStride,
+    Version>::run(Index _rows, Index _cols, Index _depth, const Scalar* lhs_, Index lhsStride, const Scalar* rhs_,
+                  Index rhsStride, Scalar* res_, Index resIncr, Index resStride, const Scalar& alpha,
+                  level3_blocking<Scalar, Scalar>& blocking) {
+  const Index PacketBytes = packet_traits<Scalar>::size * sizeof(Scalar);
+  // strip zeros
+  Index diagSize = (std::min)(_cols, _depth);
+  Index rows = _rows;
+  Index depth = IsLower ? _depth : diagSize;
+  Index cols = IsLower ? diagSize : _cols;
 
-    Index kc = blocking.kc();                   // cache block size along the K direction
-    Index mc = (std::min)(rows,blocking.mc());  // cache block size along the M direction
+  typedef const_blas_data_mapper<Scalar, Index, LhsStorageOrder> LhsMapper;
+  typedef const_blas_data_mapper<Scalar, Index, RhsStorageOrder> RhsMapper;
+  typedef blas_data_mapper<typename Traits::ResScalar, Index, ColMajor, Unaligned, ResInnerStride> ResMapper;
+  LhsMapper lhs(lhs_, lhsStride);
+  RhsMapper rhs(rhs_, rhsStride);
+  ResMapper res(res_, resStride, resIncr);
 
-    std::size_t sizeA = kc*mc;
-    std::size_t sizeB = kc*cols+EIGEN_MAX_ALIGN_BYTES/sizeof(Scalar);
+  Index kc = blocking.kc();                    // cache block size along the K direction
+  Index mc = (std::min)(rows, blocking.mc());  // cache block size along the M direction
 
-    ei_declare_aligned_stack_constructed_variable(Scalar, blockA, sizeA, blocking.blockA());
-    ei_declare_aligned_stack_constructed_variable(Scalar, blockB, sizeB, blocking.blockB());
+  std::size_t sizeA = kc * mc;
+  std::size_t sizeB = kc * cols + EIGEN_MAX_ALIGN_BYTES / sizeof(Scalar);
 
-    internal::constructor_without_unaligned_array_assert a;
-    Matrix<Scalar,SmallPanelWidth,SmallPanelWidth,RhsStorageOrder> triangularBuffer(a);
-    triangularBuffer.setZero();
-    if((Mode&ZeroDiag)==ZeroDiag)
-      triangularBuffer.diagonal().setZero();
-    else
-      triangularBuffer.diagonal().setOnes();
+  ei_declare_aligned_stack_constructed_variable(Scalar, blockA, sizeA, blocking.blockA());
+  ei_declare_aligned_stack_constructed_variable(Scalar, blockB, sizeB, blocking.blockB());
 
-    gebp_kernel<Scalar, Scalar, Index, ResMapper, Traits::mr, Traits::nr, ConjugateLhs, ConjugateRhs> gebp_kernel;
-    gemm_pack_lhs<Scalar, Index, LhsMapper, Traits::mr, Traits::LhsProgress, typename Traits::LhsPacket4Packing, LhsStorageOrder> pack_lhs;
-    gemm_pack_rhs<Scalar, Index, RhsMapper, Traits::nr,RhsStorageOrder> pack_rhs;
-    gemm_pack_rhs<Scalar, Index, RhsMapper, Traits::nr,RhsStorageOrder,false,true> pack_rhs_panel;
+  internal::constructor_without_unaligned_array_assert a;
+  Matrix<Scalar, SmallPanelWidth, SmallPanelWidth, RhsStorageOrder> triangularBuffer(a);
+  triangularBuffer.setZero();
+  if ((Mode & ZeroDiag) == ZeroDiag)
+    triangularBuffer.diagonal().setZero();
+  else
+    triangularBuffer.diagonal().setOnes();
 
-    for(Index k2=IsLower ? 0 : depth;
-        IsLower ? k2<depth  : k2>0;
-        IsLower ? k2+=kc   : k2-=kc)
-    {
-      Index actual_kc = (std::min)(IsLower ? depth-k2 : k2, kc);
-      Index actual_k2 = IsLower ? k2 : k2-actual_kc;
+  gebp_kernel<Scalar, Scalar, Index, ResMapper, Traits::mr, Traits::nr, ConjugateLhs, ConjugateRhs> gebp_kernel;
+  gemm_pack_lhs<Scalar, Index, LhsMapper, Traits::mr, Traits::LhsProgress, typename Traits::LhsPacket4Packing,
+                LhsStorageOrder>
+      pack_lhs;
+  gemm_pack_rhs<Scalar, Index, RhsMapper, Traits::nr, RhsStorageOrder> pack_rhs;
+  gemm_pack_rhs<Scalar, Index, RhsMapper, Traits::nr, RhsStorageOrder, false, true> pack_rhs_panel;
 
-      // align blocks with the end of the triangular part for trapezoidal rhs
-      if(IsLower && (k2<cols) && (actual_k2+actual_kc>cols))
-      {
-        actual_kc = cols-k2;
-        k2 = actual_k2 + actual_kc - kc;
-      }
+  for (Index k2 = IsLower ? 0 : depth; IsLower ? k2 < depth : k2 > 0; IsLower ? k2 += kc : k2 -= kc) {
+    Index actual_kc = (std::min)(IsLower ? depth - k2 : k2, kc);
+    Index actual_k2 = IsLower ? k2 : k2 - actual_kc;
 
-      // remaining size
-      Index rs = IsLower ? (std::min)(cols,actual_k2) : cols - k2;
-      // size of the triangular part
-      Index ts = (IsLower && actual_k2>=cols) ? 0 : actual_kc;
+    // align blocks with the end of the triangular part for trapezoidal rhs
+    if (IsLower && (k2 < cols) && (actual_k2 + actual_kc > cols)) {
+      actual_kc = cols - k2;
+      k2 = actual_k2 + actual_kc - kc;
+    }
 
-      Scalar* geb = blockB+ts*ts;
-      geb = geb + internal::first_aligned<PacketBytes>(geb,PacketBytes/sizeof(Scalar));
+    // remaining size
+    Index rs = IsLower ? (std::min)(cols, actual_k2) : cols - k2;
+    // size of the triangular part
+    Index ts = (IsLower && actual_k2 >= cols) ? 0 : actual_kc;
 
-      pack_rhs(geb, rhs.getSubMapper(actual_k2,IsLower ? 0 : k2), actual_kc, rs);
+    Scalar* geb = blockB + ts * ts;
+    geb = geb + internal::first_aligned<PacketBytes>(geb, PacketBytes / sizeof(Scalar));
 
-      // pack the triangular part of the rhs padding the unrolled blocks with zeros
-      if(ts>0)
-      {
-        for (Index j2=0; j2<actual_kc; j2+=SmallPanelWidth)
-        {
-          Index actualPanelWidth = std::min<Index>(actual_kc-j2, SmallPanelWidth);
-          Index actual_j2 = actual_k2 + j2;
-          Index panelOffset = IsLower ? j2+actualPanelWidth : 0;
-          Index panelLength = IsLower ? actual_kc-j2-actualPanelWidth : j2;
-          // general part
-          pack_rhs_panel(blockB+j2*actual_kc,
-                         rhs.getSubMapper(actual_k2+panelOffset, actual_j2),
-                         panelLength, actualPanelWidth,
-                         actual_kc, panelOffset);
+    pack_rhs(geb, rhs.getSubMapper(actual_k2, IsLower ? 0 : k2), actual_kc, rs);
 
-          // append the triangular part via a temporary buffer
-          for (Index j=0;j<actualPanelWidth;++j)
-          {
-            if (SetDiag)
-              triangularBuffer.coeffRef(j,j) = rhs(actual_j2+j,actual_j2+j);
-            for (Index k=IsLower ? j+1 : 0; IsLower ? k<actualPanelWidth : k<j; ++k)
-              triangularBuffer.coeffRef(k,j) = rhs(actual_j2+k,actual_j2+j);
-          }
+    // pack the triangular part of the rhs padding the unrolled blocks with zeros
+    if (ts > 0) {
+      for (Index j2 = 0; j2 < actual_kc; j2 += SmallPanelWidth) {
+        Index actualPanelWidth = std::min<Index>(actual_kc - j2, SmallPanelWidth);
+        Index actual_j2 = actual_k2 + j2;
+        Index panelOffset = IsLower ? j2 + actualPanelWidth : 0;
+        Index panelLength = IsLower ? actual_kc - j2 - actualPanelWidth : j2;
+        // general part
+        pack_rhs_panel(blockB + j2 * actual_kc, rhs.getSubMapper(actual_k2 + panelOffset, actual_j2), panelLength,
+                       actualPanelWidth, actual_kc, panelOffset);
 
-          pack_rhs_panel(blockB+j2*actual_kc,
-                         RhsMapper(triangularBuffer.data(), triangularBuffer.outerStride()),
-                         actualPanelWidth, actualPanelWidth,
-                         actual_kc, j2);
+        // append the triangular part via a temporary buffer
+        for (Index j = 0; j < actualPanelWidth; ++j) {
+          if (SetDiag) triangularBuffer.coeffRef(j, j) = rhs(actual_j2 + j, actual_j2 + j);
+          for (Index k = IsLower ? j + 1 : 0; IsLower ? k < actualPanelWidth : k < j; ++k)
+            triangularBuffer.coeffRef(k, j) = rhs(actual_j2 + k, actual_j2 + j);
         }
-      }
 
-      for (Index i2=0; i2<rows; i2+=mc)
-      {
-        const Index actual_mc = (std::min)(mc,rows-i2);
-        pack_lhs(blockA, lhs.getSubMapper(i2, actual_k2), actual_kc, actual_mc);
-
-        // triangular kernel
-        if(ts>0)
-        {
-          for (Index j2=0; j2<actual_kc; j2+=SmallPanelWidth)
-          {
-            Index actualPanelWidth = std::min<Index>(actual_kc-j2, SmallPanelWidth);
-            Index panelLength = IsLower ? actual_kc-j2 : j2+actualPanelWidth;
-            Index blockOffset = IsLower ? j2 : 0;
-
-            gebp_kernel(res.getSubMapper(i2, actual_k2 + j2),
-                        blockA, blockB+j2*actual_kc,
-                        actual_mc, panelLength, actualPanelWidth,
-                        alpha,
-                        actual_kc, actual_kc,  // strides
-                        blockOffset, blockOffset);// offsets
-          }
-        }
-        gebp_kernel(res.getSubMapper(i2, IsLower ? 0 : k2),
-                    blockA, geb, actual_mc, actual_kc, rs,
-                    alpha,
-                    -1, -1, 0, 0);
+        pack_rhs_panel(blockB + j2 * actual_kc, RhsMapper(triangularBuffer.data(), triangularBuffer.outerStride()),
+                       actualPanelWidth, actualPanelWidth, actual_kc, j2);
       }
     }
+
+    for (Index i2 = 0; i2 < rows; i2 += mc) {
+      const Index actual_mc = (std::min)(mc, rows - i2);
+      pack_lhs(blockA, lhs.getSubMapper(i2, actual_k2), actual_kc, actual_mc);
+
+      // triangular kernel
+      if (ts > 0) {
+        for (Index j2 = 0; j2 < actual_kc; j2 += SmallPanelWidth) {
+          Index actualPanelWidth = std::min<Index>(actual_kc - j2, SmallPanelWidth);
+          Index panelLength = IsLower ? actual_kc - j2 : j2 + actualPanelWidth;
+          Index blockOffset = IsLower ? j2 : 0;
+
+          gebp_kernel(res.getSubMapper(i2, actual_k2 + j2), blockA, blockB + j2 * actual_kc, actual_mc, panelLength,
+                      actualPanelWidth, alpha, actual_kc, actual_kc,  // strides
+                      blockOffset, blockOffset);                      // offsets
+        }
+      }
+      gebp_kernel(res.getSubMapper(i2, IsLower ? 0 : k2), blockA, geb, actual_mc, actual_kc, rs, alpha, -1, -1, 0, 0);
+    }
   }
+}
 
 /***************************************************************************
-* Wrapper to product_triangular_matrix_matrix
-***************************************************************************/
+ * Wrapper to product_triangular_matrix_matrix
+ ***************************************************************************/
 
-} // end namespace internal
+}  // end namespace internal
 
 namespace internal {
-template<int Mode, bool LhsIsTriangular, typename Lhs, typename Rhs>
-struct triangular_product_impl<Mode,LhsIsTriangular,Lhs,false,Rhs,false>
-{
-  template<typename Dest> static void run(Dest& dst, const Lhs &a_lhs, const Rhs &a_rhs, const typename Dest::Scalar& alpha)
-  {
-    typedef typename Lhs::Scalar  LhsScalar;
-    typedef typename Rhs::Scalar  RhsScalar;
+template <int Mode, bool LhsIsTriangular, typename Lhs, typename Rhs>
+struct triangular_product_impl<Mode, LhsIsTriangular, Lhs, false, Rhs, false> {
+  template <typename Dest>
+  static void run(Dest& dst, const Lhs& a_lhs, const Rhs& a_rhs, const typename Dest::Scalar& alpha) {
+    typedef typename Lhs::Scalar LhsScalar;
+    typedef typename Rhs::Scalar RhsScalar;
     typedef typename Dest::Scalar Scalar;
-    
+
     typedef internal::blas_traits<Lhs> LhsBlasTraits;
     typedef typename LhsBlasTraits::DirectLinearAccessType ActualLhsType;
     typedef internal::remove_all_t<ActualLhsType> ActualLhsTypeCleaned;
@@ -433,49 +359,46 @@
     RhsScalar rhs_alpha = RhsBlasTraits::extractScalarFactor(a_rhs);
     Scalar actualAlpha = alpha * lhs_alpha * rhs_alpha;
 
-    typedef internal::gemm_blocking_space<(Dest::Flags&RowMajorBit) ? RowMajor : ColMajor,Scalar,Scalar,
-              Lhs::MaxRowsAtCompileTime, Rhs::MaxColsAtCompileTime, Lhs::MaxColsAtCompileTime,4> BlockingType;
+    typedef internal::gemm_blocking_space<(Dest::Flags & RowMajorBit) ? RowMajor : ColMajor, Scalar, Scalar,
+                                          Lhs::MaxRowsAtCompileTime, Rhs::MaxColsAtCompileTime,
+                                          Lhs::MaxColsAtCompileTime, 4>
+        BlockingType;
 
-    enum { IsLower = (Mode&Lower) == Lower };
-    Index stripedRows  = ((!LhsIsTriangular) || (IsLower))  ? lhs.rows() : (std::min)(lhs.rows(),lhs.cols());
-    Index stripedCols  = ((LhsIsTriangular)  || (!IsLower)) ? rhs.cols() : (std::min)(rhs.cols(),rhs.rows());
-    Index stripedDepth = LhsIsTriangular ? ((!IsLower) ? lhs.cols() : (std::min)(lhs.cols(),lhs.rows()))
-                                         : ((IsLower)  ? rhs.rows() : (std::min)(rhs.rows(),rhs.cols()));
+    enum { IsLower = (Mode & Lower) == Lower };
+    Index stripedRows = ((!LhsIsTriangular) || (IsLower)) ? lhs.rows() : (std::min)(lhs.rows(), lhs.cols());
+    Index stripedCols = ((LhsIsTriangular) || (!IsLower)) ? rhs.cols() : (std::min)(rhs.cols(), rhs.rows());
+    Index stripedDepth = LhsIsTriangular ? ((!IsLower) ? lhs.cols() : (std::min)(lhs.cols(), lhs.rows()))
+                                         : ((IsLower) ? rhs.rows() : (std::min)(rhs.rows(), rhs.cols()));
 
     BlockingType blocking(stripedRows, stripedCols, stripedDepth, 1, false);
 
-    internal::product_triangular_matrix_matrix<Scalar, Index,
-      Mode, LhsIsTriangular,
-      (internal::traits<ActualLhsTypeCleaned>::Flags&RowMajorBit) ? RowMajor : ColMajor, LhsBlasTraits::NeedToConjugate,
-      (internal::traits<ActualRhsTypeCleaned>::Flags&RowMajorBit) ? RowMajor : ColMajor, RhsBlasTraits::NeedToConjugate,
-      (internal::traits<Dest          >::Flags&RowMajorBit) ? RowMajor : ColMajor, Dest::InnerStrideAtCompileTime>
-      ::run(
-        stripedRows, stripedCols, stripedDepth,   // sizes
-        &lhs.coeffRef(0,0), lhs.outerStride(),    // lhs info
-        &rhs.coeffRef(0,0), rhs.outerStride(),    // rhs info
-        &dst.coeffRef(0,0), dst.innerStride(), dst.outerStride(),    // result info
-        actualAlpha, blocking
-      );
+    internal::product_triangular_matrix_matrix<
+        Scalar, Index, Mode, LhsIsTriangular,
+        (internal::traits<ActualLhsTypeCleaned>::Flags & RowMajorBit) ? RowMajor : ColMajor,
+        LhsBlasTraits::NeedToConjugate,
+        (internal::traits<ActualRhsTypeCleaned>::Flags & RowMajorBit) ? RowMajor : ColMajor,
+        RhsBlasTraits::NeedToConjugate, (internal::traits<Dest>::Flags & RowMajorBit) ? RowMajor : ColMajor,
+        Dest::InnerStrideAtCompileTime>::run(stripedRows, stripedCols, stripedDepth,                     // sizes
+                                             &lhs.coeffRef(0, 0), lhs.outerStride(),                     // lhs info
+                                             &rhs.coeffRef(0, 0), rhs.outerStride(),                     // rhs info
+                                             &dst.coeffRef(0, 0), dst.innerStride(), dst.outerStride(),  // result info
+                                             actualAlpha, blocking);
 
     // Apply correction if the diagonal is unit and a scalar factor was nested:
-    if ((Mode&UnitDiag)==UnitDiag)
-    {
-      if (LhsIsTriangular && !numext::is_exactly_one(lhs_alpha))
-      {
-        Index diagSize = (std::min)(lhs.rows(),lhs.cols());
-        dst.topRows(diagSize) -= ((lhs_alpha-LhsScalar(1))*a_rhs).topRows(diagSize);
-      }
-      else if ((!LhsIsTriangular) && !numext::is_exactly_one(rhs_alpha))
-      {
-        Index diagSize = (std::min)(rhs.rows(),rhs.cols());
-        dst.leftCols(diagSize) -= (rhs_alpha-RhsScalar(1))*a_lhs.leftCols(diagSize);
+    if ((Mode & UnitDiag) == UnitDiag) {
+      if (LhsIsTriangular && !numext::is_exactly_one(lhs_alpha)) {
+        Index diagSize = (std::min)(lhs.rows(), lhs.cols());
+        dst.topRows(diagSize) -= ((lhs_alpha - LhsScalar(1)) * a_rhs).topRows(diagSize);
+      } else if ((!LhsIsTriangular) && !numext::is_exactly_one(rhs_alpha)) {
+        Index diagSize = (std::min)(rhs.rows(), rhs.cols());
+        dst.leftCols(diagSize) -= (rhs_alpha - RhsScalar(1)) * a_lhs.leftCols(diagSize);
       }
     }
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_TRIANGULAR_MATRIX_MATRIX_H
+#endif  // EIGEN_TRIANGULAR_MATRIX_MATRIX_H
diff --git a/Eigen/src/Core/products/TriangularMatrixMatrix_BLAS.h b/Eigen/src/Core/products/TriangularMatrixMatrix_BLAS.h
index c556a24..78e48ad 100644
--- a/Eigen/src/Core/products/TriangularMatrixMatrix_BLAS.h
+++ b/Eigen/src/Core/products/TriangularMatrixMatrix_BLAS.h
@@ -36,39 +36,33 @@
 // IWYU pragma: private
 #include "../InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
-
-template <typename Scalar, typename Index,
-          int Mode, bool LhsIsTriangular,
-          int LhsStorageOrder, bool ConjugateLhs,
-          int RhsStorageOrder, bool ConjugateRhs,
-          int ResStorageOrder>
-struct product_triangular_matrix_matrix_trmm :
-       product_triangular_matrix_matrix<Scalar,Index,Mode,
-          LhsIsTriangular,LhsStorageOrder,ConjugateLhs,
-          RhsStorageOrder, ConjugateRhs, ResStorageOrder, 1, BuiltIn> {};
-
+template <typename Scalar, typename Index, int Mode, bool LhsIsTriangular, int LhsStorageOrder, bool ConjugateLhs,
+          int RhsStorageOrder, bool ConjugateRhs, int ResStorageOrder>
+struct product_triangular_matrix_matrix_trmm
+    : product_triangular_matrix_matrix<Scalar, Index, Mode, LhsIsTriangular, LhsStorageOrder, ConjugateLhs,
+                                       RhsStorageOrder, ConjugateRhs, ResStorageOrder, 1, BuiltIn> {};
 
 // try to go to BLAS specialization
-#define EIGEN_BLAS_TRMM_SPECIALIZE(Scalar, LhsIsTriangular) \
-template <typename Index, int Mode, \
-          int LhsStorageOrder, bool ConjugateLhs, \
-          int RhsStorageOrder, bool ConjugateRhs> \
-struct product_triangular_matrix_matrix<Scalar,Index, Mode, LhsIsTriangular, \
-           LhsStorageOrder,ConjugateLhs, RhsStorageOrder,ConjugateRhs,ColMajor,1,Specialized> { \
-  static inline void run(Index _rows, Index _cols, Index _depth, const Scalar* _lhs, Index lhsStride,\
-    const Scalar* _rhs, Index rhsStride, Scalar* res, Index resIncr, Index resStride, Scalar alpha, level3_blocking<Scalar,Scalar>& blocking) { \
-      EIGEN_ONLY_USED_FOR_DEBUG(resIncr); \
-      eigen_assert(resIncr == 1); \
-      product_triangular_matrix_matrix_trmm<Scalar,Index,Mode, \
-        LhsIsTriangular,LhsStorageOrder,ConjugateLhs, \
-        RhsStorageOrder, ConjugateRhs, ColMajor>::run( \
-          _rows, _cols, _depth, _lhs, lhsStride, _rhs, rhsStride, res, resStride, alpha, blocking); \
-  } \
-};
+#define EIGEN_BLAS_TRMM_SPECIALIZE(Scalar, LhsIsTriangular)                                                           \
+  template <typename Index, int Mode, int LhsStorageOrder, bool ConjugateLhs, int RhsStorageOrder, bool ConjugateRhs> \
+  struct product_triangular_matrix_matrix<Scalar, Index, Mode, LhsIsTriangular, LhsStorageOrder, ConjugateLhs,        \
+                                          RhsStorageOrder, ConjugateRhs, ColMajor, 1, Specialized> {                  \
+    static inline void run(Index _rows, Index _cols, Index _depth, const Scalar* _lhs, Index lhsStride,               \
+                           const Scalar* _rhs, Index rhsStride, Scalar* res, Index resIncr, Index resStride,          \
+                           Scalar alpha, level3_blocking<Scalar, Scalar>& blocking) {                                 \
+      EIGEN_ONLY_USED_FOR_DEBUG(resIncr);                                                                             \
+      eigen_assert(resIncr == 1);                                                                                     \
+      product_triangular_matrix_matrix_trmm<Scalar, Index, Mode, LhsIsTriangular, LhsStorageOrder, ConjugateLhs,      \
+                                            RhsStorageOrder, ConjugateRhs, ColMajor>::run(_rows, _cols, _depth, _lhs, \
+                                                                                          lhsStride, _rhs, rhsStride, \
+                                                                                          res, resStride, alpha,      \
+                                                                                          blocking);                  \
+    }                                                                                                                 \
+  };
 
 EIGEN_BLAS_TRMM_SPECIALIZE(double, true)
 EIGEN_BLAS_TRMM_SPECIALIZE(double, false)
@@ -80,110 +74,113 @@
 EIGEN_BLAS_TRMM_SPECIALIZE(scomplex, false)
 
 // implements col-major += alpha * op(triangular) * op(general)
-#define EIGEN_BLAS_TRMM_L(EIGTYPE, BLASTYPE, EIGPREFIX, BLASFUNC) \
-template <typename Index, int Mode, \
-          int LhsStorageOrder, bool ConjugateLhs, \
-          int RhsStorageOrder, bool ConjugateRhs> \
-struct product_triangular_matrix_matrix_trmm<EIGTYPE,Index,Mode,true, \
-         LhsStorageOrder,ConjugateLhs,RhsStorageOrder,ConjugateRhs,ColMajor> \
-{ \
-  enum { \
-    IsLower = (Mode&Lower) == Lower, \
-    SetDiag = (Mode&(ZeroDiag|UnitDiag)) ? 0 : 1, \
-    IsUnitDiag  = (Mode&UnitDiag) ? 1 : 0, \
-    IsZeroDiag  = (Mode&ZeroDiag) ? 1 : 0, \
-    LowUp = IsLower ? Lower : Upper, \
-    conjA = ((LhsStorageOrder==ColMajor) && ConjugateLhs) ? 1 : 0 \
-  }; \
-\
-  static void run( \
-    Index _rows, Index _cols, Index _depth, \
-    const EIGTYPE* _lhs, Index lhsStride, \
-    const EIGTYPE* _rhs, Index rhsStride, \
-    EIGTYPE* res,        Index resStride, \
-    EIGTYPE alpha, level3_blocking<EIGTYPE,EIGTYPE>& blocking) \
-  { \
-   Index diagSize  = (std::min)(_rows,_depth); \
-   Index rows      = IsLower ? _rows : diagSize; \
-   Index depth     = IsLower ? diagSize : _depth; \
-   Index cols      = _cols; \
-\
-   typedef Matrix<EIGTYPE, Dynamic, Dynamic, LhsStorageOrder> MatrixLhs; \
-   typedef Matrix<EIGTYPE, Dynamic, Dynamic, RhsStorageOrder> MatrixRhs; \
-\
-/* Non-square case - doesn't fit to BLAS ?TRMM. Fall to default triangular product or call BLAS ?GEMM*/ \
-   if (rows != depth) { \
-\
-     /* FIXME handle mkl_domain_get_max_threads */ \
-     /*int nthr = mkl_domain_get_max_threads(EIGEN_BLAS_DOMAIN_BLAS);*/ int nthr = 1;\
-\
-     if (((nthr==1) && (((std::max)(rows,depth)-diagSize)/(double)diagSize < 0.5))) { \
-     /* Most likely no benefit to call TRMM or GEMM from BLAS */ \
-       product_triangular_matrix_matrix<EIGTYPE,Index,Mode,true, \
-       LhsStorageOrder,ConjugateLhs, RhsStorageOrder, ConjugateRhs, ColMajor, 1, BuiltIn>::run( \
-           _rows, _cols, _depth, _lhs, lhsStride, _rhs, rhsStride, res, 1, resStride, alpha, blocking); \
-     /*std::cout << "TRMM_L: A is not square! Go to Eigen TRMM implementation!\n";*/ \
-     } else { \
-     /* Make sense to call GEMM */ \
-       Map<const MatrixLhs, 0, OuterStride<> > lhsMap(_lhs,rows,depth,OuterStride<>(lhsStride)); \
-       MatrixLhs aa_tmp=lhsMap.template triangularView<Mode>(); \
-       BlasIndex aStride = convert_index<BlasIndex>(aa_tmp.outerStride()); \
-       gemm_blocking_space<ColMajor,EIGTYPE,EIGTYPE,Dynamic,Dynamic,Dynamic> gemm_blocking(_rows,_cols,_depth, 1, true); \
-       general_matrix_matrix_product<Index,EIGTYPE,LhsStorageOrder,ConjugateLhs,EIGTYPE,RhsStorageOrder,ConjugateRhs,ColMajor,1>::run( \
-       rows, cols, depth, aa_tmp.data(), aStride, _rhs, rhsStride, res, 1, resStride, alpha, gemm_blocking, 0); \
-\
-     /*std::cout << "TRMM_L: A is not square! Go to BLAS GEMM implementation! " << nthr<<" \n";*/ \
-     } \
-     return; \
-   } \
-   char side = 'L', transa, uplo, diag = 'N'; \
-   EIGTYPE *b; \
-   const EIGTYPE *a; \
-   BlasIndex m, n, lda, ldb; \
-\
-/* Set m, n */ \
-   m = convert_index<BlasIndex>(diagSize); \
-   n = convert_index<BlasIndex>(cols); \
-\
-/* Set trans */ \
-   transa = (LhsStorageOrder==RowMajor) ? ((ConjugateLhs) ? 'C' : 'T') : 'N'; \
-\
-/* Set b, ldb */ \
-   Map<const MatrixRhs, 0, OuterStride<> > rhs(_rhs,depth,cols,OuterStride<>(rhsStride)); \
-   MatrixX##EIGPREFIX b_tmp; \
-\
-   if (ConjugateRhs) b_tmp = rhs.conjugate(); else b_tmp = rhs; \
-   b = b_tmp.data(); \
-   ldb = convert_index<BlasIndex>(b_tmp.outerStride()); \
-\
-/* Set uplo */ \
-   uplo = IsLower ? 'L' : 'U'; \
-   if (LhsStorageOrder==RowMajor) uplo = (uplo == 'L') ? 'U' : 'L'; \
-/* Set a, lda */ \
-   Map<const MatrixLhs, 0, OuterStride<> > lhs(_lhs,rows,depth,OuterStride<>(lhsStride)); \
-   MatrixLhs a_tmp; \
-\
-   if ((conjA!=0) || (SetDiag==0)) { \
-     if (conjA) a_tmp = lhs.conjugate(); else a_tmp = lhs; \
-     if (IsZeroDiag) \
-       a_tmp.diagonal().setZero(); \
-     else if (IsUnitDiag) \
-       a_tmp.diagonal().setOnes();\
-     a = a_tmp.data(); \
-     lda = convert_index<BlasIndex>(a_tmp.outerStride()); \
-   } else { \
-     a = _lhs; \
-     lda = convert_index<BlasIndex>(lhsStride); \
-   } \
-   /*std::cout << "TRMM_L: A is square! Go to BLAS TRMM implementation! \n";*/ \
-/* call ?trmm*/ \
-   BLASFUNC(&side, &uplo, &transa, &diag, &m, &n, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (BLASTYPE*)b, &ldb); \
-\
-/* Add op(a_triangular)*b into res*/ \
-   Map<MatrixX##EIGPREFIX, 0, OuterStride<> > res_tmp(res,rows,cols,OuterStride<>(resStride)); \
-   res_tmp=res_tmp+b_tmp; \
-  } \
-};
+#define EIGEN_BLAS_TRMM_L(EIGTYPE, BLASTYPE, EIGPREFIX, BLASFUNC)                                                      \
+  template <typename Index, int Mode, int LhsStorageOrder, bool ConjugateLhs, int RhsStorageOrder, bool ConjugateRhs>  \
+  struct product_triangular_matrix_matrix_trmm<EIGTYPE, Index, Mode, true, LhsStorageOrder, ConjugateLhs,              \
+                                               RhsStorageOrder, ConjugateRhs, ColMajor> {                              \
+    enum {                                                                                                             \
+      IsLower = (Mode & Lower) == Lower,                                                                               \
+      SetDiag = (Mode & (ZeroDiag | UnitDiag)) ? 0 : 1,                                                                \
+      IsUnitDiag = (Mode & UnitDiag) ? 1 : 0,                                                                          \
+      IsZeroDiag = (Mode & ZeroDiag) ? 1 : 0,                                                                          \
+      LowUp = IsLower ? Lower : Upper,                                                                                 \
+      conjA = ((LhsStorageOrder == ColMajor) && ConjugateLhs) ? 1 : 0                                                  \
+    };                                                                                                                 \
+                                                                                                                       \
+    static void run(Index _rows, Index _cols, Index _depth, const EIGTYPE* _lhs, Index lhsStride, const EIGTYPE* _rhs, \
+                    Index rhsStride, EIGTYPE* res, Index resStride, EIGTYPE alpha,                                     \
+                    level3_blocking<EIGTYPE, EIGTYPE>& blocking) {                                                     \
+      Index diagSize = (std::min)(_rows, _depth);                                                                      \
+      Index rows = IsLower ? _rows : diagSize;                                                                         \
+      Index depth = IsLower ? diagSize : _depth;                                                                       \
+      Index cols = _cols;                                                                                              \
+                                                                                                                       \
+      typedef Matrix<EIGTYPE, Dynamic, Dynamic, LhsStorageOrder> MatrixLhs;                                            \
+      typedef Matrix<EIGTYPE, Dynamic, Dynamic, RhsStorageOrder> MatrixRhs;                                            \
+                                                                                                                       \
+      /* Non-square case - doesn't fit to BLAS ?TRMM. Fall to default triangular product or call BLAS ?GEMM*/          \
+      if (rows != depth) {                                                                                             \
+        /* FIXME handle mkl_domain_get_max_threads */                                                                  \
+        /*int nthr = mkl_domain_get_max_threads(EIGEN_BLAS_DOMAIN_BLAS);*/ int nthr = 1;                               \
+                                                                                                                       \
+        if (((nthr == 1) && (((std::max)(rows, depth) - diagSize) / (double)diagSize < 0.5))) {                        \
+          /* Most likely no benefit to call TRMM or GEMM from BLAS */                                                  \
+          product_triangular_matrix_matrix<EIGTYPE, Index, Mode, true, LhsStorageOrder, ConjugateLhs, RhsStorageOrder, \
+                                           ConjugateRhs, ColMajor, 1, BuiltIn>::run(_rows, _cols, _depth, _lhs,        \
+                                                                                    lhsStride, _rhs, rhsStride, res,   \
+                                                                                    1, resStride, alpha, blocking);    \
+          /*std::cout << "TRMM_L: A is not square! Go to Eigen TRMM implementation!\n";*/                              \
+        } else {                                                                                                       \
+          /* Make sense to call GEMM */                                                                                \
+          Map<const MatrixLhs, 0, OuterStride<> > lhsMap(_lhs, rows, depth, OuterStride<>(lhsStride));                 \
+          MatrixLhs aa_tmp = lhsMap.template triangularView<Mode>();                                                   \
+          BlasIndex aStride = convert_index<BlasIndex>(aa_tmp.outerStride());                                          \
+          gemm_blocking_space<ColMajor, EIGTYPE, EIGTYPE, Dynamic, Dynamic, Dynamic> gemm_blocking(_rows, _cols,       \
+                                                                                                   _depth, 1, true);   \
+          general_matrix_matrix_product<Index, EIGTYPE, LhsStorageOrder, ConjugateLhs, EIGTYPE, RhsStorageOrder,       \
+                                        ConjugateRhs, ColMajor, 1>::run(rows, cols, depth, aa_tmp.data(), aStride,     \
+                                                                        _rhs, rhsStride, res, 1, resStride, alpha,     \
+                                                                        gemm_blocking, 0);                             \
+                                                                                                                       \
+          /*std::cout << "TRMM_L: A is not square! Go to BLAS GEMM implementation! " << nthr<<" \n";*/                 \
+        }                                                                                                              \
+        return;                                                                                                        \
+      }                                                                                                                \
+      char side = 'L', transa, uplo, diag = 'N';                                                                       \
+      EIGTYPE* b;                                                                                                      \
+      const EIGTYPE* a;                                                                                                \
+      BlasIndex m, n, lda, ldb;                                                                                        \
+                                                                                                                       \
+      /* Set m, n */                                                                                                   \
+      m = convert_index<BlasIndex>(diagSize);                                                                          \
+      n = convert_index<BlasIndex>(cols);                                                                              \
+                                                                                                                       \
+      /* Set trans */                                                                                                  \
+      transa = (LhsStorageOrder == RowMajor) ? ((ConjugateLhs) ? 'C' : 'T') : 'N';                                     \
+                                                                                                                       \
+      /* Set b, ldb */                                                                                                 \
+      Map<const MatrixRhs, 0, OuterStride<> > rhs(_rhs, depth, cols, OuterStride<>(rhsStride));                        \
+      MatrixX##EIGPREFIX b_tmp;                                                                                        \
+                                                                                                                       \
+      if (ConjugateRhs)                                                                                                \
+        b_tmp = rhs.conjugate();                                                                                       \
+      else                                                                                                             \
+        b_tmp = rhs;                                                                                                   \
+      b = b_tmp.data();                                                                                                \
+      ldb = convert_index<BlasIndex>(b_tmp.outerStride());                                                             \
+                                                                                                                       \
+      /* Set uplo */                                                                                                   \
+      uplo = IsLower ? 'L' : 'U';                                                                                      \
+      if (LhsStorageOrder == RowMajor) uplo = (uplo == 'L') ? 'U' : 'L';                                               \
+      /* Set a, lda */                                                                                                 \
+      Map<const MatrixLhs, 0, OuterStride<> > lhs(_lhs, rows, depth, OuterStride<>(lhsStride));                        \
+      MatrixLhs a_tmp;                                                                                                 \
+                                                                                                                       \
+      if ((conjA != 0) || (SetDiag == 0)) {                                                                            \
+        if (conjA)                                                                                                     \
+          a_tmp = lhs.conjugate();                                                                                     \
+        else                                                                                                           \
+          a_tmp = lhs;                                                                                                 \
+        if (IsZeroDiag)                                                                                                \
+          a_tmp.diagonal().setZero();                                                                                  \
+        else if (IsUnitDiag)                                                                                           \
+          a_tmp.diagonal().setOnes();                                                                                  \
+        a = a_tmp.data();                                                                                              \
+        lda = convert_index<BlasIndex>(a_tmp.outerStride());                                                           \
+      } else {                                                                                                         \
+        a = _lhs;                                                                                                      \
+        lda = convert_index<BlasIndex>(lhsStride);                                                                     \
+      }                                                                                                                \
+      /*std::cout << "TRMM_L: A is square! Go to BLAS TRMM implementation! \n";*/                                      \
+      /* call ?trmm*/                                                                                                  \
+      BLASFUNC(&side, &uplo, &transa, &diag, &m, &n, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)a,    \
+               &lda, (BLASTYPE*)b, &ldb);                                                                              \
+                                                                                                                       \
+      /* Add op(a_triangular)*b into res*/                                                                             \
+      Map<MatrixX##EIGPREFIX, 0, OuterStride<> > res_tmp(res, rows, cols, OuterStride<>(resStride));                   \
+      res_tmp = res_tmp + b_tmp;                                                                                       \
+    }                                                                                                                  \
+  };
 
 #ifdef EIGEN_USE_MKL
 EIGEN_BLAS_TRMM_L(double, double, d, dtrmm)
@@ -198,109 +195,115 @@
 #endif
 
 // implements col-major += alpha * op(general) * op(triangular)
-#define EIGEN_BLAS_TRMM_R(EIGTYPE, BLASTYPE, EIGPREFIX, BLASFUNC) \
-template <typename Index, int Mode, \
-          int LhsStorageOrder, bool ConjugateLhs, \
-          int RhsStorageOrder, bool ConjugateRhs> \
-struct product_triangular_matrix_matrix_trmm<EIGTYPE,Index,Mode,false, \
-         LhsStorageOrder,ConjugateLhs,RhsStorageOrder,ConjugateRhs,ColMajor> \
-{ \
-  enum { \
-    IsLower = (Mode&Lower) == Lower, \
-    SetDiag = (Mode&(ZeroDiag|UnitDiag)) ? 0 : 1, \
-    IsUnitDiag  = (Mode&UnitDiag) ? 1 : 0, \
-    IsZeroDiag  = (Mode&ZeroDiag) ? 1 : 0, \
-    LowUp = IsLower ? Lower : Upper, \
-    conjA = ((RhsStorageOrder==ColMajor) && ConjugateRhs) ? 1 : 0 \
-  }; \
-\
-  static void run( \
-    Index _rows, Index _cols, Index _depth, \
-    const EIGTYPE* _lhs, Index lhsStride, \
-    const EIGTYPE* _rhs, Index rhsStride, \
-    EIGTYPE* res,        Index resStride, \
-    EIGTYPE alpha, level3_blocking<EIGTYPE,EIGTYPE>& blocking) \
-  { \
-   Index diagSize  = (std::min)(_cols,_depth); \
-   Index rows      = _rows; \
-   Index depth     = IsLower ? _depth : diagSize; \
-   Index cols      = IsLower ? diagSize : _cols; \
-\
-   typedef Matrix<EIGTYPE, Dynamic, Dynamic, LhsStorageOrder> MatrixLhs; \
-   typedef Matrix<EIGTYPE, Dynamic, Dynamic, RhsStorageOrder> MatrixRhs; \
-\
-/* Non-square case - doesn't fit to BLAS ?TRMM. Fall to default triangular product or call BLAS ?GEMM*/ \
-   if (cols != depth) { \
-\
-     int nthr = 1 /*mkl_domain_get_max_threads(EIGEN_BLAS_DOMAIN_BLAS)*/; \
-\
-     if ((nthr==1) && (((std::max)(cols,depth)-diagSize)/(double)diagSize < 0.5)) { \
-     /* Most likely no benefit to call TRMM or GEMM from BLAS*/ \
-       product_triangular_matrix_matrix<EIGTYPE,Index,Mode,false, \
-       LhsStorageOrder,ConjugateLhs, RhsStorageOrder, ConjugateRhs, ColMajor, 1, BuiltIn>::run( \
-           _rows, _cols, _depth, _lhs, lhsStride, _rhs, rhsStride, res, 1, resStride, alpha, blocking); \
-       /*std::cout << "TRMM_R: A is not square! Go to Eigen TRMM implementation!\n";*/ \
-     } else { \
-     /* Make sense to call GEMM */ \
-       Map<const MatrixRhs, 0, OuterStride<> > rhsMap(_rhs,depth,cols, OuterStride<>(rhsStride)); \
-       MatrixRhs aa_tmp=rhsMap.template triangularView<Mode>(); \
-       BlasIndex aStride = convert_index<BlasIndex>(aa_tmp.outerStride()); \
-       gemm_blocking_space<ColMajor,EIGTYPE,EIGTYPE,Dynamic,Dynamic,Dynamic> gemm_blocking(_rows,_cols,_depth, 1, true); \
-       general_matrix_matrix_product<Index,EIGTYPE,LhsStorageOrder,ConjugateLhs,EIGTYPE,RhsStorageOrder,ConjugateRhs,ColMajor,1>::run( \
-       rows, cols, depth, _lhs, lhsStride, aa_tmp.data(), aStride, res, 1, resStride, alpha, gemm_blocking, 0); \
-\
-     /*std::cout << "TRMM_R: A is not square! Go to BLAS GEMM implementation! " << nthr<<" \n";*/ \
-     } \
-     return; \
-   } \
-   char side = 'R', transa, uplo, diag = 'N'; \
-   EIGTYPE *b; \
-   const EIGTYPE *a; \
-   BlasIndex m, n, lda, ldb; \
-\
-/* Set m, n */ \
-   m = convert_index<BlasIndex>(rows); \
-   n = convert_index<BlasIndex>(diagSize); \
-\
-/* Set trans */ \
-   transa = (RhsStorageOrder==RowMajor) ? ((ConjugateRhs) ? 'C' : 'T') : 'N'; \
-\
-/* Set b, ldb */ \
-   Map<const MatrixLhs, 0, OuterStride<> > lhs(_lhs,rows,depth,OuterStride<>(lhsStride)); \
-   MatrixX##EIGPREFIX b_tmp; \
-\
-   if (ConjugateLhs) b_tmp = lhs.conjugate(); else b_tmp = lhs; \
-   b = b_tmp.data(); \
-   ldb = convert_index<BlasIndex>(b_tmp.outerStride()); \
-\
-/* Set uplo */ \
-   uplo = IsLower ? 'L' : 'U'; \
-   if (RhsStorageOrder==RowMajor) uplo = (uplo == 'L') ? 'U' : 'L'; \
-/* Set a, lda */ \
-   Map<const MatrixRhs, 0, OuterStride<> > rhs(_rhs,depth,cols, OuterStride<>(rhsStride)); \
-   MatrixRhs a_tmp; \
-\
-   if ((conjA!=0) || (SetDiag==0)) { \
-     if (conjA) a_tmp = rhs.conjugate(); else a_tmp = rhs; \
-     if (IsZeroDiag) \
-       a_tmp.diagonal().setZero(); \
-     else if (IsUnitDiag) \
-       a_tmp.diagonal().setOnes();\
-     a = a_tmp.data(); \
-     lda = convert_index<BlasIndex>(a_tmp.outerStride()); \
-   } else { \
-     a = _rhs; \
-     lda = convert_index<BlasIndex>(rhsStride); \
-   } \
-   /*std::cout << "TRMM_R: A is square! Go to BLAS TRMM implementation! \n";*/ \
-/* call ?trmm*/ \
-   BLASFUNC(&side, &uplo, &transa, &diag, &m, &n, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (BLASTYPE*)b, &ldb); \
-\
-/* Add op(a_triangular)*b into res*/ \
-   Map<MatrixX##EIGPREFIX, 0, OuterStride<> > res_tmp(res,rows,cols,OuterStride<>(resStride)); \
-   res_tmp=res_tmp+b_tmp; \
-  } \
-};
+#define EIGEN_BLAS_TRMM_R(EIGTYPE, BLASTYPE, EIGPREFIX, BLASFUNC)                                                      \
+  template <typename Index, int Mode, int LhsStorageOrder, bool ConjugateLhs, int RhsStorageOrder, bool ConjugateRhs>  \
+  struct product_triangular_matrix_matrix_trmm<EIGTYPE, Index, Mode, false, LhsStorageOrder, ConjugateLhs,             \
+                                               RhsStorageOrder, ConjugateRhs, ColMajor> {                              \
+    enum {                                                                                                             \
+      IsLower = (Mode & Lower) == Lower,                                                                               \
+      SetDiag = (Mode & (ZeroDiag | UnitDiag)) ? 0 : 1,                                                                \
+      IsUnitDiag = (Mode & UnitDiag) ? 1 : 0,                                                                          \
+      IsZeroDiag = (Mode & ZeroDiag) ? 1 : 0,                                                                          \
+      LowUp = IsLower ? Lower : Upper,                                                                                 \
+      conjA = ((RhsStorageOrder == ColMajor) && ConjugateRhs) ? 1 : 0                                                  \
+    };                                                                                                                 \
+                                                                                                                       \
+    static void run(Index _rows, Index _cols, Index _depth, const EIGTYPE* _lhs, Index lhsStride, const EIGTYPE* _rhs, \
+                    Index rhsStride, EIGTYPE* res, Index resStride, EIGTYPE alpha,                                     \
+                    level3_blocking<EIGTYPE, EIGTYPE>& blocking) {                                                     \
+      Index diagSize = (std::min)(_cols, _depth);                                                                      \
+      Index rows = _rows;                                                                                              \
+      Index depth = IsLower ? _depth : diagSize;                                                                       \
+      Index cols = IsLower ? diagSize : _cols;                                                                         \
+                                                                                                                       \
+      typedef Matrix<EIGTYPE, Dynamic, Dynamic, LhsStorageOrder> MatrixLhs;                                            \
+      typedef Matrix<EIGTYPE, Dynamic, Dynamic, RhsStorageOrder> MatrixRhs;                                            \
+                                                                                                                       \
+      /* Non-square case - doesn't fit to BLAS ?TRMM. Fall to default triangular product or call BLAS ?GEMM*/          \
+      if (cols != depth) {                                                                                             \
+        int nthr = 1 /*mkl_domain_get_max_threads(EIGEN_BLAS_DOMAIN_BLAS)*/;                                           \
+                                                                                                                       \
+        if ((nthr == 1) && (((std::max)(cols, depth) - diagSize) / (double)diagSize < 0.5)) {                          \
+          /* Most likely no benefit to call TRMM or GEMM from BLAS*/                                                   \
+          product_triangular_matrix_matrix<EIGTYPE, Index, Mode, false, LhsStorageOrder, ConjugateLhs,                 \
+                                           RhsStorageOrder, ConjugateRhs, ColMajor, 1, BuiltIn>::run(_rows, _cols,     \
+                                                                                                     _depth, _lhs,     \
+                                                                                                     lhsStride, _rhs,  \
+                                                                                                     rhsStride, res,   \
+                                                                                                     1, resStride,     \
+                                                                                                     alpha, blocking); \
+          /*std::cout << "TRMM_R: A is not square! Go to Eigen TRMM implementation!\n";*/                              \
+        } else {                                                                                                       \
+          /* Make sense to call GEMM */                                                                                \
+          Map<const MatrixRhs, 0, OuterStride<> > rhsMap(_rhs, depth, cols, OuterStride<>(rhsStride));                 \
+          MatrixRhs aa_tmp = rhsMap.template triangularView<Mode>();                                                   \
+          BlasIndex aStride = convert_index<BlasIndex>(aa_tmp.outerStride());                                          \
+          gemm_blocking_space<ColMajor, EIGTYPE, EIGTYPE, Dynamic, Dynamic, Dynamic> gemm_blocking(_rows, _cols,       \
+                                                                                                   _depth, 1, true);   \
+          general_matrix_matrix_product<Index, EIGTYPE, LhsStorageOrder, ConjugateLhs, EIGTYPE, RhsStorageOrder,       \
+                                        ConjugateRhs, ColMajor, 1>::run(rows, cols, depth, _lhs, lhsStride,            \
+                                                                        aa_tmp.data(), aStride, res, 1, resStride,     \
+                                                                        alpha, gemm_blocking, 0);                      \
+                                                                                                                       \
+          /*std::cout << "TRMM_R: A is not square! Go to BLAS GEMM implementation! " << nthr<<" \n";*/                 \
+        }                                                                                                              \
+        return;                                                                                                        \
+      }                                                                                                                \
+      char side = 'R', transa, uplo, diag = 'N';                                                                       \
+      EIGTYPE* b;                                                                                                      \
+      const EIGTYPE* a;                                                                                                \
+      BlasIndex m, n, lda, ldb;                                                                                        \
+                                                                                                                       \
+      /* Set m, n */                                                                                                   \
+      m = convert_index<BlasIndex>(rows);                                                                              \
+      n = convert_index<BlasIndex>(diagSize);                                                                          \
+                                                                                                                       \
+      /* Set trans */                                                                                                  \
+      transa = (RhsStorageOrder == RowMajor) ? ((ConjugateRhs) ? 'C' : 'T') : 'N';                                     \
+                                                                                                                       \
+      /* Set b, ldb */                                                                                                 \
+      Map<const MatrixLhs, 0, OuterStride<> > lhs(_lhs, rows, depth, OuterStride<>(lhsStride));                        \
+      MatrixX##EIGPREFIX b_tmp;                                                                                        \
+                                                                                                                       \
+      if (ConjugateLhs)                                                                                                \
+        b_tmp = lhs.conjugate();                                                                                       \
+      else                                                                                                             \
+        b_tmp = lhs;                                                                                                   \
+      b = b_tmp.data();                                                                                                \
+      ldb = convert_index<BlasIndex>(b_tmp.outerStride());                                                             \
+                                                                                                                       \
+      /* Set uplo */                                                                                                   \
+      uplo = IsLower ? 'L' : 'U';                                                                                      \
+      if (RhsStorageOrder == RowMajor) uplo = (uplo == 'L') ? 'U' : 'L';                                               \
+      /* Set a, lda */                                                                                                 \
+      Map<const MatrixRhs, 0, OuterStride<> > rhs(_rhs, depth, cols, OuterStride<>(rhsStride));                        \
+      MatrixRhs a_tmp;                                                                                                 \
+                                                                                                                       \
+      if ((conjA != 0) || (SetDiag == 0)) {                                                                            \
+        if (conjA)                                                                                                     \
+          a_tmp = rhs.conjugate();                                                                                     \
+        else                                                                                                           \
+          a_tmp = rhs;                                                                                                 \
+        if (IsZeroDiag)                                                                                                \
+          a_tmp.diagonal().setZero();                                                                                  \
+        else if (IsUnitDiag)                                                                                           \
+          a_tmp.diagonal().setOnes();                                                                                  \
+        a = a_tmp.data();                                                                                              \
+        lda = convert_index<BlasIndex>(a_tmp.outerStride());                                                           \
+      } else {                                                                                                         \
+        a = _rhs;                                                                                                      \
+        lda = convert_index<BlasIndex>(rhsStride);                                                                     \
+      }                                                                                                                \
+      /*std::cout << "TRMM_R: A is square! Go to BLAS TRMM implementation! \n";*/                                      \
+      /* call ?trmm*/                                                                                                  \
+      BLASFUNC(&side, &uplo, &transa, &diag, &m, &n, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)a,    \
+               &lda, (BLASTYPE*)b, &ldb);                                                                              \
+                                                                                                                       \
+      /* Add op(a_triangular)*b into res*/                                                                             \
+      Map<MatrixX##EIGPREFIX, 0, OuterStride<> > res_tmp(res, rows, cols, OuterStride<>(resStride));                   \
+      res_tmp = res_tmp + b_tmp;                                                                                       \
+    }                                                                                                                  \
+  };
 
 #ifdef EIGEN_USE_MKL
 EIGEN_BLAS_TRMM_R(double, double, d, dtrmm)
@@ -313,8 +316,8 @@
 EIGEN_BLAS_TRMM_R(float, float, f, strmm_)
 EIGEN_BLAS_TRMM_R(scomplex, float, cf, ctrmm_)
 #endif
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_TRIANGULAR_MATRIX_MATRIX_BLAS_H
+#endif  // EIGEN_TRIANGULAR_MATRIX_MATRIX_BLAS_H
diff --git a/Eigen/src/Core/products/TriangularMatrixVector.h b/Eigen/src/Core/products/TriangularMatrixVector.h
index bd30dc3..413f0ee 100644
--- a/Eigen/src/Core/products/TriangularMatrixVector.h
+++ b/Eigen/src/Core/products/TriangularMatrixVector.h
@@ -17,12 +17,12 @@
 
 namespace internal {
 
-template<typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs, int StorageOrder, int Version=Specialized>
+template <typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs,
+          int StorageOrder, int Version = Specialized>
 struct triangular_matrix_vector_product;
 
-template<typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs, int Version>
-struct triangular_matrix_vector_product<Index,Mode,LhsScalar,ConjLhs,RhsScalar,ConjRhs,ColMajor,Version>
-{
+template <typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs, int Version>
+struct triangular_matrix_vector_product<Index, Mode, LhsScalar, ConjLhs, RhsScalar, ConjRhs, ColMajor, Version> {
   typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar>::ReturnType ResScalar;
   static constexpr bool IsLower = ((Mode & Lower) == Lower);
   static constexpr bool HasUnitDiag = (Mode & UnitDiag) == UnitDiag;
@@ -32,67 +32,59 @@
                                     const RhsScalar& alpha);
 };
 
-template<typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs, int Version>
-EIGEN_DONT_INLINE void triangular_matrix_vector_product<Index,Mode,LhsScalar,ConjLhs,RhsScalar,ConjRhs,ColMajor,Version>
-  ::run(Index _rows, Index _cols, const LhsScalar* lhs_, Index lhsStride,
-        const RhsScalar* rhs_, Index rhsIncr, ResScalar* res_, Index resIncr, const RhsScalar& alpha)
-  {
-    static const Index PanelWidth = EIGEN_TUNE_TRIANGULAR_PANEL_WIDTH;
-    Index size = (std::min)(_rows,_cols);
-    Index rows = IsLower ? _rows : (std::min)(_rows,_cols);
-    Index cols = IsLower ? (std::min)(_rows,_cols) : _cols;
+template <typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs, int Version>
+EIGEN_DONT_INLINE void triangular_matrix_vector_product<Index, Mode, LhsScalar, ConjLhs, RhsScalar, ConjRhs, ColMajor,
+                                                        Version>::run(Index _rows, Index _cols, const LhsScalar* lhs_,
+                                                                      Index lhsStride, const RhsScalar* rhs_,
+                                                                      Index rhsIncr, ResScalar* res_, Index resIncr,
+                                                                      const RhsScalar& alpha) {
+  static const Index PanelWidth = EIGEN_TUNE_TRIANGULAR_PANEL_WIDTH;
+  Index size = (std::min)(_rows, _cols);
+  Index rows = IsLower ? _rows : (std::min)(_rows, _cols);
+  Index cols = IsLower ? (std::min)(_rows, _cols) : _cols;
 
-    typedef Map<const Matrix<LhsScalar,Dynamic,Dynamic,ColMajor>, 0, OuterStride<> > LhsMap;
-    const LhsMap lhs(lhs_,rows,cols,OuterStride<>(lhsStride));
-    typename conj_expr_if<ConjLhs,LhsMap>::type cjLhs(lhs);
+  typedef Map<const Matrix<LhsScalar, Dynamic, Dynamic, ColMajor>, 0, OuterStride<> > LhsMap;
+  const LhsMap lhs(lhs_, rows, cols, OuterStride<>(lhsStride));
+  typename conj_expr_if<ConjLhs, LhsMap>::type cjLhs(lhs);
 
-    typedef Map<const Matrix<RhsScalar,Dynamic,1>, 0, InnerStride<> > RhsMap;
-    const RhsMap rhs(rhs_,cols,InnerStride<>(rhsIncr));
-    typename conj_expr_if<ConjRhs,RhsMap>::type cjRhs(rhs);
+  typedef Map<const Matrix<RhsScalar, Dynamic, 1>, 0, InnerStride<> > RhsMap;
+  const RhsMap rhs(rhs_, cols, InnerStride<>(rhsIncr));
+  typename conj_expr_if<ConjRhs, RhsMap>::type cjRhs(rhs);
 
-    typedef Map<Matrix<ResScalar,Dynamic,1> > ResMap;
-    ResMap res(res_,rows);
+  typedef Map<Matrix<ResScalar, Dynamic, 1> > ResMap;
+  ResMap res(res_, rows);
 
-    typedef const_blas_data_mapper<LhsScalar,Index,ColMajor> LhsMapper;
-    typedef const_blas_data_mapper<RhsScalar,Index,RowMajor> RhsMapper;
+  typedef const_blas_data_mapper<LhsScalar, Index, ColMajor> LhsMapper;
+  typedef const_blas_data_mapper<RhsScalar, Index, RowMajor> RhsMapper;
 
-    for (Index pi=0; pi<size; pi+=PanelWidth)
-    {
-      Index actualPanelWidth = (std::min)(PanelWidth, size-pi);
-      for (Index k=0; k<actualPanelWidth; ++k)
-      {
-        Index i = pi + k;
-        Index s = IsLower ? ((HasUnitDiag||HasZeroDiag) ? i+1 : i ) : pi;
-        Index r = IsLower ? actualPanelWidth-k : k+1;
-        if ((!(HasUnitDiag||HasZeroDiag)) || (--r)>0)
-          res.segment(s,r) += (alpha * cjRhs.coeff(i)) * cjLhs.col(i).segment(s,r);
-        if (HasUnitDiag)
-          res.coeffRef(i) += alpha * cjRhs.coeff(i);
-      }
-      Index r = IsLower ? rows - pi - actualPanelWidth : pi;
-      if (r>0)
-      {
-        Index s = IsLower ? pi+actualPanelWidth : 0;
-        general_matrix_vector_product<Index,LhsScalar,LhsMapper,ColMajor,ConjLhs,RhsScalar,RhsMapper,ConjRhs,BuiltIn>::run(
-            r, actualPanelWidth,
-            LhsMapper(&lhs.coeffRef(s,pi), lhsStride),
-            RhsMapper(&rhs.coeffRef(pi), rhsIncr),
-            &res.coeffRef(s), resIncr, alpha);
-      }
+  for (Index pi = 0; pi < size; pi += PanelWidth) {
+    Index actualPanelWidth = (std::min)(PanelWidth, size - pi);
+    for (Index k = 0; k < actualPanelWidth; ++k) {
+      Index i = pi + k;
+      Index s = IsLower ? ((HasUnitDiag || HasZeroDiag) ? i + 1 : i) : pi;
+      Index r = IsLower ? actualPanelWidth - k : k + 1;
+      if ((!(HasUnitDiag || HasZeroDiag)) || (--r) > 0)
+        res.segment(s, r) += (alpha * cjRhs.coeff(i)) * cjLhs.col(i).segment(s, r);
+      if (HasUnitDiag) res.coeffRef(i) += alpha * cjRhs.coeff(i);
     }
-    if((!IsLower) && cols>size)
-    {
-      general_matrix_vector_product<Index,LhsScalar,LhsMapper,ColMajor,ConjLhs,RhsScalar,RhsMapper,ConjRhs>::run(
-          rows, cols-size,
-          LhsMapper(&lhs.coeffRef(0,size), lhsStride),
-          RhsMapper(&rhs.coeffRef(size), rhsIncr),
-          res_, resIncr, alpha);
+    Index r = IsLower ? rows - pi - actualPanelWidth : pi;
+    if (r > 0) {
+      Index s = IsLower ? pi + actualPanelWidth : 0;
+      general_matrix_vector_product<Index, LhsScalar, LhsMapper, ColMajor, ConjLhs, RhsScalar, RhsMapper, ConjRhs,
+                                    BuiltIn>::run(r, actualPanelWidth, LhsMapper(&lhs.coeffRef(s, pi), lhsStride),
+                                                  RhsMapper(&rhs.coeffRef(pi), rhsIncr), &res.coeffRef(s), resIncr,
+                                                  alpha);
     }
   }
+  if ((!IsLower) && cols > size) {
+    general_matrix_vector_product<Index, LhsScalar, LhsMapper, ColMajor, ConjLhs, RhsScalar, RhsMapper, ConjRhs>::run(
+        rows, cols - size, LhsMapper(&lhs.coeffRef(0, size), lhsStride), RhsMapper(&rhs.coeffRef(size), rhsIncr), res_,
+        resIncr, alpha);
+  }
+}
 
-template<typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs,int Version>
-struct triangular_matrix_vector_product<Index,Mode,LhsScalar,ConjLhs,RhsScalar,ConjRhs,RowMajor,Version>
-{
+template <typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs, int Version>
+struct triangular_matrix_vector_product<Index, Mode, LhsScalar, ConjLhs, RhsScalar, ConjRhs, RowMajor, Version> {
   typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar>::ReturnType ResScalar;
   static constexpr bool IsLower = ((Mode & Lower) == Lower);
   static constexpr bool HasUnitDiag = (Mode & UnitDiag) == UnitDiag;
@@ -102,114 +94,107 @@
                                     const ResScalar& alpha);
 };
 
-template<typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs,int Version>
-EIGEN_DONT_INLINE void triangular_matrix_vector_product<Index,Mode,LhsScalar,ConjLhs,RhsScalar,ConjRhs,RowMajor,Version>
-  ::run(Index _rows, Index _cols, const LhsScalar* lhs_, Index lhsStride,
-        const RhsScalar* rhs_, Index rhsIncr, ResScalar* res_, Index resIncr, const ResScalar& alpha)
-  {
-    static const Index PanelWidth = EIGEN_TUNE_TRIANGULAR_PANEL_WIDTH;
-    Index diagSize = (std::min)(_rows,_cols);
-    Index rows = IsLower ? _rows : diagSize;
-    Index cols = IsLower ? diagSize : _cols;
+template <typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs, int Version>
+EIGEN_DONT_INLINE void triangular_matrix_vector_product<Index, Mode, LhsScalar, ConjLhs, RhsScalar, ConjRhs, RowMajor,
+                                                        Version>::run(Index _rows, Index _cols, const LhsScalar* lhs_,
+                                                                      Index lhsStride, const RhsScalar* rhs_,
+                                                                      Index rhsIncr, ResScalar* res_, Index resIncr,
+                                                                      const ResScalar& alpha) {
+  static const Index PanelWidth = EIGEN_TUNE_TRIANGULAR_PANEL_WIDTH;
+  Index diagSize = (std::min)(_rows, _cols);
+  Index rows = IsLower ? _rows : diagSize;
+  Index cols = IsLower ? diagSize : _cols;
 
-    typedef Map<const Matrix<LhsScalar,Dynamic,Dynamic,RowMajor>, 0, OuterStride<> > LhsMap;
-    const LhsMap lhs(lhs_,rows,cols,OuterStride<>(lhsStride));
-    typename conj_expr_if<ConjLhs,LhsMap>::type cjLhs(lhs);
+  typedef Map<const Matrix<LhsScalar, Dynamic, Dynamic, RowMajor>, 0, OuterStride<> > LhsMap;
+  const LhsMap lhs(lhs_, rows, cols, OuterStride<>(lhsStride));
+  typename conj_expr_if<ConjLhs, LhsMap>::type cjLhs(lhs);
 
-    typedef Map<const Matrix<RhsScalar,Dynamic,1> > RhsMap;
-    const RhsMap rhs(rhs_,cols);
-    typename conj_expr_if<ConjRhs,RhsMap>::type cjRhs(rhs);
+  typedef Map<const Matrix<RhsScalar, Dynamic, 1> > RhsMap;
+  const RhsMap rhs(rhs_, cols);
+  typename conj_expr_if<ConjRhs, RhsMap>::type cjRhs(rhs);
 
-    typedef Map<Matrix<ResScalar,Dynamic,1>, 0, InnerStride<> > ResMap;
-    ResMap res(res_,rows,InnerStride<>(resIncr));
+  typedef Map<Matrix<ResScalar, Dynamic, 1>, 0, InnerStride<> > ResMap;
+  ResMap res(res_, rows, InnerStride<>(resIncr));
 
-    typedef const_blas_data_mapper<LhsScalar,Index,RowMajor> LhsMapper;
-    typedef const_blas_data_mapper<RhsScalar,Index,RowMajor> RhsMapper;
+  typedef const_blas_data_mapper<LhsScalar, Index, RowMajor> LhsMapper;
+  typedef const_blas_data_mapper<RhsScalar, Index, RowMajor> RhsMapper;
 
-    for (Index pi=0; pi<diagSize; pi+=PanelWidth)
-    {
-      Index actualPanelWidth = (std::min)(PanelWidth, diagSize-pi);
-      for (Index k=0; k<actualPanelWidth; ++k)
-      {
-        Index i = pi + k;
-        Index s = IsLower ? pi  : ((HasUnitDiag||HasZeroDiag) ? i+1 : i);
-        Index r = IsLower ? k+1 : actualPanelWidth-k;
-        if ((!(HasUnitDiag||HasZeroDiag)) || (--r)>0)
-          res.coeffRef(i) += alpha * (cjLhs.row(i).segment(s,r).cwiseProduct(cjRhs.segment(s,r).transpose())).sum();
-        if (HasUnitDiag)
-          res.coeffRef(i) += alpha * cjRhs.coeff(i);
-      }
-      Index r = IsLower ? pi : cols - pi - actualPanelWidth;
-      if (r>0)
-      {
-        Index s = IsLower ? 0 : pi + actualPanelWidth;
-        general_matrix_vector_product<Index,LhsScalar,LhsMapper,RowMajor,ConjLhs,RhsScalar,RhsMapper,ConjRhs,BuiltIn>::run(
-            actualPanelWidth, r,
-            LhsMapper(&lhs.coeffRef(pi,s), lhsStride),
-            RhsMapper(&rhs.coeffRef(s), rhsIncr),
-            &res.coeffRef(pi), resIncr, alpha);
-      }
+  for (Index pi = 0; pi < diagSize; pi += PanelWidth) {
+    Index actualPanelWidth = (std::min)(PanelWidth, diagSize - pi);
+    for (Index k = 0; k < actualPanelWidth; ++k) {
+      Index i = pi + k;
+      Index s = IsLower ? pi : ((HasUnitDiag || HasZeroDiag) ? i + 1 : i);
+      Index r = IsLower ? k + 1 : actualPanelWidth - k;
+      if ((!(HasUnitDiag || HasZeroDiag)) || (--r) > 0)
+        res.coeffRef(i) += alpha * (cjLhs.row(i).segment(s, r).cwiseProduct(cjRhs.segment(s, r).transpose())).sum();
+      if (HasUnitDiag) res.coeffRef(i) += alpha * cjRhs.coeff(i);
     }
-    if(IsLower && rows>diagSize)
-    {
-      general_matrix_vector_product<Index,LhsScalar,LhsMapper,RowMajor,ConjLhs,RhsScalar,RhsMapper,ConjRhs>::run(
-            rows-diagSize, cols,
-            LhsMapper(&lhs.coeffRef(diagSize,0), lhsStride),
-            RhsMapper(&rhs.coeffRef(0), rhsIncr),
-            &res.coeffRef(diagSize), resIncr, alpha);
+    Index r = IsLower ? pi : cols - pi - actualPanelWidth;
+    if (r > 0) {
+      Index s = IsLower ? 0 : pi + actualPanelWidth;
+      general_matrix_vector_product<Index, LhsScalar, LhsMapper, RowMajor, ConjLhs, RhsScalar, RhsMapper, ConjRhs,
+                                    BuiltIn>::run(actualPanelWidth, r, LhsMapper(&lhs.coeffRef(pi, s), lhsStride),
+                                                  RhsMapper(&rhs.coeffRef(s), rhsIncr), &res.coeffRef(pi), resIncr,
+                                                  alpha);
     }
   }
+  if (IsLower && rows > diagSize) {
+    general_matrix_vector_product<Index, LhsScalar, LhsMapper, RowMajor, ConjLhs, RhsScalar, RhsMapper, ConjRhs>::run(
+        rows - diagSize, cols, LhsMapper(&lhs.coeffRef(diagSize, 0), lhsStride), RhsMapper(&rhs.coeffRef(0), rhsIncr),
+        &res.coeffRef(diagSize), resIncr, alpha);
+  }
+}
 
 /***************************************************************************
-* Wrapper to product_triangular_vector
-***************************************************************************/
+ * Wrapper to product_triangular_vector
+ ***************************************************************************/
 
-template<int Mode,int StorageOrder>
+template <int Mode, int StorageOrder>
 struct trmv_selector;
 
-} // end namespace internal
+}  // end namespace internal
 
 namespace internal {
 
-template<int Mode, typename Lhs, typename Rhs>
-struct triangular_product_impl<Mode,true,Lhs,false,Rhs,true>
-{
-  template<typename Dest> static void run(Dest& dst, const Lhs &lhs, const Rhs &rhs, const typename Dest::Scalar& alpha)
-  {
-    eigen_assert(dst.rows()==lhs.rows() && dst.cols()==rhs.cols());
-  
-    internal::trmv_selector<Mode,(int(internal::traits<Lhs>::Flags)&RowMajorBit) ? RowMajor : ColMajor>::run(lhs, rhs, dst, alpha);
+template <int Mode, typename Lhs, typename Rhs>
+struct triangular_product_impl<Mode, true, Lhs, false, Rhs, true> {
+  template <typename Dest>
+  static void run(Dest& dst, const Lhs& lhs, const Rhs& rhs, const typename Dest::Scalar& alpha) {
+    eigen_assert(dst.rows() == lhs.rows() && dst.cols() == rhs.cols());
+
+    internal::trmv_selector<Mode, (int(internal::traits<Lhs>::Flags) & RowMajorBit) ? RowMajor : ColMajor>::run(
+        lhs, rhs, dst, alpha);
   }
 };
 
-template<int Mode, typename Lhs, typename Rhs>
-struct triangular_product_impl<Mode,false,Lhs,true,Rhs,false>
-{
-  template<typename Dest> static void run(Dest& dst, const Lhs &lhs, const Rhs &rhs, const typename Dest::Scalar& alpha)
-  {
-    eigen_assert(dst.rows()==lhs.rows() && dst.cols()==rhs.cols());
+template <int Mode, typename Lhs, typename Rhs>
+struct triangular_product_impl<Mode, false, Lhs, true, Rhs, false> {
+  template <typename Dest>
+  static void run(Dest& dst, const Lhs& lhs, const Rhs& rhs, const typename Dest::Scalar& alpha) {
+    eigen_assert(dst.rows() == lhs.rows() && dst.cols() == rhs.cols());
 
     Transpose<Dest> dstT(dst);
-    internal::trmv_selector<(Mode & (UnitDiag|ZeroDiag)) | ((Mode & Lower) ? Upper : Lower),
-                            (int(internal::traits<Rhs>::Flags)&RowMajorBit) ? ColMajor : RowMajor>
-            ::run(rhs.transpose(),lhs.transpose(), dstT, alpha);
+    internal::trmv_selector<(Mode & (UnitDiag | ZeroDiag)) | ((Mode & Lower) ? Upper : Lower),
+                            (int(internal::traits<Rhs>::Flags) & RowMajorBit) ? ColMajor
+                                                                              : RowMajor>::run(rhs.transpose(),
+                                                                                               lhs.transpose(), dstT,
+                                                                                               alpha);
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 namespace internal {
 
 // TODO: find a way to factorize this piece of code with gemv_selector since the logic is exactly the same.
 
-template<int Mode> struct trmv_selector<Mode,ColMajor>
-{
-  template<typename Lhs, typename Rhs, typename Dest>
-  static void run(const Lhs &lhs, const Rhs &rhs, Dest& dest, const typename Dest::Scalar& alpha)
-  {
-    typedef typename Lhs::Scalar      LhsScalar;
-    typedef typename Rhs::Scalar      RhsScalar;
-    typedef typename Dest::Scalar     ResScalar;
+template <int Mode>
+struct trmv_selector<Mode, ColMajor> {
+  template <typename Lhs, typename Rhs, typename Dest>
+  static void run(const Lhs& lhs, const Rhs& rhs, Dest& dest, const typename Dest::Scalar& alpha) {
+    typedef typename Lhs::Scalar LhsScalar;
+    typedef typename Rhs::Scalar RhsScalar;
+    typedef typename Dest::Scalar ResScalar;
 
     typedef internal::blas_traits<Lhs> LhsBlasTraits;
     typedef typename LhsBlasTraits::DirectLinearAccessType ActualLhsType;
@@ -217,7 +202,7 @@
     typedef typename RhsBlasTraits::DirectLinearAccessType ActualRhsType;
     constexpr int Alignment = (std::min)(int(AlignedMax), int(internal::packet_traits<ResScalar>::size));
 
-    typedef Map<Matrix<ResScalar,Dynamic,1>, Alignment> MappedDest;
+    typedef Map<Matrix<ResScalar, Dynamic, 1>, Alignment> MappedDest;
 
     add_const_on_value_type_t<ActualLhsType> actualLhs = LhsBlasTraits::extract(lhs);
     add_const_on_value_type_t<ActualRhsType> actualRhs = RhsBlasTraits::extract(rhs);
@@ -228,70 +213,65 @@
 
     // FIXME find a way to allow an inner stride on the result if packet_traits<Scalar>::size==1
     // on, the other hand it is good for the cache to pack the vector anyways...
-    constexpr bool EvalToDestAtCompileTime = Dest::InnerStrideAtCompileTime==1;
+    constexpr bool EvalToDestAtCompileTime = Dest::InnerStrideAtCompileTime == 1;
     constexpr bool ComplexByReal = (NumTraits<LhsScalar>::IsComplex) && (!NumTraits<RhsScalar>::IsComplex);
-    constexpr bool MightCannotUseDest = (Dest::InnerStrideAtCompileTime!=1) || ComplexByReal;
+    constexpr bool MightCannotUseDest = (Dest::InnerStrideAtCompileTime != 1) || ComplexByReal;
 
-    gemv_static_vector_if<ResScalar,Dest::SizeAtCompileTime,Dest::MaxSizeAtCompileTime,MightCannotUseDest> static_dest;
+    gemv_static_vector_if<ResScalar, Dest::SizeAtCompileTime, Dest::MaxSizeAtCompileTime, MightCannotUseDest>
+        static_dest;
 
     bool alphaIsCompatible = (!ComplexByReal) || numext::is_exactly_zero(numext::imag(actualAlpha));
     bool evalToDest = EvalToDestAtCompileTime && alphaIsCompatible;
 
-    RhsScalar compatibleAlpha = get_factor<ResScalar,RhsScalar>::run(actualAlpha);
+    RhsScalar compatibleAlpha = get_factor<ResScalar, RhsScalar>::run(actualAlpha);
 
-    ei_declare_aligned_stack_constructed_variable(ResScalar,actualDestPtr,dest.size(),
+    ei_declare_aligned_stack_constructed_variable(ResScalar, actualDestPtr, dest.size(),
                                                   evalToDest ? dest.data() : static_dest.data());
 
-    if(!evalToDest)
-    {
-      #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
+    if (!evalToDest) {
+#ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
       Index size = dest.size();
       EIGEN_DENSE_STORAGE_CTOR_PLUGIN
-      #endif
-      if(!alphaIsCompatible)
-      {
+#endif
+      if (!alphaIsCompatible) {
         MappedDest(actualDestPtr, dest.size()).setZero();
         compatibleAlpha = RhsScalar(1);
-      }
-      else
+      } else
         MappedDest(actualDestPtr, dest.size()) = dest;
     }
 
-    internal::triangular_matrix_vector_product
-      <Index,Mode,
-       LhsScalar, LhsBlasTraits::NeedToConjugate,
-       RhsScalar, RhsBlasTraits::NeedToConjugate,
-       ColMajor>
-      ::run(actualLhs.rows(),actualLhs.cols(),
-            actualLhs.data(),actualLhs.outerStride(),
-            actualRhs.data(),actualRhs.innerStride(),
-            actualDestPtr,1,compatibleAlpha);
+    internal::triangular_matrix_vector_product<Index, Mode, LhsScalar, LhsBlasTraits::NeedToConjugate, RhsScalar,
+                                               RhsBlasTraits::NeedToConjugate, ColMajor>::run(actualLhs.rows(),
+                                                                                              actualLhs.cols(),
+                                                                                              actualLhs.data(),
+                                                                                              actualLhs.outerStride(),
+                                                                                              actualRhs.data(),
+                                                                                              actualRhs.innerStride(),
+                                                                                              actualDestPtr, 1,
+                                                                                              compatibleAlpha);
 
-    if (!evalToDest)
-    {
-      if(!alphaIsCompatible)
+    if (!evalToDest) {
+      if (!alphaIsCompatible)
         dest += actualAlpha * MappedDest(actualDestPtr, dest.size());
       else
         dest = MappedDest(actualDestPtr, dest.size());
     }
 
-    if ( ((Mode&UnitDiag)==UnitDiag) && !numext::is_exactly_one(lhs_alpha) )
-    {
-      Index diagSize = (std::min)(lhs.rows(),lhs.cols());
-      dest.head(diagSize) -= (lhs_alpha-LhsScalar(1))*rhs.head(diagSize);
+    if (((Mode & UnitDiag) == UnitDiag) && !numext::is_exactly_one(lhs_alpha)) {
+      Index diagSize = (std::min)(lhs.rows(), lhs.cols());
+      dest.head(diagSize) -= (lhs_alpha - LhsScalar(1)) * rhs.head(diagSize);
     }
   }
 };
 
-template<int Mode> struct trmv_selector<Mode,RowMajor>
-{
-  template<typename Lhs, typename Rhs, typename Dest>
-  static void run(const Lhs &lhs, const Rhs &rhs, Dest& dest, const typename Dest::Scalar& alpha)
-  {
-    typedef typename Lhs::Scalar      LhsScalar;
-    typedef typename Rhs::Scalar      RhsScalar;
-    typedef typename Dest::Scalar     ResScalar;
-    
+template <int Mode>
+struct trmv_selector<Mode, RowMajor> {
+  template <typename Lhs, typename Rhs, typename Dest>
+  static void run(const Lhs& lhs, const Rhs& rhs, Dest& dest, const typename Dest::Scalar& alpha) {
+    typedef typename Lhs::Scalar LhsScalar;
+    typedef typename Rhs::Scalar RhsScalar;
+    typedef typename Dest::Scalar ResScalar;
+
     typedef internal::blas_traits<Lhs> LhsBlasTraits;
     typedef typename LhsBlasTraits::DirectLinearAccessType ActualLhsType;
     typedef internal::blas_traits<Rhs> RhsBlasTraits;
@@ -305,43 +285,43 @@
     RhsScalar rhs_alpha = RhsBlasTraits::extractScalarFactor(rhs);
     ResScalar actualAlpha = alpha * lhs_alpha * rhs_alpha;
 
-    constexpr bool DirectlyUseRhs = ActualRhsTypeCleaned::InnerStrideAtCompileTime==1;
+    constexpr bool DirectlyUseRhs = ActualRhsTypeCleaned::InnerStrideAtCompileTime == 1;
 
-    gemv_static_vector_if<RhsScalar,ActualRhsTypeCleaned::SizeAtCompileTime,ActualRhsTypeCleaned::MaxSizeAtCompileTime,!DirectlyUseRhs> static_rhs;
+    gemv_static_vector_if<RhsScalar, ActualRhsTypeCleaned::SizeAtCompileTime,
+                          ActualRhsTypeCleaned::MaxSizeAtCompileTime, !DirectlyUseRhs>
+        static_rhs;
 
-    ei_declare_aligned_stack_constructed_variable(RhsScalar,actualRhsPtr,actualRhs.size(),
+    ei_declare_aligned_stack_constructed_variable(
+        RhsScalar, actualRhsPtr, actualRhs.size(),
         DirectlyUseRhs ? const_cast<RhsScalar*>(actualRhs.data()) : static_rhs.data());
 
-    if(!DirectlyUseRhs)
-    {
-      #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
+    if (!DirectlyUseRhs) {
+#ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
       Index size = actualRhs.size();
       EIGEN_DENSE_STORAGE_CTOR_PLUGIN
-      #endif
+#endif
       Map<typename ActualRhsTypeCleaned::PlainObject>(actualRhsPtr, actualRhs.size()) = actualRhs;
     }
 
-    internal::triangular_matrix_vector_product
-      <Index,Mode,
-       LhsScalar, LhsBlasTraits::NeedToConjugate,
-       RhsScalar, RhsBlasTraits::NeedToConjugate,
-       RowMajor>
-      ::run(actualLhs.rows(),actualLhs.cols(),
-            actualLhs.data(),actualLhs.outerStride(),
-            actualRhsPtr,1,
-            dest.data(),dest.innerStride(),
-            actualAlpha);
+    internal::triangular_matrix_vector_product<Index, Mode, LhsScalar, LhsBlasTraits::NeedToConjugate, RhsScalar,
+                                               RhsBlasTraits::NeedToConjugate, RowMajor>::run(actualLhs.rows(),
+                                                                                              actualLhs.cols(),
+                                                                                              actualLhs.data(),
+                                                                                              actualLhs.outerStride(),
+                                                                                              actualRhsPtr, 1,
+                                                                                              dest.data(),
+                                                                                              dest.innerStride(),
+                                                                                              actualAlpha);
 
-    if ( ((Mode&UnitDiag)==UnitDiag) && !numext::is_exactly_one(lhs_alpha) )
-    {
-      Index diagSize = (std::min)(lhs.rows(),lhs.cols());
-      dest.head(diagSize) -= (lhs_alpha-LhsScalar(1))*rhs.head(diagSize);
+    if (((Mode & UnitDiag) == UnitDiag) && !numext::is_exactly_one(lhs_alpha)) {
+      Index diagSize = (std::min)(lhs.rows(), lhs.cols());
+      dest.head(diagSize) -= (lhs_alpha - LhsScalar(1)) * rhs.head(diagSize);
     }
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_TRIANGULARMATRIXVECTOR_H
+#endif  // EIGEN_TRIANGULARMATRIXVECTOR_H
diff --git a/Eigen/src/Core/products/TriangularMatrixVector_BLAS.h b/Eigen/src/Core/products/TriangularMatrixVector_BLAS.h
index f62a28a..0c1d56b 100644
--- a/Eigen/src/Core/products/TriangularMatrixVector_BLAS.h
+++ b/Eigen/src/Core/products/TriangularMatrixVector_BLAS.h
@@ -36,37 +36,38 @@
 // IWYU pragma: private
 #include "../InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
 /**********************************************************************
-* This file implements triangular matrix-vector multiplication using BLAS
-**********************************************************************/
+ * This file implements triangular matrix-vector multiplication using BLAS
+ **********************************************************************/
 
 // trmv/hemv specialization
 
-template<typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs, int StorageOrder>
-struct triangular_matrix_vector_product_trmv :
-  triangular_matrix_vector_product<Index,Mode,LhsScalar,ConjLhs,RhsScalar,ConjRhs,StorageOrder,BuiltIn> {};
+template <typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs,
+          int StorageOrder>
+struct triangular_matrix_vector_product_trmv
+    : triangular_matrix_vector_product<Index, Mode, LhsScalar, ConjLhs, RhsScalar, ConjRhs, StorageOrder, BuiltIn> {};
 
-#define EIGEN_BLAS_TRMV_SPECIALIZE(Scalar) \
-template<typename Index, int Mode, bool ConjLhs, bool ConjRhs> \
-struct triangular_matrix_vector_product<Index,Mode,Scalar,ConjLhs,Scalar,ConjRhs,ColMajor,Specialized> { \
- static void run(Index rows_, Index cols_, const Scalar* lhs_, Index lhsStride, \
-                                     const Scalar* rhs_, Index rhsIncr, Scalar* res_, Index resIncr, Scalar alpha) { \
-      triangular_matrix_vector_product_trmv<Index,Mode,Scalar,ConjLhs,Scalar,ConjRhs,ColMajor>::run( \
-        rows_, cols_, lhs_, lhsStride, rhs_, rhsIncr, res_, resIncr, alpha); \
-  } \
-}; \
-template<typename Index, int Mode, bool ConjLhs, bool ConjRhs> \
-struct triangular_matrix_vector_product<Index,Mode,Scalar,ConjLhs,Scalar,ConjRhs,RowMajor,Specialized> { \
- static void run(Index rows_, Index cols_, const Scalar* lhs_, Index lhsStride, \
-                                     const Scalar* rhs_, Index rhsIncr, Scalar* res_, Index resIncr, Scalar alpha) { \
-      triangular_matrix_vector_product_trmv<Index,Mode,Scalar,ConjLhs,Scalar,ConjRhs,RowMajor>::run( \
-        rows_, cols_, lhs_, lhsStride, rhs_, rhsIncr, res_, resIncr, alpha); \
-  } \
-};
+#define EIGEN_BLAS_TRMV_SPECIALIZE(Scalar)                                                                            \
+  template <typename Index, int Mode, bool ConjLhs, bool ConjRhs>                                                     \
+  struct triangular_matrix_vector_product<Index, Mode, Scalar, ConjLhs, Scalar, ConjRhs, ColMajor, Specialized> {     \
+    static void run(Index rows_, Index cols_, const Scalar* lhs_, Index lhsStride, const Scalar* rhs_, Index rhsIncr, \
+                    Scalar* res_, Index resIncr, Scalar alpha) {                                                      \
+      triangular_matrix_vector_product_trmv<Index, Mode, Scalar, ConjLhs, Scalar, ConjRhs, ColMajor>::run(            \
+          rows_, cols_, lhs_, lhsStride, rhs_, rhsIncr, res_, resIncr, alpha);                                        \
+    }                                                                                                                 \
+  };                                                                                                                  \
+  template <typename Index, int Mode, bool ConjLhs, bool ConjRhs>                                                     \
+  struct triangular_matrix_vector_product<Index, Mode, Scalar, ConjLhs, Scalar, ConjRhs, RowMajor, Specialized> {     \
+    static void run(Index rows_, Index cols_, const Scalar* lhs_, Index lhsStride, const Scalar* rhs_, Index rhsIncr, \
+                    Scalar* res_, Index resIncr, Scalar alpha) {                                                      \
+      triangular_matrix_vector_product_trmv<Index, Mode, Scalar, ConjLhs, Scalar, ConjRhs, RowMajor>::run(            \
+          rows_, cols_, lhs_, lhsStride, rhs_, rhsIncr, res_, resIncr, alpha);                                        \
+    }                                                                                                                 \
+  };
 
 EIGEN_BLAS_TRMV_SPECIALIZE(double)
 EIGEN_BLAS_TRMV_SPECIALIZE(float)
@@ -74,185 +75,199 @@
 EIGEN_BLAS_TRMV_SPECIALIZE(scomplex)
 
 // implements col-major: res += alpha * op(triangular) * vector
-#define EIGEN_BLAS_TRMV_CM(EIGTYPE, BLASTYPE, EIGPREFIX, BLASPREFIX, BLASPOSTFIX) \
-template<typename Index, int Mode, bool ConjLhs, bool ConjRhs> \
-struct triangular_matrix_vector_product_trmv<Index,Mode,EIGTYPE,ConjLhs,EIGTYPE,ConjRhs,ColMajor> { \
-  enum { \
-    IsLower = (Mode&Lower) == Lower, \
-    SetDiag = (Mode&(ZeroDiag|UnitDiag)) ? 0 : 1, \
-    IsUnitDiag  = (Mode&UnitDiag) ? 1 : 0, \
-    IsZeroDiag  = (Mode&ZeroDiag) ? 1 : 0, \
-    LowUp = IsLower ? Lower : Upper \
-  }; \
- static void run(Index rows_, Index cols_, const EIGTYPE* lhs_, Index lhsStride, \
-                 const EIGTYPE* rhs_, Index rhsIncr, EIGTYPE* res_, Index resIncr, EIGTYPE alpha) \
- { \
-   if (ConjLhs || IsZeroDiag) { \
-     triangular_matrix_vector_product<Index,Mode,EIGTYPE,ConjLhs,EIGTYPE,ConjRhs,ColMajor,BuiltIn>::run( \
-       rows_, cols_, lhs_, lhsStride, rhs_, rhsIncr, res_, resIncr, alpha); \
-     return; \
-   }\
-   Index size = (std::min)(rows_,cols_); \
-   Index rows = IsLower ? rows_ : size; \
-   Index cols = IsLower ? size : cols_; \
-\
-   typedef VectorX##EIGPREFIX VectorRhs; \
-   EIGTYPE *x, *y;\
-\
-/* Set x*/ \
-   Map<const VectorRhs, 0, InnerStride<> > rhs(rhs_,cols,InnerStride<>(rhsIncr)); \
-   VectorRhs x_tmp; \
-   if (ConjRhs) x_tmp = rhs.conjugate(); else x_tmp = rhs; \
-   x = x_tmp.data(); \
-\
-/* Square part handling */\
-\
-   char trans, uplo, diag; \
-   BlasIndex m, n, lda, incx, incy; \
-   EIGTYPE const *a; \
-   EIGTYPE beta(1); \
-\
-/* Set m, n */ \
-   n = convert_index<BlasIndex>(size); \
-   lda = convert_index<BlasIndex>(lhsStride); \
-   incx = 1; \
-   incy = convert_index<BlasIndex>(resIncr); \
-\
-/* Set uplo, trans and diag*/ \
-   trans = 'N'; \
-   uplo = IsLower ? 'L' : 'U'; \
-   diag = IsUnitDiag ? 'U' : 'N'; \
-\
-/* call ?TRMV*/ \
-   BLASPREFIX##trmv##BLASPOSTFIX(&uplo, &trans, &diag, &n, (const BLASTYPE*)lhs_, &lda, (BLASTYPE*)x, &incx); \
-\
-/* Add op(a_tr)rhs into res*/ \
-   BLASPREFIX##axpy##BLASPOSTFIX(&n, (const BLASTYPE*)&numext::real_ref(alpha),(const BLASTYPE*)x, &incx, (BLASTYPE*)res_, &incy); \
-/* Non-square case - doesn't fit to BLAS ?TRMV. Fall to default triangular product*/ \
-   if (size<(std::max)(rows,cols)) { \
-     if (ConjRhs) x_tmp = rhs.conjugate(); else x_tmp = rhs; \
-     x = x_tmp.data(); \
-     if (size<rows) { \
-       y = res_ + size*resIncr; \
-       a = lhs_ + size; \
-       m = convert_index<BlasIndex>(rows-size); \
-       n = convert_index<BlasIndex>(size); \
-     } \
-     else { \
-       x += size; \
-       y = res_; \
-       a = lhs_ + size*lda; \
-       m = convert_index<BlasIndex>(size); \
-       n = convert_index<BlasIndex>(cols-size); \
-     } \
-     BLASPREFIX##gemv##BLASPOSTFIX(&trans, &m, &n, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (const BLASTYPE*)x, &incx, (const BLASTYPE*)&numext::real_ref(beta), (BLASTYPE*)y, &incy); \
-   } \
-  } \
-};
+#define EIGEN_BLAS_TRMV_CM(EIGTYPE, BLASTYPE, EIGPREFIX, BLASPREFIX, BLASPOSTFIX)                                    \
+  template <typename Index, int Mode, bool ConjLhs, bool ConjRhs>                                                    \
+  struct triangular_matrix_vector_product_trmv<Index, Mode, EIGTYPE, ConjLhs, EIGTYPE, ConjRhs, ColMajor> {          \
+    enum {                                                                                                           \
+      IsLower = (Mode & Lower) == Lower,                                                                             \
+      SetDiag = (Mode & (ZeroDiag | UnitDiag)) ? 0 : 1,                                                              \
+      IsUnitDiag = (Mode & UnitDiag) ? 1 : 0,                                                                        \
+      IsZeroDiag = (Mode & ZeroDiag) ? 1 : 0,                                                                        \
+      LowUp = IsLower ? Lower : Upper                                                                                \
+    };                                                                                                               \
+    static void run(Index rows_, Index cols_, const EIGTYPE* lhs_, Index lhsStride, const EIGTYPE* rhs_,             \
+                    Index rhsIncr, EIGTYPE* res_, Index resIncr, EIGTYPE alpha) {                                    \
+      if (ConjLhs || IsZeroDiag) {                                                                                   \
+        triangular_matrix_vector_product<Index, Mode, EIGTYPE, ConjLhs, EIGTYPE, ConjRhs, ColMajor, BuiltIn>::run(   \
+            rows_, cols_, lhs_, lhsStride, rhs_, rhsIncr, res_, resIncr, alpha);                                     \
+        return;                                                                                                      \
+      }                                                                                                              \
+      Index size = (std::min)(rows_, cols_);                                                                         \
+      Index rows = IsLower ? rows_ : size;                                                                           \
+      Index cols = IsLower ? size : cols_;                                                                           \
+                                                                                                                     \
+      typedef VectorX##EIGPREFIX VectorRhs;                                                                          \
+      EIGTYPE *x, *y;                                                                                                \
+                                                                                                                     \
+      /* Set x*/                                                                                                     \
+      Map<const VectorRhs, 0, InnerStride<> > rhs(rhs_, cols, InnerStride<>(rhsIncr));                               \
+      VectorRhs x_tmp;                                                                                               \
+      if (ConjRhs)                                                                                                   \
+        x_tmp = rhs.conjugate();                                                                                     \
+      else                                                                                                           \
+        x_tmp = rhs;                                                                                                 \
+      x = x_tmp.data();                                                                                              \
+                                                                                                                     \
+      /* Square part handling */                                                                                     \
+                                                                                                                     \
+      char trans, uplo, diag;                                                                                        \
+      BlasIndex m, n, lda, incx, incy;                                                                               \
+      EIGTYPE const* a;                                                                                              \
+      EIGTYPE beta(1);                                                                                               \
+                                                                                                                     \
+      /* Set m, n */                                                                                                 \
+      n = convert_index<BlasIndex>(size);                                                                            \
+      lda = convert_index<BlasIndex>(lhsStride);                                                                     \
+      incx = 1;                                                                                                      \
+      incy = convert_index<BlasIndex>(resIncr);                                                                      \
+                                                                                                                     \
+      /* Set uplo, trans and diag*/                                                                                  \
+      trans = 'N';                                                                                                   \
+      uplo = IsLower ? 'L' : 'U';                                                                                    \
+      diag = IsUnitDiag ? 'U' : 'N';                                                                                 \
+                                                                                                                     \
+      /* call ?TRMV*/                                                                                                \
+      BLASPREFIX##trmv##BLASPOSTFIX(&uplo, &trans, &diag, &n, (const BLASTYPE*)lhs_, &lda, (BLASTYPE*)x, &incx);     \
+                                                                                                                     \
+      /* Add op(a_tr)rhs into res*/                                                                                  \
+      BLASPREFIX##axpy##BLASPOSTFIX(&n, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)x, &incx,        \
+                                    (BLASTYPE*)res_, &incy);                                                         \
+      /* Non-square case - doesn't fit to BLAS ?TRMV. Fall to default triangular product*/                           \
+      if (size < (std::max)(rows, cols)) {                                                                           \
+        if (ConjRhs)                                                                                                 \
+          x_tmp = rhs.conjugate();                                                                                   \
+        else                                                                                                         \
+          x_tmp = rhs;                                                                                               \
+        x = x_tmp.data();                                                                                            \
+        if (size < rows) {                                                                                           \
+          y = res_ + size * resIncr;                                                                                 \
+          a = lhs_ + size;                                                                                           \
+          m = convert_index<BlasIndex>(rows - size);                                                                 \
+          n = convert_index<BlasIndex>(size);                                                                        \
+        } else {                                                                                                     \
+          x += size;                                                                                                 \
+          y = res_;                                                                                                  \
+          a = lhs_ + size * lda;                                                                                     \
+          m = convert_index<BlasIndex>(size);                                                                        \
+          n = convert_index<BlasIndex>(cols - size);                                                                 \
+        }                                                                                                            \
+        BLASPREFIX##gemv##BLASPOSTFIX(&trans, &m, &n, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)a, \
+                                      &lda, (const BLASTYPE*)x, &incx, (const BLASTYPE*)&numext::real_ref(beta),     \
+                                      (BLASTYPE*)y, &incy);                                                          \
+      }                                                                                                              \
+    }                                                                                                                \
+  };
 
 #ifdef EIGEN_USE_MKL
-EIGEN_BLAS_TRMV_CM(double,   double, d,  d,)
-EIGEN_BLAS_TRMV_CM(dcomplex, MKL_Complex16, cd, z,)
-EIGEN_BLAS_TRMV_CM(float,    float,  f,  s,)
-EIGEN_BLAS_TRMV_CM(scomplex, MKL_Complex8,  cf, c,)
+EIGEN_BLAS_TRMV_CM(double, double, d, d, )
+EIGEN_BLAS_TRMV_CM(dcomplex, MKL_Complex16, cd, z, )
+EIGEN_BLAS_TRMV_CM(float, float, f, s, )
+EIGEN_BLAS_TRMV_CM(scomplex, MKL_Complex8, cf, c, )
 #else
-EIGEN_BLAS_TRMV_CM(double,   double, d,  d, _)
+EIGEN_BLAS_TRMV_CM(double, double, d, d, _)
 EIGEN_BLAS_TRMV_CM(dcomplex, double, cd, z, _)
-EIGEN_BLAS_TRMV_CM(float,    float,  f,  s, _)
-EIGEN_BLAS_TRMV_CM(scomplex, float,  cf, c, _)
+EIGEN_BLAS_TRMV_CM(float, float, f, s, _)
+EIGEN_BLAS_TRMV_CM(scomplex, float, cf, c, _)
 #endif
 
 // implements row-major: res += alpha * op(triangular) * vector
-#define EIGEN_BLAS_TRMV_RM(EIGTYPE, BLASTYPE, EIGPREFIX, BLASPREFIX, BLASPOSTFIX) \
-template<typename Index, int Mode, bool ConjLhs, bool ConjRhs> \
-struct triangular_matrix_vector_product_trmv<Index,Mode,EIGTYPE,ConjLhs,EIGTYPE,ConjRhs,RowMajor> { \
-  enum { \
-    IsLower = (Mode&Lower) == Lower, \
-    SetDiag = (Mode&(ZeroDiag|UnitDiag)) ? 0 : 1, \
-    IsUnitDiag  = (Mode&UnitDiag) ? 1 : 0, \
-    IsZeroDiag  = (Mode&ZeroDiag) ? 1 : 0, \
-    LowUp = IsLower ? Lower : Upper \
-  }; \
- static void run(Index rows_, Index cols_, const EIGTYPE* lhs_, Index lhsStride, \
-                 const EIGTYPE* rhs_, Index rhsIncr, EIGTYPE* res_, Index resIncr, EIGTYPE alpha) \
- { \
-   if (IsZeroDiag) { \
-     triangular_matrix_vector_product<Index,Mode,EIGTYPE,ConjLhs,EIGTYPE,ConjRhs,RowMajor,BuiltIn>::run( \
-       rows_, cols_, lhs_, lhsStride, rhs_, rhsIncr, res_, resIncr, alpha); \
-     return; \
-   }\
-   Index size = (std::min)(rows_,cols_); \
-   Index rows = IsLower ? rows_ : size; \
-   Index cols = IsLower ? size : cols_; \
-\
-   typedef VectorX##EIGPREFIX VectorRhs; \
-   EIGTYPE *x, *y;\
-\
-/* Set x*/ \
-   Map<const VectorRhs, 0, InnerStride<> > rhs(rhs_,cols,InnerStride<>(rhsIncr)); \
-   VectorRhs x_tmp; \
-   if (ConjRhs) x_tmp = rhs.conjugate(); else x_tmp = rhs; \
-   x = x_tmp.data(); \
-\
-/* Square part handling */\
-\
-   char trans, uplo, diag; \
-   BlasIndex m, n, lda, incx, incy; \
-   EIGTYPE const *a; \
-   EIGTYPE beta(1); \
-\
-/* Set m, n */ \
-   n = convert_index<BlasIndex>(size); \
-   lda = convert_index<BlasIndex>(lhsStride); \
-   incx = 1; \
-   incy = convert_index<BlasIndex>(resIncr); \
-\
-/* Set uplo, trans and diag*/ \
-   trans = ConjLhs ? 'C' : 'T'; \
-   uplo = IsLower ? 'U' : 'L'; \
-   diag = IsUnitDiag ? 'U' : 'N'; \
-\
-/* call ?TRMV*/ \
-   BLASPREFIX##trmv##BLASPOSTFIX(&uplo, &trans, &diag, &n, (const BLASTYPE*)lhs_, &lda, (BLASTYPE*)x, &incx); \
-\
-/* Add op(a_tr)rhs into res*/ \
-   BLASPREFIX##axpy##BLASPOSTFIX(&n, (const BLASTYPE*)&numext::real_ref(alpha),(const BLASTYPE*)x, &incx, (BLASTYPE*)res_, &incy); \
-/* Non-square case - doesn't fit to BLAS ?TRMV. Fall to default triangular product*/ \
-   if (size<(std::max)(rows,cols)) { \
-     if (ConjRhs) x_tmp = rhs.conjugate(); else x_tmp = rhs; \
-     x = x_tmp.data(); \
-     if (size<rows) { \
-       y = res_ + size*resIncr; \
-       a = lhs_ + size*lda; \
-       m = convert_index<BlasIndex>(rows-size); \
-       n = convert_index<BlasIndex>(size); \
-     } \
-     else { \
-       x += size; \
-       y = res_; \
-       a = lhs_ + size; \
-       m = convert_index<BlasIndex>(size); \
-       n = convert_index<BlasIndex>(cols-size); \
-     } \
-     BLASPREFIX##gemv##BLASPOSTFIX(&trans, &n, &m, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (const BLASTYPE*)x, &incx, (const BLASTYPE*)&numext::real_ref(beta), (BLASTYPE*)y, &incy); \
-   } \
-  } \
-};
+#define EIGEN_BLAS_TRMV_RM(EIGTYPE, BLASTYPE, EIGPREFIX, BLASPREFIX, BLASPOSTFIX)                                    \
+  template <typename Index, int Mode, bool ConjLhs, bool ConjRhs>                                                    \
+  struct triangular_matrix_vector_product_trmv<Index, Mode, EIGTYPE, ConjLhs, EIGTYPE, ConjRhs, RowMajor> {          \
+    enum {                                                                                                           \
+      IsLower = (Mode & Lower) == Lower,                                                                             \
+      SetDiag = (Mode & (ZeroDiag | UnitDiag)) ? 0 : 1,                                                              \
+      IsUnitDiag = (Mode & UnitDiag) ? 1 : 0,                                                                        \
+      IsZeroDiag = (Mode & ZeroDiag) ? 1 : 0,                                                                        \
+      LowUp = IsLower ? Lower : Upper                                                                                \
+    };                                                                                                               \
+    static void run(Index rows_, Index cols_, const EIGTYPE* lhs_, Index lhsStride, const EIGTYPE* rhs_,             \
+                    Index rhsIncr, EIGTYPE* res_, Index resIncr, EIGTYPE alpha) {                                    \
+      if (IsZeroDiag) {                                                                                              \
+        triangular_matrix_vector_product<Index, Mode, EIGTYPE, ConjLhs, EIGTYPE, ConjRhs, RowMajor, BuiltIn>::run(   \
+            rows_, cols_, lhs_, lhsStride, rhs_, rhsIncr, res_, resIncr, alpha);                                     \
+        return;                                                                                                      \
+      }                                                                                                              \
+      Index size = (std::min)(rows_, cols_);                                                                         \
+      Index rows = IsLower ? rows_ : size;                                                                           \
+      Index cols = IsLower ? size : cols_;                                                                           \
+                                                                                                                     \
+      typedef VectorX##EIGPREFIX VectorRhs;                                                                          \
+      EIGTYPE *x, *y;                                                                                                \
+                                                                                                                     \
+      /* Set x*/                                                                                                     \
+      Map<const VectorRhs, 0, InnerStride<> > rhs(rhs_, cols, InnerStride<>(rhsIncr));                               \
+      VectorRhs x_tmp;                                                                                               \
+      if (ConjRhs)                                                                                                   \
+        x_tmp = rhs.conjugate();                                                                                     \
+      else                                                                                                           \
+        x_tmp = rhs;                                                                                                 \
+      x = x_tmp.data();                                                                                              \
+                                                                                                                     \
+      /* Square part handling */                                                                                     \
+                                                                                                                     \
+      char trans, uplo, diag;                                                                                        \
+      BlasIndex m, n, lda, incx, incy;                                                                               \
+      EIGTYPE const* a;                                                                                              \
+      EIGTYPE beta(1);                                                                                               \
+                                                                                                                     \
+      /* Set m, n */                                                                                                 \
+      n = convert_index<BlasIndex>(size);                                                                            \
+      lda = convert_index<BlasIndex>(lhsStride);                                                                     \
+      incx = 1;                                                                                                      \
+      incy = convert_index<BlasIndex>(resIncr);                                                                      \
+                                                                                                                     \
+      /* Set uplo, trans and diag*/                                                                                  \
+      trans = ConjLhs ? 'C' : 'T';                                                                                   \
+      uplo = IsLower ? 'U' : 'L';                                                                                    \
+      diag = IsUnitDiag ? 'U' : 'N';                                                                                 \
+                                                                                                                     \
+      /* call ?TRMV*/                                                                                                \
+      BLASPREFIX##trmv##BLASPOSTFIX(&uplo, &trans, &diag, &n, (const BLASTYPE*)lhs_, &lda, (BLASTYPE*)x, &incx);     \
+                                                                                                                     \
+      /* Add op(a_tr)rhs into res*/                                                                                  \
+      BLASPREFIX##axpy##BLASPOSTFIX(&n, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)x, &incx,        \
+                                    (BLASTYPE*)res_, &incy);                                                         \
+      /* Non-square case - doesn't fit to BLAS ?TRMV. Fall to default triangular product*/                           \
+      if (size < (std::max)(rows, cols)) {                                                                           \
+        if (ConjRhs)                                                                                                 \
+          x_tmp = rhs.conjugate();                                                                                   \
+        else                                                                                                         \
+          x_tmp = rhs;                                                                                               \
+        x = x_tmp.data();                                                                                            \
+        if (size < rows) {                                                                                           \
+          y = res_ + size * resIncr;                                                                                 \
+          a = lhs_ + size * lda;                                                                                     \
+          m = convert_index<BlasIndex>(rows - size);                                                                 \
+          n = convert_index<BlasIndex>(size);                                                                        \
+        } else {                                                                                                     \
+          x += size;                                                                                                 \
+          y = res_;                                                                                                  \
+          a = lhs_ + size;                                                                                           \
+          m = convert_index<BlasIndex>(size);                                                                        \
+          n = convert_index<BlasIndex>(cols - size);                                                                 \
+        }                                                                                                            \
+        BLASPREFIX##gemv##BLASPOSTFIX(&trans, &n, &m, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)a, \
+                                      &lda, (const BLASTYPE*)x, &incx, (const BLASTYPE*)&numext::real_ref(beta),     \
+                                      (BLASTYPE*)y, &incy);                                                          \
+      }                                                                                                              \
+    }                                                                                                                \
+  };
 
 #ifdef EIGEN_USE_MKL
-EIGEN_BLAS_TRMV_RM(double,   double, d,  d,)
-EIGEN_BLAS_TRMV_RM(dcomplex, MKL_Complex16, cd, z,)
-EIGEN_BLAS_TRMV_RM(float,    float,  f,  s,)
-EIGEN_BLAS_TRMV_RM(scomplex, MKL_Complex8,  cf, c,)
+EIGEN_BLAS_TRMV_RM(double, double, d, d, )
+EIGEN_BLAS_TRMV_RM(dcomplex, MKL_Complex16, cd, z, )
+EIGEN_BLAS_TRMV_RM(float, float, f, s, )
+EIGEN_BLAS_TRMV_RM(scomplex, MKL_Complex8, cf, c, )
 #else
-EIGEN_BLAS_TRMV_RM(double,   double, d,  d,_)
-EIGEN_BLAS_TRMV_RM(dcomplex, double, cd, z,_)
-EIGEN_BLAS_TRMV_RM(float,    float,  f,  s,_)
-EIGEN_BLAS_TRMV_RM(scomplex, float,  cf, c,_)
+EIGEN_BLAS_TRMV_RM(double, double, d, d, _)
+EIGEN_BLAS_TRMV_RM(dcomplex, double, cd, z, _)
+EIGEN_BLAS_TRMV_RM(float, float, f, s, _)
+EIGEN_BLAS_TRMV_RM(scomplex, float, cf, c, _)
 #endif
 
-} // end namespase internal
+}  // namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_TRIANGULAR_MATRIX_VECTOR_BLAS_H
+#endif  // EIGEN_TRIANGULAR_MATRIX_VECTOR_BLAS_H
diff --git a/Eigen/src/Core/products/TriangularSolverMatrix.h b/Eigen/src/Core/products/TriangularSolverMatrix.h
index e21d556..f9b2ad0 100644
--- a/Eigen/src/Core/products/TriangularSolverMatrix.h
+++ b/Eigen/src/Core/products/TriangularSolverMatrix.h
@@ -18,433 +18,371 @@
 
 namespace internal {
 
-template <typename Scalar, typename Index, int Mode, bool Conjugate, int TriStorageOrder,int OtherInnerStride, bool Specialized>
+template <typename Scalar, typename Index, int Mode, bool Conjugate, int TriStorageOrder, int OtherInnerStride,
+          bool Specialized>
 struct trsmKernelL {
   // Generic Implementation of triangular solve for triangular matrix on left and multiple rhs.
   // Handles non-packed matrices.
-  static void kernel(
-    Index size, Index otherSize,
-    const Scalar* _tri, Index triStride,
-    Scalar* _other, Index otherIncr, Index otherStride);
+  static void kernel(Index size, Index otherSize, const Scalar* _tri, Index triStride, Scalar* _other, Index otherIncr,
+                     Index otherStride);
 };
 
-template <typename Scalar, typename Index, int Mode, bool Conjugate, int TriStorageOrder,int OtherInnerStride, bool Specialized>
+template <typename Scalar, typename Index, int Mode, bool Conjugate, int TriStorageOrder, int OtherInnerStride,
+          bool Specialized>
 struct trsmKernelR {
   // Generic Implementation of triangular solve for triangular matrix on right and multiple lhs.
   // Handles non-packed matrices.
-  static void kernel(
-    Index size, Index otherSize,
-    const Scalar* _tri, Index triStride,
-    Scalar* _other, Index otherIncr, Index otherStride);
+  static void kernel(Index size, Index otherSize, const Scalar* _tri, Index triStride, Scalar* _other, Index otherIncr,
+                     Index otherStride);
 };
 
-template <typename Scalar, typename Index, int Mode, bool Conjugate, int TriStorageOrder,int OtherInnerStride, bool Specialized>
-EIGEN_STRONG_INLINE void trsmKernelL<Scalar, Index, Mode, Conjugate, TriStorageOrder, OtherInnerStride, Specialized>::kernel(
-    Index size, Index otherSize,
-    const Scalar* _tri, Index triStride,
-    Scalar* _other, Index otherIncr, Index otherStride)
-  {
-    typedef const_blas_data_mapper<Scalar, Index, TriStorageOrder> TriMapper;
-    typedef blas_data_mapper<Scalar, Index, ColMajor, Unaligned, OtherInnerStride> OtherMapper;
-    TriMapper tri(_tri, triStride);
-    OtherMapper other(_other, otherStride, otherIncr);
+template <typename Scalar, typename Index, int Mode, bool Conjugate, int TriStorageOrder, int OtherInnerStride,
+          bool Specialized>
+EIGEN_STRONG_INLINE void trsmKernelL<Scalar, Index, Mode, Conjugate, TriStorageOrder, OtherInnerStride,
+                                     Specialized>::kernel(Index size, Index otherSize, const Scalar* _tri,
+                                                          Index triStride, Scalar* _other, Index otherIncr,
+                                                          Index otherStride) {
+  typedef const_blas_data_mapper<Scalar, Index, TriStorageOrder> TriMapper;
+  typedef blas_data_mapper<Scalar, Index, ColMajor, Unaligned, OtherInnerStride> OtherMapper;
+  TriMapper tri(_tri, triStride);
+  OtherMapper other(_other, otherStride, otherIncr);
 
-    enum { IsLower = (Mode&Lower) == Lower };
-    conj_if<Conjugate> conj;
+  enum { IsLower = (Mode & Lower) == Lower };
+  conj_if<Conjugate> conj;
 
-    // tr solve
-    for (Index k=0; k<size; ++k)
-    {
-      // TODO write a small kernel handling this (can be shared with trsv)
-      Index i  = IsLower ? k : -k-1;
-      Index rs = size - k - 1; // remaining size
-      Index s  = TriStorageOrder==RowMajor ? (IsLower ? 0 : i+1)
-        :  IsLower ? i+1 : i-rs;
+  // tr solve
+  for (Index k = 0; k < size; ++k) {
+    // TODO write a small kernel handling this (can be shared with trsv)
+    Index i = IsLower ? k : -k - 1;
+    Index rs = size - k - 1;  // remaining size
+    Index s = TriStorageOrder == RowMajor ? (IsLower ? 0 : i + 1) : IsLower ? i + 1 : i - rs;
 
-      Scalar a = (Mode & UnitDiag) ? Scalar(1) : Scalar(1)/conj(tri(i,i));
-      for (Index j=0; j<otherSize; ++j)
-      {
-        if (TriStorageOrder==RowMajor)
-        {
-          Scalar b(0);
-          const Scalar* l = &tri(i,s);
-          typename OtherMapper::LinearMapper r = other.getLinearMapper(s,j);
-          for (Index i3=0; i3<k; ++i3)
-            b += conj(l[i3]) * r(i3);
+    Scalar a = (Mode & UnitDiag) ? Scalar(1) : Scalar(1) / conj(tri(i, i));
+    for (Index j = 0; j < otherSize; ++j) {
+      if (TriStorageOrder == RowMajor) {
+        Scalar b(0);
+        const Scalar* l = &tri(i, s);
+        typename OtherMapper::LinearMapper r = other.getLinearMapper(s, j);
+        for (Index i3 = 0; i3 < k; ++i3) b += conj(l[i3]) * r(i3);
 
-          other(i,j) = (other(i,j) - b)*a;
-        }
-        else
-        {
-          Scalar& otherij = other(i,j);
-          otherij *= a;
-          Scalar b = otherij;
-          typename OtherMapper::LinearMapper r = other.getLinearMapper(s,j);
-          typename TriMapper::LinearMapper l = tri.getLinearMapper(s,i);
-          for (Index i3=0;i3<rs;++i3)
-            r(i3) -= b * conj(l(i3));
-        }
+        other(i, j) = (other(i, j) - b) * a;
+      } else {
+        Scalar& otherij = other(i, j);
+        otherij *= a;
+        Scalar b = otherij;
+        typename OtherMapper::LinearMapper r = other.getLinearMapper(s, j);
+        typename TriMapper::LinearMapper l = tri.getLinearMapper(s, i);
+        for (Index i3 = 0; i3 < rs; ++i3) r(i3) -= b * conj(l(i3));
       }
     }
   }
+}
 
-
-template <typename Scalar, typename Index, int Mode, bool Conjugate, int TriStorageOrder, int OtherInnerStride, bool Specialized>
-EIGEN_STRONG_INLINE void trsmKernelR<Scalar, Index, Mode, Conjugate, TriStorageOrder, OtherInnerStride, Specialized>::kernel(
-    Index size, Index otherSize,
-    const Scalar* _tri, Index triStride,
-    Scalar* _other, Index otherIncr, Index otherStride)
-{
+template <typename Scalar, typename Index, int Mode, bool Conjugate, int TriStorageOrder, int OtherInnerStride,
+          bool Specialized>
+EIGEN_STRONG_INLINE void trsmKernelR<Scalar, Index, Mode, Conjugate, TriStorageOrder, OtherInnerStride,
+                                     Specialized>::kernel(Index size, Index otherSize, const Scalar* _tri,
+                                                          Index triStride, Scalar* _other, Index otherIncr,
+                                                          Index otherStride) {
   typedef typename NumTraits<Scalar>::Real RealScalar;
   typedef blas_data_mapper<Scalar, Index, ColMajor, Unaligned, OtherInnerStride> LhsMapper;
   typedef const_blas_data_mapper<Scalar, Index, TriStorageOrder> RhsMapper;
   LhsMapper lhs(_other, otherStride, otherIncr);
   RhsMapper rhs(_tri, triStride);
 
-  enum {
-    RhsStorageOrder   = TriStorageOrder,
-    IsLower = (Mode&Lower) == Lower
-  };
+  enum { RhsStorageOrder = TriStorageOrder, IsLower = (Mode & Lower) == Lower };
   conj_if<Conjugate> conj;
 
-  for (Index k=0; k<size; ++k)
-  {
-    Index j = IsLower ? size-k-1 : k;
+  for (Index k = 0; k < size; ++k) {
+    Index j = IsLower ? size - k - 1 : k;
 
-    typename LhsMapper::LinearMapper r = lhs.getLinearMapper(0,j);
-    for (Index k3=0; k3<k; ++k3)
-    {
-      Scalar b = conj(rhs(IsLower ? j+1+k3 : k3,j));
-      typename LhsMapper::LinearMapper a = lhs.getLinearMapper(0,IsLower ? j+1+k3 : k3);
-      for (Index i=0; i<otherSize; ++i)
-                    r(i) -= a(i) * b;
+    typename LhsMapper::LinearMapper r = lhs.getLinearMapper(0, j);
+    for (Index k3 = 0; k3 < k; ++k3) {
+      Scalar b = conj(rhs(IsLower ? j + 1 + k3 : k3, j));
+      typename LhsMapper::LinearMapper a = lhs.getLinearMapper(0, IsLower ? j + 1 + k3 : k3);
+      for (Index i = 0; i < otherSize; ++i) r(i) -= a(i) * b;
     }
-    if((Mode & UnitDiag)==0)
-    {
-      Scalar inv_rjj = RealScalar(1)/conj(rhs(j,j));
-      for (Index i=0; i<otherSize; ++i)
-        r(i) *= inv_rjj;
+    if ((Mode & UnitDiag) == 0) {
+      Scalar inv_rjj = RealScalar(1) / conj(rhs(j, j));
+      for (Index i = 0; i < otherSize; ++i) r(i) *= inv_rjj;
     }
   }
 }
 
-
 // if the rhs is row major, let's transpose the product
-template <typename Scalar, typename Index, int Side, int Mode, bool Conjugate, int TriStorageOrder, int OtherInnerStride>
-struct triangular_solve_matrix<Scalar,Index,Side,Mode,Conjugate,TriStorageOrder,RowMajor,OtherInnerStride>
-{
-  static void run(
-    Index size, Index cols,
-    const Scalar*  tri, Index triStride,
-    Scalar* _other, Index otherIncr, Index otherStride,
-    level3_blocking<Scalar,Scalar>& blocking)
-  {
+template <typename Scalar, typename Index, int Side, int Mode, bool Conjugate, int TriStorageOrder,
+          int OtherInnerStride>
+struct triangular_solve_matrix<Scalar, Index, Side, Mode, Conjugate, TriStorageOrder, RowMajor, OtherInnerStride> {
+  static void run(Index size, Index cols, const Scalar* tri, Index triStride, Scalar* _other, Index otherIncr,
+                  Index otherStride, level3_blocking<Scalar, Scalar>& blocking) {
     triangular_solve_matrix<
-      Scalar, Index, Side==OnTheLeft?OnTheRight:OnTheLeft,
-      (Mode&UnitDiag) | ((Mode&Upper) ? Lower : Upper),
-      NumTraits<Scalar>::IsComplex && Conjugate,
-      TriStorageOrder==RowMajor ? ColMajor : RowMajor, ColMajor, OtherInnerStride>
-      ::run(size, cols, tri, triStride, _other, otherIncr, otherStride, blocking);
+        Scalar, Index, Side == OnTheLeft ? OnTheRight : OnTheLeft, (Mode & UnitDiag) | ((Mode & Upper) ? Lower : Upper),
+        NumTraits<Scalar>::IsComplex && Conjugate, TriStorageOrder == RowMajor ? ColMajor : RowMajor, ColMajor,
+        OtherInnerStride>::run(size, cols, tri, triStride, _other, otherIncr, otherStride, blocking);
   }
 };
 
 /* Optimized triangular solver with multiple right hand side and the triangular matrix on the left
  */
-template <typename Scalar, typename Index, int Mode, bool Conjugate, int TriStorageOrder,int OtherInnerStride>
-struct triangular_solve_matrix<Scalar,Index,OnTheLeft,Mode,Conjugate,TriStorageOrder,ColMajor,OtherInnerStride>
-{
-  static EIGEN_DONT_INLINE void run(
-    Index size, Index otherSize,
-    const Scalar* _tri, Index triStride,
-    Scalar* _other, Index otherIncr, Index otherStride,
-    level3_blocking<Scalar,Scalar>& blocking);
+template <typename Scalar, typename Index, int Mode, bool Conjugate, int TriStorageOrder, int OtherInnerStride>
+struct triangular_solve_matrix<Scalar, Index, OnTheLeft, Mode, Conjugate, TriStorageOrder, ColMajor, OtherInnerStride> {
+  static EIGEN_DONT_INLINE void run(Index size, Index otherSize, const Scalar* _tri, Index triStride, Scalar* _other,
+                                    Index otherIncr, Index otherStride, level3_blocking<Scalar, Scalar>& blocking);
 };
 
 template <typename Scalar, typename Index, int Mode, bool Conjugate, int TriStorageOrder, int OtherInnerStride>
-EIGEN_DONT_INLINE void triangular_solve_matrix<Scalar,Index,OnTheLeft,Mode,Conjugate,TriStorageOrder,ColMajor,OtherInnerStride>::run(
-    Index size, Index otherSize,
-    const Scalar* _tri, Index triStride,
-    Scalar* _other, Index otherIncr, Index otherStride,
-    level3_blocking<Scalar,Scalar>& blocking)
-  {
-    Index cols = otherSize;
+EIGEN_DONT_INLINE void triangular_solve_matrix<Scalar, Index, OnTheLeft, Mode, Conjugate, TriStorageOrder, ColMajor,
+                                               OtherInnerStride>::run(Index size, Index otherSize, const Scalar* _tri,
+                                                                      Index triStride, Scalar* _other, Index otherIncr,
+                                                                      Index otherStride,
+                                                                      level3_blocking<Scalar, Scalar>& blocking) {
+  Index cols = otherSize;
 
-    std::ptrdiff_t l1, l2, l3;
-    manage_caching_sizes(GetAction, &l1, &l2, &l3);
+  std::ptrdiff_t l1, l2, l3;
+  manage_caching_sizes(GetAction, &l1, &l2, &l3);
 
 #if defined(EIGEN_VECTORIZE_AVX512) && EIGEN_USE_AVX512_TRSM_L_KERNELS && EIGEN_ENABLE_AVX512_NOCOPY_TRSM_L_CUTOFFS
-    EIGEN_IF_CONSTEXPR( (OtherInnerStride == 1 &&
-                       (std::is_same<Scalar,float>::value ||
-                        std::is_same<Scalar,double>::value)) ) {
-      // Very rough cutoffs to determine when to call trsm w/o packing
-      // For small problem sizes trsmKernel compiled with clang is generally faster.
-      // TODO: Investigate better heuristics for cutoffs.
-      double L2Cap = 0.5; // 50% of L2 size
-      if (size < avx512_trsm_cutoff<Scalar>(l2, cols, L2Cap)) {
-        trsmKernelL<Scalar, Index, Mode, Conjugate, TriStorageOrder, 1, /*Specialized=*/true>::kernel(
+  EIGEN_IF_CONSTEXPR(
+      (OtherInnerStride == 1 && (std::is_same<Scalar, float>::value || std::is_same<Scalar, double>::value))) {
+    // Very rough cutoffs to determine when to call trsm w/o packing
+    // For small problem sizes trsmKernel compiled with clang is generally faster.
+    // TODO: Investigate better heuristics for cutoffs.
+    double L2Cap = 0.5;  // 50% of L2 size
+    if (size < avx512_trsm_cutoff<Scalar>(l2, cols, L2Cap)) {
+      trsmKernelL<Scalar, Index, Mode, Conjugate, TriStorageOrder, 1, /*Specialized=*/true>::kernel(
           size, cols, _tri, triStride, _other, 1, otherStride);
-        return;
-      }
+      return;
     }
+  }
 #endif
 
-    typedef const_blas_data_mapper<Scalar, Index, TriStorageOrder> TriMapper;
-    typedef blas_data_mapper<Scalar, Index, ColMajor, Unaligned, OtherInnerStride> OtherMapper;
-    TriMapper tri(_tri, triStride);
-    OtherMapper other(_other, otherStride, otherIncr);
+  typedef const_blas_data_mapper<Scalar, Index, TriStorageOrder> TriMapper;
+  typedef blas_data_mapper<Scalar, Index, ColMajor, Unaligned, OtherInnerStride> OtherMapper;
+  TriMapper tri(_tri, triStride);
+  OtherMapper other(_other, otherStride, otherIncr);
 
-    typedef gebp_traits<Scalar,Scalar> Traits;
+  typedef gebp_traits<Scalar, Scalar> Traits;
 
-    enum {
-      SmallPanelWidth   = plain_enum_max(Traits::mr, Traits::nr),
-      IsLower = (Mode&Lower) == Lower
-    };
+  enum { SmallPanelWidth = plain_enum_max(Traits::mr, Traits::nr), IsLower = (Mode & Lower) == Lower };
 
-    Index kc = blocking.kc();                   // cache block size along the K direction
-    Index mc = (std::min)(size,blocking.mc());  // cache block size along the M direction
+  Index kc = blocking.kc();                    // cache block size along the K direction
+  Index mc = (std::min)(size, blocking.mc());  // cache block size along the M direction
 
-    std::size_t sizeA = kc*mc;
-    std::size_t sizeB = kc*cols;
+  std::size_t sizeA = kc * mc;
+  std::size_t sizeB = kc * cols;
 
-    ei_declare_aligned_stack_constructed_variable(Scalar, blockA, sizeA, blocking.blockA());
-    ei_declare_aligned_stack_constructed_variable(Scalar, blockB, sizeB, blocking.blockB());
+  ei_declare_aligned_stack_constructed_variable(Scalar, blockA, sizeA, blocking.blockA());
+  ei_declare_aligned_stack_constructed_variable(Scalar, blockB, sizeB, blocking.blockB());
 
-    gebp_kernel<Scalar, Scalar, Index, OtherMapper, Traits::mr, Traits::nr, Conjugate, false> gebp_kernel;
-    gemm_pack_lhs<Scalar, Index, TriMapper, Traits::mr, Traits::LhsProgress, typename Traits::LhsPacket4Packing, TriStorageOrder> pack_lhs;
-    gemm_pack_rhs<Scalar, Index, OtherMapper, Traits::nr, ColMajor, false, true> pack_rhs;
+  gebp_kernel<Scalar, Scalar, Index, OtherMapper, Traits::mr, Traits::nr, Conjugate, false> gebp_kernel;
+  gemm_pack_lhs<Scalar, Index, TriMapper, Traits::mr, Traits::LhsProgress, typename Traits::LhsPacket4Packing,
+                TriStorageOrder>
+      pack_lhs;
+  gemm_pack_rhs<Scalar, Index, OtherMapper, Traits::nr, ColMajor, false, true> pack_rhs;
 
-    // the goal here is to subdivise the Rhs panels such that we keep some cache
-    // coherence when accessing the rhs elements
-    Index subcols = cols>0 ? l2/(4 * sizeof(Scalar) * std::max<Index>(otherStride,size)) : 0;
-    subcols = std::max<Index>((subcols/Traits::nr)*Traits::nr, Traits::nr);
+  // the goal here is to subdivise the Rhs panels such that we keep some cache
+  // coherence when accessing the rhs elements
+  Index subcols = cols > 0 ? l2 / (4 * sizeof(Scalar) * std::max<Index>(otherStride, size)) : 0;
+  subcols = std::max<Index>((subcols / Traits::nr) * Traits::nr, Traits::nr);
 
-    for(Index k2=IsLower ? 0 : size;
-        IsLower ? k2<size : k2>0;
-        IsLower ? k2+=kc : k2-=kc)
-    {
-      const Index actual_kc = (std::min)(IsLower ? size-k2 : k2, kc);
+  for (Index k2 = IsLower ? 0 : size; IsLower ? k2 < size : k2 > 0; IsLower ? k2 += kc : k2 -= kc) {
+    const Index actual_kc = (std::min)(IsLower ? size - k2 : k2, kc);
 
-      // We have selected and packed a big horizontal panel R1 of rhs. Let B be the packed copy of this panel,
-      // and R2 the remaining part of rhs. The corresponding vertical panel of lhs is split into
-      // A11 (the triangular part) and A21 the remaining rectangular part.
-      // Then the high level algorithm is:
-      //  - B = R1                    => general block copy (done during the next step)
-      //  - R1 = A11^-1 B             => tricky part
-      //  - update B from the new R1  => actually this has to be performed continuously during the above step
-      //  - R2 -= A21 * B             => GEPP
+    // We have selected and packed a big horizontal panel R1 of rhs. Let B be the packed copy of this panel,
+    // and R2 the remaining part of rhs. The corresponding vertical panel of lhs is split into
+    // A11 (the triangular part) and A21 the remaining rectangular part.
+    // Then the high level algorithm is:
+    //  - B = R1                    => general block copy (done during the next step)
+    //  - R1 = A11^-1 B             => tricky part
+    //  - update B from the new R1  => actually this has to be performed continuously during the above step
+    //  - R2 -= A21 * B             => GEPP
 
-      // The tricky part: compute R1 = A11^-1 B while updating B from R1
-      // The idea is to split A11 into multiple small vertical panels.
-      // Each panel can be split into a small triangular part T1k which is processed without optimization,
-      // and the remaining small part T2k which is processed using gebp with appropriate block strides
-      for(Index j2=0; j2<cols; j2+=subcols)
-      {
-        Index actual_cols = (std::min)(cols-j2,subcols);
-        // for each small vertical panels [T1k^T, T2k^T]^T of lhs
-        for (Index k1=0; k1<actual_kc; k1+=SmallPanelWidth)
+    // The tricky part: compute R1 = A11^-1 B while updating B from R1
+    // The idea is to split A11 into multiple small vertical panels.
+    // Each panel can be split into a small triangular part T1k which is processed without optimization,
+    // and the remaining small part T2k which is processed using gebp with appropriate block strides
+    for (Index j2 = 0; j2 < cols; j2 += subcols) {
+      Index actual_cols = (std::min)(cols - j2, subcols);
+      // for each small vertical panels [T1k^T, T2k^T]^T of lhs
+      for (Index k1 = 0; k1 < actual_kc; k1 += SmallPanelWidth) {
+        Index actualPanelWidth = std::min<Index>(actual_kc - k1, SmallPanelWidth);
+        // tr solve
         {
-          Index actualPanelWidth = std::min<Index>(actual_kc-k1, SmallPanelWidth);
-          // tr solve
-          {
-            Index i  = IsLower ? k2+k1 : k2-k1;
+          Index i = IsLower ? k2 + k1 : k2 - k1;
 #if defined(EIGEN_VECTORIZE_AVX512) && EIGEN_USE_AVX512_TRSM_L_KERNELS
-            EIGEN_IF_CONSTEXPR( (OtherInnerStride == 1 &&
-                                 (std::is_same<Scalar,float>::value ||
-                                  std::is_same<Scalar,double>::value)) ) {
-              i  = IsLower ? k2 + k1: k2 - k1 - actualPanelWidth;
-            }
+          EIGEN_IF_CONSTEXPR(
+              (OtherInnerStride == 1 && (std::is_same<Scalar, float>::value || std::is_same<Scalar, double>::value))) {
+            i = IsLower ? k2 + k1 : k2 - k1 - actualPanelWidth;
+          }
 #endif
-            trsmKernelL<Scalar, Index, Mode, Conjugate, TriStorageOrder, OtherInnerStride, /*Specialized=*/true>::kernel(
-              actualPanelWidth, actual_cols,
-              _tri + i + (i)*triStride, triStride,
-              _other + i*OtherInnerStride + j2*otherStride, otherIncr, otherStride);
-          }
+          trsmKernelL<Scalar, Index, Mode, Conjugate, TriStorageOrder, OtherInnerStride, /*Specialized=*/true>::kernel(
+              actualPanelWidth, actual_cols, _tri + i + (i)*triStride, triStride,
+              _other + i * OtherInnerStride + j2 * otherStride, otherIncr, otherStride);
+        }
 
-          Index lengthTarget = actual_kc-k1-actualPanelWidth;
-          Index startBlock   = IsLower ? k2+k1 : k2-k1-actualPanelWidth;
-          Index blockBOffset = IsLower ? k1 : lengthTarget;
+        Index lengthTarget = actual_kc - k1 - actualPanelWidth;
+        Index startBlock = IsLower ? k2 + k1 : k2 - k1 - actualPanelWidth;
+        Index blockBOffset = IsLower ? k1 : lengthTarget;
 
-          // update the respective rows of B from other
-          pack_rhs(blockB+actual_kc*j2, other.getSubMapper(startBlock,j2), actualPanelWidth, actual_cols, actual_kc, blockBOffset);
+        // update the respective rows of B from other
+        pack_rhs(blockB + actual_kc * j2, other.getSubMapper(startBlock, j2), actualPanelWidth, actual_cols, actual_kc,
+                 blockBOffset);
 
-          // GEBP
-          if (lengthTarget>0)
-          {
-            Index startTarget  = IsLower ? k2+k1+actualPanelWidth : k2-actual_kc;
+        // GEBP
+        if (lengthTarget > 0) {
+          Index startTarget = IsLower ? k2 + k1 + actualPanelWidth : k2 - actual_kc;
 
-            pack_lhs(blockA, tri.getSubMapper(startTarget,startBlock), actualPanelWidth, lengthTarget);
+          pack_lhs(blockA, tri.getSubMapper(startTarget, startBlock), actualPanelWidth, lengthTarget);
 
-            gebp_kernel(other.getSubMapper(startTarget,j2), blockA, blockB+actual_kc*j2, lengthTarget, actualPanelWidth, actual_cols, Scalar(-1),
-                        actualPanelWidth, actual_kc, 0, blockBOffset);
-          }
+          gebp_kernel(other.getSubMapper(startTarget, j2), blockA, blockB + actual_kc * j2, lengthTarget,
+                      actualPanelWidth, actual_cols, Scalar(-1), actualPanelWidth, actual_kc, 0, blockBOffset);
         }
       }
+    }
 
-      // R2 -= A21 * B => GEPP
-      {
-        Index start = IsLower ? k2+kc : 0;
-        Index end   = IsLower ? size : k2-kc;
-        for(Index i2=start; i2<end; i2+=mc)
-        {
-          const Index actual_mc = (std::min)(mc,end-i2);
-          if (actual_mc>0)
-          {
-            pack_lhs(blockA, tri.getSubMapper(i2, IsLower ? k2 : k2-kc), actual_kc, actual_mc);
+    // R2 -= A21 * B => GEPP
+    {
+      Index start = IsLower ? k2 + kc : 0;
+      Index end = IsLower ? size : k2 - kc;
+      for (Index i2 = start; i2 < end; i2 += mc) {
+        const Index actual_mc = (std::min)(mc, end - i2);
+        if (actual_mc > 0) {
+          pack_lhs(blockA, tri.getSubMapper(i2, IsLower ? k2 : k2 - kc), actual_kc, actual_mc);
 
-            gebp_kernel(other.getSubMapper(i2, 0), blockA, blockB, actual_mc, actual_kc, cols, Scalar(-1), -1, -1, 0, 0);
-          }
+          gebp_kernel(other.getSubMapper(i2, 0), blockA, blockB, actual_mc, actual_kc, cols, Scalar(-1), -1, -1, 0, 0);
         }
       }
     }
   }
+}
 
 /* Optimized triangular solver with multiple left hand sides and the triangular matrix on the right
  */
 template <typename Scalar, typename Index, int Mode, bool Conjugate, int TriStorageOrder, int OtherInnerStride>
-struct triangular_solve_matrix<Scalar,Index,OnTheRight,Mode,Conjugate,TriStorageOrder,ColMajor,OtherInnerStride>
-{
-  static EIGEN_DONT_INLINE void run(
-    Index size, Index otherSize,
-    const Scalar* _tri, Index triStride,
-    Scalar* _other, Index otherIncr, Index otherStride,
-    level3_blocking<Scalar,Scalar>& blocking);
+struct triangular_solve_matrix<Scalar, Index, OnTheRight, Mode, Conjugate, TriStorageOrder, ColMajor,
+                               OtherInnerStride> {
+  static EIGEN_DONT_INLINE void run(Index size, Index otherSize, const Scalar* _tri, Index triStride, Scalar* _other,
+                                    Index otherIncr, Index otherStride, level3_blocking<Scalar, Scalar>& blocking);
 };
 
 template <typename Scalar, typename Index, int Mode, bool Conjugate, int TriStorageOrder, int OtherInnerStride>
-EIGEN_DONT_INLINE void triangular_solve_matrix<Scalar,Index,OnTheRight,Mode,Conjugate,TriStorageOrder,ColMajor,OtherInnerStride>::run(
-    Index size, Index otherSize,
-    const Scalar* _tri, Index triStride,
-    Scalar* _other, Index otherIncr, Index otherStride,
-    level3_blocking<Scalar,Scalar>& blocking)
-  {
-    Index rows = otherSize;
+EIGEN_DONT_INLINE void triangular_solve_matrix<Scalar, Index, OnTheRight, Mode, Conjugate, TriStorageOrder, ColMajor,
+                                               OtherInnerStride>::run(Index size, Index otherSize, const Scalar* _tri,
+                                                                      Index triStride, Scalar* _other, Index otherIncr,
+                                                                      Index otherStride,
+                                                                      level3_blocking<Scalar, Scalar>& blocking) {
+  Index rows = otherSize;
 
 #if defined(EIGEN_VECTORIZE_AVX512) && EIGEN_USE_AVX512_TRSM_R_KERNELS && EIGEN_ENABLE_AVX512_NOCOPY_TRSM_R_CUTOFFS
-    EIGEN_IF_CONSTEXPR( (OtherInnerStride == 1 &&
-                 (std::is_same<Scalar,float>::value ||
-                  std::is_same<Scalar,double>::value)) ) {
-      // TODO: Investigate better heuristics for cutoffs.
-      std::ptrdiff_t l1, l2, l3;
-      manage_caching_sizes(GetAction, &l1, &l2, &l3);
-      double L2Cap = 0.5; // 50% of L2 size
-      if (size < avx512_trsm_cutoff<Scalar>(l2, rows, L2Cap)) {
-        trsmKernelR<Scalar, Index, Mode, Conjugate, TriStorageOrder, OtherInnerStride, /*Specialized=*/true>::
-          kernel(size, rows, _tri, triStride, _other, 1, otherStride);
-        return;
-      }
-    }
-#endif
-
-    typedef blas_data_mapper<Scalar, Index, ColMajor, Unaligned, OtherInnerStride> LhsMapper;
-    typedef const_blas_data_mapper<Scalar, Index, TriStorageOrder> RhsMapper;
-    LhsMapper lhs(_other, otherStride, otherIncr);
-    RhsMapper rhs(_tri, triStride);
-
-    typedef gebp_traits<Scalar,Scalar> Traits;
-    enum {
-      RhsStorageOrder   = TriStorageOrder,
-      SmallPanelWidth   = plain_enum_max(Traits::mr, Traits::nr),
-      IsLower = (Mode&Lower) == Lower
-    };
-
-    Index kc = blocking.kc();                   // cache block size along the K direction
-    Index mc = (std::min)(rows,blocking.mc());  // cache block size along the M direction
-
-    std::size_t sizeA = kc*mc;
-    std::size_t sizeB = kc*size;
-
-    ei_declare_aligned_stack_constructed_variable(Scalar, blockA, sizeA, blocking.blockA());
-    ei_declare_aligned_stack_constructed_variable(Scalar, blockB, sizeB, blocking.blockB());
-
-    gebp_kernel<Scalar, Scalar, Index, LhsMapper, Traits::mr, Traits::nr, false, Conjugate> gebp_kernel;
-    gemm_pack_rhs<Scalar, Index, RhsMapper, Traits::nr, RhsStorageOrder> pack_rhs;
-    gemm_pack_rhs<Scalar, Index, RhsMapper, Traits::nr, RhsStorageOrder,false,true> pack_rhs_panel;
-    gemm_pack_lhs<Scalar, Index, LhsMapper, Traits::mr, Traits::LhsProgress, typename Traits::LhsPacket4Packing, ColMajor, false, true> pack_lhs_panel;
-
-    for(Index k2=IsLower ? size : 0;
-        IsLower ? k2>0 : k2<size;
-        IsLower ? k2-=kc : k2+=kc)
-    {
-      const Index actual_kc = (std::min)(IsLower ? k2 : size-k2, kc);
-      Index actual_k2 = IsLower ? k2-actual_kc : k2 ;
-
-      Index startPanel = IsLower ? 0 : k2+actual_kc;
-      Index rs = IsLower ? actual_k2 : size - actual_k2 - actual_kc;
-      Scalar* geb = blockB+actual_kc*actual_kc;
-
-      if (rs>0) pack_rhs(geb, rhs.getSubMapper(actual_k2,startPanel), actual_kc, rs);
-
-      // triangular packing (we only pack the panels off the diagonal,
-      // neglecting the blocks overlapping the diagonal
-      {
-        for (Index j2=0; j2<actual_kc; j2+=SmallPanelWidth)
-        {
-          Index actualPanelWidth = std::min<Index>(actual_kc-j2, SmallPanelWidth);
-          Index actual_j2 = actual_k2 + j2;
-          Index panelOffset = IsLower ? j2+actualPanelWidth : 0;
-          Index panelLength = IsLower ? actual_kc-j2-actualPanelWidth : j2;
-
-          if (panelLength>0)
-          pack_rhs_panel(blockB+j2*actual_kc,
-                         rhs.getSubMapper(actual_k2+panelOffset, actual_j2),
-                         panelLength, actualPanelWidth,
-                         actual_kc, panelOffset);
-        }
-      }
-
-      for(Index i2=0; i2<rows; i2+=mc)
-      {
-        const Index actual_mc = (std::min)(mc,rows-i2);
-
-        // triangular solver kernel
-        {
-          // for each small block of the diagonal (=> vertical panels of rhs)
-          for (Index j2 = IsLower
-                      ? (actual_kc - ((actual_kc%SmallPanelWidth) ? Index(actual_kc%SmallPanelWidth)
-                                                                  : Index(SmallPanelWidth)))
-                      : 0;
-               IsLower ? j2>=0 : j2<actual_kc;
-               IsLower ? j2-=SmallPanelWidth : j2+=SmallPanelWidth)
-          {
-            Index actualPanelWidth = std::min<Index>(actual_kc-j2, SmallPanelWidth);
-            Index absolute_j2 = actual_k2 + j2;
-            Index panelOffset = IsLower ? j2+actualPanelWidth : 0;
-            Index panelLength = IsLower ? actual_kc - j2 - actualPanelWidth : j2;
-
-            // GEBP
-            if(panelLength>0)
-            {
-              gebp_kernel(lhs.getSubMapper(i2,absolute_j2),
-                          blockA, blockB+j2*actual_kc,
-                          actual_mc, panelLength, actualPanelWidth,
-                          Scalar(-1),
-                          actual_kc, actual_kc, // strides
-                          panelOffset, panelOffset); // offsets
-            }
-
-            {
-              // unblocked triangular solve
-              trsmKernelR<Scalar, Index, Mode, Conjugate, TriStorageOrder, OtherInnerStride, /*Specialized=*/true>::
-                kernel(actualPanelWidth, actual_mc,
-                            _tri + absolute_j2 + absolute_j2*triStride, triStride,
-                            _other + i2*OtherInnerStride + absolute_j2*otherStride, otherIncr, otherStride);
-            }
-            // pack the just computed part of lhs to A
-            pack_lhs_panel(blockA, lhs.getSubMapper(i2,absolute_j2),
-                           actualPanelWidth, actual_mc,
-                           actual_kc, j2);
-          }
-        }
-
-        if (rs>0)
-          gebp_kernel(lhs.getSubMapper(i2, startPanel), blockA, geb,
-                      actual_mc, actual_kc, rs, Scalar(-1),
-                      -1, -1, 0, 0);
-      }
+  EIGEN_IF_CONSTEXPR(
+      (OtherInnerStride == 1 && (std::is_same<Scalar, float>::value || std::is_same<Scalar, double>::value))) {
+    // TODO: Investigate better heuristics for cutoffs.
+    std::ptrdiff_t l1, l2, l3;
+    manage_caching_sizes(GetAction, &l1, &l2, &l3);
+    double L2Cap = 0.5;  // 50% of L2 size
+    if (size < avx512_trsm_cutoff<Scalar>(l2, rows, L2Cap)) {
+      trsmKernelR<Scalar, Index, Mode, Conjugate, TriStorageOrder, OtherInnerStride, /*Specialized=*/true>::kernel(
+          size, rows, _tri, triStride, _other, 1, otherStride);
+      return;
     }
   }
-} // end namespace internal
+#endif
 
-} // end namespace Eigen
+  typedef blas_data_mapper<Scalar, Index, ColMajor, Unaligned, OtherInnerStride> LhsMapper;
+  typedef const_blas_data_mapper<Scalar, Index, TriStorageOrder> RhsMapper;
+  LhsMapper lhs(_other, otherStride, otherIncr);
+  RhsMapper rhs(_tri, triStride);
 
-#endif // EIGEN_TRIANGULAR_SOLVER_MATRIX_H
+  typedef gebp_traits<Scalar, Scalar> Traits;
+  enum {
+    RhsStorageOrder = TriStorageOrder,
+    SmallPanelWidth = plain_enum_max(Traits::mr, Traits::nr),
+    IsLower = (Mode & Lower) == Lower
+  };
+
+  Index kc = blocking.kc();                    // cache block size along the K direction
+  Index mc = (std::min)(rows, blocking.mc());  // cache block size along the M direction
+
+  std::size_t sizeA = kc * mc;
+  std::size_t sizeB = kc * size;
+
+  ei_declare_aligned_stack_constructed_variable(Scalar, blockA, sizeA, blocking.blockA());
+  ei_declare_aligned_stack_constructed_variable(Scalar, blockB, sizeB, blocking.blockB());
+
+  gebp_kernel<Scalar, Scalar, Index, LhsMapper, Traits::mr, Traits::nr, false, Conjugate> gebp_kernel;
+  gemm_pack_rhs<Scalar, Index, RhsMapper, Traits::nr, RhsStorageOrder> pack_rhs;
+  gemm_pack_rhs<Scalar, Index, RhsMapper, Traits::nr, RhsStorageOrder, false, true> pack_rhs_panel;
+  gemm_pack_lhs<Scalar, Index, LhsMapper, Traits::mr, Traits::LhsProgress, typename Traits::LhsPacket4Packing, ColMajor,
+                false, true>
+      pack_lhs_panel;
+
+  for (Index k2 = IsLower ? size : 0; IsLower ? k2 > 0 : k2 < size; IsLower ? k2 -= kc : k2 += kc) {
+    const Index actual_kc = (std::min)(IsLower ? k2 : size - k2, kc);
+    Index actual_k2 = IsLower ? k2 - actual_kc : k2;
+
+    Index startPanel = IsLower ? 0 : k2 + actual_kc;
+    Index rs = IsLower ? actual_k2 : size - actual_k2 - actual_kc;
+    Scalar* geb = blockB + actual_kc * actual_kc;
+
+    if (rs > 0) pack_rhs(geb, rhs.getSubMapper(actual_k2, startPanel), actual_kc, rs);
+
+    // triangular packing (we only pack the panels off the diagonal,
+    // neglecting the blocks overlapping the diagonal
+    {
+      for (Index j2 = 0; j2 < actual_kc; j2 += SmallPanelWidth) {
+        Index actualPanelWidth = std::min<Index>(actual_kc - j2, SmallPanelWidth);
+        Index actual_j2 = actual_k2 + j2;
+        Index panelOffset = IsLower ? j2 + actualPanelWidth : 0;
+        Index panelLength = IsLower ? actual_kc - j2 - actualPanelWidth : j2;
+
+        if (panelLength > 0)
+          pack_rhs_panel(blockB + j2 * actual_kc, rhs.getSubMapper(actual_k2 + panelOffset, actual_j2), panelLength,
+                         actualPanelWidth, actual_kc, panelOffset);
+      }
+    }
+
+    for (Index i2 = 0; i2 < rows; i2 += mc) {
+      const Index actual_mc = (std::min)(mc, rows - i2);
+
+      // triangular solver kernel
+      {
+        // for each small block of the diagonal (=> vertical panels of rhs)
+        for (Index j2 = IsLower ? (actual_kc - ((actual_kc % SmallPanelWidth) ? Index(actual_kc % SmallPanelWidth)
+                                                                              : Index(SmallPanelWidth)))
+                                : 0;
+             IsLower ? j2 >= 0 : j2 < actual_kc; IsLower ? j2 -= SmallPanelWidth : j2 += SmallPanelWidth) {
+          Index actualPanelWidth = std::min<Index>(actual_kc - j2, SmallPanelWidth);
+          Index absolute_j2 = actual_k2 + j2;
+          Index panelOffset = IsLower ? j2 + actualPanelWidth : 0;
+          Index panelLength = IsLower ? actual_kc - j2 - actualPanelWidth : j2;
+
+          // GEBP
+          if (panelLength > 0) {
+            gebp_kernel(lhs.getSubMapper(i2, absolute_j2), blockA, blockB + j2 * actual_kc, actual_mc, panelLength,
+                        actualPanelWidth, Scalar(-1), actual_kc, actual_kc,  // strides
+                        panelOffset, panelOffset);                           // offsets
+          }
+
+          {
+            // unblocked triangular solve
+            trsmKernelR<Scalar, Index, Mode, Conjugate, TriStorageOrder, OtherInnerStride,
+                        /*Specialized=*/true>::kernel(actualPanelWidth, actual_mc,
+                                                      _tri + absolute_j2 + absolute_j2 * triStride, triStride,
+                                                      _other + i2 * OtherInnerStride + absolute_j2 * otherStride,
+                                                      otherIncr, otherStride);
+          }
+          // pack the just computed part of lhs to A
+          pack_lhs_panel(blockA, lhs.getSubMapper(i2, absolute_j2), actualPanelWidth, actual_mc, actual_kc, j2);
+        }
+      }
+
+      if (rs > 0)
+        gebp_kernel(lhs.getSubMapper(i2, startPanel), blockA, geb, actual_mc, actual_kc, rs, Scalar(-1), -1, -1, 0, 0);
+    }
+  }
+}
+}  // end namespace internal
+
+}  // end namespace Eigen
+
+#endif  // EIGEN_TRIANGULAR_SOLVER_MATRIX_H
diff --git a/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h b/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h
index 10413db..ce8fcb9 100644
--- a/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h
+++ b/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h
@@ -41,130 +41,124 @@
 namespace internal {
 
 // implements LeftSide op(triangular)^-1 * general
-#define EIGEN_BLAS_TRSM_L(EIGTYPE, BLASTYPE, BLASFUNC) \
-template <typename Index, int Mode, bool Conjugate, int TriStorageOrder> \
-struct triangular_solve_matrix<EIGTYPE,Index,OnTheLeft,Mode,Conjugate,TriStorageOrder,ColMajor,1> \
-{ \
-  enum { \
-    IsLower = (Mode&Lower) == Lower, \
-    IsUnitDiag  = (Mode&UnitDiag) ? 1 : 0, \
-    IsZeroDiag  = (Mode&ZeroDiag) ? 1 : 0, \
-    conjA = ((TriStorageOrder==ColMajor) && Conjugate) ? 1 : 0 \
-  }; \
-  static void run( \
-      Index size, Index otherSize, \
-      const EIGTYPE* _tri, Index triStride, \
-      EIGTYPE* _other, Index otherIncr, Index otherStride, level3_blocking<EIGTYPE,EIGTYPE>& /*blocking*/) \
-  { \
-   EIGEN_ONLY_USED_FOR_DEBUG(otherIncr); \
-   eigen_assert(otherIncr == 1); \
-   BlasIndex m = convert_index<BlasIndex>(size), n = convert_index<BlasIndex>(otherSize), lda, ldb; \
-   char side = 'L', uplo, diag='N', transa; \
-   /* Set alpha_ */ \
-   EIGTYPE alpha(1); \
-   ldb = convert_index<BlasIndex>(otherStride);\
-\
-   const EIGTYPE *a; \
-/* Set trans */ \
-   transa = (TriStorageOrder==RowMajor) ? ((Conjugate) ? 'C' : 'T') : 'N'; \
-/* Set uplo */ \
-   uplo = IsLower ? 'L' : 'U'; \
-   if (TriStorageOrder==RowMajor) uplo = (uplo == 'L') ? 'U' : 'L'; \
-/* Set a, lda */ \
-   typedef Matrix<EIGTYPE, Dynamic, Dynamic, TriStorageOrder> MatrixTri; \
-   Map<const MatrixTri, 0, OuterStride<> > tri(_tri,size,size,OuterStride<>(triStride)); \
-   MatrixTri a_tmp; \
-\
-   if (conjA) { \
-     a_tmp = tri.conjugate(); \
-     a = a_tmp.data(); \
-     lda = convert_index<BlasIndex>(a_tmp.outerStride()); \
-   } else { \
-     a = _tri; \
-     lda = convert_index<BlasIndex>(triStride); \
-   } \
-   if (IsUnitDiag) diag='U'; \
-/* call ?trsm*/ \
-   BLASFUNC(&side, &uplo, &transa, &diag, &m, &n, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (BLASTYPE*)_other, &ldb); \
- } \
-};
+#define EIGEN_BLAS_TRSM_L(EIGTYPE, BLASTYPE, BLASFUNC)                                                              \
+  template <typename Index, int Mode, bool Conjugate, int TriStorageOrder>                                          \
+  struct triangular_solve_matrix<EIGTYPE, Index, OnTheLeft, Mode, Conjugate, TriStorageOrder, ColMajor, 1> {        \
+    enum {                                                                                                          \
+      IsLower = (Mode & Lower) == Lower,                                                                            \
+      IsUnitDiag = (Mode & UnitDiag) ? 1 : 0,                                                                       \
+      IsZeroDiag = (Mode & ZeroDiag) ? 1 : 0,                                                                       \
+      conjA = ((TriStorageOrder == ColMajor) && Conjugate) ? 1 : 0                                                  \
+    };                                                                                                              \
+    static void run(Index size, Index otherSize, const EIGTYPE* _tri, Index triStride, EIGTYPE* _other,             \
+                    Index otherIncr, Index otherStride, level3_blocking<EIGTYPE, EIGTYPE>& /*blocking*/) {          \
+      EIGEN_ONLY_USED_FOR_DEBUG(otherIncr);                                                                         \
+      eigen_assert(otherIncr == 1);                                                                                 \
+      BlasIndex m = convert_index<BlasIndex>(size), n = convert_index<BlasIndex>(otherSize), lda, ldb;              \
+      char side = 'L', uplo, diag = 'N', transa;                                                                    \
+      /* Set alpha_ */                                                                                              \
+      EIGTYPE alpha(1);                                                                                             \
+      ldb = convert_index<BlasIndex>(otherStride);                                                                  \
+                                                                                                                    \
+      const EIGTYPE* a;                                                                                             \
+      /* Set trans */                                                                                               \
+      transa = (TriStorageOrder == RowMajor) ? ((Conjugate) ? 'C' : 'T') : 'N';                                     \
+      /* Set uplo */                                                                                                \
+      uplo = IsLower ? 'L' : 'U';                                                                                   \
+      if (TriStorageOrder == RowMajor) uplo = (uplo == 'L') ? 'U' : 'L';                                            \
+      /* Set a, lda */                                                                                              \
+      typedef Matrix<EIGTYPE, Dynamic, Dynamic, TriStorageOrder> MatrixTri;                                         \
+      Map<const MatrixTri, 0, OuterStride<> > tri(_tri, size, size, OuterStride<>(triStride));                      \
+      MatrixTri a_tmp;                                                                                              \
+                                                                                                                    \
+      if (conjA) {                                                                                                  \
+        a_tmp = tri.conjugate();                                                                                    \
+        a = a_tmp.data();                                                                                           \
+        lda = convert_index<BlasIndex>(a_tmp.outerStride());                                                        \
+      } else {                                                                                                      \
+        a = _tri;                                                                                                   \
+        lda = convert_index<BlasIndex>(triStride);                                                                  \
+      }                                                                                                             \
+      if (IsUnitDiag) diag = 'U';                                                                                   \
+      /* call ?trsm*/                                                                                               \
+      BLASFUNC(&side, &uplo, &transa, &diag, &m, &n, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)a, \
+               &lda, (BLASTYPE*)_other, &ldb);                                                                      \
+    }                                                                                                               \
+  };
 
 #ifdef EIGEN_USE_MKL
-EIGEN_BLAS_TRSM_L(double,   double, dtrsm)
+EIGEN_BLAS_TRSM_L(double, double, dtrsm)
 EIGEN_BLAS_TRSM_L(dcomplex, MKL_Complex16, ztrsm)
-EIGEN_BLAS_TRSM_L(float,    float,  strsm)
+EIGEN_BLAS_TRSM_L(float, float, strsm)
 EIGEN_BLAS_TRSM_L(scomplex, MKL_Complex8, ctrsm)
 #else
-EIGEN_BLAS_TRSM_L(double,   double, dtrsm_)
+EIGEN_BLAS_TRSM_L(double, double, dtrsm_)
 EIGEN_BLAS_TRSM_L(dcomplex, double, ztrsm_)
-EIGEN_BLAS_TRSM_L(float,    float,  strsm_)
-EIGEN_BLAS_TRSM_L(scomplex, float,  ctrsm_)
+EIGEN_BLAS_TRSM_L(float, float, strsm_)
+EIGEN_BLAS_TRSM_L(scomplex, float, ctrsm_)
 #endif
 
 // implements RightSide general * op(triangular)^-1
-#define EIGEN_BLAS_TRSM_R(EIGTYPE, BLASTYPE, BLASFUNC) \
-template <typename Index, int Mode, bool Conjugate, int TriStorageOrder> \
-struct triangular_solve_matrix<EIGTYPE,Index,OnTheRight,Mode,Conjugate,TriStorageOrder,ColMajor,1> \
-{ \
-  enum { \
-    IsLower = (Mode&Lower) == Lower, \
-    IsUnitDiag  = (Mode&UnitDiag) ? 1 : 0, \
-    IsZeroDiag  = (Mode&ZeroDiag) ? 1 : 0, \
-    conjA = ((TriStorageOrder==ColMajor) && Conjugate) ? 1 : 0 \
-  }; \
-  static void run( \
-      Index size, Index otherSize, \
-      const EIGTYPE* _tri, Index triStride, \
-      EIGTYPE* _other, Index otherIncr, Index otherStride, level3_blocking<EIGTYPE,EIGTYPE>& /*blocking*/) \
-  { \
-   EIGEN_ONLY_USED_FOR_DEBUG(otherIncr); \
-   eigen_assert(otherIncr == 1); \
-   BlasIndex m = convert_index<BlasIndex>(otherSize), n = convert_index<BlasIndex>(size), lda, ldb; \
-   char side = 'R', uplo, diag='N', transa; \
-   /* Set alpha_ */ \
-   EIGTYPE alpha(1); \
-   ldb = convert_index<BlasIndex>(otherStride);\
-\
-   const EIGTYPE *a; \
-/* Set trans */ \
-   transa = (TriStorageOrder==RowMajor) ? ((Conjugate) ? 'C' : 'T') : 'N'; \
-/* Set uplo */ \
-   uplo = IsLower ? 'L' : 'U'; \
-   if (TriStorageOrder==RowMajor) uplo = (uplo == 'L') ? 'U' : 'L'; \
-/* Set a, lda */ \
-   typedef Matrix<EIGTYPE, Dynamic, Dynamic, TriStorageOrder> MatrixTri; \
-   Map<const MatrixTri, 0, OuterStride<> > tri(_tri,size,size,OuterStride<>(triStride)); \
-   MatrixTri a_tmp; \
-\
-   if (conjA) { \
-     a_tmp = tri.conjugate(); \
-     a = a_tmp.data(); \
-     lda = convert_index<BlasIndex>(a_tmp.outerStride()); \
-   } else { \
-     a = _tri; \
-     lda = convert_index<BlasIndex>(triStride); \
-   } \
-   if (IsUnitDiag) diag='U'; \
-/* call ?trsm*/ \
-   BLASFUNC(&side, &uplo, &transa, &diag, &m, &n, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (BLASTYPE*)_other, &ldb); \
-   /*std::cout << "TRMS_L specialization!\n";*/ \
- } \
-};
+#define EIGEN_BLAS_TRSM_R(EIGTYPE, BLASTYPE, BLASFUNC)                                                              \
+  template <typename Index, int Mode, bool Conjugate, int TriStorageOrder>                                          \
+  struct triangular_solve_matrix<EIGTYPE, Index, OnTheRight, Mode, Conjugate, TriStorageOrder, ColMajor, 1> {       \
+    enum {                                                                                                          \
+      IsLower = (Mode & Lower) == Lower,                                                                            \
+      IsUnitDiag = (Mode & UnitDiag) ? 1 : 0,                                                                       \
+      IsZeroDiag = (Mode & ZeroDiag) ? 1 : 0,                                                                       \
+      conjA = ((TriStorageOrder == ColMajor) && Conjugate) ? 1 : 0                                                  \
+    };                                                                                                              \
+    static void run(Index size, Index otherSize, const EIGTYPE* _tri, Index triStride, EIGTYPE* _other,             \
+                    Index otherIncr, Index otherStride, level3_blocking<EIGTYPE, EIGTYPE>& /*blocking*/) {          \
+      EIGEN_ONLY_USED_FOR_DEBUG(otherIncr);                                                                         \
+      eigen_assert(otherIncr == 1);                                                                                 \
+      BlasIndex m = convert_index<BlasIndex>(otherSize), n = convert_index<BlasIndex>(size), lda, ldb;              \
+      char side = 'R', uplo, diag = 'N', transa;                                                                    \
+      /* Set alpha_ */                                                                                              \
+      EIGTYPE alpha(1);                                                                                             \
+      ldb = convert_index<BlasIndex>(otherStride);                                                                  \
+                                                                                                                    \
+      const EIGTYPE* a;                                                                                             \
+      /* Set trans */                                                                                               \
+      transa = (TriStorageOrder == RowMajor) ? ((Conjugate) ? 'C' : 'T') : 'N';                                     \
+      /* Set uplo */                                                                                                \
+      uplo = IsLower ? 'L' : 'U';                                                                                   \
+      if (TriStorageOrder == RowMajor) uplo = (uplo == 'L') ? 'U' : 'L';                                            \
+      /* Set a, lda */                                                                                              \
+      typedef Matrix<EIGTYPE, Dynamic, Dynamic, TriStorageOrder> MatrixTri;                                         \
+      Map<const MatrixTri, 0, OuterStride<> > tri(_tri, size, size, OuterStride<>(triStride));                      \
+      MatrixTri a_tmp;                                                                                              \
+                                                                                                                    \
+      if (conjA) {                                                                                                  \
+        a_tmp = tri.conjugate();                                                                                    \
+        a = a_tmp.data();                                                                                           \
+        lda = convert_index<BlasIndex>(a_tmp.outerStride());                                                        \
+      } else {                                                                                                      \
+        a = _tri;                                                                                                   \
+        lda = convert_index<BlasIndex>(triStride);                                                                  \
+      }                                                                                                             \
+      if (IsUnitDiag) diag = 'U';                                                                                   \
+      /* call ?trsm*/                                                                                               \
+      BLASFUNC(&side, &uplo, &transa, &diag, &m, &n, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)a, \
+               &lda, (BLASTYPE*)_other, &ldb);                                                                      \
+      /*std::cout << "TRMS_L specialization!\n";*/                                                                  \
+    }                                                                                                               \
+  };
 
 #ifdef EIGEN_USE_MKL
-EIGEN_BLAS_TRSM_R(double,   double, dtrsm)
+EIGEN_BLAS_TRSM_R(double, double, dtrsm)
 EIGEN_BLAS_TRSM_R(dcomplex, MKL_Complex16, ztrsm)
-EIGEN_BLAS_TRSM_R(float,    float,  strsm)
-EIGEN_BLAS_TRSM_R(scomplex, MKL_Complex8,  ctrsm)
+EIGEN_BLAS_TRSM_R(float, float, strsm)
+EIGEN_BLAS_TRSM_R(scomplex, MKL_Complex8, ctrsm)
 #else
-EIGEN_BLAS_TRSM_R(double,   double, dtrsm_)
+EIGEN_BLAS_TRSM_R(double, double, dtrsm_)
 EIGEN_BLAS_TRSM_R(dcomplex, double, ztrsm_)
-EIGEN_BLAS_TRSM_R(float,    float,  strsm_)
-EIGEN_BLAS_TRSM_R(scomplex, float,  ctrsm_)
+EIGEN_BLAS_TRSM_R(float, float, strsm_)
+EIGEN_BLAS_TRSM_R(scomplex, float, ctrsm_)
 #endif
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_TRIANGULAR_SOLVER_MATRIX_BLAS_H
+#endif  // EIGEN_TRIANGULAR_SOLVER_MATRIX_BLAS_H
diff --git a/Eigen/src/Core/products/TriangularSolverVector.h b/Eigen/src/Core/products/TriangularSolverVector.h
index f158a42..ff7c43f 100644
--- a/Eigen/src/Core/products/TriangularSolverVector.h
+++ b/Eigen/src/Core/products/TriangularSolverVector.h
@@ -17,134 +17,106 @@
 
 namespace internal {
 
-template<typename LhsScalar, typename RhsScalar, typename Index, int Mode, bool Conjugate, int StorageOrder>
-struct triangular_solve_vector<LhsScalar, RhsScalar, Index, OnTheRight, Mode, Conjugate, StorageOrder>
-{
-  static void run(Index size, const LhsScalar* _lhs, Index lhsStride, RhsScalar* rhs)
-  {
-    triangular_solve_vector<LhsScalar,RhsScalar,Index,OnTheLeft,
-        ((Mode&Upper)==Upper ? Lower : Upper) | (Mode&UnitDiag),
-        Conjugate,StorageOrder==RowMajor?ColMajor:RowMajor
-      >::run(size, _lhs, lhsStride, rhs);
+template <typename LhsScalar, typename RhsScalar, typename Index, int Mode, bool Conjugate, int StorageOrder>
+struct triangular_solve_vector<LhsScalar, RhsScalar, Index, OnTheRight, Mode, Conjugate, StorageOrder> {
+  static void run(Index size, const LhsScalar* _lhs, Index lhsStride, RhsScalar* rhs) {
+    triangular_solve_vector<LhsScalar, RhsScalar, Index, OnTheLeft,
+                            ((Mode & Upper) == Upper ? Lower : Upper) | (Mode & UnitDiag), Conjugate,
+                            StorageOrder == RowMajor ? ColMajor : RowMajor>::run(size, _lhs, lhsStride, rhs);
   }
 };
 
 // forward and backward substitution, row-major, rhs is a vector
-template<typename LhsScalar, typename RhsScalar, typename Index, int Mode, bool Conjugate>
-struct triangular_solve_vector<LhsScalar, RhsScalar, Index, OnTheLeft, Mode, Conjugate, RowMajor>
-{
-  enum {
-    IsLower = ((Mode&Lower)==Lower)
-  };
-  static void run(Index size, const LhsScalar* _lhs, Index lhsStride, RhsScalar* rhs)
-  {
-    typedef Map<const Matrix<LhsScalar,Dynamic,Dynamic,RowMajor>, 0, OuterStride<> > LhsMap;
-    const LhsMap lhs(_lhs,size,size,OuterStride<>(lhsStride));
+template <typename LhsScalar, typename RhsScalar, typename Index, int Mode, bool Conjugate>
+struct triangular_solve_vector<LhsScalar, RhsScalar, Index, OnTheLeft, Mode, Conjugate, RowMajor> {
+  enum { IsLower = ((Mode & Lower) == Lower) };
+  static void run(Index size, const LhsScalar* _lhs, Index lhsStride, RhsScalar* rhs) {
+    typedef Map<const Matrix<LhsScalar, Dynamic, Dynamic, RowMajor>, 0, OuterStride<> > LhsMap;
+    const LhsMap lhs(_lhs, size, size, OuterStride<>(lhsStride));
 
-    typedef const_blas_data_mapper<LhsScalar,Index,RowMajor> LhsMapper;
-    typedef const_blas_data_mapper<RhsScalar,Index,ColMajor> RhsMapper;
+    typedef const_blas_data_mapper<LhsScalar, Index, RowMajor> LhsMapper;
+    typedef const_blas_data_mapper<RhsScalar, Index, ColMajor> RhsMapper;
 
-    std::conditional_t<
-                  Conjugate,
-                  const CwiseUnaryOp<typename internal::scalar_conjugate_op<LhsScalar>,LhsMap>,
-                  const LhsMap&> cjLhs(lhs);
+    std::conditional_t<Conjugate, const CwiseUnaryOp<typename internal::scalar_conjugate_op<LhsScalar>, LhsMap>,
+                       const LhsMap&>
+        cjLhs(lhs);
     static const Index PanelWidth = EIGEN_TUNE_TRIANGULAR_PANEL_WIDTH;
-    for(Index pi=IsLower ? 0 : size;
-        IsLower ? pi<size : pi>0;
-        IsLower ? pi+=PanelWidth : pi-=PanelWidth)
-    {
+    for (Index pi = IsLower ? 0 : size; IsLower ? pi < size : pi > 0; IsLower ? pi += PanelWidth : pi -= PanelWidth) {
       Index actualPanelWidth = (std::min)(IsLower ? size - pi : pi, PanelWidth);
 
-      Index r = IsLower ? pi : size - pi; // remaining size
-      if (r > 0)
-      {
+      Index r = IsLower ? pi : size - pi;  // remaining size
+      if (r > 0) {
         // let's directly call the low level product function because:
         // 1 - it is faster to compile
         // 2 - it is slightly faster at runtime
-        Index startRow = IsLower ? pi : pi-actualPanelWidth;
+        Index startRow = IsLower ? pi : pi - actualPanelWidth;
         Index startCol = IsLower ? 0 : pi;
 
-        general_matrix_vector_product<Index,LhsScalar,LhsMapper,RowMajor,Conjugate,RhsScalar,RhsMapper,false>::run(
-          actualPanelWidth, r,
-          LhsMapper(&lhs.coeffRef(startRow,startCol), lhsStride),
-          RhsMapper(rhs + startCol, 1),
-          rhs + startRow, 1,
-          RhsScalar(-1));
+        general_matrix_vector_product<Index, LhsScalar, LhsMapper, RowMajor, Conjugate, RhsScalar, RhsMapper,
+                                      false>::run(actualPanelWidth, r,
+                                                  LhsMapper(&lhs.coeffRef(startRow, startCol), lhsStride),
+                                                  RhsMapper(rhs + startCol, 1), rhs + startRow, 1, RhsScalar(-1));
       }
 
-      for(Index k=0; k<actualPanelWidth; ++k)
-      {
-        Index i = IsLower ? pi+k : pi-k-1;
-        Index s = IsLower ? pi   : i+1;
-        if (k>0)
-          rhs[i] -= (cjLhs.row(i).segment(s,k).transpose().cwiseProduct(Map<const Matrix<RhsScalar,Dynamic,1> >(rhs+s,k))).sum();
+      for (Index k = 0; k < actualPanelWidth; ++k) {
+        Index i = IsLower ? pi + k : pi - k - 1;
+        Index s = IsLower ? pi : i + 1;
+        if (k > 0)
+          rhs[i] -= (cjLhs.row(i).segment(s, k).transpose().cwiseProduct(
+                         Map<const Matrix<RhsScalar, Dynamic, 1> >(rhs + s, k)))
+                        .sum();
 
-        if((!(Mode & UnitDiag)) && !is_identically_zero(rhs[i]))
-          rhs[i] /= cjLhs(i,i);
+        if ((!(Mode & UnitDiag)) && !is_identically_zero(rhs[i])) rhs[i] /= cjLhs(i, i);
       }
     }
   }
 };
 
 // forward and backward substitution, column-major, rhs is a vector
-template<typename LhsScalar, typename RhsScalar, typename Index, int Mode, bool Conjugate>
-struct triangular_solve_vector<LhsScalar, RhsScalar, Index, OnTheLeft, Mode, Conjugate, ColMajor>
-{
-  enum {
-    IsLower = ((Mode&Lower)==Lower)
-  };
-  static void run(Index size, const LhsScalar* _lhs, Index lhsStride, RhsScalar* rhs)
-  {
-    typedef Map<const Matrix<LhsScalar,Dynamic,Dynamic,ColMajor>, 0, OuterStride<> > LhsMap;
-    const LhsMap lhs(_lhs,size,size,OuterStride<>(lhsStride));
-    typedef const_blas_data_mapper<LhsScalar,Index,ColMajor> LhsMapper;
-    typedef const_blas_data_mapper<RhsScalar,Index,ColMajor> RhsMapper;
-    std::conditional_t<Conjugate,
-                            const CwiseUnaryOp<typename internal::scalar_conjugate_op<LhsScalar>,LhsMap>,
-                            const LhsMap&
-                           > cjLhs(lhs);
+template <typename LhsScalar, typename RhsScalar, typename Index, int Mode, bool Conjugate>
+struct triangular_solve_vector<LhsScalar, RhsScalar, Index, OnTheLeft, Mode, Conjugate, ColMajor> {
+  enum { IsLower = ((Mode & Lower) == Lower) };
+  static void run(Index size, const LhsScalar* _lhs, Index lhsStride, RhsScalar* rhs) {
+    typedef Map<const Matrix<LhsScalar, Dynamic, Dynamic, ColMajor>, 0, OuterStride<> > LhsMap;
+    const LhsMap lhs(_lhs, size, size, OuterStride<>(lhsStride));
+    typedef const_blas_data_mapper<LhsScalar, Index, ColMajor> LhsMapper;
+    typedef const_blas_data_mapper<RhsScalar, Index, ColMajor> RhsMapper;
+    std::conditional_t<Conjugate, const CwiseUnaryOp<typename internal::scalar_conjugate_op<LhsScalar>, LhsMap>,
+                       const LhsMap&>
+        cjLhs(lhs);
     static const Index PanelWidth = EIGEN_TUNE_TRIANGULAR_PANEL_WIDTH;
 
-    for(Index pi=IsLower ? 0 : size;
-        IsLower ? pi<size : pi>0;
-        IsLower ? pi+=PanelWidth : pi-=PanelWidth)
-    {
+    for (Index pi = IsLower ? 0 : size; IsLower ? pi < size : pi > 0; IsLower ? pi += PanelWidth : pi -= PanelWidth) {
       Index actualPanelWidth = (std::min)(IsLower ? size - pi : pi, PanelWidth);
-      Index startBlock = IsLower ? pi : pi-actualPanelWidth;
+      Index startBlock = IsLower ? pi : pi - actualPanelWidth;
       Index endBlock = IsLower ? pi + actualPanelWidth : 0;
 
-      for(Index k=0; k<actualPanelWidth; ++k)
-      {
-        Index i = IsLower ? pi+k : pi-k-1;
-        if(!is_identically_zero(rhs[i]))
-        {
-          if(!(Mode & UnitDiag))
-            rhs[i] /= cjLhs.coeff(i,i);
+      for (Index k = 0; k < actualPanelWidth; ++k) {
+        Index i = IsLower ? pi + k : pi - k - 1;
+        if (!is_identically_zero(rhs[i])) {
+          if (!(Mode & UnitDiag)) rhs[i] /= cjLhs.coeff(i, i);
 
-          Index r = actualPanelWidth - k - 1; // remaining size
-          Index s = IsLower ? i+1 : i-r;
-          if (r>0)
-            Map<Matrix<RhsScalar,Dynamic,1> >(rhs+s,r) -= rhs[i] * cjLhs.col(i).segment(s,r);
+          Index r = actualPanelWidth - k - 1;  // remaining size
+          Index s = IsLower ? i + 1 : i - r;
+          if (r > 0) Map<Matrix<RhsScalar, Dynamic, 1> >(rhs + s, r) -= rhs[i] * cjLhs.col(i).segment(s, r);
         }
       }
-      Index r = IsLower ? size - endBlock : startBlock; // remaining size
-      if (r > 0)
-      {
+      Index r = IsLower ? size - endBlock : startBlock;  // remaining size
+      if (r > 0) {
         // let's directly call the low level product function because:
         // 1 - it is faster to compile
         // 2 - it is slightly faster at runtime
-        general_matrix_vector_product<Index,LhsScalar,LhsMapper,ColMajor,Conjugate,RhsScalar,RhsMapper,false>::run(
-            r, actualPanelWidth,
-            LhsMapper(&lhs.coeffRef(endBlock,startBlock), lhsStride),
-            RhsMapper(rhs+startBlock, 1),
-            rhs+endBlock, 1, RhsScalar(-1));
+        general_matrix_vector_product<Index, LhsScalar, LhsMapper, ColMajor, Conjugate, RhsScalar, RhsMapper,
+                                      false>::run(r, actualPanelWidth,
+                                                  LhsMapper(&lhs.coeffRef(endBlock, startBlock), lhsStride),
+                                                  RhsMapper(rhs + startBlock, 1), rhs + endBlock, 1, RhsScalar(-1));
       }
     }
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_TRIANGULAR_SOLVER_VECTOR_H
+#endif  // EIGEN_TRIANGULAR_SOLVER_VECTOR_H
diff --git a/Eigen/src/Core/util/Assert.h b/Eigen/src/Core/util/Assert.h
index f8ba632..09a411a 100644
--- a/Eigen/src/Core/util/Assert.h
+++ b/Eigen/src/Core/util/Assert.h
@@ -33,7 +33,7 @@
 
 #ifndef EIGEN_USE_CUSTOM_PLAIN_ASSERT
 // Disable new custom asserts by default for now.
-#define EIGEN_USE_CUSTOM_PLAIN_ASSERT  0
+#define EIGEN_USE_CUSTOM_PLAIN_ASSERT 0
 #endif
 
 #if EIGEN_USE_CUSTOM_PLAIN_ASSERT
@@ -41,11 +41,11 @@
 #ifndef EIGEN_HAS_BUILTIN_FILE
 // Clang can check if __builtin_FILE() is supported.
 // GCC > 5, MSVC 2019 14.26 (1926) all have __builtin_FILE().
-// 
+//
 // For NVCC, it's more complicated.  Through trial-and-error:
 //   - nvcc+gcc supports __builtin_FILE() on host, and on device after CUDA 11.
 //   - nvcc+msvc supports __builtin_FILE() only after CUDA 11.
-#if (EIGEN_HAS_BUILTIN(__builtin_FILE) && (EIGEN_COMP_CLANG || !defined(EIGEN_CUDA_ARCH))) || \
+#if (EIGEN_HAS_BUILTIN(__builtin_FILE) && (EIGEN_COMP_CLANG || !defined(EIGEN_CUDA_ARCH))) ||            \
     (EIGEN_GNUC_STRICT_AT_LEAST(5, 0, 0) && (EIGEN_COMP_NVCC >= 110000 || !defined(EIGEN_CUDA_ARCH))) || \
     (EIGEN_COMP_MSVC >= 1926 && (!EIGEN_COMP_NVCC || EIGEN_COMP_NVCC >= 110000))
 #define EIGEN_HAS_BUILTIN_FILE 1
@@ -55,12 +55,12 @@
 #endif  // EIGEN_HAS_BUILTIN_FILE
 
 #if EIGEN_HAS_BUILTIN_FILE
-#  define EIGEN_BUILTIN_FILE __builtin_FILE()
-#  define EIGEN_BUILTIN_LINE __builtin_LINE()
+#define EIGEN_BUILTIN_FILE __builtin_FILE()
+#define EIGEN_BUILTIN_LINE __builtin_LINE()
 #else
 // Default (potentially unsafe) values.
-#  define EIGEN_BUILTIN_FILE __FILE__
-#  define EIGEN_BUILTIN_LINE __LINE__
+#define EIGEN_BUILTIN_FILE __FILE__
+#define EIGEN_BUILTIN_LINE __LINE__
 #endif
 
 // Use __PRETTY_FUNCTION__ when available, since it is more descriptive, as
@@ -68,45 +68,39 @@
 // This should still be okay ODR-wise since it is a compiler-specific fixed
 // value.  Mixing compilers will likely lead to ODR violations anyways.
 #if EIGEN_COMP_MSVC
-#  define EIGEN_BUILTIN_FUNCTION __FUNCSIG__
+#define EIGEN_BUILTIN_FUNCTION __FUNCSIG__
 #elif EIGEN_COMP_GNUC
-#  define EIGEN_BUILTIN_FUNCTION __PRETTY_FUNCTION__
+#define EIGEN_BUILTIN_FUNCTION __PRETTY_FUNCTION__
 #else
-#  define EIGEN_BUILTIN_FUNCTION __func__
+#define EIGEN_BUILTIN_FUNCTION __func__
 #endif
 
 namespace Eigen {
 namespace internal {
 
 // Generic default assert handler.
-template<typename EnableIf = void, typename... EmptyArgs>
+template <typename EnableIf = void, typename... EmptyArgs>
 struct assert_handler_impl {
-  EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE
-  static inline void run(const char* expression, const char* file, unsigned line, const char* function) {
+  EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE static inline void run(const char* expression, const char* file, unsigned line,
+                                                             const char* function) {
 #ifdef EIGEN_GPU_COMPILE_PHASE
     // GPU device code doesn't allow stderr or abort, so use printf and raise an
     // illegal instruction exception to trigger a kernel failure.
 #ifndef EIGEN_NO_IO
-    printf("Assertion failed at %s:%u in %s: %s\n",
-      file == nullptr ? "<file>" : file,
-      line,
-      function == nullptr ? "<function>" : function,
-      expression);
+    printf("Assertion failed at %s:%u in %s: %s\n", file == nullptr ? "<file>" : file, line,
+           function == nullptr ? "<function>" : function, expression);
 #endif
     __trap();
-      
+
 #else  // EIGEN_GPU_COMPILE_PHASE
 
     // Print to stderr and abort, as specified in <cassert>.
 #ifndef EIGEN_NO_IO
-    fprintf(stderr, "Assertion failed at %s:%u in %s: %s\n",
-      file == nullptr ? "<file>" : file,
-      line,
-      function == nullptr ? "<function>" : function,
-      expression);
+    fprintf(stderr, "Assertion failed at %s:%u in %s: %s\n", file == nullptr ? "<file>" : file, line,
+            function == nullptr ? "<function>" : function, expression);
 #endif
     std::abort();
-    
+
 #endif  // EIGEN_GPU_COMPILE_PHASE
   }
 };
@@ -119,36 +113,34 @@
 // we could simply test for __unix__ or similar).  The handler function name
 // seems to depend on the specific toolchain implementation, and differs between
 // compilers, platforms, OSes, etc.  Hence, we detect support via SFINAE.
-template<typename... EmptyArgs>
-struct assert_handler_impl<
-    void_t<decltype(__assert_fail(
-        (const char*)nullptr,         // expression
-        (const char*)nullptr,         // file
-        0,                            // line
-        (const char*)nullptr,         // function
-        std::declval<EmptyArgs>()...  // Empty substitution required for SFINAE.
-    ))>, EmptyArgs... > {
-  EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE
-  static inline void run(const char* expression, const char* file, unsigned line, const char* function) {
+template <typename... EmptyArgs>
+struct assert_handler_impl<void_t<decltype(__assert_fail((const char*)nullptr,         // expression
+                                                         (const char*)nullptr,         // file
+                                                         0,                            // line
+                                                         (const char*)nullptr,         // function
+                                                         std::declval<EmptyArgs>()...  // Empty substitution required
+                                                                                       // for SFINAE.
+                                                         ))>,
+                           EmptyArgs...> {
+  EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE static inline void run(const char* expression, const char* file, unsigned line,
+                                                             const char* function) {
     // GCC requires this call to be dependent on the template parameters.
     __assert_fail(expression, file, line, function, std::declval<EmptyArgs>()...);
   }
 };
 
-EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE
-inline void __assert_handler(const char* expression, const char* file, unsigned line, const char* function) {
+EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE inline void __assert_handler(const char* expression, const char* file,
+                                                                 unsigned line, const char* function) {
   assert_handler_impl<>::run(expression, file, line, function);
 }
 
 }  // namespace internal
 }  // namespace Eigen
 
-#define eigen_plain_assert(expression)                     \
-  (EIGEN_PREDICT_FALSE(!(expression)) ?                    \
-    Eigen::internal::__assert_handler(#expression,         \
-                                      EIGEN_BUILTIN_FILE,  \
-                                      EIGEN_BUILTIN_LINE,  \
-                                      EIGEN_BUILTIN_FUNCTION) : (void)0)
+#define eigen_plain_assert(expression)                                                                                \
+  (EIGEN_PREDICT_FALSE(!(expression)) ? Eigen::internal::__assert_handler(#expression, EIGEN_BUILTIN_FILE,            \
+                                                                          EIGEN_BUILTIN_LINE, EIGEN_BUILTIN_FUNCTION) \
+                                      : (void)0)
 
 #else  // EIGEN_USE_CUSTOM_PLAIN_ASSERT
 
@@ -157,7 +149,7 @@
 
 #endif  // EIGEN_USE_CUSTOM_PLAIN_ASSERT
 
-#else   // EIGEN_NO_DEBUG
+#else  // EIGEN_NO_DEBUG
 
 #define eigen_plain_assert(condition) ((void)0)
 
diff --git a/Eigen/src/Core/util/BlasUtil.h b/Eigen/src/Core/util/BlasUtil.h
index c56b925..c2994b2 100644
--- a/Eigen/src/Core/util/BlasUtil.h
+++ b/Eigen/src/Core/util/BlasUtil.h
@@ -21,45 +21,44 @@
 namespace internal {
 
 // forward declarations
-template<typename LhsScalar, typename RhsScalar, typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs=false, bool ConjugateRhs=false>
+template <typename LhsScalar, typename RhsScalar, typename Index, typename DataMapper, int mr, int nr,
+          bool ConjugateLhs = false, bool ConjugateRhs = false>
 struct gebp_kernel;
 
-template<typename Scalar, typename Index, typename DataMapper, int nr, int StorageOrder, bool Conjugate = false, bool PanelMode=false>
+template <typename Scalar, typename Index, typename DataMapper, int nr, int StorageOrder, bool Conjugate = false,
+          bool PanelMode = false>
 struct gemm_pack_rhs;
 
-template<typename Scalar, typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, int StorageOrder, bool Conjugate = false, bool PanelMode = false>
+template <typename Scalar, typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, int StorageOrder,
+          bool Conjugate = false, bool PanelMode = false>
 struct gemm_pack_lhs;
 
-template<
-  typename Index,
-  typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs,
-  typename RhsScalar, int RhsStorageOrder, bool ConjugateRhs,
-  int ResStorageOrder, int ResInnerStride>
+template <typename Index, typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs, typename RhsScalar,
+          int RhsStorageOrder, bool ConjugateRhs, int ResStorageOrder, int ResInnerStride>
 struct general_matrix_matrix_product;
 
-template<typename Index,
-         typename LhsScalar, typename LhsMapper, int LhsStorageOrder, bool ConjugateLhs,
-         typename RhsScalar, typename RhsMapper, bool ConjugateRhs, int Version=Specialized>
+template <typename Index, typename LhsScalar, typename LhsMapper, int LhsStorageOrder, bool ConjugateLhs,
+          typename RhsScalar, typename RhsMapper, bool ConjugateRhs, int Version = Specialized>
 struct general_matrix_vector_product;
 
-template<typename From,typename To> struct get_factor {
+template <typename From, typename To>
+struct get_factor {
   EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE To run(const From& x) { return To(x); }
 };
 
-template<typename Scalar> struct get_factor<Scalar,typename NumTraits<Scalar>::Real> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE typename NumTraits<Scalar>::Real run(const Scalar& x) { return numext::real(x); }
+template <typename Scalar>
+struct get_factor<Scalar, typename NumTraits<Scalar>::Real> {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE typename NumTraits<Scalar>::Real run(const Scalar& x) {
+    return numext::real(x);
+  }
 };
 
-
-template<typename Scalar, typename Index>
+template <typename Scalar, typename Index>
 class BlasVectorMapper {
-  public:
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE BlasVectorMapper(Scalar *data) : m_data(data) {}
+ public:
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE BlasVectorMapper(Scalar* data) : m_data(data) {}
 
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Scalar operator()(Index i) const {
-    return m_data[i];
-  }
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Scalar operator()(Index i) const { return m_data[i]; }
   template <typename Packet, int AlignmentType>
   EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet load(Index i) const {
     return ploadt<Packet, AlignmentType>(m_data + i);
@@ -67,97 +66,91 @@
 
   template <typename Packet>
   EIGEN_DEVICE_FUNC bool aligned(Index i) const {
-    return (std::uintptr_t(m_data+i)%sizeof(Packet))==0;
+    return (std::uintptr_t(m_data + i) % sizeof(Packet)) == 0;
   }
 
-  protected:
+ protected:
   Scalar* m_data;
 };
 
-template<typename Scalar, typename Index, int AlignmentType, int Incr=1>
+template <typename Scalar, typename Index, int AlignmentType, int Incr = 1>
 class BlasLinearMapper;
 
-template<typename Scalar, typename Index, int AlignmentType>
-class BlasLinearMapper<Scalar,Index,AlignmentType>
-{
-public:
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE BlasLinearMapper(Scalar *data, Index incr=1)
-    : m_data(data)
-  {
+template <typename Scalar, typename Index, int AlignmentType>
+class BlasLinearMapper<Scalar, Index, AlignmentType> {
+ public:
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE BlasLinearMapper(Scalar* data, Index incr = 1) : m_data(data) {
     EIGEN_ONLY_USED_FOR_DEBUG(incr);
-    eigen_assert(incr==1);
+    eigen_assert(incr == 1);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void prefetch(Index i) const {
-    internal::prefetch(&operator()(i));
-  }
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void prefetch(Index i) const { internal::prefetch(&operator()(i)); }
 
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Scalar& operator()(Index i) const {
-    return m_data[i];
-  }
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Scalar& operator()(Index i) const { return m_data[i]; }
 
-  template<typename PacketType>
+  template <typename PacketType>
   EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacket(Index i) const {
     return ploadt<PacketType, AlignmentType>(m_data + i);
   }
 
-  template<typename PacketType>
+  template <typename PacketType>
   EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacketPartial(Index i, Index n, Index offset = 0) const {
     return ploadt_partial<PacketType, AlignmentType>(m_data + i, n, offset);
   }
 
-  template<typename PacketType, int AlignmentT>
+  template <typename PacketType, int AlignmentT>
   EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType load(Index i) const {
     return ploadt<PacketType, AlignmentT>(m_data + i);
   }
 
-  template<typename PacketType>
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacket(Index i, const PacketType &p) const {
+  template <typename PacketType>
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacket(Index i, const PacketType& p) const {
     pstoret<Scalar, PacketType, AlignmentType>(m_data + i, p);
   }
 
-  template<typename PacketType>
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacketPartial(Index i, const PacketType &p, Index n, Index offset = 0) const {
+  template <typename PacketType>
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacketPartial(Index i, const PacketType& p, Index n,
+                                                                Index offset = 0) const {
     pstoret_partial<Scalar, PacketType, AlignmentType>(m_data + i, p, n, offset);
   }
 
-protected:
-  Scalar *m_data;
+ protected:
+  Scalar* m_data;
 };
 
 // Lightweight helper class to access matrix coefficients.
-template<typename Scalar, typename Index, int StorageOrder, int AlignmentType = Unaligned, int Incr = 1>
+template <typename Scalar, typename Index, int StorageOrder, int AlignmentType = Unaligned, int Incr = 1>
 class blas_data_mapper;
 
 // TMP to help PacketBlock store implementation.
 // There's currently no known use case for PacketBlock load.
 // The default implementation assumes ColMajor order.
 // It always store each packet sequentially one `stride` apart.
-template<typename Index, typename Scalar, typename Packet, int n, int idx, int StorageOrder>
-struct PacketBlockManagement
-{
+template <typename Index, typename Scalar, typename Packet, int n, int idx, int StorageOrder>
+struct PacketBlockManagement {
   PacketBlockManagement<Index, Scalar, Packet, n, idx - 1, StorageOrder> pbm;
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(Scalar *to, const Index stride, Index i, Index j, const PacketBlock<Packet, n> &block) const {
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(Scalar* to, const Index stride, Index i, Index j,
+                                                   const PacketBlock<Packet, n>& block) const {
     pbm.store(to, stride, i, j, block);
-    pstoreu<Scalar>(to + i + (j + idx)*stride, block.packet[idx]);
+    pstoreu<Scalar>(to + i + (j + idx) * stride, block.packet[idx]);
   }
 };
 
 // PacketBlockManagement specialization to take care of RowMajor order without ifs.
-template<typename Index, typename Scalar, typename Packet, int n, int idx>
-struct PacketBlockManagement<Index, Scalar, Packet, n, idx, RowMajor>
-{
+template <typename Index, typename Scalar, typename Packet, int n, int idx>
+struct PacketBlockManagement<Index, Scalar, Packet, n, idx, RowMajor> {
   PacketBlockManagement<Index, Scalar, Packet, n, idx - 1, RowMajor> pbm;
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(Scalar *to, const Index stride, Index i, Index j, const PacketBlock<Packet, n> &block) const {
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(Scalar* to, const Index stride, Index i, Index j,
+                                                   const PacketBlock<Packet, n>& block) const {
     pbm.store(to, stride, i, j, block);
-    pstoreu<Scalar>(to + j + (i + idx)*stride, block.packet[idx]);
+    pstoreu<Scalar>(to + j + (i + idx) * stride, block.packet[idx]);
   }
 };
 
-template<typename Index, typename Scalar, typename Packet, int n, int StorageOrder>
-struct PacketBlockManagement<Index, Scalar, Packet, n, -1, StorageOrder>
-{
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(Scalar *to, const Index stride, Index i, Index j, const PacketBlock<Packet, n> &block) const {
+template <typename Index, typename Scalar, typename Packet, int n, int StorageOrder>
+struct PacketBlockManagement<Index, Scalar, Packet, n, -1, StorageOrder> {
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(Scalar* to, const Index stride, Index i, Index j,
+                                                   const PacketBlock<Packet, n>& block) const {
     EIGEN_UNUSED_VARIABLE(to);
     EIGEN_UNUSED_VARIABLE(stride);
     EIGEN_UNUSED_VARIABLE(i);
@@ -166,10 +159,10 @@
   }
 };
 
-template<typename Index, typename Scalar, typename Packet, int n>
-struct PacketBlockManagement<Index, Scalar, Packet, n, -1, RowMajor>
-{
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(Scalar *to, const Index stride, Index i, Index j, const PacketBlock<Packet, n> &block) const {
+template <typename Index, typename Scalar, typename Packet, int n>
+struct PacketBlockManagement<Index, Scalar, Packet, n, -1, RowMajor> {
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(Scalar* to, const Index stride, Index i, Index j,
+                                                   const PacketBlock<Packet, n>& block) const {
     EIGEN_UNUSED_VARIABLE(to);
     EIGEN_UNUSED_VARIABLE(stride);
     EIGEN_UNUSED_VARIABLE(i);
@@ -178,50 +171,45 @@
   }
 };
 
-template<typename Scalar, typename Index, int StorageOrder, int AlignmentType>
-class blas_data_mapper<Scalar,Index,StorageOrder,AlignmentType,1>
-{
-public:
+template <typename Scalar, typename Index, int StorageOrder, int AlignmentType>
+class blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, 1> {
+ public:
   typedef BlasLinearMapper<Scalar, Index, AlignmentType> LinearMapper;
   typedef blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType> SubMapper;
   typedef BlasVectorMapper<Scalar, Index> VectorMapper;
 
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE blas_data_mapper(Scalar* data, Index stride, Index incr=1)
-   : m_data(data), m_stride(stride)
-  {
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE blas_data_mapper(Scalar* data, Index stride, Index incr = 1)
+      : m_data(data), m_stride(stride) {
     EIGEN_ONLY_USED_FOR_DEBUG(incr);
-    eigen_assert(incr==1);
+    eigen_assert(incr == 1);
   }
 
-  EIGEN_DEVICE_FUNC  EIGEN_ALWAYS_INLINE SubMapper
-  getSubMapper(Index i, Index j) const {
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE SubMapper getSubMapper(Index i, Index j) const {
     return SubMapper(&operator()(i, j), m_stride);
   }
 
-  EIGEN_DEVICE_FUNC  EIGEN_ALWAYS_INLINE LinearMapper getLinearMapper(Index i, Index j) const {
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE LinearMapper getLinearMapper(Index i, Index j) const {
     return LinearMapper(&operator()(i, j));
   }
 
-  EIGEN_DEVICE_FUNC  EIGEN_ALWAYS_INLINE VectorMapper getVectorMapper(Index i, Index j) const {
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE VectorMapper getVectorMapper(Index i, Index j) const {
     return VectorMapper(&operator()(i, j));
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void prefetch(Index i, Index j) const {
-    internal::prefetch(&operator()(i, j));
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void prefetch(Index i, Index j) const { internal::prefetch(&operator()(i, j)); }
+
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Scalar& operator()(Index i, Index j) const {
+    return m_data[StorageOrder == RowMajor ? j + i * m_stride : i + j * m_stride];
   }
 
-  EIGEN_DEVICE_FUNC
-  EIGEN_ALWAYS_INLINE Scalar& operator()(Index i, Index j) const {
-    return m_data[StorageOrder==RowMajor ? j + i*m_stride : i + j*m_stride];
-  }
-
-  template<typename PacketType>
+  template <typename PacketType>
   EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacket(Index i, Index j) const {
     return ploadt<PacketType, AlignmentType>(&operator()(i, j));
   }
 
-  template<typename PacketType>
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacketPartial(Index i, Index j, Index n, Index offset = 0) const {
+  template <typename PacketType>
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacketPartial(Index i, Index j, Index n,
+                                                                     Index offset = 0) const {
     return ploadt_partial<PacketType, AlignmentType>(&operator()(i, j), n, offset);
   }
 
@@ -230,22 +218,23 @@
     return ploadt<PacketT, AlignmentT>(&operator()(i, j));
   }
 
-  template<typename PacketType>
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacket(Index i, Index j, const PacketType &p) const {
+  template <typename PacketType>
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacket(Index i, Index j, const PacketType& p) const {
     pstoret<Scalar, PacketType, AlignmentType>(&operator()(i, j), p);
   }
 
-  template<typename PacketType>
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacketPartial(Index i, Index j, const PacketType &p, Index n, Index offset = 0) const {
+  template <typename PacketType>
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacketPartial(Index i, Index j, const PacketType& p, Index n,
+                                                                Index offset = 0) const {
     pstoret_partial<Scalar, PacketType, AlignmentType>(&operator()(i, j), p, n, offset);
   }
 
-  template<typename SubPacket>
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void scatterPacket(Index i, Index j, const SubPacket &p) const {
+  template <typename SubPacket>
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void scatterPacket(Index i, Index j, const SubPacket& p) const {
     pscatter<Scalar, SubPacket>(&operator()(i, j), p, m_stride);
   }
 
-  template<typename SubPacket>
+  template <typename SubPacket>
   EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE SubPacket gatherPacket(Index i, Index j) const {
     return pgather<Scalar, SubPacket>(&operator()(i, j), m_stride);
   }
@@ -255,18 +244,20 @@
   EIGEN_DEVICE_FUNC const Scalar* data() const { return m_data; }
 
   EIGEN_DEVICE_FUNC Index firstAligned(Index size) const {
-    if (std::uintptr_t(m_data)%sizeof(Scalar)) {
+    if (std::uintptr_t(m_data) % sizeof(Scalar)) {
       return -1;
     }
     return internal::first_default_aligned(m_data, size);
   }
 
-  template<typename SubPacket, int n>
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacketBlock(Index i, Index j, const PacketBlock<SubPacket, n> &block) const {
-    PacketBlockManagement<Index, Scalar, SubPacket, n, n-1, StorageOrder> pbm;
+  template <typename SubPacket, int n>
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacketBlock(Index i, Index j,
+                                                              const PacketBlock<SubPacket, n>& block) const {
+    PacketBlockManagement<Index, Scalar, SubPacket, n, n - 1, StorageOrder> pbm;
     pbm.store(m_data, m_stride, i, j, block);
   }
-protected:
+
+ protected:
   Scalar* EIGEN_RESTRICT m_data;
   const Index m_stride;
 };
@@ -274,198 +265,198 @@
 // Implementation of non-natural increment (i.e. inner-stride != 1)
 // The exposed API is not complete yet compared to the Incr==1 case
 // because some features makes less sense in this case.
-template<typename Scalar, typename Index, int AlignmentType, int Incr>
-class BlasLinearMapper
-{
-public:
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE BlasLinearMapper(Scalar *data,Index incr) : m_data(data), m_incr(incr) {}
+template <typename Scalar, typename Index, int AlignmentType, int Incr>
+class BlasLinearMapper {
+ public:
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE BlasLinearMapper(Scalar* data, Index incr) : m_data(data), m_incr(incr) {}
 
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void prefetch(int i) const {
-    internal::prefetch(&operator()(i));
-  }
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void prefetch(int i) const { internal::prefetch(&operator()(i)); }
 
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Scalar& operator()(Index i) const {
-    return m_data[i*m_incr.value()];
-  }
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Scalar& operator()(Index i) const { return m_data[i * m_incr.value()]; }
 
-  template<typename PacketType>
+  template <typename PacketType>
   EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacket(Index i) const {
-    return pgather<Scalar,PacketType>(m_data + i*m_incr.value(), m_incr.value());
+    return pgather<Scalar, PacketType>(m_data + i * m_incr.value(), m_incr.value());
   }
 
-  template<typename PacketType>
+  template <typename PacketType>
   EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacketPartial(Index i, Index n, Index /*offset*/ = 0) const {
-    return pgather_partial<Scalar,PacketType>(m_data + i*m_incr.value(), m_incr.value(), n);
+    return pgather_partial<Scalar, PacketType>(m_data + i * m_incr.value(), m_incr.value(), n);
   }
 
-  template<typename PacketType>
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacket(Index i, const PacketType &p) const {
-    pscatter<Scalar, PacketType>(m_data + i*m_incr.value(), p, m_incr.value());
+  template <typename PacketType>
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacket(Index i, const PacketType& p) const {
+    pscatter<Scalar, PacketType>(m_data + i * m_incr.value(), p, m_incr.value());
   }
 
-  template<typename PacketType>
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacketPartial(Index i, const PacketType &p, Index n, Index /*offset*/ = 0) const {
-    pscatter_partial<Scalar, PacketType>(m_data + i*m_incr.value(), p, m_incr.value(), n);
+  template <typename PacketType>
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacketPartial(Index i, const PacketType& p, Index n,
+                                                                Index /*offset*/ = 0) const {
+    pscatter_partial<Scalar, PacketType>(m_data + i * m_incr.value(), p, m_incr.value(), n);
   }
 
-protected:
-  Scalar *m_data;
-  const internal::variable_if_dynamic<Index,Incr> m_incr;
+ protected:
+  Scalar* m_data;
+  const internal::variable_if_dynamic<Index, Incr> m_incr;
 };
 
-template<typename Scalar, typename Index, int StorageOrder, int AlignmentType,int Incr>
-class blas_data_mapper
-{
-public:
-  typedef BlasLinearMapper<Scalar, Index, AlignmentType,Incr> LinearMapper;
+template <typename Scalar, typename Index, int StorageOrder, int AlignmentType, int Incr>
+class blas_data_mapper {
+ public:
+  typedef BlasLinearMapper<Scalar, Index, AlignmentType, Incr> LinearMapper;
   typedef blas_data_mapper SubMapper;
 
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE blas_data_mapper(Scalar* data, Index stride, Index incr) : m_data(data), m_stride(stride), m_incr(incr) {}
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE blas_data_mapper(Scalar* data, Index stride, Index incr)
+      : m_data(data), m_stride(stride), m_incr(incr) {}
 
-  EIGEN_DEVICE_FUNC  EIGEN_ALWAYS_INLINE SubMapper
-  getSubMapper(Index i, Index j) const {
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE SubMapper getSubMapper(Index i, Index j) const {
     return SubMapper(&operator()(i, j), m_stride, m_incr.value());
   }
 
-  EIGEN_DEVICE_FUNC  EIGEN_ALWAYS_INLINE LinearMapper getLinearMapper(Index i, Index j) const {
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE LinearMapper getLinearMapper(Index i, Index j) const {
     return LinearMapper(&operator()(i, j), m_incr.value());
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void prefetch(Index i, Index j) const {
-    internal::prefetch(&operator()(i, j));
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void prefetch(Index i, Index j) const { internal::prefetch(&operator()(i, j)); }
+
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Scalar& operator()(Index i, Index j) const {
+    return m_data[StorageOrder == RowMajor ? j * m_incr.value() + i * m_stride : i * m_incr.value() + j * m_stride];
   }
 
-  EIGEN_DEVICE_FUNC
-  EIGEN_ALWAYS_INLINE Scalar& operator()(Index i, Index j) const {
-    return m_data[StorageOrder==RowMajor ? j*m_incr.value() + i*m_stride : i*m_incr.value() + j*m_stride];
-  }
-
-  template<typename PacketType>
+  template <typename PacketType>
   EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacket(Index i, Index j) const {
-    return pgather<Scalar,PacketType>(&operator()(i, j),m_incr.value());
+    return pgather<Scalar, PacketType>(&operator()(i, j), m_incr.value());
   }
 
-  template<typename PacketType>
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacketPartial(Index i, Index j, Index n, Index /*offset*/ = 0) const {
-    return pgather_partial<Scalar,PacketType>(&operator()(i, j),m_incr.value(),n);
+  template <typename PacketType>
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacketPartial(Index i, Index j, Index n,
+                                                                     Index /*offset*/ = 0) const {
+    return pgather_partial<Scalar, PacketType>(&operator()(i, j), m_incr.value(), n);
   }
 
   template <typename PacketT, int AlignmentT>
   EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketT load(Index i, Index j) const {
-    return pgather<Scalar,PacketT>(&operator()(i, j),m_incr.value());
+    return pgather<Scalar, PacketT>(&operator()(i, j), m_incr.value());
   }
 
-  template<typename PacketType>
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacket(Index i, Index j, const PacketType &p) const {
+  template <typename PacketType>
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacket(Index i, Index j, const PacketType& p) const {
     pscatter<Scalar, PacketType>(&operator()(i, j), p, m_incr.value());
   }
 
-  template<typename PacketType>
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacketPartial(Index i, Index j, const PacketType &p, Index n, Index /*offset*/ = 0) const {
+  template <typename PacketType>
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacketPartial(Index i, Index j, const PacketType& p, Index n,
+                                                                Index /*offset*/ = 0) const {
     pscatter_partial<Scalar, PacketType>(&operator()(i, j), p, m_incr.value(), n);
   }
 
-  template<typename SubPacket>
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void scatterPacket(Index i, Index j, const SubPacket &p) const {
+  template <typename SubPacket>
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void scatterPacket(Index i, Index j, const SubPacket& p) const {
     pscatter<Scalar, SubPacket>(&operator()(i, j), p, m_stride);
   }
 
-  template<typename SubPacket>
+  template <typename SubPacket>
   EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE SubPacket gatherPacket(Index i, Index j) const {
     return pgather<Scalar, SubPacket>(&operator()(i, j), m_stride);
   }
 
-  // storePacketBlock_helper defines a way to access values inside the PacketBlock, this is essentially required by the Complex types.
-  template<typename SubPacket, typename Scalar_, int n, int idx>
-  struct storePacketBlock_helper
-  {
-    storePacketBlock_helper<SubPacket, Scalar_, n, idx-1> spbh;
-    EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>* sup, Index i, Index j, const PacketBlock<SubPacket, n>& block) const {
-      spbh.store(sup, i,j,block);
-      sup->template storePacket<SubPacket>(i, j+idx, block.packet[idx]);
+  // storePacketBlock_helper defines a way to access values inside the PacketBlock, this is essentially required by the
+  // Complex types.
+  template <typename SubPacket, typename Scalar_, int n, int idx>
+  struct storePacketBlock_helper {
+    storePacketBlock_helper<SubPacket, Scalar_, n, idx - 1> spbh;
+    EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(
+        const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>* sup, Index i, Index j,
+        const PacketBlock<SubPacket, n>& block) const {
+      spbh.store(sup, i, j, block);
+      sup->template storePacket<SubPacket>(i, j + idx, block.packet[idx]);
     }
   };
 
-  template<typename SubPacket, int n, int idx>
-  struct storePacketBlock_helper<SubPacket, std::complex<float>, n, idx>
-  {
-    storePacketBlock_helper<SubPacket, std::complex<float>, n, idx-1> spbh;
-    EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>* sup, Index i, Index j, const PacketBlock<SubPacket, n>& block) const {
-      spbh.store(sup,i,j,block);
-      sup->template storePacket<SubPacket>(i, j+idx, block.packet[idx]);
+  template <typename SubPacket, int n, int idx>
+  struct storePacketBlock_helper<SubPacket, std::complex<float>, n, idx> {
+    storePacketBlock_helper<SubPacket, std::complex<float>, n, idx - 1> spbh;
+    EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(
+        const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>* sup, Index i, Index j,
+        const PacketBlock<SubPacket, n>& block) const {
+      spbh.store(sup, i, j, block);
+      sup->template storePacket<SubPacket>(i, j + idx, block.packet[idx]);
     }
   };
 
-  template<typename SubPacket, int n, int idx>
-  struct storePacketBlock_helper<SubPacket, std::complex<double>, n, idx>
-  {
-    storePacketBlock_helper<SubPacket, std::complex<double>, n, idx-1> spbh;
-    EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>* sup, Index i, Index j, const PacketBlock<SubPacket, n>& block) const {
-      spbh.store(sup,i,j,block);
-      for(int l = 0; l < unpacket_traits<SubPacket>::size; l++)
-      {
-        std::complex<double> *v = &sup->operator()(i+l, j+idx);
-        v->real(block.packet[idx].v[2*l+0]);
-        v->imag(block.packet[idx].v[2*l+1]);
+  template <typename SubPacket, int n, int idx>
+  struct storePacketBlock_helper<SubPacket, std::complex<double>, n, idx> {
+    storePacketBlock_helper<SubPacket, std::complex<double>, n, idx - 1> spbh;
+    EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(
+        const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>* sup, Index i, Index j,
+        const PacketBlock<SubPacket, n>& block) const {
+      spbh.store(sup, i, j, block);
+      for (int l = 0; l < unpacket_traits<SubPacket>::size; l++) {
+        std::complex<double>* v = &sup->operator()(i + l, j + idx);
+        v->real(block.packet[idx].v[2 * l + 0]);
+        v->imag(block.packet[idx].v[2 * l + 1]);
       }
     }
   };
 
-  template<typename SubPacket, typename Scalar_, int n>
-  struct storePacketBlock_helper<SubPacket, Scalar_, n, -1>
-  {
-    EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>*, Index, Index, const PacketBlock<SubPacket, n>& ) const {
-    }
+  template <typename SubPacket, typename Scalar_, int n>
+  struct storePacketBlock_helper<SubPacket, Scalar_, n, -1> {
+    EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(
+        const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>*, Index, Index,
+        const PacketBlock<SubPacket, n>&) const {}
   };
 
-  template<typename SubPacket, int n>
-  struct storePacketBlock_helper<SubPacket, std::complex<float>, n, -1>
-  {
-    EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>*, Index, Index, const PacketBlock<SubPacket, n>& ) const {
-    }
+  template <typename SubPacket, int n>
+  struct storePacketBlock_helper<SubPacket, std::complex<float>, n, -1> {
+    EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(
+        const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>*, Index, Index,
+        const PacketBlock<SubPacket, n>&) const {}
   };
 
-  template<typename SubPacket, int n>
-  struct storePacketBlock_helper<SubPacket, std::complex<double>, n, -1>
-  {
-    EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>*, Index, Index, const PacketBlock<SubPacket, n>& ) const {
-    }
+  template <typename SubPacket, int n>
+  struct storePacketBlock_helper<SubPacket, std::complex<double>, n, -1> {
+    EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(
+        const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>*, Index, Index,
+        const PacketBlock<SubPacket, n>&) const {}
   };
-  // This function stores a PacketBlock on m_data, this approach is really quite slow compare to Incr=1 and should be avoided when possible.
-  template<typename SubPacket, int n>
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacketBlock(Index i, Index j, const PacketBlock<SubPacket, n>&block) const {
-    storePacketBlock_helper<SubPacket, Scalar, n, n-1> spb;
-    spb.store(this, i,j,block);
+  // This function stores a PacketBlock on m_data, this approach is really quite slow compare to Incr=1 and should be
+  // avoided when possible.
+  template <typename SubPacket, int n>
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacketBlock(Index i, Index j,
+                                                              const PacketBlock<SubPacket, n>& block) const {
+    storePacketBlock_helper<SubPacket, Scalar, n, n - 1> spb;
+    spb.store(this, i, j, block);
   }
 
   EIGEN_DEVICE_FUNC const Index stride() const { return m_stride; }
   EIGEN_DEVICE_FUNC const Index incr() const { return m_incr.value(); }
   EIGEN_DEVICE_FUNC Scalar* data() const { return m_data; }
-protected:
+
+ protected:
   Scalar* EIGEN_RESTRICT m_data;
   const Index m_stride;
-  const internal::variable_if_dynamic<Index,Incr> m_incr;
+  const internal::variable_if_dynamic<Index, Incr> m_incr;
 };
 
 // lightweight helper class to access matrix coefficients (const version)
-template<typename Scalar, typename Index, int StorageOrder>
+template <typename Scalar, typename Index, int StorageOrder>
 class const_blas_data_mapper : public blas_data_mapper<const Scalar, Index, StorageOrder> {
-  public:
+ public:
   typedef const_blas_data_mapper<Scalar, Index, StorageOrder> SubMapper;
 
-  EIGEN_ALWAYS_INLINE const_blas_data_mapper(const Scalar *data, Index stride) : blas_data_mapper<const Scalar, Index, StorageOrder>(data, stride) {}
+  EIGEN_ALWAYS_INLINE const_blas_data_mapper(const Scalar* data, Index stride)
+      : blas_data_mapper<const Scalar, Index, StorageOrder>(data, stride) {}
 
   EIGEN_ALWAYS_INLINE SubMapper getSubMapper(Index i, Index j) const {
     return SubMapper(&(this->operator()(i, j)), this->m_stride);
   }
 };
 
-
 /* Helper class to analyze the factors of a Product expression.
  * In particular it allows to pop out operator-, scalar multiples,
  * and conjugate */
-template<typename XprType> struct blas_traits
-{
+template <typename XprType>
+struct blas_traits {
   typedef typename traits<XprType>::Scalar Scalar;
   typedef const XprType& ExtractType;
   typedef XprType ExtractType_;
@@ -473,130 +464,121 @@
     IsComplex = NumTraits<Scalar>::IsComplex,
     IsTransposed = false,
     NeedToConjugate = false,
-    HasUsableDirectAccess = (    (int(XprType::Flags)&DirectAccessBit)
-                              && (   bool(XprType::IsVectorAtCompileTime)
-                                  || int(inner_stride_at_compile_time<XprType>::ret) == 1)
-                             ) ?  1 : 0,
+    HasUsableDirectAccess =
+        ((int(XprType::Flags) & DirectAccessBit) &&
+         (bool(XprType::IsVectorAtCompileTime) || int(inner_stride_at_compile_time<XprType>::ret) == 1))
+            ? 1
+            : 0,
     HasScalarFactor = false
   };
-  typedef std::conditional_t<bool(HasUsableDirectAccess),
-    ExtractType,
-    typename ExtractType_::PlainObject
-    > DirectLinearAccessType;
+  typedef std::conditional_t<bool(HasUsableDirectAccess), ExtractType, typename ExtractType_::PlainObject>
+      DirectLinearAccessType;
   EIGEN_DEVICE_FUNC static inline EIGEN_DEVICE_FUNC ExtractType extract(const XprType& x) { return x; }
-  EIGEN_DEVICE_FUNC static inline EIGEN_DEVICE_FUNC const Scalar extractScalarFactor(const XprType&) { return Scalar(1); }
+  EIGEN_DEVICE_FUNC static inline EIGEN_DEVICE_FUNC const Scalar extractScalarFactor(const XprType&) {
+    return Scalar(1);
+  }
 };
 
 // pop conjugate
-template<typename Scalar, typename NestedXpr>
-struct blas_traits<CwiseUnaryOp<scalar_conjugate_op<Scalar>, NestedXpr> >
- : blas_traits<NestedXpr>
-{
+template <typename Scalar, typename NestedXpr>
+struct blas_traits<CwiseUnaryOp<scalar_conjugate_op<Scalar>, NestedXpr> > : blas_traits<NestedXpr> {
   typedef blas_traits<NestedXpr> Base;
   typedef CwiseUnaryOp<scalar_conjugate_op<Scalar>, NestedXpr> XprType;
   typedef typename Base::ExtractType ExtractType;
 
-  enum {
-    IsComplex = NumTraits<Scalar>::IsComplex,
-    NeedToConjugate = Base::NeedToConjugate ? 0 : IsComplex
-  };
+  enum { IsComplex = NumTraits<Scalar>::IsComplex, NeedToConjugate = Base::NeedToConjugate ? 0 : IsComplex };
   EIGEN_DEVICE_FUNC static inline ExtractType extract(const XprType& x) { return Base::extract(x.nestedExpression()); }
-  EIGEN_DEVICE_FUNC static inline Scalar extractScalarFactor(const XprType& x) { return conj(Base::extractScalarFactor(x.nestedExpression())); }
+  EIGEN_DEVICE_FUNC static inline Scalar extractScalarFactor(const XprType& x) {
+    return conj(Base::extractScalarFactor(x.nestedExpression()));
+  }
 };
 
 // pop scalar multiple
-template<typename Scalar, typename NestedXpr, typename Plain>
-struct blas_traits<CwiseBinaryOp<scalar_product_op<Scalar>, const CwiseNullaryOp<scalar_constant_op<Scalar>,Plain>, NestedXpr> >
- : blas_traits<NestedXpr>
-{
-  enum {
-    HasScalarFactor = true
-  };
+template <typename Scalar, typename NestedXpr, typename Plain>
+struct blas_traits<
+    CwiseBinaryOp<scalar_product_op<Scalar>, const CwiseNullaryOp<scalar_constant_op<Scalar>, Plain>, NestedXpr> >
+    : blas_traits<NestedXpr> {
+  enum { HasScalarFactor = true };
   typedef blas_traits<NestedXpr> Base;
-  typedef CwiseBinaryOp<scalar_product_op<Scalar>, const CwiseNullaryOp<scalar_constant_op<Scalar>,Plain>, NestedXpr> XprType;
+  typedef CwiseBinaryOp<scalar_product_op<Scalar>, const CwiseNullaryOp<scalar_constant_op<Scalar>, Plain>, NestedXpr>
+      XprType;
   typedef typename Base::ExtractType ExtractType;
-  EIGEN_DEVICE_FUNC static inline EIGEN_DEVICE_FUNC ExtractType extract(const XprType& x) { return Base::extract(x.rhs()); }
-  EIGEN_DEVICE_FUNC static inline EIGEN_DEVICE_FUNC Scalar extractScalarFactor(const XprType& x)
-  { return x.lhs().functor().m_other * Base::extractScalarFactor(x.rhs()); }
+  EIGEN_DEVICE_FUNC static inline EIGEN_DEVICE_FUNC ExtractType extract(const XprType& x) {
+    return Base::extract(x.rhs());
+  }
+  EIGEN_DEVICE_FUNC static inline EIGEN_DEVICE_FUNC Scalar extractScalarFactor(const XprType& x) {
+    return x.lhs().functor().m_other * Base::extractScalarFactor(x.rhs());
+  }
 };
-template<typename Scalar, typename NestedXpr, typename Plain>
-struct blas_traits<CwiseBinaryOp<scalar_product_op<Scalar>, NestedXpr, const CwiseNullaryOp<scalar_constant_op<Scalar>,Plain> > >
- : blas_traits<NestedXpr>
-{
-  enum {
-    HasScalarFactor = true
-  };
+template <typename Scalar, typename NestedXpr, typename Plain>
+struct blas_traits<
+    CwiseBinaryOp<scalar_product_op<Scalar>, NestedXpr, const CwiseNullaryOp<scalar_constant_op<Scalar>, Plain> > >
+    : blas_traits<NestedXpr> {
+  enum { HasScalarFactor = true };
   typedef blas_traits<NestedXpr> Base;
-  typedef CwiseBinaryOp<scalar_product_op<Scalar>, NestedXpr, const CwiseNullaryOp<scalar_constant_op<Scalar>,Plain> > XprType;
+  typedef CwiseBinaryOp<scalar_product_op<Scalar>, NestedXpr, const CwiseNullaryOp<scalar_constant_op<Scalar>, Plain> >
+      XprType;
   typedef typename Base::ExtractType ExtractType;
   EIGEN_DEVICE_FUNC static inline ExtractType extract(const XprType& x) { return Base::extract(x.lhs()); }
-  EIGEN_DEVICE_FUNC static inline Scalar extractScalarFactor(const XprType& x)
-  { return Base::extractScalarFactor(x.lhs()) * x.rhs().functor().m_other; }
+  EIGEN_DEVICE_FUNC static inline Scalar extractScalarFactor(const XprType& x) {
+    return Base::extractScalarFactor(x.lhs()) * x.rhs().functor().m_other;
+  }
 };
-template<typename Scalar, typename Plain1, typename Plain2>
-struct blas_traits<CwiseBinaryOp<scalar_product_op<Scalar>, const CwiseNullaryOp<scalar_constant_op<Scalar>,Plain1>,
-                                                            const CwiseNullaryOp<scalar_constant_op<Scalar>,Plain2> > >
- : blas_traits<CwiseNullaryOp<scalar_constant_op<Scalar>,Plain1> >
-{};
+template <typename Scalar, typename Plain1, typename Plain2>
+struct blas_traits<CwiseBinaryOp<scalar_product_op<Scalar>, const CwiseNullaryOp<scalar_constant_op<Scalar>, Plain1>,
+                                 const CwiseNullaryOp<scalar_constant_op<Scalar>, Plain2> > >
+    : blas_traits<CwiseNullaryOp<scalar_constant_op<Scalar>, Plain1> > {};
 
 // pop opposite
-template<typename Scalar, typename NestedXpr>
-struct blas_traits<CwiseUnaryOp<scalar_opposite_op<Scalar>, NestedXpr> >
- : blas_traits<NestedXpr>
-{
-  enum {
-    HasScalarFactor = true
-  };
+template <typename Scalar, typename NestedXpr>
+struct blas_traits<CwiseUnaryOp<scalar_opposite_op<Scalar>, NestedXpr> > : blas_traits<NestedXpr> {
+  enum { HasScalarFactor = true };
   typedef blas_traits<NestedXpr> Base;
   typedef CwiseUnaryOp<scalar_opposite_op<Scalar>, NestedXpr> XprType;
   typedef typename Base::ExtractType ExtractType;
   EIGEN_DEVICE_FUNC static inline ExtractType extract(const XprType& x) { return Base::extract(x.nestedExpression()); }
-  EIGEN_DEVICE_FUNC static inline Scalar extractScalarFactor(const XprType& x)
-  { return - Base::extractScalarFactor(x.nestedExpression()); }
+  EIGEN_DEVICE_FUNC static inline Scalar extractScalarFactor(const XprType& x) {
+    return -Base::extractScalarFactor(x.nestedExpression());
+  }
 };
 
 // pop/push transpose
-template<typename NestedXpr>
-struct blas_traits<Transpose<NestedXpr> >
- : blas_traits<NestedXpr>
-{
+template <typename NestedXpr>
+struct blas_traits<Transpose<NestedXpr> > : blas_traits<NestedXpr> {
   typedef typename NestedXpr::Scalar Scalar;
   typedef blas_traits<NestedXpr> Base;
   typedef Transpose<NestedXpr> XprType;
-  typedef Transpose<const typename Base::ExtractType_>  ExtractType; // const to get rid of a compile error; anyway blas traits are only used on the RHS
+  typedef Transpose<const typename Base::ExtractType_>
+      ExtractType;  // const to get rid of a compile error; anyway blas traits are only used on the RHS
   typedef Transpose<const typename Base::ExtractType_> ExtractType_;
-  typedef std::conditional_t<bool(Base::HasUsableDirectAccess),
-    ExtractType,
-    typename ExtractType::PlainObject
-    > DirectLinearAccessType;
-  enum {
-    IsTransposed = Base::IsTransposed ? 0 : 1
-  };
-  EIGEN_DEVICE_FUNC static inline ExtractType extract(const XprType& x) { return ExtractType(Base::extract(x.nestedExpression())); }
-  EIGEN_DEVICE_FUNC static inline Scalar extractScalarFactor(const XprType& x) { return Base::extractScalarFactor(x.nestedExpression()); }
+  typedef std::conditional_t<bool(Base::HasUsableDirectAccess), ExtractType, typename ExtractType::PlainObject>
+      DirectLinearAccessType;
+  enum { IsTransposed = Base::IsTransposed ? 0 : 1 };
+  EIGEN_DEVICE_FUNC static inline ExtractType extract(const XprType& x) {
+    return ExtractType(Base::extract(x.nestedExpression()));
+  }
+  EIGEN_DEVICE_FUNC static inline Scalar extractScalarFactor(const XprType& x) {
+    return Base::extractScalarFactor(x.nestedExpression());
+  }
 };
 
-template<typename T>
-struct blas_traits<const T>
-     : blas_traits<T>
-{};
+template <typename T>
+struct blas_traits<const T> : blas_traits<T> {};
 
-template<typename T, bool HasUsableDirectAccess=blas_traits<T>::HasUsableDirectAccess>
+template <typename T, bool HasUsableDirectAccess = blas_traits<T>::HasUsableDirectAccess>
 struct extract_data_selector {
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static const typename T::Scalar* run(const T& m)
-  {
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static const typename T::Scalar* run(const T& m) {
     return blas_traits<T>::extract(m).data();
   }
 };
 
-template<typename T>
-struct extract_data_selector<T,false> {
+template <typename T>
+struct extract_data_selector<T, false> {
   EIGEN_DEVICE_FUNC static typename T::Scalar* run(const T&) { return 0; }
 };
 
-template<typename T>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE const typename T::Scalar* extract_data(const T& m)
-{
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE const typename T::Scalar* extract_data(const T& m) {
   return extract_data_selector<T>::run(m);
 }
 
@@ -604,45 +586,37 @@
  * \c combine_scalar_factors extracts and multiplies factors from GEMM and GEMV products.
  * There is a specialization for booleans
  */
-template<typename ResScalar, typename Lhs, typename Rhs>
-struct combine_scalar_factors_impl
-{
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static ResScalar run(const Lhs& lhs, const Rhs& rhs)
-  {
+template <typename ResScalar, typename Lhs, typename Rhs>
+struct combine_scalar_factors_impl {
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static ResScalar run(const Lhs& lhs, const Rhs& rhs) {
     return blas_traits<Lhs>::extractScalarFactor(lhs) * blas_traits<Rhs>::extractScalarFactor(rhs);
   }
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static ResScalar run(const ResScalar& alpha, const Lhs& lhs, const Rhs& rhs)
-  {
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static ResScalar run(const ResScalar& alpha, const Lhs& lhs, const Rhs& rhs) {
     return alpha * blas_traits<Lhs>::extractScalarFactor(lhs) * blas_traits<Rhs>::extractScalarFactor(rhs);
   }
 };
-template<typename Lhs, typename Rhs>
-struct combine_scalar_factors_impl<bool, Lhs, Rhs>
-{
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static bool run(const Lhs& lhs, const Rhs& rhs)
-  {
+template <typename Lhs, typename Rhs>
+struct combine_scalar_factors_impl<bool, Lhs, Rhs> {
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static bool run(const Lhs& lhs, const Rhs& rhs) {
     return blas_traits<Lhs>::extractScalarFactor(lhs) && blas_traits<Rhs>::extractScalarFactor(rhs);
   }
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static bool run(const bool& alpha, const Lhs& lhs, const Rhs& rhs)
-  {
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static bool run(const bool& alpha, const Lhs& lhs, const Rhs& rhs) {
     return alpha && blas_traits<Lhs>::extractScalarFactor(lhs) && blas_traits<Rhs>::extractScalarFactor(rhs);
   }
 };
 
-template<typename ResScalar, typename Lhs, typename Rhs>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE ResScalar combine_scalar_factors(const ResScalar& alpha, const Lhs& lhs, const Rhs& rhs)
-{
-  return combine_scalar_factors_impl<ResScalar,Lhs,Rhs>::run(alpha, lhs, rhs);
+template <typename ResScalar, typename Lhs, typename Rhs>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE ResScalar combine_scalar_factors(const ResScalar& alpha, const Lhs& lhs,
+                                                                       const Rhs& rhs) {
+  return combine_scalar_factors_impl<ResScalar, Lhs, Rhs>::run(alpha, lhs, rhs);
 }
-template<typename ResScalar, typename Lhs, typename Rhs>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE ResScalar combine_scalar_factors(const Lhs& lhs, const Rhs& rhs)
-{
-  return combine_scalar_factors_impl<ResScalar,Lhs,Rhs>::run(lhs, rhs);
+template <typename ResScalar, typename Lhs, typename Rhs>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE ResScalar combine_scalar_factors(const Lhs& lhs, const Rhs& rhs) {
+  return combine_scalar_factors_impl<ResScalar, Lhs, Rhs>::run(lhs, rhs);
 }
 
+}  // end namespace internal
 
-} // end namespace internal
+}  // end namespace Eigen
 
-} // end namespace Eigen
-
-#endif // EIGEN_BLASUTIL_H
+#endif  // EIGEN_BLASUTIL_H
diff --git a/Eigen/src/Core/util/ConfigureVectorization.h b/Eigen/src/Core/util/ConfigureVectorization.h
index ffd9329..b16952a 100644
--- a/Eigen/src/Core/util/ConfigureVectorization.h
+++ b/Eigen/src/Core/util/ConfigureVectorization.h
@@ -23,7 +23,6 @@
 // to be used to declare statically aligned buffers.
 //------------------------------------------------------------------------------------------
 
-
 /* EIGEN_ALIGN_TO_BOUNDARY(n) forces data to be n-byte aligned. This is used to satisfy SIMD requirements.
  * However, we do that EVEN if vectorization (EIGEN_VECTORIZE) is disabled,
  * so that vectorization doesn't affect binary compatibility.
@@ -32,34 +31,33 @@
  * vectorized and non-vectorized code.
  */
 #if (defined EIGEN_CUDACC)
-  #define EIGEN_ALIGN_TO_BOUNDARY(n) __align__(n)
-  #define EIGEN_ALIGNOF(x) __alignof(x)
+#define EIGEN_ALIGN_TO_BOUNDARY(n) __align__(n)
+#define EIGEN_ALIGNOF(x) __alignof(x)
 #else
-  #define EIGEN_ALIGN_TO_BOUNDARY(n) alignas(n)
-  #define EIGEN_ALIGNOF(x) alignof(x)
+#define EIGEN_ALIGN_TO_BOUNDARY(n) alignas(n)
+#define EIGEN_ALIGNOF(x) alignof(x)
 #endif
 
 // If the user explicitly disable vectorization, then we also disable alignment
 #if defined(EIGEN_DONT_VECTORIZE)
-  #if defined(EIGEN_GPUCC)
-    // GPU code is always vectorized and requires memory alignment for
-    // statically allocated buffers.
-    #define EIGEN_IDEAL_MAX_ALIGN_BYTES 16
-  #else
-    #define EIGEN_IDEAL_MAX_ALIGN_BYTES 0
-  #endif
-#elif defined(__AVX512F__)
-  // 64 bytes static alignment is preferred only if really required
-  #define EIGEN_IDEAL_MAX_ALIGN_BYTES 64
-#elif defined(__AVX__)
-  // 32 bytes static alignment is preferred only if really required
-  #define EIGEN_IDEAL_MAX_ALIGN_BYTES 32
-#elif defined __HVX__ && (__HVX_LENGTH__ == 128)
-  #define EIGEN_IDEAL_MAX_ALIGN_BYTES 128
+#if defined(EIGEN_GPUCC)
+// GPU code is always vectorized and requires memory alignment for
+// statically allocated buffers.
+#define EIGEN_IDEAL_MAX_ALIGN_BYTES 16
 #else
-  #define EIGEN_IDEAL_MAX_ALIGN_BYTES 16
+#define EIGEN_IDEAL_MAX_ALIGN_BYTES 0
 #endif
-
+#elif defined(__AVX512F__)
+// 64 bytes static alignment is preferred only if really required
+#define EIGEN_IDEAL_MAX_ALIGN_BYTES 64
+#elif defined(__AVX__)
+// 32 bytes static alignment is preferred only if really required
+#define EIGEN_IDEAL_MAX_ALIGN_BYTES 32
+#elif defined __HVX__ && (__HVX_LENGTH__ == 128)
+#define EIGEN_IDEAL_MAX_ALIGN_BYTES 128
+#else
+#define EIGEN_IDEAL_MAX_ALIGN_BYTES 16
+#endif
 
 // EIGEN_MIN_ALIGN_BYTES defines the minimal value for which the notion of explicit alignment makes sense
 #define EIGEN_MIN_ALIGN_BYTES 16
@@ -68,93 +66,91 @@
 // that unless EIGEN_ALIGN is defined and not equal to 0, the data may not be
 // aligned at all regardless of the value of this #define.
 
-#if (defined(EIGEN_DONT_ALIGN_STATICALLY) || defined(EIGEN_DONT_ALIGN))  && defined(EIGEN_MAX_STATIC_ALIGN_BYTES) && EIGEN_MAX_STATIC_ALIGN_BYTES>0
+#if (defined(EIGEN_DONT_ALIGN_STATICALLY) || defined(EIGEN_DONT_ALIGN)) && defined(EIGEN_MAX_STATIC_ALIGN_BYTES) && \
+    EIGEN_MAX_STATIC_ALIGN_BYTES > 0
 #error EIGEN_MAX_STATIC_ALIGN_BYTES and EIGEN_DONT_ALIGN[_STATICALLY] are both defined with EIGEN_MAX_STATIC_ALIGN_BYTES!=0. Use EIGEN_MAX_STATIC_ALIGN_BYTES=0 as a synonym of EIGEN_DONT_ALIGN_STATICALLY.
 #endif
 
 // EIGEN_DONT_ALIGN_STATICALLY and EIGEN_DONT_ALIGN are deprecated
 // They imply EIGEN_MAX_STATIC_ALIGN_BYTES=0
 #if defined(EIGEN_DONT_ALIGN_STATICALLY) || defined(EIGEN_DONT_ALIGN)
-  #ifdef EIGEN_MAX_STATIC_ALIGN_BYTES
-    #undef EIGEN_MAX_STATIC_ALIGN_BYTES
-  #endif
-  #define EIGEN_MAX_STATIC_ALIGN_BYTES 0
+#ifdef EIGEN_MAX_STATIC_ALIGN_BYTES
+#undef EIGEN_MAX_STATIC_ALIGN_BYTES
+#endif
+#define EIGEN_MAX_STATIC_ALIGN_BYTES 0
 #endif
 
 #ifndef EIGEN_MAX_STATIC_ALIGN_BYTES
 
-  // Try to automatically guess what is the best default value for EIGEN_MAX_STATIC_ALIGN_BYTES
+// Try to automatically guess what is the best default value for EIGEN_MAX_STATIC_ALIGN_BYTES
 
-  // 16 byte alignment is only useful for vectorization. Since it affects the ABI, we need to enable
-  // 16 byte alignment on all platforms where vectorization might be enabled. In theory we could always
-  // enable alignment, but it can be a cause of problems on some platforms, so we just disable it in
-  // certain common platform (compiler+architecture combinations) to avoid these problems.
-  // Only static alignment is really problematic (relies on nonstandard compiler extensions),
-  // try to keep heap alignment even when we have to disable static alignment.
-  #if EIGEN_COMP_GNUC && !(EIGEN_ARCH_i386_OR_x86_64 || EIGEN_ARCH_ARM_OR_ARM64 || EIGEN_ARCH_PPC || EIGEN_ARCH_IA64 || EIGEN_ARCH_MIPS)
-  #define EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT 1
-  #else
-  #define EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT 0
-  #endif
+// 16 byte alignment is only useful for vectorization. Since it affects the ABI, we need to enable
+// 16 byte alignment on all platforms where vectorization might be enabled. In theory we could always
+// enable alignment, but it can be a cause of problems on some platforms, so we just disable it in
+// certain common platform (compiler+architecture combinations) to avoid these problems.
+// Only static alignment is really problematic (relies on nonstandard compiler extensions),
+// try to keep heap alignment even when we have to disable static alignment.
+#if EIGEN_COMP_GNUC && \
+    !(EIGEN_ARCH_i386_OR_x86_64 || EIGEN_ARCH_ARM_OR_ARM64 || EIGEN_ARCH_PPC || EIGEN_ARCH_IA64 || EIGEN_ARCH_MIPS)
+#define EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT 1
+#else
+#define EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT 0
+#endif
 
-  // static alignment is completely disabled with GCC 3, Sun Studio, and QCC/QNX
-  #if !EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT \
-  && !EIGEN_COMP_SUNCC \
-  && !EIGEN_OS_QNX
-    #define EIGEN_ARCH_WANTS_STACK_ALIGNMENT 1
-  #else
-    #define EIGEN_ARCH_WANTS_STACK_ALIGNMENT 0
-  #endif
+// static alignment is completely disabled with GCC 3, Sun Studio, and QCC/QNX
+#if !EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT && !EIGEN_COMP_SUNCC && !EIGEN_OS_QNX
+#define EIGEN_ARCH_WANTS_STACK_ALIGNMENT 1
+#else
+#define EIGEN_ARCH_WANTS_STACK_ALIGNMENT 0
+#endif
 
-  #if EIGEN_ARCH_WANTS_STACK_ALIGNMENT
-    #define EIGEN_MAX_STATIC_ALIGN_BYTES EIGEN_IDEAL_MAX_ALIGN_BYTES
-  #else
-    #define EIGEN_MAX_STATIC_ALIGN_BYTES 0
-  #endif
+#if EIGEN_ARCH_WANTS_STACK_ALIGNMENT
+#define EIGEN_MAX_STATIC_ALIGN_BYTES EIGEN_IDEAL_MAX_ALIGN_BYTES
+#else
+#define EIGEN_MAX_STATIC_ALIGN_BYTES 0
+#endif
 
 #endif
 
 // If EIGEN_MAX_ALIGN_BYTES is defined, then it is considered as an upper bound for EIGEN_MAX_STATIC_ALIGN_BYTES
-#if defined(EIGEN_MAX_ALIGN_BYTES) && EIGEN_MAX_ALIGN_BYTES<EIGEN_MAX_STATIC_ALIGN_BYTES
+#if defined(EIGEN_MAX_ALIGN_BYTES) && EIGEN_MAX_ALIGN_BYTES < EIGEN_MAX_STATIC_ALIGN_BYTES
 #undef EIGEN_MAX_STATIC_ALIGN_BYTES
 #define EIGEN_MAX_STATIC_ALIGN_BYTES EIGEN_MAX_ALIGN_BYTES
 #endif
 
-#if EIGEN_MAX_STATIC_ALIGN_BYTES==0 && !defined(EIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT)
-  #define EIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT
+#if EIGEN_MAX_STATIC_ALIGN_BYTES == 0 && !defined(EIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT)
+#define EIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT
 #endif
 
 // At this stage, EIGEN_MAX_STATIC_ALIGN_BYTES>0 is the true test whether we want to align arrays on the stack or not.
-// It takes into account both the user choice to explicitly enable/disable alignment (by setting EIGEN_MAX_STATIC_ALIGN_BYTES)
-// and the architecture config (EIGEN_ARCH_WANTS_STACK_ALIGNMENT).
-// Henceforth, only EIGEN_MAX_STATIC_ALIGN_BYTES should be used.
-
+// It takes into account both the user choice to explicitly enable/disable alignment (by setting
+// EIGEN_MAX_STATIC_ALIGN_BYTES) and the architecture config (EIGEN_ARCH_WANTS_STACK_ALIGNMENT). Henceforth, only
+// EIGEN_MAX_STATIC_ALIGN_BYTES should be used.
 
 // Shortcuts to EIGEN_ALIGN_TO_BOUNDARY
-#define EIGEN_ALIGN8  EIGEN_ALIGN_TO_BOUNDARY(8)
+#define EIGEN_ALIGN8 EIGEN_ALIGN_TO_BOUNDARY(8)
 #define EIGEN_ALIGN16 EIGEN_ALIGN_TO_BOUNDARY(16)
 #define EIGEN_ALIGN32 EIGEN_ALIGN_TO_BOUNDARY(32)
 #define EIGEN_ALIGN64 EIGEN_ALIGN_TO_BOUNDARY(64)
-#if EIGEN_MAX_STATIC_ALIGN_BYTES>0
+#if EIGEN_MAX_STATIC_ALIGN_BYTES > 0
 #define EIGEN_ALIGN_MAX EIGEN_ALIGN_TO_BOUNDARY(EIGEN_MAX_STATIC_ALIGN_BYTES)
 #else
 #define EIGEN_ALIGN_MAX
 #endif
 
-
 // Dynamic alignment control
 
-#if defined(EIGEN_DONT_ALIGN) && defined(EIGEN_MAX_ALIGN_BYTES) && EIGEN_MAX_ALIGN_BYTES>0
+#if defined(EIGEN_DONT_ALIGN) && defined(EIGEN_MAX_ALIGN_BYTES) && EIGEN_MAX_ALIGN_BYTES > 0
 #error EIGEN_MAX_ALIGN_BYTES and EIGEN_DONT_ALIGN are both defined with EIGEN_MAX_ALIGN_BYTES!=0. Use EIGEN_MAX_ALIGN_BYTES=0 as a synonym of EIGEN_DONT_ALIGN.
 #endif
 
 #ifdef EIGEN_DONT_ALIGN
-  #ifdef EIGEN_MAX_ALIGN_BYTES
-    #undef EIGEN_MAX_ALIGN_BYTES
-  #endif
-  #define EIGEN_MAX_ALIGN_BYTES 0
+#ifdef EIGEN_MAX_ALIGN_BYTES
+#undef EIGEN_MAX_ALIGN_BYTES
+#endif
+#define EIGEN_MAX_ALIGN_BYTES 0
 #elif !defined(EIGEN_MAX_ALIGN_BYTES)
-  #define EIGEN_MAX_ALIGN_BYTES EIGEN_IDEAL_MAX_ALIGN_BYTES
+#define EIGEN_MAX_ALIGN_BYTES EIGEN_IDEAL_MAX_ALIGN_BYTES
 #endif
 
 #if EIGEN_IDEAL_MAX_ALIGN_BYTES > EIGEN_MAX_ALIGN_BYTES
@@ -163,7 +159,6 @@
 #define EIGEN_DEFAULT_ALIGN_BYTES EIGEN_MAX_ALIGN_BYTES
 #endif
 
-
 #ifndef EIGEN_UNALIGNED_VECTORIZE
 #define EIGEN_UNALIGNED_VECTORIZE 1
 #endif
@@ -172,229 +167,230 @@
 
 // if alignment is disabled, then disable vectorization. Note: EIGEN_MAX_ALIGN_BYTES is the proper check, it takes into
 // account both the user's will (EIGEN_MAX_ALIGN_BYTES,EIGEN_DONT_ALIGN) and our own platform checks
-#if EIGEN_MAX_ALIGN_BYTES==0
-  #ifndef EIGEN_DONT_VECTORIZE
-    #define EIGEN_DONT_VECTORIZE
-  #endif
+#if EIGEN_MAX_ALIGN_BYTES == 0
+#ifndef EIGEN_DONT_VECTORIZE
+#define EIGEN_DONT_VECTORIZE
 #endif
-
+#endif
 
 // The following (except #include <malloc.h> and _M_IX86_FP ??) can likely be
 // removed as gcc 4.1 and msvc 2008 are not supported anyways.
 #if EIGEN_COMP_MSVC
-  #include <malloc.h> // for _aligned_malloc -- need it regardless of whether vectorization is enabled
-  // a user reported that in 64-bit mode, MSVC doesn't care to define _M_IX86_FP.
-  #if (defined(_M_IX86_FP) && (_M_IX86_FP >= 2)) || EIGEN_ARCH_x86_64
-    #define EIGEN_SSE2_ON_MSVC_2008_OR_LATER
-  #endif
+#include <malloc.h>  // for _aligned_malloc -- need it regardless of whether vectorization is enabled
+// a user reported that in 64-bit mode, MSVC doesn't care to define _M_IX86_FP.
+#if (defined(_M_IX86_FP) && (_M_IX86_FP >= 2)) || EIGEN_ARCH_x86_64
+#define EIGEN_SSE2_ON_MSVC_2008_OR_LATER
+#endif
 #else
-  #if defined(__SSE2__)
-    #define EIGEN_SSE2_ON_NON_MSVC
-  #endif
+#if defined(__SSE2__)
+#define EIGEN_SSE2_ON_NON_MSVC
+#endif
 #endif
 
 #if !(defined(EIGEN_DONT_VECTORIZE) || defined(EIGEN_GPUCC))
 
-  #if defined (EIGEN_SSE2_ON_NON_MSVC) || defined(EIGEN_SSE2_ON_MSVC_2008_OR_LATER)
+#if defined(EIGEN_SSE2_ON_NON_MSVC) || defined(EIGEN_SSE2_ON_MSVC_2008_OR_LATER)
 
-    // Defines symbols for compile-time detection of which instructions are
-    // used.
-    // EIGEN_VECTORIZE_YY is defined if and only if the instruction set YY is used
-    #define EIGEN_VECTORIZE
-    #define EIGEN_VECTORIZE_SSE
-    #define EIGEN_VECTORIZE_SSE2
+// Defines symbols for compile-time detection of which instructions are
+// used.
+// EIGEN_VECTORIZE_YY is defined if and only if the instruction set YY is used
+#define EIGEN_VECTORIZE
+#define EIGEN_VECTORIZE_SSE
+#define EIGEN_VECTORIZE_SSE2
 
-    // Detect sse3/ssse3/sse4:
-    // gcc and icc defines __SSE3__, ...
-    // there is no way to know about this on msvc. You can define EIGEN_VECTORIZE_SSE* if you
-    // want to force the use of those instructions with msvc.
-    #ifdef __SSE3__
-      #define EIGEN_VECTORIZE_SSE3
-    #endif
-    #ifdef __SSSE3__
-      #define EIGEN_VECTORIZE_SSSE3
-    #endif
-    #ifdef __SSE4_1__
-      #define EIGEN_VECTORIZE_SSE4_1
-    #endif
-    #ifdef __SSE4_2__
-      #define EIGEN_VECTORIZE_SSE4_2
-    #endif
-    #ifdef __AVX__
-      #ifndef EIGEN_USE_SYCL 
-        #define EIGEN_VECTORIZE_AVX
-      #endif
-      #define EIGEN_VECTORIZE_SSE3
-      #define EIGEN_VECTORIZE_SSSE3
-      #define EIGEN_VECTORIZE_SSE4_1
-      #define EIGEN_VECTORIZE_SSE4_2
-    #endif
-    #ifdef __AVX2__
-      #ifndef EIGEN_USE_SYCL 
-        #define EIGEN_VECTORIZE_AVX2
-        #define EIGEN_VECTORIZE_AVX
-      #endif
-      #define EIGEN_VECTORIZE_SSE3
-      #define EIGEN_VECTORIZE_SSSE3
-      #define EIGEN_VECTORIZE_SSE4_1
-      #define EIGEN_VECTORIZE_SSE4_2
-    #endif
-    #if defined(__FMA__) || (EIGEN_COMP_MSVC && defined(__AVX2__))
-      // MSVC does not expose a switch dedicated for FMA
-      // For MSVC, AVX2 => FMA
-      #define EIGEN_VECTORIZE_FMA
-    #endif
-    #if defined(__AVX512F__)
-      #ifndef EIGEN_VECTORIZE_FMA
-      #if EIGEN_COMP_GNUC
-      #error Please add -mfma to your compiler flags: compiling with -mavx512f alone without SSE/AVX FMA is not supported (bug 1638).
-      #else
-      #error Please enable FMA in your compiler flags (e.g. -mfma): compiling with AVX512 alone without SSE/AVX FMA is not supported (bug 1638).
-      #endif
-      #endif
-      #ifndef EIGEN_USE_SYCL
-        #define EIGEN_VECTORIZE_AVX512
-        #define EIGEN_VECTORIZE_AVX2
-        #define EIGEN_VECTORIZE_AVX
-      #endif
-      #define EIGEN_VECTORIZE_FMA
-      #define EIGEN_VECTORIZE_SSE3
-      #define EIGEN_VECTORIZE_SSSE3
-      #define EIGEN_VECTORIZE_SSE4_1
-      #define EIGEN_VECTORIZE_SSE4_2
-      #ifndef EIGEN_USE_SYCL
-        #ifdef __AVX512DQ__
-          #define EIGEN_VECTORIZE_AVX512DQ
-        #endif
-        #ifdef __AVX512ER__
-          #define EIGEN_VECTORIZE_AVX512ER
-        #endif
-        #ifdef __AVX512BF16__
-          #define EIGEN_VECTORIZE_AVX512BF16
-        #endif
-        #ifdef __AVX512FP16__
-          #ifdef __AVX512VL__
-            #define EIGEN_VECTORIZE_AVX512FP16
-          #else
-            #if EIGEN_COMP_GNUC
-              #error Please add -mavx512vl to your compiler flags: compiling with -mavx512fp16 alone without AVX512-VL is not supported.
-            #else
-              #error Please enable AVX512-VL in your compiler flags (e.g. -mavx512vl): compiling with AVX512-FP16 alone without AVX512-VL is not supported.
-            #endif
-          #endif 
-        #endif
-      #endif
-    #endif
+// Detect sse3/ssse3/sse4:
+// gcc and icc defines __SSE3__, ...
+// there is no way to know about this on msvc. You can define EIGEN_VECTORIZE_SSE* if you
+// want to force the use of those instructions with msvc.
+#ifdef __SSE3__
+#define EIGEN_VECTORIZE_SSE3
+#endif
+#ifdef __SSSE3__
+#define EIGEN_VECTORIZE_SSSE3
+#endif
+#ifdef __SSE4_1__
+#define EIGEN_VECTORIZE_SSE4_1
+#endif
+#ifdef __SSE4_2__
+#define EIGEN_VECTORIZE_SSE4_2
+#endif
+#ifdef __AVX__
+#ifndef EIGEN_USE_SYCL
+#define EIGEN_VECTORIZE_AVX
+#endif
+#define EIGEN_VECTORIZE_SSE3
+#define EIGEN_VECTORIZE_SSSE3
+#define EIGEN_VECTORIZE_SSE4_1
+#define EIGEN_VECTORIZE_SSE4_2
+#endif
+#ifdef __AVX2__
+#ifndef EIGEN_USE_SYCL
+#define EIGEN_VECTORIZE_AVX2
+#define EIGEN_VECTORIZE_AVX
+#endif
+#define EIGEN_VECTORIZE_SSE3
+#define EIGEN_VECTORIZE_SSSE3
+#define EIGEN_VECTORIZE_SSE4_1
+#define EIGEN_VECTORIZE_SSE4_2
+#endif
+#if defined(__FMA__) || (EIGEN_COMP_MSVC && defined(__AVX2__))
+// MSVC does not expose a switch dedicated for FMA
+// For MSVC, AVX2 => FMA
+#define EIGEN_VECTORIZE_FMA
+#endif
+#if defined(__AVX512F__)
+#ifndef EIGEN_VECTORIZE_FMA
+#if EIGEN_COMP_GNUC
+#error Please add -mfma to your compiler flags: compiling with -mavx512f alone without SSE/AVX FMA is not supported (bug 1638).
+#else
+#error Please enable FMA in your compiler flags (e.g. -mfma): compiling with AVX512 alone without SSE/AVX FMA is not supported (bug 1638).
+#endif
+#endif
+#ifndef EIGEN_USE_SYCL
+#define EIGEN_VECTORIZE_AVX512
+#define EIGEN_VECTORIZE_AVX2
+#define EIGEN_VECTORIZE_AVX
+#endif
+#define EIGEN_VECTORIZE_FMA
+#define EIGEN_VECTORIZE_SSE3
+#define EIGEN_VECTORIZE_SSSE3
+#define EIGEN_VECTORIZE_SSE4_1
+#define EIGEN_VECTORIZE_SSE4_2
+#ifndef EIGEN_USE_SYCL
+#ifdef __AVX512DQ__
+#define EIGEN_VECTORIZE_AVX512DQ
+#endif
+#ifdef __AVX512ER__
+#define EIGEN_VECTORIZE_AVX512ER
+#endif
+#ifdef __AVX512BF16__
+#define EIGEN_VECTORIZE_AVX512BF16
+#endif
+#ifdef __AVX512FP16__
+#ifdef __AVX512VL__
+#define EIGEN_VECTORIZE_AVX512FP16
+#else
+#if EIGEN_COMP_GNUC
+#error Please add -mavx512vl to your compiler flags: compiling with -mavx512fp16 alone without AVX512-VL is not supported.
+#else
+#error Please enable AVX512-VL in your compiler flags (e.g. -mavx512vl): compiling with AVX512-FP16 alone without AVX512-VL is not supported.
+#endif
+#endif
+#endif
+#endif
+#endif
 
-    // Disable AVX support on broken xcode versions
-    #if ( EIGEN_COMP_CLANGAPPLE == 11000033 ) && ( __MAC_OS_X_VERSION_MIN_REQUIRED == 101500 )
-      // A nasty bug in the clang compiler shipped with xcode in a common compilation situation
-      // when XCode 11.0 and Mac deployment target macOS 10.15 is https://trac.macports.org/ticket/58776#no1
-      #ifdef EIGEN_VECTORIZE_AVX
-        #undef EIGEN_VECTORIZE_AVX
-        #warning "Disabling AVX support: clang compiler shipped with XCode 11.[012] generates broken assembly with -macosx-version-min=10.15 and AVX enabled. "
-        #ifdef EIGEN_VECTORIZE_AVX2
-          #undef EIGEN_VECTORIZE_AVX2
-        #endif
-        #ifdef EIGEN_VECTORIZE_FMA
-          #undef EIGEN_VECTORIZE_FMA
-        #endif
-        #ifdef EIGEN_VECTORIZE_AVX512
-          #undef EIGEN_VECTORIZE_AVX512
-        #endif
-        #ifdef EIGEN_VECTORIZE_AVX512DQ
-          #undef EIGEN_VECTORIZE_AVX512DQ
-        #endif
-        #ifdef EIGEN_VECTORIZE_AVX512ER
-          #undef EIGEN_VECTORIZE_AVX512ER
-        #endif
-      #endif
-      // NOTE: Confirmed test failures in XCode 11.0, and XCode 11.2 with  -macosx-version-min=10.15 and AVX
-      // NOTE using -macosx-version-min=10.15 with Xcode 11.0 results in runtime segmentation faults in many tests, 11.2 produce core dumps in 3 tests
-      // NOTE using -macosx-version-min=10.14 produces functioning and passing tests in all cases
-      // NOTE __clang_version__ "11.0.0 (clang-1100.0.33.8)"  XCode 11.0 <- Produces many segfault and core dumping tests
-      //                                                                    with  -macosx-version-min=10.15 and AVX
-      // NOTE __clang_version__ "11.0.0 (clang-1100.0.33.12)" XCode 11.2 <- Produces 3 core dumping tests with  
-      //                                                                    -macosx-version-min=10.15 and AVX
-    #endif
+// Disable AVX support on broken xcode versions
+#if (EIGEN_COMP_CLANGAPPLE == 11000033) && (__MAC_OS_X_VERSION_MIN_REQUIRED == 101500)
+// A nasty bug in the clang compiler shipped with xcode in a common compilation situation
+// when XCode 11.0 and Mac deployment target macOS 10.15 is https://trac.macports.org/ticket/58776#no1
+#ifdef EIGEN_VECTORIZE_AVX
+#undef EIGEN_VECTORIZE_AVX
+#warning \
+    "Disabling AVX support: clang compiler shipped with XCode 11.[012] generates broken assembly with -macosx-version-min=10.15 and AVX enabled. "
+#ifdef EIGEN_VECTORIZE_AVX2
+#undef EIGEN_VECTORIZE_AVX2
+#endif
+#ifdef EIGEN_VECTORIZE_FMA
+#undef EIGEN_VECTORIZE_FMA
+#endif
+#ifdef EIGEN_VECTORIZE_AVX512
+#undef EIGEN_VECTORIZE_AVX512
+#endif
+#ifdef EIGEN_VECTORIZE_AVX512DQ
+#undef EIGEN_VECTORIZE_AVX512DQ
+#endif
+#ifdef EIGEN_VECTORIZE_AVX512ER
+#undef EIGEN_VECTORIZE_AVX512ER
+#endif
+#endif
+// NOTE: Confirmed test failures in XCode 11.0, and XCode 11.2 with  -macosx-version-min=10.15 and AVX
+// NOTE using -macosx-version-min=10.15 with Xcode 11.0 results in runtime segmentation faults in many tests, 11.2
+// produce core dumps in 3 tests NOTE using -macosx-version-min=10.14 produces functioning and passing tests in all
+// cases NOTE __clang_version__ "11.0.0 (clang-1100.0.33.8)"  XCode 11.0 <- Produces many segfault and core dumping
+// tests
+//                                                                    with  -macosx-version-min=10.15 and AVX
+// NOTE __clang_version__ "11.0.0 (clang-1100.0.33.12)" XCode 11.2 <- Produces 3 core dumping tests with
+//                                                                    -macosx-version-min=10.15 and AVX
+#endif
 
-    // include files
+// include files
 
-    // This extern "C" works around a MINGW-w64 compilation issue
-    // https://sourceforge.net/tracker/index.php?func=detail&aid=3018394&group_id=202880&atid=983354
-    // In essence, intrin.h is included by windows.h and also declares intrinsics (just as emmintrin.h etc. below do).
-    // However, intrin.h uses an extern "C" declaration, and g++ thus complains of duplicate declarations
-    // with conflicting linkage.  The linkage for intrinsics doesn't matter, but at that stage the compiler doesn't know;
-    // so, to avoid compile errors when windows.h is included after Eigen/Core, ensure intrinsics are extern "C" here too.
-    // notice that since these are C headers, the extern "C" is theoretically needed anyways.
-    extern "C" {
-      // In theory we should only include immintrin.h and not the other *mmintrin.h header files directly.
-      // Doing so triggers some issues with ICC. However old gcc versions seems to not have this file, thus:
-      #if EIGEN_COMP_ICC >= 1110 || EIGEN_COMP_EMSCRIPTEN
-        #include <immintrin.h>
-      #else
-        #include <mmintrin.h>
-        #include <emmintrin.h>
-        #include <xmmintrin.h>
-        #ifdef  EIGEN_VECTORIZE_SSE3
-        #include <pmmintrin.h>
-        #endif
-        #ifdef EIGEN_VECTORIZE_SSSE3
-        #include <tmmintrin.h>
-        #endif
-        #ifdef EIGEN_VECTORIZE_SSE4_1
-        #include <smmintrin.h>
-        #endif
-        #ifdef EIGEN_VECTORIZE_SSE4_2
-        #include <nmmintrin.h>
-        #endif
-        #if defined(EIGEN_VECTORIZE_AVX) || defined(EIGEN_VECTORIZE_AVX512)
-        #include <immintrin.h>
-        #endif
-      #endif
-    } // end extern "C"
+// This extern "C" works around a MINGW-w64 compilation issue
+// https://sourceforge.net/tracker/index.php?func=detail&aid=3018394&group_id=202880&atid=983354
+// In essence, intrin.h is included by windows.h and also declares intrinsics (just as emmintrin.h etc. below do).
+// However, intrin.h uses an extern "C" declaration, and g++ thus complains of duplicate declarations
+// with conflicting linkage.  The linkage for intrinsics doesn't matter, but at that stage the compiler doesn't know;
+// so, to avoid compile errors when windows.h is included after Eigen/Core, ensure intrinsics are extern "C" here too.
+// notice that since these are C headers, the extern "C" is theoretically needed anyways.
+extern "C" {
+// In theory we should only include immintrin.h and not the other *mmintrin.h header files directly.
+// Doing so triggers some issues with ICC. However old gcc versions seems to not have this file, thus:
+#if EIGEN_COMP_ICC >= 1110 || EIGEN_COMP_EMSCRIPTEN
+#include <immintrin.h>
+#else
+#include <mmintrin.h>
+#include <emmintrin.h>
+#include <xmmintrin.h>
+#ifdef EIGEN_VECTORIZE_SSE3
+#include <pmmintrin.h>
+#endif
+#ifdef EIGEN_VECTORIZE_SSSE3
+#include <tmmintrin.h>
+#endif
+#ifdef EIGEN_VECTORIZE_SSE4_1
+#include <smmintrin.h>
+#endif
+#ifdef EIGEN_VECTORIZE_SSE4_2
+#include <nmmintrin.h>
+#endif
+#if defined(EIGEN_VECTORIZE_AVX) || defined(EIGEN_VECTORIZE_AVX512)
+#include <immintrin.h>
+#endif
+#endif
+}  // end extern "C"
 
-  #elif defined(__VSX__) && !defined(__APPLE__)
+#elif defined(__VSX__) && !defined(__APPLE__)
 
-    #define EIGEN_VECTORIZE
-    #define EIGEN_VECTORIZE_VSX 1
-    #include <altivec.h>
-    // We need to #undef all these ugly tokens defined in <altivec.h>
-    // => use __vector instead of vector
-    #undef bool
-    #undef vector
-    #undef pixel
+#define EIGEN_VECTORIZE
+#define EIGEN_VECTORIZE_VSX 1
+#include <altivec.h>
+// We need to #undef all these ugly tokens defined in <altivec.h>
+// => use __vector instead of vector
+#undef bool
+#undef vector
+#undef pixel
 
-  #elif defined __ALTIVEC__
+#elif defined __ALTIVEC__
 
-    #define EIGEN_VECTORIZE
-    #define EIGEN_VECTORIZE_ALTIVEC
-    #include <altivec.h>
-    // We need to #undef all these ugly tokens defined in <altivec.h>
-    // => use __vector instead of vector
-    #undef bool
-    #undef vector
-    #undef pixel
+#define EIGEN_VECTORIZE
+#define EIGEN_VECTORIZE_ALTIVEC
+#include <altivec.h>
+// We need to #undef all these ugly tokens defined in <altivec.h>
+// => use __vector instead of vector
+#undef bool
+#undef vector
+#undef pixel
 
-  #elif ((defined  __ARM_NEON) || (defined __ARM_NEON__)) && !(defined EIGEN_ARM64_USE_SVE)
+#elif ((defined __ARM_NEON) || (defined __ARM_NEON__)) && !(defined EIGEN_ARM64_USE_SVE)
 
-    #define EIGEN_VECTORIZE
-    #define EIGEN_VECTORIZE_NEON
-    #include <arm_neon.h>
+#define EIGEN_VECTORIZE
+#define EIGEN_VECTORIZE_NEON
+#include <arm_neon.h>
 
-  // We currently require SVE to be enabled explicitly via EIGEN_ARM64_USE_SVE and
-  // will not select the backend automatically
-  #elif (defined __ARM_FEATURE_SVE) && (defined EIGEN_ARM64_USE_SVE)
+// We currently require SVE to be enabled explicitly via EIGEN_ARM64_USE_SVE and
+// will not select the backend automatically
+#elif (defined __ARM_FEATURE_SVE) && (defined EIGEN_ARM64_USE_SVE)
 
-    #define EIGEN_VECTORIZE
-    #define EIGEN_VECTORIZE_SVE
-    #include <arm_sve.h>
+#define EIGEN_VECTORIZE
+#define EIGEN_VECTORIZE_SVE
+#include <arm_sve.h>
 
-    // Since we depend on knowing SVE vector lengths at compile-time, we need
-    // to ensure a fixed lengths is set
-    #if defined __ARM_FEATURE_SVE_BITS
-      #define EIGEN_ARM64_SVE_VL __ARM_FEATURE_SVE_BITS
-    #else
+// Since we depend on knowing SVE vector lengths at compile-time, we need
+// to ensure a fixed lengths is set
+#if defined __ARM_FEATURE_SVE_BITS
+#define EIGEN_ARM64_SVE_VL __ARM_FEATURE_SVE_BITS
+#else
 #error "Eigen requires a fixed SVE lector length but EIGEN_ARM64_SVE_VL is not set."
 #endif
 
@@ -432,46 +428,45 @@
 // compilers seem to follow this. We therefore include it explicitly.
 // See also: https://bugs.llvm.org/show_bug.cgi?id=47955
 #if defined(EIGEN_HAS_ARM64_FP16_SCALAR_ARITHMETIC)
-  #include <arm_fp16.h>
+#include <arm_fp16.h>
 #endif
 
-#if defined(__F16C__) && !defined(EIGEN_GPUCC) && (!EIGEN_COMP_CLANG_STRICT || EIGEN_CLANG_STRICT_AT_LEAST(3,8,0))
-  // We can use the optimized fp16 to float and float to fp16 conversion routines
-  #define EIGEN_HAS_FP16_C
+#if defined(__F16C__) && !defined(EIGEN_GPUCC) && (!EIGEN_COMP_CLANG_STRICT || EIGEN_CLANG_STRICT_AT_LEAST(3, 8, 0))
+// We can use the optimized fp16 to float and float to fp16 conversion routines
+#define EIGEN_HAS_FP16_C
 
-  #if EIGEN_COMP_GNUC
-    // Make sure immintrin.h is included, even if e.g. vectorization is
-    // explicitly disabled (see also issue #2395).
-    // Note that FP16C intrinsics for gcc and clang are included by immintrin.h,
-    // as opposed to emmintrin.h as suggested by Intel:
-    // https://software.intel.com/sites/landingpage/IntrinsicsGuide/#othertechs=FP16C&expand=1711
-    #include <immintrin.h>
-  #endif
+#if EIGEN_COMP_GNUC
+// Make sure immintrin.h is included, even if e.g. vectorization is
+// explicitly disabled (see also issue #2395).
+// Note that FP16C intrinsics for gcc and clang are included by immintrin.h,
+// as opposed to emmintrin.h as suggested by Intel:
+// https://software.intel.com/sites/landingpage/IntrinsicsGuide/#othertechs=FP16C&expand=1711
+#include <immintrin.h>
+#endif
 #endif
 
 #if defined EIGEN_CUDACC
-  #define EIGEN_VECTORIZE_GPU
-  #include <vector_types.h>
-  #if EIGEN_CUDA_SDK_VER >= 70500
-    #define EIGEN_HAS_CUDA_FP16
-  #endif
+#define EIGEN_VECTORIZE_GPU
+#include <vector_types.h>
+#if EIGEN_CUDA_SDK_VER >= 70500
+#define EIGEN_HAS_CUDA_FP16
+#endif
 #endif
 
 #if defined(EIGEN_HAS_CUDA_FP16)
-  #include <cuda_runtime_api.h>
-  #include <cuda_fp16.h>
+#include <cuda_runtime_api.h>
+#include <cuda_fp16.h>
 #endif
 
 #if defined(EIGEN_HIPCC)
-  #define EIGEN_VECTORIZE_GPU
-  #include <hip/hip_vector_types.h>
-  #define EIGEN_HAS_HIP_FP16
-  #include <hip/hip_fp16.h>
-  #define EIGEN_HAS_HIP_BF16
-  #include <hip/hip_bfloat16.h>
+#define EIGEN_VECTORIZE_GPU
+#include <hip/hip_vector_types.h>
+#define EIGEN_HAS_HIP_FP16
+#include <hip/hip_fp16.h>
+#define EIGEN_HAS_HIP_BF16
+#include <hip/hip_bfloat16.h>
 #endif
 
-
 /** \brief Namespace containing all symbols from the %Eigen library. */
 // IWYU pragma: private
 #include "../InternalHeaderCheck.h"
@@ -510,7 +505,6 @@
 #endif
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-
-#endif // EIGEN_CONFIGURE_VECTORIZATION_H
+#endif  // EIGEN_CONFIGURE_VECTORIZATION_H
diff --git a/Eigen/src/Core/util/Constants.h b/Eigen/src/Core/util/Constants.h
index 3496c6c..8b06c67 100644
--- a/Eigen/src/Core/util/Constants.h
+++ b/Eigen/src/Core/util/Constants.h
@@ -18,166 +18,167 @@
 namespace Eigen {
 
 /** This value means that a positive quantity (e.g., a size) is not known at compile-time, and that instead the value is
-  * stored in some runtime variable.
-  *
-  * Changing the value of Dynamic breaks the ABI, as Dynamic is often used as a template parameter for Matrix.
-  */
+ * stored in some runtime variable.
+ *
+ * Changing the value of Dynamic breaks the ABI, as Dynamic is often used as a template parameter for Matrix.
+ */
 const int Dynamic = -1;
 
-/** This value means that a signed quantity (e.g., a signed index) is not known at compile-time, and that instead its value
-  * has to be specified at runtime.
-  */
+/** This value means that a signed quantity (e.g., a signed index) is not known at compile-time, and that instead its
+ * value has to be specified at runtime.
+ */
 const int DynamicIndex = 0xffffff;
 
 /** This value means that the increment to go from one value to another in a sequence is not constant for each step.
-  */
+ */
 const int UndefinedIncr = 0xfffffe;
 
 /** This value means +Infinity; it is currently used only as the p parameter to MatrixBase::lpNorm<int>().
-  * The value Infinity there means the L-infinity norm.
-  */
+ * The value Infinity there means the L-infinity norm.
+ */
 const int Infinity = -1;
 
 /** This value means that the cost to evaluate an expression coefficient is either very expensive or
-  * cannot be known at compile time.
-  *
-  * This value has to be positive to (1) simplify cost computation, and (2) allow to distinguish between a very expensive and very very expensive expressions.
-  * It thus must also be large enough to make sure unrolling won't happen and that sub expressions will be evaluated, but not too large to avoid overflow.
-  */
+ * cannot be known at compile time.
+ *
+ * This value has to be positive to (1) simplify cost computation, and (2) allow to distinguish between a very expensive
+ * and very very expensive expressions. It thus must also be large enough to make sure unrolling won't happen and that
+ * sub expressions will be evaluated, but not too large to avoid overflow.
+ */
 const int HugeCost = 10000;
 
 /** \defgroup flags Flags
-  * \ingroup Core_Module
-  *
-  * These are the possible bits which can be OR'ed to constitute the flags of a matrix or
-  * expression.
-  *
-  * It is important to note that these flags are a purely compile-time notion. They are a compile-time property of
-  * an expression type, implemented as enum's. They are not stored in memory at runtime, and they do not incur any
-  * runtime overhead.
-  *
-  * \sa MatrixBase::Flags
-  */
+ * \ingroup Core_Module
+ *
+ * These are the possible bits which can be OR'ed to constitute the flags of a matrix or
+ * expression.
+ *
+ * It is important to note that these flags are a purely compile-time notion. They are a compile-time property of
+ * an expression type, implemented as enum's. They are not stored in memory at runtime, and they do not incur any
+ * runtime overhead.
+ *
+ * \sa MatrixBase::Flags
+ */
 
 /** \ingroup flags
-  *
-  * for a matrix, this means that the storage order is row-major.
-  * If this bit is not set, the storage order is column-major.
-  * For an expression, this determines the storage order of
-  * the matrix created by evaluation of that expression.
-  * \sa \blank  \ref TopicStorageOrders */
+ *
+ * for a matrix, this means that the storage order is row-major.
+ * If this bit is not set, the storage order is column-major.
+ * For an expression, this determines the storage order of
+ * the matrix created by evaluation of that expression.
+ * \sa \blank  \ref TopicStorageOrders */
 const unsigned int RowMajorBit = 0x1;
 
 /** \ingroup flags
-  * means the expression should be evaluated by the calling expression */
+ * means the expression should be evaluated by the calling expression */
 const unsigned int EvalBeforeNestingBit = 0x2;
 
 /** \ingroup flags
-  * \deprecated
-  * means the expression should be evaluated before any assignment */
-EIGEN_DEPRECATED
-const unsigned int EvalBeforeAssigningBit = 0x4; // FIXME deprecated
+ * \deprecated
+ * means the expression should be evaluated before any assignment */
+EIGEN_DEPRECATED const unsigned int EvalBeforeAssigningBit = 0x4;  // FIXME deprecated
 
 /** \ingroup flags
-  *
-  * Short version: means the expression might be vectorized
-  *
-  * Long version: means that the coefficients can be handled by packets
-  * and start at a memory location whose alignment meets the requirements
-  * of the present CPU architecture for optimized packet access. In the fixed-size
-  * case, there is the additional condition that it be possible to access all the
-  * coefficients by packets (this implies the requirement that the size be a multiple of 16 bytes,
-  * and that any nontrivial strides don't break the alignment). In the dynamic-size case,
-  * there is no such condition on the total size and strides, so it might not be possible to access
-  * all coeffs by packets.
-  *
-  * \note This bit can be set regardless of whether vectorization is actually enabled.
-  *       To check for actual vectorizability, see \a ActualPacketAccessBit.
-  */
+ *
+ * Short version: means the expression might be vectorized
+ *
+ * Long version: means that the coefficients can be handled by packets
+ * and start at a memory location whose alignment meets the requirements
+ * of the present CPU architecture for optimized packet access. In the fixed-size
+ * case, there is the additional condition that it be possible to access all the
+ * coefficients by packets (this implies the requirement that the size be a multiple of 16 bytes,
+ * and that any nontrivial strides don't break the alignment). In the dynamic-size case,
+ * there is no such condition on the total size and strides, so it might not be possible to access
+ * all coeffs by packets.
+ *
+ * \note This bit can be set regardless of whether vectorization is actually enabled.
+ *       To check for actual vectorizability, see \a ActualPacketAccessBit.
+ */
 const unsigned int PacketAccessBit = 0x8;
 
 #ifdef EIGEN_VECTORIZE
 /** \ingroup flags
-  *
-  * If vectorization is enabled (EIGEN_VECTORIZE is defined) this constant
-  * is set to the value \a PacketAccessBit.
-  *
-  * If vectorization is not enabled (EIGEN_VECTORIZE is not defined) this constant
-  * is set to the value 0.
-  */
+ *
+ * If vectorization is enabled (EIGEN_VECTORIZE is defined) this constant
+ * is set to the value \a PacketAccessBit.
+ *
+ * If vectorization is not enabled (EIGEN_VECTORIZE is not defined) this constant
+ * is set to the value 0.
+ */
 const unsigned int ActualPacketAccessBit = PacketAccessBit;
 #else
 const unsigned int ActualPacketAccessBit = 0x0;
 #endif
 
 /** \ingroup flags
-  *
-  * Short version: means the expression can be seen as 1D vector.
-  *
-  * Long version: means that one can access the coefficients
-  * of this expression by coeff(int), and coeffRef(int) in the case of a lvalue expression. These
-  * index-based access methods are guaranteed
-  * to not have to do any runtime computation of a (row, col)-pair from the index, so that it
-  * is guaranteed that whenever it is available, index-based access is at least as fast as
-  * (row,col)-based access. Expressions for which that isn't possible don't have the LinearAccessBit.
-  *
-  * If both PacketAccessBit and LinearAccessBit are set, then the
-  * packets of this expression can be accessed by packet(int), and writePacket(int) in the case of a
-  * lvalue expression.
-  *
-  * Typically, all vector expressions have the LinearAccessBit, but there is one exception:
-  * Product expressions don't have it, because it would be troublesome for vectorization, even when the
-  * Product is a vector expression. Thus, vector Product expressions allow index-based coefficient access but
-  * not index-based packet access, so they don't have the LinearAccessBit.
-  */
+ *
+ * Short version: means the expression can be seen as 1D vector.
+ *
+ * Long version: means that one can access the coefficients
+ * of this expression by coeff(int), and coeffRef(int) in the case of a lvalue expression. These
+ * index-based access methods are guaranteed
+ * to not have to do any runtime computation of a (row, col)-pair from the index, so that it
+ * is guaranteed that whenever it is available, index-based access is at least as fast as
+ * (row,col)-based access. Expressions for which that isn't possible don't have the LinearAccessBit.
+ *
+ * If both PacketAccessBit and LinearAccessBit are set, then the
+ * packets of this expression can be accessed by packet(int), and writePacket(int) in the case of a
+ * lvalue expression.
+ *
+ * Typically, all vector expressions have the LinearAccessBit, but there is one exception:
+ * Product expressions don't have it, because it would be troublesome for vectorization, even when the
+ * Product is a vector expression. Thus, vector Product expressions allow index-based coefficient access but
+ * not index-based packet access, so they don't have the LinearAccessBit.
+ */
 const unsigned int LinearAccessBit = 0x10;
 
 /** \ingroup flags
-  *
-  * Means the expression has a coeffRef() method, i.e. is writable as its individual coefficients are directly addressable.
-  * This rules out read-only expressions.
-  *
-  * Note that DirectAccessBit and LvalueBit are mutually orthogonal, as there are examples of expression having one but not
-  * the other:
-  *   \li writable expressions that don't have a very simple memory layout as a strided array, have LvalueBit but not DirectAccessBit
-  *   \li Map-to-const expressions, for example Map<const Matrix>, have DirectAccessBit but not LvalueBit
-  *
-  * Expressions having LvalueBit also have their coeff() method returning a const reference instead of returning a new value.
-  */
+ *
+ * Means the expression has a coeffRef() method, i.e. is writable as its individual coefficients are directly
+ * addressable. This rules out read-only expressions.
+ *
+ * Note that DirectAccessBit and LvalueBit are mutually orthogonal, as there are examples of expression having one but
+ * not the other: \li writable expressions that don't have a very simple memory layout as a strided array, have
+ * LvalueBit but not DirectAccessBit \li Map-to-const expressions, for example Map<const Matrix>, have DirectAccessBit
+ * but not LvalueBit
+ *
+ * Expressions having LvalueBit also have their coeff() method returning a const reference instead of returning a new
+ * value.
+ */
 const unsigned int LvalueBit = 0x20;
 
 /** \ingroup flags
-  *
-  * Means that the underlying array of coefficients can be directly accessed as a plain strided array. The memory layout
-  * of the array of coefficients must be exactly the natural one suggested by rows(), cols(),
-  * outerStride(), innerStride(), and the RowMajorBit. This rules out expressions such as Diagonal, whose coefficients,
-  * though referencable, do not have such a regular memory layout.
-  *
-  * See the comment on LvalueBit for an explanation of how LvalueBit and DirectAccessBit are mutually orthogonal.
-  */
+ *
+ * Means that the underlying array of coefficients can be directly accessed as a plain strided array. The memory layout
+ * of the array of coefficients must be exactly the natural one suggested by rows(), cols(),
+ * outerStride(), innerStride(), and the RowMajorBit. This rules out expressions such as Diagonal, whose coefficients,
+ * though referencable, do not have such a regular memory layout.
+ *
+ * See the comment on LvalueBit for an explanation of how LvalueBit and DirectAccessBit are mutually orthogonal.
+ */
 const unsigned int DirectAccessBit = 0x40;
 
 /** \deprecated \ingroup flags
-  *
-  * means the first coefficient packet is guaranteed to be aligned.
-  * An expression cannot have the AlignedBit without the PacketAccessBit flag.
-  * In other words, this means we are allow to perform an aligned packet access to the first element regardless
-  * of the expression kind:
-  * \code
-  * expression.packet<Aligned>(0);
-  * \endcode
-  */
+ *
+ * means the first coefficient packet is guaranteed to be aligned.
+ * An expression cannot have the AlignedBit without the PacketAccessBit flag.
+ * In other words, this means we are allow to perform an aligned packet access to the first element regardless
+ * of the expression kind:
+ * \code
+ * expression.packet<Aligned>(0);
+ * \endcode
+ */
 EIGEN_DEPRECATED const unsigned int AlignedBit = 0x80;
 
 const unsigned int NestByRefBit = 0x100;
 
 /** \ingroup flags
-  *
-  * for an expression, this means that the storage order
-  * can be either row-major or column-major.
-  * The precise choice will be decided at evaluation time or when
-  * combined with other expressions.
-  * \sa \blank  \ref RowMajorBit, \ref TopicStorageOrders */
+ *
+ * for an expression, this means that the storage order
+ * can be either row-major or column-major.
+ * The precise choice will be decided at evaluation time or when
+ * combined with other expressions.
+ * \sa \blank  \ref RowMajorBit, \ref TopicStorageOrders */
 const unsigned int NoPreferredStorageOrderBit = 0x200;
 
 /** \ingroup flags
@@ -193,65 +194,63 @@
   */
 const unsigned int CompressedAccessBit = 0x400;
 
-
 // list of flags that are inherited by default
-const unsigned int HereditaryBits = RowMajorBit
-                                  | EvalBeforeNestingBit;
+const unsigned int HereditaryBits = RowMajorBit | EvalBeforeNestingBit;
 
 /** \defgroup enums Enumerations
-  * \ingroup Core_Module
-  *
-  * Various enumerations used in %Eigen. Many of these are used as template parameters.
-  */
+ * \ingroup Core_Module
+ *
+ * Various enumerations used in %Eigen. Many of these are used as template parameters.
+ */
 
 /** \ingroup enums
-  * Enum containing possible values for the \c Mode or \c UpLo parameter of
-  * MatrixBase::selfadjointView() and MatrixBase::triangularView(), and selfadjoint solvers. */
+ * Enum containing possible values for the \c Mode or \c UpLo parameter of
+ * MatrixBase::selfadjointView() and MatrixBase::triangularView(), and selfadjoint solvers. */
 enum UpLoType {
   /** View matrix as a lower triangular matrix. */
-  Lower=0x1,                      
+  Lower = 0x1,
   /** View matrix as an upper triangular matrix. */
-  Upper=0x2,                      
+  Upper = 0x2,
   /** %Matrix has ones on the diagonal; to be used in combination with #Lower or #Upper. */
-  UnitDiag=0x4, 
+  UnitDiag = 0x4,
   /** %Matrix has zeros on the diagonal; to be used in combination with #Lower or #Upper. */
-  ZeroDiag=0x8,
+  ZeroDiag = 0x8,
   /** View matrix as a lower triangular matrix with ones on the diagonal. */
-  UnitLower=UnitDiag|Lower, 
+  UnitLower = UnitDiag | Lower,
   /** View matrix as an upper triangular matrix with ones on the diagonal. */
-  UnitUpper=UnitDiag|Upper,
+  UnitUpper = UnitDiag | Upper,
   /** View matrix as a lower triangular matrix with zeros on the diagonal. */
-  StrictlyLower=ZeroDiag|Lower, 
+  StrictlyLower = ZeroDiag | Lower,
   /** View matrix as an upper triangular matrix with zeros on the diagonal. */
-  StrictlyUpper=ZeroDiag|Upper,
+  StrictlyUpper = ZeroDiag | Upper,
   /** Used in BandMatrix and SelfAdjointView to indicate that the matrix is self-adjoint. */
-  SelfAdjoint=0x10,
+  SelfAdjoint = 0x10,
   /** Used to support symmetric, non-selfadjoint, complex matrices. */
-  Symmetric=0x20
+  Symmetric = 0x20
 };
 
 /** \ingroup enums
-  * Enum for indicating whether a buffer is aligned or not. */
+ * Enum for indicating whether a buffer is aligned or not. */
 enum AlignmentType {
-  Unaligned=0,        /**< Data pointer has no specific alignment. */
-  Aligned8=8,         /**< Data pointer is aligned on a 8 bytes boundary. */
-  Aligned16=16,       /**< Data pointer is aligned on a 16 bytes boundary. */
-  Aligned32=32,       /**< Data pointer is aligned on a 32 bytes boundary. */
-  Aligned64=64,       /**< Data pointer is aligned on a 64 bytes boundary. */
-  Aligned128=128,     /**< Data pointer is aligned on a 128 bytes boundary. */
-  AlignedMask=255,
-  Aligned=16,         /**< \deprecated Synonym for Aligned16. */
-#if EIGEN_MAX_ALIGN_BYTES==128
+  Unaligned = 0,    /**< Data pointer has no specific alignment. */
+  Aligned8 = 8,     /**< Data pointer is aligned on a 8 bytes boundary. */
+  Aligned16 = 16,   /**< Data pointer is aligned on a 16 bytes boundary. */
+  Aligned32 = 32,   /**< Data pointer is aligned on a 32 bytes boundary. */
+  Aligned64 = 64,   /**< Data pointer is aligned on a 64 bytes boundary. */
+  Aligned128 = 128, /**< Data pointer is aligned on a 128 bytes boundary. */
+  AlignedMask = 255,
+  Aligned = 16, /**< \deprecated Synonym for Aligned16. */
+#if EIGEN_MAX_ALIGN_BYTES == 128
   AlignedMax = Aligned128
-#elif EIGEN_MAX_ALIGN_BYTES==64
+#elif EIGEN_MAX_ALIGN_BYTES == 64
   AlignedMax = Aligned64
-#elif EIGEN_MAX_ALIGN_BYTES==32
+#elif EIGEN_MAX_ALIGN_BYTES == 32
   AlignedMax = Aligned32
-#elif EIGEN_MAX_ALIGN_BYTES==16
+#elif EIGEN_MAX_ALIGN_BYTES == 16
   AlignedMax = Aligned16
-#elif EIGEN_MAX_ALIGN_BYTES==8
+#elif EIGEN_MAX_ALIGN_BYTES == 8
   AlignedMax = Aligned8
-#elif EIGEN_MAX_ALIGN_BYTES==0
+#elif EIGEN_MAX_ALIGN_BYTES == 0
   AlignedMax = Unaligned
 #else
 #error Invalid value for EIGEN_MAX_ALIGN_BYTES
@@ -259,35 +258,35 @@
 };
 
 /** \ingroup enums
-  * Enum containing possible values for the \p Direction parameter of
-  * Reverse, PartialReduxExpr and VectorwiseOp. */
-enum DirectionType { 
-  /** For Reverse, all columns are reversed; 
-    * for PartialReduxExpr and VectorwiseOp, act on columns. */
-  Vertical, 
-  /** For Reverse, all rows are reversed; 
-    * for PartialReduxExpr and VectorwiseOp, act on rows. */
-  Horizontal, 
-  /** For Reverse, both rows and columns are reversed; 
-    * not used for PartialReduxExpr and VectorwiseOp. */
-  BothDirections 
+ * Enum containing possible values for the \p Direction parameter of
+ * Reverse, PartialReduxExpr and VectorwiseOp. */
+enum DirectionType {
+  /** For Reverse, all columns are reversed;
+   * for PartialReduxExpr and VectorwiseOp, act on columns. */
+  Vertical,
+  /** For Reverse, all rows are reversed;
+   * for PartialReduxExpr and VectorwiseOp, act on rows. */
+  Horizontal,
+  /** For Reverse, both rows and columns are reversed;
+   * not used for PartialReduxExpr and VectorwiseOp. */
+  BothDirections
 };
 
 /** \internal \ingroup enums
-  * Enum to specify how to traverse the entries of a matrix. */
+ * Enum to specify how to traverse the entries of a matrix. */
 enum TraversalType {
   /** \internal Default traversal, no vectorization, no index-based access */
   DefaultTraversal,
   /** \internal No vectorization, use index-based access to have only one for loop instead of 2 nested loops */
   LinearTraversal,
   /** \internal Equivalent to a slice vectorization for fixed-size matrices having good alignment
-    * and good size */
+   * and good size */
   InnerVectorizedTraversal,
   /** \internal Vectorization path using a single loop plus scalar loops for the
-    * unaligned boundaries */
+   * unaligned boundaries */
   LinearVectorizedTraversal,
   /** \internal Generic vectorization path using one vectorized loop per row/column with some
-    * scalar loops to handle the unaligned boundaries */
+   * scalar loops to handle the unaligned boundaries */
   SliceVectorizedTraversal,
   /** \internal Special case to properly handle incompatible scalar types or other defecting cases*/
   InvalidTraversal,
@@ -296,27 +295,24 @@
 };
 
 /** \internal \ingroup enums
-  * Enum to specify whether to unroll loops when traversing over the entries of a matrix. */
+ * Enum to specify whether to unroll loops when traversing over the entries of a matrix. */
 enum UnrollingType {
   /** \internal Do not unroll loops. */
   NoUnrolling,
   /** \internal Unroll only the inner loop, but not the outer loop. */
   InnerUnrolling,
-  /** \internal Unroll both the inner and the outer loop. If there is only one loop, 
-    * because linear traversal is used, then unroll that loop. */
+  /** \internal Unroll both the inner and the outer loop. If there is only one loop,
+   * because linear traversal is used, then unroll that loop. */
   CompleteUnrolling
 };
 
 /** \internal \ingroup enums
-  * Enum to specify whether to use the default (built-in) implementation or the specialization. */
-enum SpecializedType {
-  Specialized,
-  BuiltIn
-};
+ * Enum to specify whether to use the default (built-in) implementation or the specialization. */
+enum SpecializedType { Specialized, BuiltIn };
 
 /** \ingroup enums
-  * Enum containing possible values for the \p Options_ template parameter of
-  * Matrix, Array and BandMatrix. */
+ * Enum containing possible values for the \p Options_ template parameter of
+ * Matrix, Array and BandMatrix. */
 enum StorageOptions {
   /** Storage order is column major (see \ref TopicStorageOrders). */
   ColMajor = 0,
@@ -329,7 +325,7 @@
 };
 
 /** \ingroup enums
-  * Enum for specifying whether to apply or solve on the left or right. */
+ * Enum for specifying whether to apply or solve on the left or right. */
 enum SideType {
   /** Apply transformation on the left. */
   OnTheLeft = 1,
@@ -355,74 +351,71 @@
  *     EIGEN_UNUSED NoChange_t NoChange;
  *   }
  *
- * on the ground that it feels dangerous to disambiguate overloaded functions on enum/integer types.  
+ * on the ground that it feels dangerous to disambiguate overloaded functions on enum/integer types.
  * However, this leads to "variable declared but never referenced" warnings on Intel Composer XE,
  * and we do not know how to get rid of them (bug 450).
  */
 
-enum NoChange_t   { NoChange };
+enum NoChange_t { NoChange };
 enum Sequential_t { Sequential };
-enum Default_t    { Default };
+enum Default_t { Default };
 
 /** \internal \ingroup enums
-  * Used in AmbiVector. */
-enum AmbiVectorMode {
-  IsDense         = 0,
-  IsSparse
-};
+ * Used in AmbiVector. */
+enum AmbiVectorMode { IsDense = 0, IsSparse };
 
 /** \ingroup enums
-  * Used as template parameter in DenseCoeffBase and MapBase to indicate 
-  * which accessors should be provided. */
+ * Used as template parameter in DenseCoeffBase and MapBase to indicate
+ * which accessors should be provided. */
 enum AccessorLevels {
   /** Read-only access via a member function. */
-  ReadOnlyAccessors, 
+  ReadOnlyAccessors,
   /** Read/write access via member functions. */
-  WriteAccessors, 
+  WriteAccessors,
   /** Direct read-only access to the coefficients. */
-  DirectAccessors, 
+  DirectAccessors,
   /** Direct read/write access to the coefficients. */
   DirectWriteAccessors
 };
 
 /** \ingroup enums
-  * Enum with options to give to various decompositions. */
+ * Enum with options to give to various decompositions. */
 enum DecompositionOptions {
   /** \internal Not used (meant for LDLT?). */
-  Pivoting            = 0x01, 
+  Pivoting = 0x01,
   /** \internal Not used (meant for LDLT?). */
-  NoPivoting          = 0x02, 
+  NoPivoting = 0x02,
   /** Used in JacobiSVD to indicate that the square matrix U is to be computed. */
-  ComputeFullU        = 0x04,
+  ComputeFullU = 0x04,
   /** Used in JacobiSVD to indicate that the thin matrix U is to be computed. */
-  ComputeThinU        = 0x08,
+  ComputeThinU = 0x08,
   /** Used in JacobiSVD to indicate that the square matrix V is to be computed. */
-  ComputeFullV        = 0x10,
+  ComputeFullV = 0x10,
   /** Used in JacobiSVD to indicate that the thin matrix V is to be computed. */
-  ComputeThinV        = 0x20,
+  ComputeThinV = 0x20,
   /** Used in SelfAdjointEigenSolver and GeneralizedSelfAdjointEigenSolver to specify
-    * that only the eigenvalues are to be computed and not the eigenvectors. */
-  EigenvaluesOnly     = 0x40,
+   * that only the eigenvalues are to be computed and not the eigenvectors. */
+  EigenvaluesOnly = 0x40,
   /** Used in SelfAdjointEigenSolver and GeneralizedSelfAdjointEigenSolver to specify
-    * that both the eigenvalues and the eigenvectors are to be computed. */
+   * that both the eigenvalues and the eigenvectors are to be computed. */
   ComputeEigenvectors = 0x80,
   /** \internal */
   EigVecMask = EigenvaluesOnly | ComputeEigenvectors,
   /** Used in GeneralizedSelfAdjointEigenSolver to indicate that it should
-    * solve the generalized eigenproblem \f$ Ax = \lambda B x \f$. */
-  Ax_lBx              = 0x100,
+   * solve the generalized eigenproblem \f$ Ax = \lambda B x \f$. */
+  Ax_lBx = 0x100,
   /** Used in GeneralizedSelfAdjointEigenSolver to indicate that it should
-    * solve the generalized eigenproblem \f$ ABx = \lambda x \f$. */
-  ABx_lx              = 0x200,
+   * solve the generalized eigenproblem \f$ ABx = \lambda x \f$. */
+  ABx_lx = 0x200,
   /** Used in GeneralizedSelfAdjointEigenSolver to indicate that it should
-    * solve the generalized eigenproblem \f$ BAx = \lambda x \f$. */
-  BAx_lx              = 0x400,
+   * solve the generalized eigenproblem \f$ BAx = \lambda x \f$. */
+  BAx_lx = 0x400,
   /** \internal */
   GenEigMask = Ax_lBx | ABx_lx | BAx_lx
 };
 
 /** \ingroup enums
-  * Possible values for the \p QRPreconditioner template parameter of JacobiSVD. */
+ * Possible values for the \p QRPreconditioner template parameter of JacobiSVD. */
 enum QRPreconditioners {
   /** Use a QR decomposition with column pivoting as the first step. */
   ColPivHouseholderQRPreconditioner = 0x0,
@@ -441,75 +434,83 @@
 #endif
 
 /** \ingroup enums
-  * Enum for reporting the status of a computation. */
+ * Enum for reporting the status of a computation. */
 enum ComputationInfo {
   /** Computation was successful. */
-  Success = 0,        
+  Success = 0,
   /** The provided data did not satisfy the prerequisites. */
-  NumericalIssue = 1, 
+  NumericalIssue = 1,
   /** Iterative procedure did not converge. */
   NoConvergence = 2,
   /** The inputs are invalid, or the algorithm has been improperly called.
-    * When assertions are enabled, such errors trigger an assert. */
+   * When assertions are enabled, such errors trigger an assert. */
   InvalidInput = 3
 };
 
 /** \ingroup enums
-  * Enum used to specify how a particular transformation is stored in a matrix.
-  * \sa Transform, Hyperplane::transform(). */
+ * Enum used to specify how a particular transformation is stored in a matrix.
+ * \sa Transform, Hyperplane::transform(). */
 enum TransformTraits {
   /** Transformation is an isometry. */
-  Isometry      = 0x1,
-  /** Transformation is an affine transformation stored as a (Dim+1)^2 matrix whose last row is 
-    * assumed to be [0 ... 0 1]. */
-  Affine        = 0x2,
+  Isometry = 0x1,
+  /** Transformation is an affine transformation stored as a (Dim+1)^2 matrix whose last row is
+   * assumed to be [0 ... 0 1]. */
+  Affine = 0x2,
   /** Transformation is an affine transformation stored as a (Dim) x (Dim+1) matrix. */
   AffineCompact = 0x10 | Affine,
   /** Transformation is a general projective transformation stored as a (Dim+1)^2 matrix. */
-  Projective    = 0x20
+  Projective = 0x20
 };
 
 /** \internal \ingroup enums
-  * Enum used to choose between implementation depending on the computer architecture. */
-namespace Architecture
-{
-  enum Type {
-    Generic = 0x0,
-    SSE = 0x1,
-    AltiVec = 0x2,
-    VSX = 0x3,
-    NEON = 0x4,
-    MSA = 0x5,
-    SVE = 0x6,
-    HVX = 0x7,
+ * Enum used to choose between implementation depending on the computer architecture. */
+namespace Architecture {
+enum Type {
+  Generic = 0x0,
+  SSE = 0x1,
+  AltiVec = 0x2,
+  VSX = 0x3,
+  NEON = 0x4,
+  MSA = 0x5,
+  SVE = 0x6,
+  HVX = 0x7,
 #if defined EIGEN_VECTORIZE_SSE
-    Target = SSE
+  Target = SSE
 #elif defined EIGEN_VECTORIZE_ALTIVEC
-    Target = AltiVec
+  Target = AltiVec
 #elif defined EIGEN_VECTORIZE_VSX
-    Target = VSX
+  Target = VSX
 #elif defined EIGEN_VECTORIZE_NEON
-    Target = NEON
+  Target = NEON
 #elif defined EIGEN_VECTORIZE_SVE
-    Target = SVE
+  Target = SVE
 #elif defined EIGEN_VECTORIZE_MSA
-    Target = MSA
+  Target = MSA
 #elif defined EIGEN_VECTORIZE_HVX
-    Target = HVX
+  Target = HVX
 #else
-    Target = Generic
+  Target = Generic
 #endif
-  };
-}
+};
+}  // namespace Architecture
 
 /** \internal \ingroup enums
-  * Enum used as template parameter in Product and product evaluators. */
-enum ProductImplType
-{ DefaultProduct=0, LazyProduct, AliasFreeProduct, CoeffBasedProductMode, LazyCoeffBasedProductMode, OuterProduct, InnerProduct, GemvProduct, GemmProduct };
+ * Enum used as template parameter in Product and product evaluators. */
+enum ProductImplType {
+  DefaultProduct = 0,
+  LazyProduct,
+  AliasFreeProduct,
+  CoeffBasedProductMode,
+  LazyCoeffBasedProductMode,
+  OuterProduct,
+  InnerProduct,
+  GemvProduct,
+  GemmProduct
+};
 
 /** \internal \ingroup enums
-  * Enum used in experimental parallel implementation. */
-enum Action {GetAction, SetAction};
+ * Enum used in experimental parallel implementation. */
+enum Action { GetAction, SetAction };
 
 /** The type used to identify a dense storage. */
 struct Dense {};
@@ -533,24 +534,46 @@
 struct ArrayXpr {};
 
 // An evaluator must define its shape. By default, it can be one of the following:
-struct DenseShape             { static std::string debugName() { return "DenseShape"; } };
-struct SolverShape            { static std::string debugName() { return "SolverShape"; } };
-struct HomogeneousShape       { static std::string debugName() { return "HomogeneousShape"; } };
-struct DiagonalShape          { static std::string debugName() { return "DiagonalShape"; } };
-struct SkewSymmetricShape     { static std::string debugName() { return "SkewSymmetricShape"; } };
-struct BandShape              { static std::string debugName() { return "BandShape"; } };
-struct TriangularShape        { static std::string debugName() { return "TriangularShape"; } };
-struct SelfAdjointShape       { static std::string debugName() { return "SelfAdjointShape"; } };
-struct PermutationShape       { static std::string debugName() { return "PermutationShape"; } };
-struct TranspositionsShape    { static std::string debugName() { return "TranspositionsShape"; } };
-struct SparseShape            { static std::string debugName() { return "SparseShape"; } };
+struct DenseShape {
+  static std::string debugName() { return "DenseShape"; }
+};
+struct SolverShape {
+  static std::string debugName() { return "SolverShape"; }
+};
+struct HomogeneousShape {
+  static std::string debugName() { return "HomogeneousShape"; }
+};
+struct DiagonalShape {
+  static std::string debugName() { return "DiagonalShape"; }
+};
+struct SkewSymmetricShape {
+  static std::string debugName() { return "SkewSymmetricShape"; }
+};
+struct BandShape {
+  static std::string debugName() { return "BandShape"; }
+};
+struct TriangularShape {
+  static std::string debugName() { return "TriangularShape"; }
+};
+struct SelfAdjointShape {
+  static std::string debugName() { return "SelfAdjointShape"; }
+};
+struct PermutationShape {
+  static std::string debugName() { return "PermutationShape"; }
+};
+struct TranspositionsShape {
+  static std::string debugName() { return "TranspositionsShape"; }
+};
+struct SparseShape {
+  static std::string debugName() { return "SparseShape"; }
+};
 
 namespace internal {
 
-  // random access iterators based on coeff*() accessors.
+// random access iterators based on coeff*() accessors.
 struct IndexBased {};
 
-// evaluator based on iterators to access coefficients. 
+// evaluator based on iterators to access coefficients.
 struct IteratorBased {};
 
 /** \internal
@@ -565,8 +588,8 @@
   cmp_GT = 5,
   cmp_GE = 6
 };
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_CONSTANTS_H
+#endif  // EIGEN_CONSTANTS_H
diff --git a/Eigen/src/Core/util/DisableStupidWarnings.h b/Eigen/src/Core/util/DisableStupidWarnings.h
index 7d1766c..32a427d 100644
--- a/Eigen/src/Core/util/DisableStupidWarnings.h
+++ b/Eigen/src/Core/util/DisableStupidWarnings.h
@@ -2,143 +2,145 @@
 #define EIGEN_WARNINGS_DISABLED
 
 #if defined(_MSC_VER)
-  // 4100 - unreferenced formal parameter (occurred e.g. in aligned_allocator::destroy(pointer p))
-  // 4101 - unreferenced local variable
-  // 4127 - conditional expression is constant
-  // 4181 - qualifier applied to reference type ignored
-  // 4211 - nonstandard extension used : redefined extern to static
-  // 4244 - 'argument' : conversion from 'type1' to 'type2', possible loss of data
-  // 4273 - QtAlignedMalloc, inconsistent DLL linkage
-  // 4324 - structure was padded due to declspec(align())
-  // 4503 - decorated name length exceeded, name was truncated
-  // 4512 - assignment operator could not be generated
-  // 4522 - 'class' : multiple assignment operators specified
-  // 4700 - uninitialized local variable 'xyz' used
-  // 4714 - function marked as __forceinline not inlined
-  // 4717 - 'function' : recursive on all control paths, function will cause runtime stack overflow
-  // 4800 - 'type' : forcing value to bool 'true' or 'false' (performance warning)
-  #ifndef EIGEN_PERMANENTLY_DISABLE_STUPID_WARNINGS
-    #pragma warning( push )
-  #endif
-  #pragma warning( disable : 4100 4101 4127 4181 4211 4244 4273 4324 4503 4512 4522 4700 4714 4717 4800)
-  // We currently rely on has_denorm in tests, and need it defined correctly for half/bfloat16.
-  #ifndef _SILENCE_CXX23_DENORM_DEPRECATION_WARNING
-    #define EIGEN_REENABLE_CXX23_DENORM_DEPRECATION_WARNING 1
-    #define _SILENCE_CXX23_DENORM_DEPRECATION_WARNING
-  #endif
+// 4100 - unreferenced formal parameter (occurred e.g. in aligned_allocator::destroy(pointer p))
+// 4101 - unreferenced local variable
+// 4127 - conditional expression is constant
+// 4181 - qualifier applied to reference type ignored
+// 4211 - nonstandard extension used : redefined extern to static
+// 4244 - 'argument' : conversion from 'type1' to 'type2', possible loss of data
+// 4273 - QtAlignedMalloc, inconsistent DLL linkage
+// 4324 - structure was padded due to declspec(align())
+// 4503 - decorated name length exceeded, name was truncated
+// 4512 - assignment operator could not be generated
+// 4522 - 'class' : multiple assignment operators specified
+// 4700 - uninitialized local variable 'xyz' used
+// 4714 - function marked as __forceinline not inlined
+// 4717 - 'function' : recursive on all control paths, function will cause runtime stack overflow
+// 4800 - 'type' : forcing value to bool 'true' or 'false' (performance warning)
+#ifndef EIGEN_PERMANENTLY_DISABLE_STUPID_WARNINGS
+#pragma warning(push)
+#endif
+#pragma warning(disable : 4100 4101 4127 4181 4211 4244 4273 4324 4503 4512 4522 4700 4714 4717 4800)
+// We currently rely on has_denorm in tests, and need it defined correctly for half/bfloat16.
+#ifndef _SILENCE_CXX23_DENORM_DEPRECATION_WARNING
+#define EIGEN_REENABLE_CXX23_DENORM_DEPRECATION_WARNING 1
+#define _SILENCE_CXX23_DENORM_DEPRECATION_WARNING
+#endif
 
 #elif defined __INTEL_COMPILER
-  // 2196 - routine is both "inline" and "noinline" ("noinline" assumed)
-  //        ICC 12 generates this warning even without any inline keyword, when defining class methods 'inline' i.e. inside of class body
-  //        typedef that may be a reference type.
-  // 279  - controlling expression is constant
-  //        ICC 12 generates this warning on assert(constant_expression_depending_on_template_params) and frankly this is a legitimate use case.
-  // 1684 - conversion from pointer to same-sized integral type (potential portability problem)
-  // 2259 - non-pointer conversion from "Eigen::Index={ptrdiff_t={long}}" to "int" may lose significant bits
-  #ifndef EIGEN_PERMANENTLY_DISABLE_STUPID_WARNINGS
-    #pragma warning push
-  #endif
-  #pragma warning disable 2196 279 1684 2259
+// 2196 - routine is both "inline" and "noinline" ("noinline" assumed)
+//        ICC 12 generates this warning even without any inline keyword, when defining class methods 'inline' i.e.
+//        inside of class body typedef that may be a reference type.
+// 279  - controlling expression is constant
+//        ICC 12 generates this warning on assert(constant_expression_depending_on_template_params) and frankly this is
+//        a legitimate use case.
+// 1684 - conversion from pointer to same-sized integral type (potential portability problem)
+// 2259 - non-pointer conversion from "Eigen::Index={ptrdiff_t={long}}" to "int" may lose significant bits
+#ifndef EIGEN_PERMANENTLY_DISABLE_STUPID_WARNINGS
+#pragma warning push
+#endif
+#pragma warning disable 2196 279 1684 2259
 
 #elif defined __clang__
-  #ifndef EIGEN_PERMANENTLY_DISABLE_STUPID_WARNINGS
-    #pragma clang diagnostic push
-  #endif
-  #if defined(__has_warning)
-    // -Wconstant-logical-operand - warning: use of logical && with constant operand; switch to bitwise & or remove constant
-    //     this is really a stupid warning as it warns on compile-time expressions involving enums
-    #if __has_warning("-Wconstant-logical-operand")
-      #pragma clang diagnostic ignored "-Wconstant-logical-operand"
-    #endif
-    #if __has_warning("-Wimplicit-int-float-conversion")
-      #pragma clang diagnostic ignored "-Wimplicit-int-float-conversion"
-    #endif
-    #if ( defined(__ALTIVEC__) || defined(__VSX__) ) && ( !defined(__STDC_VERSION__) || (__STDC_VERSION__ < 201112L) )
-      // warning: generic selections are a C11-specific feature
-      // ignoring warnings thrown at vec_ctf in Altivec/PacketMath.h
-      #if __has_warning("-Wc11-extensions")
-        #pragma clang diagnostic ignored "-Wc11-extensions"
-      #endif
-    #endif
-  #endif
+#ifndef EIGEN_PERMANENTLY_DISABLE_STUPID_WARNINGS
+#pragma clang diagnostic push
+#endif
+#if defined(__has_warning)
+// -Wconstant-logical-operand - warning: use of logical && with constant operand; switch to bitwise & or remove constant
+//     this is really a stupid warning as it warns on compile-time expressions involving enums
+#if __has_warning("-Wconstant-logical-operand")
+#pragma clang diagnostic ignored "-Wconstant-logical-operand"
+#endif
+#if __has_warning("-Wimplicit-int-float-conversion")
+#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion"
+#endif
+#if (defined(__ALTIVEC__) || defined(__VSX__)) && (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 201112L))
+// warning: generic selections are a C11-specific feature
+// ignoring warnings thrown at vec_ctf in Altivec/PacketMath.h
+#if __has_warning("-Wc11-extensions")
+#pragma clang diagnostic ignored "-Wc11-extensions"
+#endif
+#endif
+#endif
 
 #elif defined __GNUC__ && !defined(__FUJITSU)
 
-  #if (!defined(EIGEN_PERMANENTLY_DISABLE_STUPID_WARNINGS)) &&  (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
-    #pragma GCC diagnostic push
-  #endif
-  // g++ warns about local variables shadowing member functions, which is too strict
-  #pragma GCC diagnostic ignored "-Wshadow"
-  #if __GNUC__ == 4 && __GNUC_MINOR__ < 8
-    // Until g++-4.7 there are warnings when comparing unsigned int vs 0, even in templated functions:
-    #pragma GCC diagnostic ignored "-Wtype-limits"
-  #endif
-  #if __GNUC__>=6
-    #pragma GCC diagnostic ignored "-Wignored-attributes"
-  #endif
-  #if __GNUC__==7
-    // See: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89325
-    #pragma GCC diagnostic ignored "-Wattributes"
-  #endif
+#if (!defined(EIGEN_PERMANENTLY_DISABLE_STUPID_WARNINGS)) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
+#pragma GCC diagnostic push
+#endif
+// g++ warns about local variables shadowing member functions, which is too strict
+#pragma GCC diagnostic ignored "-Wshadow"
+#if __GNUC__ == 4 && __GNUC_MINOR__ < 8
+// Until g++-4.7 there are warnings when comparing unsigned int vs 0, even in templated functions:
+#pragma GCC diagnostic ignored "-Wtype-limits"
+#endif
+#if __GNUC__ >= 6
+#pragma GCC diagnostic ignored "-Wignored-attributes"
+#endif
+#if __GNUC__ == 7
+// See: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89325
+#pragma GCC diagnostic ignored "-Wattributes"
+#endif
 #endif
 
 #if defined __NVCC__
-  // MSVC 14.16 (required by CUDA 9.*) does not support the _Pragma keyword, so
-  // we instead use Microsoft's __pragma extension.
-  #if defined _MSC_VER
-    #define EIGEN_MAKE_PRAGMA(X) __pragma(#X)
-  #else
-    #define EIGEN_MAKE_PRAGMA(X) _Pragma(#X)
-  #endif
-  #if defined __NVCC_DIAG_PRAGMA_SUPPORT__
-    #define EIGEN_NV_DIAG_SUPPRESS(X) EIGEN_MAKE_PRAGMA(nv_diag_suppress X)
-  #else
-    #define EIGEN_NV_DIAG_SUPPRESS(X) EIGEN_MAKE_PRAGMA(diag_suppress X)
-  #endif
+// MSVC 14.16 (required by CUDA 9.*) does not support the _Pragma keyword, so
+// we instead use Microsoft's __pragma extension.
+#if defined _MSC_VER
+#define EIGEN_MAKE_PRAGMA(X) __pragma(#X)
+#else
+#define EIGEN_MAKE_PRAGMA(X) _Pragma(#X)
+#endif
+#if defined __NVCC_DIAG_PRAGMA_SUPPORT__
+#define EIGEN_NV_DIAG_SUPPRESS(X) EIGEN_MAKE_PRAGMA(nv_diag_suppress X)
+#else
+#define EIGEN_NV_DIAG_SUPPRESS(X) EIGEN_MAKE_PRAGMA(diag_suppress X)
+#endif
 
-  EIGEN_NV_DIAG_SUPPRESS(boolean_controlling_expr_is_constant)
-  // Disable the "statement is unreachable" message
-  EIGEN_NV_DIAG_SUPPRESS(code_is_unreachable)
-  // Disable the "dynamic initialization in unreachable code" message
-  EIGEN_NV_DIAG_SUPPRESS(initialization_not_reachable)
-  // Disable the "invalid error number" message that we get with older versions of nvcc
-  EIGEN_NV_DIAG_SUPPRESS(1222)
-  // Disable the "calling a __host__ function from a __host__ __device__ function is not allowed" messages (yes, there are many of them and they seem to change with every version of the compiler)
-  EIGEN_NV_DIAG_SUPPRESS(2527)
-  EIGEN_NV_DIAG_SUPPRESS(2529)
-  EIGEN_NV_DIAG_SUPPRESS(2651)
-  EIGEN_NV_DIAG_SUPPRESS(2653)
-  EIGEN_NV_DIAG_SUPPRESS(2668)
-  EIGEN_NV_DIAG_SUPPRESS(2669)
-  EIGEN_NV_DIAG_SUPPRESS(2670)
-  EIGEN_NV_DIAG_SUPPRESS(2671)
-  EIGEN_NV_DIAG_SUPPRESS(2735)
-  EIGEN_NV_DIAG_SUPPRESS(2737)
-  EIGEN_NV_DIAG_SUPPRESS(2739)
-  EIGEN_NV_DIAG_SUPPRESS(2885)
-  EIGEN_NV_DIAG_SUPPRESS(2888)
-  EIGEN_NV_DIAG_SUPPRESS(2976)
-  EIGEN_NV_DIAG_SUPPRESS(2979)
-  EIGEN_NV_DIAG_SUPPRESS(20011)
-  EIGEN_NV_DIAG_SUPPRESS(20014)
-  // Disable the "// __device__ annotation is ignored on a function(...) that is
-  //              explicitly defaulted on its first declaration" message.
-  // The __device__ annotation seems to actually be needed in some cases,
-  // otherwise resulting in kernel runtime errors.
-  EIGEN_NV_DIAG_SUPPRESS(2886)
-  EIGEN_NV_DIAG_SUPPRESS(2929)
-  EIGEN_NV_DIAG_SUPPRESS(2977)
-  EIGEN_NV_DIAG_SUPPRESS(20012)
-  #undef EIGEN_NV_DIAG_SUPPRESS
-  #undef EIGEN_MAKE_PRAGMA
+EIGEN_NV_DIAG_SUPPRESS(boolean_controlling_expr_is_constant)
+// Disable the "statement is unreachable" message
+EIGEN_NV_DIAG_SUPPRESS(code_is_unreachable)
+// Disable the "dynamic initialization in unreachable code" message
+EIGEN_NV_DIAG_SUPPRESS(initialization_not_reachable)
+// Disable the "invalid error number" message that we get with older versions of nvcc
+EIGEN_NV_DIAG_SUPPRESS(1222)
+// Disable the "calling a __host__ function from a __host__ __device__ function is not allowed" messages (yes, there are
+// many of them and they seem to change with every version of the compiler)
+EIGEN_NV_DIAG_SUPPRESS(2527)
+EIGEN_NV_DIAG_SUPPRESS(2529)
+EIGEN_NV_DIAG_SUPPRESS(2651)
+EIGEN_NV_DIAG_SUPPRESS(2653)
+EIGEN_NV_DIAG_SUPPRESS(2668)
+EIGEN_NV_DIAG_SUPPRESS(2669)
+EIGEN_NV_DIAG_SUPPRESS(2670)
+EIGEN_NV_DIAG_SUPPRESS(2671)
+EIGEN_NV_DIAG_SUPPRESS(2735)
+EIGEN_NV_DIAG_SUPPRESS(2737)
+EIGEN_NV_DIAG_SUPPRESS(2739)
+EIGEN_NV_DIAG_SUPPRESS(2885)
+EIGEN_NV_DIAG_SUPPRESS(2888)
+EIGEN_NV_DIAG_SUPPRESS(2976)
+EIGEN_NV_DIAG_SUPPRESS(2979)
+EIGEN_NV_DIAG_SUPPRESS(20011)
+EIGEN_NV_DIAG_SUPPRESS(20014)
+// Disable the "// __device__ annotation is ignored on a function(...) that is
+//              explicitly defaulted on its first declaration" message.
+// The __device__ annotation seems to actually be needed in some cases,
+// otherwise resulting in kernel runtime errors.
+EIGEN_NV_DIAG_SUPPRESS(2886)
+EIGEN_NV_DIAG_SUPPRESS(2929)
+EIGEN_NV_DIAG_SUPPRESS(2977)
+EIGEN_NV_DIAG_SUPPRESS(20012)
+#undef EIGEN_NV_DIAG_SUPPRESS
+#undef EIGEN_MAKE_PRAGMA
 #endif
 
 #else
 // warnings already disabled:
-# ifndef EIGEN_WARNINGS_DISABLED_2
-#  define EIGEN_WARNINGS_DISABLED_2
-# elif defined(EIGEN_INTERNAL_DEBUGGING)
-#  error "Do not include \"DisableStupidWarnings.h\" recursively more than twice!"
-# endif
+#ifndef EIGEN_WARNINGS_DISABLED_2
+#define EIGEN_WARNINGS_DISABLED_2
+#elif defined(EIGEN_INTERNAL_DEBUGGING)
+#error "Do not include \"DisableStupidWarnings.h\" recursively more than twice!"
+#endif
 
-#endif // not EIGEN_WARNINGS_DISABLED
+#endif  // not EIGEN_WARNINGS_DISABLED
diff --git a/Eigen/src/Core/util/EmulateArray.h b/Eigen/src/Core/util/EmulateArray.h
index a4b1d0c..2b11552 100644
--- a/Eigen/src/Core/util/EmulateArray.h
+++ b/Eigen/src/Core/util/EmulateArray.h
@@ -14,108 +14,92 @@
 #if defined(EIGEN_GPUCC) || defined(EIGEN_AVOID_STL_ARRAY)
 
 namespace Eigen {
-template <typename T, size_t n> class array {
-
+template <typename T, size_t n>
+class array {
  public:
   typedef T value_type;
   typedef T* iterator;
   typedef const T* const_iterator;
 
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE iterator begin() { return values; }
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE const_iterator begin() const { return values; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE iterator begin() { return values; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const_iterator begin() const { return values; }
 
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE iterator end() { return values + n; }
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE const_iterator end() const { return values + n; }
-
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE iterator end() { return values + n; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const_iterator end() const { return values + n; }
 
 #if !defined(EIGEN_GPUCC)
   typedef std::reverse_iterator<iterator> reverse_iterator;
   typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
 
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE reverse_iterator rbegin() { return reverse_iterator(end());}
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE reverse_iterator rbegin() { return reverse_iterator(end()); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); }
 
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE reverse_iterator rend() { return reverse_iterator(begin()); }
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE const_reverse_iterator rend() const { return const_reverse_iterator(begin()); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE reverse_iterator rend() { return reverse_iterator(begin()); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const_reverse_iterator rend() const { return const_reverse_iterator(begin()); }
 #endif
 
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE T& operator[] (size_t index) { eigen_internal_assert(index < size()); return values[index]; }
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE const T& operator[] (size_t index) const { eigen_internal_assert(index < size()); return values[index]; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& operator[](size_t index) {
+    eigen_internal_assert(index < size());
+    return values[index];
+  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T& operator[](size_t index) const {
+    eigen_internal_assert(index < size());
+    return values[index];
+  }
 
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE T& at(size_t index) { eigen_assert(index < size()); return values[index]; }
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE const T& at(size_t index) const { eigen_assert(index < size()); return values[index]; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& at(size_t index) {
+    eigen_assert(index < size());
+    return values[index];
+  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T& at(size_t index) const {
+    eigen_assert(index < size());
+    return values[index];
+  }
 
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE T& front() { return values[0]; }
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE const T& front() const { return values[0]; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& front() { return values[0]; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T& front() const { return values[0]; }
 
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE T& back() { return values[n-1]; }
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE const T& back() const { return values[n-1]; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& back() { return values[n - 1]; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T& back() const { return values[n - 1]; }
 
-
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-  static std::size_t size() { return n; }
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static std::size_t size() { return n; }
 
   T values[n];
 
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE array() { }
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE array(const T& v) {
-    EIGEN_STATIC_ASSERT(n==1, YOU_MADE_A_PROGRAMMING_MISTAKE)
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array() {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array(const T& v) {
+    EIGEN_STATIC_ASSERT(n == 1, YOU_MADE_A_PROGRAMMING_MISTAKE)
     values[0] = v;
   }
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE array(const T& v1, const T& v2) {
-    EIGEN_STATIC_ASSERT(n==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array(const T& v1, const T& v2) {
+    EIGEN_STATIC_ASSERT(n == 2, YOU_MADE_A_PROGRAMMING_MISTAKE)
     values[0] = v1;
     values[1] = v2;
   }
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE array(const T& v1, const T& v2, const T& v3) {
-    EIGEN_STATIC_ASSERT(n==3, YOU_MADE_A_PROGRAMMING_MISTAKE)
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array(const T& v1, const T& v2, const T& v3) {
+    EIGEN_STATIC_ASSERT(n == 3, YOU_MADE_A_PROGRAMMING_MISTAKE)
     values[0] = v1;
     values[1] = v2;
     values[2] = v3;
   }
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE array(const T& v1, const T& v2, const T& v3,
-                            const T& v4) {
-    EIGEN_STATIC_ASSERT(n==4, YOU_MADE_A_PROGRAMMING_MISTAKE)
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array(const T& v1, const T& v2, const T& v3, const T& v4) {
+    EIGEN_STATIC_ASSERT(n == 4, YOU_MADE_A_PROGRAMMING_MISTAKE)
     values[0] = v1;
     values[1] = v2;
     values[2] = v3;
     values[3] = v4;
   }
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE array(const T& v1, const T& v2, const T& v3, const T& v4,
-                            const T& v5) {
-    EIGEN_STATIC_ASSERT(n==5, YOU_MADE_A_PROGRAMMING_MISTAKE)
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array(const T& v1, const T& v2, const T& v3, const T& v4, const T& v5) {
+    EIGEN_STATIC_ASSERT(n == 5, YOU_MADE_A_PROGRAMMING_MISTAKE)
     values[0] = v1;
     values[1] = v2;
     values[2] = v3;
     values[3] = v4;
     values[4] = v5;
   }
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE array(const T& v1, const T& v2, const T& v3, const T& v4,
-                            const T& v5, const T& v6) {
-    EIGEN_STATIC_ASSERT(n==6, YOU_MADE_A_PROGRAMMING_MISTAKE)
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array(const T& v1, const T& v2, const T& v3, const T& v4, const T& v5,
+                                              const T& v6) {
+    EIGEN_STATIC_ASSERT(n == 6, YOU_MADE_A_PROGRAMMING_MISTAKE)
     values[0] = v1;
     values[1] = v2;
     values[2] = v3;
@@ -123,10 +107,9 @@
     values[4] = v5;
     values[5] = v6;
   }
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE array(const T& v1, const T& v2, const T& v3, const T& v4,
-                            const T& v5, const T& v6, const T& v7) {
-    EIGEN_STATIC_ASSERT(n==7, YOU_MADE_A_PROGRAMMING_MISTAKE)
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array(const T& v1, const T& v2, const T& v3, const T& v4, const T& v5,
+                                              const T& v6, const T& v7) {
+    EIGEN_STATIC_ASSERT(n == 7, YOU_MADE_A_PROGRAMMING_MISTAKE)
     values[0] = v1;
     values[1] = v2;
     values[2] = v3;
@@ -135,11 +118,9 @@
     values[5] = v6;
     values[6] = v7;
   }
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE array(
-      const T& v1, const T& v2, const T& v3, const T& v4,
-      const T& v5, const T& v6, const T& v7, const T& v8) {
-    EIGEN_STATIC_ASSERT(n==8, YOU_MADE_A_PROGRAMMING_MISTAKE)
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array(const T& v1, const T& v2, const T& v3, const T& v4, const T& v5,
+                                              const T& v6, const T& v7, const T& v8) {
+    EIGEN_STATIC_ASSERT(n == 8, YOU_MADE_A_PROGRAMMING_MISTAKE)
     values[0] = v1;
     values[1] = v2;
     values[2] = v3;
@@ -150,53 +131,45 @@
     values[7] = v8;
   }
 
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE array(std::initializer_list<T> l) {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array(std::initializer_list<T> l) {
     eigen_assert(l.size() == n);
     internal::smart_copy(l.begin(), l.end(), values);
   }
 };
 
-
 // Specialize array for zero size
-template <typename T> class array<T, 0> {
+template <typename T>
+class array<T, 0> {
  public:
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE T& operator[] (size_t) {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& operator[](size_t) {
     eigen_assert(false && "Can't index a zero size array");
     return dummy;
   }
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE const T& operator[] (size_t) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T& operator[](size_t) const {
     eigen_assert(false && "Can't index a zero size array");
     return dummy;
   }
 
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE T& front() {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& front() {
     eigen_assert(false && "Can't index a zero size array");
     return dummy;
   }
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE const T& front() const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T& front() const {
     eigen_assert(false && "Can't index a zero size array");
     return dummy;
   }
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE T& back() {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& back() {
     eigen_assert(false && "Can't index a zero size array");
     return dummy;
   }
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE const T& back() const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T& back() const {
     eigen_assert(false && "Can't index a zero size array");
     return dummy;
   }
 
   static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE std::size_t size() { return 0; }
 
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE array() : dummy() { }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array() : dummy() {}
 
   EIGEN_DEVICE_FUNC array(std::initializer_list<T> l) : dummy() {
     EIGEN_UNUSED_VARIABLE(l);
@@ -209,8 +182,8 @@
 
 // Comparison operator
 // Todo: implement !=, <, <=, >,  and >=
-template<class T, std::size_t N>
-EIGEN_DEVICE_FUNC bool operator==(const array<T,N>& lhs, const array<T,N>& rhs) {
+template <class T, std::size_t N>
+EIGEN_DEVICE_FUNC bool operator==(const array<T, N>& lhs, const array<T, N>& rhs) {
   for (std::size_t i = 0; i < N; ++i) {
     if (lhs[i] != rhs[i]) {
       return false;
@@ -219,27 +192,30 @@
   return true;
 }
 
-
 namespace internal {
-template<std::size_t I_, class T, std::size_t N>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& array_get(array<T,N>& a) {
+template <std::size_t I_, class T, std::size_t N>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& array_get(array<T, N>& a) {
   return a[I_];
 }
-template<std::size_t I_, class T, std::size_t N>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T& array_get(const array<T,N>& a) {
+template <std::size_t I_, class T, std::size_t N>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T& array_get(const array<T, N>& a) {
   return a[I_];
 }
 
-template<class T, std::size_t N> struct array_size<array<T,N> > {
+template <class T, std::size_t N>
+struct array_size<array<T, N> > {
   enum { value = N };
 };
-template<class T, std::size_t N> struct array_size<array<T,N>& > {
+template <class T, std::size_t N>
+struct array_size<array<T, N>&> {
   enum { value = N };
 };
-template<class T, std::size_t N> struct array_size<const array<T,N> > {
+template <class T, std::size_t N>
+struct array_size<const array<T, N> > {
   enum { value = N };
 };
-template<class T, std::size_t N> struct array_size<const array<T,N>& > {
+template <class T, std::size_t N>
+struct array_size<const array<T, N>&> {
   enum { value = N };
 };
 
@@ -253,7 +229,8 @@
 
 namespace Eigen {
 
-template <typename T, std::size_t N> using array = std::array<T, N>;
+template <typename T, std::size_t N>
+using array = std::array<T, N>;
 
 namespace internal {
 /* std::get is only constexpr in C++14, not yet in C++11
@@ -265,16 +242,25 @@
  *                       this may not be constexpr
  */
 #if defined(__GLIBCXX__) && __GLIBCXX__ < 20120322
-#define STD_GET_ARR_HACK             a._M_instance[I_]
+#define STD_GET_ARR_HACK a._M_instance[I_]
 #elif defined(_LIBCPP_VERSION)
-#define STD_GET_ARR_HACK             a.__elems_[I_]
+#define STD_GET_ARR_HACK a.__elems_[I_]
 #else
-#define STD_GET_ARR_HACK             std::template get<I_, T, N>(a)
+#define STD_GET_ARR_HACK std::template get<I_, T, N>(a)
 #endif
 
-template<std::size_t I_, class T, std::size_t N> constexpr inline T&       array_get(std::array<T,N>&       a) { return (T&)       STD_GET_ARR_HACK; }
-template<std::size_t I_, class T, std::size_t N> constexpr inline T&&      array_get(std::array<T,N>&&      a) { return (T&&)      STD_GET_ARR_HACK; }
-template<std::size_t I_, class T, std::size_t N> constexpr inline T const& array_get(std::array<T,N> const& a) { return (T const&) STD_GET_ARR_HACK; }
+template <std::size_t I_, class T, std::size_t N>
+constexpr inline T& array_get(std::array<T, N>& a) {
+  return (T&)STD_GET_ARR_HACK;
+}
+template <std::size_t I_, class T, std::size_t N>
+constexpr inline T&& array_get(std::array<T, N>&& a) {
+  return (T&&)STD_GET_ARR_HACK;
+}
+template <std::size_t I_, class T, std::size_t N>
+constexpr inline T const& array_get(std::array<T, N> const& a) {
+  return (T const&)STD_GET_ARR_HACK;
+}
 
 #undef STD_GET_ARR_HACK
 
diff --git a/Eigen/src/Core/util/ForwardDeclarations.h b/Eigen/src/Core/util/ForwardDeclarations.h
index 8bff87d..c312939 100644
--- a/Eigen/src/Core/util/ForwardDeclarations.h
+++ b/Eigen/src/Core/util/ForwardDeclarations.h
@@ -17,253 +17,394 @@
 namespace Eigen {
 namespace internal {
 
-template<typename T> struct traits;
+template <typename T>
+struct traits;
 
 // here we say once and for all that traits<const T> == traits<T>
 // When constness must affect traits, it has to be constness on template parameters on which T itself depends.
 // For example, traits<Map<const T> > != traits<Map<T> >, but
 //              traits<const Map<T> > == traits<Map<T> >
-template<typename T> struct traits<const T> : traits<T> {};
+template <typename T>
+struct traits<const T> : traits<T> {};
 
-template<typename Derived> struct has_direct_access
-{
+template <typename Derived>
+struct has_direct_access {
   enum { ret = (traits<Derived>::Flags & DirectAccessBit) ? 1 : 0 };
 };
 
-template<typename Derived> struct accessors_level
-{
-  enum { has_direct_access = (traits<Derived>::Flags & DirectAccessBit) ? 1 : 0,
-         has_write_access = (traits<Derived>::Flags & LvalueBit) ? 1 : 0,
-         value = has_direct_access ? (has_write_access ? DirectWriteAccessors : DirectAccessors)
-                                   : (has_write_access ? WriteAccessors       : ReadOnlyAccessors)
+template <typename Derived>
+struct accessors_level {
+  enum {
+    has_direct_access = (traits<Derived>::Flags & DirectAccessBit) ? 1 : 0,
+    has_write_access = (traits<Derived>::Flags & LvalueBit) ? 1 : 0,
+    value = has_direct_access ? (has_write_access ? DirectWriteAccessors : DirectAccessors)
+                              : (has_write_access ? WriteAccessors : ReadOnlyAccessors)
   };
 };
 
-template<typename T> struct evaluator_traits;
+template <typename T>
+struct evaluator_traits;
 
-template< typename T> struct evaluator;
+template <typename T>
+struct evaluator;
 
-} // end namespace internal
+}  // end namespace internal
 
-template<typename T> struct NumTraits;
+template <typename T>
+struct NumTraits;
 
-template<typename Derived> struct EigenBase;
-template<typename Derived> class DenseBase;
-template<typename Derived> class PlainObjectBase;
-template<typename Derived, int Level> class DenseCoeffsBase;
+template <typename Derived>
+struct EigenBase;
+template <typename Derived>
+class DenseBase;
+template <typename Derived>
+class PlainObjectBase;
+template <typename Derived, int Level>
+class DenseCoeffsBase;
 
-template<typename Scalar_, int Rows_, int Cols_,
-         int Options_ = AutoAlign |
-                          ( (Rows_==1 && Cols_!=1) ? Eigen::RowMajor
-                          : (Cols_==1 && Rows_!=1) ? Eigen::ColMajor
-                          : EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION ),
-         int MaxRows_ = Rows_,
-         int MaxCols_ = Cols_
-> class Matrix;
+template <typename Scalar_, int Rows_, int Cols_,
+          int Options_ = AutoAlign | ((Rows_ == 1 && Cols_ != 1)   ? Eigen::RowMajor
+                                      : (Cols_ == 1 && Rows_ != 1) ? Eigen::ColMajor
+                                                                   : EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION),
+          int MaxRows_ = Rows_, int MaxCols_ = Cols_>
+class Matrix;
 
-template<typename Derived> class MatrixBase;
-template<typename Derived> class ArrayBase;
+template <typename Derived>
+class MatrixBase;
+template <typename Derived>
+class ArrayBase;
 
-template<typename ExpressionType, unsigned int Added, unsigned int Removed> class Flagged;
-template<typename ExpressionType, template <typename> class StorageBase > class NoAlias;
-template<typename ExpressionType> class NestByValue;
-template<typename ExpressionType> class ForceAlignedAccess;
-template<typename ExpressionType> class SwapWrapper;
+template <typename ExpressionType, unsigned int Added, unsigned int Removed>
+class Flagged;
+template <typename ExpressionType, template <typename> class StorageBase>
+class NoAlias;
+template <typename ExpressionType>
+class NestByValue;
+template <typename ExpressionType>
+class ForceAlignedAccess;
+template <typename ExpressionType>
+class SwapWrapper;
 
-template<typename XprType, int BlockRows=Dynamic, int BlockCols=Dynamic, bool InnerPanel = false> class Block;
-template<typename XprType, typename RowIndices, typename ColIndices> class IndexedView;
-template<typename XprType, int Rows=Dynamic, int Cols=Dynamic, int Order=0> class Reshaped;
+template <typename XprType, int BlockRows = Dynamic, int BlockCols = Dynamic, bool InnerPanel = false>
+class Block;
+template <typename XprType, typename RowIndices, typename ColIndices>
+class IndexedView;
+template <typename XprType, int Rows = Dynamic, int Cols = Dynamic, int Order = 0>
+class Reshaped;
 
-template<typename MatrixType, int Size=Dynamic> class VectorBlock;
-template<typename MatrixType> class Transpose;
-template<typename MatrixType> class Conjugate;
-template<typename NullaryOp, typename MatrixType>         class CwiseNullaryOp;
-template<typename UnaryOp,   typename MatrixType>         class CwiseUnaryOp;
-template<typename BinaryOp,  typename Lhs, typename Rhs>  class CwiseBinaryOp;
-template<typename TernaryOp, typename Arg1, typename Arg2, typename Arg3>  class CwiseTernaryOp;
-template<typename Decomposition, typename Rhstype>        class Solve;
-template<typename XprType>                                class Inverse;
+template <typename MatrixType, int Size = Dynamic>
+class VectorBlock;
+template <typename MatrixType>
+class Transpose;
+template <typename MatrixType>
+class Conjugate;
+template <typename NullaryOp, typename MatrixType>
+class CwiseNullaryOp;
+template <typename UnaryOp, typename MatrixType>
+class CwiseUnaryOp;
+template <typename BinaryOp, typename Lhs, typename Rhs>
+class CwiseBinaryOp;
+template <typename TernaryOp, typename Arg1, typename Arg2, typename Arg3>
+class CwiseTernaryOp;
+template <typename Decomposition, typename Rhstype>
+class Solve;
+template <typename XprType>
+class Inverse;
 
-template<typename Lhs, typename Rhs, int Option = DefaultProduct> class Product;
+template <typename Lhs, typename Rhs, int Option = DefaultProduct>
+class Product;
 
-template<typename Derived> class DiagonalBase;
-template<typename DiagonalVectorType_> class DiagonalWrapper;
-template<typename Scalar_, int SizeAtCompileTime, int MaxSizeAtCompileTime=SizeAtCompileTime> class DiagonalMatrix;
-template<typename MatrixType, typename DiagonalType, int ProductOrder> class DiagonalProduct;
-template<typename MatrixType, int Index = 0> class Diagonal;
-template<typename Derived> class SkewSymmetricBase;
-template<typename VectorType_> class SkewSymmetricWrapper;
-template<typename Scalar_> class SkewSymmetricMatrix3;
-template<int SizeAtCompileTime, int MaxSizeAtCompileTime = SizeAtCompileTime, typename IndexType=int> class PermutationMatrix;
-template<int SizeAtCompileTime, int MaxSizeAtCompileTime = SizeAtCompileTime, typename IndexType=int> class Transpositions;
-template<typename Derived> class PermutationBase;
-template<typename Derived> class TranspositionsBase;
-template<typename IndicesType_> class PermutationWrapper;
-template<typename IndicesType_> class TranspositionsWrapper;
+template <typename Derived>
+class DiagonalBase;
+template <typename DiagonalVectorType_>
+class DiagonalWrapper;
+template <typename Scalar_, int SizeAtCompileTime, int MaxSizeAtCompileTime = SizeAtCompileTime>
+class DiagonalMatrix;
+template <typename MatrixType, typename DiagonalType, int ProductOrder>
+class DiagonalProduct;
+template <typename MatrixType, int Index = 0>
+class Diagonal;
+template <typename Derived>
+class SkewSymmetricBase;
+template <typename VectorType_>
+class SkewSymmetricWrapper;
+template <typename Scalar_>
+class SkewSymmetricMatrix3;
+template <int SizeAtCompileTime, int MaxSizeAtCompileTime = SizeAtCompileTime, typename IndexType = int>
+class PermutationMatrix;
+template <int SizeAtCompileTime, int MaxSizeAtCompileTime = SizeAtCompileTime, typename IndexType = int>
+class Transpositions;
+template <typename Derived>
+class PermutationBase;
+template <typename Derived>
+class TranspositionsBase;
+template <typename IndicesType_>
+class PermutationWrapper;
+template <typename IndicesType_>
+class TranspositionsWrapper;
 
-template<typename Derived,
-         int Level = internal::accessors_level<Derived>::has_write_access ? WriteAccessors : ReadOnlyAccessors
-> class MapBase;
-template<int OuterStrideAtCompileTime, int InnerStrideAtCompileTime> class Stride;
-template<int Value = Dynamic> class InnerStride;
-template<int Value = Dynamic> class OuterStride;
-template<typename MatrixType, int MapOptions=Unaligned, typename StrideType = Stride<0,0> > class Map;
-template<typename Derived> class RefBase;
-template<typename PlainObjectType, int Options = 0,
-         typename StrideType = typename std::conditional_t<PlainObjectType::IsVectorAtCompileTime,InnerStride<1>,OuterStride<> > > class Ref;
-template<typename ViewOp,    typename MatrixType, typename StrideType = Stride<0,0>>         class CwiseUnaryView;
+template <typename Derived,
+          int Level = internal::accessors_level<Derived>::has_write_access ? WriteAccessors : ReadOnlyAccessors>
+class MapBase;
+template <int OuterStrideAtCompileTime, int InnerStrideAtCompileTime>
+class Stride;
+template <int Value = Dynamic>
+class InnerStride;
+template <int Value = Dynamic>
+class OuterStride;
+template <typename MatrixType, int MapOptions = Unaligned, typename StrideType = Stride<0, 0>>
+class Map;
+template <typename Derived>
+class RefBase;
+template <typename PlainObjectType, int Options = 0,
+          typename StrideType =
+              typename std::conditional_t<PlainObjectType::IsVectorAtCompileTime, InnerStride<1>, OuterStride<>>>
+class Ref;
+template <typename ViewOp, typename MatrixType, typename StrideType = Stride<0, 0>>
+class CwiseUnaryView;
 
-template<typename Derived> class TriangularBase;
-template<typename MatrixType, unsigned int Mode> class TriangularView;
-template<typename MatrixType, unsigned int Mode> class SelfAdjointView;
-template<typename MatrixType> class SparseView;
-template<typename ExpressionType> class WithFormat;
-template<typename MatrixType> struct CommaInitializer;
-template<typename Derived> class ReturnByValue;
-template<typename ExpressionType> class ArrayWrapper;
-template<typename ExpressionType> class MatrixWrapper;
-template<typename Derived> class SolverBase;
-template<typename XprType> class InnerIterator;
+template <typename Derived>
+class TriangularBase;
+template <typename MatrixType, unsigned int Mode>
+class TriangularView;
+template <typename MatrixType, unsigned int Mode>
+class SelfAdjointView;
+template <typename MatrixType>
+class SparseView;
+template <typename ExpressionType>
+class WithFormat;
+template <typename MatrixType>
+struct CommaInitializer;
+template <typename Derived>
+class ReturnByValue;
+template <typename ExpressionType>
+class ArrayWrapper;
+template <typename ExpressionType>
+class MatrixWrapper;
+template <typename Derived>
+class SolverBase;
+template <typename XprType>
+class InnerIterator;
 
 namespace internal {
-template<typename XprType> class generic_randaccess_stl_iterator;
-template<typename XprType> class pointer_based_stl_iterator;
-template<typename XprType, DirectionType Direction> class subvector_stl_iterator;
-template<typename XprType, DirectionType Direction> class subvector_stl_reverse_iterator;
-template<typename DecompositionType> struct kernel_retval_base;
-template<typename DecompositionType> struct kernel_retval;
-template<typename DecompositionType> struct image_retval_base;
-template<typename DecompositionType> struct image_retval;
-} // end namespace internal
+template <typename XprType>
+class generic_randaccess_stl_iterator;
+template <typename XprType>
+class pointer_based_stl_iterator;
+template <typename XprType, DirectionType Direction>
+class subvector_stl_iterator;
+template <typename XprType, DirectionType Direction>
+class subvector_stl_reverse_iterator;
+template <typename DecompositionType>
+struct kernel_retval_base;
+template <typename DecompositionType>
+struct kernel_retval;
+template <typename DecompositionType>
+struct image_retval_base;
+template <typename DecompositionType>
+struct image_retval;
+}  // end namespace internal
 
 namespace internal {
-template<typename Scalar_, int Rows=Dynamic, int Cols=Dynamic, int Supers=Dynamic, int Subs=Dynamic, int Options=0> class BandMatrix;
+template <typename Scalar_, int Rows = Dynamic, int Cols = Dynamic, int Supers = Dynamic, int Subs = Dynamic,
+          int Options = 0>
+class BandMatrix;
 }
 
 namespace internal {
-template<typename Lhs, typename Rhs> struct product_type;
+template <typename Lhs, typename Rhs>
+struct product_type;
 
-template<bool> struct EnableIf;
+template <bool>
+struct EnableIf;
 
 /** \internal
-  * \class product_evaluator
-  * Products need their own evaluator with more template arguments allowing for
-  * easier partial template specializations.
-  */
-template< typename T,
-          int ProductTag = internal::product_type<typename T::Lhs,typename T::Rhs>::ret,
+ * \class product_evaluator
+ * Products need their own evaluator with more template arguments allowing for
+ * easier partial template specializations.
+ */
+template <typename T, int ProductTag = internal::product_type<typename T::Lhs, typename T::Rhs>::ret,
           typename LhsShape = typename evaluator_traits<typename T::Lhs>::Shape,
           typename RhsShape = typename evaluator_traits<typename T::Rhs>::Shape,
           typename LhsScalar = typename traits<typename T::Lhs>::Scalar,
-          typename RhsScalar = typename traits<typename T::Rhs>::Scalar
-        > struct product_evaluator;
-}
+          typename RhsScalar = typename traits<typename T::Rhs>::Scalar>
+struct product_evaluator;
+}  // namespace internal
 
-template<typename Lhs, typename Rhs,
-         int ProductType = internal::product_type<Lhs,Rhs>::value>
+template <typename Lhs, typename Rhs, int ProductType = internal::product_type<Lhs, Rhs>::value>
 struct ProductReturnType;
 
 // this is a workaround for sun CC
-template<typename Lhs, typename Rhs> struct LazyProductReturnType;
+template <typename Lhs, typename Rhs>
+struct LazyProductReturnType;
 
 namespace internal {
 
 // Provides scalar/packet-wise product and product with accumulation
 // with optional conjugation of the arguments.
-template<typename LhsScalar, typename RhsScalar, bool ConjLhs=false, bool ConjRhs=false> struct conj_helper;
+template <typename LhsScalar, typename RhsScalar, bool ConjLhs = false, bool ConjRhs = false>
+struct conj_helper;
 
-template<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_sum_op;
-template<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_difference_op;
-template<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_conj_product_op;
-template<typename LhsScalar,typename RhsScalar=LhsScalar, int NaNPropagation=PropagateFast> struct scalar_min_op;
-template<typename LhsScalar,typename RhsScalar=LhsScalar, int NaNPropagation=PropagateFast> struct scalar_max_op;
-template<typename Scalar> struct scalar_opposite_op;
-template<typename Scalar> struct scalar_conjugate_op;
-template<typename Scalar> struct scalar_real_op;
-template<typename Scalar> struct scalar_imag_op;
-template<typename Scalar> struct scalar_abs_op;
-template<typename Scalar> struct scalar_abs2_op;
-template<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_absolute_difference_op;
-template<typename Scalar> struct scalar_sqrt_op;
-template<typename Scalar> struct scalar_cbrt_op;
-template<typename Scalar> struct scalar_rsqrt_op;
-template<typename Scalar> struct scalar_exp_op;
-template<typename Scalar> struct scalar_log_op;
-template<typename Scalar> struct scalar_cos_op;
-template<typename Scalar> struct scalar_sin_op;
-template<typename Scalar> struct scalar_acos_op;
-template<typename Scalar> struct scalar_asin_op;
-template<typename Scalar> struct scalar_tan_op;
-template<typename Scalar> struct scalar_atan_op;
-template <typename LhsScalar, typename RhsScalar = LhsScalar> struct scalar_atan2_op;
-template<typename Scalar> struct scalar_inverse_op;
-template<typename Scalar> struct scalar_square_op;
-template<typename Scalar> struct scalar_cube_op;
-template<typename Scalar, typename NewType> struct scalar_cast_op;
-template<typename Scalar> struct scalar_random_op;
-template<typename Scalar> struct scalar_constant_op;
-template<typename Scalar> struct scalar_identity_op;
-template<typename Scalar> struct scalar_sign_op;
+template <typename LhsScalar, typename RhsScalar = LhsScalar>
+struct scalar_sum_op;
+template <typename LhsScalar, typename RhsScalar = LhsScalar>
+struct scalar_difference_op;
+template <typename LhsScalar, typename RhsScalar = LhsScalar>
+struct scalar_conj_product_op;
+template <typename LhsScalar, typename RhsScalar = LhsScalar, int NaNPropagation = PropagateFast>
+struct scalar_min_op;
+template <typename LhsScalar, typename RhsScalar = LhsScalar, int NaNPropagation = PropagateFast>
+struct scalar_max_op;
+template <typename Scalar>
+struct scalar_opposite_op;
+template <typename Scalar>
+struct scalar_conjugate_op;
+template <typename Scalar>
+struct scalar_real_op;
+template <typename Scalar>
+struct scalar_imag_op;
+template <typename Scalar>
+struct scalar_abs_op;
+template <typename Scalar>
+struct scalar_abs2_op;
+template <typename LhsScalar, typename RhsScalar = LhsScalar>
+struct scalar_absolute_difference_op;
+template <typename Scalar>
+struct scalar_sqrt_op;
+template <typename Scalar>
+struct scalar_cbrt_op;
+template <typename Scalar>
+struct scalar_rsqrt_op;
+template <typename Scalar>
+struct scalar_exp_op;
+template <typename Scalar>
+struct scalar_log_op;
+template <typename Scalar>
+struct scalar_cos_op;
+template <typename Scalar>
+struct scalar_sin_op;
+template <typename Scalar>
+struct scalar_acos_op;
+template <typename Scalar>
+struct scalar_asin_op;
+template <typename Scalar>
+struct scalar_tan_op;
+template <typename Scalar>
+struct scalar_atan_op;
+template <typename LhsScalar, typename RhsScalar = LhsScalar>
+struct scalar_atan2_op;
+template <typename Scalar>
+struct scalar_inverse_op;
+template <typename Scalar>
+struct scalar_square_op;
+template <typename Scalar>
+struct scalar_cube_op;
+template <typename Scalar, typename NewType>
+struct scalar_cast_op;
+template <typename Scalar>
+struct scalar_random_op;
+template <typename Scalar>
+struct scalar_constant_op;
+template <typename Scalar>
+struct scalar_identity_op;
+template <typename Scalar>
+struct scalar_sign_op;
 template <typename Scalar, typename ScalarExponent>
 struct scalar_pow_op;
 template <typename Scalar, typename ScalarExponent, bool BaseIsInteger, bool ExponentIsInteger, bool BaseIsComplex,
           bool ExponentIsComplex>
 struct scalar_unary_pow_op;
-template<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_hypot_op;
-template<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_product_op;
-template<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_quotient_op;
+template <typename LhsScalar, typename RhsScalar = LhsScalar>
+struct scalar_hypot_op;
+template <typename LhsScalar, typename RhsScalar = LhsScalar>
+struct scalar_product_op;
+template <typename LhsScalar, typename RhsScalar = LhsScalar>
+struct scalar_quotient_op;
 // logical and bitwise operations
-template <typename Scalar> struct scalar_boolean_and_op;
-template <typename Scalar> struct scalar_boolean_or_op;
-template <typename Scalar> struct scalar_boolean_xor_op;
-template <typename Scalar> struct scalar_boolean_not_op;
-template <typename Scalar> struct scalar_bitwise_and_op;
-template <typename Scalar> struct scalar_bitwise_or_op;
-template <typename Scalar> struct scalar_bitwise_xor_op;
-template <typename Scalar> struct scalar_bitwise_not_op;
+template <typename Scalar>
+struct scalar_boolean_and_op;
+template <typename Scalar>
+struct scalar_boolean_or_op;
+template <typename Scalar>
+struct scalar_boolean_xor_op;
+template <typename Scalar>
+struct scalar_boolean_not_op;
+template <typename Scalar>
+struct scalar_bitwise_and_op;
+template <typename Scalar>
+struct scalar_bitwise_or_op;
+template <typename Scalar>
+struct scalar_bitwise_xor_op;
+template <typename Scalar>
+struct scalar_bitwise_not_op;
 
 // SpecialFunctions module
-template<typename Scalar> struct scalar_lgamma_op;
-template<typename Scalar> struct scalar_digamma_op;
-template<typename Scalar> struct scalar_erf_op;
-template<typename Scalar> struct scalar_erfc_op;
-template<typename Scalar> struct scalar_ndtri_op;
-template<typename Scalar> struct scalar_igamma_op;
-template<typename Scalar> struct scalar_igammac_op;
-template<typename Scalar> struct scalar_zeta_op;
-template<typename Scalar> struct scalar_betainc_op;
+template <typename Scalar>
+struct scalar_lgamma_op;
+template <typename Scalar>
+struct scalar_digamma_op;
+template <typename Scalar>
+struct scalar_erf_op;
+template <typename Scalar>
+struct scalar_erfc_op;
+template <typename Scalar>
+struct scalar_ndtri_op;
+template <typename Scalar>
+struct scalar_igamma_op;
+template <typename Scalar>
+struct scalar_igammac_op;
+template <typename Scalar>
+struct scalar_zeta_op;
+template <typename Scalar>
+struct scalar_betainc_op;
 
 // Bessel functions in SpecialFunctions module
-template<typename Scalar> struct scalar_bessel_i0_op;
-template<typename Scalar> struct scalar_bessel_i0e_op;
-template<typename Scalar> struct scalar_bessel_i1_op;
-template<typename Scalar> struct scalar_bessel_i1e_op;
-template<typename Scalar> struct scalar_bessel_j0_op;
-template<typename Scalar> struct scalar_bessel_y0_op;
-template<typename Scalar> struct scalar_bessel_j1_op;
-template<typename Scalar> struct scalar_bessel_y1_op;
-template<typename Scalar> struct scalar_bessel_k0_op;
-template<typename Scalar> struct scalar_bessel_k0e_op;
-template<typename Scalar> struct scalar_bessel_k1_op;
-template<typename Scalar> struct scalar_bessel_k1e_op;
+template <typename Scalar>
+struct scalar_bessel_i0_op;
+template <typename Scalar>
+struct scalar_bessel_i0e_op;
+template <typename Scalar>
+struct scalar_bessel_i1_op;
+template <typename Scalar>
+struct scalar_bessel_i1e_op;
+template <typename Scalar>
+struct scalar_bessel_j0_op;
+template <typename Scalar>
+struct scalar_bessel_y0_op;
+template <typename Scalar>
+struct scalar_bessel_j1_op;
+template <typename Scalar>
+struct scalar_bessel_y1_op;
+template <typename Scalar>
+struct scalar_bessel_k0_op;
+template <typename Scalar>
+struct scalar_bessel_k0e_op;
+template <typename Scalar>
+struct scalar_bessel_k1_op;
+template <typename Scalar>
+struct scalar_bessel_k1e_op;
 
-
-} // end namespace internal
+}  // end namespace internal
 
 struct IOFormat;
 
 // Array module
-template<typename Scalar_, int Rows_, int Cols_,
-         int Options_ = AutoAlign |
-                          ( (Rows_==1 && Cols_!=1) ? Eigen::RowMajor
-                          : (Cols_==1 && Rows_!=1) ? Eigen::ColMajor
-                          : EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION ),
-         int MaxRows_ = Rows_, int MaxCols_ = Cols_> class Array;
-template<typename ConditionMatrixType, typename ThenMatrixType, typename ElseMatrixType> class Select;
-template<typename MatrixType, typename BinaryOp, int Direction> class PartialReduxExpr;
-template<typename ExpressionType, int Direction> class VectorwiseOp;
-template<typename MatrixType,int RowFactor,int ColFactor> class Replicate;
-template<typename MatrixType, int Direction = BothDirections> class Reverse;
+template <typename Scalar_, int Rows_, int Cols_,
+          int Options_ = AutoAlign | ((Rows_ == 1 && Cols_ != 1)   ? Eigen::RowMajor
+                                      : (Cols_ == 1 && Rows_ != 1) ? Eigen::ColMajor
+                                                                   : EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION),
+          int MaxRows_ = Rows_, int MaxCols_ = Cols_>
+class Array;
+template <typename ConditionMatrixType, typename ThenMatrixType, typename ElseMatrixType>
+class Select;
+template <typename MatrixType, typename BinaryOp, int Direction>
+class PartialReduxExpr;
+template <typename ExpressionType, int Direction>
+class VectorwiseOp;
+template <typename MatrixType, int RowFactor, int ColFactor>
+class Replicate;
+template <typename MatrixType, int Direction = BothDirections>
+class Reverse;
 
 #if defined(EIGEN_USE_LAPACKE) && defined(lapack_int)
 // Lapacke interface requires StorageIndex to be lapack_int
@@ -272,60 +413,93 @@
 typedef int DefaultPermutationIndex;
 #endif
 
-template<typename MatrixType, typename PermutationIndex = DefaultPermutationIndex> class FullPivLU;
-template<typename MatrixType, typename PermutationIndex = DefaultPermutationIndex> class PartialPivLU;
+template <typename MatrixType, typename PermutationIndex = DefaultPermutationIndex>
+class FullPivLU;
+template <typename MatrixType, typename PermutationIndex = DefaultPermutationIndex>
+class PartialPivLU;
 namespace internal {
-template<typename MatrixType> struct inverse_impl;
+template <typename MatrixType>
+struct inverse_impl;
 }
-template<typename MatrixType> class HouseholderQR;
-template<typename MatrixType, typename PermutationIndex = DefaultPermutationIndex> class ColPivHouseholderQR;
-template<typename MatrixType, typename PermutationIndex = DefaultPermutationIndex> class FullPivHouseholderQR;
-template<typename MatrixType, typename PermutationIndex = DefaultPermutationIndex> class CompleteOrthogonalDecomposition;
-template<typename MatrixType> class SVDBase;
-template<typename MatrixType, int Options = 0> class JacobiSVD;
-template<typename MatrixType, int Options = 0> class BDCSVD;
-template<typename MatrixType, int UpLo = Lower> class LLT;
-template<typename MatrixType, int UpLo = Lower> class LDLT;
-template<typename VectorsType, typename CoeffsType, int Side=OnTheLeft> class HouseholderSequence;
-template<typename Scalar>     class JacobiRotation;
+template <typename MatrixType>
+class HouseholderQR;
+template <typename MatrixType, typename PermutationIndex = DefaultPermutationIndex>
+class ColPivHouseholderQR;
+template <typename MatrixType, typename PermutationIndex = DefaultPermutationIndex>
+class FullPivHouseholderQR;
+template <typename MatrixType, typename PermutationIndex = DefaultPermutationIndex>
+class CompleteOrthogonalDecomposition;
+template <typename MatrixType>
+class SVDBase;
+template <typename MatrixType, int Options = 0>
+class JacobiSVD;
+template <typename MatrixType, int Options = 0>
+class BDCSVD;
+template <typename MatrixType, int UpLo = Lower>
+class LLT;
+template <typename MatrixType, int UpLo = Lower>
+class LDLT;
+template <typename VectorsType, typename CoeffsType, int Side = OnTheLeft>
+class HouseholderSequence;
+template <typename Scalar>
+class JacobiRotation;
 
 // Geometry module:
 namespace internal {
-template<typename Derived, typename OtherDerived, int Size = MatrixBase<Derived>::SizeAtCompileTime> struct cross_impl;
+template <typename Derived, typename OtherDerived, int Size = MatrixBase<Derived>::SizeAtCompileTime>
+struct cross_impl;
 }
-template<typename Derived, int Dim_> class RotationBase;
-template<typename Derived> class QuaternionBase;
-template<typename Scalar> class Rotation2D;
-template<typename Scalar> class AngleAxis;
-template<typename Scalar,int Dim> class Translation;
-template<typename Scalar,int Dim> class AlignedBox;
-template<typename Scalar, int Options = AutoAlign> class Quaternion;
-template<typename Scalar,int Dim,int Mode,int Options_=AutoAlign> class Transform;
-template <typename Scalar_, int AmbientDim_, int Options=AutoAlign> class ParametrizedLine;
-template <typename Scalar_, int AmbientDim_, int Options=AutoAlign> class Hyperplane;
-template<typename Scalar> class UniformScaling;
-template<typename MatrixType,int Direction> class Homogeneous;
+template <typename Derived, int Dim_>
+class RotationBase;
+template <typename Derived>
+class QuaternionBase;
+template <typename Scalar>
+class Rotation2D;
+template <typename Scalar>
+class AngleAxis;
+template <typename Scalar, int Dim>
+class Translation;
+template <typename Scalar, int Dim>
+class AlignedBox;
+template <typename Scalar, int Options = AutoAlign>
+class Quaternion;
+template <typename Scalar, int Dim, int Mode, int Options_ = AutoAlign>
+class Transform;
+template <typename Scalar_, int AmbientDim_, int Options = AutoAlign>
+class ParametrizedLine;
+template <typename Scalar_, int AmbientDim_, int Options = AutoAlign>
+class Hyperplane;
+template <typename Scalar>
+class UniformScaling;
+template <typename MatrixType, int Direction>
+class Homogeneous;
 
 // Sparse module:
-template<typename Derived> class SparseMatrixBase;
+template <typename Derived>
+class SparseMatrixBase;
 
 // MatrixFunctions module
-template<typename Derived> struct MatrixExponentialReturnValue;
-template<typename Derived> class MatrixFunctionReturnValue;
-template<typename Derived> class MatrixSquareRootReturnValue;
-template<typename Derived> class MatrixLogarithmReturnValue;
-template<typename Derived> class MatrixPowerReturnValue;
-template<typename Derived> class MatrixComplexPowerReturnValue;
+template <typename Derived>
+struct MatrixExponentialReturnValue;
+template <typename Derived>
+class MatrixFunctionReturnValue;
+template <typename Derived>
+class MatrixSquareRootReturnValue;
+template <typename Derived>
+class MatrixLogarithmReturnValue;
+template <typename Derived>
+class MatrixPowerReturnValue;
+template <typename Derived>
+class MatrixComplexPowerReturnValue;
 
 namespace internal {
 template <typename Scalar>
-struct stem_function
-{
+struct stem_function {
   typedef std::complex<typename NumTraits<Scalar>::Real> ComplexScalar;
   typedef ComplexScalar type(ComplexScalar, int);
 };
-}
+}  // namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_FORWARDDECLARATIONS_H
+#endif  // EIGEN_FORWARDDECLARATIONS_H
diff --git a/Eigen/src/Core/util/IndexedViewHelper.h b/Eigen/src/Core/util/IndexedViewHelper.h
index 29cefd5..3b45108 100644
--- a/Eigen/src/Core/util/IndexedViewHelper.h
+++ b/Eigen/src/Core/util/IndexedViewHelper.h
@@ -7,7 +7,6 @@
 // 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_INDEXED_VIEW_HELPER_H
 #define EIGEN_INDEXED_VIEW_HELPER_H
 
@@ -25,23 +24,24 @@
 typedef symbolic::SymbolExpr<internal::symbolic_last_tag> last_t;
 
 /** \var last
-  * \ingroup Core_Module
-  *
-  * Can be used as a parameter to Eigen::seq and Eigen::seqN functions to symbolically reference the last element/row/columns
-  * of the underlying vector or matrix once passed to DenseBase::operator()(const RowIndices&, const ColIndices&).
-  *
-  * This symbolic placeholder supports standard arithmetic operations.
-  *
-  * A typical usage example would be:
-  * \code
-  * using namespace Eigen;
-  * using Eigen::placeholders::last;
-  * VectorXd v(n);
-  * v(seq(2,last-2)).setOnes();
-  * \endcode
-  *
-  * \sa end
-  */
+ * \ingroup Core_Module
+ *
+ * Can be used as a parameter to Eigen::seq and Eigen::seqN functions to symbolically reference the last
+ * element/row/columns of the underlying vector or matrix once passed to DenseBase::operator()(const RowIndices&, const
+ * ColIndices&).
+ *
+ * This symbolic placeholder supports standard arithmetic operations.
+ *
+ * A typical usage example would be:
+ * \code
+ * using namespace Eigen;
+ * using Eigen::placeholders::last;
+ * VectorXd v(n);
+ * v(seq(2,last-2)).setOnes();
+ * \endcode
+ *
+ * \sa end
+ */
 static const last_t last;
 
 }  // namespace placeholders
@@ -49,44 +49,48 @@
 namespace internal {
 
 // Replace symbolic last/end "keywords" by their true runtime value
-inline Index eval_expr_given_size(Index x, Index /* size */)   { return x; }
+inline Index eval_expr_given_size(Index x, Index /* size */) { return x; }
 
-template<int N>
-FixedInt<N> eval_expr_given_size(FixedInt<N> x, Index /*size*/)   { return x; }
+template <int N>
+FixedInt<N> eval_expr_given_size(FixedInt<N> x, Index /*size*/) {
+  return x;
+}
 
-template<typename Derived>
-Index eval_expr_given_size(const symbolic::BaseExpr<Derived> &x, Index size)
-{
-  return x.derived().eval(Eigen::placeholders::last=size-1);
+template <typename Derived>
+Index eval_expr_given_size(const symbolic::BaseExpr<Derived>& x, Index size) {
+  return x.derived().eval(Eigen::placeholders::last = size - 1);
 }
 
 // Extract increment/step at compile time
-template<typename T, typename EnableIf = void> struct get_compile_time_incr {
+template <typename T, typename EnableIf = void>
+struct get_compile_time_incr {
   enum { value = UndefinedIncr };
 };
 
 // Analogue of std::get<0>(x), but tailored for our needs.
-template<typename T>
-EIGEN_CONSTEXPR Index first(const T& x) EIGEN_NOEXCEPT { return x.first(); }
+template <typename T>
+EIGEN_CONSTEXPR Index first(const T& x) EIGEN_NOEXCEPT {
+  return x.first();
+}
 
-// IndexedViewCompatibleType/makeIndexedViewCompatible turn an arbitrary object of type T into something usable by MatrixSlice
-// The generic implementation is a no-op
-template<typename T,int XprSize,typename EnableIf=void>
+// IndexedViewCompatibleType/makeIndexedViewCompatible turn an arbitrary object of type T into something usable by
+// MatrixSlice The generic implementation is a no-op
+template <typename T, int XprSize, typename EnableIf = void>
 struct IndexedViewCompatibleType {
   typedef T type;
 };
 
-template<typename T,typename Q>
-const T& makeIndexedViewCompatible(const T& x, Index /*size*/, Q) { return x; }
+template <typename T, typename Q>
+const T& makeIndexedViewCompatible(const T& x, Index /*size*/, Q) {
+  return x;
+}
 
 //--------------------------------------------------------------------------------
 // Handling of a single Index
 //--------------------------------------------------------------------------------
 
 struct SingleRange {
-  enum {
-    SizeAtCompileTime = 1
-  };
+  enum { SizeAtCompileTime = 1 };
   SingleRange(Index val) : m_value(val) {}
   Index operator[](Index) const { return m_value; }
   static EIGEN_CONSTEXPR Index size() EIGEN_NOEXCEPT { return 1; }
@@ -94,103 +98,111 @@
   Index m_value;
 };
 
-template<> struct get_compile_time_incr<SingleRange> {
-  enum { value = 1 }; // 1 or 0 ??
+template <>
+struct get_compile_time_incr<SingleRange> {
+  enum { value = 1 };  // 1 or 0 ??
 };
 
-// Turn a single index into something that looks like an array (i.e., that exposes a .size(), and operator[](int) methods)
-template<typename T, int XprSize>
-struct IndexedViewCompatibleType<T,XprSize,std::enable_if_t<internal::is_integral<T>::value>> {
+// Turn a single index into something that looks like an array (i.e., that exposes a .size(), and operator[](int)
+// methods)
+template <typename T, int XprSize>
+struct IndexedViewCompatibleType<T, XprSize, std::enable_if_t<internal::is_integral<T>::value>> {
   // Here we could simply use Array, but maybe it's less work for the compiler to use
   // a simpler wrapper as SingleRange
-  //typedef Eigen::Array<Index,1,1> type;
+  // typedef Eigen::Array<Index,1,1> type;
   typedef SingleRange type;
 };
 
-template<typename T, int XprSize>
+template <typename T, int XprSize>
 struct IndexedViewCompatibleType<T, XprSize, std::enable_if_t<symbolic::is_symbolic<T>::value>> {
   typedef SingleRange type;
 };
 
-
-template<typename T>
-std::enable_if_t<symbolic::is_symbolic<T>::value,SingleRange>
-makeIndexedViewCompatible(const T& id, Index size, SpecializedType) {
-  return eval_expr_given_size(id,size);
+template <typename T>
+std::enable_if_t<symbolic::is_symbolic<T>::value, SingleRange> makeIndexedViewCompatible(const T& id, Index size,
+                                                                                         SpecializedType) {
+  return eval_expr_given_size(id, size);
 }
 
 //--------------------------------------------------------------------------------
 // Handling of all
 //--------------------------------------------------------------------------------
 
-struct all_t { all_t() {} };
+struct all_t {
+  all_t() {}
+};
 
 // Convert a symbolic 'all' into a usable range type
-template<int XprSize>
+template <int XprSize>
 struct AllRange {
   enum { SizeAtCompileTime = XprSize };
   AllRange(Index size = XprSize) : m_size(size) {}
   EIGEN_CONSTEXPR Index operator[](Index i) const EIGEN_NOEXCEPT { return i; }
   EIGEN_CONSTEXPR Index size() const EIGEN_NOEXCEPT { return m_size.value(); }
   EIGEN_CONSTEXPR Index first() const EIGEN_NOEXCEPT { return 0; }
-  variable_if_dynamic<Index,XprSize> m_size;
+  variable_if_dynamic<Index, XprSize> m_size;
 };
 
-template<int XprSize>
-struct IndexedViewCompatibleType<all_t,XprSize> {
+template <int XprSize>
+struct IndexedViewCompatibleType<all_t, XprSize> {
   typedef AllRange<XprSize> type;
 };
 
-template<typename XprSizeType>
-inline AllRange<get_fixed_value<XprSizeType>::value> makeIndexedViewCompatible(all_t , XprSizeType size, SpecializedType) {
+template <typename XprSizeType>
+inline AllRange<get_fixed_value<XprSizeType>::value> makeIndexedViewCompatible(all_t, XprSizeType size,
+                                                                               SpecializedType) {
   return AllRange<get_fixed_value<XprSizeType>::value>(size);
 }
 
-template<int Size> struct get_compile_time_incr<AllRange<Size> > {
+template <int Size>
+struct get_compile_time_incr<AllRange<Size>> {
   enum { value = 1 };
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 namespace placeholders {
 
-typedef symbolic::AddExpr<symbolic::SymbolExpr<internal::symbolic_last_tag>,symbolic::ValueExpr<Eigen::internal::FixedInt<1> > > lastp1_t;
+typedef symbolic::AddExpr<symbolic::SymbolExpr<internal::symbolic_last_tag>,
+                          symbolic::ValueExpr<Eigen::internal::FixedInt<1>>>
+    lastp1_t;
 typedef Eigen::internal::all_t all_t;
 
 /** \var lastp1
-  * \ingroup Core_Module
-  *
-  * Can be used as a parameter to Eigen::seq and Eigen::seqN functions to symbolically
-  * reference the last+1 element/row/columns of the underlying vector or matrix once
-  * passed to DenseBase::operator()(const RowIndices&, const ColIndices&).
-  *
-  * This symbolic placeholder supports standard arithmetic operations.
-  * It is essentially an alias to last+fix<1>.
-  *
-  * \sa last
-  */
+ * \ingroup Core_Module
+ *
+ * Can be used as a parameter to Eigen::seq and Eigen::seqN functions to symbolically
+ * reference the last+1 element/row/columns of the underlying vector or matrix once
+ * passed to DenseBase::operator()(const RowIndices&, const ColIndices&).
+ *
+ * This symbolic placeholder supports standard arithmetic operations.
+ * It is essentially an alias to last+fix<1>.
+ *
+ * \sa last
+ */
 #ifdef EIGEN_PARSED_BY_DOXYGEN
-static const auto lastp1 = last+fix<1>;
+static const auto lastp1 = last + fix<1>;
 #else
 // Using a FixedExpr<1> expression is important here to make sure the compiler
 // can fully optimize the computation starting indices with zero overhead.
-static const lastp1_t lastp1(last+fix<1>());
+static const lastp1_t lastp1(last + fix<1>());
 #endif
 
 /** \var end
-  * \ingroup Core_Module
-  * \sa lastp1
-  */
+ * \ingroup Core_Module
+ * \sa lastp1
+ */
 static const lastp1_t end = lastp1;
 
 /** \var all
-  * \ingroup Core_Module
-  * Can be used as a parameter to DenseBase::operator()(const RowIndices&, const ColIndices&) to index all rows or columns
-  */
+ * \ingroup Core_Module
+ * Can be used as a parameter to DenseBase::operator()(const RowIndices&, const ColIndices&) to index all rows or
+ * columns
+ */
 static const Eigen::internal::all_t all;
 
-} // namespace placeholders
+}  // namespace placeholders
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_INDEXED_VIEW_HELPER_H
+#endif  // EIGEN_INDEXED_VIEW_HELPER_H
diff --git a/Eigen/src/Core/util/IntegralConstant.h b/Eigen/src/Core/util/IntegralConstant.h
index 66c031d..279d553 100644
--- a/Eigen/src/Core/util/IntegralConstant.h
+++ b/Eigen/src/Core/util/IntegralConstant.h
@@ -7,7 +7,6 @@
 // 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_INTEGRAL_CONSTANT_H
 #define EIGEN_INTEGRAL_CONSTANT_H
 
@@ -18,236 +17,268 @@
 
 namespace internal {
 
-template<int N> class FixedInt;
-template<int N> class VariableAndFixedInt;
+template <int N>
+class FixedInt;
+template <int N>
+class VariableAndFixedInt;
 
 /** \internal
-  * \class FixedInt
-  *
-  * This class embeds a compile-time integer \c N.
-  *
-  * It is similar to c++11 std::integral_constant<int,N> but with some additional features
-  * such as:
-  *  - implicit conversion to int
-  *  - arithmetic and some bitwise operators: -, +, *, /, %, &, |
-  *  - c++98/14 compatibility with fix<N> and fix<N>() syntax to define integral constants.
-  *
-  * It is strongly discouraged to directly deal with this class FixedInt. Instances are expected to
-  * be created by the user using Eigen::fix<N> or Eigen::fix<N>().
-  * \code
-  * internal::cleanup_index_type<T>::type
-  * internal::cleanup_index_type<T,DynamicKey>::type
-  * \endcode
-  * where T can a FixedInt<N>, a pointer to function FixedInt<N> (*)(), or numerous other integer-like representations.
-  * \c DynamicKey is either Dynamic (default) or DynamicIndex and used to identify true compile-time values.
-  *
-  * For convenience, you can extract the compile-time value \c N in a generic way using the following helper:
-  * \code
-  * internal::get_fixed_value<T,DefaultVal>::value
-  * \endcode
-  * that will give you \c N if T equals FixedInt<N> or FixedInt<N> (*)(), and \c DefaultVal if T does not embed any compile-time value (e.g., T==int).
-  *
-  * \sa fix<N>, class VariableAndFixedInt
-  */
-template<int N> class FixedInt
-{
-public:
+ * \class FixedInt
+ *
+ * This class embeds a compile-time integer \c N.
+ *
+ * It is similar to c++11 std::integral_constant<int,N> but with some additional features
+ * such as:
+ *  - implicit conversion to int
+ *  - arithmetic and some bitwise operators: -, +, *, /, %, &, |
+ *  - c++98/14 compatibility with fix<N> and fix<N>() syntax to define integral constants.
+ *
+ * It is strongly discouraged to directly deal with this class FixedInt. Instances are expected to
+ * be created by the user using Eigen::fix<N> or Eigen::fix<N>().
+ * \code
+ * internal::cleanup_index_type<T>::type
+ * internal::cleanup_index_type<T,DynamicKey>::type
+ * \endcode
+ * where T can a FixedInt<N>, a pointer to function FixedInt<N> (*)(), or numerous other integer-like representations.
+ * \c DynamicKey is either Dynamic (default) or DynamicIndex and used to identify true compile-time values.
+ *
+ * For convenience, you can extract the compile-time value \c N in a generic way using the following helper:
+ * \code
+ * internal::get_fixed_value<T,DefaultVal>::value
+ * \endcode
+ * that will give you \c N if T equals FixedInt<N> or FixedInt<N> (*)(), and \c DefaultVal if T does not embed any
+ * compile-time value (e.g., T==int).
+ *
+ * \sa fix<N>, class VariableAndFixedInt
+ */
+template <int N>
+class FixedInt {
+ public:
   static const int value = N;
   EIGEN_CONSTEXPR operator int() const { return value; }
-  
+
   EIGEN_CONSTEXPR
   FixedInt() = default;
-  
+
   EIGEN_CONSTEXPR
-  FixedInt(std::integral_constant<int,N>) {}
-  
+  FixedInt(std::integral_constant<int, N>) {}
+
   EIGEN_CONSTEXPR
-  FixedInt( VariableAndFixedInt<N> other) {
-    #ifndef EIGEN_INTERNAL_DEBUGGING
+  FixedInt(VariableAndFixedInt<N> other) {
+#ifndef EIGEN_INTERNAL_DEBUGGING
     EIGEN_UNUSED_VARIABLE(other);
-    #endif
-    eigen_internal_assert(int(other)==N);
+#endif
+    eigen_internal_assert(int(other) == N);
   }
 
   EIGEN_CONSTEXPR
   FixedInt<-N> operator-() const { return FixedInt<-N>(); }
-  
-  template<int M>
-  EIGEN_CONSTEXPR
-  FixedInt<N+M> operator+( FixedInt<M>) const { return FixedInt<N+M>(); }
-  
-  template<int M>
-  EIGEN_CONSTEXPR
-  FixedInt<N-M> operator-( FixedInt<M>) const { return FixedInt<N-M>(); }
-  
-  template<int M>
-  EIGEN_CONSTEXPR
-  FixedInt<N*M> operator*( FixedInt<M>) const { return FixedInt<N*M>(); }
-  
-  template<int M>
-  EIGEN_CONSTEXPR
-  FixedInt<N/M> operator/( FixedInt<M>) const { return FixedInt<N/M>(); }
-  
-  template<int M>
-  EIGEN_CONSTEXPR
-  FixedInt<N%M> operator%( FixedInt<M>) const { return FixedInt<N%M>(); }
-  
-  template<int M>
-  EIGEN_CONSTEXPR
-  FixedInt<N|M> operator|( FixedInt<M>) const { return FixedInt<N|M>(); }
-  
-  template<int M>
-  EIGEN_CONSTEXPR
-  FixedInt<N&M> operator&( FixedInt<M>) const { return FixedInt<N&M>(); }
+
+  template <int M>
+  EIGEN_CONSTEXPR FixedInt<N + M> operator+(FixedInt<M>) const {
+    return FixedInt<N + M>();
+  }
+
+  template <int M>
+  EIGEN_CONSTEXPR FixedInt<N - M> operator-(FixedInt<M>) const {
+    return FixedInt<N - M>();
+  }
+
+  template <int M>
+  EIGEN_CONSTEXPR FixedInt<N * M> operator*(FixedInt<M>) const {
+    return FixedInt<N * M>();
+  }
+
+  template <int M>
+  EIGEN_CONSTEXPR FixedInt<N / M> operator/(FixedInt<M>) const {
+    return FixedInt<N / M>();
+  }
+
+  template <int M>
+  EIGEN_CONSTEXPR FixedInt<N % M> operator%(FixedInt<M>) const {
+    return FixedInt<N % M>();
+  }
+
+  template <int M>
+  EIGEN_CONSTEXPR FixedInt<N | M> operator|(FixedInt<M>) const {
+    return FixedInt<N | M>();
+  }
+
+  template <int M>
+  EIGEN_CONSTEXPR FixedInt<N & M> operator&(FixedInt<M>) const {
+    return FixedInt<N & M>();
+  }
 
   // Needed in C++14 to allow fix<N>():
-  EIGEN_CONSTEXPR FixedInt operator() () const { return *this; }
+  EIGEN_CONSTEXPR FixedInt operator()() const { return *this; }
 
-  VariableAndFixedInt<N> operator() (int val) const { return VariableAndFixedInt<N>(val); }
+  VariableAndFixedInt<N> operator()(int val) const { return VariableAndFixedInt<N>(val); }
 };
 
 /** \internal
-  * \class VariableAndFixedInt
-  *
-  * This class embeds both a compile-time integer \c N and a runtime integer.
-  * Both values are supposed to be equal unless the compile-time value \c N has a special
-  * value meaning that the runtime-value should be used. Depending on the context, this special
-  * value can be either Eigen::Dynamic (for positive quantities) or Eigen::DynamicIndex (for
-  * quantities that can be negative).
-  *
-  * It is the return-type of the function Eigen::fix<N>(int), and most of the time this is the only
-  * way it is used. It is strongly discouraged to directly deal with instances of VariableAndFixedInt.
-  * Indeed, in order to write generic code, it is the responsibility of the callee to properly convert
-  * it to either a true compile-time quantity (i.e. a FixedInt<N>), or to a runtime quantity (e.g., an Index)
-  * using the following generic helper:
-  * \code
-  * internal::cleanup_index_type<T>::type
-  * internal::cleanup_index_type<T,DynamicKey>::type
-  * \endcode
-  * where T can be a template instantiation of VariableAndFixedInt or numerous other integer-like representations.
-  * \c DynamicKey is either Dynamic (default) or DynamicIndex and used to identify true compile-time values.
-  *
-  * For convenience, you can also extract the compile-time value \c N using the following helper:
-  * \code
-  * internal::get_fixed_value<T,DefaultVal>::value
-  * \endcode
-  * that will give you \c N if T equals VariableAndFixedInt<N>, and \c DefaultVal if T does not embed any compile-time value (e.g., T==int).
-  *
-  * \sa fix<N>(int), class FixedInt
-  */
-template<int N> class VariableAndFixedInt
-{
-public:
+ * \class VariableAndFixedInt
+ *
+ * This class embeds both a compile-time integer \c N and a runtime integer.
+ * Both values are supposed to be equal unless the compile-time value \c N has a special
+ * value meaning that the runtime-value should be used. Depending on the context, this special
+ * value can be either Eigen::Dynamic (for positive quantities) or Eigen::DynamicIndex (for
+ * quantities that can be negative).
+ *
+ * It is the return-type of the function Eigen::fix<N>(int), and most of the time this is the only
+ * way it is used. It is strongly discouraged to directly deal with instances of VariableAndFixedInt.
+ * Indeed, in order to write generic code, it is the responsibility of the callee to properly convert
+ * it to either a true compile-time quantity (i.e. a FixedInt<N>), or to a runtime quantity (e.g., an Index)
+ * using the following generic helper:
+ * \code
+ * internal::cleanup_index_type<T>::type
+ * internal::cleanup_index_type<T,DynamicKey>::type
+ * \endcode
+ * where T can be a template instantiation of VariableAndFixedInt or numerous other integer-like representations.
+ * \c DynamicKey is either Dynamic (default) or DynamicIndex and used to identify true compile-time values.
+ *
+ * For convenience, you can also extract the compile-time value \c N using the following helper:
+ * \code
+ * internal::get_fixed_value<T,DefaultVal>::value
+ * \endcode
+ * that will give you \c N if T equals VariableAndFixedInt<N>, and \c DefaultVal if T does not embed any compile-time
+ * value (e.g., T==int).
+ *
+ * \sa fix<N>(int), class FixedInt
+ */
+template <int N>
+class VariableAndFixedInt {
+ public:
   static const int value = N;
   operator int() const { return m_value; }
   VariableAndFixedInt(int val) { m_value = val; }
-protected:
+
+ protected:
   int m_value;
 };
 
-template<typename T, int Default=Dynamic> struct get_fixed_value {
+template <typename T, int Default = Dynamic>
+struct get_fixed_value {
   static const int value = Default;
 };
 
-template<int N,int Default> struct get_fixed_value<FixedInt<N>,Default> {
+template <int N, int Default>
+struct get_fixed_value<FixedInt<N>, Default> {
   static const int value = N;
 };
 
-template<int N,int Default> struct get_fixed_value<VariableAndFixedInt<N>,Default> {
-  static const int value = N ;
-};
-
-template<typename T, int N, int Default>
-struct get_fixed_value<variable_if_dynamic<T,N>,Default> {
+template <int N, int Default>
+struct get_fixed_value<VariableAndFixedInt<N>, Default> {
   static const int value = N;
 };
 
-template<typename T> EIGEN_DEVICE_FUNC Index get_runtime_value(const T &x) { return x; }
+template <typename T, int N, int Default>
+struct get_fixed_value<variable_if_dynamic<T, N>, Default> {
+  static const int value = N;
+};
+
+template <typename T>
+EIGEN_DEVICE_FUNC Index get_runtime_value(const T &x) {
+  return x;
+}
 
 // Cleanup integer/FixedInt/VariableAndFixedInt/etc types:
 
 // By default, no cleanup:
-template<typename T, int DynamicKey=Dynamic, typename EnableIf=void> struct cleanup_index_type { typedef T type; };
+template <typename T, int DynamicKey = Dynamic, typename EnableIf = void>
+struct cleanup_index_type {
+  typedef T type;
+};
 
 // Convert any integral type (e.g., short, int, unsigned int, etc.) to Eigen::Index
-template<typename T, int DynamicKey> struct cleanup_index_type<T,DynamicKey,std::enable_if_t<internal::is_integral<T>::value>> { typedef Index type; };
+template <typename T, int DynamicKey>
+struct cleanup_index_type<T, DynamicKey, std::enable_if_t<internal::is_integral<T>::value>> {
+  typedef Index type;
+};
 
 // If VariableAndFixedInt does not match DynamicKey, then we turn it to a pure compile-time value:
-template<int N, int DynamicKey> struct cleanup_index_type<VariableAndFixedInt<N>, DynamicKey> { typedef FixedInt<N> type; };
+template <int N, int DynamicKey>
+struct cleanup_index_type<VariableAndFixedInt<N>, DynamicKey> {
+  typedef FixedInt<N> type;
+};
 // If VariableAndFixedInt matches DynamicKey, then we turn it to a pure runtime-value (aka Index):
-template<int DynamicKey> struct cleanup_index_type<VariableAndFixedInt<DynamicKey>, DynamicKey> { typedef Index type; };
+template <int DynamicKey>
+struct cleanup_index_type<VariableAndFixedInt<DynamicKey>, DynamicKey> {
+  typedef Index type;
+};
 
-template<int N, int DynamicKey> struct cleanup_index_type<std::integral_constant<int,N>, DynamicKey> { typedef FixedInt<N> type; };
+template <int N, int DynamicKey>
+struct cleanup_index_type<std::integral_constant<int, N>, DynamicKey> {
+  typedef FixedInt<N> type;
+};
 
-} // end namespace internal
+}  // end namespace internal
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
 
-template<int N>
+template <int N>
 constexpr internal::FixedInt<N> fix{};
 
-#else // EIGEN_PARSED_BY_DOXYGEN
+#else  // EIGEN_PARSED_BY_DOXYGEN
 
 /** \var fix<N>()
-  * \ingroup Core_Module
-  *
-  * This \em identifier permits to construct an object embedding a compile-time integer \c N.
-  *
-  * \tparam N the compile-time integer value
-  *
-  * It is typically used in conjunction with the Eigen::seq and Eigen::seqN functions to pass compile-time values to them:
-  * \code
-  * seqN(10,fix<4>,fix<-3>)   // <=> [10 7 4 1]
-  * \endcode
-  *
-  * See also the function fix(int) to pass both a compile-time and runtime value.
-  *
-  * In c++14, it is implemented as:
-  * \code
-  * template<int N> static const internal::FixedInt<N> fix{};
-  * \endcode
-  * where internal::FixedInt<N> is an internal template class similar to
-  * <a href="http://en.cppreference.com/w/cpp/types/integral_constant">\c std::integral_constant </a><tt> <int,N> </tt>
-  * Here, \c fix<N> is thus an object of type \c internal::FixedInt<N>.
-  *
-  * \sa fix<N>(int), seq, seqN
-  */
-template<int N>
+ * \ingroup Core_Module
+ *
+ * This \em identifier permits to construct an object embedding a compile-time integer \c N.
+ *
+ * \tparam N the compile-time integer value
+ *
+ * It is typically used in conjunction with the Eigen::seq and Eigen::seqN functions to pass compile-time values to
+ * them: \code seqN(10,fix<4>,fix<-3>)   // <=> [10 7 4 1] \endcode
+ *
+ * See also the function fix(int) to pass both a compile-time and runtime value.
+ *
+ * In c++14, it is implemented as:
+ * \code
+ * template<int N> static const internal::FixedInt<N> fix{};
+ * \endcode
+ * where internal::FixedInt<N> is an internal template class similar to
+ * <a href="http://en.cppreference.com/w/cpp/types/integral_constant">\c std::integral_constant </a><tt> <int,N> </tt>
+ * Here, \c fix<N> is thus an object of type \c internal::FixedInt<N>.
+ *
+ * \sa fix<N>(int), seq, seqN
+ */
+template <int N>
 static const auto fix();
 
 /** \fn fix<N>(int)
-  * \ingroup Core_Module
-  *
-  * This function returns an object embedding both a compile-time integer \c N, and a fallback runtime value \a val.
-  *
-  * \tparam N the compile-time integer value
-  * \param  val the fallback runtime integer value
-  *
-  * This function is a more general version of the \ref fix identifier/function that can be used in template code
-  * where the compile-time value could turn out to actually mean "undefined at compile-time". For positive integers
-  * such as a size or a dimension, this case is identified by Eigen::Dynamic, whereas runtime signed integers
-  * (e.g., an increment/stride) are identified as Eigen::DynamicIndex. In such a case, the runtime value \a val
-  * will be used as a fallback.
-  *
-  * A typical use case would be:
-  * \code
-  * template<typename Derived> void foo(const MatrixBase<Derived> &mat) {
-  *   const int N = Derived::RowsAtCompileTime==Dynamic ? Dynamic : Derived::RowsAtCompileTime/2;
-  *   const int n = mat.rows()/2;
-  *   ... mat( seqN(0,fix<N>(n) ) ...;
-  * }
-  * \endcode
-  * In this example, the function Eigen::seqN knows that the second argument is expected to be a size.
-  * If the passed compile-time value N equals Eigen::Dynamic, then the proxy object returned by fix will be dissmissed, and converted to an Eigen::Index of value \c n.
-  * Otherwise, the runtime-value \c n will be dissmissed, and the returned ArithmeticSequence will be of the exact same type as <tt> seqN(0,fix<N>) </tt>.
-  *
-  * \sa fix, seqN, class ArithmeticSequence
-  */
-template<int N>
+ * \ingroup Core_Module
+ *
+ * This function returns an object embedding both a compile-time integer \c N, and a fallback runtime value \a val.
+ *
+ * \tparam N the compile-time integer value
+ * \param  val the fallback runtime integer value
+ *
+ * This function is a more general version of the \ref fix identifier/function that can be used in template code
+ * where the compile-time value could turn out to actually mean "undefined at compile-time". For positive integers
+ * such as a size or a dimension, this case is identified by Eigen::Dynamic, whereas runtime signed integers
+ * (e.g., an increment/stride) are identified as Eigen::DynamicIndex. In such a case, the runtime value \a val
+ * will be used as a fallback.
+ *
+ * A typical use case would be:
+ * \code
+ * template<typename Derived> void foo(const MatrixBase<Derived> &mat) {
+ *   const int N = Derived::RowsAtCompileTime==Dynamic ? Dynamic : Derived::RowsAtCompileTime/2;
+ *   const int n = mat.rows()/2;
+ *   ... mat( seqN(0,fix<N>(n) ) ...;
+ * }
+ * \endcode
+ * In this example, the function Eigen::seqN knows that the second argument is expected to be a size.
+ * If the passed compile-time value N equals Eigen::Dynamic, then the proxy object returned by fix will be dissmissed,
+ * and converted to an Eigen::Index of value \c n. Otherwise, the runtime-value \c n will be dissmissed, and the
+ * returned ArithmeticSequence will be of the exact same type as <tt> seqN(0,fix<N>) </tt>.
+ *
+ * \sa fix, seqN, class ArithmeticSequence
+ */
+template <int N>
 static const auto fix(int val);
 
-#endif // EIGEN_PARSED_BY_DOXYGEN
+#endif  // EIGEN_PARSED_BY_DOXYGEN
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_INTEGRAL_CONSTANT_H
+#endif  // EIGEN_INTEGRAL_CONSTANT_H
diff --git a/Eigen/src/Core/util/MKL_support.h b/Eigen/src/Core/util/MKL_support.h
index 9a91352..3e44a26 100644
--- a/Eigen/src/Core/util/MKL_support.h
+++ b/Eigen/src/Core/util/MKL_support.h
@@ -34,49 +34,49 @@
 #define EIGEN_MKL_SUPPORT_H
 
 #ifdef EIGEN_USE_MKL_ALL
-  #ifndef EIGEN_USE_BLAS
-    #define EIGEN_USE_BLAS
-  #endif
-  #ifndef EIGEN_USE_LAPACKE
-    #define EIGEN_USE_LAPACKE
-  #endif
-  #ifndef EIGEN_USE_MKL_VML
-    #define EIGEN_USE_MKL_VML
-  #endif
+#ifndef EIGEN_USE_BLAS
+#define EIGEN_USE_BLAS
+#endif
+#ifndef EIGEN_USE_LAPACKE
+#define EIGEN_USE_LAPACKE
+#endif
+#ifndef EIGEN_USE_MKL_VML
+#define EIGEN_USE_MKL_VML
+#endif
 #endif
 
 #ifdef EIGEN_USE_LAPACKE_STRICT
-  #define EIGEN_USE_LAPACKE
+#define EIGEN_USE_LAPACKE
 #endif
 
 #if defined(EIGEN_USE_MKL_VML) && !defined(EIGEN_USE_MKL)
-  #define EIGEN_USE_MKL
+#define EIGEN_USE_MKL
 #endif
 
-
 #if defined EIGEN_USE_MKL
-#   if (!defined MKL_DIRECT_CALL) && (!defined EIGEN_MKL_NO_DIRECT_CALL)
-#       define MKL_DIRECT_CALL
-#       define MKL_DIRECT_CALL_JUST_SET
-#   endif
-#   include <mkl.h>
+#if (!defined MKL_DIRECT_CALL) && (!defined EIGEN_MKL_NO_DIRECT_CALL)
+#define MKL_DIRECT_CALL
+#define MKL_DIRECT_CALL_JUST_SET
+#endif
+#include <mkl.h>
 /*Check IMKL version for compatibility: < 10.3 is not usable with Eigen*/
-#   ifndef INTEL_MKL_VERSION
-#       undef EIGEN_USE_MKL /* INTEL_MKL_VERSION is not even defined on older versions */
-#   elif INTEL_MKL_VERSION < 100305    /* the intel-mkl-103-release-notes say this was when the lapacke.h interface was added*/
-#       undef EIGEN_USE_MKL
-#   endif
-#   ifndef EIGEN_USE_MKL
-    /*If the MKL version is too old, undef everything*/
-#       undef   EIGEN_USE_MKL_ALL
-#       undef   EIGEN_USE_LAPACKE
-#       undef   EIGEN_USE_MKL_VML
-#       undef   EIGEN_USE_LAPACKE_STRICT
-#       undef   EIGEN_USE_LAPACKE
-#       ifdef   MKL_DIRECT_CALL_JUST_SET
-#           undef MKL_DIRECT_CALL
-#       endif
-#   endif
+#ifndef INTEL_MKL_VERSION
+#undef EIGEN_USE_MKL /* INTEL_MKL_VERSION is not even defined on older versions */
+#elif INTEL_MKL_VERSION < \
+    100305 /* the intel-mkl-103-release-notes say this was when the lapacke.h interface was added*/
+#undef EIGEN_USE_MKL
+#endif
+#ifndef EIGEN_USE_MKL
+/*If the MKL version is too old, undef everything*/
+#undef EIGEN_USE_MKL_ALL
+#undef EIGEN_USE_LAPACKE
+#undef EIGEN_USE_MKL_VML
+#undef EIGEN_USE_LAPACKE_STRICT
+#undef EIGEN_USE_LAPACKE
+#ifdef MKL_DIRECT_CALL_JUST_SET
+#undef MKL_DIRECT_CALL
+#endif
+#endif
 #endif
 
 #if defined EIGEN_USE_MKL
@@ -126,7 +126,7 @@
 namespace Eigen {
 
 typedef std::complex<double> dcomplex;
-typedef std::complex<float>  scomplex;
+typedef std::complex<float> scomplex;
 
 #if defined(EIGEN_USE_MKL)
 typedef MKL_INT BlasIndex;
@@ -134,7 +134,6 @@
 typedef int BlasIndex;
 #endif
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-
-#endif // EIGEN_MKL_SUPPORT_H
+#endif  // EIGEN_MKL_SUPPORT_H
diff --git a/Eigen/src/Core/util/Macros.h b/Eigen/src/Core/util/Macros.h
index 69bbf2e..5d054e6 100644
--- a/Eigen/src/Core/util/Macros.h
+++ b/Eigen/src/Core/util/Macros.h
@@ -21,9 +21,9 @@
 #define EIGEN_MAJOR_VERSION 4
 #define EIGEN_MINOR_VERSION 90
 
-#define EIGEN_VERSION_AT_LEAST(x,y,z) (EIGEN_WORLD_VERSION>x || (EIGEN_WORLD_VERSION>=x && \
-                                      (EIGEN_MAJOR_VERSION>y || (EIGEN_MAJOR_VERSION>=y && \
-                                                                 EIGEN_MINOR_VERSION>=z))))
+#define EIGEN_VERSION_AT_LEAST(x, y, z) \
+  (EIGEN_WORLD_VERSION > x ||           \
+   (EIGEN_WORLD_VERSION >= x && (EIGEN_MAJOR_VERSION > y || (EIGEN_MAJOR_VERSION >= y && EIGEN_MINOR_VERSION >= z))))
 
 #ifdef EIGEN_DEFAULT_TO_ROW_MAJOR
 #define EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION Eigen::RowMajor
@@ -43,10 +43,10 @@
 #endif
 
 /** Allows to disable some optimizations which might affect the accuracy of the result.
-  * Such optimization are enabled by default, and set EIGEN_FAST_MATH to 0 to disable them.
-  * They currently include:
-  *   - single precision ArrayBase::sin() and ArrayBase::cos() for SSE and AVX vectorization.
-  */
+ * Such optimization are enabled by default, and set EIGEN_FAST_MATH to 0 to disable them.
+ * They currently include:
+ *   - single precision ArrayBase::sin() and ArrayBase::cos() for SSE and AVX vectorization.
+ */
 #ifndef EIGEN_FAST_MATH
 #define EIGEN_FAST_MATH 1
 #endif
@@ -62,84 +62,85 @@
 
 /// \internal EIGEN_COMP_GNUC set to version (e.g., 951 for GCC 9.5.1) for all compilers compatible with GCC
 #ifdef __GNUC__
-  #define EIGEN_COMP_GNUC (__GNUC__*100+__GNUC_MINOR__*10+__GNUC_PATCHLEVEL__)
+#define EIGEN_COMP_GNUC (__GNUC__ * 100 + __GNUC_MINOR__ * 10 + __GNUC_PATCHLEVEL__)
 #else
-  #define EIGEN_COMP_GNUC 0
+#define EIGEN_COMP_GNUC 0
 #endif
 
 /// \internal EIGEN_COMP_CLANG set to version (e.g., 372 for clang 3.7.2) if the compiler is clang
 #if defined(__clang__)
-  #define EIGEN_COMP_CLANG (__clang_major__*100+__clang_minor__*10+__clang_patchlevel__)
+#define EIGEN_COMP_CLANG (__clang_major__ * 100 + __clang_minor__ * 10 + __clang_patchlevel__)
 #else
-  #define EIGEN_COMP_CLANG 0
+#define EIGEN_COMP_CLANG 0
 #endif
 
-/// \internal EIGEN_COMP_CLANGAPPLE set to the version number (e.g. 9000000 for AppleClang 9.0) if the compiler is AppleClang
+/// \internal EIGEN_COMP_CLANGAPPLE set to the version number (e.g. 9000000 for AppleClang 9.0) if the compiler is
+/// AppleClang
 #if defined(__clang__) && defined(__apple_build_version__)
-  #define EIGEN_COMP_CLANGAPPLE __apple_build_version__
+#define EIGEN_COMP_CLANGAPPLE __apple_build_version__
 #else
-  #define EIGEN_COMP_CLANGAPPLE 0
+#define EIGEN_COMP_CLANGAPPLE 0
 #endif
 
 /// \internal EIGEN_COMP_CASTXML set to 1 if being preprocessed by CastXML
 #if defined(__castxml__)
-  #define EIGEN_COMP_CASTXML 1
+#define EIGEN_COMP_CASTXML 1
 #else
-  #define EIGEN_COMP_CASTXML 0
+#define EIGEN_COMP_CASTXML 0
 #endif
 
 /// \internal EIGEN_COMP_LLVM set to 1 if the compiler backend is llvm
 #if defined(__llvm__)
-  #define EIGEN_COMP_LLVM 1
+#define EIGEN_COMP_LLVM 1
 #else
-  #define EIGEN_COMP_LLVM 0
+#define EIGEN_COMP_LLVM 0
 #endif
 
 /// \internal EIGEN_COMP_ICC set to __INTEL_COMPILER if the compiler is Intel icc compiler, 0 otherwise
 #if defined(__INTEL_COMPILER)
-  #define EIGEN_COMP_ICC __INTEL_COMPILER
+#define EIGEN_COMP_ICC __INTEL_COMPILER
 #else
-  #define EIGEN_COMP_ICC 0
+#define EIGEN_COMP_ICC 0
 #endif
 
 /// \internal EIGEN_COMP_CLANGICC set to __INTEL_CLANG_COMPILER if the compiler is Intel icx compiler, 0 otherwise
 #if defined(__INTEL_CLANG_COMPILER)
-  #define EIGEN_COMP_CLANGICC __INTEL_CLANG_COMPILER
+#define EIGEN_COMP_CLANGICC __INTEL_CLANG_COMPILER
 #else
-  #define EIGEN_COMP_CLANGICC 0
+#define EIGEN_COMP_CLANGICC 0
 #endif
 
 /// \internal EIGEN_COMP_MINGW set to 1 if the compiler is mingw
 #if defined(__MINGW32__)
-  #define EIGEN_COMP_MINGW 1
+#define EIGEN_COMP_MINGW 1
 #else
-  #define EIGEN_COMP_MINGW 0
+#define EIGEN_COMP_MINGW 0
 #endif
 
 /// \internal EIGEN_COMP_SUNCC set to 1 if the compiler is Solaris Studio
 #if defined(__SUNPRO_CC)
-  #define EIGEN_COMP_SUNCC 1
+#define EIGEN_COMP_SUNCC 1
 #else
-  #define EIGEN_COMP_SUNCC 0
+#define EIGEN_COMP_SUNCC 0
 #endif
 
 /// \internal EIGEN_COMP_MSVC set to _MSC_VER if the compiler is Microsoft Visual C++, 0 otherwise.
 #if defined(_MSC_VER)
-  #define EIGEN_COMP_MSVC _MSC_VER
+#define EIGEN_COMP_MSVC _MSC_VER
 #else
-  #define EIGEN_COMP_MSVC 0
+#define EIGEN_COMP_MSVC 0
 #endif
 
 #if defined(__NVCC__)
 #if defined(__CUDACC_VER_MAJOR__) && (__CUDACC_VER_MAJOR__ >= 9)
-  #define EIGEN_COMP_NVCC  ((__CUDACC_VER_MAJOR__ * 10000) + (__CUDACC_VER_MINOR__ * 100))
+#define EIGEN_COMP_NVCC ((__CUDACC_VER_MAJOR__ * 10000) + (__CUDACC_VER_MINOR__ * 100))
 #elif defined(__CUDACC_VER__)
-  #define EIGEN_COMP_NVCC __CUDACC_VER__
+#define EIGEN_COMP_NVCC __CUDACC_VER__
 #else
-  #error "NVCC did not define compiler version."
+#error "NVCC did not define compiler version."
 #endif
 #else
-  #define EIGEN_COMP_NVCC 0
+#define EIGEN_COMP_NVCC 0
 #endif
 
 // For the record, here is a table summarizing the possible values for EIGEN_COMP_MSVC:
@@ -157,9 +158,9 @@
 
 /// \internal EIGEN_COMP_MSVC_LANG set to _MSVC_LANG if the compiler is Microsoft Visual C++, 0 otherwise.
 #if defined(_MSVC_LANG)
-  #define EIGEN_COMP_MSVC_LANG _MSVC_LANG
+#define EIGEN_COMP_MSVC_LANG _MSVC_LANG
 #else
-  #define EIGEN_COMP_MSVC_LANG 0
+#define EIGEN_COMP_MSVC_LANG 0
 #endif
 
 // For the record, here is a table summarizing the possible values for EIGEN_COMP_MSVC_LANG:
@@ -168,11 +169,12 @@
 // /std:c++17                           C++17     201703L
 // /std:c++latest                       >C++17    >201703L
 
-/// \internal EIGEN_COMP_MSVC_STRICT set to 1 if the compiler is really Microsoft Visual C++ and not ,e.g., ICC or clang-cl
+/// \internal EIGEN_COMP_MSVC_STRICT set to 1 if the compiler is really Microsoft Visual C++ and not ,e.g., ICC or
+/// clang-cl
 #if EIGEN_COMP_MSVC && !(EIGEN_COMP_ICC || EIGEN_COMP_LLVM || EIGEN_COMP_CLANG)
-  #define EIGEN_COMP_MSVC_STRICT _MSC_VER
+#define EIGEN_COMP_MSVC_STRICT _MSC_VER
 #else
-  #define EIGEN_COMP_MSVC_STRICT 0
+#define EIGEN_COMP_MSVC_STRICT 0
 #endif
 
 /// \internal EIGEN_COMP_IBM set to xlc version if the compiler is IBM XL C++
@@ -182,160 +184,163 @@
 // 5.0   0x0500
 // 12.1  0x0C01
 #if defined(__IBMCPP__) || defined(__xlc__) || defined(__ibmxl__)
-  #define EIGEN_COMP_IBM __xlC__
+#define EIGEN_COMP_IBM __xlC__
 #else
-  #define EIGEN_COMP_IBM 0
+#define EIGEN_COMP_IBM 0
 #endif
 
 /// \internal EIGEN_COMP_PGI set to PGI version if the compiler is Portland Group Compiler
 #if defined(__PGI)
-  #define EIGEN_COMP_PGI (__PGIC__*100+__PGIC_MINOR__)
+#define EIGEN_COMP_PGI (__PGIC__ * 100 + __PGIC_MINOR__)
 #else
-  #define EIGEN_COMP_PGI 0
+#define EIGEN_COMP_PGI 0
 #endif
 
 /// \internal EIGEN_COMP_ARM set to 1 if the compiler is ARM Compiler
 #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
-  #define EIGEN_COMP_ARM 1
+#define EIGEN_COMP_ARM 1
 #else
-  #define EIGEN_COMP_ARM 0
+#define EIGEN_COMP_ARM 0
 #endif
 
 /// \internal EIGEN_COMP_EMSCRIPTEN set to 1 if the compiler is Emscripten Compiler
 #if defined(__EMSCRIPTEN__)
-  #define EIGEN_COMP_EMSCRIPTEN 1
+#define EIGEN_COMP_EMSCRIPTEN 1
 #else
-  #define EIGEN_COMP_EMSCRIPTEN 0
+#define EIGEN_COMP_EMSCRIPTEN 0
 #endif
 
 /// \internal EIGEN_COMP_FCC set to FCC version if the compiler is Fujitsu Compiler (traditional mode)
 /// \note The Fujitsu C/C++ compiler uses the traditional mode based
 /// on EDG g++ 6.1 by default or if envoked with the -Nnoclang flag
 #if defined(__FUJITSU)
-  #define EIGEN_COMP_FCC (__FCC_major__*100+__FCC_minor__*10+__FCC_patchlevel__)
+#define EIGEN_COMP_FCC (__FCC_major__ * 100 + __FCC_minor__ * 10 + __FCC_patchlevel__)
 #else
-  #define EIGEN_COMP_FCC 0
+#define EIGEN_COMP_FCC 0
 #endif
 
 /// \internal EIGEN_COMP_CLANGFCC set to FCC version if the compiler is Fujitsu Compiler (Clang mode)
 /// \note The Fujitsu C/C++ compiler uses the non-traditional mode
 /// based on Clang 7.1.0 if envoked with the -Nclang flag
 #if defined(__CLANG_FUJITSU)
-  #define EIGEN_COMP_CLANGFCC (__FCC_major__*100+__FCC_minor__*10+__FCC_patchlevel__)
+#define EIGEN_COMP_CLANGFCC (__FCC_major__ * 100 + __FCC_minor__ * 10 + __FCC_patchlevel__)
 #else
-  #define EIGEN_COMP_CLANGFCC 0
+#define EIGEN_COMP_CLANGFCC 0
 #endif
 
 /// \internal EIGEN_COMP_CPE set to CPE version if the compiler is HPE Cray Compiler (GCC based)
 /// \note This is the SVE-enabled C/C++ compiler from the HPE Cray
 /// Programming Environment (CPE) based on Cray GCC 8.1
 #if defined(_CRAYC) && !defined(__clang__)
-  #define EIGEN_COMP_CPE (_RELEASE_MAJOR*100+_RELEASE_MINOR*10+_RELEASE_PATCHLEVEL)
+#define EIGEN_COMP_CPE (_RELEASE_MAJOR * 100 + _RELEASE_MINOR * 10 + _RELEASE_PATCHLEVEL)
 #else
-  #define EIGEN_COMP_CPE 0
+#define EIGEN_COMP_CPE 0
 #endif
 
 /// \internal EIGEN_COMP_CLANGCPE set to CPE version if the compiler is HPE Cray Compiler (Clang based)
 /// \note This is the C/C++ compiler from the HPE Cray Programming
 /// Environment (CPE) based on Cray Clang 11.0 without SVE-support
 #if defined(_CRAYC) && defined(__clang__)
-  #define EIGEN_COMP_CLANGCPE (_RELEASE_MAJOR*100+_RELEASE_MINOR*10+_RELEASE_PATCHLEVEL)
+#define EIGEN_COMP_CLANGCPE (_RELEASE_MAJOR * 100 + _RELEASE_MINOR * 10 + _RELEASE_PATCHLEVEL)
 #else
-  #define EIGEN_COMP_CLANGCPE 0
+#define EIGEN_COMP_CLANGCPE 0
 #endif
 
 /// \internal EIGEN_COMP_LCC set to 1 if the compiler is MCST-LCC (MCST eLbrus Compiler Collection)
 #if defined(__LCC__) && defined(__MCST__)
-  #define EIGEN_COMP_LCC (__LCC__*100+__LCC_MINOR__)
+#define EIGEN_COMP_LCC (__LCC__ * 100 + __LCC_MINOR__)
 #else
-  #define EIGEN_COMP_LCC 0
+#define EIGEN_COMP_LCC 0
 #endif
 
-
-/// \internal EIGEN_COMP_GNUC_STRICT set to 1 if the compiler is really GCC and not a compatible compiler (e.g., ICC, clang, mingw, etc.)
-#if EIGEN_COMP_GNUC && !(EIGEN_COMP_CLANG || EIGEN_COMP_ICC || EIGEN_COMP_CLANGICC || EIGEN_COMP_MINGW || EIGEN_COMP_PGI || EIGEN_COMP_IBM || EIGEN_COMP_ARM || EIGEN_COMP_EMSCRIPTEN || EIGEN_COMP_FCC || EIGEN_COMP_CLANGFCC || EIGEN_COMP_CPE || EIGEN_COMP_CLANGCPE || EIGEN_COMP_LCC)
-  #define EIGEN_COMP_GNUC_STRICT 1
+/// \internal EIGEN_COMP_GNUC_STRICT set to 1 if the compiler is really GCC and not a compatible compiler (e.g., ICC,
+/// clang, mingw, etc.)
+#if EIGEN_COMP_GNUC &&                                                                                      \
+    !(EIGEN_COMP_CLANG || EIGEN_COMP_ICC || EIGEN_COMP_CLANGICC || EIGEN_COMP_MINGW || EIGEN_COMP_PGI ||    \
+      EIGEN_COMP_IBM || EIGEN_COMP_ARM || EIGEN_COMP_EMSCRIPTEN || EIGEN_COMP_FCC || EIGEN_COMP_CLANGFCC || \
+      EIGEN_COMP_CPE || EIGEN_COMP_CLANGCPE || EIGEN_COMP_LCC)
+#define EIGEN_COMP_GNUC_STRICT 1
 #else
-  #define EIGEN_COMP_GNUC_STRICT 0
+#define EIGEN_COMP_GNUC_STRICT 0
 #endif
 
-// GCC, and compilers that pretend to be it, have different version schemes, so this only makes sense to use with the real GCC.
+// GCC, and compilers that pretend to be it, have different version schemes, so this only makes sense to use with the
+// real GCC.
 #if EIGEN_COMP_GNUC_STRICT
-  #define EIGEN_GNUC_STRICT_AT_LEAST(x,y,z)  ((__GNUC__ > x) || \
-                                              (__GNUC__ == x && __GNUC_MINOR__ > y) || \
-                                              (__GNUC__ == x && __GNUC_MINOR__ == y && __GNUC_PATCHLEVEL__ >= z))
-  #define EIGEN_GNUC_STRICT_LESS_THAN(x,y,z) ((__GNUC__ < x) || \
-                                              (__GNUC__ == x && __GNUC_MINOR__ < y) || \
-                                              (__GNUC__ == x && __GNUC_MINOR__ == y && __GNUC_PATCHLEVEL__ < z))
+#define EIGEN_GNUC_STRICT_AT_LEAST(x, y, z)                   \
+  ((__GNUC__ > x) || (__GNUC__ == x && __GNUC_MINOR__ > y) || \
+   (__GNUC__ == x && __GNUC_MINOR__ == y && __GNUC_PATCHLEVEL__ >= z))
+#define EIGEN_GNUC_STRICT_LESS_THAN(x, y, z)                  \
+  ((__GNUC__ < x) || (__GNUC__ == x && __GNUC_MINOR__ < y) || \
+   (__GNUC__ == x && __GNUC_MINOR__ == y && __GNUC_PATCHLEVEL__ < z))
 #else
-  #define EIGEN_GNUC_STRICT_AT_LEAST(x,y,z)  0
-  #define EIGEN_GNUC_STRICT_LESS_THAN(x,y,z) 0
+#define EIGEN_GNUC_STRICT_AT_LEAST(x, y, z) 0
+#define EIGEN_GNUC_STRICT_LESS_THAN(x, y, z) 0
 #endif
 
-
-
-/// \internal EIGEN_COMP_CLANG_STRICT set to 1 if the compiler is really Clang and not a compatible compiler (e.g., AppleClang, etc.)
+/// \internal EIGEN_COMP_CLANG_STRICT set to 1 if the compiler is really Clang and not a compatible compiler (e.g.,
+/// AppleClang, etc.)
 #if EIGEN_COMP_CLANG && !(EIGEN_COMP_CLANGAPPLE || EIGEN_COMP_CLANGICC || EIGEN_COMP_CLANGFCC || EIGEN_COMP_CLANGCPE)
-  #define EIGEN_COMP_CLANG_STRICT 1
+#define EIGEN_COMP_CLANG_STRICT 1
 #else
-  #define EIGEN_COMP_CLANG_STRICT 0
+#define EIGEN_COMP_CLANG_STRICT 0
 #endif
 
-// Clang, and compilers forked from it, have different version schemes, so this only makes sense to use with the real Clang.
+// Clang, and compilers forked from it, have different version schemes, so this only makes sense to use with the real
+// Clang.
 #if EIGEN_COMP_CLANG_STRICT
-  #define EIGEN_CLANG_STRICT_AT_LEAST(x,y,z)  ((__clang_major__ > x) || \
-                                               (__clang_major__ == x && __clang_minor__ > y) || \
-                                               (__clang_major__ == x && __clang_minor__ == y && __clang_patchlevel__ >= z))
-  #define EIGEN_CLANG_STRICT_LESS_THAN(x,y,z) ((__clang_major__ < x) || \
-                                               (__clang_major__ == x && __clang_minor__ < y) || \
-                                               (__clang_major__ == x && __clang_minor__ == y && __clang_patchlevel__ < z))
+#define EIGEN_CLANG_STRICT_AT_LEAST(x, y, z)                                 \
+  ((__clang_major__ > x) || (__clang_major__ == x && __clang_minor__ > y) || \
+   (__clang_major__ == x && __clang_minor__ == y && __clang_patchlevel__ >= z))
+#define EIGEN_CLANG_STRICT_LESS_THAN(x, y, z)                                \
+  ((__clang_major__ < x) || (__clang_major__ == x && __clang_minor__ < y) || \
+   (__clang_major__ == x && __clang_minor__ == y && __clang_patchlevel__ < z))
 #else
-  #define EIGEN_CLANG_STRICT_AT_LEAST(x,y,z)  0
-  #define EIGEN_CLANG_STRICT_LESS_THAN(x,y,z) 0
+#define EIGEN_CLANG_STRICT_AT_LEAST(x, y, z) 0
+#define EIGEN_CLANG_STRICT_LESS_THAN(x, y, z) 0
 #endif
 
 //------------------------------------------------------------------------------------------
 // Architecture identification, EIGEN_ARCH_*
 //------------------------------------------------------------------------------------------
 
-
 #if defined(__x86_64__) || (defined(_M_X64) && !defined(_M_ARM64EC)) || defined(__amd64)
-  #define EIGEN_ARCH_x86_64 1
+#define EIGEN_ARCH_x86_64 1
 #else
-  #define EIGEN_ARCH_x86_64 0
+#define EIGEN_ARCH_x86_64 0
 #endif
 
 #if defined(__i386__) || defined(_M_IX86) || defined(_X86_) || defined(__i386)
-  #define EIGEN_ARCH_i386 1
+#define EIGEN_ARCH_i386 1
 #else
-  #define EIGEN_ARCH_i386 0
+#define EIGEN_ARCH_i386 0
 #endif
 
 #if EIGEN_ARCH_x86_64 || EIGEN_ARCH_i386
-  #define EIGEN_ARCH_i386_OR_x86_64 1
+#define EIGEN_ARCH_i386_OR_x86_64 1
 #else
-  #define EIGEN_ARCH_i386_OR_x86_64 0
+#define EIGEN_ARCH_i386_OR_x86_64 0
 #endif
 
 /// \internal EIGEN_ARCH_ARM set to 1 if the architecture is ARM
 #if defined(__arm__)
-  #define EIGEN_ARCH_ARM 1
+#define EIGEN_ARCH_ARM 1
 #else
-  #define EIGEN_ARCH_ARM 0
+#define EIGEN_ARCH_ARM 0
 #endif
 
 /// \internal EIGEN_ARCH_ARM64 set to 1 if the architecture is ARM64
 #if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC)
-  #define EIGEN_ARCH_ARM64 1
+#define EIGEN_ARCH_ARM64 1
 #else
-  #define EIGEN_ARCH_ARM64 0
+#define EIGEN_ARCH_ARM64 0
 #endif
 
 /// \internal EIGEN_ARCH_ARM_OR_ARM64 set to 1 if the architecture is ARM or ARM64
 #if EIGEN_ARCH_ARM || EIGEN_ARCH_ARM64
-  #define EIGEN_ARCH_ARM_OR_ARM64 1
+#define EIGEN_ARCH_ARM_OR_ARM64 1
 #else
-  #define EIGEN_ARCH_ARM_OR_ARM64 0
+#define EIGEN_ARCH_ARM_OR_ARM64 0
 #endif
 
 /// \internal EIGEN_ARCH_ARMV8 set to 1 if the architecture is armv8 or greater.
@@ -345,136 +350,133 @@
 #define EIGEN_ARCH_ARMV8 0
 #endif
 
-
 /// \internal EIGEN_HAS_ARM64_FP16 set to 1 if the architecture provides an IEEE
 /// compliant Arm fp16 type
 #if EIGEN_ARCH_ARM_OR_ARM64
-  #ifndef EIGEN_HAS_ARM64_FP16
-    #if defined(__ARM_FP16_FORMAT_IEEE)
-      #define EIGEN_HAS_ARM64_FP16 1
-    #else
-      #define EIGEN_HAS_ARM64_FP16 0
-    #endif
-  #endif
+#ifndef EIGEN_HAS_ARM64_FP16
+#if defined(__ARM_FP16_FORMAT_IEEE)
+#define EIGEN_HAS_ARM64_FP16 1
+#else
+#define EIGEN_HAS_ARM64_FP16 0
+#endif
+#endif
 #endif
 
 /// \internal EIGEN_ARCH_MIPS set to 1 if the architecture is MIPS
 #if defined(__mips__) || defined(__mips)
-  #define EIGEN_ARCH_MIPS 1
+#define EIGEN_ARCH_MIPS 1
 #else
-  #define EIGEN_ARCH_MIPS 0
+#define EIGEN_ARCH_MIPS 0
 #endif
 
 /// \internal EIGEN_ARCH_SPARC set to 1 if the architecture is SPARC
 #if defined(__sparc__) || defined(__sparc)
-  #define EIGEN_ARCH_SPARC 1
+#define EIGEN_ARCH_SPARC 1
 #else
-  #define EIGEN_ARCH_SPARC 0
+#define EIGEN_ARCH_SPARC 0
 #endif
 
 /// \internal EIGEN_ARCH_IA64 set to 1 if the architecture is Intel Itanium
 #if defined(__ia64__)
-  #define EIGEN_ARCH_IA64 1
+#define EIGEN_ARCH_IA64 1
 #else
-  #define EIGEN_ARCH_IA64 0
+#define EIGEN_ARCH_IA64 0
 #endif
 
 /// \internal EIGEN_ARCH_PPC set to 1 if the architecture is PowerPC
 #if defined(__powerpc__) || defined(__ppc__) || defined(_M_PPC) || defined(__POWERPC__)
-  #define EIGEN_ARCH_PPC 1
+#define EIGEN_ARCH_PPC 1
 #else
-  #define EIGEN_ARCH_PPC 0
+#define EIGEN_ARCH_PPC 0
 #endif
 
-
-
 //------------------------------------------------------------------------------------------
 // Operating system identification, EIGEN_OS_*
 //------------------------------------------------------------------------------------------
 
 /// \internal EIGEN_OS_UNIX set to 1 if the OS is a unix variant
 #if defined(__unix__) || defined(__unix)
-  #define EIGEN_OS_UNIX 1
+#define EIGEN_OS_UNIX 1
 #else
-  #define EIGEN_OS_UNIX 0
+#define EIGEN_OS_UNIX 0
 #endif
 
 /// \internal EIGEN_OS_LINUX set to 1 if the OS is based on Linux kernel
 #if defined(__linux__)
-  #define EIGEN_OS_LINUX 1
+#define EIGEN_OS_LINUX 1
 #else
-  #define EIGEN_OS_LINUX 0
+#define EIGEN_OS_LINUX 0
 #endif
 
 /// \internal EIGEN_OS_ANDROID set to 1 if the OS is Android
 // note: ANDROID is defined when using ndk_build, __ANDROID__ is defined when using a standalone toolchain.
 #if defined(__ANDROID__) || defined(ANDROID)
-  #define EIGEN_OS_ANDROID 1
+#define EIGEN_OS_ANDROID 1
 #else
-  #define EIGEN_OS_ANDROID 0
+#define EIGEN_OS_ANDROID 0
 #endif
 
 /// \internal EIGEN_OS_GNULINUX set to 1 if the OS is GNU Linux and not Linux-based OS (e.g., not android)
 #if defined(__gnu_linux__) && !(EIGEN_OS_ANDROID)
-  #define EIGEN_OS_GNULINUX 1
+#define EIGEN_OS_GNULINUX 1
 #else
-  #define EIGEN_OS_GNULINUX 0
+#define EIGEN_OS_GNULINUX 0
 #endif
 
 /// \internal EIGEN_OS_BSD set to 1 if the OS is a BSD variant
 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__)
-  #define EIGEN_OS_BSD 1
+#define EIGEN_OS_BSD 1
 #else
-  #define EIGEN_OS_BSD 0
+#define EIGEN_OS_BSD 0
 #endif
 
 /// \internal EIGEN_OS_MAC set to 1 if the OS is MacOS
 #if defined(__APPLE__)
-  #define EIGEN_OS_MAC 1
+#define EIGEN_OS_MAC 1
 #else
-  #define EIGEN_OS_MAC 0
+#define EIGEN_OS_MAC 0
 #endif
 
 /// \internal EIGEN_OS_QNX set to 1 if the OS is QNX
 #if defined(__QNX__)
-  #define EIGEN_OS_QNX 1
+#define EIGEN_OS_QNX 1
 #else
-  #define EIGEN_OS_QNX 0
+#define EIGEN_OS_QNX 0
 #endif
 
 /// \internal EIGEN_OS_WIN set to 1 if the OS is Windows based
 #if defined(_WIN32)
-  #define EIGEN_OS_WIN 1
+#define EIGEN_OS_WIN 1
 #else
-  #define EIGEN_OS_WIN 0
+#define EIGEN_OS_WIN 0
 #endif
 
 /// \internal EIGEN_OS_WIN64 set to 1 if the OS is Windows 64bits
 #if defined(_WIN64)
-  #define EIGEN_OS_WIN64 1
+#define EIGEN_OS_WIN64 1
 #else
-  #define EIGEN_OS_WIN64 0
+#define EIGEN_OS_WIN64 0
 #endif
 
 /// \internal EIGEN_OS_WINCE set to 1 if the OS is Windows CE
 #if defined(_WIN32_WCE)
-  #define EIGEN_OS_WINCE 1
+#define EIGEN_OS_WINCE 1
 #else
-  #define EIGEN_OS_WINCE 0
+#define EIGEN_OS_WINCE 0
 #endif
 
 /// \internal EIGEN_OS_CYGWIN set to 1 if the OS is Windows/Cygwin
 #if defined(__CYGWIN__)
-  #define EIGEN_OS_CYGWIN 1
+#define EIGEN_OS_CYGWIN 1
 #else
-  #define EIGEN_OS_CYGWIN 0
+#define EIGEN_OS_CYGWIN 0
 #endif
 
 /// \internal EIGEN_OS_WIN_STRICT set to 1 if the OS is really Windows and not some variants
-#if EIGEN_OS_WIN && !( EIGEN_OS_WINCE || EIGEN_OS_CYGWIN )
-  #define EIGEN_OS_WIN_STRICT 1
+#if EIGEN_OS_WIN && !(EIGEN_OS_WINCE || EIGEN_OS_CYGWIN)
+#define EIGEN_OS_WIN_STRICT 1
 #else
-  #define EIGEN_OS_WIN_STRICT 0
+#define EIGEN_OS_WIN_STRICT 0
 #endif
 
 /// \internal EIGEN_OS_SUN set to __SUNPRO_C if the OS is SUN
@@ -487,19 +489,18 @@
 // 5.11	     12.2      0x5110
 // 5.12	     12.3      0x5120
 #if (defined(sun) || defined(__sun)) && !(defined(__SVR4) || defined(__svr4__))
-  #define EIGEN_OS_SUN __SUNPRO_C
+#define EIGEN_OS_SUN __SUNPRO_C
 #else
-  #define EIGEN_OS_SUN 0
+#define EIGEN_OS_SUN 0
 #endif
 
 /// \internal EIGEN_OS_SOLARIS set to 1 if the OS is Solaris
 #if (defined(sun) || defined(__sun)) && (defined(__SVR4) || defined(__svr4__))
-  #define EIGEN_OS_SOLARIS 1
+#define EIGEN_OS_SOLARIS 1
 #else
-  #define EIGEN_OS_SOLARIS 0
+#define EIGEN_OS_SOLARIS 0
 #endif
 
-
 //------------------------------------------------------------------------------------------
 // Detect GPU compilers and architectures
 //------------------------------------------------------------------------------------------
@@ -507,59 +508,59 @@
 // NVCC is not supported as the target platform for HIPCC
 // Note that this also makes EIGEN_CUDACC and EIGEN_HIPCC mutually exclusive
 #if defined(__NVCC__) && defined(__HIPCC__)
-  #error "NVCC as the target platform for HIPCC is currently not supported."
+#error "NVCC as the target platform for HIPCC is currently not supported."
 #endif
 
 #if defined(__CUDACC__) && !defined(EIGEN_NO_CUDA) && !defined(__SYCL_DEVICE_ONLY__)
-  // Means the compiler is either nvcc or clang with CUDA enabled
-  #define EIGEN_CUDACC __CUDACC__
+// Means the compiler is either nvcc or clang with CUDA enabled
+#define EIGEN_CUDACC __CUDACC__
 #endif
 
 #if defined(__CUDA_ARCH__) && !defined(EIGEN_NO_CUDA) && !defined(__SYCL_DEVICE_ONLY__)
-  // Means we are generating code for the device
-  #define EIGEN_CUDA_ARCH __CUDA_ARCH__
+// Means we are generating code for the device
+#define EIGEN_CUDA_ARCH __CUDA_ARCH__
 #endif
 
 #if defined(EIGEN_CUDACC)
 #include <cuda.h>
-  #define EIGEN_CUDA_SDK_VER (CUDA_VERSION * 10)
+#define EIGEN_CUDA_SDK_VER (CUDA_VERSION * 10)
 #else
-  #define EIGEN_CUDA_SDK_VER 0
+#define EIGEN_CUDA_SDK_VER 0
 #endif
 
 #if defined(__HIPCC__) && !defined(EIGEN_NO_HIP) && !defined(__SYCL_DEVICE_ONLY__)
-  // Means the compiler is HIPCC (analogous to EIGEN_CUDACC, but for HIP)
-  #define EIGEN_HIPCC __HIPCC__
+// Means the compiler is HIPCC (analogous to EIGEN_CUDACC, but for HIP)
+#define EIGEN_HIPCC __HIPCC__
 
-  // We need to include hip_runtime.h here because it pulls in
-  // ++ hip_common.h which contains the define for  __HIP_DEVICE_COMPILE__
-  // ++ host_defines.h which contains the defines for the __host__ and __device__ macros
-  #include <hip/hip_runtime.h>
+// We need to include hip_runtime.h here because it pulls in
+// ++ hip_common.h which contains the define for  __HIP_DEVICE_COMPILE__
+// ++ host_defines.h which contains the defines for the __host__ and __device__ macros
+#include <hip/hip_runtime.h>
 
-  #if defined(__HIP_DEVICE_COMPILE__) && !defined(__SYCL_DEVICE_ONLY__)
-    // analogous to EIGEN_CUDA_ARCH, but for HIP
-    #define EIGEN_HIP_DEVICE_COMPILE __HIP_DEVICE_COMPILE__
-  #endif
+#if defined(__HIP_DEVICE_COMPILE__) && !defined(__SYCL_DEVICE_ONLY__)
+// analogous to EIGEN_CUDA_ARCH, but for HIP
+#define EIGEN_HIP_DEVICE_COMPILE __HIP_DEVICE_COMPILE__
+#endif
 
-  // For HIP (ROCm 3.5 and higher), we need to explicitly set the launch_bounds attribute
-  // value to 1024. The compiler assigns a default value of 256 when the attribute is not
-  // specified. This results in failures on the HIP platform, for cases when a GPU kernel
-  // without an explicit launch_bounds attribute is called with a threads_per_block value
-  // greater than 256.
-  //
-  // This is a regression in functioanlity and is expected to be fixed within the next
-  // couple of ROCm releases (compiler will go back to using 1024 value as the default)
-  //
-  // In the meantime, we will use a "only enabled for HIP" macro to set the launch_bounds
-  // attribute.
+// For HIP (ROCm 3.5 and higher), we need to explicitly set the launch_bounds attribute
+// value to 1024. The compiler assigns a default value of 256 when the attribute is not
+// specified. This results in failures on the HIP platform, for cases when a GPU kernel
+// without an explicit launch_bounds attribute is called with a threads_per_block value
+// greater than 256.
+//
+// This is a regression in functioanlity and is expected to be fixed within the next
+// couple of ROCm releases (compiler will go back to using 1024 value as the default)
+//
+// In the meantime, we will use a "only enabled for HIP" macro to set the launch_bounds
+// attribute.
 
-  #define EIGEN_HIP_LAUNCH_BOUNDS_1024 __launch_bounds__(1024)
+#define EIGEN_HIP_LAUNCH_BOUNDS_1024 __launch_bounds__(1024)
 
 #endif
 
 #if !defined(EIGEN_HIP_LAUNCH_BOUNDS_1024)
 #define EIGEN_HIP_LAUNCH_BOUNDS_1024
-#endif // !defined(EIGEN_HIP_LAUNCH_BOUNDS_1024)
+#endif  // !defined(EIGEN_HIP_LAUNCH_BOUNDS_1024)
 
 // Unify CUDA/HIPCC
 
@@ -619,27 +620,27 @@
 /// \internal EIGEN_HAS_ARM64_FP16_VECTOR_ARITHMETIC set to 1 if the architecture
 /// supports Neon vector intrinsics for fp16.
 #if EIGEN_ARCH_ARM_OR_ARM64
-  #ifndef EIGEN_HAS_ARM64_FP16_VECTOR_ARITHMETIC
-    // Clang only supports FP16 on aarch64, and not all intrinsics are available
-    // on A32 anyways even in GCC (e.g. vdiv_f16, vsqrt_f16).
-    #if EIGEN_ARCH_ARM64 && defined(__ARM_FEATURE_FP16_VECTOR_ARITHMETIC) && !defined(EIGEN_GPU_COMPILE_PHASE)
-      #define EIGEN_HAS_ARM64_FP16_VECTOR_ARITHMETIC 1
-    #else
-      #define EIGEN_HAS_ARM64_FP16_VECTOR_ARITHMETIC 0
-    #endif
-  #endif
+#ifndef EIGEN_HAS_ARM64_FP16_VECTOR_ARITHMETIC
+// Clang only supports FP16 on aarch64, and not all intrinsics are available
+// on A32 anyways even in GCC (e.g. vdiv_f16, vsqrt_f16).
+#if EIGEN_ARCH_ARM64 && defined(__ARM_FEATURE_FP16_VECTOR_ARITHMETIC) && !defined(EIGEN_GPU_COMPILE_PHASE)
+#define EIGEN_HAS_ARM64_FP16_VECTOR_ARITHMETIC 1
+#else
+#define EIGEN_HAS_ARM64_FP16_VECTOR_ARITHMETIC 0
+#endif
+#endif
 #endif
 
 /// \internal EIGEN_HAS_ARM64_FP16_SCALAR_ARITHMETIC set to 1 if the architecture
 /// supports Neon scalar intrinsics for fp16.
 #if EIGEN_ARCH_ARM_OR_ARM64
-  #ifndef EIGEN_HAS_ARM64_FP16_SCALAR_ARITHMETIC
-    // Clang only supports FP16 on aarch64, and not all intrinsics are available
-    // on A32 anyways, even in GCC (e.g. vceqh_f16).
-    #if EIGEN_ARCH_ARM64 && defined(__ARM_FEATURE_FP16_SCALAR_ARITHMETIC) && !defined(EIGEN_GPU_COMPILE_PHASE)
-      #define EIGEN_HAS_ARM64_FP16_SCALAR_ARITHMETIC 1
-    #endif
-  #endif
+#ifndef EIGEN_HAS_ARM64_FP16_SCALAR_ARITHMETIC
+// Clang only supports FP16 on aarch64, and not all intrinsics are available
+// on A32 anyways, even in GCC (e.g. vceqh_f16).
+#if EIGEN_ARCH_ARM64 && defined(__ARM_FEATURE_FP16_SCALAR_ARITHMETIC) && !defined(EIGEN_GPU_COMPILE_PHASE)
+#define EIGEN_HAS_ARM64_FP16_SCALAR_ARITHMETIC 1
+#endif
+#endif
 #endif
 
 #if defined(EIGEN_USE_SYCL) && defined(__SYCL_DEVICE_ONLY__)
@@ -654,15 +655,15 @@
 
 // Cross compiler wrapper around LLVM's __has_builtin
 #ifdef __has_builtin
-#  define EIGEN_HAS_BUILTIN(x) __has_builtin(x)
+#define EIGEN_HAS_BUILTIN(x) __has_builtin(x)
 #else
-#  define EIGEN_HAS_BUILTIN(x) 0
+#define EIGEN_HAS_BUILTIN(x) 0
 #endif
 
 // A Clang feature extension to determine compiler features.
 // We use it to determine 'cxx_rvalue_references'
 #ifndef __has_feature
-# define __has_feature(x) 0
+#define __has_feature(x) 0
 #endif
 
 // The macro EIGEN_CPLUSPLUS is a replacement for __cplusplus/_MSVC_LANG that
@@ -686,29 +687,25 @@
 // For instance, if compiling with gcc and -std=c++17, then EIGEN_COMP_CXXVER
 // is defined to 17.
 #if EIGEN_CPLUSPLUS >= 202002L
-  #define EIGEN_COMP_CXXVER 20
+#define EIGEN_COMP_CXXVER 20
 #elif EIGEN_CPLUSPLUS >= 201703L
-  #define EIGEN_COMP_CXXVER 17
+#define EIGEN_COMP_CXXVER 17
 #elif EIGEN_CPLUSPLUS >= 201402L
-  #define EIGEN_COMP_CXXVER 14
+#define EIGEN_COMP_CXXVER 14
 #elif EIGEN_CPLUSPLUS >= 201103L
-  #define EIGEN_COMP_CXXVER 11
+#define EIGEN_COMP_CXXVER 11
 #else
-  #define EIGEN_COMP_CXXVER 03
+#define EIGEN_COMP_CXXVER 03
 #endif
 
-
 // The macros EIGEN_HAS_CXX?? defines a rough estimate of available c++ features
 // but in practice we should not rely on them but rather on the availability of
 // individual features as defined later.
 // This is why there is no EIGEN_HAS_CXX17.
-#if EIGEN_MAX_CPP_VER < 14 || EIGEN_COMP_CXXVER < 14 || \
-  (EIGEN_COMP_MSVC && EIGEN_COMP_MSVC < 1900) || \
-  (EIGEN_COMP_ICC && EIGEN_COMP_ICC < 1500) || \
-  (EIGEN_COMP_NVCC && EIGEN_COMP_NVCC < 80000) || \
-  (EIGEN_COMP_CLANG_STRICT && EIGEN_COMP_CLANG < 390) || \
-  (EIGEN_COMP_CLANGAPPLE && EIGEN_COMP_CLANGAPPLE < 9000000) || \
-  (EIGEN_COMP_GNUC_STRICT && EIGEN_COMP_GNUC < 510)
+#if EIGEN_MAX_CPP_VER < 14 || EIGEN_COMP_CXXVER < 14 || (EIGEN_COMP_MSVC && EIGEN_COMP_MSVC < 1900) || \
+    (EIGEN_COMP_ICC && EIGEN_COMP_ICC < 1500) || (EIGEN_COMP_NVCC && EIGEN_COMP_NVCC < 80000) ||       \
+    (EIGEN_COMP_CLANG_STRICT && EIGEN_COMP_CLANG < 390) ||                                             \
+    (EIGEN_COMP_CLANGAPPLE && EIGEN_COMP_CLANGAPPLE < 9000000) || (EIGEN_COMP_GNUC_STRICT && EIGEN_COMP_GNUC < 510)
 #error This compiler appears to be too old to be supported by Eigen
 #endif
 
@@ -716,13 +713,12 @@
 // Need to include <cmath> to make sure _GLIBCXX_USE_C99 gets defined
 #include <cmath>
 #ifndef EIGEN_HAS_C99_MATH
-#if ((defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901))       \
-  || (defined(__GNUC__) && defined(_GLIBCXX_USE_C99)) \
-  || (defined(_LIBCPP_VERSION) && !defined(_MSC_VER)) \
-  || (EIGEN_COMP_MSVC) || defined(SYCL_DEVICE_ONLY))
-  #define EIGEN_HAS_C99_MATH 1
+#if ((defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901)) ||                                          \
+     (defined(__GNUC__) && defined(_GLIBCXX_USE_C99)) || (defined(_LIBCPP_VERSION) && !defined(_MSC_VER)) || \
+     (EIGEN_COMP_MSVC) || defined(SYCL_DEVICE_ONLY))
+#define EIGEN_HAS_C99_MATH 1
 #else
-  #define EIGEN_HAS_C99_MATH 0
+#define EIGEN_HAS_C99_MATH 0
 #endif
 #endif
 
@@ -755,12 +751,10 @@
 //       for over-aligned data, but not in a manner that is compatible with Eigen.
 //       See https://gitlab.com/libeigen/eigen/-/issues/2575
 #ifndef EIGEN_HAS_CXX17_OVERALIGN
-#if EIGEN_MAX_CPP_VER>=17 && EIGEN_COMP_CXXVER>=17 && (                 \
-           (EIGEN_COMP_MSVC >= 1912)                                    \
-        || (EIGEN_GNUC_STRICT_AT_LEAST(7,0,0))                          \
-        || (EIGEN_CLANG_STRICT_AT_LEAST(5,0,0))                         \
-        || (EIGEN_COMP_CLANGAPPLE && EIGEN_COMP_CLANGAPPLE >= 10000000) \
-      ) && !EIGEN_COMP_ICC
+#if EIGEN_MAX_CPP_VER >= 17 && EIGEN_COMP_CXXVER >= 17 &&                                                            \
+    ((EIGEN_COMP_MSVC >= 1912) || (EIGEN_GNUC_STRICT_AT_LEAST(7, 0, 0)) || (EIGEN_CLANG_STRICT_AT_LEAST(5, 0, 0)) || \
+     (EIGEN_COMP_CLANGAPPLE && EIGEN_COMP_CLANGAPPLE >= 10000000)) &&                                                \
+    !EIGEN_COMP_ICC
 #define EIGEN_HAS_CXX17_OVERALIGN 1
 #else
 #define EIGEN_HAS_CXX17_OVERALIGN 0
@@ -768,16 +762,16 @@
 #endif
 
 #if defined(EIGEN_CUDACC)
-  // While available already with c++11, this is useful mostly starting with c++14 and relaxed constexpr rules
-  #if defined(__NVCC__)
-    // nvcc considers constexpr functions as __host__ __device__ with the option --expt-relaxed-constexpr
-    #ifdef __CUDACC_RELAXED_CONSTEXPR__
-      #define EIGEN_CONSTEXPR_ARE_DEVICE_FUNC
-    #endif
-  #elif defined(__clang__) && defined(__CUDA__) && __has_feature(cxx_relaxed_constexpr)
-    // clang++ always considers constexpr functions as implicitly __host__ __device__
-    #define EIGEN_CONSTEXPR_ARE_DEVICE_FUNC
-  #endif
+// While available already with c++11, this is useful mostly starting with c++14 and relaxed constexpr rules
+#if defined(__NVCC__)
+// nvcc considers constexpr functions as __host__ __device__ with the option --expt-relaxed-constexpr
+#ifdef __CUDACC_RELAXED_CONSTEXPR__
+#define EIGEN_CONSTEXPR_ARE_DEVICE_FUNC
+#endif
+#elif defined(__clang__) && defined(__CUDA__) && __has_feature(cxx_relaxed_constexpr)
+// clang++ always considers constexpr functions as implicitly __host__ __device__
+#define EIGEN_CONSTEXPR_ARE_DEVICE_FUNC
+#endif
 #endif
 
 // Does the compiler support the __int128 and __uint128_t extensions for 128-bit
@@ -807,8 +801,8 @@
 #define EIGEN_DEBUG_VAR(x) std::cerr << #x << " = " << x << std::endl;
 
 // concatenate two tokens
-#define EIGEN_CAT2(a,b) a ## b
-#define EIGEN_CAT(a,b) EIGEN_CAT2(a,b)
+#define EIGEN_CAT2(a, b) a##b
+#define EIGEN_CAT(a, b) EIGEN_CAT2(a, b)
 
 #define EIGEN_COMMA ,
 
@@ -855,36 +849,35 @@
 
 // Disable some features when compiling with GPU compilers (SYCL/HIPCC)
 #if defined(SYCL_DEVICE_ONLY) || defined(EIGEN_HIP_DEVICE_COMPILE)
-  // Do not try asserts on device code
-  #ifndef EIGEN_NO_DEBUG
-  #define EIGEN_NO_DEBUG
-  #endif
+// Do not try asserts on device code
+#ifndef EIGEN_NO_DEBUG
+#define EIGEN_NO_DEBUG
+#endif
 
-  #ifdef EIGEN_INTERNAL_DEBUGGING
-  #undef EIGEN_INTERNAL_DEBUGGING
-  #endif
+#ifdef EIGEN_INTERNAL_DEBUGGING
+#undef EIGEN_INTERNAL_DEBUGGING
+#endif
 #endif
 
 // No exceptions on device.
 #if defined(SYCL_DEVICE_ONLY) || defined(EIGEN_GPU_COMPILE_PHASE)
-  #ifdef EIGEN_EXCEPTIONS
-  #undef EIGEN_EXCEPTIONS
-  #endif
+#ifdef EIGEN_EXCEPTIONS
+#undef EIGEN_EXCEPTIONS
+#endif
 #endif
 
 #if defined(SYCL_DEVICE_ONLY)
-  #ifndef EIGEN_DONT_VECTORIZE
-    #define EIGEN_DONT_VECTORIZE
-  #endif
-  #define EIGEN_DEVICE_FUNC __attribute__((flatten)) __attribute__((always_inline))
+#ifndef EIGEN_DONT_VECTORIZE
+#define EIGEN_DONT_VECTORIZE
+#endif
+#define EIGEN_DEVICE_FUNC __attribute__((flatten)) __attribute__((always_inline))
 // All functions callable from CUDA/HIP code must be qualified with __device__
 #elif defined(EIGEN_GPUCC)
-    #define EIGEN_DEVICE_FUNC __host__ __device__
+#define EIGEN_DEVICE_FUNC __host__ __device__
 #else
-  #define EIGEN_DEVICE_FUNC
+#define EIGEN_DEVICE_FUNC
 #endif
 
-
 // this macro allows to get rid of linking errors about multiply defined functions.
 //  - static is not very good because it prevents definitions from different object files to be merged.
 //           So static causes the resulting linked executable to be bloated with multiple copies of the same function.
@@ -893,9 +886,9 @@
 #define EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_DEVICE_FUNC inline
 
 #ifdef NDEBUG
-# ifndef EIGEN_NO_DEBUG
-#  define EIGEN_NO_DEBUG
-# endif
+#ifndef EIGEN_NO_DEBUG
+#define EIGEN_NO_DEBUG
+#endif
 #endif
 
 // eigen_assert can be overridden
@@ -916,15 +909,15 @@
 #endif
 
 #ifndef EIGEN_NO_DEPRECATED_WARNING
-  #if EIGEN_COMP_GNUC
-    #define EIGEN_DEPRECATED __attribute__((deprecated))
-  #elif EIGEN_COMP_MSVC
-    #define EIGEN_DEPRECATED __declspec(deprecated)
-  #else
-    #define EIGEN_DEPRECATED
-  #endif
+#if EIGEN_COMP_GNUC
+#define EIGEN_DEPRECATED __attribute__((deprecated))
+#elif EIGEN_COMP_MSVC
+#define EIGEN_DEPRECATED __declspec(deprecated)
 #else
-  #define EIGEN_DEPRECATED
+#define EIGEN_DEPRECATED
+#endif
+#else
+#define EIGEN_DEPRECATED
 #endif
 
 #if EIGEN_COMP_GNUC
@@ -934,37 +927,37 @@
 #endif
 
 #if EIGEN_COMP_GNUC
-  #define EIGEN_PRAGMA(tokens) _Pragma(#tokens)
-  #define EIGEN_DIAGNOSTICS(tokens) EIGEN_PRAGMA(GCC diagnostic tokens)
-  #define EIGEN_DIAGNOSTICS_OFF(msc, gcc) EIGEN_DIAGNOSTICS(gcc)
+#define EIGEN_PRAGMA(tokens) _Pragma(#tokens)
+#define EIGEN_DIAGNOSTICS(tokens) EIGEN_PRAGMA(GCC diagnostic tokens)
+#define EIGEN_DIAGNOSTICS_OFF(msc, gcc) EIGEN_DIAGNOSTICS(gcc)
 #elif EIGEN_COMP_MSVC
-  #define EIGEN_PRAGMA(tokens) __pragma(tokens)
-  #define EIGEN_DIAGNOSTICS(tokens) EIGEN_PRAGMA(warning(tokens))
-  #define EIGEN_DIAGNOSTICS_OFF(msc, gcc) EIGEN_DIAGNOSTICS(msc)
+#define EIGEN_PRAGMA(tokens) __pragma(tokens)
+#define EIGEN_DIAGNOSTICS(tokens) EIGEN_PRAGMA(warning(tokens))
+#define EIGEN_DIAGNOSTICS_OFF(msc, gcc) EIGEN_DIAGNOSTICS(msc)
 #else
-  #define EIGEN_PRAGMA(tokens)
-  #define EIGEN_DIAGNOSTICS(tokens)
-  #define EIGEN_DIAGNOSTICS_OFF(msc, gcc)
+#define EIGEN_PRAGMA(tokens)
+#define EIGEN_DIAGNOSTICS(tokens)
+#define EIGEN_DIAGNOSTICS_OFF(msc, gcc)
 #endif
 
 #define EIGEN_DISABLE_DEPRECATED_WARNING EIGEN_DIAGNOSTICS_OFF(disable : 4996, ignored "-Wdeprecated-declarations")
 
 // Suppresses 'unused variable' warnings.
 namespace Eigen {
-  namespace internal {
-    template<typename T> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE constexpr void ignore_unused_variable(const T&) {}
-  }
-}
+namespace internal {
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE constexpr void ignore_unused_variable(const T&) {}
+}  // namespace internal
+}  // namespace Eigen
 #define EIGEN_UNUSED_VARIABLE(var) Eigen::internal::ignore_unused_variable(var);
 
 #if !defined(EIGEN_ASM_COMMENT)
-  #if EIGEN_COMP_GNUC && (EIGEN_ARCH_i386_OR_x86_64 || EIGEN_ARCH_ARM_OR_ARM64)
-    #define EIGEN_ASM_COMMENT(X)  __asm__("#" X)
-  #else
-    #define EIGEN_ASM_COMMENT(X)
-  #endif
+#if EIGEN_COMP_GNUC && (EIGEN_ARCH_i386_OR_x86_64 || EIGEN_ARCH_ARM_OR_ARM64)
+#define EIGEN_ASM_COMMENT(X) __asm__("#" X)
+#else
+#define EIGEN_ASM_COMMENT(X)
 #endif
-
+#endif
 
 // Acts as a barrier preventing operations involving `X` from crossing. This
 // occurs, for example, in the fast rounding trick where a magic constant is
@@ -972,91 +965,90 @@
 //
 // See bug 1674
 #if !defined(EIGEN_OPTIMIZATION_BARRIER)
-  #if EIGEN_COMP_GNUC
-    // According to https://gcc.gnu.org/onlinedocs/gcc/Constraints.html:
-    //   X: Any operand whatsoever.
-    //   r: A register operand is allowed provided that it is in a general
-    //      register.
-    //   g: Any register, memory or immediate integer operand is allowed, except
-    //      for registers that are not general registers.
-    //   w: (AArch32/AArch64) Floating point register, Advanced SIMD vector
-    //      register or SVE vector register.
-    //   x: (SSE) Any SSE register.
-    //      (AArch64) Like w, but restricted to registers 0 to 15 inclusive.
-    //   v: (PowerPC) An Altivec vector register.
-    //   wa:(PowerPC) A VSX register.
-    //
-    // "X" (uppercase) should work for all cases, though this seems to fail for
-    // some versions of GCC for arm/aarch64 with
-    //   "error: inconsistent operand constraints in an 'asm'"
-    // Clang x86_64/arm/aarch64 seems to require "g" to support both scalars and
-    // vectors, otherwise
-    //   "error: non-trivial scalar-to-vector conversion, possible invalid
-    //    constraint for vector type"
-    //
-    // GCC for ppc64le generates an internal compiler error with x/X/g.
-    // GCC for AVX generates an internal compiler error with X.
-    //
-    // Tested on icc/gcc/clang for sse, avx, avx2, avx512dq
-    //           gcc for arm, aarch64,
-    //           gcc for ppc64le,
-    // both vectors and scalars.
-    //
-    // Note that this is restricted to plain types - this will not work
-    // directly for std::complex<T>, Eigen::half, Eigen::bfloat16. For these,
-    // you will need to apply to the underlying POD type.
-    #if EIGEN_ARCH_PPC && EIGEN_COMP_GNUC_STRICT
-      // This seems to be broken on clang. Packet4f is loaded into a single
-      //   register rather than a vector, zeroing out some entries. Integer
-      //   types also generate a compile error.
-      #if EIGEN_OS_MAC
-        // General, Altivec for Apple (VSX were added in ISA v2.06):
-        #define EIGEN_OPTIMIZATION_BARRIER(X)  __asm__  ("" : "+r,v" (X));
-      #else
-        // General, Altivec, VSX otherwise:
-        #define EIGEN_OPTIMIZATION_BARRIER(X)  __asm__  ("" : "+r,v,wa" (X));
-      #endif
-    #elif EIGEN_ARCH_ARM_OR_ARM64
-      #ifdef __ARM_FP
-        // General, VFP or NEON.
-        // Clang doesn't like "r",
-        //    error: non-trivial scalar-to-vector conversion, possible invalid
-        //           constraint for vector typ
-        #define EIGEN_OPTIMIZATION_BARRIER(X)  __asm__  ("" : "+g,w" (X));
-      #else
-        // Arm without VFP or NEON.
-        // "w" constraint will not compile.
-        #define EIGEN_OPTIMIZATION_BARRIER(X)  __asm__  ("" : "+g" (X));
-      #endif
-    #elif EIGEN_ARCH_i386_OR_x86_64
-      // General, SSE.
-      #define EIGEN_OPTIMIZATION_BARRIER(X)  __asm__  ("" : "+g,x" (X));
-    #else
-      // Not implemented for other architectures.
-      #define EIGEN_OPTIMIZATION_BARRIER(X)
-    #endif
-  #else
-    // Not implemented for other compilers.
-    #define EIGEN_OPTIMIZATION_BARRIER(X)
-  #endif
+#if EIGEN_COMP_GNUC
+   // According to https://gcc.gnu.org/onlinedocs/gcc/Constraints.html:
+//   X: Any operand whatsoever.
+//   r: A register operand is allowed provided that it is in a general
+//      register.
+//   g: Any register, memory or immediate integer operand is allowed, except
+//      for registers that are not general registers.
+//   w: (AArch32/AArch64) Floating point register, Advanced SIMD vector
+//      register or SVE vector register.
+//   x: (SSE) Any SSE register.
+//      (AArch64) Like w, but restricted to registers 0 to 15 inclusive.
+//   v: (PowerPC) An Altivec vector register.
+//   wa:(PowerPC) A VSX register.
+//
+// "X" (uppercase) should work for all cases, though this seems to fail for
+// some versions of GCC for arm/aarch64 with
+//   "error: inconsistent operand constraints in an 'asm'"
+// Clang x86_64/arm/aarch64 seems to require "g" to support both scalars and
+// vectors, otherwise
+//   "error: non-trivial scalar-to-vector conversion, possible invalid
+//    constraint for vector type"
+//
+// GCC for ppc64le generates an internal compiler error with x/X/g.
+// GCC for AVX generates an internal compiler error with X.
+//
+// Tested on icc/gcc/clang for sse, avx, avx2, avx512dq
+//           gcc for arm, aarch64,
+//           gcc for ppc64le,
+// both vectors and scalars.
+//
+// Note that this is restricted to plain types - this will not work
+// directly for std::complex<T>, Eigen::half, Eigen::bfloat16. For these,
+// you will need to apply to the underlying POD type.
+#if EIGEN_ARCH_PPC && EIGEN_COMP_GNUC_STRICT
+   // This seems to be broken on clang. Packet4f is loaded into a single
+//   register rather than a vector, zeroing out some entries. Integer
+//   types also generate a compile error.
+#if EIGEN_OS_MAC
+   // General, Altivec for Apple (VSX were added in ISA v2.06):
+#define EIGEN_OPTIMIZATION_BARRIER(X) __asm__("" : "+r,v"(X));
+#else
+   // General, Altivec, VSX otherwise:
+#define EIGEN_OPTIMIZATION_BARRIER(X) __asm__("" : "+r,v,wa"(X));
+#endif
+#elif EIGEN_ARCH_ARM_OR_ARM64
+#ifdef __ARM_FP
+   // General, VFP or NEON.
+// Clang doesn't like "r",
+//    error: non-trivial scalar-to-vector conversion, possible invalid
+//           constraint for vector typ
+#define EIGEN_OPTIMIZATION_BARRIER(X) __asm__("" : "+g,w"(X));
+#else
+   // Arm without VFP or NEON.
+// "w" constraint will not compile.
+#define EIGEN_OPTIMIZATION_BARRIER(X) __asm__("" : "+g"(X));
+#endif
+#elif EIGEN_ARCH_i386_OR_x86_64
+   // General, SSE.
+#define EIGEN_OPTIMIZATION_BARRIER(X) __asm__("" : "+g,x"(X));
+#else
+   // Not implemented for other architectures.
+#define EIGEN_OPTIMIZATION_BARRIER(X)
+#endif
+#else
+   // Not implemented for other compilers.
+#define EIGEN_OPTIMIZATION_BARRIER(X)
+#endif
 #endif
 
 #if EIGEN_COMP_MSVC
-  // NOTE MSVC often gives C4127 warnings with compiletime if statements. See bug 1362.
-  // This workaround is ugly, but it does the job.
-#  define EIGEN_CONST_CONDITIONAL(cond)  (void)0, cond
+// NOTE MSVC often gives C4127 warnings with compiletime if statements. See bug 1362.
+// This workaround is ugly, but it does the job.
+#define EIGEN_CONST_CONDITIONAL(cond) (void)0, cond
 #else
-#  define EIGEN_CONST_CONDITIONAL(cond)  cond
+#define EIGEN_CONST_CONDITIONAL(cond) cond
 #endif
 
 #ifdef EIGEN_DONT_USE_RESTRICT_KEYWORD
-  #define EIGEN_RESTRICT
+#define EIGEN_RESTRICT
 #endif
 #ifndef EIGEN_RESTRICT
-  #define EIGEN_RESTRICT __restrict
+#define EIGEN_RESTRICT __restrict
 #endif
 
-
 #ifndef EIGEN_DEFAULT_IO_FORMAT
 #ifdef EIGEN_MAKING_DOCS
 // format used in Eigen's documentation
@@ -1070,42 +1062,44 @@
 // just an empty macro !
 #define EIGEN_EMPTY
 
-
 // When compiling CUDA/HIP device code with NVCC or HIPCC
 // pull in math functions from the global namespace.
 // In host mode, and when device code is compiled with clang,
 // use the std versions.
 #if (defined(EIGEN_CUDA_ARCH) && defined(__NVCC__)) || defined(EIGEN_HIP_DEVICE_COMPILE)
-  #define EIGEN_USING_STD(FUNC) using ::FUNC;
+#define EIGEN_USING_STD(FUNC) using ::FUNC;
 #else
-  #define EIGEN_USING_STD(FUNC) using std::FUNC;
+#define EIGEN_USING_STD(FUNC) using std::FUNC;
 #endif
 
 #if EIGEN_COMP_MSVC_STRICT && EIGEN_COMP_NVCC
-  // Wwhen compiling with NVCC, using the base operator is necessary,
-  //   otherwise we get duplicate definition errors
-  // For later MSVC versions, we require explicit operator= definition, otherwise we get
-  //   use of implicitly deleted operator errors.
-  // (cf Bugs 920, 1000, 1324, 2291)
-  #define EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived) \
-    using Base::operator =;
-#elif EIGEN_COMP_CLANG // workaround clang bug (see http://forum.kde.org/viewtopic.php?f=74&t=102653)
-  #define EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived) \
-    using Base::operator =; \
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator=(const Derived& other) { Base::operator=(other); return *this; } \
-    template <typename OtherDerived> \
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator=(const DenseBase<OtherDerived>& other) { Base::operator=(other.derived()); return *this; }
+// Wwhen compiling with NVCC, using the base operator is necessary,
+//   otherwise we get duplicate definition errors
+// For later MSVC versions, we require explicit operator= definition, otherwise we get
+//   use of implicitly deleted operator errors.
+// (cf Bugs 920, 1000, 1324, 2291)
+#define EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived) using Base::operator=;
+#elif EIGEN_COMP_CLANG  // workaround clang bug (see http://forum.kde.org/viewtopic.php?f=74&t=102653)
+#define EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived)                                           \
+  using Base::operator=;                                                                           \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator=(const Derived& other) {                 \
+    Base::operator=(other);                                                                        \
+    return *this;                                                                                  \
+  }                                                                                                \
+  template <typename OtherDerived>                                                                 \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator=(const DenseBase<OtherDerived>& other) { \
+    Base::operator=(other.derived());                                                              \
+    return *this;                                                                                  \
+  }
 #else
-  #define EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived) \
-    using Base::operator =; \
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator=(const Derived& other) \
-    { \
-      Base::operator=(other); \
-      return *this; \
-    }
+#define EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived)                           \
+  using Base::operator=;                                                           \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator=(const Derived& other) { \
+    Base::operator=(other);                                                        \
+    return *this;                                                                  \
+  }
 #endif
 
-
 /**
  * \internal
  * \brief Macro to explicitly define the default copy constructor.
@@ -1113,16 +1107,14 @@
  */
 #define EIGEN_DEFAULT_COPY_CONSTRUCTOR(CLASS) EIGEN_DEVICE_FUNC CLASS(const CLASS&) = default;
 
-
-
 /** \internal
  * \brief Macro to manually inherit assignment operators.
- * This is necessary, because the implicitly defined assignment operator gets deleted when a custom operator= is defined.
- * With C++11 or later this also default-implements the copy-constructor
+ * This is necessary, because the implicitly defined assignment operator gets deleted when a custom operator= is
+ * defined. With C++11 or later this also default-implements the copy-constructor
  */
-#define EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Derived)  \
-    EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived) \
-    EIGEN_DEFAULT_COPY_CONSTRUCTOR(Derived)
+#define EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Derived) \
+  EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived)  \
+  EIGEN_DEFAULT_COPY_CONSTRUCTOR(Derived)
 
 /** \internal
  * \brief Macro to manually define default constructors and destructors.
@@ -1131,46 +1123,47 @@
  *
  * Hiding the default destructor lead to problems in C++03 mode together with boost::multiprecision
  */
-#define EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(Derived)  \
-    EIGEN_DEVICE_FUNC Derived() = default; \
-    EIGEN_DEVICE_FUNC ~Derived() = default;
-
-
-
-
+#define EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(Derived) \
+  EIGEN_DEVICE_FUNC Derived() = default;                        \
+  EIGEN_DEVICE_FUNC ~Derived() = default;
 
 /**
-* Just a side note. Commenting within defines works only by documenting
-* behind the object (via '!<'). Comments cannot be multi-line and thus
-* we have these extra long lines. What is confusing doxygen over here is
-* that we use '\' and basically have a bunch of typedefs with their
-* documentation in a single line.
-**/
+ * Just a side note. Commenting within defines works only by documenting
+ * behind the object (via '!<'). Comments cannot be multi-line and thus
+ * we have these extra long lines. What is confusing doxygen over here is
+ * that we use '\' and basically have a bunch of typedefs with their
+ * documentation in a single line.
+ **/
 
-#define EIGEN_GENERIC_PUBLIC_INTERFACE(Derived) \
-  typedef typename Eigen::internal::traits<Derived>::Scalar Scalar; /*!< \brief Numeric type, e.g. float, double, int or std::complex<float>. */ \
-  typedef typename Eigen::NumTraits<Scalar>::Real RealScalar; /*!< \brief The underlying numeric type for composed scalar types. \details In cases where Scalar is e.g. std::complex<T>, T were corresponding to RealScalar. */ \
-  typedef typename Base::CoeffReturnType CoeffReturnType; /*!< \brief The return type for coefficient access. \details Depending on whether the object allows direct coefficient access (e.g. for a MatrixXd), this type is either 'const Scalar&' or simply 'Scalar' for objects that do not allow direct coefficient access. */ \
-  typedef typename Eigen::internal::ref_selector<Derived>::type Nested; \
-  typedef typename Eigen::internal::traits<Derived>::StorageKind StorageKind; \
-  typedef typename Eigen::internal::traits<Derived>::StorageIndex StorageIndex; \
-  enum CompileTimeTraits \
-      { RowsAtCompileTime = Eigen::internal::traits<Derived>::RowsAtCompileTime, \
-        ColsAtCompileTime = Eigen::internal::traits<Derived>::ColsAtCompileTime, \
-        Flags = Eigen::internal::traits<Derived>::Flags, \
-        SizeAtCompileTime = Base::SizeAtCompileTime, \
-        MaxSizeAtCompileTime = Base::MaxSizeAtCompileTime, \
-        IsVectorAtCompileTime = Base::IsVectorAtCompileTime }; \
-  using Base::derived; \
+#define EIGEN_GENERIC_PUBLIC_INTERFACE(Derived)                                                                        \
+  typedef typename Eigen::internal::traits<Derived>::Scalar                                                            \
+      Scalar; /*!< \brief Numeric type, e.g. float, double, int or std::complex<float>. */                             \
+  typedef typename Eigen::NumTraits<Scalar>::Real                                                                      \
+      RealScalar; /*!< \brief The underlying numeric type for composed scalar types. \details In cases where Scalar is \
+                     e.g. std::complex<T>, T were corresponding to RealScalar. */                                      \
+  typedef typename Base::CoeffReturnType                                                                               \
+      CoeffReturnType; /*!< \brief The return type for coefficient access. \details Depending on whether the object    \
+                          allows direct coefficient access (e.g. for a MatrixXd), this type is either 'const Scalar&'  \
+                          or simply 'Scalar' for objects that do not allow direct coefficient access. */               \
+  typedef typename Eigen::internal::ref_selector<Derived>::type Nested;                                                \
+  typedef typename Eigen::internal::traits<Derived>::StorageKind StorageKind;                                          \
+  typedef typename Eigen::internal::traits<Derived>::StorageIndex StorageIndex;                                        \
+  enum CompileTimeTraits {                                                                                             \
+    RowsAtCompileTime = Eigen::internal::traits<Derived>::RowsAtCompileTime,                                           \
+    ColsAtCompileTime = Eigen::internal::traits<Derived>::ColsAtCompileTime,                                           \
+    Flags = Eigen::internal::traits<Derived>::Flags,                                                                   \
+    SizeAtCompileTime = Base::SizeAtCompileTime,                                                                       \
+    MaxSizeAtCompileTime = Base::MaxSizeAtCompileTime,                                                                 \
+    IsVectorAtCompileTime = Base::IsVectorAtCompileTime                                                                \
+  };                                                                                                                   \
+  using Base::derived;                                                                                                 \
   using Base::const_cast_derived;
 
-
 // FIXME Maybe the EIGEN_DENSE_PUBLIC_INTERFACE could be removed as importing PacketScalar is rarely needed
 #define EIGEN_DENSE_PUBLIC_INTERFACE(Derived) \
-  EIGEN_GENERIC_PUBLIC_INTERFACE(Derived) \
+  EIGEN_GENERIC_PUBLIC_INTERFACE(Derived)     \
   typedef typename Base::PacketScalar PacketScalar;
 
-
 #if EIGEN_HAS_BUILTIN(__builtin_expect) || EIGEN_COMP_GNUC
 #define EIGEN_PREDICT_FALSE(x) (__builtin_expect(x, false))
 #define EIGEN_PREDICT_TRUE(x) (__builtin_expect(false || (x), true))
@@ -1180,101 +1173,107 @@
 #endif
 
 // the expression type of a standard coefficient wise binary operation
-#define EIGEN_CWISE_BINARY_RETURN_TYPE(LHS,RHS,OPNAME) \
-    CwiseBinaryOp< \
-      EIGEN_CAT(EIGEN_CAT(internal::scalar_,OPNAME),_op)< \
-          typename internal::traits<LHS>::Scalar, \
-          typename internal::traits<RHS>::Scalar \
-      >, \
-      const LHS, \
-      const RHS \
-    >
+#define EIGEN_CWISE_BINARY_RETURN_TYPE(LHS, RHS, OPNAME)                                                       \
+  CwiseBinaryOp<EIGEN_CAT(EIGEN_CAT(internal::scalar_, OPNAME), _op) < typename internal::traits<LHS>::Scalar, \
+                typename internal::traits<RHS>::Scalar>,                                                       \
+      const LHS, const RHS >
 
-#define EIGEN_MAKE_CWISE_BINARY_OP(METHOD,OPNAME) \
-  template<typename OtherDerived> \
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const EIGEN_CWISE_BINARY_RETURN_TYPE(Derived,OtherDerived,OPNAME) \
-  (METHOD)(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const \
-  { \
-    return EIGEN_CWISE_BINARY_RETURN_TYPE(Derived,OtherDerived,OPNAME)(derived(), other.derived()); \
+#define EIGEN_MAKE_CWISE_BINARY_OP(METHOD, OPNAME)                                                                \
+  template <typename OtherDerived>                                                                                \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const EIGEN_CWISE_BINARY_RETURN_TYPE(                                     \
+      Derived, OtherDerived, OPNAME)(METHOD)(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived>& other) const { \
+    return EIGEN_CWISE_BINARY_RETURN_TYPE(Derived, OtherDerived, OPNAME)(derived(), other.derived());             \
   }
 
-#define EIGEN_SCALAR_BINARY_SUPPORTED(OPNAME,TYPEA,TYPEB) \
-  (Eigen::internal::has_ReturnType<Eigen::ScalarBinaryOpTraits<TYPEA,TYPEB,EIGEN_CAT(EIGEN_CAT(Eigen::internal::scalar_,OPNAME),_op)<TYPEA,TYPEB>  > >::value)
+#define EIGEN_SCALAR_BINARY_SUPPORTED(OPNAME, TYPEA, TYPEB)     \
+  (Eigen::internal::has_ReturnType<Eigen::ScalarBinaryOpTraits< \
+       TYPEA, TYPEB, EIGEN_CAT(EIGEN_CAT(Eigen::internal::scalar_, OPNAME), _op) < TYPEA, TYPEB> > > ::value)
 
-#define EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(EXPR,SCALAR,OPNAME) \
-  CwiseBinaryOp<EIGEN_CAT(EIGEN_CAT(internal::scalar_,OPNAME),_op)<typename internal::traits<EXPR>::Scalar,SCALAR>, const EXPR, \
-                const typename internal::plain_constant_type<EXPR,SCALAR>::type>
+#define EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(EXPR, SCALAR, OPNAME)                                            \
+  CwiseBinaryOp<EIGEN_CAT(EIGEN_CAT(internal::scalar_, OPNAME), _op) < typename internal::traits<EXPR>::Scalar, \
+                SCALAR>,                                                                                        \
+      const EXPR, const typename internal::plain_constant_type<EXPR, SCALAR>::type >
 
-#define EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(SCALAR,EXPR,OPNAME) \
-  CwiseBinaryOp<EIGEN_CAT(EIGEN_CAT(internal::scalar_,OPNAME),_op)<SCALAR,typename internal::traits<EXPR>::Scalar>, \
-                const typename internal::plain_constant_type<EXPR,SCALAR>::type, const EXPR>
+#define EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(SCALAR, EXPR, OPNAME)           \
+  CwiseBinaryOp<EIGEN_CAT(EIGEN_CAT(internal::scalar_, OPNAME), _op) < SCALAR, \
+                typename internal::traits<EXPR>::Scalar>,                      \
+      const typename internal::plain_constant_type<EXPR, SCALAR>::type, const EXPR >
 
-#define EIGEN_MAKE_SCALAR_BINARY_OP_ONTHERIGHT(METHOD,OPNAME) \
-  template <typename T> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE \
-  const EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(Derived,typename internal::promote_scalar_arg<Scalar EIGEN_COMMA T EIGEN_COMMA EIGEN_SCALAR_BINARY_SUPPORTED(OPNAME,Scalar,T)>::type,OPNAME)\
-  (METHOD)(const T& scalar) const { \
-    typedef typename internal::promote_scalar_arg<Scalar,T,EIGEN_SCALAR_BINARY_SUPPORTED(OPNAME,Scalar,T)>::type PromotedT; \
-    return EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(Derived,PromotedT,OPNAME)(derived(), \
-           typename internal::plain_constant_type<Derived,PromotedT>::type(derived().rows(), derived().cols(), internal::scalar_constant_op<PromotedT>(scalar))); \
+#define EIGEN_MAKE_SCALAR_BINARY_OP_ONTHERIGHT(METHOD, OPNAME)                                                       \
+  template <typename T>                                                                                              \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(                                \
+      Derived,                                                                                                       \
+      typename internal::promote_scalar_arg<Scalar EIGEN_COMMA T EIGEN_COMMA EIGEN_SCALAR_BINARY_SUPPORTED(          \
+          OPNAME, Scalar, T)>::type,                                                                                 \
+      OPNAME)(METHOD)(const T& scalar) const {                                                                       \
+    typedef typename internal::promote_scalar_arg<Scalar, T, EIGEN_SCALAR_BINARY_SUPPORTED(OPNAME, Scalar, T)>::type \
+        PromotedT;                                                                                                   \
+    return EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(Derived, PromotedT, OPNAME)(                                       \
+        derived(), typename internal::plain_constant_type<Derived, PromotedT>::type(                                 \
+                       derived().rows(), derived().cols(), internal::scalar_constant_op<PromotedT>(scalar)));        \
   }
 
-#define EIGEN_MAKE_SCALAR_BINARY_OP_ONTHELEFT(METHOD,OPNAME) \
-  template <typename T> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE friend \
-  const EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(typename internal::promote_scalar_arg<Scalar EIGEN_COMMA T EIGEN_COMMA EIGEN_SCALAR_BINARY_SUPPORTED(OPNAME,T,Scalar)>::type,Derived,OPNAME) \
-  (METHOD)(const T& scalar, const StorageBaseType& matrix) { \
-    typedef typename internal::promote_scalar_arg<Scalar,T,EIGEN_SCALAR_BINARY_SUPPORTED(OPNAME,T,Scalar)>::type PromotedT; \
-    return EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(PromotedT,Derived,OPNAME)( \
-           typename internal::plain_constant_type<Derived,PromotedT>::type(matrix.derived().rows(), matrix.derived().cols(), internal::scalar_constant_op<PromotedT>(scalar)), matrix.derived()); \
+#define EIGEN_MAKE_SCALAR_BINARY_OP_ONTHELEFT(METHOD, OPNAME)                                                        \
+  template <typename T>                                                                                              \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE friend const EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(                         \
+      typename internal::promote_scalar_arg<Scalar EIGEN_COMMA T EIGEN_COMMA EIGEN_SCALAR_BINARY_SUPPORTED(          \
+          OPNAME, T, Scalar)>::type,                                                                                 \
+      Derived, OPNAME)(METHOD)(const T& scalar, const StorageBaseType& matrix) {                                     \
+    typedef typename internal::promote_scalar_arg<Scalar, T, EIGEN_SCALAR_BINARY_SUPPORTED(OPNAME, T, Scalar)>::type \
+        PromotedT;                                                                                                   \
+    return EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(PromotedT, Derived, OPNAME)(                                       \
+        typename internal::plain_constant_type<Derived, PromotedT>::type(                                            \
+            matrix.derived().rows(), matrix.derived().cols(), internal::scalar_constant_op<PromotedT>(scalar)),      \
+        matrix.derived());                                                                                           \
   }
 
-#define EIGEN_MAKE_SCALAR_BINARY_OP(METHOD,OPNAME) \
-  EIGEN_MAKE_SCALAR_BINARY_OP_ONTHELEFT(METHOD,OPNAME) \
-  EIGEN_MAKE_SCALAR_BINARY_OP_ONTHERIGHT(METHOD,OPNAME)
+#define EIGEN_MAKE_SCALAR_BINARY_OP(METHOD, OPNAME)     \
+  EIGEN_MAKE_SCALAR_BINARY_OP_ONTHELEFT(METHOD, OPNAME) \
+  EIGEN_MAKE_SCALAR_BINARY_OP_ONTHERIGHT(METHOD, OPNAME)
 
-
-#if (defined(_CPPUNWIND) || defined(__EXCEPTIONS)) && !defined(EIGEN_CUDA_ARCH) && !defined(EIGEN_EXCEPTIONS) && !defined(EIGEN_USE_SYCL) && !defined(EIGEN_HIP_DEVICE_COMPILE)
-  #define EIGEN_EXCEPTIONS
+#if (defined(_CPPUNWIND) || defined(__EXCEPTIONS)) && !defined(EIGEN_CUDA_ARCH) && !defined(EIGEN_EXCEPTIONS) && \
+    !defined(EIGEN_USE_SYCL) && !defined(EIGEN_HIP_DEVICE_COMPILE)
+#define EIGEN_EXCEPTIONS
 #endif
 
-
 #ifdef EIGEN_EXCEPTIONS
-#  define EIGEN_THROW_X(X) throw X
-#  define EIGEN_THROW throw
-#  define EIGEN_TRY try
-#  define EIGEN_CATCH(X) catch (X)
+#define EIGEN_THROW_X(X) throw X
+#define EIGEN_THROW throw
+#define EIGEN_TRY try
+#define EIGEN_CATCH(X) catch (X)
 #else
-#  if defined(EIGEN_CUDA_ARCH)
-#    define EIGEN_THROW_X(X) asm("trap;")
-#    define EIGEN_THROW asm("trap;")
-#  elif defined(EIGEN_HIP_DEVICE_COMPILE)
-#    define EIGEN_THROW_X(X) asm("s_trap 0")
-#    define EIGEN_THROW asm("s_trap 0")
-#  else
-#    define EIGEN_THROW_X(X) std::abort()
-#    define EIGEN_THROW std::abort()
-#  endif
-#  define EIGEN_TRY if (true)
-#  define EIGEN_CATCH(X) else
+#if defined(EIGEN_CUDA_ARCH)
+#define EIGEN_THROW_X(X) asm("trap;")
+#define EIGEN_THROW asm("trap;")
+#elif defined(EIGEN_HIP_DEVICE_COMPILE)
+#define EIGEN_THROW_X(X) asm("s_trap 0")
+#define EIGEN_THROW asm("s_trap 0")
+#else
+#define EIGEN_THROW_X(X) std::abort()
+#define EIGEN_THROW std::abort()
 #endif
-
+#define EIGEN_TRY if (true)
+#define EIGEN_CATCH(X) else
+#endif
 
 #define EIGEN_NOEXCEPT noexcept
 #define EIGEN_NOEXCEPT_IF(x) noexcept(x)
 #define EIGEN_NO_THROW noexcept(true)
 #define EIGEN_EXCEPTION_SPEC(X) noexcept(false)
 
-
 // The all function is used to enable a variadic version of eigen_assert which can take a parameter pack as its input.
 namespace Eigen {
 namespace internal {
 
-EIGEN_DEVICE_FUNC inline bool all(){ return true; }
+EIGEN_DEVICE_FUNC inline bool all() { return true; }
 
-template<typename T, typename ...Ts>
-EIGEN_DEVICE_FUNC bool all(T t, Ts ... ts){ return t && all(ts...); }
+template <typename T, typename... Ts>
+EIGEN_DEVICE_FUNC bool all(T t, Ts... ts) {
+  return t && all(ts...);
+}
 
-}
-}
+}  // namespace internal
+}  // namespace Eigen
 
 // provide override and final specifiers if they are available:
 #define EIGEN_OVERRIDE override
@@ -1282,13 +1281,13 @@
 
 // Wrapping #pragma unroll in a macro since it is required for SYCL
 #if defined(SYCL_DEVICE_ONLY)
-  #if defined(_MSC_VER)
-    #define EIGEN_UNROLL_LOOP __pragma(unroll)
-  #else
-    #define EIGEN_UNROLL_LOOP _Pragma("unroll")
-  #endif
+#if defined(_MSC_VER)
+#define EIGEN_UNROLL_LOOP __pragma(unroll)
 #else
-  #define EIGEN_UNROLL_LOOP
+#define EIGEN_UNROLL_LOOP _Pragma("unroll")
+#endif
+#else
+#define EIGEN_UNROLL_LOOP
 #endif
 
 // Notice: Use this macro with caution. The code in the if body should still
@@ -1299,4 +1298,4 @@
 #define EIGEN_IF_CONSTEXPR(X) if (X)
 #endif
 
-#endif // EIGEN_MACROS_H
+#endif  // EIGEN_MACROS_H
diff --git a/Eigen/src/Core/util/MaxSizeVector.h b/Eigen/src/Core/util/MaxSizeVector.h
index ca0e3d1..2f1e3d3 100644
--- a/Eigen/src/Core/util/MaxSizeVector.h
+++ b/Eigen/src/Core/util/MaxSizeVector.h
@@ -13,55 +13,52 @@
 namespace Eigen {
 
 /** \class MaxSizeVector
-  * \ingroup Core
-  *
-  * \brief The MaxSizeVector class.
-  *
-  * The %MaxSizeVector provides a subset of std::vector functionality.
-  *
-  * The goal is to provide basic std::vector operations when using
-  * std::vector is not an option (e.g. on GPU or when compiling using
-  * FMA/AVX, as this can cause either compilation failures or illegal
-  * instruction failures).
-  *
-  * Beware: The constructors are not API compatible with these of
-  * std::vector.
-  */
+ * \ingroup Core
+ *
+ * \brief The MaxSizeVector class.
+ *
+ * The %MaxSizeVector provides a subset of std::vector functionality.
+ *
+ * The goal is to provide basic std::vector operations when using
+ * std::vector is not an option (e.g. on GPU or when compiling using
+ * FMA/AVX, as this can cause either compilation failures or illegal
+ * instruction failures).
+ *
+ * Beware: The constructors are not API compatible with these of
+ * std::vector.
+ */
 template <typename T>
 class MaxSizeVector {
   static const size_t alignment = internal::plain_enum_max(EIGEN_ALIGNOF(T), sizeof(void*));
+
  public:
   // Construct a new MaxSizeVector, reserve n elements.
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  explicit MaxSizeVector(size_t n)
-      : reserve_(n), size_(0),
-        data_(static_cast<T*>(internal::handmade_aligned_malloc(n * sizeof(T), alignment))) {
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit MaxSizeVector(size_t n)
+      : reserve_(n), size_(0), data_(static_cast<T*>(internal::handmade_aligned_malloc(n * sizeof(T), alignment))) {}
 
   // Construct a new MaxSizeVector, reserve and resize to n.
   // Copy the init value to all elements.
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  MaxSizeVector(size_t n, const T& init)
-      : reserve_(n), size_(n),
-        data_(static_cast<T*>(internal::handmade_aligned_malloc(n * sizeof(T), alignment))) {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE MaxSizeVector(size_t n, const T& init)
+      : reserve_(n), size_(n), data_(static_cast<T*>(internal::handmade_aligned_malloc(n * sizeof(T), alignment))) {
     size_t i = 0;
-    EIGEN_TRY
-    {
-      for(; i < size_; ++i) { new (&data_[i]) T(init); }
+    EIGEN_TRY {
+      for (; i < size_; ++i) {
+        new (&data_[i]) T(init);
+      }
     }
-    EIGEN_CATCH(...)
-    {
+    EIGEN_CATCH(...) {
       // Construction failed, destruct in reverse order:
-      for(; (i+1) > 0; --i) { data_[i-1].~T(); }
+      for (; (i + 1) > 0; --i) {
+        data_[i - 1].~T();
+      }
       internal::handmade_aligned_free(data_);
       EIGEN_THROW;
     }
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  ~MaxSizeVector() {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ~MaxSizeVector() {
     for (size_t i = size_; i > 0; --i) {
-      data_[i-1].~T();
+      data_[i - 1].~T();
     }
     internal::handmade_aligned_free(data_);
   }
@@ -72,80 +69,64 @@
       new (&data_[size_]) T;
     }
     for (; size_ > n; --size_) {
-      data_[size_-1].~T();
+      data_[size_ - 1].~T();
     }
     eigen_assert(size_ == n);
   }
 
   // Append new elements (up to reserved size).
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  void push_back(const T& t) {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void push_back(const T& t) {
     eigen_assert(size_ < reserve_);
     new (&data_[size_++]) T(t);
   }
 
   // For C++03 compatibility this only takes one argument
-  template<class X>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  void emplace_back(const X& x) {
+  template <class X>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void emplace_back(const X& x) {
     eigen_assert(size_ < reserve_);
     new (&data_[size_++]) T(x);
   }
 
-
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  const T& operator[] (size_t i) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T& operator[](size_t i) const {
     eigen_assert(i < size_);
     return data_[i];
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  T& operator[] (size_t i) {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& operator[](size_t i) {
     eigen_assert(i < size_);
     return data_[i];
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  T& back() {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& back() {
     eigen_assert(size_ > 0);
     return data_[size_ - 1];
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  const T& back() const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T& back() const {
     eigen_assert(size_ > 0);
     return data_[size_ - 1];
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  void pop_back() {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pop_back() {
     eigen_assert(size_ > 0);
     data_[--size_].~T();
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  size_t size() const { return size_; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE size_t size() const { return size_; }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  bool empty() const { return size_ == 0; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool empty() const { return size_ == 0; }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  T* data() { return data_; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T* data() { return data_; }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  const T* data() const { return data_; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T* data() const { return data_; }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  T* begin() { return data_; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T* begin() { return data_; }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  T* end() { return data_ + size_; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T* end() { return data_ + size_; }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  const T* begin() const { return data_; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T* begin() const { return data_; }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  const T* end() const { return data_ + size_; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T* end() const { return data_ + size_; }
 
  private:
   size_t reserve_;
diff --git a/Eigen/src/Core/util/Memory.h b/Eigen/src/Core/util/Memory.h
index c87a5c3..31f1057 100644
--- a/Eigen/src/Core/util/Memory.h
+++ b/Eigen/src/Core/util/Memory.h
@@ -12,7 +12,6 @@
 // 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/.
 
-
 /*****************************************************************************
 *** Platform checks for aligned malloc functions                           ***
 *****************************************************************************/
@@ -31,11 +30,11 @@
 //   http://gcc.fyxm.net/summit/2003/Porting%20to%2064%20bit.pdf
 // page 114, "[The] LP64 model [...] is used by all 64-bit UNIX ports" so it's indeed
 // quite safe, at least within the context of glibc, to equate 64-bit with LP64.
-#if defined(__GLIBC__) && ((__GLIBC__>=2 && __GLIBC_MINOR__ >= 8) || __GLIBC__>2) \
- && defined(__LP64__) && ! defined( __SANITIZE_ADDRESS__ ) && (EIGEN_DEFAULT_ALIGN_BYTES == 16)
-  #define EIGEN_GLIBC_MALLOC_ALREADY_ALIGNED 1
+#if defined(__GLIBC__) && ((__GLIBC__ >= 2 && __GLIBC_MINOR__ >= 8) || __GLIBC__ > 2) && defined(__LP64__) && \
+    !defined(__SANITIZE_ADDRESS__) && (EIGEN_DEFAULT_ALIGN_BYTES == 16)
+#define EIGEN_GLIBC_MALLOC_ALREADY_ALIGNED 1
 #else
-  #define EIGEN_GLIBC_MALLOC_ALREADY_ALIGNED 0
+#define EIGEN_GLIBC_MALLOC_ALREADY_ALIGNED 0
 #endif
 
 // FreeBSD 6 seems to have 16-byte aligned malloc
@@ -43,18 +42,16 @@
 // FreeBSD 7 seems to have 16-byte aligned malloc except on ARM and MIPS architectures
 //   See http://svn.freebsd.org/viewvc/base/stable/7/lib/libc/stdlib/malloc.c?view=markup
 #if defined(__FreeBSD__) && !(EIGEN_ARCH_ARM || EIGEN_ARCH_MIPS) && (EIGEN_DEFAULT_ALIGN_BYTES == 16)
-  #define EIGEN_FREEBSD_MALLOC_ALREADY_ALIGNED 1
+#define EIGEN_FREEBSD_MALLOC_ALREADY_ALIGNED 1
 #else
-  #define EIGEN_FREEBSD_MALLOC_ALREADY_ALIGNED 0
+#define EIGEN_FREEBSD_MALLOC_ALREADY_ALIGNED 0
 #endif
 
-#if (EIGEN_OS_MAC && (EIGEN_DEFAULT_ALIGN_BYTES == 16))     \
- || (EIGEN_OS_WIN64 && (EIGEN_DEFAULT_ALIGN_BYTES == 16))   \
- || EIGEN_GLIBC_MALLOC_ALREADY_ALIGNED              \
- || EIGEN_FREEBSD_MALLOC_ALREADY_ALIGNED
-  #define EIGEN_MALLOC_ALREADY_ALIGNED 1
+#if (EIGEN_OS_MAC && (EIGEN_DEFAULT_ALIGN_BYTES == 16)) || (EIGEN_OS_WIN64 && (EIGEN_DEFAULT_ALIGN_BYTES == 16)) || \
+    EIGEN_GLIBC_MALLOC_ALREADY_ALIGNED || EIGEN_FREEBSD_MALLOC_ALREADY_ALIGNED
+#define EIGEN_MALLOC_ALREADY_ALIGNED 1
 #else
-  #define EIGEN_MALLOC_ALREADY_ALIGNED 0
+#define EIGEN_MALLOC_ALREADY_ALIGNED 0
 #endif
 
 #endif
@@ -66,15 +63,16 @@
 // set_is_malloc_allowed() function.
 #ifndef EIGEN_AVOID_THREAD_LOCAL
 
-#if ((EIGEN_COMP_GNUC) || __has_feature(cxx_thread_local) || EIGEN_COMP_MSVC >= 1900) && !defined(EIGEN_GPU_COMPILE_PHASE)
+#if ((EIGEN_COMP_GNUC) || __has_feature(cxx_thread_local) || EIGEN_COMP_MSVC >= 1900) && \
+    !defined(EIGEN_GPU_COMPILE_PHASE)
 #define EIGEN_MALLOC_CHECK_THREAD_LOCAL thread_local
 #else
 #define EIGEN_MALLOC_CHECK_THREAD_LOCAL
 #endif
 
-#else // EIGEN_AVOID_THREAD_LOCAL
+#else  // EIGEN_AVOID_THREAD_LOCAL
 #define EIGEN_MALLOC_CHECK_THREAD_LOCAL
-#endif // EIGEN_AVOID_THREAD_LOCAL
+#endif  // EIGEN_AVOID_THREAD_LOCAL
 
 #endif
 
@@ -90,53 +88,46 @@
 *****************************************************************************/
 
 #ifdef EIGEN_NO_MALLOC
-EIGEN_DEVICE_FUNC inline void check_that_malloc_is_allowed()
-{
+EIGEN_DEVICE_FUNC inline void check_that_malloc_is_allowed() {
   eigen_assert(false && "heap allocation is forbidden (EIGEN_NO_MALLOC is defined)");
 }
 #elif defined EIGEN_RUNTIME_NO_MALLOC
-EIGEN_DEVICE_FUNC inline bool is_malloc_allowed_impl(bool update, bool new_value = false)
-{
+EIGEN_DEVICE_FUNC inline bool is_malloc_allowed_impl(bool update, bool new_value = false) {
   EIGEN_MALLOC_CHECK_THREAD_LOCAL static bool value = true;
-  if (update == 1)
-    value = new_value;
+  if (update == 1) value = new_value;
   return value;
 }
 EIGEN_DEVICE_FUNC inline bool is_malloc_allowed() { return is_malloc_allowed_impl(false); }
 EIGEN_DEVICE_FUNC inline bool set_is_malloc_allowed(bool new_value) { return is_malloc_allowed_impl(true, new_value); }
-EIGEN_DEVICE_FUNC inline void check_that_malloc_is_allowed()
-{
-  eigen_assert(is_malloc_allowed() && "heap allocation is forbidden (EIGEN_RUNTIME_NO_MALLOC is defined and g_is_malloc_allowed is false)");
+EIGEN_DEVICE_FUNC inline void check_that_malloc_is_allowed() {
+  eigen_assert(is_malloc_allowed() &&
+               "heap allocation is forbidden (EIGEN_RUNTIME_NO_MALLOC is defined and g_is_malloc_allowed is false)");
 }
 #else
-EIGEN_DEVICE_FUNC inline void check_that_malloc_is_allowed()
-{}
+EIGEN_DEVICE_FUNC inline void check_that_malloc_is_allowed() {}
 #endif
 
-
-EIGEN_DEVICE_FUNC
-inline void throw_std_bad_alloc()
-{
-  #ifdef EIGEN_EXCEPTIONS
-    throw std::bad_alloc();
-  #else
-    std::size_t huge = static_cast<std::size_t>(-1);
-    #if defined(EIGEN_HIPCC)
-    //
-    // calls to "::operator new" are to be treated as opaque function calls (i.e no inlining),
-    // and as a consequence the code in the #else block triggers the hipcc warning :
-    // "no overloaded function has restriction specifiers that are compatible with the ambient context"
-    //
-    // "throw_std_bad_alloc" has the EIGEN_DEVICE_FUNC attribute, so it seems that hipcc expects
-    // the same on "operator new"
-    // Reverting code back to the old version in this #if block for the hipcc compiler
-    //
-    new int[huge];
-    #else
-    void* unused = ::operator new(huge);
-    EIGEN_UNUSED_VARIABLE(unused);
-    #endif
-  #endif
+EIGEN_DEVICE_FUNC inline void throw_std_bad_alloc() {
+#ifdef EIGEN_EXCEPTIONS
+  throw std::bad_alloc();
+#else
+  std::size_t huge = static_cast<std::size_t>(-1);
+#if defined(EIGEN_HIPCC)
+  //
+  // calls to "::operator new" are to be treated as opaque function calls (i.e no inlining),
+  // and as a consequence the code in the #else block triggers the hipcc warning :
+  // "no overloaded function has restriction specifiers that are compatible with the ambient context"
+  //
+  // "throw_std_bad_alloc" has the EIGEN_DEVICE_FUNC attribute, so it seems that hipcc expects
+  // the same on "operator new"
+  // Reverting code back to the old version in this #if block for the hipcc compiler
+  //
+  new int[huge];
+#else
+  void* unused = ::operator new(huge);
+  EIGEN_UNUSED_VARIABLE(unused);
+#endif
+#endif
 }
 
 /*****************************************************************************
@@ -146,11 +137,12 @@
 /* ----- Hand made implementations of aligned malloc/free and realloc ----- */
 
 /** \internal Like malloc, but the returned pointer is guaranteed to be aligned to `alignment`.
-  * Fast, but wastes `alignment` additional bytes of memory. Does not throw any exception.
-  */
-EIGEN_DEVICE_FUNC inline void* handmade_aligned_malloc(std::size_t size, std::size_t alignment = EIGEN_DEFAULT_ALIGN_BYTES)
-{
-  eigen_assert(alignment >= sizeof(void*) && alignment <= 128 && (alignment & (alignment-1)) == 0 && "Alignment must be at least sizeof(void*), less than or equal to 128, and a power of 2");
+ * Fast, but wastes `alignment` additional bytes of memory. Does not throw any exception.
+ */
+EIGEN_DEVICE_FUNC inline void* handmade_aligned_malloc(std::size_t size,
+                                                       std::size_t alignment = EIGEN_DEFAULT_ALIGN_BYTES) {
+  eigen_assert(alignment >= sizeof(void*) && alignment <= 128 && (alignment & (alignment - 1)) == 0 &&
+               "Alignment must be at least sizeof(void*), less than or equal to 128, and a power of 2");
 
   check_that_malloc_is_allowed();
   EIGEN_USING_STD(malloc)
@@ -163,8 +155,7 @@
 }
 
 /** \internal Frees memory allocated with handmade_aligned_malloc */
-EIGEN_DEVICE_FUNC inline void handmade_aligned_free(void *ptr)
-{
+EIGEN_DEVICE_FUNC inline void handmade_aligned_free(void* ptr) {
   if (ptr) {
     uint8_t offset = static_cast<uint8_t>(*(static_cast<uint8_t*>(ptr) - 1));
     void* original = static_cast<void*>(static_cast<uint8_t*>(ptr) - offset);
@@ -176,12 +167,12 @@
 }
 
 /** \internal
-  * \brief Reallocates aligned memory.
-  * Since we know that our handmade version is based on std::malloc
-  * we can use std::realloc to implement efficient reallocation.
-  */
-EIGEN_DEVICE_FUNC inline void* handmade_aligned_realloc(void* ptr, std::size_t new_size, std::size_t old_size, std::size_t alignment = EIGEN_DEFAULT_ALIGN_BYTES)
-{
+ * \brief Reallocates aligned memory.
+ * Since we know that our handmade version is based on std::malloc
+ * we can use std::realloc to implement efficient reallocation.
+ */
+EIGEN_DEVICE_FUNC inline void* handmade_aligned_realloc(void* ptr, std::size_t new_size, std::size_t old_size,
+                                                        std::size_t alignment = EIGEN_DEFAULT_ALIGN_BYTES) {
   if (ptr == nullptr) return handmade_aligned_malloc(new_size, alignment);
   uint8_t old_offset = *(static_cast<uint8_t*>(ptr) - 1);
   void* old_original = static_cast<uint8_t*>(ptr) - old_offset;
@@ -202,72 +193,71 @@
   return aligned;
 }
 
-/** \internal Allocates \a size bytes. The returned pointer is guaranteed to have 16 or 32 bytes alignment depending on the requirements.
-  * On allocation error, the returned pointer is null, and std::bad_alloc is thrown.
-  */
-EIGEN_DEVICE_FUNC inline void* aligned_malloc(std::size_t size)
-{
+/** \internal Allocates \a size bytes. The returned pointer is guaranteed to have 16 or 32 bytes alignment depending on
+ * the requirements. On allocation error, the returned pointer is null, and std::bad_alloc is thrown.
+ */
+EIGEN_DEVICE_FUNC inline void* aligned_malloc(std::size_t size) {
   if (size == 0) return nullptr;
-  
-  void *result;
-  #if (EIGEN_DEFAULT_ALIGN_BYTES==0) || EIGEN_MALLOC_ALREADY_ALIGNED
 
-    check_that_malloc_is_allowed();
-    EIGEN_USING_STD(malloc)
-    result = malloc(size);
+  void* result;
+#if (EIGEN_DEFAULT_ALIGN_BYTES == 0) || EIGEN_MALLOC_ALREADY_ALIGNED
 
-    #if EIGEN_DEFAULT_ALIGN_BYTES==16
-    eigen_assert((size<16 || (std::size_t(result)%16)==0) && "System's malloc returned an unaligned pointer. Compile with EIGEN_MALLOC_ALREADY_ALIGNED=0 to fallback to handmade aligned memory allocator.");
-    #endif
-  #else
-    result = handmade_aligned_malloc(size);
-  #endif
+  check_that_malloc_is_allowed();
+  EIGEN_USING_STD(malloc)
+  result = malloc(size);
 
-  if(!result && size)
-    throw_std_bad_alloc();
+#if EIGEN_DEFAULT_ALIGN_BYTES == 16
+  eigen_assert((size < 16 || (std::size_t(result) % 16) == 0) &&
+               "System's malloc returned an unaligned pointer. Compile with EIGEN_MALLOC_ALREADY_ALIGNED=0 to fallback "
+               "to handmade aligned memory allocator.");
+#endif
+#else
+  result = handmade_aligned_malloc(size);
+#endif
+
+  if (!result && size) throw_std_bad_alloc();
 
   return result;
 }
 
 /** \internal Frees memory allocated with aligned_malloc. */
-EIGEN_DEVICE_FUNC inline void aligned_free(void *ptr)
-{
-  #if (EIGEN_DEFAULT_ALIGN_BYTES==0) || EIGEN_MALLOC_ALREADY_ALIGNED
+EIGEN_DEVICE_FUNC inline void aligned_free(void* ptr) {
+#if (EIGEN_DEFAULT_ALIGN_BYTES == 0) || EIGEN_MALLOC_ALREADY_ALIGNED
 
-    if(ptr)
-      check_that_malloc_is_allowed();
-    EIGEN_USING_STD(free)
-    free(ptr);
+  if (ptr) check_that_malloc_is_allowed();
+  EIGEN_USING_STD(free)
+  free(ptr);
 
-  #else
-    handmade_aligned_free(ptr);
-  #endif
+#else
+  handmade_aligned_free(ptr);
+#endif
 }
 
 /**
-  * \internal
-  * \brief Reallocates an aligned block of memory.
-  * \throws std::bad_alloc on allocation failure
-  */
-EIGEN_DEVICE_FUNC inline void* aligned_realloc(void *ptr, std::size_t new_size, std::size_t old_size)
-{
+ * \internal
+ * \brief Reallocates an aligned block of memory.
+ * \throws std::bad_alloc on allocation failure
+ */
+EIGEN_DEVICE_FUNC inline void* aligned_realloc(void* ptr, std::size_t new_size, std::size_t old_size) {
   if (ptr == nullptr) return aligned_malloc(new_size);
   if (old_size == new_size) return ptr;
-  if (new_size == 0) { aligned_free(ptr); return nullptr; }
+  if (new_size == 0) {
+    aligned_free(ptr);
+    return nullptr;
+  }
 
-  void *result;
-#if (EIGEN_DEFAULT_ALIGN_BYTES==0) || EIGEN_MALLOC_ALREADY_ALIGNED
+  void* result;
+#if (EIGEN_DEFAULT_ALIGN_BYTES == 0) || EIGEN_MALLOC_ALREADY_ALIGNED
   EIGEN_UNUSED_VARIABLE(old_size)
 
   check_that_malloc_is_allowed();
   EIGEN_USING_STD(realloc)
-  result = realloc(ptr,new_size);
+  result = realloc(ptr, new_size);
 #else
-  result = handmade_aligned_realloc(ptr,new_size,old_size);
+  result = handmade_aligned_realloc(ptr, new_size, old_size);
 #endif
 
-  if (!result && new_size)
-    throw_std_bad_alloc();
+  if (!result && new_size) throw_std_bad_alloc();
 
   return result;
 }
@@ -277,50 +267,52 @@
 *****************************************************************************/
 
 /** \internal Allocates \a size bytes. If Align is true, then the returned ptr is 16-byte-aligned.
-  * On allocation error, the returned pointer is null, and a std::bad_alloc is thrown.
-  */
-template<bool Align> EIGEN_DEVICE_FUNC inline void* conditional_aligned_malloc(std::size_t size)
-{
+ * On allocation error, the returned pointer is null, and a std::bad_alloc is thrown.
+ */
+template <bool Align>
+EIGEN_DEVICE_FUNC inline void* conditional_aligned_malloc(std::size_t size) {
   return aligned_malloc(size);
 }
 
-template<> EIGEN_DEVICE_FUNC inline void* conditional_aligned_malloc<false>(std::size_t size)
-{
+template <>
+EIGEN_DEVICE_FUNC inline void* conditional_aligned_malloc<false>(std::size_t size) {
   if (size == 0) return nullptr;
 
   check_that_malloc_is_allowed();
   EIGEN_USING_STD(malloc)
-  void *result = malloc(size);
+  void* result = malloc(size);
 
-  if(!result && size)
-    throw_std_bad_alloc();
+  if (!result && size) throw_std_bad_alloc();
   return result;
 }
 
 /** \internal Frees memory allocated with conditional_aligned_malloc */
-template<bool Align> EIGEN_DEVICE_FUNC inline void conditional_aligned_free(void *ptr)
-{
+template <bool Align>
+EIGEN_DEVICE_FUNC inline void conditional_aligned_free(void* ptr) {
   aligned_free(ptr);
 }
 
-template<> EIGEN_DEVICE_FUNC inline void conditional_aligned_free<false>(void *ptr)
-{
-  if(ptr)
-    check_that_malloc_is_allowed();
+template <>
+EIGEN_DEVICE_FUNC inline void conditional_aligned_free<false>(void* ptr) {
+  if (ptr) check_that_malloc_is_allowed();
   EIGEN_USING_STD(free)
   free(ptr);
 }
 
-template<bool Align> EIGEN_DEVICE_FUNC inline void* conditional_aligned_realloc(void* ptr, std::size_t new_size, std::size_t old_size)
-{
+template <bool Align>
+EIGEN_DEVICE_FUNC inline void* conditional_aligned_realloc(void* ptr, std::size_t new_size, std::size_t old_size) {
   return aligned_realloc(ptr, new_size, old_size);
 }
 
-template<> EIGEN_DEVICE_FUNC inline void* conditional_aligned_realloc<false>(void* ptr, std::size_t new_size, std::size_t old_size)
-{
+template <>
+EIGEN_DEVICE_FUNC inline void* conditional_aligned_realloc<false>(void* ptr, std::size_t new_size,
+                                                                  std::size_t old_size) {
   if (ptr == nullptr) return conditional_aligned_malloc<false>(new_size);
   if (old_size == new_size) return ptr;
-  if (new_size == 0) { conditional_aligned_free<false>(ptr); return nullptr; }
+  if (new_size == 0) {
+    conditional_aligned_free<false>(ptr);
+    return nullptr;
+  }
 
   check_that_malloc_is_allowed();
   EIGEN_USING_STD(realloc)
@@ -332,27 +324,25 @@
 *****************************************************************************/
 
 /** \internal Destructs the elements of an array.
-  * The \a size parameters tells on how many objects to call the destructor of T.
-  */
-template<typename T> EIGEN_DEVICE_FUNC inline void destruct_elements_of_array(T *ptr, std::size_t size)
-{
+ * The \a size parameters tells on how many objects to call the destructor of T.
+ */
+template <typename T>
+EIGEN_DEVICE_FUNC inline void destruct_elements_of_array(T* ptr, std::size_t size) {
   // always destruct an array starting from the end.
-  if(ptr)
-    while(size) ptr[--size].~T();
+  if (ptr)
+    while (size) ptr[--size].~T();
 }
 
 /** \internal Constructs the elements of an array.
-  * The \a size parameter tells on how many objects to call the constructor of T.
-  */
-template<typename T> EIGEN_DEVICE_FUNC inline T* default_construct_elements_of_array(T *ptr, std::size_t size)
-{
-  std::size_t i=0;
-  EIGEN_TRY
-  {
-      for (i = 0; i < size; ++i) ::new (ptr + i) T;
+ * The \a size parameter tells on how many objects to call the constructor of T.
+ */
+template <typename T>
+EIGEN_DEVICE_FUNC inline T* default_construct_elements_of_array(T* ptr, std::size_t size) {
+  std::size_t i = 0;
+  EIGEN_TRY {
+    for (i = 0; i < size; ++i) ::new (ptr + i) T;
   }
-  EIGEN_CATCH(...)
-  {
+  EIGEN_CATCH(...) {
     destruct_elements_of_array(ptr, i);
     EIGEN_THROW;
   }
@@ -360,17 +350,15 @@
 }
 
 /** \internal Copy-constructs the elements of an array.
-  * The \a size parameter tells on how many objects to copy.
-  */
-template<typename T> EIGEN_DEVICE_FUNC inline T* copy_construct_elements_of_array(T *ptr, const T* src, std::size_t size)
-{
-  std::size_t i=0;
-  EIGEN_TRY
-  {
-      for (i = 0; i < size; ++i) ::new (ptr + i) T(*(src + i));
+ * The \a size parameter tells on how many objects to copy.
+ */
+template <typename T>
+EIGEN_DEVICE_FUNC inline T* copy_construct_elements_of_array(T* ptr, const T* src, std::size_t size) {
+  std::size_t i = 0;
+  EIGEN_TRY {
+    for (i = 0; i < size; ++i) ::new (ptr + i) T(*(src + i));
   }
-  EIGEN_CATCH(...)
-  {
+  EIGEN_CATCH(...) {
     destruct_elements_of_array(ptr, i);
     EIGEN_THROW;
   }
@@ -378,17 +366,15 @@
 }
 
 /** \internal Move-constructs the elements of an array.
-  * The \a size parameter tells on how many objects to move.
-  */
-template<typename T> EIGEN_DEVICE_FUNC inline T* move_construct_elements_of_array(T *ptr, T* src, std::size_t size)
-{
-  std::size_t i=0;
-  EIGEN_TRY
-  {
-      for (i = 0; i < size; ++i) ::new (ptr + i) T(std::move(*(src + i)));
+ * The \a size parameter tells on how many objects to move.
+ */
+template <typename T>
+EIGEN_DEVICE_FUNC inline T* move_construct_elements_of_array(T* ptr, T* src, std::size_t size) {
+  std::size_t i = 0;
+  EIGEN_TRY {
+    for (i = 0; i < size; ++i) ::new (ptr + i) T(std::move(*(src + i)));
   }
-  EIGEN_CATCH(...)
-  {
+  EIGEN_CATCH(...) {
     destruct_elements_of_array(ptr, i);
     EIGEN_THROW;
   }
@@ -399,43 +385,33 @@
 *** Implementation of aligned new/delete-like functions                    ***
 *****************************************************************************/
 
-template<typename T>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void check_size_for_overflow(std::size_t size)
-{
-  if(size > std::size_t(-1) / sizeof(T))
-    throw_std_bad_alloc();
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void check_size_for_overflow(std::size_t size) {
+  if (size > std::size_t(-1) / sizeof(T)) throw_std_bad_alloc();
 }
 
 /** \internal Allocates \a size objects of type T. The returned pointer is guaranteed to have 16 bytes alignment.
-  * On allocation error, the returned pointer is undefined, but a std::bad_alloc is thrown.
-  * The default constructor of T is called.
-  */
-template<typename T> EIGEN_DEVICE_FUNC inline T* aligned_new(std::size_t size)
-{
+ * On allocation error, the returned pointer is undefined, but a std::bad_alloc is thrown.
+ * The default constructor of T is called.
+ */
+template <typename T>
+EIGEN_DEVICE_FUNC inline T* aligned_new(std::size_t size) {
   check_size_for_overflow<T>(size);
-  T *result = static_cast<T*>(aligned_malloc(sizeof(T)*size));
-  EIGEN_TRY
-  {
-    return default_construct_elements_of_array(result, size);
-  }
-  EIGEN_CATCH(...)
-  {
+  T* result = static_cast<T*>(aligned_malloc(sizeof(T) * size));
+  EIGEN_TRY { return default_construct_elements_of_array(result, size); }
+  EIGEN_CATCH(...) {
     aligned_free(result);
     EIGEN_THROW;
   }
   return result;
 }
 
-template<typename T, bool Align> EIGEN_DEVICE_FUNC inline T* conditional_aligned_new(std::size_t size)
-{
+template <typename T, bool Align>
+EIGEN_DEVICE_FUNC inline T* conditional_aligned_new(std::size_t size) {
   check_size_for_overflow<T>(size);
-  T *result = static_cast<T*>(conditional_aligned_malloc<Align>(sizeof(T)*size));
-  EIGEN_TRY
-  {
-    return default_construct_elements_of_array(result, size);
-  }
-  EIGEN_CATCH(...)
-  {
+  T* result = static_cast<T*>(conditional_aligned_malloc<Align>(sizeof(T) * size));
+  EIGEN_TRY { return default_construct_elements_of_array(result, size); }
+  EIGEN_CATCH(...) {
     conditional_aligned_free<Align>(result);
     EIGEN_THROW;
   }
@@ -443,49 +419,47 @@
 }
 
 /** \internal Deletes objects constructed with aligned_new
-  * The \a size parameters tells on how many objects to call the destructor of T.
-  */
-template<typename T> EIGEN_DEVICE_FUNC inline void aligned_delete(T *ptr, std::size_t size)
-{
+ * The \a size parameters tells on how many objects to call the destructor of T.
+ */
+template <typename T>
+EIGEN_DEVICE_FUNC inline void aligned_delete(T* ptr, std::size_t size) {
   destruct_elements_of_array<T>(ptr, size);
   aligned_free(ptr);
 }
 
 /** \internal Deletes objects constructed with conditional_aligned_new
-  * The \a size parameters tells on how many objects to call the destructor of T.
-  */
-template<typename T, bool Align> EIGEN_DEVICE_FUNC inline void conditional_aligned_delete(T *ptr, std::size_t size)
-{
+ * The \a size parameters tells on how many objects to call the destructor of T.
+ */
+template <typename T, bool Align>
+EIGEN_DEVICE_FUNC inline void conditional_aligned_delete(T* ptr, std::size_t size) {
   destruct_elements_of_array<T>(ptr, size);
   conditional_aligned_free<Align>(ptr);
 }
 
-template<typename T, bool Align> EIGEN_DEVICE_FUNC inline T* conditional_aligned_realloc_new(T* pts, std::size_t new_size, std::size_t old_size)
-{
+template <typename T, bool Align>
+EIGEN_DEVICE_FUNC inline T* conditional_aligned_realloc_new(T* pts, std::size_t new_size, std::size_t old_size) {
   check_size_for_overflow<T>(new_size);
   check_size_for_overflow<T>(old_size);
-  
+
   // If elements need to be explicitly initialized, we cannot simply realloc
   // (or memcpy) the memory block - each element needs to be reconstructed.
   // Otherwise, objects that contain internal pointers like mpfr or
   // AnnoyingScalar can be pointing to the wrong thing.
-  T* result = static_cast<T*>(conditional_aligned_malloc<Align>(sizeof(T)*new_size));
-  EIGEN_TRY
-  {
+  T* result = static_cast<T*>(conditional_aligned_malloc<Align>(sizeof(T) * new_size));
+  EIGEN_TRY {
     // Move-construct initial elements.
     std::size_t copy_size = (std::min)(old_size, new_size);
     move_construct_elements_of_array(result, pts, copy_size);
-    
+
     // Default-construct remaining elements.
     if (new_size > old_size) {
       default_construct_elements_of_array(result + copy_size, new_size - old_size);
     }
-    
+
     // Delete old elements.
-    conditional_aligned_delete<T, Align>(pts, old_size);      
+    conditional_aligned_delete<T, Align>(pts, old_size);
   }
-  EIGEN_CATCH(...)
-  {
+  EIGEN_CATCH(...) {
     conditional_aligned_free<Align>(result);
     EIGEN_THROW;
   }
@@ -493,21 +467,14 @@
   return result;
 }
 
-
-template<typename T, bool Align> EIGEN_DEVICE_FUNC inline T* conditional_aligned_new_auto(std::size_t size)
-{
-  if(size==0)
-    return 0; // short-cut. Also fixes Bug 884
+template <typename T, bool Align>
+EIGEN_DEVICE_FUNC inline T* conditional_aligned_new_auto(std::size_t size) {
+  if (size == 0) return 0;  // short-cut. Also fixes Bug 884
   check_size_for_overflow<T>(size);
-  T *result = static_cast<T*>(conditional_aligned_malloc<Align>(sizeof(T)*size));
-  if(NumTraits<T>::RequireInitialization)
-  {
-    EIGEN_TRY
-    {
-      default_construct_elements_of_array(result, size);
-    }
-    EIGEN_CATCH(...)
-    {
+  T* result = static_cast<T*>(conditional_aligned_malloc<Align>(sizeof(T) * size));
+  if (NumTraits<T>::RequireInitialization) {
+    EIGEN_TRY { default_construct_elements_of_array(result, size); }
+    EIGEN_CATCH(...) {
       conditional_aligned_free<Align>(result);
       EIGEN_THROW;
     }
@@ -515,146 +482,138 @@
   return result;
 }
 
-template<typename T, bool Align> EIGEN_DEVICE_FUNC inline T* conditional_aligned_realloc_new_auto(T* pts, std::size_t new_size, std::size_t old_size)
-{
+template <typename T, bool Align>
+EIGEN_DEVICE_FUNC inline T* conditional_aligned_realloc_new_auto(T* pts, std::size_t new_size, std::size_t old_size) {
   if (NumTraits<T>::RequireInitialization) {
     return conditional_aligned_realloc_new<T, Align>(pts, new_size, old_size);
   }
-  
+
   check_size_for_overflow<T>(new_size);
   check_size_for_overflow<T>(old_size);
-  return static_cast<T*>(conditional_aligned_realloc<Align>(static_cast<void*>(pts), sizeof(T)*new_size, sizeof(T)*old_size));
+  return static_cast<T*>(
+      conditional_aligned_realloc<Align>(static_cast<void*>(pts), sizeof(T) * new_size, sizeof(T) * old_size));
 }
 
-template<typename T, bool Align> EIGEN_DEVICE_FUNC inline void conditional_aligned_delete_auto(T *ptr, std::size_t size)
-{
-  if(NumTraits<T>::RequireInitialization)
-    destruct_elements_of_array<T>(ptr, size);
+template <typename T, bool Align>
+EIGEN_DEVICE_FUNC inline void conditional_aligned_delete_auto(T* ptr, std::size_t size) {
+  if (NumTraits<T>::RequireInitialization) destruct_elements_of_array<T>(ptr, size);
   conditional_aligned_free<Align>(ptr);
 }
 
 /****************************************************************************/
 
-/** \internal Returns the index of the first element of the array that is well aligned with respect to the requested \a Alignment.
-  *
-  * \tparam Alignment requested alignment in Bytes.
-  * \param array the address of the start of the array
-  * \param size the size of the array
-  *
-  * \note If no element of the array is well aligned or the requested alignment is not a multiple of a scalar,
-  * the size of the array is returned. For example with SSE, the requested alignment is typically 16-bytes. If
-  * packet size for the given scalar type is 1, then everything is considered well-aligned.
-  *
-  * \note Otherwise, if the Alignment is larger that the scalar size, we rely on the assumptions that sizeof(Scalar) is a
-  * power of 2. On the other hand, we do not assume that the array address is a multiple of sizeof(Scalar), as that fails for
-  * example with Scalar=double on certain 32-bit platforms, see bug #79.
-  *
-  * There is also the variant first_aligned(const MatrixBase&) defined in DenseCoeffsBase.h.
-  * \sa first_default_aligned()
-  */
-template<int Alignment, typename Scalar, typename Index>
-EIGEN_DEVICE_FUNC inline Index first_aligned(const Scalar* array, Index size)
-{
+/** \internal Returns the index of the first element of the array that is well aligned with respect to the requested \a
+ * Alignment.
+ *
+ * \tparam Alignment requested alignment in Bytes.
+ * \param array the address of the start of the array
+ * \param size the size of the array
+ *
+ * \note If no element of the array is well aligned or the requested alignment is not a multiple of a scalar,
+ * the size of the array is returned. For example with SSE, the requested alignment is typically 16-bytes. If
+ * packet size for the given scalar type is 1, then everything is considered well-aligned.
+ *
+ * \note Otherwise, if the Alignment is larger that the scalar size, we rely on the assumptions that sizeof(Scalar) is a
+ * power of 2. On the other hand, we do not assume that the array address is a multiple of sizeof(Scalar), as that fails
+ * for example with Scalar=double on certain 32-bit platforms, see bug #79.
+ *
+ * There is also the variant first_aligned(const MatrixBase&) defined in DenseCoeffsBase.h.
+ * \sa first_default_aligned()
+ */
+template <int Alignment, typename Scalar, typename Index>
+EIGEN_DEVICE_FUNC inline Index first_aligned(const Scalar* array, Index size) {
   const Index ScalarSize = sizeof(Scalar);
   const Index AlignmentSize = Alignment / ScalarSize;
-  const Index AlignmentMask = AlignmentSize-1;
+  const Index AlignmentMask = AlignmentSize - 1;
 
-  if(AlignmentSize<=1)
-  {
+  if (AlignmentSize <= 1) {
     // Either the requested alignment if smaller than a scalar, or it exactly match a 1 scalar
     // so that all elements of the array have the same alignment.
     return 0;
-  }
-  else if( (std::uintptr_t(array) & (sizeof(Scalar)-1)) || (Alignment%ScalarSize)!=0)
-  {
-    // The array is not aligned to the size of a single scalar, or the requested alignment is not a multiple of the scalar size.
-    // Consequently, no element of the array is well aligned.
+  } else if ((std::uintptr_t(array) & (sizeof(Scalar) - 1)) || (Alignment % ScalarSize) != 0) {
+    // The array is not aligned to the size of a single scalar, or the requested alignment is not a multiple of the
+    // scalar size. Consequently, no element of the array is well aligned.
     return size;
-  }
-  else
-  {
-    Index first = (AlignmentSize - (Index((std::uintptr_t(array)/sizeof(Scalar))) & AlignmentMask)) & AlignmentMask;
+  } else {
+    Index first = (AlignmentSize - (Index((std::uintptr_t(array) / sizeof(Scalar))) & AlignmentMask)) & AlignmentMask;
     return (first < size) ? first : size;
   }
 }
 
-/** \internal Returns the index of the first element of the array that is well aligned with respect the largest packet requirement.
-   * \sa first_aligned(Scalar*,Index) and first_default_aligned(DenseBase<Derived>) */
-template<typename Scalar, typename Index>
-EIGEN_DEVICE_FUNC inline Index first_default_aligned(const Scalar* array, Index size)
-{
+/** \internal Returns the index of the first element of the array that is well aligned with respect the largest packet
+ * requirement. \sa first_aligned(Scalar*,Index) and first_default_aligned(DenseBase<Derived>) */
+template <typename Scalar, typename Index>
+EIGEN_DEVICE_FUNC inline Index first_default_aligned(const Scalar* array, Index size) {
   typedef typename packet_traits<Scalar>::type DefaultPacketType;
   return first_aligned<unpacket_traits<DefaultPacketType>::alignment>(array, size);
 }
 
 /** \internal Returns the smallest integer multiple of \a base and greater or equal to \a size
-  */
-template<typename Index>
-inline Index first_multiple(Index size, Index base)
-{
-  return ((size+base-1)/base)*base;
+ */
+template <typename Index>
+inline Index first_multiple(Index size, Index base) {
+  return ((size + base - 1) / base) * base;
 }
 
 // std::copy is much slower than memcpy, so let's introduce a smart_copy which
 // use memcpy on trivial types, i.e., on types that does not require an initialization ctor.
-template<typename T, bool UseMemcpy> struct smart_copy_helper;
+template <typename T, bool UseMemcpy>
+struct smart_copy_helper;
 
-template<typename T> EIGEN_DEVICE_FUNC void smart_copy(const T* start, const T* end, T* target)
-{
-  smart_copy_helper<T,!NumTraits<T>::RequireInitialization>::run(start, end, target);
+template <typename T>
+EIGEN_DEVICE_FUNC void smart_copy(const T* start, const T* end, T* target) {
+  smart_copy_helper<T, !NumTraits<T>::RequireInitialization>::run(start, end, target);
 }
 
-template<typename T> struct smart_copy_helper<T,true> {
-  EIGEN_DEVICE_FUNC static inline void run(const T* start, const T* end, T* target)
-  {
-    std::intptr_t size = std::intptr_t(end)-std::intptr_t(start);
-    if(size==0) return;
-    eigen_internal_assert(start!=0 && end!=0 && target!=0);
+template <typename T>
+struct smart_copy_helper<T, true> {
+  EIGEN_DEVICE_FUNC static inline void run(const T* start, const T* end, T* target) {
+    std::intptr_t size = std::intptr_t(end) - std::intptr_t(start);
+    if (size == 0) return;
+    eigen_internal_assert(start != 0 && end != 0 && target != 0);
     EIGEN_USING_STD(memcpy)
     memcpy(target, start, size);
   }
 };
 
-template<typename T> struct smart_copy_helper<T,false> {
-  EIGEN_DEVICE_FUNC static inline void run(const T* start, const T* end, T* target)
-  { std::copy(start, end, target); }
+template <typename T>
+struct smart_copy_helper<T, false> {
+  EIGEN_DEVICE_FUNC static inline void run(const T* start, const T* end, T* target) { std::copy(start, end, target); }
 };
 
 // intelligent memmove. falls back to std::memmove for POD types, uses std::copy otherwise.
-template<typename T, bool UseMemmove> struct smart_memmove_helper;
+template <typename T, bool UseMemmove>
+struct smart_memmove_helper;
 
-template<typename T> void smart_memmove(const T* start, const T* end, T* target)
-{
-  smart_memmove_helper<T,!NumTraits<T>::RequireInitialization>::run(start, end, target);
+template <typename T>
+void smart_memmove(const T* start, const T* end, T* target) {
+  smart_memmove_helper<T, !NumTraits<T>::RequireInitialization>::run(start, end, target);
 }
 
-template<typename T> struct smart_memmove_helper<T,true> {
-  static inline void run(const T* start, const T* end, T* target)
-  {
-    std::intptr_t size = std::intptr_t(end)-std::intptr_t(start);
-    if(size==0) return;
-    eigen_internal_assert(start!=0 && end!=0 && target!=0);
+template <typename T>
+struct smart_memmove_helper<T, true> {
+  static inline void run(const T* start, const T* end, T* target) {
+    std::intptr_t size = std::intptr_t(end) - std::intptr_t(start);
+    if (size == 0) return;
+    eigen_internal_assert(start != 0 && end != 0 && target != 0);
     std::memmove(target, start, size);
   }
 };
 
-template<typename T> struct smart_memmove_helper<T,false> {
-  static inline void run(const T* start, const T* end, T* target)
-  {
-    if (std::uintptr_t(target) < std::uintptr_t(start))
-    {
+template <typename T>
+struct smart_memmove_helper<T, false> {
+  static inline void run(const T* start, const T* end, T* target) {
+    if (std::uintptr_t(target) < std::uintptr_t(start)) {
       std::copy(start, end, target);
-    }
-    else
-    {
-      std::ptrdiff_t count = (std::ptrdiff_t(end)-std::ptrdiff_t(start)) / sizeof(T);
+    } else {
+      std::ptrdiff_t count = (std::ptrdiff_t(end) - std::ptrdiff_t(start)) / sizeof(T);
       std::copy_backward(start, end, target + count);
     }
   }
 };
 
-template<typename T> EIGEN_DEVICE_FUNC T* smart_move(T* start, T* end, T* target)
-{
+template <typename T>
+EIGEN_DEVICE_FUNC T* smart_move(T* start, T* end, T* target) {
   return std::move(start, end, target);
 }
 
@@ -664,12 +623,12 @@
 
 // you can overwrite Eigen's default behavior regarding alloca by defining EIGEN_ALLOCA
 // to the appropriate stack allocation function
-#if ! defined EIGEN_ALLOCA && ! defined EIGEN_GPU_COMPILE_PHASE
-  #if EIGEN_OS_LINUX || EIGEN_OS_MAC || (defined alloca)
-    #define EIGEN_ALLOCA alloca
-  #elif EIGEN_COMP_MSVC
-    #define EIGEN_ALLOCA _alloca
-  #endif
+#if !defined EIGEN_ALLOCA && !defined EIGEN_GPU_COMPILE_PHASE
+#if EIGEN_OS_LINUX || EIGEN_OS_MAC || (defined alloca)
+#define EIGEN_ALLOCA alloca
+#elif EIGEN_COMP_MSVC
+#define EIGEN_ALLOCA _alloca
+#endif
 #endif
 
 // With clang -Oz -mthumb, alloca changes the stack pointer in a way that is
@@ -678,184 +637,168 @@
 // TODO: Eliminate after https://bugs.llvm.org/show_bug.cgi?id=23772
 // is fixed.
 #if defined(__clang__) && defined(__thumb__)
-  #undef EIGEN_ALLOCA
+#undef EIGEN_ALLOCA
 #endif
 
 // This helper class construct the allocated memory, and takes care of destructing and freeing the handled data
 // at destruction time. In practice this helper class is mainly useful to avoid memory leak in case of exceptions.
-template<typename T> class aligned_stack_memory_handler : noncopyable
-{
-  public:
-    /* Creates a stack_memory_handler responsible for the buffer \a ptr of size \a size.
-     * Note that \a ptr can be 0 regardless of the other parameters.
-     * This constructor takes care of constructing/initializing the elements of the buffer if required by the scalar type T (see NumTraits<T>::RequireInitialization).
-     * In this case, the buffer elements will also be destructed when this handler will be destructed.
-     * Finally, if \a dealloc is true, then the pointer \a ptr is freed.
-     **/
-    EIGEN_DEVICE_FUNC
-    aligned_stack_memory_handler(T* ptr, std::size_t size, bool dealloc)
-      : m_ptr(ptr), m_size(size), m_deallocate(dealloc)
-    {
-      if(NumTraits<T>::RequireInitialization && m_ptr)
-        Eigen::internal::default_construct_elements_of_array(m_ptr, size);
-    }
-    EIGEN_DEVICE_FUNC
-    ~aligned_stack_memory_handler()
-    {
-      if(NumTraits<T>::RequireInitialization && m_ptr)
-        Eigen::internal::destruct_elements_of_array<T>(m_ptr, m_size);
-      if(m_deallocate)
-        Eigen::internal::aligned_free(m_ptr);
-    }
-  protected:
-    T* m_ptr;
-    std::size_t m_size;
-    bool m_deallocate;
+template <typename T>
+class aligned_stack_memory_handler : noncopyable {
+ public:
+  /* Creates a stack_memory_handler responsible for the buffer \a ptr of size \a size.
+   * Note that \a ptr can be 0 regardless of the other parameters.
+   * This constructor takes care of constructing/initializing the elements of the buffer if required by the scalar type
+   *T (see NumTraits<T>::RequireInitialization). In this case, the buffer elements will also be destructed when this
+   *handler will be destructed. Finally, if \a dealloc is true, then the pointer \a ptr is freed.
+   **/
+  EIGEN_DEVICE_FUNC aligned_stack_memory_handler(T* ptr, std::size_t size, bool dealloc)
+      : m_ptr(ptr), m_size(size), m_deallocate(dealloc) {
+    if (NumTraits<T>::RequireInitialization && m_ptr) Eigen::internal::default_construct_elements_of_array(m_ptr, size);
+  }
+  EIGEN_DEVICE_FUNC ~aligned_stack_memory_handler() {
+    if (NumTraits<T>::RequireInitialization && m_ptr) Eigen::internal::destruct_elements_of_array<T>(m_ptr, m_size);
+    if (m_deallocate) Eigen::internal::aligned_free(m_ptr);
+  }
+
+ protected:
+  T* m_ptr;
+  std::size_t m_size;
+  bool m_deallocate;
 };
 
 #ifdef EIGEN_ALLOCA
 
-template<typename Xpr, int NbEvaluations,
-         bool MapExternalBuffer = nested_eval<Xpr,NbEvaluations>::Evaluate && Xpr::MaxSizeAtCompileTime==Dynamic
-         >
-struct local_nested_eval_wrapper
-{
+template <typename Xpr, int NbEvaluations,
+          bool MapExternalBuffer = nested_eval<Xpr, NbEvaluations>::Evaluate && Xpr::MaxSizeAtCompileTime == Dynamic>
+struct local_nested_eval_wrapper {
   static constexpr bool NeedExternalBuffer = false;
   typedef typename Xpr::Scalar Scalar;
-  typedef typename nested_eval<Xpr,NbEvaluations>::type ObjectType;
+  typedef typename nested_eval<Xpr, NbEvaluations>::type ObjectType;
   ObjectType object;
 
-  EIGEN_DEVICE_FUNC
-  local_nested_eval_wrapper(const Xpr& xpr, Scalar* ptr) : object(xpr)
-  {
+  EIGEN_DEVICE_FUNC local_nested_eval_wrapper(const Xpr& xpr, Scalar* ptr) : object(xpr) {
     EIGEN_UNUSED_VARIABLE(ptr);
-    eigen_internal_assert(ptr==0);
+    eigen_internal_assert(ptr == 0);
   }
 };
 
-template<typename Xpr, int NbEvaluations>
-struct local_nested_eval_wrapper<Xpr,NbEvaluations,true>
-{
+template <typename Xpr, int NbEvaluations>
+struct local_nested_eval_wrapper<Xpr, NbEvaluations, true> {
   static constexpr bool NeedExternalBuffer = true;
   typedef typename Xpr::Scalar Scalar;
   typedef typename plain_object_eval<Xpr>::type PlainObject;
-  typedef Map<PlainObject,EIGEN_DEFAULT_ALIGN_BYTES> ObjectType;
+  typedef Map<PlainObject, EIGEN_DEFAULT_ALIGN_BYTES> ObjectType;
   ObjectType object;
 
-  EIGEN_DEVICE_FUNC
-  local_nested_eval_wrapper(const Xpr& xpr, Scalar* ptr)
-    : object(ptr==0 ? reinterpret_cast<Scalar*>(Eigen::internal::aligned_malloc(sizeof(Scalar)*xpr.size())) : ptr, xpr.rows(), xpr.cols()),
-      m_deallocate(ptr==0)
-  {
-    if(NumTraits<Scalar>::RequireInitialization && object.data())
+  EIGEN_DEVICE_FUNC local_nested_eval_wrapper(const Xpr& xpr, Scalar* ptr)
+      : object(ptr == 0 ? reinterpret_cast<Scalar*>(Eigen::internal::aligned_malloc(sizeof(Scalar) * xpr.size())) : ptr,
+               xpr.rows(), xpr.cols()),
+        m_deallocate(ptr == 0) {
+    if (NumTraits<Scalar>::RequireInitialization && object.data())
       Eigen::internal::default_construct_elements_of_array(object.data(), object.size());
     object = xpr;
   }
 
-  EIGEN_DEVICE_FUNC
-  ~local_nested_eval_wrapper()
-  {
-    if(NumTraits<Scalar>::RequireInitialization && object.data())
+  EIGEN_DEVICE_FUNC ~local_nested_eval_wrapper() {
+    if (NumTraits<Scalar>::RequireInitialization && object.data())
       Eigen::internal::destruct_elements_of_array(object.data(), object.size());
-    if(m_deallocate)
-      Eigen::internal::aligned_free(object.data());
+    if (m_deallocate) Eigen::internal::aligned_free(object.data());
   }
 
-private:
+ private:
   bool m_deallocate;
 };
 
-#endif // EIGEN_ALLOCA
+#endif  // EIGEN_ALLOCA
 
-template<typename T> class scoped_array : noncopyable
-{
+template <typename T>
+class scoped_array : noncopyable {
   T* m_ptr;
-public:
-  explicit scoped_array(std::ptrdiff_t size)
-  {
-    m_ptr = new T[size];
-  }
-  ~scoped_array()
-  {
-    delete[] m_ptr;
-  }
+
+ public:
+  explicit scoped_array(std::ptrdiff_t size) { m_ptr = new T[size]; }
+  ~scoped_array() { delete[] m_ptr; }
   T& operator[](std::ptrdiff_t i) { return m_ptr[i]; }
   const T& operator[](std::ptrdiff_t i) const { return m_ptr[i]; }
-  T* &ptr() { return m_ptr; }
+  T*& ptr() { return m_ptr; }
   const T* ptr() const { return m_ptr; }
   operator const T*() const { return m_ptr; }
 };
 
-template<typename T> void swap(scoped_array<T> &a,scoped_array<T> &b)
-{
-  std::swap(a.ptr(),b.ptr());
+template <typename T>
+void swap(scoped_array<T>& a, scoped_array<T>& b) {
+  std::swap(a.ptr(), b.ptr());
 }
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \internal
-  *
-  * The macro ei_declare_aligned_stack_constructed_variable(TYPE,NAME,SIZE,BUFFER) declares, allocates,
-  * and construct an aligned buffer named NAME of SIZE elements of type TYPE on the stack
-  * if the size in bytes is smaller than EIGEN_STACK_ALLOCATION_LIMIT, and if stack allocation is supported by the platform
-  * (currently, this is Linux, OSX and Visual Studio only). Otherwise the memory is allocated on the heap.
-  * The allocated buffer is automatically deleted when exiting the scope of this declaration.
-  * If BUFFER is non null, then the declared variable is simply an alias for BUFFER, and no allocation/deletion occurs.
-  * Here is an example:
-  * \code
-  * {
-  *   ei_declare_aligned_stack_constructed_variable(float,data,size,0);
-  *   // use data[0] to data[size-1]
-  * }
-  * \endcode
-  * The underlying stack allocation function can controlled with the EIGEN_ALLOCA preprocessor token.
-  *
-  * The macro ei_declare_local_nested_eval(XPR_T,XPR,N,NAME) is analogue to
-  * \code
-  *   typename internal::nested_eval<XPRT_T,N>::type NAME(XPR);
-  * \endcode
-  * with the advantage of using aligned stack allocation even if the maximal size of XPR at compile time is unknown.
-  * This is accomplished through alloca if this later is supported and if the required number of bytes
-  * is below EIGEN_STACK_ALLOCATION_LIMIT.
-  */
+ *
+ * The macro ei_declare_aligned_stack_constructed_variable(TYPE,NAME,SIZE,BUFFER) declares, allocates,
+ * and construct an aligned buffer named NAME of SIZE elements of type TYPE on the stack
+ * if the size in bytes is smaller than EIGEN_STACK_ALLOCATION_LIMIT, and if stack allocation is supported by the
+ * platform (currently, this is Linux, OSX and Visual Studio only). Otherwise the memory is allocated on the heap. The
+ * allocated buffer is automatically deleted when exiting the scope of this declaration. If BUFFER is non null, then the
+ * declared variable is simply an alias for BUFFER, and no allocation/deletion occurs. Here is an example: \code
+ * {
+ *   ei_declare_aligned_stack_constructed_variable(float,data,size,0);
+ *   // use data[0] to data[size-1]
+ * }
+ * \endcode
+ * The underlying stack allocation function can controlled with the EIGEN_ALLOCA preprocessor token.
+ *
+ * The macro ei_declare_local_nested_eval(XPR_T,XPR,N,NAME) is analogue to
+ * \code
+ *   typename internal::nested_eval<XPRT_T,N>::type NAME(XPR);
+ * \endcode
+ * with the advantage of using aligned stack allocation even if the maximal size of XPR at compile time is unknown.
+ * This is accomplished through alloca if this later is supported and if the required number of bytes
+ * is below EIGEN_STACK_ALLOCATION_LIMIT.
+ */
 #ifdef EIGEN_ALLOCA
 
-  #if EIGEN_DEFAULT_ALIGN_BYTES>0
-    // We always manually re-align the result of EIGEN_ALLOCA.
-    // If alloca is already aligned, the compiler should be smart enough to optimize away the re-alignment.
-    #define EIGEN_ALIGNED_ALLOCA(SIZE) reinterpret_cast<void*>((std::uintptr_t(EIGEN_ALLOCA(SIZE+EIGEN_DEFAULT_ALIGN_BYTES-1)) + EIGEN_DEFAULT_ALIGN_BYTES-1) & ~(std::size_t(EIGEN_DEFAULT_ALIGN_BYTES-1)))
-  #else
-    #define EIGEN_ALIGNED_ALLOCA(SIZE) EIGEN_ALLOCA(SIZE)
-  #endif
+#if EIGEN_DEFAULT_ALIGN_BYTES > 0
+   // We always manually re-align the result of EIGEN_ALLOCA.
+// If alloca is already aligned, the compiler should be smart enough to optimize away the re-alignment.
+#define EIGEN_ALIGNED_ALLOCA(SIZE)                                                                           \
+  reinterpret_cast<void*>(                                                                                   \
+      (std::uintptr_t(EIGEN_ALLOCA(SIZE + EIGEN_DEFAULT_ALIGN_BYTES - 1)) + EIGEN_DEFAULT_ALIGN_BYTES - 1) & \
+      ~(std::size_t(EIGEN_DEFAULT_ALIGN_BYTES - 1)))
+#else
+#define EIGEN_ALIGNED_ALLOCA(SIZE) EIGEN_ALLOCA(SIZE)
+#endif
 
-  #define ei_declare_aligned_stack_constructed_variable(TYPE,NAME,SIZE,BUFFER) \
-    Eigen::internal::check_size_for_overflow<TYPE>(SIZE); \
-    TYPE* NAME = (BUFFER)!=0 ? (BUFFER) \
-               : reinterpret_cast<TYPE*>( \
-                      (sizeof(TYPE)*SIZE<=EIGEN_STACK_ALLOCATION_LIMIT) ? EIGEN_ALIGNED_ALLOCA(sizeof(TYPE)*SIZE) \
-                    : Eigen::internal::aligned_malloc(sizeof(TYPE)*SIZE) );  \
-    Eigen::internal::aligned_stack_memory_handler<TYPE> EIGEN_CAT(NAME,_stack_memory_destructor)((BUFFER)==0 ? NAME : 0,SIZE,sizeof(TYPE)*SIZE>EIGEN_STACK_ALLOCATION_LIMIT)
+#define ei_declare_aligned_stack_constructed_variable(TYPE, NAME, SIZE, BUFFER)                                     \
+  Eigen::internal::check_size_for_overflow<TYPE>(SIZE);                                                             \
+  TYPE* NAME = (BUFFER) != 0 ? (BUFFER)                                                                             \
+                             : reinterpret_cast<TYPE*>((sizeof(TYPE) * SIZE <= EIGEN_STACK_ALLOCATION_LIMIT)        \
+                                                           ? EIGEN_ALIGNED_ALLOCA(sizeof(TYPE) * SIZE)              \
+                                                           : Eigen::internal::aligned_malloc(sizeof(TYPE) * SIZE)); \
+  Eigen::internal::aligned_stack_memory_handler<TYPE> EIGEN_CAT(NAME, _stack_memory_destructor)(                    \
+      (BUFFER) == 0 ? NAME : 0, SIZE, sizeof(TYPE) * SIZE > EIGEN_STACK_ALLOCATION_LIMIT)
 
-
-  #define ei_declare_local_nested_eval(XPR_T,XPR,N,NAME) \
-    Eigen::internal::local_nested_eval_wrapper<XPR_T,N> EIGEN_CAT(NAME,_wrapper)(XPR, reinterpret_cast<typename XPR_T::Scalar*>( \
-      ( (Eigen::internal::local_nested_eval_wrapper<XPR_T,N>::NeedExternalBuffer) && ((sizeof(typename XPR_T::Scalar)*XPR.size())<=EIGEN_STACK_ALLOCATION_LIMIT) ) \
-        ? EIGEN_ALIGNED_ALLOCA( sizeof(typename XPR_T::Scalar)*XPR.size() ) : 0 ) ) ; \
-    typename Eigen::internal::local_nested_eval_wrapper<XPR_T,N>::ObjectType NAME(EIGEN_CAT(NAME,_wrapper).object)
+#define ei_declare_local_nested_eval(XPR_T, XPR, N, NAME)                                        \
+  Eigen::internal::local_nested_eval_wrapper<XPR_T, N> EIGEN_CAT(NAME, _wrapper)(                \
+      XPR, reinterpret_cast<typename XPR_T::Scalar*>(                                            \
+               ((Eigen::internal::local_nested_eval_wrapper<XPR_T, N>::NeedExternalBuffer) &&    \
+                ((sizeof(typename XPR_T::Scalar) * XPR.size()) <= EIGEN_STACK_ALLOCATION_LIMIT)) \
+                   ? EIGEN_ALIGNED_ALLOCA(sizeof(typename XPR_T::Scalar) * XPR.size())           \
+                   : 0));                                                                        \
+  typename Eigen::internal::local_nested_eval_wrapper<XPR_T, N>::ObjectType NAME(EIGEN_CAT(NAME, _wrapper).object)
 
 #else
 
-  #define ei_declare_aligned_stack_constructed_variable(TYPE,NAME,SIZE,BUFFER) \
-    Eigen::internal::check_size_for_overflow<TYPE>(SIZE); \
-    TYPE* NAME = (BUFFER)!=0 ? BUFFER : reinterpret_cast<TYPE*>(Eigen::internal::aligned_malloc(sizeof(TYPE)*SIZE));    \
-    Eigen::internal::aligned_stack_memory_handler<TYPE> EIGEN_CAT(NAME,_stack_memory_destructor)((BUFFER)==0 ? NAME : 0,SIZE,true)
+#define ei_declare_aligned_stack_constructed_variable(TYPE, NAME, SIZE, BUFFER)                                        \
+  Eigen::internal::check_size_for_overflow<TYPE>(SIZE);                                                                \
+  TYPE* NAME = (BUFFER) != 0 ? BUFFER : reinterpret_cast<TYPE*>(Eigen::internal::aligned_malloc(sizeof(TYPE) * SIZE)); \
+  Eigen::internal::aligned_stack_memory_handler<TYPE> EIGEN_CAT(NAME, _stack_memory_destructor)(                       \
+      (BUFFER) == 0 ? NAME : 0, SIZE, true)
 
-
-#define ei_declare_local_nested_eval(XPR_T,XPR,N,NAME) typename Eigen::internal::nested_eval<XPR_T,N>::type NAME(XPR)
+#define ei_declare_local_nested_eval(XPR_T, XPR, N, NAME) \
+  typename Eigen::internal::nested_eval<XPR_T, N>::type NAME(XPR)
 
 #endif
 
-
 /*****************************************************************************
 *** Implementation of EIGEN_MAKE_ALIGNED_OPERATOR_NEW [_IF]                ***
 *****************************************************************************/
@@ -867,108 +810,106 @@
 #define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_NOTHROW(NeedsToAlign)
 #define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign)
 #define EIGEN_MAKE_ALIGNED_OPERATOR_NEW
-#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar,Size)
+#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar, Size)
 
 #else
 
 // HIP does not support new/delete on device.
-#if EIGEN_MAX_ALIGN_BYTES!=0 && !defined(EIGEN_HIP_DEVICE_COMPILE)
-  #define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_NOTHROW(NeedsToAlign) \
-      EIGEN_DEVICE_FUNC \
-      void* operator new(std::size_t size, const std::nothrow_t&) EIGEN_NO_THROW { \
-        EIGEN_TRY { return Eigen::internal::conditional_aligned_malloc<NeedsToAlign>(size); } \
-        EIGEN_CATCH (...) { return 0; } \
-      }
-  #define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign) \
-      EIGEN_DEVICE_FUNC \
-      void *operator new(std::size_t size) { \
-        return Eigen::internal::conditional_aligned_malloc<NeedsToAlign>(size); \
-      } \
-      EIGEN_DEVICE_FUNC \
-      void *operator new[](std::size_t size) { \
-        return Eigen::internal::conditional_aligned_malloc<NeedsToAlign>(size); \
-      } \
-      EIGEN_DEVICE_FUNC \
-      void operator delete(void * ptr) EIGEN_NO_THROW { Eigen::internal::conditional_aligned_free<NeedsToAlign>(ptr); } \
-      EIGEN_DEVICE_FUNC \
-      void operator delete[](void * ptr) EIGEN_NO_THROW { Eigen::internal::conditional_aligned_free<NeedsToAlign>(ptr); } \
-      EIGEN_DEVICE_FUNC \
-      void operator delete(void * ptr, std::size_t /* sz */) EIGEN_NO_THROW { Eigen::internal::conditional_aligned_free<NeedsToAlign>(ptr); } \
-      EIGEN_DEVICE_FUNC \
-      void operator delete[](void * ptr, std::size_t /* sz */) EIGEN_NO_THROW { Eigen::internal::conditional_aligned_free<NeedsToAlign>(ptr); } \
-      /* in-place new and delete. since (at least afaik) there is no actual   */ \
-      /* memory allocated we can safely let the default implementation handle */ \
-      /* this particular case. */ \
-      EIGEN_DEVICE_FUNC \
-      static void *operator new(std::size_t size, void *ptr) { return ::operator new(size,ptr); } \
-      EIGEN_DEVICE_FUNC \
-      static void *operator new[](std::size_t size, void* ptr) { return ::operator new[](size,ptr); } \
-      EIGEN_DEVICE_FUNC \
-      void operator delete(void * memory, void *ptr) EIGEN_NO_THROW { return ::operator delete(memory,ptr); } \
-      EIGEN_DEVICE_FUNC \
-      void operator delete[](void * memory, void *ptr) EIGEN_NO_THROW { return ::operator delete[](memory,ptr); } \
-      /* nothrow-new (returns zero instead of std::bad_alloc) */ \
-      EIGEN_MAKE_ALIGNED_OPERATOR_NEW_NOTHROW(NeedsToAlign) \
-      EIGEN_DEVICE_FUNC \
-      void operator delete(void *ptr, const std::nothrow_t&) EIGEN_NO_THROW { \
-        Eigen::internal::conditional_aligned_free<NeedsToAlign>(ptr); \
-      } \
-      typedef void eigen_aligned_operator_new_marker_type;
+#if EIGEN_MAX_ALIGN_BYTES != 0 && !defined(EIGEN_HIP_DEVICE_COMPILE)
+#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_NOTHROW(NeedsToAlign)                                    \
+  EIGEN_DEVICE_FUNC void* operator new(std::size_t size, const std::nothrow_t&) EIGEN_NO_THROW { \
+    EIGEN_TRY { return Eigen::internal::conditional_aligned_malloc<NeedsToAlign>(size); }        \
+    EIGEN_CATCH(...) { return 0; }                                                               \
+  }
+#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign)                                                             \
+  EIGEN_DEVICE_FUNC void* operator new(std::size_t size) {                                                           \
+    return Eigen::internal::conditional_aligned_malloc<NeedsToAlign>(size);                                          \
+  }                                                                                                                  \
+  EIGEN_DEVICE_FUNC void* operator new[](std::size_t size) {                                                         \
+    return Eigen::internal::conditional_aligned_malloc<NeedsToAlign>(size);                                          \
+  }                                                                                                                  \
+  EIGEN_DEVICE_FUNC void operator delete(void* ptr) EIGEN_NO_THROW {                                                 \
+    Eigen::internal::conditional_aligned_free<NeedsToAlign>(ptr);                                                    \
+  }                                                                                                                  \
+  EIGEN_DEVICE_FUNC void operator delete[](void* ptr) EIGEN_NO_THROW {                                               \
+    Eigen::internal::conditional_aligned_free<NeedsToAlign>(ptr);                                                    \
+  }                                                                                                                  \
+  EIGEN_DEVICE_FUNC void operator delete(void* ptr, std::size_t /* sz */) EIGEN_NO_THROW {                           \
+    Eigen::internal::conditional_aligned_free<NeedsToAlign>(ptr);                                                    \
+  }                                                                                                                  \
+  EIGEN_DEVICE_FUNC void operator delete[](void* ptr, std::size_t /* sz */) EIGEN_NO_THROW {                         \
+    Eigen::internal::conditional_aligned_free<NeedsToAlign>(ptr);                                                    \
+  }                                                                                                                  \
+  /* in-place new and delete. since (at least afaik) there is no actual   */                                         \
+  /* memory allocated we can safely let the default implementation handle */                                         \
+  /* this particular case. */                                                                                        \
+  EIGEN_DEVICE_FUNC static void* operator new(std::size_t size, void* ptr) { return ::operator new(size, ptr); }     \
+  EIGEN_DEVICE_FUNC static void* operator new[](std::size_t size, void* ptr) { return ::operator new[](size, ptr); } \
+  EIGEN_DEVICE_FUNC void operator delete(void* memory, void* ptr) EIGEN_NO_THROW {                                   \
+    return ::operator delete(memory, ptr);                                                                           \
+  }                                                                                                                  \
+  EIGEN_DEVICE_FUNC void operator delete[](void* memory, void* ptr) EIGEN_NO_THROW {                                 \
+    return ::operator delete[](memory, ptr);                                                                         \
+  }                                                                                                                  \
+  /* nothrow-new (returns zero instead of std::bad_alloc) */                                                         \
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_NOTHROW(NeedsToAlign)                                                              \
+  EIGEN_DEVICE_FUNC void operator delete(void* ptr, const std::nothrow_t&) EIGEN_NO_THROW {                          \
+    Eigen::internal::conditional_aligned_free<NeedsToAlign>(ptr);                                                    \
+  }                                                                                                                  \
+  typedef void eigen_aligned_operator_new_marker_type;
 #else
-  #define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign)
+#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign)
 #endif
 
 #define EIGEN_MAKE_ALIGNED_OPERATOR_NEW EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(true)
-#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar,Size)                        \
-  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(bool(                                                             \
-        ((Size)!=Eigen::Dynamic) &&                                                                    \
-        (((EIGEN_MAX_ALIGN_BYTES>=16) && ((sizeof(Scalar)*(Size))%(EIGEN_MAX_ALIGN_BYTES  )==0)) ||    \
-         ((EIGEN_MAX_ALIGN_BYTES>=32) && ((sizeof(Scalar)*(Size))%(EIGEN_MAX_ALIGN_BYTES/2)==0)) ||    \
-         ((EIGEN_MAX_ALIGN_BYTES>=64) && ((sizeof(Scalar)*(Size))%(EIGEN_MAX_ALIGN_BYTES/4)==0))   )))
+#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar, Size)                                 \
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(                                                                            \
+      bool(((Size) != Eigen::Dynamic) &&                                                                         \
+           (((EIGEN_MAX_ALIGN_BYTES >= 16) && ((sizeof(Scalar) * (Size)) % (EIGEN_MAX_ALIGN_BYTES) == 0)) ||     \
+            ((EIGEN_MAX_ALIGN_BYTES >= 32) && ((sizeof(Scalar) * (Size)) % (EIGEN_MAX_ALIGN_BYTES / 2) == 0)) || \
+            ((EIGEN_MAX_ALIGN_BYTES >= 64) && ((sizeof(Scalar) * (Size)) % (EIGEN_MAX_ALIGN_BYTES / 4) == 0)))))
 
 #endif
 
 /****************************************************************************/
 
 /** \class aligned_allocator
-* \ingroup Core_Module
-*
-* \brief STL compatible allocator to use with types requiring a non-standard alignment.
-*
-* The memory is aligned as for dynamically aligned matrix/array types such as MatrixXd.
-* By default, it will thus provide at least 16 bytes alignment and more in following cases:
-*  - 32 bytes alignment if AVX is enabled.
-*  - 64 bytes alignment if AVX512 is enabled.
-*
-* This can be controlled using the \c EIGEN_MAX_ALIGN_BYTES macro as documented
-* \link TopicPreprocessorDirectivesPerformance there \endlink.
-*
-* Example:
-* \code
-* // Matrix4f requires 16 bytes alignment:
-* std::map< int, Matrix4f, std::less<int>,
-*           aligned_allocator<std::pair<const int, Matrix4f> > > my_map_mat4;
-* // Vector3f does not require 16 bytes alignment, no need to use Eigen's allocator:
-* std::map< int, Vector3f > my_map_vec3;
-* \endcode
-*
-* \sa \blank \ref TopicStlContainers.
-*/
-template<class T>
-class aligned_allocator : public std::allocator<T>
-{
-public:
-  typedef std::size_t     size_type;
-  typedef std::ptrdiff_t  difference_type;
-  typedef T*              pointer;
-  typedef const T*        const_pointer;
-  typedef T&              reference;
-  typedef const T&        const_reference;
-  typedef T               value_type;
+ * \ingroup Core_Module
+ *
+ * \brief STL compatible allocator to use with types requiring a non-standard alignment.
+ *
+ * The memory is aligned as for dynamically aligned matrix/array types such as MatrixXd.
+ * By default, it will thus provide at least 16 bytes alignment and more in following cases:
+ *  - 32 bytes alignment if AVX is enabled.
+ *  - 64 bytes alignment if AVX512 is enabled.
+ *
+ * This can be controlled using the \c EIGEN_MAX_ALIGN_BYTES macro as documented
+ * \link TopicPreprocessorDirectivesPerformance there \endlink.
+ *
+ * Example:
+ * \code
+ * // Matrix4f requires 16 bytes alignment:
+ * std::map< int, Matrix4f, std::less<int>,
+ *           aligned_allocator<std::pair<const int, Matrix4f> > > my_map_mat4;
+ * // Vector3f does not require 16 bytes alignment, no need to use Eigen's allocator:
+ * std::map< int, Vector3f > my_map_vec3;
+ * \endcode
+ *
+ * \sa \blank \ref TopicStlContainers.
+ */
+template <class T>
+class aligned_allocator : public std::allocator<T> {
+ public:
+  typedef std::size_t size_type;
+  typedef std::ptrdiff_t difference_type;
+  typedef T* pointer;
+  typedef const T* const_pointer;
+  typedef T& reference;
+  typedef const T& const_reference;
+  typedef T value_type;
 
-  template<class U>
-  struct rebind
-  {
+  template <class U>
+  struct rebind {
     typedef aligned_allocator<U> other;
   };
 
@@ -976,206 +917,320 @@
 
   aligned_allocator(const aligned_allocator& other) : std::allocator<T>(other) {}
 
-  template<class U>
+  template <class U>
   aligned_allocator(const aligned_allocator<U>& other) : std::allocator<T>(other) {}
 
   ~aligned_allocator() {}
 
-  #if EIGEN_COMP_GNUC_STRICT && EIGEN_GNUC_STRICT_AT_LEAST(7,0,0)
+#if EIGEN_COMP_GNUC_STRICT && EIGEN_GNUC_STRICT_AT_LEAST(7, 0, 0)
   // In gcc std::allocator::max_size() is bugged making gcc triggers a warning:
-  // eigen/Eigen/src/Core/util/Memory.h:189:12: warning: argument 1 value '18446744073709551612' exceeds maximum object size 9223372036854775807
-  // See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87544
-  size_type max_size() const {
-    return (std::numeric_limits<std::ptrdiff_t>::max)()/sizeof(T);
-  }
-  #endif
+  // eigen/Eigen/src/Core/util/Memory.h:189:12: warning: argument 1 value '18446744073709551612' exceeds maximum object
+  // size 9223372036854775807 See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87544
+  size_type max_size() const { return (std::numeric_limits<std::ptrdiff_t>::max)() / sizeof(T); }
+#endif
 
-  pointer allocate(size_type num, const void* /*hint*/ = 0)
-  {
+  pointer allocate(size_type num, const void* /*hint*/ = 0) {
     internal::check_size_for_overflow<T>(num);
-    return static_cast<pointer>( internal::aligned_malloc(num * sizeof(T)) );
+    return static_cast<pointer>(internal::aligned_malloc(num * sizeof(T)));
   }
 
-  void deallocate(pointer p, size_type /*num*/)
-  {
-    internal::aligned_free(p);
-  }
+  void deallocate(pointer p, size_type /*num*/) { internal::aligned_free(p); }
 };
 
 //---------- Cache sizes ----------
 
 #if !defined(EIGEN_NO_CPUID)
-#  if EIGEN_COMP_GNUC && EIGEN_ARCH_i386_OR_x86_64
-#    if defined(__PIC__) && EIGEN_ARCH_i386
-       // Case for x86 with PIC
-#      define EIGEN_CPUID(abcd,func,id) \
-         __asm__ __volatile__ ("xchgl %%ebx, %k1;cpuid; xchgl %%ebx,%k1": "=a" (abcd[0]), "=&r" (abcd[1]), "=c" (abcd[2]), "=d" (abcd[3]) : "a" (func), "c" (id));
-#    elif defined(__PIC__) && EIGEN_ARCH_x86_64
-       // Case for x64 with PIC. In theory this is only a problem with recent gcc and with medium or large code model, not with the default small code model.
-       // However, we cannot detect which code model is used, and the xchg overhead is negligible anyway.
-#      define EIGEN_CPUID(abcd,func,id) \
-        __asm__ __volatile__ ("xchg{q}\t{%%}rbx, %q1; cpuid; xchg{q}\t{%%}rbx, %q1": "=a" (abcd[0]), "=&r" (abcd[1]), "=c" (abcd[2]), "=d" (abcd[3]) : "0" (func), "2" (id));
-#    else
-       // Case for x86_64 or x86 w/o PIC
-#      define EIGEN_CPUID(abcd,func,id) \
-         __asm__ __volatile__ ("cpuid": "=a" (abcd[0]), "=b" (abcd[1]), "=c" (abcd[2]), "=d" (abcd[3]) : "0" (func), "2" (id) );
-#    endif
-#  elif EIGEN_COMP_MSVC
-#    if EIGEN_ARCH_i386_OR_x86_64
-#      define EIGEN_CPUID(abcd,func,id) __cpuidex((int*)abcd,func,id)
-#    endif
-#  endif
+#if EIGEN_COMP_GNUC && EIGEN_ARCH_i386_OR_x86_64
+#if defined(__PIC__) && EIGEN_ARCH_i386
+// Case for x86 with PIC
+#define EIGEN_CPUID(abcd, func, id)                                                  \
+  __asm__ __volatile__("xchgl %%ebx, %k1;cpuid; xchgl %%ebx,%k1"                     \
+                       : "=a"(abcd[0]), "=&r"(abcd[1]), "=c"(abcd[2]), "=d"(abcd[3]) \
+                       : "a"(func), "c"(id));
+#elif defined(__PIC__) && EIGEN_ARCH_x86_64
+// Case for x64 with PIC. In theory this is only a problem with recent gcc and with medium or large code model, not with
+// the default small code model. However, we cannot detect which code model is used, and the xchg overhead is negligible
+// anyway.
+#define EIGEN_CPUID(abcd, func, id)                                                  \
+  __asm__ __volatile__("xchg{q}\t{%%}rbx, %q1; cpuid; xchg{q}\t{%%}rbx, %q1"         \
+                       : "=a"(abcd[0]), "=&r"(abcd[1]), "=c"(abcd[2]), "=d"(abcd[3]) \
+                       : "0"(func), "2"(id));
+#else
+// Case for x86_64 or x86 w/o PIC
+#define EIGEN_CPUID(abcd, func, id) \
+  __asm__ __volatile__("cpuid" : "=a"(abcd[0]), "=b"(abcd[1]), "=c"(abcd[2]), "=d"(abcd[3]) : "0"(func), "2"(id));
+#endif
+#elif EIGEN_COMP_MSVC
+#if EIGEN_ARCH_i386_OR_x86_64
+#define EIGEN_CPUID(abcd, func, id) __cpuidex((int*)abcd, func, id)
+#endif
+#endif
 #endif
 
 namespace internal {
 
 #ifdef EIGEN_CPUID
 
-inline bool cpuid_is_vendor(int abcd[4], const int vendor[3])
-{
-  return abcd[1]==vendor[0] && abcd[3]==vendor[1] && abcd[2]==vendor[2];
+inline bool cpuid_is_vendor(int abcd[4], const int vendor[3]) {
+  return abcd[1] == vendor[0] && abcd[3] == vendor[1] && abcd[2] == vendor[2];
 }
 
-inline void queryCacheSizes_intel_direct(int& l1, int& l2, int& l3)
-{
+inline void queryCacheSizes_intel_direct(int& l1, int& l2, int& l3) {
   int abcd[4];
   l1 = l2 = l3 = 0;
   int cache_id = 0;
   int cache_type = 0;
   do {
     abcd[0] = abcd[1] = abcd[2] = abcd[3] = 0;
-    EIGEN_CPUID(abcd,0x4,cache_id);
-    cache_type  = (abcd[0] & 0x0F) >> 0;
-    if(cache_type==1||cache_type==3) // data or unified cache
+    EIGEN_CPUID(abcd, 0x4, cache_id);
+    cache_type = (abcd[0] & 0x0F) >> 0;
+    if (cache_type == 1 || cache_type == 3)  // data or unified cache
     {
-      int cache_level = (abcd[0] & 0xE0) >> 5;  // A[7:5]
-      int ways        = (abcd[1] & 0xFFC00000) >> 22; // B[31:22]
-      int partitions  = (abcd[1] & 0x003FF000) >> 12; // B[21:12]
-      int line_size   = (abcd[1] & 0x00000FFF) >>  0; // B[11:0]
-      int sets        = (abcd[2]);                    // C[31:0]
+      int cache_level = (abcd[0] & 0xE0) >> 5;        // A[7:5]
+      int ways = (abcd[1] & 0xFFC00000) >> 22;        // B[31:22]
+      int partitions = (abcd[1] & 0x003FF000) >> 12;  // B[21:12]
+      int line_size = (abcd[1] & 0x00000FFF) >> 0;    // B[11:0]
+      int sets = (abcd[2]);                           // C[31:0]
 
-      int cache_size = (ways+1) * (partitions+1) * (line_size+1) * (sets+1);
+      int cache_size = (ways + 1) * (partitions + 1) * (line_size + 1) * (sets + 1);
 
-      switch(cache_level)
-      {
-        case 1: l1 = cache_size; break;
-        case 2: l2 = cache_size; break;
-        case 3: l3 = cache_size; break;
-        default: break;
+      switch (cache_level) {
+        case 1:
+          l1 = cache_size;
+          break;
+        case 2:
+          l2 = cache_size;
+          break;
+        case 3:
+          l3 = cache_size;
+          break;
+        default:
+          break;
       }
     }
     cache_id++;
-  } while(cache_type>0 && cache_id<16);
+  } while (cache_type > 0 && cache_id < 16);
 }
 
-inline void queryCacheSizes_intel_codes(int& l1, int& l2, int& l3)
-{
+inline void queryCacheSizes_intel_codes(int& l1, int& l2, int& l3) {
   int abcd[4];
   abcd[0] = abcd[1] = abcd[2] = abcd[3] = 0;
   l1 = l2 = l3 = 0;
-  EIGEN_CPUID(abcd,0x00000002,0);
-  unsigned char * bytes = reinterpret_cast<unsigned char *>(abcd)+2;
+  EIGEN_CPUID(abcd, 0x00000002, 0);
+  unsigned char* bytes = reinterpret_cast<unsigned char*>(abcd) + 2;
   bool check_for_p2_core2 = false;
-  for(int i=0; i<14; ++i)
-  {
-    switch(bytes[i])
-    {
-      case 0x0A: l1 = 8; break;   // 0Ah   data L1 cache, 8 KB, 2 ways, 32 byte lines
-      case 0x0C: l1 = 16; break;  // 0Ch   data L1 cache, 16 KB, 4 ways, 32 byte lines
-      case 0x0E: l1 = 24; break;  // 0Eh   data L1 cache, 24 KB, 6 ways, 64 byte lines
-      case 0x10: l1 = 16; break;  // 10h   data L1 cache, 16 KB, 4 ways, 32 byte lines (IA-64)
-      case 0x15: l1 = 16; break;  // 15h   code L1 cache, 16 KB, 4 ways, 32 byte lines (IA-64)
-      case 0x2C: l1 = 32; break;  // 2Ch   data L1 cache, 32 KB, 8 ways, 64 byte lines
-      case 0x30: l1 = 32; break;  // 30h   code L1 cache, 32 KB, 8 ways, 64 byte lines
-      case 0x60: l1 = 16; break;  // 60h   data L1 cache, 16 KB, 8 ways, 64 byte lines, sectored
-      case 0x66: l1 = 8; break;   // 66h   data L1 cache, 8 KB, 4 ways, 64 byte lines, sectored
-      case 0x67: l1 = 16; break;  // 67h   data L1 cache, 16 KB, 4 ways, 64 byte lines, sectored
-      case 0x68: l1 = 32; break;  // 68h   data L1 cache, 32 KB, 4 ways, 64 byte lines, sectored
-      case 0x1A: l2 = 96; break;   // code and data L2 cache, 96 KB, 6 ways, 64 byte lines (IA-64)
-      case 0x22: l3 = 512; break;   // code and data L3 cache, 512 KB, 4 ways (!), 64 byte lines, dual-sectored
-      case 0x23: l3 = 1024; break;   // code and data L3 cache, 1024 KB, 8 ways, 64 byte lines, dual-sectored
-      case 0x25: l3 = 2048; break;   // code and data L3 cache, 2048 KB, 8 ways, 64 byte lines, dual-sectored
-      case 0x29: l3 = 4096; break;   // code and data L3 cache, 4096 KB, 8 ways, 64 byte lines, dual-sectored
-      case 0x39: l2 = 128; break;   // code and data L2 cache, 128 KB, 4 ways, 64 byte lines, sectored
-      case 0x3A: l2 = 192; break;   // code and data L2 cache, 192 KB, 6 ways, 64 byte lines, sectored
-      case 0x3B: l2 = 128; break;   // code and data L2 cache, 128 KB, 2 ways, 64 byte lines, sectored
-      case 0x3C: l2 = 256; break;   // code and data L2 cache, 256 KB, 4 ways, 64 byte lines, sectored
-      case 0x3D: l2 = 384; break;   // code and data L2 cache, 384 KB, 6 ways, 64 byte lines, sectored
-      case 0x3E: l2 = 512; break;   // code and data L2 cache, 512 KB, 4 ways, 64 byte lines, sectored
-      case 0x40: l2 = 0; break;   // no integrated L2 cache (P6 core) or L3 cache (P4 core)
-      case 0x41: l2 = 128; break;   // code and data L2 cache, 128 KB, 4 ways, 32 byte lines
-      case 0x42: l2 = 256; break;   // code and data L2 cache, 256 KB, 4 ways, 32 byte lines
-      case 0x43: l2 = 512; break;   // code and data L2 cache, 512 KB, 4 ways, 32 byte lines
-      case 0x44: l2 = 1024; break;   // code and data L2 cache, 1024 KB, 4 ways, 32 byte lines
-      case 0x45: l2 = 2048; break;   // code and data L2 cache, 2048 KB, 4 ways, 32 byte lines
-      case 0x46: l3 = 4096; break;   // code and data L3 cache, 4096 KB, 4 ways, 64 byte lines
-      case 0x47: l3 = 8192; break;   // code and data L3 cache, 8192 KB, 8 ways, 64 byte lines
-      case 0x48: l2 = 3072; break;   // code and data L2 cache, 3072 KB, 12 ways, 64 byte lines
-      case 0x49: if(l2!=0) l3 = 4096; else {check_for_p2_core2=true; l3 = l2 = 4096;} break;// code and data L3 cache, 4096 KB, 16 ways, 64 byte lines (P4) or L2 for core2
-      case 0x4A: l3 = 6144; break;   // code and data L3 cache, 6144 KB, 12 ways, 64 byte lines
-      case 0x4B: l3 = 8192; break;   // code and data L3 cache, 8192 KB, 16 ways, 64 byte lines
-      case 0x4C: l3 = 12288; break;   // code and data L3 cache, 12288 KB, 12 ways, 64 byte lines
-      case 0x4D: l3 = 16384; break;   // code and data L3 cache, 16384 KB, 16 ways, 64 byte lines
-      case 0x4E: l2 = 6144; break;   // code and data L2 cache, 6144 KB, 24 ways, 64 byte lines
-      case 0x78: l2 = 1024; break;   // code and data L2 cache, 1024 KB, 4 ways, 64 byte lines
-      case 0x79: l2 = 128; break;   // code and data L2 cache, 128 KB, 8 ways, 64 byte lines, dual-sectored
-      case 0x7A: l2 = 256; break;   // code and data L2 cache, 256 KB, 8 ways, 64 byte lines, dual-sectored
-      case 0x7B: l2 = 512; break;   // code and data L2 cache, 512 KB, 8 ways, 64 byte lines, dual-sectored
-      case 0x7C: l2 = 1024; break;   // code and data L2 cache, 1024 KB, 8 ways, 64 byte lines, dual-sectored
-      case 0x7D: l2 = 2048; break;   // code and data L2 cache, 2048 KB, 8 ways, 64 byte lines
-      case 0x7E: l2 = 256; break;   // code and data L2 cache, 256 KB, 8 ways, 128 byte lines, sect. (IA-64)
-      case 0x7F: l2 = 512; break;   // code and data L2 cache, 512 KB, 2 ways, 64 byte lines
-      case 0x80: l2 = 512; break;   // code and data L2 cache, 512 KB, 8 ways, 64 byte lines
-      case 0x81: l2 = 128; break;   // code and data L2 cache, 128 KB, 8 ways, 32 byte lines
-      case 0x82: l2 = 256; break;   // code and data L2 cache, 256 KB, 8 ways, 32 byte lines
-      case 0x83: l2 = 512; break;   // code and data L2 cache, 512 KB, 8 ways, 32 byte lines
-      case 0x84: l2 = 1024; break;   // code and data L2 cache, 1024 KB, 8 ways, 32 byte lines
-      case 0x85: l2 = 2048; break;   // code and data L2 cache, 2048 KB, 8 ways, 32 byte lines
-      case 0x86: l2 = 512; break;   // code and data L2 cache, 512 KB, 4 ways, 64 byte lines
-      case 0x87: l2 = 1024; break;   // code and data L2 cache, 1024 KB, 8 ways, 64 byte lines
-      case 0x88: l3 = 2048; break;   // code and data L3 cache, 2048 KB, 4 ways, 64 byte lines (IA-64)
-      case 0x89: l3 = 4096; break;   // code and data L3 cache, 4096 KB, 4 ways, 64 byte lines (IA-64)
-      case 0x8A: l3 = 8192; break;   // code and data L3 cache, 8192 KB, 4 ways, 64 byte lines (IA-64)
-      case 0x8D: l3 = 3072; break;   // code and data L3 cache, 3072 KB, 12 ways, 128 byte lines (IA-64)
+  for (int i = 0; i < 14; ++i) {
+    switch (bytes[i]) {
+      case 0x0A:
+        l1 = 8;
+        break;  // 0Ah   data L1 cache, 8 KB, 2 ways, 32 byte lines
+      case 0x0C:
+        l1 = 16;
+        break;  // 0Ch   data L1 cache, 16 KB, 4 ways, 32 byte lines
+      case 0x0E:
+        l1 = 24;
+        break;  // 0Eh   data L1 cache, 24 KB, 6 ways, 64 byte lines
+      case 0x10:
+        l1 = 16;
+        break;  // 10h   data L1 cache, 16 KB, 4 ways, 32 byte lines (IA-64)
+      case 0x15:
+        l1 = 16;
+        break;  // 15h   code L1 cache, 16 KB, 4 ways, 32 byte lines (IA-64)
+      case 0x2C:
+        l1 = 32;
+        break;  // 2Ch   data L1 cache, 32 KB, 8 ways, 64 byte lines
+      case 0x30:
+        l1 = 32;
+        break;  // 30h   code L1 cache, 32 KB, 8 ways, 64 byte lines
+      case 0x60:
+        l1 = 16;
+        break;  // 60h   data L1 cache, 16 KB, 8 ways, 64 byte lines, sectored
+      case 0x66:
+        l1 = 8;
+        break;  // 66h   data L1 cache, 8 KB, 4 ways, 64 byte lines, sectored
+      case 0x67:
+        l1 = 16;
+        break;  // 67h   data L1 cache, 16 KB, 4 ways, 64 byte lines, sectored
+      case 0x68:
+        l1 = 32;
+        break;  // 68h   data L1 cache, 32 KB, 4 ways, 64 byte lines, sectored
+      case 0x1A:
+        l2 = 96;
+        break;  // code and data L2 cache, 96 KB, 6 ways, 64 byte lines (IA-64)
+      case 0x22:
+        l3 = 512;
+        break;  // code and data L3 cache, 512 KB, 4 ways (!), 64 byte lines, dual-sectored
+      case 0x23:
+        l3 = 1024;
+        break;  // code and data L3 cache, 1024 KB, 8 ways, 64 byte lines, dual-sectored
+      case 0x25:
+        l3 = 2048;
+        break;  // code and data L3 cache, 2048 KB, 8 ways, 64 byte lines, dual-sectored
+      case 0x29:
+        l3 = 4096;
+        break;  // code and data L3 cache, 4096 KB, 8 ways, 64 byte lines, dual-sectored
+      case 0x39:
+        l2 = 128;
+        break;  // code and data L2 cache, 128 KB, 4 ways, 64 byte lines, sectored
+      case 0x3A:
+        l2 = 192;
+        break;  // code and data L2 cache, 192 KB, 6 ways, 64 byte lines, sectored
+      case 0x3B:
+        l2 = 128;
+        break;  // code and data L2 cache, 128 KB, 2 ways, 64 byte lines, sectored
+      case 0x3C:
+        l2 = 256;
+        break;  // code and data L2 cache, 256 KB, 4 ways, 64 byte lines, sectored
+      case 0x3D:
+        l2 = 384;
+        break;  // code and data L2 cache, 384 KB, 6 ways, 64 byte lines, sectored
+      case 0x3E:
+        l2 = 512;
+        break;  // code and data L2 cache, 512 KB, 4 ways, 64 byte lines, sectored
+      case 0x40:
+        l2 = 0;
+        break;  // no integrated L2 cache (P6 core) or L3 cache (P4 core)
+      case 0x41:
+        l2 = 128;
+        break;  // code and data L2 cache, 128 KB, 4 ways, 32 byte lines
+      case 0x42:
+        l2 = 256;
+        break;  // code and data L2 cache, 256 KB, 4 ways, 32 byte lines
+      case 0x43:
+        l2 = 512;
+        break;  // code and data L2 cache, 512 KB, 4 ways, 32 byte lines
+      case 0x44:
+        l2 = 1024;
+        break;  // code and data L2 cache, 1024 KB, 4 ways, 32 byte lines
+      case 0x45:
+        l2 = 2048;
+        break;  // code and data L2 cache, 2048 KB, 4 ways, 32 byte lines
+      case 0x46:
+        l3 = 4096;
+        break;  // code and data L3 cache, 4096 KB, 4 ways, 64 byte lines
+      case 0x47:
+        l3 = 8192;
+        break;  // code and data L3 cache, 8192 KB, 8 ways, 64 byte lines
+      case 0x48:
+        l2 = 3072;
+        break;  // code and data L2 cache, 3072 KB, 12 ways, 64 byte lines
+      case 0x49:
+        if (l2 != 0)
+          l3 = 4096;
+        else {
+          check_for_p2_core2 = true;
+          l3 = l2 = 4096;
+        }
+        break;  // code and data L3 cache, 4096 KB, 16 ways, 64 byte lines (P4) or L2 for core2
+      case 0x4A:
+        l3 = 6144;
+        break;  // code and data L3 cache, 6144 KB, 12 ways, 64 byte lines
+      case 0x4B:
+        l3 = 8192;
+        break;  // code and data L3 cache, 8192 KB, 16 ways, 64 byte lines
+      case 0x4C:
+        l3 = 12288;
+        break;  // code and data L3 cache, 12288 KB, 12 ways, 64 byte lines
+      case 0x4D:
+        l3 = 16384;
+        break;  // code and data L3 cache, 16384 KB, 16 ways, 64 byte lines
+      case 0x4E:
+        l2 = 6144;
+        break;  // code and data L2 cache, 6144 KB, 24 ways, 64 byte lines
+      case 0x78:
+        l2 = 1024;
+        break;  // code and data L2 cache, 1024 KB, 4 ways, 64 byte lines
+      case 0x79:
+        l2 = 128;
+        break;  // code and data L2 cache, 128 KB, 8 ways, 64 byte lines, dual-sectored
+      case 0x7A:
+        l2 = 256;
+        break;  // code and data L2 cache, 256 KB, 8 ways, 64 byte lines, dual-sectored
+      case 0x7B:
+        l2 = 512;
+        break;  // code and data L2 cache, 512 KB, 8 ways, 64 byte lines, dual-sectored
+      case 0x7C:
+        l2 = 1024;
+        break;  // code and data L2 cache, 1024 KB, 8 ways, 64 byte lines, dual-sectored
+      case 0x7D:
+        l2 = 2048;
+        break;  // code and data L2 cache, 2048 KB, 8 ways, 64 byte lines
+      case 0x7E:
+        l2 = 256;
+        break;  // code and data L2 cache, 256 KB, 8 ways, 128 byte lines, sect. (IA-64)
+      case 0x7F:
+        l2 = 512;
+        break;  // code and data L2 cache, 512 KB, 2 ways, 64 byte lines
+      case 0x80:
+        l2 = 512;
+        break;  // code and data L2 cache, 512 KB, 8 ways, 64 byte lines
+      case 0x81:
+        l2 = 128;
+        break;  // code and data L2 cache, 128 KB, 8 ways, 32 byte lines
+      case 0x82:
+        l2 = 256;
+        break;  // code and data L2 cache, 256 KB, 8 ways, 32 byte lines
+      case 0x83:
+        l2 = 512;
+        break;  // code and data L2 cache, 512 KB, 8 ways, 32 byte lines
+      case 0x84:
+        l2 = 1024;
+        break;  // code and data L2 cache, 1024 KB, 8 ways, 32 byte lines
+      case 0x85:
+        l2 = 2048;
+        break;  // code and data L2 cache, 2048 KB, 8 ways, 32 byte lines
+      case 0x86:
+        l2 = 512;
+        break;  // code and data L2 cache, 512 KB, 4 ways, 64 byte lines
+      case 0x87:
+        l2 = 1024;
+        break;  // code and data L2 cache, 1024 KB, 8 ways, 64 byte lines
+      case 0x88:
+        l3 = 2048;
+        break;  // code and data L3 cache, 2048 KB, 4 ways, 64 byte lines (IA-64)
+      case 0x89:
+        l3 = 4096;
+        break;  // code and data L3 cache, 4096 KB, 4 ways, 64 byte lines (IA-64)
+      case 0x8A:
+        l3 = 8192;
+        break;  // code and data L3 cache, 8192 KB, 4 ways, 64 byte lines (IA-64)
+      case 0x8D:
+        l3 = 3072;
+        break;  // code and data L3 cache, 3072 KB, 12 ways, 128 byte lines (IA-64)
 
-      default: break;
+      default:
+        break;
     }
   }
-  if(check_for_p2_core2 && l2 == l3)
-    l3 = 0;
+  if (check_for_p2_core2 && l2 == l3) l3 = 0;
   l1 *= 1024;
   l2 *= 1024;
   l3 *= 1024;
 }
 
-inline void queryCacheSizes_intel(int& l1, int& l2, int& l3, int max_std_funcs)
-{
-  if(max_std_funcs>=4)
-    queryCacheSizes_intel_direct(l1,l2,l3);
-  else if(max_std_funcs>=2)
-    queryCacheSizes_intel_codes(l1,l2,l3);
+inline void queryCacheSizes_intel(int& l1, int& l2, int& l3, int max_std_funcs) {
+  if (max_std_funcs >= 4)
+    queryCacheSizes_intel_direct(l1, l2, l3);
+  else if (max_std_funcs >= 2)
+    queryCacheSizes_intel_codes(l1, l2, l3);
   else
     l1 = l2 = l3 = 0;
 }
 
-inline void queryCacheSizes_amd(int& l1, int& l2, int& l3)
-{
+inline void queryCacheSizes_amd(int& l1, int& l2, int& l3) {
   int abcd[4];
   abcd[0] = abcd[1] = abcd[2] = abcd[3] = 0;
-  
+
   // First query the max supported function.
-  EIGEN_CPUID(abcd,0x80000000,0);
-  if(static_cast<numext::uint32_t>(abcd[0]) >= static_cast<numext::uint32_t>(0x80000006))
-  {
-    EIGEN_CPUID(abcd,0x80000005,0);
-    l1 = (abcd[2] >> 24) * 1024; // C[31:24] = L1 size in KB
+  EIGEN_CPUID(abcd, 0x80000000, 0);
+  if (static_cast<numext::uint32_t>(abcd[0]) >= static_cast<numext::uint32_t>(0x80000006)) {
+    EIGEN_CPUID(abcd, 0x80000005, 0);
+    l1 = (abcd[2] >> 24) * 1024;  // C[31:24] = L1 size in KB
     abcd[0] = abcd[1] = abcd[2] = abcd[3] = 0;
-    EIGEN_CPUID(abcd,0x80000006,0);
-    l2 = (abcd[2] >> 16) * 1024; // C[31;16] = l2 cache size in KB
-    l3 = ((abcd[3] & 0xFFFC000) >> 18) * 512 * 1024; // D[31;18] = l3 cache size in 512KB
-  }
-  else
-  {
+    EIGEN_CPUID(abcd, 0x80000006, 0);
+    l2 = (abcd[2] >> 16) * 1024;                      // C[31;16] = l2 cache size in KB
+    l3 = ((abcd[3] & 0xFFFC000) >> 18) * 512 * 1024;  // D[31;18] = l3 cache size in 512KB
+  } else {
     l1 = l2 = l3 = 0;
   }
 }
@@ -1183,61 +1238,56 @@
 
 /** \internal
  * Queries and returns the cache sizes in Bytes of the L1, L2, and L3 data caches respectively */
-inline void queryCacheSizes(int& l1, int& l2, int& l3)
-{
-  #ifdef EIGEN_CPUID
+inline void queryCacheSizes(int& l1, int& l2, int& l3) {
+#ifdef EIGEN_CPUID
   int abcd[4];
   const int GenuineIntel[] = {0x756e6547, 0x49656e69, 0x6c65746e};
   const int AuthenticAMD[] = {0x68747541, 0x69746e65, 0x444d4163};
-  const int AMDisbetter_[] = {0x69444d41, 0x74656273, 0x21726574}; // "AMDisbetter!"
+  const int AMDisbetter_[] = {0x69444d41, 0x74656273, 0x21726574};  // "AMDisbetter!"
 
   // identify the CPU vendor
-  EIGEN_CPUID(abcd,0x0,0);
+  EIGEN_CPUID(abcd, 0x0, 0);
   int max_std_funcs = abcd[0];
-  if(cpuid_is_vendor(abcd,GenuineIntel))
-    queryCacheSizes_intel(l1,l2,l3,max_std_funcs);
-  else if(cpuid_is_vendor(abcd,AuthenticAMD) || cpuid_is_vendor(abcd,AMDisbetter_))
-    queryCacheSizes_amd(l1,l2,l3);
+  if (cpuid_is_vendor(abcd, GenuineIntel))
+    queryCacheSizes_intel(l1, l2, l3, max_std_funcs);
+  else if (cpuid_is_vendor(abcd, AuthenticAMD) || cpuid_is_vendor(abcd, AMDisbetter_))
+    queryCacheSizes_amd(l1, l2, l3);
   else
     // by default let's use Intel's API
-    queryCacheSizes_intel(l1,l2,l3,max_std_funcs);
+    queryCacheSizes_intel(l1, l2, l3, max_std_funcs);
 
-  // here is the list of other vendors:
-//   ||cpuid_is_vendor(abcd,"VIA VIA VIA ")
-//   ||cpuid_is_vendor(abcd,"CyrixInstead")
-//   ||cpuid_is_vendor(abcd,"CentaurHauls")
-//   ||cpuid_is_vendor(abcd,"GenuineTMx86")
-//   ||cpuid_is_vendor(abcd,"TransmetaCPU")
-//   ||cpuid_is_vendor(abcd,"RiseRiseRise")
-//   ||cpuid_is_vendor(abcd,"Geode by NSC")
-//   ||cpuid_is_vendor(abcd,"SiS SiS SiS ")
-//   ||cpuid_is_vendor(abcd,"UMC UMC UMC ")
-//   ||cpuid_is_vendor(abcd,"NexGenDriven")
-  #else
+    // here is the list of other vendors:
+    //   ||cpuid_is_vendor(abcd,"VIA VIA VIA ")
+    //   ||cpuid_is_vendor(abcd,"CyrixInstead")
+    //   ||cpuid_is_vendor(abcd,"CentaurHauls")
+    //   ||cpuid_is_vendor(abcd,"GenuineTMx86")
+    //   ||cpuid_is_vendor(abcd,"TransmetaCPU")
+    //   ||cpuid_is_vendor(abcd,"RiseRiseRise")
+    //   ||cpuid_is_vendor(abcd,"Geode by NSC")
+    //   ||cpuid_is_vendor(abcd,"SiS SiS SiS ")
+    //   ||cpuid_is_vendor(abcd,"UMC UMC UMC ")
+    //   ||cpuid_is_vendor(abcd,"NexGenDriven")
+#else
   l1 = l2 = l3 = -1;
-  #endif
+#endif
 }
 
 /** \internal
  * \returns the size in Bytes of the L1 data cache */
-inline int queryL1CacheSize()
-{
+inline int queryL1CacheSize() {
   int l1(-1), l2, l3;
-  queryCacheSizes(l1,l2,l3);
+  queryCacheSizes(l1, l2, l3);
   return l1;
 }
 
 /** \internal
  * \returns the size in Bytes of the L2 or L3 cache if this later is present */
-inline int queryTopLevelCacheSize()
-{
+inline int queryTopLevelCacheSize() {
   int l1, l2(-1), l3(-1);
-  queryCacheSizes(l1,l2,l3);
-  return (std::max)(l2,l3);
+  queryCacheSizes(l1, l2, l3);
+  return (std::max)(l2, l3);
 }
 
-
-
 /** \internal
  * This wraps C++20's std::construct_at, using placement new instead if it is not available.
  */
@@ -1245,11 +1295,9 @@
 #if EIGEN_COMP_CXXVER >= 20
 using std::construct_at;
 #else
-template<class T, class... Args>
-EIGEN_DEVICE_FUNC T* construct_at( T* p, Args&&... args )
-{
-  return ::new (const_cast<void*>(static_cast<const volatile void*>(p)))
-    T(std::forward<Args>(args)...);
+template <class T, class... Args>
+EIGEN_DEVICE_FUNC T* construct_at(T* p, Args&&... args) {
+  return ::new (const_cast<void*>(static_cast<const volatile void*>(p))) T(std::forward<Args>(args)...);
 }
 #endif
 
@@ -1261,15 +1309,14 @@
 #if EIGEN_COMP_CXXVER >= 17
 using std::destroy_at;
 #else
-template<class T>
-EIGEN_DEVICE_FUNC void destroy_at(T* p)
-{
+template <class T>
+EIGEN_DEVICE_FUNC void destroy_at(T* p) {
   p->~T();
 }
 #endif
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_MEMORY_H
+#endif  // EIGEN_MEMORY_H
diff --git a/Eigen/src/Core/util/Meta.h b/Eigen/src/Core/util/Meta.h
index 8e4c278..859d2f1 100644
--- a/Eigen/src/Core/util/Meta.h
+++ b/Eigen/src/Core/util/Meta.h
@@ -16,15 +16,15 @@
 
 #if defined(EIGEN_GPU_COMPILE_PHASE)
 
- #include <cfloat>
+#include <cfloat>
 
- #if defined(EIGEN_CUDA_ARCH)
-  #include <math_constants.h>
- #endif
+#if defined(EIGEN_CUDA_ARCH)
+#include <math_constants.h>
+#endif
 
- #if defined(EIGEN_HIP_DEVICE_COMPILE)
-  #include "Eigen/src/Core/arch/HIP/hcc/math_constants.h"
-  #endif
+#if defined(EIGEN_HIP_DEVICE_COMPILE)
+#include "Eigen/src/Core/arch/HIP/hcc/math_constants.h"
+#endif
 
 #endif
 
@@ -33,42 +33,42 @@
 
 namespace Eigen {
 namespace numext {
-typedef std::uint8_t  uint8_t;
-typedef std::int8_t   int8_t;
+typedef std::uint8_t uint8_t;
+typedef std::int8_t int8_t;
 typedef std::uint16_t uint16_t;
-typedef std::int16_t  int16_t;
+typedef std::int16_t int16_t;
 typedef std::uint32_t uint32_t;
-typedef std::int32_t  int32_t;
+typedef std::int32_t int32_t;
 typedef std::uint64_t uint64_t;
-typedef std::int64_t  int64_t;
+typedef std::int64_t int64_t;
 
 template <size_t Size>
 struct get_integer_by_size {
-    typedef void signed_type;
-    typedef void unsigned_type;
+  typedef void signed_type;
+  typedef void unsigned_type;
 };
 template <>
 struct get_integer_by_size<1> {
-    typedef int8_t signed_type;
-    typedef uint8_t unsigned_type;
+  typedef int8_t signed_type;
+  typedef uint8_t unsigned_type;
 };
 template <>
 struct get_integer_by_size<2> {
-    typedef int16_t signed_type;
-    typedef uint16_t unsigned_type;
+  typedef int16_t signed_type;
+  typedef uint16_t unsigned_type;
 };
 template <>
 struct get_integer_by_size<4> {
-    typedef int32_t signed_type;
-    typedef uint32_t unsigned_type;
+  typedef int32_t signed_type;
+  typedef uint32_t unsigned_type;
 };
 template <>
 struct get_integer_by_size<8> {
-    typedef int64_t signed_type;
-    typedef uint64_t unsigned_type;
+  typedef int64_t signed_type;
+  typedef uint64_t unsigned_type;
 };
-}
-}
+}  // namespace numext
+}  // namespace Eigen
 
 namespace Eigen {
 
@@ -85,310 +85,419 @@
 namespace internal {
 
 /** \internal
-  * \file Meta.h
-  * This file contains generic metaprogramming classes which are not specifically related to Eigen.
-  * \note In case you wonder, yes we're aware that Boost already provides all these features,
-  * we however don't want to add a dependency to Boost.
-  */
+ * \file Meta.h
+ * This file contains generic metaprogramming classes which are not specifically related to Eigen.
+ * \note In case you wonder, yes we're aware that Boost already provides all these features,
+ * we however don't want to add a dependency to Boost.
+ */
 
-struct true_type {  enum { value = 1 }; };
-struct false_type { enum { value = 0 }; };
+struct true_type {
+  enum { value = 1 };
+};
+struct false_type {
+  enum { value = 0 };
+};
 
-template<bool Condition>
+template <bool Condition>
 struct bool_constant;
 
-template<>
+template <>
 struct bool_constant<true> : true_type {};
 
-template<>
+template <>
 struct bool_constant<false> : false_type {};
 
 // Third-party libraries rely on these.
 using std::conditional;
-using std::remove_reference;
-using std::remove_pointer;
 using std::remove_const;
+using std::remove_pointer;
+using std::remove_reference;
 
-template<typename T> struct remove_all { typedef T type; };
-template<typename T> struct remove_all<const T>   { typedef typename remove_all<T>::type type; };
-template<typename T> struct remove_all<T const&>  { typedef typename remove_all<T>::type type; };
-template<typename T> struct remove_all<T&>        { typedef typename remove_all<T>::type type; };
-template<typename T> struct remove_all<T const*>  { typedef typename remove_all<T>::type type; };
-template<typename T> struct remove_all<T*>        { typedef typename remove_all<T>::type type; };
+template <typename T>
+struct remove_all {
+  typedef T type;
+};
+template <typename T>
+struct remove_all<const T> {
+  typedef typename remove_all<T>::type type;
+};
+template <typename T>
+struct remove_all<T const&> {
+  typedef typename remove_all<T>::type type;
+};
+template <typename T>
+struct remove_all<T&> {
+  typedef typename remove_all<T>::type type;
+};
+template <typename T>
+struct remove_all<T const*> {
+  typedef typename remove_all<T>::type type;
+};
+template <typename T>
+struct remove_all<T*> {
+  typedef typename remove_all<T>::type type;
+};
 
-template<typename T>
+template <typename T>
 using remove_all_t = typename remove_all<T>::type;
 
-template<typename T> struct is_arithmetic      { enum { value = false }; };
-template<> struct is_arithmetic<float>         { enum { value = true }; };
-template<> struct is_arithmetic<double>        { enum { value = true }; };
+template <typename T>
+struct is_arithmetic {
+  enum { value = false };
+};
+template <>
+struct is_arithmetic<float> {
+  enum { value = true };
+};
+template <>
+struct is_arithmetic<double> {
+  enum { value = true };
+};
 // GPU devices treat `long double` as `double`.
 #ifndef EIGEN_GPU_COMPILE_PHASE
-template<> struct is_arithmetic<long double>   { enum { value = true }; };
+template <>
+struct is_arithmetic<long double> {
+  enum { value = true };
+};
 #endif
-template<> struct is_arithmetic<bool>          { enum { value = true }; };
-template<> struct is_arithmetic<char>          { enum { value = true }; };
-template<> struct is_arithmetic<signed char>   { enum { value = true }; };
-template<> struct is_arithmetic<unsigned char> { enum { value = true }; };
-template<> struct is_arithmetic<signed short>  { enum { value = true }; };
-template<> struct is_arithmetic<unsigned short>{ enum { value = true }; };
-template<> struct is_arithmetic<signed int>    { enum { value = true }; };
-template<> struct is_arithmetic<unsigned int>  { enum { value = true }; };
-template<> struct is_arithmetic<signed long>   { enum { value = true }; };
-template<> struct is_arithmetic<unsigned long> { enum { value = true }; };
+template <>
+struct is_arithmetic<bool> {
+  enum { value = true };
+};
+template <>
+struct is_arithmetic<char> {
+  enum { value = true };
+};
+template <>
+struct is_arithmetic<signed char> {
+  enum { value = true };
+};
+template <>
+struct is_arithmetic<unsigned char> {
+  enum { value = true };
+};
+template <>
+struct is_arithmetic<signed short> {
+  enum { value = true };
+};
+template <>
+struct is_arithmetic<unsigned short> {
+  enum { value = true };
+};
+template <>
+struct is_arithmetic<signed int> {
+  enum { value = true };
+};
+template <>
+struct is_arithmetic<unsigned int> {
+  enum { value = true };
+};
+template <>
+struct is_arithmetic<signed long> {
+  enum { value = true };
+};
+template <>
+struct is_arithmetic<unsigned long> {
+  enum { value = true };
+};
 
-template<typename T, typename U> struct is_same { enum { value = 0 }; };
-template<typename T> struct is_same<T,T> { enum { value = 1 }; };
+template <typename T, typename U>
+struct is_same {
+  enum { value = 0 };
+};
+template <typename T>
+struct is_same<T, T> {
+  enum { value = 1 };
+};
 
-template< class T >
+template <class T>
 struct is_void : is_same<void, std::remove_const_t<T>> {};
 
 /** \internal
-  * Implementation of std::void_t for SFINAE.
-  *
-  * Pre C++17:
-  * Custom implementation.
-  *
-  * Post C++17: Uses std::void_t
-  */
+ * Implementation of std::void_t for SFINAE.
+ *
+ * Pre C++17:
+ * Custom implementation.
+ *
+ * Post C++17: Uses std::void_t
+ */
 #if EIGEN_COMP_CXXVER >= 17
 using std::void_t;
 #else
-template<typename...>
+template <typename...>
 using void_t = void;
 #endif
 
-template<> struct is_arithmetic<signed long long>   { enum { value = true }; };
-template<> struct is_arithmetic<unsigned long long> { enum { value = true }; };
+template <>
+struct is_arithmetic<signed long long> {
+  enum { value = true };
+};
+template <>
+struct is_arithmetic<unsigned long long> {
+  enum { value = true };
+};
 using std::is_integral;
 
 using std::make_unsigned;
 
-template <typename T> struct is_const { enum { value = 0 }; };
-template <typename T> struct is_const<T const> { enum { value = 1 }; };
+template <typename T>
+struct is_const {
+  enum { value = 0 };
+};
+template <typename T>
+struct is_const<T const> {
+  enum { value = 1 };
+};
 
-template<typename T> struct add_const_on_value_type            { typedef const T type;  };
-template<typename T> struct add_const_on_value_type<T&>        { typedef T const& type; };
-template<typename T> struct add_const_on_value_type<T*>        { typedef T const* type; };
-template<typename T> struct add_const_on_value_type<T* const>  { typedef T const* const type; };
-template<typename T> struct add_const_on_value_type<T const* const>  { typedef T const* const type; };
+template <typename T>
+struct add_const_on_value_type {
+  typedef const T type;
+};
+template <typename T>
+struct add_const_on_value_type<T&> {
+  typedef T const& type;
+};
+template <typename T>
+struct add_const_on_value_type<T*> {
+  typedef T const* type;
+};
+template <typename T>
+struct add_const_on_value_type<T* const> {
+  typedef T const* const type;
+};
+template <typename T>
+struct add_const_on_value_type<T const* const> {
+  typedef T const* const type;
+};
 
-template<typename T>
+template <typename T>
 using add_const_on_value_type_t = typename add_const_on_value_type<T>::type;
 
 using std::is_convertible;
 
 /** \internal
-  * A base class do disable default copy ctor and copy assignment operator.
-  */
-class noncopyable
-{
+ * A base class do disable default copy ctor and copy assignment operator.
+ */
+class noncopyable {
   EIGEN_DEVICE_FUNC noncopyable(const noncopyable&);
   EIGEN_DEVICE_FUNC const noncopyable& operator=(const noncopyable&);
-protected:
+
+ protected:
   EIGEN_DEVICE_FUNC noncopyable() {}
   EIGEN_DEVICE_FUNC ~noncopyable() {}
 };
 
 /** \internal
-  * Provides access to the number of elements in the object of as a compile-time constant expression.
-  * It "returns" Eigen::Dynamic if the size cannot be resolved at compile-time (default).
-  *
-  * Similar to std::tuple_size, but more general.
-  *
-  * It currently supports:
-  *  - any types T defining T::SizeAtCompileTime
-  *  - plain C arrays as T[N]
-  *  - std::array (c++11)
-  *  - some internal types such as SingleRange and AllRange
-  *
-  * The second template parameter eases SFINAE-based specializations.
-  */
-template<typename T, typename EnableIf = void> struct array_size {
+ * Provides access to the number of elements in the object of as a compile-time constant expression.
+ * It "returns" Eigen::Dynamic if the size cannot be resolved at compile-time (default).
+ *
+ * Similar to std::tuple_size, but more general.
+ *
+ * It currently supports:
+ *  - any types T defining T::SizeAtCompileTime
+ *  - plain C arrays as T[N]
+ *  - std::array (c++11)
+ *  - some internal types such as SingleRange and AllRange
+ *
+ * The second template parameter eases SFINAE-based specializations.
+ */
+template <typename T, typename EnableIf = void>
+struct array_size {
   enum { value = Dynamic };
 };
 
-template<typename T> struct array_size<T, std::enable_if_t<((T::SizeAtCompileTime&0)==0)>> {
+template <typename T>
+struct array_size<T, std::enable_if_t<((T::SizeAtCompileTime & 0) == 0)>> {
   enum { value = T::SizeAtCompileTime };
 };
 
-template<typename T, int N> struct array_size<const T (&)[N]> {
+template <typename T, int N>
+struct array_size<const T (&)[N]> {
   enum { value = N };
 };
-template<typename T, int N> struct array_size<T (&)[N]> {
+template <typename T, int N>
+struct array_size<T (&)[N]> {
   enum { value = N };
 };
 
-template<typename T, std::size_t N> struct array_size<const std::array<T,N> > {
+template <typename T, std::size_t N>
+struct array_size<const std::array<T, N>> {
   enum { value = N };
 };
-template<typename T, std::size_t N> struct array_size<std::array<T,N> > {
+template <typename T, std::size_t N>
+struct array_size<std::array<T, N>> {
   enum { value = N };
 };
 
-
 /** \internal
-  * Analogue of the std::ssize free function.
-  * It returns the signed size of the container or view \a x of type \c T
-  *
-  * It currently supports:
-  *  - any types T defining a member T::size() const
-  *  - plain C arrays as T[N]
-  *
-  * For C++20, this function just forwards to `std::ssize`, or any ADL discoverable `ssize` function.
-  */
-#if EIGEN_COMP_CXXVER < 20 || EIGEN_GNUC_STRICT_LESS_THAN(10,0,0)
+ * Analogue of the std::ssize free function.
+ * It returns the signed size of the container or view \a x of type \c T
+ *
+ * It currently supports:
+ *  - any types T defining a member T::size() const
+ *  - plain C arrays as T[N]
+ *
+ * For C++20, this function just forwards to `std::ssize`, or any ADL discoverable `ssize` function.
+ */
+#if EIGEN_COMP_CXXVER < 20 || EIGEN_GNUC_STRICT_LESS_THAN(10, 0, 0)
 template <typename T>
 EIGEN_CONSTEXPR auto index_list_size(const T& x) {
   using R = std::common_type_t<std::ptrdiff_t, std::make_signed_t<decltype(x.size())>>;
   return static_cast<R>(x.size());
 }
 
-template<typename T, std::ptrdiff_t N>
-EIGEN_CONSTEXPR std::ptrdiff_t index_list_size(const T (&)[N]) { return N; }
+template <typename T, std::ptrdiff_t N>
+EIGEN_CONSTEXPR std::ptrdiff_t index_list_size(const T (&)[N]) {
+  return N;
+}
 #else
 template <typename T>
 EIGEN_CONSTEXPR auto index_list_size(T&& x) {
   using std::ssize;
   return ssize(std::forward<T>(x));
 }
-#endif // EIGEN_COMP_CXXVER
+#endif  // EIGEN_COMP_CXXVER
 
 /** \internal
-  * Convenient struct to get the result type of a nullary, unary, binary, or
-  * ternary functor.
-  *
-  * Pre C++17:
-  * This uses std::result_of. However, note the `type` member removes
-  * const and converts references/pointers to their corresponding value type.
-  *
-  * Post C++17: Uses std::invoke_result
-  */
+ * Convenient struct to get the result type of a nullary, unary, binary, or
+ * ternary functor.
+ *
+ * Pre C++17:
+ * This uses std::result_of. However, note the `type` member removes
+ * const and converts references/pointers to their corresponding value type.
+ *
+ * Post C++17: Uses std::invoke_result
+ */
 #if EIGEN_HAS_STD_INVOKE_RESULT
-template<typename T> struct result_of;
+template <typename T>
+struct result_of;
 
-template<typename F, typename... ArgTypes>
+template <typename F, typename... ArgTypes>
 struct result_of<F(ArgTypes...)> {
   typedef typename std::invoke_result<F, ArgTypes...>::type type1;
   typedef remove_all_t<type1> type;
 };
 
-template<typename F, typename... ArgTypes>
+template <typename F, typename... ArgTypes>
 struct invoke_result {
   typedef typename std::invoke_result<F, ArgTypes...>::type type1;
   typedef remove_all_t<type1> type;
 };
 #else
-template<typename T> struct result_of {
+template <typename T>
+struct result_of {
   typedef typename std::result_of<T>::type type1;
   typedef remove_all_t<type1> type;
 };
 
-template<typename F, typename... ArgTypes>
+template <typename F, typename... ArgTypes>
 struct invoke_result {
-    typedef typename result_of<F(ArgTypes...)>::type type1;
-    typedef remove_all_t<type1> type;
+  typedef typename result_of<F(ArgTypes...)>::type type1;
+  typedef remove_all_t<type1> type;
 };
 #endif
 
 // Reduces a sequence of bools to true if all are true, false otherwise.
-template<bool... values>
-using reduce_all = std::is_same<std::integer_sequence<bool, values..., true>,
-    std::integer_sequence<bool, true, values...> >;
+template <bool... values>
+using reduce_all =
+    std::is_same<std::integer_sequence<bool, values..., true>, std::integer_sequence<bool, true, values...>>;
 
 // Reduces a sequence of bools to true if any are true, false if all false.
-template<bool... values>
-using reduce_any = std::integral_constant<bool,
-    !std::is_same<std::integer_sequence<bool, values..., false>, std::integer_sequence<bool, false, values...> >::value>;
+template <bool... values>
+using reduce_any = std::integral_constant<bool, !std::is_same<std::integer_sequence<bool, values..., false>,
+                                                              std::integer_sequence<bool, false, values...>>::value>;
 
-struct meta_yes { char a[1]; };
-struct meta_no  { char a[2]; };
+struct meta_yes {
+  char a[1];
+};
+struct meta_no {
+  char a[2];
+};
 
 // Check whether T::ReturnType does exist
 template <typename T>
-struct has_ReturnType
-{
-  template <typename C> static meta_yes testFunctor(C const *, typename C::ReturnType const * = 0);
-  template <typename C> static meta_no  testFunctor(...);
+struct has_ReturnType {
+  template <typename C>
+  static meta_yes testFunctor(C const*, typename C::ReturnType const* = 0);
+  template <typename C>
+  static meta_no testFunctor(...);
 
   enum { value = sizeof(testFunctor<T>(static_cast<T*>(0))) == sizeof(meta_yes) };
 };
 
-template<typename T> const T* return_ptr();
+template <typename T>
+const T* return_ptr();
 
-template <typename T, typename IndexType=Index>
-struct has_nullary_operator
-{
-  template <typename C> static meta_yes testFunctor(C const *,std::enable_if_t<(sizeof(return_ptr<C>()->operator()())>0)> * = 0);
+template <typename T, typename IndexType = Index>
+struct has_nullary_operator {
+  template <typename C>
+  static meta_yes testFunctor(C const*, std::enable_if_t<(sizeof(return_ptr<C>()->operator()()) > 0)>* = 0);
   static meta_no testFunctor(...);
 
   enum { value = sizeof(testFunctor(static_cast<T*>(0))) == sizeof(meta_yes) };
 };
 
-template <typename T, typename IndexType=Index>
-struct has_unary_operator
-{
-  template <typename C> static meta_yes testFunctor(C const *,std::enable_if_t<(sizeof(return_ptr<C>()->operator()(IndexType(0)))>0)> * = 0);
+template <typename T, typename IndexType = Index>
+struct has_unary_operator {
+  template <typename C>
+  static meta_yes testFunctor(C const*, std::enable_if_t<(sizeof(return_ptr<C>()->operator()(IndexType(0))) > 0)>* = 0);
   static meta_no testFunctor(...);
 
   enum { value = sizeof(testFunctor(static_cast<T*>(0))) == sizeof(meta_yes) };
 };
 
-template <typename T, typename IndexType=Index>
-struct has_binary_operator
-{
-  template <typename C> static meta_yes testFunctor(C const *,std::enable_if_t<(sizeof(return_ptr<C>()->operator()(IndexType(0),IndexType(0)))>0)> * = 0);
+template <typename T, typename IndexType = Index>
+struct has_binary_operator {
+  template <typename C>
+  static meta_yes testFunctor(
+      C const*, std::enable_if_t<(sizeof(return_ptr<C>()->operator()(IndexType(0), IndexType(0))) > 0)>* = 0);
   static meta_no testFunctor(...);
 
   enum { value = sizeof(testFunctor(static_cast<T*>(0))) == sizeof(meta_yes) };
 };
 
 /** \internal In short, it computes int(sqrt(\a Y)) with \a Y an integer.
-  * Usage example: \code meta_sqrt<1023>::ret \endcode
-  */
-template<int Y,
-         int InfX = 0,
-         int SupX = ((Y==1) ? 1 : Y/2),
-         bool Done = ((SupX - InfX) <= 1 || ((SupX * SupX <= Y) && ((SupX + 1) * (SupX + 1) > Y)))>
-class meta_sqrt
-{
-    enum {
-      MidX = (InfX+SupX)/2,
-      TakeInf = MidX*MidX > Y ? 1 : 0,
-      NewInf = int(TakeInf) ? InfX : int(MidX),
-      NewSup = int(TakeInf) ? int(MidX) : SupX
-    };
-  public:
-    enum { ret = meta_sqrt<Y,NewInf,NewSup>::ret };
+ * Usage example: \code meta_sqrt<1023>::ret \endcode
+ */
+template <int Y, int InfX = 0, int SupX = ((Y == 1) ? 1 : Y / 2),
+          bool Done = ((SupX - InfX) <= 1 || ((SupX * SupX <= Y) && ((SupX + 1) * (SupX + 1) > Y)))>
+class meta_sqrt {
+  enum {
+    MidX = (InfX + SupX) / 2,
+    TakeInf = MidX * MidX > Y ? 1 : 0,
+    NewInf = int(TakeInf) ? InfX : int(MidX),
+    NewSup = int(TakeInf) ? int(MidX) : SupX
+  };
+
+ public:
+  enum { ret = meta_sqrt<Y, NewInf, NewSup>::ret };
 };
 
-template<int Y, int InfX, int SupX>
-class meta_sqrt<Y, InfX, SupX, true> { public:  enum { ret = (SupX*SupX <= Y) ? SupX : InfX }; };
-
+template <int Y, int InfX, int SupX>
+class meta_sqrt<Y, InfX, SupX, true> {
+ public:
+  enum { ret = (SupX * SupX <= Y) ? SupX : InfX };
+};
 
 /** \internal Computes the least common multiple of two positive integer A and B
-  * at compile-time. 
-  */
-template<int A, int B, int K=1, bool Done = ((A*K)%B)==0, bool Big=(A>=B)>
-struct meta_least_common_multiple
-{
-  enum { ret = meta_least_common_multiple<A,B,K+1>::ret };
+ * at compile-time.
+ */
+template <int A, int B, int K = 1, bool Done = ((A * K) % B) == 0, bool Big = (A >= B)>
+struct meta_least_common_multiple {
+  enum { ret = meta_least_common_multiple<A, B, K + 1>::ret };
 };
-template<int A, int B, int K, bool Done>
-struct meta_least_common_multiple<A,B,K,Done,false>
-{
-  enum { ret = meta_least_common_multiple<B,A,K>::ret };
+template <int A, int B, int K, bool Done>
+struct meta_least_common_multiple<A, B, K, Done, false> {
+  enum { ret = meta_least_common_multiple<B, A, K>::ret };
 };
-template<int A, int B, int K>
-struct meta_least_common_multiple<A,B,K,true,true>
-{
-  enum { ret = A*K };
+template <int A, int B, int K>
+struct meta_least_common_multiple<A, B, K, true, true> {
+  enum { ret = A * K };
 };
 
-
 /** \internal determines whether the product of two numeric types is allowed and what the return type is */
-template<typename T, typename U> struct scalar_product_traits
-{
+template <typename T, typename U>
+struct scalar_product_traits {
   enum { Defined = 0 };
 };
 
@@ -399,25 +508,34 @@
 // };
 
 /** \internal Obtains a POD type suitable to use as storage for an object of a size
-  * of at most Len bytes, aligned as specified by \c Align.
-  */
-template<unsigned Len, unsigned Align>
+ * of at most Len bytes, aligned as specified by \c Align.
+ */
+template <unsigned Len, unsigned Align>
 struct aligned_storage {
   struct type {
     EIGEN_ALIGN_TO_BOUNDARY(Align) unsigned char data[Len];
   };
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-template<typename T> struct NumTraits;
+template <typename T>
+struct NumTraits;
 
 namespace numext {
 
 #if defined(EIGEN_GPU_COMPILE_PHASE)
-template<typename T> EIGEN_DEVICE_FUNC   void swap(T &a, T &b) { T tmp = b; b = a; a = tmp; }
+template <typename T>
+EIGEN_DEVICE_FUNC void swap(T& a, T& b) {
+  T tmp = b;
+  b = a;
+  a = tmp;
+}
 #else
-template<typename T> EIGEN_STRONG_INLINE void swap(T &a, T &b) { std::swap(a,b); }
+template <typename T>
+EIGEN_STRONG_INLINE void swap(T& a, T& b) {
+  std::swap(a, b);
+}
 #endif
 
 using std::numeric_limits;
@@ -449,74 +567,91 @@
 
 // The aim of the following functions is to bypass -Wfloat-equal warnings
 // when we really want a strict equality comparison on floating points.
-template<typename X, typename Y> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool equal_strict(const X& x, const Y& y) { return equal_strict_impl<X, Y>::run(x, y); }
+template <typename X, typename Y>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool equal_strict(const X& x, const Y& y) {
+  return equal_strict_impl<X, Y>::run(x, y);
+}
 
 #if !defined(EIGEN_GPU_COMPILE_PHASE) || (!defined(EIGEN_CUDA_ARCH) && defined(EIGEN_CONSTEXPR_ARE_DEVICE_FUNC))
-template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
-bool equal_strict(const float& x,const float& y) { return std::equal_to<float>()(x,y); }
+template <>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool equal_strict(const float& x, const float& y) {
+  return std::equal_to<float>()(x, y);
+}
 
-template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
-bool equal_strict(const double& x,const double& y) { return std::equal_to<double>()(x,y); }
+template <>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool equal_strict(const double& x, const double& y) {
+  return std::equal_to<double>()(x, y);
+}
 #endif
 
 /**
  * \internal Performs an exact comparison of x to zero, e.g. to decide whether a term can be ignored.
  * Use this to to bypass -Wfloat-equal warnings when exact zero is what needs to be tested.
-*/
-template<typename X> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
-bool is_exactly_zero(const X& x) { return equal_strict(x, typename NumTraits<X>::Literal{0}); }
+ */
+template <typename X>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool is_exactly_zero(const X& x) {
+  return equal_strict(x, typename NumTraits<X>::Literal{0});
+}
 
 /**
  * \internal Performs an exact comparison of x to one, e.g. to decide whether a factor needs to be multiplied.
  * Use this to to bypass -Wfloat-equal warnings when exact one is what needs to be tested.
-*/
-template<typename X> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
-bool is_exactly_one(const X& x) { return equal_strict(x, typename NumTraits<X>::Literal{1}); }
+ */
+template <typename X>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool is_exactly_one(const X& x) {
+  return equal_strict(x, typename NumTraits<X>::Literal{1});
+}
 
-template<typename X, typename Y> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
-bool not_equal_strict(const X& x,const Y& y) { return !equal_strict_impl<X, Y>::run(x, y); }
+template <typename X, typename Y>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool not_equal_strict(const X& x, const Y& y) {
+  return !equal_strict_impl<X, Y>::run(x, y);
+}
 
 #if !defined(EIGEN_GPU_COMPILE_PHASE) || (!defined(EIGEN_CUDA_ARCH) && defined(EIGEN_CONSTEXPR_ARE_DEVICE_FUNC))
-template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
-bool not_equal_strict(const float& x,const float& y) { return std::not_equal_to<float>()(x,y); }
+template <>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool not_equal_strict(const float& x, const float& y) {
+  return std::not_equal_to<float>()(x, y);
+}
 
-template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
-bool not_equal_strict(const double& x,const double& y) { return std::not_equal_to<double>()(x,y); }
+template <>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool not_equal_strict(const double& x, const double& y) {
+  return std::not_equal_to<double>()(x, y);
+}
 #endif
 
-} // end namespace numext
+}  // end namespace numext
 
 namespace internal {
 
-template<typename Scalar>
+template <typename Scalar>
 struct is_identically_zero_impl {
-  static inline bool run(const Scalar& s) {
-    return numext::is_exactly_zero(s);
-  }
+  static inline bool run(const Scalar& s) { return numext::is_exactly_zero(s); }
 };
 
-template<typename Scalar> EIGEN_STRONG_INLINE
-bool is_identically_zero(const Scalar& s) { return is_identically_zero_impl<Scalar>::run(s); }
+template <typename Scalar>
+EIGEN_STRONG_INLINE bool is_identically_zero(const Scalar& s) {
+  return is_identically_zero_impl<Scalar>::run(s);
+}
 
 /// \internal Returns true if its argument is of integer or enum type.
 /// FIXME this has the same purpose as `is_valid_index_type` in XprHelper.h
-template<typename A>
+template <typename A>
 constexpr bool is_int_or_enum_v = std::is_enum<A>::value || std::is_integral<A>::value;
 
 /// \internal Gets the minimum of two values which may be integers or enums
-template<typename A, typename B>
+template <typename A, typename B>
 inline constexpr int plain_enum_min(A a, B b) {
   static_assert(is_int_or_enum_v<A>, "Argument a must be an integer or enum");
   static_assert(is_int_or_enum_v<B>, "Argument b must be an integer or enum");
-  return ((int) a <= (int) b) ? (int) a : (int) b;
+  return ((int)a <= (int)b) ? (int)a : (int)b;
 }
 
 /// \internal Gets the maximum of two values which may be integers or enums
-template<typename A, typename B>
+template <typename A, typename B>
 inline constexpr int plain_enum_max(A a, B b) {
   static_assert(is_int_or_enum_v<A>, "Argument a must be an integer or enum");
   static_assert(is_int_or_enum_v<B>, "Argument b must be an integer or enum");
-  return ((int) a >= (int) b) ? (int) a : (int) b;
+  return ((int)a >= (int)b) ? (int)a : (int)b;
 }
 
 /**
@@ -525,52 +660,48 @@
  *  followed by Dynamic, followed by other finite values. The reason for giving Dynamic the priority over
  *  finite values is that min(3, Dynamic) should be Dynamic, since that could be anything between 0 and 3.
  */
-template<typename A, typename B>
+template <typename A, typename B>
 inline constexpr int min_size_prefer_dynamic(A a, B b) {
   static_assert(is_int_or_enum_v<A>, "Argument a must be an integer or enum");
   static_assert(is_int_or_enum_v<B>, "Argument b must be an integer or enum");
-  if ((int) a == 0 || (int) b == 0) return 0;
-  if ((int) a == 1 || (int) b == 1) return 1;
-  if ((int) a == Dynamic || (int) b == Dynamic) return Dynamic;
+  if ((int)a == 0 || (int)b == 0) return 0;
+  if ((int)a == 1 || (int)b == 1) return 1;
+  if ((int)a == Dynamic || (int)b == Dynamic) return Dynamic;
   return plain_enum_min(a, b);
 }
 
 /**
  * \internal
- *  min_size_prefer_fixed is a variant of `min_size_prefer_dynamic` comparing MaxSizes. The difference is that finite values
- *  now have priority over Dynamic, so that min(3, Dynamic) gives 3. Indeed, whatever the actual value is
- *  (between 0 and 3), it is not more than 3.
+ *  min_size_prefer_fixed is a variant of `min_size_prefer_dynamic` comparing MaxSizes. The difference is that finite
+ * values now have priority over Dynamic, so that min(3, Dynamic) gives 3. Indeed, whatever the actual value is (between
+ * 0 and 3), it is not more than 3.
  */
-template<typename A, typename B>
+template <typename A, typename B>
 inline constexpr int min_size_prefer_fixed(A a, B b) {
   static_assert(is_int_or_enum_v<A>, "Argument a must be an integer or enum");
   static_assert(is_int_or_enum_v<B>, "Argument b must be an integer or enum");
-  if ((int) a == 0 || (int) b == 0) return 0;
-  if ((int) a == 1 || (int) b == 1) return 1;
-  if ((int) a == Dynamic && (int) b == Dynamic) return Dynamic;
-  if ((int) a == Dynamic) return (int) b;
-  if ((int) b == Dynamic) return (int) a;
+  if ((int)a == 0 || (int)b == 0) return 0;
+  if ((int)a == 1 || (int)b == 1) return 1;
+  if ((int)a == Dynamic && (int)b == Dynamic) return Dynamic;
+  if ((int)a == Dynamic) return (int)b;
+  if ((int)b == Dynamic) return (int)a;
   return plain_enum_min(a, b);
 }
 
 /// \internal see `min_size_prefer_fixed`. No need for a separate variant for MaxSizes here.
-template<typename A, typename B>
+template <typename A, typename B>
 inline constexpr int max_size_prefer_dynamic(A a, B b) {
   static_assert(is_int_or_enum_v<A>, "Argument a must be an integer or enum");
   static_assert(is_int_or_enum_v<B>, "Argument b must be an integer or enum");
-  if ((int) a == Dynamic || (int) b == Dynamic) return Dynamic;
+  if ((int)a == Dynamic || (int)b == Dynamic) return Dynamic;
   return plain_enum_max(a, b);
 }
 
 /// \internal Calculate logical XOR at compile time
-inline constexpr bool logical_xor(bool a, bool b) {
-  return a != b;
-}
+inline constexpr bool logical_xor(bool a, bool b) { return a != b; }
 
 /// \internal Calculate logical IMPLIES at compile time
-inline constexpr bool check_implication(bool a, bool b) {
-  return !a || b;
-}
+inline constexpr bool check_implication(bool a, bool b) { return !a || b; }
 
 /// \internal Provide fallback for std::is_constant_evaluated for pre-C++20.
 #if EIGEN_COMP_CXXVER >= 20
@@ -579,8 +710,8 @@
 constexpr bool is_constant_evaluated() { return false; }
 #endif
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_META_H
+#endif  // EIGEN_META_H
diff --git a/Eigen/src/Core/util/MoreMeta.h b/Eigen/src/Core/util/MoreMeta.h
index 403d772..2d4aeee 100644
--- a/Eigen/src/Core/util/MoreMeta.h
+++ b/Eigen/src/Core/util/MoreMeta.h
@@ -18,18 +18,27 @@
 
 namespace internal {
 
-template<typename... tt>
-struct type_list { constexpr static int count = sizeof...(tt); };
+template <typename... tt>
+struct type_list {
+  constexpr static int count = sizeof...(tt);
+};
 
-template<typename t, typename... tt>
-struct type_list<t, tt...> { constexpr static int count = sizeof...(tt) + 1; typedef t first_type; };
+template <typename t, typename... tt>
+struct type_list<t, tt...> {
+  constexpr static int count = sizeof...(tt) + 1;
+  typedef t first_type;
+};
 
-template<typename T, T... nn>
-struct numeric_list { constexpr static std::size_t count = sizeof...(nn); };
+template <typename T, T... nn>
+struct numeric_list {
+  constexpr static std::size_t count = sizeof...(nn);
+};
 
-template<typename T, T n, T... nn>
-struct numeric_list<T, n, nn...> { static constexpr std::size_t count = sizeof...(nn) + 1;
-                                   static constexpr T first_value = n; };
+template <typename T, T n, T... nn>
+struct numeric_list<T, n, nn...> {
+  static constexpr std::size_t count = sizeof...(nn) + 1;
+  static constexpr T first_value = n;
+};
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
 /* numeric list constructors
@@ -42,306 +51,409 @@
  *     typename gen_numeric_list_repeated<int, 0, 5>::type      numeric_list<int, 0,0,0,0,0>
  */
 
-template<typename T, std::size_t n, T start = 0, T... ii> struct gen_numeric_list                     : gen_numeric_list<T, n-1, start, start + n-1, ii...> {};
-template<typename T, T start, T... ii>                    struct gen_numeric_list<T, 0, start, ii...> { typedef numeric_list<T, ii...> type; };
+template <typename T, std::size_t n, T start = 0, T... ii>
+struct gen_numeric_list : gen_numeric_list<T, n - 1, start, start + n - 1, ii...> {};
+template <typename T, T start, T... ii>
+struct gen_numeric_list<T, 0, start, ii...> {
+  typedef numeric_list<T, ii...> type;
+};
 
-template<typename T, std::size_t n, T start = 0, T... ii> struct gen_numeric_list_reversed                     : gen_numeric_list_reversed<T, n-1, start, ii..., start + n-1> {};
-template<typename T, T start, T... ii>                    struct gen_numeric_list_reversed<T, 0, start, ii...> { typedef numeric_list<T, ii...> type; };
+template <typename T, std::size_t n, T start = 0, T... ii>
+struct gen_numeric_list_reversed : gen_numeric_list_reversed<T, n - 1, start, ii..., start + n - 1> {};
+template <typename T, T start, T... ii>
+struct gen_numeric_list_reversed<T, 0, start, ii...> {
+  typedef numeric_list<T, ii...> type;
+};
 
-template<typename T, std::size_t n, T a, T b, T start = 0, T... ii> struct gen_numeric_list_swapped_pair                           : gen_numeric_list_swapped_pair<T, n-1, a, b, start, (start + n-1) == a ? b : ((start + n-1) == b ? a : (start + n-1)), ii...> {};
-template<typename T, T a, T b, T start, T... ii>                    struct gen_numeric_list_swapped_pair<T, 0, a, b, start, ii...> { typedef numeric_list<T, ii...> type; };
+template <typename T, std::size_t n, T a, T b, T start = 0, T... ii>
+struct gen_numeric_list_swapped_pair
+    : gen_numeric_list_swapped_pair<T, n - 1, a, b, start,
+                                    (start + n - 1) == a ? b : ((start + n - 1) == b ? a : (start + n - 1)), ii...> {};
+template <typename T, T a, T b, T start, T... ii>
+struct gen_numeric_list_swapped_pair<T, 0, a, b, start, ii...> {
+  typedef numeric_list<T, ii...> type;
+};
 
-template<typename T, std::size_t n, T V, T... nn> struct gen_numeric_list_repeated                 : gen_numeric_list_repeated<T, n-1, V, V, nn...> {};
-template<typename T, T V, T... nn>                struct gen_numeric_list_repeated<T, 0, V, nn...> { typedef numeric_list<T, nn...> type; };
+template <typename T, std::size_t n, T V, T... nn>
+struct gen_numeric_list_repeated : gen_numeric_list_repeated<T, n - 1, V, V, nn...> {};
+template <typename T, T V, T... nn>
+struct gen_numeric_list_repeated<T, 0, V, nn...> {
+  typedef numeric_list<T, nn...> type;
+};
 
 /* list manipulation: concatenate */
 
-template<class a, class b> struct concat;
+template <class a, class b>
+struct concat;
 
-template<typename... as, typename... bs> struct concat<type_list<as...>,       type_list<bs...>>        { typedef type_list<as..., bs...> type; };
-template<typename T, T... as, T... bs>   struct concat<numeric_list<T, as...>, numeric_list<T, bs...> > { typedef numeric_list<T, as..., bs...> type; };
+template <typename... as, typename... bs>
+struct concat<type_list<as...>, type_list<bs...>> {
+  typedef type_list<as..., bs...> type;
+};
+template <typename T, T... as, T... bs>
+struct concat<numeric_list<T, as...>, numeric_list<T, bs...>> {
+  typedef numeric_list<T, as..., bs...> type;
+};
 
-template<typename... p> struct mconcat;
-template<typename a>                             struct mconcat<a>           { typedef a type; };
-template<typename a, typename b>                 struct mconcat<a, b>        : concat<a, b> {};
-template<typename a, typename b, typename... cs> struct mconcat<a, b, cs...> : concat<a, typename mconcat<b, cs...>::type> {};
+template <typename... p>
+struct mconcat;
+template <typename a>
+struct mconcat<a> {
+  typedef a type;
+};
+template <typename a, typename b>
+struct mconcat<a, b> : concat<a, b> {};
+template <typename a, typename b, typename... cs>
+struct mconcat<a, b, cs...> : concat<a, typename mconcat<b, cs...>::type> {};
 
 /* list manipulation: extract slices */
 
-template<int n, typename x> struct take;
-template<int n, typename a, typename... as> struct take<n, type_list<a, as...>> : concat<type_list<a>, typename take<n-1, type_list<as...>>::type> {};
-template<int n>                             struct take<n, type_list<>>         { typedef type_list<> type; };
-template<typename a, typename... as>        struct take<0, type_list<a, as...>> { typedef type_list<> type; };
-template<>                                  struct take<0, type_list<>>         { typedef type_list<> type; };
-
-template<typename T, int n, T a, T... as> struct take<n, numeric_list<T, a, as...>> : concat<numeric_list<T, a>, typename take<n-1, numeric_list<T, as...>>::type> {};
-// XXX The following breaks in gcc-11, and is invalid anyways.
-// template<typename T, int n>               struct take<n, numeric_list<T>>           { typedef numeric_list<T> type; };
-template<typename T, T a, T... as>        struct take<0, numeric_list<T, a, as...>> { typedef numeric_list<T> type; };
-template<typename T>                      struct take<0, numeric_list<T>>           { typedef numeric_list<T> type; };
-
-template<typename T, int n, T... ii>      struct h_skip_helper_numeric;
-template<typename T, int n, T i, T... ii> struct h_skip_helper_numeric<T, n, i, ii...> : h_skip_helper_numeric<T, n-1, ii...> {};
-template<typename T, T i, T... ii>        struct h_skip_helper_numeric<T, 0, i, ii...> { typedef numeric_list<T, i, ii...> type; };
-template<typename T, int n>               struct h_skip_helper_numeric<T, n>           { typedef numeric_list<T> type; };
-template<typename T>                      struct h_skip_helper_numeric<T, 0>           { typedef numeric_list<T> type; };
-
-template<int n, typename... tt>             struct h_skip_helper_type;
-template<int n, typename t, typename... tt> struct h_skip_helper_type<n, t, tt...> : h_skip_helper_type<n-1, tt...> {};
-template<typename t, typename... tt>        struct h_skip_helper_type<0, t, tt...> { typedef type_list<t, tt...> type; };
-template<int n>                             struct h_skip_helper_type<n>           { typedef type_list<> type; };
-template<>                                  struct h_skip_helper_type<0>           { typedef type_list<> type; };
-#endif //not EIGEN_PARSED_BY_DOXYGEN
-
-template<int n>
-struct h_skip {
-  template<typename T, T... ii>
-  constexpr static EIGEN_STRONG_INLINE typename h_skip_helper_numeric<T, n, ii...>::type helper(numeric_list<T, ii...>) { return typename h_skip_helper_numeric<T, n, ii...>::type(); }
-  template<typename... tt>
-  constexpr static EIGEN_STRONG_INLINE typename h_skip_helper_type<n, tt...>::type helper(type_list<tt...>) { return typename h_skip_helper_type<n, tt...>::type(); }
+template <int n, typename x>
+struct take;
+template <int n, typename a, typename... as>
+struct take<n, type_list<a, as...>> : concat<type_list<a>, typename take<n - 1, type_list<as...>>::type> {};
+template <int n>
+struct take<n, type_list<>> {
+  typedef type_list<> type;
+};
+template <typename a, typename... as>
+struct take<0, type_list<a, as...>> {
+  typedef type_list<> type;
+};
+template <>
+struct take<0, type_list<>> {
+  typedef type_list<> type;
 };
 
-template<int n, typename a> struct skip { typedef decltype(h_skip<n>::helper(a())) type; };
+template <typename T, int n, T a, T... as>
+struct take<n, numeric_list<T, a, as...>>
+    : concat<numeric_list<T, a>, typename take<n - 1, numeric_list<T, as...>>::type> {};
+// XXX The following breaks in gcc-11, and is invalid anyways.
+// template<typename T, int n>               struct take<n, numeric_list<T>>           { typedef numeric_list<T> type;
+// };
+template <typename T, T a, T... as>
+struct take<0, numeric_list<T, a, as...>> {
+  typedef numeric_list<T> type;
+};
+template <typename T>
+struct take<0, numeric_list<T>> {
+  typedef numeric_list<T> type;
+};
 
-template<int start, int count, typename a> struct slice : take<count, typename skip<start, a>::type> {};
+template <typename T, int n, T... ii>
+struct h_skip_helper_numeric;
+template <typename T, int n, T i, T... ii>
+struct h_skip_helper_numeric<T, n, i, ii...> : h_skip_helper_numeric<T, n - 1, ii...> {};
+template <typename T, T i, T... ii>
+struct h_skip_helper_numeric<T, 0, i, ii...> {
+  typedef numeric_list<T, i, ii...> type;
+};
+template <typename T, int n>
+struct h_skip_helper_numeric<T, n> {
+  typedef numeric_list<T> type;
+};
+template <typename T>
+struct h_skip_helper_numeric<T, 0> {
+  typedef numeric_list<T> type;
+};
+
+template <int n, typename... tt>
+struct h_skip_helper_type;
+template <int n, typename t, typename... tt>
+struct h_skip_helper_type<n, t, tt...> : h_skip_helper_type<n - 1, tt...> {};
+template <typename t, typename... tt>
+struct h_skip_helper_type<0, t, tt...> {
+  typedef type_list<t, tt...> type;
+};
+template <int n>
+struct h_skip_helper_type<n> {
+  typedef type_list<> type;
+};
+template <>
+struct h_skip_helper_type<0> {
+  typedef type_list<> type;
+};
+#endif  // not EIGEN_PARSED_BY_DOXYGEN
+
+template <int n>
+struct h_skip {
+  template <typename T, T... ii>
+  constexpr static EIGEN_STRONG_INLINE typename h_skip_helper_numeric<T, n, ii...>::type helper(
+      numeric_list<T, ii...>) {
+    return typename h_skip_helper_numeric<T, n, ii...>::type();
+  }
+  template <typename... tt>
+  constexpr static EIGEN_STRONG_INLINE typename h_skip_helper_type<n, tt...>::type helper(type_list<tt...>) {
+    return typename h_skip_helper_type<n, tt...>::type();
+  }
+};
+
+template <int n, typename a>
+struct skip {
+  typedef decltype(h_skip<n>::helper(a())) type;
+};
+
+template <int start, int count, typename a>
+struct slice : take<count, typename skip<start, a>::type> {};
 
 /* list manipulation: retrieve single element from list */
 
-template<int n, typename x> struct get;
+template <int n, typename x>
+struct get;
 
-template<int n, typename a, typename... as>               struct get<n, type_list<a, as...>>   : get<n-1, type_list<as...>> {};
-template<typename a, typename... as>                      struct get<0, type_list<a, as...>>   { typedef a type; };
+template <int n, typename a, typename... as>
+struct get<n, type_list<a, as...>> : get<n - 1, type_list<as...>> {};
+template <typename a, typename... as>
+struct get<0, type_list<a, as...>> {
+  typedef a type;
+};
 
-template<typename T, int n, T a, T... as>                        struct get<n, numeric_list<T, a, as...>>   : get<n-1, numeric_list<T, as...>> {};
-template<typename T, T a, T... as>                               struct get<0, numeric_list<T, a, as...>>   { constexpr static T value = a; };
+template <typename T, int n, T a, T... as>
+struct get<n, numeric_list<T, a, as...>> : get<n - 1, numeric_list<T, as...>> {};
+template <typename T, T a, T... as>
+struct get<0, numeric_list<T, a, as...>> {
+  constexpr static T value = a;
+};
 
-template<std::size_t n, typename T, T a, T... as> constexpr T       array_get(const numeric_list<T, a, as...>&) {
-   return get<(int)n, numeric_list<T, a, as...>>::value;
+template <std::size_t n, typename T, T a, T... as>
+constexpr T array_get(const numeric_list<T, a, as...>&) {
+  return get<(int)n, numeric_list<T, a, as...>>::value;
 }
 
 /* always get type, regardless of dummy; good for parameter pack expansion */
 
-template<typename T, T dummy, typename t> struct id_numeric  { typedef t type; };
-template<typename dummy, typename t>      struct id_type     { typedef t type; };
+template <typename T, T dummy, typename t>
+struct id_numeric {
+  typedef t type;
+};
+template <typename dummy, typename t>
+struct id_type {
+  typedef t type;
+};
 
 /* equality checking, flagged version */
 
-template<typename a, typename b> struct is_same_gf : is_same<a, b> { constexpr static int global_flags = 0; };
+template <typename a, typename b>
+struct is_same_gf : is_same<a, b> {
+  constexpr static int global_flags = 0;
+};
 
 /* apply_op to list */
 
-template<
-  bool from_left, // false
-  template<typename, typename> class op,
-  typename additional_param,
-  typename... values
->
-struct h_apply_op_helper                                        { typedef type_list<typename op<values, additional_param>::type...> type; };
-template<
-  template<typename, typename> class op,
-  typename additional_param,
-  typename... values
->
-struct h_apply_op_helper<true, op, additional_param, values...> { typedef type_list<typename op<additional_param, values>::type...> type; };
-
-template<
-  bool from_left,
-  template<typename, typename> class op,
-  typename additional_param
->
-struct h_apply_op
-{
-  template<typename... values>
-  constexpr static typename h_apply_op_helper<from_left, op, additional_param, values...>::type helper(type_list<values...>)
-  { return typename h_apply_op_helper<from_left, op, additional_param, values...>::type(); }
+template <bool from_left,  // false
+          template <typename, typename> class op, typename additional_param, typename... values>
+struct h_apply_op_helper {
+  typedef type_list<typename op<values, additional_param>::type...> type;
+};
+template <template <typename, typename> class op, typename additional_param, typename... values>
+struct h_apply_op_helper<true, op, additional_param, values...> {
+  typedef type_list<typename op<additional_param, values>::type...> type;
 };
 
-template<
-  template<typename, typename> class op,
-  typename additional_param,
-  typename a
->
-struct apply_op_from_left { typedef decltype(h_apply_op<true, op, additional_param>::helper(a())) type; };
+template <bool from_left, template <typename, typename> class op, typename additional_param>
+struct h_apply_op {
+  template <typename... values>
+  constexpr static typename h_apply_op_helper<from_left, op, additional_param, values...>::type helper(
+      type_list<values...>) {
+    return typename h_apply_op_helper<from_left, op, additional_param, values...>::type();
+  }
+};
 
-template<
-  template<typename, typename> class op,
-  typename additional_param,
-  typename a
->
-struct apply_op_from_right { typedef decltype(h_apply_op<false, op, additional_param>::helper(a())) type; };
+template <template <typename, typename> class op, typename additional_param, typename a>
+struct apply_op_from_left {
+  typedef decltype(h_apply_op<true, op, additional_param>::helper(a())) type;
+};
+
+template <template <typename, typename> class op, typename additional_param, typename a>
+struct apply_op_from_right {
+  typedef decltype(h_apply_op<false, op, additional_param>::helper(a())) type;
+};
 
 /* see if an element is in a list */
 
-template<
-  template<typename, typename> class test,
-  typename check_against,
-  typename h_list,
-  bool last_check_positive = false
->
+template <template <typename, typename> class test, typename check_against, typename h_list,
+          bool last_check_positive = false>
 struct contained_in_list;
 
-template<
-  template<typename, typename> class test,
-  typename check_against,
-  typename h_list
->
-struct contained_in_list<test, check_against, h_list, true>
-{
+template <template <typename, typename> class test, typename check_against, typename h_list>
+struct contained_in_list<test, check_against, h_list, true> {
   constexpr static bool value = true;
 };
 
-template<
-  template<typename, typename> class test,
-  typename check_against,
-  typename a,
-  typename... as
->
-struct contained_in_list<test, check_against, type_list<a, as...>, false> : contained_in_list<test, check_against, type_list<as...>, test<check_against, a>::value> {};
+template <template <typename, typename> class test, typename check_against, typename a, typename... as>
+struct contained_in_list<test, check_against, type_list<a, as...>, false>
+    : contained_in_list<test, check_against, type_list<as...>, test<check_against, a>::value> {};
 
-template<
-  template<typename, typename> class test,
-  typename check_against,
-  typename... empty
->
-struct contained_in_list<test, check_against, type_list<empty...>, false> { constexpr static bool value = false; };
+template <template <typename, typename> class test, typename check_against, typename... empty>
+struct contained_in_list<test, check_against, type_list<empty...>, false> {
+  constexpr static bool value = false;
+};
 
 /* see if an element is in a list and check for global flags */
 
-template<
-  template<typename, typename> class test,
-  typename check_against,
-  typename h_list,
-  int default_flags = 0,
-  bool last_check_positive = false,
-  int last_check_flags = default_flags
->
+template <template <typename, typename> class test, typename check_against, typename h_list, int default_flags = 0,
+          bool last_check_positive = false, int last_check_flags = default_flags>
 struct contained_in_list_gf;
 
-template<
-  template<typename, typename> class test,
-  typename check_against,
-  typename h_list,
-  int default_flags,
-  int last_check_flags
->
-struct contained_in_list_gf<test, check_against, h_list, default_flags, true, last_check_flags>
-{
+template <template <typename, typename> class test, typename check_against, typename h_list, int default_flags,
+          int last_check_flags>
+struct contained_in_list_gf<test, check_against, h_list, default_flags, true, last_check_flags> {
   constexpr static bool value = true;
   constexpr static int global_flags = last_check_flags;
 };
 
-template<
-  template<typename, typename> class test,
-  typename check_against,
-  typename a,
-  typename... as,
-  int default_flags,
-  int last_check_flags
->
-struct contained_in_list_gf<test, check_against, type_list<a, as...>, default_flags, false, last_check_flags> : contained_in_list_gf<test, check_against, type_list<as...>, default_flags, test<check_against, a>::value, test<check_against, a>::global_flags> {};
+template <template <typename, typename> class test, typename check_against, typename a, typename... as,
+          int default_flags, int last_check_flags>
+struct contained_in_list_gf<test, check_against, type_list<a, as...>, default_flags, false, last_check_flags>
+    : contained_in_list_gf<test, check_against, type_list<as...>, default_flags, test<check_against, a>::value,
+                           test<check_against, a>::global_flags> {};
 
-template<
-  template<typename, typename> class test,
-  typename check_against,
-  typename... empty,
-  int default_flags,
-  int last_check_flags
->
-struct contained_in_list_gf<test, check_against, type_list<empty...>, default_flags, false, last_check_flags> { constexpr static bool value = false; constexpr static int global_flags = default_flags; };
+template <template <typename, typename> class test, typename check_against, typename... empty, int default_flags,
+          int last_check_flags>
+struct contained_in_list_gf<test, check_against, type_list<empty...>, default_flags, false, last_check_flags> {
+  constexpr static bool value = false;
+  constexpr static int global_flags = default_flags;
+};
 
 /* generic reductions */
 
-template<
-  typename Reducer,
-  typename... Ts
-> struct reduce;
+template <typename Reducer, typename... Ts>
+struct reduce;
 
-template<
-  typename Reducer
-> struct reduce<Reducer>
-{
+template <typename Reducer>
+struct reduce<Reducer> {
   EIGEN_DEVICE_FUNC constexpr static EIGEN_STRONG_INLINE int run() { return Reducer::Identity; }
 };
 
-template<
-  typename Reducer,
-  typename A
-> struct reduce<Reducer, A>
-{
+template <typename Reducer, typename A>
+struct reduce<Reducer, A> {
   EIGEN_DEVICE_FUNC constexpr static EIGEN_STRONG_INLINE A run(A a) { return a; }
 };
 
-template<
-  typename Reducer,
-  typename A,
-  typename... Ts
-> struct reduce<Reducer, A, Ts...>
-{
-  EIGEN_DEVICE_FUNC constexpr static EIGEN_STRONG_INLINE auto run(A a, Ts... ts) -> decltype(Reducer::run(a, reduce<Reducer, Ts...>::run(ts...))) {
+template <typename Reducer, typename A, typename... Ts>
+struct reduce<Reducer, A, Ts...> {
+  EIGEN_DEVICE_FUNC constexpr static EIGEN_STRONG_INLINE auto run(A a, Ts... ts)
+      -> decltype(Reducer::run(a, reduce<Reducer, Ts...>::run(ts...))) {
     return Reducer::run(a, reduce<Reducer, Ts...>::run(ts...));
   }
 };
 
 /* generic binary operations */
 
-struct sum_op           {
-  template<typename A, typename B> EIGEN_DEVICE_FUNC constexpr static EIGEN_STRONG_INLINE auto run(A a, B b) -> decltype(a + b)   { return a + b;   }
+struct sum_op {
+  template <typename A, typename B>
+  EIGEN_DEVICE_FUNC constexpr static EIGEN_STRONG_INLINE auto run(A a, B b) -> decltype(a + b) {
+    return a + b;
+  }
   static constexpr int Identity = 0;
 };
-struct product_op       {
-  template<typename A, typename B> EIGEN_DEVICE_FUNC constexpr static EIGEN_STRONG_INLINE auto run(A a, B b) -> decltype(a * b)   { return a * b;   }
+struct product_op {
+  template <typename A, typename B>
+  EIGEN_DEVICE_FUNC constexpr static EIGEN_STRONG_INLINE auto run(A a, B b) -> decltype(a * b) {
+    return a * b;
+  }
   static constexpr int Identity = 1;
 };
 
-struct logical_and_op   { template<typename A, typename B> constexpr static EIGEN_STRONG_INLINE auto run(A a, B b) -> decltype(a && b)  { return a && b;  } };
-struct logical_or_op    { template<typename A, typename B> constexpr static EIGEN_STRONG_INLINE auto run(A a, B b) -> decltype(a || b)  { return a || b;  } };
+struct logical_and_op {
+  template <typename A, typename B>
+  constexpr static EIGEN_STRONG_INLINE auto run(A a, B b) -> decltype(a && b) {
+    return a && b;
+  }
+};
+struct logical_or_op {
+  template <typename A, typename B>
+  constexpr static EIGEN_STRONG_INLINE auto run(A a, B b) -> decltype(a || b) {
+    return a || b;
+  }
+};
 
-struct equal_op         { template<typename A, typename B> constexpr static EIGEN_STRONG_INLINE auto run(A a, B b) -> decltype(a == b)  { return a == b;  } };
-struct not_equal_op     { template<typename A, typename B> constexpr static EIGEN_STRONG_INLINE auto run(A a, B b) -> decltype(a != b)  { return a != b;  } };
-struct lesser_op        { template<typename A, typename B> constexpr static EIGEN_STRONG_INLINE auto run(A a, B b) -> decltype(a < b)   { return a < b;   } };
-struct lesser_equal_op  { template<typename A, typename B> constexpr static EIGEN_STRONG_INLINE auto run(A a, B b) -> decltype(a <= b)  { return a <= b;  } };
-struct greater_op       { template<typename A, typename B> constexpr static EIGEN_STRONG_INLINE auto run(A a, B b) -> decltype(a > b)   { return a > b;   } };
-struct greater_equal_op { template<typename A, typename B> constexpr static EIGEN_STRONG_INLINE auto run(A a, B b) -> decltype(a >= b)  { return a >= b;  } };
+struct equal_op {
+  template <typename A, typename B>
+  constexpr static EIGEN_STRONG_INLINE auto run(A a, B b) -> decltype(a == b) {
+    return a == b;
+  }
+};
+struct not_equal_op {
+  template <typename A, typename B>
+  constexpr static EIGEN_STRONG_INLINE auto run(A a, B b) -> decltype(a != b) {
+    return a != b;
+  }
+};
+struct lesser_op {
+  template <typename A, typename B>
+  constexpr static EIGEN_STRONG_INLINE auto run(A a, B b) -> decltype(a < b) {
+    return a < b;
+  }
+};
+struct lesser_equal_op {
+  template <typename A, typename B>
+  constexpr static EIGEN_STRONG_INLINE auto run(A a, B b) -> decltype(a <= b) {
+    return a <= b;
+  }
+};
+struct greater_op {
+  template <typename A, typename B>
+  constexpr static EIGEN_STRONG_INLINE auto run(A a, B b) -> decltype(a > b) {
+    return a > b;
+  }
+};
+struct greater_equal_op {
+  template <typename A, typename B>
+  constexpr static EIGEN_STRONG_INLINE auto run(A a, B b) -> decltype(a >= b) {
+    return a >= b;
+  }
+};
 
 /* generic unary operations */
 
-struct not_op                { template<typename A> constexpr static EIGEN_STRONG_INLINE auto run(A a) -> decltype(!a)      { return !a;      } };
-struct negation_op           { template<typename A> constexpr static EIGEN_STRONG_INLINE auto run(A a) -> decltype(-a)      { return -a;      } };
-struct greater_equal_zero_op { template<typename A> constexpr static EIGEN_STRONG_INLINE auto run(A a) -> decltype(a >= 0)  { return a >= 0;  } };
-
+struct not_op {
+  template <typename A>
+  constexpr static EIGEN_STRONG_INLINE auto run(A a) -> decltype(!a) {
+    return !a;
+  }
+};
+struct negation_op {
+  template <typename A>
+  constexpr static EIGEN_STRONG_INLINE auto run(A a) -> decltype(-a) {
+    return -a;
+  }
+};
+struct greater_equal_zero_op {
+  template <typename A>
+  constexpr static EIGEN_STRONG_INLINE auto run(A a) -> decltype(a >= 0) {
+    return a >= 0;
+  }
+};
 
 /* reductions for lists */
 
 // using auto -> return value spec makes ICC 13.0 and 13.1 crash here, so we have to hack it
 // together in front... (13.0 doesn't work with array_prod/array_reduce/... anyway, but 13.1
 // does...
-template<typename... Ts>
-EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE decltype(reduce<product_op, Ts...>::run((*((Ts*)0))...)) arg_prod(Ts... ts)
-{
+template <typename... Ts>
+EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE decltype(reduce<product_op, Ts...>::run((*((Ts*)0))...)) arg_prod(
+    Ts... ts) {
   return reduce<product_op, Ts...>::run(ts...);
 }
 
-template<typename... Ts>
-constexpr EIGEN_STRONG_INLINE decltype(reduce<sum_op, Ts...>::run((*((Ts*)0))...)) arg_sum(Ts... ts)
-{
+template <typename... Ts>
+constexpr EIGEN_STRONG_INLINE decltype(reduce<sum_op, Ts...>::run((*((Ts*)0))...)) arg_sum(Ts... ts) {
   return reduce<sum_op, Ts...>::run(ts...);
 }
 
 /* reverse arrays */
 
-template<typename Array, int... n>
-constexpr EIGEN_STRONG_INLINE Array h_array_reverse(Array arr, numeric_list<int, n...>)
-{
+template <typename Array, int... n>
+constexpr EIGEN_STRONG_INLINE Array h_array_reverse(Array arr, numeric_list<int, n...>) {
   return {{array_get<sizeof...(n) - n - 1>(arr)...}};
 }
 
-template<typename T, std::size_t N>
-constexpr EIGEN_STRONG_INLINE array<T, N> array_reverse(array<T, N> arr)
-{
+template <typename T, std::size_t N>
+constexpr EIGEN_STRONG_INLINE array<T, N> array_reverse(array<T, N> arr) {
   return h_array_reverse(arr, typename gen_numeric_list<int, N>::type());
 }
 
-
 /* generic array reductions */
 
 // can't reuse standard reduce() interface above because Intel's Compiler
@@ -349,113 +461,108 @@
 // (start from N - 1 and work down to 0 because specialization for
 // n == N - 1 also doesn't work in Intel's compiler, so it goes into
 // an infinite loop)
-template<typename Reducer, typename T, std::size_t N, std::size_t n = N - 1>
+template <typename Reducer, typename T, std::size_t N, std::size_t n = N - 1>
 struct h_array_reduce {
-  EIGEN_DEVICE_FUNC constexpr static EIGEN_STRONG_INLINE auto run(array<T, N> arr, T identity) -> decltype(Reducer::run(h_array_reduce<Reducer, T, N, n - 1>::run(arr, identity), array_get<n>(arr)))
-  {
+  EIGEN_DEVICE_FUNC constexpr static EIGEN_STRONG_INLINE auto run(array<T, N> arr, T identity)
+      -> decltype(Reducer::run(h_array_reduce<Reducer, T, N, n - 1>::run(arr, identity), array_get<n>(arr))) {
     return Reducer::run(h_array_reduce<Reducer, T, N, n - 1>::run(arr, identity), array_get<n>(arr));
   }
 };
 
-template<typename Reducer, typename T, std::size_t N>
-struct h_array_reduce<Reducer, T, N, 0>
-{
-  EIGEN_DEVICE_FUNC constexpr static EIGEN_STRONG_INLINE T run(const array<T, N>& arr, T)
-  {
-    return array_get<0>(arr);
-  }
+template <typename Reducer, typename T, std::size_t N>
+struct h_array_reduce<Reducer, T, N, 0> {
+  EIGEN_DEVICE_FUNC constexpr static EIGEN_STRONG_INLINE T run(const array<T, N>& arr, T) { return array_get<0>(arr); }
 };
 
-template<typename Reducer, typename T>
-struct h_array_reduce<Reducer, T, 0>
-{
-  EIGEN_DEVICE_FUNC constexpr static EIGEN_STRONG_INLINE T run(const array<T, 0>&, T identity)
-  {
-    return identity;
-  }
+template <typename Reducer, typename T>
+struct h_array_reduce<Reducer, T, 0> {
+  EIGEN_DEVICE_FUNC constexpr static EIGEN_STRONG_INLINE T run(const array<T, 0>&, T identity) { return identity; }
 };
 
-template<typename Reducer, typename T, std::size_t N>
-EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE auto array_reduce(const array<T, N>& arr, T identity) -> decltype(h_array_reduce<Reducer, T, N>::run(arr, identity))
-{
+template <typename Reducer, typename T, std::size_t N>
+EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE auto array_reduce(const array<T, N>& arr, T identity)
+    -> decltype(h_array_reduce<Reducer, T, N>::run(arr, identity)) {
   return h_array_reduce<Reducer, T, N>::run(arr, identity);
 }
 
 /* standard array reductions */
 
-template<typename T, std::size_t N>
-EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE auto array_sum(const array<T, N>& arr) -> decltype(array_reduce<sum_op, T, N>(arr, static_cast<T>(0)))
-{
+template <typename T, std::size_t N>
+EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE auto array_sum(const array<T, N>& arr)
+    -> decltype(array_reduce<sum_op, T, N>(arr, static_cast<T>(0))) {
   return array_reduce<sum_op, T, N>(arr, static_cast<T>(0));
 }
 
-template<typename T, std::size_t N>
-EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE auto array_prod(const array<T, N>& arr) -> decltype(array_reduce<product_op, T, N>(arr, static_cast<T>(1)))
-{
+template <typename T, std::size_t N>
+EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE auto array_prod(const array<T, N>& arr)
+    -> decltype(array_reduce<product_op, T, N>(arr, static_cast<T>(1))) {
   return array_reduce<product_op, T, N>(arr, static_cast<T>(1));
 }
 
-template<typename t>
+template <typename t>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE t array_prod(const std::vector<t>& a) {
   eigen_assert(a.size() > 0);
   t prod = 1;
-  for (size_t i = 0; i < a.size(); ++i) { prod *= a[i]; }
+  for (size_t i = 0; i < a.size(); ++i) {
+    prod *= a[i];
+  }
   return prod;
 }
 
 /* zip an array */
 
-template<typename Op, typename A, typename B, std::size_t N, int... n>
-constexpr EIGEN_STRONG_INLINE array<decltype(Op::run(A(), B())),N> h_array_zip(array<A, N> a, array<B, N> b, numeric_list<int, n...>)
-{
-  return array<decltype(Op::run(A(), B())),N>{{ Op::run(array_get<n>(a), array_get<n>(b))... }};
+template <typename Op, typename A, typename B, std::size_t N, int... n>
+constexpr EIGEN_STRONG_INLINE array<decltype(Op::run(A(), B())), N> h_array_zip(array<A, N> a, array<B, N> b,
+                                                                                numeric_list<int, n...>) {
+  return array<decltype(Op::run(A(), B())), N>{{Op::run(array_get<n>(a), array_get<n>(b))...}};
 }
 
-template<typename Op, typename A, typename B, std::size_t N>
-constexpr EIGEN_STRONG_INLINE array<decltype(Op::run(A(), B())),N> array_zip(array<A, N> a, array<B, N> b)
-{
+template <typename Op, typename A, typename B, std::size_t N>
+constexpr EIGEN_STRONG_INLINE array<decltype(Op::run(A(), B())), N> array_zip(array<A, N> a, array<B, N> b) {
   return h_array_zip<Op>(a, b, typename gen_numeric_list<int, N>::type());
 }
 
 /* zip an array and reduce the result */
 
-template<typename Reducer, typename Op, typename A, typename B, std::size_t N, int... n>
-constexpr EIGEN_STRONG_INLINE auto h_array_zip_and_reduce(array<A, N> a, array<B, N> b, numeric_list<int, n...>) -> decltype(reduce<Reducer, typename id_numeric<int,n,decltype(Op::run(A(), B()))>::type...>::run(Op::run(array_get<n>(a), array_get<n>(b))...))
-{
-  return reduce<Reducer, typename id_numeric<int,n,decltype(Op::run(A(), B()))>::type...>::run(Op::run(array_get<n>(a), array_get<n>(b))...);
+template <typename Reducer, typename Op, typename A, typename B, std::size_t N, int... n>
+constexpr EIGEN_STRONG_INLINE auto h_array_zip_and_reduce(array<A, N> a, array<B, N> b, numeric_list<int, n...>)
+    -> decltype(reduce<Reducer, typename id_numeric<int, n, decltype(Op::run(A(), B()))>::type...>::run(
+        Op::run(array_get<n>(a), array_get<n>(b))...)) {
+  return reduce<Reducer, typename id_numeric<int, n, decltype(Op::run(A(), B()))>::type...>::run(
+      Op::run(array_get<n>(a), array_get<n>(b))...);
 }
 
-template<typename Reducer, typename Op, typename A, typename B, std::size_t N>
-constexpr EIGEN_STRONG_INLINE auto array_zip_and_reduce(array<A, N> a, array<B, N> b) -> decltype(h_array_zip_and_reduce<Reducer, Op, A, B, N>(a, b, typename gen_numeric_list<int, N>::type()))
-{
+template <typename Reducer, typename Op, typename A, typename B, std::size_t N>
+constexpr EIGEN_STRONG_INLINE auto array_zip_and_reduce(array<A, N> a, array<B, N> b)
+    -> decltype(h_array_zip_and_reduce<Reducer, Op, A, B, N>(a, b, typename gen_numeric_list<int, N>::type())) {
   return h_array_zip_and_reduce<Reducer, Op, A, B, N>(a, b, typename gen_numeric_list<int, N>::type());
 }
 
 /* apply stuff to an array */
 
-template<typename Op, typename A, std::size_t N, int... n>
-constexpr EIGEN_STRONG_INLINE array<decltype(Op::run(A())),N> h_array_apply(array<A, N> a, numeric_list<int, n...>)
-{
-  return array<decltype(Op::run(A())),N>{{ Op::run(array_get<n>(a))... }};
+template <typename Op, typename A, std::size_t N, int... n>
+constexpr EIGEN_STRONG_INLINE array<decltype(Op::run(A())), N> h_array_apply(array<A, N> a, numeric_list<int, n...>) {
+  return array<decltype(Op::run(A())), N>{{Op::run(array_get<n>(a))...}};
 }
 
-template<typename Op, typename A, std::size_t N>
-constexpr EIGEN_STRONG_INLINE array<decltype(Op::run(A())),N> array_apply(array<A, N> a)
-{
+template <typename Op, typename A, std::size_t N>
+constexpr EIGEN_STRONG_INLINE array<decltype(Op::run(A())), N> array_apply(array<A, N> a) {
   return h_array_apply<Op>(a, typename gen_numeric_list<int, N>::type());
 }
 
 /* apply stuff to an array and reduce */
 
-template<typename Reducer, typename Op, typename A, std::size_t N, int... n>
-constexpr EIGEN_STRONG_INLINE auto h_array_apply_and_reduce(array<A, N> arr, numeric_list<int, n...>) -> decltype(reduce<Reducer, typename id_numeric<int,n,decltype(Op::run(A()))>::type...>::run(Op::run(array_get<n>(arr))...))
-{
-  return reduce<Reducer, typename id_numeric<int,n,decltype(Op::run(A()))>::type...>::run(Op::run(array_get<n>(arr))...);
+template <typename Reducer, typename Op, typename A, std::size_t N, int... n>
+constexpr EIGEN_STRONG_INLINE auto h_array_apply_and_reduce(array<A, N> arr, numeric_list<int, n...>)
+    -> decltype(reduce<Reducer, typename id_numeric<int, n, decltype(Op::run(A()))>::type...>::run(
+        Op::run(array_get<n>(arr))...)) {
+  return reduce<Reducer, typename id_numeric<int, n, decltype(Op::run(A()))>::type...>::run(
+      Op::run(array_get<n>(arr))...);
 }
 
-template<typename Reducer, typename Op, typename A, std::size_t N>
-constexpr EIGEN_STRONG_INLINE auto array_apply_and_reduce(array<A, N> a) -> decltype(h_array_apply_and_reduce<Reducer, Op, A, N>(a, typename gen_numeric_list<int, N>::type()))
-{
+template <typename Reducer, typename Op, typename A, std::size_t N>
+constexpr EIGEN_STRONG_INLINE auto array_apply_and_reduce(array<A, N> a)
+    -> decltype(h_array_apply_and_reduce<Reducer, Op, A, N>(a, typename gen_numeric_list<int, N>::type())) {
   return h_array_apply_and_reduce<Reducer, Op, A, N>(a, typename gen_numeric_list<int, N>::type());
 }
 
@@ -464,69 +571,60 @@
  *   array<int, 16> = repeat<16>(42);
  */
 
-template<int n>
-struct h_repeat
-{
-  template<typename t, int... ii>
-  constexpr static EIGEN_STRONG_INLINE array<t, n> run(t v, numeric_list<int, ii...>)
-  {
-    return {{ typename id_numeric<int, ii, t>::type(v)... }};
+template <int n>
+struct h_repeat {
+  template <typename t, int... ii>
+  constexpr static EIGEN_STRONG_INLINE array<t, n> run(t v, numeric_list<int, ii...>) {
+    return {{typename id_numeric<int, ii, t>::type(v)...}};
   }
 };
 
-template<int n, typename t>
-constexpr array<t, n> repeat(t v) { return h_repeat<n>::run(v, typename gen_numeric_list<int, n>::type()); }
+template <int n, typename t>
+constexpr array<t, n> repeat(t v) {
+  return h_repeat<n>::run(v, typename gen_numeric_list<int, n>::type());
+}
 
 /* instantiate a class by a C-style array */
-template<class InstType, typename ArrType, std::size_t N, bool Reverse, typename... Ps>
+template <class InstType, typename ArrType, std::size_t N, bool Reverse, typename... Ps>
 struct h_instantiate_by_c_array;
 
-template<class InstType, typename ArrType, std::size_t N, typename... Ps>
-struct h_instantiate_by_c_array<InstType, ArrType, N, false, Ps...>
-{
-  static InstType run(ArrType* arr, Ps... args)
-  {
+template <class InstType, typename ArrType, std::size_t N, typename... Ps>
+struct h_instantiate_by_c_array<InstType, ArrType, N, false, Ps...> {
+  static InstType run(ArrType* arr, Ps... args) {
     return h_instantiate_by_c_array<InstType, ArrType, N - 1, false, Ps..., ArrType>::run(arr + 1, args..., arr[0]);
   }
 };
 
-template<class InstType, typename ArrType, std::size_t N, typename... Ps>
-struct h_instantiate_by_c_array<InstType, ArrType, N, true, Ps...>
-{
-  static InstType run(ArrType* arr, Ps... args)
-  {
+template <class InstType, typename ArrType, std::size_t N, typename... Ps>
+struct h_instantiate_by_c_array<InstType, ArrType, N, true, Ps...> {
+  static InstType run(ArrType* arr, Ps... args) {
     return h_instantiate_by_c_array<InstType, ArrType, N - 1, false, ArrType, Ps...>::run(arr + 1, arr[0], args...);
   }
 };
 
-template<class InstType, typename ArrType, typename... Ps>
-struct h_instantiate_by_c_array<InstType, ArrType, 0, false, Ps...>
-{
-  static InstType run(ArrType* arr, Ps... args)
-  {
+template <class InstType, typename ArrType, typename... Ps>
+struct h_instantiate_by_c_array<InstType, ArrType, 0, false, Ps...> {
+  static InstType run(ArrType* arr, Ps... args) {
     (void)arr;
     return InstType(args...);
   }
 };
 
-template<class InstType, typename ArrType, typename... Ps>
-struct h_instantiate_by_c_array<InstType, ArrType, 0, true, Ps...>
-{
-  static InstType run(ArrType* arr, Ps... args)
-  {
+template <class InstType, typename ArrType, typename... Ps>
+struct h_instantiate_by_c_array<InstType, ArrType, 0, true, Ps...> {
+  static InstType run(ArrType* arr, Ps... args) {
     (void)arr;
     return InstType(args...);
   }
 };
 
-template<class InstType, typename ArrType, std::size_t N, bool Reverse = false>
-InstType instantiate_by_c_array(ArrType* arr)
-{
+template <class InstType, typename ArrType, std::size_t N, bool Reverse = false>
+InstType instantiate_by_c_array(ArrType* arr) {
   return h_instantiate_by_c_array<InstType, ArrType, N, Reverse>::run(arr);
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_MOREMETA_H
+#endif  // EIGEN_MOREMETA_H
diff --git a/Eigen/src/Core/util/ReenableStupidWarnings.h b/Eigen/src/Core/util/ReenableStupidWarnings.h
index c8238de..0af5a43 100644
--- a/Eigen/src/Core/util/ReenableStupidWarnings.h
+++ b/Eigen/src/Core/util/ReenableStupidWarnings.h
@@ -1,27 +1,27 @@
 #ifdef EIGEN_WARNINGS_DISABLED_2
 // "DisableStupidWarnings.h" was included twice recursively: Do not re-enable warnings yet!
-#  undef EIGEN_WARNINGS_DISABLED_2
+#undef EIGEN_WARNINGS_DISABLED_2
 
 #elif defined(EIGEN_WARNINGS_DISABLED)
 #undef EIGEN_WARNINGS_DISABLED
 
 #ifndef EIGEN_PERMANENTLY_DISABLE_STUPID_WARNINGS
-  #ifdef _MSC_VER
-    #pragma warning( pop )
-    #ifdef EIGEN_REENABLE_CXX23_DENORM_DEPRECATION_WARNING
-      #undef EIGEN_REENABLE_CXX23_DENORM_DEPRECATION_WARNING
-      #undef _SILENCE_CXX23_DENORM_DEPRECATION_WARNING
-    #endif
+#ifdef _MSC_VER
+#pragma warning(pop)
+#ifdef EIGEN_REENABLE_CXX23_DENORM_DEPRECATION_WARNING
+#undef EIGEN_REENABLE_CXX23_DENORM_DEPRECATION_WARNING
+#undef _SILENCE_CXX23_DENORM_DEPRECATION_WARNING
+#endif
 
-  #elif defined __INTEL_COMPILER
-    #pragma warning pop
-  #elif defined __clang__
-    #pragma clang diagnostic pop
-  #elif defined __GNUC__  &&  !defined(__FUJITSU) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
-    #pragma GCC diagnostic pop
-  #endif
+#elif defined __INTEL_COMPILER
+#pragma warning pop
+#elif defined __clang__
+#pragma clang diagnostic pop
+#elif defined __GNUC__ && !defined(__FUJITSU) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
+#pragma GCC diagnostic pop
+#endif
 
-  #if defined __NVCC__
+#if defined __NVCC__
 //    Don't re-enable the diagnostic messages, as it turns out these messages need
 //    to be disabled at the point of the template instantiation (i.e the user code)
 //    otherwise they'll be triggered by nvcc.
@@ -37,8 +37,8 @@
 //    EIGEN_NV_DIAG_DEFAULT(2653)
 //    #undef EIGEN_NV_DIAG_DEFAULT
 //    #undef EIGEN_MAKE_PRAGMA
-  #endif
+#endif
 
 #endif
 
-#endif // EIGEN_WARNINGS_DISABLED
+#endif  // EIGEN_WARNINGS_DISABLED
diff --git a/Eigen/src/Core/util/ReshapedHelper.h b/Eigen/src/Core/util/ReshapedHelper.h
index 6c818f5..e569408 100644
--- a/Eigen/src/Core/util/ReshapedHelper.h
+++ b/Eigen/src/Core/util/ReshapedHelper.h
@@ -7,7 +7,6 @@
 // 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_RESHAPED_HELPER_H
 #define EIGEN_RESHAPED_HELPER_H
 
@@ -16,38 +15,37 @@
 
 namespace Eigen {
 
-enum AutoSize_t   { AutoSize };
+enum AutoSize_t { AutoSize };
 const int AutoOrder = 2;
 
 namespace internal {
 
-template<typename SizeType,typename OtherSize, int TotalSize>
+template <typename SizeType, typename OtherSize, int TotalSize>
 struct get_compiletime_reshape_size {
   enum { value = get_fixed_value<SizeType>::value };
 };
 
-template<typename SizeType>
+template <typename SizeType>
 Index get_runtime_reshape_size(SizeType size, Index /*other*/, Index /*total*/) {
   return internal::get_runtime_value(size);
 }
 
-template<typename OtherSize, int TotalSize>
-struct get_compiletime_reshape_size<AutoSize_t,OtherSize,TotalSize> {
+template <typename OtherSize, int TotalSize>
+struct get_compiletime_reshape_size<AutoSize_t, OtherSize, TotalSize> {
   enum {
     other_size = get_fixed_value<OtherSize>::value,
-    value = (TotalSize==Dynamic || other_size==Dynamic) ? Dynamic : TotalSize / other_size };
+    value = (TotalSize == Dynamic || other_size == Dynamic) ? Dynamic : TotalSize / other_size
+  };
 };
 
-inline Index get_runtime_reshape_size(AutoSize_t /*size*/, Index other, Index total) {
-  return total/other;
-}
+inline Index get_runtime_reshape_size(AutoSize_t /*size*/, Index other, Index total) { return total / other; }
 
 constexpr inline int get_compiletime_reshape_order(int flags, int order) {
   return order == AutoOrder ? flags & RowMajorBit : order;
 }
 
-}
+}  // namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_RESHAPED_HELPER_H
+#endif  // EIGEN_RESHAPED_HELPER_H
diff --git a/Eigen/src/Core/util/Serializer.h b/Eigen/src/Core/util/Serializer.h
index cbfc04a..1e12820 100644
--- a/Eigen/src/Core/util/Serializer.h
+++ b/Eigen/src/Core/util/Serializer.h
@@ -20,29 +20,24 @@
 
 /**
  * Serializes an object to a memory buffer.
- * 
+ *
  * Useful for transferring data (e.g. back-and-forth to a device).
  */
-template<typename T, typename EnableIf = void>
+template <typename T, typename EnableIf = void>
 class Serializer;
 
 // Specialization for POD types.
-template<typename T>
-class Serializer<T, typename std::enable_if_t<
-                      std::is_trivial<T>::value 
-                      && std::is_standard_layout<T>::value>> {
+template <typename T>
+class Serializer<T, typename std::enable_if_t<std::is_trivial<T>::value && std::is_standard_layout<T>::value>> {
  public:
- 
   /**
    * Determines the required size of the serialization buffer for a value.
-   * 
+   *
    * \param value the value to serialize.
    * \return the required size.
    */
-  EIGEN_DEVICE_FUNC size_t size(const T& value) const {
-    return sizeof(value);
-  }
-  
+  EIGEN_DEVICE_FUNC size_t size(const T& value) const { return sizeof(value); }
+
   /**
    * Serializes a value to a byte buffer.
    * \param dest the destination buffer; if this is nullptr, does nothing.
@@ -57,7 +52,7 @@
     memcpy(dest, &value, sizeof(value));
     return dest + sizeof(value);
   }
-  
+
   /**
    * Deserializes a value from a byte buffer.
    * \param src the source buffer; if this is nullptr, does nothing.
@@ -76,20 +71,18 @@
 
 // Specialization for DenseBase.
 // Serializes [rows, cols, data...].
-template<typename Derived>
+template <typename Derived>
 class Serializer<DenseBase<Derived>, void> {
  public:
   typedef typename Derived::Scalar Scalar;
-  
+
   struct Header {
     typename Derived::Index rows;
     typename Derived::Index cols;
   };
-  
-  EIGEN_DEVICE_FUNC size_t size(const Derived& value) const {
-    return sizeof(Header) + sizeof(Scalar) * value.size();
-  }
-  
+
+  EIGEN_DEVICE_FUNC size_t size(const Derived& value) const { return sizeof(Header) + sizeof(Scalar) * value.size(); }
+
   EIGEN_DEVICE_FUNC uint8_t* serialize(uint8_t* dest, uint8_t* end, const Derived& value) {
     if (EIGEN_PREDICT_FALSE(dest == nullptr)) return nullptr;
     if (EIGEN_PREDICT_FALSE(dest + size(value) > end)) return nullptr;
@@ -102,7 +95,7 @@
     memcpy(dest, value.data(), data_bytes);
     return dest + data_bytes;
   }
-  
+
   EIGEN_DEVICE_FUNC const uint8_t* deserialize(const uint8_t* src, const uint8_t* end, Derived& value) const {
     if (EIGEN_PREDICT_FALSE(src == nullptr)) return nullptr;
     if (EIGEN_PREDICT_FALSE(src + sizeof(Header) > end)) return nullptr;
@@ -119,102 +112,97 @@
   }
 };
 
-template<typename Scalar, int Rows, int Cols, int Options, int MaxRows, int MaxCols>
-class Serializer<Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> > : public
-  Serializer<DenseBase<Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> > > {};
-  
-template<typename Scalar, int Rows, int Cols, int Options, int MaxRows, int MaxCols>
-class Serializer<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols> > : public
-  Serializer<DenseBase<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols> > > {};
-  
+template <typename Scalar, int Rows, int Cols, int Options, int MaxRows, int MaxCols>
+class Serializer<Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols>>
+    : public Serializer<DenseBase<Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols>>> {};
+
+template <typename Scalar, int Rows, int Cols, int Options, int MaxRows, int MaxCols>
+class Serializer<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols>>
+    : public Serializer<DenseBase<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols>>> {};
+
 namespace internal {
- 
+
 // Recursive serialization implementation helper.
-template<size_t N, typename... Types>
+template <size_t N, typename... Types>
 struct serialize_impl;
 
-template<size_t N, typename T1, typename... Ts>
+template <size_t N, typename T1, typename... Ts>
 struct serialize_impl<N, T1, Ts...> {
   using Serializer = Eigen::Serializer<typename std::decay<T1>::type>;
-  
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  size_t serialize_size(const T1& value, const Ts&... args) {
+
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE size_t serialize_size(const T1& value, const Ts&... args) {
     Serializer serializer;
     size_t size = serializer.size(value);
-    return size + serialize_impl<N-1, Ts...>::serialize_size(args...);
+    return size + serialize_impl<N - 1, Ts...>::serialize_size(args...);
   }
-  
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  uint8_t* serialize(uint8_t* dest, uint8_t* end, const T1& value, const Ts&... args) {
+
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE uint8_t* serialize(uint8_t* dest, uint8_t* end, const T1& value,
+                                                                  const Ts&... args) {
     Serializer serializer;
     dest = serializer.serialize(dest, end, value);
-    return serialize_impl<N-1, Ts...>::serialize(dest, end, args...);
+    return serialize_impl<N - 1, Ts...>::serialize(dest, end, args...);
   }
-  
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  const uint8_t* deserialize(const uint8_t* src, const uint8_t* end, T1& value, Ts&... args) {
+
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const uint8_t* deserialize(const uint8_t* src, const uint8_t* end,
+                                                                          T1& value, Ts&... args) {
     Serializer serializer;
     src = serializer.deserialize(src, end, value);
-    return serialize_impl<N-1, Ts...>::deserialize(src, end, args...);
+    return serialize_impl<N - 1, Ts...>::deserialize(src, end, args...);
   }
 };
 
 // Base case.
-template<>
+template <>
 struct serialize_impl<0> {
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  size_t serialize_size() { return 0; }
-  
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  uint8_t* serialize(uint8_t* dest, uint8_t* /*end*/) { return dest; }
-  
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  const uint8_t* deserialize(const uint8_t* src, const uint8_t* /*end*/) { return src; }
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE size_t serialize_size() { return 0; }
+
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE uint8_t* serialize(uint8_t* dest, uint8_t* /*end*/) { return dest; }
+
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const uint8_t* deserialize(const uint8_t* src, const uint8_t* /*end*/) {
+    return src;
+  }
 };
 
 }  // namespace internal
 
-
 /**
  * Determine the buffer size required to serialize a set of values.
- * 
+ *
  * \param args ... arguments to serialize in sequence.
  * \return the total size of the required buffer.
  */
-template<typename... Args>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-size_t serialize_size(const Args&... args) {
+template <typename... Args>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE size_t serialize_size(const Args&... args) {
   return internal::serialize_impl<sizeof...(args), Args...>::serialize_size(args...);
 }
 
 /**
  * Serialize a set of values to the byte buffer.
- * 
+ *
  * \param dest output byte buffer; if this is nullptr, does nothing.
  * \param end the end of the output byte buffer.
  * \param args ... arguments to serialize in sequence.
  * \return the next address after all serialized values.
  */
-template<typename... Args>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-uint8_t* serialize(uint8_t* dest, uint8_t* end, const Args&... args) {
+template <typename... Args>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE uint8_t* serialize(uint8_t* dest, uint8_t* end, const Args&... args) {
   return internal::serialize_impl<sizeof...(args), Args...>::serialize(dest, end, args...);
 }
 
 /**
  * Deserialize a set of values from the byte buffer.
- * 
+ *
  * \param src input byte buffer; if this is nullptr, does nothing.
  * \param end the end of input byte buffer.
  * \param args ... arguments to deserialize in sequence.
  * \return the next address after all parsed values; nullptr if parsing errors are detected.
  */
-template<typename... Args>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-const uint8_t* deserialize(const uint8_t* src, const uint8_t* end, Args&... args) {
+template <typename... Args>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const uint8_t* deserialize(const uint8_t* src, const uint8_t* end,
+                                                                 Args&... args) {
   return internal::serialize_impl<sizeof...(args), Args...>::deserialize(src, end, args...);
 }
 
 }  // namespace Eigen
 
-#endif // EIGEN_SERIALIZER_H
+#endif  // EIGEN_SERIALIZER_H
diff --git a/Eigen/src/Core/util/StaticAssert.h b/Eigen/src/Core/util/StaticAssert.h
index c938eb8..f062354 100644
--- a/Eigen/src/Core/util/StaticAssert.h
+++ b/Eigen/src/Core/util/StaticAssert.h
@@ -23,93 +23,83 @@
 #ifndef EIGEN_STATIC_ASSERT
 #ifndef EIGEN_NO_STATIC_ASSERT
 
-#define EIGEN_STATIC_ASSERT(X,MSG) static_assert(X,#MSG);
+#define EIGEN_STATIC_ASSERT(X, MSG) static_assert(X, #MSG);
 
-#else // EIGEN_NO_STATIC_ASSERT
+#else  // EIGEN_NO_STATIC_ASSERT
 
-#define EIGEN_STATIC_ASSERT(CONDITION,MSG)
+#define EIGEN_STATIC_ASSERT(CONDITION, MSG)
 
-#endif // EIGEN_NO_STATIC_ASSERT
-#endif // EIGEN_STATIC_ASSERT
+#endif  // EIGEN_NO_STATIC_ASSERT
+#endif  // EIGEN_STATIC_ASSERT
 
 // static assertion failing if the type \a TYPE is not a vector type
 #define EIGEN_STATIC_ASSERT_VECTOR_ONLY(TYPE) \
-  EIGEN_STATIC_ASSERT(TYPE::IsVectorAtCompileTime, \
-                      YOU_TRIED_CALLING_A_VECTOR_METHOD_ON_A_MATRIX)
+  EIGEN_STATIC_ASSERT(TYPE::IsVectorAtCompileTime, YOU_TRIED_CALLING_A_VECTOR_METHOD_ON_A_MATRIX)
 
 // static assertion failing if the type \a TYPE is not fixed-size
-#define EIGEN_STATIC_ASSERT_FIXED_SIZE(TYPE) \
-  EIGEN_STATIC_ASSERT(TYPE::SizeAtCompileTime!=Eigen::Dynamic, \
+#define EIGEN_STATIC_ASSERT_FIXED_SIZE(TYPE)                     \
+  EIGEN_STATIC_ASSERT(TYPE::SizeAtCompileTime != Eigen::Dynamic, \
                       YOU_CALLED_A_FIXED_SIZE_METHOD_ON_A_DYNAMIC_SIZE_MATRIX_OR_VECTOR)
 
 // static assertion failing if the type \a TYPE is not dynamic-size
-#define EIGEN_STATIC_ASSERT_DYNAMIC_SIZE(TYPE) \
-  EIGEN_STATIC_ASSERT(TYPE::SizeAtCompileTime==Eigen::Dynamic, \
+#define EIGEN_STATIC_ASSERT_DYNAMIC_SIZE(TYPE)                   \
+  EIGEN_STATIC_ASSERT(TYPE::SizeAtCompileTime == Eigen::Dynamic, \
                       YOU_CALLED_A_DYNAMIC_SIZE_METHOD_ON_A_FIXED_SIZE_MATRIX_OR_VECTOR)
 
 // static assertion failing if the type \a TYPE is not a vector type of the given size
-#define EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(TYPE, SIZE) \
-  EIGEN_STATIC_ASSERT(TYPE::IsVectorAtCompileTime && TYPE::SizeAtCompileTime==SIZE, \
+#define EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(TYPE, SIZE)                         \
+  EIGEN_STATIC_ASSERT(TYPE::IsVectorAtCompileTime&& TYPE::SizeAtCompileTime == SIZE, \
                       THIS_METHOD_IS_ONLY_FOR_VECTORS_OF_A_SPECIFIC_SIZE)
 
 // static assertion failing if the type \a TYPE is not a vector type of the given size
-#define EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(TYPE, ROWS, COLS) \
-  EIGEN_STATIC_ASSERT(TYPE::RowsAtCompileTime==ROWS && TYPE::ColsAtCompileTime==COLS, \
+#define EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(TYPE, ROWS, COLS)                        \
+  EIGEN_STATIC_ASSERT(TYPE::RowsAtCompileTime == ROWS && TYPE::ColsAtCompileTime == COLS, \
                       THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE)
 
 // static assertion failing if the two vector expression types are not compatible (same fixed-size or dynamic size)
-#define EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(TYPE0,TYPE1) \
-  EIGEN_STATIC_ASSERT( \
-      (int(TYPE0::SizeAtCompileTime)==Eigen::Dynamic \
-    || int(TYPE1::SizeAtCompileTime)==Eigen::Dynamic \
-    || int(TYPE0::SizeAtCompileTime)==int(TYPE1::SizeAtCompileTime)),\
-    YOU_MIXED_VECTORS_OF_DIFFERENT_SIZES)
+#define EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(TYPE0, TYPE1)                                                   \
+  EIGEN_STATIC_ASSERT(                                                                                       \
+      (int(TYPE0::SizeAtCompileTime) == Eigen::Dynamic || int(TYPE1::SizeAtCompileTime) == Eigen::Dynamic || \
+       int(TYPE0::SizeAtCompileTime) == int(TYPE1::SizeAtCompileTime)),                                      \
+      YOU_MIXED_VECTORS_OF_DIFFERENT_SIZES)
 
-#define EIGEN_PREDICATE_SAME_MATRIX_SIZE(TYPE0,TYPE1) \
-     ( \
-        (int(Eigen::internal::size_of_xpr_at_compile_time<TYPE0>::ret)==0 && int(Eigen::internal::size_of_xpr_at_compile_time<TYPE1>::ret)==0) \
-    || (\
-          (int(TYPE0::RowsAtCompileTime)==Eigen::Dynamic \
-        || int(TYPE1::RowsAtCompileTime)==Eigen::Dynamic \
-        || int(TYPE0::RowsAtCompileTime)==int(TYPE1::RowsAtCompileTime)) \
-      &&  (int(TYPE0::ColsAtCompileTime)==Eigen::Dynamic \
-        || int(TYPE1::ColsAtCompileTime)==Eigen::Dynamic \
-        || int(TYPE0::ColsAtCompileTime)==int(TYPE1::ColsAtCompileTime))\
-       ) \
-     )
+#define EIGEN_PREDICATE_SAME_MATRIX_SIZE(TYPE0, TYPE1)                                                     \
+  ((int(Eigen::internal::size_of_xpr_at_compile_time<TYPE0>::ret) == 0 &&                                  \
+    int(Eigen::internal::size_of_xpr_at_compile_time<TYPE1>::ret) == 0) ||                                 \
+   ((int(TYPE0::RowsAtCompileTime) == Eigen::Dynamic || int(TYPE1::RowsAtCompileTime) == Eigen::Dynamic || \
+     int(TYPE0::RowsAtCompileTime) == int(TYPE1::RowsAtCompileTime)) &&                                    \
+    (int(TYPE0::ColsAtCompileTime) == Eigen::Dynamic || int(TYPE1::ColsAtCompileTime) == Eigen::Dynamic || \
+     int(TYPE0::ColsAtCompileTime) == int(TYPE1::ColsAtCompileTime))))
 
 #define EIGEN_STATIC_ASSERT_NON_INTEGER(TYPE) \
-    EIGEN_STATIC_ASSERT(!Eigen::NumTraits<TYPE>::IsInteger, THIS_FUNCTION_IS_NOT_FOR_INTEGER_NUMERIC_TYPES)
+  EIGEN_STATIC_ASSERT(!Eigen::NumTraits<TYPE>::IsInteger, THIS_FUNCTION_IS_NOT_FOR_INTEGER_NUMERIC_TYPES)
 
+// static assertion failing if it is guaranteed at compile-time that the two matrix expression types have different
+// sizes
+#define EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(TYPE0, TYPE1) \
+  EIGEN_STATIC_ASSERT(EIGEN_PREDICATE_SAME_MATRIX_SIZE(TYPE0, TYPE1), YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES)
 
-// static assertion failing if it is guaranteed at compile-time that the two matrix expression types have different sizes
-#define EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(TYPE0,TYPE1) \
-  EIGEN_STATIC_ASSERT( \
-     EIGEN_PREDICATE_SAME_MATRIX_SIZE(TYPE0,TYPE1),\
-    YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES)
-
-#define EIGEN_STATIC_ASSERT_SIZE_1x1(TYPE) \
-      EIGEN_STATIC_ASSERT((TYPE::RowsAtCompileTime == 1 || TYPE::RowsAtCompileTime == Eigen::Dynamic) && \
+#define EIGEN_STATIC_ASSERT_SIZE_1x1(TYPE)                                                             \
+  EIGEN_STATIC_ASSERT((TYPE::RowsAtCompileTime == 1 || TYPE::RowsAtCompileTime == Eigen::Dynamic) &&   \
                           (TYPE::ColsAtCompileTime == 1 || TYPE::ColsAtCompileTime == Eigen::Dynamic), \
-                          THIS_METHOD_IS_ONLY_FOR_1x1_EXPRESSIONS)
+                      THIS_METHOD_IS_ONLY_FOR_1x1_EXPRESSIONS)
 
 #define EIGEN_STATIC_ASSERT_LVALUE(Derived) \
-      EIGEN_STATIC_ASSERT(Eigen::internal::is_lvalue<Derived>::value, \
-                          THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY)
+  EIGEN_STATIC_ASSERT(Eigen::internal::is_lvalue<Derived>::value, THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY)
 
-#define EIGEN_STATIC_ASSERT_ARRAYXPR(Derived) \
-      EIGEN_STATIC_ASSERT((Eigen::internal::is_same<typename Eigen::internal::traits<Derived>::XprKind, ArrayXpr>::value), \
-                          THIS_METHOD_IS_ONLY_FOR_ARRAYS_NOT_MATRICES)
+#define EIGEN_STATIC_ASSERT_ARRAYXPR(Derived)                                                                          \
+  EIGEN_STATIC_ASSERT((Eigen::internal::is_same<typename Eigen::internal::traits<Derived>::XprKind, ArrayXpr>::value), \
+                      THIS_METHOD_IS_ONLY_FOR_ARRAYS_NOT_MATRICES)
 
-#define EIGEN_STATIC_ASSERT_SAME_XPR_KIND(Derived1, Derived2) \
-      EIGEN_STATIC_ASSERT((Eigen::internal::is_same<typename Eigen::internal::traits<Derived1>::XprKind, \
-                                             typename Eigen::internal::traits<Derived2>::XprKind \
-                                            >::value), \
-                          YOU_CANNOT_MIX_ARRAYS_AND_MATRICES)
+#define EIGEN_STATIC_ASSERT_SAME_XPR_KIND(Derived1, Derived2)                                                 \
+  EIGEN_STATIC_ASSERT((Eigen::internal::is_same<typename Eigen::internal::traits<Derived1>::XprKind,          \
+                                                typename Eigen::internal::traits<Derived2>::XprKind>::value), \
+                      YOU_CANNOT_MIX_ARRAYS_AND_MATRICES)
 
 // Check that a cost value is positive, and that is stay within a reasonable range
 // TODO this check could be enabled for internal debugging only
-#define EIGEN_INTERNAL_CHECK_COST_VALUE(C) \
-      EIGEN_STATIC_ASSERT((C)>=0 && (C)<=HugeCost*HugeCost, EIGEN_INTERNAL_ERROR_PLEASE_FILE_A_BUG_REPORT__INVALID_COST_VALUE);
+#define EIGEN_INTERNAL_CHECK_COST_VALUE(C)                    \
+  EIGEN_STATIC_ASSERT((C) >= 0 && (C) <= HugeCost * HugeCost, \
+                      EIGEN_INTERNAL_ERROR_PLEASE_FILE_A_BUG_REPORT__INVALID_COST_VALUE);
 
-#endif // EIGEN_STATIC_ASSERT_H
+#endif  // EIGEN_STATIC_ASSERT_H
diff --git a/Eigen/src/Core/util/SymbolicIndex.h b/Eigen/src/Core/util/SymbolicIndex.h
index a129b4d..136942c 100644
--- a/Eigen/src/Core/util/SymbolicIndex.h
+++ b/Eigen/src/Core/util/SymbolicIndex.h
@@ -16,248 +16,286 @@
 namespace Eigen {
 
 /** \namespace Eigen::symbolic
-  * \ingroup Core_Module
-  *
-  * This namespace defines a set of classes and functions to build and evaluate symbolic expressions of scalar type Index.
-  * Here is a simple example:
-  *
-  * \code
-  * // First step, defines symbols:
-  * struct x_tag {};  static const symbolic::SymbolExpr<x_tag> x;
-  * struct y_tag {};  static const symbolic::SymbolExpr<y_tag> y;
-  * struct z_tag {};  static const symbolic::SymbolExpr<z_tag> z;
-  *
-  * // Defines an expression:
-  * auto expr = (x+3)/y+z;
-  *
-  * // And evaluate it: (c++14)
-  * std::cout << expr.eval(x=6,y=3,z=-13) << "\n";
-  *
-  * \endcode
-  *
-  * It is currently only used internally to define and manipulate the
-  * Eigen::placeholders::last and Eigen::placeholders::lastp1 symbols in
-  * Eigen::seq and Eigen::seqN.
-  *
-  */
+ * \ingroup Core_Module
+ *
+ * This namespace defines a set of classes and functions to build and evaluate symbolic expressions of scalar type
+ * Index. Here is a simple example:
+ *
+ * \code
+ * // First step, defines symbols:
+ * struct x_tag {};  static const symbolic::SymbolExpr<x_tag> x;
+ * struct y_tag {};  static const symbolic::SymbolExpr<y_tag> y;
+ * struct z_tag {};  static const symbolic::SymbolExpr<z_tag> z;
+ *
+ * // Defines an expression:
+ * auto expr = (x+3)/y+z;
+ *
+ * // And evaluate it: (c++14)
+ * std::cout << expr.eval(x=6,y=3,z=-13) << "\n";
+ *
+ * \endcode
+ *
+ * It is currently only used internally to define and manipulate the
+ * Eigen::placeholders::last and Eigen::placeholders::lastp1 symbols in
+ * Eigen::seq and Eigen::seqN.
+ *
+ */
 namespace symbolic {
 
-template<typename Tag> class Symbol;
-template<typename Arg0> class NegateExpr;
-template<typename Arg1,typename Arg2> class AddExpr;
-template<typename Arg1,typename Arg2> class ProductExpr;
-template<typename Arg1,typename Arg2> class QuotientExpr;
+template <typename Tag>
+class Symbol;
+template <typename Arg0>
+class NegateExpr;
+template <typename Arg1, typename Arg2>
+class AddExpr;
+template <typename Arg1, typename Arg2>
+class ProductExpr;
+template <typename Arg1, typename Arg2>
+class QuotientExpr;
 
 // A simple wrapper around an integral value to provide the eval method.
 // We could also use a free-function symbolic_eval...
-template<typename IndexType=Index>
+template <typename IndexType = Index>
 class ValueExpr {
-public:
+ public:
   ValueExpr(IndexType val) : m_value(val) {}
-  template<typename T>
-  IndexType eval_impl(const T&) const { return m_value; }
-protected:
+  template <typename T>
+  IndexType eval_impl(const T&) const {
+    return m_value;
+  }
+
+ protected:
   IndexType m_value;
 };
 
 // Specialization for compile-time value,
 // It is similar to ValueExpr(N) but this version helps the compiler to generate better code.
-template<int N>
+template <int N>
 class ValueExpr<internal::FixedInt<N> > {
-public:
+ public:
   ValueExpr() {}
-  template<typename T>
-  EIGEN_CONSTEXPR Index eval_impl(const T&) const { return N; }
+  template <typename T>
+  EIGEN_CONSTEXPR Index eval_impl(const T&) const {
+    return N;
+  }
 };
 
-
 /** \class BaseExpr
-  * \ingroup Core_Module
-  * Common base class of any symbolic expressions
-  */
-template<typename Derived>
-class BaseExpr
-{
-public:
+ * \ingroup Core_Module
+ * Common base class of any symbolic expressions
+ */
+template <typename Derived>
+class BaseExpr {
+ public:
   const Derived& derived() const { return *static_cast<const Derived*>(this); }
 
   /** Evaluate the expression given the \a values of the symbols.
-    *
-    * \param values defines the values of the symbols, it can either be a SymbolValue or a std::tuple of SymbolValue
-    *               as constructed by SymbolExpr::operator= operator.
-    *
-    */
-  template<typename T>
-  Index eval(const T& values) const { return derived().eval_impl(values); }
+   *
+   * \param values defines the values of the symbols, it can either be a SymbolValue or a std::tuple of SymbolValue
+   *               as constructed by SymbolExpr::operator= operator.
+   *
+   */
+  template <typename T>
+  Index eval(const T& values) const {
+    return derived().eval_impl(values);
+  }
 
-  template<typename... Types>
-  Index eval(Types&&... values) const { return derived().eval_impl(std::make_tuple(values...)); }
+  template <typename... Types>
+  Index eval(Types&&... values) const {
+    return derived().eval_impl(std::make_tuple(values...));
+  }
 
   NegateExpr<Derived> operator-() const { return NegateExpr<Derived>(derived()); }
 
-  AddExpr<Derived,ValueExpr<> > operator+(Index b) const
-  { return AddExpr<Derived,ValueExpr<> >(derived(),  b); }
-  AddExpr<Derived,ValueExpr<> > operator-(Index a) const
-  { return AddExpr<Derived,ValueExpr<> >(derived(), -a); }
-  ProductExpr<Derived,ValueExpr<> > operator*(Index a) const
-  { return ProductExpr<Derived,ValueExpr<> >(derived(),a); }
-  QuotientExpr<Derived,ValueExpr<> > operator/(Index a) const
-  { return QuotientExpr<Derived,ValueExpr<> >(derived(),a); }
+  AddExpr<Derived, ValueExpr<> > operator+(Index b) const { return AddExpr<Derived, ValueExpr<> >(derived(), b); }
+  AddExpr<Derived, ValueExpr<> > operator-(Index a) const { return AddExpr<Derived, ValueExpr<> >(derived(), -a); }
+  ProductExpr<Derived, ValueExpr<> > operator*(Index a) const {
+    return ProductExpr<Derived, ValueExpr<> >(derived(), a);
+  }
+  QuotientExpr<Derived, ValueExpr<> > operator/(Index a) const {
+    return QuotientExpr<Derived, ValueExpr<> >(derived(), a);
+  }
 
-  friend AddExpr<Derived,ValueExpr<> > operator+(Index a, const BaseExpr& b)
-  { return AddExpr<Derived,ValueExpr<> >(b.derived(), a); }
-  friend AddExpr<NegateExpr<Derived>,ValueExpr<> > operator-(Index a, const BaseExpr& b)
-  { return AddExpr<NegateExpr<Derived>,ValueExpr<> >(-b.derived(), a); }
-  friend ProductExpr<ValueExpr<>,Derived> operator*(Index a, const BaseExpr& b)
-  { return ProductExpr<ValueExpr<>,Derived>(a,b.derived()); }
-  friend QuotientExpr<ValueExpr<>,Derived> operator/(Index a, const BaseExpr& b)
-  { return QuotientExpr<ValueExpr<>,Derived>(a,b.derived()); }
+  friend AddExpr<Derived, ValueExpr<> > operator+(Index a, const BaseExpr& b) {
+    return AddExpr<Derived, ValueExpr<> >(b.derived(), a);
+  }
+  friend AddExpr<NegateExpr<Derived>, ValueExpr<> > operator-(Index a, const BaseExpr& b) {
+    return AddExpr<NegateExpr<Derived>, ValueExpr<> >(-b.derived(), a);
+  }
+  friend ProductExpr<ValueExpr<>, Derived> operator*(Index a, const BaseExpr& b) {
+    return ProductExpr<ValueExpr<>, Derived>(a, b.derived());
+  }
+  friend QuotientExpr<ValueExpr<>, Derived> operator/(Index a, const BaseExpr& b) {
+    return QuotientExpr<ValueExpr<>, Derived>(a, b.derived());
+  }
 
-  template<int N>
-  AddExpr<Derived,ValueExpr<internal::FixedInt<N> > > operator+(internal::FixedInt<N>) const
-  { return AddExpr<Derived,ValueExpr<internal::FixedInt<N> > >(derived(), ValueExpr<internal::FixedInt<N> >()); }
-  template<int N>
-  AddExpr<Derived,ValueExpr<internal::FixedInt<-N> > > operator-(internal::FixedInt<N>) const
-  { return AddExpr<Derived,ValueExpr<internal::FixedInt<-N> > >(derived(), ValueExpr<internal::FixedInt<-N> >()); }
-  template<int N>
-  ProductExpr<Derived,ValueExpr<internal::FixedInt<N> > > operator*(internal::FixedInt<N>) const
-  { return ProductExpr<Derived,ValueExpr<internal::FixedInt<N> > >(derived(),ValueExpr<internal::FixedInt<N> >()); }
-  template<int N>
-  QuotientExpr<Derived,ValueExpr<internal::FixedInt<N> > > operator/(internal::FixedInt<N>) const
-  { return QuotientExpr<Derived,ValueExpr<internal::FixedInt<N> > >(derived(),ValueExpr<internal::FixedInt<N> >()); }
+  template <int N>
+  AddExpr<Derived, ValueExpr<internal::FixedInt<N> > > operator+(internal::FixedInt<N>) const {
+    return AddExpr<Derived, ValueExpr<internal::FixedInt<N> > >(derived(), ValueExpr<internal::FixedInt<N> >());
+  }
+  template <int N>
+  AddExpr<Derived, ValueExpr<internal::FixedInt<-N> > > operator-(internal::FixedInt<N>) const {
+    return AddExpr<Derived, ValueExpr<internal::FixedInt<-N> > >(derived(), ValueExpr<internal::FixedInt<-N> >());
+  }
+  template <int N>
+  ProductExpr<Derived, ValueExpr<internal::FixedInt<N> > > operator*(internal::FixedInt<N>) const {
+    return ProductExpr<Derived, ValueExpr<internal::FixedInt<N> > >(derived(), ValueExpr<internal::FixedInt<N> >());
+  }
+  template <int N>
+  QuotientExpr<Derived, ValueExpr<internal::FixedInt<N> > > operator/(internal::FixedInt<N>) const {
+    return QuotientExpr<Derived, ValueExpr<internal::FixedInt<N> > >(derived(), ValueExpr<internal::FixedInt<N> >());
+  }
 
-  template<int N>
-  friend AddExpr<Derived,ValueExpr<internal::FixedInt<N> > > operator+(internal::FixedInt<N>, const BaseExpr& b)
-  { return AddExpr<Derived,ValueExpr<internal::FixedInt<N> > >(b.derived(), ValueExpr<internal::FixedInt<N> >()); }
-  template<int N>
-  friend AddExpr<NegateExpr<Derived>,ValueExpr<internal::FixedInt<N> > > operator-(internal::FixedInt<N>, const BaseExpr& b)
-  { return AddExpr<NegateExpr<Derived>,ValueExpr<internal::FixedInt<N> > >(-b.derived(), ValueExpr<internal::FixedInt<N> >()); }
-  template<int N>
-  friend ProductExpr<ValueExpr<internal::FixedInt<N> >,Derived> operator*(internal::FixedInt<N>, const BaseExpr& b)
-  { return ProductExpr<ValueExpr<internal::FixedInt<N> >,Derived>(ValueExpr<internal::FixedInt<N> >(),b.derived()); }
-  template<int N>
-  friend QuotientExpr<ValueExpr<internal::FixedInt<N> >,Derived> operator/(internal::FixedInt<N>, const BaseExpr& b)
-  { return QuotientExpr<ValueExpr<internal::FixedInt<N> > ,Derived>(ValueExpr<internal::FixedInt<N> >(),b.derived()); }
+  template <int N>
+  friend AddExpr<Derived, ValueExpr<internal::FixedInt<N> > > operator+(internal::FixedInt<N>, const BaseExpr& b) {
+    return AddExpr<Derived, ValueExpr<internal::FixedInt<N> > >(b.derived(), ValueExpr<internal::FixedInt<N> >());
+  }
+  template <int N>
+  friend AddExpr<NegateExpr<Derived>, ValueExpr<internal::FixedInt<N> > > operator-(internal::FixedInt<N>,
+                                                                                    const BaseExpr& b) {
+    return AddExpr<NegateExpr<Derived>, ValueExpr<internal::FixedInt<N> > >(-b.derived(),
+                                                                            ValueExpr<internal::FixedInt<N> >());
+  }
+  template <int N>
+  friend ProductExpr<ValueExpr<internal::FixedInt<N> >, Derived> operator*(internal::FixedInt<N>, const BaseExpr& b) {
+    return ProductExpr<ValueExpr<internal::FixedInt<N> >, Derived>(ValueExpr<internal::FixedInt<N> >(), b.derived());
+  }
+  template <int N>
+  friend QuotientExpr<ValueExpr<internal::FixedInt<N> >, Derived> operator/(internal::FixedInt<N>, const BaseExpr& b) {
+    return QuotientExpr<ValueExpr<internal::FixedInt<N> >, Derived>(ValueExpr<internal::FixedInt<N> >(), b.derived());
+  }
 
+  template <typename OtherDerived>
+  AddExpr<Derived, OtherDerived> operator+(const BaseExpr<OtherDerived>& b) const {
+    return AddExpr<Derived, OtherDerived>(derived(), b.derived());
+  }
 
-  template<typename OtherDerived>
-  AddExpr<Derived,OtherDerived> operator+(const BaseExpr<OtherDerived> &b) const
-  { return AddExpr<Derived,OtherDerived>(derived(),  b.derived()); }
+  template <typename OtherDerived>
+  AddExpr<Derived, NegateExpr<OtherDerived> > operator-(const BaseExpr<OtherDerived>& b) const {
+    return AddExpr<Derived, NegateExpr<OtherDerived> >(derived(), -b.derived());
+  }
 
-  template<typename OtherDerived>
-  AddExpr<Derived,NegateExpr<OtherDerived> > operator-(const BaseExpr<OtherDerived> &b) const
-  { return AddExpr<Derived,NegateExpr<OtherDerived> >(derived(), -b.derived()); }
+  template <typename OtherDerived>
+  ProductExpr<Derived, OtherDerived> operator*(const BaseExpr<OtherDerived>& b) const {
+    return ProductExpr<Derived, OtherDerived>(derived(), b.derived());
+  }
 
-  template<typename OtherDerived>
-  ProductExpr<Derived,OtherDerived> operator*(const BaseExpr<OtherDerived> &b) const
-  { return ProductExpr<Derived,OtherDerived>(derived(), b.derived()); }
-
-  template<typename OtherDerived>
-  QuotientExpr<Derived,OtherDerived> operator/(const BaseExpr<OtherDerived> &b) const
-  { return QuotientExpr<Derived,OtherDerived>(derived(), b.derived()); }
+  template <typename OtherDerived>
+  QuotientExpr<Derived, OtherDerived> operator/(const BaseExpr<OtherDerived>& b) const {
+    return QuotientExpr<Derived, OtherDerived>(derived(), b.derived());
+  }
 };
 
-template<typename T>
+template <typename T>
 struct is_symbolic {
-  // BaseExpr has no conversion ctor, so we only have to check whether T can be statically cast to its base class BaseExpr<T>.
-  enum { value = internal::is_convertible<T,BaseExpr<T> >::value };
+  // BaseExpr has no conversion ctor, so we only have to check whether T can be statically cast to its base class
+  // BaseExpr<T>.
+  enum { value = internal::is_convertible<T, BaseExpr<T> >::value };
 };
 
 /** Represents the actual value of a symbol identified by its tag
-  *
-  * It is the return type of SymbolValue::operator=, and most of the time this is only way it is used.
-  */
-template<typename Tag>
-class SymbolValue
-{
-public:
+ *
+ * It is the return type of SymbolValue::operator=, and most of the time this is only way it is used.
+ */
+template <typename Tag>
+class SymbolValue {
+ public:
   /** Default constructor from the value \a val */
   SymbolValue(Index val) : m_value(val) {}
 
   /** \returns the stored value of the symbol */
   Index value() const { return m_value; }
-protected:
+
+ protected:
   Index m_value;
 };
 
 /** Expression of a symbol uniquely identified by the template parameter type \c tag */
-template<typename tag>
-class SymbolExpr : public BaseExpr<SymbolExpr<tag> >
-{
-public:
+template <typename tag>
+class SymbolExpr : public BaseExpr<SymbolExpr<tag> > {
+ public:
   /** Alias to the template parameter \c tag */
   typedef tag Tag;
 
   SymbolExpr() {}
 
   /** Associate the value \a val to the given symbol \c *this, uniquely identified by its \c Tag.
-    *
-    * The returned object should be passed to ExprBase::eval() to evaluate a given expression with this specified runtime-time value.
-    */
-  SymbolValue<Tag> operator=(Index val) const {
-    return SymbolValue<Tag>(val);
-  }
+   *
+   * The returned object should be passed to ExprBase::eval() to evaluate a given expression with this specified
+   * runtime-time value.
+   */
+  SymbolValue<Tag> operator=(Index val) const { return SymbolValue<Tag>(val); }
 
-  Index eval_impl(const SymbolValue<Tag> &values) const { return values.value(); }
+  Index eval_impl(const SymbolValue<Tag>& values) const { return values.value(); }
 
   // C++14 versions suitable for multiple symbols
-  template<typename... Types>
-  Index eval_impl(const std::tuple<Types...>& values) const { return std::get<SymbolValue<Tag> >(values).value(); }
+  template <typename... Types>
+  Index eval_impl(const std::tuple<Types...>& values) const {
+    return std::get<SymbolValue<Tag> >(values).value();
+  }
 };
 
-template<typename Arg0>
-class NegateExpr : public BaseExpr<NegateExpr<Arg0> >
-{
-public:
+template <typename Arg0>
+class NegateExpr : public BaseExpr<NegateExpr<Arg0> > {
+ public:
   NegateExpr(const Arg0& arg0) : m_arg0(arg0) {}
 
-  template<typename T>
-  Index eval_impl(const T& values) const { return -m_arg0.eval_impl(values); }
-protected:
+  template <typename T>
+  Index eval_impl(const T& values) const {
+    return -m_arg0.eval_impl(values);
+  }
+
+ protected:
   Arg0 m_arg0;
 };
 
-template<typename Arg0, typename Arg1>
-class AddExpr : public BaseExpr<AddExpr<Arg0,Arg1> >
-{
-public:
+template <typename Arg0, typename Arg1>
+class AddExpr : public BaseExpr<AddExpr<Arg0, Arg1> > {
+ public:
   AddExpr(const Arg0& arg0, const Arg1& arg1) : m_arg0(arg0), m_arg1(arg1) {}
 
-  template<typename T>
-  Index eval_impl(const T& values) const { return m_arg0.eval_impl(values) + m_arg1.eval_impl(values); }
-protected:
+  template <typename T>
+  Index eval_impl(const T& values) const {
+    return m_arg0.eval_impl(values) + m_arg1.eval_impl(values);
+  }
+
+ protected:
   Arg0 m_arg0;
   Arg1 m_arg1;
 };
 
-template<typename Arg0, typename Arg1>
-class ProductExpr : public BaseExpr<ProductExpr<Arg0,Arg1> >
-{
-public:
+template <typename Arg0, typename Arg1>
+class ProductExpr : public BaseExpr<ProductExpr<Arg0, Arg1> > {
+ public:
   ProductExpr(const Arg0& arg0, const Arg1& arg1) : m_arg0(arg0), m_arg1(arg1) {}
 
-  template<typename T>
-  Index eval_impl(const T& values) const { return m_arg0.eval_impl(values) * m_arg1.eval_impl(values); }
-protected:
+  template <typename T>
+  Index eval_impl(const T& values) const {
+    return m_arg0.eval_impl(values) * m_arg1.eval_impl(values);
+  }
+
+ protected:
   Arg0 m_arg0;
   Arg1 m_arg1;
 };
 
-template<typename Arg0, typename Arg1>
-class QuotientExpr : public BaseExpr<QuotientExpr<Arg0,Arg1> >
-{
-public:
+template <typename Arg0, typename Arg1>
+class QuotientExpr : public BaseExpr<QuotientExpr<Arg0, Arg1> > {
+ public:
   QuotientExpr(const Arg0& arg0, const Arg1& arg1) : m_arg0(arg0), m_arg1(arg1) {}
 
-  template<typename T>
-  Index eval_impl(const T& values) const { return m_arg0.eval_impl(values) / m_arg1.eval_impl(values); }
-protected:
+  template <typename T>
+  Index eval_impl(const T& values) const {
+    return m_arg0.eval_impl(values) / m_arg1.eval_impl(values);
+  }
+
+ protected:
   Arg0 m_arg0;
   Arg1 m_arg1;
 };
 
-} // end namespace symbolic
+}  // end namespace symbolic
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SYMBOLIC_INDEX_H
+#endif  // EIGEN_SYMBOLIC_INDEX_H
diff --git a/Eigen/src/Core/util/XprHelper.h b/Eigen/src/Core/util/XprHelper.h
index d05e7d1..5b7bdc0 100644
--- a/Eigen/src/Core/util/XprHelper.h
+++ b/Eigen/src/Core/util/XprHelper.h
@@ -18,7 +18,6 @@
 
 namespace internal {
 
-
 // useful for unsigned / signed integer comparisons when idx is intended to be non-negative
 template <typename IndexType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename make_unsigned<IndexType>::type returnUnsignedIndexValue(
@@ -29,8 +28,7 @@
   return static_cast<UnsignedType>(idx);
 }
 
-template <typename IndexDest, typename IndexSrc, 
-          bool IndexDestIsInteger = NumTraits<IndexDest>::IsInteger,
+template <typename IndexDest, typename IndexSrc, bool IndexDestIsInteger = NumTraits<IndexDest>::IsInteger,
           bool IndexDestIsSigned = NumTraits<IndexDest>::IsSigned,
           bool IndexSrcIsInteger = NumTraits<IndexSrc>::IsInteger,
           bool IndexSrcIsSigned = NumTraits<IndexSrc>::IsSigned>
@@ -67,168 +65,171 @@
 }
 
 // true if T can be considered as an integral index (i.e., and integral type or enum)
-template<typename T> struct is_valid_index_type
-{
-  enum { value = internal::is_integral<T>::value || std::is_enum<T>::value
-  };
+template <typename T>
+struct is_valid_index_type {
+  enum { value = internal::is_integral<T>::value || std::is_enum<T>::value };
 };
 
 // true if both types are not valid index types
-template<typename RowIndices, typename ColIndices>
+template <typename RowIndices, typename ColIndices>
 struct valid_indexed_view_overload {
-  enum { value = !(internal::is_valid_index_type<RowIndices>::value && internal::is_valid_index_type<ColIndices>::value) };
+  enum {
+    value = !(internal::is_valid_index_type<RowIndices>::value && internal::is_valid_index_type<ColIndices>::value)
+  };
 };
 
 // promote_scalar_arg is an helper used in operation between an expression and a scalar, like:
 //    expression * scalar
-// Its role is to determine how the type T of the scalar operand should be promoted given the scalar type ExprScalar of the given expression.
-// The IsSupported template parameter must be provided by the caller as: internal::has_ReturnType<ScalarBinaryOpTraits<ExprScalar,T,op> >::value using the proper order for ExprScalar and T.
+// Its role is to determine how the type T of the scalar operand should be promoted given the scalar type ExprScalar of
+// the given expression. The IsSupported template parameter must be provided by the caller as:
+// internal::has_ReturnType<ScalarBinaryOpTraits<ExprScalar,T,op> >::value using the proper order for ExprScalar and T.
 // Then the logic is as follows:
-//  - if the operation is natively supported as defined by IsSupported, then the scalar type is not promoted, and T is returned.
-//  - otherwise, NumTraits<ExprScalar>::Literal is returned if T is implicitly convertible to NumTraits<ExprScalar>::Literal AND that this does not imply a float to integer conversion.
-//  - otherwise, ExprScalar is returned if T is implicitly convertible to ExprScalar AND that this does not imply a float to integer conversion.
-//  - In all other cases, the promoted type is not defined, and the respective operation is thus invalid and not available (SFINAE).
-template<typename ExprScalar,typename T, bool IsSupported>
+//  - if the operation is natively supported as defined by IsSupported, then the scalar type is not promoted, and T is
+//  returned.
+//  - otherwise, NumTraits<ExprScalar>::Literal is returned if T is implicitly convertible to
+//  NumTraits<ExprScalar>::Literal AND that this does not imply a float to integer conversion.
+//  - otherwise, ExprScalar is returned if T is implicitly convertible to ExprScalar AND that this does not imply a
+//  float to integer conversion.
+//  - In all other cases, the promoted type is not defined, and the respective operation is thus invalid and not
+//  available (SFINAE).
+template <typename ExprScalar, typename T, bool IsSupported>
 struct promote_scalar_arg;
 
-template<typename S,typename T>
-struct promote_scalar_arg<S,T,true>
-{
+template <typename S, typename T>
+struct promote_scalar_arg<S, T, true> {
   typedef T type;
 };
 
 // Recursively check safe conversion to PromotedType, and then ExprScalar if they are different.
-template<typename ExprScalar,typename T,typename PromotedType,
-  bool ConvertibleToLiteral = internal::is_convertible<T,PromotedType>::value,
-  bool IsSafe = NumTraits<T>::IsInteger || !NumTraits<PromotedType>::IsInteger>
+template <typename ExprScalar, typename T, typename PromotedType,
+          bool ConvertibleToLiteral = internal::is_convertible<T, PromotedType>::value,
+          bool IsSafe = NumTraits<T>::IsInteger || !NumTraits<PromotedType>::IsInteger>
 struct promote_scalar_arg_unsupported;
 
 // Start recursion with NumTraits<ExprScalar>::Literal
-template<typename S,typename T>
-struct promote_scalar_arg<S,T,false> : promote_scalar_arg_unsupported<S,T,typename NumTraits<S>::Literal> {};
+template <typename S, typename T>
+struct promote_scalar_arg<S, T, false> : promote_scalar_arg_unsupported<S, T, typename NumTraits<S>::Literal> {};
 
 // We found a match!
-template<typename S,typename T, typename PromotedType>
-struct promote_scalar_arg_unsupported<S,T,PromotedType,true,true>
-{
+template <typename S, typename T, typename PromotedType>
+struct promote_scalar_arg_unsupported<S, T, PromotedType, true, true> {
   typedef PromotedType type;
 };
 
 // No match, but no real-to-integer issues, and ExprScalar and current PromotedType are different,
 // so let's try to promote to ExprScalar
-template<typename ExprScalar,typename T, typename PromotedType>
-struct promote_scalar_arg_unsupported<ExprScalar,T,PromotedType,false,true>
-   : promote_scalar_arg_unsupported<ExprScalar,T,ExprScalar>
-{};
+template <typename ExprScalar, typename T, typename PromotedType>
+struct promote_scalar_arg_unsupported<ExprScalar, T, PromotedType, false, true>
+    : promote_scalar_arg_unsupported<ExprScalar, T, ExprScalar> {};
 
 // Unsafe real-to-integer, let's stop.
-template<typename S,typename T, typename PromotedType, bool ConvertibleToLiteral>
-struct promote_scalar_arg_unsupported<S,T,PromotedType,ConvertibleToLiteral,false> {};
+template <typename S, typename T, typename PromotedType, bool ConvertibleToLiteral>
+struct promote_scalar_arg_unsupported<S, T, PromotedType, ConvertibleToLiteral, false> {};
 
 // T is not even convertible to ExprScalar, let's stop.
-template<typename S,typename T>
-struct promote_scalar_arg_unsupported<S,T,S,false,true> {};
+template <typename S, typename T>
+struct promote_scalar_arg_unsupported<S, T, S, false, true> {};
 
-//classes inheriting no_assignment_operator don't generate a default operator=.
-class no_assignment_operator
-{
-  private:
-    no_assignment_operator& operator=(const no_assignment_operator&);
-  protected:
-    EIGEN_DEFAULT_COPY_CONSTRUCTOR(no_assignment_operator)
-    EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(no_assignment_operator)
+// classes inheriting no_assignment_operator don't generate a default operator=.
+class no_assignment_operator {
+ private:
+  no_assignment_operator& operator=(const no_assignment_operator&);
+
+ protected:
+  EIGEN_DEFAULT_COPY_CONSTRUCTOR(no_assignment_operator)
+  EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(no_assignment_operator)
 };
 
 /** \internal return the index type with the largest number of bits */
-template<typename I1, typename I2>
-struct promote_index_type
-{
-  typedef std::conditional_t<(sizeof(I1)<sizeof(I2)), I2, I1> type;
+template <typename I1, typename I2>
+struct promote_index_type {
+  typedef std::conditional_t<(sizeof(I1) < sizeof(I2)), I2, I1> type;
 };
 
 /** \internal If the template parameter Value is Dynamic, this class is just a wrapper around a T variable that
-  * can be accessed using value() and setValue().
-  * Otherwise, this class is an empty structure and value() just returns the template parameter Value.
-  */
-template<typename T, int Value> class variable_if_dynamic
-{
-  public:
-    EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(variable_if_dynamic)
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit variable_if_dynamic(T v) { EIGEN_ONLY_USED_FOR_DEBUG(v); eigen_assert(v == T(Value)); }
-    EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-    T value() { return T(Value); }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-    operator T() const { return T(Value); }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    void setValue(T v) const { EIGEN_ONLY_USED_FOR_DEBUG(v); eigen_assert(v == T(Value)); }
+ * can be accessed using value() and setValue().
+ * Otherwise, this class is an empty structure and value() just returns the template parameter Value.
+ */
+template <typename T, int Value>
+class variable_if_dynamic {
+ public:
+  EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(variable_if_dynamic)
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit variable_if_dynamic(T v) {
+    EIGEN_ONLY_USED_FOR_DEBUG(v);
+    eigen_assert(v == T(Value));
+  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR T value() { return T(Value); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR operator T() const { return T(Value); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void setValue(T v) const {
+    EIGEN_ONLY_USED_FOR_DEBUG(v);
+    eigen_assert(v == T(Value));
+  }
 };
 
-template<typename T> class variable_if_dynamic<T, Dynamic>
-{
-    T m_value;
-  public:
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit variable_if_dynamic(T value = 0) EIGEN_NO_THROW : m_value(value) {}
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T value() const { return m_value; }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE operator T() const { return m_value; }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void setValue(T value) { m_value = value; }
+template <typename T>
+class variable_if_dynamic<T, Dynamic> {
+  T m_value;
+
+ public:
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit variable_if_dynamic(T value = 0) EIGEN_NO_THROW : m_value(value) {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T value() const { return m_value; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE operator T() const { return m_value; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void setValue(T value) { m_value = value; }
 };
 
 /** \internal like variable_if_dynamic but for DynamicIndex
-  */
-template<typename T, int Value> class variable_if_dynamicindex
-{
-  public:
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit variable_if_dynamicindex(T v) { EIGEN_ONLY_USED_FOR_DEBUG(v); eigen_assert(v == T(Value)); }
-    EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-    T value() { return T(Value); }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    void setValue(T) {}
+ */
+template <typename T, int Value>
+class variable_if_dynamicindex {
+ public:
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit variable_if_dynamicindex(T v) {
+    EIGEN_ONLY_USED_FOR_DEBUG(v);
+    eigen_assert(v == T(Value));
+  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE EIGEN_CONSTEXPR T value() { return T(Value); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void setValue(T) {}
 };
 
-template<typename T> class variable_if_dynamicindex<T, DynamicIndex>
-{
-    T m_value;
-    EIGEN_DEVICE_FUNC variable_if_dynamicindex() { eigen_assert(false); }
-  public:
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit variable_if_dynamicindex(T value) : m_value(value) {}
-    EIGEN_DEVICE_FUNC T EIGEN_STRONG_INLINE value() const { return m_value; }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void setValue(T value) { m_value = value; }
+template <typename T>
+class variable_if_dynamicindex<T, DynamicIndex> {
+  T m_value;
+  EIGEN_DEVICE_FUNC variable_if_dynamicindex() { eigen_assert(false); }
+
+ public:
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit variable_if_dynamicindex(T value) : m_value(value) {}
+  EIGEN_DEVICE_FUNC T EIGEN_STRONG_INLINE value() const { return m_value; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void setValue(T value) { m_value = value; }
 };
 
-template<typename T> struct functor_traits
-{
-  enum
-  {
-    Cost = 10,
-    PacketAccess = false,
-    IsRepeatable = false
-  };
+template <typename T>
+struct functor_traits {
+  enum { Cost = 10, PacketAccess = false, IsRepeatable = false };
 };
 
-template<typename T> struct packet_traits;
+template <typename T>
+struct packet_traits;
 
-template<typename T> struct unpacket_traits;
+template <typename T>
+struct unpacket_traits;
 
-template<int Size, typename PacketType,
-         bool Stop = Size==Dynamic || (Size%unpacket_traits<PacketType>::size)==0 || is_same<PacketType,typename unpacket_traits<PacketType>::half>::value>
+template <int Size, typename PacketType,
+          bool Stop = Size == Dynamic || (Size % unpacket_traits<PacketType>::size) == 0 ||
+                      is_same<PacketType, typename unpacket_traits<PacketType>::half>::value>
 struct find_best_packet_helper;
 
-template< int Size, typename PacketType>
-struct find_best_packet_helper<Size,PacketType,true>
-{
+template <int Size, typename PacketType>
+struct find_best_packet_helper<Size, PacketType, true> {
   typedef PacketType type;
 };
 
-template<int Size, typename PacketType>
-struct find_best_packet_helper<Size,PacketType,false>
-{
-  typedef typename find_best_packet_helper<Size,typename unpacket_traits<PacketType>::half>::type type;
+template <int Size, typename PacketType>
+struct find_best_packet_helper<Size, PacketType, false> {
+  typedef typename find_best_packet_helper<Size, typename unpacket_traits<PacketType>::half>::type type;
 };
 
-template<typename T, int Size>
-struct find_best_packet
-{
-  typedef typename find_best_packet_helper<Size,typename packet_traits<T>::type>::type type;
+template <typename T, int Size>
+struct find_best_packet {
+  typedef typename find_best_packet_helper<Size, typename packet_traits<T>::type>::type type;
 };
 
 template <int Size, typename PacketType,
@@ -255,12 +256,12 @@
   static constexpr bool value = (unpacket_traits<type>::size == 1);
 };
 
-#if EIGEN_MAX_STATIC_ALIGN_BYTES>0
+#if EIGEN_MAX_STATIC_ALIGN_BYTES > 0
 constexpr inline int compute_default_alignment_helper(int ArrayBytes, int AlignmentBytes) {
-  if((ArrayBytes % AlignmentBytes) == 0) {
+  if ((ArrayBytes % AlignmentBytes) == 0) {
     return AlignmentBytes;
-  } else if (EIGEN_MIN_ALIGN_BYTES<AlignmentBytes) {
-    return compute_default_alignment_helper(ArrayBytes, AlignmentBytes/2);
+  } else if (EIGEN_MIN_ALIGN_BYTES < AlignmentBytes) {
+    return compute_default_alignment_helper(ArrayBytes, AlignmentBytes / 2);
   } else {
     return 0;
   }
@@ -275,36 +276,36 @@
 }
 #endif
 
-template<typename T, int Size> struct compute_default_alignment {
-  enum { value = compute_default_alignment_helper(Size*sizeof(T), EIGEN_MAX_STATIC_ALIGN_BYTES) };
+template <typename T, int Size>
+struct compute_default_alignment {
+  enum { value = compute_default_alignment_helper(Size * sizeof(T), EIGEN_MAX_STATIC_ALIGN_BYTES) };
 };
 
-template<typename T> struct compute_default_alignment<T,Dynamic> {
+template <typename T>
+struct compute_default_alignment<T, Dynamic> {
   enum { value = EIGEN_MAX_ALIGN_BYTES };
 };
 
-template<typename Scalar_, int Rows_, int Cols_,
-         int Options_ = AutoAlign |
-                          ( (Rows_==1 && Cols_!=1) ? RowMajor
-                          : (Cols_==1 && Rows_!=1) ? ColMajor
-                          : EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION ),
-         int MaxRows_ = Rows_,
-         int MaxCols_ = Cols_
-> class make_proper_matrix_type
-{
-    enum {
-      IsColVector = Cols_==1 && Rows_!=1,
-      IsRowVector = Rows_==1 && Cols_!=1,
-      Options = IsColVector ? (Options_ | ColMajor) & ~RowMajor
+template <typename Scalar_, int Rows_, int Cols_,
+          int Options_ = AutoAlign | ((Rows_ == 1 && Cols_ != 1)   ? RowMajor
+                                      : (Cols_ == 1 && Rows_ != 1) ? ColMajor
+                                                                   : EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION),
+          int MaxRows_ = Rows_, int MaxCols_ = Cols_>
+class make_proper_matrix_type {
+  enum {
+    IsColVector = Cols_ == 1 && Rows_ != 1,
+    IsRowVector = Rows_ == 1 && Cols_ != 1,
+    Options = IsColVector   ? (Options_ | ColMajor) & ~RowMajor
               : IsRowVector ? (Options_ | RowMajor) & ~ColMajor
-              : Options_
-    };
-  public:
-    typedef Matrix<Scalar_, Rows_, Cols_, Options, MaxRows_, MaxCols_> type;
+                            : Options_
+  };
+
+ public:
+  typedef Matrix<Scalar_, Rows_, Cols_, Options, MaxRows_, MaxCols_> type;
 };
 
 constexpr inline unsigned compute_matrix_flags(int Options) {
-  unsigned row_major_bit = Options&RowMajor ? RowMajorBit : 0;
+  unsigned row_major_bit = Options & RowMajor ? RowMajorBit : 0;
   // FIXME currently we still have to handle DirectAccessBit at the expression level to handle DenseCoeffsBase<>
   // and then propagate this information to the evaluator's flags.
   // However, I (Gael) think that DirectAccessBit should only matter at the evaluation stage.
@@ -317,8 +318,8 @@
   return rows * cols;
 }
 
-template<typename XprType> struct size_of_xpr_at_compile_time
-{
+template <typename XprType>
+struct size_of_xpr_at_compile_time {
   enum { ret = size_at_compile_time(traits<XprType>::RowsAtCompileTime, traits<XprType>::ColsAtCompileTime) };
 };
 
@@ -326,189 +327,163 @@
  * whereas eval is a const reference in the case of a matrix
  */
 
-template<typename T, typename StorageKind = typename traits<T>::StorageKind> struct plain_matrix_type;
-template<typename T, typename BaseClassType, int Flags> struct plain_matrix_type_dense;
-template<typename T> struct plain_matrix_type<T,Dense>
-{
-  typedef typename plain_matrix_type_dense<T,typename traits<T>::XprKind, traits<T>::Flags>::type type;
+template <typename T, typename StorageKind = typename traits<T>::StorageKind>
+struct plain_matrix_type;
+template <typename T, typename BaseClassType, int Flags>
+struct plain_matrix_type_dense;
+template <typename T>
+struct plain_matrix_type<T, Dense> {
+  typedef typename plain_matrix_type_dense<T, typename traits<T>::XprKind, traits<T>::Flags>::type type;
 };
-template<typename T> struct plain_matrix_type<T,DiagonalShape>
-{
+template <typename T>
+struct plain_matrix_type<T, DiagonalShape> {
   typedef typename T::PlainObject type;
 };
 
-template<typename T> struct plain_matrix_type<T,SkewSymmetricShape>
-{
+template <typename T>
+struct plain_matrix_type<T, SkewSymmetricShape> {
   typedef typename T::PlainObject type;
 };
 
-template<typename T, int Flags> struct plain_matrix_type_dense<T,MatrixXpr,Flags>
-{
-  typedef Matrix<typename traits<T>::Scalar,
-                traits<T>::RowsAtCompileTime,
-                traits<T>::ColsAtCompileTime,
-                AutoAlign | (Flags&RowMajorBit ? RowMajor : ColMajor),
-                traits<T>::MaxRowsAtCompileTime,
-                traits<T>::MaxColsAtCompileTime
-          > type;
+template <typename T, int Flags>
+struct plain_matrix_type_dense<T, MatrixXpr, Flags> {
+  typedef Matrix<typename traits<T>::Scalar, traits<T>::RowsAtCompileTime, traits<T>::ColsAtCompileTime,
+                 AutoAlign | (Flags & RowMajorBit ? RowMajor : ColMajor), traits<T>::MaxRowsAtCompileTime,
+                 traits<T>::MaxColsAtCompileTime>
+      type;
 };
 
-template<typename T, int Flags> struct plain_matrix_type_dense<T,ArrayXpr,Flags>
-{
-  typedef Array<typename traits<T>::Scalar,
-                traits<T>::RowsAtCompileTime,
-                traits<T>::ColsAtCompileTime,
-                AutoAlign | (Flags&RowMajorBit ? RowMajor : ColMajor),
-                traits<T>::MaxRowsAtCompileTime,
-                traits<T>::MaxColsAtCompileTime
-          > type;
+template <typename T, int Flags>
+struct plain_matrix_type_dense<T, ArrayXpr, Flags> {
+  typedef Array<typename traits<T>::Scalar, traits<T>::RowsAtCompileTime, traits<T>::ColsAtCompileTime,
+                AutoAlign | (Flags & RowMajorBit ? RowMajor : ColMajor), traits<T>::MaxRowsAtCompileTime,
+                traits<T>::MaxColsAtCompileTime>
+      type;
 };
 
 /* eval : the return type of eval(). For matrices, this is just a const reference
  * in order to avoid a useless copy
  */
 
-template<typename T, typename StorageKind = typename traits<T>::StorageKind> struct eval;
+template <typename T, typename StorageKind = typename traits<T>::StorageKind>
+struct eval;
 
-template<typename T> struct eval<T,Dense>
-{
+template <typename T>
+struct eval<T, Dense> {
   typedef typename plain_matrix_type<T>::type type;
-//   typedef typename T::PlainObject type;
-//   typedef T::Matrix<typename traits<T>::Scalar,
-//                 traits<T>::RowsAtCompileTime,
-//                 traits<T>::ColsAtCompileTime,
-//                 AutoAlign | (traits<T>::Flags&RowMajorBit ? RowMajor : ColMajor),
-//                 traits<T>::MaxRowsAtCompileTime,
-//                 traits<T>::MaxColsAtCompileTime
-//           > type;
+  //   typedef typename T::PlainObject type;
+  //   typedef T::Matrix<typename traits<T>::Scalar,
+  //                 traits<T>::RowsAtCompileTime,
+  //                 traits<T>::ColsAtCompileTime,
+  //                 AutoAlign | (traits<T>::Flags&RowMajorBit ? RowMajor : ColMajor),
+  //                 traits<T>::MaxRowsAtCompileTime,
+  //                 traits<T>::MaxColsAtCompileTime
+  //           > type;
 };
 
-template<typename T> struct eval<T,DiagonalShape>
-{
+template <typename T>
+struct eval<T, DiagonalShape> {
   typedef typename plain_matrix_type<T>::type type;
 };
 
-template<typename T> struct eval<T,SkewSymmetricShape>
-{
+template <typename T>
+struct eval<T, SkewSymmetricShape> {
   typedef typename plain_matrix_type<T>::type type;
 };
 
 // for matrices, no need to evaluate, just use a const reference to avoid a useless copy
-template<typename Scalar_, int Rows_, int Cols_, int Options_, int MaxRows_, int MaxCols_>
-struct eval<Matrix<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_>, Dense>
-{
+template <typename Scalar_, int Rows_, int Cols_, int Options_, int MaxRows_, int MaxCols_>
+struct eval<Matrix<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_>, Dense> {
   typedef const Matrix<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_>& type;
 };
 
-template<typename Scalar_, int Rows_, int Cols_, int Options_, int MaxRows_, int MaxCols_>
-struct eval<Array<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_>, Dense>
-{
+template <typename Scalar_, int Rows_, int Cols_, int Options_, int MaxRows_, int MaxCols_>
+struct eval<Array<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_>, Dense> {
   typedef const Array<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_>& type;
 };
 
-
 /* similar to plain_matrix_type, but using the evaluator's Flags */
-template<typename T, typename StorageKind = typename traits<T>::StorageKind> struct plain_object_eval;
+template <typename T, typename StorageKind = typename traits<T>::StorageKind>
+struct plain_object_eval;
 
-template<typename T>
-struct plain_object_eval<T,Dense>
-{
-  typedef typename plain_matrix_type_dense<T,typename traits<T>::XprKind, evaluator<T>::Flags>::type type;
+template <typename T>
+struct plain_object_eval<T, Dense> {
+  typedef typename plain_matrix_type_dense<T, typename traits<T>::XprKind, evaluator<T>::Flags>::type type;
 };
 
-
 /* plain_matrix_type_column_major : same as plain_matrix_type but guaranteed to be column-major
  */
-template<typename T> struct plain_matrix_type_column_major
-{
-  enum { Rows = traits<T>::RowsAtCompileTime,
-         Cols = traits<T>::ColsAtCompileTime,
-         MaxRows = traits<T>::MaxRowsAtCompileTime,
-         MaxCols = traits<T>::MaxColsAtCompileTime
+template <typename T>
+struct plain_matrix_type_column_major {
+  enum {
+    Rows = traits<T>::RowsAtCompileTime,
+    Cols = traits<T>::ColsAtCompileTime,
+    MaxRows = traits<T>::MaxRowsAtCompileTime,
+    MaxCols = traits<T>::MaxColsAtCompileTime
   };
-  typedef Matrix<typename traits<T>::Scalar,
-                Rows,
-                Cols,
-                (MaxRows==1&&MaxCols!=1) ? RowMajor : ColMajor,
-                MaxRows,
-                MaxCols
-          > type;
+  typedef Matrix<typename traits<T>::Scalar, Rows, Cols, (MaxRows == 1 && MaxCols != 1) ? RowMajor : ColMajor, MaxRows,
+                 MaxCols>
+      type;
 };
 
 /* plain_matrix_type_row_major : same as plain_matrix_type but guaranteed to be row-major
  */
-template<typename T> struct plain_matrix_type_row_major
-{
-  enum { Rows = traits<T>::RowsAtCompileTime,
-         Cols = traits<T>::ColsAtCompileTime,
-         MaxRows = traits<T>::MaxRowsAtCompileTime,
-         MaxCols = traits<T>::MaxColsAtCompileTime
+template <typename T>
+struct plain_matrix_type_row_major {
+  enum {
+    Rows = traits<T>::RowsAtCompileTime,
+    Cols = traits<T>::ColsAtCompileTime,
+    MaxRows = traits<T>::MaxRowsAtCompileTime,
+    MaxCols = traits<T>::MaxColsAtCompileTime
   };
-  typedef Matrix<typename traits<T>::Scalar,
-                Rows,
-                Cols,
-                (MaxCols==1&&MaxRows!=1) ? ColMajor : RowMajor,
-                MaxRows,
-                MaxCols
-          > type;
+  typedef Matrix<typename traits<T>::Scalar, Rows, Cols, (MaxCols == 1 && MaxRows != 1) ? ColMajor : RowMajor, MaxRows,
+                 MaxCols>
+      type;
 };
 
 /** \internal The reference selector for template expressions. The idea is that we don't
-  * need to use references for expressions since they are light weight proxy
-  * objects which should generate no copying overhead. */
+ * need to use references for expressions since they are light weight proxy
+ * objects which should generate no copying overhead. */
 template <typename T>
-struct ref_selector
-{
-  typedef std::conditional_t<
-    bool(traits<T>::Flags & NestByRefBit),
-    T const&,
-    const T
-  > type;
+struct ref_selector {
+  typedef std::conditional_t<bool(traits<T>::Flags& NestByRefBit), T const&, const T> type;
 
-  typedef std::conditional_t<
-    bool(traits<T>::Flags & NestByRefBit),
-    T &,
-    T
-  > non_const_type;
+  typedef std::conditional_t<bool(traits<T>::Flags& NestByRefBit), T&, T> non_const_type;
 };
 
 /** \internal Adds the const qualifier on the value-type of T2 if and only if T1 is a const type */
-template<typename T1, typename T2>
-struct transfer_constness
-{
-  typedef std::conditional_t<
-    bool(internal::is_const<T1>::value),
-    add_const_on_value_type_t<T2>,
-    T2
-  > type;
+template <typename T1, typename T2>
+struct transfer_constness {
+  typedef std::conditional_t<bool(internal::is_const<T1>::value), add_const_on_value_type_t<T2>, T2> type;
 };
 
-
 // However, we still need a mechanism to detect whether an expression which is evaluated multiple time
 // has to be evaluated into a temporary.
 // That's the purpose of this new nested_eval helper:
 /** \internal Determines how a given expression should be nested when evaluated multiple times.
-  * For example, when you do a * (b+c), Eigen will determine how the expression b+c should be
-  * evaluated into the bigger product expression. The choice is between nesting the expression b+c as-is, or
-  * evaluating that expression b+c into a temporary variable d, and nest d so that the resulting expression is
-  * a*d. Evaluating can be beneficial for example if every coefficient access in the resulting expression causes
-  * many coefficient accesses in the nested expressions -- as is the case with matrix product for example.
-  *
-  * \tparam T the type of the expression being nested.
-  * \tparam n the number of coefficient accesses in the nested expression for each coefficient access in the bigger expression.
-  * \tparam PlainObject the type of the temporary if needed.
-  */
-template<typename T, int n, typename PlainObject = typename plain_object_eval<T>::type> struct nested_eval
-{
+ * For example, when you do a * (b+c), Eigen will determine how the expression b+c should be
+ * evaluated into the bigger product expression. The choice is between nesting the expression b+c as-is, or
+ * evaluating that expression b+c into a temporary variable d, and nest d so that the resulting expression is
+ * a*d. Evaluating can be beneficial for example if every coefficient access in the resulting expression causes
+ * many coefficient accesses in the nested expressions -- as is the case with matrix product for example.
+ *
+ * \tparam T the type of the expression being nested.
+ * \tparam n the number of coefficient accesses in the nested expression for each coefficient access in the bigger
+ * expression. \tparam PlainObject the type of the temporary if needed.
+ */
+template <typename T, int n, typename PlainObject = typename plain_object_eval<T>::type>
+struct nested_eval {
   enum {
     ScalarReadCost = NumTraits<typename traits<T>::Scalar>::ReadCost,
-    CoeffReadCost = evaluator<T>::CoeffReadCost,  // NOTE What if an evaluator evaluate itself into a temporary?
-                                                  //      Then CoeffReadCost will be small (e.g., 1) but we still have to evaluate, especially if n>1.
-                                                  //      This situation is already taken care by the EvalBeforeNestingBit flag, which is turned ON
-                                                  //      for all evaluator creating a temporary. This flag is then propagated by the parent evaluators.
-                                                  //      Another solution could be to count the number of temps?
+    CoeffReadCost =
+        evaluator<T>::CoeffReadCost,  // NOTE What if an evaluator evaluate itself into a temporary?
+                                      //      Then CoeffReadCost will be small (e.g., 1) but we still have to evaluate,
+                                      //      especially if n>1. This situation is already taken care by the
+                                      //      EvalBeforeNestingBit flag, which is turned ON for all evaluator creating a
+                                      //      temporary. This flag is then propagated by the parent evaluators. Another
+                                      //      solution could be to count the number of temps?
     NAsInteger = n == Dynamic ? HugeCost : n,
-    CostEval   = (NAsInteger+1) * ScalarReadCost + CoeffReadCost,
+    CostEval = (NAsInteger + 1) * ScalarReadCost + CoeffReadCost,
     CostNoEval = NAsInteger * CoeffReadCost,
     Evaluate = (int(evaluator<T>::Flags) & EvalBeforeNestingBit) || (int(CostEval) < int(CostNoEval))
   };
@@ -516,358 +491,456 @@
   typedef std::conditional_t<Evaluate, PlainObject, typename ref_selector<T>::type> type;
 };
 
-template<typename T>
-EIGEN_DEVICE_FUNC
-inline T* const_cast_ptr(const T* ptr)
-{
+template <typename T>
+EIGEN_DEVICE_FUNC inline T* const_cast_ptr(const T* ptr) {
   return const_cast<T*>(ptr);
 }
 
-template<typename Derived, typename XprKind = typename traits<Derived>::XprKind>
-struct dense_xpr_base
-{
-  /* dense_xpr_base should only ever be used on dense expressions, thus falling either into the MatrixXpr or into the ArrayXpr cases */
+template <typename Derived, typename XprKind = typename traits<Derived>::XprKind>
+struct dense_xpr_base {
+  /* dense_xpr_base should only ever be used on dense expressions, thus falling either into the MatrixXpr or into the
+   * ArrayXpr cases */
 };
 
-template<typename Derived>
-struct dense_xpr_base<Derived, MatrixXpr>
-{
+template <typename Derived>
+struct dense_xpr_base<Derived, MatrixXpr> {
   typedef MatrixBase<Derived> type;
 };
 
-template<typename Derived>
-struct dense_xpr_base<Derived, ArrayXpr>
-{
+template <typename Derived>
+struct dense_xpr_base<Derived, ArrayXpr> {
   typedef ArrayBase<Derived> type;
 };
 
-template<typename Derived, typename XprKind = typename traits<Derived>::XprKind, typename StorageKind = typename traits<Derived>::StorageKind>
+template <typename Derived, typename XprKind = typename traits<Derived>::XprKind,
+          typename StorageKind = typename traits<Derived>::StorageKind>
 struct generic_xpr_base;
 
-template<typename Derived, typename XprKind>
-struct generic_xpr_base<Derived, XprKind, Dense>
-{
-  typedef typename dense_xpr_base<Derived,XprKind>::type type;
+template <typename Derived, typename XprKind>
+struct generic_xpr_base<Derived, XprKind, Dense> {
+  typedef typename dense_xpr_base<Derived, XprKind>::type type;
 };
 
-template<typename XprType, typename CastType> struct cast_return_type
-{
+template <typename XprType, typename CastType>
+struct cast_return_type {
   typedef typename XprType::Scalar CurrentScalarType;
   typedef remove_all_t<CastType> CastType_;
   typedef typename CastType_::Scalar NewScalarType;
-  typedef std::conditional_t<is_same<CurrentScalarType,NewScalarType>::value,
-                              const XprType&,CastType> type;
+  typedef std::conditional_t<is_same<CurrentScalarType, NewScalarType>::value, const XprType&, CastType> type;
 };
 
-template <typename A, typename B> struct promote_storage_type;
+template <typename A, typename B>
+struct promote_storage_type;
 
-template <typename A> struct promote_storage_type<A,A>
-{
+template <typename A>
+struct promote_storage_type<A, A> {
   typedef A ret;
 };
-template <typename A> struct promote_storage_type<A, const A>
-{
+template <typename A>
+struct promote_storage_type<A, const A> {
   typedef A ret;
 };
-template <typename A> struct promote_storage_type<const A, A>
-{
+template <typename A>
+struct promote_storage_type<const A, A> {
   typedef A ret;
 };
 
 /** \internal Specify the "storage kind" of applying a coefficient-wise
-  * binary operations between two expressions of kinds A and B respectively.
-  * The template parameter Functor permits to specialize the resulting storage kind wrt to
-  * the functor.
-  * The default rules are as follows:
-  * \code
-  * A      op A      -> A
-  * A      op dense  -> dense
-  * dense  op B      -> dense
-  * sparse op dense  -> sparse
-  * dense  op sparse -> sparse
-  * \endcode
-  */
-template <typename A, typename B, typename Functor> struct cwise_promote_storage_type;
+ * binary operations between two expressions of kinds A and B respectively.
+ * The template parameter Functor permits to specialize the resulting storage kind wrt to
+ * the functor.
+ * The default rules are as follows:
+ * \code
+ * A      op A      -> A
+ * A      op dense  -> dense
+ * dense  op B      -> dense
+ * sparse op dense  -> sparse
+ * dense  op sparse -> sparse
+ * \endcode
+ */
+template <typename A, typename B, typename Functor>
+struct cwise_promote_storage_type;
 
-template <typename A, typename Functor>                   struct cwise_promote_storage_type<A,A,Functor>                                      { typedef A      ret; };
-template <typename Functor>                               struct cwise_promote_storage_type<Dense,Dense,Functor>                              { typedef Dense  ret; };
-template <typename A, typename Functor>                   struct cwise_promote_storage_type<A,Dense,Functor>                                  { typedef Dense  ret; };
-template <typename B, typename Functor>                   struct cwise_promote_storage_type<Dense,B,Functor>                                  { typedef Dense  ret; };
-template <typename Functor>                               struct cwise_promote_storage_type<Sparse,Dense,Functor>                             { typedef Sparse ret; };
-template <typename Functor>                               struct cwise_promote_storage_type<Dense,Sparse,Functor>                             { typedef Sparse ret; };
+template <typename A, typename Functor>
+struct cwise_promote_storage_type<A, A, Functor> {
+  typedef A ret;
+};
+template <typename Functor>
+struct cwise_promote_storage_type<Dense, Dense, Functor> {
+  typedef Dense ret;
+};
+template <typename A, typename Functor>
+struct cwise_promote_storage_type<A, Dense, Functor> {
+  typedef Dense ret;
+};
+template <typename B, typename Functor>
+struct cwise_promote_storage_type<Dense, B, Functor> {
+  typedef Dense ret;
+};
+template <typename Functor>
+struct cwise_promote_storage_type<Sparse, Dense, Functor> {
+  typedef Sparse ret;
+};
+template <typename Functor>
+struct cwise_promote_storage_type<Dense, Sparse, Functor> {
+  typedef Sparse ret;
+};
 
-template <typename LhsKind, typename RhsKind, int LhsOrder, int RhsOrder> struct cwise_promote_storage_order {
+template <typename LhsKind, typename RhsKind, int LhsOrder, int RhsOrder>
+struct cwise_promote_storage_order {
   enum { value = LhsOrder };
 };
 
-template <typename LhsKind, int LhsOrder, int RhsOrder>   struct cwise_promote_storage_order<LhsKind,Sparse,LhsOrder,RhsOrder>                { enum { value = RhsOrder }; };
-template <typename RhsKind, int LhsOrder, int RhsOrder>   struct cwise_promote_storage_order<Sparse,RhsKind,LhsOrder,RhsOrder>                { enum { value = LhsOrder }; };
-template <int Order>                                      struct cwise_promote_storage_order<Sparse,Sparse,Order,Order>                       { enum { value = Order }; };
-
+template <typename LhsKind, int LhsOrder, int RhsOrder>
+struct cwise_promote_storage_order<LhsKind, Sparse, LhsOrder, RhsOrder> {
+  enum { value = RhsOrder };
+};
+template <typename RhsKind, int LhsOrder, int RhsOrder>
+struct cwise_promote_storage_order<Sparse, RhsKind, LhsOrder, RhsOrder> {
+  enum { value = LhsOrder };
+};
+template <int Order>
+struct cwise_promote_storage_order<Sparse, Sparse, Order, Order> {
+  enum { value = Order };
+};
 
 /** \internal Specify the "storage kind" of multiplying an expression of kind A with kind B.
-  * The template parameter ProductTag permits to specialize the resulting storage kind wrt to
-  * some compile-time properties of the product: GemmProduct, GemvProduct, OuterProduct, InnerProduct.
-  * The default rules are as follows:
-  * \code
-  *  K * K            -> K
-  *  dense * K        -> dense
-  *  K * dense        -> dense
-  *  diag * K         -> K
-  *  K * diag         -> K
-  *  Perm * K         -> K
-  * K * Perm          -> K
-  * \endcode
-  */
-template <typename A, typename B, int ProductTag> struct product_promote_storage_type;
+ * The template parameter ProductTag permits to specialize the resulting storage kind wrt to
+ * some compile-time properties of the product: GemmProduct, GemvProduct, OuterProduct, InnerProduct.
+ * The default rules are as follows:
+ * \code
+ *  K * K            -> K
+ *  dense * K        -> dense
+ *  K * dense        -> dense
+ *  diag * K         -> K
+ *  K * diag         -> K
+ *  Perm * K         -> K
+ * K * Perm          -> K
+ * \endcode
+ */
+template <typename A, typename B, int ProductTag>
+struct product_promote_storage_type;
 
-template <typename A, int ProductTag> struct product_promote_storage_type<A,                  A,                  ProductTag> { typedef A     ret;};
-template <int ProductTag>             struct product_promote_storage_type<Dense,              Dense,              ProductTag> { typedef Dense ret;};
-template <typename A, int ProductTag> struct product_promote_storage_type<A,                  Dense,              ProductTag> { typedef Dense ret; };
-template <typename B, int ProductTag> struct product_promote_storage_type<Dense,              B,                  ProductTag> { typedef Dense ret; };
+template <typename A, int ProductTag>
+struct product_promote_storage_type<A, A, ProductTag> {
+  typedef A ret;
+};
+template <int ProductTag>
+struct product_promote_storage_type<Dense, Dense, ProductTag> {
+  typedef Dense ret;
+};
+template <typename A, int ProductTag>
+struct product_promote_storage_type<A, Dense, ProductTag> {
+  typedef Dense ret;
+};
+template <typename B, int ProductTag>
+struct product_promote_storage_type<Dense, B, ProductTag> {
+  typedef Dense ret;
+};
 
-template <typename A, int ProductTag> struct product_promote_storage_type<A,                  DiagonalShape,      ProductTag> { typedef A ret; };
-template <typename B, int ProductTag> struct product_promote_storage_type<DiagonalShape,      B,                  ProductTag> { typedef B ret; };
-template <int ProductTag>             struct product_promote_storage_type<Dense,              DiagonalShape,      ProductTag> { typedef Dense ret; };
-template <int ProductTag>             struct product_promote_storage_type<DiagonalShape,      Dense,              ProductTag> { typedef Dense ret; };
+template <typename A, int ProductTag>
+struct product_promote_storage_type<A, DiagonalShape, ProductTag> {
+  typedef A ret;
+};
+template <typename B, int ProductTag>
+struct product_promote_storage_type<DiagonalShape, B, ProductTag> {
+  typedef B ret;
+};
+template <int ProductTag>
+struct product_promote_storage_type<Dense, DiagonalShape, ProductTag> {
+  typedef Dense ret;
+};
+template <int ProductTag>
+struct product_promote_storage_type<DiagonalShape, Dense, ProductTag> {
+  typedef Dense ret;
+};
 
-template <typename A, int ProductTag> struct product_promote_storage_type<A,                  SkewSymmetricShape, ProductTag> { typedef A ret; };
-template <typename B, int ProductTag> struct product_promote_storage_type<SkewSymmetricShape, B,                  ProductTag> { typedef B ret; };
-template <int ProductTag>             struct product_promote_storage_type<Dense,              SkewSymmetricShape, ProductTag> { typedef Dense ret; };
-template <int ProductTag>             struct product_promote_storage_type<SkewSymmetricShape, Dense,              ProductTag> { typedef Dense ret; };
-template <int ProductTag>             struct product_promote_storage_type<SkewSymmetricShape, SkewSymmetricShape, ProductTag> { typedef Dense ret; };
+template <typename A, int ProductTag>
+struct product_promote_storage_type<A, SkewSymmetricShape, ProductTag> {
+  typedef A ret;
+};
+template <typename B, int ProductTag>
+struct product_promote_storage_type<SkewSymmetricShape, B, ProductTag> {
+  typedef B ret;
+};
+template <int ProductTag>
+struct product_promote_storage_type<Dense, SkewSymmetricShape, ProductTag> {
+  typedef Dense ret;
+};
+template <int ProductTag>
+struct product_promote_storage_type<SkewSymmetricShape, Dense, ProductTag> {
+  typedef Dense ret;
+};
+template <int ProductTag>
+struct product_promote_storage_type<SkewSymmetricShape, SkewSymmetricShape, ProductTag> {
+  typedef Dense ret;
+};
 
-template <typename A, int ProductTag> struct product_promote_storage_type<A,                  PermutationStorage, ProductTag> { typedef A ret; };
-template <typename B, int ProductTag> struct product_promote_storage_type<PermutationStorage, B,                  ProductTag> { typedef B ret; };
-template <int ProductTag>             struct product_promote_storage_type<Dense,              PermutationStorage, ProductTag> { typedef Dense ret; };
-template <int ProductTag>             struct product_promote_storage_type<PermutationStorage, Dense,              ProductTag> { typedef Dense ret; };
+template <typename A, int ProductTag>
+struct product_promote_storage_type<A, PermutationStorage, ProductTag> {
+  typedef A ret;
+};
+template <typename B, int ProductTag>
+struct product_promote_storage_type<PermutationStorage, B, ProductTag> {
+  typedef B ret;
+};
+template <int ProductTag>
+struct product_promote_storage_type<Dense, PermutationStorage, ProductTag> {
+  typedef Dense ret;
+};
+template <int ProductTag>
+struct product_promote_storage_type<PermutationStorage, Dense, ProductTag> {
+  typedef Dense ret;
+};
 
 /** \internal gives the plain matrix or array type to store a row/column/diagonal of a matrix type.
-  * \tparam Scalar optional parameter allowing to pass a different scalar type than the one of the MatrixType.
-  */
-template<typename ExpressionType, typename Scalar = typename ExpressionType::Scalar>
-struct plain_row_type
-{
+ * \tparam Scalar optional parameter allowing to pass a different scalar type than the one of the MatrixType.
+ */
+template <typename ExpressionType, typename Scalar = typename ExpressionType::Scalar>
+struct plain_row_type {
   typedef Matrix<Scalar, 1, ExpressionType::ColsAtCompileTime,
-                 int(ExpressionType::PlainObject::Options) | int(RowMajor), 1, ExpressionType::MaxColsAtCompileTime> MatrixRowType;
-  typedef Array<Scalar, 1, ExpressionType::ColsAtCompileTime,
-                 int(ExpressionType::PlainObject::Options) | int(RowMajor), 1, ExpressionType::MaxColsAtCompileTime> ArrayRowType;
+                 int(ExpressionType::PlainObject::Options) | int(RowMajor), 1, ExpressionType::MaxColsAtCompileTime>
+      MatrixRowType;
+  typedef Array<Scalar, 1, ExpressionType::ColsAtCompileTime, int(ExpressionType::PlainObject::Options) | int(RowMajor),
+                1, ExpressionType::MaxColsAtCompileTime>
+      ArrayRowType;
 
-  typedef std::conditional_t<
-    is_same< typename traits<ExpressionType>::XprKind, MatrixXpr >::value,
-    MatrixRowType,
-    ArrayRowType
-  > type;
+  typedef std::conditional_t<is_same<typename traits<ExpressionType>::XprKind, MatrixXpr>::value, MatrixRowType,
+                             ArrayRowType>
+      type;
 };
 
-template<typename ExpressionType, typename Scalar = typename ExpressionType::Scalar>
-struct plain_col_type
-{
-  typedef Matrix<Scalar, ExpressionType::RowsAtCompileTime, 1,
-                 ExpressionType::PlainObject::Options & ~RowMajor, ExpressionType::MaxRowsAtCompileTime, 1> MatrixColType;
-  typedef Array<Scalar, ExpressionType::RowsAtCompileTime, 1,
-                 ExpressionType::PlainObject::Options & ~RowMajor, ExpressionType::MaxRowsAtCompileTime, 1> ArrayColType;
+template <typename ExpressionType, typename Scalar = typename ExpressionType::Scalar>
+struct plain_col_type {
+  typedef Matrix<Scalar, ExpressionType::RowsAtCompileTime, 1, ExpressionType::PlainObject::Options & ~RowMajor,
+                 ExpressionType::MaxRowsAtCompileTime, 1>
+      MatrixColType;
+  typedef Array<Scalar, ExpressionType::RowsAtCompileTime, 1, ExpressionType::PlainObject::Options & ~RowMajor,
+                ExpressionType::MaxRowsAtCompileTime, 1>
+      ArrayColType;
 
-  typedef std::conditional_t<
-    is_same< typename traits<ExpressionType>::XprKind, MatrixXpr >::value,
-    MatrixColType,
-    ArrayColType
-  > type;
+  typedef std::conditional_t<is_same<typename traits<ExpressionType>::XprKind, MatrixXpr>::value, MatrixColType,
+                             ArrayColType>
+      type;
 };
 
-template<typename ExpressionType, typename Scalar = typename ExpressionType::Scalar>
-struct plain_diag_type
-{
-  enum { diag_size = internal::min_size_prefer_dynamic(ExpressionType::RowsAtCompileTime, ExpressionType::ColsAtCompileTime),
-         max_diag_size = min_size_prefer_fixed(ExpressionType::MaxRowsAtCompileTime,
-                                               ExpressionType::MaxColsAtCompileTime)
+template <typename ExpressionType, typename Scalar = typename ExpressionType::Scalar>
+struct plain_diag_type {
+  enum {
+    diag_size = internal::min_size_prefer_dynamic(ExpressionType::RowsAtCompileTime, ExpressionType::ColsAtCompileTime),
+    max_diag_size = min_size_prefer_fixed(ExpressionType::MaxRowsAtCompileTime, ExpressionType::MaxColsAtCompileTime)
   };
-  typedef Matrix<Scalar, diag_size, 1, ExpressionType::PlainObject::Options & ~RowMajor, max_diag_size, 1> MatrixDiagType;
+  typedef Matrix<Scalar, diag_size, 1, ExpressionType::PlainObject::Options & ~RowMajor, max_diag_size, 1>
+      MatrixDiagType;
   typedef Array<Scalar, diag_size, 1, ExpressionType::PlainObject::Options & ~RowMajor, max_diag_size, 1> ArrayDiagType;
 
-  typedef std::conditional_t<
-    is_same< typename traits<ExpressionType>::XprKind, MatrixXpr >::value,
-    MatrixDiagType,
-    ArrayDiagType
-  > type;
+  typedef std::conditional_t<is_same<typename traits<ExpressionType>::XprKind, MatrixXpr>::value, MatrixDiagType,
+                             ArrayDiagType>
+      type;
 };
 
-template<typename Expr,typename Scalar = typename Expr::Scalar>
-struct plain_constant_type
-{
-  enum { Options = (traits<Expr>::Flags&RowMajorBit)?RowMajor:0 };
+template <typename Expr, typename Scalar = typename Expr::Scalar>
+struct plain_constant_type {
+  enum { Options = (traits<Expr>::Flags & RowMajorBit) ? RowMajor : 0 };
 
-  typedef Array<Scalar,  traits<Expr>::RowsAtCompileTime,   traits<Expr>::ColsAtCompileTime,
-                Options, traits<Expr>::MaxRowsAtCompileTime,traits<Expr>::MaxColsAtCompileTime> array_type;
+  typedef Array<Scalar, traits<Expr>::RowsAtCompileTime, traits<Expr>::ColsAtCompileTime, Options,
+                traits<Expr>::MaxRowsAtCompileTime, traits<Expr>::MaxColsAtCompileTime>
+      array_type;
 
-  typedef Matrix<Scalar,  traits<Expr>::RowsAtCompileTime,   traits<Expr>::ColsAtCompileTime,
-                 Options, traits<Expr>::MaxRowsAtCompileTime,traits<Expr>::MaxColsAtCompileTime> matrix_type;
+  typedef Matrix<Scalar, traits<Expr>::RowsAtCompileTime, traits<Expr>::ColsAtCompileTime, Options,
+                 traits<Expr>::MaxRowsAtCompileTime, traits<Expr>::MaxColsAtCompileTime>
+      matrix_type;
 
-  typedef CwiseNullaryOp<scalar_constant_op<Scalar>, const std::conditional_t<is_same< typename traits<Expr>::XprKind, MatrixXpr >::value, matrix_type, array_type> > type;
+  typedef CwiseNullaryOp<
+      scalar_constant_op<Scalar>,
+      const std::conditional_t<is_same<typename traits<Expr>::XprKind, MatrixXpr>::value, matrix_type, array_type>>
+      type;
 };
 
-template<typename ExpressionType>
-struct is_lvalue
-{
-  enum { value = (!bool(is_const<ExpressionType>::value)) &&
-                 bool(traits<ExpressionType>::Flags & LvalueBit) };
+template <typename ExpressionType>
+struct is_lvalue {
+  enum { value = (!bool(is_const<ExpressionType>::value)) && bool(traits<ExpressionType>::Flags & LvalueBit) };
 };
 
-template<typename T> struct is_diagonal
-{ enum { ret = false }; };
+template <typename T>
+struct is_diagonal {
+  enum { ret = false };
+};
 
-template<typename T> struct is_diagonal<DiagonalBase<T> >
-{ enum { ret = true }; };
+template <typename T>
+struct is_diagonal<DiagonalBase<T>> {
+  enum { ret = true };
+};
 
-template<typename T> struct is_diagonal<DiagonalWrapper<T> >
-{ enum { ret = true }; };
+template <typename T>
+struct is_diagonal<DiagonalWrapper<T>> {
+  enum { ret = true };
+};
 
-template<typename T, int S> struct is_diagonal<DiagonalMatrix<T,S> >
-{ enum { ret = true }; };
+template <typename T, int S>
+struct is_diagonal<DiagonalMatrix<T, S>> {
+  enum { ret = true };
+};
 
+template <typename T>
+struct is_identity {
+  enum { value = false };
+};
 
-template<typename T> struct is_identity
-{ enum { value = false }; };
+template <typename T>
+struct is_identity<CwiseNullaryOp<internal::scalar_identity_op<typename T::Scalar>, T>> {
+  enum { value = true };
+};
 
-template<typename T> struct is_identity<CwiseNullaryOp<internal::scalar_identity_op<typename T::Scalar>, T> >
-{ enum { value = true }; };
+template <typename S1, typename S2>
+struct glue_shapes;
+template <>
+struct glue_shapes<DenseShape, TriangularShape> {
+  typedef TriangularShape type;
+};
 
-
-template<typename S1, typename S2> struct glue_shapes;
-template<> struct glue_shapes<DenseShape,TriangularShape> { typedef TriangularShape type;  };
-
-template<typename T1, typename T2>
+template <typename T1, typename T2>
 struct possibly_same_dense {
-  enum { value = has_direct_access<T1>::ret && has_direct_access<T2>::ret && is_same<typename T1::Scalar,typename T2::Scalar>::value };
+  enum {
+    value = has_direct_access<T1>::ret && has_direct_access<T2>::ret &&
+            is_same<typename T1::Scalar, typename T2::Scalar>::value
+  };
 };
 
-template<typename T1, typename T2>
-EIGEN_DEVICE_FUNC
-bool is_same_dense(const T1 &mat1, const T2 &mat2, std::enable_if_t<possibly_same_dense<T1,T2>::value> * = 0)
-{
-  return (mat1.data()==mat2.data()) && (mat1.innerStride()==mat2.innerStride()) && (mat1.outerStride()==mat2.outerStride());
+template <typename T1, typename T2>
+EIGEN_DEVICE_FUNC bool is_same_dense(const T1& mat1, const T2& mat2,
+                                     std::enable_if_t<possibly_same_dense<T1, T2>::value>* = 0) {
+  return (mat1.data() == mat2.data()) && (mat1.innerStride() == mat2.innerStride()) &&
+         (mat1.outerStride() == mat2.outerStride());
 }
 
-template<typename T1, typename T2>
-EIGEN_DEVICE_FUNC
-bool is_same_dense(const T1 &, const T2 &, std::enable_if_t<!possibly_same_dense<T1,T2>::value> * = 0)
-{
+template <typename T1, typename T2>
+EIGEN_DEVICE_FUNC bool is_same_dense(const T1&, const T2&, std::enable_if_t<!possibly_same_dense<T1, T2>::value>* = 0) {
   return false;
 }
 
 // Internal helper defining the cost of a scalar division for the type T.
 // The default heuristic can be specialized for each scalar type and architecture.
-template<typename T,bool Vectorized=false,typename EnableIf = void>
+template <typename T, bool Vectorized = false, typename EnableIf = void>
 struct scalar_div_cost {
-  enum { value = 8*NumTraits<T>::MulCost };
+  enum { value = 8 * NumTraits<T>::MulCost };
 };
 
-template<typename T,bool Vectorized>
+template <typename T, bool Vectorized>
 struct scalar_div_cost<std::complex<T>, Vectorized> {
-  enum { value = 2*scalar_div_cost<T>::value
-               + 6*NumTraits<T>::MulCost
-               + 3*NumTraits<T>::AddCost
-  };
+  enum { value = 2 * scalar_div_cost<T>::value + 6 * NumTraits<T>::MulCost + 3 * NumTraits<T>::AddCost };
 };
 
-
-template<bool Vectorized>
-struct scalar_div_cost<signed long,Vectorized, std::conditional_t<sizeof(long)==8,void,false_type>> { enum { value = 24 }; };
-template<bool Vectorized>
-struct scalar_div_cost<unsigned long,Vectorized, std::conditional_t<sizeof(long)==8,void,false_type>> { enum { value = 21 }; };
-
+template <bool Vectorized>
+struct scalar_div_cost<signed long, Vectorized, std::conditional_t<sizeof(long) == 8, void, false_type>> {
+  enum { value = 24 };
+};
+template <bool Vectorized>
+struct scalar_div_cost<unsigned long, Vectorized, std::conditional_t<sizeof(long) == 8, void, false_type>> {
+  enum { value = 21 };
+};
 
 #ifdef EIGEN_DEBUG_ASSIGN
-std::string demangle_traversal(int t)
-{
-  if(t==DefaultTraversal) return "DefaultTraversal";
-  if(t==LinearTraversal) return "LinearTraversal";
-  if(t==InnerVectorizedTraversal) return "InnerVectorizedTraversal";
-  if(t==LinearVectorizedTraversal) return "LinearVectorizedTraversal";
-  if(t==SliceVectorizedTraversal) return "SliceVectorizedTraversal";
+std::string demangle_traversal(int t) {
+  if (t == DefaultTraversal) return "DefaultTraversal";
+  if (t == LinearTraversal) return "LinearTraversal";
+  if (t == InnerVectorizedTraversal) return "InnerVectorizedTraversal";
+  if (t == LinearVectorizedTraversal) return "LinearVectorizedTraversal";
+  if (t == SliceVectorizedTraversal) return "SliceVectorizedTraversal";
   return "?";
 }
-std::string demangle_unrolling(int t)
-{
-  if(t==NoUnrolling) return "NoUnrolling";
-  if(t==InnerUnrolling) return "InnerUnrolling";
-  if(t==CompleteUnrolling) return "CompleteUnrolling";
+std::string demangle_unrolling(int t) {
+  if (t == NoUnrolling) return "NoUnrolling";
+  if (t == InnerUnrolling) return "InnerUnrolling";
+  if (t == CompleteUnrolling) return "CompleteUnrolling";
   return "?";
 }
-std::string demangle_flags(int f)
-{
+std::string demangle_flags(int f) {
   std::string res;
-  if(f&RowMajorBit)                 res += " | RowMajor";
-  if(f&PacketAccessBit)             res += " | Packet";
-  if(f&LinearAccessBit)             res += " | Linear";
-  if(f&LvalueBit)                   res += " | Lvalue";
-  if(f&DirectAccessBit)             res += " | Direct";
-  if(f&NestByRefBit)                res += " | NestByRef";
-  if(f&NoPreferredStorageOrderBit)  res += " | NoPreferredStorageOrderBit";
+  if (f & RowMajorBit) res += " | RowMajor";
+  if (f & PacketAccessBit) res += " | Packet";
+  if (f & LinearAccessBit) res += " | Linear";
+  if (f & LvalueBit) res += " | Lvalue";
+  if (f & DirectAccessBit) res += " | Direct";
+  if (f & NestByRefBit) res += " | NestByRef";
+  if (f & NoPreferredStorageOrderBit) res += " | NoPreferredStorageOrderBit";
 
   return res;
 }
 #endif
 
-template<typename XprType>
+template <typename XprType>
 struct is_block_xpr : std::false_type {};
 
-template<typename XprType, int BlockRows, int BlockCols, bool InnerPanel>
+template <typename XprType, int BlockRows, int BlockCols, bool InnerPanel>
 struct is_block_xpr<Block<XprType, BlockRows, BlockCols, InnerPanel>> : std::true_type {};
 
 template <typename XprType, int BlockRows, int BlockCols, bool InnerPanel>
 struct is_block_xpr<const Block<XprType, BlockRows, BlockCols, InnerPanel>> : std::true_type {};
 
 // Helper utility for constructing non-recursive block expressions.
-template<typename XprType>
+template <typename XprType>
 struct block_xpr_helper {
   using BaseType = XprType;
 
   // For regular block expressions, simply forward along the InnerPanel argument,
   // which is set when calling row/column expressions.
   static constexpr bool is_inner_panel(bool inner_panel) { return inner_panel; }
-  
+
   // Only enable non-const base function if XprType is not const (otherwise we get a duplicate definition).
-  template<typename T = XprType, typename EnableIf=std::enable_if_t<!std::is_const<T>::value>>
-  static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE BaseType& base(XprType& xpr) { return xpr; }
+  template <typename T = XprType, typename EnableIf = std::enable_if_t<!std::is_const<T>::value>>
+  static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE BaseType& base(XprType& xpr) {
+    return xpr;
+  }
   static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE const BaseType& base(const XprType& xpr) { return xpr; }
   static constexpr EIGEN_ALWAYS_INLINE Index row(const XprType& /*xpr*/, Index r) { return r; }
   static constexpr EIGEN_ALWAYS_INLINE Index col(const XprType& /*xpr*/, Index c) { return c; }
 };
 
-template<typename XprType, int BlockRows, int BlockCols, bool InnerPanel>
+template <typename XprType, int BlockRows, int BlockCols, bool InnerPanel>
 struct block_xpr_helper<Block<XprType, BlockRows, BlockCols, InnerPanel>> {
   using BlockXprType = Block<XprType, BlockRows, BlockCols, InnerPanel>;
   // Recursive helper in case of explicit block-of-block expression.
   using NestedXprHelper = block_xpr_helper<XprType>;
   using BaseType = typename NestedXprHelper::BaseType;
- 
+
   // For block-of-block expressions, we need to combine the InnerPannel trait
   // with that of the block subexpression.
   static constexpr bool is_inner_panel(bool inner_panel) { return InnerPanel && inner_panel; }
 
   // Only enable non-const base function if XprType is not const (otherwise we get a duplicates definition).
-  template<typename T = XprType, typename EnableIf=std::enable_if_t<!std::is_const<T>::value>>
-  static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE BaseType& base(BlockXprType& xpr) { return NestedXprHelper::base(xpr.nestedExpression()); }
-  static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE const BaseType& base(const BlockXprType& xpr) { return NestedXprHelper::base(xpr.nestedExpression()); }
-  static constexpr EIGEN_ALWAYS_INLINE Index row(const BlockXprType& xpr, Index r) { return xpr.startRow() + NestedXprHelper::row(xpr.nestedExpression(), r); }
-  static constexpr EIGEN_ALWAYS_INLINE Index col(const BlockXprType& xpr, Index c) { return xpr.startCol() + NestedXprHelper::col(xpr.nestedExpression(), c); }
+  template <typename T = XprType, typename EnableIf = std::enable_if_t<!std::is_const<T>::value>>
+  static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE BaseType& base(BlockXprType& xpr) {
+    return NestedXprHelper::base(xpr.nestedExpression());
+  }
+  static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE const BaseType& base(const BlockXprType& xpr) {
+    return NestedXprHelper::base(xpr.nestedExpression());
+  }
+  static constexpr EIGEN_ALWAYS_INLINE Index row(const BlockXprType& xpr, Index r) {
+    return xpr.startRow() + NestedXprHelper::row(xpr.nestedExpression(), r);
+  }
+  static constexpr EIGEN_ALWAYS_INLINE Index col(const BlockXprType& xpr, Index c) {
+    return xpr.startCol() + NestedXprHelper::col(xpr.nestedExpression(), c);
+  }
 };
 
-template<typename XprType, int BlockRows, int BlockCols, bool InnerPanel>
-struct block_xpr_helper<const Block<XprType, BlockRows, BlockCols, InnerPanel>> : block_xpr_helper<Block<XprType, BlockRows, BlockCols, InnerPanel>> {};
+template <typename XprType, int BlockRows, int BlockCols, bool InnerPanel>
+struct block_xpr_helper<const Block<XprType, BlockRows, BlockCols, InnerPanel>>
+    : block_xpr_helper<Block<XprType, BlockRows, BlockCols, InnerPanel>> {};
 
-} // end namespace internal
-
+}  // end namespace internal
 
 /** \class ScalarBinaryOpTraits
   * \ingroup Core_Module
   *
-  * \brief Determines whether the given binary operation of two numeric types is allowed and what the scalar return type is.
+  * \brief Determines whether the given binary operation of two numeric types is allowed and what the scalar return type
+  is.
   *
-  * This class permits to control the scalar return type of any binary operation performed on two different scalar types through (partial) template specializations.
+  * This class permits to control the scalar return type of any binary operation performed on two different scalar types
+  through (partial) template specializations.
   *
-  * For instance, let \c U1, \c U2 and \c U3 be three user defined scalar types for which most operations between instances of \c U1 and \c U2 returns an \c U3.
+  * For instance, let \c U1, \c U2 and \c U3 be three user defined scalar types for which most operations between
+  instances of \c U1 and \c U2 returns an \c U3.
   * You can let %Eigen knows that by defining:
     \code
     template<typename BinaryOp>
@@ -890,66 +963,63 @@
   <table class="manual">
   <tr><th>ScalarA</th><th>ScalarB</th><th>BinaryOp</th><th>ReturnType</th><th>Note</th></tr>
   <tr            ><td>\c T </td><td>\c T </td><td>\c * </td><td>\c T </td><td></td></tr>
-  <tr class="alt"><td>\c NumTraits<T>::Real </td><td>\c T </td><td>\c * </td><td>\c T </td><td>Only if \c NumTraits<T>::IsComplex </td></tr>
-  <tr            ><td>\c T </td><td>\c NumTraits<T>::Real </td><td>\c * </td><td>\c T </td><td>Only if \c NumTraits<T>::IsComplex </td></tr>
+  <tr class="alt"><td>\c NumTraits<T>::Real </td><td>\c T </td><td>\c * </td><td>\c T </td><td>Only if \c
+  NumTraits<T>::IsComplex </td></tr> <tr            ><td>\c T </td><td>\c NumTraits<T>::Real </td><td>\c * </td><td>\c T
+  </td><td>Only if \c NumTraits<T>::IsComplex </td></tr>
   </table>
   *
   * \sa CwiseBinaryOp
   */
-template<typename ScalarA, typename ScalarB, typename BinaryOp=internal::scalar_product_op<ScalarA,ScalarB> >
+template <typename ScalarA, typename ScalarB, typename BinaryOp = internal::scalar_product_op<ScalarA, ScalarB>>
 struct ScalarBinaryOpTraits
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-  // for backward compatibility, use the hints given by the (deprecated) internal::scalar_product_traits class.
-  : internal::scalar_product_traits<ScalarA,ScalarB>
-#endif // EIGEN_PARSED_BY_DOXYGEN
-{};
-
-template<typename T, typename BinaryOp>
-struct ScalarBinaryOpTraits<T,T,BinaryOp>
+    // for backward compatibility, use the hints given by the (deprecated) internal::scalar_product_traits class.
+    : internal::scalar_product_traits<ScalarA, ScalarB>
+#endif  // EIGEN_PARSED_BY_DOXYGEN
 {
+};
+
+template <typename T, typename BinaryOp>
+struct ScalarBinaryOpTraits<T, T, BinaryOp> {
   typedef T ReturnType;
 };
 
 template <typename T, typename BinaryOp>
-struct ScalarBinaryOpTraits<T, typename NumTraits<std::enable_if_t<NumTraits<T>::IsComplex,T>>::Real, BinaryOp>
-{
+struct ScalarBinaryOpTraits<T, typename NumTraits<std::enable_if_t<NumTraits<T>::IsComplex, T>>::Real, BinaryOp> {
   typedef T ReturnType;
 };
 template <typename T, typename BinaryOp>
-struct ScalarBinaryOpTraits<typename NumTraits<std::enable_if_t<NumTraits<T>::IsComplex,T>>::Real, T, BinaryOp>
-{
+struct ScalarBinaryOpTraits<typename NumTraits<std::enable_if_t<NumTraits<T>::IsComplex, T>>::Real, T, BinaryOp> {
   typedef T ReturnType;
 };
 
 // For Matrix * Permutation
-template<typename T, typename BinaryOp>
-struct ScalarBinaryOpTraits<T,void,BinaryOp>
-{
+template <typename T, typename BinaryOp>
+struct ScalarBinaryOpTraits<T, void, BinaryOp> {
   typedef T ReturnType;
 };
 
 // For Permutation * Matrix
-template<typename T, typename BinaryOp>
-struct ScalarBinaryOpTraits<void,T,BinaryOp>
-{
+template <typename T, typename BinaryOp>
+struct ScalarBinaryOpTraits<void, T, BinaryOp> {
   typedef T ReturnType;
 };
 
 // for Permutation*Permutation
-template<typename BinaryOp>
-struct ScalarBinaryOpTraits<void,void,BinaryOp>
-{
+template <typename BinaryOp>
+struct ScalarBinaryOpTraits<void, void, BinaryOp> {
   typedef void ReturnType;
 };
 
 // We require Lhs and Rhs to have "compatible" scalar types.
-// It is tempting to always allow mixing different types but remember that this is often impossible in the vectorized paths.
-// So allowing mixing different types gives very unexpected errors when enabling vectorization, when the user tries to
-// add together a float matrix and a double matrix.
-#define EIGEN_CHECK_BINARY_COMPATIBILIY(BINOP,LHS,RHS) \
-  EIGEN_STATIC_ASSERT((Eigen::internal::has_ReturnType<ScalarBinaryOpTraits<LHS, RHS,BINOP> >::value), \
-    YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
+// It is tempting to always allow mixing different types but remember that this is often impossible in the vectorized
+// paths. So allowing mixing different types gives very unexpected errors when enabling vectorization, when the user
+// tries to add together a float matrix and a double matrix.
+#define EIGEN_CHECK_BINARY_COMPATIBILIY(BINOP, LHS, RHS)                               \
+  EIGEN_STATIC_ASSERT(                                                                 \
+      (Eigen::internal::has_ReturnType<ScalarBinaryOpTraits<LHS, RHS, BINOP>>::value), \
+      YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_XPRHELPER_H
+#endif  // EIGEN_XPRHELPER_H
diff --git a/Eigen/src/Eigenvalues/ComplexEigenSolver.h b/Eigen/src/Eigenvalues/ComplexEigenSolver.h
index bf8bc79..6efd3c1 100644
--- a/Eigen/src/Eigenvalues/ComplexEigenSolver.h
+++ b/Eigen/src/Eigenvalues/ComplexEigenSolver.h
@@ -17,249 +17,232 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 /** \eigenvalues_module \ingroup Eigenvalues_Module
-  *
-  *
-  * \class ComplexEigenSolver
-  *
-  * \brief Computes eigenvalues and eigenvectors of general complex matrices
-  *
-  * \tparam MatrixType_ the type of the matrix of which we are
-  * computing the eigendecomposition; this is expected to be an
-  * instantiation of the Matrix class template.
-  *
-  * The eigenvalues and eigenvectors of a matrix \f$ A \f$ are scalars
-  * \f$ \lambda \f$ and vectors \f$ v \f$ such that \f$ Av = \lambda v
-  * \f$.  If \f$ D \f$ is a diagonal matrix with the eigenvalues on
-  * the diagonal, and \f$ V \f$ is a matrix with the eigenvectors as
-  * its columns, then \f$ A V = V D \f$. The matrix \f$ V \f$ is
-  * almost always invertible, in which case we have \f$ A = V D V^{-1}
-  * \f$. This is called the eigendecomposition.
-  *
-  * The main function in this class is compute(), which computes the
-  * eigenvalues and eigenvectors of a given function. The
-  * documentation for that function contains an example showing the
-  * main features of the class.
-  *
-  * \sa class EigenSolver, class SelfAdjointEigenSolver
-  */
-template<typename MatrixType_> class ComplexEigenSolver
-{
-  public:
+ *
+ *
+ * \class ComplexEigenSolver
+ *
+ * \brief Computes eigenvalues and eigenvectors of general complex matrices
+ *
+ * \tparam MatrixType_ the type of the matrix of which we are
+ * computing the eigendecomposition; this is expected to be an
+ * instantiation of the Matrix class template.
+ *
+ * The eigenvalues and eigenvectors of a matrix \f$ A \f$ are scalars
+ * \f$ \lambda \f$ and vectors \f$ v \f$ such that \f$ Av = \lambda v
+ * \f$.  If \f$ D \f$ is a diagonal matrix with the eigenvalues on
+ * the diagonal, and \f$ V \f$ is a matrix with the eigenvectors as
+ * its columns, then \f$ A V = V D \f$. The matrix \f$ V \f$ is
+ * almost always invertible, in which case we have \f$ A = V D V^{-1}
+ * \f$. This is called the eigendecomposition.
+ *
+ * The main function in this class is compute(), which computes the
+ * eigenvalues and eigenvectors of a given function. The
+ * documentation for that function contains an example showing the
+ * main features of the class.
+ *
+ * \sa class EigenSolver, class SelfAdjointEigenSolver
+ */
+template <typename MatrixType_>
+class ComplexEigenSolver {
+ public:
+  /** \brief Synonym for the template parameter \p MatrixType_. */
+  typedef MatrixType_ MatrixType;
 
-    /** \brief Synonym for the template parameter \p MatrixType_. */
-    typedef MatrixType_ MatrixType;
+  enum {
+    RowsAtCompileTime = MatrixType::RowsAtCompileTime,
+    ColsAtCompileTime = MatrixType::ColsAtCompileTime,
+    Options = MatrixType::Options,
+    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
+  };
 
-    enum {
-      RowsAtCompileTime = MatrixType::RowsAtCompileTime,
-      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
-      Options = MatrixType::Options,
-      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
-      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
-    };
+  /** \brief Scalar type for matrices of type #MatrixType. */
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef Eigen::Index Index;  ///< \deprecated since Eigen 3.3
 
-    /** \brief Scalar type for matrices of type #MatrixType. */
-    typedef typename MatrixType::Scalar Scalar;
-    typedef typename NumTraits<Scalar>::Real RealScalar;
-    typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3
+  /** \brief Complex scalar type for #MatrixType.
+   *
+   * This is \c std::complex<Scalar> if #Scalar is real (e.g.,
+   * \c float or \c double) and just \c Scalar if #Scalar is
+   * complex.
+   */
+  typedef std::complex<RealScalar> ComplexScalar;
 
-    /** \brief Complex scalar type for #MatrixType.
-      *
-      * This is \c std::complex<Scalar> if #Scalar is real (e.g.,
-      * \c float or \c double) and just \c Scalar if #Scalar is
-      * complex.
-      */
-    typedef std::complex<RealScalar> ComplexScalar;
+  /** \brief Type for vector of eigenvalues as returned by eigenvalues().
+   *
+   * This is a column vector with entries of type #ComplexScalar.
+   * The length of the vector is the size of #MatrixType.
+   */
+  typedef Matrix<ComplexScalar, ColsAtCompileTime, 1, Options & (~RowMajor), MaxColsAtCompileTime, 1> EigenvalueType;
 
-    /** \brief Type for vector of eigenvalues as returned by eigenvalues().
-      *
-      * This is a column vector with entries of type #ComplexScalar.
-      * The length of the vector is the size of #MatrixType.
-      */
-    typedef Matrix<ComplexScalar, ColsAtCompileTime, 1, Options&(~RowMajor), MaxColsAtCompileTime, 1> EigenvalueType;
+  /** \brief Type for matrix of eigenvectors as returned by eigenvectors().
+   *
+   * This is a square matrix with entries of type #ComplexScalar.
+   * The size is the same as the size of #MatrixType.
+   */
+  typedef Matrix<ComplexScalar, RowsAtCompileTime, ColsAtCompileTime, Options, MaxRowsAtCompileTime,
+                 MaxColsAtCompileTime>
+      EigenvectorType;
 
-    /** \brief Type for matrix of eigenvectors as returned by eigenvectors().
-      *
-      * This is a square matrix with entries of type #ComplexScalar.
-      * The size is the same as the size of #MatrixType.
-      */
-    typedef Matrix<ComplexScalar, RowsAtCompileTime, ColsAtCompileTime, Options, MaxRowsAtCompileTime, MaxColsAtCompileTime> EigenvectorType;
+  /** \brief Default constructor.
+   *
+   * The default constructor is useful in cases in which the user intends to
+   * perform decompositions via compute().
+   */
+  ComplexEigenSolver()
+      : m_eivec(), m_eivalues(), m_schur(), m_isInitialized(false), m_eigenvectorsOk(false), m_matX() {}
 
-    /** \brief Default constructor.
-      *
-      * The default constructor is useful in cases in which the user intends to
-      * perform decompositions via compute().
-      */
-    ComplexEigenSolver()
-            : m_eivec(),
-              m_eivalues(),
-              m_schur(),
-              m_isInitialized(false),
-              m_eigenvectorsOk(false),
-              m_matX()
-    {}
+  /** \brief Default Constructor with memory preallocation
+   *
+   * Like the default constructor but with preallocation of the internal data
+   * according to the specified problem \a size.
+   * \sa ComplexEigenSolver()
+   */
+  explicit ComplexEigenSolver(Index size)
+      : m_eivec(size, size),
+        m_eivalues(size),
+        m_schur(size),
+        m_isInitialized(false),
+        m_eigenvectorsOk(false),
+        m_matX(size, size) {}
 
-    /** \brief Default Constructor with memory preallocation
-      *
-      * Like the default constructor but with preallocation of the internal data
-      * according to the specified problem \a size.
-      * \sa ComplexEigenSolver()
-      */
-    explicit ComplexEigenSolver(Index size)
-            : m_eivec(size, size),
-              m_eivalues(size),
-              m_schur(size),
-              m_isInitialized(false),
-              m_eigenvectorsOk(false),
-              m_matX(size, size)
-    {}
+  /** \brief Constructor; computes eigendecomposition of given matrix.
+   *
+   * \param[in]  matrix  Square matrix whose eigendecomposition is to be computed.
+   * \param[in]  computeEigenvectors  If true, both the eigenvectors and the
+   *    eigenvalues are computed; if false, only the eigenvalues are
+   *    computed.
+   *
+   * This constructor calls compute() to compute the eigendecomposition.
+   */
+  template <typename InputType>
+  explicit ComplexEigenSolver(const EigenBase<InputType>& matrix, bool computeEigenvectors = true)
+      : m_eivec(matrix.rows(), matrix.cols()),
+        m_eivalues(matrix.cols()),
+        m_schur(matrix.rows()),
+        m_isInitialized(false),
+        m_eigenvectorsOk(false),
+        m_matX(matrix.rows(), matrix.cols()) {
+    compute(matrix.derived(), computeEigenvectors);
+  }
 
-    /** \brief Constructor; computes eigendecomposition of given matrix.
-      *
-      * \param[in]  matrix  Square matrix whose eigendecomposition is to be computed.
-      * \param[in]  computeEigenvectors  If true, both the eigenvectors and the
-      *    eigenvalues are computed; if false, only the eigenvalues are
-      *    computed.
-      *
-      * This constructor calls compute() to compute the eigendecomposition.
-      */
-    template<typename InputType>
-    explicit ComplexEigenSolver(const EigenBase<InputType>& matrix, bool computeEigenvectors = true)
-            : m_eivec(matrix.rows(),matrix.cols()),
-              m_eivalues(matrix.cols()),
-              m_schur(matrix.rows()),
-              m_isInitialized(false),
-              m_eigenvectorsOk(false),
-              m_matX(matrix.rows(),matrix.cols())
-    {
-      compute(matrix.derived(), computeEigenvectors);
-    }
+  /** \brief Returns the eigenvectors of given matrix.
+   *
+   * \returns  A const reference to the matrix whose columns are the eigenvectors.
+   *
+   * \pre Either the constructor
+   * ComplexEigenSolver(const MatrixType& matrix, bool) or the member
+   * function compute(const MatrixType& matrix, bool) has been called before
+   * to compute the eigendecomposition of a matrix, and
+   * \p computeEigenvectors was set to true (the default).
+   *
+   * This function returns a matrix whose columns are the eigenvectors. Column
+   * \f$ k \f$ is an eigenvector corresponding to eigenvalue number \f$ k
+   * \f$ as returned by eigenvalues().  The eigenvectors are normalized to
+   * have (Euclidean) norm equal to one. The matrix returned by this
+   * function is the matrix \f$ V \f$ in the eigendecomposition \f$ A = V D
+   * V^{-1} \f$, if it exists.
+   *
+   * Example: \include ComplexEigenSolver_eigenvectors.cpp
+   * Output: \verbinclude ComplexEigenSolver_eigenvectors.out
+   */
+  const EigenvectorType& eigenvectors() const {
+    eigen_assert(m_isInitialized && "ComplexEigenSolver is not initialized.");
+    eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
+    return m_eivec;
+  }
 
-    /** \brief Returns the eigenvectors of given matrix.
-      *
-      * \returns  A const reference to the matrix whose columns are the eigenvectors.
-      *
-      * \pre Either the constructor
-      * ComplexEigenSolver(const MatrixType& matrix, bool) or the member
-      * function compute(const MatrixType& matrix, bool) has been called before
-      * to compute the eigendecomposition of a matrix, and
-      * \p computeEigenvectors was set to true (the default).
-      *
-      * This function returns a matrix whose columns are the eigenvectors. Column
-      * \f$ k \f$ is an eigenvector corresponding to eigenvalue number \f$ k
-      * \f$ as returned by eigenvalues().  The eigenvectors are normalized to
-      * have (Euclidean) norm equal to one. The matrix returned by this
-      * function is the matrix \f$ V \f$ in the eigendecomposition \f$ A = V D
-      * V^{-1} \f$, if it exists.
-      *
-      * Example: \include ComplexEigenSolver_eigenvectors.cpp
-      * Output: \verbinclude ComplexEigenSolver_eigenvectors.out
-      */
-    const EigenvectorType& eigenvectors() const
-    {
-      eigen_assert(m_isInitialized && "ComplexEigenSolver is not initialized.");
-      eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
-      return m_eivec;
-    }
+  /** \brief Returns the eigenvalues of given matrix.
+   *
+   * \returns A const reference to the column vector containing the eigenvalues.
+   *
+   * \pre Either the constructor
+   * ComplexEigenSolver(const MatrixType& matrix, bool) or the member
+   * function compute(const MatrixType& matrix, bool) has been called before
+   * to compute the eigendecomposition of a matrix.
+   *
+   * This function returns a column vector containing the
+   * eigenvalues. Eigenvalues are repeated according to their
+   * algebraic multiplicity, so there are as many eigenvalues as
+   * rows in the matrix. The eigenvalues are not sorted in any particular
+   * order.
+   *
+   * Example: \include ComplexEigenSolver_eigenvalues.cpp
+   * Output: \verbinclude ComplexEigenSolver_eigenvalues.out
+   */
+  const EigenvalueType& eigenvalues() const {
+    eigen_assert(m_isInitialized && "ComplexEigenSolver is not initialized.");
+    return m_eivalues;
+  }
 
-    /** \brief Returns the eigenvalues of given matrix.
-      *
-      * \returns A const reference to the column vector containing the eigenvalues.
-      *
-      * \pre Either the constructor
-      * ComplexEigenSolver(const MatrixType& matrix, bool) or the member
-      * function compute(const MatrixType& matrix, bool) has been called before
-      * to compute the eigendecomposition of a matrix.
-      *
-      * This function returns a column vector containing the
-      * eigenvalues. Eigenvalues are repeated according to their
-      * algebraic multiplicity, so there are as many eigenvalues as
-      * rows in the matrix. The eigenvalues are not sorted in any particular
-      * order.
-      *
-      * Example: \include ComplexEigenSolver_eigenvalues.cpp
-      * Output: \verbinclude ComplexEigenSolver_eigenvalues.out
-      */
-    const EigenvalueType& eigenvalues() const
-    {
-      eigen_assert(m_isInitialized && "ComplexEigenSolver is not initialized.");
-      return m_eivalues;
-    }
+  /** \brief Computes eigendecomposition of given matrix.
+   *
+   * \param[in]  matrix  Square matrix whose eigendecomposition is to be computed.
+   * \param[in]  computeEigenvectors  If true, both the eigenvectors and the
+   *    eigenvalues are computed; if false, only the eigenvalues are
+   *    computed.
+   * \returns    Reference to \c *this
+   *
+   * This function computes the eigenvalues of the complex matrix \p matrix.
+   * The eigenvalues() function can be used to retrieve them.  If
+   * \p computeEigenvectors is true, then the eigenvectors are also computed
+   * and can be retrieved by calling eigenvectors().
+   *
+   * The matrix is first reduced to Schur form using the
+   * ComplexSchur class. The Schur decomposition is then used to
+   * compute the eigenvalues and eigenvectors.
+   *
+   * The cost of the computation is dominated by the cost of the
+   * Schur decomposition, which is \f$ O(n^3) \f$ where \f$ n \f$
+   * is the size of the matrix.
+   *
+   * Example: \include ComplexEigenSolver_compute.cpp
+   * Output: \verbinclude ComplexEigenSolver_compute.out
+   */
+  template <typename InputType>
+  ComplexEigenSolver& compute(const EigenBase<InputType>& matrix, bool computeEigenvectors = true);
 
-    /** \brief Computes eigendecomposition of given matrix.
-      *
-      * \param[in]  matrix  Square matrix whose eigendecomposition is to be computed.
-      * \param[in]  computeEigenvectors  If true, both the eigenvectors and the
-      *    eigenvalues are computed; if false, only the eigenvalues are
-      *    computed.
-      * \returns    Reference to \c *this
-      *
-      * This function computes the eigenvalues of the complex matrix \p matrix.
-      * The eigenvalues() function can be used to retrieve them.  If
-      * \p computeEigenvectors is true, then the eigenvectors are also computed
-      * and can be retrieved by calling eigenvectors().
-      *
-      * The matrix is first reduced to Schur form using the
-      * ComplexSchur class. The Schur decomposition is then used to
-      * compute the eigenvalues and eigenvectors.
-      *
-      * The cost of the computation is dominated by the cost of the
-      * Schur decomposition, which is \f$ O(n^3) \f$ where \f$ n \f$
-      * is the size of the matrix.
-      *
-      * Example: \include ComplexEigenSolver_compute.cpp
-      * Output: \verbinclude ComplexEigenSolver_compute.out
-      */
-    template<typename InputType>
-    ComplexEigenSolver& compute(const EigenBase<InputType>& matrix, bool computeEigenvectors = true);
+  /** \brief Reports whether previous computation was successful.
+   *
+   * \returns \c Success if computation was successful, \c NoConvergence otherwise.
+   */
+  ComputationInfo info() const {
+    eigen_assert(m_isInitialized && "ComplexEigenSolver is not initialized.");
+    return m_schur.info();
+  }
 
-    /** \brief Reports whether previous computation was successful.
-      *
-      * \returns \c Success if computation was successful, \c NoConvergence otherwise.
-      */
-    ComputationInfo info() const
-    {
-      eigen_assert(m_isInitialized && "ComplexEigenSolver is not initialized.");
-      return m_schur.info();
-    }
+  /** \brief Sets the maximum number of iterations allowed. */
+  ComplexEigenSolver& setMaxIterations(Index maxIters) {
+    m_schur.setMaxIterations(maxIters);
+    return *this;
+  }
 
-    /** \brief Sets the maximum number of iterations allowed. */
-    ComplexEigenSolver& setMaxIterations(Index maxIters)
-    {
-      m_schur.setMaxIterations(maxIters);
-      return *this;
-    }
+  /** \brief Returns the maximum number of iterations. */
+  Index getMaxIterations() { return m_schur.getMaxIterations(); }
 
-    /** \brief Returns the maximum number of iterations. */
-    Index getMaxIterations()
-    {
-      return m_schur.getMaxIterations();
-    }
+ protected:
+  EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
 
-  protected:
+  EigenvectorType m_eivec;
+  EigenvalueType m_eivalues;
+  ComplexSchur<MatrixType> m_schur;
+  bool m_isInitialized;
+  bool m_eigenvectorsOk;
+  EigenvectorType m_matX;
 
-    EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
-
-    EigenvectorType m_eivec;
-    EigenvalueType m_eivalues;
-    ComplexSchur<MatrixType> m_schur;
-    bool m_isInitialized;
-    bool m_eigenvectorsOk;
-    EigenvectorType m_matX;
-
-  private:
-    void doComputeEigenvectors(RealScalar matrixnorm);
-    void sortEigenvalues(bool computeEigenvectors);
+ private:
+  void doComputeEigenvectors(RealScalar matrixnorm);
+  void sortEigenvalues(bool computeEigenvectors);
 };
 
-
-template<typename MatrixType>
-template<typename InputType>
-ComplexEigenSolver<MatrixType>& 
-ComplexEigenSolver<MatrixType>::compute(const EigenBase<InputType>& matrix, bool computeEigenvectors)
-{
+template <typename MatrixType>
+template <typename InputType>
+ComplexEigenSolver<MatrixType>& ComplexEigenSolver<MatrixType>::compute(const EigenBase<InputType>& matrix,
+                                                                        bool computeEigenvectors) {
   // this code is inspired from Jampack
   eigen_assert(matrix.cols() == matrix.rows());
 
@@ -267,11 +250,9 @@
   // The eigenvalues are on the diagonal of T.
   m_schur.compute(matrix.derived(), computeEigenvectors);
 
-  if(m_schur.info() == Success)
-  {
+  if (m_schur.info() == Success) {
     m_eivalues = m_schur.matrixT().diagonal();
-    if(computeEigenvectors)
-      doComputeEigenvectors(m_schur.matrixT().norm());
+    if (computeEigenvectors) doComputeEigenvectors(m_schur.matrixT().norm());
     sortEigenvalues(computeEigenvectors);
   }
 
@@ -280,65 +261,55 @@
   return *this;
 }
 
-
-template<typename MatrixType>
-void ComplexEigenSolver<MatrixType>::doComputeEigenvectors(RealScalar matrixnorm)
-{
+template <typename MatrixType>
+void ComplexEigenSolver<MatrixType>::doComputeEigenvectors(RealScalar matrixnorm) {
   const Index n = m_eivalues.size();
 
-  matrixnorm = numext::maxi(matrixnorm,(std::numeric_limits<RealScalar>::min)());
+  matrixnorm = numext::maxi(matrixnorm, (std::numeric_limits<RealScalar>::min)());
 
   // Compute X such that T = X D X^(-1), where D is the diagonal of T.
   // The matrix X is unit triangular.
   m_matX = EigenvectorType::Zero(n, n);
-  for(Index k=n-1 ; k>=0 ; k--)
-  {
-    m_matX.coeffRef(k,k) = ComplexScalar(1.0,0.0);
+  for (Index k = n - 1; k >= 0; k--) {
+    m_matX.coeffRef(k, k) = ComplexScalar(1.0, 0.0);
     // Compute X(i,k) using the (i,k) entry of the equation X T = D X
-    for(Index i=k-1 ; i>=0 ; i--)
-    {
-      m_matX.coeffRef(i,k) = -m_schur.matrixT().coeff(i,k);
-      if(k-i-1>0)
-        m_matX.coeffRef(i,k) -= (m_schur.matrixT().row(i).segment(i+1,k-i-1) * m_matX.col(k).segment(i+1,k-i-1)).value();
-      ComplexScalar z = m_schur.matrixT().coeff(i,i) - m_schur.matrixT().coeff(k,k);
-      if(z==ComplexScalar(0))
-      {
+    for (Index i = k - 1; i >= 0; i--) {
+      m_matX.coeffRef(i, k) = -m_schur.matrixT().coeff(i, k);
+      if (k - i - 1 > 0)
+        m_matX.coeffRef(i, k) -=
+            (m_schur.matrixT().row(i).segment(i + 1, k - i - 1) * m_matX.col(k).segment(i + 1, k - i - 1)).value();
+      ComplexScalar z = m_schur.matrixT().coeff(i, i) - m_schur.matrixT().coeff(k, k);
+      if (z == ComplexScalar(0)) {
         // If the i-th and k-th eigenvalue are equal, then z equals 0.
         // Use a small value instead, to prevent division by zero.
         numext::real_ref(z) = NumTraits<RealScalar>::epsilon() * matrixnorm;
       }
-      m_matX.coeffRef(i,k) = m_matX.coeff(i,k) / z;
+      m_matX.coeffRef(i, k) = m_matX.coeff(i, k) / z;
     }
   }
 
   // Compute V as V = U X; now A = U T U^* = U X D X^(-1) U^* = V D V^(-1)
   m_eivec.noalias() = m_schur.matrixU() * m_matX;
   // .. and normalize the eigenvectors
-  for(Index k=0 ; k<n ; k++)
-  {
+  for (Index k = 0; k < n; k++) {
     m_eivec.col(k).normalize();
   }
 }
 
-
-template<typename MatrixType>
-void ComplexEigenSolver<MatrixType>::sortEigenvalues(bool computeEigenvectors)
-{
-  const Index n =  m_eivalues.size();
-  for (Index i=0; i<n; i++)
-  {
+template <typename MatrixType>
+void ComplexEigenSolver<MatrixType>::sortEigenvalues(bool computeEigenvectors) {
+  const Index n = m_eivalues.size();
+  for (Index i = 0; i < n; i++) {
     Index k;
-    m_eivalues.cwiseAbs().tail(n-i).minCoeff(&k);
-    if (k != 0)
-    {
+    m_eivalues.cwiseAbs().tail(n - i).minCoeff(&k);
+    if (k != 0) {
       k += i;
-      std::swap(m_eivalues[k],m_eivalues[i]);
-      if(computeEigenvectors)
-	m_eivec.col(i).swap(m_eivec.col(k));
+      std::swap(m_eivalues[k], m_eivalues[i]);
+      if (computeEigenvectors) m_eivec.col(i).swap(m_eivec.col(k));
     }
   }
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_COMPLEX_EIGEN_SOLVER_H
+#endif  // EIGEN_COMPLEX_EIGEN_SOLVER_H
diff --git a/Eigen/src/Eigenvalues/ComplexSchur.h b/Eigen/src/Eigenvalues/ComplexSchur.h
index cdff38a..126b442 100644
--- a/Eigen/src/Eigenvalues/ComplexSchur.h
+++ b/Eigen/src/Eigenvalues/ComplexSchur.h
@@ -17,416 +17,394 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
-template<typename MatrixType, bool IsComplex> struct complex_schur_reduce_to_hessenberg;
+template <typename MatrixType, bool IsComplex>
+struct complex_schur_reduce_to_hessenberg;
 }
 
 /** \eigenvalues_module \ingroup Eigenvalues_Module
-  *
-  *
-  * \class ComplexSchur
-  *
-  * \brief Performs a complex Schur decomposition of a real or complex square matrix
-  *
-  * \tparam MatrixType_ the type of the matrix of which we are
-  * computing the Schur decomposition; this is expected to be an
-  * instantiation of the Matrix class template.
-  *
-  * Given a real or complex square matrix A, this class computes the
-  * Schur decomposition: \f$ A = U T U^*\f$ where U is a unitary
-  * complex matrix, and T is a complex upper triangular matrix.  The
-  * diagonal of the matrix T corresponds to the eigenvalues of the
-  * matrix A.
-  *
-  * Call the function compute() to compute the Schur decomposition of
-  * a given matrix. Alternatively, you can use the 
-  * ComplexSchur(const MatrixType&, bool) constructor which computes
-  * the Schur decomposition at construction time. Once the
-  * decomposition is computed, you can use the matrixU() and matrixT()
-  * functions to retrieve the matrices U and V in the decomposition.
-  *
-  * \note This code is inspired from Jampack
-  *
-  * \sa class RealSchur, class EigenSolver, class ComplexEigenSolver
-  */
-template<typename MatrixType_> class ComplexSchur
-{
-  public:
-    typedef MatrixType_ MatrixType;
-    enum {
-      RowsAtCompileTime = MatrixType::RowsAtCompileTime,
-      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
-      Options = MatrixType::Options,
-      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
-      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
-    };
+ *
+ *
+ * \class ComplexSchur
+ *
+ * \brief Performs a complex Schur decomposition of a real or complex square matrix
+ *
+ * \tparam MatrixType_ the type of the matrix of which we are
+ * computing the Schur decomposition; this is expected to be an
+ * instantiation of the Matrix class template.
+ *
+ * Given a real or complex square matrix A, this class computes the
+ * Schur decomposition: \f$ A = U T U^*\f$ where U is a unitary
+ * complex matrix, and T is a complex upper triangular matrix.  The
+ * diagonal of the matrix T corresponds to the eigenvalues of the
+ * matrix A.
+ *
+ * Call the function compute() to compute the Schur decomposition of
+ * a given matrix. Alternatively, you can use the
+ * ComplexSchur(const MatrixType&, bool) constructor which computes
+ * the Schur decomposition at construction time. Once the
+ * decomposition is computed, you can use the matrixU() and matrixT()
+ * functions to retrieve the matrices U and V in the decomposition.
+ *
+ * \note This code is inspired from Jampack
+ *
+ * \sa class RealSchur, class EigenSolver, class ComplexEigenSolver
+ */
+template <typename MatrixType_>
+class ComplexSchur {
+ public:
+  typedef MatrixType_ MatrixType;
+  enum {
+    RowsAtCompileTime = MatrixType::RowsAtCompileTime,
+    ColsAtCompileTime = MatrixType::ColsAtCompileTime,
+    Options = MatrixType::Options,
+    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
+  };
 
-    /** \brief Scalar type for matrices of type \p MatrixType_. */
-    typedef typename MatrixType::Scalar Scalar;
-    typedef typename NumTraits<Scalar>::Real RealScalar;
-    typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3
+  /** \brief Scalar type for matrices of type \p MatrixType_. */
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef Eigen::Index Index;  ///< \deprecated since Eigen 3.3
 
-    /** \brief Complex scalar type for \p MatrixType_.
-      *
-      * This is \c std::complex<Scalar> if #Scalar is real (e.g.,
-      * \c float or \c double) and just \c Scalar if #Scalar is
-      * complex.
-      */
-    typedef std::complex<RealScalar> ComplexScalar;
+  /** \brief Complex scalar type for \p MatrixType_.
+   *
+   * This is \c std::complex<Scalar> if #Scalar is real (e.g.,
+   * \c float or \c double) and just \c Scalar if #Scalar is
+   * complex.
+   */
+  typedef std::complex<RealScalar> ComplexScalar;
 
-    /** \brief Type for the matrices in the Schur decomposition.
-      *
-      * This is a square matrix with entries of type #ComplexScalar. 
-      * The size is the same as the size of \p MatrixType_.
-      */
-    typedef Matrix<ComplexScalar, RowsAtCompileTime, ColsAtCompileTime, Options, MaxRowsAtCompileTime, MaxColsAtCompileTime> ComplexMatrixType;
+  /** \brief Type for the matrices in the Schur decomposition.
+   *
+   * This is a square matrix with entries of type #ComplexScalar.
+   * The size is the same as the size of \p MatrixType_.
+   */
+  typedef Matrix<ComplexScalar, RowsAtCompileTime, ColsAtCompileTime, Options, MaxRowsAtCompileTime,
+                 MaxColsAtCompileTime>
+      ComplexMatrixType;
 
-    /** \brief Default constructor.
-      *
-      * \param [in] size  Positive integer, size of the matrix whose Schur decomposition will be computed.
-      *
-      * The default constructor is useful in cases in which the user
-      * intends to perform decompositions via compute().  The \p size
-      * parameter is only used as a hint. It is not an error to give a
-      * wrong \p size, but it may impair performance.
-      *
-      * \sa compute() for an example.
-      */
-    explicit ComplexSchur(Index size = RowsAtCompileTime==Dynamic ? 1 : RowsAtCompileTime)
-      : m_matT(size,size),
-        m_matU(size,size),
+  /** \brief Default constructor.
+   *
+   * \param [in] size  Positive integer, size of the matrix whose Schur decomposition will be computed.
+   *
+   * The default constructor is useful in cases in which the user
+   * intends to perform decompositions via compute().  The \p size
+   * parameter is only used as a hint. It is not an error to give a
+   * wrong \p size, but it may impair performance.
+   *
+   * \sa compute() for an example.
+   */
+  explicit ComplexSchur(Index size = RowsAtCompileTime == Dynamic ? 1 : RowsAtCompileTime)
+      : m_matT(size, size),
+        m_matU(size, size),
         m_hess(size),
         m_isInitialized(false),
         m_matUisUptodate(false),
-        m_maxIters(-1)
-    {}
+        m_maxIters(-1) {}
 
-    /** \brief Constructor; computes Schur decomposition of given matrix. 
-      * 
-      * \param[in]  matrix    Square matrix whose Schur decomposition is to be computed.
-      * \param[in]  computeU  If true, both T and U are computed; if false, only T is computed.
-      *
-      * This constructor calls compute() to compute the Schur decomposition.
-      *
-      * \sa matrixT() and matrixU() for examples.
-      */
-    template<typename InputType>
-    explicit ComplexSchur(const EigenBase<InputType>& matrix, bool computeU = true)
-      : m_matT(matrix.rows(),matrix.cols()),
-        m_matU(matrix.rows(),matrix.cols()),
+  /** \brief Constructor; computes Schur decomposition of given matrix.
+   *
+   * \param[in]  matrix    Square matrix whose Schur decomposition is to be computed.
+   * \param[in]  computeU  If true, both T and U are computed; if false, only T is computed.
+   *
+   * This constructor calls compute() to compute the Schur decomposition.
+   *
+   * \sa matrixT() and matrixU() for examples.
+   */
+  template <typename InputType>
+  explicit ComplexSchur(const EigenBase<InputType>& matrix, bool computeU = true)
+      : m_matT(matrix.rows(), matrix.cols()),
+        m_matU(matrix.rows(), matrix.cols()),
         m_hess(matrix.rows()),
         m_isInitialized(false),
         m_matUisUptodate(false),
-        m_maxIters(-1)
-    {
-      compute(matrix.derived(), computeU);
-    }
+        m_maxIters(-1) {
+    compute(matrix.derived(), computeU);
+  }
 
-    /** \brief Returns the unitary matrix in the Schur decomposition. 
-      *
-      * \returns A const reference to the matrix U.
-      *
-      * It is assumed that either the constructor
-      * ComplexSchur(const MatrixType& matrix, bool computeU) or the
-      * member function compute(const MatrixType& matrix, bool computeU)
-      * has been called before to compute the Schur decomposition of a
-      * matrix, and that \p computeU was set to true (the default
-      * value).
-      *
-      * Example: \include ComplexSchur_matrixU.cpp
-      * Output: \verbinclude ComplexSchur_matrixU.out
-      */
-    const ComplexMatrixType& matrixU() const
-    {
-      eigen_assert(m_isInitialized && "ComplexSchur is not initialized.");
-      eigen_assert(m_matUisUptodate && "The matrix U has not been computed during the ComplexSchur decomposition.");
-      return m_matU;
-    }
+  /** \brief Returns the unitary matrix in the Schur decomposition.
+   *
+   * \returns A const reference to the matrix U.
+   *
+   * It is assumed that either the constructor
+   * ComplexSchur(const MatrixType& matrix, bool computeU) or the
+   * member function compute(const MatrixType& matrix, bool computeU)
+   * has been called before to compute the Schur decomposition of a
+   * matrix, and that \p computeU was set to true (the default
+   * value).
+   *
+   * Example: \include ComplexSchur_matrixU.cpp
+   * Output: \verbinclude ComplexSchur_matrixU.out
+   */
+  const ComplexMatrixType& matrixU() const {
+    eigen_assert(m_isInitialized && "ComplexSchur is not initialized.");
+    eigen_assert(m_matUisUptodate && "The matrix U has not been computed during the ComplexSchur decomposition.");
+    return m_matU;
+  }
 
-    /** \brief Returns the triangular matrix in the Schur decomposition. 
-      *
-      * \returns A const reference to the matrix T.
-      *
-      * It is assumed that either the constructor
-      * ComplexSchur(const MatrixType& matrix, bool computeU) or the
-      * member function compute(const MatrixType& matrix, bool computeU)
-      * has been called before to compute the Schur decomposition of a
-      * matrix.
-      *
-      * Note that this function returns a plain square matrix. If you want to reference
-      * only the upper triangular part, use:
-      * \code schur.matrixT().triangularView<Upper>() \endcode 
-      *
-      * Example: \include ComplexSchur_matrixT.cpp
-      * Output: \verbinclude ComplexSchur_matrixT.out
-      */
-    const ComplexMatrixType& matrixT() const
-    {
-      eigen_assert(m_isInitialized && "ComplexSchur is not initialized.");
-      return m_matT;
-    }
+  /** \brief Returns the triangular matrix in the Schur decomposition.
+   *
+   * \returns A const reference to the matrix T.
+   *
+   * It is assumed that either the constructor
+   * ComplexSchur(const MatrixType& matrix, bool computeU) or the
+   * member function compute(const MatrixType& matrix, bool computeU)
+   * has been called before to compute the Schur decomposition of a
+   * matrix.
+   *
+   * Note that this function returns a plain square matrix. If you want to reference
+   * only the upper triangular part, use:
+   * \code schur.matrixT().triangularView<Upper>() \endcode
+   *
+   * Example: \include ComplexSchur_matrixT.cpp
+   * Output: \verbinclude ComplexSchur_matrixT.out
+   */
+  const ComplexMatrixType& matrixT() const {
+    eigen_assert(m_isInitialized && "ComplexSchur is not initialized.");
+    return m_matT;
+  }
 
-    /** \brief Computes Schur decomposition of given matrix. 
-      * 
-      * \param[in]  matrix  Square matrix whose Schur decomposition is to be computed.
-      * \param[in]  computeU  If true, both T and U are computed; if false, only T is computed.
+  /** \brief Computes Schur decomposition of given matrix.
+    *
+    * \param[in]  matrix  Square matrix whose Schur decomposition is to be computed.
+    * \param[in]  computeU  If true, both T and U are computed; if false, only T is computed.
 
-      * \returns    Reference to \c *this
-      *
-      * The Schur decomposition is computed by first reducing the
-      * matrix to Hessenberg form using the class
-      * HessenbergDecomposition. The Hessenberg matrix is then reduced
-      * to triangular form by performing QR iterations with a single
-      * shift. The cost of computing the Schur decomposition depends
-      * on the number of iterations; as a rough guide, it may be taken
-      * on the number of iterations; as a rough guide, it may be taken
-      * to be \f$25n^3\f$ complex flops, or \f$10n^3\f$ complex flops
-      * if \a computeU is false.
-      *
-      * Example: \include ComplexSchur_compute.cpp
-      * Output: \verbinclude ComplexSchur_compute.out
-      *
-      * \sa compute(const MatrixType&, bool, Index)
-      */
-    template<typename InputType>
-    ComplexSchur& compute(const EigenBase<InputType>& matrix, bool computeU = true);
-    
-    /** \brief Compute Schur decomposition from a given Hessenberg matrix
-     *  \param[in] matrixH Matrix in Hessenberg form H
-     *  \param[in] matrixQ orthogonal matrix Q that transform a matrix A to H : A = Q H Q^T
-     *  \param computeU Computes the matriX U of the Schur vectors
-     * \return Reference to \c *this
-     * 
-     *  This routine assumes that the matrix is already reduced in Hessenberg form matrixH
-     *  using either the class HessenbergDecomposition or another mean. 
-     *  It computes the upper quasi-triangular matrix T of the Schur decomposition of H
-     *  When computeU is true, this routine computes the matrix U such that 
-     *  A = U T U^T =  (QZ) T (QZ)^T = Q H Q^T where A is the initial matrix
-     * 
-     * NOTE Q is referenced if computeU is true; so, if the initial orthogonal matrix
-     * is not available, the user should give an identity matrix (Q.setIdentity())
-     * 
-     * \sa compute(const MatrixType&, bool)
-     */
-    template<typename HessMatrixType, typename OrthMatrixType>
-    ComplexSchur& computeFromHessenberg(const HessMatrixType& matrixH, const OrthMatrixType& matrixQ,  bool computeU=true);
+    * \returns    Reference to \c *this
+    *
+    * The Schur decomposition is computed by first reducing the
+    * matrix to Hessenberg form using the class
+    * HessenbergDecomposition. The Hessenberg matrix is then reduced
+    * to triangular form by performing QR iterations with a single
+    * shift. The cost of computing the Schur decomposition depends
+    * on the number of iterations; as a rough guide, it may be taken
+    * on the number of iterations; as a rough guide, it may be taken
+    * to be \f$25n^3\f$ complex flops, or \f$10n^3\f$ complex flops
+    * if \a computeU is false.
+    *
+    * Example: \include ComplexSchur_compute.cpp
+    * Output: \verbinclude ComplexSchur_compute.out
+    *
+    * \sa compute(const MatrixType&, bool, Index)
+    */
+  template <typename InputType>
+  ComplexSchur& compute(const EigenBase<InputType>& matrix, bool computeU = true);
 
-    /** \brief Reports whether previous computation was successful.
-      *
-      * \returns \c Success if computation was successful, \c NoConvergence otherwise.
-      */
-    ComputationInfo info() const
-    {
-      eigen_assert(m_isInitialized && "ComplexSchur is not initialized.");
-      return m_info;
-    }
+  /** \brief Compute Schur decomposition from a given Hessenberg matrix
+   *  \param[in] matrixH Matrix in Hessenberg form H
+   *  \param[in] matrixQ orthogonal matrix Q that transform a matrix A to H : A = Q H Q^T
+   *  \param computeU Computes the matriX U of the Schur vectors
+   * \return Reference to \c *this
+   *
+   *  This routine assumes that the matrix is already reduced in Hessenberg form matrixH
+   *  using either the class HessenbergDecomposition or another mean.
+   *  It computes the upper quasi-triangular matrix T of the Schur decomposition of H
+   *  When computeU is true, this routine computes the matrix U such that
+   *  A = U T U^T =  (QZ) T (QZ)^T = Q H Q^T where A is the initial matrix
+   *
+   * NOTE Q is referenced if computeU is true; so, if the initial orthogonal matrix
+   * is not available, the user should give an identity matrix (Q.setIdentity())
+   *
+   * \sa compute(const MatrixType&, bool)
+   */
+  template <typename HessMatrixType, typename OrthMatrixType>
+  ComplexSchur& computeFromHessenberg(const HessMatrixType& matrixH, const OrthMatrixType& matrixQ,
+                                      bool computeU = true);
 
-    /** \brief Sets the maximum number of iterations allowed. 
-      *
-      * If not specified by the user, the maximum number of iterations is m_maxIterationsPerRow times the size
-      * of the matrix.
-      */
-    ComplexSchur& setMaxIterations(Index maxIters)
-    {
-      m_maxIters = maxIters;
-      return *this;
-    }
+  /** \brief Reports whether previous computation was successful.
+   *
+   * \returns \c Success if computation was successful, \c NoConvergence otherwise.
+   */
+  ComputationInfo info() const {
+    eigen_assert(m_isInitialized && "ComplexSchur is not initialized.");
+    return m_info;
+  }
 
-    /** \brief Returns the maximum number of iterations. */
-    Index getMaxIterations()
-    {
-      return m_maxIters;
-    }
+  /** \brief Sets the maximum number of iterations allowed.
+   *
+   * If not specified by the user, the maximum number of iterations is m_maxIterationsPerRow times the size
+   * of the matrix.
+   */
+  ComplexSchur& setMaxIterations(Index maxIters) {
+    m_maxIters = maxIters;
+    return *this;
+  }
 
-    /** \brief Maximum number of iterations per row.
-      *
-      * If not otherwise specified, the maximum number of iterations is this number times the size of the
-      * matrix. It is currently set to 30.
-      */
-    static const int m_maxIterationsPerRow = 30;
+  /** \brief Returns the maximum number of iterations. */
+  Index getMaxIterations() { return m_maxIters; }
 
-  protected:
-    ComplexMatrixType m_matT, m_matU;
-    HessenbergDecomposition<MatrixType> m_hess;
-    ComputationInfo m_info;
-    bool m_isInitialized;
-    bool m_matUisUptodate;
-    Index m_maxIters;
+  /** \brief Maximum number of iterations per row.
+   *
+   * If not otherwise specified, the maximum number of iterations is this number times the size of the
+   * matrix. It is currently set to 30.
+   */
+  static const int m_maxIterationsPerRow = 30;
 
-  private:  
-    bool subdiagonalEntryIsNeglegible(Index i);
-    ComplexScalar computeShift(Index iu, Index iter);
-    void reduceToTriangularForm(bool computeU);
-    friend struct internal::complex_schur_reduce_to_hessenberg<MatrixType, NumTraits<Scalar>::IsComplex>;
+ protected:
+  ComplexMatrixType m_matT, m_matU;
+  HessenbergDecomposition<MatrixType> m_hess;
+  ComputationInfo m_info;
+  bool m_isInitialized;
+  bool m_matUisUptodate;
+  Index m_maxIters;
+
+ private:
+  bool subdiagonalEntryIsNeglegible(Index i);
+  ComplexScalar computeShift(Index iu, Index iter);
+  void reduceToTriangularForm(bool computeU);
+  friend struct internal::complex_schur_reduce_to_hessenberg<MatrixType, NumTraits<Scalar>::IsComplex>;
 };
 
 /** If m_matT(i+1,i) is negligible in floating point arithmetic
-  * compared to m_matT(i,i) and m_matT(j,j), then set it to zero and
-  * return true, else return false. */
-template<typename MatrixType>
-inline bool ComplexSchur<MatrixType>::subdiagonalEntryIsNeglegible(Index i)
-{
-  RealScalar d = numext::norm1(m_matT.coeff(i,i)) + numext::norm1(m_matT.coeff(i+1,i+1));
-  RealScalar sd = numext::norm1(m_matT.coeff(i+1,i));
-  if (internal::isMuchSmallerThan(sd, d, NumTraits<RealScalar>::epsilon()))
-  {
-    m_matT.coeffRef(i+1,i) = ComplexScalar(0);
+ * compared to m_matT(i,i) and m_matT(j,j), then set it to zero and
+ * return true, else return false. */
+template <typename MatrixType>
+inline bool ComplexSchur<MatrixType>::subdiagonalEntryIsNeglegible(Index i) {
+  RealScalar d = numext::norm1(m_matT.coeff(i, i)) + numext::norm1(m_matT.coeff(i + 1, i + 1));
+  RealScalar sd = numext::norm1(m_matT.coeff(i + 1, i));
+  if (internal::isMuchSmallerThan(sd, d, NumTraits<RealScalar>::epsilon())) {
+    m_matT.coeffRef(i + 1, i) = ComplexScalar(0);
     return true;
   }
   return false;
 }
 
-
 /** Compute the shift in the current QR iteration. */
-template<typename MatrixType>
-typename ComplexSchur<MatrixType>::ComplexScalar ComplexSchur<MatrixType>::computeShift(Index iu, Index iter)
-{
+template <typename MatrixType>
+typename ComplexSchur<MatrixType>::ComplexScalar ComplexSchur<MatrixType>::computeShift(Index iu, Index iter) {
   using std::abs;
-  if (iter == 10 || iter == 20) 
-  {
+  if (iter == 10 || iter == 20) {
     // exceptional shift, taken from http://www.netlib.org/eispack/comqr.f
-    return abs(numext::real(m_matT.coeff(iu,iu-1))) + abs(numext::real(m_matT.coeff(iu-1,iu-2)));
+    return abs(numext::real(m_matT.coeff(iu, iu - 1))) + abs(numext::real(m_matT.coeff(iu - 1, iu - 2)));
   }
 
   // compute the shift as one of the eigenvalues of t, the 2x2
   // diagonal block on the bottom of the active submatrix
-  Matrix<ComplexScalar,2,2> t = m_matT.template block<2,2>(iu-1,iu-1);
+  Matrix<ComplexScalar, 2, 2> t = m_matT.template block<2, 2>(iu - 1, iu - 1);
   RealScalar normt = t.cwiseAbs().sum();
-  t /= normt;     // the normalization by sf is to avoid under/overflow
+  t /= normt;  // the normalization by sf is to avoid under/overflow
 
-  ComplexScalar b = t.coeff(0,1) * t.coeff(1,0);
-  ComplexScalar c = t.coeff(0,0) - t.coeff(1,1);
-  ComplexScalar disc = sqrt(c*c + RealScalar(4)*b);
-  ComplexScalar det = t.coeff(0,0) * t.coeff(1,1) - b;
-  ComplexScalar trace = t.coeff(0,0) + t.coeff(1,1);
+  ComplexScalar b = t.coeff(0, 1) * t.coeff(1, 0);
+  ComplexScalar c = t.coeff(0, 0) - t.coeff(1, 1);
+  ComplexScalar disc = sqrt(c * c + RealScalar(4) * b);
+  ComplexScalar det = t.coeff(0, 0) * t.coeff(1, 1) - b;
+  ComplexScalar trace = t.coeff(0, 0) + t.coeff(1, 1);
   ComplexScalar eival1 = (trace + disc) / RealScalar(2);
   ComplexScalar eival2 = (trace - disc) / RealScalar(2);
   RealScalar eival1_norm = numext::norm1(eival1);
   RealScalar eival2_norm = numext::norm1(eival2);
   // A division by zero can only occur if eival1==eival2==0.
   // In this case, det==0, and all we have to do is checking that eival2_norm!=0
-  if(eival1_norm > eival2_norm)
+  if (eival1_norm > eival2_norm)
     eival2 = det / eival1;
-  else if(!numext::is_exactly_zero(eival2_norm))
+  else if (!numext::is_exactly_zero(eival2_norm))
     eival1 = det / eival2;
 
   // choose the eigenvalue closest to the bottom entry of the diagonal
-  if(numext::norm1(eival1-t.coeff(1,1)) < numext::norm1(eival2-t.coeff(1,1)))
+  if (numext::norm1(eival1 - t.coeff(1, 1)) < numext::norm1(eival2 - t.coeff(1, 1)))
     return normt * eival1;
   else
     return normt * eival2;
 }
 
-
-template<typename MatrixType>
-template<typename InputType>
-ComplexSchur<MatrixType>& ComplexSchur<MatrixType>::compute(const EigenBase<InputType>& matrix, bool computeU)
-{
+template <typename MatrixType>
+template <typename InputType>
+ComplexSchur<MatrixType>& ComplexSchur<MatrixType>::compute(const EigenBase<InputType>& matrix, bool computeU) {
   m_matUisUptodate = false;
   eigen_assert(matrix.cols() == matrix.rows());
 
-  if(matrix.cols() == 1)
-  {
+  if (matrix.cols() == 1) {
     m_matT = matrix.derived().template cast<ComplexScalar>();
-    if(computeU)  m_matU = ComplexMatrixType::Identity(1,1);
+    if (computeU) m_matU = ComplexMatrixType::Identity(1, 1);
     m_info = Success;
     m_isInitialized = true;
     m_matUisUptodate = computeU;
     return *this;
   }
 
-  internal::complex_schur_reduce_to_hessenberg<MatrixType, NumTraits<Scalar>::IsComplex>::run(*this, matrix.derived(), computeU);
+  internal::complex_schur_reduce_to_hessenberg<MatrixType, NumTraits<Scalar>::IsComplex>::run(*this, matrix.derived(),
+                                                                                              computeU);
   computeFromHessenberg(m_matT, m_matU, computeU);
   return *this;
 }
 
-template<typename MatrixType>
-template<typename HessMatrixType, typename OrthMatrixType>
-ComplexSchur<MatrixType>& ComplexSchur<MatrixType>::computeFromHessenberg(const HessMatrixType& matrixH, const OrthMatrixType& matrixQ, bool computeU)
-{
+template <typename MatrixType>
+template <typename HessMatrixType, typename OrthMatrixType>
+ComplexSchur<MatrixType>& ComplexSchur<MatrixType>::computeFromHessenberg(const HessMatrixType& matrixH,
+                                                                          const OrthMatrixType& matrixQ,
+                                                                          bool computeU) {
   m_matT = matrixH;
-  if(computeU)
-    m_matU = matrixQ;
+  if (computeU) m_matU = matrixQ;
   reduceToTriangularForm(computeU);
   return *this;
 }
 namespace internal {
 
 /* Reduce given matrix to Hessenberg form */
-template<typename MatrixType, bool IsComplex>
-struct complex_schur_reduce_to_hessenberg
-{
+template <typename MatrixType, bool IsComplex>
+struct complex_schur_reduce_to_hessenberg {
   // this is the implementation for the case IsComplex = true
-  static void run(ComplexSchur<MatrixType>& _this, const MatrixType& matrix, bool computeU)
-  {
+  static void run(ComplexSchur<MatrixType>& _this, const MatrixType& matrix, bool computeU) {
     _this.m_hess.compute(matrix);
     _this.m_matT = _this.m_hess.matrixH();
-    if(computeU)  _this.m_matU = _this.m_hess.matrixQ();
+    if (computeU) _this.m_matU = _this.m_hess.matrixQ();
   }
 };
 
-template<typename MatrixType>
-struct complex_schur_reduce_to_hessenberg<MatrixType, false>
-{
-  static void run(ComplexSchur<MatrixType>& _this, const MatrixType& matrix, bool computeU)
-  {
+template <typename MatrixType>
+struct complex_schur_reduce_to_hessenberg<MatrixType, false> {
+  static void run(ComplexSchur<MatrixType>& _this, const MatrixType& matrix, bool computeU) {
     typedef typename ComplexSchur<MatrixType>::ComplexScalar ComplexScalar;
 
     // Note: m_hess is over RealScalar; m_matT and m_matU is over ComplexScalar
     _this.m_hess.compute(matrix);
     _this.m_matT = _this.m_hess.matrixH().template cast<ComplexScalar>();
-    if(computeU)  
-    {
+    if (computeU) {
       // This may cause an allocation which seems to be avoidable
-      MatrixType Q = _this.m_hess.matrixQ(); 
+      MatrixType Q = _this.m_hess.matrixQ();
       _this.m_matU = Q.template cast<ComplexScalar>();
     }
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 // Reduce the Hessenberg matrix m_matT to triangular form by QR iteration.
-template<typename MatrixType>
-void ComplexSchur<MatrixType>::reduceToTriangularForm(bool computeU)
-{  
+template <typename MatrixType>
+void ComplexSchur<MatrixType>::reduceToTriangularForm(bool computeU) {
   Index maxIters = m_maxIters;
-  if (maxIters == -1)
-    maxIters = m_maxIterationsPerRow * m_matT.rows();
+  if (maxIters == -1) maxIters = m_maxIterationsPerRow * m_matT.rows();
 
-  // The matrix m_matT is divided in three parts. 
-  // Rows 0,...,il-1 are decoupled from the rest because m_matT(il,il-1) is zero. 
+  // The matrix m_matT is divided in three parts.
+  // Rows 0,...,il-1 are decoupled from the rest because m_matT(il,il-1) is zero.
   // Rows il,...,iu is the part we are working on (the active submatrix).
   // Rows iu+1,...,end are already brought in triangular form.
   Index iu = m_matT.cols() - 1;
   Index il;
-  Index iter = 0; // number of iterations we are working on the (iu,iu) element
-  Index totalIter = 0; // number of iterations for whole matrix
+  Index iter = 0;       // number of iterations we are working on the (iu,iu) element
+  Index totalIter = 0;  // number of iterations for whole matrix
 
-  while(true)
-  {
+  while (true) {
     // find iu, the bottom row of the active submatrix
-    while(iu > 0)
-    {
-      if(!subdiagonalEntryIsNeglegible(iu-1)) break;
+    while (iu > 0) {
+      if (!subdiagonalEntryIsNeglegible(iu - 1)) break;
       iter = 0;
       --iu;
     }
 
     // if iu is zero then we are done; the whole matrix is triangularized
-    if(iu==0) break;
+    if (iu == 0) break;
 
     // if we spent too many iterations, we give up
     iter++;
     totalIter++;
-    if(totalIter > maxIters) break;
+    if (totalIter > maxIters) break;
 
     // find il, the top row of the active submatrix
-    il = iu-1;
-    while(il > 0 && !subdiagonalEntryIsNeglegible(il-1))
-    {
+    il = iu - 1;
+    while (il > 0 && !subdiagonalEntryIsNeglegible(il - 1)) {
       --il;
     }
 
@@ -436,22 +414,21 @@
 
     ComplexScalar shift = computeShift(iu, iter);
     JacobiRotation<ComplexScalar> rot;
-    rot.makeGivens(m_matT.coeff(il,il) - shift, m_matT.coeff(il+1,il));
-    m_matT.rightCols(m_matT.cols()-il).applyOnTheLeft(il, il+1, rot.adjoint());
-    m_matT.topRows((std::min)(il+2,iu)+1).applyOnTheRight(il, il+1, rot);
-    if(computeU) m_matU.applyOnTheRight(il, il+1, rot);
+    rot.makeGivens(m_matT.coeff(il, il) - shift, m_matT.coeff(il + 1, il));
+    m_matT.rightCols(m_matT.cols() - il).applyOnTheLeft(il, il + 1, rot.adjoint());
+    m_matT.topRows((std::min)(il + 2, iu) + 1).applyOnTheRight(il, il + 1, rot);
+    if (computeU) m_matU.applyOnTheRight(il, il + 1, rot);
 
-    for(Index i=il+1 ; i<iu ; i++)
-    {
-      rot.makeGivens(m_matT.coeffRef(i,i-1), m_matT.coeffRef(i+1,i-1), &m_matT.coeffRef(i,i-1));
-      m_matT.coeffRef(i+1,i-1) = ComplexScalar(0);
-      m_matT.rightCols(m_matT.cols()-i).applyOnTheLeft(i, i+1, rot.adjoint());
-      m_matT.topRows((std::min)(i+2,iu)+1).applyOnTheRight(i, i+1, rot);
-      if(computeU) m_matU.applyOnTheRight(i, i+1, rot);
+    for (Index i = il + 1; i < iu; i++) {
+      rot.makeGivens(m_matT.coeffRef(i, i - 1), m_matT.coeffRef(i + 1, i - 1), &m_matT.coeffRef(i, i - 1));
+      m_matT.coeffRef(i + 1, i - 1) = ComplexScalar(0);
+      m_matT.rightCols(m_matT.cols() - i).applyOnTheLeft(i, i + 1, rot.adjoint());
+      m_matT.topRows((std::min)(i + 2, iu) + 1).applyOnTheRight(i, i + 1, rot);
+      if (computeU) m_matU.applyOnTheRight(i, i + 1, rot);
     }
   }
 
-  if(totalIter <= maxIters)
+  if (totalIter <= maxIters)
     m_info = Success;
   else
     m_info = NoConvergence;
@@ -460,6 +437,6 @@
   m_matUisUptodate = computeU;
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_COMPLEX_SCHUR_H
+#endif  // EIGEN_COMPLEX_SCHUR_H
diff --git a/Eigen/src/Eigenvalues/ComplexSchur_LAPACKE.h b/Eigen/src/Eigenvalues/ComplexSchur_LAPACKE.h
index 3f14128..5f66fd9 100644
--- a/Eigen/src/Eigenvalues/ComplexSchur_LAPACKE.h
+++ b/Eigen/src/Eigenvalues/ComplexSchur_LAPACKE.h
@@ -36,59 +36,60 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 /** \internal Specialization for the data types supported by LAPACKe */
 
-#define EIGEN_LAPACKE_SCHUR_COMPLEX(EIGTYPE, LAPACKE_TYPE, LAPACKE_PREFIX, LAPACKE_PREFIX_U, EIGCOLROW, LAPACKE_COLROW) \
-template<> template<typename InputType> inline \
-ComplexSchur<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >& \
-ComplexSchur<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >::compute(const EigenBase<InputType>& matrix, bool computeU) \
-{ \
-  typedef Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> MatrixType; \
-  typedef MatrixType::RealScalar RealScalar; \
-  typedef std::complex<RealScalar> ComplexScalar; \
-\
-  eigen_assert(matrix.cols() == matrix.rows()); \
-\
-  m_matUisUptodate = false; \
-  if(matrix.cols() == 1) \
-  { \
-    m_matT = matrix.derived().template cast<ComplexScalar>(); \
-    if(computeU)  m_matU = ComplexMatrixType::Identity(1,1); \
-      m_info = Success; \
-      m_isInitialized = true; \
-      m_matUisUptodate = computeU; \
-      return *this; \
-  } \
-  lapack_int n = internal::convert_index<lapack_int>(matrix.cols()), sdim, info; \
-  lapack_int matrix_order = LAPACKE_COLROW; \
-  char jobvs, sort='N'; \
-  LAPACK_##LAPACKE_PREFIX_U##_SELECT1 select = 0; \
-  jobvs = (computeU) ? 'V' : 'N'; \
-  m_matU.resize(n, n); \
-  lapack_int ldvs  = internal::convert_index<lapack_int>(m_matU.outerStride()); \
-  m_matT = matrix; \
-  lapack_int lda = internal::convert_index<lapack_int>(m_matT.outerStride()); \
-  Matrix<EIGTYPE, Dynamic, Dynamic> w; \
-  w.resize(n, 1);\
-  info = LAPACKE_##LAPACKE_PREFIX##gees( matrix_order, jobvs, sort, select, n, (LAPACKE_TYPE*)m_matT.data(), lda, &sdim, (LAPACKE_TYPE*)w.data(), (LAPACKE_TYPE*)m_matU.data(), ldvs ); \
-  if(info == 0) \
-    m_info = Success; \
-  else \
-    m_info = NoConvergence; \
-\
-  m_isInitialized = true; \
-  m_matUisUptodate = computeU; \
-  return *this; \
-\
-}
+#define EIGEN_LAPACKE_SCHUR_COMPLEX(EIGTYPE, LAPACKE_TYPE, LAPACKE_PREFIX, LAPACKE_PREFIX_U, EIGCOLROW,            \
+                                    LAPACKE_COLROW)                                                                \
+  template <>                                                                                                      \
+  template <typename InputType>                                                                                    \
+  inline ComplexSchur<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >&                                              \
+  ComplexSchur<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >::compute(const EigenBase<InputType>& matrix,         \
+                                                                       bool computeU) {                            \
+    typedef Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> MatrixType;                                               \
+    typedef MatrixType::RealScalar RealScalar;                                                                     \
+    typedef std::complex<RealScalar> ComplexScalar;                                                                \
+                                                                                                                   \
+    eigen_assert(matrix.cols() == matrix.rows());                                                                  \
+                                                                                                                   \
+    m_matUisUptodate = false;                                                                                      \
+    if (matrix.cols() == 1) {                                                                                      \
+      m_matT = matrix.derived().template cast<ComplexScalar>();                                                    \
+      if (computeU) m_matU = ComplexMatrixType::Identity(1, 1);                                                    \
+      m_info = Success;                                                                                            \
+      m_isInitialized = true;                                                                                      \
+      m_matUisUptodate = computeU;                                                                                 \
+      return *this;                                                                                                \
+    }                                                                                                              \
+    lapack_int n = internal::convert_index<lapack_int>(matrix.cols()), sdim, info;                                 \
+    lapack_int matrix_order = LAPACKE_COLROW;                                                                      \
+    char jobvs, sort = 'N';                                                                                        \
+    LAPACK_##LAPACKE_PREFIX_U##_SELECT1 select = 0;                                                                \
+    jobvs = (computeU) ? 'V' : 'N';                                                                                \
+    m_matU.resize(n, n);                                                                                           \
+    lapack_int ldvs = internal::convert_index<lapack_int>(m_matU.outerStride());                                   \
+    m_matT = matrix;                                                                                               \
+    lapack_int lda = internal::convert_index<lapack_int>(m_matT.outerStride());                                    \
+    Matrix<EIGTYPE, Dynamic, Dynamic> w;                                                                           \
+    w.resize(n, 1);                                                                                                \
+    info = LAPACKE_##LAPACKE_PREFIX##gees(matrix_order, jobvs, sort, select, n, (LAPACKE_TYPE*)m_matT.data(), lda, \
+                                          &sdim, (LAPACKE_TYPE*)w.data(), (LAPACKE_TYPE*)m_matU.data(), ldvs);     \
+    if (info == 0)                                                                                                 \
+      m_info = Success;                                                                                            \
+    else                                                                                                           \
+      m_info = NoConvergence;                                                                                      \
+                                                                                                                   \
+    m_isInitialized = true;                                                                                        \
+    m_matUisUptodate = computeU;                                                                                   \
+    return *this;                                                                                                  \
+  }
 
 EIGEN_LAPACKE_SCHUR_COMPLEX(dcomplex, lapack_complex_double, z, Z, ColMajor, LAPACK_COL_MAJOR)
-EIGEN_LAPACKE_SCHUR_COMPLEX(scomplex, lapack_complex_float,  c, C, ColMajor, LAPACK_COL_MAJOR)
+EIGEN_LAPACKE_SCHUR_COMPLEX(scomplex, lapack_complex_float, c, C, ColMajor, LAPACK_COL_MAJOR)
 EIGEN_LAPACKE_SCHUR_COMPLEX(dcomplex, lapack_complex_double, z, Z, RowMajor, LAPACK_ROW_MAJOR)
-EIGEN_LAPACKE_SCHUR_COMPLEX(scomplex, lapack_complex_float,  c, C, RowMajor, LAPACK_ROW_MAJOR)
+EIGEN_LAPACKE_SCHUR_COMPLEX(scomplex, lapack_complex_float, c, C, RowMajor, LAPACK_ROW_MAJOR)
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_COMPLEX_SCHUR_LAPACKE_H
+#endif  // EIGEN_COMPLEX_SCHUR_LAPACKE_H
diff --git a/Eigen/src/Eigenvalues/EigenSolver.h b/Eigen/src/Eigenvalues/EigenSolver.h
index 0419192..bb6583a 100644
--- a/Eigen/src/Eigenvalues/EigenSolver.h
+++ b/Eigen/src/Eigenvalues/EigenSolver.h
@@ -16,426 +16,401 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 /** \eigenvalues_module \ingroup Eigenvalues_Module
-  *
-  *
-  * \class EigenSolver
-  *
-  * \brief Computes eigenvalues and eigenvectors of general matrices
-  *
-  * \tparam MatrixType_ the type of the matrix of which we are computing the
-  * eigendecomposition; this is expected to be an instantiation of the Matrix
-  * class template. Currently, only real matrices are supported.
-  *
-  * The eigenvalues and eigenvectors of a matrix \f$ A \f$ are scalars
-  * \f$ \lambda \f$ and vectors \f$ v \f$ such that \f$ Av = \lambda v \f$.  If
-  * \f$ D \f$ is a diagonal matrix with the eigenvalues on the diagonal, and
-  * \f$ V \f$ is a matrix with the eigenvectors as its columns, then \f$ A V =
-  * V D \f$. The matrix \f$ V \f$ is almost always invertible, in which case we
-  * have \f$ A = V D V^{-1} \f$. This is called the eigendecomposition.
-  *
-  * The eigenvalues and eigenvectors of a matrix may be complex, even when the
-  * matrix is real. However, we can choose real matrices \f$ V \f$ and \f$ D
-  * \f$ satisfying \f$ A V = V D \f$, just like the eigendecomposition, if the
-  * matrix \f$ D \f$ is not required to be diagonal, but if it is allowed to
-  * have blocks of the form
-  * \f[ \begin{bmatrix} u & v \\ -v & u \end{bmatrix} \f]
-  * (where \f$ u \f$ and \f$ v \f$ are real numbers) on the diagonal.  These
-  * blocks correspond to complex eigenvalue pairs \f$ u \pm iv \f$. We call
-  * this variant of the eigendecomposition the pseudo-eigendecomposition.
-  *
-  * Call the function compute() to compute the eigenvalues and eigenvectors of
-  * a given matrix. Alternatively, you can use the 
-  * EigenSolver(const MatrixType&, bool) constructor which computes the
-  * eigenvalues and eigenvectors at construction time. Once the eigenvalue and
-  * eigenvectors are computed, they can be retrieved with the eigenvalues() and
-  * eigenvectors() functions. The pseudoEigenvalueMatrix() and
-  * pseudoEigenvectors() methods allow the construction of the
-  * pseudo-eigendecomposition.
-  *
-  * The documentation for EigenSolver(const MatrixType&, bool) contains an
-  * example of the typical use of this class.
-  *
-  * \note The implementation is adapted from
-  * <a href="http://math.nist.gov/javanumerics/jama/">JAMA</a> (public domain).
-  * Their code is based on EISPACK.
-  *
-  * \sa MatrixBase::eigenvalues(), class ComplexEigenSolver, class SelfAdjointEigenSolver
-  */
-template<typename MatrixType_> class EigenSolver
-{
-  public:
+ *
+ *
+ * \class EigenSolver
+ *
+ * \brief Computes eigenvalues and eigenvectors of general matrices
+ *
+ * \tparam MatrixType_ the type of the matrix of which we are computing the
+ * eigendecomposition; this is expected to be an instantiation of the Matrix
+ * class template. Currently, only real matrices are supported.
+ *
+ * The eigenvalues and eigenvectors of a matrix \f$ A \f$ are scalars
+ * \f$ \lambda \f$ and vectors \f$ v \f$ such that \f$ Av = \lambda v \f$.  If
+ * \f$ D \f$ is a diagonal matrix with the eigenvalues on the diagonal, and
+ * \f$ V \f$ is a matrix with the eigenvectors as its columns, then \f$ A V =
+ * V D \f$. The matrix \f$ V \f$ is almost always invertible, in which case we
+ * have \f$ A = V D V^{-1} \f$. This is called the eigendecomposition.
+ *
+ * The eigenvalues and eigenvectors of a matrix may be complex, even when the
+ * matrix is real. However, we can choose real matrices \f$ V \f$ and \f$ D
+ * \f$ satisfying \f$ A V = V D \f$, just like the eigendecomposition, if the
+ * matrix \f$ D \f$ is not required to be diagonal, but if it is allowed to
+ * have blocks of the form
+ * \f[ \begin{bmatrix} u & v \\ -v & u \end{bmatrix} \f]
+ * (where \f$ u \f$ and \f$ v \f$ are real numbers) on the diagonal.  These
+ * blocks correspond to complex eigenvalue pairs \f$ u \pm iv \f$. We call
+ * this variant of the eigendecomposition the pseudo-eigendecomposition.
+ *
+ * Call the function compute() to compute the eigenvalues and eigenvectors of
+ * a given matrix. Alternatively, you can use the
+ * EigenSolver(const MatrixType&, bool) constructor which computes the
+ * eigenvalues and eigenvectors at construction time. Once the eigenvalue and
+ * eigenvectors are computed, they can be retrieved with the eigenvalues() and
+ * eigenvectors() functions. The pseudoEigenvalueMatrix() and
+ * pseudoEigenvectors() methods allow the construction of the
+ * pseudo-eigendecomposition.
+ *
+ * The documentation for EigenSolver(const MatrixType&, bool) contains an
+ * example of the typical use of this class.
+ *
+ * \note The implementation is adapted from
+ * <a href="http://math.nist.gov/javanumerics/jama/">JAMA</a> (public domain).
+ * Their code is based on EISPACK.
+ *
+ * \sa MatrixBase::eigenvalues(), class ComplexEigenSolver, class SelfAdjointEigenSolver
+ */
+template <typename MatrixType_>
+class EigenSolver {
+ public:
+  /** \brief Synonym for the template parameter \p MatrixType_. */
+  typedef MatrixType_ MatrixType;
 
-    /** \brief Synonym for the template parameter \p MatrixType_. */
-    typedef MatrixType_ MatrixType;
+  enum {
+    RowsAtCompileTime = MatrixType::RowsAtCompileTime,
+    ColsAtCompileTime = MatrixType::ColsAtCompileTime,
+    Options = MatrixType::Options,
+    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
+  };
 
-    enum {
-      RowsAtCompileTime = MatrixType::RowsAtCompileTime,
-      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
-      Options = MatrixType::Options,
-      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
-      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
-    };
+  /** \brief Scalar type for matrices of type #MatrixType. */
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef Eigen::Index Index;  ///< \deprecated since Eigen 3.3
 
-    /** \brief Scalar type for matrices of type #MatrixType. */
-    typedef typename MatrixType::Scalar Scalar;
-    typedef typename NumTraits<Scalar>::Real RealScalar;
-    typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3
+  /** \brief Complex scalar type for #MatrixType.
+   *
+   * This is \c std::complex<Scalar> if #Scalar is real (e.g.,
+   * \c float or \c double) and just \c Scalar if #Scalar is
+   * complex.
+   */
+  typedef std::complex<RealScalar> ComplexScalar;
 
-    /** \brief Complex scalar type for #MatrixType. 
-      *
-      * This is \c std::complex<Scalar> if #Scalar is real (e.g.,
-      * \c float or \c double) and just \c Scalar if #Scalar is
-      * complex.
-      */
-    typedef std::complex<RealScalar> ComplexScalar;
+  /** \brief Type for vector of eigenvalues as returned by eigenvalues().
+   *
+   * This is a column vector with entries of type #ComplexScalar.
+   * The length of the vector is the size of #MatrixType.
+   */
+  typedef Matrix<ComplexScalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> EigenvalueType;
 
-    /** \brief Type for vector of eigenvalues as returned by eigenvalues(). 
-      *
-      * This is a column vector with entries of type #ComplexScalar.
-      * The length of the vector is the size of #MatrixType.
-      */
-    typedef Matrix<ComplexScalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> EigenvalueType;
+  /** \brief Type for matrix of eigenvectors as returned by eigenvectors().
+   *
+   * This is a square matrix with entries of type #ComplexScalar.
+   * The size is the same as the size of #MatrixType.
+   */
+  typedef Matrix<ComplexScalar, RowsAtCompileTime, ColsAtCompileTime, Options, MaxRowsAtCompileTime,
+                 MaxColsAtCompileTime>
+      EigenvectorsType;
 
-    /** \brief Type for matrix of eigenvectors as returned by eigenvectors(). 
-      *
-      * This is a square matrix with entries of type #ComplexScalar. 
-      * The size is the same as the size of #MatrixType.
-      */
-    typedef Matrix<ComplexScalar, RowsAtCompileTime, ColsAtCompileTime, Options, MaxRowsAtCompileTime, MaxColsAtCompileTime> EigenvectorsType;
+  /** \brief Default constructor.
+   *
+   * The default constructor is useful in cases in which the user intends to
+   * perform decompositions via EigenSolver::compute(const MatrixType&, bool).
+   *
+   * \sa compute() for an example.
+   */
+  EigenSolver()
+      : m_eivec(), m_eivalues(), m_isInitialized(false), m_eigenvectorsOk(false), m_realSchur(), m_matT(), m_tmp() {}
 
-    /** \brief Default constructor.
-      *
-      * The default constructor is useful in cases in which the user intends to
-      * perform decompositions via EigenSolver::compute(const MatrixType&, bool).
-      *
-      * \sa compute() for an example.
-      */
-    EigenSolver() : m_eivec(), m_eivalues(), m_isInitialized(false), m_eigenvectorsOk(false), m_realSchur(), m_matT(), m_tmp() {}
-
-    /** \brief Default constructor with memory preallocation
-      *
-      * Like the default constructor but with preallocation of the internal data
-      * according to the specified problem \a size.
-      * \sa EigenSolver()
-      */
-    explicit EigenSolver(Index size)
+  /** \brief Default constructor with memory preallocation
+   *
+   * Like the default constructor but with preallocation of the internal data
+   * according to the specified problem \a size.
+   * \sa EigenSolver()
+   */
+  explicit EigenSolver(Index size)
       : m_eivec(size, size),
         m_eivalues(size),
         m_isInitialized(false),
         m_eigenvectorsOk(false),
         m_realSchur(size),
-        m_matT(size, size), 
-        m_tmp(size)
-    {}
+        m_matT(size, size),
+        m_tmp(size) {}
 
-    /** \brief Constructor; computes eigendecomposition of given matrix. 
-      * 
-      * \param[in]  matrix  Square matrix whose eigendecomposition is to be computed.
-      * \param[in]  computeEigenvectors  If true, both the eigenvectors and the
-      *    eigenvalues are computed; if false, only the eigenvalues are
-      *    computed. 
-      *
-      * This constructor calls compute() to compute the eigenvalues
-      * and eigenvectors.
-      *
-      * Example: \include EigenSolver_EigenSolver_MatrixType.cpp
-      * Output: \verbinclude EigenSolver_EigenSolver_MatrixType.out
-      *
-      * \sa compute()
-      */
-    template<typename InputType>
-    explicit EigenSolver(const EigenBase<InputType>& matrix, bool computeEigenvectors = true)
+  /** \brief Constructor; computes eigendecomposition of given matrix.
+   *
+   * \param[in]  matrix  Square matrix whose eigendecomposition is to be computed.
+   * \param[in]  computeEigenvectors  If true, both the eigenvectors and the
+   *    eigenvalues are computed; if false, only the eigenvalues are
+   *    computed.
+   *
+   * This constructor calls compute() to compute the eigenvalues
+   * and eigenvectors.
+   *
+   * Example: \include EigenSolver_EigenSolver_MatrixType.cpp
+   * Output: \verbinclude EigenSolver_EigenSolver_MatrixType.out
+   *
+   * \sa compute()
+   */
+  template <typename InputType>
+  explicit EigenSolver(const EigenBase<InputType>& matrix, bool computeEigenvectors = true)
       : m_eivec(matrix.rows(), matrix.cols()),
         m_eivalues(matrix.cols()),
         m_isInitialized(false),
         m_eigenvectorsOk(false),
         m_realSchur(matrix.cols()),
-        m_matT(matrix.rows(), matrix.cols()), 
-        m_tmp(matrix.cols())
-    {
-      compute(matrix.derived(), computeEigenvectors);
-    }
+        m_matT(matrix.rows(), matrix.cols()),
+        m_tmp(matrix.cols()) {
+    compute(matrix.derived(), computeEigenvectors);
+  }
 
-    /** \brief Returns the eigenvectors of given matrix. 
-      *
-      * \returns  %Matrix whose columns are the (possibly complex) eigenvectors.
-      *
-      * \pre Either the constructor 
-      * EigenSolver(const MatrixType&,bool) or the member function
-      * compute(const MatrixType&, bool) has been called before, and
-      * \p computeEigenvectors was set to true (the default).
-      *
-      * Column \f$ k \f$ of the returned matrix is an eigenvector corresponding
-      * to eigenvalue number \f$ k \f$ as returned by eigenvalues().  The
-      * eigenvectors are normalized to have (Euclidean) norm equal to one. The
-      * matrix returned by this function is the matrix \f$ V \f$ in the
-      * eigendecomposition \f$ A = V D V^{-1} \f$, if it exists.
-      *
-      * Example: \include EigenSolver_eigenvectors.cpp
-      * Output: \verbinclude EigenSolver_eigenvectors.out
-      *
-      * \sa eigenvalues(), pseudoEigenvectors()
-      */
-    EigenvectorsType eigenvectors() const;
+  /** \brief Returns the eigenvectors of given matrix.
+   *
+   * \returns  %Matrix whose columns are the (possibly complex) eigenvectors.
+   *
+   * \pre Either the constructor
+   * EigenSolver(const MatrixType&,bool) or the member function
+   * compute(const MatrixType&, bool) has been called before, and
+   * \p computeEigenvectors was set to true (the default).
+   *
+   * Column \f$ k \f$ of the returned matrix is an eigenvector corresponding
+   * to eigenvalue number \f$ k \f$ as returned by eigenvalues().  The
+   * eigenvectors are normalized to have (Euclidean) norm equal to one. The
+   * matrix returned by this function is the matrix \f$ V \f$ in the
+   * eigendecomposition \f$ A = V D V^{-1} \f$, if it exists.
+   *
+   * Example: \include EigenSolver_eigenvectors.cpp
+   * Output: \verbinclude EigenSolver_eigenvectors.out
+   *
+   * \sa eigenvalues(), pseudoEigenvectors()
+   */
+  EigenvectorsType eigenvectors() const;
 
-    /** \brief Returns the pseudo-eigenvectors of given matrix. 
-      *
-      * \returns  Const reference to matrix whose columns are the pseudo-eigenvectors.
-      *
-      * \pre Either the constructor 
-      * EigenSolver(const MatrixType&,bool) or the member function
-      * compute(const MatrixType&, bool) has been called before, and
-      * \p computeEigenvectors was set to true (the default).
-      *
-      * The real matrix \f$ V \f$ returned by this function and the
-      * block-diagonal matrix \f$ D \f$ returned by pseudoEigenvalueMatrix()
-      * satisfy \f$ AV = VD \f$.
-      *
-      * Example: \include EigenSolver_pseudoEigenvectors.cpp
-      * Output: \verbinclude EigenSolver_pseudoEigenvectors.out
-      *
-      * \sa pseudoEigenvalueMatrix(), eigenvectors()
-      */
-    const MatrixType& pseudoEigenvectors() const
-    {
-      eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
-      eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
-      return m_eivec;
-    }
+  /** \brief Returns the pseudo-eigenvectors of given matrix.
+   *
+   * \returns  Const reference to matrix whose columns are the pseudo-eigenvectors.
+   *
+   * \pre Either the constructor
+   * EigenSolver(const MatrixType&,bool) or the member function
+   * compute(const MatrixType&, bool) has been called before, and
+   * \p computeEigenvectors was set to true (the default).
+   *
+   * The real matrix \f$ V \f$ returned by this function and the
+   * block-diagonal matrix \f$ D \f$ returned by pseudoEigenvalueMatrix()
+   * satisfy \f$ AV = VD \f$.
+   *
+   * Example: \include EigenSolver_pseudoEigenvectors.cpp
+   * Output: \verbinclude EigenSolver_pseudoEigenvectors.out
+   *
+   * \sa pseudoEigenvalueMatrix(), eigenvectors()
+   */
+  const MatrixType& pseudoEigenvectors() const {
+    eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
+    eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
+    return m_eivec;
+  }
 
-    /** \brief Returns the block-diagonal matrix in the pseudo-eigendecomposition.
-      *
-      * \returns  A block-diagonal matrix.
-      *
-      * \pre Either the constructor 
-      * EigenSolver(const MatrixType&,bool) or the member function
-      * compute(const MatrixType&, bool) has been called before.
-      *
-      * The matrix \f$ D \f$ returned by this function is real and
-      * block-diagonal. The blocks on the diagonal are either 1-by-1 or 2-by-2
-      * blocks of the form
-      * \f$ \begin{bmatrix} u & v \\ -v & u \end{bmatrix} \f$.
-      * These blocks are not sorted in any particular order.
-      * The matrix \f$ D \f$ and the matrix \f$ V \f$ returned by
-      * pseudoEigenvectors() satisfy \f$ AV = VD \f$.
-      *
-      * \sa pseudoEigenvectors() for an example, eigenvalues()
-      */
-    MatrixType pseudoEigenvalueMatrix() const;
+  /** \brief Returns the block-diagonal matrix in the pseudo-eigendecomposition.
+   *
+   * \returns  A block-diagonal matrix.
+   *
+   * \pre Either the constructor
+   * EigenSolver(const MatrixType&,bool) or the member function
+   * compute(const MatrixType&, bool) has been called before.
+   *
+   * The matrix \f$ D \f$ returned by this function is real and
+   * block-diagonal. The blocks on the diagonal are either 1-by-1 or 2-by-2
+   * blocks of the form
+   * \f$ \begin{bmatrix} u & v \\ -v & u \end{bmatrix} \f$.
+   * These blocks are not sorted in any particular order.
+   * The matrix \f$ D \f$ and the matrix \f$ V \f$ returned by
+   * pseudoEigenvectors() satisfy \f$ AV = VD \f$.
+   *
+   * \sa pseudoEigenvectors() for an example, eigenvalues()
+   */
+  MatrixType pseudoEigenvalueMatrix() const;
 
-    /** \brief Returns the eigenvalues of given matrix. 
-      *
-      * \returns A const reference to the column vector containing the eigenvalues.
-      *
-      * \pre Either the constructor 
-      * EigenSolver(const MatrixType&,bool) or the member function
-      * compute(const MatrixType&, bool) has been called before.
-      *
-      * The eigenvalues are repeated according to their algebraic multiplicity,
-      * so there are as many eigenvalues as rows in the matrix. The eigenvalues 
-      * are not sorted in any particular order.
-      *
-      * Example: \include EigenSolver_eigenvalues.cpp
-      * Output: \verbinclude EigenSolver_eigenvalues.out
-      *
-      * \sa eigenvectors(), pseudoEigenvalueMatrix(),
-      *     MatrixBase::eigenvalues()
-      */
-    const EigenvalueType& eigenvalues() const
-    {
-      eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
-      return m_eivalues;
-    }
+  /** \brief Returns the eigenvalues of given matrix.
+   *
+   * \returns A const reference to the column vector containing the eigenvalues.
+   *
+   * \pre Either the constructor
+   * EigenSolver(const MatrixType&,bool) or the member function
+   * compute(const MatrixType&, bool) has been called before.
+   *
+   * The eigenvalues are repeated according to their algebraic multiplicity,
+   * so there are as many eigenvalues as rows in the matrix. The eigenvalues
+   * are not sorted in any particular order.
+   *
+   * Example: \include EigenSolver_eigenvalues.cpp
+   * Output: \verbinclude EigenSolver_eigenvalues.out
+   *
+   * \sa eigenvectors(), pseudoEigenvalueMatrix(),
+   *     MatrixBase::eigenvalues()
+   */
+  const EigenvalueType& eigenvalues() const {
+    eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
+    return m_eivalues;
+  }
 
-    /** \brief Computes eigendecomposition of given matrix. 
-      * 
-      * \param[in]  matrix  Square matrix whose eigendecomposition is to be computed.
-      * \param[in]  computeEigenvectors  If true, both the eigenvectors and the
-      *    eigenvalues are computed; if false, only the eigenvalues are
-      *    computed. 
-      * \returns    Reference to \c *this
-      *
-      * This function computes the eigenvalues of the real matrix \p matrix.
-      * The eigenvalues() function can be used to retrieve them.  If 
-      * \p computeEigenvectors is true, then the eigenvectors are also computed
-      * and can be retrieved by calling eigenvectors().
-      *
-      * The matrix is first reduced to real Schur form using the RealSchur
-      * class. The Schur decomposition is then used to compute the eigenvalues
-      * and eigenvectors.
-      *
-      * The cost of the computation is dominated by the cost of the
-      * Schur decomposition, which is very approximately \f$ 25n^3 \f$
-      * (where \f$ n \f$ is the size of the matrix) if \p computeEigenvectors 
-      * is true, and \f$ 10n^3 \f$ if \p computeEigenvectors is false.
-      *
-      * This method reuses of the allocated data in the EigenSolver object.
-      *
-      * Example: \include EigenSolver_compute.cpp
-      * Output: \verbinclude EigenSolver_compute.out
-      */
-    template<typename InputType>
-    EigenSolver& compute(const EigenBase<InputType>& matrix, bool computeEigenvectors = true);
+  /** \brief Computes eigendecomposition of given matrix.
+   *
+   * \param[in]  matrix  Square matrix whose eigendecomposition is to be computed.
+   * \param[in]  computeEigenvectors  If true, both the eigenvectors and the
+   *    eigenvalues are computed; if false, only the eigenvalues are
+   *    computed.
+   * \returns    Reference to \c *this
+   *
+   * This function computes the eigenvalues of the real matrix \p matrix.
+   * The eigenvalues() function can be used to retrieve them.  If
+   * \p computeEigenvectors is true, then the eigenvectors are also computed
+   * and can be retrieved by calling eigenvectors().
+   *
+   * The matrix is first reduced to real Schur form using the RealSchur
+   * class. The Schur decomposition is then used to compute the eigenvalues
+   * and eigenvectors.
+   *
+   * The cost of the computation is dominated by the cost of the
+   * Schur decomposition, which is very approximately \f$ 25n^3 \f$
+   * (where \f$ n \f$ is the size of the matrix) if \p computeEigenvectors
+   * is true, and \f$ 10n^3 \f$ if \p computeEigenvectors is false.
+   *
+   * This method reuses of the allocated data in the EigenSolver object.
+   *
+   * Example: \include EigenSolver_compute.cpp
+   * Output: \verbinclude EigenSolver_compute.out
+   */
+  template <typename InputType>
+  EigenSolver& compute(const EigenBase<InputType>& matrix, bool computeEigenvectors = true);
 
-    /** \returns NumericalIssue if the input contains INF or NaN values or overflow occurred. Returns Success otherwise. */
-    ComputationInfo info() const
-    {
-      eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
-      return m_info;
-    }
+  /** \returns NumericalIssue if the input contains INF or NaN values or overflow occurred. Returns Success otherwise.
+   */
+  ComputationInfo info() const {
+    eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
+    return m_info;
+  }
 
-    /** \brief Sets the maximum number of iterations allowed. */
-    EigenSolver& setMaxIterations(Index maxIters)
-    {
-      m_realSchur.setMaxIterations(maxIters);
-      return *this;
-    }
+  /** \brief Sets the maximum number of iterations allowed. */
+  EigenSolver& setMaxIterations(Index maxIters) {
+    m_realSchur.setMaxIterations(maxIters);
+    return *this;
+  }
 
-    /** \brief Returns the maximum number of iterations. */
-    Index getMaxIterations()
-    {
-      return m_realSchur.getMaxIterations();
-    }
+  /** \brief Returns the maximum number of iterations. */
+  Index getMaxIterations() { return m_realSchur.getMaxIterations(); }
 
-  private:
-    void doComputeEigenvectors();
+ private:
+  void doComputeEigenvectors();
 
-  protected:
-    
-    static void check_template_parameters()
-    {
-      EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);
-      EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::IsComplex, NUMERIC_TYPE_MUST_BE_REAL);
-    }
-    
-    MatrixType m_eivec;
-    EigenvalueType m_eivalues;
-    bool m_isInitialized;
-    bool m_eigenvectorsOk;
-    ComputationInfo m_info;
-    RealSchur<MatrixType> m_realSchur;
-    MatrixType m_matT;
+ protected:
+  static void check_template_parameters() {
+    EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);
+    EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::IsComplex, NUMERIC_TYPE_MUST_BE_REAL);
+  }
 
-    typedef Matrix<Scalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> ColumnVectorType;
-    ColumnVectorType m_tmp;
+  MatrixType m_eivec;
+  EigenvalueType m_eivalues;
+  bool m_isInitialized;
+  bool m_eigenvectorsOk;
+  ComputationInfo m_info;
+  RealSchur<MatrixType> m_realSchur;
+  MatrixType m_matT;
+
+  typedef Matrix<Scalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> ColumnVectorType;
+  ColumnVectorType m_tmp;
 };
 
-template<typename MatrixType>
-MatrixType EigenSolver<MatrixType>::pseudoEigenvalueMatrix() const
-{
+template <typename MatrixType>
+MatrixType EigenSolver<MatrixType>::pseudoEigenvalueMatrix() const {
   eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
-  const RealScalar precision = RealScalar(2)*NumTraits<RealScalar>::epsilon();
+  const RealScalar precision = RealScalar(2) * NumTraits<RealScalar>::epsilon();
   Index n = m_eivalues.rows();
-  MatrixType matD = MatrixType::Zero(n,n);
-  for (Index i=0; i<n; ++i)
-  {
+  MatrixType matD = MatrixType::Zero(n, n);
+  for (Index i = 0; i < n; ++i) {
     if (internal::isMuchSmallerThan(numext::imag(m_eivalues.coeff(i)), numext::real(m_eivalues.coeff(i)), precision))
-      matD.coeffRef(i,i) = numext::real(m_eivalues.coeff(i));
-    else
-    {
-      matD.template block<2,2>(i,i) <<  numext::real(m_eivalues.coeff(i)), numext::imag(m_eivalues.coeff(i)),
-                                       -numext::imag(m_eivalues.coeff(i)), numext::real(m_eivalues.coeff(i));
+      matD.coeffRef(i, i) = numext::real(m_eivalues.coeff(i));
+    else {
+      matD.template block<2, 2>(i, i) << numext::real(m_eivalues.coeff(i)), numext::imag(m_eivalues.coeff(i)),
+          -numext::imag(m_eivalues.coeff(i)), numext::real(m_eivalues.coeff(i));
       ++i;
     }
   }
   return matD;
 }
 
-template<typename MatrixType>
-typename EigenSolver<MatrixType>::EigenvectorsType EigenSolver<MatrixType>::eigenvectors() const
-{
+template <typename MatrixType>
+typename EigenSolver<MatrixType>::EigenvectorsType EigenSolver<MatrixType>::eigenvectors() const {
   eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
   eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
-  const RealScalar precision = RealScalar(2)*NumTraits<RealScalar>::epsilon();
+  const RealScalar precision = RealScalar(2) * NumTraits<RealScalar>::epsilon();
   Index n = m_eivec.cols();
-  EigenvectorsType matV(n,n);
-  for (Index j=0; j<n; ++j)
-  {
-    if (internal::isMuchSmallerThan(numext::imag(m_eivalues.coeff(j)), numext::real(m_eivalues.coeff(j)), precision) || j+1==n)
-    {
+  EigenvectorsType matV(n, n);
+  for (Index j = 0; j < n; ++j) {
+    if (internal::isMuchSmallerThan(numext::imag(m_eivalues.coeff(j)), numext::real(m_eivalues.coeff(j)), precision) ||
+        j + 1 == n) {
       // we have a real eigen value
       matV.col(j) = m_eivec.col(j).template cast<ComplexScalar>();
       matV.col(j).normalize();
-    }
-    else
-    {
+    } else {
       // we have a pair of complex eigen values
-      for (Index i=0; i<n; ++i)
-      {
-        matV.coeffRef(i,j)   = ComplexScalar(m_eivec.coeff(i,j),  m_eivec.coeff(i,j+1));
-        matV.coeffRef(i,j+1) = ComplexScalar(m_eivec.coeff(i,j), -m_eivec.coeff(i,j+1));
+      for (Index i = 0; i < n; ++i) {
+        matV.coeffRef(i, j) = ComplexScalar(m_eivec.coeff(i, j), m_eivec.coeff(i, j + 1));
+        matV.coeffRef(i, j + 1) = ComplexScalar(m_eivec.coeff(i, j), -m_eivec.coeff(i, j + 1));
       }
       matV.col(j).normalize();
-      matV.col(j+1).normalize();
+      matV.col(j + 1).normalize();
       ++j;
     }
   }
   return matV;
 }
 
-template<typename MatrixType>
-template<typename InputType>
-EigenSolver<MatrixType>& 
-EigenSolver<MatrixType>::compute(const EigenBase<InputType>& matrix, bool computeEigenvectors)
-{
+template <typename MatrixType>
+template <typename InputType>
+EigenSolver<MatrixType>& EigenSolver<MatrixType>::compute(const EigenBase<InputType>& matrix,
+                                                          bool computeEigenvectors) {
   check_template_parameters();
-  
-  using std::sqrt;
-  using std::abs;
+
   using numext::isfinite;
+  using std::abs;
+  using std::sqrt;
   eigen_assert(matrix.cols() == matrix.rows());
 
   // Reduce to real Schur form.
   m_realSchur.compute(matrix.derived(), computeEigenvectors);
-  
+
   m_info = m_realSchur.info();
 
-  if (m_info == Success)
-  {
+  if (m_info == Success) {
     m_matT = m_realSchur.matrixT();
-    if (computeEigenvectors)
-      m_eivec = m_realSchur.matrixU();
-  
+    if (computeEigenvectors) m_eivec = m_realSchur.matrixU();
+
     // Compute eigenvalues from matT
     m_eivalues.resize(matrix.cols());
     Index i = 0;
-    while (i < matrix.cols()) 
-    {
-      if (i == matrix.cols() - 1 || m_matT.coeff(i+1, i) == Scalar(0)) 
-      {
+    while (i < matrix.cols()) {
+      if (i == matrix.cols() - 1 || m_matT.coeff(i + 1, i) == Scalar(0)) {
         m_eivalues.coeffRef(i) = m_matT.coeff(i, i);
-        if(!(isfinite)(m_eivalues.coeffRef(i)))
-        {
+        if (!(isfinite)(m_eivalues.coeffRef(i))) {
           m_isInitialized = true;
           m_eigenvectorsOk = false;
           m_info = NumericalIssue;
           return *this;
         }
         ++i;
-      }
-      else
-      {
-        Scalar p = Scalar(0.5) * (m_matT.coeff(i, i) - m_matT.coeff(i+1, i+1));
+      } else {
+        Scalar p = Scalar(0.5) * (m_matT.coeff(i, i) - m_matT.coeff(i + 1, i + 1));
         Scalar z;
         // Compute z = sqrt(abs(p * p + m_matT.coeff(i+1, i) * m_matT.coeff(i, i+1)));
         // without overflow
         {
-          Scalar t0 = m_matT.coeff(i+1, i);
-          Scalar t1 = m_matT.coeff(i, i+1);
-          Scalar maxval = numext::maxi<Scalar>(abs(p),numext::maxi<Scalar>(abs(t0),abs(t1)));
+          Scalar t0 = m_matT.coeff(i + 1, i);
+          Scalar t1 = m_matT.coeff(i, i + 1);
+          Scalar maxval = numext::maxi<Scalar>(abs(p), numext::maxi<Scalar>(abs(t0), abs(t1)));
           t0 /= maxval;
           t1 /= maxval;
-          Scalar p0 = p/maxval;
+          Scalar p0 = p / maxval;
           z = maxval * sqrt(abs(p0 * p0 + t0 * t1));
         }
-        
-        m_eivalues.coeffRef(i)   = ComplexScalar(m_matT.coeff(i+1, i+1) + p, z);
-        m_eivalues.coeffRef(i+1) = ComplexScalar(m_matT.coeff(i+1, i+1) + p, -z);
-        if(!((isfinite)(m_eivalues.coeffRef(i)) && (isfinite)(m_eivalues.coeffRef(i+1))))
-        {
+
+        m_eivalues.coeffRef(i) = ComplexScalar(m_matT.coeff(i + 1, i + 1) + p, z);
+        m_eivalues.coeffRef(i + 1) = ComplexScalar(m_matT.coeff(i + 1, i + 1) + p, -z);
+        if (!((isfinite)(m_eivalues.coeffRef(i)) && (isfinite)(m_eivalues.coeffRef(i + 1)))) {
           m_isInitialized = true;
           m_eigenvectorsOk = false;
           m_info = NumericalIssue;
@@ -444,10 +419,9 @@
         i += 2;
       }
     }
-    
+
     // Compute eigenvectors.
-    if (computeEigenvectors)
-      doComputeEigenvectors();
+    if (computeEigenvectors) doComputeEigenvectors();
   }
 
   m_isInitialized = true;
@@ -456,170 +430,143 @@
   return *this;
 }
 
-
-template<typename MatrixType>
-void EigenSolver<MatrixType>::doComputeEigenvectors()
-{
+template <typename MatrixType>
+void EigenSolver<MatrixType>::doComputeEigenvectors() {
   using std::abs;
   const Index size = m_eivec.cols();
   const Scalar eps = NumTraits<Scalar>::epsilon();
 
   // inefficient! this is already computed in RealSchur
   Scalar norm(0);
-  for (Index j = 0; j < size; ++j)
-  {
-    norm += m_matT.row(j).segment((std::max)(j-1,Index(0)), size-(std::max)(j-1,Index(0))).cwiseAbs().sum();
+  for (Index j = 0; j < size; ++j) {
+    norm += m_matT.row(j).segment((std::max)(j - 1, Index(0)), size - (std::max)(j - 1, Index(0))).cwiseAbs().sum();
   }
-  
+
   // Backsubstitute to find vectors of upper triangular form
-  if (norm == Scalar(0))
-  {
+  if (norm == Scalar(0)) {
     return;
   }
 
-  for (Index n = size-1; n >= 0; n--)
-  {
+  for (Index n = size - 1; n >= 0; n--) {
     Scalar p = m_eivalues.coeff(n).real();
     Scalar q = m_eivalues.coeff(n).imag();
 
     // Scalar vector
-    if (q == Scalar(0))
-    {
+    if (q == Scalar(0)) {
       Scalar lastr(0), lastw(0);
       Index l = n;
 
-      m_matT.coeffRef(n,n) = Scalar(1);
-      for (Index i = n-1; i >= 0; i--)
-      {
-        Scalar w = m_matT.coeff(i,i) - p;
-        Scalar r = m_matT.row(i).segment(l,n-l+1).dot(m_matT.col(n).segment(l, n-l+1));
+      m_matT.coeffRef(n, n) = Scalar(1);
+      for (Index i = n - 1; i >= 0; i--) {
+        Scalar w = m_matT.coeff(i, i) - p;
+        Scalar r = m_matT.row(i).segment(l, n - l + 1).dot(m_matT.col(n).segment(l, n - l + 1));
 
-        if (m_eivalues.coeff(i).imag() < Scalar(0))
-        {
+        if (m_eivalues.coeff(i).imag() < Scalar(0)) {
           lastw = w;
           lastr = r;
-        }
-        else
-        {
+        } else {
           l = i;
-          if (m_eivalues.coeff(i).imag() == Scalar(0))
-          {
+          if (m_eivalues.coeff(i).imag() == Scalar(0)) {
             if (w != Scalar(0))
-              m_matT.coeffRef(i,n) = -r / w;
+              m_matT.coeffRef(i, n) = -r / w;
             else
-              m_matT.coeffRef(i,n) = -r / (eps * norm);
-          }
-          else // Solve real equations
+              m_matT.coeffRef(i, n) = -r / (eps * norm);
+          } else  // Solve real equations
           {
-            Scalar x = m_matT.coeff(i,i+1);
-            Scalar y = m_matT.coeff(i+1,i);
-            Scalar denom = (m_eivalues.coeff(i).real() - p) * (m_eivalues.coeff(i).real() - p) + m_eivalues.coeff(i).imag() * m_eivalues.coeff(i).imag();
+            Scalar x = m_matT.coeff(i, i + 1);
+            Scalar y = m_matT.coeff(i + 1, i);
+            Scalar denom = (m_eivalues.coeff(i).real() - p) * (m_eivalues.coeff(i).real() - p) +
+                           m_eivalues.coeff(i).imag() * m_eivalues.coeff(i).imag();
             Scalar t = (x * lastr - lastw * r) / denom;
-            m_matT.coeffRef(i,n) = t;
+            m_matT.coeffRef(i, n) = t;
             if (abs(x) > abs(lastw))
-              m_matT.coeffRef(i+1,n) = (-r - w * t) / x;
+              m_matT.coeffRef(i + 1, n) = (-r - w * t) / x;
             else
-              m_matT.coeffRef(i+1,n) = (-lastr - y * t) / lastw;
+              m_matT.coeffRef(i + 1, n) = (-lastr - y * t) / lastw;
           }
 
           // Overflow control
-          Scalar t = abs(m_matT.coeff(i,n));
-          if ((eps * t) * t > Scalar(1))
-            m_matT.col(n).tail(size-i) /= t;
+          Scalar t = abs(m_matT.coeff(i, n));
+          if ((eps * t) * t > Scalar(1)) m_matT.col(n).tail(size - i) /= t;
         }
       }
-    }
-    else if (q < Scalar(0) && n > 0) // Complex vector
+    } else if (q < Scalar(0) && n > 0)  // Complex vector
     {
       Scalar lastra(0), lastsa(0), lastw(0);
-      Index l = n-1;
+      Index l = n - 1;
 
       // Last vector component imaginary so matrix is triangular
-      if (abs(m_matT.coeff(n,n-1)) > abs(m_matT.coeff(n-1,n)))
-      {
-        m_matT.coeffRef(n-1,n-1) = q / m_matT.coeff(n,n-1);
-        m_matT.coeffRef(n-1,n) = -(m_matT.coeff(n,n) - p) / m_matT.coeff(n,n-1);
+      if (abs(m_matT.coeff(n, n - 1)) > abs(m_matT.coeff(n - 1, n))) {
+        m_matT.coeffRef(n - 1, n - 1) = q / m_matT.coeff(n, n - 1);
+        m_matT.coeffRef(n - 1, n) = -(m_matT.coeff(n, n) - p) / m_matT.coeff(n, n - 1);
+      } else {
+        ComplexScalar cc =
+            ComplexScalar(Scalar(0), -m_matT.coeff(n - 1, n)) / ComplexScalar(m_matT.coeff(n - 1, n - 1) - p, q);
+        m_matT.coeffRef(n - 1, n - 1) = numext::real(cc);
+        m_matT.coeffRef(n - 1, n) = numext::imag(cc);
       }
-      else
-      {
-        ComplexScalar cc = ComplexScalar(Scalar(0),-m_matT.coeff(n-1,n)) / ComplexScalar(m_matT.coeff(n-1,n-1)-p,q);
-        m_matT.coeffRef(n-1,n-1) = numext::real(cc);
-        m_matT.coeffRef(n-1,n) = numext::imag(cc);
-      }
-      m_matT.coeffRef(n,n-1) = Scalar(0);
-      m_matT.coeffRef(n,n) = Scalar(1);
-      for (Index i = n-2; i >= 0; i--)
-      {
-        Scalar ra = m_matT.row(i).segment(l, n-l+1).dot(m_matT.col(n-1).segment(l, n-l+1));
-        Scalar sa = m_matT.row(i).segment(l, n-l+1).dot(m_matT.col(n).segment(l, n-l+1));
-        Scalar w = m_matT.coeff(i,i) - p;
+      m_matT.coeffRef(n, n - 1) = Scalar(0);
+      m_matT.coeffRef(n, n) = Scalar(1);
+      for (Index i = n - 2; i >= 0; i--) {
+        Scalar ra = m_matT.row(i).segment(l, n - l + 1).dot(m_matT.col(n - 1).segment(l, n - l + 1));
+        Scalar sa = m_matT.row(i).segment(l, n - l + 1).dot(m_matT.col(n).segment(l, n - l + 1));
+        Scalar w = m_matT.coeff(i, i) - p;
 
-        if (m_eivalues.coeff(i).imag() < Scalar(0))
-        {
+        if (m_eivalues.coeff(i).imag() < Scalar(0)) {
           lastw = w;
           lastra = ra;
           lastsa = sa;
-        }
-        else
-        {
+        } else {
           l = i;
-          if (m_eivalues.coeff(i).imag() == RealScalar(0))
-          {
-            ComplexScalar cc = ComplexScalar(-ra,-sa) / ComplexScalar(w,q);
-            m_matT.coeffRef(i,n-1) = numext::real(cc);
-            m_matT.coeffRef(i,n) = numext::imag(cc);
-          }
-          else
-          {
+          if (m_eivalues.coeff(i).imag() == RealScalar(0)) {
+            ComplexScalar cc = ComplexScalar(-ra, -sa) / ComplexScalar(w, q);
+            m_matT.coeffRef(i, n - 1) = numext::real(cc);
+            m_matT.coeffRef(i, n) = numext::imag(cc);
+          } else {
             // Solve complex equations
-            Scalar x = m_matT.coeff(i,i+1);
-            Scalar y = m_matT.coeff(i+1,i);
-            Scalar vr = (m_eivalues.coeff(i).real() - p) * (m_eivalues.coeff(i).real() - p) + m_eivalues.coeff(i).imag() * m_eivalues.coeff(i).imag() - q * q;
+            Scalar x = m_matT.coeff(i, i + 1);
+            Scalar y = m_matT.coeff(i + 1, i);
+            Scalar vr = (m_eivalues.coeff(i).real() - p) * (m_eivalues.coeff(i).real() - p) +
+                        m_eivalues.coeff(i).imag() * m_eivalues.coeff(i).imag() - q * q;
             Scalar vi = (m_eivalues.coeff(i).real() - p) * Scalar(2) * q;
             if ((vr == Scalar(0)) && (vi == Scalar(0)))
               vr = eps * norm * (abs(w) + abs(q) + abs(x) + abs(y) + abs(lastw));
 
-            ComplexScalar cc = ComplexScalar(x*lastra-lastw*ra+q*sa,x*lastsa-lastw*sa-q*ra) / ComplexScalar(vr,vi);
-            m_matT.coeffRef(i,n-1) = numext::real(cc);
-            m_matT.coeffRef(i,n) = numext::imag(cc);
-            if (abs(x) > (abs(lastw) + abs(q)))
-            {
-              m_matT.coeffRef(i+1,n-1) = (-ra - w * m_matT.coeff(i,n-1) + q * m_matT.coeff(i,n)) / x;
-              m_matT.coeffRef(i+1,n) = (-sa - w * m_matT.coeff(i,n) - q * m_matT.coeff(i,n-1)) / x;
-            }
-            else
-            {
-              cc = ComplexScalar(-lastra-y*m_matT.coeff(i,n-1),-lastsa-y*m_matT.coeff(i,n)) / ComplexScalar(lastw,q);
-              m_matT.coeffRef(i+1,n-1) = numext::real(cc);
-              m_matT.coeffRef(i+1,n) = numext::imag(cc);
+            ComplexScalar cc = ComplexScalar(x * lastra - lastw * ra + q * sa, x * lastsa - lastw * sa - q * ra) /
+                               ComplexScalar(vr, vi);
+            m_matT.coeffRef(i, n - 1) = numext::real(cc);
+            m_matT.coeffRef(i, n) = numext::imag(cc);
+            if (abs(x) > (abs(lastw) + abs(q))) {
+              m_matT.coeffRef(i + 1, n - 1) = (-ra - w * m_matT.coeff(i, n - 1) + q * m_matT.coeff(i, n)) / x;
+              m_matT.coeffRef(i + 1, n) = (-sa - w * m_matT.coeff(i, n) - q * m_matT.coeff(i, n - 1)) / x;
+            } else {
+              cc = ComplexScalar(-lastra - y * m_matT.coeff(i, n - 1), -lastsa - y * m_matT.coeff(i, n)) /
+                   ComplexScalar(lastw, q);
+              m_matT.coeffRef(i + 1, n - 1) = numext::real(cc);
+              m_matT.coeffRef(i + 1, n) = numext::imag(cc);
             }
           }
 
           // Overflow control
-          Scalar t = numext::maxi<Scalar>(abs(m_matT.coeff(i,n-1)),abs(m_matT.coeff(i,n)));
-          if ((eps * t) * t > Scalar(1))
-            m_matT.block(i, n-1, size-i, 2) /= t;
-
+          Scalar t = numext::maxi<Scalar>(abs(m_matT.coeff(i, n - 1)), abs(m_matT.coeff(i, n)));
+          if ((eps * t) * t > Scalar(1)) m_matT.block(i, n - 1, size - i, 2) /= t;
         }
       }
-      
+
       // We handled a pair of complex conjugate eigenvalues, so need to skip them both
       n--;
-    }
-    else
-    {
-      eigen_assert(0 && "Internal bug in EigenSolver (INF or NaN has not been detected)"); // this should not happen
+    } else {
+      eigen_assert(0 && "Internal bug in EigenSolver (INF or NaN has not been detected)");  // this should not happen
     }
   }
 
   // Back transformation to get eigenvectors of original matrix
-  for (Index j = size-1; j >= 0; j--)
-  {
-    m_tmp.noalias() = m_eivec.leftCols(j+1) * m_matT.col(j).segment(0, j+1);
+  for (Index j = size - 1; j >= 0; j--) {
+    m_tmp.noalias() = m_eivec.leftCols(j + 1) * m_matT.col(j).segment(0, j + 1);
     m_eivec.col(j) = m_tmp;
   }
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_EIGENSOLVER_H
+#endif  // EIGEN_EIGENSOLVER_H
diff --git a/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h b/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h
index 3f8b136..95954e7 100644
--- a/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h
+++ b/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h
@@ -17,334 +17,319 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 /** \eigenvalues_module \ingroup Eigenvalues_Module
-  *
-  *
-  * \class GeneralizedEigenSolver
-  *
-  * \brief Computes the generalized eigenvalues and eigenvectors of a pair of general matrices
-  *
-  * \tparam MatrixType_ the type of the matrices of which we are computing the
-  * eigen-decomposition; this is expected to be an instantiation of the Matrix
-  * class template. Currently, only real matrices are supported.
-  *
-  * The generalized eigenvalues and eigenvectors of a matrix pair \f$ A \f$ and \f$ B \f$ are scalars
-  * \f$ \lambda \f$ and vectors \f$ v \f$ such that \f$ Av = \lambda Bv \f$.  If
-  * \f$ D \f$ is a diagonal matrix with the eigenvalues on the diagonal, and
-  * \f$ V \f$ is a matrix with the eigenvectors as its columns, then \f$ A V =
-  * B V D \f$. The matrix \f$ V \f$ is almost always invertible, in which case we
-  * have \f$ A = B V D V^{-1} \f$. This is called the generalized eigen-decomposition.
-  *
-  * The generalized eigenvalues and eigenvectors of a matrix pair may be complex, even when the
-  * matrices are real. Moreover, the generalized eigenvalue might be infinite if the matrix B is
-  * singular. To workaround this difficulty, the eigenvalues are provided as a pair of complex \f$ \alpha \f$
-  * and real \f$ \beta \f$ such that: \f$ \lambda_i = \alpha_i / \beta_i \f$. If \f$ \beta_i \f$ is (nearly) zero,
-  * then one can consider the well defined left eigenvalue \f$ \mu = \beta_i / \alpha_i\f$ such that:
-  * \f$ \mu_i A v_i = B v_i \f$, or even \f$ \mu_i u_i^T A  = u_i^T B \f$ where \f$ u_i \f$ is
-  * called the left eigenvector.
-  *
-  * Call the function compute() to compute the generalized eigenvalues and eigenvectors of
-  * a given matrix pair. Alternatively, you can use the
-  * GeneralizedEigenSolver(const MatrixType&, const MatrixType&, bool) constructor which computes the
-  * eigenvalues and eigenvectors at construction time. Once the eigenvalue and
-  * eigenvectors are computed, they can be retrieved with the eigenvalues() and
-  * eigenvectors() functions.
-  *
-  * Here is an usage example of this class:
-  * Example: \include GeneralizedEigenSolver.cpp
-  * Output: \verbinclude GeneralizedEigenSolver.out
-  *
-  * \sa MatrixBase::eigenvalues(), class ComplexEigenSolver, class SelfAdjointEigenSolver
-  */
-template<typename MatrixType_> class GeneralizedEigenSolver
-{
-  public:
+ *
+ *
+ * \class GeneralizedEigenSolver
+ *
+ * \brief Computes the generalized eigenvalues and eigenvectors of a pair of general matrices
+ *
+ * \tparam MatrixType_ the type of the matrices of which we are computing the
+ * eigen-decomposition; this is expected to be an instantiation of the Matrix
+ * class template. Currently, only real matrices are supported.
+ *
+ * The generalized eigenvalues and eigenvectors of a matrix pair \f$ A \f$ and \f$ B \f$ are scalars
+ * \f$ \lambda \f$ and vectors \f$ v \f$ such that \f$ Av = \lambda Bv \f$.  If
+ * \f$ D \f$ is a diagonal matrix with the eigenvalues on the diagonal, and
+ * \f$ V \f$ is a matrix with the eigenvectors as its columns, then \f$ A V =
+ * B V D \f$. The matrix \f$ V \f$ is almost always invertible, in which case we
+ * have \f$ A = B V D V^{-1} \f$. This is called the generalized eigen-decomposition.
+ *
+ * The generalized eigenvalues and eigenvectors of a matrix pair may be complex, even when the
+ * matrices are real. Moreover, the generalized eigenvalue might be infinite if the matrix B is
+ * singular. To workaround this difficulty, the eigenvalues are provided as a pair of complex \f$ \alpha \f$
+ * and real \f$ \beta \f$ such that: \f$ \lambda_i = \alpha_i / \beta_i \f$. If \f$ \beta_i \f$ is (nearly) zero,
+ * then one can consider the well defined left eigenvalue \f$ \mu = \beta_i / \alpha_i\f$ such that:
+ * \f$ \mu_i A v_i = B v_i \f$, or even \f$ \mu_i u_i^T A  = u_i^T B \f$ where \f$ u_i \f$ is
+ * called the left eigenvector.
+ *
+ * Call the function compute() to compute the generalized eigenvalues and eigenvectors of
+ * a given matrix pair. Alternatively, you can use the
+ * GeneralizedEigenSolver(const MatrixType&, const MatrixType&, bool) constructor which computes the
+ * eigenvalues and eigenvectors at construction time. Once the eigenvalue and
+ * eigenvectors are computed, they can be retrieved with the eigenvalues() and
+ * eigenvectors() functions.
+ *
+ * Here is an usage example of this class:
+ * Example: \include GeneralizedEigenSolver.cpp
+ * Output: \verbinclude GeneralizedEigenSolver.out
+ *
+ * \sa MatrixBase::eigenvalues(), class ComplexEigenSolver, class SelfAdjointEigenSolver
+ */
+template <typename MatrixType_>
+class GeneralizedEigenSolver {
+ public:
+  /** \brief Synonym for the template parameter \p MatrixType_. */
+  typedef MatrixType_ MatrixType;
 
-    /** \brief Synonym for the template parameter \p MatrixType_. */
-    typedef MatrixType_ MatrixType;
+  enum {
+    RowsAtCompileTime = MatrixType::RowsAtCompileTime,
+    ColsAtCompileTime = MatrixType::ColsAtCompileTime,
+    Options = MatrixType::Options,
+    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
+  };
 
-    enum {
-      RowsAtCompileTime = MatrixType::RowsAtCompileTime,
-      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
-      Options = MatrixType::Options,
-      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
-      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
-    };
+  /** \brief Scalar type for matrices of type #MatrixType. */
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef Eigen::Index Index;  ///< \deprecated since Eigen 3.3
 
-    /** \brief Scalar type for matrices of type #MatrixType. */
-    typedef typename MatrixType::Scalar Scalar;
-    typedef typename NumTraits<Scalar>::Real RealScalar;
-    typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3
+  /** \brief Complex scalar type for #MatrixType.
+   *
+   * This is \c std::complex<Scalar> if #Scalar is real (e.g.,
+   * \c float or \c double) and just \c Scalar if #Scalar is
+   * complex.
+   */
+  typedef std::complex<RealScalar> ComplexScalar;
 
-    /** \brief Complex scalar type for #MatrixType. 
-      *
-      * This is \c std::complex<Scalar> if #Scalar is real (e.g.,
-      * \c float or \c double) and just \c Scalar if #Scalar is
-      * complex.
-      */
-    typedef std::complex<RealScalar> ComplexScalar;
+  /** \brief Type for vector of real scalar values eigenvalues as returned by betas().
+   *
+   * This is a column vector with entries of type #Scalar.
+   * The length of the vector is the size of #MatrixType.
+   */
+  typedef Matrix<Scalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> VectorType;
 
-    /** \brief Type for vector of real scalar values eigenvalues as returned by betas().
-      *
-      * This is a column vector with entries of type #Scalar.
-      * The length of the vector is the size of #MatrixType.
-      */
-    typedef Matrix<Scalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> VectorType;
+  /** \brief Type for vector of complex scalar values eigenvalues as returned by alphas().
+   *
+   * This is a column vector with entries of type #ComplexScalar.
+   * The length of the vector is the size of #MatrixType.
+   */
+  typedef Matrix<ComplexScalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> ComplexVectorType;
 
-    /** \brief Type for vector of complex scalar values eigenvalues as returned by alphas().
-      *
-      * This is a column vector with entries of type #ComplexScalar.
-      * The length of the vector is the size of #MatrixType.
-      */
-    typedef Matrix<ComplexScalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> ComplexVectorType;
+  /** \brief Expression type for the eigenvalues as returned by eigenvalues().
+   */
+  typedef CwiseBinaryOp<internal::scalar_quotient_op<ComplexScalar, Scalar>, ComplexVectorType, VectorType>
+      EigenvalueType;
 
-    /** \brief Expression type for the eigenvalues as returned by eigenvalues().
-      */
-    typedef CwiseBinaryOp<internal::scalar_quotient_op<ComplexScalar,Scalar>,ComplexVectorType,VectorType> EigenvalueType;
+  /** \brief Type for matrix of eigenvectors as returned by eigenvectors().
+   *
+   * This is a square matrix with entries of type #ComplexScalar.
+   * The size is the same as the size of #MatrixType.
+   */
+  typedef Matrix<ComplexScalar, RowsAtCompileTime, ColsAtCompileTime, Options, MaxRowsAtCompileTime,
+                 MaxColsAtCompileTime>
+      EigenvectorsType;
 
-    /** \brief Type for matrix of eigenvectors as returned by eigenvectors(). 
-      *
-      * This is a square matrix with entries of type #ComplexScalar. 
-      * The size is the same as the size of #MatrixType.
-      */
-    typedef Matrix<ComplexScalar, RowsAtCompileTime, ColsAtCompileTime, Options, MaxRowsAtCompileTime, MaxColsAtCompileTime> EigenvectorsType;
+  /** \brief Default constructor.
+   *
+   * The default constructor is useful in cases in which the user intends to
+   * perform decompositions via EigenSolver::compute(const MatrixType&, bool).
+   *
+   * \sa compute() for an example.
+   */
+  GeneralizedEigenSolver()
+      : m_eivec(), m_alphas(), m_betas(), m_computeEigenvectors(false), m_isInitialized(false), m_realQZ() {}
 
-    /** \brief Default constructor.
-      *
-      * The default constructor is useful in cases in which the user intends to
-      * perform decompositions via EigenSolver::compute(const MatrixType&, bool).
-      *
-      * \sa compute() for an example.
-      */
-    GeneralizedEigenSolver()
-      : m_eivec(),
-        m_alphas(),
-        m_betas(),
-        m_computeEigenvectors(false),
-        m_isInitialized(false),
-        m_realQZ()
-    {}
-
-    /** \brief Default constructor with memory preallocation
-      *
-      * Like the default constructor but with preallocation of the internal data
-      * according to the specified problem \a size.
-      * \sa GeneralizedEigenSolver()
-      */
-    explicit GeneralizedEigenSolver(Index size)
+  /** \brief Default constructor with memory preallocation
+   *
+   * Like the default constructor but with preallocation of the internal data
+   * according to the specified problem \a size.
+   * \sa GeneralizedEigenSolver()
+   */
+  explicit GeneralizedEigenSolver(Index size)
       : m_eivec(size, size),
         m_alphas(size),
         m_betas(size),
         m_computeEigenvectors(false),
         m_isInitialized(false),
         m_realQZ(size),
-        m_tmp(size)
-    {}
+        m_tmp(size) {}
 
-    /** \brief Constructor; computes the generalized eigendecomposition of given matrix pair.
-      * 
-      * \param[in]  A  Square matrix whose eigendecomposition is to be computed.
-      * \param[in]  B  Square matrix whose eigendecomposition is to be computed.
-      * \param[in]  computeEigenvectors  If true, both the eigenvectors and the
-      *    eigenvalues are computed; if false, only the eigenvalues are computed.
-      *
-      * This constructor calls compute() to compute the generalized eigenvalues
-      * and eigenvectors.
-      *
-      * \sa compute()
-      */
-    GeneralizedEigenSolver(const MatrixType& A, const MatrixType& B, bool computeEigenvectors = true)
+  /** \brief Constructor; computes the generalized eigendecomposition of given matrix pair.
+   *
+   * \param[in]  A  Square matrix whose eigendecomposition is to be computed.
+   * \param[in]  B  Square matrix whose eigendecomposition is to be computed.
+   * \param[in]  computeEigenvectors  If true, both the eigenvectors and the
+   *    eigenvalues are computed; if false, only the eigenvalues are computed.
+   *
+   * This constructor calls compute() to compute the generalized eigenvalues
+   * and eigenvectors.
+   *
+   * \sa compute()
+   */
+  GeneralizedEigenSolver(const MatrixType& A, const MatrixType& B, bool computeEigenvectors = true)
       : m_eivec(A.rows(), A.cols()),
         m_alphas(A.cols()),
         m_betas(A.cols()),
         m_computeEigenvectors(false),
         m_isInitialized(false),
         m_realQZ(A.cols()),
-        m_tmp(A.cols())
-    {
-      compute(A, B, computeEigenvectors);
-    }
+        m_tmp(A.cols()) {
+    compute(A, B, computeEigenvectors);
+  }
 
-    /* \brief Returns the computed generalized eigenvectors.
-      *
-      * \returns  %Matrix whose columns are the (possibly complex) right eigenvectors.
-      * i.e. the eigenvectors that solve (A - l*B)x = 0. The ordering matches the eigenvalues.
-      *
-      * \pre Either the constructor 
-      * GeneralizedEigenSolver(const MatrixType&,const MatrixType&, bool) or the member function
-      * compute(const MatrixType&, const MatrixType& bool) has been called before, and
-      * \p computeEigenvectors was set to true (the default).
-      *
-      * \sa eigenvalues()
-      */
-    EigenvectorsType eigenvectors() const {
-      eigen_assert(info() == Success && "GeneralizedEigenSolver failed to compute eigenvectors");
-      eigen_assert(m_computeEigenvectors && "Eigenvectors for GeneralizedEigenSolver were not calculated");
-      return m_eivec;
-    }
+  /* \brief Returns the computed generalized eigenvectors.
+   *
+   * \returns  %Matrix whose columns are the (possibly complex) right eigenvectors.
+   * i.e. the eigenvectors that solve (A - l*B)x = 0. The ordering matches the eigenvalues.
+   *
+   * \pre Either the constructor
+   * GeneralizedEigenSolver(const MatrixType&,const MatrixType&, bool) or the member function
+   * compute(const MatrixType&, const MatrixType& bool) has been called before, and
+   * \p computeEigenvectors was set to true (the default).
+   *
+   * \sa eigenvalues()
+   */
+  EigenvectorsType eigenvectors() const {
+    eigen_assert(info() == Success && "GeneralizedEigenSolver failed to compute eigenvectors");
+    eigen_assert(m_computeEigenvectors && "Eigenvectors for GeneralizedEigenSolver were not calculated");
+    return m_eivec;
+  }
 
-    /** \brief Returns an expression of the computed generalized eigenvalues.
-      *
-      * \returns An expression of the column vector containing the eigenvalues.
-      *
-      * It is a shortcut for \code this->alphas().cwiseQuotient(this->betas()); \endcode
-      * Not that betas might contain zeros. It is therefore not recommended to use this function,
-      * but rather directly deal with the alphas and betas vectors.
-      *
-      * \pre Either the constructor 
-      * GeneralizedEigenSolver(const MatrixType&,const MatrixType&,bool) or the member function
-      * compute(const MatrixType&,const MatrixType&,bool) has been called before.
-      *
-      * The eigenvalues are repeated according to their algebraic multiplicity,
-      * so there are as many eigenvalues as rows in the matrix. The eigenvalues 
-      * are not sorted in any particular order.
-      *
-      * \sa alphas(), betas(), eigenvectors()
-      */
-    EigenvalueType eigenvalues() const
-    {
-      eigen_assert(info() == Success && "GeneralizedEigenSolver failed to compute eigenvalues.");
-      return EigenvalueType(m_alphas,m_betas);
-    }
+  /** \brief Returns an expression of the computed generalized eigenvalues.
+   *
+   * \returns An expression of the column vector containing the eigenvalues.
+   *
+   * It is a shortcut for \code this->alphas().cwiseQuotient(this->betas()); \endcode
+   * Not that betas might contain zeros. It is therefore not recommended to use this function,
+   * but rather directly deal with the alphas and betas vectors.
+   *
+   * \pre Either the constructor
+   * GeneralizedEigenSolver(const MatrixType&,const MatrixType&,bool) or the member function
+   * compute(const MatrixType&,const MatrixType&,bool) has been called before.
+   *
+   * The eigenvalues are repeated according to their algebraic multiplicity,
+   * so there are as many eigenvalues as rows in the matrix. The eigenvalues
+   * are not sorted in any particular order.
+   *
+   * \sa alphas(), betas(), eigenvectors()
+   */
+  EigenvalueType eigenvalues() const {
+    eigen_assert(info() == Success && "GeneralizedEigenSolver failed to compute eigenvalues.");
+    return EigenvalueType(m_alphas, m_betas);
+  }
 
-    /** \returns A const reference to the vectors containing the alpha values
-      *
-      * This vector permits to reconstruct the j-th eigenvalues as alphas(i)/betas(j).
-      *
-      * \sa betas(), eigenvalues() */
-    const ComplexVectorType& alphas() const
-    {
-      eigen_assert(info() == Success && "GeneralizedEigenSolver failed to compute alphas.");
-      return m_alphas;
-    }
+  /** \returns A const reference to the vectors containing the alpha values
+   *
+   * This vector permits to reconstruct the j-th eigenvalues as alphas(i)/betas(j).
+   *
+   * \sa betas(), eigenvalues() */
+  const ComplexVectorType& alphas() const {
+    eigen_assert(info() == Success && "GeneralizedEigenSolver failed to compute alphas.");
+    return m_alphas;
+  }
 
-    /** \returns A const reference to the vectors containing the beta values
-      *
-      * This vector permits to reconstruct the j-th eigenvalues as alphas(i)/betas(j).
-      *
-      * \sa alphas(), eigenvalues() */
-    const VectorType& betas() const
-    {
-      eigen_assert(info() == Success && "GeneralizedEigenSolver failed to compute betas.");
-      return m_betas;
-    }
+  /** \returns A const reference to the vectors containing the beta values
+   *
+   * This vector permits to reconstruct the j-th eigenvalues as alphas(i)/betas(j).
+   *
+   * \sa alphas(), eigenvalues() */
+  const VectorType& betas() const {
+    eigen_assert(info() == Success && "GeneralizedEigenSolver failed to compute betas.");
+    return m_betas;
+  }
 
-    /** \brief Computes generalized eigendecomposition of given matrix.
-      * 
-      * \param[in]  A  Square matrix whose eigendecomposition is to be computed.
-      * \param[in]  B  Square matrix whose eigendecomposition is to be computed.
-      * \param[in]  computeEigenvectors  If true, both the eigenvectors and the
-      *    eigenvalues are computed; if false, only the eigenvalues are
-      *    computed. 
-      * \returns    Reference to \c *this
-      *
-      * This function computes the eigenvalues of the real matrix \p matrix.
-      * The eigenvalues() function can be used to retrieve them.  If 
-      * \p computeEigenvectors is true, then the eigenvectors are also computed
-      * and can be retrieved by calling eigenvectors().
-      *
-      * The matrix is first reduced to real generalized Schur form using the RealQZ
-      * class. The generalized Schur decomposition is then used to compute the eigenvalues
-      * and eigenvectors.
-      *
-      * The cost of the computation is dominated by the cost of the
-      * generalized Schur decomposition.
-      *
-      * This method reuses of the allocated data in the GeneralizedEigenSolver object.
-      */
-    GeneralizedEigenSolver& compute(const MatrixType& A, const MatrixType& B, bool computeEigenvectors = true);
+  /** \brief Computes generalized eigendecomposition of given matrix.
+   *
+   * \param[in]  A  Square matrix whose eigendecomposition is to be computed.
+   * \param[in]  B  Square matrix whose eigendecomposition is to be computed.
+   * \param[in]  computeEigenvectors  If true, both the eigenvectors and the
+   *    eigenvalues are computed; if false, only the eigenvalues are
+   *    computed.
+   * \returns    Reference to \c *this
+   *
+   * This function computes the eigenvalues of the real matrix \p matrix.
+   * The eigenvalues() function can be used to retrieve them.  If
+   * \p computeEigenvectors is true, then the eigenvectors are also computed
+   * and can be retrieved by calling eigenvectors().
+   *
+   * The matrix is first reduced to real generalized Schur form using the RealQZ
+   * class. The generalized Schur decomposition is then used to compute the eigenvalues
+   * and eigenvectors.
+   *
+   * The cost of the computation is dominated by the cost of the
+   * generalized Schur decomposition.
+   *
+   * This method reuses of the allocated data in the GeneralizedEigenSolver object.
+   */
+  GeneralizedEigenSolver& compute(const MatrixType& A, const MatrixType& B, bool computeEigenvectors = true);
 
-    ComputationInfo info() const
-    {
-      eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
-      return m_realQZ.info();
-    }
+  ComputationInfo info() const {
+    eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
+    return m_realQZ.info();
+  }
 
-    /** Sets the maximal number of iterations allowed.
-    */
-    GeneralizedEigenSolver& setMaxIterations(Index maxIters)
-    {
-      m_realQZ.setMaxIterations(maxIters);
-      return *this;
-    }
+  /** Sets the maximal number of iterations allowed.
+   */
+  GeneralizedEigenSolver& setMaxIterations(Index maxIters) {
+    m_realQZ.setMaxIterations(maxIters);
+    return *this;
+  }
 
-  protected:
+ protected:
+  EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
+  EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::IsComplex, NUMERIC_TYPE_MUST_BE_REAL)
 
-    EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
-    EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::IsComplex, NUMERIC_TYPE_MUST_BE_REAL)
-
-    EigenvectorsType m_eivec;
-    ComplexVectorType m_alphas;
-    VectorType m_betas;
-    bool m_computeEigenvectors;
-    bool m_isInitialized;
-    RealQZ<MatrixType> m_realQZ;
-    ComplexVectorType m_tmp;
+  EigenvectorsType m_eivec;
+  ComplexVectorType m_alphas;
+  VectorType m_betas;
+  bool m_computeEigenvectors;
+  bool m_isInitialized;
+  RealQZ<MatrixType> m_realQZ;
+  ComplexVectorType m_tmp;
 };
 
-template<typename MatrixType>
-GeneralizedEigenSolver<MatrixType>&
-GeneralizedEigenSolver<MatrixType>::compute(const MatrixType& A, const MatrixType& B, bool computeEigenvectors)
-{
-  using std::sqrt;
+template <typename MatrixType>
+GeneralizedEigenSolver<MatrixType>& GeneralizedEigenSolver<MatrixType>::compute(const MatrixType& A,
+                                                                                const MatrixType& B,
+                                                                                bool computeEigenvectors) {
   using std::abs;
+  using std::sqrt;
   eigen_assert(A.cols() == A.rows() && B.cols() == A.rows() && B.cols() == B.rows());
   Index size = A.cols();
   // Reduce to generalized real Schur form:
   // A = Q S Z and B = Q T Z
   m_realQZ.compute(A, B, computeEigenvectors);
-  if (m_realQZ.info() == Success)
-  {
+  if (m_realQZ.info() == Success) {
     // Resize storage
     m_alphas.resize(size);
     m_betas.resize(size);
-    if (computeEigenvectors)
-    {
-      m_eivec.resize(size,size);
+    if (computeEigenvectors) {
+      m_eivec.resize(size, size);
       m_tmp.resize(size);
     }
 
     // Aliases:
     Map<VectorType> v(reinterpret_cast<Scalar*>(m_tmp.data()), size);
-    ComplexVectorType &cv = m_tmp;
-    const MatrixType &mS = m_realQZ.matrixS();
-    const MatrixType &mT = m_realQZ.matrixT();
+    ComplexVectorType& cv = m_tmp;
+    const MatrixType& mS = m_realQZ.matrixS();
+    const MatrixType& mT = m_realQZ.matrixT();
 
     Index i = 0;
-    while (i < size)
-    {
-      if (i == size - 1 || mS.coeff(i+1, i) == Scalar(0))
-      {
+    while (i < size) {
+      if (i == size - 1 || mS.coeff(i + 1, i) == Scalar(0)) {
         // Real eigenvalue
         m_alphas.coeffRef(i) = mS.diagonal().coeff(i);
-        m_betas.coeffRef(i)  = mT.diagonal().coeff(i);
-        if (computeEigenvectors)
-        {
+        m_betas.coeffRef(i) = mT.diagonal().coeff(i);
+        if (computeEigenvectors) {
           v.setConstant(Scalar(0.0));
           v.coeffRef(i) = Scalar(1.0);
           // For singular eigenvalues do nothing more
-          if(abs(m_betas.coeffRef(i)) >= (std::numeric_limits<RealScalar>::min)())
-          {
+          if (abs(m_betas.coeffRef(i)) >= (std::numeric_limits<RealScalar>::min)()) {
             // Non-singular eigenvalue
             const Scalar alpha = real(m_alphas.coeffRef(i));
             const Scalar beta = m_betas.coeffRef(i);
-            for (Index j = i-1; j >= 0; j--)
-            {
-              const Index st = j+1;
-              const Index sz = i-j;
-              if (j > 0 && mS.coeff(j, j-1) != Scalar(0))
-              {
+            for (Index j = i - 1; j >= 0; j--) {
+              const Index st = j + 1;
+              const Index sz = i - j;
+              if (j > 0 && mS.coeff(j, j - 1) != Scalar(0)) {
                 // 2x2 block
-                Matrix<Scalar, 2, 1> rhs = (alpha*mT.template block<2,Dynamic>(j-1,st,2,sz) - beta*mS.template block<2,Dynamic>(j-1,st,2,sz)) .lazyProduct( v.segment(st,sz) );
-                Matrix<Scalar, 2, 2> lhs = beta * mS.template block<2,2>(j-1,j-1) - alpha * mT.template block<2,2>(j-1,j-1);
-                v.template segment<2>(j-1) = lhs.partialPivLu().solve(rhs);
+                Matrix<Scalar, 2, 1> rhs = (alpha * mT.template block<2, Dynamic>(j - 1, st, 2, sz) -
+                                            beta * mS.template block<2, Dynamic>(j - 1, st, 2, sz))
+                                               .lazyProduct(v.segment(st, sz));
+                Matrix<Scalar, 2, 2> lhs =
+                    beta * mS.template block<2, 2>(j - 1, j - 1) - alpha * mT.template block<2, 2>(j - 1, j - 1);
+                v.template segment<2>(j - 1) = lhs.partialPivLu().solve(rhs);
                 j--;
-              }
-              else
-              {
-                v.coeffRef(j) = -v.segment(st,sz).transpose().cwiseProduct(beta*mS.block(j,st,1,sz) - alpha*mT.block(j,st,1,sz)).sum() / (beta*mS.coeffRef(j,j) - alpha*mT.coeffRef(j,j));
+              } else {
+                v.coeffRef(j) = -v.segment(st, sz)
+                                     .transpose()
+                                     .cwiseProduct(beta * mS.block(j, st, 1, sz) - alpha * mT.block(j, st, 1, sz))
+                                     .sum() /
+                                (beta * mS.coeffRef(j, j) - alpha * mT.coeffRef(j, j));
               }
             }
           }
@@ -353,53 +338,55 @@
           m_eivec.col(i).imag().setConstant(0);
         }
         ++i;
-      }
-      else
-      {
-        // We need to extract the generalized eigenvalues of the pair of a general 2x2 block S and a positive diagonal 2x2 block T
-        // Then taking beta=T_00*T_11, we can avoid any division, and alpha is the eigenvalues of A = (U^-1 * S * U) * diag(T_11,T_00):
+      } else {
+        // We need to extract the generalized eigenvalues of the pair of a general 2x2 block S and a positive diagonal
+        // 2x2 block T Then taking beta=T_00*T_11, we can avoid any division, and alpha is the eigenvalues of A = (U^-1
+        // * S * U) * diag(T_11,T_00):
 
         // T =  [a 0]
         //      [0 b]
-        RealScalar a = mT.diagonal().coeff(i),
-                   b = mT.diagonal().coeff(i+1);
-        const RealScalar beta = m_betas.coeffRef(i) = m_betas.coeffRef(i+1) = a*b;
+        RealScalar a = mT.diagonal().coeff(i), b = mT.diagonal().coeff(i + 1);
+        const RealScalar beta = m_betas.coeffRef(i) = m_betas.coeffRef(i + 1) = a * b;
 
         // ^^ NOTE: using diagonal()(i) instead of coeff(i,i) workarounds a MSVC bug.
-        Matrix<RealScalar,2,2> S2 = mS.template block<2,2>(i,i) * Matrix<Scalar,2,1>(b,a).asDiagonal();
+        Matrix<RealScalar, 2, 2> S2 = mS.template block<2, 2>(i, i) * Matrix<Scalar, 2, 1>(b, a).asDiagonal();
 
-        Scalar p = Scalar(0.5) * (S2.coeff(0,0) - S2.coeff(1,1));
-        Scalar z = sqrt(abs(p * p + S2.coeff(1,0) * S2.coeff(0,1)));
-        const ComplexScalar alpha = ComplexScalar(S2.coeff(1,1) + p, (beta > 0) ? z : -z);
-        m_alphas.coeffRef(i)   = conj(alpha);
-        m_alphas.coeffRef(i+1) = alpha;
+        Scalar p = Scalar(0.5) * (S2.coeff(0, 0) - S2.coeff(1, 1));
+        Scalar z = sqrt(abs(p * p + S2.coeff(1, 0) * S2.coeff(0, 1)));
+        const ComplexScalar alpha = ComplexScalar(S2.coeff(1, 1) + p, (beta > 0) ? z : -z);
+        m_alphas.coeffRef(i) = conj(alpha);
+        m_alphas.coeffRef(i + 1) = alpha;
 
         if (computeEigenvectors) {
           // Compute eigenvector in position (i+1) and then position (i) is just the conjugate
           cv.setZero();
-          cv.coeffRef(i+1) = Scalar(1.0);
+          cv.coeffRef(i + 1) = Scalar(1.0);
           // here, the "static_cast" workaound expression template issues.
-          cv.coeffRef(i) = -(static_cast<Scalar>(beta*mS.coeffRef(i,i+1)) - alpha*mT.coeffRef(i,i+1))
-                          / (static_cast<Scalar>(beta*mS.coeffRef(i,i))   - alpha*mT.coeffRef(i,i));
-          for (Index j = i-1; j >= 0; j--)
-          {
-            const Index st = j+1;
-            const Index sz = i+1-j;
-            if (j > 0 && mS.coeff(j, j-1) != Scalar(0))
-            {
+          cv.coeffRef(i) = -(static_cast<Scalar>(beta * mS.coeffRef(i, i + 1)) - alpha * mT.coeffRef(i, i + 1)) /
+                           (static_cast<Scalar>(beta * mS.coeffRef(i, i)) - alpha * mT.coeffRef(i, i));
+          for (Index j = i - 1; j >= 0; j--) {
+            const Index st = j + 1;
+            const Index sz = i + 1 - j;
+            if (j > 0 && mS.coeff(j, j - 1) != Scalar(0)) {
               // 2x2 block
-              Matrix<ComplexScalar, 2, 1> rhs = (alpha*mT.template block<2,Dynamic>(j-1,st,2,sz) - beta*mS.template block<2,Dynamic>(j-1,st,2,sz)) .lazyProduct( cv.segment(st,sz) );
-              Matrix<ComplexScalar, 2, 2> lhs = beta * mS.template block<2,2>(j-1,j-1) - alpha * mT.template block<2,2>(j-1,j-1);
-              cv.template segment<2>(j-1) = lhs.partialPivLu().solve(rhs);
+              Matrix<ComplexScalar, 2, 1> rhs = (alpha * mT.template block<2, Dynamic>(j - 1, st, 2, sz) -
+                                                 beta * mS.template block<2, Dynamic>(j - 1, st, 2, sz))
+                                                    .lazyProduct(cv.segment(st, sz));
+              Matrix<ComplexScalar, 2, 2> lhs =
+                  beta * mS.template block<2, 2>(j - 1, j - 1) - alpha * mT.template block<2, 2>(j - 1, j - 1);
+              cv.template segment<2>(j - 1) = lhs.partialPivLu().solve(rhs);
               j--;
             } else {
-              cv.coeffRef(j) =  cv.segment(st,sz).transpose().cwiseProduct(beta*mS.block(j,st,1,sz) - alpha*mT.block(j,st,1,sz)).sum()
-                              / (alpha*mT.coeffRef(j,j) - static_cast<Scalar>(beta*mS.coeffRef(j,j)));
+              cv.coeffRef(j) = cv.segment(st, sz)
+                                   .transpose()
+                                   .cwiseProduct(beta * mS.block(j, st, 1, sz) - alpha * mT.block(j, st, 1, sz))
+                                   .sum() /
+                               (alpha * mT.coeffRef(j, j) - static_cast<Scalar>(beta * mS.coeffRef(j, j)));
             }
           }
-          m_eivec.col(i+1).noalias() = (m_realQZ.matrixZ().transpose() * cv);
-          m_eivec.col(i+1).normalize();
-          m_eivec.col(i) = m_eivec.col(i+1).conjugate();
+          m_eivec.col(i + 1).noalias() = (m_realQZ.matrixZ().transpose() * cv);
+          m_eivec.col(i + 1).normalize();
+          m_eivec.col(i) = m_eivec.col(i + 1).conjugate();
         }
         i += 2;
       }
@@ -410,6 +397,6 @@
   return *this;
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_GENERALIZEDEIGENSOLVER_H
+#endif  // EIGEN_GENERALIZEDEIGENSOLVER_H
diff --git a/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h b/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h
index 941127b..adff3a3 100644
--- a/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h
+++ b/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h
@@ -16,186 +16,173 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 /** \eigenvalues_module \ingroup Eigenvalues_Module
-  *
-  *
-  * \class GeneralizedSelfAdjointEigenSolver
-  *
-  * \brief Computes eigenvalues and eigenvectors of the generalized selfadjoint eigen problem
-  *
-  * \tparam MatrixType_ the type of the matrix of which we are computing the
-  * eigendecomposition; this is expected to be an instantiation of the Matrix
-  * class template.
-  *
-  * This class solves the generalized eigenvalue problem
-  * \f$ Av = \lambda Bv \f$. In this case, the matrix \f$ A \f$ should be
-  * selfadjoint and the matrix \f$ B \f$ should be positive definite.
-  *
-  * Only the \b lower \b triangular \b part of the input matrix is referenced.
-  *
-  * Call the function compute() to compute the eigenvalues and eigenvectors of
-  * a given matrix. Alternatively, you can use the
-  * GeneralizedSelfAdjointEigenSolver(const MatrixType&, const MatrixType&, int)
-  * constructor which computes the eigenvalues and eigenvectors at construction time.
-  * Once the eigenvalue and eigenvectors are computed, they can be retrieved with the eigenvalues()
-  * and eigenvectors() functions.
-  *
-  * The documentation for GeneralizedSelfAdjointEigenSolver(const MatrixType&, const MatrixType&, int)
-  * contains an example of the typical use of this class.
-  *
-  * \sa class SelfAdjointEigenSolver, class EigenSolver, class ComplexEigenSolver
-  */
-template<typename MatrixType_>
-class GeneralizedSelfAdjointEigenSolver : public SelfAdjointEigenSolver<MatrixType_>
-{
-    typedef SelfAdjointEigenSolver<MatrixType_> Base;
-  public:
+ *
+ *
+ * \class GeneralizedSelfAdjointEigenSolver
+ *
+ * \brief Computes eigenvalues and eigenvectors of the generalized selfadjoint eigen problem
+ *
+ * \tparam MatrixType_ the type of the matrix of which we are computing the
+ * eigendecomposition; this is expected to be an instantiation of the Matrix
+ * class template.
+ *
+ * This class solves the generalized eigenvalue problem
+ * \f$ Av = \lambda Bv \f$. In this case, the matrix \f$ A \f$ should be
+ * selfadjoint and the matrix \f$ B \f$ should be positive definite.
+ *
+ * Only the \b lower \b triangular \b part of the input matrix is referenced.
+ *
+ * Call the function compute() to compute the eigenvalues and eigenvectors of
+ * a given matrix. Alternatively, you can use the
+ * GeneralizedSelfAdjointEigenSolver(const MatrixType&, const MatrixType&, int)
+ * constructor which computes the eigenvalues and eigenvectors at construction time.
+ * Once the eigenvalue and eigenvectors are computed, they can be retrieved with the eigenvalues()
+ * and eigenvectors() functions.
+ *
+ * The documentation for GeneralizedSelfAdjointEigenSolver(const MatrixType&, const MatrixType&, int)
+ * contains an example of the typical use of this class.
+ *
+ * \sa class SelfAdjointEigenSolver, class EigenSolver, class ComplexEigenSolver
+ */
+template <typename MatrixType_>
+class GeneralizedSelfAdjointEigenSolver : public SelfAdjointEigenSolver<MatrixType_> {
+  typedef SelfAdjointEigenSolver<MatrixType_> Base;
 
-    typedef MatrixType_ MatrixType;
+ public:
+  typedef MatrixType_ MatrixType;
 
-    /** \brief Default constructor for fixed-size matrices.
-      *
-      * The default constructor is useful in cases in which the user intends to
-      * perform decompositions via compute(). This constructor
-      * can only be used if \p MatrixType_ is a fixed-size matrix; use
-      * GeneralizedSelfAdjointEigenSolver(Index) for dynamic-size matrices.
-      */
-    GeneralizedSelfAdjointEigenSolver() : Base() {}
+  /** \brief Default constructor for fixed-size matrices.
+   *
+   * The default constructor is useful in cases in which the user intends to
+   * perform decompositions via compute(). This constructor
+   * can only be used if \p MatrixType_ is a fixed-size matrix; use
+   * GeneralizedSelfAdjointEigenSolver(Index) for dynamic-size matrices.
+   */
+  GeneralizedSelfAdjointEigenSolver() : Base() {}
 
-    /** \brief Constructor, pre-allocates memory for dynamic-size matrices.
-      *
-      * \param [in]  size  Positive integer, size of the matrix whose
-      * eigenvalues and eigenvectors will be computed.
-      *
-      * This constructor is useful for dynamic-size matrices, when the user
-      * intends to perform decompositions via compute(). The \p size
-      * parameter is only used as a hint. It is not an error to give a wrong
-      * \p size, but it may impair performance.
-      *
-      * \sa compute() for an example
-      */
-    explicit GeneralizedSelfAdjointEigenSolver(Index size)
-        : Base(size)
-    {}
+  /** \brief Constructor, pre-allocates memory for dynamic-size matrices.
+   *
+   * \param [in]  size  Positive integer, size of the matrix whose
+   * eigenvalues and eigenvectors will be computed.
+   *
+   * This constructor is useful for dynamic-size matrices, when the user
+   * intends to perform decompositions via compute(). The \p size
+   * parameter is only used as a hint. It is not an error to give a wrong
+   * \p size, but it may impair performance.
+   *
+   * \sa compute() for an example
+   */
+  explicit GeneralizedSelfAdjointEigenSolver(Index size) : Base(size) {}
 
-    /** \brief Constructor; computes generalized eigendecomposition of given matrix pencil.
-      *
-      * \param[in]  matA  Selfadjoint matrix in matrix pencil.
-      *                   Only the lower triangular part of the matrix is referenced.
-      * \param[in]  matB  Positive-definite matrix in matrix pencil.
-      *                   Only the lower triangular part of the matrix is referenced.
-      * \param[in]  options A or-ed set of flags {#ComputeEigenvectors,#EigenvaluesOnly} | {#Ax_lBx,#ABx_lx,#BAx_lx}.
-      *                     Default is #ComputeEigenvectors|#Ax_lBx.
-      *
-      * This constructor calls compute(const MatrixType&, const MatrixType&, int)
-      * to compute the eigenvalues and (if requested) the eigenvectors of the
-      * generalized eigenproblem \f$ Ax = \lambda B x \f$ with \a matA the
-      * selfadjoint matrix \f$ A \f$ and \a matB the positive definite matrix
-      * \f$ B \f$. Each eigenvector \f$ x \f$ satisfies the property
-      * \f$ x^* B x = 1 \f$. The eigenvectors are computed if
-      * \a options contains ComputeEigenvectors.
-      *
-      * In addition, the two following variants can be solved via \p options:
-      * - \c ABx_lx: \f$ ABx = \lambda x \f$
-      * - \c BAx_lx: \f$ BAx = \lambda x \f$
-      *
-      * Example: \include SelfAdjointEigenSolver_SelfAdjointEigenSolver_MatrixType2.cpp
-      * Output: \verbinclude SelfAdjointEigenSolver_SelfAdjointEigenSolver_MatrixType2.out
-      *
-      * \sa compute(const MatrixType&, const MatrixType&, int)
-      */
-    GeneralizedSelfAdjointEigenSolver(const MatrixType& matA, const MatrixType& matB,
-                                      int options = ComputeEigenvectors|Ax_lBx)
-      : Base(matA.cols())
-    {
-      compute(matA, matB, options);
-    }
+  /** \brief Constructor; computes generalized eigendecomposition of given matrix pencil.
+   *
+   * \param[in]  matA  Selfadjoint matrix in matrix pencil.
+   *                   Only the lower triangular part of the matrix is referenced.
+   * \param[in]  matB  Positive-definite matrix in matrix pencil.
+   *                   Only the lower triangular part of the matrix is referenced.
+   * \param[in]  options A or-ed set of flags {#ComputeEigenvectors,#EigenvaluesOnly} | {#Ax_lBx,#ABx_lx,#BAx_lx}.
+   *                     Default is #ComputeEigenvectors|#Ax_lBx.
+   *
+   * This constructor calls compute(const MatrixType&, const MatrixType&, int)
+   * to compute the eigenvalues and (if requested) the eigenvectors of the
+   * generalized eigenproblem \f$ Ax = \lambda B x \f$ with \a matA the
+   * selfadjoint matrix \f$ A \f$ and \a matB the positive definite matrix
+   * \f$ B \f$. Each eigenvector \f$ x \f$ satisfies the property
+   * \f$ x^* B x = 1 \f$. The eigenvectors are computed if
+   * \a options contains ComputeEigenvectors.
+   *
+   * In addition, the two following variants can be solved via \p options:
+   * - \c ABx_lx: \f$ ABx = \lambda x \f$
+   * - \c BAx_lx: \f$ BAx = \lambda x \f$
+   *
+   * Example: \include SelfAdjointEigenSolver_SelfAdjointEigenSolver_MatrixType2.cpp
+   * Output: \verbinclude SelfAdjointEigenSolver_SelfAdjointEigenSolver_MatrixType2.out
+   *
+   * \sa compute(const MatrixType&, const MatrixType&, int)
+   */
+  GeneralizedSelfAdjointEigenSolver(const MatrixType& matA, const MatrixType& matB,
+                                    int options = ComputeEigenvectors | Ax_lBx)
+      : Base(matA.cols()) {
+    compute(matA, matB, options);
+  }
 
-    /** \brief Computes generalized eigendecomposition of given matrix pencil.
-      *
-      * \param[in]  matA  Selfadjoint matrix in matrix pencil.
-      *                   Only the lower triangular part of the matrix is referenced.
-      * \param[in]  matB  Positive-definite matrix in matrix pencil.
-      *                   Only the lower triangular part of the matrix is referenced.
-      * \param[in]  options A or-ed set of flags {#ComputeEigenvectors,#EigenvaluesOnly} | {#Ax_lBx,#ABx_lx,#BAx_lx}.
-      *                     Default is #ComputeEigenvectors|#Ax_lBx.
-      *
-      * \returns    Reference to \c *this
-      *
-      * According to \p options, this function computes eigenvalues and (if requested)
-      * the eigenvectors of one of the following three generalized eigenproblems:
-      * - \c Ax_lBx: \f$ Ax = \lambda B x \f$
-      * - \c ABx_lx: \f$ ABx = \lambda x \f$
-      * - \c BAx_lx: \f$ BAx = \lambda x \f$
-      * with \a matA the selfadjoint matrix \f$ A \f$ and \a matB the positive definite
-      * matrix \f$ B \f$.
-      * In addition, each eigenvector \f$ x \f$ satisfies the property \f$ x^* B x = 1 \f$.
-      *
-      * The eigenvalues() function can be used to retrieve
-      * the eigenvalues. If \p options contains ComputeEigenvectors, then the
-      * eigenvectors are also computed and can be retrieved by calling
-      * eigenvectors().
-      *
-      * The implementation uses LLT to compute the Cholesky decomposition
-      * \f$ B = LL^* \f$ and computes the classical eigendecomposition
-      * of the selfadjoint matrix \f$ L^{-1} A (L^*)^{-1} \f$ if \p options contains Ax_lBx
-      * and of \f$ L^{*} A L \f$ otherwise. This solves the
-      * generalized eigenproblem, because any solution of the generalized
-      * eigenproblem \f$ Ax = \lambda B x \f$ corresponds to a solution
-      * \f$ L^{-1} A (L^*)^{-1} (L^* x) = \lambda (L^* x) \f$ of the
-      * eigenproblem for \f$ L^{-1} A (L^*)^{-1} \f$. Similar statements
-      * can be made for the two other variants.
-      *
-      * Example: \include SelfAdjointEigenSolver_compute_MatrixType2.cpp
-      * Output: \verbinclude SelfAdjointEigenSolver_compute_MatrixType2.out
-      *
-      * \sa GeneralizedSelfAdjointEigenSolver(const MatrixType&, const MatrixType&, int)
-      */
-    GeneralizedSelfAdjointEigenSolver& compute(const MatrixType& matA, const MatrixType& matB,
-                                               int options = ComputeEigenvectors|Ax_lBx);
+  /** \brief Computes generalized eigendecomposition of given matrix pencil.
+   *
+   * \param[in]  matA  Selfadjoint matrix in matrix pencil.
+   *                   Only the lower triangular part of the matrix is referenced.
+   * \param[in]  matB  Positive-definite matrix in matrix pencil.
+   *                   Only the lower triangular part of the matrix is referenced.
+   * \param[in]  options A or-ed set of flags {#ComputeEigenvectors,#EigenvaluesOnly} | {#Ax_lBx,#ABx_lx,#BAx_lx}.
+   *                     Default is #ComputeEigenvectors|#Ax_lBx.
+   *
+   * \returns    Reference to \c *this
+   *
+   * According to \p options, this function computes eigenvalues and (if requested)
+   * the eigenvectors of one of the following three generalized eigenproblems:
+   * - \c Ax_lBx: \f$ Ax = \lambda B x \f$
+   * - \c ABx_lx: \f$ ABx = \lambda x \f$
+   * - \c BAx_lx: \f$ BAx = \lambda x \f$
+   * with \a matA the selfadjoint matrix \f$ A \f$ and \a matB the positive definite
+   * matrix \f$ B \f$.
+   * In addition, each eigenvector \f$ x \f$ satisfies the property \f$ x^* B x = 1 \f$.
+   *
+   * The eigenvalues() function can be used to retrieve
+   * the eigenvalues. If \p options contains ComputeEigenvectors, then the
+   * eigenvectors are also computed and can be retrieved by calling
+   * eigenvectors().
+   *
+   * The implementation uses LLT to compute the Cholesky decomposition
+   * \f$ B = LL^* \f$ and computes the classical eigendecomposition
+   * of the selfadjoint matrix \f$ L^{-1} A (L^*)^{-1} \f$ if \p options contains Ax_lBx
+   * and of \f$ L^{*} A L \f$ otherwise. This solves the
+   * generalized eigenproblem, because any solution of the generalized
+   * eigenproblem \f$ Ax = \lambda B x \f$ corresponds to a solution
+   * \f$ L^{-1} A (L^*)^{-1} (L^* x) = \lambda (L^* x) \f$ of the
+   * eigenproblem for \f$ L^{-1} A (L^*)^{-1} \f$. Similar statements
+   * can be made for the two other variants.
+   *
+   * Example: \include SelfAdjointEigenSolver_compute_MatrixType2.cpp
+   * Output: \verbinclude SelfAdjointEigenSolver_compute_MatrixType2.out
+   *
+   * \sa GeneralizedSelfAdjointEigenSolver(const MatrixType&, const MatrixType&, int)
+   */
+  GeneralizedSelfAdjointEigenSolver& compute(const MatrixType& matA, const MatrixType& matB,
+                                             int options = ComputeEigenvectors | Ax_lBx);
 
-  protected:
-
+ protected:
 };
 
+template <typename MatrixType>
+GeneralizedSelfAdjointEigenSolver<MatrixType>& GeneralizedSelfAdjointEigenSolver<MatrixType>::compute(
+    const MatrixType& matA, const MatrixType& matB, int options) {
+  eigen_assert(matA.cols() == matA.rows() && matB.rows() == matA.rows() && matB.cols() == matB.rows());
+  eigen_assert((options & ~(EigVecMask | GenEigMask)) == 0 && (options & EigVecMask) != EigVecMask &&
+               ((options & GenEigMask) == 0 || (options & GenEigMask) == Ax_lBx || (options & GenEigMask) == ABx_lx ||
+                (options & GenEigMask) == BAx_lx) &&
+               "invalid option parameter");
 
-template<typename MatrixType>
-GeneralizedSelfAdjointEigenSolver<MatrixType>& GeneralizedSelfAdjointEigenSolver<MatrixType>::
-compute(const MatrixType& matA, const MatrixType& matB, int options)
-{
-  eigen_assert(matA.cols()==matA.rows() && matB.rows()==matA.rows() && matB.cols()==matB.rows());
-  eigen_assert((options&~(EigVecMask|GenEigMask))==0
-          && (options&EigVecMask)!=EigVecMask
-          && ((options&GenEigMask)==0 || (options&GenEigMask)==Ax_lBx
-           || (options&GenEigMask)==ABx_lx || (options&GenEigMask)==BAx_lx)
-          && "invalid option parameter");
-
-  bool computeEigVecs = ((options&EigVecMask)==0) || ((options&EigVecMask)==ComputeEigenvectors);
+  bool computeEigVecs = ((options & EigVecMask) == 0) || ((options & EigVecMask) == ComputeEigenvectors);
 
   // Compute the cholesky decomposition of matB = L L' = U'U
   LLT<MatrixType> cholB(matB);
 
-  int type = (options&GenEigMask);
-  if(type==0)
-    type = Ax_lBx;
+  int type = (options & GenEigMask);
+  if (type == 0) type = Ax_lBx;
 
-  if(type==Ax_lBx)
-  {
+  if (type == Ax_lBx) {
     // compute C = inv(L) A inv(L')
     MatrixType matC = matA.template selfadjointView<Lower>();
     cholB.matrixL().template solveInPlace<OnTheLeft>(matC);
     cholB.matrixU().template solveInPlace<OnTheRight>(matC);
 
-    Base::compute(matC, computeEigVecs ? ComputeEigenvectors : EigenvaluesOnly );
+    Base::compute(matC, computeEigVecs ? ComputeEigenvectors : EigenvaluesOnly);
 
     // transform back the eigen vectors: evecs = inv(U) * evecs
-    if(computeEigVecs)
-      cholB.matrixU().solveInPlace(Base::m_eivec);
-  }
-  else if(type==ABx_lx)
-  {
+    if (computeEigVecs) cholB.matrixU().solveInPlace(Base::m_eivec);
+  } else if (type == ABx_lx) {
     // compute C = L' A L
     MatrixType matC = matA.template selfadjointView<Lower>();
     matC = matC * cholB.matrixL();
@@ -204,11 +191,8 @@
     Base::compute(matC, computeEigVecs ? ComputeEigenvectors : EigenvaluesOnly);
 
     // transform back the eigen vectors: evecs = inv(U) * evecs
-    if(computeEigVecs)
-      cholB.matrixU().solveInPlace(Base::m_eivec);
-  }
-  else if(type==BAx_lx)
-  {
+    if (computeEigVecs) cholB.matrixU().solveInPlace(Base::m_eivec);
+  } else if (type == BAx_lx) {
     // compute C = L' A L
     MatrixType matC = matA.template selfadjointView<Lower>();
     matC = matC * cholB.matrixL();
@@ -217,13 +201,12 @@
     Base::compute(matC, computeEigVecs ? ComputeEigenvectors : EigenvaluesOnly);
 
     // transform back the eigen vectors: evecs = L * evecs
-    if(computeEigVecs)
-      Base::m_eivec = cholB.matrixL() * Base::m_eivec;
+    if (computeEigVecs) Base::m_eivec = cholB.matrixL() * Base::m_eivec;
   }
 
   return *this;
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_GENERALIZEDSELFADJOINTEIGENSOLVER_H
+#endif  // EIGEN_GENERALIZEDSELFADJOINTEIGENSOLVER_H
diff --git a/Eigen/src/Eigenvalues/HessenbergDecomposition.h b/Eigen/src/Eigenvalues/HessenbergDecomposition.h
index 2f2804d..8f3c1b3 100644
--- a/Eigen/src/Eigenvalues/HessenbergDecomposition.h
+++ b/Eigen/src/Eigenvalues/HessenbergDecomposition.h
@@ -14,299 +14,280 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
-  
-template<typename MatrixType> struct HessenbergDecompositionMatrixHReturnType;
-template<typename MatrixType>
-struct traits<HessenbergDecompositionMatrixHReturnType<MatrixType> >
-{
+
+template <typename MatrixType>
+struct HessenbergDecompositionMatrixHReturnType;
+template <typename MatrixType>
+struct traits<HessenbergDecompositionMatrixHReturnType<MatrixType>> {
   typedef MatrixType ReturnType;
 };
 
-}
+}  // namespace internal
 
 /** \eigenvalues_module \ingroup Eigenvalues_Module
-  *
-  *
-  * \class HessenbergDecomposition
-  *
-  * \brief Reduces a square matrix to Hessenberg form by an orthogonal similarity transformation
-  *
-  * \tparam MatrixType_ the type of the matrix of which we are computing the Hessenberg decomposition
-  *
-  * This class performs an Hessenberg decomposition of a matrix \f$ A \f$. In
-  * the real case, the Hessenberg decomposition consists of an orthogonal
-  * matrix \f$ Q \f$ and a Hessenberg matrix \f$ H \f$ such that \f$ A = Q H
-  * Q^T \f$. An orthogonal matrix is a matrix whose inverse equals its
-  * transpose (\f$ Q^{-1} = Q^T \f$). A Hessenberg matrix has zeros below the
-  * subdiagonal, so it is almost upper triangular. The Hessenberg decomposition
-  * of a complex matrix is \f$ A = Q H Q^* \f$ with \f$ Q \f$ unitary (that is,
-  * \f$ Q^{-1} = Q^* \f$).
-  *
-  * Call the function compute() to compute the Hessenberg decomposition of a
-  * given matrix. Alternatively, you can use the
-  * HessenbergDecomposition(const MatrixType&) constructor which computes the
-  * Hessenberg decomposition at construction time. Once the decomposition is
-  * computed, you can use the matrixH() and matrixQ() functions to construct
-  * the matrices H and Q in the decomposition.
-  *
-  * The documentation for matrixH() contains an example of the typical use of
-  * this class.
-  *
-  * \sa class ComplexSchur, class Tridiagonalization, \ref QR_Module "QR Module"
-  */
-template<typename MatrixType_> class HessenbergDecomposition
-{
-  public:
+ *
+ *
+ * \class HessenbergDecomposition
+ *
+ * \brief Reduces a square matrix to Hessenberg form by an orthogonal similarity transformation
+ *
+ * \tparam MatrixType_ the type of the matrix of which we are computing the Hessenberg decomposition
+ *
+ * This class performs an Hessenberg decomposition of a matrix \f$ A \f$. In
+ * the real case, the Hessenberg decomposition consists of an orthogonal
+ * matrix \f$ Q \f$ and a Hessenberg matrix \f$ H \f$ such that \f$ A = Q H
+ * Q^T \f$. An orthogonal matrix is a matrix whose inverse equals its
+ * transpose (\f$ Q^{-1} = Q^T \f$). A Hessenberg matrix has zeros below the
+ * subdiagonal, so it is almost upper triangular. The Hessenberg decomposition
+ * of a complex matrix is \f$ A = Q H Q^* \f$ with \f$ Q \f$ unitary (that is,
+ * \f$ Q^{-1} = Q^* \f$).
+ *
+ * Call the function compute() to compute the Hessenberg decomposition of a
+ * given matrix. Alternatively, you can use the
+ * HessenbergDecomposition(const MatrixType&) constructor which computes the
+ * Hessenberg decomposition at construction time. Once the decomposition is
+ * computed, you can use the matrixH() and matrixQ() functions to construct
+ * the matrices H and Q in the decomposition.
+ *
+ * The documentation for matrixH() contains an example of the typical use of
+ * this class.
+ *
+ * \sa class ComplexSchur, class Tridiagonalization, \ref QR_Module "QR Module"
+ */
+template <typename MatrixType_>
+class HessenbergDecomposition {
+ public:
+  /** \brief Synonym for the template parameter \p MatrixType_. */
+  typedef MatrixType_ MatrixType;
 
-    /** \brief Synonym for the template parameter \p MatrixType_. */
-    typedef MatrixType_ MatrixType;
+  enum {
+    Size = MatrixType::RowsAtCompileTime,
+    SizeMinusOne = Size == Dynamic ? Dynamic : Size - 1,
+    Options = MatrixType::Options,
+    MaxSize = MatrixType::MaxRowsAtCompileTime,
+    MaxSizeMinusOne = MaxSize == Dynamic ? Dynamic : MaxSize - 1
+  };
 
-    enum {
-      Size = MatrixType::RowsAtCompileTime,
-      SizeMinusOne = Size == Dynamic ? Dynamic : Size - 1,
-      Options = MatrixType::Options,
-      MaxSize = MatrixType::MaxRowsAtCompileTime,
-      MaxSizeMinusOne = MaxSize == Dynamic ? Dynamic : MaxSize - 1
-    };
+  /** \brief Scalar type for matrices of type #MatrixType. */
+  typedef typename MatrixType::Scalar Scalar;
+  typedef Eigen::Index Index;  ///< \deprecated since Eigen 3.3
 
-    /** \brief Scalar type for matrices of type #MatrixType. */
-    typedef typename MatrixType::Scalar Scalar;
-    typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3
+  /** \brief Type for vector of Householder coefficients.
+   *
+   * This is column vector with entries of type #Scalar. The length of the
+   * vector is one less than the size of #MatrixType, if it is a fixed-side
+   * type.
+   */
+  typedef Matrix<Scalar, SizeMinusOne, 1, Options & ~RowMajor, MaxSizeMinusOne, 1> CoeffVectorType;
 
-    /** \brief Type for vector of Householder coefficients.
-      *
-      * This is column vector with entries of type #Scalar. The length of the
-      * vector is one less than the size of #MatrixType, if it is a fixed-side
-      * type.
-      */
-    typedef Matrix<Scalar, SizeMinusOne, 1, Options & ~RowMajor, MaxSizeMinusOne, 1> CoeffVectorType;
+  /** \brief Return type of matrixQ() */
+  typedef HouseholderSequence<MatrixType, internal::remove_all_t<typename CoeffVectorType::ConjugateReturnType>>
+      HouseholderSequenceType;
 
-    /** \brief Return type of matrixQ() */
-    typedef HouseholderSequence<MatrixType,internal::remove_all_t<typename CoeffVectorType::ConjugateReturnType>> HouseholderSequenceType;
-    
-    typedef internal::HessenbergDecompositionMatrixHReturnType<MatrixType> MatrixHReturnType;
+  typedef internal::HessenbergDecompositionMatrixHReturnType<MatrixType> MatrixHReturnType;
 
-    /** \brief Default constructor; the decomposition will be computed later.
-      *
-      * \param [in] size  The size of the matrix whose Hessenberg decomposition will be computed.
-      *
-      * The default constructor is useful in cases in which the user intends to
-      * perform decompositions via compute().  The \p size parameter is only
-      * used as a hint. It is not an error to give a wrong \p size, but it may
-      * impair performance.
-      *
-      * \sa compute() for an example.
-      */
-    explicit HessenbergDecomposition(Index size = Size==Dynamic ? 2 : Size)
-      : m_matrix(size,size),
-        m_temp(size),
-        m_isInitialized(false)
-    {
-      if(size>1)
-        m_hCoeffs.resize(size-1);
-    }
+  /** \brief Default constructor; the decomposition will be computed later.
+   *
+   * \param [in] size  The size of the matrix whose Hessenberg decomposition will be computed.
+   *
+   * The default constructor is useful in cases in which the user intends to
+   * perform decompositions via compute().  The \p size parameter is only
+   * used as a hint. It is not an error to give a wrong \p size, but it may
+   * impair performance.
+   *
+   * \sa compute() for an example.
+   */
+  explicit HessenbergDecomposition(Index size = Size == Dynamic ? 2 : Size)
+      : m_matrix(size, size), m_temp(size), m_isInitialized(false) {
+    if (size > 1) m_hCoeffs.resize(size - 1);
+  }
 
-    /** \brief Constructor; computes Hessenberg decomposition of given matrix.
-      *
-      * \param[in]  matrix  Square matrix whose Hessenberg decomposition is to be computed.
-      *
-      * This constructor calls compute() to compute the Hessenberg
-      * decomposition.
-      *
-      * \sa matrixH() for an example.
-      */
-    template<typename InputType>
-    explicit HessenbergDecomposition(const EigenBase<InputType>& matrix)
-      : m_matrix(matrix.derived()),
-        m_temp(matrix.rows()),
-        m_isInitialized(false)
-    {
-      if(matrix.rows()<2)
-      {
-        m_isInitialized = true;
-        return;
-      }
-      m_hCoeffs.resize(matrix.rows()-1,1);
-      _compute(m_matrix, m_hCoeffs, m_temp);
+  /** \brief Constructor; computes Hessenberg decomposition of given matrix.
+   *
+   * \param[in]  matrix  Square matrix whose Hessenberg decomposition is to be computed.
+   *
+   * This constructor calls compute() to compute the Hessenberg
+   * decomposition.
+   *
+   * \sa matrixH() for an example.
+   */
+  template <typename InputType>
+  explicit HessenbergDecomposition(const EigenBase<InputType>& matrix)
+      : m_matrix(matrix.derived()), m_temp(matrix.rows()), m_isInitialized(false) {
+    if (matrix.rows() < 2) {
       m_isInitialized = true;
+      return;
     }
+    m_hCoeffs.resize(matrix.rows() - 1, 1);
+    _compute(m_matrix, m_hCoeffs, m_temp);
+    m_isInitialized = true;
+  }
 
-    /** \brief Computes Hessenberg decomposition of given matrix.
-      *
-      * \param[in]  matrix  Square matrix whose Hessenberg decomposition is to be computed.
-      * \returns    Reference to \c *this
-      *
-      * The Hessenberg decomposition is computed by bringing the columns of the
-      * matrix successively in the required form using Householder reflections
-      * (see, e.g., Algorithm 7.4.2 in Golub \& Van Loan, <i>%Matrix
-      * Computations</i>). The cost is \f$ 10n^3/3 \f$ flops, where \f$ n \f$
-      * denotes the size of the given matrix.
-      *
-      * This method reuses of the allocated data in the HessenbergDecomposition
-      * object.
-      *
-      * Example: \include HessenbergDecomposition_compute.cpp
-      * Output: \verbinclude HessenbergDecomposition_compute.out
-      */
-    template<typename InputType>
-    HessenbergDecomposition& compute(const EigenBase<InputType>& matrix)
-    {
-      m_matrix = matrix.derived();
-      if(matrix.rows()<2)
-      {
-        m_isInitialized = true;
-        return *this;
-      }
-      m_hCoeffs.resize(matrix.rows()-1,1);
-      _compute(m_matrix, m_hCoeffs, m_temp);
+  /** \brief Computes Hessenberg decomposition of given matrix.
+   *
+   * \param[in]  matrix  Square matrix whose Hessenberg decomposition is to be computed.
+   * \returns    Reference to \c *this
+   *
+   * The Hessenberg decomposition is computed by bringing the columns of the
+   * matrix successively in the required form using Householder reflections
+   * (see, e.g., Algorithm 7.4.2 in Golub \& Van Loan, <i>%Matrix
+   * Computations</i>). The cost is \f$ 10n^3/3 \f$ flops, where \f$ n \f$
+   * denotes the size of the given matrix.
+   *
+   * This method reuses of the allocated data in the HessenbergDecomposition
+   * object.
+   *
+   * Example: \include HessenbergDecomposition_compute.cpp
+   * Output: \verbinclude HessenbergDecomposition_compute.out
+   */
+  template <typename InputType>
+  HessenbergDecomposition& compute(const EigenBase<InputType>& matrix) {
+    m_matrix = matrix.derived();
+    if (matrix.rows() < 2) {
       m_isInitialized = true;
       return *this;
     }
+    m_hCoeffs.resize(matrix.rows() - 1, 1);
+    _compute(m_matrix, m_hCoeffs, m_temp);
+    m_isInitialized = true;
+    return *this;
+  }
 
-    /** \brief Returns the Householder coefficients.
-      *
-      * \returns a const reference to the vector of Householder coefficients
-      *
-      * \pre Either the constructor HessenbergDecomposition(const MatrixType&)
-      * or the member function compute(const MatrixType&) has been called
-      * before to compute the Hessenberg decomposition of a matrix.
-      *
-      * The Householder coefficients allow the reconstruction of the matrix
-      * \f$ Q \f$ in the Hessenberg decomposition from the packed data.
-      *
-      * \sa packedMatrix(), \ref Householder_Module "Householder module"
-      */
-    const CoeffVectorType& householderCoefficients() const
-    {
-      eigen_assert(m_isInitialized && "HessenbergDecomposition is not initialized.");
-      return m_hCoeffs;
-    }
+  /** \brief Returns the Householder coefficients.
+   *
+   * \returns a const reference to the vector of Householder coefficients
+   *
+   * \pre Either the constructor HessenbergDecomposition(const MatrixType&)
+   * or the member function compute(const MatrixType&) has been called
+   * before to compute the Hessenberg decomposition of a matrix.
+   *
+   * The Householder coefficients allow the reconstruction of the matrix
+   * \f$ Q \f$ in the Hessenberg decomposition from the packed data.
+   *
+   * \sa packedMatrix(), \ref Householder_Module "Householder module"
+   */
+  const CoeffVectorType& householderCoefficients() const {
+    eigen_assert(m_isInitialized && "HessenbergDecomposition is not initialized.");
+    return m_hCoeffs;
+  }
 
-    /** \brief Returns the internal representation of the decomposition
-      *
-      *	\returns a const reference to a matrix with the internal representation
-      *	         of the decomposition.
-      *
-      * \pre Either the constructor HessenbergDecomposition(const MatrixType&)
-      * or the member function compute(const MatrixType&) has been called
-      * before to compute the Hessenberg decomposition of a matrix.
-      *
-      * The returned matrix contains the following information:
-      *  - the upper part and lower sub-diagonal represent the Hessenberg matrix H
-      *  - the rest of the lower part contains the Householder vectors that, combined with
-      *    Householder coefficients returned by householderCoefficients(),
-      *    allows to reconstruct the matrix Q as
-      *       \f$ Q = H_{N-1} \ldots H_1 H_0 \f$.
-      *    Here, the matrices \f$ H_i \f$ are the Householder transformations
-      *       \f$ H_i = (I - h_i v_i v_i^T) \f$
-      *    where \f$ h_i \f$ is the \f$ i \f$th Householder coefficient and
-      *    \f$ v_i \f$ is the Householder vector defined by
-      *       \f$ v_i = [ 0, \ldots, 0, 1, M(i+2,i), \ldots, M(N-1,i) ]^T \f$
-      *    with M the matrix returned by this function.
-      *
-      * See LAPACK for further details on this packed storage.
-      *
-      * Example: \include HessenbergDecomposition_packedMatrix.cpp
-      * Output: \verbinclude HessenbergDecomposition_packedMatrix.out
-      *
-      * \sa householderCoefficients()
-      */
-    const MatrixType& packedMatrix() const
-    {
-      eigen_assert(m_isInitialized && "HessenbergDecomposition is not initialized.");
-      return m_matrix;
-    }
+  /** \brief Returns the internal representation of the decomposition
+   *
+   *	\returns a const reference to a matrix with the internal representation
+   *	         of the decomposition.
+   *
+   * \pre Either the constructor HessenbergDecomposition(const MatrixType&)
+   * or the member function compute(const MatrixType&) has been called
+   * before to compute the Hessenberg decomposition of a matrix.
+   *
+   * The returned matrix contains the following information:
+   *  - the upper part and lower sub-diagonal represent the Hessenberg matrix H
+   *  - the rest of the lower part contains the Householder vectors that, combined with
+   *    Householder coefficients returned by householderCoefficients(),
+   *    allows to reconstruct the matrix Q as
+   *       \f$ Q = H_{N-1} \ldots H_1 H_0 \f$.
+   *    Here, the matrices \f$ H_i \f$ are the Householder transformations
+   *       \f$ H_i = (I - h_i v_i v_i^T) \f$
+   *    where \f$ h_i \f$ is the \f$ i \f$th Householder coefficient and
+   *    \f$ v_i \f$ is the Householder vector defined by
+   *       \f$ v_i = [ 0, \ldots, 0, 1, M(i+2,i), \ldots, M(N-1,i) ]^T \f$
+   *    with M the matrix returned by this function.
+   *
+   * See LAPACK for further details on this packed storage.
+   *
+   * Example: \include HessenbergDecomposition_packedMatrix.cpp
+   * Output: \verbinclude HessenbergDecomposition_packedMatrix.out
+   *
+   * \sa householderCoefficients()
+   */
+  const MatrixType& packedMatrix() const {
+    eigen_assert(m_isInitialized && "HessenbergDecomposition is not initialized.");
+    return m_matrix;
+  }
 
-    /** \brief Reconstructs the orthogonal matrix Q in the decomposition
-      *
-      * \returns object representing the matrix Q
-      *
-      * \pre Either the constructor HessenbergDecomposition(const MatrixType&)
-      * or the member function compute(const MatrixType&) has been called
-      * before to compute the Hessenberg decomposition of a matrix.
-      *
-      * This function returns a light-weight object of template class
-      * HouseholderSequence. You can either apply it directly to a matrix or
-      * you can convert it to a matrix of type #MatrixType.
-      *
-      * \sa matrixH() for an example, class HouseholderSequence
-      */
-    HouseholderSequenceType matrixQ() const
-    {
-      eigen_assert(m_isInitialized && "HessenbergDecomposition is not initialized.");
-      return HouseholderSequenceType(m_matrix, m_hCoeffs.conjugate())
-             .setLength(m_matrix.rows() - 1)
-             .setShift(1);
-    }
+  /** \brief Reconstructs the orthogonal matrix Q in the decomposition
+   *
+   * \returns object representing the matrix Q
+   *
+   * \pre Either the constructor HessenbergDecomposition(const MatrixType&)
+   * or the member function compute(const MatrixType&) has been called
+   * before to compute the Hessenberg decomposition of a matrix.
+   *
+   * This function returns a light-weight object of template class
+   * HouseholderSequence. You can either apply it directly to a matrix or
+   * you can convert it to a matrix of type #MatrixType.
+   *
+   * \sa matrixH() for an example, class HouseholderSequence
+   */
+  HouseholderSequenceType matrixQ() const {
+    eigen_assert(m_isInitialized && "HessenbergDecomposition is not initialized.");
+    return HouseholderSequenceType(m_matrix, m_hCoeffs.conjugate()).setLength(m_matrix.rows() - 1).setShift(1);
+  }
 
-    /** \brief Constructs the Hessenberg matrix H in the decomposition
-      *
-      * \returns expression object representing the matrix H
-      *
-      * \pre Either the constructor HessenbergDecomposition(const MatrixType&)
-      * or the member function compute(const MatrixType&) has been called
-      * before to compute the Hessenberg decomposition of a matrix.
-      *
-      * The object returned by this function constructs the Hessenberg matrix H
-      * when it is assigned to a matrix or otherwise evaluated. The matrix H is
-      * constructed from the packed matrix as returned by packedMatrix(): The
-      * upper part (including the subdiagonal) of the packed matrix contains
-      * the matrix H. It may sometimes be better to directly use the packed
-      * matrix instead of constructing the matrix H.
-      *
-      * Example: \include HessenbergDecomposition_matrixH.cpp
-      * Output: \verbinclude HessenbergDecomposition_matrixH.out
-      *
-      * \sa matrixQ(), packedMatrix()
-      */
-    MatrixHReturnType matrixH() const
-    {
-      eigen_assert(m_isInitialized && "HessenbergDecomposition is not initialized.");
-      return MatrixHReturnType(*this);
-    }
+  /** \brief Constructs the Hessenberg matrix H in the decomposition
+   *
+   * \returns expression object representing the matrix H
+   *
+   * \pre Either the constructor HessenbergDecomposition(const MatrixType&)
+   * or the member function compute(const MatrixType&) has been called
+   * before to compute the Hessenberg decomposition of a matrix.
+   *
+   * The object returned by this function constructs the Hessenberg matrix H
+   * when it is assigned to a matrix or otherwise evaluated. The matrix H is
+   * constructed from the packed matrix as returned by packedMatrix(): The
+   * upper part (including the subdiagonal) of the packed matrix contains
+   * the matrix H. It may sometimes be better to directly use the packed
+   * matrix instead of constructing the matrix H.
+   *
+   * Example: \include HessenbergDecomposition_matrixH.cpp
+   * Output: \verbinclude HessenbergDecomposition_matrixH.out
+   *
+   * \sa matrixQ(), packedMatrix()
+   */
+  MatrixHReturnType matrixH() const {
+    eigen_assert(m_isInitialized && "HessenbergDecomposition is not initialized.");
+    return MatrixHReturnType(*this);
+  }
 
-  private:
+ private:
+  typedef Matrix<Scalar, 1, Size, int(Options) | int(RowMajor), 1, MaxSize> VectorType;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  static void _compute(MatrixType& matA, CoeffVectorType& hCoeffs, VectorType& temp);
 
-    typedef Matrix<Scalar, 1, Size, int(Options) | int(RowMajor), 1, MaxSize> VectorType;
-    typedef typename NumTraits<Scalar>::Real RealScalar;
-    static void _compute(MatrixType& matA, CoeffVectorType& hCoeffs, VectorType& temp);
-
-  protected:
-    MatrixType m_matrix;
-    CoeffVectorType m_hCoeffs;
-    VectorType m_temp;
-    bool m_isInitialized;
+ protected:
+  MatrixType m_matrix;
+  CoeffVectorType m_hCoeffs;
+  VectorType m_temp;
+  bool m_isInitialized;
 };
 
 /** \internal
-  * Performs a tridiagonal decomposition of \a matA in place.
-  *
-  * \param matA the input selfadjoint matrix
-  * \param hCoeffs returned Householder coefficients
-  *
-  * The result is written in the lower triangular part of \a matA.
-  *
-  * Implemented from Golub's "%Matrix Computations", algorithm 8.3.1.
-  *
-  * \sa packedMatrix()
-  */
-template<typename MatrixType>
-void HessenbergDecomposition<MatrixType>::_compute(MatrixType& matA, CoeffVectorType& hCoeffs, VectorType& temp)
-{
-  eigen_assert(matA.rows()==matA.cols());
+ * Performs a tridiagonal decomposition of \a matA in place.
+ *
+ * \param matA the input selfadjoint matrix
+ * \param hCoeffs returned Householder coefficients
+ *
+ * The result is written in the lower triangular part of \a matA.
+ *
+ * Implemented from Golub's "%Matrix Computations", algorithm 8.3.1.
+ *
+ * \sa packedMatrix()
+ */
+template <typename MatrixType>
+void HessenbergDecomposition<MatrixType>::_compute(MatrixType& matA, CoeffVectorType& hCoeffs, VectorType& temp) {
+  eigen_assert(matA.rows() == matA.cols());
   Index n = matA.rows();
   temp.resize(n);
-  for (Index i = 0; i<n-1; ++i)
-  {
+  for (Index i = 0; i < n - 1; ++i) {
     // let's consider the vector v = i-th column starting at position i+1
-    Index remainingSize = n-i-1;
+    Index remainingSize = n - i - 1;
     RealScalar beta;
     Scalar h;
     matA.col(i).tail(remainingSize).makeHouseholderInPlace(h, beta);
-    matA.col(i).coeffRef(i+1) = beta;
+    matA.col(i).coeffRef(i + 1) = beta;
     hCoeffs.coeffRef(i) = h;
 
     // Apply similarity transformation to remaining columns,
@@ -314,64 +295,62 @@
 
     // A = H A
     matA.bottomRightCorner(remainingSize, remainingSize)
-        .applyHouseholderOnTheLeft(matA.col(i).tail(remainingSize-1), h, &temp.coeffRef(0));
+        .applyHouseholderOnTheLeft(matA.col(i).tail(remainingSize - 1), h, &temp.coeffRef(0));
 
     // A = A H'
     matA.rightCols(remainingSize)
-        .applyHouseholderOnTheRight(matA.col(i).tail(remainingSize-1), numext::conj(h), &temp.coeffRef(0));
+        .applyHouseholderOnTheRight(matA.col(i).tail(remainingSize - 1), numext::conj(h), &temp.coeffRef(0));
   }
 }
 
 namespace internal {
 
 /** \eigenvalues_module \ingroup Eigenvalues_Module
-  *
-  *
-  * \brief Expression type for return value of HessenbergDecomposition::matrixH()
-  *
-  * \tparam MatrixType type of matrix in the Hessenberg decomposition
-  *
-  * Objects of this type represent the Hessenberg matrix in the Hessenberg
-  * decomposition of some matrix. The object holds a reference to the
-  * HessenbergDecomposition class until the it is assigned or evaluated for
-  * some other reason (the reference should remain valid during the life time
-  * of this object). This class is the return type of
-  * HessenbergDecomposition::matrixH(); there is probably no other use for this
-  * class.
-  */
-template<typename MatrixType> struct HessenbergDecompositionMatrixHReturnType
-: public ReturnByValue<HessenbergDecompositionMatrixHReturnType<MatrixType> >
-{
-  public:
-    /** \brief Constructor.
-      *
-      * \param[in] hess  Hessenberg decomposition
-      */
-    HessenbergDecompositionMatrixHReturnType(const HessenbergDecomposition<MatrixType>& hess) : m_hess(hess) { }
+ *
+ *
+ * \brief Expression type for return value of HessenbergDecomposition::matrixH()
+ *
+ * \tparam MatrixType type of matrix in the Hessenberg decomposition
+ *
+ * Objects of this type represent the Hessenberg matrix in the Hessenberg
+ * decomposition of some matrix. The object holds a reference to the
+ * HessenbergDecomposition class until the it is assigned or evaluated for
+ * some other reason (the reference should remain valid during the life time
+ * of this object). This class is the return type of
+ * HessenbergDecomposition::matrixH(); there is probably no other use for this
+ * class.
+ */
+template <typename MatrixType>
+struct HessenbergDecompositionMatrixHReturnType
+    : public ReturnByValue<HessenbergDecompositionMatrixHReturnType<MatrixType>> {
+ public:
+  /** \brief Constructor.
+   *
+   * \param[in] hess  Hessenberg decomposition
+   */
+  HessenbergDecompositionMatrixHReturnType(const HessenbergDecomposition<MatrixType>& hess) : m_hess(hess) {}
 
-    /** \brief Hessenberg matrix in decomposition.
-      *
-      * \param[out] result  Hessenberg matrix in decomposition \p hess which
-      *                     was passed to the constructor
-      */
-    template <typename ResultType>
-    inline void evalTo(ResultType& result) const
-    {
-      result = m_hess.packedMatrix();
-      Index n = result.rows();
-      if (n>2)
-        result.bottomLeftCorner(n-2, n-2).template triangularView<Lower>().setZero();
-    }
+  /** \brief Hessenberg matrix in decomposition.
+   *
+   * \param[out] result  Hessenberg matrix in decomposition \p hess which
+   *                     was passed to the constructor
+   */
+  template <typename ResultType>
+  inline void evalTo(ResultType& result) const {
+    result = m_hess.packedMatrix();
+    Index n = result.rows();
+    if (n > 2) result.bottomLeftCorner(n - 2, n - 2).template triangularView<Lower>().setZero();
+  }
 
-    Index rows() const { return m_hess.packedMatrix().rows(); }
-    Index cols() const { return m_hess.packedMatrix().cols(); }
+  Index rows() const { return m_hess.packedMatrix().rows(); }
+  Index cols() const { return m_hess.packedMatrix().cols(); }
 
-  protected:
-    const HessenbergDecomposition<MatrixType>& m_hess;
+ protected:
+  const HessenbergDecomposition<MatrixType>& m_hess;
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_HESSENBERGDECOMPOSITION_H
+#endif  // EIGEN_HESSENBERGDECOMPOSITION_H
diff --git a/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h b/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h
index 3374891..62227bd 100644
--- a/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h
+++ b/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h
@@ -14,148 +14,129 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
-template<typename Derived, bool IsComplex>
-struct eigenvalues_selector
-{
+template <typename Derived, bool IsComplex>
+struct eigenvalues_selector {
   // this is the implementation for the case IsComplex = true
-  static inline typename MatrixBase<Derived>::EigenvaluesReturnType const
-  run(const MatrixBase<Derived>& m)
-  {
+  static inline typename MatrixBase<Derived>::EigenvaluesReturnType const run(const MatrixBase<Derived>& m) {
     typedef typename Derived::PlainObject PlainObject;
     PlainObject m_eval(m);
     return ComplexEigenSolver<PlainObject>(m_eval, false).eigenvalues();
   }
 };
 
-template<typename Derived>
-struct eigenvalues_selector<Derived, false>
-{
-  static inline typename MatrixBase<Derived>::EigenvaluesReturnType const
-  run(const MatrixBase<Derived>& m)
-  {
+template <typename Derived>
+struct eigenvalues_selector<Derived, false> {
+  static inline typename MatrixBase<Derived>::EigenvaluesReturnType const run(const MatrixBase<Derived>& m) {
     typedef typename Derived::PlainObject PlainObject;
     PlainObject m_eval(m);
     return EigenSolver<PlainObject>(m_eval, false).eigenvalues();
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-/** \brief Computes the eigenvalues of a matrix 
-  * \returns Column vector containing the eigenvalues.
-  *
-  * \eigenvalues_module
-  * This function computes the eigenvalues with the help of the EigenSolver
-  * class (for real matrices) or the ComplexEigenSolver class (for complex
-  * matrices). 
-  *
-  * The eigenvalues are repeated according to their algebraic multiplicity,
-  * so there are as many eigenvalues as rows in the matrix.
-  *
-  * The SelfAdjointView class provides a better algorithm for selfadjoint
-  * matrices.
-  *
-  * Example: \include MatrixBase_eigenvalues.cpp
-  * Output: \verbinclude MatrixBase_eigenvalues.out
-  *
-  * \sa EigenSolver::eigenvalues(), ComplexEigenSolver::eigenvalues(),
-  *     SelfAdjointView::eigenvalues()
-  */
-template<typename Derived>
-inline typename MatrixBase<Derived>::EigenvaluesReturnType
-MatrixBase<Derived>::eigenvalues() const
-{
+/** \brief Computes the eigenvalues of a matrix
+ * \returns Column vector containing the eigenvalues.
+ *
+ * \eigenvalues_module
+ * This function computes the eigenvalues with the help of the EigenSolver
+ * class (for real matrices) or the ComplexEigenSolver class (for complex
+ * matrices).
+ *
+ * The eigenvalues are repeated according to their algebraic multiplicity,
+ * so there are as many eigenvalues as rows in the matrix.
+ *
+ * The SelfAdjointView class provides a better algorithm for selfadjoint
+ * matrices.
+ *
+ * Example: \include MatrixBase_eigenvalues.cpp
+ * Output: \verbinclude MatrixBase_eigenvalues.out
+ *
+ * \sa EigenSolver::eigenvalues(), ComplexEigenSolver::eigenvalues(),
+ *     SelfAdjointView::eigenvalues()
+ */
+template <typename Derived>
+inline typename MatrixBase<Derived>::EigenvaluesReturnType MatrixBase<Derived>::eigenvalues() const {
   return internal::eigenvalues_selector<Derived, NumTraits<Scalar>::IsComplex>::run(derived());
 }
 
 /** \brief Computes the eigenvalues of a matrix
-  * \returns Column vector containing the eigenvalues.
-  *
-  * \eigenvalues_module
-  * This function computes the eigenvalues with the help of the
-  * SelfAdjointEigenSolver class.  The eigenvalues are repeated according to
-  * their algebraic multiplicity, so there are as many eigenvalues as rows in
-  * the matrix.
-  *
-  * Example: \include SelfAdjointView_eigenvalues.cpp
-  * Output: \verbinclude SelfAdjointView_eigenvalues.out
-  *
-  * \sa SelfAdjointEigenSolver::eigenvalues(), MatrixBase::eigenvalues()
-  */
-template<typename MatrixType, unsigned int UpLo> 
+ * \returns Column vector containing the eigenvalues.
+ *
+ * \eigenvalues_module
+ * This function computes the eigenvalues with the help of the
+ * SelfAdjointEigenSolver class.  The eigenvalues are repeated according to
+ * their algebraic multiplicity, so there are as many eigenvalues as rows in
+ * the matrix.
+ *
+ * Example: \include SelfAdjointView_eigenvalues.cpp
+ * Output: \verbinclude SelfAdjointView_eigenvalues.out
+ *
+ * \sa SelfAdjointEigenSolver::eigenvalues(), MatrixBase::eigenvalues()
+ */
+template <typename MatrixType, unsigned int UpLo>
 EIGEN_DEVICE_FUNC inline typename SelfAdjointView<MatrixType, UpLo>::EigenvaluesReturnType
-SelfAdjointView<MatrixType, UpLo>::eigenvalues() const
-{
+SelfAdjointView<MatrixType, UpLo>::eigenvalues() const {
   PlainObject thisAsMatrix(*this);
   return SelfAdjointEigenSolver<PlainObject>(thisAsMatrix, false).eigenvalues();
 }
 
-
-
 /** \brief Computes the L2 operator norm
-  * \returns Operator norm of the matrix.
-  *
-  * \eigenvalues_module
-  * This function computes the L2 operator norm of a matrix, which is also
-  * known as the spectral norm. The norm of a matrix \f$ A \f$ is defined to be
-  * \f[ \|A\|_2 = \max_x \frac{\|Ax\|_2}{\|x\|_2} \f]
-  * where the maximum is over all vectors and the norm on the right is the
-  * Euclidean vector norm. The norm equals the largest singular value, which is
-  * the square root of the largest eigenvalue of the positive semi-definite
-  * matrix \f$ A^*A \f$.
-  *
-  * The current implementation uses the eigenvalues of \f$ A^*A \f$, as computed
-  * by SelfAdjointView::eigenvalues(), to compute the operator norm of a
-  * matrix.  The SelfAdjointView class provides a better algorithm for
-  * selfadjoint matrices.
-  *
-  * Example: \include MatrixBase_operatorNorm.cpp
-  * Output: \verbinclude MatrixBase_operatorNorm.out
-  *
-  * \sa SelfAdjointView::eigenvalues(), SelfAdjointView::operatorNorm()
-  */
-template<typename Derived>
-inline typename MatrixBase<Derived>::RealScalar
-MatrixBase<Derived>::operatorNorm() const
-{
+ * \returns Operator norm of the matrix.
+ *
+ * \eigenvalues_module
+ * This function computes the L2 operator norm of a matrix, which is also
+ * known as the spectral norm. The norm of a matrix \f$ A \f$ is defined to be
+ * \f[ \|A\|_2 = \max_x \frac{\|Ax\|_2}{\|x\|_2} \f]
+ * where the maximum is over all vectors and the norm on the right is the
+ * Euclidean vector norm. The norm equals the largest singular value, which is
+ * the square root of the largest eigenvalue of the positive semi-definite
+ * matrix \f$ A^*A \f$.
+ *
+ * The current implementation uses the eigenvalues of \f$ A^*A \f$, as computed
+ * by SelfAdjointView::eigenvalues(), to compute the operator norm of a
+ * matrix.  The SelfAdjointView class provides a better algorithm for
+ * selfadjoint matrices.
+ *
+ * Example: \include MatrixBase_operatorNorm.cpp
+ * Output: \verbinclude MatrixBase_operatorNorm.out
+ *
+ * \sa SelfAdjointView::eigenvalues(), SelfAdjointView::operatorNorm()
+ */
+template <typename Derived>
+inline typename MatrixBase<Derived>::RealScalar MatrixBase<Derived>::operatorNorm() const {
   using std::sqrt;
   typename Derived::PlainObject m_eval(derived());
   // FIXME if it is really guaranteed that the eigenvalues are already sorted,
   // then we don't need to compute a maxCoeff() here, comparing the 1st and last ones is enough.
-  return sqrt((m_eval*m_eval.adjoint())
-                 .eval()
-		 .template selfadjointView<Lower>()
-		 .eigenvalues()
-		 .maxCoeff()
-		 );
+  return sqrt((m_eval * m_eval.adjoint()).eval().template selfadjointView<Lower>().eigenvalues().maxCoeff());
 }
 
 /** \brief Computes the L2 operator norm
-  * \returns Operator norm of the matrix.
-  *
-  * \eigenvalues_module
-  * This function computes the L2 operator norm of a self-adjoint matrix. For a
-  * self-adjoint matrix, the operator norm is the largest eigenvalue.
-  *
-  * The current implementation uses the eigenvalues of the matrix, as computed
-  * by eigenvalues(), to compute the operator norm of the matrix.
-  *
-  * Example: \include SelfAdjointView_operatorNorm.cpp
-  * Output: \verbinclude SelfAdjointView_operatorNorm.out
-  *
-  * \sa eigenvalues(), MatrixBase::operatorNorm()
-  */
-template<typename MatrixType, unsigned int UpLo>
+ * \returns Operator norm of the matrix.
+ *
+ * \eigenvalues_module
+ * This function computes the L2 operator norm of a self-adjoint matrix. For a
+ * self-adjoint matrix, the operator norm is the largest eigenvalue.
+ *
+ * The current implementation uses the eigenvalues of the matrix, as computed
+ * by eigenvalues(), to compute the operator norm of the matrix.
+ *
+ * Example: \include SelfAdjointView_operatorNorm.cpp
+ * Output: \verbinclude SelfAdjointView_operatorNorm.out
+ *
+ * \sa eigenvalues(), MatrixBase::operatorNorm()
+ */
+template <typename MatrixType, unsigned int UpLo>
 EIGEN_DEVICE_FUNC inline typename SelfAdjointView<MatrixType, UpLo>::RealScalar
-SelfAdjointView<MatrixType, UpLo>::operatorNorm() const
-{
+SelfAdjointView<MatrixType, UpLo>::operatorNorm() const {
   return eigenvalues().cwiseAbs().maxCoeff();
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
 #endif
diff --git a/Eigen/src/Eigenvalues/RealQZ.h b/Eigen/src/Eigenvalues/RealQZ.h
index 675ced0..9fba7ad 100644
--- a/Eigen/src/Eigenvalues/RealQZ.h
+++ b/Eigen/src/Eigenvalues/RealQZ.h
@@ -15,646 +15,573 @@
 
 namespace Eigen {
 
-  /** \eigenvalues_module \ingroup Eigenvalues_Module
+/** \eigenvalues_module \ingroup Eigenvalues_Module
+ *
+ *
+ * \class RealQZ
+ *
+ * \brief Performs a real QZ decomposition of a pair of square matrices
+ *
+ * \tparam MatrixType_ the type of the matrix of which we are computing the
+ * real QZ decomposition; this is expected to be an instantiation of the
+ * Matrix class template.
+ *
+ * Given a real square matrices A and B, this class computes the real QZ
+ * decomposition: \f$ A = Q S Z \f$, \f$ B = Q T Z \f$ where Q and Z are
+ * real orthogonal matrixes, T is upper-triangular matrix, and S is upper
+ * quasi-triangular matrix. An orthogonal matrix is a matrix whose
+ * inverse is equal to its transpose, \f$ U^{-1} = U^T \f$. A quasi-triangular
+ * matrix is a block-triangular matrix whose diagonal consists of 1-by-1
+ * blocks and 2-by-2 blocks where further reduction is impossible due to
+ * complex eigenvalues.
+ *
+ * The eigenvalues of the pencil \f$ A - z B \f$ can be obtained from
+ * 1x1 and 2x2 blocks on the diagonals of S and T.
+ *
+ * Call the function compute() to compute the real QZ decomposition of a
+ * given pair of matrices. Alternatively, you can use the
+ * RealQZ(const MatrixType& B, const MatrixType& B, bool computeQZ)
+ * constructor which computes the real QZ decomposition at construction
+ * time. Once the decomposition is computed, you can use the matrixS(),
+ * matrixT(), matrixQ() and matrixZ() functions to retrieve the matrices
+ * S, T, Q and Z in the decomposition. If computeQZ==false, some time
+ * is saved by not computing matrices Q and Z.
+ *
+ * Example: \include RealQZ_compute.cpp
+ * Output: \include RealQZ_compute.out
+ *
+ * \note The implementation is based on the algorithm in "Matrix Computations"
+ * by Gene H. Golub and Charles F. Van Loan, and a paper "An algorithm for
+ * generalized eigenvalue problems" by C.B.Moler and G.W.Stewart.
+ *
+ * \sa class RealSchur, class ComplexSchur, class EigenSolver, class ComplexEigenSolver
+ */
+
+template <typename MatrixType_>
+class RealQZ {
+ public:
+  typedef MatrixType_ MatrixType;
+  enum {
+    RowsAtCompileTime = MatrixType::RowsAtCompileTime,
+    ColsAtCompileTime = MatrixType::ColsAtCompileTime,
+    Options = MatrixType::Options,
+    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
+  };
+  typedef typename MatrixType::Scalar Scalar;
+  typedef std::complex<typename NumTraits<Scalar>::Real> ComplexScalar;
+  typedef Eigen::Index Index;  ///< \deprecated since Eigen 3.3
+
+  typedef Matrix<ComplexScalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> EigenvalueType;
+  typedef Matrix<Scalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> ColumnVectorType;
+
+  /** \brief Default constructor.
    *
+   * \param [in] size  Positive integer, size of the matrix whose QZ decomposition will be computed.
    *
-   * \class RealQZ
+   * The default constructor is useful in cases in which the user intends to
+   * perform decompositions via compute().  The \p size parameter is only
+   * used as a hint. It is not an error to give a wrong \p size, but it may
+   * impair performance.
    *
-   * \brief Performs a real QZ decomposition of a pair of square matrices
-   *
-   * \tparam MatrixType_ the type of the matrix of which we are computing the
-   * real QZ decomposition; this is expected to be an instantiation of the
-   * Matrix class template.
-   *
-   * Given a real square matrices A and B, this class computes the real QZ
-   * decomposition: \f$ A = Q S Z \f$, \f$ B = Q T Z \f$ where Q and Z are
-   * real orthogonal matrixes, T is upper-triangular matrix, and S is upper
-   * quasi-triangular matrix. An orthogonal matrix is a matrix whose
-   * inverse is equal to its transpose, \f$ U^{-1} = U^T \f$. A quasi-triangular
-   * matrix is a block-triangular matrix whose diagonal consists of 1-by-1
-   * blocks and 2-by-2 blocks where further reduction is impossible due to
-   * complex eigenvalues. 
-   *
-   * The eigenvalues of the pencil \f$ A - z B \f$ can be obtained from
-   * 1x1 and 2x2 blocks on the diagonals of S and T.
-   *
-   * Call the function compute() to compute the real QZ decomposition of a
-   * given pair of matrices. Alternatively, you can use the 
-   * RealQZ(const MatrixType& B, const MatrixType& B, bool computeQZ)
-   * constructor which computes the real QZ decomposition at construction
-   * time. Once the decomposition is computed, you can use the matrixS(),
-   * matrixT(), matrixQ() and matrixZ() functions to retrieve the matrices
-   * S, T, Q and Z in the decomposition. If computeQZ==false, some time
-   * is saved by not computing matrices Q and Z.
-   *
-   * Example: \include RealQZ_compute.cpp
-   * Output: \include RealQZ_compute.out
-   *
-   * \note The implementation is based on the algorithm in "Matrix Computations"
-   * by Gene H. Golub and Charles F. Van Loan, and a paper "An algorithm for
-   * generalized eigenvalue problems" by C.B.Moler and G.W.Stewart.
-   *
-   * \sa class RealSchur, class ComplexSchur, class EigenSolver, class ComplexEigenSolver
+   * \sa compute() for an example.
    */
-
-  template<typename MatrixType_> class RealQZ
-  {
-    public:
-      typedef MatrixType_ MatrixType;
-      enum {
-        RowsAtCompileTime = MatrixType::RowsAtCompileTime,
-        ColsAtCompileTime = MatrixType::ColsAtCompileTime,
-        Options = MatrixType::Options,
-        MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
-        MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
-      };
-      typedef typename MatrixType::Scalar Scalar;
-      typedef std::complex<typename NumTraits<Scalar>::Real> ComplexScalar;
-      typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3
-
-      typedef Matrix<ComplexScalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> EigenvalueType;
-      typedef Matrix<Scalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> ColumnVectorType;
-
-      /** \brief Default constructor.
-       *
-       * \param [in] size  Positive integer, size of the matrix whose QZ decomposition will be computed.
-       *
-       * The default constructor is useful in cases in which the user intends to
-       * perform decompositions via compute().  The \p size parameter is only
-       * used as a hint. It is not an error to give a wrong \p size, but it may
-       * impair performance.
-       *
-       * \sa compute() for an example.
-       */
-      explicit RealQZ(Index size = RowsAtCompileTime==Dynamic ? 1 : RowsAtCompileTime) :
-        m_S(size, size),
+  explicit RealQZ(Index size = RowsAtCompileTime == Dynamic ? 1 : RowsAtCompileTime)
+      : m_S(size, size),
         m_T(size, size),
         m_Q(size, size),
         m_Z(size, size),
-        m_workspace(size*2),
+        m_workspace(size * 2),
         m_maxIters(400),
         m_isInitialized(false),
-        m_computeQZ(true)
-      {}
+        m_computeQZ(true) {}
 
-      /** \brief Constructor; computes real QZ decomposition of given matrices
-       * 
-       * \param[in]  A          Matrix A.
-       * \param[in]  B          Matrix B.
-       * \param[in]  computeQZ  If false, A and Z are not computed.
-       *
-       * This constructor calls compute() to compute the QZ decomposition.
-       */
-      RealQZ(const MatrixType& A, const MatrixType& B, bool computeQZ = true) :
-        m_S(A.rows(),A.cols()),
-        m_T(A.rows(),A.cols()),
-        m_Q(A.rows(),A.cols()),
-        m_Z(A.rows(),A.cols()),
-        m_workspace(A.rows()*2),
+  /** \brief Constructor; computes real QZ decomposition of given matrices
+   *
+   * \param[in]  A          Matrix A.
+   * \param[in]  B          Matrix B.
+   * \param[in]  computeQZ  If false, A and Z are not computed.
+   *
+   * This constructor calls compute() to compute the QZ decomposition.
+   */
+  RealQZ(const MatrixType& A, const MatrixType& B, bool computeQZ = true)
+      : m_S(A.rows(), A.cols()),
+        m_T(A.rows(), A.cols()),
+        m_Q(A.rows(), A.cols()),
+        m_Z(A.rows(), A.cols()),
+        m_workspace(A.rows() * 2),
         m_maxIters(400),
         m_isInitialized(false),
-        m_computeQZ(true)
-      {
-        compute(A, B, computeQZ);
-      }
+        m_computeQZ(true) {
+    compute(A, B, computeQZ);
+  }
 
-      /** \brief Returns matrix Q in the QZ decomposition. 
-       *
-       * \returns A const reference to the matrix Q.
-       */
-      const MatrixType& matrixQ() const {
-        eigen_assert(m_isInitialized && "RealQZ is not initialized.");
-        eigen_assert(m_computeQZ && "The matrices Q and Z have not been computed during the QZ decomposition.");
-        return m_Q;
-      }
+  /** \brief Returns matrix Q in the QZ decomposition.
+   *
+   * \returns A const reference to the matrix Q.
+   */
+  const MatrixType& matrixQ() const {
+    eigen_assert(m_isInitialized && "RealQZ is not initialized.");
+    eigen_assert(m_computeQZ && "The matrices Q and Z have not been computed during the QZ decomposition.");
+    return m_Q;
+  }
 
-      /** \brief Returns matrix Z in the QZ decomposition. 
-       *
-       * \returns A const reference to the matrix Z.
-       */
-      const MatrixType& matrixZ() const {
-        eigen_assert(m_isInitialized && "RealQZ is not initialized.");
-        eigen_assert(m_computeQZ && "The matrices Q and Z have not been computed during the QZ decomposition.");
-        return m_Z;
-      }
+  /** \brief Returns matrix Z in the QZ decomposition.
+   *
+   * \returns A const reference to the matrix Z.
+   */
+  const MatrixType& matrixZ() const {
+    eigen_assert(m_isInitialized && "RealQZ is not initialized.");
+    eigen_assert(m_computeQZ && "The matrices Q and Z have not been computed during the QZ decomposition.");
+    return m_Z;
+  }
 
-      /** \brief Returns matrix S in the QZ decomposition. 
-       *
-       * \returns A const reference to the matrix S.
-       */
-      const MatrixType& matrixS() const {
-        eigen_assert(m_isInitialized && "RealQZ is not initialized.");
-        return m_S;
-      }
+  /** \brief Returns matrix S in the QZ decomposition.
+   *
+   * \returns A const reference to the matrix S.
+   */
+  const MatrixType& matrixS() const {
+    eigen_assert(m_isInitialized && "RealQZ is not initialized.");
+    return m_S;
+  }
 
-      /** \brief Returns matrix S in the QZ decomposition. 
-       *
-       * \returns A const reference to the matrix S.
-       */
-      const MatrixType& matrixT() const {
-        eigen_assert(m_isInitialized && "RealQZ is not initialized.");
-        return m_T;
-      }
+  /** \brief Returns matrix S in the QZ decomposition.
+   *
+   * \returns A const reference to the matrix S.
+   */
+  const MatrixType& matrixT() const {
+    eigen_assert(m_isInitialized && "RealQZ is not initialized.");
+    return m_T;
+  }
 
-      /** \brief Computes QZ decomposition of given matrix. 
-       * 
-       * \param[in]  A          Matrix A.
-       * \param[in]  B          Matrix B.
-       * \param[in]  computeQZ  If false, A and Z are not computed.
-       * \returns    Reference to \c *this
-       */
-      RealQZ& compute(const MatrixType& A, const MatrixType& B, bool computeQZ = true);
+  /** \brief Computes QZ decomposition of given matrix.
+   *
+   * \param[in]  A          Matrix A.
+   * \param[in]  B          Matrix B.
+   * \param[in]  computeQZ  If false, A and Z are not computed.
+   * \returns    Reference to \c *this
+   */
+  RealQZ& compute(const MatrixType& A, const MatrixType& B, bool computeQZ = true);
 
-      /** \brief Reports whether previous computation was successful.
-       *
-       * \returns \c Success if computation was successful, \c NoConvergence otherwise.
-       */
-      ComputationInfo info() const
-      {
-        eigen_assert(m_isInitialized && "RealQZ is not initialized.");
-        return m_info;
-      }
+  /** \brief Reports whether previous computation was successful.
+   *
+   * \returns \c Success if computation was successful, \c NoConvergence otherwise.
+   */
+  ComputationInfo info() const {
+    eigen_assert(m_isInitialized && "RealQZ is not initialized.");
+    return m_info;
+  }
 
-      /** \brief Returns number of performed QR-like iterations.
-      */
-      Index iterations() const
-      {
-        eigen_assert(m_isInitialized && "RealQZ is not initialized.");
-        return m_global_iter;
-      }
+  /** \brief Returns number of performed QR-like iterations.
+   */
+  Index iterations() const {
+    eigen_assert(m_isInitialized && "RealQZ is not initialized.");
+    return m_global_iter;
+  }
 
-      /** Sets the maximal number of iterations allowed to converge to one eigenvalue
-       * or decouple the problem.
-      */
-      RealQZ& setMaxIterations(Index maxIters)
-      {
-        m_maxIters = maxIters;
-        return *this;
-      }
+  /** Sets the maximal number of iterations allowed to converge to one eigenvalue
+   * or decouple the problem.
+   */
+  RealQZ& setMaxIterations(Index maxIters) {
+    m_maxIters = maxIters;
+    return *this;
+  }
 
-    private:
+ private:
+  MatrixType m_S, m_T, m_Q, m_Z;
+  Matrix<Scalar, Dynamic, 1> m_workspace;
+  ComputationInfo m_info;
+  Index m_maxIters;
+  bool m_isInitialized;
+  bool m_computeQZ;
+  Scalar m_normOfT, m_normOfS;
+  Index m_global_iter;
 
-      MatrixType m_S, m_T, m_Q, m_Z;
-      Matrix<Scalar,Dynamic,1> m_workspace;
-      ComputationInfo m_info;
-      Index m_maxIters;
-      bool m_isInitialized;
-      bool m_computeQZ;
-      Scalar m_normOfT, m_normOfS;
-      Index m_global_iter;
+  typedef Matrix<Scalar, 3, 1> Vector3s;
+  typedef Matrix<Scalar, 2, 1> Vector2s;
+  typedef Matrix<Scalar, 2, 2> Matrix2s;
+  typedef JacobiRotation<Scalar> JRs;
 
-      typedef Matrix<Scalar,3,1> Vector3s;
-      typedef Matrix<Scalar,2,1> Vector2s;
-      typedef Matrix<Scalar,2,2> Matrix2s;
-      typedef JacobiRotation<Scalar> JRs;
+  void hessenbergTriangular();
+  void computeNorms();
+  Index findSmallSubdiagEntry(Index iu);
+  Index findSmallDiagEntry(Index f, Index l);
+  void splitOffTwoRows(Index i);
+  void pushDownZero(Index z, Index f, Index l);
+  void step(Index f, Index l, Index iter);
 
-      void hessenbergTriangular();
-      void computeNorms();
-      Index findSmallSubdiagEntry(Index iu);
-      Index findSmallDiagEntry(Index f, Index l);
-      void splitOffTwoRows(Index i);
-      void pushDownZero(Index z, Index f, Index l);
-      void step(Index f, Index l, Index iter);
+};  // RealQZ
 
-  }; // RealQZ
+/** \internal Reduces S and T to upper Hessenberg - triangular form */
+template <typename MatrixType>
+void RealQZ<MatrixType>::hessenbergTriangular() {
+  const Index dim = m_S.cols();
 
-  /** \internal Reduces S and T to upper Hessenberg - triangular form */
-  template<typename MatrixType>
-    void RealQZ<MatrixType>::hessenbergTriangular()
-    {
-
-      const Index dim = m_S.cols();
-
-      // perform QR decomposition of T, overwrite T with R, save Q
-      HouseholderQR<MatrixType> qrT(m_T);
-      m_T = qrT.matrixQR();
-      m_T.template triangularView<StrictlyLower>().setZero();
-      m_Q = qrT.householderQ();
-      // overwrite S with Q* S
-      m_S.applyOnTheLeft(m_Q.adjoint());
-      // init Z as Identity
-      if (m_computeQZ)
-        m_Z = MatrixType::Identity(dim,dim);
-      // reduce S to upper Hessenberg with Givens rotations
-      for (Index j=0; j<=dim-3; j++) {
-        for (Index i=dim-1; i>=j+2; i--) {
-          JRs G;
-          // kill S(i,j)
-          if(!numext::is_exactly_zero(m_S.coeff(i, j)))
-          {
-            G.makeGivens(m_S.coeff(i-1,j), m_S.coeff(i,j), &m_S.coeffRef(i-1, j));
-            m_S.coeffRef(i,j) = Scalar(0.0);
-            m_S.rightCols(dim-j-1).applyOnTheLeft(i-1,i,G.adjoint());
-            m_T.rightCols(dim-i+1).applyOnTheLeft(i-1,i,G.adjoint());
-            // update Q
-            if (m_computeQZ)
-              m_Q.applyOnTheRight(i-1,i,G);
-          }
-          // kill T(i,i-1)
-          if(!numext::is_exactly_zero(m_T.coeff(i, i - 1)))
-          {
-            G.makeGivens(m_T.coeff(i,i), m_T.coeff(i,i-1), &m_T.coeffRef(i,i));
-            m_T.coeffRef(i,i-1) = Scalar(0.0);
-            m_S.applyOnTheRight(i,i-1,G);
-            m_T.topRows(i).applyOnTheRight(i,i-1,G);
-            // update Z
-            if (m_computeQZ)
-              m_Z.applyOnTheLeft(i,i-1,G.adjoint());
-          }
-        }
-      }
-    }
-
-  /** \internal Computes vector L1 norms of S and T when in Hessenberg-Triangular form already */
-  template<typename MatrixType>
-    inline void RealQZ<MatrixType>::computeNorms()
-    {
-      const Index size = m_S.cols();
-      m_normOfS = Scalar(0.0);
-      m_normOfT = Scalar(0.0);
-      for (Index j = 0; j < size; ++j)
-      {
-        m_normOfS += m_S.col(j).segment(0, (std::min)(size,j+2)).cwiseAbs().sum();
-        m_normOfT += m_T.row(j).segment(j, size - j).cwiseAbs().sum();
-      }
-    }
-
-
-  /** \internal Look for single small sub-diagonal element S(res, res-1) and return res (or 0) */
-  template<typename MatrixType>
-    inline Index RealQZ<MatrixType>::findSmallSubdiagEntry(Index iu)
-    {
-      using std::abs;
-      Index res = iu;
-      while (res > 0)
-      {
-        Scalar s = abs(m_S.coeff(res-1,res-1)) + abs(m_S.coeff(res,res));
-        if (numext::is_exactly_zero(s))
-          s = m_normOfS;
-        if (abs(m_S.coeff(res,res-1)) < NumTraits<Scalar>::epsilon() * s)
-          break;
-        res--;
-      }
-      return res;
-    }
-
-  /** \internal Look for single small diagonal element T(res, res) for res between f and l, and return res (or f-1)  */
-  template<typename MatrixType>
-    inline Index RealQZ<MatrixType>::findSmallDiagEntry(Index f, Index l)
-    {
-      using std::abs;
-      Index res = l;
-      while (res >= f) {
-        if (abs(m_T.coeff(res,res)) <= NumTraits<Scalar>::epsilon() * m_normOfT)
-          break;
-        res--;
-      }
-      return res;
-    }
-
-  /** \internal decouple 2x2 diagonal block in rows i, i+1 if eigenvalues are real */
-  template<typename MatrixType>
-    inline void RealQZ<MatrixType>::splitOffTwoRows(Index i)
-    {
-      using std::abs;
-      using std::sqrt;
-      const Index dim=m_S.cols();
-      if (numext::is_exactly_zero(abs(m_S.coeff(i + 1, i))))
-        return;
-      Index j = findSmallDiagEntry(i,i+1);
-      if (j==i-1)
-      {
-        // block of (S T^{-1})
-        Matrix2s STi = m_T.template block<2,2>(i,i).template triangularView<Upper>().
-          template solve<OnTheRight>(m_S.template block<2,2>(i,i));
-        Scalar p = Scalar(0.5)*(STi(0,0)-STi(1,1));
-        Scalar q = p*p + STi(1,0)*STi(0,1);
-        if (q>=0) {
-          Scalar z = sqrt(q);
-          // one QR-like iteration for ABi - lambda I
-          // is enough - when we know exact eigenvalue in advance,
-          // convergence is immediate
-          JRs G;
-          if (p>=0)
-            G.makeGivens(p + z, STi(1,0));
-          else
-            G.makeGivens(p - z, STi(1,0));
-          m_S.rightCols(dim-i).applyOnTheLeft(i,i+1,G.adjoint());
-          m_T.rightCols(dim-i).applyOnTheLeft(i,i+1,G.adjoint());
-          // update Q
-          if (m_computeQZ)
-            m_Q.applyOnTheRight(i,i+1,G);
-
-          G.makeGivens(m_T.coeff(i+1,i+1), m_T.coeff(i+1,i));
-          m_S.topRows(i+2).applyOnTheRight(i+1,i,G);
-          m_T.topRows(i+2).applyOnTheRight(i+1,i,G);
-          // update Z
-          if (m_computeQZ)
-            m_Z.applyOnTheLeft(i+1,i,G.adjoint());
-
-          m_S.coeffRef(i+1,i) = Scalar(0.0);
-          m_T.coeffRef(i+1,i) = Scalar(0.0);
-        }
-      }
-      else
-      {
-        pushDownZero(j,i,i+1);
-      }
-    }
-
-  /** \internal use zero in T(z,z) to zero S(l,l-1), working in block f..l */
-  template<typename MatrixType>
-    inline void RealQZ<MatrixType>::pushDownZero(Index z, Index f, Index l)
-    {
+  // perform QR decomposition of T, overwrite T with R, save Q
+  HouseholderQR<MatrixType> qrT(m_T);
+  m_T = qrT.matrixQR();
+  m_T.template triangularView<StrictlyLower>().setZero();
+  m_Q = qrT.householderQ();
+  // overwrite S with Q* S
+  m_S.applyOnTheLeft(m_Q.adjoint());
+  // init Z as Identity
+  if (m_computeQZ) m_Z = MatrixType::Identity(dim, dim);
+  // reduce S to upper Hessenberg with Givens rotations
+  for (Index j = 0; j <= dim - 3; j++) {
+    for (Index i = dim - 1; i >= j + 2; i--) {
       JRs G;
-      const Index dim = m_S.cols();
-      for (Index zz=z; zz<l; zz++)
-      {
-        // push 0 down
-        Index firstColS = zz>f ? (zz-1) : zz;
-        G.makeGivens(m_T.coeff(zz, zz+1), m_T.coeff(zz+1, zz+1));
-        m_S.rightCols(dim-firstColS).applyOnTheLeft(zz,zz+1,G.adjoint());
-        m_T.rightCols(dim-zz).applyOnTheLeft(zz,zz+1,G.adjoint());
-        m_T.coeffRef(zz+1,zz+1) = Scalar(0.0);
+      // kill S(i,j)
+      if (!numext::is_exactly_zero(m_S.coeff(i, j))) {
+        G.makeGivens(m_S.coeff(i - 1, j), m_S.coeff(i, j), &m_S.coeffRef(i - 1, j));
+        m_S.coeffRef(i, j) = Scalar(0.0);
+        m_S.rightCols(dim - j - 1).applyOnTheLeft(i - 1, i, G.adjoint());
+        m_T.rightCols(dim - i + 1).applyOnTheLeft(i - 1, i, G.adjoint());
         // update Q
-        if (m_computeQZ)
-          m_Q.applyOnTheRight(zz,zz+1,G);
-        // kill S(zz+1, zz-1)
-        if (zz>f)
-        {
-          G.makeGivens(m_S.coeff(zz+1, zz), m_S.coeff(zz+1,zz-1));
-          m_S.topRows(zz+2).applyOnTheRight(zz, zz-1,G);
-          m_T.topRows(zz+1).applyOnTheRight(zz, zz-1,G);
-          m_S.coeffRef(zz+1,zz-1) = Scalar(0.0);
-          // update Z
-          if (m_computeQZ)
-            m_Z.applyOnTheLeft(zz,zz-1,G.adjoint());
-        }
+        if (m_computeQZ) m_Q.applyOnTheRight(i - 1, i, G);
       }
-      // finally kill S(l,l-1)
-      G.makeGivens(m_S.coeff(l,l), m_S.coeff(l,l-1));
-      m_S.applyOnTheRight(l,l-1,G);
-      m_T.applyOnTheRight(l,l-1,G);
-      m_S.coeffRef(l,l-1)=Scalar(0.0);
-      // update Z
-      if (m_computeQZ)
-        m_Z.applyOnTheLeft(l,l-1,G.adjoint());
-    }
-
-  /** \internal QR-like iterative step for block f..l */
-  template<typename MatrixType>
-    inline void RealQZ<MatrixType>::step(Index f, Index l, Index iter)
-    {
-      using std::abs;
-      const Index dim = m_S.cols();
-
-      // x, y, z
-      Scalar x, y, z;
-      if (iter==10)
-      {
-        // Wilkinson ad hoc shift
-        const Scalar
-          a11=m_S.coeff(f+0,f+0), a12=m_S.coeff(f+0,f+1),
-          a21=m_S.coeff(f+1,f+0), a22=m_S.coeff(f+1,f+1), a32=m_S.coeff(f+2,f+1),
-          b12=m_T.coeff(f+0,f+1),
-          b11i=Scalar(1.0)/m_T.coeff(f+0,f+0),
-          b22i=Scalar(1.0)/m_T.coeff(f+1,f+1),
-          a87=m_S.coeff(l-1,l-2),
-          a98=m_S.coeff(l-0,l-1),
-          b77i=Scalar(1.0)/m_T.coeff(l-2,l-2),
-          b88i=Scalar(1.0)/m_T.coeff(l-1,l-1);
-        Scalar ss = abs(a87*b77i) + abs(a98*b88i),
-               lpl = Scalar(1.5)*ss,
-               ll = ss*ss;
-        x = ll + a11*a11*b11i*b11i - lpl*a11*b11i + a12*a21*b11i*b22i
-          - a11*a21*b12*b11i*b11i*b22i;
-        y = a11*a21*b11i*b11i - lpl*a21*b11i + a21*a22*b11i*b22i 
-          - a21*a21*b12*b11i*b11i*b22i;
-        z = a21*a32*b11i*b22i;
-      }
-      else if (iter==16)
-      {
-        // another exceptional shift
-        x = m_S.coeff(f,f)/m_T.coeff(f,f)-m_S.coeff(l,l)/m_T.coeff(l,l) + m_S.coeff(l,l-1)*m_T.coeff(l-1,l) /
-          (m_T.coeff(l-1,l-1)*m_T.coeff(l,l));
-        y = m_S.coeff(f+1,f)/m_T.coeff(f,f);
-        z = 0;
-      }
-      else if (iter>23 && !(iter%8))
-      {
-        // extremely exceptional shift
-        x = internal::random<Scalar>(-1.0,1.0);
-        y = internal::random<Scalar>(-1.0,1.0);
-        z = internal::random<Scalar>(-1.0,1.0);
-      }
-      else
-      {
-        // Compute the shifts: (x,y,z,0...) = (AB^-1 - l1 I) (AB^-1 - l2 I) e1
-        // where l1 and l2 are the eigenvalues of the 2x2 matrix C = U V^-1 where
-        // U and V are 2x2 bottom right sub matrices of A and B. Thus:
-        //  = AB^-1AB^-1 + l1 l2 I - (l1+l2)(AB^-1)
-        //  = AB^-1AB^-1 + det(M) - tr(M)(AB^-1)
-        // Since we are only interested in having x, y, z with a correct ratio, we have:
-        const Scalar
-          a11 = m_S.coeff(f,f),     a12 = m_S.coeff(f,f+1),
-          a21 = m_S.coeff(f+1,f),   a22 = m_S.coeff(f+1,f+1),
-                                    a32 = m_S.coeff(f+2,f+1),
-
-          a88 = m_S.coeff(l-1,l-1), a89 = m_S.coeff(l-1,l),
-          a98 = m_S.coeff(l,l-1),   a99 = m_S.coeff(l,l),
-
-          b11 = m_T.coeff(f,f),     b12 = m_T.coeff(f,f+1),
-                                    b22 = m_T.coeff(f+1,f+1),
-
-          b88 = m_T.coeff(l-1,l-1), b89 = m_T.coeff(l-1,l),
-                                    b99 = m_T.coeff(l,l);
-
-        x = ( (a88/b88 - a11/b11)*(a99/b99 - a11/b11) - (a89/b99)*(a98/b88) + (a98/b88)*(b89/b99)*(a11/b11) ) * (b11/a21)
-          + a12/b22 - (a11/b11)*(b12/b22);
-        y = (a22/b22-a11/b11) - (a21/b11)*(b12/b22) - (a88/b88-a11/b11) - (a99/b99-a11/b11) + (a98/b88)*(b89/b99);
-        z = a32/b22;
-      }
-
-      JRs G;
-
-      for (Index k=f; k<=l-2; k++)
-      {
-        // variables for Householder reflections
-        Vector2s essential2;
-        Scalar tau, beta;
-
-        Vector3s hr(x,y,z);
-
-        // Q_k to annihilate S(k+1,k-1) and S(k+2,k-1)
-        hr.makeHouseholderInPlace(tau, beta);
-        essential2 = hr.template bottomRows<2>();
-        Index fc=(std::max)(k-1,Index(0));  // first col to update
-        m_S.template middleRows<3>(k).rightCols(dim-fc).applyHouseholderOnTheLeft(essential2, tau, m_workspace.data());
-        m_T.template middleRows<3>(k).rightCols(dim-fc).applyHouseholderOnTheLeft(essential2, tau, m_workspace.data());
-        if (m_computeQZ)
-          m_Q.template middleCols<3>(k).applyHouseholderOnTheRight(essential2, tau, m_workspace.data());
-        if (k>f)
-          m_S.coeffRef(k+2,k-1) = m_S.coeffRef(k+1,k-1) = Scalar(0.0);
-
-        // Z_{k1} to annihilate T(k+2,k+1) and T(k+2,k)
-        hr << m_T.coeff(k+2,k+2),m_T.coeff(k+2,k),m_T.coeff(k+2,k+1);
-        hr.makeHouseholderInPlace(tau, beta);
-        essential2 = hr.template bottomRows<2>();
-        {
-          Index lr = (std::min)(k+4,dim); // last row to update
-          Map<Matrix<Scalar,Dynamic,1> > tmp(m_workspace.data(),lr);
-          // S
-          tmp = m_S.template middleCols<2>(k).topRows(lr) * essential2;
-          tmp += m_S.col(k+2).head(lr);
-          m_S.col(k+2).head(lr) -= tau*tmp;
-          m_S.template middleCols<2>(k).topRows(lr) -= (tau*tmp) * essential2.adjoint();
-          // T
-          tmp = m_T.template middleCols<2>(k).topRows(lr) * essential2;
-          tmp += m_T.col(k+2).head(lr);
-          m_T.col(k+2).head(lr) -= tau*tmp;
-          m_T.template middleCols<2>(k).topRows(lr) -= (tau*tmp) * essential2.adjoint();
-        }
-        if (m_computeQZ)
-        {
-          // Z
-          Map<Matrix<Scalar,1,Dynamic> > tmp(m_workspace.data(),dim);
-          tmp = essential2.adjoint()*(m_Z.template middleRows<2>(k));
-          tmp += m_Z.row(k+2);
-          m_Z.row(k+2) -= tau*tmp;
-          m_Z.template middleRows<2>(k) -= essential2 * (tau*tmp);
-        }
-        m_T.coeffRef(k+2,k) = m_T.coeffRef(k+2,k+1) = Scalar(0.0);
-
-        // Z_{k2} to annihilate T(k+1,k)
-        G.makeGivens(m_T.coeff(k+1,k+1), m_T.coeff(k+1,k));
-        m_S.applyOnTheRight(k+1,k,G);
-        m_T.applyOnTheRight(k+1,k,G);
+      // kill T(i,i-1)
+      if (!numext::is_exactly_zero(m_T.coeff(i, i - 1))) {
+        G.makeGivens(m_T.coeff(i, i), m_T.coeff(i, i - 1), &m_T.coeffRef(i, i));
+        m_T.coeffRef(i, i - 1) = Scalar(0.0);
+        m_S.applyOnTheRight(i, i - 1, G);
+        m_T.topRows(i).applyOnTheRight(i, i - 1, G);
         // update Z
-        if (m_computeQZ)
-          m_Z.applyOnTheLeft(k+1,k,G.adjoint());
-        m_T.coeffRef(k+1,k) = Scalar(0.0);
-
-        // update x,y,z
-        x = m_S.coeff(k+1,k);
-        y = m_S.coeff(k+2,k);
-        if (k < l-2)
-          z = m_S.coeff(k+3,k);
-      } // loop over k
-
-      // Q_{n-1} to annihilate y = S(l,l-2)
-      G.makeGivens(x,y);
-      m_S.applyOnTheLeft(l-1,l,G.adjoint());
-      m_T.applyOnTheLeft(l-1,l,G.adjoint());
-      if (m_computeQZ)
-        m_Q.applyOnTheRight(l-1,l,G);
-      m_S.coeffRef(l,l-2) = Scalar(0.0);
-
-      // Z_{n-1} to annihilate T(l,l-1)
-      G.makeGivens(m_T.coeff(l,l),m_T.coeff(l,l-1));
-      m_S.applyOnTheRight(l,l-1,G);
-      m_T.applyOnTheRight(l,l-1,G);
-      if (m_computeQZ)
-        m_Z.applyOnTheLeft(l,l-1,G.adjoint());
-      m_T.coeffRef(l,l-1) = Scalar(0.0);
+        if (m_computeQZ) m_Z.applyOnTheLeft(i, i - 1, G.adjoint());
+      }
     }
+  }
+}
 
-  template<typename MatrixType>
-    RealQZ<MatrixType>& RealQZ<MatrixType>::compute(const MatrixType& A_in, const MatrixType& B_in, bool computeQZ)
+/** \internal Computes vector L1 norms of S and T when in Hessenberg-Triangular form already */
+template <typename MatrixType>
+inline void RealQZ<MatrixType>::computeNorms() {
+  const Index size = m_S.cols();
+  m_normOfS = Scalar(0.0);
+  m_normOfT = Scalar(0.0);
+  for (Index j = 0; j < size; ++j) {
+    m_normOfS += m_S.col(j).segment(0, (std::min)(size, j + 2)).cwiseAbs().sum();
+    m_normOfT += m_T.row(j).segment(j, size - j).cwiseAbs().sum();
+  }
+}
+
+/** \internal Look for single small sub-diagonal element S(res, res-1) and return res (or 0) */
+template <typename MatrixType>
+inline Index RealQZ<MatrixType>::findSmallSubdiagEntry(Index iu) {
+  using std::abs;
+  Index res = iu;
+  while (res > 0) {
+    Scalar s = abs(m_S.coeff(res - 1, res - 1)) + abs(m_S.coeff(res, res));
+    if (numext::is_exactly_zero(s)) s = m_normOfS;
+    if (abs(m_S.coeff(res, res - 1)) < NumTraits<Scalar>::epsilon() * s) break;
+    res--;
+  }
+  return res;
+}
+
+/** \internal Look for single small diagonal element T(res, res) for res between f and l, and return res (or f-1)  */
+template <typename MatrixType>
+inline Index RealQZ<MatrixType>::findSmallDiagEntry(Index f, Index l) {
+  using std::abs;
+  Index res = l;
+  while (res >= f) {
+    if (abs(m_T.coeff(res, res)) <= NumTraits<Scalar>::epsilon() * m_normOfT) break;
+    res--;
+  }
+  return res;
+}
+
+/** \internal decouple 2x2 diagonal block in rows i, i+1 if eigenvalues are real */
+template <typename MatrixType>
+inline void RealQZ<MatrixType>::splitOffTwoRows(Index i) {
+  using std::abs;
+  using std::sqrt;
+  const Index dim = m_S.cols();
+  if (numext::is_exactly_zero(abs(m_S.coeff(i + 1, i)))) return;
+  Index j = findSmallDiagEntry(i, i + 1);
+  if (j == i - 1) {
+    // block of (S T^{-1})
+    Matrix2s STi = m_T.template block<2, 2>(i, i).template triangularView<Upper>().template solve<OnTheRight>(
+        m_S.template block<2, 2>(i, i));
+    Scalar p = Scalar(0.5) * (STi(0, 0) - STi(1, 1));
+    Scalar q = p * p + STi(1, 0) * STi(0, 1);
+    if (q >= 0) {
+      Scalar z = sqrt(q);
+      // one QR-like iteration for ABi - lambda I
+      // is enough - when we know exact eigenvalue in advance,
+      // convergence is immediate
+      JRs G;
+      if (p >= 0)
+        G.makeGivens(p + z, STi(1, 0));
+      else
+        G.makeGivens(p - z, STi(1, 0));
+      m_S.rightCols(dim - i).applyOnTheLeft(i, i + 1, G.adjoint());
+      m_T.rightCols(dim - i).applyOnTheLeft(i, i + 1, G.adjoint());
+      // update Q
+      if (m_computeQZ) m_Q.applyOnTheRight(i, i + 1, G);
+
+      G.makeGivens(m_T.coeff(i + 1, i + 1), m_T.coeff(i + 1, i));
+      m_S.topRows(i + 2).applyOnTheRight(i + 1, i, G);
+      m_T.topRows(i + 2).applyOnTheRight(i + 1, i, G);
+      // update Z
+      if (m_computeQZ) m_Z.applyOnTheLeft(i + 1, i, G.adjoint());
+
+      m_S.coeffRef(i + 1, i) = Scalar(0.0);
+      m_T.coeffRef(i + 1, i) = Scalar(0.0);
+    }
+  } else {
+    pushDownZero(j, i, i + 1);
+  }
+}
+
+/** \internal use zero in T(z,z) to zero S(l,l-1), working in block f..l */
+template <typename MatrixType>
+inline void RealQZ<MatrixType>::pushDownZero(Index z, Index f, Index l) {
+  JRs G;
+  const Index dim = m_S.cols();
+  for (Index zz = z; zz < l; zz++) {
+    // push 0 down
+    Index firstColS = zz > f ? (zz - 1) : zz;
+    G.makeGivens(m_T.coeff(zz, zz + 1), m_T.coeff(zz + 1, zz + 1));
+    m_S.rightCols(dim - firstColS).applyOnTheLeft(zz, zz + 1, G.adjoint());
+    m_T.rightCols(dim - zz).applyOnTheLeft(zz, zz + 1, G.adjoint());
+    m_T.coeffRef(zz + 1, zz + 1) = Scalar(0.0);
+    // update Q
+    if (m_computeQZ) m_Q.applyOnTheRight(zz, zz + 1, G);
+    // kill S(zz+1, zz-1)
+    if (zz > f) {
+      G.makeGivens(m_S.coeff(zz + 1, zz), m_S.coeff(zz + 1, zz - 1));
+      m_S.topRows(zz + 2).applyOnTheRight(zz, zz - 1, G);
+      m_T.topRows(zz + 1).applyOnTheRight(zz, zz - 1, G);
+      m_S.coeffRef(zz + 1, zz - 1) = Scalar(0.0);
+      // update Z
+      if (m_computeQZ) m_Z.applyOnTheLeft(zz, zz - 1, G.adjoint());
+    }
+  }
+  // finally kill S(l,l-1)
+  G.makeGivens(m_S.coeff(l, l), m_S.coeff(l, l - 1));
+  m_S.applyOnTheRight(l, l - 1, G);
+  m_T.applyOnTheRight(l, l - 1, G);
+  m_S.coeffRef(l, l - 1) = Scalar(0.0);
+  // update Z
+  if (m_computeQZ) m_Z.applyOnTheLeft(l, l - 1, G.adjoint());
+}
+
+/** \internal QR-like iterative step for block f..l */
+template <typename MatrixType>
+inline void RealQZ<MatrixType>::step(Index f, Index l, Index iter) {
+  using std::abs;
+  const Index dim = m_S.cols();
+
+  // x, y, z
+  Scalar x, y, z;
+  if (iter == 10) {
+    // Wilkinson ad hoc shift
+    const Scalar a11 = m_S.coeff(f + 0, f + 0), a12 = m_S.coeff(f + 0, f + 1), a21 = m_S.coeff(f + 1, f + 0),
+                 a22 = m_S.coeff(f + 1, f + 1), a32 = m_S.coeff(f + 2, f + 1), b12 = m_T.coeff(f + 0, f + 1),
+                 b11i = Scalar(1.0) / m_T.coeff(f + 0, f + 0), b22i = Scalar(1.0) / m_T.coeff(f + 1, f + 1),
+                 a87 = m_S.coeff(l - 1, l - 2), a98 = m_S.coeff(l - 0, l - 1),
+                 b77i = Scalar(1.0) / m_T.coeff(l - 2, l - 2), b88i = Scalar(1.0) / m_T.coeff(l - 1, l - 1);
+    Scalar ss = abs(a87 * b77i) + abs(a98 * b88i), lpl = Scalar(1.5) * ss, ll = ss * ss;
+    x = ll + a11 * a11 * b11i * b11i - lpl * a11 * b11i + a12 * a21 * b11i * b22i -
+        a11 * a21 * b12 * b11i * b11i * b22i;
+    y = a11 * a21 * b11i * b11i - lpl * a21 * b11i + a21 * a22 * b11i * b22i - a21 * a21 * b12 * b11i * b11i * b22i;
+    z = a21 * a32 * b11i * b22i;
+  } else if (iter == 16) {
+    // another exceptional shift
+    x = m_S.coeff(f, f) / m_T.coeff(f, f) - m_S.coeff(l, l) / m_T.coeff(l, l) +
+        m_S.coeff(l, l - 1) * m_T.coeff(l - 1, l) / (m_T.coeff(l - 1, l - 1) * m_T.coeff(l, l));
+    y = m_S.coeff(f + 1, f) / m_T.coeff(f, f);
+    z = 0;
+  } else if (iter > 23 && !(iter % 8)) {
+    // extremely exceptional shift
+    x = internal::random<Scalar>(-1.0, 1.0);
+    y = internal::random<Scalar>(-1.0, 1.0);
+    z = internal::random<Scalar>(-1.0, 1.0);
+  } else {
+    // Compute the shifts: (x,y,z,0...) = (AB^-1 - l1 I) (AB^-1 - l2 I) e1
+    // where l1 and l2 are the eigenvalues of the 2x2 matrix C = U V^-1 where
+    // U and V are 2x2 bottom right sub matrices of A and B. Thus:
+    //  = AB^-1AB^-1 + l1 l2 I - (l1+l2)(AB^-1)
+    //  = AB^-1AB^-1 + det(M) - tr(M)(AB^-1)
+    // Since we are only interested in having x, y, z with a correct ratio, we have:
+    const Scalar a11 = m_S.coeff(f, f), a12 = m_S.coeff(f, f + 1), a21 = m_S.coeff(f + 1, f),
+                 a22 = m_S.coeff(f + 1, f + 1), a32 = m_S.coeff(f + 2, f + 1),
+
+                 a88 = m_S.coeff(l - 1, l - 1), a89 = m_S.coeff(l - 1, l), a98 = m_S.coeff(l, l - 1),
+                 a99 = m_S.coeff(l, l),
+
+                 b11 = m_T.coeff(f, f), b12 = m_T.coeff(f, f + 1), b22 = m_T.coeff(f + 1, f + 1),
+
+                 b88 = m_T.coeff(l - 1, l - 1), b89 = m_T.coeff(l - 1, l), b99 = m_T.coeff(l, l);
+
+    x = ((a88 / b88 - a11 / b11) * (a99 / b99 - a11 / b11) - (a89 / b99) * (a98 / b88) +
+         (a98 / b88) * (b89 / b99) * (a11 / b11)) *
+            (b11 / a21) +
+        a12 / b22 - (a11 / b11) * (b12 / b22);
+    y = (a22 / b22 - a11 / b11) - (a21 / b11) * (b12 / b22) - (a88 / b88 - a11 / b11) - (a99 / b99 - a11 / b11) +
+        (a98 / b88) * (b89 / b99);
+    z = a32 / b22;
+  }
+
+  JRs G;
+
+  for (Index k = f; k <= l - 2; k++) {
+    // variables for Householder reflections
+    Vector2s essential2;
+    Scalar tau, beta;
+
+    Vector3s hr(x, y, z);
+
+    // Q_k to annihilate S(k+1,k-1) and S(k+2,k-1)
+    hr.makeHouseholderInPlace(tau, beta);
+    essential2 = hr.template bottomRows<2>();
+    Index fc = (std::max)(k - 1, Index(0));  // first col to update
+    m_S.template middleRows<3>(k).rightCols(dim - fc).applyHouseholderOnTheLeft(essential2, tau, m_workspace.data());
+    m_T.template middleRows<3>(k).rightCols(dim - fc).applyHouseholderOnTheLeft(essential2, tau, m_workspace.data());
+    if (m_computeQZ) m_Q.template middleCols<3>(k).applyHouseholderOnTheRight(essential2, tau, m_workspace.data());
+    if (k > f) m_S.coeffRef(k + 2, k - 1) = m_S.coeffRef(k + 1, k - 1) = Scalar(0.0);
+
+    // Z_{k1} to annihilate T(k+2,k+1) and T(k+2,k)
+    hr << m_T.coeff(k + 2, k + 2), m_T.coeff(k + 2, k), m_T.coeff(k + 2, k + 1);
+    hr.makeHouseholderInPlace(tau, beta);
+    essential2 = hr.template bottomRows<2>();
     {
+      Index lr = (std::min)(k + 4, dim);  // last row to update
+      Map<Matrix<Scalar, Dynamic, 1> > tmp(m_workspace.data(), lr);
+      // S
+      tmp = m_S.template middleCols<2>(k).topRows(lr) * essential2;
+      tmp += m_S.col(k + 2).head(lr);
+      m_S.col(k + 2).head(lr) -= tau * tmp;
+      m_S.template middleCols<2>(k).topRows(lr) -= (tau * tmp) * essential2.adjoint();
+      // T
+      tmp = m_T.template middleCols<2>(k).topRows(lr) * essential2;
+      tmp += m_T.col(k + 2).head(lr);
+      m_T.col(k + 2).head(lr) -= tau * tmp;
+      m_T.template middleCols<2>(k).topRows(lr) -= (tau * tmp) * essential2.adjoint();
+    }
+    if (m_computeQZ) {
+      // Z
+      Map<Matrix<Scalar, 1, Dynamic> > tmp(m_workspace.data(), dim);
+      tmp = essential2.adjoint() * (m_Z.template middleRows<2>(k));
+      tmp += m_Z.row(k + 2);
+      m_Z.row(k + 2) -= tau * tmp;
+      m_Z.template middleRows<2>(k) -= essential2 * (tau * tmp);
+    }
+    m_T.coeffRef(k + 2, k) = m_T.coeffRef(k + 2, k + 1) = Scalar(0.0);
 
-      const Index dim = A_in.cols();
+    // Z_{k2} to annihilate T(k+1,k)
+    G.makeGivens(m_T.coeff(k + 1, k + 1), m_T.coeff(k + 1, k));
+    m_S.applyOnTheRight(k + 1, k, G);
+    m_T.applyOnTheRight(k + 1, k, G);
+    // update Z
+    if (m_computeQZ) m_Z.applyOnTheLeft(k + 1, k, G.adjoint());
+    m_T.coeffRef(k + 1, k) = Scalar(0.0);
 
-      eigen_assert (A_in.rows()==dim && A_in.cols()==dim 
-          && B_in.rows()==dim && B_in.cols()==dim 
-          && "Need square matrices of the same dimension");
+    // update x,y,z
+    x = m_S.coeff(k + 1, k);
+    y = m_S.coeff(k + 2, k);
+    if (k < l - 2) z = m_S.coeff(k + 3, k);
+  }  // loop over k
 
-      m_isInitialized = true;
-      m_computeQZ = computeQZ;
-      m_S = A_in; m_T = B_in;
-      m_workspace.resize(dim*2);
-      m_global_iter = 0;
+  // Q_{n-1} to annihilate y = S(l,l-2)
+  G.makeGivens(x, y);
+  m_S.applyOnTheLeft(l - 1, l, G.adjoint());
+  m_T.applyOnTheLeft(l - 1, l, G.adjoint());
+  if (m_computeQZ) m_Q.applyOnTheRight(l - 1, l, G);
+  m_S.coeffRef(l, l - 2) = Scalar(0.0);
 
-      // entrance point: hessenberg triangular decomposition
-      hessenbergTriangular();
-      // compute L1 vector norms of T, S into m_normOfS, m_normOfT
-      computeNorms();
+  // Z_{n-1} to annihilate T(l,l-1)
+  G.makeGivens(m_T.coeff(l, l), m_T.coeff(l, l - 1));
+  m_S.applyOnTheRight(l, l - 1, G);
+  m_T.applyOnTheRight(l, l - 1, G);
+  if (m_computeQZ) m_Z.applyOnTheLeft(l, l - 1, G.adjoint());
+  m_T.coeffRef(l, l - 1) = Scalar(0.0);
+}
 
-      Index l = dim-1, 
-            f, 
-            local_iter = 0;
+template <typename MatrixType>
+RealQZ<MatrixType>& RealQZ<MatrixType>::compute(const MatrixType& A_in, const MatrixType& B_in, bool computeQZ) {
+  const Index dim = A_in.cols();
 
-      while (l>0 && local_iter<m_maxIters)
-      {
-        f = findSmallSubdiagEntry(l);
-        // now rows and columns f..l (including) decouple from the rest of the problem
-        if (f>0) m_S.coeffRef(f,f-1) = Scalar(0.0);
-        if (f == l) // One root found
-        {
-          l--;
-          local_iter = 0;
-        }
-        else if (f == l-1) // Two roots found
-        {
-          splitOffTwoRows(f);
-          l -= 2;
-          local_iter = 0;
-        }
-        else // No convergence yet
-        {
-          // if there's zero on diagonal of T, we can isolate an eigenvalue with Givens rotations
-          Index z = findSmallDiagEntry(f,l);
-          if (z>=f)
-          {
-            // zero found
-            pushDownZero(z,f,l);
-          }
-          else
-          {
-            // We are sure now that S.block(f,f, l-f+1,l-f+1) is underuced upper-Hessenberg 
-            // and T.block(f,f, l-f+1,l-f+1) is invertible uper-triangular, which allows to
-            // apply a QR-like iteration to rows and columns f..l.
-            step(f,l, local_iter);
-            local_iter++;
-            m_global_iter++;
-          }
-        }
+  eigen_assert(A_in.rows() == dim && A_in.cols() == dim && B_in.rows() == dim && B_in.cols() == dim &&
+               "Need square matrices of the same dimension");
+
+  m_isInitialized = true;
+  m_computeQZ = computeQZ;
+  m_S = A_in;
+  m_T = B_in;
+  m_workspace.resize(dim * 2);
+  m_global_iter = 0;
+
+  // entrance point: hessenberg triangular decomposition
+  hessenbergTriangular();
+  // compute L1 vector norms of T, S into m_normOfS, m_normOfT
+  computeNorms();
+
+  Index l = dim - 1, f, local_iter = 0;
+
+  while (l > 0 && local_iter < m_maxIters) {
+    f = findSmallSubdiagEntry(l);
+    // now rows and columns f..l (including) decouple from the rest of the problem
+    if (f > 0) m_S.coeffRef(f, f - 1) = Scalar(0.0);
+    if (f == l)  // One root found
+    {
+      l--;
+      local_iter = 0;
+    } else if (f == l - 1)  // Two roots found
+    {
+      splitOffTwoRows(f);
+      l -= 2;
+      local_iter = 0;
+    } else  // No convergence yet
+    {
+      // if there's zero on diagonal of T, we can isolate an eigenvalue with Givens rotations
+      Index z = findSmallDiagEntry(f, l);
+      if (z >= f) {
+        // zero found
+        pushDownZero(z, f, l);
+      } else {
+        // We are sure now that S.block(f,f, l-f+1,l-f+1) is underuced upper-Hessenberg
+        // and T.block(f,f, l-f+1,l-f+1) is invertible uper-triangular, which allows to
+        // apply a QR-like iteration to rows and columns f..l.
+        step(f, l, local_iter);
+        local_iter++;
+        m_global_iter++;
       }
-      // check if we converged before reaching iterations limit
-      m_info = (local_iter<m_maxIters) ? Success : NoConvergence;
+    }
+  }
+  // check if we converged before reaching iterations limit
+  m_info = (local_iter < m_maxIters) ? Success : NoConvergence;
 
-      // For each non triangular 2x2 diagonal block of S,
-      //    reduce the respective 2x2 diagonal block of T to positive diagonal form using 2x2 SVD.
-      // This step is not mandatory for QZ, but it does help further extraction of eigenvalues/eigenvectors,
-      // and is in par with Lapack/Matlab QZ.
-      if(m_info==Success)
-      {
-        for(Index i=0; i<dim-1; ++i)
-        {
-          if(!numext::is_exactly_zero(m_S.coeff(i + 1, i)))
-          {
-            JacobiRotation<Scalar> j_left, j_right;
-            internal::real_2x2_jacobi_svd(m_T, i, i+1, &j_left, &j_right);
+  // For each non triangular 2x2 diagonal block of S,
+  //    reduce the respective 2x2 diagonal block of T to positive diagonal form using 2x2 SVD.
+  // This step is not mandatory for QZ, but it does help further extraction of eigenvalues/eigenvectors,
+  // and is in par with Lapack/Matlab QZ.
+  if (m_info == Success) {
+    for (Index i = 0; i < dim - 1; ++i) {
+      if (!numext::is_exactly_zero(m_S.coeff(i + 1, i))) {
+        JacobiRotation<Scalar> j_left, j_right;
+        internal::real_2x2_jacobi_svd(m_T, i, i + 1, &j_left, &j_right);
 
-            // Apply resulting Jacobi rotations
-            m_S.applyOnTheLeft(i,i+1,j_left);
-            m_S.applyOnTheRight(i,i+1,j_right);
-            m_T.applyOnTheLeft(i,i+1,j_left);
-            m_T.applyOnTheRight(i,i+1,j_right);
-            m_T(i+1,i) = m_T(i,i+1) = Scalar(0);
+        // Apply resulting Jacobi rotations
+        m_S.applyOnTheLeft(i, i + 1, j_left);
+        m_S.applyOnTheRight(i, i + 1, j_right);
+        m_T.applyOnTheLeft(i, i + 1, j_left);
+        m_T.applyOnTheRight(i, i + 1, j_right);
+        m_T(i + 1, i) = m_T(i, i + 1) = Scalar(0);
 
-            if(m_computeQZ) {
-              m_Q.applyOnTheRight(i,i+1,j_left.transpose());
-              m_Z.applyOnTheLeft(i,i+1,j_right.transpose());
-            }
-
-            i++;
-          }
+        if (m_computeQZ) {
+          m_Q.applyOnTheRight(i, i + 1, j_left.transpose());
+          m_Z.applyOnTheLeft(i, i + 1, j_right.transpose());
         }
+
+        i++;
       }
+    }
+  }
 
-      return *this;
-    } // end compute
+  return *this;
+}  // end compute
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif //EIGEN_REAL_QZ
+#endif  // EIGEN_REAL_QZ
diff --git a/Eigen/src/Eigenvalues/RealSchur.h b/Eigen/src/Eigenvalues/RealSchur.h
index 12850cb..1ac9af8 100644
--- a/Eigen/src/Eigenvalues/RealSchur.h
+++ b/Eigen/src/Eigenvalues/RealSchur.h
@@ -16,254 +16,240 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 /** \eigenvalues_module \ingroup Eigenvalues_Module
-  *
-  *
-  * \class RealSchur
-  *
-  * \brief Performs a real Schur decomposition of a square matrix
-  *
-  * \tparam MatrixType_ the type of the matrix of which we are computing the
-  * real Schur decomposition; this is expected to be an instantiation of the
-  * Matrix class template.
-  *
-  * Given a real square matrix A, this class computes the real Schur
-  * decomposition: \f$ A = U T U^T \f$ where U is a real orthogonal matrix and
-  * T is a real quasi-triangular matrix. An orthogonal matrix is a matrix whose
-  * inverse is equal to its transpose, \f$ U^{-1} = U^T \f$. A quasi-triangular
-  * matrix is a block-triangular matrix whose diagonal consists of 1-by-1
-  * blocks and 2-by-2 blocks with complex eigenvalues. The eigenvalues of the
-  * blocks on the diagonal of T are the same as the eigenvalues of the matrix
-  * A, and thus the real Schur decomposition is used in EigenSolver to compute
-  * the eigendecomposition of a matrix.
-  *
-  * Call the function compute() to compute the real Schur decomposition of a
-  * given matrix. Alternatively, you can use the RealSchur(const MatrixType&, bool)
-  * constructor which computes the real Schur decomposition at construction
-  * time. Once the decomposition is computed, you can use the matrixU() and
-  * matrixT() functions to retrieve the matrices U and T in the decomposition.
-  *
-  * The documentation of RealSchur(const MatrixType&, bool) contains an example
-  * of the typical use of this class.
-  *
-  * \note The implementation is adapted from
-  * <a href="http://math.nist.gov/javanumerics/jama/">JAMA</a> (public domain).
-  * Their code is based on EISPACK.
-  *
-  * \sa class ComplexSchur, class EigenSolver, class ComplexEigenSolver
-  */
-template<typename MatrixType_> class RealSchur
-{
-  public:
-    typedef MatrixType_ MatrixType;
-    enum {
-      RowsAtCompileTime = MatrixType::RowsAtCompileTime,
-      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
-      Options = MatrixType::Options,
-      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
-      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
-    };
-    typedef typename MatrixType::Scalar Scalar;
-    typedef std::complex<typename NumTraits<Scalar>::Real> ComplexScalar;
-    typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3
+ *
+ *
+ * \class RealSchur
+ *
+ * \brief Performs a real Schur decomposition of a square matrix
+ *
+ * \tparam MatrixType_ the type of the matrix of which we are computing the
+ * real Schur decomposition; this is expected to be an instantiation of the
+ * Matrix class template.
+ *
+ * Given a real square matrix A, this class computes the real Schur
+ * decomposition: \f$ A = U T U^T \f$ where U is a real orthogonal matrix and
+ * T is a real quasi-triangular matrix. An orthogonal matrix is a matrix whose
+ * inverse is equal to its transpose, \f$ U^{-1} = U^T \f$. A quasi-triangular
+ * matrix is a block-triangular matrix whose diagonal consists of 1-by-1
+ * blocks and 2-by-2 blocks with complex eigenvalues. The eigenvalues of the
+ * blocks on the diagonal of T are the same as the eigenvalues of the matrix
+ * A, and thus the real Schur decomposition is used in EigenSolver to compute
+ * the eigendecomposition of a matrix.
+ *
+ * Call the function compute() to compute the real Schur decomposition of a
+ * given matrix. Alternatively, you can use the RealSchur(const MatrixType&, bool)
+ * constructor which computes the real Schur decomposition at construction
+ * time. Once the decomposition is computed, you can use the matrixU() and
+ * matrixT() functions to retrieve the matrices U and T in the decomposition.
+ *
+ * The documentation of RealSchur(const MatrixType&, bool) contains an example
+ * of the typical use of this class.
+ *
+ * \note The implementation is adapted from
+ * <a href="http://math.nist.gov/javanumerics/jama/">JAMA</a> (public domain).
+ * Their code is based on EISPACK.
+ *
+ * \sa class ComplexSchur, class EigenSolver, class ComplexEigenSolver
+ */
+template <typename MatrixType_>
+class RealSchur {
+ public:
+  typedef MatrixType_ MatrixType;
+  enum {
+    RowsAtCompileTime = MatrixType::RowsAtCompileTime,
+    ColsAtCompileTime = MatrixType::ColsAtCompileTime,
+    Options = MatrixType::Options,
+    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
+  };
+  typedef typename MatrixType::Scalar Scalar;
+  typedef std::complex<typename NumTraits<Scalar>::Real> ComplexScalar;
+  typedef Eigen::Index Index;  ///< \deprecated since Eigen 3.3
 
-    typedef Matrix<ComplexScalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> EigenvalueType;
-    typedef Matrix<Scalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> ColumnVectorType;
+  typedef Matrix<ComplexScalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> EigenvalueType;
+  typedef Matrix<Scalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> ColumnVectorType;
 
-    /** \brief Default constructor.
-      *
-      * \param [in] size  Positive integer, size of the matrix whose Schur decomposition will be computed.
-      *
-      * The default constructor is useful in cases in which the user intends to
-      * perform decompositions via compute().  The \p size parameter is only
-      * used as a hint. It is not an error to give a wrong \p size, but it may
-      * impair performance.
-      *
-      * \sa compute() for an example.
-      */
-    explicit RealSchur(Index size = RowsAtCompileTime==Dynamic ? 1 : RowsAtCompileTime)
-            : m_matT(size, size),
-              m_matU(size, size),
-              m_workspaceVector(size),
-              m_hess(size),
-              m_isInitialized(false),
-              m_matUisUptodate(false),
-              m_maxIters(-1)
-    { }
+  /** \brief Default constructor.
+   *
+   * \param [in] size  Positive integer, size of the matrix whose Schur decomposition will be computed.
+   *
+   * The default constructor is useful in cases in which the user intends to
+   * perform decompositions via compute().  The \p size parameter is only
+   * used as a hint. It is not an error to give a wrong \p size, but it may
+   * impair performance.
+   *
+   * \sa compute() for an example.
+   */
+  explicit RealSchur(Index size = RowsAtCompileTime == Dynamic ? 1 : RowsAtCompileTime)
+      : m_matT(size, size),
+        m_matU(size, size),
+        m_workspaceVector(size),
+        m_hess(size),
+        m_isInitialized(false),
+        m_matUisUptodate(false),
+        m_maxIters(-1) {}
 
-    /** \brief Constructor; computes real Schur decomposition of given matrix. 
-      * 
-      * \param[in]  matrix    Square matrix whose Schur decomposition is to be computed.
-      * \param[in]  computeU  If true, both T and U are computed; if false, only T is computed.
-      *
-      * This constructor calls compute() to compute the Schur decomposition.
-      *
-      * Example: \include RealSchur_RealSchur_MatrixType.cpp
-      * Output: \verbinclude RealSchur_RealSchur_MatrixType.out
-      */
-    template<typename InputType>
-    explicit RealSchur(const EigenBase<InputType>& matrix, bool computeU = true)
-            : m_matT(matrix.rows(),matrix.cols()),
-              m_matU(matrix.rows(),matrix.cols()),
-              m_workspaceVector(matrix.rows()),
-              m_hess(matrix.rows()),
-              m_isInitialized(false),
-              m_matUisUptodate(false),
-              m_maxIters(-1)
-    {
-      compute(matrix.derived(), computeU);
-    }
+  /** \brief Constructor; computes real Schur decomposition of given matrix.
+   *
+   * \param[in]  matrix    Square matrix whose Schur decomposition is to be computed.
+   * \param[in]  computeU  If true, both T and U are computed; if false, only T is computed.
+   *
+   * This constructor calls compute() to compute the Schur decomposition.
+   *
+   * Example: \include RealSchur_RealSchur_MatrixType.cpp
+   * Output: \verbinclude RealSchur_RealSchur_MatrixType.out
+   */
+  template <typename InputType>
+  explicit RealSchur(const EigenBase<InputType>& matrix, bool computeU = true)
+      : m_matT(matrix.rows(), matrix.cols()),
+        m_matU(matrix.rows(), matrix.cols()),
+        m_workspaceVector(matrix.rows()),
+        m_hess(matrix.rows()),
+        m_isInitialized(false),
+        m_matUisUptodate(false),
+        m_maxIters(-1) {
+    compute(matrix.derived(), computeU);
+  }
 
-    /** \brief Returns the orthogonal matrix in the Schur decomposition. 
-      *
-      * \returns A const reference to the matrix U.
-      *
-      * \pre Either the constructor RealSchur(const MatrixType&, bool) or the
-      * member function compute(const MatrixType&, bool) has been called before
-      * to compute the Schur decomposition of a matrix, and \p computeU was set
-      * to true (the default value).
-      *
-      * \sa RealSchur(const MatrixType&, bool) for an example
-      */
-    const MatrixType& matrixU() const
-    {
-      eigen_assert(m_isInitialized && "RealSchur is not initialized.");
-      eigen_assert(m_matUisUptodate && "The matrix U has not been computed during the RealSchur decomposition.");
-      return m_matU;
-    }
+  /** \brief Returns the orthogonal matrix in the Schur decomposition.
+   *
+   * \returns A const reference to the matrix U.
+   *
+   * \pre Either the constructor RealSchur(const MatrixType&, bool) or the
+   * member function compute(const MatrixType&, bool) has been called before
+   * to compute the Schur decomposition of a matrix, and \p computeU was set
+   * to true (the default value).
+   *
+   * \sa RealSchur(const MatrixType&, bool) for an example
+   */
+  const MatrixType& matrixU() const {
+    eigen_assert(m_isInitialized && "RealSchur is not initialized.");
+    eigen_assert(m_matUisUptodate && "The matrix U has not been computed during the RealSchur decomposition.");
+    return m_matU;
+  }
 
-    /** \brief Returns the quasi-triangular matrix in the Schur decomposition. 
-      *
-      * \returns A const reference to the matrix T.
-      *
-      * \pre Either the constructor RealSchur(const MatrixType&, bool) or the
-      * member function compute(const MatrixType&, bool) has been called before
-      * to compute the Schur decomposition of a matrix.
-      *
-      * \sa RealSchur(const MatrixType&, bool) for an example
-      */
-    const MatrixType& matrixT() const
-    {
-      eigen_assert(m_isInitialized && "RealSchur is not initialized.");
-      return m_matT;
-    }
-  
-    /** \brief Computes Schur decomposition of given matrix. 
-      * 
-      * \param[in]  matrix    Square matrix whose Schur decomposition is to be computed.
-      * \param[in]  computeU  If true, both T and U are computed; if false, only T is computed.
-      * \returns    Reference to \c *this
-      *
-      * The Schur decomposition is computed by first reducing the matrix to
-      * Hessenberg form using the class HessenbergDecomposition. The Hessenberg
-      * matrix is then reduced to triangular form by performing Francis QR
-      * iterations with implicit double shift. The cost of computing the Schur
-      * decomposition depends on the number of iterations; as a rough guide, it
-      * may be taken to be \f$25n^3\f$ flops if \a computeU is true and
-      * \f$10n^3\f$ flops if \a computeU is false.
-      *
-      * Example: \include RealSchur_compute.cpp
-      * Output: \verbinclude RealSchur_compute.out
-      *
-      * \sa compute(const MatrixType&, bool, Index)
-      */
-    template<typename InputType>
-    RealSchur& compute(const EigenBase<InputType>& matrix, bool computeU = true);
+  /** \brief Returns the quasi-triangular matrix in the Schur decomposition.
+   *
+   * \returns A const reference to the matrix T.
+   *
+   * \pre Either the constructor RealSchur(const MatrixType&, bool) or the
+   * member function compute(const MatrixType&, bool) has been called before
+   * to compute the Schur decomposition of a matrix.
+   *
+   * \sa RealSchur(const MatrixType&, bool) for an example
+   */
+  const MatrixType& matrixT() const {
+    eigen_assert(m_isInitialized && "RealSchur is not initialized.");
+    return m_matT;
+  }
 
-    /** \brief Computes Schur decomposition of a Hessenberg matrix H = Z T Z^T
-     *  \param[in] matrixH Matrix in Hessenberg form H
-     *  \param[in] matrixQ orthogonal matrix Q that transform a matrix A to H : A = Q H Q^T
-     *  \param computeU Computes the matriX U of the Schur vectors
-     * \return Reference to \c *this
-     * 
-     *  This routine assumes that the matrix is already reduced in Hessenberg form matrixH
-     *  using either the class HessenbergDecomposition or another mean. 
-     *  It computes the upper quasi-triangular matrix T of the Schur decomposition of H
-     *  When computeU is true, this routine computes the matrix U such that 
-     *  A = U T U^T =  (QZ) T (QZ)^T = Q H Q^T where A is the initial matrix
-     * 
-     * NOTE Q is referenced if computeU is true; so, if the initial orthogonal matrix
-     * is not available, the user should give an identity matrix (Q.setIdentity())
-     * 
-     * \sa compute(const MatrixType&, bool)
-     */
-    template<typename HessMatrixType, typename OrthMatrixType>
-    RealSchur& computeFromHessenberg(const HessMatrixType& matrixH, const OrthMatrixType& matrixQ,  bool computeU);
-    /** \brief Reports whether previous computation was successful.
-      *
-      * \returns \c Success if computation was successful, \c NoConvergence otherwise.
-      */
-    ComputationInfo info() const
-    {
-      eigen_assert(m_isInitialized && "RealSchur is not initialized.");
-      return m_info;
-    }
+  /** \brief Computes Schur decomposition of given matrix.
+   *
+   * \param[in]  matrix    Square matrix whose Schur decomposition is to be computed.
+   * \param[in]  computeU  If true, both T and U are computed; if false, only T is computed.
+   * \returns    Reference to \c *this
+   *
+   * The Schur decomposition is computed by first reducing the matrix to
+   * Hessenberg form using the class HessenbergDecomposition. The Hessenberg
+   * matrix is then reduced to triangular form by performing Francis QR
+   * iterations with implicit double shift. The cost of computing the Schur
+   * decomposition depends on the number of iterations; as a rough guide, it
+   * may be taken to be \f$25n^3\f$ flops if \a computeU is true and
+   * \f$10n^3\f$ flops if \a computeU is false.
+   *
+   * Example: \include RealSchur_compute.cpp
+   * Output: \verbinclude RealSchur_compute.out
+   *
+   * \sa compute(const MatrixType&, bool, Index)
+   */
+  template <typename InputType>
+  RealSchur& compute(const EigenBase<InputType>& matrix, bool computeU = true);
 
-    /** \brief Sets the maximum number of iterations allowed. 
-      *
-      * If not specified by the user, the maximum number of iterations is m_maxIterationsPerRow times the size
-      * of the matrix.
-      */
-    RealSchur& setMaxIterations(Index maxIters)
-    {
-      m_maxIters = maxIters;
-      return *this;
-    }
+  /** \brief Computes Schur decomposition of a Hessenberg matrix H = Z T Z^T
+   *  \param[in] matrixH Matrix in Hessenberg form H
+   *  \param[in] matrixQ orthogonal matrix Q that transform a matrix A to H : A = Q H Q^T
+   *  \param computeU Computes the matriX U of the Schur vectors
+   * \return Reference to \c *this
+   *
+   *  This routine assumes that the matrix is already reduced in Hessenberg form matrixH
+   *  using either the class HessenbergDecomposition or another mean.
+   *  It computes the upper quasi-triangular matrix T of the Schur decomposition of H
+   *  When computeU is true, this routine computes the matrix U such that
+   *  A = U T U^T =  (QZ) T (QZ)^T = Q H Q^T where A is the initial matrix
+   *
+   * NOTE Q is referenced if computeU is true; so, if the initial orthogonal matrix
+   * is not available, the user should give an identity matrix (Q.setIdentity())
+   *
+   * \sa compute(const MatrixType&, bool)
+   */
+  template <typename HessMatrixType, typename OrthMatrixType>
+  RealSchur& computeFromHessenberg(const HessMatrixType& matrixH, const OrthMatrixType& matrixQ, bool computeU);
+  /** \brief Reports whether previous computation was successful.
+   *
+   * \returns \c Success if computation was successful, \c NoConvergence otherwise.
+   */
+  ComputationInfo info() const {
+    eigen_assert(m_isInitialized && "RealSchur is not initialized.");
+    return m_info;
+  }
 
-    /** \brief Returns the maximum number of iterations. */
-    Index getMaxIterations()
-    {
-      return m_maxIters;
-    }
+  /** \brief Sets the maximum number of iterations allowed.
+   *
+   * If not specified by the user, the maximum number of iterations is m_maxIterationsPerRow times the size
+   * of the matrix.
+   */
+  RealSchur& setMaxIterations(Index maxIters) {
+    m_maxIters = maxIters;
+    return *this;
+  }
 
-    /** \brief Maximum number of iterations per row.
-      *
-      * If not otherwise specified, the maximum number of iterations is this number times the size of the
-      * matrix. It is currently set to 40.
-      */
-    static const int m_maxIterationsPerRow = 40;
+  /** \brief Returns the maximum number of iterations. */
+  Index getMaxIterations() { return m_maxIters; }
 
-  private:
-    
-    MatrixType m_matT;
-    MatrixType m_matU;
-    ColumnVectorType m_workspaceVector;
-    HessenbergDecomposition<MatrixType> m_hess;
-    ComputationInfo m_info;
-    bool m_isInitialized;
-    bool m_matUisUptodate;
-    Index m_maxIters;
+  /** \brief Maximum number of iterations per row.
+   *
+   * If not otherwise specified, the maximum number of iterations is this number times the size of the
+   * matrix. It is currently set to 40.
+   */
+  static const int m_maxIterationsPerRow = 40;
 
-    typedef Matrix<Scalar,3,1> Vector3s;
+ private:
+  MatrixType m_matT;
+  MatrixType m_matU;
+  ColumnVectorType m_workspaceVector;
+  HessenbergDecomposition<MatrixType> m_hess;
+  ComputationInfo m_info;
+  bool m_isInitialized;
+  bool m_matUisUptodate;
+  Index m_maxIters;
 
-    Scalar computeNormOfT();
-    Index findSmallSubdiagEntry(Index iu, const Scalar& considerAsZero);
-    void splitOffTwoRows(Index iu, bool computeU, const Scalar& exshift);
-    void computeShift(Index iu, Index iter, Scalar& exshift, Vector3s& shiftInfo);
-    void initFrancisQRStep(Index il, Index iu, const Vector3s& shiftInfo, Index& im, Vector3s& firstHouseholderVector);
-    void performFrancisQRStep(Index il, Index im, Index iu, bool computeU, const Vector3s& firstHouseholderVector, Scalar* workspace);
+  typedef Matrix<Scalar, 3, 1> Vector3s;
+
+  Scalar computeNormOfT();
+  Index findSmallSubdiagEntry(Index iu, const Scalar& considerAsZero);
+  void splitOffTwoRows(Index iu, bool computeU, const Scalar& exshift);
+  void computeShift(Index iu, Index iter, Scalar& exshift, Vector3s& shiftInfo);
+  void initFrancisQRStep(Index il, Index iu, const Vector3s& shiftInfo, Index& im, Vector3s& firstHouseholderVector);
+  void performFrancisQRStep(Index il, Index im, Index iu, bool computeU, const Vector3s& firstHouseholderVector,
+                            Scalar* workspace);
 };
 
-
-template<typename MatrixType>
-template<typename InputType>
-RealSchur<MatrixType>& RealSchur<MatrixType>::compute(const EigenBase<InputType>& matrix, bool computeU)
-{
+template <typename MatrixType>
+template <typename InputType>
+RealSchur<MatrixType>& RealSchur<MatrixType>::compute(const EigenBase<InputType>& matrix, bool computeU) {
   const Scalar considerAsZero = (std::numeric_limits<Scalar>::min)();
 
   eigen_assert(matrix.cols() == matrix.rows());
   Index maxIters = m_maxIters;
-  if (maxIters == -1)
-    maxIters = m_maxIterationsPerRow * matrix.rows();
+  if (maxIters == -1) maxIters = m_maxIterationsPerRow * matrix.rows();
 
   Scalar scale = matrix.derived().cwiseAbs().maxCoeff();
-  if(scale<considerAsZero)
-  {
-    m_matT.setZero(matrix.rows(),matrix.cols());
-    if(computeU)
-      m_matU.setIdentity(matrix.rows(),matrix.cols());
+  if (scale < considerAsZero) {
+    m_matT.setZero(matrix.rows(), matrix.cols());
+    if (computeU) m_matU.setIdentity(matrix.rows(), matrix.cols());
     m_info = Success;
     m_isInitialized = true;
     m_matUisUptodate = computeU;
@@ -271,74 +257,67 @@
   }
 
   // Step 1. Reduce to Hessenberg form
-  m_hess.compute(matrix.derived()/scale);
+  m_hess.compute(matrix.derived() / scale);
 
   // Step 2. Reduce to real Schur form
   // Note: we copy m_hess.matrixQ() into m_matU here and not in computeFromHessenberg
   //       to be able to pass our working-space buffer for the Householder to Dense evaluation.
   m_workspaceVector.resize(matrix.cols());
-  if(computeU)
-    m_hess.matrixQ().evalTo(m_matU, m_workspaceVector);
+  if (computeU) m_hess.matrixQ().evalTo(m_matU, m_workspaceVector);
   computeFromHessenberg(m_hess.matrixH(), m_matU, computeU);
 
   m_matT *= scale;
-  
+
   return *this;
 }
-template<typename MatrixType>
-template<typename HessMatrixType, typename OrthMatrixType>
-RealSchur<MatrixType>& RealSchur<MatrixType>::computeFromHessenberg(const HessMatrixType& matrixH, const OrthMatrixType& matrixQ,  bool computeU)
-{
+template <typename MatrixType>
+template <typename HessMatrixType, typename OrthMatrixType>
+RealSchur<MatrixType>& RealSchur<MatrixType>::computeFromHessenberg(const HessMatrixType& matrixH,
+                                                                    const OrthMatrixType& matrixQ, bool computeU) {
   using std::abs;
 
   m_matT = matrixH;
   m_workspaceVector.resize(m_matT.cols());
-  if(computeU && !internal::is_same_dense(m_matU,matrixQ))
-    m_matU = matrixQ;
-  
+  if (computeU && !internal::is_same_dense(m_matU, matrixQ)) m_matU = matrixQ;
+
   Index maxIters = m_maxIters;
-  if (maxIters == -1)
-    maxIters = m_maxIterationsPerRow * matrixH.rows();
+  if (maxIters == -1) maxIters = m_maxIterationsPerRow * matrixH.rows();
   Scalar* workspace = &m_workspaceVector.coeffRef(0);
 
-  // The matrix m_matT is divided in three parts. 
-  // Rows 0,...,il-1 are decoupled from the rest because m_matT(il,il-1) is zero. 
+  // The matrix m_matT is divided in three parts.
+  // Rows 0,...,il-1 are decoupled from the rest because m_matT(il,il-1) is zero.
   // Rows il,...,iu is the part we are working on (the active window).
   // Rows iu+1,...,end are already brought in triangular form.
   Index iu = m_matT.cols() - 1;
-  Index iter = 0;      // iteration count for current eigenvalue
-  Index totalIter = 0; // iteration count for whole matrix
-  Scalar exshift(0);   // sum of exceptional shifts
+  Index iter = 0;       // iteration count for current eigenvalue
+  Index totalIter = 0;  // iteration count for whole matrix
+  Scalar exshift(0);    // sum of exceptional shifts
   Scalar norm = computeNormOfT();
   // sub-diagonal entries smaller than considerAsZero will be treated as zero.
   // We use eps^2 to enable more precision in small eigenvalues.
-  Scalar considerAsZero = numext::maxi<Scalar>( norm * numext::abs2(NumTraits<Scalar>::epsilon()),
-                                                (std::numeric_limits<Scalar>::min)() );
+  Scalar considerAsZero =
+      numext::maxi<Scalar>(norm * numext::abs2(NumTraits<Scalar>::epsilon()), (std::numeric_limits<Scalar>::min)());
 
-  if(!numext::is_exactly_zero(norm))
-  {
-    while (iu >= 0)
-    {
-      Index il = findSmallSubdiagEntry(iu,considerAsZero);
+  if (!numext::is_exactly_zero(norm)) {
+    while (iu >= 0) {
+      Index il = findSmallSubdiagEntry(iu, considerAsZero);
 
       // Check for convergence
-      if (il == iu) // One root found
+      if (il == iu)  // One root found
       {
-        m_matT.coeffRef(iu,iu) = m_matT.coeff(iu,iu) + exshift;
-        if (iu > 0)
-          m_matT.coeffRef(iu, iu-1) = Scalar(0);
+        m_matT.coeffRef(iu, iu) = m_matT.coeff(iu, iu) + exshift;
+        if (iu > 0) m_matT.coeffRef(iu, iu - 1) = Scalar(0);
         iu--;
         iter = 0;
-      }
-      else if (il == iu-1) // Two roots found
+      } else if (il == iu - 1)  // Two roots found
       {
         splitOffTwoRows(iu, computeU, exshift);
         iu -= 2;
         iter = 0;
-      }
-      else // No convergence yet
+      } else  // No convergence yet
       {
-        // The firstHouseholderVector vector has to be initialized to something to get rid of a silly GCC warning (-O1 -Wall -DNDEBUG )
+        // The firstHouseholderVector vector has to be initialized to something to get rid of a silly GCC warning (-O1
+        // -Wall -DNDEBUG )
         Vector3s firstHouseholderVector = Vector3s::Zero(), shiftInfo;
         computeShift(iu, iter, exshift, shiftInfo);
         iter = iter + 1;
@@ -350,7 +329,7 @@
       }
     }
   }
-  if(totalIter <= maxIters)
+  if (totalIter <= maxIters)
     m_info = Success;
   else
     m_info = NoConvergence;
@@ -361,201 +340,179 @@
 }
 
 /** \internal Computes and returns vector L1 norm of T */
-template<typename MatrixType>
-inline typename MatrixType::Scalar RealSchur<MatrixType>::computeNormOfT()
-{
+template <typename MatrixType>
+inline typename MatrixType::Scalar RealSchur<MatrixType>::computeNormOfT() {
   const Index size = m_matT.cols();
   // FIXME to be efficient the following would requires a triangular reduxion code
-  // Scalar norm = m_matT.upper().cwiseAbs().sum() 
+  // Scalar norm = m_matT.upper().cwiseAbs().sum()
   //               + m_matT.bottomLeftCorner(size-1,size-1).diagonal().cwiseAbs().sum();
   Scalar norm(0);
-  for (Index j = 0; j < size; ++j)
-    norm += m_matT.col(j).segment(0, (std::min)(size,j+2)).cwiseAbs().sum();
+  for (Index j = 0; j < size; ++j) norm += m_matT.col(j).segment(0, (std::min)(size, j + 2)).cwiseAbs().sum();
   return norm;
 }
 
 /** \internal Look for single small sub-diagonal element and returns its index */
-template<typename MatrixType>
-inline Index RealSchur<MatrixType>::findSmallSubdiagEntry(Index iu, const Scalar& considerAsZero)
-{
+template <typename MatrixType>
+inline Index RealSchur<MatrixType>::findSmallSubdiagEntry(Index iu, const Scalar& considerAsZero) {
   using std::abs;
   Index res = iu;
-  while (res > 0)
-  {
-    Scalar s = abs(m_matT.coeff(res-1,res-1)) + abs(m_matT.coeff(res,res));
+  while (res > 0) {
+    Scalar s = abs(m_matT.coeff(res - 1, res - 1)) + abs(m_matT.coeff(res, res));
 
     s = numext::maxi<Scalar>(s * NumTraits<Scalar>::epsilon(), considerAsZero);
-    
-    if (abs(m_matT.coeff(res,res-1)) <= s)
-      break;
+
+    if (abs(m_matT.coeff(res, res - 1)) <= s) break;
     res--;
   }
   return res;
 }
 
 /** \internal Update T given that rows iu-1 and iu decouple from the rest. */
-template<typename MatrixType>
-inline void RealSchur<MatrixType>::splitOffTwoRows(Index iu, bool computeU, const Scalar& exshift)
-{
-  using std::sqrt;
+template <typename MatrixType>
+inline void RealSchur<MatrixType>::splitOffTwoRows(Index iu, bool computeU, const Scalar& exshift) {
   using std::abs;
+  using std::sqrt;
   const Index size = m_matT.cols();
 
-  // The eigenvalues of the 2x2 matrix [a b; c d] are 
+  // The eigenvalues of the 2x2 matrix [a b; c d] are
   // trace +/- sqrt(discr/4) where discr = tr^2 - 4*det, tr = a + d, det = ad - bc
-  Scalar p = Scalar(0.5) * (m_matT.coeff(iu-1,iu-1) - m_matT.coeff(iu,iu));
-  Scalar q = p * p + m_matT.coeff(iu,iu-1) * m_matT.coeff(iu-1,iu);   // q = tr^2 / 4 - det = discr/4
-  m_matT.coeffRef(iu,iu) += exshift;
-  m_matT.coeffRef(iu-1,iu-1) += exshift;
+  Scalar p = Scalar(0.5) * (m_matT.coeff(iu - 1, iu - 1) - m_matT.coeff(iu, iu));
+  Scalar q = p * p + m_matT.coeff(iu, iu - 1) * m_matT.coeff(iu - 1, iu);  // q = tr^2 / 4 - det = discr/4
+  m_matT.coeffRef(iu, iu) += exshift;
+  m_matT.coeffRef(iu - 1, iu - 1) += exshift;
 
-  if (q >= Scalar(0)) // Two real eigenvalues
+  if (q >= Scalar(0))  // Two real eigenvalues
   {
     Scalar z = sqrt(abs(q));
     JacobiRotation<Scalar> rot;
     if (p >= Scalar(0))
-      rot.makeGivens(p + z, m_matT.coeff(iu, iu-1));
+      rot.makeGivens(p + z, m_matT.coeff(iu, iu - 1));
     else
-      rot.makeGivens(p - z, m_matT.coeff(iu, iu-1));
+      rot.makeGivens(p - z, m_matT.coeff(iu, iu - 1));
 
-    m_matT.rightCols(size-iu+1).applyOnTheLeft(iu-1, iu, rot.adjoint());
-    m_matT.topRows(iu+1).applyOnTheRight(iu-1, iu, rot);
-    m_matT.coeffRef(iu, iu-1) = Scalar(0); 
-    if (computeU)
-      m_matU.applyOnTheRight(iu-1, iu, rot);
+    m_matT.rightCols(size - iu + 1).applyOnTheLeft(iu - 1, iu, rot.adjoint());
+    m_matT.topRows(iu + 1).applyOnTheRight(iu - 1, iu, rot);
+    m_matT.coeffRef(iu, iu - 1) = Scalar(0);
+    if (computeU) m_matU.applyOnTheRight(iu - 1, iu, rot);
   }
 
-  if (iu > 1) 
-    m_matT.coeffRef(iu-1, iu-2) = Scalar(0);
+  if (iu > 1) m_matT.coeffRef(iu - 1, iu - 2) = Scalar(0);
 }
 
 /** \internal Form shift in shiftInfo, and update exshift if an exceptional shift is performed. */
-template<typename MatrixType>
-inline void RealSchur<MatrixType>::computeShift(Index iu, Index iter, Scalar& exshift, Vector3s& shiftInfo)
-{
-  using std::sqrt;
+template <typename MatrixType>
+inline void RealSchur<MatrixType>::computeShift(Index iu, Index iter, Scalar& exshift, Vector3s& shiftInfo) {
   using std::abs;
-  shiftInfo.coeffRef(0) = m_matT.coeff(iu,iu);
-  shiftInfo.coeffRef(1) = m_matT.coeff(iu-1,iu-1);
-  shiftInfo.coeffRef(2) = m_matT.coeff(iu,iu-1) * m_matT.coeff(iu-1,iu);
+  using std::sqrt;
+  shiftInfo.coeffRef(0) = m_matT.coeff(iu, iu);
+  shiftInfo.coeffRef(1) = m_matT.coeff(iu - 1, iu - 1);
+  shiftInfo.coeffRef(2) = m_matT.coeff(iu, iu - 1) * m_matT.coeff(iu - 1, iu);
 
   // Wilkinson's original ad hoc shift
-  if (iter == 10)
-  {
+  if (iter == 10) {
     exshift += shiftInfo.coeff(0);
-    for (Index i = 0; i <= iu; ++i)
-      m_matT.coeffRef(i,i) -= shiftInfo.coeff(0);
-    Scalar s = abs(m_matT.coeff(iu,iu-1)) + abs(m_matT.coeff(iu-1,iu-2));
+    for (Index i = 0; i <= iu; ++i) m_matT.coeffRef(i, i) -= shiftInfo.coeff(0);
+    Scalar s = abs(m_matT.coeff(iu, iu - 1)) + abs(m_matT.coeff(iu - 1, iu - 2));
     shiftInfo.coeffRef(0) = Scalar(0.75) * s;
     shiftInfo.coeffRef(1) = Scalar(0.75) * s;
     shiftInfo.coeffRef(2) = Scalar(-0.4375) * s * s;
   }
 
   // MATLAB's new ad hoc shift
-  if (iter == 30)
-  {
+  if (iter == 30) {
     Scalar s = (shiftInfo.coeff(1) - shiftInfo.coeff(0)) / Scalar(2.0);
     s = s * s + shiftInfo.coeff(2);
-    if (s > Scalar(0))
-    {
+    if (s > Scalar(0)) {
       s = sqrt(s);
-      if (shiftInfo.coeff(1) < shiftInfo.coeff(0))
-        s = -s;
+      if (shiftInfo.coeff(1) < shiftInfo.coeff(0)) s = -s;
       s = s + (shiftInfo.coeff(1) - shiftInfo.coeff(0)) / Scalar(2.0);
       s = shiftInfo.coeff(0) - shiftInfo.coeff(2) / s;
       exshift += s;
-      for (Index i = 0; i <= iu; ++i)
-        m_matT.coeffRef(i,i) -= s;
+      for (Index i = 0; i <= iu; ++i) m_matT.coeffRef(i, i) -= s;
       shiftInfo.setConstant(Scalar(0.964));
     }
   }
 }
 
 /** \internal Compute index im at which Francis QR step starts and the first Householder vector. */
-template<typename MatrixType>
-inline void RealSchur<MatrixType>::initFrancisQRStep(Index il, Index iu, const Vector3s& shiftInfo, Index& im, Vector3s& firstHouseholderVector)
-{
+template <typename MatrixType>
+inline void RealSchur<MatrixType>::initFrancisQRStep(Index il, Index iu, const Vector3s& shiftInfo, Index& im,
+                                                     Vector3s& firstHouseholderVector) {
   using std::abs;
-  Vector3s& v = firstHouseholderVector; // alias to save typing
+  Vector3s& v = firstHouseholderVector;  // alias to save typing
 
-  for (im = iu-2; im >= il; --im)
-  {
-    const Scalar Tmm = m_matT.coeff(im,im);
+  for (im = iu - 2; im >= il; --im) {
+    const Scalar Tmm = m_matT.coeff(im, im);
     const Scalar r = shiftInfo.coeff(0) - Tmm;
     const Scalar s = shiftInfo.coeff(1) - Tmm;
-    v.coeffRef(0) = (r * s - shiftInfo.coeff(2)) / m_matT.coeff(im+1,im) + m_matT.coeff(im,im+1);
-    v.coeffRef(1) = m_matT.coeff(im+1,im+1) - Tmm - r - s;
-    v.coeffRef(2) = m_matT.coeff(im+2,im+1);
+    v.coeffRef(0) = (r * s - shiftInfo.coeff(2)) / m_matT.coeff(im + 1, im) + m_matT.coeff(im, im + 1);
+    v.coeffRef(1) = m_matT.coeff(im + 1, im + 1) - Tmm - r - s;
+    v.coeffRef(2) = m_matT.coeff(im + 2, im + 1);
     if (im == il) {
       break;
     }
-    const Scalar lhs = m_matT.coeff(im,im-1) * (abs(v.coeff(1)) + abs(v.coeff(2)));
-    const Scalar rhs = v.coeff(0) * (abs(m_matT.coeff(im-1,im-1)) + abs(Tmm) + abs(m_matT.coeff(im+1,im+1)));
-    if (abs(lhs) < NumTraits<Scalar>::epsilon() * rhs)
-      break;
+    const Scalar lhs = m_matT.coeff(im, im - 1) * (abs(v.coeff(1)) + abs(v.coeff(2)));
+    const Scalar rhs = v.coeff(0) * (abs(m_matT.coeff(im - 1, im - 1)) + abs(Tmm) + abs(m_matT.coeff(im + 1, im + 1)));
+    if (abs(lhs) < NumTraits<Scalar>::epsilon() * rhs) break;
   }
 }
 
 /** \internal Perform a Francis QR step involving rows il:iu and columns im:iu. */
-template<typename MatrixType>
-inline void RealSchur<MatrixType>::performFrancisQRStep(Index il, Index im, Index iu, bool computeU, const Vector3s& firstHouseholderVector, Scalar* workspace)
-{
+template <typename MatrixType>
+inline void RealSchur<MatrixType>::performFrancisQRStep(Index il, Index im, Index iu, bool computeU,
+                                                        const Vector3s& firstHouseholderVector, Scalar* workspace) {
   eigen_assert(im >= il);
-  eigen_assert(im <= iu-2);
+  eigen_assert(im <= iu - 2);
 
   const Index size = m_matT.cols();
 
-  for (Index k = im; k <= iu-2; ++k)
-  {
+  for (Index k = im; k <= iu - 2; ++k) {
     bool firstIteration = (k == im);
 
     Vector3s v;
     if (firstIteration)
       v = firstHouseholderVector;
     else
-      v = m_matT.template block<3,1>(k,k-1);
+      v = m_matT.template block<3, 1>(k, k - 1);
 
     Scalar tau, beta;
     Matrix<Scalar, 2, 1> ess;
     v.makeHouseholder(ess, tau, beta);
-    
-    if (!numext::is_exactly_zero(beta)) // if v is not zero
+
+    if (!numext::is_exactly_zero(beta))  // if v is not zero
     {
       if (firstIteration && k > il)
-        m_matT.coeffRef(k,k-1) = -m_matT.coeff(k,k-1);
+        m_matT.coeffRef(k, k - 1) = -m_matT.coeff(k, k - 1);
       else if (!firstIteration)
-        m_matT.coeffRef(k,k-1) = beta;
+        m_matT.coeffRef(k, k - 1) = beta;
 
       // These Householder transformations form the O(n^3) part of the algorithm
-      m_matT.block(k, k, 3, size-k).applyHouseholderOnTheLeft(ess, tau, workspace);
-      m_matT.block(0, k, (std::min)(iu,k+3) + 1, 3).applyHouseholderOnTheRight(ess, tau, workspace);
-      if (computeU)
-        m_matU.block(0, k, size, 3).applyHouseholderOnTheRight(ess, tau, workspace);
+      m_matT.block(k, k, 3, size - k).applyHouseholderOnTheLeft(ess, tau, workspace);
+      m_matT.block(0, k, (std::min)(iu, k + 3) + 1, 3).applyHouseholderOnTheRight(ess, tau, workspace);
+      if (computeU) m_matU.block(0, k, size, 3).applyHouseholderOnTheRight(ess, tau, workspace);
     }
   }
 
-  Matrix<Scalar, 2, 1> v = m_matT.template block<2,1>(iu-1, iu-2);
+  Matrix<Scalar, 2, 1> v = m_matT.template block<2, 1>(iu - 1, iu - 2);
   Scalar tau, beta;
   Matrix<Scalar, 1, 1> ess;
   v.makeHouseholder(ess, tau, beta);
 
-  if (!numext::is_exactly_zero(beta)) // if v is not zero
+  if (!numext::is_exactly_zero(beta))  // if v is not zero
   {
-    m_matT.coeffRef(iu-1, iu-2) = beta;
-    m_matT.block(iu-1, iu-1, 2, size-iu+1).applyHouseholderOnTheLeft(ess, tau, workspace);
-    m_matT.block(0, iu-1, iu+1, 2).applyHouseholderOnTheRight(ess, tau, workspace);
-    if (computeU)
-      m_matU.block(0, iu-1, size, 2).applyHouseholderOnTheRight(ess, tau, workspace);
+    m_matT.coeffRef(iu - 1, iu - 2) = beta;
+    m_matT.block(iu - 1, iu - 1, 2, size - iu + 1).applyHouseholderOnTheLeft(ess, tau, workspace);
+    m_matT.block(0, iu - 1, iu + 1, 2).applyHouseholderOnTheRight(ess, tau, workspace);
+    if (computeU) m_matU.block(0, iu - 1, size, 2).applyHouseholderOnTheRight(ess, tau, workspace);
   }
 
   // clean up pollution due to round-off errors
-  for (Index i = im+2; i <= iu; ++i)
-  {
-    m_matT.coeffRef(i,i-2) = Scalar(0);
-    if (i > im+2)
-      m_matT.coeffRef(i,i-3) = Scalar(0);
+  for (Index i = im + 2; i <= iu; ++i) {
+    m_matT.coeffRef(i, i - 2) = Scalar(0);
+    if (i > im + 2) m_matT.coeffRef(i, i - 3) = Scalar(0);
   }
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_REAL_SCHUR_H
+#endif  // EIGEN_REAL_SCHUR_H
diff --git a/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h b/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h
index 562b8ac..05a516d 100644
--- a/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h
+++ b/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h
@@ -36,45 +36,48 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 /** \internal Specialization for the data types supported by LAPACKe */
 
 #define EIGEN_LAPACKE_SCHUR_REAL(EIGTYPE, LAPACKE_TYPE, LAPACKE_PREFIX, LAPACKE_PREFIX_U, EIGCOLROW, LAPACKE_COLROW) \
-template<> template<typename InputType> inline \
-RealSchur<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >& \
-RealSchur<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >::compute(const EigenBase<InputType>& matrix, bool computeU) \
-{ \
-  eigen_assert(matrix.cols() == matrix.rows()); \
-\
-  lapack_int n = internal::convert_index<lapack_int>(matrix.cols()), sdim, info; \
-  lapack_int matrix_order = LAPACKE_COLROW; \
-  char jobvs, sort='N'; \
-  LAPACK_##LAPACKE_PREFIX_U##_SELECT2 select = 0; \
-  jobvs = (computeU) ? 'V' : 'N'; \
-  m_matU.resize(n, n); \
-  lapack_int ldvs  = internal::convert_index<lapack_int>(m_matU.outerStride()); \
-  m_matT = matrix; \
-  lapack_int lda = internal::convert_index<lapack_int>(m_matT.outerStride()); \
-  Matrix<EIGTYPE, Dynamic, Dynamic> wr, wi; \
-  wr.resize(n, 1); wi.resize(n, 1); \
-  info = LAPACKE_##LAPACKE_PREFIX##gees( matrix_order, jobvs, sort, select, n, (LAPACKE_TYPE*)m_matT.data(), lda, &sdim, (LAPACKE_TYPE*)wr.data(), (LAPACKE_TYPE*)wi.data(), (LAPACKE_TYPE*)m_matU.data(), ldvs ); \
-  if(info == 0) \
-    m_info = Success; \
-  else \
-    m_info = NoConvergence; \
-\
-  m_isInitialized = true; \
-  m_matUisUptodate = computeU; \
-  return *this; \
-\
-}
+  template <>                                                                                                        \
+  template <typename InputType>                                                                                      \
+  inline RealSchur<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >&                                                   \
+  RealSchur<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >::compute(const EigenBase<InputType>& matrix,              \
+                                                                    bool computeU) {                                 \
+    eigen_assert(matrix.cols() == matrix.rows());                                                                    \
+                                                                                                                     \
+    lapack_int n = internal::convert_index<lapack_int>(matrix.cols()), sdim, info;                                   \
+    lapack_int matrix_order = LAPACKE_COLROW;                                                                        \
+    char jobvs, sort = 'N';                                                                                          \
+    LAPACK_##LAPACKE_PREFIX_U##_SELECT2 select = 0;                                                                  \
+    jobvs = (computeU) ? 'V' : 'N';                                                                                  \
+    m_matU.resize(n, n);                                                                                             \
+    lapack_int ldvs = internal::convert_index<lapack_int>(m_matU.outerStride());                                     \
+    m_matT = matrix;                                                                                                 \
+    lapack_int lda = internal::convert_index<lapack_int>(m_matT.outerStride());                                      \
+    Matrix<EIGTYPE, Dynamic, Dynamic> wr, wi;                                                                        \
+    wr.resize(n, 1);                                                                                                 \
+    wi.resize(n, 1);                                                                                                 \
+    info = LAPACKE_##LAPACKE_PREFIX##gees(matrix_order, jobvs, sort, select, n, (LAPACKE_TYPE*)m_matT.data(), lda,   \
+                                          &sdim, (LAPACKE_TYPE*)wr.data(), (LAPACKE_TYPE*)wi.data(),                 \
+                                          (LAPACKE_TYPE*)m_matU.data(), ldvs);                                       \
+    if (info == 0)                                                                                                   \
+      m_info = Success;                                                                                              \
+    else                                                                                                             \
+      m_info = NoConvergence;                                                                                        \
+                                                                                                                     \
+    m_isInitialized = true;                                                                                          \
+    m_matUisUptodate = computeU;                                                                                     \
+    return *this;                                                                                                    \
+  }
 
-EIGEN_LAPACKE_SCHUR_REAL(double,   double, d, D, ColMajor, LAPACK_COL_MAJOR)
-EIGEN_LAPACKE_SCHUR_REAL(float,    float,  s, S, ColMajor, LAPACK_COL_MAJOR)
-EIGEN_LAPACKE_SCHUR_REAL(double,   double, d, D, RowMajor, LAPACK_ROW_MAJOR)
-EIGEN_LAPACKE_SCHUR_REAL(float,    float,  s, S, RowMajor, LAPACK_ROW_MAJOR)
+EIGEN_LAPACKE_SCHUR_REAL(double, double, d, D, ColMajor, LAPACK_COL_MAJOR)
+EIGEN_LAPACKE_SCHUR_REAL(float, float, s, S, ColMajor, LAPACK_COL_MAJOR)
+EIGEN_LAPACKE_SCHUR_REAL(double, double, d, D, RowMajor, LAPACK_ROW_MAJOR)
+EIGEN_LAPACKE_SCHUR_REAL(float, float, s, S, RowMajor, LAPACK_ROW_MAJOR)
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_REAL_SCHUR_LAPACKE_H
+#endif  // EIGEN_REAL_SCHUR_LAPACKE_H
diff --git a/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h b/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h
index fff9874..9511e68 100644
--- a/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h
+++ b/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h
@@ -16,430 +16,412 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
-template<typename MatrixType_>
+template <typename MatrixType_>
 class GeneralizedSelfAdjointEigenSolver;
 
 namespace internal {
-template<typename SolverType,int Size,bool IsComplex> struct direct_selfadjoint_eigenvalues;
+template <typename SolverType, int Size, bool IsComplex>
+struct direct_selfadjoint_eigenvalues;
 
-template<typename MatrixType, typename DiagType, typename SubDiagType>
-EIGEN_DEVICE_FUNC
-ComputationInfo computeFromTridiagonal_impl(DiagType& diag, SubDiagType& subdiag, const Index maxIterations, bool computeEigenvectors, MatrixType& eivec);
-}
+template <typename MatrixType, typename DiagType, typename SubDiagType>
+EIGEN_DEVICE_FUNC ComputationInfo computeFromTridiagonal_impl(DiagType& diag, SubDiagType& subdiag,
+                                                              const Index maxIterations, bool computeEigenvectors,
+                                                              MatrixType& eivec);
+}  // namespace internal
 
 /** \eigenvalues_module \ingroup Eigenvalues_Module
-  *
-  *
-  * \class SelfAdjointEigenSolver
-  *
-  * \brief Computes eigenvalues and eigenvectors of selfadjoint matrices
-  *
-  * \tparam MatrixType_ the type of the matrix of which we are computing the
-  * eigendecomposition; this is expected to be an instantiation of the Matrix
-  * class template.
-  *
-  * A matrix \f$ A \f$ is selfadjoint if it equals its adjoint. For real
-  * matrices, this means that the matrix is symmetric: it equals its
-  * transpose. This class computes the eigenvalues and eigenvectors of a
-  * selfadjoint matrix. These are the scalars \f$ \lambda \f$ and vectors
-  * \f$ v \f$ such that \f$ Av = \lambda v \f$.  The eigenvalues of a
-  * selfadjoint matrix are always real. If \f$ D \f$ is a diagonal matrix with
-  * the eigenvalues on the diagonal, and \f$ V \f$ is a matrix with the
-  * eigenvectors as its columns, then \f$ A = V D V^{-1} \f$. This is called the
-  * eigendecomposition.
-  *
-  * For a selfadjoint matrix, \f$ V \f$ is unitary, meaning its inverse is equal
-  * to its adjoint, \f$ V^{-1} = V^{\dagger} \f$. If \f$ A \f$ is real, then
-  * \f$ V \f$ is also real and therefore orthogonal, meaning its inverse is
-  * equal to its transpose, \f$ V^{-1} = V^T \f$.
-  *
-  * The algorithm exploits the fact that the matrix is selfadjoint, making it
-  * faster and more accurate than the general purpose eigenvalue algorithms
-  * implemented in EigenSolver and ComplexEigenSolver.
-  *
-  * Only the \b lower \b triangular \b part of the input matrix is referenced.
-  *
-  * Call the function compute() to compute the eigenvalues and eigenvectors of
-  * a given matrix. Alternatively, you can use the
-  * SelfAdjointEigenSolver(const MatrixType&, int) constructor which computes
-  * the eigenvalues and eigenvectors at construction time. Once the eigenvalue
-  * and eigenvectors are computed, they can be retrieved with the eigenvalues()
-  * and eigenvectors() functions.
-  *
-  * The documentation for SelfAdjointEigenSolver(const MatrixType&, int)
-  * contains an example of the typical use of this class.
-  *
-  * To solve the \em generalized eigenvalue problem \f$ Av = \lambda Bv \f$ and
-  * the likes, see the class GeneralizedSelfAdjointEigenSolver.
-  *
-  * \sa MatrixBase::eigenvalues(), class EigenSolver, class ComplexEigenSolver
-  */
-template<typename MatrixType_> class SelfAdjointEigenSolver
-{
-  public:
+ *
+ *
+ * \class SelfAdjointEigenSolver
+ *
+ * \brief Computes eigenvalues and eigenvectors of selfadjoint matrices
+ *
+ * \tparam MatrixType_ the type of the matrix of which we are computing the
+ * eigendecomposition; this is expected to be an instantiation of the Matrix
+ * class template.
+ *
+ * A matrix \f$ A \f$ is selfadjoint if it equals its adjoint. For real
+ * matrices, this means that the matrix is symmetric: it equals its
+ * transpose. This class computes the eigenvalues and eigenvectors of a
+ * selfadjoint matrix. These are the scalars \f$ \lambda \f$ and vectors
+ * \f$ v \f$ such that \f$ Av = \lambda v \f$.  The eigenvalues of a
+ * selfadjoint matrix are always real. If \f$ D \f$ is a diagonal matrix with
+ * the eigenvalues on the diagonal, and \f$ V \f$ is a matrix with the
+ * eigenvectors as its columns, then \f$ A = V D V^{-1} \f$. This is called the
+ * eigendecomposition.
+ *
+ * For a selfadjoint matrix, \f$ V \f$ is unitary, meaning its inverse is equal
+ * to its adjoint, \f$ V^{-1} = V^{\dagger} \f$. If \f$ A \f$ is real, then
+ * \f$ V \f$ is also real and therefore orthogonal, meaning its inverse is
+ * equal to its transpose, \f$ V^{-1} = V^T \f$.
+ *
+ * The algorithm exploits the fact that the matrix is selfadjoint, making it
+ * faster and more accurate than the general purpose eigenvalue algorithms
+ * implemented in EigenSolver and ComplexEigenSolver.
+ *
+ * Only the \b lower \b triangular \b part of the input matrix is referenced.
+ *
+ * Call the function compute() to compute the eigenvalues and eigenvectors of
+ * a given matrix. Alternatively, you can use the
+ * SelfAdjointEigenSolver(const MatrixType&, int) constructor which computes
+ * the eigenvalues and eigenvectors at construction time. Once the eigenvalue
+ * and eigenvectors are computed, they can be retrieved with the eigenvalues()
+ * and eigenvectors() functions.
+ *
+ * The documentation for SelfAdjointEigenSolver(const MatrixType&, int)
+ * contains an example of the typical use of this class.
+ *
+ * To solve the \em generalized eigenvalue problem \f$ Av = \lambda Bv \f$ and
+ * the likes, see the class GeneralizedSelfAdjointEigenSolver.
+ *
+ * \sa MatrixBase::eigenvalues(), class EigenSolver, class ComplexEigenSolver
+ */
+template <typename MatrixType_>
+class SelfAdjointEigenSolver {
+ public:
+  typedef MatrixType_ MatrixType;
+  enum {
+    Size = MatrixType::RowsAtCompileTime,
+    ColsAtCompileTime = MatrixType::ColsAtCompileTime,
+    Options = MatrixType::Options,
+    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
+  };
 
-    typedef MatrixType_ MatrixType;
-    enum {
-      Size = MatrixType::RowsAtCompileTime,
-      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
-      Options = MatrixType::Options,
-      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
-    };
-    
-    /** \brief Scalar type for matrices of type \p MatrixType_. */
-    typedef typename MatrixType::Scalar Scalar;
-    typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3
-    
-    typedef Matrix<Scalar,Size,Size,ColMajor,MaxColsAtCompileTime,MaxColsAtCompileTime> EigenvectorsType;
+  /** \brief Scalar type for matrices of type \p MatrixType_. */
+  typedef typename MatrixType::Scalar Scalar;
+  typedef Eigen::Index Index;  ///< \deprecated since Eigen 3.3
 
-    /** \brief Real scalar type for \p MatrixType_.
-      *
-      * This is just \c Scalar if #Scalar is real (e.g., \c float or
-      * \c double), and the type of the real part of \c Scalar if #Scalar is
-      * complex.
-      */
-    typedef typename NumTraits<Scalar>::Real RealScalar;
-    
-    friend struct internal::direct_selfadjoint_eigenvalues<SelfAdjointEigenSolver,Size,NumTraits<Scalar>::IsComplex>;
+  typedef Matrix<Scalar, Size, Size, ColMajor, MaxColsAtCompileTime, MaxColsAtCompileTime> EigenvectorsType;
 
-    /** \brief Type for vector of eigenvalues as returned by eigenvalues().
-      *
-      * This is a column vector with entries of type #RealScalar.
-      * The length of the vector is the size of \p MatrixType_.
-      */
-    typedef typename internal::plain_col_type<MatrixType, Scalar>::type VectorType;
-    typedef typename internal::plain_col_type<MatrixType, RealScalar>::type RealVectorType;
-    typedef Tridiagonalization<MatrixType> TridiagonalizationType;
-    typedef typename TridiagonalizationType::SubDiagonalType SubDiagonalType;
+  /** \brief Real scalar type for \p MatrixType_.
+   *
+   * This is just \c Scalar if #Scalar is real (e.g., \c float or
+   * \c double), and the type of the real part of \c Scalar if #Scalar is
+   * complex.
+   */
+  typedef typename NumTraits<Scalar>::Real RealScalar;
 
-    /** \brief Default constructor for fixed-size matrices.
-      *
-      * The default constructor is useful in cases in which the user intends to
-      * perform decompositions via compute(). This constructor
-      * can only be used if \p MatrixType_ is a fixed-size matrix; use
-      * SelfAdjointEigenSolver(Index) for dynamic-size matrices.
-      *
-      * Example: \include SelfAdjointEigenSolver_SelfAdjointEigenSolver.cpp
-      * Output: \verbinclude SelfAdjointEigenSolver_SelfAdjointEigenSolver.out
-      */
-    EIGEN_DEVICE_FUNC
-    SelfAdjointEigenSolver()
-        : m_eivec(),
-          m_workspace(),
-          m_eivalues(),
-          m_subdiag(),
-          m_hcoeffs(),
-          m_info(InvalidInput),
-          m_isInitialized(false),
-          m_eigenvectorsOk(false)
-    { }
+  friend struct internal::direct_selfadjoint_eigenvalues<SelfAdjointEigenSolver, Size, NumTraits<Scalar>::IsComplex>;
 
-    /** \brief Constructor, pre-allocates memory for dynamic-size matrices.
-      *
-      * \param [in]  size  Positive integer, size of the matrix whose
-      * eigenvalues and eigenvectors will be computed.
-      *
-      * This constructor is useful for dynamic-size matrices, when the user
-      * intends to perform decompositions via compute(). The \p size
-      * parameter is only used as a hint. It is not an error to give a wrong
-      * \p size, but it may impair performance.
-      *
-      * \sa compute() for an example
-      */
-    EIGEN_DEVICE_FUNC
-    explicit SelfAdjointEigenSolver(Index size)
-        : m_eivec(size, size),
-          m_workspace(size),
-          m_eivalues(size),
-          m_subdiag(size > 1 ? size - 1 : 1),
-          m_hcoeffs(size > 1 ? size - 1 : 1),
-          m_isInitialized(false),
-          m_eigenvectorsOk(false)
-    {}
+  /** \brief Type for vector of eigenvalues as returned by eigenvalues().
+   *
+   * This is a column vector with entries of type #RealScalar.
+   * The length of the vector is the size of \p MatrixType_.
+   */
+  typedef typename internal::plain_col_type<MatrixType, Scalar>::type VectorType;
+  typedef typename internal::plain_col_type<MatrixType, RealScalar>::type RealVectorType;
+  typedef Tridiagonalization<MatrixType> TridiagonalizationType;
+  typedef typename TridiagonalizationType::SubDiagonalType SubDiagonalType;
 
-    /** \brief Constructor; computes eigendecomposition of given matrix.
-      *
-      * \param[in]  matrix  Selfadjoint matrix whose eigendecomposition is to
-      *    be computed. Only the lower triangular part of the matrix is referenced.
-      * \param[in]  options Can be #ComputeEigenvectors (default) or #EigenvaluesOnly.
-      *
-      * This constructor calls compute(const MatrixType&, int) to compute the
-      * eigenvalues of the matrix \p matrix. The eigenvectors are computed if
-      * \p options equals #ComputeEigenvectors.
-      *
-      * Example: \include SelfAdjointEigenSolver_SelfAdjointEigenSolver_MatrixType.cpp
-      * Output: \verbinclude SelfAdjointEigenSolver_SelfAdjointEigenSolver_MatrixType.out
-      *
-      * \sa compute(const MatrixType&, int)
-      */
-    template<typename InputType>
-    EIGEN_DEVICE_FUNC
-    explicit SelfAdjointEigenSolver(const EigenBase<InputType>& matrix, int options = ComputeEigenvectors)
+  /** \brief Default constructor for fixed-size matrices.
+   *
+   * The default constructor is useful in cases in which the user intends to
+   * perform decompositions via compute(). This constructor
+   * can only be used if \p MatrixType_ is a fixed-size matrix; use
+   * SelfAdjointEigenSolver(Index) for dynamic-size matrices.
+   *
+   * Example: \include SelfAdjointEigenSolver_SelfAdjointEigenSolver.cpp
+   * Output: \verbinclude SelfAdjointEigenSolver_SelfAdjointEigenSolver.out
+   */
+  EIGEN_DEVICE_FUNC SelfAdjointEigenSolver()
+      : m_eivec(),
+        m_workspace(),
+        m_eivalues(),
+        m_subdiag(),
+        m_hcoeffs(),
+        m_info(InvalidInput),
+        m_isInitialized(false),
+        m_eigenvectorsOk(false) {}
+
+  /** \brief Constructor, pre-allocates memory for dynamic-size matrices.
+   *
+   * \param [in]  size  Positive integer, size of the matrix whose
+   * eigenvalues and eigenvectors will be computed.
+   *
+   * This constructor is useful for dynamic-size matrices, when the user
+   * intends to perform decompositions via compute(). The \p size
+   * parameter is only used as a hint. It is not an error to give a wrong
+   * \p size, but it may impair performance.
+   *
+   * \sa compute() for an example
+   */
+  EIGEN_DEVICE_FUNC explicit SelfAdjointEigenSolver(Index size)
+      : m_eivec(size, size),
+        m_workspace(size),
+        m_eivalues(size),
+        m_subdiag(size > 1 ? size - 1 : 1),
+        m_hcoeffs(size > 1 ? size - 1 : 1),
+        m_isInitialized(false),
+        m_eigenvectorsOk(false) {}
+
+  /** \brief Constructor; computes eigendecomposition of given matrix.
+   *
+   * \param[in]  matrix  Selfadjoint matrix whose eigendecomposition is to
+   *    be computed. Only the lower triangular part of the matrix is referenced.
+   * \param[in]  options Can be #ComputeEigenvectors (default) or #EigenvaluesOnly.
+   *
+   * This constructor calls compute(const MatrixType&, int) to compute the
+   * eigenvalues of the matrix \p matrix. The eigenvectors are computed if
+   * \p options equals #ComputeEigenvectors.
+   *
+   * Example: \include SelfAdjointEigenSolver_SelfAdjointEigenSolver_MatrixType.cpp
+   * Output: \verbinclude SelfAdjointEigenSolver_SelfAdjointEigenSolver_MatrixType.out
+   *
+   * \sa compute(const MatrixType&, int)
+   */
+  template <typename InputType>
+  EIGEN_DEVICE_FUNC explicit SelfAdjointEigenSolver(const EigenBase<InputType>& matrix,
+                                                    int options = ComputeEigenvectors)
       : m_eivec(matrix.rows(), matrix.cols()),
         m_workspace(matrix.cols()),
         m_eivalues(matrix.cols()),
         m_subdiag(matrix.rows() > 1 ? matrix.rows() - 1 : 1),
         m_hcoeffs(matrix.cols() > 1 ? matrix.cols() - 1 : 1),
         m_isInitialized(false),
-        m_eigenvectorsOk(false)
-    {
-      compute(matrix.derived(), options);
-    }
+        m_eigenvectorsOk(false) {
+    compute(matrix.derived(), options);
+  }
 
-    /** \brief Computes eigendecomposition of given matrix.
-      *
-      * \param[in]  matrix  Selfadjoint matrix whose eigendecomposition is to
-      *    be computed. Only the lower triangular part of the matrix is referenced.
-      * \param[in]  options Can be #ComputeEigenvectors (default) or #EigenvaluesOnly.
-      * \returns    Reference to \c *this
-      *
-      * This function computes the eigenvalues of \p matrix.  The eigenvalues()
-      * function can be used to retrieve them.  If \p options equals #ComputeEigenvectors,
-      * then the eigenvectors are also computed and can be retrieved by
-      * calling eigenvectors().
-      *
-      * This implementation uses a symmetric QR algorithm. The matrix is first
-      * reduced to tridiagonal form using the Tridiagonalization class. The
-      * tridiagonal matrix is then brought to diagonal form with implicit
-      * symmetric QR steps with Wilkinson shift. Details can be found in
-      * Section 8.3 of Golub \& Van Loan, <i>%Matrix Computations</i>.
-      *
-      * The cost of the computation is about \f$ 9n^3 \f$ if the eigenvectors
-      * are required and \f$ 4n^3/3 \f$ if they are not required.
-      *
-      * This method reuses the memory in the SelfAdjointEigenSolver object that
-      * was allocated when the object was constructed, if the size of the
-      * matrix does not change.
-      *
-      * Example: \include SelfAdjointEigenSolver_compute_MatrixType.cpp
-      * Output: \verbinclude SelfAdjointEigenSolver_compute_MatrixType.out
-      *
-      * \sa SelfAdjointEigenSolver(const MatrixType&, int)
-      */
-    template<typename InputType>
-    EIGEN_DEVICE_FUNC
-    SelfAdjointEigenSolver& compute(const EigenBase<InputType>& matrix, int options = ComputeEigenvectors);
-    
-    /** \brief Computes eigendecomposition of given matrix using a closed-form algorithm
-      *
-      * This is a variant of compute(const MatrixType&, int options) which
-      * directly solves the underlying polynomial equation.
-      * 
-      * Currently only 2x2 and 3x3 matrices for which the sizes are known at compile time are supported (e.g., Matrix3d).
-      * 
-      * This method is usually significantly faster than the QR iterative algorithm
-      * but it might also be less accurate. It is also worth noting that
-      * for 3x3 matrices it involves trigonometric operations which are
-      * not necessarily available for all scalar types.
-      * 
-      * For the 3x3 case, we observed the following worst case relative error regarding the eigenvalues:
-      *   - double: 1e-8
-      *   - float:  1e-3
-      *
-      * \sa compute(const MatrixType&, int options)
-      */
-    EIGEN_DEVICE_FUNC
-    SelfAdjointEigenSolver& computeDirect(const MatrixType& matrix, int options = ComputeEigenvectors);
+  /** \brief Computes eigendecomposition of given matrix.
+   *
+   * \param[in]  matrix  Selfadjoint matrix whose eigendecomposition is to
+   *    be computed. Only the lower triangular part of the matrix is referenced.
+   * \param[in]  options Can be #ComputeEigenvectors (default) or #EigenvaluesOnly.
+   * \returns    Reference to \c *this
+   *
+   * This function computes the eigenvalues of \p matrix.  The eigenvalues()
+   * function can be used to retrieve them.  If \p options equals #ComputeEigenvectors,
+   * then the eigenvectors are also computed and can be retrieved by
+   * calling eigenvectors().
+   *
+   * This implementation uses a symmetric QR algorithm. The matrix is first
+   * reduced to tridiagonal form using the Tridiagonalization class. The
+   * tridiagonal matrix is then brought to diagonal form with implicit
+   * symmetric QR steps with Wilkinson shift. Details can be found in
+   * Section 8.3 of Golub \& Van Loan, <i>%Matrix Computations</i>.
+   *
+   * The cost of the computation is about \f$ 9n^3 \f$ if the eigenvectors
+   * are required and \f$ 4n^3/3 \f$ if they are not required.
+   *
+   * This method reuses the memory in the SelfAdjointEigenSolver object that
+   * was allocated when the object was constructed, if the size of the
+   * matrix does not change.
+   *
+   * Example: \include SelfAdjointEigenSolver_compute_MatrixType.cpp
+   * Output: \verbinclude SelfAdjointEigenSolver_compute_MatrixType.out
+   *
+   * \sa SelfAdjointEigenSolver(const MatrixType&, int)
+   */
+  template <typename InputType>
+  EIGEN_DEVICE_FUNC SelfAdjointEigenSolver& compute(const EigenBase<InputType>& matrix,
+                                                    int options = ComputeEigenvectors);
 
-    /**
-      *\brief Computes the eigen decomposition from a tridiagonal symmetric matrix
-      *
-      * \param[in] diag The vector containing the diagonal of the matrix.
-      * \param[in] subdiag The subdiagonal of the matrix.
-      * \param[in] options Can be #ComputeEigenvectors (default) or #EigenvaluesOnly.
-      * \returns Reference to \c *this
-      *
-      * This function assumes that the matrix has been reduced to tridiagonal form.
-      *
-      * \sa compute(const MatrixType&, int) for more information
-      */
-    SelfAdjointEigenSolver& computeFromTridiagonal(const RealVectorType& diag, const SubDiagonalType& subdiag , int options=ComputeEigenvectors);
+  /** \brief Computes eigendecomposition of given matrix using a closed-form algorithm
+   *
+   * This is a variant of compute(const MatrixType&, int options) which
+   * directly solves the underlying polynomial equation.
+   *
+   * Currently only 2x2 and 3x3 matrices for which the sizes are known at compile time are supported (e.g., Matrix3d).
+   *
+   * This method is usually significantly faster than the QR iterative algorithm
+   * but it might also be less accurate. It is also worth noting that
+   * for 3x3 matrices it involves trigonometric operations which are
+   * not necessarily available for all scalar types.
+   *
+   * For the 3x3 case, we observed the following worst case relative error regarding the eigenvalues:
+   *   - double: 1e-8
+   *   - float:  1e-3
+   *
+   * \sa compute(const MatrixType&, int options)
+   */
+  EIGEN_DEVICE_FUNC SelfAdjointEigenSolver& computeDirect(const MatrixType& matrix, int options = ComputeEigenvectors);
 
-    /** \brief Returns the eigenvectors of given matrix.
-      *
-      * \returns  A const reference to the matrix whose columns are the eigenvectors.
-      *
-      * \pre The eigenvectors have been computed before.
-      *
-      * Column \f$ k \f$ of the returned matrix is an eigenvector corresponding
-      * to eigenvalue number \f$ k \f$ as returned by eigenvalues().  The
-      * eigenvectors are normalized to have (Euclidean) norm equal to one. If
-      * this object was used to solve the eigenproblem for the selfadjoint
-      * matrix \f$ A \f$, then the matrix returned by this function is the
-      * matrix \f$ V \f$ in the eigendecomposition \f$ A = V D V^{-1} \f$.
-      *
-      * For a selfadjoint matrix, \f$ V \f$ is unitary, meaning its inverse is equal
-      * to its adjoint, \f$ V^{-1} = V^{\dagger} \f$. If \f$ A \f$ is real, then
-      * \f$ V \f$ is also real and therefore orthogonal, meaning its inverse is
-      * equal to its transpose, \f$ V^{-1} = V^T \f$.
-      *
-      * Example: \include SelfAdjointEigenSolver_eigenvectors.cpp
-      * Output: \verbinclude SelfAdjointEigenSolver_eigenvectors.out
-      *
-      * \sa eigenvalues()
-      */
-    EIGEN_DEVICE_FUNC
-    const EigenvectorsType& eigenvectors() const
-    {
-      eigen_assert(m_isInitialized && "SelfAdjointEigenSolver is not initialized.");
-      eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
-      return m_eivec;
-    }
+  /**
+   *\brief Computes the eigen decomposition from a tridiagonal symmetric matrix
+   *
+   * \param[in] diag The vector containing the diagonal of the matrix.
+   * \param[in] subdiag The subdiagonal of the matrix.
+   * \param[in] options Can be #ComputeEigenvectors (default) or #EigenvaluesOnly.
+   * \returns Reference to \c *this
+   *
+   * This function assumes that the matrix has been reduced to tridiagonal form.
+   *
+   * \sa compute(const MatrixType&, int) for more information
+   */
+  SelfAdjointEigenSolver& computeFromTridiagonal(const RealVectorType& diag, const SubDiagonalType& subdiag,
+                                                 int options = ComputeEigenvectors);
 
-    /** \brief Returns the eigenvalues of given matrix.
-      *
-      * \returns A const reference to the column vector containing the eigenvalues.
-      *
-      * \pre The eigenvalues have been computed before.
-      *
-      * The eigenvalues are repeated according to their algebraic multiplicity,
-      * so there are as many eigenvalues as rows in the matrix. The eigenvalues
-      * are sorted in increasing order.
-      *
-      * Example: \include SelfAdjointEigenSolver_eigenvalues.cpp
-      * Output: \verbinclude SelfAdjointEigenSolver_eigenvalues.out
-      *
-      * \sa eigenvectors(), MatrixBase::eigenvalues()
-      */
-    EIGEN_DEVICE_FUNC
-    const RealVectorType& eigenvalues() const
-    {
-      eigen_assert(m_isInitialized && "SelfAdjointEigenSolver is not initialized.");
-      return m_eivalues;
-    }
+  /** \brief Returns the eigenvectors of given matrix.
+   *
+   * \returns  A const reference to the matrix whose columns are the eigenvectors.
+   *
+   * \pre The eigenvectors have been computed before.
+   *
+   * Column \f$ k \f$ of the returned matrix is an eigenvector corresponding
+   * to eigenvalue number \f$ k \f$ as returned by eigenvalues().  The
+   * eigenvectors are normalized to have (Euclidean) norm equal to one. If
+   * this object was used to solve the eigenproblem for the selfadjoint
+   * matrix \f$ A \f$, then the matrix returned by this function is the
+   * matrix \f$ V \f$ in the eigendecomposition \f$ A = V D V^{-1} \f$.
+   *
+   * For a selfadjoint matrix, \f$ V \f$ is unitary, meaning its inverse is equal
+   * to its adjoint, \f$ V^{-1} = V^{\dagger} \f$. If \f$ A \f$ is real, then
+   * \f$ V \f$ is also real and therefore orthogonal, meaning its inverse is
+   * equal to its transpose, \f$ V^{-1} = V^T \f$.
+   *
+   * Example: \include SelfAdjointEigenSolver_eigenvectors.cpp
+   * Output: \verbinclude SelfAdjointEigenSolver_eigenvectors.out
+   *
+   * \sa eigenvalues()
+   */
+  EIGEN_DEVICE_FUNC const EigenvectorsType& eigenvectors() const {
+    eigen_assert(m_isInitialized && "SelfAdjointEigenSolver is not initialized.");
+    eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
+    return m_eivec;
+  }
 
-    /** \brief Computes the positive-definite square root of the matrix.
-      *
-      * \returns the positive-definite square root of the matrix
-      *
-      * \pre The eigenvalues and eigenvectors of a positive-definite matrix
-      * have been computed before.
-      *
-      * The square root of a positive-definite matrix \f$ A \f$ is the
-      * positive-definite matrix whose square equals \f$ A \f$. This function
-      * uses the eigendecomposition \f$ A = V D V^{-1} \f$ to compute the
-      * square root as \f$ A^{1/2} = V D^{1/2} V^{-1} \f$.
-      *
-      * Example: \include SelfAdjointEigenSolver_operatorSqrt.cpp
-      * Output: \verbinclude SelfAdjointEigenSolver_operatorSqrt.out
-      *
-      * \sa operatorInverseSqrt(), <a href="unsupported/group__MatrixFunctions__Module.html">MatrixFunctions Module</a>
-      */
-    EIGEN_DEVICE_FUNC
-    MatrixType operatorSqrt() const
-    {
-      eigen_assert(m_isInitialized && "SelfAdjointEigenSolver is not initialized.");
-      eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
-      return m_eivec * m_eivalues.cwiseSqrt().asDiagonal() * m_eivec.adjoint();
-    }
+  /** \brief Returns the eigenvalues of given matrix.
+   *
+   * \returns A const reference to the column vector containing the eigenvalues.
+   *
+   * \pre The eigenvalues have been computed before.
+   *
+   * The eigenvalues are repeated according to their algebraic multiplicity,
+   * so there are as many eigenvalues as rows in the matrix. The eigenvalues
+   * are sorted in increasing order.
+   *
+   * Example: \include SelfAdjointEigenSolver_eigenvalues.cpp
+   * Output: \verbinclude SelfAdjointEigenSolver_eigenvalues.out
+   *
+   * \sa eigenvectors(), MatrixBase::eigenvalues()
+   */
+  EIGEN_DEVICE_FUNC const RealVectorType& eigenvalues() const {
+    eigen_assert(m_isInitialized && "SelfAdjointEigenSolver is not initialized.");
+    return m_eivalues;
+  }
 
-    /** \brief Computes the inverse square root of the matrix.
-      *
-      * \returns the inverse positive-definite square root of the matrix
-      *
-      * \pre The eigenvalues and eigenvectors of a positive-definite matrix
-      * have been computed before.
-      *
-      * This function uses the eigendecomposition \f$ A = V D V^{-1} \f$ to
-      * compute the inverse square root as \f$ V D^{-1/2} V^{-1} \f$. This is
-      * cheaper than first computing the square root with operatorSqrt() and
-      * then its inverse with MatrixBase::inverse().
-      *
-      * Example: \include SelfAdjointEigenSolver_operatorInverseSqrt.cpp
-      * Output: \verbinclude SelfAdjointEigenSolver_operatorInverseSqrt.out
-      *
-      * \sa operatorSqrt(), MatrixBase::inverse(), <a href="unsupported/group__MatrixFunctions__Module.html">MatrixFunctions Module</a>
-      */
-    EIGEN_DEVICE_FUNC
-    MatrixType operatorInverseSqrt() const
-    {
-      eigen_assert(m_isInitialized && "SelfAdjointEigenSolver is not initialized.");
-      eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
-      return m_eivec * m_eivalues.cwiseInverse().cwiseSqrt().asDiagonal() * m_eivec.adjoint();
-    }
+  /** \brief Computes the positive-definite square root of the matrix.
+   *
+   * \returns the positive-definite square root of the matrix
+   *
+   * \pre The eigenvalues and eigenvectors of a positive-definite matrix
+   * have been computed before.
+   *
+   * The square root of a positive-definite matrix \f$ A \f$ is the
+   * positive-definite matrix whose square equals \f$ A \f$. This function
+   * uses the eigendecomposition \f$ A = V D V^{-1} \f$ to compute the
+   * square root as \f$ A^{1/2} = V D^{1/2} V^{-1} \f$.
+   *
+   * Example: \include SelfAdjointEigenSolver_operatorSqrt.cpp
+   * Output: \verbinclude SelfAdjointEigenSolver_operatorSqrt.out
+   *
+   * \sa operatorInverseSqrt(), <a href="unsupported/group__MatrixFunctions__Module.html">MatrixFunctions Module</a>
+   */
+  EIGEN_DEVICE_FUNC MatrixType operatorSqrt() const {
+    eigen_assert(m_isInitialized && "SelfAdjointEigenSolver is not initialized.");
+    eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
+    return m_eivec * m_eivalues.cwiseSqrt().asDiagonal() * m_eivec.adjoint();
+  }
 
-    /** \brief Reports whether previous computation was successful.
-      *
-      * \returns \c Success if computation was successful, \c NoConvergence otherwise.
-      */
-    EIGEN_DEVICE_FUNC
-    ComputationInfo info() const
-    {
-      eigen_assert(m_isInitialized && "SelfAdjointEigenSolver is not initialized.");
-      return m_info;
-    }
+  /** \brief Computes the inverse square root of the matrix.
+   *
+   * \returns the inverse positive-definite square root of the matrix
+   *
+   * \pre The eigenvalues and eigenvectors of a positive-definite matrix
+   * have been computed before.
+   *
+   * This function uses the eigendecomposition \f$ A = V D V^{-1} \f$ to
+   * compute the inverse square root as \f$ V D^{-1/2} V^{-1} \f$. This is
+   * cheaper than first computing the square root with operatorSqrt() and
+   * then its inverse with MatrixBase::inverse().
+   *
+   * Example: \include SelfAdjointEigenSolver_operatorInverseSqrt.cpp
+   * Output: \verbinclude SelfAdjointEigenSolver_operatorInverseSqrt.out
+   *
+   * \sa operatorSqrt(), MatrixBase::inverse(), <a
+   * href="unsupported/group__MatrixFunctions__Module.html">MatrixFunctions Module</a>
+   */
+  EIGEN_DEVICE_FUNC MatrixType operatorInverseSqrt() const {
+    eigen_assert(m_isInitialized && "SelfAdjointEigenSolver is not initialized.");
+    eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
+    return m_eivec * m_eivalues.cwiseInverse().cwiseSqrt().asDiagonal() * m_eivec.adjoint();
+  }
 
-    /** \brief Maximum number of iterations.
-      *
-      * The algorithm terminates if it does not converge within m_maxIterations * n iterations, where n
-      * denotes the size of the matrix. This value is currently set to 30 (copied from LAPACK).
-      */
-    static const int m_maxIterations = 30;
+  /** \brief Reports whether previous computation was successful.
+   *
+   * \returns \c Success if computation was successful, \c NoConvergence otherwise.
+   */
+  EIGEN_DEVICE_FUNC ComputationInfo info() const {
+    eigen_assert(m_isInitialized && "SelfAdjointEigenSolver is not initialized.");
+    return m_info;
+  }
 
-  protected:
-    EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
+  /** \brief Maximum number of iterations.
+   *
+   * The algorithm terminates if it does not converge within m_maxIterations * n iterations, where n
+   * denotes the size of the matrix. This value is currently set to 30 (copied from LAPACK).
+   */
+  static const int m_maxIterations = 30;
 
-    EigenvectorsType m_eivec;
-    VectorType m_workspace;
-    RealVectorType m_eivalues;
-    typename TridiagonalizationType::SubDiagonalType m_subdiag;
-    typename TridiagonalizationType::CoeffVectorType m_hcoeffs;
-    ComputationInfo m_info;
-    bool m_isInitialized;
-    bool m_eigenvectorsOk;
+ protected:
+  EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
+
+  EigenvectorsType m_eivec;
+  VectorType m_workspace;
+  RealVectorType m_eivalues;
+  typename TridiagonalizationType::SubDiagonalType m_subdiag;
+  typename TridiagonalizationType::CoeffVectorType m_hcoeffs;
+  ComputationInfo m_info;
+  bool m_isInitialized;
+  bool m_eigenvectorsOk;
 };
 
 namespace internal {
 /** \internal
-  *
-  * \eigenvalues_module \ingroup Eigenvalues_Module
-  *
-  * Performs a QR step on a tridiagonal symmetric matrix represented as a
-  * pair of two vectors \a diag and \a subdiag.
-  *
-  * \param diag the diagonal part of the input selfadjoint tridiagonal matrix
-  * \param subdiag the sub-diagonal part of the input selfadjoint tridiagonal matrix
-  * \param start starting index of the submatrix to work on
-  * \param end last+1 index of the submatrix to work on
-  * \param matrixQ pointer to the column-major matrix holding the eigenvectors, can be 0
-  * \param n size of the input matrix
-  *
-  * For compilation efficiency reasons, this procedure does not use eigen expression
-  * for its arguments.
-  *
-  * Implemented from Golub's "Matrix Computations", algorithm 8.3.2:
-  * "implicit symmetric QR step with Wilkinson shift"
-  */
-template<int StorageOrder,typename RealScalar, typename Scalar, typename Index>
-EIGEN_DEVICE_FUNC
-static void tridiagonal_qr_step(RealScalar* diag, RealScalar* subdiag, Index start, Index end, Scalar* matrixQ, Index n);
-}
+ *
+ * \eigenvalues_module \ingroup Eigenvalues_Module
+ *
+ * Performs a QR step on a tridiagonal symmetric matrix represented as a
+ * pair of two vectors \a diag and \a subdiag.
+ *
+ * \param diag the diagonal part of the input selfadjoint tridiagonal matrix
+ * \param subdiag the sub-diagonal part of the input selfadjoint tridiagonal matrix
+ * \param start starting index of the submatrix to work on
+ * \param end last+1 index of the submatrix to work on
+ * \param matrixQ pointer to the column-major matrix holding the eigenvectors, can be 0
+ * \param n size of the input matrix
+ *
+ * For compilation efficiency reasons, this procedure does not use eigen expression
+ * for its arguments.
+ *
+ * Implemented from Golub's "Matrix Computations", algorithm 8.3.2:
+ * "implicit symmetric QR step with Wilkinson shift"
+ */
+template <int StorageOrder, typename RealScalar, typename Scalar, typename Index>
+EIGEN_DEVICE_FUNC static void tridiagonal_qr_step(RealScalar* diag, RealScalar* subdiag, Index start, Index end,
+                                                  Scalar* matrixQ, Index n);
+}  // namespace internal
 
-template<typename MatrixType>
-template<typename InputType>
-EIGEN_DEVICE_FUNC
-SelfAdjointEigenSolver<MatrixType>& SelfAdjointEigenSolver<MatrixType>
-::compute(const EigenBase<InputType>& a_matrix, int options)
-{
-  const InputType &matrix(a_matrix.derived());
+template <typename MatrixType>
+template <typename InputType>
+EIGEN_DEVICE_FUNC SelfAdjointEigenSolver<MatrixType>& SelfAdjointEigenSolver<MatrixType>::compute(
+    const EigenBase<InputType>& a_matrix, int options) {
+  const InputType& matrix(a_matrix.derived());
 
   EIGEN_USING_STD(abs);
   eigen_assert(matrix.cols() == matrix.rows());
-  eigen_assert((options&~(EigVecMask|GenEigMask))==0
-          && (options&EigVecMask)!=EigVecMask
-          && "invalid option parameter");
-  bool computeEigenvectors = (options&ComputeEigenvectors)==ComputeEigenvectors;
+  eigen_assert((options & ~(EigVecMask | GenEigMask)) == 0 && (options & EigVecMask) != EigVecMask &&
+               "invalid option parameter");
+  bool computeEigenvectors = (options & ComputeEigenvectors) == ComputeEigenvectors;
   Index n = matrix.cols();
-  m_eivalues.resize(n,1);
+  m_eivalues.resize(n, 1);
 
-  if(n==1)
-  {
+  if (n == 1) {
     m_eivec = matrix;
-    m_eivalues.coeffRef(0,0) = numext::real(m_eivec.coeff(0,0));
-    if(computeEigenvectors)
-      m_eivec.setOnes(n,n);
+    m_eivalues.coeffRef(0, 0) = numext::real(m_eivec.coeff(0, 0));
+    if (computeEigenvectors) m_eivec.setOnes(n, n);
     m_info = Success;
     m_isInitialized = true;
     m_eigenvectorsOk = computeEigenvectors;
@@ -453,14 +435,14 @@
   // map the matrix coefficients to [-1:1] to avoid over- and underflow.
   mat = matrix.template triangularView<Lower>();
   RealScalar scale = mat.cwiseAbs().maxCoeff();
-  if(numext::is_exactly_zero(scale)) scale = RealScalar(1);
+  if (numext::is_exactly_zero(scale)) scale = RealScalar(1);
   mat.template triangularView<Lower>() /= scale;
-  m_subdiag.resize(n-1);
-  m_hcoeffs.resize(n-1);
+  m_subdiag.resize(n - 1);
+  m_hcoeffs.resize(n - 1);
   internal::tridiagonalization_inplace(mat, diag, m_subdiag, m_hcoeffs, m_workspace, computeEigenvectors);
 
   m_info = internal::computeFromTridiagonal_impl(diag, m_subdiag, m_maxIterations, computeEigenvectors, m_eivec);
-  
+
   // scale back the eigen values
   m_eivalues *= scale;
 
@@ -469,17 +451,15 @@
   return *this;
 }
 
-template<typename MatrixType>
-SelfAdjointEigenSolver<MatrixType>& SelfAdjointEigenSolver<MatrixType>
-::computeFromTridiagonal(const RealVectorType& diag, const SubDiagonalType& subdiag , int options)
-{
-  //TODO : Add an option to scale the values beforehand
-  bool computeEigenvectors = (options&ComputeEigenvectors)==ComputeEigenvectors;
+template <typename MatrixType>
+SelfAdjointEigenSolver<MatrixType>& SelfAdjointEigenSolver<MatrixType>::computeFromTridiagonal(
+    const RealVectorType& diag, const SubDiagonalType& subdiag, int options) {
+  // TODO : Add an option to scale the values beforehand
+  bool computeEigenvectors = (options & ComputeEigenvectors) == ComputeEigenvectors;
 
   m_eivalues = diag;
   m_subdiag = subdiag;
-  if (computeEigenvectors)
-  {
+  if (computeEigenvectors) {
     m_eivec.setIdentity(diag.size(), diag.size());
   }
   m_info = internal::computeFromTridiagonal_impl(m_eivalues, m_subdiag, m_maxIterations, computeEigenvectors, m_eivec);
@@ -491,63 +471,60 @@
 
 namespace internal {
 /**
-  * \internal
-  * \brief Compute the eigendecomposition from a tridiagonal matrix
-  *
-  * \param[in,out] diag : On input, the diagonal of the matrix, on output the eigenvalues
-  * \param[in,out] subdiag : The subdiagonal part of the matrix (entries are modified during the decomposition)
-  * \param[in] maxIterations : the maximum number of iterations
-  * \param[in] computeEigenvectors : whether the eigenvectors have to be computed or not
-  * \param[out] eivec : The matrix to store the eigenvectors if computeEigenvectors==true. Must be allocated on input.
-  * \returns \c Success or \c NoConvergence
-  */
-template<typename MatrixType, typename DiagType, typename SubDiagType>
-EIGEN_DEVICE_FUNC
-ComputationInfo computeFromTridiagonal_impl(DiagType& diag, SubDiagType& subdiag, const Index maxIterations, bool computeEigenvectors, MatrixType& eivec)
-{
+ * \internal
+ * \brief Compute the eigendecomposition from a tridiagonal matrix
+ *
+ * \param[in,out] diag : On input, the diagonal of the matrix, on output the eigenvalues
+ * \param[in,out] subdiag : The subdiagonal part of the matrix (entries are modified during the decomposition)
+ * \param[in] maxIterations : the maximum number of iterations
+ * \param[in] computeEigenvectors : whether the eigenvectors have to be computed or not
+ * \param[out] eivec : The matrix to store the eigenvectors if computeEigenvectors==true. Must be allocated on input.
+ * \returns \c Success or \c NoConvergence
+ */
+template <typename MatrixType, typename DiagType, typename SubDiagType>
+EIGEN_DEVICE_FUNC ComputationInfo computeFromTridiagonal_impl(DiagType& diag, SubDiagType& subdiag,
+                                                              const Index maxIterations, bool computeEigenvectors,
+                                                              MatrixType& eivec) {
   ComputationInfo info;
   typedef typename MatrixType::Scalar Scalar;
 
   Index n = diag.size();
-  Index end = n-1;
+  Index end = n - 1;
   Index start = 0;
-  Index iter = 0; // total number of iterations
-  
+  Index iter = 0;  // total number of iterations
+
   typedef typename DiagType::RealScalar RealScalar;
   const RealScalar considerAsZero = (std::numeric_limits<RealScalar>::min)();
-  const RealScalar precision_inv = RealScalar(1)/NumTraits<RealScalar>::epsilon();
-  while (end>0)
-  {
-    for (Index i = start; i<end; ++i) {
+  const RealScalar precision_inv = RealScalar(1) / NumTraits<RealScalar>::epsilon();
+  while (end > 0) {
+    for (Index i = start; i < end; ++i) {
       if (numext::abs(subdiag[i]) < considerAsZero) {
         subdiag[i] = RealScalar(0);
       } else {
         // abs(subdiag[i]) <= epsilon * sqrt(abs(diag[i]) + abs(diag[i+1]))
         // Scaled to prevent underflows.
         const RealScalar scaled_subdiag = precision_inv * subdiag[i];
-        if (scaled_subdiag * scaled_subdiag <= (numext::abs(diag[i])+numext::abs(diag[i+1]))) {
+        if (scaled_subdiag * scaled_subdiag <= (numext::abs(diag[i]) + numext::abs(diag[i + 1]))) {
           subdiag[i] = RealScalar(0);
         }
       }
     }
 
     // find the largest unreduced block at the end of the matrix.
-    while (end>0 && numext::is_exactly_zero(subdiag[end - 1]))
-    {
+    while (end > 0 && numext::is_exactly_zero(subdiag[end - 1])) {
       end--;
     }
-    if (end<=0)
-      break;
+    if (end <= 0) break;
 
     // if we spent too many iterations, we give up
     iter++;
-    if(iter > maxIterations * n) break;
+    if (iter > maxIterations * n) break;
 
     start = end - 1;
-    while (start>0 && !numext::is_exactly_zero(subdiag[start - 1]))
-      start--;
+    while (start > 0 && !numext::is_exactly_zero(subdiag[start - 1])) start--;
 
-    internal::tridiagonal_qr_step<MatrixType::Flags&RowMajorBit ? RowMajor : ColMajor>(diag.data(), subdiag.data(), start, end, computeEigenvectors ? eivec.data() : (Scalar*)0, n);
+    internal::tridiagonal_qr_step<MatrixType::Flags & RowMajorBit ? RowMajor : ColMajor>(
+        diag.data(), subdiag.data(), start, end, computeEigenvectors ? eivec.data() : (Scalar*)0, n);
   }
   if (iter <= maxIterations * n)
     info = Success;
@@ -557,84 +534,78 @@
   // Sort eigenvalues and corresponding vectors.
   // TODO make the sort optional ?
   // TODO use a better sort algorithm !!
-  if (info == Success)
-  {
-    for (Index i = 0; i < n-1; ++i)
-    {
+  if (info == Success) {
+    for (Index i = 0; i < n - 1; ++i) {
       Index k;
-      diag.segment(i,n-i).minCoeff(&k);
-      if (k > 0)
-      {
-        numext::swap(diag[i], diag[k+i]);
-        if(computeEigenvectors)
-          eivec.col(i).swap(eivec.col(k+i));
+      diag.segment(i, n - i).minCoeff(&k);
+      if (k > 0) {
+        numext::swap(diag[i], diag[k + i]);
+        if (computeEigenvectors) eivec.col(i).swap(eivec.col(k + i));
       }
     }
   }
   return info;
 }
-  
-template<typename SolverType,int Size,bool IsComplex> struct direct_selfadjoint_eigenvalues
-{
-  EIGEN_DEVICE_FUNC
-  static inline void run(SolverType& eig, const typename SolverType::MatrixType& A, int options)
-  { eig.compute(A,options); }
+
+template <typename SolverType, int Size, bool IsComplex>
+struct direct_selfadjoint_eigenvalues {
+  EIGEN_DEVICE_FUNC static inline void run(SolverType& eig, const typename SolverType::MatrixType& A, int options) {
+    eig.compute(A, options);
+  }
 };
 
-template<typename SolverType> struct direct_selfadjoint_eigenvalues<SolverType,3,false>
-{
+template <typename SolverType>
+struct direct_selfadjoint_eigenvalues<SolverType, 3, false> {
   typedef typename SolverType::MatrixType MatrixType;
   typedef typename SolverType::RealVectorType VectorType;
   typedef typename SolverType::Scalar Scalar;
   typedef typename SolverType::EigenvectorsType EigenvectorsType;
-  
 
   /** \internal
    * Computes the roots of the characteristic polynomial of \a m.
    * For numerical stability m.trace() should be near zero and to avoid over- or underflow m should be normalized.
    */
-  EIGEN_DEVICE_FUNC
-  static inline void computeRoots(const MatrixType& m, VectorType& roots)
-  {
+  EIGEN_DEVICE_FUNC static inline void computeRoots(const MatrixType& m, VectorType& roots) {
     EIGEN_USING_STD(sqrt)
     EIGEN_USING_STD(atan2)
     EIGEN_USING_STD(cos)
     EIGEN_USING_STD(sin)
-    const Scalar s_inv3 = Scalar(1)/Scalar(3);
+    const Scalar s_inv3 = Scalar(1) / Scalar(3);
     const Scalar s_sqrt3 = sqrt(Scalar(3));
 
     // The characteristic equation is x^3 - c2*x^2 + c1*x - c0 = 0.  The
     // eigenvalues are the roots to this equation, all guaranteed to be
     // real-valued, because the matrix is symmetric.
-    Scalar c0 = m(0,0)*m(1,1)*m(2,2) + Scalar(2)*m(1,0)*m(2,0)*m(2,1) - m(0,0)*m(2,1)*m(2,1) - m(1,1)*m(2,0)*m(2,0) - m(2,2)*m(1,0)*m(1,0);
-    Scalar c1 = m(0,0)*m(1,1) - m(1,0)*m(1,0) + m(0,0)*m(2,2) - m(2,0)*m(2,0) + m(1,1)*m(2,2) - m(2,1)*m(2,1);
-    Scalar c2 = m(0,0) + m(1,1) + m(2,2);
+    Scalar c0 = m(0, 0) * m(1, 1) * m(2, 2) + Scalar(2) * m(1, 0) * m(2, 0) * m(2, 1) - m(0, 0) * m(2, 1) * m(2, 1) -
+                m(1, 1) * m(2, 0) * m(2, 0) - m(2, 2) * m(1, 0) * m(1, 0);
+    Scalar c1 = m(0, 0) * m(1, 1) - m(1, 0) * m(1, 0) + m(0, 0) * m(2, 2) - m(2, 0) * m(2, 0) + m(1, 1) * m(2, 2) -
+                m(2, 1) * m(2, 1);
+    Scalar c2 = m(0, 0) + m(1, 1) + m(2, 2);
 
     // Construct the parameters used in classifying the roots of the equation
     // and in solving the equation for the roots in closed form.
-    Scalar c2_over_3 = c2*s_inv3;
-    Scalar a_over_3 = (c2*c2_over_3 - c1)*s_inv3;
+    Scalar c2_over_3 = c2 * s_inv3;
+    Scalar a_over_3 = (c2 * c2_over_3 - c1) * s_inv3;
     a_over_3 = numext::maxi(a_over_3, Scalar(0));
 
-    Scalar half_b = Scalar(0.5)*(c0 + c2_over_3*(Scalar(2)*c2_over_3*c2_over_3 - c1));
+    Scalar half_b = Scalar(0.5) * (c0 + c2_over_3 * (Scalar(2) * c2_over_3 * c2_over_3 - c1));
 
-    Scalar q = a_over_3*a_over_3*a_over_3 - half_b*half_b;
+    Scalar q = a_over_3 * a_over_3 * a_over_3 - half_b * half_b;
     q = numext::maxi(q, Scalar(0));
 
     // Compute the eigenvalues by solving for the roots of the polynomial.
     Scalar rho = sqrt(a_over_3);
-    Scalar theta = atan2(sqrt(q),half_b)*s_inv3;  // since sqrt(q) > 0, atan2 is in [0, pi] and theta is in [0, pi/3]
+    Scalar theta = atan2(sqrt(q), half_b) * s_inv3;  // since sqrt(q) > 0, atan2 is in [0, pi] and theta is in [0, pi/3]
     Scalar cos_theta = cos(theta);
     Scalar sin_theta = sin(theta);
     // roots are already sorted, since cos is monotonically decreasing on [0, pi]
-    roots(0) = c2_over_3 - rho*(cos_theta + s_sqrt3*sin_theta); // == 2*rho*cos(theta+2pi/3)
-    roots(1) = c2_over_3 - rho*(cos_theta - s_sqrt3*sin_theta); // == 2*rho*cos(theta+ pi/3)
-    roots(2) = c2_over_3 + Scalar(2)*rho*cos_theta;
+    roots(0) = c2_over_3 - rho * (cos_theta + s_sqrt3 * sin_theta);  // == 2*rho*cos(theta+2pi/3)
+    roots(1) = c2_over_3 - rho * (cos_theta - s_sqrt3 * sin_theta);  // == 2*rho*cos(theta+ pi/3)
+    roots(2) = c2_over_3 + Scalar(2) * rho * cos_theta;
   }
 
-  EIGEN_DEVICE_FUNC
-  static inline bool extract_kernel(MatrixType& mat, Ref<VectorType> res, Ref<VectorType> representative)
-  {
+  EIGEN_DEVICE_FUNC static inline bool extract_kernel(MatrixType& mat, Ref<VectorType> res,
+                                                      Ref<VectorType> representative) {
     EIGEN_USING_STD(abs);
     EIGEN_USING_STD(sqrt);
     Index i0;
@@ -645,47 +616,43 @@
     representative = mat.col(i0);
     Scalar n0, n1;
     VectorType c0, c1;
-    n0 = (c0 = representative.cross(mat.col((i0+1)%3))).squaredNorm();
-    n1 = (c1 = representative.cross(mat.col((i0+2)%3))).squaredNorm();
-    if(n0>n1) res = c0/sqrt(n0);
-    else      res = c1/sqrt(n1);
+    n0 = (c0 = representative.cross(mat.col((i0 + 1) % 3))).squaredNorm();
+    n1 = (c1 = representative.cross(mat.col((i0 + 2) % 3))).squaredNorm();
+    if (n0 > n1)
+      res = c0 / sqrt(n0);
+    else
+      res = c1 / sqrt(n1);
 
     return true;
   }
 
-  EIGEN_DEVICE_FUNC
-  static inline void run(SolverType& solver, const MatrixType& mat, int options)
-  {
+  EIGEN_DEVICE_FUNC static inline void run(SolverType& solver, const MatrixType& mat, int options) {
     eigen_assert(mat.cols() == 3 && mat.cols() == mat.rows());
-    eigen_assert((options&~(EigVecMask|GenEigMask))==0
-            && (options&EigVecMask)!=EigVecMask
-            && "invalid option parameter");
-    bool computeEigenvectors = (options&ComputeEigenvectors)==ComputeEigenvectors;
-    
+    eigen_assert((options & ~(EigVecMask | GenEigMask)) == 0 && (options & EigVecMask) != EigVecMask &&
+                 "invalid option parameter");
+    bool computeEigenvectors = (options & ComputeEigenvectors) == ComputeEigenvectors;
+
     EigenvectorsType& eivecs = solver.m_eivec;
     VectorType& eivals = solver.m_eivalues;
-  
+
     // Shift the matrix to the mean eigenvalue and map the matrix coefficients to [-1:1] to avoid over- and underflow.
     Scalar shift = mat.trace() / Scalar(3);
-    // TODO Avoid this copy. Currently it is necessary to suppress bogus values when determining maxCoeff and for computing the eigenvectors later
+    // TODO Avoid this copy. Currently it is necessary to suppress bogus values when determining maxCoeff and for
+    // computing the eigenvectors later
     MatrixType scaledMat = mat.template selfadjointView<Lower>();
     scaledMat.diagonal().array() -= shift;
     Scalar scale = scaledMat.cwiseAbs().maxCoeff();
-    if(scale > 0) scaledMat /= scale;   // TODO for scale==0 we could save the remaining operations
+    if (scale > 0) scaledMat /= scale;  // TODO for scale==0 we could save the remaining operations
 
     // compute the eigenvalues
-    computeRoots(scaledMat,eivals);
+    computeRoots(scaledMat, eivals);
 
     // compute the eigenvectors
-    if(computeEigenvectors)
-    {
-      if((eivals(2)-eivals(0))<=Eigen::NumTraits<Scalar>::epsilon())
-      {
+    if (computeEigenvectors) {
+      if ((eivals(2) - eivals(0)) <= Eigen::NumTraits<Scalar>::epsilon()) {
         // All three eigenvalues are numerically the same
         eivecs.setIdentity();
-      }
-      else
-      {
+      } else {
         MatrixType tmp;
         tmp = scaledMat;
 
@@ -693,31 +660,27 @@
         Scalar d0 = eivals(2) - eivals(1);
         Scalar d1 = eivals(1) - eivals(0);
         Index k(0), l(2);
-        if(d0 > d1)
-        {
-          numext::swap(k,l);
+        if (d0 > d1) {
+          numext::swap(k, l);
           d0 = d1;
         }
 
         // Compute the eigenvector of index k
         {
-          tmp.diagonal().array () -= eivals(k);
+          tmp.diagonal().array() -= eivals(k);
           // By construction, 'tmp' is of rank 2, and its kernel corresponds to the respective eigenvector.
           extract_kernel(tmp, eivecs.col(k), eivecs.col(l));
         }
 
         // Compute eigenvector of index l
-        if(d0<=2*Eigen::NumTraits<Scalar>::epsilon()*d1)
-        {
+        if (d0 <= 2 * Eigen::NumTraits<Scalar>::epsilon() * d1) {
           // If d0 is too small, then the two other eigenvalues are numerically the same,
           // and thus we only have to ortho-normalize the near orthogonal vector we saved above.
-          eivecs.col(l) -= eivecs.col(k).dot(eivecs.col(l))*eivecs.col(l);
+          eivecs.col(l) -= eivecs.col(k).dot(eivecs.col(l)) * eivecs.col(l);
           eivecs.col(l).normalize();
-        }
-        else
-        {
+        } else {
           tmp = scaledMat;
-          tmp.diagonal().array () -= eivals(l);
+          tmp.diagonal().array() -= eivals(l);
 
           VectorType dummy;
           extract_kernel(tmp, eivecs.col(l), dummy);
@@ -731,7 +694,7 @@
     // Rescale back to the original size.
     eivals *= scale;
     eivals.array() += shift;
-    
+
     solver.m_info = Success;
     solver.m_isInitialized = true;
     solver.m_eigenvectorsOk = computeEigenvectors;
@@ -739,73 +702,59 @@
 };
 
 // 2x2 direct eigenvalues decomposition, code from Hauke Heibel
-template<typename SolverType> 
-struct direct_selfadjoint_eigenvalues<SolverType,2,false>
-{
+template <typename SolverType>
+struct direct_selfadjoint_eigenvalues<SolverType, 2, false> {
   typedef typename SolverType::MatrixType MatrixType;
   typedef typename SolverType::RealVectorType VectorType;
   typedef typename SolverType::Scalar Scalar;
   typedef typename SolverType::EigenvectorsType EigenvectorsType;
-  
-  EIGEN_DEVICE_FUNC
-  static inline void computeRoots(const MatrixType& m, VectorType& roots)
-  {
+
+  EIGEN_DEVICE_FUNC static inline void computeRoots(const MatrixType& m, VectorType& roots) {
     EIGEN_USING_STD(sqrt);
-    const Scalar t0 = Scalar(0.5) * sqrt( numext::abs2(m(0,0)-m(1,1)) + Scalar(4)*numext::abs2(m(1,0)));
-    const Scalar t1 = Scalar(0.5) * (m(0,0) + m(1,1));
+    const Scalar t0 = Scalar(0.5) * sqrt(numext::abs2(m(0, 0) - m(1, 1)) + Scalar(4) * numext::abs2(m(1, 0)));
+    const Scalar t1 = Scalar(0.5) * (m(0, 0) + m(1, 1));
     roots(0) = t1 - t0;
     roots(1) = t1 + t0;
   }
-  
-  EIGEN_DEVICE_FUNC
-  static inline void run(SolverType& solver, const MatrixType& mat, int options)
-  {
+
+  EIGEN_DEVICE_FUNC static inline void run(SolverType& solver, const MatrixType& mat, int options) {
     EIGEN_USING_STD(sqrt);
     EIGEN_USING_STD(abs);
-    
+
     eigen_assert(mat.cols() == 2 && mat.cols() == mat.rows());
-    eigen_assert((options&~(EigVecMask|GenEigMask))==0
-            && (options&EigVecMask)!=EigVecMask
-            && "invalid option parameter");
-    bool computeEigenvectors = (options&ComputeEigenvectors)==ComputeEigenvectors;
-    
+    eigen_assert((options & ~(EigVecMask | GenEigMask)) == 0 && (options & EigVecMask) != EigVecMask &&
+                 "invalid option parameter");
+    bool computeEigenvectors = (options & ComputeEigenvectors) == ComputeEigenvectors;
+
     EigenvectorsType& eivecs = solver.m_eivec;
     VectorType& eivals = solver.m_eivalues;
-  
+
     // Shift the matrix to the mean eigenvalue and map the matrix coefficients to [-1:1] to avoid over- and underflow.
     Scalar shift = mat.trace() / Scalar(2);
     MatrixType scaledMat = mat;
-    scaledMat.coeffRef(0,1) = mat.coeff(1,0);
+    scaledMat.coeffRef(0, 1) = mat.coeff(1, 0);
     scaledMat.diagonal().array() -= shift;
     Scalar scale = scaledMat.cwiseAbs().maxCoeff();
-    if(scale > Scalar(0))
-      scaledMat /= scale;
+    if (scale > Scalar(0)) scaledMat /= scale;
 
     // Compute the eigenvalues
-    computeRoots(scaledMat,eivals);
+    computeRoots(scaledMat, eivals);
 
     // compute the eigen vectors
-    if(computeEigenvectors)
-    {
-      if((eivals(1)-eivals(0))<=abs(eivals(1))*Eigen::NumTraits<Scalar>::epsilon())
-      {
+    if (computeEigenvectors) {
+      if ((eivals(1) - eivals(0)) <= abs(eivals(1)) * Eigen::NumTraits<Scalar>::epsilon()) {
         eivecs.setIdentity();
-      }
-      else
-      {
-        scaledMat.diagonal().array () -= eivals(1);
-        Scalar a2 = numext::abs2(scaledMat(0,0));
-        Scalar c2 = numext::abs2(scaledMat(1,1));
-        Scalar b2 = numext::abs2(scaledMat(1,0));
-        if(a2>c2)
-        {
-          eivecs.col(1) << -scaledMat(1,0), scaledMat(0,0);
-          eivecs.col(1) /= sqrt(a2+b2);
-        }
-        else
-        {
-          eivecs.col(1) << -scaledMat(1,1), scaledMat(1,0);
-          eivecs.col(1) /= sqrt(c2+b2);
+      } else {
+        scaledMat.diagonal().array() -= eivals(1);
+        Scalar a2 = numext::abs2(scaledMat(0, 0));
+        Scalar c2 = numext::abs2(scaledMat(1, 1));
+        Scalar b2 = numext::abs2(scaledMat(1, 0));
+        if (a2 > c2) {
+          eivecs.col(1) << -scaledMat(1, 0), scaledMat(0, 0);
+          eivecs.col(1) /= sqrt(a2 + b2);
+        } else {
+          eivecs.col(1) << -scaledMat(1, 1), scaledMat(1, 0);
+          eivecs.col(1) /= sqrt(c2 + b2);
         }
 
         eivecs.col(0) << eivecs.col(1).unitOrthogonal();
@@ -822,42 +771,40 @@
   }
 };
 
-}
+}  // namespace internal
 
-template<typename MatrixType>
-EIGEN_DEVICE_FUNC
-SelfAdjointEigenSolver<MatrixType>& SelfAdjointEigenSolver<MatrixType>
-::computeDirect(const MatrixType& matrix, int options)
-{
-  internal::direct_selfadjoint_eigenvalues<SelfAdjointEigenSolver,Size,NumTraits<Scalar>::IsComplex>::run(*this,matrix,options);
+template <typename MatrixType>
+EIGEN_DEVICE_FUNC SelfAdjointEigenSolver<MatrixType>& SelfAdjointEigenSolver<MatrixType>::computeDirect(
+    const MatrixType& matrix, int options) {
+  internal::direct_selfadjoint_eigenvalues<SelfAdjointEigenSolver, Size, NumTraits<Scalar>::IsComplex>::run(
+      *this, matrix, options);
   return *this;
 }
 
 namespace internal {
 
 // Francis implicit QR step.
-template<int StorageOrder,typename RealScalar, typename Scalar, typename Index>
-EIGEN_DEVICE_FUNC
-static void tridiagonal_qr_step(RealScalar* diag, RealScalar* subdiag, Index start, Index end, Scalar* matrixQ, Index n)
-{
+template <int StorageOrder, typename RealScalar, typename Scalar, typename Index>
+EIGEN_DEVICE_FUNC static void tridiagonal_qr_step(RealScalar* diag, RealScalar* subdiag, Index start, Index end,
+                                                  Scalar* matrixQ, Index n) {
   // Wilkinson Shift.
-  RealScalar td = (diag[end-1] - diag[end])*RealScalar(0.5);
-  RealScalar e = subdiag[end-1];
+  RealScalar td = (diag[end - 1] - diag[end]) * RealScalar(0.5);
+  RealScalar e = subdiag[end - 1];
   // Note that thanks to scaling, e^2 or td^2 cannot overflow, however they can still
   // underflow thus leading to inf/NaN values when using the following commented code:
   //   RealScalar e2 = numext::abs2(subdiag[end-1]);
   //   RealScalar mu = diag[end] - e2 / (td + (td>0 ? 1 : -1) * sqrt(td*td + e2));
   // This explain the following, somewhat more complicated, version:
   RealScalar mu = diag[end];
-  if(numext::is_exactly_zero(td)) {
+  if (numext::is_exactly_zero(td)) {
     mu -= numext::abs(e);
   } else if (!numext::is_exactly_zero(e)) {
     const RealScalar e2 = numext::abs2(e);
-    const RealScalar h = numext::hypot(td,e);
-    if(numext::is_exactly_zero(e2)) {
-      mu -= e / ((td + (td>RealScalar(0) ? h : -h)) / e);
+    const RealScalar h = numext::hypot(td, e);
+    if (numext::is_exactly_zero(e2)) {
+      mu -= e / ((td + (td > RealScalar(0) ? h : -h)) / e);
     } else {
-      mu -= e2 / (td + (td>RealScalar(0) ? h : -h)); 
+      mu -= e2 / (td + (td > RealScalar(0) ? h : -h));
     }
   }
 
@@ -865,42 +812,39 @@
   RealScalar z = subdiag[start];
   // If z ever becomes zero, the Givens rotation will be the identity and
   // z will stay zero for all future iterations.
-  for (Index k = start; k < end && !numext::is_exactly_zero(z); ++k)
-  {
+  for (Index k = start; k < end && !numext::is_exactly_zero(z); ++k) {
     JacobiRotation<RealScalar> rot;
     rot.makeGivens(x, z);
 
     // do T = G' T G
     RealScalar sdk = rot.s() * diag[k] + rot.c() * subdiag[k];
-    RealScalar dkp1 = rot.s() * subdiag[k] + rot.c() * diag[k+1];
+    RealScalar dkp1 = rot.s() * subdiag[k] + rot.c() * diag[k + 1];
 
-    diag[k] = rot.c() * (rot.c() * diag[k] - rot.s() * subdiag[k]) - rot.s() * (rot.c() * subdiag[k] - rot.s() * diag[k+1]);
-    diag[k+1] = rot.s() * sdk + rot.c() * dkp1;
+    diag[k] =
+        rot.c() * (rot.c() * diag[k] - rot.s() * subdiag[k]) - rot.s() * (rot.c() * subdiag[k] - rot.s() * diag[k + 1]);
+    diag[k + 1] = rot.s() * sdk + rot.c() * dkp1;
     subdiag[k] = rot.c() * sdk - rot.s() * dkp1;
-    
-    if (k > start)
-      subdiag[k - 1] = rot.c() * subdiag[k-1] - rot.s() * z;
+
+    if (k > start) subdiag[k - 1] = rot.c() * subdiag[k - 1] - rot.s() * z;
 
     // "Chasing the bulge" to return to triangular form.
     x = subdiag[k];
-    if (k < end - 1)
-    {
-      z = -rot.s() * subdiag[k+1];
-      subdiag[k + 1] = rot.c() * subdiag[k+1];
+    if (k < end - 1) {
+      z = -rot.s() * subdiag[k + 1];
+      subdiag[k + 1] = rot.c() * subdiag[k + 1];
     }
-    
+
     // apply the givens rotation to the unit matrix Q = Q * G
-    if (matrixQ)
-    {
+    if (matrixQ) {
       // FIXME if StorageOrder == RowMajor this operation is not very efficient
-      Map<Matrix<Scalar,Dynamic,Dynamic,StorageOrder> > q(matrixQ,n,n);
-      q.applyOnTheRight(k,k+1,rot);
+      Map<Matrix<Scalar, Dynamic, Dynamic, StorageOrder> > q(matrixQ, n, n);
+      q.applyOnTheRight(k, k + 1, rot);
     }
   }
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SELFADJOINTEIGENSOLVER_H
+#endif  // EIGEN_SELFADJOINTEIGENSOLVER_H
diff --git a/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h b/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h
index bfe044b..fabc30d 100644
--- a/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h
+++ b/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h
@@ -36,55 +36,55 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 /** \internal Specialization for the data types supported by LAPACKe */
 
-#define EIGEN_LAPACKE_EIG_SELFADJ_2(EIGTYPE, LAPACKE_TYPE, LAPACKE_RTYPE, LAPACKE_NAME, EIGCOLROW ) \
-template<> template<typename InputType> inline \
-SelfAdjointEigenSolver<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >& \
-SelfAdjointEigenSolver<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >::compute(const EigenBase<InputType>& matrix, int options) \
-{ \
-  eigen_assert(matrix.cols() == matrix.rows()); \
-  eigen_assert((options&~(EigVecMask|GenEigMask))==0 \
-          && (options&EigVecMask)!=EigVecMask \
-          && "invalid option parameter"); \
-  bool computeEigenvectors = (options&ComputeEigenvectors)==ComputeEigenvectors; \
-  lapack_int n = internal::convert_index<lapack_int>(matrix.cols()), lda, info; \
-  m_eivalues.resize(n,1); \
-  m_subdiag.resize(n-1); \
-  m_eivec = matrix; \
-\
-  if(n==1) \
-  { \
-    m_eivalues.coeffRef(0,0) = numext::real(m_eivec.coeff(0,0)); \
-    if(computeEigenvectors) m_eivec.setOnes(n,n); \
-    m_info = Success; \
-    m_isInitialized = true; \
-    m_eigenvectorsOk = computeEigenvectors; \
-    return *this; \
-  } \
-\
-  lda = internal::convert_index<lapack_int>(m_eivec.outerStride()); \
-  char jobz, uplo='L'/*, range='A'*/; \
-  jobz = computeEigenvectors ? 'V' : 'N'; \
-\
-  info = LAPACKE_##LAPACKE_NAME( LAPACK_COL_MAJOR, jobz, uplo, n, (LAPACKE_TYPE*)m_eivec.data(), lda, (LAPACKE_RTYPE*)m_eivalues.data() ); \
-  m_info = (info==0) ? Success : NoConvergence; \
-  m_isInitialized = true; \
-  m_eigenvectorsOk = computeEigenvectors; \
-  return *this; \
-}
+#define EIGEN_LAPACKE_EIG_SELFADJ_2(EIGTYPE, LAPACKE_TYPE, LAPACKE_RTYPE, LAPACKE_NAME, EIGCOLROW)                   \
+  template <>                                                                                                        \
+  template <typename InputType>                                                                                      \
+  inline SelfAdjointEigenSolver<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >&                                      \
+  SelfAdjointEigenSolver<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >::compute(const EigenBase<InputType>& matrix, \
+                                                                                 int options) {                      \
+    eigen_assert(matrix.cols() == matrix.rows());                                                                    \
+    eigen_assert((options & ~(EigVecMask | GenEigMask)) == 0 && (options & EigVecMask) != EigVecMask &&              \
+                 "invalid option parameter");                                                                        \
+    bool computeEigenvectors = (options & ComputeEigenvectors) == ComputeEigenvectors;                               \
+    lapack_int n = internal::convert_index<lapack_int>(matrix.cols()), lda, info;                                    \
+    m_eivalues.resize(n, 1);                                                                                         \
+    m_subdiag.resize(n - 1);                                                                                         \
+    m_eivec = matrix;                                                                                                \
+                                                                                                                     \
+    if (n == 1) {                                                                                                    \
+      m_eivalues.coeffRef(0, 0) = numext::real(m_eivec.coeff(0, 0));                                                 \
+      if (computeEigenvectors) m_eivec.setOnes(n, n);                                                                \
+      m_info = Success;                                                                                              \
+      m_isInitialized = true;                                                                                        \
+      m_eigenvectorsOk = computeEigenvectors;                                                                        \
+      return *this;                                                                                                  \
+    }                                                                                                                \
+                                                                                                                     \
+    lda = internal::convert_index<lapack_int>(m_eivec.outerStride());                                                \
+    char jobz, uplo = 'L' /*, range='A'*/;                                                                           \
+    jobz = computeEigenvectors ? 'V' : 'N';                                                                          \
+                                                                                                                     \
+    info = LAPACKE_##LAPACKE_NAME(LAPACK_COL_MAJOR, jobz, uplo, n, (LAPACKE_TYPE*)m_eivec.data(), lda,               \
+                                  (LAPACKE_RTYPE*)m_eivalues.data());                                                \
+    m_info = (info == 0) ? Success : NoConvergence;                                                                  \
+    m_isInitialized = true;                                                                                          \
+    m_eigenvectorsOk = computeEigenvectors;                                                                          \
+    return *this;                                                                                                    \
+  }
 
-#define EIGEN_LAPACKE_EIG_SELFADJ(EIGTYPE, LAPACKE_TYPE, LAPACKE_RTYPE, LAPACKE_NAME )              \
-        EIGEN_LAPACKE_EIG_SELFADJ_2(EIGTYPE, LAPACKE_TYPE, LAPACKE_RTYPE, LAPACKE_NAME, ColMajor )  \
-        EIGEN_LAPACKE_EIG_SELFADJ_2(EIGTYPE, LAPACKE_TYPE, LAPACKE_RTYPE, LAPACKE_NAME, RowMajor ) 
+#define EIGEN_LAPACKE_EIG_SELFADJ(EIGTYPE, LAPACKE_TYPE, LAPACKE_RTYPE, LAPACKE_NAME)       \
+  EIGEN_LAPACKE_EIG_SELFADJ_2(EIGTYPE, LAPACKE_TYPE, LAPACKE_RTYPE, LAPACKE_NAME, ColMajor) \
+  EIGEN_LAPACKE_EIG_SELFADJ_2(EIGTYPE, LAPACKE_TYPE, LAPACKE_RTYPE, LAPACKE_NAME, RowMajor)
 
-EIGEN_LAPACKE_EIG_SELFADJ(double,   double,                double, dsyev)
-EIGEN_LAPACKE_EIG_SELFADJ(float,    float,                 float,  ssyev)
+EIGEN_LAPACKE_EIG_SELFADJ(double, double, double, dsyev)
+EIGEN_LAPACKE_EIG_SELFADJ(float, float, float, ssyev)
 EIGEN_LAPACKE_EIG_SELFADJ(dcomplex, lapack_complex_double, double, zheev)
-EIGEN_LAPACKE_EIG_SELFADJ(scomplex, lapack_complex_float,  float,  cheev)
+EIGEN_LAPACKE_EIG_SELFADJ(scomplex, lapack_complex_float, float, cheev)
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SAEIGENSOLVER_H
+#endif  // EIGEN_SAEIGENSOLVER_H
diff --git a/Eigen/src/Eigenvalues/Tridiagonalization.h b/Eigen/src/Eigenvalues/Tridiagonalization.h
index e884b70..76158e9 100644
--- a/Eigen/src/Eigenvalues/Tridiagonalization.h
+++ b/Eigen/src/Eigenvalues/Tridiagonalization.h
@@ -18,306 +18,287 @@
 
 namespace internal {
 
-template<typename MatrixType> struct TridiagonalizationMatrixTReturnType;
-template<typename MatrixType>
-struct traits<TridiagonalizationMatrixTReturnType<MatrixType> >
-  : public traits<typename MatrixType::PlainObject>
-{
-  typedef typename MatrixType::PlainObject ReturnType; // FIXME shall it be a BandMatrix?
+template <typename MatrixType>
+struct TridiagonalizationMatrixTReturnType;
+template <typename MatrixType>
+struct traits<TridiagonalizationMatrixTReturnType<MatrixType>> : public traits<typename MatrixType::PlainObject> {
+  typedef typename MatrixType::PlainObject ReturnType;  // FIXME shall it be a BandMatrix?
   enum { Flags = 0 };
 };
 
-template<typename MatrixType, typename CoeffVectorType>
-EIGEN_DEVICE_FUNC
-void tridiagonalization_inplace(MatrixType& matA, CoeffVectorType& hCoeffs);
-}
+template <typename MatrixType, typename CoeffVectorType>
+EIGEN_DEVICE_FUNC void tridiagonalization_inplace(MatrixType& matA, CoeffVectorType& hCoeffs);
+}  // namespace internal
 
 /** \eigenvalues_module \ingroup Eigenvalues_Module
-  *
-  *
-  * \class Tridiagonalization
-  *
-  * \brief Tridiagonal decomposition of a selfadjoint matrix
-  *
-  * \tparam MatrixType_ the type of the matrix of which we are computing the
-  * tridiagonal decomposition; this is expected to be an instantiation of the
-  * Matrix class template.
-  *
-  * This class performs a tridiagonal decomposition of a selfadjoint matrix \f$ A \f$ such that:
-  * \f$ A = Q T Q^* \f$ where \f$ Q \f$ is unitary and \f$ T \f$ a real symmetric tridiagonal matrix.
-  *
-  * A tridiagonal matrix is a matrix which has nonzero elements only on the
-  * main diagonal and the first diagonal below and above it. The Hessenberg
-  * decomposition of a selfadjoint matrix is in fact a tridiagonal
-  * decomposition. This class is used in SelfAdjointEigenSolver to compute the
-  * eigenvalues and eigenvectors of a selfadjoint matrix.
-  *
-  * Call the function compute() to compute the tridiagonal decomposition of a
-  * given matrix. Alternatively, you can use the Tridiagonalization(const MatrixType&)
-  * constructor which computes the tridiagonal Schur decomposition at
-  * construction time. Once the decomposition is computed, you can use the
-  * matrixQ() and matrixT() functions to retrieve the matrices Q and T in the
-  * decomposition.
-  *
-  * The documentation of Tridiagonalization(const MatrixType&) contains an
-  * example of the typical use of this class.
-  *
-  * \sa class HessenbergDecomposition, class SelfAdjointEigenSolver
-  */
-template<typename MatrixType_> class Tridiagonalization
-{
-  public:
+ *
+ *
+ * \class Tridiagonalization
+ *
+ * \brief Tridiagonal decomposition of a selfadjoint matrix
+ *
+ * \tparam MatrixType_ the type of the matrix of which we are computing the
+ * tridiagonal decomposition; this is expected to be an instantiation of the
+ * Matrix class template.
+ *
+ * This class performs a tridiagonal decomposition of a selfadjoint matrix \f$ A \f$ such that:
+ * \f$ A = Q T Q^* \f$ where \f$ Q \f$ is unitary and \f$ T \f$ a real symmetric tridiagonal matrix.
+ *
+ * A tridiagonal matrix is a matrix which has nonzero elements only on the
+ * main diagonal and the first diagonal below and above it. The Hessenberg
+ * decomposition of a selfadjoint matrix is in fact a tridiagonal
+ * decomposition. This class is used in SelfAdjointEigenSolver to compute the
+ * eigenvalues and eigenvectors of a selfadjoint matrix.
+ *
+ * Call the function compute() to compute the tridiagonal decomposition of a
+ * given matrix. Alternatively, you can use the Tridiagonalization(const MatrixType&)
+ * constructor which computes the tridiagonal Schur decomposition at
+ * construction time. Once the decomposition is computed, you can use the
+ * matrixQ() and matrixT() functions to retrieve the matrices Q and T in the
+ * decomposition.
+ *
+ * The documentation of Tridiagonalization(const MatrixType&) contains an
+ * example of the typical use of this class.
+ *
+ * \sa class HessenbergDecomposition, class SelfAdjointEigenSolver
+ */
+template <typename MatrixType_>
+class Tridiagonalization {
+ public:
+  /** \brief Synonym for the template parameter \p MatrixType_. */
+  typedef MatrixType_ MatrixType;
 
-    /** \brief Synonym for the template parameter \p MatrixType_. */
-    typedef MatrixType_ MatrixType;
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef Eigen::Index Index;  ///< \deprecated since Eigen 3.3
 
-    typedef typename MatrixType::Scalar Scalar;
-    typedef typename NumTraits<Scalar>::Real RealScalar;
-    typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3
+  enum {
+    Size = MatrixType::RowsAtCompileTime,
+    SizeMinusOne = Size == Dynamic ? Dynamic : (Size > 1 ? Size - 1 : 1),
+    Options = MatrixType::Options,
+    MaxSize = MatrixType::MaxRowsAtCompileTime,
+    MaxSizeMinusOne = MaxSize == Dynamic ? Dynamic : (MaxSize > 1 ? MaxSize - 1 : 1)
+  };
 
-    enum {
-      Size = MatrixType::RowsAtCompileTime,
-      SizeMinusOne = Size == Dynamic ? Dynamic : (Size > 1 ? Size - 1 : 1),
-      Options = MatrixType::Options,
-      MaxSize = MatrixType::MaxRowsAtCompileTime,
-      MaxSizeMinusOne = MaxSize == Dynamic ? Dynamic : (MaxSize > 1 ? MaxSize - 1 : 1)
-    };
+  typedef Matrix<Scalar, SizeMinusOne, 1, Options & ~RowMajor, MaxSizeMinusOne, 1> CoeffVectorType;
+  typedef typename internal::plain_col_type<MatrixType, RealScalar>::type DiagonalType;
+  typedef Matrix<RealScalar, SizeMinusOne, 1, Options & ~RowMajor, MaxSizeMinusOne, 1> SubDiagonalType;
+  typedef internal::remove_all_t<typename MatrixType::RealReturnType> MatrixTypeRealView;
+  typedef internal::TridiagonalizationMatrixTReturnType<MatrixTypeRealView> MatrixTReturnType;
 
-    typedef Matrix<Scalar, SizeMinusOne, 1, Options & ~RowMajor, MaxSizeMinusOne, 1> CoeffVectorType;
-    typedef typename internal::plain_col_type<MatrixType, RealScalar>::type DiagonalType;
-    typedef Matrix<RealScalar, SizeMinusOne, 1, Options & ~RowMajor, MaxSizeMinusOne, 1> SubDiagonalType;
-    typedef internal::remove_all_t<typename MatrixType::RealReturnType> MatrixTypeRealView;
-    typedef internal::TridiagonalizationMatrixTReturnType<MatrixTypeRealView> MatrixTReturnType;
+  typedef std::conditional_t<NumTraits<Scalar>::IsComplex,
+                             internal::add_const_on_value_type_t<typename Diagonal<const MatrixType>::RealReturnType>,
+                             const Diagonal<const MatrixType>>
+      DiagonalReturnType;
 
-    typedef std::conditional_t<NumTraits<Scalar>::IsComplex,
-              internal::add_const_on_value_type_t<typename Diagonal<const MatrixType>::RealReturnType>,
-              const Diagonal<const MatrixType>
-            > DiagonalReturnType;
+  typedef std::conditional_t<
+      NumTraits<Scalar>::IsComplex,
+      internal::add_const_on_value_type_t<typename Diagonal<const MatrixType, -1>::RealReturnType>,
+      const Diagonal<const MatrixType, -1>>
+      SubDiagonalReturnType;
 
-    typedef std::conditional_t<NumTraits<Scalar>::IsComplex,
-              internal::add_const_on_value_type_t<typename Diagonal<const MatrixType, -1>::RealReturnType>,
-              const Diagonal<const MatrixType, -1>
-            > SubDiagonalReturnType;
+  /** \brief Return type of matrixQ() */
+  typedef HouseholderSequence<MatrixType, internal::remove_all_t<typename CoeffVectorType::ConjugateReturnType>>
+      HouseholderSequenceType;
 
-    /** \brief Return type of matrixQ() */
-    typedef HouseholderSequence<MatrixType,internal::remove_all_t<typename CoeffVectorType::ConjugateReturnType>> HouseholderSequenceType;
+  /** \brief Default constructor.
+   *
+   * \param [in]  size  Positive integer, size of the matrix whose tridiagonal
+   * decomposition will be computed.
+   *
+   * The default constructor is useful in cases in which the user intends to
+   * perform decompositions via compute().  The \p size parameter is only
+   * used as a hint. It is not an error to give a wrong \p size, but it may
+   * impair performance.
+   *
+   * \sa compute() for an example.
+   */
+  explicit Tridiagonalization(Index size = Size == Dynamic ? 2 : Size)
+      : m_matrix(size, size), m_hCoeffs(size > 1 ? size - 1 : 1), m_isInitialized(false) {}
 
-    /** \brief Default constructor.
-      *
-      * \param [in]  size  Positive integer, size of the matrix whose tridiagonal
-      * decomposition will be computed.
-      *
-      * The default constructor is useful in cases in which the user intends to
-      * perform decompositions via compute().  The \p size parameter is only
-      * used as a hint. It is not an error to give a wrong \p size, but it may
-      * impair performance.
-      *
-      * \sa compute() for an example.
-      */
-    explicit Tridiagonalization(Index size = Size==Dynamic ? 2 : Size)
-      : m_matrix(size,size),
-        m_hCoeffs(size > 1 ? size-1 : 1),
-        m_isInitialized(false)
-    {}
+  /** \brief Constructor; computes tridiagonal decomposition of given matrix.
+   *
+   * \param[in]  matrix  Selfadjoint matrix whose tridiagonal decomposition
+   * is to be computed.
+   *
+   * This constructor calls compute() to compute the tridiagonal decomposition.
+   *
+   * Example: \include Tridiagonalization_Tridiagonalization_MatrixType.cpp
+   * Output: \verbinclude Tridiagonalization_Tridiagonalization_MatrixType.out
+   */
+  template <typename InputType>
+  explicit Tridiagonalization(const EigenBase<InputType>& matrix)
+      : m_matrix(matrix.derived()), m_hCoeffs(matrix.cols() > 1 ? matrix.cols() - 1 : 1), m_isInitialized(false) {
+    internal::tridiagonalization_inplace(m_matrix, m_hCoeffs);
+    m_isInitialized = true;
+  }
 
-    /** \brief Constructor; computes tridiagonal decomposition of given matrix.
-      *
-      * \param[in]  matrix  Selfadjoint matrix whose tridiagonal decomposition
-      * is to be computed.
-      *
-      * This constructor calls compute() to compute the tridiagonal decomposition.
-      *
-      * Example: \include Tridiagonalization_Tridiagonalization_MatrixType.cpp
-      * Output: \verbinclude Tridiagonalization_Tridiagonalization_MatrixType.out
-      */
-    template<typename InputType>
-    explicit Tridiagonalization(const EigenBase<InputType>& matrix)
-      : m_matrix(matrix.derived()),
-        m_hCoeffs(matrix.cols() > 1 ? matrix.cols()-1 : 1),
-        m_isInitialized(false)
-    {
-      internal::tridiagonalization_inplace(m_matrix, m_hCoeffs);
-      m_isInitialized = true;
-    }
+  /** \brief Computes tridiagonal decomposition of given matrix.
+   *
+   * \param[in]  matrix  Selfadjoint matrix whose tridiagonal decomposition
+   * is to be computed.
+   * \returns    Reference to \c *this
+   *
+   * The tridiagonal decomposition is computed by bringing the columns of
+   * the matrix successively in the required form using Householder
+   * reflections. The cost is \f$ 4n^3/3 \f$ flops, where \f$ n \f$ denotes
+   * the size of the given matrix.
+   *
+   * This method reuses of the allocated data in the Tridiagonalization
+   * object, if the size of the matrix does not change.
+   *
+   * Example: \include Tridiagonalization_compute.cpp
+   * Output: \verbinclude Tridiagonalization_compute.out
+   */
+  template <typename InputType>
+  Tridiagonalization& compute(const EigenBase<InputType>& matrix) {
+    m_matrix = matrix.derived();
+    m_hCoeffs.resize(matrix.rows() - 1, 1);
+    internal::tridiagonalization_inplace(m_matrix, m_hCoeffs);
+    m_isInitialized = true;
+    return *this;
+  }
 
-    /** \brief Computes tridiagonal decomposition of given matrix.
-      *
-      * \param[in]  matrix  Selfadjoint matrix whose tridiagonal decomposition
-      * is to be computed.
-      * \returns    Reference to \c *this
-      *
-      * The tridiagonal decomposition is computed by bringing the columns of
-      * the matrix successively in the required form using Householder
-      * reflections. The cost is \f$ 4n^3/3 \f$ flops, where \f$ n \f$ denotes
-      * the size of the given matrix.
-      *
-      * This method reuses of the allocated data in the Tridiagonalization
-      * object, if the size of the matrix does not change.
-      *
-      * Example: \include Tridiagonalization_compute.cpp
-      * Output: \verbinclude Tridiagonalization_compute.out
-      */
-    template<typename InputType>
-    Tridiagonalization& compute(const EigenBase<InputType>& matrix)
-    {
-      m_matrix = matrix.derived();
-      m_hCoeffs.resize(matrix.rows()-1, 1);
-      internal::tridiagonalization_inplace(m_matrix, m_hCoeffs);
-      m_isInitialized = true;
-      return *this;
-    }
+  /** \brief Returns the Householder coefficients.
+   *
+   * \returns a const reference to the vector of Householder coefficients
+   *
+   * \pre Either the constructor Tridiagonalization(const MatrixType&) or
+   * the member function compute(const MatrixType&) has been called before
+   * to compute the tridiagonal decomposition of a matrix.
+   *
+   * The Householder coefficients allow the reconstruction of the matrix
+   * \f$ Q \f$ in the tridiagonal decomposition from the packed data.
+   *
+   * Example: \include Tridiagonalization_householderCoefficients.cpp
+   * Output: \verbinclude Tridiagonalization_householderCoefficients.out
+   *
+   * \sa packedMatrix(), \ref Householder_Module "Householder module"
+   */
+  inline CoeffVectorType householderCoefficients() const {
+    eigen_assert(m_isInitialized && "Tridiagonalization is not initialized.");
+    return m_hCoeffs;
+  }
 
-    /** \brief Returns the Householder coefficients.
-      *
-      * \returns a const reference to the vector of Householder coefficients
-      *
-      * \pre Either the constructor Tridiagonalization(const MatrixType&) or
-      * the member function compute(const MatrixType&) has been called before
-      * to compute the tridiagonal decomposition of a matrix.
-      *
-      * The Householder coefficients allow the reconstruction of the matrix
-      * \f$ Q \f$ in the tridiagonal decomposition from the packed data.
-      *
-      * Example: \include Tridiagonalization_householderCoefficients.cpp
-      * Output: \verbinclude Tridiagonalization_householderCoefficients.out
-      *
-      * \sa packedMatrix(), \ref Householder_Module "Householder module"
-      */
-    inline CoeffVectorType householderCoefficients() const
-    {
-      eigen_assert(m_isInitialized && "Tridiagonalization is not initialized.");
-      return m_hCoeffs;
-    }
+  /** \brief Returns the internal representation of the decomposition
+   *
+   *	\returns a const reference to a matrix with the internal representation
+   *	         of the decomposition.
+   *
+   * \pre Either the constructor Tridiagonalization(const MatrixType&) or
+   * the member function compute(const MatrixType&) has been called before
+   * to compute the tridiagonal decomposition of a matrix.
+   *
+   * The returned matrix contains the following information:
+   *  - the strict upper triangular part is equal to the input matrix A.
+   *  - the diagonal and lower sub-diagonal represent the real tridiagonal
+   *    symmetric matrix T.
+   *  - the rest of the lower part contains the Householder vectors that,
+   *    combined with Householder coefficients returned by
+   *    householderCoefficients(), allows to reconstruct the matrix Q as
+   *       \f$ Q = H_{N-1} \ldots H_1 H_0 \f$.
+   *    Here, the matrices \f$ H_i \f$ are the Householder transformations
+   *       \f$ H_i = (I - h_i v_i v_i^T) \f$
+   *    where \f$ h_i \f$ is the \f$ i \f$th Householder coefficient and
+   *    \f$ v_i \f$ is the Householder vector defined by
+   *       \f$ v_i = [ 0, \ldots, 0, 1, M(i+2,i), \ldots, M(N-1,i) ]^T \f$
+   *    with M the matrix returned by this function.
+   *
+   * See LAPACK for further details on this packed storage.
+   *
+   * Example: \include Tridiagonalization_packedMatrix.cpp
+   * Output: \verbinclude Tridiagonalization_packedMatrix.out
+   *
+   * \sa householderCoefficients()
+   */
+  inline const MatrixType& packedMatrix() const {
+    eigen_assert(m_isInitialized && "Tridiagonalization is not initialized.");
+    return m_matrix;
+  }
 
-    /** \brief Returns the internal representation of the decomposition
-      *
-      *	\returns a const reference to a matrix with the internal representation
-      *	         of the decomposition.
-      *
-      * \pre Either the constructor Tridiagonalization(const MatrixType&) or
-      * the member function compute(const MatrixType&) has been called before
-      * to compute the tridiagonal decomposition of a matrix.
-      *
-      * The returned matrix contains the following information:
-      *  - the strict upper triangular part is equal to the input matrix A.
-      *  - the diagonal and lower sub-diagonal represent the real tridiagonal
-      *    symmetric matrix T.
-      *  - the rest of the lower part contains the Householder vectors that,
-      *    combined with Householder coefficients returned by
-      *    householderCoefficients(), allows to reconstruct the matrix Q as
-      *       \f$ Q = H_{N-1} \ldots H_1 H_0 \f$.
-      *    Here, the matrices \f$ H_i \f$ are the Householder transformations
-      *       \f$ H_i = (I - h_i v_i v_i^T) \f$
-      *    where \f$ h_i \f$ is the \f$ i \f$th Householder coefficient and
-      *    \f$ v_i \f$ is the Householder vector defined by
-      *       \f$ v_i = [ 0, \ldots, 0, 1, M(i+2,i), \ldots, M(N-1,i) ]^T \f$
-      *    with M the matrix returned by this function.
-      *
-      * See LAPACK for further details on this packed storage.
-      *
-      * Example: \include Tridiagonalization_packedMatrix.cpp
-      * Output: \verbinclude Tridiagonalization_packedMatrix.out
-      *
-      * \sa householderCoefficients()
-      */
-    inline const MatrixType& packedMatrix() const
-    {
-      eigen_assert(m_isInitialized && "Tridiagonalization is not initialized.");
-      return m_matrix;
-    }
+  /** \brief Returns the unitary matrix Q in the decomposition
+   *
+   * \returns object representing the matrix Q
+   *
+   * \pre Either the constructor Tridiagonalization(const MatrixType&) or
+   * the member function compute(const MatrixType&) has been called before
+   * to compute the tridiagonal decomposition of a matrix.
+   *
+   * This function returns a light-weight object of template class
+   * HouseholderSequence. You can either apply it directly to a matrix or
+   * you can convert it to a matrix of type #MatrixType.
+   *
+   * \sa Tridiagonalization(const MatrixType&) for an example,
+   *     matrixT(), class HouseholderSequence
+   */
+  HouseholderSequenceType matrixQ() const {
+    eigen_assert(m_isInitialized && "Tridiagonalization is not initialized.");
+    return HouseholderSequenceType(m_matrix, m_hCoeffs.conjugate()).setLength(m_matrix.rows() - 1).setShift(1);
+  }
 
-    /** \brief Returns the unitary matrix Q in the decomposition
-      *
-      * \returns object representing the matrix Q
-      *
-      * \pre Either the constructor Tridiagonalization(const MatrixType&) or
-      * the member function compute(const MatrixType&) has been called before
-      * to compute the tridiagonal decomposition of a matrix.
-      *
-      * This function returns a light-weight object of template class
-      * HouseholderSequence. You can either apply it directly to a matrix or
-      * you can convert it to a matrix of type #MatrixType.
-      *
-      * \sa Tridiagonalization(const MatrixType&) for an example,
-      *     matrixT(), class HouseholderSequence
-      */
-    HouseholderSequenceType matrixQ() const
-    {
-      eigen_assert(m_isInitialized && "Tridiagonalization is not initialized.");
-      return HouseholderSequenceType(m_matrix, m_hCoeffs.conjugate())
-             .setLength(m_matrix.rows() - 1)
-             .setShift(1);
-    }
+  /** \brief Returns an expression of the tridiagonal matrix T in the decomposition
+   *
+   * \returns expression object representing the matrix T
+   *
+   * \pre Either the constructor Tridiagonalization(const MatrixType&) or
+   * the member function compute(const MatrixType&) has been called before
+   * to compute the tridiagonal decomposition of a matrix.
+   *
+   * Currently, this function can be used to extract the matrix T from internal
+   * data and copy it to a dense matrix object. In most cases, it may be
+   * sufficient to directly use the packed matrix or the vector expressions
+   * returned by diagonal() and subDiagonal() instead of creating a new
+   * dense copy matrix with this function.
+   *
+   * \sa Tridiagonalization(const MatrixType&) for an example,
+   * matrixQ(), packedMatrix(), diagonal(), subDiagonal()
+   */
+  MatrixTReturnType matrixT() const {
+    eigen_assert(m_isInitialized && "Tridiagonalization is not initialized.");
+    return MatrixTReturnType(m_matrix.real());
+  }
 
-    /** \brief Returns an expression of the tridiagonal matrix T in the decomposition
-      *
-      * \returns expression object representing the matrix T
-      *
-      * \pre Either the constructor Tridiagonalization(const MatrixType&) or
-      * the member function compute(const MatrixType&) has been called before
-      * to compute the tridiagonal decomposition of a matrix.
-      *
-      * Currently, this function can be used to extract the matrix T from internal
-      * data and copy it to a dense matrix object. In most cases, it may be
-      * sufficient to directly use the packed matrix or the vector expressions
-      * returned by diagonal() and subDiagonal() instead of creating a new
-      * dense copy matrix with this function.
-      *
-      * \sa Tridiagonalization(const MatrixType&) for an example,
-      * matrixQ(), packedMatrix(), diagonal(), subDiagonal()
-      */
-    MatrixTReturnType matrixT() const
-    {
-      eigen_assert(m_isInitialized && "Tridiagonalization is not initialized.");
-      return MatrixTReturnType(m_matrix.real());
-    }
+  /** \brief Returns the diagonal of the tridiagonal matrix T in the decomposition.
+   *
+   * \returns expression representing the diagonal of T
+   *
+   * \pre Either the constructor Tridiagonalization(const MatrixType&) or
+   * the member function compute(const MatrixType&) has been called before
+   * to compute the tridiagonal decomposition of a matrix.
+   *
+   * Example: \include Tridiagonalization_diagonal.cpp
+   * Output: \verbinclude Tridiagonalization_diagonal.out
+   *
+   * \sa matrixT(), subDiagonal()
+   */
+  DiagonalReturnType diagonal() const;
 
-    /** \brief Returns the diagonal of the tridiagonal matrix T in the decomposition.
-      *
-      * \returns expression representing the diagonal of T
-      *
-      * \pre Either the constructor Tridiagonalization(const MatrixType&) or
-      * the member function compute(const MatrixType&) has been called before
-      * to compute the tridiagonal decomposition of a matrix.
-      *
-      * Example: \include Tridiagonalization_diagonal.cpp
-      * Output: \verbinclude Tridiagonalization_diagonal.out
-      *
-      * \sa matrixT(), subDiagonal()
-      */
-    DiagonalReturnType diagonal() const;
+  /** \brief Returns the subdiagonal of the tridiagonal matrix T in the decomposition.
+   *
+   * \returns expression representing the subdiagonal of T
+   *
+   * \pre Either the constructor Tridiagonalization(const MatrixType&) or
+   * the member function compute(const MatrixType&) has been called before
+   * to compute the tridiagonal decomposition of a matrix.
+   *
+   * \sa diagonal() for an example, matrixT()
+   */
+  SubDiagonalReturnType subDiagonal() const;
 
-    /** \brief Returns the subdiagonal of the tridiagonal matrix T in the decomposition.
-      *
-      * \returns expression representing the subdiagonal of T
-      *
-      * \pre Either the constructor Tridiagonalization(const MatrixType&) or
-      * the member function compute(const MatrixType&) has been called before
-      * to compute the tridiagonal decomposition of a matrix.
-      *
-      * \sa diagonal() for an example, matrixT()
-      */
-    SubDiagonalReturnType subDiagonal() const;
-
-  protected:
-
-    MatrixType m_matrix;
-    CoeffVectorType m_hCoeffs;
-    bool m_isInitialized;
+ protected:
+  MatrixType m_matrix;
+  CoeffVectorType m_hCoeffs;
+  bool m_isInitialized;
 };
 
-template<typename MatrixType>
-typename Tridiagonalization<MatrixType>::DiagonalReturnType
-Tridiagonalization<MatrixType>::diagonal() const
-{
+template <typename MatrixType>
+typename Tridiagonalization<MatrixType>::DiagonalReturnType Tridiagonalization<MatrixType>::diagonal() const {
   eigen_assert(m_isInitialized && "Tridiagonalization is not initialized.");
   return m_matrix.diagonal().real();
 }
 
-template<typename MatrixType>
-typename Tridiagonalization<MatrixType>::SubDiagonalReturnType
-Tridiagonalization<MatrixType>::subDiagonal() const
-{
+template <typename MatrixType>
+typename Tridiagonalization<MatrixType>::SubDiagonalReturnType Tridiagonalization<MatrixType>::subDiagonal() const {
   eigen_assert(m_isInitialized && "Tridiagonalization is not initialized.");
   return m_matrix.template diagonal<-1>().real();
 }
@@ -325,241 +306,222 @@
 namespace internal {
 
 /** \internal
-  * Performs a tridiagonal decomposition of the selfadjoint matrix \a matA in-place.
-  *
-  * \param[in,out] matA On input the selfadjoint matrix. Only the \b lower triangular part is referenced.
-  *                     On output, the strict upper part is left unchanged, and the lower triangular part
-  *                     represents the T and Q matrices in packed format has detailed below.
-  * \param[out]    hCoeffs returned Householder coefficients (see below)
-  *
-  * On output, the tridiagonal selfadjoint matrix T is stored in the diagonal
-  * and lower sub-diagonal of the matrix \a matA.
-  * The unitary matrix Q is represented in a compact way as a product of
-  * Householder reflectors \f$ H_i \f$ such that:
-  *       \f$ Q = H_{N-1} \ldots H_1 H_0 \f$.
-  * The Householder reflectors are defined as
-  *       \f$ H_i = (I - h_i v_i v_i^T) \f$
-  * where \f$ h_i = hCoeffs[i]\f$ is the \f$ i \f$th Householder coefficient and
-  * \f$ v_i \f$ is the Householder vector defined by
-  *       \f$ v_i = [ 0, \ldots, 0, 1, matA(i+2,i), \ldots, matA(N-1,i) ]^T \f$.
-  *
-  * Implemented from Golub's "Matrix Computations", algorithm 8.3.1.
-  *
-  * \sa Tridiagonalization::packedMatrix()
-  */
-template<typename MatrixType, typename CoeffVectorType>
-EIGEN_DEVICE_FUNC
-void tridiagonalization_inplace(MatrixType& matA, CoeffVectorType& hCoeffs)
-{
+ * Performs a tridiagonal decomposition of the selfadjoint matrix \a matA in-place.
+ *
+ * \param[in,out] matA On input the selfadjoint matrix. Only the \b lower triangular part is referenced.
+ *                     On output, the strict upper part is left unchanged, and the lower triangular part
+ *                     represents the T and Q matrices in packed format has detailed below.
+ * \param[out]    hCoeffs returned Householder coefficients (see below)
+ *
+ * On output, the tridiagonal selfadjoint matrix T is stored in the diagonal
+ * and lower sub-diagonal of the matrix \a matA.
+ * The unitary matrix Q is represented in a compact way as a product of
+ * Householder reflectors \f$ H_i \f$ such that:
+ *       \f$ Q = H_{N-1} \ldots H_1 H_0 \f$.
+ * The Householder reflectors are defined as
+ *       \f$ H_i = (I - h_i v_i v_i^T) \f$
+ * where \f$ h_i = hCoeffs[i]\f$ is the \f$ i \f$th Householder coefficient and
+ * \f$ v_i \f$ is the Householder vector defined by
+ *       \f$ v_i = [ 0, \ldots, 0, 1, matA(i+2,i), \ldots, matA(N-1,i) ]^T \f$.
+ *
+ * Implemented from Golub's "Matrix Computations", algorithm 8.3.1.
+ *
+ * \sa Tridiagonalization::packedMatrix()
+ */
+template <typename MatrixType, typename CoeffVectorType>
+EIGEN_DEVICE_FUNC void tridiagonalization_inplace(MatrixType& matA, CoeffVectorType& hCoeffs) {
   using numext::conj;
   typedef typename MatrixType::Scalar Scalar;
   typedef typename MatrixType::RealScalar RealScalar;
   Index n = matA.rows();
-  eigen_assert(n==matA.cols());
-  eigen_assert(n==hCoeffs.size()+1 || n==1);
+  eigen_assert(n == matA.cols());
+  eigen_assert(n == hCoeffs.size() + 1 || n == 1);
 
-  for (Index i = 0; i<n-1; ++i)
-  {
-    Index remainingSize = n-i-1;
+  for (Index i = 0; i < n - 1; ++i) {
+    Index remainingSize = n - i - 1;
     RealScalar beta;
     Scalar h;
     matA.col(i).tail(remainingSize).makeHouseholderInPlace(h, beta);
 
     // Apply similarity transformation to remaining columns,
     // i.e., A = H A H' where H = I - h v v' and v = matA.col(i).tail(n-i-1)
-    matA.col(i).coeffRef(i+1) = 1;
+    matA.col(i).coeffRef(i + 1) = 1;
 
-    hCoeffs.tail(n-i-1).noalias() = (matA.bottomRightCorner(remainingSize,remainingSize).template selfadjointView<Lower>()
-                                  * (conj(h) * matA.col(i).tail(remainingSize)));
+    hCoeffs.tail(n - i - 1).noalias() =
+        (matA.bottomRightCorner(remainingSize, remainingSize).template selfadjointView<Lower>() *
+         (conj(h) * matA.col(i).tail(remainingSize)));
 
-    hCoeffs.tail(n-i-1) += (conj(h)*RealScalar(-0.5)*(hCoeffs.tail(remainingSize).dot(matA.col(i).tail(remainingSize)))) * matA.col(i).tail(n-i-1);
+    hCoeffs.tail(n - i - 1) +=
+        (conj(h) * RealScalar(-0.5) * (hCoeffs.tail(remainingSize).dot(matA.col(i).tail(remainingSize)))) *
+        matA.col(i).tail(n - i - 1);
 
-    matA.bottomRightCorner(remainingSize, remainingSize).template selfadjointView<Lower>()
-      .rankUpdate(matA.col(i).tail(remainingSize), hCoeffs.tail(remainingSize), Scalar(-1));
+    matA.bottomRightCorner(remainingSize, remainingSize)
+        .template selfadjointView<Lower>()
+        .rankUpdate(matA.col(i).tail(remainingSize), hCoeffs.tail(remainingSize), Scalar(-1));
 
-    matA.col(i).coeffRef(i+1) = beta;
+    matA.col(i).coeffRef(i + 1) = beta;
     hCoeffs.coeffRef(i) = h;
   }
 }
 
 // forward declaration, implementation at the end of this file
-template<typename MatrixType,
-         int Size=MatrixType::ColsAtCompileTime,
-         bool IsComplex=NumTraits<typename MatrixType::Scalar>::IsComplex>
+template <typename MatrixType, int Size = MatrixType::ColsAtCompileTime,
+          bool IsComplex = NumTraits<typename MatrixType::Scalar>::IsComplex>
 struct tridiagonalization_inplace_selector;
 
 /** \brief Performs a full tridiagonalization in place
-  *
-  * \param[in,out]  mat  On input, the selfadjoint matrix whose tridiagonal
-  *    decomposition is to be computed. Only the lower triangular part referenced.
-  *    The rest is left unchanged. On output, the orthogonal matrix Q
-  *    in the decomposition if \p extractQ is true.
-  * \param[out]  diag  The diagonal of the tridiagonal matrix T in the
-  *    decomposition.
-  * \param[out]  subdiag  The subdiagonal of the tridiagonal matrix T in
-  *    the decomposition.
-  * \param[in]  extractQ  If true, the orthogonal matrix Q in the
-  *    decomposition is computed and stored in \p mat.
-  *
-  * Computes the tridiagonal decomposition of the selfadjoint matrix \p mat in place
-  * such that \f$ mat = Q T Q^* \f$ where \f$ Q \f$ is unitary and \f$ T \f$ a real
-  * symmetric tridiagonal matrix.
-  *
-  * The tridiagonal matrix T is passed to the output parameters \p diag and \p subdiag. If
-  * \p extractQ is true, then the orthogonal matrix Q is passed to \p mat. Otherwise the lower
-  * part of the matrix \p mat is destroyed.
-  *
-  * The vectors \p diag and \p subdiag are not resized. The function
-  * assumes that they are already of the correct size. The length of the
-  * vector \p diag should equal the number of rows in \p mat, and the
-  * length of the vector \p subdiag should be one left.
-  *
-  * This implementation contains an optimized path for 3-by-3 matrices
-  * which is especially useful for plane fitting.
-  *
-  * \note Currently, it requires two temporary vectors to hold the intermediate
-  * Householder coefficients, and to reconstruct the matrix Q from the Householder
-  * reflectors.
-  *
-  * Example (this uses the same matrix as the example in
-  *    Tridiagonalization::Tridiagonalization(const MatrixType&)):
-  *    \include Tridiagonalization_decomposeInPlace.cpp
-  * Output: \verbinclude Tridiagonalization_decomposeInPlace.out
-  *
-  * \sa class Tridiagonalization
-  */
-template<typename MatrixType, typename DiagonalType, typename SubDiagonalType, typename CoeffVectorType, typename WorkSpaceType>
-EIGEN_DEVICE_FUNC
-void tridiagonalization_inplace(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag,
-                                CoeffVectorType& hcoeffs, WorkSpaceType& workspace, bool extractQ)
-{
-  eigen_assert(mat.cols()==mat.rows() && diag.size()==mat.rows() && subdiag.size()==mat.rows()-1);
+ *
+ * \param[in,out]  mat  On input, the selfadjoint matrix whose tridiagonal
+ *    decomposition is to be computed. Only the lower triangular part referenced.
+ *    The rest is left unchanged. On output, the orthogonal matrix Q
+ *    in the decomposition if \p extractQ is true.
+ * \param[out]  diag  The diagonal of the tridiagonal matrix T in the
+ *    decomposition.
+ * \param[out]  subdiag  The subdiagonal of the tridiagonal matrix T in
+ *    the decomposition.
+ * \param[in]  extractQ  If true, the orthogonal matrix Q in the
+ *    decomposition is computed and stored in \p mat.
+ *
+ * Computes the tridiagonal decomposition of the selfadjoint matrix \p mat in place
+ * such that \f$ mat = Q T Q^* \f$ where \f$ Q \f$ is unitary and \f$ T \f$ a real
+ * symmetric tridiagonal matrix.
+ *
+ * The tridiagonal matrix T is passed to the output parameters \p diag and \p subdiag. If
+ * \p extractQ is true, then the orthogonal matrix Q is passed to \p mat. Otherwise the lower
+ * part of the matrix \p mat is destroyed.
+ *
+ * The vectors \p diag and \p subdiag are not resized. The function
+ * assumes that they are already of the correct size. The length of the
+ * vector \p diag should equal the number of rows in \p mat, and the
+ * length of the vector \p subdiag should be one left.
+ *
+ * This implementation contains an optimized path for 3-by-3 matrices
+ * which is especially useful for plane fitting.
+ *
+ * \note Currently, it requires two temporary vectors to hold the intermediate
+ * Householder coefficients, and to reconstruct the matrix Q from the Householder
+ * reflectors.
+ *
+ * Example (this uses the same matrix as the example in
+ *    Tridiagonalization::Tridiagonalization(const MatrixType&)):
+ *    \include Tridiagonalization_decomposeInPlace.cpp
+ * Output: \verbinclude Tridiagonalization_decomposeInPlace.out
+ *
+ * \sa class Tridiagonalization
+ */
+template <typename MatrixType, typename DiagonalType, typename SubDiagonalType, typename CoeffVectorType,
+          typename WorkSpaceType>
+EIGEN_DEVICE_FUNC void tridiagonalization_inplace(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag,
+                                                  CoeffVectorType& hcoeffs, WorkSpaceType& workspace, bool extractQ) {
+  eigen_assert(mat.cols() == mat.rows() && diag.size() == mat.rows() && subdiag.size() == mat.rows() - 1);
   tridiagonalization_inplace_selector<MatrixType>::run(mat, diag, subdiag, hcoeffs, workspace, extractQ);
 }
 
 /** \internal
-  * General full tridiagonalization
-  */
-template<typename MatrixType, int Size, bool IsComplex>
-struct tridiagonalization_inplace_selector
-{
+ * General full tridiagonalization
+ */
+template <typename MatrixType, int Size, bool IsComplex>
+struct tridiagonalization_inplace_selector {
   typedef typename Tridiagonalization<MatrixType>::HouseholderSequenceType HouseholderSequenceType;
-  template<typename DiagonalType, typename SubDiagonalType, typename CoeffVectorType, typename WorkSpaceType>
-  static EIGEN_DEVICE_FUNC
-      void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag, CoeffVectorType& hCoeffs, WorkSpaceType& workspace, bool extractQ)
-  {
+  template <typename DiagonalType, typename SubDiagonalType, typename CoeffVectorType, typename WorkSpaceType>
+  static EIGEN_DEVICE_FUNC void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag,
+                                    CoeffVectorType& hCoeffs, WorkSpaceType& workspace, bool extractQ) {
     tridiagonalization_inplace(mat, hCoeffs);
     diag = mat.diagonal().real();
     subdiag = mat.template diagonal<-1>().real();
     if (extractQ) {
-      HouseholderSequenceType(mat, hCoeffs.conjugate())
-          .setLength(mat.rows() - 1)
-          .setShift(1)
-          .evalTo(mat, workspace);
+      HouseholderSequenceType(mat, hCoeffs.conjugate()).setLength(mat.rows() - 1).setShift(1).evalTo(mat, workspace);
     }
   }
 };
 
 /** \internal
-  * Specialization for 3x3 real matrices.
-  * Especially useful for plane fitting.
-  */
-template<typename MatrixType>
-struct tridiagonalization_inplace_selector<MatrixType,3,false>
-{
+ * Specialization for 3x3 real matrices.
+ * Especially useful for plane fitting.
+ */
+template <typename MatrixType>
+struct tridiagonalization_inplace_selector<MatrixType, 3, false> {
   typedef typename MatrixType::Scalar Scalar;
   typedef typename MatrixType::RealScalar RealScalar;
 
-  template<typename DiagonalType, typename SubDiagonalType, typename CoeffVectorType, typename WorkSpaceType>
-  static void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag, CoeffVectorType&, WorkSpaceType&, bool extractQ)
-  {
+  template <typename DiagonalType, typename SubDiagonalType, typename CoeffVectorType, typename WorkSpaceType>
+  static void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag, CoeffVectorType&, WorkSpaceType&,
+                  bool extractQ) {
     using std::sqrt;
     const RealScalar tol = (std::numeric_limits<RealScalar>::min)();
-    diag[0] = mat(0,0);
-    RealScalar v1norm2 = numext::abs2(mat(2,0));
-    if(v1norm2 <= tol)
-    {
-      diag[1] = mat(1,1);
-      diag[2] = mat(2,2);
-      subdiag[0] = mat(1,0);
-      subdiag[1] = mat(2,1);
-      if (extractQ)
-        mat.setIdentity();
-    }
-    else
-    {
-      RealScalar beta = sqrt(numext::abs2(mat(1,0)) + v1norm2);
-      RealScalar invBeta = RealScalar(1)/beta;
-      Scalar m01 = mat(1,0) * invBeta;
-      Scalar m02 = mat(2,0) * invBeta;
-      Scalar q = RealScalar(2)*m01*mat(2,1) + m02*(mat(2,2) - mat(1,1));
-      diag[1] = mat(1,1) + m02*q;
-      diag[2] = mat(2,2) - m02*q;
+    diag[0] = mat(0, 0);
+    RealScalar v1norm2 = numext::abs2(mat(2, 0));
+    if (v1norm2 <= tol) {
+      diag[1] = mat(1, 1);
+      diag[2] = mat(2, 2);
+      subdiag[0] = mat(1, 0);
+      subdiag[1] = mat(2, 1);
+      if (extractQ) mat.setIdentity();
+    } else {
+      RealScalar beta = sqrt(numext::abs2(mat(1, 0)) + v1norm2);
+      RealScalar invBeta = RealScalar(1) / beta;
+      Scalar m01 = mat(1, 0) * invBeta;
+      Scalar m02 = mat(2, 0) * invBeta;
+      Scalar q = RealScalar(2) * m01 * mat(2, 1) + m02 * (mat(2, 2) - mat(1, 1));
+      diag[1] = mat(1, 1) + m02 * q;
+      diag[2] = mat(2, 2) - m02 * q;
       subdiag[0] = beta;
-      subdiag[1] = mat(2,1) - m01 * q;
-      if (extractQ)
-      {
-        mat << 1,   0,    0,
-               0, m01,  m02,
-               0, m02, -m01;
+      subdiag[1] = mat(2, 1) - m01 * q;
+      if (extractQ) {
+        mat << 1, 0, 0, 0, m01, m02, 0, m02, -m01;
       }
     }
   }
 };
 
 /** \internal
-  * Trivial specialization for 1x1 matrices
-  */
-template<typename MatrixType, bool IsComplex>
-struct tridiagonalization_inplace_selector<MatrixType,1,IsComplex>
-{
+ * Trivial specialization for 1x1 matrices
+ */
+template <typename MatrixType, bool IsComplex>
+struct tridiagonalization_inplace_selector<MatrixType, 1, IsComplex> {
   typedef typename MatrixType::Scalar Scalar;
 
-  template<typename DiagonalType, typename SubDiagonalType, typename CoeffVectorType, typename WorkSpaceType>
-  static EIGEN_DEVICE_FUNC
-  void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType&, CoeffVectorType&, WorkSpaceType&, bool extractQ)
-  {
-    diag(0,0) = numext::real(mat(0,0));
-    if(extractQ)
-      mat(0,0) = Scalar(1);
+  template <typename DiagonalType, typename SubDiagonalType, typename CoeffVectorType, typename WorkSpaceType>
+  static EIGEN_DEVICE_FUNC void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType&, CoeffVectorType&,
+                                    WorkSpaceType&, bool extractQ) {
+    diag(0, 0) = numext::real(mat(0, 0));
+    if (extractQ) mat(0, 0) = Scalar(1);
   }
 };
 
 /** \internal
-  * \eigenvalues_module \ingroup Eigenvalues_Module
-  *
-  * \brief Expression type for return value of Tridiagonalization::matrixT()
-  *
-  * \tparam MatrixType type of underlying dense matrix
-  */
-template<typename MatrixType> struct TridiagonalizationMatrixTReturnType
-: public ReturnByValue<TridiagonalizationMatrixTReturnType<MatrixType> >
-{
-  public:
-    /** \brief Constructor.
-      *
-      * \param[in] mat The underlying dense matrix
-      */
-    TridiagonalizationMatrixTReturnType(const MatrixType& mat) : m_matrix(mat) { }
+ * \eigenvalues_module \ingroup Eigenvalues_Module
+ *
+ * \brief Expression type for return value of Tridiagonalization::matrixT()
+ *
+ * \tparam MatrixType type of underlying dense matrix
+ */
+template <typename MatrixType>
+struct TridiagonalizationMatrixTReturnType : public ReturnByValue<TridiagonalizationMatrixTReturnType<MatrixType>> {
+ public:
+  /** \brief Constructor.
+   *
+   * \param[in] mat The underlying dense matrix
+   */
+  TridiagonalizationMatrixTReturnType(const MatrixType& mat) : m_matrix(mat) {}
 
-    template <typename ResultType>
-    inline void evalTo(ResultType& result) const
-    {
-      result.setZero();
-      result.template diagonal<1>() = m_matrix.template diagonal<-1>().conjugate();
-      result.diagonal() = m_matrix.diagonal();
-      result.template diagonal<-1>() = m_matrix.template diagonal<-1>();
-    }
+  template <typename ResultType>
+  inline void evalTo(ResultType& result) const {
+    result.setZero();
+    result.template diagonal<1>() = m_matrix.template diagonal<-1>().conjugate();
+    result.diagonal() = m_matrix.diagonal();
+    result.template diagonal<-1>() = m_matrix.template diagonal<-1>();
+  }
 
-    EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_matrix.rows(); }
-    EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_matrix.cols(); }
+  EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_matrix.rows(); }
+  EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_matrix.cols(); }
 
-  protected:
-    typename MatrixType::Nested m_matrix;
+ protected:
+  typename MatrixType::Nested m_matrix;
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_TRIDIAGONALIZATION_H
+#endif  // EIGEN_TRIDIAGONALIZATION_H
diff --git a/Eigen/src/Geometry/AlignedBox.h b/Eigen/src/Geometry/AlignedBox.h
index 3d51fc9..a4e76d9 100644
--- a/Eigen/src/Geometry/AlignedBox.h
+++ b/Eigen/src/Geometry/AlignedBox.h
@@ -52,76 +52,83 @@
 namespace Eigen {
 
 /** \geometry_module \ingroup Geometry_Module
-  *
-  *
-  * \class AlignedBox
-  *
-  * \brief An axis aligned box
-  *
-  * \tparam Scalar_ the type of the scalar coefficients
-  * \tparam AmbientDim_ the dimension of the ambient space, can be a compile time value or Dynamic.
-  *
-  * This class represents an axis aligned box as a pair of the minimal and maximal corners.
-  * \warning The result of most methods is undefined when applied to an empty box. You can check for empty boxes using isEmpty().
-  * \sa alignedboxtypedefs
-  */
+ *
+ *
+ * \class AlignedBox
+ *
+ * \brief An axis aligned box
+ *
+ * \tparam Scalar_ the type of the scalar coefficients
+ * \tparam AmbientDim_ the dimension of the ambient space, can be a compile time value or Dynamic.
+ *
+ * This class represents an axis aligned box as a pair of the minimal and maximal corners.
+ * \warning The result of most methods is undefined when applied to an empty box. You can check for empty boxes using
+ * isEmpty(). \sa alignedboxtypedefs
+ */
 template <typename Scalar_, int AmbientDim_>
-class AlignedBox
-{
-public:
-EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar_,AmbientDim_)
+class AlignedBox {
+ public:
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar_, AmbientDim_)
   enum { AmbientDimAtCompileTime = AmbientDim_ };
-  typedef Scalar_                                   Scalar;
-  typedef NumTraits<Scalar>                         ScalarTraits;
-  typedef Eigen::Index                              Index; ///< \deprecated since Eigen 3.3
-  typedef typename ScalarTraits::Real               RealScalar;
-  typedef typename ScalarTraits::NonInteger         NonInteger;
-  typedef Matrix<Scalar,AmbientDimAtCompileTime,1>  VectorType;
+  typedef Scalar_ Scalar;
+  typedef NumTraits<Scalar> ScalarTraits;
+  typedef Eigen::Index Index;  ///< \deprecated since Eigen 3.3
+  typedef typename ScalarTraits::Real RealScalar;
+  typedef typename ScalarTraits::NonInteger NonInteger;
+  typedef Matrix<Scalar, AmbientDimAtCompileTime, 1> VectorType;
   typedef CwiseBinaryOp<internal::scalar_sum_op<Scalar>, const VectorType, const VectorType> VectorTypeSum;
 
   /** Define constants to name the corners of a 1D, 2D or 3D axis aligned bounding box */
-  enum CornerType
-  {
+  enum CornerType {
     /** 1D names @{ */
-    Min=0, Max=1,
+    Min = 0,
+    Max = 1,
     /** @} */
 
     /** Identifier for 2D corner @{ */
-    BottomLeft=0, BottomRight=1,
-    TopLeft=2, TopRight=3,
+    BottomLeft = 0,
+    BottomRight = 1,
+    TopLeft = 2,
+    TopRight = 3,
     /** @} */
 
     /** Identifier for 3D corner  @{ */
-    BottomLeftFloor=0, BottomRightFloor=1,
-    TopLeftFloor=2, TopRightFloor=3,
-    BottomLeftCeil=4, BottomRightCeil=5,
-    TopLeftCeil=6, TopRightCeil=7
+    BottomLeftFloor = 0,
+    BottomRightFloor = 1,
+    TopLeftFloor = 2,
+    TopRightFloor = 3,
+    BottomLeftCeil = 4,
+    BottomRightCeil = 5,
+    TopLeftCeil = 6,
+    TopRightCeil = 7
     /** @} */
   };
 
-
   /** Default constructor initializing a null box. */
-  EIGEN_DEVICE_FUNC inline AlignedBox()
-  { if (EIGEN_CONST_CONDITIONAL(AmbientDimAtCompileTime!=Dynamic)) setEmpty(); }
+  EIGEN_DEVICE_FUNC inline AlignedBox() {
+    if (EIGEN_CONST_CONDITIONAL(AmbientDimAtCompileTime != Dynamic)) setEmpty();
+  }
 
   /** Constructs a null box with \a _dim the dimension of the ambient space. */
-  EIGEN_DEVICE_FUNC inline explicit AlignedBox(Index _dim) : m_min(_dim), m_max(_dim)
-  { setEmpty(); }
+  EIGEN_DEVICE_FUNC inline explicit AlignedBox(Index _dim) : m_min(_dim), m_max(_dim) { setEmpty(); }
 
   /** Constructs a box with extremities \a _min and \a _max.
-   * \warning If either component of \a _min is larger than the same component of \a _max, the constructed box is empty. */
-  template<typename OtherVectorType1, typename OtherVectorType2>
-  EIGEN_DEVICE_FUNC inline AlignedBox(const OtherVectorType1& _min, const OtherVectorType2& _max) : m_min(_min), m_max(_max) {}
+   * \warning If either component of \a _min is larger than the same component of \a _max, the constructed box is empty.
+   */
+  template <typename OtherVectorType1, typename OtherVectorType2>
+  EIGEN_DEVICE_FUNC inline AlignedBox(const OtherVectorType1& _min, const OtherVectorType2& _max)
+      : m_min(_min), m_max(_max) {}
 
   /** Constructs a box containing a single point \a p. */
-  template<typename Derived>
-  EIGEN_DEVICE_FUNC inline explicit AlignedBox(const MatrixBase<Derived>& p) : m_min(p), m_max(m_min)
-  { }
+  template <typename Derived>
+  EIGEN_DEVICE_FUNC inline explicit AlignedBox(const MatrixBase<Derived>& p) : m_min(p), m_max(m_min) {}
 
   EIGEN_DEVICE_FUNC ~AlignedBox() {}
 
   /** \returns the dimension in which the box holds */
-  EIGEN_DEVICE_FUNC inline Index dim() const { return AmbientDimAtCompileTime==Dynamic ? m_min.size() : Index(AmbientDimAtCompileTime); }
+  EIGEN_DEVICE_FUNC inline Index dim() const {
+    return AmbientDimAtCompileTime == Dynamic ? m_min.size() : Index(AmbientDimAtCompileTime);
+  }
 
   /** \deprecated use isEmpty() */
   EIGEN_DEVICE_FUNC inline bool isNull() const { return isEmpty(); }
@@ -135,64 +142,69 @@
 
   /** Makes \c *this an empty box.
    * \sa isEmpty */
-  EIGEN_DEVICE_FUNC inline void setEmpty()
-  {
-    m_min.setConstant( ScalarTraits::highest() );
-    m_max.setConstant( ScalarTraits::lowest() );
+  EIGEN_DEVICE_FUNC inline void setEmpty() {
+    m_min.setConstant(ScalarTraits::highest());
+    m_max.setConstant(ScalarTraits::lowest());
   }
 
   /** \returns the minimal corner */
-  EIGEN_DEVICE_FUNC inline const VectorType& (min)() const { return m_min; }
+  EIGEN_DEVICE_FUNC inline const VectorType&(min)() const { return m_min; }
   /** \returns a non const reference to the minimal corner */
-  EIGEN_DEVICE_FUNC inline VectorType& (min)() { return m_min; }
+  EIGEN_DEVICE_FUNC inline VectorType&(min)() { return m_min; }
   /** \returns the maximal corner */
-  EIGEN_DEVICE_FUNC inline const VectorType& (max)() const { return m_max; }
+  EIGEN_DEVICE_FUNC inline const VectorType&(max)() const { return m_max; }
   /** \returns a non const reference to the maximal corner */
-  EIGEN_DEVICE_FUNC inline VectorType& (max)() { return m_max; }
+  EIGEN_DEVICE_FUNC inline VectorType&(max)() { return m_max; }
 
   /** \returns the center of the box */
   EIGEN_DEVICE_FUNC inline const EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(VectorTypeSum, RealScalar, quotient)
-  center() const
-  { return (m_min+m_max)/RealScalar(2); }
+      center() const {
+    return (m_min + m_max) / RealScalar(2);
+  }
 
   /** \returns the lengths of the sides of the bounding box.
-    * Note that this function does not get the same
-    * result for integral or floating scalar types: see
-    */
-  EIGEN_DEVICE_FUNC inline const CwiseBinaryOp< internal::scalar_difference_op<Scalar,Scalar>, const VectorType, const VectorType> sizes() const
-  { return m_max - m_min; }
+   * Note that this function does not get the same
+   * result for integral or floating scalar types: see
+   */
+  EIGEN_DEVICE_FUNC inline const CwiseBinaryOp<internal::scalar_difference_op<Scalar, Scalar>, const VectorType,
+                                               const VectorType>
+  sizes() const {
+    return m_max - m_min;
+  }
 
   /** \returns the volume of the bounding box */
-  EIGEN_DEVICE_FUNC inline Scalar volume() const
-  { return sizes().prod(); }
+  EIGEN_DEVICE_FUNC inline Scalar volume() const { return sizes().prod(); }
 
   /** \returns an expression for the bounding box diagonal vector
-    * if the length of the diagonal is needed: diagonal().norm()
-    * will provide it.
-    */
-  EIGEN_DEVICE_FUNC inline CwiseBinaryOp< internal::scalar_difference_op<Scalar,Scalar>, const VectorType, const VectorType> diagonal() const
-  { return sizes(); }
+   * if the length of the diagonal is needed: diagonal().norm()
+   * will provide it.
+   */
+  EIGEN_DEVICE_FUNC inline CwiseBinaryOp<internal::scalar_difference_op<Scalar, Scalar>, const VectorType,
+                                         const VectorType>
+  diagonal() const {
+    return sizes();
+  }
 
   /** \returns the vertex of the bounding box at the corner defined by
-    * the corner-id corner. It works only for a 1D, 2D or 3D bounding box.
-    * For 1D bounding boxes corners are named by 2 enum constants:
-    * BottomLeft and BottomRight.
-    * For 2D bounding boxes, corners are named by 4 enum constants:
-    * BottomLeft, BottomRight, TopLeft, TopRight.
-    * For 3D bounding boxes, the following names are added:
-    * BottomLeftCeil, BottomRightCeil, TopLeftCeil, TopRightCeil.
-    */
-  EIGEN_DEVICE_FUNC inline VectorType corner(CornerType corner) const
-  {
+   * the corner-id corner. It works only for a 1D, 2D or 3D bounding box.
+   * For 1D bounding boxes corners are named by 2 enum constants:
+   * BottomLeft and BottomRight.
+   * For 2D bounding boxes, corners are named by 4 enum constants:
+   * BottomLeft, BottomRight, TopLeft, TopRight.
+   * For 3D bounding boxes, the following names are added:
+   * BottomLeftCeil, BottomRightCeil, TopLeftCeil, TopRightCeil.
+   */
+  EIGEN_DEVICE_FUNC inline VectorType corner(CornerType corner) const {
     EIGEN_STATIC_ASSERT(AmbientDim_ <= 3, THIS_METHOD_IS_ONLY_FOR_VECTORS_OF_A_SPECIFIC_SIZE);
 
     VectorType res;
 
     Index mult = 1;
-    for(Index d=0; d<dim(); ++d)
-    {
-      if( mult & corner ) res[d] = m_max[d];
-      else                res[d] = m_min[d];
+    for (Index d = 0; d < dim(); ++d) {
+      if (mult & corner)
+        res[d] = m_max[d];
+      else
+        res[d] = m_min[d];
       mult *= 2;
     }
     return res;
@@ -200,45 +212,40 @@
 
   /** \returns a random point inside the bounding box sampled with
    * a uniform distribution */
-  EIGEN_DEVICE_FUNC inline VectorType sample() const
-  {
+  EIGEN_DEVICE_FUNC inline VectorType sample() const {
     VectorType r(dim());
-    for(Index d=0; d<dim(); ++d)
-    {
-      if(!ScalarTraits::IsInteger)
-      {
-        r[d] = m_min[d] + (m_max[d]-m_min[d])
-             * internal::random<Scalar>(Scalar(0), Scalar(1));
-      }
-      else
+    for (Index d = 0; d < dim(); ++d) {
+      if (!ScalarTraits::IsInteger) {
+        r[d] = m_min[d] + (m_max[d] - m_min[d]) * internal::random<Scalar>(Scalar(0), Scalar(1));
+      } else
         r[d] = internal::random(m_min[d], m_max[d]);
     }
     return r;
   }
 
   /** \returns true if the point \a p is inside the box \c *this. */
-  template<typename Derived>
-  EIGEN_DEVICE_FUNC inline bool contains(const MatrixBase<Derived>& p) const
-  {
-    typename internal::nested_eval<Derived,2>::type p_n(p.derived());
-    return (m_min.array()<=p_n.array()).all() && (p_n.array()<=m_max.array()).all();
+  template <typename Derived>
+  EIGEN_DEVICE_FUNC inline bool contains(const MatrixBase<Derived>& p) const {
+    typename internal::nested_eval<Derived, 2>::type p_n(p.derived());
+    return (m_min.array() <= p_n.array()).all() && (p_n.array() <= m_max.array()).all();
   }
 
   /** \returns true if the box \a b is entirely inside the box \c *this. */
-  EIGEN_DEVICE_FUNC inline bool contains(const AlignedBox& b) const
-  { return (m_min.array()<=(b.min)().array()).all() && ((b.max)().array()<=m_max.array()).all(); }
+  EIGEN_DEVICE_FUNC inline bool contains(const AlignedBox& b) const {
+    return (m_min.array() <= (b.min)().array()).all() && ((b.max)().array() <= m_max.array()).all();
+  }
 
   /** \returns true if the box \a b is intersecting the box \c *this.
    * \sa intersection, clamp */
-  EIGEN_DEVICE_FUNC inline bool intersects(const AlignedBox& b) const
-  { return (m_min.array()<=(b.max)().array()).all() && ((b.min)().array()<=m_max.array()).all(); }
+  EIGEN_DEVICE_FUNC inline bool intersects(const AlignedBox& b) const {
+    return (m_min.array() <= (b.max)().array()).all() && ((b.min)().array() <= m_max.array()).all();
+  }
 
   /** Extends \c *this such that it contains the point \a p and returns a reference to \c *this.
    * \sa extend(const AlignedBox&) */
-  template<typename Derived>
-  EIGEN_DEVICE_FUNC inline AlignedBox& extend(const MatrixBase<Derived>& p)
-  {
-    typename internal::nested_eval<Derived,2>::type p_n(p.derived());
+  template <typename Derived>
+  EIGEN_DEVICE_FUNC inline AlignedBox& extend(const MatrixBase<Derived>& p) {
+    typename internal::nested_eval<Derived, 2>::type p_n(p.derived());
     m_min = m_min.cwiseMin(p_n);
     m_max = m_max.cwiseMax(p_n);
     return *this;
@@ -246,8 +253,7 @@
 
   /** Extends \c *this such that it contains the box \a b and returns a reference to \c *this.
    * \sa merged, extend(const MatrixBase&) */
-  EIGEN_DEVICE_FUNC inline AlignedBox& extend(const AlignedBox& b)
-  {
+  EIGEN_DEVICE_FUNC inline AlignedBox& extend(const AlignedBox& b) {
     m_min = m_min.cwiseMin(b.m_min);
     m_max = m_max.cwiseMax(b.m_max);
     return *this;
@@ -256,8 +262,7 @@
   /** Clamps \c *this by the box \a b and returns a reference to \c *this.
    * \note If the boxes don't intersect, the resulting box is empty.
    * \sa intersection(), intersects() */
-  EIGEN_DEVICE_FUNC inline AlignedBox& clamp(const AlignedBox& b)
-  {
+  EIGEN_DEVICE_FUNC inline AlignedBox& clamp(const AlignedBox& b) {
     m_min = m_min.cwiseMax(b.m_min);
     m_max = m_max.cwiseMin(b.m_max);
     return *this;
@@ -266,69 +271,70 @@
   /** Returns an AlignedBox that is the intersection of \a b and \c *this
    * \note If the boxes don't intersect, the resulting box is empty.
    * \sa intersects(), clamp, contains()  */
-  EIGEN_DEVICE_FUNC inline AlignedBox intersection(const AlignedBox& b) const
-  {return AlignedBox(m_min.cwiseMax(b.m_min), m_max.cwiseMin(b.m_max)); }
+  EIGEN_DEVICE_FUNC inline AlignedBox intersection(const AlignedBox& b) const {
+    return AlignedBox(m_min.cwiseMax(b.m_min), m_max.cwiseMin(b.m_max));
+  }
 
   /** Returns an AlignedBox that is the union of \a b and \c *this.
    * \note Merging with an empty box may result in a box bigger than \c *this.
    * \sa extend(const AlignedBox&) */
-  EIGEN_DEVICE_FUNC inline AlignedBox merged(const AlignedBox& b) const
-  { return AlignedBox(m_min.cwiseMin(b.m_min), m_max.cwiseMax(b.m_max)); }
+  EIGEN_DEVICE_FUNC inline AlignedBox merged(const AlignedBox& b) const {
+    return AlignedBox(m_min.cwiseMin(b.m_min), m_max.cwiseMax(b.m_max));
+  }
 
   /** Translate \c *this by the vector \a t and returns a reference to \c *this. */
-  template<typename Derived>
-  EIGEN_DEVICE_FUNC inline AlignedBox& translate(const MatrixBase<Derived>& a_t)
-  {
-    const typename internal::nested_eval<Derived,2>::type t(a_t.derived());
+  template <typename Derived>
+  EIGEN_DEVICE_FUNC inline AlignedBox& translate(const MatrixBase<Derived>& a_t) {
+    const typename internal::nested_eval<Derived, 2>::type t(a_t.derived());
     m_min += t;
     m_max += t;
     return *this;
   }
 
   /** \returns a copy of \c *this translated by the vector \a t. */
-  template<typename Derived>
-  EIGEN_DEVICE_FUNC inline AlignedBox translated(const MatrixBase<Derived>& a_t) const
-  {
+  template <typename Derived>
+  EIGEN_DEVICE_FUNC inline AlignedBox translated(const MatrixBase<Derived>& a_t) const {
     AlignedBox result(m_min, m_max);
     result.translate(a_t);
     return result;
   }
 
   /** \returns the squared distance between the point \a p and the box \c *this,
-    * and zero if \a p is inside the box.
-    * \sa exteriorDistance(const MatrixBase&), squaredExteriorDistance(const AlignedBox&)
-    */
-  template<typename Derived>
+   * and zero if \a p is inside the box.
+   * \sa exteriorDistance(const MatrixBase&), squaredExteriorDistance(const AlignedBox&)
+   */
+  template <typename Derived>
   EIGEN_DEVICE_FUNC inline Scalar squaredExteriorDistance(const MatrixBase<Derived>& p) const;
 
   /** \returns the squared distance between the boxes \a b and \c *this,
-    * and zero if the boxes intersect.
-    * \sa exteriorDistance(const AlignedBox&), squaredExteriorDistance(const MatrixBase&)
-    */
+   * and zero if the boxes intersect.
+   * \sa exteriorDistance(const AlignedBox&), squaredExteriorDistance(const MatrixBase&)
+   */
   EIGEN_DEVICE_FUNC inline Scalar squaredExteriorDistance(const AlignedBox& b) const;
 
   /** \returns the distance between the point \a p and the box \c *this,
-    * and zero if \a p is inside the box.
-    * \sa squaredExteriorDistance(const MatrixBase&), exteriorDistance(const AlignedBox&)
-    */
-  template<typename Derived>
-  EIGEN_DEVICE_FUNC inline NonInteger exteriorDistance(const MatrixBase<Derived>& p) const
-  { EIGEN_USING_STD(sqrt) return sqrt(NonInteger(squaredExteriorDistance(p))); }
+   * and zero if \a p is inside the box.
+   * \sa squaredExteriorDistance(const MatrixBase&), exteriorDistance(const AlignedBox&)
+   */
+  template <typename Derived>
+  EIGEN_DEVICE_FUNC inline NonInteger exteriorDistance(const MatrixBase<Derived>& p) const {
+    EIGEN_USING_STD(sqrt) return sqrt(NonInteger(squaredExteriorDistance(p)));
+  }
 
   /** \returns the distance between the boxes \a b and \c *this,
-    * and zero if the boxes intersect.
-    * \sa squaredExteriorDistance(const AlignedBox&), exteriorDistance(const MatrixBase&)
-    */
-  EIGEN_DEVICE_FUNC inline NonInteger exteriorDistance(const AlignedBox& b) const
-  { EIGEN_USING_STD(sqrt) return sqrt(NonInteger(squaredExteriorDistance(b))); }
+   * and zero if the boxes intersect.
+   * \sa squaredExteriorDistance(const AlignedBox&), exteriorDistance(const MatrixBase&)
+   */
+  EIGEN_DEVICE_FUNC inline NonInteger exteriorDistance(const AlignedBox& b) const {
+    EIGEN_USING_STD(sqrt) return sqrt(NonInteger(squaredExteriorDistance(b)));
+  }
 
   /**
    * Specialization of transform for pure translation.
    */
-  template<int Mode, int Options>
+  template <int Mode, int Options>
   EIGEN_DEVICE_FUNC inline void transform(
-      const typename Transform<Scalar, AmbientDimAtCompileTime, Mode, Options>::TranslationType& translation)
-  {
+      const typename Transform<Scalar, AmbientDimAtCompileTime, Mode, Options>::TranslationType& translation) {
     this->translate(translation);
   }
 
@@ -338,11 +344,11 @@
    *
    * \note This method is provided under BSD license (see the top of this file).
    */
-  template<int Mode, int Options>
-  EIGEN_DEVICE_FUNC inline void transform(const Transform<Scalar, AmbientDimAtCompileTime, Mode, Options>& transform)
-  {
+  template <int Mode, int Options>
+  EIGEN_DEVICE_FUNC inline void transform(const Transform<Scalar, AmbientDimAtCompileTime, Mode, Options>& transform) {
     // Only Affine and Isometry transforms are currently supported.
-    EIGEN_STATIC_ASSERT(Mode == Affine || Mode == AffineCompact || Mode == Isometry, THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS);
+    EIGEN_STATIC_ASSERT(Mode == Affine || Mode == AffineCompact || Mode == Isometry,
+                        THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS);
 
     // Method adapted from FCL src/shape/geometric_shapes_utility.cpp#computeBV<AABB, Box>(...)
     // https://github.com/flexible-collision-library/fcl/blob/fcl-0.4/src/shape/geometric_shapes_utility.cpp#L292
@@ -352,8 +358,8 @@
     // two times rotated extent
     const VectorType rotated_extent_2 = transform.linear().cwiseAbs() * sizes();
     // two times new center
-    const VectorType rotated_center_2 = transform.linear() * (this->m_max + this->m_min) +
-        Scalar(2) * transform.translation();
+    const VectorType rotated_center_2 =
+        transform.linear() * (this->m_max + this->m_min) + Scalar(2) * transform.translation();
 
     this->m_max = (rotated_center_2 + rotated_extent_2) / Scalar(2);
     this->m_min = (rotated_center_2 - rotated_extent_2) / Scalar(2);
@@ -363,127 +369,117 @@
    * \returns a copy of \c *this transformed by \a transform and recomputed to
    * still be an axis-aligned box.
    */
-  template<int Mode, int Options>
-  EIGEN_DEVICE_FUNC AlignedBox transformed(const Transform<Scalar, AmbientDimAtCompileTime, Mode, Options>& transform) const
-  {
+  template <int Mode, int Options>
+  EIGEN_DEVICE_FUNC AlignedBox
+  transformed(const Transform<Scalar, AmbientDimAtCompileTime, Mode, Options>& transform) const {
     AlignedBox result(m_min, m_max);
     result.transform(transform);
     return result;
   }
 
   /** \returns \c *this with scalar type casted to \a NewScalarType
-    *
-    * Note that if \a NewScalarType is equal to the current scalar type of \c *this
-    * then this function smartly returns a const reference to \c *this.
-    */
-  template<typename NewScalarType>
-  EIGEN_DEVICE_FUNC inline typename internal::cast_return_type<AlignedBox,
-           AlignedBox<NewScalarType,AmbientDimAtCompileTime> >::type cast() const
-  {
-    return typename internal::cast_return_type<AlignedBox,
-                    AlignedBox<NewScalarType,AmbientDimAtCompileTime> >::type(*this);
+   *
+   * Note that if \a NewScalarType is equal to the current scalar type of \c *this
+   * then this function smartly returns a const reference to \c *this.
+   */
+  template <typename NewScalarType>
+  EIGEN_DEVICE_FUNC inline
+      typename internal::cast_return_type<AlignedBox, AlignedBox<NewScalarType, AmbientDimAtCompileTime> >::type
+      cast() const {
+    return typename internal::cast_return_type<AlignedBox, AlignedBox<NewScalarType, AmbientDimAtCompileTime> >::type(
+        *this);
   }
 
   /** Copy constructor with scalar type conversion */
-  template<typename OtherScalarType>
-  EIGEN_DEVICE_FUNC inline explicit AlignedBox(const AlignedBox<OtherScalarType,AmbientDimAtCompileTime>& other)
-  {
+  template <typename OtherScalarType>
+  EIGEN_DEVICE_FUNC inline explicit AlignedBox(const AlignedBox<OtherScalarType, AmbientDimAtCompileTime>& other) {
     m_min = (other.min)().template cast<Scalar>();
     m_max = (other.max)().template cast<Scalar>();
   }
 
   /** \returns \c true if \c *this is approximately equal to \a other, within the precision
-    * determined by \a prec.
-    *
-    * \sa MatrixBase::isApprox() */
-  EIGEN_DEVICE_FUNC bool isApprox(const AlignedBox& other, const RealScalar& prec = ScalarTraits::dummy_precision()) const
-  { return m_min.isApprox(other.m_min, prec) && m_max.isApprox(other.m_max, prec); }
+   * determined by \a prec.
+   *
+   * \sa MatrixBase::isApprox() */
+  EIGEN_DEVICE_FUNC bool isApprox(const AlignedBox& other,
+                                  const RealScalar& prec = ScalarTraits::dummy_precision()) const {
+    return m_min.isApprox(other.m_min, prec) && m_max.isApprox(other.m_max, prec);
+  }
 
-protected:
-
+ protected:
   VectorType m_min, m_max;
 };
 
-
-
-template<typename Scalar,int AmbientDim>
-template<typename Derived>
-EIGEN_DEVICE_FUNC inline Scalar AlignedBox<Scalar,AmbientDim>::squaredExteriorDistance(const MatrixBase<Derived>& a_p) const
-{
-  typename internal::nested_eval<Derived,2*AmbientDim>::type p(a_p.derived());
+template <typename Scalar, int AmbientDim>
+template <typename Derived>
+EIGEN_DEVICE_FUNC inline Scalar AlignedBox<Scalar, AmbientDim>::squaredExteriorDistance(
+    const MatrixBase<Derived>& a_p) const {
+  typename internal::nested_eval<Derived, 2 * AmbientDim>::type p(a_p.derived());
   Scalar dist2(0);
   Scalar aux;
-  for (Index k=0; k<dim(); ++k)
-  {
-    if( m_min[k] > p[k] )
-    {
+  for (Index k = 0; k < dim(); ++k) {
+    if (m_min[k] > p[k]) {
       aux = m_min[k] - p[k];
-      dist2 += aux*aux;
-    }
-    else if( p[k] > m_max[k] )
-    {
+      dist2 += aux * aux;
+    } else if (p[k] > m_max[k]) {
       aux = p[k] - m_max[k];
-      dist2 += aux*aux;
+      dist2 += aux * aux;
     }
   }
   return dist2;
 }
 
-template<typename Scalar,int AmbientDim>
-EIGEN_DEVICE_FUNC inline Scalar AlignedBox<Scalar,AmbientDim>::squaredExteriorDistance(const AlignedBox& b) const
-{
+template <typename Scalar, int AmbientDim>
+EIGEN_DEVICE_FUNC inline Scalar AlignedBox<Scalar, AmbientDim>::squaredExteriorDistance(const AlignedBox& b) const {
   Scalar dist2(0);
   Scalar aux;
-  for (Index k=0; k<dim(); ++k)
-  {
-    if( m_min[k] > b.m_max[k] )
-    {
+  for (Index k = 0; k < dim(); ++k) {
+    if (m_min[k] > b.m_max[k]) {
       aux = m_min[k] - b.m_max[k];
-      dist2 += aux*aux;
-    }
-    else if( b.m_min[k] > m_max[k] )
-    {
+      dist2 += aux * aux;
+    } else if (b.m_min[k] > m_max[k]) {
       aux = b.m_min[k] - m_max[k];
-      dist2 += aux*aux;
+      dist2 += aux * aux;
     }
   }
   return dist2;
 }
 
 /** \defgroup alignedboxtypedefs Global aligned box typedefs
-  *
-  * \ingroup Geometry_Module
-  *
-  * Eigen defines several typedef shortcuts for most common aligned box types.
-  *
-  * The general patterns are the following:
-  *
-  * \c AlignedBoxSizeType where \c Size can be \c 1, \c 2,\c 3,\c 4 for fixed size boxes or \c X for dynamic size,
-  * and where \c Type can be \c i for integer, \c f for float, \c d for double.
-  *
-  * For example, \c AlignedBox3d is a fixed-size 3x3 aligned box type of doubles, and \c AlignedBoxXf is a dynamic-size aligned box of floats.
-  *
-  * \sa class AlignedBox
-  */
+ *
+ * \ingroup Geometry_Module
+ *
+ * Eigen defines several typedef shortcuts for most common aligned box types.
+ *
+ * The general patterns are the following:
+ *
+ * \c AlignedBoxSizeType where \c Size can be \c 1, \c 2,\c 3,\c 4 for fixed size boxes or \c X for dynamic size,
+ * and where \c Type can be \c i for integer, \c f for float, \c d for double.
+ *
+ * For example, \c AlignedBox3d is a fixed-size 3x3 aligned box type of doubles, and \c AlignedBoxXf is a dynamic-size
+ * aligned box of floats.
+ *
+ * \sa class AlignedBox
+ */
 
-#define EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Size, SizeSuffix)    \
-/** \ingroup alignedboxtypedefs */                                 \
-typedef AlignedBox<Type, Size>   AlignedBox##SizeSuffix##TypeSuffix;
+#define EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Size, SizeSuffix) \
+  /** \ingroup alignedboxtypedefs */                            \
+  typedef AlignedBox<Type, Size> AlignedBox##SizeSuffix##TypeSuffix;
 
 #define EIGEN_MAKE_TYPEDEFS_ALL_SIZES(Type, TypeSuffix) \
-EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 1, 1) \
-EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 2, 2) \
-EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 3, 3) \
-EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 4, 4) \
-EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Dynamic, X)
+  EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 1, 1)           \
+  EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 2, 2)           \
+  EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 3, 3)           \
+  EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 4, 4)           \
+  EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Dynamic, X)
 
-EIGEN_MAKE_TYPEDEFS_ALL_SIZES(int,                  i)
-EIGEN_MAKE_TYPEDEFS_ALL_SIZES(float,                f)
-EIGEN_MAKE_TYPEDEFS_ALL_SIZES(double,               d)
+EIGEN_MAKE_TYPEDEFS_ALL_SIZES(int, i)
+EIGEN_MAKE_TYPEDEFS_ALL_SIZES(float, f)
+EIGEN_MAKE_TYPEDEFS_ALL_SIZES(double, d)
 
 #undef EIGEN_MAKE_TYPEDEFS_ALL_SIZES
 #undef EIGEN_MAKE_TYPEDEFS
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_ALIGNEDBOX_H
+#endif  // EIGEN_ALIGNEDBOX_H
diff --git a/Eigen/src/Geometry/AngleAxis.h b/Eigen/src/Geometry/AngleAxis.h
index 75cb0ee..a00ed17 100644
--- a/Eigen/src/Geometry/AngleAxis.h
+++ b/Eigen/src/Geometry/AngleAxis.h
@@ -13,82 +13,82 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 /** \geometry_module \ingroup Geometry_Module
-  *
-  * \class AngleAxis
-  *
-  * \brief Represents a 3D rotation as a rotation angle around an arbitrary 3D axis
-  *
-  * \param Scalar_ the scalar type, i.e., the type of the coefficients.
-  *
-  * \warning When setting up an AngleAxis object, the axis vector \b must \b be \b normalized.
-  *
-  * The following two typedefs are provided for convenience:
-  * \li \c AngleAxisf for \c float
-  * \li \c AngleAxisd for \c double
-  *
-  * Combined with MatrixBase::Unit{X,Y,Z}, AngleAxis can be used to easily
-  * mimic Euler-angles. Here is an example:
-  * \include AngleAxis_mimic_euler.cpp
-  * Output: \verbinclude AngleAxis_mimic_euler.out
-  *
-  * \note This class is not aimed to be used to store a rotation transformation,
-  * but rather to make easier the creation of other rotation (Quaternion, rotation Matrix)
-  * and transformation objects.
-  *
-  * \sa class Quaternion, class Transform, MatrixBase::UnitX()
-  */
+ *
+ * \class AngleAxis
+ *
+ * \brief Represents a 3D rotation as a rotation angle around an arbitrary 3D axis
+ *
+ * \param Scalar_ the scalar type, i.e., the type of the coefficients.
+ *
+ * \warning When setting up an AngleAxis object, the axis vector \b must \b be \b normalized.
+ *
+ * The following two typedefs are provided for convenience:
+ * \li \c AngleAxisf for \c float
+ * \li \c AngleAxisd for \c double
+ *
+ * Combined with MatrixBase::Unit{X,Y,Z}, AngleAxis can be used to easily
+ * mimic Euler-angles. Here is an example:
+ * \include AngleAxis_mimic_euler.cpp
+ * Output: \verbinclude AngleAxis_mimic_euler.out
+ *
+ * \note This class is not aimed to be used to store a rotation transformation,
+ * but rather to make easier the creation of other rotation (Quaternion, rotation Matrix)
+ * and transformation objects.
+ *
+ * \sa class Quaternion, class Transform, MatrixBase::UnitX()
+ */
 
 namespace internal {
-template<typename Scalar_> struct traits<AngleAxis<Scalar_> >
-{
+template <typename Scalar_>
+struct traits<AngleAxis<Scalar_> > {
   typedef Scalar_ Scalar;
 };
-}
+}  // namespace internal
 
-template<typename Scalar_>
-class AngleAxis : public RotationBase<AngleAxis<Scalar_>,3>
-{
-  typedef RotationBase<AngleAxis<Scalar_>,3> Base;
+template <typename Scalar_>
+class AngleAxis : public RotationBase<AngleAxis<Scalar_>, 3> {
+  typedef RotationBase<AngleAxis<Scalar_>, 3> Base;
 
-public:
-
+ public:
   using Base::operator*;
 
   enum { Dim = 3 };
   /** the scalar type of the coefficients */
   typedef Scalar_ Scalar;
-  typedef Matrix<Scalar,3,3> Matrix3;
-  typedef Matrix<Scalar,3,1> Vector3;
+  typedef Matrix<Scalar, 3, 3> Matrix3;
+  typedef Matrix<Scalar, 3, 1> Vector3;
   typedef Quaternion<Scalar> QuaternionType;
 
-protected:
-
+ protected:
   Vector3 m_axis;
   Scalar m_angle;
 
-public:
-
+ public:
   /** Default constructor without initialization. */
   EIGEN_DEVICE_FUNC AngleAxis() {}
   /** Constructs and initialize the angle-axis rotation from an \a angle in radian
-    * and an \a axis which \b must \b be \b normalized.
-    *
-    * \warning If the \a axis vector is not normalized, then the angle-axis object
-    *          represents an invalid rotation. */
-  template<typename Derived>
-  EIGEN_DEVICE_FUNC 
-  inline AngleAxis(const Scalar& angle, const MatrixBase<Derived>& axis) : m_axis(axis), m_angle(angle) {}
+   * and an \a axis which \b must \b be \b normalized.
+   *
+   * \warning If the \a axis vector is not normalized, then the angle-axis object
+   *          represents an invalid rotation. */
+  template <typename Derived>
+  EIGEN_DEVICE_FUNC inline AngleAxis(const Scalar& angle, const MatrixBase<Derived>& axis)
+      : m_axis(axis), m_angle(angle) {}
   /** Constructs and initialize the angle-axis rotation from a quaternion \a q.
-    * This function implicitly normalizes the quaternion \a q.
-    */
-  template<typename QuatDerived> 
-  EIGEN_DEVICE_FUNC inline explicit AngleAxis(const QuaternionBase<QuatDerived>& q) { *this = q; }
+   * This function implicitly normalizes the quaternion \a q.
+   */
+  template <typename QuatDerived>
+  EIGEN_DEVICE_FUNC inline explicit AngleAxis(const QuaternionBase<QuatDerived>& q) {
+    *this = q;
+  }
   /** Constructs and initialize the angle-axis rotation from a 3x3 rotation matrix. */
-  template<typename Derived>
-  EIGEN_DEVICE_FUNC inline explicit AngleAxis(const MatrixBase<Derived>& m) { *this = m; }
+  template <typename Derived>
+  EIGEN_DEVICE_FUNC inline explicit AngleAxis(const MatrixBase<Derived>& m) {
+    *this = m;
+  }
 
   /** \returns the value of the rotation angle in radian */
   EIGEN_DEVICE_FUNC Scalar angle() const { return m_angle; }
@@ -98,49 +98,52 @@
   /** \returns the rotation axis */
   EIGEN_DEVICE_FUNC const Vector3& axis() const { return m_axis; }
   /** \returns a read-write reference to the stored rotation axis.
-    *
-    * \warning The rotation axis must remain a \b unit vector.
-    */
+   *
+   * \warning The rotation axis must remain a \b unit vector.
+   */
   EIGEN_DEVICE_FUNC Vector3& axis() { return m_axis; }
 
   /** Concatenates two rotations */
-  EIGEN_DEVICE_FUNC inline QuaternionType operator* (const AngleAxis& other) const
-  { return QuaternionType(*this) * QuaternionType(other); }
+  EIGEN_DEVICE_FUNC inline QuaternionType operator*(const AngleAxis& other) const {
+    return QuaternionType(*this) * QuaternionType(other);
+  }
 
   /** Concatenates two rotations */
-  EIGEN_DEVICE_FUNC inline QuaternionType operator* (const QuaternionType& other) const
-  { return QuaternionType(*this) * other; }
+  EIGEN_DEVICE_FUNC inline QuaternionType operator*(const QuaternionType& other) const {
+    return QuaternionType(*this) * other;
+  }
 
   /** Concatenates two rotations */
-  friend EIGEN_DEVICE_FUNC inline QuaternionType operator* (const QuaternionType& a, const AngleAxis& b)
-  { return a * QuaternionType(b); }
+  friend EIGEN_DEVICE_FUNC inline QuaternionType operator*(const QuaternionType& a, const AngleAxis& b) {
+    return a * QuaternionType(b);
+  }
 
   /** \returns the inverse rotation, i.e., an angle-axis with opposite rotation angle */
-  EIGEN_DEVICE_FUNC AngleAxis inverse() const
-  { return AngleAxis(-m_angle, m_axis); }
+  EIGEN_DEVICE_FUNC AngleAxis inverse() const { return AngleAxis(-m_angle, m_axis); }
 
-  template<class QuatDerived>
+  template <class QuatDerived>
   EIGEN_DEVICE_FUNC AngleAxis& operator=(const QuaternionBase<QuatDerived>& q);
-  template<typename Derived>
+  template <typename Derived>
   EIGEN_DEVICE_FUNC AngleAxis& operator=(const MatrixBase<Derived>& m);
 
-  template<typename Derived>
+  template <typename Derived>
   EIGEN_DEVICE_FUNC AngleAxis& fromRotationMatrix(const MatrixBase<Derived>& m);
   EIGEN_DEVICE_FUNC Matrix3 toRotationMatrix(void) const;
 
   /** \returns \c *this with scalar type casted to \a NewScalarType
-    *
-    * Note that if \a NewScalarType is equal to the current scalar type of \c *this
-    * then this function smartly returns a const reference to \c *this.
-    */
-  template<typename NewScalarType>
-  EIGEN_DEVICE_FUNC inline typename internal::cast_return_type<AngleAxis,AngleAxis<NewScalarType> >::type cast() const
-  { return typename internal::cast_return_type<AngleAxis,AngleAxis<NewScalarType> >::type(*this); }
+   *
+   * Note that if \a NewScalarType is equal to the current scalar type of \c *this
+   * then this function smartly returns a const reference to \c *this.
+   */
+  template <typename NewScalarType>
+  EIGEN_DEVICE_FUNC inline typename internal::cast_return_type<AngleAxis, AngleAxis<NewScalarType> >::type cast()
+      const {
+    return typename internal::cast_return_type<AngleAxis, AngleAxis<NewScalarType> >::type(*this);
+  }
 
   /** Copy constructor with scalar type conversion */
-  template<typename OtherScalarType>
-  EIGEN_DEVICE_FUNC inline explicit AngleAxis(const AngleAxis<OtherScalarType>& other)
-  {
+  template <typename OtherScalarType>
+  EIGEN_DEVICE_FUNC inline explicit AngleAxis(const AngleAxis<OtherScalarType>& other) {
     m_axis = other.axis().template cast<Scalar>();
     m_angle = Scalar(other.angle());
   }
@@ -148,45 +151,41 @@
   EIGEN_DEVICE_FUNC static inline const AngleAxis Identity() { return AngleAxis(Scalar(0), Vector3::UnitX()); }
 
   /** \returns \c true if \c *this is approximately equal to \a other, within the precision
-    * determined by \a prec.
-    *
-    * \sa MatrixBase::isApprox() */
-  EIGEN_DEVICE_FUNC bool isApprox(const AngleAxis& other, const typename NumTraits<Scalar>::Real& prec = NumTraits<Scalar>::dummy_precision()) const
-  { return m_axis.isApprox(other.m_axis, prec) && internal::isApprox(m_angle,other.m_angle, prec); }
+   * determined by \a prec.
+   *
+   * \sa MatrixBase::isApprox() */
+  EIGEN_DEVICE_FUNC bool isApprox(const AngleAxis& other, const typename NumTraits<Scalar>::Real& prec =
+                                                              NumTraits<Scalar>::dummy_precision()) const {
+    return m_axis.isApprox(other.m_axis, prec) && internal::isApprox(m_angle, other.m_angle, prec);
+  }
 };
 
 /** \ingroup Geometry_Module
-  * single precision angle-axis type */
+ * single precision angle-axis type */
 typedef AngleAxis<float> AngleAxisf;
 /** \ingroup Geometry_Module
-  * double precision angle-axis type */
+ * double precision angle-axis type */
 typedef AngleAxis<double> AngleAxisd;
 
 /** Set \c *this from a \b unit quaternion.
-  *
-  * The resulting axis is normalized, and the computed angle is in the [0,pi] range.
-  * 
-  * This function implicitly normalizes the quaternion \a q.
-  */
-template<typename Scalar>
-template<typename QuatDerived>
-EIGEN_DEVICE_FUNC AngleAxis<Scalar>& AngleAxis<Scalar>::operator=(const QuaternionBase<QuatDerived>& q)
-{
+ *
+ * The resulting axis is normalized, and the computed angle is in the [0,pi] range.
+ *
+ * This function implicitly normalizes the quaternion \a q.
+ */
+template <typename Scalar>
+template <typename QuatDerived>
+EIGEN_DEVICE_FUNC AngleAxis<Scalar>& AngleAxis<Scalar>::operator=(const QuaternionBase<QuatDerived>& q) {
   EIGEN_USING_STD(atan2)
   EIGEN_USING_STD(abs)
   Scalar n = q.vec().norm();
-  if(n<NumTraits<Scalar>::epsilon())
-    n = q.vec().stableNorm();
+  if (n < NumTraits<Scalar>::epsilon()) n = q.vec().stableNorm();
 
-  if (n != Scalar(0))
-  {
-    m_angle = Scalar(2)*atan2(n, abs(q.w()));
-    if(q.w() < Scalar(0))
-      n = -n;
-    m_axis  = q.vec() / n;
-  }
-  else
-  {
+  if (n != Scalar(0)) {
+    m_angle = Scalar(2) * atan2(n, abs(q.w()));
+    if (q.w() < Scalar(0)) n = -n;
+    m_axis = q.vec() / n;
+  } else {
     m_angle = Scalar(0);
     m_axis << Scalar(1), Scalar(0), Scalar(0);
   }
@@ -194,57 +193,53 @@
 }
 
 /** Set \c *this from a 3x3 rotation matrix \a mat.
-  */
-template<typename Scalar>
-template<typename Derived>
-EIGEN_DEVICE_FUNC AngleAxis<Scalar>& AngleAxis<Scalar>::operator=(const MatrixBase<Derived>& mat)
-{
+ */
+template <typename Scalar>
+template <typename Derived>
+EIGEN_DEVICE_FUNC AngleAxis<Scalar>& AngleAxis<Scalar>::operator=(const MatrixBase<Derived>& mat) {
   // Since a direct conversion would not be really faster,
   // let's use the robust Quaternion implementation:
   return *this = QuaternionType(mat);
 }
 
 /**
-* \brief Sets \c *this from a 3x3 rotation matrix.
-**/
-template<typename Scalar>
-template<typename Derived>
-EIGEN_DEVICE_FUNC AngleAxis<Scalar>& AngleAxis<Scalar>::fromRotationMatrix(const MatrixBase<Derived>& mat)
-{
+ * \brief Sets \c *this from a 3x3 rotation matrix.
+ **/
+template <typename Scalar>
+template <typename Derived>
+EIGEN_DEVICE_FUNC AngleAxis<Scalar>& AngleAxis<Scalar>::fromRotationMatrix(const MatrixBase<Derived>& mat) {
   return *this = QuaternionType(mat);
 }
 
 /** Constructs and \returns an equivalent 3x3 rotation matrix.
-  */
-template<typename Scalar>
-typename AngleAxis<Scalar>::Matrix3
-EIGEN_DEVICE_FUNC AngleAxis<Scalar>::toRotationMatrix(void) const
-{
+ */
+template <typename Scalar>
+typename AngleAxis<Scalar>::Matrix3 EIGEN_DEVICE_FUNC AngleAxis<Scalar>::toRotationMatrix(void) const {
   EIGEN_USING_STD(sin)
   EIGEN_USING_STD(cos)
   Matrix3 res;
-  Vector3 sin_axis  = sin(m_angle) * m_axis;
+  Vector3 sin_axis = sin(m_angle) * m_axis;
   Scalar c = cos(m_angle);
-  Vector3 cos1_axis = (Scalar(1)-c) * m_axis;
+  Vector3 cos1_axis = (Scalar(1) - c) * m_axis;
 
   Scalar tmp;
   tmp = cos1_axis.x() * m_axis.y();
-  res.coeffRef(0,1) = tmp - sin_axis.z();
-  res.coeffRef(1,0) = tmp + sin_axis.z();
+  res.coeffRef(0, 1) = tmp - sin_axis.z();
+  res.coeffRef(1, 0) = tmp + sin_axis.z();
 
   tmp = cos1_axis.x() * m_axis.z();
-  res.coeffRef(0,2) = tmp + sin_axis.y();
-  res.coeffRef(2,0) = tmp - sin_axis.y();
+  res.coeffRef(0, 2) = tmp + sin_axis.y();
+  res.coeffRef(2, 0) = tmp - sin_axis.y();
 
   tmp = cos1_axis.y() * m_axis.z();
-  res.coeffRef(1,2) = tmp - sin_axis.x();
-  res.coeffRef(2,1) = tmp + sin_axis.x();
+  res.coeffRef(1, 2) = tmp - sin_axis.x();
+  res.coeffRef(2, 1) = tmp + sin_axis.x();
 
   res.diagonal() = (cos1_axis.cwiseProduct(m_axis)).array() + c;
 
   return res;
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_ANGLEAXIS_H
+#endif  // EIGEN_ANGLEAXIS_H
diff --git a/Eigen/src/Geometry/EulerAngles.h b/Eigen/src/Geometry/EulerAngles.h
index 6151c99..ad6b821 100644
--- a/Eigen/src/Geometry/EulerAngles.h
+++ b/Eigen/src/Geometry/EulerAngles.h
@@ -17,32 +17,33 @@
 namespace Eigen {
 
 /** \geometry_module \ingroup Geometry_Module
-  *
-  *
-  * \returns the canonical Euler-angles of the rotation matrix \c *this using the convention defined by the triplet (\a a0,\a a1,\a a2)
-  *
-  * Each of the three parameters \a a0,\a a1,\a a2 represents the respective rotation axis as an integer in {0,1,2}.
-  * For instance, in:
-  * \code Vector3f ea = mat.eulerAngles(2, 0, 2); \endcode
-  * "2" represents the z axis and "0" the x axis, etc. The returned angles are such that
-  * we have the following equality:
-  * \code
-  * mat == AngleAxisf(ea[0], Vector3f::UnitZ())
-  *      * AngleAxisf(ea[1], Vector3f::UnitX())
-  *      * AngleAxisf(ea[2], Vector3f::UnitZ()); \endcode
-  * This corresponds to the right-multiply conventions (with right hand side frames).
-  *
-  * For Tait-Bryan angle configurations (a0 != a2), the returned angles are in the ranges [-pi:pi]x[-pi/2:pi/2]x[-pi:pi].
-  * For proper Euler angle configurations (a0 == a2), the returned angles are in the ranges [-pi:pi]x[0:pi]x[-pi:pi].
-  *
-  * The approach used is also described here: https://d3cw3dd2w32x2b.cloudfront.net/wp-content/uploads/2012/07/euler-angles.pdf
-  *
-  * \sa class AngleAxis
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC inline Matrix<typename MatrixBase<Derived>::Scalar,3,1>
-MatrixBase<Derived>::canonicalEulerAngles(Index a0, Index a1, Index a2) const
-{
+ *
+ *
+ * \returns the canonical Euler-angles of the rotation matrix \c *this using the convention defined by the triplet (\a
+ * a0,\a a1,\a a2)
+ *
+ * Each of the three parameters \a a0,\a a1,\a a2 represents the respective rotation axis as an integer in {0,1,2}.
+ * For instance, in:
+ * \code Vector3f ea = mat.eulerAngles(2, 0, 2); \endcode
+ * "2" represents the z axis and "0" the x axis, etc. The returned angles are such that
+ * we have the following equality:
+ * \code
+ * mat == AngleAxisf(ea[0], Vector3f::UnitZ())
+ *      * AngleAxisf(ea[1], Vector3f::UnitX())
+ *      * AngleAxisf(ea[2], Vector3f::UnitZ()); \endcode
+ * This corresponds to the right-multiply conventions (with right hand side frames).
+ *
+ * For Tait-Bryan angle configurations (a0 != a2), the returned angles are in the ranges [-pi:pi]x[-pi/2:pi/2]x[-pi:pi].
+ * For proper Euler angle configurations (a0 == a2), the returned angles are in the ranges [-pi:pi]x[0:pi]x[-pi:pi].
+ *
+ * The approach used is also described here:
+ * https://d3cw3dd2w32x2b.cloudfront.net/wp-content/uploads/2012/07/euler-angles.pdf
+ *
+ * \sa class AngleAxis
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC inline Matrix<typename MatrixBase<Derived>::Scalar, 3, 1> MatrixBase<Derived>::canonicalEulerAngles(
+    Index a0, Index a1, Index a2) const {
   /* Implemented from Graphics Gems IV */
   EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Derived, 3, 3)
 
@@ -53,8 +54,7 @@
   const Index j = (a0 + 1 + odd) % 3;
   const Index k = (a0 + 2 - odd) % 3;
 
-  if (a0 == a2)
-  {
+  if (a0 == a2) {
     // Proper Euler angles (same first and last axis).
     // The i, j, k indices enable addressing the input matrix as the XYX archetype matrix (see Graphics Gems IV),
     // where e.g. coeff(k, i) means third column, first row in the XYX archetype matrix:
@@ -64,22 +64,19 @@
 
     // Note: s2 is always positive.
     Scalar s2 = numext::hypot(coeff(j, i), coeff(k, i));
-    if (odd)
-    {
+    if (odd) {
       res[0] = numext::atan2(coeff(j, i), coeff(k, i));
       // s2 is always positive, so res[1] will be within the canonical [0, pi] range
       res[1] = numext::atan2(s2, coeff(i, i));
-    }
-    else
-    {
-      // In the !odd case, signs of all three angles are flipped at the very end. To keep the solution within the canonical range,
-      // we flip the solution and make res[1] always negative here (since s2 is always positive, -atan2(s2, c2) will always be negative).
-      // The final flip at the end due to !odd will thus make res[1] positive and canonical.
-      // NB: in the general case, there are two correct solutions, but only one is canonical. For proper Euler angles,
-      // flipping from one solution to the other involves flipping the sign of the second angle res[1] and adding/subtracting pi
-      // to the first and third angles. The addition/subtraction of pi to the first angle res[0] is handled here by flipping
-      // the signs of arguments to atan2, while the calculation of the third angle does not need special adjustment since
-      // it uses the adjusted res[0] as the input and produces a correct result.
+    } else {
+      // In the !odd case, signs of all three angles are flipped at the very end. To keep the solution within the
+      // canonical range, we flip the solution and make res[1] always negative here (since s2 is always positive,
+      // -atan2(s2, c2) will always be negative). The final flip at the end due to !odd will thus make res[1] positive
+      // and canonical. NB: in the general case, there are two correct solutions, but only one is canonical. For proper
+      // Euler angles, flipping from one solution to the other involves flipping the sign of the second angle res[1] and
+      // adding/subtracting pi to the first and third angles. The addition/subtraction of pi to the first angle res[0]
+      // is handled here by flipping the signs of arguments to atan2, while the calculation of the third angle does not
+      // need special adjustment since it uses the adjusted res[0] as the input and produces a correct result.
       res[0] = numext::atan2(-coeff(j, i), -coeff(k, i));
       res[1] = -numext::atan2(s2, coeff(i, i));
     }
@@ -97,9 +94,7 @@
     Scalar s1 = numext::sin(res[0]);
     Scalar c1 = numext::cos(res[0]);
     res[2] = numext::atan2(c1 * coeff(j, k) - s1 * coeff(k, k), c1 * coeff(j, j) - s1 * coeff(k, j));
-  }
-  else
-  {
+  } else {
     // Tait-Bryan angles (all three axes are different; typically used for yaw-pitch-roll calculations).
     // The i, j, k indices enable addressing the input matrix as the XYZ archetype matrix (see Graphics Gems IV),
     // where e.g. coeff(k, i) means third column, first row in the XYZ archetype matrix:
@@ -110,15 +105,15 @@
     res[0] = numext::atan2(coeff(j, k), coeff(k, k));
 
     Scalar c2 = numext::hypot(coeff(i, i), coeff(i, j));
-    // c2 is always positive, so the following atan2 will always return a result in the correct canonical middle angle range [-pi/2, pi/2]
+    // c2 is always positive, so the following atan2 will always return a result in the correct canonical middle angle
+    // range [-pi/2, pi/2]
     res[1] = numext::atan2(-coeff(i, k), c2);
 
     Scalar s1 = numext::sin(res[0]);
     Scalar c1 = numext::cos(res[0]);
     res[2] = numext::atan2(s1 * coeff(k, i) - c1 * coeff(j, i), c1 * coeff(j, j) - s1 * coeff(k, j));
   }
-  if (!odd)
-  {
+  if (!odd) {
     res = -res;
   }
 
@@ -126,19 +121,20 @@
 }
 
 /** \geometry_module \ingroup Geometry_Module
-  *
-  *
-  * \returns the Euler-angles of the rotation matrix \c *this using the convention defined by the triplet (\a a0,\a a1,\a a2)
-  *
-  * NB: The returned angles are in non-canonical ranges [0:pi]x[-pi:pi]x[-pi:pi]. For canonical Tait-Bryan/proper Euler ranges, use canonicalEulerAngles.
-  *
-  * \sa MatrixBase::canonicalEulerAngles
-  * \sa class AngleAxis
-  */
-template<typename Derived>
-EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline Matrix<typename MatrixBase<Derived>::Scalar,3,1>
-MatrixBase<Derived>::eulerAngles(Index a0, Index a1, Index a2) const
-{
+ *
+ *
+ * \returns the Euler-angles of the rotation matrix \c *this using the convention defined by the triplet (\a a0,\a a1,\a
+ * a2)
+ *
+ * NB: The returned angles are in non-canonical ranges [0:pi]x[-pi:pi]x[-pi:pi]. For canonical Tait-Bryan/proper Euler
+ * ranges, use canonicalEulerAngles.
+ *
+ * \sa MatrixBase::canonicalEulerAngles
+ * \sa class AngleAxis
+ */
+template <typename Derived>
+EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline Matrix<typename MatrixBase<Derived>::Scalar, 3, 1>
+MatrixBase<Derived>::eulerAngles(Index a0, Index a1, Index a2) const {
   /* Implemented from Graphics Gems IV */
   EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Derived, 3, 3)
 
@@ -149,25 +145,18 @@
   const Index j = (a0 + 1 + odd) % 3;
   const Index k = (a0 + 2 - odd) % 3;
 
-  if (a0 == a2)
-  {
+  if (a0 == a2) {
     res[0] = numext::atan2(coeff(j, i), coeff(k, i));
-    if ((odd && res[0] < Scalar(0)) || ((!odd) && res[0] > Scalar(0)))
-    {
-      if (res[0] > Scalar(0))
-      {
+    if ((odd && res[0] < Scalar(0)) || ((!odd) && res[0] > Scalar(0))) {
+      if (res[0] > Scalar(0)) {
         res[0] -= Scalar(EIGEN_PI);
-      }
-      else
-      {
+      } else {
         res[0] += Scalar(EIGEN_PI);
       }
 
       Scalar s2 = numext::hypot(coeff(j, i), coeff(k, i));
       res[1] = -numext::atan2(s2, coeff(i, i));
-    }
-    else
-    {
+    } else {
       Scalar s2 = numext::hypot(coeff(j, i), coeff(k, i));
       res[1] = numext::atan2(s2, coeff(i, i));
     }
@@ -185,39 +174,30 @@
     Scalar s1 = numext::sin(res[0]);
     Scalar c1 = numext::cos(res[0]);
     res[2] = numext::atan2(c1 * coeff(j, k) - s1 * coeff(k, k), c1 * coeff(j, j) - s1 * coeff(k, j));
-  }
-  else
-  {
+  } else {
     res[0] = numext::atan2(coeff(j, k), coeff(k, k));
     Scalar c2 = numext::hypot(coeff(i, i), coeff(i, j));
-    if ((odd && res[0] < Scalar(0)) || ((!odd) && res[0] > Scalar(0)))
-    {
-      if (res[0] > Scalar(0))
-      {
+    if ((odd && res[0] < Scalar(0)) || ((!odd) && res[0] > Scalar(0))) {
+      if (res[0] > Scalar(0)) {
         res[0] -= Scalar(EIGEN_PI);
-      }
-      else
-      {
+      } else {
         res[0] += Scalar(EIGEN_PI);
       }
       res[1] = numext::atan2(-coeff(i, k), -c2);
-    }
-    else
-    {
+    } else {
       res[1] = numext::atan2(-coeff(i, k), c2);
     }
     Scalar s1 = numext::sin(res[0]);
     Scalar c1 = numext::cos(res[0]);
     res[2] = numext::atan2(s1 * coeff(k, i) - c1 * coeff(j, i), c1 * coeff(j, j) - s1 * coeff(k, j));
   }
-  if (!odd)
-  {
+  if (!odd) {
     res = -res;
   }
 
   return res;
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_EULERANGLES_H
+#endif  // EIGEN_EULERANGLES_H
diff --git a/Eigen/src/Geometry/Homogeneous.h b/Eigen/src/Geometry/Homogeneous.h
index 292530b..64c1b65 100644
--- a/Eigen/src/Geometry/Homogeneous.h
+++ b/Eigen/src/Geometry/Homogeneous.h
@@ -16,142 +16,132 @@
 namespace Eigen {
 
 /** \geometry_module \ingroup Geometry_Module
-  *
-  * \class Homogeneous
-  *
-  * \brief Expression of one (or a set of) homogeneous vector(s)
-  *
-  * \param MatrixType the type of the object in which we are making homogeneous
-  *
-  * This class represents an expression of one (or a set of) homogeneous vector(s).
-  * It is the return type of MatrixBase::homogeneous() and most of the time
-  * this is the only way it is used.
-  *
-  * \sa MatrixBase::homogeneous()
-  */
+ *
+ * \class Homogeneous
+ *
+ * \brief Expression of one (or a set of) homogeneous vector(s)
+ *
+ * \param MatrixType the type of the object in which we are making homogeneous
+ *
+ * This class represents an expression of one (or a set of) homogeneous vector(s).
+ * It is the return type of MatrixBase::homogeneous() and most of the time
+ * this is the only way it is used.
+ *
+ * \sa MatrixBase::homogeneous()
+ */
 
 namespace internal {
 
-template<typename MatrixType,int Direction>
-struct traits<Homogeneous<MatrixType,Direction> >
- : traits<MatrixType>
-{
+template <typename MatrixType, int Direction>
+struct traits<Homogeneous<MatrixType, Direction> > : traits<MatrixType> {
   typedef typename traits<MatrixType>::StorageKind StorageKind;
   typedef typename ref_selector<MatrixType>::type MatrixTypeNested;
   typedef std::remove_reference_t<MatrixTypeNested> MatrixTypeNested_;
   enum {
-    RowsPlusOne = (MatrixType::RowsAtCompileTime != Dynamic) ?
-                  int(MatrixType::RowsAtCompileTime) + 1 : Dynamic,
-    ColsPlusOne = (MatrixType::ColsAtCompileTime != Dynamic) ?
-                  int(MatrixType::ColsAtCompileTime) + 1 : Dynamic,
-    RowsAtCompileTime = Direction==Vertical  ?  RowsPlusOne : MatrixType::RowsAtCompileTime,
-    ColsAtCompileTime = Direction==Horizontal ? ColsPlusOne : MatrixType::ColsAtCompileTime,
+    RowsPlusOne = (MatrixType::RowsAtCompileTime != Dynamic) ? int(MatrixType::RowsAtCompileTime) + 1 : Dynamic,
+    ColsPlusOne = (MatrixType::ColsAtCompileTime != Dynamic) ? int(MatrixType::ColsAtCompileTime) + 1 : Dynamic,
+    RowsAtCompileTime = Direction == Vertical ? RowsPlusOne : MatrixType::RowsAtCompileTime,
+    ColsAtCompileTime = Direction == Horizontal ? ColsPlusOne : MatrixType::ColsAtCompileTime,
     MaxRowsAtCompileTime = RowsAtCompileTime,
     MaxColsAtCompileTime = ColsAtCompileTime,
     TmpFlags = MatrixTypeNested_::Flags & HereditaryBits,
-    Flags = ColsAtCompileTime==1 ? (TmpFlags & ~RowMajorBit)
-          : RowsAtCompileTime==1 ? (TmpFlags | RowMajorBit)
-          : TmpFlags
+    Flags = ColsAtCompileTime == 1   ? (TmpFlags & ~RowMajorBit)
+            : RowsAtCompileTime == 1 ? (TmpFlags | RowMajorBit)
+                                     : TmpFlags
   };
 };
 
-template<typename MatrixType,typename Lhs> struct homogeneous_left_product_impl;
-template<typename MatrixType,typename Rhs> struct homogeneous_right_product_impl;
+template <typename MatrixType, typename Lhs>
+struct homogeneous_left_product_impl;
+template <typename MatrixType, typename Rhs>
+struct homogeneous_right_product_impl;
 
-} // end namespace internal
+}  // end namespace internal
 
-template<typename MatrixType,int Direction_> class Homogeneous
-  : public MatrixBase<Homogeneous<MatrixType,Direction_> >, internal::no_assignment_operator
-{
-  public:
+template <typename MatrixType, int Direction_>
+class Homogeneous : public MatrixBase<Homogeneous<MatrixType, Direction_> >, internal::no_assignment_operator {
+ public:
+  typedef MatrixType NestedExpression;
+  enum { Direction = Direction_ };
 
-    typedef MatrixType NestedExpression;
-    enum { Direction = Direction_ };
+  typedef MatrixBase<Homogeneous> Base;
+  EIGEN_DENSE_PUBLIC_INTERFACE(Homogeneous)
 
-    typedef MatrixBase<Homogeneous> Base;
-    EIGEN_DENSE_PUBLIC_INTERFACE(Homogeneous)
+  EIGEN_DEVICE_FUNC explicit inline Homogeneous(const MatrixType& matrix) : m_matrix(matrix) {}
 
-    EIGEN_DEVICE_FUNC explicit inline Homogeneous(const MatrixType& matrix)
-      : m_matrix(matrix)
-    {}
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index rows() const EIGEN_NOEXCEPT {
+    return m_matrix.rows() + (int(Direction) == Vertical ? 1 : 0);
+  }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index cols() const EIGEN_NOEXCEPT {
+    return m_matrix.cols() + (int(Direction) == Horizontal ? 1 : 0);
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index rows() const EIGEN_NOEXCEPT { return m_matrix.rows() + (int(Direction)==Vertical   ? 1 : 0); }
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index cols() const EIGEN_NOEXCEPT { return m_matrix.cols() + (int(Direction)==Horizontal ? 1 : 0); }
+  EIGEN_DEVICE_FUNC const NestedExpression& nestedExpression() const { return m_matrix; }
 
-    EIGEN_DEVICE_FUNC const NestedExpression& nestedExpression() const { return m_matrix; }
+  template <typename Rhs>
+  EIGEN_DEVICE_FUNC inline const Product<Homogeneous, Rhs> operator*(const MatrixBase<Rhs>& rhs) const {
+    eigen_assert(int(Direction) == Horizontal);
+    return Product<Homogeneous, Rhs>(*this, rhs.derived());
+  }
 
-    template<typename Rhs>
-    EIGEN_DEVICE_FUNC inline const Product<Homogeneous,Rhs>
-    operator* (const MatrixBase<Rhs>& rhs) const
-    {
-      eigen_assert(int(Direction)==Horizontal);
-      return Product<Homogeneous,Rhs>(*this,rhs.derived());
-    }
+  template <typename Lhs>
+  friend EIGEN_DEVICE_FUNC inline const Product<Lhs, Homogeneous> operator*(const MatrixBase<Lhs>& lhs,
+                                                                            const Homogeneous& rhs) {
+    eigen_assert(int(Direction) == Vertical);
+    return Product<Lhs, Homogeneous>(lhs.derived(), rhs);
+  }
 
-    template<typename Lhs> friend
-    EIGEN_DEVICE_FUNC inline const Product<Lhs,Homogeneous>
-    operator* (const MatrixBase<Lhs>& lhs, const Homogeneous& rhs)
-    {
-      eigen_assert(int(Direction)==Vertical);
-      return Product<Lhs,Homogeneous>(lhs.derived(),rhs);
-    }
+  template <typename Scalar, int Dim, int Mode, int Options>
+  friend EIGEN_DEVICE_FUNC inline const Product<Transform<Scalar, Dim, Mode, Options>, Homogeneous> operator*(
+      const Transform<Scalar, Dim, Mode, Options>& lhs, const Homogeneous& rhs) {
+    eigen_assert(int(Direction) == Vertical);
+    return Product<Transform<Scalar, Dim, Mode, Options>, Homogeneous>(lhs, rhs);
+  }
 
-    template<typename Scalar, int Dim, int Mode, int Options> friend
-    EIGEN_DEVICE_FUNC inline const Product<Transform<Scalar,Dim,Mode,Options>, Homogeneous >
-    operator* (const Transform<Scalar,Dim,Mode,Options>& lhs, const Homogeneous& rhs)
-    {
-      eigen_assert(int(Direction)==Vertical);
-      return Product<Transform<Scalar,Dim,Mode,Options>, Homogeneous>(lhs,rhs);
-    }
+  template <typename Func>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::result_of<Func(Scalar, Scalar)>::type redux(
+      const Func& func) const {
+    return func(m_matrix.redux(func), Scalar(1));
+  }
 
-    template<typename Func>
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::result_of<Func(Scalar,Scalar)>::type
-    redux(const Func& func) const
-    {
-      return func(m_matrix.redux(func), Scalar(1));
-    }
-
-  protected:
-    typename MatrixType::Nested m_matrix;
+ protected:
+  typename MatrixType::Nested m_matrix;
 };
 
 /** \geometry_module \ingroup Geometry_Module
-  *
-  * \returns a vector expression that is one longer than the vector argument, with the value 1 symbolically appended as the last coefficient.
-  *
-  * This can be used to convert affine coordinates to homogeneous coordinates.
-  *
-  * \only_for_vectors
-  *
-  * Example: \include MatrixBase_homogeneous.cpp
-  * Output: \verbinclude MatrixBase_homogeneous.out
-  *
-  * \sa VectorwiseOp::homogeneous(), class Homogeneous
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC inline typename MatrixBase<Derived>::HomogeneousReturnType
-MatrixBase<Derived>::homogeneous() const
-{
+ *
+ * \returns a vector expression that is one longer than the vector argument, with the value 1 symbolically appended as
+ * the last coefficient.
+ *
+ * This can be used to convert affine coordinates to homogeneous coordinates.
+ *
+ * \only_for_vectors
+ *
+ * Example: \include MatrixBase_homogeneous.cpp
+ * Output: \verbinclude MatrixBase_homogeneous.out
+ *
+ * \sa VectorwiseOp::homogeneous(), class Homogeneous
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC inline typename MatrixBase<Derived>::HomogeneousReturnType MatrixBase<Derived>::homogeneous() const {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
   return HomogeneousReturnType(derived());
 }
 
 /** \geometry_module \ingroup Geometry_Module
-  *
-  * \returns an expression where the value 1 is symbolically appended as the final coefficient to each column (or row) of the matrix.
-  *
-  * This can be used to convert affine coordinates to homogeneous coordinates.
-  *
-  * Example: \include VectorwiseOp_homogeneous.cpp
-  * Output: \verbinclude VectorwiseOp_homogeneous.out
-  *
-  * \sa MatrixBase::homogeneous(), class Homogeneous */
-template<typename ExpressionType, int Direction>
-EIGEN_DEVICE_FUNC inline Homogeneous<ExpressionType,Direction>
-VectorwiseOp<ExpressionType,Direction>::homogeneous() const
-{
+ *
+ * \returns an expression where the value 1 is symbolically appended as the final coefficient to each column (or row) of
+ * the matrix.
+ *
+ * This can be used to convert affine coordinates to homogeneous coordinates.
+ *
+ * Example: \include VectorwiseOp_homogeneous.cpp
+ * Output: \verbinclude VectorwiseOp_homogeneous.out
+ *
+ * \sa MatrixBase::homogeneous(), class Homogeneous */
+template <typename ExpressionType, int Direction>
+EIGEN_DEVICE_FUNC inline Homogeneous<ExpressionType, Direction> VectorwiseOp<ExpressionType, Direction>::homogeneous()
+    const {
   return HomogeneousReturnType(_expression());
 }
 
@@ -172,333 +162,294 @@
   * Output: \verbinclude MatrixBase_hnormalized.out
   *
   * \sa VectorwiseOp::hnormalized() */
-template<typename Derived>
-EIGEN_DEVICE_FUNC inline const typename MatrixBase<Derived>::HNormalizedReturnType
-MatrixBase<Derived>::hnormalized() const
-{
+template <typename Derived>
+EIGEN_DEVICE_FUNC inline const typename MatrixBase<Derived>::HNormalizedReturnType MatrixBase<Derived>::hnormalized()
+    const {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
-  return ConstStartMinusOne(derived(),0,0,
-    ColsAtCompileTime==1?size()-1:1,
-    ColsAtCompileTime==1?1:size()-1) / coeff(size()-1);
+  return ConstStartMinusOne(derived(), 0, 0, ColsAtCompileTime == 1 ? size() - 1 : 1,
+                            ColsAtCompileTime == 1 ? 1 : size() - 1) /
+         coeff(size() - 1);
 }
 
 /** \geometry_module \ingroup Geometry_Module
-  *
-  * \brief column or row-wise homogeneous normalization
-  *
-  * \returns an expression of the first N-1 coefficients of each column (or row) of \c *this divided by the last coefficient of each column (or row).
-  *
-  * This can be used to convert homogeneous coordinates to affine coordinates.
-  *
-  * It is conceptually equivalent to calling MatrixBase::hnormalized() to each column (or row) of \c *this.
-  *
-  * Example: \include DirectionWise_hnormalized.cpp
-  * Output: \verbinclude DirectionWise_hnormalized.out
-  *
-  * \sa MatrixBase::hnormalized() */
-template<typename ExpressionType, int Direction>
-EIGEN_DEVICE_FUNC inline const typename VectorwiseOp<ExpressionType,Direction>::HNormalizedReturnType
-VectorwiseOp<ExpressionType,Direction>::hnormalized() const
-{
-  return HNormalized_Block(_expression(),0,0,
-      Direction==Vertical   ? _expression().rows()-1 : _expression().rows(),
-      Direction==Horizontal ? _expression().cols()-1 : _expression().cols()).cwiseQuotient(
-      Replicate<HNormalized_Factors,
-                Direction==Vertical   ? HNormalized_SizeMinusOne : 1,
-                Direction==Horizontal ? HNormalized_SizeMinusOne : 1>
-        (HNormalized_Factors(_expression(),
-          Direction==Vertical    ? _expression().rows()-1:0,
-          Direction==Horizontal  ? _expression().cols()-1:0,
-          Direction==Vertical    ? 1 : _expression().rows(),
-          Direction==Horizontal  ? 1 : _expression().cols()),
-         Direction==Vertical   ? _expression().rows()-1 : 1,
-         Direction==Horizontal ? _expression().cols()-1 : 1));
+ *
+ * \brief column or row-wise homogeneous normalization
+ *
+ * \returns an expression of the first N-1 coefficients of each column (or row) of \c *this divided by the last
+ * coefficient of each column (or row).
+ *
+ * This can be used to convert homogeneous coordinates to affine coordinates.
+ *
+ * It is conceptually equivalent to calling MatrixBase::hnormalized() to each column (or row) of \c *this.
+ *
+ * Example: \include DirectionWise_hnormalized.cpp
+ * Output: \verbinclude DirectionWise_hnormalized.out
+ *
+ * \sa MatrixBase::hnormalized() */
+template <typename ExpressionType, int Direction>
+EIGEN_DEVICE_FUNC inline const typename VectorwiseOp<ExpressionType, Direction>::HNormalizedReturnType
+VectorwiseOp<ExpressionType, Direction>::hnormalized() const {
+  return HNormalized_Block(_expression(), 0, 0, Direction == Vertical ? _expression().rows() - 1 : _expression().rows(),
+                           Direction == Horizontal ? _expression().cols() - 1 : _expression().cols())
+      .cwiseQuotient(Replicate < HNormalized_Factors, Direction == Vertical ? HNormalized_SizeMinusOne : 1,
+                     Direction == Horizontal
+                         ? HNormalized_SizeMinusOne
+                         : 1 > (HNormalized_Factors(_expression(), Direction == Vertical ? _expression().rows() - 1 : 0,
+                                                    Direction == Horizontal ? _expression().cols() - 1 : 0,
+                                                    Direction == Vertical ? 1 : _expression().rows(),
+                                                    Direction == Horizontal ? 1 : _expression().cols()),
+                                Direction == Vertical ? _expression().rows() - 1 : 1,
+                                Direction == Horizontal ? _expression().cols() - 1 : 1));
 }
 
 namespace internal {
 
-template<typename MatrixOrTransformType>
-struct take_matrix_for_product
-{
+template <typename MatrixOrTransformType>
+struct take_matrix_for_product {
   typedef MatrixOrTransformType type;
-  EIGEN_DEVICE_FUNC static const type& run(const type &x) { return x; }
+  EIGEN_DEVICE_FUNC static const type& run(const type& x) { return x; }
 };
 
-template<typename Scalar, int Dim, int Mode,int Options>
-struct take_matrix_for_product<Transform<Scalar, Dim, Mode, Options> >
-{
+template <typename Scalar, int Dim, int Mode, int Options>
+struct take_matrix_for_product<Transform<Scalar, Dim, Mode, Options> > {
   typedef Transform<Scalar, Dim, Mode, Options> TransformType;
   typedef std::add_const_t<typename TransformType::ConstAffinePart> type;
-  EIGEN_DEVICE_FUNC static type run (const TransformType& x) { return x.affine(); }
+  EIGEN_DEVICE_FUNC static type run(const TransformType& x) { return x.affine(); }
 };
 
-template<typename Scalar, int Dim, int Options>
-struct take_matrix_for_product<Transform<Scalar, Dim, Projective, Options> >
-{
+template <typename Scalar, int Dim, int Options>
+struct take_matrix_for_product<Transform<Scalar, Dim, Projective, Options> > {
   typedef Transform<Scalar, Dim, Projective, Options> TransformType;
   typedef typename TransformType::MatrixType type;
-  EIGEN_DEVICE_FUNC static const type& run (const TransformType& x) { return x.matrix(); }
+  EIGEN_DEVICE_FUNC static const type& run(const TransformType& x) { return x.matrix(); }
 };
 
-template<typename MatrixType,typename Lhs>
-struct traits<homogeneous_left_product_impl<Homogeneous<MatrixType,Vertical>,Lhs> >
-{
+template <typename MatrixType, typename Lhs>
+struct traits<homogeneous_left_product_impl<Homogeneous<MatrixType, Vertical>, Lhs> > {
   typedef typename take_matrix_for_product<Lhs>::type LhsMatrixType;
   typedef remove_all_t<MatrixType> MatrixTypeCleaned;
   typedef remove_all_t<LhsMatrixType> LhsMatrixTypeCleaned;
   typedef typename make_proper_matrix_type<
-                 typename traits<MatrixTypeCleaned>::Scalar,
-                 LhsMatrixTypeCleaned::RowsAtCompileTime,
-                 MatrixTypeCleaned::ColsAtCompileTime,
-                 MatrixTypeCleaned::PlainObject::Options,
-                 LhsMatrixTypeCleaned::MaxRowsAtCompileTime,
-                 MatrixTypeCleaned::MaxColsAtCompileTime>::type ReturnType;
+      typename traits<MatrixTypeCleaned>::Scalar, LhsMatrixTypeCleaned::RowsAtCompileTime,
+      MatrixTypeCleaned::ColsAtCompileTime, MatrixTypeCleaned::PlainObject::Options,
+      LhsMatrixTypeCleaned::MaxRowsAtCompileTime, MatrixTypeCleaned::MaxColsAtCompileTime>::type ReturnType;
 };
 
-template<typename MatrixType,typename Lhs>
-struct homogeneous_left_product_impl<Homogeneous<MatrixType,Vertical>,Lhs>
-  : public ReturnByValue<homogeneous_left_product_impl<Homogeneous<MatrixType,Vertical>,Lhs> >
-{
+template <typename MatrixType, typename Lhs>
+struct homogeneous_left_product_impl<Homogeneous<MatrixType, Vertical>, Lhs>
+    : public ReturnByValue<homogeneous_left_product_impl<Homogeneous<MatrixType, Vertical>, Lhs> > {
   typedef typename traits<homogeneous_left_product_impl>::LhsMatrixType LhsMatrixType;
   typedef remove_all_t<LhsMatrixType> LhsMatrixTypeCleaned;
   typedef remove_all_t<typename LhsMatrixTypeCleaned::Nested> LhsMatrixTypeNested;
   EIGEN_DEVICE_FUNC homogeneous_left_product_impl(const Lhs& lhs, const MatrixType& rhs)
-    : m_lhs(take_matrix_for_product<Lhs>::run(lhs)),
-      m_rhs(rhs)
-  {}
+      : m_lhs(take_matrix_for_product<Lhs>::run(lhs)), m_rhs(rhs) {}
 
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  inline Index rows() const EIGEN_NOEXCEPT { return m_lhs.rows(); }
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  inline Index cols() const EIGEN_NOEXCEPT { return m_rhs.cols(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index rows() const EIGEN_NOEXCEPT { return m_lhs.rows(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index cols() const EIGEN_NOEXCEPT { return m_rhs.cols(); }
 
-  template<typename Dest> EIGEN_DEVICE_FUNC void evalTo(Dest& dst) const
-  {
+  template <typename Dest>
+  EIGEN_DEVICE_FUNC void evalTo(Dest& dst) const {
     // FIXME investigate how to allow lazy evaluation of this product when possible
-    dst = Block<const LhsMatrixTypeNested,
-              LhsMatrixTypeNested::RowsAtCompileTime,
-              LhsMatrixTypeNested::ColsAtCompileTime==Dynamic?Dynamic:LhsMatrixTypeNested::ColsAtCompileTime-1>
-            (m_lhs,0,0,m_lhs.rows(),m_lhs.cols()-1) * m_rhs;
-    dst += m_lhs.col(m_lhs.cols()-1).rowwise()
-            .template replicate<MatrixType::ColsAtCompileTime>(m_rhs.cols());
+    dst = Block < const LhsMatrixTypeNested, LhsMatrixTypeNested::RowsAtCompileTime,
+    LhsMatrixTypeNested::ColsAtCompileTime == Dynamic
+        ? Dynamic
+        : LhsMatrixTypeNested::ColsAtCompileTime - 1 > (m_lhs, 0, 0, m_lhs.rows(), m_lhs.cols() - 1) * m_rhs;
+    dst += m_lhs.col(m_lhs.cols() - 1).rowwise().template replicate<MatrixType::ColsAtCompileTime>(m_rhs.cols());
   }
 
   typename LhsMatrixTypeCleaned::Nested m_lhs;
   typename MatrixType::Nested m_rhs;
 };
 
-template<typename MatrixType,typename Rhs>
-struct traits<homogeneous_right_product_impl<Homogeneous<MatrixType,Horizontal>,Rhs> >
-{
-  typedef typename make_proper_matrix_type<typename traits<MatrixType>::Scalar,
-                 MatrixType::RowsAtCompileTime,
-                 Rhs::ColsAtCompileTime,
-                 MatrixType::PlainObject::Options,
-                 MatrixType::MaxRowsAtCompileTime,
-                 Rhs::MaxColsAtCompileTime>::type ReturnType;
+template <typename MatrixType, typename Rhs>
+struct traits<homogeneous_right_product_impl<Homogeneous<MatrixType, Horizontal>, Rhs> > {
+  typedef
+      typename make_proper_matrix_type<typename traits<MatrixType>::Scalar, MatrixType::RowsAtCompileTime,
+                                       Rhs::ColsAtCompileTime, MatrixType::PlainObject::Options,
+                                       MatrixType::MaxRowsAtCompileTime, Rhs::MaxColsAtCompileTime>::type ReturnType;
 };
 
-template<typename MatrixType,typename Rhs>
-struct homogeneous_right_product_impl<Homogeneous<MatrixType,Horizontal>,Rhs>
-  : public ReturnByValue<homogeneous_right_product_impl<Homogeneous<MatrixType,Horizontal>,Rhs> >
-{
+template <typename MatrixType, typename Rhs>
+struct homogeneous_right_product_impl<Homogeneous<MatrixType, Horizontal>, Rhs>
+    : public ReturnByValue<homogeneous_right_product_impl<Homogeneous<MatrixType, Horizontal>, Rhs> > {
   typedef remove_all_t<typename Rhs::Nested> RhsNested;
-  EIGEN_DEVICE_FUNC homogeneous_right_product_impl(const MatrixType& lhs, const Rhs& rhs)
-    : m_lhs(lhs), m_rhs(rhs)
-  {}
+  EIGEN_DEVICE_FUNC homogeneous_right_product_impl(const MatrixType& lhs, const Rhs& rhs) : m_lhs(lhs), m_rhs(rhs) {}
 
   EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index rows() const EIGEN_NOEXCEPT { return m_lhs.rows(); }
   EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index cols() const EIGEN_NOEXCEPT { return m_rhs.cols(); }
 
-  template<typename Dest> EIGEN_DEVICE_FUNC void evalTo(Dest& dst) const
-  {
+  template <typename Dest>
+  EIGEN_DEVICE_FUNC void evalTo(Dest& dst) const {
     // FIXME investigate how to allow lazy evaluation of this product when possible
-    dst = m_lhs * Block<const RhsNested,
-                        RhsNested::RowsAtCompileTime==Dynamic?Dynamic:RhsNested::RowsAtCompileTime-1,
-                        RhsNested::ColsAtCompileTime>
-            (m_rhs,0,0,m_rhs.rows()-1,m_rhs.cols());
-    dst += m_rhs.row(m_rhs.rows()-1).colwise()
-            .template replicate<MatrixType::RowsAtCompileTime>(m_lhs.rows());
+    dst = m_lhs * Block < const RhsNested,
+    RhsNested::RowsAtCompileTime == Dynamic ? Dynamic : RhsNested::RowsAtCompileTime - 1,
+    RhsNested::ColsAtCompileTime > (m_rhs, 0, 0, m_rhs.rows() - 1, m_rhs.cols());
+    dst += m_rhs.row(m_rhs.rows() - 1).colwise().template replicate<MatrixType::RowsAtCompileTime>(m_lhs.rows());
   }
 
   typename MatrixType::Nested m_lhs;
   typename Rhs::Nested m_rhs;
 };
 
-template<typename ArgType,int Direction>
-struct evaluator_traits<Homogeneous<ArgType,Direction> >
-{
+template <typename ArgType, int Direction>
+struct evaluator_traits<Homogeneous<ArgType, Direction> > {
   typedef typename storage_kind_to_evaluator_kind<typename ArgType::StorageKind>::Kind Kind;
   typedef HomogeneousShape Shape;
 };
 
-template<> struct AssignmentKind<DenseShape,HomogeneousShape> { typedef Dense2Dense Kind; };
+template <>
+struct AssignmentKind<DenseShape, HomogeneousShape> {
+  typedef Dense2Dense Kind;
+};
 
-
-template<typename ArgType,int Direction>
-struct unary_evaluator<Homogeneous<ArgType,Direction>, IndexBased>
-  : evaluator<typename Homogeneous<ArgType,Direction>::PlainObject >
-{
-  typedef Homogeneous<ArgType,Direction> XprType;
+template <typename ArgType, int Direction>
+struct unary_evaluator<Homogeneous<ArgType, Direction>, IndexBased>
+    : evaluator<typename Homogeneous<ArgType, Direction>::PlainObject> {
+  typedef Homogeneous<ArgType, Direction> XprType;
   typedef typename XprType::PlainObject PlainObject;
   typedef evaluator<PlainObject> Base;
 
-  EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& op)
-    : Base(), m_temp(op)
-  {
+  EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& op) : Base(), m_temp(op) {
     internal::construct_at<Base>(this, m_temp);
   }
 
-protected:
+ protected:
   PlainObject m_temp;
 };
 
 // dense = homogeneous
-template< typename DstXprType, typename ArgType, typename Scalar>
-struct Assignment<DstXprType, Homogeneous<ArgType,Vertical>, internal::assign_op<Scalar,typename ArgType::Scalar>, Dense2Dense>
-{
-  typedef Homogeneous<ArgType,Vertical> SrcXprType;
-  EIGEN_DEVICE_FUNC static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<Scalar,typename ArgType::Scalar> &)
-  {
+template <typename DstXprType, typename ArgType, typename Scalar>
+struct Assignment<DstXprType, Homogeneous<ArgType, Vertical>, internal::assign_op<Scalar, typename ArgType::Scalar>,
+                  Dense2Dense> {
+  typedef Homogeneous<ArgType, Vertical> SrcXprType;
+  EIGEN_DEVICE_FUNC static void run(DstXprType& dst, const SrcXprType& src,
+                                    const internal::assign_op<Scalar, typename ArgType::Scalar>&) {
     Index dstRows = src.rows();
     Index dstCols = src.cols();
-    if((dst.rows()!=dstRows) || (dst.cols()!=dstCols))
-      dst.resize(dstRows, dstCols);
+    if ((dst.rows() != dstRows) || (dst.cols() != dstCols)) dst.resize(dstRows, dstCols);
 
     dst.template topRows<ArgType::RowsAtCompileTime>(src.nestedExpression().rows()) = src.nestedExpression();
-    dst.row(dst.rows()-1).setOnes();
+    dst.row(dst.rows() - 1).setOnes();
   }
 };
 
 // dense = homogeneous
-template< typename DstXprType, typename ArgType, typename Scalar>
-struct Assignment<DstXprType, Homogeneous<ArgType,Horizontal>, internal::assign_op<Scalar,typename ArgType::Scalar>, Dense2Dense>
-{
-  typedef Homogeneous<ArgType,Horizontal> SrcXprType;
-  EIGEN_DEVICE_FUNC static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<Scalar,typename ArgType::Scalar> &)
-  {
+template <typename DstXprType, typename ArgType, typename Scalar>
+struct Assignment<DstXprType, Homogeneous<ArgType, Horizontal>, internal::assign_op<Scalar, typename ArgType::Scalar>,
+                  Dense2Dense> {
+  typedef Homogeneous<ArgType, Horizontal> SrcXprType;
+  EIGEN_DEVICE_FUNC static void run(DstXprType& dst, const SrcXprType& src,
+                                    const internal::assign_op<Scalar, typename ArgType::Scalar>&) {
     Index dstRows = src.rows();
     Index dstCols = src.cols();
-    if((dst.rows()!=dstRows) || (dst.cols()!=dstCols))
-      dst.resize(dstRows, dstCols);
+    if ((dst.rows() != dstRows) || (dst.cols() != dstCols)) dst.resize(dstRows, dstCols);
 
     dst.template leftCols<ArgType::ColsAtCompileTime>(src.nestedExpression().cols()) = src.nestedExpression();
-    dst.col(dst.cols()-1).setOnes();
+    dst.col(dst.cols() - 1).setOnes();
   }
 };
 
-template<typename LhsArg, typename Rhs, int ProductTag>
-struct generic_product_impl<Homogeneous<LhsArg,Horizontal>, Rhs, HomogeneousShape, DenseShape, ProductTag>
-{
-  template<typename Dest>
-  EIGEN_DEVICE_FUNC static void evalTo(Dest& dst, const Homogeneous<LhsArg,Horizontal>& lhs, const Rhs& rhs)
-  {
-    homogeneous_right_product_impl<Homogeneous<LhsArg,Horizontal>, Rhs>(lhs.nestedExpression(), rhs).evalTo(dst);
+template <typename LhsArg, typename Rhs, int ProductTag>
+struct generic_product_impl<Homogeneous<LhsArg, Horizontal>, Rhs, HomogeneousShape, DenseShape, ProductTag> {
+  template <typename Dest>
+  EIGEN_DEVICE_FUNC static void evalTo(Dest& dst, const Homogeneous<LhsArg, Horizontal>& lhs, const Rhs& rhs) {
+    homogeneous_right_product_impl<Homogeneous<LhsArg, Horizontal>, Rhs>(lhs.nestedExpression(), rhs).evalTo(dst);
   }
 };
 
-template<typename Lhs,typename Rhs>
-struct homogeneous_right_product_refactoring_helper
-{
-  enum {
-    Dim  = Lhs::ColsAtCompileTime,
-    Rows = Lhs::RowsAtCompileTime
-  };
-  typedef typename Rhs::template ConstNRowsBlockXpr<Dim>::Type          LinearBlockConst;
-  typedef std::remove_const_t<LinearBlockConst>                 LinearBlock;
-  typedef typename Rhs::ConstRowXpr                                     ConstantColumn;
-  typedef Replicate<const ConstantColumn,Rows,1>                        ConstantBlock;
-  typedef Product<Lhs,LinearBlock,LazyProduct>                          LinearProduct;
-  typedef CwiseBinaryOp<internal::scalar_sum_op<typename Lhs::Scalar,typename Rhs::Scalar>, const LinearProduct, const ConstantBlock> Xpr;
+template <typename Lhs, typename Rhs>
+struct homogeneous_right_product_refactoring_helper {
+  enum { Dim = Lhs::ColsAtCompileTime, Rows = Lhs::RowsAtCompileTime };
+  typedef typename Rhs::template ConstNRowsBlockXpr<Dim>::Type LinearBlockConst;
+  typedef std::remove_const_t<LinearBlockConst> LinearBlock;
+  typedef typename Rhs::ConstRowXpr ConstantColumn;
+  typedef Replicate<const ConstantColumn, Rows, 1> ConstantBlock;
+  typedef Product<Lhs, LinearBlock, LazyProduct> LinearProduct;
+  typedef CwiseBinaryOp<internal::scalar_sum_op<typename Lhs::Scalar, typename Rhs::Scalar>, const LinearProduct,
+                        const ConstantBlock>
+      Xpr;
 };
 
-template<typename Lhs, typename Rhs, int ProductTag>
+template <typename Lhs, typename Rhs, int ProductTag>
 struct product_evaluator<Product<Lhs, Rhs, LazyProduct>, ProductTag, HomogeneousShape, DenseShape>
- : public evaluator<typename homogeneous_right_product_refactoring_helper<typename Lhs::NestedExpression,Rhs>::Xpr>
-{
+    : public evaluator<
+          typename homogeneous_right_product_refactoring_helper<typename Lhs::NestedExpression, Rhs>::Xpr> {
   typedef Product<Lhs, Rhs, LazyProduct> XprType;
-  typedef homogeneous_right_product_refactoring_helper<typename Lhs::NestedExpression,Rhs> helper;
+  typedef homogeneous_right_product_refactoring_helper<typename Lhs::NestedExpression, Rhs> helper;
   typedef typename helper::ConstantBlock ConstantBlock;
   typedef typename helper::Xpr RefactoredXpr;
   typedef evaluator<RefactoredXpr> Base;
 
   EIGEN_DEVICE_FUNC explicit product_evaluator(const XprType& xpr)
-    : Base(  xpr.lhs().nestedExpression() .lazyProduct(  xpr.rhs().template topRows<helper::Dim>(xpr.lhs().nestedExpression().cols()) )
-            + ConstantBlock(xpr.rhs().row(xpr.rhs().rows()-1),xpr.lhs().rows(), 1) )
-  {}
+      : Base(xpr.lhs().nestedExpression().lazyProduct(
+                 xpr.rhs().template topRows<helper::Dim>(xpr.lhs().nestedExpression().cols())) +
+             ConstantBlock(xpr.rhs().row(xpr.rhs().rows() - 1), xpr.lhs().rows(), 1)) {}
 };
 
-template<typename Lhs, typename RhsArg, int ProductTag>
-struct generic_product_impl<Lhs, Homogeneous<RhsArg,Vertical>, DenseShape, HomogeneousShape, ProductTag>
-{
-  template<typename Dest>
-  EIGEN_DEVICE_FUNC static void evalTo(Dest& dst, const Lhs& lhs, const Homogeneous<RhsArg,Vertical>& rhs)
-  {
-    homogeneous_left_product_impl<Homogeneous<RhsArg,Vertical>, Lhs>(lhs, rhs.nestedExpression()).evalTo(dst);
+template <typename Lhs, typename RhsArg, int ProductTag>
+struct generic_product_impl<Lhs, Homogeneous<RhsArg, Vertical>, DenseShape, HomogeneousShape, ProductTag> {
+  template <typename Dest>
+  EIGEN_DEVICE_FUNC static void evalTo(Dest& dst, const Lhs& lhs, const Homogeneous<RhsArg, Vertical>& rhs) {
+    homogeneous_left_product_impl<Homogeneous<RhsArg, Vertical>, Lhs>(lhs, rhs.nestedExpression()).evalTo(dst);
   }
 };
 
 // TODO: the following specialization is to address a regression from 3.2 to 3.3
 // In the future, this path should be optimized.
-template<typename Lhs, typename RhsArg, int ProductTag>
-struct generic_product_impl<Lhs, Homogeneous<RhsArg,Vertical>, TriangularShape, HomogeneousShape, ProductTag>
-{
-  template<typename Dest>
-  static void evalTo(Dest& dst, const Lhs& lhs, const Homogeneous<RhsArg,Vertical>& rhs)
-  {
+template <typename Lhs, typename RhsArg, int ProductTag>
+struct generic_product_impl<Lhs, Homogeneous<RhsArg, Vertical>, TriangularShape, HomogeneousShape, ProductTag> {
+  template <typename Dest>
+  static void evalTo(Dest& dst, const Lhs& lhs, const Homogeneous<RhsArg, Vertical>& rhs) {
     dst.noalias() = lhs * rhs.eval();
   }
 };
 
-template<typename Lhs,typename Rhs>
-struct homogeneous_left_product_refactoring_helper
-{
-  enum {
-    Dim = Rhs::RowsAtCompileTime,
-    Cols = Rhs::ColsAtCompileTime
-  };
-  typedef typename Lhs::template ConstNColsBlockXpr<Dim>::Type          LinearBlockConst;
-  typedef std::remove_const_t<LinearBlockConst>                 LinearBlock;
-  typedef typename Lhs::ConstColXpr                                     ConstantColumn;
-  typedef Replicate<const ConstantColumn,1,Cols>                        ConstantBlock;
-  typedef Product<LinearBlock,Rhs,LazyProduct>                          LinearProduct;
-  typedef CwiseBinaryOp<internal::scalar_sum_op<typename Lhs::Scalar,typename Rhs::Scalar>, const LinearProduct, const ConstantBlock> Xpr;
+template <typename Lhs, typename Rhs>
+struct homogeneous_left_product_refactoring_helper {
+  enum { Dim = Rhs::RowsAtCompileTime, Cols = Rhs::ColsAtCompileTime };
+  typedef typename Lhs::template ConstNColsBlockXpr<Dim>::Type LinearBlockConst;
+  typedef std::remove_const_t<LinearBlockConst> LinearBlock;
+  typedef typename Lhs::ConstColXpr ConstantColumn;
+  typedef Replicate<const ConstantColumn, 1, Cols> ConstantBlock;
+  typedef Product<LinearBlock, Rhs, LazyProduct> LinearProduct;
+  typedef CwiseBinaryOp<internal::scalar_sum_op<typename Lhs::Scalar, typename Rhs::Scalar>, const LinearProduct,
+                        const ConstantBlock>
+      Xpr;
 };
 
-template<typename Lhs, typename Rhs, int ProductTag>
+template <typename Lhs, typename Rhs, int ProductTag>
 struct product_evaluator<Product<Lhs, Rhs, LazyProduct>, ProductTag, DenseShape, HomogeneousShape>
- : public evaluator<typename homogeneous_left_product_refactoring_helper<Lhs,typename Rhs::NestedExpression>::Xpr>
-{
+    : public evaluator<typename homogeneous_left_product_refactoring_helper<Lhs, typename Rhs::NestedExpression>::Xpr> {
   typedef Product<Lhs, Rhs, LazyProduct> XprType;
-  typedef homogeneous_left_product_refactoring_helper<Lhs,typename Rhs::NestedExpression> helper;
+  typedef homogeneous_left_product_refactoring_helper<Lhs, typename Rhs::NestedExpression> helper;
   typedef typename helper::ConstantBlock ConstantBlock;
   typedef typename helper::Xpr RefactoredXpr;
   typedef evaluator<RefactoredXpr> Base;
 
   EIGEN_DEVICE_FUNC explicit product_evaluator(const XprType& xpr)
-    : Base(   xpr.lhs().template leftCols<helper::Dim>(xpr.rhs().nestedExpression().rows()) .lazyProduct( xpr.rhs().nestedExpression() )
-            + ConstantBlock(xpr.lhs().col(xpr.lhs().cols()-1),1,xpr.rhs().cols()) )
-  {}
+      : Base(xpr.lhs()
+                 .template leftCols<helper::Dim>(xpr.rhs().nestedExpression().rows())
+                 .lazyProduct(xpr.rhs().nestedExpression()) +
+             ConstantBlock(xpr.lhs().col(xpr.lhs().cols() - 1), 1, xpr.rhs().cols())) {}
 };
 
-template<typename Scalar, int Dim, int Mode,int Options, typename RhsArg, int ProductTag>
-struct generic_product_impl<Transform<Scalar,Dim,Mode,Options>, Homogeneous<RhsArg,Vertical>, DenseShape, HomogeneousShape, ProductTag>
-{
-  typedef Transform<Scalar,Dim,Mode,Options> TransformType;
-  template<typename Dest>
-  EIGEN_DEVICE_FUNC static void evalTo(Dest& dst, const TransformType& lhs, const Homogeneous<RhsArg,Vertical>& rhs)
-  {
-    homogeneous_left_product_impl<Homogeneous<RhsArg,Vertical>, TransformType>(lhs, rhs.nestedExpression()).evalTo(dst);
+template <typename Scalar, int Dim, int Mode, int Options, typename RhsArg, int ProductTag>
+struct generic_product_impl<Transform<Scalar, Dim, Mode, Options>, Homogeneous<RhsArg, Vertical>, DenseShape,
+                            HomogeneousShape, ProductTag> {
+  typedef Transform<Scalar, Dim, Mode, Options> TransformType;
+  template <typename Dest>
+  EIGEN_DEVICE_FUNC static void evalTo(Dest& dst, const TransformType& lhs, const Homogeneous<RhsArg, Vertical>& rhs) {
+    homogeneous_left_product_impl<Homogeneous<RhsArg, Vertical>, TransformType>(lhs, rhs.nestedExpression())
+        .evalTo(dst);
   }
 };
 
-template<typename ExpressionType, int Side, bool Transposed>
+template <typename ExpressionType, int Side, bool Transposed>
 struct permutation_matrix_product<ExpressionType, Side, Transposed, HomogeneousShape>
-  : public permutation_matrix_product<ExpressionType, Side, Transposed, DenseShape>
-{};
+    : public permutation_matrix_product<ExpressionType, Side, Transposed, DenseShape> {};
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_HOMOGENEOUS_H
+#endif  // EIGEN_HOMOGENEOUS_H
diff --git a/Eigen/src/Geometry/Hyperplane.h b/Eigen/src/Geometry/Hyperplane.h
index c669a57..0fa0319 100644
--- a/Eigen/src/Geometry/Hyperplane.h
+++ b/Eigen/src/Geometry/Hyperplane.h
@@ -14,82 +14,73 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 /** \geometry_module \ingroup Geometry_Module
-  *
-  * \class Hyperplane
-  *
-  * \brief A hyperplane
-  *
-  * A hyperplane is an affine subspace of dimension n-1 in a space of dimension n.
-  * For example, a hyperplane in a plane is a line; a hyperplane in 3-space is a plane.
-  *
-  * \tparam Scalar_ the scalar type, i.e., the type of the coefficients
-  * \tparam AmbientDim_ the dimension of the ambient space, can be a compile time value or Dynamic.
-  *             Notice that the dimension of the hyperplane is AmbientDim_-1.
-  *
-  * This class represents an hyperplane as the zero set of the implicit equation
-  * \f$ n \cdot x + d = 0 \f$ where \f$ n \f$ is a unit normal vector of the plane (linear part)
-  * and \f$ d \f$ is the distance (offset) to the origin.
-  */
+ *
+ * \class Hyperplane
+ *
+ * \brief A hyperplane
+ *
+ * A hyperplane is an affine subspace of dimension n-1 in a space of dimension n.
+ * For example, a hyperplane in a plane is a line; a hyperplane in 3-space is a plane.
+ *
+ * \tparam Scalar_ the scalar type, i.e., the type of the coefficients
+ * \tparam AmbientDim_ the dimension of the ambient space, can be a compile time value or Dynamic.
+ *             Notice that the dimension of the hyperplane is AmbientDim_-1.
+ *
+ * This class represents an hyperplane as the zero set of the implicit equation
+ * \f$ n \cdot x + d = 0 \f$ where \f$ n \f$ is a unit normal vector of the plane (linear part)
+ * and \f$ d \f$ is the distance (offset) to the origin.
+ */
 template <typename Scalar_, int AmbientDim_, int Options_>
-class Hyperplane
-{
-public:
-  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar_,AmbientDim_==Dynamic ? Dynamic : AmbientDim_+1)
-  enum {
-    AmbientDimAtCompileTime = AmbientDim_,
-    Options = Options_
-  };
+class Hyperplane {
+ public:
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar_,
+                                                             AmbientDim_ == Dynamic ? Dynamic : AmbientDim_ + 1)
+  enum { AmbientDimAtCompileTime = AmbientDim_, Options = Options_ };
   typedef Scalar_ Scalar;
   typedef typename NumTraits<Scalar>::Real RealScalar;
-  typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3
-  typedef Matrix<Scalar,AmbientDimAtCompileTime,1> VectorType;
-  typedef Matrix<Scalar,Index(AmbientDimAtCompileTime)==Dynamic
-                        ? Dynamic
-                        : Index(AmbientDimAtCompileTime)+1,1,Options> Coefficients;
-  typedef Block<Coefficients,AmbientDimAtCompileTime,1> NormalReturnType;
-  typedef const Block<const Coefficients,AmbientDimAtCompileTime,1> ConstNormalReturnType;
+  typedef Eigen::Index Index;  ///< \deprecated since Eigen 3.3
+  typedef Matrix<Scalar, AmbientDimAtCompileTime, 1> VectorType;
+  typedef Matrix<Scalar, Index(AmbientDimAtCompileTime) == Dynamic ? Dynamic : Index(AmbientDimAtCompileTime) + 1, 1,
+                 Options>
+      Coefficients;
+  typedef Block<Coefficients, AmbientDimAtCompileTime, 1> NormalReturnType;
+  typedef const Block<const Coefficients, AmbientDimAtCompileTime, 1> ConstNormalReturnType;
 
   /** Default constructor without initialization */
   EIGEN_DEVICE_FUNC inline Hyperplane() {}
-  
-  template<int OtherOptions>
-  EIGEN_DEVICE_FUNC Hyperplane(const Hyperplane<Scalar,AmbientDimAtCompileTime,OtherOptions>& other)
-   : m_coeffs(other.coeffs())
-  {}
+
+  template <int OtherOptions>
+  EIGEN_DEVICE_FUNC Hyperplane(const Hyperplane<Scalar, AmbientDimAtCompileTime, OtherOptions>& other)
+      : m_coeffs(other.coeffs()) {}
 
   /** Constructs a dynamic-size hyperplane with \a _dim the dimension
-    * of the ambient space */
-  EIGEN_DEVICE_FUNC inline explicit Hyperplane(Index _dim) : m_coeffs(_dim+1) {}
+   * of the ambient space */
+  EIGEN_DEVICE_FUNC inline explicit Hyperplane(Index _dim) : m_coeffs(_dim + 1) {}
 
   /** Construct a plane from its normal \a n and a point \a e onto the plane.
-    * \warning the vector normal is assumed to be normalized.
-    */
-  EIGEN_DEVICE_FUNC inline Hyperplane(const VectorType& n, const VectorType& e)
-    : m_coeffs(n.size()+1)
-  {
+   * \warning the vector normal is assumed to be normalized.
+   */
+  EIGEN_DEVICE_FUNC inline Hyperplane(const VectorType& n, const VectorType& e) : m_coeffs(n.size() + 1) {
     normal() = n;
     offset() = -n.dot(e);
   }
 
   /** Constructs a plane from its normal \a n and distance to the origin \a d
-    * such that the algebraic equation of the plane is \f$ n \cdot x + d = 0 \f$.
-    * \warning the vector normal is assumed to be normalized.
-    */
-  EIGEN_DEVICE_FUNC inline Hyperplane(const VectorType& n, const Scalar& d)
-    : m_coeffs(n.size()+1)
-  {
+   * such that the algebraic equation of the plane is \f$ n \cdot x + d = 0 \f$.
+   * \warning the vector normal is assumed to be normalized.
+   */
+  EIGEN_DEVICE_FUNC inline Hyperplane(const VectorType& n, const Scalar& d) : m_coeffs(n.size() + 1) {
     normal() = n;
     offset() = d;
   }
 
   /** Constructs a hyperplane passing through the two points. If the dimension of the ambient space
-    * is greater than 2, then there isn't uniqueness, so an arbitrary choice is made.
-    */
-  EIGEN_DEVICE_FUNC static inline Hyperplane Through(const VectorType& p0, const VectorType& p1)
-  {
+   * is greater than 2, then there isn't uniqueness, so an arbitrary choice is made.
+   */
+  EIGEN_DEVICE_FUNC static inline Hyperplane Through(const VectorType& p0, const VectorType& p1) {
     Hyperplane result(p0.size());
     result.normal() = (p1 - p0).unitOrthogonal();
     result.offset() = -p0.dot(result.normal());
@@ -97,34 +88,31 @@
   }
 
   /** Constructs a hyperplane passing through the three points. The dimension of the ambient space
-    * is required to be exactly 3.
-    */
-  EIGEN_DEVICE_FUNC static inline Hyperplane Through(const VectorType& p0, const VectorType& p1, const VectorType& p2)
-  {
+   * is required to be exactly 3.
+   */
+  EIGEN_DEVICE_FUNC static inline Hyperplane Through(const VectorType& p0, const VectorType& p1, const VectorType& p2) {
     EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(VectorType, 3)
     Hyperplane result(p0.size());
     VectorType v0(p2 - p0), v1(p1 - p0);
     result.normal() = v0.cross(v1);
     RealScalar norm = result.normal().norm();
-    if(norm <= v0.norm() * v1.norm() * NumTraits<RealScalar>::epsilon())
-    {
-      Matrix<Scalar,2,3> m; m << v0.transpose(), v1.transpose();
-      JacobiSVD<Matrix<Scalar,2,3>, ComputeFullV> svd(m);
+    if (norm <= v0.norm() * v1.norm() * NumTraits<RealScalar>::epsilon()) {
+      Matrix<Scalar, 2, 3> m;
+      m << v0.transpose(), v1.transpose();
+      JacobiSVD<Matrix<Scalar, 2, 3>, ComputeFullV> svd(m);
       result.normal() = svd.matrixV().col(2);
-    }
-    else
+    } else
       result.normal() /= norm;
     result.offset() = -p0.dot(result.normal());
     return result;
   }
 
   /** Constructs a hyperplane passing through the parametrized line \a parametrized.
-    * If the dimension of the ambient space is greater than 2, then there isn't uniqueness,
-    * so an arbitrary choice is made.
-    */
+   * If the dimension of the ambient space is greater than 2, then there isn't uniqueness,
+   * so an arbitrary choice is made.
+   */
   // FIXME to be consistent with the rest this could be implemented as a static Through function ??
-  EIGEN_DEVICE_FUNC explicit Hyperplane(const ParametrizedLine<Scalar, AmbientDimAtCompileTime>& parametrized)
-  {
+  EIGEN_DEVICE_FUNC explicit Hyperplane(const ParametrizedLine<Scalar, AmbientDimAtCompileTime>& parametrized) {
     normal() = parametrized.direction().unitOrthogonal();
     offset() = -parametrized.origin().dot(normal());
   }
@@ -132,154 +120,154 @@
   EIGEN_DEVICE_FUNC ~Hyperplane() {}
 
   /** \returns the dimension in which the plane holds */
-  EIGEN_DEVICE_FUNC inline Index dim() const { return AmbientDimAtCompileTime==Dynamic ? m_coeffs.size()-1 : Index(AmbientDimAtCompileTime); }
-
-  /** normalizes \c *this */
-  EIGEN_DEVICE_FUNC void normalize(void)
-  {
-    m_coeffs /= normal().norm();
+  EIGEN_DEVICE_FUNC inline Index dim() const {
+    return AmbientDimAtCompileTime == Dynamic ? m_coeffs.size() - 1 : Index(AmbientDimAtCompileTime);
   }
 
+  /** normalizes \c *this */
+  EIGEN_DEVICE_FUNC void normalize(void) { m_coeffs /= normal().norm(); }
+
   /** \returns the signed distance between the plane \c *this and a point \a p.
-    * \sa absDistance()
-    */
+   * \sa absDistance()
+   */
   EIGEN_DEVICE_FUNC inline Scalar signedDistance(const VectorType& p) const { return normal().dot(p) + offset(); }
 
   /** \returns the absolute distance between the plane \c *this and a point \a p.
-    * \sa signedDistance()
-    */
+   * \sa signedDistance()
+   */
   EIGEN_DEVICE_FUNC inline Scalar absDistance(const VectorType& p) const { return numext::abs(signedDistance(p)); }
 
   /** \returns the projection of a point \a p onto the plane \c *this.
-    */
+   */
   EIGEN_DEVICE_FUNC inline VectorType projection(const VectorType& p) const { return p - signedDistance(p) * normal(); }
 
   /** \returns a constant reference to the unit normal vector of the plane, which corresponds
-    * to the linear part of the implicit equation.
-    */
-  EIGEN_DEVICE_FUNC inline ConstNormalReturnType normal() const { return ConstNormalReturnType(m_coeffs,0,0,dim(),1); }
+   * to the linear part of the implicit equation.
+   */
+  EIGEN_DEVICE_FUNC inline ConstNormalReturnType normal() const {
+    return ConstNormalReturnType(m_coeffs, 0, 0, dim(), 1);
+  }
 
   /** \returns a non-constant reference to the unit normal vector of the plane, which corresponds
-    * to the linear part of the implicit equation.
-    */
-  EIGEN_DEVICE_FUNC inline NormalReturnType normal() { return NormalReturnType(m_coeffs,0,0,dim(),1); }
+   * to the linear part of the implicit equation.
+   */
+  EIGEN_DEVICE_FUNC inline NormalReturnType normal() { return NormalReturnType(m_coeffs, 0, 0, dim(), 1); }
 
   /** \returns the distance to the origin, which is also the "constant term" of the implicit equation
-    * \warning the vector normal is assumed to be normalized.
-    */
+   * \warning the vector normal is assumed to be normalized.
+   */
   EIGEN_DEVICE_FUNC inline const Scalar& offset() const { return m_coeffs.coeff(dim()); }
 
   /** \returns a non-constant reference to the distance to the origin, which is also the constant part
-    * of the implicit equation */
+   * of the implicit equation */
   EIGEN_DEVICE_FUNC inline Scalar& offset() { return m_coeffs(dim()); }
 
   /** \returns a constant reference to the coefficients c_i of the plane equation:
-    * \f$ c_0*x_0 + ... + c_{d-1}*x_{d-1} + c_d = 0 \f$
-    */
+   * \f$ c_0*x_0 + ... + c_{d-1}*x_{d-1} + c_d = 0 \f$
+   */
   EIGEN_DEVICE_FUNC inline const Coefficients& coeffs() const { return m_coeffs; }
 
   /** \returns a non-constant reference to the coefficients c_i of the plane equation:
-    * \f$ c_0*x_0 + ... + c_{d-1}*x_{d-1} + c_d = 0 \f$
-    */
+   * \f$ c_0*x_0 + ... + c_{d-1}*x_{d-1} + c_d = 0 \f$
+   */
   EIGEN_DEVICE_FUNC inline Coefficients& coeffs() { return m_coeffs; }
 
   /** \returns the intersection of *this with \a other.
-    *
-    * \warning The ambient space must be a plane, i.e. have dimension 2, so that \c *this and \a other are lines.
-    *
-    * \note If \a other is approximately parallel to *this, this method will return any point on *this.
-    */
-  EIGEN_DEVICE_FUNC VectorType intersection(const Hyperplane& other) const
-  {
+   *
+   * \warning The ambient space must be a plane, i.e. have dimension 2, so that \c *this and \a other are lines.
+   *
+   * \note If \a other is approximately parallel to *this, this method will return any point on *this.
+   */
+  EIGEN_DEVICE_FUNC VectorType intersection(const Hyperplane& other) const {
     EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(VectorType, 2)
     Scalar det = coeffs().coeff(0) * other.coeffs().coeff(1) - coeffs().coeff(1) * other.coeffs().coeff(0);
     // since the line equations ax+by=c are normalized with a^2+b^2=1, the following tests
     // whether the two lines are approximately parallel.
-    if(internal::isMuchSmallerThan(det, Scalar(1)))
-    {   // special case where the two lines are approximately parallel. Pick any point on the first line.
-        if(numext::abs(coeffs().coeff(1))>numext::abs(coeffs().coeff(0)))
-            return VectorType(coeffs().coeff(1), -coeffs().coeff(2)/coeffs().coeff(1)-coeffs().coeff(0));
-        else
-            return VectorType(-coeffs().coeff(2)/coeffs().coeff(0)-coeffs().coeff(1), coeffs().coeff(0));
-    }
-    else
-    {   // general case
-        Scalar invdet = Scalar(1) / det;
-        return VectorType(invdet*(coeffs().coeff(1)*other.coeffs().coeff(2)-other.coeffs().coeff(1)*coeffs().coeff(2)),
-                          invdet*(other.coeffs().coeff(0)*coeffs().coeff(2)-coeffs().coeff(0)*other.coeffs().coeff(2)));
+    if (internal::isMuchSmallerThan(det, Scalar(1))) {  // special case where the two lines are approximately parallel.
+                                                        // Pick any point on the first line.
+      if (numext::abs(coeffs().coeff(1)) > numext::abs(coeffs().coeff(0)))
+        return VectorType(coeffs().coeff(1), -coeffs().coeff(2) / coeffs().coeff(1) - coeffs().coeff(0));
+      else
+        return VectorType(-coeffs().coeff(2) / coeffs().coeff(0) - coeffs().coeff(1), coeffs().coeff(0));
+    } else {  // general case
+      Scalar invdet = Scalar(1) / det;
+      return VectorType(
+          invdet * (coeffs().coeff(1) * other.coeffs().coeff(2) - other.coeffs().coeff(1) * coeffs().coeff(2)),
+          invdet * (other.coeffs().coeff(0) * coeffs().coeff(2) - coeffs().coeff(0) * other.coeffs().coeff(2)));
     }
   }
 
   /** Applies the transformation matrix \a mat to \c *this and returns a reference to \c *this.
-    *
-    * \param mat the Dim x Dim transformation matrix
-    * \param traits specifies whether the matrix \a mat represents an #Isometry
-    *               or a more generic #Affine transformation. The default is #Affine.
-    */
-  template<typename XprType>
-  EIGEN_DEVICE_FUNC inline Hyperplane& transform(const MatrixBase<XprType>& mat, TransformTraits traits = Affine)
-  {
-    if (traits==Affine)
-    {
+   *
+   * \param mat the Dim x Dim transformation matrix
+   * \param traits specifies whether the matrix \a mat represents an #Isometry
+   *               or a more generic #Affine transformation. The default is #Affine.
+   */
+  template <typename XprType>
+  EIGEN_DEVICE_FUNC inline Hyperplane& transform(const MatrixBase<XprType>& mat, TransformTraits traits = Affine) {
+    if (traits == Affine) {
       normal() = mat.inverse().transpose() * normal();
       m_coeffs /= normal().norm();
-    }
-    else if (traits==Isometry)
+    } else if (traits == Isometry)
       normal() = mat * normal();
-    else
-    {
+    else {
       eigen_assert(0 && "invalid traits value in Hyperplane::transform()");
     }
     return *this;
   }
 
   /** Applies the transformation \a t to \c *this and returns a reference to \c *this.
-    *
-    * \param t the transformation of dimension Dim
-    * \param traits specifies whether the transformation \a t represents an #Isometry
-    *               or a more generic #Affine transformation. The default is #Affine.
-    *               Other kind of transformations are not supported.
-    */
-  template<int TrOptions>
-  EIGEN_DEVICE_FUNC inline Hyperplane& transform(const Transform<Scalar,AmbientDimAtCompileTime,Affine,TrOptions>& t,
-                                TransformTraits traits = Affine)
-  {
+   *
+   * \param t the transformation of dimension Dim
+   * \param traits specifies whether the transformation \a t represents an #Isometry
+   *               or a more generic #Affine transformation. The default is #Affine.
+   *               Other kind of transformations are not supported.
+   */
+  template <int TrOptions>
+  EIGEN_DEVICE_FUNC inline Hyperplane& transform(const Transform<Scalar, AmbientDimAtCompileTime, Affine, TrOptions>& t,
+                                                 TransformTraits traits = Affine) {
     transform(t.linear(), traits);
     offset() -= normal().dot(t.translation());
     return *this;
   }
 
   /** \returns \c *this with scalar type casted to \a NewScalarType
-    *
-    * Note that if \a NewScalarType is equal to the current scalar type of \c *this
-    * then this function smartly returns a const reference to \c *this.
-    */
-  template<typename NewScalarType>
-  EIGEN_DEVICE_FUNC inline typename internal::cast_return_type<Hyperplane,
-           Hyperplane<NewScalarType,AmbientDimAtCompileTime,Options> >::type cast() const
-  {
-    return typename internal::cast_return_type<Hyperplane,
-                    Hyperplane<NewScalarType,AmbientDimAtCompileTime,Options> >::type(*this);
+   *
+   * Note that if \a NewScalarType is equal to the current scalar type of \c *this
+   * then this function smartly returns a const reference to \c *this.
+   */
+  template <typename NewScalarType>
+  EIGEN_DEVICE_FUNC inline
+      typename internal::cast_return_type<Hyperplane,
+                                          Hyperplane<NewScalarType, AmbientDimAtCompileTime, Options> >::type
+      cast() const {
+    return
+        typename internal::cast_return_type<Hyperplane,
+                                            Hyperplane<NewScalarType, AmbientDimAtCompileTime, Options> >::type(*this);
   }
 
   /** Copy constructor with scalar type conversion */
-  template<typename OtherScalarType,int OtherOptions>
-  EIGEN_DEVICE_FUNC inline explicit Hyperplane(const Hyperplane<OtherScalarType,AmbientDimAtCompileTime,OtherOptions>& other)
-  { m_coeffs = other.coeffs().template cast<Scalar>(); }
+  template <typename OtherScalarType, int OtherOptions>
+  EIGEN_DEVICE_FUNC inline explicit Hyperplane(
+      const Hyperplane<OtherScalarType, AmbientDimAtCompileTime, OtherOptions>& other) {
+    m_coeffs = other.coeffs().template cast<Scalar>();
+  }
 
   /** \returns \c true if \c *this is approximately equal to \a other, within the precision
-    * determined by \a prec.
-    *
-    * \sa MatrixBase::isApprox() */
-  template<int OtherOptions>
-  EIGEN_DEVICE_FUNC bool isApprox(const Hyperplane<Scalar,AmbientDimAtCompileTime,OtherOptions>& other, const typename NumTraits<Scalar>::Real& prec = NumTraits<Scalar>::dummy_precision()) const
-  { return m_coeffs.isApprox(other.m_coeffs, prec); }
+   * determined by \a prec.
+   *
+   * \sa MatrixBase::isApprox() */
+  template <int OtherOptions>
+  EIGEN_DEVICE_FUNC bool isApprox(
+      const Hyperplane<Scalar, AmbientDimAtCompileTime, OtherOptions>& other,
+      const typename NumTraits<Scalar>::Real& prec = NumTraits<Scalar>::dummy_precision()) const {
+    return m_coeffs.isApprox(other.m_coeffs, prec);
+  }
 
-protected:
-
+ protected:
   Coefficients m_coeffs;
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_HYPERPLANE_H
+#endif  // EIGEN_HYPERPLANE_H
diff --git a/Eigen/src/Geometry/OrthoMethods.h b/Eigen/src/Geometry/OrthoMethods.h
index 2cf8310..34399a7 100644
--- a/Eigen/src/Geometry/OrthoMethods.h
+++ b/Eigen/src/Geometry/OrthoMethods.h
@@ -14,167 +14,157 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
 // Vector3 version (default)
-template<typename Derived, typename OtherDerived, int Size>
-struct cross_impl
-{
-  typedef typename ScalarBinaryOpTraits<typename internal::traits<Derived>::Scalar,typename internal::traits<OtherDerived>::Scalar>::ReturnType Scalar;
-  typedef Matrix<Scalar,MatrixBase<Derived>::RowsAtCompileTime,MatrixBase<Derived>::ColsAtCompileTime> return_type;
+template <typename Derived, typename OtherDerived, int Size>
+struct cross_impl {
+  typedef typename ScalarBinaryOpTraits<typename internal::traits<Derived>::Scalar,
+                                        typename internal::traits<OtherDerived>::Scalar>::ReturnType Scalar;
+  typedef Matrix<Scalar, MatrixBase<Derived>::RowsAtCompileTime, MatrixBase<Derived>::ColsAtCompileTime> return_type;
 
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  return_type run(const MatrixBase<Derived>& first, const MatrixBase<OtherDerived>& second)
-  {
-    EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Derived,3)
-    EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,3)
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE return_type run(const MatrixBase<Derived>& first,
+                                                               const MatrixBase<OtherDerived>& second) {
+    EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Derived, 3)
+    EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived, 3)
 
     // Note that there is no need for an expression here since the compiler
     // optimize such a small temporary very well (even within a complex expression)
-    typename internal::nested_eval<Derived,2>::type lhs(first.derived());
-    typename internal::nested_eval<OtherDerived,2>::type rhs(second.derived());
-    return return_type(
-      numext::conj(lhs.coeff(1) * rhs.coeff(2) - lhs.coeff(2) * rhs.coeff(1)),
-      numext::conj(lhs.coeff(2) * rhs.coeff(0) - lhs.coeff(0) * rhs.coeff(2)),
-      numext::conj(lhs.coeff(0) * rhs.coeff(1) - lhs.coeff(1) * rhs.coeff(0))
-    );
+    typename internal::nested_eval<Derived, 2>::type lhs(first.derived());
+    typename internal::nested_eval<OtherDerived, 2>::type rhs(second.derived());
+    return return_type(numext::conj(lhs.coeff(1) * rhs.coeff(2) - lhs.coeff(2) * rhs.coeff(1)),
+                       numext::conj(lhs.coeff(2) * rhs.coeff(0) - lhs.coeff(0) * rhs.coeff(2)),
+                       numext::conj(lhs.coeff(0) * rhs.coeff(1) - lhs.coeff(1) * rhs.coeff(0)));
   }
 };
 
 // Vector2 version
-template<typename Derived, typename OtherDerived>
-struct cross_impl<Derived, OtherDerived, 2>
-{
-  typedef typename ScalarBinaryOpTraits<typename internal::traits<Derived>::Scalar,typename internal::traits<OtherDerived>::Scalar>::ReturnType Scalar;
+template <typename Derived, typename OtherDerived>
+struct cross_impl<Derived, OtherDerived, 2> {
+  typedef typename ScalarBinaryOpTraits<typename internal::traits<Derived>::Scalar,
+                                        typename internal::traits<OtherDerived>::Scalar>::ReturnType Scalar;
   typedef Scalar return_type;
 
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  return_type run(const MatrixBase<Derived>& first, const MatrixBase<OtherDerived>& second)
-  {
-    EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Derived,2);
-    EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,2);
-    typename internal::nested_eval<Derived,2>::type lhs(first.derived());
-    typename internal::nested_eval<OtherDerived,2>::type rhs(second.derived());
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE return_type run(const MatrixBase<Derived>& first,
+                                                               const MatrixBase<OtherDerived>& second) {
+    EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Derived, 2);
+    EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived, 2);
+    typename internal::nested_eval<Derived, 2>::type lhs(first.derived());
+    typename internal::nested_eval<OtherDerived, 2>::type rhs(second.derived());
     return numext::conj(lhs.coeff(0) * rhs.coeff(1) - lhs.coeff(1) * rhs.coeff(0));
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \geometry_module \ingroup Geometry_Module
-  *
-  * \returns the cross product of \c *this and \a other. This is either a scalar for size-2 vectors or a size-3 vector for size-3 vectors.
-  *
-  * This method is implemented for two different cases: between vectors of fixed size 2 and between vectors of fixed size 3.
-  * 
-  * For vectors of size 3, the output is simply the traditional cross product.
-  *
-  * For vectors of size 2, the output is a scalar.
-  * Given vectors \f$ v = \begin{bmatrix} v_1 & v_2 \end{bmatrix} \f$ and \f$ w = \begin{bmatrix} w_1 & w_2 \end{bmatrix} \f$,
-  * the result is simply \f$ v\times w = \overline{v_1 w_2 - v_2 w_1} = \text{conj}\left|\begin{smallmatrix} v_1 & w_1 \\ v_2 & w_2 \end{smallmatrix}\right| \f$;
-  * or, to put it differently, it is the third coordinate of the cross product of \f$ \begin{bmatrix} v_1 & v_2 & v_3 \end{bmatrix} \f$ and \f$ \begin{bmatrix} w_1 & w_2 & w_3 \end{bmatrix} \f$.
-  * For real-valued inputs, the result can be interpreted as the signed area of a parallelogram spanned by the two vectors.
-  * 
-  * \note With complex numbers, the cross product is implemented as
-  * \f$ (\mathbf{a}+i\mathbf{b}) \times (\mathbf{c}+i\mathbf{d}) = (\mathbf{a} \times \mathbf{c} - \mathbf{b} \times \mathbf{d}) - i(\mathbf{a} \times \mathbf{d} + \mathbf{b} \times \mathbf{c})\f$
-  * 
-  * \sa MatrixBase::cross3()
-  */
-template<typename Derived>
-template<typename OtherDerived>
+ *
+ * \returns the cross product of \c *this and \a other. This is either a scalar for size-2 vectors or a size-3 vector
+ * for size-3 vectors.
+ *
+ * This method is implemented for two different cases: between vectors of fixed size 2 and between vectors of fixed
+ * size 3.
+ *
+ * For vectors of size 3, the output is simply the traditional cross product.
+ *
+ * For vectors of size 2, the output is a scalar.
+ * Given vectors \f$ v = \begin{bmatrix} v_1 & v_2 \end{bmatrix} \f$ and \f$ w = \begin{bmatrix} w_1 & w_2 \end{bmatrix}
+ * \f$, the result is simply \f$ v\times w = \overline{v_1 w_2 - v_2 w_1} = \text{conj}\left|\begin{smallmatrix} v_1 &
+ * w_1 \\ v_2 & w_2 \end{smallmatrix}\right| \f$; or, to put it differently, it is the third coordinate of the cross
+ * product of \f$ \begin{bmatrix} v_1 & v_2 & v_3 \end{bmatrix} \f$ and \f$ \begin{bmatrix} w_1 & w_2 & w_3
+ * \end{bmatrix} \f$. For real-valued inputs, the result can be interpreted as the signed area of a parallelogram
+ * spanned by the two vectors.
+ *
+ * \note With complex numbers, the cross product is implemented as
+ * \f$ (\mathbf{a}+i\mathbf{b}) \times (\mathbf{c}+i\mathbf{d}) = (\mathbf{a} \times \mathbf{c} - \mathbf{b} \times
+ * \mathbf{d}) - i(\mathbf{a} \times \mathbf{d} + \mathbf{b} \times \mathbf{c})\f$
+ *
+ * \sa MatrixBase::cross3()
+ */
+template <typename Derived>
+template <typename OtherDerived>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-typename internal::cross_impl<Derived, OtherDerived>::return_type
+    typename internal::cross_impl<Derived, OtherDerived>::return_type
 #else
-inline std::conditional_t<SizeAtCompileTime==2, Scalar, PlainObject>
+    inline std::conditional_t<SizeAtCompileTime == 2, Scalar, PlainObject>
 #endif
-MatrixBase<Derived>::cross(const MatrixBase<OtherDerived>& other) const
-{
+    MatrixBase<Derived>::cross(const MatrixBase<OtherDerived>& other) const {
   return internal::cross_impl<Derived, OtherDerived>::run(*this, other);
 }
 
 namespace internal {
 
-template< int Arch,typename VectorLhs,typename VectorRhs,
-          typename Scalar = typename VectorLhs::Scalar,
-          bool Vectorizable = bool((VectorLhs::Flags&VectorRhs::Flags)&PacketAccessBit)>
+template <int Arch, typename VectorLhs, typename VectorRhs, typename Scalar = typename VectorLhs::Scalar,
+          bool Vectorizable = bool((VectorLhs::Flags & VectorRhs::Flags) & PacketAccessBit)>
 struct cross3_impl {
-  EIGEN_DEVICE_FUNC static inline typename internal::plain_matrix_type<VectorLhs>::type
-  run(const VectorLhs& lhs, const VectorRhs& rhs)
-  {
+  EIGEN_DEVICE_FUNC static inline typename internal::plain_matrix_type<VectorLhs>::type run(const VectorLhs& lhs,
+                                                                                            const VectorRhs& rhs) {
     return typename internal::plain_matrix_type<VectorLhs>::type(
-      numext::conj(lhs.coeff(1) * rhs.coeff(2) - lhs.coeff(2) * rhs.coeff(1)),
-      numext::conj(lhs.coeff(2) * rhs.coeff(0) - lhs.coeff(0) * rhs.coeff(2)),
-      numext::conj(lhs.coeff(0) * rhs.coeff(1) - lhs.coeff(1) * rhs.coeff(0)),
-      0
-    );
+        numext::conj(lhs.coeff(1) * rhs.coeff(2) - lhs.coeff(2) * rhs.coeff(1)),
+        numext::conj(lhs.coeff(2) * rhs.coeff(0) - lhs.coeff(0) * rhs.coeff(2)),
+        numext::conj(lhs.coeff(0) * rhs.coeff(1) - lhs.coeff(1) * rhs.coeff(0)), 0);
   }
 };
 
-}
+}  // namespace internal
 
 /** \geometry_module \ingroup Geometry_Module
-  *
-  * \returns the cross product of \c *this and \a other using only the x, y, and z coefficients
-  *
-  * The size of \c *this and \a other must be four. This function is especially useful
-  * when using 4D vectors instead of 3D ones to get advantage of SSE/AltiVec vectorization.
-  *
-  * \sa MatrixBase::cross()
-  */
-template<typename Derived>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC inline typename MatrixBase<Derived>::PlainObject
-MatrixBase<Derived>::cross3(const MatrixBase<OtherDerived>& other) const
-{
-  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Derived,4)
-  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,4)
+ *
+ * \returns the cross product of \c *this and \a other using only the x, y, and z coefficients
+ *
+ * The size of \c *this and \a other must be four. This function is especially useful
+ * when using 4D vectors instead of 3D ones to get advantage of SSE/AltiVec vectorization.
+ *
+ * \sa MatrixBase::cross()
+ */
+template <typename Derived>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC inline typename MatrixBase<Derived>::PlainObject MatrixBase<Derived>::cross3(
+    const MatrixBase<OtherDerived>& other) const {
+  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Derived, 4)
+  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived, 4)
 
-  typedef typename internal::nested_eval<Derived,2>::type DerivedNested;
-  typedef typename internal::nested_eval<OtherDerived,2>::type OtherDerivedNested;
+  typedef typename internal::nested_eval<Derived, 2>::type DerivedNested;
+  typedef typename internal::nested_eval<OtherDerived, 2>::type OtherDerivedNested;
   DerivedNested lhs(derived());
   OtherDerivedNested rhs(other.derived());
 
-  return internal::cross3_impl<Architecture::Target,
-                        internal::remove_all_t<DerivedNested>,
-                        internal::remove_all_t<OtherDerivedNested>>::run(lhs,rhs);
+  return internal::cross3_impl<Architecture::Target, internal::remove_all_t<DerivedNested>,
+                               internal::remove_all_t<OtherDerivedNested>>::run(lhs, rhs);
 }
 
 /** \geometry_module \ingroup Geometry_Module
-  *
-  * \returns a matrix expression of the cross product of each column or row
-  * of the referenced expression with the \a other vector.
-  *
-  * The referenced matrix must have one dimension equal to 3.
-  * The result matrix has the same dimensions than the referenced one.
-  *
-  * \sa MatrixBase::cross() */
-template<typename ExpressionType, int Direction>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC 
-const typename VectorwiseOp<ExpressionType,Direction>::CrossReturnType
-VectorwiseOp<ExpressionType,Direction>::cross(const MatrixBase<OtherDerived>& other) const
-{
-  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,3)
-  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename OtherDerived::Scalar>::value),
-    YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
-  
-  typename internal::nested_eval<ExpressionType,2>::type mat(_expression());
-  typename internal::nested_eval<OtherDerived,2>::type vec(other.derived());
+ *
+ * \returns a matrix expression of the cross product of each column or row
+ * of the referenced expression with the \a other vector.
+ *
+ * The referenced matrix must have one dimension equal to 3.
+ * The result matrix has the same dimensions than the referenced one.
+ *
+ * \sa MatrixBase::cross() */
+template <typename ExpressionType, int Direction>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC const typename VectorwiseOp<ExpressionType, Direction>::CrossReturnType
+VectorwiseOp<ExpressionType, Direction>::cross(const MatrixBase<OtherDerived>& other) const {
+  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived, 3)
+  EIGEN_STATIC_ASSERT(
+      (internal::is_same<Scalar, typename OtherDerived::Scalar>::value),
+      YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
 
-  CrossReturnType res(_expression().rows(),_expression().cols());
-  if(Direction==Vertical)
-  {
-    eigen_assert(CrossReturnType::RowsAtCompileTime==3 && "the matrix must have exactly 3 rows");
+  typename internal::nested_eval<ExpressionType, 2>::type mat(_expression());
+  typename internal::nested_eval<OtherDerived, 2>::type vec(other.derived());
+
+  CrossReturnType res(_expression().rows(), _expression().cols());
+  if (Direction == Vertical) {
+    eigen_assert(CrossReturnType::RowsAtCompileTime == 3 && "the matrix must have exactly 3 rows");
     res.row(0) = (mat.row(1) * vec.coeff(2) - mat.row(2) * vec.coeff(1)).conjugate();
     res.row(1) = (mat.row(2) * vec.coeff(0) - mat.row(0) * vec.coeff(2)).conjugate();
     res.row(2) = (mat.row(0) * vec.coeff(1) - mat.row(1) * vec.coeff(0)).conjugate();
-  }
-  else
-  {
-    eigen_assert(CrossReturnType::ColsAtCompileTime==3 && "the matrix must have exactly 3 columns");
+  } else {
+    eigen_assert(CrossReturnType::ColsAtCompileTime == 3 && "the matrix must have exactly 3 columns");
     res.col(0) = (mat.col(1) * vec.coeff(2) - mat.col(2) * vec.coeff(1)).conjugate();
     res.col(1) = (mat.col(2) * vec.coeff(0) - mat.col(0) * vec.coeff(2)).conjugate();
     res.col(2) = (mat.col(0) * vec.coeff(1) - mat.col(1) * vec.coeff(0)).conjugate();
@@ -184,39 +174,32 @@
 
 namespace internal {
 
-template<typename Derived, int Size = Derived::SizeAtCompileTime>
-struct unitOrthogonal_selector
-{
+template <typename Derived, int Size = Derived::SizeAtCompileTime>
+struct unitOrthogonal_selector {
   typedef typename plain_matrix_type<Derived>::type VectorType;
   typedef typename traits<Derived>::Scalar Scalar;
   typedef typename NumTraits<Scalar>::Real RealScalar;
-  typedef Matrix<Scalar,2,1> Vector2;
-  EIGEN_DEVICE_FUNC
-  static inline VectorType run(const Derived& src)
-  {
+  typedef Matrix<Scalar, 2, 1> Vector2;
+  EIGEN_DEVICE_FUNC static inline VectorType run(const Derived& src) {
     VectorType perp = VectorType::Zero(src.size());
     Index maxi = 0;
     Index sndi = 0;
     src.cwiseAbs().maxCoeff(&maxi);
-    if (maxi==0)
-      sndi = 1;
-    RealScalar invnm = RealScalar(1)/(Vector2() << src.coeff(sndi),src.coeff(maxi)).finished().norm();
+    if (maxi == 0) sndi = 1;
+    RealScalar invnm = RealScalar(1) / (Vector2() << src.coeff(sndi), src.coeff(maxi)).finished().norm();
     perp.coeffRef(maxi) = -numext::conj(src.coeff(sndi)) * invnm;
-    perp.coeffRef(sndi) =  numext::conj(src.coeff(maxi)) * invnm;
+    perp.coeffRef(sndi) = numext::conj(src.coeff(maxi)) * invnm;
 
     return perp;
-   }
+  }
 };
 
-template<typename Derived>
-struct unitOrthogonal_selector<Derived,3>
-{
+template <typename Derived>
+struct unitOrthogonal_selector<Derived, 3> {
   typedef typename plain_matrix_type<Derived>::type VectorType;
   typedef typename traits<Derived>::Scalar Scalar;
   typedef typename NumTraits<Scalar>::Real RealScalar;
-  EIGEN_DEVICE_FUNC
-  static inline VectorType run(const Derived& src)
-  {
+  EIGEN_DEVICE_FUNC static inline VectorType run(const Derived& src) {
     VectorType perp;
     /* Let us compute the crossed product of *this with a vector
      * that is not too close to being colinear to *this.
@@ -225,58 +208,52 @@
     /* unless the x and y coords are both close to zero, we can
      * simply take ( -y, x, 0 ) and normalize it.
      */
-    if((!isMuchSmallerThan(src.x(), src.z()))
-    || (!isMuchSmallerThan(src.y(), src.z())))
-    {
-      RealScalar invnm = RealScalar(1)/src.template head<2>().norm();
-      perp.coeffRef(0) = -numext::conj(src.y())*invnm;
-      perp.coeffRef(1) = numext::conj(src.x())*invnm;
+    if ((!isMuchSmallerThan(src.x(), src.z())) || (!isMuchSmallerThan(src.y(), src.z()))) {
+      RealScalar invnm = RealScalar(1) / src.template head<2>().norm();
+      perp.coeffRef(0) = -numext::conj(src.y()) * invnm;
+      perp.coeffRef(1) = numext::conj(src.x()) * invnm;
       perp.coeffRef(2) = 0;
     }
     /* if both x and y are close to zero, then the vector is close
      * to the z-axis, so it's far from colinear to the x-axis for instance.
      * So we take the crossed product with (1,0,0) and normalize it.
      */
-    else
-    {
-      RealScalar invnm = RealScalar(1)/src.template tail<2>().norm();
+    else {
+      RealScalar invnm = RealScalar(1) / src.template tail<2>().norm();
       perp.coeffRef(0) = 0;
-      perp.coeffRef(1) = -numext::conj(src.z())*invnm;
-      perp.coeffRef(2) = numext::conj(src.y())*invnm;
+      perp.coeffRef(1) = -numext::conj(src.z()) * invnm;
+      perp.coeffRef(2) = numext::conj(src.y()) * invnm;
     }
 
     return perp;
-   }
+  }
 };
 
-template<typename Derived>
-struct unitOrthogonal_selector<Derived,2>
-{
+template <typename Derived>
+struct unitOrthogonal_selector<Derived, 2> {
   typedef typename plain_matrix_type<Derived>::type VectorType;
-  EIGEN_DEVICE_FUNC
-  static inline VectorType run(const Derived& src)
-  { return VectorType(-numext::conj(src.y()), numext::conj(src.x())).normalized(); }
+  EIGEN_DEVICE_FUNC static inline VectorType run(const Derived& src) {
+    return VectorType(-numext::conj(src.y()), numext::conj(src.x())).normalized();
+  }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \geometry_module \ingroup Geometry_Module
-  *
-  * \returns a unit vector which is orthogonal to \c *this
-  *
-  * The size of \c *this must be at least 2. If the size is exactly 2,
-  * then the returned vector is a counter clock wise rotation of \c *this, i.e., (-y,x).normalized().
-  *
-  * \sa cross()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC typename MatrixBase<Derived>::PlainObject
-MatrixBase<Derived>::unitOrthogonal() const
-{
+ *
+ * \returns a unit vector which is orthogonal to \c *this
+ *
+ * The size of \c *this must be at least 2. If the size is exactly 2,
+ * then the returned vector is a counter clock wise rotation of \c *this, i.e., (-y,x).normalized().
+ *
+ * \sa cross()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC typename MatrixBase<Derived>::PlainObject MatrixBase<Derived>::unitOrthogonal() const {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
   return internal::unitOrthogonal_selector<Derived>::run(derived());
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_ORTHOMETHODS_H
+#endif  // EIGEN_ORTHOMETHODS_H
diff --git a/Eigen/src/Geometry/ParametrizedLine.h b/Eigen/src/Geometry/ParametrizedLine.h
index 029796a..5bbd874 100644
--- a/Eigen/src/Geometry/ParametrizedLine.h
+++ b/Eigen/src/Geometry/ParametrizedLine.h
@@ -14,59 +14,55 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 /** \geometry_module \ingroup Geometry_Module
-  *
-  * \class ParametrizedLine
-  *
-  * \brief A parametrized line
-  *
-  * A parametrized line is defined by an origin point \f$ \mathbf{o} \f$ and a unit
-  * direction vector \f$ \mathbf{d} \f$ such that the line corresponds to
-  * the set \f$ l(t) = \mathbf{o} + t \mathbf{d} \f$, \f$ t \in \mathbf{R} \f$.
-  *
-  * \tparam Scalar_ the scalar type, i.e., the type of the coefficients
-  * \tparam AmbientDim_ the dimension of the ambient space, can be a compile time value or Dynamic.
-  */
+ *
+ * \class ParametrizedLine
+ *
+ * \brief A parametrized line
+ *
+ * A parametrized line is defined by an origin point \f$ \mathbf{o} \f$ and a unit
+ * direction vector \f$ \mathbf{d} \f$ such that the line corresponds to
+ * the set \f$ l(t) = \mathbf{o} + t \mathbf{d} \f$, \f$ t \in \mathbf{R} \f$.
+ *
+ * \tparam Scalar_ the scalar type, i.e., the type of the coefficients
+ * \tparam AmbientDim_ the dimension of the ambient space, can be a compile time value or Dynamic.
+ */
 template <typename Scalar_, int AmbientDim_, int Options_>
-class ParametrizedLine
-{
-public:
-  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar_,AmbientDim_)
-  enum {
-    AmbientDimAtCompileTime = AmbientDim_,
-    Options = Options_
-  };
+class ParametrizedLine {
+ public:
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar_, AmbientDim_)
+  enum { AmbientDimAtCompileTime = AmbientDim_, Options = Options_ };
   typedef Scalar_ Scalar;
   typedef typename NumTraits<Scalar>::Real RealScalar;
-  typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3
-  typedef Matrix<Scalar,AmbientDimAtCompileTime,1,Options> VectorType;
+  typedef Eigen::Index Index;  ///< \deprecated since Eigen 3.3
+  typedef Matrix<Scalar, AmbientDimAtCompileTime, 1, Options> VectorType;
 
   /** Default constructor without initialization */
   EIGEN_DEVICE_FUNC inline ParametrizedLine() {}
-  
-  template<int OtherOptions>
-  EIGEN_DEVICE_FUNC ParametrizedLine(const ParametrizedLine<Scalar,AmbientDimAtCompileTime,OtherOptions>& other)
-   : m_origin(other.origin()), m_direction(other.direction())
-  {}
+
+  template <int OtherOptions>
+  EIGEN_DEVICE_FUNC ParametrizedLine(const ParametrizedLine<Scalar, AmbientDimAtCompileTime, OtherOptions>& other)
+      : m_origin(other.origin()), m_direction(other.direction()) {}
 
   /** Constructs a dynamic-size line with \a _dim the dimension
-    * of the ambient space */
+   * of the ambient space */
   EIGEN_DEVICE_FUNC inline explicit ParametrizedLine(Index _dim) : m_origin(_dim), m_direction(_dim) {}
 
   /** Initializes a parametrized line of direction \a direction and origin \a origin.
-    * \warning the vector direction is assumed to be normalized.
-    */
+   * \warning the vector direction is assumed to be normalized.
+   */
   EIGEN_DEVICE_FUNC ParametrizedLine(const VectorType& origin, const VectorType& direction)
-    : m_origin(origin), m_direction(direction) {}
+      : m_origin(origin), m_direction(direction) {}
 
   template <int OtherOptions>
   EIGEN_DEVICE_FUNC explicit ParametrizedLine(const Hyperplane<Scalar_, AmbientDim_, OtherOptions>& hyperplane);
 
   /** Constructs a parametrized line going from \a p0 to \a p1. */
-  EIGEN_DEVICE_FUNC static inline ParametrizedLine Through(const VectorType& p0, const VectorType& p1)
-  { return ParametrizedLine(p0, (p1-p0).normalized()); }
+  EIGEN_DEVICE_FUNC static inline ParametrizedLine Through(const VectorType& p0, const VectorType& p1) {
+    return ParametrizedLine(p0, (p1 - p0).normalized());
+  }
 
   EIGEN_DEVICE_FUNC ~ParametrizedLine() {}
 
@@ -80,48 +76,51 @@
   EIGEN_DEVICE_FUNC VectorType& direction() { return m_direction; }
 
   /** \returns the squared distance of a point \a p to its projection onto the line \c *this.
-    * \sa distance()
-    */
-  EIGEN_DEVICE_FUNC RealScalar squaredDistance(const VectorType& p) const
-  {
+   * \sa distance()
+   */
+  EIGEN_DEVICE_FUNC RealScalar squaredDistance(const VectorType& p) const {
     VectorType diff = p - origin();
     return (diff - direction().dot(diff) * direction()).squaredNorm();
   }
   /** \returns the distance of a point \a p to its projection onto the line \c *this.
-    * \sa squaredDistance()
-    */
-  EIGEN_DEVICE_FUNC RealScalar distance(const VectorType& p) const { EIGEN_USING_STD(sqrt) return sqrt(squaredDistance(p)); }
+   * \sa squaredDistance()
+   */
+  EIGEN_DEVICE_FUNC RealScalar distance(const VectorType& p) const {
+    EIGEN_USING_STD(sqrt) return sqrt(squaredDistance(p));
+  }
 
   /** \returns the projection of a point \a p onto the line \c *this. */
-  EIGEN_DEVICE_FUNC VectorType projection(const VectorType& p) const
-  { return origin() + direction().dot(p-origin()) * direction(); }
+  EIGEN_DEVICE_FUNC VectorType projection(const VectorType& p) const {
+    return origin() + direction().dot(p - origin()) * direction();
+  }
 
   EIGEN_DEVICE_FUNC VectorType pointAt(const Scalar& t) const;
-  
+
   template <int OtherOptions>
-  EIGEN_DEVICE_FUNC Scalar intersectionParameter(const Hyperplane<Scalar_, AmbientDim_, OtherOptions>& hyperplane) const;
+  EIGEN_DEVICE_FUNC Scalar
+  intersectionParameter(const Hyperplane<Scalar_, AmbientDim_, OtherOptions>& hyperplane) const;
 
   template <int OtherOptions>
   EIGEN_DEVICE_FUNC Scalar intersection(const Hyperplane<Scalar_, AmbientDim_, OtherOptions>& hyperplane) const;
 
   template <int OtherOptions>
-  EIGEN_DEVICE_FUNC VectorType intersectionPoint(const Hyperplane<Scalar_, AmbientDim_, OtherOptions>& hyperplane) const;
+  EIGEN_DEVICE_FUNC VectorType
+  intersectionPoint(const Hyperplane<Scalar_, AmbientDim_, OtherOptions>& hyperplane) const;
 
   /** Applies the transformation matrix \a mat to \c *this and returns a reference to \c *this.
-    *
-    * \param mat the Dim x Dim transformation matrix
-    * \param traits specifies whether the matrix \a mat represents an #Isometry
-    *               or a more generic #Affine transformation. The default is #Affine.
-    */
-  template<typename XprType>
-  EIGEN_DEVICE_FUNC inline ParametrizedLine& transform(const MatrixBase<XprType>& mat, TransformTraits traits = Affine)
-  {
-    if (traits==Affine)
+   *
+   * \param mat the Dim x Dim transformation matrix
+   * \param traits specifies whether the matrix \a mat represents an #Isometry
+   *               or a more generic #Affine transformation. The default is #Affine.
+   */
+  template <typename XprType>
+  EIGEN_DEVICE_FUNC inline ParametrizedLine& transform(const MatrixBase<XprType>& mat,
+                                                       TransformTraits traits = Affine) {
+    if (traits == Affine)
       direction() = (mat * direction()).normalized();
-    else if (traits==Isometry)
+    else if (traits == Isometry)
       direction() = mat * direction();
-    else
-    {
+    else {
       eigen_assert(0 && "invalid traits value in ParametrizedLine::transform()");
     }
     origin() = mat * origin();
@@ -129,107 +128,105 @@
   }
 
   /** Applies the transformation \a t to \c *this and returns a reference to \c *this.
-    *
-    * \param t the transformation of dimension Dim
-    * \param traits specifies whether the transformation \a t represents an #Isometry
-    *               or a more generic #Affine transformation. The default is #Affine.
-    *               Other kind of transformations are not supported.
-    */
-  template<int TrOptions>
-  EIGEN_DEVICE_FUNC inline ParametrizedLine& transform(const Transform<Scalar,AmbientDimAtCompileTime,Affine,TrOptions>& t,
-                                                       TransformTraits traits = Affine)
-  {
+   *
+   * \param t the transformation of dimension Dim
+   * \param traits specifies whether the transformation \a t represents an #Isometry
+   *               or a more generic #Affine transformation. The default is #Affine.
+   *               Other kind of transformations are not supported.
+   */
+  template <int TrOptions>
+  EIGEN_DEVICE_FUNC inline ParametrizedLine& transform(
+      const Transform<Scalar, AmbientDimAtCompileTime, Affine, TrOptions>& t, TransformTraits traits = Affine) {
     transform(t.linear(), traits);
     origin() += t.translation();
     return *this;
   }
 
-/** \returns \c *this with scalar type casted to \a NewScalarType
-    *
-    * Note that if \a NewScalarType is equal to the current scalar type of \c *this
-    * then this function smartly returns a const reference to \c *this.
-    */
-  template<typename NewScalarType>
-  EIGEN_DEVICE_FUNC inline typename internal::cast_return_type<ParametrizedLine,
-           ParametrizedLine<NewScalarType,AmbientDimAtCompileTime,Options> >::type cast() const
-  {
-    return typename internal::cast_return_type<ParametrizedLine,
-                    ParametrizedLine<NewScalarType,AmbientDimAtCompileTime,Options> >::type(*this);
+  /** \returns \c *this with scalar type casted to \a NewScalarType
+   *
+   * Note that if \a NewScalarType is equal to the current scalar type of \c *this
+   * then this function smartly returns a const reference to \c *this.
+   */
+  template <typename NewScalarType>
+  EIGEN_DEVICE_FUNC inline
+      typename internal::cast_return_type<ParametrizedLine,
+                                          ParametrizedLine<NewScalarType, AmbientDimAtCompileTime, Options> >::type
+      cast() const {
+    return typename internal::cast_return_type<
+        ParametrizedLine, ParametrizedLine<NewScalarType, AmbientDimAtCompileTime, Options> >::type(*this);
   }
 
   /** Copy constructor with scalar type conversion */
-  template<typename OtherScalarType,int OtherOptions>
-  EIGEN_DEVICE_FUNC inline explicit ParametrizedLine(const ParametrizedLine<OtherScalarType,AmbientDimAtCompileTime,OtherOptions>& other)
-  {
+  template <typename OtherScalarType, int OtherOptions>
+  EIGEN_DEVICE_FUNC inline explicit ParametrizedLine(
+      const ParametrizedLine<OtherScalarType, AmbientDimAtCompileTime, OtherOptions>& other) {
     m_origin = other.origin().template cast<Scalar>();
     m_direction = other.direction().template cast<Scalar>();
   }
 
   /** \returns \c true if \c *this is approximately equal to \a other, within the precision
-    * determined by \a prec.
-    *
-    * \sa MatrixBase::isApprox() */
-  EIGEN_DEVICE_FUNC bool isApprox(const ParametrizedLine& other, const typename NumTraits<Scalar>::Real& prec = NumTraits<Scalar>::dummy_precision()) const
-  { return m_origin.isApprox(other.m_origin, prec) && m_direction.isApprox(other.m_direction, prec); }
+   * determined by \a prec.
+   *
+   * \sa MatrixBase::isApprox() */
+  EIGEN_DEVICE_FUNC bool isApprox(const ParametrizedLine& other, const typename NumTraits<Scalar>::Real& prec =
+                                                                     NumTraits<Scalar>::dummy_precision()) const {
+    return m_origin.isApprox(other.m_origin, prec) && m_direction.isApprox(other.m_direction, prec);
+  }
 
-protected:
-
+ protected:
   VectorType m_origin, m_direction;
 };
 
 /** Constructs a parametrized line from a 2D hyperplane
-  *
-  * \warning the ambient space must have dimension 2 such that the hyperplane actually describes a line
-  */
+ *
+ * \warning the ambient space must have dimension 2 such that the hyperplane actually describes a line
+ */
 template <typename Scalar_, int AmbientDim_, int Options_>
 template <int OtherOptions>
-EIGEN_DEVICE_FUNC inline ParametrizedLine<Scalar_, AmbientDim_,Options_>::ParametrizedLine(const Hyperplane<Scalar_, AmbientDim_,OtherOptions>& hyperplane)
-{
+EIGEN_DEVICE_FUNC inline ParametrizedLine<Scalar_, AmbientDim_, Options_>::ParametrizedLine(
+    const Hyperplane<Scalar_, AmbientDim_, OtherOptions>& hyperplane) {
   EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(VectorType, 2)
   direction() = hyperplane.normal().unitOrthogonal();
-  origin() = -hyperplane.normal()*hyperplane.offset();
+  origin() = -hyperplane.normal() * hyperplane.offset();
 }
 
 /** \returns the point at \a t along this line
-  */
+ */
 template <typename Scalar_, int AmbientDim_, int Options_>
-EIGEN_DEVICE_FUNC inline typename ParametrizedLine<Scalar_, AmbientDim_,Options_>::VectorType
-ParametrizedLine<Scalar_, AmbientDim_,Options_>::pointAt(const Scalar_& t) const
-{
-  return origin() + (direction()*t); 
+EIGEN_DEVICE_FUNC inline typename ParametrizedLine<Scalar_, AmbientDim_, Options_>::VectorType
+ParametrizedLine<Scalar_, AmbientDim_, Options_>::pointAt(const Scalar_& t) const {
+  return origin() + (direction() * t);
 }
 
 /** \returns the parameter value of the intersection between \c *this and the given \a hyperplane
-  */
+ */
 template <typename Scalar_, int AmbientDim_, int Options_>
 template <int OtherOptions>
-EIGEN_DEVICE_FUNC inline Scalar_ ParametrizedLine<Scalar_, AmbientDim_,Options_>::intersectionParameter(const Hyperplane<Scalar_, AmbientDim_, OtherOptions>& hyperplane) const
-{
-  return -(hyperplane.offset()+hyperplane.normal().dot(origin()))
-          / hyperplane.normal().dot(direction());
+EIGEN_DEVICE_FUNC inline Scalar_ ParametrizedLine<Scalar_, AmbientDim_, Options_>::intersectionParameter(
+    const Hyperplane<Scalar_, AmbientDim_, OtherOptions>& hyperplane) const {
+  return -(hyperplane.offset() + hyperplane.normal().dot(origin())) / hyperplane.normal().dot(direction());
 }
 
-
 /** \deprecated use intersectionParameter()
-  * \returns the parameter value of the intersection between \c *this and the given \a hyperplane
-  */
+ * \returns the parameter value of the intersection between \c *this and the given \a hyperplane
+ */
 template <typename Scalar_, int AmbientDim_, int Options_>
 template <int OtherOptions>
-EIGEN_DEVICE_FUNC inline Scalar_ ParametrizedLine<Scalar_, AmbientDim_,Options_>::intersection(const Hyperplane<Scalar_, AmbientDim_, OtherOptions>& hyperplane) const
-{
+EIGEN_DEVICE_FUNC inline Scalar_ ParametrizedLine<Scalar_, AmbientDim_, Options_>::intersection(
+    const Hyperplane<Scalar_, AmbientDim_, OtherOptions>& hyperplane) const {
   return intersectionParameter(hyperplane);
 }
 
 /** \returns the point of the intersection between \c *this and the given hyperplane
-  */
+ */
 template <typename Scalar_, int AmbientDim_, int Options_>
 template <int OtherOptions>
-EIGEN_DEVICE_FUNC inline typename ParametrizedLine<Scalar_, AmbientDim_,Options_>::VectorType
-ParametrizedLine<Scalar_, AmbientDim_,Options_>::intersectionPoint(const Hyperplane<Scalar_, AmbientDim_, OtherOptions>& hyperplane) const
-{
+EIGEN_DEVICE_FUNC inline typename ParametrizedLine<Scalar_, AmbientDim_, Options_>::VectorType
+ParametrizedLine<Scalar_, AmbientDim_, Options_>::intersectionPoint(
+    const Hyperplane<Scalar_, AmbientDim_, OtherOptions>& hyperplane) const {
   return pointAt(intersectionParameter(hyperplane));
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_PARAMETRIZEDLINE_H
+#endif  // EIGEN_PARAMETRIZEDLINE_H
diff --git a/Eigen/src/Geometry/Quaternion.h b/Eigen/src/Geometry/Quaternion.h
index cd29138..8931c4a 100644
--- a/Eigen/src/Geometry/Quaternion.h
+++ b/Eigen/src/Geometry/Quaternion.h
@@ -13,30 +13,26 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
-
+namespace Eigen {
 
 /***************************************************************************
-* Definition of QuaternionBase<Derived>
-* The implementation is at the end of the file
-***************************************************************************/
+ * Definition of QuaternionBase<Derived>
+ * The implementation is at the end of the file
+ ***************************************************************************/
 
 namespace internal {
-template<typename Other,
-         int OtherRows=Other::RowsAtCompileTime,
-         int OtherCols=Other::ColsAtCompileTime>
+template <typename Other, int OtherRows = Other::RowsAtCompileTime, int OtherCols = Other::ColsAtCompileTime>
 struct quaternionbase_assign_impl;
 }
 
 /** \geometry_module \ingroup Geometry_Module
-  * \class QuaternionBase
-  * \brief Base class for quaternion expressions
-  * \tparam Derived derived type (CRTP)
-  * \sa class Quaternion
-  */
-template<class Derived>
-class QuaternionBase : public RotationBase<Derived, 3>
-{
+ * \class QuaternionBase
+ * \brief Base class for quaternion expressions
+ * \tparam Derived derived type (CRTP)
+ * \sa class Quaternion
+ */
+template <class Derived>
+class QuaternionBase : public RotationBase<Derived, 3> {
  public:
   typedef RotationBase<Derived, 3> Base;
 
@@ -47,24 +43,19 @@
   typedef typename NumTraits<Scalar>::Real RealScalar;
   typedef typename internal::traits<Derived>::Coefficients Coefficients;
   typedef typename Coefficients::CoeffReturnType CoeffReturnType;
-  typedef std::conditional_t<bool(internal::traits<Derived>::Flags&LvalueBit),
-                                  Scalar&, CoeffReturnType> NonConstCoeffReturnType;
+  typedef std::conditional_t<bool(internal::traits<Derived>::Flags& LvalueBit), Scalar&, CoeffReturnType>
+      NonConstCoeffReturnType;
 
+  enum { Flags = Eigen::internal::traits<Derived>::Flags };
 
-  enum {
-    Flags = Eigen::internal::traits<Derived>::Flags
-  };
-
- // typedef typename Matrix<Scalar,4,1> Coefficients;
+  // typedef typename Matrix<Scalar,4,1> Coefficients;
   /** the type of a 3D vector */
-  typedef Matrix<Scalar,3,1> Vector3;
+  typedef Matrix<Scalar, 3, 1> Vector3;
   /** the equivalent rotation matrix type */
-  typedef Matrix<Scalar,3,3> Matrix3;
+  typedef Matrix<Scalar, 3, 3> Matrix3;
   /** the equivalent angle-axis type */
   typedef AngleAxis<Scalar> AngleAxisType;
 
-
-
   /** \returns the \c x coefficient */
   EIGEN_DEVICE_FUNC inline CoeffReturnType x() const { return this->derived().coeffs().coeff(0); }
   /** \returns the \c y coefficient */
@@ -84,74 +75,89 @@
   EIGEN_DEVICE_FUNC inline NonConstCoeffReturnType w() { return this->derived().coeffs().w(); }
 
   /** \returns a read-only vector expression of the imaginary part (x,y,z) */
-  EIGEN_DEVICE_FUNC inline const VectorBlock<const Coefficients,3> vec() const { return coeffs().template head<3>(); }
+  EIGEN_DEVICE_FUNC inline const VectorBlock<const Coefficients, 3> vec() const { return coeffs().template head<3>(); }
 
   /** \returns a vector expression of the imaginary part (x,y,z) */
-  EIGEN_DEVICE_FUNC inline VectorBlock<Coefficients,3> vec() { return coeffs().template head<3>(); }
+  EIGEN_DEVICE_FUNC inline VectorBlock<Coefficients, 3> vec() { return coeffs().template head<3>(); }
 
   /** \returns a read-only vector expression of the coefficients (x,y,z,w) */
-  EIGEN_DEVICE_FUNC inline const typename internal::traits<Derived>::Coefficients& coeffs() const { return derived().coeffs(); }
+  EIGEN_DEVICE_FUNC inline const typename internal::traits<Derived>::Coefficients& coeffs() const {
+    return derived().coeffs();
+  }
 
   /** \returns a vector expression of the coefficients (x,y,z,w) */
   EIGEN_DEVICE_FUNC inline typename internal::traits<Derived>::Coefficients& coeffs() { return derived().coeffs(); }
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE QuaternionBase<Derived>& operator=(const QuaternionBase<Derived>& other);
-  template<class OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator=(const QuaternionBase<OtherDerived>& other);
+  template <class OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator=(const QuaternionBase<OtherDerived>& other);
 
-// disabled this copy operator as it is giving very strange compilation errors when compiling
-// test_stdvector with GCC 4.4.2. This looks like a GCC bug though, so feel free to re-enable it if it's
-// useful; however notice that we already have the templated operator= above and e.g. in MatrixBase
-// we didn't have to add, in addition to templated operator=, such a non-templated copy operator.
-//  Derived& operator=(const QuaternionBase& other)
-//  { return operator=<Derived>(other); }
+  // disabled this copy operator as it is giving very strange compilation errors when compiling
+  // test_stdvector with GCC 4.4.2. This looks like a GCC bug though, so feel free to re-enable it if it's
+  // useful; however notice that we already have the templated operator= above and e.g. in MatrixBase
+  // we didn't have to add, in addition to templated operator=, such a non-templated copy operator.
+  //  Derived& operator=(const QuaternionBase& other)
+  //  { return operator=<Derived>(other); }
 
   EIGEN_DEVICE_FUNC Derived& operator=(const AngleAxisType& aa);
-  template<class OtherDerived> EIGEN_DEVICE_FUNC Derived& operator=(const MatrixBase<OtherDerived>& m);
+  template <class OtherDerived>
+  EIGEN_DEVICE_FUNC Derived& operator=(const MatrixBase<OtherDerived>& m);
 
   /** \returns a quaternion representing an identity rotation
-    * \sa MatrixBase::Identity()
-    */
-  EIGEN_DEVICE_FUNC static inline Quaternion<Scalar> Identity() { return Quaternion<Scalar>(Scalar(1), Scalar(0), Scalar(0), Scalar(0)); }
+   * \sa MatrixBase::Identity()
+   */
+  EIGEN_DEVICE_FUNC static inline Quaternion<Scalar> Identity() {
+    return Quaternion<Scalar>(Scalar(1), Scalar(0), Scalar(0), Scalar(0));
+  }
 
   /** \sa QuaternionBase::Identity(), MatrixBase::setIdentity()
-    */
-  EIGEN_DEVICE_FUNC inline QuaternionBase& setIdentity() { coeffs() << Scalar(0), Scalar(0), Scalar(0), Scalar(1); return *this; }
+   */
+  EIGEN_DEVICE_FUNC inline QuaternionBase& setIdentity() {
+    coeffs() << Scalar(0), Scalar(0), Scalar(0), Scalar(1);
+    return *this;
+  }
 
   /** \returns the squared norm of the quaternion's coefficients
-    * \sa QuaternionBase::norm(), MatrixBase::squaredNorm()
-    */
+   * \sa QuaternionBase::norm(), MatrixBase::squaredNorm()
+   */
   EIGEN_DEVICE_FUNC inline Scalar squaredNorm() const { return coeffs().squaredNorm(); }
 
   /** \returns the norm of the quaternion's coefficients
-    * \sa QuaternionBase::squaredNorm(), MatrixBase::norm()
-    */
+   * \sa QuaternionBase::squaredNorm(), MatrixBase::norm()
+   */
   EIGEN_DEVICE_FUNC inline Scalar norm() const { return coeffs().norm(); }
 
   /** Normalizes the quaternion \c *this
-    * \sa normalized(), MatrixBase::normalize() */
+   * \sa normalized(), MatrixBase::normalize() */
   EIGEN_DEVICE_FUNC inline void normalize() { coeffs().normalize(); }
   /** \returns a normalized copy of \c *this
-    * \sa normalize(), MatrixBase::normalized() */
+   * \sa normalize(), MatrixBase::normalized() */
   EIGEN_DEVICE_FUNC inline Quaternion<Scalar> normalized() const { return Quaternion<Scalar>(coeffs().normalized()); }
 
-    /** \returns the dot product of \c *this and \a other
-    * Geometrically speaking, the dot product of two unit quaternions
-    * corresponds to the cosine of half the angle between the two rotations.
-    * \sa angularDistance()
-    */
-  template<class OtherDerived> EIGEN_DEVICE_FUNC inline Scalar dot(const QuaternionBase<OtherDerived>& other) const { return coeffs().dot(other.coeffs()); }
+  /** \returns the dot product of \c *this and \a other
+   * Geometrically speaking, the dot product of two unit quaternions
+   * corresponds to the cosine of half the angle between the two rotations.
+   * \sa angularDistance()
+   */
+  template <class OtherDerived>
+  EIGEN_DEVICE_FUNC inline Scalar dot(const QuaternionBase<OtherDerived>& other) const {
+    return coeffs().dot(other.coeffs());
+  }
 
-  template<class OtherDerived> EIGEN_DEVICE_FUNC Scalar angularDistance(const QuaternionBase<OtherDerived>& other) const;
+  template <class OtherDerived>
+  EIGEN_DEVICE_FUNC Scalar angularDistance(const QuaternionBase<OtherDerived>& other) const;
 
   /** \returns an equivalent 3x3 rotation matrix */
   EIGEN_DEVICE_FUNC inline Matrix3 toRotationMatrix() const;
 
   /** \returns the quaternion which transform \a a into \a b through a rotation */
-  template<typename Derived1, typename Derived2>
+  template <typename Derived1, typename Derived2>
   EIGEN_DEVICE_FUNC Derived& setFromTwoVectors(const MatrixBase<Derived1>& a, const MatrixBase<Derived2>& b);
 
-  template<class OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Quaternion<Scalar> operator* (const QuaternionBase<OtherDerived>& q) const;
-  template<class OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator*= (const QuaternionBase<OtherDerived>& q);
+  template <class OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Quaternion<Scalar> operator*(const QuaternionBase<OtherDerived>& q) const;
+  template <class OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator*=(const QuaternionBase<OtherDerived>& q);
 
   /** \returns the quaternion describing the inverse rotation */
   EIGEN_DEVICE_FUNC Quaternion<Scalar> inverse() const;
@@ -159,125 +165,127 @@
   /** \returns the conjugated quaternion */
   EIGEN_DEVICE_FUNC Quaternion<Scalar> conjugate() const;
 
-  template<class OtherDerived> EIGEN_DEVICE_FUNC Quaternion<Scalar> slerp(const Scalar& t, const QuaternionBase<OtherDerived>& other) const;
+  template <class OtherDerived>
+  EIGEN_DEVICE_FUNC Quaternion<Scalar> slerp(const Scalar& t, const QuaternionBase<OtherDerived>& other) const;
 
   /** \returns true if each coefficients of \c *this and \a other are all exactly equal.
-    * \warning When using floating point scalar values you probably should rather use a
-    *          fuzzy comparison such as isApprox()
-    * \sa isApprox(), operator!= */
-  template<class OtherDerived>
-  EIGEN_DEVICE_FUNC inline bool operator==(const QuaternionBase<OtherDerived>& other) const
-  { return coeffs() == other.coeffs(); }
+   * \warning When using floating point scalar values you probably should rather use a
+   *          fuzzy comparison such as isApprox()
+   * \sa isApprox(), operator!= */
+  template <class OtherDerived>
+  EIGEN_DEVICE_FUNC inline bool operator==(const QuaternionBase<OtherDerived>& other) const {
+    return coeffs() == other.coeffs();
+  }
 
   /** \returns true if at least one pair of coefficients of \c *this and \a other are not exactly equal to each other.
-    * \warning When using floating point scalar values you probably should rather use a
-    *          fuzzy comparison such as isApprox()
-    * \sa isApprox(), operator== */
-  template<class OtherDerived>
-  EIGEN_DEVICE_FUNC inline bool operator!=(const QuaternionBase<OtherDerived>& other) const
-  { return coeffs() != other.coeffs(); }
+   * \warning When using floating point scalar values you probably should rather use a
+   *          fuzzy comparison such as isApprox()
+   * \sa isApprox(), operator== */
+  template <class OtherDerived>
+  EIGEN_DEVICE_FUNC inline bool operator!=(const QuaternionBase<OtherDerived>& other) const {
+    return coeffs() != other.coeffs();
+  }
 
   /** \returns \c true if \c *this is approximately equal to \a other, within the precision
-    * determined by \a prec.
-    *
-    * \sa MatrixBase::isApprox() */
-  template<class OtherDerived>
-  EIGEN_DEVICE_FUNC bool isApprox(const QuaternionBase<OtherDerived>& other, const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const
-  { return coeffs().isApprox(other.coeffs(), prec); }
+   * determined by \a prec.
+   *
+   * \sa MatrixBase::isApprox() */
+  template <class OtherDerived>
+  EIGEN_DEVICE_FUNC bool isApprox(const QuaternionBase<OtherDerived>& other,
+                                  const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const {
+    return coeffs().isApprox(other.coeffs(), prec);
+  }
 
   /** return the result vector of \a v through the rotation*/
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Vector3 _transformVector(const Vector3& v) const;
 
-  #ifdef EIGEN_PARSED_BY_DOXYGEN
+#ifdef EIGEN_PARSED_BY_DOXYGEN
   /** \returns \c *this with scalar type casted to \a NewScalarType
-    *
-    * Note that if \a NewScalarType is equal to the current scalar type of \c *this
-    * then this function smartly returns a const reference to \c *this.
-    */
-  template<typename NewScalarType>
-  EIGEN_DEVICE_FUNC inline typename internal::cast_return_type<Derived,Quaternion<NewScalarType> >::type cast() const;
+   *
+   * Note that if \a NewScalarType is equal to the current scalar type of \c *this
+   * then this function smartly returns a const reference to \c *this.
+   */
+  template <typename NewScalarType>
+  EIGEN_DEVICE_FUNC inline typename internal::cast_return_type<Derived, Quaternion<NewScalarType> >::type cast() const;
 
-  #else
+#else
 
-  template<typename NewScalarType>
-  EIGEN_DEVICE_FUNC inline
-  std::enable_if_t<internal::is_same<Scalar,NewScalarType>::value,const Derived&> cast() const
-  {
+  template <typename NewScalarType>
+  EIGEN_DEVICE_FUNC inline std::enable_if_t<internal::is_same<Scalar, NewScalarType>::value, const Derived&> cast()
+      const {
     return derived();
   }
 
-  template<typename NewScalarType>
-  EIGEN_DEVICE_FUNC inline
-  std::enable_if_t<!internal::is_same<Scalar,NewScalarType>::value,Quaternion<NewScalarType> > cast() const
-  {
+  template <typename NewScalarType>
+  EIGEN_DEVICE_FUNC inline std::enable_if_t<!internal::is_same<Scalar, NewScalarType>::value,
+                                            Quaternion<NewScalarType> >
+  cast() const {
     return Quaternion<NewScalarType>(coeffs().template cast<NewScalarType>());
   }
-  #endif
+#endif
 
 #ifndef EIGEN_NO_IO
   friend std::ostream& operator<<(std::ostream& s, const QuaternionBase<Derived>& q) {
-    s << q.x() << "i + " << q.y() << "j + " << q.z() << "k" << " + " << q.w();
+    s << q.x() << "i + " << q.y() << "j + " << q.z() << "k"
+      << " + " << q.w();
     return s;
   }
 #endif
 
 #ifdef EIGEN_QUATERNIONBASE_PLUGIN
-# include EIGEN_QUATERNIONBASE_PLUGIN
+#include EIGEN_QUATERNIONBASE_PLUGIN
 #endif
-protected:
+ protected:
   EIGEN_DEFAULT_COPY_CONSTRUCTOR(QuaternionBase)
   EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(QuaternionBase)
 };
 
 /***************************************************************************
-* Definition/implementation of Quaternion<Scalar>
-***************************************************************************/
+ * Definition/implementation of Quaternion<Scalar>
+ ***************************************************************************/
 
 /** \geometry_module \ingroup Geometry_Module
-  *
-  * \class Quaternion
-  *
-  * \brief The quaternion class used to represent 3D orientations and rotations
-  *
-  * \tparam Scalar_ the scalar type, i.e., the type of the coefficients
-  * \tparam Options_ controls the memory alignment of the coefficients. Can be \# AutoAlign or \# DontAlign. Default is AutoAlign.
-  *
-  * This class represents a quaternion \f$ w+xi+yj+zk \f$ that is a convenient representation of
-  * orientations and rotations of objects in three dimensions. Compared to other representations
-  * like Euler angles or 3x3 matrices, quaternions offer the following advantages:
-  * \li \b compact storage (4 scalars)
-  * \li \b efficient to compose (28 flops),
-  * \li \b stable spherical interpolation
-  *
-  * The following two typedefs are provided for convenience:
-  * \li \c Quaternionf for \c float
-  * \li \c Quaterniond for \c double
-  *
-  * \warning Operations interpreting the quaternion as rotation have undefined behavior if the quaternion is not normalized.
-  *
-  * \sa  class AngleAxis, class Transform
-  */
+ *
+ * \class Quaternion
+ *
+ * \brief The quaternion class used to represent 3D orientations and rotations
+ *
+ * \tparam Scalar_ the scalar type, i.e., the type of the coefficients
+ * \tparam Options_ controls the memory alignment of the coefficients. Can be \# AutoAlign or \# DontAlign. Default is
+ * AutoAlign.
+ *
+ * This class represents a quaternion \f$ w+xi+yj+zk \f$ that is a convenient representation of
+ * orientations and rotations of objects in three dimensions. Compared to other representations
+ * like Euler angles or 3x3 matrices, quaternions offer the following advantages:
+ * \li \b compact storage (4 scalars)
+ * \li \b efficient to compose (28 flops),
+ * \li \b stable spherical interpolation
+ *
+ * The following two typedefs are provided for convenience:
+ * \li \c Quaternionf for \c float
+ * \li \c Quaterniond for \c double
+ *
+ * \warning Operations interpreting the quaternion as rotation have undefined behavior if the quaternion is not
+ * normalized.
+ *
+ * \sa  class AngleAxis, class Transform
+ */
 
 namespace internal {
-template<typename Scalar_,int Options_>
-struct traits<Quaternion<Scalar_,Options_> >
-{
-  typedef Quaternion<Scalar_,Options_> PlainObject;
+template <typename Scalar_, int Options_>
+struct traits<Quaternion<Scalar_, Options_> > {
+  typedef Quaternion<Scalar_, Options_> PlainObject;
   typedef Scalar_ Scalar;
-  typedef Matrix<Scalar_,4,1,Options_> Coefficients;
-  enum{
-    Alignment = internal::traits<Coefficients>::Alignment,
-    Flags = LvalueBit
-  };
+  typedef Matrix<Scalar_, 4, 1, Options_> Coefficients;
+  enum { Alignment = internal::traits<Coefficients>::Alignment, Flags = LvalueBit };
 };
-}
+}  // namespace internal
 
-template<typename Scalar_, int Options_>
-class Quaternion : public QuaternionBase<Quaternion<Scalar_,Options_> >
-{
-public:
-  typedef QuaternionBase<Quaternion<Scalar_,Options_> > Base;
-  enum { NeedsAlignment = internal::traits<Quaternion>::Alignment>0 };
+template <typename Scalar_, int Options_>
+class Quaternion : public QuaternionBase<Quaternion<Scalar_, Options_> > {
+ public:
+  typedef QuaternionBase<Quaternion<Scalar_, Options_> > Base;
+  enum { NeedsAlignment = internal::traits<Quaternion>::Alignment > 0 };
 
   typedef Scalar_ Scalar;
 
@@ -291,13 +299,14 @@
   EIGEN_DEVICE_FUNC inline Quaternion() {}
 
   /** Constructs and initializes the quaternion \f$ w+xi+yj+zk \f$ from
-    * its four coefficients \a w, \a x, \a y and \a z.
-    *
-    * \warning Note the order of the arguments: the real \a w coefficient first,
-    * while internally the coefficients are stored in the following order:
-    * [\c x, \c y, \c z, \c w]
-    */
-  EIGEN_DEVICE_FUNC inline Quaternion(const Scalar& w, const Scalar& x, const Scalar& y, const Scalar& z) : m_coeffs(x, y, z, w){}
+   * its four coefficients \a w, \a x, \a y and \a z.
+   *
+   * \warning Note the order of the arguments: the real \a w coefficient first,
+   * while internally the coefficients are stored in the following order:
+   * [\c x, \c y, \c z, \c w]
+   */
+  EIGEN_DEVICE_FUNC inline Quaternion(const Scalar& w, const Scalar& x, const Scalar& y, const Scalar& z)
+      : m_coeffs(x, y, z, w) {}
 
   /** Constructs and initializes a quaternion from its real part as a scalar,
    *  and its imaginary part as a 3-vector [\c x, \c y, \c z]
@@ -312,338 +321,332 @@
   EIGEN_DEVICE_FUNC explicit inline Quaternion(const Scalar* data) : m_coeffs(data) {}
 
   /** Copy constructor */
-  template<class Derived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Quaternion(const QuaternionBase<Derived>& other) { this->Base::operator=(other); }
+  template <class Derived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Quaternion(const QuaternionBase<Derived>& other) {
+    this->Base::operator=(other);
+  }
 
   /** Constructs and initializes a quaternion from the angle-axis \a aa */
   EIGEN_DEVICE_FUNC explicit inline Quaternion(const AngleAxisType& aa) { *this = aa; }
 
   /** Constructs and initializes a quaternion from either:
-    *  - a rotation matrix expression,
-    *  - a 4D vector expression representing quaternion coefficients in the order [\c x, \c y, \c z, \c w].
-    */
-  template<typename Derived>
-  EIGEN_DEVICE_FUNC explicit inline Quaternion(const MatrixBase<Derived>& other) { *this = other; }
+   *  - a rotation matrix expression,
+   *  - a 4D vector expression representing quaternion coefficients in the order [\c x, \c y, \c z, \c w].
+   */
+  template <typename Derived>
+  EIGEN_DEVICE_FUNC explicit inline Quaternion(const MatrixBase<Derived>& other) {
+    *this = other;
+  }
 
   /** Explicit copy constructor with scalar conversion */
-  template<typename OtherScalar, int OtherOptions>
-  EIGEN_DEVICE_FUNC explicit inline Quaternion(const Quaternion<OtherScalar, OtherOptions>& other)
-  { m_coeffs = other.coeffs().template cast<Scalar>(); }
+  template <typename OtherScalar, int OtherOptions>
+  EIGEN_DEVICE_FUNC explicit inline Quaternion(const Quaternion<OtherScalar, OtherOptions>& other) {
+    m_coeffs = other.coeffs().template cast<Scalar>();
+  }
 
   // We define a copy constructor, which means we don't get an implicit move constructor or assignment operator.
   /** Default move constructor */
-  EIGEN_DEVICE_FUNC inline Quaternion(Quaternion&& other) EIGEN_NOEXCEPT_IF(std::is_nothrow_move_constructible<Scalar>::value)
-    : m_coeffs(std::move(other.coeffs()))
-  {}
+  EIGEN_DEVICE_FUNC inline Quaternion(Quaternion&& other)
+      EIGEN_NOEXCEPT_IF(std::is_nothrow_move_constructible<Scalar>::value)
+      : m_coeffs(std::move(other.coeffs())) {}
 
   /** Default move assignment operator */
-  EIGEN_DEVICE_FUNC Quaternion& operator=(Quaternion&& other) EIGEN_NOEXCEPT_IF(std::is_nothrow_move_assignable<Scalar>::value)
-  {
+  EIGEN_DEVICE_FUNC Quaternion& operator=(Quaternion&& other)
+      EIGEN_NOEXCEPT_IF(std::is_nothrow_move_assignable<Scalar>::value) {
     m_coeffs = std::move(other.coeffs());
     return *this;
   }
 
   EIGEN_DEVICE_FUNC static Quaternion UnitRandom();
 
-  template<typename Derived1, typename Derived2>
+  template <typename Derived1, typename Derived2>
   EIGEN_DEVICE_FUNC static Quaternion FromTwoVectors(const MatrixBase<Derived1>& a, const MatrixBase<Derived2>& b);
 
-  EIGEN_DEVICE_FUNC inline Coefficients& coeffs() { return m_coeffs;}
-  EIGEN_DEVICE_FUNC inline const Coefficients& coeffs() const { return m_coeffs;}
+  EIGEN_DEVICE_FUNC inline Coefficients& coeffs() { return m_coeffs; }
+  EIGEN_DEVICE_FUNC inline const Coefficients& coeffs() const { return m_coeffs; }
 
   EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(bool(NeedsAlignment))
 
 #ifdef EIGEN_QUATERNION_PLUGIN
-# include EIGEN_QUATERNION_PLUGIN
+#include EIGEN_QUATERNION_PLUGIN
 #endif
 
-protected:
+ protected:
   Coefficients m_coeffs;
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-  EIGEN_STATIC_ASSERT( (Options_ & DontAlign) == Options_,
-                       INVALID_MATRIX_TEMPLATE_PARAMETERS)
+  EIGEN_STATIC_ASSERT((Options_ & DontAlign) == Options_, INVALID_MATRIX_TEMPLATE_PARAMETERS)
 #endif
 };
 
 /** \ingroup Geometry_Module
-  * single precision quaternion type */
+ * single precision quaternion type */
 typedef Quaternion<float> Quaternionf;
 /** \ingroup Geometry_Module
-  * double precision quaternion type */
+ * double precision quaternion type */
 typedef Quaternion<double> Quaterniond;
 
 /***************************************************************************
-* Specialization of Map<Quaternion<Scalar>>
-***************************************************************************/
+ * Specialization of Map<Quaternion<Scalar>>
+ ***************************************************************************/
 
 namespace internal {
-  template<typename Scalar_, int Options_>
-  struct traits<Map<Quaternion<Scalar_>, Options_> > : traits<Quaternion<Scalar_, (int(Options_)&Aligned)==Aligned ? AutoAlign : DontAlign> >
-  {
-    typedef Map<Matrix<Scalar_,4,1>, Options_> Coefficients;
-  };
-}
+template <typename Scalar_, int Options_>
+struct traits<Map<Quaternion<Scalar_>, Options_> >
+    : traits<Quaternion<Scalar_, (int(Options_) & Aligned) == Aligned ? AutoAlign : DontAlign> > {
+  typedef Map<Matrix<Scalar_, 4, 1>, Options_> Coefficients;
+};
+}  // namespace internal
 
 namespace internal {
-  template<typename Scalar_, int Options_>
-  struct traits<Map<const Quaternion<Scalar_>, Options_> > : traits<Quaternion<Scalar_, (int(Options_)&Aligned)==Aligned ? AutoAlign : DontAlign> >
-  {
-    typedef Map<const Matrix<Scalar_,4,1>, Options_> Coefficients;
-    typedef traits<Quaternion<Scalar_, (int(Options_)&Aligned)==Aligned ? AutoAlign : DontAlign> > TraitsBase;
-    enum {
-      Flags = TraitsBase::Flags & ~LvalueBit
-    };
-  };
-}
+template <typename Scalar_, int Options_>
+struct traits<Map<const Quaternion<Scalar_>, Options_> >
+    : traits<Quaternion<Scalar_, (int(Options_) & Aligned) == Aligned ? AutoAlign : DontAlign> > {
+  typedef Map<const Matrix<Scalar_, 4, 1>, Options_> Coefficients;
+  typedef traits<Quaternion<Scalar_, (int(Options_) & Aligned) == Aligned ? AutoAlign : DontAlign> > TraitsBase;
+  enum { Flags = TraitsBase::Flags & ~LvalueBit };
+};
+}  // namespace internal
 
 /** \ingroup Geometry_Module
-  * \brief Quaternion expression mapping a constant memory buffer
-  *
-  * \tparam Scalar_ the type of the Quaternion coefficients
-  * \tparam Options_ see class Map
-  *
-  * This is a specialization of class Map for Quaternion. This class allows to view
-  * a 4 scalar memory buffer as an Eigen's Quaternion object.
-  *
-  * \sa class Map, class Quaternion, class QuaternionBase
-  */
-template<typename Scalar_, int Options_>
-class Map<const Quaternion<Scalar_>, Options_ >
-  : public QuaternionBase<Map<const Quaternion<Scalar_>, Options_> >
-{
-  public:
-    typedef QuaternionBase<Map<const Quaternion<Scalar_>, Options_> > Base;
+ * \brief Quaternion expression mapping a constant memory buffer
+ *
+ * \tparam Scalar_ the type of the Quaternion coefficients
+ * \tparam Options_ see class Map
+ *
+ * This is a specialization of class Map for Quaternion. This class allows to view
+ * a 4 scalar memory buffer as an Eigen's Quaternion object.
+ *
+ * \sa class Map, class Quaternion, class QuaternionBase
+ */
+template <typename Scalar_, int Options_>
+class Map<const Quaternion<Scalar_>, Options_> : public QuaternionBase<Map<const Quaternion<Scalar_>, Options_> > {
+ public:
+  typedef QuaternionBase<Map<const Quaternion<Scalar_>, Options_> > Base;
 
-    typedef Scalar_ Scalar;
-    typedef typename internal::traits<Map>::Coefficients Coefficients;
-    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Map)
-    using Base::operator*=;
+  typedef Scalar_ Scalar;
+  typedef typename internal::traits<Map>::Coefficients Coefficients;
+  EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Map)
+  using Base::operator*=;
 
-    /** Constructs a Mapped Quaternion object from the pointer \a coeffs
-      *
-      * The pointer \a coeffs must reference the four coefficients of Quaternion in the following order:
-      * \code *coeffs == {x, y, z, w} \endcode
-      *
-      * If the template parameter Options_ is set to #Aligned, then the pointer coeffs must be aligned. */
-    EIGEN_DEVICE_FUNC explicit EIGEN_STRONG_INLINE Map(const Scalar* coeffs) : m_coeffs(coeffs) {}
+  /** Constructs a Mapped Quaternion object from the pointer \a coeffs
+   *
+   * The pointer \a coeffs must reference the four coefficients of Quaternion in the following order:
+   * \code *coeffs == {x, y, z, w} \endcode
+   *
+   * If the template parameter Options_ is set to #Aligned, then the pointer coeffs must be aligned. */
+  EIGEN_DEVICE_FUNC explicit EIGEN_STRONG_INLINE Map(const Scalar* coeffs) : m_coeffs(coeffs) {}
 
-    EIGEN_DEVICE_FUNC inline const Coefficients& coeffs() const { return m_coeffs;}
+  EIGEN_DEVICE_FUNC inline const Coefficients& coeffs() const { return m_coeffs; }
 
-  protected:
-    const Coefficients m_coeffs;
+ protected:
+  const Coefficients m_coeffs;
 };
 
 /** \ingroup Geometry_Module
-  * \brief Expression of a quaternion from a memory buffer
-  *
-  * \tparam Scalar_ the type of the Quaternion coefficients
-  * \tparam Options_ see class Map
-  *
-  * This is a specialization of class Map for Quaternion. This class allows to view
-  * a 4 scalar memory buffer as an Eigen's  Quaternion object.
-  *
-  * \sa class Map, class Quaternion, class QuaternionBase
-  */
-template<typename Scalar_, int Options_>
-class Map<Quaternion<Scalar_>, Options_ >
-  : public QuaternionBase<Map<Quaternion<Scalar_>, Options_> >
-{
-  public:
-    typedef QuaternionBase<Map<Quaternion<Scalar_>, Options_> > Base;
+ * \brief Expression of a quaternion from a memory buffer
+ *
+ * \tparam Scalar_ the type of the Quaternion coefficients
+ * \tparam Options_ see class Map
+ *
+ * This is a specialization of class Map for Quaternion. This class allows to view
+ * a 4 scalar memory buffer as an Eigen's  Quaternion object.
+ *
+ * \sa class Map, class Quaternion, class QuaternionBase
+ */
+template <typename Scalar_, int Options_>
+class Map<Quaternion<Scalar_>, Options_> : public QuaternionBase<Map<Quaternion<Scalar_>, Options_> > {
+ public:
+  typedef QuaternionBase<Map<Quaternion<Scalar_>, Options_> > Base;
 
-    typedef Scalar_ Scalar;
-    typedef typename internal::traits<Map>::Coefficients Coefficients;
-    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Map)
-    using Base::operator*=;
+  typedef Scalar_ Scalar;
+  typedef typename internal::traits<Map>::Coefficients Coefficients;
+  EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Map)
+  using Base::operator*=;
 
-    /** Constructs a Mapped Quaternion object from the pointer \a coeffs
-      *
-      * The pointer \a coeffs must reference the four coefficients of Quaternion in the following order:
-      * \code *coeffs == {x, y, z, w} \endcode
-      *
-      * If the template parameter Options_ is set to #Aligned, then the pointer coeffs must be aligned. */
-    EIGEN_DEVICE_FUNC explicit EIGEN_STRONG_INLINE Map(Scalar* coeffs) : m_coeffs(coeffs) {}
+  /** Constructs a Mapped Quaternion object from the pointer \a coeffs
+   *
+   * The pointer \a coeffs must reference the four coefficients of Quaternion in the following order:
+   * \code *coeffs == {x, y, z, w} \endcode
+   *
+   * If the template parameter Options_ is set to #Aligned, then the pointer coeffs must be aligned. */
+  EIGEN_DEVICE_FUNC explicit EIGEN_STRONG_INLINE Map(Scalar* coeffs) : m_coeffs(coeffs) {}
 
-    EIGEN_DEVICE_FUNC inline Coefficients& coeffs() { return m_coeffs; }
-    EIGEN_DEVICE_FUNC inline const Coefficients& coeffs() const { return m_coeffs; }
+  EIGEN_DEVICE_FUNC inline Coefficients& coeffs() { return m_coeffs; }
+  EIGEN_DEVICE_FUNC inline const Coefficients& coeffs() const { return m_coeffs; }
 
-  protected:
-    Coefficients m_coeffs;
+ protected:
+  Coefficients m_coeffs;
 };
 
 /** \ingroup Geometry_Module
-  * Map an unaligned array of single precision scalars as a quaternion */
-typedef Map<Quaternion<float>, 0>         QuaternionMapf;
+ * Map an unaligned array of single precision scalars as a quaternion */
+typedef Map<Quaternion<float>, 0> QuaternionMapf;
 /** \ingroup Geometry_Module
-  * Map an unaligned array of double precision scalars as a quaternion */
-typedef Map<Quaternion<double>, 0>        QuaternionMapd;
+ * Map an unaligned array of double precision scalars as a quaternion */
+typedef Map<Quaternion<double>, 0> QuaternionMapd;
 /** \ingroup Geometry_Module
-  * Map a 16-byte aligned array of single precision scalars as a quaternion */
-typedef Map<Quaternion<float>, Aligned>   QuaternionMapAlignedf;
+ * Map a 16-byte aligned array of single precision scalars as a quaternion */
+typedef Map<Quaternion<float>, Aligned> QuaternionMapAlignedf;
 /** \ingroup Geometry_Module
-  * Map a 16-byte aligned array of double precision scalars as a quaternion */
-typedef Map<Quaternion<double>, Aligned>  QuaternionMapAlignedd;
+ * Map a 16-byte aligned array of double precision scalars as a quaternion */
+typedef Map<Quaternion<double>, Aligned> QuaternionMapAlignedd;
 
 /***************************************************************************
-* Implementation of QuaternionBase methods
-***************************************************************************/
+ * Implementation of QuaternionBase methods
+ ***************************************************************************/
 
 // Generic Quaternion * Quaternion product
 // This product can be specialized for a given architecture via the Arch template argument.
 namespace internal {
-template<int Arch, class Derived1, class Derived2, typename Scalar> struct quat_product
-{
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Quaternion<Scalar> run(const QuaternionBase<Derived1>& a, const QuaternionBase<Derived2>& b){
-    return Quaternion<Scalar>
-    (
-      a.w() * b.w() - a.x() * b.x() - a.y() * b.y() - a.z() * b.z(),
-      a.w() * b.x() + a.x() * b.w() + a.y() * b.z() - a.z() * b.y(),
-      a.w() * b.y() + a.y() * b.w() + a.z() * b.x() - a.x() * b.z(),
-      a.w() * b.z() + a.z() * b.w() + a.x() * b.y() - a.y() * b.x()
-    );
+template <int Arch, class Derived1, class Derived2, typename Scalar>
+struct quat_product {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Quaternion<Scalar> run(const QuaternionBase<Derived1>& a,
+                                                                      const QuaternionBase<Derived2>& b) {
+    return Quaternion<Scalar>(a.w() * b.w() - a.x() * b.x() - a.y() * b.y() - a.z() * b.z(),
+                              a.w() * b.x() + a.x() * b.w() + a.y() * b.z() - a.z() * b.y(),
+                              a.w() * b.y() + a.y() * b.w() + a.z() * b.x() - a.x() * b.z(),
+                              a.w() * b.z() + a.z() * b.w() + a.x() * b.y() - a.y() * b.x());
   }
 };
-}
+}  // namespace internal
 
 /** \returns the concatenation of two rotations as a quaternion-quaternion product */
 template <class Derived>
 template <class OtherDerived>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Quaternion<typename internal::traits<Derived>::Scalar>
-QuaternionBase<Derived>::operator* (const QuaternionBase<OtherDerived>& other) const
-{
-  EIGEN_STATIC_ASSERT((internal::is_same<typename Derived::Scalar, typename OtherDerived::Scalar>::value),
-   YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
+QuaternionBase<Derived>::operator*(const QuaternionBase<OtherDerived>& other) const {
+  EIGEN_STATIC_ASSERT(
+      (internal::is_same<typename Derived::Scalar, typename OtherDerived::Scalar>::value),
+      YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
   return internal::quat_product<Architecture::Target, Derived, OtherDerived,
-                         typename internal::traits<Derived>::Scalar>::run(*this, other);
+                                typename internal::traits<Derived>::Scalar>::run(*this, other);
 }
 
 /** \sa operator*(Quaternion) */
 template <class Derived>
 template <class OtherDerived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& QuaternionBase<Derived>::operator*= (const QuaternionBase<OtherDerived>& other)
-{
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& QuaternionBase<Derived>::operator*=(
+    const QuaternionBase<OtherDerived>& other) {
   derived() = derived() * other.derived();
   return derived();
 }
 
 /** Rotation of a vector by a quaternion.
-  * \remarks If the quaternion is used to rotate several points (>1)
-  * then it is much more efficient to first convert it to a 3x3 Matrix.
-  * Comparison of the operation cost for n transformations:
-  *   - Quaternion2:    30n
-  *   - Via a Matrix3: 24 + 15n
-  */
+ * \remarks If the quaternion is used to rotate several points (>1)
+ * then it is much more efficient to first convert it to a 3x3 Matrix.
+ * Comparison of the operation cost for n transformations:
+ *   - Quaternion2:    30n
+ *   - Via a Matrix3: 24 + 15n
+ */
 template <class Derived>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename QuaternionBase<Derived>::Vector3
-QuaternionBase<Derived>::_transformVector(const Vector3& v) const
-{
-    // Note that this algorithm comes from the optimization by hand
-    // of the conversion to a Matrix followed by a Matrix/Vector product.
-    // It appears to be much faster than the common algorithm found
-    // in the literature (30 versus 39 flops). It also requires two
-    // Vector3 as temporaries.
-    Vector3 uv = this->vec().cross(v);
-    uv += uv;
-    return v + this->w() * uv + this->vec().cross(uv);
+QuaternionBase<Derived>::_transformVector(const Vector3& v) const {
+  // Note that this algorithm comes from the optimization by hand
+  // of the conversion to a Matrix followed by a Matrix/Vector product.
+  // It appears to be much faster than the common algorithm found
+  // in the literature (30 versus 39 flops). It also requires two
+  // Vector3 as temporaries.
+  Vector3 uv = this->vec().cross(v);
+  uv += uv;
+  return v + this->w() * uv + this->vec().cross(uv);
 }
 
-template<class Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE QuaternionBase<Derived>& QuaternionBase<Derived>::operator=(const QuaternionBase<Derived>& other)
-{
+template <class Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE QuaternionBase<Derived>& QuaternionBase<Derived>::operator=(
+    const QuaternionBase<Derived>& other) {
   coeffs() = other.coeffs();
   return derived();
 }
 
-template<class Derived>
-template<class OtherDerived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& QuaternionBase<Derived>::operator=(const QuaternionBase<OtherDerived>& other)
-{
+template <class Derived>
+template <class OtherDerived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& QuaternionBase<Derived>::operator=(
+    const QuaternionBase<OtherDerived>& other) {
   coeffs() = other.coeffs();
   return derived();
 }
 
 /** Set \c *this from an angle-axis \a aa and returns a reference to \c *this
-  */
-template<class Derived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& QuaternionBase<Derived>::operator=(const AngleAxisType& aa)
-{
+ */
+template <class Derived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& QuaternionBase<Derived>::operator=(const AngleAxisType& aa) {
   EIGEN_USING_STD(cos)
   EIGEN_USING_STD(sin)
-  Scalar ha = Scalar(0.5)*aa.angle(); // Scalar(0.5) to suppress precision loss warnings
+  Scalar ha = Scalar(0.5) * aa.angle();  // Scalar(0.5) to suppress precision loss warnings
   this->w() = cos(ha);
   this->vec() = sin(ha) * aa.axis();
   return derived();
 }
 
 /** Set \c *this from the expression \a xpr:
-  *   - if \a xpr is a 4x1 vector, then \a xpr is assumed to be a quaternion
-  *   - if \a xpr is a 3x3 matrix, then \a xpr is assumed to be rotation matrix
-  *     and \a xpr is converted to a quaternion
-  */
+ *   - if \a xpr is a 4x1 vector, then \a xpr is assumed to be a quaternion
+ *   - if \a xpr is a 3x3 matrix, then \a xpr is assumed to be rotation matrix
+ *     and \a xpr is converted to a quaternion
+ */
 
-template<class Derived>
-template<class MatrixDerived>
-EIGEN_DEVICE_FUNC inline Derived& QuaternionBase<Derived>::operator=(const MatrixBase<MatrixDerived>& xpr)
-{
-  EIGEN_STATIC_ASSERT((internal::is_same<typename Derived::Scalar, typename MatrixDerived::Scalar>::value),
-   YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
+template <class Derived>
+template <class MatrixDerived>
+EIGEN_DEVICE_FUNC inline Derived& QuaternionBase<Derived>::operator=(const MatrixBase<MatrixDerived>& xpr) {
+  EIGEN_STATIC_ASSERT(
+      (internal::is_same<typename Derived::Scalar, typename MatrixDerived::Scalar>::value),
+      YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
   internal::quaternionbase_assign_impl<MatrixDerived>::run(*this, xpr.derived());
   return derived();
 }
 
 /** Convert the quaternion to a 3x3 rotation matrix. The quaternion is required to
-  * be normalized, otherwise the result is undefined.
-  */
-template<class Derived>
-EIGEN_DEVICE_FUNC inline typename QuaternionBase<Derived>::Matrix3
-QuaternionBase<Derived>::toRotationMatrix(void) const
-{
+ * be normalized, otherwise the result is undefined.
+ */
+template <class Derived>
+EIGEN_DEVICE_FUNC inline typename QuaternionBase<Derived>::Matrix3 QuaternionBase<Derived>::toRotationMatrix(
+    void) const {
   // NOTE if inlined, then gcc 4.2 and 4.4 get rid of the temporary (not gcc 4.3 !!)
   // if not inlined then the cost of the return by value is huge ~ +35%,
   // however, not inlining this function is an order of magnitude slower, so
   // it has to be inlined, and so the return by value is not an issue
   Matrix3 res;
 
-  const Scalar tx  = Scalar(2)*this->x();
-  const Scalar ty  = Scalar(2)*this->y();
-  const Scalar tz  = Scalar(2)*this->z();
-  const Scalar twx = tx*this->w();
-  const Scalar twy = ty*this->w();
-  const Scalar twz = tz*this->w();
-  const Scalar txx = tx*this->x();
-  const Scalar txy = ty*this->x();
-  const Scalar txz = tz*this->x();
-  const Scalar tyy = ty*this->y();
-  const Scalar tyz = tz*this->y();
-  const Scalar tzz = tz*this->z();
+  const Scalar tx = Scalar(2) * this->x();
+  const Scalar ty = Scalar(2) * this->y();
+  const Scalar tz = Scalar(2) * this->z();
+  const Scalar twx = tx * this->w();
+  const Scalar twy = ty * this->w();
+  const Scalar twz = tz * this->w();
+  const Scalar txx = tx * this->x();
+  const Scalar txy = ty * this->x();
+  const Scalar txz = tz * this->x();
+  const Scalar tyy = ty * this->y();
+  const Scalar tyz = tz * this->y();
+  const Scalar tzz = tz * this->z();
 
-  res.coeffRef(0,0) = Scalar(1)-(tyy+tzz);
-  res.coeffRef(0,1) = txy-twz;
-  res.coeffRef(0,2) = txz+twy;
-  res.coeffRef(1,0) = txy+twz;
-  res.coeffRef(1,1) = Scalar(1)-(txx+tzz);
-  res.coeffRef(1,2) = tyz-twx;
-  res.coeffRef(2,0) = txz-twy;
-  res.coeffRef(2,1) = tyz+twx;
-  res.coeffRef(2,2) = Scalar(1)-(txx+tyy);
+  res.coeffRef(0, 0) = Scalar(1) - (tyy + tzz);
+  res.coeffRef(0, 1) = txy - twz;
+  res.coeffRef(0, 2) = txz + twy;
+  res.coeffRef(1, 0) = txy + twz;
+  res.coeffRef(1, 1) = Scalar(1) - (txx + tzz);
+  res.coeffRef(1, 2) = tyz - twx;
+  res.coeffRef(2, 0) = txz - twy;
+  res.coeffRef(2, 1) = tyz + twx;
+  res.coeffRef(2, 2) = Scalar(1) - (txx + tyy);
 
   return res;
 }
 
 /** Sets \c *this to be a quaternion representing a rotation between
-  * the two arbitrary vectors \a a and \a b. In other words, the built
-  * rotation represent a rotation sending the line of direction \a a
-  * to the line of direction \a b, both lines passing through the origin.
-  *
-  * \returns a reference to \c *this.
-  *
-  * Note that the two input vectors do \b not have to be normalized, and
-  * do not need to have the same norm.
-  */
-template<class Derived>
-template<typename Derived1, typename Derived2>
-EIGEN_DEVICE_FUNC inline Derived& QuaternionBase<Derived>::setFromTwoVectors(const MatrixBase<Derived1>& a, const MatrixBase<Derived2>& b)
-{
+ * the two arbitrary vectors \a a and \a b. In other words, the built
+ * rotation represent a rotation sending the line of direction \a a
+ * to the line of direction \a b, both lines passing through the origin.
+ *
+ * \returns a reference to \c *this.
+ *
+ * Note that the two input vectors do \b not have to be normalized, and
+ * do not need to have the same norm.
+ */
+template <class Derived>
+template <typename Derived1, typename Derived2>
+EIGEN_DEVICE_FUNC inline Derived& QuaternionBase<Derived>::setFromTwoVectors(const MatrixBase<Derived1>& a,
+                                                                             const MatrixBase<Derived2>& b) {
   EIGEN_USING_STD(sqrt)
   Vector3 v0 = a.normalized();
   Vector3 v1 = b.normalized();
@@ -657,21 +660,21 @@
   //    under the constraint:
   //       ||x|| = 1
   //    which yields a singular value problem
-  if (c < Scalar(-1)+NumTraits<Scalar>::dummy_precision())
-  {
-    c = numext::maxi(c,Scalar(-1));
-    Matrix<Scalar,2,3> m; m << v0.transpose(), v1.transpose();
-    JacobiSVD<Matrix<Scalar,2,3>, ComputeFullV> svd(m);
+  if (c < Scalar(-1) + NumTraits<Scalar>::dummy_precision()) {
+    c = numext::maxi(c, Scalar(-1));
+    Matrix<Scalar, 2, 3> m;
+    m << v0.transpose(), v1.transpose();
+    JacobiSVD<Matrix<Scalar, 2, 3>, ComputeFullV> svd(m);
     Vector3 axis = svd.matrixV().col(2);
 
-    Scalar w2 = (Scalar(1)+c)*Scalar(0.5);
+    Scalar w2 = (Scalar(1) + c) * Scalar(0.5);
     this->w() = sqrt(w2);
     this->vec() = axis * sqrt(Scalar(1) - w2);
     return derived();
   }
   Vector3 axis = v0.cross(v1);
-  Scalar s = sqrt((Scalar(1)+c)*Scalar(2));
-  Scalar invs = Scalar(1)/s;
+  Scalar s = sqrt((Scalar(1) + c) * Scalar(2));
+  Scalar invs = Scalar(1) / s;
   this->vec() = axis * invs;
   this->w() = s * Scalar(0.5);
 
@@ -679,59 +682,53 @@
 }
 
 /** \returns a random unit quaternion following a uniform distribution law on SO(3)
-  *
-  * \note The implementation is based on http://planning.cs.uiuc.edu/node198.html
-  */
-template<typename Scalar, int Options>
-EIGEN_DEVICE_FUNC Quaternion<Scalar,Options> Quaternion<Scalar,Options>::UnitRandom()
-{
+ *
+ * \note The implementation is based on http://planning.cs.uiuc.edu/node198.html
+ */
+template <typename Scalar, int Options>
+EIGEN_DEVICE_FUNC Quaternion<Scalar, Options> Quaternion<Scalar, Options>::UnitRandom() {
   EIGEN_USING_STD(sqrt)
   EIGEN_USING_STD(sin)
   EIGEN_USING_STD(cos)
-  const Scalar u1 = internal::random<Scalar>(0, 1),
-               u2 = internal::random<Scalar>(0, 2*EIGEN_PI),
-               u3 = internal::random<Scalar>(0, 2*EIGEN_PI);
-  const Scalar a = sqrt(Scalar(1) - u1),
-               b = sqrt(u1);
-  return Quaternion (a * sin(u2), a * cos(u2), b * sin(u3), b * cos(u3));
+  const Scalar u1 = internal::random<Scalar>(0, 1), u2 = internal::random<Scalar>(0, 2 * EIGEN_PI),
+               u3 = internal::random<Scalar>(0, 2 * EIGEN_PI);
+  const Scalar a = sqrt(Scalar(1) - u1), b = sqrt(u1);
+  return Quaternion(a * sin(u2), a * cos(u2), b * sin(u3), b * cos(u3));
 }
 
-
 /** Returns a quaternion representing a rotation between
-  * the two arbitrary vectors \a a and \a b. In other words, the built
-  * rotation represent a rotation sending the line of direction \a a
-  * to the line of direction \a b, both lines passing through the origin.
-  *
-  * \returns resulting quaternion
-  *
-  * Note that the two input vectors do \b not have to be normalized, and
-  * do not need to have the same norm.
-  */
-template<typename Scalar, int Options>
-template<typename Derived1, typename Derived2>
-EIGEN_DEVICE_FUNC Quaternion<Scalar,Options> Quaternion<Scalar,Options>::FromTwoVectors(const MatrixBase<Derived1>& a, const MatrixBase<Derived2>& b)
-{
-    Quaternion quat;
-    quat.setFromTwoVectors(a, b);
-    return quat;
+ * the two arbitrary vectors \a a and \a b. In other words, the built
+ * rotation represent a rotation sending the line of direction \a a
+ * to the line of direction \a b, both lines passing through the origin.
+ *
+ * \returns resulting quaternion
+ *
+ * Note that the two input vectors do \b not have to be normalized, and
+ * do not need to have the same norm.
+ */
+template <typename Scalar, int Options>
+template <typename Derived1, typename Derived2>
+EIGEN_DEVICE_FUNC Quaternion<Scalar, Options> Quaternion<Scalar, Options>::FromTwoVectors(
+    const MatrixBase<Derived1>& a, const MatrixBase<Derived2>& b) {
+  Quaternion quat;
+  quat.setFromTwoVectors(a, b);
+  return quat;
 }
 
-
 /** \returns the multiplicative inverse of \c *this
-  * Note that in most cases, i.e., if you simply want the opposite rotation,
-  * and/or the quaternion is normalized, then it is enough to use the conjugate.
-  *
-  * \sa QuaternionBase::conjugate()
-  */
+ * Note that in most cases, i.e., if you simply want the opposite rotation,
+ * and/or the quaternion is normalized, then it is enough to use the conjugate.
+ *
+ * \sa QuaternionBase::conjugate()
+ */
 template <class Derived>
-EIGEN_DEVICE_FUNC inline Quaternion<typename internal::traits<Derived>::Scalar> QuaternionBase<Derived>::inverse() const
-{
+EIGEN_DEVICE_FUNC inline Quaternion<typename internal::traits<Derived>::Scalar> QuaternionBase<Derived>::inverse()
+    const {
   // FIXME should this function be called multiplicativeInverse and conjugate() be called inverse() or opposite()  ??
   Scalar n2 = this->squaredNorm();
   if (n2 > Scalar(0))
     return Quaternion<Scalar>(conjugate().coeffs() / n2);
-  else
-  {
+  else {
     // return an invalid result to flag the error
     return Quaternion<Scalar>(Coefficients::Zero());
   }
@@ -739,55 +736,48 @@
 
 // Generic conjugate of a Quaternion
 namespace internal {
-template<int Arch, class Derived, typename Scalar> struct quat_conj
-{
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Quaternion<Scalar> run(const QuaternionBase<Derived>& q){
-    return Quaternion<Scalar>(q.w(),-q.x(),-q.y(),-q.z());
+template <int Arch, class Derived, typename Scalar>
+struct quat_conj {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Quaternion<Scalar> run(const QuaternionBase<Derived>& q) {
+    return Quaternion<Scalar>(q.w(), -q.x(), -q.y(), -q.z());
   }
 };
-}
-                         
+}  // namespace internal
+
 /** \returns the conjugate of the \c *this which is equal to the multiplicative inverse
-  * if the quaternion is normalized.
-  * The conjugate of a quaternion represents the opposite rotation.
-  *
-  * \sa Quaternion2::inverse()
-  */
+ * if the quaternion is normalized.
+ * The conjugate of a quaternion represents the opposite rotation.
+ *
+ * \sa Quaternion2::inverse()
+ */
 template <class Derived>
-EIGEN_DEVICE_FUNC inline Quaternion<typename internal::traits<Derived>::Scalar>
-QuaternionBase<Derived>::conjugate() const
-{
-  return internal::quat_conj<Architecture::Target, Derived,
-                         typename internal::traits<Derived>::Scalar>::run(*this);
-                         
+EIGEN_DEVICE_FUNC inline Quaternion<typename internal::traits<Derived>::Scalar> QuaternionBase<Derived>::conjugate()
+    const {
+  return internal::quat_conj<Architecture::Target, Derived, typename internal::traits<Derived>::Scalar>::run(*this);
 }
 
 /** \returns the angle (in radian) between two rotations
-  * \sa dot()
-  */
+ * \sa dot()
+ */
 template <class Derived>
 template <class OtherDerived>
-EIGEN_DEVICE_FUNC inline typename internal::traits<Derived>::Scalar
-QuaternionBase<Derived>::angularDistance(const QuaternionBase<OtherDerived>& other) const
-{
+EIGEN_DEVICE_FUNC inline typename internal::traits<Derived>::Scalar QuaternionBase<Derived>::angularDistance(
+    const QuaternionBase<OtherDerived>& other) const {
   EIGEN_USING_STD(atan2)
   Quaternion<Scalar> d = (*this) * other.conjugate();
-  return Scalar(2) * atan2( d.vec().norm(), numext::abs(d.w()) );
+  return Scalar(2) * atan2(d.vec().norm(), numext::abs(d.w()));
 }
 
- 
-    
 /** \returns the spherical linear interpolation between the two quaternions
-  * \c *this and \a other at the parameter \a t in [0;1].
-  * 
-  * This represents an interpolation for a constant motion between \c *this and \a other,
-  * see also http://en.wikipedia.org/wiki/Slerp.
-  */
+ * \c *this and \a other at the parameter \a t in [0;1].
+ *
+ * This represents an interpolation for a constant motion between \c *this and \a other,
+ * see also http://en.wikipedia.org/wiki/Slerp.
+ */
 template <class Derived>
 template <class OtherDerived>
-EIGEN_DEVICE_FUNC Quaternion<typename internal::traits<Derived>::Scalar>
-QuaternionBase<Derived>::slerp(const Scalar& t, const QuaternionBase<OtherDerived>& other) const
-{
+EIGEN_DEVICE_FUNC Quaternion<typename internal::traits<Derived>::Scalar> QuaternionBase<Derived>::slerp(
+    const Scalar& t, const QuaternionBase<OtherDerived>& other) const {
   EIGEN_USING_STD(acos)
   EIGEN_USING_STD(sin)
   const Scalar one = Scalar(1) - NumTraits<Scalar>::epsilon();
@@ -797,21 +787,18 @@
   Scalar scale0;
   Scalar scale1;
 
-  if(absD>=one)
-  {
+  if (absD >= one) {
     scale0 = Scalar(1) - t;
     scale1 = t;
-  }
-  else
-  {
+  } else {
     // theta is the angle between the 2 quaternions
     Scalar theta = acos(absD);
     Scalar sinTheta = sin(theta);
 
-    scale0 = sin( ( Scalar(1) - t ) * theta) / sinTheta;
-    scale1 = sin( ( t * theta) ) / sinTheta;
+    scale0 = sin((Scalar(1) - t) * theta) / sinTheta;
+    scale1 = sin((t * theta)) / sinTheta;
   }
-  if(d<Scalar(0)) scale1 = -scale1;
+  if (d < Scalar(0)) scale1 = -scale1;
 
   return Quaternion<Scalar>(scale0 * coeffs() + scale1 * other.coeffs());
 }
@@ -819,59 +806,52 @@
 namespace internal {
 
 // set from a rotation matrix
-template<typename Other>
-struct quaternionbase_assign_impl<Other,3,3>
-{
+template <typename Other>
+struct quaternionbase_assign_impl<Other, 3, 3> {
   typedef typename Other::Scalar Scalar;
-  template<class Derived> EIGEN_DEVICE_FUNC static inline void run(QuaternionBase<Derived>& q, const Other& a_mat)
-  {
-    const typename internal::nested_eval<Other,2>::type mat(a_mat);
+  template <class Derived>
+  EIGEN_DEVICE_FUNC static inline void run(QuaternionBase<Derived>& q, const Other& a_mat) {
+    const typename internal::nested_eval<Other, 2>::type mat(a_mat);
     EIGEN_USING_STD(sqrt)
     // This algorithm comes from  "Quaternion Calculus and Fast Animation",
     // Ken Shoemake, 1987 SIGGRAPH course notes
     Scalar t = mat.trace();
-    if (t > Scalar(0))
-    {
+    if (t > Scalar(0)) {
       t = sqrt(t + Scalar(1.0));
-      q.w() = Scalar(0.5)*t;
-      t = Scalar(0.5)/t;
-      q.x() = (mat.coeff(2,1) - mat.coeff(1,2)) * t;
-      q.y() = (mat.coeff(0,2) - mat.coeff(2,0)) * t;
-      q.z() = (mat.coeff(1,0) - mat.coeff(0,1)) * t;
-    }
-    else
-    {
+      q.w() = Scalar(0.5) * t;
+      t = Scalar(0.5) / t;
+      q.x() = (mat.coeff(2, 1) - mat.coeff(1, 2)) * t;
+      q.y() = (mat.coeff(0, 2) - mat.coeff(2, 0)) * t;
+      q.z() = (mat.coeff(1, 0) - mat.coeff(0, 1)) * t;
+    } else {
       Index i = 0;
-      if (mat.coeff(1,1) > mat.coeff(0,0))
-        i = 1;
-      if (mat.coeff(2,2) > mat.coeff(i,i))
-        i = 2;
-      Index j = (i+1)%3;
-      Index k = (j+1)%3;
+      if (mat.coeff(1, 1) > mat.coeff(0, 0)) i = 1;
+      if (mat.coeff(2, 2) > mat.coeff(i, i)) i = 2;
+      Index j = (i + 1) % 3;
+      Index k = (j + 1) % 3;
 
-      t = sqrt(mat.coeff(i,i)-mat.coeff(j,j)-mat.coeff(k,k) + Scalar(1.0));
+      t = sqrt(mat.coeff(i, i) - mat.coeff(j, j) - mat.coeff(k, k) + Scalar(1.0));
       q.coeffs().coeffRef(i) = Scalar(0.5) * t;
-      t = Scalar(0.5)/t;
-      q.w() = (mat.coeff(k,j)-mat.coeff(j,k))*t;
-      q.coeffs().coeffRef(j) = (mat.coeff(j,i)+mat.coeff(i,j))*t;
-      q.coeffs().coeffRef(k) = (mat.coeff(k,i)+mat.coeff(i,k))*t;
+      t = Scalar(0.5) / t;
+      q.w() = (mat.coeff(k, j) - mat.coeff(j, k)) * t;
+      q.coeffs().coeffRef(j) = (mat.coeff(j, i) + mat.coeff(i, j)) * t;
+      q.coeffs().coeffRef(k) = (mat.coeff(k, i) + mat.coeff(i, k)) * t;
     }
   }
 };
 
 // set from a vector of coefficients assumed to be a quaternion
-template<typename Other>
-struct quaternionbase_assign_impl<Other,4,1>
-{
+template <typename Other>
+struct quaternionbase_assign_impl<Other, 4, 1> {
   typedef typename Other::Scalar Scalar;
-  template<class Derived> EIGEN_DEVICE_FUNC static inline void run(QuaternionBase<Derived>& q, const Other& vec)
-  {
+  template <class Derived>
+  EIGEN_DEVICE_FUNC static inline void run(QuaternionBase<Derived>& q, const Other& vec) {
     q.coeffs() = vec;
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_QUATERNION_H
+#endif  // EIGEN_QUATERNION_H
diff --git a/Eigen/src/Geometry/Rotation2D.h b/Eigen/src/Geometry/Rotation2D.h
index 32af255..eb94b52 100644
--- a/Eigen/src/Geometry/Rotation2D.h
+++ b/Eigen/src/Geometry/Rotation2D.h
@@ -13,67 +13,62 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 /** \geometry_module \ingroup Geometry_Module
-  *
-  * \class Rotation2D
-  *
-  * \brief Represents a rotation/orientation in a 2 dimensional space.
-  *
-  * \tparam Scalar_ the scalar type, i.e., the type of the coefficients
-  *
-  * This class is equivalent to a single scalar representing a counter clock wise rotation
-  * as a single angle in radian. It provides some additional features such as the automatic
-  * conversion from/to a 2x2 rotation matrix. Moreover this class aims to provide a similar
-  * interface to Quaternion in order to facilitate the writing of generic algorithms
-  * dealing with rotations.
-  *
-  * \sa class Quaternion, class Transform
-  */
+ *
+ * \class Rotation2D
+ *
+ * \brief Represents a rotation/orientation in a 2 dimensional space.
+ *
+ * \tparam Scalar_ the scalar type, i.e., the type of the coefficients
+ *
+ * This class is equivalent to a single scalar representing a counter clock wise rotation
+ * as a single angle in radian. It provides some additional features such as the automatic
+ * conversion from/to a 2x2 rotation matrix. Moreover this class aims to provide a similar
+ * interface to Quaternion in order to facilitate the writing of generic algorithms
+ * dealing with rotations.
+ *
+ * \sa class Quaternion, class Transform
+ */
 
 namespace internal {
 
-template<typename Scalar_> struct traits<Rotation2D<Scalar_> >
-{
+template <typename Scalar_>
+struct traits<Rotation2D<Scalar_> > {
   typedef Scalar_ Scalar;
 };
-} // end namespace internal
+}  // end namespace internal
 
-template<typename Scalar_>
-class Rotation2D : public RotationBase<Rotation2D<Scalar_>,2>
-{
-  typedef RotationBase<Rotation2D<Scalar_>,2> Base;
+template <typename Scalar_>
+class Rotation2D : public RotationBase<Rotation2D<Scalar_>, 2> {
+  typedef RotationBase<Rotation2D<Scalar_>, 2> Base;
 
-public:
-
+ public:
   using Base::operator*;
 
   enum { Dim = 2 };
   /** the scalar type of the coefficients */
   typedef Scalar_ Scalar;
-  typedef Matrix<Scalar,2,1> Vector2;
-  typedef Matrix<Scalar,2,2> Matrix2;
+  typedef Matrix<Scalar, 2, 1> Vector2;
+  typedef Matrix<Scalar, 2, 2> Matrix2;
 
-protected:
-
+ protected:
   Scalar m_angle;
 
-public:
-
+ public:
   /** Construct a 2D counter clock wise rotation from the angle \a a in radian. */
   EIGEN_DEVICE_FUNC explicit inline Rotation2D(const Scalar& a) : m_angle(a) {}
-  
+
   /** Default constructor wihtout initialization. The represented rotation is undefined. */
   EIGEN_DEVICE_FUNC Rotation2D() {}
 
   /** Construct a 2D rotation from a 2x2 rotation matrix \a mat.
-    *
-    * \sa fromRotationMatrix()
-    */
-  template<typename Derived>
-  EIGEN_DEVICE_FUNC explicit Rotation2D(const MatrixBase<Derived>& m)
-  {
+   *
+   * \sa fromRotationMatrix()
+   */
+  template <typename Derived>
+  EIGEN_DEVICE_FUNC explicit Rotation2D(const MatrixBase<Derived>& m) {
     fromRotationMatrix(m.derived());
   }
 
@@ -82,18 +77,20 @@
 
   /** \returns a read-write reference to the rotation angle */
   EIGEN_DEVICE_FUNC inline Scalar& angle() { return m_angle; }
-  
+
   /** \returns the rotation angle in [0,2pi] */
   EIGEN_DEVICE_FUNC inline Scalar smallestPositiveAngle() const {
-    Scalar tmp = numext::fmod(m_angle,Scalar(2*EIGEN_PI));
-    return tmp<Scalar(0) ? tmp + Scalar(2*EIGEN_PI) : tmp;
+    Scalar tmp = numext::fmod(m_angle, Scalar(2 * EIGEN_PI));
+    return tmp < Scalar(0) ? tmp + Scalar(2 * EIGEN_PI) : tmp;
   }
-  
+
   /** \returns the rotation angle in [-pi,pi] */
   EIGEN_DEVICE_FUNC inline Scalar smallestAngle() const {
-    Scalar tmp = numext::fmod(m_angle,Scalar(2*EIGEN_PI));
-    if(tmp>Scalar(EIGEN_PI))       tmp -= Scalar(2*EIGEN_PI);
-    else if(tmp<-Scalar(EIGEN_PI)) tmp += Scalar(2*EIGEN_PI);
+    Scalar tmp = numext::fmod(m_angle, Scalar(2 * EIGEN_PI));
+    if (tmp > Scalar(EIGEN_PI))
+      tmp -= Scalar(2 * EIGEN_PI);
+    else if (tmp < -Scalar(EIGEN_PI))
+      tmp += Scalar(2 * EIGEN_PI);
     return tmp;
   }
 
@@ -101,95 +98,97 @@
   EIGEN_DEVICE_FUNC inline Rotation2D inverse() const { return Rotation2D(-m_angle); }
 
   /** Concatenates two rotations */
-  EIGEN_DEVICE_FUNC inline Rotation2D operator*(const Rotation2D& other) const
-  { return Rotation2D(m_angle + other.m_angle); }
+  EIGEN_DEVICE_FUNC inline Rotation2D operator*(const Rotation2D& other) const {
+    return Rotation2D(m_angle + other.m_angle);
+  }
 
   /** Concatenates two rotations */
-  EIGEN_DEVICE_FUNC inline Rotation2D& operator*=(const Rotation2D& other)
-  { m_angle += other.m_angle; return *this; }
+  EIGEN_DEVICE_FUNC inline Rotation2D& operator*=(const Rotation2D& other) {
+    m_angle += other.m_angle;
+    return *this;
+  }
 
   /** Applies the rotation to a 2D vector */
-  EIGEN_DEVICE_FUNC Vector2 operator* (const Vector2& vec) const
-  { return toRotationMatrix() * vec; }
-  
-  template<typename Derived>
+  EIGEN_DEVICE_FUNC Vector2 operator*(const Vector2& vec) const { return toRotationMatrix() * vec; }
+
+  template <typename Derived>
   EIGEN_DEVICE_FUNC Rotation2D& fromRotationMatrix(const MatrixBase<Derived>& m);
   EIGEN_DEVICE_FUNC Matrix2 toRotationMatrix() const;
 
   /** Set \c *this from a 2x2 rotation matrix \a mat.
-    * In other words, this function extract the rotation angle from the rotation matrix.
-    *
-    * This method is an alias for fromRotationMatrix()
-    *
-    * \sa fromRotationMatrix()
-    */
-  template<typename Derived>
-  EIGEN_DEVICE_FUNC Rotation2D& operator=(const  MatrixBase<Derived>& m)
-  { return fromRotationMatrix(m.derived()); }
+   * In other words, this function extract the rotation angle from the rotation matrix.
+   *
+   * This method is an alias for fromRotationMatrix()
+   *
+   * \sa fromRotationMatrix()
+   */
+  template <typename Derived>
+  EIGEN_DEVICE_FUNC Rotation2D& operator=(const MatrixBase<Derived>& m) {
+    return fromRotationMatrix(m.derived());
+  }
 
   /** \returns the spherical interpolation between \c *this and \a other using
-    * parameter \a t. It is in fact equivalent to a linear interpolation.
-    */
-  EIGEN_DEVICE_FUNC inline Rotation2D slerp(const Scalar& t, const Rotation2D& other) const
-  {
-    Scalar dist = Rotation2D(other.m_angle-m_angle).smallestAngle();
-    return Rotation2D(m_angle + dist*t);
+   * parameter \a t. It is in fact equivalent to a linear interpolation.
+   */
+  EIGEN_DEVICE_FUNC inline Rotation2D slerp(const Scalar& t, const Rotation2D& other) const {
+    Scalar dist = Rotation2D(other.m_angle - m_angle).smallestAngle();
+    return Rotation2D(m_angle + dist * t);
   }
 
   /** \returns \c *this with scalar type casted to \a NewScalarType
-    *
-    * Note that if \a NewScalarType is equal to the current scalar type of \c *this
-    * then this function smartly returns a const reference to \c *this.
-    */
-  template<typename NewScalarType>
-  EIGEN_DEVICE_FUNC inline typename internal::cast_return_type<Rotation2D,Rotation2D<NewScalarType> >::type cast() const
-  { return typename internal::cast_return_type<Rotation2D,Rotation2D<NewScalarType> >::type(*this); }
+   *
+   * Note that if \a NewScalarType is equal to the current scalar type of \c *this
+   * then this function smartly returns a const reference to \c *this.
+   */
+  template <typename NewScalarType>
+  EIGEN_DEVICE_FUNC inline typename internal::cast_return_type<Rotation2D, Rotation2D<NewScalarType> >::type cast()
+      const {
+    return typename internal::cast_return_type<Rotation2D, Rotation2D<NewScalarType> >::type(*this);
+  }
 
   /** Copy constructor with scalar type conversion */
-  template<typename OtherScalarType>
-  EIGEN_DEVICE_FUNC inline explicit Rotation2D(const Rotation2D<OtherScalarType>& other)
-  {
+  template <typename OtherScalarType>
+  EIGEN_DEVICE_FUNC inline explicit Rotation2D(const Rotation2D<OtherScalarType>& other) {
     m_angle = Scalar(other.angle());
   }
 
   EIGEN_DEVICE_FUNC static inline Rotation2D Identity() { return Rotation2D(0); }
 
   /** \returns \c true if \c *this is approximately equal to \a other, within the precision
-    * determined by \a prec.
-    *
-    * \sa MatrixBase::isApprox() */
-  EIGEN_DEVICE_FUNC bool isApprox(const Rotation2D& other, const typename NumTraits<Scalar>::Real& prec = NumTraits<Scalar>::dummy_precision()) const
-  { return internal::isApprox(m_angle,other.m_angle, prec); }
-  
+   * determined by \a prec.
+   *
+   * \sa MatrixBase::isApprox() */
+  EIGEN_DEVICE_FUNC bool isApprox(const Rotation2D& other, const typename NumTraits<Scalar>::Real& prec =
+                                                               NumTraits<Scalar>::dummy_precision()) const {
+    return internal::isApprox(m_angle, other.m_angle, prec);
+  }
 };
 
 /** \ingroup Geometry_Module
-  * single precision 2D rotation type */
+ * single precision 2D rotation type */
 typedef Rotation2D<float> Rotation2Df;
 /** \ingroup Geometry_Module
-  * double precision 2D rotation type */
+ * double precision 2D rotation type */
 typedef Rotation2D<double> Rotation2Dd;
 
 /** Set \c *this from a 2x2 rotation matrix \a mat.
-  * In other words, this function extract the rotation angle
-  * from the rotation matrix.
-  */
-template<typename Scalar>
-template<typename Derived>
-EIGEN_DEVICE_FUNC Rotation2D<Scalar>& Rotation2D<Scalar>::fromRotationMatrix(const MatrixBase<Derived>& mat)
-{
+ * In other words, this function extract the rotation angle
+ * from the rotation matrix.
+ */
+template <typename Scalar>
+template <typename Derived>
+EIGEN_DEVICE_FUNC Rotation2D<Scalar>& Rotation2D<Scalar>::fromRotationMatrix(const MatrixBase<Derived>& mat) {
   EIGEN_USING_STD(atan2)
-  EIGEN_STATIC_ASSERT(Derived::RowsAtCompileTime==2 && Derived::ColsAtCompileTime==2,YOU_MADE_A_PROGRAMMING_MISTAKE)
-  m_angle = atan2(mat.coeff(1,0), mat.coeff(0,0));
+  EIGEN_STATIC_ASSERT(Derived::RowsAtCompileTime == 2 && Derived::ColsAtCompileTime == 2,
+                      YOU_MADE_A_PROGRAMMING_MISTAKE)
+  m_angle = atan2(mat.coeff(1, 0), mat.coeff(0, 0));
   return *this;
 }
 
 /** Constructs and \returns an equivalent 2x2 rotation matrix.
-  */
-template<typename Scalar>
-typename Rotation2D<Scalar>::Matrix2
-EIGEN_DEVICE_FUNC Rotation2D<Scalar>::toRotationMatrix(void) const
-{
+ */
+template <typename Scalar>
+typename Rotation2D<Scalar>::Matrix2 EIGEN_DEVICE_FUNC Rotation2D<Scalar>::toRotationMatrix(void) const {
   EIGEN_USING_STD(sin)
   EIGEN_USING_STD(cos)
   Scalar sinA = sin(m_angle);
@@ -197,6 +196,6 @@
   return (Matrix2() << cosA, -sinA, sinA, cosA).finished();
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_ROTATION2D_H
+#endif  // EIGEN_ROTATION2D_H
diff --git a/Eigen/src/Geometry/RotationBase.h b/Eigen/src/Geometry/RotationBase.h
index d685bc7..3a3a3e3 100644
--- a/Eigen/src/Geometry/RotationBase.h
+++ b/Eigen/src/Geometry/RotationBase.h
@@ -13,197 +13,197 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 // forward declaration
 namespace internal {
-template<typename RotationDerived, typename MatrixType, bool IsVector=MatrixType::IsVectorAtCompileTime>
+template <typename RotationDerived, typename MatrixType, bool IsVector = MatrixType::IsVectorAtCompileTime>
 struct rotation_base_generic_product_selector;
 }
 
 /** \class RotationBase
-  *
-  * \brief Common base class for compact rotation representations
-  *
-  * \tparam Derived is the derived type, i.e., a rotation type
-  * \tparam Dim_ the dimension of the space
-  */
-template<typename Derived, int Dim_>
-class RotationBase
-{
-  public:
-    enum { Dim = Dim_ };
-    /** the scalar type of the coefficients */
-    typedef typename internal::traits<Derived>::Scalar Scalar;
+ *
+ * \brief Common base class for compact rotation representations
+ *
+ * \tparam Derived is the derived type, i.e., a rotation type
+ * \tparam Dim_ the dimension of the space
+ */
+template <typename Derived, int Dim_>
+class RotationBase {
+ public:
+  enum { Dim = Dim_ };
+  /** the scalar type of the coefficients */
+  typedef typename internal::traits<Derived>::Scalar Scalar;
 
-    /** corresponding linear transformation matrix type */
-    typedef Matrix<Scalar,Dim,Dim> RotationMatrixType;
-    typedef Matrix<Scalar,Dim,1> VectorType;
+  /** corresponding linear transformation matrix type */
+  typedef Matrix<Scalar, Dim, Dim> RotationMatrixType;
+  typedef Matrix<Scalar, Dim, 1> VectorType;
 
-  public:
-    EIGEN_DEVICE_FUNC inline const Derived& derived() const { return *static_cast<const Derived*>(this); }
-    EIGEN_DEVICE_FUNC inline Derived& derived() { return *static_cast<Derived*>(this); }
+ public:
+  EIGEN_DEVICE_FUNC inline const Derived& derived() const { return *static_cast<const Derived*>(this); }
+  EIGEN_DEVICE_FUNC inline Derived& derived() { return *static_cast<Derived*>(this); }
 
-    /** \returns an equivalent rotation matrix */
-    EIGEN_DEVICE_FUNC inline RotationMatrixType toRotationMatrix() const { return derived().toRotationMatrix(); }
+  /** \returns an equivalent rotation matrix */
+  EIGEN_DEVICE_FUNC inline RotationMatrixType toRotationMatrix() const { return derived().toRotationMatrix(); }
 
-    /** \returns an equivalent rotation matrix 
-      * This function is added to be conform with the Transform class' naming scheme.
-      */
-    EIGEN_DEVICE_FUNC inline RotationMatrixType matrix() const { return derived().toRotationMatrix(); }
+  /** \returns an equivalent rotation matrix
+   * This function is added to be conform with the Transform class' naming scheme.
+   */
+  EIGEN_DEVICE_FUNC inline RotationMatrixType matrix() const { return derived().toRotationMatrix(); }
 
-    /** \returns the inverse rotation */
-    EIGEN_DEVICE_FUNC inline Derived inverse() const { return derived().inverse(); }
+  /** \returns the inverse rotation */
+  EIGEN_DEVICE_FUNC inline Derived inverse() const { return derived().inverse(); }
 
-    /** \returns the concatenation of the rotation \c *this with a translation \a t */
-    EIGEN_DEVICE_FUNC inline Transform<Scalar,Dim,Isometry> operator*(const Translation<Scalar,Dim>& t) const
-    { return Transform<Scalar,Dim,Isometry>(*this) * t; }
+  /** \returns the concatenation of the rotation \c *this with a translation \a t */
+  EIGEN_DEVICE_FUNC inline Transform<Scalar, Dim, Isometry> operator*(const Translation<Scalar, Dim>& t) const {
+    return Transform<Scalar, Dim, Isometry>(*this) * t;
+  }
 
-    /** \returns the concatenation of the rotation \c *this with a uniform scaling \a s */
-    EIGEN_DEVICE_FUNC inline RotationMatrixType operator*(const UniformScaling<Scalar>& s) const
-    { return toRotationMatrix() * s.factor(); }
+  /** \returns the concatenation of the rotation \c *this with a uniform scaling \a s */
+  EIGEN_DEVICE_FUNC inline RotationMatrixType operator*(const UniformScaling<Scalar>& s) const {
+    return toRotationMatrix() * s.factor();
+  }
 
-    /** \returns the concatenation of the rotation \c *this with a generic expression \a e
-      * \a e can be:
-      *  - a DimxDim linear transformation matrix
-      *  - a DimxDim diagonal matrix (axis aligned scaling)
-      *  - a vector of size Dim
-      */
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::rotation_base_generic_product_selector<Derived,OtherDerived,OtherDerived::IsVectorAtCompileTime>::ReturnType
-    operator*(const EigenBase<OtherDerived>& e) const
-    { return internal::rotation_base_generic_product_selector<Derived,OtherDerived>::run(derived(), e.derived()); }
+  /** \returns the concatenation of the rotation \c *this with a generic expression \a e
+   * \a e can be:
+   *  - a DimxDim linear transformation matrix
+   *  - a DimxDim diagonal matrix (axis aligned scaling)
+   *  - a vector of size Dim
+   */
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
+      typename internal::rotation_base_generic_product_selector<Derived, OtherDerived,
+                                                                OtherDerived::IsVectorAtCompileTime>::ReturnType
+      operator*(const EigenBase<OtherDerived>& e) const {
+    return internal::rotation_base_generic_product_selector<Derived, OtherDerived>::run(derived(), e.derived());
+  }
 
-    /** \returns the concatenation of a linear transformation \a l with the rotation \a r */
-    template<typename OtherDerived> friend
-    EIGEN_DEVICE_FUNC inline RotationMatrixType operator*(const EigenBase<OtherDerived>& l, const Derived& r)
-    { return l.derived() * r.toRotationMatrix(); }
+  /** \returns the concatenation of a linear transformation \a l with the rotation \a r */
+  template <typename OtherDerived>
+  friend EIGEN_DEVICE_FUNC inline RotationMatrixType operator*(const EigenBase<OtherDerived>& l, const Derived& r) {
+    return l.derived() * r.toRotationMatrix();
+  }
 
-    /** \returns the concatenation of a scaling \a l with the rotation \a r */
-    EIGEN_DEVICE_FUNC friend inline Transform<Scalar,Dim,Affine> operator*(const DiagonalMatrix<Scalar,Dim>& l, const Derived& r)
-    { 
-      Transform<Scalar,Dim,Affine> res(r);
-      res.linear().applyOnTheLeft(l);
-      return res;
-    }
+  /** \returns the concatenation of a scaling \a l with the rotation \a r */
+  EIGEN_DEVICE_FUNC friend inline Transform<Scalar, Dim, Affine> operator*(const DiagonalMatrix<Scalar, Dim>& l,
+                                                                           const Derived& r) {
+    Transform<Scalar, Dim, Affine> res(r);
+    res.linear().applyOnTheLeft(l);
+    return res;
+  }
 
-    /** \returns the concatenation of the rotation \c *this with a transformation \a t */
-    template<int Mode, int Options>
-    EIGEN_DEVICE_FUNC inline Transform<Scalar,Dim,Mode> operator*(const Transform<Scalar,Dim,Mode,Options>& t) const
-    { return toRotationMatrix() * t; }
+  /** \returns the concatenation of the rotation \c *this with a transformation \a t */
+  template <int Mode, int Options>
+  EIGEN_DEVICE_FUNC inline Transform<Scalar, Dim, Mode> operator*(
+      const Transform<Scalar, Dim, Mode, Options>& t) const {
+    return toRotationMatrix() * t;
+  }
 
-    template<typename OtherVectorType>
-    EIGEN_DEVICE_FUNC inline VectorType _transformVector(const OtherVectorType& v) const
-    { return toRotationMatrix() * v; }
+  template <typename OtherVectorType>
+  EIGEN_DEVICE_FUNC inline VectorType _transformVector(const OtherVectorType& v) const {
+    return toRotationMatrix() * v;
+  }
 };
 
 namespace internal {
 
 // implementation of the generic product rotation * matrix
-template<typename RotationDerived, typename MatrixType>
-struct rotation_base_generic_product_selector<RotationDerived,MatrixType,false>
-{
+template <typename RotationDerived, typename MatrixType>
+struct rotation_base_generic_product_selector<RotationDerived, MatrixType, false> {
   enum { Dim = RotationDerived::Dim };
-  typedef Matrix<typename RotationDerived::Scalar,Dim,Dim> ReturnType;
-  EIGEN_DEVICE_FUNC static inline ReturnType run(const RotationDerived& r, const MatrixType& m)
-  { return r.toRotationMatrix() * m; }
+  typedef Matrix<typename RotationDerived::Scalar, Dim, Dim> ReturnType;
+  EIGEN_DEVICE_FUNC static inline ReturnType run(const RotationDerived& r, const MatrixType& m) {
+    return r.toRotationMatrix() * m;
+  }
 };
 
-template<typename RotationDerived, typename Scalar, int Dim, int MaxDim>
-struct rotation_base_generic_product_selector< RotationDerived, DiagonalMatrix<Scalar,Dim,MaxDim>, false >
-{
-  typedef Transform<Scalar,Dim,Affine> ReturnType;
-  EIGEN_DEVICE_FUNC static inline ReturnType run(const RotationDerived& r, const DiagonalMatrix<Scalar,Dim,MaxDim>& m)
-  {
+template <typename RotationDerived, typename Scalar, int Dim, int MaxDim>
+struct rotation_base_generic_product_selector<RotationDerived, DiagonalMatrix<Scalar, Dim, MaxDim>, false> {
+  typedef Transform<Scalar, Dim, Affine> ReturnType;
+  EIGEN_DEVICE_FUNC static inline ReturnType run(const RotationDerived& r,
+                                                 const DiagonalMatrix<Scalar, Dim, MaxDim>& m) {
     ReturnType res(r);
     res.linear() *= m;
     return res;
   }
 };
 
-template<typename RotationDerived,typename OtherVectorType>
-struct rotation_base_generic_product_selector<RotationDerived,OtherVectorType,true>
-{
+template <typename RotationDerived, typename OtherVectorType>
+struct rotation_base_generic_product_selector<RotationDerived, OtherVectorType, true> {
   enum { Dim = RotationDerived::Dim };
-  typedef Matrix<typename RotationDerived::Scalar,Dim,1> ReturnType;
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE ReturnType run(const RotationDerived& r, const OtherVectorType& v)
-  {
+  typedef Matrix<typename RotationDerived::Scalar, Dim, 1> ReturnType;
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE ReturnType run(const RotationDerived& r, const OtherVectorType& v) {
     return r._transformVector(v);
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \geometry_module
-  *
-  * \brief Constructs a Dim x Dim rotation matrix from the rotation \a r
-  */
-template<typename Scalar_, int Rows_, int Cols_, int Storage_, int MaxRows_, int MaxCols_>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC Matrix<Scalar_, Rows_, Cols_, Storage_, MaxRows_, MaxCols_>
-::Matrix(const RotationBase<OtherDerived,ColsAtCompileTime>& r)
-{
-  EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix,int(OtherDerived::Dim),int(OtherDerived::Dim))
+ *
+ * \brief Constructs a Dim x Dim rotation matrix from the rotation \a r
+ */
+template <typename Scalar_, int Rows_, int Cols_, int Storage_, int MaxRows_, int MaxCols_>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC Matrix<Scalar_, Rows_, Cols_, Storage_, MaxRows_, MaxCols_>::Matrix(
+    const RotationBase<OtherDerived, ColsAtCompileTime>& r) {
+  EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix, int(OtherDerived::Dim), int(OtherDerived::Dim))
   *this = r.toRotationMatrix();
 }
 
 /** \geometry_module
-  *
-  * \brief Set a Dim x Dim rotation matrix from the rotation \a r
-  */
-template<typename Scalar_, int Rows_, int Cols_, int Storage_, int MaxRows_, int MaxCols_>
-template<typename OtherDerived>
+ *
+ * \brief Set a Dim x Dim rotation matrix from the rotation \a r
+ */
+template <typename Scalar_, int Rows_, int Cols_, int Storage_, int MaxRows_, int MaxCols_>
+template <typename OtherDerived>
 EIGEN_DEVICE_FUNC Matrix<Scalar_, Rows_, Cols_, Storage_, MaxRows_, MaxCols_>&
-Matrix<Scalar_, Rows_, Cols_, Storage_, MaxRows_, MaxCols_>
-::operator=(const RotationBase<OtherDerived,ColsAtCompileTime>& r)
-{
-  EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix,int(OtherDerived::Dim),int(OtherDerived::Dim))
+Matrix<Scalar_, Rows_, Cols_, Storage_, MaxRows_, MaxCols_>::operator=(
+    const RotationBase<OtherDerived, ColsAtCompileTime>& r) {
+  EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix, int(OtherDerived::Dim), int(OtherDerived::Dim))
   return *this = r.toRotationMatrix();
 }
 
 namespace internal {
 
 /** \internal
-  *
-  * Helper function to return an arbitrary rotation object to a rotation matrix.
-  *
-  * \tparam Scalar the numeric type of the matrix coefficients
-  * \tparam Dim the dimension of the current space
-  *
-  * It returns a Dim x Dim fixed size matrix.
-  *
-  * Default specializations are provided for:
-  *   - any scalar type (2D),
-  *   - any matrix expression,
-  *   - any type based on RotationBase (e.g., Quaternion, AngleAxis, Rotation2D)
-  *
-  * Currently toRotationMatrix is only used by Transform.
-  *
-  * \sa class Transform, class Rotation2D, class Quaternion, class AngleAxis
-  */
-template<typename Scalar, int Dim>
-EIGEN_DEVICE_FUNC static inline Matrix<Scalar,2,2> toRotationMatrix(const Scalar& s)
-{
-  EIGEN_STATIC_ASSERT(Dim==2,YOU_MADE_A_PROGRAMMING_MISTAKE)
+ *
+ * Helper function to return an arbitrary rotation object to a rotation matrix.
+ *
+ * \tparam Scalar the numeric type of the matrix coefficients
+ * \tparam Dim the dimension of the current space
+ *
+ * It returns a Dim x Dim fixed size matrix.
+ *
+ * Default specializations are provided for:
+ *   - any scalar type (2D),
+ *   - any matrix expression,
+ *   - any type based on RotationBase (e.g., Quaternion, AngleAxis, Rotation2D)
+ *
+ * Currently toRotationMatrix is only used by Transform.
+ *
+ * \sa class Transform, class Rotation2D, class Quaternion, class AngleAxis
+ */
+template <typename Scalar, int Dim>
+EIGEN_DEVICE_FUNC static inline Matrix<Scalar, 2, 2> toRotationMatrix(const Scalar& s) {
+  EIGEN_STATIC_ASSERT(Dim == 2, YOU_MADE_A_PROGRAMMING_MISTAKE)
   return Rotation2D<Scalar>(s).toRotationMatrix();
 }
 
-template<typename Scalar, int Dim, typename OtherDerived>
-EIGEN_DEVICE_FUNC static inline Matrix<Scalar,Dim,Dim> toRotationMatrix(const RotationBase<OtherDerived,Dim>& r)
-{
+template <typename Scalar, int Dim, typename OtherDerived>
+EIGEN_DEVICE_FUNC static inline Matrix<Scalar, Dim, Dim> toRotationMatrix(const RotationBase<OtherDerived, Dim>& r) {
   return r.toRotationMatrix();
 }
 
-template<typename Scalar, int Dim, typename OtherDerived>
-EIGEN_DEVICE_FUNC static inline const MatrixBase<OtherDerived>& toRotationMatrix(const MatrixBase<OtherDerived>& mat)
-{
-  EIGEN_STATIC_ASSERT(OtherDerived::RowsAtCompileTime==Dim && OtherDerived::ColsAtCompileTime==Dim,
-    YOU_MADE_A_PROGRAMMING_MISTAKE)
+template <typename Scalar, int Dim, typename OtherDerived>
+EIGEN_DEVICE_FUNC static inline const MatrixBase<OtherDerived>& toRotationMatrix(const MatrixBase<OtherDerived>& mat) {
+  EIGEN_STATIC_ASSERT(OtherDerived::RowsAtCompileTime == Dim && OtherDerived::ColsAtCompileTime == Dim,
+                      YOU_MADE_A_PROGRAMMING_MISTAKE)
   return mat;
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_ROTATIONBASE_H
+#endif  // EIGEN_ROTATIONBASE_H
diff --git a/Eigen/src/Geometry/Scaling.h b/Eigen/src/Geometry/Scaling.h
index 7da2dbe..a0604ce 100644
--- a/Eigen/src/Geometry/Scaling.h
+++ b/Eigen/src/Geometry/Scaling.h
@@ -13,54 +13,46 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 /** \geometry_module \ingroup Geometry_Module
-  *
-  * \class UniformScaling
-  *
-  * \brief Represents a generic uniform scaling transformation
-  *
-  * \tparam Scalar_ the scalar type, i.e., the type of the coefficients.
-  *
-  * This class represent a uniform scaling transformation. It is the return
-  * type of Scaling(Scalar), and most of the time this is the only way it
-  * is used. In particular, this class is not aimed to be used to store a scaling transformation,
-  * but rather to make easier the constructions and updates of Transform objects.
-  *
-  * To represent an axis aligned scaling, use the DiagonalMatrix class.
-  *
-  * \sa Scaling(), class DiagonalMatrix, MatrixBase::asDiagonal(), class Translation, class Transform
-  */
+ *
+ * \class UniformScaling
+ *
+ * \brief Represents a generic uniform scaling transformation
+ *
+ * \tparam Scalar_ the scalar type, i.e., the type of the coefficients.
+ *
+ * This class represent a uniform scaling transformation. It is the return
+ * type of Scaling(Scalar), and most of the time this is the only way it
+ * is used. In particular, this class is not aimed to be used to store a scaling transformation,
+ * but rather to make easier the constructions and updates of Transform objects.
+ *
+ * To represent an axis aligned scaling, use the DiagonalMatrix class.
+ *
+ * \sa Scaling(), class DiagonalMatrix, MatrixBase::asDiagonal(), class Translation, class Transform
+ */
 
-namespace internal
-{
-  // This helper helps nvcc+MSVC to properly parse this file.
-  // See bug 1412.
-  template <typename Scalar, int Dim, int Mode>
-  struct uniformscaling_times_affine_returntype
-  {
-    enum
-    {
-      NewMode = int(Mode) == int(Isometry) ? Affine : Mode
-    };
-    typedef Transform <Scalar, Dim, NewMode> type;
-  };
-}
+namespace internal {
+// This helper helps nvcc+MSVC to properly parse this file.
+// See bug 1412.
+template <typename Scalar, int Dim, int Mode>
+struct uniformscaling_times_affine_returntype {
+  enum { NewMode = int(Mode) == int(Isometry) ? Affine : Mode };
+  typedef Transform<Scalar, Dim, NewMode> type;
+};
+}  // namespace internal
 
-template<typename Scalar_>
-class UniformScaling
-{
-public:
+template <typename Scalar_>
+class UniformScaling {
+ public:
   /** the scalar type of the coefficients */
   typedef Scalar_ Scalar;
 
-protected:
-
+ protected:
   Scalar m_factor;
 
-public:
-
+ public:
   /** Default constructor without initialization. */
   UniformScaling() {}
   /** Constructs and initialize a uniform scaling transformation */
@@ -70,127 +62,134 @@
   inline Scalar& factor() { return m_factor; }
 
   /** Concatenates two uniform scaling */
-  inline UniformScaling operator* (const UniformScaling& other) const
-  { return UniformScaling(m_factor * other.factor()); }
+  inline UniformScaling operator*(const UniformScaling& other) const {
+    return UniformScaling(m_factor * other.factor());
+  }
 
   /** Concatenates a uniform scaling and a translation */
-  template<int Dim>
-  inline Transform<Scalar,Dim,Affine> operator* (const Translation<Scalar,Dim>& t) const;
+  template <int Dim>
+  inline Transform<Scalar, Dim, Affine> operator*(const Translation<Scalar, Dim>& t) const;
 
   /** Concatenates a uniform scaling and an affine transformation */
-  template<int Dim, int Mode, int Options>
-  inline typename
-	internal::uniformscaling_times_affine_returntype<Scalar,Dim,Mode>::type
-	operator* (const Transform<Scalar, Dim, Mode, Options>& t) const
-  {
-    typename internal::uniformscaling_times_affine_returntype<Scalar,Dim,Mode>::type res = t;
+  template <int Dim, int Mode, int Options>
+  inline typename internal::uniformscaling_times_affine_returntype<Scalar, Dim, Mode>::type operator*(
+      const Transform<Scalar, Dim, Mode, Options>& t) const {
+    typename internal::uniformscaling_times_affine_returntype<Scalar, Dim, Mode>::type res = t;
     res.prescale(factor());
     return res;
   }
 
   /** Concatenates a uniform scaling and a linear transformation matrix */
   // TODO returns an expression
-  template<typename Derived>
-  inline typename Eigen::internal::plain_matrix_type<Derived>::type operator* (const MatrixBase<Derived>& other) const
-  { return other * m_factor; }
+  template <typename Derived>
+  inline typename Eigen::internal::plain_matrix_type<Derived>::type operator*(const MatrixBase<Derived>& other) const {
+    return other * m_factor;
+  }
 
-  template<typename Derived,int Dim>
-  inline Matrix<Scalar,Dim,Dim> operator*(const RotationBase<Derived,Dim>& r) const
-  { return r.toRotationMatrix() * m_factor; }
+  template <typename Derived, int Dim>
+  inline Matrix<Scalar, Dim, Dim> operator*(const RotationBase<Derived, Dim>& r) const {
+    return r.toRotationMatrix() * m_factor;
+  }
 
   /** \returns the inverse scaling */
-  inline UniformScaling inverse() const
-  { return UniformScaling(Scalar(1)/m_factor); }
+  inline UniformScaling inverse() const { return UniformScaling(Scalar(1) / m_factor); }
 
   /** \returns \c *this with scalar type casted to \a NewScalarType
-    *
-    * Note that if \a NewScalarType is equal to the current scalar type of \c *this
-    * then this function smartly returns a const reference to \c *this.
-    */
-  template<typename NewScalarType>
-  inline UniformScaling<NewScalarType> cast() const
-  { return UniformScaling<NewScalarType>(NewScalarType(m_factor)); }
+   *
+   * Note that if \a NewScalarType is equal to the current scalar type of \c *this
+   * then this function smartly returns a const reference to \c *this.
+   */
+  template <typename NewScalarType>
+  inline UniformScaling<NewScalarType> cast() const {
+    return UniformScaling<NewScalarType>(NewScalarType(m_factor));
+  }
 
   /** Copy constructor with scalar type conversion */
-  template<typename OtherScalarType>
-  inline explicit UniformScaling(const UniformScaling<OtherScalarType>& other)
-  { m_factor = Scalar(other.factor()); }
+  template <typename OtherScalarType>
+  inline explicit UniformScaling(const UniformScaling<OtherScalarType>& other) {
+    m_factor = Scalar(other.factor());
+  }
 
   /** \returns \c true if \c *this is approximately equal to \a other, within the precision
-    * determined by \a prec.
-    *
-    * \sa MatrixBase::isApprox() */
-  bool isApprox(const UniformScaling& other, const typename NumTraits<Scalar>::Real& prec = NumTraits<Scalar>::dummy_precision()) const
-  { return internal::isApprox(m_factor, other.factor(), prec); }
-
+   * determined by \a prec.
+   *
+   * \sa MatrixBase::isApprox() */
+  bool isApprox(const UniformScaling& other,
+                const typename NumTraits<Scalar>::Real& prec = NumTraits<Scalar>::dummy_precision()) const {
+    return internal::isApprox(m_factor, other.factor(), prec);
+  }
 };
 
 /** \addtogroup Geometry_Module */
 //@{
 
 /** Concatenates a linear transformation matrix and a uniform scaling
-  * \relates UniformScaling
-  */
+ * \relates UniformScaling
+ */
 // NOTE this operator is defined in MatrixBase and not as a friend function
 // of UniformScaling to fix an internal crash of Intel's ICC
-template<typename Derived,typename Scalar>
-EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(Derived,Scalar,product)
-operator*(const MatrixBase<Derived>& matrix, const UniformScaling<Scalar>& s)
-{ return matrix.derived() * s.factor(); }
+template <typename Derived, typename Scalar>
+EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(Derived, Scalar, product)
+operator*(const MatrixBase<Derived>& matrix, const UniformScaling<Scalar>& s) {
+  return matrix.derived() * s.factor();
+}
 
 /** Constructs a uniform scaling from scale factor \a s */
 inline UniformScaling<float> Scaling(float s) { return UniformScaling<float>(s); }
 /** Constructs a uniform scaling from scale factor \a s */
 inline UniformScaling<double> Scaling(double s) { return UniformScaling<double>(s); }
 /** Constructs a uniform scaling from scale factor \a s */
-template<typename RealScalar>
-inline UniformScaling<std::complex<RealScalar> > Scaling(const std::complex<RealScalar>& s)
-{ return UniformScaling<std::complex<RealScalar> >(s); }
+template <typename RealScalar>
+inline UniformScaling<std::complex<RealScalar> > Scaling(const std::complex<RealScalar>& s) {
+  return UniformScaling<std::complex<RealScalar> >(s);
+}
 
 /** Constructs a 2D axis aligned scaling */
-template<typename Scalar>
-inline DiagonalMatrix<Scalar,2> Scaling(const Scalar& sx, const Scalar& sy)
-{ return DiagonalMatrix<Scalar,2>(sx, sy); }
+template <typename Scalar>
+inline DiagonalMatrix<Scalar, 2> Scaling(const Scalar& sx, const Scalar& sy) {
+  return DiagonalMatrix<Scalar, 2>(sx, sy);
+}
 /** Constructs a 3D axis aligned scaling */
-template<typename Scalar>
-inline DiagonalMatrix<Scalar,3> Scaling(const Scalar& sx, const Scalar& sy, const Scalar& sz)
-{ return DiagonalMatrix<Scalar,3>(sx, sy, sz); }
+template <typename Scalar>
+inline DiagonalMatrix<Scalar, 3> Scaling(const Scalar& sx, const Scalar& sy, const Scalar& sz) {
+  return DiagonalMatrix<Scalar, 3>(sx, sy, sz);
+}
 
 /** Constructs an axis aligned scaling expression from vector expression \a coeffs
-  * This is an alias for coeffs.asDiagonal()
-  */
-template<typename Derived>
-inline const DiagonalWrapper<const Derived> Scaling(const MatrixBase<Derived>& coeffs)
-{ return coeffs.asDiagonal(); }
+ * This is an alias for coeffs.asDiagonal()
+ */
+template <typename Derived>
+inline const DiagonalWrapper<const Derived> Scaling(const MatrixBase<Derived>& coeffs) {
+  return coeffs.asDiagonal();
+}
 
 /** Constructs an axis aligned scaling expression from vector \a coeffs when passed as an rvalue reference */
-template<typename Derived>
-inline typename DiagonalWrapper<const Derived>::PlainObject Scaling(MatrixBase<Derived>&& coeffs)
-{ return typename DiagonalWrapper<const Derived>::PlainObject(std::move(coeffs.derived())); }
+template <typename Derived>
+inline typename DiagonalWrapper<const Derived>::PlainObject Scaling(MatrixBase<Derived>&& coeffs) {
+  return typename DiagonalWrapper<const Derived>::PlainObject(std::move(coeffs.derived()));
+}
 
 /** \deprecated */
 typedef DiagonalMatrix<float, 2> AlignedScaling2f;
 /** \deprecated */
-typedef DiagonalMatrix<double,2> AlignedScaling2d;
+typedef DiagonalMatrix<double, 2> AlignedScaling2d;
 /** \deprecated */
 typedef DiagonalMatrix<float, 3> AlignedScaling3f;
 /** \deprecated */
-typedef DiagonalMatrix<double,3> AlignedScaling3d;
+typedef DiagonalMatrix<double, 3> AlignedScaling3d;
 //@}
 
-template<typename Scalar>
-template<int Dim>
-inline Transform<Scalar,Dim,Affine>
-UniformScaling<Scalar>::operator* (const Translation<Scalar,Dim>& t) const
-{
-  Transform<Scalar,Dim,Affine> res;
+template <typename Scalar>
+template <int Dim>
+inline Transform<Scalar, Dim, Affine> UniformScaling<Scalar>::operator*(const Translation<Scalar, Dim>& t) const {
+  Transform<Scalar, Dim, Affine> res;
   res.matrix().setZero();
   res.linear().diagonal().fill(factor());
   res.translation() = factor() * t.vector();
-  res(Dim,Dim) = Scalar(1);
+  res(Dim, Dim) = Scalar(1);
   return res;
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SCALING_H
+#endif  // EIGEN_SCALING_H
diff --git a/Eigen/src/Geometry/Transform.h b/Eigen/src/Geometry/Transform.h
index 1cfff1b..077441d 100644
--- a/Eigen/src/Geometry/Transform.h
+++ b/Eigen/src/Geometry/Transform.h
@@ -19,62 +19,46 @@
 
 namespace internal {
 
-template<typename Transform>
-struct transform_traits
-{
-  enum
-  {
+template <typename Transform>
+struct transform_traits {
+  enum {
     Dim = Transform::Dim,
     HDim = Transform::HDim,
     Mode = Transform::Mode,
-    IsProjective = (int(Mode)==int(Projective))
+    IsProjective = (int(Mode) == int(Projective))
   };
 };
 
-template< typename TransformType,
-          typename MatrixType,
-          int Case = transform_traits<TransformType>::IsProjective ? 0
-                   : int(MatrixType::RowsAtCompileTime) == int(transform_traits<TransformType>::HDim) ? 1
-                   : 2,
+template <typename TransformType, typename MatrixType,
+          int Case = transform_traits<TransformType>::IsProjective                                      ? 0
+                     : int(MatrixType::RowsAtCompileTime) == int(transform_traits<TransformType>::HDim) ? 1
+                                                                                                        : 2,
           int RhsCols = MatrixType::ColsAtCompileTime>
 struct transform_right_product_impl;
 
-template< typename Other,
-          int Mode,
-          int Options,
-          int Dim,
-          int HDim,
-          int OtherRows=Other::RowsAtCompileTime,
-          int OtherCols=Other::ColsAtCompileTime>
+template <typename Other, int Mode, int Options, int Dim, int HDim, int OtherRows = Other::RowsAtCompileTime,
+          int OtherCols = Other::ColsAtCompileTime>
 struct transform_left_product_impl;
 
-template< typename Lhs,
-          typename Rhs,
-          bool AnyProjective =
-            transform_traits<Lhs>::IsProjective ||
-            transform_traits<Rhs>::IsProjective>
+template <typename Lhs, typename Rhs,
+          bool AnyProjective = transform_traits<Lhs>::IsProjective || transform_traits<Rhs>::IsProjective>
 struct transform_transform_product_impl;
 
-template< typename Other,
-          int Mode,
-          int Options,
-          int Dim,
-          int HDim,
-          int OtherRows=Other::RowsAtCompileTime,
-          int OtherCols=Other::ColsAtCompileTime>
+template <typename Other, int Mode, int Options, int Dim, int HDim, int OtherRows = Other::RowsAtCompileTime,
+          int OtherCols = Other::ColsAtCompileTime>
 struct transform_construct_from_matrix;
 
-template<typename TransformType> struct transform_take_affine_part;
+template <typename TransformType>
+struct transform_take_affine_part;
 
-template<typename Scalar_, int Dim_, int Mode_, int Options_>
-struct traits<Transform<Scalar_,Dim_,Mode_,Options_> >
-{
+template <typename Scalar_, int Dim_, int Mode_, int Options_>
+struct traits<Transform<Scalar_, Dim_, Mode_, Options_> > {
   typedef Scalar_ Scalar;
   typedef Eigen::Index StorageIndex;
   typedef Dense StorageKind;
   enum {
-    Dim1 = Dim_==Dynamic ? Dim_ : Dim_ + 1,
-    RowsAtCompileTime = Mode_==Projective ? Dim1 : Dim_,
+    Dim1 = Dim_ == Dynamic ? Dim_ : Dim_ + 1,
+    RowsAtCompileTime = Mode_ == Projective ? Dim1 : Dim_,
     ColsAtCompileTime = Dim1,
     MaxRowsAtCompileTime = RowsAtCompileTime,
     MaxColsAtCompileTime = ColsAtCompileTime,
@@ -82,202 +66,198 @@
   };
 };
 
-template<int Mode> struct transform_make_affine;
+template <int Mode>
+struct transform_make_affine;
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \geometry_module \ingroup Geometry_Module
-  *
-  * \class Transform
-  *
-  * \brief Represents an homogeneous transformation in a N dimensional space
-  *
-  * \tparam Scalar_ the scalar type, i.e., the type of the coefficients
-  * \tparam Dim_ the dimension of the space
-  * \tparam Mode_ the type of the transformation. Can be:
-  *              - #Affine: the transformation is stored as a (Dim+1)^2 matrix,
-  *                         where the last row is assumed to be [0 ... 0 1].
-  *              - #AffineCompact: the transformation is stored as a (Dim)x(Dim+1) matrix.
-  *              - #Projective: the transformation is stored as a (Dim+1)^2 matrix
-  *                             without any assumption.
-  *              - #Isometry: same as #Affine with the additional assumption that
-  *                           the linear part represents a rotation. This assumption is exploited
-  *                           to speed up some functions such as inverse() and rotation().
-  * \tparam Options_ has the same meaning as in class Matrix. It allows to specify DontAlign and/or RowMajor.
-  *                  These Options are passed directly to the underlying matrix type.
-  *
-  * The homography is internally represented and stored by a matrix which
-  * is available through the matrix() method. To understand the behavior of
-  * this class you have to think a Transform object as its internal
-  * matrix representation. The chosen convention is right multiply:
-  *
-  * \code v' = T * v \endcode
-  *
-  * Therefore, an affine transformation matrix M is shaped like this:
-  *
-  * \f$ \left( \begin{array}{cc}
-  * linear & translation\\
-  * 0 ... 0 & 1
-  * \end{array} \right) \f$
-  *
-  * Note that for a projective transformation the last row can be anything,
-  * and then the interpretation of different parts might be slightly different.
-  *
-  * However, unlike a plain matrix, the Transform class provides many features
-  * simplifying both its assembly and usage. In particular, it can be composed
-  * with any other transformations (Transform,Translation,RotationBase,DiagonalMatrix)
-  * and can be directly used to transform implicit homogeneous vectors. All these
-  * operations are handled via the operator*. For the composition of transformations,
-  * its principle consists to first convert the right/left hand sides of the product
-  * to a compatible (Dim+1)^2 matrix and then perform a pure matrix product.
-  * Of course, internally, operator* tries to perform the minimal number of operations
-  * according to the nature of each terms. Likewise, when applying the transform
-  * to points, the latters are automatically promoted to homogeneous vectors
-  * before doing the matrix product. The conventions to homogeneous representations
-  * are performed as follow:
-  *
-  * \b Translation t (Dim)x(1):
-  * \f$ \left( \begin{array}{cc}
-  * I & t \\
-  * 0\,...\,0 & 1
-  * \end{array} \right) \f$
-  *
-  * \b Rotation R (Dim)x(Dim):
-  * \f$ \left( \begin{array}{cc}
-  * R & 0\\
-  * 0\,...\,0 & 1
-  * \end{array} \right) \f$
-  *<!--
-  * \b Linear \b Matrix L (Dim)x(Dim):
-  * \f$ \left( \begin{array}{cc}
-  * L & 0\\
-  * 0\,...\,0 & 1
-  * \end{array} \right) \f$
-  *
-  * \b Affine \b Matrix A (Dim)x(Dim+1):
-  * \f$ \left( \begin{array}{c}
-  * A\\
-  * 0\,...\,0\,1
-  * \end{array} \right) \f$
-  *-->
-  * \b Scaling \b DiagonalMatrix S (Dim)x(Dim):
-  * \f$ \left( \begin{array}{cc}
-  * S & 0\\
-  * 0\,...\,0 & 1
-  * \end{array} \right) \f$
-  *
-  * \b Column \b point v (Dim)x(1):
-  * \f$ \left( \begin{array}{c}
-  * v\\
-  * 1
-  * \end{array} \right) \f$
-  *
-  * \b Set \b of \b column \b points V1...Vn (Dim)x(n):
-  * \f$ \left( \begin{array}{ccc}
-  * v_1 & ... & v_n\\
-  * 1 & ... & 1
-  * \end{array} \right) \f$
-  *
-  * The concatenation of a Transform object with any kind of other transformation
-  * always returns a Transform object.
-  *
-  * A little exception to the "as pure matrix product" rule is the case of the
-  * transformation of non homogeneous vectors by an affine transformation. In
-  * that case the last matrix row can be ignored, and the product returns non
-  * homogeneous vectors.
-  *
-  * Since, for instance, a Dim x Dim matrix is interpreted as a linear transformation,
-  * it is not possible to directly transform Dim vectors stored in a Dim x Dim matrix.
-  * The solution is either to use a Dim x Dynamic matrix or explicitly request a
-  * vector transformation by making the vector homogeneous:
-  * \code
-  * m' = T * m.colwise().homogeneous();
-  * \endcode
-  * Note that there is zero overhead.
-  *
-  * Conversion methods from/to Qt's QMatrix and QTransform are available if the
-  * preprocessor token EIGEN_QT_SUPPORT is defined.
-  *
-  * This class can be extended with the help of the plugin mechanism described on the page
-  * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_TRANSFORM_PLUGIN.
-  *
-  * \sa class Matrix, class Quaternion
-  */
-template<typename Scalar_, int Dim_, int Mode_, int Options_>
-class Transform
-{
-public:
-  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar_,Dim_==Dynamic ? Dynamic : (Dim_+1)*(Dim_+1))
+ *
+ * \class Transform
+ *
+ * \brief Represents an homogeneous transformation in a N dimensional space
+ *
+ * \tparam Scalar_ the scalar type, i.e., the type of the coefficients
+ * \tparam Dim_ the dimension of the space
+ * \tparam Mode_ the type of the transformation. Can be:
+ *              - #Affine: the transformation is stored as a (Dim+1)^2 matrix,
+ *                         where the last row is assumed to be [0 ... 0 1].
+ *              - #AffineCompact: the transformation is stored as a (Dim)x(Dim+1) matrix.
+ *              - #Projective: the transformation is stored as a (Dim+1)^2 matrix
+ *                             without any assumption.
+ *              - #Isometry: same as #Affine with the additional assumption that
+ *                           the linear part represents a rotation. This assumption is exploited
+ *                           to speed up some functions such as inverse() and rotation().
+ * \tparam Options_ has the same meaning as in class Matrix. It allows to specify DontAlign and/or RowMajor.
+ *                  These Options are passed directly to the underlying matrix type.
+ *
+ * The homography is internally represented and stored by a matrix which
+ * is available through the matrix() method. To understand the behavior of
+ * this class you have to think a Transform object as its internal
+ * matrix representation. The chosen convention is right multiply:
+ *
+ * \code v' = T * v \endcode
+ *
+ * Therefore, an affine transformation matrix M is shaped like this:
+ *
+ * \f$ \left( \begin{array}{cc}
+ * linear & translation\\
+ * 0 ... 0 & 1
+ * \end{array} \right) \f$
+ *
+ * Note that for a projective transformation the last row can be anything,
+ * and then the interpretation of different parts might be slightly different.
+ *
+ * However, unlike a plain matrix, the Transform class provides many features
+ * simplifying both its assembly and usage. In particular, it can be composed
+ * with any other transformations (Transform,Translation,RotationBase,DiagonalMatrix)
+ * and can be directly used to transform implicit homogeneous vectors. All these
+ * operations are handled via the operator*. For the composition of transformations,
+ * its principle consists to first convert the right/left hand sides of the product
+ * to a compatible (Dim+1)^2 matrix and then perform a pure matrix product.
+ * Of course, internally, operator* tries to perform the minimal number of operations
+ * according to the nature of each terms. Likewise, when applying the transform
+ * to points, the latters are automatically promoted to homogeneous vectors
+ * before doing the matrix product. The conventions to homogeneous representations
+ * are performed as follow:
+ *
+ * \b Translation t (Dim)x(1):
+ * \f$ \left( \begin{array}{cc}
+ * I & t \\
+ * 0\,...\,0 & 1
+ * \end{array} \right) \f$
+ *
+ * \b Rotation R (Dim)x(Dim):
+ * \f$ \left( \begin{array}{cc}
+ * R & 0\\
+ * 0\,...\,0 & 1
+ * \end{array} \right) \f$
+ *<!--
+ * \b Linear \b Matrix L (Dim)x(Dim):
+ * \f$ \left( \begin{array}{cc}
+ * L & 0\\
+ * 0\,...\,0 & 1
+ * \end{array} \right) \f$
+ *
+ * \b Affine \b Matrix A (Dim)x(Dim+1):
+ * \f$ \left( \begin{array}{c}
+ * A\\
+ * 0\,...\,0\,1
+ * \end{array} \right) \f$
+ *-->
+ * \b Scaling \b DiagonalMatrix S (Dim)x(Dim):
+ * \f$ \left( \begin{array}{cc}
+ * S & 0\\
+ * 0\,...\,0 & 1
+ * \end{array} \right) \f$
+ *
+ * \b Column \b point v (Dim)x(1):
+ * \f$ \left( \begin{array}{c}
+ * v\\
+ * 1
+ * \end{array} \right) \f$
+ *
+ * \b Set \b of \b column \b points V1...Vn (Dim)x(n):
+ * \f$ \left( \begin{array}{ccc}
+ * v_1 & ... & v_n\\
+ * 1 & ... & 1
+ * \end{array} \right) \f$
+ *
+ * The concatenation of a Transform object with any kind of other transformation
+ * always returns a Transform object.
+ *
+ * A little exception to the "as pure matrix product" rule is the case of the
+ * transformation of non homogeneous vectors by an affine transformation. In
+ * that case the last matrix row can be ignored, and the product returns non
+ * homogeneous vectors.
+ *
+ * Since, for instance, a Dim x Dim matrix is interpreted as a linear transformation,
+ * it is not possible to directly transform Dim vectors stored in a Dim x Dim matrix.
+ * The solution is either to use a Dim x Dynamic matrix or explicitly request a
+ * vector transformation by making the vector homogeneous:
+ * \code
+ * m' = T * m.colwise().homogeneous();
+ * \endcode
+ * Note that there is zero overhead.
+ *
+ * Conversion methods from/to Qt's QMatrix and QTransform are available if the
+ * preprocessor token EIGEN_QT_SUPPORT is defined.
+ *
+ * This class can be extended with the help of the plugin mechanism described on the page
+ * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_TRANSFORM_PLUGIN.
+ *
+ * \sa class Matrix, class Quaternion
+ */
+template <typename Scalar_, int Dim_, int Mode_, int Options_>
+class Transform {
+ public:
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar_,
+                                                             Dim_ == Dynamic ? Dynamic : (Dim_ + 1) * (Dim_ + 1))
   enum {
     Mode = Mode_,
     Options = Options_,
-    Dim = Dim_,     ///< space dimension in which the transformation holds
-    HDim = Dim_+1,  ///< size of a respective homogeneous vector
-    Rows = int(Mode)==(AffineCompact) ? Dim : HDim
+    Dim = Dim_,       ///< space dimension in which the transformation holds
+    HDim = Dim_ + 1,  ///< size of a respective homogeneous vector
+    Rows = int(Mode) == (AffineCompact) ? Dim : HDim
   };
   /** the scalar type of the coefficients */
   typedef Scalar_ Scalar;
   typedef Eigen::Index StorageIndex;
-  typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3
+  typedef Eigen::Index Index;  ///< \deprecated since Eigen 3.3
   /** type of the matrix used to represent the transformation */
-  typedef typename internal::make_proper_matrix_type<Scalar,Rows,HDim,Options>::type MatrixType;
+  typedef typename internal::make_proper_matrix_type<Scalar, Rows, HDim, Options>::type MatrixType;
   /** constified MatrixType */
   typedef const MatrixType ConstMatrixType;
   /** type of the matrix used to represent the linear part of the transformation */
-  typedef Matrix<Scalar,Dim,Dim,Options> LinearMatrixType;
+  typedef Matrix<Scalar, Dim, Dim, Options> LinearMatrixType;
   /** type of read/write reference to the linear part of the transformation */
-  typedef Block<MatrixType,Dim,Dim,int(Mode)==(AffineCompact) && (int(Options)&RowMajor)==0> LinearPart;
+  typedef Block<MatrixType, Dim, Dim, int(Mode) == (AffineCompact) && (int(Options) & RowMajor) == 0> LinearPart;
   /** type of read reference to the linear part of the transformation */
-  typedef const Block<ConstMatrixType,Dim,Dim,int(Mode)==(AffineCompact) && (int(Options)&RowMajor)==0> ConstLinearPart;
+  typedef const Block<ConstMatrixType, Dim, Dim, int(Mode) == (AffineCompact) && (int(Options) & RowMajor) == 0>
+      ConstLinearPart;
   /** type of read/write reference to the affine part of the transformation */
-  typedef std::conditional_t<int(Mode)==int(AffineCompact),
-                              MatrixType&,
-                              Block<MatrixType,Dim,HDim> > AffinePart;
+  typedef std::conditional_t<int(Mode) == int(AffineCompact), MatrixType&, Block<MatrixType, Dim, HDim> > AffinePart;
   /** type of read reference to the affine part of the transformation */
-  typedef std::conditional_t<int(Mode)==int(AffineCompact),
-                              const MatrixType&,
-                              const Block<const MatrixType,Dim,HDim> > ConstAffinePart;
+  typedef std::conditional_t<int(Mode) == int(AffineCompact), const MatrixType&,
+                             const Block<const MatrixType, Dim, HDim> >
+      ConstAffinePart;
   /** type of a vector */
-  typedef Matrix<Scalar,Dim,1> VectorType;
+  typedef Matrix<Scalar, Dim, 1> VectorType;
   /** type of a read/write reference to the translation part of the rotation */
-  typedef Block<MatrixType,Dim,1,!(internal::traits<MatrixType>::Flags & RowMajorBit)> TranslationPart;
+  typedef Block<MatrixType, Dim, 1, !(internal::traits<MatrixType>::Flags & RowMajorBit)> TranslationPart;
   /** type of a read reference to the translation part of the rotation */
-  typedef const Block<ConstMatrixType,Dim,1,!(internal::traits<MatrixType>::Flags & RowMajorBit)> ConstTranslationPart;
+  typedef const Block<ConstMatrixType, Dim, 1, !(internal::traits<MatrixType>::Flags & RowMajorBit)>
+      ConstTranslationPart;
   /** corresponding translation type */
-  typedef Translation<Scalar,Dim> TranslationType;
+  typedef Translation<Scalar, Dim> TranslationType;
 
   // this intermediate enum is needed to avoid an ICE with gcc 3.4 and 4.0
-  enum { TransformTimeDiagonalMode = ((Mode==int(Isometry))?Affine:int(Mode)) };
+  enum { TransformTimeDiagonalMode = ((Mode == int(Isometry)) ? Affine : int(Mode)) };
   /** The return type of the product between a diagonal matrix and a transform */
-  typedef Transform<Scalar,Dim,TransformTimeDiagonalMode> TransformTimeDiagonalReturnType;
+  typedef Transform<Scalar, Dim, TransformTimeDiagonalMode> TransformTimeDiagonalReturnType;
 
-protected:
-
+ protected:
   MatrixType m_matrix;
 
-public:
-
+ public:
   /** Default constructor without initialization of the meaningful coefficients.
-    * If Mode==Affine or Mode==Isometry, then the last row is set to [0 ... 0 1] */
-  EIGEN_DEVICE_FUNC inline Transform()
-  {
+   * If Mode==Affine or Mode==Isometry, then the last row is set to [0 ... 0 1] */
+  EIGEN_DEVICE_FUNC inline Transform() {
     check_template_params();
-    internal::transform_make_affine<(int(Mode)==Affine || int(Mode)==Isometry) ? Affine : AffineCompact>::run(m_matrix);
+    internal::transform_make_affine<(int(Mode) == Affine || int(Mode) == Isometry) ? Affine : AffineCompact>::run(
+        m_matrix);
   }
 
-  EIGEN_DEVICE_FUNC inline explicit Transform(const TranslationType& t)
-  {
+  EIGEN_DEVICE_FUNC inline explicit Transform(const TranslationType& t) {
     check_template_params();
     *this = t;
   }
-  EIGEN_DEVICE_FUNC inline explicit Transform(const UniformScaling<Scalar>& s)
-  {
+  EIGEN_DEVICE_FUNC inline explicit Transform(const UniformScaling<Scalar>& s) {
     check_template_params();
     *this = s;
   }
-  template<typename Derived>
-  EIGEN_DEVICE_FUNC inline explicit Transform(const RotationBase<Derived, Dim>& r)
-  {
+  template <typename Derived>
+  EIGEN_DEVICE_FUNC inline explicit Transform(const RotationBase<Derived, Dim>& r) {
     check_template_params();
     *this = r;
   }
@@ -285,68 +265,63 @@
   typedef internal::transform_take_affine_part<Transform> take_affine_part;
 
   /** Constructs and initializes a transformation from a Dim^2 or a (Dim+1)^2 matrix. */
-  template<typename OtherDerived>
-  EIGEN_DEVICE_FUNC inline explicit Transform(const EigenBase<OtherDerived>& other)
-  {
-    EIGEN_STATIC_ASSERT((internal::is_same<Scalar,typename OtherDerived::Scalar>::value),
-      YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY);
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC inline explicit Transform(const EigenBase<OtherDerived>& other) {
+    EIGEN_STATIC_ASSERT(
+        (internal::is_same<Scalar, typename OtherDerived::Scalar>::value),
+        YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY);
 
     check_template_params();
-    internal::transform_construct_from_matrix<OtherDerived,Mode,Options,Dim,HDim>::run(this, other.derived());
+    internal::transform_construct_from_matrix<OtherDerived, Mode, Options, Dim, HDim>::run(this, other.derived());
   }
 
   /** Set \c *this from a Dim^2 or (Dim+1)^2 matrix. */
-  template<typename OtherDerived>
-  EIGEN_DEVICE_FUNC inline Transform& operator=(const EigenBase<OtherDerived>& other)
-  {
-    EIGEN_STATIC_ASSERT((internal::is_same<Scalar,typename OtherDerived::Scalar>::value),
-      YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY);
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC inline Transform& operator=(const EigenBase<OtherDerived>& other) {
+    EIGEN_STATIC_ASSERT(
+        (internal::is_same<Scalar, typename OtherDerived::Scalar>::value),
+        YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY);
 
-    internal::transform_construct_from_matrix<OtherDerived,Mode,Options,Dim,HDim>::run(this, other.derived());
+    internal::transform_construct_from_matrix<OtherDerived, Mode, Options, Dim, HDim>::run(this, other.derived());
     return *this;
   }
 
-  template<int OtherOptions>
-  EIGEN_DEVICE_FUNC inline Transform(const Transform<Scalar,Dim,Mode,OtherOptions>& other)
-  {
+  template <int OtherOptions>
+  EIGEN_DEVICE_FUNC inline Transform(const Transform<Scalar, Dim, Mode, OtherOptions>& other) {
     check_template_params();
     // only the options change, we can directly copy the matrices
     m_matrix = other.matrix();
   }
 
-  template<int OtherMode,int OtherOptions>
-  EIGEN_DEVICE_FUNC inline Transform(const Transform<Scalar,Dim,OtherMode,OtherOptions>& other)
-  {
+  template <int OtherMode, int OtherOptions>
+  EIGEN_DEVICE_FUNC inline Transform(const Transform<Scalar, Dim, OtherMode, OtherOptions>& other) {
     check_template_params();
     // prevent conversions as:
     // Affine | AffineCompact | Isometry = Projective
-    EIGEN_STATIC_ASSERT(internal::check_implication(OtherMode==int(Projective), Mode==int(Projective)),
+    EIGEN_STATIC_ASSERT(internal::check_implication(OtherMode == int(Projective), Mode == int(Projective)),
                         YOU_PERFORMED_AN_INVALID_TRANSFORMATION_CONVERSION)
 
     // prevent conversions as:
     // Isometry = Affine | AffineCompact
-    EIGEN_STATIC_ASSERT(internal::check_implication(OtherMode==int(Affine)||OtherMode==int(AffineCompact), Mode!=int(Isometry)),
-                        YOU_PERFORMED_AN_INVALID_TRANSFORMATION_CONVERSION)
+    EIGEN_STATIC_ASSERT(
+        internal::check_implication(OtherMode == int(Affine) || OtherMode == int(AffineCompact), Mode != int(Isometry)),
+        YOU_PERFORMED_AN_INVALID_TRANSFORMATION_CONVERSION)
 
-    enum { ModeIsAffineCompact = Mode == int(AffineCompact),
-           OtherModeIsAffineCompact = OtherMode == int(AffineCompact)
+    enum {
+      ModeIsAffineCompact = Mode == int(AffineCompact),
+      OtherModeIsAffineCompact = OtherMode == int(AffineCompact)
     };
 
-    if(EIGEN_CONST_CONDITIONAL(ModeIsAffineCompact == OtherModeIsAffineCompact))
-    {
+    if (EIGEN_CONST_CONDITIONAL(ModeIsAffineCompact == OtherModeIsAffineCompact)) {
       // We need the block expression because the code is compiled for all
       // combinations of transformations and will trigger a compile time error
       // if one tries to assign the matrices directly
-      m_matrix.template block<Dim,Dim+1>(0,0) = other.matrix().template block<Dim,Dim+1>(0,0);
+      m_matrix.template block<Dim, Dim + 1>(0, 0) = other.matrix().template block<Dim, Dim + 1>(0, 0);
       makeAffine();
-    }
-    else if(EIGEN_CONST_CONDITIONAL(OtherModeIsAffineCompact))
-    {
-      typedef typename Transform<Scalar,Dim,OtherMode,OtherOptions>::MatrixType OtherMatrixType;
-      internal::transform_construct_from_matrix<OtherMatrixType,Mode,Options,Dim,HDim>::run(this, other.matrix());
-    }
-    else
-    {
+    } else if (EIGEN_CONST_CONDITIONAL(OtherModeIsAffineCompact)) {
+      typedef typename Transform<Scalar, Dim, OtherMode, OtherOptions>::MatrixType OtherMatrixType;
+      internal::transform_construct_from_matrix<OtherMatrixType, Mode, Options, Dim, HDim>::run(this, other.matrix());
+    } else {
       // here we know that Mode == AffineCompact and OtherMode != AffineCompact.
       // if OtherMode were Projective, the static assert above would already have caught it.
       // So the only possibility is that OtherMode == Affine
@@ -355,40 +330,40 @@
     }
   }
 
-  template<typename OtherDerived>
-  EIGEN_DEVICE_FUNC Transform(const ReturnByValue<OtherDerived>& other)
-  {
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC Transform(const ReturnByValue<OtherDerived>& other) {
     check_template_params();
     other.evalTo(*this);
   }
 
-  template<typename OtherDerived>
-  EIGEN_DEVICE_FUNC Transform& operator=(const ReturnByValue<OtherDerived>& other)
-  {
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC Transform& operator=(const ReturnByValue<OtherDerived>& other) {
     other.evalTo(*this);
     return *this;
   }
 
-  #ifdef EIGEN_QT_SUPPORT
-  #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
+#ifdef EIGEN_QT_SUPPORT
+#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
   inline Transform(const QMatrix& other);
   inline Transform& operator=(const QMatrix& other);
   inline QMatrix toQMatrix(void) const;
-  #endif
+#endif
   inline Transform(const QTransform& other);
   inline Transform& operator=(const QTransform& other);
   inline QTransform toQTransform(void) const;
-  #endif
+#endif
 
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return int(Mode)==int(Projective) ? m_matrix.cols() : (m_matrix.cols()-1); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT {
+    return int(Mode) == int(Projective) ? m_matrix.cols() : (m_matrix.cols() - 1);
+  }
   EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_matrix.cols(); }
 
   /** shortcut for m_matrix(row,col);
-    * \sa MatrixBase::operator(Index,Index) const */
-  EIGEN_DEVICE_FUNC inline Scalar operator() (Index row, Index col) const { return m_matrix(row,col); }
+   * \sa MatrixBase::operator(Index,Index) const */
+  EIGEN_DEVICE_FUNC inline Scalar operator()(Index row, Index col) const { return m_matrix(row, col); }
   /** shortcut for m_matrix(row,col);
-    * \sa MatrixBase::operator(Index,Index) */
-  EIGEN_DEVICE_FUNC inline Scalar& operator() (Index row, Index col) { return m_matrix(row,col); }
+   * \sa MatrixBase::operator(Index,Index) */
+  EIGEN_DEVICE_FUNC inline Scalar& operator()(Index row, Index col) { return m_matrix(row, col); }
 
   /** \returns a read-only expression of the transformation matrix */
   EIGEN_DEVICE_FUNC inline const MatrixType& matrix() const { return m_matrix; }
@@ -396,9 +371,9 @@
   EIGEN_DEVICE_FUNC inline MatrixType& matrix() { return m_matrix; }
 
   /** \returns a read-only expression of the linear part of the transformation */
-  EIGEN_DEVICE_FUNC inline ConstLinearPart linear() const { return ConstLinearPart(m_matrix,0,0); }
+  EIGEN_DEVICE_FUNC inline ConstLinearPart linear() const { return ConstLinearPart(m_matrix, 0, 0); }
   /** \returns a writable expression of the linear part of the transformation */
-  EIGEN_DEVICE_FUNC inline LinearPart linear() { return LinearPart(m_matrix,0,0); }
+  EIGEN_DEVICE_FUNC inline LinearPart linear() { return LinearPart(m_matrix, 0, 0); }
 
   /** \returns a read-only expression of the Dim x HDim affine part of the transformation */
   EIGEN_DEVICE_FUNC inline ConstAffinePart affine() const { return take_affine_part::run(m_matrix); }
@@ -406,127 +381,133 @@
   EIGEN_DEVICE_FUNC inline AffinePart affine() { return take_affine_part::run(m_matrix); }
 
   /** \returns a read-only expression of the translation vector of the transformation */
-  EIGEN_DEVICE_FUNC inline ConstTranslationPart translation() const { return ConstTranslationPart(m_matrix,0,Dim); }
+  EIGEN_DEVICE_FUNC inline ConstTranslationPart translation() const { return ConstTranslationPart(m_matrix, 0, Dim); }
   /** \returns a writable expression of the translation vector of the transformation */
-  EIGEN_DEVICE_FUNC inline TranslationPart translation() { return TranslationPart(m_matrix,0,Dim); }
+  EIGEN_DEVICE_FUNC inline TranslationPart translation() { return TranslationPart(m_matrix, 0, Dim); }
 
   /** \returns an expression of the product between the transform \c *this and a matrix expression \a other.
-    *
-    * The right-hand-side \a other can be either:
-    * \li an homogeneous vector of size Dim+1,
-    * \li a set of homogeneous vectors of size Dim+1 x N,
-    * \li a transformation matrix of size Dim+1 x Dim+1.
-    *
-    * Moreover, if \c *this represents an affine transformation (i.e., Mode!=Projective), then \a other can also be:
-    * \li a point of size Dim (computes: \code this->linear() * other + this->translation()\endcode),
-    * \li a set of N points as a Dim x N matrix (computes: \code (this->linear() * other).colwise() + this->translation()\endcode),
-    *
-    * In all cases, the return type is a matrix or vector of same sizes as the right-hand-side \a other.
-    *
-    * If you want to interpret \a other as a linear or affine transformation, then first convert it to a Transform<> type,
-    * or do your own cooking.
-    *
-    * Finally, if you want to apply Affine transformations to vectors, then explicitly apply the linear part only:
-    * \code
-    * Affine3f A;
-    * Vector3f v1, v2;
-    * v2 = A.linear() * v1;
-    * \endcode
-    *
-    */
+   *
+   * The right-hand-side \a other can be either:
+   * \li an homogeneous vector of size Dim+1,
+   * \li a set of homogeneous vectors of size Dim+1 x N,
+   * \li a transformation matrix of size Dim+1 x Dim+1.
+   *
+   * Moreover, if \c *this represents an affine transformation (i.e., Mode!=Projective), then \a other can also be:
+   * \li a point of size Dim (computes: \code this->linear() * other + this->translation()\endcode),
+   * \li a set of N points as a Dim x N matrix (computes: \code (this->linear() * other).colwise() +
+   * this->translation()\endcode),
+   *
+   * In all cases, the return type is a matrix or vector of same sizes as the right-hand-side \a other.
+   *
+   * If you want to interpret \a other as a linear or affine transformation, then first convert it to a Transform<>
+   * type, or do your own cooking.
+   *
+   * Finally, if you want to apply Affine transformations to vectors, then explicitly apply the linear part only:
+   * \code
+   * Affine3f A;
+   * Vector3f v1, v2;
+   * v2 = A.linear() * v1;
+   * \endcode
+   *
+   */
   // note: this function is defined here because some compilers cannot find the respective declaration
-  template<typename OtherDerived>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename internal::transform_right_product_impl<Transform, OtherDerived>::ResultType
-  operator * (const EigenBase<OtherDerived> &other) const
-  { return internal::transform_right_product_impl<Transform, OtherDerived>::run(*this,other.derived()); }
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename internal::transform_right_product_impl<Transform,
+                                                                                              OtherDerived>::ResultType
+  operator*(const EigenBase<OtherDerived>& other) const {
+    return internal::transform_right_product_impl<Transform, OtherDerived>::run(*this, other.derived());
+  }
 
   /** \returns the product expression of a transformation matrix \a a times a transform \a b
-    *
-    * The left hand side \a other can be either:
-    * \li a linear transformation matrix of size Dim x Dim,
-    * \li an affine transformation matrix of size Dim x Dim+1,
-    * \li a general transformation matrix of size Dim+1 x Dim+1.
-    */
-  template<typename OtherDerived> friend
-  EIGEN_DEVICE_FUNC inline const typename internal::transform_left_product_impl<OtherDerived,Mode,Options,Dim_,Dim_+1>::ResultType
-    operator * (const EigenBase<OtherDerived> &a, const Transform &b)
-  { return internal::transform_left_product_impl<OtherDerived,Mode,Options,Dim,HDim>::run(a.derived(),b); }
+   *
+   * The left hand side \a other can be either:
+   * \li a linear transformation matrix of size Dim x Dim,
+   * \li an affine transformation matrix of size Dim x Dim+1,
+   * \li a general transformation matrix of size Dim+1 x Dim+1.
+   */
+  template <typename OtherDerived>
+  friend EIGEN_DEVICE_FUNC inline const typename internal::transform_left_product_impl<OtherDerived, Mode, Options,
+                                                                                       Dim_, Dim_ + 1>::ResultType
+  operator*(const EigenBase<OtherDerived>& a, const Transform& b) {
+    return internal::transform_left_product_impl<OtherDerived, Mode, Options, Dim, HDim>::run(a.derived(), b);
+  }
 
   /** \returns The product expression of a transform \a a times a diagonal matrix \a b
-    *
-    * The rhs diagonal matrix is interpreted as an affine scaling transformation. The
-    * product results in a Transform of the same type (mode) as the lhs only if the lhs
-    * mode is no isometry. In that case, the returned transform is an affinity.
-    */
-  template<typename DiagonalDerived>
-  EIGEN_DEVICE_FUNC inline const TransformTimeDiagonalReturnType
-    operator * (const DiagonalBase<DiagonalDerived> &b) const
-  {
+   *
+   * The rhs diagonal matrix is interpreted as an affine scaling transformation. The
+   * product results in a Transform of the same type (mode) as the lhs only if the lhs
+   * mode is no isometry. In that case, the returned transform is an affinity.
+   */
+  template <typename DiagonalDerived>
+  EIGEN_DEVICE_FUNC inline const TransformTimeDiagonalReturnType operator*(
+      const DiagonalBase<DiagonalDerived>& b) const {
     TransformTimeDiagonalReturnType res(*this);
     res.linearExt() *= b;
     return res;
   }
 
   /** \returns The product expression of a diagonal matrix \a a times a transform \a b
-    *
-    * The lhs diagonal matrix is interpreted as an affine scaling transformation. The
-    * product results in a Transform of the same type (mode) as the lhs only if the lhs
-    * mode is no isometry. In that case, the returned transform is an affinity.
-    */
-  template<typename DiagonalDerived>
-  EIGEN_DEVICE_FUNC friend inline TransformTimeDiagonalReturnType
-    operator * (const DiagonalBase<DiagonalDerived> &a, const Transform &b)
-  {
+   *
+   * The lhs diagonal matrix is interpreted as an affine scaling transformation. The
+   * product results in a Transform of the same type (mode) as the lhs only if the lhs
+   * mode is no isometry. In that case, the returned transform is an affinity.
+   */
+  template <typename DiagonalDerived>
+  EIGEN_DEVICE_FUNC friend inline TransformTimeDiagonalReturnType operator*(const DiagonalBase<DiagonalDerived>& a,
+                                                                            const Transform& b) {
     TransformTimeDiagonalReturnType res;
-    res.linear().noalias() = a*b.linear();
-    res.translation().noalias() = a*b.translation();
-    if (EIGEN_CONST_CONDITIONAL(Mode!=int(AffineCompact)))
-      res.matrix().row(Dim) = b.matrix().row(Dim);
+    res.linear().noalias() = a * b.linear();
+    res.translation().noalias() = a * b.translation();
+    if (EIGEN_CONST_CONDITIONAL(Mode != int(AffineCompact))) res.matrix().row(Dim) = b.matrix().row(Dim);
     return res;
   }
 
-  template<typename OtherDerived>
-  EIGEN_DEVICE_FUNC inline Transform& operator*=(const EigenBase<OtherDerived>& other) { return *this = *this * other; }
-
-  /** Concatenates two transformations */
-  EIGEN_DEVICE_FUNC inline const Transform operator * (const Transform& other) const
-  {
-    return internal::transform_transform_product_impl<Transform,Transform>::run(*this,other);
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC inline Transform& operator*=(const EigenBase<OtherDerived>& other) {
+    return *this = *this * other;
   }
 
-  #if EIGEN_COMP_ICC
-private:
+  /** Concatenates two transformations */
+  EIGEN_DEVICE_FUNC inline const Transform operator*(const Transform& other) const {
+    return internal::transform_transform_product_impl<Transform, Transform>::run(*this, other);
+  }
+
+#if EIGEN_COMP_ICC
+ private:
   // this intermediate structure permits to workaround a bug in ICC 11:
   //   error: template instantiation resulted in unexpected function type of "Eigen::Transform<double, 3, 32, 0>
   //             (const Eigen::Transform<double, 3, 2, 0> &) const"
   //  (the meaning of a name may have changed since the template declaration -- the type of the template is:
   // "Eigen::internal::transform_transform_product_impl<Eigen::Transform<double, 3, 32, 0>,
-  //     Eigen::Transform<double, 3, Mode, Options>, <expression>>::ResultType (const Eigen::Transform<double, 3, Mode, Options> &) const")
+  //     Eigen::Transform<double, 3, Mode, Options>, <expression>>::ResultType (const Eigen::Transform<double, 3, Mode,
+  //     Options> &) const")
   //
-  template<int OtherMode,int OtherOptions> struct icc_11_workaround
-  {
-    typedef internal::transform_transform_product_impl<Transform,Transform<Scalar,Dim,OtherMode,OtherOptions> > ProductType;
+  template <int OtherMode, int OtherOptions>
+  struct icc_11_workaround {
+    typedef internal::transform_transform_product_impl<Transform, Transform<Scalar, Dim, OtherMode, OtherOptions> >
+        ProductType;
     typedef typename ProductType::ResultType ResultType;
   };
 
-public:
+ public:
   /** Concatenates two different transformations */
-  template<int OtherMode,int OtherOptions>
-  inline typename icc_11_workaround<OtherMode,OtherOptions>::ResultType
-    operator * (const Transform<Scalar,Dim,OtherMode,OtherOptions>& other) const
-  {
-    typedef typename icc_11_workaround<OtherMode,OtherOptions>::ProductType ProductType;
-    return ProductType::run(*this,other);
+  template <int OtherMode, int OtherOptions>
+  inline typename icc_11_workaround<OtherMode, OtherOptions>::ResultType operator*(
+      const Transform<Scalar, Dim, OtherMode, OtherOptions>& other) const {
+    typedef typename icc_11_workaround<OtherMode, OtherOptions>::ProductType ProductType;
+    return ProductType::run(*this, other);
   }
-  #else
+#else
   /** Concatenates two different transformations */
-  template<int OtherMode,int OtherOptions>
-  EIGEN_DEVICE_FUNC inline typename internal::transform_transform_product_impl<Transform,Transform<Scalar,Dim,OtherMode,OtherOptions> >::ResultType
-    operator * (const Transform<Scalar,Dim,OtherMode,OtherOptions>& other) const
-  {
-    return internal::transform_transform_product_impl<Transform,Transform<Scalar,Dim,OtherMode,OtherOptions> >::run(*this,other);
+  template <int OtherMode, int OtherOptions>
+  EIGEN_DEVICE_FUNC inline
+      typename internal::transform_transform_product_impl<Transform,
+                                                          Transform<Scalar, Dim, OtherMode, OtherOptions> >::ResultType
+      operator*(const Transform<Scalar, Dim, OtherMode, OtherOptions>& other) const {
+    return internal::transform_transform_product_impl<Transform, Transform<Scalar, Dim, OtherMode, OtherOptions> >::run(
+        *this, other);
   }
-  #endif
+#endif
 
   /** \sa MatrixBase::setIdentity() */
   EIGEN_DEVICE_FUNC void setIdentity() { m_matrix.setIdentity(); }
@@ -535,89 +516,76 @@
    * \brief Returns an identity transformation.
    * \todo In the future this function should be returning a Transform expression.
    */
-  EIGEN_DEVICE_FUNC static const Transform Identity()
-  {
-    return Transform(MatrixType::Identity());
-  }
+  EIGEN_DEVICE_FUNC static const Transform Identity() { return Transform(MatrixType::Identity()); }
 
-  template<typename OtherDerived>
-  EIGEN_DEVICE_FUNC
-  inline Transform& scale(const MatrixBase<OtherDerived> &other);
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC inline Transform& scale(const MatrixBase<OtherDerived>& other);
 
-  template<typename OtherDerived>
-  EIGEN_DEVICE_FUNC
-  inline Transform& prescale(const MatrixBase<OtherDerived> &other);
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC inline Transform& prescale(const MatrixBase<OtherDerived>& other);
 
   EIGEN_DEVICE_FUNC inline Transform& scale(const Scalar& s);
   EIGEN_DEVICE_FUNC inline Transform& prescale(const Scalar& s);
 
-  template<typename OtherDerived>
-  EIGEN_DEVICE_FUNC
-  inline Transform& translate(const MatrixBase<OtherDerived> &other);
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC inline Transform& translate(const MatrixBase<OtherDerived>& other);
 
-  template<typename OtherDerived>
-  EIGEN_DEVICE_FUNC
-  inline Transform& pretranslate(const MatrixBase<OtherDerived> &other);
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC inline Transform& pretranslate(const MatrixBase<OtherDerived>& other);
 
-  template<typename RotationType>
-  EIGEN_DEVICE_FUNC
-  inline Transform& rotate(const RotationType& rotation);
+  template <typename RotationType>
+  EIGEN_DEVICE_FUNC inline Transform& rotate(const RotationType& rotation);
 
-  template<typename RotationType>
-  EIGEN_DEVICE_FUNC
-  inline Transform& prerotate(const RotationType& rotation);
+  template <typename RotationType>
+  EIGEN_DEVICE_FUNC inline Transform& prerotate(const RotationType& rotation);
 
   EIGEN_DEVICE_FUNC Transform& shear(const Scalar& sx, const Scalar& sy);
   EIGEN_DEVICE_FUNC Transform& preshear(const Scalar& sx, const Scalar& sy);
 
   EIGEN_DEVICE_FUNC inline Transform& operator=(const TranslationType& t);
 
-  EIGEN_DEVICE_FUNC
-  inline Transform& operator*=(const TranslationType& t) { return translate(t.vector()); }
+  EIGEN_DEVICE_FUNC inline Transform& operator*=(const TranslationType& t) { return translate(t.vector()); }
 
   EIGEN_DEVICE_FUNC inline Transform operator*(const TranslationType& t) const;
 
-  EIGEN_DEVICE_FUNC
-  inline Transform& operator=(const UniformScaling<Scalar>& t);
+  EIGEN_DEVICE_FUNC inline Transform& operator=(const UniformScaling<Scalar>& t);
 
-  EIGEN_DEVICE_FUNC
-  inline Transform& operator*=(const UniformScaling<Scalar>& s) { return scale(s.factor()); }
+  EIGEN_DEVICE_FUNC inline Transform& operator*=(const UniformScaling<Scalar>& s) { return scale(s.factor()); }
 
-  EIGEN_DEVICE_FUNC
-  inline TransformTimeDiagonalReturnType operator*(const UniformScaling<Scalar>& s) const
-  {
+  EIGEN_DEVICE_FUNC inline TransformTimeDiagonalReturnType operator*(const UniformScaling<Scalar>& s) const {
     TransformTimeDiagonalReturnType res = *this;
     res.scale(s.factor());
     return res;
   }
 
-  EIGEN_DEVICE_FUNC
-  inline Transform& operator*=(const DiagonalMatrix<Scalar,Dim>& s) { linearExt() *= s; return *this; }
+  EIGEN_DEVICE_FUNC inline Transform& operator*=(const DiagonalMatrix<Scalar, Dim>& s) {
+    linearExt() *= s;
+    return *this;
+  }
 
-  template<typename Derived>
-  EIGEN_DEVICE_FUNC inline Transform& operator=(const RotationBase<Derived,Dim>& r);
-  template<typename Derived>
-  EIGEN_DEVICE_FUNC inline Transform& operator*=(const RotationBase<Derived,Dim>& r) { return rotate(r.toRotationMatrix()); }
-  template<typename Derived>
-  EIGEN_DEVICE_FUNC inline Transform operator*(const RotationBase<Derived,Dim>& r) const;
+  template <typename Derived>
+  EIGEN_DEVICE_FUNC inline Transform& operator=(const RotationBase<Derived, Dim>& r);
+  template <typename Derived>
+  EIGEN_DEVICE_FUNC inline Transform& operator*=(const RotationBase<Derived, Dim>& r) {
+    return rotate(r.toRotationMatrix());
+  }
+  template <typename Derived>
+  EIGEN_DEVICE_FUNC inline Transform operator*(const RotationBase<Derived, Dim>& r) const;
 
-  typedef std::conditional_t<int(Mode)==Isometry,ConstLinearPart,const LinearMatrixType> RotationReturnType;
+  typedef std::conditional_t<int(Mode) == Isometry, ConstLinearPart, const LinearMatrixType> RotationReturnType;
   EIGEN_DEVICE_FUNC RotationReturnType rotation() const;
 
-  template<typename RotationMatrixType, typename ScalingMatrixType>
-  EIGEN_DEVICE_FUNC
-  void computeRotationScaling(RotationMatrixType *rotation, ScalingMatrixType *scaling) const;
-  template<typename ScalingMatrixType, typename RotationMatrixType>
-  EIGEN_DEVICE_FUNC
-  void computeScalingRotation(ScalingMatrixType *scaling, RotationMatrixType *rotation) const;
+  template <typename RotationMatrixType, typename ScalingMatrixType>
+  EIGEN_DEVICE_FUNC void computeRotationScaling(RotationMatrixType* rotation, ScalingMatrixType* scaling) const;
+  template <typename ScalingMatrixType, typename RotationMatrixType>
+  EIGEN_DEVICE_FUNC void computeScalingRotation(ScalingMatrixType* scaling, RotationMatrixType* rotation) const;
 
-  template<typename PositionDerived, typename OrientationType, typename ScaleDerived>
-  EIGEN_DEVICE_FUNC
-  Transform& fromPositionOrientationScale(const MatrixBase<PositionDerived> &position,
-    const OrientationType& orientation, const MatrixBase<ScaleDerived> &scale);
+  template <typename PositionDerived, typename OrientationType, typename ScaleDerived>
+  EIGEN_DEVICE_FUNC Transform& fromPositionOrientationScale(const MatrixBase<PositionDerived>& position,
+                                                            const OrientationType& orientation,
+                                                            const MatrixBase<ScaleDerived>& scale);
 
-  EIGEN_DEVICE_FUNC
-  inline Transform inverse(TransformTraits traits = (TransformTraits)Mode) const;
+  EIGEN_DEVICE_FUNC inline Transform inverse(TransformTraits traits = (TransformTraits)Mode) const;
 
   /** \returns a const pointer to the column major internal matrix */
   EIGEN_DEVICE_FUNC const Scalar* data() const { return m_matrix.data(); }
@@ -625,112 +593,115 @@
   EIGEN_DEVICE_FUNC Scalar* data() { return m_matrix.data(); }
 
   /** \returns \c *this with scalar type casted to \a NewScalarType
-    *
-    * Note that if \a NewScalarType is equal to the current scalar type of \c *this
-    * then this function smartly returns a const reference to \c *this.
-    */
-  template<typename NewScalarType>
-  EIGEN_DEVICE_FUNC inline typename internal::cast_return_type<Transform,Transform<NewScalarType,Dim,Mode,Options> >::type cast() const
-  { return typename internal::cast_return_type<Transform,Transform<NewScalarType,Dim,Mode,Options> >::type(*this); }
+   *
+   * Note that if \a NewScalarType is equal to the current scalar type of \c *this
+   * then this function smartly returns a const reference to \c *this.
+   */
+  template <typename NewScalarType>
+  EIGEN_DEVICE_FUNC inline
+      typename internal::cast_return_type<Transform, Transform<NewScalarType, Dim, Mode, Options> >::type
+      cast() const {
+    return typename internal::cast_return_type<Transform, Transform<NewScalarType, Dim, Mode, Options> >::type(*this);
+  }
 
   /** Copy constructor with scalar type conversion */
-  template<typename OtherScalarType>
-  EIGEN_DEVICE_FUNC inline explicit Transform(const Transform<OtherScalarType,Dim,Mode,Options>& other)
-  {
+  template <typename OtherScalarType>
+  EIGEN_DEVICE_FUNC inline explicit Transform(const Transform<OtherScalarType, Dim, Mode, Options>& other) {
     check_template_params();
     m_matrix = other.matrix().template cast<Scalar>();
   }
 
   /** \returns \c true if \c *this is approximately equal to \a other, within the precision
-    * determined by \a prec.
-    *
-    * \sa MatrixBase::isApprox() */
-  EIGEN_DEVICE_FUNC bool isApprox(const Transform& other, const typename NumTraits<Scalar>::Real& prec = NumTraits<Scalar>::dummy_precision()) const
-  { return m_matrix.isApprox(other.m_matrix, prec); }
+   * determined by \a prec.
+   *
+   * \sa MatrixBase::isApprox() */
+  EIGEN_DEVICE_FUNC bool isApprox(const Transform& other, const typename NumTraits<Scalar>::Real& prec =
+                                                              NumTraits<Scalar>::dummy_precision()) const {
+    return m_matrix.isApprox(other.m_matrix, prec);
+  }
 
   /** Sets the last row to [0 ... 0 1]
-    */
-  EIGEN_DEVICE_FUNC void makeAffine()
-  {
-    internal::transform_make_affine<int(Mode)>::run(m_matrix);
+   */
+  EIGEN_DEVICE_FUNC void makeAffine() { internal::transform_make_affine<int(Mode)>::run(m_matrix); }
+
+  /** \internal
+   * \returns the Dim x Dim linear part if the transformation is affine,
+   *          and the HDim x Dim part for projective transformations.
+   */
+  EIGEN_DEVICE_FUNC inline Block<MatrixType, int(Mode) == int(Projective) ? HDim : Dim, Dim> linearExt() {
+    return m_matrix.template block < int(Mode) == int(Projective) ? HDim : Dim, Dim > (0, 0);
+  }
+  /** \internal
+   * \returns the Dim x Dim linear part if the transformation is affine,
+   *          and the HDim x Dim part for projective transformations.
+   */
+  EIGEN_DEVICE_FUNC inline const Block<MatrixType, int(Mode) == int(Projective) ? HDim : Dim, Dim> linearExt() const {
+    return m_matrix.template block < int(Mode) == int(Projective) ? HDim : Dim, Dim > (0, 0);
   }
 
   /** \internal
-    * \returns the Dim x Dim linear part if the transformation is affine,
-    *          and the HDim x Dim part for projective transformations.
-    */
-  EIGEN_DEVICE_FUNC inline Block<MatrixType,int(Mode)==int(Projective)?HDim:Dim,Dim> linearExt()
-  { return m_matrix.template block<int(Mode)==int(Projective)?HDim:Dim,Dim>(0,0); }
+   * \returns the translation part if the transformation is affine,
+   *          and the last column for projective transformations.
+   */
+  EIGEN_DEVICE_FUNC inline Block<MatrixType, int(Mode) == int(Projective) ? HDim : Dim, 1> translationExt() {
+    return m_matrix.template block < int(Mode) == int(Projective) ? HDim : Dim, 1 > (0, Dim);
+  }
   /** \internal
-    * \returns the Dim x Dim linear part if the transformation is affine,
-    *          and the HDim x Dim part for projective transformations.
-    */
-  EIGEN_DEVICE_FUNC inline const Block<MatrixType,int(Mode)==int(Projective)?HDim:Dim,Dim> linearExt() const
-  { return m_matrix.template block<int(Mode)==int(Projective)?HDim:Dim,Dim>(0,0); }
+   * \returns the translation part if the transformation is affine,
+   *          and the last column for projective transformations.
+   */
+  EIGEN_DEVICE_FUNC inline const Block<MatrixType, int(Mode) == int(Projective) ? HDim : Dim, 1> translationExt()
+      const {
+    return m_matrix.template block < int(Mode) == int(Projective) ? HDim : Dim, 1 > (0, Dim);
+  }
 
-  /** \internal
-    * \returns the translation part if the transformation is affine,
-    *          and the last column for projective transformations.
-    */
-  EIGEN_DEVICE_FUNC inline Block<MatrixType,int(Mode)==int(Projective)?HDim:Dim,1> translationExt()
-  { return m_matrix.template block<int(Mode)==int(Projective)?HDim:Dim,1>(0,Dim); }
-  /** \internal
-    * \returns the translation part if the transformation is affine,
-    *          and the last column for projective transformations.
-    */
-  EIGEN_DEVICE_FUNC inline const Block<MatrixType,int(Mode)==int(Projective)?HDim:Dim,1> translationExt() const
-  { return m_matrix.template block<int(Mode)==int(Projective)?HDim:Dim,1>(0,Dim); }
+#ifdef EIGEN_TRANSFORM_PLUGIN
+#include EIGEN_TRANSFORM_PLUGIN
+#endif
 
-
-  #ifdef EIGEN_TRANSFORM_PLUGIN
-  #include EIGEN_TRANSFORM_PLUGIN
-  #endif
-
-protected:
-  #ifndef EIGEN_PARSED_BY_DOXYGEN
-    EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void check_template_params()
-    {
-      EIGEN_STATIC_ASSERT((Options & (DontAlign|RowMajor)) == Options, INVALID_MATRIX_TEMPLATE_PARAMETERS)
-    }
-  #endif
-
+ protected:
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void check_template_params() {
+    EIGEN_STATIC_ASSERT((Options & (DontAlign | RowMajor)) == Options, INVALID_MATRIX_TEMPLATE_PARAMETERS)
+  }
+#endif
 };
 
 /** \ingroup Geometry_Module */
-typedef Transform<float,2,Isometry> Isometry2f;
+typedef Transform<float, 2, Isometry> Isometry2f;
 /** \ingroup Geometry_Module */
-typedef Transform<float,3,Isometry> Isometry3f;
+typedef Transform<float, 3, Isometry> Isometry3f;
 /** \ingroup Geometry_Module */
-typedef Transform<double,2,Isometry> Isometry2d;
+typedef Transform<double, 2, Isometry> Isometry2d;
 /** \ingroup Geometry_Module */
-typedef Transform<double,3,Isometry> Isometry3d;
+typedef Transform<double, 3, Isometry> Isometry3d;
 
 /** \ingroup Geometry_Module */
-typedef Transform<float,2,Affine> Affine2f;
+typedef Transform<float, 2, Affine> Affine2f;
 /** \ingroup Geometry_Module */
-typedef Transform<float,3,Affine> Affine3f;
+typedef Transform<float, 3, Affine> Affine3f;
 /** \ingroup Geometry_Module */
-typedef Transform<double,2,Affine> Affine2d;
+typedef Transform<double, 2, Affine> Affine2d;
 /** \ingroup Geometry_Module */
-typedef Transform<double,3,Affine> Affine3d;
+typedef Transform<double, 3, Affine> Affine3d;
 
 /** \ingroup Geometry_Module */
-typedef Transform<float,2,AffineCompact> AffineCompact2f;
+typedef Transform<float, 2, AffineCompact> AffineCompact2f;
 /** \ingroup Geometry_Module */
-typedef Transform<float,3,AffineCompact> AffineCompact3f;
+typedef Transform<float, 3, AffineCompact> AffineCompact3f;
 /** \ingroup Geometry_Module */
-typedef Transform<double,2,AffineCompact> AffineCompact2d;
+typedef Transform<double, 2, AffineCompact> AffineCompact2d;
 /** \ingroup Geometry_Module */
-typedef Transform<double,3,AffineCompact> AffineCompact3d;
+typedef Transform<double, 3, AffineCompact> AffineCompact3d;
 
 /** \ingroup Geometry_Module */
-typedef Transform<float,2,Projective> Projective2f;
+typedef Transform<float, 2, Projective> Projective2f;
 /** \ingroup Geometry_Module */
-typedef Transform<float,3,Projective> Projective3f;
+typedef Transform<float, 3, Projective> Projective3f;
 /** \ingroup Geometry_Module */
-typedef Transform<double,2,Projective> Projective2d;
+typedef Transform<double, 2, Projective> Projective2d;
 /** \ingroup Geometry_Module */
-typedef Transform<double,3,Projective> Projective3d;
+typedef Transform<double, 3, Projective> Projective3d;
 
 /**************************
 *** Optional QT support ***
@@ -740,97 +711,84 @@
 
 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
 /** Initializes \c *this from a QMatrix assuming the dimension is 2.
-  *
-  * This function is available only if the token EIGEN_QT_SUPPORT is defined.
-  */
-template<typename Scalar, int Dim, int Mode,int Options>
-Transform<Scalar,Dim,Mode,Options>::Transform(const QMatrix& other)
-{
+ *
+ * This function is available only if the token EIGEN_QT_SUPPORT is defined.
+ */
+template <typename Scalar, int Dim, int Mode, int Options>
+Transform<Scalar, Dim, Mode, Options>::Transform(const QMatrix& other) {
   check_template_params();
   *this = other;
 }
 
 /** Set \c *this from a QMatrix assuming the dimension is 2.
-  *
-  * This function is available only if the token EIGEN_QT_SUPPORT is defined.
-  */
-template<typename Scalar, int Dim, int Mode,int Options>
-Transform<Scalar,Dim,Mode,Options>& Transform<Scalar,Dim,Mode,Options>::operator=(const QMatrix& other)
-{
-  EIGEN_STATIC_ASSERT(Dim==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
+ *
+ * This function is available only if the token EIGEN_QT_SUPPORT is defined.
+ */
+template <typename Scalar, int Dim, int Mode, int Options>
+Transform<Scalar, Dim, Mode, Options>& Transform<Scalar, Dim, Mode, Options>::operator=(const QMatrix& other) {
+  EIGEN_STATIC_ASSERT(Dim == 2, YOU_MADE_A_PROGRAMMING_MISTAKE)
   if (EIGEN_CONST_CONDITIONAL(Mode == int(AffineCompact)))
-    m_matrix << other.m11(), other.m21(), other.dx(),
-                other.m12(), other.m22(), other.dy();
+    m_matrix << other.m11(), other.m21(), other.dx(), other.m12(), other.m22(), other.dy();
   else
-    m_matrix << other.m11(), other.m21(), other.dx(),
-                other.m12(), other.m22(), other.dy(),
-                0, 0, 1;
+    m_matrix << other.m11(), other.m21(), other.dx(), other.m12(), other.m22(), other.dy(), 0, 0, 1;
   return *this;
 }
 
 /** \returns a QMatrix from \c *this assuming the dimension is 2.
-  *
-  * \warning this conversion might loss data if \c *this is not affine
-  *
-  * This function is available only if the token EIGEN_QT_SUPPORT is defined.
-  */
-template<typename Scalar, int Dim, int Mode, int Options>
-QMatrix Transform<Scalar,Dim,Mode,Options>::toQMatrix(void) const
-{
+ *
+ * \warning this conversion might loss data if \c *this is not affine
+ *
+ * This function is available only if the token EIGEN_QT_SUPPORT is defined.
+ */
+template <typename Scalar, int Dim, int Mode, int Options>
+QMatrix Transform<Scalar, Dim, Mode, Options>::toQMatrix(void) const {
   check_template_params();
-  EIGEN_STATIC_ASSERT(Dim==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
-  return QMatrix(m_matrix.coeff(0,0), m_matrix.coeff(1,0),
-                 m_matrix.coeff(0,1), m_matrix.coeff(1,1),
-                 m_matrix.coeff(0,2), m_matrix.coeff(1,2));
+  EIGEN_STATIC_ASSERT(Dim == 2, YOU_MADE_A_PROGRAMMING_MISTAKE)
+  return QMatrix(m_matrix.coeff(0, 0), m_matrix.coeff(1, 0), m_matrix.coeff(0, 1), m_matrix.coeff(1, 1),
+                 m_matrix.coeff(0, 2), m_matrix.coeff(1, 2));
 }
 #endif
 
 /** Initializes \c *this from a QTransform assuming the dimension is 2.
-  *
-  * This function is available only if the token EIGEN_QT_SUPPORT is defined.
-  */
-template<typename Scalar, int Dim, int Mode,int Options>
-Transform<Scalar,Dim,Mode,Options>::Transform(const QTransform& other)
-{
+ *
+ * This function is available only if the token EIGEN_QT_SUPPORT is defined.
+ */
+template <typename Scalar, int Dim, int Mode, int Options>
+Transform<Scalar, Dim, Mode, Options>::Transform(const QTransform& other) {
   check_template_params();
   *this = other;
 }
 
 /** Set \c *this from a QTransform assuming the dimension is 2.
-  *
-  * This function is available only if the token EIGEN_QT_SUPPORT is defined.
-  */
-template<typename Scalar, int Dim, int Mode, int Options>
-Transform<Scalar,Dim,Mode,Options>& Transform<Scalar,Dim,Mode,Options>::operator=(const QTransform& other)
-{
+ *
+ * This function is available only if the token EIGEN_QT_SUPPORT is defined.
+ */
+template <typename Scalar, int Dim, int Mode, int Options>
+Transform<Scalar, Dim, Mode, Options>& Transform<Scalar, Dim, Mode, Options>::operator=(const QTransform& other) {
   check_template_params();
-  EIGEN_STATIC_ASSERT(Dim==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
+  EIGEN_STATIC_ASSERT(Dim == 2, YOU_MADE_A_PROGRAMMING_MISTAKE)
   if (EIGEN_CONST_CONDITIONAL(Mode == int(AffineCompact)))
-    m_matrix << other.m11(), other.m21(), other.dx(),
-                other.m12(), other.m22(), other.dy();
+    m_matrix << other.m11(), other.m21(), other.dx(), other.m12(), other.m22(), other.dy();
   else
-    m_matrix << other.m11(), other.m21(), other.dx(),
-                other.m12(), other.m22(), other.dy(),
-                other.m13(), other.m23(), other.m33();
+    m_matrix << other.m11(), other.m21(), other.dx(), other.m12(), other.m22(), other.dy(), other.m13(), other.m23(),
+        other.m33();
   return *this;
 }
 
 /** \returns a QTransform from \c *this assuming the dimension is 2.
-  *
-  * This function is available only if the token EIGEN_QT_SUPPORT is defined.
-  */
-template<typename Scalar, int Dim, int Mode, int Options>
-QTransform Transform<Scalar,Dim,Mode,Options>::toQTransform(void) const
-{
-  EIGEN_STATIC_ASSERT(Dim==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
+ *
+ * This function is available only if the token EIGEN_QT_SUPPORT is defined.
+ */
+template <typename Scalar, int Dim, int Mode, int Options>
+QTransform Transform<Scalar, Dim, Mode, Options>::toQTransform(void) const {
+  EIGEN_STATIC_ASSERT(Dim == 2, YOU_MADE_A_PROGRAMMING_MISTAKE)
   if (EIGEN_CONST_CONDITIONAL(Mode == int(AffineCompact)))
-    return QTransform(m_matrix.coeff(0,0), m_matrix.coeff(1,0),
-                      m_matrix.coeff(0,1), m_matrix.coeff(1,1),
-                      m_matrix.coeff(0,2), m_matrix.coeff(1,2));
+    return QTransform(m_matrix.coeff(0, 0), m_matrix.coeff(1, 0), m_matrix.coeff(0, 1), m_matrix.coeff(1, 1),
+                      m_matrix.coeff(0, 2), m_matrix.coeff(1, 2));
   else
-    return QTransform(m_matrix.coeff(0,0), m_matrix.coeff(1,0), m_matrix.coeff(2,0),
-                      m_matrix.coeff(0,1), m_matrix.coeff(1,1), m_matrix.coeff(2,1),
-                      m_matrix.coeff(0,2), m_matrix.coeff(1,2), m_matrix.coeff(2,2));
+    return QTransform(m_matrix.coeff(0, 0), m_matrix.coeff(1, 0), m_matrix.coeff(2, 0), m_matrix.coeff(0, 1),
+                      m_matrix.coeff(1, 1), m_matrix.coeff(2, 1), m_matrix.coeff(0, 2), m_matrix.coeff(1, 2),
+                      m_matrix.coeff(2, 2));
 }
 #endif
 
@@ -839,84 +797,80 @@
 *********************/
 
 /** Applies on the right the non uniform scale transformation represented
-  * by the vector \a other to \c *this and returns a reference to \c *this.
-  * \sa prescale()
-  */
-template<typename Scalar, int Dim, int Mode, int Options>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC Transform<Scalar,Dim,Mode,Options>&
-Transform<Scalar,Dim,Mode,Options>::scale(const MatrixBase<OtherDerived> &other)
-{
-  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,int(Dim))
-  EIGEN_STATIC_ASSERT(Mode!=int(Isometry), THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS)
+ * by the vector \a other to \c *this and returns a reference to \c *this.
+ * \sa prescale()
+ */
+template <typename Scalar, int Dim, int Mode, int Options>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC Transform<Scalar, Dim, Mode, Options>& Transform<Scalar, Dim, Mode, Options>::scale(
+    const MatrixBase<OtherDerived>& other) {
+  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived, int(Dim))
+  EIGEN_STATIC_ASSERT(Mode != int(Isometry), THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS)
   linearExt().noalias() = (linearExt() * other.asDiagonal());
   return *this;
 }
 
 /** Applies on the right a uniform scale of a factor \a c to \c *this
-  * and returns a reference to \c *this.
-  * \sa prescale(Scalar)
-  */
-template<typename Scalar, int Dim, int Mode, int Options>
-EIGEN_DEVICE_FUNC inline Transform<Scalar,Dim,Mode,Options>& Transform<Scalar,Dim,Mode,Options>::scale(const Scalar& s)
-{
-  EIGEN_STATIC_ASSERT(Mode!=int(Isometry), THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS)
+ * and returns a reference to \c *this.
+ * \sa prescale(Scalar)
+ */
+template <typename Scalar, int Dim, int Mode, int Options>
+EIGEN_DEVICE_FUNC inline Transform<Scalar, Dim, Mode, Options>& Transform<Scalar, Dim, Mode, Options>::scale(
+    const Scalar& s) {
+  EIGEN_STATIC_ASSERT(Mode != int(Isometry), THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS)
   linearExt() *= s;
   return *this;
 }
 
 /** Applies on the left the non uniform scale transformation represented
-  * by the vector \a other to \c *this and returns a reference to \c *this.
-  * \sa scale()
-  */
-template<typename Scalar, int Dim, int Mode, int Options>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC Transform<Scalar,Dim,Mode,Options>&
-Transform<Scalar,Dim,Mode,Options>::prescale(const MatrixBase<OtherDerived> &other)
-{
-  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,int(Dim))
-  EIGEN_STATIC_ASSERT(Mode!=int(Isometry), THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS)
+ * by the vector \a other to \c *this and returns a reference to \c *this.
+ * \sa scale()
+ */
+template <typename Scalar, int Dim, int Mode, int Options>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC Transform<Scalar, Dim, Mode, Options>& Transform<Scalar, Dim, Mode, Options>::prescale(
+    const MatrixBase<OtherDerived>& other) {
+  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived, int(Dim))
+  EIGEN_STATIC_ASSERT(Mode != int(Isometry), THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS)
   affine().noalias() = (other.asDiagonal() * affine());
   return *this;
 }
 
 /** Applies on the left a uniform scale of a factor \a c to \c *this
-  * and returns a reference to \c *this.
-  * \sa scale(Scalar)
-  */
-template<typename Scalar, int Dim, int Mode, int Options>
-EIGEN_DEVICE_FUNC inline Transform<Scalar,Dim,Mode,Options>& Transform<Scalar,Dim,Mode,Options>::prescale(const Scalar& s)
-{
-  EIGEN_STATIC_ASSERT(Mode!=int(Isometry), THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS)
+ * and returns a reference to \c *this.
+ * \sa scale(Scalar)
+ */
+template <typename Scalar, int Dim, int Mode, int Options>
+EIGEN_DEVICE_FUNC inline Transform<Scalar, Dim, Mode, Options>& Transform<Scalar, Dim, Mode, Options>::prescale(
+    const Scalar& s) {
+  EIGEN_STATIC_ASSERT(Mode != int(Isometry), THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS)
   m_matrix.template topRows<Dim>() *= s;
   return *this;
 }
 
 /** Applies on the right the translation matrix represented by the vector \a other
-  * to \c *this and returns a reference to \c *this.
-  * \sa pretranslate()
-  */
-template<typename Scalar, int Dim, int Mode, int Options>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC Transform<Scalar,Dim,Mode,Options>&
-Transform<Scalar,Dim,Mode,Options>::translate(const MatrixBase<OtherDerived> &other)
-{
-  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,int(Dim))
+ * to \c *this and returns a reference to \c *this.
+ * \sa pretranslate()
+ */
+template <typename Scalar, int Dim, int Mode, int Options>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC Transform<Scalar, Dim, Mode, Options>& Transform<Scalar, Dim, Mode, Options>::translate(
+    const MatrixBase<OtherDerived>& other) {
+  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived, int(Dim))
   translationExt() += linearExt() * other;
   return *this;
 }
 
 /** Applies on the left the translation matrix represented by the vector \a other
-  * to \c *this and returns a reference to \c *this.
-  * \sa translate()
-  */
-template<typename Scalar, int Dim, int Mode, int Options>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC Transform<Scalar,Dim,Mode,Options>&
-Transform<Scalar,Dim,Mode,Options>::pretranslate(const MatrixBase<OtherDerived> &other)
-{
-  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,int(Dim))
-  if(EIGEN_CONST_CONDITIONAL(int(Mode)==int(Projective)))
+ * to \c *this and returns a reference to \c *this.
+ * \sa translate()
+ */
+template <typename Scalar, int Dim, int Mode, int Options>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC Transform<Scalar, Dim, Mode, Options>& Transform<Scalar, Dim, Mode, Options>::pretranslate(
+    const MatrixBase<OtherDerived>& other) {
+  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived, int(Dim))
+  if (EIGEN_CONST_CONDITIONAL(int(Mode) == int(Projective)))
     affine() += other * m_matrix.row(Dim);
   else
     translation() += other;
@@ -924,76 +878,72 @@
 }
 
 /** Applies on the right the rotation represented by the rotation \a rotation
-  * to \c *this and returns a reference to \c *this.
-  *
-  * The template parameter \a RotationType is the type of the rotation which
-  * must be known by internal::toRotationMatrix<>.
-  *
-  * Natively supported types includes:
-  *   - any scalar (2D),
-  *   - a Dim x Dim matrix expression,
-  *   - a Quaternion (3D),
-  *   - a AngleAxis (3D)
-  *
-  * This mechanism is easily extendable to support user types such as Euler angles,
-  * or a pair of Quaternion for 4D rotations.
-  *
-  * \sa rotate(Scalar), class Quaternion, class AngleAxis, prerotate(RotationType)
-  */
-template<typename Scalar, int Dim, int Mode, int Options>
-template<typename RotationType>
-EIGEN_DEVICE_FUNC Transform<Scalar,Dim,Mode,Options>&
-Transform<Scalar,Dim,Mode,Options>::rotate(const RotationType& rotation)
-{
-  linearExt() *= internal::toRotationMatrix<Scalar,Dim>(rotation);
+ * to \c *this and returns a reference to \c *this.
+ *
+ * The template parameter \a RotationType is the type of the rotation which
+ * must be known by internal::toRotationMatrix<>.
+ *
+ * Natively supported types includes:
+ *   - any scalar (2D),
+ *   - a Dim x Dim matrix expression,
+ *   - a Quaternion (3D),
+ *   - a AngleAxis (3D)
+ *
+ * This mechanism is easily extendable to support user types such as Euler angles,
+ * or a pair of Quaternion for 4D rotations.
+ *
+ * \sa rotate(Scalar), class Quaternion, class AngleAxis, prerotate(RotationType)
+ */
+template <typename Scalar, int Dim, int Mode, int Options>
+template <typename RotationType>
+EIGEN_DEVICE_FUNC Transform<Scalar, Dim, Mode, Options>& Transform<Scalar, Dim, Mode, Options>::rotate(
+    const RotationType& rotation) {
+  linearExt() *= internal::toRotationMatrix<Scalar, Dim>(rotation);
   return *this;
 }
 
 /** Applies on the left the rotation represented by the rotation \a rotation
-  * to \c *this and returns a reference to \c *this.
-  *
-  * See rotate() for further details.
-  *
-  * \sa rotate()
-  */
-template<typename Scalar, int Dim, int Mode, int Options>
-template<typename RotationType>
-EIGEN_DEVICE_FUNC Transform<Scalar,Dim,Mode,Options>&
-Transform<Scalar,Dim,Mode,Options>::prerotate(const RotationType& rotation)
-{
-  m_matrix.template block<Dim,HDim>(0,0) = internal::toRotationMatrix<Scalar,Dim>(rotation)
-                                         * m_matrix.template block<Dim,HDim>(0,0);
+ * to \c *this and returns a reference to \c *this.
+ *
+ * See rotate() for further details.
+ *
+ * \sa rotate()
+ */
+template <typename Scalar, int Dim, int Mode, int Options>
+template <typename RotationType>
+EIGEN_DEVICE_FUNC Transform<Scalar, Dim, Mode, Options>& Transform<Scalar, Dim, Mode, Options>::prerotate(
+    const RotationType& rotation) {
+  m_matrix.template block<Dim, HDim>(0, 0) =
+      internal::toRotationMatrix<Scalar, Dim>(rotation) * m_matrix.template block<Dim, HDim>(0, 0);
   return *this;
 }
 
 /** Applies on the right the shear transformation represented
-  * by the vector \a other to \c *this and returns a reference to \c *this.
-  * \warning 2D only.
-  * \sa preshear()
-  */
-template<typename Scalar, int Dim, int Mode, int Options>
-EIGEN_DEVICE_FUNC Transform<Scalar,Dim,Mode,Options>&
-Transform<Scalar,Dim,Mode,Options>::shear(const Scalar& sx, const Scalar& sy)
-{
-  EIGEN_STATIC_ASSERT(int(Dim)==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
-  EIGEN_STATIC_ASSERT(Mode!=int(Isometry), THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS)
-  VectorType tmp = linear().col(0)*sy + linear().col(1);
-  linear() << linear().col(0) + linear().col(1)*sx, tmp;
+ * by the vector \a other to \c *this and returns a reference to \c *this.
+ * \warning 2D only.
+ * \sa preshear()
+ */
+template <typename Scalar, int Dim, int Mode, int Options>
+EIGEN_DEVICE_FUNC Transform<Scalar, Dim, Mode, Options>& Transform<Scalar, Dim, Mode, Options>::shear(
+    const Scalar& sx, const Scalar& sy) {
+  EIGEN_STATIC_ASSERT(int(Dim) == 2, YOU_MADE_A_PROGRAMMING_MISTAKE)
+  EIGEN_STATIC_ASSERT(Mode != int(Isometry), THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS)
+  VectorType tmp = linear().col(0) * sy + linear().col(1);
+  linear() << linear().col(0) + linear().col(1) * sx, tmp;
   return *this;
 }
 
 /** Applies on the left the shear transformation represented
-  * by the vector \a other to \c *this and returns a reference to \c *this.
-  * \warning 2D only.
-  * \sa shear()
-  */
-template<typename Scalar, int Dim, int Mode, int Options>
-EIGEN_DEVICE_FUNC Transform<Scalar,Dim,Mode,Options>&
-Transform<Scalar,Dim,Mode,Options>::preshear(const Scalar& sx, const Scalar& sy)
-{
-  EIGEN_STATIC_ASSERT(int(Dim)==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
-  EIGEN_STATIC_ASSERT(Mode!=int(Isometry), THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS)
-  m_matrix.template block<Dim,HDim>(0,0) = LinearMatrixType(1, sx, sy, 1) * m_matrix.template block<Dim,HDim>(0,0);
+ * by the vector \a other to \c *this and returns a reference to \c *this.
+ * \warning 2D only.
+ * \sa shear()
+ */
+template <typename Scalar, int Dim, int Mode, int Options>
+EIGEN_DEVICE_FUNC Transform<Scalar, Dim, Mode, Options>& Transform<Scalar, Dim, Mode, Options>::preshear(
+    const Scalar& sx, const Scalar& sy) {
+  EIGEN_STATIC_ASSERT(int(Dim) == 2, YOU_MADE_A_PROGRAMMING_MISTAKE)
+  EIGEN_STATIC_ASSERT(Mode != int(Isometry), THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS)
+  m_matrix.template block<Dim, HDim>(0, 0) = LinearMatrixType(1, sx, sy, 1) * m_matrix.template block<Dim, HDim>(0, 0);
   return *this;
 }
 
@@ -1001,46 +951,46 @@
 *** Scaling, Translation and Rotation compatibility ***
 ******************************************************/
 
-template<typename Scalar, int Dim, int Mode, int Options>
-EIGEN_DEVICE_FUNC inline Transform<Scalar,Dim,Mode,Options>& Transform<Scalar,Dim,Mode,Options>::operator=(const TranslationType& t)
-{
+template <typename Scalar, int Dim, int Mode, int Options>
+EIGEN_DEVICE_FUNC inline Transform<Scalar, Dim, Mode, Options>& Transform<Scalar, Dim, Mode, Options>::operator=(
+    const TranslationType& t) {
   linear().setIdentity();
   translation() = t.vector();
   makeAffine();
   return *this;
 }
 
-template<typename Scalar, int Dim, int Mode, int Options>
-EIGEN_DEVICE_FUNC inline Transform<Scalar,Dim,Mode,Options> Transform<Scalar,Dim,Mode,Options>::operator*(const TranslationType& t) const
-{
+template <typename Scalar, int Dim, int Mode, int Options>
+EIGEN_DEVICE_FUNC inline Transform<Scalar, Dim, Mode, Options> Transform<Scalar, Dim, Mode, Options>::operator*(
+    const TranslationType& t) const {
   Transform res = *this;
   res.translate(t.vector());
   return res;
 }
 
-template<typename Scalar, int Dim, int Mode, int Options>
-EIGEN_DEVICE_FUNC inline Transform<Scalar,Dim,Mode,Options>& Transform<Scalar,Dim,Mode,Options>::operator=(const UniformScaling<Scalar>& s)
-{
+template <typename Scalar, int Dim, int Mode, int Options>
+EIGEN_DEVICE_FUNC inline Transform<Scalar, Dim, Mode, Options>& Transform<Scalar, Dim, Mode, Options>::operator=(
+    const UniformScaling<Scalar>& s) {
   m_matrix.setZero();
   linear().diagonal().fill(s.factor());
   makeAffine();
   return *this;
 }
 
-template<typename Scalar, int Dim, int Mode, int Options>
-template<typename Derived>
-EIGEN_DEVICE_FUNC inline Transform<Scalar,Dim,Mode,Options>& Transform<Scalar,Dim,Mode,Options>::operator=(const RotationBase<Derived,Dim>& r)
-{
-  linear() = internal::toRotationMatrix<Scalar,Dim>(r);
+template <typename Scalar, int Dim, int Mode, int Options>
+template <typename Derived>
+EIGEN_DEVICE_FUNC inline Transform<Scalar, Dim, Mode, Options>& Transform<Scalar, Dim, Mode, Options>::operator=(
+    const RotationBase<Derived, Dim>& r) {
+  linear() = internal::toRotationMatrix<Scalar, Dim>(r);
   translation().setZero();
   makeAffine();
   return *this;
 }
 
-template<typename Scalar, int Dim, int Mode, int Options>
-template<typename Derived>
-EIGEN_DEVICE_FUNC inline Transform<Scalar,Dim,Mode,Options> Transform<Scalar,Dim,Mode,Options>::operator*(const RotationBase<Derived,Dim>& r) const
-{
+template <typename Scalar, int Dim, int Mode, int Options>
+template <typename Derived>
+EIGEN_DEVICE_FUNC inline Transform<Scalar, Dim, Mode, Options> Transform<Scalar, Dim, Mode, Options>::operator*(
+    const RotationBase<Derived, Dim>& r) const {
   Transform res = *this;
   res.rotate(r.derived());
   return res;
@@ -1051,115 +1001,112 @@
 ************************/
 
 namespace internal {
-template<int Mode> struct transform_rotation_impl {
-  template<typename TransformType>
-  EIGEN_DEVICE_FUNC static inline
-  const typename TransformType::LinearMatrixType run(const TransformType& t)
-  {
+template <int Mode>
+struct transform_rotation_impl {
+  template <typename TransformType>
+  EIGEN_DEVICE_FUNC static inline const typename TransformType::LinearMatrixType run(const TransformType& t) {
     typedef typename TransformType::LinearMatrixType LinearMatrixType;
     LinearMatrixType result;
     t.computeRotationScaling(&result, (LinearMatrixType*)0);
     return result;
   }
 };
-template<> struct transform_rotation_impl<Isometry> {
-  template<typename TransformType>
-  EIGEN_DEVICE_FUNC static inline
-  typename TransformType::ConstLinearPart run(const TransformType& t)
-  {
+template <>
+struct transform_rotation_impl<Isometry> {
+  template <typename TransformType>
+  EIGEN_DEVICE_FUNC static inline typename TransformType::ConstLinearPart run(const TransformType& t) {
     return t.linear();
   }
 };
-}
+}  // namespace internal
 /** \returns the rotation part of the transformation
-  *
-  * If Mode==Isometry, then this method is an alias for linear(),
-  * otherwise it calls computeRotationScaling() to extract the rotation
-  * through a SVD decomposition.
-  *
-  * \svd_module
-  *
-  * \sa computeRotationScaling(), computeScalingRotation(), class SVD
-  */
-template<typename Scalar, int Dim, int Mode, int Options>
-EIGEN_DEVICE_FUNC
-typename Transform<Scalar,Dim,Mode,Options>::RotationReturnType
-Transform<Scalar,Dim,Mode,Options>::rotation() const
-{
+ *
+ * If Mode==Isometry, then this method is an alias for linear(),
+ * otherwise it calls computeRotationScaling() to extract the rotation
+ * through a SVD decomposition.
+ *
+ * \svd_module
+ *
+ * \sa computeRotationScaling(), computeScalingRotation(), class SVD
+ */
+template <typename Scalar, int Dim, int Mode, int Options>
+EIGEN_DEVICE_FUNC typename Transform<Scalar, Dim, Mode, Options>::RotationReturnType
+Transform<Scalar, Dim, Mode, Options>::rotation() const {
   return internal::transform_rotation_impl<Mode>::run(*this);
 }
 
-
 /** decomposes the linear part of the transformation as a product rotation x scaling, the scaling being
-  * not necessarily positive.
-  *
-  * If either pointer is zero, the corresponding computation is skipped.
-  *
-  *
-  *
-  * \svd_module
-  *
-  * \sa computeScalingRotation(), rotation(), class SVD
-  */
-template<typename Scalar, int Dim, int Mode, int Options>
-template<typename RotationMatrixType, typename ScalingMatrixType>
-EIGEN_DEVICE_FUNC void Transform<Scalar,Dim,Mode,Options>::computeRotationScaling(RotationMatrixType *rotation, ScalingMatrixType *scaling) const
-{
+ * not necessarily positive.
+ *
+ * If either pointer is zero, the corresponding computation is skipped.
+ *
+ *
+ *
+ * \svd_module
+ *
+ * \sa computeScalingRotation(), rotation(), class SVD
+ */
+template <typename Scalar, int Dim, int Mode, int Options>
+template <typename RotationMatrixType, typename ScalingMatrixType>
+EIGEN_DEVICE_FUNC void Transform<Scalar, Dim, Mode, Options>::computeRotationScaling(RotationMatrixType* rotation,
+                                                                                     ScalingMatrixType* scaling) const {
   // Note that JacobiSVD is faster than BDCSVD for small matrices.
   JacobiSVD<LinearMatrixType, ComputeFullU | ComputeFullV> svd(linear());
 
-  Scalar x = (svd.matrixU() * svd.matrixV().adjoint()).determinant() < Scalar(0) ? Scalar(-1) : Scalar(1); // so x has absolute value 1
+  Scalar x = (svd.matrixU() * svd.matrixV().adjoint()).determinant() < Scalar(0)
+                 ? Scalar(-1)
+                 : Scalar(1);  // so x has absolute value 1
   VectorType sv(svd.singularValues());
-  sv.coeffRef(Dim-1) *= x;
-  if(scaling) *scaling = svd.matrixV() * sv.asDiagonal() * svd.matrixV().adjoint();
-  if(rotation)
-  {
+  sv.coeffRef(Dim - 1) *= x;
+  if (scaling) *scaling = svd.matrixV() * sv.asDiagonal() * svd.matrixV().adjoint();
+  if (rotation) {
     LinearMatrixType m(svd.matrixU());
-    m.col(Dim-1) *= x;
+    m.col(Dim - 1) *= x;
     *rotation = m * svd.matrixV().adjoint();
   }
 }
 
 /** decomposes the linear part of the transformation as a product scaling x rotation, the scaling being
-  * not necessarily positive.
-  *
-  * If either pointer is zero, the corresponding computation is skipped.
-  *
-  *
-  *
-  * \svd_module
-  *
-  * \sa computeRotationScaling(), rotation(), class SVD
-  */
-template<typename Scalar, int Dim, int Mode, int Options>
-template<typename ScalingMatrixType, typename RotationMatrixType>
-EIGEN_DEVICE_FUNC void Transform<Scalar,Dim,Mode,Options>::computeScalingRotation(ScalingMatrixType *scaling, RotationMatrixType *rotation) const
-{
+ * not necessarily positive.
+ *
+ * If either pointer is zero, the corresponding computation is skipped.
+ *
+ *
+ *
+ * \svd_module
+ *
+ * \sa computeRotationScaling(), rotation(), class SVD
+ */
+template <typename Scalar, int Dim, int Mode, int Options>
+template <typename ScalingMatrixType, typename RotationMatrixType>
+EIGEN_DEVICE_FUNC void Transform<Scalar, Dim, Mode, Options>::computeScalingRotation(
+    ScalingMatrixType* scaling, RotationMatrixType* rotation) const {
   // Note that JacobiSVD is faster than BDCSVD for small matrices.
   JacobiSVD<LinearMatrixType, ComputeFullU | ComputeFullV> svd(linear());
 
-  Scalar x = (svd.matrixU() * svd.matrixV().adjoint()).determinant() < Scalar(0) ? Scalar(-1) : Scalar(1); // so x has absolute value 1
+  Scalar x = (svd.matrixU() * svd.matrixV().adjoint()).determinant() < Scalar(0)
+                 ? Scalar(-1)
+                 : Scalar(1);  // so x has absolute value 1
   VectorType sv(svd.singularValues());
-  sv.coeffRef(Dim-1) *= x;
-  if(scaling) *scaling = svd.matrixU() * sv.asDiagonal() * svd.matrixU().adjoint();
-  if(rotation)
-  {
+  sv.coeffRef(Dim - 1) *= x;
+  if (scaling) *scaling = svd.matrixU() * sv.asDiagonal() * svd.matrixU().adjoint();
+  if (rotation) {
     LinearMatrixType m(svd.matrixU());
-    m.col(Dim-1) *= x;
+    m.col(Dim - 1) *= x;
     *rotation = m * svd.matrixV().adjoint();
   }
 }
 
 /** Convenient method to set \c *this from a position, orientation and scale
-  * of a 3D object.
-  */
-template<typename Scalar, int Dim, int Mode, int Options>
-template<typename PositionDerived, typename OrientationType, typename ScaleDerived>
-EIGEN_DEVICE_FUNC Transform<Scalar,Dim,Mode,Options>&
-Transform<Scalar,Dim,Mode,Options>::fromPositionOrientationScale(const MatrixBase<PositionDerived> &position,
-  const OrientationType& orientation, const MatrixBase<ScaleDerived> &scale)
-{
-  linear() = internal::toRotationMatrix<Scalar,Dim>(orientation);
+ * of a 3D object.
+ */
+template <typename Scalar, int Dim, int Mode, int Options>
+template <typename PositionDerived, typename OrientationType, typename ScaleDerived>
+EIGEN_DEVICE_FUNC Transform<Scalar, Dim, Mode, Options>&
+Transform<Scalar, Dim, Mode, Options>::fromPositionOrientationScale(const MatrixBase<PositionDerived>& position,
+                                                                    const OrientationType& orientation,
+                                                                    const MatrixBase<ScaleDerived>& scale) {
+  linear() = internal::toRotationMatrix<Scalar, Dim>(orientation);
   linear() *= scale.asDiagonal();
   translation() = position;
   makeAffine();
@@ -1168,91 +1115,74 @@
 
 namespace internal {
 
-template<int Mode>
-struct transform_make_affine
-{
-  template<typename MatrixType>
-  EIGEN_DEVICE_FUNC static void run(MatrixType &mat)
-  {
-    static const int Dim = MatrixType::ColsAtCompileTime-1;
-    mat.template block<1,Dim>(Dim,0).setZero();
-    mat.coeffRef(Dim,Dim) = typename MatrixType::Scalar(1);
+template <int Mode>
+struct transform_make_affine {
+  template <typename MatrixType>
+  EIGEN_DEVICE_FUNC static void run(MatrixType& mat) {
+    static const int Dim = MatrixType::ColsAtCompileTime - 1;
+    mat.template block<1, Dim>(Dim, 0).setZero();
+    mat.coeffRef(Dim, Dim) = typename MatrixType::Scalar(1);
   }
 };
 
-template<>
-struct transform_make_affine<AffineCompact>
-{
-  template<typename MatrixType> EIGEN_DEVICE_FUNC static void run(MatrixType &) { }
+template <>
+struct transform_make_affine<AffineCompact> {
+  template <typename MatrixType>
+  EIGEN_DEVICE_FUNC static void run(MatrixType&) {}
 };
 
 // selector needed to avoid taking the inverse of a 3x4 matrix
-template<typename TransformType, int Mode=TransformType::Mode>
-struct projective_transform_inverse
-{
-  EIGEN_DEVICE_FUNC static inline void run(const TransformType&, TransformType&)
-  {}
+template <typename TransformType, int Mode = TransformType::Mode>
+struct projective_transform_inverse {
+  EIGEN_DEVICE_FUNC static inline void run(const TransformType&, TransformType&) {}
 };
 
-template<typename TransformType>
-struct projective_transform_inverse<TransformType, Projective>
-{
-  EIGEN_DEVICE_FUNC static inline void run(const TransformType& m, TransformType& res)
-  {
+template <typename TransformType>
+struct projective_transform_inverse<TransformType, Projective> {
+  EIGEN_DEVICE_FUNC static inline void run(const TransformType& m, TransformType& res) {
     res.matrix() = m.matrix().inverse();
   }
 };
 
-} // end namespace internal
-
+}  // end namespace internal
 
 /**
-  *
-  * \returns the inverse transformation according to some given knowledge
-  * on \c *this.
-  *
-  * \param hint allows to optimize the inversion process when the transformation
-  * is known to be not a general transformation (optional). The possible values are:
-  *  - #Projective if the transformation is not necessarily affine, i.e., if the
-  *    last row is not guaranteed to be [0 ... 0 1]
-  *  - #Affine if the last row can be assumed to be [0 ... 0 1]
-  *  - #Isometry if the transformation is only a concatenations of translations
-  *    and rotations.
-  *  The default is the template class parameter \c Mode.
-  *
-  * \warning unless \a traits is always set to NoShear or NoScaling, this function
-  * requires the generic inverse method of MatrixBase defined in the LU module. If
-  * you forget to include this module, then you will get hard to debug linking errors.
-  *
-  * \sa MatrixBase::inverse()
-  */
-template<typename Scalar, int Dim, int Mode, int Options>
-EIGEN_DEVICE_FUNC Transform<Scalar,Dim,Mode,Options>
-Transform<Scalar,Dim,Mode,Options>::inverse(TransformTraits hint) const
-{
+ *
+ * \returns the inverse transformation according to some given knowledge
+ * on \c *this.
+ *
+ * \param hint allows to optimize the inversion process when the transformation
+ * is known to be not a general transformation (optional). The possible values are:
+ *  - #Projective if the transformation is not necessarily affine, i.e., if the
+ *    last row is not guaranteed to be [0 ... 0 1]
+ *  - #Affine if the last row can be assumed to be [0 ... 0 1]
+ *  - #Isometry if the transformation is only a concatenations of translations
+ *    and rotations.
+ *  The default is the template class parameter \c Mode.
+ *
+ * \warning unless \a traits is always set to NoShear or NoScaling, this function
+ * requires the generic inverse method of MatrixBase defined in the LU module. If
+ * you forget to include this module, then you will get hard to debug linking errors.
+ *
+ * \sa MatrixBase::inverse()
+ */
+template <typename Scalar, int Dim, int Mode, int Options>
+EIGEN_DEVICE_FUNC Transform<Scalar, Dim, Mode, Options> Transform<Scalar, Dim, Mode, Options>::inverse(
+    TransformTraits hint) const {
   Transform res;
-  if (hint == Projective)
-  {
+  if (hint == Projective) {
     internal::projective_transform_inverse<Transform>::run(*this, res);
-  }
-  else
-  {
-    if (hint == Isometry)
-    {
-      res.matrix().template topLeftCorner<Dim,Dim>() = linear().transpose();
-    }
-    else if(hint&Affine)
-    {
-      res.matrix().template topLeftCorner<Dim,Dim>() = linear().inverse();
-    }
-    else
-    {
+  } else {
+    if (hint == Isometry) {
+      res.matrix().template topLeftCorner<Dim, Dim>() = linear().transpose();
+    } else if (hint & Affine) {
+      res.matrix().template topLeftCorner<Dim, Dim>() = linear().inverse();
+    } else {
       eigen_assert(false && "Invalid transform traits in Transform::Inverse");
     }
     // translation and remaining parts
-    res.matrix().template topRightCorner<Dim,1>()
-      = - res.matrix().template topLeftCorner<Dim,Dim>() * translation();
-    res.makeAffine(); // we do need this, because in the beginning res is uninitialized
+    res.matrix().template topRightCorner<Dim, 1>() = -res.matrix().template topLeftCorner<Dim, Dim>() * translation();
+    res.makeAffine();  // we do need this, because in the beginning res is uninitialized
   }
   return res;
 }
@@ -1263,19 +1193,22 @@
 *** Specializations of take affine part            ***
 *****************************************************/
 
-template<typename TransformType> struct transform_take_affine_part {
+template <typename TransformType>
+struct transform_take_affine_part {
   typedef typename TransformType::MatrixType MatrixType;
   typedef typename TransformType::AffinePart AffinePart;
   typedef typename TransformType::ConstAffinePart ConstAffinePart;
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE AffinePart run(MatrixType& m)
-  { return m.template block<TransformType::Dim,TransformType::HDim>(0,0); }
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ConstAffinePart run(const MatrixType& m)
-  { return m.template block<TransformType::Dim,TransformType::HDim>(0,0); }
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE AffinePart run(MatrixType& m) {
+    return m.template block<TransformType::Dim, TransformType::HDim>(0, 0);
+  }
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ConstAffinePart run(const MatrixType& m) {
+    return m.template block<TransformType::Dim, TransformType::HDim>(0, 0);
+  }
 };
 
-template<typename Scalar, int Dim, int Options>
-struct transform_take_affine_part<Transform<Scalar,Dim,AffineCompact, Options> > {
-  typedef typename Transform<Scalar,Dim,AffineCompact,Options>::MatrixType MatrixType;
+template <typename Scalar, int Dim, int Options>
+struct transform_take_affine_part<Transform<Scalar, Dim, AffineCompact, Options> > {
+  typedef typename Transform<Scalar, Dim, AffineCompact, Options>::MatrixType MatrixType;
   static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE MatrixType& run(MatrixType& m) { return m; }
   static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const MatrixType& run(const MatrixType& m) { return m; }
 };
@@ -1284,72 +1217,67 @@
 *** Specializations of construct from matrix       ***
 *****************************************************/
 
-template<typename Other, int Mode, int Options, int Dim, int HDim>
-struct transform_construct_from_matrix<Other, Mode,Options,Dim,HDim, Dim,Dim>
-{
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Transform<typename Other::Scalar,Dim,Mode,Options> *transform, const Other& other)
-  {
+template <typename Other, int Mode, int Options, int Dim, int HDim>
+struct transform_construct_from_matrix<Other, Mode, Options, Dim, HDim, Dim, Dim> {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(
+      Transform<typename Other::Scalar, Dim, Mode, Options>* transform, const Other& other) {
     transform->linear() = other;
     transform->translation().setZero();
     transform->makeAffine();
   }
 };
 
-template<typename Other, int Mode, int Options, int Dim, int HDim>
-struct transform_construct_from_matrix<Other, Mode,Options,Dim,HDim, Dim,HDim>
-{
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Transform<typename Other::Scalar,Dim,Mode,Options> *transform, const Other& other)
-  {
+template <typename Other, int Mode, int Options, int Dim, int HDim>
+struct transform_construct_from_matrix<Other, Mode, Options, Dim, HDim, Dim, HDim> {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(
+      Transform<typename Other::Scalar, Dim, Mode, Options>* transform, const Other& other) {
     transform->affine() = other;
     transform->makeAffine();
   }
 };
 
-template<typename Other, int Mode, int Options, int Dim, int HDim>
-struct transform_construct_from_matrix<Other, Mode,Options,Dim,HDim, HDim,HDim>
-{
-  static  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Transform<typename Other::Scalar,Dim,Mode,Options> *transform, const Other& other)
-  { transform->matrix() = other; }
+template <typename Other, int Mode, int Options, int Dim, int HDim>
+struct transform_construct_from_matrix<Other, Mode, Options, Dim, HDim, HDim, HDim> {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(
+      Transform<typename Other::Scalar, Dim, Mode, Options>* transform, const Other& other) {
+    transform->matrix() = other;
+  }
 };
 
-template<typename Other, int Options, int Dim, int HDim>
-struct transform_construct_from_matrix<Other, AffineCompact,Options,Dim,HDim, HDim,HDim>
-{
-  static  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Transform<typename Other::Scalar,Dim,AffineCompact,Options> *transform, const Other& other)
-  { transform->matrix() = other.template block<Dim,HDim>(0,0); }
+template <typename Other, int Options, int Dim, int HDim>
+struct transform_construct_from_matrix<Other, AffineCompact, Options, Dim, HDim, HDim, HDim> {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(
+      Transform<typename Other::Scalar, Dim, AffineCompact, Options>* transform, const Other& other) {
+    transform->matrix() = other.template block<Dim, HDim>(0, 0);
+  }
 };
 
 /**********************************************************
 ***   Specializations of operator* with rhs EigenBase   ***
 **********************************************************/
 
-template<int LhsMode,int RhsMode>
-struct transform_product_result
-{
-  enum
-  {
-    Mode =
-      (LhsMode == (int)Projective    || RhsMode == (int)Projective    ) ? Projective :
-      (LhsMode == (int)Affine        || RhsMode == (int)Affine        ) ? Affine :
-      (LhsMode == (int)AffineCompact || RhsMode == (int)AffineCompact ) ? AffineCompact :
-      (LhsMode == (int)Isometry      || RhsMode == (int)Isometry      ) ? Isometry : Projective
+template <int LhsMode, int RhsMode>
+struct transform_product_result {
+  enum {
+    Mode = (LhsMode == (int)Projective || RhsMode == (int)Projective)         ? Projective
+           : (LhsMode == (int)Affine || RhsMode == (int)Affine)               ? Affine
+           : (LhsMode == (int)AffineCompact || RhsMode == (int)AffineCompact) ? AffineCompact
+           : (LhsMode == (int)Isometry || RhsMode == (int)Isometry)           ? Isometry
+                                                                              : Projective
   };
 };
 
-template< typename TransformType, typename MatrixType, int RhsCols>
-struct transform_right_product_impl< TransformType, MatrixType, 0, RhsCols>
-{
+template <typename TransformType, typename MatrixType, int RhsCols>
+struct transform_right_product_impl<TransformType, MatrixType, 0, RhsCols> {
   typedef typename MatrixType::PlainObject ResultType;
 
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ResultType run(const TransformType& T, const MatrixType& other)
-  {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ResultType run(const TransformType& T, const MatrixType& other) {
     return T.matrix() * other;
   }
 };
 
-template< typename TransformType, typename MatrixType, int RhsCols>
-struct transform_right_product_impl< TransformType, MatrixType, 1, RhsCols>
-{
+template <typename TransformType, typename MatrixType, int RhsCols>
+struct transform_right_product_impl<TransformType, MatrixType, 1, RhsCols> {
   enum {
     Dim = TransformType::Dim,
     HDim = TransformType::HDim,
@@ -1359,23 +1287,21 @@
 
   typedef typename MatrixType::PlainObject ResultType;
 
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ResultType run(const TransformType& T, const MatrixType& other)
-  {
-    EIGEN_STATIC_ASSERT(OtherRows==HDim, YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES);
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ResultType run(const TransformType& T, const MatrixType& other) {
+    EIGEN_STATIC_ASSERT(OtherRows == HDim, YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES);
 
-    typedef Block<ResultType, Dim, OtherCols, int(MatrixType::RowsAtCompileTime)==Dim> TopLeftLhs;
+    typedef Block<ResultType, Dim, OtherCols, int(MatrixType::RowsAtCompileTime) == Dim> TopLeftLhs;
 
-    ResultType res(other.rows(),other.cols());
+    ResultType res(other.rows(), other.cols());
     TopLeftLhs(res, 0, 0, Dim, other.cols()).noalias() = T.affine() * other;
-    res.row(OtherRows-1) = other.row(OtherRows-1);
+    res.row(OtherRows - 1) = other.row(OtherRows - 1);
 
     return res;
   }
 };
 
-template< typename TransformType, typename MatrixType, int RhsCols>
-struct transform_right_product_impl< TransformType, MatrixType, 2, RhsCols>
-{
+template <typename TransformType, typename MatrixType, int RhsCols>
+struct transform_right_product_impl<TransformType, MatrixType, 2, RhsCols> {
   enum {
     Dim = TransformType::Dim,
     HDim = TransformType::HDim,
@@ -1385,20 +1311,20 @@
 
   typedef typename MatrixType::PlainObject ResultType;
 
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ResultType run(const TransformType& T, const MatrixType& other)
-  {
-    EIGEN_STATIC_ASSERT(OtherRows==Dim, YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES);
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ResultType run(const TransformType& T, const MatrixType& other) {
+    EIGEN_STATIC_ASSERT(OtherRows == Dim, YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES);
 
     typedef Block<ResultType, Dim, OtherCols, true> TopLeftLhs;
-    ResultType res(Replicate<typename TransformType::ConstTranslationPart, 1, OtherCols>(T.translation(),1,other.cols()));
+    ResultType res(
+        Replicate<typename TransformType::ConstTranslationPart, 1, OtherCols>(T.translation(), 1, other.cols()));
     TopLeftLhs(res, 0, 0, Dim, other.cols()).noalias() += T.linear() * other;
 
     return res;
   }
 };
 
-template< typename TransformType, typename MatrixType >
-struct transform_right_product_impl< TransformType, MatrixType, 2, 1> // rhs is a vector of size Dim
+template <typename TransformType, typename MatrixType>
+struct transform_right_product_impl<TransformType, MatrixType, 2, 1>  // rhs is a vector of size Dim
 {
   typedef typename TransformType::MatrixType TransformMatrix;
   enum {
@@ -1410,12 +1336,12 @@
 
   typedef typename MatrixType::PlainObject ResultType;
 
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ResultType run(const TransformType& T, const MatrixType& other)
-  {
-    EIGEN_STATIC_ASSERT(OtherRows==Dim, YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES);
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ResultType run(const TransformType& T, const MatrixType& other) {
+    EIGEN_STATIC_ASSERT(OtherRows == Dim, YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES);
 
-    Matrix<typename ResultType::Scalar, Dim+1, 1> rhs;
-    rhs.template head<Dim>() = other; rhs[Dim] = typename ResultType::Scalar(1);
+    Matrix<typename ResultType::Scalar, Dim + 1, 1> rhs;
+    rhs.template head<Dim>() = other;
+    rhs[Dim] = typename ResultType::Scalar(1);
     Matrix<typename ResultType::Scalar, WorkingRows, 1> res(T.matrix() * rhs);
     return res.template head<Dim>();
   }
@@ -1426,41 +1352,37 @@
 **********************************************************/
 
 // generic HDim x HDim matrix * T => Projective
-template<typename Other,int Mode, int Options, int Dim, int HDim>
-struct transform_left_product_impl<Other,Mode,Options,Dim,HDim, HDim,HDim>
-{
-  typedef Transform<typename Other::Scalar,Dim,Mode,Options> TransformType;
+template <typename Other, int Mode, int Options, int Dim, int HDim>
+struct transform_left_product_impl<Other, Mode, Options, Dim, HDim, HDim, HDim> {
+  typedef Transform<typename Other::Scalar, Dim, Mode, Options> TransformType;
   typedef typename TransformType::MatrixType MatrixType;
-  typedef Transform<typename Other::Scalar,Dim,Projective,Options> ResultType;
-  static EIGEN_DEVICE_FUNC ResultType run(const Other& other,const TransformType& tr)
-  { return ResultType(other * tr.matrix()); }
+  typedef Transform<typename Other::Scalar, Dim, Projective, Options> ResultType;
+  static EIGEN_DEVICE_FUNC ResultType run(const Other& other, const TransformType& tr) {
+    return ResultType(other * tr.matrix());
+  }
 };
 
 // generic HDim x HDim matrix * AffineCompact => Projective
-template<typename Other, int Options, int Dim, int HDim>
-struct transform_left_product_impl<Other,AffineCompact,Options,Dim,HDim, HDim,HDim>
-{
-  typedef Transform<typename Other::Scalar,Dim,AffineCompact,Options> TransformType;
+template <typename Other, int Options, int Dim, int HDim>
+struct transform_left_product_impl<Other, AffineCompact, Options, Dim, HDim, HDim, HDim> {
+  typedef Transform<typename Other::Scalar, Dim, AffineCompact, Options> TransformType;
   typedef typename TransformType::MatrixType MatrixType;
-  typedef Transform<typename Other::Scalar,Dim,Projective,Options> ResultType;
-  static EIGEN_DEVICE_FUNC ResultType run(const Other& other,const TransformType& tr)
-  {
+  typedef Transform<typename Other::Scalar, Dim, Projective, Options> ResultType;
+  static EIGEN_DEVICE_FUNC ResultType run(const Other& other, const TransformType& tr) {
     ResultType res;
-    res.matrix().noalias() = other.template block<HDim,Dim>(0,0) * tr.matrix();
+    res.matrix().noalias() = other.template block<HDim, Dim>(0, 0) * tr.matrix();
     res.matrix().col(Dim) += other.col(Dim);
     return res;
   }
 };
 
 // affine matrix * T
-template<typename Other,int Mode, int Options, int Dim, int HDim>
-struct transform_left_product_impl<Other,Mode,Options,Dim,HDim, Dim,HDim>
-{
-  typedef Transform<typename Other::Scalar,Dim,Mode,Options> TransformType;
+template <typename Other, int Mode, int Options, int Dim, int HDim>
+struct transform_left_product_impl<Other, Mode, Options, Dim, HDim, Dim, HDim> {
+  typedef Transform<typename Other::Scalar, Dim, Mode, Options> TransformType;
   typedef typename TransformType::MatrixType MatrixType;
   typedef TransformType ResultType;
-  static EIGEN_DEVICE_FUNC ResultType run(const Other& other,const TransformType& tr)
-  {
+  static EIGEN_DEVICE_FUNC ResultType run(const Other& other, const TransformType& tr) {
     ResultType res;
     res.affine().noalias() = other * tr.matrix();
     res.matrix().row(Dim) = tr.matrix().row(Dim);
@@ -1469,35 +1391,29 @@
 };
 
 // affine matrix * AffineCompact
-template<typename Other, int Options, int Dim, int HDim>
-struct transform_left_product_impl<Other,AffineCompact,Options,Dim,HDim, Dim,HDim>
-{
-  typedef Transform<typename Other::Scalar,Dim,AffineCompact,Options> TransformType;
+template <typename Other, int Options, int Dim, int HDim>
+struct transform_left_product_impl<Other, AffineCompact, Options, Dim, HDim, Dim, HDim> {
+  typedef Transform<typename Other::Scalar, Dim, AffineCompact, Options> TransformType;
   typedef typename TransformType::MatrixType MatrixType;
   typedef TransformType ResultType;
-  static EIGEN_DEVICE_FUNC ResultType run(const Other& other,const TransformType& tr)
-  {
+  static EIGEN_DEVICE_FUNC ResultType run(const Other& other, const TransformType& tr) {
     ResultType res;
-    res.matrix().noalias() = other.template block<Dim,Dim>(0,0) * tr.matrix();
+    res.matrix().noalias() = other.template block<Dim, Dim>(0, 0) * tr.matrix();
     res.translation() += other.col(Dim);
     return res;
   }
 };
 
 // linear matrix * T
-template<typename Other,int Mode, int Options, int Dim, int HDim>
-struct transform_left_product_impl<Other,Mode,Options,Dim,HDim, Dim,Dim>
-{
-  typedef Transform<typename Other::Scalar,Dim,Mode,Options> TransformType;
+template <typename Other, int Mode, int Options, int Dim, int HDim>
+struct transform_left_product_impl<Other, Mode, Options, Dim, HDim, Dim, Dim> {
+  typedef Transform<typename Other::Scalar, Dim, Mode, Options> TransformType;
   typedef typename TransformType::MatrixType MatrixType;
   typedef TransformType ResultType;
-  static EIGEN_DEVICE_FUNC ResultType run(const Other& other, const TransformType& tr)
-  {
+  static EIGEN_DEVICE_FUNC ResultType run(const Other& other, const TransformType& tr) {
     TransformType res;
-    if(Mode!=int(AffineCompact))
-      res.matrix().row(Dim) = tr.matrix().row(Dim);
-    res.matrix().template topRows<Dim>().noalias()
-      = other * tr.matrix().template topRows<Dim>();
+    if (Mode != int(AffineCompact)) res.matrix().row(Dim) = tr.matrix().row(Dim);
+    res.matrix().template topRows<Dim>().noalias() = other * tr.matrix().template topRows<Dim>();
     return res;
   }
 };
@@ -1506,15 +1422,14 @@
 *** Specializations of operator* with another Transform ***
 **********************************************************/
 
-template<typename Scalar, int Dim, int LhsMode, int LhsOptions, int RhsMode, int RhsOptions>
-struct transform_transform_product_impl<Transform<Scalar,Dim,LhsMode,LhsOptions>,Transform<Scalar,Dim,RhsMode,RhsOptions>,false >
-{
-  enum { ResultMode = transform_product_result<LhsMode,RhsMode>::Mode };
-  typedef Transform<Scalar,Dim,LhsMode,LhsOptions> Lhs;
-  typedef Transform<Scalar,Dim,RhsMode,RhsOptions> Rhs;
-  typedef Transform<Scalar,Dim,ResultMode,LhsOptions> ResultType;
-  static EIGEN_DEVICE_FUNC ResultType run(const Lhs& lhs, const Rhs& rhs)
-  {
+template <typename Scalar, int Dim, int LhsMode, int LhsOptions, int RhsMode, int RhsOptions>
+struct transform_transform_product_impl<Transform<Scalar, Dim, LhsMode, LhsOptions>,
+                                        Transform<Scalar, Dim, RhsMode, RhsOptions>, false> {
+  enum { ResultMode = transform_product_result<LhsMode, RhsMode>::Mode };
+  typedef Transform<Scalar, Dim, LhsMode, LhsOptions> Lhs;
+  typedef Transform<Scalar, Dim, RhsMode, RhsOptions> Rhs;
+  typedef Transform<Scalar, Dim, ResultMode, LhsOptions> ResultType;
+  static EIGEN_DEVICE_FUNC ResultType run(const Lhs& lhs, const Rhs& rhs) {
     ResultType res;
     res.linear() = lhs.linear() * rhs.linear();
     res.translation() = lhs.linear() * rhs.translation() + lhs.translation();
@@ -1523,26 +1438,24 @@
   }
 };
 
-template<typename Scalar, int Dim, int LhsMode, int LhsOptions, int RhsMode, int RhsOptions>
-struct transform_transform_product_impl<Transform<Scalar,Dim,LhsMode,LhsOptions>,Transform<Scalar,Dim,RhsMode,RhsOptions>,true >
-{
-  typedef Transform<Scalar,Dim,LhsMode,LhsOptions> Lhs;
-  typedef Transform<Scalar,Dim,RhsMode,RhsOptions> Rhs;
-  typedef Transform<Scalar,Dim,Projective> ResultType;
-  static EIGEN_DEVICE_FUNC ResultType run(const Lhs& lhs, const Rhs& rhs)
-  {
-    return ResultType( lhs.matrix() * rhs.matrix() );
+template <typename Scalar, int Dim, int LhsMode, int LhsOptions, int RhsMode, int RhsOptions>
+struct transform_transform_product_impl<Transform<Scalar, Dim, LhsMode, LhsOptions>,
+                                        Transform<Scalar, Dim, RhsMode, RhsOptions>, true> {
+  typedef Transform<Scalar, Dim, LhsMode, LhsOptions> Lhs;
+  typedef Transform<Scalar, Dim, RhsMode, RhsOptions> Rhs;
+  typedef Transform<Scalar, Dim, Projective> ResultType;
+  static EIGEN_DEVICE_FUNC ResultType run(const Lhs& lhs, const Rhs& rhs) {
+    return ResultType(lhs.matrix() * rhs.matrix());
   }
 };
 
-template<typename Scalar, int Dim, int LhsOptions, int RhsOptions>
-struct transform_transform_product_impl<Transform<Scalar,Dim,AffineCompact,LhsOptions>,Transform<Scalar,Dim,Projective,RhsOptions>,true >
-{
-  typedef Transform<Scalar,Dim,AffineCompact,LhsOptions> Lhs;
-  typedef Transform<Scalar,Dim,Projective,RhsOptions> Rhs;
-  typedef Transform<Scalar,Dim,Projective> ResultType;
-  static EIGEN_DEVICE_FUNC ResultType run(const Lhs& lhs, const Rhs& rhs)
-  {
+template <typename Scalar, int Dim, int LhsOptions, int RhsOptions>
+struct transform_transform_product_impl<Transform<Scalar, Dim, AffineCompact, LhsOptions>,
+                                        Transform<Scalar, Dim, Projective, RhsOptions>, true> {
+  typedef Transform<Scalar, Dim, AffineCompact, LhsOptions> Lhs;
+  typedef Transform<Scalar, Dim, Projective, RhsOptions> Rhs;
+  typedef Transform<Scalar, Dim, Projective> ResultType;
+  static EIGEN_DEVICE_FUNC ResultType run(const Lhs& lhs, const Rhs& rhs) {
     ResultType res;
     res.matrix().template topRows<Dim>() = lhs.matrix() * rhs.matrix();
     res.matrix().row(Dim) = rhs.matrix().row(Dim);
@@ -1550,22 +1463,21 @@
   }
 };
 
-template<typename Scalar, int Dim, int LhsOptions, int RhsOptions>
-struct transform_transform_product_impl<Transform<Scalar,Dim,Projective,LhsOptions>,Transform<Scalar,Dim,AffineCompact,RhsOptions>,true >
-{
-  typedef Transform<Scalar,Dim,Projective,LhsOptions> Lhs;
-  typedef Transform<Scalar,Dim,AffineCompact,RhsOptions> Rhs;
-  typedef Transform<Scalar,Dim,Projective> ResultType;
-  static EIGEN_DEVICE_FUNC ResultType run(const Lhs& lhs, const Rhs& rhs)
-  {
+template <typename Scalar, int Dim, int LhsOptions, int RhsOptions>
+struct transform_transform_product_impl<Transform<Scalar, Dim, Projective, LhsOptions>,
+                                        Transform<Scalar, Dim, AffineCompact, RhsOptions>, true> {
+  typedef Transform<Scalar, Dim, Projective, LhsOptions> Lhs;
+  typedef Transform<Scalar, Dim, AffineCompact, RhsOptions> Rhs;
+  typedef Transform<Scalar, Dim, Projective> ResultType;
+  static EIGEN_DEVICE_FUNC ResultType run(const Lhs& lhs, const Rhs& rhs) {
     ResultType res(lhs.matrix().template leftCols<Dim>() * rhs.matrix());
     res.matrix().col(Dim) += lhs.matrix().col(Dim);
     return res;
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_TRANSFORM_H
+#endif  // EIGEN_TRANSFORM_H
diff --git a/Eigen/src/Geometry/Translation.h b/Eigen/src/Geometry/Translation.h
index 25435d7..956ef56 100644
--- a/Eigen/src/Geometry/Translation.h
+++ b/Eigen/src/Geometry/Translation.h
@@ -13,59 +13,54 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 /** \geometry_module \ingroup Geometry_Module
-  *
-  * \class Translation
-  *
-  * \brief Represents a translation transformation
-  *
-  * \tparam Scalar_ the scalar type, i.e., the type of the coefficients.
-  * \tparam Dim_ the  dimension of the space, can be a compile time value or Dynamic
-  *
-  * \note This class is not aimed to be used to store a translation transformation,
-  * but rather to make easier the constructions and updates of Transform objects.
-  *
-  * \sa class Scaling, class Transform
-  */
-template<typename Scalar_, int Dim_>
-class Translation
-{
-public:
-  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar_,Dim_)
+ *
+ * \class Translation
+ *
+ * \brief Represents a translation transformation
+ *
+ * \tparam Scalar_ the scalar type, i.e., the type of the coefficients.
+ * \tparam Dim_ the  dimension of the space, can be a compile time value or Dynamic
+ *
+ * \note This class is not aimed to be used to store a translation transformation,
+ * but rather to make easier the constructions and updates of Transform objects.
+ *
+ * \sa class Scaling, class Transform
+ */
+template <typename Scalar_, int Dim_>
+class Translation {
+ public:
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar_, Dim_)
   /** dimension of the space */
   enum { Dim = Dim_ };
   /** the scalar type of the coefficients */
   typedef Scalar_ Scalar;
   /** corresponding vector type */
-  typedef Matrix<Scalar,Dim,1> VectorType;
+  typedef Matrix<Scalar, Dim, 1> VectorType;
   /** corresponding linear transformation matrix type */
-  typedef Matrix<Scalar,Dim,Dim> LinearMatrixType;
+  typedef Matrix<Scalar, Dim, Dim> LinearMatrixType;
   /** corresponding affine transformation type */
-  typedef Transform<Scalar,Dim,Affine> AffineTransformType;
+  typedef Transform<Scalar, Dim, Affine> AffineTransformType;
   /** corresponding isometric transformation type */
-  typedef Transform<Scalar,Dim,Isometry> IsometryTransformType;
+  typedef Transform<Scalar, Dim, Isometry> IsometryTransformType;
 
-protected:
-
+ protected:
   VectorType m_coeffs;
 
-public:
-
+ public:
   /** Default constructor without initialization. */
   EIGEN_DEVICE_FUNC Translation() {}
   /**  */
-  EIGEN_DEVICE_FUNC inline Translation(const Scalar& sx, const Scalar& sy)
-  {
-    eigen_assert(Dim==2);
+  EIGEN_DEVICE_FUNC inline Translation(const Scalar& sx, const Scalar& sy) {
+    eigen_assert(Dim == 2);
     m_coeffs.x() = sx;
     m_coeffs.y() = sy;
   }
   /**  */
-  EIGEN_DEVICE_FUNC inline Translation(const Scalar& sx, const Scalar& sy, const Scalar& sz)
-  {
-    eigen_assert(Dim==3);
+  EIGEN_DEVICE_FUNC inline Translation(const Scalar& sx, const Scalar& sy, const Scalar& sz) {
+    eigen_assert(Dim == 3);
     m_coeffs.x() = sx;
     m_coeffs.y() = sy;
     m_coeffs.z() = sz;
@@ -94,49 +89,51 @@
   EIGEN_DEVICE_FUNC VectorType& translation() { return m_coeffs; }
 
   /** Concatenates two translation */
-  EIGEN_DEVICE_FUNC inline Translation operator* (const Translation& other) const
-  { return Translation(m_coeffs + other.m_coeffs); }
+  EIGEN_DEVICE_FUNC inline Translation operator*(const Translation& other) const {
+    return Translation(m_coeffs + other.m_coeffs);
+  }
 
   /** Concatenates a translation and a uniform scaling */
-  EIGEN_DEVICE_FUNC inline AffineTransformType operator* (const UniformScaling<Scalar>& other) const;
+  EIGEN_DEVICE_FUNC inline AffineTransformType operator*(const UniformScaling<Scalar>& other) const;
 
   /** Concatenates a translation and a linear transformation */
-  template<typename OtherDerived>
-  EIGEN_DEVICE_FUNC inline AffineTransformType operator* (const EigenBase<OtherDerived>& linear) const;
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC inline AffineTransformType operator*(const EigenBase<OtherDerived>& linear) const;
 
   /** Concatenates a translation and a rotation */
-  template<typename Derived>
-  EIGEN_DEVICE_FUNC inline IsometryTransformType operator*(const RotationBase<Derived,Dim>& r) const
-  { return *this * IsometryTransformType(r); }
+  template <typename Derived>
+  EIGEN_DEVICE_FUNC inline IsometryTransformType operator*(const RotationBase<Derived, Dim>& r) const {
+    return *this * IsometryTransformType(r);
+  }
 
   /** \returns the concatenation of a linear transformation \a l with the translation \a t */
   // its a nightmare to define a templated friend function outside its declaration
-  template<typename OtherDerived> friend
-  EIGEN_DEVICE_FUNC inline AffineTransformType operator*(const EigenBase<OtherDerived>& linear, const Translation& t)
-  {
+  template <typename OtherDerived>
+  friend EIGEN_DEVICE_FUNC inline AffineTransformType operator*(const EigenBase<OtherDerived>& linear,
+                                                                const Translation& t) {
     AffineTransformType res;
     res.matrix().setZero();
     res.linear() = linear.derived();
     res.translation() = linear.derived() * t.m_coeffs;
     res.matrix().row(Dim).setZero();
-    res(Dim,Dim) = Scalar(1);
+    res(Dim, Dim) = Scalar(1);
     return res;
   }
 
   /** Concatenates a translation and a transformation */
-  template<int Mode, int Options>
-  EIGEN_DEVICE_FUNC inline Transform<Scalar,Dim,Mode> operator* (const Transform<Scalar,Dim,Mode,Options>& t) const
-  {
-    Transform<Scalar,Dim,Mode> res = t;
+  template <int Mode, int Options>
+  EIGEN_DEVICE_FUNC inline Transform<Scalar, Dim, Mode> operator*(
+      const Transform<Scalar, Dim, Mode, Options>& t) const {
+    Transform<Scalar, Dim, Mode> res = t;
     res.pretranslate(m_coeffs);
     return res;
   }
 
   /** Applies translation to vector */
-  template<typename Derived>
-  inline std::enable_if_t<Derived::IsVectorAtCompileTime,VectorType>
-  operator* (const MatrixBase<Derived>& vec) const
-  { return m_coeffs + vec.derived(); }
+  template <typename Derived>
+  inline std::enable_if_t<Derived::IsVectorAtCompileTime, VectorType> operator*(const MatrixBase<Derived>& vec) const {
+    return m_coeffs + vec.derived();
+  }
 
   /** \returns the inverse translation (opposite) */
   Translation inverse() const { return Translation(-m_coeffs); }
@@ -144,62 +141,64 @@
   static const Translation Identity() { return Translation(VectorType::Zero()); }
 
   /** \returns \c *this with scalar type casted to \a NewScalarType
-    *
-    * Note that if \a NewScalarType is equal to the current scalar type of \c *this
-    * then this function smartly returns a const reference to \c *this.
-    */
-  template<typename NewScalarType>
-  EIGEN_DEVICE_FUNC inline typename internal::cast_return_type<Translation,Translation<NewScalarType,Dim> >::type cast() const
-  { return typename internal::cast_return_type<Translation,Translation<NewScalarType,Dim> >::type(*this); }
+   *
+   * Note that if \a NewScalarType is equal to the current scalar type of \c *this
+   * then this function smartly returns a const reference to \c *this.
+   */
+  template <typename NewScalarType>
+  EIGEN_DEVICE_FUNC inline typename internal::cast_return_type<Translation, Translation<NewScalarType, Dim> >::type
+  cast() const {
+    return typename internal::cast_return_type<Translation, Translation<NewScalarType, Dim> >::type(*this);
+  }
 
   /** Copy constructor with scalar type conversion */
-  template<typename OtherScalarType>
-  EIGEN_DEVICE_FUNC inline explicit Translation(const Translation<OtherScalarType,Dim>& other)
-  { m_coeffs = other.vector().template cast<Scalar>(); }
+  template <typename OtherScalarType>
+  EIGEN_DEVICE_FUNC inline explicit Translation(const Translation<OtherScalarType, Dim>& other) {
+    m_coeffs = other.vector().template cast<Scalar>();
+  }
 
   /** \returns \c true if \c *this is approximately equal to \a other, within the precision
-    * determined by \a prec.
-    *
-    * \sa MatrixBase::isApprox() */
-  EIGEN_DEVICE_FUNC bool isApprox(const Translation& other, const typename NumTraits<Scalar>::Real& prec = NumTraits<Scalar>::dummy_precision()) const
-  { return m_coeffs.isApprox(other.m_coeffs, prec); }
-
+   * determined by \a prec.
+   *
+   * \sa MatrixBase::isApprox() */
+  EIGEN_DEVICE_FUNC bool isApprox(const Translation& other, const typename NumTraits<Scalar>::Real& prec =
+                                                                NumTraits<Scalar>::dummy_precision()) const {
+    return m_coeffs.isApprox(other.m_coeffs, prec);
+  }
 };
 
 /** \addtogroup Geometry_Module */
 //@{
 typedef Translation<float, 2> Translation2f;
-typedef Translation<double,2> Translation2d;
+typedef Translation<double, 2> Translation2d;
 typedef Translation<float, 3> Translation3f;
-typedef Translation<double,3> Translation3d;
+typedef Translation<double, 3> Translation3d;
 //@}
 
-template<typename Scalar, int Dim>
-EIGEN_DEVICE_FUNC inline typename Translation<Scalar,Dim>::AffineTransformType
-Translation<Scalar,Dim>::operator* (const UniformScaling<Scalar>& other) const
-{
+template <typename Scalar, int Dim>
+EIGEN_DEVICE_FUNC inline typename Translation<Scalar, Dim>::AffineTransformType Translation<Scalar, Dim>::operator*(
+    const UniformScaling<Scalar>& other) const {
   AffineTransformType res;
   res.matrix().setZero();
   res.linear().diagonal().fill(other.factor());
   res.translation() = m_coeffs;
-  res(Dim,Dim) = Scalar(1);
+  res(Dim, Dim) = Scalar(1);
   return res;
 }
 
-template<typename Scalar, int Dim>
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC inline typename Translation<Scalar,Dim>::AffineTransformType
-Translation<Scalar,Dim>::operator* (const EigenBase<OtherDerived>& linear) const
-{
+template <typename Scalar, int Dim>
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC inline typename Translation<Scalar, Dim>::AffineTransformType Translation<Scalar, Dim>::operator*(
+    const EigenBase<OtherDerived>& linear) const {
   AffineTransformType res;
   res.matrix().setZero();
   res.linear() = linear.derived();
   res.translation() = m_coeffs;
   res.matrix().row(Dim).setZero();
-  res(Dim,Dim) = Scalar(1);
+  res(Dim, Dim) = Scalar(1);
   return res;
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_TRANSLATION_H
+#endif  // EIGEN_TRANSLATION_H
diff --git a/Eigen/src/Geometry/Umeyama.h b/Eigen/src/Geometry/Umeyama.h
index 87c89d6..f8138b9 100644
--- a/Eigen/src/Geometry/Umeyama.h
+++ b/Eigen/src/Geometry/Umeyama.h
@@ -10,16 +10,16 @@
 #ifndef EIGEN_UMEYAMA_H
 #define EIGEN_UMEYAMA_H
 
-// This file requires the user to include 
+// This file requires the user to include
 // * Eigen/Core
-// * Eigen/LU 
+// * Eigen/LU
 // * Eigen/SVD
 // * Eigen/Array
 
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
 
@@ -31,79 +31,76 @@
 // Compile time return type deduction for different MatrixBase types.
 // Different means here different alignment and parameters but the same underlying
 // real scalar type.
-template<typename MatrixType, typename OtherMatrixType>
-struct umeyama_transform_matrix_type
-{
+template <typename MatrixType, typename OtherMatrixType>
+struct umeyama_transform_matrix_type {
   enum {
-    MinRowsAtCompileTime = internal::min_size_prefer_dynamic(MatrixType::RowsAtCompileTime, OtherMatrixType::RowsAtCompileTime),
+    MinRowsAtCompileTime =
+        internal::min_size_prefer_dynamic(MatrixType::RowsAtCompileTime, OtherMatrixType::RowsAtCompileTime),
 
     // When possible we want to choose some small fixed size value since the result
     // is likely to fit on the stack. So here, min_size_prefer_dynamic is not what we want.
-    HomogeneousDimension = int(MinRowsAtCompileTime) == Dynamic ? Dynamic : int(MinRowsAtCompileTime)+1
+    HomogeneousDimension = int(MinRowsAtCompileTime) == Dynamic ? Dynamic : int(MinRowsAtCompileTime) + 1
   };
 
-  typedef Matrix<typename traits<MatrixType>::Scalar,
-    HomogeneousDimension,
-    HomogeneousDimension,
-    AutoAlign | (traits<MatrixType>::Flags & RowMajorBit ? RowMajor : ColMajor),
-    HomogeneousDimension,
-    HomogeneousDimension
-  > type;
+  typedef Matrix<typename traits<MatrixType>::Scalar, HomogeneousDimension, HomogeneousDimension,
+                 AutoAlign | (traits<MatrixType>::Flags & RowMajorBit ? RowMajor : ColMajor), HomogeneousDimension,
+                 HomogeneousDimension>
+      type;
 };
 
-}
+}  // namespace internal
 
 #endif
 
 /**
-* \geometry_module \ingroup Geometry_Module
-*
-* \brief Returns the transformation between two point sets.
-*
-* The algorithm is based on:
-* "Least-squares estimation of transformation parameters between two point patterns",
-* Shinji Umeyama, PAMI 1991, DOI: 10.1109/34.88573
-*
-* It estimates parameters \f$ c, \mathbf{R}, \f$ and \f$ \mathbf{t} \f$ such that
-* \f{align*}
-*   \frac{1}{n} \sum_{i=1}^n \vert\vert y_i - (c\mathbf{R}x_i + \mathbf{t}) \vert\vert_2^2
-* \f}
-* is minimized.
-*
-* The algorithm is based on the analysis of the covariance matrix
-* \f$ \Sigma_{\mathbf{x}\mathbf{y}} \in \mathbb{R}^{d \times d} \f$
-* of the input point sets \f$ \mathbf{x} \f$ and \f$ \mathbf{y} \f$ where 
-* \f$d\f$ is corresponding to the dimension (which is typically small).
-* The analysis is involving the SVD having a complexity of \f$O(d^3)\f$
-* though the actual computational effort lies in the covariance
-* matrix computation which has an asymptotic lower bound of \f$O(dm)\f$ when 
-* the input point sets have dimension \f$d \times m\f$.
-*
-* Currently the method is working only for floating point matrices.
-*
-* \todo Should the return type of umeyama() become a Transform?
-*
-* \param src Source points \f$ \mathbf{x} = \left( x_1, \hdots, x_n \right) \f$.
-* \param dst Destination points \f$ \mathbf{y} = \left( y_1, \hdots, y_n \right) \f$.
-* \param with_scaling Sets \f$ c=1 \f$ when <code>false</code> is passed.
-* \return The homogeneous transformation 
-* \f{align*}
-*   T = \begin{bmatrix} c\mathbf{R} & \mathbf{t} \\ \mathbf{0} & 1 \end{bmatrix}
-* \f}
-* minimizing the residual above. This transformation is always returned as an 
-* Eigen::Matrix.
-*/
+ * \geometry_module \ingroup Geometry_Module
+ *
+ * \brief Returns the transformation between two point sets.
+ *
+ * The algorithm is based on:
+ * "Least-squares estimation of transformation parameters between two point patterns",
+ * Shinji Umeyama, PAMI 1991, DOI: 10.1109/34.88573
+ *
+ * It estimates parameters \f$ c, \mathbf{R}, \f$ and \f$ \mathbf{t} \f$ such that
+ * \f{align*}
+ *   \frac{1}{n} \sum_{i=1}^n \vert\vert y_i - (c\mathbf{R}x_i + \mathbf{t}) \vert\vert_2^2
+ * \f}
+ * is minimized.
+ *
+ * The algorithm is based on the analysis of the covariance matrix
+ * \f$ \Sigma_{\mathbf{x}\mathbf{y}} \in \mathbb{R}^{d \times d} \f$
+ * of the input point sets \f$ \mathbf{x} \f$ and \f$ \mathbf{y} \f$ where
+ * \f$d\f$ is corresponding to the dimension (which is typically small).
+ * The analysis is involving the SVD having a complexity of \f$O(d^3)\f$
+ * though the actual computational effort lies in the covariance
+ * matrix computation which has an asymptotic lower bound of \f$O(dm)\f$ when
+ * the input point sets have dimension \f$d \times m\f$.
+ *
+ * Currently the method is working only for floating point matrices.
+ *
+ * \todo Should the return type of umeyama() become a Transform?
+ *
+ * \param src Source points \f$ \mathbf{x} = \left( x_1, \hdots, x_n \right) \f$.
+ * \param dst Destination points \f$ \mathbf{y} = \left( y_1, \hdots, y_n \right) \f$.
+ * \param with_scaling Sets \f$ c=1 \f$ when <code>false</code> is passed.
+ * \return The homogeneous transformation
+ * \f{align*}
+ *   T = \begin{bmatrix} c\mathbf{R} & \mathbf{t} \\ \mathbf{0} & 1 \end{bmatrix}
+ * \f}
+ * minimizing the residual above. This transformation is always returned as an
+ * Eigen::Matrix.
+ */
 template <typename Derived, typename OtherDerived>
-typename internal::umeyama_transform_matrix_type<Derived, OtherDerived>::type
-umeyama(const MatrixBase<Derived>& src, const MatrixBase<OtherDerived>& dst, bool with_scaling = true)
-{
+typename internal::umeyama_transform_matrix_type<Derived, OtherDerived>::type umeyama(
+    const MatrixBase<Derived>& src, const MatrixBase<OtherDerived>& dst, bool with_scaling = true) {
   typedef typename internal::umeyama_transform_matrix_type<Derived, OtherDerived>::type TransformationMatrixType;
   typedef typename internal::traits<TransformationMatrixType>::Scalar Scalar;
   typedef typename NumTraits<Scalar>::Real RealScalar;
 
   EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::IsComplex, NUMERIC_TYPE_MUST_BE_REAL)
-  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename internal::traits<OtherDerived>::Scalar>::value),
-    YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
+  EIGEN_STATIC_ASSERT(
+      (internal::is_same<Scalar, typename internal::traits<OtherDerived>::Scalar>::value),
+      YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
 
   enum { Dimension = internal::min_size_prefer_dynamic(Derived::RowsAtCompileTime, OtherDerived::RowsAtCompileTime) };
 
@@ -111,8 +108,8 @@
   typedef Matrix<Scalar, Dimension, Dimension> MatrixType;
   typedef typename internal::plain_matrix_type_row_major<Derived>::type RowMajorMatrixType;
 
-  const Index m = src.rows(); // dimension
-  const Index n = src.cols(); // number of measurements
+  const Index m = src.rows();  // dimension
+  const Index n = src.cols();  // number of measurements
 
   // required for demeaning ...
   const RealScalar one_over_n = RealScalar(1) / static_cast<RealScalar>(n);
@@ -131,41 +128,38 @@
   JacobiSVD<MatrixType, ComputeFullU | ComputeFullV> svd(sigma);
 
   // Initialize the resulting transformation with an identity matrix...
-  TransformationMatrixType Rt = TransformationMatrixType::Identity(m+1,m+1);
+  TransformationMatrixType Rt = TransformationMatrixType::Identity(m + 1, m + 1);
 
   // Eq. (39)
   VectorType S = VectorType::Ones(m);
 
-  if  ( svd.matrixU().determinant() * svd.matrixV().determinant() < 0 ) {
-    Index tmp = m - 1;  
+  if (svd.matrixU().determinant() * svd.matrixV().determinant() < 0) {
+    Index tmp = m - 1;
     S(tmp) = -1;
   }
 
   // Eq. (40) and (43)
-  Rt.block(0,0,m,m).noalias() = svd.matrixU() * S.asDiagonal() * svd.matrixV().transpose();
+  Rt.block(0, 0, m, m).noalias() = svd.matrixU() * S.asDiagonal() * svd.matrixV().transpose();
 
-  if (with_scaling)
-  {
+  if (with_scaling) {
     // Eq. (36)-(37)
     const Scalar src_var = src_demean.rowwise().squaredNorm().sum() * one_over_n;
 
     // Eq. (42)
-    const Scalar c = Scalar(1)/src_var * svd.singularValues().dot(S);
+    const Scalar c = Scalar(1) / src_var * svd.singularValues().dot(S);
 
     // Eq. (41)
     Rt.col(m).head(m) = dst_mean;
-    Rt.col(m).head(m).noalias() -= c*Rt.topLeftCorner(m,m)*src_mean;
-    Rt.block(0,0,m,m) *= c;
-  }
-  else
-  {
+    Rt.col(m).head(m).noalias() -= c * Rt.topLeftCorner(m, m) * src_mean;
+    Rt.block(0, 0, m, m) *= c;
+  } else {
     Rt.col(m).head(m) = dst_mean;
-    Rt.col(m).head(m).noalias() -= Rt.topLeftCorner(m,m)*src_mean;
+    Rt.col(m).head(m).noalias() -= Rt.topLeftCorner(m, m) * src_mean;
   }
 
   return Rt;
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_UMEYAMA_H
+#endif  // EIGEN_UMEYAMA_H
diff --git a/Eigen/src/Geometry/arch/Geometry_SIMD.h b/Eigen/src/Geometry/arch/Geometry_SIMD.h
index d280fbf..ce3cfea 100644
--- a/Eigen/src/Geometry/arch/Geometry_SIMD.h
+++ b/Eigen/src/Geometry/arch/Geometry_SIMD.h
@@ -14,158 +14,136 @@
 // IWYU pragma: private
 #include "../InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
-template<class Derived, class OtherDerived>
-struct quat_product<Architecture::Target, Derived, OtherDerived, float>
-{
+template <class Derived, class OtherDerived>
+struct quat_product<Architecture::Target, Derived, OtherDerived, float> {
   enum {
     AAlignment = traits<Derived>::Alignment,
     BAlignment = traits<OtherDerived>::Alignment,
     ResAlignment = traits<Quaternion<float> >::Alignment
   };
-  static inline Quaternion<float> run(const QuaternionBase<Derived>& _a, const QuaternionBase<OtherDerived>& _b)
-  {
+  static inline Quaternion<float> run(const QuaternionBase<Derived>& _a, const QuaternionBase<OtherDerived>& _b) {
     evaluator<typename Derived::Coefficients> ae(_a.coeffs());
     evaluator<typename OtherDerived::Coefficients> be(_b.coeffs());
     Quaternion<float> res;
     const float neg_zero = numext::bit_cast<float>(0x80000000u);
     const float arr[4] = {0.f, 0.f, 0.f, neg_zero};
     const Packet4f mask = ploadu<Packet4f>(arr);
-    Packet4f a = ae.template packet<AAlignment,Packet4f>(0);
-    Packet4f b = be.template packet<BAlignment,Packet4f>(0);
-    Packet4f s1 = pmul(vec4f_swizzle1(a,1,2,0,2),vec4f_swizzle1(b,2,0,1,2));
-    Packet4f s2 = pmul(vec4f_swizzle1(a,3,3,3,1),vec4f_swizzle1(b,0,1,2,1));
-    pstoret<float,Packet4f,ResAlignment>(
-              &res.x(),
-              padd(psub(pmul(a,vec4f_swizzle1(b,3,3,3,3)),
-                                    pmul(vec4f_swizzle1(a,2,0,1,0),
-                                               vec4f_swizzle1(b,1,2,0,0))),
-                         pxor(mask,padd(s1,s2))));
-    
+    Packet4f a = ae.template packet<AAlignment, Packet4f>(0);
+    Packet4f b = be.template packet<BAlignment, Packet4f>(0);
+    Packet4f s1 = pmul(vec4f_swizzle1(a, 1, 2, 0, 2), vec4f_swizzle1(b, 2, 0, 1, 2));
+    Packet4f s2 = pmul(vec4f_swizzle1(a, 3, 3, 3, 1), vec4f_swizzle1(b, 0, 1, 2, 1));
+    pstoret<float, Packet4f, ResAlignment>(
+        &res.x(), padd(psub(pmul(a, vec4f_swizzle1(b, 3, 3, 3, 3)),
+                            pmul(vec4f_swizzle1(a, 2, 0, 1, 0), vec4f_swizzle1(b, 1, 2, 0, 0))),
+                       pxor(mask, padd(s1, s2))));
+
     return res;
   }
 };
 
-template<class Derived>
-struct quat_conj<Architecture::Target, Derived, float>
-{
-  enum {
-    ResAlignment = traits<Quaternion<float> >::Alignment
-  };
-  static inline Quaternion<float> run(const QuaternionBase<Derived>& q)
-  {
+template <class Derived>
+struct quat_conj<Architecture::Target, Derived, float> {
+  enum { ResAlignment = traits<Quaternion<float> >::Alignment };
+  static inline Quaternion<float> run(const QuaternionBase<Derived>& q) {
     evaluator<typename Derived::Coefficients> qe(q.coeffs());
     Quaternion<float> res;
     const float neg_zero = numext::bit_cast<float>(0x80000000u);
-    const float arr[4] = {neg_zero, neg_zero, neg_zero,0.f};
+    const float arr[4] = {neg_zero, neg_zero, neg_zero, 0.f};
     const Packet4f mask = ploadu<Packet4f>(arr);
-    pstoret<float,Packet4f,ResAlignment>(&res.x(), pxor(mask, qe.template packet<traits<Derived>::Alignment,Packet4f>(0)));
+    pstoret<float, Packet4f, ResAlignment>(&res.x(),
+                                           pxor(mask, qe.template packet<traits<Derived>::Alignment, Packet4f>(0)));
     return res;
   }
 };
 
-
-template<typename VectorLhs,typename VectorRhs>
-struct cross3_impl<Architecture::Target,VectorLhs,VectorRhs,float,true>
-{
-  enum {
-    ResAlignment = traits<typename plain_matrix_type<VectorLhs>::type>::Alignment
-  };
-  static inline typename plain_matrix_type<VectorLhs>::type
-  run(const VectorLhs& lhs, const VectorRhs& rhs)
-  {
+template <typename VectorLhs, typename VectorRhs>
+struct cross3_impl<Architecture::Target, VectorLhs, VectorRhs, float, true> {
+  enum { ResAlignment = traits<typename plain_matrix_type<VectorLhs>::type>::Alignment };
+  static inline typename plain_matrix_type<VectorLhs>::type run(const VectorLhs& lhs, const VectorRhs& rhs) {
     evaluator<VectorLhs> lhs_eval(lhs);
     evaluator<VectorRhs> rhs_eval(rhs);
-    Packet4f a = lhs_eval.template packet<traits<VectorLhs>::Alignment,Packet4f>(0);
-    Packet4f b = rhs_eval.template packet<traits<VectorRhs>::Alignment,Packet4f>(0);
-    Packet4f mul1 = pmul(vec4f_swizzle1(a,1,2,0,3),vec4f_swizzle1(b,2,0,1,3));
-    Packet4f mul2 = pmul(vec4f_swizzle1(a,2,0,1,3),vec4f_swizzle1(b,1,2,0,3));
+    Packet4f a = lhs_eval.template packet<traits<VectorLhs>::Alignment, Packet4f>(0);
+    Packet4f b = rhs_eval.template packet<traits<VectorRhs>::Alignment, Packet4f>(0);
+    Packet4f mul1 = pmul(vec4f_swizzle1(a, 1, 2, 0, 3), vec4f_swizzle1(b, 2, 0, 1, 3));
+    Packet4f mul2 = pmul(vec4f_swizzle1(a, 2, 0, 1, 3), vec4f_swizzle1(b, 1, 2, 0, 3));
     typename plain_matrix_type<VectorLhs>::type res;
-    pstoret<float,Packet4f,ResAlignment>(&res.x(),psub(mul1,mul2));
+    pstoret<float, Packet4f, ResAlignment>(&res.x(), psub(mul1, mul2));
     return res;
   }
 };
 
-
-
 #if (defined EIGEN_VECTORIZE_SSE) || (EIGEN_ARCH_ARM64)
 
-template<class Derived, class OtherDerived>
-struct quat_product<Architecture::Target, Derived, OtherDerived, double>
-{
-  enum {
-    BAlignment = traits<OtherDerived>::Alignment,
-    ResAlignment = traits<Quaternion<double> >::Alignment
-  };
+template <class Derived, class OtherDerived>
+struct quat_product<Architecture::Target, Derived, OtherDerived, double> {
+  enum { BAlignment = traits<OtherDerived>::Alignment, ResAlignment = traits<Quaternion<double> >::Alignment };
 
-  static inline Quaternion<double> run(const QuaternionBase<Derived>& _a, const QuaternionBase<OtherDerived>& _b)
-  {
-  Quaternion<double> res;
+  static inline Quaternion<double> run(const QuaternionBase<Derived>& _a, const QuaternionBase<OtherDerived>& _b) {
+    Quaternion<double> res;
 
-  evaluator<typename Derived::Coefficients> ae(_a.coeffs());
-  evaluator<typename OtherDerived::Coefficients> be(_b.coeffs());
+    evaluator<typename Derived::Coefficients> ae(_a.coeffs());
+    evaluator<typename OtherDerived::Coefficients> be(_b.coeffs());
 
-  const double* a = _a.coeffs().data();
-  Packet2d b_xy = be.template packet<BAlignment,Packet2d>(0);
-  Packet2d b_zw = be.template packet<BAlignment,Packet2d>(2);
-  Packet2d a_xx = pset1<Packet2d>(a[0]);
-  Packet2d a_yy = pset1<Packet2d>(a[1]);
-  Packet2d a_zz = pset1<Packet2d>(a[2]);
-  Packet2d a_ww = pset1<Packet2d>(a[3]);
+    const double* a = _a.coeffs().data();
+    Packet2d b_xy = be.template packet<BAlignment, Packet2d>(0);
+    Packet2d b_zw = be.template packet<BAlignment, Packet2d>(2);
+    Packet2d a_xx = pset1<Packet2d>(a[0]);
+    Packet2d a_yy = pset1<Packet2d>(a[1]);
+    Packet2d a_zz = pset1<Packet2d>(a[2]);
+    Packet2d a_ww = pset1<Packet2d>(a[3]);
 
-  // two temporaries:
-  Packet2d t1, t2;
+    // two temporaries:
+    Packet2d t1, t2;
 
-  /*
-   * t1 = ww*xy + yy*zw
-   * t2 = zz*xy - xx*zw
-   * res.xy = t1 +/- swap(t2)
-   */
-  t1 = padd(pmul(a_ww, b_xy), pmul(a_yy, b_zw));
-  t2 = psub(pmul(a_zz, b_xy), pmul(a_xx, b_zw));
-  pstoret<double,Packet2d,ResAlignment>(&res.x(), paddsub(t1, preverse(t2)));
-  
-  /*
-   * t1 = ww*zw - yy*xy
-   * t2 = zz*zw + xx*xy
-   * res.zw = t1 -/+ swap(t2) = swap( swap(t1) +/- t2)
-   */
-  t1 = psub(pmul(a_ww, b_zw), pmul(a_yy, b_xy));
-  t2 = padd(pmul(a_zz, b_zw), pmul(a_xx, b_xy));
-  pstoret<double,Packet2d,ResAlignment>(&res.z(), preverse(paddsub(preverse(t1), t2)));
+    /*
+     * t1 = ww*xy + yy*zw
+     * t2 = zz*xy - xx*zw
+     * res.xy = t1 +/- swap(t2)
+     */
+    t1 = padd(pmul(a_ww, b_xy), pmul(a_yy, b_zw));
+    t2 = psub(pmul(a_zz, b_xy), pmul(a_xx, b_zw));
+    pstoret<double, Packet2d, ResAlignment>(&res.x(), paddsub(t1, preverse(t2)));
 
-  return res;
-}
+    /*
+     * t1 = ww*zw - yy*xy
+     * t2 = zz*zw + xx*xy
+     * res.zw = t1 -/+ swap(t2) = swap( swap(t1) +/- t2)
+     */
+    t1 = psub(pmul(a_ww, b_zw), pmul(a_yy, b_xy));
+    t2 = padd(pmul(a_zz, b_zw), pmul(a_xx, b_xy));
+    pstoret<double, Packet2d, ResAlignment>(&res.z(), preverse(paddsub(preverse(t1), t2)));
+
+    return res;
+  }
 };
 
-template<class Derived>
-struct quat_conj<Architecture::Target, Derived, double>
-{
-  enum {
-    ResAlignment = traits<Quaternion<double> >::Alignment
-  };
-  static inline Quaternion<double> run(const QuaternionBase<Derived>& q)
-  {
+template <class Derived>
+struct quat_conj<Architecture::Target, Derived, double> {
+  enum { ResAlignment = traits<Quaternion<double> >::Alignment };
+  static inline Quaternion<double> run(const QuaternionBase<Derived>& q) {
     evaluator<typename Derived::Coefficients> qe(q.coeffs());
     Quaternion<double> res;
     const double neg_zero = numext::bit_cast<double>(0x8000000000000000ull);
     const double arr1[2] = {neg_zero, neg_zero};
-    const double arr2[2] = {neg_zero,  0.0};
+    const double arr2[2] = {neg_zero, 0.0};
     const Packet2d mask0 = ploadu<Packet2d>(arr1);
     const Packet2d mask2 = ploadu<Packet2d>(arr2);
-    pstoret<double,Packet2d,ResAlignment>(&res.x(), pxor(mask0, qe.template packet<traits<Derived>::Alignment,Packet2d>(0)));
-    pstoret<double,Packet2d,ResAlignment>(&res.z(), pxor(mask2, qe.template packet<traits<Derived>::Alignment,Packet2d>(2)));
+    pstoret<double, Packet2d, ResAlignment>(&res.x(),
+                                            pxor(mask0, qe.template packet<traits<Derived>::Alignment, Packet2d>(0)));
+    pstoret<double, Packet2d, ResAlignment>(&res.z(),
+                                            pxor(mask2, qe.template packet<traits<Derived>::Alignment, Packet2d>(2)));
     return res;
   }
 };
 
-#endif // end EIGEN_VECTORIZE_SSE_OR_EIGEN_ARCH_ARM64
+#endif  // end EIGEN_VECTORIZE_SSE_OR_EIGEN_ARCH_ARM64
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_GEOMETRY_SIMD_H
+#endif  // EIGEN_GEOMETRY_SIMD_H
diff --git a/Eigen/src/Householder/BlockHouseholder.h b/Eigen/src/Householder/BlockHouseholder.h
index 5896f87..1d6cc1c 100644
--- a/Eigen/src/Householder/BlockHouseholder.h
+++ b/Eigen/src/Householder/BlockHouseholder.h
@@ -16,23 +16,24 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
-  
+
 /** \internal */
 // template<typename TriangularFactorType,typename VectorsType,typename CoeffsType>
-// void make_block_householder_triangular_factor(TriangularFactorType& triFactor, const VectorsType& vectors, const CoeffsType& hCoeffs)
+// void make_block_householder_triangular_factor(TriangularFactorType& triFactor, const VectorsType& vectors, const
+// CoeffsType& hCoeffs)
 // {
 //   typedef typename VectorsType::Scalar Scalar;
 //   const Index nbVecs = vectors.cols();
 //   eigen_assert(triFactor.rows() == nbVecs && triFactor.cols() == nbVecs && vectors.rows()>=nbVecs);
-// 
+//
 //   for(Index i = 0; i < nbVecs; i++)
 //   {
 //     Index rs = vectors.rows() - i;
 //     // Warning, note that hCoeffs may alias with vectors.
-//     // It is then necessary to copy it before modifying vectors(i,i). 
+//     // It is then necessary to copy it before modifying vectors(i,i).
 //     typename CoeffsType::Scalar h = hCoeffs(i);
 //     // This hack permits to pass trough nested Block<> and Transpose<> expressions.
 //     Scalar *Vii_ptr = const_cast<Scalar*>(vectors.data() + vectors.outerStride()*i + vectors.innerStride()*i);
@@ -50,64 +51,65 @@
 
 /** \internal */
 // This variant avoid modifications in vectors
-template<typename TriangularFactorType,typename VectorsType,typename CoeffsType>
-void make_block_householder_triangular_factor(TriangularFactorType& triFactor, const VectorsType& vectors, const CoeffsType& hCoeffs)
-{
+template <typename TriangularFactorType, typename VectorsType, typename CoeffsType>
+void make_block_householder_triangular_factor(TriangularFactorType& triFactor, const VectorsType& vectors,
+                                              const CoeffsType& hCoeffs) {
   const Index nbVecs = vectors.cols();
-  eigen_assert(triFactor.rows() == nbVecs && triFactor.cols() == nbVecs && vectors.rows()>=nbVecs);
+  eigen_assert(triFactor.rows() == nbVecs && triFactor.cols() == nbVecs && vectors.rows() >= nbVecs);
 
-  for(Index i = nbVecs-1; i >=0 ; --i)
-  {
+  for (Index i = nbVecs - 1; i >= 0; --i) {
     Index rs = vectors.rows() - i - 1;
-    Index rt = nbVecs-i-1;
+    Index rt = nbVecs - i - 1;
 
-    if(rt>0)
-    {
-      triFactor.row(i).tail(rt).noalias() = -hCoeffs(i) * vectors.col(i).tail(rs).adjoint()
-                                                        * vectors.bottomRightCorner(rs, rt).template triangularView<UnitLower>();
-            
+    if (rt > 0) {
+      triFactor.row(i).tail(rt).noalias() = -hCoeffs(i) * vectors.col(i).tail(rs).adjoint() *
+                                            vectors.bottomRightCorner(rs, rt).template triangularView<UnitLower>();
+
       // FIXME use the following line with .noalias() once the triangular product can work inplace
-      // triFactor.row(i).tail(rt) = triFactor.row(i).tail(rt) * triFactor.bottomRightCorner(rt,rt).template triangularView<Upper>();
-      for(Index j=nbVecs-1; j>i; --j)
-      {
-        typename TriangularFactorType::Scalar z = triFactor(i,j);
-        triFactor(i,j) = z * triFactor(j,j);
-        if(nbVecs-j-1>0)
-          triFactor.row(i).tail(nbVecs-j-1) += z * triFactor.row(j).tail(nbVecs-j-1);
+      // triFactor.row(i).tail(rt) = triFactor.row(i).tail(rt) * triFactor.bottomRightCorner(rt,rt).template
+      // triangularView<Upper>();
+      for (Index j = nbVecs - 1; j > i; --j) {
+        typename TriangularFactorType::Scalar z = triFactor(i, j);
+        triFactor(i, j) = z * triFactor(j, j);
+        if (nbVecs - j - 1 > 0) triFactor.row(i).tail(nbVecs - j - 1) += z * triFactor.row(j).tail(nbVecs - j - 1);
       }
-      
     }
-    triFactor(i,i) = hCoeffs(i);
+    triFactor(i, i) = hCoeffs(i);
   }
 }
 
 /** \internal
-  * if forward then perform   mat = H0 * H1 * H2 * mat
-  * otherwise perform         mat = H2 * H1 * H0 * mat
-  */
-template<typename MatrixType,typename VectorsType,typename CoeffsType>
-void apply_block_householder_on_the_left(MatrixType& mat, const VectorsType& vectors, const CoeffsType& hCoeffs, bool forward)
-{
+ * if forward then perform   mat = H0 * H1 * H2 * mat
+ * otherwise perform         mat = H2 * H1 * H0 * mat
+ */
+template <typename MatrixType, typename VectorsType, typename CoeffsType>
+void apply_block_householder_on_the_left(MatrixType& mat, const VectorsType& vectors, const CoeffsType& hCoeffs,
+                                         bool forward) {
   enum { TFactorSize = VectorsType::ColsAtCompileTime };
   Index nbVecs = vectors.cols();
-  Matrix<typename MatrixType::Scalar, TFactorSize, TFactorSize, RowMajor> T(nbVecs,nbVecs);
-  
-  if(forward) make_block_householder_triangular_factor(T, vectors, hCoeffs);
-  else        make_block_householder_triangular_factor(T, vectors, hCoeffs.conjugate());  
+  Matrix<typename MatrixType::Scalar, TFactorSize, TFactorSize, RowMajor> T(nbVecs, nbVecs);
+
+  if (forward)
+    make_block_householder_triangular_factor(T, vectors, hCoeffs);
+  else
+    make_block_householder_triangular_factor(T, vectors, hCoeffs.conjugate());
   const TriangularView<const VectorsType, UnitLower> V(vectors);
 
   // A -= V T V^* A
-  Matrix<typename MatrixType::Scalar,VectorsType::ColsAtCompileTime,MatrixType::ColsAtCompileTime,
-         (VectorsType::MaxColsAtCompileTime==1 && MatrixType::MaxColsAtCompileTime!=1)?RowMajor:ColMajor,
-         VectorsType::MaxColsAtCompileTime,MatrixType::MaxColsAtCompileTime> tmp = V.adjoint() * mat;
+  Matrix<typename MatrixType::Scalar, VectorsType::ColsAtCompileTime, MatrixType::ColsAtCompileTime,
+         (VectorsType::MaxColsAtCompileTime == 1 && MatrixType::MaxColsAtCompileTime != 1) ? RowMajor : ColMajor,
+         VectorsType::MaxColsAtCompileTime, MatrixType::MaxColsAtCompileTime>
+      tmp = V.adjoint() * mat;
   // FIXME add .noalias() once the triangular product can work inplace
-  if(forward) tmp = T.template triangularView<Upper>()           * tmp;
-  else        tmp = T.template triangularView<Upper>().adjoint() * tmp;
+  if (forward)
+    tmp = T.template triangularView<Upper>() * tmp;
+  else
+    tmp = T.template triangularView<Upper>().adjoint() * tmp;
   mat.noalias() -= V * tmp;
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_BLOCK_HOUSEHOLDER_H
+#endif  // EIGEN_BLOCK_HOUSEHOLDER_H
diff --git a/Eigen/src/Householder/Householder.h b/Eigen/src/Householder/Householder.h
index 0010d1f..96b1daf 100644
--- a/Eigen/src/Householder/Householder.h
+++ b/Eigen/src/Householder/Householder.h
@@ -14,121 +14,103 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
-template<int n> struct decrement_size
-{
-  enum {
-    ret = n==Dynamic ? n : n-1
-  };
+template <int n>
+struct decrement_size {
+  enum { ret = n == Dynamic ? n : n - 1 };
 };
-}
+}  // namespace internal
 
 /** Computes the elementary reflector H such that:
-  * \f$ H *this = [ beta 0 ... 0]^T \f$
-  * where the transformation H is:
-  * \f$ H = I - tau v v^*\f$
-  * and the vector v is:
-  * \f$ v^T = [1 essential^T] \f$
-  *
-  * The essential part of the vector \c v is stored in *this.
-  * 
-  * On output:
-  * \param tau the scaling factor of the Householder transformation
-  * \param beta the result of H * \c *this
-  *
-  * \sa MatrixBase::makeHouseholder(), MatrixBase::applyHouseholderOnTheLeft(),
-  *     MatrixBase::applyHouseholderOnTheRight()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC
-void MatrixBase<Derived>::makeHouseholderInPlace(Scalar& tau, RealScalar& beta)
-{
-  VectorBlock<Derived, internal::decrement_size<Base::SizeAtCompileTime>::ret> essentialPart(derived(), 1, size()-1);
+ * \f$ H *this = [ beta 0 ... 0]^T \f$
+ * where the transformation H is:
+ * \f$ H = I - tau v v^*\f$
+ * and the vector v is:
+ * \f$ v^T = [1 essential^T] \f$
+ *
+ * The essential part of the vector \c v is stored in *this.
+ *
+ * On output:
+ * \param tau the scaling factor of the Householder transformation
+ * \param beta the result of H * \c *this
+ *
+ * \sa MatrixBase::makeHouseholder(), MatrixBase::applyHouseholderOnTheLeft(),
+ *     MatrixBase::applyHouseholderOnTheRight()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC void MatrixBase<Derived>::makeHouseholderInPlace(Scalar& tau, RealScalar& beta) {
+  VectorBlock<Derived, internal::decrement_size<Base::SizeAtCompileTime>::ret> essentialPart(derived(), 1, size() - 1);
   makeHouseholder(essentialPart, tau, beta);
 }
 
 /** Computes the elementary reflector H such that:
-  * \f$ H *this = [ beta 0 ... 0]^T \f$
-  * where the transformation H is:
-  * \f$ H = I - tau v v^*\f$
-  * and the vector v is:
-  * \f$ v^T = [1 essential^T] \f$
-  *
-  * On output:
-  * \param essential the essential part of the vector \c v
-  * \param tau the scaling factor of the Householder transformation
-  * \param beta the result of H * \c *this
-  *
-  * \sa MatrixBase::makeHouseholderInPlace(), MatrixBase::applyHouseholderOnTheLeft(),
-  *     MatrixBase::applyHouseholderOnTheRight()
-  */
-template<typename Derived>
-template<typename EssentialPart>
-EIGEN_DEVICE_FUNC
-void MatrixBase<Derived>::makeHouseholder(
-  EssentialPart& essential,
-  Scalar& tau,
-  RealScalar& beta) const
-{
-  using numext::sqrt;
+ * \f$ H *this = [ beta 0 ... 0]^T \f$
+ * where the transformation H is:
+ * \f$ H = I - tau v v^*\f$
+ * and the vector v is:
+ * \f$ v^T = [1 essential^T] \f$
+ *
+ * On output:
+ * \param essential the essential part of the vector \c v
+ * \param tau the scaling factor of the Householder transformation
+ * \param beta the result of H * \c *this
+ *
+ * \sa MatrixBase::makeHouseholderInPlace(), MatrixBase::applyHouseholderOnTheLeft(),
+ *     MatrixBase::applyHouseholderOnTheRight()
+ */
+template <typename Derived>
+template <typename EssentialPart>
+EIGEN_DEVICE_FUNC void MatrixBase<Derived>::makeHouseholder(EssentialPart& essential, Scalar& tau,
+                                                            RealScalar& beta) const {
   using numext::conj;
-  
+  using numext::sqrt;
+
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(EssentialPart)
-  VectorBlock<const Derived, EssentialPart::SizeAtCompileTime> tail(derived(), 1, size()-1);
-  
-  RealScalar tailSqNorm = size()==1 ? RealScalar(0) : tail.squaredNorm();
+  VectorBlock<const Derived, EssentialPart::SizeAtCompileTime> tail(derived(), 1, size() - 1);
+
+  RealScalar tailSqNorm = size() == 1 ? RealScalar(0) : tail.squaredNorm();
   Scalar c0 = coeff(0);
   const RealScalar tol = (std::numeric_limits<RealScalar>::min)();
 
-  if(tailSqNorm <= tol && numext::abs2(numext::imag(c0))<=tol)
-  {
+  if (tailSqNorm <= tol && numext::abs2(numext::imag(c0)) <= tol) {
     tau = RealScalar(0);
     beta = numext::real(c0);
     essential.setZero();
-  }
-  else
-  {
+  } else {
     beta = sqrt(numext::abs2(c0) + tailSqNorm);
-    if (numext::real(c0)>=RealScalar(0))
-      beta = -beta;
+    if (numext::real(c0) >= RealScalar(0)) beta = -beta;
     essential = tail / (c0 - beta);
     tau = conj((beta - c0) / beta);
   }
 }
 
 /** Apply the elementary reflector H given by
-  * \f$ H = I - tau v v^*\f$
-  * with
-  * \f$ v^T = [1 essential^T] \f$
-  * from the left to a vector or matrix.
-  *
-  * On input:
-  * \param essential the essential part of the vector \c v
-  * \param tau the scaling factor of the Householder transformation
-  * \param workspace a pointer to working space with at least
-  *                  this->cols() entries
-  *
-  * \sa MatrixBase::makeHouseholder(), MatrixBase::makeHouseholderInPlace(), 
-  *     MatrixBase::applyHouseholderOnTheRight()
-  */
-template<typename Derived>
-template<typename EssentialPart>
-EIGEN_DEVICE_FUNC
-void MatrixBase<Derived>::applyHouseholderOnTheLeft(
-  const EssentialPart& essential,
-  const Scalar& tau,
-  Scalar* workspace)
-{
-  if(rows() == 1)
-  {
-    *this *= Scalar(1)-tau;
-  }
-  else if(!numext::is_exactly_zero(tau))
-  {
-    Map<typename internal::plain_row_type<PlainObject>::type> tmp(workspace,cols());
-    Block<Derived, EssentialPart::SizeAtCompileTime, Derived::ColsAtCompileTime> bottom(derived(), 1, 0, rows()-1, cols());
+ * \f$ H = I - tau v v^*\f$
+ * with
+ * \f$ v^T = [1 essential^T] \f$
+ * from the left to a vector or matrix.
+ *
+ * On input:
+ * \param essential the essential part of the vector \c v
+ * \param tau the scaling factor of the Householder transformation
+ * \param workspace a pointer to working space with at least
+ *                  this->cols() entries
+ *
+ * \sa MatrixBase::makeHouseholder(), MatrixBase::makeHouseholderInPlace(),
+ *     MatrixBase::applyHouseholderOnTheRight()
+ */
+template <typename Derived>
+template <typename EssentialPart>
+EIGEN_DEVICE_FUNC void MatrixBase<Derived>::applyHouseholderOnTheLeft(const EssentialPart& essential, const Scalar& tau,
+                                                                      Scalar* workspace) {
+  if (rows() == 1) {
+    *this *= Scalar(1) - tau;
+  } else if (!numext::is_exactly_zero(tau)) {
+    Map<typename internal::plain_row_type<PlainObject>::type> tmp(workspace, cols());
+    Block<Derived, EssentialPart::SizeAtCompileTime, Derived::ColsAtCompileTime> bottom(derived(), 1, 0, rows() - 1,
+                                                                                        cols());
     tmp.noalias() = essential.adjoint() * bottom;
     tmp += this->row(0);
     this->row(0) -= tau * tmp;
@@ -137,36 +119,30 @@
 }
 
 /** Apply the elementary reflector H given by
-  * \f$ H = I - tau v v^*\f$
-  * with
-  * \f$ v^T = [1 essential^T] \f$
-  * from the right to a vector or matrix.
-  *
-  * On input:
-  * \param essential the essential part of the vector \c v
-  * \param tau the scaling factor of the Householder transformation
-  * \param workspace a pointer to working space with at least
-  *                  this->rows() entries
-  *
-  * \sa MatrixBase::makeHouseholder(), MatrixBase::makeHouseholderInPlace(), 
-  *     MatrixBase::applyHouseholderOnTheLeft()
-  */
-template<typename Derived>
-template<typename EssentialPart>
-EIGEN_DEVICE_FUNC
-void MatrixBase<Derived>::applyHouseholderOnTheRight(
-  const EssentialPart& essential,
-  const Scalar& tau,
-  Scalar* workspace)
-{
-  if(cols() == 1)
-  {
-    *this *= Scalar(1)-tau;
-  }
-  else if(!numext::is_exactly_zero(tau))
-  {
-    Map<typename internal::plain_col_type<PlainObject>::type> tmp(workspace,rows());
-    Block<Derived, Derived::RowsAtCompileTime, EssentialPart::SizeAtCompileTime> right(derived(), 0, 1, rows(), cols()-1);
+ * \f$ H = I - tau v v^*\f$
+ * with
+ * \f$ v^T = [1 essential^T] \f$
+ * from the right to a vector or matrix.
+ *
+ * On input:
+ * \param essential the essential part of the vector \c v
+ * \param tau the scaling factor of the Householder transformation
+ * \param workspace a pointer to working space with at least
+ *                  this->rows() entries
+ *
+ * \sa MatrixBase::makeHouseholder(), MatrixBase::makeHouseholderInPlace(),
+ *     MatrixBase::applyHouseholderOnTheLeft()
+ */
+template <typename Derived>
+template <typename EssentialPart>
+EIGEN_DEVICE_FUNC void MatrixBase<Derived>::applyHouseholderOnTheRight(const EssentialPart& essential,
+                                                                       const Scalar& tau, Scalar* workspace) {
+  if (cols() == 1) {
+    *this *= Scalar(1) - tau;
+  } else if (!numext::is_exactly_zero(tau)) {
+    Map<typename internal::plain_col_type<PlainObject>::type> tmp(workspace, rows());
+    Block<Derived, Derived::RowsAtCompileTime, EssentialPart::SizeAtCompileTime> right(derived(), 0, 1, rows(),
+                                                                                       cols() - 1);
     tmp.noalias() = right * essential;
     tmp += this->col(0);
     this->col(0) -= tau * tmp;
@@ -174,6 +150,6 @@
   }
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_HOUSEHOLDER_H
+#endif  // EIGEN_HOUSEHOLDER_H
diff --git a/Eigen/src/Householder/HouseholderSequence.h b/Eigen/src/Householder/HouseholderSequence.h
index 132d049..024c4a4 100644
--- a/Eigen/src/Householder/HouseholderSequence.h
+++ b/Eigen/src/Householder/HouseholderSequence.h
@@ -17,60 +17,59 @@
 namespace Eigen {
 
 /** \ingroup Householder_Module
-  * \householder_module
-  * \class HouseholderSequence
-  * \brief Sequence of Householder reflections acting on subspaces with decreasing size
-  * \tparam VectorsType type of matrix containing the Householder vectors
-  * \tparam CoeffsType  type of vector containing the Householder coefficients
-  * \tparam Side        either OnTheLeft (the default) or OnTheRight
-  *
-  * This class represents a product sequence of Householder reflections where the first Householder reflection
-  * acts on the whole space, the second Householder reflection leaves the one-dimensional subspace spanned by
-  * the first unit vector invariant, the third Householder reflection leaves the two-dimensional subspace
-  * spanned by the first two unit vectors invariant, and so on up to the last reflection which leaves all but
-  * one dimensions invariant and acts only on the last dimension. Such sequences of Householder reflections
-  * are used in several algorithms to zero out certain parts of a matrix. Indeed, the methods
-  * HessenbergDecomposition::matrixQ(), Tridiagonalization::matrixQ(), HouseholderQR::householderQ(),
-  * and ColPivHouseholderQR::householderQ() all return a %HouseholderSequence.
-  *
-  * More precisely, the class %HouseholderSequence represents an \f$ n \times n \f$ matrix \f$ H \f$ of the
-  * form \f$ H = \prod_{i=0}^{n-1} H_i \f$ where the i-th Householder reflection is \f$ H_i = I - h_i v_i
-  * v_i^* \f$. The i-th Householder coefficient \f$ h_i \f$ is a scalar and the i-th Householder vector \f$
-  * v_i \f$ is a vector of the form
-  * \f[
-  * v_i = [\underbrace{0, \ldots, 0}_{i-1\mbox{ zeros}}, 1, \underbrace{*, \ldots,*}_{n-i\mbox{ arbitrary entries}} ].
-  * \f]
-  * The last \f$ n-i \f$ entries of \f$ v_i \f$ are called the essential part of the Householder vector.
-  *
-  * Typical usages are listed below, where H is a HouseholderSequence:
-  * \code
-  * A.applyOnTheRight(H);             // A = A * H
-  * A.applyOnTheLeft(H);              // A = H * A
-  * A.applyOnTheRight(H.adjoint());   // A = A * H^*
-  * A.applyOnTheLeft(H.adjoint());    // A = H^* * A
-  * MatrixXd Q = H;                   // conversion to a dense matrix
-  * \endcode
-  * In addition to the adjoint, you can also apply the inverse (=adjoint), the transpose, and the conjugate operators.
-  *
-  * See the documentation for HouseholderSequence(const VectorsType&, const CoeffsType&) for an example.
-  *
-  * \sa MatrixBase::applyOnTheLeft(), MatrixBase::applyOnTheRight()
-  */
+ * \householder_module
+ * \class HouseholderSequence
+ * \brief Sequence of Householder reflections acting on subspaces with decreasing size
+ * \tparam VectorsType type of matrix containing the Householder vectors
+ * \tparam CoeffsType  type of vector containing the Householder coefficients
+ * \tparam Side        either OnTheLeft (the default) or OnTheRight
+ *
+ * This class represents a product sequence of Householder reflections where the first Householder reflection
+ * acts on the whole space, the second Householder reflection leaves the one-dimensional subspace spanned by
+ * the first unit vector invariant, the third Householder reflection leaves the two-dimensional subspace
+ * spanned by the first two unit vectors invariant, and so on up to the last reflection which leaves all but
+ * one dimensions invariant and acts only on the last dimension. Such sequences of Householder reflections
+ * are used in several algorithms to zero out certain parts of a matrix. Indeed, the methods
+ * HessenbergDecomposition::matrixQ(), Tridiagonalization::matrixQ(), HouseholderQR::householderQ(),
+ * and ColPivHouseholderQR::householderQ() all return a %HouseholderSequence.
+ *
+ * More precisely, the class %HouseholderSequence represents an \f$ n \times n \f$ matrix \f$ H \f$ of the
+ * form \f$ H = \prod_{i=0}^{n-1} H_i \f$ where the i-th Householder reflection is \f$ H_i = I - h_i v_i
+ * v_i^* \f$. The i-th Householder coefficient \f$ h_i \f$ is a scalar and the i-th Householder vector \f$
+ * v_i \f$ is a vector of the form
+ * \f[
+ * v_i = [\underbrace{0, \ldots, 0}_{i-1\mbox{ zeros}}, 1, \underbrace{*, \ldots,*}_{n-i\mbox{ arbitrary entries}} ].
+ * \f]
+ * The last \f$ n-i \f$ entries of \f$ v_i \f$ are called the essential part of the Householder vector.
+ *
+ * Typical usages are listed below, where H is a HouseholderSequence:
+ * \code
+ * A.applyOnTheRight(H);             // A = A * H
+ * A.applyOnTheLeft(H);              // A = H * A
+ * A.applyOnTheRight(H.adjoint());   // A = A * H^*
+ * A.applyOnTheLeft(H.adjoint());    // A = H^* * A
+ * MatrixXd Q = H;                   // conversion to a dense matrix
+ * \endcode
+ * In addition to the adjoint, you can also apply the inverse (=adjoint), the transpose, and the conjugate operators.
+ *
+ * See the documentation for HouseholderSequence(const VectorsType&, const CoeffsType&) for an example.
+ *
+ * \sa MatrixBase::applyOnTheLeft(), MatrixBase::applyOnTheRight()
+ */
 
 namespace internal {
 
-template<typename VectorsType, typename CoeffsType, int Side>
-struct traits<HouseholderSequence<VectorsType,CoeffsType,Side> >
-{
+template <typename VectorsType, typename CoeffsType, int Side>
+struct traits<HouseholderSequence<VectorsType, CoeffsType, Side> > {
   typedef typename VectorsType::Scalar Scalar;
   typedef typename VectorsType::StorageIndex StorageIndex;
   typedef typename VectorsType::StorageKind StorageKind;
   enum {
-    RowsAtCompileTime = Side==OnTheLeft ? traits<VectorsType>::RowsAtCompileTime
-                                        : traits<VectorsType>::ColsAtCompileTime,
+    RowsAtCompileTime =
+        Side == OnTheLeft ? traits<VectorsType>::RowsAtCompileTime : traits<VectorsType>::ColsAtCompileTime,
     ColsAtCompileTime = RowsAtCompileTime,
-    MaxRowsAtCompileTime = Side==OnTheLeft ? traits<VectorsType>::MaxRowsAtCompileTime
-                                           : traits<VectorsType>::MaxColsAtCompileTime,
+    MaxRowsAtCompileTime =
+        Side == OnTheLeft ? traits<VectorsType>::MaxRowsAtCompileTime : traits<VectorsType>::MaxColsAtCompileTime,
     MaxColsAtCompileTime = MaxRowsAtCompileTime,
     Flags = 0
   };
@@ -78,484 +77,426 @@
 
 struct HouseholderSequenceShape {};
 
-template<typename VectorsType, typename CoeffsType, int Side>
-struct evaluator_traits<HouseholderSequence<VectorsType,CoeffsType,Side> >
-  : public evaluator_traits_base<HouseholderSequence<VectorsType,CoeffsType,Side> >
-{
+template <typename VectorsType, typename CoeffsType, int Side>
+struct evaluator_traits<HouseholderSequence<VectorsType, CoeffsType, Side> >
+    : public evaluator_traits_base<HouseholderSequence<VectorsType, CoeffsType, Side> > {
   typedef HouseholderSequenceShape Shape;
 };
 
-template<typename VectorsType, typename CoeffsType, int Side>
-struct hseq_side_dependent_impl
-{
+template <typename VectorsType, typename CoeffsType, int Side>
+struct hseq_side_dependent_impl {
   typedef Block<const VectorsType, Dynamic, 1> EssentialVectorType;
   typedef HouseholderSequence<VectorsType, CoeffsType, OnTheLeft> HouseholderSequenceType;
-  static EIGEN_DEVICE_FUNC inline const EssentialVectorType essentialVector(const HouseholderSequenceType& h, Index k)
-  {
-    Index start = k+1+h.m_shift;
-    return Block<const VectorsType,Dynamic,1>(h.m_vectors, start, k, h.rows()-start, 1);
+  static EIGEN_DEVICE_FUNC inline const EssentialVectorType essentialVector(const HouseholderSequenceType& h, Index k) {
+    Index start = k + 1 + h.m_shift;
+    return Block<const VectorsType, Dynamic, 1>(h.m_vectors, start, k, h.rows() - start, 1);
   }
 };
 
-template<typename VectorsType, typename CoeffsType>
-struct hseq_side_dependent_impl<VectorsType, CoeffsType, OnTheRight>
-{
+template <typename VectorsType, typename CoeffsType>
+struct hseq_side_dependent_impl<VectorsType, CoeffsType, OnTheRight> {
   typedef Transpose<Block<const VectorsType, 1, Dynamic> > EssentialVectorType;
   typedef HouseholderSequence<VectorsType, CoeffsType, OnTheRight> HouseholderSequenceType;
-  static inline const EssentialVectorType essentialVector(const HouseholderSequenceType& h, Index k)
-  {
-    Index start = k+1+h.m_shift;
-    return Block<const VectorsType,1,Dynamic>(h.m_vectors, k, start, 1, h.rows()-start).transpose();
+  static inline const EssentialVectorType essentialVector(const HouseholderSequenceType& h, Index k) {
+    Index start = k + 1 + h.m_shift;
+    return Block<const VectorsType, 1, Dynamic>(h.m_vectors, k, start, 1, h.rows() - start).transpose();
   }
 };
 
-template<typename OtherScalarType, typename MatrixType> struct matrix_type_times_scalar_type
-{
-  typedef typename ScalarBinaryOpTraits<OtherScalarType, typename MatrixType::Scalar>::ReturnType
-    ResultScalar;
-  typedef Matrix<ResultScalar, MatrixType::RowsAtCompileTime, MatrixType::ColsAtCompileTime,
-                 0, MatrixType::MaxRowsAtCompileTime, MatrixType::MaxColsAtCompileTime> Type;
+template <typename OtherScalarType, typename MatrixType>
+struct matrix_type_times_scalar_type {
+  typedef typename ScalarBinaryOpTraits<OtherScalarType, typename MatrixType::Scalar>::ReturnType ResultScalar;
+  typedef Matrix<ResultScalar, MatrixType::RowsAtCompileTime, MatrixType::ColsAtCompileTime, 0,
+                 MatrixType::MaxRowsAtCompileTime, MatrixType::MaxColsAtCompileTime>
+      Type;
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-template<typename VectorsType, typename CoeffsType, int Side> class HouseholderSequence
-  : public EigenBase<HouseholderSequence<VectorsType,CoeffsType,Side> >
-{
-    typedef typename internal::hseq_side_dependent_impl<VectorsType,CoeffsType,Side>::EssentialVectorType EssentialVectorType;
+template <typename VectorsType, typename CoeffsType, int Side>
+class HouseholderSequence : public EigenBase<HouseholderSequence<VectorsType, CoeffsType, Side> > {
+  typedef typename internal::hseq_side_dependent_impl<VectorsType, CoeffsType, Side>::EssentialVectorType
+      EssentialVectorType;
 
-  public:
-    enum {
-      RowsAtCompileTime = internal::traits<HouseholderSequence>::RowsAtCompileTime,
-      ColsAtCompileTime = internal::traits<HouseholderSequence>::ColsAtCompileTime,
-      MaxRowsAtCompileTime = internal::traits<HouseholderSequence>::MaxRowsAtCompileTime,
-      MaxColsAtCompileTime = internal::traits<HouseholderSequence>::MaxColsAtCompileTime
-    };
-    typedef typename internal::traits<HouseholderSequence>::Scalar Scalar;
+ public:
+  enum {
+    RowsAtCompileTime = internal::traits<HouseholderSequence>::RowsAtCompileTime,
+    ColsAtCompileTime = internal::traits<HouseholderSequence>::ColsAtCompileTime,
+    MaxRowsAtCompileTime = internal::traits<HouseholderSequence>::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = internal::traits<HouseholderSequence>::MaxColsAtCompileTime
+  };
+  typedef typename internal::traits<HouseholderSequence>::Scalar Scalar;
 
-    typedef HouseholderSequence<
+  typedef HouseholderSequence<
       std::conditional_t<NumTraits<Scalar>::IsComplex,
-        internal::remove_all_t<typename VectorsType::ConjugateReturnType>,
-        VectorsType>,
-      std::conditional_t<NumTraits<Scalar>::IsComplex,
-        internal::remove_all_t<typename CoeffsType::ConjugateReturnType>,
-        CoeffsType>,
-      Side
-    > ConjugateReturnType;
+                         internal::remove_all_t<typename VectorsType::ConjugateReturnType>, VectorsType>,
+      std::conditional_t<NumTraits<Scalar>::IsComplex, internal::remove_all_t<typename CoeffsType::ConjugateReturnType>,
+                         CoeffsType>,
+      Side>
+      ConjugateReturnType;
 
-    typedef HouseholderSequence<
+  typedef HouseholderSequence<
       VectorsType,
+      std::conditional_t<NumTraits<Scalar>::IsComplex, internal::remove_all_t<typename CoeffsType::ConjugateReturnType>,
+                         CoeffsType>,
+      Side>
+      AdjointReturnType;
+
+  typedef HouseholderSequence<
       std::conditional_t<NumTraits<Scalar>::IsComplex,
-        internal::remove_all_t<typename CoeffsType::ConjugateReturnType>,
-        CoeffsType>,
-      Side
-    > AdjointReturnType;
+                         internal::remove_all_t<typename VectorsType::ConjugateReturnType>, VectorsType>,
+      CoeffsType, Side>
+      TransposeReturnType;
 
-    typedef HouseholderSequence<
-      std::conditional_t<NumTraits<Scalar>::IsComplex,
-        internal::remove_all_t<typename VectorsType::ConjugateReturnType>,
-        VectorsType>,
-      CoeffsType,
-      Side
-    > TransposeReturnType;
+  typedef HouseholderSequence<std::add_const_t<VectorsType>, std::add_const_t<CoeffsType>, Side>
+      ConstHouseholderSequence;
 
-    typedef HouseholderSequence<
-      std::add_const_t<VectorsType>,
-      std::add_const_t<CoeffsType>,
-      Side
-    > ConstHouseholderSequence;
+  /** \brief Constructor.
+   * \param[in]  v      %Matrix containing the essential parts of the Householder vectors
+   * \param[in]  h      Vector containing the Householder coefficients
+   *
+   * Constructs the Householder sequence with coefficients given by \p h and vectors given by \p v. The
+   * i-th Householder coefficient \f$ h_i \f$ is given by \p h(i) and the essential part of the i-th
+   * Householder vector \f$ v_i \f$ is given by \p v(k,i) with \p k > \p i (the subdiagonal part of the
+   * i-th column). If \p v has fewer columns than rows, then the Householder sequence contains as many
+   * Householder reflections as there are columns.
+   *
+   * \note The %HouseholderSequence object stores \p v and \p h by reference.
+   *
+   * Example: \include HouseholderSequence_HouseholderSequence.cpp
+   * Output: \verbinclude HouseholderSequence_HouseholderSequence.out
+   *
+   * \sa setLength(), setShift()
+   */
+  EIGEN_DEVICE_FUNC HouseholderSequence(const VectorsType& v, const CoeffsType& h)
+      : m_vectors(v), m_coeffs(h), m_reverse(false), m_length(v.diagonalSize()), m_shift(0) {}
 
-    /** \brief Constructor.
-      * \param[in]  v      %Matrix containing the essential parts of the Householder vectors
-      * \param[in]  h      Vector containing the Householder coefficients
-      *
-      * Constructs the Householder sequence with coefficients given by \p h and vectors given by \p v. The
-      * i-th Householder coefficient \f$ h_i \f$ is given by \p h(i) and the essential part of the i-th
-      * Householder vector \f$ v_i \f$ is given by \p v(k,i) with \p k > \p i (the subdiagonal part of the
-      * i-th column). If \p v has fewer columns than rows, then the Householder sequence contains as many
-      * Householder reflections as there are columns.
-      *
-      * \note The %HouseholderSequence object stores \p v and \p h by reference.
-      *
-      * Example: \include HouseholderSequence_HouseholderSequence.cpp
-      * Output: \verbinclude HouseholderSequence_HouseholderSequence.out
-      *
-      * \sa setLength(), setShift()
-      */
-    EIGEN_DEVICE_FUNC
-    HouseholderSequence(const VectorsType& v, const CoeffsType& h)
-      : m_vectors(v), m_coeffs(h), m_reverse(false), m_length(v.diagonalSize()),
-        m_shift(0)
-    {
-    }
-
-    /** \brief Copy constructor. */
-    EIGEN_DEVICE_FUNC
-    HouseholderSequence(const HouseholderSequence& other)
+  /** \brief Copy constructor. */
+  EIGEN_DEVICE_FUNC HouseholderSequence(const HouseholderSequence& other)
       : m_vectors(other.m_vectors),
         m_coeffs(other.m_coeffs),
         m_reverse(other.m_reverse),
         m_length(other.m_length),
-        m_shift(other.m_shift)
-    {
-    }
+        m_shift(other.m_shift) {}
 
-    /** \brief Number of rows of transformation viewed as a matrix.
-      * \returns Number of rows
-      * \details This equals the dimension of the space that the transformation acts on.
-      */
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    Index rows() const EIGEN_NOEXCEPT { return Side==OnTheLeft ? m_vectors.rows() : m_vectors.cols(); }
+  /** \brief Number of rows of transformation viewed as a matrix.
+   * \returns Number of rows
+   * \details This equals the dimension of the space that the transformation acts on.
+   */
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT {
+    return Side == OnTheLeft ? m_vectors.rows() : m_vectors.cols();
+  }
 
-    /** \brief Number of columns of transformation viewed as a matrix.
-      * \returns Number of columns
-      * \details This equals the dimension of the space that the transformation acts on.
-      */
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    Index cols() const EIGEN_NOEXCEPT { return rows(); }
+  /** \brief Number of columns of transformation viewed as a matrix.
+   * \returns Number of columns
+   * \details This equals the dimension of the space that the transformation acts on.
+   */
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return rows(); }
 
-    /** \brief Essential part of a Householder vector.
-      * \param[in]  k  Index of Householder reflection
-      * \returns    Vector containing non-trivial entries of k-th Householder vector
-      *
-      * This function returns the essential part of the Householder vector \f$ v_i \f$. This is a vector of
-      * length \f$ n-i \f$ containing the last \f$ n-i \f$ entries of the vector
-      * \f[
-      * v_i = [\underbrace{0, \ldots, 0}_{i-1\mbox{ zeros}}, 1, \underbrace{*, \ldots,*}_{n-i\mbox{ arbitrary entries}} ].
-      * \f]
-      * The index \f$ i \f$ equals \p k + shift(), corresponding to the k-th column of the matrix \p v
-      * passed to the constructor.
-      *
-      * \sa setShift(), shift()
-      */
-    EIGEN_DEVICE_FUNC
-    const EssentialVectorType essentialVector(Index k) const
-    {
-      eigen_assert(k >= 0 && k < m_length);
-      return internal::hseq_side_dependent_impl<VectorsType,CoeffsType,Side>::essentialVector(*this, k);
-    }
+  /** \brief Essential part of a Householder vector.
+   * \param[in]  k  Index of Householder reflection
+   * \returns    Vector containing non-trivial entries of k-th Householder vector
+   *
+   * This function returns the essential part of the Householder vector \f$ v_i \f$. This is a vector of
+   * length \f$ n-i \f$ containing the last \f$ n-i \f$ entries of the vector
+   * \f[
+   * v_i = [\underbrace{0, \ldots, 0}_{i-1\mbox{ zeros}}, 1, \underbrace{*, \ldots,*}_{n-i\mbox{ arbitrary entries}} ].
+   * \f]
+   * The index \f$ i \f$ equals \p k + shift(), corresponding to the k-th column of the matrix \p v
+   * passed to the constructor.
+   *
+   * \sa setShift(), shift()
+   */
+  EIGEN_DEVICE_FUNC const EssentialVectorType essentialVector(Index k) const {
+    eigen_assert(k >= 0 && k < m_length);
+    return internal::hseq_side_dependent_impl<VectorsType, CoeffsType, Side>::essentialVector(*this, k);
+  }
 
-    /** \brief %Transpose of the Householder sequence. */
-    TransposeReturnType transpose() const
-    {
-      return TransposeReturnType(m_vectors.conjugate(), m_coeffs)
-              .setReverseFlag(!m_reverse)
-              .setLength(m_length)
-              .setShift(m_shift);
-    }
+  /** \brief %Transpose of the Householder sequence. */
+  TransposeReturnType transpose() const {
+    return TransposeReturnType(m_vectors.conjugate(), m_coeffs)
+        .setReverseFlag(!m_reverse)
+        .setLength(m_length)
+        .setShift(m_shift);
+  }
 
-    /** \brief Complex conjugate of the Householder sequence. */
-    ConjugateReturnType conjugate() const
-    {
-      return ConjugateReturnType(m_vectors.conjugate(), m_coeffs.conjugate())
-             .setReverseFlag(m_reverse)
-             .setLength(m_length)
-             .setShift(m_shift);
-    }
+  /** \brief Complex conjugate of the Householder sequence. */
+  ConjugateReturnType conjugate() const {
+    return ConjugateReturnType(m_vectors.conjugate(), m_coeffs.conjugate())
+        .setReverseFlag(m_reverse)
+        .setLength(m_length)
+        .setShift(m_shift);
+  }
 
-    /** \returns an expression of the complex conjugate of \c *this if Cond==true,
-     *           returns \c *this otherwise.
-     */
-    template<bool Cond>
-    EIGEN_DEVICE_FUNC
-    inline std::conditional_t<Cond,ConjugateReturnType,ConstHouseholderSequence>
-    conjugateIf() const
-    {
-      typedef std::conditional_t<Cond,ConjugateReturnType,ConstHouseholderSequence> ReturnType;
-      return ReturnType(m_vectors.template conjugateIf<Cond>(), m_coeffs.template conjugateIf<Cond>());
-    }
+  /** \returns an expression of the complex conjugate of \c *this if Cond==true,
+   *           returns \c *this otherwise.
+   */
+  template <bool Cond>
+  EIGEN_DEVICE_FUNC inline std::conditional_t<Cond, ConjugateReturnType, ConstHouseholderSequence> conjugateIf() const {
+    typedef std::conditional_t<Cond, ConjugateReturnType, ConstHouseholderSequence> ReturnType;
+    return ReturnType(m_vectors.template conjugateIf<Cond>(), m_coeffs.template conjugateIf<Cond>());
+  }
 
-    /** \brief Adjoint (conjugate transpose) of the Householder sequence. */
-    AdjointReturnType adjoint() const
-    {
-      return AdjointReturnType(m_vectors, m_coeffs.conjugate())
-              .setReverseFlag(!m_reverse)
-              .setLength(m_length)
-              .setShift(m_shift);
-    }
+  /** \brief Adjoint (conjugate transpose) of the Householder sequence. */
+  AdjointReturnType adjoint() const {
+    return AdjointReturnType(m_vectors, m_coeffs.conjugate())
+        .setReverseFlag(!m_reverse)
+        .setLength(m_length)
+        .setShift(m_shift);
+  }
 
-    /** \brief Inverse of the Householder sequence (equals the adjoint). */
-    AdjointReturnType inverse() const { return adjoint(); }
+  /** \brief Inverse of the Householder sequence (equals the adjoint). */
+  AdjointReturnType inverse() const { return adjoint(); }
 
-    /** \internal */
-    template<typename DestType>
-    inline EIGEN_DEVICE_FUNC
-    void evalTo(DestType& dst) const
-    {
-      Matrix<Scalar, DestType::RowsAtCompileTime, 1,
-             AutoAlign|ColMajor, DestType::MaxRowsAtCompileTime, 1> workspace(rows());
-      evalTo(dst, workspace);
-    }
+  /** \internal */
+  template <typename DestType>
+  inline EIGEN_DEVICE_FUNC void evalTo(DestType& dst) const {
+    Matrix<Scalar, DestType::RowsAtCompileTime, 1, AutoAlign | ColMajor, DestType::MaxRowsAtCompileTime, 1> workspace(
+        rows());
+    evalTo(dst, workspace);
+  }
 
-    /** \internal */
-    template<typename Dest, typename Workspace>
-    EIGEN_DEVICE_FUNC
-    void evalTo(Dest& dst, Workspace& workspace) const
-    {
-      workspace.resize(rows());
-      Index vecs = m_length;
-      if(internal::is_same_dense(dst,m_vectors))
-      {
-        // in-place
-        dst.diagonal().setOnes();
-        dst.template triangularView<StrictlyUpper>().setZero();
-        for(Index k = vecs-1; k >= 0; --k)
-        {
-          Index cornerSize = rows() - k - m_shift;
-          if(m_reverse)
-            dst.bottomRightCorner(cornerSize, cornerSize)
-               .applyHouseholderOnTheRight(essentialVector(k), m_coeffs.coeff(k), workspace.data());
-          else
-            dst.bottomRightCorner(cornerSize, cornerSize)
-               .applyHouseholderOnTheLeft(essentialVector(k), m_coeffs.coeff(k), workspace.data());
-
-          // clear the off diagonal vector
-          dst.col(k).tail(rows()-k-1).setZero();
-        }
-        // clear the remaining columns if needed
-        for(Index k = 0; k<cols()-vecs ; ++k)
-          dst.col(k).tail(rows()-k-1).setZero();
-      }
-      else if(m_length>BlockSize)
-      {
-        dst.setIdentity(rows(), rows());
-        if(m_reverse)
-          applyThisOnTheLeft(dst,workspace,true);
+  /** \internal */
+  template <typename Dest, typename Workspace>
+  EIGEN_DEVICE_FUNC void evalTo(Dest& dst, Workspace& workspace) const {
+    workspace.resize(rows());
+    Index vecs = m_length;
+    if (internal::is_same_dense(dst, m_vectors)) {
+      // in-place
+      dst.diagonal().setOnes();
+      dst.template triangularView<StrictlyUpper>().setZero();
+      for (Index k = vecs - 1; k >= 0; --k) {
+        Index cornerSize = rows() - k - m_shift;
+        if (m_reverse)
+          dst.bottomRightCorner(cornerSize, cornerSize)
+              .applyHouseholderOnTheRight(essentialVector(k), m_coeffs.coeff(k), workspace.data());
         else
-          applyThisOnTheLeft(dst,workspace,true);
+          dst.bottomRightCorner(cornerSize, cornerSize)
+              .applyHouseholderOnTheLeft(essentialVector(k), m_coeffs.coeff(k), workspace.data());
+
+        // clear the off diagonal vector
+        dst.col(k).tail(rows() - k - 1).setZero();
       }
+      // clear the remaining columns if needed
+      for (Index k = 0; k < cols() - vecs; ++k) dst.col(k).tail(rows() - k - 1).setZero();
+    } else if (m_length > BlockSize) {
+      dst.setIdentity(rows(), rows());
+      if (m_reverse)
+        applyThisOnTheLeft(dst, workspace, true);
       else
-      {
-        dst.setIdentity(rows(), rows());
-        for(Index k = vecs-1; k >= 0; --k)
-        {
-          Index cornerSize = rows() - k - m_shift;
-          if(m_reverse)
-            dst.bottomRightCorner(cornerSize, cornerSize)
-               .applyHouseholderOnTheRight(essentialVector(k), m_coeffs.coeff(k), workspace.data());
-          else
-            dst.bottomRightCorner(cornerSize, cornerSize)
-               .applyHouseholderOnTheLeft(essentialVector(k), m_coeffs.coeff(k), workspace.data());
+        applyThisOnTheLeft(dst, workspace, true);
+    } else {
+      dst.setIdentity(rows(), rows());
+      for (Index k = vecs - 1; k >= 0; --k) {
+        Index cornerSize = rows() - k - m_shift;
+        if (m_reverse)
+          dst.bottomRightCorner(cornerSize, cornerSize)
+              .applyHouseholderOnTheRight(essentialVector(k), m_coeffs.coeff(k), workspace.data());
+        else
+          dst.bottomRightCorner(cornerSize, cornerSize)
+              .applyHouseholderOnTheLeft(essentialVector(k), m_coeffs.coeff(k), workspace.data());
+      }
+    }
+  }
+
+  /** \internal */
+  template <typename Dest>
+  inline void applyThisOnTheRight(Dest& dst) const {
+    Matrix<Scalar, 1, Dest::RowsAtCompileTime, RowMajor, 1, Dest::MaxRowsAtCompileTime> workspace(dst.rows());
+    applyThisOnTheRight(dst, workspace);
+  }
+
+  /** \internal */
+  template <typename Dest, typename Workspace>
+  inline void applyThisOnTheRight(Dest& dst, Workspace& workspace) const {
+    workspace.resize(dst.rows());
+    for (Index k = 0; k < m_length; ++k) {
+      Index actual_k = m_reverse ? m_length - k - 1 : k;
+      dst.rightCols(rows() - m_shift - actual_k)
+          .applyHouseholderOnTheRight(essentialVector(actual_k), m_coeffs.coeff(actual_k), workspace.data());
+    }
+  }
+
+  /** \internal */
+  template <typename Dest>
+  inline void applyThisOnTheLeft(Dest& dst, bool inputIsIdentity = false) const {
+    Matrix<Scalar, 1, Dest::ColsAtCompileTime, RowMajor, 1, Dest::MaxColsAtCompileTime> workspace;
+    applyThisOnTheLeft(dst, workspace, inputIsIdentity);
+  }
+
+  /** \internal */
+  template <typename Dest, typename Workspace>
+  inline void applyThisOnTheLeft(Dest& dst, Workspace& workspace, bool inputIsIdentity = false) const {
+    if (inputIsIdentity && m_reverse) inputIsIdentity = false;
+    // if the entries are large enough, then apply the reflectors by block
+    if (m_length >= BlockSize && dst.cols() > 1) {
+      // Make sure we have at least 2 useful blocks, otherwise it is point-less:
+      Index blockSize = m_length < Index(2 * BlockSize) ? (m_length + 1) / 2 : Index(BlockSize);
+      for (Index i = 0; i < m_length; i += blockSize) {
+        Index end = m_reverse ? (std::min)(m_length, i + blockSize) : m_length - i;
+        Index k = m_reverse ? i : (std::max)(Index(0), end - blockSize);
+        Index bs = end - k;
+        Index start = k + m_shift;
+
+        typedef Block<internal::remove_all_t<VectorsType>, Dynamic, Dynamic> SubVectorsType;
+        SubVectorsType sub_vecs1(m_vectors.const_cast_derived(), Side == OnTheRight ? k : start,
+                                 Side == OnTheRight ? start : k, Side == OnTheRight ? bs : m_vectors.rows() - start,
+                                 Side == OnTheRight ? m_vectors.cols() - start : bs);
+        std::conditional_t<Side == OnTheRight, Transpose<SubVectorsType>, SubVectorsType&> sub_vecs(sub_vecs1);
+
+        Index dstRows = rows() - m_shift - k;
+
+        if (inputIsIdentity) {
+          Block<Dest, Dynamic, Dynamic> sub_dst = dst.bottomRightCorner(dstRows, dstRows);
+          apply_block_householder_on_the_left(sub_dst, sub_vecs, m_coeffs.segment(k, bs), !m_reverse);
+        } else {
+          auto sub_dst = dst.bottomRows(dstRows);
+          apply_block_householder_on_the_left(sub_dst, sub_vecs, m_coeffs.segment(k, bs), !m_reverse);
+        }
+      }
+    } else {
+      workspace.resize(dst.cols());
+      for (Index k = 0; k < m_length; ++k) {
+        Index actual_k = m_reverse ? k : m_length - k - 1;
+        Index dstRows = rows() - m_shift - actual_k;
+
+        if (inputIsIdentity) {
+          Block<Dest, Dynamic, Dynamic> sub_dst = dst.bottomRightCorner(dstRows, dstRows);
+          sub_dst.applyHouseholderOnTheLeft(essentialVector(actual_k), m_coeffs.coeff(actual_k), workspace.data());
+        } else {
+          auto sub_dst = dst.bottomRows(dstRows);
+          sub_dst.applyHouseholderOnTheLeft(essentialVector(actual_k), m_coeffs.coeff(actual_k), workspace.data());
         }
       }
     }
+  }
 
-    /** \internal */
-    template<typename Dest> inline void applyThisOnTheRight(Dest& dst) const
-    {
-      Matrix<Scalar,1,Dest::RowsAtCompileTime,RowMajor,1,Dest::MaxRowsAtCompileTime> workspace(dst.rows());
-      applyThisOnTheRight(dst, workspace);
-    }
+  /** \brief Computes the product of a Householder sequence with a matrix.
+   * \param[in]  other  %Matrix being multiplied.
+   * \returns    Expression object representing the product.
+   *
+   * This function computes \f$ HM \f$ where \f$ H \f$ is the Householder sequence represented by \p *this
+   * and \f$ M \f$ is the matrix \p other.
+   */
+  template <typename OtherDerived>
+  typename internal::matrix_type_times_scalar_type<Scalar, OtherDerived>::Type operator*(
+      const MatrixBase<OtherDerived>& other) const {
+    typename internal::matrix_type_times_scalar_type<Scalar, OtherDerived>::Type res(
+        other.template cast<typename internal::matrix_type_times_scalar_type<Scalar, OtherDerived>::ResultScalar>());
+    applyThisOnTheLeft(res, internal::is_identity<OtherDerived>::value && res.rows() == res.cols());
+    return res;
+  }
 
-    /** \internal */
-    template<typename Dest, typename Workspace>
-    inline void applyThisOnTheRight(Dest& dst, Workspace& workspace) const
-    {
-      workspace.resize(dst.rows());
-      for(Index k = 0; k < m_length; ++k)
-      {
-        Index actual_k = m_reverse ? m_length-k-1 : k;
-        dst.rightCols(rows()-m_shift-actual_k)
-           .applyHouseholderOnTheRight(essentialVector(actual_k), m_coeffs.coeff(actual_k), workspace.data());
-      }
-    }
+  template <typename VectorsType_, typename CoeffsType_, int Side_>
+  friend struct internal::hseq_side_dependent_impl;
 
-    /** \internal */
-    template<typename Dest> inline void applyThisOnTheLeft(Dest& dst, bool inputIsIdentity = false) const
-    {
-      Matrix<Scalar,1,Dest::ColsAtCompileTime,RowMajor,1,Dest::MaxColsAtCompileTime> workspace;
-      applyThisOnTheLeft(dst, workspace, inputIsIdentity);
-    }
+  /** \brief Sets the length of the Householder sequence.
+   * \param [in]  length  New value for the length.
+   *
+   * By default, the length \f$ n \f$ of the Householder sequence \f$ H = H_0 H_1 \ldots H_{n-1} \f$ is set
+   * to the number of columns of the matrix \p v passed to the constructor, or the number of rows if that
+   * is smaller. After this function is called, the length equals \p length.
+   *
+   * \sa length()
+   */
+  EIGEN_DEVICE_FUNC HouseholderSequence& setLength(Index length) {
+    m_length = length;
+    return *this;
+  }
 
-    /** \internal */
-    template<typename Dest, typename Workspace>
-    inline void applyThisOnTheLeft(Dest& dst, Workspace& workspace, bool inputIsIdentity = false) const
-    {
-      if(inputIsIdentity && m_reverse)
-        inputIsIdentity = false;
-      // if the entries are large enough, then apply the reflectors by block
-      if(m_length>=BlockSize && dst.cols()>1)
-      {
-        // Make sure we have at least 2 useful blocks, otherwise it is point-less:
-        Index blockSize = m_length<Index(2*BlockSize) ? (m_length+1)/2 : Index(BlockSize);
-        for(Index i = 0; i < m_length; i+=blockSize)
-        {
-          Index end = m_reverse ? (std::min)(m_length,i+blockSize) : m_length-i;
-          Index k = m_reverse ? i : (std::max)(Index(0),end-blockSize);
-          Index bs = end-k;
-          Index start = k + m_shift;
+  /** \brief Sets the shift of the Householder sequence.
+   * \param [in]  shift  New value for the shift.
+   *
+   * By default, a %HouseholderSequence object represents \f$ H = H_0 H_1 \ldots H_{n-1} \f$ and the i-th
+   * column of the matrix \p v passed to the constructor corresponds to the i-th Householder
+   * reflection. After this function is called, the object represents \f$ H = H_{\mathrm{shift}}
+   * H_{\mathrm{shift}+1} \ldots H_{n-1} \f$ and the i-th column of \p v corresponds to the (shift+i)-th
+   * Householder reflection.
+   *
+   * \sa shift()
+   */
+  EIGEN_DEVICE_FUNC HouseholderSequence& setShift(Index shift) {
+    m_shift = shift;
+    return *this;
+  }
 
-          typedef Block<internal::remove_all_t<VectorsType>,Dynamic,Dynamic> SubVectorsType;
-          SubVectorsType sub_vecs1(m_vectors.const_cast_derived(), Side==OnTheRight ? k : start,
-                                                                   Side==OnTheRight ? start : k,
-                                                                   Side==OnTheRight ? bs : m_vectors.rows()-start,
-                                                                   Side==OnTheRight ? m_vectors.cols()-start : bs);
-          std::conditional_t<Side==OnTheRight, Transpose<SubVectorsType>, SubVectorsType&> sub_vecs(sub_vecs1);
+  EIGEN_DEVICE_FUNC Index length() const {
+    return m_length;
+  } /**< \brief Returns the length of the Householder sequence. */
 
-          Index dstRows  = rows()-m_shift-k;
+  EIGEN_DEVICE_FUNC Index shift() const {
+    return m_shift;
+  } /**< \brief Returns the shift of the Householder sequence. */
 
-          if (inputIsIdentity)
-          {
-            Block<Dest, Dynamic, Dynamic> sub_dst = dst.bottomRightCorner(dstRows, dstRows);
-            apply_block_householder_on_the_left(sub_dst, sub_vecs, m_coeffs.segment(k, bs), !m_reverse);
-          }
-          else
-          {
-            auto sub_dst = dst.bottomRows(dstRows);
-            apply_block_householder_on_the_left(sub_dst, sub_vecs, m_coeffs.segment(k, bs), !m_reverse);
-          }
-        }
-      }
-      else
-      {
-        workspace.resize(dst.cols());
-        for(Index k = 0; k < m_length; ++k)
-        {
-          Index actual_k = m_reverse ? k : m_length-k-1;
-          Index dstRows = rows()-m_shift-actual_k;
+  /* Necessary for .adjoint() and .conjugate() */
+  template <typename VectorsType2, typename CoeffsType2, int Side2>
+  friend class HouseholderSequence;
 
-          if (inputIsIdentity)
-          {
-            Block<Dest, Dynamic, Dynamic> sub_dst = dst.bottomRightCorner(dstRows, dstRows);
-            sub_dst.applyHouseholderOnTheLeft(essentialVector(actual_k), m_coeffs.coeff(actual_k), workspace.data());
-          }
-          else
-          {
-            auto sub_dst = dst.bottomRows(dstRows);
-            sub_dst.applyHouseholderOnTheLeft(essentialVector(actual_k), m_coeffs.coeff(actual_k), workspace.data());
-          }
-        }
-      }
-    }
+ protected:
+  /** \internal
+   * \brief Sets the reverse flag.
+   * \param [in]  reverse  New value of the reverse flag.
+   *
+   * By default, the reverse flag is not set. If the reverse flag is set, then this object represents
+   * \f$ H^r = H_{n-1} \ldots H_1 H_0 \f$ instead of \f$ H = H_0 H_1 \ldots H_{n-1} \f$.
+   * \note For real valued HouseholderSequence this is equivalent to transposing \f$ H \f$.
+   *
+   * \sa reverseFlag(), transpose(), adjoint()
+   */
+  HouseholderSequence& setReverseFlag(bool reverse) {
+    m_reverse = reverse;
+    return *this;
+  }
 
-    /** \brief Computes the product of a Householder sequence with a matrix.
-      * \param[in]  other  %Matrix being multiplied.
-      * \returns    Expression object representing the product.
-      *
-      * This function computes \f$ HM \f$ where \f$ H \f$ is the Householder sequence represented by \p *this
-      * and \f$ M \f$ is the matrix \p other.
-      */
-    template<typename OtherDerived>
-    typename internal::matrix_type_times_scalar_type<Scalar, OtherDerived>::Type operator*(const MatrixBase<OtherDerived>& other) const
-    {
-      typename internal::matrix_type_times_scalar_type<Scalar, OtherDerived>::Type
-        res(other.template cast<typename internal::matrix_type_times_scalar_type<Scalar,OtherDerived>::ResultScalar>());
-      applyThisOnTheLeft(res, internal::is_identity<OtherDerived>::value && res.rows()==res.cols());
-      return res;
-    }
+  bool reverseFlag() const { return m_reverse; } /**< \internal \brief Returns the reverse flag. */
 
-    template<typename VectorsType_, typename CoeffsType_, int Side_> friend struct internal::hseq_side_dependent_impl;
-
-    /** \brief Sets the length of the Householder sequence.
-      * \param [in]  length  New value for the length.
-      *
-      * By default, the length \f$ n \f$ of the Householder sequence \f$ H = H_0 H_1 \ldots H_{n-1} \f$ is set
-      * to the number of columns of the matrix \p v passed to the constructor, or the number of rows if that
-      * is smaller. After this function is called, the length equals \p length.
-      *
-      * \sa length()
-      */
-    EIGEN_DEVICE_FUNC
-    HouseholderSequence& setLength(Index length)
-    {
-      m_length = length;
-      return *this;
-    }
-
-    /** \brief Sets the shift of the Householder sequence.
-      * \param [in]  shift  New value for the shift.
-      *
-      * By default, a %HouseholderSequence object represents \f$ H = H_0 H_1 \ldots H_{n-1} \f$ and the i-th
-      * column of the matrix \p v passed to the constructor corresponds to the i-th Householder
-      * reflection. After this function is called, the object represents \f$ H = H_{\mathrm{shift}}
-      * H_{\mathrm{shift}+1} \ldots H_{n-1} \f$ and the i-th column of \p v corresponds to the (shift+i)-th
-      * Householder reflection.
-      *
-      * \sa shift()
-      */
-    EIGEN_DEVICE_FUNC
-    HouseholderSequence& setShift(Index shift)
-    {
-      m_shift = shift;
-      return *this;
-    }
-
-    EIGEN_DEVICE_FUNC
-    Index length() const { return m_length; }  /**< \brief Returns the length of the Householder sequence. */
-
-    EIGEN_DEVICE_FUNC
-    Index shift() const { return m_shift; }    /**< \brief Returns the shift of the Householder sequence. */
-
-    /* Necessary for .adjoint() and .conjugate() */
-    template <typename VectorsType2, typename CoeffsType2, int Side2> friend class HouseholderSequence;
-
-  protected:
-
-    /** \internal
-      * \brief Sets the reverse flag.
-      * \param [in]  reverse  New value of the reverse flag.
-      *
-      * By default, the reverse flag is not set. If the reverse flag is set, then this object represents
-      * \f$ H^r = H_{n-1} \ldots H_1 H_0 \f$ instead of \f$ H = H_0 H_1 \ldots H_{n-1} \f$.
-      * \note For real valued HouseholderSequence this is equivalent to transposing \f$ H \f$.
-      *
-      * \sa reverseFlag(), transpose(), adjoint()
-      */
-    HouseholderSequence& setReverseFlag(bool reverse)
-    {
-      m_reverse = reverse;
-      return *this;
-    }
-
-    bool reverseFlag() const { return m_reverse; }     /**< \internal \brief Returns the reverse flag. */
-
-    typename VectorsType::Nested m_vectors;
-    typename CoeffsType::Nested m_coeffs;
-    bool m_reverse;
-    Index m_length;
-    Index m_shift;
-    enum { BlockSize = 48 };
+  typename VectorsType::Nested m_vectors;
+  typename CoeffsType::Nested m_coeffs;
+  bool m_reverse;
+  Index m_length;
+  Index m_shift;
+  enum { BlockSize = 48 };
 };
 
 /** \brief Computes the product of a matrix with a Householder sequence.
-  * \param[in]  other  %Matrix being multiplied.
-  * \param[in]  h      %HouseholderSequence being multiplied.
-  * \returns    Expression object representing the product.
-  *
-  * This function computes \f$ MH \f$ where \f$ M \f$ is the matrix \p other and \f$ H \f$ is the
-  * Householder sequence represented by \p h.
-  */
-template<typename OtherDerived, typename VectorsType, typename CoeffsType, int Side>
-typename internal::matrix_type_times_scalar_type<typename VectorsType::Scalar,OtherDerived>::Type operator*(const MatrixBase<OtherDerived>& other, const HouseholderSequence<VectorsType,CoeffsType,Side>& h)
-{
-  typename internal::matrix_type_times_scalar_type<typename VectorsType::Scalar,OtherDerived>::Type
-    res(other.template cast<typename internal::matrix_type_times_scalar_type<typename VectorsType::Scalar,OtherDerived>::ResultScalar>());
+ * \param[in]  other  %Matrix being multiplied.
+ * \param[in]  h      %HouseholderSequence being multiplied.
+ * \returns    Expression object representing the product.
+ *
+ * This function computes \f$ MH \f$ where \f$ M \f$ is the matrix \p other and \f$ H \f$ is the
+ * Householder sequence represented by \p h.
+ */
+template <typename OtherDerived, typename VectorsType, typename CoeffsType, int Side>
+typename internal::matrix_type_times_scalar_type<typename VectorsType::Scalar, OtherDerived>::Type operator*(
+    const MatrixBase<OtherDerived>& other, const HouseholderSequence<VectorsType, CoeffsType, Side>& h) {
+  typename internal::matrix_type_times_scalar_type<typename VectorsType::Scalar, OtherDerived>::Type res(
+      other.template cast<typename internal::matrix_type_times_scalar_type<typename VectorsType::Scalar,
+                                                                           OtherDerived>::ResultScalar>());
   h.applyThisOnTheRight(res);
   return res;
 }
 
 /** \ingroup Householder_Module \householder_module
-  * \brief Convenience function for constructing a Householder sequence.
-  * \returns A HouseholderSequence constructed from the specified arguments.
-  */
-template<typename VectorsType, typename CoeffsType>
-HouseholderSequence<VectorsType,CoeffsType> householderSequence(const VectorsType& v, const CoeffsType& h)
-{
-  return HouseholderSequence<VectorsType,CoeffsType,OnTheLeft>(v, h);
+ * \brief Convenience function for constructing a Householder sequence.
+ * \returns A HouseholderSequence constructed from the specified arguments.
+ */
+template <typename VectorsType, typename CoeffsType>
+HouseholderSequence<VectorsType, CoeffsType> householderSequence(const VectorsType& v, const CoeffsType& h) {
+  return HouseholderSequence<VectorsType, CoeffsType, OnTheLeft>(v, h);
 }
 
 /** \ingroup Householder_Module \householder_module
-  * \brief Convenience function for constructing a Householder sequence.
-  * \returns A HouseholderSequence constructed from the specified arguments.
-  * \details This function differs from householderSequence() in that the template argument \p OnTheSide of
-  * the constructed HouseholderSequence is set to OnTheRight, instead of the default OnTheLeft.
-  */
-template<typename VectorsType, typename CoeffsType>
-HouseholderSequence<VectorsType,CoeffsType,OnTheRight> rightHouseholderSequence(const VectorsType& v, const CoeffsType& h)
-{
-  return HouseholderSequence<VectorsType,CoeffsType,OnTheRight>(v, h);
+ * \brief Convenience function for constructing a Householder sequence.
+ * \returns A HouseholderSequence constructed from the specified arguments.
+ * \details This function differs from householderSequence() in that the template argument \p OnTheSide of
+ * the constructed HouseholderSequence is set to OnTheRight, instead of the default OnTheLeft.
+ */
+template <typename VectorsType, typename CoeffsType>
+HouseholderSequence<VectorsType, CoeffsType, OnTheRight> rightHouseholderSequence(const VectorsType& v,
+                                                                                  const CoeffsType& h) {
+  return HouseholderSequence<VectorsType, CoeffsType, OnTheRight>(v, h);
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_HOUSEHOLDER_SEQUENCE_H
+#endif  // EIGEN_HOUSEHOLDER_SEQUENCE_H
diff --git a/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h b/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h
index 6e2122f..0beef60 100644
--- a/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h
+++ b/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h
@@ -36,78 +36,68 @@
   * \sa class LeastSquareDiagonalPreconditioner, class ConjugateGradient
   */
 template <typename Scalar_>
-class DiagonalPreconditioner
-{
-    typedef Scalar_ Scalar;
-    typedef Matrix<Scalar,Dynamic,1> Vector;
-  public:
-    typedef typename Vector::StorageIndex StorageIndex;
-    enum {
-      ColsAtCompileTime = Dynamic,
-      MaxColsAtCompileTime = Dynamic
-    };
+class DiagonalPreconditioner {
+  typedef Scalar_ Scalar;
+  typedef Matrix<Scalar, Dynamic, 1> Vector;
 
-    DiagonalPreconditioner() : m_isInitialized(false) {}
+ public:
+  typedef typename Vector::StorageIndex StorageIndex;
+  enum { ColsAtCompileTime = Dynamic, MaxColsAtCompileTime = Dynamic };
 
-    template<typename MatType>
-    explicit DiagonalPreconditioner(const MatType& mat) : m_invdiag(mat.cols())
-    {
-      compute(mat);
+  DiagonalPreconditioner() : m_isInitialized(false) {}
+
+  template <typename MatType>
+  explicit DiagonalPreconditioner(const MatType& mat) : m_invdiag(mat.cols()) {
+    compute(mat);
+  }
+
+  EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_invdiag.size(); }
+  EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_invdiag.size(); }
+
+  template <typename MatType>
+  DiagonalPreconditioner& analyzePattern(const MatType&) {
+    return *this;
+  }
+
+  template <typename MatType>
+  DiagonalPreconditioner& factorize(const MatType& mat) {
+    m_invdiag.resize(mat.cols());
+    for (int j = 0; j < mat.outerSize(); ++j) {
+      typename MatType::InnerIterator it(mat, j);
+      while (it && it.index() != j) ++it;
+      if (it && it.index() == j && it.value() != Scalar(0))
+        m_invdiag(j) = Scalar(1) / it.value();
+      else
+        m_invdiag(j) = Scalar(1);
     }
+    m_isInitialized = true;
+    return *this;
+  }
 
-    EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_invdiag.size(); }
-    EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_invdiag.size(); }
+  template <typename MatType>
+  DiagonalPreconditioner& compute(const MatType& mat) {
+    return factorize(mat);
+  }
 
-    template<typename MatType>
-    DiagonalPreconditioner& analyzePattern(const MatType& )
-    {
-      return *this;
-    }
+  /** \internal */
+  template <typename Rhs, typename Dest>
+  void _solve_impl(const Rhs& b, Dest& x) const {
+    x = m_invdiag.array() * b.array();
+  }
 
-    template<typename MatType>
-    DiagonalPreconditioner& factorize(const MatType& mat)
-    {
-      m_invdiag.resize(mat.cols());
-      for(int j=0; j<mat.outerSize(); ++j)
-      {
-        typename MatType::InnerIterator it(mat,j);
-        while(it && it.index()!=j) ++it;
-        if(it && it.index()==j && it.value()!=Scalar(0))
-          m_invdiag(j) = Scalar(1)/it.value();
-        else
-          m_invdiag(j) = Scalar(1);
-      }
-      m_isInitialized = true;
-      return *this;
-    }
+  template <typename Rhs>
+  inline const Solve<DiagonalPreconditioner, Rhs> solve(const MatrixBase<Rhs>& b) const {
+    eigen_assert(m_isInitialized && "DiagonalPreconditioner is not initialized.");
+    eigen_assert(m_invdiag.size() == b.rows() &&
+                 "DiagonalPreconditioner::solve(): invalid number of rows of the right hand side matrix b");
+    return Solve<DiagonalPreconditioner, Rhs>(*this, b.derived());
+  }
 
-    template<typename MatType>
-    DiagonalPreconditioner& compute(const MatType& mat)
-    {
-      return factorize(mat);
-    }
+  ComputationInfo info() { return Success; }
 
-    /** \internal */
-    template<typename Rhs, typename Dest>
-    void _solve_impl(const Rhs& b, Dest& x) const
-    {
-      x = m_invdiag.array() * b.array() ;
-    }
-
-    template<typename Rhs> inline const Solve<DiagonalPreconditioner, Rhs>
-    solve(const MatrixBase<Rhs>& b) const
-    {
-      eigen_assert(m_isInitialized && "DiagonalPreconditioner is not initialized.");
-      eigen_assert(m_invdiag.size()==b.rows()
-                && "DiagonalPreconditioner::solve(): invalid number of rows of the right hand side matrix b");
-      return Solve<DiagonalPreconditioner, Rhs>(*this, b.derived());
-    }
-
-    ComputationInfo info() { return Success; }
-
-  protected:
-    Vector m_invdiag;
-    bool m_isInitialized;
+ protected:
+  Vector m_invdiag;
+  bool m_isInitialized;
 };
 
 /** \ingroup IterativeLinearSolvers_Module
@@ -128,102 +118,96 @@
   * \sa class LeastSquaresConjugateGradient, class DiagonalPreconditioner
   */
 template <typename Scalar_>
-class LeastSquareDiagonalPreconditioner : public DiagonalPreconditioner<Scalar_>
-{
-    typedef Scalar_ Scalar;
-    typedef typename NumTraits<Scalar>::Real RealScalar;
-    typedef DiagonalPreconditioner<Scalar_> Base;
-    using Base::m_invdiag;
-  public:
+class LeastSquareDiagonalPreconditioner : public DiagonalPreconditioner<Scalar_> {
+  typedef Scalar_ Scalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef DiagonalPreconditioner<Scalar_> Base;
+  using Base::m_invdiag;
 
-    LeastSquareDiagonalPreconditioner() : Base() {}
+ public:
+  LeastSquareDiagonalPreconditioner() : Base() {}
 
-    template<typename MatType>
-    explicit LeastSquareDiagonalPreconditioner(const MatType& mat) : Base()
-    {
-      compute(mat);
-    }
+  template <typename MatType>
+  explicit LeastSquareDiagonalPreconditioner(const MatType& mat) : Base() {
+    compute(mat);
+  }
 
-    template<typename MatType>
-    LeastSquareDiagonalPreconditioner& analyzePattern(const MatType& )
-    {
-      return *this;
-    }
+  template <typename MatType>
+  LeastSquareDiagonalPreconditioner& analyzePattern(const MatType&) {
+    return *this;
+  }
 
-    template<typename MatType>
-    LeastSquareDiagonalPreconditioner& factorize(const MatType& mat)
-    {
-      // Compute the inverse squared-norm of each column of mat
-      m_invdiag.resize(mat.cols());
-      if(MatType::IsRowMajor)
-      {
-        m_invdiag.setZero();
-        for(Index j=0; j<mat.outerSize(); ++j)
-        {
-          for(typename MatType::InnerIterator it(mat,j); it; ++it)
-            m_invdiag(it.index()) += numext::abs2(it.value());
-        }
-        for(Index j=0; j<mat.cols(); ++j)
-          if(numext::real(m_invdiag(j))>RealScalar(0))
-            m_invdiag(j) = RealScalar(1)/numext::real(m_invdiag(j));
+  template <typename MatType>
+  LeastSquareDiagonalPreconditioner& factorize(const MatType& mat) {
+    // Compute the inverse squared-norm of each column of mat
+    m_invdiag.resize(mat.cols());
+    if (MatType::IsRowMajor) {
+      m_invdiag.setZero();
+      for (Index j = 0; j < mat.outerSize(); ++j) {
+        for (typename MatType::InnerIterator it(mat, j); it; ++it) m_invdiag(it.index()) += numext::abs2(it.value());
       }
-      else
-      {
-        for(Index j=0; j<mat.outerSize(); ++j)
-        {
-          RealScalar sum = mat.col(j).squaredNorm();
-          if(sum>RealScalar(0))
-            m_invdiag(j) = RealScalar(1)/sum;
-          else
-            m_invdiag(j) = RealScalar(1);
-        }
+      for (Index j = 0; j < mat.cols(); ++j)
+        if (numext::real(m_invdiag(j)) > RealScalar(0)) m_invdiag(j) = RealScalar(1) / numext::real(m_invdiag(j));
+    } else {
+      for (Index j = 0; j < mat.outerSize(); ++j) {
+        RealScalar sum = mat.col(j).squaredNorm();
+        if (sum > RealScalar(0))
+          m_invdiag(j) = RealScalar(1) / sum;
+        else
+          m_invdiag(j) = RealScalar(1);
       }
-      Base::m_isInitialized = true;
-      return *this;
     }
+    Base::m_isInitialized = true;
+    return *this;
+  }
 
-    template<typename MatType>
-    LeastSquareDiagonalPreconditioner& compute(const MatType& mat)
-    {
-      return factorize(mat);
-    }
+  template <typename MatType>
+  LeastSquareDiagonalPreconditioner& compute(const MatType& mat) {
+    return factorize(mat);
+  }
 
-    ComputationInfo info() { return Success; }
+  ComputationInfo info() { return Success; }
 
-  protected:
+ protected:
 };
 
 /** \ingroup IterativeLinearSolvers_Module
-  * \brief A naive preconditioner which approximates any matrix as the identity matrix
-  *
-  * \implsparsesolverconcept
-  *
-  * \sa class DiagonalPreconditioner
-  */
-class IdentityPreconditioner
-{
-  public:
+ * \brief A naive preconditioner which approximates any matrix as the identity matrix
+ *
+ * \implsparsesolverconcept
+ *
+ * \sa class DiagonalPreconditioner
+ */
+class IdentityPreconditioner {
+ public:
+  IdentityPreconditioner() {}
 
-    IdentityPreconditioner() {}
+  template <typename MatrixType>
+  explicit IdentityPreconditioner(const MatrixType&) {}
 
-    template<typename MatrixType>
-    explicit IdentityPreconditioner(const MatrixType& ) {}
+  template <typename MatrixType>
+  IdentityPreconditioner& analyzePattern(const MatrixType&) {
+    return *this;
+  }
 
-    template<typename MatrixType>
-    IdentityPreconditioner& analyzePattern(const MatrixType& ) { return *this; }
+  template <typename MatrixType>
+  IdentityPreconditioner& factorize(const MatrixType&) {
+    return *this;
+  }
 
-    template<typename MatrixType>
-    IdentityPreconditioner& factorize(const MatrixType& ) { return *this; }
+  template <typename MatrixType>
+  IdentityPreconditioner& compute(const MatrixType&) {
+    return *this;
+  }
 
-    template<typename MatrixType>
-    IdentityPreconditioner& compute(const MatrixType& ) { return *this; }
+  template <typename Rhs>
+  inline const Rhs& solve(const Rhs& b) const {
+    return b;
+  }
 
-    template<typename Rhs>
-    inline const Rhs& solve(const Rhs& b) const { return b; }
-
-    ComputationInfo info() { return Success; }
+  ComputationInfo info() { return Success; }
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_BASIC_PRECONDITIONERS_H
+#endif  // EIGEN_BASIC_PRECONDITIONERS_H
diff --git a/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h b/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h
index 467d4aa..e3154b4 100644
--- a/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h
+++ b/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h
@@ -14,79 +14,73 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
 /** \internal Low-level bi conjugate gradient stabilized algorithm
-  * \param mat The matrix A
-  * \param rhs The right hand side vector b
-  * \param x On input and initial solution, on output the computed solution.
-  * \param precond A preconditioner being able to efficiently solve for an
-  *                approximation of Ax=b (regardless of b)
-  * \param iters On input the max number of iteration, on output the number of performed iterations.
-  * \param tol_error On input the tolerance error, on output an estimation of the relative error.
-  * \return false in the case of numerical issue, for example a break down of BiCGSTAB. 
-  */
-template<typename MatrixType, typename Rhs, typename Dest, typename Preconditioner>
-bool bicgstab(const MatrixType& mat, const Rhs& rhs, Dest& x,
-              const Preconditioner& precond, Index& iters,
-              typename Dest::RealScalar& tol_error)
-{
-  using std::sqrt;
+ * \param mat The matrix A
+ * \param rhs The right hand side vector b
+ * \param x On input and initial solution, on output the computed solution.
+ * \param precond A preconditioner being able to efficiently solve for an
+ *                approximation of Ax=b (regardless of b)
+ * \param iters On input the max number of iteration, on output the number of performed iterations.
+ * \param tol_error On input the tolerance error, on output an estimation of the relative error.
+ * \return false in the case of numerical issue, for example a break down of BiCGSTAB.
+ */
+template <typename MatrixType, typename Rhs, typename Dest, typename Preconditioner>
+bool bicgstab(const MatrixType& mat, const Rhs& rhs, Dest& x, const Preconditioner& precond, Index& iters,
+              typename Dest::RealScalar& tol_error) {
   using std::abs;
+  using std::sqrt;
   typedef typename Dest::RealScalar RealScalar;
   typedef typename Dest::Scalar Scalar;
-  typedef Matrix<Scalar,Dynamic,1> VectorType;
+  typedef Matrix<Scalar, Dynamic, 1> VectorType;
   RealScalar tol = tol_error;
   Index maxIters = iters;
 
   Index n = mat.cols();
-  VectorType r  = rhs - mat * x;
+  VectorType r = rhs - mat * x;
   VectorType r0 = r;
-  
+
   RealScalar r0_sqnorm = r0.squaredNorm();
   RealScalar rhs_sqnorm = rhs.squaredNorm();
-  if(rhs_sqnorm == 0)
-  {
+  if (rhs_sqnorm == 0) {
     x.setZero();
     return true;
   }
-  Scalar rho    (1);
-  Scalar alpha  (1);
-  Scalar w      (1);
-  
+  Scalar rho(1);
+  Scalar alpha(1);
+  Scalar w(1);
+
   VectorType v = VectorType::Zero(n), p = VectorType::Zero(n);
-  VectorType y(n),  z(n);
+  VectorType y(n), z(n);
   VectorType kt(n), ks(n);
 
   VectorType s(n), t(n);
 
-  RealScalar tol2 = tol*tol*rhs_sqnorm;
-  RealScalar eps2 = NumTraits<Scalar>::epsilon()*NumTraits<Scalar>::epsilon();
+  RealScalar tol2 = tol * tol * rhs_sqnorm;
+  RealScalar eps2 = NumTraits<Scalar>::epsilon() * NumTraits<Scalar>::epsilon();
   Index i = 0;
   Index restarts = 0;
 
-  while ( r.squaredNorm() > tol2 && i<maxIters )
-  {
+  while (r.squaredNorm() > tol2 && i < maxIters) {
     Scalar rho_old = rho;
 
     rho = r0.dot(r);
-    if (abs(rho) < eps2*r0_sqnorm)
-    {
+    if (abs(rho) < eps2 * r0_sqnorm) {
       // The new residual vector became too orthogonal to the arbitrarily chosen direction r0
       // Let's restart with a new r0:
-      r  = rhs - mat * x;
+      r = rhs - mat * x;
       r0 = r;
       rho = r0_sqnorm = r.squaredNorm();
-      if(restarts++ == 0)
-        i = 0;
+      if (restarts++ == 0) i = 0;
     }
-    Scalar beta = (rho/rho_old) * (alpha / w);
+    Scalar beta = (rho / rho_old) * (alpha / w);
     p = r + beta * (p - w * v);
-    
+
     y = precond.solve(p);
-    
+
     v.noalias() = mat * y;
 
     alpha = rho / r0.dot(v);
@@ -96,7 +90,7 @@
     t.noalias() = mat * z;
 
     RealScalar tmp = t.squaredNorm();
-    if(tmp>RealScalar(0))
+    if (tmp > RealScalar(0))
       w = t.dot(s) / tmp;
     else
       w = Scalar(0);
@@ -104,112 +98,105 @@
     r = s - w * t;
     ++i;
   }
-  tol_error = sqrt(r.squaredNorm()/rhs_sqnorm);
+  tol_error = sqrt(r.squaredNorm() / rhs_sqnorm);
   iters = i;
-  return true; 
+  return true;
 }
 
-}
+}  // namespace internal
 
-template< typename MatrixType_,
-          typename Preconditioner_ = DiagonalPreconditioner<typename MatrixType_::Scalar> >
+template <typename MatrixType_, typename Preconditioner_ = DiagonalPreconditioner<typename MatrixType_::Scalar> >
 class BiCGSTAB;
 
 namespace internal {
 
-template< typename MatrixType_, typename Preconditioner_>
-struct traits<BiCGSTAB<MatrixType_,Preconditioner_> >
-{
+template <typename MatrixType_, typename Preconditioner_>
+struct traits<BiCGSTAB<MatrixType_, Preconditioner_> > {
   typedef MatrixType_ MatrixType;
   typedef Preconditioner_ Preconditioner;
 };
 
-}
+}  // namespace internal
 
 /** \ingroup IterativeLinearSolvers_Module
-  * \brief A bi conjugate gradient stabilized solver for sparse square problems
-  *
-  * This class allows to solve for A.x = b sparse linear problems using a bi conjugate gradient
-  * stabilized algorithm. The vectors x and b can be either dense or sparse.
-  *
-  * \tparam MatrixType_ the type of the sparse matrix A, can be a dense or a sparse matrix.
-  * \tparam Preconditioner_ the type of the preconditioner. Default is DiagonalPreconditioner
-  *
-  * \implsparsesolverconcept
-  *
-  * The maximal number of iterations and tolerance value can be controlled via the setMaxIterations()
-  * and setTolerance() methods. The defaults are the size of the problem for the maximal number of iterations
-  * and NumTraits<Scalar>::epsilon() for the tolerance.
-  * 
-  * The tolerance corresponds to the relative residual error: |Ax-b|/|b|
-  * 
-  * \b Performance: when using sparse matrices, best performance is achied for a row-major sparse matrix format.
-  * Moreover, in this case multi-threading can be exploited if the user code is compiled with OpenMP enabled.
-  * See \ref TopicMultiThreading for details.
-  * 
-  * This class can be used as the direct solver classes. Here is a typical usage example:
-  * \include BiCGSTAB_simple.cpp
-  * 
-  * By default the iterations start with x=0 as an initial guess of the solution.
-  * One can control the start using the solveWithGuess() method.
-  * 
-  * BiCGSTAB can also be used in a matrix-free context, see the following \link MatrixfreeSolverExample example \endlink.
-  *
-  * \sa class SimplicialCholesky, DiagonalPreconditioner, IdentityPreconditioner
-  */
-template< typename MatrixType_, typename Preconditioner_>
-class BiCGSTAB : public IterativeSolverBase<BiCGSTAB<MatrixType_,Preconditioner_> >
-{
+ * \brief A bi conjugate gradient stabilized solver for sparse square problems
+ *
+ * This class allows to solve for A.x = b sparse linear problems using a bi conjugate gradient
+ * stabilized algorithm. The vectors x and b can be either dense or sparse.
+ *
+ * \tparam MatrixType_ the type of the sparse matrix A, can be a dense or a sparse matrix.
+ * \tparam Preconditioner_ the type of the preconditioner. Default is DiagonalPreconditioner
+ *
+ * \implsparsesolverconcept
+ *
+ * The maximal number of iterations and tolerance value can be controlled via the setMaxIterations()
+ * and setTolerance() methods. The defaults are the size of the problem for the maximal number of iterations
+ * and NumTraits<Scalar>::epsilon() for the tolerance.
+ *
+ * The tolerance corresponds to the relative residual error: |Ax-b|/|b|
+ *
+ * \b Performance: when using sparse matrices, best performance is achied for a row-major sparse matrix format.
+ * Moreover, in this case multi-threading can be exploited if the user code is compiled with OpenMP enabled.
+ * See \ref TopicMultiThreading for details.
+ *
+ * This class can be used as the direct solver classes. Here is a typical usage example:
+ * \include BiCGSTAB_simple.cpp
+ *
+ * By default the iterations start with x=0 as an initial guess of the solution.
+ * One can control the start using the solveWithGuess() method.
+ *
+ * BiCGSTAB can also be used in a matrix-free context, see the following \link MatrixfreeSolverExample example \endlink.
+ *
+ * \sa class SimplicialCholesky, DiagonalPreconditioner, IdentityPreconditioner
+ */
+template <typename MatrixType_, typename Preconditioner_>
+class BiCGSTAB : public IterativeSolverBase<BiCGSTAB<MatrixType_, Preconditioner_> > {
   typedef IterativeSolverBase<BiCGSTAB> Base;
-  using Base::matrix;
   using Base::m_error;
-  using Base::m_iterations;
   using Base::m_info;
   using Base::m_isInitialized;
-public:
+  using Base::m_iterations;
+  using Base::matrix;
+
+ public:
   typedef MatrixType_ MatrixType;
   typedef typename MatrixType::Scalar Scalar;
   typedef typename MatrixType::RealScalar RealScalar;
   typedef Preconditioner_ Preconditioner;
 
-public:
-
+ public:
   /** Default constructor. */
   BiCGSTAB() : Base() {}
 
   /** Initialize the solver with matrix \a A for further \c Ax=b solving.
-    * 
-    * This constructor is a shortcut for the default constructor followed
-    * by a call to compute().
-    * 
-    * \warning this class stores a reference to the matrix A as well as some
-    * precomputed values that depend on it. Therefore, if \a A is changed
-    * this class becomes invalid. Call compute() to update it with the new
-    * matrix A, or modify a copy of A.
-    */
-  template<typename MatrixDerived>
+   *
+   * This constructor is a shortcut for the default constructor followed
+   * by a call to compute().
+   *
+   * \warning this class stores a reference to the matrix A as well as some
+   * precomputed values that depend on it. Therefore, if \a A is changed
+   * this class becomes invalid. Call compute() to update it with the new
+   * matrix A, or modify a copy of A.
+   */
+  template <typename MatrixDerived>
   explicit BiCGSTAB(const EigenBase<MatrixDerived>& A) : Base(A.derived()) {}
 
   ~BiCGSTAB() {}
 
   /** \internal */
-  template<typename Rhs,typename Dest>
-  void _solve_vector_with_guess_impl(const Rhs& b, Dest& x) const
-  {    
+  template <typename Rhs, typename Dest>
+  void _solve_vector_with_guess_impl(const Rhs& b, Dest& x) const {
     m_iterations = Base::maxIterations();
     m_error = Base::m_tolerance;
-    
+
     bool ret = internal::bicgstab(matrix(), b, x, Base::m_preconditioner, m_iterations, m_error);
 
-    m_info = (!ret) ? NumericalIssue
-           : m_error <= Base::m_tolerance ? Success
-           : NoConvergence;
+    m_info = (!ret) ? NumericalIssue : m_error <= Base::m_tolerance ? Success : NoConvergence;
   }
 
-protected:
-
+ protected:
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_BICGSTAB_H
+#endif  // EIGEN_BICGSTAB_H
diff --git a/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h b/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h
index 912ae16..5bb0efe 100644
--- a/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h
+++ b/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h
@@ -13,100 +13,92 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
 /** \internal Low-level conjugate gradient algorithm
-  * \param mat The matrix A
-  * \param rhs The right hand side vector b
-  * \param x On input and initial solution, on output the computed solution.
-  * \param precond A preconditioner being able to efficiently solve for an
-  *                approximation of Ax=b (regardless of b)
-  * \param iters On input the max number of iteration, on output the number of performed iterations.
-  * \param tol_error On input the tolerance error, on output an estimation of the relative error.
-  */
-template<typename MatrixType, typename Rhs, typename Dest, typename Preconditioner>
-EIGEN_DONT_INLINE
-void conjugate_gradient(const MatrixType& mat, const Rhs& rhs, Dest& x,
-                        const Preconditioner& precond, Index& iters,
-                        typename Dest::RealScalar& tol_error)
-{
+ * \param mat The matrix A
+ * \param rhs The right hand side vector b
+ * \param x On input and initial solution, on output the computed solution.
+ * \param precond A preconditioner being able to efficiently solve for an
+ *                approximation of Ax=b (regardless of b)
+ * \param iters On input the max number of iteration, on output the number of performed iterations.
+ * \param tol_error On input the tolerance error, on output an estimation of the relative error.
+ */
+template <typename MatrixType, typename Rhs, typename Dest, typename Preconditioner>
+EIGEN_DONT_INLINE void conjugate_gradient(const MatrixType& mat, const Rhs& rhs, Dest& x, const Preconditioner& precond,
+                                          Index& iters, typename Dest::RealScalar& tol_error) {
   typedef typename Dest::RealScalar RealScalar;
   typedef typename Dest::Scalar Scalar;
-  typedef Matrix<Scalar,Dynamic,1> VectorType;
-  
+  typedef Matrix<Scalar, Dynamic, 1> VectorType;
+
   RealScalar tol = tol_error;
   Index maxIters = iters;
-  
+
   Index n = mat.cols();
 
-  VectorType residual = rhs - mat * x; //initial residual
+  VectorType residual = rhs - mat * x;  // initial residual
 
   RealScalar rhsNorm2 = rhs.squaredNorm();
-  if(rhsNorm2 == 0) 
-  {
+  if (rhsNorm2 == 0) {
     x.setZero();
     iters = 0;
     tol_error = 0;
     return;
   }
   const RealScalar considerAsZero = (std::numeric_limits<RealScalar>::min)();
-  RealScalar threshold = numext::maxi(RealScalar(tol*tol*rhsNorm2),considerAsZero);
+  RealScalar threshold = numext::maxi(RealScalar(tol * tol * rhsNorm2), considerAsZero);
   RealScalar residualNorm2 = residual.squaredNorm();
-  if (residualNorm2 < threshold)
-  {
+  if (residualNorm2 < threshold) {
     iters = 0;
     tol_error = numext::sqrt(residualNorm2 / rhsNorm2);
     return;
   }
 
   VectorType p(n);
-  p = precond.solve(residual);      // initial search direction
+  p = precond.solve(residual);  // initial search direction
 
   VectorType z(n), tmp(n);
   RealScalar absNew = numext::real(residual.dot(p));  // the square of the absolute value of r scaled by invM
   Index i = 0;
-  while(i < maxIters)
-  {
-    tmp.noalias() = mat * p;                    // the bottleneck of the algorithm
+  while (i < maxIters) {
+    tmp.noalias() = mat * p;  // the bottleneck of the algorithm
 
-    Scalar alpha = absNew / p.dot(tmp);         // the amount we travel on dir
-    x += alpha * p;                             // update solution
-    residual -= alpha * tmp;                    // update residual
-    
+    Scalar alpha = absNew / p.dot(tmp);  // the amount we travel on dir
+    x += alpha * p;                      // update solution
+    residual -= alpha * tmp;             // update residual
+
     residualNorm2 = residual.squaredNorm();
-    if(residualNorm2 < threshold)
-      break;
-    
-    z = precond.solve(residual);                // approximately solve for "A z = residual"
+    if (residualNorm2 < threshold) break;
+
+    z = precond.solve(residual);  // approximately solve for "A z = residual"
 
     RealScalar absOld = absNew;
-    absNew = numext::real(residual.dot(z));     // update the absolute value of r
-    RealScalar beta = absNew / absOld;          // calculate the Gram-Schmidt value used to create the new search direction
-    p = z + beta * p;                           // update search direction
+    absNew = numext::real(residual.dot(z));  // update the absolute value of r
+    RealScalar beta = absNew / absOld;       // calculate the Gram-Schmidt value used to create the new search direction
+    p = z + beta * p;                        // update search direction
     i++;
   }
   tol_error = numext::sqrt(residualNorm2 / rhsNorm2);
   iters = i;
 }
 
-}
+}  // namespace internal
 
-template< typename MatrixType_, int UpLo_=Lower,
+template <typename MatrixType_, int UpLo_ = Lower,
           typename Preconditioner_ = DiagonalPreconditioner<typename MatrixType_::Scalar> >
 class ConjugateGradient;
 
 namespace internal {
 
-template< typename MatrixType_, int UpLo_, typename Preconditioner_>
-struct traits<ConjugateGradient<MatrixType_,UpLo_,Preconditioner_> >
-{
+template <typename MatrixType_, int UpLo_, typename Preconditioner_>
+struct traits<ConjugateGradient<MatrixType_, UpLo_, Preconditioner_> > {
   typedef MatrixType_ MatrixType;
   typedef Preconditioner_ Preconditioner;
 };
 
-}
+}  // namespace internal
 
 /** \ingroup IterativeLinearSolvers_Module
   * \brief A conjugate gradient solver for sparse (or dense) self-adjoint problems
@@ -125,14 +117,14 @@
   * The maximal number of iterations and tolerance value can be controlled via the setMaxIterations()
   * and setTolerance() methods. The defaults are the size of the problem for the maximal number of iterations
   * and NumTraits<Scalar>::epsilon() for the tolerance.
-  * 
+  *
   * The tolerance corresponds to the relative residual error: |Ax-b|/|b|
-  * 
+  *
   * \b Performance: Even though the default value of \c UpLo_ is \c Lower, significantly higher performance is
   * achieved when using a complete matrix and \b Lower|Upper as the \a UpLo_ template parameter. Moreover, in this
   * case multi-threading can be exploited if the user code is compiled with OpenMP enabled.
   * See \ref TopicMultiThreading for details.
-  * 
+  *
   * This class can be used as the direct solver classes. Here is a typical usage example:
     \code
     int n = 10000;
@@ -147,71 +139,67 @@
     // update b, and solve again
     x = cg.solve(b);
     \endcode
-  * 
+  *
   * By default the iterations start with x=0 as an initial guess of the solution.
   * One can control the start using the solveWithGuess() method.
-  * 
-  * ConjugateGradient can also be used in a matrix-free context, see the following \link MatrixfreeSolverExample example \endlink.
+  *
+  * ConjugateGradient can also be used in a matrix-free context, see the following \link MatrixfreeSolverExample example
+  \endlink.
   *
   * \sa class LeastSquaresConjugateGradient, class SimplicialCholesky, DiagonalPreconditioner, IdentityPreconditioner
   */
-template< typename MatrixType_, int UpLo_, typename Preconditioner_>
-class ConjugateGradient : public IterativeSolverBase<ConjugateGradient<MatrixType_,UpLo_,Preconditioner_> >
-{
+template <typename MatrixType_, int UpLo_, typename Preconditioner_>
+class ConjugateGradient : public IterativeSolverBase<ConjugateGradient<MatrixType_, UpLo_, Preconditioner_> > {
   typedef IterativeSolverBase<ConjugateGradient> Base;
-  using Base::matrix;
   using Base::m_error;
-  using Base::m_iterations;
   using Base::m_info;
   using Base::m_isInitialized;
-public:
+  using Base::m_iterations;
+  using Base::matrix;
+
+ public:
   typedef MatrixType_ MatrixType;
   typedef typename MatrixType::Scalar Scalar;
   typedef typename MatrixType::RealScalar RealScalar;
   typedef Preconditioner_ Preconditioner;
 
-  enum {
-    UpLo = UpLo_
-  };
+  enum { UpLo = UpLo_ };
 
-public:
-
+ public:
   /** Default constructor. */
   ConjugateGradient() : Base() {}
 
   /** Initialize the solver with matrix \a A for further \c Ax=b solving.
-    * 
-    * This constructor is a shortcut for the default constructor followed
-    * by a call to compute().
-    * 
-    * \warning this class stores a reference to the matrix A as well as some
-    * precomputed values that depend on it. Therefore, if \a A is changed
-    * this class becomes invalid. Call compute() to update it with the new
-    * matrix A, or modify a copy of A.
-    */
-  template<typename MatrixDerived>
+   *
+   * This constructor is a shortcut for the default constructor followed
+   * by a call to compute().
+   *
+   * \warning this class stores a reference to the matrix A as well as some
+   * precomputed values that depend on it. Therefore, if \a A is changed
+   * this class becomes invalid. Call compute() to update it with the new
+   * matrix A, or modify a copy of A.
+   */
+  template <typename MatrixDerived>
   explicit ConjugateGradient(const EigenBase<MatrixDerived>& A) : Base(A.derived()) {}
 
   ~ConjugateGradient() {}
 
   /** \internal */
-  template<typename Rhs,typename Dest>
-  void _solve_vector_with_guess_impl(const Rhs& b, Dest& x) const
-  {
+  template <typename Rhs, typename Dest>
+  void _solve_vector_with_guess_impl(const Rhs& b, Dest& x) const {
     typedef typename Base::MatrixWrapper MatrixWrapper;
     typedef typename Base::ActualMatrixType ActualMatrixType;
     enum {
-      TransposeInput  =   (!MatrixWrapper::MatrixFree)
-                      &&  (UpLo==(Lower|Upper))
-                      &&  (!MatrixType::IsRowMajor)
-                      &&  (!NumTraits<Scalar>::IsComplex)
+      TransposeInput = (!MatrixWrapper::MatrixFree) && (UpLo == (Lower | Upper)) && (!MatrixType::IsRowMajor) &&
+                       (!NumTraits<Scalar>::IsComplex)
     };
-    typedef std::conditional_t<TransposeInput,Transpose<const ActualMatrixType>, ActualMatrixType const&> RowMajorWrapper;
-    EIGEN_STATIC_ASSERT(internal::check_implication(MatrixWrapper::MatrixFree,UpLo==(Lower|Upper)),MATRIX_FREE_CONJUGATE_GRADIENT_IS_COMPATIBLE_WITH_UPPER_UNION_LOWER_MODE_ONLY);
-    typedef std::conditional_t<UpLo==(Lower|Upper),
-                                    RowMajorWrapper,
-                                    typename MatrixWrapper::template ConstSelfAdjointViewReturnType<UpLo>::Type
-                                   > SelfAdjointWrapper;
+    typedef std::conditional_t<TransposeInput, Transpose<const ActualMatrixType>, ActualMatrixType const&>
+        RowMajorWrapper;
+    EIGEN_STATIC_ASSERT(internal::check_implication(MatrixWrapper::MatrixFree, UpLo == (Lower | Upper)),
+                        MATRIX_FREE_CONJUGATE_GRADIENT_IS_COMPATIBLE_WITH_UPPER_UNION_LOWER_MODE_ONLY);
+    typedef std::conditional_t<UpLo == (Lower | Upper), RowMajorWrapper,
+                               typename MatrixWrapper::template ConstSelfAdjointViewReturnType<UpLo>::Type>
+        SelfAdjointWrapper;
 
     m_iterations = Base::maxIterations();
     m_error = Base::m_tolerance;
@@ -221,10 +209,9 @@
     m_info = m_error <= Base::m_tolerance ? Success : NoConvergence;
   }
 
-protected:
-
+ protected:
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_CONJUGATE_GRADIENT_H
+#endif  // EIGEN_CONJUGATE_GRADIENT_H
diff --git a/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h b/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h
index 1e64504..14ae6ea 100644
--- a/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h
+++ b/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h
@@ -19,226 +19,228 @@
 
 namespace Eigen {
 /**
-  * \brief Modified Incomplete Cholesky with dual threshold
-  *
-  * References : C-J. Lin and J. J. Moré, Incomplete Cholesky Factorizations with
-  *              Limited memory, SIAM J. Sci. Comput.  21(1), pp. 24-45, 1999
-  *
-  * \tparam Scalar the scalar type of the input matrices
-  * \tparam UpLo_ The triangular part that will be used for the computations. It can be Lower
-    *               or Upper. Default is Lower.
-  * \tparam OrderingType_ The ordering method to use, either AMDOrdering<> or NaturalOrdering<>. Default is AMDOrdering<int>.
-  *
-  * \implsparsesolverconcept
-  *
-  * It performs the following incomplete factorization: \f$ S P A P' S \approx L L' \f$
-  * where L is a lower triangular factor, S is a diagonal scaling matrix, and P is a
-  * fill-in reducing permutation as computed by the ordering method.
-  *
-  * \b Shifting \b strategy: Let \f$ B = S P A P' S \f$  be the scaled matrix on which the factorization is carried out,
-  * and \f$ \beta \f$ be the minimum value of the diagonal. If \f$ \beta > 0 \f$ then, the factorization is directly performed
-  * on the matrix B. Otherwise, the factorization is performed on the shifted matrix \f$ B + (\sigma+|\beta| I \f$ where
-  * \f$ \sigma \f$ is the initial shift value as returned and set by setInitialShift() method. The default value is \f$ \sigma = 10^{-3} \f$.
-  * If the factorization fails, then the shift in doubled until it succeed or a maximum of ten attempts. If it still fails, as returned by
-  * the info() method, then you can either increase the initial shift, or better use another preconditioning technique.
-  *
-  */
+ * \brief Modified Incomplete Cholesky with dual threshold
+ *
+ * References : C-J. Lin and J. J. Moré, Incomplete Cholesky Factorizations with
+ *              Limited memory, SIAM J. Sci. Comput.  21(1), pp. 24-45, 1999
+ *
+ * \tparam Scalar the scalar type of the input matrices
+ * \tparam UpLo_ The triangular part that will be used for the computations. It can be Lower
+ *               or Upper. Default is Lower.
+ * \tparam OrderingType_ The ordering method to use, either AMDOrdering<> or NaturalOrdering<>. Default is
+ * AMDOrdering<int>.
+ *
+ * \implsparsesolverconcept
+ *
+ * It performs the following incomplete factorization: \f$ S P A P' S \approx L L' \f$
+ * where L is a lower triangular factor, S is a diagonal scaling matrix, and P is a
+ * fill-in reducing permutation as computed by the ordering method.
+ *
+ * \b Shifting \b strategy: Let \f$ B = S P A P' S \f$  be the scaled matrix on which the factorization is carried out,
+ * and \f$ \beta \f$ be the minimum value of the diagonal. If \f$ \beta > 0 \f$ then, the factorization is directly
+ * performed on the matrix B. Otherwise, the factorization is performed on the shifted matrix \f$ B + (\sigma+|\beta| I
+ * \f$ where \f$ \sigma \f$ is the initial shift value as returned and set by setInitialShift() method. The default
+ * value is \f$ \sigma = 10^{-3} \f$. If the factorization fails, then the shift in doubled until it succeed or a
+ * maximum of ten attempts. If it still fails, as returned by the info() method, then you can either increase the
+ * initial shift, or better use another preconditioning technique.
+ *
+ */
 template <typename Scalar, int UpLo_ = Lower, typename OrderingType_ = AMDOrdering<int> >
-class IncompleteCholesky : public SparseSolverBase<IncompleteCholesky<Scalar,UpLo_,OrderingType_> >
-{
-  protected:
-    typedef SparseSolverBase<IncompleteCholesky<Scalar,UpLo_,OrderingType_> > Base;
-    using Base::m_isInitialized;
-  public:
-    typedef typename NumTraits<Scalar>::Real RealScalar;
-    typedef OrderingType_ OrderingType;
-    typedef typename OrderingType::PermutationType PermutationType;
-    typedef typename PermutationType::StorageIndex StorageIndex;
-    typedef SparseMatrix<Scalar,ColMajor,StorageIndex> FactorType;
-    typedef Matrix<Scalar,Dynamic,1> VectorSx;
-    typedef Matrix<RealScalar,Dynamic,1> VectorRx;
-    typedef Matrix<StorageIndex,Dynamic, 1> VectorIx;
-    typedef std::vector<std::list<StorageIndex> > VectorList;
-    enum { UpLo = UpLo_ };
-    enum {
-      ColsAtCompileTime = Dynamic,
-      MaxColsAtCompileTime = Dynamic
-    };
-  public:
+class IncompleteCholesky : public SparseSolverBase<IncompleteCholesky<Scalar, UpLo_, OrderingType_> > {
+ protected:
+  typedef SparseSolverBase<IncompleteCholesky<Scalar, UpLo_, OrderingType_> > Base;
+  using Base::m_isInitialized;
 
-    /** Default constructor leaving the object in a partly non-initialized stage.
-      *
-      * You must call compute() or the pair analyzePattern()/factorize() to make it valid.
-      *
-      * \sa IncompleteCholesky(const MatrixType&)
-      */
-    IncompleteCholesky() : m_initialShift(1e-3),m_analysisIsOk(false),m_factorizationIsOk(false) {}
+ public:
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef OrderingType_ OrderingType;
+  typedef typename OrderingType::PermutationType PermutationType;
+  typedef typename PermutationType::StorageIndex StorageIndex;
+  typedef SparseMatrix<Scalar, ColMajor, StorageIndex> FactorType;
+  typedef Matrix<Scalar, Dynamic, 1> VectorSx;
+  typedef Matrix<RealScalar, Dynamic, 1> VectorRx;
+  typedef Matrix<StorageIndex, Dynamic, 1> VectorIx;
+  typedef std::vector<std::list<StorageIndex> > VectorList;
+  enum { UpLo = UpLo_ };
+  enum { ColsAtCompileTime = Dynamic, MaxColsAtCompileTime = Dynamic };
 
-    /** Constructor computing the incomplete factorization for the given matrix \a matrix.
-      */
-    template<typename MatrixType>
-    IncompleteCholesky(const MatrixType& matrix) : m_initialShift(1e-3),m_analysisIsOk(false),m_factorizationIsOk(false)
-    {
-      compute(matrix);
-    }
+ public:
+  /** Default constructor leaving the object in a partly non-initialized stage.
+   *
+   * You must call compute() or the pair analyzePattern()/factorize() to make it valid.
+   *
+   * \sa IncompleteCholesky(const MatrixType&)
+   */
+  IncompleteCholesky() : m_initialShift(1e-3), m_analysisIsOk(false), m_factorizationIsOk(false) {}
 
-    /** \returns number of rows of the factored matrix */
-    EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_L.rows(); }
+  /** Constructor computing the incomplete factorization for the given matrix \a matrix.
+   */
+  template <typename MatrixType>
+  IncompleteCholesky(const MatrixType& matrix)
+      : m_initialShift(1e-3), m_analysisIsOk(false), m_factorizationIsOk(false) {
+    compute(matrix);
+  }
 
-    /** \returns number of columns of the factored matrix */
-    EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_L.cols(); }
+  /** \returns number of rows of the factored matrix */
+  EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_L.rows(); }
 
+  /** \returns number of columns of the factored matrix */
+  EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_L.cols(); }
 
-    /** \brief Reports whether previous computation was successful.
-      *
-      * It triggers an assertion if \c *this has not been initialized through the respective constructor,
-      * or a call to compute() or analyzePattern().
-      *
-      * \returns \c Success if computation was successful,
-      *          \c NumericalIssue if the matrix appears to be negative.
-      */
-    ComputationInfo info() const
-    {
-      eigen_assert(m_isInitialized && "IncompleteCholesky is not initialized.");
-      return m_info;
-    }
+  /** \brief Reports whether previous computation was successful.
+   *
+   * It triggers an assertion if \c *this has not been initialized through the respective constructor,
+   * or a call to compute() or analyzePattern().
+   *
+   * \returns \c Success if computation was successful,
+   *          \c NumericalIssue if the matrix appears to be negative.
+   */
+  ComputationInfo info() const {
+    eigen_assert(m_isInitialized && "IncompleteCholesky is not initialized.");
+    return m_info;
+  }
 
-    /** \brief Set the initial shift parameter \f$ \sigma \f$.
-      */
-    void setInitialShift(RealScalar shift) { m_initialShift = shift; }
+  /** \brief Set the initial shift parameter \f$ \sigma \f$.
+   */
+  void setInitialShift(RealScalar shift) { m_initialShift = shift; }
 
-    /** \brief Computes the fill reducing permutation vector using the sparsity pattern of \a mat
-      */
-    template<typename MatrixType>
-    void analyzePattern(const MatrixType& mat)
-    {
-      OrderingType ord;
-      PermutationType pinv;
-      ord(mat.template selfadjointView<UpLo>(), pinv);
-      if(pinv.size()>0) m_perm = pinv.inverse();
-      else              m_perm.resize(0);
-      m_L.resize(mat.rows(), mat.cols());
-      m_analysisIsOk = true;
-      m_isInitialized = true;
-      m_info = Success;
-    }
+  /** \brief Computes the fill reducing permutation vector using the sparsity pattern of \a mat
+   */
+  template <typename MatrixType>
+  void analyzePattern(const MatrixType& mat) {
+    OrderingType ord;
+    PermutationType pinv;
+    ord(mat.template selfadjointView<UpLo>(), pinv);
+    if (pinv.size() > 0)
+      m_perm = pinv.inverse();
+    else
+      m_perm.resize(0);
+    m_L.resize(mat.rows(), mat.cols());
+    m_analysisIsOk = true;
+    m_isInitialized = true;
+    m_info = Success;
+  }
 
-    /** \brief Performs the numerical factorization of the input matrix \a mat
-      *
-      * The method analyzePattern() or compute() must have been called beforehand
-      * with a matrix having the same pattern.
-      *
-      * \sa compute(), analyzePattern()
-      */
-    template<typename MatrixType>
-    void factorize(const MatrixType& mat);
+  /** \brief Performs the numerical factorization of the input matrix \a mat
+   *
+   * The method analyzePattern() or compute() must have been called beforehand
+   * with a matrix having the same pattern.
+   *
+   * \sa compute(), analyzePattern()
+   */
+  template <typename MatrixType>
+  void factorize(const MatrixType& mat);
 
-    /** Computes or re-computes the incomplete Cholesky factorization of the input matrix \a mat
-      *
-      * It is a shortcut for a sequential call to the analyzePattern() and factorize() methods.
-      *
-      * \sa analyzePattern(), factorize()
-      */
-    template<typename MatrixType>
-    void compute(const MatrixType& mat)
-    {
-      analyzePattern(mat);
-      factorize(mat);
-    }
+  /** Computes or re-computes the incomplete Cholesky factorization of the input matrix \a mat
+   *
+   * It is a shortcut for a sequential call to the analyzePattern() and factorize() methods.
+   *
+   * \sa analyzePattern(), factorize()
+   */
+  template <typename MatrixType>
+  void compute(const MatrixType& mat) {
+    analyzePattern(mat);
+    factorize(mat);
+  }
 
-    // internal
-    template<typename Rhs, typename Dest>
-    void _solve_impl(const Rhs& b, Dest& x) const
-    {
-      eigen_assert(m_factorizationIsOk && "factorize() should be called first");
-      if (m_perm.rows() == b.rows())  x = m_perm * b;
-      else                            x = b;
-      x = m_scale.asDiagonal() * x;
-      x = m_L.template triangularView<Lower>().solve(x);
-      x = m_L.adjoint().template triangularView<Upper>().solve(x);
-      x = m_scale.asDiagonal() * x;
-      if (m_perm.rows() == b.rows())
-        x = m_perm.inverse() * x;
-    }
+  // internal
+  template <typename Rhs, typename Dest>
+  void _solve_impl(const Rhs& b, Dest& x) const {
+    eigen_assert(m_factorizationIsOk && "factorize() should be called first");
+    if (m_perm.rows() == b.rows())
+      x = m_perm * b;
+    else
+      x = b;
+    x = m_scale.asDiagonal() * x;
+    x = m_L.template triangularView<Lower>().solve(x);
+    x = m_L.adjoint().template triangularView<Upper>().solve(x);
+    x = m_scale.asDiagonal() * x;
+    if (m_perm.rows() == b.rows()) x = m_perm.inverse() * x;
+  }
 
-    /** \returns the sparse lower triangular factor L */
-    const FactorType& matrixL() const { eigen_assert(m_factorizationIsOk && "factorize() should be called first"); return m_L; }
+  /** \returns the sparse lower triangular factor L */
+  const FactorType& matrixL() const {
+    eigen_assert(m_factorizationIsOk && "factorize() should be called first");
+    return m_L;
+  }
 
-    /** \returns a vector representing the scaling factor S */
-    const VectorRx& scalingS() const { eigen_assert(m_factorizationIsOk && "factorize() should be called first"); return m_scale; }
+  /** \returns a vector representing the scaling factor S */
+  const VectorRx& scalingS() const {
+    eigen_assert(m_factorizationIsOk && "factorize() should be called first");
+    return m_scale;
+  }
 
-    /** \returns the fill-in reducing permutation P (can be empty for a natural ordering) */
-    const PermutationType& permutationP() const { eigen_assert(m_analysisIsOk && "analyzePattern() should be called first"); return m_perm; }
+  /** \returns the fill-in reducing permutation P (can be empty for a natural ordering) */
+  const PermutationType& permutationP() const {
+    eigen_assert(m_analysisIsOk && "analyzePattern() should be called first");
+    return m_perm;
+  }
 
-  protected:
-    FactorType m_L;              // The lower part stored in CSC
-    VectorRx m_scale;            // The vector for scaling the matrix
-    RealScalar m_initialShift;   // The initial shift parameter
-    bool m_analysisIsOk;
-    bool m_factorizationIsOk;
-    ComputationInfo m_info;
-    PermutationType m_perm;
+ protected:
+  FactorType m_L;             // The lower part stored in CSC
+  VectorRx m_scale;           // The vector for scaling the matrix
+  RealScalar m_initialShift;  // The initial shift parameter
+  bool m_analysisIsOk;
+  bool m_factorizationIsOk;
+  ComputationInfo m_info;
+  PermutationType m_perm;
 
-  private:
-    inline void updateList(Ref<const VectorIx> colPtr, Ref<VectorIx> rowIdx, Ref<VectorSx> vals, const Index& col, const Index& jk, VectorIx& firstElt, VectorList& listCol);
+ private:
+  inline void updateList(Ref<const VectorIx> colPtr, Ref<VectorIx> rowIdx, Ref<VectorSx> vals, const Index& col,
+                         const Index& jk, VectorIx& firstElt, VectorList& listCol);
 };
 
 // Based on the following paper:
 //   C-J. Lin and J. J. Moré, Incomplete Cholesky Factorizations with
 //   Limited memory, SIAM J. Sci. Comput.  21(1), pp. 24-45, 1999
 //   http://ftp.mcs.anl.gov/pub/tech_reports/reports/P682.pdf
-template<typename Scalar, int UpLo_, typename OrderingType>
-template<typename MatrixType_>
-void IncompleteCholesky<Scalar,UpLo_, OrderingType>::factorize(const MatrixType_& mat)
-{
+template <typename Scalar, int UpLo_, typename OrderingType>
+template <typename MatrixType_>
+void IncompleteCholesky<Scalar, UpLo_, OrderingType>::factorize(const MatrixType_& mat) {
   using std::sqrt;
   eigen_assert(m_analysisIsOk && "analyzePattern() should be called first");
 
-  // Dropping strategy : Keep only the p largest elements per column, where p is the number of elements in the column of the original matrix. Other strategies will be added
+  // Dropping strategy : Keep only the p largest elements per column, where p is the number of elements in the column of
+  // the original matrix. Other strategies will be added
 
   // Apply the fill-reducing permutation computed in analyzePattern()
-  if (m_perm.rows() == mat.rows() ) // To detect the null permutation
+  if (m_perm.rows() == mat.rows())  // To detect the null permutation
   {
     // The temporary is needed to make sure that the diagonal entry is properly sorted
     FactorType tmp(mat.rows(), mat.cols());
     tmp = mat.template selfadjointView<UpLo_>().twistedBy(m_perm);
     m_L.template selfadjointView<Lower>() = tmp.template selfadjointView<Lower>();
-  }
-  else
-  {
+  } else {
     m_L.template selfadjointView<Lower>() = mat.template selfadjointView<UpLo_>();
   }
 
   Index n = m_L.cols();
   Index nnz = m_L.nonZeros();
-  Map<VectorSx> vals(m_L.valuePtr(), nnz);         //values
-  Map<VectorIx> rowIdx(m_L.innerIndexPtr(), nnz);  //Row indices
-  Map<VectorIx> colPtr( m_L.outerIndexPtr(), n+1); // Pointer to the beginning of each row
-  VectorIx firstElt(n-1); // for each j, points to the next entry in vals that will be used in the factorization
-  VectorList listCol(n);  // listCol(j) is a linked list of columns to update column j
-  VectorSx col_vals(n);   // Store a  nonzero values in each column
-  VectorIx col_irow(n);   // Row indices of nonzero elements in each column
+  Map<VectorSx> vals(m_L.valuePtr(), nnz);           // values
+  Map<VectorIx> rowIdx(m_L.innerIndexPtr(), nnz);    // Row indices
+  Map<VectorIx> colPtr(m_L.outerIndexPtr(), n + 1);  // Pointer to the beginning of each row
+  VectorIx firstElt(n - 1);  // for each j, points to the next entry in vals that will be used in the factorization
+  VectorList listCol(n);     // listCol(j) is a linked list of columns to update column j
+  VectorSx col_vals(n);      // Store a  nonzero values in each column
+  VectorIx col_irow(n);      // Row indices of nonzero elements in each column
   VectorIx col_pattern(n);
   col_pattern.fill(-1);
   StorageIndex col_nnz;
 
-
   // Computes the scaling factors
   m_scale.resize(n);
   m_scale.setZero();
   for (Index j = 0; j < n; j++)
-    for (Index k = colPtr[j]; k < colPtr[j+1]; k++)
-    {
+    for (Index k = colPtr[j]; k < colPtr[j + 1]; k++) {
       m_scale(j) += numext::abs2(vals(k));
-      if(rowIdx[k]!=j)
-        m_scale(rowIdx[k]) += numext::abs2(vals(k));
+      if (rowIdx[k] != j) m_scale(rowIdx[k]) += numext::abs2(vals(k));
     }
 
   m_scale = m_scale.cwiseSqrt().cwiseSqrt();
 
   for (Index j = 0; j < n; ++j)
-    if(m_scale(j)>(std::numeric_limits<RealScalar>::min)())
-      m_scale(j) = RealScalar(1)/m_scale(j);
+    if (m_scale(j) > (std::numeric_limits<RealScalar>::min)())
+      m_scale(j) = RealScalar(1) / m_scale(j);
     else
       m_scale(j) = 1;
 
@@ -246,40 +248,34 @@
 
   // Scale and compute the shift for the matrix
   RealScalar mindiag = NumTraits<RealScalar>::highest();
-  for (Index j = 0; j < n; j++)
-  {
-    for (Index k = colPtr[j]; k < colPtr[j+1]; k++)
-      vals[k] *= (m_scale(j)*m_scale(rowIdx[k]));
-    eigen_internal_assert(rowIdx[colPtr[j]]==j && "IncompleteCholesky: only the lower triangular part must be stored");
+  for (Index j = 0; j < n; j++) {
+    for (Index k = colPtr[j]; k < colPtr[j + 1]; k++) vals[k] *= (m_scale(j) * m_scale(rowIdx[k]));
+    eigen_internal_assert(rowIdx[colPtr[j]] == j &&
+                          "IncompleteCholesky: only the lower triangular part must be stored");
     mindiag = numext::mini(numext::real(vals[colPtr[j]]), mindiag);
   }
 
   FactorType L_save = m_L;
 
   RealScalar shift = 0;
-  if(mindiag <= RealScalar(0.))
-    shift = m_initialShift - mindiag;
+  if (mindiag <= RealScalar(0.)) shift = m_initialShift - mindiag;
 
   m_info = NumericalIssue;
 
   // Try to perform the incomplete factorization using the current shift
   int iter = 0;
-  do
-  {
+  do {
     // Apply the shift to the diagonal elements of the matrix
-    for (Index j = 0; j < n; j++)
-      vals[colPtr[j]] += shift;
+    for (Index j = 0; j < n; j++) vals[colPtr[j]] += shift;
 
     // jki version of the Cholesky factorization
-    Index j=0;
-    for (; j < n; ++j)
-    {
+    Index j = 0;
+    for (; j < n; ++j) {
       // Left-looking factorization of the j-th column
       // First, load the j-th column into col_vals
       Scalar diag = vals[colPtr[j]];  // It is assumed that only the lower part is stored
       col_nnz = 0;
-      for (Index i = colPtr[j] + 1; i < colPtr[j+1]; i++)
-      {
+      for (Index i = colPtr[j] + 1; i < colPtr[j + 1]; i++) {
         StorageIndex l = rowIdx[i];
         col_vals(col_nnz) = vals[i];
         col_irow(col_nnz) = l;
@@ -289,69 +285,60 @@
       {
         typename std::list<StorageIndex>::iterator k;
         // Browse all previous columns that will update column j
-        for(k = listCol[j].begin(); k != listCol[j].end(); k++)
-        {
-          Index jk = firstElt(*k); // First element to use in the column
-          eigen_internal_assert(rowIdx[jk]==j);
+        for (k = listCol[j].begin(); k != listCol[j].end(); k++) {
+          Index jk = firstElt(*k);  // First element to use in the column
+          eigen_internal_assert(rowIdx[jk] == j);
           Scalar v_j_jk = numext::conj(vals[jk]);
 
           jk += 1;
-          for (Index i = jk; i < colPtr[*k+1]; i++)
-          {
+          for (Index i = jk; i < colPtr[*k + 1]; i++) {
             StorageIndex l = rowIdx[i];
-            if(col_pattern[l]<0)
-            {
+            if (col_pattern[l] < 0) {
               col_vals(col_nnz) = vals[i] * v_j_jk;
               col_irow[col_nnz] = l;
               col_pattern(l) = col_nnz;
               col_nnz++;
-            }
-            else
+            } else
               col_vals(col_pattern[l]) -= vals[i] * v_j_jk;
           }
-          updateList(colPtr,rowIdx,vals, *k, jk, firstElt, listCol);
+          updateList(colPtr, rowIdx, vals, *k, jk, firstElt, listCol);
         }
       }
 
       // Scale the current column
-      if(numext::real(diag) <= 0)
-      {
-        if(++iter>=10)
-          return;
+      if (numext::real(diag) <= 0) {
+        if (++iter >= 10) return;
 
         // increase shift
-        shift = numext::maxi(m_initialShift,RealScalar(2)*shift);
+        shift = numext::maxi(m_initialShift, RealScalar(2) * shift);
         // restore m_L, col_pattern, and listCol
         vals = Map<const VectorSx>(L_save.valuePtr(), nnz);
         rowIdx = Map<const VectorIx>(L_save.innerIndexPtr(), nnz);
-        colPtr = Map<const VectorIx>(L_save.outerIndexPtr(), n+1);
+        colPtr = Map<const VectorIx>(L_save.outerIndexPtr(), n + 1);
         col_pattern.fill(-1);
-        for(Index i=0; i<n; ++i)
-          listCol[i].clear();
+        for (Index i = 0; i < n; ++i) listCol[i].clear();
 
         break;
       }
 
       RealScalar rdiag = sqrt(numext::real(diag));
       vals[colPtr[j]] = rdiag;
-      for (Index k = 0; k<col_nnz; ++k)
-      {
+      for (Index k = 0; k < col_nnz; ++k) {
         Index i = col_irow[k];
-        //Scale
+        // Scale
         col_vals(k) /= rdiag;
-        //Update the remaining diagonals with col_vals
+        // Update the remaining diagonals with col_vals
         vals[colPtr[i]] -= numext::abs2(col_vals(k));
       }
       // Select the largest p elements
       // p is the original number of elements in the column (without the diagonal)
-      Index p = colPtr[j+1] - colPtr[j] - 1 ;
+      Index p = colPtr[j + 1] - colPtr[j] - 1;
       Ref<VectorSx> cvals = col_vals.head(col_nnz);
       Ref<VectorIx> cirow = col_irow.head(col_nnz);
-      internal::QuickSplit(cvals,cirow, p);
+      internal::QuickSplit(cvals, cirow, p);
       // Insert the largest p elements in the matrix
       Index cpt = 0;
-      for (Index i = colPtr[j]+1; i < colPtr[j+1]; i++)
-      {
+      for (Index i = colPtr[j] + 1; i < colPtr[j + 1]; i++) {
         vals[i] = col_vals(cpt);
         rowIdx[i] = col_irow(cpt);
         // restore col_pattern:
@@ -359,38 +346,37 @@
         cpt++;
       }
       // Get the first smallest row index and put it after the diagonal element
-      Index jk = colPtr(j)+1;
-      updateList(colPtr,rowIdx,vals,j,jk,firstElt,listCol);
+      Index jk = colPtr(j) + 1;
+      updateList(colPtr, rowIdx, vals, j, jk, firstElt, listCol);
     }
 
-    if(j==n)
-    {
+    if (j == n) {
       m_factorizationIsOk = true;
       m_info = Success;
     }
-  } while(m_info!=Success);
+  } while (m_info != Success);
 }
 
-template<typename Scalar, int UpLo_, typename OrderingType>
-inline void IncompleteCholesky<Scalar,UpLo_, OrderingType>::updateList(Ref<const VectorIx> colPtr, Ref<VectorIx> rowIdx, Ref<VectorSx> vals, const Index& col, const Index& jk, VectorIx& firstElt, VectorList& listCol)
-{
-  if (jk < colPtr(col+1) )
-  {
-    Index p = colPtr(col+1) - jk;
+template <typename Scalar, int UpLo_, typename OrderingType>
+inline void IncompleteCholesky<Scalar, UpLo_, OrderingType>::updateList(Ref<const VectorIx> colPtr,
+                                                                        Ref<VectorIx> rowIdx, Ref<VectorSx> vals,
+                                                                        const Index& col, const Index& jk,
+                                                                        VectorIx& firstElt, VectorList& listCol) {
+  if (jk < colPtr(col + 1)) {
+    Index p = colPtr(col + 1) - jk;
     Index minpos;
-    rowIdx.segment(jk,p).minCoeff(&minpos);
+    rowIdx.segment(jk, p).minCoeff(&minpos);
     minpos += jk;
-    if (rowIdx(minpos) != rowIdx(jk))
-    {
-      //Swap
-      std::swap(rowIdx(jk),rowIdx(minpos));
-      std::swap(vals(jk),vals(minpos));
+    if (rowIdx(minpos) != rowIdx(jk)) {
+      // Swap
+      std::swap(rowIdx(jk), rowIdx(minpos));
+      std::swap(vals(jk), vals(minpos));
     }
-    firstElt(col) = internal::convert_index<StorageIndex,Index>(jk);
-    listCol[rowIdx(jk)].push_back(internal::convert_index<StorageIndex,Index>(col));
+    firstElt(col) = internal::convert_index<StorageIndex, Index>(jk);
+    listCol[rowIdx(jk)].push_back(internal::convert_index<StorageIndex, Index>(col));
   }
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
 #endif
diff --git a/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h b/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h
index 6b2a113..575a7b2 100644
--- a/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h
+++ b/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h
@@ -11,7 +11,6 @@
 #ifndef EIGEN_INCOMPLETE_LUT_H
 #define EIGEN_INCOMPLETE_LUT_H
 
-
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
@@ -20,34 +19,33 @@
 namespace internal {
 
 /** \internal
-  * Compute a quick-sort split of a vector
-  * On output, the vector row is permuted such that its elements satisfy
-  * abs(row(i)) >= abs(row(ncut)) if i<ncut
-  * abs(row(i)) <= abs(row(ncut)) if i>ncut
-  * \param row The vector of values
-  * \param ind The array of index for the elements in @p row
-  * \param ncut  The number of largest elements to keep
-  **/
+ * Compute a quick-sort split of a vector
+ * On output, the vector row is permuted such that its elements satisfy
+ * abs(row(i)) >= abs(row(ncut)) if i<ncut
+ * abs(row(i)) <= abs(row(ncut)) if i>ncut
+ * \param row The vector of values
+ * \param ind The array of index for the elements in @p row
+ * \param ncut  The number of largest elements to keep
+ **/
 template <typename VectorV, typename VectorI>
-Index QuickSplit(VectorV &row, VectorI &ind, Index ncut)
-{
+Index QuickSplit(VectorV& row, VectorI& ind, Index ncut) {
   typedef typename VectorV::RealScalar RealScalar;
-  using std::swap;
   using std::abs;
+  using std::swap;
   Index mid;
   Index n = row.size(); /* length of the vector */
-  Index first, last ;
+  Index first, last;
 
   ncut--; /* to fit the zero-based indices */
   first = 0;
-  last = n-1;
-  if (ncut < first || ncut > last ) return 0;
+  last = n - 1;
+  if (ncut < first || ncut > last) return 0;
 
   do {
     mid = first;
     RealScalar abskey = abs(row(mid));
     for (Index j = first + 1; j <= last; j++) {
-      if ( abs(row(j)) > abskey) {
+      if (abs(row(j)) > abskey) {
         ++mid;
         swap(row(mid), row(j));
         swap(ind(mid), ind(j));
@@ -57,157 +55,146 @@
     swap(row(mid), row(first));
     swap(ind(mid), ind(first));
 
-    if (mid > ncut) last = mid - 1;
-    else if (mid < ncut ) first = mid + 1;
-  } while (mid != ncut );
+    if (mid > ncut)
+      last = mid - 1;
+    else if (mid < ncut)
+      first = mid + 1;
+  } while (mid != ncut);
 
   return 0; /* mid is equal to ncut */
 }
 
-}// end namespace internal
+}  // end namespace internal
 
 /** \ingroup IterativeLinearSolvers_Module
-  * \class IncompleteLUT
-  * \brief Incomplete LU factorization with dual-threshold strategy
-  *
-  * \implsparsesolverconcept
-  *
-  * During the numerical factorization, two dropping rules are used :
-  *  1) any element whose magnitude is less than some tolerance is dropped.
-  *    This tolerance is obtained by multiplying the input tolerance @p droptol
-  *    by the average magnitude of all the original elements in the current row.
-  *  2) After the elimination of the row, only the @p fill largest elements in
-  *    the L part and the @p fill largest elements in the U part are kept
-  *    (in addition to the diagonal element ). Note that @p fill is computed from
-  *    the input parameter @p fillfactor which is used the ratio to control the fill_in
-  *    relatively to the initial number of nonzero elements.
-  *
-  * The two extreme cases are when @p droptol=0 (to keep all the @p fill*2 largest elements)
-  * and when @p fill=n/2 with @p droptol being different to zero.
-  *
-  * References : Yousef Saad, ILUT: A dual threshold incomplete LU factorization,
-  *              Numerical Linear Algebra with Applications, 1(4), pp 387-402, 1994.
-  *
-  * NOTE : The following implementation is derived from the ILUT implementation
-  * in the SPARSKIT package, Copyright (C) 2005, the Regents of the University of Minnesota
-  *  released under the terms of the GNU LGPL:
-  *    http://www-users.cs.umn.edu/~saad/software/SPARSKIT/README
-  * However, Yousef Saad gave us permission to relicense his ILUT code to MPL2.
-  * See the Eigen mailing list archive, thread: ILUT, date: July 8, 2012:
-  *   http://listengine.tuxfamily.org/lists.tuxfamily.org/eigen/2012/07/msg00064.html
-  * alternatively, on GMANE:
-  *   http://comments.gmane.org/gmane.comp.lib.eigen/3302
-  */
+ * \class IncompleteLUT
+ * \brief Incomplete LU factorization with dual-threshold strategy
+ *
+ * \implsparsesolverconcept
+ *
+ * During the numerical factorization, two dropping rules are used :
+ *  1) any element whose magnitude is less than some tolerance is dropped.
+ *    This tolerance is obtained by multiplying the input tolerance @p droptol
+ *    by the average magnitude of all the original elements in the current row.
+ *  2) After the elimination of the row, only the @p fill largest elements in
+ *    the L part and the @p fill largest elements in the U part are kept
+ *    (in addition to the diagonal element ). Note that @p fill is computed from
+ *    the input parameter @p fillfactor which is used the ratio to control the fill_in
+ *    relatively to the initial number of nonzero elements.
+ *
+ * The two extreme cases are when @p droptol=0 (to keep all the @p fill*2 largest elements)
+ * and when @p fill=n/2 with @p droptol being different to zero.
+ *
+ * References : Yousef Saad, ILUT: A dual threshold incomplete LU factorization,
+ *              Numerical Linear Algebra with Applications, 1(4), pp 387-402, 1994.
+ *
+ * NOTE : The following implementation is derived from the ILUT implementation
+ * in the SPARSKIT package, Copyright (C) 2005, the Regents of the University of Minnesota
+ *  released under the terms of the GNU LGPL:
+ *    http://www-users.cs.umn.edu/~saad/software/SPARSKIT/README
+ * However, Yousef Saad gave us permission to relicense his ILUT code to MPL2.
+ * See the Eigen mailing list archive, thread: ILUT, date: July 8, 2012:
+ *   http://listengine.tuxfamily.org/lists.tuxfamily.org/eigen/2012/07/msg00064.html
+ * alternatively, on GMANE:
+ *   http://comments.gmane.org/gmane.comp.lib.eigen/3302
+ */
 template <typename Scalar_, typename StorageIndex_ = int>
-class IncompleteLUT : public SparseSolverBase<IncompleteLUT<Scalar_, StorageIndex_> >
-{
-  protected:
-    typedef SparseSolverBase<IncompleteLUT> Base;
-    using Base::m_isInitialized;
-  public:
-    typedef Scalar_ Scalar;
-    typedef StorageIndex_ StorageIndex;
-    typedef typename NumTraits<Scalar>::Real RealScalar;
-    typedef Matrix<Scalar,Dynamic,1> Vector;
-    typedef Matrix<StorageIndex,Dynamic,1> VectorI;
-    typedef SparseMatrix<Scalar,RowMajor,StorageIndex> FactorType;
+class IncompleteLUT : public SparseSolverBase<IncompleteLUT<Scalar_, StorageIndex_> > {
+ protected:
+  typedef SparseSolverBase<IncompleteLUT> Base;
+  using Base::m_isInitialized;
 
-    enum {
-      ColsAtCompileTime = Dynamic,
-      MaxColsAtCompileTime = Dynamic
-    };
+ public:
+  typedef Scalar_ Scalar;
+  typedef StorageIndex_ StorageIndex;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef Matrix<Scalar, Dynamic, 1> Vector;
+  typedef Matrix<StorageIndex, Dynamic, 1> VectorI;
+  typedef SparseMatrix<Scalar, RowMajor, StorageIndex> FactorType;
 
-  public:
+  enum { ColsAtCompileTime = Dynamic, MaxColsAtCompileTime = Dynamic };
 
-    IncompleteLUT()
-      : m_droptol(NumTraits<Scalar>::dummy_precision()), m_fillfactor(10),
-        m_analysisIsOk(false), m_factorizationIsOk(false)
-    {}
+ public:
+  IncompleteLUT()
+      : m_droptol(NumTraits<Scalar>::dummy_precision()),
+        m_fillfactor(10),
+        m_analysisIsOk(false),
+        m_factorizationIsOk(false) {}
 
-    template<typename MatrixType>
-    explicit IncompleteLUT(const MatrixType& mat, const RealScalar& droptol=NumTraits<Scalar>::dummy_precision(), int fillfactor = 10)
-      : m_droptol(droptol),m_fillfactor(fillfactor),
-        m_analysisIsOk(false),m_factorizationIsOk(false)
-    {
-      eigen_assert(fillfactor != 0);
-      compute(mat);
-    }
+  template <typename MatrixType>
+  explicit IncompleteLUT(const MatrixType& mat, const RealScalar& droptol = NumTraits<Scalar>::dummy_precision(),
+                         int fillfactor = 10)
+      : m_droptol(droptol), m_fillfactor(fillfactor), m_analysisIsOk(false), m_factorizationIsOk(false) {
+    eigen_assert(fillfactor != 0);
+    compute(mat);
+  }
 
-    EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_lu.rows(); }
+  EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_lu.rows(); }
 
-    EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_lu.cols(); }
+  EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_lu.cols(); }
 
-    /** \brief Reports whether previous computation was successful.
-      *
-      * \returns \c Success if computation was successful,
-      *          \c NumericalIssue if the matrix.appears to be negative.
-      */
-    ComputationInfo info() const
-    {
-      eigen_assert(m_isInitialized && "IncompleteLUT is not initialized.");
-      return m_info;
-    }
+  /** \brief Reports whether previous computation was successful.
+   *
+   * \returns \c Success if computation was successful,
+   *          \c NumericalIssue if the matrix.appears to be negative.
+   */
+  ComputationInfo info() const {
+    eigen_assert(m_isInitialized && "IncompleteLUT is not initialized.");
+    return m_info;
+  }
 
-    template<typename MatrixType>
-    void analyzePattern(const MatrixType& amat);
+  template <typename MatrixType>
+  void analyzePattern(const MatrixType& amat);
 
-    template<typename MatrixType>
-    void factorize(const MatrixType& amat);
+  template <typename MatrixType>
+  void factorize(const MatrixType& amat);
 
-    /**
-      * Compute an incomplete LU factorization with dual threshold on the matrix mat
-      * No pivoting is done in this version
-      *
-      **/
-    template<typename MatrixType>
-    IncompleteLUT& compute(const MatrixType& amat)
-    {
-      analyzePattern(amat);
-      factorize(amat);
-      return *this;
-    }
+  /**
+   * Compute an incomplete LU factorization with dual threshold on the matrix mat
+   * No pivoting is done in this version
+   *
+   **/
+  template <typename MatrixType>
+  IncompleteLUT& compute(const MatrixType& amat) {
+    analyzePattern(amat);
+    factorize(amat);
+    return *this;
+  }
 
-    void setDroptol(const RealScalar& droptol);
-    void setFillfactor(int fillfactor);
+  void setDroptol(const RealScalar& droptol);
+  void setFillfactor(int fillfactor);
 
-    template<typename Rhs, typename Dest>
-    void _solve_impl(const Rhs& b, Dest& x) const
-    {
-      x = m_Pinv * b;
-      x = m_lu.template triangularView<UnitLower>().solve(x);
-      x = m_lu.template triangularView<Upper>().solve(x);
-      x = m_P * x;
-    }
+  template <typename Rhs, typename Dest>
+  void _solve_impl(const Rhs& b, Dest& x) const {
+    x = m_Pinv * b;
+    x = m_lu.template triangularView<UnitLower>().solve(x);
+    x = m_lu.template triangularView<Upper>().solve(x);
+    x = m_P * x;
+  }
 
-protected:
+ protected:
+  /** keeps off-diagonal entries; drops diagonal entries */
+  struct keep_diag {
+    inline bool operator()(const Index& row, const Index& col, const Scalar&) const { return row != col; }
+  };
 
-    /** keeps off-diagonal entries; drops diagonal entries */
-    struct keep_diag {
-      inline bool operator() (const Index& row, const Index& col, const Scalar&) const
-      {
-        return row!=col;
-      }
-    };
-
-protected:
-
-    FactorType m_lu;
-    RealScalar m_droptol;
-    int m_fillfactor;
-    bool m_analysisIsOk;
-    bool m_factorizationIsOk;
-    ComputationInfo m_info;
-    PermutationMatrix<Dynamic,Dynamic,StorageIndex> m_P;     // Fill-reducing permutation
-    PermutationMatrix<Dynamic,Dynamic,StorageIndex> m_Pinv;  // Inverse permutation
+ protected:
+  FactorType m_lu;
+  RealScalar m_droptol;
+  int m_fillfactor;
+  bool m_analysisIsOk;
+  bool m_factorizationIsOk;
+  ComputationInfo m_info;
+  PermutationMatrix<Dynamic, Dynamic, StorageIndex> m_P;     // Fill-reducing permutation
+  PermutationMatrix<Dynamic, Dynamic, StorageIndex> m_Pinv;  // Inverse permutation
 };
 
 /**
  * Set control parameter droptol
  *  \param droptol   Drop any element whose magnitude is less than this tolerance
  **/
-template<typename Scalar, typename StorageIndex>
-void IncompleteLUT<Scalar,StorageIndex>::setDroptol(const RealScalar& droptol)
-{
+template <typename Scalar, typename StorageIndex>
+void IncompleteLUT<Scalar, StorageIndex>::setDroptol(const RealScalar& droptol) {
   this->m_droptol = droptol;
 }
 
@@ -215,53 +202,50 @@
  * Set control parameter fillfactor
  * \param fillfactor  This is used to compute the  number @p fill_in of largest elements to keep on each row.
  **/
-template<typename Scalar, typename StorageIndex>
-void IncompleteLUT<Scalar,StorageIndex>::setFillfactor(int fillfactor)
-{
+template <typename Scalar, typename StorageIndex>
+void IncompleteLUT<Scalar, StorageIndex>::setFillfactor(int fillfactor) {
   this->m_fillfactor = fillfactor;
 }
 
 template <typename Scalar, typename StorageIndex>
-template<typename MatrixType_>
-void IncompleteLUT<Scalar,StorageIndex>::analyzePattern(const MatrixType_& amat)
-{
+template <typename MatrixType_>
+void IncompleteLUT<Scalar, StorageIndex>::analyzePattern(const MatrixType_& amat) {
   // Compute the Fill-reducing permutation
   // Since ILUT does not perform any numerical pivoting,
   // it is highly preferable to keep the diagonal through symmetric permutations.
   // To this end, let's symmetrize the pattern and perform AMD on it.
-  SparseMatrix<Scalar,ColMajor, StorageIndex> mat1 = amat;
-  SparseMatrix<Scalar,ColMajor, StorageIndex> mat2 = amat.transpose();
+  SparseMatrix<Scalar, ColMajor, StorageIndex> mat1 = amat;
+  SparseMatrix<Scalar, ColMajor, StorageIndex> mat2 = amat.transpose();
   // FIXME for a matrix with nearly symmetric pattern, mat2+mat1 is the appropriate choice.
   //       on the other hand for a really non-symmetric pattern, mat2*mat1 should be preferred...
-  SparseMatrix<Scalar,ColMajor, StorageIndex> AtA = mat2 + mat1;
+  SparseMatrix<Scalar, ColMajor, StorageIndex> AtA = mat2 + mat1;
   AMDOrdering<StorageIndex> ordering;
-  ordering(AtA,m_P);
-  m_Pinv  = m_P.inverse(); // cache the inverse permutation
+  ordering(AtA, m_P);
+  m_Pinv = m_P.inverse();  // cache the inverse permutation
   m_analysisIsOk = true;
   m_factorizationIsOk = false;
   m_isInitialized = true;
 }
 
 template <typename Scalar, typename StorageIndex>
-template<typename MatrixType_>
-void IncompleteLUT<Scalar,StorageIndex>::factorize(const MatrixType_& amat)
-{
+template <typename MatrixType_>
+void IncompleteLUT<Scalar, StorageIndex>::factorize(const MatrixType_& amat) {
+  using internal::convert_index;
+  using std::abs;
   using std::sqrt;
   using std::swap;
-  using std::abs;
-  using internal::convert_index;
 
   eigen_assert((amat.rows() == amat.cols()) && "The factorization should be done on a square matrix");
   Index n = amat.cols();  // Size of the matrix
-  m_lu.resize(n,n);
+  m_lu.resize(n, n);
   // Declare Working vectors and variables
-  Vector u(n) ;     // real values of the row -- maximum size is n --
-  VectorI ju(n);   // column position of the values in u -- maximum size  is n
-  VectorI jr(n);   // Indicate the position of the nonzero elements in the vector u -- A zero location is indicated by -1
+  Vector u(n);    // real values of the row -- maximum size is n --
+  VectorI ju(n);  // column position of the values in u -- maximum size  is n
+  VectorI jr(n);  // Indicate the position of the nonzero elements in the vector u -- A zero location is indicated by -1
 
   // Apply the fill-reducing permutation
   eigen_assert(m_analysisIsOk && "You must first call analyzePattern()");
-  SparseMatrix<Scalar,RowMajor, StorageIndex> mat;
+  SparseMatrix<Scalar, RowMajor, StorageIndex> mat;
   mat = amat.twistedBy(m_Pinv);
 
   // Initialization
@@ -270,44 +254,37 @@
   u.fill(0);
 
   // number of largest elements to keep in each row:
-  Index fill_in = (amat.nonZeros()*m_fillfactor)/n + 1;
+  Index fill_in = (amat.nonZeros() * m_fillfactor) / n + 1;
   if (fill_in > n) fill_in = n;
 
   // number of largest nonzero elements to keep in the L and the U part of the current row:
-  Index nnzL = fill_in/2;
+  Index nnzL = fill_in / 2;
   Index nnzU = nnzL;
   m_lu.reserve(n * (nnzL + nnzU + 1));
 
   // global loop over the rows of the sparse matrix
-  for (Index ii = 0; ii < n; ii++)
-  {
+  for (Index ii = 0; ii < n; ii++) {
     // 1 - copy the lower and the upper part of the row i of mat in the working vector u
 
-    Index sizeu = 1; // number of nonzero elements in the upper part of the current row
-    Index sizel = 0; // number of nonzero elements in the lower part of the current row
-    ju(ii)    = convert_index<StorageIndex>(ii);
-    u(ii)     = 0;
-    jr(ii)    = convert_index<StorageIndex>(ii);
+    Index sizeu = 1;  // number of nonzero elements in the upper part of the current row
+    Index sizel = 0;  // number of nonzero elements in the lower part of the current row
+    ju(ii) = convert_index<StorageIndex>(ii);
+    u(ii) = 0;
+    jr(ii) = convert_index<StorageIndex>(ii);
     RealScalar rownorm = 0;
 
-    typename FactorType::InnerIterator j_it(mat, ii); // Iterate through the current row ii
-    for (; j_it; ++j_it)
-    {
+    typename FactorType::InnerIterator j_it(mat, ii);  // Iterate through the current row ii
+    for (; j_it; ++j_it) {
       Index k = j_it.index();
-      if (k < ii)
-      {
+      if (k < ii) {
         // copy the lower part
         ju(sizel) = convert_index<StorageIndex>(k);
         u(sizel) = j_it.value();
         jr(k) = convert_index<StorageIndex>(sizel);
         ++sizel;
-      }
-      else if (k == ii)
-      {
+      } else if (k == ii) {
         u(ii) = j_it.value();
-      }
-      else
-      {
+      } else {
         // copy the upper part
         Index jpos = ii + sizeu;
         ju(jpos) = convert_index<StorageIndex>(k);
@@ -319,8 +296,7 @@
     }
 
     // 2 - detect possible zero row
-    if(rownorm==0)
-    {
+    if (rownorm == 0) {
       m_info = NumericalIssue;
       return;
     }
@@ -330,15 +306,13 @@
     // 3 - eliminate the previous nonzero rows
     Index jj = 0;
     Index len = 0;
-    while (jj < sizel)
-    {
+    while (jj < sizel) {
       // In order to eliminate in the correct order,
       // we must select first the smallest column index among  ju(jj:sizel)
       Index k;
-      Index minrow = ju.segment(jj,sizel-jj).minCoeff(&k); // k is relative to the segment
+      Index minrow = ju.segment(jj, sizel - jj).minCoeff(&k);  // k is relative to the segment
       k += jj;
-      if (minrow != ju(jj))
-      {
+      if (minrow != ju(jj)) {
         // swap the two locations
         Index j = ju(jj);
         swap(ju(jj), ju(k));
@@ -352,55 +326,51 @@
       // Start elimination
       typename FactorType::InnerIterator ki_it(m_lu, minrow);
       while (ki_it && ki_it.index() < minrow) ++ki_it;
-      eigen_internal_assert(ki_it && ki_it.col()==minrow);
+      eigen_internal_assert(ki_it && ki_it.col() == minrow);
       Scalar fact = u(jj) / ki_it.value();
 
       // drop too small elements
-      if(abs(fact) <= m_droptol)
-      {
+      if (abs(fact) <= m_droptol) {
         jj++;
         continue;
       }
 
       // linear combination of the current row ii and the row minrow
       ++ki_it;
-      for (; ki_it; ++ki_it)
-      {
+      for (; ki_it; ++ki_it) {
         Scalar prod = fact * ki_it.value();
-        Index j     = ki_it.index();
-        Index jpos  = jr(j);
-        if (jpos == -1) // fill-in element
+        Index j = ki_it.index();
+        Index jpos = jr(j);
+        if (jpos == -1)  // fill-in element
         {
           Index newpos;
-          if (j >= ii) // dealing with the upper part
+          if (j >= ii)  // dealing with the upper part
           {
             newpos = ii + sizeu;
             sizeu++;
-            eigen_internal_assert(sizeu<=n);
-          }
-          else // dealing with the lower part
+            eigen_internal_assert(sizeu <= n);
+          } else  // dealing with the lower part
           {
             newpos = sizel;
             sizel++;
-            eigen_internal_assert(sizel<=ii);
+            eigen_internal_assert(sizel <= ii);
           }
           ju(newpos) = convert_index<StorageIndex>(j);
           u(newpos) = -prod;
           jr(j) = convert_index<StorageIndex>(newpos);
-        }
-        else
+        } else
           u(jpos) -= prod;
       }
       // store the pivot element
-      u(len)  = fact;
+      u(len) = fact;
       ju(len) = convert_index<StorageIndex>(minrow);
       ++len;
 
       jj++;
-    } // end of the elimination on the row ii
+    }  // end of the elimination on the row ii
 
     // reset the upper part of the pointer jr to zero
-    for(Index k = 0; k <sizeu; k++) jr(ju(ii+k)) = -1;
+    for (Index k = 0; k < sizeu; k++) jr(ju(ii + k)) = -1;
 
     // 4 - partially sort and insert the elements in the m_lu matrix
 
@@ -413,36 +383,31 @@
 
     // store the largest m_fill elements of the L part
     m_lu.startVec(ii);
-    for(Index k = 0; k < len; k++)
-      m_lu.insertBackByOuterInnerUnordered(ii,ju(k)) = u(k);
+    for (Index k = 0; k < len; k++) m_lu.insertBackByOuterInnerUnordered(ii, ju(k)) = u(k);
 
     // store the diagonal element
     // apply a shifting rule to avoid zero pivots (we are doing an incomplete factorization)
-    if (u(ii) == Scalar(0))
-      u(ii) = sqrt(m_droptol) * rownorm;
+    if (u(ii) == Scalar(0)) u(ii) = sqrt(m_droptol) * rownorm;
     m_lu.insertBackByOuterInnerUnordered(ii, ii) = u(ii);
 
     // sort the U-part of the row
     // apply the dropping rule first
     len = 0;
-    for(Index k = 1; k < sizeu; k++)
-    {
-      if(abs(u(ii+k)) > m_droptol * rownorm )
-      {
+    for (Index k = 1; k < sizeu; k++) {
+      if (abs(u(ii + k)) > m_droptol * rownorm) {
         ++len;
-        u(ii + len)  = u(ii + k);
+        u(ii + len) = u(ii + k);
         ju(ii + len) = ju(ii + k);
       }
     }
-    sizeu = len + 1; // +1 to take into account the diagonal element
+    sizeu = len + 1;  // +1 to take into account the diagonal element
     len = (std::min)(sizeu, nnzU);
-    typename Vector::SegmentReturnType uu(u.segment(ii+1, sizeu-1));
-    typename VectorI::SegmentReturnType juu(ju.segment(ii+1, sizeu-1));
+    typename Vector::SegmentReturnType uu(u.segment(ii + 1, sizeu - 1));
+    typename VectorI::SegmentReturnType juu(ju.segment(ii + 1, sizeu - 1));
     internal::QuickSplit(uu, juu, len);
 
     // store the largest elements of the U part
-    for(Index k = ii + 1; k < ii + len; k++)
-      m_lu.insertBackByOuterInnerUnordered(ii,ju(k)) = u(k);
+    for (Index k = ii + 1; k < ii + len; k++) m_lu.insertBackByOuterInnerUnordered(ii, ju(k)) = u(k);
   }
   m_lu.finalize();
   m_lu.makeCompressed();
@@ -451,6 +416,6 @@
   m_info = Success;
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_INCOMPLETE_LUT_H
+#endif  // EIGEN_INCOMPLETE_LUT_H
diff --git a/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h b/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h
index 4287e36..cf85f2e 100644
--- a/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h
+++ b/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h
@@ -17,191 +17,157 @@
 
 namespace internal {
 
-template<typename MatrixType>
-struct is_ref_compatible_impl
-{
-private:
+template <typename MatrixType>
+struct is_ref_compatible_impl {
+ private:
   template <typename T0>
-  struct any_conversion
-  {
-    template <typename T> any_conversion(const volatile T&);
-    template <typename T> any_conversion(T&);
+  struct any_conversion {
+    template <typename T>
+    any_conversion(const volatile T&);
+    template <typename T>
+    any_conversion(T&);
   };
-  struct yes {int a[1];};
-  struct no  {int a[2];};
+  struct yes {
+    int a[1];
+  };
+  struct no {
+    int a[2];
+  };
 
-  template<typename T>
+  template <typename T>
   static yes test(const Ref<const T>&, int);
-  template<typename T>
-  static no  test(any_conversion<T>, ...);
+  template <typename T>
+  static no test(any_conversion<T>, ...);
 
-public:
+ public:
   static MatrixType ms_from;
-  enum { value = sizeof(test<MatrixType>(ms_from, 0))==sizeof(yes) };
+  enum { value = sizeof(test<MatrixType>(ms_from, 0)) == sizeof(yes) };
 };
 
-template<typename MatrixType>
-struct is_ref_compatible
-{
+template <typename MatrixType>
+struct is_ref_compatible {
   enum { value = is_ref_compatible_impl<remove_all_t<MatrixType>>::value };
 };
 
-template<typename MatrixType, bool MatrixFree = !internal::is_ref_compatible<MatrixType>::value>
+template <typename MatrixType, bool MatrixFree = !internal::is_ref_compatible<MatrixType>::value>
 class generic_matrix_wrapper;
 
 // We have an explicit matrix at hand, compatible with Ref<>
-template<typename MatrixType>
-class generic_matrix_wrapper<MatrixType,false>
-{
-public:
+template <typename MatrixType>
+class generic_matrix_wrapper<MatrixType, false> {
+ public:
   typedef Ref<const MatrixType> ActualMatrixType;
-  template<int UpLo> struct ConstSelfAdjointViewReturnType {
+  template <int UpLo>
+  struct ConstSelfAdjointViewReturnType {
     typedef typename ActualMatrixType::template ConstSelfAdjointViewReturnType<UpLo>::Type Type;
   };
 
-  enum {
-    MatrixFree = false
-  };
+  enum { MatrixFree = false };
 
-  generic_matrix_wrapper()
-    : m_dummy(0,0), m_matrix(m_dummy)
-  {}
+  generic_matrix_wrapper() : m_dummy(0, 0), m_matrix(m_dummy) {}
 
-  template<typename InputType>
-  generic_matrix_wrapper(const InputType &mat)
-    : m_matrix(mat)
-  {}
+  template <typename InputType>
+  generic_matrix_wrapper(const InputType& mat) : m_matrix(mat) {}
 
-  const ActualMatrixType& matrix() const
-  {
-    return m_matrix;
-  }
+  const ActualMatrixType& matrix() const { return m_matrix; }
 
-  template<typename MatrixDerived>
-  void grab(const EigenBase<MatrixDerived> &mat)
-  {
+  template <typename MatrixDerived>
+  void grab(const EigenBase<MatrixDerived>& mat) {
     internal::destroy_at(&m_matrix);
     internal::construct_at(&m_matrix, mat.derived());
   }
 
-  void grab(const Ref<const MatrixType> &mat)
-  {
-    if(&(mat.derived()) != &m_matrix)
-    {
+  void grab(const Ref<const MatrixType>& mat) {
+    if (&(mat.derived()) != &m_matrix) {
       internal::destroy_at(&m_matrix);
       internal::construct_at(&m_matrix, mat);
     }
   }
 
-protected:
-  MatrixType m_dummy; // used to default initialize the Ref<> object
+ protected:
+  MatrixType m_dummy;  // used to default initialize the Ref<> object
   ActualMatrixType m_matrix;
 };
 
 // MatrixType is not compatible with Ref<> -> matrix-free wrapper
-template<typename MatrixType>
-class generic_matrix_wrapper<MatrixType,true>
-{
-public:
+template <typename MatrixType>
+class generic_matrix_wrapper<MatrixType, true> {
+ public:
   typedef MatrixType ActualMatrixType;
-  template<int UpLo> struct ConstSelfAdjointViewReturnType
-  {
+  template <int UpLo>
+  struct ConstSelfAdjointViewReturnType {
     typedef ActualMatrixType Type;
   };
 
-  enum {
-    MatrixFree = true
-  };
+  enum { MatrixFree = true };
 
-  generic_matrix_wrapper()
-    : mp_matrix(0)
-  {}
+  generic_matrix_wrapper() : mp_matrix(0) {}
 
-  generic_matrix_wrapper(const MatrixType &mat)
-    : mp_matrix(&mat)
-  {}
+  generic_matrix_wrapper(const MatrixType& mat) : mp_matrix(&mat) {}
 
-  const ActualMatrixType& matrix() const
-  {
-    return *mp_matrix;
-  }
+  const ActualMatrixType& matrix() const { return *mp_matrix; }
 
-  void grab(const MatrixType &mat)
-  {
-    mp_matrix = &mat;
-  }
+  void grab(const MatrixType& mat) { mp_matrix = &mat; }
 
-protected:
-  const ActualMatrixType *mp_matrix;
+ protected:
+  const ActualMatrixType* mp_matrix;
 };
 
-}
+}  // namespace internal
 
 /** \ingroup IterativeLinearSolvers_Module
-  * \brief Base class for linear iterative solvers
-  *
-  * \sa class SimplicialCholesky, DiagonalPreconditioner, IdentityPreconditioner
-  */
-template< typename Derived>
-class IterativeSolverBase : public SparseSolverBase<Derived>
-{
-protected:
+ * \brief Base class for linear iterative solvers
+ *
+ * \sa class SimplicialCholesky, DiagonalPreconditioner, IdentityPreconditioner
+ */
+template <typename Derived>
+class IterativeSolverBase : public SparseSolverBase<Derived> {
+ protected:
   typedef SparseSolverBase<Derived> Base;
   using Base::m_isInitialized;
 
-public:
+ public:
   typedef typename internal::traits<Derived>::MatrixType MatrixType;
   typedef typename internal::traits<Derived>::Preconditioner Preconditioner;
   typedef typename MatrixType::Scalar Scalar;
   typedef typename MatrixType::StorageIndex StorageIndex;
   typedef typename MatrixType::RealScalar RealScalar;
 
-  enum {
-    ColsAtCompileTime = MatrixType::ColsAtCompileTime,
-    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
-  };
+  enum { ColsAtCompileTime = MatrixType::ColsAtCompileTime, MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime };
 
-public:
-
+ public:
   using Base::derived;
 
   /** Default constructor. */
-  IterativeSolverBase()
-  {
-    init();
-  }
+  IterativeSolverBase() { init(); }
 
   /** Initialize the solver with matrix \a A for further \c Ax=b solving.
-    *
-    * This constructor is a shortcut for the default constructor followed
-    * by a call to compute().
-    *
-    * \warning this class stores a reference to the matrix A as well as some
-    * precomputed values that depend on it. Therefore, if \a A is changed
-    * this class becomes invalid. Call compute() to update it with the new
-    * matrix A, or modify a copy of A.
-    */
-  template<typename MatrixDerived>
-  explicit IterativeSolverBase(const EigenBase<MatrixDerived>& A)
-    : m_matrixWrapper(A.derived())
-  {
+   *
+   * This constructor is a shortcut for the default constructor followed
+   * by a call to compute().
+   *
+   * \warning this class stores a reference to the matrix A as well as some
+   * precomputed values that depend on it. Therefore, if \a A is changed
+   * this class becomes invalid. Call compute() to update it with the new
+   * matrix A, or modify a copy of A.
+   */
+  template <typename MatrixDerived>
+  explicit IterativeSolverBase(const EigenBase<MatrixDerived>& A) : m_matrixWrapper(A.derived()) {
     init();
     compute(matrix());
   }
 
-
   IterativeSolverBase(IterativeSolverBase&&) = default;
 
   ~IterativeSolverBase() {}
 
   /** Initializes the iterative solver for the sparsity pattern of the matrix \a A for further solving \c Ax=b problems.
-    *
-    * Currently, this function mostly calls analyzePattern on the preconditioner. In the future
-    * we might, for instance, implement column reordering for faster matrix vector products.
-    */
-  template<typename MatrixDerived>
-  Derived& analyzePattern(const EigenBase<MatrixDerived>& A)
-  {
+   *
+   * Currently, this function mostly calls analyzePattern on the preconditioner. In the future
+   * we might, for instance, implement column reordering for faster matrix vector products.
+   */
+  template <typename MatrixDerived>
+  Derived& analyzePattern(const EigenBase<MatrixDerived>& A) {
     grab(A.derived());
     m_preconditioner.analyzePattern(matrix());
     m_isInitialized = true;
@@ -210,18 +176,18 @@
     return derived();
   }
 
-  /** Initializes the iterative solver with the numerical values of the matrix \a A for further solving \c Ax=b problems.
-    *
-    * Currently, this function mostly calls factorize on the preconditioner.
-    *
-    * \warning this class stores a reference to the matrix A as well as some
-    * precomputed values that depend on it. Therefore, if \a A is changed
-    * this class becomes invalid. Call compute() to update it with the new
-    * matrix A, or modify a copy of A.
-    */
-  template<typename MatrixDerived>
-  Derived& factorize(const EigenBase<MatrixDerived>& A)
-  {
+  /** Initializes the iterative solver with the numerical values of the matrix \a A for further solving \c Ax=b
+   * problems.
+   *
+   * Currently, this function mostly calls factorize on the preconditioner.
+   *
+   * \warning this class stores a reference to the matrix A as well as some
+   * precomputed values that depend on it. Therefore, if \a A is changed
+   * this class becomes invalid. Call compute() to update it with the new
+   * matrix A, or modify a copy of A.
+   */
+  template <typename MatrixDerived>
+  Derived& factorize(const EigenBase<MatrixDerived>& A) {
     eigen_assert(m_analysisIsOk && "You must first call analyzePattern()");
     grab(A.derived());
     m_preconditioner.factorize(matrix());
@@ -231,18 +197,17 @@
   }
 
   /** Initializes the iterative solver with the matrix \a A for further solving \c Ax=b problems.
-    *
-    * Currently, this function mostly initializes/computes the preconditioner. In the future
-    * we might, for instance, implement column reordering for faster matrix vector products.
-    *
-    * \warning this class stores a reference to the matrix A as well as some
-    * precomputed values that depend on it. Therefore, if \a A is changed
-    * this class becomes invalid. Call compute() to update it with the new
-    * matrix A, or modify a copy of A.
-    */
-  template<typename MatrixDerived>
-  Derived& compute(const EigenBase<MatrixDerived>& A)
-  {
+   *
+   * Currently, this function mostly initializes/computes the preconditioner. In the future
+   * we might, for instance, implement column reordering for faster matrix vector products.
+   *
+   * \warning this class stores a reference to the matrix A as well as some
+   * precomputed values that depend on it. Therefore, if \a A is changed
+   * this class becomes invalid. Call compute() to update it with the new
+   * matrix A, or modify a copy of A.
+   */
+  template <typename MatrixDerived>
+  Derived& compute(const EigenBase<MatrixDerived>& A) {
     grab(A.derived());
     m_preconditioner.compute(matrix());
     m_isInitialized = true;
@@ -259,17 +224,16 @@
   EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return matrix().cols(); }
 
   /** \returns the tolerance threshold used by the stopping criteria.
-    * \sa setTolerance()
-    */
+   * \sa setTolerance()
+   */
   RealScalar tolerance() const { return m_tolerance; }
 
   /** Sets the tolerance threshold used by the stopping criteria.
-    *
-    * This value is used as an upper bound to the relative residual error: |Ax-b|/|b|.
-    * The default value is the machine precision given by NumTraits<Scalar>::epsilon()
-    */
-  Derived& setTolerance(const RealScalar& tolerance)
-  {
+   *
+   * This value is used as an upper bound to the relative residual error: |Ax-b|/|b|.
+   * The default value is the machine precision given by NumTraits<Scalar>::epsilon()
+   */
+  Derived& setTolerance(const RealScalar& tolerance) {
     m_tolerance = tolerance;
     return derived();
   }
@@ -281,137 +245,122 @@
   const Preconditioner& preconditioner() const { return m_preconditioner; }
 
   /** \returns the max number of iterations.
-    * It is either the value set by setMaxIterations or, by default,
-    * twice the number of columns of the matrix.
-    */
-  Index maxIterations() const
-  {
-    return (m_maxIterations<0) ? 2*matrix().cols() : m_maxIterations;
-  }
+   * It is either the value set by setMaxIterations or, by default,
+   * twice the number of columns of the matrix.
+   */
+  Index maxIterations() const { return (m_maxIterations < 0) ? 2 * matrix().cols() : m_maxIterations; }
 
   /** Sets the max number of iterations.
-    * Default is twice the number of columns of the matrix.
-    */
-  Derived& setMaxIterations(Index maxIters)
-  {
+   * Default is twice the number of columns of the matrix.
+   */
+  Derived& setMaxIterations(Index maxIters) {
     m_maxIterations = maxIters;
     return derived();
   }
 
   /** \returns the number of iterations performed during the last solve */
-  Index iterations() const
-  {
+  Index iterations() const {
     eigen_assert(m_isInitialized && "IterativeSolverBase is not initialized.");
     return m_iterations;
   }
 
   /** \returns the tolerance error reached during the last solve.
-    * It is a close approximation of the true relative residual error |Ax-b|/|b|.
-    */
-  RealScalar error() const
-  {
+   * It is a close approximation of the true relative residual error |Ax-b|/|b|.
+   */
+  RealScalar error() const {
     eigen_assert(m_isInitialized && "IterativeSolverBase is not initialized.");
     return m_error;
   }
 
   /** \returns the solution x of \f$ A x = b \f$ using the current decomposition of A
-    * and \a x0 as an initial solution.
-    *
-    * \sa solve(), compute()
-    */
-  template<typename Rhs,typename Guess>
-  inline const SolveWithGuess<Derived, Rhs, Guess>
-  solveWithGuess(const MatrixBase<Rhs>& b, const Guess& x0) const
-  {
+   * and \a x0 as an initial solution.
+   *
+   * \sa solve(), compute()
+   */
+  template <typename Rhs, typename Guess>
+  inline const SolveWithGuess<Derived, Rhs, Guess> solveWithGuess(const MatrixBase<Rhs>& b, const Guess& x0) const {
     eigen_assert(m_isInitialized && "Solver is not initialized.");
-    eigen_assert(derived().rows()==b.rows() && "solve(): invalid number of rows of the right hand side matrix b");
+    eigen_assert(derived().rows() == b.rows() && "solve(): invalid number of rows of the right hand side matrix b");
     return SolveWithGuess<Derived, Rhs, Guess>(derived(), b.derived(), x0);
   }
 
   /** \returns Success if the iterations converged, and NoConvergence otherwise. */
-  ComputationInfo info() const
-  {
+  ComputationInfo info() const {
     eigen_assert(m_isInitialized && "IterativeSolverBase is not initialized.");
     return m_info;
   }
 
   /** \internal */
-  template<typename Rhs, typename DestDerived>
-  void _solve_with_guess_impl(const Rhs& b, SparseMatrixBase<DestDerived> &aDest) const
-  {
-    eigen_assert(rows()==b.rows());
+  template <typename Rhs, typename DestDerived>
+  void _solve_with_guess_impl(const Rhs& b, SparseMatrixBase<DestDerived>& aDest) const {
+    eigen_assert(rows() == b.rows());
 
     Index rhsCols = b.cols();
     Index size = b.rows();
     DestDerived& dest(aDest.derived());
     typedef typename DestDerived::Scalar DestScalar;
-    Eigen::Matrix<DestScalar,Dynamic,1> tb(size);
-    Eigen::Matrix<DestScalar,Dynamic,1> tx(cols());
+    Eigen::Matrix<DestScalar, Dynamic, 1> tb(size);
+    Eigen::Matrix<DestScalar, Dynamic, 1> tx(cols());
     // We do not directly fill dest because sparse expressions have to be free of aliasing issue.
-    // For non square least-square problems, b and dest might not have the same size whereas they might alias each-other.
-    typename DestDerived::PlainObject tmp(cols(),rhsCols);
+    // For non square least-square problems, b and dest might not have the same size whereas they might alias
+    // each-other.
+    typename DestDerived::PlainObject tmp(cols(), rhsCols);
     ComputationInfo global_info = Success;
-    for(Index k=0; k<rhsCols; ++k)
-    {
+    for (Index k = 0; k < rhsCols; ++k) {
       tb = b.col(k);
       tx = dest.col(k);
-      derived()._solve_vector_with_guess_impl(tb,tx);
+      derived()._solve_vector_with_guess_impl(tb, tx);
       tmp.col(k) = tx.sparseView(0);
 
       // The call to _solve_vector_with_guess_impl updates m_info, so if it failed for a previous column
       // we need to restore it to the worst value.
-      if(m_info==NumericalIssue)
+      if (m_info == NumericalIssue)
         global_info = NumericalIssue;
-      else if(m_info==NoConvergence)
+      else if (m_info == NoConvergence)
         global_info = NoConvergence;
     }
     m_info = global_info;
     dest.swap(tmp);
   }
 
-  template<typename Rhs, typename DestDerived>
-  std::enable_if_t<Rhs::ColsAtCompileTime!=1 && DestDerived::ColsAtCompileTime!=1>
-  _solve_with_guess_impl(const Rhs& b, MatrixBase<DestDerived> &aDest) const
-  {
-    eigen_assert(rows()==b.rows());
+  template <typename Rhs, typename DestDerived>
+  std::enable_if_t<Rhs::ColsAtCompileTime != 1 && DestDerived::ColsAtCompileTime != 1> _solve_with_guess_impl(
+      const Rhs& b, MatrixBase<DestDerived>& aDest) const {
+    eigen_assert(rows() == b.rows());
 
     Index rhsCols = b.cols();
     DestDerived& dest(aDest.derived());
     ComputationInfo global_info = Success;
-    for(Index k=0; k<rhsCols; ++k)
-    {
-      typename DestDerived::ColXpr xk(dest,k);
-      typename Rhs::ConstColXpr bk(b,k);
-      derived()._solve_vector_with_guess_impl(bk,xk);
+    for (Index k = 0; k < rhsCols; ++k) {
+      typename DestDerived::ColXpr xk(dest, k);
+      typename Rhs::ConstColXpr bk(b, k);
+      derived()._solve_vector_with_guess_impl(bk, xk);
 
       // The call to _solve_vector_with_guess updates m_info, so if it failed for a previous column
       // we need to restore it to the worst value.
-      if(m_info==NumericalIssue)
+      if (m_info == NumericalIssue)
         global_info = NumericalIssue;
-      else if(m_info==NoConvergence)
+      else if (m_info == NoConvergence)
         global_info = NoConvergence;
     }
     m_info = global_info;
   }
 
-  template<typename Rhs, typename DestDerived>
-  std::enable_if_t<Rhs::ColsAtCompileTime==1 || DestDerived::ColsAtCompileTime==1>
-  _solve_with_guess_impl(const Rhs& b, MatrixBase<DestDerived> &dest) const
-  {
-    derived()._solve_vector_with_guess_impl(b,dest.derived());
+  template <typename Rhs, typename DestDerived>
+  std::enable_if_t<Rhs::ColsAtCompileTime == 1 || DestDerived::ColsAtCompileTime == 1> _solve_with_guess_impl(
+      const Rhs& b, MatrixBase<DestDerived>& dest) const {
+    derived()._solve_vector_with_guess_impl(b, dest.derived());
   }
 
   /** \internal default initial guess = 0 */
-  template<typename Rhs,typename Dest>
-  void _solve_impl(const Rhs& b, Dest& x) const
-  {
+  template <typename Rhs, typename Dest>
+  void _solve_impl(const Rhs& b, Dest& x) const {
     x.setZero();
-    derived()._solve_with_guess_impl(b,x);
+    derived()._solve_with_guess_impl(b, x);
   }
 
-protected:
-  void init()
-  {
+ protected:
+  void init() {
     m_isInitialized = false;
     m_analysisIsOk = false;
     m_factorizationIsOk = false;
@@ -422,14 +371,10 @@
   typedef internal::generic_matrix_wrapper<MatrixType> MatrixWrapper;
   typedef typename MatrixWrapper::ActualMatrixType ActualMatrixType;
 
-  const ActualMatrixType& matrix() const
-  {
-    return m_matrixWrapper.matrix();
-  }
+  const ActualMatrixType& matrix() const { return m_matrixWrapper.matrix(); }
 
-  template<typename InputType>
-  void grab(const InputType &A)
-  {
+  template <typename InputType>
+  void grab(const InputType& A) {
     m_matrixWrapper.grab(A);
   }
 
@@ -445,6 +390,6 @@
   mutable bool m_analysisIsOk, m_factorizationIsOk;
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_ITERATIVE_SOLVER_BASE_H
+#endif  // EIGEN_ITERATIVE_SOLVER_BASE_H
diff --git a/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h b/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h
index db87a42..182f319 100644
--- a/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h
+++ b/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h
@@ -13,109 +13,103 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
 /** \internal Low-level conjugate gradient algorithm for least-square problems
-  * \param mat The matrix A
-  * \param rhs The right hand side vector b
-  * \param x On input and initial solution, on output the computed solution.
-  * \param precond A preconditioner being able to efficiently solve for an
-  *                approximation of A'Ax=b (regardless of b)
-  * \param iters On input the max number of iteration, on output the number of performed iterations.
-  * \param tol_error On input the tolerance error, on output an estimation of the relative error.
-  */
-template<typename MatrixType, typename Rhs, typename Dest, typename Preconditioner>
-EIGEN_DONT_INLINE
-void least_square_conjugate_gradient(const MatrixType& mat, const Rhs& rhs, Dest& x,
-                                     const Preconditioner& precond, Index& iters,
-                                     typename Dest::RealScalar& tol_error)
-{
-  using std::sqrt;
+ * \param mat The matrix A
+ * \param rhs The right hand side vector b
+ * \param x On input and initial solution, on output the computed solution.
+ * \param precond A preconditioner being able to efficiently solve for an
+ *                approximation of A'Ax=b (regardless of b)
+ * \param iters On input the max number of iteration, on output the number of performed iterations.
+ * \param tol_error On input the tolerance error, on output an estimation of the relative error.
+ */
+template <typename MatrixType, typename Rhs, typename Dest, typename Preconditioner>
+EIGEN_DONT_INLINE void least_square_conjugate_gradient(const MatrixType& mat, const Rhs& rhs, Dest& x,
+                                                       const Preconditioner& precond, Index& iters,
+                                                       typename Dest::RealScalar& tol_error) {
   using std::abs;
+  using std::sqrt;
   typedef typename Dest::RealScalar RealScalar;
   typedef typename Dest::Scalar Scalar;
-  typedef Matrix<Scalar,Dynamic,1> VectorType;
-  
+  typedef Matrix<Scalar, Dynamic, 1> VectorType;
+
   RealScalar tol = tol_error;
   Index maxIters = iters;
-  
+
   Index m = mat.rows(), n = mat.cols();
 
-  VectorType residual        = rhs - mat * x;
+  VectorType residual = rhs - mat * x;
   VectorType normal_residual = mat.adjoint() * residual;
 
-  RealScalar rhsNorm2 = (mat.adjoint()*rhs).squaredNorm();
-  if(rhsNorm2 == 0) 
-  {
+  RealScalar rhsNorm2 = (mat.adjoint() * rhs).squaredNorm();
+  if (rhsNorm2 == 0) {
     x.setZero();
     iters = 0;
     tol_error = 0;
     return;
   }
-  RealScalar threshold = tol*tol*rhsNorm2;
+  RealScalar threshold = tol * tol * rhsNorm2;
   RealScalar residualNorm2 = normal_residual.squaredNorm();
-  if (residualNorm2 < threshold)
-  {
+  if (residualNorm2 < threshold) {
     iters = 0;
     tol_error = sqrt(residualNorm2 / rhsNorm2);
     return;
   }
-  
+
   VectorType p(n);
-  p = precond.solve(normal_residual);                         // initial search direction
+  p = precond.solve(normal_residual);  // initial search direction
 
   VectorType z(n), tmp(m);
   RealScalar absNew = numext::real(normal_residual.dot(p));  // the square of the absolute value of r scaled by invM
   Index i = 0;
-  while(i < maxIters)
-  {
+  while (i < maxIters) {
     tmp.noalias() = mat * p;
 
-    Scalar alpha = absNew / tmp.squaredNorm();      // the amount we travel on dir
-    x += alpha * p;                                 // update solution
-    residual -= alpha * tmp;                        // update residual
-    normal_residual.noalias() = mat.adjoint() * residual;     // update residual of the normal equation
-    
+    Scalar alpha = absNew / tmp.squaredNorm();             // the amount we travel on dir
+    x += alpha * p;                                        // update solution
+    residual -= alpha * tmp;                               // update residual
+    normal_residual.noalias() = mat.adjoint() * residual;  // update residual of the normal equation
+
     residualNorm2 = normal_residual.squaredNorm();
-    if(residualNorm2 < threshold)
-      break;
-    
-    z = precond.solve(normal_residual);             // approximately solve for "A'A z = normal_residual"
+    if (residualNorm2 < threshold) break;
+
+    z = precond.solve(normal_residual);  // approximately solve for "A'A z = normal_residual"
 
     RealScalar absOld = absNew;
     absNew = numext::real(normal_residual.dot(z));  // update the absolute value of r
-    RealScalar beta = absNew / absOld;              // calculate the Gram-Schmidt value used to create the new search direction
-    p = z + beta * p;                               // update search direction
+    RealScalar beta = absNew / absOld;  // calculate the Gram-Schmidt value used to create the new search direction
+    p = z + beta * p;                   // update search direction
     i++;
   }
   tol_error = sqrt(residualNorm2 / rhsNorm2);
   iters = i;
 }
 
-}
+}  // namespace internal
 
-template< typename MatrixType_,
+template <typename MatrixType_,
           typename Preconditioner_ = LeastSquareDiagonalPreconditioner<typename MatrixType_::Scalar> >
 class LeastSquaresConjugateGradient;
 
 namespace internal {
 
-template< typename MatrixType_, typename Preconditioner_>
-struct traits<LeastSquaresConjugateGradient<MatrixType_,Preconditioner_> >
-{
+template <typename MatrixType_, typename Preconditioner_>
+struct traits<LeastSquaresConjugateGradient<MatrixType_, Preconditioner_> > {
   typedef MatrixType_ MatrixType;
   typedef Preconditioner_ Preconditioner;
 };
 
-}
+}  // namespace internal
 
 /** \ingroup IterativeLinearSolvers_Module
   * \brief A conjugate gradient solver for sparse (or dense) least-square problems
   *
   * This class solves for the least-squares solution to A x = b using an iterative conjugate gradient algorithm.
-  * The matrix A can be non symmetric and rectangular, but the matrix A' A should be positive-definite to guaranty stability.
+  * The matrix A can be non symmetric and rectangular, but the matrix A' A should be positive-definite to guaranty
+  stability.
   * Otherwise, the SparseLU or SparseQR classes might be preferable.
   * The matrix A and the vectors x and b can be either dense or sparse.
   *
@@ -123,11 +117,11 @@
   * \tparam Preconditioner_ the type of the preconditioner. Default is LeastSquareDiagonalPreconditioner
   *
   * \implsparsesolverconcept
-  * 
+  *
   * The maximal number of iterations and tolerance value can be controlled via the setMaxIterations()
   * and setTolerance() methods. The defaults are the size of the problem for the maximal number of iterations
   * and NumTraits<Scalar>::epsilon() for the tolerance.
-  * 
+  *
   * This class can be used as the direct solver classes. Here is a typical usage example:
     \code
     int m=1000000, n = 10000;
@@ -142,60 +136,58 @@
     // update b, and solve again
     x = lscg.solve(b);
     \endcode
-  * 
+  *
   * By default the iterations start with x=0 as an initial guess of the solution.
   * One can control the start using the solveWithGuess() method.
-  * 
+  *
   * \sa class ConjugateGradient, SparseLU, SparseQR
   */
-template< typename MatrixType_, typename Preconditioner_>
-class LeastSquaresConjugateGradient : public IterativeSolverBase<LeastSquaresConjugateGradient<MatrixType_,Preconditioner_> >
-{
+template <typename MatrixType_, typename Preconditioner_>
+class LeastSquaresConjugateGradient
+    : public IterativeSolverBase<LeastSquaresConjugateGradient<MatrixType_, Preconditioner_> > {
   typedef IterativeSolverBase<LeastSquaresConjugateGradient> Base;
-  using Base::matrix;
   using Base::m_error;
-  using Base::m_iterations;
   using Base::m_info;
   using Base::m_isInitialized;
-public:
+  using Base::m_iterations;
+  using Base::matrix;
+
+ public:
   typedef MatrixType_ MatrixType;
   typedef typename MatrixType::Scalar Scalar;
   typedef typename MatrixType::RealScalar RealScalar;
   typedef Preconditioner_ Preconditioner;
 
-public:
-
+ public:
   /** Default constructor. */
   LeastSquaresConjugateGradient() : Base() {}
 
   /** Initialize the solver with matrix \a A for further \c Ax=b solving.
-    * 
-    * This constructor is a shortcut for the default constructor followed
-    * by a call to compute().
-    * 
-    * \warning this class stores a reference to the matrix A as well as some
-    * precomputed values that depend on it. Therefore, if \a A is changed
-    * this class becomes invalid. Call compute() to update it with the new
-    * matrix A, or modify a copy of A.
-    */
-  template<typename MatrixDerived>
+   *
+   * This constructor is a shortcut for the default constructor followed
+   * by a call to compute().
+   *
+   * \warning this class stores a reference to the matrix A as well as some
+   * precomputed values that depend on it. Therefore, if \a A is changed
+   * this class becomes invalid. Call compute() to update it with the new
+   * matrix A, or modify a copy of A.
+   */
+  template <typename MatrixDerived>
   explicit LeastSquaresConjugateGradient(const EigenBase<MatrixDerived>& A) : Base(A.derived()) {}
 
   ~LeastSquaresConjugateGradient() {}
 
   /** \internal */
-  template<typename Rhs,typename Dest>
-  void _solve_vector_with_guess_impl(const Rhs& b, Dest& x) const
-  {
+  template <typename Rhs, typename Dest>
+  void _solve_vector_with_guess_impl(const Rhs& b, Dest& x) const {
     m_iterations = Base::maxIterations();
     m_error = Base::m_tolerance;
 
     internal::least_square_conjugate_gradient(matrix(), b, x, Base::m_preconditioner, m_iterations, m_error);
     m_info = m_error <= Base::m_tolerance ? Success : NoConvergence;
   }
-
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_LEAST_SQUARE_CONJUGATE_GRADIENT_H
+#endif  // EIGEN_LEAST_SQUARE_CONJUGATE_GRADIENT_H
diff --git a/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h b/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h
index d0709f5..020241b 100644
--- a/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h
+++ b/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h
@@ -15,59 +15,54 @@
 
 namespace Eigen {
 
-template<typename Decomposition, typename RhsType, typename GuessType> class SolveWithGuess;
+template <typename Decomposition, typename RhsType, typename GuessType>
+class SolveWithGuess;
 
 /** \class SolveWithGuess
-  * \ingroup IterativeLinearSolvers_Module
-  *
-  * \brief Pseudo expression representing a solving operation
-  *
-  * \tparam Decomposition the type of the matrix or decomposion object
-  * \tparam Rhstype the type of the right-hand side
-  *
-  * This class represents an expression of A.solve(B)
-  * and most of the time this is the only way it is used.
-  *
-  */
+ * \ingroup IterativeLinearSolvers_Module
+ *
+ * \brief Pseudo expression representing a solving operation
+ *
+ * \tparam Decomposition the type of the matrix or decomposion object
+ * \tparam Rhstype the type of the right-hand side
+ *
+ * This class represents an expression of A.solve(B)
+ * and most of the time this is the only way it is used.
+ *
+ */
 namespace internal {
 
+template <typename Decomposition, typename RhsType, typename GuessType>
+struct traits<SolveWithGuess<Decomposition, RhsType, GuessType> > : traits<Solve<Decomposition, RhsType> > {};
 
-template<typename Decomposition, typename RhsType, typename GuessType>
-struct traits<SolveWithGuess<Decomposition, RhsType, GuessType> >
-  : traits<Solve<Decomposition,RhsType> >
-{};
+}  // namespace internal
 
-}
-
-
-template<typename Decomposition, typename RhsType, typename GuessType>
-class SolveWithGuess : public internal::generic_xpr_base<SolveWithGuess<Decomposition,RhsType,GuessType>, MatrixXpr, typename internal::traits<RhsType>::StorageKind>::type
-{
-public:
+template <typename Decomposition, typename RhsType, typename GuessType>
+class SolveWithGuess : public internal::generic_xpr_base<SolveWithGuess<Decomposition, RhsType, GuessType>, MatrixXpr,
+                                                         typename internal::traits<RhsType>::StorageKind>::type {
+ public:
   typedef typename internal::traits<SolveWithGuess>::Scalar Scalar;
   typedef typename internal::traits<SolveWithGuess>::PlainObject PlainObject;
-  typedef typename internal::generic_xpr_base<SolveWithGuess<Decomposition,RhsType,GuessType>, MatrixXpr, typename internal::traits<RhsType>::StorageKind>::type Base;
+  typedef typename internal::generic_xpr_base<SolveWithGuess<Decomposition, RhsType, GuessType>, MatrixXpr,
+                                              typename internal::traits<RhsType>::StorageKind>::type Base;
   typedef typename internal::ref_selector<SolveWithGuess>::type Nested;
 
   SolveWithGuess(const Decomposition &dec, const RhsType &rhs, const GuessType &guess)
-    : m_dec(dec), m_rhs(rhs), m_guess(guess)
-  {}
+      : m_dec(dec), m_rhs(rhs), m_guess(guess) {}
 
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  Index rows() const EIGEN_NOEXCEPT { return m_dec.cols(); }
-  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-  Index cols() const EIGEN_NOEXCEPT { return m_rhs.cols(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_dec.cols(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_rhs.cols(); }
 
-  EIGEN_DEVICE_FUNC const Decomposition& dec()   const { return m_dec; }
-  EIGEN_DEVICE_FUNC const RhsType&       rhs()   const { return m_rhs; }
-  EIGEN_DEVICE_FUNC const GuessType&     guess() const { return m_guess; }
+  EIGEN_DEVICE_FUNC const Decomposition &dec() const { return m_dec; }
+  EIGEN_DEVICE_FUNC const RhsType &rhs() const { return m_rhs; }
+  EIGEN_DEVICE_FUNC const GuessType &guess() const { return m_guess; }
 
-protected:
+ protected:
   const Decomposition &m_dec;
-  const RhsType       &m_rhs;
-  const GuessType     &m_guess;
+  const RhsType &m_rhs;
+  const GuessType &m_guess;
 
-private:
+ private:
   Scalar coeff(Index row, Index col) const;
   Scalar coeff(Index i) const;
 };
@@ -75,46 +70,42 @@
 namespace internal {
 
 // Evaluator of SolveWithGuess -> eval into a temporary
-template<typename Decomposition, typename RhsType, typename GuessType>
-struct evaluator<SolveWithGuess<Decomposition,RhsType, GuessType> >
-  : public evaluator<typename SolveWithGuess<Decomposition,RhsType,GuessType>::PlainObject>
-{
-  typedef SolveWithGuess<Decomposition,RhsType,GuessType> SolveType;
+template <typename Decomposition, typename RhsType, typename GuessType>
+struct evaluator<SolveWithGuess<Decomposition, RhsType, GuessType> >
+    : public evaluator<typename SolveWithGuess<Decomposition, RhsType, GuessType>::PlainObject> {
+  typedef SolveWithGuess<Decomposition, RhsType, GuessType> SolveType;
   typedef typename SolveType::PlainObject PlainObject;
   typedef evaluator<PlainObject> Base;
 
-  evaluator(const SolveType& solve)
-    : m_result(solve.rows(), solve.cols())
-  {
+  evaluator(const SolveType &solve) : m_result(solve.rows(), solve.cols()) {
     internal::construct_at<Base>(this, m_result);
     m_result = solve.guess();
     solve.dec()._solve_with_guess_impl(solve.rhs(), m_result);
   }
 
-protected:
+ protected:
   PlainObject m_result;
 };
 
 // Specialization for "dst = dec.solveWithGuess(rhs)"
-// NOTE we need to specialize it for Dense2Dense to avoid ambiguous specialization error and a Sparse2Sparse specialization must exist somewhere
-template<typename DstXprType, typename DecType, typename RhsType, typename GuessType, typename Scalar>
-struct Assignment<DstXprType, SolveWithGuess<DecType,RhsType,GuessType>, internal::assign_op<Scalar,Scalar>, Dense2Dense>
-{
-  typedef SolveWithGuess<DecType,RhsType,GuessType> SrcXprType;
-  static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<Scalar,Scalar> &)
-  {
+// NOTE we need to specialize it for Dense2Dense to avoid ambiguous specialization error and a Sparse2Sparse
+// specialization must exist somewhere
+template <typename DstXprType, typename DecType, typename RhsType, typename GuessType, typename Scalar>
+struct Assignment<DstXprType, SolveWithGuess<DecType, RhsType, GuessType>, internal::assign_op<Scalar, Scalar>,
+                  Dense2Dense> {
+  typedef SolveWithGuess<DecType, RhsType, GuessType> SrcXprType;
+  static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<Scalar, Scalar> &) {
     Index dstRows = src.rows();
     Index dstCols = src.cols();
-    if((dst.rows()!=dstRows) || (dst.cols()!=dstCols))
-      dst.resize(dstRows, dstCols);
+    if ((dst.rows() != dstRows) || (dst.cols() != dstCols)) dst.resize(dstRows, dstCols);
 
     dst = src.guess();
-    src.dec()._solve_with_guess_impl(src.rhs(), dst/*, src.guess()*/);
+    src.dec()._solve_with_guess_impl(src.rhs(), dst /*, src.guess()*/);
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SOLVEWITHGUESS_H
+#endif  // EIGEN_SOLVEWITHGUESS_H
diff --git a/Eigen/src/Jacobi/Jacobi.h b/Eigen/src/Jacobi/Jacobi.h
index efa57eb..f53b8ec 100644
--- a/Eigen/src/Jacobi/Jacobi.h
+++ b/Eigen/src/Jacobi/Jacobi.h
@@ -17,302 +17,264 @@
 namespace Eigen {
 
 /** \ingroup Jacobi_Module
-  * \jacobi_module
-  * \class JacobiRotation
-  * \brief Rotation given by a cosine-sine pair.
-  *
-  * This class represents a Jacobi or Givens rotation.
-  * This is a 2D rotation in the plane \c J of angle \f$ \theta \f$ defined by
-  * its cosine \c c and sine \c s as follow:
-  * \f$ J = \left ( \begin{array}{cc} c & \overline s \\ -s  & \overline c \end{array} \right ) \f$
-  *
-  * You can apply the respective counter-clockwise rotation to a column vector \c v by
-  * applying its adjoint on the left: \f$ v = J^* v \f$ that translates to the following Eigen code:
-  * \code
-  * v.applyOnTheLeft(J.adjoint());
-  * \endcode
-  *
-  * \sa MatrixBase::applyOnTheLeft(), MatrixBase::applyOnTheRight()
-  */
-template<typename Scalar> class JacobiRotation
-{
-  public:
-    typedef typename NumTraits<Scalar>::Real RealScalar;
+ * \jacobi_module
+ * \class JacobiRotation
+ * \brief Rotation given by a cosine-sine pair.
+ *
+ * This class represents a Jacobi or Givens rotation.
+ * This is a 2D rotation in the plane \c J of angle \f$ \theta \f$ defined by
+ * its cosine \c c and sine \c s as follow:
+ * \f$ J = \left ( \begin{array}{cc} c & \overline s \\ -s  & \overline c \end{array} \right ) \f$
+ *
+ * You can apply the respective counter-clockwise rotation to a column vector \c v by
+ * applying its adjoint on the left: \f$ v = J^* v \f$ that translates to the following Eigen code:
+ * \code
+ * v.applyOnTheLeft(J.adjoint());
+ * \endcode
+ *
+ * \sa MatrixBase::applyOnTheLeft(), MatrixBase::applyOnTheRight()
+ */
+template <typename Scalar>
+class JacobiRotation {
+ public:
+  typedef typename NumTraits<Scalar>::Real RealScalar;
 
-    /** Default constructor without any initialization. */
-    EIGEN_DEVICE_FUNC
-    JacobiRotation() {}
+  /** Default constructor without any initialization. */
+  EIGEN_DEVICE_FUNC JacobiRotation() {}
 
-    /** Construct a planar rotation from a cosine-sine pair (\a c, \c s). */
-    EIGEN_DEVICE_FUNC
-    JacobiRotation(const Scalar& c, const Scalar& s) : m_c(c), m_s(s) {}
+  /** Construct a planar rotation from a cosine-sine pair (\a c, \c s). */
+  EIGEN_DEVICE_FUNC JacobiRotation(const Scalar& c, const Scalar& s) : m_c(c), m_s(s) {}
 
-    EIGEN_DEVICE_FUNC Scalar& c() { return m_c; }
-    EIGEN_DEVICE_FUNC Scalar c() const { return m_c; }
-    EIGEN_DEVICE_FUNC Scalar& s() { return m_s; }
-    EIGEN_DEVICE_FUNC Scalar s() const { return m_s; }
+  EIGEN_DEVICE_FUNC Scalar& c() { return m_c; }
+  EIGEN_DEVICE_FUNC Scalar c() const { return m_c; }
+  EIGEN_DEVICE_FUNC Scalar& s() { return m_s; }
+  EIGEN_DEVICE_FUNC Scalar s() const { return m_s; }
 
-    /** Concatenates two planar rotation */
-    EIGEN_DEVICE_FUNC
-    JacobiRotation operator*(const JacobiRotation& other)
-    {
-      using numext::conj;
-      return JacobiRotation(m_c * other.m_c - conj(m_s) * other.m_s,
-                            conj(m_c * conj(other.m_s) + conj(m_s) * conj(other.m_c)));
-    }
+  /** Concatenates two planar rotation */
+  EIGEN_DEVICE_FUNC JacobiRotation operator*(const JacobiRotation& other) {
+    using numext::conj;
+    return JacobiRotation(m_c * other.m_c - conj(m_s) * other.m_s,
+                          conj(m_c * conj(other.m_s) + conj(m_s) * conj(other.m_c)));
+  }
 
-    /** Returns the transposed transformation */
-    EIGEN_DEVICE_FUNC
-    JacobiRotation transpose() const { using numext::conj; return JacobiRotation(m_c, -conj(m_s)); }
+  /** Returns the transposed transformation */
+  EIGEN_DEVICE_FUNC JacobiRotation transpose() const {
+    using numext::conj;
+    return JacobiRotation(m_c, -conj(m_s));
+  }
 
-    /** Returns the adjoint transformation */
-    EIGEN_DEVICE_FUNC
-    JacobiRotation adjoint() const { using numext::conj; return JacobiRotation(conj(m_c), -m_s); }
+  /** Returns the adjoint transformation */
+  EIGEN_DEVICE_FUNC JacobiRotation adjoint() const {
+    using numext::conj;
+    return JacobiRotation(conj(m_c), -m_s);
+  }
 
-    template<typename Derived>
-    EIGEN_DEVICE_FUNC
-    bool makeJacobi(const MatrixBase<Derived>&, Index p, Index q);
-    EIGEN_DEVICE_FUNC
-    bool makeJacobi(const RealScalar& x, const Scalar& y, const RealScalar& z);
+  template <typename Derived>
+  EIGEN_DEVICE_FUNC bool makeJacobi(const MatrixBase<Derived>&, Index p, Index q);
+  EIGEN_DEVICE_FUNC bool makeJacobi(const RealScalar& x, const Scalar& y, const RealScalar& z);
 
-    EIGEN_DEVICE_FUNC
-    void makeGivens(const Scalar& p, const Scalar& q, Scalar* r=0);
+  EIGEN_DEVICE_FUNC void makeGivens(const Scalar& p, const Scalar& q, Scalar* r = 0);
 
-  protected:
-    EIGEN_DEVICE_FUNC
-    void makeGivens(const Scalar& p, const Scalar& q, Scalar* r, internal::true_type);
-    EIGEN_DEVICE_FUNC
-    void makeGivens(const Scalar& p, const Scalar& q, Scalar* r, internal::false_type);
+ protected:
+  EIGEN_DEVICE_FUNC void makeGivens(const Scalar& p, const Scalar& q, Scalar* r, internal::true_type);
+  EIGEN_DEVICE_FUNC void makeGivens(const Scalar& p, const Scalar& q, Scalar* r, internal::false_type);
 
-    Scalar m_c, m_s;
+  Scalar m_c, m_s;
 };
 
-/** Makes \c *this as a Jacobi rotation \a J such that applying \a J on both the right and left sides of the selfadjoint 2x2 matrix
-  * \f$ B = \left ( \begin{array}{cc} x & y \\ \overline y & z \end{array} \right )\f$ yields a diagonal matrix \f$ A = J^* B J \f$
-  *
-  * \sa MatrixBase::makeJacobi(const MatrixBase<Derived>&, Index, Index), MatrixBase::applyOnTheLeft(), MatrixBase::applyOnTheRight()
-  */
-template<typename Scalar>
-EIGEN_DEVICE_FUNC
-bool JacobiRotation<Scalar>::makeJacobi(const RealScalar& x, const Scalar& y, const RealScalar& z)
-{
-  using std::sqrt;
+/** Makes \c *this as a Jacobi rotation \a J such that applying \a J on both the right and left sides of the selfadjoint
+ * 2x2 matrix \f$ B = \left ( \begin{array}{cc} x & y \\ \overline y & z \end{array} \right )\f$ yields a diagonal
+ * matrix \f$ A = J^* B J \f$
+ *
+ * \sa MatrixBase::makeJacobi(const MatrixBase<Derived>&, Index, Index), MatrixBase::applyOnTheLeft(),
+ * MatrixBase::applyOnTheRight()
+ */
+template <typename Scalar>
+EIGEN_DEVICE_FUNC bool JacobiRotation<Scalar>::makeJacobi(const RealScalar& x, const Scalar& y, const RealScalar& z) {
   using std::abs;
+  using std::sqrt;
 
-  RealScalar deno = RealScalar(2)*abs(y);
-  if(deno < (std::numeric_limits<RealScalar>::min)())
-  {
+  RealScalar deno = RealScalar(2) * abs(y);
+  if (deno < (std::numeric_limits<RealScalar>::min)()) {
     m_c = Scalar(1);
     m_s = Scalar(0);
     return false;
-  }
-  else
-  {
-    RealScalar tau = (x-z)/deno;
+  } else {
+    RealScalar tau = (x - z) / deno;
     RealScalar w = sqrt(numext::abs2(tau) + RealScalar(1));
     RealScalar t;
-    if(tau>RealScalar(0))
-    {
+    if (tau > RealScalar(0)) {
       t = RealScalar(1) / (tau + w);
-    }
-    else
-    {
+    } else {
       t = RealScalar(1) / (tau - w);
     }
     RealScalar sign_t = t > RealScalar(0) ? RealScalar(1) : RealScalar(-1);
-    RealScalar n = RealScalar(1) / sqrt(numext::abs2(t)+RealScalar(1));
-    m_s = - sign_t * (numext::conj(y) / abs(y)) * abs(t) * n;
+    RealScalar n = RealScalar(1) / sqrt(numext::abs2(t) + RealScalar(1));
+    m_s = -sign_t * (numext::conj(y) / abs(y)) * abs(t) * n;
     m_c = n;
     return true;
   }
 }
 
-/** Makes \c *this as a Jacobi rotation \c J such that applying \a J on both the right and left sides of the 2x2 selfadjoint matrix
-  * \f$ B = \left ( \begin{array}{cc} \text{this}_{pp} & \text{this}_{pq} \\ (\text{this}_{pq})^* & \text{this}_{qq} \end{array} \right )\f$ yields
-  * a diagonal matrix \f$ A = J^* B J \f$
-  *
-  * Example: \include Jacobi_makeJacobi.cpp
-  * Output: \verbinclude Jacobi_makeJacobi.out
-  *
-  * \sa JacobiRotation::makeJacobi(RealScalar, Scalar, RealScalar), MatrixBase::applyOnTheLeft(), MatrixBase::applyOnTheRight()
-  */
-template<typename Scalar>
-template<typename Derived>
-EIGEN_DEVICE_FUNC
-inline bool JacobiRotation<Scalar>::makeJacobi(const MatrixBase<Derived>& m, Index p, Index q)
-{
-  return makeJacobi(numext::real(m.coeff(p,p)), m.coeff(p,q), numext::real(m.coeff(q,q)));
+/** Makes \c *this as a Jacobi rotation \c J such that applying \a J on both the right and left sides of the 2x2
+ * selfadjoint matrix \f$ B = \left ( \begin{array}{cc} \text{this}_{pp} & \text{this}_{pq} \\ (\text{this}_{pq})^* &
+ * \text{this}_{qq} \end{array} \right )\f$ yields a diagonal matrix \f$ A = J^* B J \f$
+ *
+ * Example: \include Jacobi_makeJacobi.cpp
+ * Output: \verbinclude Jacobi_makeJacobi.out
+ *
+ * \sa JacobiRotation::makeJacobi(RealScalar, Scalar, RealScalar), MatrixBase::applyOnTheLeft(),
+ * MatrixBase::applyOnTheRight()
+ */
+template <typename Scalar>
+template <typename Derived>
+EIGEN_DEVICE_FUNC inline bool JacobiRotation<Scalar>::makeJacobi(const MatrixBase<Derived>& m, Index p, Index q) {
+  return makeJacobi(numext::real(m.coeff(p, p)), m.coeff(p, q), numext::real(m.coeff(q, q)));
 }
 
 /** Makes \c *this as a Givens rotation \c G such that applying \f$ G^* \f$ to the left of the vector
-  * \f$ V = \left ( \begin{array}{c} p \\ q \end{array} \right )\f$ yields:
-  * \f$ G^* V = \left ( \begin{array}{c} r \\ 0 \end{array} \right )\f$.
-  *
-  * The value of \a r is returned if \a r is not null (the default is null).
-  * Also note that G is built such that the cosine is always real.
-  *
-  * Example: \include Jacobi_makeGivens.cpp
-  * Output: \verbinclude Jacobi_makeGivens.out
-  *
-  * This function implements the continuous Givens rotation generation algorithm
-  * found in Anderson (2000), Discontinuous Plane Rotations and the Symmetric Eigenvalue Problem.
-  * LAPACK Working Note 150, University of Tennessee, UT-CS-00-454, December 4, 2000.
-  *
-  * \sa MatrixBase::applyOnTheLeft(), MatrixBase::applyOnTheRight()
-  */
-template<typename Scalar>
-EIGEN_DEVICE_FUNC
-void JacobiRotation<Scalar>::makeGivens(const Scalar& p, const Scalar& q, Scalar* r)
-{
+ * \f$ V = \left ( \begin{array}{c} p \\ q \end{array} \right )\f$ yields:
+ * \f$ G^* V = \left ( \begin{array}{c} r \\ 0 \end{array} \right )\f$.
+ *
+ * The value of \a r is returned if \a r is not null (the default is null).
+ * Also note that G is built such that the cosine is always real.
+ *
+ * Example: \include Jacobi_makeGivens.cpp
+ * Output: \verbinclude Jacobi_makeGivens.out
+ *
+ * This function implements the continuous Givens rotation generation algorithm
+ * found in Anderson (2000), Discontinuous Plane Rotations and the Symmetric Eigenvalue Problem.
+ * LAPACK Working Note 150, University of Tennessee, UT-CS-00-454, December 4, 2000.
+ *
+ * \sa MatrixBase::applyOnTheLeft(), MatrixBase::applyOnTheRight()
+ */
+template <typename Scalar>
+EIGEN_DEVICE_FUNC void JacobiRotation<Scalar>::makeGivens(const Scalar& p, const Scalar& q, Scalar* r) {
   makeGivens(p, q, r, std::conditional_t<NumTraits<Scalar>::IsComplex, internal::true_type, internal::false_type>());
 }
 
-
 // specialization for complexes
-template<typename Scalar>
-EIGEN_DEVICE_FUNC
-void JacobiRotation<Scalar>::makeGivens(const Scalar& p, const Scalar& q, Scalar* r, internal::true_type)
-{
-  using std::sqrt;
-  using std::abs;
+template <typename Scalar>
+EIGEN_DEVICE_FUNC void JacobiRotation<Scalar>::makeGivens(const Scalar& p, const Scalar& q, Scalar* r,
+                                                          internal::true_type) {
   using numext::conj;
+  using std::abs;
+  using std::sqrt;
 
-  if(q==Scalar(0))
-  {
-    m_c = numext::real(p)<0 ? Scalar(-1) : Scalar(1);
+  if (q == Scalar(0)) {
+    m_c = numext::real(p) < 0 ? Scalar(-1) : Scalar(1);
     m_s = 0;
-    if(r) *r = m_c * p;
-  }
-  else if(p==Scalar(0))
-  {
+    if (r) *r = m_c * p;
+  } else if (p == Scalar(0)) {
     m_c = 0;
-    m_s = -q/abs(q);
-    if(r) *r = abs(q);
-  }
-  else
-  {
+    m_s = -q / abs(q);
+    if (r) *r = abs(q);
+  } else {
     RealScalar p1 = numext::norm1(p);
     RealScalar q1 = numext::norm1(q);
-    if(p1>=q1)
-    {
+    if (p1 >= q1) {
       Scalar ps = p / p1;
       RealScalar p2 = numext::abs2(ps);
       Scalar qs = q / p1;
       RealScalar q2 = numext::abs2(qs);
 
-      RealScalar u = sqrt(RealScalar(1) + q2/p2);
-      if(numext::real(p)<RealScalar(0))
-        u = -u;
+      RealScalar u = sqrt(RealScalar(1) + q2 / p2);
+      if (numext::real(p) < RealScalar(0)) u = -u;
 
-      m_c = Scalar(1)/u;
-      m_s = -qs*conj(ps)*(m_c/p2);
-      if(r) *r = p * u;
-    }
-    else
-    {
+      m_c = Scalar(1) / u;
+      m_s = -qs * conj(ps) * (m_c / p2);
+      if (r) *r = p * u;
+    } else {
       Scalar ps = p / q1;
       RealScalar p2 = numext::abs2(ps);
       Scalar qs = q / q1;
       RealScalar q2 = numext::abs2(qs);
 
       RealScalar u = q1 * sqrt(p2 + q2);
-      if(numext::real(p)<RealScalar(0))
-        u = -u;
+      if (numext::real(p) < RealScalar(0)) u = -u;
 
       p1 = abs(p);
-      ps = p/p1;
-      m_c = p1/u;
-      m_s = -conj(ps) * (q/u);
-      if(r) *r = ps * u;
+      ps = p / p1;
+      m_c = p1 / u;
+      m_s = -conj(ps) * (q / u);
+      if (r) *r = ps * u;
     }
   }
 }
 
 // specialization for reals
-template<typename Scalar>
-EIGEN_DEVICE_FUNC
-void JacobiRotation<Scalar>::makeGivens(const Scalar& p, const Scalar& q, Scalar* r, internal::false_type)
-{
-  using std::sqrt;
+template <typename Scalar>
+EIGEN_DEVICE_FUNC void JacobiRotation<Scalar>::makeGivens(const Scalar& p, const Scalar& q, Scalar* r,
+                                                          internal::false_type) {
   using std::abs;
-  if(numext::is_exactly_zero(q))
-  {
-    m_c = p<Scalar(0) ? Scalar(-1) : Scalar(1);
+  using std::sqrt;
+  if (numext::is_exactly_zero(q)) {
+    m_c = p < Scalar(0) ? Scalar(-1) : Scalar(1);
     m_s = Scalar(0);
-    if(r) *r = abs(p);
-  }
-  else if(numext::is_exactly_zero(p))
-  {
+    if (r) *r = abs(p);
+  } else if (numext::is_exactly_zero(p)) {
     m_c = Scalar(0);
-    m_s = q<Scalar(0) ? Scalar(1) : Scalar(-1);
-    if(r) *r = abs(q);
-  }
-  else if(abs(p) > abs(q))
-  {
-    Scalar t = q/p;
+    m_s = q < Scalar(0) ? Scalar(1) : Scalar(-1);
+    if (r) *r = abs(q);
+  } else if (abs(p) > abs(q)) {
+    Scalar t = q / p;
     Scalar u = sqrt(Scalar(1) + numext::abs2(t));
-    if(p<Scalar(0))
-      u = -u;
-    m_c = Scalar(1)/u;
+    if (p < Scalar(0)) u = -u;
+    m_c = Scalar(1) / u;
     m_s = -t * m_c;
-    if(r) *r = p * u;
-  }
-  else
-  {
-    Scalar t = p/q;
+    if (r) *r = p * u;
+  } else {
+    Scalar t = p / q;
     Scalar u = sqrt(Scalar(1) + numext::abs2(t));
-    if(q<Scalar(0))
-      u = -u;
-    m_s = -Scalar(1)/u;
+    if (q < Scalar(0)) u = -u;
+    m_s = -Scalar(1) / u;
     m_c = -t * m_s;
-    if(r) *r = q * u;
+    if (r) *r = q * u;
   }
-
 }
 
 /****************************************************************************************
-*   Implementation of MatrixBase methods
-****************************************************************************************/
+ *   Implementation of MatrixBase methods
+ ****************************************************************************************/
 
 namespace internal {
 /** \jacobi_module
-  * Applies the clock wise 2D rotation \a j to the set of 2D vectors of coordinates \a x and \a y:
-  * \f$ \left ( \begin{array}{cc} x \\ y \end{array} \right )  =  J \left ( \begin{array}{cc} x \\ y \end{array} \right ) \f$
-  *
-  * \sa MatrixBase::applyOnTheLeft(), MatrixBase::applyOnTheRight()
-  */
-template<typename VectorX, typename VectorY, typename OtherScalar>
-EIGEN_DEVICE_FUNC
-void apply_rotation_in_the_plane(DenseBase<VectorX>& xpr_x, DenseBase<VectorY>& xpr_y, const JacobiRotation<OtherScalar>& j);
-}
+ * Applies the clock wise 2D rotation \a j to the set of 2D vectors of coordinates \a x and \a y:
+ * \f$ \left ( \begin{array}{cc} x \\ y \end{array} \right )  =  J \left ( \begin{array}{cc} x \\ y \end{array} \right )
+ * \f$
+ *
+ * \sa MatrixBase::applyOnTheLeft(), MatrixBase::applyOnTheRight()
+ */
+template <typename VectorX, typename VectorY, typename OtherScalar>
+EIGEN_DEVICE_FUNC void apply_rotation_in_the_plane(DenseBase<VectorX>& xpr_x, DenseBase<VectorY>& xpr_y,
+                                                   const JacobiRotation<OtherScalar>& j);
+}  // namespace internal
 
 /** \jacobi_module
-  * Applies the rotation in the plane \a j to the rows \a p and \a q of \c *this, i.e., it computes B = J * B,
-  * with \f$ B = \left ( \begin{array}{cc} \text{*this.row}(p) \\ \text{*this.row}(q) \end{array} \right ) \f$.
-  *
-  * \sa class JacobiRotation, MatrixBase::applyOnTheRight(), internal::apply_rotation_in_the_plane()
-  */
-template<typename Derived>
-template<typename OtherScalar>
-EIGEN_DEVICE_FUNC
-inline void MatrixBase<Derived>::applyOnTheLeft(Index p, Index q, const JacobiRotation<OtherScalar>& j)
-{
+ * Applies the rotation in the plane \a j to the rows \a p and \a q of \c *this, i.e., it computes B = J * B,
+ * with \f$ B = \left ( \begin{array}{cc} \text{*this.row}(p) \\ \text{*this.row}(q) \end{array} \right ) \f$.
+ *
+ * \sa class JacobiRotation, MatrixBase::applyOnTheRight(), internal::apply_rotation_in_the_plane()
+ */
+template <typename Derived>
+template <typename OtherScalar>
+EIGEN_DEVICE_FUNC inline void MatrixBase<Derived>::applyOnTheLeft(Index p, Index q,
+                                                                  const JacobiRotation<OtherScalar>& j) {
   RowXpr x(this->row(p));
   RowXpr y(this->row(q));
   internal::apply_rotation_in_the_plane(x, y, j);
 }
 
 /** \ingroup Jacobi_Module
-  * Applies the rotation in the plane \a j to the columns \a p and \a q of \c *this, i.e., it computes B = B * J
-  * with \f$ B = \left ( \begin{array}{cc} \text{*this.col}(p) & \text{*this.col}(q) \end{array} \right ) \f$.
-  *
-  * \sa class JacobiRotation, MatrixBase::applyOnTheLeft(), internal::apply_rotation_in_the_plane()
-  */
-template<typename Derived>
-template<typename OtherScalar>
-EIGEN_DEVICE_FUNC
-inline void MatrixBase<Derived>::applyOnTheRight(Index p, Index q, const JacobiRotation<OtherScalar>& j)
-{
+ * Applies the rotation in the plane \a j to the columns \a p and \a q of \c *this, i.e., it computes B = B * J
+ * with \f$ B = \left ( \begin{array}{cc} \text{*this.col}(p) & \text{*this.col}(q) \end{array} \right ) \f$.
+ *
+ * \sa class JacobiRotation, MatrixBase::applyOnTheLeft(), internal::apply_rotation_in_the_plane()
+ */
+template <typename Derived>
+template <typename OtherScalar>
+EIGEN_DEVICE_FUNC inline void MatrixBase<Derived>::applyOnTheRight(Index p, Index q,
+                                                                   const JacobiRotation<OtherScalar>& j) {
   ColXpr x(this->col(p));
   ColXpr y(this->col(q));
   internal::apply_rotation_in_the_plane(x, y, j.transpose());
@@ -320,18 +282,14 @@
 
 namespace internal {
 
-template<typename Scalar, typename OtherScalar,
-         int SizeAtCompileTime, int MinAlignment, bool Vectorizable>
-struct apply_rotation_in_the_plane_selector
-{
-  static EIGEN_DEVICE_FUNC
-  inline void run(Scalar *x, Index incrx, Scalar *y, Index incry, Index size, OtherScalar c, OtherScalar s)
-  {
-    for(Index i=0; i<size; ++i)
-    {
+template <typename Scalar, typename OtherScalar, int SizeAtCompileTime, int MinAlignment, bool Vectorizable>
+struct apply_rotation_in_the_plane_selector {
+  static EIGEN_DEVICE_FUNC inline void run(Scalar* x, Index incrx, Scalar* y, Index incry, Index size, OtherScalar c,
+                                           OtherScalar s) {
+    for (Index i = 0; i < size; ++i) {
       Scalar xi = *x;
       Scalar yi = *y;
-      *x =  c * xi + numext::conj(s) * yi;
+      *x = c * xi + numext::conj(s) * yi;
       *y = -s * xi + numext::conj(c) * yi;
       x += incrx;
       y += incry;
@@ -339,12 +297,10 @@
   }
 };
 
-template<typename Scalar, typename OtherScalar,
-         int SizeAtCompileTime, int MinAlignment>
-struct apply_rotation_in_the_plane_selector<Scalar,OtherScalar,SizeAtCompileTime,MinAlignment,true /* vectorizable */>
-{
-  static inline void run(Scalar *x, Index incrx, Scalar *y, Index incry, Index size, OtherScalar c, OtherScalar s)
-  {
+template <typename Scalar, typename OtherScalar, int SizeAtCompileTime, int MinAlignment>
+struct apply_rotation_in_the_plane_selector<Scalar, OtherScalar, SizeAtCompileTime, MinAlignment,
+                                            true /* vectorizable */> {
+  static inline void run(Scalar* x, Index incrx, Scalar* y, Index incry, Index size, OtherScalar c, OtherScalar s) {
     typedef typename packet_traits<Scalar>::type Packet;
     typedef typename packet_traits<OtherScalar>::type OtherPacket;
 
@@ -353,108 +309,96 @@
     constexpr Index PacketSize = packet_traits<Scalar>::size;
 
     /*** dynamic-size vectorized paths ***/
-    if(size >= 2 * PacketSize && SizeAtCompileTime == Dynamic && ((incrx == 1 && incry == 1) || PacketSize == 1))
-    {
+    if (size >= 2 * PacketSize && SizeAtCompileTime == Dynamic && ((incrx == 1 && incry == 1) || PacketSize == 1)) {
       // both vectors are sequentially stored in memory => vectorization
       constexpr Index Peeling = 2;
 
       Index alignedStart = internal::first_default_aligned(y, size);
-      Index alignedEnd = alignedStart + ((size-alignedStart)/PacketSize)*PacketSize;
+      Index alignedEnd = alignedStart + ((size - alignedStart) / PacketSize) * PacketSize;
 
       const OtherPacket pc = pset1<OtherPacket>(c);
       const OtherPacket ps = pset1<OtherPacket>(s);
-      conj_helper<OtherPacket,Packet,NumTraits<OtherScalar>::IsComplex,false> pcj;
-      conj_helper<OtherPacket,Packet,false,false> pm;
+      conj_helper<OtherPacket, Packet, NumTraits<OtherScalar>::IsComplex, false> pcj;
+      conj_helper<OtherPacket, Packet, false, false> pm;
 
-      for(Index i=0; i<alignedStart; ++i)
-      {
+      for (Index i = 0; i < alignedStart; ++i) {
         Scalar xi = x[i];
         Scalar yi = y[i];
-        x[i] =  c * xi + numext::conj(s) * yi;
+        x[i] = c * xi + numext::conj(s) * yi;
         y[i] = -s * xi + numext::conj(c) * yi;
       }
 
       Scalar* EIGEN_RESTRICT px = x + alignedStart;
       Scalar* EIGEN_RESTRICT py = y + alignedStart;
 
-      if(internal::first_default_aligned(x, size)==alignedStart)
-      {
-        for(Index i=alignedStart; i<alignedEnd; i+=PacketSize)
-        {
+      if (internal::first_default_aligned(x, size) == alignedStart) {
+        for (Index i = alignedStart; i < alignedEnd; i += PacketSize) {
           Packet xi = pload<Packet>(px);
           Packet yi = pload<Packet>(py);
-          pstore(px, padd(pm.pmul(pc,xi),pcj.pmul(ps,yi)));
-          pstore(py, psub(pcj.pmul(pc,yi),pm.pmul(ps,xi)));
+          pstore(px, padd(pm.pmul(pc, xi), pcj.pmul(ps, yi)));
+          pstore(py, psub(pcj.pmul(pc, yi), pm.pmul(ps, xi)));
           px += PacketSize;
           py += PacketSize;
         }
-      }
-      else
-      {
-        Index peelingEnd = alignedStart + ((size-alignedStart)/(Peeling*PacketSize))*(Peeling*PacketSize);
-        for(Index i=alignedStart; i<peelingEnd; i+=Peeling*PacketSize)
-        {
-          Packet xi   = ploadu<Packet>(px);
-          Packet xi1  = ploadu<Packet>(px+PacketSize);
-          Packet yi   = pload <Packet>(py);
-          Packet yi1  = pload <Packet>(py+PacketSize);
-          pstoreu(px, padd(pm.pmul(pc,xi),pcj.pmul(ps,yi)));
-          pstoreu(px+PacketSize, padd(pm.pmul(pc,xi1),pcj.pmul(ps,yi1)));
-          pstore (py, psub(pcj.pmul(pc,yi),pm.pmul(ps,xi)));
-          pstore (py+PacketSize, psub(pcj.pmul(pc,yi1),pm.pmul(ps,xi1)));
-          px += Peeling*PacketSize;
-          py += Peeling*PacketSize;
+      } else {
+        Index peelingEnd = alignedStart + ((size - alignedStart) / (Peeling * PacketSize)) * (Peeling * PacketSize);
+        for (Index i = alignedStart; i < peelingEnd; i += Peeling * PacketSize) {
+          Packet xi = ploadu<Packet>(px);
+          Packet xi1 = ploadu<Packet>(px + PacketSize);
+          Packet yi = pload<Packet>(py);
+          Packet yi1 = pload<Packet>(py + PacketSize);
+          pstoreu(px, padd(pm.pmul(pc, xi), pcj.pmul(ps, yi)));
+          pstoreu(px + PacketSize, padd(pm.pmul(pc, xi1), pcj.pmul(ps, yi1)));
+          pstore(py, psub(pcj.pmul(pc, yi), pm.pmul(ps, xi)));
+          pstore(py + PacketSize, psub(pcj.pmul(pc, yi1), pm.pmul(ps, xi1)));
+          px += Peeling * PacketSize;
+          py += Peeling * PacketSize;
         }
-        if(alignedEnd!=peelingEnd)
-        {
-          Packet xi = ploadu<Packet>(x+peelingEnd);
-          Packet yi = pload <Packet>(y+peelingEnd);
-          pstoreu(x+peelingEnd, padd(pm.pmul(pc,xi),pcj.pmul(ps,yi)));
-          pstore (y+peelingEnd, psub(pcj.pmul(pc,yi),pm.pmul(ps,xi)));
+        if (alignedEnd != peelingEnd) {
+          Packet xi = ploadu<Packet>(x + peelingEnd);
+          Packet yi = pload<Packet>(y + peelingEnd);
+          pstoreu(x + peelingEnd, padd(pm.pmul(pc, xi), pcj.pmul(ps, yi)));
+          pstore(y + peelingEnd, psub(pcj.pmul(pc, yi), pm.pmul(ps, xi)));
         }
       }
 
-      for(Index i=alignedEnd; i<size; ++i)
-      {
+      for (Index i = alignedEnd; i < size; ++i) {
         Scalar xi = x[i];
         Scalar yi = y[i];
-        x[i] =  c * xi + numext::conj(s) * yi;
+        x[i] = c * xi + numext::conj(s) * yi;
         y[i] = -s * xi + numext::conj(c) * yi;
       }
     }
 
     /*** fixed-size vectorized path ***/
-    else if(SizeAtCompileTime != Dynamic && MinAlignment >= RequiredAlignment)
-    {
+    else if (SizeAtCompileTime != Dynamic && MinAlignment >= RequiredAlignment) {
       const OtherPacket pc = pset1<OtherPacket>(c);
       const OtherPacket ps = pset1<OtherPacket>(s);
-      conj_helper<OtherPacket,Packet,NumTraits<OtherScalar>::IsComplex,false> pcj;
-      conj_helper<OtherPacket,Packet,false,false> pm;
+      conj_helper<OtherPacket, Packet, NumTraits<OtherScalar>::IsComplex, false> pcj;
+      conj_helper<OtherPacket, Packet, false, false> pm;
       Scalar* EIGEN_RESTRICT px = x;
       Scalar* EIGEN_RESTRICT py = y;
-      for(Index i=0; i<size; i+=PacketSize)
-      {
+      for (Index i = 0; i < size; i += PacketSize) {
         Packet xi = pload<Packet>(px);
         Packet yi = pload<Packet>(py);
-        pstore(px, padd(pm.pmul(pc,xi),pcj.pmul(ps,yi)));
-        pstore(py, psub(pcj.pmul(pc,yi),pm.pmul(ps,xi)));
+        pstore(px, padd(pm.pmul(pc, xi), pcj.pmul(ps, yi)));
+        pstore(py, psub(pcj.pmul(pc, yi), pm.pmul(ps, xi)));
         px += PacketSize;
         py += PacketSize;
       }
     }
 
     /*** non-vectorized path ***/
-    else
-    {
-      apply_rotation_in_the_plane_selector<Scalar,OtherScalar,SizeAtCompileTime,MinAlignment,false>::run(x,incrx,y,incry,size,c,s);
+    else {
+      apply_rotation_in_the_plane_selector<Scalar, OtherScalar, SizeAtCompileTime, MinAlignment, false>::run(
+          x, incrx, y, incry, size, c, s);
     }
   }
 };
 
-template<typename VectorX, typename VectorY, typename OtherScalar>
-EIGEN_DEVICE_FUNC
-void inline apply_rotation_in_the_plane(DenseBase<VectorX>& xpr_x, DenseBase<VectorY>& xpr_y, const JacobiRotation<OtherScalar>& j)
-{
+template <typename VectorX, typename VectorY, typename OtherScalar>
+EIGEN_DEVICE_FUNC void inline apply_rotation_in_the_plane(DenseBase<VectorX>& xpr_x, DenseBase<VectorY>& xpr_y,
+                                                          const JacobiRotation<OtherScalar>& j) {
   typedef typename VectorX::Scalar Scalar;
   constexpr bool Vectorizable = (int(evaluator<VectorX>::Flags) & int(evaluator<VectorY>::Flags) & PacketAccessBit) &&
                                 (int(packet_traits<Scalar>::size) == int(packet_traits<OtherScalar>::size));
@@ -469,16 +413,15 @@
 
   OtherScalar c = j.c();
   OtherScalar s = j.s();
-  if (numext::is_exactly_one(c) && numext::is_exactly_zero(s))
-    return;
+  if (numext::is_exactly_one(c) && numext::is_exactly_zero(s)) return;
 
   constexpr int Alignment = (std::min)(int(evaluator<VectorX>::Alignment), int(evaluator<VectorY>::Alignment));
   apply_rotation_in_the_plane_selector<Scalar, OtherScalar, VectorX::SizeAtCompileTime, Alignment, Vectorizable>::run(
       x, incrx, y, incry, size, c, s);
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_JACOBI_H
+#endif  // EIGEN_JACOBI_H
diff --git a/Eigen/src/KLUSupport/KLUSupport.h b/Eigen/src/KLUSupport/KLUSupport.h
index 0c6c240..574021d 100644
--- a/Eigen/src/KLUSupport/KLUSupport.h
+++ b/Eigen/src/KLUSupport/KLUSupport.h
@@ -18,106 +18,101 @@
 /* TODO extract L, extract U, compute det, etc... */
 
 /** \ingroup KLUSupport_Module
-  * \brief A sparse LU factorization and solver based on KLU
-  *
-  * This class allows to solve for A.X = B sparse linear problems via a LU factorization
-  * using the KLU library. The sparse matrix A must be squared and full rank.
-  * The vectors or matrices X and B can be either dense or sparse.
-  *
-  * \warning The input matrix A should be in a \b compressed and \b column-major form.
-  * Otherwise an expensive copy will be made. You can call the inexpensive makeCompressed() to get a compressed matrix.
-  * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
-  *
-  * \implsparsesolverconcept
-  *
-  * \sa \ref TutorialSparseSolverConcept, class UmfPackLU, class SparseLU
-  */
+ * \brief A sparse LU factorization and solver based on KLU
+ *
+ * This class allows to solve for A.X = B sparse linear problems via a LU factorization
+ * using the KLU library. The sparse matrix A must be squared and full rank.
+ * The vectors or matrices X and B can be either dense or sparse.
+ *
+ * \warning The input matrix A should be in a \b compressed and \b column-major form.
+ * Otherwise an expensive copy will be made. You can call the inexpensive makeCompressed() to get a compressed matrix.
+ * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
+ *
+ * \implsparsesolverconcept
+ *
+ * \sa \ref TutorialSparseSolverConcept, class UmfPackLU, class SparseLU
+ */
 
-
-inline int klu_solve(klu_symbolic *Symbolic, klu_numeric *Numeric, Index ldim, Index nrhs, double B [ ], klu_common *Common, double) {
-   return klu_solve(Symbolic, Numeric, internal::convert_index<int>(ldim), internal::convert_index<int>(nrhs), B, Common);
+inline int klu_solve(klu_symbolic *Symbolic, klu_numeric *Numeric, Index ldim, Index nrhs, double B[],
+                     klu_common *Common, double) {
+  return klu_solve(Symbolic, Numeric, internal::convert_index<int>(ldim), internal::convert_index<int>(nrhs), B,
+                   Common);
 }
 
-inline int klu_solve(klu_symbolic *Symbolic, klu_numeric *Numeric, Index ldim, Index nrhs, std::complex<double>B[], klu_common *Common, std::complex<double>) {
-   return klu_z_solve(Symbolic, Numeric, internal::convert_index<int>(ldim), internal::convert_index<int>(nrhs), &numext::real_ref(B[0]), Common);
+inline int klu_solve(klu_symbolic *Symbolic, klu_numeric *Numeric, Index ldim, Index nrhs, std::complex<double> B[],
+                     klu_common *Common, std::complex<double>) {
+  return klu_z_solve(Symbolic, Numeric, internal::convert_index<int>(ldim), internal::convert_index<int>(nrhs),
+                     &numext::real_ref(B[0]), Common);
 }
 
-inline int klu_tsolve(klu_symbolic *Symbolic, klu_numeric *Numeric, Index ldim, Index nrhs, double B[], klu_common *Common, double) {
-   return klu_tsolve(Symbolic, Numeric, internal::convert_index<int>(ldim), internal::convert_index<int>(nrhs), B, Common);
+inline int klu_tsolve(klu_symbolic *Symbolic, klu_numeric *Numeric, Index ldim, Index nrhs, double B[],
+                      klu_common *Common, double) {
+  return klu_tsolve(Symbolic, Numeric, internal::convert_index<int>(ldim), internal::convert_index<int>(nrhs), B,
+                    Common);
 }
 
-inline int klu_tsolve(klu_symbolic *Symbolic, klu_numeric *Numeric, Index ldim, Index nrhs, std::complex<double>B[], klu_common *Common, std::complex<double>) {
-   return klu_z_tsolve(Symbolic, Numeric, internal::convert_index<int>(ldim), internal::convert_index<int>(nrhs), &numext::real_ref(B[0]), 0, Common);
+inline int klu_tsolve(klu_symbolic *Symbolic, klu_numeric *Numeric, Index ldim, Index nrhs, std::complex<double> B[],
+                      klu_common *Common, std::complex<double>) {
+  return klu_z_tsolve(Symbolic, Numeric, internal::convert_index<int>(ldim), internal::convert_index<int>(nrhs),
+                      &numext::real_ref(B[0]), 0, Common);
 }
 
-inline klu_numeric* klu_factor(int Ap [ ], int Ai [ ], double Ax [ ], klu_symbolic *Symbolic, klu_common *Common, double) {
-   return klu_factor(Ap, Ai, Ax, Symbolic, Common);
+inline klu_numeric *klu_factor(int Ap[], int Ai[], double Ax[], klu_symbolic *Symbolic, klu_common *Common, double) {
+  return klu_factor(Ap, Ai, Ax, Symbolic, Common);
 }
 
-inline klu_numeric* klu_factor(int Ap[], int Ai[], std::complex<double> Ax[], klu_symbolic *Symbolic, klu_common *Common, std::complex<double>) {
-   return klu_z_factor(Ap, Ai, &numext::real_ref(Ax[0]), Symbolic, Common);
+inline klu_numeric *klu_factor(int Ap[], int Ai[], std::complex<double> Ax[], klu_symbolic *Symbolic,
+                               klu_common *Common, std::complex<double>) {
+  return klu_z_factor(Ap, Ai, &numext::real_ref(Ax[0]), Symbolic, Common);
 }
 
+template <typename MatrixType_>
+class KLU : public SparseSolverBase<KLU<MatrixType_> > {
+ protected:
+  typedef SparseSolverBase<KLU<MatrixType_> > Base;
+  using Base::m_isInitialized;
 
-template<typename MatrixType_>
-class KLU : public SparseSolverBase<KLU<MatrixType_> >
-{
-  protected:
-    typedef SparseSolverBase<KLU<MatrixType_> > Base;
-    using Base::m_isInitialized;
-  public:
-    using Base::_solve_impl;
-    typedef MatrixType_ MatrixType;
-    typedef typename MatrixType::Scalar Scalar;
-    typedef typename MatrixType::RealScalar RealScalar;
-    typedef typename MatrixType::StorageIndex StorageIndex;
-    typedef Matrix<Scalar,Dynamic,1> Vector;
-    typedef Matrix<int, 1, MatrixType::ColsAtCompileTime> IntRowVectorType;
-    typedef Matrix<int, MatrixType::RowsAtCompileTime, 1> IntColVectorType;
-    typedef SparseMatrix<Scalar> LUMatrixType;
-    typedef SparseMatrix<Scalar,ColMajor,int> KLUMatrixType;
-    typedef Ref<const KLUMatrixType, StandardCompressedFormat> KLUMatrixRef;
-    enum {
-      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
-      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
-    };
+ public:
+  using Base::_solve_impl;
+  typedef MatrixType_ MatrixType;
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::RealScalar RealScalar;
+  typedef typename MatrixType::StorageIndex StorageIndex;
+  typedef Matrix<Scalar, Dynamic, 1> Vector;
+  typedef Matrix<int, 1, MatrixType::ColsAtCompileTime> IntRowVectorType;
+  typedef Matrix<int, MatrixType::RowsAtCompileTime, 1> IntColVectorType;
+  typedef SparseMatrix<Scalar> LUMatrixType;
+  typedef SparseMatrix<Scalar, ColMajor, int> KLUMatrixType;
+  typedef Ref<const KLUMatrixType, StandardCompressedFormat> KLUMatrixRef;
+  enum { ColsAtCompileTime = MatrixType::ColsAtCompileTime, MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime };
 
-  public:
+ public:
+  KLU() : m_dummy(0, 0), mp_matrix(m_dummy) { init(); }
 
-    KLU()
-      : m_dummy(0,0), mp_matrix(m_dummy)
-    {
-      init();
-    }
+  template <typename InputMatrixType>
+  explicit KLU(const InputMatrixType &matrix) : mp_matrix(matrix) {
+    init();
+    compute(matrix);
+  }
 
-    template<typename InputMatrixType>
-    explicit KLU(const InputMatrixType& matrix)
-      : mp_matrix(matrix)
-    {
-      init();
-      compute(matrix);
-    }
+  ~KLU() {
+    if (m_symbolic) klu_free_symbolic(&m_symbolic, &m_common);
+    if (m_numeric) klu_free_numeric(&m_numeric, &m_common);
+  }
 
-    ~KLU()
-    {
-      if(m_symbolic) klu_free_symbolic(&m_symbolic,&m_common);
-      if(m_numeric)  klu_free_numeric(&m_numeric,&m_common);
-    }
+  EIGEN_CONSTEXPR inline Index rows() const EIGEN_NOEXCEPT { return mp_matrix.rows(); }
+  EIGEN_CONSTEXPR inline Index cols() const EIGEN_NOEXCEPT { return mp_matrix.cols(); }
 
-    EIGEN_CONSTEXPR inline Index rows() const EIGEN_NOEXCEPT { return mp_matrix.rows(); }
-    EIGEN_CONSTEXPR inline Index cols() const EIGEN_NOEXCEPT { return mp_matrix.cols(); }
-
-    /** \brief Reports whether previous computation was successful.
-      *
-      * \returns \c Success if computation was successful,
-      *          \c NumericalIssue if the matrix.appears to be negative.
-      */
-    ComputationInfo info() const
-    {
-      eigen_assert(m_isInitialized && "Decomposition is not initialized.");
-      return m_info;
-    }
-#if 0 // not implemented yet
+  /** \brief Reports whether previous computation was successful.
+   *
+   * \returns \c Success if computation was successful,
+   *          \c NumericalIssue if the matrix.appears to be negative.
+   */
+  ComputationInfo info() const {
+    eigen_assert(m_isInitialized && "Decomposition is not initialized.");
+    return m_info;
+  }
+#if 0  // not implemented yet
     inline const LUMatrixType& matrixL() const
     {
       if (m_extractedDataAreDirty) extractData();
@@ -142,167 +137,148 @@
       return m_q;
     }
 #endif
-    /** Computes the sparse Cholesky decomposition of \a matrix
-     *  Note that the matrix should be column-major, and in compressed format for best performance.
-     *  \sa SparseMatrix::makeCompressed().
-     */
-    template<typename InputMatrixType>
-    void compute(const InputMatrixType& matrix)
-    {
-      if(m_symbolic) klu_free_symbolic(&m_symbolic, &m_common);
-      if(m_numeric)  klu_free_numeric(&m_numeric, &m_common);
-      grab(matrix.derived());
-      analyzePattern_impl();
-      factorize_impl();
-    }
+  /** Computes the sparse Cholesky decomposition of \a matrix
+   *  Note that the matrix should be column-major, and in compressed format for best performance.
+   *  \sa SparseMatrix::makeCompressed().
+   */
+  template <typename InputMatrixType>
+  void compute(const InputMatrixType &matrix) {
+    if (m_symbolic) klu_free_symbolic(&m_symbolic, &m_common);
+    if (m_numeric) klu_free_numeric(&m_numeric, &m_common);
+    grab(matrix.derived());
+    analyzePattern_impl();
+    factorize_impl();
+  }
 
-    /** Performs a symbolic decomposition on the sparcity of \a matrix.
-      *
-      * This function is particularly useful when solving for several problems having the same structure.
-      *
-      * \sa factorize(), compute()
-      */
-    template<typename InputMatrixType>
-    void analyzePattern(const InputMatrixType& matrix)
-    {
-      if(m_symbolic) klu_free_symbolic(&m_symbolic, &m_common);
-      if(m_numeric)  klu_free_numeric(&m_numeric, &m_common);
+  /** Performs a symbolic decomposition on the sparcity of \a matrix.
+   *
+   * This function is particularly useful when solving for several problems having the same structure.
+   *
+   * \sa factorize(), compute()
+   */
+  template <typename InputMatrixType>
+  void analyzePattern(const InputMatrixType &matrix) {
+    if (m_symbolic) klu_free_symbolic(&m_symbolic, &m_common);
+    if (m_numeric) klu_free_numeric(&m_numeric, &m_common);
 
-      grab(matrix.derived());
+    grab(matrix.derived());
 
-      analyzePattern_impl();
-    }
+    analyzePattern_impl();
+  }
 
+  /** Provides access to the control settings array used by KLU.
+   *
+   * See KLU documentation for details.
+   */
+  inline const klu_common &kluCommon() const { return m_common; }
 
-    /** Provides access to the control settings array used by KLU.
-      *
-      * See KLU documentation for details.
-      */
-    inline const klu_common& kluCommon() const
-    {
-      return m_common;
-    }
+  /** Provides access to the control settings array used by UmfPack.
+   *
+   * If this array contains NaN's, the default values are used.
+   *
+   * See KLU documentation for details.
+   */
+  inline klu_common &kluCommon() { return m_common; }
 
-    /** Provides access to the control settings array used by UmfPack.
-      *
-      * If this array contains NaN's, the default values are used.
-      *
-      * See KLU documentation for details.
-      */
-    inline klu_common& kluCommon()
-    {
-      return m_common;
-    }
+  /** Performs a numeric decomposition of \a matrix
+   *
+   * The given matrix must has the same sparcity than the matrix on which the pattern anylysis has been performed.
+   *
+   * \sa analyzePattern(), compute()
+   */
+  template <typename InputMatrixType>
+  void factorize(const InputMatrixType &matrix) {
+    eigen_assert(m_analysisIsOk && "KLU: you must first call analyzePattern()");
+    if (m_numeric) klu_free_numeric(&m_numeric, &m_common);
 
-    /** Performs a numeric decomposition of \a matrix
-      *
-      * The given matrix must has the same sparcity than the matrix on which the pattern anylysis has been performed.
-      *
-      * \sa analyzePattern(), compute()
-      */
-    template<typename InputMatrixType>
-    void factorize(const InputMatrixType& matrix)
-    {
-      eigen_assert(m_analysisIsOk && "KLU: you must first call analyzePattern()");
-      if(m_numeric)
-        klu_free_numeric(&m_numeric,&m_common);
+    grab(matrix.derived());
 
-      grab(matrix.derived());
+    factorize_impl();
+  }
 
-      factorize_impl();
-    }
+  /** \internal */
+  template <typename BDerived, typename XDerived>
+  bool _solve_impl(const MatrixBase<BDerived> &b, MatrixBase<XDerived> &x) const;
 
-    /** \internal */
-    template<typename BDerived,typename XDerived>
-    bool _solve_impl(const MatrixBase<BDerived> &b, MatrixBase<XDerived> &x) const;
-
-#if 0 // not implemented yet
+#if 0  // not implemented yet
     Scalar determinant() const;
 
     void extractData() const;
 #endif
 
-  protected:
+ protected:
+  void init() {
+    m_info = InvalidInput;
+    m_isInitialized = false;
+    m_numeric = 0;
+    m_symbolic = 0;
+    m_extractedDataAreDirty = true;
 
-    void init()
-    {
-      m_info                  = InvalidInput;
-      m_isInitialized         = false;
-      m_numeric               = 0;
-      m_symbolic              = 0;
-      m_extractedDataAreDirty = true;
+    klu_defaults(&m_common);
+  }
 
-      klu_defaults(&m_common);
-    }
-
-    void analyzePattern_impl()
-    {
-      m_info = InvalidInput;
-      m_analysisIsOk = false;
-      m_factorizationIsOk = false;
-      m_symbolic = klu_analyze(internal::convert_index<int>(mp_matrix.rows()),
-                                     const_cast<StorageIndex*>(mp_matrix.outerIndexPtr()), const_cast<StorageIndex*>(mp_matrix.innerIndexPtr()),
-                                     &m_common);
-      if (m_symbolic) {
-         m_isInitialized = true;
-         m_info = Success;
-         m_analysisIsOk = true;
-         m_extractedDataAreDirty = true;
-      }
-    }
-
-    void factorize_impl()
-    {
-
-      m_numeric = klu_factor(const_cast<StorageIndex*>(mp_matrix.outerIndexPtr()), const_cast<StorageIndex*>(mp_matrix.innerIndexPtr()), const_cast<Scalar*>(mp_matrix.valuePtr()),
-                                    m_symbolic, &m_common, Scalar());
-
-
-      m_info = m_numeric ? Success : NumericalIssue;
-      m_factorizationIsOk = m_numeric ? 1 : 0;
+  void analyzePattern_impl() {
+    m_info = InvalidInput;
+    m_analysisIsOk = false;
+    m_factorizationIsOk = false;
+    m_symbolic = klu_analyze(internal::convert_index<int>(mp_matrix.rows()),
+                             const_cast<StorageIndex *>(mp_matrix.outerIndexPtr()),
+                             const_cast<StorageIndex *>(mp_matrix.innerIndexPtr()), &m_common);
+    if (m_symbolic) {
+      m_isInitialized = true;
+      m_info = Success;
+      m_analysisIsOk = true;
       m_extractedDataAreDirty = true;
     }
+  }
 
-    template<typename MatrixDerived>
-    void grab(const EigenBase<MatrixDerived> &A)
-    {
+  void factorize_impl() {
+    m_numeric = klu_factor(const_cast<StorageIndex *>(mp_matrix.outerIndexPtr()),
+                           const_cast<StorageIndex *>(mp_matrix.innerIndexPtr()),
+                           const_cast<Scalar *>(mp_matrix.valuePtr()), m_symbolic, &m_common, Scalar());
+
+    m_info = m_numeric ? Success : NumericalIssue;
+    m_factorizationIsOk = m_numeric ? 1 : 0;
+    m_extractedDataAreDirty = true;
+  }
+
+  template <typename MatrixDerived>
+  void grab(const EigenBase<MatrixDerived> &A) {
+    internal::destroy_at(&mp_matrix);
+    internal::construct_at(&mp_matrix, A.derived());
+  }
+
+  void grab(const KLUMatrixRef &A) {
+    if (&(A.derived()) != &mp_matrix) {
       internal::destroy_at(&mp_matrix);
-      internal::construct_at(&mp_matrix, A.derived());
+      internal::construct_at(&mp_matrix, A);
     }
+  }
 
-    void grab(const KLUMatrixRef &A)
-    {
-      if(&(A.derived()) != &mp_matrix)
-      {
-        internal::destroy_at(&mp_matrix);
-        internal::construct_at(&mp_matrix, A);
-      }
-    }
-
-    // cached data to reduce reallocation, etc.
-#if 0 // not implemented yet
+  // cached data to reduce reallocation, etc.
+#if 0  // not implemented yet
     mutable LUMatrixType m_l;
     mutable LUMatrixType m_u;
     mutable IntColVectorType m_p;
     mutable IntRowVectorType m_q;
 #endif
 
-    KLUMatrixType m_dummy;
-    KLUMatrixRef mp_matrix;
+  KLUMatrixType m_dummy;
+  KLUMatrixRef mp_matrix;
 
-    klu_numeric* m_numeric;
-    klu_symbolic* m_symbolic;
-    klu_common m_common;
-    mutable ComputationInfo m_info;
-    int m_factorizationIsOk;
-    int m_analysisIsOk;
-    mutable bool m_extractedDataAreDirty;
+  klu_numeric *m_numeric;
+  klu_symbolic *m_symbolic;
+  klu_common m_common;
+  mutable ComputationInfo m_info;
+  int m_factorizationIsOk;
+  int m_analysisIsOk;
+  mutable bool m_extractedDataAreDirty;
 
-  private:
-    KLU(const KLU& ) { }
+ private:
+  KLU(const KLU &) {}
 };
 
-#if 0 // not implemented yet
+#if 0  // not implemented yet
 template<typename MatrixType>
 void KLU<MatrixType>::extractData() const
 {
@@ -341,21 +317,23 @@
 }
 #endif
 
-template<typename MatrixType>
-template<typename BDerived,typename XDerived>
-bool KLU<MatrixType>::_solve_impl(const MatrixBase<BDerived> &b, MatrixBase<XDerived> &x) const
-{
+template <typename MatrixType>
+template <typename BDerived, typename XDerived>
+bool KLU<MatrixType>::_solve_impl(const MatrixBase<BDerived> &b, MatrixBase<XDerived> &x) const {
   Index rhsCols = b.cols();
-  EIGEN_STATIC_ASSERT((XDerived::Flags&RowMajorBit)==0, THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);
-  eigen_assert(m_factorizationIsOk && "The decomposition is not in a valid state for solving, you must first call either compute() or analyzePattern()/factorize()");
+  EIGEN_STATIC_ASSERT((XDerived::Flags & RowMajorBit) == 0, THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);
+  eigen_assert(m_factorizationIsOk &&
+               "The decomposition is not in a valid state for solving, you must first call either compute() or "
+               "analyzePattern()/factorize()");
 
   x = b;
-  int info = klu_solve(m_symbolic, m_numeric, b.rows(), rhsCols, x.const_cast_derived().data(), const_cast<klu_common*>(&m_common), Scalar());
+  int info = klu_solve(m_symbolic, m_numeric, b.rows(), rhsCols, x.const_cast_derived().data(),
+                       const_cast<klu_common *>(&m_common), Scalar());
 
-  m_info = info!=0 ? Success : NumericalIssue;
+  m_info = info != 0 ? Success : NumericalIssue;
   return true;
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_KLUSUPPORT_H
+#endif  // EIGEN_KLUSUPPORT_H
diff --git a/Eigen/src/LU/Determinant.h b/Eigen/src/LU/Determinant.h
index 3d26afa..ae4fee3 100644
--- a/Eigen/src/LU/Determinant.h
+++ b/Eigen/src/LU/Determinant.h
@@ -13,108 +13,86 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
-template<typename Derived>
-EIGEN_DEVICE_FUNC
-inline const typename Derived::Scalar bruteforce_det3_helper
-(const MatrixBase<Derived>& matrix, int a, int b, int c)
-{
-  return matrix.coeff(0,a)
-         * (matrix.coeff(1,b) * matrix.coeff(2,c) - matrix.coeff(1,c) * matrix.coeff(2,b));
+template <typename Derived>
+EIGEN_DEVICE_FUNC inline const typename Derived::Scalar bruteforce_det3_helper(const MatrixBase<Derived>& matrix, int a,
+                                                                               int b, int c) {
+  return matrix.coeff(0, a) * (matrix.coeff(1, b) * matrix.coeff(2, c) - matrix.coeff(1, c) * matrix.coeff(2, b));
 }
 
-template<typename Derived,
-         int DeterminantType = Derived::RowsAtCompileTime
-> struct determinant_impl
-{
-  static inline typename traits<Derived>::Scalar run(const Derived& m)
-  {
-    if(Derived::ColsAtCompileTime==Dynamic && m.rows()==0)
-      return typename traits<Derived>::Scalar(1);
+template <typename Derived, int DeterminantType = Derived::RowsAtCompileTime>
+struct determinant_impl {
+  static inline typename traits<Derived>::Scalar run(const Derived& m) {
+    if (Derived::ColsAtCompileTime == Dynamic && m.rows() == 0) return typename traits<Derived>::Scalar(1);
     return m.partialPivLu().determinant();
   }
 };
 
-template<typename Derived> struct determinant_impl<Derived, 1>
-{
-  static inline EIGEN_DEVICE_FUNC
-  typename traits<Derived>::Scalar run(const Derived& m)
-  {
-    return m.coeff(0,0);
+template <typename Derived>
+struct determinant_impl<Derived, 1> {
+  static inline EIGEN_DEVICE_FUNC typename traits<Derived>::Scalar run(const Derived& m) { return m.coeff(0, 0); }
+};
+
+template <typename Derived>
+struct determinant_impl<Derived, 2> {
+  static inline EIGEN_DEVICE_FUNC typename traits<Derived>::Scalar run(const Derived& m) {
+    return m.coeff(0, 0) * m.coeff(1, 1) - m.coeff(1, 0) * m.coeff(0, 1);
   }
 };
 
-template<typename Derived> struct determinant_impl<Derived, 2>
-{
-  static inline EIGEN_DEVICE_FUNC
-  typename traits<Derived>::Scalar run(const Derived& m)
-  {
-    return m.coeff(0,0) * m.coeff(1,1) - m.coeff(1,0) * m.coeff(0,1);
+template <typename Derived>
+struct determinant_impl<Derived, 3> {
+  static inline EIGEN_DEVICE_FUNC typename traits<Derived>::Scalar run(const Derived& m) {
+    return bruteforce_det3_helper(m, 0, 1, 2) - bruteforce_det3_helper(m, 1, 0, 2) + bruteforce_det3_helper(m, 2, 0, 1);
   }
 };
 
-template<typename Derived> struct determinant_impl<Derived, 3>
-{
-  static inline EIGEN_DEVICE_FUNC
-  typename traits<Derived>::Scalar run(const Derived& m)
-  {
-    return bruteforce_det3_helper(m,0,1,2)
-          - bruteforce_det3_helper(m,1,0,2)
-          + bruteforce_det3_helper(m,2,0,1);
-  }
-};
-
-template<typename Derived> struct determinant_impl<Derived, 4>
-{
+template <typename Derived>
+struct determinant_impl<Derived, 4> {
   typedef typename traits<Derived>::Scalar Scalar;
-  static EIGEN_DEVICE_FUNC
-  Scalar run(const Derived& m)
-  {
+  static EIGEN_DEVICE_FUNC Scalar run(const Derived& m) {
     Scalar d2_01 = det2(m, 0, 1);
     Scalar d2_02 = det2(m, 0, 2);
     Scalar d2_03 = det2(m, 0, 3);
     Scalar d2_12 = det2(m, 1, 2);
     Scalar d2_13 = det2(m, 1, 3);
     Scalar d2_23 = det2(m, 2, 3);
-    Scalar d3_0 = det3(m, 1,d2_23, 2,d2_13, 3,d2_12);
-    Scalar d3_1 = det3(m, 0,d2_23, 2,d2_03, 3,d2_02);
-    Scalar d3_2 = det3(m, 0,d2_13, 1,d2_03, 3,d2_01);
-    Scalar d3_3 = det3(m, 0,d2_12, 1,d2_02, 2,d2_01);
-    return internal::pmadd(static_cast<Scalar>(-m(0,3)),d3_0, static_cast<Scalar>(m(1,3)*d3_1)) +
-           internal::pmadd(static_cast<Scalar>(-m(2,3)),d3_2, static_cast<Scalar>(m(3,3)*d3_3));
-  }
-protected:
-  static EIGEN_DEVICE_FUNC
-  Scalar det2(const Derived& m, Index i0, Index i1)
-  {
-    return m(i0,0) * m(i1,1) - m(i1,0) * m(i0,1);
+    Scalar d3_0 = det3(m, 1, d2_23, 2, d2_13, 3, d2_12);
+    Scalar d3_1 = det3(m, 0, d2_23, 2, d2_03, 3, d2_02);
+    Scalar d3_2 = det3(m, 0, d2_13, 1, d2_03, 3, d2_01);
+    Scalar d3_3 = det3(m, 0, d2_12, 1, d2_02, 2, d2_01);
+    return internal::pmadd(static_cast<Scalar>(-m(0, 3)), d3_0, static_cast<Scalar>(m(1, 3) * d3_1)) +
+           internal::pmadd(static_cast<Scalar>(-m(2, 3)), d3_2, static_cast<Scalar>(m(3, 3) * d3_3));
   }
 
-  static EIGEN_DEVICE_FUNC
-  Scalar det3(const Derived& m, Index i0, const Scalar& d0, Index i1, const Scalar& d1, Index i2, const Scalar& d2)
-  {
-    return internal::pmadd(m(i0,2), d0, internal::pmadd(static_cast<Scalar>(-m(i1,2)), d1, static_cast<Scalar>(m(i2,2)*d2)));
+ protected:
+  static EIGEN_DEVICE_FUNC Scalar det2(const Derived& m, Index i0, Index i1) {
+    return m(i0, 0) * m(i1, 1) - m(i1, 0) * m(i0, 1);
+  }
+
+  static EIGEN_DEVICE_FUNC Scalar det3(const Derived& m, Index i0, const Scalar& d0, Index i1, const Scalar& d1,
+                                       Index i2, const Scalar& d2) {
+    return internal::pmadd(m(i0, 2), d0,
+                           internal::pmadd(static_cast<Scalar>(-m(i1, 2)), d1, static_cast<Scalar>(m(i2, 2) * d2)));
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \lu_module
-  *
-  * \returns the determinant of this matrix
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC
-inline typename internal::traits<Derived>::Scalar MatrixBase<Derived>::determinant() const
-{
+ *
+ * \returns the determinant of this matrix
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC inline typename internal::traits<Derived>::Scalar MatrixBase<Derived>::determinant() const {
   eigen_assert(rows() == cols());
-  typedef typename internal::nested_eval<Derived,Base::RowsAtCompileTime>::type Nested;
+  typedef typename internal::nested_eval<Derived, Base::RowsAtCompileTime>::type Nested;
   return internal::determinant_impl<internal::remove_all_t<Nested>>::run(derived());
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_DETERMINANT_H
+#endif  // EIGEN_DETERMINANT_H
diff --git a/Eigen/src/LU/FullPivLU.h b/Eigen/src/LU/FullPivLU.h
index e3cd8cd..57d049c 100644
--- a/Eigen/src/LU/FullPivLU.h
+++ b/Eigen/src/LU/FullPivLU.h
@@ -16,479 +16,449 @@
 namespace Eigen {
 
 namespace internal {
-template<typename MatrixType_, typename PermutationIndex_> struct traits<FullPivLU<MatrixType_, PermutationIndex_> >
- : traits<MatrixType_>
-{
+template <typename MatrixType_, typename PermutationIndex_>
+struct traits<FullPivLU<MatrixType_, PermutationIndex_> > : traits<MatrixType_> {
   typedef MatrixXpr XprKind;
   typedef SolverStorage StorageKind;
   typedef PermutationIndex_ StorageIndex;
   enum { Flags = 0 };
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \ingroup LU_Module
-  *
-  * \class FullPivLU
-  *
-  * \brief LU decomposition of a matrix with complete pivoting, and related features
-  *
-  * \tparam MatrixType_ the type of the matrix of which we are computing the LU decomposition
-  *
-  * This class represents a LU decomposition of any matrix, with complete pivoting: the matrix A is
-  * decomposed as \f$ A = P^{-1} L U Q^{-1} \f$ where L is unit-lower-triangular, U is
-  * upper-triangular, and P and Q are permutation matrices. This is a rank-revealing LU
-  * decomposition. The eigenvalues (diagonal coefficients) of U are sorted in such a way that any
-  * zeros are at the end.
-  *
-  * This decomposition provides the generic approach to solving systems of linear equations, computing
-  * the rank, invertibility, inverse, kernel, and determinant.
-  *
-  * This LU decomposition is very stable and well tested with large matrices. However there are use cases where the SVD
-  * decomposition is inherently more stable and/or flexible. For example, when computing the kernel of a matrix,
-  * working with the SVD allows to select the smallest singular values of the matrix, something that
-  * the LU decomposition doesn't see.
-  *
-  * The data of the LU decomposition can be directly accessed through the methods matrixLU(),
-  * permutationP(), permutationQ().
-  *
-  * As an example, here is how the original matrix can be retrieved:
-  * \include class_FullPivLU.cpp
-  * Output: \verbinclude class_FullPivLU.out
-  *
-  * This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism.
-  *
-  * \sa MatrixBase::fullPivLu(), MatrixBase::determinant(), MatrixBase::inverse()
-  */
-template<typename MatrixType_, typename PermutationIndex_> class FullPivLU
-  : public SolverBase<FullPivLU<MatrixType_, PermutationIndex_> >
-{
-  public:
-    typedef MatrixType_ MatrixType;
-    typedef SolverBase<FullPivLU> Base;
-    friend class SolverBase<FullPivLU>;
+ *
+ * \class FullPivLU
+ *
+ * \brief LU decomposition of a matrix with complete pivoting, and related features
+ *
+ * \tparam MatrixType_ the type of the matrix of which we are computing the LU decomposition
+ *
+ * This class represents a LU decomposition of any matrix, with complete pivoting: the matrix A is
+ * decomposed as \f$ A = P^{-1} L U Q^{-1} \f$ where L is unit-lower-triangular, U is
+ * upper-triangular, and P and Q are permutation matrices. This is a rank-revealing LU
+ * decomposition. The eigenvalues (diagonal coefficients) of U are sorted in such a way that any
+ * zeros are at the end.
+ *
+ * This decomposition provides the generic approach to solving systems of linear equations, computing
+ * the rank, invertibility, inverse, kernel, and determinant.
+ *
+ * This LU decomposition is very stable and well tested with large matrices. However there are use cases where the SVD
+ * decomposition is inherently more stable and/or flexible. For example, when computing the kernel of a matrix,
+ * working with the SVD allows to select the smallest singular values of the matrix, something that
+ * the LU decomposition doesn't see.
+ *
+ * The data of the LU decomposition can be directly accessed through the methods matrixLU(),
+ * permutationP(), permutationQ().
+ *
+ * As an example, here is how the original matrix can be retrieved:
+ * \include class_FullPivLU.cpp
+ * Output: \verbinclude class_FullPivLU.out
+ *
+ * This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism.
+ *
+ * \sa MatrixBase::fullPivLu(), MatrixBase::determinant(), MatrixBase::inverse()
+ */
+template <typename MatrixType_, typename PermutationIndex_>
+class FullPivLU : public SolverBase<FullPivLU<MatrixType_, PermutationIndex_> > {
+ public:
+  typedef MatrixType_ MatrixType;
+  typedef SolverBase<FullPivLU> Base;
+  friend class SolverBase<FullPivLU>;
 
-    EIGEN_GENERIC_PUBLIC_INTERFACE(FullPivLU)
-    enum {
-      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
-      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
-    };
-    using PermutationIndex = PermutationIndex_;
-    typedef typename internal::plain_row_type<MatrixType, PermutationIndex>::type IntRowVectorType;
-    typedef typename internal::plain_col_type<MatrixType, PermutationIndex>::type IntColVectorType;
-    typedef PermutationMatrix<ColsAtCompileTime, MaxColsAtCompileTime, PermutationIndex> PermutationQType;
-    typedef PermutationMatrix<RowsAtCompileTime, MaxRowsAtCompileTime, PermutationIndex> PermutationPType;
-    typedef typename MatrixType::PlainObject PlainObject;
+  EIGEN_GENERIC_PUBLIC_INTERFACE(FullPivLU)
+  enum {
+    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
+  };
+  using PermutationIndex = PermutationIndex_;
+  typedef typename internal::plain_row_type<MatrixType, PermutationIndex>::type IntRowVectorType;
+  typedef typename internal::plain_col_type<MatrixType, PermutationIndex>::type IntColVectorType;
+  typedef PermutationMatrix<ColsAtCompileTime, MaxColsAtCompileTime, PermutationIndex> PermutationQType;
+  typedef PermutationMatrix<RowsAtCompileTime, MaxRowsAtCompileTime, PermutationIndex> PermutationPType;
+  typedef typename MatrixType::PlainObject PlainObject;
 
-    /**
-      * \brief Default Constructor.
-      *
-      * The default constructor is useful in cases in which the user intends to
-      * perform decompositions via LU::compute(const MatrixType&).
-      */
-    FullPivLU();
+  /**
+   * \brief Default Constructor.
+   *
+   * The default constructor is useful in cases in which the user intends to
+   * perform decompositions via LU::compute(const MatrixType&).
+   */
+  FullPivLU();
 
-    /** \brief Default Constructor with memory preallocation
-      *
-      * Like the default constructor but with preallocation of the internal data
-      * according to the specified problem \a size.
-      * \sa FullPivLU()
-      */
-    FullPivLU(Index rows, Index cols);
+  /** \brief Default Constructor with memory preallocation
+   *
+   * Like the default constructor but with preallocation of the internal data
+   * according to the specified problem \a size.
+   * \sa FullPivLU()
+   */
+  FullPivLU(Index rows, Index cols);
 
-    /** Constructor.
-      *
-      * \param matrix the matrix of which to compute the LU decomposition.
-      *               It is required to be nonzero.
-      */
-    template<typename InputType>
-    explicit FullPivLU(const EigenBase<InputType>& matrix);
+  /** Constructor.
+   *
+   * \param matrix the matrix of which to compute the LU decomposition.
+   *               It is required to be nonzero.
+   */
+  template <typename InputType>
+  explicit FullPivLU(const EigenBase<InputType>& matrix);
 
-    /** \brief Constructs a LU factorization from a given matrix
-      *
-      * This overloaded constructor is provided for \link InplaceDecomposition inplace decomposition \endlink when \c MatrixType is a Eigen::Ref.
-      *
-      * \sa FullPivLU(const EigenBase&)
-      */
-    template<typename InputType>
-    explicit FullPivLU(EigenBase<InputType>& matrix);
+  /** \brief Constructs a LU factorization from a given matrix
+   *
+   * This overloaded constructor is provided for \link InplaceDecomposition inplace decomposition \endlink when \c
+   * MatrixType is a Eigen::Ref.
+   *
+   * \sa FullPivLU(const EigenBase&)
+   */
+  template <typename InputType>
+  explicit FullPivLU(EigenBase<InputType>& matrix);
 
-    /** Computes the LU decomposition of the given matrix.
-      *
-      * \param matrix the matrix of which to compute the LU decomposition.
-      *               It is required to be nonzero.
-      *
-      * \returns a reference to *this
-      */
-    template<typename InputType>
-    FullPivLU& compute(const EigenBase<InputType>& matrix) {
-      m_lu = matrix.derived();
-      computeInPlace();
-      return *this;
-    }
+  /** Computes the LU decomposition of the given matrix.
+   *
+   * \param matrix the matrix of which to compute the LU decomposition.
+   *               It is required to be nonzero.
+   *
+   * \returns a reference to *this
+   */
+  template <typename InputType>
+  FullPivLU& compute(const EigenBase<InputType>& matrix) {
+    m_lu = matrix.derived();
+    computeInPlace();
+    return *this;
+  }
 
-    /** \returns the LU decomposition matrix: the upper-triangular part is U, the
-      * unit-lower-triangular part is L (at least for square matrices; in the non-square
-      * case, special care is needed, see the documentation of class FullPivLU).
-      *
-      * \sa matrixL(), matrixU()
-      */
-    inline const MatrixType& matrixLU() const
-    {
-      eigen_assert(m_isInitialized && "LU is not initialized.");
-      return m_lu;
-    }
+  /** \returns the LU decomposition matrix: the upper-triangular part is U, the
+   * unit-lower-triangular part is L (at least for square matrices; in the non-square
+   * case, special care is needed, see the documentation of class FullPivLU).
+   *
+   * \sa matrixL(), matrixU()
+   */
+  inline const MatrixType& matrixLU() const {
+    eigen_assert(m_isInitialized && "LU is not initialized.");
+    return m_lu;
+  }
 
-    /** \returns the number of nonzero pivots in the LU decomposition.
-      * Here nonzero is meant in the exact sense, not in a fuzzy sense.
-      * So that notion isn't really intrinsically interesting, but it is
-      * still useful when implementing algorithms.
-      *
-      * \sa rank()
-      */
-    inline Index nonzeroPivots() const
-    {
-      eigen_assert(m_isInitialized && "LU is not initialized.");
-      return m_nonzero_pivots;
-    }
+  /** \returns the number of nonzero pivots in the LU decomposition.
+   * Here nonzero is meant in the exact sense, not in a fuzzy sense.
+   * So that notion isn't really intrinsically interesting, but it is
+   * still useful when implementing algorithms.
+   *
+   * \sa rank()
+   */
+  inline Index nonzeroPivots() const {
+    eigen_assert(m_isInitialized && "LU is not initialized.");
+    return m_nonzero_pivots;
+  }
 
-    /** \returns the absolute value of the biggest pivot, i.e. the biggest
-      *          diagonal coefficient of U.
-      */
-    RealScalar maxPivot() const { return m_maxpivot; }
+  /** \returns the absolute value of the biggest pivot, i.e. the biggest
+   *          diagonal coefficient of U.
+   */
+  RealScalar maxPivot() const { return m_maxpivot; }
 
-    /** \returns the permutation matrix P
-      *
-      * \sa permutationQ()
-      */
-    EIGEN_DEVICE_FUNC inline const PermutationPType& permutationP() const
-    {
-      eigen_assert(m_isInitialized && "LU is not initialized.");
-      return m_p;
-    }
+  /** \returns the permutation matrix P
+   *
+   * \sa permutationQ()
+   */
+  EIGEN_DEVICE_FUNC inline const PermutationPType& permutationP() const {
+    eigen_assert(m_isInitialized && "LU is not initialized.");
+    return m_p;
+  }
 
-    /** \returns the permutation matrix Q
-      *
-      * \sa permutationP()
-      */
-    inline const PermutationQType& permutationQ() const
-    {
-      eigen_assert(m_isInitialized && "LU is not initialized.");
-      return m_q;
-    }
+  /** \returns the permutation matrix Q
+   *
+   * \sa permutationP()
+   */
+  inline const PermutationQType& permutationQ() const {
+    eigen_assert(m_isInitialized && "LU is not initialized.");
+    return m_q;
+  }
 
-    /** \returns the kernel of the matrix, also called its null-space. The columns of the returned matrix
-      * will form a basis of the kernel.
-      *
-      * \note If the kernel has dimension zero, then the returned matrix is a column-vector filled with zeros.
-      *
-      * \note This method has to determine which pivots should be considered nonzero.
-      *       For that, it uses the threshold value that you can control by calling
-      *       setThreshold(const RealScalar&).
-      *
-      * Example: \include FullPivLU_kernel.cpp
-      * Output: \verbinclude FullPivLU_kernel.out
-      *
-      * \sa image()
-      */
-    inline const internal::kernel_retval<FullPivLU> kernel() const
-    {
-      eigen_assert(m_isInitialized && "LU is not initialized.");
-      return internal::kernel_retval<FullPivLU>(*this);
-    }
+  /** \returns the kernel of the matrix, also called its null-space. The columns of the returned matrix
+   * will form a basis of the kernel.
+   *
+   * \note If the kernel has dimension zero, then the returned matrix is a column-vector filled with zeros.
+   *
+   * \note This method has to determine which pivots should be considered nonzero.
+   *       For that, it uses the threshold value that you can control by calling
+   *       setThreshold(const RealScalar&).
+   *
+   * Example: \include FullPivLU_kernel.cpp
+   * Output: \verbinclude FullPivLU_kernel.out
+   *
+   * \sa image()
+   */
+  inline const internal::kernel_retval<FullPivLU> kernel() const {
+    eigen_assert(m_isInitialized && "LU is not initialized.");
+    return internal::kernel_retval<FullPivLU>(*this);
+  }
 
-    /** \returns the image of the matrix, also called its column-space. The columns of the returned matrix
-      * will form a basis of the image (column-space).
-      *
-      * \param originalMatrix the original matrix, of which *this is the LU decomposition.
-      *                       The reason why it is needed to pass it here, is that this allows
-      *                       a large optimization, as otherwise this method would need to reconstruct it
-      *                       from the LU decomposition.
-      *
-      * \note If the image has dimension zero, then the returned matrix is a column-vector filled with zeros.
-      *
-      * \note This method has to determine which pivots should be considered nonzero.
-      *       For that, it uses the threshold value that you can control by calling
-      *       setThreshold(const RealScalar&).
-      *
-      * Example: \include FullPivLU_image.cpp
-      * Output: \verbinclude FullPivLU_image.out
-      *
-      * \sa kernel()
-      */
-    inline const internal::image_retval<FullPivLU>
-      image(const MatrixType& originalMatrix) const
-    {
-      eigen_assert(m_isInitialized && "LU is not initialized.");
-      return internal::image_retval<FullPivLU>(*this, originalMatrix);
-    }
+  /** \returns the image of the matrix, also called its column-space. The columns of the returned matrix
+   * will form a basis of the image (column-space).
+   *
+   * \param originalMatrix the original matrix, of which *this is the LU decomposition.
+   *                       The reason why it is needed to pass it here, is that this allows
+   *                       a large optimization, as otherwise this method would need to reconstruct it
+   *                       from the LU decomposition.
+   *
+   * \note If the image has dimension zero, then the returned matrix is a column-vector filled with zeros.
+   *
+   * \note This method has to determine which pivots should be considered nonzero.
+   *       For that, it uses the threshold value that you can control by calling
+   *       setThreshold(const RealScalar&).
+   *
+   * Example: \include FullPivLU_image.cpp
+   * Output: \verbinclude FullPivLU_image.out
+   *
+   * \sa kernel()
+   */
+  inline const internal::image_retval<FullPivLU> image(const MatrixType& originalMatrix) const {
+    eigen_assert(m_isInitialized && "LU is not initialized.");
+    return internal::image_retval<FullPivLU>(*this, originalMatrix);
+  }
 
-    #ifdef EIGEN_PARSED_BY_DOXYGEN
-    /** \return a solution x to the equation Ax=b, where A is the matrix of which
-      * *this is the LU decomposition.
-      *
-      * \param b the right-hand-side of the equation to solve. Can be a vector or a matrix,
-      *          the only requirement in order for the equation to make sense is that
-      *          b.rows()==A.rows(), where A is the matrix of which *this is the LU decomposition.
-      *
-      * \returns a solution.
-      *
-      * \note_about_checking_solutions
-      *
-      * \note_about_arbitrary_choice_of_solution
-      * \note_about_using_kernel_to_study_multiple_solutions
-      *
-      * Example: \include FullPivLU_solve.cpp
-      * Output: \verbinclude FullPivLU_solve.out
-      *
-      * \sa TriangularView::solve(), kernel(), inverse()
-      */
-    template<typename Rhs>
-    inline const Solve<FullPivLU, Rhs>
-    solve(const MatrixBase<Rhs>& b) const;
-    #endif
+#ifdef EIGEN_PARSED_BY_DOXYGEN
+  /** \return a solution x to the equation Ax=b, where A is the matrix of which
+   * *this is the LU decomposition.
+   *
+   * \param b the right-hand-side of the equation to solve. Can be a vector or a matrix,
+   *          the only requirement in order for the equation to make sense is that
+   *          b.rows()==A.rows(), where A is the matrix of which *this is the LU decomposition.
+   *
+   * \returns a solution.
+   *
+   * \note_about_checking_solutions
+   *
+   * \note_about_arbitrary_choice_of_solution
+   * \note_about_using_kernel_to_study_multiple_solutions
+   *
+   * Example: \include FullPivLU_solve.cpp
+   * Output: \verbinclude FullPivLU_solve.out
+   *
+   * \sa TriangularView::solve(), kernel(), inverse()
+   */
+  template <typename Rhs>
+  inline const Solve<FullPivLU, Rhs> solve(const MatrixBase<Rhs>& b) const;
+#endif
 
-    /** \returns an estimate of the reciprocal condition number of the matrix of which \c *this is
-        the LU decomposition.
-      */
-    inline RealScalar rcond() const
-    {
-      eigen_assert(m_isInitialized && "PartialPivLU is not initialized.");
-      return internal::rcond_estimate_helper(m_l1_norm, *this);
-    }
+  /** \returns an estimate of the reciprocal condition number of the matrix of which \c *this is
+      the LU decomposition.
+    */
+  inline RealScalar rcond() const {
+    eigen_assert(m_isInitialized && "PartialPivLU is not initialized.");
+    return internal::rcond_estimate_helper(m_l1_norm, *this);
+  }
 
-    /** \returns the determinant of the matrix of which
-      * *this is the LU decomposition. It has only linear complexity
-      * (that is, O(n) where n is the dimension of the square matrix)
-      * as the LU decomposition has already been computed.
-      *
-      * \note This is only for square matrices.
-      *
-      * \note For fixed-size matrices of size up to 4, MatrixBase::determinant() offers
-      *       optimized paths.
-      *
-      * \warning a determinant can be very big or small, so for matrices
-      * of large enough dimension, there is a risk of overflow/underflow.
-      *
-      * \sa MatrixBase::determinant()
-      */
-    typename internal::traits<MatrixType>::Scalar determinant() const;
+  /** \returns the determinant of the matrix of which
+   * *this is the LU decomposition. It has only linear complexity
+   * (that is, O(n) where n is the dimension of the square matrix)
+   * as the LU decomposition has already been computed.
+   *
+   * \note This is only for square matrices.
+   *
+   * \note For fixed-size matrices of size up to 4, MatrixBase::determinant() offers
+   *       optimized paths.
+   *
+   * \warning a determinant can be very big or small, so for matrices
+   * of large enough dimension, there is a risk of overflow/underflow.
+   *
+   * \sa MatrixBase::determinant()
+   */
+  typename internal::traits<MatrixType>::Scalar determinant() const;
 
-    /** Allows to prescribe a threshold to be used by certain methods, such as rank(),
-      * who need to determine when pivots are to be considered nonzero. This is not used for the
-      * LU decomposition itself.
-      *
-      * When it needs to get the threshold value, Eigen calls threshold(). By default, this
-      * uses a formula to automatically determine a reasonable threshold.
-      * Once you have called the present method setThreshold(const RealScalar&),
-      * your value is used instead.
-      *
-      * \param threshold The new value to use as the threshold.
-      *
-      * A pivot will be considered nonzero if its absolute value is strictly greater than
-      *  \f$ \vert pivot \vert \leqslant threshold \times \vert maxpivot \vert \f$
-      * where maxpivot is the biggest pivot.
-      *
-      * If you want to come back to the default behavior, call setThreshold(Default_t)
-      */
-    FullPivLU& setThreshold(const RealScalar& threshold)
-    {
-      m_usePrescribedThreshold = true;
-      m_prescribedThreshold = threshold;
-      return *this;
-    }
+  /** Allows to prescribe a threshold to be used by certain methods, such as rank(),
+   * who need to determine when pivots are to be considered nonzero. This is not used for the
+   * LU decomposition itself.
+   *
+   * When it needs to get the threshold value, Eigen calls threshold(). By default, this
+   * uses a formula to automatically determine a reasonable threshold.
+   * Once you have called the present method setThreshold(const RealScalar&),
+   * your value is used instead.
+   *
+   * \param threshold The new value to use as the threshold.
+   *
+   * A pivot will be considered nonzero if its absolute value is strictly greater than
+   *  \f$ \vert pivot \vert \leqslant threshold \times \vert maxpivot \vert \f$
+   * where maxpivot is the biggest pivot.
+   *
+   * If you want to come back to the default behavior, call setThreshold(Default_t)
+   */
+  FullPivLU& setThreshold(const RealScalar& threshold) {
+    m_usePrescribedThreshold = true;
+    m_prescribedThreshold = threshold;
+    return *this;
+  }
 
-    /** Allows to come back to the default behavior, letting Eigen use its default formula for
-      * determining the threshold.
-      *
-      * You should pass the special object Eigen::Default as parameter here.
-      * \code lu.setThreshold(Eigen::Default); \endcode
-      *
-      * See the documentation of setThreshold(const RealScalar&).
-      */
-    FullPivLU& setThreshold(Default_t)
-    {
-      m_usePrescribedThreshold = false;
-      return *this;
-    }
+  /** Allows to come back to the default behavior, letting Eigen use its default formula for
+   * determining the threshold.
+   *
+   * You should pass the special object Eigen::Default as parameter here.
+   * \code lu.setThreshold(Eigen::Default); \endcode
+   *
+   * See the documentation of setThreshold(const RealScalar&).
+   */
+  FullPivLU& setThreshold(Default_t) {
+    m_usePrescribedThreshold = false;
+    return *this;
+  }
 
-    /** Returns the threshold that will be used by certain methods such as rank().
-      *
-      * See the documentation of setThreshold(const RealScalar&).
-      */
-    RealScalar threshold() const
-    {
-      eigen_assert(m_isInitialized || m_usePrescribedThreshold);
-      return m_usePrescribedThreshold ? m_prescribedThreshold
-      // this formula comes from experimenting (see "LU precision tuning" thread on the list)
-      // and turns out to be identical to Higham's formula used already in LDLt.
-          : NumTraits<Scalar>::epsilon() * RealScalar(m_lu.diagonalSize());
-    }
+  /** Returns the threshold that will be used by certain methods such as rank().
+   *
+   * See the documentation of setThreshold(const RealScalar&).
+   */
+  RealScalar threshold() const {
+    eigen_assert(m_isInitialized || m_usePrescribedThreshold);
+    return m_usePrescribedThreshold ? m_prescribedThreshold
+                                    // this formula comes from experimenting (see "LU precision tuning" thread on the
+                                    // list) and turns out to be identical to Higham's formula used already in LDLt.
+                                    : NumTraits<Scalar>::epsilon() * RealScalar(m_lu.diagonalSize());
+  }
 
-    /** \returns the rank of the matrix of which *this is the LU decomposition.
-      *
-      * \note This method has to determine which pivots should be considered nonzero.
-      *       For that, it uses the threshold value that you can control by calling
-      *       setThreshold(const RealScalar&).
-      */
-    inline Index rank() const
-    {
-      using std::abs;
-      eigen_assert(m_isInitialized && "LU is not initialized.");
-      RealScalar premultiplied_threshold = abs(m_maxpivot) * threshold();
-      Index result = 0;
-      for(Index i = 0; i < m_nonzero_pivots; ++i)
-        result += (abs(m_lu.coeff(i,i)) > premultiplied_threshold);
-      return result;
-    }
+  /** \returns the rank of the matrix of which *this is the LU decomposition.
+   *
+   * \note This method has to determine which pivots should be considered nonzero.
+   *       For that, it uses the threshold value that you can control by calling
+   *       setThreshold(const RealScalar&).
+   */
+  inline Index rank() const {
+    using std::abs;
+    eigen_assert(m_isInitialized && "LU is not initialized.");
+    RealScalar premultiplied_threshold = abs(m_maxpivot) * threshold();
+    Index result = 0;
+    for (Index i = 0; i < m_nonzero_pivots; ++i) result += (abs(m_lu.coeff(i, i)) > premultiplied_threshold);
+    return result;
+  }
 
-    /** \returns the dimension of the kernel of the matrix of which *this is the LU decomposition.
-      *
-      * \note This method has to determine which pivots should be considered nonzero.
-      *       For that, it uses the threshold value that you can control by calling
-      *       setThreshold(const RealScalar&).
-      */
-    inline Index dimensionOfKernel() const
-    {
-      eigen_assert(m_isInitialized && "LU is not initialized.");
-      return cols() - rank();
-    }
+  /** \returns the dimension of the kernel of the matrix of which *this is the LU decomposition.
+   *
+   * \note This method has to determine which pivots should be considered nonzero.
+   *       For that, it uses the threshold value that you can control by calling
+   *       setThreshold(const RealScalar&).
+   */
+  inline Index dimensionOfKernel() const {
+    eigen_assert(m_isInitialized && "LU is not initialized.");
+    return cols() - rank();
+  }
 
-    /** \returns true if the matrix of which *this is the LU decomposition represents an injective
-      *          linear map, i.e. has trivial kernel; false otherwise.
-      *
-      * \note This method has to determine which pivots should be considered nonzero.
-      *       For that, it uses the threshold value that you can control by calling
-      *       setThreshold(const RealScalar&).
-      */
-    inline bool isInjective() const
-    {
-      eigen_assert(m_isInitialized && "LU is not initialized.");
-      return rank() == cols();
-    }
+  /** \returns true if the matrix of which *this is the LU decomposition represents an injective
+   *          linear map, i.e. has trivial kernel; false otherwise.
+   *
+   * \note This method has to determine which pivots should be considered nonzero.
+   *       For that, it uses the threshold value that you can control by calling
+   *       setThreshold(const RealScalar&).
+   */
+  inline bool isInjective() const {
+    eigen_assert(m_isInitialized && "LU is not initialized.");
+    return rank() == cols();
+  }
 
-    /** \returns true if the matrix of which *this is the LU decomposition represents a surjective
-      *          linear map; false otherwise.
-      *
-      * \note This method has to determine which pivots should be considered nonzero.
-      *       For that, it uses the threshold value that you can control by calling
-      *       setThreshold(const RealScalar&).
-      */
-    inline bool isSurjective() const
-    {
-      eigen_assert(m_isInitialized && "LU is not initialized.");
-      return rank() == rows();
-    }
+  /** \returns true if the matrix of which *this is the LU decomposition represents a surjective
+   *          linear map; false otherwise.
+   *
+   * \note This method has to determine which pivots should be considered nonzero.
+   *       For that, it uses the threshold value that you can control by calling
+   *       setThreshold(const RealScalar&).
+   */
+  inline bool isSurjective() const {
+    eigen_assert(m_isInitialized && "LU is not initialized.");
+    return rank() == rows();
+  }
 
-    /** \returns true if the matrix of which *this is the LU decomposition is invertible.
-      *
-      * \note This method has to determine which pivots should be considered nonzero.
-      *       For that, it uses the threshold value that you can control by calling
-      *       setThreshold(const RealScalar&).
-      */
-    inline bool isInvertible() const
-    {
-      eigen_assert(m_isInitialized && "LU is not initialized.");
-      return isInjective() && (m_lu.rows() == m_lu.cols());
-    }
+  /** \returns true if the matrix of which *this is the LU decomposition is invertible.
+   *
+   * \note This method has to determine which pivots should be considered nonzero.
+   *       For that, it uses the threshold value that you can control by calling
+   *       setThreshold(const RealScalar&).
+   */
+  inline bool isInvertible() const {
+    eigen_assert(m_isInitialized && "LU is not initialized.");
+    return isInjective() && (m_lu.rows() == m_lu.cols());
+  }
 
-    /** \returns the inverse of the matrix of which *this is the LU decomposition.
-      *
-      * \note If this matrix is not invertible, the returned matrix has undefined coefficients.
-      *       Use isInvertible() to first determine whether this matrix is invertible.
-      *
-      * \sa MatrixBase::inverse()
-      */
-    inline const Inverse<FullPivLU> inverse() const
-    {
-      eigen_assert(m_isInitialized && "LU is not initialized.");
-      eigen_assert(m_lu.rows() == m_lu.cols() && "You can't take the inverse of a non-square matrix!");
-      return Inverse<FullPivLU>(*this);
-    }
+  /** \returns the inverse of the matrix of which *this is the LU decomposition.
+   *
+   * \note If this matrix is not invertible, the returned matrix has undefined coefficients.
+   *       Use isInvertible() to first determine whether this matrix is invertible.
+   *
+   * \sa MatrixBase::inverse()
+   */
+  inline const Inverse<FullPivLU> inverse() const {
+    eigen_assert(m_isInitialized && "LU is not initialized.");
+    eigen_assert(m_lu.rows() == m_lu.cols() && "You can't take the inverse of a non-square matrix!");
+    return Inverse<FullPivLU>(*this);
+  }
 
-    MatrixType reconstructedMatrix() const;
+  MatrixType reconstructedMatrix() const;
 
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index rows() const EIGEN_NOEXCEPT { return m_lu.rows(); }
-    EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
-    inline Index cols() const EIGEN_NOEXCEPT { return m_lu.cols(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index rows() const EIGEN_NOEXCEPT { return m_lu.rows(); }
+  EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR inline Index cols() const EIGEN_NOEXCEPT { return m_lu.cols(); }
 
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    template<typename RhsType, typename DstType>
-    void _solve_impl(const RhsType &rhs, DstType &dst) const;
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  template <typename RhsType, typename DstType>
+  void _solve_impl(const RhsType& rhs, DstType& dst) const;
 
-    template<bool Conjugate, typename RhsType, typename DstType>
-    void _solve_impl_transposed(const RhsType &rhs, DstType &dst) const;
-    #endif
+  template <bool Conjugate, typename RhsType, typename DstType>
+  void _solve_impl_transposed(const RhsType& rhs, DstType& dst) const;
+#endif
 
-  protected:
+ protected:
+  EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
 
-    EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
+  void computeInPlace();
 
-    void computeInPlace();
-
-    MatrixType m_lu;
-    PermutationPType m_p;
-    PermutationQType m_q;
-    IntColVectorType m_rowsTranspositions;
-    IntRowVectorType m_colsTranspositions;
-    Index m_nonzero_pivots;
-    RealScalar m_l1_norm;
-    RealScalar m_maxpivot, m_prescribedThreshold;
-    signed char m_det_pq;
-    bool m_isInitialized, m_usePrescribedThreshold;
+  MatrixType m_lu;
+  PermutationPType m_p;
+  PermutationQType m_q;
+  IntColVectorType m_rowsTranspositions;
+  IntRowVectorType m_colsTranspositions;
+  Index m_nonzero_pivots;
+  RealScalar m_l1_norm;
+  RealScalar m_maxpivot, m_prescribedThreshold;
+  signed char m_det_pq;
+  bool m_isInitialized, m_usePrescribedThreshold;
 };
 
-template<typename MatrixType, typename PermutationIndex>
-FullPivLU<MatrixType, PermutationIndex>::FullPivLU()
-  : m_isInitialized(false), m_usePrescribedThreshold(false)
-{
-}
+template <typename MatrixType, typename PermutationIndex>
+FullPivLU<MatrixType, PermutationIndex>::FullPivLU() : m_isInitialized(false), m_usePrescribedThreshold(false) {}
 
-template<typename MatrixType, typename PermutationIndex>
+template <typename MatrixType, typename PermutationIndex>
 FullPivLU<MatrixType, PermutationIndex>::FullPivLU(Index rows, Index cols)
-  : m_lu(rows, cols),
-    m_p(rows),
-    m_q(cols),
-    m_rowsTranspositions(rows),
-    m_colsTranspositions(cols),
-    m_isInitialized(false),
-    m_usePrescribedThreshold(false)
-{
-}
+    : m_lu(rows, cols),
+      m_p(rows),
+      m_q(cols),
+      m_rowsTranspositions(rows),
+      m_colsTranspositions(cols),
+      m_isInitialized(false),
+      m_usePrescribedThreshold(false) {}
 
-template<typename MatrixType, typename PermutationIndex>
-template<typename InputType>
+template <typename MatrixType, typename PermutationIndex>
+template <typename InputType>
 FullPivLU<MatrixType, PermutationIndex>::FullPivLU(const EigenBase<InputType>& matrix)
-  : m_lu(matrix.rows(), matrix.cols()),
-    m_p(matrix.rows()),
-    m_q(matrix.cols()),
-    m_rowsTranspositions(matrix.rows()),
-    m_colsTranspositions(matrix.cols()),
-    m_isInitialized(false),
-    m_usePrescribedThreshold(false)
-{
+    : m_lu(matrix.rows(), matrix.cols()),
+      m_p(matrix.rows()),
+      m_q(matrix.cols()),
+      m_rowsTranspositions(matrix.rows()),
+      m_colsTranspositions(matrix.cols()),
+      m_isInitialized(false),
+      m_usePrescribedThreshold(false) {
   compute(matrix.derived());
 }
 
-template<typename MatrixType, typename PermutationIndex>
-template<typename InputType>
+template <typename MatrixType, typename PermutationIndex>
+template <typename InputType>
 FullPivLU<MatrixType, PermutationIndex>::FullPivLU(EigenBase<InputType>& matrix)
-  : m_lu(matrix.derived()),
-    m_p(matrix.rows()),
-    m_q(matrix.cols()),
-    m_rowsTranspositions(matrix.rows()),
-    m_colsTranspositions(matrix.cols()),
-    m_isInitialized(false),
-    m_usePrescribedThreshold(false)
-{
+    : m_lu(matrix.derived()),
+      m_p(matrix.rows()),
+      m_q(matrix.cols()),
+      m_rowsTranspositions(matrix.rows()),
+      m_colsTranspositions(matrix.cols()),
+      m_isInitialized(false),
+      m_usePrescribedThreshold(false) {
   computeInPlace();
 }
 
-template<typename MatrixType, typename PermutationIndex>
-void FullPivLU<MatrixType, PermutationIndex>::computeInPlace()
-{
-  eigen_assert(m_lu.rows()<=NumTraits<PermutationIndex>::highest() && m_lu.cols()<=NumTraits<PermutationIndex>::highest());
+template <typename MatrixType, typename PermutationIndex>
+void FullPivLU<MatrixType, PermutationIndex>::computeInPlace() {
+  eigen_assert(m_lu.rows() <= NumTraits<PermutationIndex>::highest() &&
+               m_lu.cols() <= NumTraits<PermutationIndex>::highest());
 
   m_l1_norm = m_lu.cwiseAbs().colwise().sum().maxCoeff();
 
@@ -500,13 +470,12 @@
   // can't accumulate on-the-fly because that will be done in reverse order for the rows.
   m_rowsTranspositions.resize(m_lu.rows());
   m_colsTranspositions.resize(m_lu.cols());
-  Index number_of_transpositions = 0; // number of NONTRIVIAL transpositions, i.e. m_rowsTranspositions[i]!=i
+  Index number_of_transpositions = 0;  // number of NONTRIVIAL transpositions, i.e. m_rowsTranspositions[i]!=i
 
-  m_nonzero_pivots = size; // the generic case is that in which all pivots are nonzero (invertible case)
+  m_nonzero_pivots = size;  // the generic case is that in which all pivots are nonzero (invertible case)
   m_maxpivot = RealScalar(0);
 
-  for(Index k = 0; k < size; ++k)
-  {
+  for (Index k = 0; k < size; ++k) {
     // First, we need to find the pivot.
 
     // biggest coefficient in the remaining bottom-right corner (starting at row k, col k)
@@ -514,38 +483,37 @@
     typedef internal::scalar_score_coeff_op<Scalar> Scoring;
     typedef typename Scoring::result_type Score;
     Score biggest_in_corner;
-    biggest_in_corner = m_lu.bottomRightCorner(rows-k, cols-k)
-                        .unaryExpr(Scoring())
-                        .maxCoeff(&row_of_biggest_in_corner, &col_of_biggest_in_corner);
-    row_of_biggest_in_corner += k; // correct the values! since they were computed in the corner,
-    col_of_biggest_in_corner += k; // need to add k to them.
+    biggest_in_corner = m_lu.bottomRightCorner(rows - k, cols - k)
+                            .unaryExpr(Scoring())
+                            .maxCoeff(&row_of_biggest_in_corner, &col_of_biggest_in_corner);
+    row_of_biggest_in_corner += k;  // correct the values! since they were computed in the corner,
+    col_of_biggest_in_corner += k;  // need to add k to them.
 
-    if(numext::is_exactly_zero(biggest_in_corner))
-    {
+    if (numext::is_exactly_zero(biggest_in_corner)) {
       // before exiting, make sure to initialize the still uninitialized transpositions
       // in a sane state without destroying what we already have.
       m_nonzero_pivots = k;
-      for(Index i = k; i < size; ++i)
-      {
+      for (Index i = k; i < size; ++i) {
         m_rowsTranspositions.coeffRef(i) = internal::convert_index<StorageIndex>(i);
         m_colsTranspositions.coeffRef(i) = internal::convert_index<StorageIndex>(i);
       }
       break;
     }
 
-    RealScalar abs_pivot = internal::abs_knowing_score<Scalar>()(m_lu(row_of_biggest_in_corner, col_of_biggest_in_corner), biggest_in_corner);
-    if(abs_pivot > m_maxpivot) m_maxpivot = abs_pivot;
+    RealScalar abs_pivot = internal::abs_knowing_score<Scalar>()(
+        m_lu(row_of_biggest_in_corner, col_of_biggest_in_corner), biggest_in_corner);
+    if (abs_pivot > m_maxpivot) m_maxpivot = abs_pivot;
 
     // Now that we've found the pivot, we need to apply the row/col swaps to
     // bring it to the location (k,k).
 
     m_rowsTranspositions.coeffRef(k) = internal::convert_index<StorageIndex>(row_of_biggest_in_corner);
     m_colsTranspositions.coeffRef(k) = internal::convert_index<StorageIndex>(col_of_biggest_in_corner);
-    if(k != row_of_biggest_in_corner) {
+    if (k != row_of_biggest_in_corner) {
       m_lu.row(k).swap(m_lu.row(row_of_biggest_in_corner));
       ++number_of_transpositions;
     }
-    if(k != col_of_biggest_in_corner) {
+    if (k != col_of_biggest_in_corner) {
       m_lu.col(k).swap(m_lu.col(col_of_biggest_in_corner));
       ++number_of_transpositions;
     }
@@ -553,31 +521,28 @@
     // Now that the pivot is at the right location, we update the remaining
     // bottom-right corner by Gaussian elimination.
 
-    if(k<rows-1)
-      m_lu.col(k).tail(rows-k-1) /= m_lu.coeff(k,k);
-    if(k<size-1)
-      m_lu.block(k+1,k+1,rows-k-1,cols-k-1).noalias() -= m_lu.col(k).tail(rows-k-1) * m_lu.row(k).tail(cols-k-1);
+    if (k < rows - 1) m_lu.col(k).tail(rows - k - 1) /= m_lu.coeff(k, k);
+    if (k < size - 1)
+      m_lu.block(k + 1, k + 1, rows - k - 1, cols - k - 1).noalias() -=
+          m_lu.col(k).tail(rows - k - 1) * m_lu.row(k).tail(cols - k - 1);
   }
 
   // the main loop is over, we still have to accumulate the transpositions to find the
   // permutations P and Q
 
   m_p.setIdentity(rows);
-  for(Index k = size-1; k >= 0; --k)
-    m_p.applyTranspositionOnTheRight(k, m_rowsTranspositions.coeff(k));
+  for (Index k = size - 1; k >= 0; --k) m_p.applyTranspositionOnTheRight(k, m_rowsTranspositions.coeff(k));
 
   m_q.setIdentity(cols);
-  for(Index k = 0; k < size; ++k)
-    m_q.applyTranspositionOnTheRight(k, m_colsTranspositions.coeff(k));
+  for (Index k = 0; k < size; ++k) m_q.applyTranspositionOnTheRight(k, m_colsTranspositions.coeff(k));
 
-  m_det_pq = (number_of_transpositions%2) ? -1 : 1;
+  m_det_pq = (number_of_transpositions % 2) ? -1 : 1;
 
   m_isInitialized = true;
 }
 
-template<typename MatrixType, typename PermutationIndex>
-typename internal::traits<MatrixType>::Scalar FullPivLU<MatrixType, PermutationIndex>::determinant() const
-{
+template <typename MatrixType, typename PermutationIndex>
+typename internal::traits<MatrixType>::Scalar FullPivLU<MatrixType, PermutationIndex>::determinant() const {
   eigen_assert(m_isInitialized && "LU is not initialized.");
   eigen_assert(m_lu.rows() == m_lu.cols() && "You can't take the determinant of a non-square matrix!");
   return Scalar(m_det_pq) * Scalar(m_lu.diagonal().prod());
@@ -586,18 +551,15 @@
 /** \returns the matrix represented by the decomposition,
  * i.e., it returns the product: \f$ P^{-1} L U Q^{-1} \f$.
  * This function is provided for debug purposes. */
-template<typename MatrixType, typename PermutationIndex>
-MatrixType FullPivLU<MatrixType, PermutationIndex>::reconstructedMatrix() const
-{
+template <typename MatrixType, typename PermutationIndex>
+MatrixType FullPivLU<MatrixType, PermutationIndex>::reconstructedMatrix() const {
   eigen_assert(m_isInitialized && "LU is not initialized.");
   const Index smalldim = (std::min)(m_lu.rows(), m_lu.cols());
   // LU
-  MatrixType res(m_lu.rows(),m_lu.cols());
+  MatrixType res(m_lu.rows(), m_lu.cols());
   // FIXME the .toDenseMatrix() should not be needed...
-  res = m_lu.leftCols(smalldim)
-            .template triangularView<UnitLower>().toDenseMatrix()
-      * m_lu.topRows(smalldim)
-            .template triangularView<Upper>().toDenseMatrix();
+  res = m_lu.leftCols(smalldim).template triangularView<UnitLower>().toDenseMatrix() *
+        m_lu.topRows(smalldim).template triangularView<Upper>().toDenseMatrix();
 
   // P^{-1}(LU)
   res = m_p.inverse() * res;
@@ -611,24 +573,21 @@
 /********* Implementation of kernel() **************************************************/
 
 namespace internal {
-template<typename MatrixType_, typename PermutationIndex_>
+template <typename MatrixType_, typename PermutationIndex_>
 struct kernel_retval<FullPivLU<MatrixType_, PermutationIndex_> >
-  : kernel_retval_base<FullPivLU<MatrixType_, PermutationIndex_> >
-{
+    : kernel_retval_base<FullPivLU<MatrixType_, PermutationIndex_> > {
   using DecompositionType = FullPivLU<MatrixType_, PermutationIndex_>;
   EIGEN_MAKE_KERNEL_HELPERS(DecompositionType)
 
-  enum { MaxSmallDimAtCompileTime = min_size_prefer_fixed(
-              MatrixType::MaxColsAtCompileTime,
-              MatrixType::MaxRowsAtCompileTime)
+  enum {
+    MaxSmallDimAtCompileTime = min_size_prefer_fixed(MatrixType::MaxColsAtCompileTime, MatrixType::MaxRowsAtCompileTime)
   };
 
-  template<typename Dest> void evalTo(Dest& dst) const
-  {
+  template <typename Dest>
+  void evalTo(Dest& dst) const {
     using std::abs;
     const Index cols = dec().matrixLU().cols(), dimker = cols - rank();
-    if(dimker == 0)
-    {
+    if (dimker == 0) {
       // The Kernel is just {0}, so it doesn't have a basis properly speaking, but let's
       // avoid crashing/asserting as that depends on floating point calculations. Let's
       // just return a single column vector filled with zeros.
@@ -637,84 +596,74 @@
     }
 
     /* Let us use the following lemma:
-      *
-      * Lemma: If the matrix A has the LU decomposition PAQ = LU,
-      * then Ker A = Q(Ker U).
-      *
-      * Proof: trivial: just keep in mind that P, Q, L are invertible.
-      */
+     *
+     * Lemma: If the matrix A has the LU decomposition PAQ = LU,
+     * then Ker A = Q(Ker U).
+     *
+     * Proof: trivial: just keep in mind that P, Q, L are invertible.
+     */
 
     /* Thus, all we need to do is to compute Ker U, and then apply Q.
-      *
-      * U is upper triangular, with eigenvalues sorted so that any zeros appear at the end.
-      * Thus, the diagonal of U ends with exactly
-      * dimKer zero's. Let us use that to construct dimKer linearly
-      * independent vectors in Ker U.
-      */
+     *
+     * U is upper triangular, with eigenvalues sorted so that any zeros appear at the end.
+     * Thus, the diagonal of U ends with exactly
+     * dimKer zero's. Let us use that to construct dimKer linearly
+     * independent vectors in Ker U.
+     */
 
     Matrix<Index, Dynamic, 1, 0, MaxSmallDimAtCompileTime, 1> pivots(rank());
     RealScalar premultiplied_threshold = dec().maxPivot() * dec().threshold();
     Index p = 0;
-    for(Index i = 0; i < dec().nonzeroPivots(); ++i)
-      if(abs(dec().matrixLU().coeff(i,i)) > premultiplied_threshold)
-        pivots.coeffRef(p++) = i;
+    for (Index i = 0; i < dec().nonzeroPivots(); ++i)
+      if (abs(dec().matrixLU().coeff(i, i)) > premultiplied_threshold) pivots.coeffRef(p++) = i;
     eigen_internal_assert(p == rank());
 
     // we construct a temporaty trapezoid matrix m, by taking the U matrix and
     // permuting the rows and cols to bring the nonnegligible pivots to the top of
     // the main diagonal. We need that to be able to apply our triangular solvers.
     // FIXME when we get triangularView-for-rectangular-matrices, this can be simplified
-    Matrix<typename MatrixType::Scalar, Dynamic, Dynamic, MatrixType::Options,
-           MaxSmallDimAtCompileTime, MatrixType::MaxColsAtCompileTime>
-      m(dec().matrixLU().block(0, 0, rank(), cols));
-    for(Index i = 0; i < rank(); ++i)
-    {
-      if(i) m.row(i).head(i).setZero();
-      m.row(i).tail(cols-i) = dec().matrixLU().row(pivots.coeff(i)).tail(cols-i);
+    Matrix<typename MatrixType::Scalar, Dynamic, Dynamic, MatrixType::Options, MaxSmallDimAtCompileTime,
+           MatrixType::MaxColsAtCompileTime>
+        m(dec().matrixLU().block(0, 0, rank(), cols));
+    for (Index i = 0; i < rank(); ++i) {
+      if (i) m.row(i).head(i).setZero();
+      m.row(i).tail(cols - i) = dec().matrixLU().row(pivots.coeff(i)).tail(cols - i);
     }
     m.block(0, 0, rank(), rank());
     m.block(0, 0, rank(), rank()).template triangularView<StrictlyLower>().setZero();
-    for(Index i = 0; i < rank(); ++i)
-      m.col(i).swap(m.col(pivots.coeff(i)));
+    for (Index i = 0; i < rank(); ++i) m.col(i).swap(m.col(pivots.coeff(i)));
 
     // ok, we have our trapezoid matrix, we can apply the triangular solver.
     // notice that the math behind this suggests that we should apply this to the
     // negative of the RHS, but for performance we just put the negative sign elsewhere, see below.
-    m.topLeftCorner(rank(), rank())
-     .template triangularView<Upper>().solveInPlace(
-        m.topRightCorner(rank(), dimker)
-      );
+    m.topLeftCorner(rank(), rank()).template triangularView<Upper>().solveInPlace(m.topRightCorner(rank(), dimker));
 
     // now we must undo the column permutation that we had applied!
-    for(Index i = rank()-1; i >= 0; --i)
-      m.col(i).swap(m.col(pivots.coeff(i)));
+    for (Index i = rank() - 1; i >= 0; --i) m.col(i).swap(m.col(pivots.coeff(i)));
 
     // see the negative sign in the next line, that's what we were talking about above.
-    for(Index i = 0; i < rank(); ++i) dst.row(dec().permutationQ().indices().coeff(i)) = -m.row(i).tail(dimker);
-    for(Index i = rank(); i < cols; ++i) dst.row(dec().permutationQ().indices().coeff(i)).setZero();
-    for(Index k = 0; k < dimker; ++k) dst.coeffRef(dec().permutationQ().indices().coeff(rank()+k), k) = Scalar(1);
+    for (Index i = 0; i < rank(); ++i) dst.row(dec().permutationQ().indices().coeff(i)) = -m.row(i).tail(dimker);
+    for (Index i = rank(); i < cols; ++i) dst.row(dec().permutationQ().indices().coeff(i)).setZero();
+    for (Index k = 0; k < dimker; ++k) dst.coeffRef(dec().permutationQ().indices().coeff(rank() + k), k) = Scalar(1);
   }
 };
 
 /***** Implementation of image() *****************************************************/
 
-template<typename MatrixType_, typename PermutationIndex_>
+template <typename MatrixType_, typename PermutationIndex_>
 struct image_retval<FullPivLU<MatrixType_, PermutationIndex_> >
-  : image_retval_base<FullPivLU<MatrixType_, PermutationIndex_> >
-{
+    : image_retval_base<FullPivLU<MatrixType_, PermutationIndex_> > {
   using DecompositionType = FullPivLU<MatrixType_, PermutationIndex_>;
   EIGEN_MAKE_IMAGE_HELPERS(DecompositionType)
 
-  enum { MaxSmallDimAtCompileTime = min_size_prefer_fixed(
-              MatrixType::MaxColsAtCompileTime,
-              MatrixType::MaxRowsAtCompileTime)
+  enum {
+    MaxSmallDimAtCompileTime = min_size_prefer_fixed(MatrixType::MaxColsAtCompileTime, MatrixType::MaxRowsAtCompileTime)
   };
 
-  template<typename Dest> void evalTo(Dest& dst) const
-  {
+  template <typename Dest>
+  void evalTo(Dest& dst) const {
     using std::abs;
-    if(rank() == 0)
-    {
+    if (rank() == 0) {
       // The Image is just {0}, so it doesn't have a basis properly speaking, but let's
       // avoid crashing/asserting as that depends on floating point calculations. Let's
       // just return a single column vector filled with zeros.
@@ -725,40 +674,35 @@
     Matrix<Index, Dynamic, 1, 0, MaxSmallDimAtCompileTime, 1> pivots(rank());
     RealScalar premultiplied_threshold = dec().maxPivot() * dec().threshold();
     Index p = 0;
-    for(Index i = 0; i < dec().nonzeroPivots(); ++i)
-      if(abs(dec().matrixLU().coeff(i,i)) > premultiplied_threshold)
-        pivots.coeffRef(p++) = i;
+    for (Index i = 0; i < dec().nonzeroPivots(); ++i)
+      if (abs(dec().matrixLU().coeff(i, i)) > premultiplied_threshold) pivots.coeffRef(p++) = i;
     eigen_internal_assert(p == rank());
 
-    for(Index i = 0; i < rank(); ++i)
+    for (Index i = 0; i < rank(); ++i)
       dst.col(i) = originalMatrix().col(dec().permutationQ().indices().coeff(pivots.coeff(i)));
   }
 };
 
 /***** Implementation of solve() *****************************************************/
 
-} // end namespace internal
+}  // end namespace internal
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-template<typename MatrixType_, typename PermutationIndex_>
-template<typename RhsType, typename DstType>
-void FullPivLU<MatrixType_, PermutationIndex_>::_solve_impl(const RhsType &rhs, DstType &dst) const
-{
+template <typename MatrixType_, typename PermutationIndex_>
+template <typename RhsType, typename DstType>
+void FullPivLU<MatrixType_, PermutationIndex_>::_solve_impl(const RhsType& rhs, DstType& dst) const {
   /* The decomposition PAQ = LU can be rewritten as A = P^{-1} L U Q^{-1}.
-  * So we proceed as follows:
-  * Step 1: compute c = P * rhs.
-  * Step 2: replace c by the solution x to Lx = c. Exists because L is invertible.
-  * Step 3: replace c by the solution x to Ux = c. May or may not exist.
-  * Step 4: result = Q * c;
-  */
+   * So we proceed as follows:
+   * Step 1: compute c = P * rhs.
+   * Step 2: replace c by the solution x to Lx = c. Exists because L is invertible.
+   * Step 3: replace c by the solution x to Ux = c. May or may not exist.
+   * Step 4: result = Q * c;
+   */
 
-  const Index rows = this->rows(),
-              cols = this->cols(),
-              nonzero_pivots = this->rank();
+  const Index rows = this->rows(), cols = this->cols(), nonzero_pivots = this->rank();
   const Index smalldim = (std::min)(rows, cols);
 
-  if(nonzero_pivots == 0)
-  {
+  if (nonzero_pivots == 0) {
     dst.setZero();
     return;
   }
@@ -769,11 +713,8 @@
   c = permutationP() * rhs;
 
   // Step 2
-  m_lu.topLeftCorner(smalldim,smalldim)
-      .template triangularView<UnitLower>()
-      .solveInPlace(c.topRows(smalldim));
-  if(rows>cols)
-    c.bottomRows(rows-cols) -= m_lu.bottomRows(rows-cols) * c.topRows(cols);
+  m_lu.topLeftCorner(smalldim, smalldim).template triangularView<UnitLower>().solveInPlace(c.topRows(smalldim));
+  if (rows > cols) c.bottomRows(rows - cols) -= m_lu.bottomRows(rows - cols) * c.topRows(cols);
 
   // Step 3
   m_lu.topLeftCorner(nonzero_pivots, nonzero_pivots)
@@ -781,16 +722,13 @@
       .solveInPlace(c.topRows(nonzero_pivots));
 
   // Step 4
-  for(Index i = 0; i < nonzero_pivots; ++i)
-    dst.row(permutationQ().indices().coeff(i)) = c.row(i);
-  for(Index i = nonzero_pivots; i < m_lu.cols(); ++i)
-    dst.row(permutationQ().indices().coeff(i)).setZero();
+  for (Index i = 0; i < nonzero_pivots; ++i) dst.row(permutationQ().indices().coeff(i)) = c.row(i);
+  for (Index i = nonzero_pivots; i < m_lu.cols(); ++i) dst.row(permutationQ().indices().coeff(i)).setZero();
 }
 
-template<typename MatrixType_, typename PermutationIndex_>
-template<bool Conjugate, typename RhsType, typename DstType>
-void FullPivLU<MatrixType_, PermutationIndex_>::_solve_impl_transposed(const RhsType &rhs, DstType &dst) const
-{
+template <typename MatrixType_, typename PermutationIndex_>
+template <bool Conjugate, typename RhsType, typename DstType>
+void FullPivLU<MatrixType_, PermutationIndex_>::_solve_impl_transposed(const RhsType& rhs, DstType& dst) const {
   /* The decomposition PAQ = LU can be rewritten as A = P^{-1} L U Q^{-1},
    * and since permutations are real and unitary, we can write this
    * as   A^T = Q U^T L^T P,
@@ -802,12 +740,10 @@
    * If Conjugate is true, replace "^T" by "^*" above.
    */
 
-  const Index rows = this->rows(), cols = this->cols(),
-    nonzero_pivots = this->rank();
+  const Index rows = this->rows(), cols = this->cols(), nonzero_pivots = this->rank();
   const Index smalldim = (std::min)(rows, cols);
 
-  if(nonzero_pivots == 0)
-  {
+  if (nonzero_pivots == 0) {
     dst.setZero();
     return;
   }
@@ -833,46 +769,44 @@
 
   // Step 4
   PermutationPType invp = permutationP().inverse().eval();
-  for(Index i = 0; i < smalldim; ++i)
-    dst.row(invp.indices().coeff(i)) = c.row(i);
-  for(Index i = smalldim; i < rows; ++i)
-    dst.row(invp.indices().coeff(i)).setZero();
+  for (Index i = 0; i < smalldim; ++i) dst.row(invp.indices().coeff(i)) = c.row(i);
+  for (Index i = smalldim; i < rows; ++i) dst.row(invp.indices().coeff(i)).setZero();
 }
 
 #endif
 
 namespace internal {
 
-
 /***** Implementation of inverse() *****************************************************/
-template<typename DstXprType, typename MatrixType, typename PermutationIndex>
-struct Assignment<DstXprType, Inverse<FullPivLU<MatrixType, PermutationIndex> >, internal::assign_op<typename DstXprType::Scalar,typename FullPivLU<MatrixType, PermutationIndex>::Scalar>, Dense2Dense>
-{
+template <typename DstXprType, typename MatrixType, typename PermutationIndex>
+struct Assignment<
+    DstXprType, Inverse<FullPivLU<MatrixType, PermutationIndex> >,
+    internal::assign_op<typename DstXprType::Scalar, typename FullPivLU<MatrixType, PermutationIndex>::Scalar>,
+    Dense2Dense> {
   typedef FullPivLU<MatrixType, PermutationIndex> LuType;
   typedef Inverse<LuType> SrcXprType;
-  static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar,typename MatrixType::Scalar> &)
-  {
+  static void run(DstXprType& dst, const SrcXprType& src,
+                  const internal::assign_op<typename DstXprType::Scalar, typename MatrixType::Scalar>&) {
     dst = src.nestedExpression().solve(MatrixType::Identity(src.rows(), src.cols()));
   }
 };
-} // end namespace internal
+}  // end namespace internal
 
 /******* MatrixBase methods *****************************************************************/
 
 /** \lu_module
-  *
-  * \return the full-pivoting LU decomposition of \c *this.
-  *
-  * \sa class FullPivLU
-  */
-template<typename Derived>
-template<typename PermutationIndex>
-inline const FullPivLU<typename MatrixBase<Derived>::PlainObject, PermutationIndex>
-MatrixBase<Derived>::fullPivLu() const
-{
+ *
+ * \return the full-pivoting LU decomposition of \c *this.
+ *
+ * \sa class FullPivLU
+ */
+template <typename Derived>
+template <typename PermutationIndex>
+inline const FullPivLU<typename MatrixBase<Derived>::PlainObject, PermutationIndex> MatrixBase<Derived>::fullPivLu()
+    const {
   return FullPivLU<PlainObject, PermutationIndex>(eval());
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_LU_H
+#endif  // EIGEN_LU_H
diff --git a/Eigen/src/LU/InverseImpl.h b/Eigen/src/LU/InverseImpl.h
index 19d540c..57fd677 100644
--- a/Eigen/src/LU/InverseImpl.h
+++ b/Eigen/src/LU/InverseImpl.h
@@ -14,7 +14,7 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
@@ -22,51 +22,40 @@
 *** General case implementation ***
 **********************************/
 
-template<typename MatrixType, typename ResultType, int Size = MatrixType::RowsAtCompileTime>
-struct compute_inverse
-{
-  EIGEN_DEVICE_FUNC
-  static inline void run(const MatrixType& matrix, ResultType& result)
-  {
+template <typename MatrixType, typename ResultType, int Size = MatrixType::RowsAtCompileTime>
+struct compute_inverse {
+  EIGEN_DEVICE_FUNC static inline void run(const MatrixType& matrix, ResultType& result) {
     result = matrix.partialPivLu().inverse();
   }
 };
 
-template<typename MatrixType, typename ResultType, int Size = MatrixType::RowsAtCompileTime>
-struct compute_inverse_and_det_with_check { /* nothing! general case not supported. */ };
+template <typename MatrixType, typename ResultType, int Size = MatrixType::RowsAtCompileTime>
+struct compute_inverse_and_det_with_check { /* nothing! general case not supported. */
+};
 
 /****************************
 *** Size 1 implementation ***
 ****************************/
 
-template<typename MatrixType, typename ResultType>
-struct compute_inverse<MatrixType, ResultType, 1>
-{
-  EIGEN_DEVICE_FUNC
-  static inline void run(const MatrixType& matrix, ResultType& result)
-  {
+template <typename MatrixType, typename ResultType>
+struct compute_inverse<MatrixType, ResultType, 1> {
+  EIGEN_DEVICE_FUNC static inline void run(const MatrixType& matrix, ResultType& result) {
     typedef typename MatrixType::Scalar Scalar;
     internal::evaluator<MatrixType> matrixEval(matrix);
-    result.coeffRef(0,0) = Scalar(1) / matrixEval.coeff(0,0);
+    result.coeffRef(0, 0) = Scalar(1) / matrixEval.coeff(0, 0);
   }
 };
 
-template<typename MatrixType, typename ResultType>
-struct compute_inverse_and_det_with_check<MatrixType, ResultType, 1>
-{
-  EIGEN_DEVICE_FUNC
-  static inline void run(
-    const MatrixType& matrix,
-    const typename MatrixType::RealScalar& absDeterminantThreshold,
-    ResultType& result,
-    typename ResultType::Scalar& determinant,
-    bool& invertible
-  )
-  {
+template <typename MatrixType, typename ResultType>
+struct compute_inverse_and_det_with_check<MatrixType, ResultType, 1> {
+  EIGEN_DEVICE_FUNC static inline void run(const MatrixType& matrix,
+                                           const typename MatrixType::RealScalar& absDeterminantThreshold,
+                                           ResultType& result, typename ResultType::Scalar& determinant,
+                                           bool& invertible) {
     using std::abs;
-    determinant = matrix.coeff(0,0);
+    determinant = matrix.coeff(0, 0);
     invertible = abs(determinant) > absDeterminantThreshold;
-    if(invertible) result.coeffRef(0,0) = typename ResultType::Scalar(1) / determinant;
+    if (invertible) result.coeffRef(0, 0) = typename ResultType::Scalar(1) / determinant;
   }
 };
 
@@ -74,48 +63,37 @@
 *** Size 2 implementation ***
 ****************************/
 
-template<typename MatrixType, typename ResultType>
-EIGEN_DEVICE_FUNC 
-inline void compute_inverse_size2_helper(
-    const MatrixType& matrix, const typename ResultType::Scalar& invdet,
-    ResultType& result)
-{
-  typename ResultType::Scalar temp = matrix.coeff(0,0);
-  result.coeffRef(0,0) =  matrix.coeff(1,1) * invdet;
-  result.coeffRef(1,0) = -matrix.coeff(1,0) * invdet;
-  result.coeffRef(0,1) = -matrix.coeff(0,1) * invdet;
-  result.coeffRef(1,1) =  temp * invdet;
+template <typename MatrixType, typename ResultType>
+EIGEN_DEVICE_FUNC inline void compute_inverse_size2_helper(const MatrixType& matrix,
+                                                           const typename ResultType::Scalar& invdet,
+                                                           ResultType& result) {
+  typename ResultType::Scalar temp = matrix.coeff(0, 0);
+  result.coeffRef(0, 0) = matrix.coeff(1, 1) * invdet;
+  result.coeffRef(1, 0) = -matrix.coeff(1, 0) * invdet;
+  result.coeffRef(0, 1) = -matrix.coeff(0, 1) * invdet;
+  result.coeffRef(1, 1) = temp * invdet;
 }
 
-template<typename MatrixType, typename ResultType>
-struct compute_inverse<MatrixType, ResultType, 2>
-{
-  EIGEN_DEVICE_FUNC
-  static inline void run(const MatrixType& matrix, ResultType& result)
-  {
+template <typename MatrixType, typename ResultType>
+struct compute_inverse<MatrixType, ResultType, 2> {
+  EIGEN_DEVICE_FUNC static inline void run(const MatrixType& matrix, ResultType& result) {
     typedef typename ResultType::Scalar Scalar;
     const Scalar invdet = typename MatrixType::Scalar(1) / matrix.determinant();
     compute_inverse_size2_helper(matrix, invdet, result);
   }
 };
 
-template<typename MatrixType, typename ResultType>
-struct compute_inverse_and_det_with_check<MatrixType, ResultType, 2>
-{
-  EIGEN_DEVICE_FUNC
-  static inline void run(
-    const MatrixType& matrix,
-    const typename MatrixType::RealScalar& absDeterminantThreshold,
-    ResultType& inverse,
-    typename ResultType::Scalar& determinant,
-    bool& invertible
-  )
-  {
+template <typename MatrixType, typename ResultType>
+struct compute_inverse_and_det_with_check<MatrixType, ResultType, 2> {
+  EIGEN_DEVICE_FUNC static inline void run(const MatrixType& matrix,
+                                           const typename MatrixType::RealScalar& absDeterminantThreshold,
+                                           ResultType& inverse, typename ResultType::Scalar& determinant,
+                                           bool& invertible) {
     using std::abs;
     typedef typename ResultType::Scalar Scalar;
     determinant = matrix.determinant();
     invertible = abs(determinant) > absDeterminantThreshold;
-    if(!invertible) return;
+    if (!invertible) return;
     const Scalar invdet = Scalar(1) / determinant;
     compute_inverse_size2_helper(matrix, invdet, inverse);
   }
@@ -125,79 +103,58 @@
 *** Size 3 implementation ***
 ****************************/
 
-template<typename MatrixType, int i, int j>
-EIGEN_DEVICE_FUNC 
-inline typename MatrixType::Scalar cofactor_3x3(const MatrixType& m)
-{
-  enum {
-    i1 = (i+1) % 3,
-    i2 = (i+2) % 3,
-    j1 = (j+1) % 3,
-    j2 = (j+2) % 3
-  };
-  return m.coeff(i1, j1) * m.coeff(i2, j2)
-       - m.coeff(i1, j2) * m.coeff(i2, j1);
+template <typename MatrixType, int i, int j>
+EIGEN_DEVICE_FUNC inline typename MatrixType::Scalar cofactor_3x3(const MatrixType& m) {
+  enum { i1 = (i + 1) % 3, i2 = (i + 2) % 3, j1 = (j + 1) % 3, j2 = (j + 2) % 3 };
+  return m.coeff(i1, j1) * m.coeff(i2, j2) - m.coeff(i1, j2) * m.coeff(i2, j1);
 }
 
-template<typename MatrixType, typename ResultType>
-EIGEN_DEVICE_FUNC
-inline void compute_inverse_size3_helper(
-    const MatrixType& matrix,
-    const typename ResultType::Scalar& invdet,
-    const Matrix<typename ResultType::Scalar,3,1>& cofactors_col0,
-    ResultType& result)
-{
+template <typename MatrixType, typename ResultType>
+EIGEN_DEVICE_FUNC inline void compute_inverse_size3_helper(
+    const MatrixType& matrix, const typename ResultType::Scalar& invdet,
+    const Matrix<typename ResultType::Scalar, 3, 1>& cofactors_col0, ResultType& result) {
   // Compute cofactors in a way that avoids aliasing issues.
   typedef typename ResultType::Scalar Scalar;
-  const Scalar c01 = cofactor_3x3<MatrixType,0,1>(matrix) * invdet;
-  const Scalar c11 = cofactor_3x3<MatrixType,1,1>(matrix) * invdet;
-  const Scalar c02 = cofactor_3x3<MatrixType,0,2>(matrix) * invdet;
-  result.coeffRef(1,2) =  cofactor_3x3<MatrixType,2,1>(matrix) * invdet;
-  result.coeffRef(2,1) =  cofactor_3x3<MatrixType,1,2>(matrix) * invdet;
-  result.coeffRef(2,2) =  cofactor_3x3<MatrixType,2,2>(matrix) * invdet;
-  result.coeffRef(1,0) =  c01;
-  result.coeffRef(1,1) =  c11;
-  result.coeffRef(2,0) =  c02;  
+  const Scalar c01 = cofactor_3x3<MatrixType, 0, 1>(matrix) * invdet;
+  const Scalar c11 = cofactor_3x3<MatrixType, 1, 1>(matrix) * invdet;
+  const Scalar c02 = cofactor_3x3<MatrixType, 0, 2>(matrix) * invdet;
+  result.coeffRef(1, 2) = cofactor_3x3<MatrixType, 2, 1>(matrix) * invdet;
+  result.coeffRef(2, 1) = cofactor_3x3<MatrixType, 1, 2>(matrix) * invdet;
+  result.coeffRef(2, 2) = cofactor_3x3<MatrixType, 2, 2>(matrix) * invdet;
+  result.coeffRef(1, 0) = c01;
+  result.coeffRef(1, 1) = c11;
+  result.coeffRef(2, 0) = c02;
   result.row(0) = cofactors_col0 * invdet;
 }
 
-template<typename MatrixType, typename ResultType>
-struct compute_inverse<MatrixType, ResultType, 3>
-{
-  EIGEN_DEVICE_FUNC
-  static inline void run(const MatrixType& matrix, ResultType& result)
-  {
+template <typename MatrixType, typename ResultType>
+struct compute_inverse<MatrixType, ResultType, 3> {
+  EIGEN_DEVICE_FUNC static inline void run(const MatrixType& matrix, ResultType& result) {
     typedef typename ResultType::Scalar Scalar;
-    Matrix<typename MatrixType::Scalar,3,1> cofactors_col0;
-    cofactors_col0.coeffRef(0) =  cofactor_3x3<MatrixType,0,0>(matrix);
-    cofactors_col0.coeffRef(1) =  cofactor_3x3<MatrixType,1,0>(matrix);
-    cofactors_col0.coeffRef(2) =  cofactor_3x3<MatrixType,2,0>(matrix);
+    Matrix<typename MatrixType::Scalar, 3, 1> cofactors_col0;
+    cofactors_col0.coeffRef(0) = cofactor_3x3<MatrixType, 0, 0>(matrix);
+    cofactors_col0.coeffRef(1) = cofactor_3x3<MatrixType, 1, 0>(matrix);
+    cofactors_col0.coeffRef(2) = cofactor_3x3<MatrixType, 2, 0>(matrix);
     const Scalar det = (cofactors_col0.cwiseProduct(matrix.col(0))).sum();
     const Scalar invdet = Scalar(1) / det;
     compute_inverse_size3_helper(matrix, invdet, cofactors_col0, result);
   }
 };
 
-template<typename MatrixType, typename ResultType>
-struct compute_inverse_and_det_with_check<MatrixType, ResultType, 3>
-{
-  EIGEN_DEVICE_FUNC
-  static inline void run(
-    const MatrixType& matrix,
-    const typename MatrixType::RealScalar& absDeterminantThreshold,
-    ResultType& inverse,
-    typename ResultType::Scalar& determinant,
-    bool& invertible
-  )
-  {
+template <typename MatrixType, typename ResultType>
+struct compute_inverse_and_det_with_check<MatrixType, ResultType, 3> {
+  EIGEN_DEVICE_FUNC static inline void run(const MatrixType& matrix,
+                                           const typename MatrixType::RealScalar& absDeterminantThreshold,
+                                           ResultType& inverse, typename ResultType::Scalar& determinant,
+                                           bool& invertible) {
     typedef typename ResultType::Scalar Scalar;
-    Matrix<Scalar,3,1> cofactors_col0;
-    cofactors_col0.coeffRef(0) =  cofactor_3x3<MatrixType,0,0>(matrix);
-    cofactors_col0.coeffRef(1) =  cofactor_3x3<MatrixType,1,0>(matrix);
-    cofactors_col0.coeffRef(2) =  cofactor_3x3<MatrixType,2,0>(matrix);
+    Matrix<Scalar, 3, 1> cofactors_col0;
+    cofactors_col0.coeffRef(0) = cofactor_3x3<MatrixType, 0, 0>(matrix);
+    cofactors_col0.coeffRef(1) = cofactor_3x3<MatrixType, 1, 0>(matrix);
+    cofactors_col0.coeffRef(2) = cofactor_3x3<MatrixType, 2, 0>(matrix);
     determinant = (cofactors_col0.cwiseProduct(matrix.col(0))).sum();
     invertible = Eigen::numext::abs(determinant) > absDeterminantThreshold;
-    if(!invertible) return;
+    if (!invertible) return;
     const Scalar invdet = Scalar(1) / determinant;
     compute_inverse_size3_helper(matrix, invdet, cofactors_col0, inverse);
   }
@@ -207,84 +164,59 @@
 *** Size 4 implementation ***
 ****************************/
 
-template<typename Derived>
-EIGEN_DEVICE_FUNC 
-inline const typename Derived::Scalar general_det3_helper
-(const MatrixBase<Derived>& matrix, int i1, int i2, int i3, int j1, int j2, int j3)
-{
-  return matrix.coeff(i1,j1)
-         * (matrix.coeff(i2,j2) * matrix.coeff(i3,j3) - matrix.coeff(i2,j3) * matrix.coeff(i3,j2));
+template <typename Derived>
+EIGEN_DEVICE_FUNC inline const typename Derived::Scalar general_det3_helper(const MatrixBase<Derived>& matrix, int i1,
+                                                                            int i2, int i3, int j1, int j2, int j3) {
+  return matrix.coeff(i1, j1) *
+         (matrix.coeff(i2, j2) * matrix.coeff(i3, j3) - matrix.coeff(i2, j3) * matrix.coeff(i3, j2));
 }
 
-template<typename MatrixType, int i, int j>
-EIGEN_DEVICE_FUNC 
-inline typename MatrixType::Scalar cofactor_4x4(const MatrixType& matrix)
-{
-  enum {
-    i1 = (i+1) % 4,
-    i2 = (i+2) % 4,
-    i3 = (i+3) % 4,
-    j1 = (j+1) % 4,
-    j2 = (j+2) % 4,
-    j3 = (j+3) % 4
-  };
-  return general_det3_helper(matrix, i1, i2, i3, j1, j2, j3)
-       + general_det3_helper(matrix, i2, i3, i1, j1, j2, j3)
-       + general_det3_helper(matrix, i3, i1, i2, j1, j2, j3);
+template <typename MatrixType, int i, int j>
+EIGEN_DEVICE_FUNC inline typename MatrixType::Scalar cofactor_4x4(const MatrixType& matrix) {
+  enum { i1 = (i + 1) % 4, i2 = (i + 2) % 4, i3 = (i + 3) % 4, j1 = (j + 1) % 4, j2 = (j + 2) % 4, j3 = (j + 3) % 4 };
+  return general_det3_helper(matrix, i1, i2, i3, j1, j2, j3) + general_det3_helper(matrix, i2, i3, i1, j1, j2, j3) +
+         general_det3_helper(matrix, i3, i1, i2, j1, j2, j3);
 }
 
-template<int Arch, typename Scalar, typename MatrixType, typename ResultType>
-struct compute_inverse_size4
-{
-  EIGEN_DEVICE_FUNC
-  static void run(const MatrixType& matrix, ResultType& result)
-  {
-    result.coeffRef(0,0) =  cofactor_4x4<MatrixType,0,0>(matrix);
-    result.coeffRef(1,0) = -cofactor_4x4<MatrixType,0,1>(matrix);
-    result.coeffRef(2,0) =  cofactor_4x4<MatrixType,0,2>(matrix);
-    result.coeffRef(3,0) = -cofactor_4x4<MatrixType,0,3>(matrix);
-    result.coeffRef(0,2) =  cofactor_4x4<MatrixType,2,0>(matrix);
-    result.coeffRef(1,2) = -cofactor_4x4<MatrixType,2,1>(matrix);
-    result.coeffRef(2,2) =  cofactor_4x4<MatrixType,2,2>(matrix);
-    result.coeffRef(3,2) = -cofactor_4x4<MatrixType,2,3>(matrix);
-    result.coeffRef(0,1) = -cofactor_4x4<MatrixType,1,0>(matrix);
-    result.coeffRef(1,1) =  cofactor_4x4<MatrixType,1,1>(matrix);
-    result.coeffRef(2,1) = -cofactor_4x4<MatrixType,1,2>(matrix);
-    result.coeffRef(3,1) =  cofactor_4x4<MatrixType,1,3>(matrix);
-    result.coeffRef(0,3) = -cofactor_4x4<MatrixType,3,0>(matrix);
-    result.coeffRef(1,3) =  cofactor_4x4<MatrixType,3,1>(matrix);
-    result.coeffRef(2,3) = -cofactor_4x4<MatrixType,3,2>(matrix);
-    result.coeffRef(3,3) =  cofactor_4x4<MatrixType,3,3>(matrix);
+template <int Arch, typename Scalar, typename MatrixType, typename ResultType>
+struct compute_inverse_size4 {
+  EIGEN_DEVICE_FUNC static void run(const MatrixType& matrix, ResultType& result) {
+    result.coeffRef(0, 0) = cofactor_4x4<MatrixType, 0, 0>(matrix);
+    result.coeffRef(1, 0) = -cofactor_4x4<MatrixType, 0, 1>(matrix);
+    result.coeffRef(2, 0) = cofactor_4x4<MatrixType, 0, 2>(matrix);
+    result.coeffRef(3, 0) = -cofactor_4x4<MatrixType, 0, 3>(matrix);
+    result.coeffRef(0, 2) = cofactor_4x4<MatrixType, 2, 0>(matrix);
+    result.coeffRef(1, 2) = -cofactor_4x4<MatrixType, 2, 1>(matrix);
+    result.coeffRef(2, 2) = cofactor_4x4<MatrixType, 2, 2>(matrix);
+    result.coeffRef(3, 2) = -cofactor_4x4<MatrixType, 2, 3>(matrix);
+    result.coeffRef(0, 1) = -cofactor_4x4<MatrixType, 1, 0>(matrix);
+    result.coeffRef(1, 1) = cofactor_4x4<MatrixType, 1, 1>(matrix);
+    result.coeffRef(2, 1) = -cofactor_4x4<MatrixType, 1, 2>(matrix);
+    result.coeffRef(3, 1) = cofactor_4x4<MatrixType, 1, 3>(matrix);
+    result.coeffRef(0, 3) = -cofactor_4x4<MatrixType, 3, 0>(matrix);
+    result.coeffRef(1, 3) = cofactor_4x4<MatrixType, 3, 1>(matrix);
+    result.coeffRef(2, 3) = -cofactor_4x4<MatrixType, 3, 2>(matrix);
+    result.coeffRef(3, 3) = cofactor_4x4<MatrixType, 3, 3>(matrix);
     result /= (matrix.col(0).cwiseProduct(result.row(0).transpose())).sum();
   }
 };
 
-template<typename MatrixType, typename ResultType>
+template <typename MatrixType, typename ResultType>
 struct compute_inverse<MatrixType, ResultType, 4>
- : compute_inverse_size4<Architecture::Target, typename MatrixType::Scalar,
-                            MatrixType, ResultType>
-{
-};
+    : compute_inverse_size4<Architecture::Target, typename MatrixType::Scalar, MatrixType, ResultType> {};
 
-template<typename MatrixType, typename ResultType>
-struct compute_inverse_and_det_with_check<MatrixType, ResultType, 4>
-{
-  EIGEN_DEVICE_FUNC
-  static inline void run(
-    const MatrixType& matrix,
-    const typename MatrixType::RealScalar& absDeterminantThreshold,
-    ResultType& inverse,
-    typename ResultType::Scalar& determinant,
-    bool& invertible
-  )
-  {
+template <typename MatrixType, typename ResultType>
+struct compute_inverse_and_det_with_check<MatrixType, ResultType, 4> {
+  EIGEN_DEVICE_FUNC static inline void run(const MatrixType& matrix,
+                                           const typename MatrixType::RealScalar& absDeterminantThreshold,
+                                           ResultType& inverse, typename ResultType::Scalar& determinant,
+                                           bool& invertible) {
     using std::abs;
     determinant = matrix.determinant();
     invertible = abs(determinant) > absDeterminantThreshold;
-    if(invertible && extract_data(matrix) != extract_data(inverse)) {
+    if (invertible && extract_data(matrix) != extract_data(inverse)) {
       compute_inverse<MatrixType, ResultType>::run(matrix, inverse);
-    }
-    else if(invertible) {
+    } else if (invertible) {
       MatrixType matrix_t = matrix;
       compute_inverse<MatrixType, ResultType>::run(matrix_t, inverse);
     }
@@ -295,141 +227,127 @@
 *** MatrixBase methods ***
 *************************/
 
-} // end namespace internal
+}  // end namespace internal
 
 namespace internal {
 
 // Specialization for "dense = dense_xpr.inverse()"
-template<typename DstXprType, typename XprType>
-struct Assignment<DstXprType, Inverse<XprType>, internal::assign_op<typename DstXprType::Scalar,typename XprType::Scalar>, Dense2Dense>
-{
+template <typename DstXprType, typename XprType>
+struct Assignment<DstXprType, Inverse<XprType>,
+                  internal::assign_op<typename DstXprType::Scalar, typename XprType::Scalar>, Dense2Dense> {
   typedef Inverse<XprType> SrcXprType;
-  EIGEN_DEVICE_FUNC
-  static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar,typename XprType::Scalar> &)
-  {
+  EIGEN_DEVICE_FUNC static void run(DstXprType& dst, const SrcXprType& src,
+                                    const internal::assign_op<typename DstXprType::Scalar, typename XprType::Scalar>&) {
     Index dstRows = src.rows();
     Index dstCols = src.cols();
-    if((dst.rows()!=dstRows) || (dst.cols()!=dstCols))
-      dst.resize(dstRows, dstCols);
-    
+    if ((dst.rows() != dstRows) || (dst.cols() != dstCols)) dst.resize(dstRows, dstCols);
+
     const int Size = plain_enum_min(XprType::ColsAtCompileTime, DstXprType::ColsAtCompileTime);
     EIGEN_ONLY_USED_FOR_DEBUG(Size);
-    eigen_assert(( (Size<=1) || (Size>4) || (extract_data(src.nestedExpression())!=extract_data(dst)))
-              && "Aliasing problem detected in inverse(), you need to do inverse().eval() here.");
+    eigen_assert(((Size <= 1) || (Size > 4) || (extract_data(src.nestedExpression()) != extract_data(dst))) &&
+                 "Aliasing problem detected in inverse(), you need to do inverse().eval() here.");
 
-    typedef typename internal::nested_eval<XprType,XprType::ColsAtCompileTime>::type  ActualXprType;
-    typedef internal::remove_all_t<ActualXprType>                        ActualXprTypeCleanded;
-    
+    typedef typename internal::nested_eval<XprType, XprType::ColsAtCompileTime>::type ActualXprType;
+    typedef internal::remove_all_t<ActualXprType> ActualXprTypeCleanded;
+
     ActualXprType actual_xpr(src.nestedExpression());
-    
+
     compute_inverse<ActualXprTypeCleanded, DstXprType>::run(actual_xpr, dst);
   }
 };
 
-  
-} // end namespace internal
+}  // end namespace internal
 
 /** \lu_module
-  *
-  * \returns the matrix inverse of this matrix.
-  *
-  * For small fixed sizes up to 4x4, this method uses cofactors.
-  * In the general case, this method uses class PartialPivLU.
-  *
-  * \note This matrix must be invertible, otherwise the result is undefined. If you need an
-  * invertibility check, do the following:
-  * \li for fixed sizes up to 4x4, use computeInverseAndDetWithCheck().
-  * \li for the general case, use class FullPivLU.
-  *
-  * Example: \include MatrixBase_inverse.cpp
-  * Output: \verbinclude MatrixBase_inverse.out
-  *
-  * \sa computeInverseAndDetWithCheck()
-  */
-template<typename Derived>
-EIGEN_DEVICE_FUNC
-inline const Inverse<Derived> MatrixBase<Derived>::inverse() const
-{
-  EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::IsInteger,THIS_FUNCTION_IS_NOT_FOR_INTEGER_NUMERIC_TYPES)
+ *
+ * \returns the matrix inverse of this matrix.
+ *
+ * For small fixed sizes up to 4x4, this method uses cofactors.
+ * In the general case, this method uses class PartialPivLU.
+ *
+ * \note This matrix must be invertible, otherwise the result is undefined. If you need an
+ * invertibility check, do the following:
+ * \li for fixed sizes up to 4x4, use computeInverseAndDetWithCheck().
+ * \li for the general case, use class FullPivLU.
+ *
+ * Example: \include MatrixBase_inverse.cpp
+ * Output: \verbinclude MatrixBase_inverse.out
+ *
+ * \sa computeInverseAndDetWithCheck()
+ */
+template <typename Derived>
+EIGEN_DEVICE_FUNC inline const Inverse<Derived> MatrixBase<Derived>::inverse() const {
+  EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::IsInteger, THIS_FUNCTION_IS_NOT_FOR_INTEGER_NUMERIC_TYPES)
   eigen_assert(rows() == cols());
   return Inverse<Derived>(derived());
 }
 
 /** \lu_module
-  *
-  * Computation of matrix inverse and determinant, with invertibility check.
-  *
-  * This is only for fixed-size square matrices of size up to 4x4.
-  *
-  * Notice that it will trigger a copy of input matrix when trying to do the inverse in place.
-  *
-  * \param inverse Reference to the matrix in which to store the inverse.
-  * \param determinant Reference to the variable in which to store the determinant.
-  * \param invertible Reference to the bool variable in which to store whether the matrix is invertible.
-  * \param absDeterminantThreshold Optional parameter controlling the invertibility check.
-  *                                The matrix will be declared invertible if the absolute value of its
-  *                                determinant is greater than this threshold.
-  *
-  * Example: \include MatrixBase_computeInverseAndDetWithCheck.cpp
-  * Output: \verbinclude MatrixBase_computeInverseAndDetWithCheck.out
-  *
-  * \sa inverse(), computeInverseWithCheck()
-  */
-template<typename Derived>
-template<typename ResultType>
-inline void MatrixBase<Derived>::computeInverseAndDetWithCheck(
-    ResultType& inverse,
-    typename ResultType::Scalar& determinant,
-    bool& invertible,
-    const RealScalar& absDeterminantThreshold
-  ) const
-{
+ *
+ * Computation of matrix inverse and determinant, with invertibility check.
+ *
+ * This is only for fixed-size square matrices of size up to 4x4.
+ *
+ * Notice that it will trigger a copy of input matrix when trying to do the inverse in place.
+ *
+ * \param inverse Reference to the matrix in which to store the inverse.
+ * \param determinant Reference to the variable in which to store the determinant.
+ * \param invertible Reference to the bool variable in which to store whether the matrix is invertible.
+ * \param absDeterminantThreshold Optional parameter controlling the invertibility check.
+ *                                The matrix will be declared invertible if the absolute value of its
+ *                                determinant is greater than this threshold.
+ *
+ * Example: \include MatrixBase_computeInverseAndDetWithCheck.cpp
+ * Output: \verbinclude MatrixBase_computeInverseAndDetWithCheck.out
+ *
+ * \sa inverse(), computeInverseWithCheck()
+ */
+template <typename Derived>
+template <typename ResultType>
+inline void MatrixBase<Derived>::computeInverseAndDetWithCheck(ResultType& inverse,
+                                                               typename ResultType::Scalar& determinant,
+                                                               bool& invertible,
+                                                               const RealScalar& absDeterminantThreshold) const {
   // i'd love to put some static assertions there, but SFINAE means that they have no effect...
   eigen_assert(rows() == cols());
   // for 2x2, it's worth giving a chance to avoid evaluating.
   // for larger sizes, evaluating has negligible cost and limits code size.
-  typedef std::conditional_t<
-    RowsAtCompileTime == 2,
-    internal::remove_all_t<typename internal::nested_eval<Derived, 2>::type>,
-    PlainObject
-  > MatrixType;
-  internal::compute_inverse_and_det_with_check<MatrixType, ResultType>::run
-    (derived(), absDeterminantThreshold, inverse, determinant, invertible);
+  typedef std::conditional_t<RowsAtCompileTime == 2,
+                             internal::remove_all_t<typename internal::nested_eval<Derived, 2>::type>, PlainObject>
+      MatrixType;
+  internal::compute_inverse_and_det_with_check<MatrixType, ResultType>::run(derived(), absDeterminantThreshold, inverse,
+                                                                            determinant, invertible);
 }
 
 /** \lu_module
-  *
-  * Computation of matrix inverse, with invertibility check.
-  *
-  * This is only for fixed-size square matrices of size up to 4x4.
-  *
-  * Notice that it will trigger a copy of input matrix when trying to do the inverse in place.
-  *
-  * \param inverse Reference to the matrix in which to store the inverse.
-  * \param invertible Reference to the bool variable in which to store whether the matrix is invertible.
-  * \param absDeterminantThreshold Optional parameter controlling the invertibility check.
-  *                                The matrix will be declared invertible if the absolute value of its
-  *                                determinant is greater than this threshold.
-  *
-  * Example: \include MatrixBase_computeInverseWithCheck.cpp
-  * Output: \verbinclude MatrixBase_computeInverseWithCheck.out
-  *
-  * \sa inverse(), computeInverseAndDetWithCheck()
-  */
-template<typename Derived>
-template<typename ResultType>
-inline void MatrixBase<Derived>::computeInverseWithCheck(
-    ResultType& inverse,
-    bool& invertible,
-    const RealScalar& absDeterminantThreshold
-  ) const
-{
+ *
+ * Computation of matrix inverse, with invertibility check.
+ *
+ * This is only for fixed-size square matrices of size up to 4x4.
+ *
+ * Notice that it will trigger a copy of input matrix when trying to do the inverse in place.
+ *
+ * \param inverse Reference to the matrix in which to store the inverse.
+ * \param invertible Reference to the bool variable in which to store whether the matrix is invertible.
+ * \param absDeterminantThreshold Optional parameter controlling the invertibility check.
+ *                                The matrix will be declared invertible if the absolute value of its
+ *                                determinant is greater than this threshold.
+ *
+ * Example: \include MatrixBase_computeInverseWithCheck.cpp
+ * Output: \verbinclude MatrixBase_computeInverseWithCheck.out
+ *
+ * \sa inverse(), computeInverseAndDetWithCheck()
+ */
+template <typename Derived>
+template <typename ResultType>
+inline void MatrixBase<Derived>::computeInverseWithCheck(ResultType& inverse, bool& invertible,
+                                                         const RealScalar& absDeterminantThreshold) const {
   Scalar determinant;
   // i'd love to put some static assertions there, but SFINAE means that they have no effect...
   eigen_assert(rows() == cols());
-  computeInverseAndDetWithCheck(inverse,determinant,invertible,absDeterminantThreshold);
+  computeInverseAndDetWithCheck(inverse, determinant, invertible, absDeterminantThreshold);
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_INVERSE_IMPL_H
+#endif  // EIGEN_INVERSE_IMPL_H
diff --git a/Eigen/src/LU/PartialPivLU.h b/Eigen/src/LU/PartialPivLU.h
index 2301ebd..1edd6b8 100644
--- a/Eigen/src/LU/PartialPivLU.h
+++ b/Eigen/src/LU/PartialPivLU.h
@@ -17,426 +17,385 @@
 namespace Eigen {
 
 namespace internal {
-template<typename MatrixType_, typename PermutationIndex_> struct traits<PartialPivLU<MatrixType_, PermutationIndex_> >
- : traits<MatrixType_>
-{
+template <typename MatrixType_, typename PermutationIndex_>
+struct traits<PartialPivLU<MatrixType_, PermutationIndex_> > : traits<MatrixType_> {
   typedef MatrixXpr XprKind;
   typedef SolverStorage StorageKind;
   typedef PermutationIndex_ StorageIndex;
   typedef traits<MatrixType_> BaseTraits;
-  enum {
-    Flags = BaseTraits::Flags & RowMajorBit,
-    CoeffReadCost = Dynamic
-  };
+  enum { Flags = BaseTraits::Flags & RowMajorBit, CoeffReadCost = Dynamic };
 };
 
-template<typename T,typename Derived>
+template <typename T, typename Derived>
 struct enable_if_ref;
 // {
 //   typedef Derived type;
 // };
 
-template<typename T,typename Derived>
-struct enable_if_ref<Ref<T>,Derived> {
+template <typename T, typename Derived>
+struct enable_if_ref<Ref<T>, Derived> {
   typedef Derived type;
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \ingroup LU_Module
-  *
-  * \class PartialPivLU
-  *
-  * \brief LU decomposition of a matrix with partial pivoting, and related features
-  *
-  * \tparam MatrixType_ the type of the matrix of which we are computing the LU decomposition
-  *
-  * This class represents a LU decomposition of a \b square \b invertible matrix, with partial pivoting: the matrix A
-  * is decomposed as A = PLU where L is unit-lower-triangular, U is upper-triangular, and P
-  * is a permutation matrix.
-  *
-  * Typically, partial pivoting LU decomposition is only considered numerically stable for square invertible
-  * matrices. Thus LAPACK's dgesv and dgesvx require the matrix to be square and invertible. The present class
-  * does the same. It will assert that the matrix is square, but it won't (actually it can't) check that the
-  * matrix is invertible: it is your task to check that you only use this decomposition on invertible matrices.
-  *
-  * The guaranteed safe alternative, working for all matrices, is the full pivoting LU decomposition, provided
-  * by class FullPivLU.
-  *
-  * This is \b not a rank-revealing LU decomposition. Many features are intentionally absent from this class,
-  * such as rank computation. If you need these features, use class FullPivLU.
-  *
-  * This LU decomposition is suitable to invert invertible matrices. It is what MatrixBase::inverse() uses
-  * in the general case.
-  * On the other hand, it is \b not suitable to determine whether a given matrix is invertible.
-  *
-  * The data of the LU decomposition can be directly accessed through the methods matrixLU(), permutationP().
-  *
-  * This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism.
-  *
-  * \sa MatrixBase::partialPivLu(), MatrixBase::determinant(), MatrixBase::inverse(), MatrixBase::computeInverse(), class FullPivLU
-  */
-template<typename MatrixType_, typename PermutationIndex_> class PartialPivLU
-  : public SolverBase<PartialPivLU<MatrixType_, PermutationIndex_> >
-{
-  public:
+ *
+ * \class PartialPivLU
+ *
+ * \brief LU decomposition of a matrix with partial pivoting, and related features
+ *
+ * \tparam MatrixType_ the type of the matrix of which we are computing the LU decomposition
+ *
+ * This class represents a LU decomposition of a \b square \b invertible matrix, with partial pivoting: the matrix A
+ * is decomposed as A = PLU where L is unit-lower-triangular, U is upper-triangular, and P
+ * is a permutation matrix.
+ *
+ * Typically, partial pivoting LU decomposition is only considered numerically stable for square invertible
+ * matrices. Thus LAPACK's dgesv and dgesvx require the matrix to be square and invertible. The present class
+ * does the same. It will assert that the matrix is square, but it won't (actually it can't) check that the
+ * matrix is invertible: it is your task to check that you only use this decomposition on invertible matrices.
+ *
+ * The guaranteed safe alternative, working for all matrices, is the full pivoting LU decomposition, provided
+ * by class FullPivLU.
+ *
+ * This is \b not a rank-revealing LU decomposition. Many features are intentionally absent from this class,
+ * such as rank computation. If you need these features, use class FullPivLU.
+ *
+ * This LU decomposition is suitable to invert invertible matrices. It is what MatrixBase::inverse() uses
+ * in the general case.
+ * On the other hand, it is \b not suitable to determine whether a given matrix is invertible.
+ *
+ * The data of the LU decomposition can be directly accessed through the methods matrixLU(), permutationP().
+ *
+ * This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism.
+ *
+ * \sa MatrixBase::partialPivLu(), MatrixBase::determinant(), MatrixBase::inverse(), MatrixBase::computeInverse(), class
+ * FullPivLU
+ */
+template <typename MatrixType_, typename PermutationIndex_>
+class PartialPivLU : public SolverBase<PartialPivLU<MatrixType_, PermutationIndex_> > {
+ public:
+  typedef MatrixType_ MatrixType;
+  typedef SolverBase<PartialPivLU> Base;
+  friend class SolverBase<PartialPivLU>;
 
-    typedef MatrixType_ MatrixType;
-    typedef SolverBase<PartialPivLU> Base;
-    friend class SolverBase<PartialPivLU>;
+  EIGEN_GENERIC_PUBLIC_INTERFACE(PartialPivLU)
+  enum {
+    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
+  };
+  using PermutationIndex = PermutationIndex_;
+  typedef PermutationMatrix<RowsAtCompileTime, MaxRowsAtCompileTime, PermutationIndex> PermutationType;
+  typedef Transpositions<RowsAtCompileTime, MaxRowsAtCompileTime, PermutationIndex> TranspositionType;
+  typedef typename MatrixType::PlainObject PlainObject;
 
-    EIGEN_GENERIC_PUBLIC_INTERFACE(PartialPivLU)
-    enum {
-      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
-      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
-    };
-    using PermutationIndex = PermutationIndex_;
-    typedef PermutationMatrix<RowsAtCompileTime, MaxRowsAtCompileTime, PermutationIndex> PermutationType;
-    typedef Transpositions<RowsAtCompileTime, MaxRowsAtCompileTime, PermutationIndex> TranspositionType;
-    typedef typename MatrixType::PlainObject PlainObject;
+  /**
+   * \brief Default Constructor.
+   *
+   * The default constructor is useful in cases in which the user intends to
+   * perform decompositions via PartialPivLU::compute(const MatrixType&).
+   */
+  PartialPivLU();
 
-    /**
-      * \brief Default Constructor.
-      *
-      * The default constructor is useful in cases in which the user intends to
-      * perform decompositions via PartialPivLU::compute(const MatrixType&).
-      */
-    PartialPivLU();
+  /** \brief Default Constructor with memory preallocation
+   *
+   * Like the default constructor but with preallocation of the internal data
+   * according to the specified problem \a size.
+   * \sa PartialPivLU()
+   */
+  explicit PartialPivLU(Index size);
 
-    /** \brief Default Constructor with memory preallocation
-      *
-      * Like the default constructor but with preallocation of the internal data
-      * according to the specified problem \a size.
-      * \sa PartialPivLU()
-      */
-    explicit PartialPivLU(Index size);
+  /** Constructor.
+   *
+   * \param matrix the matrix of which to compute the LU decomposition.
+   *
+   * \warning The matrix should have full rank (e.g. if it's square, it should be invertible).
+   * If you need to deal with non-full rank, use class FullPivLU instead.
+   */
+  template <typename InputType>
+  explicit PartialPivLU(const EigenBase<InputType>& matrix);
 
-    /** Constructor.
-      *
-      * \param matrix the matrix of which to compute the LU decomposition.
-      *
-      * \warning The matrix should have full rank (e.g. if it's square, it should be invertible).
-      * If you need to deal with non-full rank, use class FullPivLU instead.
-      */
-    template<typename InputType>
-    explicit PartialPivLU(const EigenBase<InputType>& matrix);
+  /** Constructor for \link InplaceDecomposition inplace decomposition \endlink
+   *
+   * \param matrix the matrix of which to compute the LU decomposition.
+   *
+   * \warning The matrix should have full rank (e.g. if it's square, it should be invertible).
+   * If you need to deal with non-full rank, use class FullPivLU instead.
+   */
+  template <typename InputType>
+  explicit PartialPivLU(EigenBase<InputType>& matrix);
 
-    /** Constructor for \link InplaceDecomposition inplace decomposition \endlink
-      *
-      * \param matrix the matrix of which to compute the LU decomposition.
-      *
-      * \warning The matrix should have full rank (e.g. if it's square, it should be invertible).
-      * If you need to deal with non-full rank, use class FullPivLU instead.
-      */
-    template<typename InputType>
-    explicit PartialPivLU(EigenBase<InputType>& matrix);
+  template <typename InputType>
+  PartialPivLU& compute(const EigenBase<InputType>& matrix) {
+    m_lu = matrix.derived();
+    compute();
+    return *this;
+  }
 
-    template<typename InputType>
-    PartialPivLU& compute(const EigenBase<InputType>& matrix) {
-      m_lu = matrix.derived();
-      compute();
-      return *this;
-    }
+  /** \returns the LU decomposition matrix: the upper-triangular part is U, the
+   * unit-lower-triangular part is L (at least for square matrices; in the non-square
+   * case, special care is needed, see the documentation of class FullPivLU).
+   *
+   * \sa matrixL(), matrixU()
+   */
+  inline const MatrixType& matrixLU() const {
+    eigen_assert(m_isInitialized && "PartialPivLU is not initialized.");
+    return m_lu;
+  }
 
-    /** \returns the LU decomposition matrix: the upper-triangular part is U, the
-      * unit-lower-triangular part is L (at least for square matrices; in the non-square
-      * case, special care is needed, see the documentation of class FullPivLU).
-      *
-      * \sa matrixL(), matrixU()
-      */
-    inline const MatrixType& matrixLU() const
-    {
-      eigen_assert(m_isInitialized && "PartialPivLU is not initialized.");
-      return m_lu;
-    }
+  /** \returns the permutation matrix P.
+   */
+  inline const PermutationType& permutationP() const {
+    eigen_assert(m_isInitialized && "PartialPivLU is not initialized.");
+    return m_p;
+  }
 
-    /** \returns the permutation matrix P.
-      */
-    inline const PermutationType& permutationP() const
-    {
-      eigen_assert(m_isInitialized && "PartialPivLU is not initialized.");
-      return m_p;
-    }
+#ifdef EIGEN_PARSED_BY_DOXYGEN
+  /** This method returns the solution x to the equation Ax=b, where A is the matrix of which
+   * *this is the LU decomposition.
+   *
+   * \param b the right-hand-side of the equation to solve. Can be a vector or a matrix,
+   *          the only requirement in order for the equation to make sense is that
+   *          b.rows()==A.rows(), where A is the matrix of which *this is the LU decomposition.
+   *
+   * \returns the solution.
+   *
+   * Example: \include PartialPivLU_solve.cpp
+   * Output: \verbinclude PartialPivLU_solve.out
+   *
+   * Since this PartialPivLU class assumes anyway that the matrix A is invertible, the solution
+   * theoretically exists and is unique regardless of b.
+   *
+   * \sa TriangularView::solve(), inverse(), computeInverse()
+   */
+  template <typename Rhs>
+  inline const Solve<PartialPivLU, Rhs> solve(const MatrixBase<Rhs>& b) const;
+#endif
 
-    #ifdef EIGEN_PARSED_BY_DOXYGEN
-    /** This method returns the solution x to the equation Ax=b, where A is the matrix of which
-      * *this is the LU decomposition.
-      *
-      * \param b the right-hand-side of the equation to solve. Can be a vector or a matrix,
-      *          the only requirement in order for the equation to make sense is that
-      *          b.rows()==A.rows(), where A is the matrix of which *this is the LU decomposition.
-      *
-      * \returns the solution.
-      *
-      * Example: \include PartialPivLU_solve.cpp
-      * Output: \verbinclude PartialPivLU_solve.out
-      *
-      * Since this PartialPivLU class assumes anyway that the matrix A is invertible, the solution
-      * theoretically exists and is unique regardless of b.
-      *
-      * \sa TriangularView::solve(), inverse(), computeInverse()
-      */
-    template<typename Rhs>
-    inline const Solve<PartialPivLU, Rhs>
-    solve(const MatrixBase<Rhs>& b) const;
-    #endif
+  /** \returns an estimate of the reciprocal condition number of the matrix of which \c *this is
+      the LU decomposition.
+    */
+  inline RealScalar rcond() const {
+    eigen_assert(m_isInitialized && "PartialPivLU is not initialized.");
+    return internal::rcond_estimate_helper(m_l1_norm, *this);
+  }
 
-    /** \returns an estimate of the reciprocal condition number of the matrix of which \c *this is
-        the LU decomposition.
-      */
-    inline RealScalar rcond() const
-    {
-      eigen_assert(m_isInitialized && "PartialPivLU is not initialized.");
-      return internal::rcond_estimate_helper(m_l1_norm, *this);
-    }
+  /** \returns the inverse of the matrix of which *this is the LU decomposition.
+   *
+   * \warning The matrix being decomposed here is assumed to be invertible. If you need to check for
+   *          invertibility, use class FullPivLU instead.
+   *
+   * \sa MatrixBase::inverse(), LU::inverse()
+   */
+  inline const Inverse<PartialPivLU> inverse() const {
+    eigen_assert(m_isInitialized && "PartialPivLU is not initialized.");
+    return Inverse<PartialPivLU>(*this);
+  }
 
-    /** \returns the inverse of the matrix of which *this is the LU decomposition.
-      *
-      * \warning The matrix being decomposed here is assumed to be invertible. If you need to check for
-      *          invertibility, use class FullPivLU instead.
-      *
-      * \sa MatrixBase::inverse(), LU::inverse()
-      */
-    inline const Inverse<PartialPivLU> inverse() const
-    {
-      eigen_assert(m_isInitialized && "PartialPivLU is not initialized.");
-      return Inverse<PartialPivLU>(*this);
-    }
+  /** \returns the determinant of the matrix of which
+   * *this is the LU decomposition. It has only linear complexity
+   * (that is, O(n) where n is the dimension of the square matrix)
+   * as the LU decomposition has already been computed.
+   *
+   * \note For fixed-size matrices of size up to 4, MatrixBase::determinant() offers
+   *       optimized paths.
+   *
+   * \warning a determinant can be very big or small, so for matrices
+   * of large enough dimension, there is a risk of overflow/underflow.
+   *
+   * \sa MatrixBase::determinant()
+   */
+  Scalar determinant() const;
 
-    /** \returns the determinant of the matrix of which
-      * *this is the LU decomposition. It has only linear complexity
-      * (that is, O(n) where n is the dimension of the square matrix)
-      * as the LU decomposition has already been computed.
-      *
-      * \note For fixed-size matrices of size up to 4, MatrixBase::determinant() offers
-      *       optimized paths.
-      *
-      * \warning a determinant can be very big or small, so for matrices
-      * of large enough dimension, there is a risk of overflow/underflow.
-      *
-      * \sa MatrixBase::determinant()
-      */
-    Scalar determinant() const;
+  MatrixType reconstructedMatrix() const;
 
-    MatrixType reconstructedMatrix() const;
+  EIGEN_CONSTEXPR inline Index rows() const EIGEN_NOEXCEPT { return m_lu.rows(); }
+  EIGEN_CONSTEXPR inline Index cols() const EIGEN_NOEXCEPT { return m_lu.cols(); }
 
-    EIGEN_CONSTEXPR inline Index rows() const EIGEN_NOEXCEPT { return m_lu.rows(); }
-    EIGEN_CONSTEXPR inline Index cols() const EIGEN_NOEXCEPT { return m_lu.cols(); }
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  template <typename RhsType, typename DstType>
+  EIGEN_DEVICE_FUNC void _solve_impl(const RhsType& rhs, DstType& dst) const {
+    /* The decomposition PA = LU can be rewritten as A = P^{-1} L U.
+     * So we proceed as follows:
+     * Step 1: compute c = Pb.
+     * Step 2: replace c by the solution x to Lx = c.
+     * Step 3: replace c by the solution x to Ux = c.
+     */
 
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    template<typename RhsType, typename DstType>
-    EIGEN_DEVICE_FUNC
-    void _solve_impl(const RhsType &rhs, DstType &dst) const {
-     /* The decomposition PA = LU can be rewritten as A = P^{-1} L U.
-      * So we proceed as follows:
-      * Step 1: compute c = Pb.
-      * Step 2: replace c by the solution x to Lx = c.
-      * Step 3: replace c by the solution x to Ux = c.
-      */
+    // Step 1
+    dst = permutationP() * rhs;
 
-      // Step 1
-      dst = permutationP() * rhs;
+    // Step 2
+    m_lu.template triangularView<UnitLower>().solveInPlace(dst);
 
-      // Step 2
-      m_lu.template triangularView<UnitLower>().solveInPlace(dst);
+    // Step 3
+    m_lu.template triangularView<Upper>().solveInPlace(dst);
+  }
 
-      // Step 3
-      m_lu.template triangularView<Upper>().solveInPlace(dst);
-    }
+  template <bool Conjugate, typename RhsType, typename DstType>
+  EIGEN_DEVICE_FUNC void _solve_impl_transposed(const RhsType& rhs, DstType& dst) const {
+    /* The decomposition PA = LU can be rewritten as A^T = U^T L^T P.
+     * So we proceed as follows:
+     * Step 1: compute c as the solution to L^T c = b
+     * Step 2: replace c by the solution x to U^T x = c.
+     * Step 3: update  c = P^-1 c.
+     */
 
-    template<bool Conjugate, typename RhsType, typename DstType>
-    EIGEN_DEVICE_FUNC
-    void _solve_impl_transposed(const RhsType &rhs, DstType &dst) const {
-     /* The decomposition PA = LU can be rewritten as A^T = U^T L^T P.
-      * So we proceed as follows:
-      * Step 1: compute c as the solution to L^T c = b
-      * Step 2: replace c by the solution x to U^T x = c.
-      * Step 3: update  c = P^-1 c.
-      */
+    eigen_assert(rhs.rows() == m_lu.cols());
 
-      eigen_assert(rhs.rows() == m_lu.cols());
+    // Step 1
+    dst = m_lu.template triangularView<Upper>().transpose().template conjugateIf<Conjugate>().solve(rhs);
+    // Step 2
+    m_lu.template triangularView<UnitLower>().transpose().template conjugateIf<Conjugate>().solveInPlace(dst);
+    // Step 3
+    dst = permutationP().transpose() * dst;
+  }
+#endif
 
-      // Step 1
-      dst = m_lu.template triangularView<Upper>().transpose()
-                .template conjugateIf<Conjugate>().solve(rhs);
-      // Step 2
-      m_lu.template triangularView<UnitLower>().transpose()
-          .template conjugateIf<Conjugate>().solveInPlace(dst);
-      // Step 3
-      dst = permutationP().transpose() * dst;
-    }
-    #endif
+ protected:
+  EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
 
-  protected:
+  void compute();
 
-    EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
-
-    void compute();
-
-    MatrixType m_lu;
-    PermutationType m_p;
-    TranspositionType m_rowsTranspositions;
-    RealScalar m_l1_norm;
-    signed char m_det_p;
-    bool m_isInitialized;
+  MatrixType m_lu;
+  PermutationType m_p;
+  TranspositionType m_rowsTranspositions;
+  RealScalar m_l1_norm;
+  signed char m_det_p;
+  bool m_isInitialized;
 };
 
-template<typename MatrixType, typename PermutationIndex>
+template <typename MatrixType, typename PermutationIndex>
 PartialPivLU<MatrixType, PermutationIndex>::PartialPivLU()
-  : m_lu(),
-    m_p(),
-    m_rowsTranspositions(),
-    m_l1_norm(0),
-    m_det_p(0),
-    m_isInitialized(false)
-{
-}
+    : m_lu(), m_p(), m_rowsTranspositions(), m_l1_norm(0), m_det_p(0), m_isInitialized(false) {}
 
-template<typename MatrixType, typename PermutationIndex>
+template <typename MatrixType, typename PermutationIndex>
 PartialPivLU<MatrixType, PermutationIndex>::PartialPivLU(Index size)
-  : m_lu(size, size),
-    m_p(size),
-    m_rowsTranspositions(size),
-    m_l1_norm(0),
-    m_det_p(0),
-    m_isInitialized(false)
-{
-}
+    : m_lu(size, size), m_p(size), m_rowsTranspositions(size), m_l1_norm(0), m_det_p(0), m_isInitialized(false) {}
 
-template<typename MatrixType, typename PermutationIndex>
-template<typename InputType>
+template <typename MatrixType, typename PermutationIndex>
+template <typename InputType>
 PartialPivLU<MatrixType, PermutationIndex>::PartialPivLU(const EigenBase<InputType>& matrix)
-  : m_lu(matrix.rows(),matrix.cols()),
-    m_p(matrix.rows()),
-    m_rowsTranspositions(matrix.rows()),
-    m_l1_norm(0),
-    m_det_p(0),
-    m_isInitialized(false)
-{
+    : m_lu(matrix.rows(), matrix.cols()),
+      m_p(matrix.rows()),
+      m_rowsTranspositions(matrix.rows()),
+      m_l1_norm(0),
+      m_det_p(0),
+      m_isInitialized(false) {
   compute(matrix.derived());
 }
 
-template<typename MatrixType, typename PermutationIndex>
-template<typename InputType>
+template <typename MatrixType, typename PermutationIndex>
+template <typename InputType>
 PartialPivLU<MatrixType, PermutationIndex>::PartialPivLU(EigenBase<InputType>& matrix)
-  : m_lu(matrix.derived()),
-    m_p(matrix.rows()),
-    m_rowsTranspositions(matrix.rows()),
-    m_l1_norm(0),
-    m_det_p(0),
-    m_isInitialized(false)
-{
+    : m_lu(matrix.derived()),
+      m_p(matrix.rows()),
+      m_rowsTranspositions(matrix.rows()),
+      m_l1_norm(0),
+      m_det_p(0),
+      m_isInitialized(false) {
   compute();
 }
 
 namespace internal {
 
 /** \internal This is the blocked version of fullpivlu_unblocked() */
-template<typename Scalar, int StorageOrder, typename PivIndex, int SizeAtCompileTime=Dynamic>
-struct partial_lu_impl
-{
+template <typename Scalar, int StorageOrder, typename PivIndex, int SizeAtCompileTime = Dynamic>
+struct partial_lu_impl {
   static constexpr int UnBlockedBound = 16;
-  static constexpr bool UnBlockedAtCompileTime = SizeAtCompileTime!=Dynamic && SizeAtCompileTime<=UnBlockedBound;
+  static constexpr bool UnBlockedAtCompileTime = SizeAtCompileTime != Dynamic && SizeAtCompileTime <= UnBlockedBound;
   static constexpr int ActualSizeAtCompileTime = UnBlockedAtCompileTime ? SizeAtCompileTime : Dynamic;
   // Remaining rows and columns at compile-time:
-  static constexpr int RRows = SizeAtCompileTime==2 ? 1 : Dynamic;
-  static constexpr int RCols = SizeAtCompileTime==2 ? 1 : Dynamic;
+  static constexpr int RRows = SizeAtCompileTime == 2 ? 1 : Dynamic;
+  static constexpr int RCols = SizeAtCompileTime == 2 ? 1 : Dynamic;
   typedef Matrix<Scalar, ActualSizeAtCompileTime, ActualSizeAtCompileTime, StorageOrder> MatrixType;
   typedef Ref<MatrixType> MatrixTypeRef;
   typedef Ref<Matrix<Scalar, Dynamic, Dynamic, StorageOrder> > BlockType;
   typedef typename MatrixType::RealScalar RealScalar;
 
   /** \internal performs the LU decomposition in-place of the matrix \a lu
-    * using an unblocked algorithm.
-    *
-    * In addition, this function returns the row transpositions in the
-    * vector \a row_transpositions which must have a size equal to the number
-    * of columns of the matrix \a lu, and an integer \a nb_transpositions
-    * which returns the actual number of transpositions.
-    *
-    * \returns The index of the first pivot which is exactly zero if any, or a negative number otherwise.
-    */
-  static Index unblocked_lu(MatrixTypeRef& lu, PivIndex* row_transpositions, PivIndex& nb_transpositions)
-  {
+   * using an unblocked algorithm.
+   *
+   * In addition, this function returns the row transpositions in the
+   * vector \a row_transpositions which must have a size equal to the number
+   * of columns of the matrix \a lu, and an integer \a nb_transpositions
+   * which returns the actual number of transpositions.
+   *
+   * \returns The index of the first pivot which is exactly zero if any, or a negative number otherwise.
+   */
+  static Index unblocked_lu(MatrixTypeRef& lu, PivIndex* row_transpositions, PivIndex& nb_transpositions) {
     typedef scalar_score_coeff_op<Scalar> Scoring;
     typedef typename Scoring::result_type Score;
     const Index rows = lu.rows();
     const Index cols = lu.cols();
-    const Index size = (std::min)(rows,cols);
+    const Index size = (std::min)(rows, cols);
     // For small compile-time matrices it is worth processing the last row separately:
     //  speedup: +100% for 2x2, +10% for others.
-    const Index endk = UnBlockedAtCompileTime ? size-1 : size;
+    const Index endk = UnBlockedAtCompileTime ? size - 1 : size;
     nb_transpositions = 0;
     Index first_zero_pivot = -1;
-    for(Index k = 0; k < endk; ++k)
-    {
-      int rrows = internal::convert_index<int>(rows-k-1);
-      int rcols = internal::convert_index<int>(cols-k-1);
+    for (Index k = 0; k < endk; ++k) {
+      int rrows = internal::convert_index<int>(rows - k - 1);
+      int rcols = internal::convert_index<int>(cols - k - 1);
 
       Index row_of_biggest_in_col;
-      Score biggest_in_corner
-        = lu.col(k).tail(rows-k).unaryExpr(Scoring()).maxCoeff(&row_of_biggest_in_col);
+      Score biggest_in_corner = lu.col(k).tail(rows - k).unaryExpr(Scoring()).maxCoeff(&row_of_biggest_in_col);
       row_of_biggest_in_col += k;
 
       row_transpositions[k] = PivIndex(row_of_biggest_in_col);
 
-      if(!numext::is_exactly_zero(biggest_in_corner))
-      {
-        if(k != row_of_biggest_in_col)
-        {
+      if (!numext::is_exactly_zero(biggest_in_corner)) {
+        if (k != row_of_biggest_in_col) {
           lu.row(k).swap(lu.row(row_of_biggest_in_col));
           ++nb_transpositions;
         }
 
-        lu.col(k).tail(fix<RRows>(rrows)) /= lu.coeff(k,k);
-      }
-      else if(first_zero_pivot==-1)
-      {
+        lu.col(k).tail(fix<RRows>(rrows)) /= lu.coeff(k, k);
+      } else if (first_zero_pivot == -1) {
         // the pivot is exactly zero, we record the index of the first pivot which is exactly 0,
         // and continue the factorization such we still have A = PLU
         first_zero_pivot = k;
       }
 
-      if(k<rows-1)
-        lu.bottomRightCorner(fix<RRows>(rrows),fix<RCols>(rcols)).noalias() -= lu.col(k).tail(fix<RRows>(rrows)) * lu.row(k).tail(fix<RCols>(rcols));
+      if (k < rows - 1)
+        lu.bottomRightCorner(fix<RRows>(rrows), fix<RCols>(rcols)).noalias() -=
+            lu.col(k).tail(fix<RRows>(rrows)) * lu.row(k).tail(fix<RCols>(rcols));
     }
 
     // special handling of the last entry
-    if(UnBlockedAtCompileTime)
-    {
+    if (UnBlockedAtCompileTime) {
       Index k = endk;
       row_transpositions[k] = PivIndex(k);
-      if (numext::is_exactly_zero(Scoring()(lu(k, k))) && first_zero_pivot == -1)
-        first_zero_pivot = k;
+      if (numext::is_exactly_zero(Scoring()(lu(k, k))) && first_zero_pivot == -1) first_zero_pivot = k;
     }
 
     return first_zero_pivot;
   }
 
   /** \internal performs the LU decomposition in-place of the matrix represented
-    * by the variables \a rows, \a cols, \a lu_data, and \a lu_stride using a
-    * recursive, blocked algorithm.
-    *
-    * In addition, this function returns the row transpositions in the
-    * vector \a row_transpositions which must have a size equal to the number
-    * of columns of the matrix \a lu, and an integer \a nb_transpositions
-    * which returns the actual number of transpositions.
-    *
-    * \returns The index of the first pivot which is exactly zero if any, or a negative number otherwise.
-    *
-    * \note This very low level interface using pointers, etc. is to:
-    *   1 - reduce the number of instantiations to the strict minimum
-    *   2 - avoid infinite recursion of the instantiations with Block<Block<Block<...> > >
-    */
-  static Index blocked_lu(Index rows, Index cols, Scalar* lu_data, Index luStride, PivIndex* row_transpositions, PivIndex& nb_transpositions, Index maxBlockSize=256)
-  {
-    MatrixTypeRef lu = MatrixType::Map(lu_data,rows, cols, OuterStride<>(luStride));
+   * by the variables \a rows, \a cols, \a lu_data, and \a lu_stride using a
+   * recursive, blocked algorithm.
+   *
+   * In addition, this function returns the row transpositions in the
+   * vector \a row_transpositions which must have a size equal to the number
+   * of columns of the matrix \a lu, and an integer \a nb_transpositions
+   * which returns the actual number of transpositions.
+   *
+   * \returns The index of the first pivot which is exactly zero if any, or a negative number otherwise.
+   *
+   * \note This very low level interface using pointers, etc. is to:
+   *   1 - reduce the number of instantiations to the strict minimum
+   *   2 - avoid infinite recursion of the instantiations with Block<Block<Block<...> > >
+   */
+  static Index blocked_lu(Index rows, Index cols, Scalar* lu_data, Index luStride, PivIndex* row_transpositions,
+                          PivIndex& nb_transpositions, Index maxBlockSize = 256) {
+    MatrixTypeRef lu = MatrixType::Map(lu_data, rows, cols, OuterStride<>(luStride));
 
-    const Index size = (std::min)(rows,cols);
+    const Index size = (std::min)(rows, cols);
 
     // if the matrix is too small, no blocking:
-    if(UnBlockedAtCompileTime || size<=UnBlockedBound)
-    {
+    if (UnBlockedAtCompileTime || size <= UnBlockedBound) {
       return unblocked_lu(lu, row_transpositions, nb_transpositions);
     }
 
@@ -444,51 +403,46 @@
     // of the matrix so that there is enough sub blocks:
     Index blockSize;
     {
-      blockSize = size/8;
-      blockSize = (blockSize/16)*16;
-      blockSize = (std::min)((std::max)(blockSize,Index(8)), maxBlockSize);
+      blockSize = size / 8;
+      blockSize = (blockSize / 16) * 16;
+      blockSize = (std::min)((std::max)(blockSize, Index(8)), maxBlockSize);
     }
 
     nb_transpositions = 0;
     Index first_zero_pivot = -1;
-    for(Index k = 0; k < size; k+=blockSize)
-    {
-      Index bs = (std::min)(size-k,blockSize); // actual size of the block
-      Index trows = rows - k - bs; // trailing rows
-      Index tsize = size - k - bs; // trailing size
+    for (Index k = 0; k < size; k += blockSize) {
+      Index bs = (std::min)(size - k, blockSize);  // actual size of the block
+      Index trows = rows - k - bs;                 // trailing rows
+      Index tsize = size - k - bs;                 // trailing size
 
       // partition the matrix:
       //                          A00 | A01 | A02
       // lu  = A_0 | A_1 | A_2 =  A10 | A11 | A12
       //                          A20 | A21 | A22
-      BlockType A_0 = lu.block(0,0,rows,k);
-      BlockType A_2 = lu.block(0,k+bs,rows,tsize);
-      BlockType A11 = lu.block(k,k,bs,bs);
-      BlockType A12 = lu.block(k,k+bs,bs,tsize);
-      BlockType A21 = lu.block(k+bs,k,trows,bs);
-      BlockType A22 = lu.block(k+bs,k+bs,trows,tsize);
+      BlockType A_0 = lu.block(0, 0, rows, k);
+      BlockType A_2 = lu.block(0, k + bs, rows, tsize);
+      BlockType A11 = lu.block(k, k, bs, bs);
+      BlockType A12 = lu.block(k, k + bs, bs, tsize);
+      BlockType A21 = lu.block(k + bs, k, trows, bs);
+      BlockType A22 = lu.block(k + bs, k + bs, trows, tsize);
 
       PivIndex nb_transpositions_in_panel;
       // recursively call the blocked LU algorithm on [A11^T A21^T]^T
       // with a very small blocking size:
-      Index ret = blocked_lu(trows+bs, bs, &lu.coeffRef(k,k), luStride,
-                   row_transpositions+k, nb_transpositions_in_panel, 16);
-      if(ret>=0 && first_zero_pivot==-1)
-        first_zero_pivot = k+ret;
+      Index ret = blocked_lu(trows + bs, bs, &lu.coeffRef(k, k), luStride, row_transpositions + k,
+                             nb_transpositions_in_panel, 16);
+      if (ret >= 0 && first_zero_pivot == -1) first_zero_pivot = k + ret;
 
       nb_transpositions += nb_transpositions_in_panel;
       // update permutations and apply them to A_0
-      for(Index i=k; i<k+bs; ++i)
-      {
+      for (Index i = k; i < k + bs; ++i) {
         Index piv = (row_transpositions[i] += internal::convert_index<PivIndex>(k));
         A_0.row(i).swap(A_0.row(piv));
       }
 
-      if(trows)
-      {
+      if (trows) {
         // apply permutations to A_2
-        for(Index i=k;i<k+bs; ++i)
-          A_2.row(i).swap(A_2.row(row_transpositions[i]));
+        for (Index i = k; i < k + bs; ++i) A_2.row(i).swap(A_2.row(row_transpositions[i]));
 
         // A12 = A11^-1 A12
         A11.template triangularView<UnitLower>().solveInPlace(A12);
@@ -501,33 +455,33 @@
 };
 
 /** \internal performs the LU decomposition with partial pivoting in-place.
-  */
-template<typename MatrixType, typename TranspositionType>
-void partial_lu_inplace(MatrixType& lu, TranspositionType& row_transpositions, typename TranspositionType::StorageIndex& nb_transpositions)
-{
+ */
+template <typename MatrixType, typename TranspositionType>
+void partial_lu_inplace(MatrixType& lu, TranspositionType& row_transpositions,
+                        typename TranspositionType::StorageIndex& nb_transpositions) {
   // Special-case of zero matrix.
   if (lu.rows() == 0 || lu.cols() == 0) {
     nb_transpositions = 0;
     return;
   }
   eigen_assert(lu.cols() == row_transpositions.size());
-  eigen_assert(row_transpositions.size() < 2 || (&row_transpositions.coeffRef(1)-&row_transpositions.coeffRef(0)) == 1);
+  eigen_assert(row_transpositions.size() < 2 ||
+               (&row_transpositions.coeffRef(1) - &row_transpositions.coeffRef(0)) == 1);
 
-  partial_lu_impl
-    < typename MatrixType::Scalar, MatrixType::Flags&RowMajorBit?RowMajor:ColMajor,
-      typename TranspositionType::StorageIndex,
-      internal::min_size_prefer_fixed(MatrixType::RowsAtCompileTime, MatrixType::ColsAtCompileTime)>
-    ::blocked_lu(lu.rows(), lu.cols(), &lu.coeffRef(0,0), lu.outerStride(), &row_transpositions.coeffRef(0), nb_transpositions);
+  partial_lu_impl<typename MatrixType::Scalar, MatrixType::Flags & RowMajorBit ? RowMajor : ColMajor,
+                  typename TranspositionType::StorageIndex,
+                  internal::min_size_prefer_fixed(MatrixType::RowsAtCompileTime, MatrixType::ColsAtCompileTime)>::
+      blocked_lu(lu.rows(), lu.cols(), &lu.coeffRef(0, 0), lu.outerStride(), &row_transpositions.coeffRef(0),
+                 nb_transpositions);
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-template<typename MatrixType, typename PermutationIndex>
-void PartialPivLU<MatrixType, PermutationIndex>::compute()
-{
-  eigen_assert(m_lu.rows()<NumTraits<PermutationIndex>::highest());
+template <typename MatrixType, typename PermutationIndex>
+void PartialPivLU<MatrixType, PermutationIndex>::compute() {
+  eigen_assert(m_lu.rows() < NumTraits<PermutationIndex>::highest());
 
-  if(m_lu.cols()>0)
+  if (m_lu.cols() > 0)
     m_l1_norm = m_lu.cwiseAbs().colwise().sum().maxCoeff();
   else
     m_l1_norm = RealScalar(0);
@@ -539,16 +493,16 @@
 
   typename TranspositionType::StorageIndex nb_transpositions;
   internal::partial_lu_inplace(m_lu, m_rowsTranspositions, nb_transpositions);
-  m_det_p = (nb_transpositions%2) ? -1 : 1;
+  m_det_p = (nb_transpositions % 2) ? -1 : 1;
 
   m_p = m_rowsTranspositions;
 
   m_isInitialized = true;
 }
 
-template<typename MatrixType, typename PermutationIndex>
-typename PartialPivLU<MatrixType, PermutationIndex>::Scalar PartialPivLU<MatrixType, PermutationIndex>::determinant() const
-{
+template <typename MatrixType, typename PermutationIndex>
+typename PartialPivLU<MatrixType, PermutationIndex>::Scalar PartialPivLU<MatrixType, PermutationIndex>::determinant()
+    const {
   eigen_assert(m_isInitialized && "PartialPivLU is not initialized.");
   return Scalar(m_det_p) * m_lu.diagonal().prod();
 }
@@ -556,13 +510,11 @@
 /** \returns the matrix represented by the decomposition,
  * i.e., it returns the product: P^{-1} L U.
  * This function is provided for debug purpose. */
-template<typename MatrixType, typename PermutationIndex>
-MatrixType PartialPivLU<MatrixType, PermutationIndex>::reconstructedMatrix() const
-{
+template <typename MatrixType, typename PermutationIndex>
+MatrixType PartialPivLU<MatrixType, PermutationIndex>::reconstructedMatrix() const {
   eigen_assert(m_isInitialized && "LU is not initialized.");
   // LU
-  MatrixType res = m_lu.template triangularView<UnitLower>().toDenseMatrix()
-                 * m_lu.template triangularView<Upper>();
+  MatrixType res = m_lu.template triangularView<UnitLower>().toDenseMatrix() * m_lu.template triangularView<Upper>();
 
   // P^{-1}(LU)
   res = m_p.inverse() * res;
@@ -575,50 +527,49 @@
 namespace internal {
 
 /***** Implementation of inverse() *****************************************************/
-template<typename DstXprType, typename MatrixType, typename PermutationIndex>
-struct Assignment<DstXprType, Inverse<PartialPivLU<MatrixType, PermutationIndex> >, internal::assign_op<typename DstXprType::Scalar,typename PartialPivLU<MatrixType, PermutationIndex>::Scalar>, Dense2Dense>
-{
+template <typename DstXprType, typename MatrixType, typename PermutationIndex>
+struct Assignment<
+    DstXprType, Inverse<PartialPivLU<MatrixType, PermutationIndex> >,
+    internal::assign_op<typename DstXprType::Scalar, typename PartialPivLU<MatrixType, PermutationIndex>::Scalar>,
+    Dense2Dense> {
   typedef PartialPivLU<MatrixType, PermutationIndex> LuType;
   typedef Inverse<LuType> SrcXprType;
-  static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar,typename LuType::Scalar> &)
-  {
+  static void run(DstXprType& dst, const SrcXprType& src,
+                  const internal::assign_op<typename DstXprType::Scalar, typename LuType::Scalar>&) {
     dst = src.nestedExpression().solve(MatrixType::Identity(src.rows(), src.cols()));
   }
 };
-} // end namespace internal
+}  // end namespace internal
 
 /******** MatrixBase methods *******/
 
 /** \lu_module
-  *
-  * \return the partial-pivoting LU decomposition of \c *this.
-  *
-  * \sa class PartialPivLU
-  */
-template<typename Derived>
-template<typename PermutationIndex>
+ *
+ * \return the partial-pivoting LU decomposition of \c *this.
+ *
+ * \sa class PartialPivLU
+ */
+template <typename Derived>
+template <typename PermutationIndex>
 inline const PartialPivLU<typename MatrixBase<Derived>::PlainObject, PermutationIndex>
-MatrixBase<Derived>::partialPivLu() const
-{
+MatrixBase<Derived>::partialPivLu() const {
   return PartialPivLU<PlainObject, PermutationIndex>(eval());
 }
 
 /** \lu_module
-  *
-  * Synonym of partialPivLu().
-  *
-  * \return the partial-pivoting LU decomposition of \c *this.
-  *
-  * \sa class PartialPivLU
-  */
-template<typename Derived>
-template<typename PermutationIndex>
-inline const PartialPivLU<typename MatrixBase<Derived>::PlainObject, PermutationIndex>
-MatrixBase<Derived>::lu() const
-{
+ *
+ * Synonym of partialPivLu().
+ *
+ * \return the partial-pivoting LU decomposition of \c *this.
+ *
+ * \sa class PartialPivLU
+ */
+template <typename Derived>
+template <typename PermutationIndex>
+inline const PartialPivLU<typename MatrixBase<Derived>::PlainObject, PermutationIndex> MatrixBase<Derived>::lu() const {
   return PartialPivLU<PlainObject, PermutationIndex>(eval());
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_PARTIALLU_H
+#endif  // EIGEN_PARTIALLU_H
diff --git a/Eigen/src/LU/PartialPivLU_LAPACKE.h b/Eigen/src/LU/PartialPivLU_LAPACKE.h
index 8501b61..086c3c3 100644
--- a/Eigen/src/LU/PartialPivLU_LAPACKE.h
+++ b/Eigen/src/LU/PartialPivLU_LAPACKE.h
@@ -36,7 +36,7 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
@@ -45,15 +45,14 @@
 //        Generic lapacke partial lu implementation that converts arguments and dispatches to the function above
 // -------------------------------------------------------------------------------------------------------------------
 
-template<typename Scalar, int StorageOrder>
+template <typename Scalar, int StorageOrder>
 struct lapacke_partial_lu {
   /** \internal performs the LU decomposition in-place of the matrix represented */
   static lapack_int blocked_lu(Index rows, Index cols, Scalar* lu_data, Index luStride, lapack_int* row_transpositions,
-  lapack_int& nb_transpositions, lapack_int maxBlockSize=256)
-  {
+                               lapack_int& nb_transpositions, lapack_int maxBlockSize = 256) {
     EIGEN_UNUSED_VARIABLE(maxBlockSize);
     // Set up parameters for getrf
-    lapack_int matrix_order = StorageOrder==RowMajor ? LAPACK_ROW_MAJOR : LAPACK_COL_MAJOR;
+    lapack_int matrix_order = StorageOrder == RowMajor ? LAPACK_ROW_MAJOR : LAPACK_COL_MAJOR;
     lapack_int lda = to_lapack(luStride);
     Scalar* a = lu_data;
     lapack_int* ipiv = row_transpositions;
@@ -61,10 +60,10 @@
     lapack_int n = to_lapack(cols);
     nb_transpositions = 0;
 
-    lapack_int info = getrf(matrix_order, m, n, to_lapack(a), lda, ipiv );
+    lapack_int info = getrf(matrix_order, m, n, to_lapack(a), lda, ipiv);
     eigen_assert(info >= 0);
 
-    for(int i=0; i<m; i++) {
+    for (int i = 0; i < m; i++) {
       ipiv[i]--;
       if (ipiv[i] != i) nb_transpositions++;
     }
@@ -72,16 +71,17 @@
     return first_zero_pivot;
   }
 };
-} // end namespace lapacke_helpers
+}  // end namespace lapacke_helpers
 
 /*
- * Here, we just put the generic implementation from lapacke_partial_lu into a partial specialization of the partial_lu_impl
- * type. This specialization is more specialized than the generic implementations that Eigen implements, so if the
- * Scalar type matches they will be chosen.
+ * Here, we just put the generic implementation from lapacke_partial_lu into a partial specialization of the
+ * partial_lu_impl type. This specialization is more specialized than the generic implementations that Eigen implements,
+ * so if the Scalar type matches they will be chosen.
  */
-#define EIGEN_LAPACKE_PARTIAL_LU(EIGTYPE) \
-template<int StorageOrder>                \
-struct partial_lu_impl<EIGTYPE, StorageOrder, lapack_int, Dynamic> : public lapacke_helpers::lapacke_partial_lu<EIGTYPE, StorageOrder> {};
+#define EIGEN_LAPACKE_PARTIAL_LU(EIGTYPE)                            \
+  template <int StorageOrder>                                        \
+  struct partial_lu_impl<EIGTYPE, StorageOrder, lapack_int, Dynamic> \
+      : public lapacke_helpers::lapacke_partial_lu<EIGTYPE, StorageOrder> {};
 
 EIGEN_LAPACKE_PARTIAL_LU(double)
 EIGEN_LAPACKE_PARTIAL_LU(float)
@@ -90,8 +90,8 @@
 
 #undef EIGEN_LAPACKE_PARTIAL_LU
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_PARTIALLU_LAPACK_H
+#endif  // EIGEN_PARTIALLU_LAPACK_H
diff --git a/Eigen/src/LU/arch/InverseSize4.h b/Eigen/src/LU/arch/InverseSize4.h
index 2cd92b5..f0ddb2f 100644
--- a/Eigen/src/LU/arch/InverseSize4.h
+++ b/Eigen/src/LU/arch/InverseSize4.h
@@ -42,49 +42,43 @@
 // These routines requires bit manipulation of the sign, which is not compatible
 // with fastmath.
 #pragma GCC push_options
-#pragma GCC optimize ("no-fast-math")
+#pragma GCC optimize("no-fast-math")
 #endif
 
-namespace Eigen
-{
-namespace internal
-{
+namespace Eigen {
+namespace internal {
 template <typename MatrixType, typename ResultType>
-struct compute_inverse_size4<Architecture::Target, float, MatrixType, ResultType>
-{
-  enum
-  {
+struct compute_inverse_size4<Architecture::Target, float, MatrixType, ResultType> {
+  enum {
     MatrixAlignment = traits<MatrixType>::Alignment,
     ResultAlignment = traits<ResultType>::Alignment,
     StorageOrdersMatch = (MatrixType::Flags & RowMajorBit) == (ResultType::Flags & RowMajorBit)
   };
-  typedef std::conditional_t<(MatrixType::Flags & LinearAccessBit), MatrixType const &, typename MatrixType::PlainObject> ActualMatrixType;
+  typedef std::conditional_t<(MatrixType::Flags & LinearAccessBit), MatrixType const &,
+                             typename MatrixType::PlainObject>
+      ActualMatrixType;
 
-  static void run(const MatrixType &mat, ResultType &result)
-  {
+  static void run(const MatrixType &mat, ResultType &result) {
     ActualMatrixType matrix(mat);
 
-    const float* data = matrix.data();
+    const float *data = matrix.data();
     const Index stride = matrix.innerStride();
-    Packet4f L1 = ploadt<Packet4f,MatrixAlignment>(data);
-    Packet4f L2 = ploadt<Packet4f,MatrixAlignment>(data + stride*4);
-    Packet4f L3 = ploadt<Packet4f,MatrixAlignment>(data + stride*8);
-    Packet4f L4 = ploadt<Packet4f,MatrixAlignment>(data + stride*12);
+    Packet4f L1 = ploadt<Packet4f, MatrixAlignment>(data);
+    Packet4f L2 = ploadt<Packet4f, MatrixAlignment>(data + stride * 4);
+    Packet4f L3 = ploadt<Packet4f, MatrixAlignment>(data + stride * 8);
+    Packet4f L4 = ploadt<Packet4f, MatrixAlignment>(data + stride * 12);
 
     // Four 2x2 sub-matrices of the input matrix
     // input = [[A, B],
     //          [C, D]]
     Packet4f A, B, C, D;
 
-    if (!StorageOrdersMatch)
-    {
+    if (!StorageOrdersMatch) {
       A = vec4f_unpacklo(L1, L2);
       B = vec4f_unpacklo(L3, L4);
       C = vec4f_unpackhi(L1, L2);
       D = vec4f_unpackhi(L3, L4);
-    }
-    else
-    {
+    } else {
       A = vec4f_movelh(L1, L2);
       B = vec4f_movehl(L2, L1);
       C = vec4f_movelh(L3, L4);
@@ -175,21 +169,17 @@
 // same algorithm as above, except that each operand is split into
 // halves for two registers to hold.
 template <typename MatrixType, typename ResultType>
-struct compute_inverse_size4<Architecture::Target, double, MatrixType, ResultType>
-{
-  enum
-  {
+struct compute_inverse_size4<Architecture::Target, double, MatrixType, ResultType> {
+  enum {
     MatrixAlignment = traits<MatrixType>::Alignment,
     ResultAlignment = traits<ResultType>::Alignment,
     StorageOrdersMatch = (MatrixType::Flags & RowMajorBit) == (ResultType::Flags & RowMajorBit)
   };
-  typedef std::conditional_t<(MatrixType::Flags & LinearAccessBit),
-                         MatrixType const &,
-                         typename MatrixType::PlainObject>
+  typedef std::conditional_t<(MatrixType::Flags & LinearAccessBit), MatrixType const &,
+                             typename MatrixType::PlainObject>
       ActualMatrixType;
 
-  static void run(const MatrixType &mat, ResultType &result)
-  {
+  static void run(const MatrixType &mat, ResultType &result) {
     ActualMatrixType matrix(mat);
 
     // Four 2x2 sub-matrices of the input matrix, each is further divided into upper and lower
@@ -201,26 +191,23 @@
 
     Packet2d A1, A2, B1, B2, C1, C2, D1, D2;
 
-    const double* data = matrix.data();
+    const double *data = matrix.data();
     const Index stride = matrix.innerStride();
-    if (StorageOrdersMatch)
-    {
-      A1 = ploadt<Packet2d,MatrixAlignment>(data + stride*0);
-      B1 = ploadt<Packet2d,MatrixAlignment>(data + stride*2);
-      A2 = ploadt<Packet2d,MatrixAlignment>(data + stride*4);
-      B2 = ploadt<Packet2d,MatrixAlignment>(data + stride*6);
-      C1 = ploadt<Packet2d,MatrixAlignment>(data + stride*8);
-      D1 = ploadt<Packet2d,MatrixAlignment>(data + stride*10);
-      C2 = ploadt<Packet2d,MatrixAlignment>(data + stride*12);
-      D2 = ploadt<Packet2d,MatrixAlignment>(data + stride*14);
-    }
-    else
-    {
+    if (StorageOrdersMatch) {
+      A1 = ploadt<Packet2d, MatrixAlignment>(data + stride * 0);
+      B1 = ploadt<Packet2d, MatrixAlignment>(data + stride * 2);
+      A2 = ploadt<Packet2d, MatrixAlignment>(data + stride * 4);
+      B2 = ploadt<Packet2d, MatrixAlignment>(data + stride * 6);
+      C1 = ploadt<Packet2d, MatrixAlignment>(data + stride * 8);
+      D1 = ploadt<Packet2d, MatrixAlignment>(data + stride * 10);
+      C2 = ploadt<Packet2d, MatrixAlignment>(data + stride * 12);
+      D2 = ploadt<Packet2d, MatrixAlignment>(data + stride * 14);
+    } else {
       Packet2d temp;
-      A1 = ploadt<Packet2d,MatrixAlignment>(data + stride*0);
-      C1 = ploadt<Packet2d,MatrixAlignment>(data + stride*2);
-      A2 = ploadt<Packet2d,MatrixAlignment>(data + stride*4);
-      C2 = ploadt<Packet2d,MatrixAlignment>(data + stride*6);
+      A1 = ploadt<Packet2d, MatrixAlignment>(data + stride * 0);
+      C1 = ploadt<Packet2d, MatrixAlignment>(data + stride * 2);
+      A2 = ploadt<Packet2d, MatrixAlignment>(data + stride * 4);
+      C2 = ploadt<Packet2d, MatrixAlignment>(data + stride * 6);
       temp = A1;
       A1 = vec2d_unpacklo(A1, A2);
       A2 = vec2d_unpackhi(temp, A2);
@@ -229,10 +216,10 @@
       C1 = vec2d_unpacklo(C1, C2);
       C2 = vec2d_unpackhi(temp, C2);
 
-      B1 = ploadt<Packet2d,MatrixAlignment>(data + stride*8);
-      D1 = ploadt<Packet2d,MatrixAlignment>(data + stride*10);
-      B2 = ploadt<Packet2d,MatrixAlignment>(data + stride*12);
-      D2 = ploadt<Packet2d,MatrixAlignment>(data + stride*14);
+      B1 = ploadt<Packet2d, MatrixAlignment>(data + stride * 8);
+      D1 = ploadt<Packet2d, MatrixAlignment>(data + stride * 10);
+      B2 = ploadt<Packet2d, MatrixAlignment>(data + stride * 12);
+      D2 = ploadt<Packet2d, MatrixAlignment>(data + stride * 14);
 
       temp = B1;
       B1 = vec2d_unpacklo(B1, B2);
@@ -356,8 +343,8 @@
   }
 };
 #endif
-} // namespace internal
-} // namespace Eigen
+}  // namespace internal
+}  // namespace Eigen
 
 #if EIGEN_COMP_GNUC_STRICT
 #pragma GCC pop_options
diff --git a/Eigen/src/MetisSupport/MetisSupport.h b/Eigen/src/MetisSupport/MetisSupport.h
index 93fe31b..6c7bf94 100644
--- a/Eigen/src/MetisSupport/MetisSupport.h
+++ b/Eigen/src/MetisSupport/MetisSupport.h
@@ -15,126 +15,111 @@
 namespace Eigen {
 /**
  * Get the fill-reducing ordering from the METIS package
- * 
- * If A is the original matrix and Ap is the permuted matrix, 
+ *
+ * If A is the original matrix and Ap is the permuted matrix,
  * the fill-reducing permutation is defined as follows :
- * Row (column) i of A is the matperm(i) row (column) of Ap. 
+ * Row (column) i of A is the matperm(i) row (column) of Ap.
  * WARNING: As computed by METIS, this corresponds to the vector iperm (instead of perm)
  */
 template <typename StorageIndex>
-class MetisOrdering
-{
-public:
-  typedef PermutationMatrix<Dynamic,Dynamic,StorageIndex> PermutationType;
-  typedef Matrix<StorageIndex,Dynamic,1> IndexVector; 
-  
+class MetisOrdering {
+ public:
+  typedef PermutationMatrix<Dynamic, Dynamic, StorageIndex> PermutationType;
+  typedef Matrix<StorageIndex, Dynamic, 1> IndexVector;
+
   template <typename MatrixType>
-  void get_symmetrized_graph(const MatrixType& A)
-  {
-    Index m = A.cols(); 
+  void get_symmetrized_graph(const MatrixType& A) {
+    Index m = A.cols();
     eigen_assert((A.rows() == A.cols()) && "ONLY FOR SQUARED MATRICES");
-    // Get the transpose of the input matrix 
-    MatrixType At = A.transpose(); 
+    // Get the transpose of the input matrix
+    MatrixType At = A.transpose();
     // Get the number of nonzeros elements in each row/col of At+A
-    Index TotNz = 0; 
-    IndexVector visited(m); 
-    visited.setConstant(-1); 
-    for (StorageIndex j = 0; j < m; j++)
-    {
+    Index TotNz = 0;
+    IndexVector visited(m);
+    visited.setConstant(-1);
+    for (StorageIndex j = 0; j < m; j++) {
       // Compute the union structure of of A(j,:) and At(j,:)
-      visited(j) = j; // Do not include the diagonal element
+      visited(j) = j;  // Do not include the diagonal element
       // Get the nonzeros in row/column j of A
-      for (typename MatrixType::InnerIterator it(A, j); it; ++it)
-      {
-        Index idx = it.index(); // Get the row index (for column major) or column index (for row major)
-        if (visited(idx) != j ) 
-        {
-          visited(idx) = j; 
-          ++TotNz; 
+      for (typename MatrixType::InnerIterator it(A, j); it; ++it) {
+        Index idx = it.index();  // Get the row index (for column major) or column index (for row major)
+        if (visited(idx) != j) {
+          visited(idx) = j;
+          ++TotNz;
         }
       }
-      //Get the nonzeros in row/column j of At
-      for (typename MatrixType::InnerIterator it(At, j); it; ++it)
-      {
-        Index idx = it.index(); 
-        if(visited(idx) != j)
-        {
-          visited(idx) = j; 
-          ++TotNz; 
+      // Get the nonzeros in row/column j of At
+      for (typename MatrixType::InnerIterator it(At, j); it; ++it) {
+        Index idx = it.index();
+        if (visited(idx) != j) {
+          visited(idx) = j;
+          ++TotNz;
         }
       }
     }
     // Reserve place for A + At
-    m_indexPtr.resize(m+1);
-    m_innerIndices.resize(TotNz); 
+    m_indexPtr.resize(m + 1);
+    m_innerIndices.resize(TotNz);
 
-    // Now compute the real adjacency list of each column/row 
-    visited.setConstant(-1); 
-    StorageIndex CurNz = 0; 
-    for (StorageIndex j = 0; j < m; j++)
-    {
-      m_indexPtr(j) = CurNz; 
-      
-      visited(j) = j; // Do not include the diagonal element
+    // Now compute the real adjacency list of each column/row
+    visited.setConstant(-1);
+    StorageIndex CurNz = 0;
+    for (StorageIndex j = 0; j < m; j++) {
+      m_indexPtr(j) = CurNz;
+
+      visited(j) = j;  // Do not include the diagonal element
       // Add the pattern of row/column j of A to A+At
-      for (typename MatrixType::InnerIterator it(A,j); it; ++it)
-      {
-        StorageIndex idx = it.index(); // Get the row index (for column major) or column index (for row major)
-        if (visited(idx) != j ) 
-        {
-          visited(idx) = j; 
-          m_innerIndices(CurNz) = idx; 
-          CurNz++; 
+      for (typename MatrixType::InnerIterator it(A, j); it; ++it) {
+        StorageIndex idx = it.index();  // Get the row index (for column major) or column index (for row major)
+        if (visited(idx) != j) {
+          visited(idx) = j;
+          m_innerIndices(CurNz) = idx;
+          CurNz++;
         }
       }
-      //Add the pattern of row/column j of At to A+At
-      for (typename MatrixType::InnerIterator it(At, j); it; ++it)
-      {
-        StorageIndex idx = it.index(); 
-        if(visited(idx) != j)
-        {
-          visited(idx) = j; 
-          m_innerIndices(CurNz) = idx; 
-          ++CurNz; 
+      // Add the pattern of row/column j of At to A+At
+      for (typename MatrixType::InnerIterator it(At, j); it; ++it) {
+        StorageIndex idx = it.index();
+        if (visited(idx) != j) {
+          visited(idx) = j;
+          m_innerIndices(CurNz) = idx;
+          ++CurNz;
         }
       }
     }
-    m_indexPtr(m) = CurNz;    
+    m_indexPtr(m) = CurNz;
   }
-  
+
   template <typename MatrixType>
-  void operator() (const MatrixType& A, PermutationType& matperm)
-  {
-     StorageIndex m = internal::convert_index<StorageIndex>(A.cols()); // must be StorageIndex, because it is passed by address to METIS
-     IndexVector perm(m),iperm(m); 
-    // First, symmetrize the matrix graph. 
-     get_symmetrized_graph(A); 
-     int output_error;
-     
-     // Call the fill-reducing routine from METIS 
-     output_error = METIS_NodeND(&m, m_indexPtr.data(), m_innerIndices.data(), NULL, NULL, perm.data(), iperm.data());
-     
-    if(output_error != METIS_OK) 
-    {
-      //FIXME The ordering interface should define a class of possible errors 
-     std::cerr << "ERROR WHILE CALLING THE METIS PACKAGE \n"; 
-     return; 
+  void operator()(const MatrixType& A, PermutationType& matperm) {
+    StorageIndex m = internal::convert_index<StorageIndex>(
+        A.cols());  // must be StorageIndex, because it is passed by address to METIS
+    IndexVector perm(m), iperm(m);
+    // First, symmetrize the matrix graph.
+    get_symmetrized_graph(A);
+    int output_error;
+
+    // Call the fill-reducing routine from METIS
+    output_error = METIS_NodeND(&m, m_indexPtr.data(), m_innerIndices.data(), NULL, NULL, perm.data(), iperm.data());
+
+    if (output_error != METIS_OK) {
+      // FIXME The ordering interface should define a class of possible errors
+      std::cerr << "ERROR WHILE CALLING THE METIS PACKAGE \n";
+      return;
     }
-    
-    // Get the fill-reducing permutation 
-    //NOTE:  If Ap is the permuted matrix then perm and iperm vectors are defined as follows 
+
+    // Get the fill-reducing permutation
+    // NOTE:  If Ap is the permuted matrix then perm and iperm vectors are defined as follows
     // Row (column) i of Ap is the perm(i) row(column) of A, and row (column) i of A is the iperm(i) row(column) of Ap
-    
-     matperm.resize(m);
-     for (int j = 0; j < m; j++)
-       matperm.indices()(iperm(j)) = j;
-   
+
+    matperm.resize(m);
+    for (int j = 0; j < m; j++) matperm.indices()(iperm(j)) = j;
   }
-  
-  protected:
-    IndexVector m_indexPtr; // Pointer to the adjacenccy list of each row/column
-    IndexVector m_innerIndices; // Adjacency list 
+
+ protected:
+  IndexVector m_indexPtr;      // Pointer to the adjacenccy list of each row/column
+  IndexVector m_innerIndices;  // Adjacency list
 };
 
-}// end namespace eigen 
+}  // namespace Eigen
 #endif
diff --git a/Eigen/src/OrderingMethods/Amd.h b/Eigen/src/OrderingMethods/Amd.h
index 0d01348..0b0bf02 100644
--- a/Eigen/src/OrderingMethods/Amd.h
+++ b/Eigen/src/OrderingMethods/Amd.h
@@ -24,415 +24,390 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
-  
-template<typename T> inline T amd_flip(const T& i) { return -i-2; }
-template<typename T> inline T amd_unflip(const T& i) { return i<0 ? amd_flip(i) : i; }
-template<typename T0, typename T1> inline bool amd_marked(const T0* w, const T1& j) { return w[j]<0; }
-template<typename T0, typename T1> inline void amd_mark(const T0* w, const T1& j) { return w[j] = amd_flip(w[j]); }
+
+template <typename T>
+inline T amd_flip(const T& i) {
+  return -i - 2;
+}
+template <typename T>
+inline T amd_unflip(const T& i) {
+  return i < 0 ? amd_flip(i) : i;
+}
+template <typename T0, typename T1>
+inline bool amd_marked(const T0* w, const T1& j) {
+  return w[j] < 0;
+}
+template <typename T0, typename T1>
+inline void amd_mark(const T0* w, const T1& j) {
+  return w[j] = amd_flip(w[j]);
+}
 
 /* clear w */
-template<typename StorageIndex>
-static StorageIndex cs_wclear (StorageIndex mark, StorageIndex lemax, StorageIndex *w, StorageIndex n)
-{
+template <typename StorageIndex>
+static StorageIndex cs_wclear(StorageIndex mark, StorageIndex lemax, StorageIndex* w, StorageIndex n) {
   StorageIndex k;
-  if(mark < 2 || (mark + lemax < 0))
-  {
-    for(k = 0; k < n; k++)
-      if(w[k] != 0)
-        w[k] = 1;
+  if (mark < 2 || (mark + lemax < 0)) {
+    for (k = 0; k < n; k++)
+      if (w[k] != 0) w[k] = 1;
     mark = 2;
   }
-  return (mark);     /* at this point, w[0..n-1] < mark holds */
+  return (mark); /* at this point, w[0..n-1] < mark holds */
 }
 
 /* depth-first search and postorder of a tree rooted at node j */
-template<typename StorageIndex>
-StorageIndex cs_tdfs(StorageIndex j, StorageIndex k, StorageIndex *head, const StorageIndex *next, StorageIndex *post, StorageIndex *stack)
-{
+template <typename StorageIndex>
+StorageIndex cs_tdfs(StorageIndex j, StorageIndex k, StorageIndex* head, const StorageIndex* next, StorageIndex* post,
+                     StorageIndex* stack) {
   StorageIndex i, p, top = 0;
-  if(!head || !next || !post || !stack) return (-1);    /* check inputs */
-  stack[0] = j;                 /* place j on the stack */
-  while (top >= 0)                /* while (stack is not empty) */
+  if (!head || !next || !post || !stack) return (-1); /* check inputs */
+  stack[0] = j;                                       /* place j on the stack */
+  while (top >= 0)                                    /* while (stack is not empty) */
   {
-    p = stack[top];           /* p = top of stack */
-    i = head[p];              /* i = youngest child of p */
-    if(i == -1)
-    {
-      top--;                 /* p has no unordered children left */
-      post[k++] = p;        /* node p is the kth postordered node */
-    }
-    else
-    {
-      head[p] = next[i];   /* remove i from children of p */
-      stack[++top] = i;     /* start dfs on child node i */
+    p = stack[top]; /* p = top of stack */
+    i = head[p];    /* i = youngest child of p */
+    if (i == -1) {
+      top--;         /* p has no unordered children left */
+      post[k++] = p; /* node p is the kth postordered node */
+    } else {
+      head[p] = next[i]; /* remove i from children of p */
+      stack[++top] = i;  /* start dfs on child node i */
     }
   }
   return k;
 }
 
-
 /** \internal
-  * \ingroup OrderingMethods_Module 
-  * Approximate minimum degree ordering algorithm.
-  *
-  * \param[in] C the input selfadjoint matrix stored in compressed column major format.
-  * \param[out] perm the permutation P reducing the fill-in of the input matrix \a C
-  *
-  * Note that the input matrix \a C must be complete, that is both the upper and lower parts have to be stored, as well as the diagonal entries.
-  * On exit the values of C are destroyed */
-template<typename Scalar, typename StorageIndex>
-void minimum_degree_ordering(SparseMatrix<Scalar,ColMajor,StorageIndex>& C, PermutationMatrix<Dynamic,Dynamic,StorageIndex>& perm)
-{
+ * \ingroup OrderingMethods_Module
+ * Approximate minimum degree ordering algorithm.
+ *
+ * \param[in] C the input selfadjoint matrix stored in compressed column major format.
+ * \param[out] perm the permutation P reducing the fill-in of the input matrix \a C
+ *
+ * Note that the input matrix \a C must be complete, that is both the upper and lower parts have to be stored, as well
+ * as the diagonal entries. On exit the values of C are destroyed */
+template <typename Scalar, typename StorageIndex>
+void minimum_degree_ordering(SparseMatrix<Scalar, ColMajor, StorageIndex>& C,
+                             PermutationMatrix<Dynamic, Dynamic, StorageIndex>& perm) {
   using std::sqrt;
-  
-  StorageIndex d, dk, dext, lemax = 0, e, elenk, eln, i, j, k, k1,
-                k2, k3, jlast, ln, dense, nzmax, mindeg = 0, nvi, nvj, nvk, mark, wnvi,
-                ok, nel = 0, p, p1, p2, p3, p4, pj, pk, pk1, pk2, pn, q, t, h;
-  
+
+  StorageIndex d, dk, dext, lemax = 0, e, elenk, eln, i, j, k, k1, k2, k3, jlast, ln, dense, nzmax, mindeg = 0, nvi,
+                            nvj, nvk, mark, wnvi, ok, nel = 0, p, p1, p2, p3, p4, pj, pk, pk1, pk2, pn, q, t, h;
+
   StorageIndex n = StorageIndex(C.cols());
-  dense = std::max<StorageIndex> (16, StorageIndex(10 * sqrt(double(n))));   /* find dense threshold */
-  dense = (std::min)(n-2, dense);
-  
+  dense = std::max<StorageIndex>(16, StorageIndex(10 * sqrt(double(n)))); /* find dense threshold */
+  dense = (std::min)(n - 2, dense);
+
   StorageIndex cnz = StorageIndex(C.nonZeros());
-  perm.resize(n+1);
-  t = cnz + cnz/5 + 2*n;                 /* add elbow room to C */
+  perm.resize(n + 1);
+  t = cnz + cnz / 5 + 2 * n; /* add elbow room to C */
   C.resizeNonZeros(t);
-  
+
   // get workspace
-  ei_declare_aligned_stack_constructed_variable(StorageIndex,W,8*(n+1),0);
-  StorageIndex* len     = W;
-  StorageIndex* nv      = W +   (n+1);
-  StorageIndex* next    = W + 2*(n+1);
-  StorageIndex* head    = W + 3*(n+1);
-  StorageIndex* elen    = W + 4*(n+1);
-  StorageIndex* degree  = W + 5*(n+1);
-  StorageIndex* w       = W + 6*(n+1);
-  StorageIndex* hhead   = W + 7*(n+1);
-  StorageIndex* last    = perm.indices().data();                              /* use P as workspace for last */
-  
+  ei_declare_aligned_stack_constructed_variable(StorageIndex, W, 8 * (n + 1), 0);
+  StorageIndex* len = W;
+  StorageIndex* nv = W + (n + 1);
+  StorageIndex* next = W + 2 * (n + 1);
+  StorageIndex* head = W + 3 * (n + 1);
+  StorageIndex* elen = W + 4 * (n + 1);
+  StorageIndex* degree = W + 5 * (n + 1);
+  StorageIndex* w = W + 6 * (n + 1);
+  StorageIndex* hhead = W + 7 * (n + 1);
+  StorageIndex* last = perm.indices().data(); /* use P as workspace for last */
+
   /* --- Initialize quotient graph ---------------------------------------- */
   StorageIndex* Cp = C.outerIndexPtr();
   StorageIndex* Ci = C.innerIndexPtr();
-  for(k = 0; k < n; k++)
-    len[k] = Cp[k+1] - Cp[k];
+  for (k = 0; k < n; k++) len[k] = Cp[k + 1] - Cp[k];
   len[n] = 0;
   nzmax = t;
-  
-  for(i = 0; i <= n; i++)
-  {
-    head[i]   = -1;                     // degree list i is empty
-    last[i]   = -1;
-    next[i]   = -1;
-    hhead[i]  = -1;                     // hash list i is empty 
-    nv[i]     = 1;                      // node i is just one node
-    w[i]      = 1;                      // node i is alive
-    elen[i]   = 0;                      // Ek of node i is empty
-    degree[i] = len[i];                 // degree of node i
+
+  for (i = 0; i <= n; i++) {
+    head[i] = -1;  // degree list i is empty
+    last[i] = -1;
+    next[i] = -1;
+    hhead[i] = -1;       // hash list i is empty
+    nv[i] = 1;           // node i is just one node
+    w[i] = 1;            // node i is alive
+    elen[i] = 0;         // Ek of node i is empty
+    degree[i] = len[i];  // degree of node i
   }
-  mark = internal::cs_wclear<StorageIndex>(0, 0, w, n);         /* clear w */
-  
+  mark = internal::cs_wclear<StorageIndex>(0, 0, w, n); /* clear w */
+
   /* --- Initialize degree lists ------------------------------------------ */
-  for(i = 0; i < n; i++)
-  {
+  for (i = 0; i < n; i++) {
     bool has_diag = false;
-    for(p = Cp[i]; p<Cp[i+1]; ++p)
-      if(Ci[p]==i)
-      {
+    for (p = Cp[i]; p < Cp[i + 1]; ++p)
+      if (Ci[p] == i) {
         has_diag = true;
         break;
       }
-   
+
     d = degree[i];
-    if(d == 1 && has_diag)           /* node i is empty */
+    if (d == 1 && has_diag) /* node i is empty */
     {
-      elen[i] = -2;                 /* element i is dead */
+      elen[i] = -2; /* element i is dead */
       nel++;
-      Cp[i] = -1;                   /* i is a root of assembly tree */
+      Cp[i] = -1; /* i is a root of assembly tree */
       w[i] = 0;
-    }
-    else if(d > dense || !has_diag)  /* node i is dense or has no structural diagonal element */
+    } else if (d > dense || !has_diag) /* node i is dense or has no structural diagonal element */
     {
-      nv[i] = 0;                    /* absorb i into element n */
-      elen[i] = -1;                 /* node i is dead */
+      nv[i] = 0;    /* absorb i into element n */
+      elen[i] = -1; /* node i is dead */
       nel++;
-      Cp[i] = amd_flip (n);
+      Cp[i] = amd_flip(n);
       nv[n]++;
-    }
-    else
-    {
-      if(head[d] != -1) last[head[d]] = i;
-      next[i] = head[d];           /* put node i in degree list d */
+    } else {
+      if (head[d] != -1) last[head[d]] = i;
+      next[i] = head[d]; /* put node i in degree list d */
       head[d] = i;
     }
   }
-  
-  elen[n] = -2;                         /* n is a dead element */
-  Cp[n] = -1;                           /* n is a root of assembly tree */
-  w[n] = 0;                             /* n is a dead element */
-  
-  while (nel < n)                         /* while (selecting pivots) do */
+
+  elen[n] = -2; /* n is a dead element */
+  Cp[n] = -1;   /* n is a root of assembly tree */
+  w[n] = 0;     /* n is a dead element */
+
+  while (nel < n) /* while (selecting pivots) do */
   {
     /* --- Select node of minimum approximate degree -------------------- */
-    for(k = -1; mindeg < n && (k = head[mindeg]) == -1; mindeg++) {}
-    if(next[k] != -1) last[next[k]] = -1;
-    head[mindeg] = next[k];          /* remove k from degree list */
-    elenk = elen[k];                  /* elenk = |Ek| */
-    nvk = nv[k];                      /* # of nodes k represents */
-    nel += nvk;                        /* nv[k] nodes of A eliminated */
-    
-    /* --- Garbage collection ------------------------------------------- */
-    if(elenk > 0 && cnz + mindeg >= nzmax)
-    {
-      for(j = 0; j < n; j++)
-      {
-        if((p = Cp[j]) >= 0)      /* j is a live node or element */
-        {
-          Cp[j] = Ci[p];          /* save first entry of object */
-          Ci[p] = amd_flip (j);    /* first entry is now amd_flip(j) */
-        }
-      }
-      for(q = 0, p = 0; p < cnz; ) /* scan all of memory */
-      {
-        if((j = amd_flip (Ci[p++])) >= 0)  /* found object j */
-        {
-          Ci[q] = Cp[j];       /* restore first entry of object */
-          Cp[j] = q++;          /* new pointer to object j */
-          for(k3 = 0; k3 < len[j]-1; k3++) Ci[q++] = Ci[p++];
-        }
-      }
-      cnz = q;                       /* Ci[cnz...nzmax-1] now free */
+    for (k = -1; mindeg < n && (k = head[mindeg]) == -1; mindeg++) {
     }
-    
+    if (next[k] != -1) last[next[k]] = -1;
+    head[mindeg] = next[k]; /* remove k from degree list */
+    elenk = elen[k];        /* elenk = |Ek| */
+    nvk = nv[k];            /* # of nodes k represents */
+    nel += nvk;             /* nv[k] nodes of A eliminated */
+
+    /* --- Garbage collection ------------------------------------------- */
+    if (elenk > 0 && cnz + mindeg >= nzmax) {
+      for (j = 0; j < n; j++) {
+        if ((p = Cp[j]) >= 0) /* j is a live node or element */
+        {
+          Cp[j] = Ci[p];       /* save first entry of object */
+          Ci[p] = amd_flip(j); /* first entry is now amd_flip(j) */
+        }
+      }
+      for (q = 0, p = 0; p < cnz;) /* scan all of memory */
+      {
+        if ((j = amd_flip(Ci[p++])) >= 0) /* found object j */
+        {
+          Ci[q] = Cp[j]; /* restore first entry of object */
+          Cp[j] = q++;   /* new pointer to object j */
+          for (k3 = 0; k3 < len[j] - 1; k3++) Ci[q++] = Ci[p++];
+        }
+      }
+      cnz = q; /* Ci[cnz...nzmax-1] now free */
+    }
+
     /* --- Construct new element ---------------------------------------- */
     dk = 0;
-    nv[k] = -nvk;                     /* flag k as in Lk */
+    nv[k] = -nvk; /* flag k as in Lk */
     p = Cp[k];
-    pk1 = (elenk == 0) ? p : cnz;      /* do in place if elen[k] == 0 */
+    pk1 = (elenk == 0) ? p : cnz; /* do in place if elen[k] == 0 */
     pk2 = pk1;
-    for(k1 = 1; k1 <= elenk + 1; k1++)
-    {
-      if(k1 > elenk)
-      {
-        e = k;                     /* search the nodes in k */
-        pj = p;                    /* list of nodes starts at Ci[pj]*/
-        ln = len[k] - elenk;      /* length of list of nodes in k */
-      }
-      else
-      {
-        e = Ci[p++];              /* search the nodes in e */
+    for (k1 = 1; k1 <= elenk + 1; k1++) {
+      if (k1 > elenk) {
+        e = k;               /* search the nodes in k */
+        pj = p;              /* list of nodes starts at Ci[pj]*/
+        ln = len[k] - elenk; /* length of list of nodes in k */
+      } else {
+        e = Ci[p++]; /* search the nodes in e */
         pj = Cp[e];
-        ln = len[e];              /* length of list of nodes in e */
+        ln = len[e]; /* length of list of nodes in e */
       }
-      for(k2 = 1; k2 <= ln; k2++)
-      {
+      for (k2 = 1; k2 <= ln; k2++) {
         i = Ci[pj++];
-        if((nvi = nv[i]) <= 0) continue; /* node i dead, or seen */
-        dk += nvi;                 /* degree[Lk] += size of node i */
-        nv[i] = -nvi;             /* negate nv[i] to denote i in Lk*/
-        Ci[pk2++] = i;            /* place i in Lk */
-        if(next[i] != -1) last[next[i]] = last[i];
-        if(last[i] != -1)         /* remove i from degree list */
+        if ((nvi = nv[i]) <= 0) continue; /* node i dead, or seen */
+        dk += nvi;                        /* degree[Lk] += size of node i */
+        nv[i] = -nvi;                     /* negate nv[i] to denote i in Lk*/
+        Ci[pk2++] = i;                    /* place i in Lk */
+        if (next[i] != -1) last[next[i]] = last[i];
+        if (last[i] != -1) /* remove i from degree list */
         {
           next[last[i]] = next[i];
-        }
-        else
-        {
+        } else {
           head[degree[i]] = next[i];
         }
       }
-      if(e != k)
-      {
-        Cp[e] = amd_flip (k);      /* absorb e into k */
-        w[e] = 0;                 /* e is now a dead element */
+      if (e != k) {
+        Cp[e] = amd_flip(k); /* absorb e into k */
+        w[e] = 0;            /* e is now a dead element */
       }
     }
-    if(elenk != 0) cnz = pk2;         /* Ci[cnz...nzmax] is free */
-    degree[k] = dk;                   /* external degree of k - |Lk\i| */
-    Cp[k] = pk1;                      /* element k is in Ci[pk1..pk2-1] */
+    if (elenk != 0) cnz = pk2; /* Ci[cnz...nzmax] is free */
+    degree[k] = dk;            /* external degree of k - |Lk\i| */
+    Cp[k] = pk1;               /* element k is in Ci[pk1..pk2-1] */
     len[k] = pk2 - pk1;
-    elen[k] = -2;                     /* k is now an element */
-    
+    elen[k] = -2; /* k is now an element */
+
     /* --- Find set differences ----------------------------------------- */
-    mark = internal::cs_wclear<StorageIndex>(mark, lemax, w, n);  /* clear w if necessary */
-    for(pk = pk1; pk < pk2; pk++)    /* scan 1: find |Le\Lk| */
+    mark = internal::cs_wclear<StorageIndex>(mark, lemax, w, n); /* clear w if necessary */
+    for (pk = pk1; pk < pk2; pk++)                               /* scan 1: find |Le\Lk| */
     {
       i = Ci[pk];
-      if((eln = elen[i]) <= 0) continue;/* skip if elen[i] empty */
-      nvi = -nv[i];                      /* nv[i] was negated */
+      if ((eln = elen[i]) <= 0) continue; /* skip if elen[i] empty */
+      nvi = -nv[i];                       /* nv[i] was negated */
       wnvi = mark - nvi;
-      for(p = Cp[i]; p <= Cp[i] + eln - 1; p++)  /* scan Ei */
+      for (p = Cp[i]; p <= Cp[i] + eln - 1; p++) /* scan Ei */
       {
         e = Ci[p];
-        if(w[e] >= mark)
-        {
-          w[e] -= nvi;          /* decrement |Le\Lk| */
-        }
-        else if(w[e] != 0)        /* ensure e is a live element */
+        if (w[e] >= mark) {
+          w[e] -= nvi;        /* decrement |Le\Lk| */
+        } else if (w[e] != 0) /* ensure e is a live element */
         {
           w[e] = degree[e] + wnvi; /* 1st time e seen in scan 1 */
         }
       }
     }
-    
+
     /* --- Degree update ------------------------------------------------ */
-    for(pk = pk1; pk < pk2; pk++)    /* scan2: degree update */
+    for (pk = pk1; pk < pk2; pk++) /* scan2: degree update */
     {
-      i = Ci[pk];                   /* consider node i in Lk */
+      i = Ci[pk]; /* consider node i in Lk */
       p1 = Cp[i];
       p2 = p1 + elen[i] - 1;
       pn = p1;
-      for(h = 0, d = 0, p = p1; p <= p2; p++)    /* scan Ei */
+      for (h = 0, d = 0, p = p1; p <= p2; p++) /* scan Ei */
       {
         e = Ci[p];
-        if(w[e] != 0)             /* e is an unabsorbed element */
+        if (w[e] != 0) /* e is an unabsorbed element */
         {
-          dext = w[e] - mark;   /* dext = |Le\Lk| */
-          if(dext > 0)
-          {
-            d += dext;         /* sum up the set differences */
-            Ci[pn++] = e;     /* keep e in Ei */
-            h += e;            /* compute the hash of node i */
-          }
-          else
-          {
-            Cp[e] = amd_flip (k);  /* aggressive absorb. e->k */
-            w[e] = 0;             /* e is a dead element */
+          dext = w[e] - mark; /* dext = |Le\Lk| */
+          if (dext > 0) {
+            d += dext;    /* sum up the set differences */
+            Ci[pn++] = e; /* keep e in Ei */
+            h += e;       /* compute the hash of node i */
+          } else {
+            Cp[e] = amd_flip(k); /* aggressive absorb. e->k */
+            w[e] = 0;            /* e is a dead element */
           }
         }
       }
-      elen[i] = pn - p1 + 1;        /* elen[i] = |Ei| */
+      elen[i] = pn - p1 + 1; /* elen[i] = |Ei| */
       p3 = pn;
       p4 = p1 + len[i];
-      for(p = p2 + 1; p < p4; p++) /* prune edges in Ai */
+      for (p = p2 + 1; p < p4; p++) /* prune edges in Ai */
       {
         j = Ci[p];
-        if((nvj = nv[j]) <= 0) continue; /* node j dead or in Lk */
-        d += nvj;                  /* degree(i) += |j| */
-        Ci[pn++] = j;             /* place j in node list of i */
-        h += j;                    /* compute hash for node i */
+        if ((nvj = nv[j]) <= 0) continue; /* node j dead or in Lk */
+        d += nvj;                         /* degree(i) += |j| */
+        Ci[pn++] = j;                     /* place j in node list of i */
+        h += j;                           /* compute hash for node i */
       }
-      if(d == 0)                     /* check for mass elimination */
+      if (d == 0) /* check for mass elimination */
       {
-        Cp[i] = amd_flip (k);      /* absorb i into k */
+        Cp[i] = amd_flip(k); /* absorb i into k */
         nvi = -nv[i];
-        dk -= nvi;                 /* |Lk| -= |i| */
-        nvk += nvi;                /* |k| += nv[i] */
+        dk -= nvi;  /* |Lk| -= |i| */
+        nvk += nvi; /* |k| += nv[i] */
         nel += nvi;
         nv[i] = 0;
-        elen[i] = -1;             /* node i is dead */
-      }
-      else
-      {
-        degree[i] = std::min<StorageIndex> (degree[i], d);   /* update degree(i) */
-        Ci[pn] = Ci[p3];         /* move first node to end */
-        Ci[p3] = Ci[p1];         /* move 1st el. to end of Ei */
-        Ci[p1] = k;               /* add k as 1st element in of Ei */
-        len[i] = pn - p1 + 1;     /* new len of adj. list of node i */
-        h %= n;                    /* finalize hash of i */
-        next[i] = hhead[h];      /* place i in hash bucket */
+        elen[i] = -1; /* node i is dead */
+      } else {
+        degree[i] = std::min<StorageIndex>(degree[i], d); /* update degree(i) */
+        Ci[pn] = Ci[p3];                                  /* move first node to end */
+        Ci[p3] = Ci[p1];                                  /* move 1st el. to end of Ei */
+        Ci[p1] = k;                                       /* add k as 1st element in of Ei */
+        len[i] = pn - p1 + 1;                             /* new len of adj. list of node i */
+        h %= n;                                           /* finalize hash of i */
+        next[i] = hhead[h];                               /* place i in hash bucket */
         hhead[h] = i;
-        last[i] = h;      /* save hash of i in last[i] */
+        last[i] = h; /* save hash of i in last[i] */
       }
-    }                                   /* scan2 is done */
-    degree[k] = dk;                   /* finalize |Lk| */
+    }               /* scan2 is done */
+    degree[k] = dk; /* finalize |Lk| */
     lemax = std::max<StorageIndex>(lemax, dk);
-    mark = internal::cs_wclear<StorageIndex>(mark+lemax, lemax, w, n);    /* clear w */
-    
+    mark = internal::cs_wclear<StorageIndex>(mark + lemax, lemax, w, n); /* clear w */
+
     /* --- Supernode detection ------------------------------------------ */
-    for(pk = pk1; pk < pk2; pk++)
-    {
+    for (pk = pk1; pk < pk2; pk++) {
       i = Ci[pk];
-      if(nv[i] >= 0) continue;         /* skip if i is dead */
-      h = last[i];                      /* scan hash bucket of node i */
+      if (nv[i] >= 0) continue; /* skip if i is dead */
+      h = last[i];              /* scan hash bucket of node i */
       i = hhead[h];
-      hhead[h] = -1;                    /* hash bucket will be empty */
-      for(; i != -1 && next[i] != -1; i = next[i], mark++)
-      {
+      hhead[h] = -1; /* hash bucket will be empty */
+      for (; i != -1 && next[i] != -1; i = next[i], mark++) {
         ln = len[i];
         eln = elen[i];
-        for(p = Cp[i]+1; p <= Cp[i] + ln-1; p++) w[Ci[p]] = mark;
+        for (p = Cp[i] + 1; p <= Cp[i] + ln - 1; p++) w[Ci[p]] = mark;
         jlast = i;
-        for(j = next[i]; j != -1; ) /* compare i with all j */
+        for (j = next[i]; j != -1;) /* compare i with all j */
         {
           ok = (len[j] == ln) && (elen[j] == eln);
-          for(p = Cp[j] + 1; ok && p <= Cp[j] + ln - 1; p++)
-          {
-            if(w[Ci[p]] != mark) ok = 0;    /* compare i and j*/
+          for (p = Cp[j] + 1; ok && p <= Cp[j] + ln - 1; p++) {
+            if (w[Ci[p]] != mark) ok = 0; /* compare i and j*/
           }
-          if(ok)                     /* i and j are identical */
+          if (ok) /* i and j are identical */
           {
-            Cp[j] = amd_flip (i);  /* absorb j into i */
+            Cp[j] = amd_flip(i); /* absorb j into i */
             nv[i] += nv[j];
             nv[j] = 0;
-            elen[j] = -1;         /* node j is dead */
-            j = next[j];          /* delete j from hash bucket */
+            elen[j] = -1; /* node j is dead */
+            j = next[j];  /* delete j from hash bucket */
             next[jlast] = j;
-          }
-          else
-          {
-            jlast = j;             /* j and i are different */
+          } else {
+            jlast = j; /* j and i are different */
             j = next[j];
           }
         }
       }
     }
-    
+
     /* --- Finalize new element------------------------------------------ */
-    for(p = pk1, pk = pk1; pk < pk2; pk++)   /* finalize Lk */
+    for (p = pk1, pk = pk1; pk < pk2; pk++) /* finalize Lk */
     {
       i = Ci[pk];
-      if((nvi = -nv[i]) <= 0) continue;/* skip if i is dead */
-      nv[i] = nvi;                      /* restore nv[i] */
-      d = degree[i] + dk - nvi;         /* compute external degree(i) */
-      d = std::min<StorageIndex> (d, n - nel - nvi);
-      if(head[d] != -1) last[head[d]] = i;
-      next[i] = head[d];               /* put i back in degree list */
+      if ((nvi = -nv[i]) <= 0) continue; /* skip if i is dead */
+      nv[i] = nvi;                       /* restore nv[i] */
+      d = degree[i] + dk - nvi;          /* compute external degree(i) */
+      d = std::min<StorageIndex>(d, n - nel - nvi);
+      if (head[d] != -1) last[head[d]] = i;
+      next[i] = head[d]; /* put i back in degree list */
       last[i] = -1;
       head[d] = i;
-      mindeg = std::min<StorageIndex> (mindeg, d);       /* find new minimum degree */
+      mindeg = std::min<StorageIndex>(mindeg, d); /* find new minimum degree */
       degree[i] = d;
-      Ci[p++] = i;                      /* place i in Lk */
+      Ci[p++] = i; /* place i in Lk */
     }
-    nv[k] = nvk;                      /* # nodes absorbed into k */
-    if((len[k] = p-pk1) == 0)         /* length of adj list of element k*/
+    nv[k] = nvk;                 /* # nodes absorbed into k */
+    if ((len[k] = p - pk1) == 0) /* length of adj list of element k*/
     {
-      Cp[k] = -1;                   /* k is a root of the tree */
-      w[k] = 0;                     /* k is now a dead element */
+      Cp[k] = -1; /* k is a root of the tree */
+      w[k] = 0;   /* k is now a dead element */
     }
-    if(elenk != 0) cnz = p;           /* free unused space in Lk */
+    if (elenk != 0) cnz = p; /* free unused space in Lk */
   }
-  
+
   /* --- Postordering ----------------------------------------------------- */
-  for(i = 0; i < n; i++) Cp[i] = amd_flip (Cp[i]);/* fix assembly tree */
-  for(j = 0; j <= n; j++) head[j] = -1;
-  for(j = n; j >= 0; j--)              /* place unordered nodes in lists */
+  for (i = 0; i < n; i++) Cp[i] = amd_flip(Cp[i]); /* fix assembly tree */
+  for (j = 0; j <= n; j++) head[j] = -1;
+  for (j = n; j >= 0; j--) /* place unordered nodes in lists */
   {
-    if(nv[j] > 0) continue;          /* skip if j is an element */
-    next[j] = head[Cp[j]];          /* place j in list of its parent */
+    if (nv[j] > 0) continue; /* skip if j is an element */
+    next[j] = head[Cp[j]];   /* place j in list of its parent */
     head[Cp[j]] = j;
   }
-  for(e = n; e >= 0; e--)              /* place elements in lists */
+  for (e = n; e >= 0; e--) /* place elements in lists */
   {
-    if(nv[e] <= 0) continue;         /* skip unless e is an element */
-    if(Cp[e] != -1)
-    {
-      next[e] = head[Cp[e]];      /* place e in list of its parent */
+    if (nv[e] <= 0) continue; /* skip unless e is an element */
+    if (Cp[e] != -1) {
+      next[e] = head[Cp[e]]; /* place e in list of its parent */
       head[Cp[e]] = e;
     }
   }
-  for(k = 0, i = 0; i <= n; i++)       /* postorder the assembly tree */
+  for (k = 0, i = 0; i <= n; i++) /* postorder the assembly tree */
   {
-    if(Cp[i] == -1) k = internal::cs_tdfs<StorageIndex>(i, k, head, next, perm.indices().data(), w);
+    if (Cp[i] == -1) k = internal::cs_tdfs<StorageIndex>(i, k, head, next, perm.indices().data(), w);
   }
-  
+
   perm.indices().conservativeResize(n);
 }
 
-} // namespace internal
+}  // namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SPARSE_AMD_H
+#endif  // EIGEN_SPARSE_AMD_H
diff --git a/Eigen/src/OrderingMethods/Eigen_Colamd.h b/Eigen/src/OrderingMethods/Eigen_Colamd.h
index 8e339a7..7bce3d5 100644
--- a/Eigen/src/OrderingMethods/Eigen_Colamd.h
+++ b/Eigen/src/OrderingMethods/Eigen_Colamd.h
@@ -43,7 +43,6 @@
 //
 //       http://www.suitesparse.com
 
-
 #ifndef EIGEN_COLAMD_H
 #define EIGEN_COLAMD_H
 
@@ -56,7 +55,6 @@
 #define COLAMD_NDEBUG
 #endif /* NDEBUG */
 
-
 /* ========================================================================== */
 /* === Knob and statistics definitions ====================================== */
 /* ========================================================================== */
@@ -116,16 +114,10 @@
 const int Empty = -1;
 
 /* Row and column status */
-enum RowColumnStatus {
-  Alive = 0,
-  Dead = -1
-};
+enum RowColumnStatus { Alive = 0, Dead = -1 };
 
 /* Column status */
-enum ColumnStatus {
-  DeadPrincipal = -1,
-  DeadNonPrincipal = -2
-};
+enum ColumnStatus { DeadPrincipal = -1, DeadNonPrincipal = -2 };
 
 /* ========================================================================== */
 /* === Colamd reporting mechanism =========================================== */
@@ -133,36 +125,31 @@
 
 // == Row and Column structures ==
 template <typename IndexType>
-struct ColStructure
-{
-  IndexType start ;   /* index for A of first row in this column, or Dead */
+struct ColStructure {
+  IndexType start; /* index for A of first row in this column, or Dead */
   /* if column is dead */
-  IndexType length ;  /* number of rows in this column */
-  union
-  {
-    IndexType thickness ; /* number of original columns represented by this */
+  IndexType length; /* number of rows in this column */
+  union {
+    IndexType thickness; /* number of original columns represented by this */
     /* col, if the column is alive */
-    IndexType parent ;  /* parent in parent tree super-column structure, if */
+    IndexType parent; /* parent in parent tree super-column structure, if */
     /* the column is dead */
-  } shared1 ;
-  union
-  {
-    IndexType score ; /* the score used to maintain heap, if col is alive */
-    IndexType order ; /* pivot ordering of this column, if col is dead */
-  } shared2 ;
-  union
-  {
-    IndexType headhash ;  /* head of a hash bucket, if col is at the head of */
+  } shared1;
+  union {
+    IndexType score; /* the score used to maintain heap, if col is alive */
+    IndexType order; /* pivot ordering of this column, if col is dead */
+  } shared2;
+  union {
+    IndexType headhash; /* head of a hash bucket, if col is at the head of */
     /* a degree list */
-    IndexType hash ;  /* hash value, if col is not in a degree list */
-    IndexType prev ;  /* previous column in degree list, if col is in a */
+    IndexType hash; /* hash value, if col is not in a degree list */
+    IndexType prev; /* previous column in degree list, if col is in a */
     /* degree list (but not at the head of a degree list) */
-  } shared3 ;
-  union
-  {
-    IndexType degree_next ; /* next column, if col is in a degree list */
-    IndexType hash_next ;   /* next column, if col is in a hash list */
-  } shared4 ;
+  } shared3;
+  union {
+    IndexType degree_next; /* next column, if col is in a degree list */
+    IndexType hash_next;   /* next column, if col is in a hash list */
+  } shared4;
 
   inline bool is_dead() const { return start < Alive; }
 
@@ -173,31 +160,26 @@
   inline void kill_principal() { start = DeadPrincipal; }
 
   inline void kill_non_principal() { start = DeadNonPrincipal; }
-
 };
 
 template <typename IndexType>
-struct RowStructure
-{
-  IndexType start ;   /* index for A of first col in this row */
-  IndexType length ;  /* number of principal columns in this row */
-  union
-  {
-    IndexType degree ;  /* number of principal & non-principal columns in row */
-    IndexType p ;   /* used as a row pointer in init_rows_cols () */
-  } shared1 ;
-  union
-  {
-    IndexType mark ;  /* for computing set differences and marking dead rows*/
-    IndexType first_column ;/* first column in row (used in garbage collection) */
-  } shared2 ;
+struct RowStructure {
+  IndexType start;  /* index for A of first col in this row */
+  IndexType length; /* number of principal columns in this row */
+  union {
+    IndexType degree; /* number of principal & non-principal columns in row */
+    IndexType p;      /* used as a row pointer in init_rows_cols () */
+  } shared1;
+  union {
+    IndexType mark;         /* for computing set differences and marking dead rows*/
+    IndexType first_column; /* first column in row (used in garbage collection) */
+  } shared2;
 
   inline bool is_dead() const { return shared2.mark < Alive; }
 
   inline bool is_alive() const { return shared2.mark >= Alive; }
 
   inline void kill() { shared2.mark = Dead; }
-
 };
 
 /* ========================================================================== */
@@ -219,34 +201,43 @@
   gcc -pedantic warning messages.
 */
 template <typename IndexType>
-inline IndexType colamd_c(IndexType n_col)
-{ return IndexType( ((n_col) + 1) * sizeof (ColStructure<IndexType>) / sizeof (IndexType) ) ; }
+inline IndexType colamd_c(IndexType n_col) {
+  return IndexType(((n_col) + 1) * sizeof(ColStructure<IndexType>) / sizeof(IndexType));
+}
 
 template <typename IndexType>
-inline IndexType  colamd_r(IndexType n_row)
-{ return IndexType(((n_row) + 1) * sizeof (RowStructure<IndexType>) / sizeof (IndexType)); }
+inline IndexType colamd_r(IndexType n_row) {
+  return IndexType(((n_row) + 1) * sizeof(RowStructure<IndexType>) / sizeof(IndexType));
+}
 
 // Prototypes of non-user callable routines
 template <typename IndexType>
-static IndexType init_rows_cols (IndexType n_row, IndexType n_col, RowStructure<IndexType> Row [], ColStructure<IndexType> col [], IndexType A [], IndexType p [], IndexType stats[NStats] );
+static IndexType init_rows_cols(IndexType n_row, IndexType n_col, RowStructure<IndexType> Row[],
+                                ColStructure<IndexType> col[], IndexType A[], IndexType p[], IndexType stats[NStats]);
 
 template <typename IndexType>
-static void init_scoring (IndexType n_row, IndexType n_col, RowStructure<IndexType> Row [], ColStructure<IndexType> Col [], IndexType A [], IndexType head [], double knobs[NKnobs], IndexType *p_n_row2, IndexType *p_n_col2, IndexType *p_max_deg);
+static void init_scoring(IndexType n_row, IndexType n_col, RowStructure<IndexType> Row[], ColStructure<IndexType> Col[],
+                         IndexType A[], IndexType head[], double knobs[NKnobs], IndexType *p_n_row2,
+                         IndexType *p_n_col2, IndexType *p_max_deg);
 
 template <typename IndexType>
-static IndexType find_ordering (IndexType n_row, IndexType n_col, IndexType Alen, RowStructure<IndexType> Row [], ColStructure<IndexType> Col [], IndexType A [], IndexType head [], IndexType n_col2, IndexType max_deg, IndexType pfree);
+static IndexType find_ordering(IndexType n_row, IndexType n_col, IndexType Alen, RowStructure<IndexType> Row[],
+                               ColStructure<IndexType> Col[], IndexType A[], IndexType head[], IndexType n_col2,
+                               IndexType max_deg, IndexType pfree);
 
 template <typename IndexType>
-static void order_children (IndexType n_col, ColStructure<IndexType> Col [], IndexType p []);
+static void order_children(IndexType n_col, ColStructure<IndexType> Col[], IndexType p[]);
 
 template <typename IndexType>
-static void detect_super_cols (ColStructure<IndexType> Col [], IndexType A [], IndexType head [], IndexType row_start, IndexType row_length ) ;
+static void detect_super_cols(ColStructure<IndexType> Col[], IndexType A[], IndexType head[], IndexType row_start,
+                              IndexType row_length);
 
 template <typename IndexType>
-static IndexType garbage_collection (IndexType n_row, IndexType n_col, RowStructure<IndexType> Row [], ColStructure<IndexType> Col [], IndexType A [], IndexType *pfree) ;
+static IndexType garbage_collection(IndexType n_row, IndexType n_col, RowStructure<IndexType> Row[],
+                                    ColStructure<IndexType> Col[], IndexType A[], IndexType *pfree);
 
 template <typename IndexType>
-static inline  IndexType clear_mark (IndexType n_row, RowStructure<IndexType> Row [] ) ;
+static inline IndexType clear_mark(IndexType n_row, RowStructure<IndexType> Row[]);
 
 /* === No debugging ========================================================= */
 
@@ -256,8 +247,7 @@
 #define COLAMD_DEBUG3(params) ;
 #define COLAMD_DEBUG4(params) ;
 
-#define COLAMD_ASSERT(expression) ((void) 0)
-
+#define COLAMD_ASSERT(expression) ((void)0)
 
 /**
  * \brief Returns the recommended value of Alen
@@ -274,12 +264,11 @@
  * \return recommended value of Alen for use by colamd
  */
 template <typename IndexType>
-inline IndexType recommended ( IndexType nnz, IndexType n_row, IndexType n_col)
-{
+inline IndexType recommended(IndexType nnz, IndexType n_row, IndexType n_col) {
   if ((nnz) < 0 || (n_row) < 0 || (n_col) < 0)
     return (-1);
   else
-    return (2 * (nnz) + colamd_c (n_col) + colamd_r (n_row) + (n_col) + ((nnz) / 5));
+    return (2 * (nnz) + colamd_c(n_col) + colamd_r(n_row) + (n_col) + ((nnz) / 5));
 }
 
 /**
@@ -303,22 +292,19 @@
  * \param knobs parameter settings for colamd
  */
 
-static inline void set_defaults(double knobs[NKnobs])
-{
+static inline void set_defaults(double knobs[NKnobs]) {
   /* === Local variables ================================================== */
 
-  int i ;
+  int i;
 
-  if (!knobs)
-  {
-    return ;      /* no knobs to initialize */
+  if (!knobs) {
+    return; /* no knobs to initialize */
   }
-  for (i = 0 ; i < NKnobs ; i++)
-  {
-    knobs [i] = 0 ;
+  for (i = 0; i < NKnobs; i++) {
+    knobs[i] = 0;
   }
-  knobs [Colamd::DenseRow] = 0.5 ;  /* ignore rows over 50% dense */
-  knobs [Colamd::DenseCol] = 0.5 ;  /* ignore columns over 50% dense */
+  knobs[Colamd::DenseRow] = 0.5; /* ignore rows over 50% dense */
+  knobs[Colamd::DenseCol] = 0.5; /* ignore columns over 50% dense */
 }
 
 /**
@@ -339,144 +325,135 @@
  * \param stats colamd output statistics and error codes
  */
 template <typename IndexType>
-static bool compute_ordering(IndexType n_row, IndexType n_col, IndexType Alen, IndexType *A, IndexType *p, double knobs[NKnobs], IndexType stats[NStats])
-{
+static bool compute_ordering(IndexType n_row, IndexType n_col, IndexType Alen, IndexType *A, IndexType *p,
+                             double knobs[NKnobs], IndexType stats[NStats]) {
   /* === Local variables ================================================== */
 
-  IndexType i ;     /* loop index */
-  IndexType nnz ;     /* nonzeros in A */
-  IndexType Row_size ;    /* size of Row [], in integers */
-  IndexType Col_size ;    /* size of Col [], in integers */
-  IndexType need ;      /* minimum required length of A */
-  Colamd::RowStructure<IndexType> *Row ;   /* pointer into A of Row [0..n_row] array */
-  Colamd::ColStructure<IndexType> *Col ;   /* pointer into A of Col [0..n_col] array */
-  IndexType n_col2 ;    /* number of non-dense, non-empty columns */
-  IndexType n_row2 ;    /* number of non-dense, non-empty rows */
-  IndexType ngarbage ;    /* number of garbage collections performed */
-  IndexType max_deg ;   /* maximum row degree */
-  double default_knobs [NKnobs] ; /* default knobs array */
-
+  IndexType i;                          /* loop index */
+  IndexType nnz;                        /* nonzeros in A */
+  IndexType Row_size;                   /* size of Row [], in integers */
+  IndexType Col_size;                   /* size of Col [], in integers */
+  IndexType need;                       /* minimum required length of A */
+  Colamd::RowStructure<IndexType> *Row; /* pointer into A of Row [0..n_row] array */
+  Colamd::ColStructure<IndexType> *Col; /* pointer into A of Col [0..n_col] array */
+  IndexType n_col2;                     /* number of non-dense, non-empty columns */
+  IndexType n_row2;                     /* number of non-dense, non-empty rows */
+  IndexType ngarbage;                   /* number of garbage collections performed */
+  IndexType max_deg;                    /* maximum row degree */
+  double default_knobs[NKnobs];         /* default knobs array */
 
   /* === Check the input arguments ======================================== */
 
-  if (!stats)
-  {
-    COLAMD_DEBUG0 (("colamd: stats not present\n")) ;
-    return (false) ;
+  if (!stats) {
+    COLAMD_DEBUG0(("colamd: stats not present\n"));
+    return (false);
   }
-  for (i = 0 ; i < NStats ; i++)
-  {
-    stats [i] = 0 ;
+  for (i = 0; i < NStats; i++) {
+    stats[i] = 0;
   }
-  stats [Colamd::Status] = Colamd::Ok ;
-  stats [Colamd::Info1] = -1 ;
-  stats [Colamd::Info2] = -1 ;
+  stats[Colamd::Status] = Colamd::Ok;
+  stats[Colamd::Info1] = -1;
+  stats[Colamd::Info2] = -1;
 
-  if (!A)   /* A is not present */
+  if (!A) /* A is not present */
   {
-    stats [Colamd::Status] = Colamd::ErrorANotPresent ;
-    COLAMD_DEBUG0 (("colamd: A not present\n")) ;
-    return (false) ;
+    stats[Colamd::Status] = Colamd::ErrorANotPresent;
+    COLAMD_DEBUG0(("colamd: A not present\n"));
+    return (false);
   }
 
-  if (!p)   /* p is not present */
+  if (!p) /* p is not present */
   {
-    stats [Colamd::Status] = Colamd::ErrorPNotPresent ;
-    COLAMD_DEBUG0 (("colamd: p not present\n")) ;
-    return (false) ;
+    stats[Colamd::Status] = Colamd::ErrorPNotPresent;
+    COLAMD_DEBUG0(("colamd: p not present\n"));
+    return (false);
   }
 
-  if (n_row < 0)  /* n_row must be >= 0 */
+  if (n_row < 0) /* n_row must be >= 0 */
   {
-    stats [Colamd::Status] = Colamd::ErrorNrowNegative ;
-    stats [Colamd::Info1] = n_row ;
-    COLAMD_DEBUG0 (("colamd: nrow negative %d\n", n_row)) ;
-    return (false) ;
+    stats[Colamd::Status] = Colamd::ErrorNrowNegative;
+    stats[Colamd::Info1] = n_row;
+    COLAMD_DEBUG0(("colamd: nrow negative %d\n", n_row));
+    return (false);
   }
 
-  if (n_col < 0)  /* n_col must be >= 0 */
+  if (n_col < 0) /* n_col must be >= 0 */
   {
-    stats [Colamd::Status] = Colamd::ErrorNcolNegative ;
-    stats [Colamd::Info1] = n_col ;
-    COLAMD_DEBUG0 (("colamd: ncol negative %d\n", n_col)) ;
-    return (false) ;
+    stats[Colamd::Status] = Colamd::ErrorNcolNegative;
+    stats[Colamd::Info1] = n_col;
+    COLAMD_DEBUG0(("colamd: ncol negative %d\n", n_col));
+    return (false);
   }
 
-  nnz = p [n_col] ;
-  if (nnz < 0)  /* nnz must be >= 0 */
+  nnz = p[n_col];
+  if (nnz < 0) /* nnz must be >= 0 */
   {
-    stats [Colamd::Status] = Colamd::ErrorNnzNegative ;
-    stats [Colamd::Info1] = nnz ;
-    COLAMD_DEBUG0 (("colamd: number of entries negative %d\n", nnz)) ;
-    return (false) ;
+    stats[Colamd::Status] = Colamd::ErrorNnzNegative;
+    stats[Colamd::Info1] = nnz;
+    COLAMD_DEBUG0(("colamd: number of entries negative %d\n", nnz));
+    return (false);
   }
 
-  if (p [0] != 0)
-  {
-    stats [Colamd::Status] = Colamd::ErrorP0Nonzero ;
-    stats [Colamd::Info1] = p [0] ;
-    COLAMD_DEBUG0 (("colamd: p[0] not zero %d\n", p [0])) ;
-    return (false) ;
+  if (p[0] != 0) {
+    stats[Colamd::Status] = Colamd::ErrorP0Nonzero;
+    stats[Colamd::Info1] = p[0];
+    COLAMD_DEBUG0(("colamd: p[0] not zero %d\n", p[0]));
+    return (false);
   }
 
   /* === If no knobs, set default knobs =================================== */
 
-  if (!knobs)
-  {
-    set_defaults (default_knobs) ;
-    knobs = default_knobs ;
+  if (!knobs) {
+    set_defaults(default_knobs);
+    knobs = default_knobs;
   }
 
   /* === Allocate the Row and Col arrays from array A ===================== */
 
-  Col_size = colamd_c (n_col) ;
-  Row_size = colamd_r (n_row) ;
-  need = 2*nnz + n_col + Col_size + Row_size ;
+  Col_size = colamd_c(n_col);
+  Row_size = colamd_r(n_row);
+  need = 2 * nnz + n_col + Col_size + Row_size;
 
-  if (need > Alen)
-  {
+  if (need > Alen) {
     /* not enough space in array A to perform the ordering */
-    stats [Colamd::Status] = Colamd::ErrorATooSmall ;
-    stats [Colamd::Info1] = need ;
-    stats [Colamd::Info2] = Alen ;
-    COLAMD_DEBUG0 (("colamd: Need Alen >= %d, given only Alen = %d\n", need,Alen));
-    return (false) ;
+    stats[Colamd::Status] = Colamd::ErrorATooSmall;
+    stats[Colamd::Info1] = need;
+    stats[Colamd::Info2] = Alen;
+    COLAMD_DEBUG0(("colamd: Need Alen >= %d, given only Alen = %d\n", need, Alen));
+    return (false);
   }
 
-  Alen -= Col_size + Row_size ;
-  Col = (ColStructure<IndexType> *) &A [Alen] ;
-  Row = (RowStructure<IndexType> *) &A [Alen + Col_size] ;
+  Alen -= Col_size + Row_size;
+  Col = (ColStructure<IndexType> *)&A[Alen];
+  Row = (RowStructure<IndexType> *)&A[Alen + Col_size];
 
   /* === Construct the row and column data structures ===================== */
 
-  if (!Colamd::init_rows_cols (n_row, n_col, Row, Col, A, p, stats))
-  {
+  if (!Colamd::init_rows_cols(n_row, n_col, Row, Col, A, p, stats)) {
     /* input matrix is invalid */
-    COLAMD_DEBUG0 (("colamd: Matrix invalid\n")) ;
-    return (false) ;
+    COLAMD_DEBUG0(("colamd: Matrix invalid\n"));
+    return (false);
   }
 
   /* === Initialize scores, kill dense rows/columns ======================= */
 
-  Colamd::init_scoring (n_row, n_col, Row, Col, A, p, knobs,
-		&n_row2, &n_col2, &max_deg) ;
+  Colamd::init_scoring(n_row, n_col, Row, Col, A, p, knobs, &n_row2, &n_col2, &max_deg);
 
   /* === Order the supercolumns =========================================== */
 
-  ngarbage = Colamd::find_ordering (n_row, n_col, Alen, Row, Col, A, p,
-			    n_col2, max_deg, 2*nnz) ;
+  ngarbage = Colamd::find_ordering(n_row, n_col, Alen, Row, Col, A, p, n_col2, max_deg, 2 * nnz);
 
   /* === Order the non-principal columns ================================== */
 
-  Colamd::order_children (n_col, Col, p) ;
+  Colamd::order_children(n_col, Col, p);
 
   /* === Return statistics in stats ======================================= */
 
-  stats [Colamd::DenseRow] = n_row - n_row2 ;
-  stats [Colamd::DenseCol] = n_col - n_col2 ;
-  stats [Colamd::DefragCount] = ngarbage ;
-  COLAMD_DEBUG0 (("colamd: done.\n")) ;
-  return (true) ;
+  stats[Colamd::DenseRow] = n_row - n_row2;
+  stats[Colamd::DenseCol] = n_col - n_col2;
+  stats[Colamd::DefragCount] = ngarbage;
+  COLAMD_DEBUG0(("colamd: done.\n"));
+  return (true);
 }
 
 /* ========================================================================== */
@@ -498,112 +475,102 @@
   true otherwise.  Not user-callable.
 */
 template <typename IndexType>
-static IndexType init_rows_cols  /* returns true if OK, or false otherwise */
-  (
-    /* === Parameters ======================================================= */
+static IndexType init_rows_cols /* returns true if OK, or false otherwise */
+    (
+        /* === Parameters ======================================================= */
 
-    IndexType n_row,      /* number of rows of A */
-    IndexType n_col,      /* number of columns of A */
-    RowStructure<IndexType> Row [],    /* of size n_row+1 */
-    ColStructure<IndexType> Col [],    /* of size n_col+1 */
-    IndexType A [],     /* row indices of A, of size Alen */
-    IndexType p [],     /* pointers to columns in A, of size n_col+1 */
-    IndexType stats [NStats]  /* colamd statistics */
-    )
-{
+        IndexType n_row,               /* number of rows of A */
+        IndexType n_col,               /* number of columns of A */
+        RowStructure<IndexType> Row[], /* of size n_row+1 */
+        ColStructure<IndexType> Col[], /* of size n_col+1 */
+        IndexType A[],                 /* row indices of A, of size Alen */
+        IndexType p[],                 /* pointers to columns in A, of size n_col+1 */
+        IndexType stats[NStats]        /* colamd statistics */
+    ) {
   /* === Local variables ================================================== */
 
-  IndexType col ;     /* a column index */
-  IndexType row ;     /* a row index */
-  IndexType *cp ;     /* a column pointer */
-  IndexType *cp_end ;   /* a pointer to the end of a column */
-  IndexType *rp ;     /* a row pointer */
-  IndexType *rp_end ;   /* a pointer to the end of a row */
-  IndexType last_row ;    /* previous row */
+  IndexType col;      /* a column index */
+  IndexType row;      /* a row index */
+  IndexType *cp;      /* a column pointer */
+  IndexType *cp_end;  /* a pointer to the end of a column */
+  IndexType *rp;      /* a row pointer */
+  IndexType *rp_end;  /* a pointer to the end of a row */
+  IndexType last_row; /* previous row */
 
   /* === Initialize columns, and check column pointers ==================== */
 
-  for (col = 0 ; col < n_col ; col++)
-  {
-    Col [col].start = p [col] ;
-    Col [col].length = p [col+1] - p [col] ;
+  for (col = 0; col < n_col; col++) {
+    Col[col].start = p[col];
+    Col[col].length = p[col + 1] - p[col];
 
-    if ((Col [col].length) < 0) // extra parentheses to work-around gcc bug 10200
+    if ((Col[col].length) < 0)  // extra parentheses to work-around gcc bug 10200
     {
       /* column pointers must be non-decreasing */
-      stats [Colamd::Status] = Colamd::ErrorColLengthNegative ;
-      stats [Colamd::Info1] = col ;
-      stats [Colamd::Info2] = Col [col].length ;
-      COLAMD_DEBUG0 (("colamd: col %d length %d < 0\n", col, Col [col].length)) ;
-      return (false) ;
+      stats[Colamd::Status] = Colamd::ErrorColLengthNegative;
+      stats[Colamd::Info1] = col;
+      stats[Colamd::Info2] = Col[col].length;
+      COLAMD_DEBUG0(("colamd: col %d length %d < 0\n", col, Col[col].length));
+      return (false);
     }
 
-    Col [col].shared1.thickness = 1 ;
-    Col [col].shared2.score = 0 ;
-    Col [col].shared3.prev = Empty ;
-    Col [col].shared4.degree_next = Empty ;
+    Col[col].shared1.thickness = 1;
+    Col[col].shared2.score = 0;
+    Col[col].shared3.prev = Empty;
+    Col[col].shared4.degree_next = Empty;
   }
 
   /* p [0..n_col] no longer needed, used as "head" in subsequent routines */
 
   /* === Scan columns, compute row degrees, and check row indices ========= */
 
-  stats [Info3] = 0 ;  /* number of duplicate or unsorted row indices*/
+  stats[Info3] = 0; /* number of duplicate or unsorted row indices*/
 
-  for (row = 0 ; row < n_row ; row++)
-  {
-    Row [row].length = 0 ;
-    Row [row].shared2.mark = -1 ;
+  for (row = 0; row < n_row; row++) {
+    Row[row].length = 0;
+    Row[row].shared2.mark = -1;
   }
 
-  for (col = 0 ; col < n_col ; col++)
-  {
-    last_row = -1 ;
+  for (col = 0; col < n_col; col++) {
+    last_row = -1;
 
-    cp = &A [p [col]] ;
-    cp_end = &A [p [col+1]] ;
+    cp = &A[p[col]];
+    cp_end = &A[p[col + 1]];
 
-    while (cp < cp_end)
-    {
-      row = *cp++ ;
+    while (cp < cp_end) {
+      row = *cp++;
 
       /* make sure row indices within range */
-      if (row < 0 || row >= n_row)
-      {
-	stats [Colamd::Status] = Colamd::ErrorRowIndexOutOfBounds ;
-	stats [Colamd::Info1] = col ;
-	stats [Colamd::Info2] = row ;
-	stats [Colamd::Info3] = n_row ;
-	COLAMD_DEBUG0 (("colamd: row %d col %d out of bounds\n", row, col)) ;
-	return (false) ;
+      if (row < 0 || row >= n_row) {
+        stats[Colamd::Status] = Colamd::ErrorRowIndexOutOfBounds;
+        stats[Colamd::Info1] = col;
+        stats[Colamd::Info2] = row;
+        stats[Colamd::Info3] = n_row;
+        COLAMD_DEBUG0(("colamd: row %d col %d out of bounds\n", row, col));
+        return (false);
       }
 
-      if (row <= last_row || Row [row].shared2.mark == col)
-      {
-	/* row index are unsorted or repeated (or both), thus col */
-	/* is jumbled.  This is a notice, not an error condition. */
-	stats [Colamd::Status] = Colamd::OkButJumbled ;
-	stats [Colamd::Info1] = col ;
-	stats [Colamd::Info2] = row ;
-	(stats [Colamd::Info3]) ++ ;
-	COLAMD_DEBUG1 (("colamd: row %d col %d unsorted/duplicate\n",row,col));
+      if (row <= last_row || Row[row].shared2.mark == col) {
+        /* row index are unsorted or repeated (or both), thus col */
+        /* is jumbled.  This is a notice, not an error condition. */
+        stats[Colamd::Status] = Colamd::OkButJumbled;
+        stats[Colamd::Info1] = col;
+        stats[Colamd::Info2] = row;
+        (stats[Colamd::Info3])++;
+        COLAMD_DEBUG1(("colamd: row %d col %d unsorted/duplicate\n", row, col));
       }
 
-      if (Row [row].shared2.mark != col)
-      {
-	Row [row].length++ ;
-      }
-      else
-      {
-	/* this is a repeated entry in the column, */
-	/* it will be removed */
-	Col [col].length-- ;
+      if (Row[row].shared2.mark != col) {
+        Row[row].length++;
+      } else {
+        /* this is a repeated entry in the column, */
+        /* it will be removed */
+        Col[col].length--;
       }
 
       /* mark the row as having been seen in this column */
-      Row [row].shared2.mark = col ;
+      Row[row].shared2.mark = col;
 
-      last_row = row ;
+      last_row = row;
     }
   }
 
@@ -611,64 +578,52 @@
 
   /* row form of the matrix starts directly after the column */
   /* form of matrix in A */
-  Row [0].start = p [n_col] ;
-  Row [0].shared1.p = Row [0].start ;
-  Row [0].shared2.mark = -1 ;
-  for (row = 1 ; row < n_row ; row++)
-  {
-    Row [row].start = Row [row-1].start + Row [row-1].length ;
-    Row [row].shared1.p = Row [row].start ;
-    Row [row].shared2.mark = -1 ;
+  Row[0].start = p[n_col];
+  Row[0].shared1.p = Row[0].start;
+  Row[0].shared2.mark = -1;
+  for (row = 1; row < n_row; row++) {
+    Row[row].start = Row[row - 1].start + Row[row - 1].length;
+    Row[row].shared1.p = Row[row].start;
+    Row[row].shared2.mark = -1;
   }
 
   /* === Create row form ================================================== */
 
-  if (stats [Status] == OkButJumbled)
-  {
+  if (stats[Status] == OkButJumbled) {
     /* if cols jumbled, watch for repeated row indices */
-    for (col = 0 ; col < n_col ; col++)
-    {
-      cp = &A [p [col]] ;
-      cp_end = &A [p [col+1]] ;
-      while (cp < cp_end)
-      {
-	row = *cp++ ;
-	if (Row [row].shared2.mark != col)
-	{
-	  A [(Row [row].shared1.p)++] = col ;
-	  Row [row].shared2.mark = col ;
-	}
+    for (col = 0; col < n_col; col++) {
+      cp = &A[p[col]];
+      cp_end = &A[p[col + 1]];
+      while (cp < cp_end) {
+        row = *cp++;
+        if (Row[row].shared2.mark != col) {
+          A[(Row[row].shared1.p)++] = col;
+          Row[row].shared2.mark = col;
+        }
       }
     }
-  }
-  else
-  {
+  } else {
     /* if cols not jumbled, we don't need the mark (this is faster) */
-    for (col = 0 ; col < n_col ; col++)
-    {
-      cp = &A [p [col]] ;
-      cp_end = &A [p [col+1]] ;
-      while (cp < cp_end)
-      {
-	A [(Row [*cp++].shared1.p)++] = col ;
+    for (col = 0; col < n_col; col++) {
+      cp = &A[p[col]];
+      cp_end = &A[p[col + 1]];
+      while (cp < cp_end) {
+        A[(Row[*cp++].shared1.p)++] = col;
       }
     }
   }
 
   /* === Clear the row marks and set row degrees ========================== */
 
-  for (row = 0 ; row < n_row ; row++)
-  {
-    Row [row].shared2.mark = 0 ;
-    Row [row].shared1.degree = Row [row].length ;
+  for (row = 0; row < n_row; row++) {
+    Row[row].shared2.mark = 0;
+    Row[row].shared1.degree = Row[row].length;
   }
 
   /* === See if we need to re-create columns ============================== */
 
-  if (stats [Status] == OkButJumbled)
-  {
-    COLAMD_DEBUG0 (("colamd: reconstructing column form, matrix jumbled\n")) ;
-
+  if (stats[Status] == OkButJumbled) {
+    COLAMD_DEBUG0(("colamd: reconstructing column form, matrix jumbled\n"));
 
     /* === Compute col pointers ========================================= */
 
@@ -676,35 +631,31 @@
     /* Note, we may have a gap between the col form and the row */
     /* form if there were duplicate entries, if so, it will be */
     /* removed upon the first garbage collection */
-    Col [0].start = 0 ;
-    p [0] = Col [0].start ;
-    for (col = 1 ; col < n_col ; col++)
-    {
+    Col[0].start = 0;
+    p[0] = Col[0].start;
+    for (col = 1; col < n_col; col++) {
       /* note that the lengths here are for pruned columns, i.e. */
       /* no duplicate row indices will exist for these columns */
-      Col [col].start = Col [col-1].start + Col [col-1].length ;
-      p [col] = Col [col].start ;
+      Col[col].start = Col[col - 1].start + Col[col - 1].length;
+      p[col] = Col[col].start;
     }
 
     /* === Re-create col form =========================================== */
 
-    for (row = 0 ; row < n_row ; row++)
-    {
-      rp = &A [Row [row].start] ;
-      rp_end = rp + Row [row].length ;
-      while (rp < rp_end)
-      {
-	A [(p [*rp++])++] = row ;
+    for (row = 0; row < n_row; row++) {
+      rp = &A[Row[row].start];
+      rp_end = rp + Row[row].length;
+      while (rp < rp_end) {
+        A[(p[*rp++])++] = row;
       }
     }
   }
 
   /* === Done.  Matrix is not (or no longer) jumbled ====================== */
 
-  return (true) ;
+  return (true);
 }
 
-
 /* ========================================================================== */
 /* === init_scoring ========================================================= */
 /* ========================================================================== */
@@ -714,112 +665,99 @@
   each column, and places all columns in the degree lists.  Not user-callable.
 */
 template <typename IndexType>
-static void init_scoring
-  (
+static void init_scoring(
     /* === Parameters ======================================================= */
 
-    IndexType n_row,      /* number of rows of A */
-    IndexType n_col,      /* number of columns of A */
-    RowStructure<IndexType> Row [],    /* of size n_row+1 */
-    ColStructure<IndexType> Col [],    /* of size n_col+1 */
-    IndexType A [],     /* column form and row form of A */
-    IndexType head [],    /* of size n_col+1 */
-    double knobs [NKnobs],/* parameters */
-    IndexType *p_n_row2,    /* number of non-dense, non-empty rows */
-    IndexType *p_n_col2,    /* number of non-dense, non-empty columns */
-    IndexType *p_max_deg    /* maximum row degree */
-    )
-{
+    IndexType n_row,               /* number of rows of A */
+    IndexType n_col,               /* number of columns of A */
+    RowStructure<IndexType> Row[], /* of size n_row+1 */
+    ColStructure<IndexType> Col[], /* of size n_col+1 */
+    IndexType A[],                 /* column form and row form of A */
+    IndexType head[],              /* of size n_col+1 */
+    double knobs[NKnobs],          /* parameters */
+    IndexType *p_n_row2,           /* number of non-dense, non-empty rows */
+    IndexType *p_n_col2,           /* number of non-dense, non-empty columns */
+    IndexType *p_max_deg           /* maximum row degree */
+) {
   /* === Local variables ================================================== */
 
-  IndexType c ;     /* a column index */
-  IndexType r, row ;    /* a row index */
-  IndexType *cp ;     /* a column pointer */
-  IndexType deg ;     /* degree of a row or column */
-  IndexType *cp_end ;   /* a pointer to the end of a column */
-  IndexType *new_cp ;   /* new column pointer */
-  IndexType col_length ;    /* length of pruned column */
-  IndexType score ;     /* current column score */
-  IndexType n_col2 ;    /* number of non-dense, non-empty columns */
-  IndexType n_row2 ;    /* number of non-dense, non-empty rows */
-  IndexType dense_row_count ; /* remove rows with more entries than this */
-  IndexType dense_col_count ; /* remove cols with more entries than this */
-  IndexType min_score ;   /* smallest column score */
-  IndexType max_deg ;   /* maximum row degree */
-  IndexType next_col ;    /* Used to add to degree list.*/
-
+  IndexType c;               /* a column index */
+  IndexType r, row;          /* a row index */
+  IndexType *cp;             /* a column pointer */
+  IndexType deg;             /* degree of a row or column */
+  IndexType *cp_end;         /* a pointer to the end of a column */
+  IndexType *new_cp;         /* new column pointer */
+  IndexType col_length;      /* length of pruned column */
+  IndexType score;           /* current column score */
+  IndexType n_col2;          /* number of non-dense, non-empty columns */
+  IndexType n_row2;          /* number of non-dense, non-empty rows */
+  IndexType dense_row_count; /* remove rows with more entries than this */
+  IndexType dense_col_count; /* remove cols with more entries than this */
+  IndexType min_score;       /* smallest column score */
+  IndexType max_deg;         /* maximum row degree */
+  IndexType next_col;        /* Used to add to degree list.*/
 
   /* === Extract knobs ==================================================== */
 
-  dense_row_count = numext::maxi(IndexType(0), numext::mini(IndexType(knobs [Colamd::DenseRow] * n_col), n_col)) ;
-  dense_col_count = numext::maxi(IndexType(0), numext::mini(IndexType(knobs [Colamd::DenseCol] * n_row), n_row)) ;
-  COLAMD_DEBUG1 (("colamd: densecount: %d %d\n", dense_row_count, dense_col_count)) ;
-  max_deg = 0 ;
-  n_col2 = n_col ;
-  n_row2 = n_row ;
+  dense_row_count = numext::maxi(IndexType(0), numext::mini(IndexType(knobs[Colamd::DenseRow] * n_col), n_col));
+  dense_col_count = numext::maxi(IndexType(0), numext::mini(IndexType(knobs[Colamd::DenseCol] * n_row), n_row));
+  COLAMD_DEBUG1(("colamd: densecount: %d %d\n", dense_row_count, dense_col_count));
+  max_deg = 0;
+  n_col2 = n_col;
+  n_row2 = n_row;
 
   /* === Kill empty columns =============================================== */
 
   /* Put the empty columns at the end in their natural order, so that LU */
   /* factorization can proceed as far as possible. */
-  for (c = n_col-1 ; c >= 0 ; c--)
-  {
-    deg = Col [c].length ;
-    if (deg == 0)
-    {
+  for (c = n_col - 1; c >= 0; c--) {
+    deg = Col[c].length;
+    if (deg == 0) {
       /* this is a empty column, kill and order it last */
-      Col [c].shared2.order = --n_col2 ;
-      Col[c].kill_principal() ;
+      Col[c].shared2.order = --n_col2;
+      Col[c].kill_principal();
     }
   }
-  COLAMD_DEBUG1 (("colamd: null columns killed: %d\n", n_col - n_col2)) ;
+  COLAMD_DEBUG1(("colamd: null columns killed: %d\n", n_col - n_col2));
 
   /* === Kill dense columns =============================================== */
 
   /* Put the dense columns at the end, in their natural order */
-  for (c = n_col-1 ; c >= 0 ; c--)
-  {
+  for (c = n_col - 1; c >= 0; c--) {
     /* skip any dead columns */
-    if (Col[c].is_dead())
-    {
-      continue ;
+    if (Col[c].is_dead()) {
+      continue;
     }
-    deg = Col [c].length ;
-    if (deg > dense_col_count)
-    {
+    deg = Col[c].length;
+    if (deg > dense_col_count) {
       /* this is a dense column, kill and order it last */
-      Col [c].shared2.order = --n_col2 ;
+      Col[c].shared2.order = --n_col2;
       /* decrement the row degrees */
-      cp = &A [Col [c].start] ;
-      cp_end = cp + Col [c].length ;
-      while (cp < cp_end)
-      {
-	Row [*cp++].shared1.degree-- ;
+      cp = &A[Col[c].start];
+      cp_end = cp + Col[c].length;
+      while (cp < cp_end) {
+        Row[*cp++].shared1.degree--;
       }
-      Col[c].kill_principal() ;
+      Col[c].kill_principal();
     }
   }
-  COLAMD_DEBUG1 (("colamd: Dense and null columns killed: %d\n", n_col - n_col2)) ;
+  COLAMD_DEBUG1(("colamd: Dense and null columns killed: %d\n", n_col - n_col2));
 
   /* === Kill dense and empty rows ======================================== */
 
-  for (r = 0 ; r < n_row ; r++)
-  {
-    deg = Row [r].shared1.degree ;
-    COLAMD_ASSERT (deg >= 0 && deg <= n_col) ;
-    if (deg > dense_row_count || deg == 0)
-    {
+  for (r = 0; r < n_row; r++) {
+    deg = Row[r].shared1.degree;
+    COLAMD_ASSERT(deg >= 0 && deg <= n_col);
+    if (deg > dense_row_count || deg == 0) {
       /* kill a dense or empty row */
-      Row[r].kill() ;
-      --n_row2 ;
-    }
-    else
-    {
+      Row[r].kill();
+      --n_row2;
+    } else {
       /* keep track of max degree of remaining rows */
-      max_deg = numext::maxi(max_deg, deg) ;
+      max_deg = numext::maxi(max_deg, deg);
     }
   }
-  COLAMD_DEBUG1 (("colamd: Dense and null rows killed: %d\n", n_row - n_row2)) ;
+  COLAMD_DEBUG1(("colamd: Dense and null rows killed: %d\n", n_row - n_row2));
 
   /* === Compute initial column scores ==================================== */
 
@@ -829,54 +767,46 @@
   /* pruned in the code below. */
 
   /* now find the initial matlab score for each column */
-  for (c = n_col-1 ; c >= 0 ; c--)
-  {
+  for (c = n_col - 1; c >= 0; c--) {
     /* skip dead column */
-    if (Col[c].is_dead())
-    {
-      continue ;
+    if (Col[c].is_dead()) {
+      continue;
     }
-    score = 0 ;
-    cp = &A [Col [c].start] ;
-    new_cp = cp ;
-    cp_end = cp + Col [c].length ;
-    while (cp < cp_end)
-    {
+    score = 0;
+    cp = &A[Col[c].start];
+    new_cp = cp;
+    cp_end = cp + Col[c].length;
+    while (cp < cp_end) {
       /* get a row */
-      row = *cp++ ;
+      row = *cp++;
       /* skip if dead */
-      if (Row[row].is_dead())
-      {
-	continue ;
+      if (Row[row].is_dead()) {
+        continue;
       }
       /* compact the column */
-      *new_cp++ = row ;
+      *new_cp++ = row;
       /* add row's external degree */
-      score += Row [row].shared1.degree - 1 ;
+      score += Row[row].shared1.degree - 1;
       /* guard against integer overflow */
-      score = numext::mini(score, n_col) ;
+      score = numext::mini(score, n_col);
     }
     /* determine pruned column length */
-    col_length = (IndexType) (new_cp - &A [Col [c].start]) ;
-    if (col_length == 0)
-    {
+    col_length = (IndexType)(new_cp - &A[Col[c].start]);
+    if (col_length == 0) {
       /* a newly-made null column (all rows in this col are "dense" */
       /* and have already been killed) */
-      COLAMD_DEBUG2 (("Newly null killed: %d\n", c)) ;
-      Col [c].shared2.order = --n_col2 ;
-      Col[c].kill_principal() ;
-    }
-    else
-    {
+      COLAMD_DEBUG2(("Newly null killed: %d\n", c));
+      Col[c].shared2.order = --n_col2;
+      Col[c].kill_principal();
+    } else {
       /* set column length and set score */
-      COLAMD_ASSERT (score >= 0) ;
-      COLAMD_ASSERT (score <= n_col) ;
-      Col [c].length = col_length ;
-      Col [c].shared2.score = score ;
+      COLAMD_ASSERT(score >= 0);
+      COLAMD_ASSERT(score <= n_col);
+      Col[c].length = col_length;
+      Col[c].shared2.score = score;
     }
   }
-  COLAMD_DEBUG1 (("colamd: Dense, null, and newly-null columns killed: %d\n",
-		  n_col-n_col2)) ;
+  COLAMD_DEBUG1(("colamd: Dense, null, and newly-null columns killed: %d\n", n_col - n_col2));
 
   /* At this point, all empty rows and columns are dead.  All live columns */
   /* are "clean" (containing no dead rows) and simplicial (no supercolumns */
@@ -885,62 +815,52 @@
 
   /* === Initialize degree lists ========================================== */
 
-
   /* clear the hash buckets */
-  for (c = 0 ; c <= n_col ; c++)
-  {
-    head [c] = Empty ;
+  for (c = 0; c <= n_col; c++) {
+    head[c] = Empty;
   }
-  min_score = n_col ;
+  min_score = n_col;
   /* place in reverse order, so low column indices are at the front */
   /* of the lists.  This is to encourage natural tie-breaking */
-  for (c = n_col-1 ; c >= 0 ; c--)
-  {
+  for (c = n_col - 1; c >= 0; c--) {
     /* only add principal columns to degree lists */
-    if (Col[c].is_alive())
-    {
-      COLAMD_DEBUG4 (("place %d score %d minscore %d ncol %d\n",
-		      c, Col [c].shared2.score, min_score, n_col)) ;
+    if (Col[c].is_alive()) {
+      COLAMD_DEBUG4(("place %d score %d minscore %d ncol %d\n", c, Col[c].shared2.score, min_score, n_col));
 
       /* === Add columns score to DList =============================== */
 
-      score = Col [c].shared2.score ;
+      score = Col[c].shared2.score;
 
-      COLAMD_ASSERT (min_score >= 0) ;
-      COLAMD_ASSERT (min_score <= n_col) ;
-      COLAMD_ASSERT (score >= 0) ;
-      COLAMD_ASSERT (score <= n_col) ;
-      COLAMD_ASSERT (head [score] >= Empty) ;
+      COLAMD_ASSERT(min_score >= 0);
+      COLAMD_ASSERT(min_score <= n_col);
+      COLAMD_ASSERT(score >= 0);
+      COLAMD_ASSERT(score <= n_col);
+      COLAMD_ASSERT(head[score] >= Empty);
 
       /* now add this column to dList at proper score location */
-      next_col = head [score] ;
-      Col [c].shared3.prev = Empty ;
-      Col [c].shared4.degree_next = next_col ;
+      next_col = head[score];
+      Col[c].shared3.prev = Empty;
+      Col[c].shared4.degree_next = next_col;
 
       /* if there already was a column with the same score, set its */
       /* previous pointer to this new column */
-      if (next_col != Empty)
-      {
-	Col [next_col].shared3.prev = c ;
+      if (next_col != Empty) {
+        Col[next_col].shared3.prev = c;
       }
-      head [score] = c ;
+      head[score] = c;
 
       /* see if this score is less than current min */
-      min_score = numext::mini(min_score, score) ;
-
-
+      min_score = numext::mini(min_score, score);
     }
   }
 
-
   /* === Return number of remaining columns, and max row degree =========== */
 
-  *p_n_col2 = n_col2 ;
-  *p_n_row2 = n_row2 ;
-  *p_max_deg = max_deg ;
+  *p_n_col2 = n_col2;
+  *p_n_row2 = n_row2;
+  *p_max_deg = max_deg;
 }
 
-
 /* ========================================================================== */
 /* === find_ordering ======================================================== */
 /* ========================================================================== */
@@ -952,197 +872,180 @@
 */
 template <typename IndexType>
 static IndexType find_ordering /* return the number of garbage collections */
-  (
-    /* === Parameters ======================================================= */
+    (
+        /* === Parameters ======================================================= */
 
-    IndexType n_row,      /* number of rows of A */
-    IndexType n_col,      /* number of columns of A */
-    IndexType Alen,     /* size of A, 2*nnz + n_col or larger */
-    RowStructure<IndexType> Row [],    /* of size n_row+1 */
-    ColStructure<IndexType> Col [],    /* of size n_col+1 */
-    IndexType A [],     /* column form and row form of A */
-    IndexType head [],    /* of size n_col+1 */
-    IndexType n_col2,     /* Remaining columns to order */
-    IndexType max_deg,    /* Maximum row degree */
-    IndexType pfree     /* index of first free slot (2*nnz on entry) */
-    )
-{
+        IndexType n_row,               /* number of rows of A */
+        IndexType n_col,               /* number of columns of A */
+        IndexType Alen,                /* size of A, 2*nnz + n_col or larger */
+        RowStructure<IndexType> Row[], /* of size n_row+1 */
+        ColStructure<IndexType> Col[], /* of size n_col+1 */
+        IndexType A[],                 /* column form and row form of A */
+        IndexType head[],              /* of size n_col+1 */
+        IndexType n_col2,              /* Remaining columns to order */
+        IndexType max_deg,             /* Maximum row degree */
+        IndexType pfree                /* index of first free slot (2*nnz on entry) */
+    ) {
   /* === Local variables ================================================== */
 
-  IndexType k ;     /* current pivot ordering step */
-  IndexType pivot_col ;   /* current pivot column */
-  IndexType *cp ;     /* a column pointer */
-  IndexType *rp ;     /* a row pointer */
-  IndexType pivot_row ;   /* current pivot row */
-  IndexType *new_cp ;   /* modified column pointer */
-  IndexType *new_rp ;   /* modified row pointer */
-  IndexType pivot_row_start ; /* pointer to start of pivot row */
-  IndexType pivot_row_degree ;  /* number of columns in pivot row */
-  IndexType pivot_row_length ;  /* number of supercolumns in pivot row */
-  IndexType pivot_col_score ; /* score of pivot column */
-  IndexType needed_memory ;   /* free space needed for pivot row */
-  IndexType *cp_end ;   /* pointer to the end of a column */
-  IndexType *rp_end ;   /* pointer to the end of a row */
-  IndexType row ;     /* a row index */
-  IndexType col ;     /* a column index */
-  IndexType max_score ;   /* maximum possible score */
-  IndexType cur_score ;   /* score of current column */
-  unsigned int hash ;   /* hash value for supernode detection */
-  IndexType head_column ;   /* head of hash bucket */
-  IndexType first_col ;   /* first column in hash bucket */
-  IndexType tag_mark ;    /* marker value for mark array */
-  IndexType row_mark ;    /* Row [row].shared2.mark */
-  IndexType set_difference ;  /* set difference size of row with pivot row */
-  IndexType min_score ;   /* smallest column score */
-  IndexType col_thickness ;   /* "thickness" (no. of columns in a supercol) */
-  IndexType max_mark ;    /* maximum value of tag_mark */
-  IndexType pivot_col_thickness ; /* number of columns represented by pivot col */
-  IndexType prev_col ;    /* Used by Dlist operations. */
-  IndexType next_col ;    /* Used by Dlist operations. */
-  IndexType ngarbage ;    /* number of garbage collections performed */
-
+  IndexType k;                   /* current pivot ordering step */
+  IndexType pivot_col;           /* current pivot column */
+  IndexType *cp;                 /* a column pointer */
+  IndexType *rp;                 /* a row pointer */
+  IndexType pivot_row;           /* current pivot row */
+  IndexType *new_cp;             /* modified column pointer */
+  IndexType *new_rp;             /* modified row pointer */
+  IndexType pivot_row_start;     /* pointer to start of pivot row */
+  IndexType pivot_row_degree;    /* number of columns in pivot row */
+  IndexType pivot_row_length;    /* number of supercolumns in pivot row */
+  IndexType pivot_col_score;     /* score of pivot column */
+  IndexType needed_memory;       /* free space needed for pivot row */
+  IndexType *cp_end;             /* pointer to the end of a column */
+  IndexType *rp_end;             /* pointer to the end of a row */
+  IndexType row;                 /* a row index */
+  IndexType col;                 /* a column index */
+  IndexType max_score;           /* maximum possible score */
+  IndexType cur_score;           /* score of current column */
+  unsigned int hash;             /* hash value for supernode detection */
+  IndexType head_column;         /* head of hash bucket */
+  IndexType first_col;           /* first column in hash bucket */
+  IndexType tag_mark;            /* marker value for mark array */
+  IndexType row_mark;            /* Row [row].shared2.mark */
+  IndexType set_difference;      /* set difference size of row with pivot row */
+  IndexType min_score;           /* smallest column score */
+  IndexType col_thickness;       /* "thickness" (no. of columns in a supercol) */
+  IndexType max_mark;            /* maximum value of tag_mark */
+  IndexType pivot_col_thickness; /* number of columns represented by pivot col */
+  IndexType prev_col;            /* Used by Dlist operations. */
+  IndexType next_col;            /* Used by Dlist operations. */
+  IndexType ngarbage;            /* number of garbage collections performed */
 
   /* === Initialization and clear mark ==================================== */
 
-  max_mark = INT_MAX - n_col ;  /* INT_MAX defined in <limits.h> */
-  tag_mark = Colamd::clear_mark (n_row, Row) ;
-  min_score = 0 ;
-  ngarbage = 0 ;
-  COLAMD_DEBUG1 (("colamd: Ordering, n_col2=%d\n", n_col2)) ;
+  max_mark = INT_MAX - n_col; /* INT_MAX defined in <limits.h> */
+  tag_mark = Colamd::clear_mark(n_row, Row);
+  min_score = 0;
+  ngarbage = 0;
+  COLAMD_DEBUG1(("colamd: Ordering, n_col2=%d\n", n_col2));
 
   /* === Order the columns ================================================ */
 
-  for (k = 0 ; k < n_col2 ; /* 'k' is incremented below */)
-  {
-
+  for (k = 0; k < n_col2; /* 'k' is incremented below */) {
     /* === Select pivot column, and order it ============================ */
 
     /* make sure degree list isn't empty */
-    COLAMD_ASSERT (min_score >= 0) ;
-    COLAMD_ASSERT (min_score <= n_col) ;
-    COLAMD_ASSERT (head [min_score] >= Empty) ;
+    COLAMD_ASSERT(min_score >= 0);
+    COLAMD_ASSERT(min_score <= n_col);
+    COLAMD_ASSERT(head[min_score] >= Empty);
 
     /* get pivot column from head of minimum degree list */
-    while (min_score < n_col && head [min_score] == Empty)
-    {
-      min_score++ ;
+    while (min_score < n_col && head[min_score] == Empty) {
+      min_score++;
     }
-    pivot_col = head [min_score] ;
-    COLAMD_ASSERT (pivot_col >= 0 && pivot_col <= n_col) ;
-    next_col = Col [pivot_col].shared4.degree_next ;
-    head [min_score] = next_col ;
-    if (next_col != Empty)
-    {
-      Col [next_col].shared3.prev = Empty ;
+    pivot_col = head[min_score];
+    COLAMD_ASSERT(pivot_col >= 0 && pivot_col <= n_col);
+    next_col = Col[pivot_col].shared4.degree_next;
+    head[min_score] = next_col;
+    if (next_col != Empty) {
+      Col[next_col].shared3.prev = Empty;
     }
 
-    COLAMD_ASSERT (Col[pivot_col].is_alive()) ;
-    COLAMD_DEBUG3 (("Pivot col: %d\n", pivot_col)) ;
+    COLAMD_ASSERT(Col[pivot_col].is_alive());
+    COLAMD_DEBUG3(("Pivot col: %d\n", pivot_col));
 
     /* remember score for defrag check */
-    pivot_col_score = Col [pivot_col].shared2.score ;
+    pivot_col_score = Col[pivot_col].shared2.score;
 
     /* the pivot column is the kth column in the pivot order */
-    Col [pivot_col].shared2.order = k ;
+    Col[pivot_col].shared2.order = k;
 
     /* increment order count by column thickness */
-    pivot_col_thickness = Col [pivot_col].shared1.thickness ;
-    k += pivot_col_thickness ;
-    COLAMD_ASSERT (pivot_col_thickness > 0) ;
+    pivot_col_thickness = Col[pivot_col].shared1.thickness;
+    k += pivot_col_thickness;
+    COLAMD_ASSERT(pivot_col_thickness > 0);
 
     /* === Garbage_collection, if necessary ============================= */
 
-    needed_memory = numext::mini(pivot_col_score, n_col - k) ;
-    if (pfree + needed_memory >= Alen)
-    {
-      pfree = Colamd::garbage_collection (n_row, n_col, Row, Col, A, &A [pfree]) ;
-      ngarbage++ ;
+    needed_memory = numext::mini(pivot_col_score, n_col - k);
+    if (pfree + needed_memory >= Alen) {
+      pfree = Colamd::garbage_collection(n_row, n_col, Row, Col, A, &A[pfree]);
+      ngarbage++;
       /* after garbage collection we will have enough */
-      COLAMD_ASSERT (pfree + needed_memory < Alen) ;
+      COLAMD_ASSERT(pfree + needed_memory < Alen);
       /* garbage collection has wiped out the Row[].shared2.mark array */
-      tag_mark = Colamd::clear_mark (n_row, Row) ;
-
+      tag_mark = Colamd::clear_mark(n_row, Row);
     }
 
     /* === Compute pivot row pattern ==================================== */
 
     /* get starting location for this new merged row */
-    pivot_row_start = pfree ;
+    pivot_row_start = pfree;
 
     /* initialize new row counts to zero */
-    pivot_row_degree = 0 ;
+    pivot_row_degree = 0;
 
     /* tag pivot column as having been visited so it isn't included */
     /* in merged pivot row */
-    Col [pivot_col].shared1.thickness = -pivot_col_thickness ;
+    Col[pivot_col].shared1.thickness = -pivot_col_thickness;
 
     /* pivot row is the union of all rows in the pivot column pattern */
-    cp = &A [Col [pivot_col].start] ;
-    cp_end = cp + Col [pivot_col].length ;
-    while (cp < cp_end)
-    {
+    cp = &A[Col[pivot_col].start];
+    cp_end = cp + Col[pivot_col].length;
+    while (cp < cp_end) {
       /* get a row */
-      row = *cp++ ;
-      COLAMD_DEBUG4 (("Pivot col pattern %d %d\n", Row[row].is_alive(), row)) ;
+      row = *cp++;
+      COLAMD_DEBUG4(("Pivot col pattern %d %d\n", Row[row].is_alive(), row));
       /* skip if row is dead */
-      if (Row[row].is_dead())
-      {
-	continue ;
+      if (Row[row].is_dead()) {
+        continue;
       }
-      rp = &A [Row [row].start] ;
-      rp_end = rp + Row [row].length ;
-      while (rp < rp_end)
-      {
-	/* get a column */
-	col = *rp++ ;
-	/* add the column, if alive and untagged */
-	col_thickness = Col [col].shared1.thickness ;
-	if (col_thickness > 0 && Col[col].is_alive())
-	{
-	  /* tag column in pivot row */
-	  Col [col].shared1.thickness = -col_thickness ;
-	  COLAMD_ASSERT (pfree < Alen) ;
-	  /* place column in pivot row */
-	  A [pfree++] = col ;
-	  pivot_row_degree += col_thickness ;
-	}
+      rp = &A[Row[row].start];
+      rp_end = rp + Row[row].length;
+      while (rp < rp_end) {
+        /* get a column */
+        col = *rp++;
+        /* add the column, if alive and untagged */
+        col_thickness = Col[col].shared1.thickness;
+        if (col_thickness > 0 && Col[col].is_alive()) {
+          /* tag column in pivot row */
+          Col[col].shared1.thickness = -col_thickness;
+          COLAMD_ASSERT(pfree < Alen);
+          /* place column in pivot row */
+          A[pfree++] = col;
+          pivot_row_degree += col_thickness;
+        }
       }
     }
 
     /* clear tag on pivot column */
-    Col [pivot_col].shared1.thickness = pivot_col_thickness ;
-    max_deg = numext::maxi(max_deg, pivot_row_degree) ;
-
+    Col[pivot_col].shared1.thickness = pivot_col_thickness;
+    max_deg = numext::maxi(max_deg, pivot_row_degree);
 
     /* === Kill all rows used to construct pivot row ==================== */
 
     /* also kill pivot row, temporarily */
-    cp = &A [Col [pivot_col].start] ;
-    cp_end = cp + Col [pivot_col].length ;
-    while (cp < cp_end)
-    {
+    cp = &A[Col[pivot_col].start];
+    cp_end = cp + Col[pivot_col].length;
+    while (cp < cp_end) {
       /* may be killing an already dead row */
-      row = *cp++ ;
-      COLAMD_DEBUG3 (("Kill row in pivot col: %d\n", row)) ;
-      Row[row].kill() ;
+      row = *cp++;
+      COLAMD_DEBUG3(("Kill row in pivot col: %d\n", row));
+      Row[row].kill();
     }
 
     /* === Select a row index to use as the new pivot row =============== */
 
-    pivot_row_length = pfree - pivot_row_start ;
-    if (pivot_row_length > 0)
-    {
+    pivot_row_length = pfree - pivot_row_start;
+    if (pivot_row_length > 0) {
       /* pick the "pivot" row arbitrarily (first row in col) */
-      pivot_row = A [Col [pivot_col].start] ;
-      COLAMD_DEBUG3 (("Pivotal row is %d\n", pivot_row)) ;
-    }
-    else
-    {
+      pivot_row = A[Col[pivot_col].start];
+      COLAMD_DEBUG3(("Pivotal row is %d\n", pivot_row));
+    } else {
       /* there is no pivot row, since it is of zero length */
-      pivot_row = Empty ;
-      COLAMD_ASSERT (pivot_row_length == 0) ;
+      pivot_row = Empty;
+      COLAMD_ASSERT(pivot_row_length == 0);
     }
-    COLAMD_ASSERT (Col [pivot_col].length > 0 || pivot_row_length == 0) ;
+    COLAMD_ASSERT(Col[pivot_col].length > 0 || pivot_row_length == 0);
 
     /* === Approximate degree computation =============================== */
 
@@ -1165,180 +1068,159 @@
 
     /* === Compute set differences ====================================== */
 
-    COLAMD_DEBUG3 (("** Computing set differences phase. **\n")) ;
+    COLAMD_DEBUG3(("** Computing set differences phase. **\n"));
 
     /* pivot row is currently dead - it will be revived later. */
 
-    COLAMD_DEBUG3 (("Pivot row: ")) ;
+    COLAMD_DEBUG3(("Pivot row: "));
     /* for each column in pivot row */
-    rp = &A [pivot_row_start] ;
-    rp_end = rp + pivot_row_length ;
-    while (rp < rp_end)
-    {
-      col = *rp++ ;
-      COLAMD_ASSERT (Col[col].is_alive() && col != pivot_col) ;
-      COLAMD_DEBUG3 (("Col: %d\n", col)) ;
+    rp = &A[pivot_row_start];
+    rp_end = rp + pivot_row_length;
+    while (rp < rp_end) {
+      col = *rp++;
+      COLAMD_ASSERT(Col[col].is_alive() && col != pivot_col);
+      COLAMD_DEBUG3(("Col: %d\n", col));
 
       /* clear tags used to construct pivot row pattern */
-      col_thickness = -Col [col].shared1.thickness ;
-      COLAMD_ASSERT (col_thickness > 0) ;
-      Col [col].shared1.thickness = col_thickness ;
+      col_thickness = -Col[col].shared1.thickness;
+      COLAMD_ASSERT(col_thickness > 0);
+      Col[col].shared1.thickness = col_thickness;
 
       /* === Remove column from degree list =========================== */
 
-      cur_score = Col [col].shared2.score ;
-      prev_col = Col [col].shared3.prev ;
-      next_col = Col [col].shared4.degree_next ;
-      COLAMD_ASSERT (cur_score >= 0) ;
-      COLAMD_ASSERT (cur_score <= n_col) ;
-      COLAMD_ASSERT (cur_score >= Empty) ;
-      if (prev_col == Empty)
-      {
-	head [cur_score] = next_col ;
+      cur_score = Col[col].shared2.score;
+      prev_col = Col[col].shared3.prev;
+      next_col = Col[col].shared4.degree_next;
+      COLAMD_ASSERT(cur_score >= 0);
+      COLAMD_ASSERT(cur_score <= n_col);
+      COLAMD_ASSERT(cur_score >= Empty);
+      if (prev_col == Empty) {
+        head[cur_score] = next_col;
+      } else {
+        Col[prev_col].shared4.degree_next = next_col;
       }
-      else
-      {
-	Col [prev_col].shared4.degree_next = next_col ;
-      }
-      if (next_col != Empty)
-      {
-	Col [next_col].shared3.prev = prev_col ;
+      if (next_col != Empty) {
+        Col[next_col].shared3.prev = prev_col;
       }
 
       /* === Scan the column ========================================== */
 
-      cp = &A [Col [col].start] ;
-      cp_end = cp + Col [col].length ;
-      while (cp < cp_end)
-      {
-	/* get a row */
-	row = *cp++ ;
-	/* skip if dead */
-	if (Row[row].is_dead())
-	{
-	  continue ;
-	}
-  row_mark = Row [row].shared2.mark ;
-	COLAMD_ASSERT (row != pivot_row) ;
-	set_difference = row_mark - tag_mark ;
-	/* check if the row has been seen yet */
-	if (set_difference < 0)
-	{
-	  COLAMD_ASSERT (Row [row].shared1.degree <= max_deg) ;
-	  set_difference = Row [row].shared1.degree ;
-	}
-	/* subtract column thickness from this row's set difference */
-	set_difference -= col_thickness ;
-	COLAMD_ASSERT (set_difference >= 0) ;
-	/* absorb this row if the set difference becomes zero */
-	if (set_difference == 0)
-	{
-	  COLAMD_DEBUG3 (("aggressive absorption. Row: %d\n", row)) ;
-	  Row[row].kill() ;
-	}
-	else
-	{
-	  /* save the new mark */
-	  Row [row].shared2.mark = set_difference + tag_mark ;
-	}
+      cp = &A[Col[col].start];
+      cp_end = cp + Col[col].length;
+      while (cp < cp_end) {
+        /* get a row */
+        row = *cp++;
+        /* skip if dead */
+        if (Row[row].is_dead()) {
+          continue;
+        }
+        row_mark = Row[row].shared2.mark;
+        COLAMD_ASSERT(row != pivot_row);
+        set_difference = row_mark - tag_mark;
+        /* check if the row has been seen yet */
+        if (set_difference < 0) {
+          COLAMD_ASSERT(Row[row].shared1.degree <= max_deg);
+          set_difference = Row[row].shared1.degree;
+        }
+        /* subtract column thickness from this row's set difference */
+        set_difference -= col_thickness;
+        COLAMD_ASSERT(set_difference >= 0);
+        /* absorb this row if the set difference becomes zero */
+        if (set_difference == 0) {
+          COLAMD_DEBUG3(("aggressive absorption. Row: %d\n", row));
+          Row[row].kill();
+        } else {
+          /* save the new mark */
+          Row[row].shared2.mark = set_difference + tag_mark;
+        }
       }
     }
 
-
     /* === Add up set differences for each column ======================= */
 
-    COLAMD_DEBUG3 (("** Adding set differences phase. **\n")) ;
+    COLAMD_DEBUG3(("** Adding set differences phase. **\n"));
 
     /* for each column in pivot row */
-    rp = &A [pivot_row_start] ;
-    rp_end = rp + pivot_row_length ;
-    while (rp < rp_end)
-    {
+    rp = &A[pivot_row_start];
+    rp_end = rp + pivot_row_length;
+    while (rp < rp_end) {
       /* get a column */
-      col = *rp++ ;
-      COLAMD_ASSERT (Col[col].is_alive() && col != pivot_col) ;
-      hash = 0 ;
-      cur_score = 0 ;
-      cp = &A [Col [col].start] ;
+      col = *rp++;
+      COLAMD_ASSERT(Col[col].is_alive() && col != pivot_col);
+      hash = 0;
+      cur_score = 0;
+      cp = &A[Col[col].start];
       /* compact the column */
-      new_cp = cp ;
-      cp_end = cp + Col [col].length ;
+      new_cp = cp;
+      cp_end = cp + Col[col].length;
 
-      COLAMD_DEBUG4 (("Adding set diffs for Col: %d.\n", col)) ;
+      COLAMD_DEBUG4(("Adding set diffs for Col: %d.\n", col));
 
-      while (cp < cp_end)
-      {
-	/* get a row */
-	row = *cp++ ;
-	COLAMD_ASSERT(row >= 0 && row < n_row) ;
-	/* skip if dead */
-	if (Row [row].is_dead())
-	{
-	  continue ;
-	}
-  row_mark = Row [row].shared2.mark ;
-	COLAMD_ASSERT (row_mark > tag_mark) ;
-	/* compact the column */
-	*new_cp++ = row ;
-	/* compute hash function */
-	hash += row ;
-	/* add set difference */
-	cur_score += row_mark - tag_mark ;
-	/* integer overflow... */
-	cur_score = numext::mini(cur_score, n_col) ;
+      while (cp < cp_end) {
+        /* get a row */
+        row = *cp++;
+        COLAMD_ASSERT(row >= 0 && row < n_row);
+        /* skip if dead */
+        if (Row[row].is_dead()) {
+          continue;
+        }
+        row_mark = Row[row].shared2.mark;
+        COLAMD_ASSERT(row_mark > tag_mark);
+        /* compact the column */
+        *new_cp++ = row;
+        /* compute hash function */
+        hash += row;
+        /* add set difference */
+        cur_score += row_mark - tag_mark;
+        /* integer overflow... */
+        cur_score = numext::mini(cur_score, n_col);
       }
 
       /* recompute the column's length */
-      Col [col].length = (IndexType) (new_cp - &A [Col [col].start]) ;
+      Col[col].length = (IndexType)(new_cp - &A[Col[col].start]);
 
       /* === Further mass elimination ================================= */
 
-      if (Col [col].length == 0)
-      {
-	COLAMD_DEBUG4 (("further mass elimination. Col: %d\n", col)) ;
-	/* nothing left but the pivot row in this column */
-	Col[col].kill_principal() ;
-	pivot_row_degree -= Col [col].shared1.thickness ;
-	COLAMD_ASSERT (pivot_row_degree >= 0) ;
-	/* order it */
-	Col [col].shared2.order = k ;
-	/* increment order count by column thickness */
-	k += Col [col].shared1.thickness ;
-      }
-      else
-      {
-	/* === Prepare for supercolumn detection ==================== */
+      if (Col[col].length == 0) {
+        COLAMD_DEBUG4(("further mass elimination. Col: %d\n", col));
+        /* nothing left but the pivot row in this column */
+        Col[col].kill_principal();
+        pivot_row_degree -= Col[col].shared1.thickness;
+        COLAMD_ASSERT(pivot_row_degree >= 0);
+        /* order it */
+        Col[col].shared2.order = k;
+        /* increment order count by column thickness */
+        k += Col[col].shared1.thickness;
+      } else {
+        /* === Prepare for supercolumn detection ==================== */
 
-	COLAMD_DEBUG4 (("Preparing supercol detection for Col: %d.\n", col)) ;
+        COLAMD_DEBUG4(("Preparing supercol detection for Col: %d.\n", col));
 
-	/* save score so far */
-	Col [col].shared2.score = cur_score ;
+        /* save score so far */
+        Col[col].shared2.score = cur_score;
 
-	/* add column to hash table, for supercolumn detection */
-	hash %= n_col + 1 ;
+        /* add column to hash table, for supercolumn detection */
+        hash %= n_col + 1;
 
-	COLAMD_DEBUG4 ((" Hash = %d, n_col = %d.\n", hash, n_col)) ;
-	COLAMD_ASSERT (hash <= n_col) ;
+        COLAMD_DEBUG4((" Hash = %d, n_col = %d.\n", hash, n_col));
+        COLAMD_ASSERT(hash <= n_col);
 
-	head_column = head [hash] ;
-	if (head_column > Empty)
-	{
-	  /* degree list "hash" is non-empty, use prev (shared3) of */
-	  /* first column in degree list as head of hash bucket */
-	  first_col = Col [head_column].shared3.headhash ;
-	  Col [head_column].shared3.headhash = col ;
-	}
-	else
-	{
-	  /* degree list "hash" is empty, use head as hash bucket */
-	  first_col = - (head_column + 2) ;
-	  head [hash] = - (col + 2) ;
-	}
-	Col [col].shared4.hash_next = first_col ;
+        head_column = head[hash];
+        if (head_column > Empty) {
+          /* degree list "hash" is non-empty, use prev (shared3) of */
+          /* first column in degree list as head of hash bucket */
+          first_col = Col[head_column].shared3.headhash;
+          Col[head_column].shared3.headhash = col;
+        } else {
+          /* degree list "hash" is empty, use head as hash bucket */
+          first_col = -(head_column + 2);
+          head[hash] = -(col + 2);
+        }
+        Col[col].shared4.hash_next = first_col;
 
-	/* save hash function in Col [col].shared3.hash */
-	Col [col].shared3.hash = (IndexType) hash ;
-	COLAMD_ASSERT (Col[col].is_alive()) ;
+        /* save hash function in Col [col].shared3.hash */
+        Col[col].shared3.hash = (IndexType)hash;
+        COLAMD_ASSERT(Col[col].is_alive());
       }
     }
 
@@ -1346,105 +1228,98 @@
 
     /* === Supercolumn detection ======================================== */
 
-    COLAMD_DEBUG3 (("** Supercolumn detection phase. **\n")) ;
+    COLAMD_DEBUG3(("** Supercolumn detection phase. **\n"));
 
-    Colamd::detect_super_cols (Col, A, head, pivot_row_start, pivot_row_length) ;
+    Colamd::detect_super_cols(Col, A, head, pivot_row_start, pivot_row_length);
 
     /* === Kill the pivotal column ====================================== */
 
-    Col[pivot_col].kill_principal() ;
+    Col[pivot_col].kill_principal();
 
     /* === Clear mark =================================================== */
 
-    tag_mark += (max_deg + 1) ;
-    if (tag_mark >= max_mark)
-    {
-      COLAMD_DEBUG2 (("clearing tag_mark\n")) ;
-      tag_mark = Colamd::clear_mark (n_row, Row) ;
+    tag_mark += (max_deg + 1);
+    if (tag_mark >= max_mark) {
+      COLAMD_DEBUG2(("clearing tag_mark\n"));
+      tag_mark = Colamd::clear_mark(n_row, Row);
     }
 
     /* === Finalize the new pivot row, and column scores ================ */
 
-    COLAMD_DEBUG3 (("** Finalize scores phase. **\n")) ;
+    COLAMD_DEBUG3(("** Finalize scores phase. **\n"));
 
     /* for each column in pivot row */
-    rp = &A [pivot_row_start] ;
+    rp = &A[pivot_row_start];
     /* compact the pivot row */
-    new_rp = rp ;
-    rp_end = rp + pivot_row_length ;
-    while (rp < rp_end)
-    {
-      col = *rp++ ;
+    new_rp = rp;
+    rp_end = rp + pivot_row_length;
+    while (rp < rp_end) {
+      col = *rp++;
       /* skip dead columns */
-      if (Col[col].is_dead())
-      {
-	continue ;
+      if (Col[col].is_dead()) {
+        continue;
       }
-      *new_rp++ = col ;
+      *new_rp++ = col;
       /* add new pivot row to column */
-      A [Col [col].start + (Col [col].length++)] = pivot_row ;
+      A[Col[col].start + (Col[col].length++)] = pivot_row;
 
       /* retrieve score so far and add on pivot row's degree. */
       /* (we wait until here for this in case the pivot */
       /* row's degree was reduced due to mass elimination). */
-      cur_score = Col [col].shared2.score + pivot_row_degree ;
+      cur_score = Col[col].shared2.score + pivot_row_degree;
 
       /* calculate the max possible score as the number of */
       /* external columns minus the 'k' value minus the */
       /* columns thickness */
-      max_score = n_col - k - Col [col].shared1.thickness ;
+      max_score = n_col - k - Col[col].shared1.thickness;
 
       /* make the score the external degree of the union-of-rows */
-      cur_score -= Col [col].shared1.thickness ;
+      cur_score -= Col[col].shared1.thickness;
 
       /* make sure score is less or equal than the max score */
-      cur_score = numext::mini(cur_score, max_score) ;
-      COLAMD_ASSERT (cur_score >= 0) ;
+      cur_score = numext::mini(cur_score, max_score);
+      COLAMD_ASSERT(cur_score >= 0);
 
       /* store updated score */
-      Col [col].shared2.score = cur_score ;
+      Col[col].shared2.score = cur_score;
 
       /* === Place column back in degree list ========================= */
 
-      COLAMD_ASSERT (min_score >= 0) ;
-      COLAMD_ASSERT (min_score <= n_col) ;
-      COLAMD_ASSERT (cur_score >= 0) ;
-      COLAMD_ASSERT (cur_score <= n_col) ;
-      COLAMD_ASSERT (head [cur_score] >= Empty) ;
-      next_col = head [cur_score] ;
-      Col [col].shared4.degree_next = next_col ;
-      Col [col].shared3.prev = Empty ;
-      if (next_col != Empty)
-      {
-	Col [next_col].shared3.prev = col ;
+      COLAMD_ASSERT(min_score >= 0);
+      COLAMD_ASSERT(min_score <= n_col);
+      COLAMD_ASSERT(cur_score >= 0);
+      COLAMD_ASSERT(cur_score <= n_col);
+      COLAMD_ASSERT(head[cur_score] >= Empty);
+      next_col = head[cur_score];
+      Col[col].shared4.degree_next = next_col;
+      Col[col].shared3.prev = Empty;
+      if (next_col != Empty) {
+        Col[next_col].shared3.prev = col;
       }
-      head [cur_score] = col ;
+      head[cur_score] = col;
 
       /* see if this score is less than current min */
-      min_score = numext::mini(min_score, cur_score) ;
-
+      min_score = numext::mini(min_score, cur_score);
     }
 
     /* === Resurrect the new pivot row ================================== */
 
-    if (pivot_row_degree > 0)
-    {
+    if (pivot_row_degree > 0) {
       /* update pivot row length to reflect any cols that were killed */
       /* during super-col detection and mass elimination */
-      Row [pivot_row].start  = pivot_row_start ;
-      Row [pivot_row].length = (IndexType) (new_rp - &A[pivot_row_start]) ;
-      Row [pivot_row].shared1.degree = pivot_row_degree ;
-      Row [pivot_row].shared2.mark = 0 ;
+      Row[pivot_row].start = pivot_row_start;
+      Row[pivot_row].length = (IndexType)(new_rp - &A[pivot_row_start]);
+      Row[pivot_row].shared1.degree = pivot_row_degree;
+      Row[pivot_row].shared2.mark = 0;
       /* pivot row is no longer dead */
     }
   }
 
   /* === All principal columns have now been ordered ====================== */
 
-  return (ngarbage) ;
+  return (ngarbage);
 }
 
-
 /* ========================================================================== */
 /* === order_children ======================================================= */
 /* ========================================================================== */
@@ -1462,74 +1337,66 @@
   columns.  Not user-callable.
 */
 template <typename IndexType>
-static inline  void order_children
-(
-  /* === Parameters ======================================================= */
+static inline void order_children(
+    /* === Parameters ======================================================= */
 
-  IndexType n_col,      /* number of columns of A */
-  ColStructure<IndexType> Col [],    /* of size n_col+1 */
-  IndexType p []      /* p [0 ... n_col-1] is the column permutation*/
-  )
-{
+    IndexType n_col,               /* number of columns of A */
+    ColStructure<IndexType> Col[], /* of size n_col+1 */
+    IndexType p[]                  /* p [0 ... n_col-1] is the column permutation*/
+) {
   /* === Local variables ================================================== */
 
-  IndexType i ;     /* loop counter for all columns */
-  IndexType c ;     /* column index */
-  IndexType parent ;    /* index of column's parent */
-  IndexType order ;     /* column's order */
+  IndexType i;      /* loop counter for all columns */
+  IndexType c;      /* column index */
+  IndexType parent; /* index of column's parent */
+  IndexType order;  /* column's order */
 
   /* === Order each non-principal column ================================== */
 
-  for (i = 0 ; i < n_col ; i++)
-  {
+  for (i = 0; i < n_col; i++) {
     /* find an un-ordered non-principal column */
-    COLAMD_ASSERT (col_is_dead(Col, i)) ;
-    if (!Col[i].is_dead_principal() && Col [i].shared2.order == Empty)
-    {
-      parent = i ;
+    COLAMD_ASSERT(col_is_dead(Col, i));
+    if (!Col[i].is_dead_principal() && Col[i].shared2.order == Empty) {
+      parent = i;
       /* once found, find its principal parent */
-      do
-      {
-	parent = Col [parent].shared1.parent ;
-      } while (!Col[parent].is_dead_principal()) ;
+      do {
+        parent = Col[parent].shared1.parent;
+      } while (!Col[parent].is_dead_principal());
 
       /* now, order all un-ordered non-principal columns along path */
       /* to this parent.  collapse tree at the same time */
-      c = i ;
+      c = i;
       /* get order of parent */
-      order = Col [parent].shared2.order ;
+      order = Col[parent].shared2.order;
 
-      do
-      {
-	COLAMD_ASSERT (Col [c].shared2.order == Empty) ;
+      do {
+        COLAMD_ASSERT(Col[c].shared2.order == Empty);
 
-	/* order this column */
-	Col [c].shared2.order = order++ ;
-	/* collaps tree */
-	Col [c].shared1.parent = parent ;
+        /* order this column */
+        Col[c].shared2.order = order++;
+        /* collaps tree */
+        Col[c].shared1.parent = parent;
 
-	/* get immediate parent of this column */
-	c = Col [c].shared1.parent ;
+        /* get immediate parent of this column */
+        c = Col[c].shared1.parent;
 
-	/* continue until we hit an ordered column.  There are */
-	/* guaranteed not to be anymore unordered columns */
-	/* above an ordered column */
-      } while (Col [c].shared2.order == Empty) ;
+        /* continue until we hit an ordered column.  There are */
+        /* guaranteed not to be anymore unordered columns */
+        /* above an ordered column */
+      } while (Col[c].shared2.order == Empty);
 
       /* re-order the super_col parent to largest order for this group */
-      Col [parent].shared2.order = order ;
+      Col[parent].shared2.order = order;
     }
   }
 
   /* === Generate the permutation ========================================= */
 
-  for (c = 0 ; c < n_col ; c++)
-  {
-    p [Col [c].shared2.order] = c ;
+  for (c = 0; c < n_col; c++) {
+    p[Col[c].shared2.order] = c;
   }
 }
 
-
 /* ========================================================================== */
 /* === detect_super_cols ==================================================== */
 /* ========================================================================== */
@@ -1563,144 +1430,124 @@
   Not user-callable.
 */
 template <typename IndexType>
-static void detect_super_cols
-(
-  /* === Parameters ======================================================= */
+static void detect_super_cols(
+    /* === Parameters ======================================================= */
 
-  ColStructure<IndexType> Col [],    /* of size n_col+1 */
-  IndexType A [],     /* row indices of A */
-  IndexType head [],    /* head of degree lists and hash buckets */
-  IndexType row_start,    /* pointer to set of columns to check */
-  IndexType row_length    /* number of columns to check */
-)
-{
+    ColStructure<IndexType> Col[], /* of size n_col+1 */
+    IndexType A[],                 /* row indices of A */
+    IndexType head[],              /* head of degree lists and hash buckets */
+    IndexType row_start,           /* pointer to set of columns to check */
+    IndexType row_length           /* number of columns to check */
+) {
   /* === Local variables ================================================== */
 
-  IndexType hash ;      /* hash value for a column */
-  IndexType *rp ;     /* pointer to a row */
-  IndexType c ;     /* a column index */
-  IndexType super_c ;   /* column index of the column to absorb into */
-  IndexType *cp1 ;      /* column pointer for column super_c */
-  IndexType *cp2 ;      /* column pointer for column c */
-  IndexType length ;    /* length of column super_c */
-  IndexType prev_c ;    /* column preceding c in hash bucket */
-  IndexType i ;     /* loop counter */
-  IndexType *rp_end ;   /* pointer to the end of the row */
-  IndexType col ;     /* a column index in the row to check */
-  IndexType head_column ;   /* first column in hash bucket or degree list */
-  IndexType first_col ;   /* first column in hash bucket */
+  IndexType hash;        /* hash value for a column */
+  IndexType *rp;         /* pointer to a row */
+  IndexType c;           /* a column index */
+  IndexType super_c;     /* column index of the column to absorb into */
+  IndexType *cp1;        /* column pointer for column super_c */
+  IndexType *cp2;        /* column pointer for column c */
+  IndexType length;      /* length of column super_c */
+  IndexType prev_c;      /* column preceding c in hash bucket */
+  IndexType i;           /* loop counter */
+  IndexType *rp_end;     /* pointer to the end of the row */
+  IndexType col;         /* a column index in the row to check */
+  IndexType head_column; /* first column in hash bucket or degree list */
+  IndexType first_col;   /* first column in hash bucket */
 
   /* === Consider each column in the row ================================== */
 
-  rp = &A [row_start] ;
-  rp_end = rp + row_length ;
-  while (rp < rp_end)
-  {
-    col = *rp++ ;
-    if (Col[col].is_dead())
-    {
-      continue ;
+  rp = &A[row_start];
+  rp_end = rp + row_length;
+  while (rp < rp_end) {
+    col = *rp++;
+    if (Col[col].is_dead()) {
+      continue;
     }
 
     /* get hash number for this column */
-    hash = Col [col].shared3.hash ;
-    COLAMD_ASSERT (hash <= n_col) ;
+    hash = Col[col].shared3.hash;
+    COLAMD_ASSERT(hash <= n_col);
 
     /* === Get the first column in this hash bucket ===================== */
 
-    head_column = head [hash] ;
-    if (head_column > Empty)
-    {
-      first_col = Col [head_column].shared3.headhash ;
-    }
-    else
-    {
-      first_col = - (head_column + 2) ;
+    head_column = head[hash];
+    if (head_column > Empty) {
+      first_col = Col[head_column].shared3.headhash;
+    } else {
+      first_col = -(head_column + 2);
     }
 
     /* === Consider each column in the hash bucket ====================== */
 
-    for (super_c = first_col ; super_c != Empty ;
-	 super_c = Col [super_c].shared4.hash_next)
-    {
-      COLAMD_ASSERT (Col [super_c].is_alive()) ;
-      COLAMD_ASSERT (Col [super_c].shared3.hash == hash) ;
-      length = Col [super_c].length ;
+    for (super_c = first_col; super_c != Empty; super_c = Col[super_c].shared4.hash_next) {
+      COLAMD_ASSERT(Col[super_c].is_alive());
+      COLAMD_ASSERT(Col[super_c].shared3.hash == hash);
+      length = Col[super_c].length;
 
       /* prev_c is the column preceding column c in the hash bucket */
-      prev_c = super_c ;
+      prev_c = super_c;
 
       /* === Compare super_c with all columns after it ================ */
 
-      for (c = Col [super_c].shared4.hash_next ;
-	   c != Empty ; c = Col [c].shared4.hash_next)
-      {
-	COLAMD_ASSERT (c != super_c) ;
-	COLAMD_ASSERT (Col[c].is_alive()) ;
-	COLAMD_ASSERT (Col [c].shared3.hash == hash) ;
+      for (c = Col[super_c].shared4.hash_next; c != Empty; c = Col[c].shared4.hash_next) {
+        COLAMD_ASSERT(c != super_c);
+        COLAMD_ASSERT(Col[c].is_alive());
+        COLAMD_ASSERT(Col[c].shared3.hash == hash);
 
-	/* not identical if lengths or scores are different */
-	if (Col [c].length != length ||
-	    Col [c].shared2.score != Col [super_c].shared2.score)
-	{
-	  prev_c = c ;
-	  continue ;
-	}
+        /* not identical if lengths or scores are different */
+        if (Col[c].length != length || Col[c].shared2.score != Col[super_c].shared2.score) {
+          prev_c = c;
+          continue;
+        }
 
-	/* compare the two columns */
-	cp1 = &A [Col [super_c].start] ;
-	cp2 = &A [Col [c].start] ;
+        /* compare the two columns */
+        cp1 = &A[Col[super_c].start];
+        cp2 = &A[Col[c].start];
 
-	for (i = 0 ; i < length ; i++)
-	{
-	  /* the columns are "clean" (no dead rows) */
-	  COLAMD_ASSERT ( cp1->is_alive() );
-	  COLAMD_ASSERT ( cp2->is_alive() );
-	  /* row indices will same order for both supercols, */
-	  /* no gather scatter necessary */
-	  if (*cp1++ != *cp2++)
-	  {
-	    break ;
-	  }
-	}
+        for (i = 0; i < length; i++) {
+          /* the columns are "clean" (no dead rows) */
+          COLAMD_ASSERT(cp1->is_alive());
+          COLAMD_ASSERT(cp2->is_alive());
+          /* row indices will same order for both supercols, */
+          /* no gather scatter necessary */
+          if (*cp1++ != *cp2++) {
+            break;
+          }
+        }
 
-	/* the two columns are different if the for-loop "broke" */
-	if (i != length)
-	{
-	  prev_c = c ;
-	  continue ;
-	}
+        /* the two columns are different if the for-loop "broke" */
+        if (i != length) {
+          prev_c = c;
+          continue;
+        }
 
-	/* === Got it!  two columns are identical =================== */
+        /* === Got it!  two columns are identical =================== */
 
-	COLAMD_ASSERT (Col [c].shared2.score == Col [super_c].shared2.score) ;
+        COLAMD_ASSERT(Col[c].shared2.score == Col[super_c].shared2.score);
 
-	Col [super_c].shared1.thickness += Col [c].shared1.thickness ;
-	Col [c].shared1.parent = super_c ;
-	Col[c].kill_non_principal() ;
-	/* order c later, in order_children() */
-	Col [c].shared2.order = Empty ;
-	/* remove c from hash bucket */
-	Col [prev_c].shared4.hash_next = Col [c].shared4.hash_next ;
+        Col[super_c].shared1.thickness += Col[c].shared1.thickness;
+        Col[c].shared1.parent = super_c;
+        Col[c].kill_non_principal();
+        /* order c later, in order_children() */
+        Col[c].shared2.order = Empty;
+        /* remove c from hash bucket */
+        Col[prev_c].shared4.hash_next = Col[c].shared4.hash_next;
       }
     }
 
     /* === Empty this hash bucket ======================================= */
 
-    if (head_column > Empty)
-    {
+    if (head_column > Empty) {
       /* corresponding degree list "hash" is not empty */
-      Col [head_column].shared3.headhash = Empty ;
-    }
-    else
-    {
+      Col[head_column].shared3.headhash = Empty;
+    } else {
       /* corresponding degree list "hash" is empty */
-      head [hash] = Empty ;
+      head[hash] = Empty;
     }
   }
 }
 
-
 /* ========================================================================== */
 /* === garbage_collection =================================================== */
 /* ========================================================================== */
@@ -1714,118 +1561,101 @@
   Not user-callable.
 */
 template <typename IndexType>
-static IndexType garbage_collection  /* returns the new value of pfree */
-  (
-    /* === Parameters ======================================================= */
+static IndexType garbage_collection /* returns the new value of pfree */
+    (
+        /* === Parameters ======================================================= */
 
-    IndexType n_row,      /* number of rows */
-    IndexType n_col,      /* number of columns */
-    RowStructure<IndexType> Row [],    /* row info */
-    ColStructure<IndexType> Col [],    /* column info */
-    IndexType A [],     /* A [0 ... Alen-1] holds the matrix */
-    IndexType *pfree      /* &A [0] ... pfree is in use */
-    )
-{
+        IndexType n_row,               /* number of rows */
+        IndexType n_col,               /* number of columns */
+        RowStructure<IndexType> Row[], /* row info */
+        ColStructure<IndexType> Col[], /* column info */
+        IndexType A[],                 /* A [0 ... Alen-1] holds the matrix */
+        IndexType *pfree               /* &A [0] ... pfree is in use */
+    ) {
   /* === Local variables ================================================== */
 
-  IndexType *psrc ;     /* source pointer */
-  IndexType *pdest ;    /* destination pointer */
-  IndexType j ;     /* counter */
-  IndexType r ;     /* a row index */
-  IndexType c ;     /* a column index */
-  IndexType length ;    /* length of a row or column */
+  IndexType *psrc;  /* source pointer */
+  IndexType *pdest; /* destination pointer */
+  IndexType j;      /* counter */
+  IndexType r;      /* a row index */
+  IndexType c;      /* a column index */
+  IndexType length; /* length of a row or column */
 
   /* === Defragment the columns =========================================== */
 
-  pdest = &A[0] ;
-  for (c = 0 ; c < n_col ; c++)
-  {
-    if (Col[c].is_alive())
-    {
-      psrc = &A [Col [c].start] ;
+  pdest = &A[0];
+  for (c = 0; c < n_col; c++) {
+    if (Col[c].is_alive()) {
+      psrc = &A[Col[c].start];
 
       /* move and compact the column */
-      COLAMD_ASSERT (pdest <= psrc) ;
-      Col [c].start = (IndexType) (pdest - &A [0]) ;
-      length = Col [c].length ;
-      for (j = 0 ; j < length ; j++)
-      {
-	r = *psrc++ ;
-	if (Row[r].is_alive())
-	{
-	  *pdest++ = r ;
-	}
+      COLAMD_ASSERT(pdest <= psrc);
+      Col[c].start = (IndexType)(pdest - &A[0]);
+      length = Col[c].length;
+      for (j = 0; j < length; j++) {
+        r = *psrc++;
+        if (Row[r].is_alive()) {
+          *pdest++ = r;
+        }
       }
-      Col [c].length = (IndexType) (pdest - &A [Col [c].start]) ;
+      Col[c].length = (IndexType)(pdest - &A[Col[c].start]);
     }
   }
 
   /* === Prepare to defragment the rows =================================== */
 
-  for (r = 0 ; r < n_row ; r++)
-  {
-    if (Row[r].is_alive())
-    {
-      if (Row [r].length == 0)
-      {
+  for (r = 0; r < n_row; r++) {
+    if (Row[r].is_alive()) {
+      if (Row[r].length == 0) {
         /* this row is of zero length.  cannot compact it, so kill it */
-        COLAMD_DEBUG3 (("Defrag row kill\n")) ;
-        Row[r].kill() ;
-      }
-      else
-      {
+        COLAMD_DEBUG3(("Defrag row kill\n"));
+        Row[r].kill();
+      } else {
         /* save first column index in Row [r].shared2.first_column */
-        psrc = &A [Row [r].start] ;
-        Row [r].shared2.first_column = *psrc ;
-        COLAMD_ASSERT (Row[r].is_alive()) ;
+        psrc = &A[Row[r].start];
+        Row[r].shared2.first_column = *psrc;
+        COLAMD_ASSERT(Row[r].is_alive());
         /* flag the start of the row with the one's complement of row */
-        *psrc = ones_complement(r) ;
-
+        *psrc = ones_complement(r);
       }
     }
   }
 
   /* === Defragment the rows ============================================== */
 
-  psrc = pdest ;
-  while (psrc < pfree)
-  {
+  psrc = pdest;
+  while (psrc < pfree) {
     /* find a negative number ... the start of a row */
-    if (*psrc++ < 0)
-    {
-      psrc-- ;
+    if (*psrc++ < 0) {
+      psrc--;
       /* get the row index */
-      r = ones_complement(*psrc) ;
-      COLAMD_ASSERT (r >= 0 && r < n_row) ;
+      r = ones_complement(*psrc);
+      COLAMD_ASSERT(r >= 0 && r < n_row);
       /* restore first column index */
-      *psrc = Row [r].shared2.first_column ;
-      COLAMD_ASSERT (Row[r].is_alive()) ;
+      *psrc = Row[r].shared2.first_column;
+      COLAMD_ASSERT(Row[r].is_alive());
 
       /* move and compact the row */
-      COLAMD_ASSERT (pdest <= psrc) ;
-      Row [r].start = (IndexType) (pdest - &A [0]) ;
-      length = Row [r].length ;
-      for (j = 0 ; j < length ; j++)
-      {
-	c = *psrc++ ;
-	if (Col[c].is_alive())
-	{
-	  *pdest++ = c ;
-	}
+      COLAMD_ASSERT(pdest <= psrc);
+      Row[r].start = (IndexType)(pdest - &A[0]);
+      length = Row[r].length;
+      for (j = 0; j < length; j++) {
+        c = *psrc++;
+        if (Col[c].is_alive()) {
+          *pdest++ = c;
+        }
       }
-      Row [r].length = (IndexType) (pdest - &A [Row [r].start]) ;
-
+      Row[r].length = (IndexType)(pdest - &A[Row[r].start]);
     }
   }
   /* ensure we found all the rows */
-  COLAMD_ASSERT (debug_rows == 0) ;
+  COLAMD_ASSERT(debug_rows == 0);
 
   /* === Return the new value of pfree ==================================== */
 
-  return ((IndexType) (pdest - &A [0])) ;
+  return ((IndexType)(pdest - &A[0]));
 }
 
-
 /* ========================================================================== */
 /* === clear_mark =========================================================== */
 /* ========================================================================== */
@@ -1835,29 +1665,26 @@
   Return value is the new tag_mark.  Not user-callable.
 */
 template <typename IndexType>
-static inline  IndexType clear_mark  /* return the new value for tag_mark */
-  (
-      /* === Parameters ======================================================= */
+static inline IndexType clear_mark /* return the new value for tag_mark */
+    (
+        /* === Parameters ======================================================= */
 
-    IndexType n_row,    /* number of rows in A */
-    RowStructure<IndexType> Row [] /* Row [0 ... n_row-1].shared2.mark is set to zero */
-    )
-{
+        IndexType n_row,              /* number of rows in A */
+        RowStructure<IndexType> Row[] /* Row [0 ... n_row-1].shared2.mark is set to zero */
+    ) {
   /* === Local variables ================================================== */
 
-  IndexType r ;
+  IndexType r;
 
-  for (r = 0 ; r < n_row ; r++)
-  {
-    if (Row[r].is_alive())
-    {
-      Row [r].shared2.mark = 0 ;
+  for (r = 0; r < n_row; r++) {
+    if (Row[r].is_alive()) {
+      Row[r].shared2.mark = 0;
     }
   }
-  return (1) ;
+  return (1);
 }
 
-} // namespace Colamd
+}  // namespace Colamd
 
-} // namespace internal
+}  // namespace internal
 #endif
diff --git a/Eigen/src/OrderingMethods/Ordering.h b/Eigen/src/OrderingMethods/Ordering.h
index 0e06a05..9a1c535 100644
--- a/Eigen/src/OrderingMethods/Ordering.h
+++ b/Eigen/src/OrderingMethods/Ordering.h
@@ -1,4 +1,4 @@
- 
+
 // This file is part of Eigen, a lightweight C++ template library
 // for linear algebra.
 //
@@ -15,142 +15,134 @@
 #include "./InternalHeaderCheck.h"
 
 namespace Eigen {
-  
+
 #include "Eigen_Colamd.h"
 
 namespace internal {
-    
+
 /** \internal
-  * \ingroup OrderingMethods_Module
-  * \param[in] A the input non-symmetric matrix
-  * \param[out] symmat the symmetric pattern A^T+A from the input matrix \a A.
-  * FIXME: The values should not be considered here
-  */
-template<typename MatrixType> 
-void ordering_helper_at_plus_a(const MatrixType& A, MatrixType& symmat)
-{
+ * \ingroup OrderingMethods_Module
+ * \param[in] A the input non-symmetric matrix
+ * \param[out] symmat the symmetric pattern A^T+A from the input matrix \a A.
+ * FIXME: The values should not be considered here
+ */
+template <typename MatrixType>
+void ordering_helper_at_plus_a(const MatrixType& A, MatrixType& symmat) {
   MatrixType C;
-  C = A.transpose(); // NOTE: Could be  costly
-  for (int i = 0; i < C.rows(); i++) 
-  {
-      for (typename MatrixType::InnerIterator it(C, i); it; ++it)
-        it.valueRef() = typename MatrixType::Scalar(0);
+  C = A.transpose();  // NOTE: Could be  costly
+  for (int i = 0; i < C.rows(); i++) {
+    for (typename MatrixType::InnerIterator it(C, i); it; ++it) it.valueRef() = typename MatrixType::Scalar(0);
   }
   symmat = C + A;
 }
-    
-}
+
+}  // namespace internal
 
 /** \ingroup OrderingMethods_Module
-  * \class AMDOrdering
-  *
-  * Functor computing the \em approximate \em minimum \em degree ordering
-  * If the matrix is not structurally symmetric, an ordering of A^T+A is computed
-  * \tparam  StorageIndex The type of indices of the matrix 
-  * \sa COLAMDOrdering
-  */
+ * \class AMDOrdering
+ *
+ * Functor computing the \em approximate \em minimum \em degree ordering
+ * If the matrix is not structurally symmetric, an ordering of A^T+A is computed
+ * \tparam  StorageIndex The type of indices of the matrix
+ * \sa COLAMDOrdering
+ */
 template <typename StorageIndex>
-class AMDOrdering
-{
-  public:
-    typedef PermutationMatrix<Dynamic, Dynamic, StorageIndex> PermutationType;
-    
-    /** Compute the permutation vector from a sparse matrix
-     * This routine is much faster if the input matrix is column-major     
-     */
-    template <typename MatrixType>
-    void operator()(const MatrixType& mat, PermutationType& perm)
-    {
-      // Compute the symmetric pattern
-      SparseMatrix<typename MatrixType::Scalar, ColMajor, StorageIndex> symm;
-      internal::ordering_helper_at_plus_a(mat,symm); 
-    
-      // Call the AMD routine 
-      //m_mat.prune(keep_diag());
-      internal::minimum_degree_ordering(symm, perm);
-    }
-    
-    /** Compute the permutation with a selfadjoint matrix */
-    template <typename SrcType, unsigned int SrcUpLo> 
-    void operator()(const SparseSelfAdjointView<SrcType, SrcUpLo>& mat, PermutationType& perm)
-    { 
-      SparseMatrix<typename SrcType::Scalar, ColMajor, StorageIndex> C; C = mat;
-      
-      // Call the AMD routine 
-      // m_mat.prune(keep_diag()); //Remove the diagonal elements 
-      internal::minimum_degree_ordering(C, perm);
-    }
+class AMDOrdering {
+ public:
+  typedef PermutationMatrix<Dynamic, Dynamic, StorageIndex> PermutationType;
+
+  /** Compute the permutation vector from a sparse matrix
+   * This routine is much faster if the input matrix is column-major
+   */
+  template <typename MatrixType>
+  void operator()(const MatrixType& mat, PermutationType& perm) {
+    // Compute the symmetric pattern
+    SparseMatrix<typename MatrixType::Scalar, ColMajor, StorageIndex> symm;
+    internal::ordering_helper_at_plus_a(mat, symm);
+
+    // Call the AMD routine
+    // m_mat.prune(keep_diag());
+    internal::minimum_degree_ordering(symm, perm);
+  }
+
+  /** Compute the permutation with a selfadjoint matrix */
+  template <typename SrcType, unsigned int SrcUpLo>
+  void operator()(const SparseSelfAdjointView<SrcType, SrcUpLo>& mat, PermutationType& perm) {
+    SparseMatrix<typename SrcType::Scalar, ColMajor, StorageIndex> C;
+    C = mat;
+
+    // Call the AMD routine
+    // m_mat.prune(keep_diag()); //Remove the diagonal elements
+    internal::minimum_degree_ordering(C, perm);
+  }
 };
 
 /** \ingroup OrderingMethods_Module
-  * \class NaturalOrdering
-  *
-  * Functor computing the natural ordering (identity)
-  * 
-  * \note Returns an empty permutation matrix
-  * \tparam  StorageIndex The type of indices of the matrix 
-  */
+ * \class NaturalOrdering
+ *
+ * Functor computing the natural ordering (identity)
+ *
+ * \note Returns an empty permutation matrix
+ * \tparam  StorageIndex The type of indices of the matrix
+ */
 template <typename StorageIndex>
-class NaturalOrdering
-{
-  public:
-    typedef PermutationMatrix<Dynamic, Dynamic, StorageIndex> PermutationType;
-    
-    /** Compute the permutation vector from a column-major sparse matrix */
-    template <typename MatrixType>
-    void operator()(const MatrixType& /*mat*/, PermutationType& perm)
-    {
-      perm.resize(0); 
-    }
-    
+class NaturalOrdering {
+ public:
+  typedef PermutationMatrix<Dynamic, Dynamic, StorageIndex> PermutationType;
+
+  /** Compute the permutation vector from a column-major sparse matrix */
+  template <typename MatrixType>
+  void operator()(const MatrixType& /*mat*/, PermutationType& perm) {
+    perm.resize(0);
+  }
 };
 
 /** \ingroup OrderingMethods_Module
-  * \class COLAMDOrdering
-  *
-  * \tparam  StorageIndex The type of indices of the matrix 
-  * 
-  * Functor computing the \em column \em approximate \em minimum \em degree ordering 
-  * The matrix should be in column-major and \b compressed format (see SparseMatrix::makeCompressed()).
-  */
-template<typename StorageIndex>
-class COLAMDOrdering
-{
-  public:
-    typedef PermutationMatrix<Dynamic, Dynamic, StorageIndex> PermutationType; 
-    typedef Matrix<StorageIndex, Dynamic, 1> IndexVector;
-    
-    /** Compute the permutation vector \a perm form the sparse matrix \a mat
-      * \warning The input sparse matrix \a mat must be in compressed mode (see SparseMatrix::makeCompressed()).
-      */
-    template <typename MatrixType>
-    void operator() (const MatrixType& mat, PermutationType& perm)
-    {
-      eigen_assert(mat.isCompressed() && "COLAMDOrdering requires a sparse matrix in compressed mode. Call .makeCompressed() before passing it to COLAMDOrdering");
-      
-      StorageIndex m = StorageIndex(mat.rows());
-      StorageIndex n = StorageIndex(mat.cols());
-      StorageIndex nnz = StorageIndex(mat.nonZeros());
-      // Get the recommended value of Alen to be used by colamd
-      StorageIndex Alen = internal::Colamd::recommended(nnz, m, n); 
-      // Set the default parameters
-      double knobs [internal::Colamd::NKnobs]; 
-      StorageIndex stats [internal::Colamd::NStats];
-      internal::Colamd::set_defaults(knobs);
-      
-      IndexVector p(n+1), A(Alen); 
-      for(StorageIndex i=0; i <= n; i++)   p(i) = mat.outerIndexPtr()[i];
-      for(StorageIndex i=0; i < nnz; i++)  A(i) = mat.innerIndexPtr()[i];
-      // Call Colamd routine to compute the ordering 
-      StorageIndex info = internal::Colamd::compute_ordering(m, n, Alen, A.data(), p.data(), knobs, stats); 
-      EIGEN_UNUSED_VARIABLE(info);
-      eigen_assert( info && "COLAMD failed " );
-      
-      perm.resize(n);
-      for (StorageIndex i = 0; i < n; i++) perm.indices()(p(i)) = i;
-    }
+ * \class COLAMDOrdering
+ *
+ * \tparam  StorageIndex The type of indices of the matrix
+ *
+ * Functor computing the \em column \em approximate \em minimum \em degree ordering
+ * The matrix should be in column-major and \b compressed format (see SparseMatrix::makeCompressed()).
+ */
+template <typename StorageIndex>
+class COLAMDOrdering {
+ public:
+  typedef PermutationMatrix<Dynamic, Dynamic, StorageIndex> PermutationType;
+  typedef Matrix<StorageIndex, Dynamic, 1> IndexVector;
+
+  /** Compute the permutation vector \a perm form the sparse matrix \a mat
+   * \warning The input sparse matrix \a mat must be in compressed mode (see SparseMatrix::makeCompressed()).
+   */
+  template <typename MatrixType>
+  void operator()(const MatrixType& mat, PermutationType& perm) {
+    eigen_assert(mat.isCompressed() &&
+                 "COLAMDOrdering requires a sparse matrix in compressed mode. Call .makeCompressed() before passing it "
+                 "to COLAMDOrdering");
+
+    StorageIndex m = StorageIndex(mat.rows());
+    StorageIndex n = StorageIndex(mat.cols());
+    StorageIndex nnz = StorageIndex(mat.nonZeros());
+    // Get the recommended value of Alen to be used by colamd
+    StorageIndex Alen = internal::Colamd::recommended(nnz, m, n);
+    // Set the default parameters
+    double knobs[internal::Colamd::NKnobs];
+    StorageIndex stats[internal::Colamd::NStats];
+    internal::Colamd::set_defaults(knobs);
+
+    IndexVector p(n + 1), A(Alen);
+    for (StorageIndex i = 0; i <= n; i++) p(i) = mat.outerIndexPtr()[i];
+    for (StorageIndex i = 0; i < nnz; i++) A(i) = mat.innerIndexPtr()[i];
+    // Call Colamd routine to compute the ordering
+    StorageIndex info = internal::Colamd::compute_ordering(m, n, Alen, A.data(), p.data(), knobs, stats);
+    EIGEN_UNUSED_VARIABLE(info);
+    eigen_assert(info && "COLAMD failed ");
+
+    perm.resize(n);
+    for (StorageIndex i = 0; i < n; i++) perm.indices()(p(i)) = i;
+  }
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
 #endif
diff --git a/Eigen/src/PaStiXSupport/PaStiXSupport.h b/Eigen/src/PaStiXSupport/PaStiXSupport.h
index 3a067d5..fb75133 100644
--- a/Eigen/src/PaStiXSupport/PaStiXSupport.h
+++ b/Eigen/src/PaStiXSupport/PaStiXSupport.h
@@ -13,351 +13,336 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 #if defined(DCOMPLEX)
-  #define PASTIX_COMPLEX  COMPLEX
-  #define PASTIX_DCOMPLEX DCOMPLEX
+#define PASTIX_COMPLEX COMPLEX
+#define PASTIX_DCOMPLEX DCOMPLEX
 #else
-  #define PASTIX_COMPLEX  std::complex<float>
-  #define PASTIX_DCOMPLEX std::complex<double>
+#define PASTIX_COMPLEX std::complex<float>
+#define PASTIX_DCOMPLEX std::complex<double>
 #endif
 
 /** \ingroup PaStiXSupport_Module
-  * \brief Interface to the PaStix solver
-  * 
-  * This class is used to solve the linear systems A.X = B via the PaStix library. 
-  * The matrix can be either real or complex, symmetric or not.
-  *
-  * \sa TutorialSparseDirectSolvers
-  */
-template<typename MatrixType_, bool IsStrSym = false> class PastixLU;
-template<typename MatrixType_, int Options> class PastixLLT;
-template<typename MatrixType_, int Options> class PastixLDLT;
+ * \brief Interface to the PaStix solver
+ *
+ * This class is used to solve the linear systems A.X = B via the PaStix library.
+ * The matrix can be either real or complex, symmetric or not.
+ *
+ * \sa TutorialSparseDirectSolvers
+ */
+template <typename MatrixType_, bool IsStrSym = false>
+class PastixLU;
+template <typename MatrixType_, int Options>
+class PastixLLT;
+template <typename MatrixType_, int Options>
+class PastixLDLT;
 
-namespace internal
-{
-    
-  template<class Pastix> struct pastix_traits;
+namespace internal {
 
-  template<typename MatrixType_>
-  struct pastix_traits< PastixLU<MatrixType_> >
-  {
-    typedef MatrixType_ MatrixType;
-    typedef typename MatrixType_::Scalar Scalar;
-    typedef typename MatrixType_::RealScalar RealScalar;
-    typedef typename MatrixType_::StorageIndex StorageIndex;
-  };
+template <class Pastix>
+struct pastix_traits;
 
-  template<typename MatrixType_, int Options>
-  struct pastix_traits< PastixLLT<MatrixType_,Options> >
-  {
-    typedef MatrixType_ MatrixType;
-    typedef typename MatrixType_::Scalar Scalar;
-    typedef typename MatrixType_::RealScalar RealScalar;
-    typedef typename MatrixType_::StorageIndex StorageIndex;
-  };
+template <typename MatrixType_>
+struct pastix_traits<PastixLU<MatrixType_> > {
+  typedef MatrixType_ MatrixType;
+  typedef typename MatrixType_::Scalar Scalar;
+  typedef typename MatrixType_::RealScalar RealScalar;
+  typedef typename MatrixType_::StorageIndex StorageIndex;
+};
 
-  template<typename MatrixType_, int Options>
-  struct pastix_traits< PastixLDLT<MatrixType_,Options> >
-  {
-    typedef MatrixType_ MatrixType;
-    typedef typename MatrixType_::Scalar Scalar;
-    typedef typename MatrixType_::RealScalar RealScalar;
-    typedef typename MatrixType_::StorageIndex StorageIndex;
-  };
-  
-  inline void eigen_pastix(pastix_data_t **pastix_data, int pastix_comm, int n, int *ptr, int *idx, float *vals, int *perm, int * invp, float *x, int nbrhs, int *iparm, double *dparm)
-  {
-    if (n == 0) { ptr = NULL; idx = NULL; vals = NULL; }
-    if (nbrhs == 0) {x = NULL; nbrhs=1;}
-    s_pastix(pastix_data, pastix_comm, n, ptr, idx, vals, perm, invp, x, nbrhs, iparm, dparm); 
-  }
-  
-  inline void eigen_pastix(pastix_data_t **pastix_data, int pastix_comm, int n, int *ptr, int *idx, double *vals, int *perm, int * invp, double *x, int nbrhs, int *iparm, double *dparm)
-  {
-    if (n == 0) { ptr = NULL; idx = NULL; vals = NULL; }
-    if (nbrhs == 0) {x = NULL; nbrhs=1;}
-    d_pastix(pastix_data, pastix_comm, n, ptr, idx, vals, perm, invp, x, nbrhs, iparm, dparm); 
-  }
-  
-  inline void eigen_pastix(pastix_data_t **pastix_data, int pastix_comm, int n, int *ptr, int *idx, std::complex<float> *vals, int *perm, int * invp, std::complex<float> *x, int nbrhs, int *iparm, double *dparm)
-  {
-    if (n == 0) { ptr = NULL; idx = NULL; vals = NULL; }
-    if (nbrhs == 0) {x = NULL; nbrhs=1;}
-    c_pastix(pastix_data, pastix_comm, n, ptr, idx, reinterpret_cast<PASTIX_COMPLEX*>(vals), perm, invp, reinterpret_cast<PASTIX_COMPLEX*>(x), nbrhs, iparm, dparm); 
-  }
-  
-  inline void eigen_pastix(pastix_data_t **pastix_data, int pastix_comm, int n, int *ptr, int *idx, std::complex<double> *vals, int *perm, int * invp, std::complex<double> *x, int nbrhs, int *iparm, double *dparm)
-  {
-    if (n == 0) { ptr = NULL; idx = NULL; vals = NULL; }
-    if (nbrhs == 0) {x = NULL; nbrhs=1;}
-    z_pastix(pastix_data, pastix_comm, n, ptr, idx, reinterpret_cast<PASTIX_DCOMPLEX*>(vals), perm, invp, reinterpret_cast<PASTIX_DCOMPLEX*>(x), nbrhs, iparm, dparm); 
-  }
+template <typename MatrixType_, int Options>
+struct pastix_traits<PastixLLT<MatrixType_, Options> > {
+  typedef MatrixType_ MatrixType;
+  typedef typename MatrixType_::Scalar Scalar;
+  typedef typename MatrixType_::RealScalar RealScalar;
+  typedef typename MatrixType_::StorageIndex StorageIndex;
+};
 
-  // Convert the matrix  to Fortran-style Numbering
-  template <typename MatrixType>
-  void c_to_fortran_numbering (MatrixType& mat)
-  {
-    if ( !(mat.outerIndexPtr()[0]) ) 
-    { 
-      int i;
-      for(i = 0; i <= mat.rows(); ++i)
-        ++mat.outerIndexPtr()[i];
-      for(i = 0; i < mat.nonZeros(); ++i)
-        ++mat.innerIndexPtr()[i];
-    }
+template <typename MatrixType_, int Options>
+struct pastix_traits<PastixLDLT<MatrixType_, Options> > {
+  typedef MatrixType_ MatrixType;
+  typedef typename MatrixType_::Scalar Scalar;
+  typedef typename MatrixType_::RealScalar RealScalar;
+  typedef typename MatrixType_::StorageIndex StorageIndex;
+};
+
+inline void eigen_pastix(pastix_data_t **pastix_data, int pastix_comm, int n, int *ptr, int *idx, float *vals,
+                         int *perm, int *invp, float *x, int nbrhs, int *iparm, double *dparm) {
+  if (n == 0) {
+    ptr = NULL;
+    idx = NULL;
+    vals = NULL;
   }
-  
-  // Convert to C-style Numbering
-  template <typename MatrixType>
-  void fortran_to_c_numbering (MatrixType& mat)
-  {
-    // Check the Numbering
-    if ( mat.outerIndexPtr()[0] == 1 ) 
-    { // Convert to C-style numbering
-      int i;
-      for(i = 0; i <= mat.rows(); ++i)
-        --mat.outerIndexPtr()[i];
-      for(i = 0; i < mat.nonZeros(); ++i)
-        --mat.innerIndexPtr()[i];
-    }
+  if (nbrhs == 0) {
+    x = NULL;
+    nbrhs = 1;
+  }
+  s_pastix(pastix_data, pastix_comm, n, ptr, idx, vals, perm, invp, x, nbrhs, iparm, dparm);
+}
+
+inline void eigen_pastix(pastix_data_t **pastix_data, int pastix_comm, int n, int *ptr, int *idx, double *vals,
+                         int *perm, int *invp, double *x, int nbrhs, int *iparm, double *dparm) {
+  if (n == 0) {
+    ptr = NULL;
+    idx = NULL;
+    vals = NULL;
+  }
+  if (nbrhs == 0) {
+    x = NULL;
+    nbrhs = 1;
+  }
+  d_pastix(pastix_data, pastix_comm, n, ptr, idx, vals, perm, invp, x, nbrhs, iparm, dparm);
+}
+
+inline void eigen_pastix(pastix_data_t **pastix_data, int pastix_comm, int n, int *ptr, int *idx,
+                         std::complex<float> *vals, int *perm, int *invp, std::complex<float> *x, int nbrhs, int *iparm,
+                         double *dparm) {
+  if (n == 0) {
+    ptr = NULL;
+    idx = NULL;
+    vals = NULL;
+  }
+  if (nbrhs == 0) {
+    x = NULL;
+    nbrhs = 1;
+  }
+  c_pastix(pastix_data, pastix_comm, n, ptr, idx, reinterpret_cast<PASTIX_COMPLEX *>(vals), perm, invp,
+           reinterpret_cast<PASTIX_COMPLEX *>(x), nbrhs, iparm, dparm);
+}
+
+inline void eigen_pastix(pastix_data_t **pastix_data, int pastix_comm, int n, int *ptr, int *idx,
+                         std::complex<double> *vals, int *perm, int *invp, std::complex<double> *x, int nbrhs,
+                         int *iparm, double *dparm) {
+  if (n == 0) {
+    ptr = NULL;
+    idx = NULL;
+    vals = NULL;
+  }
+  if (nbrhs == 0) {
+    x = NULL;
+    nbrhs = 1;
+  }
+  z_pastix(pastix_data, pastix_comm, n, ptr, idx, reinterpret_cast<PASTIX_DCOMPLEX *>(vals), perm, invp,
+           reinterpret_cast<PASTIX_DCOMPLEX *>(x), nbrhs, iparm, dparm);
+}
+
+// Convert the matrix  to Fortran-style Numbering
+template <typename MatrixType>
+void c_to_fortran_numbering(MatrixType &mat) {
+  if (!(mat.outerIndexPtr()[0])) {
+    int i;
+    for (i = 0; i <= mat.rows(); ++i) ++mat.outerIndexPtr()[i];
+    for (i = 0; i < mat.nonZeros(); ++i) ++mat.innerIndexPtr()[i];
   }
 }
 
-// This is the base class to interface with PaStiX functions. 
-// Users should not used this class directly. 
+// Convert to C-style Numbering
+template <typename MatrixType>
+void fortran_to_c_numbering(MatrixType &mat) {
+  // Check the Numbering
+  if (mat.outerIndexPtr()[0] == 1) {  // Convert to C-style numbering
+    int i;
+    for (i = 0; i <= mat.rows(); ++i) --mat.outerIndexPtr()[i];
+    for (i = 0; i < mat.nonZeros(); ++i) --mat.innerIndexPtr()[i];
+  }
+}
+}  // namespace internal
+
+// This is the base class to interface with PaStiX functions.
+// Users should not used this class directly.
 template <class Derived>
-class PastixBase : public SparseSolverBase<Derived>
-{
-  protected:
-    typedef SparseSolverBase<Derived> Base;
-    using Base::derived;
-    using Base::m_isInitialized;
-  public:
-    using Base::_solve_impl;
-    
-    typedef typename internal::pastix_traits<Derived>::MatrixType MatrixType_;
-    typedef MatrixType_ MatrixType;
-    typedef typename MatrixType::Scalar Scalar;
-    typedef typename MatrixType::RealScalar RealScalar;
-    typedef typename MatrixType::StorageIndex StorageIndex;
-    typedef Matrix<Scalar,Dynamic,1> Vector;
-    typedef SparseMatrix<Scalar, ColMajor> ColSpMatrix;
-    enum {
-      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
-      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
-    };
-    
-  public:
-    
-    PastixBase() : m_initisOk(false), m_analysisIsOk(false), m_factorizationIsOk(false), m_pastixdata(0), m_size(0)
-    {
-      init();
-    }
-    
-    ~PastixBase() 
-    {
-      clean();
-    }
-    
-    template<typename Rhs,typename Dest>
-    bool _solve_impl(const MatrixBase<Rhs> &b, MatrixBase<Dest> &x) const;
-    
-    /** Returns a reference to the integer vector IPARM of PaStiX parameters
-      * to modify the default parameters. 
-      * The statistics related to the different phases of factorization and solve are saved here as well
-      * \sa analyzePattern() factorize()
-      */
-    Array<StorageIndex,IPARM_SIZE,1>& iparm()
-    {
-      return m_iparm; 
-    }
-    
-    /** Return a reference to a particular index parameter of the IPARM vector 
-     * \sa iparm()
-     */
-    
-    int& iparm(int idxparam)
-    {
-      return m_iparm(idxparam);
-    }
-    
-     /** Returns a reference to the double vector DPARM of PaStiX parameters 
-      * The statistics related to the different phases of factorization and solve are saved here as well
-      * \sa analyzePattern() factorize()
-      */
-    Array<double,DPARM_SIZE,1>& dparm()
-    {
-      return m_dparm; 
-    }
-    
-    
-    /** Return a reference to a particular index parameter of the DPARM vector 
-     * \sa dparm()
-     */
-    double& dparm(int idxparam)
-    {
-      return m_dparm(idxparam);
-    }
-    
-    inline Index cols() const { return m_size; }
-    inline Index rows() const { return m_size; }
-    
-     /** \brief Reports whether previous computation was successful.
-      *
-      * \returns \c Success if computation was successful,
-      *          \c NumericalIssue if the PaStiX reports a problem
-      *          \c InvalidInput if the input matrix is invalid
-      *
-      * \sa iparm()          
-      */
-    ComputationInfo info() const
-    {
-      eigen_assert(m_isInitialized && "Decomposition is not initialized.");
-      return m_info;
-    }
-    
-  protected:
+class PastixBase : public SparseSolverBase<Derived> {
+ protected:
+  typedef SparseSolverBase<Derived> Base;
+  using Base::derived;
+  using Base::m_isInitialized;
 
-    // Initialize the Pastix data structure, check the matrix
-    void init(); 
-    
-    // Compute the ordering and the symbolic factorization
-    void analyzePattern(ColSpMatrix& mat);
-    
-    // Compute the numerical factorization
-    void factorize(ColSpMatrix& mat);
-    
-    // Free all the data allocated by Pastix
-    void clean()
-    {
-      eigen_assert(m_initisOk && "The Pastix structure should be allocated first"); 
-      m_iparm(IPARM_START_TASK) = API_TASK_CLEAN;
-      m_iparm(IPARM_END_TASK) = API_TASK_CLEAN;
-      internal::eigen_pastix(&m_pastixdata, MPI_COMM_WORLD, 0, 0, 0, (Scalar*)0,
-                             m_perm.data(), m_invp.data(), 0, 0, m_iparm.data(), m_dparm.data());
-    }
-    
-    void compute(ColSpMatrix& mat);
-    
-    int m_initisOk; 
-    int m_analysisIsOk;
-    int m_factorizationIsOk;
-    mutable ComputationInfo m_info; 
-    mutable pastix_data_t *m_pastixdata; // Data structure for pastix
-    mutable int m_comm; // The MPI communicator identifier
-    mutable Array<int,IPARM_SIZE,1> m_iparm; // integer vector for the input parameters
-    mutable Array<double,DPARM_SIZE,1> m_dparm; // Scalar vector for the input parameters
-    mutable Matrix<StorageIndex,Dynamic,1> m_perm;  // Permutation vector
-    mutable Matrix<StorageIndex,Dynamic,1> m_invp;  // Inverse permutation vector
-    mutable int m_size; // Size of the matrix 
-}; 
+ public:
+  using Base::_solve_impl;
 
- /** Initialize the PaStiX data structure. 
-   *A first call to this function fills iparm and dparm with the default PaStiX parameters
-   * \sa iparm() dparm()
+  typedef typename internal::pastix_traits<Derived>::MatrixType MatrixType_;
+  typedef MatrixType_ MatrixType;
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::RealScalar RealScalar;
+  typedef typename MatrixType::StorageIndex StorageIndex;
+  typedef Matrix<Scalar, Dynamic, 1> Vector;
+  typedef SparseMatrix<Scalar, ColMajor> ColSpMatrix;
+  enum { ColsAtCompileTime = MatrixType::ColsAtCompileTime, MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime };
+
+ public:
+  PastixBase() : m_initisOk(false), m_analysisIsOk(false), m_factorizationIsOk(false), m_pastixdata(0), m_size(0) {
+    init();
+  }
+
+  ~PastixBase() { clean(); }
+
+  template <typename Rhs, typename Dest>
+  bool _solve_impl(const MatrixBase<Rhs> &b, MatrixBase<Dest> &x) const;
+
+  /** Returns a reference to the integer vector IPARM of PaStiX parameters
+   * to modify the default parameters.
+   * The statistics related to the different phases of factorization and solve are saved here as well
+   * \sa analyzePattern() factorize()
    */
+  Array<StorageIndex, IPARM_SIZE, 1> &iparm() { return m_iparm; }
+
+  /** Return a reference to a particular index parameter of the IPARM vector
+   * \sa iparm()
+   */
+
+  int &iparm(int idxparam) { return m_iparm(idxparam); }
+
+  /** Returns a reference to the double vector DPARM of PaStiX parameters
+   * The statistics related to the different phases of factorization and solve are saved here as well
+   * \sa analyzePattern() factorize()
+   */
+  Array<double, DPARM_SIZE, 1> &dparm() { return m_dparm; }
+
+  /** Return a reference to a particular index parameter of the DPARM vector
+   * \sa dparm()
+   */
+  double &dparm(int idxparam) { return m_dparm(idxparam); }
+
+  inline Index cols() const { return m_size; }
+  inline Index rows() const { return m_size; }
+
+  /** \brief Reports whether previous computation was successful.
+   *
+   * \returns \c Success if computation was successful,
+   *          \c NumericalIssue if the PaStiX reports a problem
+   *          \c InvalidInput if the input matrix is invalid
+   *
+   * \sa iparm()
+   */
+  ComputationInfo info() const {
+    eigen_assert(m_isInitialized && "Decomposition is not initialized.");
+    return m_info;
+  }
+
+ protected:
+  // Initialize the Pastix data structure, check the matrix
+  void init();
+
+  // Compute the ordering and the symbolic factorization
+  void analyzePattern(ColSpMatrix &mat);
+
+  // Compute the numerical factorization
+  void factorize(ColSpMatrix &mat);
+
+  // Free all the data allocated by Pastix
+  void clean() {
+    eigen_assert(m_initisOk && "The Pastix structure should be allocated first");
+    m_iparm(IPARM_START_TASK) = API_TASK_CLEAN;
+    m_iparm(IPARM_END_TASK) = API_TASK_CLEAN;
+    internal::eigen_pastix(&m_pastixdata, MPI_COMM_WORLD, 0, 0, 0, (Scalar *)0, m_perm.data(), m_invp.data(), 0, 0,
+                           m_iparm.data(), m_dparm.data());
+  }
+
+  void compute(ColSpMatrix &mat);
+
+  int m_initisOk;
+  int m_analysisIsOk;
+  int m_factorizationIsOk;
+  mutable ComputationInfo m_info;
+  mutable pastix_data_t *m_pastixdata;              // Data structure for pastix
+  mutable int m_comm;                               // The MPI communicator identifier
+  mutable Array<int, IPARM_SIZE, 1> m_iparm;        // integer vector for the input parameters
+  mutable Array<double, DPARM_SIZE, 1> m_dparm;     // Scalar vector for the input parameters
+  mutable Matrix<StorageIndex, Dynamic, 1> m_perm;  // Permutation vector
+  mutable Matrix<StorageIndex, Dynamic, 1> m_invp;  // Inverse permutation vector
+  mutable int m_size;                               // Size of the matrix
+};
+
+/** Initialize the PaStiX data structure.
+ *A first call to this function fills iparm and dparm with the default PaStiX parameters
+ * \sa iparm() dparm()
+ */
 template <class Derived>
-void PastixBase<Derived>::init()
-{
-  m_size = 0; 
+void PastixBase<Derived>::init() {
+  m_size = 0;
   m_iparm.setZero(IPARM_SIZE);
   m_dparm.setZero(DPARM_SIZE);
-  
+
   m_iparm(IPARM_MODIFY_PARAMETER) = API_NO;
-  pastix(&m_pastixdata, MPI_COMM_WORLD,
-         0, 0, 0, 0,
-         0, 0, 0, 1, m_iparm.data(), m_dparm.data());
-  
+  pastix(&m_pastixdata, MPI_COMM_WORLD, 0, 0, 0, 0, 0, 0, 0, 1, m_iparm.data(), m_dparm.data());
+
   m_iparm[IPARM_MATRIX_VERIFICATION] = API_NO;
-  m_iparm[IPARM_VERBOSE]             = API_VERBOSE_NOT;
-  m_iparm[IPARM_ORDERING]            = API_ORDER_SCOTCH;
-  m_iparm[IPARM_INCOMPLETE]          = API_NO;
-  m_iparm[IPARM_OOC_LIMIT]           = 2000;
-  m_iparm[IPARM_RHS_MAKING]          = API_RHS_B;
+  m_iparm[IPARM_VERBOSE] = API_VERBOSE_NOT;
+  m_iparm[IPARM_ORDERING] = API_ORDER_SCOTCH;
+  m_iparm[IPARM_INCOMPLETE] = API_NO;
+  m_iparm[IPARM_OOC_LIMIT] = 2000;
+  m_iparm[IPARM_RHS_MAKING] = API_RHS_B;
   m_iparm(IPARM_MATRIX_VERIFICATION) = API_NO;
-  
+
   m_iparm(IPARM_START_TASK) = API_TASK_INIT;
   m_iparm(IPARM_END_TASK) = API_TASK_INIT;
-  internal::eigen_pastix(&m_pastixdata, MPI_COMM_WORLD, 0, 0, 0, (Scalar*)0,
-                         0, 0, 0, 0, m_iparm.data(), m_dparm.data());
-  
+  internal::eigen_pastix(&m_pastixdata, MPI_COMM_WORLD, 0, 0, 0, (Scalar *)0, 0, 0, 0, 0, m_iparm.data(),
+                         m_dparm.data());
+
   // Check the returned error
-  if(m_iparm(IPARM_ERROR_NUMBER)) {
+  if (m_iparm(IPARM_ERROR_NUMBER)) {
     m_info = InvalidInput;
     m_initisOk = false;
-  }
-  else { 
+  } else {
     m_info = Success;
     m_initisOk = true;
   }
 }
 
 template <class Derived>
-void PastixBase<Derived>::compute(ColSpMatrix& mat)
-{
+void PastixBase<Derived>::compute(ColSpMatrix &mat) {
   eigen_assert(mat.rows() == mat.cols() && "The input matrix should be squared");
-  
-  analyzePattern(mat);  
+
+  analyzePattern(mat);
   factorize(mat);
-  
+
   m_iparm(IPARM_MATRIX_VERIFICATION) = API_NO;
 }
 
-
 template <class Derived>
-void PastixBase<Derived>::analyzePattern(ColSpMatrix& mat)
-{                         
+void PastixBase<Derived>::analyzePattern(ColSpMatrix &mat) {
   eigen_assert(m_initisOk && "The initialization of PaSTiX failed");
-  
+
   // clean previous calls
-  if(m_size>0)
-    clean();
-  
+  if (m_size > 0) clean();
+
   m_size = internal::convert_index<int>(mat.rows());
   m_perm.resize(m_size);
   m_invp.resize(m_size);
-  
+
   m_iparm(IPARM_START_TASK) = API_TASK_ORDERING;
   m_iparm(IPARM_END_TASK) = API_TASK_ANALYSE;
   internal::eigen_pastix(&m_pastixdata, MPI_COMM_WORLD, m_size, mat.outerIndexPtr(), mat.innerIndexPtr(),
-               mat.valuePtr(), m_perm.data(), m_invp.data(), 0, 0, m_iparm.data(), m_dparm.data());
-  
+                         mat.valuePtr(), m_perm.data(), m_invp.data(), 0, 0, m_iparm.data(), m_dparm.data());
+
   // Check the returned error
-  if(m_iparm(IPARM_ERROR_NUMBER))
-  {
+  if (m_iparm(IPARM_ERROR_NUMBER)) {
     m_info = NumericalIssue;
     m_analysisIsOk = false;
-  }
-  else
-  { 
+  } else {
     m_info = Success;
     m_analysisIsOk = true;
   }
 }
 
 template <class Derived>
-void PastixBase<Derived>::factorize(ColSpMatrix& mat)
-{
-//   if(&m_cpyMat != &mat) m_cpyMat = mat;
+void PastixBase<Derived>::factorize(ColSpMatrix &mat) {
+  //   if(&m_cpyMat != &mat) m_cpyMat = mat;
   eigen_assert(m_analysisIsOk && "The analysis phase should be called before the factorization phase");
   m_iparm(IPARM_START_TASK) = API_TASK_NUMFACT;
   m_iparm(IPARM_END_TASK) = API_TASK_NUMFACT;
   m_size = internal::convert_index<int>(mat.rows());
-  
+
   internal::eigen_pastix(&m_pastixdata, MPI_COMM_WORLD, m_size, mat.outerIndexPtr(), mat.innerIndexPtr(),
-               mat.valuePtr(), m_perm.data(), m_invp.data(), 0, 0, m_iparm.data(), m_dparm.data());
-  
+                         mat.valuePtr(), m_perm.data(), m_invp.data(), 0, 0, m_iparm.data(), m_dparm.data());
+
   // Check the returned error
-  if(m_iparm(IPARM_ERROR_NUMBER))
-  {
+  if (m_iparm(IPARM_ERROR_NUMBER)) {
     m_info = NumericalIssue;
     m_factorizationIsOk = false;
     m_isInitialized = false;
-  }
-  else
-  {
+  } else {
     m_info = Success;
     m_factorizationIsOk = true;
     m_isInitialized = true;
@@ -365,317 +350,283 @@
 }
 
 /* Solve the system */
-template<typename Base>
-template<typename Rhs,typename Dest>
-bool PastixBase<Base>::_solve_impl(const MatrixBase<Rhs> &b, MatrixBase<Dest> &x) const
-{
+template <typename Base>
+template <typename Rhs, typename Dest>
+bool PastixBase<Base>::_solve_impl(const MatrixBase<Rhs> &b, MatrixBase<Dest> &x) const {
   eigen_assert(m_isInitialized && "The matrix should be factorized first");
-  EIGEN_STATIC_ASSERT((Dest::Flags&RowMajorBit)==0,
-                     THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);
+  EIGEN_STATIC_ASSERT((Dest::Flags & RowMajorBit) == 0, THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);
   int rhs = 1;
-  
+
   x = b; /* on return, x is overwritten by the computed solution */
-  
-  for (int i = 0; i < b.cols(); i++){
-    m_iparm[IPARM_START_TASK]          = API_TASK_SOLVE;
-    m_iparm[IPARM_END_TASK]            = API_TASK_REFINE;
-  
+
+  for (int i = 0; i < b.cols(); i++) {
+    m_iparm[IPARM_START_TASK] = API_TASK_SOLVE;
+    m_iparm[IPARM_END_TASK] = API_TASK_REFINE;
+
     internal::eigen_pastix(&m_pastixdata, MPI_COMM_WORLD, internal::convert_index<int>(x.rows()), 0, 0, 0,
                            m_perm.data(), m_invp.data(), &x(0, i), rhs, m_iparm.data(), m_dparm.data());
   }
-  
+
   // Check the returned error
-  m_info = m_iparm(IPARM_ERROR_NUMBER)==0 ? Success : NumericalIssue;
-  
-  return m_iparm(IPARM_ERROR_NUMBER)==0;
+  m_info = m_iparm(IPARM_ERROR_NUMBER) == 0 ? Success : NumericalIssue;
+
+  return m_iparm(IPARM_ERROR_NUMBER) == 0;
 }
 
 /** \ingroup PaStiXSupport_Module
-  * \class PastixLU
-  * \brief Sparse direct LU solver based on PaStiX library
-  * 
-  * This class is used to solve the linear systems A.X = B with a supernodal LU 
-  * factorization in the PaStiX library. The matrix A should be squared and nonsingular
-  * PaStiX requires that the matrix A has a symmetric structural pattern. 
-  * This interface can symmetrize the input matrix otherwise. 
-  * The vectors or matrices X and B can be either dense or sparse.
-  * 
-  * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
-  * \tparam IsStrSym Indicates if the input matrix has a symmetric pattern, default is false
-  * NOTE : Note that if the analysis and factorization phase are called separately, 
-  * the input matrix will be symmetrized at each call, hence it is advised to 
-  * symmetrize the matrix in a end-user program and set \p IsStrSym to true
-  *
-  * \implsparsesolverconcept
-  *
-  * \sa \ref TutorialSparseSolverConcept, class SparseLU
-  * 
-  */
-template<typename MatrixType_, bool IsStrSym>
-class PastixLU : public PastixBase< PastixLU<MatrixType_> >
-{
-  public:
-    typedef MatrixType_ MatrixType;
-    typedef PastixBase<PastixLU<MatrixType> > Base;
-    typedef typename Base::ColSpMatrix ColSpMatrix;
-    typedef typename MatrixType::StorageIndex StorageIndex;
-    
-  public:
-    PastixLU() : Base()
-    {
-      init();
-    }
-    
-    explicit PastixLU(const MatrixType& matrix):Base()
-    {
-      init();
-      compute(matrix);
-    }
-    /** Compute the LU supernodal factorization of \p matrix. 
-      * iparm and dparm can be used to tune the PaStiX parameters. 
-      * see the PaStiX user's manual
-      * \sa analyzePattern() factorize()
-      */
-    void compute (const MatrixType& matrix)
-    {
-      m_structureIsUptodate = false;
-      ColSpMatrix temp;
-      grabMatrix(matrix, temp);
-      Base::compute(temp);
-    }
-    /** Compute the LU symbolic factorization of \p matrix using its sparsity pattern. 
-      * Several ordering methods can be used at this step. See the PaStiX user's manual. 
-      * The result of this operation can be used with successive matrices having the same pattern as \p matrix
-      * \sa factorize()
-      */
-    void analyzePattern(const MatrixType& matrix)
-    {
-      m_structureIsUptodate = false;
-      ColSpMatrix temp;
-      grabMatrix(matrix, temp);
-      Base::analyzePattern(temp);
-    }
+ * \class PastixLU
+ * \brief Sparse direct LU solver based on PaStiX library
+ *
+ * This class is used to solve the linear systems A.X = B with a supernodal LU
+ * factorization in the PaStiX library. The matrix A should be squared and nonsingular
+ * PaStiX requires that the matrix A has a symmetric structural pattern.
+ * This interface can symmetrize the input matrix otherwise.
+ * The vectors or matrices X and B can be either dense or sparse.
+ *
+ * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
+ * \tparam IsStrSym Indicates if the input matrix has a symmetric pattern, default is false
+ * NOTE : Note that if the analysis and factorization phase are called separately,
+ * the input matrix will be symmetrized at each call, hence it is advised to
+ * symmetrize the matrix in a end-user program and set \p IsStrSym to true
+ *
+ * \implsparsesolverconcept
+ *
+ * \sa \ref TutorialSparseSolverConcept, class SparseLU
+ *
+ */
+template <typename MatrixType_, bool IsStrSym>
+class PastixLU : public PastixBase<PastixLU<MatrixType_> > {
+ public:
+  typedef MatrixType_ MatrixType;
+  typedef PastixBase<PastixLU<MatrixType> > Base;
+  typedef typename Base::ColSpMatrix ColSpMatrix;
+  typedef typename MatrixType::StorageIndex StorageIndex;
 
-    /** Compute the LU supernodal factorization of \p matrix
-      * WARNING The matrix \p matrix should have the same structural pattern 
-      * as the same used in the analysis phase.
-      * \sa analyzePattern()
-      */ 
-    void factorize(const MatrixType& matrix)
-    {
-      ColSpMatrix temp;
-      grabMatrix(matrix, temp);
-      Base::factorize(temp);
-    }
-  protected:
-    
-    void init()
-    {
-      m_structureIsUptodate = false;
-      m_iparm(IPARM_SYM) = API_SYM_NO;
-      m_iparm(IPARM_FACTORIZATION) = API_FACT_LU;
-    }
-    
-    void grabMatrix(const MatrixType& matrix, ColSpMatrix& out)
-    {
-      if(IsStrSym)
-        out = matrix;
-      else
-      {
-        if(!m_structureIsUptodate)
-        {
-          // update the transposed structure
-          m_transposedStructure = matrix.transpose();
-          
-          // Set the elements of the matrix to zero 
-          for (Index j=0; j<m_transposedStructure.outerSize(); ++j) 
-            for(typename ColSpMatrix::InnerIterator it(m_transposedStructure, j); it; ++it)
-              it.valueRef() = 0.0;
+ public:
+  PastixLU() : Base() { init(); }
 
-          m_structureIsUptodate = true;
-        }
-        
-        out = m_transposedStructure + matrix;
+  explicit PastixLU(const MatrixType &matrix) : Base() {
+    init();
+    compute(matrix);
+  }
+  /** Compute the LU supernodal factorization of \p matrix.
+   * iparm and dparm can be used to tune the PaStiX parameters.
+   * see the PaStiX user's manual
+   * \sa analyzePattern() factorize()
+   */
+  void compute(const MatrixType &matrix) {
+    m_structureIsUptodate = false;
+    ColSpMatrix temp;
+    grabMatrix(matrix, temp);
+    Base::compute(temp);
+  }
+  /** Compute the LU symbolic factorization of \p matrix using its sparsity pattern.
+   * Several ordering methods can be used at this step. See the PaStiX user's manual.
+   * The result of this operation can be used with successive matrices having the same pattern as \p matrix
+   * \sa factorize()
+   */
+  void analyzePattern(const MatrixType &matrix) {
+    m_structureIsUptodate = false;
+    ColSpMatrix temp;
+    grabMatrix(matrix, temp);
+    Base::analyzePattern(temp);
+  }
+
+  /** Compute the LU supernodal factorization of \p matrix
+   * WARNING The matrix \p matrix should have the same structural pattern
+   * as the same used in the analysis phase.
+   * \sa analyzePattern()
+   */
+  void factorize(const MatrixType &matrix) {
+    ColSpMatrix temp;
+    grabMatrix(matrix, temp);
+    Base::factorize(temp);
+  }
+
+ protected:
+  void init() {
+    m_structureIsUptodate = false;
+    m_iparm(IPARM_SYM) = API_SYM_NO;
+    m_iparm(IPARM_FACTORIZATION) = API_FACT_LU;
+  }
+
+  void grabMatrix(const MatrixType &matrix, ColSpMatrix &out) {
+    if (IsStrSym)
+      out = matrix;
+    else {
+      if (!m_structureIsUptodate) {
+        // update the transposed structure
+        m_transposedStructure = matrix.transpose();
+
+        // Set the elements of the matrix to zero
+        for (Index j = 0; j < m_transposedStructure.outerSize(); ++j)
+          for (typename ColSpMatrix::InnerIterator it(m_transposedStructure, j); it; ++it) it.valueRef() = 0.0;
+
+        m_structureIsUptodate = true;
       }
-      internal::c_to_fortran_numbering(out);
+
+      out = m_transposedStructure + matrix;
     }
-    
-    using Base::m_iparm;
-    using Base::m_dparm;
-    
-    ColSpMatrix m_transposedStructure;
-    bool m_structureIsUptodate;
+    internal::c_to_fortran_numbering(out);
+  }
+
+  using Base::m_dparm;
+  using Base::m_iparm;
+
+  ColSpMatrix m_transposedStructure;
+  bool m_structureIsUptodate;
 };
 
 /** \ingroup PaStiXSupport_Module
-  * \class PastixLLT
-  * \brief A sparse direct supernodal Cholesky (LLT) factorization and solver based on the PaStiX library
-  * 
-  * This class is used to solve the linear systems A.X = B via a LL^T supernodal Cholesky factorization
-  * available in the PaStiX library. The matrix A should be symmetric and positive definite
-  * WARNING Selfadjoint complex matrices are not supported in the current version of PaStiX
-  * The vectors or matrices X and B can be either dense or sparse
-  * 
-  * \tparam MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>
-  * \tparam UpLo The part of the matrix to use : Lower or Upper. The default is Lower as required by PaStiX
-  *
-  * \implsparsesolverconcept
-  *
-  * \sa \ref TutorialSparseSolverConcept, class SimplicialLLT
-  */
-template<typename MatrixType_, int UpLo_>
-class PastixLLT : public PastixBase< PastixLLT<MatrixType_, UpLo_> >
-{
-  public:
-    typedef MatrixType_ MatrixType;
-    typedef PastixBase<PastixLLT<MatrixType, UpLo_> > Base;
-    typedef typename Base::ColSpMatrix ColSpMatrix;
-    
-  public:
-    enum { UpLo = UpLo_ };
-    PastixLLT() : Base()
-    {
-      init();
-    }
-    
-    explicit PastixLLT(const MatrixType& matrix):Base()
-    {
-      init();
-      compute(matrix);
-    }
+ * \class PastixLLT
+ * \brief A sparse direct supernodal Cholesky (LLT) factorization and solver based on the PaStiX library
+ *
+ * This class is used to solve the linear systems A.X = B via a LL^T supernodal Cholesky factorization
+ * available in the PaStiX library. The matrix A should be symmetric and positive definite
+ * WARNING Selfadjoint complex matrices are not supported in the current version of PaStiX
+ * The vectors or matrices X and B can be either dense or sparse
+ *
+ * \tparam MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>
+ * \tparam UpLo The part of the matrix to use : Lower or Upper. The default is Lower as required by PaStiX
+ *
+ * \implsparsesolverconcept
+ *
+ * \sa \ref TutorialSparseSolverConcept, class SimplicialLLT
+ */
+template <typename MatrixType_, int UpLo_>
+class PastixLLT : public PastixBase<PastixLLT<MatrixType_, UpLo_> > {
+ public:
+  typedef MatrixType_ MatrixType;
+  typedef PastixBase<PastixLLT<MatrixType, UpLo_> > Base;
+  typedef typename Base::ColSpMatrix ColSpMatrix;
 
-    /** Compute the L factor of the LL^T supernodal factorization of \p matrix 
-      * \sa analyzePattern() factorize()
-      */
-    void compute (const MatrixType& matrix)
-    {
-      ColSpMatrix temp;
-      grabMatrix(matrix, temp);
-      Base::compute(temp);
-    }
+ public:
+  enum { UpLo = UpLo_ };
+  PastixLLT() : Base() { init(); }
 
-     /** Compute the LL^T symbolic factorization of \p matrix using its sparsity pattern
-      * The result of this operation can be used with successive matrices having the same pattern as \p matrix
-      * \sa factorize()
-      */
-    void analyzePattern(const MatrixType& matrix)
-    {
-      ColSpMatrix temp;
-      grabMatrix(matrix, temp);
-      Base::analyzePattern(temp);
-    }
-      /** Compute the LL^T supernodal numerical factorization of \p matrix 
-        * \sa analyzePattern()
-        */
-    void factorize(const MatrixType& matrix)
-    {
-      ColSpMatrix temp;
-      grabMatrix(matrix, temp);
-      Base::factorize(temp);
-    }
-  protected:
-    using Base::m_iparm;
-    
-    void init()
-    {
-      m_iparm(IPARM_SYM) = API_SYM_YES;
-      m_iparm(IPARM_FACTORIZATION) = API_FACT_LLT;
-    }
-    
-    void grabMatrix(const MatrixType& matrix, ColSpMatrix& out)
-    {
-      out.resize(matrix.rows(), matrix.cols());
-      // Pastix supports only lower, column-major matrices 
-      out.template selfadjointView<Lower>() = matrix.template selfadjointView<UpLo>();
-      internal::c_to_fortran_numbering(out);
-    }
+  explicit PastixLLT(const MatrixType &matrix) : Base() {
+    init();
+    compute(matrix);
+  }
+
+  /** Compute the L factor of the LL^T supernodal factorization of \p matrix
+   * \sa analyzePattern() factorize()
+   */
+  void compute(const MatrixType &matrix) {
+    ColSpMatrix temp;
+    grabMatrix(matrix, temp);
+    Base::compute(temp);
+  }
+
+  /** Compute the LL^T symbolic factorization of \p matrix using its sparsity pattern
+   * The result of this operation can be used with successive matrices having the same pattern as \p matrix
+   * \sa factorize()
+   */
+  void analyzePattern(const MatrixType &matrix) {
+    ColSpMatrix temp;
+    grabMatrix(matrix, temp);
+    Base::analyzePattern(temp);
+  }
+  /** Compute the LL^T supernodal numerical factorization of \p matrix
+   * \sa analyzePattern()
+   */
+  void factorize(const MatrixType &matrix) {
+    ColSpMatrix temp;
+    grabMatrix(matrix, temp);
+    Base::factorize(temp);
+  }
+
+ protected:
+  using Base::m_iparm;
+
+  void init() {
+    m_iparm(IPARM_SYM) = API_SYM_YES;
+    m_iparm(IPARM_FACTORIZATION) = API_FACT_LLT;
+  }
+
+  void grabMatrix(const MatrixType &matrix, ColSpMatrix &out) {
+    out.resize(matrix.rows(), matrix.cols());
+    // Pastix supports only lower, column-major matrices
+    out.template selfadjointView<Lower>() = matrix.template selfadjointView<UpLo>();
+    internal::c_to_fortran_numbering(out);
+  }
 };
 
 /** \ingroup PaStiXSupport_Module
-  * \class PastixLDLT
-  * \brief A sparse direct supernodal Cholesky (LLT) factorization and solver based on the PaStiX library
-  * 
-  * This class is used to solve the linear systems A.X = B via a LDL^T supernodal Cholesky factorization
-  * available in the PaStiX library. The matrix A should be symmetric and positive definite
-  * WARNING Selfadjoint complex matrices are not supported in the current version of PaStiX
-  * The vectors or matrices X and B can be either dense or sparse
-  * 
-  * \tparam MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>
-  * \tparam UpLo The part of the matrix to use : Lower or Upper. The default is Lower as required by PaStiX
-  *
-  * \implsparsesolverconcept
-  *
-  * \sa \ref TutorialSparseSolverConcept, class SimplicialLDLT
-  */
-template<typename MatrixType_, int UpLo_>
-class PastixLDLT : public PastixBase< PastixLDLT<MatrixType_, UpLo_> >
-{
-  public:
-    typedef MatrixType_ MatrixType;
-    typedef PastixBase<PastixLDLT<MatrixType, UpLo_> > Base;
-    typedef typename Base::ColSpMatrix ColSpMatrix;
-    
-  public:
-    enum { UpLo = UpLo_ };
-    PastixLDLT():Base()
-    {
-      init();
-    }
-    
-    explicit PastixLDLT(const MatrixType& matrix):Base()
-    {
-      init();
-      compute(matrix);
-    }
+ * \class PastixLDLT
+ * \brief A sparse direct supernodal Cholesky (LLT) factorization and solver based on the PaStiX library
+ *
+ * This class is used to solve the linear systems A.X = B via a LDL^T supernodal Cholesky factorization
+ * available in the PaStiX library. The matrix A should be symmetric and positive definite
+ * WARNING Selfadjoint complex matrices are not supported in the current version of PaStiX
+ * The vectors or matrices X and B can be either dense or sparse
+ *
+ * \tparam MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>
+ * \tparam UpLo The part of the matrix to use : Lower or Upper. The default is Lower as required by PaStiX
+ *
+ * \implsparsesolverconcept
+ *
+ * \sa \ref TutorialSparseSolverConcept, class SimplicialLDLT
+ */
+template <typename MatrixType_, int UpLo_>
+class PastixLDLT : public PastixBase<PastixLDLT<MatrixType_, UpLo_> > {
+ public:
+  typedef MatrixType_ MatrixType;
+  typedef PastixBase<PastixLDLT<MatrixType, UpLo_> > Base;
+  typedef typename Base::ColSpMatrix ColSpMatrix;
 
-    /** Compute the L and D factors of the LDL^T factorization of \p matrix 
-      * \sa analyzePattern() factorize()
-      */
-    void compute (const MatrixType& matrix)
-    {
-      ColSpMatrix temp;
-      grabMatrix(matrix, temp);
-      Base::compute(temp);
-    }
+ public:
+  enum { UpLo = UpLo_ };
+  PastixLDLT() : Base() { init(); }
 
-    /** Compute the LDL^T symbolic factorization of \p matrix using its sparsity pattern
-      * The result of this operation can be used with successive matrices having the same pattern as \p matrix
-      * \sa factorize()
-      */
-    void analyzePattern(const MatrixType& matrix)
-    { 
-      ColSpMatrix temp;
-      grabMatrix(matrix, temp);
-      Base::analyzePattern(temp);
-    }
-    /** Compute the LDL^T supernodal numerical factorization of \p matrix 
-      * 
-      */
-    void factorize(const MatrixType& matrix)
-    {
-      ColSpMatrix temp;
-      grabMatrix(matrix, temp);
-      Base::factorize(temp);
-    }
+  explicit PastixLDLT(const MatrixType &matrix) : Base() {
+    init();
+    compute(matrix);
+  }
 
-  protected:
-    using Base::m_iparm;
-    
-    void init()
-    {
-      m_iparm(IPARM_SYM) = API_SYM_YES;
-      m_iparm(IPARM_FACTORIZATION) = API_FACT_LDLT;
-    }
-    
-    void grabMatrix(const MatrixType& matrix, ColSpMatrix& out)
-    {
-      // Pastix supports only lower, column-major matrices 
-      out.resize(matrix.rows(), matrix.cols());
-      out.template selfadjointView<Lower>() = matrix.template selfadjointView<UpLo>();
-      internal::c_to_fortran_numbering(out);
-    }
+  /** Compute the L and D factors of the LDL^T factorization of \p matrix
+   * \sa analyzePattern() factorize()
+   */
+  void compute(const MatrixType &matrix) {
+    ColSpMatrix temp;
+    grabMatrix(matrix, temp);
+    Base::compute(temp);
+  }
+
+  /** Compute the LDL^T symbolic factorization of \p matrix using its sparsity pattern
+   * The result of this operation can be used with successive matrices having the same pattern as \p matrix
+   * \sa factorize()
+   */
+  void analyzePattern(const MatrixType &matrix) {
+    ColSpMatrix temp;
+    grabMatrix(matrix, temp);
+    Base::analyzePattern(temp);
+  }
+  /** Compute the LDL^T supernodal numerical factorization of \p matrix
+   *
+   */
+  void factorize(const MatrixType &matrix) {
+    ColSpMatrix temp;
+    grabMatrix(matrix, temp);
+    Base::factorize(temp);
+  }
+
+ protected:
+  using Base::m_iparm;
+
+  void init() {
+    m_iparm(IPARM_SYM) = API_SYM_YES;
+    m_iparm(IPARM_FACTORIZATION) = API_FACT_LDLT;
+  }
+
+  void grabMatrix(const MatrixType &matrix, ColSpMatrix &out) {
+    // Pastix supports only lower, column-major matrices
+    out.resize(matrix.rows(), matrix.cols());
+    out.template selfadjointView<Lower>() = matrix.template selfadjointView<UpLo>();
+    internal::c_to_fortran_numbering(out);
+  }
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
 #endif
diff --git a/Eigen/src/PardisoSupport/PardisoSupport.h b/Eigen/src/PardisoSupport/PardisoSupport.h
index f9f7979..67c1167 100644
--- a/Eigen/src/PardisoSupport/PardisoSupport.h
+++ b/Eigen/src/PardisoSupport/PardisoSupport.h
@@ -35,244 +35,225 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
-template<typename MatrixType_> class PardisoLU;
-template<typename MatrixType_, int Options=Upper> class PardisoLLT;
-template<typename MatrixType_, int Options=Upper> class PardisoLDLT;
+template <typename MatrixType_>
+class PardisoLU;
+template <typename MatrixType_, int Options = Upper>
+class PardisoLLT;
+template <typename MatrixType_, int Options = Upper>
+class PardisoLDLT;
 
-namespace internal
-{
-  template<typename IndexType>
-  struct pardiso_run_selector
-  {
-    static IndexType run( _MKL_DSS_HANDLE_t pt, IndexType maxfct, IndexType mnum, IndexType type, IndexType phase, IndexType n, void *a,
-                      IndexType *ia, IndexType *ja, IndexType *perm, IndexType nrhs, IndexType *iparm, IndexType msglvl, void *b, void *x)
-    {
-      IndexType error = 0;
-      ::pardiso(pt, &maxfct, &mnum, &type, &phase, &n, a, ia, ja, perm, &nrhs, iparm, &msglvl, b, x, &error);
-      return error;
-    }
-  };
-  template<>
-  struct pardiso_run_selector<long long int>
-  {
-    typedef long long int IndexType;
-    static IndexType run( _MKL_DSS_HANDLE_t pt, IndexType maxfct, IndexType mnum, IndexType type, IndexType phase, IndexType n, void *a,
-                      IndexType *ia, IndexType *ja, IndexType *perm, IndexType nrhs, IndexType *iparm, IndexType msglvl, void *b, void *x)
-    {
-      IndexType error = 0;
-      ::pardiso_64(pt, &maxfct, &mnum, &type, &phase, &n, a, ia, ja, perm, &nrhs, iparm, &msglvl, b, x, &error);
-      return error;
-    }
-  };
-
-  template<class Pardiso> struct pardiso_traits;
-
-  template<typename MatrixType_>
-  struct pardiso_traits< PardisoLU<MatrixType_> >
-  {
-    typedef MatrixType_ MatrixType;
-    typedef typename MatrixType_::Scalar Scalar;
-    typedef typename MatrixType_::RealScalar RealScalar;
-    typedef typename MatrixType_::StorageIndex StorageIndex;
-  };
-
-  template<typename MatrixType_, int Options>
-  struct pardiso_traits< PardisoLLT<MatrixType_, Options> >
-  {
-    typedef MatrixType_ MatrixType;
-    typedef typename MatrixType_::Scalar Scalar;
-    typedef typename MatrixType_::RealScalar RealScalar;
-    typedef typename MatrixType_::StorageIndex StorageIndex;
-  };
-
-  template<typename MatrixType_, int Options>
-  struct pardiso_traits< PardisoLDLT<MatrixType_, Options> >
-  {
-    typedef MatrixType_ MatrixType;
-    typedef typename MatrixType_::Scalar Scalar;
-    typedef typename MatrixType_::RealScalar RealScalar;
-    typedef typename MatrixType_::StorageIndex StorageIndex;
-  };
-
-} // end namespace internal
-
-template<class Derived>
-class PardisoImpl : public SparseSolverBase<Derived>
-{
-  protected:
-    typedef SparseSolverBase<Derived> Base;
-    using Base::derived;
-    using Base::m_isInitialized;
-    
-    typedef internal::pardiso_traits<Derived> Traits;
-  public:
-    using Base::_solve_impl;
-    
-    typedef typename Traits::MatrixType MatrixType;
-    typedef typename Traits::Scalar Scalar;
-    typedef typename Traits::RealScalar RealScalar;
-    typedef typename Traits::StorageIndex StorageIndex;
-    typedef SparseMatrix<Scalar,RowMajor,StorageIndex> SparseMatrixType;
-    typedef Matrix<Scalar,Dynamic,1> VectorType;
-    typedef Matrix<StorageIndex, 1, MatrixType::ColsAtCompileTime> IntRowVectorType;
-    typedef Matrix<StorageIndex, MatrixType::RowsAtCompileTime, 1> IntColVectorType;
-    typedef Array<StorageIndex,64,1,DontAlign> ParameterType;
-    enum {
-      ScalarIsComplex = NumTraits<Scalar>::IsComplex,
-      ColsAtCompileTime = Dynamic,
-      MaxColsAtCompileTime = Dynamic
-    };
-
-    PardisoImpl()
-      : m_analysisIsOk(false), m_factorizationIsOk(false)
-    {
-      eigen_assert((sizeof(StorageIndex) >= sizeof(_INTEGER_t) && sizeof(StorageIndex) <= 8) && "Non-supported index type");
-      m_iparm.setZero();
-      m_msglvl = 0; // No output
-      m_isInitialized = false;
-    }
-
-    ~PardisoImpl()
-    {
-      pardisoRelease();
-    }
-
-    inline Index cols() const { return m_size; }
-    inline Index rows() const { return m_size; }
-  
-    /** \brief Reports whether previous computation was successful.
-      *
-      * \returns \c Success if computation was successful,
-      *          \c NumericalIssue if the matrix appears to be negative.
-      */
-    ComputationInfo info() const
-    {
-      eigen_assert(m_isInitialized && "Decomposition is not initialized.");
-      return m_info;
-    }
-
-    /** \warning for advanced usage only.
-      * \returns a reference to the parameter array controlling PARDISO.
-      * See the PARDISO manual to know how to use it. */
-    ParameterType& pardisoParameterArray()
-    {
-      return m_iparm;
-    }
-    
-    /** Performs a symbolic decomposition on the sparcity of \a matrix.
-      *
-      * This function is particularly useful when solving for several problems having the same structure.
-      * 
-      * \sa factorize()
-      */
-    Derived& analyzePattern(const MatrixType& matrix);
-    
-    /** Performs a numeric decomposition of \a matrix
-      *
-      * The given matrix must has the same sparcity than the matrix on which the symbolic decomposition has been performed.
-      *
-      * \sa analyzePattern()
-      */
-    Derived& factorize(const MatrixType& matrix);
-
-    Derived& compute(const MatrixType& matrix);
-
-    template<typename Rhs,typename Dest>
-    void _solve_impl(const MatrixBase<Rhs> &b, MatrixBase<Dest> &dest) const;
-
-  protected:
-    void pardisoRelease()
-    {
-      if(m_isInitialized) // Factorization ran at least once
-      {
-        internal::pardiso_run_selector<StorageIndex>::run(m_pt, 1, 1, m_type, -1, internal::convert_index<StorageIndex>(m_size),0, 0, 0, m_perm.data(), 0,
-                                                          m_iparm.data(), m_msglvl, NULL, NULL);
-        m_isInitialized = false;
-      }
-    }
-
-    void pardisoInit(int type)
-    {
-      m_type = type;
-      bool symmetric = std::abs(m_type) < 10;
-      m_iparm[0] = 1;   // No solver default
-      m_iparm[1] = 2;   // use Metis for the ordering
-      m_iparm[2] = 0;   // Reserved. Set to zero. (??Numbers of processors, value of OMP_NUM_THREADS??)
-      m_iparm[3] = 0;   // No iterative-direct algorithm
-      m_iparm[4] = 0;   // No user fill-in reducing permutation
-      m_iparm[5] = 0;   // Write solution into x, b is left unchanged
-      m_iparm[6] = 0;   // Not in use
-      m_iparm[7] = 2;   // Max numbers of iterative refinement steps
-      m_iparm[8] = 0;   // Not in use
-      m_iparm[9] = 13;  // Perturb the pivot elements with 1E-13
-      m_iparm[10] = symmetric ? 0 : 1; // Use nonsymmetric permutation and scaling MPS
-      m_iparm[11] = 0;  // Not in use
-      m_iparm[12] = symmetric ? 0 : 1;  // Maximum weighted matching algorithm is switched-off (default for symmetric).
-                                        // Try m_iparm[12] = 1 in case of inappropriate accuracy
-      m_iparm[13] = 0;  // Output: Number of perturbed pivots
-      m_iparm[14] = 0;  // Not in use
-      m_iparm[15] = 0;  // Not in use
-      m_iparm[16] = 0;  // Not in use
-      m_iparm[17] = -1; // Output: Number of nonzeros in the factor LU
-      m_iparm[18] = -1; // Output: Mflops for LU factorization
-      m_iparm[19] = 0;  // Output: Numbers of CG Iterations
-      
-      m_iparm[20] = 0;  // 1x1 pivoting
-      m_iparm[26] = 0;  // No matrix checker
-      m_iparm[27] = (sizeof(RealScalar) == 4) ? 1 : 0;
-      m_iparm[34] = 1;  // C indexing
-      m_iparm[36] = 0;  // CSR
-      m_iparm[59] = 0;  // 0 - In-Core ; 1 - Automatic switch between In-Core and Out-of-Core modes ; 2 - Out-of-Core
-      
-      memset(m_pt, 0, sizeof(m_pt));
-    }
-
-  protected:
-    // cached data to reduce reallocation, etc.
-    
-    void manageErrorCode(Index error) const
-    {
-      switch(error)
-      {
-        case 0:
-          m_info = Success;
-          break;
-        case -4:
-        case -7:
-          m_info = NumericalIssue;
-          break;
-        default:
-          m_info = InvalidInput;
-      }
-    }
-
-    mutable SparseMatrixType m_matrix;
-    mutable ComputationInfo m_info;
-    bool m_analysisIsOk, m_factorizationIsOk;
-    StorageIndex m_type, m_msglvl;
-    mutable void *m_pt[64];
-    mutable ParameterType m_iparm;
-    mutable IntColVectorType m_perm;
-    Index m_size;
-    
+namespace internal {
+template <typename IndexType>
+struct pardiso_run_selector {
+  static IndexType run(_MKL_DSS_HANDLE_t pt, IndexType maxfct, IndexType mnum, IndexType type, IndexType phase,
+                       IndexType n, void* a, IndexType* ia, IndexType* ja, IndexType* perm, IndexType nrhs,
+                       IndexType* iparm, IndexType msglvl, void* b, void* x) {
+    IndexType error = 0;
+    ::pardiso(pt, &maxfct, &mnum, &type, &phase, &n, a, ia, ja, perm, &nrhs, iparm, &msglvl, b, x, &error);
+    return error;
+  }
+};
+template <>
+struct pardiso_run_selector<long long int> {
+  typedef long long int IndexType;
+  static IndexType run(_MKL_DSS_HANDLE_t pt, IndexType maxfct, IndexType mnum, IndexType type, IndexType phase,
+                       IndexType n, void* a, IndexType* ia, IndexType* ja, IndexType* perm, IndexType nrhs,
+                       IndexType* iparm, IndexType msglvl, void* b, void* x) {
+    IndexType error = 0;
+    ::pardiso_64(pt, &maxfct, &mnum, &type, &phase, &n, a, ia, ja, perm, &nrhs, iparm, &msglvl, b, x, &error);
+    return error;
+  }
 };
 
-template<class Derived>
-Derived& PardisoImpl<Derived>::compute(const MatrixType& a)
-{
+template <class Pardiso>
+struct pardiso_traits;
+
+template <typename MatrixType_>
+struct pardiso_traits<PardisoLU<MatrixType_> > {
+  typedef MatrixType_ MatrixType;
+  typedef typename MatrixType_::Scalar Scalar;
+  typedef typename MatrixType_::RealScalar RealScalar;
+  typedef typename MatrixType_::StorageIndex StorageIndex;
+};
+
+template <typename MatrixType_, int Options>
+struct pardiso_traits<PardisoLLT<MatrixType_, Options> > {
+  typedef MatrixType_ MatrixType;
+  typedef typename MatrixType_::Scalar Scalar;
+  typedef typename MatrixType_::RealScalar RealScalar;
+  typedef typename MatrixType_::StorageIndex StorageIndex;
+};
+
+template <typename MatrixType_, int Options>
+struct pardiso_traits<PardisoLDLT<MatrixType_, Options> > {
+  typedef MatrixType_ MatrixType;
+  typedef typename MatrixType_::Scalar Scalar;
+  typedef typename MatrixType_::RealScalar RealScalar;
+  typedef typename MatrixType_::StorageIndex StorageIndex;
+};
+
+}  // end namespace internal
+
+template <class Derived>
+class PardisoImpl : public SparseSolverBase<Derived> {
+ protected:
+  typedef SparseSolverBase<Derived> Base;
+  using Base::derived;
+  using Base::m_isInitialized;
+
+  typedef internal::pardiso_traits<Derived> Traits;
+
+ public:
+  using Base::_solve_impl;
+
+  typedef typename Traits::MatrixType MatrixType;
+  typedef typename Traits::Scalar Scalar;
+  typedef typename Traits::RealScalar RealScalar;
+  typedef typename Traits::StorageIndex StorageIndex;
+  typedef SparseMatrix<Scalar, RowMajor, StorageIndex> SparseMatrixType;
+  typedef Matrix<Scalar, Dynamic, 1> VectorType;
+  typedef Matrix<StorageIndex, 1, MatrixType::ColsAtCompileTime> IntRowVectorType;
+  typedef Matrix<StorageIndex, MatrixType::RowsAtCompileTime, 1> IntColVectorType;
+  typedef Array<StorageIndex, 64, 1, DontAlign> ParameterType;
+  enum { ScalarIsComplex = NumTraits<Scalar>::IsComplex, ColsAtCompileTime = Dynamic, MaxColsAtCompileTime = Dynamic };
+
+  PardisoImpl() : m_analysisIsOk(false), m_factorizationIsOk(false) {
+    eigen_assert((sizeof(StorageIndex) >= sizeof(_INTEGER_t) && sizeof(StorageIndex) <= 8) &&
+                 "Non-supported index type");
+    m_iparm.setZero();
+    m_msglvl = 0;  // No output
+    m_isInitialized = false;
+  }
+
+  ~PardisoImpl() { pardisoRelease(); }
+
+  inline Index cols() const { return m_size; }
+  inline Index rows() const { return m_size; }
+
+  /** \brief Reports whether previous computation was successful.
+   *
+   * \returns \c Success if computation was successful,
+   *          \c NumericalIssue if the matrix appears to be negative.
+   */
+  ComputationInfo info() const {
+    eigen_assert(m_isInitialized && "Decomposition is not initialized.");
+    return m_info;
+  }
+
+  /** \warning for advanced usage only.
+   * \returns a reference to the parameter array controlling PARDISO.
+   * See the PARDISO manual to know how to use it. */
+  ParameterType& pardisoParameterArray() { return m_iparm; }
+
+  /** Performs a symbolic decomposition on the sparcity of \a matrix.
+   *
+   * This function is particularly useful when solving for several problems having the same structure.
+   *
+   * \sa factorize()
+   */
+  Derived& analyzePattern(const MatrixType& matrix);
+
+  /** Performs a numeric decomposition of \a matrix
+   *
+   * The given matrix must has the same sparcity than the matrix on which the symbolic decomposition has been performed.
+   *
+   * \sa analyzePattern()
+   */
+  Derived& factorize(const MatrixType& matrix);
+
+  Derived& compute(const MatrixType& matrix);
+
+  template <typename Rhs, typename Dest>
+  void _solve_impl(const MatrixBase<Rhs>& b, MatrixBase<Dest>& dest) const;
+
+ protected:
+  void pardisoRelease() {
+    if (m_isInitialized)  // Factorization ran at least once
+    {
+      internal::pardiso_run_selector<StorageIndex>::run(m_pt, 1, 1, m_type, -1,
+                                                        internal::convert_index<StorageIndex>(m_size), 0, 0, 0,
+                                                        m_perm.data(), 0, m_iparm.data(), m_msglvl, NULL, NULL);
+      m_isInitialized = false;
+    }
+  }
+
+  void pardisoInit(int type) {
+    m_type = type;
+    bool symmetric = std::abs(m_type) < 10;
+    m_iparm[0] = 1;                   // No solver default
+    m_iparm[1] = 2;                   // use Metis for the ordering
+    m_iparm[2] = 0;                   // Reserved. Set to zero. (??Numbers of processors, value of OMP_NUM_THREADS??)
+    m_iparm[3] = 0;                   // No iterative-direct algorithm
+    m_iparm[4] = 0;                   // No user fill-in reducing permutation
+    m_iparm[5] = 0;                   // Write solution into x, b is left unchanged
+    m_iparm[6] = 0;                   // Not in use
+    m_iparm[7] = 2;                   // Max numbers of iterative refinement steps
+    m_iparm[8] = 0;                   // Not in use
+    m_iparm[9] = 13;                  // Perturb the pivot elements with 1E-13
+    m_iparm[10] = symmetric ? 0 : 1;  // Use nonsymmetric permutation and scaling MPS
+    m_iparm[11] = 0;                  // Not in use
+    m_iparm[12] = symmetric ? 0 : 1;  // Maximum weighted matching algorithm is switched-off (default for symmetric).
+                                      // Try m_iparm[12] = 1 in case of inappropriate accuracy
+    m_iparm[13] = 0;                  // Output: Number of perturbed pivots
+    m_iparm[14] = 0;                  // Not in use
+    m_iparm[15] = 0;                  // Not in use
+    m_iparm[16] = 0;                  // Not in use
+    m_iparm[17] = -1;                 // Output: Number of nonzeros in the factor LU
+    m_iparm[18] = -1;                 // Output: Mflops for LU factorization
+    m_iparm[19] = 0;                  // Output: Numbers of CG Iterations
+
+    m_iparm[20] = 0;  // 1x1 pivoting
+    m_iparm[26] = 0;  // No matrix checker
+    m_iparm[27] = (sizeof(RealScalar) == 4) ? 1 : 0;
+    m_iparm[34] = 1;  // C indexing
+    m_iparm[36] = 0;  // CSR
+    m_iparm[59] = 0;  // 0 - In-Core ; 1 - Automatic switch between In-Core and Out-of-Core modes ; 2 - Out-of-Core
+
+    memset(m_pt, 0, sizeof(m_pt));
+  }
+
+ protected:
+  // cached data to reduce reallocation, etc.
+
+  void manageErrorCode(Index error) const {
+    switch (error) {
+      case 0:
+        m_info = Success;
+        break;
+      case -4:
+      case -7:
+        m_info = NumericalIssue;
+        break;
+      default:
+        m_info = InvalidInput;
+    }
+  }
+
+  mutable SparseMatrixType m_matrix;
+  mutable ComputationInfo m_info;
+  bool m_analysisIsOk, m_factorizationIsOk;
+  StorageIndex m_type, m_msglvl;
+  mutable void* m_pt[64];
+  mutable ParameterType m_iparm;
+  mutable IntColVectorType m_perm;
+  Index m_size;
+};
+
+template <class Derived>
+Derived& PardisoImpl<Derived>::compute(const MatrixType& a) {
   m_size = a.rows();
   eigen_assert(a.rows() == a.cols());
 
   pardisoRelease();
   m_perm.setZero(m_size);
   derived().getMatrix(a);
-  
+
   Index error;
-  error = internal::pardiso_run_selector<StorageIndex>::run(m_pt, 1, 1, m_type, 12, internal::convert_index<StorageIndex>(m_size),
-                                                            m_matrix.valuePtr(), m_matrix.outerIndexPtr(), m_matrix.innerIndexPtr(),
-                                                            m_perm.data(), 0, m_iparm.data(), m_msglvl, NULL, NULL);
+  error = internal::pardiso_run_selector<StorageIndex>::run(
+      m_pt, 1, 1, m_type, 12, internal::convert_index<StorageIndex>(m_size), m_matrix.valuePtr(),
+      m_matrix.outerIndexPtr(), m_matrix.innerIndexPtr(), m_perm.data(), 0, m_iparm.data(), m_msglvl, NULL, NULL);
   manageErrorCode(error);
   m_analysisIsOk = m_info == Eigen::Success;
   m_factorizationIsOk = m_info == Eigen::Success;
@@ -280,21 +261,20 @@
   return derived();
 }
 
-template<class Derived>
-Derived& PardisoImpl<Derived>::analyzePattern(const MatrixType& a)
-{
+template <class Derived>
+Derived& PardisoImpl<Derived>::analyzePattern(const MatrixType& a) {
   m_size = a.rows();
   eigen_assert(m_size == a.cols());
 
   pardisoRelease();
   m_perm.setZero(m_size);
   derived().getMatrix(a);
-  
+
   Index error;
-  error = internal::pardiso_run_selector<StorageIndex>::run(m_pt, 1, 1, m_type, 11, internal::convert_index<StorageIndex>(m_size),
-                                                            m_matrix.valuePtr(), m_matrix.outerIndexPtr(), m_matrix.innerIndexPtr(),
-                                                            m_perm.data(), 0, m_iparm.data(), m_msglvl, NULL, NULL);
-  
+  error = internal::pardiso_run_selector<StorageIndex>::run(
+      m_pt, 1, 1, m_type, 11, internal::convert_index<StorageIndex>(m_size), m_matrix.valuePtr(),
+      m_matrix.outerIndexPtr(), m_matrix.innerIndexPtr(), m_perm.data(), 0, m_iparm.data(), m_msglvl, NULL, NULL);
+
   manageErrorCode(error);
   m_analysisIsOk = m_info == Eigen::Success;
   m_factorizationIsOk = false;
@@ -302,247 +282,218 @@
   return derived();
 }
 
-template<class Derived>
-Derived& PardisoImpl<Derived>::factorize(const MatrixType& a)
-{
+template <class Derived>
+Derived& PardisoImpl<Derived>::factorize(const MatrixType& a) {
   eigen_assert(m_analysisIsOk && "You must first call analyzePattern()");
   eigen_assert(m_size == a.rows() && m_size == a.cols());
-  
+
   derived().getMatrix(a);
 
   Index error;
-  error = internal::pardiso_run_selector<StorageIndex>::run(m_pt, 1, 1, m_type, 22, internal::convert_index<StorageIndex>(m_size),
-                                                            m_matrix.valuePtr(), m_matrix.outerIndexPtr(), m_matrix.innerIndexPtr(),
-                                                            m_perm.data(), 0, m_iparm.data(), m_msglvl, NULL, NULL);
-  
+  error = internal::pardiso_run_selector<StorageIndex>::run(
+      m_pt, 1, 1, m_type, 22, internal::convert_index<StorageIndex>(m_size), m_matrix.valuePtr(),
+      m_matrix.outerIndexPtr(), m_matrix.innerIndexPtr(), m_perm.data(), 0, m_iparm.data(), m_msglvl, NULL, NULL);
+
   manageErrorCode(error);
   m_factorizationIsOk = m_info == Eigen::Success;
   return derived();
 }
 
-template<class Derived>
-template<typename BDerived,typename XDerived>
-void PardisoImpl<Derived>::_solve_impl(const MatrixBase<BDerived> &b, MatrixBase<XDerived>& x) const
-{
-  if(m_iparm[0] == 0) // Factorization was not computed
+template <class Derived>
+template <typename BDerived, typename XDerived>
+void PardisoImpl<Derived>::_solve_impl(const MatrixBase<BDerived>& b, MatrixBase<XDerived>& x) const {
+  if (m_iparm[0] == 0)  // Factorization was not computed
   {
     m_info = InvalidInput;
     return;
   }
 
-  //Index n = m_matrix.rows();
+  // Index n = m_matrix.rows();
   Index nrhs = Index(b.cols());
-  eigen_assert(m_size==b.rows());
-  eigen_assert(((MatrixBase<BDerived>::Flags & RowMajorBit) == 0 || nrhs == 1) && "Row-major right hand sides are not supported");
-  eigen_assert(((MatrixBase<XDerived>::Flags & RowMajorBit) == 0 || nrhs == 1) && "Row-major matrices of unknowns are not supported");
+  eigen_assert(m_size == b.rows());
+  eigen_assert(((MatrixBase<BDerived>::Flags & RowMajorBit) == 0 || nrhs == 1) &&
+               "Row-major right hand sides are not supported");
+  eigen_assert(((MatrixBase<XDerived>::Flags & RowMajorBit) == 0 || nrhs == 1) &&
+               "Row-major matrices of unknowns are not supported");
   eigen_assert(((nrhs == 1) || b.outerStride() == b.rows()));
 
-
-//  switch (transposed) {
-//    case SvNoTrans    : m_iparm[11] = 0 ; break;
-//    case SvTranspose  : m_iparm[11] = 2 ; break;
-//    case SvAdjoint    : m_iparm[11] = 1 ; break;
-//    default:
-//      //std::cerr << "Eigen: transposition  option \"" << transposed << "\" not supported by the PARDISO backend\n";
-//      m_iparm[11] = 0;
-//  }
+  //  switch (transposed) {
+  //    case SvNoTrans    : m_iparm[11] = 0 ; break;
+  //    case SvTranspose  : m_iparm[11] = 2 ; break;
+  //    case SvAdjoint    : m_iparm[11] = 1 ; break;
+  //    default:
+  //      //std::cerr << "Eigen: transposition  option \"" << transposed << "\" not supported by the PARDISO backend\n";
+  //      m_iparm[11] = 0;
+  //  }
 
   Scalar* rhs_ptr = const_cast<Scalar*>(b.derived().data());
-  Matrix<Scalar,Dynamic,Dynamic,ColMajor> tmp;
-  
+  Matrix<Scalar, Dynamic, Dynamic, ColMajor> tmp;
+
   // Pardiso cannot solve in-place
-  if(rhs_ptr == x.derived().data())
-  {
+  if (rhs_ptr == x.derived().data()) {
     tmp = b;
     rhs_ptr = tmp.data();
   }
-  
+
   Index error;
-  error = internal::pardiso_run_selector<StorageIndex>::run(m_pt, 1, 1, m_type, 33, internal::convert_index<StorageIndex>(m_size),
-                                                            m_matrix.valuePtr(), m_matrix.outerIndexPtr(), m_matrix.innerIndexPtr(),
-                                                            m_perm.data(), internal::convert_index<StorageIndex>(nrhs), m_iparm.data(), m_msglvl,
-                                                            rhs_ptr, x.derived().data());
+  error = internal::pardiso_run_selector<StorageIndex>::run(
+      m_pt, 1, 1, m_type, 33, internal::convert_index<StorageIndex>(m_size), m_matrix.valuePtr(),
+      m_matrix.outerIndexPtr(), m_matrix.innerIndexPtr(), m_perm.data(), internal::convert_index<StorageIndex>(nrhs),
+      m_iparm.data(), m_msglvl, rhs_ptr, x.derived().data());
 
   manageErrorCode(error);
 }
 
-
 /** \ingroup PardisoSupport_Module
-  * \class PardisoLU
-  * \brief A sparse direct LU factorization and solver based on the PARDISO library
-  *
-  * This class allows to solve for A.X = B sparse linear problems via a direct LU factorization
-  * using the Intel MKL PARDISO library. The sparse matrix A must be squared and invertible.
-  * The vectors or matrices X and B can be either dense or sparse.
-  *
-  * By default, it runs in in-core mode. To enable PARDISO's out-of-core feature, set:
-  * \code solver.pardisoParameterArray()[59] = 1; \endcode
-  *
-  * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
-  *
-  * \implsparsesolverconcept
-  *
-  * \sa \ref TutorialSparseSolverConcept, class SparseLU
-  */
-template<typename MatrixType>
-class PardisoLU : public PardisoImpl< PardisoLU<MatrixType> >
-{
-  protected:
-    typedef PardisoImpl<PardisoLU> Base;
-    using Base::pardisoInit;
-    using Base::m_matrix;
-    friend class PardisoImpl< PardisoLU<MatrixType> >;
+ * \class PardisoLU
+ * \brief A sparse direct LU factorization and solver based on the PARDISO library
+ *
+ * This class allows to solve for A.X = B sparse linear problems via a direct LU factorization
+ * using the Intel MKL PARDISO library. The sparse matrix A must be squared and invertible.
+ * The vectors or matrices X and B can be either dense or sparse.
+ *
+ * By default, it runs in in-core mode. To enable PARDISO's out-of-core feature, set:
+ * \code solver.pardisoParameterArray()[59] = 1; \endcode
+ *
+ * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
+ *
+ * \implsparsesolverconcept
+ *
+ * \sa \ref TutorialSparseSolverConcept, class SparseLU
+ */
+template <typename MatrixType>
+class PardisoLU : public PardisoImpl<PardisoLU<MatrixType> > {
+ protected:
+  typedef PardisoImpl<PardisoLU> Base;
+  using Base::m_matrix;
+  using Base::pardisoInit;
+  friend class PardisoImpl<PardisoLU<MatrixType> >;
 
-  public:
+ public:
+  typedef typename Base::Scalar Scalar;
+  typedef typename Base::RealScalar RealScalar;
 
-    typedef typename Base::Scalar Scalar;
-    typedef typename Base::RealScalar RealScalar;
+  using Base::compute;
+  using Base::solve;
 
-    using Base::compute;
-    using Base::solve;
+  PardisoLU() : Base() { pardisoInit(Base::ScalarIsComplex ? 13 : 11); }
 
-    PardisoLU()
-      : Base()
-    {
-      pardisoInit(Base::ScalarIsComplex ? 13 : 11);
-    }
+  explicit PardisoLU(const MatrixType& matrix) : Base() {
+    pardisoInit(Base::ScalarIsComplex ? 13 : 11);
+    compute(matrix);
+  }
 
-    explicit PardisoLU(const MatrixType& matrix)
-      : Base()
-    {
-      pardisoInit(Base::ScalarIsComplex ? 13 : 11);
-      compute(matrix);
-    }
-  protected:
-    void getMatrix(const MatrixType& matrix)
-    {
-      m_matrix = matrix;
-      m_matrix.makeCompressed();
-    }
+ protected:
+  void getMatrix(const MatrixType& matrix) {
+    m_matrix = matrix;
+    m_matrix.makeCompressed();
+  }
 };
 
 /** \ingroup PardisoSupport_Module
-  * \class PardisoLLT
-  * \brief A sparse direct Cholesky (LLT) factorization and solver based on the PARDISO library
-  *
-  * This class allows to solve for A.X = B sparse linear problems via a LL^T Cholesky factorization
-  * using the Intel MKL PARDISO library. The sparse matrix A must be selfajoint and positive definite.
-  * The vectors or matrices X and B can be either dense or sparse.
-  *
-  * By default, it runs in in-core mode. To enable PARDISO's out-of-core feature, set:
-  * \code solver.pardisoParameterArray()[59] = 1; \endcode
-  *
-  * \tparam MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>
-  * \tparam UpLo can be any bitwise combination of Upper, Lower. The default is Upper, meaning only the upper triangular part has to be used.
-  *         Upper|Lower can be used to tell both triangular parts can be used as input.
-  *
-  * \implsparsesolverconcept
-  *
-  * \sa \ref TutorialSparseSolverConcept, class SimplicialLLT
-  */
-template<typename MatrixType, int UpLo_>
-class PardisoLLT : public PardisoImpl< PardisoLLT<MatrixType,UpLo_> >
-{
-  protected:
-    typedef PardisoImpl< PardisoLLT<MatrixType,UpLo_> > Base;
-    using Base::pardisoInit;
-    using Base::m_matrix;
-    friend class PardisoImpl< PardisoLLT<MatrixType,UpLo_> >;
+ * \class PardisoLLT
+ * \brief A sparse direct Cholesky (LLT) factorization and solver based on the PARDISO library
+ *
+ * This class allows to solve for A.X = B sparse linear problems via a LL^T Cholesky factorization
+ * using the Intel MKL PARDISO library. The sparse matrix A must be selfajoint and positive definite.
+ * The vectors or matrices X and B can be either dense or sparse.
+ *
+ * By default, it runs in in-core mode. To enable PARDISO's out-of-core feature, set:
+ * \code solver.pardisoParameterArray()[59] = 1; \endcode
+ *
+ * \tparam MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>
+ * \tparam UpLo can be any bitwise combination of Upper, Lower. The default is Upper, meaning only the upper triangular
+ * part has to be used. Upper|Lower can be used to tell both triangular parts can be used as input.
+ *
+ * \implsparsesolverconcept
+ *
+ * \sa \ref TutorialSparseSolverConcept, class SimplicialLLT
+ */
+template <typename MatrixType, int UpLo_>
+class PardisoLLT : public PardisoImpl<PardisoLLT<MatrixType, UpLo_> > {
+ protected:
+  typedef PardisoImpl<PardisoLLT<MatrixType, UpLo_> > Base;
+  using Base::m_matrix;
+  using Base::pardisoInit;
+  friend class PardisoImpl<PardisoLLT<MatrixType, UpLo_> >;
 
-  public:
+ public:
+  typedef typename Base::Scalar Scalar;
+  typedef typename Base::RealScalar RealScalar;
+  typedef typename Base::StorageIndex StorageIndex;
+  enum { UpLo = UpLo_ };
+  using Base::compute;
 
-    typedef typename Base::Scalar Scalar;
-    typedef typename Base::RealScalar RealScalar;
-    typedef typename Base::StorageIndex StorageIndex;
-    enum { UpLo = UpLo_ };
-    using Base::compute;
+  PardisoLLT() : Base() { pardisoInit(Base::ScalarIsComplex ? 4 : 2); }
 
-    PardisoLLT()
-      : Base()
-    {
-      pardisoInit(Base::ScalarIsComplex ? 4 : 2);
-    }
+  explicit PardisoLLT(const MatrixType& matrix) : Base() {
+    pardisoInit(Base::ScalarIsComplex ? 4 : 2);
+    compute(matrix);
+  }
 
-    explicit PardisoLLT(const MatrixType& matrix)
-      : Base()
-    {
-      pardisoInit(Base::ScalarIsComplex ? 4 : 2);
-      compute(matrix);
-    }
-    
-  protected:
-    
-    void getMatrix(const MatrixType& matrix)
-    {
-      // PARDISO supports only upper, row-major matrices
-      PermutationMatrix<Dynamic,Dynamic,StorageIndex> p_null;
-      m_matrix.resize(matrix.rows(), matrix.cols());
-      m_matrix.template selfadjointView<Upper>() = matrix.template selfadjointView<UpLo>().twistedBy(p_null);
-      m_matrix.makeCompressed();
-    }
+ protected:
+  void getMatrix(const MatrixType& matrix) {
+    // PARDISO supports only upper, row-major matrices
+    PermutationMatrix<Dynamic, Dynamic, StorageIndex> p_null;
+    m_matrix.resize(matrix.rows(), matrix.cols());
+    m_matrix.template selfadjointView<Upper>() = matrix.template selfadjointView<UpLo>().twistedBy(p_null);
+    m_matrix.makeCompressed();
+  }
 };
 
 /** \ingroup PardisoSupport_Module
-  * \class PardisoLDLT
-  * \brief A sparse direct Cholesky (LDLT) factorization and solver based on the PARDISO library
-  *
-  * This class allows to solve for A.X = B sparse linear problems via a LDL^T Cholesky factorization
-  * using the Intel MKL PARDISO library. The sparse matrix A is assumed to be selfajoint and positive definite.
-  * For complex matrices, A can also be symmetric only, see the \a Options template parameter.
-  * The vectors or matrices X and B can be either dense or sparse.
-  *
-  * By default, it runs in in-core mode. To enable PARDISO's out-of-core feature, set:
-  * \code solver.pardisoParameterArray()[59] = 1; \endcode
-  *
-  * \tparam MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>
-  * \tparam Options can be any bitwise combination of Upper, Lower, and Symmetric. The default is Upper, meaning only the upper triangular part has to be used.
-  *         Symmetric can be used for symmetric, non-selfadjoint complex matrices, the default being to assume a selfadjoint matrix.
-  *         Upper|Lower can be used to tell both triangular parts can be used as input.
-  *
-  * \implsparsesolverconcept
-  *
-  * \sa \ref TutorialSparseSolverConcept, class SimplicialLDLT
-  */
-template<typename MatrixType, int Options>
-class PardisoLDLT : public PardisoImpl< PardisoLDLT<MatrixType,Options> >
-{
-  protected:
-    typedef PardisoImpl< PardisoLDLT<MatrixType,Options> > Base;
-    using Base::pardisoInit;
-    using Base::m_matrix;
-    friend class PardisoImpl< PardisoLDLT<MatrixType,Options> >;
+ * \class PardisoLDLT
+ * \brief A sparse direct Cholesky (LDLT) factorization and solver based on the PARDISO library
+ *
+ * This class allows to solve for A.X = B sparse linear problems via a LDL^T Cholesky factorization
+ * using the Intel MKL PARDISO library. The sparse matrix A is assumed to be selfajoint and positive definite.
+ * For complex matrices, A can also be symmetric only, see the \a Options template parameter.
+ * The vectors or matrices X and B can be either dense or sparse.
+ *
+ * By default, it runs in in-core mode. To enable PARDISO's out-of-core feature, set:
+ * \code solver.pardisoParameterArray()[59] = 1; \endcode
+ *
+ * \tparam MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>
+ * \tparam Options can be any bitwise combination of Upper, Lower, and Symmetric. The default is Upper, meaning only the
+ * upper triangular part has to be used. Symmetric can be used for symmetric, non-selfadjoint complex matrices, the
+ * default being to assume a selfadjoint matrix. Upper|Lower can be used to tell both triangular parts can be used as
+ * input.
+ *
+ * \implsparsesolverconcept
+ *
+ * \sa \ref TutorialSparseSolverConcept, class SimplicialLDLT
+ */
+template <typename MatrixType, int Options>
+class PardisoLDLT : public PardisoImpl<PardisoLDLT<MatrixType, Options> > {
+ protected:
+  typedef PardisoImpl<PardisoLDLT<MatrixType, Options> > Base;
+  using Base::m_matrix;
+  using Base::pardisoInit;
+  friend class PardisoImpl<PardisoLDLT<MatrixType, Options> >;
 
-  public:
+ public:
+  typedef typename Base::Scalar Scalar;
+  typedef typename Base::RealScalar RealScalar;
+  typedef typename Base::StorageIndex StorageIndex;
+  using Base::compute;
+  enum { UpLo = Options & (Upper | Lower) };
 
-    typedef typename Base::Scalar Scalar;
-    typedef typename Base::RealScalar RealScalar;
-    typedef typename Base::StorageIndex StorageIndex;
-    using Base::compute;
-    enum { UpLo = Options&(Upper|Lower) };
+  PardisoLDLT() : Base() { pardisoInit(Base::ScalarIsComplex ? (bool(Options & Symmetric) ? 6 : -4) : -2); }
 
-    PardisoLDLT()
-      : Base()
-    {
-      pardisoInit(Base::ScalarIsComplex ? ( bool(Options&Symmetric) ? 6 : -4 ) : -2);
-    }
+  explicit PardisoLDLT(const MatrixType& matrix) : Base() {
+    pardisoInit(Base::ScalarIsComplex ? (bool(Options & Symmetric) ? 6 : -4) : -2);
+    compute(matrix);
+  }
 
-    explicit PardisoLDLT(const MatrixType& matrix)
-      : Base()
-    {
-      pardisoInit(Base::ScalarIsComplex ? ( bool(Options&Symmetric) ? 6 : -4 ) : -2);
-      compute(matrix);
-    }
-    
-    void getMatrix(const MatrixType& matrix)
-    {
-      // PARDISO supports only upper, row-major matrices
-      PermutationMatrix<Dynamic,Dynamic,StorageIndex> p_null;
-      m_matrix.resize(matrix.rows(), matrix.cols());
-      m_matrix.template selfadjointView<Upper>() = matrix.template selfadjointView<UpLo>().twistedBy(p_null);
-      m_matrix.makeCompressed();
-    }
+  void getMatrix(const MatrixType& matrix) {
+    // PARDISO supports only upper, row-major matrices
+    PermutationMatrix<Dynamic, Dynamic, StorageIndex> p_null;
+    m_matrix.resize(matrix.rows(), matrix.cols());
+    m_matrix.template selfadjointView<Upper>() = matrix.template selfadjointView<UpLo>().twistedBy(p_null);
+    m_matrix.makeCompressed();
+  }
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_PARDISOSUPPORT_H
+#endif  // EIGEN_PARDISOSUPPORT_H
diff --git a/Eigen/src/QR/ColPivHouseholderQR.h b/Eigen/src/QR/ColPivHouseholderQR.h
index 0f48683..f1de6fd 100644
--- a/Eigen/src/QR/ColPivHouseholderQR.h
+++ b/Eigen/src/QR/ColPivHouseholderQR.h
@@ -17,85 +17,82 @@
 namespace Eigen {
 
 namespace internal {
-template<typename MatrixType_, typename PermutationIndex_> struct traits<ColPivHouseholderQR<MatrixType_, PermutationIndex_> >
- : traits<MatrixType_>
-{
+template <typename MatrixType_, typename PermutationIndex_>
+struct traits<ColPivHouseholderQR<MatrixType_, PermutationIndex_>> : traits<MatrixType_> {
   typedef MatrixXpr XprKind;
   typedef SolverStorage StorageKind;
   typedef PermutationIndex_ PermutationIndex;
   enum { Flags = 0 };
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \ingroup QR_Module
-  *
-  * \class ColPivHouseholderQR
-  *
-  * \brief Householder rank-revealing QR decomposition of a matrix with column-pivoting
-  *
-  * \tparam MatrixType_ the type of the matrix of which we are computing the QR decomposition
-  *
-  * This class performs a rank-revealing QR decomposition of a matrix \b A into matrices \b P, \b Q and \b R
-  * such that
-  * \f[
-  *  \mathbf{A} \, \mathbf{P} = \mathbf{Q} \, \mathbf{R}
-  * \f]
-  * by using Householder transformations. Here, \b P is a permutation matrix, \b Q a unitary matrix and \b R an
-  * upper triangular matrix.
-  *
-  * This decomposition performs column pivoting in order to be rank-revealing and improve
-  * numerical stability. It is slower than HouseholderQR, and faster than FullPivHouseholderQR.
-  *
-  * This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism.
-  * 
-  * \sa MatrixBase::colPivHouseholderQr()
-  */
-template<typename MatrixType_, typename PermutationIndex_> class ColPivHouseholderQR
-        : public SolverBase<ColPivHouseholderQR<MatrixType_, PermutationIndex_> >
-{
-  public:
+ *
+ * \class ColPivHouseholderQR
+ *
+ * \brief Householder rank-revealing QR decomposition of a matrix with column-pivoting
+ *
+ * \tparam MatrixType_ the type of the matrix of which we are computing the QR decomposition
+ *
+ * This class performs a rank-revealing QR decomposition of a matrix \b A into matrices \b P, \b Q and \b R
+ * such that
+ * \f[
+ *  \mathbf{A} \, \mathbf{P} = \mathbf{Q} \, \mathbf{R}
+ * \f]
+ * by using Householder transformations. Here, \b P is a permutation matrix, \b Q a unitary matrix and \b R an
+ * upper triangular matrix.
+ *
+ * This decomposition performs column pivoting in order to be rank-revealing and improve
+ * numerical stability. It is slower than HouseholderQR, and faster than FullPivHouseholderQR.
+ *
+ * This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism.
+ *
+ * \sa MatrixBase::colPivHouseholderQr()
+ */
+template <typename MatrixType_, typename PermutationIndex_>
+class ColPivHouseholderQR : public SolverBase<ColPivHouseholderQR<MatrixType_, PermutationIndex_>> {
+ public:
+  typedef MatrixType_ MatrixType;
+  typedef SolverBase<ColPivHouseholderQR> Base;
+  friend class SolverBase<ColPivHouseholderQR>;
+  typedef PermutationIndex_ PermutationIndex;
+  EIGEN_GENERIC_PUBLIC_INTERFACE(ColPivHouseholderQR)
 
-    typedef MatrixType_ MatrixType;
-    typedef SolverBase<ColPivHouseholderQR> Base;
-    friend class SolverBase<ColPivHouseholderQR>;
-    typedef PermutationIndex_ PermutationIndex;
-    EIGEN_GENERIC_PUBLIC_INTERFACE(ColPivHouseholderQR)
+  enum {
+    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
+  };
+  typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
+  typedef PermutationMatrix<ColsAtCompileTime, MaxColsAtCompileTime, PermutationIndex> PermutationType;
+  typedef typename internal::plain_row_type<MatrixType, PermutationIndex>::type IntRowVectorType;
+  typedef typename internal::plain_row_type<MatrixType>::type RowVectorType;
+  typedef typename internal::plain_row_type<MatrixType, RealScalar>::type RealRowVectorType;
+  typedef HouseholderSequence<MatrixType, internal::remove_all_t<typename HCoeffsType::ConjugateReturnType>>
+      HouseholderSequenceType;
+  typedef typename MatrixType::PlainObject PlainObject;
 
-    enum {
-      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
-      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
-    };
-    typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
-    typedef PermutationMatrix<ColsAtCompileTime, MaxColsAtCompileTime, PermutationIndex> PermutationType;
-    typedef typename internal::plain_row_type<MatrixType, PermutationIndex>::type IntRowVectorType;
-    typedef typename internal::plain_row_type<MatrixType>::type RowVectorType;
-    typedef typename internal::plain_row_type<MatrixType, RealScalar>::type RealRowVectorType;
-    typedef HouseholderSequence<MatrixType,internal::remove_all_t<typename HCoeffsType::ConjugateReturnType>> HouseholderSequenceType;
-    typedef typename MatrixType::PlainObject PlainObject;
+ private:
+  void init(Index rows, Index cols) {
+    Index diag = numext::mini(rows, cols);
+    m_hCoeffs.resize(diag);
+    m_colsPermutation.resize(cols);
+    m_colsTranspositions.resize(cols);
+    m_temp.resize(cols);
+    m_colNormsUpdated.resize(cols);
+    m_colNormsDirect.resize(cols);
+    m_isInitialized = false;
+    m_usePrescribedThreshold = false;
+  }
 
-private:
-    void init(Index rows, Index cols) {
-      Index diag = numext::mini(rows, cols);
-      m_hCoeffs.resize(diag);
-      m_colsPermutation.resize(cols);
-      m_colsTranspositions.resize(cols);
-      m_temp.resize(cols);
-      m_colNormsUpdated.resize(cols);
-      m_colNormsDirect.resize(cols);
-      m_isInitialized = false;
-      m_usePrescribedThreshold = false;
-    }
-
-  public:
-
-    /**
-    * \brief Default Constructor.
-    *
-    * The default constructor is useful in cases in which the user intends to
-    * perform decompositions via ColPivHouseholderQR::compute(const MatrixType&).
-    */
-    ColPivHouseholderQR()
+ public:
+  /**
+   * \brief Default Constructor.
+   *
+   * The default constructor is useful in cases in which the user intends to
+   * perform decompositions via ColPivHouseholderQR::compute(const MatrixType&).
+   */
+  ColPivHouseholderQR()
       : m_qr(),
         m_hCoeffs(),
         m_colsPermutation(),
@@ -106,347 +103,327 @@
         m_isInitialized(false),
         m_usePrescribedThreshold(false) {}
 
-    /** \brief Default Constructor with memory preallocation
-      *
-      * Like the default constructor but with preallocation of the internal data
-      * according to the specified problem \a size.
-      * \sa ColPivHouseholderQR()
-      */
-    ColPivHouseholderQR(Index rows, Index cols) : m_qr(rows, cols) { init(rows, cols); }
+  /** \brief Default Constructor with memory preallocation
+   *
+   * Like the default constructor but with preallocation of the internal data
+   * according to the specified problem \a size.
+   * \sa ColPivHouseholderQR()
+   */
+  ColPivHouseholderQR(Index rows, Index cols) : m_qr(rows, cols) { init(rows, cols); }
 
-    /** \brief Constructs a QR factorization from a given matrix
-      *
-      * This constructor computes the QR factorization of the matrix \a matrix by calling
-      * the method compute(). It is a short cut for:
-      *
-      * \code
-      * ColPivHouseholderQR<MatrixType> qr(matrix.rows(), matrix.cols());
-      * qr.compute(matrix);
-      * \endcode
-      *
-      * \sa compute()
-      */
-    template <typename InputType>
-    explicit ColPivHouseholderQR(const EigenBase<InputType>& matrix) : m_qr(matrix.rows(), matrix.cols()) {
-      init(matrix.rows(), matrix.cols());
-      compute(matrix.derived());
-    }
+  /** \brief Constructs a QR factorization from a given matrix
+   *
+   * This constructor computes the QR factorization of the matrix \a matrix by calling
+   * the method compute(). It is a short cut for:
+   *
+   * \code
+   * ColPivHouseholderQR<MatrixType> qr(matrix.rows(), matrix.cols());
+   * qr.compute(matrix);
+   * \endcode
+   *
+   * \sa compute()
+   */
+  template <typename InputType>
+  explicit ColPivHouseholderQR(const EigenBase<InputType>& matrix) : m_qr(matrix.rows(), matrix.cols()) {
+    init(matrix.rows(), matrix.cols());
+    compute(matrix.derived());
+  }
 
-    /** \brief Constructs a QR factorization from a given matrix
-      *
-      * This overloaded constructor is provided for \link InplaceDecomposition inplace decomposition \endlink when \c MatrixType is a Eigen::Ref.
-      *
-      * \sa ColPivHouseholderQR(const EigenBase&)
-      */
-    template <typename InputType>
-    explicit ColPivHouseholderQR(EigenBase<InputType>& matrix) : m_qr(matrix.derived()) {
-      init(matrix.rows(), matrix.cols());
-      computeInPlace();
-    }
+  /** \brief Constructs a QR factorization from a given matrix
+   *
+   * This overloaded constructor is provided for \link InplaceDecomposition inplace decomposition \endlink when \c
+   * MatrixType is a Eigen::Ref.
+   *
+   * \sa ColPivHouseholderQR(const EigenBase&)
+   */
+  template <typename InputType>
+  explicit ColPivHouseholderQR(EigenBase<InputType>& matrix) : m_qr(matrix.derived()) {
+    init(matrix.rows(), matrix.cols());
+    computeInPlace();
+  }
 
-    #ifdef EIGEN_PARSED_BY_DOXYGEN
-    /** This method finds a solution x to the equation Ax=b, where A is the matrix of which
-      * *this is the QR decomposition, if any exists.
-      *
-      * \param b the right-hand-side of the equation to solve.
-      *
-      * \returns a solution.
-      *
-      * \note_about_checking_solutions
-      *
-      * \note_about_arbitrary_choice_of_solution
-      *
-      * Example: \include ColPivHouseholderQR_solve.cpp
-      * Output: \verbinclude ColPivHouseholderQR_solve.out
-      */
-    template<typename Rhs>
-    inline const Solve<ColPivHouseholderQR, Rhs>
-    solve(const MatrixBase<Rhs>& b) const;
-    #endif
+#ifdef EIGEN_PARSED_BY_DOXYGEN
+  /** This method finds a solution x to the equation Ax=b, where A is the matrix of which
+   * *this is the QR decomposition, if any exists.
+   *
+   * \param b the right-hand-side of the equation to solve.
+   *
+   * \returns a solution.
+   *
+   * \note_about_checking_solutions
+   *
+   * \note_about_arbitrary_choice_of_solution
+   *
+   * Example: \include ColPivHouseholderQR_solve.cpp
+   * Output: \verbinclude ColPivHouseholderQR_solve.out
+   */
+  template <typename Rhs>
+  inline const Solve<ColPivHouseholderQR, Rhs> solve(const MatrixBase<Rhs>& b) const;
+#endif
 
-    HouseholderSequenceType householderQ() const;
-    HouseholderSequenceType matrixQ() const
-    {
-      return householderQ();
-    }
+  HouseholderSequenceType householderQ() const;
+  HouseholderSequenceType matrixQ() const { return householderQ(); }
 
-    /** \returns a reference to the matrix where the Householder QR decomposition is stored
-      */
-    const MatrixType& matrixQR() const
-    {
-      eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
-      return m_qr;
-    }
+  /** \returns a reference to the matrix where the Householder QR decomposition is stored
+   */
+  const MatrixType& matrixQR() const {
+    eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
+    return m_qr;
+  }
 
-    /** \returns a reference to the matrix where the result Householder QR is stored
-     * \warning The strict lower part of this matrix contains internal values.
-     * Only the upper triangular part should be referenced. To get it, use
-     * \code matrixR().template triangularView<Upper>() \endcode
-     * For rank-deficient matrices, use
-     * \code
-     * matrixR().topLeftCorner(rank(), rank()).template triangularView<Upper>()
-     * \endcode
-     */
-    const MatrixType& matrixR() const
-    {
-      eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
-      return m_qr;
-    }
+  /** \returns a reference to the matrix where the result Householder QR is stored
+   * \warning The strict lower part of this matrix contains internal values.
+   * Only the upper triangular part should be referenced. To get it, use
+   * \code matrixR().template triangularView<Upper>() \endcode
+   * For rank-deficient matrices, use
+   * \code
+   * matrixR().topLeftCorner(rank(), rank()).template triangularView<Upper>()
+   * \endcode
+   */
+  const MatrixType& matrixR() const {
+    eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
+    return m_qr;
+  }
 
-    template<typename InputType>
-    ColPivHouseholderQR& compute(const EigenBase<InputType>& matrix);
+  template <typename InputType>
+  ColPivHouseholderQR& compute(const EigenBase<InputType>& matrix);
 
-    /** \returns a const reference to the column permutation matrix */
-    const PermutationType& colsPermutation() const
-    {
-      eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
-      return m_colsPermutation;
-    }
+  /** \returns a const reference to the column permutation matrix */
+  const PermutationType& colsPermutation() const {
+    eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
+    return m_colsPermutation;
+  }
 
-    /** \returns the determinant of the matrix of which
-      * *this is the QR decomposition. It has only linear complexity
-      * (that is, O(n) where n is the dimension of the square matrix)
-      * as the QR decomposition has already been computed.
-      *
-      * \note This is only for square matrices.
-      *
-      * \warning a determinant can be very big or small, so for matrices
-      * of large enough dimension, there is a risk of overflow/underflow.
-      * One way to work around that is to use logAbsDeterminant() instead.
-      *
-      * \sa absDeterminant(), logAbsDeterminant(), MatrixBase::determinant()
-      */
-    typename MatrixType::Scalar determinant() const;
+  /** \returns the determinant of the matrix of which
+   * *this is the QR decomposition. It has only linear complexity
+   * (that is, O(n) where n is the dimension of the square matrix)
+   * as the QR decomposition has already been computed.
+   *
+   * \note This is only for square matrices.
+   *
+   * \warning a determinant can be very big or small, so for matrices
+   * of large enough dimension, there is a risk of overflow/underflow.
+   * One way to work around that is to use logAbsDeterminant() instead.
+   *
+   * \sa absDeterminant(), logAbsDeterminant(), MatrixBase::determinant()
+   */
+  typename MatrixType::Scalar determinant() const;
 
-    /** \returns the absolute value of the determinant of the matrix of which
-      * *this is the QR decomposition. It has only linear complexity
-      * (that is, O(n) where n is the dimension of the square matrix)
-      * as the QR decomposition has already been computed.
-      *
-      * \note This is only for square matrices.
-      *
-      * \warning a determinant can be very big or small, so for matrices
-      * of large enough dimension, there is a risk of overflow/underflow.
-      * One way to work around that is to use logAbsDeterminant() instead.
-      *
-      * \sa determinant(), logAbsDeterminant(), MatrixBase::determinant()
-      */
-    typename MatrixType::RealScalar absDeterminant() const;
+  /** \returns the absolute value of the determinant of the matrix of which
+   * *this is the QR decomposition. It has only linear complexity
+   * (that is, O(n) where n is the dimension of the square matrix)
+   * as the QR decomposition has already been computed.
+   *
+   * \note This is only for square matrices.
+   *
+   * \warning a determinant can be very big or small, so for matrices
+   * of large enough dimension, there is a risk of overflow/underflow.
+   * One way to work around that is to use logAbsDeterminant() instead.
+   *
+   * \sa determinant(), logAbsDeterminant(), MatrixBase::determinant()
+   */
+  typename MatrixType::RealScalar absDeterminant() const;
 
-    /** \returns the natural log of the absolute value of the determinant of the matrix of which
-      * *this is the QR decomposition. It has only linear complexity
-      * (that is, O(n) where n is the dimension of the square matrix)
-      * as the QR decomposition has already been computed.
-      *
-      * \note This is only for square matrices.
-      *
-      * \note This method is useful to work around the risk of overflow/underflow that's inherent
-      * to determinant computation.
-      *
-      * \sa determinant(), absDeterminant(), MatrixBase::determinant()
-      */
-    typename MatrixType::RealScalar logAbsDeterminant() const;
+  /** \returns the natural log of the absolute value of the determinant of the matrix of which
+   * *this is the QR decomposition. It has only linear complexity
+   * (that is, O(n) where n is the dimension of the square matrix)
+   * as the QR decomposition has already been computed.
+   *
+   * \note This is only for square matrices.
+   *
+   * \note This method is useful to work around the risk of overflow/underflow that's inherent
+   * to determinant computation.
+   *
+   * \sa determinant(), absDeterminant(), MatrixBase::determinant()
+   */
+  typename MatrixType::RealScalar logAbsDeterminant() const;
 
-    /** \returns the rank of the matrix of which *this is the QR decomposition.
-      *
-      * \note This method has to determine which pivots should be considered nonzero.
-      *       For that, it uses the threshold value that you can control by calling
-      *       setThreshold(const RealScalar&).
-      */
-    inline Index rank() const
-    {
-      using std::abs;
-      eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
-      RealScalar premultiplied_threshold = abs(m_maxpivot) * threshold();
-      Index result = 0;
-      for(Index i = 0; i < m_nonzero_pivots; ++i)
-        result += (abs(m_qr.coeff(i,i)) > premultiplied_threshold);
-      return result;
-    }
+  /** \returns the rank of the matrix of which *this is the QR decomposition.
+   *
+   * \note This method has to determine which pivots should be considered nonzero.
+   *       For that, it uses the threshold value that you can control by calling
+   *       setThreshold(const RealScalar&).
+   */
+  inline Index rank() const {
+    using std::abs;
+    eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
+    RealScalar premultiplied_threshold = abs(m_maxpivot) * threshold();
+    Index result = 0;
+    for (Index i = 0; i < m_nonzero_pivots; ++i) result += (abs(m_qr.coeff(i, i)) > premultiplied_threshold);
+    return result;
+  }
 
-    /** \returns the dimension of the kernel of the matrix of which *this is the QR decomposition.
-      *
-      * \note This method has to determine which pivots should be considered nonzero.
-      *       For that, it uses the threshold value that you can control by calling
-      *       setThreshold(const RealScalar&).
-      */
-    inline Index dimensionOfKernel() const
-    {
-      eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
-      return cols() - rank();
-    }
+  /** \returns the dimension of the kernel of the matrix of which *this is the QR decomposition.
+   *
+   * \note This method has to determine which pivots should be considered nonzero.
+   *       For that, it uses the threshold value that you can control by calling
+   *       setThreshold(const RealScalar&).
+   */
+  inline Index dimensionOfKernel() const {
+    eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
+    return cols() - rank();
+  }
 
-    /** \returns true if the matrix of which *this is the QR decomposition represents an injective
-      *          linear map, i.e. has trivial kernel; false otherwise.
-      *
-      * \note This method has to determine which pivots should be considered nonzero.
-      *       For that, it uses the threshold value that you can control by calling
-      *       setThreshold(const RealScalar&).
-      */
-    inline bool isInjective() const
-    {
-      eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
-      return rank() == cols();
-    }
+  /** \returns true if the matrix of which *this is the QR decomposition represents an injective
+   *          linear map, i.e. has trivial kernel; false otherwise.
+   *
+   * \note This method has to determine which pivots should be considered nonzero.
+   *       For that, it uses the threshold value that you can control by calling
+   *       setThreshold(const RealScalar&).
+   */
+  inline bool isInjective() const {
+    eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
+    return rank() == cols();
+  }
 
-    /** \returns true if the matrix of which *this is the QR decomposition represents a surjective
-      *          linear map; false otherwise.
-      *
-      * \note This method has to determine which pivots should be considered nonzero.
-      *       For that, it uses the threshold value that you can control by calling
-      *       setThreshold(const RealScalar&).
-      */
-    inline bool isSurjective() const
-    {
-      eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
-      return rank() == rows();
-    }
+  /** \returns true if the matrix of which *this is the QR decomposition represents a surjective
+   *          linear map; false otherwise.
+   *
+   * \note This method has to determine which pivots should be considered nonzero.
+   *       For that, it uses the threshold value that you can control by calling
+   *       setThreshold(const RealScalar&).
+   */
+  inline bool isSurjective() const {
+    eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
+    return rank() == rows();
+  }
 
-    /** \returns true if the matrix of which *this is the QR decomposition is invertible.
-      *
-      * \note This method has to determine which pivots should be considered nonzero.
-      *       For that, it uses the threshold value that you can control by calling
-      *       setThreshold(const RealScalar&).
-      */
-    inline bool isInvertible() const
-    {
-      eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
-      return isInjective() && isSurjective();
-    }
+  /** \returns true if the matrix of which *this is the QR decomposition is invertible.
+   *
+   * \note This method has to determine which pivots should be considered nonzero.
+   *       For that, it uses the threshold value that you can control by calling
+   *       setThreshold(const RealScalar&).
+   */
+  inline bool isInvertible() const {
+    eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
+    return isInjective() && isSurjective();
+  }
 
-    /** \returns the inverse of the matrix of which *this is the QR decomposition.
-      *
-      * \note If this matrix is not invertible, the returned matrix has undefined coefficients.
-      *       Use isInvertible() to first determine whether this matrix is invertible.
-      */
-    inline const Inverse<ColPivHouseholderQR> inverse() const
-    {
-      eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
-      return Inverse<ColPivHouseholderQR>(*this);
-    }
+  /** \returns the inverse of the matrix of which *this is the QR decomposition.
+   *
+   * \note If this matrix is not invertible, the returned matrix has undefined coefficients.
+   *       Use isInvertible() to first determine whether this matrix is invertible.
+   */
+  inline const Inverse<ColPivHouseholderQR> inverse() const {
+    eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
+    return Inverse<ColPivHouseholderQR>(*this);
+  }
 
-    inline Index rows() const { return m_qr.rows(); }
-    inline Index cols() const { return m_qr.cols(); }
+  inline Index rows() const { return m_qr.rows(); }
+  inline Index cols() const { return m_qr.cols(); }
 
-    /** \returns a const reference to the vector of Householder coefficients used to represent the factor \c Q.
-      *
-      * For advanced uses only.
-      */
-    const HCoeffsType& hCoeffs() const { return m_hCoeffs; }
+  /** \returns a const reference to the vector of Householder coefficients used to represent the factor \c Q.
+   *
+   * For advanced uses only.
+   */
+  const HCoeffsType& hCoeffs() const { return m_hCoeffs; }
 
-    /** Allows to prescribe a threshold to be used by certain methods, such as rank(),
-      * who need to determine when pivots are to be considered nonzero. This is not used for the
-      * QR decomposition itself.
-      *
-      * When it needs to get the threshold value, Eigen calls threshold(). By default, this
-      * uses a formula to automatically determine a reasonable threshold.
-      * Once you have called the present method setThreshold(const RealScalar&),
-      * your value is used instead.
-      *
-      * \param threshold The new value to use as the threshold.
-      *
-      * A pivot will be considered nonzero if its absolute value is strictly greater than
-      *  \f$ \vert pivot \vert \leqslant threshold \times \vert maxpivot \vert \f$
-      * where maxpivot is the biggest pivot.
-      *
-      * If you want to come back to the default behavior, call setThreshold(Default_t)
-      */
-    ColPivHouseholderQR& setThreshold(const RealScalar& threshold)
-    {
-      m_usePrescribedThreshold = true;
-      m_prescribedThreshold = threshold;
-      return *this;
-    }
+  /** Allows to prescribe a threshold to be used by certain methods, such as rank(),
+   * who need to determine when pivots are to be considered nonzero. This is not used for the
+   * QR decomposition itself.
+   *
+   * When it needs to get the threshold value, Eigen calls threshold(). By default, this
+   * uses a formula to automatically determine a reasonable threshold.
+   * Once you have called the present method setThreshold(const RealScalar&),
+   * your value is used instead.
+   *
+   * \param threshold The new value to use as the threshold.
+   *
+   * A pivot will be considered nonzero if its absolute value is strictly greater than
+   *  \f$ \vert pivot \vert \leqslant threshold \times \vert maxpivot \vert \f$
+   * where maxpivot is the biggest pivot.
+   *
+   * If you want to come back to the default behavior, call setThreshold(Default_t)
+   */
+  ColPivHouseholderQR& setThreshold(const RealScalar& threshold) {
+    m_usePrescribedThreshold = true;
+    m_prescribedThreshold = threshold;
+    return *this;
+  }
 
-    /** Allows to come back to the default behavior, letting Eigen use its default formula for
-      * determining the threshold.
-      *
-      * You should pass the special object Eigen::Default as parameter here.
-      * \code qr.setThreshold(Eigen::Default); \endcode
-      *
-      * See the documentation of setThreshold(const RealScalar&).
-      */
-    ColPivHouseholderQR& setThreshold(Default_t)
-    {
-      m_usePrescribedThreshold = false;
-      return *this;
-    }
+  /** Allows to come back to the default behavior, letting Eigen use its default formula for
+   * determining the threshold.
+   *
+   * You should pass the special object Eigen::Default as parameter here.
+   * \code qr.setThreshold(Eigen::Default); \endcode
+   *
+   * See the documentation of setThreshold(const RealScalar&).
+   */
+  ColPivHouseholderQR& setThreshold(Default_t) {
+    m_usePrescribedThreshold = false;
+    return *this;
+  }
 
-    /** Returns the threshold that will be used by certain methods such as rank().
-      *
-      * See the documentation of setThreshold(const RealScalar&).
-      */
-    RealScalar threshold() const
-    {
-      eigen_assert(m_isInitialized || m_usePrescribedThreshold);
-      return m_usePrescribedThreshold ? m_prescribedThreshold
-      // this formula comes from experimenting (see "LU precision tuning" thread on the list)
-      // and turns out to be identical to Higham's formula used already in LDLt.
-                                      : NumTraits<Scalar>::epsilon() * RealScalar(m_qr.diagonalSize());
-    }
+  /** Returns the threshold that will be used by certain methods such as rank().
+   *
+   * See the documentation of setThreshold(const RealScalar&).
+   */
+  RealScalar threshold() const {
+    eigen_assert(m_isInitialized || m_usePrescribedThreshold);
+    return m_usePrescribedThreshold ? m_prescribedThreshold
+                                    // this formula comes from experimenting (see "LU precision tuning" thread on the
+                                    // list) and turns out to be identical to Higham's formula used already in LDLt.
+                                    : NumTraits<Scalar>::epsilon() * RealScalar(m_qr.diagonalSize());
+  }
 
-    /** \returns the number of nonzero pivots in the QR decomposition.
-      * Here nonzero is meant in the exact sense, not in a fuzzy sense.
-      * So that notion isn't really intrinsically interesting, but it is
-      * still useful when implementing algorithms.
-      *
-      * \sa rank()
-      */
-    inline Index nonzeroPivots() const
-    {
-      eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
-      return m_nonzero_pivots;
-    }
+  /** \returns the number of nonzero pivots in the QR decomposition.
+   * Here nonzero is meant in the exact sense, not in a fuzzy sense.
+   * So that notion isn't really intrinsically interesting, but it is
+   * still useful when implementing algorithms.
+   *
+   * \sa rank()
+   */
+  inline Index nonzeroPivots() const {
+    eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
+    return m_nonzero_pivots;
+  }
 
-    /** \returns the absolute value of the biggest pivot, i.e. the biggest
-      *          diagonal coefficient of R.
-      */
-    RealScalar maxPivot() const { return m_maxpivot; }
+  /** \returns the absolute value of the biggest pivot, i.e. the biggest
+   *          diagonal coefficient of R.
+   */
+  RealScalar maxPivot() const { return m_maxpivot; }
 
-    /** \brief Reports whether the QR factorization was successful.
-      *
-      * \note This function always returns \c Success. It is provided for compatibility
-      * with other factorization routines.
-      * \returns \c Success
-      */
-    ComputationInfo info() const
-    {
-      eigen_assert(m_isInitialized && "Decomposition is not initialized.");
-      return Success;
-    }
+  /** \brief Reports whether the QR factorization was successful.
+   *
+   * \note This function always returns \c Success. It is provided for compatibility
+   * with other factorization routines.
+   * \returns \c Success
+   */
+  ComputationInfo info() const {
+    eigen_assert(m_isInitialized && "Decomposition is not initialized.");
+    return Success;
+  }
 
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    template<typename RhsType, typename DstType>
-    void _solve_impl(const RhsType &rhs, DstType &dst) const;
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  template <typename RhsType, typename DstType>
+  void _solve_impl(const RhsType& rhs, DstType& dst) const;
 
-    template<bool Conjugate, typename RhsType, typename DstType>
-    void _solve_impl_transposed(const RhsType &rhs, DstType &dst) const;
-    #endif
+  template <bool Conjugate, typename RhsType, typename DstType>
+  void _solve_impl_transposed(const RhsType& rhs, DstType& dst) const;
+#endif
 
-  protected:
+ protected:
+  friend class CompleteOrthogonalDecomposition<MatrixType, PermutationIndex>;
 
-    friend class CompleteOrthogonalDecomposition<MatrixType, PermutationIndex>;
+  EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
 
-    EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
+  void computeInPlace();
 
-    void computeInPlace();
-
-    MatrixType m_qr;
-    HCoeffsType m_hCoeffs;
-    PermutationType m_colsPermutation;
-    IntRowVectorType m_colsTranspositions;
-    RowVectorType m_temp;
-    RealRowVectorType m_colNormsUpdated;
-    RealRowVectorType m_colNormsDirect;
-    bool m_isInitialized, m_usePrescribedThreshold;
-    RealScalar m_prescribedThreshold, m_maxpivot;
-    Index m_nonzero_pivots;
-    Index m_det_p;
+  MatrixType m_qr;
+  HCoeffsType m_hCoeffs;
+  PermutationType m_colsPermutation;
+  IntRowVectorType m_colsTranspositions;
+  RowVectorType m_temp;
+  RealRowVectorType m_colNormsUpdated;
+  RealRowVectorType m_colNormsDirect;
+  bool m_isInitialized, m_usePrescribedThreshold;
+  RealScalar m_prescribedThreshold, m_maxpivot;
+  Index m_nonzero_pivots;
+  Index m_det_p;
 };
 
-template<typename MatrixType, typename PermutationIndex>
-typename MatrixType::Scalar ColPivHouseholderQR<MatrixType, PermutationIndex>::determinant() const
-{
+template <typename MatrixType, typename PermutationIndex>
+typename MatrixType::Scalar ColPivHouseholderQR<MatrixType, PermutationIndex>::determinant() const {
   eigen_assert(m_isInitialized && "HouseholderQR is not initialized.");
   eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
   Scalar detQ;
@@ -454,43 +431,39 @@
   return m_qr.diagonal().prod() * detQ * Scalar(m_det_p);
 }
 
-template<typename MatrixType, typename PermutationIndex>
-typename MatrixType::RealScalar ColPivHouseholderQR<MatrixType, PermutationIndex>::absDeterminant() const
-{
+template <typename MatrixType, typename PermutationIndex>
+typename MatrixType::RealScalar ColPivHouseholderQR<MatrixType, PermutationIndex>::absDeterminant() const {
   using std::abs;
   eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
   eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
   return abs(m_qr.diagonal().prod());
 }
 
-template<typename MatrixType, typename PermutationIndex>
-typename MatrixType::RealScalar ColPivHouseholderQR<MatrixType, PermutationIndex>::logAbsDeterminant() const
-{
+template <typename MatrixType, typename PermutationIndex>
+typename MatrixType::RealScalar ColPivHouseholderQR<MatrixType, PermutationIndex>::logAbsDeterminant() const {
   eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
   eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
   return m_qr.diagonal().cwiseAbs().array().log().sum();
 }
 
 /** Performs the QR factorization of the given matrix \a matrix. The result of
-  * the factorization is stored into \c *this, and a reference to \c *this
-  * is returned.
-  *
-  * \sa class ColPivHouseholderQR, ColPivHouseholderQR(const MatrixType&)
-  */
-template<typename MatrixType, typename PermutationIndex>
-template<typename InputType>
-ColPivHouseholderQR<MatrixType, PermutationIndex>& ColPivHouseholderQR<MatrixType, PermutationIndex>::compute(const EigenBase<InputType>& matrix)
-{
+ * the factorization is stored into \c *this, and a reference to \c *this
+ * is returned.
+ *
+ * \sa class ColPivHouseholderQR, ColPivHouseholderQR(const MatrixType&)
+ */
+template <typename MatrixType, typename PermutationIndex>
+template <typename InputType>
+ColPivHouseholderQR<MatrixType, PermutationIndex>& ColPivHouseholderQR<MatrixType, PermutationIndex>::compute(
+    const EigenBase<InputType>& matrix) {
   m_qr = matrix.derived();
   computeInPlace();
   return *this;
 }
 
-template<typename MatrixType, typename PermutationIndex>
-void ColPivHouseholderQR<MatrixType, PermutationIndex>::computeInPlace()
-{
-
-  eigen_assert(m_qr.cols()<=NumTraits<PermutationIndex>::highest());
+template <typename MatrixType, typename PermutationIndex>
+void ColPivHouseholderQR<MatrixType, PermutationIndex>::computeInPlace() {
+  eigen_assert(m_qr.cols() <= NumTraits<PermutationIndex>::highest());
 
   using std::abs;
 
@@ -514,27 +487,26 @@
     m_colNormsUpdated.coeffRef(k) = m_colNormsDirect.coeffRef(k);
   }
 
-  RealScalar threshold_helper =  numext::abs2<RealScalar>(m_colNormsUpdated.maxCoeff() * NumTraits<RealScalar>::epsilon()) / RealScalar(rows);
+  RealScalar threshold_helper =
+      numext::abs2<RealScalar>(m_colNormsUpdated.maxCoeff() * NumTraits<RealScalar>::epsilon()) / RealScalar(rows);
   RealScalar norm_downdate_threshold = numext::sqrt(NumTraits<RealScalar>::epsilon());
 
-  m_nonzero_pivots = size; // the generic case is that in which all pivots are nonzero (invertible case)
+  m_nonzero_pivots = size;  // the generic case is that in which all pivots are nonzero (invertible case)
   m_maxpivot = RealScalar(0);
 
-  for(Index k = 0; k < size; ++k)
-  {
+  for (Index k = 0; k < size; ++k) {
     // first, we look up in our table m_colNormsUpdated which column has the biggest norm
     Index biggest_col_index;
-    RealScalar biggest_col_sq_norm = numext::abs2(m_colNormsUpdated.tail(cols-k).maxCoeff(&biggest_col_index));
+    RealScalar biggest_col_sq_norm = numext::abs2(m_colNormsUpdated.tail(cols - k).maxCoeff(&biggest_col_index));
     biggest_col_index += k;
 
     // Track the number of meaningful pivots but do not stop the decomposition to make
     // sure that the initial matrix is properly reproduced. See bug 941.
-    if(m_nonzero_pivots==size && biggest_col_sq_norm < threshold_helper * RealScalar(rows-k))
-      m_nonzero_pivots = k;
+    if (m_nonzero_pivots == size && biggest_col_sq_norm < threshold_helper * RealScalar(rows - k)) m_nonzero_pivots = k;
 
     // apply the transposition to the columns
     m_colsTranspositions.coeffRef(k) = static_cast<PermutationIndex>(biggest_col_index);
-    if(k != biggest_col_index) {
+    if (k != biggest_col_index) {
       m_qr.col(k).swap(m_qr.col(biggest_col_index));
       std::swap(m_colNormsUpdated.coeffRef(k), m_colNormsUpdated.coeffRef(biggest_col_index));
       std::swap(m_colNormsDirect.coeffRef(k), m_colNormsDirect.coeffRef(biggest_col_index));
@@ -543,17 +515,17 @@
 
     // generate the householder vector, store it below the diagonal
     RealScalar beta;
-    m_qr.col(k).tail(rows-k).makeHouseholderInPlace(m_hCoeffs.coeffRef(k), beta);
+    m_qr.col(k).tail(rows - k).makeHouseholderInPlace(m_hCoeffs.coeffRef(k), beta);
 
     // apply the householder transformation to the diagonal coefficient
-    m_qr.coeffRef(k,k) = beta;
+    m_qr.coeffRef(k, k) = beta;
 
     // remember the maximum absolute value of diagonal coefficients
-    if(abs(beta) > m_maxpivot) m_maxpivot = abs(beta);
+    if (abs(beta) > m_maxpivot) m_maxpivot = abs(beta);
 
     // apply the householder transformation
-    m_qr.bottomRightCorner(rows-k, cols-k-1)
-        .applyHouseholderOnTheLeft(m_qr.col(k).tail(rows-k-1), m_hCoeffs.coeffRef(k), &m_temp.coeffRef(k+1));
+    m_qr.bottomRightCorner(rows - k, cols - k - 1)
+        .applyHouseholderOnTheLeft(m_qr.col(k).tail(rows - k - 1), m_hCoeffs.coeffRef(k), &m_temp.coeffRef(k + 1));
 
     // update our table of norms of the columns
     for (Index j = k + 1; j < cols; ++j) {
@@ -564,9 +536,9 @@
       if (!numext::is_exactly_zero(m_colNormsUpdated.coeffRef(j))) {
         RealScalar temp = abs(m_qr.coeffRef(k, j)) / m_colNormsUpdated.coeffRef(j);
         temp = (RealScalar(1) + temp) * (RealScalar(1) - temp);
-        temp = temp <  RealScalar(0) ? RealScalar(0) : temp;
-        RealScalar temp2 = temp * numext::abs2<RealScalar>(m_colNormsUpdated.coeffRef(j) /
-                                                           m_colNormsDirect.coeffRef(j));
+        temp = temp < RealScalar(0) ? RealScalar(0) : temp;
+        RealScalar temp2 =
+            temp * numext::abs2<RealScalar>(m_colNormsUpdated.coeffRef(j) / m_colNormsDirect.coeffRef(j));
         if (temp2 <= norm_downdate_threshold) {
           // The updated norm has become too inaccurate so re-compute the column
           // norm directly.
@@ -580,102 +552,100 @@
   }
 
   m_colsPermutation.setIdentity(cols);
-  for(Index k = 0; k < size/*m_nonzero_pivots*/; ++k)
+  for (Index k = 0; k < size /*m_nonzero_pivots*/; ++k)
     m_colsPermutation.applyTranspositionOnTheRight(k, static_cast<Index>(m_colsTranspositions.coeff(k)));
 
-  m_det_p = (number_of_transpositions%2) ? -1 : 1;
+  m_det_p = (number_of_transpositions % 2) ? -1 : 1;
   m_isInitialized = true;
 }
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-template<typename MatrixType_, typename PermutationIndex_>
-template<typename RhsType, typename DstType>
-void ColPivHouseholderQR<MatrixType_, PermutationIndex_>::_solve_impl(const RhsType &rhs, DstType &dst) const
-{
+template <typename MatrixType_, typename PermutationIndex_>
+template <typename RhsType, typename DstType>
+void ColPivHouseholderQR<MatrixType_, PermutationIndex_>::_solve_impl(const RhsType& rhs, DstType& dst) const {
   const Index nonzero_pivots = nonzeroPivots();
 
-  if(nonzero_pivots == 0)
-  {
+  if (nonzero_pivots == 0) {
     dst.setZero();
     return;
   }
 
   typename RhsType::PlainObject c(rhs);
 
-  c.applyOnTheLeft(householderQ().setLength(nonzero_pivots).adjoint() );
+  c.applyOnTheLeft(householderQ().setLength(nonzero_pivots).adjoint());
 
   m_qr.topLeftCorner(nonzero_pivots, nonzero_pivots)
       .template triangularView<Upper>()
       .solveInPlace(c.topRows(nonzero_pivots));
 
-  for(Index i = 0; i < nonzero_pivots; ++i) dst.row(m_colsPermutation.indices().coeff(i)) = c.row(i);
-  for(Index i = nonzero_pivots; i < cols(); ++i) dst.row(m_colsPermutation.indices().coeff(i)).setZero();
+  for (Index i = 0; i < nonzero_pivots; ++i) dst.row(m_colsPermutation.indices().coeff(i)) = c.row(i);
+  for (Index i = nonzero_pivots; i < cols(); ++i) dst.row(m_colsPermutation.indices().coeff(i)).setZero();
 }
 
-template<typename MatrixType_, typename PermutationIndex_>
-template<bool Conjugate, typename RhsType, typename DstType>
-void ColPivHouseholderQR<MatrixType_, PermutationIndex_>::_solve_impl_transposed(const RhsType &rhs, DstType &dst) const
-{
+template <typename MatrixType_, typename PermutationIndex_>
+template <bool Conjugate, typename RhsType, typename DstType>
+void ColPivHouseholderQR<MatrixType_, PermutationIndex_>::_solve_impl_transposed(const RhsType& rhs,
+                                                                                 DstType& dst) const {
   const Index nonzero_pivots = nonzeroPivots();
 
-  if(nonzero_pivots == 0)
-  {
+  if (nonzero_pivots == 0) {
     dst.setZero();
     return;
   }
 
-  typename RhsType::PlainObject c(m_colsPermutation.transpose()*rhs);
+  typename RhsType::PlainObject c(m_colsPermutation.transpose() * rhs);
 
   m_qr.topLeftCorner(nonzero_pivots, nonzero_pivots)
-        .template triangularView<Upper>()
-        .transpose().template conjugateIf<Conjugate>()
-        .solveInPlace(c.topRows(nonzero_pivots));
+      .template triangularView<Upper>()
+      .transpose()
+      .template conjugateIf<Conjugate>()
+      .solveInPlace(c.topRows(nonzero_pivots));
 
   dst.topRows(nonzero_pivots) = c.topRows(nonzero_pivots);
-  dst.bottomRows(rows()-nonzero_pivots).setZero();
+  dst.bottomRows(rows() - nonzero_pivots).setZero();
 
-  dst.applyOnTheLeft(householderQ().setLength(nonzero_pivots).template conjugateIf<!Conjugate>() );
+  dst.applyOnTheLeft(householderQ().setLength(nonzero_pivots).template conjugateIf<!Conjugate>());
 }
 #endif
 
 namespace internal {
 
-template<typename DstXprType, typename MatrixType, typename PermutationIndex>
-struct Assignment<DstXprType, Inverse<ColPivHouseholderQR<MatrixType, PermutationIndex> >, internal::assign_op<typename DstXprType::Scalar,typename ColPivHouseholderQR<MatrixType, PermutationIndex>::Scalar>, Dense2Dense>
-{
+template <typename DstXprType, typename MatrixType, typename PermutationIndex>
+struct Assignment<DstXprType, Inverse<ColPivHouseholderQR<MatrixType, PermutationIndex>>,
+                  internal::assign_op<typename DstXprType::Scalar,
+                                      typename ColPivHouseholderQR<MatrixType, PermutationIndex>::Scalar>,
+                  Dense2Dense> {
   typedef ColPivHouseholderQR<MatrixType, PermutationIndex> QrType;
   typedef Inverse<QrType> SrcXprType;
-  static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar,typename QrType::Scalar> &)
-  {
+  static void run(DstXprType& dst, const SrcXprType& src,
+                  const internal::assign_op<typename DstXprType::Scalar, typename QrType::Scalar>&) {
     dst = src.nestedExpression().solve(MatrixType::Identity(src.rows(), src.cols()));
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \returns the matrix Q as a sequence of householder transformations.
-  * You can extract the meaningful part only by using:
-  * \code qr.householderQ().setLength(qr.nonzeroPivots()) \endcode*/
-template<typename MatrixType, typename PermutationIndex>
-typename ColPivHouseholderQR<MatrixType, PermutationIndex>::HouseholderSequenceType ColPivHouseholderQR<MatrixType, PermutationIndex>
-  ::householderQ() const
-{
+ * You can extract the meaningful part only by using:
+ * \code qr.householderQ().setLength(qr.nonzeroPivots()) \endcode*/
+template <typename MatrixType, typename PermutationIndex>
+typename ColPivHouseholderQR<MatrixType, PermutationIndex>::HouseholderSequenceType
+ColPivHouseholderQR<MatrixType, PermutationIndex>::householderQ() const {
   eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
   return HouseholderSequenceType(m_qr, m_hCoeffs.conjugate());
 }
 
 /** \return the column-pivoting Householder QR decomposition of \c *this.
-  *
-  * \sa class ColPivHouseholderQR
-  */
-template<typename Derived>
-template<typename PermutationIndexType>
+ *
+ * \sa class ColPivHouseholderQR
+ */
+template <typename Derived>
+template <typename PermutationIndexType>
 const ColPivHouseholderQR<typename MatrixBase<Derived>::PlainObject, PermutationIndexType>
-MatrixBase<Derived>::colPivHouseholderQr() const
-{
+MatrixBase<Derived>::colPivHouseholderQr() const {
   return ColPivHouseholderQR<PlainObject, PermutationIndexType>(eval());
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_COLPIVOTINGHOUSEHOLDERQR_H
+#endif  // EIGEN_COLPIVOTINGHOUSEHOLDERQR_H
diff --git a/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h b/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h
index 8745ae4..37ac55f 100644
--- a/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h
+++ b/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h
@@ -41,108 +41,119 @@
 
 #if defined(EIGEN_USE_LAPACKE)
 
-    template<typename Scalar>
-    inline lapack_int call_geqp3(int matrix_layout, lapack_int m, lapack_int n, Scalar* a, lapack_int lda, lapack_int* jpvt, Scalar* tau);
-    template<>
-    inline lapack_int call_geqp3(int matrix_layout, lapack_int m, lapack_int n, float* a, lapack_int lda, lapack_int* jpvt, float* tau)
-    { return LAPACKE_sgeqp3(matrix_layout, m, n, a, lda, jpvt, tau); }
-    template<>
-    inline lapack_int call_geqp3(int matrix_layout, lapack_int m, lapack_int n, double* a, lapack_int lda, lapack_int* jpvt, double* tau)
-    { return LAPACKE_dgeqp3(matrix_layout, m, n, a, lda, jpvt, tau); }
-    template<>
-    inline lapack_int call_geqp3(int matrix_layout, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda, lapack_int* jpvt, lapack_complex_float* tau)
-    { return LAPACKE_cgeqp3(matrix_layout, m, n, a, lda, jpvt, tau); }
-    template<>
-    inline lapack_int call_geqp3(int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda, lapack_int* jpvt, lapack_complex_double* tau)
-    { return LAPACKE_zgeqp3(matrix_layout, m, n, a, lda, jpvt, tau); }
+template <typename Scalar>
+inline lapack_int call_geqp3(int matrix_layout, lapack_int m, lapack_int n, Scalar* a, lapack_int lda, lapack_int* jpvt,
+                             Scalar* tau);
+template <>
+inline lapack_int call_geqp3(int matrix_layout, lapack_int m, lapack_int n, float* a, lapack_int lda, lapack_int* jpvt,
+                             float* tau) {
+  return LAPACKE_sgeqp3(matrix_layout, m, n, a, lda, jpvt, tau);
+}
+template <>
+inline lapack_int call_geqp3(int matrix_layout, lapack_int m, lapack_int n, double* a, lapack_int lda, lapack_int* jpvt,
+                             double* tau) {
+  return LAPACKE_dgeqp3(matrix_layout, m, n, a, lda, jpvt, tau);
+}
+template <>
+inline lapack_int call_geqp3(int matrix_layout, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                             lapack_int* jpvt, lapack_complex_float* tau) {
+  return LAPACKE_cgeqp3(matrix_layout, m, n, a, lda, jpvt, tau);
+}
+template <>
+inline lapack_int call_geqp3(int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                             lapack_int* jpvt, lapack_complex_double* tau) {
+  return LAPACKE_zgeqp3(matrix_layout, m, n, a, lda, jpvt, tau);
+}
 
-    template <typename MatrixType>
-    struct ColPivHouseholderQR_LAPACKE_impl {
-      typedef typename MatrixType::Scalar Scalar;
-      typedef typename MatrixType::RealScalar RealScalar;
-      typedef typename internal::lapacke_helpers::translate_type_imp<Scalar>::type LapackeType;
-      static constexpr int LapackeStorage = MatrixType::IsRowMajor ? (LAPACK_ROW_MAJOR) : (LAPACK_COL_MAJOR);
+template <typename MatrixType>
+struct ColPivHouseholderQR_LAPACKE_impl {
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::RealScalar RealScalar;
+  typedef typename internal::lapacke_helpers::translate_type_imp<Scalar>::type LapackeType;
+  static constexpr int LapackeStorage = MatrixType::IsRowMajor ? (LAPACK_ROW_MAJOR) : (LAPACK_COL_MAJOR);
 
-      typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
-      typedef PermutationMatrix<Dynamic, Dynamic, lapack_int> PermutationType;
+  typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
+  typedef PermutationMatrix<Dynamic, Dynamic, lapack_int> PermutationType;
 
-      static void run(MatrixType& qr, HCoeffsType& hCoeffs, PermutationType& colsPermutation, Index& nonzero_pivots,
-                      RealScalar& maxpivot, bool usePrescribedThreshold, RealScalar prescribedThreshold, Index& det_p,
-                      bool& isInitialized) {
+  static void run(MatrixType& qr, HCoeffsType& hCoeffs, PermutationType& colsPermutation, Index& nonzero_pivots,
+                  RealScalar& maxpivot, bool usePrescribedThreshold, RealScalar prescribedThreshold, Index& det_p,
+                  bool& isInitialized) {
+    isInitialized = false;
+    hCoeffs.resize(qr.diagonalSize());
+    nonzero_pivots = 0;
+    maxpivot = RealScalar(0);
+    colsPermutation.resize(qr.cols());
+    colsPermutation.indices().setZero();
 
-        isInitialized = false;
-        hCoeffs.resize(qr.diagonalSize());
-        nonzero_pivots = 0;
-        maxpivot = RealScalar(0);
-        colsPermutation.resize(qr.cols());
-        colsPermutation.indices().setZero();
+    lapack_int rows = internal::lapacke_helpers::to_lapack(qr.rows());
+    lapack_int cols = internal::lapacke_helpers::to_lapack(qr.cols());
+    LapackeType* qr_data = (LapackeType*)(qr.data());
+    lapack_int lda = internal::lapacke_helpers::to_lapack(qr.outerStride());
+    lapack_int* perm_data = colsPermutation.indices().data();
+    LapackeType* hCoeffs_data = (LapackeType*)(hCoeffs.data());
 
-        lapack_int rows = internal::lapacke_helpers::to_lapack(qr.rows());
-        lapack_int cols = internal::lapacke_helpers::to_lapack(qr.cols());
-        LapackeType* qr_data = (LapackeType*)(qr.data());
-        lapack_int lda = internal::lapacke_helpers::to_lapack(qr.outerStride());
-        lapack_int* perm_data = colsPermutation.indices().data();
-        LapackeType* hCoeffs_data = (LapackeType*)(hCoeffs.data());
+    lapack_int info = call_geqp3(LapackeStorage, rows, cols, qr_data, lda, perm_data, hCoeffs_data);
+    if (info != 0) return;
 
-        lapack_int info = call_geqp3(LapackeStorage, rows, cols, qr_data, lda, perm_data, hCoeffs_data);
-        if (info != 0) return;
+    maxpivot = qr.diagonal().cwiseAbs().maxCoeff();
+    hCoeffs.adjointInPlace();
+    RealScalar defaultThreshold = NumTraits<RealScalar>::epsilon() * RealScalar(qr.diagonalSize());
+    RealScalar threshold = usePrescribedThreshold ? prescribedThreshold : defaultThreshold;
+    RealScalar premultiplied_threshold = maxpivot * threshold;
+    nonzero_pivots = (qr.diagonal().cwiseAbs().array() > premultiplied_threshold).count();
+    colsPermutation.indices().array() -= 1;
+    det_p = colsPermutation.determinant();
+    isInitialized = true;
+  };
 
-        maxpivot = qr.diagonal().cwiseAbs().maxCoeff();
-        hCoeffs.adjointInPlace();
-        RealScalar defaultThreshold = NumTraits<RealScalar>::epsilon() * RealScalar(qr.diagonalSize());
-        RealScalar threshold = usePrescribedThreshold ? prescribedThreshold : defaultThreshold;
-        RealScalar premultiplied_threshold = maxpivot * threshold;
-        nonzero_pivots = (qr.diagonal().cwiseAbs().array() > premultiplied_threshold).count();
-        colsPermutation.indices().array() -= 1;
-        det_p = colsPermutation.determinant();
-        isInitialized = true;
-      };
+  static void init(Index rows, Index cols, HCoeffsType& hCoeffs, PermutationType& colsPermutation,
+                   bool& usePrescribedThreshold, bool& isInitialized) {
+    Index diag = numext::mini(rows, cols);
+    hCoeffs.resize(diag);
+    colsPermutation.resize(cols);
+    usePrescribedThreshold = false;
+    isInitialized = false;
+  }
+};
 
-      static void init(Index rows, Index cols, HCoeffsType& hCoeffs, PermutationType& colsPermutation,
-                              bool& usePrescribedThreshold, bool& isInitialized) {
+#define COLPIVQR_LAPACKE_COMPUTEINPLACE(EIGTYPE)                                                                   \
+  template <>                                                                                                      \
+  inline void ColPivHouseholderQR<EIGTYPE, lapack_int>::computeInPlace() {                                         \
+    ColPivHouseholderQR_LAPACKE_impl<MatrixType>::run(m_qr, m_hCoeffs, m_colsPermutation, m_nonzero_pivots,        \
+                                                      m_maxpivot, m_usePrescribedThreshold, m_prescribedThreshold, \
+                                                      m_det_p, m_isInitialized);                                   \
+  }
 
-        Index diag = numext::mini(rows, cols);
-        hCoeffs.resize(diag);
-        colsPermutation.resize(cols);
-        usePrescribedThreshold = false;
-        isInitialized = false;
-      }
-    };
+#define COLPIVQR_LAPACKE_INIT(EIGTYPE)                                                                            \
+  template <>                                                                                                     \
+  inline void ColPivHouseholderQR<EIGTYPE, lapack_int>::init(Index rows, Index cols) {                            \
+    ColPivHouseholderQR_LAPACKE_impl<MatrixType>::init(rows, cols, m_hCoeffs, m_colsPermutation, m_isInitialized, \
+                                                       m_usePrescribedThreshold);                                 \
+  }
 
-    #define COLPIVQR_LAPACKE_COMPUTEINPLACE(EIGTYPE)                                                                 \
-    template <> inline void ColPivHouseholderQR<EIGTYPE, lapack_int>::computeInPlace() {                             \
-      ColPivHouseholderQR_LAPACKE_impl<MatrixType>::run(m_qr, m_hCoeffs, m_colsPermutation, m_nonzero_pivots,        \
-                                                        m_maxpivot, m_usePrescribedThreshold, m_prescribedThreshold, \
-                                                        m_det_p, m_isInitialized); }                                 \
+#define COLPIVQR_LAPACKE(EIGTYPE)               \
+  COLPIVQR_LAPACKE_COMPUTEINPLACE(EIGTYPE)      \
+  COLPIVQR_LAPACKE_INIT(EIGTYPE)                \
+  COLPIVQR_LAPACKE_COMPUTEINPLACE(Ref<EIGTYPE>) \
+  COLPIVQR_LAPACKE_INIT(Ref<EIGTYPE>)
 
-    #define COLPIVQR_LAPACKE_INIT(EIGTYPE)                                                                          \
-    template <> inline void ColPivHouseholderQR<EIGTYPE, lapack_int>::init(Index rows, Index cols) {                \
-      ColPivHouseholderQR_LAPACKE_impl<MatrixType>::init(rows, cols, m_hCoeffs, m_colsPermutation, m_isInitialized, \
-                                                         m_usePrescribedThreshold); }                               \
+typedef Matrix<float, Dynamic, Dynamic, ColMajor> MatrixXfC;
+typedef Matrix<double, Dynamic, Dynamic, ColMajor> MatrixXdC;
+typedef Matrix<std::complex<float>, Dynamic, Dynamic, ColMajor> MatrixXcfC;
+typedef Matrix<std::complex<double>, Dynamic, Dynamic, ColMajor> MatrixXcdC;
+typedef Matrix<float, Dynamic, Dynamic, RowMajor> MatrixXfR;
+typedef Matrix<double, Dynamic, Dynamic, RowMajor> MatrixXdR;
+typedef Matrix<std::complex<float>, Dynamic, Dynamic, RowMajor> MatrixXcfR;
+typedef Matrix<std::complex<double>, Dynamic, Dynamic, RowMajor> MatrixXcdR;
 
-    #define COLPIVQR_LAPACKE(EIGTYPE)               \
-      COLPIVQR_LAPACKE_COMPUTEINPLACE(EIGTYPE)      \
-      COLPIVQR_LAPACKE_INIT(EIGTYPE)                \
-      COLPIVQR_LAPACKE_COMPUTEINPLACE(Ref<EIGTYPE>) \
-      COLPIVQR_LAPACKE_INIT(Ref<EIGTYPE>)           \
-
-    typedef Matrix<float,                 Dynamic, Dynamic, ColMajor> MatrixXfC;
-    typedef Matrix<double,                Dynamic, Dynamic, ColMajor> MatrixXdC;
-    typedef Matrix<std::complex<float>,   Dynamic, Dynamic, ColMajor> MatrixXcfC;
-    typedef Matrix<std::complex<double>,  Dynamic, Dynamic, ColMajor> MatrixXcdC;
-    typedef Matrix<float,                 Dynamic, Dynamic, RowMajor> MatrixXfR;
-    typedef Matrix<double,                Dynamic, Dynamic, RowMajor> MatrixXdR;
-    typedef Matrix<std::complex<float>,   Dynamic, Dynamic, RowMajor> MatrixXcfR;
-    typedef Matrix<std::complex<double>,  Dynamic, Dynamic, RowMajor> MatrixXcdR;
-
-    COLPIVQR_LAPACKE(MatrixXfC)
-    COLPIVQR_LAPACKE(MatrixXdC)
-    COLPIVQR_LAPACKE(MatrixXcfC)
-    COLPIVQR_LAPACKE(MatrixXcdC)
-    COLPIVQR_LAPACKE(MatrixXfR)
-    COLPIVQR_LAPACKE(MatrixXdR)
-    COLPIVQR_LAPACKE(MatrixXcfR)
-    COLPIVQR_LAPACKE(MatrixXcdR)
+COLPIVQR_LAPACKE(MatrixXfC)
+COLPIVQR_LAPACKE(MatrixXdC)
+COLPIVQR_LAPACKE(MatrixXcfC)
+COLPIVQR_LAPACKE(MatrixXcdC)
+COLPIVQR_LAPACKE(MatrixXfR)
+COLPIVQR_LAPACKE(MatrixXdR)
+COLPIVQR_LAPACKE(MatrixXcfR)
+COLPIVQR_LAPACKE(MatrixXcdR)
 
 #endif
 }  // end namespace Eigen
diff --git a/Eigen/src/QR/CompleteOrthogonalDecomposition.h b/Eigen/src/QR/CompleteOrthogonalDecomposition.h
index 3053286..8566e96 100644
--- a/Eigen/src/QR/CompleteOrthogonalDecomposition.h
+++ b/Eigen/src/QR/CompleteOrthogonalDecomposition.h
@@ -17,8 +17,7 @@
 
 namespace internal {
 template <typename MatrixType_, typename PermutationIndex_>
-struct traits<CompleteOrthogonalDecomposition<MatrixType_, PermutationIndex_> >
-    : traits<MatrixType_> {
+struct traits<CompleteOrthogonalDecomposition<MatrixType_, PermutationIndex_>> : traits<MatrixType_> {
   typedef MatrixXpr XprKind;
   typedef SolverStorage StorageKind;
   typedef PermutationIndex_ PermutationIndex;
@@ -28,36 +27,36 @@
 }  // end namespace internal
 
 /** \ingroup QR_Module
-  *
-  * \class CompleteOrthogonalDecomposition
-  *
-  * \brief Complete orthogonal decomposition (COD) of a matrix.
-  *
-  * \tparam MatrixType_ the type of the matrix of which we are computing the COD.
-  *
-  * This class performs a rank-revealing complete orthogonal decomposition of a
-  * matrix  \b A into matrices \b P, \b Q, \b T, and \b Z such that
-  * \f[
-  *  \mathbf{A} \, \mathbf{P} = \mathbf{Q} \,
-  *                     \begin{bmatrix} \mathbf{T} &  \mathbf{0} \\
-  *                                     \mathbf{0} & \mathbf{0} \end{bmatrix} \, \mathbf{Z}
-  * \f]
-  * by using Householder transformations. Here, \b P is a permutation matrix,
-  * \b Q and \b Z are unitary matrices and \b T an upper triangular matrix of
-  * size rank-by-rank. \b A may be rank deficient.
-  *
-  * This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism.
-  * 
-  * \sa MatrixBase::completeOrthogonalDecomposition()
-  */
-template <typename MatrixType_, typename PermutationIndex_> class CompleteOrthogonalDecomposition
-          : public SolverBase<CompleteOrthogonalDecomposition<MatrixType_, PermutationIndex_> >
-{
+ *
+ * \class CompleteOrthogonalDecomposition
+ *
+ * \brief Complete orthogonal decomposition (COD) of a matrix.
+ *
+ * \tparam MatrixType_ the type of the matrix of which we are computing the COD.
+ *
+ * This class performs a rank-revealing complete orthogonal decomposition of a
+ * matrix  \b A into matrices \b P, \b Q, \b T, and \b Z such that
+ * \f[
+ *  \mathbf{A} \, \mathbf{P} = \mathbf{Q} \,
+ *                     \begin{bmatrix} \mathbf{T} &  \mathbf{0} \\
+ *                                     \mathbf{0} & \mathbf{0} \end{bmatrix} \, \mathbf{Z}
+ * \f]
+ * by using Householder transformations. Here, \b P is a permutation matrix,
+ * \b Q and \b Z are unitary matrices and \b T an upper triangular matrix of
+ * size rank-by-rank. \b A may be rank deficient.
+ *
+ * This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism.
+ *
+ * \sa MatrixBase::completeOrthogonalDecomposition()
+ */
+template <typename MatrixType_, typename PermutationIndex_>
+class CompleteOrthogonalDecomposition
+    : public SolverBase<CompleteOrthogonalDecomposition<MatrixType_, PermutationIndex_>> {
  public:
   typedef MatrixType_ MatrixType;
   typedef SolverBase<CompleteOrthogonalDecomposition> Base;
 
-  template<typename Derived>
+  template <typename Derived>
   friend struct internal::solve_assertion;
   typedef PermutationIndex_ PermutationIndex;
   EIGEN_GENERIC_PUBLIC_INTERFACE(CompleteOrthogonalDecomposition)
@@ -66,16 +65,11 @@
     MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
   };
   typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
-  typedef PermutationMatrix<ColsAtCompileTime, MaxColsAtCompileTime, PermutationIndex>
-      PermutationType;
-  typedef typename internal::plain_row_type<MatrixType, Index>::type
-      IntRowVectorType;
+  typedef PermutationMatrix<ColsAtCompileTime, MaxColsAtCompileTime, PermutationIndex> PermutationType;
+  typedef typename internal::plain_row_type<MatrixType, Index>::type IntRowVectorType;
   typedef typename internal::plain_row_type<MatrixType>::type RowVectorType;
-  typedef typename internal::plain_row_type<MatrixType, RealScalar>::type
-      RealRowVectorType;
-  typedef HouseholderSequence<
-      MatrixType, internal::remove_all_t<
-                      typename HCoeffsType::ConjugateReturnType>>
+  typedef typename internal::plain_row_type<MatrixType, RealScalar>::type RealRowVectorType;
+  typedef HouseholderSequence<MatrixType, internal::remove_all_t<typename HCoeffsType::ConjugateReturnType>>
       HouseholderSequenceType;
   typedef typename MatrixType::PlainObject PlainObject;
 
@@ -118,27 +112,24 @@
   explicit CompleteOrthogonalDecomposition(const EigenBase<InputType>& matrix)
       : m_cpqr(matrix.rows(), matrix.cols()),
         m_zCoeffs((std::min)(matrix.rows(), matrix.cols())),
-        m_temp(matrix.cols())
-  {
+        m_temp(matrix.cols()) {
     compute(matrix.derived());
   }
 
   /** \brief Constructs a complete orthogonal decomposition from a given matrix
-    *
-    * This overloaded constructor is provided for \link InplaceDecomposition inplace decomposition \endlink when \c MatrixType is a Eigen::Ref.
-    *
-    * \sa CompleteOrthogonalDecomposition(const EigenBase&)
-    */
-  template<typename InputType>
+   *
+   * This overloaded constructor is provided for \link InplaceDecomposition inplace decomposition \endlink when \c
+   * MatrixType is a Eigen::Ref.
+   *
+   * \sa CompleteOrthogonalDecomposition(const EigenBase&)
+   */
+  template <typename InputType>
   explicit CompleteOrthogonalDecomposition(EigenBase<InputType>& matrix)
-    : m_cpqr(matrix.derived()),
-      m_zCoeffs((std::min)(matrix.rows(), matrix.cols())),
-      m_temp(matrix.cols())
-  {
+      : m_cpqr(matrix.derived()), m_zCoeffs((std::min)(matrix.rows(), matrix.cols())), m_temp(matrix.cols()) {
     computeInPlace();
-  } 
+  }
 
-  #ifdef EIGEN_PARSED_BY_DOXYGEN
+#ifdef EIGEN_PARSED_BY_DOXYGEN
   /** This method computes the minimum-norm solution X to a least squares
    * problem \f[\mathrm{minimize} \|A X - B\|, \f] where \b A is the matrix of
    * which \c *this is the complete orthogonal decomposition.
@@ -149,9 +140,8 @@
    *
    */
   template <typename Rhs>
-  inline const Solve<CompleteOrthogonalDecomposition, Rhs> solve(
-      const MatrixBase<Rhs>& b) const;
-  #endif
+  inline const Solve<CompleteOrthogonalDecomposition, Rhs> solve(const MatrixBase<Rhs>& b) const;
+#endif
 
   HouseholderSequenceType householderQ(void) const;
   HouseholderSequenceType matrixQ(void) const { return m_cpqr.householderQ(); }
@@ -191,11 +181,9 @@
   }
 
   /** \returns a const reference to the column permutation matrix */
-  const PermutationType& colsPermutation() const {
-    return m_cpqr.colsPermutation();
-  }
+  const PermutationType& colsPermutation() const { return m_cpqr.colsPermutation(); }
 
-    /** \returns the determinant of the matrix of which
+  /** \returns the determinant of the matrix of which
    * *this is the complete orthogonal decomposition. It has only linear
    * complexity (that is, O(n) where n is the dimension of the square matrix)
    * as the complete orthogonal decomposition has already been computed.
@@ -290,8 +278,7 @@
    * \warning: Do not compute \c this->pseudoInverse()*rhs to solve a linear systems.
    * It is more efficient and numerically stable to call \c this->solve(rhs).
    */
-  inline const Inverse<CompleteOrthogonalDecomposition> pseudoInverse() const
-  {
+  inline const Inverse<CompleteOrthogonalDecomposition> pseudoInverse() const {
     eigen_assert(m_cpqr.m_isInitialized && "CompleteOrthogonalDecomposition is not initialized.");
     return Inverse<CompleteOrthogonalDecomposition>(*this);
   }
@@ -387,24 +374,25 @@
   template <typename RhsType, typename DstType>
   void _solve_impl(const RhsType& rhs, DstType& dst) const;
 
-  template<bool Conjugate, typename RhsType, typename DstType>
-  void _solve_impl_transposed(const RhsType &rhs, DstType &dst) const;
+  template <bool Conjugate, typename RhsType, typename DstType>
+  void _solve_impl_transposed(const RhsType& rhs, DstType& dst) const;
 #endif
 
  protected:
   EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
 
-  template<bool Transpose_, typename Rhs>
+  template <bool Transpose_, typename Rhs>
   void _check_solve_assertion(const Rhs& b) const {
-      EIGEN_ONLY_USED_FOR_DEBUG(b);
-      eigen_assert(m_cpqr.m_isInitialized && "CompleteOrthogonalDecomposition is not initialized.");
-      eigen_assert((Transpose_?derived().cols():derived().rows())==b.rows() && "CompleteOrthogonalDecomposition::solve(): invalid number of rows of the right hand side matrix b");
+    EIGEN_ONLY_USED_FOR_DEBUG(b);
+    eigen_assert(m_cpqr.m_isInitialized && "CompleteOrthogonalDecomposition is not initialized.");
+    eigen_assert((Transpose_ ? derived().cols() : derived().rows()) == b.rows() &&
+                 "CompleteOrthogonalDecomposition::solve(): invalid number of rows of the right hand side matrix b");
   }
 
   void computeInPlace();
 
   /** Overwrites \b rhs with \f$ \mathbf{Z} * \mathbf{rhs} \f$ or
-   *  \f$ \mathbf{\overline Z} * \mathbf{rhs} \f$ if \c Conjugate 
+   *  \f$ \mathbf{\overline Z} * \mathbf{rhs} \f$ if \c Conjugate
    *  is set to \c true.
    */
   template <bool Conjugate, typename Rhs>
@@ -421,20 +409,18 @@
 };
 
 template <typename MatrixType, typename PermutationIndex>
-typename MatrixType::Scalar
-CompleteOrthogonalDecomposition<MatrixType, PermutationIndex>::determinant() const {
+typename MatrixType::Scalar CompleteOrthogonalDecomposition<MatrixType, PermutationIndex>::determinant() const {
   return m_cpqr.determinant();
 }
 
 template <typename MatrixType, typename PermutationIndex>
-typename MatrixType::RealScalar
-CompleteOrthogonalDecomposition<MatrixType, PermutationIndex>::absDeterminant() const {
+typename MatrixType::RealScalar CompleteOrthogonalDecomposition<MatrixType, PermutationIndex>::absDeterminant() const {
   return m_cpqr.absDeterminant();
 }
 
 template <typename MatrixType, typename PermutationIndex>
-typename MatrixType::RealScalar
-CompleteOrthogonalDecomposition<MatrixType, PermutationIndex>::logAbsDeterminant() const {
+typename MatrixType::RealScalar CompleteOrthogonalDecomposition<MatrixType, PermutationIndex>::logAbsDeterminant()
+    const {
   return m_cpqr.logAbsDeterminant();
 }
 
@@ -446,8 +432,7 @@
  * CompleteOrthogonalDecomposition(const MatrixType&)
  */
 template <typename MatrixType, typename PermutationIndex>
-void CompleteOrthogonalDecomposition<MatrixType, PermutationIndex>::computeInPlace()
-{
+void CompleteOrthogonalDecomposition<MatrixType, PermutationIndex>::computeInPlace() {
   eigen_assert(m_cpqr.cols() <= NumTraits<PermutationIndex>::highest());
 
   const Index rank = m_cpqr.rank();
@@ -473,28 +458,22 @@
         // Given the API for Householder reflectors, it is more convenient if
         // we swap the leading parts of columns k and r-1 (zero-based) to form
         // the matrix X_k = [X(0:k, k), X(0:k, r:n)]
-        m_cpqr.m_qr.col(k).head(k + 1).swap(
-            m_cpqr.m_qr.col(rank - 1).head(k + 1));
+        m_cpqr.m_qr.col(k).head(k + 1).swap(m_cpqr.m_qr.col(rank - 1).head(k + 1));
       }
       // Construct Householder reflector Z(k) to zero out the last row of X_k,
       // i.e. choose Z(k) such that
       // [X(k, k), X(k, r:n)] * Z(k) = [beta, 0, .., 0].
       RealScalar beta;
-      m_cpqr.m_qr.row(k)
-          .tail(cols - rank + 1)
-          .makeHouseholderInPlace(m_zCoeffs(k), beta);
+      m_cpqr.m_qr.row(k).tail(cols - rank + 1).makeHouseholderInPlace(m_zCoeffs(k), beta);
       m_cpqr.m_qr(k, rank - 1) = beta;
       if (k > 0) {
         // Apply Z(k) to the first k rows of X_k
         m_cpqr.m_qr.topRightCorner(k, cols - rank + 1)
-            .applyHouseholderOnTheRight(
-                m_cpqr.m_qr.row(k).tail(cols - rank).adjoint(), m_zCoeffs(k),
-                &m_temp(0));
+            .applyHouseholderOnTheRight(m_cpqr.m_qr.row(k).tail(cols - rank).adjoint(), m_zCoeffs(k), &m_temp(0));
       }
       if (k != rank - 1) {
         // Swap X(0:k,k) back to its proper location.
-        m_cpqr.m_qr.col(k).head(k + 1).swap(
-            m_cpqr.m_qr.col(rank - 1).head(k + 1));
+        m_cpqr.m_qr.col(k).head(k + 1).swap(m_cpqr.m_qr.col(rank - 1).head(k + 1));
       }
     }
   }
@@ -502,20 +481,18 @@
 
 template <typename MatrixType, typename PermutationIndex>
 template <bool Conjugate, typename Rhs>
-void CompleteOrthogonalDecomposition<MatrixType, PermutationIndex>::applyZOnTheLeftInPlace(
-    Rhs& rhs) const {
+void CompleteOrthogonalDecomposition<MatrixType, PermutationIndex>::applyZOnTheLeftInPlace(Rhs& rhs) const {
   const Index cols = this->cols();
   const Index nrhs = rhs.cols();
   const Index rank = this->rank();
   Matrix<typename Rhs::Scalar, Dynamic, 1> temp((std::max)(cols, nrhs));
-  for (Index k = rank-1; k >= 0; --k) {
+  for (Index k = rank - 1; k >= 0; --k) {
     if (k != rank - 1) {
       rhs.row(k).swap(rhs.row(rank - 1));
     }
     rhs.middleRows(rank - 1, cols - rank + 1)
-        .applyHouseholderOnTheLeft(
-            matrixQTZ().row(k).tail(cols - rank).transpose().template conjugateIf<!Conjugate>(), zCoeffs().template conjugateIf<Conjugate>()(k),
-            &temp(0));
+        .applyHouseholderOnTheLeft(matrixQTZ().row(k).tail(cols - rank).transpose().template conjugateIf<!Conjugate>(),
+                                   zCoeffs().template conjugateIf<Conjugate>()(k), &temp(0));
     if (k != rank - 1) {
       rhs.row(k).swap(rhs.row(rank - 1));
     }
@@ -524,8 +501,7 @@
 
 template <typename MatrixType, typename PermutationIndex>
 template <typename Rhs>
-void CompleteOrthogonalDecomposition<MatrixType, PermutationIndex>::applyZAdjointOnTheLeftInPlace(
-    Rhs& rhs) const {
+void CompleteOrthogonalDecomposition<MatrixType, PermutationIndex>::applyZAdjointOnTheLeftInPlace(Rhs& rhs) const {
   const Index cols = this->cols();
   const Index nrhs = rhs.cols();
   const Index rank = this->rank();
@@ -535,9 +511,7 @@
       rhs.row(k).swap(rhs.row(rank - 1));
     }
     rhs.middleRows(rank - 1, cols - rank + 1)
-        .applyHouseholderOnTheLeft(
-            matrixQTZ().row(k).tail(cols - rank).adjoint(), zCoeffs()(k),
-            &temp(0));
+        .applyHouseholderOnTheLeft(matrixQTZ().row(k).tail(cols - rank).adjoint(), zCoeffs()(k), &temp(0));
     if (k != rank - 1) {
       rhs.row(k).swap(rhs.row(rank - 1));
     }
@@ -547,8 +521,8 @@
 #ifndef EIGEN_PARSED_BY_DOXYGEN
 template <typename MatrixType_, typename PermutationIndex_>
 template <typename RhsType, typename DstType>
-void CompleteOrthogonalDecomposition<MatrixType_, PermutationIndex_>::_solve_impl(
-    const RhsType& rhs, DstType& dst) const {
+void CompleteOrthogonalDecomposition<MatrixType_, PermutationIndex_>::_solve_impl(const RhsType& rhs,
+                                                                                  DstType& dst) const {
   const Index rank = this->rank();
   if (rank == 0) {
     dst.setZero();
@@ -560,10 +534,7 @@
   c.applyOnTheLeft(matrixQ().setLength(rank).adjoint());
 
   // Solve T z = c(1:rank, :)
-  dst.topRows(rank) = matrixT()
-                          .topLeftCorner(rank, rank)
-                          .template triangularView<Upper>()
-                          .solve(c.topRows(rank));
+  dst.topRows(rank) = matrixT().topLeftCorner(rank, rank).template triangularView<Upper>().solve(c.topRows(rank));
 
   const Index cols = this->cols();
   if (rank < cols) {
@@ -577,10 +548,10 @@
   dst = colsPermutation() * dst;
 }
 
-template<typename MatrixType_, typename PermutationIndex_>
-template<bool Conjugate, typename RhsType, typename DstType>
-void CompleteOrthogonalDecomposition<MatrixType_, PermutationIndex_>::_solve_impl_transposed(const RhsType &rhs, DstType &dst) const
-{
+template <typename MatrixType_, typename PermutationIndex_>
+template <bool Conjugate, typename RhsType, typename DstType>
+void CompleteOrthogonalDecomposition<MatrixType_, PermutationIndex_>::_solve_impl_transposed(const RhsType& rhs,
+                                                                                             DstType& dst) const {
   const Index rank = this->rank();
 
   if (rank == 0) {
@@ -588,46 +559,51 @@
     return;
   }
 
-  typename RhsType::PlainObject c(colsPermutation().transpose()*rhs);
+  typename RhsType::PlainObject c(colsPermutation().transpose() * rhs);
 
   if (rank < cols()) {
     applyZOnTheLeftInPlace<!Conjugate>(c);
   }
 
-  matrixT().topLeftCorner(rank, rank)
-           .template triangularView<Upper>()
-           .transpose().template conjugateIf<Conjugate>()
-           .solveInPlace(c.topRows(rank));
+  matrixT()
+      .topLeftCorner(rank, rank)
+      .template triangularView<Upper>()
+      .transpose()
+      .template conjugateIf<Conjugate>()
+      .solveInPlace(c.topRows(rank));
 
   dst.topRows(rank) = c.topRows(rank);
-  dst.bottomRows(rows()-rank).setZero();
+  dst.bottomRows(rows() - rank).setZero();
 
-  dst.applyOnTheLeft(householderQ().setLength(rank).template conjugateIf<!Conjugate>() );
+  dst.applyOnTheLeft(householderQ().setLength(rank).template conjugateIf<!Conjugate>());
 }
 #endif
 
 namespace internal {
 
-template<typename MatrixType, typename PermutationIndex>
-struct traits<Inverse<CompleteOrthogonalDecomposition<MatrixType, PermutationIndex> > >
-  : traits<typename Transpose<typename MatrixType::PlainObject>::PlainObject>
-{
+template <typename MatrixType, typename PermutationIndex>
+struct traits<Inverse<CompleteOrthogonalDecomposition<MatrixType, PermutationIndex>>>
+    : traits<typename Transpose<typename MatrixType::PlainObject>::PlainObject> {
   enum { Flags = 0 };
 };
 
-template<typename DstXprType, typename MatrixType, typename PermutationIndex>
-struct Assignment<DstXprType, Inverse<CompleteOrthogonalDecomposition<MatrixType, PermutationIndex> >, internal::assign_op<typename DstXprType::Scalar,typename CompleteOrthogonalDecomposition<MatrixType, PermutationIndex>::Scalar>, Dense2Dense>
-{
+template <typename DstXprType, typename MatrixType, typename PermutationIndex>
+struct Assignment<DstXprType, Inverse<CompleteOrthogonalDecomposition<MatrixType, PermutationIndex>>,
+                  internal::assign_op<typename DstXprType::Scalar,
+                                      typename CompleteOrthogonalDecomposition<MatrixType, PermutationIndex>::Scalar>,
+                  Dense2Dense> {
   typedef CompleteOrthogonalDecomposition<MatrixType, PermutationIndex> CodType;
   typedef Inverse<CodType> SrcXprType;
-  static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar,typename CodType::Scalar> &)
-  {
-    typedef Matrix<typename CodType::Scalar, CodType::RowsAtCompileTime, CodType::RowsAtCompileTime, 0, CodType::MaxRowsAtCompileTime, CodType::MaxRowsAtCompileTime> IdentityMatrixType;
+  static void run(DstXprType& dst, const SrcXprType& src,
+                  const internal::assign_op<typename DstXprType::Scalar, typename CodType::Scalar>&) {
+    typedef Matrix<typename CodType::Scalar, CodType::RowsAtCompileTime, CodType::RowsAtCompileTime, 0,
+                   CodType::MaxRowsAtCompileTime, CodType::MaxRowsAtCompileTime>
+        IdentityMatrixType;
     dst = src.nestedExpression().solve(IdentityMatrixType::Identity(src.cols(), src.cols()));
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \returns the matrix Q as a sequence of householder transformations */
 template <typename MatrixType, typename PermutationIndex>
@@ -637,9 +613,9 @@
 }
 
 /** \return the complete orthogonal decomposition of \c *this.
-  *
-  * \sa class CompleteOrthogonalDecomposition
-  */
+ *
+ * \sa class CompleteOrthogonalDecomposition
+ */
 template <typename Derived>
 template <typename PermutationIndex>
 const CompleteOrthogonalDecomposition<typename MatrixBase<Derived>::PlainObject, PermutationIndex>
diff --git a/Eigen/src/QR/FullPivHouseholderQR.h b/Eigen/src/QR/FullPivHouseholderQR.h
index 89e546c..d93a5d1 100644
--- a/Eigen/src/QR/FullPivHouseholderQR.h
+++ b/Eigen/src/QR/FullPivHouseholderQR.h
@@ -14,83 +14,80 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
-template<typename MatrixType_, typename PermutationIndex_> struct traits<FullPivHouseholderQR<MatrixType_, PermutationIndex_> >
- : traits<MatrixType_>
-{
+template <typename MatrixType_, typename PermutationIndex_>
+struct traits<FullPivHouseholderQR<MatrixType_, PermutationIndex_> > : traits<MatrixType_> {
   typedef MatrixXpr XprKind;
   typedef SolverStorage StorageKind;
   typedef PermutationIndex_ PermutationIndex;
   enum { Flags = 0 };
 };
 
-template<typename MatrixType, typename PermutationIndex> struct FullPivHouseholderQRMatrixQReturnType;
+template <typename MatrixType, typename PermutationIndex>
+struct FullPivHouseholderQRMatrixQReturnType;
 
-template<typename MatrixType, typename PermutationIndex>
-struct traits<FullPivHouseholderQRMatrixQReturnType<MatrixType, PermutationIndex> >
-{
+template <typename MatrixType, typename PermutationIndex>
+struct traits<FullPivHouseholderQRMatrixQReturnType<MatrixType, PermutationIndex> > {
   typedef typename MatrixType::PlainObject ReturnType;
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \ingroup QR_Module
-  *
-  * \class FullPivHouseholderQR
-  *
-  * \brief Householder rank-revealing QR decomposition of a matrix with full pivoting
-  *
-  * \tparam MatrixType_ the type of the matrix of which we are computing the QR decomposition
-  *
-  * This class performs a rank-revealing QR decomposition of a matrix \b A into matrices \b P, \b P', \b Q and \b R
-  * such that 
-  * \f[
-  *  \mathbf{P} \, \mathbf{A} \, \mathbf{P}' = \mathbf{Q} \, \mathbf{R}
-  * \f]
-  * by using Householder transformations. Here, \b P and \b P' are permutation matrices, \b Q a unitary matrix 
-  * and \b R an upper triangular matrix.
-  *
-  * This decomposition performs a very prudent full pivoting in order to be rank-revealing and achieve optimal
-  * numerical stability. The trade-off is that it is slower than HouseholderQR and ColPivHouseholderQR.
-  *
-  * This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism.
-  * 
-  * \sa MatrixBase::fullPivHouseholderQr()
-  */
-template<typename MatrixType_, typename PermutationIndex_> class FullPivHouseholderQR
-        : public SolverBase<FullPivHouseholderQR<MatrixType_, PermutationIndex_> >
-{
-  public:
+ *
+ * \class FullPivHouseholderQR
+ *
+ * \brief Householder rank-revealing QR decomposition of a matrix with full pivoting
+ *
+ * \tparam MatrixType_ the type of the matrix of which we are computing the QR decomposition
+ *
+ * This class performs a rank-revealing QR decomposition of a matrix \b A into matrices \b P, \b P', \b Q and \b R
+ * such that
+ * \f[
+ *  \mathbf{P} \, \mathbf{A} \, \mathbf{P}' = \mathbf{Q} \, \mathbf{R}
+ * \f]
+ * by using Householder transformations. Here, \b P and \b P' are permutation matrices, \b Q a unitary matrix
+ * and \b R an upper triangular matrix.
+ *
+ * This decomposition performs a very prudent full pivoting in order to be rank-revealing and achieve optimal
+ * numerical stability. The trade-off is that it is slower than HouseholderQR and ColPivHouseholderQR.
+ *
+ * This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism.
+ *
+ * \sa MatrixBase::fullPivHouseholderQr()
+ */
+template <typename MatrixType_, typename PermutationIndex_>
+class FullPivHouseholderQR : public SolverBase<FullPivHouseholderQR<MatrixType_, PermutationIndex_> > {
+ public:
+  typedef MatrixType_ MatrixType;
+  typedef SolverBase<FullPivHouseholderQR> Base;
+  friend class SolverBase<FullPivHouseholderQR>;
+  typedef PermutationIndex_ PermutationIndex;
+  EIGEN_GENERIC_PUBLIC_INTERFACE(FullPivHouseholderQR)
 
-    typedef MatrixType_ MatrixType;
-    typedef SolverBase<FullPivHouseholderQR> Base;
-    friend class SolverBase<FullPivHouseholderQR>;
-    typedef PermutationIndex_ PermutationIndex;
-    EIGEN_GENERIC_PUBLIC_INTERFACE(FullPivHouseholderQR)
-    
-    enum {
-      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
-      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
-    };
-    typedef internal::FullPivHouseholderQRMatrixQReturnType<MatrixType, PermutationIndex> MatrixQReturnType;
-    typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
-    typedef Matrix<PermutationIndex, 1,
-                   internal::min_size_prefer_dynamic(ColsAtCompileTime,RowsAtCompileTime), RowMajor, 1,
-                   internal::min_size_prefer_fixed(MaxColsAtCompileTime, MaxRowsAtCompileTime)> IntDiagSizeVectorType;
-    typedef PermutationMatrix<ColsAtCompileTime, MaxColsAtCompileTime, PermutationIndex> PermutationType;
-    typedef typename internal::plain_row_type<MatrixType>::type RowVectorType;
-    typedef typename internal::plain_col_type<MatrixType>::type ColVectorType;
-    typedef typename MatrixType::PlainObject PlainObject;
+  enum {
+    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
+  };
+  typedef internal::FullPivHouseholderQRMatrixQReturnType<MatrixType, PermutationIndex> MatrixQReturnType;
+  typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
+  typedef Matrix<PermutationIndex, 1, internal::min_size_prefer_dynamic(ColsAtCompileTime, RowsAtCompileTime), RowMajor,
+                 1, internal::min_size_prefer_fixed(MaxColsAtCompileTime, MaxRowsAtCompileTime)>
+      IntDiagSizeVectorType;
+  typedef PermutationMatrix<ColsAtCompileTime, MaxColsAtCompileTime, PermutationIndex> PermutationType;
+  typedef typename internal::plain_row_type<MatrixType>::type RowVectorType;
+  typedef typename internal::plain_col_type<MatrixType>::type ColVectorType;
+  typedef typename MatrixType::PlainObject PlainObject;
 
-    /** \brief Default Constructor.
-      *
-      * The default constructor is useful in cases in which the user intends to
-      * perform decompositions via FullPivHouseholderQR::compute(const MatrixType&).
-      */
-    FullPivHouseholderQR()
+  /** \brief Default Constructor.
+   *
+   * The default constructor is useful in cases in which the user intends to
+   * perform decompositions via FullPivHouseholderQR::compute(const MatrixType&).
+   */
+  FullPivHouseholderQR()
       : m_qr(),
         m_hCoeffs(),
         m_rows_transpositions(),
@@ -100,36 +97,36 @@
         m_isInitialized(false),
         m_usePrescribedThreshold(false) {}
 
-    /** \brief Default Constructor with memory preallocation
-      *
-      * Like the default constructor but with preallocation of the internal data
-      * according to the specified problem \a size.
-      * \sa FullPivHouseholderQR()
-      */
-    FullPivHouseholderQR(Index rows, Index cols)
+  /** \brief Default Constructor with memory preallocation
+   *
+   * Like the default constructor but with preallocation of the internal data
+   * according to the specified problem \a size.
+   * \sa FullPivHouseholderQR()
+   */
+  FullPivHouseholderQR(Index rows, Index cols)
       : m_qr(rows, cols),
-        m_hCoeffs((std::min)(rows,cols)),
-        m_rows_transpositions((std::min)(rows,cols)),
-        m_cols_transpositions((std::min)(rows,cols)),
+        m_hCoeffs((std::min)(rows, cols)),
+        m_rows_transpositions((std::min)(rows, cols)),
+        m_cols_transpositions((std::min)(rows, cols)),
         m_cols_permutation(cols),
         m_temp(cols),
         m_isInitialized(false),
         m_usePrescribedThreshold(false) {}
 
-    /** \brief Constructs a QR factorization from a given matrix
-      *
-      * This constructor computes the QR factorization of the matrix \a matrix by calling
-      * the method compute(). It is a short cut for:
-      * 
-      * \code
-      * FullPivHouseholderQR<MatrixType> qr(matrix.rows(), matrix.cols());
-      * qr.compute(matrix);
-      * \endcode
-      * 
-      * \sa compute()
-      */
-    template<typename InputType>
-    explicit FullPivHouseholderQR(const EigenBase<InputType>& matrix)
+  /** \brief Constructs a QR factorization from a given matrix
+   *
+   * This constructor computes the QR factorization of the matrix \a matrix by calling
+   * the method compute(). It is a short cut for:
+   *
+   * \code
+   * FullPivHouseholderQR<MatrixType> qr(matrix.rows(), matrix.cols());
+   * qr.compute(matrix);
+   * \endcode
+   *
+   * \sa compute()
+   */
+  template <typename InputType>
+  explicit FullPivHouseholderQR(const EigenBase<InputType>& matrix)
       : m_qr(matrix.rows(), matrix.cols()),
         m_hCoeffs((std::min)(matrix.rows(), matrix.cols())),
         m_rows_transpositions((std::min)(matrix.rows(), matrix.cols())),
@@ -137,19 +134,19 @@
         m_cols_permutation(matrix.cols()),
         m_temp(matrix.cols()),
         m_isInitialized(false),
-        m_usePrescribedThreshold(false)
-    {
-      compute(matrix.derived());
-    }
+        m_usePrescribedThreshold(false) {
+    compute(matrix.derived());
+  }
 
-    /** \brief Constructs a QR factorization from a given matrix
-      *
-      * This overloaded constructor is provided for \link InplaceDecomposition inplace decomposition \endlink when \c MatrixType is a Eigen::Ref.
-      *
-      * \sa FullPivHouseholderQR(const EigenBase&)
-      */
-    template<typename InputType>
-    explicit FullPivHouseholderQR(EigenBase<InputType>& matrix)
+  /** \brief Constructs a QR factorization from a given matrix
+   *
+   * This overloaded constructor is provided for \link InplaceDecomposition inplace decomposition \endlink when \c
+   * MatrixType is a Eigen::Ref.
+   *
+   * \sa FullPivHouseholderQR(const EigenBase&)
+   */
+  template <typename InputType>
+  explicit FullPivHouseholderQR(EigenBase<InputType>& matrix)
       : m_qr(matrix.derived()),
         m_hCoeffs((std::min)(matrix.rows(), matrix.cols())),
         m_rows_transpositions((std::min)(matrix.rows(), matrix.cols())),
@@ -157,291 +154,273 @@
         m_cols_permutation(matrix.cols()),
         m_temp(matrix.cols()),
         m_isInitialized(false),
-        m_usePrescribedThreshold(false)
-    {
-      computeInPlace();
-    }
+        m_usePrescribedThreshold(false) {
+    computeInPlace();
+  }
 
-    #ifdef EIGEN_PARSED_BY_DOXYGEN
-    /** This method finds a solution x to the equation Ax=b, where A is the matrix of which
-      * \c *this is the QR decomposition.
-      *
-      * \param b the right-hand-side of the equation to solve.
-      *
-      * \returns the exact or least-square solution if the rank is greater or equal to the number of columns of A,
-      * and an arbitrary solution otherwise.
-      *
-      * \note_about_checking_solutions
-      *
-      * \note_about_arbitrary_choice_of_solution
-      *
-      * Example: \include FullPivHouseholderQR_solve.cpp
-      * Output: \verbinclude FullPivHouseholderQR_solve.out
-      */
-    template<typename Rhs>
-    inline const Solve<FullPivHouseholderQR, Rhs>
-    solve(const MatrixBase<Rhs>& b) const;
-    #endif
+#ifdef EIGEN_PARSED_BY_DOXYGEN
+  /** This method finds a solution x to the equation Ax=b, where A is the matrix of which
+   * \c *this is the QR decomposition.
+   *
+   * \param b the right-hand-side of the equation to solve.
+   *
+   * \returns the exact or least-square solution if the rank is greater or equal to the number of columns of A,
+   * and an arbitrary solution otherwise.
+   *
+   * \note_about_checking_solutions
+   *
+   * \note_about_arbitrary_choice_of_solution
+   *
+   * Example: \include FullPivHouseholderQR_solve.cpp
+   * Output: \verbinclude FullPivHouseholderQR_solve.out
+   */
+  template <typename Rhs>
+  inline const Solve<FullPivHouseholderQR, Rhs> solve(const MatrixBase<Rhs>& b) const;
+#endif
 
-    /** \returns Expression object representing the matrix Q
-      */
-    MatrixQReturnType matrixQ(void) const;
+  /** \returns Expression object representing the matrix Q
+   */
+  MatrixQReturnType matrixQ(void) const;
 
-    /** \returns a reference to the matrix where the Householder QR decomposition is stored
-      */
-    const MatrixType& matrixQR() const
-    {
-      eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
-      return m_qr;
-    }
+  /** \returns a reference to the matrix where the Householder QR decomposition is stored
+   */
+  const MatrixType& matrixQR() const {
+    eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
+    return m_qr;
+  }
 
-    template<typename InputType>
-    FullPivHouseholderQR& compute(const EigenBase<InputType>& matrix);
+  template <typename InputType>
+  FullPivHouseholderQR& compute(const EigenBase<InputType>& matrix);
 
-    /** \returns a const reference to the column permutation matrix */
-    const PermutationType& colsPermutation() const
-    {
-      eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
-      return m_cols_permutation;
-    }
+  /** \returns a const reference to the column permutation matrix */
+  const PermutationType& colsPermutation() const {
+    eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
+    return m_cols_permutation;
+  }
 
-    /** \returns a const reference to the vector of indices representing the rows transpositions */
-    const IntDiagSizeVectorType& rowsTranspositions() const
-    {
-      eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
-      return m_rows_transpositions;
-    }
+  /** \returns a const reference to the vector of indices representing the rows transpositions */
+  const IntDiagSizeVectorType& rowsTranspositions() const {
+    eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
+    return m_rows_transpositions;
+  }
 
-    /** \returns the determinant of the matrix of which
-      * *this is the QR decomposition. It has only linear complexity
-      * (that is, O(n) where n is the dimension of the square matrix)
-      * as the QR decomposition has already been computed.
-      *
-      * \note This is only for square matrices.
-      *
-      * \warning a determinant can be very big or small, so for matrices
-      * of large enough dimension, there is a risk of overflow/underflow.
-      * One way to work around that is to use logAbsDeterminant() instead.
-      *
-      * \sa absDeterminant(), logAbsDeterminant(), MatrixBase::determinant()
-      */
-    typename MatrixType::Scalar determinant() const;
+  /** \returns the determinant of the matrix of which
+   * *this is the QR decomposition. It has only linear complexity
+   * (that is, O(n) where n is the dimension of the square matrix)
+   * as the QR decomposition has already been computed.
+   *
+   * \note This is only for square matrices.
+   *
+   * \warning a determinant can be very big or small, so for matrices
+   * of large enough dimension, there is a risk of overflow/underflow.
+   * One way to work around that is to use logAbsDeterminant() instead.
+   *
+   * \sa absDeterminant(), logAbsDeterminant(), MatrixBase::determinant()
+   */
+  typename MatrixType::Scalar determinant() const;
 
-    /** \returns the absolute value of the determinant of the matrix of which
-      * *this is the QR decomposition. It has only linear complexity
-      * (that is, O(n) where n is the dimension of the square matrix)
-      * as the QR decomposition has already been computed.
-      *
-      * \note This is only for square matrices.
-      *
-      * \warning a determinant can be very big or small, so for matrices
-      * of large enough dimension, there is a risk of overflow/underflow.
-      * One way to work around that is to use logAbsDeterminant() instead.
-      *
-      * \sa determinant(), logAbsDeterminant(), MatrixBase::determinant()
-      */
-    typename MatrixType::RealScalar absDeterminant() const;
+  /** \returns the absolute value of the determinant of the matrix of which
+   * *this is the QR decomposition. It has only linear complexity
+   * (that is, O(n) where n is the dimension of the square matrix)
+   * as the QR decomposition has already been computed.
+   *
+   * \note This is only for square matrices.
+   *
+   * \warning a determinant can be very big or small, so for matrices
+   * of large enough dimension, there is a risk of overflow/underflow.
+   * One way to work around that is to use logAbsDeterminant() instead.
+   *
+   * \sa determinant(), logAbsDeterminant(), MatrixBase::determinant()
+   */
+  typename MatrixType::RealScalar absDeterminant() const;
 
-    /** \returns the natural log of the absolute value of the determinant of the matrix of which
-      * *this is the QR decomposition. It has only linear complexity
-      * (that is, O(n) where n is the dimension of the square matrix)
-      * as the QR decomposition has already been computed.
-      *
-      * \note This is only for square matrices.
-      *
-      * \note This method is useful to work around the risk of overflow/underflow that's inherent
-      * to determinant computation.
-      *
-      * \sa determinant(), absDeterminant(), MatrixBase::determinant()
-      */
-    typename MatrixType::RealScalar logAbsDeterminant() const;
+  /** \returns the natural log of the absolute value of the determinant of the matrix of which
+   * *this is the QR decomposition. It has only linear complexity
+   * (that is, O(n) where n is the dimension of the square matrix)
+   * as the QR decomposition has already been computed.
+   *
+   * \note This is only for square matrices.
+   *
+   * \note This method is useful to work around the risk of overflow/underflow that's inherent
+   * to determinant computation.
+   *
+   * \sa determinant(), absDeterminant(), MatrixBase::determinant()
+   */
+  typename MatrixType::RealScalar logAbsDeterminant() const;
 
-    /** \returns the rank of the matrix of which *this is the QR decomposition.
-      *
-      * \note This method has to determine which pivots should be considered nonzero.
-      *       For that, it uses the threshold value that you can control by calling
-      *       setThreshold(const RealScalar&).
-      */
-    inline Index rank() const
-    {
-      using std::abs;
-      eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
-      RealScalar premultiplied_threshold = abs(m_maxpivot) * threshold();
-      Index result = 0;
-      for(Index i = 0; i < m_nonzero_pivots; ++i)
-        result += (abs(m_qr.coeff(i,i)) > premultiplied_threshold);
-      return result;
-    }
+  /** \returns the rank of the matrix of which *this is the QR decomposition.
+   *
+   * \note This method has to determine which pivots should be considered nonzero.
+   *       For that, it uses the threshold value that you can control by calling
+   *       setThreshold(const RealScalar&).
+   */
+  inline Index rank() const {
+    using std::abs;
+    eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
+    RealScalar premultiplied_threshold = abs(m_maxpivot) * threshold();
+    Index result = 0;
+    for (Index i = 0; i < m_nonzero_pivots; ++i) result += (abs(m_qr.coeff(i, i)) > premultiplied_threshold);
+    return result;
+  }
 
-    /** \returns the dimension of the kernel of the matrix of which *this is the QR decomposition.
-      *
-      * \note This method has to determine which pivots should be considered nonzero.
-      *       For that, it uses the threshold value that you can control by calling
-      *       setThreshold(const RealScalar&).
-      */
-    inline Index dimensionOfKernel() const
-    {
-      eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
-      return cols() - rank();
-    }
+  /** \returns the dimension of the kernel of the matrix of which *this is the QR decomposition.
+   *
+   * \note This method has to determine which pivots should be considered nonzero.
+   *       For that, it uses the threshold value that you can control by calling
+   *       setThreshold(const RealScalar&).
+   */
+  inline Index dimensionOfKernel() const {
+    eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
+    return cols() - rank();
+  }
 
-    /** \returns true if the matrix of which *this is the QR decomposition represents an injective
-      *          linear map, i.e. has trivial kernel; false otherwise.
-      *
-      * \note This method has to determine which pivots should be considered nonzero.
-      *       For that, it uses the threshold value that you can control by calling
-      *       setThreshold(const RealScalar&).
-      */
-    inline bool isInjective() const
-    {
-      eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
-      return rank() == cols();
-    }
+  /** \returns true if the matrix of which *this is the QR decomposition represents an injective
+   *          linear map, i.e. has trivial kernel; false otherwise.
+   *
+   * \note This method has to determine which pivots should be considered nonzero.
+   *       For that, it uses the threshold value that you can control by calling
+   *       setThreshold(const RealScalar&).
+   */
+  inline bool isInjective() const {
+    eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
+    return rank() == cols();
+  }
 
-    /** \returns true if the matrix of which *this is the QR decomposition represents a surjective
-      *          linear map; false otherwise.
-      *
-      * \note This method has to determine which pivots should be considered nonzero.
-      *       For that, it uses the threshold value that you can control by calling
-      *       setThreshold(const RealScalar&).
-      */
-    inline bool isSurjective() const
-    {
-      eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
-      return rank() == rows();
-    }
+  /** \returns true if the matrix of which *this is the QR decomposition represents a surjective
+   *          linear map; false otherwise.
+   *
+   * \note This method has to determine which pivots should be considered nonzero.
+   *       For that, it uses the threshold value that you can control by calling
+   *       setThreshold(const RealScalar&).
+   */
+  inline bool isSurjective() const {
+    eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
+    return rank() == rows();
+  }
 
-    /** \returns true if the matrix of which *this is the QR decomposition is invertible.
-      *
-      * \note This method has to determine which pivots should be considered nonzero.
-      *       For that, it uses the threshold value that you can control by calling
-      *       setThreshold(const RealScalar&).
-      */
-    inline bool isInvertible() const
-    {
-      eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
-      return isInjective() && isSurjective();
-    }
+  /** \returns true if the matrix of which *this is the QR decomposition is invertible.
+   *
+   * \note This method has to determine which pivots should be considered nonzero.
+   *       For that, it uses the threshold value that you can control by calling
+   *       setThreshold(const RealScalar&).
+   */
+  inline bool isInvertible() const {
+    eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
+    return isInjective() && isSurjective();
+  }
 
-    /** \returns the inverse of the matrix of which *this is the QR decomposition.
-      *
-      * \note If this matrix is not invertible, the returned matrix has undefined coefficients.
-      *       Use isInvertible() to first determine whether this matrix is invertible.
-      */
-    inline const Inverse<FullPivHouseholderQR> inverse() const
-    {
-      eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
-      return Inverse<FullPivHouseholderQR>(*this);
-    }
+  /** \returns the inverse of the matrix of which *this is the QR decomposition.
+   *
+   * \note If this matrix is not invertible, the returned matrix has undefined coefficients.
+   *       Use isInvertible() to first determine whether this matrix is invertible.
+   */
+  inline const Inverse<FullPivHouseholderQR> inverse() const {
+    eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
+    return Inverse<FullPivHouseholderQR>(*this);
+  }
 
-    inline Index rows() const { return m_qr.rows(); }
-    inline Index cols() const { return m_qr.cols(); }
-    
-    /** \returns a const reference to the vector of Householder coefficients used to represent the factor \c Q.
-      * 
-      * For advanced uses only.
-      */
-    const HCoeffsType& hCoeffs() const { return m_hCoeffs; }
+  inline Index rows() const { return m_qr.rows(); }
+  inline Index cols() const { return m_qr.cols(); }
 
-    /** Allows to prescribe a threshold to be used by certain methods, such as rank(),
-      * who need to determine when pivots are to be considered nonzero. This is not used for the
-      * QR decomposition itself.
-      *
-      * When it needs to get the threshold value, Eigen calls threshold(). By default, this
-      * uses a formula to automatically determine a reasonable threshold.
-      * Once you have called the present method setThreshold(const RealScalar&),
-      * your value is used instead.
-      *
-      * \param threshold The new value to use as the threshold.
-      *
-      * A pivot will be considered nonzero if its absolute value is strictly greater than
-      *  \f$ \vert pivot \vert \leqslant threshold \times \vert maxpivot \vert \f$
-      * where maxpivot is the biggest pivot.
-      *
-      * If you want to come back to the default behavior, call setThreshold(Default_t)
-      */
-    FullPivHouseholderQR& setThreshold(const RealScalar& threshold)
-    {
-      m_usePrescribedThreshold = true;
-      m_prescribedThreshold = threshold;
-      return *this;
-    }
+  /** \returns a const reference to the vector of Householder coefficients used to represent the factor \c Q.
+   *
+   * For advanced uses only.
+   */
+  const HCoeffsType& hCoeffs() const { return m_hCoeffs; }
 
-    /** Allows to come back to the default behavior, letting Eigen use its default formula for
-      * determining the threshold.
-      *
-      * You should pass the special object Eigen::Default as parameter here.
-      * \code qr.setThreshold(Eigen::Default); \endcode
-      *
-      * See the documentation of setThreshold(const RealScalar&).
-      */
-    FullPivHouseholderQR& setThreshold(Default_t)
-    {
-      m_usePrescribedThreshold = false;
-      return *this;
-    }
+  /** Allows to prescribe a threshold to be used by certain methods, such as rank(),
+   * who need to determine when pivots are to be considered nonzero. This is not used for the
+   * QR decomposition itself.
+   *
+   * When it needs to get the threshold value, Eigen calls threshold(). By default, this
+   * uses a formula to automatically determine a reasonable threshold.
+   * Once you have called the present method setThreshold(const RealScalar&),
+   * your value is used instead.
+   *
+   * \param threshold The new value to use as the threshold.
+   *
+   * A pivot will be considered nonzero if its absolute value is strictly greater than
+   *  \f$ \vert pivot \vert \leqslant threshold \times \vert maxpivot \vert \f$
+   * where maxpivot is the biggest pivot.
+   *
+   * If you want to come back to the default behavior, call setThreshold(Default_t)
+   */
+  FullPivHouseholderQR& setThreshold(const RealScalar& threshold) {
+    m_usePrescribedThreshold = true;
+    m_prescribedThreshold = threshold;
+    return *this;
+  }
 
-    /** Returns the threshold that will be used by certain methods such as rank().
-      *
-      * See the documentation of setThreshold(const RealScalar&).
-      */
-    RealScalar threshold() const
-    {
-      eigen_assert(m_isInitialized || m_usePrescribedThreshold);
-      return m_usePrescribedThreshold ? m_prescribedThreshold
-      // this formula comes from experimenting (see "LU precision tuning" thread on the list)
-      // and turns out to be identical to Higham's formula used already in LDLt.
-                                      : NumTraits<Scalar>::epsilon() * RealScalar(m_qr.diagonalSize());
-    }
+  /** Allows to come back to the default behavior, letting Eigen use its default formula for
+   * determining the threshold.
+   *
+   * You should pass the special object Eigen::Default as parameter here.
+   * \code qr.setThreshold(Eigen::Default); \endcode
+   *
+   * See the documentation of setThreshold(const RealScalar&).
+   */
+  FullPivHouseholderQR& setThreshold(Default_t) {
+    m_usePrescribedThreshold = false;
+    return *this;
+  }
 
-    /** \returns the number of nonzero pivots in the QR decomposition.
-      * Here nonzero is meant in the exact sense, not in a fuzzy sense.
-      * So that notion isn't really intrinsically interesting, but it is
-      * still useful when implementing algorithms.
-      *
-      * \sa rank()
-      */
-    inline Index nonzeroPivots() const
-    {
-      eigen_assert(m_isInitialized && "LU is not initialized.");
-      return m_nonzero_pivots;
-    }
+  /** Returns the threshold that will be used by certain methods such as rank().
+   *
+   * See the documentation of setThreshold(const RealScalar&).
+   */
+  RealScalar threshold() const {
+    eigen_assert(m_isInitialized || m_usePrescribedThreshold);
+    return m_usePrescribedThreshold ? m_prescribedThreshold
+                                    // this formula comes from experimenting (see "LU precision tuning" thread on the
+                                    // list) and turns out to be identical to Higham's formula used already in LDLt.
+                                    : NumTraits<Scalar>::epsilon() * RealScalar(m_qr.diagonalSize());
+  }
 
-    /** \returns the absolute value of the biggest pivot, i.e. the biggest
-      *          diagonal coefficient of U.
-      */
-    RealScalar maxPivot() const { return m_maxpivot; }
+  /** \returns the number of nonzero pivots in the QR decomposition.
+   * Here nonzero is meant in the exact sense, not in a fuzzy sense.
+   * So that notion isn't really intrinsically interesting, but it is
+   * still useful when implementing algorithms.
+   *
+   * \sa rank()
+   */
+  inline Index nonzeroPivots() const {
+    eigen_assert(m_isInitialized && "LU is not initialized.");
+    return m_nonzero_pivots;
+  }
 
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    template<typename RhsType, typename DstType>
-    void _solve_impl(const RhsType &rhs, DstType &dst) const;
+  /** \returns the absolute value of the biggest pivot, i.e. the biggest
+   *          diagonal coefficient of U.
+   */
+  RealScalar maxPivot() const { return m_maxpivot; }
 
-    template<bool Conjugate, typename RhsType, typename DstType>
-    void _solve_impl_transposed(const RhsType &rhs, DstType &dst) const;
-    #endif
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  template <typename RhsType, typename DstType>
+  void _solve_impl(const RhsType& rhs, DstType& dst) const;
 
-  protected:
+  template <bool Conjugate, typename RhsType, typename DstType>
+  void _solve_impl_transposed(const RhsType& rhs, DstType& dst) const;
+#endif
 
-    EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
+ protected:
+  EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
 
-    void computeInPlace();
+  void computeInPlace();
 
-    MatrixType m_qr;
-    HCoeffsType m_hCoeffs;
-    IntDiagSizeVectorType m_rows_transpositions;
-    IntDiagSizeVectorType m_cols_transpositions;
-    PermutationType m_cols_permutation;
-    RowVectorType m_temp;
-    bool m_isInitialized, m_usePrescribedThreshold;
-    RealScalar m_prescribedThreshold, m_maxpivot;
-    Index m_nonzero_pivots;
-    RealScalar m_precision;
-    Index m_det_p;
+  MatrixType m_qr;
+  HCoeffsType m_hCoeffs;
+  IntDiagSizeVectorType m_rows_transpositions;
+  IntDiagSizeVectorType m_cols_transpositions;
+  PermutationType m_cols_permutation;
+  RowVectorType m_temp;
+  bool m_isInitialized, m_usePrescribedThreshold;
+  RealScalar m_prescribedThreshold, m_maxpivot;
+  Index m_nonzero_pivots;
+  RealScalar m_precision;
+  Index m_det_p;
 };
 
-template<typename MatrixType, typename PermutationIndex>
-typename MatrixType::Scalar FullPivHouseholderQR<MatrixType, PermutationIndex>::determinant() const
-{
+template <typename MatrixType, typename PermutationIndex>
+typename MatrixType::Scalar FullPivHouseholderQR<MatrixType, PermutationIndex>::determinant() const {
   eigen_assert(m_isInitialized && "HouseholderQR is not initialized.");
   eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
   Scalar detQ;
@@ -449,48 +428,44 @@
   return m_qr.diagonal().prod() * detQ * Scalar(m_det_p);
 }
 
-template<typename MatrixType, typename PermutationIndex>
-typename MatrixType::RealScalar FullPivHouseholderQR<MatrixType, PermutationIndex>::absDeterminant() const
-{
+template <typename MatrixType, typename PermutationIndex>
+typename MatrixType::RealScalar FullPivHouseholderQR<MatrixType, PermutationIndex>::absDeterminant() const {
   using std::abs;
   eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
   eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
   return abs(m_qr.diagonal().prod());
 }
 
-template<typename MatrixType, typename PermutationIndex>
-typename MatrixType::RealScalar FullPivHouseholderQR<MatrixType, PermutationIndex>::logAbsDeterminant() const
-{
+template <typename MatrixType, typename PermutationIndex>
+typename MatrixType::RealScalar FullPivHouseholderQR<MatrixType, PermutationIndex>::logAbsDeterminant() const {
   eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
   eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
   return m_qr.diagonal().cwiseAbs().array().log().sum();
 }
 
 /** Performs the QR factorization of the given matrix \a matrix. The result of
-  * the factorization is stored into \c *this, and a reference to \c *this
-  * is returned.
-  *
-  * \sa class FullPivHouseholderQR, FullPivHouseholderQR(const MatrixType&)
-  */
-template<typename MatrixType, typename PermutationIndex>
-template<typename InputType>
-FullPivHouseholderQR<MatrixType, PermutationIndex>& FullPivHouseholderQR<MatrixType, PermutationIndex>::compute(const EigenBase<InputType>& matrix)
-{
+ * the factorization is stored into \c *this, and a reference to \c *this
+ * is returned.
+ *
+ * \sa class FullPivHouseholderQR, FullPivHouseholderQR(const MatrixType&)
+ */
+template <typename MatrixType, typename PermutationIndex>
+template <typename InputType>
+FullPivHouseholderQR<MatrixType, PermutationIndex>& FullPivHouseholderQR<MatrixType, PermutationIndex>::compute(
+    const EigenBase<InputType>& matrix) {
   m_qr = matrix.derived();
   computeInPlace();
   return *this;
 }
 
-template<typename MatrixType, typename PermutationIndex>
-void FullPivHouseholderQR<MatrixType, PermutationIndex>::computeInPlace()
-{
+template <typename MatrixType, typename PermutationIndex>
+void FullPivHouseholderQR<MatrixType, PermutationIndex>::computeInPlace() {
   eigen_assert(m_qr.cols() <= NumTraits<PermutationIndex>::highest());
   using std::abs;
   Index rows = m_qr.rows();
   Index cols = m_qr.cols();
-  Index size = (std::min)(rows,cols);
+  Index size = (std::min)(rows, cols);
 
-  
   m_hCoeffs.resize(size);
 
   m_temp.resize(cols);
@@ -503,29 +478,27 @@
 
   RealScalar biggest(0);
 
-  m_nonzero_pivots = size; // the generic case is that in which all pivots are nonzero (invertible case)
+  m_nonzero_pivots = size;  // the generic case is that in which all pivots are nonzero (invertible case)
   m_maxpivot = RealScalar(0);
 
-  for (Index k = 0; k < size; ++k)
-  {
+  for (Index k = 0; k < size; ++k) {
     Index row_of_biggest_in_corner, col_of_biggest_in_corner;
     typedef internal::scalar_score_coeff_op<Scalar> Scoring;
     typedef typename Scoring::result_type Score;
 
-    Score score = m_qr.bottomRightCorner(rows-k, cols-k)
+    Score score = m_qr.bottomRightCorner(rows - k, cols - k)
                       .unaryExpr(Scoring())
                       .maxCoeff(&row_of_biggest_in_corner, &col_of_biggest_in_corner);
     row_of_biggest_in_corner += k;
     col_of_biggest_in_corner += k;
-    RealScalar biggest_in_corner = internal::abs_knowing_score<Scalar>()(m_qr(row_of_biggest_in_corner, col_of_biggest_in_corner), score);
-    if(k==0) biggest = biggest_in_corner;
+    RealScalar biggest_in_corner =
+        internal::abs_knowing_score<Scalar>()(m_qr(row_of_biggest_in_corner, col_of_biggest_in_corner), score);
+    if (k == 0) biggest = biggest_in_corner;
 
     // if the corner is negligible, then we have less than full rank, and we can finish early
-    if(internal::isMuchSmallerThan(biggest_in_corner, biggest, m_precision))
-    {
+    if (internal::isMuchSmallerThan(biggest_in_corner, biggest, m_precision)) {
       m_nonzero_pivots = k;
-      for(Index i = k; i < size; i++)
-      {
+      for (Index i = k; i < size; i++) {
         m_rows_transpositions.coeffRef(i) = internal::convert_index<PermutationIndex>(i);
         m_cols_transpositions.coeffRef(i) = internal::convert_index<PermutationIndex>(i);
         m_hCoeffs.coeffRef(i) = Scalar(0);
@@ -535,100 +508,92 @@
 
     m_rows_transpositions.coeffRef(k) = internal::convert_index<PermutationIndex>(row_of_biggest_in_corner);
     m_cols_transpositions.coeffRef(k) = internal::convert_index<PermutationIndex>(col_of_biggest_in_corner);
-    if(k != row_of_biggest_in_corner) {
-      m_qr.row(k).tail(cols-k).swap(m_qr.row(row_of_biggest_in_corner).tail(cols-k));
+    if (k != row_of_biggest_in_corner) {
+      m_qr.row(k).tail(cols - k).swap(m_qr.row(row_of_biggest_in_corner).tail(cols - k));
       ++number_of_transpositions;
     }
-    if(k != col_of_biggest_in_corner) {
+    if (k != col_of_biggest_in_corner) {
       m_qr.col(k).swap(m_qr.col(col_of_biggest_in_corner));
       ++number_of_transpositions;
     }
 
     RealScalar beta;
-    m_qr.col(k).tail(rows-k).makeHouseholderInPlace(m_hCoeffs.coeffRef(k), beta);
-    m_qr.coeffRef(k,k) = beta;
+    m_qr.col(k).tail(rows - k).makeHouseholderInPlace(m_hCoeffs.coeffRef(k), beta);
+    m_qr.coeffRef(k, k) = beta;
 
     // remember the maximum absolute value of diagonal coefficients
-    if(abs(beta) > m_maxpivot) m_maxpivot = abs(beta);
+    if (abs(beta) > m_maxpivot) m_maxpivot = abs(beta);
 
-    m_qr.bottomRightCorner(rows-k, cols-k-1)
-        .applyHouseholderOnTheLeft(m_qr.col(k).tail(rows-k-1), m_hCoeffs.coeffRef(k), &m_temp.coeffRef(k+1));
+    m_qr.bottomRightCorner(rows - k, cols - k - 1)
+        .applyHouseholderOnTheLeft(m_qr.col(k).tail(rows - k - 1), m_hCoeffs.coeffRef(k), &m_temp.coeffRef(k + 1));
   }
 
   m_cols_permutation.setIdentity(cols);
-  for(Index k = 0; k < size; ++k)
-    m_cols_permutation.applyTranspositionOnTheRight(k, m_cols_transpositions.coeff(k));
+  for (Index k = 0; k < size; ++k) m_cols_permutation.applyTranspositionOnTheRight(k, m_cols_transpositions.coeff(k));
 
-  m_det_p = (number_of_transpositions%2) ? -1 : 1;
+  m_det_p = (number_of_transpositions % 2) ? -1 : 1;
   m_isInitialized = true;
 }
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-template<typename MatrixType_, typename PermutationIndex_>
-template<typename RhsType, typename DstType>
-void FullPivHouseholderQR<MatrixType_, PermutationIndex_>::_solve_impl(const RhsType &rhs, DstType &dst) const
-{
+template <typename MatrixType_, typename PermutationIndex_>
+template <typename RhsType, typename DstType>
+void FullPivHouseholderQR<MatrixType_, PermutationIndex_>::_solve_impl(const RhsType& rhs, DstType& dst) const {
   const Index l_rank = rank();
 
   // FIXME introduce nonzeroPivots() and use it here. and more generally,
   // make the same improvements in this dec as in FullPivLU.
-  if(l_rank==0)
-  {
+  if (l_rank == 0) {
     dst.setZero();
     return;
   }
 
   typename RhsType::PlainObject c(rhs);
 
-  Matrix<typename RhsType::Scalar,1,RhsType::ColsAtCompileTime> temp(rhs.cols());
-  for (Index k = 0; k < l_rank; ++k)
-  {
-    Index remainingSize = rows()-k;
+  Matrix<typename RhsType::Scalar, 1, RhsType::ColsAtCompileTime> temp(rhs.cols());
+  for (Index k = 0; k < l_rank; ++k) {
+    Index remainingSize = rows() - k;
     c.row(k).swap(c.row(m_rows_transpositions.coeff(k)));
     c.bottomRightCorner(remainingSize, rhs.cols())
-      .applyHouseholderOnTheLeft(m_qr.col(k).tail(remainingSize-1),
-                               m_hCoeffs.coeff(k), &temp.coeffRef(0));
+        .applyHouseholderOnTheLeft(m_qr.col(k).tail(remainingSize - 1), m_hCoeffs.coeff(k), &temp.coeffRef(0));
   }
 
-  m_qr.topLeftCorner(l_rank, l_rank)
-      .template triangularView<Upper>()
-      .solveInPlace(c.topRows(l_rank));
+  m_qr.topLeftCorner(l_rank, l_rank).template triangularView<Upper>().solveInPlace(c.topRows(l_rank));
 
-  for(Index i = 0; i < l_rank; ++i) dst.row(m_cols_permutation.indices().coeff(i)) = c.row(i);
-  for(Index i = l_rank; i < cols(); ++i) dst.row(m_cols_permutation.indices().coeff(i)).setZero();
+  for (Index i = 0; i < l_rank; ++i) dst.row(m_cols_permutation.indices().coeff(i)) = c.row(i);
+  for (Index i = l_rank; i < cols(); ++i) dst.row(m_cols_permutation.indices().coeff(i)).setZero();
 }
 
-template<typename MatrixType_, typename PermutationIndex_>
-template<bool Conjugate, typename RhsType, typename DstType>
-void FullPivHouseholderQR<MatrixType_, PermutationIndex_>::_solve_impl_transposed(const RhsType &rhs, DstType &dst) const
-{
+template <typename MatrixType_, typename PermutationIndex_>
+template <bool Conjugate, typename RhsType, typename DstType>
+void FullPivHouseholderQR<MatrixType_, PermutationIndex_>::_solve_impl_transposed(const RhsType& rhs,
+                                                                                  DstType& dst) const {
   const Index l_rank = rank();
 
-  if(l_rank == 0)
-  {
+  if (l_rank == 0) {
     dst.setZero();
     return;
   }
 
-  typename RhsType::PlainObject c(m_cols_permutation.transpose()*rhs);
+  typename RhsType::PlainObject c(m_cols_permutation.transpose() * rhs);
 
   m_qr.topLeftCorner(l_rank, l_rank)
-         .template triangularView<Upper>()
-         .transpose().template conjugateIf<Conjugate>()
-         .solveInPlace(c.topRows(l_rank));
+      .template triangularView<Upper>()
+      .transpose()
+      .template conjugateIf<Conjugate>()
+      .solveInPlace(c.topRows(l_rank));
 
   dst.topRows(l_rank) = c.topRows(l_rank);
-  dst.bottomRows(rows()-l_rank).setZero();
+  dst.bottomRows(rows() - l_rank).setZero();
 
   Matrix<Scalar, 1, DstType::ColsAtCompileTime> temp(dst.cols());
   const Index size = (std::min)(rows(), cols());
-  for (Index k = size-1; k >= 0; --k)
-  {
-    Index remainingSize = rows()-k;
+  for (Index k = size - 1; k >= 0; --k) {
+    Index remainingSize = rows() - k;
 
     dst.bottomRightCorner(remainingSize, dst.cols())
-       .applyHouseholderOnTheLeft(m_qr.col(k).tail(remainingSize-1).template conjugateIf<!Conjugate>(),
-                                  m_hCoeffs.template conjugateIf<Conjugate>().coeff(k), &temp.coeffRef(0));
+        .applyHouseholderOnTheLeft(m_qr.col(k).tail(remainingSize - 1).template conjugateIf<!Conjugate>(),
+                                   m_hCoeffs.template conjugateIf<Conjugate>().coeff(k), &temp.coeffRef(0));
 
     dst.row(k).swap(dst.row(m_rows_transpositions.coeff(k)));
   }
@@ -636,52 +601,49 @@
 #endif
 
 namespace internal {
-  
-template<typename DstXprType, typename MatrixType, typename PermutationIndex>
-struct Assignment<DstXprType, Inverse<FullPivHouseholderQR<MatrixType, PermutationIndex> >, internal::assign_op<typename DstXprType::Scalar,typename FullPivHouseholderQR<MatrixType, PermutationIndex>::Scalar>, Dense2Dense>
-{
+
+template <typename DstXprType, typename MatrixType, typename PermutationIndex>
+struct Assignment<DstXprType, Inverse<FullPivHouseholderQR<MatrixType, PermutationIndex> >,
+                  internal::assign_op<typename DstXprType::Scalar,
+                                      typename FullPivHouseholderQR<MatrixType, PermutationIndex>::Scalar>,
+                  Dense2Dense> {
   typedef FullPivHouseholderQR<MatrixType, PermutationIndex> QrType;
   typedef Inverse<QrType> SrcXprType;
-  static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar,typename QrType::Scalar> &)
-  {    
+  static void run(DstXprType& dst, const SrcXprType& src,
+                  const internal::assign_op<typename DstXprType::Scalar, typename QrType::Scalar>&) {
     dst = src.nestedExpression().solve(MatrixType::Identity(src.rows(), src.cols()));
   }
 };
 
 /** \ingroup QR_Module
-  *
-  * \brief Expression type for return value of FullPivHouseholderQR::matrixQ()
-  *
-  * \tparam MatrixType type of underlying dense matrix
-  */
-template<typename MatrixType, typename PermutationIndex> struct FullPivHouseholderQRMatrixQReturnType
-  : public ReturnByValue<FullPivHouseholderQRMatrixQReturnType<MatrixType, PermutationIndex> >
-{
-public:
+ *
+ * \brief Expression type for return value of FullPivHouseholderQR::matrixQ()
+ *
+ * \tparam MatrixType type of underlying dense matrix
+ */
+template <typename MatrixType, typename PermutationIndex>
+struct FullPivHouseholderQRMatrixQReturnType
+    : public ReturnByValue<FullPivHouseholderQRMatrixQReturnType<MatrixType, PermutationIndex> > {
+ public:
   typedef typename FullPivHouseholderQR<MatrixType, PermutationIndex>::IntDiagSizeVectorType IntDiagSizeVectorType;
   typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
   typedef Matrix<typename MatrixType::Scalar, 1, MatrixType::RowsAtCompileTime, RowMajor, 1,
-                 MatrixType::MaxRowsAtCompileTime> WorkVectorType;
+                 MatrixType::MaxRowsAtCompileTime>
+      WorkVectorType;
 
-  FullPivHouseholderQRMatrixQReturnType(const MatrixType&       qr,
-                                        const HCoeffsType&      hCoeffs,
+  FullPivHouseholderQRMatrixQReturnType(const MatrixType& qr, const HCoeffsType& hCoeffs,
                                         const IntDiagSizeVectorType& rowsTranspositions)
-    : m_qr(qr),
-      m_hCoeffs(hCoeffs),
-      m_rowsTranspositions(rowsTranspositions)
-  {}
+      : m_qr(qr), m_hCoeffs(hCoeffs), m_rowsTranspositions(rowsTranspositions) {}
 
   template <typename ResultType>
-  void evalTo(ResultType& result) const
-  {
+  void evalTo(ResultType& result) const {
     const Index rows = m_qr.rows();
     WorkVectorType workspace(rows);
     evalTo(result, workspace);
   }
 
   template <typename ResultType>
-  void evalTo(ResultType& result, WorkVectorType& workspace) const
-  {
+  void evalTo(ResultType& result, WorkVectorType& workspace) const {
     using numext::conj;
     // compute the product H'_0 H'_1 ... H'_n-1,
     // where H_k is the k-th Householder transformation I - h_k v_k v_k'
@@ -691,10 +653,9 @@
     const Index size = (std::min)(rows, cols);
     workspace.resize(rows);
     result.setIdentity(rows, rows);
-    for (Index k = size-1; k >= 0; k--)
-    {
-      result.block(k, k, rows-k, rows-k)
-            .applyHouseholderOnTheLeft(m_qr.col(k).tail(rows-k-1), conj(m_hCoeffs.coeff(k)), &workspace.coeffRef(k));
+    for (Index k = size - 1; k >= 0; k--) {
+      result.block(k, k, rows - k, rows - k)
+          .applyHouseholderOnTheLeft(m_qr.col(k).tail(rows - k - 1), conj(m_hCoeffs.coeff(k)), &workspace.coeffRef(k));
       result.row(k).swap(result.row(m_rowsTranspositions.coeff(k)));
     }
   }
@@ -702,7 +663,7 @@
   Index rows() const { return m_qr.rows(); }
   Index cols() const { return m_qr.rows(); }
 
-protected:
+ protected:
   typename MatrixType::Nested m_qr;
   typename HCoeffsType::Nested m_hCoeffs;
   typename IntDiagSizeVectorType::Nested m_rowsTranspositions;
@@ -713,27 +674,26 @@
 //  : public evaluator<ReturnByValue<FullPivHouseholderQRMatrixQReturnType<MatrixType> > >
 // {};
 
-} // end namespace internal
+}  // end namespace internal
 
-template<typename MatrixType, typename PermutationIndex>
-inline typename FullPivHouseholderQR<MatrixType, PermutationIndex>::MatrixQReturnType FullPivHouseholderQR<MatrixType, PermutationIndex>::matrixQ() const
-{
+template <typename MatrixType, typename PermutationIndex>
+inline typename FullPivHouseholderQR<MatrixType, PermutationIndex>::MatrixQReturnType
+FullPivHouseholderQR<MatrixType, PermutationIndex>::matrixQ() const {
   eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
   return MatrixQReturnType(m_qr, m_hCoeffs, m_rows_transpositions);
 }
 
 /** \return the full-pivoting Householder QR decomposition of \c *this.
-  *
-  * \sa class FullPivHouseholderQR
-  */
-template<typename Derived>
-template<typename PermutationIndex>
+ *
+ * \sa class FullPivHouseholderQR
+ */
+template <typename Derived>
+template <typename PermutationIndex>
 const FullPivHouseholderQR<typename MatrixBase<Derived>::PlainObject, PermutationIndex>
-MatrixBase<Derived>::fullPivHouseholderQr() const
-{
+MatrixBase<Derived>::fullPivHouseholderQr() const {
   return FullPivHouseholderQR<PlainObject, PermutationIndex>(eval());
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_FULLPIVOTINGHOUSEHOLDERQR_H
+#endif  // EIGEN_FULLPIVOTINGHOUSEHOLDERQR_H
diff --git a/Eigen/src/QR/HouseholderQR.h b/Eigen/src/QR/HouseholderQR.h
index 68c69da..9e73672 100644
--- a/Eigen/src/QR/HouseholderQR.h
+++ b/Eigen/src/QR/HouseholderQR.h
@@ -15,293 +15,275 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
-template<typename MatrixType_> struct traits<HouseholderQR<MatrixType_> >
- : traits<MatrixType_>
-{
+template <typename MatrixType_>
+struct traits<HouseholderQR<MatrixType_>> : traits<MatrixType_> {
   typedef MatrixXpr XprKind;
   typedef SolverStorage StorageKind;
   typedef int StorageIndex;
   enum { Flags = 0 };
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \ingroup QR_Module
-  *
-  *
-  * \class HouseholderQR
-  *
-  * \brief Householder QR decomposition of a matrix
-  *
-  * \tparam MatrixType_ the type of the matrix of which we are computing the QR decomposition
-  *
-  * This class performs a QR decomposition of a matrix \b A into matrices \b Q and \b R
-  * such that 
-  * \f[
-  *  \mathbf{A} = \mathbf{Q} \, \mathbf{R}
-  * \f]
-  * by using Householder transformations. Here, \b Q a unitary matrix and \b R an upper triangular matrix.
-  * The result is stored in a compact way compatible with LAPACK.
-  *
-  * Note that no pivoting is performed. This is \b not a rank-revealing decomposition.
-  * If you want that feature, use FullPivHouseholderQR or ColPivHouseholderQR instead.
-  *
-  * This Householder QR decomposition is faster, but less numerically stable and less feature-full than
-  * FullPivHouseholderQR or ColPivHouseholderQR.
-  *
-  * This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism.
-  *
-  * \sa MatrixBase::householderQr()
-  */
-template<typename MatrixType_> class HouseholderQR
-        : public SolverBase<HouseholderQR<MatrixType_> >
-{
-  public:
+ *
+ *
+ * \class HouseholderQR
+ *
+ * \brief Householder QR decomposition of a matrix
+ *
+ * \tparam MatrixType_ the type of the matrix of which we are computing the QR decomposition
+ *
+ * This class performs a QR decomposition of a matrix \b A into matrices \b Q and \b R
+ * such that
+ * \f[
+ *  \mathbf{A} = \mathbf{Q} \, \mathbf{R}
+ * \f]
+ * by using Householder transformations. Here, \b Q a unitary matrix and \b R an upper triangular matrix.
+ * The result is stored in a compact way compatible with LAPACK.
+ *
+ * Note that no pivoting is performed. This is \b not a rank-revealing decomposition.
+ * If you want that feature, use FullPivHouseholderQR or ColPivHouseholderQR instead.
+ *
+ * This Householder QR decomposition is faster, but less numerically stable and less feature-full than
+ * FullPivHouseholderQR or ColPivHouseholderQR.
+ *
+ * This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism.
+ *
+ * \sa MatrixBase::householderQr()
+ */
+template <typename MatrixType_>
+class HouseholderQR : public SolverBase<HouseholderQR<MatrixType_>> {
+ public:
+  typedef MatrixType_ MatrixType;
+  typedef SolverBase<HouseholderQR> Base;
+  friend class SolverBase<HouseholderQR>;
 
-    typedef MatrixType_ MatrixType;
-    typedef SolverBase<HouseholderQR> Base;
-    friend class SolverBase<HouseholderQR>;
+  EIGEN_GENERIC_PUBLIC_INTERFACE(HouseholderQR)
+  enum {
+    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
+  };
+  typedef Matrix<Scalar, RowsAtCompileTime, RowsAtCompileTime, (MatrixType::Flags & RowMajorBit) ? RowMajor : ColMajor,
+                 MaxRowsAtCompileTime, MaxRowsAtCompileTime>
+      MatrixQType;
+  typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
+  typedef typename internal::plain_row_type<MatrixType>::type RowVectorType;
+  typedef HouseholderSequence<MatrixType, internal::remove_all_t<typename HCoeffsType::ConjugateReturnType>>
+      HouseholderSequenceType;
 
-    EIGEN_GENERIC_PUBLIC_INTERFACE(HouseholderQR)
-    enum {
-      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
-      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
-    };
-    typedef Matrix<Scalar, RowsAtCompileTime, RowsAtCompileTime, (MatrixType::Flags&RowMajorBit) ? RowMajor : ColMajor, MaxRowsAtCompileTime, MaxRowsAtCompileTime> MatrixQType;
-    typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
-    typedef typename internal::plain_row_type<MatrixType>::type RowVectorType;
-    typedef HouseholderSequence<MatrixType,internal::remove_all_t<typename HCoeffsType::ConjugateReturnType>> HouseholderSequenceType;
+  /**
+   * \brief Default Constructor.
+   *
+   * The default constructor is useful in cases in which the user intends to
+   * perform decompositions via HouseholderQR::compute(const MatrixType&).
+   */
+  HouseholderQR() : m_qr(), m_hCoeffs(), m_temp(), m_isInitialized(false) {}
 
-    /**
-      * \brief Default Constructor.
-      *
-      * The default constructor is useful in cases in which the user intends to
-      * perform decompositions via HouseholderQR::compute(const MatrixType&).
-      */
-    HouseholderQR() : m_qr(), m_hCoeffs(), m_temp(), m_isInitialized(false) {}
+  /** \brief Default Constructor with memory preallocation
+   *
+   * Like the default constructor but with preallocation of the internal data
+   * according to the specified problem \a size.
+   * \sa HouseholderQR()
+   */
+  HouseholderQR(Index rows, Index cols)
+      : m_qr(rows, cols), m_hCoeffs((std::min)(rows, cols)), m_temp(cols), m_isInitialized(false) {}
 
-    /** \brief Default Constructor with memory preallocation
-      *
-      * Like the default constructor but with preallocation of the internal data
-      * according to the specified problem \a size.
-      * \sa HouseholderQR()
-      */
-    HouseholderQR(Index rows, Index cols)
-      : m_qr(rows, cols),
-        m_hCoeffs((std::min)(rows,cols)),
-        m_temp(cols),
-        m_isInitialized(false) {}
-
-    /** \brief Constructs a QR factorization from a given matrix
-      *
-      * This constructor computes the QR factorization of the matrix \a matrix by calling
-      * the method compute(). It is a short cut for:
-      * 
-      * \code
-      * HouseholderQR<MatrixType> qr(matrix.rows(), matrix.cols());
-      * qr.compute(matrix);
-      * \endcode
-      * 
-      * \sa compute()
-      */
-    template<typename InputType>
-    explicit HouseholderQR(const EigenBase<InputType>& matrix)
+  /** \brief Constructs a QR factorization from a given matrix
+   *
+   * This constructor computes the QR factorization of the matrix \a matrix by calling
+   * the method compute(). It is a short cut for:
+   *
+   * \code
+   * HouseholderQR<MatrixType> qr(matrix.rows(), matrix.cols());
+   * qr.compute(matrix);
+   * \endcode
+   *
+   * \sa compute()
+   */
+  template <typename InputType>
+  explicit HouseholderQR(const EigenBase<InputType>& matrix)
       : m_qr(matrix.rows(), matrix.cols()),
-        m_hCoeffs((std::min)(matrix.rows(),matrix.cols())),
+        m_hCoeffs((std::min)(matrix.rows(), matrix.cols())),
         m_temp(matrix.cols()),
-        m_isInitialized(false)
-    {
-      compute(matrix.derived());
-    }
+        m_isInitialized(false) {
+    compute(matrix.derived());
+  }
 
-
-    /** \brief Constructs a QR factorization from a given matrix
-      *
-      * This overloaded constructor is provided for \link InplaceDecomposition inplace decomposition \endlink when
-      * \c MatrixType is a Eigen::Ref.
-      *
-      * \sa HouseholderQR(const EigenBase&)
-      */
-    template<typename InputType>
-    explicit HouseholderQR(EigenBase<InputType>& matrix)
+  /** \brief Constructs a QR factorization from a given matrix
+   *
+   * This overloaded constructor is provided for \link InplaceDecomposition inplace decomposition \endlink when
+   * \c MatrixType is a Eigen::Ref.
+   *
+   * \sa HouseholderQR(const EigenBase&)
+   */
+  template <typename InputType>
+  explicit HouseholderQR(EigenBase<InputType>& matrix)
       : m_qr(matrix.derived()),
-        m_hCoeffs((std::min)(matrix.rows(),matrix.cols())),
+        m_hCoeffs((std::min)(matrix.rows(), matrix.cols())),
         m_temp(matrix.cols()),
-        m_isInitialized(false)
-    {
-      computeInPlace();
-    }
+        m_isInitialized(false) {
+    computeInPlace();
+  }
 
-    #ifdef EIGEN_PARSED_BY_DOXYGEN
-    /** This method finds a solution x to the equation Ax=b, where A is the matrix of which
-      * *this is the QR decomposition, if any exists.
-      *
-      * \param b the right-hand-side of the equation to solve.
-      *
-      * \returns a solution.
-      *
-      * \note_about_checking_solutions
-      *
-      * \note_about_arbitrary_choice_of_solution
-      *
-      * Example: \include HouseholderQR_solve.cpp
-      * Output: \verbinclude HouseholderQR_solve.out
-      */
-    template<typename Rhs>
-    inline const Solve<HouseholderQR, Rhs>
-    solve(const MatrixBase<Rhs>& b) const;
-    #endif
+#ifdef EIGEN_PARSED_BY_DOXYGEN
+  /** This method finds a solution x to the equation Ax=b, where A is the matrix of which
+   * *this is the QR decomposition, if any exists.
+   *
+   * \param b the right-hand-side of the equation to solve.
+   *
+   * \returns a solution.
+   *
+   * \note_about_checking_solutions
+   *
+   * \note_about_arbitrary_choice_of_solution
+   *
+   * Example: \include HouseholderQR_solve.cpp
+   * Output: \verbinclude HouseholderQR_solve.out
+   */
+  template <typename Rhs>
+  inline const Solve<HouseholderQR, Rhs> solve(const MatrixBase<Rhs>& b) const;
+#endif
 
-    /** This method returns an expression of the unitary matrix Q as a sequence of Householder transformations.
-      *
-      * The returned expression can directly be used to perform matrix products. It can also be assigned to a dense Matrix object.
-      * Here is an example showing how to recover the full or thin matrix Q, as well as how to perform matrix products using operator*:
-      *
-      * Example: \include HouseholderQR_householderQ.cpp
-      * Output: \verbinclude HouseholderQR_householderQ.out
-      */
-    HouseholderSequenceType householderQ() const
-    {
-      eigen_assert(m_isInitialized && "HouseholderQR is not initialized.");
-      return HouseholderSequenceType(m_qr, m_hCoeffs.conjugate());
-    }
+  /** This method returns an expression of the unitary matrix Q as a sequence of Householder transformations.
+   *
+   * The returned expression can directly be used to perform matrix products. It can also be assigned to a dense Matrix
+   * object. Here is an example showing how to recover the full or thin matrix Q, as well as how to perform matrix
+   * products using operator*:
+   *
+   * Example: \include HouseholderQR_householderQ.cpp
+   * Output: \verbinclude HouseholderQR_householderQ.out
+   */
+  HouseholderSequenceType householderQ() const {
+    eigen_assert(m_isInitialized && "HouseholderQR is not initialized.");
+    return HouseholderSequenceType(m_qr, m_hCoeffs.conjugate());
+  }
 
-    /** \returns a reference to the matrix where the Householder QR decomposition is stored
-      * in a LAPACK-compatible way.
-      */
-    const MatrixType& matrixQR() const
-    {
-        eigen_assert(m_isInitialized && "HouseholderQR is not initialized.");
-        return m_qr;
-    }
+  /** \returns a reference to the matrix where the Householder QR decomposition is stored
+   * in a LAPACK-compatible way.
+   */
+  const MatrixType& matrixQR() const {
+    eigen_assert(m_isInitialized && "HouseholderQR is not initialized.");
+    return m_qr;
+  }
 
-    template<typename InputType>
-    HouseholderQR& compute(const EigenBase<InputType>& matrix) {
-      m_qr = matrix.derived();
-      computeInPlace();
-      return *this;
-    }
+  template <typename InputType>
+  HouseholderQR& compute(const EigenBase<InputType>& matrix) {
+    m_qr = matrix.derived();
+    computeInPlace();
+    return *this;
+  }
 
-    /** \returns the determinant of the matrix of which
-      * *this is the QR decomposition. It has only linear complexity
-      * (that is, O(n) where n is the dimension of the square matrix)
-      * as the QR decomposition has already been computed.
-      *
-      * \note This is only for square matrices.
-      *
-      * \warning a determinant can be very big or small, so for matrices
-      * of large enough dimension, there is a risk of overflow/underflow.
-      * One way to work around that is to use logAbsDeterminant() instead.
-      *
-      * \sa absDeterminant(), logAbsDeterminant(), MatrixBase::determinant()
-      */
-    typename MatrixType::Scalar determinant() const;
+  /** \returns the determinant of the matrix of which
+   * *this is the QR decomposition. It has only linear complexity
+   * (that is, O(n) where n is the dimension of the square matrix)
+   * as the QR decomposition has already been computed.
+   *
+   * \note This is only for square matrices.
+   *
+   * \warning a determinant can be very big or small, so for matrices
+   * of large enough dimension, there is a risk of overflow/underflow.
+   * One way to work around that is to use logAbsDeterminant() instead.
+   *
+   * \sa absDeterminant(), logAbsDeterminant(), MatrixBase::determinant()
+   */
+  typename MatrixType::Scalar determinant() const;
 
-    /** \returns the absolute value of the determinant of the matrix of which
-      * *this is the QR decomposition. It has only linear complexity
-      * (that is, O(n) where n is the dimension of the square matrix)
-      * as the QR decomposition has already been computed.
-      *
-      * \note This is only for square matrices.
-      *
-      * \warning a determinant can be very big or small, so for matrices
-      * of large enough dimension, there is a risk of overflow/underflow.
-      * One way to work around that is to use logAbsDeterminant() instead.
-      *
-      * \sa determinant(), logAbsDeterminant(), MatrixBase::determinant()
-      */
-    typename MatrixType::RealScalar absDeterminant() const;
+  /** \returns the absolute value of the determinant of the matrix of which
+   * *this is the QR decomposition. It has only linear complexity
+   * (that is, O(n) where n is the dimension of the square matrix)
+   * as the QR decomposition has already been computed.
+   *
+   * \note This is only for square matrices.
+   *
+   * \warning a determinant can be very big or small, so for matrices
+   * of large enough dimension, there is a risk of overflow/underflow.
+   * One way to work around that is to use logAbsDeterminant() instead.
+   *
+   * \sa determinant(), logAbsDeterminant(), MatrixBase::determinant()
+   */
+  typename MatrixType::RealScalar absDeterminant() const;
 
-    /** \returns the natural log of the absolute value of the determinant of the matrix of which
-      * *this is the QR decomposition. It has only linear complexity
-      * (that is, O(n) where n is the dimension of the square matrix)
-      * as the QR decomposition has already been computed.
-      *
-      * \note This is only for square matrices.
-      *
-      * \note This method is useful to work around the risk of overflow/underflow that's inherent
-      * to determinant computation.
-      *
-      * \sa determinant(), absDeterminant(), MatrixBase::determinant()
-      */
-    typename MatrixType::RealScalar logAbsDeterminant() const;
+  /** \returns the natural log of the absolute value of the determinant of the matrix of which
+   * *this is the QR decomposition. It has only linear complexity
+   * (that is, O(n) where n is the dimension of the square matrix)
+   * as the QR decomposition has already been computed.
+   *
+   * \note This is only for square matrices.
+   *
+   * \note This method is useful to work around the risk of overflow/underflow that's inherent
+   * to determinant computation.
+   *
+   * \sa determinant(), absDeterminant(), MatrixBase::determinant()
+   */
+  typename MatrixType::RealScalar logAbsDeterminant() const;
 
-    inline Index rows() const { return m_qr.rows(); }
-    inline Index cols() const { return m_qr.cols(); }
+  inline Index rows() const { return m_qr.rows(); }
+  inline Index cols() const { return m_qr.cols(); }
 
-    /** \returns a const reference to the vector of Householder coefficients used to represent the factor \c Q.
-      * 
-      * For advanced uses only.
-      */
-    const HCoeffsType& hCoeffs() const { return m_hCoeffs; }
+  /** \returns a const reference to the vector of Householder coefficients used to represent the factor \c Q.
+   *
+   * For advanced uses only.
+   */
+  const HCoeffsType& hCoeffs() const { return m_hCoeffs; }
 
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    template<typename RhsType, typename DstType>
-    void _solve_impl(const RhsType &rhs, DstType &dst) const;
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  template <typename RhsType, typename DstType>
+  void _solve_impl(const RhsType& rhs, DstType& dst) const;
 
-    template<bool Conjugate, typename RhsType, typename DstType>
-    void _solve_impl_transposed(const RhsType &rhs, DstType &dst) const;
-    #endif
+  template <bool Conjugate, typename RhsType, typename DstType>
+  void _solve_impl_transposed(const RhsType& rhs, DstType& dst) const;
+#endif
 
-  protected:
+ protected:
+  EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
 
-    EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
+  void computeInPlace();
 
-    void computeInPlace();
-
-    MatrixType m_qr;
-    HCoeffsType m_hCoeffs;
-    RowVectorType m_temp;
-    bool m_isInitialized;
+  MatrixType m_qr;
+  HCoeffsType m_hCoeffs;
+  RowVectorType m_temp;
+  bool m_isInitialized;
 };
 
 namespace internal {
 
 /** \internal */
-template<typename HCoeffs, typename Scalar, bool IsComplex>
-struct householder_determinant
-{
-  static void run(const HCoeffs& hCoeffs, Scalar& out_det)
-  {
+template <typename HCoeffs, typename Scalar, bool IsComplex>
+struct householder_determinant {
+  static void run(const HCoeffs& hCoeffs, Scalar& out_det) {
     out_det = Scalar(1);
     Index size = hCoeffs.rows();
-    for (Index i = 0; i < size; i ++)
-    {
+    for (Index i = 0; i < size; i++) {
       // For each valid reflection Q_n,
       // det(Q_n) = - conj(h_n) / h_n
       // where h_n is the Householder coefficient.
-      if (hCoeffs(i) != Scalar(0))
-        out_det *= - numext::conj(hCoeffs(i)) / hCoeffs(i);
+      if (hCoeffs(i) != Scalar(0)) out_det *= -numext::conj(hCoeffs(i)) / hCoeffs(i);
     }
   }
 };
 
 /** \internal */
-template<typename HCoeffs, typename Scalar>
-struct householder_determinant<HCoeffs, Scalar, false>
-{
-  static void run(const HCoeffs& hCoeffs, Scalar& out_det)
-  {
+template <typename HCoeffs, typename Scalar>
+struct householder_determinant<HCoeffs, Scalar, false> {
+  static void run(const HCoeffs& hCoeffs, Scalar& out_det) {
     bool negated = false;
     Index size = hCoeffs.rows();
-    for (Index i = 0; i < size; i ++)
-    {
+    for (Index i = 0; i < size; i++) {
       // Each valid reflection negates the determinant.
-      if (hCoeffs(i) != Scalar(0))
-        negated ^= true;
+      if (hCoeffs(i) != Scalar(0)) negated ^= true;
     }
     out_det = negated ? Scalar(-1) : Scalar(1);
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-template<typename MatrixType>
-typename MatrixType::Scalar HouseholderQR<MatrixType>::determinant() const
-{
+template <typename MatrixType>
+typename MatrixType::Scalar HouseholderQR<MatrixType>::determinant() const {
   eigen_assert(m_isInitialized && "HouseholderQR is not initialized.");
   eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
   Scalar detQ;
@@ -309,18 +291,16 @@
   return m_qr.diagonal().prod() * detQ;
 }
 
-template<typename MatrixType>
-typename MatrixType::RealScalar HouseholderQR<MatrixType>::absDeterminant() const
-{
+template <typename MatrixType>
+typename MatrixType::RealScalar HouseholderQR<MatrixType>::absDeterminant() const {
   using std::abs;
   eigen_assert(m_isInitialized && "HouseholderQR is not initialized.");
   eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
   return abs(m_qr.diagonal().prod());
 }
 
-template<typename MatrixType>
-typename MatrixType::RealScalar HouseholderQR<MatrixType>::logAbsDeterminant() const
-{
+template <typename MatrixType>
+typename MatrixType::RealScalar HouseholderQR<MatrixType>::logAbsDeterminant() const {
   eigen_assert(m_isInitialized && "HouseholderQR is not initialized.");
   eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
   return m_qr.diagonal().cwiseAbs().array().log().sum();
@@ -329,37 +309,34 @@
 namespace internal {
 
 /** \internal */
-template<typename MatrixQR, typename HCoeffs>
-void householder_qr_inplace_unblocked(MatrixQR& mat, HCoeffs& hCoeffs, typename MatrixQR::Scalar* tempData = 0)
-{
+template <typename MatrixQR, typename HCoeffs>
+void householder_qr_inplace_unblocked(MatrixQR& mat, HCoeffs& hCoeffs, typename MatrixQR::Scalar* tempData = 0) {
   typedef typename MatrixQR::Scalar Scalar;
   typedef typename MatrixQR::RealScalar RealScalar;
   Index rows = mat.rows();
   Index cols = mat.cols();
-  Index size = (std::min)(rows,cols);
+  Index size = (std::min)(rows, cols);
 
   eigen_assert(hCoeffs.size() == size);
 
-  typedef Matrix<Scalar,MatrixQR::ColsAtCompileTime,1> TempType;
+  typedef Matrix<Scalar, MatrixQR::ColsAtCompileTime, 1> TempType;
   TempType tempVector;
-  if(tempData==0)
-  {
+  if (tempData == 0) {
     tempVector.resize(cols);
     tempData = tempVector.data();
   }
 
-  for(Index k = 0; k < size; ++k)
-  {
+  for (Index k = 0; k < size; ++k) {
     Index remainingRows = rows - k;
     Index remainingCols = cols - k - 1;
 
     RealScalar beta;
     mat.col(k).tail(remainingRows).makeHouseholderInPlace(hCoeffs.coeffRef(k), beta);
-    mat.coeffRef(k,k) = beta;
+    mat.coeffRef(k, k) = beta;
 
     // apply H to remaining part of m_qr from the left
     mat.bottomRightCorner(remainingRows, remainingCols)
-        .applyHouseholderOnTheLeft(mat.col(k).tail(remainingRows-1), hCoeffs.coeffRef(k), tempData+k+1);
+        .applyHouseholderOnTheLeft(mat.col(k).tail(remainingRows - 1), hCoeffs.coeffRef(k), tempData + k + 1);
   }
 }
 
@@ -401,38 +378,32 @@
 }
 
 /** \internal */
-template<typename MatrixQR, typename HCoeffs,
-  typename MatrixQRScalar = typename MatrixQR::Scalar,
-  bool InnerStrideIsOne = (MatrixQR::InnerStrideAtCompileTime == 1 && HCoeffs::InnerStrideAtCompileTime == 1)>
-struct householder_qr_inplace_blocked
-{
+template <typename MatrixQR, typename HCoeffs, typename MatrixQRScalar = typename MatrixQR::Scalar,
+          bool InnerStrideIsOne = (MatrixQR::InnerStrideAtCompileTime == 1 && HCoeffs::InnerStrideAtCompileTime == 1)>
+struct householder_qr_inplace_blocked {
   // This is specialized for LAPACK-supported Scalar types in HouseholderQR_LAPACKE.h
-  static void run(MatrixQR& mat, HCoeffs& hCoeffs, Index maxBlockSize=32,
-      typename MatrixQR::Scalar* tempData = 0)
-  {
+  static void run(MatrixQR& mat, HCoeffs& hCoeffs, Index maxBlockSize = 32, typename MatrixQR::Scalar* tempData = 0) {
     typedef typename MatrixQR::Scalar Scalar;
-    typedef Block<MatrixQR,Dynamic,Dynamic> BlockType;
+    typedef Block<MatrixQR, Dynamic, Dynamic> BlockType;
 
     Index rows = mat.rows();
     Index cols = mat.cols();
     Index size = (std::min)(rows, cols);
 
-    typedef Matrix<Scalar,Dynamic,1,ColMajor,MatrixQR::MaxColsAtCompileTime,1> TempType;
+    typedef Matrix<Scalar, Dynamic, 1, ColMajor, MatrixQR::MaxColsAtCompileTime, 1> TempType;
     TempType tempVector;
-    if(tempData==0)
-    {
+    if (tempData == 0) {
       tempVector.resize(cols);
       tempData = tempVector.data();
     }
 
-    Index blockSize = (std::min)(maxBlockSize,size);
+    Index blockSize = (std::min)(maxBlockSize, size);
 
     Index k = 0;
-    for (k = 0; k < size; k += blockSize)
-    {
-      Index bs = (std::min)(size-k,blockSize);  // actual size of the block
-      Index tcols = cols - k - bs;              // trailing columns
-      Index brows = rows-k;                     // rows of the block
+    for (k = 0; k < size; k += blockSize) {
+      Index bs = (std::min)(size - k, blockSize);  // actual size of the block
+      Index tcols = cols - k - bs;                 // trailing columns
+      Index brows = rows - k;                      // rows of the block
 
       // partition the matrix:
       //        A00 | A01 | A02
@@ -442,73 +413,68 @@
       // and update [A21^T A22^T]^T using level 3 operations.
       // Finally, the algorithm continue on A22
 
-      BlockType A11_21 = mat.block(k,k,brows,bs);
-      Block<HCoeffs,Dynamic,1> hCoeffsSegment = hCoeffs.segment(k,bs);
+      BlockType A11_21 = mat.block(k, k, brows, bs);
+      Block<HCoeffs, Dynamic, 1> hCoeffsSegment = hCoeffs.segment(k, bs);
 
       householder_qr_inplace_unblocked(A11_21, hCoeffsSegment, tempData);
 
-      if(tcols)
-      {
-        BlockType A21_22 = mat.block(k,k+bs,brows,tcols);
-        apply_block_householder_on_the_left(A21_22,A11_21,hCoeffsSegment, false); // false == backward
+      if (tcols) {
+        BlockType A21_22 = mat.block(k, k + bs, brows, tcols);
+        apply_block_householder_on_the_left(A21_22, A11_21, hCoeffsSegment, false);  // false == backward
       }
     }
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-template<typename MatrixType_>
-template<typename RhsType, typename DstType>
-void HouseholderQR<MatrixType_>::_solve_impl(const RhsType &rhs, DstType &dst) const
-{
+template <typename MatrixType_>
+template <typename RhsType, typename DstType>
+void HouseholderQR<MatrixType_>::_solve_impl(const RhsType& rhs, DstType& dst) const {
   const Index rank = (std::min)(rows(), cols());
 
   typename RhsType::PlainObject c(rhs);
 
-  c.applyOnTheLeft(householderQ().setLength(rank).adjoint() );
+  c.applyOnTheLeft(householderQ().setLength(rank).adjoint());
 
-  m_qr.topLeftCorner(rank, rank)
-      .template triangularView<Upper>()
-      .solveInPlace(c.topRows(rank));
+  m_qr.topLeftCorner(rank, rank).template triangularView<Upper>().solveInPlace(c.topRows(rank));
 
   dst.topRows(rank) = c.topRows(rank);
-  dst.bottomRows(cols()-rank).setZero();
+  dst.bottomRows(cols() - rank).setZero();
 }
 
-template<typename MatrixType_>
-template<bool Conjugate, typename RhsType, typename DstType>
-void HouseholderQR<MatrixType_>::_solve_impl_transposed(const RhsType &rhs, DstType &dst) const
-{
+template <typename MatrixType_>
+template <bool Conjugate, typename RhsType, typename DstType>
+void HouseholderQR<MatrixType_>::_solve_impl_transposed(const RhsType& rhs, DstType& dst) const {
   const Index rank = (std::min)(rows(), cols());
 
   typename RhsType::PlainObject c(rhs);
 
   m_qr.topLeftCorner(rank, rank)
       .template triangularView<Upper>()
-      .transpose().template conjugateIf<Conjugate>()
+      .transpose()
+      .template conjugateIf<Conjugate>()
       .solveInPlace(c.topRows(rank));
 
   dst.topRows(rank) = c.topRows(rank);
-  dst.bottomRows(rows()-rank).setZero();
+  dst.bottomRows(rows() - rank).setZero();
 
-  dst.applyOnTheLeft(householderQ().setLength(rank).template conjugateIf<!Conjugate>() );
+  dst.applyOnTheLeft(householderQ().setLength(rank).template conjugateIf<!Conjugate>());
 }
 #endif
 
 /** Performs the QR factorization of the given matrix \a matrix. The result of
-  * the factorization is stored into \c *this, and a reference to \c *this
-  * is returned.
-  *
-  * \sa class HouseholderQR, HouseholderQR(const MatrixType&)
-  */
-template<typename MatrixType>
-void HouseholderQR<MatrixType>::computeInPlace()
-{
+ * the factorization is stored into \c *this, and a reference to \c *this
+ * is returned.
+ *
+ * \sa class HouseholderQR, HouseholderQR(const MatrixType&)
+ */
+template <typename MatrixType>
+void HouseholderQR<MatrixType>::computeInPlace() {
   Index rows = m_qr.rows();
   Index cols = m_qr.cols();
-  Index size = (std::min)(rows,cols);
+  Index size = (std::min)(rows, cols);
 
   m_hCoeffs.resize(size);
 
@@ -520,16 +486,14 @@
 }
 
 /** \return the Householder QR decomposition of \c *this.
-  *
-  * \sa class HouseholderQR
-  */
-template<typename Derived>
-const HouseholderQR<typename MatrixBase<Derived>::PlainObject>
-MatrixBase<Derived>::householderQr() const
-{
+ *
+ * \sa class HouseholderQR
+ */
+template <typename Derived>
+const HouseholderQR<typename MatrixBase<Derived>::PlainObject> MatrixBase<Derived>::householderQr() const {
   return HouseholderQR<PlainObject>(eval());
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_QR_H
+#endif  // EIGEN_QR_H
diff --git a/Eigen/src/QR/HouseholderQR_LAPACKE.h b/Eigen/src/QR/HouseholderQR_LAPACKE.h
index 0bd6a2b..3b62175 100644
--- a/Eigen/src/QR/HouseholderQR_LAPACKE.h
+++ b/Eigen/src/QR/HouseholderQR_LAPACKE.h
@@ -37,17 +37,15 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
 namespace lapacke_helpers {
 
-template<typename MatrixQR, typename HCoeffs>
-struct lapacke_hqr
-{
-  static void run(MatrixQR& mat, HCoeffs& hCoeffs, Index = 32, typename MatrixQR::Scalar* = 0)
-  {
+template <typename MatrixQR, typename HCoeffs>
+struct lapacke_hqr {
+  static void run(MatrixQR& mat, HCoeffs& hCoeffs, Index = 32, typename MatrixQR::Scalar* = 0) {
     lapack_int m = to_lapack(mat.rows());
     lapack_int n = to_lapack(mat.cols());
     lapack_int lda = to_lapack(mat.outerStride());
@@ -57,12 +55,13 @@
   }
 };
 
-}
+}  // namespace lapacke_helpers
 
 /** \internal Specialization for the data types supported by LAPACKe */
-#define EIGEN_LAPACKE_HH_QR(EIGTYPE) \
-template<typename MatrixQR, typename HCoeffs> \
-struct householder_qr_inplace_blocked<MatrixQR, HCoeffs, EIGTYPE, true> : public lapacke_helpers::lapacke_hqr<MatrixQR, HCoeffs> {};
+#define EIGEN_LAPACKE_HH_QR(EIGTYPE)                                      \
+  template <typename MatrixQR, typename HCoeffs>                          \
+  struct householder_qr_inplace_blocked<MatrixQR, HCoeffs, EIGTYPE, true> \
+      : public lapacke_helpers::lapacke_hqr<MatrixQR, HCoeffs> {};
 
 EIGEN_LAPACKE_HH_QR(double)
 EIGEN_LAPACKE_HH_QR(float)
@@ -71,8 +70,8 @@
 
 #undef EIGEN_LAPACKE_HH_QR
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_QR_LAPACKE_H
+#endif  // EIGEN_QR_LAPACKE_H
diff --git a/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h b/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h
index 7256393..1eb07f7 100644
--- a/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h
+++ b/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h
@@ -15,324 +15,301 @@
 #include "./InternalHeaderCheck.h"
 
 namespace Eigen {
-  
-  template<typename MatrixType> class SPQR; 
-  template<typename SPQRType> struct SPQRMatrixQReturnType; 
-  template<typename SPQRType> struct SPQRMatrixQTransposeReturnType; 
-  template <typename SPQRType, typename Derived> struct SPQR_QProduct;
-  namespace internal {
-    template <typename SPQRType> struct traits<SPQRMatrixQReturnType<SPQRType> >
-    {
-      typedef typename SPQRType::MatrixType ReturnType;
-    };
-    template <typename SPQRType> struct traits<SPQRMatrixQTransposeReturnType<SPQRType> >
-    {
-      typedef typename SPQRType::MatrixType ReturnType;
-    };
-    template <typename SPQRType, typename Derived> struct traits<SPQR_QProduct<SPQRType, Derived> >
-    {
-      typedef typename Derived::PlainObject ReturnType;
-    };
-  } // End namespace internal
-  
+
+template <typename MatrixType>
+class SPQR;
+template <typename SPQRType>
+struct SPQRMatrixQReturnType;
+template <typename SPQRType>
+struct SPQRMatrixQTransposeReturnType;
+template <typename SPQRType, typename Derived>
+struct SPQR_QProduct;
+namespace internal {
+template <typename SPQRType>
+struct traits<SPQRMatrixQReturnType<SPQRType> > {
+  typedef typename SPQRType::MatrixType ReturnType;
+};
+template <typename SPQRType>
+struct traits<SPQRMatrixQTransposeReturnType<SPQRType> > {
+  typedef typename SPQRType::MatrixType ReturnType;
+};
+template <typename SPQRType, typename Derived>
+struct traits<SPQR_QProduct<SPQRType, Derived> > {
+  typedef typename Derived::PlainObject ReturnType;
+};
+}  // End namespace internal
+
 /**
-  * \ingroup SPQRSupport_Module
-  * \class SPQR
-  * \brief Sparse QR factorization based on SuiteSparseQR library
-  *
-  * This class is used to perform a multithreaded and multifrontal rank-revealing QR decomposition
-  * of sparse matrices. The result is then used to solve linear leasts_square systems.
-  * Clearly, a QR factorization is returned such that A*P = Q*R where :
-  *
-  * P is the column permutation. Use colsPermutation() to get it.
-  *
-  * Q is the orthogonal matrix represented as Householder reflectors.
-  * Use matrixQ() to get an expression and matrixQ().transpose() to get the transpose.
-  * You can then apply it to a vector.
-  *
-  * R is the sparse triangular factor. Use matrixQR() to get it as SparseMatrix.
-  * NOTE : The Index type of R is always SuiteSparse_long. You can get it with SPQR::Index
-  *
-  * \tparam MatrixType_ The type of the sparse matrix A, must be a column-major SparseMatrix<>
-  *
-  * \implsparsesolverconcept
-  *
-  *
-  */
-template<typename MatrixType_>
-class SPQR : public SparseSolverBase<SPQR<MatrixType_> >
-{
-  protected:
-    typedef SparseSolverBase<SPQR<MatrixType_> > Base;
-    using Base::m_isInitialized;
-  public:
-    typedef typename MatrixType_::Scalar Scalar;
-    typedef typename MatrixType_::RealScalar RealScalar;
-    typedef SuiteSparse_long StorageIndex ;
-    typedef SparseMatrix<Scalar, ColMajor, StorageIndex> MatrixType;
-    typedef Map<PermutationMatrix<Dynamic, Dynamic, StorageIndex> > PermutationType;
-    enum {
-      ColsAtCompileTime = Dynamic,
-      MaxColsAtCompileTime = Dynamic
-    };
-  public:
-    SPQR() 
+ * \ingroup SPQRSupport_Module
+ * \class SPQR
+ * \brief Sparse QR factorization based on SuiteSparseQR library
+ *
+ * This class is used to perform a multithreaded and multifrontal rank-revealing QR decomposition
+ * of sparse matrices. The result is then used to solve linear leasts_square systems.
+ * Clearly, a QR factorization is returned such that A*P = Q*R where :
+ *
+ * P is the column permutation. Use colsPermutation() to get it.
+ *
+ * Q is the orthogonal matrix represented as Householder reflectors.
+ * Use matrixQ() to get an expression and matrixQ().transpose() to get the transpose.
+ * You can then apply it to a vector.
+ *
+ * R is the sparse triangular factor. Use matrixQR() to get it as SparseMatrix.
+ * NOTE : The Index type of R is always SuiteSparse_long. You can get it with SPQR::Index
+ *
+ * \tparam MatrixType_ The type of the sparse matrix A, must be a column-major SparseMatrix<>
+ *
+ * \implsparsesolverconcept
+ *
+ *
+ */
+template <typename MatrixType_>
+class SPQR : public SparseSolverBase<SPQR<MatrixType_> > {
+ protected:
+  typedef SparseSolverBase<SPQR<MatrixType_> > Base;
+  using Base::m_isInitialized;
+
+ public:
+  typedef typename MatrixType_::Scalar Scalar;
+  typedef typename MatrixType_::RealScalar RealScalar;
+  typedef SuiteSparse_long StorageIndex;
+  typedef SparseMatrix<Scalar, ColMajor, StorageIndex> MatrixType;
+  typedef Map<PermutationMatrix<Dynamic, Dynamic, StorageIndex> > PermutationType;
+  enum { ColsAtCompileTime = Dynamic, MaxColsAtCompileTime = Dynamic };
+
+ public:
+  SPQR()
       : m_analysisIsOk(false),
         m_factorizationIsOk(false),
         m_isRUpToDate(false),
         m_ordering(SPQR_ORDERING_DEFAULT),
         m_allow_tol(SPQR_DEFAULT_TOL),
-        m_tolerance (NumTraits<Scalar>::epsilon()),
+        m_tolerance(NumTraits<Scalar>::epsilon()),
         m_cR(0),
         m_E(0),
         m_H(0),
         m_HPinv(0),
         m_HTau(0),
-        m_useDefaultThreshold(true)
-    { 
-      cholmod_l_start(&m_cc);
-    }
-    
-    explicit SPQR(const MatrixType_& matrix)
+        m_useDefaultThreshold(true) {
+    cholmod_l_start(&m_cc);
+  }
+
+  explicit SPQR(const MatrixType_& matrix)
       : m_analysisIsOk(false),
         m_factorizationIsOk(false),
         m_isRUpToDate(false),
         m_ordering(SPQR_ORDERING_DEFAULT),
         m_allow_tol(SPQR_DEFAULT_TOL),
-        m_tolerance (NumTraits<Scalar>::epsilon()),
+        m_tolerance(NumTraits<Scalar>::epsilon()),
         m_cR(0),
         m_E(0),
         m_H(0),
         m_HPinv(0),
         m_HTau(0),
-        m_useDefaultThreshold(true)
-    {
-      cholmod_l_start(&m_cc);
-      compute(matrix);
-    }
-    
-    ~SPQR()
-    {
-      SPQR_free();
-      cholmod_l_finish(&m_cc);
-    }
-    void SPQR_free()
-    {
-      cholmod_l_free_sparse(&m_H, &m_cc);
-      cholmod_l_free_sparse(&m_cR, &m_cc);
-      cholmod_l_free_dense(&m_HTau, &m_cc);
-      std::free(m_E);
-      std::free(m_HPinv);
-    }
+        m_useDefaultThreshold(true) {
+    cholmod_l_start(&m_cc);
+    compute(matrix);
+  }
 
-    void compute(const MatrixType_& matrix)
-    {
-      if(m_isInitialized) SPQR_free();
+  ~SPQR() {
+    SPQR_free();
+    cholmod_l_finish(&m_cc);
+  }
+  void SPQR_free() {
+    cholmod_l_free_sparse(&m_H, &m_cc);
+    cholmod_l_free_sparse(&m_cR, &m_cc);
+    cholmod_l_free_dense(&m_HTau, &m_cc);
+    std::free(m_E);
+    std::free(m_HPinv);
+  }
 
-      MatrixType mat(matrix);
-      
-      /* Compute the default threshold as in MatLab, see:
-       * Tim Davis, "Algorithm 915, SuiteSparseQR: Multifrontal Multithreaded Rank-Revealing
-       * Sparse QR Factorization, ACM Trans. on Math. Soft. 38(1), 2011, Page 8:3 
-       */
-      RealScalar pivotThreshold = m_tolerance;
-      if(m_useDefaultThreshold) 
-      {
-        RealScalar max2Norm = 0.0;
-        for (int j = 0; j < mat.cols(); j++) max2Norm = numext::maxi(max2Norm, mat.col(j).norm());
-        if(numext::is_exactly_zero(max2Norm))
-          max2Norm = RealScalar(1);
-        pivotThreshold = 20 * (mat.rows() + mat.cols()) * max2Norm * NumTraits<RealScalar>::epsilon();
-      }
-      cholmod_sparse A; 
-      A = viewAsCholmod(mat);
-      m_rows = matrix.rows();
-      Index col = matrix.cols();
-      m_rank = SuiteSparseQR<Scalar>(m_ordering, pivotThreshold, col, &A, 
-                             &m_cR, &m_E, &m_H, &m_HPinv, &m_HTau, &m_cc);
+  void compute(const MatrixType_& matrix) {
+    if (m_isInitialized) SPQR_free();
 
-      if (!m_cR)
-      {
-        m_info = NumericalIssue;
-        m_isInitialized = false;
-        return;
-      }
-      m_info = Success;
-      m_isInitialized = true;
-      m_isRUpToDate = false;
-    }
-    /** 
-     * Get the number of rows of the input matrix and the Q matrix
+    MatrixType mat(matrix);
+
+    /* Compute the default threshold as in MatLab, see:
+     * Tim Davis, "Algorithm 915, SuiteSparseQR: Multifrontal Multithreaded Rank-Revealing
+     * Sparse QR Factorization, ACM Trans. on Math. Soft. 38(1), 2011, Page 8:3
      */
-    inline Index rows() const {return m_rows; }
-    
-    /** 
-     * Get the number of columns of the input matrix. 
-     */
-    inline Index cols() const { return m_cR->ncol; }
-    
-    template<typename Rhs, typename Dest>
-    void _solve_impl(const MatrixBase<Rhs> &b, MatrixBase<Dest> &dest) const
-    {
-      eigen_assert(m_isInitialized && " The QR factorization should be computed first, call compute()");
-      eigen_assert(b.cols()==1 && "This method is for vectors only");
+    RealScalar pivotThreshold = m_tolerance;
+    if (m_useDefaultThreshold) {
+      RealScalar max2Norm = 0.0;
+      for (int j = 0; j < mat.cols(); j++) max2Norm = numext::maxi(max2Norm, mat.col(j).norm());
+      if (numext::is_exactly_zero(max2Norm)) max2Norm = RealScalar(1);
+      pivotThreshold = 20 * (mat.rows() + mat.cols()) * max2Norm * NumTraits<RealScalar>::epsilon();
+    }
+    cholmod_sparse A;
+    A = viewAsCholmod(mat);
+    m_rows = matrix.rows();
+    Index col = matrix.cols();
+    m_rank = SuiteSparseQR<Scalar>(m_ordering, pivotThreshold, col, &A, &m_cR, &m_E, &m_H, &m_HPinv, &m_HTau, &m_cc);
 
-      //Compute Q^T * b
-      typename Dest::PlainObject y, y2;
-      y = matrixQ().transpose() * b;
-      
-      // Solves with the triangular matrix R
-      Index rk = this->rank();
-      y2 = y;
-      y.resize((std::max)(cols(),Index(y.rows())),y.cols());
-      y.topRows(rk) = this->matrixR().topLeftCorner(rk, rk).template triangularView<Upper>().solve(y2.topRows(rk));
+    if (!m_cR) {
+      m_info = NumericalIssue;
+      m_isInitialized = false;
+      return;
+    }
+    m_info = Success;
+    m_isInitialized = true;
+    m_isRUpToDate = false;
+  }
+  /**
+   * Get the number of rows of the input matrix and the Q matrix
+   */
+  inline Index rows() const { return m_rows; }
 
-      // Apply the column permutation 
-      // colsPermutation() performs a copy of the permutation,
-      // so let's apply it manually:
-      for(Index i = 0; i < rk; ++i) dest.row(m_E[i]) = y.row(i);
-      for(Index i = rk; i < cols(); ++i) dest.row(m_E[i]).setZero();
-      
-//       y.bottomRows(y.rows()-rk).setZero();
-//       dest = colsPermutation() * y.topRows(cols());
-      
-      m_info = Success;
+  /**
+   * Get the number of columns of the input matrix.
+   */
+  inline Index cols() const { return m_cR->ncol; }
+
+  template <typename Rhs, typename Dest>
+  void _solve_impl(const MatrixBase<Rhs>& b, MatrixBase<Dest>& dest) const {
+    eigen_assert(m_isInitialized && " The QR factorization should be computed first, call compute()");
+    eigen_assert(b.cols() == 1 && "This method is for vectors only");
+
+    // Compute Q^T * b
+    typename Dest::PlainObject y, y2;
+    y = matrixQ().transpose() * b;
+
+    // Solves with the triangular matrix R
+    Index rk = this->rank();
+    y2 = y;
+    y.resize((std::max)(cols(), Index(y.rows())), y.cols());
+    y.topRows(rk) = this->matrixR().topLeftCorner(rk, rk).template triangularView<Upper>().solve(y2.topRows(rk));
+
+    // Apply the column permutation
+    // colsPermutation() performs a copy of the permutation,
+    // so let's apply it manually:
+    for (Index i = 0; i < rk; ++i) dest.row(m_E[i]) = y.row(i);
+    for (Index i = rk; i < cols(); ++i) dest.row(m_E[i]).setZero();
+
+    //       y.bottomRows(y.rows()-rk).setZero();
+    //       dest = colsPermutation() * y.topRows(cols());
+
+    m_info = Success;
+  }
+
+  /** \returns the sparse triangular factor R. It is a sparse matrix
+   */
+  const MatrixType matrixR() const {
+    eigen_assert(m_isInitialized && " The QR factorization should be computed first, call compute()");
+    if (!m_isRUpToDate) {
+      m_R = viewAsEigen<Scalar, ColMajor, typename MatrixType::StorageIndex>(*m_cR);
+      m_isRUpToDate = true;
     }
-    
-    /** \returns the sparse triangular factor R. It is a sparse matrix
-     */
-    const MatrixType matrixR() const
-    {
-      eigen_assert(m_isInitialized && " The QR factorization should be computed first, call compute()");
-      if(!m_isRUpToDate) {
-        m_R = viewAsEigen<Scalar,ColMajor, typename MatrixType::StorageIndex>(*m_cR);
-        m_isRUpToDate = true;
-      }
-      return m_R;
-    }
-    /// Get an expression of the matrix Q
-    SPQRMatrixQReturnType<SPQR> matrixQ() const
-    {
-      return SPQRMatrixQReturnType<SPQR>(*this);
-    }
-    /// Get the permutation that was applied to columns of A
-    PermutationType colsPermutation() const
-    { 
-      eigen_assert(m_isInitialized && "Decomposition is not initialized.");
-      return PermutationType(m_E, m_cR->ncol);
-    }
-    /**
-     * Gets the rank of the matrix. 
-     * It should be equal to matrixQR().cols if the matrix is full-rank
-     */
-    Index rank() const
-    {
-      eigen_assert(m_isInitialized && "Decomposition is not initialized.");
-      return m_cc.SPQR_istat[4];
-    }
-    /// Set the fill-reducing ordering method to be used
-    void setSPQROrdering(int ord) { m_ordering = ord;}
-    /// Set the tolerance tol to treat columns with 2-norm < =tol as zero
-    void setPivotThreshold(const RealScalar& tol)
-    {
-      m_useDefaultThreshold = false;
-      m_tolerance = tol;
-    }
-    
-    /** \returns a pointer to the SPQR workspace */
-    cholmod_common *cholmodCommon() const { return &m_cc; }
-    
-    
-    /** \brief Reports whether previous computation was successful.
-      *
-      * \returns \c Success if computation was successful,
-      *          \c NumericalIssue if the sparse QR can not be computed
-      */
-    ComputationInfo info() const
-    {
-      eigen_assert(m_isInitialized && "Decomposition is not initialized.");
-      return m_info;
-    }
-  protected:
-    bool m_analysisIsOk;
-    bool m_factorizationIsOk;
-    mutable bool m_isRUpToDate;
-    mutable ComputationInfo m_info;
-    int m_ordering; // Ordering method to use, see SPQR's manual
-    int m_allow_tol; // Allow to use some tolerance during numerical factorization.
-    RealScalar m_tolerance; // treat columns with 2-norm below this tolerance as zero
-    mutable cholmod_sparse *m_cR = nullptr; // The sparse R factor in cholmod format
-    mutable MatrixType m_R; // The sparse matrix R in Eigen format
-    mutable StorageIndex *m_E = nullptr; // The permutation applied to columns
-    mutable cholmod_sparse *m_H = nullptr;  //The householder vectors
-    mutable StorageIndex *m_HPinv = nullptr; // The row permutation of H
-    mutable cholmod_dense *m_HTau = nullptr; // The Householder coefficients
-    mutable Index m_rank; // The rank of the matrix
-    mutable cholmod_common m_cc; // Workspace and parameters
-    bool m_useDefaultThreshold;     // Use default threshold
-    Index m_rows;
-    template<typename ,typename > friend struct SPQR_QProduct;
+    return m_R;
+  }
+  /// Get an expression of the matrix Q
+  SPQRMatrixQReturnType<SPQR> matrixQ() const { return SPQRMatrixQReturnType<SPQR>(*this); }
+  /// Get the permutation that was applied to columns of A
+  PermutationType colsPermutation() const {
+    eigen_assert(m_isInitialized && "Decomposition is not initialized.");
+    return PermutationType(m_E, m_cR->ncol);
+  }
+  /**
+   * Gets the rank of the matrix.
+   * It should be equal to matrixQR().cols if the matrix is full-rank
+   */
+  Index rank() const {
+    eigen_assert(m_isInitialized && "Decomposition is not initialized.");
+    return m_cc.SPQR_istat[4];
+  }
+  /// Set the fill-reducing ordering method to be used
+  void setSPQROrdering(int ord) { m_ordering = ord; }
+  /// Set the tolerance tol to treat columns with 2-norm < =tol as zero
+  void setPivotThreshold(const RealScalar& tol) {
+    m_useDefaultThreshold = false;
+    m_tolerance = tol;
+  }
+
+  /** \returns a pointer to the SPQR workspace */
+  cholmod_common* cholmodCommon() const { return &m_cc; }
+
+  /** \brief Reports whether previous computation was successful.
+   *
+   * \returns \c Success if computation was successful,
+   *          \c NumericalIssue if the sparse QR can not be computed
+   */
+  ComputationInfo info() const {
+    eigen_assert(m_isInitialized && "Decomposition is not initialized.");
+    return m_info;
+  }
+
+ protected:
+  bool m_analysisIsOk;
+  bool m_factorizationIsOk;
+  mutable bool m_isRUpToDate;
+  mutable ComputationInfo m_info;
+  int m_ordering;                           // Ordering method to use, see SPQR's manual
+  int m_allow_tol;                          // Allow to use some tolerance during numerical factorization.
+  RealScalar m_tolerance;                   // treat columns with 2-norm below this tolerance as zero
+  mutable cholmod_sparse* m_cR = nullptr;   // The sparse R factor in cholmod format
+  mutable MatrixType m_R;                   // The sparse matrix R in Eigen format
+  mutable StorageIndex* m_E = nullptr;      // The permutation applied to columns
+  mutable cholmod_sparse* m_H = nullptr;    // The householder vectors
+  mutable StorageIndex* m_HPinv = nullptr;  // The row permutation of H
+  mutable cholmod_dense* m_HTau = nullptr;  // The Householder coefficients
+  mutable Index m_rank;                     // The rank of the matrix
+  mutable cholmod_common m_cc;              // Workspace and parameters
+  bool m_useDefaultThreshold;               // Use default threshold
+  Index m_rows;
+  template <typename, typename>
+  friend struct SPQR_QProduct;
 };
 
 template <typename SPQRType, typename Derived>
-struct SPQR_QProduct : ReturnByValue<SPQR_QProduct<SPQRType,Derived> >
-{
+struct SPQR_QProduct : ReturnByValue<SPQR_QProduct<SPQRType, Derived> > {
   typedef typename SPQRType::Scalar Scalar;
   typedef typename SPQRType::StorageIndex StorageIndex;
-  //Define the constructor to get reference to argument types
-  SPQR_QProduct(const SPQRType& spqr, const Derived& other, bool transpose) : m_spqr(spqr),m_other(other),m_transpose(transpose) {}
-  
+  // Define the constructor to get reference to argument types
+  SPQR_QProduct(const SPQRType& spqr, const Derived& other, bool transpose)
+      : m_spqr(spqr), m_other(other), m_transpose(transpose) {}
+
   inline Index rows() const { return m_transpose ? m_spqr.rows() : m_spqr.cols(); }
   inline Index cols() const { return m_other.cols(); }
   // Assign to a vector
-  template<typename ResType>
-  void evalTo(ResType& res) const
-  {
+  template <typename ResType>
+  void evalTo(ResType& res) const {
     cholmod_dense y_cd;
-    cholmod_dense *x_cd; 
-    int method = m_transpose ? SPQR_QTX : SPQR_QX; 
-    cholmod_common *cc = m_spqr.cholmodCommon();
+    cholmod_dense* x_cd;
+    int method = m_transpose ? SPQR_QTX : SPQR_QX;
+    cholmod_common* cc = m_spqr.cholmodCommon();
     y_cd = viewAsCholmod(m_other.const_cast_derived());
     x_cd = SuiteSparseQR_qmult<Scalar>(method, m_spqr.m_H, m_spqr.m_HTau, m_spqr.m_HPinv, &y_cd, cc);
-    res = Matrix<Scalar,ResType::RowsAtCompileTime,ResType::ColsAtCompileTime>::Map(reinterpret_cast<Scalar*>(x_cd->x), x_cd->nrow, x_cd->ncol);
+    res = Matrix<Scalar, ResType::RowsAtCompileTime, ResType::ColsAtCompileTime>::Map(
+        reinterpret_cast<Scalar*>(x_cd->x), x_cd->nrow, x_cd->ncol);
     cholmod_l_free_dense(&x_cd, cc);
   }
-  const SPQRType& m_spqr; 
-  const Derived& m_other; 
-  bool m_transpose; 
-  
+  const SPQRType& m_spqr;
+  const Derived& m_other;
+  bool m_transpose;
 };
-template<typename SPQRType>
-struct SPQRMatrixQReturnType{
-  
+template <typename SPQRType>
+struct SPQRMatrixQReturnType {
   SPQRMatrixQReturnType(const SPQRType& spqr) : m_spqr(spqr) {}
-  template<typename Derived>
-  SPQR_QProduct<SPQRType, Derived> operator*(const MatrixBase<Derived>& other)
-  {
-    return SPQR_QProduct<SPQRType,Derived>(m_spqr,other.derived(),false);
+  template <typename Derived>
+  SPQR_QProduct<SPQRType, Derived> operator*(const MatrixBase<Derived>& other) {
+    return SPQR_QProduct<SPQRType, Derived>(m_spqr, other.derived(), false);
   }
-  SPQRMatrixQTransposeReturnType<SPQRType> adjoint() const
-  {
-    return SPQRMatrixQTransposeReturnType<SPQRType>(m_spqr);
-  }
+  SPQRMatrixQTransposeReturnType<SPQRType> adjoint() const { return SPQRMatrixQTransposeReturnType<SPQRType>(m_spqr); }
   // To use for operations with the transpose of Q
-  SPQRMatrixQTransposeReturnType<SPQRType> transpose() const
-  {
+  SPQRMatrixQTransposeReturnType<SPQRType> transpose() const {
     return SPQRMatrixQTransposeReturnType<SPQRType>(m_spqr);
   }
   const SPQRType& m_spqr;
 };
 
-template<typename SPQRType>
-struct SPQRMatrixQTransposeReturnType{
+template <typename SPQRType>
+struct SPQRMatrixQTransposeReturnType {
   SPQRMatrixQTransposeReturnType(const SPQRType& spqr) : m_spqr(spqr) {}
-  template<typename Derived>
-  SPQR_QProduct<SPQRType,Derived> operator*(const MatrixBase<Derived>& other)
-  {
-    return SPQR_QProduct<SPQRType,Derived>(m_spqr,other.derived(), true);
+  template <typename Derived>
+  SPQR_QProduct<SPQRType, Derived> operator*(const MatrixBase<Derived>& other) {
+    return SPQR_QProduct<SPQRType, Derived>(m_spqr, other.derived(), true);
   }
   const SPQRType& m_spqr;
 };
 
-}// End namespace Eigen
+}  // End namespace Eigen
 #endif
diff --git a/Eigen/src/SVD/BDCSVD.h b/Eigen/src/SVD/BDCSVD.h
index a4ba8a7..7948ca3 100644
--- a/Eigen/src/SVD/BDCSVD.h
+++ b/Eigen/src/SVD/BDCSVD.h
@@ -70,7 +70,7 @@
 
 EIGEN_DIAGNOSTICS(pop)
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \ingroup SVD_Module
  *
@@ -105,12 +105,12 @@
 class BDCSVD : public SVDBase<BDCSVD<MatrixType_, Options_> > {
   typedef SVDBase<BDCSVD> Base;
 
-public:
-  using Base::rows;
+ public:
   using Base::cols;
-  using Base::diagSize;
   using Base::computeU;
   using Base::computeV;
+  using Base::diagSize;
+  using Base::rows;
 
   typedef MatrixType_ MatrixType;
   typedef typename Base::Scalar Scalar;
@@ -138,7 +138,7 @@
   typedef Matrix<RealScalar, Dynamic, Dynamic, ColMajor> MatrixXr;
   typedef Matrix<RealScalar, Dynamic, 1> VectorType;
   typedef Array<RealScalar, Dynamic, 1> ArrayXr;
-  typedef Array<Index,1,Dynamic> ArrayXi;
+  typedef Array<Index, 1, Dynamic> ArrayXi;
   typedef Ref<ArrayXr> ArrayRef;
   typedef Ref<ArrayXi> IndicesRef;
 
@@ -147,8 +147,7 @@
    * The default constructor is useful in cases in which the user intends to
    * perform decompositions via BDCSVD::compute(const MatrixType&).
    */
-  BDCSVD() : m_algoswap(16), m_isTranspose(false), m_compU(false), m_compV(false), m_numIters(0)
-  {}
+  BDCSVD() : m_algoswap(16), m_isTranspose(false), m_compU(false), m_compV(false), m_numIters(0) {}
 
   /** \brief Default Constructor with memory preallocation
    *
@@ -174,8 +173,7 @@
    * \deprecated Will be removed in the next major Eigen version. Options should
    * be specified in the \a Options template parameter.
    */
-  EIGEN_DEPRECATED
-  BDCSVD(Index rows, Index cols, unsigned int computationOptions) : m_algoswap(16), m_numIters(0) {
+  EIGEN_DEPRECATED BDCSVD(Index rows, Index cols, unsigned int computationOptions) : m_algoswap(16), m_numIters(0) {
     internal::check_svd_options_assertions<MatrixType, Options>(computationOptions, rows, cols);
     allocate(rows, cols, computationOptions);
   }
@@ -201,8 +199,7 @@
    * \deprecated Will be removed in the next major Eigen version. Options should
    * be specified in the \a Options template parameter.
    */
-  EIGEN_DEPRECATED
-  BDCSVD(const MatrixType& matrix, unsigned int computationOptions) : m_algoswap(16), m_numIters(0) {
+  EIGEN_DEPRECATED BDCSVD(const MatrixType& matrix, unsigned int computationOptions) : m_algoswap(16), m_numIters(0) {
     internal::check_svd_options_assertions<MatrixType, Options>(computationOptions, matrix.rows(), matrix.cols());
     compute_impl(matrix, computationOptions);
   }
@@ -215,42 +212,45 @@
    * \param matrix the matrix to decompose
    */
   BDCSVD& compute(const MatrixType& matrix) { return compute_impl(matrix, m_computationOptions); }
-  
+
   /** \brief Method performing the decomposition of given matrix, as specified by
    *         the `computationOptions` parameter.
    *
    * \param matrix the matrix to decompose
    * \param computationOptions specify whether to compute Thin/Full unitaries U/V
-   * 
+   *
    * \deprecated Will be removed in the next major Eigen version. Options should
    * be specified in the \a Options template parameter.
    */
-  EIGEN_DEPRECATED
-  BDCSVD& compute(const MatrixType& matrix, unsigned int computationOptions) {
+  EIGEN_DEPRECATED BDCSVD& compute(const MatrixType& matrix, unsigned int computationOptions) {
     internal::check_svd_options_assertions<MatrixType, Options>(computationOptions, matrix.rows(), matrix.cols());
     return compute_impl(matrix, computationOptions);
   }
 
-  void setSwitchSize(int s)
-  {
-    eigen_assert(s>=3 && "BDCSVD the size of the algo switch has to be at least 3.");
+  void setSwitchSize(int s) {
+    eigen_assert(s >= 3 && "BDCSVD the size of the algo switch has to be at least 3.");
     m_algoswap = s;
   }
 
-private:
+ private:
   BDCSVD& compute_impl(const MatrixType& matrix, unsigned int computationOptions);
   void divide(Index firstCol, Index lastCol, Index firstRowW, Index firstColW, Index shift);
   void computeSVDofM(Index firstCol, Index n, MatrixXr& U, VectorType& singVals, MatrixXr& V);
-  void computeSingVals(const ArrayRef& col0, const ArrayRef& diag, const IndicesRef& perm, VectorType& singVals, ArrayRef shifts, ArrayRef mus);
-  void perturbCol0(const ArrayRef& col0, const ArrayRef& diag, const IndicesRef& perm, const VectorType& singVals, const ArrayRef& shifts, const ArrayRef& mus, ArrayRef zhat);
-  void computeSingVecs(const ArrayRef& zhat, const ArrayRef& diag, const IndicesRef& perm, const VectorType& singVals, const ArrayRef& shifts, const ArrayRef& mus, MatrixXr& U, MatrixXr& V);
+  void computeSingVals(const ArrayRef& col0, const ArrayRef& diag, const IndicesRef& perm, VectorType& singVals,
+                       ArrayRef shifts, ArrayRef mus);
+  void perturbCol0(const ArrayRef& col0, const ArrayRef& diag, const IndicesRef& perm, const VectorType& singVals,
+                   const ArrayRef& shifts, const ArrayRef& mus, ArrayRef zhat);
+  void computeSingVecs(const ArrayRef& zhat, const ArrayRef& diag, const IndicesRef& perm, const VectorType& singVals,
+                       const ArrayRef& shifts, const ArrayRef& mus, MatrixXr& U, MatrixXr& V);
   void deflation43(Index firstCol, Index shift, Index i, Index size);
-  void deflation44(Index firstColu , Index firstColm, Index firstRowW, Index firstColW, Index i, Index j, Index size);
+  void deflation44(Index firstColu, Index firstColm, Index firstRowW, Index firstColW, Index i, Index j, Index size);
   void deflation(Index firstCol, Index lastCol, Index k, Index firstRowW, Index firstColW, Index shift);
-  template<typename HouseholderU, typename HouseholderV, typename NaiveU, typename NaiveV>
-  void copyUV(const HouseholderU &householderU, const HouseholderV &householderV, const NaiveU &naiveU, const NaiveV &naivev);
-  void structured_update(Block<MatrixXr,Dynamic,Dynamic> A, const MatrixXr &B, Index n1);
-  static RealScalar secularEq(RealScalar x, const ArrayRef& col0, const ArrayRef& diag, const IndicesRef &perm, const ArrayRef& diagShifted, RealScalar shift);
+  template <typename HouseholderU, typename HouseholderV, typename NaiveU, typename NaiveV>
+  void copyUV(const HouseholderU& householderU, const HouseholderV& householderV, const NaiveU& naiveU,
+              const NaiveV& naivev);
+  void structured_update(Block<MatrixXr, Dynamic, Dynamic> A, const MatrixXr& B, Index n1);
+  static RealScalar secularEq(RealScalar x, const ArrayRef& col0, const ArrayRef& diag, const IndicesRef& perm,
+                              const ArrayRef& diagShifted, RealScalar shift);
   template <typename SVDType>
   void computeBaseCase(SVDType& svd, Index n, Index firstCol, Index firstRowW, Index firstColW, Index shift);
 
@@ -286,18 +286,16 @@
 // Method to allocate and initialize matrix and attributes
 template <typename MatrixType, int Options>
 void BDCSVD<MatrixType, Options>::allocate(Index rows, Index cols, unsigned int computationOptions) {
-  if (Base::allocate(rows, cols, computationOptions))
-    return;
+  if (Base::allocate(rows, cols, computationOptions)) return;
 
   if (cols < m_algoswap)
     internal::allocate_small_svd<MatrixType, ComputationOptions>::run(smallSvd, rows, cols, computationOptions);
 
-  m_computed = MatrixXr::Zero(diagSize() + 1, diagSize() );
+  m_computed = MatrixXr::Zero(diagSize() + 1, diagSize());
   m_compU = computeV();
   m_compV = computeU();
   m_isTranspose = (cols > rows);
-  if (m_isTranspose)
-    std::swap(m_compU, m_compV);
+  if (m_isTranspose) std::swap(m_compU, m_compV);
 
   // kMinAspectRatio is the crossover point that determines if we perform R-Bidiagonalization
   // or bidiagonalize the input matrix directly.
@@ -315,20 +313,23 @@
   bid = internal::UpperBidiagonalization<MatrixX>(m_useQrDecomp ? diagSize() : copyWorkspace.rows(),
                                                   m_useQrDecomp ? diagSize() : copyWorkspace.cols());
 
-  if (m_compU) m_naiveU = MatrixXr::Zero(diagSize() + 1, diagSize() + 1 );
-  else         m_naiveU = MatrixXr::Zero(2, diagSize() + 1 );
+  if (m_compU)
+    m_naiveU = MatrixXr::Zero(diagSize() + 1, diagSize() + 1);
+  else
+    m_naiveU = MatrixXr::Zero(2, diagSize() + 1);
 
   if (m_compV) m_naiveV = MatrixXr::Zero(diagSize(), diagSize());
 
-  m_workspace.resize((diagSize()+1)*(diagSize()+1)*3);
-  m_workspaceI.resize(3*diagSize());
+  m_workspace.resize((diagSize() + 1) * (diagSize() + 1) * 3);
+  m_workspaceI.resize(3 * diagSize());
 }  // end allocate
 
 template <typename MatrixType, int Options>
 BDCSVD<MatrixType, Options>& BDCSVD<MatrixType, Options>::compute_impl(const MatrixType& matrix,
                                                                        unsigned int computationOptions) {
 #ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
-  std::cout << "\n\n\n======================================================================================================================\n\n\n";
+  std::cout << "\n\n\n================================================================================================="
+               "=====================\n\n\n";
 #endif
   using std::abs;
 
@@ -337,8 +338,7 @@
   const RealScalar considerZero = (std::numeric_limits<RealScalar>::min)();
 
   //**** step -1 - If the problem is too small, directly falls back to JacobiSVD and return
-  if(matrix.cols() < m_algoswap)
-  {
+  if (matrix.cols() < m_algoswap) {
     smallSvd.compute(matrix);
     m_isInitialized = true;
     m_info = smallSvd.info();
@@ -359,10 +359,12 @@
     return *this;
   }
 
-  if(numext::is_exactly_zero(scale)) scale = Literal(1);
+  if (numext::is_exactly_zero(scale)) scale = Literal(1);
 
-  if (m_isTranspose) copyWorkspace = matrix.adjoint() / scale;
-  else copyWorkspace = matrix / scale;
+  if (m_isTranspose)
+    copyWorkspace = matrix.adjoint() / scale;
+  else
+    copyWorkspace = matrix / scale;
 
   //**** step 1 - Bidiagonalization.
   // If the problem is sufficiently rectangular, we perform R-Bidiagonalization: compute A = Q(R/0)
@@ -390,30 +392,30 @@
   }
 
   //**** step 3 - Copy singular values and vectors
-  for (int i=0; i<diagSize(); i++)
-  {
+  for (int i = 0; i < diagSize(); i++) {
     RealScalar a = abs(m_computed.coeff(i, i));
     m_singularValues.coeffRef(i) = a * scale;
-    if (a<considerZero)
-    {
+    if (a < considerZero) {
       m_nonzeroSingularValues = i;
       m_singularValues.tail(diagSize() - i - 1).setZero();
       break;
-    }
-    else if (i == diagSize() - 1)
-    {
+    } else if (i == diagSize() - 1) {
       m_nonzeroSingularValues = i + 1;
       break;
     }
   }
 
   //**** step 4 - Finalize unitaries U and V
-  if(m_isTranspose) copyUV(bid.householderV(), bid.householderU(), m_naiveV, m_naiveU);
-  else              copyUV(bid.householderU(), bid.householderV(), m_naiveU, m_naiveV);
+  if (m_isTranspose)
+    copyUV(bid.householderV(), bid.householderU(), m_naiveV, m_naiveU);
+  else
+    copyUV(bid.householderU(), bid.householderV(), m_naiveU, m_naiveV);
 
   if (m_useQrDecomp) {
-    if (m_isTranspose && computeV()) m_matrixV.applyOnTheLeft(qrDecomp.householderQ());
-    else if (!m_isTranspose && computeU()) m_matrixU.applyOnTheLeft(qrDecomp.householderQ());
+    if (m_isTranspose && computeV())
+      m_matrixV.applyOnTheLeft(qrDecomp.householderQ());
+    else if (!m_isTranspose && computeU())
+      m_matrixU.applyOnTheLeft(qrDecomp.householderQ());
   }
 
   m_isInitialized = true;
@@ -425,70 +427,68 @@
 void BDCSVD<MatrixType, Options>::copyUV(const HouseholderU& householderU, const HouseholderV& householderV,
                                          const NaiveU& naiveU, const NaiveV& naiveV) {
   // Note exchange of U and V: m_matrixU is set from m_naiveV and vice versa
-  if (computeU())
-  {
+  if (computeU()) {
     Index Ucols = m_computeThinU ? diagSize() : rows();
     m_matrixU = MatrixX::Identity(rows(), Ucols);
-    m_matrixU.topLeftCorner(diagSize(), diagSize()) = naiveV.template cast<Scalar>().topLeftCorner(diagSize(), diagSize());
+    m_matrixU.topLeftCorner(diagSize(), diagSize()) =
+        naiveV.template cast<Scalar>().topLeftCorner(diagSize(), diagSize());
     // FIXME the following conditionals involve temporary buffers
-    if (m_useQrDecomp) m_matrixU.topLeftCorner(householderU.cols(), diagSize()).applyOnTheLeft(householderU);
-    else m_matrixU.applyOnTheLeft(householderU);
+    if (m_useQrDecomp)
+      m_matrixU.topLeftCorner(householderU.cols(), diagSize()).applyOnTheLeft(householderU);
+    else
+      m_matrixU.applyOnTheLeft(householderU);
   }
-  if (computeV())
-  {
+  if (computeV()) {
     Index Vcols = m_computeThinV ? diagSize() : cols();
     m_matrixV = MatrixX::Identity(cols(), Vcols);
-    m_matrixV.topLeftCorner(diagSize(), diagSize()) = naiveU.template cast<Scalar>().topLeftCorner(diagSize(), diagSize());
+    m_matrixV.topLeftCorner(diagSize(), diagSize()) =
+        naiveU.template cast<Scalar>().topLeftCorner(diagSize(), diagSize());
     // FIXME the following conditionals involve temporary buffers
-    if (m_useQrDecomp) m_matrixV.topLeftCorner(householderV.cols(), diagSize()).applyOnTheLeft(householderV);
-    else m_matrixV.applyOnTheLeft(householderV);
+    if (m_useQrDecomp)
+      m_matrixV.topLeftCorner(householderV.cols(), diagSize()).applyOnTheLeft(householderV);
+    else
+      m_matrixV.applyOnTheLeft(householderV);
   }
 }
 
 /** \internal
-  * Performs A = A * B exploiting the special structure of the matrix A. Splitting A as:
-  *  A = [A1]
-  *      [A2]
-  * such that A1.rows()==n1, then we assume that at least half of the columns of A1 and A2 are zeros.
-  * We can thus pack them prior to the the matrix product. However, this is only worth the effort if the matrix is large
-  * enough.
-  */
+ * Performs A = A * B exploiting the special structure of the matrix A. Splitting A as:
+ *  A = [A1]
+ *      [A2]
+ * such that A1.rows()==n1, then we assume that at least half of the columns of A1 and A2 are zeros.
+ * We can thus pack them prior to the the matrix product. However, this is only worth the effort if the matrix is large
+ * enough.
+ */
 template <typename MatrixType, int Options>
 void BDCSVD<MatrixType, Options>::structured_update(Block<MatrixXr, Dynamic, Dynamic> A, const MatrixXr& B, Index n1) {
   Index n = A.rows();
-  if(n>100)
-  {
+  if (n > 100) {
     // If the matrices are large enough, let's exploit the sparse structure of A by
     // splitting it in half (wrt n1), and packing the non-zero columns.
     Index n2 = n - n1;
-    Map<MatrixXr> A1(m_workspace.data()      , n1, n);
-    Map<MatrixXr> A2(m_workspace.data()+ n1*n, n2, n);
-    Map<MatrixXr> B1(m_workspace.data()+  n*n, n,  n);
-    Map<MatrixXr> B2(m_workspace.data()+2*n*n, n,  n);
-    Index k1=0, k2=0;
-    for(Index j=0; j<n; ++j)
-    {
-      if( (A.col(j).head(n1).array()!=Literal(0)).any() )
-      {
+    Map<MatrixXr> A1(m_workspace.data(), n1, n);
+    Map<MatrixXr> A2(m_workspace.data() + n1 * n, n2, n);
+    Map<MatrixXr> B1(m_workspace.data() + n * n, n, n);
+    Map<MatrixXr> B2(m_workspace.data() + 2 * n * n, n, n);
+    Index k1 = 0, k2 = 0;
+    for (Index j = 0; j < n; ++j) {
+      if ((A.col(j).head(n1).array() != Literal(0)).any()) {
         A1.col(k1) = A.col(j).head(n1);
         B1.row(k1) = B.row(j);
         ++k1;
       }
-      if( (A.col(j).tail(n2).array()!=Literal(0)).any() )
-      {
+      if ((A.col(j).tail(n2).array() != Literal(0)).any()) {
         A2.col(k2) = A.col(j).tail(n2);
         B2.row(k2) = B.row(j);
         ++k2;
       }
     }
 
-    A.topRows(n1).noalias()    = A1.leftCols(k1) * B1.topRows(k1);
+    A.topRows(n1).noalias() = A1.leftCols(k1) * B1.topRows(k1);
     A.bottomRows(n2).noalias() = A2.leftCols(k2) * B2.topRows(k2);
-  }
-  else
-  {
-    Map<MatrixXr,Aligned> tmp(m_workspace.data(),n,n);
-    tmp.noalias() = A*B;
+  } else {
+    Map<MatrixXr, Aligned> tmp(m_workspace.data(), n, n);
+    tmp.noalias() = A * B;
     A = tmp;
   }
 }
@@ -517,19 +517,21 @@
 //@param firstCol : The Index of the first column of the submatrix of m_computed and for m_naiveU;
 //@param lastCol : The Index of the last column of the submatrix of m_computed and for m_naiveU;
 // lastCol + 1 - firstCol is the size of the submatrix.
-//@param firstRowW : The Index of the first row of the matrix W that we are to change. (see the reference paper section 1 for more information on W)
+//@param firstRowW : The Index of the first row of the matrix W that we are to change. (see the reference paper section
+// 1 for more information on W)
 //@param firstColW : Same as firstRowW with the column.
-//@param shift : Each time one takes the left submatrix, one must add 1 to the shift. Why? Because! We actually want the last column of the U submatrix
-// to become the first column (*coeff) and to shift all the other columns to the right. There are more details on the reference paper.
+//@param shift : Each time one takes the left submatrix, one must add 1 to the shift. Why? Because! We actually want the
+// last column of the U submatrix
+// to become the first column (*coeff) and to shift all the other columns to the right. There are more details on the
+// reference paper.
 template <typename MatrixType, int Options>
-void BDCSVD<MatrixType, Options>::divide(Index firstCol, Index lastCol, Index firstRowW,
-                                         Index firstColW, Index shift) {
+void BDCSVD<MatrixType, Options>::divide(Index firstCol, Index lastCol, Index firstRowW, Index firstColW, Index shift) {
   // requires rows = cols + 1;
+  using std::abs;
   using std::pow;
   using std::sqrt;
-  using std::abs;
   const Index n = lastCol - firstCol + 1;
-  const Index k = n/2;
+  const Index k = n / 2;
   const RealScalar considerZero = (std::numeric_limits<RealScalar>::min)();
   RealScalar alphaK;
   RealScalar betaK;
@@ -538,8 +540,7 @@
   VectorType l, f;
   // We use the other algorithm which is more efficient for small
   // matrices.
-  if (n < m_algoswap)
-  {
+  if (n < m_algoswap) {
     // FIXME this block involves temporaries
     if (m_compV) {
       JacobiSVD<MatrixXr, ComputeFullU | ComputeFullV> baseSvd;
@@ -551,7 +552,7 @@
     return;
   }
   // We use the divide and conquer algorithm
-  alphaK =  m_computed(firstCol + k, firstCol + k);
+  alphaK = m_computed(firstCol + k, firstCol + k);
   betaK = m_computed(firstCol + k + 1, firstCol + k);
   // The divide must be done in that order in order to have good results. Divide change the data inside the submatrices
   // and the divide of the right submatrice reads one column of the left submatrice. That's why we need to treat the
@@ -561,35 +562,26 @@
   divide(firstCol, k - 1 + firstCol, firstRowW, firstColW + 1, shift + 1);
   if (m_info != Success && m_info != NoConvergence) return;
 
-  if (m_compU)
-  {
+  if (m_compU) {
     lambda = m_naiveU(firstCol + k, firstCol + k);
     phi = m_naiveU(firstCol + k + 1, lastCol + 1);
-  }
-  else
-  {
+  } else {
     lambda = m_naiveU(1, firstCol + k);
     phi = m_naiveU(0, lastCol + 1);
   }
   r0 = sqrt((abs(alphaK * lambda) * abs(alphaK * lambda)) + abs(betaK * phi) * abs(betaK * phi));
-  if (m_compU)
-  {
+  if (m_compU) {
     l = m_naiveU.row(firstCol + k).segment(firstCol, k);
     f = m_naiveU.row(firstCol + k + 1).segment(firstCol + k + 1, n - k - 1);
-  }
-  else
-  {
+  } else {
     l = m_naiveU.row(1).segment(firstCol, k);
     f = m_naiveU.row(0).segment(firstCol + k + 1, n - k - 1);
   }
-  if (m_compV) m_naiveV(firstRowW+k, firstColW) = Literal(1);
-  if (r0<considerZero)
-  {
+  if (m_compV) m_naiveV(firstRowW + k, firstColW) = Literal(1);
+  if (r0 < considerZero) {
     c0 = Literal(1);
     s0 = Literal(0);
-  }
-  else
-  {
+  } else {
     c0 = alphaK * lambda / r0;
     s0 = betaK * phi / r0;
   }
@@ -600,33 +592,30 @@
   eigen_internal_assert(m_computed.allFinite());
 #endif
 
-  if (m_compU)
-  {
-    MatrixXr q1 (m_naiveU.col(firstCol + k).segment(firstCol, k + 1));
+  if (m_compU) {
+    MatrixXr q1(m_naiveU.col(firstCol + k).segment(firstCol, k + 1));
     // we shiftW Q1 to the right
     for (Index i = firstCol + k - 1; i >= firstCol; i--)
       m_naiveU.col(i + 1).segment(firstCol, k + 1) = m_naiveU.col(i).segment(firstCol, k + 1);
     // we shift q1 at the left with a factor c0
-    m_naiveU.col(firstCol).segment( firstCol, k + 1) = (q1 * c0);
+    m_naiveU.col(firstCol).segment(firstCol, k + 1) = (q1 * c0);
     // last column = q1 * - s0
-    m_naiveU.col(lastCol + 1).segment(firstCol, k + 1) = (q1 * ( - s0));
+    m_naiveU.col(lastCol + 1).segment(firstCol, k + 1) = (q1 * (-s0));
     // first column = q2 * s0
-    m_naiveU.col(firstCol).segment(firstCol + k + 1, n - k) = m_naiveU.col(lastCol + 1).segment(firstCol + k + 1, n - k) * s0;
+    m_naiveU.col(firstCol).segment(firstCol + k + 1, n - k) =
+        m_naiveU.col(lastCol + 1).segment(firstCol + k + 1, n - k) * s0;
     // q2 *= c0
     m_naiveU.col(lastCol + 1).segment(firstCol + k + 1, n - k) *= c0;
-  }
-  else
-  {
+  } else {
     RealScalar q1 = m_naiveU(0, firstCol + k);
     // we shift Q1 to the right
-    for (Index i = firstCol + k - 1; i >= firstCol; i--)
-      m_naiveU(0, i + 1) = m_naiveU(0, i);
+    for (Index i = firstCol + k - 1; i >= firstCol; i--) m_naiveU(0, i + 1) = m_naiveU(0, i);
     // we shift q1 at the left with a factor c0
     m_naiveU(0, firstCol) = (q1 * c0);
     // last column = q1 * - s0
-    m_naiveU(0, lastCol + 1) = (q1 * ( - s0));
+    m_naiveU(0, lastCol + 1) = (q1 * (-s0));
     // first column = q2 * s0
-    m_naiveU(1, firstCol) = m_naiveU(1, lastCol + 1) *s0;
+    m_naiveU(1, firstCol) = m_naiveU(1, lastCol + 1) * s0;
     // q2 *= c0
     m_naiveU(1, lastCol + 1) *= c0;
     m_naiveU.row(1).segment(firstCol + 1, k).setZero();
@@ -644,18 +633,18 @@
   m_computed.col(firstCol + shift).segment(firstCol + shift + k + 1, n - k - 1) = betaK * f.transpose().real();
 
 #ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
-  ArrayXr tmp1 = (m_computed.block(firstCol+shift, firstCol+shift, n, n)).jacobiSvd().singularValues();
+  ArrayXr tmp1 = (m_computed.block(firstCol + shift, firstCol + shift, n, n)).jacobiSvd().singularValues();
 #endif
   // Second part: try to deflate singular values in combined matrix
   deflation(firstCol, lastCol, k, firstRowW, firstColW, shift);
 #ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
-  ArrayXr tmp2 = (m_computed.block(firstCol+shift, firstCol+shift, n, n)).jacobiSvd().singularValues();
+  ArrayXr tmp2 = (m_computed.block(firstCol + shift, firstCol + shift, n, n)).jacobiSvd().singularValues();
   std::cout << "\n\nj1 = " << tmp1.transpose().format(bdcsvdfmt) << "\n";
   std::cout << "j2 = " << tmp2.transpose().format(bdcsvdfmt) << "\n\n";
-  std::cout << "err:      " << ((tmp1-tmp2).abs()>1e-12*tmp2.abs()).transpose() << "\n";
+  std::cout << "err:      " << ((tmp1 - tmp2).abs() > 1e-12 * tmp2.abs()).transpose() << "\n";
   static int count = 0;
   std::cout << "# " << ++count << "\n\n";
-  eigen_internal_assert((tmp1-tmp2).matrix().norm() < 1e-14*tmp2.matrix().norm());
+  eigen_internal_assert((tmp1 - tmp2).matrix().norm() < 1e-14 * tmp2.matrix().norm());
 //   eigen_internal_assert(count<681);
 //   eigen_internal_assert(((tmp1-tmp2).abs()<1e-13*tmp2.abs()).all());
 #endif
@@ -671,15 +660,14 @@
 #endif
 
   if (m_compU)
-    structured_update(m_naiveU.block(firstCol, firstCol, n + 1, n + 1), UofSVD, (n+2)/2);
-  else
-  {
-    Map<Matrix<RealScalar,2,Dynamic>,Aligned> tmp(m_workspace.data(),2,n+1);
-    tmp.noalias() = m_naiveU.middleCols(firstCol, n+1) * UofSVD;
+    structured_update(m_naiveU.block(firstCol, firstCol, n + 1, n + 1), UofSVD, (n + 2) / 2);
+  else {
+    Map<Matrix<RealScalar, 2, Dynamic>, Aligned> tmp(m_workspace.data(), 2, n + 1);
+    tmp.noalias() = m_naiveU.middleCols(firstCol, n + 1) * UofSVD;
     m_naiveU.middleCols(firstCol, n + 1) = tmp;
   }
 
-  if (m_compV)  structured_update(m_naiveV.block(firstRowW, firstColW, n, n), VofSVD, (n+1)/2);
+  if (m_compV) structured_update(m_naiveV.block(firstRowW, firstColW, n, n), VofSVD, (n + 1) / 2);
 
 #ifdef EIGEN_BDCSVD_SANITY_CHECKS
   eigen_internal_assert(m_naiveU.allFinite());
@@ -698,44 +686,43 @@
 //
 // TODO Opportunities for optimization: better root finding algo, better stopping criterion, better
 // handling of round-off errors, be consistent in ordering
-// For instance, to solve the secular equation using FMM, see http://www.stat.uchicago.edu/~lekheng/courses/302/classics/greengard-rokhlin.pdf
+// For instance, to solve the secular equation using FMM, see
+// http://www.stat.uchicago.edu/~lekheng/courses/302/classics/greengard-rokhlin.pdf
 template <typename MatrixType, int Options>
-void BDCSVD<MatrixType, Options>::computeSVDofM(Index firstCol, Index n, MatrixXr& U,
-                                                VectorType& singVals, MatrixXr& V) {
+void BDCSVD<MatrixType, Options>::computeSVDofM(Index firstCol, Index n, MatrixXr& U, VectorType& singVals,
+                                                MatrixXr& V) {
   const RealScalar considerZero = (std::numeric_limits<RealScalar>::min)();
   using std::abs;
   ArrayRef col0 = m_computed.col(firstCol).segment(firstCol, n);
-  m_workspace.head(n) =  m_computed.block(firstCol, firstCol, n, n).diagonal();
+  m_workspace.head(n) = m_computed.block(firstCol, firstCol, n, n).diagonal();
   ArrayRef diag = m_workspace.head(n);
   diag(0) = Literal(0);
 
   // Allocate space for singular values and vectors
   singVals.resize(n);
-  U.resize(n+1, n+1);
+  U.resize(n + 1, n + 1);
   if (m_compV) V.resize(n, n);
 
 #ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
-  if (col0.hasNaN() || diag.hasNaN())
-    std::cout << "\n\nHAS NAN\n\n";
+  if (col0.hasNaN() || diag.hasNaN()) std::cout << "\n\nHAS NAN\n\n";
 #endif
 
   // Many singular values might have been deflated, the zero ones have been moved to the end,
   // but others are interleaved and we must ignore them at this stage.
   // To this end, let's compute a permutation skipping them:
   Index actual_n = n;
-  while(actual_n>1 && numext::is_exactly_zero(diag(actual_n - 1))) {
+  while (actual_n > 1 && numext::is_exactly_zero(diag(actual_n - 1))) {
     --actual_n;
     eigen_internal_assert(numext::is_exactly_zero(col0(actual_n)));
   }
-  Index m = 0; // size of the deflated problem
-  for(Index k=0;k<actual_n;++k)
-    if(abs(col0(k))>considerZero)
-      m_workspaceI(m++) = k;
-  Map<ArrayXi> perm(m_workspaceI.data(),m);
+  Index m = 0;  // size of the deflated problem
+  for (Index k = 0; k < actual_n; ++k)
+    if (abs(col0(k)) > considerZero) m_workspaceI(m++) = k;
+  Map<ArrayXi> perm(m_workspaceI.data(), m);
 
-  Map<ArrayXr> shifts(m_workspace.data()+1*n, n);
-  Map<ArrayXr> mus(m_workspace.data()+2*n, n);
-  Map<ArrayXr> zhat(m_workspace.data()+3*n, n);
+  Map<ArrayXr> shifts(m_workspace.data() + 1 * n, n);
+  Map<ArrayXr> mus(m_workspace.data() + 2 * n, n);
+  Map<ArrayXr> zhat(m_workspace.data() + 3 * n, n);
 
 #ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
   std::cout << "computeSVDofM using:\n";
@@ -747,17 +734,21 @@
   computeSingVals(col0, diag, perm, singVals, shifts, mus);
 
 #ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
-  std::cout << "  j:        " << (m_computed.block(firstCol, firstCol, n, n)).jacobiSvd().singularValues().transpose().reverse() << "\n\n";
+  std::cout << "  j:        "
+            << (m_computed.block(firstCol, firstCol, n, n)).jacobiSvd().singularValues().transpose().reverse()
+            << "\n\n";
   std::cout << "  sing-val: " << singVals.transpose() << "\n";
   std::cout << "  mu:       " << mus.transpose() << "\n";
   std::cout << "  shift:    " << shifts.transpose() << "\n";
 
   {
     std::cout << "\n\n    mus:    " << mus.head(actual_n).transpose() << "\n\n";
-    std::cout << "    check1 (expect0) : " << ((singVals.array()-(shifts+mus)) / singVals.array()).head(actual_n).transpose() << "\n\n";
-    eigen_internal_assert((((singVals.array()-(shifts+mus)) / singVals.array()).head(actual_n) >= 0).all());
-    std::cout << "    check2 (>0)      : " << ((singVals.array()-diag) / singVals.array()).head(actual_n).transpose() << "\n\n";
-    eigen_internal_assert((((singVals.array()-diag) / singVals.array()).head(actual_n) >= 0).all());
+    std::cout << "    check1 (expect0) : "
+              << ((singVals.array() - (shifts + mus)) / singVals.array()).head(actual_n).transpose() << "\n\n";
+    eigen_internal_assert((((singVals.array() - (shifts + mus)) / singVals.array()).head(actual_n) >= 0).all());
+    std::cout << "    check2 (>0)      : " << ((singVals.array() - diag) / singVals.array()).head(actual_n).transpose()
+              << "\n\n";
+    eigen_internal_assert((((singVals.array() - diag) / singVals.array()).head(actual_n) >= 0).all());
   }
 #endif
 
@@ -769,7 +760,7 @@
 
   // Compute zhat
   perturbCol0(col0, diag, perm, singVals, shifts, mus, zhat);
-#ifdef  EIGEN_BDCSVD_DEBUG_VERBOSE
+#ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
   std::cout << "  zhat: " << zhat.transpose() << "\n";
 #endif
 
@@ -779,9 +770,9 @@
 
   computeSingVecs(zhat, diag, perm, singVals, shifts, mus, U, V);
 
-#ifdef  EIGEN_BDCSVD_DEBUG_VERBOSE
-  std::cout << "U^T U: " << (U.transpose() * U - MatrixXr(MatrixXr::Identity(U.cols(),U.cols()))).norm() << "\n";
-  std::cout << "V^T V: " << (V.transpose() * V - MatrixXr(MatrixXr::Identity(V.cols(),V.cols()))).norm() << "\n";
+#ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
+  std::cout << "U^T U: " << (U.transpose() * U - MatrixXr(MatrixXr::Identity(U.cols(), U.cols()))).norm() << "\n";
+  std::cout << "V^T V: " << (V.transpose() * V - MatrixXr(MatrixXr::Identity(V.cols(), V.cols()))).norm() << "\n";
 #endif
 
 #ifdef EIGEN_BDCSVD_SANITY_CHECKS
@@ -790,28 +781,28 @@
   eigen_internal_assert(m_computed.allFinite());
   eigen_internal_assert(U.allFinite());
   eigen_internal_assert(V.allFinite());
-//   eigen_internal_assert((U.transpose() * U - MatrixXr(MatrixXr::Identity(U.cols(),U.cols()))).norm() < 100*NumTraits<RealScalar>::epsilon() * n);
-//   eigen_internal_assert((V.transpose() * V - MatrixXr(MatrixXr::Identity(V.cols(),V.cols()))).norm() < 100*NumTraits<RealScalar>::epsilon() * n);
+//   eigen_internal_assert((U.transpose() * U - MatrixXr(MatrixXr::Identity(U.cols(),U.cols()))).norm() <
+//   100*NumTraits<RealScalar>::epsilon() * n); eigen_internal_assert((V.transpose() * V -
+//   MatrixXr(MatrixXr::Identity(V.cols(),V.cols()))).norm() < 100*NumTraits<RealScalar>::epsilon() * n);
 #endif
 
   // Because of deflation, the singular values might not be completely sorted.
   // Fortunately, reordering them is a O(n) problem
-  for(Index i=0; i<actual_n-1; ++i)
-  {
-    if(singVals(i)>singVals(i+1))
-    {
+  for (Index i = 0; i < actual_n - 1; ++i) {
+    if (singVals(i) > singVals(i + 1)) {
       using std::swap;
-      swap(singVals(i),singVals(i+1));
-      U.col(i).swap(U.col(i+1));
-      if(m_compV) V.col(i).swap(V.col(i+1));
+      swap(singVals(i), singVals(i + 1));
+      U.col(i).swap(U.col(i + 1));
+      if (m_compV) V.col(i).swap(V.col(i + 1));
     }
   }
 
 #ifdef EIGEN_BDCSVD_SANITY_CHECKS
   {
-    bool singular_values_sorted = (((singVals.segment(1,actual_n-1)-singVals.head(actual_n-1))).array() >= 0).all();
-    if(!singular_values_sorted)
-      std::cout << "Singular values are not sorted: " << singVals.segment(1,actual_n).transpose() << "\n";
+    bool singular_values_sorted =
+        (((singVals.segment(1, actual_n - 1) - singVals.head(actual_n - 1))).array() >= 0).all();
+    if (!singular_values_sorted)
+      std::cout << "Singular values are not sorted: " << singVals.segment(1, actual_n).transpose() << "\n";
     eigen_internal_assert(singular_values_sorted);
   }
 #endif
@@ -823,7 +814,7 @@
   if (m_compV) V.leftCols(actual_n).rowwise().reverseInPlace();
 
 #ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
-  JacobiSVD<MatrixXr> jsvd(m_computed.block(firstCol, firstCol, n, n) );
+  JacobiSVD<MatrixXr> jsvd(m_computed.block(firstCol, firstCol, n, n));
   std::cout << "  * j:        " << jsvd.singularValues().transpose() << "\n\n";
   std::cout << "  * sing-val: " << singVals.transpose() << "\n";
 //   std::cout << "  * err:      " << ((jsvd.singularValues()-singVals)>1e-13*singVals.norm()).transpose() << "\n";
@@ -836,8 +827,7 @@
     RealScalar shift) {
   Index m = perm.size();
   RealScalar res = Literal(1);
-  for(Index i=0; i<m; ++i)
-  {
+  for (Index i = 0; i < m; ++i) {
     Index j = perm(i);
     // The following expression could be rewritten to involve only a single division,
     // but this would make the expression more sensitive to overflow.
@@ -850,81 +840,79 @@
 void BDCSVD<MatrixType, Options>::computeSingVals(const ArrayRef& col0, const ArrayRef& diag, const IndicesRef& perm,
                                                   VectorType& singVals, ArrayRef shifts, ArrayRef mus) {
   using std::abs;
-  using std::swap;
   using std::sqrt;
+  using std::swap;
 
   Index n = col0.size();
   Index actual_n = n;
   // Note that here actual_n is computed based on col0(i)==0 instead of diag(i)==0 as above
   // because 1) we have diag(i)==0 => col0(i)==0 and 2) if col0(i)==0, then diag(i) is already a singular value.
-  while(actual_n>1 && numext::is_exactly_zero(col0(actual_n - 1))) --actual_n;
+  while (actual_n > 1 && numext::is_exactly_zero(col0(actual_n - 1))) --actual_n;
 
-  for (Index k = 0; k < n; ++k)
-  {
-    if (numext::is_exactly_zero(col0(k)) || actual_n == 1)
-    {
+  for (Index k = 0; k < n; ++k) {
+    if (numext::is_exactly_zero(col0(k)) || actual_n == 1) {
       // if col0(k) == 0, then entry is deflated, so singular value is on diagonal
       // if actual_n==1, then the deflated problem is already diagonalized
-      singVals(k) = k==0 ? col0(0) : diag(k);
+      singVals(k) = k == 0 ? col0(0) : diag(k);
       mus(k) = Literal(0);
-      shifts(k) = k==0 ? col0(0) : diag(k);
+      shifts(k) = k == 0 ? col0(0) : diag(k);
       continue;
     }
 
     // otherwise, use secular equation to find singular value
     RealScalar left = diag(k);
-    RealScalar right; // was: = (k != actual_n-1) ? diag(k+1) : (diag(actual_n-1) + col0.matrix().norm());
-    if(k==actual_n-1)
-      right = (diag(actual_n-1) + col0.matrix().norm());
-    else
-    {
+    RealScalar right;  // was: = (k != actual_n-1) ? diag(k+1) : (diag(actual_n-1) + col0.matrix().norm());
+    if (k == actual_n - 1)
+      right = (diag(actual_n - 1) + col0.matrix().norm());
+    else {
       // Skip deflated singular values,
       // recall that at this stage we assume that z[j]!=0 and all entries for which z[j]==0 have been put aside.
       // This should be equivalent to using perm[]
-      Index l = k+1;
-      while(numext::is_exactly_zero(col0(l))) { ++l; eigen_internal_assert(l < actual_n); }
+      Index l = k + 1;
+      while (numext::is_exactly_zero(col0(l))) {
+        ++l;
+        eigen_internal_assert(l < actual_n);
+      }
       right = diag(l);
     }
 
     // first decide whether it's closer to the left end or the right end
-    RealScalar mid = left + (right-left) / Literal(2);
+    RealScalar mid = left + (right - left) / Literal(2);
     RealScalar fMid = secularEq(mid, col0, diag, perm, diag, Literal(0));
 #ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
-    std::cout << "right-left = " << right-left << "\n";
-//     std::cout << "fMid = " << fMid << " " << secularEq(mid-left, col0, diag, perm, ArrayXr(diag-left), left)
-//                            << " " << secularEq(mid-right, col0, diag, perm, ArrayXr(diag-right), right)   << "\n";
-    std::cout << "     = " << secularEq(left+RealScalar(0.000001)*(right-left), col0, diag, perm, diag, 0)
-              << " "       << secularEq(left+RealScalar(0.1)     *(right-left), col0, diag, perm, diag, 0)
-              << " "       << secularEq(left+RealScalar(0.2)     *(right-left), col0, diag, perm, diag, 0)
-              << " "       << secularEq(left+RealScalar(0.3)     *(right-left), col0, diag, perm, diag, 0)
-              << " "       << secularEq(left+RealScalar(0.4)     *(right-left), col0, diag, perm, diag, 0)
-              << " "       << secularEq(left+RealScalar(0.49)    *(right-left), col0, diag, perm, diag, 0)
-              << " "       << secularEq(left+RealScalar(0.5)     *(right-left), col0, diag, perm, diag, 0)
-              << " "       << secularEq(left+RealScalar(0.51)    *(right-left), col0, diag, perm, diag, 0)
-              << " "       << secularEq(left+RealScalar(0.6)     *(right-left), col0, diag, perm, diag, 0)
-              << " "       << secularEq(left+RealScalar(0.7)     *(right-left), col0, diag, perm, diag, 0)
-              << " "       << secularEq(left+RealScalar(0.8)     *(right-left), col0, diag, perm, diag, 0)
-              << " "       << secularEq(left+RealScalar(0.9)     *(right-left), col0, diag, perm, diag, 0)
-              << " "       << secularEq(left+RealScalar(0.999999)*(right-left), col0, diag, perm, diag, 0) << "\n";
+    std::cout << "right-left = " << right - left << "\n";
+    //     std::cout << "fMid = " << fMid << " " << secularEq(mid-left, col0, diag, perm, ArrayXr(diag-left), left)
+    //                            << " " << secularEq(mid-right, col0, diag, perm, ArrayXr(diag-right), right)   <<
+    //                            "\n";
+    std::cout << "     = " << secularEq(left + RealScalar(0.000001) * (right - left), col0, diag, perm, diag, 0) << " "
+              << secularEq(left + RealScalar(0.1) * (right - left), col0, diag, perm, diag, 0) << " "
+              << secularEq(left + RealScalar(0.2) * (right - left), col0, diag, perm, diag, 0) << " "
+              << secularEq(left + RealScalar(0.3) * (right - left), col0, diag, perm, diag, 0) << " "
+              << secularEq(left + RealScalar(0.4) * (right - left), col0, diag, perm, diag, 0) << " "
+              << secularEq(left + RealScalar(0.49) * (right - left), col0, diag, perm, diag, 0) << " "
+              << secularEq(left + RealScalar(0.5) * (right - left), col0, diag, perm, diag, 0) << " "
+              << secularEq(left + RealScalar(0.51) * (right - left), col0, diag, perm, diag, 0) << " "
+              << secularEq(left + RealScalar(0.6) * (right - left), col0, diag, perm, diag, 0) << " "
+              << secularEq(left + RealScalar(0.7) * (right - left), col0, diag, perm, diag, 0) << " "
+              << secularEq(left + RealScalar(0.8) * (right - left), col0, diag, perm, diag, 0) << " "
+              << secularEq(left + RealScalar(0.9) * (right - left), col0, diag, perm, diag, 0) << " "
+              << secularEq(left + RealScalar(0.999999) * (right - left), col0, diag, perm, diag, 0) << "\n";
 #endif
-    RealScalar shift = (k == actual_n-1 || fMid > Literal(0)) ? left : right;
+    RealScalar shift = (k == actual_n - 1 || fMid > Literal(0)) ? left : right;
 
     // measure everything relative to shift
-    Map<ArrayXr> diagShifted(m_workspace.data()+4*n, n);
+    Map<ArrayXr> diagShifted(m_workspace.data() + 4 * n, n);
     diagShifted = diag - shift;
 
-    if(k!=actual_n-1)
-    {
+    if (k != actual_n - 1) {
       // check that after the shift, f(mid) is still negative:
       RealScalar midShifted = (right - left) / RealScalar(2);
       // we can test exact equality here, because shift comes from `... ? left : right`
-      if(numext::equal_strict(shift, right))
-        midShifted = -midShifted;
+      if (numext::equal_strict(shift, right)) midShifted = -midShifted;
       RealScalar fMidShifted = secularEq(midShifted, col0, diag, perm, diagShifted, shift);
-      if(fMidShifted>0)
-      {
+      if (fMidShifted > 0) {
         // fMid was erroneous, fix it:
-        shift =  fMidShifted > Literal(0) ? left : right;
+        shift = fMidShifted > Literal(0) ? left : right;
         diagShifted = diag - shift;
       }
     }
@@ -932,38 +920,38 @@
     // initial guess
     RealScalar muPrev, muCur;
     // we can test exact equality here, because shift comes from `... ? left : right`
-    if (numext::equal_strict(shift, left))
-    {
+    if (numext::equal_strict(shift, left)) {
       muPrev = (right - left) * RealScalar(0.1);
-      if (k == actual_n-1) muCur = right - left;
-      else                 muCur = (right - left) * RealScalar(0.5);
-    }
-    else
-    {
+      if (k == actual_n - 1)
+        muCur = right - left;
+      else
+        muCur = (right - left) * RealScalar(0.5);
+    } else {
       muPrev = -(right - left) * RealScalar(0.1);
       muCur = -(right - left) * RealScalar(0.5);
     }
 
     RealScalar fPrev = secularEq(muPrev, col0, diag, perm, diagShifted, shift);
     RealScalar fCur = secularEq(muCur, col0, diag, perm, diagShifted, shift);
-    if (abs(fPrev) < abs(fCur))
-    {
+    if (abs(fPrev) < abs(fCur)) {
       swap(fPrev, fCur);
       swap(muPrev, muCur);
     }
 
     // rational interpolation: fit a function of the form a / mu + b through the two previous
     // iterates and use its zero to compute the next iterate
-    bool useBisection = fPrev*fCur>Literal(0);
-    while (!numext::is_exactly_zero(fCur) && abs(muCur - muPrev) > Literal(8) * NumTraits<RealScalar>::epsilon() * numext::maxi<RealScalar>(abs(muCur), abs(muPrev)) && abs(fCur - fPrev) > NumTraits<RealScalar>::epsilon() && !useBisection)
-    {
+    bool useBisection = fPrev * fCur > Literal(0);
+    while (!numext::is_exactly_zero(fCur) &&
+           abs(muCur - muPrev) >
+               Literal(8) * NumTraits<RealScalar>::epsilon() * numext::maxi<RealScalar>(abs(muCur), abs(muPrev)) &&
+           abs(fCur - fPrev) > NumTraits<RealScalar>::epsilon() && !useBisection) {
       ++m_numIters;
 
       // Find a and b such that the function f(mu) = a / mu + b matches the current and previous samples.
-      RealScalar a = (fCur - fPrev) / (Literal(1)/muCur - Literal(1)/muPrev);
+      RealScalar a = (fCur - fPrev) / (Literal(1) / muCur - Literal(1) / muPrev);
       RealScalar b = fCur - a / muCur;
       // And find mu such that f(mu)==0:
-      RealScalar muZero = -a/b;
+      RealScalar muZero = -a / b;
       RealScalar fZero = secularEq(muZero, col0, diag, perm, diagShifted, shift);
 
 #ifdef EIGEN_BDCSVD_SANITY_CHECKS
@@ -976,100 +964,95 @@
       fCur = fZero;
 
       // we can test exact equality here, because shift comes from `... ? left : right`
-      if (numext::equal_strict(shift, left)  && (muCur < Literal(0) || muCur > right - left)) useBisection = true;
+      if (numext::equal_strict(shift, left) && (muCur < Literal(0) || muCur > right - left)) useBisection = true;
       if (numext::equal_strict(shift, right) && (muCur < -(right - left) || muCur > Literal(0))) useBisection = true;
-      if (abs(fCur)>abs(fPrev)) useBisection = true;
+      if (abs(fCur) > abs(fPrev)) useBisection = true;
     }
 
     // fall back on bisection method if rational interpolation did not work
-    if (useBisection)
-    {
-#ifdef  EIGEN_BDCSVD_DEBUG_VERBOSE
+    if (useBisection) {
+#ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
       std::cout << "useBisection for k = " << k << ", actual_n = " << actual_n << "\n";
 #endif
       RealScalar leftShifted, rightShifted;
       // we can test exact equality here, because shift comes from `... ? left : right`
-      if (numext::equal_strict(shift, left))
-      {
+      if (numext::equal_strict(shift, left)) {
         // to avoid overflow, we must have mu > max(real_min, |z(k)|/sqrt(real_max)),
         // the factor 2 is to be more conservative
-        leftShifted = numext::maxi<RealScalar>( (std::numeric_limits<RealScalar>::min)(), Literal(2) * abs(col0(k)) / sqrt((std::numeric_limits<RealScalar>::max)()) );
+        leftShifted =
+            numext::maxi<RealScalar>((std::numeric_limits<RealScalar>::min)(),
+                                     Literal(2) * abs(col0(k)) / sqrt((std::numeric_limits<RealScalar>::max)()));
 
         // check that we did it right:
-        eigen_internal_assert( (numext::isfinite)( (col0(k)/leftShifted)*(col0(k)/(diag(k)+shift+leftShifted)) ) );
+        eigen_internal_assert(
+            (numext::isfinite)((col0(k) / leftShifted) * (col0(k) / (diag(k) + shift + leftShifted))));
         // I don't understand why the case k==0 would be special there:
         // if (k == 0) rightShifted = right - left; else
-        rightShifted = (k==actual_n-1) ? right : ((right - left) * RealScalar(0.51)); // theoretically we can take 0.5, but let's be safe
-      }
-      else
-      {
+        rightShifted = (k == actual_n - 1)
+                           ? right
+                           : ((right - left) * RealScalar(0.51));  // theoretically we can take 0.5, but let's be safe
+      } else {
         leftShifted = -(right - left) * RealScalar(0.51);
-        if(k+1<n)
-          rightShifted = -numext::maxi<RealScalar>( (std::numeric_limits<RealScalar>::min)(), abs(col0(k+1)) / sqrt((std::numeric_limits<RealScalar>::max)()) );
+        if (k + 1 < n)
+          rightShifted = -numext::maxi<RealScalar>((std::numeric_limits<RealScalar>::min)(),
+                                                   abs(col0(k + 1)) / sqrt((std::numeric_limits<RealScalar>::max)()));
         else
           rightShifted = -(std::numeric_limits<RealScalar>::min)();
       }
 
       RealScalar fLeft = secularEq(leftShifted, col0, diag, perm, diagShifted, shift);
-      eigen_internal_assert(fLeft<Literal(0));
+      eigen_internal_assert(fLeft < Literal(0));
 
 #if defined EIGEN_BDCSVD_DEBUG_VERBOSE || defined EIGEN_BDCSVD_SANITY_CHECKS || defined EIGEN_INTERNAL_DEBUGGING
       RealScalar fRight = secularEq(rightShifted, col0, diag, perm, diagShifted, shift);
 #endif
 
 #ifdef EIGEN_BDCSVD_SANITY_CHECKS
-      if(!(numext::isfinite)(fLeft))
+      if (!(numext::isfinite)(fLeft))
         std::cout << "f(" << leftShifted << ") =" << fLeft << " ; " << left << " " << shift << " " << right << "\n";
       eigen_internal_assert((numext::isfinite)(fLeft));
 
-      if(!(numext::isfinite)(fRight))
+      if (!(numext::isfinite)(fRight))
         std::cout << "f(" << rightShifted << ") =" << fRight << " ; " << left << " " << shift << " " << right << "\n";
-      // eigen_internal_assert((numext::isfinite)(fRight));
+        // eigen_internal_assert((numext::isfinite)(fRight));
 #endif
 
-#ifdef  EIGEN_BDCSVD_DEBUG_VERBOSE
-      if(!(fLeft * fRight<0))
-      {
-        std::cout << "f(leftShifted) using  leftShifted=" << leftShifted << " ;  diagShifted(1:10):" << diagShifted.head(10).transpose()  << "\n ; "
-                  << "left==shift=" << bool(left==shift) << " ; left-shift = " << (left-shift) << "\n";
-        std::cout << "k=" << k << ", " <<  fLeft << " * " << fRight << " == " << fLeft * fRight << "  ;  "
-                  << "[" << left << " .. " << right << "] -> [" << leftShifted << " " << rightShifted << "], shift=" << shift
-                  << " ,  f(right)=" << secularEq(0,     col0, diag, perm, diagShifted, shift)
-                           << " == " << secularEq(right, col0, diag, perm, diag, 0) << " == " << fRight << "\n";
+#ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
+      if (!(fLeft * fRight < 0)) {
+        std::cout << "f(leftShifted) using  leftShifted=" << leftShifted
+                  << " ;  diagShifted(1:10):" << diagShifted.head(10).transpose() << "\n ; "
+                  << "left==shift=" << bool(left == shift) << " ; left-shift = " << (left - shift) << "\n";
+        std::cout << "k=" << k << ", " << fLeft << " * " << fRight << " == " << fLeft * fRight << "  ;  "
+                  << "[" << left << " .. " << right << "] -> [" << leftShifted << " " << rightShifted
+                  << "], shift=" << shift << " ,  f(right)=" << secularEq(0, col0, diag, perm, diagShifted, shift)
+                  << " == " << secularEq(right, col0, diag, perm, diag, 0) << " == " << fRight << "\n";
       }
 #endif
       eigen_internal_assert(fLeft * fRight < Literal(0));
 
-      if(fLeft<Literal(0))
-      {
-        while (rightShifted - leftShifted > Literal(2) * NumTraits<RealScalar>::epsilon() * numext::maxi<RealScalar>(abs(leftShifted), abs(rightShifted)))
-        {
+      if (fLeft < Literal(0)) {
+        while (rightShifted - leftShifted > Literal(2) * NumTraits<RealScalar>::epsilon() *
+                                                numext::maxi<RealScalar>(abs(leftShifted), abs(rightShifted))) {
           RealScalar midShifted = (leftShifted + rightShifted) / Literal(2);
           fMid = secularEq(midShifted, col0, diag, perm, diagShifted, shift);
           eigen_internal_assert((numext::isfinite)(fMid));
 
-          if (fLeft * fMid < Literal(0))
-          {
+          if (fLeft * fMid < Literal(0)) {
             rightShifted = midShifted;
-          }
-          else
-          {
+          } else {
             leftShifted = midShifted;
             fLeft = fMid;
           }
         }
         muCur = (leftShifted + rightShifted) / Literal(2);
-      }
-      else
-      {
+      } else {
         // We have a problem as shifting on the left or right give either a positive or negative value
         // at the middle of [left,right]...
         // Instead fo abbording or entering an infinite loop,
         // let's just use the middle as the estimated zero-crossing:
         muCur = (right - left) * RealScalar(0.5);
         // we can test exact equality here, because shift comes from `... ? left : right`
-        if(numext::equal_strict(shift, right))
-          muCur = -muCur;
+        if (numext::equal_strict(shift, right)) muCur = -muCur;
       }
     }
 
@@ -1077,13 +1060,14 @@
     shifts[k] = shift;
     mus[k] = muCur;
 
-#ifdef  EIGEN_BDCSVD_DEBUG_VERBOSE
-    if(k+1<n)
-      std::cout << "found " << singVals[k] << " == " << shift << " + " << muCur << " from " << diag(k) << " .. "  << diag(k+1) << "\n";
+#ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
+    if (k + 1 < n)
+      std::cout << "found " << singVals[k] << " == " << shift << " + " << muCur << " from " << diag(k) << " .. "
+                << diag(k + 1) << "\n";
 #endif
 #ifdef EIGEN_BDCSVD_SANITY_CHECKS
-    eigen_internal_assert(k==0 || singVals[k]>=singVals[k-1]);
-    eigen_internal_assert(singVals[k]>=diag(k));
+    eigen_internal_assert(k == 0 || singVals[k] >= singVals[k - 1]);
+    eigen_internal_assert(singVals[k] >= diag(k));
 #endif
 
     // perturb singular value slightly if it equals diagonal entry to avoid division by zero later
@@ -1102,44 +1086,44 @@
   using std::sqrt;
   Index n = col0.size();
   Index m = perm.size();
-  if(m==0)
-  {
+  if (m == 0) {
     zhat.setZero();
     return;
   }
-  Index lastIdx = perm(m-1);
+  Index lastIdx = perm(m - 1);
   // The offset permits to skip deflated entries while computing zhat
-  for (Index k = 0; k < n; ++k)
-  {
-    if (numext::is_exactly_zero(col0(k))) // deflated
+  for (Index k = 0; k < n; ++k) {
+    if (numext::is_exactly_zero(col0(k)))  // deflated
       zhat(k) = Literal(0);
-    else
-    {
+    else {
       // see equation (3.6)
       RealScalar dk = diag(k);
       RealScalar prod = (singVals(lastIdx) + dk) * (mus(lastIdx) + (shifts(lastIdx) - dk));
 #ifdef EIGEN_BDCSVD_SANITY_CHECKS
-      if(prod<0) {
+      if (prod < 0) {
         std::cout << "k = " << k << " ;  z(k)=" << col0(k) << ", diag(k)=" << dk << "\n";
-        std::cout << "prod = " << "(" << singVals(lastIdx) << " + " << dk << ") * (" << mus(lastIdx) << " + (" << shifts(lastIdx) << " - " << dk << "))" << "\n";
-        std::cout << "     = " << singVals(lastIdx) + dk << " * " << mus(lastIdx) + (shifts(lastIdx) - dk) <<  "\n";
+        std::cout << "prod = "
+                  << "(" << singVals(lastIdx) << " + " << dk << ") * (" << mus(lastIdx) << " + (" << shifts(lastIdx)
+                  << " - " << dk << "))"
+                  << "\n";
+        std::cout << "     = " << singVals(lastIdx) + dk << " * " << mus(lastIdx) + (shifts(lastIdx) - dk) << "\n";
       }
-      eigen_internal_assert(prod>=0);
+      eigen_internal_assert(prod >= 0);
 #endif
 
-      for(Index l = 0; l<m; ++l)
-      {
+      for (Index l = 0; l < m; ++l) {
         Index i = perm(l);
-        if(i!=k)
-        {
+        if (i != k) {
 #ifdef EIGEN_BDCSVD_SANITY_CHECKS
-          if(i>=k && (l==0 || l-1>=m))
-          {
+          if (i >= k && (l == 0 || l - 1 >= m)) {
             std::cout << "Error in perturbCol0\n";
-            std::cout << "  " << k << "/" << n << " "  << l << "/" << m << " " << i << "/" << n << " ; " << col0(k) << " " << diag(k) << " "  <<  "\n";
-            std::cout << "  " <<diag(i) << "\n";
-            Index j = (i<k /*|| l==0*/) ? i : perm(l-1);
-            std::cout << "  " << "j=" << j << "\n";
+            std::cout << "  " << k << "/" << n << " " << l << "/" << m << " " << i << "/" << n << " ; " << col0(k)
+                      << " " << diag(k) << " "
+                      << "\n";
+            std::cout << "  " << diag(i) << "\n";
+            Index j = (i < k /*|| l==0*/) ? i : perm(l - 1);
+            std::cout << "  "
+                      << "j=" << j << "\n";
           }
 #endif
           // Avoid index out of bounds.
@@ -1149,27 +1133,31 @@
             prod = 0;
             break;
           }
-          Index j = i<k ? i : l > 0 ? perm(l-1) : i;
+          Index j = i < k ? i : l > 0 ? perm(l - 1) : i;
 #ifdef EIGEN_BDCSVD_SANITY_CHECKS
-          if(!(dk!=Literal(0) || diag(i)!=Literal(0)))
-          {
+          if (!(dk != Literal(0) || diag(i) != Literal(0))) {
             std::cout << "k=" << k << ", i=" << i << ", l=" << l << ", perm.size()=" << perm.size() << "\n";
           }
-          eigen_internal_assert(dk!=Literal(0) || diag(i)!=Literal(0));
+          eigen_internal_assert(dk != Literal(0) || diag(i) != Literal(0));
 #endif
-          prod *= ((singVals(j)+dk) / ((diag(i)+dk))) * ((mus(j)+(shifts(j)-dk)) / ((diag(i)-dk)));
+          prod *= ((singVals(j) + dk) / ((diag(i) + dk))) * ((mus(j) + (shifts(j) - dk)) / ((diag(i) - dk)));
 #ifdef EIGEN_BDCSVD_SANITY_CHECKS
-          eigen_internal_assert(prod>=0);
+          eigen_internal_assert(prod >= 0);
 #endif
 #ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
-          if(i!=k && numext::abs(((singVals(j)+dk)*(mus(j)+(shifts(j)-dk)))/((diag(i)+dk)*(diag(i)-dk)) - 1) > 0.9 )
-            std::cout << "     " << ((singVals(j)+dk)*(mus(j)+(shifts(j)-dk)))/((diag(i)+dk)*(diag(i)-dk)) << " == (" << (singVals(j)+dk) << " * " << (mus(j)+(shifts(j)-dk))
-                       << ") / (" << (diag(i)+dk) << " * " << (diag(i)-dk) << ")\n";
+          if (i != k &&
+              numext::abs(((singVals(j) + dk) * (mus(j) + (shifts(j) - dk))) / ((diag(i) + dk) * (diag(i) - dk)) - 1) >
+                  0.9)
+            std::cout << "     "
+                      << ((singVals(j) + dk) * (mus(j) + (shifts(j) - dk))) / ((diag(i) + dk) * (diag(i) - dk))
+                      << " == (" << (singVals(j) + dk) << " * " << (mus(j) + (shifts(j) - dk)) << ") / ("
+                      << (diag(i) + dk) << " * " << (diag(i) - dk) << ")\n";
 #endif
         }
       }
 #ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
-      std::cout << "zhat(" << k << ") =  sqrt( " << prod << ")  ;  " << (singVals(lastIdx) + dk) << " * " << mus(lastIdx) + shifts(lastIdx) << " - " << dk << "\n";
+      std::cout << "zhat(" << k << ") =  sqrt( " << prod << ")  ;  " << (singVals(lastIdx) + dk) << " * "
+                << mus(lastIdx) + shifts(lastIdx) << " - " << dk << "\n";
 #endif
       RealScalar tmp = sqrt(prod);
 #ifdef EIGEN_BDCSVD_SANITY_CHECKS
@@ -1188,65 +1176,58 @@
   Index n = zhat.size();
   Index m = perm.size();
 
-  for (Index k = 0; k < n; ++k)
-  {
-    if (numext::is_exactly_zero(zhat(k)))
-    {
-      U.col(k) = VectorType::Unit(n+1, k);
+  for (Index k = 0; k < n; ++k) {
+    if (numext::is_exactly_zero(zhat(k))) {
+      U.col(k) = VectorType::Unit(n + 1, k);
       if (m_compV) V.col(k) = VectorType::Unit(n, k);
-    }
-    else
-    {
+    } else {
       U.col(k).setZero();
-      for(Index l=0;l<m;++l)
-      {
+      for (Index l = 0; l < m; ++l) {
         Index i = perm(l);
-        U(i,k) = zhat(i)/(((diag(i) - shifts(k)) - mus(k)) )/( (diag(i) + singVals[k]));
+        U(i, k) = zhat(i) / (((diag(i) - shifts(k)) - mus(k))) / ((diag(i) + singVals[k]));
       }
-      U(n,k) = Literal(0);
+      U(n, k) = Literal(0);
       U.col(k).normalize();
 
-      if (m_compV)
-      {
+      if (m_compV) {
         V.col(k).setZero();
-        for(Index l=1;l<m;++l)
-        {
+        for (Index l = 1; l < m; ++l) {
           Index i = perm(l);
-          V(i,k) = diag(i) * zhat(i) / (((diag(i) - shifts(k)) - mus(k)) )/( (diag(i) + singVals[k]));
+          V(i, k) = diag(i) * zhat(i) / (((diag(i) - shifts(k)) - mus(k))) / ((diag(i) + singVals[k]));
         }
-        V(0,k) = Literal(-1);
+        V(0, k) = Literal(-1);
         V.col(k).normalize();
       }
     }
   }
-  U.col(n) = VectorType::Unit(n+1, n);
+  U.col(n) = VectorType::Unit(n + 1, n);
 }
 
 // page 12_13
 // i >= 1, di almost null and zi non null.
 // We use a rotation to zero out zi applied to the left of M
 template <typename MatrixType, int Options>
-void BDCSVD<MatrixType, Options>::deflation43(Index firstCol, Index shift, Index i,
-                                              Index size) {
+void BDCSVD<MatrixType, Options>::deflation43(Index firstCol, Index shift, Index i, Index size) {
   using std::abs;
-  using std::sqrt;
   using std::pow;
+  using std::sqrt;
   Index start = firstCol + shift;
   RealScalar c = m_computed(start, start);
-  RealScalar s = m_computed(start+i, start);
-  RealScalar r = numext::hypot(c,s);
-  if (numext::is_exactly_zero(r))
-  {
-    m_computed(start+i, start+i) = Literal(0);
+  RealScalar s = m_computed(start + i, start);
+  RealScalar r = numext::hypot(c, s);
+  if (numext::is_exactly_zero(r)) {
+    m_computed(start + i, start + i) = Literal(0);
     return;
   }
-  m_computed(start,start) = r;
-  m_computed(start+i, start) = Literal(0);
-  m_computed(start+i, start+i) = Literal(0);
+  m_computed(start, start) = r;
+  m_computed(start + i, start) = Literal(0);
+  m_computed(start + i, start + i) = Literal(0);
 
-  JacobiRotation<RealScalar> J(c/r,-s/r);
-  if (m_compU)  m_naiveU.middleRows(firstCol, size+1).applyOnTheRight(firstCol, firstCol+i, J);
-  else          m_naiveU.applyOnTheRight(firstCol, firstCol+i, J);
+  JacobiRotation<RealScalar> J(c / r, -s / r);
+  if (m_compU)
+    m_naiveU.middleRows(firstCol, size + 1).applyOnTheRight(firstCol, firstCol + i, J);
+  else
+    m_naiveU.applyOnTheRight(firstCol, firstCol + i, J);
 }  // end deflation 43
 
 // page 13
@@ -1254,60 +1235,58 @@
 // We apply two rotations to have zj = 0;
 // TODO deflation44 is still broken and not properly tested
 template <typename MatrixType, int Options>
-void BDCSVD<MatrixType, Options>::deflation44(Index firstColu, Index firstColm, Index firstRowW,
-                                              Index firstColW, Index i, Index j,
-                                              Index size) {
+void BDCSVD<MatrixType, Options>::deflation44(Index firstColu, Index firstColm, Index firstRowW, Index firstColW,
+                                              Index i, Index j, Index size) {
   using std::abs;
-  using std::sqrt;
   using std::conj;
   using std::pow;
-  RealScalar c = m_computed(firstColm+i, firstColm);
-  RealScalar s = m_computed(firstColm+j, firstColm);
+  using std::sqrt;
+  RealScalar c = m_computed(firstColm + i, firstColm);
+  RealScalar s = m_computed(firstColm + j, firstColm);
   RealScalar r = sqrt(numext::abs2(c) + numext::abs2(s));
-#ifdef  EIGEN_BDCSVD_DEBUG_VERBOSE
+#ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
   std::cout << "deflation 4.4: " << i << "," << j << " -> " << c << " " << s << " " << r << " ; "
-    << m_computed(firstColm + i-1, firstColm)  << " "
-    << m_computed(firstColm + i, firstColm)  << " "
-    << m_computed(firstColm + i+1, firstColm) << " "
-    << m_computed(firstColm + i+2, firstColm) << "\n";
-  std::cout << m_computed(firstColm + i-1, firstColm + i-1)  << " "
-    << m_computed(firstColm + i, firstColm+i)  << " "
-    << m_computed(firstColm + i+1, firstColm+i+1) << " "
-    << m_computed(firstColm + i+2, firstColm+i+2) << "\n";
+            << m_computed(firstColm + i - 1, firstColm) << " " << m_computed(firstColm + i, firstColm) << " "
+            << m_computed(firstColm + i + 1, firstColm) << " " << m_computed(firstColm + i + 2, firstColm) << "\n";
+  std::cout << m_computed(firstColm + i - 1, firstColm + i - 1) << " " << m_computed(firstColm + i, firstColm + i)
+            << " " << m_computed(firstColm + i + 1, firstColm + i + 1) << " "
+            << m_computed(firstColm + i + 2, firstColm + i + 2) << "\n";
 #endif
-  if (numext::is_exactly_zero(r))
-  {
+  if (numext::is_exactly_zero(r)) {
     m_computed(firstColm + i, firstColm + i) = m_computed(firstColm + j, firstColm + j);
     return;
   }
-  c/=r;
-  s/=r;
+  c /= r;
+  s /= r;
   m_computed(firstColm + i, firstColm) = r;
   m_computed(firstColm + j, firstColm + j) = m_computed(firstColm + i, firstColm + i);
   m_computed(firstColm + j, firstColm) = Literal(0);
 
-  JacobiRotation<RealScalar> J(c,-s);
-  if (m_compU)  m_naiveU.middleRows(firstColu, size+1).applyOnTheRight(firstColu + i, firstColu + j, J);
-  else          m_naiveU.applyOnTheRight(firstColu+i, firstColu+j, J);
-  if (m_compV)  m_naiveV.middleRows(firstRowW, size).applyOnTheRight(firstColW + i, firstColW + j, J);
+  JacobiRotation<RealScalar> J(c, -s);
+  if (m_compU)
+    m_naiveU.middleRows(firstColu, size + 1).applyOnTheRight(firstColu + i, firstColu + j, J);
+  else
+    m_naiveU.applyOnTheRight(firstColu + i, firstColu + j, J);
+  if (m_compV) m_naiveV.middleRows(firstRowW, size).applyOnTheRight(firstColW + i, firstColW + j, J);
 }  // end deflation 44
 
 // acts on block from (firstCol+shift, firstCol+shift) to (lastCol+shift, lastCol+shift) [inclusive]
 template <typename MatrixType, int Options>
-void BDCSVD<MatrixType, Options>::deflation(Index firstCol, Index lastCol, Index k,
-                                            Index firstRowW, Index firstColW, Index shift) {
-  using std::sqrt;
+void BDCSVD<MatrixType, Options>::deflation(Index firstCol, Index lastCol, Index k, Index firstRowW, Index firstColW,
+                                            Index shift) {
   using std::abs;
+  using std::sqrt;
   const Index length = lastCol + 1 - firstCol;
 
-  Block<MatrixXr,Dynamic,1> col0(m_computed, firstCol+shift, firstCol+shift, length, 1);
+  Block<MatrixXr, Dynamic, 1> col0(m_computed, firstCol + shift, firstCol + shift, length, 1);
   Diagonal<MatrixXr> fulldiag(m_computed);
-  VectorBlock<Diagonal<MatrixXr>,Dynamic> diag(fulldiag, firstCol+shift, length);
+  VectorBlock<Diagonal<MatrixXr>, Dynamic> diag(fulldiag, firstCol + shift, length);
 
   const RealScalar considerZero = (std::numeric_limits<RealScalar>::min)();
-  RealScalar maxDiag = diag.tail((std::max)(Index(1),length-1)).cwiseAbs().maxCoeff();
-  RealScalar epsilon_strict = numext::maxi<RealScalar>(considerZero,NumTraits<RealScalar>::epsilon() * maxDiag);
-  RealScalar epsilon_coarse = Literal(8) * NumTraits<RealScalar>::epsilon() * numext::maxi<RealScalar>(col0.cwiseAbs().maxCoeff(), maxDiag);
+  RealScalar maxDiag = diag.tail((std::max)(Index(1), length - 1)).cwiseAbs().maxCoeff();
+  RealScalar epsilon_strict = numext::maxi<RealScalar>(considerZero, NumTraits<RealScalar>::epsilon() * maxDiag);
+  RealScalar epsilon_coarse =
+      Literal(8) * NumTraits<RealScalar>::epsilon() * numext::maxi<RealScalar>(col0.cwiseAbs().maxCoeff(), maxDiag);
 
 #ifdef EIGEN_BDCSVD_SANITY_CHECKS
   eigen_internal_assert(m_naiveU.allFinite());
@@ -1315,35 +1294,35 @@
   eigen_internal_assert(m_computed.allFinite());
 #endif
 
-#ifdef  EIGEN_BDCSVD_DEBUG_VERBOSE
-  std::cout << "\ndeflate:" << diag.head(k+1).transpose() << "  |  " << diag.segment(k+1,length-k-1).transpose() << "\n";
+#ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
+  std::cout << "\ndeflate:" << diag.head(k + 1).transpose() << "  |  "
+            << diag.segment(k + 1, length - k - 1).transpose() << "\n";
 #endif
 
-  //condition 4.1
-  if (diag(0) < epsilon_coarse)
-  {
-#ifdef  EIGEN_BDCSVD_DEBUG_VERBOSE
+  // condition 4.1
+  if (diag(0) < epsilon_coarse) {
+#ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
     std::cout << "deflation 4.1, because " << diag(0) << " < " << epsilon_coarse << "\n";
 #endif
     diag(0) = epsilon_coarse;
   }
 
-  //condition 4.2
-  for (Index i=1;i<length;++i)
-    if (abs(col0(i)) < epsilon_strict)
-    {
-#ifdef  EIGEN_BDCSVD_DEBUG_VERBOSE
-      std::cout << "deflation 4.2, set z(" << i << ") to zero because " << abs(col0(i)) << " < " << epsilon_strict << "  (diag(" << i << ")=" << diag(i) << ")\n";
+  // condition 4.2
+  for (Index i = 1; i < length; ++i)
+    if (abs(col0(i)) < epsilon_strict) {
+#ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
+      std::cout << "deflation 4.2, set z(" << i << ") to zero because " << abs(col0(i)) << " < " << epsilon_strict
+                << "  (diag(" << i << ")=" << diag(i) << ")\n";
 #endif
       col0(i) = Literal(0);
     }
 
-  //condition 4.3
-  for (Index i=1;i<length; i++)
-    if (diag(i) < epsilon_coarse)
-    {
-#ifdef  EIGEN_BDCSVD_DEBUG_VERBOSE
-      std::cout << "deflation 4.3, cancel z(" << i << ")=" << col0(i) << " because diag(" << i << ")=" << diag(i) << " < " << epsilon_coarse << "\n";
+  // condition 4.3
+  for (Index i = 1; i < length; i++)
+    if (diag(i) < epsilon_coarse) {
+#ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
+      std::cout << "deflation 4.3, cancel z(" << i << ")=" << col0(i) << " because diag(" << i << ")=" << diag(i)
+                << " < " << epsilon_coarse << "\n";
 #endif
       deflation43(firstCol, shift, i, length);
     }
@@ -1360,72 +1339,76 @@
   {
     // Check for total deflation:
     // If we have a total deflation, then we have to consider col0(0)==diag(0) as a singular value during sorting.
-    const bool total_deflation = (col0.tail(length-1).array().abs()<considerZero).all();
+    const bool total_deflation = (col0.tail(length - 1).array().abs() < considerZero).all();
 
     // Sort the diagonal entries, since diag(1:k-1) and diag(k:length) are already sorted, let's do a sorted merge.
     // First, compute the respective permutation.
-    Index *permutation = m_workspaceI.data();
+    Index* permutation = m_workspaceI.data();
     {
       permutation[0] = 0;
       Index p = 1;
 
       // Move deflated diagonal entries at the end.
-      for(Index i=1; i<length; ++i)
-        if(abs(diag(i))<considerZero)
-          permutation[p++] = i;
+      for (Index i = 1; i < length; ++i)
+        if (abs(diag(i)) < considerZero) permutation[p++] = i;
 
-      Index i=1, j=k+1;
-      for( ; p < length; ++p)
-      {
-             if (i > k)             permutation[p] = j++;
-        else if (j >= length)       permutation[p] = i++;
-        else if (diag(i) < diag(j)) permutation[p] = j++;
-        else                        permutation[p] = i++;
+      Index i = 1, j = k + 1;
+      for (; p < length; ++p) {
+        if (i > k)
+          permutation[p] = j++;
+        else if (j >= length)
+          permutation[p] = i++;
+        else if (diag(i) < diag(j))
+          permutation[p] = j++;
+        else
+          permutation[p] = i++;
       }
     }
 
     // If we have a total deflation, then we have to insert diag(0) at the right place
-    if(total_deflation)
-    {
-      for(Index i=1; i<length; ++i)
-      {
+    if (total_deflation) {
+      for (Index i = 1; i < length; ++i) {
         Index pi = permutation[i];
-        if(abs(diag(pi))<considerZero || diag(0)<diag(pi))
-          permutation[i-1] = permutation[i];
-        else
-        {
-          permutation[i-1] = 0;
+        if (abs(diag(pi)) < considerZero || diag(0) < diag(pi))
+          permutation[i - 1] = permutation[i];
+        else {
+          permutation[i - 1] = 0;
           break;
         }
       }
     }
 
     // Current index of each col, and current column of each index
-    Index *realInd = m_workspaceI.data()+length;
-    Index *realCol = m_workspaceI.data()+2*length;
+    Index* realInd = m_workspaceI.data() + length;
+    Index* realCol = m_workspaceI.data() + 2 * length;
 
-    for(int pos = 0; pos< length; pos++)
-    {
+    for (int pos = 0; pos < length; pos++) {
       realCol[pos] = pos;
       realInd[pos] = pos;
     }
 
-    for(Index i = total_deflation?0:1; i < length; i++)
-    {
-      const Index pi = permutation[length - (total_deflation ? i+1 : i)];
+    for (Index i = total_deflation ? 0 : 1; i < length; i++) {
+      const Index pi = permutation[length - (total_deflation ? i + 1 : i)];
       const Index J = realCol[pi];
 
       using std::swap;
       // swap diagonal and first column entries:
       swap(diag(i), diag(J));
-      if(i!=0 && J!=0) swap(col0(i), col0(J));
+      if (i != 0 && J != 0) swap(col0(i), col0(J));
 
       // change columns
-      if (m_compU) m_naiveU.col(firstCol+i).segment(firstCol, length + 1).swap(m_naiveU.col(firstCol+J).segment(firstCol, length + 1));
-      else         m_naiveU.col(firstCol+i).segment(0, 2)                .swap(m_naiveU.col(firstCol+J).segment(0, 2));
-      if (m_compV) m_naiveV.col(firstColW + i).segment(firstRowW, length).swap(m_naiveV.col(firstColW + J).segment(firstRowW, length));
+      if (m_compU)
+        m_naiveU.col(firstCol + i)
+            .segment(firstCol, length + 1)
+            .swap(m_naiveU.col(firstCol + J).segment(firstCol, length + 1));
+      else
+        m_naiveU.col(firstCol + i).segment(0, 2).swap(m_naiveU.col(firstCol + J).segment(0, 2));
+      if (m_compV)
+        m_naiveV.col(firstColW + i)
+            .segment(firstRowW, length)
+            .swap(m_naiveV.col(firstColW + J).segment(firstRowW, length));
 
-      //update real pos
+      // update real pos
       const Index realI = realInd[i];
       realCol[realI] = J;
       realCol[pi] = i;
@@ -1438,24 +1421,25 @@
   std::cout << "      : " << col0.transpose() << "\n\n";
 #endif
 
-  //condition 4.4
+  // condition 4.4
   {
-    Index i = length-1;
-    while(i>0 && (abs(diag(i))<considerZero || abs(col0(i))<considerZero)) --i;
-    for(; i>1;--i)
-       if( (diag(i) - diag(i-1)) < NumTraits<RealScalar>::epsilon()*maxDiag )
-      {
+    Index i = length - 1;
+    while (i > 0 && (abs(diag(i)) < considerZero || abs(col0(i)) < considerZero)) --i;
+    for (; i > 1; --i)
+      if ((diag(i) - diag(i - 1)) < NumTraits<RealScalar>::epsilon() * maxDiag) {
 #ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
-        std::cout << "deflation 4.4 with i = " << i << " because " << diag(i) << " - " << diag(i-1) << " == " << (diag(i) - diag(i-1)) << " < " << NumTraits<RealScalar>::epsilon()*/*diag(i)*/maxDiag << "\n";
+        std::cout << "deflation 4.4 with i = " << i << " because " << diag(i) << " - " << diag(i - 1)
+                  << " == " << (diag(i) - diag(i - 1)) << " < "
+                  << NumTraits<RealScalar>::epsilon() * /*diag(i)*/ maxDiag << "\n";
 #endif
-        eigen_internal_assert(abs(diag(i) - diag(i-1))<epsilon_coarse && " diagonal entries are not properly sorted");
-        deflation44(firstCol, firstCol + shift, firstRowW, firstColW, i-1, i, length);
+        eigen_internal_assert(abs(diag(i) - diag(i - 1)) < epsilon_coarse &&
+                              " diagonal entries are not properly sorted");
+        deflation44(firstCol, firstCol + shift, firstRowW, firstColW, i - 1, i, length);
       }
   }
 
 #ifdef EIGEN_BDCSVD_SANITY_CHECKS
-  for(Index j=2;j<length;++j)
-    eigen_internal_assert(diag(j-1)<=diag(j) || abs(diag(j))<considerZero);
+  for (Index j = 2; j < length; ++j) eigen_internal_assert(diag(j - 1) <= diag(j) || abs(diag(j)) < considerZero);
 #endif
 
 #ifdef EIGEN_BDCSVD_SANITY_CHECKS
@@ -1466,11 +1450,11 @@
 }  // end deflation
 
 /** \svd_module
-  *
-  * \return the singular value decomposition of \c *this computed by Divide & Conquer algorithm
-  *
-  * \sa class BDCSVD
-  */
+ *
+ * \return the singular value decomposition of \c *this computed by Divide & Conquer algorithm
+ *
+ * \sa class BDCSVD
+ */
 template <typename Derived>
 template <int Options>
 BDCSVD<typename MatrixBase<Derived>::PlainObject, Options> MatrixBase<Derived>::bdcSvd() const {
@@ -1490,6 +1474,6 @@
   return BDCSVD<PlainObject, Options>(*this, computationOptions);
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
 #endif
diff --git a/Eigen/src/SVD/BDCSVD_LAPACKE.h b/Eigen/src/SVD/BDCSVD_LAPACKE.h
index 9a1e843..89d5cbd 100644
--- a/Eigen/src/SVD/BDCSVD_LAPACKE.h
+++ b/Eigen/src/SVD/BDCSVD_LAPACKE.h
@@ -54,50 +54,58 @@
   typedef typename SVD::Scalar Scalar;
   typedef typename SVD::RealScalar RealScalar;
 
-public:
+ public:
   // construct this by moving from a parent object
   BDCSVD_LAPACKE(SVD&& svd) : SVD(std::move(svd)) {}
 
   void compute_impl_lapacke(const MatrixType& matrix, unsigned int computationOptions) {
-
     SVD::allocate(matrix.rows(), matrix.cols(), computationOptions);
 
     SVD::m_nonzeroSingularValues = SVD::m_diagSize;
 
     // prepare arguments to ?gesdd
     const lapack_int matrix_order = lapack_storage_of(matrix);
-    const char jobz  = (SVD::m_computeFullU || SVD::m_computeFullV) ? 'A' : (SVD::m_computeThinU || SVD::m_computeThinV) ? 'S' : 'N';
+    const char jobz = (SVD::m_computeFullU || SVD::m_computeFullV)   ? 'A'
+                      : (SVD::m_computeThinU || SVD::m_computeThinV) ? 'S'
+                                                                     : 'N';
     const lapack_int u_cols = (jobz == 'A') ? to_lapack(SVD::rows()) : (jobz == 'S') ? to_lapack(SVD::diagSize()) : 1;
     const lapack_int vt_rows = (jobz == 'A') ? to_lapack(SVD::cols()) : (jobz == 'S') ? to_lapack(SVD::diagSize()) : 1;
     lapack_int ldu, ldvt;
     Scalar *u, *vt, dummy;
     MatrixType localU;
-    if (SVD::computeU() && !(SVD::m_computeThinU && SVD::m_computeFullV) ) {
-      ldu  = to_lapack(SVD::m_matrixU.outerStride());
-      u    = SVD::m_matrixU.data();
+    if (SVD::computeU() && !(SVD::m_computeThinU && SVD::m_computeFullV)) {
+      ldu = to_lapack(SVD::m_matrixU.outerStride());
+      u = SVD::m_matrixU.data();
     } else if (SVD::computeV()) {
       localU.resize(SVD::rows(), u_cols);
-      ldu  = to_lapack(localU.outerStride());
-      u    = localU.data();
-    } else { ldu=1; u=&dummy; }
+      ldu = to_lapack(localU.outerStride());
+      u = localU.data();
+    } else {
+      ldu = 1;
+      u = &dummy;
+    }
     MatrixType localV;
     if (SVD::computeU() || SVD::computeV()) {
       localV.resize(vt_rows, SVD::cols());
-      ldvt  = to_lapack(localV.outerStride());
-      vt   = localV.data();
-    } else { ldvt=1; vt=&dummy; }
-    MatrixType temp; temp = matrix;
+      ldvt = to_lapack(localV.outerStride());
+      vt = localV.data();
+    } else {
+      ldvt = 1;
+      vt = &dummy;
+    }
+    MatrixType temp;
+    temp = matrix;
 
     // actual call to ?gesdd
-    lapack_int info = gesdd( matrix_order, jobz, to_lapack(SVD::rows()), to_lapack(SVD::cols()),
-                             to_lapack(temp.data()), to_lapack(temp.outerStride()), (RealScalar*)SVD::m_singularValues.data(),
-                             to_lapack(u), ldu, to_lapack(vt), ldvt);
+    lapack_int info = gesdd(matrix_order, jobz, to_lapack(SVD::rows()), to_lapack(SVD::cols()), to_lapack(temp.data()),
+                            to_lapack(temp.outerStride()), (RealScalar*)SVD::m_singularValues.data(), to_lapack(u), ldu,
+                            to_lapack(vt), ldvt);
 
     // Check the result of the LAPACK call
     if (info < 0 || !SVD::m_singularValues.allFinite()) {
       // this includes info == -4 => NaN entry in A
       SVD::m_info = InvalidInput;
-    } else if (info > 0 ) {
+    } else if (info > 0) {
       SVD::m_info = NoConvergence;
     } else {
       SVD::m_info = Success;
@@ -112,9 +120,9 @@
   }
 };
 
-template<typename MatrixType_, int Options>
-BDCSVD<MatrixType_, Options>& BDCSVD_wrapper(BDCSVD<MatrixType_, Options>& svd, const MatrixType_& matrix, int computationOptions)
-{
+template <typename MatrixType_, int Options>
+BDCSVD<MatrixType_, Options>& BDCSVD_wrapper(BDCSVD<MatrixType_, Options>& svd, const MatrixType_& matrix,
+                                             int computationOptions) {
   // we need to move to the wrapper type and back
   BDCSVD_LAPACKE<MatrixType_, Options> tmpSvd(std::move(svd));
   tmpSvd.compute_impl_lapacke(matrix, computationOptions);
@@ -122,25 +130,26 @@
   return svd;
 }
 
-} // end namespace lapacke_helpers
+}  // end namespace lapacke_helpers
 
-} // end namespace internal
+}  // end namespace internal
 
-#define EIGEN_LAPACKE_SDD(EIGTYPE, EIGCOLROW, OPTIONS) \
-template<> inline \
-BDCSVD<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic>, OPTIONS>& \
-BDCSVD<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic>, OPTIONS>::compute_impl(const Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic>& matrix, unsigned int computationOptions) {\
-  return internal::lapacke_helpers::BDCSVD_wrapper(*this, matrix, computationOptions); \
-}
+#define EIGEN_LAPACKE_SDD(EIGTYPE, EIGCOLROW, OPTIONS)                                                                 \
+  template <>                                                                                                          \
+  inline BDCSVD<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic>, OPTIONS>&                              \
+  BDCSVD<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic>, OPTIONS>::compute_impl(                       \
+      const Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic>& matrix, unsigned int computationOptions) { \
+    return internal::lapacke_helpers::BDCSVD_wrapper(*this, matrix, computationOptions);                               \
+  }
 
-#define EIGEN_LAPACK_SDD_OPTIONS(OPTIONS) \
-  EIGEN_LAPACKE_SDD(double,   ColMajor, OPTIONS) \
-  EIGEN_LAPACKE_SDD(float,    ColMajor, OPTIONS) \
+#define EIGEN_LAPACK_SDD_OPTIONS(OPTIONS)        \
+  EIGEN_LAPACKE_SDD(double, ColMajor, OPTIONS)   \
+  EIGEN_LAPACKE_SDD(float, ColMajor, OPTIONS)    \
   EIGEN_LAPACKE_SDD(dcomplex, ColMajor, OPTIONS) \
   EIGEN_LAPACKE_SDD(scomplex, ColMajor, OPTIONS) \
-\
-  EIGEN_LAPACKE_SDD(double,   RowMajor, OPTIONS) \
-  EIGEN_LAPACKE_SDD(float,    RowMajor, OPTIONS) \
+                                                 \
+  EIGEN_LAPACKE_SDD(double, RowMajor, OPTIONS)   \
+  EIGEN_LAPACKE_SDD(float, RowMajor, OPTIONS)    \
   EIGEN_LAPACKE_SDD(dcomplex, RowMajor, OPTIONS) \
   EIGEN_LAPACKE_SDD(scomplex, RowMajor, OPTIONS)
 
@@ -158,6 +167,6 @@
 
 #undef EIGEN_LAPACKE_SDD
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_BDCSVD_LAPACKE_H
+#endif  // EIGEN_BDCSVD_LAPACKE_H
diff --git a/Eigen/src/SVD/JacobiSVD.h b/Eigen/src/SVD/JacobiSVD.h
index 6b77d28..aec1931 100644
--- a/Eigen/src/SVD/JacobiSVD.h
+++ b/Eigen/src/SVD/JacobiSVD.h
@@ -32,18 +32,15 @@
 
 enum { PreconditionIfMoreColsThanRows, PreconditionIfMoreRowsThanCols };
 
-template<typename MatrixType, int QRPreconditioner, int Case>
-struct qr_preconditioner_should_do_anything
-{
-  enum { a = MatrixType::RowsAtCompileTime != Dynamic &&
-             MatrixType::ColsAtCompileTime != Dynamic &&
-             MatrixType::ColsAtCompileTime <= MatrixType::RowsAtCompileTime,
-         b = MatrixType::RowsAtCompileTime != Dynamic &&
-             MatrixType::ColsAtCompileTime != Dynamic &&
-             MatrixType::RowsAtCompileTime <= MatrixType::ColsAtCompileTime,
-         ret = !( (QRPreconditioner == NoQRPreconditioner) ||
-                  (Case == PreconditionIfMoreColsThanRows && bool(a)) ||
-                  (Case == PreconditionIfMoreRowsThanCols && bool(b)) )
+template <typename MatrixType, int QRPreconditioner, int Case>
+struct qr_preconditioner_should_do_anything {
+  enum {
+    a = MatrixType::RowsAtCompileTime != Dynamic && MatrixType::ColsAtCompileTime != Dynamic &&
+        MatrixType::ColsAtCompileTime <= MatrixType::RowsAtCompileTime,
+    b = MatrixType::RowsAtCompileTime != Dynamic && MatrixType::ColsAtCompileTime != Dynamic &&
+        MatrixType::RowsAtCompileTime <= MatrixType::ColsAtCompileTime,
+    ret = !((QRPreconditioner == NoQRPreconditioner) || (Case == PreconditionIfMoreColsThanRows && bool(a)) ||
+            (Case == PreconditionIfMoreRowsThanCols && bool(b)))
   };
 };
 
@@ -72,8 +69,7 @@
   typedef Matrix<Scalar, 1, WorkspaceSize, RowMajor, 1, MaxWorkspaceSize> WorkspaceType;
 
   void allocate(const SVDType& svd) {
-    if (svd.rows() != m_qr.rows() || svd.cols() != m_qr.cols())
-    {
+    if (svd.rows() != m_qr.rows() || svd.cols() != m_qr.cols()) {
       internal::destroy_at(&m_qr);
       internal::construct_at(&m_qr, svd.rows(), svd.cols());
     }
@@ -81,18 +77,17 @@
   }
 
   bool run(SVDType& svd, const MatrixType& matrix) {
-    if(matrix.rows() > matrix.cols())
-    {
+    if (matrix.rows() > matrix.cols()) {
       m_qr.compute(matrix);
-      svd.m_workMatrix = m_qr.matrixQR().block(0,0,matrix.cols(),matrix.cols()).template triangularView<Upper>();
-      if(svd.m_computeFullU) m_qr.matrixQ().evalTo(svd.m_matrixU, m_workspace);
-      if(svd.computeV()) svd.m_matrixV = m_qr.colsPermutation();
+      svd.m_workMatrix = m_qr.matrixQR().block(0, 0, matrix.cols(), matrix.cols()).template triangularView<Upper>();
+      if (svd.m_computeFullU) m_qr.matrixQ().evalTo(svd.m_matrixU, m_workspace);
+      if (svd.computeV()) svd.m_matrixV = m_qr.colsPermutation();
       return true;
     }
     return false;
   }
 
-private:
+ private:
   typedef FullPivHouseholderQR<MatrixType> QRType;
   QRType m_qr;
   WorkspaceType m_workspace;
@@ -118,8 +113,7 @@
       TransposeTypeWithSameStorageOrder;
 
   void allocate(const SVDType& svd) {
-    if (svd.cols() != m_qr.rows() || svd.rows() != m_qr.cols())
-    {
+    if (svd.cols() != m_qr.rows() || svd.rows() != m_qr.cols()) {
       internal::destroy_at(&m_qr);
       internal::construct_at(&m_qr, svd.cols(), svd.rows());
     }
@@ -128,19 +122,19 @@
   }
 
   bool run(SVDType& svd, const MatrixType& matrix) {
-    if(matrix.cols() > matrix.rows())
-    {
+    if (matrix.cols() > matrix.rows()) {
       m_adjoint = matrix.adjoint();
       m_qr.compute(m_adjoint);
-      svd.m_workMatrix = m_qr.matrixQR().block(0,0,matrix.rows(),matrix.rows()).template triangularView<Upper>().adjoint();
-      if(svd.m_computeFullV) m_qr.matrixQ().evalTo(svd.m_matrixV, m_workspace);
-      if(svd.computeU()) svd.m_matrixU = m_qr.colsPermutation();
+      svd.m_workMatrix =
+          m_qr.matrixQR().block(0, 0, matrix.rows(), matrix.rows()).template triangularView<Upper>().adjoint();
+      if (svd.m_computeFullV) m_qr.matrixQ().evalTo(svd.m_matrixV, m_workspace);
+      if (svd.computeU()) svd.m_matrixU = m_qr.colsPermutation();
       return true;
-    }
-    else return false;
+    } else
+      return false;
   }
 
-private:
+ private:
   typedef FullPivHouseholderQR<TransposeTypeWithSameStorageOrder> QRType;
   QRType m_qr;
   TransposeTypeWithSameStorageOrder m_adjoint;
@@ -164,33 +158,33 @@
   typedef Matrix<Scalar, 1, WorkspaceSize, RowMajor, 1, MaxWorkspaceSize> WorkspaceType;
 
   void allocate(const SVDType& svd) {
-    if (svd.rows() != m_qr.rows() || svd.cols() != m_qr.cols())
-    {
+    if (svd.rows() != m_qr.rows() || svd.cols() != m_qr.cols()) {
       internal::destroy_at(&m_qr);
       internal::construct_at(&m_qr, svd.rows(), svd.cols());
     }
-    if (svd.m_computeFullU) m_workspace.resize(svd.rows());
-    else if (svd.m_computeThinU) m_workspace.resize(svd.cols());
+    if (svd.m_computeFullU)
+      m_workspace.resize(svd.rows());
+    else if (svd.m_computeThinU)
+      m_workspace.resize(svd.cols());
   }
 
   bool run(SVDType& svd, const MatrixType& matrix) {
-    if(matrix.rows() > matrix.cols())
-    {
+    if (matrix.rows() > matrix.cols()) {
       m_qr.compute(matrix);
-      svd.m_workMatrix = m_qr.matrixQR().block(0,0,matrix.cols(),matrix.cols()).template triangularView<Upper>();
-      if(svd.m_computeFullU) m_qr.householderQ().evalTo(svd.m_matrixU, m_workspace);
-      else if(svd.m_computeThinU)
-      {
+      svd.m_workMatrix = m_qr.matrixQR().block(0, 0, matrix.cols(), matrix.cols()).template triangularView<Upper>();
+      if (svd.m_computeFullU)
+        m_qr.householderQ().evalTo(svd.m_matrixU, m_workspace);
+      else if (svd.m_computeThinU) {
         svd.m_matrixU.setIdentity(matrix.rows(), matrix.cols());
         m_qr.householderQ().applyThisOnTheLeft(svd.m_matrixU, m_workspace);
       }
-      if(svd.computeV()) svd.m_matrixV = m_qr.colsPermutation();
+      if (svd.computeV()) svd.m_matrixV = m_qr.colsPermutation();
       return true;
     }
     return false;
   }
 
-private:
+ private:
   typedef ColPivHouseholderQR<MatrixType> QRType;
   QRType m_qr;
   WorkspaceType m_workspace;
@@ -220,36 +214,37 @@
       TransposeTypeWithSameStorageOrder;
 
   void allocate(const SVDType& svd) {
-    if (svd.cols() != m_qr.rows() || svd.rows() != m_qr.cols())
-    {
+    if (svd.cols() != m_qr.rows() || svd.rows() != m_qr.cols()) {
       internal::destroy_at(&m_qr);
       internal::construct_at(&m_qr, svd.cols(), svd.rows());
     }
-    if (svd.m_computeFullV) m_workspace.resize(svd.cols());
-    else if (svd.m_computeThinV) m_workspace.resize(svd.rows());
+    if (svd.m_computeFullV)
+      m_workspace.resize(svd.cols());
+    else if (svd.m_computeThinV)
+      m_workspace.resize(svd.rows());
     m_adjoint.resize(svd.cols(), svd.rows());
   }
 
   bool run(SVDType& svd, const MatrixType& matrix) {
-    if(matrix.cols() > matrix.rows())
-    {
+    if (matrix.cols() > matrix.rows()) {
       m_adjoint = matrix.adjoint();
       m_qr.compute(m_adjoint);
 
-      svd.m_workMatrix = m_qr.matrixQR().block(0,0,matrix.rows(),matrix.rows()).template triangularView<Upper>().adjoint();
-      if(svd.m_computeFullV) m_qr.householderQ().evalTo(svd.m_matrixV, m_workspace);
-      else if(svd.m_computeThinV)
-      {
+      svd.m_workMatrix =
+          m_qr.matrixQR().block(0, 0, matrix.rows(), matrix.rows()).template triangularView<Upper>().adjoint();
+      if (svd.m_computeFullV)
+        m_qr.householderQ().evalTo(svd.m_matrixV, m_workspace);
+      else if (svd.m_computeThinV) {
         svd.m_matrixV.setIdentity(matrix.cols(), matrix.rows());
         m_qr.householderQ().applyThisOnTheLeft(svd.m_matrixV, m_workspace);
       }
-      if(svd.computeU()) svd.m_matrixU = m_qr.colsPermutation();
+      if (svd.computeU()) svd.m_matrixU = m_qr.colsPermutation();
       return true;
-    }
-    else return false;
+    } else
+      return false;
   }
 
-private:
+ private:
   typedef ColPivHouseholderQR<TransposeTypeWithSameStorageOrder> QRType;
   QRType m_qr;
   TransposeTypeWithSameStorageOrder m_adjoint;
@@ -272,33 +267,33 @@
   typedef Matrix<Scalar, 1, WorkspaceSize, RowMajor, 1, MaxWorkspaceSize> WorkspaceType;
 
   void allocate(const SVDType& svd) {
-    if (svd.rows() != m_qr.rows() || svd.cols() != m_qr.cols())
-    {
+    if (svd.rows() != m_qr.rows() || svd.cols() != m_qr.cols()) {
       internal::destroy_at(&m_qr);
       internal::construct_at(&m_qr, svd.rows(), svd.cols());
     }
-    if (svd.m_computeFullU) m_workspace.resize(svd.rows());
-    else if (svd.m_computeThinU) m_workspace.resize(svd.cols());
+    if (svd.m_computeFullU)
+      m_workspace.resize(svd.rows());
+    else if (svd.m_computeThinU)
+      m_workspace.resize(svd.cols());
   }
 
   bool run(SVDType& svd, const MatrixType& matrix) {
-    if(matrix.rows() > matrix.cols())
-    {
+    if (matrix.rows() > matrix.cols()) {
       m_qr.compute(matrix);
-      svd.m_workMatrix = m_qr.matrixQR().block(0,0,matrix.cols(),matrix.cols()).template triangularView<Upper>();
-      if(svd.m_computeFullU) m_qr.householderQ().evalTo(svd.m_matrixU, m_workspace);
-      else if(svd.m_computeThinU)
-      {
+      svd.m_workMatrix = m_qr.matrixQR().block(0, 0, matrix.cols(), matrix.cols()).template triangularView<Upper>();
+      if (svd.m_computeFullU)
+        m_qr.householderQ().evalTo(svd.m_matrixU, m_workspace);
+      else if (svd.m_computeThinU) {
         svd.m_matrixU.setIdentity(matrix.rows(), matrix.cols());
         m_qr.householderQ().applyThisOnTheLeft(svd.m_matrixU, m_workspace);
       }
-      if(svd.computeV()) svd.m_matrixV.setIdentity(matrix.cols(), matrix.cols());
+      if (svd.computeV()) svd.m_matrixV.setIdentity(matrix.cols(), matrix.cols());
       return true;
     }
     return false;
   }
 
-private:
+ private:
   typedef HouseholderQR<MatrixType> QRType;
   QRType m_qr;
   WorkspaceType m_workspace;
@@ -327,36 +322,37 @@
       TransposeTypeWithSameStorageOrder;
 
   void allocate(const SVDType& svd) {
-    if (svd.cols() != m_qr.rows() || svd.rows() != m_qr.cols())
-    {
+    if (svd.cols() != m_qr.rows() || svd.rows() != m_qr.cols()) {
       internal::destroy_at(&m_qr);
       internal::construct_at(&m_qr, svd.cols(), svd.rows());
     }
-    if (svd.m_computeFullV) m_workspace.resize(svd.cols());
-    else if (svd.m_computeThinV) m_workspace.resize(svd.rows());
+    if (svd.m_computeFullV)
+      m_workspace.resize(svd.cols());
+    else if (svd.m_computeThinV)
+      m_workspace.resize(svd.rows());
     m_adjoint.resize(svd.cols(), svd.rows());
   }
 
   bool run(SVDType& svd, const MatrixType& matrix) {
-    if(matrix.cols() > matrix.rows())
-    {
+    if (matrix.cols() > matrix.rows()) {
       m_adjoint = matrix.adjoint();
       m_qr.compute(m_adjoint);
 
-      svd.m_workMatrix = m_qr.matrixQR().block(0,0,matrix.rows(),matrix.rows()).template triangularView<Upper>().adjoint();
-      if(svd.m_computeFullV) m_qr.householderQ().evalTo(svd.m_matrixV, m_workspace);
-      else if(svd.m_computeThinV)
-      {
+      svd.m_workMatrix =
+          m_qr.matrixQR().block(0, 0, matrix.rows(), matrix.rows()).template triangularView<Upper>().adjoint();
+      if (svd.m_computeFullV)
+        m_qr.householderQ().evalTo(svd.m_matrixV, m_workspace);
+      else if (svd.m_computeThinV) {
         svd.m_matrixV.setIdentity(matrix.cols(), matrix.rows());
         m_qr.householderQ().applyThisOnTheLeft(svd.m_matrixV, m_workspace);
       }
-      if(svd.computeU()) svd.m_matrixU.setIdentity(matrix.rows(), matrix.rows());
+      if (svd.computeU()) svd.m_matrixU.setIdentity(matrix.rows(), matrix.rows());
       return true;
-    }
-    else return false;
+    } else
+      return false;
   }
 
-private:
+ private:
   typedef HouseholderQR<TransposeTypeWithSameStorageOrder> QRType;
   QRType m_qr;
   TransposeTypeWithSameStorageOrder m_adjoint;
@@ -380,62 +376,56 @@
   typedef JacobiSVD<MatrixType, Options> SVD;
   typedef typename MatrixType::Scalar Scalar;
   typedef typename MatrixType::RealScalar RealScalar;
-  static bool run(typename SVD::WorkMatrixType& work_matrix, SVD& svd, Index p, Index q, RealScalar& maxDiagEntry)
-  {
-    using std::sqrt;
+  static bool run(typename SVD::WorkMatrixType& work_matrix, SVD& svd, Index p, Index q, RealScalar& maxDiagEntry) {
     using std::abs;
+    using std::sqrt;
     Scalar z;
     JacobiRotation<Scalar> rot;
-    RealScalar n = sqrt(numext::abs2(work_matrix.coeff(p,p)) + numext::abs2(work_matrix.coeff(q,p)));
+    RealScalar n = sqrt(numext::abs2(work_matrix.coeff(p, p)) + numext::abs2(work_matrix.coeff(q, p)));
 
     const RealScalar considerAsZero = (std::numeric_limits<RealScalar>::min)();
     const RealScalar precision = NumTraits<Scalar>::epsilon();
 
-    if(numext::is_exactly_zero(n))
-    {
+    if (numext::is_exactly_zero(n)) {
       // make sure first column is zero
-      work_matrix.coeffRef(p,p) = work_matrix.coeffRef(q,p) = Scalar(0);
+      work_matrix.coeffRef(p, p) = work_matrix.coeffRef(q, p) = Scalar(0);
 
-      if(abs(numext::imag(work_matrix.coeff(p,q)))>considerAsZero)
-      {
-        // work_matrix.coeff(p,q) can be zero if work_matrix.coeff(q,p) is not zero but small enough to underflow when computing n
-        z = abs(work_matrix.coeff(p,q)) / work_matrix.coeff(p,q);
+      if (abs(numext::imag(work_matrix.coeff(p, q))) > considerAsZero) {
+        // work_matrix.coeff(p,q) can be zero if work_matrix.coeff(q,p) is not zero but small enough to underflow when
+        // computing n
+        z = abs(work_matrix.coeff(p, q)) / work_matrix.coeff(p, q);
         work_matrix.row(p) *= z;
-        if(svd.computeU()) svd.m_matrixU.col(p) *= conj(z);
+        if (svd.computeU()) svd.m_matrixU.col(p) *= conj(z);
       }
-      if(abs(numext::imag(work_matrix.coeff(q,q)))>considerAsZero)
-      {
-        z = abs(work_matrix.coeff(q,q)) / work_matrix.coeff(q,q);
+      if (abs(numext::imag(work_matrix.coeff(q, q))) > considerAsZero) {
+        z = abs(work_matrix.coeff(q, q)) / work_matrix.coeff(q, q);
         work_matrix.row(q) *= z;
-        if(svd.computeU()) svd.m_matrixU.col(q) *= conj(z);
+        if (svd.computeU()) svd.m_matrixU.col(q) *= conj(z);
       }
       // otherwise the second row is already zero, so we have nothing to do.
-    }
-    else
-    {
-      rot.c() = conj(work_matrix.coeff(p,p)) / n;
-      rot.s() = work_matrix.coeff(q,p) / n;
-      work_matrix.applyOnTheLeft(p,q,rot);
-      if(svd.computeU()) svd.m_matrixU.applyOnTheRight(p,q,rot.adjoint());
-      if(abs(numext::imag(work_matrix.coeff(p,q)))>considerAsZero)
-      {
-        z = abs(work_matrix.coeff(p,q)) / work_matrix.coeff(p,q);
+    } else {
+      rot.c() = conj(work_matrix.coeff(p, p)) / n;
+      rot.s() = work_matrix.coeff(q, p) / n;
+      work_matrix.applyOnTheLeft(p, q, rot);
+      if (svd.computeU()) svd.m_matrixU.applyOnTheRight(p, q, rot.adjoint());
+      if (abs(numext::imag(work_matrix.coeff(p, q))) > considerAsZero) {
+        z = abs(work_matrix.coeff(p, q)) / work_matrix.coeff(p, q);
         work_matrix.col(q) *= z;
-        if(svd.computeV()) svd.m_matrixV.col(q) *= z;
+        if (svd.computeV()) svd.m_matrixV.col(q) *= z;
       }
-      if(abs(numext::imag(work_matrix.coeff(q,q)))>considerAsZero)
-      {
-        z = abs(work_matrix.coeff(q,q)) / work_matrix.coeff(q,q);
+      if (abs(numext::imag(work_matrix.coeff(q, q))) > considerAsZero) {
+        z = abs(work_matrix.coeff(q, q)) / work_matrix.coeff(q, q);
         work_matrix.row(q) *= z;
-        if(svd.computeU()) svd.m_matrixU.col(q) *= conj(z);
+        if (svd.computeU()) svd.m_matrixU.col(q) *= conj(z);
       }
     }
 
     // update largest diagonal entry
-    maxDiagEntry = numext::maxi<RealScalar>(maxDiagEntry,numext::maxi<RealScalar>(abs(work_matrix.coeff(p,p)), abs(work_matrix.coeff(q,q))));
+    maxDiagEntry = numext::maxi<RealScalar>(
+        maxDiagEntry, numext::maxi<RealScalar>(abs(work_matrix.coeff(p, p)), abs(work_matrix.coeff(q, q))));
     // and check whether the 2x2 block is already diagonal
     RealScalar threshold = numext::maxi<RealScalar>(considerAsZero, precision * maxDiagEntry);
-    return abs(work_matrix.coeff(p,q))>threshold || abs(work_matrix.coeff(q,p)) > threshold;
+    return abs(work_matrix.coeff(p, q)) > threshold || abs(work_matrix.coeff(q, p)) > threshold;
   }
 };
 
@@ -444,7 +434,7 @@
   typedef MatrixType_ MatrixType;
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \ingroup SVD_Module
  *
@@ -569,8 +559,7 @@
    * \deprecated Will be removed in the next major Eigen version. Options should
    * be specified in the \a Options template parameter.
    */
-  EIGEN_DEPRECATED
-  JacobiSVD(Index rows, Index cols, unsigned int computationOptions) {
+  EIGEN_DEPRECATED JacobiSVD(Index rows, Index cols, unsigned int computationOptions) {
     internal::check_svd_options_assertions<MatrixType, Options>(computationOptions, rows, cols);
     allocate(rows, cols, computationOptions);
   }
@@ -612,22 +601,21 @@
    *
    * \param matrix the matrix to decompose
    * \param computationOptions specify whether to compute Thin/Full unitaries U/V
-   * 
+   *
    * \deprecated Will be removed in the next major Eigen version. Options should
    * be specified in the \a Options template parameter.
    */
-  EIGEN_DEPRECATED
-  JacobiSVD& compute(const MatrixType& matrix, unsigned int computationOptions) {
+  EIGEN_DEPRECATED JacobiSVD& compute(const MatrixType& matrix, unsigned int computationOptions) {
     internal::check_svd_options_assertions<MatrixType, Options>(m_computationOptions, matrix.rows(), matrix.cols());
     return compute_impl(matrix, computationOptions);
   }
 
+  using Base::cols;
   using Base::computeU;
   using Base::computeV;
-  using Base::rows;
-  using Base::cols;
   using Base::diagSize;
   using Base::rank;
+  using Base::rows;
 
  private:
   void allocate(Index rows, Index cols, unsigned int computationOptions);
@@ -679,9 +667,9 @@
                "Use the ColPivHouseholderQR preconditioner instead.");
 
   m_workMatrix.resize(diagSize(), diagSize());
-  if(cols()>rows())   m_qr_precond_morecols.allocate(*this);
-  if(rows()>cols())   m_qr_precond_morerows.allocate(*this);
-  if(rows()!=cols())  m_scaledMatrix.resize(rows(),cols());
+  if (cols() > rows()) m_qr_precond_morecols.allocate(*this);
+  if (rows() > cols()) m_qr_precond_morerows.allocate(*this);
+  if (rows() != cols()) m_scaledMatrix.resize(rows(), cols());
 }
 
 template <typename MatrixType, int Options>
@@ -691,8 +679,8 @@
 
   allocate(matrix.rows(), matrix.cols(), computationOptions);
 
-  // currently we stop when we reach precision 2*epsilon as the last bit of precision can require an unreasonable number of iterations,
-  // only worsening the precision of U and V as we accumulate more rotations
+  // currently we stop when we reach precision 2*epsilon as the last bit of precision can require an unreasonable number
+  // of iterations, only worsening the precision of U and V as we accumulate more rotations
   const RealScalar precision = RealScalar(2) * NumTraits<Scalar>::epsilon();
 
   // limit for denormal numbers to be considered zero in order to avoid infinite loops (see bug 286)
@@ -706,45 +694,39 @@
     m_nonzeroSingularValues = 0;
     return *this;
   }
-  if(numext::is_exactly_zero(scale)) scale = RealScalar(1);
-  
+  if (numext::is_exactly_zero(scale)) scale = RealScalar(1);
+
   /*** step 1. The R-SVD step: we use a QR decomposition to reduce to the case of a square matrix */
 
-  if(rows() != cols())
-  {
+  if (rows() != cols()) {
     m_scaledMatrix = matrix / scale;
     m_qr_precond_morecols.run(*this, m_scaledMatrix);
     m_qr_precond_morerows.run(*this, m_scaledMatrix);
-  }
-  else
-  {
-    m_workMatrix = matrix.template topLeftCorner<DiagSizeAtCompileTime,DiagSizeAtCompileTime>(diagSize(),diagSize()) / scale;
-    if(m_computeFullU) m_matrixU.setIdentity(rows(),rows());
-    if(m_computeThinU) m_matrixU.setIdentity(rows(),diagSize());
-    if(m_computeFullV) m_matrixV.setIdentity(cols(),cols());
-    if(m_computeThinV) m_matrixV.setIdentity(cols(),diagSize());
+  } else {
+    m_workMatrix =
+        matrix.template topLeftCorner<DiagSizeAtCompileTime, DiagSizeAtCompileTime>(diagSize(), diagSize()) / scale;
+    if (m_computeFullU) m_matrixU.setIdentity(rows(), rows());
+    if (m_computeThinU) m_matrixU.setIdentity(rows(), diagSize());
+    if (m_computeFullV) m_matrixV.setIdentity(cols(), cols());
+    if (m_computeThinV) m_matrixV.setIdentity(cols(), diagSize());
   }
 
   /*** step 2. The main Jacobi SVD iteration. ***/
   RealScalar maxDiagEntry = m_workMatrix.cwiseAbs().diagonal().maxCoeff();
 
   bool finished = false;
-  while(!finished)
-  {
+  while (!finished) {
     finished = true;
 
     // do a sweep: for all index pairs (p,q), perform SVD of the corresponding 2x2 sub-matrix
 
-    for(Index p = 1; p < diagSize(); ++p)
-    {
-      for(Index q = 0; q < p; ++q)
-      {
+    for (Index p = 1; p < diagSize(); ++p) {
+      for (Index q = 0; q < p; ++q) {
         // if this 2x2 sub-matrix is not diagonal already...
         // notice that this comparison will evaluate to false if any NaN is involved, ensuring that NaN's don't
         // keep us iterating forever. Similarly, small denormal numbers are considered zero.
         RealScalar threshold = numext::maxi<RealScalar>(considerAsZero, precision * maxDiagEntry);
-        if(abs(m_workMatrix.coeff(p,q))>threshold || abs(m_workMatrix.coeff(q,p)) > threshold)
-        {
+        if (abs(m_workMatrix.coeff(p, q)) > threshold || abs(m_workMatrix.coeff(q, p)) > threshold) {
           finished = false;
           // perform SVD decomposition of 2x2 sub-matrix corresponding to indices p,q to make it diagonal
           // the complex to real operation returns true if the updated 2x2 block is not already diagonal
@@ -754,62 +736,57 @@
             internal::real_2x2_jacobi_svd(m_workMatrix, p, q, &j_left, &j_right);
 
             // accumulate resulting Jacobi rotations
-            m_workMatrix.applyOnTheLeft(p,q,j_left);
-            if(computeU()) m_matrixU.applyOnTheRight(p,q,j_left.transpose());
+            m_workMatrix.applyOnTheLeft(p, q, j_left);
+            if (computeU()) m_matrixU.applyOnTheRight(p, q, j_left.transpose());
 
-            m_workMatrix.applyOnTheRight(p,q,j_right);
-            if(computeV()) m_matrixV.applyOnTheRight(p,q,j_right);
+            m_workMatrix.applyOnTheRight(p, q, j_right);
+            if (computeV()) m_matrixV.applyOnTheRight(p, q, j_right);
 
             // keep track of the largest diagonal coefficient
-            maxDiagEntry = numext::maxi<RealScalar>(maxDiagEntry,numext::maxi<RealScalar>(abs(m_workMatrix.coeff(p,p)), abs(m_workMatrix.coeff(q,q))));
+            maxDiagEntry = numext::maxi<RealScalar>(
+                maxDiagEntry, numext::maxi<RealScalar>(abs(m_workMatrix.coeff(p, p)), abs(m_workMatrix.coeff(q, q))));
           }
         }
       }
     }
   }
 
-  /*** step 3. The work matrix is now diagonal, so ensure it's positive so its diagonal entries are the singular values ***/
+  /*** step 3. The work matrix is now diagonal, so ensure it's positive so its diagonal entries are the singular values
+   * ***/
 
-  for(Index i = 0; i < diagSize(); ++i)
-  {
+  for (Index i = 0; i < diagSize(); ++i) {
     // For a complex matrix, some diagonal coefficients might note have been
     // treated by svd_precondition_2x2_block_to_be_real, and the imaginary part
     // of some diagonal entry might not be null.
-    if(NumTraits<Scalar>::IsComplex && abs(numext::imag(m_workMatrix.coeff(i,i)))>considerAsZero)
-    {
-      RealScalar a = abs(m_workMatrix.coeff(i,i));
+    if (NumTraits<Scalar>::IsComplex && abs(numext::imag(m_workMatrix.coeff(i, i))) > considerAsZero) {
+      RealScalar a = abs(m_workMatrix.coeff(i, i));
       m_singularValues.coeffRef(i) = abs(a);
-      if(computeU()) m_matrixU.col(i) *= m_workMatrix.coeff(i,i)/a;
-    }
-    else
-    {
+      if (computeU()) m_matrixU.col(i) *= m_workMatrix.coeff(i, i) / a;
+    } else {
       // m_workMatrix.coeff(i,i) is already real, no difficulty:
-      RealScalar a = numext::real(m_workMatrix.coeff(i,i));
+      RealScalar a = numext::real(m_workMatrix.coeff(i, i));
       m_singularValues.coeffRef(i) = abs(a);
-      if(computeU() && (a<RealScalar(0))) m_matrixU.col(i) = -m_matrixU.col(i);
+      if (computeU() && (a < RealScalar(0))) m_matrixU.col(i) = -m_matrixU.col(i);
     }
   }
-  
+
   m_singularValues *= scale;
 
   /*** step 4. Sort singular values in descending order and compute the number of nonzero singular values ***/
 
   m_nonzeroSingularValues = diagSize();
-  for(Index i = 0; i < diagSize(); i++)
-  {
+  for (Index i = 0; i < diagSize(); i++) {
     Index pos;
-    RealScalar maxRemainingSingularValue = m_singularValues.tail(diagSize()-i).maxCoeff(&pos);
-    if(numext::is_exactly_zero(maxRemainingSingularValue))
-    {
+    RealScalar maxRemainingSingularValue = m_singularValues.tail(diagSize() - i).maxCoeff(&pos);
+    if (numext::is_exactly_zero(maxRemainingSingularValue)) {
       m_nonzeroSingularValues = i;
       break;
     }
-    if(pos)
-    {
+    if (pos) {
       pos += i;
       std::swap(m_singularValues.coeffRef(i), m_singularValues.coeffRef(pos));
-      if(computeU()) m_matrixU.col(pos).swap(m_matrixU.col(i));
-      if(computeV()) m_matrixV.col(pos).swap(m_matrixV.col(i));
+      if (computeU()) m_matrixU.col(pos).swap(m_matrixU.col(i));
+      if (computeV()) m_matrixV.col(pos).swap(m_matrixV.col(i));
     }
   }
 
@@ -818,12 +795,12 @@
 }
 
 /** \svd_module
-  *
-  * \return the singular value decomposition of \c *this computed by two-sided
-  * Jacobi transformations.
-  *
-  * \sa class JacobiSVD
-  */
+ *
+ * \return the singular value decomposition of \c *this computed by two-sided
+ * Jacobi transformations.
+ *
+ * \sa class JacobiSVD
+ */
 template <typename Derived>
 template <int Options>
 JacobiSVD<typename MatrixBase<Derived>::PlainObject, Options> MatrixBase<Derived>::jacobiSvd() const {
@@ -839,4 +816,4 @@
 
 }  // end namespace Eigen
 
-#endif // EIGEN_JACOBISVD_H
+#endif  // EIGEN_JACOBISVD_H
diff --git a/Eigen/src/SVD/JacobiSVD_LAPACKE.h b/Eigen/src/SVD/JacobiSVD_LAPACKE.h
index 12c8614..df6a096 100644
--- a/Eigen/src/SVD/JacobiSVD_LAPACKE.h
+++ b/Eigen/src/SVD/JacobiSVD_LAPACKE.h
@@ -36,68 +36,81 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 /** \internal Specialization for the data types supported by LAPACKe */
 
-#define EIGEN_LAPACKE_SVD(EIGTYPE, LAPACKE_TYPE, LAPACKE_RTYPE, LAPACKE_PREFIX, EIGCOLROW, LAPACKE_COLROW, OPTIONS) \
-template<> inline \
-JacobiSVD<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic>, OPTIONS>& \
-JacobiSVD<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic>, OPTIONS>::compute_impl(const Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic>& matrix, \
-                                                                                                 unsigned int computationOptions) \
-{ \
-  typedef Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic> MatrixType; \
-  /*typedef MatrixType::Scalar Scalar;*/ \
-  /*typedef MatrixType::RealScalar RealScalar;*/ \
-  allocate(matrix.rows(), matrix.cols(), computationOptions); \
-\
-  /*const RealScalar precision = RealScalar(2) * NumTraits<Scalar>::epsilon();*/ \
-  m_nonzeroSingularValues = diagSize(); \
-\
-  lapack_int lda = internal::convert_index<lapack_int>(matrix.outerStride()), ldu, ldvt; \
-  lapack_int matrix_order = LAPACKE_COLROW; \
-  char jobu, jobvt; \
-  LAPACKE_TYPE *u, *vt, dummy; \
-  jobu  = (m_computeFullU) ? 'A' : (m_computeThinU) ? 'S' : 'N'; \
-  jobvt = (m_computeFullV) ? 'A' : (m_computeThinV) ? 'S' : 'N'; \
-  if (computeU()) { \
-    ldu  = internal::convert_index<lapack_int>(m_matrixU.outerStride()); \
-    u    = (LAPACKE_TYPE*)m_matrixU.data(); \
-  } else { ldu=1; u=&dummy; }\
-  MatrixType localV; \
-  lapack_int vt_rows = (m_computeFullV) ? internal::convert_index<lapack_int>(cols()) : (m_computeThinV) ? internal::convert_index<lapack_int>(diagSize()) : 1; \
-  if (computeV()) { \
-    localV.resize(vt_rows, cols()); \
-    ldvt  = internal::convert_index<lapack_int>(localV.outerStride()); \
-    vt   = (LAPACKE_TYPE*)localV.data(); \
-  } else { ldvt=1; vt=&dummy; }\
-  Matrix<LAPACKE_RTYPE, Dynamic, Dynamic> superb; superb.resize(diagSize(), 1); \
-  MatrixType m_temp; m_temp = matrix; \
-  lapack_int info = LAPACKE_##LAPACKE_PREFIX##gesvd( matrix_order, jobu, jobvt, internal::convert_index<lapack_int>(rows()), internal::convert_index<lapack_int>(cols()), (LAPACKE_TYPE*)m_temp.data(), lda, (LAPACKE_RTYPE*)m_singularValues.data(), u, ldu, vt, ldvt, superb.data()); \
-  /* Check the result of the LAPACK call */ \
-  if (info < 0 || !m_singularValues.allFinite()) { \
-    m_info = InvalidInput; \
-  } else if (info > 0 ) { \
-    m_info = NoConvergence; \
-  } else { \
-    m_info = Success; \
-    if (computeV()) m_matrixV = localV.adjoint(); \
-  } \
- /* for(int i=0;i<diagSize();i++) if (m_singularValues.coeffRef(i) < precision) { m_nonzeroSingularValues--; m_singularValues.coeffRef(i)=RealScalar(0);}*/ \
-  m_isInitialized = true; \
-  return *this; \
-}
+#define EIGEN_LAPACKE_SVD(EIGTYPE, LAPACKE_TYPE, LAPACKE_RTYPE, LAPACKE_PREFIX, EIGCOLROW, LAPACKE_COLROW, OPTIONS)    \
+  template <>                                                                                                          \
+  inline JacobiSVD<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic>, OPTIONS>&                           \
+  JacobiSVD<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic>, OPTIONS>::compute_impl(                    \
+      const Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic>& matrix, unsigned int computationOptions) { \
+    typedef Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic> MatrixType;                                 \
+    /*typedef MatrixType::Scalar Scalar;*/                                                                             \
+    /*typedef MatrixType::RealScalar RealScalar;*/                                                                     \
+    allocate(matrix.rows(), matrix.cols(), computationOptions);                                                        \
+                                                                                                                       \
+    /*const RealScalar precision = RealScalar(2) * NumTraits<Scalar>::epsilon();*/                                     \
+    m_nonzeroSingularValues = diagSize();                                                                              \
+                                                                                                                       \
+    lapack_int lda = internal::convert_index<lapack_int>(matrix.outerStride()), ldu, ldvt;                             \
+    lapack_int matrix_order = LAPACKE_COLROW;                                                                          \
+    char jobu, jobvt;                                                                                                  \
+    LAPACKE_TYPE *u, *vt, dummy;                                                                                       \
+    jobu = (m_computeFullU) ? 'A' : (m_computeThinU) ? 'S' : 'N';                                                      \
+    jobvt = (m_computeFullV) ? 'A' : (m_computeThinV) ? 'S' : 'N';                                                     \
+    if (computeU()) {                                                                                                  \
+      ldu = internal::convert_index<lapack_int>(m_matrixU.outerStride());                                              \
+      u = (LAPACKE_TYPE*)m_matrixU.data();                                                                             \
+    } else {                                                                                                           \
+      ldu = 1;                                                                                                         \
+      u = &dummy;                                                                                                      \
+    }                                                                                                                  \
+    MatrixType localV;                                                                                                 \
+    lapack_int vt_rows = (m_computeFullV)   ? internal::convert_index<lapack_int>(cols())                              \
+                         : (m_computeThinV) ? internal::convert_index<lapack_int>(diagSize())                          \
+                                            : 1;                                                                       \
+    if (computeV()) {                                                                                                  \
+      localV.resize(vt_rows, cols());                                                                                  \
+      ldvt = internal::convert_index<lapack_int>(localV.outerStride());                                                \
+      vt = (LAPACKE_TYPE*)localV.data();                                                                               \
+    } else {                                                                                                           \
+      ldvt = 1;                                                                                                        \
+      vt = &dummy;                                                                                                     \
+    }                                                                                                                  \
+    Matrix<LAPACKE_RTYPE, Dynamic, Dynamic> superb;                                                                    \
+    superb.resize(diagSize(), 1);                                                                                      \
+    MatrixType m_temp;                                                                                                 \
+    m_temp = matrix;                                                                                                   \
+    lapack_int info = LAPACKE_##LAPACKE_PREFIX##gesvd(                                                                 \
+        matrix_order, jobu, jobvt, internal::convert_index<lapack_int>(rows()),                                        \
+        internal::convert_index<lapack_int>(cols()), (LAPACKE_TYPE*)m_temp.data(), lda,                                \
+        (LAPACKE_RTYPE*)m_singularValues.data(), u, ldu, vt, ldvt, superb.data());                                     \
+    /* Check the result of the LAPACK call */                                                                          \
+    if (info < 0 || !m_singularValues.allFinite()) {                                                                   \
+      m_info = InvalidInput;                                                                                           \
+    } else if (info > 0) {                                                                                             \
+      m_info = NoConvergence;                                                                                          \
+    } else {                                                                                                           \
+      m_info = Success;                                                                                                \
+      if (computeV()) m_matrixV = localV.adjoint();                                                                    \
+    }                                                                                                                  \
+    /* for(int i=0;i<diagSize();i++) if (m_singularValues.coeffRef(i) < precision) { m_nonzeroSingularValues--;        \
+     * m_singularValues.coeffRef(i)=RealScalar(0);}*/                                                                  \
+    m_isInitialized = true;                                                                                            \
+    return *this;                                                                                                      \
+  }
 
-#define EIGEN_LAPACK_SVD_OPTIONS(OPTIONS) \
-  EIGEN_LAPACKE_SVD(double,   double,                double, d, ColMajor, LAPACK_COL_MAJOR, OPTIONS) \
-  EIGEN_LAPACKE_SVD(float,    float,                 float , s, ColMajor, LAPACK_COL_MAJOR, OPTIONS) \
+#define EIGEN_LAPACK_SVD_OPTIONS(OPTIONS)                                                            \
+  EIGEN_LAPACKE_SVD(double, double, double, d, ColMajor, LAPACK_COL_MAJOR, OPTIONS)                  \
+  EIGEN_LAPACKE_SVD(float, float, float, s, ColMajor, LAPACK_COL_MAJOR, OPTIONS)                     \
   EIGEN_LAPACKE_SVD(dcomplex, lapack_complex_double, double, z, ColMajor, LAPACK_COL_MAJOR, OPTIONS) \
-  EIGEN_LAPACKE_SVD(scomplex, lapack_complex_float,  float , c, ColMajor, LAPACK_COL_MAJOR, OPTIONS) \
-\
-  EIGEN_LAPACKE_SVD(double,   double,                double, d, RowMajor, LAPACK_ROW_MAJOR, OPTIONS) \
-  EIGEN_LAPACKE_SVD(float,    float,                 float , s, RowMajor, LAPACK_ROW_MAJOR, OPTIONS) \
+  EIGEN_LAPACKE_SVD(scomplex, lapack_complex_float, float, c, ColMajor, LAPACK_COL_MAJOR, OPTIONS)   \
+                                                                                                     \
+  EIGEN_LAPACKE_SVD(double, double, double, d, RowMajor, LAPACK_ROW_MAJOR, OPTIONS)                  \
+  EIGEN_LAPACKE_SVD(float, float, float, s, RowMajor, LAPACK_ROW_MAJOR, OPTIONS)                     \
   EIGEN_LAPACKE_SVD(dcomplex, lapack_complex_double, double, z, RowMajor, LAPACK_ROW_MAJOR, OPTIONS) \
-  EIGEN_LAPACKE_SVD(scomplex, lapack_complex_float,  float , c, RowMajor, LAPACK_ROW_MAJOR, OPTIONS)
+  EIGEN_LAPACKE_SVD(scomplex, lapack_complex_float, float, c, RowMajor, LAPACK_ROW_MAJOR, OPTIONS)
 
 EIGEN_LAPACK_SVD_OPTIONS(0)
 EIGEN_LAPACK_SVD_OPTIONS(ComputeThinU)
@@ -109,6 +122,6 @@
 EIGEN_LAPACK_SVD_OPTIONS(ComputeThinU | ComputeFullV)
 EIGEN_LAPACK_SVD_OPTIONS(ComputeFullU | ComputeThinV)
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_JACOBISVD_LAPACKE_H
+#endif  // EIGEN_JACOBISVD_LAPACKE_H
diff --git a/Eigen/src/SVD/SVDBase.h b/Eigen/src/SVD/SVDBase.h
index f6911cb..ae2843b 100644
--- a/Eigen/src/SVD/SVDBase.h
+++ b/Eigen/src/SVD/SVDBase.h
@@ -38,24 +38,26 @@
 constexpr bool should_svd_compute_thin_v(int options) { return (options & ComputeThinV) != 0; }
 constexpr bool should_svd_compute_full_v(int options) { return (options & ComputeFullV) != 0; }
 
-template<typename MatrixType, int Options>
+template <typename MatrixType, int Options>
 void check_svd_options_assertions(unsigned int computationOptions, Index rows, Index cols) {
   EIGEN_STATIC_ASSERT((Options & ComputationOptionsBits) == 0,
                       "SVDBase: Cannot request U or V using both static and runtime options, even if they match. "
                       "Requesting unitaries at runtime is DEPRECATED: "
                       "Prefer requesting unitaries statically, using the Options template parameter.");
-  eigen_assert(!(should_svd_compute_thin_u(computationOptions) && cols < rows && MatrixType::RowsAtCompileTime != Dynamic) &&
-               !(should_svd_compute_thin_v(computationOptions) && rows < cols && MatrixType::ColsAtCompileTime != Dynamic) &&
-               "SVDBase: If thin U is requested at runtime, your matrix must have more rows than columns or a dynamic number of rows."
-               "Similarly, if thin V is requested at runtime, you matrix must have more columns than rows or a dynamic number of columns.");
+  eigen_assert(
+      !(should_svd_compute_thin_u(computationOptions) && cols < rows && MatrixType::RowsAtCompileTime != Dynamic) &&
+      !(should_svd_compute_thin_v(computationOptions) && rows < cols && MatrixType::ColsAtCompileTime != Dynamic) &&
+      "SVDBase: If thin U is requested at runtime, your matrix must have more rows than columns or a dynamic number of "
+      "rows."
+      "Similarly, if thin V is requested at runtime, you matrix must have more columns than rows or a dynamic number "
+      "of columns.");
   (void)computationOptions;
   (void)rows;
   (void)cols;
 }
 
-template<typename Derived> struct traits<SVDBase<Derived> >
- : traits<Derived>
-{
+template <typename Derived>
+struct traits<SVDBase<Derived> > : traits<Derived> {
   typedef MatrixXpr XprKind;
   typedef SolverStorage StorageKind;
   typedef int StorageIndex;
@@ -74,17 +76,13 @@
         internal::min_size_prefer_dynamic(MatrixType::RowsAtCompileTime, MatrixType::ColsAtCompileTime),
     MaxDiagSizeAtCompileTime =
         internal::min_size_prefer_dynamic(MatrixType::MaxRowsAtCompileTime, MatrixType::MaxColsAtCompileTime),
-    MatrixUColsAtCompileTime = ShouldComputeThinU ? DiagSizeAtCompileTime
-                                                  : MatrixType::RowsAtCompileTime,
-    MatrixVColsAtCompileTime = ShouldComputeThinV ? DiagSizeAtCompileTime
-                                                  : MatrixType::ColsAtCompileTime,
-    MatrixUMaxColsAtCompileTime = ShouldComputeThinU ? MaxDiagSizeAtCompileTime
-                                                     : MatrixType::MaxRowsAtCompileTime,
-    MatrixVMaxColsAtCompileTime = ShouldComputeThinV ? MaxDiagSizeAtCompileTime
-                                                     : MatrixType::MaxColsAtCompileTime
+    MatrixUColsAtCompileTime = ShouldComputeThinU ? DiagSizeAtCompileTime : MatrixType::RowsAtCompileTime,
+    MatrixVColsAtCompileTime = ShouldComputeThinV ? DiagSizeAtCompileTime : MatrixType::ColsAtCompileTime,
+    MatrixUMaxColsAtCompileTime = ShouldComputeThinU ? MaxDiagSizeAtCompileTime : MatrixType::MaxRowsAtCompileTime,
+    MatrixVMaxColsAtCompileTime = ShouldComputeThinV ? MaxDiagSizeAtCompileTime : MatrixType::MaxColsAtCompileTime
   };
 };
-}
+}  // namespace internal
 
 /** \ingroup SVD_Module
  *
@@ -97,38 +95,37 @@
  *
  * SVD decomposition consists in decomposing any n-by-p matrix \a A as a product
  *   \f[ A = U S V^* \f]
- * where \a U is a n-by-n unitary, \a V is a p-by-p unitary, and \a S is a n-by-p real positive matrix which is zero outside of its main diagonal;
- * the diagonal entries of S are known as the \em singular \em values of \a A and the columns of \a U and \a V are known as the left
- * and right \em singular \em vectors of \a A respectively.
+ * where \a U is a n-by-n unitary, \a V is a p-by-p unitary, and \a S is a n-by-p real positive matrix which is zero
+ * outside of its main diagonal; the diagonal entries of S are known as the \em singular \em values of \a A and the
+ * columns of \a U and \a V are known as the left and right \em singular \em vectors of \a A respectively.
  *
  * Singular values are always sorted in decreasing order.
  *
- * 
- * You can ask for only \em thin \a U or \a V to be computed, meaning the following. In case of a rectangular n-by-p matrix, letting \a m be the
- * smaller value among \a n and \a p, there are only \a m singular vectors; the remaining columns of \a U and \a V do not correspond to actual
- * singular vectors. Asking for \em thin \a U or \a V means asking for only their \a m first columns to be formed. So \a U is then a n-by-m matrix,
- * and \a V is then a p-by-m matrix. Notice that thin \a U and \a V are all you need for (least squares) solving.
- * 
- * The status of the computation can be retrieved using the \a info() method. Unless \a info() returns \a Success, the results should be not
- * considered well defined.
- *  
- * If the input matrix has inf or nan coefficients, the result of the computation is undefined, and \a info() will return \a InvalidInput, but the computation is guaranteed to
- * terminate in finite (and reasonable) time.
- * \sa class BDCSVD, class JacobiSVD
+ *
+ * You can ask for only \em thin \a U or \a V to be computed, meaning the following. In case of a rectangular n-by-p
+ * matrix, letting \a m be the smaller value among \a n and \a p, there are only \a m singular vectors; the remaining
+ * columns of \a U and \a V do not correspond to actual singular vectors. Asking for \em thin \a U or \a V means asking
+ * for only their \a m first columns to be formed. So \a U is then a n-by-m matrix, and \a V is then a p-by-m matrix.
+ * Notice that thin \a U and \a V are all you need for (least squares) solving.
+ *
+ * The status of the computation can be retrieved using the \a info() method. Unless \a info() returns \a Success, the
+ * results should be not considered well defined.
+ *
+ * If the input matrix has inf or nan coefficients, the result of the computation is undefined, and \a info() will
+ * return \a InvalidInput, but the computation is guaranteed to terminate in finite (and reasonable) time. \sa class
+ * BDCSVD, class JacobiSVD
  */
-template<typename Derived> class SVDBase
- : public SolverBase<SVDBase<Derived> >
-{
-public: 
-   
-  template<typename Derived_>
+template <typename Derived>
+class SVDBase : public SolverBase<SVDBase<Derived> > {
+ public:
+  template <typename Derived_>
   friend struct internal::solve_assertion;
 
   typedef typename internal::traits<Derived>::MatrixType MatrixType;
   typedef typename MatrixType::Scalar Scalar;
   typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;
   typedef typename Eigen::internal::traits<SVDBase>::StorageIndex StorageIndex;
-  typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3
+  typedef Eigen::Index Index;  ///< \deprecated since Eigen 3.3
 
   static constexpr bool ShouldComputeFullU = internal::traits<Derived>::ShouldComputeFullU;
   static constexpr bool ShouldComputeThinU = internal::traits<Derived>::ShouldComputeThinU;
@@ -167,14 +164,14 @@
   /** \returns the \a U matrix.
    *
    * For the SVD decomposition of a n-by-p matrix, letting \a m be the minimum of \a n and \a p,
-   * the U matrix is n-by-n if you asked for \link Eigen::ComputeFullU ComputeFullU \endlink, and is n-by-m if you asked for \link Eigen::ComputeThinU ComputeThinU \endlink.
+   * the U matrix is n-by-n if you asked for \link Eigen::ComputeFullU ComputeFullU \endlink, and is n-by-m if you asked
+   * for \link Eigen::ComputeThinU ComputeThinU \endlink.
    *
    * The \a m first columns of \a U are the left singular vectors of the matrix being decomposed.
    *
    * This method asserts that you asked for \a U to be computed.
    */
-  const MatrixUType& matrixU() const
-  {
+  const MatrixUType& matrixU() const {
     _check_compute_assertions();
     eigen_assert(computeU() && "This SVD decomposition didn't compute U. Did you ask for it?");
     return m_matrixU;
@@ -183,14 +180,14 @@
   /** \returns the \a V matrix.
    *
    * For the SVD decomposition of a n-by-p matrix, letting \a m be the minimum of \a n and \a p,
-   * the V matrix is p-by-p if you asked for \link Eigen::ComputeFullV ComputeFullV \endlink, and is p-by-m if you asked for \link Eigen::ComputeThinV ComputeThinV \endlink.
+   * the V matrix is p-by-p if you asked for \link Eigen::ComputeFullV ComputeFullV \endlink, and is p-by-m if you asked
+   * for \link Eigen::ComputeThinV ComputeThinV \endlink.
    *
    * The \a m first columns of \a V are the right singular vectors of the matrix being decomposed.
    *
    * This method asserts that you asked for \a V to be computed.
    */
-  const MatrixVType& matrixV() const
-  {
+  const MatrixVType& matrixV() const {
     _check_compute_assertions();
     eigen_assert(computeV() && "This SVD decomposition didn't compute V. Did you ask for it?");
     return m_matrixV;
@@ -201,82 +198,76 @@
    * For the SVD decomposition of a n-by-p matrix, letting \a m be the minimum of \a n and \a p, the
    * returned vector has size \a m.  Singular values are always sorted in decreasing order.
    */
-  const SingularValuesType& singularValues() const
-  {
+  const SingularValuesType& singularValues() const {
     _check_compute_assertions();
     return m_singularValues;
   }
 
   /** \returns the number of singular values that are not exactly 0 */
-  Index nonzeroSingularValues() const
-  {
+  Index nonzeroSingularValues() const {
     _check_compute_assertions();
     return m_nonzeroSingularValues;
   }
-  
+
   /** \returns the rank of the matrix of which \c *this is the SVD.
-    *
-    * \note This method has to determine which singular values should be considered nonzero.
-    *       For that, it uses the threshold value that you can control by calling
-    *       setThreshold(const RealScalar&).
-    */
-  inline Index rank() const
-  {
+   *
+   * \note This method has to determine which singular values should be considered nonzero.
+   *       For that, it uses the threshold value that you can control by calling
+   *       setThreshold(const RealScalar&).
+   */
+  inline Index rank() const {
     using std::abs;
     _check_compute_assertions();
-    if(m_singularValues.size()==0) return 0;
-    RealScalar premultiplied_threshold = numext::maxi<RealScalar>(m_singularValues.coeff(0) * threshold(), (std::numeric_limits<RealScalar>::min)());
-    Index i = m_nonzeroSingularValues-1;
-    while(i>=0 && m_singularValues.coeff(i) < premultiplied_threshold) --i;
-    return i+1;
+    if (m_singularValues.size() == 0) return 0;
+    RealScalar premultiplied_threshold =
+        numext::maxi<RealScalar>(m_singularValues.coeff(0) * threshold(), (std::numeric_limits<RealScalar>::min)());
+    Index i = m_nonzeroSingularValues - 1;
+    while (i >= 0 && m_singularValues.coeff(i) < premultiplied_threshold) --i;
+    return i + 1;
   }
-  
+
   /** Allows to prescribe a threshold to be used by certain methods, such as rank() and solve(),
-    * which need to determine when singular values are to be considered nonzero.
-    * This is not used for the SVD decomposition itself.
-    *
-    * When it needs to get the threshold value, Eigen calls threshold().
-    * The default is \c NumTraits<Scalar>::epsilon()
-    *
-    * \param threshold The new value to use as the threshold.
-    *
-    * A singular value will be considered nonzero if its value is strictly greater than
-    *  \f$ \vert singular value \vert \leqslant threshold \times \vert max singular value \vert \f$.
-    *
-    * If you want to come back to the default behavior, call setThreshold(Default_t)
-    */
-  Derived& setThreshold(const RealScalar& threshold)
-  {
+   * which need to determine when singular values are to be considered nonzero.
+   * This is not used for the SVD decomposition itself.
+   *
+   * When it needs to get the threshold value, Eigen calls threshold().
+   * The default is \c NumTraits<Scalar>::epsilon()
+   *
+   * \param threshold The new value to use as the threshold.
+   *
+   * A singular value will be considered nonzero if its value is strictly greater than
+   *  \f$ \vert singular value \vert \leqslant threshold \times \vert max singular value \vert \f$.
+   *
+   * If you want to come back to the default behavior, call setThreshold(Default_t)
+   */
+  Derived& setThreshold(const RealScalar& threshold) {
     m_usePrescribedThreshold = true;
     m_prescribedThreshold = threshold;
     return derived();
   }
 
   /** Allows to come back to the default behavior, letting Eigen use its default formula for
-    * determining the threshold.
-    *
-    * You should pass the special object Eigen::Default as parameter here.
-    * \code svd.setThreshold(Eigen::Default); \endcode
-    *
-    * See the documentation of setThreshold(const RealScalar&).
-    */
-  Derived& setThreshold(Default_t)
-  {
+   * determining the threshold.
+   *
+   * You should pass the special object Eigen::Default as parameter here.
+   * \code svd.setThreshold(Eigen::Default); \endcode
+   *
+   * See the documentation of setThreshold(const RealScalar&).
+   */
+  Derived& setThreshold(Default_t) {
     m_usePrescribedThreshold = false;
     return derived();
   }
 
   /** Returns the threshold that will be used by certain methods such as rank().
-    *
-    * See the documentation of setThreshold(const RealScalar&).
-    */
-  RealScalar threshold() const
-  {
+   *
+   * See the documentation of setThreshold(const RealScalar&).
+   */
+  RealScalar threshold() const {
     eigen_assert(m_isInitialized || m_usePrescribedThreshold);
     // this temporary is needed to workaround a MSVC issue
-    Index diagSize = (std::max<Index>)(1,m_diagSize);
-    return m_usePrescribedThreshold ? m_prescribedThreshold
-                                    : RealScalar(diagSize)*NumTraits<Scalar>::epsilon();
+    Index diagSize = (std::max<Index>)(1, m_diagSize);
+    return m_usePrescribedThreshold ? m_prescribedThreshold : RealScalar(diagSize) * NumTraits<Scalar>::epsilon();
   }
 
   /** \returns true if \a U (full or thin) is asked for in this SVD decomposition */
@@ -287,56 +278,52 @@
   inline Index rows() const { return m_rows.value(); }
   inline Index cols() const { return m_cols.value(); }
   inline Index diagSize() const { return m_diagSize.value(); }
-  
-  #ifdef EIGEN_PARSED_BY_DOXYGEN
-  /** \returns a (least squares) solution of \f$ A x = b \f$ using the current SVD decomposition of A.
-    *
-    * \param b the right-hand-side of the equation to solve.
-    *
-    * \note Solving requires both U and V to be computed. Thin U and V are enough, there is no need for full U or V.
-    *
-    * \note SVD solving is implicitly least-squares. Thus, this method serves both purposes of exact solving and least-squares solving.
-    * In other words, the returned solution is guaranteed to minimize the Euclidean norm \f$ \Vert A x - b \Vert \f$.
-    */
-  template<typename Rhs>
-  inline const Solve<Derived, Rhs>
-  solve(const MatrixBase<Rhs>& b) const;
-  #endif
 
+#ifdef EIGEN_PARSED_BY_DOXYGEN
+  /** \returns a (least squares) solution of \f$ A x = b \f$ using the current SVD decomposition of A.
+   *
+   * \param b the right-hand-side of the equation to solve.
+   *
+   * \note Solving requires both U and V to be computed. Thin U and V are enough, there is no need for full U or V.
+   *
+   * \note SVD solving is implicitly least-squares. Thus, this method serves both purposes of exact solving and
+   * least-squares solving. In other words, the returned solution is guaranteed to minimize the Euclidean norm \f$ \Vert
+   * A x - b \Vert \f$.
+   */
+  template <typename Rhs>
+  inline const Solve<Derived, Rhs> solve(const MatrixBase<Rhs>& b) const;
+#endif
 
   /** \brief Reports whether previous computation was successful.
    *
    * \returns \c Success if computation was successful.
    */
-  EIGEN_DEVICE_FUNC
-  ComputationInfo info() const
-  {
+  EIGEN_DEVICE_FUNC ComputationInfo info() const {
     eigen_assert(m_isInitialized && "SVD is not initialized.");
     return m_info;
   }
 
-  #ifndef EIGEN_PARSED_BY_DOXYGEN
-  template<typename RhsType, typename DstType>
-  void _solve_impl(const RhsType &rhs, DstType &dst) const;
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  template <typename RhsType, typename DstType>
+  void _solve_impl(const RhsType& rhs, DstType& dst) const;
 
-  template<bool Conjugate, typename RhsType, typename DstType>
-  void _solve_impl_transposed(const RhsType &rhs, DstType &dst) const;
-  #endif
+  template <bool Conjugate, typename RhsType, typename DstType>
+  void _solve_impl_transposed(const RhsType& rhs, DstType& dst) const;
+#endif
 
-protected:
-
+ protected:
   EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
 
-  void _check_compute_assertions() const {
-    eigen_assert(m_isInitialized && "SVD is not initialized.");
-  }
+  void _check_compute_assertions() const { eigen_assert(m_isInitialized && "SVD is not initialized."); }
 
-  template<bool Transpose_, typename Rhs>
+  template <bool Transpose_, typename Rhs>
   void _check_solve_assertion(const Rhs& b) const {
-      EIGEN_ONLY_USED_FOR_DEBUG(b);
-      _check_compute_assertions();
-      eigen_assert(computeU() && computeV() && "SVDBase::solve(): Both unitaries U and V are required to be computed (thin unitaries suffice).");
-      eigen_assert((Transpose_?cols():rows())==b.rows() && "SVDBase::solve(): invalid number of rows of the right hand side matrix b");
+    EIGEN_ONLY_USED_FOR_DEBUG(b);
+    _check_compute_assertions();
+    eigen_assert(computeU() && computeV() &&
+                 "SVDBase::solve(): Both unitaries U and V are required to be computed (thin unitaries suffice).");
+    eigen_assert((Transpose_ ? cols() : rows()) == b.rows() &&
+                 "SVDBase::solve(): invalid number of rows of the right hand side matrix b");
   }
 
   // return true if already allocated
@@ -381,31 +368,33 @@
 };
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-template<typename Derived>
-template<typename RhsType, typename DstType>
-void SVDBase<Derived>::_solve_impl(const RhsType &rhs, DstType &dst) const
-{
+template <typename Derived>
+template <typename RhsType, typename DstType>
+void SVDBase<Derived>::_solve_impl(const RhsType& rhs, DstType& dst) const {
   // A = U S V^*
   // So A^{-1} = V S^{-1} U^*
 
-  Matrix<typename RhsType::Scalar, Dynamic, RhsType::ColsAtCompileTime, 0, MatrixType::MaxRowsAtCompileTime, RhsType::MaxColsAtCompileTime> tmp;
+  Matrix<typename RhsType::Scalar, Dynamic, RhsType::ColsAtCompileTime, 0, MatrixType::MaxRowsAtCompileTime,
+         RhsType::MaxColsAtCompileTime>
+      tmp;
   Index l_rank = rank();
-  tmp.noalias() =  m_matrixU.leftCols(l_rank).adjoint() * rhs;
+  tmp.noalias() = m_matrixU.leftCols(l_rank).adjoint() * rhs;
   tmp = m_singularValues.head(l_rank).asDiagonal().inverse() * tmp;
   dst = m_matrixV.leftCols(l_rank) * tmp;
 }
 
-template<typename Derived>
-template<bool Conjugate, typename RhsType, typename DstType>
-void SVDBase<Derived>::_solve_impl_transposed(const RhsType &rhs, DstType &dst) const
-{
+template <typename Derived>
+template <bool Conjugate, typename RhsType, typename DstType>
+void SVDBase<Derived>::_solve_impl_transposed(const RhsType& rhs, DstType& dst) const {
   // A = U S V^*
   // So  A^{-*} = U S^{-1} V^*
   // And A^{-T} = U_conj S^{-1} V^T
-  Matrix<typename RhsType::Scalar, Dynamic, RhsType::ColsAtCompileTime, 0, MatrixType::MaxRowsAtCompileTime, RhsType::MaxColsAtCompileTime> tmp;
+  Matrix<typename RhsType::Scalar, Dynamic, RhsType::ColsAtCompileTime, 0, MatrixType::MaxRowsAtCompileTime,
+         RhsType::MaxColsAtCompileTime>
+      tmp;
   Index l_rank = rank();
 
-  tmp.noalias() =  m_matrixV.leftCols(l_rank).transpose().template conjugateIf<Conjugate>() * rhs;
+  tmp.noalias() = m_matrixV.leftCols(l_rank).transpose().template conjugateIf<Conjugate>() * rhs;
   tmp = m_singularValues.head(l_rank).asDiagonal().inverse() * tmp;
   dst = m_matrixU.template conjugateIf<!Conjugate>().leftCols(l_rank) * tmp;
 }
@@ -415,11 +404,7 @@
 bool SVDBase<Derived>::allocate(Index rows, Index cols, unsigned int computationOptions) {
   eigen_assert(rows >= 0 && cols >= 0);
 
-  if (m_isAllocated &&
-      rows == m_rows.value() &&
-      cols == m_cols.value() &&
-      computationOptions == m_computationOptions)
-  {
+  if (m_isAllocated && rows == m_rows.value() && cols == m_cols.value() && computationOptions == m_computationOptions) {
     return true;
   }
 
@@ -439,14 +424,14 @@
 
   m_diagSize.setValue(numext::mini(m_rows.value(), m_cols.value()));
   m_singularValues.resize(m_diagSize.value());
-  if(RowsAtCompileTime==Dynamic)
+  if (RowsAtCompileTime == Dynamic)
     m_matrixU.resize(m_rows.value(), m_computeFullU ? m_rows.value() : m_computeThinU ? m_diagSize.value() : 0);
-  if(ColsAtCompileTime==Dynamic)
+  if (ColsAtCompileTime == Dynamic)
     m_matrixV.resize(m_cols.value(), m_computeFullV ? m_cols.value() : m_computeThinV ? m_diagSize.value() : 0);
 
   return false;
 }
 
-}// end namespace
+}  // namespace Eigen
 
-#endif // EIGEN_SVDBASE_H
+#endif  // EIGEN_SVDBASE_H
diff --git a/Eigen/src/SVD/UpperBidiagonalization.h b/Eigen/src/SVD/UpperBidiagonalization.h
index ec2fc53..d78b30b 100644
--- a/Eigen/src/SVD/UpperBidiagonalization.h
+++ b/Eigen/src/SVD/UpperBidiagonalization.h
@@ -14,219 +14,197 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 // UpperBidiagonalization will probably be replaced by a Bidiagonalization class, don't want to make it stable API.
 // At the same time, it's useful to keep for now as it's about the only thing that is testing the BandMatrix class.
 
-template<typename MatrixType_> class UpperBidiagonalization
-{
-  public:
+template <typename MatrixType_>
+class UpperBidiagonalization {
+ public:
+  typedef MatrixType_ MatrixType;
+  enum {
+    RowsAtCompileTime = MatrixType::RowsAtCompileTime,
+    ColsAtCompileTime = MatrixType::ColsAtCompileTime,
+    ColsAtCompileTimeMinusOne = internal::decrement_size<ColsAtCompileTime>::ret
+  };
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::RealScalar RealScalar;
+  typedef Eigen::Index Index;  ///< \deprecated since Eigen 3.3
+  typedef Matrix<Scalar, 1, ColsAtCompileTime> RowVectorType;
+  typedef Matrix<Scalar, RowsAtCompileTime, 1> ColVectorType;
+  typedef BandMatrix<RealScalar, ColsAtCompileTime, ColsAtCompileTime, 1, 0, RowMajor> BidiagonalType;
+  typedef Matrix<Scalar, ColsAtCompileTime, 1> DiagVectorType;
+  typedef Matrix<Scalar, ColsAtCompileTimeMinusOne, 1> SuperDiagVectorType;
+  typedef HouseholderSequence<
+      const MatrixType, const internal::remove_all_t<typename Diagonal<const MatrixType, 0>::ConjugateReturnType> >
+      HouseholderUSequenceType;
+  typedef HouseholderSequence<const internal::remove_all_t<typename MatrixType::ConjugateReturnType>,
+                              Diagonal<const MatrixType, 1>, OnTheRight>
+      HouseholderVSequenceType;
 
-    typedef MatrixType_ MatrixType;
-    enum {
-      RowsAtCompileTime = MatrixType::RowsAtCompileTime,
-      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
-      ColsAtCompileTimeMinusOne = internal::decrement_size<ColsAtCompileTime>::ret
-    };
-    typedef typename MatrixType::Scalar Scalar;
-    typedef typename MatrixType::RealScalar RealScalar;
-    typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3
-    typedef Matrix<Scalar, 1, ColsAtCompileTime> RowVectorType;
-    typedef Matrix<Scalar, RowsAtCompileTime, 1> ColVectorType;
-    typedef BandMatrix<RealScalar, ColsAtCompileTime, ColsAtCompileTime, 1, 0, RowMajor> BidiagonalType;
-    typedef Matrix<Scalar, ColsAtCompileTime, 1> DiagVectorType;
-    typedef Matrix<Scalar, ColsAtCompileTimeMinusOne, 1> SuperDiagVectorType;
-    typedef HouseholderSequence<
-              const MatrixType,
-              const internal::remove_all_t<typename Diagonal<const MatrixType,0>::ConjugateReturnType>
-            > HouseholderUSequenceType;
-    typedef HouseholderSequence<
-              const internal::remove_all_t<typename MatrixType::ConjugateReturnType>,
-              Diagonal<const MatrixType,1>,
-              OnTheRight
-            > HouseholderVSequenceType;
-    
-    /**
-    * \brief Default Constructor.
-    *
-    * The default constructor is useful in cases in which the user intends to
-    * perform decompositions via Bidiagonalization::compute(const MatrixType&).
-    */
-    UpperBidiagonalization() : m_householder(), m_bidiagonal(0, 0), m_isInitialized(false) {}
+  /**
+   * \brief Default Constructor.
+   *
+   * The default constructor is useful in cases in which the user intends to
+   * perform decompositions via Bidiagonalization::compute(const MatrixType&).
+   */
+  UpperBidiagonalization() : m_householder(), m_bidiagonal(0, 0), m_isInitialized(false) {}
 
-    explicit UpperBidiagonalization(const MatrixType& matrix)
+  explicit UpperBidiagonalization(const MatrixType& matrix)
       : m_householder(matrix.rows(), matrix.cols()),
         m_bidiagonal(matrix.cols(), matrix.cols()),
-        m_isInitialized(false)
-    {
-      compute(matrix);
-    }
+        m_isInitialized(false) {
+    compute(matrix);
+  }
 
-    UpperBidiagonalization(Index rows, Index cols)
-      : m_householder(rows, cols),
-        m_bidiagonal(cols, cols),
-        m_isInitialized(false)
-    {}
+  UpperBidiagonalization(Index rows, Index cols)
+      : m_householder(rows, cols), m_bidiagonal(cols, cols), m_isInitialized(false) {}
 
-    UpperBidiagonalization& compute(const MatrixType& matrix);
-    UpperBidiagonalization& computeUnblocked(const MatrixType& matrix);
-    
-    const MatrixType& householder() const { return m_householder; }
-    const BidiagonalType& bidiagonal() const { return m_bidiagonal; }
-    
-    const HouseholderUSequenceType householderU() const
-    {
-      eigen_assert(m_isInitialized && "UpperBidiagonalization is not initialized.");
-      return HouseholderUSequenceType(m_householder, m_householder.diagonal().conjugate());
-    }
+  UpperBidiagonalization& compute(const MatrixType& matrix);
+  UpperBidiagonalization& computeUnblocked(const MatrixType& matrix);
 
-    const HouseholderVSequenceType householderV() // const here gives nasty errors and i'm lazy
-    {
-      eigen_assert(m_isInitialized && "UpperBidiagonalization is not initialized.");
-      return HouseholderVSequenceType(m_householder.conjugate(), m_householder.const_derived().template diagonal<1>())
-             .setLength(m_householder.cols()-1)
-             .setShift(1);
-    }
-    
-  protected:
-    MatrixType m_householder;
-    BidiagonalType m_bidiagonal;
-    bool m_isInitialized;
+  const MatrixType& householder() const { return m_householder; }
+  const BidiagonalType& bidiagonal() const { return m_bidiagonal; }
+
+  const HouseholderUSequenceType householderU() const {
+    eigen_assert(m_isInitialized && "UpperBidiagonalization is not initialized.");
+    return HouseholderUSequenceType(m_householder, m_householder.diagonal().conjugate());
+  }
+
+  const HouseholderVSequenceType householderV()  // const here gives nasty errors and i'm lazy
+  {
+    eigen_assert(m_isInitialized && "UpperBidiagonalization is not initialized.");
+    return HouseholderVSequenceType(m_householder.conjugate(), m_householder.const_derived().template diagonal<1>())
+        .setLength(m_householder.cols() - 1)
+        .setShift(1);
+  }
+
+ protected:
+  MatrixType m_householder;
+  BidiagonalType m_bidiagonal;
+  bool m_isInitialized;
 };
 
 // Standard upper bidiagonalization without fancy optimizations
 // This version should be faster for small matrix size
-template<typename MatrixType>
-void upperbidiagonalization_inplace_unblocked(MatrixType& mat,
-                                              typename MatrixType::RealScalar *diagonal,
-                                              typename MatrixType::RealScalar *upper_diagonal,
-                                              typename MatrixType::Scalar* tempData = 0)
-{
+template <typename MatrixType>
+void upperbidiagonalization_inplace_unblocked(MatrixType& mat, typename MatrixType::RealScalar* diagonal,
+                                              typename MatrixType::RealScalar* upper_diagonal,
+                                              typename MatrixType::Scalar* tempData = 0) {
   typedef typename MatrixType::Scalar Scalar;
 
   Index rows = mat.rows();
   Index cols = mat.cols();
 
-  typedef Matrix<Scalar,Dynamic,1,ColMajor,MatrixType::MaxRowsAtCompileTime,1> TempType;
+  typedef Matrix<Scalar, Dynamic, 1, ColMajor, MatrixType::MaxRowsAtCompileTime, 1> TempType;
   TempType tempVector;
-  if(tempData==0)
-  {
+  if (tempData == 0) {
     tempVector.resize(rows);
     tempData = tempVector.data();
   }
 
-  for (Index k = 0; /* breaks at k==cols-1 below */ ; ++k)
-  {
+  for (Index k = 0; /* breaks at k==cols-1 below */; ++k) {
     Index remainingRows = rows - k;
     Index remainingCols = cols - k - 1;
 
     // construct left householder transform in-place in A
-    mat.col(k).tail(remainingRows)
-       .makeHouseholderInPlace(mat.coeffRef(k,k), diagonal[k]);
+    mat.col(k).tail(remainingRows).makeHouseholderInPlace(mat.coeffRef(k, k), diagonal[k]);
     // apply householder transform to remaining part of A on the left
     mat.bottomRightCorner(remainingRows, remainingCols)
-       .applyHouseholderOnTheLeft(mat.col(k).tail(remainingRows-1), mat.coeff(k,k), tempData);
+        .applyHouseholderOnTheLeft(mat.col(k).tail(remainingRows - 1), mat.coeff(k, k), tempData);
 
-    if(k == cols-1) break;
+    if (k == cols - 1) break;
 
     // construct right householder transform in-place in mat
-    mat.row(k).tail(remainingCols)
-       .makeHouseholderInPlace(mat.coeffRef(k,k+1), upper_diagonal[k]);
+    mat.row(k).tail(remainingCols).makeHouseholderInPlace(mat.coeffRef(k, k + 1), upper_diagonal[k]);
     // apply householder transform to remaining part of mat on the left
-    mat.bottomRightCorner(remainingRows-1, remainingCols)
-       .applyHouseholderOnTheRight(mat.row(k).tail(remainingCols-1).adjoint(), mat.coeff(k,k+1), tempData);
+    mat.bottomRightCorner(remainingRows - 1, remainingCols)
+        .applyHouseholderOnTheRight(mat.row(k).tail(remainingCols - 1).adjoint(), mat.coeff(k, k + 1), tempData);
   }
 }
 
 /** \internal
-  * Helper routine for the block reduction to upper bidiagonal form.
-  *
-  * Let's partition the matrix A:
-  * 
-  *      | A00 A01 |
-  *  A = |         |
-  *      | A10 A11 |
-  *
-  * This function reduces to bidiagonal form the left \c rows x \a blockSize vertical panel [A00/A10]
-  * and the \a blockSize x \c cols horizontal panel [A00 A01] of the matrix \a A. The bottom-right block A11
-  * is updated using matrix-matrix products:
-  *   A22 -= V * Y^T - X * U^T
-  * where V and U contains the left and right Householder vectors. U and V are stored in A10, and A01
-  * respectively, and the update matrices X and Y are computed during the reduction.
-  * 
-  */
-template<typename MatrixType>
-void upperbidiagonalization_blocked_helper(MatrixType& A,
-                                           typename MatrixType::RealScalar *diagonal,
-                                           typename MatrixType::RealScalar *upper_diagonal,
-                                           Index bs,
-                                           Ref<Matrix<typename MatrixType::Scalar, Dynamic, Dynamic,
-                                                      traits<MatrixType>::Flags & RowMajorBit> > X,
-                                           Ref<Matrix<typename MatrixType::Scalar, Dynamic, Dynamic,
-                                                      traits<MatrixType>::Flags & RowMajorBit> > Y)
-{
+ * Helper routine for the block reduction to upper bidiagonal form.
+ *
+ * Let's partition the matrix A:
+ *
+ *      | A00 A01 |
+ *  A = |         |
+ *      | A10 A11 |
+ *
+ * This function reduces to bidiagonal form the left \c rows x \a blockSize vertical panel [A00/A10]
+ * and the \a blockSize x \c cols horizontal panel [A00 A01] of the matrix \a A. The bottom-right block A11
+ * is updated using matrix-matrix products:
+ *   A22 -= V * Y^T - X * U^T
+ * where V and U contains the left and right Householder vectors. U and V are stored in A10, and A01
+ * respectively, and the update matrices X and Y are computed during the reduction.
+ *
+ */
+template <typename MatrixType>
+void upperbidiagonalization_blocked_helper(
+    MatrixType& A, typename MatrixType::RealScalar* diagonal, typename MatrixType::RealScalar* upper_diagonal, Index bs,
+    Ref<Matrix<typename MatrixType::Scalar, Dynamic, Dynamic, traits<MatrixType>::Flags & RowMajorBit> > X,
+    Ref<Matrix<typename MatrixType::Scalar, Dynamic, Dynamic, traits<MatrixType>::Flags & RowMajorBit> > Y) {
   typedef typename MatrixType::Scalar Scalar;
   typedef typename MatrixType::RealScalar RealScalar;
   typedef typename NumTraits<RealScalar>::Literal Literal;
   static constexpr int StorageOrder = (traits<MatrixType>::Flags & RowMajorBit) ? RowMajor : ColMajor;
   typedef InnerStride<StorageOrder == ColMajor ? 1 : Dynamic> ColInnerStride;
   typedef InnerStride<StorageOrder == ColMajor ? Dynamic : 1> RowInnerStride;
-  typedef Ref<Matrix<Scalar, Dynamic, 1>, 0, ColInnerStride>    SubColumnType;
-  typedef Ref<Matrix<Scalar, 1, Dynamic>, 0, RowInnerStride>    SubRowType;
-  typedef Ref<Matrix<Scalar, Dynamic, Dynamic, StorageOrder > > SubMatType;
+  typedef Ref<Matrix<Scalar, Dynamic, 1>, 0, ColInnerStride> SubColumnType;
+  typedef Ref<Matrix<Scalar, 1, Dynamic>, 0, RowInnerStride> SubRowType;
+  typedef Ref<Matrix<Scalar, Dynamic, Dynamic, StorageOrder> > SubMatType;
 
   Index brows = A.rows();
   Index bcols = A.cols();
 
   Scalar tau_u, tau_u_prev(0), tau_v;
 
-  for(Index k = 0; k < bs; ++k)
-  {
+  for (Index k = 0; k < bs; ++k) {
     Index remainingRows = brows - k;
     Index remainingCols = bcols - k - 1;
 
-    SubMatType X_k1( X.block(k,0, remainingRows,k) );
-    SubMatType V_k1( A.block(k,0, remainingRows,k) );
+    SubMatType X_k1(X.block(k, 0, remainingRows, k));
+    SubMatType V_k1(A.block(k, 0, remainingRows, k));
 
     // 1 - update the k-th column of A
     SubColumnType v_k = A.col(k).tail(remainingRows);
-          v_k -= V_k1 * Y.row(k).head(k).adjoint();
-    if(k) v_k -= X_k1 * A.col(k).head(k);
-    
+    v_k -= V_k1 * Y.row(k).head(k).adjoint();
+    if (k) v_k -= X_k1 * A.col(k).head(k);
+
     // 2 - construct left Householder transform in-place
     v_k.makeHouseholderInPlace(tau_v, diagonal[k]);
-       
-    if(k+1<bcols)
-    {
-      SubMatType Y_k  ( Y.block(k+1,0, remainingCols, k+1) );
-      SubMatType U_k1 ( A.block(0,k+1, k,remainingCols) );
-      
+
+    if (k + 1 < bcols) {
+      SubMatType Y_k(Y.block(k + 1, 0, remainingCols, k + 1));
+      SubMatType U_k1(A.block(0, k + 1, k, remainingCols));
+
       // this eases the application of Householder transforAions
       // A(k,k) will store tau_v later
-      A(k,k) = Scalar(1);
+      A(k, k) = Scalar(1);
 
       // 3 - Compute y_k^T = tau_v * ( A^T*v_k - Y_k-1*V_k-1^T*v_k - U_k-1*X_k-1^T*v_k )
       {
-        SubColumnType y_k( Y.col(k).tail(remainingCols) );
-        
+        SubColumnType y_k(Y.col(k).tail(remainingCols));
+
         // let's use the beginning of column k of Y as a temporary vector
-        SubColumnType tmp( Y.col(k).head(k) );
-        y_k.noalias()  = A.block(k,k+1, remainingRows,remainingCols).adjoint() * v_k; // bottleneck
-        tmp.noalias()  = V_k1.adjoint()  * v_k;
+        SubColumnType tmp(Y.col(k).head(k));
+        y_k.noalias() = A.block(k, k + 1, remainingRows, remainingCols).adjoint() * v_k;  // bottleneck
+        tmp.noalias() = V_k1.adjoint() * v_k;
         y_k.noalias() -= Y_k.leftCols(k) * tmp;
-        tmp.noalias()  = X_k1.adjoint()  * v_k;
-        y_k.noalias() -= U_k1.adjoint()  * tmp;
+        tmp.noalias() = X_k1.adjoint() * v_k;
+        y_k.noalias() -= U_k1.adjoint() * tmp;
         y_k *= numext::conj(tau_v);
       }
 
       // 4 - update k-th row of A (it will become u_k)
-      SubRowType u_k( A.row(k).tail(remainingCols) );
+      SubRowType u_k(A.row(k).tail(remainingCols));
       u_k = u_k.conjugate();
       {
-        u_k -= Y_k * A.row(k).head(k+1).adjoint();
-        if(k) u_k -= U_k1.adjoint() * X.row(k).head(k).adjoint();
+        u_k -= Y_k * A.row(k).head(k + 1).adjoint();
+        if (k) u_k -= U_k1.adjoint() * X.row(k).head(k).adjoint();
       }
 
       // 5 - construct right Householder transform in-place
@@ -234,68 +212,61 @@
 
       // this eases the application of Householder transformations
       // A(k,k+1) will store tau_u later
-      A(k,k+1) = Scalar(1);
+      A(k, k + 1) = Scalar(1);
 
       // 6 - Compute x_k = tau_u * ( A*u_k - X_k-1*U_k-1^T*u_k - V_k*Y_k^T*u_k )
       {
-        SubColumnType x_k ( X.col(k).tail(remainingRows-1) );
-        
+        SubColumnType x_k(X.col(k).tail(remainingRows - 1));
+
         // let's use the beginning of column k of X as a temporary vectors
         // note that tmp0 and tmp1 overlaps
-        SubColumnType tmp0 ( X.col(k).head(k) ),
-                      tmp1 ( X.col(k).head(k+1) );
-                    
-        x_k.noalias()   = A.block(k+1,k+1, remainingRows-1,remainingCols) * u_k.transpose(); // bottleneck
-        tmp0.noalias()  = U_k1 * u_k.transpose();
-        x_k.noalias()  -= X_k1.bottomRows(remainingRows-1) * tmp0;
-        tmp1.noalias()  = Y_k.adjoint() * u_k.transpose();
-        x_k.noalias()  -= A.block(k+1,0, remainingRows-1,k+1) * tmp1;
+        SubColumnType tmp0(X.col(k).head(k)), tmp1(X.col(k).head(k + 1));
+
+        x_k.noalias() = A.block(k + 1, k + 1, remainingRows - 1, remainingCols) * u_k.transpose();  // bottleneck
+        tmp0.noalias() = U_k1 * u_k.transpose();
+        x_k.noalias() -= X_k1.bottomRows(remainingRows - 1) * tmp0;
+        tmp1.noalias() = Y_k.adjoint() * u_k.transpose();
+        x_k.noalias() -= A.block(k + 1, 0, remainingRows - 1, k + 1) * tmp1;
         x_k *= numext::conj(tau_u);
         tau_u = numext::conj(tau_u);
         u_k = u_k.conjugate();
       }
 
-      if(k>0) A.coeffRef(k-1,k) = tau_u_prev;
+      if (k > 0) A.coeffRef(k - 1, k) = tau_u_prev;
       tau_u_prev = tau_u;
-    }
-    else
-      A.coeffRef(k-1,k) = tau_u_prev;
+    } else
+      A.coeffRef(k - 1, k) = tau_u_prev;
 
-    A.coeffRef(k,k) = tau_v;
+    A.coeffRef(k, k) = tau_v;
   }
-  
-  if(bs<bcols)
-    A.coeffRef(bs-1,bs) = tau_u_prev;
+
+  if (bs < bcols) A.coeffRef(bs - 1, bs) = tau_u_prev;
 
   // update A22
-  if(bcols>bs && brows>bs)
-  {
-    SubMatType A11( A.bottomRightCorner(brows-bs,bcols-bs) );
-    SubMatType A10( A.block(bs,0, brows-bs,bs) );
-    SubMatType A01( A.block(0,bs, bs,bcols-bs) );
-    Scalar tmp = A01(bs-1,0);
-    A01(bs-1,0) = Literal(1);
-    A11.noalias() -= A10 * Y.topLeftCorner(bcols,bs).bottomRows(bcols-bs).adjoint();
-    A11.noalias() -= X.topLeftCorner(brows,bs).bottomRows(brows-bs) * A01;
-    A01(bs-1,0) = tmp;
+  if (bcols > bs && brows > bs) {
+    SubMatType A11(A.bottomRightCorner(brows - bs, bcols - bs));
+    SubMatType A10(A.block(bs, 0, brows - bs, bs));
+    SubMatType A01(A.block(0, bs, bs, bcols - bs));
+    Scalar tmp = A01(bs - 1, 0);
+    A01(bs - 1, 0) = Literal(1);
+    A11.noalias() -= A10 * Y.topLeftCorner(bcols, bs).bottomRows(bcols - bs).adjoint();
+    A11.noalias() -= X.topLeftCorner(brows, bs).bottomRows(brows - bs) * A01;
+    A01(bs - 1, 0) = tmp;
   }
 }
 
 /** \internal
-  *
-  * Implementation of a block-bidiagonal reduction.
-  * It is based on the following paper:
-  *   The Design of a Parallel Dense Linear Algebra Software Library: Reduction to Hessenberg, Tridiagonal, and Bidiagonal Form.
-  *   by Jaeyoung Choi, Jack J. Dongarra, David W. Walker. (1995)
-  *   section 3.3
-  */
-template<typename MatrixType, typename BidiagType>
-void upperbidiagonalization_inplace_blocked(MatrixType& A, BidiagType& bidiagonal,
-                                            Index maxBlockSize=32,
-                                            typename MatrixType::Scalar* /*tempData*/ = 0)
-{
+ *
+ * Implementation of a block-bidiagonal reduction.
+ * It is based on the following paper:
+ *   The Design of a Parallel Dense Linear Algebra Software Library: Reduction to Hessenberg, Tridiagonal, and
+ * Bidiagonal Form. by Jaeyoung Choi, Jack J. Dongarra, David W. Walker. (1995) section 3.3
+ */
+template <typename MatrixType, typename BidiagType>
+void upperbidiagonalization_inplace_blocked(MatrixType& A, BidiagType& bidiagonal, Index maxBlockSize = 32,
+                                            typename MatrixType::Scalar* /*tempData*/ = 0) {
   typedef typename MatrixType::Scalar Scalar;
-  typedef Block<MatrixType,Dynamic,Dynamic> BlockType;
+  typedef Block<MatrixType, Dynamic, Dynamic> BlockType;
 
   Index rows = A.rows();
   Index cols = A.cols();
@@ -303,27 +274,20 @@
 
   // X and Y are work space
   static constexpr int StorageOrder = (traits<MatrixType>::Flags & RowMajorBit) ? RowMajor : ColMajor;
-  Matrix<Scalar,
-         MatrixType::RowsAtCompileTime,
-         Dynamic,
-         StorageOrder,
-         MatrixType::MaxRowsAtCompileTime> X(rows,maxBlockSize);
-  Matrix<Scalar,
-         MatrixType::ColsAtCompileTime,
-         Dynamic,
-         StorageOrder,
-         MatrixType::MaxColsAtCompileTime> Y(cols,maxBlockSize);
-  Index blockSize = (std::min)(maxBlockSize,size);
+  Matrix<Scalar, MatrixType::RowsAtCompileTime, Dynamic, StorageOrder, MatrixType::MaxRowsAtCompileTime> X(
+      rows, maxBlockSize);
+  Matrix<Scalar, MatrixType::ColsAtCompileTime, Dynamic, StorageOrder, MatrixType::MaxColsAtCompileTime> Y(
+      cols, maxBlockSize);
+  Index blockSize = (std::min)(maxBlockSize, size);
 
   Index k = 0;
-  for(k = 0; k < size; k += blockSize)
-  {
-    Index bs = (std::min)(size-k,blockSize);  // actual size of the block
-    Index brows = rows - k;                   // rows of the block
-    Index bcols = cols - k;                   // columns of the block
+  for (k = 0; k < size; k += blockSize) {
+    Index bs = (std::min)(size - k, blockSize);  // actual size of the block
+    Index brows = rows - k;                      // rows of the block
+    Index bcols = cols - k;                      // columns of the block
 
     // partition the matrix A:
-    // 
+    //
     //      | A00 A01 A02 |
     //      |             |
     // A  = | A10 A11 A12 |
@@ -336,41 +300,32 @@
     //  B = |         |
     //      | A21 A22 |
 
-    BlockType B = A.block(k,k,brows,bcols);
-    
+    BlockType B = A.block(k, k, brows, bcols);
+
     // This stage performs the bidiagonalization of A11, A21, A12, and updating of A22.
     // Finally, the algorithm continue on the updated A22.
     //
     // However, if B is too small, or A22 empty, then let's use an unblocked strategy
 
     auto upper_diagonal = bidiagonal.template diagonal<1>();
-    typename MatrixType::RealScalar* upper_diagonal_ptr = upper_diagonal.size() > 0 ? &upper_diagonal.coeffRef(k) : nullptr;
+    typename MatrixType::RealScalar* upper_diagonal_ptr =
+        upper_diagonal.size() > 0 ? &upper_diagonal.coeffRef(k) : nullptr;
 
-    if(k+bs==cols || bcols<48) // somewhat arbitrary threshold
+    if (k + bs == cols || bcols < 48)  // somewhat arbitrary threshold
     {
-      upperbidiagonalization_inplace_unblocked(B,
-                                               &(bidiagonal.template diagonal<0>().coeffRef(k)),
-                                               upper_diagonal_ptr,
-                                               X.data()
-                                              );
-      break; // We're done
-    }
-    else
-    {
-      upperbidiagonalization_blocked_helper<BlockType>( B,
-                                                        &(bidiagonal.template diagonal<0>().coeffRef(k)),
-                                                        upper_diagonal_ptr,
-                                                        bs,
-                                                        X.topLeftCorner(brows,bs),
-                                                        Y.topLeftCorner(bcols,bs)
-                                                      );
+      upperbidiagonalization_inplace_unblocked(B, &(bidiagonal.template diagonal<0>().coeffRef(k)), upper_diagonal_ptr,
+                                               X.data());
+      break;  // We're done
+    } else {
+      upperbidiagonalization_blocked_helper<BlockType>(B, &(bidiagonal.template diagonal<0>().coeffRef(k)),
+                                                       upper_diagonal_ptr, bs, X.topLeftCorner(brows, bs),
+                                                       Y.topLeftCorner(bcols, bs));
     }
   }
 }
 
-template<typename MatrixType_>
-UpperBidiagonalization<MatrixType_>& UpperBidiagonalization<MatrixType_>::computeUnblocked(const MatrixType_& matrix)
-{
+template <typename MatrixType_>
+UpperBidiagonalization<MatrixType_>& UpperBidiagonalization<MatrixType_>::computeUnblocked(const MatrixType_& matrix) {
   Index rows = matrix.rows();
   Index cols = matrix.cols();
   EIGEN_ONLY_USED_FOR_DEBUG(cols);
@@ -381,18 +336,15 @@
 
   ColVectorType temp(rows);
 
-  upperbidiagonalization_inplace_unblocked(m_householder,
-                                           &(m_bidiagonal.template diagonal<0>().coeffRef(0)),
-                                           &(m_bidiagonal.template diagonal<1>().coeffRef(0)),
-                                           temp.data());
+  upperbidiagonalization_inplace_unblocked(m_householder, &(m_bidiagonal.template diagonal<0>().coeffRef(0)),
+                                           &(m_bidiagonal.template diagonal<1>().coeffRef(0)), temp.data());
 
   m_isInitialized = true;
   return *this;
 }
 
-template<typename MatrixType_>
-UpperBidiagonalization<MatrixType_>& UpperBidiagonalization<MatrixType_>::compute(const MatrixType_& matrix)
-{
+template <typename MatrixType_>
+UpperBidiagonalization<MatrixType_>& UpperBidiagonalization<MatrixType_>::compute(const MatrixType_& matrix) {
   Index rows = matrix.rows();
   Index cols = matrix.cols();
   EIGEN_ONLY_USED_FOR_DEBUG(rows);
@@ -402,7 +354,7 @@
 
   m_householder = matrix;
   upperbidiagonalization_inplace_blocked(m_householder, m_bidiagonal);
-            
+
   m_isInitialized = true;
   return *this;
 }
@@ -420,8 +372,8 @@
 }
 #endif
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_BIDIAGONALIZATION_H
+#endif  // EIGEN_BIDIAGONALIZATION_H
diff --git a/Eigen/src/SparseCholesky/SimplicialCholesky.h b/Eigen/src/SparseCholesky/SimplicialCholesky.h
index 059066c..423287b 100644
--- a/Eigen/src/SparseCholesky/SimplicialCholesky.h
+++ b/Eigen/src/SparseCholesky/SimplicialCholesky.h
@@ -13,531 +13,479 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
-enum SimplicialCholeskyMode {
-  SimplicialCholeskyLLT,
-  SimplicialCholeskyLDLT
-};
+enum SimplicialCholeskyMode { SimplicialCholeskyLLT, SimplicialCholeskyLDLT };
 
 namespace internal {
-  template<typename CholMatrixType, typename InputMatrixType>
-  struct simplicial_cholesky_grab_input {
-    typedef CholMatrixType const * ConstCholMatrixPtr;
-    static void run(const InputMatrixType& input, ConstCholMatrixPtr &pmat, CholMatrixType &tmp)
-    {
-      tmp = input;
-      pmat = &tmp;
-    }
-  };
-  
-  template<typename MatrixType>
-  struct simplicial_cholesky_grab_input<MatrixType,MatrixType> {
-    typedef MatrixType const * ConstMatrixPtr;
-    static void run(const MatrixType& input, ConstMatrixPtr &pmat, MatrixType &/*tmp*/)
-    {
-      pmat = &input;
-    }
-  };
-} // end namespace internal
+template <typename CholMatrixType, typename InputMatrixType>
+struct simplicial_cholesky_grab_input {
+  typedef CholMatrixType const* ConstCholMatrixPtr;
+  static void run(const InputMatrixType& input, ConstCholMatrixPtr& pmat, CholMatrixType& tmp) {
+    tmp = input;
+    pmat = &tmp;
+  }
+};
+
+template <typename MatrixType>
+struct simplicial_cholesky_grab_input<MatrixType, MatrixType> {
+  typedef MatrixType const* ConstMatrixPtr;
+  static void run(const MatrixType& input, ConstMatrixPtr& pmat, MatrixType& /*tmp*/) { pmat = &input; }
+};
+}  // end namespace internal
 
 /** \ingroup SparseCholesky_Module
-  * \brief A base class for direct sparse Cholesky factorizations
-  *
-  * This is a base class for LL^T and LDL^T Cholesky factorizations of sparse matrices that are
-  * selfadjoint and positive definite. These factorizations allow for solving A.X = B where
-  * X and B can be either dense or sparse.
-  * 
-  * In order to reduce the fill-in, a symmetric permutation P is applied prior to the factorization
-  * such that the factorized matrix is P A P^-1.
-  *
-  * \tparam Derived the type of the derived class, that is the actual factorization type.
-  *
-  */
-template<typename Derived>
-class SimplicialCholeskyBase : public SparseSolverBase<Derived>
-{
-    typedef SparseSolverBase<Derived> Base;
-    using Base::m_isInitialized;
-    
-  public:
-    typedef typename internal::traits<Derived>::MatrixType MatrixType;
-    typedef typename internal::traits<Derived>::OrderingType OrderingType;
-    enum { UpLo = internal::traits<Derived>::UpLo };
-    typedef typename MatrixType::Scalar Scalar;
-    typedef typename MatrixType::RealScalar RealScalar;
-    typedef typename MatrixType::StorageIndex StorageIndex;
-    typedef SparseMatrix<Scalar,ColMajor,StorageIndex> CholMatrixType;
-    typedef CholMatrixType const * ConstCholMatrixPtr;
-    typedef Matrix<Scalar,Dynamic,1> VectorType;
-    typedef Matrix<StorageIndex,Dynamic,1> VectorI;
+ * \brief A base class for direct sparse Cholesky factorizations
+ *
+ * This is a base class for LL^T and LDL^T Cholesky factorizations of sparse matrices that are
+ * selfadjoint and positive definite. These factorizations allow for solving A.X = B where
+ * X and B can be either dense or sparse.
+ *
+ * In order to reduce the fill-in, a symmetric permutation P is applied prior to the factorization
+ * such that the factorized matrix is P A P^-1.
+ *
+ * \tparam Derived the type of the derived class, that is the actual factorization type.
+ *
+ */
+template <typename Derived>
+class SimplicialCholeskyBase : public SparseSolverBase<Derived> {
+  typedef SparseSolverBase<Derived> Base;
+  using Base::m_isInitialized;
 
-    enum {
-      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
-      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
-    };
+ public:
+  typedef typename internal::traits<Derived>::MatrixType MatrixType;
+  typedef typename internal::traits<Derived>::OrderingType OrderingType;
+  enum { UpLo = internal::traits<Derived>::UpLo };
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::RealScalar RealScalar;
+  typedef typename MatrixType::StorageIndex StorageIndex;
+  typedef SparseMatrix<Scalar, ColMajor, StorageIndex> CholMatrixType;
+  typedef CholMatrixType const* ConstCholMatrixPtr;
+  typedef Matrix<Scalar, Dynamic, 1> VectorType;
+  typedef Matrix<StorageIndex, Dynamic, 1> VectorI;
 
-  public:
-    
-    using Base::derived;
+  enum { ColsAtCompileTime = MatrixType::ColsAtCompileTime, MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime };
 
-    /** Default constructor */
-    SimplicialCholeskyBase()
-      : m_info(Success),
-        m_factorizationIsOk(false),
-        m_analysisIsOk(false),
-        m_shiftOffset(0),
-        m_shiftScale(1)
-    {}
+ public:
+  using Base::derived;
 
-    explicit SimplicialCholeskyBase(const MatrixType& matrix)
-      : m_info(Success),
-        m_factorizationIsOk(false),
-        m_analysisIsOk(false),
-        m_shiftOffset(0),
-        m_shiftScale(1)
-    {
-      derived().compute(matrix);
-    }
+  /** Default constructor */
+  SimplicialCholeskyBase()
+      : m_info(Success), m_factorizationIsOk(false), m_analysisIsOk(false), m_shiftOffset(0), m_shiftScale(1) {}
 
-    ~SimplicialCholeskyBase()
-    {
-    }
+  explicit SimplicialCholeskyBase(const MatrixType& matrix)
+      : m_info(Success), m_factorizationIsOk(false), m_analysisIsOk(false), m_shiftOffset(0), m_shiftScale(1) {
+    derived().compute(matrix);
+  }
 
-    Derived& derived() { return *static_cast<Derived*>(this); }
-    const Derived& derived() const { return *static_cast<const Derived*>(this); }
-    
-    inline Index cols() const { return m_matrix.cols(); }
-    inline Index rows() const { return m_matrix.rows(); }
-    
-    /** \brief Reports whether previous computation was successful.
-      *
-      * \returns \c Success if computation was successful,
-      *          \c NumericalIssue if the matrix.appears to be negative.
-      */
-    ComputationInfo info() const
-    {
-      eigen_assert(m_isInitialized && "Decomposition is not initialized.");
-      return m_info;
-    }
-    
-    /** \returns the permutation P
-      * \sa permutationPinv() */
-    const PermutationMatrix<Dynamic,Dynamic,StorageIndex>& permutationP() const
-    { return m_P; }
-    
-    /** \returns the inverse P^-1 of the permutation P
-      * \sa permutationP() */
-    const PermutationMatrix<Dynamic,Dynamic,StorageIndex>& permutationPinv() const
-    { return m_Pinv; }
+  ~SimplicialCholeskyBase() {}
 
-    /** Sets the shift parameters that will be used to adjust the diagonal coefficients during the numerical factorization.
-      *
-      * During the numerical factorization, the diagonal coefficients are transformed by the following linear model:\n
-      * \c d_ii = \a offset + \a scale * \c d_ii
-      *
-      * The default is the identity transformation with \a offset=0, and \a scale=1.
-      *
-      * \returns a reference to \c *this.
-      */
-    Derived& setShift(const RealScalar& offset, const RealScalar& scale = 1)
-    {
-      m_shiftOffset = offset;
-      m_shiftScale = scale;
-      return derived();
-    }
+  Derived& derived() { return *static_cast<Derived*>(this); }
+  const Derived& derived() const { return *static_cast<const Derived*>(this); }
+
+  inline Index cols() const { return m_matrix.cols(); }
+  inline Index rows() const { return m_matrix.rows(); }
+
+  /** \brief Reports whether previous computation was successful.
+   *
+   * \returns \c Success if computation was successful,
+   *          \c NumericalIssue if the matrix.appears to be negative.
+   */
+  ComputationInfo info() const {
+    eigen_assert(m_isInitialized && "Decomposition is not initialized.");
+    return m_info;
+  }
+
+  /** \returns the permutation P
+   * \sa permutationPinv() */
+  const PermutationMatrix<Dynamic, Dynamic, StorageIndex>& permutationP() const { return m_P; }
+
+  /** \returns the inverse P^-1 of the permutation P
+   * \sa permutationP() */
+  const PermutationMatrix<Dynamic, Dynamic, StorageIndex>& permutationPinv() const { return m_Pinv; }
+
+  /** Sets the shift parameters that will be used to adjust the diagonal coefficients during the numerical
+   * factorization.
+   *
+   * During the numerical factorization, the diagonal coefficients are transformed by the following linear model:\n
+   * \c d_ii = \a offset + \a scale * \c d_ii
+   *
+   * The default is the identity transformation with \a offset=0, and \a scale=1.
+   *
+   * \returns a reference to \c *this.
+   */
+  Derived& setShift(const RealScalar& offset, const RealScalar& scale = 1) {
+    m_shiftOffset = offset;
+    m_shiftScale = scale;
+    return derived();
+  }
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-    /** \internal */
-    template<typename Stream>
-    void dumpMemory(Stream& s)
-    {
-      int total = 0;
-      s << "  L:        " << ((total+=(m_matrix.cols()+1) * sizeof(int) + m_matrix.nonZeros()*(sizeof(int)+sizeof(Scalar))) >> 20) << "Mb" << "\n";
-      s << "  diag:     " << ((total+=m_diag.size() * sizeof(Scalar)) >> 20) << "Mb" << "\n";
-      s << "  tree:     " << ((total+=m_parent.size() * sizeof(int)) >> 20) << "Mb" << "\n";
-      s << "  nonzeros: " << ((total+=m_nonZerosPerCol.size() * sizeof(int)) >> 20) << "Mb" << "\n";
-      s << "  perm:     " << ((total+=m_P.size() * sizeof(int)) >> 20) << "Mb" << "\n";
-      s << "  perm^-1:  " << ((total+=m_Pinv.size() * sizeof(int)) >> 20) << "Mb" << "\n";
-      s << "  TOTAL:    " << (total>> 20) << "Mb" << "\n";
+  /** \internal */
+  template <typename Stream>
+  void dumpMemory(Stream& s) {
+    int total = 0;
+    s << "  L:        "
+      << ((total += (m_matrix.cols() + 1) * sizeof(int) + m_matrix.nonZeros() * (sizeof(int) + sizeof(Scalar))) >> 20)
+      << "Mb"
+      << "\n";
+    s << "  diag:     " << ((total += m_diag.size() * sizeof(Scalar)) >> 20) << "Mb"
+      << "\n";
+    s << "  tree:     " << ((total += m_parent.size() * sizeof(int)) >> 20) << "Mb"
+      << "\n";
+    s << "  nonzeros: " << ((total += m_nonZerosPerCol.size() * sizeof(int)) >> 20) << "Mb"
+      << "\n";
+    s << "  perm:     " << ((total += m_P.size() * sizeof(int)) >> 20) << "Mb"
+      << "\n";
+    s << "  perm^-1:  " << ((total += m_Pinv.size() * sizeof(int)) >> 20) << "Mb"
+      << "\n";
+    s << "  TOTAL:    " << (total >> 20) << "Mb"
+      << "\n";
+  }
+
+  /** \internal */
+  template <typename Rhs, typename Dest>
+  void _solve_impl(const MatrixBase<Rhs>& b, MatrixBase<Dest>& dest) const {
+    eigen_assert(m_factorizationIsOk &&
+                 "The decomposition is not in a valid state for solving, you must first call either compute() or "
+                 "symbolic()/numeric()");
+    eigen_assert(m_matrix.rows() == b.rows());
+
+    if (m_info != Success) return;
+
+    if (m_P.size() > 0)
+      dest = m_P * b;
+    else
+      dest = b;
+
+    if (m_matrix.nonZeros() > 0)  // otherwise L==I
+      derived().matrixL().solveInPlace(dest);
+
+    if (m_diag.size() > 0) dest = m_diag.asDiagonal().inverse() * dest;
+
+    if (m_matrix.nonZeros() > 0)  // otherwise U==I
+      derived().matrixU().solveInPlace(dest);
+
+    if (m_P.size() > 0) dest = m_Pinv * dest;
+  }
+
+  template <typename Rhs, typename Dest>
+  void _solve_impl(const SparseMatrixBase<Rhs>& b, SparseMatrixBase<Dest>& dest) const {
+    internal::solve_sparse_through_dense_panels(derived(), b, dest);
+  }
+
+#endif  // EIGEN_PARSED_BY_DOXYGEN
+
+ protected:
+  /** Computes the sparse Cholesky decomposition of \a matrix */
+  template <bool DoLDLT>
+  void compute(const MatrixType& matrix) {
+    eigen_assert(matrix.rows() == matrix.cols());
+    Index size = matrix.cols();
+    CholMatrixType tmp(size, size);
+    ConstCholMatrixPtr pmat;
+    ordering(matrix, pmat, tmp);
+    analyzePattern_preordered(*pmat, DoLDLT);
+    factorize_preordered<DoLDLT>(*pmat);
+  }
+
+  template <bool DoLDLT>
+  void factorize(const MatrixType& a) {
+    eigen_assert(a.rows() == a.cols());
+    Index size = a.cols();
+    CholMatrixType tmp(size, size);
+    ConstCholMatrixPtr pmat;
+
+    if (m_P.size() == 0 && (int(UpLo) & int(Upper)) == Upper) {
+      // If there is no ordering, try to directly use the input matrix without any copy
+      internal::simplicial_cholesky_grab_input<CholMatrixType, MatrixType>::run(a, pmat, tmp);
+    } else {
+      tmp.template selfadjointView<Upper>() = a.template selfadjointView<UpLo>().twistedBy(m_P);
+      pmat = &tmp;
     }
 
-    /** \internal */
-    template<typename Rhs,typename Dest>
-    void _solve_impl(const MatrixBase<Rhs> &b, MatrixBase<Dest> &dest) const
-    {
-      eigen_assert(m_factorizationIsOk && "The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()");
-      eigen_assert(m_matrix.rows()==b.rows());
+    factorize_preordered<DoLDLT>(*pmat);
+  }
 
-      if(m_info!=Success)
-        return;
+  template <bool DoLDLT>
+  void factorize_preordered(const CholMatrixType& a);
 
-      if(m_P.size()>0)
-        dest = m_P * b;
-      else
-        dest = b;
+  void analyzePattern(const MatrixType& a, bool doLDLT) {
+    eigen_assert(a.rows() == a.cols());
+    Index size = a.cols();
+    CholMatrixType tmp(size, size);
+    ConstCholMatrixPtr pmat;
+    ordering(a, pmat, tmp);
+    analyzePattern_preordered(*pmat, doLDLT);
+  }
+  void analyzePattern_preordered(const CholMatrixType& a, bool doLDLT);
 
-      if(m_matrix.nonZeros()>0) // otherwise L==I
-        derived().matrixL().solveInPlace(dest);
+  void ordering(const MatrixType& a, ConstCholMatrixPtr& pmat, CholMatrixType& ap);
 
-      if(m_diag.size()>0)
-        dest = m_diag.asDiagonal().inverse() * dest;
+  /** keeps off-diagonal entries; drops diagonal entries */
+  struct keep_diag {
+    inline bool operator()(const Index& row, const Index& col, const Scalar&) const { return row != col; }
+  };
 
-      if (m_matrix.nonZeros()>0) // otherwise U==I
-        derived().matrixU().solveInPlace(dest);
+  mutable ComputationInfo m_info;
+  bool m_factorizationIsOk;
+  bool m_analysisIsOk;
 
-      if(m_P.size()>0)
-        dest = m_Pinv * dest;
-    }
-    
-    template<typename Rhs,typename Dest>
-    void _solve_impl(const SparseMatrixBase<Rhs> &b, SparseMatrixBase<Dest> &dest) const
-    {
-      internal::solve_sparse_through_dense_panels(derived(), b, dest);
-    }
+  CholMatrixType m_matrix;
+  VectorType m_diag;  // the diagonal coefficients (LDLT mode)
+  VectorI m_parent;   // elimination tree
+  VectorI m_nonZerosPerCol;
+  PermutationMatrix<Dynamic, Dynamic, StorageIndex> m_P;     // the permutation
+  PermutationMatrix<Dynamic, Dynamic, StorageIndex> m_Pinv;  // the inverse permutation
 
-#endif // EIGEN_PARSED_BY_DOXYGEN
-
-  protected:
-    
-    /** Computes the sparse Cholesky decomposition of \a matrix */
-    template<bool DoLDLT>
-    void compute(const MatrixType& matrix)
-    {
-      eigen_assert(matrix.rows()==matrix.cols());
-      Index size = matrix.cols();
-      CholMatrixType tmp(size,size);
-      ConstCholMatrixPtr pmat;
-      ordering(matrix, pmat, tmp);
-      analyzePattern_preordered(*pmat, DoLDLT);
-      factorize_preordered<DoLDLT>(*pmat);
-    }
-    
-    template<bool DoLDLT>
-    void factorize(const MatrixType& a)
-    {
-      eigen_assert(a.rows()==a.cols());
-      Index size = a.cols();
-      CholMatrixType tmp(size,size);
-      ConstCholMatrixPtr pmat;
-      
-      if(m_P.size() == 0 && (int(UpLo) & int(Upper)) == Upper)
-      {
-        // If there is no ordering, try to directly use the input matrix without any copy
-        internal::simplicial_cholesky_grab_input<CholMatrixType,MatrixType>::run(a, pmat, tmp);
-      }
-      else
-      {
-        tmp.template selfadjointView<Upper>() = a.template selfadjointView<UpLo>().twistedBy(m_P);
-        pmat = &tmp;
-      }
-      
-      factorize_preordered<DoLDLT>(*pmat);
-    }
-
-    template<bool DoLDLT>
-    void factorize_preordered(const CholMatrixType& a);
-
-    void analyzePattern(const MatrixType& a, bool doLDLT)
-    {
-      eigen_assert(a.rows()==a.cols());
-      Index size = a.cols();
-      CholMatrixType tmp(size,size);
-      ConstCholMatrixPtr pmat;
-      ordering(a, pmat, tmp);
-      analyzePattern_preordered(*pmat,doLDLT);
-    }
-    void analyzePattern_preordered(const CholMatrixType& a, bool doLDLT);
-    
-    void ordering(const MatrixType& a, ConstCholMatrixPtr &pmat, CholMatrixType& ap);
-
-    /** keeps off-diagonal entries; drops diagonal entries */
-    struct keep_diag {
-      inline bool operator() (const Index& row, const Index& col, const Scalar&) const
-      {
-        return row!=col;
-      }
-    };
-
-    mutable ComputationInfo m_info;
-    bool m_factorizationIsOk;
-    bool m_analysisIsOk;
-    
-    CholMatrixType m_matrix;
-    VectorType m_diag;                                // the diagonal coefficients (LDLT mode)
-    VectorI m_parent;                                 // elimination tree
-    VectorI m_nonZerosPerCol;
-    PermutationMatrix<Dynamic,Dynamic,StorageIndex> m_P;     // the permutation
-    PermutationMatrix<Dynamic,Dynamic,StorageIndex> m_Pinv;  // the inverse permutation
-
-    RealScalar m_shiftOffset;
-    RealScalar m_shiftScale;
+  RealScalar m_shiftOffset;
+  RealScalar m_shiftScale;
 };
 
-template<typename MatrixType_, int UpLo_ = Lower, typename Ordering_ = AMDOrdering<typename MatrixType_::StorageIndex> > class SimplicialLLT;
-template<typename MatrixType_, int UpLo_ = Lower, typename Ordering_ = AMDOrdering<typename MatrixType_::StorageIndex> > class SimplicialLDLT;
-template<typename MatrixType_, int UpLo_ = Lower, typename Ordering_ = AMDOrdering<typename MatrixType_::StorageIndex> > class SimplicialCholesky;
+template <typename MatrixType_, int UpLo_ = Lower,
+          typename Ordering_ = AMDOrdering<typename MatrixType_::StorageIndex> >
+class SimplicialLLT;
+template <typename MatrixType_, int UpLo_ = Lower,
+          typename Ordering_ = AMDOrdering<typename MatrixType_::StorageIndex> >
+class SimplicialLDLT;
+template <typename MatrixType_, int UpLo_ = Lower,
+          typename Ordering_ = AMDOrdering<typename MatrixType_::StorageIndex> >
+class SimplicialCholesky;
 
 namespace internal {
 
-template<typename MatrixType_, int UpLo_, typename Ordering_> struct traits<SimplicialLLT<MatrixType_,UpLo_,Ordering_> >
-{
+template <typename MatrixType_, int UpLo_, typename Ordering_>
+struct traits<SimplicialLLT<MatrixType_, UpLo_, Ordering_> > {
   typedef MatrixType_ MatrixType;
   typedef Ordering_ OrderingType;
   enum { UpLo = UpLo_ };
-  typedef typename MatrixType::Scalar                         Scalar;
-  typedef typename MatrixType::StorageIndex                   StorageIndex;
-  typedef SparseMatrix<Scalar, ColMajor, StorageIndex>        CholMatrixType;
-  typedef TriangularView<const CholMatrixType, Eigen::Lower>  MatrixL;
-  typedef TriangularView<const typename CholMatrixType::AdjointReturnType, Eigen::Upper>   MatrixU;
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::StorageIndex StorageIndex;
+  typedef SparseMatrix<Scalar, ColMajor, StorageIndex> CholMatrixType;
+  typedef TriangularView<const CholMatrixType, Eigen::Lower> MatrixL;
+  typedef TriangularView<const typename CholMatrixType::AdjointReturnType, Eigen::Upper> MatrixU;
   static inline MatrixL getL(const CholMatrixType& m) { return MatrixL(m); }
   static inline MatrixU getU(const CholMatrixType& m) { return MatrixU(m.adjoint()); }
 };
 
-template<typename MatrixType_,int UpLo_, typename Ordering_> struct traits<SimplicialLDLT<MatrixType_,UpLo_,Ordering_> >
-{
+template <typename MatrixType_, int UpLo_, typename Ordering_>
+struct traits<SimplicialLDLT<MatrixType_, UpLo_, Ordering_> > {
   typedef MatrixType_ MatrixType;
   typedef Ordering_ OrderingType;
   enum { UpLo = UpLo_ };
-  typedef typename MatrixType::Scalar                             Scalar;
-  typedef typename MatrixType::StorageIndex                       StorageIndex;
-  typedef SparseMatrix<Scalar, ColMajor, StorageIndex>            CholMatrixType;
-  typedef TriangularView<const CholMatrixType, Eigen::UnitLower>  MatrixL;
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::StorageIndex StorageIndex;
+  typedef SparseMatrix<Scalar, ColMajor, StorageIndex> CholMatrixType;
+  typedef TriangularView<const CholMatrixType, Eigen::UnitLower> MatrixL;
   typedef TriangularView<const typename CholMatrixType::AdjointReturnType, Eigen::UnitUpper> MatrixU;
   static inline MatrixL getL(const CholMatrixType& m) { return MatrixL(m); }
   static inline MatrixU getU(const CholMatrixType& m) { return MatrixU(m.adjoint()); }
 };
 
-template<typename MatrixType_, int UpLo_, typename Ordering_> struct traits<SimplicialCholesky<MatrixType_,UpLo_,Ordering_> >
-{
+template <typename MatrixType_, int UpLo_, typename Ordering_>
+struct traits<SimplicialCholesky<MatrixType_, UpLo_, Ordering_> > {
   typedef MatrixType_ MatrixType;
   typedef Ordering_ OrderingType;
   enum { UpLo = UpLo_ };
 };
 
-}
+}  // namespace internal
 
 /** \ingroup SparseCholesky_Module
-  * \class SimplicialLLT
-  * \brief A direct sparse LLT Cholesky factorizations
-  *
-  * This class provides a LL^T Cholesky factorizations of sparse matrices that are
-  * selfadjoint and positive definite. The factorization allows for solving A.X = B where
-  * X and B can be either dense or sparse.
-  * 
-  * In order to reduce the fill-in, a symmetric permutation P is applied prior to the factorization
-  * such that the factorized matrix is P A P^-1.
-  *
-  * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
-  * \tparam UpLo_ the triangular part that will be used for the computations. It can be Lower
-  *               or Upper. Default is Lower.
-  * \tparam Ordering_ The ordering method to use, either AMDOrdering<> or NaturalOrdering<>. Default is AMDOrdering<>
-  *
-  * \implsparsesolverconcept
-  *
-  * \sa class SimplicialLDLT, class AMDOrdering, class NaturalOrdering
-  */
-template<typename MatrixType_, int UpLo_, typename Ordering_>
-    class SimplicialLLT : public SimplicialCholeskyBase<SimplicialLLT<MatrixType_,UpLo_,Ordering_> >
-{
-public:
-    typedef MatrixType_ MatrixType;
-    enum { UpLo = UpLo_ };
-    typedef SimplicialCholeskyBase<SimplicialLLT> Base;
-    typedef typename MatrixType::Scalar Scalar;
-    typedef typename MatrixType::RealScalar RealScalar;
-    typedef typename MatrixType::StorageIndex StorageIndex;
-    typedef SparseMatrix<Scalar,ColMajor,Index> CholMatrixType;
-    typedef Matrix<Scalar,Dynamic,1> VectorType;
-    typedef internal::traits<SimplicialLLT> Traits;
-    typedef typename Traits::MatrixL  MatrixL;
-    typedef typename Traits::MatrixU  MatrixU;
-public:
-    /** Default constructor */
-    SimplicialLLT() : Base() {}
-    /** Constructs and performs the LLT factorization of \a matrix */
-    explicit SimplicialLLT(const MatrixType& matrix)
-        : Base(matrix) {}
+ * \class SimplicialLLT
+ * \brief A direct sparse LLT Cholesky factorizations
+ *
+ * This class provides a LL^T Cholesky factorizations of sparse matrices that are
+ * selfadjoint and positive definite. The factorization allows for solving A.X = B where
+ * X and B can be either dense or sparse.
+ *
+ * In order to reduce the fill-in, a symmetric permutation P is applied prior to the factorization
+ * such that the factorized matrix is P A P^-1.
+ *
+ * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
+ * \tparam UpLo_ the triangular part that will be used for the computations. It can be Lower
+ *               or Upper. Default is Lower.
+ * \tparam Ordering_ The ordering method to use, either AMDOrdering<> or NaturalOrdering<>. Default is AMDOrdering<>
+ *
+ * \implsparsesolverconcept
+ *
+ * \sa class SimplicialLDLT, class AMDOrdering, class NaturalOrdering
+ */
+template <typename MatrixType_, int UpLo_, typename Ordering_>
+class SimplicialLLT : public SimplicialCholeskyBase<SimplicialLLT<MatrixType_, UpLo_, Ordering_> > {
+ public:
+  typedef MatrixType_ MatrixType;
+  enum { UpLo = UpLo_ };
+  typedef SimplicialCholeskyBase<SimplicialLLT> Base;
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::RealScalar RealScalar;
+  typedef typename MatrixType::StorageIndex StorageIndex;
+  typedef SparseMatrix<Scalar, ColMajor, Index> CholMatrixType;
+  typedef Matrix<Scalar, Dynamic, 1> VectorType;
+  typedef internal::traits<SimplicialLLT> Traits;
+  typedef typename Traits::MatrixL MatrixL;
+  typedef typename Traits::MatrixU MatrixU;
 
-    /** \returns an expression of the factor L */
-    inline const MatrixL matrixL() const {
-        eigen_assert(Base::m_factorizationIsOk && "Simplicial LLT not factorized");
-        return Traits::getL(Base::m_matrix);
-    }
+ public:
+  /** Default constructor */
+  SimplicialLLT() : Base() {}
+  /** Constructs and performs the LLT factorization of \a matrix */
+  explicit SimplicialLLT(const MatrixType& matrix) : Base(matrix) {}
 
-    /** \returns an expression of the factor U (= L^*) */
-    inline const MatrixU matrixU() const {
-        eigen_assert(Base::m_factorizationIsOk && "Simplicial LLT not factorized");
-        return Traits::getU(Base::m_matrix);
-    }
-    
-    /** Computes the sparse Cholesky decomposition of \a matrix */
-    SimplicialLLT& compute(const MatrixType& matrix)
-    {
-      Base::template compute<false>(matrix);
-      return *this;
-    }
+  /** \returns an expression of the factor L */
+  inline const MatrixL matrixL() const {
+    eigen_assert(Base::m_factorizationIsOk && "Simplicial LLT not factorized");
+    return Traits::getL(Base::m_matrix);
+  }
 
-    /** Performs a symbolic decomposition on the sparcity of \a matrix.
-      *
-      * This function is particularly useful when solving for several problems having the same structure.
-      *
-      * \sa factorize()
-      */
-    void analyzePattern(const MatrixType& a)
-    {
-      Base::analyzePattern(a, false);
-    }
+  /** \returns an expression of the factor U (= L^*) */
+  inline const MatrixU matrixU() const {
+    eigen_assert(Base::m_factorizationIsOk && "Simplicial LLT not factorized");
+    return Traits::getU(Base::m_matrix);
+  }
 
-    /** Performs a numeric decomposition of \a matrix
-      *
-      * The given matrix must has the same sparcity than the matrix on which the symbolic decomposition has been performed.
-      *
-      * \sa analyzePattern()
-      */
-    void factorize(const MatrixType& a)
-    {
-      Base::template factorize<false>(a);
-    }
+  /** Computes the sparse Cholesky decomposition of \a matrix */
+  SimplicialLLT& compute(const MatrixType& matrix) {
+    Base::template compute<false>(matrix);
+    return *this;
+  }
 
-    /** \returns the determinant of the underlying matrix from the current factorization */
-    Scalar determinant() const
-    {
-      Scalar detL = Base::m_matrix.diagonal().prod();
-      return numext::abs2(detL);
-    }
+  /** Performs a symbolic decomposition on the sparcity of \a matrix.
+   *
+   * This function is particularly useful when solving for several problems having the same structure.
+   *
+   * \sa factorize()
+   */
+  void analyzePattern(const MatrixType& a) { Base::analyzePattern(a, false); }
+
+  /** Performs a numeric decomposition of \a matrix
+   *
+   * The given matrix must has the same sparcity than the matrix on which the symbolic decomposition has been performed.
+   *
+   * \sa analyzePattern()
+   */
+  void factorize(const MatrixType& a) { Base::template factorize<false>(a); }
+
+  /** \returns the determinant of the underlying matrix from the current factorization */
+  Scalar determinant() const {
+    Scalar detL = Base::m_matrix.diagonal().prod();
+    return numext::abs2(detL);
+  }
 };
 
 /** \ingroup SparseCholesky_Module
-  * \class SimplicialLDLT
-  * \brief A direct sparse LDLT Cholesky factorizations without square root.
-  *
-  * This class provides a LDL^T Cholesky factorizations without square root of sparse matrices that are
-  * selfadjoint and positive definite. The factorization allows for solving A.X = B where
-  * X and B can be either dense or sparse.
-  * 
-  * In order to reduce the fill-in, a symmetric permutation P is applied prior to the factorization
-  * such that the factorized matrix is P A P^-1.
-  *
-  * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
-  * \tparam UpLo_ the triangular part that will be used for the computations. It can be Lower
-  *               or Upper. Default is Lower.
-  * \tparam Ordering_ The ordering method to use, either AMDOrdering<> or NaturalOrdering<>. Default is AMDOrdering<>
-  *
-  * \implsparsesolverconcept
-  *
-  * \sa class SimplicialLLT, class AMDOrdering, class NaturalOrdering
-  */
-template<typename MatrixType_, int UpLo_, typename Ordering_>
-    class SimplicialLDLT : public SimplicialCholeskyBase<SimplicialLDLT<MatrixType_,UpLo_,Ordering_> >
-{
-public:
-    typedef MatrixType_ MatrixType;
-    enum { UpLo = UpLo_ };
-    typedef SimplicialCholeskyBase<SimplicialLDLT> Base;
-    typedef typename MatrixType::Scalar Scalar;
-    typedef typename MatrixType::RealScalar RealScalar;
-    typedef typename MatrixType::StorageIndex StorageIndex;
-    typedef SparseMatrix<Scalar,ColMajor,StorageIndex> CholMatrixType;
-    typedef Matrix<Scalar,Dynamic,1> VectorType;
-    typedef internal::traits<SimplicialLDLT> Traits;
-    typedef typename Traits::MatrixL  MatrixL;
-    typedef typename Traits::MatrixU  MatrixU;
-public:
-    /** Default constructor */
-    SimplicialLDLT() : Base() {}
+ * \class SimplicialLDLT
+ * \brief A direct sparse LDLT Cholesky factorizations without square root.
+ *
+ * This class provides a LDL^T Cholesky factorizations without square root of sparse matrices that are
+ * selfadjoint and positive definite. The factorization allows for solving A.X = B where
+ * X and B can be either dense or sparse.
+ *
+ * In order to reduce the fill-in, a symmetric permutation P is applied prior to the factorization
+ * such that the factorized matrix is P A P^-1.
+ *
+ * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
+ * \tparam UpLo_ the triangular part that will be used for the computations. It can be Lower
+ *               or Upper. Default is Lower.
+ * \tparam Ordering_ The ordering method to use, either AMDOrdering<> or NaturalOrdering<>. Default is AMDOrdering<>
+ *
+ * \implsparsesolverconcept
+ *
+ * \sa class SimplicialLLT, class AMDOrdering, class NaturalOrdering
+ */
+template <typename MatrixType_, int UpLo_, typename Ordering_>
+class SimplicialLDLT : public SimplicialCholeskyBase<SimplicialLDLT<MatrixType_, UpLo_, Ordering_> > {
+ public:
+  typedef MatrixType_ MatrixType;
+  enum { UpLo = UpLo_ };
+  typedef SimplicialCholeskyBase<SimplicialLDLT> Base;
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::RealScalar RealScalar;
+  typedef typename MatrixType::StorageIndex StorageIndex;
+  typedef SparseMatrix<Scalar, ColMajor, StorageIndex> CholMatrixType;
+  typedef Matrix<Scalar, Dynamic, 1> VectorType;
+  typedef internal::traits<SimplicialLDLT> Traits;
+  typedef typename Traits::MatrixL MatrixL;
+  typedef typename Traits::MatrixU MatrixU;
 
-    /** Constructs and performs the LLT factorization of \a matrix */
-    explicit SimplicialLDLT(const MatrixType& matrix)
-        : Base(matrix) {}
+ public:
+  /** Default constructor */
+  SimplicialLDLT() : Base() {}
 
-    /** \returns a vector expression of the diagonal D */
-    inline const VectorType vectorD() const {
-        eigen_assert(Base::m_factorizationIsOk && "Simplicial LDLT not factorized");
-        return Base::m_diag;
-    }
-    /** \returns an expression of the factor L */
-    inline const MatrixL matrixL() const {
-        eigen_assert(Base::m_factorizationIsOk && "Simplicial LDLT not factorized");
-        return Traits::getL(Base::m_matrix);
-    }
+  /** Constructs and performs the LLT factorization of \a matrix */
+  explicit SimplicialLDLT(const MatrixType& matrix) : Base(matrix) {}
 
-    /** \returns an expression of the factor U (= L^*) */
-    inline const MatrixU matrixU() const {
-        eigen_assert(Base::m_factorizationIsOk && "Simplicial LDLT not factorized");
-        return Traits::getU(Base::m_matrix);
-    }
+  /** \returns a vector expression of the diagonal D */
+  inline const VectorType vectorD() const {
+    eigen_assert(Base::m_factorizationIsOk && "Simplicial LDLT not factorized");
+    return Base::m_diag;
+  }
+  /** \returns an expression of the factor L */
+  inline const MatrixL matrixL() const {
+    eigen_assert(Base::m_factorizationIsOk && "Simplicial LDLT not factorized");
+    return Traits::getL(Base::m_matrix);
+  }
 
-    /** Computes the sparse Cholesky decomposition of \a matrix */
-    SimplicialLDLT& compute(const MatrixType& matrix)
-    {
-      Base::template compute<true>(matrix);
-      return *this;
-    }
-    
-    /** Performs a symbolic decomposition on the sparcity of \a matrix.
-      *
-      * This function is particularly useful when solving for several problems having the same structure.
-      *
-      * \sa factorize()
-      */
-    void analyzePattern(const MatrixType& a)
-    {
-      Base::analyzePattern(a, true);
-    }
+  /** \returns an expression of the factor U (= L^*) */
+  inline const MatrixU matrixU() const {
+    eigen_assert(Base::m_factorizationIsOk && "Simplicial LDLT not factorized");
+    return Traits::getU(Base::m_matrix);
+  }
 
-    /** Performs a numeric decomposition of \a matrix
-      *
-      * The given matrix must has the same sparcity than the matrix on which the symbolic decomposition has been performed.
-      *
-      * \sa analyzePattern()
-      */
-    void factorize(const MatrixType& a)
-    {
-      Base::template factorize<true>(a);
-    }
+  /** Computes the sparse Cholesky decomposition of \a matrix */
+  SimplicialLDLT& compute(const MatrixType& matrix) {
+    Base::template compute<true>(matrix);
+    return *this;
+  }
 
-    /** \returns the determinant of the underlying matrix from the current factorization */
-    Scalar determinant() const
-    {
-      return Base::m_diag.prod();
-    }
+  /** Performs a symbolic decomposition on the sparcity of \a matrix.
+   *
+   * This function is particularly useful when solving for several problems having the same structure.
+   *
+   * \sa factorize()
+   */
+  void analyzePattern(const MatrixType& a) { Base::analyzePattern(a, true); }
+
+  /** Performs a numeric decomposition of \a matrix
+   *
+   * The given matrix must has the same sparcity than the matrix on which the symbolic decomposition has been performed.
+   *
+   * \sa analyzePattern()
+   */
+  void factorize(const MatrixType& a) { Base::template factorize<true>(a); }
+
+  /** \returns the determinant of the underlying matrix from the current factorization */
+  Scalar determinant() const { return Base::m_diag.prod(); }
 };
 
 /** \deprecated use SimplicialLDLT or class SimplicialLLT
-  * \ingroup SparseCholesky_Module
-  * \class SimplicialCholesky
-  *
-  * \sa class SimplicialLDLT, class SimplicialLLT
-  */
-template<typename MatrixType_, int UpLo_, typename Ordering_>
-    class SimplicialCholesky : public SimplicialCholeskyBase<SimplicialCholesky<MatrixType_,UpLo_,Ordering_> >
-{
-public:
-    typedef MatrixType_ MatrixType;
-    enum { UpLo = UpLo_ };
-    typedef SimplicialCholeskyBase<SimplicialCholesky> Base;
-    typedef typename MatrixType::Scalar Scalar;
-    typedef typename MatrixType::RealScalar RealScalar;
-    typedef typename MatrixType::StorageIndex StorageIndex;
-    typedef SparseMatrix<Scalar,ColMajor,StorageIndex> CholMatrixType;
-    typedef Matrix<Scalar,Dynamic,1> VectorType;
-    typedef internal::traits<SimplicialCholesky> Traits;
-    typedef internal::traits<SimplicialLDLT<MatrixType,UpLo> > LDLTTraits;
-    typedef internal::traits<SimplicialLLT<MatrixType,UpLo>  > LLTTraits;
-  public:
-    SimplicialCholesky() : Base(), m_LDLT(true) {}
+ * \ingroup SparseCholesky_Module
+ * \class SimplicialCholesky
+ *
+ * \sa class SimplicialLDLT, class SimplicialLLT
+ */
+template <typename MatrixType_, int UpLo_, typename Ordering_>
+class SimplicialCholesky : public SimplicialCholeskyBase<SimplicialCholesky<MatrixType_, UpLo_, Ordering_> > {
+ public:
+  typedef MatrixType_ MatrixType;
+  enum { UpLo = UpLo_ };
+  typedef SimplicialCholeskyBase<SimplicialCholesky> Base;
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::RealScalar RealScalar;
+  typedef typename MatrixType::StorageIndex StorageIndex;
+  typedef SparseMatrix<Scalar, ColMajor, StorageIndex> CholMatrixType;
+  typedef Matrix<Scalar, Dynamic, 1> VectorType;
+  typedef internal::traits<SimplicialCholesky> Traits;
+  typedef internal::traits<SimplicialLDLT<MatrixType, UpLo> > LDLTTraits;
+  typedef internal::traits<SimplicialLLT<MatrixType, UpLo> > LLTTraits;
 
-    explicit SimplicialCholesky(const MatrixType& matrix)
-      : Base(), m_LDLT(true)
-    {
-      compute(matrix);
-    }
+ public:
+  SimplicialCholesky() : Base(), m_LDLT(true) {}
 
-    SimplicialCholesky& setMode(SimplicialCholeskyMode mode)
-    {
-      switch(mode)
-      {
+  explicit SimplicialCholesky(const MatrixType& matrix) : Base(), m_LDLT(true) { compute(matrix); }
+
+  SimplicialCholesky& setMode(SimplicialCholeskyMode mode) {
+    switch (mode) {
       case SimplicialCholeskyLLT:
         m_LDLT = false;
         break;
@@ -546,155 +494,139 @@
         break;
       default:
         break;
-      }
-
-      return *this;
     }
 
-    inline const VectorType vectorD() const {
-        eigen_assert(Base::m_factorizationIsOk && "Simplicial Cholesky not factorized");
-        return Base::m_diag;
-    }
-    inline const CholMatrixType rawMatrix() const {
-        eigen_assert(Base::m_factorizationIsOk && "Simplicial Cholesky not factorized");
-        return Base::m_matrix;
-    }
-    
-    /** Computes the sparse Cholesky decomposition of \a matrix */
-    SimplicialCholesky& compute(const MatrixType& matrix)
+    return *this;
+  }
+
+  inline const VectorType vectorD() const {
+    eigen_assert(Base::m_factorizationIsOk && "Simplicial Cholesky not factorized");
+    return Base::m_diag;
+  }
+  inline const CholMatrixType rawMatrix() const {
+    eigen_assert(Base::m_factorizationIsOk && "Simplicial Cholesky not factorized");
+    return Base::m_matrix;
+  }
+
+  /** Computes the sparse Cholesky decomposition of \a matrix */
+  SimplicialCholesky& compute(const MatrixType& matrix) {
+    if (m_LDLT)
+      Base::template compute<true>(matrix);
+    else
+      Base::template compute<false>(matrix);
+    return *this;
+  }
+
+  /** Performs a symbolic decomposition on the sparcity of \a matrix.
+   *
+   * This function is particularly useful when solving for several problems having the same structure.
+   *
+   * \sa factorize()
+   */
+  void analyzePattern(const MatrixType& a) { Base::analyzePattern(a, m_LDLT); }
+
+  /** Performs a numeric decomposition of \a matrix
+   *
+   * The given matrix must has the same sparcity than the matrix on which the symbolic decomposition has been performed.
+   *
+   * \sa analyzePattern()
+   */
+  void factorize(const MatrixType& a) {
+    if (m_LDLT)
+      Base::template factorize<true>(a);
+    else
+      Base::template factorize<false>(a);
+  }
+
+  /** \internal */
+  template <typename Rhs, typename Dest>
+  void _solve_impl(const MatrixBase<Rhs>& b, MatrixBase<Dest>& dest) const {
+    eigen_assert(Base::m_factorizationIsOk &&
+                 "The decomposition is not in a valid state for solving, you must first call either compute() or "
+                 "symbolic()/numeric()");
+    eigen_assert(Base::m_matrix.rows() == b.rows());
+
+    if (Base::m_info != Success) return;
+
+    if (Base::m_P.size() > 0)
+      dest = Base::m_P * b;
+    else
+      dest = b;
+
+    if (Base::m_matrix.nonZeros() > 0)  // otherwise L==I
     {
-      if(m_LDLT)
-        Base::template compute<true>(matrix);
+      if (m_LDLT)
+        LDLTTraits::getL(Base::m_matrix).solveInPlace(dest);
       else
-        Base::template compute<false>(matrix);
-      return *this;
+        LLTTraits::getL(Base::m_matrix).solveInPlace(dest);
     }
 
-    /** Performs a symbolic decomposition on the sparcity of \a matrix.
-      *
-      * This function is particularly useful when solving for several problems having the same structure.
-      *
-      * \sa factorize()
-      */
-    void analyzePattern(const MatrixType& a)
-    {
-      Base::analyzePattern(a, m_LDLT);
-    }
+    if (Base::m_diag.size() > 0) dest = Base::m_diag.real().asDiagonal().inverse() * dest;
 
-    /** Performs a numeric decomposition of \a matrix
-      *
-      * The given matrix must has the same sparcity than the matrix on which the symbolic decomposition has been performed.
-      *
-      * \sa analyzePattern()
-      */
-    void factorize(const MatrixType& a)
+    if (Base::m_matrix.nonZeros() > 0)  // otherwise I==I
     {
-      if(m_LDLT)
-        Base::template factorize<true>(a);
+      if (m_LDLT)
+        LDLTTraits::getU(Base::m_matrix).solveInPlace(dest);
       else
-        Base::template factorize<false>(a);
+        LLTTraits::getU(Base::m_matrix).solveInPlace(dest);
     }
 
-    /** \internal */
-    template<typename Rhs,typename Dest>
-    void _solve_impl(const MatrixBase<Rhs> &b, MatrixBase<Dest> &dest) const
-    {
-      eigen_assert(Base::m_factorizationIsOk && "The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()");
-      eigen_assert(Base::m_matrix.rows()==b.rows());
+    if (Base::m_P.size() > 0) dest = Base::m_Pinv * dest;
+  }
 
-      if(Base::m_info!=Success)
-        return;
+  /** \internal */
+  template <typename Rhs, typename Dest>
+  void _solve_impl(const SparseMatrixBase<Rhs>& b, SparseMatrixBase<Dest>& dest) const {
+    internal::solve_sparse_through_dense_panels(*this, b, dest);
+  }
 
-      if(Base::m_P.size()>0)
-        dest = Base::m_P * b;
-      else
-        dest = b;
-
-      if(Base::m_matrix.nonZeros()>0) // otherwise L==I
-      {
-        if(m_LDLT)
-          LDLTTraits::getL(Base::m_matrix).solveInPlace(dest);
-        else
-          LLTTraits::getL(Base::m_matrix).solveInPlace(dest);
-      }
-
-      if(Base::m_diag.size()>0)
-        dest = Base::m_diag.real().asDiagonal().inverse() * dest;
-
-      if (Base::m_matrix.nonZeros()>0) // otherwise I==I
-      {
-        if(m_LDLT)
-          LDLTTraits::getU(Base::m_matrix).solveInPlace(dest);
-        else
-          LLTTraits::getU(Base::m_matrix).solveInPlace(dest);
-      }
-
-      if(Base::m_P.size()>0)
-        dest = Base::m_Pinv * dest;
+  Scalar determinant() const {
+    if (m_LDLT) {
+      return Base::m_diag.prod();
+    } else {
+      Scalar detL = Diagonal<const CholMatrixType>(Base::m_matrix).prod();
+      return numext::abs2(detL);
     }
-    
-    /** \internal */
-    template<typename Rhs,typename Dest>
-    void _solve_impl(const SparseMatrixBase<Rhs> &b, SparseMatrixBase<Dest> &dest) const
-    {
-      internal::solve_sparse_through_dense_panels(*this, b, dest);
-    }
-    
-    Scalar determinant() const
-    {
-      if(m_LDLT)
-      {
-        return Base::m_diag.prod();
-      }
-      else
-      {
-        Scalar detL = Diagonal<const CholMatrixType>(Base::m_matrix).prod();
-        return numext::abs2(detL);
-      }
-    }
-    
-  protected:
-    bool m_LDLT;
+  }
+
+ protected:
+  bool m_LDLT;
 };
 
-template<typename Derived>
-void SimplicialCholeskyBase<Derived>::ordering(const MatrixType& a, ConstCholMatrixPtr &pmat, CholMatrixType& ap)
-{
-  eigen_assert(a.rows()==a.cols());
+template <typename Derived>
+void SimplicialCholeskyBase<Derived>::ordering(const MatrixType& a, ConstCholMatrixPtr& pmat, CholMatrixType& ap) {
+  eigen_assert(a.rows() == a.cols());
   const Index size = a.rows();
   pmat = &ap;
   // Note that ordering methods compute the inverse permutation
-  if(!internal::is_same<OrderingType,NaturalOrdering<Index> >::value)
-  {
+  if (!internal::is_same<OrderingType, NaturalOrdering<Index> >::value) {
     {
       CholMatrixType C;
       C = a.template selfadjointView<UpLo>();
-      
+
       OrderingType ordering;
-      ordering(C,m_Pinv);
+      ordering(C, m_Pinv);
     }
 
-    if(m_Pinv.size()>0) m_P = m_Pinv.inverse();
-    else                m_P.resize(0);
-    
-    ap.resize(size,size);
+    if (m_Pinv.size() > 0)
+      m_P = m_Pinv.inverse();
+    else
+      m_P.resize(0);
+
+    ap.resize(size, size);
     ap.template selfadjointView<Upper>() = a.template selfadjointView<UpLo>().twistedBy(m_P);
-  }
-  else
-  {
+  } else {
     m_Pinv.resize(0);
     m_P.resize(0);
-    if(int(UpLo)==int(Lower) || MatrixType::IsRowMajor)
-    {
+    if (int(UpLo) == int(Lower) || MatrixType::IsRowMajor) {
       // we have to transpose the lower part to to the upper one
-      ap.resize(size,size);
+      ap.resize(size, size);
       ap.template selfadjointView<Upper>() = a.template selfadjointView<UpLo>();
-    }
-    else
-      internal::simplicial_cholesky_grab_input<CholMatrixType,MatrixType>::run(a, pmat, ap);
-  }  
+    } else
+      internal::simplicial_cholesky_grab_input<CholMatrixType, MatrixType>::run(a, pmat, ap);
+  }
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SIMPLICIAL_CHOLESKY_H
+#endif  // EIGEN_SIMPLICIAL_CHOLESKY_H
diff --git a/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h b/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h
index 086e0f7..abfbbe6 100644
--- a/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h
+++ b/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h
@@ -25,9 +25,8 @@
 
 namespace Eigen {
 
-template<typename Derived>
-void SimplicialCholeskyBase<Derived>::analyzePattern_preordered(const CholMatrixType& ap, bool doLDLT)
-{
+template <typename Derived>
+void SimplicialCholeskyBase<Derived>::analyzePattern_preordered(const CholMatrixType& ap, bool doLDLT) {
   const StorageIndex size = StorageIndex(ap.rows());
   m_matrix.resize(size, size);
   m_parent.resize(size);
@@ -35,25 +34,20 @@
 
   ei_declare_aligned_stack_constructed_variable(StorageIndex, tags, size, 0);
 
-  for(StorageIndex k = 0; k < size; ++k)
-  {
+  for (StorageIndex k = 0; k < size; ++k) {
     /* L(k,:) pattern: all nodes reachable in etree from nz in A(0:k-1,k) */
-    m_parent[k] = -1;             /* parent of k is not yet known */
-    tags[k] = k;                  /* mark node k as visited */
-    m_nonZerosPerCol[k] = 0;      /* count of nonzeros in column k of L */
-    for(typename CholMatrixType::InnerIterator it(ap,k); it; ++it)
-    {
+    m_parent[k] = -1;        /* parent of k is not yet known */
+    tags[k] = k;             /* mark node k as visited */
+    m_nonZerosPerCol[k] = 0; /* count of nonzeros in column k of L */
+    for (typename CholMatrixType::InnerIterator it(ap, k); it; ++it) {
       StorageIndex i = it.index();
-      if(i < k)
-      {
+      if (i < k) {
         /* follow path from i to root of etree, stop at flagged node */
-        for(; tags[i] != k; i = m_parent[i])
-        {
+        for (; tags[i] != k; i = m_parent[i]) {
           /* find parent of i if not yet determined */
-          if (m_parent[i] == -1)
-            m_parent[i] = k;
-          m_nonZerosPerCol[i]++;        /* L (k,i) is nonzero */
-          tags[i] = k;                  /* mark i as visited */
+          if (m_parent[i] == -1) m_parent[i] = k;
+          m_nonZerosPerCol[i]++; /* L (k,i) is nonzero */
+          tags[i] = k;           /* mark i as visited */
         }
       }
     }
@@ -62,28 +56,25 @@
   /* construct Lp index array from m_nonZerosPerCol column counts */
   StorageIndex* Lp = m_matrix.outerIndexPtr();
   Lp[0] = 0;
-  for(StorageIndex k = 0; k < size; ++k)
-    Lp[k+1] = Lp[k] + m_nonZerosPerCol[k] + (doLDLT ? 0 : 1);
+  for (StorageIndex k = 0; k < size; ++k) Lp[k + 1] = Lp[k] + m_nonZerosPerCol[k] + (doLDLT ? 0 : 1);
 
   m_matrix.resizeNonZeros(Lp[size]);
 
-  m_isInitialized     = true;
-  m_info              = Success;
-  m_analysisIsOk      = true;
+  m_isInitialized = true;
+  m_info = Success;
+  m_analysisIsOk = true;
   m_factorizationIsOk = false;
 }
 
-
-template<typename Derived>
-template<bool DoLDLT>
-void SimplicialCholeskyBase<Derived>::factorize_preordered(const CholMatrixType& ap)
-{
+template <typename Derived>
+template <bool DoLDLT>
+void SimplicialCholeskyBase<Derived>::factorize_preordered(const CholMatrixType& ap) {
   using std::sqrt;
 
   eigen_assert(m_analysisIsOk && "You must first call analyzePattern()");
-  eigen_assert(ap.rows()==ap.cols());
-  eigen_assert(m_parent.size()==ap.rows());
-  eigen_assert(m_nonZerosPerCol.size()==ap.rows());
+  eigen_assert(ap.rows() == ap.cols());
+  eigen_assert(m_parent.size() == ap.rows());
+  eigen_assert(m_nonZerosPerCol.size() == ap.rows());
 
   const StorageIndex size = StorageIndex(ap.rows());
   const StorageIndex* Lp = m_matrix.outerIndexPtr();
@@ -91,80 +82,70 @@
   Scalar* Lx = m_matrix.valuePtr();
 
   ei_declare_aligned_stack_constructed_variable(Scalar, y, size, 0);
-  ei_declare_aligned_stack_constructed_variable(StorageIndex,  pattern, size, 0);
-  ei_declare_aligned_stack_constructed_variable(StorageIndex,  tags, size, 0);
+  ei_declare_aligned_stack_constructed_variable(StorageIndex, pattern, size, 0);
+  ei_declare_aligned_stack_constructed_variable(StorageIndex, tags, size, 0);
 
   bool ok = true;
   m_diag.resize(DoLDLT ? size : 0);
 
-  for(StorageIndex k = 0; k < size; ++k)
-  {
+  for (StorageIndex k = 0; k < size; ++k) {
     // compute nonzero pattern of kth row of L, in topological order
-    y[k] = Scalar(0);                     // Y(0:k) is now all zero
-    StorageIndex top = size;               // stack for pattern is empty
-    tags[k] = k;                    // mark node k as visited
-    m_nonZerosPerCol[k] = 0;        // count of nonzeros in column k of L
-    for(typename CholMatrixType::InnerIterator it(ap,k); it; ++it)
-    {
+    y[k] = Scalar(0);         // Y(0:k) is now all zero
+    StorageIndex top = size;  // stack for pattern is empty
+    tags[k] = k;              // mark node k as visited
+    m_nonZerosPerCol[k] = 0;  // count of nonzeros in column k of L
+    for (typename CholMatrixType::InnerIterator it(ap, k); it; ++it) {
       StorageIndex i = it.index();
-      if(i <= k)
-      {
-        y[i] += numext::conj(it.value());            /* scatter A(i,k) into Y (sum duplicates) */
+      if (i <= k) {
+        y[i] += numext::conj(it.value()); /* scatter A(i,k) into Y (sum duplicates) */
         Index len;
-        for(len = 0; tags[i] != k; i = m_parent[i])
-        {
-          pattern[len++] = i;     /* L(k,i) is nonzero */
-          tags[i] = k;            /* mark i as visited */
+        for (len = 0; tags[i] != k; i = m_parent[i]) {
+          pattern[len++] = i; /* L(k,i) is nonzero */
+          tags[i] = k;        /* mark i as visited */
         }
-        while(len > 0)
-          pattern[--top] = pattern[--len];
+        while (len > 0) pattern[--top] = pattern[--len];
       }
     }
 
     /* compute numerical values kth row of L (a sparse triangular solve) */
 
-    RealScalar d = numext::real(y[k]) * m_shiftScale + m_shiftOffset;    // get D(k,k), apply the shift function, and clear Y(k)
+    RealScalar d =
+        numext::real(y[k]) * m_shiftScale + m_shiftOffset;  // get D(k,k), apply the shift function, and clear Y(k)
     y[k] = Scalar(0);
-    for(; top < size; ++top)
-    {
-      Index i = pattern[top];       /* pattern[top:n-1] is pattern of L(:,k) */
-      Scalar yi = y[i];             /* get and clear Y(i) */
+    for (; top < size; ++top) {
+      Index i = pattern[top]; /* pattern[top:n-1] is pattern of L(:,k) */
+      Scalar yi = y[i];       /* get and clear Y(i) */
       y[i] = Scalar(0);
 
       /* the nonzero entry L(k,i) */
       Scalar l_ki;
-      if(DoLDLT)
+      if (DoLDLT)
         l_ki = yi / numext::real(m_diag[i]);
       else
         yi = l_ki = yi / Lx[Lp[i]];
 
       Index p2 = Lp[i] + m_nonZerosPerCol[i];
       Index p;
-      for(p = Lp[i] + (DoLDLT ? 0 : 1); p < p2; ++p)
-        y[Li[p]] -= numext::conj(Lx[p]) * yi;
+      for (p = Lp[i] + (DoLDLT ? 0 : 1); p < p2; ++p) y[Li[p]] -= numext::conj(Lx[p]) * yi;
       d -= numext::real(l_ki * numext::conj(yi));
-      Li[p] = k;                          /* store L(k,i) in column form of L */
+      Li[p] = k; /* store L(k,i) in column form of L */
       Lx[p] = l_ki;
-      ++m_nonZerosPerCol[i];              /* increment count of nonzeros in col i */
+      ++m_nonZerosPerCol[i]; /* increment count of nonzeros in col i */
     }
-    if(DoLDLT)
-    {
+    if (DoLDLT) {
       m_diag[k] = d;
-      if(d == RealScalar(0))
-      {
-        ok = false;                         /* failure, D(k,k) is zero */
+      if (d == RealScalar(0)) {
+        ok = false; /* failure, D(k,k) is zero */
         break;
       }
-    }
-    else
-    {
+    } else {
       Index p = Lp[k] + m_nonZerosPerCol[k]++;
-      Li[p] = k ;                /* store L(k,k) = sqrt (d) in column k */
-      if(d <= RealScalar(0)) {
-        ok = false;              /* failure, matrix is not positive definite */
+      Li[p] = k; /* store L(k,k) = sqrt (d) in column k */
+      if (d <= RealScalar(0)) {
+        ok = false; /* failure, matrix is not positive definite */
         break;
       }
-      Lx[p] = sqrt(d) ;
+      Lx[p] = sqrt(d);
     }
   }
 
@@ -172,6 +153,6 @@
   m_factorizationIsOk = true;
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SIMPLICIAL_CHOLESKY_IMPL_H
+#endif  // EIGEN_SIMPLICIAL_CHOLESKY_IMPL_H
diff --git a/Eigen/src/SparseCore/AmbiVector.h b/Eigen/src/SparseCore/AmbiVector.h
index a663ff6..9f265f0 100644
--- a/Eigen/src/SparseCore/AmbiVector.h
+++ b/Eigen/src/SparseCore/AmbiVector.h
@@ -13,142 +13,129 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
 /** \internal
-  * Hybrid sparse/dense vector class designed for intensive read-write operations.
-  *
-  * See BasicSparseLLT and SparseProduct for usage examples.
-  */
-template<typename Scalar_, typename StorageIndex_>
-class AmbiVector
-{
-  public:
-    typedef Scalar_ Scalar;
-    typedef StorageIndex_ StorageIndex;
-    typedef typename NumTraits<Scalar>::Real RealScalar;
+ * Hybrid sparse/dense vector class designed for intensive read-write operations.
+ *
+ * See BasicSparseLLT and SparseProduct for usage examples.
+ */
+template <typename Scalar_, typename StorageIndex_>
+class AmbiVector {
+ public:
+  typedef Scalar_ Scalar;
+  typedef StorageIndex_ StorageIndex;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
 
-    explicit AmbiVector(Index size)
-      : m_buffer(0), m_zero(0), m_size(0), m_end(0), m_allocatedSize(0), m_allocatedElements(0), m_mode(-1)
-    {
-      resize(size);
+  explicit AmbiVector(Index size)
+      : m_buffer(0), m_zero(0), m_size(0), m_end(0), m_allocatedSize(0), m_allocatedElements(0), m_mode(-1) {
+    resize(size);
+  }
+
+  void init(double estimatedDensity);
+  void init(int mode);
+
+  Index nonZeros() const;
+
+  /** Specifies a sub-vector to work on */
+  void setBounds(Index start, Index end) {
+    m_start = convert_index(start);
+    m_end = convert_index(end);
+  }
+
+  void setZero();
+
+  void restart();
+  Scalar& coeffRef(Index i);
+  Scalar& coeff(Index i);
+
+  class Iterator;
+
+  ~AmbiVector() { delete[] m_buffer; }
+
+  void resize(Index size) {
+    if (m_allocatedSize < size) reallocate(size);
+    m_size = convert_index(size);
+  }
+
+  StorageIndex size() const { return m_size; }
+
+ protected:
+  StorageIndex convert_index(Index idx) { return internal::convert_index<StorageIndex>(idx); }
+
+  void reallocate(Index size) {
+    // if the size of the matrix is not too large, let's allocate a bit more than needed such
+    // that we can handle dense vector even in sparse mode.
+    delete[] m_buffer;
+    if (size < 1000) {
+      Index allocSize = (size * sizeof(ListEl) + sizeof(Scalar) - 1) / sizeof(Scalar);
+      m_allocatedElements = convert_index((allocSize * sizeof(Scalar)) / sizeof(ListEl));
+      m_buffer = new Scalar[allocSize];
+    } else {
+      m_allocatedElements = convert_index((size * sizeof(Scalar)) / sizeof(ListEl));
+      m_buffer = new Scalar[size];
     }
+    m_size = convert_index(size);
+    m_start = 0;
+    m_end = m_size;
+  }
 
-    void init(double estimatedDensity);
-    void init(int mode);
+  void reallocateSparse() {
+    Index copyElements = m_allocatedElements;
+    m_allocatedElements = (std::min)(StorageIndex(m_allocatedElements * 1.5), m_size);
+    Index allocSize = m_allocatedElements * sizeof(ListEl);
+    allocSize = (allocSize + sizeof(Scalar) - 1) / sizeof(Scalar);
+    Scalar* newBuffer = new Scalar[allocSize];
+    std::memcpy(newBuffer, m_buffer, copyElements * sizeof(ListEl));
+    delete[] m_buffer;
+    m_buffer = newBuffer;
+  }
 
-    Index nonZeros() const;
+ protected:
+  // element type of the linked list
+  struct ListEl {
+    StorageIndex next;
+    StorageIndex index;
+    Scalar value;
+  };
 
-    /** Specifies a sub-vector to work on */
-    void setBounds(Index start, Index end) { m_start = convert_index(start); m_end = convert_index(end); }
+  // used to store data in both mode
+  Scalar* m_buffer;
+  Scalar m_zero;
+  StorageIndex m_size;
+  StorageIndex m_start;
+  StorageIndex m_end;
+  StorageIndex m_allocatedSize;
+  StorageIndex m_allocatedElements;
+  StorageIndex m_mode;
 
-    void setZero();
-
-    void restart();
-    Scalar& coeffRef(Index i);
-    Scalar& coeff(Index i);
-
-    class Iterator;
-
-    ~AmbiVector() { delete[] m_buffer; }
-
-    void resize(Index size)
-    {
-      if (m_allocatedSize < size)
-        reallocate(size);
-      m_size = convert_index(size);
-    }
-
-    StorageIndex size() const { return m_size; }
-
-  protected:
-    StorageIndex convert_index(Index idx)
-    {
-      return internal::convert_index<StorageIndex>(idx);
-    }
-
-    void reallocate(Index size)
-    {
-      // if the size of the matrix is not too large, let's allocate a bit more than needed such
-      // that we can handle dense vector even in sparse mode.
-      delete[] m_buffer;
-      if (size<1000)
-      {
-        Index allocSize = (size * sizeof(ListEl) + sizeof(Scalar) - 1)/sizeof(Scalar);
-        m_allocatedElements = convert_index((allocSize*sizeof(Scalar))/sizeof(ListEl));
-        m_buffer = new Scalar[allocSize];
-      }
-      else
-      {
-        m_allocatedElements = convert_index((size*sizeof(Scalar))/sizeof(ListEl));
-        m_buffer = new Scalar[size];
-      }
-      m_size = convert_index(size);
-      m_start = 0;
-      m_end = m_size;
-    }
-
-    void reallocateSparse()
-    {
-      Index copyElements = m_allocatedElements;
-      m_allocatedElements = (std::min)(StorageIndex(m_allocatedElements*1.5),m_size);
-      Index allocSize = m_allocatedElements * sizeof(ListEl);
-      allocSize = (allocSize + sizeof(Scalar) - 1)/sizeof(Scalar);
-      Scalar* newBuffer = new Scalar[allocSize];
-      std::memcpy(newBuffer,  m_buffer,  copyElements * sizeof(ListEl));
-      delete[] m_buffer;
-      m_buffer = newBuffer;
-    }
-
-  protected:
-    // element type of the linked list
-    struct ListEl
-    {
-      StorageIndex next;
-      StorageIndex index;
-      Scalar value;
-    };
-
-    // used to store data in both mode
-    Scalar* m_buffer;
-    Scalar m_zero;
-    StorageIndex m_size;
-    StorageIndex m_start;
-    StorageIndex m_end;
-    StorageIndex m_allocatedSize;
-    StorageIndex m_allocatedElements;
-    StorageIndex m_mode;
-
-    // linked list mode
-    StorageIndex m_llStart;
-    StorageIndex m_llCurrent;
-    StorageIndex m_llSize;
+  // linked list mode
+  StorageIndex m_llStart;
+  StorageIndex m_llCurrent;
+  StorageIndex m_llSize;
 };
 
 /** \returns the number of non zeros in the current sub vector */
-template<typename Scalar_,typename StorageIndex_>
-Index AmbiVector<Scalar_,StorageIndex_>::nonZeros() const
-{
-  if (m_mode==IsSparse)
+template <typename Scalar_, typename StorageIndex_>
+Index AmbiVector<Scalar_, StorageIndex_>::nonZeros() const {
+  if (m_mode == IsSparse)
     return m_llSize;
   else
     return m_end - m_start;
 }
 
-template<typename Scalar_,typename StorageIndex_>
-void AmbiVector<Scalar_,StorageIndex_>::init(double estimatedDensity)
-{
-  if (estimatedDensity>0.1)
+template <typename Scalar_, typename StorageIndex_>
+void AmbiVector<Scalar_, StorageIndex_>::init(double estimatedDensity) {
+  if (estimatedDensity > 0.1)
     init(IsDense);
   else
     init(IsSparse);
 }
 
-template<typename Scalar_,typename StorageIndex_>
-void AmbiVector<Scalar_,StorageIndex_>::init(int mode)
-{
+template <typename Scalar_, typename StorageIndex_>
+void AmbiVector<Scalar_, StorageIndex_>::init(int mode) {
   m_mode = mode;
   // This is only necessary in sparse mode, but we set these unconditionally to avoid some maybe-uninitialized warnings
   // if (m_mode==IsSparse)
@@ -159,45 +146,36 @@
 }
 
 /** Must be called whenever we might perform a write access
-  * with an index smaller than the previous one.
-  *
-  * Don't worry, this function is extremely cheap.
-  */
-template<typename Scalar_,typename StorageIndex_>
-void AmbiVector<Scalar_,StorageIndex_>::restart()
-{
+ * with an index smaller than the previous one.
+ *
+ * Don't worry, this function is extremely cheap.
+ */
+template <typename Scalar_, typename StorageIndex_>
+void AmbiVector<Scalar_, StorageIndex_>::restart() {
   m_llCurrent = m_llStart;
 }
 
 /** Set all coefficients of current subvector to zero */
-template<typename Scalar_,typename StorageIndex_>
-void AmbiVector<Scalar_,StorageIndex_>::setZero()
-{
-  if (m_mode==IsDense)
-  {
-    for (Index i=m_start; i<m_end; ++i)
-      m_buffer[i] = Scalar(0);
-  }
-  else
-  {
-    eigen_assert(m_mode==IsSparse);
+template <typename Scalar_, typename StorageIndex_>
+void AmbiVector<Scalar_, StorageIndex_>::setZero() {
+  if (m_mode == IsDense) {
+    for (Index i = m_start; i < m_end; ++i) m_buffer[i] = Scalar(0);
+  } else {
+    eigen_assert(m_mode == IsSparse);
     m_llSize = 0;
     m_llStart = -1;
   }
 }
 
-template<typename Scalar_,typename StorageIndex_>
-Scalar_& AmbiVector<Scalar_,StorageIndex_>::coeffRef(Index i)
-{
-  if (m_mode==IsDense)
+template <typename Scalar_, typename StorageIndex_>
+Scalar_& AmbiVector<Scalar_, StorageIndex_>::coeffRef(Index i) {
+  if (m_mode == IsDense)
     return m_buffer[i];
-  else
-  {
+  else {
     ListEl* EIGEN_RESTRICT llElements = reinterpret_cast<ListEl*>(m_buffer);
     // TODO factorize the following code to reduce code generation
-    eigen_assert(m_mode==IsSparse);
-    if (m_llSize==0)
-    {
+    eigen_assert(m_mode == IsSparse);
+    if (m_llSize == 0) {
       // this is the first element
       m_llStart = 0;
       m_llCurrent = 0;
@@ -206,9 +184,7 @@
       llElements[0].index = convert_index(i);
       llElements[0].next = -1;
       return llElements[0].value;
-    }
-    else if (i<llElements[m_llStart].index)
-    {
+    } else if (i < llElements[m_llStart].index) {
       // this is going to be the new first element of the list
       ListEl& el = llElements[m_llSize];
       el.value = Scalar(0);
@@ -218,30 +194,24 @@
       ++m_llSize;
       m_llCurrent = m_llStart;
       return el.value;
-    }
-    else
-    {
+    } else {
       StorageIndex nextel = llElements[m_llCurrent].next;
-      eigen_assert(i>=llElements[m_llCurrent].index && "you must call restart() before inserting an element with lower or equal index");
-      while (nextel >= 0 && llElements[nextel].index<=i)
-      {
+      eigen_assert(i >= llElements[m_llCurrent].index &&
+                   "you must call restart() before inserting an element with lower or equal index");
+      while (nextel >= 0 && llElements[nextel].index <= i) {
         m_llCurrent = nextel;
         nextel = llElements[nextel].next;
       }
 
-      if (llElements[m_llCurrent].index==i)
-      {
+      if (llElements[m_llCurrent].index == i) {
         // the coefficient already exists and we found it !
         return llElements[m_llCurrent].value;
-      }
-      else
-      {
-        if (m_llSize>=m_allocatedElements)
-        {
+      } else {
+        if (m_llSize >= m_allocatedElements) {
           reallocateSparse();
           llElements = reinterpret_cast<ListEl*>(m_buffer);
         }
-        eigen_internal_assert(m_llSize<m_allocatedElements && "internal error: overflow in sparse mode");
+        eigen_internal_assert(m_llSize < m_allocatedElements && "internal error: overflow in sparse mode");
         // let's insert a new coefficient
         ListEl& el = llElements[m_llSize];
         el.value = Scalar(0);
@@ -255,26 +225,20 @@
   }
 }
 
-template<typename Scalar_,typename StorageIndex_>
-Scalar_& AmbiVector<Scalar_,StorageIndex_>::coeff(Index i)
-{
-  if (m_mode==IsDense)
+template <typename Scalar_, typename StorageIndex_>
+Scalar_& AmbiVector<Scalar_, StorageIndex_>::coeff(Index i) {
+  if (m_mode == IsDense)
     return m_buffer[i];
-  else
-  {
+  else {
     ListEl* EIGEN_RESTRICT llElements = reinterpret_cast<ListEl*>(m_buffer);
-    eigen_assert(m_mode==IsSparse);
-    if ((m_llSize==0) || (i<llElements[m_llStart].index))
-    {
+    eigen_assert(m_mode == IsSparse);
+    if ((m_llSize == 0) || (i < llElements[m_llStart].index)) {
       return m_zero;
-    }
-    else
-    {
+    } else {
       Index elid = m_llStart;
-      while (elid >= 0 && llElements[elid].index<i)
-        elid = llElements[elid].next;
+      while (elid >= 0 && llElements[elid].index < i) elid = llElements[elid].next;
 
-      if (llElements[elid].index==i)
+      if (llElements[elid].index == i)
         return llElements[m_llCurrent].value;
       else
         return m_zero;
@@ -283,99 +247,83 @@
 }
 
 /** Iterator over the nonzero coefficients */
-template<typename Scalar_,typename StorageIndex_>
-class AmbiVector<Scalar_,StorageIndex_>::Iterator
-{
-  public:
-    typedef Scalar_ Scalar;
-    typedef typename NumTraits<Scalar>::Real RealScalar;
+template <typename Scalar_, typename StorageIndex_>
+class AmbiVector<Scalar_, StorageIndex_>::Iterator {
+ public:
+  typedef Scalar_ Scalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
 
-    /** Default constructor
-      * \param vec the vector on which we iterate
-      * \param epsilon the minimal value used to prune zero coefficients.
-      * In practice, all coefficients having a magnitude smaller than \a epsilon
-      * are skipped.
-      */
-    explicit Iterator(const AmbiVector& vec, const RealScalar& epsilon = 0)
-      : m_vector(vec)
-    {
-      using std::abs;
-      m_epsilon = epsilon;
-      m_isDense = m_vector.m_mode==IsDense;
-      if (m_isDense)
-      {
-        m_currentEl = 0;   // this is to avoid a compilation warning
-        m_cachedValue = 0; // this is to avoid a compilation warning
-        m_cachedIndex = m_vector.m_start-1;
-        ++(*this);
-      }
-      else
-      {
-        ListEl* EIGEN_RESTRICT llElements = reinterpret_cast<ListEl*>(m_vector.m_buffer);
-        m_currentEl = m_vector.m_llStart;
-        while (m_currentEl>=0 && abs(llElements[m_currentEl].value)<=m_epsilon)
-          m_currentEl = llElements[m_currentEl].next;
-        if (m_currentEl<0)
-        {
-          m_cachedValue = 0; // this is to avoid a compilation warning
-          m_cachedIndex = -1;
-        }
-        else
-        {
-          m_cachedIndex = llElements[m_currentEl].index;
-          m_cachedValue = llElements[m_currentEl].value;
-        }
+  /** Default constructor
+   * \param vec the vector on which we iterate
+   * \param epsilon the minimal value used to prune zero coefficients.
+   * In practice, all coefficients having a magnitude smaller than \a epsilon
+   * are skipped.
+   */
+  explicit Iterator(const AmbiVector& vec, const RealScalar& epsilon = 0) : m_vector(vec) {
+    using std::abs;
+    m_epsilon = epsilon;
+    m_isDense = m_vector.m_mode == IsDense;
+    if (m_isDense) {
+      m_currentEl = 0;    // this is to avoid a compilation warning
+      m_cachedValue = 0;  // this is to avoid a compilation warning
+      m_cachedIndex = m_vector.m_start - 1;
+      ++(*this);
+    } else {
+      ListEl* EIGEN_RESTRICT llElements = reinterpret_cast<ListEl*>(m_vector.m_buffer);
+      m_currentEl = m_vector.m_llStart;
+      while (m_currentEl >= 0 && abs(llElements[m_currentEl].value) <= m_epsilon)
+        m_currentEl = llElements[m_currentEl].next;
+      if (m_currentEl < 0) {
+        m_cachedValue = 0;  // this is to avoid a compilation warning
+        m_cachedIndex = -1;
+      } else {
+        m_cachedIndex = llElements[m_currentEl].index;
+        m_cachedValue = llElements[m_currentEl].value;
       }
     }
+  }
 
-    StorageIndex index() const { return m_cachedIndex; }
-    Scalar value() const { return m_cachedValue; }
+  StorageIndex index() const { return m_cachedIndex; }
+  Scalar value() const { return m_cachedValue; }
 
-    operator bool() const { return m_cachedIndex>=0; }
+  operator bool() const { return m_cachedIndex >= 0; }
 
-    Iterator& operator++()
-    {
-      using std::abs;
-      if (m_isDense)
-      {
-        do {
-          ++m_cachedIndex;
-        } while (m_cachedIndex<m_vector.m_end && abs(m_vector.m_buffer[m_cachedIndex])<=m_epsilon);
-        if (m_cachedIndex<m_vector.m_end)
-          m_cachedValue = m_vector.m_buffer[m_cachedIndex];
-        else
-          m_cachedIndex=-1;
-      }
+  Iterator& operator++() {
+    using std::abs;
+    if (m_isDense) {
+      do {
+        ++m_cachedIndex;
+      } while (m_cachedIndex < m_vector.m_end && abs(m_vector.m_buffer[m_cachedIndex]) <= m_epsilon);
+      if (m_cachedIndex < m_vector.m_end)
+        m_cachedValue = m_vector.m_buffer[m_cachedIndex];
       else
-      {
-        ListEl* EIGEN_RESTRICT llElements = reinterpret_cast<ListEl*>(m_vector.m_buffer);
-        do {
-          m_currentEl = llElements[m_currentEl].next;
-        } while (m_currentEl>=0 && abs(llElements[m_currentEl].value)<=m_epsilon);
-        if (m_currentEl<0)
-        {
-          m_cachedIndex = -1;
-        }
-        else
-        {
-          m_cachedIndex = llElements[m_currentEl].index;
-          m_cachedValue = llElements[m_currentEl].value;
-        }
+        m_cachedIndex = -1;
+    } else {
+      ListEl* EIGEN_RESTRICT llElements = reinterpret_cast<ListEl*>(m_vector.m_buffer);
+      do {
+        m_currentEl = llElements[m_currentEl].next;
+      } while (m_currentEl >= 0 && abs(llElements[m_currentEl].value) <= m_epsilon);
+      if (m_currentEl < 0) {
+        m_cachedIndex = -1;
+      } else {
+        m_cachedIndex = llElements[m_currentEl].index;
+        m_cachedValue = llElements[m_currentEl].value;
       }
-      return *this;
     }
+    return *this;
+  }
 
-  protected:
-    const AmbiVector& m_vector; // the target vector
-    StorageIndex m_currentEl;   // the current element in sparse/linked-list mode
-    RealScalar m_epsilon;       // epsilon used to prune zero coefficients
-    StorageIndex m_cachedIndex; // current coordinate
-    Scalar m_cachedValue;       // current value
-    bool m_isDense;             // mode of the vector
+ protected:
+  const AmbiVector& m_vector;  // the target vector
+  StorageIndex m_currentEl;    // the current element in sparse/linked-list mode
+  RealScalar m_epsilon;        // epsilon used to prune zero coefficients
+  StorageIndex m_cachedIndex;  // current coordinate
+  Scalar m_cachedValue;        // current value
+  bool m_isDense;              // mode of the vector
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_AMBIVECTOR_H
+#endif  // EIGEN_AMBIVECTOR_H
diff --git a/Eigen/src/SparseCore/CompressedStorage.h b/Eigen/src/SparseCore/CompressedStorage.h
index f941299..123c89c 100644
--- a/Eigen/src/SparseCore/CompressedStorage.h
+++ b/Eigen/src/SparseCore/CompressedStorage.h
@@ -13,214 +13,189 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
 /** \internal
-  * Stores a sparse set of values as a list of values and a list of indices.
-  *
-  */
-template<typename Scalar_,typename StorageIndex_>
-class CompressedStorage
-{
-  public:
+ * Stores a sparse set of values as a list of values and a list of indices.
+ *
+ */
+template <typename Scalar_, typename StorageIndex_>
+class CompressedStorage {
+ public:
+  typedef Scalar_ Scalar;
+  typedef StorageIndex_ StorageIndex;
 
-    typedef Scalar_ Scalar;
-    typedef StorageIndex_ StorageIndex;
+ protected:
+  typedef typename NumTraits<Scalar>::Real RealScalar;
 
-  protected:
+ public:
+  CompressedStorage() : m_values(0), m_indices(0), m_size(0), m_allocatedSize(0) {}
 
-    typedef typename NumTraits<Scalar>::Real RealScalar;
+  explicit CompressedStorage(Index size) : m_values(0), m_indices(0), m_size(0), m_allocatedSize(0) { resize(size); }
 
-  public:
+  CompressedStorage(const CompressedStorage& other) : m_values(0), m_indices(0), m_size(0), m_allocatedSize(0) {
+    *this = other;
+  }
 
-    CompressedStorage()
-      : m_values(0), m_indices(0), m_size(0), m_allocatedSize(0)
-    {}
-
-    explicit CompressedStorage(Index size)
-      : m_values(0), m_indices(0), m_size(0), m_allocatedSize(0)
-    {
-      resize(size);
+  CompressedStorage& operator=(const CompressedStorage& other) {
+    resize(other.size());
+    if (other.size() > 0) {
+      internal::smart_copy(other.m_values, other.m_values + m_size, m_values);
+      internal::smart_copy(other.m_indices, other.m_indices + m_size, m_indices);
     }
+    return *this;
+  }
 
-    CompressedStorage(const CompressedStorage& other)
-      : m_values(0), m_indices(0), m_size(0), m_allocatedSize(0)
-    {
-      *this = other;
+  void swap(CompressedStorage& other) {
+    std::swap(m_values, other.m_values);
+    std::swap(m_indices, other.m_indices);
+    std::swap(m_size, other.m_size);
+    std::swap(m_allocatedSize, other.m_allocatedSize);
+  }
+
+  ~CompressedStorage() {
+    conditional_aligned_delete_auto<Scalar, true>(m_values, m_allocatedSize);
+    conditional_aligned_delete_auto<StorageIndex, true>(m_indices, m_allocatedSize);
+  }
+
+  void reserve(Index size) {
+    Index newAllocatedSize = m_size + size;
+    if (newAllocatedSize > m_allocatedSize) reallocate(newAllocatedSize);
+  }
+
+  void squeeze() {
+    if (m_allocatedSize > m_size) reallocate(m_size);
+  }
+
+  void resize(Index size, double reserveSizeFactor = 0) {
+    if (m_allocatedSize < size) {
+      Index realloc_size =
+          (std::min<Index>)(NumTraits<StorageIndex>::highest(), size + Index(reserveSizeFactor * double(size)));
+      if (realloc_size < size) internal::throw_std_bad_alloc();
+      reallocate(realloc_size);
     }
+    m_size = size;
+  }
 
-    CompressedStorage& operator=(const CompressedStorage& other)
-    {
-      resize(other.size());
-      if(other.size()>0)
-      {
-        internal::smart_copy(other.m_values,  other.m_values  + m_size, m_values);
-        internal::smart_copy(other.m_indices, other.m_indices + m_size, m_indices);
+  void append(const Scalar& v, Index i) {
+    Index id = m_size;
+    resize(m_size + 1, 1);
+    m_values[id] = v;
+    m_indices[id] = internal::convert_index<StorageIndex>(i);
+  }
+
+  inline Index size() const { return m_size; }
+  inline Index allocatedSize() const { return m_allocatedSize; }
+  inline void clear() { m_size = 0; }
+
+  const Scalar* valuePtr() const { return m_values; }
+  Scalar* valuePtr() { return m_values; }
+  const StorageIndex* indexPtr() const { return m_indices; }
+  StorageIndex* indexPtr() { return m_indices; }
+
+  inline Scalar& value(Index i) {
+    eigen_internal_assert(m_values != 0);
+    return m_values[i];
+  }
+  inline const Scalar& value(Index i) const {
+    eigen_internal_assert(m_values != 0);
+    return m_values[i];
+  }
+
+  inline StorageIndex& index(Index i) {
+    eigen_internal_assert(m_indices != 0);
+    return m_indices[i];
+  }
+  inline const StorageIndex& index(Index i) const {
+    eigen_internal_assert(m_indices != 0);
+    return m_indices[i];
+  }
+
+  /** \returns the largest \c k such that for all \c j in [0,k) index[\c j]\<\a key */
+  inline Index searchLowerIndex(Index key) const { return searchLowerIndex(0, m_size, key); }
+
+  /** \returns the largest \c k in [start,end) such that for all \c j in [start,k) index[\c j]\<\a key */
+  inline Index searchLowerIndex(Index start, Index end, Index key) const {
+    return static_cast<Index>(std::distance(m_indices, std::lower_bound(m_indices + start, m_indices + end, key)));
+  }
+
+  /** \returns the stored value at index \a key
+   * If the value does not exist, then the value \a defaultValue is returned without any insertion. */
+  inline Scalar at(Index key, const Scalar& defaultValue = Scalar(0)) const {
+    if (m_size == 0)
+      return defaultValue;
+    else if (key == m_indices[m_size - 1])
+      return m_values[m_size - 1];
+    // ^^  optimization: let's first check if it is the last coefficient
+    // (very common in high level algorithms)
+    const Index id = searchLowerIndex(0, m_size - 1, key);
+    return ((id < m_size) && (m_indices[id] == key)) ? m_values[id] : defaultValue;
+  }
+
+  /** Like at(), but the search is performed in the range [start,end) */
+  inline Scalar atInRange(Index start, Index end, Index key, const Scalar& defaultValue = Scalar(0)) const {
+    if (start >= end)
+      return defaultValue;
+    else if (end > start && key == m_indices[end - 1])
+      return m_values[end - 1];
+    // ^^  optimization: let's first check if it is the last coefficient
+    // (very common in high level algorithms)
+    const Index id = searchLowerIndex(start, end - 1, key);
+    return ((id < end) && (m_indices[id] == key)) ? m_values[id] : defaultValue;
+  }
+
+  /** \returns a reference to the value at index \a key
+   * If the value does not exist, then the value \a defaultValue is inserted
+   * such that the keys are sorted. */
+  inline Scalar& atWithInsertion(Index key, const Scalar& defaultValue = Scalar(0)) {
+    Index id = searchLowerIndex(0, m_size, key);
+    if (id >= m_size || m_indices[id] != key) {
+      if (m_allocatedSize < m_size + 1) {
+        Index newAllocatedSize = 2 * (m_size + 1);
+        m_values = conditional_aligned_realloc_new_auto<Scalar, true>(m_values, newAllocatedSize, m_allocatedSize);
+        m_indices =
+            conditional_aligned_realloc_new_auto<StorageIndex, true>(m_indices, newAllocatedSize, m_allocatedSize);
+        m_allocatedSize = newAllocatedSize;
       }
-      return *this;
-    }
-
-    void swap(CompressedStorage& other)
-    {
-      std::swap(m_values, other.m_values);
-      std::swap(m_indices, other.m_indices);
-      std::swap(m_size, other.m_size);
-      std::swap(m_allocatedSize, other.m_allocatedSize);
-    }
-
-    ~CompressedStorage()
-    {
-      conditional_aligned_delete_auto<Scalar, true>(m_values, m_allocatedSize);
-      conditional_aligned_delete_auto<StorageIndex, true>(m_indices, m_allocatedSize);
-    }
-
-    void reserve(Index size)
-    {
-      Index newAllocatedSize = m_size + size;
-      if (newAllocatedSize > m_allocatedSize)
-        reallocate(newAllocatedSize);
-    }
-
-    void squeeze()
-    {
-      if (m_allocatedSize>m_size)
-        reallocate(m_size);
-    }
-
-    void resize(Index size, double reserveSizeFactor = 0)
-    {
-      if (m_allocatedSize<size)
-      {
-        Index realloc_size = (std::min<Index>)(NumTraits<StorageIndex>::highest(),  size + Index(reserveSizeFactor*double(size)));
-        if(realloc_size<size)
-          internal::throw_std_bad_alloc();
-        reallocate(realloc_size);
+      if (m_size > id) {
+        internal::smart_memmove(m_values + id, m_values + m_size, m_values + id + 1);
+        internal::smart_memmove(m_indices + id, m_indices + m_size, m_indices + id + 1);
       }
-      m_size = size;
+      m_size++;
+      m_indices[id] = internal::convert_index<StorageIndex>(key);
+      m_values[id] = defaultValue;
     }
+    return m_values[id];
+  }
 
-    void append(const Scalar& v, Index i)
-    {
-      Index id = m_size;
-      resize(m_size+1, 1);
-      m_values[id] = v;
-      m_indices[id] = internal::convert_index<StorageIndex>(i);
-    }
+  inline void moveChunk(Index from, Index to, Index chunkSize) {
+    eigen_internal_assert(chunkSize >= 0 && to + chunkSize <= m_size);
+    internal::smart_memmove(m_values + from, m_values + from + chunkSize, m_values + to);
+    internal::smart_memmove(m_indices + from, m_indices + from + chunkSize, m_indices + to);
+  }
 
-    inline Index size() const { return m_size; }
-    inline Index allocatedSize() const { return m_allocatedSize; }
-    inline void clear() { m_size = 0; }
+ protected:
+  inline void reallocate(Index size) {
+#ifdef EIGEN_SPARSE_COMPRESSED_STORAGE_REALLOCATE_PLUGIN
+    EIGEN_SPARSE_COMPRESSED_STORAGE_REALLOCATE_PLUGIN
+#endif
+    eigen_internal_assert(size != m_allocatedSize);
+    m_values = conditional_aligned_realloc_new_auto<Scalar, true>(m_values, size, m_allocatedSize);
+    m_indices = conditional_aligned_realloc_new_auto<StorageIndex, true>(m_indices, size, m_allocatedSize);
+    m_allocatedSize = size;
+  }
 
-    const Scalar* valuePtr() const { return m_values; }
-    Scalar* valuePtr() { return m_values; }
-    const StorageIndex* indexPtr() const { return m_indices; }
-    StorageIndex* indexPtr() { return m_indices; }
-
-    inline Scalar& value(Index i) { eigen_internal_assert(m_values!=0); return m_values[i]; }
-    inline const Scalar& value(Index i) const { eigen_internal_assert(m_values!=0); return m_values[i]; }
-
-    inline StorageIndex& index(Index i) { eigen_internal_assert(m_indices!=0); return m_indices[i]; }
-    inline const StorageIndex& index(Index i) const { eigen_internal_assert(m_indices!=0); return m_indices[i]; }
-
-    /** \returns the largest \c k such that for all \c j in [0,k) index[\c j]\<\a key */
-    inline Index searchLowerIndex(Index key) const
-    {
-      return searchLowerIndex(0, m_size, key);
-    }
-
-    /** \returns the largest \c k in [start,end) such that for all \c j in [start,k) index[\c j]\<\a key */
-    inline Index searchLowerIndex(Index start, Index end, Index key) const
-    {
-      return static_cast<Index>(std::distance(m_indices, std::lower_bound(m_indices + start, m_indices + end, key)));
-    }
-
-    /** \returns the stored value at index \a key
-      * If the value does not exist, then the value \a defaultValue is returned without any insertion. */
-    inline Scalar at(Index key, const Scalar& defaultValue = Scalar(0)) const
-    {
-      if (m_size==0)
-        return defaultValue;
-      else if (key==m_indices[m_size-1])
-        return m_values[m_size-1];
-      // ^^  optimization: let's first check if it is the last coefficient
-      // (very common in high level algorithms)
-      const Index id = searchLowerIndex(0,m_size-1,key);
-      return ((id<m_size) && (m_indices[id]==key)) ? m_values[id] : defaultValue;
-    }
-
-    /** Like at(), but the search is performed in the range [start,end) */
-    inline Scalar atInRange(Index start, Index end, Index key, const Scalar &defaultValue = Scalar(0)) const
-    {
-      if (start>=end)
-        return defaultValue;
-      else if (end>start && key==m_indices[end-1])
-        return m_values[end-1];
-      // ^^  optimization: let's first check if it is the last coefficient
-      // (very common in high level algorithms)
-      const Index id = searchLowerIndex(start,end-1,key);
-      return ((id<end) && (m_indices[id]==key)) ? m_values[id] : defaultValue;
-    }
-
-    /** \returns a reference to the value at index \a key
-      * If the value does not exist, then the value \a defaultValue is inserted
-      * such that the keys are sorted. */
-    inline Scalar& atWithInsertion(Index key, const Scalar& defaultValue = Scalar(0))
-    {
-      Index id = searchLowerIndex(0,m_size,key);
-      if (id>=m_size || m_indices[id]!=key)
-      {
-        if (m_allocatedSize<m_size+1)
-        {
-          Index newAllocatedSize = 2 * (m_size + 1);
-          m_values = conditional_aligned_realloc_new_auto<Scalar, true>(m_values, newAllocatedSize, m_allocatedSize);
-          m_indices =
-              conditional_aligned_realloc_new_auto<StorageIndex, true>(m_indices, newAllocatedSize, m_allocatedSize);
-          m_allocatedSize = newAllocatedSize;
-        }
-        if(m_size>id)
-        {
-          internal::smart_memmove(m_values +id, m_values +m_size, m_values +id+1);
-          internal::smart_memmove(m_indices+id, m_indices+m_size, m_indices+id+1);
-        }
-        m_size++;
-        m_indices[id] = internal::convert_index<StorageIndex>(key);
-        m_values[id] = defaultValue;
-      }
-      return m_values[id];
-    }
-
-    inline void moveChunk(Index from, Index to, Index chunkSize)
-    {
-      eigen_internal_assert(chunkSize >= 0 && to+chunkSize <= m_size);
-      internal::smart_memmove(m_values + from, m_values + from + chunkSize, m_values + to);
-      internal::smart_memmove(m_indices + from, m_indices + from + chunkSize, m_indices + to);
-    }
-
-  protected:
-
-    inline void reallocate(Index size)
-    {
-      #ifdef EIGEN_SPARSE_COMPRESSED_STORAGE_REALLOCATE_PLUGIN
-        EIGEN_SPARSE_COMPRESSED_STORAGE_REALLOCATE_PLUGIN
-      #endif
-      eigen_internal_assert(size!=m_allocatedSize);
-      m_values = conditional_aligned_realloc_new_auto<Scalar, true>(m_values, size, m_allocatedSize);
-      m_indices = conditional_aligned_realloc_new_auto<StorageIndex, true>(m_indices, size, m_allocatedSize);
-      m_allocatedSize = size;
-    }
-
-  protected:
-    Scalar* m_values;
-    StorageIndex* m_indices;
-    Index m_size;
-    Index m_allocatedSize;
-
+ protected:
+  Scalar* m_values;
+  StorageIndex* m_indices;
+  Index m_size;
+  Index m_allocatedSize;
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_COMPRESSED_STORAGE_H
+#endif  // EIGEN_COMPRESSED_STORAGE_H
diff --git a/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h b/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h
index 44721ac..3c6e797 100644
--- a/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h
+++ b/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h
@@ -17,9 +17,9 @@
 
 namespace internal {
 
-template<typename Lhs, typename Rhs, typename ResultType>
-static void conservative_sparse_sparse_product_impl(const Lhs& lhs, const Rhs& rhs, ResultType& res, bool sortedInsertion = false)
-{
+template <typename Lhs, typename Rhs, typename ResultType>
+static void conservative_sparse_sparse_product_impl(const Lhs& lhs, const Rhs& rhs, ResultType& res,
+                                                    bool sortedInsertion = false) {
   typedef typename remove_all_t<Lhs>::Scalar LhsScalar;
   typedef typename remove_all_t<Rhs>::Scalar RhsScalar;
   typedef typename remove_all_t<ResultType>::Scalar ResScalar;
@@ -29,11 +29,11 @@
   Index cols = rhs.outerSize();
   eigen_assert(lhs.outerSize() == rhs.innerSize());
 
-  ei_declare_aligned_stack_constructed_variable(bool,   mask,     rows, 0);
-  ei_declare_aligned_stack_constructed_variable(ResScalar, values,   rows, 0);
-  ei_declare_aligned_stack_constructed_variable(Index,  indices,  rows, 0);
+  ei_declare_aligned_stack_constructed_variable(bool, mask, rows, 0);
+  ei_declare_aligned_stack_constructed_variable(ResScalar, values, rows, 0);
+  ei_declare_aligned_stack_constructed_variable(Index, indices, rows, 0);
 
-  std::memset(mask,0,sizeof(bool)*rows);
+  std::memset(mask, 0, sizeof(bool) * rows);
 
   evaluator<Lhs> lhsEval(lhs);
   evaluator<Rhs> rhsEval(rhs);
@@ -49,45 +49,35 @@
   res.setZero();
   res.reserve(Index(estimated_nnz_prod));
   // we compute each column of the result, one after the other
-  for (Index j=0; j<cols; ++j)
-  {
-
+  for (Index j = 0; j < cols; ++j) {
     res.startVec(j);
     Index nnz = 0;
-    for (typename evaluator<Rhs>::InnerIterator rhsIt(rhsEval, j); rhsIt; ++rhsIt)
-    {
+    for (typename evaluator<Rhs>::InnerIterator rhsIt(rhsEval, j); rhsIt; ++rhsIt) {
       RhsScalar y = rhsIt.value();
       Index k = rhsIt.index();
-      for (typename evaluator<Lhs>::InnerIterator lhsIt(lhsEval, k); lhsIt; ++lhsIt)
-      {
+      for (typename evaluator<Lhs>::InnerIterator lhsIt(lhsEval, k); lhsIt; ++lhsIt) {
         Index i = lhsIt.index();
         LhsScalar x = lhsIt.value();
-        if(!mask[i])
-        {
+        if (!mask[i]) {
           mask[i] = true;
           values[i] = x * y;
           indices[nnz] = i;
           ++nnz;
-        }
-        else
+        } else
           values[i] += x * y;
       }
     }
-    if(!sortedInsertion)
-    {
+    if (!sortedInsertion) {
       // unordered insertion
-      for(Index k=0; k<nnz; ++k)
-      {
+      for (Index k = 0; k < nnz; ++k) {
         Index i = indices[k];
-        res.insertBackByOuterInnerUnordered(j,i) = values[i];
+        res.insertBackByOuterInnerUnordered(j, i) = values[i];
         mask[i] = false;
       }
-    }
-    else
-    {
+    } else {
       // alternative ordered insertion code:
-      const Index t200 = rows/11; // 11 == (log2(200)*1.39)
-      const Index t = (rows*100)/139;
+      const Index t200 = rows / 11;  // 11 == (log2(200)*1.39)
+      const Index t = (rows * 100) / 139;
 
       // FIXME reserve nnz non zeros
       // FIXME implement faster sorting algorithms for very small nnz
@@ -95,25 +85,19 @@
       // otherwise => loop through the entire vector
       // In order to avoid to perform an expensive log2 when the
       // result is clearly very sparse we use a linear bound up to 200.
-      if((nnz<200 && nnz<t200) || nnz * numext::log2(int(nnz)) < t)
-      {
-        if(nnz>1) std::sort(indices,indices+nnz);
-        for(Index k=0; k<nnz; ++k)
-        {
+      if ((nnz < 200 && nnz < t200) || nnz * numext::log2(int(nnz)) < t) {
+        if (nnz > 1) std::sort(indices, indices + nnz);
+        for (Index k = 0; k < nnz; ++k) {
           Index i = indices[k];
-          res.insertBackByOuterInner(j,i) = values[i];
+          res.insertBackByOuterInner(j, i) = values[i];
           mask[i] = false;
         }
-      }
-      else
-      {
+      } else {
         // dense path
-        for(Index i=0; i<rows; ++i)
-        {
-          if(mask[i])
-          {
+        for (Index i = 0; i < rows; ++i) {
+          if (mask[i]) {
             mask[i] = false;
-            res.insertBackByOuterInner(j,i) = values[i];
+            res.insertBackByOuterInner(j, i) = values[i];
           }
         }
       }
@@ -122,161 +106,138 @@
   res.finalize();
 }
 
-
-} // end namespace internal
+}  // end namespace internal
 
 namespace internal {
 
-
 // Helper template to generate new sparse matrix types
-template<class Source, int Order>
+template <class Source, int Order>
 using WithStorageOrder = SparseMatrix<typename Source::Scalar, Order, typename Source::StorageIndex>;
 
-template<typename Lhs, typename Rhs, typename ResultType,
-  int LhsStorageOrder = (traits<Lhs>::Flags&RowMajorBit) ? RowMajor : ColMajor,
-  int RhsStorageOrder = (traits<Rhs>::Flags&RowMajorBit) ? RowMajor : ColMajor,
-  int ResStorageOrder = (traits<ResultType>::Flags&RowMajorBit) ? RowMajor : ColMajor>
+template <typename Lhs, typename Rhs, typename ResultType,
+          int LhsStorageOrder = (traits<Lhs>::Flags & RowMajorBit) ? RowMajor : ColMajor,
+          int RhsStorageOrder = (traits<Rhs>::Flags & RowMajorBit) ? RowMajor : ColMajor,
+          int ResStorageOrder = (traits<ResultType>::Flags & RowMajorBit) ? RowMajor : ColMajor>
 struct conservative_sparse_sparse_product_selector;
 
-template<typename Lhs, typename Rhs, typename ResultType>
-struct conservative_sparse_sparse_product_selector<Lhs,Rhs,ResultType,ColMajor,ColMajor,ColMajor>
-{
+template <typename Lhs, typename Rhs, typename ResultType>
+struct conservative_sparse_sparse_product_selector<Lhs, Rhs, ResultType, ColMajor, ColMajor, ColMajor> {
   typedef remove_all_t<Lhs> LhsCleaned;
   typedef typename LhsCleaned::Scalar Scalar;
 
-  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res)
-  {
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res) {
     using RowMajorMatrix = WithStorageOrder<ResultType, RowMajor>;
     using ColMajorMatrixAux = WithStorageOrder<ResultType, ColMajor>;
 
     // If the result is tall and thin (in the extreme case a column vector)
     // then it is faster to sort the coefficients inplace instead of transposing twice.
     // FIXME, the following heuristic is probably not very good.
-    if(lhs.rows()>rhs.cols())
-    {
-      using ColMajorMatrix = typename sparse_eval<ColMajorMatrixAux,ResultType::RowsAtCompileTime,ResultType::ColsAtCompileTime,ColMajorMatrixAux::Flags>::type;
-      ColMajorMatrix resCol(lhs.rows(),rhs.cols());
+    if (lhs.rows() > rhs.cols()) {
+      using ColMajorMatrix = typename sparse_eval<ColMajorMatrixAux, ResultType::RowsAtCompileTime,
+                                                  ResultType::ColsAtCompileTime, ColMajorMatrixAux::Flags>::type;
+      ColMajorMatrix resCol(lhs.rows(), rhs.cols());
       // perform sorted insertion
-      internal::conservative_sparse_sparse_product_impl<Lhs,Rhs,ColMajorMatrix>(lhs, rhs, resCol, true);
+      internal::conservative_sparse_sparse_product_impl<Lhs, Rhs, ColMajorMatrix>(lhs, rhs, resCol, true);
       res = resCol.markAsRValue();
-    }
-    else
-    {
-      ColMajorMatrixAux resCol(lhs.rows(),rhs.cols());
+    } else {
+      ColMajorMatrixAux resCol(lhs.rows(), rhs.cols());
       // resort to transpose to sort the entries
-      internal::conservative_sparse_sparse_product_impl<Lhs,Rhs,ColMajorMatrixAux>(lhs, rhs, resCol, false);
+      internal::conservative_sparse_sparse_product_impl<Lhs, Rhs, ColMajorMatrixAux>(lhs, rhs, resCol, false);
       RowMajorMatrix resRow(resCol);
       res = resRow.markAsRValue();
     }
   }
 };
 
-template<typename Lhs, typename Rhs, typename ResultType>
-struct conservative_sparse_sparse_product_selector<Lhs,Rhs,ResultType,RowMajor,ColMajor,ColMajor>
-{
-  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res)
-  {
+template <typename Lhs, typename Rhs, typename ResultType>
+struct conservative_sparse_sparse_product_selector<Lhs, Rhs, ResultType, RowMajor, ColMajor, ColMajor> {
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res) {
     using RowMajorRhs = WithStorageOrder<Rhs, RowMajor>;
     using RowMajorRes = WithStorageOrder<ResultType, RowMajor>;
     RowMajorRhs rhsRow = rhs;
     RowMajorRes resRow(lhs.rows(), rhs.cols());
-    internal::conservative_sparse_sparse_product_impl<RowMajorRhs,Lhs,RowMajorRes>(rhsRow, lhs, resRow);
+    internal::conservative_sparse_sparse_product_impl<RowMajorRhs, Lhs, RowMajorRes>(rhsRow, lhs, resRow);
     res = resRow;
   }
 };
 
-template<typename Lhs, typename Rhs, typename ResultType>
-struct conservative_sparse_sparse_product_selector<Lhs,Rhs,ResultType,ColMajor,RowMajor,ColMajor>
-{
-  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res)
-  {
+template <typename Lhs, typename Rhs, typename ResultType>
+struct conservative_sparse_sparse_product_selector<Lhs, Rhs, ResultType, ColMajor, RowMajor, ColMajor> {
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res) {
     using RowMajorLhs = WithStorageOrder<Lhs, RowMajor>;
     using RowMajorRes = WithStorageOrder<ResultType, RowMajor>;
     RowMajorLhs lhsRow = lhs;
     RowMajorRes resRow(lhs.rows(), rhs.cols());
-    internal::conservative_sparse_sparse_product_impl<Rhs,RowMajorLhs,RowMajorRes>(rhs, lhsRow, resRow);
+    internal::conservative_sparse_sparse_product_impl<Rhs, RowMajorLhs, RowMajorRes>(rhs, lhsRow, resRow);
     res = resRow;
   }
 };
 
-template<typename Lhs, typename Rhs, typename ResultType>
-struct conservative_sparse_sparse_product_selector<Lhs,Rhs,ResultType,RowMajor,RowMajor,ColMajor>
-{
-  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res)
-  {
+template <typename Lhs, typename Rhs, typename ResultType>
+struct conservative_sparse_sparse_product_selector<Lhs, Rhs, ResultType, RowMajor, RowMajor, ColMajor> {
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res) {
     using RowMajorRes = WithStorageOrder<ResultType, RowMajor>;
     RowMajorRes resRow(lhs.rows(), rhs.cols());
-    internal::conservative_sparse_sparse_product_impl<Rhs,Lhs,RowMajorRes>(rhs, lhs, resRow);
+    internal::conservative_sparse_sparse_product_impl<Rhs, Lhs, RowMajorRes>(rhs, lhs, resRow);
     res = resRow;
   }
 };
 
-
-template<typename Lhs, typename Rhs, typename ResultType>
-struct conservative_sparse_sparse_product_selector<Lhs,Rhs,ResultType,ColMajor,ColMajor,RowMajor>
-{
+template <typename Lhs, typename Rhs, typename ResultType>
+struct conservative_sparse_sparse_product_selector<Lhs, Rhs, ResultType, ColMajor, ColMajor, RowMajor> {
   typedef typename traits<remove_all_t<Lhs>>::Scalar Scalar;
 
-  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res)
-  {
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res) {
     using ColMajorRes = WithStorageOrder<ResultType, ColMajor>;
     ColMajorRes resCol(lhs.rows(), rhs.cols());
-    internal::conservative_sparse_sparse_product_impl<Lhs,Rhs,ColMajorRes>(lhs, rhs, resCol);
+    internal::conservative_sparse_sparse_product_impl<Lhs, Rhs, ColMajorRes>(lhs, rhs, resCol);
     res = resCol;
   }
 };
 
-template<typename Lhs, typename Rhs, typename ResultType>
-struct conservative_sparse_sparse_product_selector<Lhs,Rhs,ResultType,RowMajor,ColMajor,RowMajor>
-{
-  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res)
-  {
+template <typename Lhs, typename Rhs, typename ResultType>
+struct conservative_sparse_sparse_product_selector<Lhs, Rhs, ResultType, RowMajor, ColMajor, RowMajor> {
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res) {
     using ColMajorLhs = WithStorageOrder<Lhs, ColMajor>;
     using ColMajorRes = WithStorageOrder<ResultType, ColMajor>;
     ColMajorLhs lhsCol = lhs;
     ColMajorRes resCol(lhs.rows(), rhs.cols());
-    internal::conservative_sparse_sparse_product_impl<ColMajorLhs,Rhs,ColMajorRes>(lhsCol, rhs, resCol);
+    internal::conservative_sparse_sparse_product_impl<ColMajorLhs, Rhs, ColMajorRes>(lhsCol, rhs, resCol);
     res = resCol;
   }
 };
 
-template<typename Lhs, typename Rhs, typename ResultType>
-struct conservative_sparse_sparse_product_selector<Lhs,Rhs,ResultType,ColMajor,RowMajor,RowMajor>
-{
-  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res)
-  {
+template <typename Lhs, typename Rhs, typename ResultType>
+struct conservative_sparse_sparse_product_selector<Lhs, Rhs, ResultType, ColMajor, RowMajor, RowMajor> {
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res) {
     using ColMajorRhs = WithStorageOrder<Rhs, ColMajor>;
     using ColMajorRes = WithStorageOrder<ResultType, ColMajor>;
     ColMajorRhs rhsCol = rhs;
     ColMajorRes resCol(lhs.rows(), rhs.cols());
-    internal::conservative_sparse_sparse_product_impl<Lhs,ColMajorRhs,ColMajorRes>(lhs, rhsCol, resCol);
+    internal::conservative_sparse_sparse_product_impl<Lhs, ColMajorRhs, ColMajorRes>(lhs, rhsCol, resCol);
     res = resCol;
   }
 };
 
-template<typename Lhs, typename Rhs, typename ResultType>
-struct conservative_sparse_sparse_product_selector<Lhs,Rhs,ResultType,RowMajor,RowMajor,RowMajor>
-{
-  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res)
-  {
+template <typename Lhs, typename Rhs, typename ResultType>
+struct conservative_sparse_sparse_product_selector<Lhs, Rhs, ResultType, RowMajor, RowMajor, RowMajor> {
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res) {
     using ColMajorRes = WithStorageOrder<ResultType, ColMajor>;
     using RowMajorRes = WithStorageOrder<ResultType, RowMajor>;
-    RowMajorRes resRow(lhs.rows(),rhs.cols());
-    internal::conservative_sparse_sparse_product_impl<Rhs,Lhs,RowMajorRes>(rhs, lhs, resRow);
+    RowMajorRes resRow(lhs.rows(), rhs.cols());
+    internal::conservative_sparse_sparse_product_impl<Rhs, Lhs, RowMajorRes>(rhs, lhs, resRow);
     // sort the non zeros:
     ColMajorRes resCol(resRow);
     res = resCol;
   }
 };
 
-} // end namespace internal
-
+}  // end namespace internal
 
 namespace internal {
 
-template<typename Lhs, typename Rhs, typename ResultType>
-static void sparse_sparse_to_dense_product_impl(const Lhs& lhs, const Rhs& rhs, ResultType& res)
-{
+template <typename Lhs, typename Rhs, typename ResultType>
+static void sparse_sparse_to_dense_product_impl(const Lhs& lhs, const Rhs& rhs, ResultType& res) {
   typedef typename remove_all_t<Lhs>::Scalar LhsScalar;
   typedef typename remove_all_t<Rhs>::Scalar RhsScalar;
   Index cols = rhs.outerSize();
@@ -285,76 +246,63 @@
   evaluator<Lhs> lhsEval(lhs);
   evaluator<Rhs> rhsEval(rhs);
 
-  for (Index j=0; j<cols; ++j)
-  {
-    for (typename evaluator<Rhs>::InnerIterator rhsIt(rhsEval, j); rhsIt; ++rhsIt)
-    {
+  for (Index j = 0; j < cols; ++j) {
+    for (typename evaluator<Rhs>::InnerIterator rhsIt(rhsEval, j); rhsIt; ++rhsIt) {
       RhsScalar y = rhsIt.value();
       Index k = rhsIt.index();
-      for (typename evaluator<Lhs>::InnerIterator lhsIt(lhsEval, k); lhsIt; ++lhsIt)
-      {
+      for (typename evaluator<Lhs>::InnerIterator lhsIt(lhsEval, k); lhsIt; ++lhsIt) {
         Index i = lhsIt.index();
         LhsScalar x = lhsIt.value();
-        res.coeffRef(i,j) += x * y;
+        res.coeffRef(i, j) += x * y;
       }
     }
   }
 }
 
-
-} // end namespace internal
+}  // end namespace internal
 
 namespace internal {
 
-template<typename Lhs, typename Rhs, typename ResultType,
-  int LhsStorageOrder = (traits<Lhs>::Flags&RowMajorBit) ? RowMajor : ColMajor,
-  int RhsStorageOrder = (traits<Rhs>::Flags&RowMajorBit) ? RowMajor : ColMajor>
+template <typename Lhs, typename Rhs, typename ResultType,
+          int LhsStorageOrder = (traits<Lhs>::Flags & RowMajorBit) ? RowMajor : ColMajor,
+          int RhsStorageOrder = (traits<Rhs>::Flags & RowMajorBit) ? RowMajor : ColMajor>
 struct sparse_sparse_to_dense_product_selector;
 
-template<typename Lhs, typename Rhs, typename ResultType>
-struct sparse_sparse_to_dense_product_selector<Lhs,Rhs,ResultType,ColMajor,ColMajor>
-{
-  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res)
-  {
-    internal::sparse_sparse_to_dense_product_impl<Lhs,Rhs,ResultType>(lhs, rhs, res);
+template <typename Lhs, typename Rhs, typename ResultType>
+struct sparse_sparse_to_dense_product_selector<Lhs, Rhs, ResultType, ColMajor, ColMajor> {
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res) {
+    internal::sparse_sparse_to_dense_product_impl<Lhs, Rhs, ResultType>(lhs, rhs, res);
   }
 };
 
-template<typename Lhs, typename Rhs, typename ResultType>
-struct sparse_sparse_to_dense_product_selector<Lhs,Rhs,ResultType,RowMajor,ColMajor>
-{
-  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res)
-  {
+template <typename Lhs, typename Rhs, typename ResultType>
+struct sparse_sparse_to_dense_product_selector<Lhs, Rhs, ResultType, RowMajor, ColMajor> {
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res) {
     using ColMajorLhs = WithStorageOrder<Lhs, ColMajor>;
     ColMajorLhs lhsCol(lhs);
-    internal::sparse_sparse_to_dense_product_impl<ColMajorLhs,Rhs,ResultType>(lhsCol, rhs, res);
+    internal::sparse_sparse_to_dense_product_impl<ColMajorLhs, Rhs, ResultType>(lhsCol, rhs, res);
   }
 };
 
-template<typename Lhs, typename Rhs, typename ResultType>
-struct sparse_sparse_to_dense_product_selector<Lhs,Rhs,ResultType,ColMajor,RowMajor>
-{
-  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res)
-  {
+template <typename Lhs, typename Rhs, typename ResultType>
+struct sparse_sparse_to_dense_product_selector<Lhs, Rhs, ResultType, ColMajor, RowMajor> {
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res) {
     using ColMajorRhs = WithStorageOrder<Rhs, ColMajor>;
     ColMajorRhs rhsCol(rhs);
-    internal::sparse_sparse_to_dense_product_impl<Lhs,ColMajorRhs,ResultType>(lhs, rhsCol, res);
+    internal::sparse_sparse_to_dense_product_impl<Lhs, ColMajorRhs, ResultType>(lhs, rhsCol, res);
   }
 };
 
-template<typename Lhs, typename Rhs, typename ResultType>
-struct sparse_sparse_to_dense_product_selector<Lhs,Rhs,ResultType,RowMajor,RowMajor>
-{
-  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res)
-  {
+template <typename Lhs, typename Rhs, typename ResultType>
+struct sparse_sparse_to_dense_product_selector<Lhs, Rhs, ResultType, RowMajor, RowMajor> {
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res) {
     Transpose<ResultType> trRes(res);
-    internal::sparse_sparse_to_dense_product_impl<Rhs,Lhs,Transpose<ResultType> >(rhs, lhs, trRes);
+    internal::sparse_sparse_to_dense_product_impl<Rhs, Lhs, Transpose<ResultType>>(rhs, lhs, trRes);
   }
 };
 
+}  // end namespace internal
 
-} // end namespace internal
+}  // end namespace Eigen
 
-} // end namespace Eigen
-
-#endif // EIGEN_CONSERVATIVESPARSESPARSEPRODUCT_H
+#endif  // EIGEN_CONSERVATIVESPARSESPARSEPRODUCT_H
diff --git a/Eigen/src/SparseCore/SparseAssign.h b/Eigen/src/SparseCore/SparseAssign.h
index e6fd714..f2da519 100644
--- a/Eigen/src/SparseCore/SparseAssign.h
+++ b/Eigen/src/SparseCore/SparseAssign.h
@@ -13,66 +13,72 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
-template<typename Derived>    
-template<typename OtherDerived>
-Derived& SparseMatrixBase<Derived>::operator=(const EigenBase<OtherDerived> &other)
-{
+template <typename Derived>
+template <typename OtherDerived>
+Derived &SparseMatrixBase<Derived>::operator=(const EigenBase<OtherDerived> &other) {
   internal::call_assignment_no_alias(derived(), other.derived());
   return derived();
 }
 
-template<typename Derived>
-template<typename OtherDerived>
-Derived& SparseMatrixBase<Derived>::operator=(const ReturnByValue<OtherDerived>& other)
-{
+template <typename Derived>
+template <typename OtherDerived>
+Derived &SparseMatrixBase<Derived>::operator=(const ReturnByValue<OtherDerived> &other) {
   // TODO use the evaluator mechanism
   other.evalTo(derived());
   return derived();
 }
 
-template<typename Derived>
-template<typename OtherDerived>
-inline Derived& SparseMatrixBase<Derived>::operator=(const SparseMatrixBase<OtherDerived>& other)
-{
+template <typename Derived>
+template <typename OtherDerived>
+inline Derived &SparseMatrixBase<Derived>::operator=(const SparseMatrixBase<OtherDerived> &other) {
   // by default sparse evaluation do not alias, so we can safely bypass the generic call_assignment routine
-  internal::Assignment<Derived,OtherDerived,internal::assign_op<Scalar,typename OtherDerived::Scalar> >
-          ::run(derived(), other.derived(), internal::assign_op<Scalar,typename OtherDerived::Scalar>());
+  internal::Assignment<Derived, OtherDerived, internal::assign_op<Scalar, typename OtherDerived::Scalar>>::run(
+      derived(), other.derived(), internal::assign_op<Scalar, typename OtherDerived::Scalar>());
   return derived();
 }
 
-template<typename Derived>
-inline Derived& SparseMatrixBase<Derived>::operator=(const Derived& other)
-{
+template <typename Derived>
+inline Derived &SparseMatrixBase<Derived>::operator=(const Derived &other) {
   internal::call_assignment_no_alias(derived(), other.derived());
   return derived();
 }
 
 namespace internal {
 
-template<>
+template <>
 struct storage_kind_to_evaluator_kind<Sparse> {
   typedef IteratorBased Kind;
 };
 
-template<>
+template <>
 struct storage_kind_to_shape<Sparse> {
   typedef SparseShape Shape;
 };
 
 struct Sparse2Sparse {};
-struct Sparse2Dense  {};
+struct Sparse2Dense {};
 
-template<> struct AssignmentKind<SparseShape, SparseShape>           { typedef Sparse2Sparse Kind; };
-template<> struct AssignmentKind<SparseShape, SparseTriangularShape> { typedef Sparse2Sparse Kind; };
-template<> struct AssignmentKind<DenseShape,  SparseShape>           { typedef Sparse2Dense  Kind; };
-template<> struct AssignmentKind<DenseShape,  SparseTriangularShape> { typedef Sparse2Dense  Kind; };
+template <>
+struct AssignmentKind<SparseShape, SparseShape> {
+  typedef Sparse2Sparse Kind;
+};
+template <>
+struct AssignmentKind<SparseShape, SparseTriangularShape> {
+  typedef Sparse2Sparse Kind;
+};
+template <>
+struct AssignmentKind<DenseShape, SparseShape> {
+  typedef Sparse2Dense Kind;
+};
+template <>
+struct AssignmentKind<DenseShape, SparseTriangularShape> {
+  typedef Sparse2Dense Kind;
+};
 
-
-template<typename DstXprType, typename SrcXprType>
-void assign_sparse_to_sparse(DstXprType &dst, const SrcXprType &src)
-{
+template <typename DstXprType, typename SrcXprType>
+void assign_sparse_to_sparse(DstXprType &dst, const SrcXprType &src) {
   typedef typename DstXprType::Scalar Scalar;
   typedef internal::evaluator<DstXprType> DstEvaluatorType;
   typedef internal::evaluator<SrcXprType> SrcEvaluatorType;
@@ -80,50 +86,42 @@
   SrcEvaluatorType srcEvaluator(src);
 
   constexpr bool transpose = (DstEvaluatorType::Flags & RowMajorBit) != (SrcEvaluatorType::Flags & RowMajorBit);
-  const Index outerEvaluationSize = (SrcEvaluatorType::Flags&RowMajorBit) ? src.rows() : src.cols();
+  const Index outerEvaluationSize = (SrcEvaluatorType::Flags & RowMajorBit) ? src.rows() : src.cols();
 
   Index reserveSize = 0;
   for (Index j = 0; j < outerEvaluationSize; ++j)
-    for (typename SrcEvaluatorType::InnerIterator it(srcEvaluator, j); it; ++it)
-      reserveSize++;
+    for (typename SrcEvaluatorType::InnerIterator it(srcEvaluator, j); it; ++it) reserveSize++;
 
-  if ((!transpose) && src.isRValue())
-  {
+  if ((!transpose) && src.isRValue()) {
     // eval without temporary
     dst.resize(src.rows(), src.cols());
     dst.setZero();
     dst.reserve(reserveSize);
-    for (Index j=0; j<outerEvaluationSize; ++j)
-    {
+    for (Index j = 0; j < outerEvaluationSize; ++j) {
       dst.startVec(j);
-      for (typename SrcEvaluatorType::InnerIterator it(srcEvaluator, j); it; ++it)
-      {
+      for (typename SrcEvaluatorType::InnerIterator it(srcEvaluator, j); it; ++it) {
         Scalar v = it.value();
-        dst.insertBackByOuterInner(j,it.index()) = v;
+        dst.insertBackByOuterInner(j, it.index()) = v;
       }
     }
     dst.finalize();
-  }
-  else
-  {
+  } else {
     // eval through a temporary
-    eigen_assert(( ((internal::traits<DstXprType>::SupportedAccessPatterns & OuterRandomAccessPattern)==OuterRandomAccessPattern) ||
-              (!((DstEvaluatorType::Flags & RowMajorBit) != (SrcEvaluatorType::Flags & RowMajorBit)))) &&
-              "the transpose operation is supposed to be handled in SparseMatrix::operator=");
+    eigen_assert((((internal::traits<DstXprType>::SupportedAccessPatterns & OuterRandomAccessPattern) ==
+                   OuterRandomAccessPattern) ||
+                  (!((DstEvaluatorType::Flags & RowMajorBit) != (SrcEvaluatorType::Flags & RowMajorBit)))) &&
+                 "the transpose operation is supposed to be handled in SparseMatrix::operator=");
 
     enum { Flip = (DstEvaluatorType::Flags & RowMajorBit) != (SrcEvaluatorType::Flags & RowMajorBit) };
 
-    
     DstXprType temp(src.rows(), src.cols());
 
     temp.reserve(reserveSize);
-    for (Index j=0; j<outerEvaluationSize; ++j)
-    {
+    for (Index j = 0; j < outerEvaluationSize; ++j) {
       temp.startVec(j);
-      for (typename SrcEvaluatorType::InnerIterator it(srcEvaluator, j); it; ++it)
-      {
+      for (typename SrcEvaluatorType::InnerIterator it(srcEvaluator, j); it; ++it) {
         Scalar v = it.value();
-        temp.insertBackByOuterInner(Flip?it.index():j,Flip?j:it.index()) = v;
+        temp.insertBackByOuterInner(Flip ? it.index() : j, Flip ? j : it.index()) = v;
       }
     }
     temp.finalize();
@@ -133,61 +131,56 @@
 }
 
 // Generic Sparse to Sparse assignment
-template< typename DstXprType, typename SrcXprType, typename Functor>
-struct Assignment<DstXprType, SrcXprType, Functor, Sparse2Sparse>
-{
-  static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &/*func*/)
-  {
+template <typename DstXprType, typename SrcXprType, typename Functor>
+struct Assignment<DstXprType, SrcXprType, Functor, Sparse2Sparse> {
+  static void run(DstXprType &dst, const SrcXprType &src,
+                  const internal::assign_op<typename DstXprType::Scalar, typename SrcXprType::Scalar> & /*func*/) {
     assign_sparse_to_sparse(dst.derived(), src.derived());
   }
 };
 
 // Generic Sparse to Dense assignment
-template< typename DstXprType, typename SrcXprType, typename Functor, typename Weak>
-struct Assignment<DstXprType, SrcXprType, Functor, Sparse2Dense, Weak>
-{
-  static void run(DstXprType &dst, const SrcXprType &src, const Functor &func)
-  {
-    if(internal::is_same<Functor,internal::assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> >::value)
+template <typename DstXprType, typename SrcXprType, typename Functor, typename Weak>
+struct Assignment<DstXprType, SrcXprType, Functor, Sparse2Dense, Weak> {
+  static void run(DstXprType &dst, const SrcXprType &src, const Functor &func) {
+    if (internal::is_same<Functor,
+                          internal::assign_op<typename DstXprType::Scalar, typename SrcXprType::Scalar>>::value)
       dst.setZero();
-    
+
     internal::evaluator<SrcXprType> srcEval(src);
     resize_if_allowed(dst, src, func);
     internal::evaluator<DstXprType> dstEval(dst);
-    
-    const Index outerEvaluationSize = (internal::evaluator<SrcXprType>::Flags&RowMajorBit) ? src.rows() : src.cols();
-    for (Index j=0; j<outerEvaluationSize; ++j)
-      for (typename internal::evaluator<SrcXprType>::InnerIterator i(srcEval,j); i; ++i)
-        func.assignCoeff(dstEval.coeffRef(i.row(),i.col()), i.value());
+
+    const Index outerEvaluationSize = (internal::evaluator<SrcXprType>::Flags & RowMajorBit) ? src.rows() : src.cols();
+    for (Index j = 0; j < outerEvaluationSize; ++j)
+      for (typename internal::evaluator<SrcXprType>::InnerIterator i(srcEval, j); i; ++i)
+        func.assignCoeff(dstEval.coeffRef(i.row(), i.col()), i.value());
   }
 };
 
 // Specialization for dense ?= dense +/- sparse and dense ?= sparse +/- dense
-template<typename DstXprType, typename Func1, typename Func2>
-struct assignment_from_dense_op_sparse
-{
-  template<typename SrcXprType, typename InitialFunc>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  void run(DstXprType &dst, const SrcXprType &src, const InitialFunc& /*func*/)
-  {
-    #ifdef EIGEN_SPARSE_ASSIGNMENT_FROM_DENSE_OP_SPARSE_PLUGIN
+template <typename DstXprType, typename Func1, typename Func2>
+struct assignment_from_dense_op_sparse {
+  template <typename SrcXprType, typename InitialFunc>
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(DstXprType &dst, const SrcXprType &src,
+                                                        const InitialFunc & /*func*/) {
+#ifdef EIGEN_SPARSE_ASSIGNMENT_FROM_DENSE_OP_SPARSE_PLUGIN
     EIGEN_SPARSE_ASSIGNMENT_FROM_DENSE_OP_SPARSE_PLUGIN
-    #endif
+#endif
 
     call_assignment_no_alias(dst, src.lhs(), Func1());
     call_assignment_no_alias(dst, src.rhs(), Func2());
   }
 
   // Specialization for dense1 = sparse + dense2; -> dense1 = dense2; dense1 += sparse;
-  template<typename Lhs, typename Rhs, typename Scalar>
+  template <typename Lhs, typename Rhs, typename Scalar>
   static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  std::enable_if_t<internal::is_same<typename internal::evaluator_traits<Rhs>::Shape,DenseShape>::value>
-  run(DstXprType &dst, const CwiseBinaryOp<internal::scalar_sum_op<Scalar,Scalar>, const Lhs, const Rhs> &src,
-      const internal::assign_op<typename DstXprType::Scalar,Scalar>& /*func*/)
-  {
-    #ifdef EIGEN_SPARSE_ASSIGNMENT_FROM_SPARSE_ADD_DENSE_PLUGIN
+      std::enable_if_t<internal::is_same<typename internal::evaluator_traits<Rhs>::Shape, DenseShape>::value>
+      run(DstXprType &dst, const CwiseBinaryOp<internal::scalar_sum_op<Scalar, Scalar>, const Lhs, const Rhs> &src,
+          const internal::assign_op<typename DstXprType::Scalar, Scalar> & /*func*/) {
+#ifdef EIGEN_SPARSE_ASSIGNMENT_FROM_SPARSE_ADD_DENSE_PLUGIN
     EIGEN_SPARSE_ASSIGNMENT_FROM_SPARSE_ADD_DENSE_PLUGIN
-    #endif
+#endif
 
     // Apply the dense matrix first, then the sparse one.
     call_assignment_no_alias(dst, src.rhs(), Func1());
@@ -195,52 +188,50 @@
   }
 
   // Specialization for dense1 = sparse - dense2; -> dense1 = -dense2; dense1 += sparse;
-  template<typename Lhs, typename Rhs, typename Scalar>
+  template <typename Lhs, typename Rhs, typename Scalar>
   static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  std::enable_if_t<internal::is_same<typename internal::evaluator_traits<Rhs>::Shape,DenseShape>::value>
-  run(DstXprType &dst, const CwiseBinaryOp<internal::scalar_difference_op<Scalar,Scalar>, const Lhs, const Rhs> &src,
-      const internal::assign_op<typename DstXprType::Scalar,Scalar>& /*func*/)
-  {
-    #ifdef EIGEN_SPARSE_ASSIGNMENT_FROM_SPARSE_SUB_DENSE_PLUGIN
+      std::enable_if_t<internal::is_same<typename internal::evaluator_traits<Rhs>::Shape, DenseShape>::value>
+      run(DstXprType &dst,
+          const CwiseBinaryOp<internal::scalar_difference_op<Scalar, Scalar>, const Lhs, const Rhs> &src,
+          const internal::assign_op<typename DstXprType::Scalar, Scalar> & /*func*/) {
+#ifdef EIGEN_SPARSE_ASSIGNMENT_FROM_SPARSE_SUB_DENSE_PLUGIN
     EIGEN_SPARSE_ASSIGNMENT_FROM_SPARSE_SUB_DENSE_PLUGIN
-    #endif
+#endif
 
     // Apply the dense matrix first, then the sparse one.
     call_assignment_no_alias(dst, -src.rhs(), Func1());
-    call_assignment_no_alias(dst,  src.lhs(), add_assign_op<typename DstXprType::Scalar,typename Lhs::Scalar>());
+    call_assignment_no_alias(dst, src.lhs(), add_assign_op<typename DstXprType::Scalar, typename Lhs::Scalar>());
   }
 };
 
-#define EIGEN_CATCH_ASSIGN_DENSE_OP_SPARSE(ASSIGN_OP,BINOP,ASSIGN_OP2) \
-  template< typename DstXprType, typename Lhs, typename Rhs, typename Scalar> \
-  struct Assignment<DstXprType, CwiseBinaryOp<internal::BINOP<Scalar,Scalar>, const Lhs, const Rhs>, internal::ASSIGN_OP<typename DstXprType::Scalar,Scalar>, \
-                    Sparse2Dense, \
-                    std::enable_if_t<   internal::is_same<typename internal::evaluator_traits<Lhs>::Shape,DenseShape>::value \
-                                     || internal::is_same<typename internal::evaluator_traits<Rhs>::Shape,DenseShape>::value>> \
-    : assignment_from_dense_op_sparse<DstXprType, internal::ASSIGN_OP<typename DstXprType::Scalar,typename Lhs::Scalar>, internal::ASSIGN_OP2<typename DstXprType::Scalar,typename Rhs::Scalar> > \
-  {}
+#define EIGEN_CATCH_ASSIGN_DENSE_OP_SPARSE(ASSIGN_OP, BINOP, ASSIGN_OP2)                                        \
+  template <typename DstXprType, typename Lhs, typename Rhs, typename Scalar>                                   \
+  struct Assignment<                                                                                            \
+      DstXprType, CwiseBinaryOp<internal::BINOP<Scalar, Scalar>, const Lhs, const Rhs>,                         \
+      internal::ASSIGN_OP<typename DstXprType::Scalar, Scalar>, Sparse2Dense,                                   \
+      std::enable_if_t<internal::is_same<typename internal::evaluator_traits<Lhs>::Shape, DenseShape>::value || \
+                       internal::is_same<typename internal::evaluator_traits<Rhs>::Shape, DenseShape>::value>>  \
+      : assignment_from_dense_op_sparse<DstXprType,                                                             \
+                                        internal::ASSIGN_OP<typename DstXprType::Scalar, typename Lhs::Scalar>, \
+                                        internal::ASSIGN_OP2<typename DstXprType::Scalar, typename Rhs::Scalar>> {}
 
-EIGEN_CATCH_ASSIGN_DENSE_OP_SPARSE(assign_op,    scalar_sum_op,add_assign_op);
-EIGEN_CATCH_ASSIGN_DENSE_OP_SPARSE(add_assign_op,scalar_sum_op,add_assign_op);
-EIGEN_CATCH_ASSIGN_DENSE_OP_SPARSE(sub_assign_op,scalar_sum_op,sub_assign_op);
+EIGEN_CATCH_ASSIGN_DENSE_OP_SPARSE(assign_op, scalar_sum_op, add_assign_op);
+EIGEN_CATCH_ASSIGN_DENSE_OP_SPARSE(add_assign_op, scalar_sum_op, add_assign_op);
+EIGEN_CATCH_ASSIGN_DENSE_OP_SPARSE(sub_assign_op, scalar_sum_op, sub_assign_op);
 
-EIGEN_CATCH_ASSIGN_DENSE_OP_SPARSE(assign_op,    scalar_difference_op,sub_assign_op);
-EIGEN_CATCH_ASSIGN_DENSE_OP_SPARSE(add_assign_op,scalar_difference_op,sub_assign_op);
-EIGEN_CATCH_ASSIGN_DENSE_OP_SPARSE(sub_assign_op,scalar_difference_op,add_assign_op);
-
+EIGEN_CATCH_ASSIGN_DENSE_OP_SPARSE(assign_op, scalar_difference_op, sub_assign_op);
+EIGEN_CATCH_ASSIGN_DENSE_OP_SPARSE(add_assign_op, scalar_difference_op, sub_assign_op);
+EIGEN_CATCH_ASSIGN_DENSE_OP_SPARSE(sub_assign_op, scalar_difference_op, add_assign_op);
 
 // Specialization for "dst = dec.solve(rhs)"
 // NOTE we need to specialize it for Sparse2Sparse to avoid ambiguous specialization error
-template<typename DstXprType, typename DecType, typename RhsType, typename Scalar>
-struct Assignment<DstXprType, Solve<DecType,RhsType>, internal::assign_op<Scalar,Scalar>, Sparse2Sparse>
-{
-  typedef Solve<DecType,RhsType> SrcXprType;
-  static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<Scalar,Scalar> &)
-  {
+template <typename DstXprType, typename DecType, typename RhsType, typename Scalar>
+struct Assignment<DstXprType, Solve<DecType, RhsType>, internal::assign_op<Scalar, Scalar>, Sparse2Sparse> {
+  typedef Solve<DecType, RhsType> SrcXprType;
+  static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<Scalar, Scalar> &) {
     Index dstRows = src.rows();
     Index dstCols = src.cols();
-    if((dst.rows()!=dstRows) || (dst.cols()!=dstCols))
-      dst.resize(dstRows, dstCols);
+    if ((dst.rows() != dstRows) || (dst.cols() != dstCols)) dst.resize(dstRows, dstCols);
 
     src.dec()._solve_impl(src.rhs(), dst);
   }
@@ -248,32 +239,41 @@
 
 struct Diagonal2Sparse {};
 
-template<> struct AssignmentKind<SparseShape,DiagonalShape> { typedef Diagonal2Sparse Kind; };
+template <>
+struct AssignmentKind<SparseShape, DiagonalShape> {
+  typedef Diagonal2Sparse Kind;
+};
 
-template< typename DstXprType, typename SrcXprType, typename Functor>
-struct Assignment<DstXprType, SrcXprType, Functor, Diagonal2Sparse>
-{
+template <typename DstXprType, typename SrcXprType, typename Functor>
+struct Assignment<DstXprType, SrcXprType, Functor, Diagonal2Sparse> {
   typedef typename DstXprType::StorageIndex StorageIndex;
   typedef typename DstXprType::Scalar Scalar;
 
-  template<int Options, typename AssignFunc>
-  static void run(SparseMatrix<Scalar,Options,StorageIndex> &dst, const SrcXprType &src, const AssignFunc &func)
-  { dst.assignDiagonal(src.diagonal(), func); }
-  
-  template<typename DstDerived>
-  static void run(SparseMatrixBase<DstDerived> &dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &/*func*/)
-  { dst.derived().diagonal() = src.diagonal(); }
-  
-  template<typename DstDerived>
-  static void run(SparseMatrixBase<DstDerived> &dst, const SrcXprType &src, const internal::add_assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &/*func*/)
-  { dst.derived().diagonal() += src.diagonal(); }
-  
-  template<typename DstDerived>
-  static void run(SparseMatrixBase<DstDerived> &dst, const SrcXprType &src, const internal::sub_assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &/*func*/)
-  { dst.derived().diagonal() -= src.diagonal(); }
+  template <int Options, typename AssignFunc>
+  static void run(SparseMatrix<Scalar, Options, StorageIndex> &dst, const SrcXprType &src, const AssignFunc &func) {
+    dst.assignDiagonal(src.diagonal(), func);
+  }
+
+  template <typename DstDerived>
+  static void run(SparseMatrixBase<DstDerived> &dst, const SrcXprType &src,
+                  const internal::assign_op<typename DstXprType::Scalar, typename SrcXprType::Scalar> & /*func*/) {
+    dst.derived().diagonal() = src.diagonal();
+  }
+
+  template <typename DstDerived>
+  static void run(SparseMatrixBase<DstDerived> &dst, const SrcXprType &src,
+                  const internal::add_assign_op<typename DstXprType::Scalar, typename SrcXprType::Scalar> & /*func*/) {
+    dst.derived().diagonal() += src.diagonal();
+  }
+
+  template <typename DstDerived>
+  static void run(SparseMatrixBase<DstDerived> &dst, const SrcXprType &src,
+                  const internal::sub_assign_op<typename DstXprType::Scalar, typename SrcXprType::Scalar> & /*func*/) {
+    dst.derived().diagonal() -= src.diagonal();
+  }
 };
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SPARSEASSIGN_H
+#endif  // EIGEN_SPARSEASSIGN_H
diff --git a/Eigen/src/SparseCore/SparseBlock.h b/Eigen/src/SparseCore/SparseBlock.h
index d145804..1342f4e 100644
--- a/Eigen/src/SparseCore/SparseBlock.h
+++ b/Eigen/src/SparseCore/SparseBlock.h
@@ -16,483 +16,448 @@
 namespace Eigen {
 
 // Subset of columns or rows
-template<typename XprType, int BlockRows, int BlockCols>
-class BlockImpl<XprType,BlockRows,BlockCols,true,Sparse>
-  : public SparseMatrixBase<Block<XprType,BlockRows,BlockCols,true> >
-{
-    typedef internal::remove_all_t<typename XprType::Nested> MatrixTypeNested_;
-    typedef Block<XprType, BlockRows, BlockCols, true> BlockType;
-public:
-    enum { IsRowMajor = internal::traits<BlockType>::IsRowMajor };
-protected:
-    enum { OuterSize = IsRowMajor ? BlockRows : BlockCols };
-    typedef SparseMatrixBase<BlockType> Base;
-    using Base::convert_index;
-public:
-    EIGEN_SPARSE_PUBLIC_INTERFACE(BlockType)
+template <typename XprType, int BlockRows, int BlockCols>
+class BlockImpl<XprType, BlockRows, BlockCols, true, Sparse>
+    : public SparseMatrixBase<Block<XprType, BlockRows, BlockCols, true> > {
+  typedef internal::remove_all_t<typename XprType::Nested> MatrixTypeNested_;
+  typedef Block<XprType, BlockRows, BlockCols, true> BlockType;
 
-    inline BlockImpl(XprType& xpr, Index i)
-      : m_matrix(xpr), m_outerStart(convert_index(i)), m_outerSize(OuterSize)
-    {}
+ public:
+  enum { IsRowMajor = internal::traits<BlockType>::IsRowMajor };
 
-    inline BlockImpl(XprType& xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
-      : m_matrix(xpr), m_outerStart(convert_index(IsRowMajor ? startRow : startCol)), m_outerSize(convert_index(IsRowMajor ? blockRows : blockCols))
-    {}
+ protected:
+  enum { OuterSize = IsRowMajor ? BlockRows : BlockCols };
+  typedef SparseMatrixBase<BlockType> Base;
+  using Base::convert_index;
 
-    EIGEN_STRONG_INLINE Index rows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
-    EIGEN_STRONG_INLINE Index cols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
+ public:
+  EIGEN_SPARSE_PUBLIC_INTERFACE(BlockType)
 
-    Index nonZeros() const
-    {
-      typedef internal::evaluator<XprType> EvaluatorType;
-      EvaluatorType matEval(m_matrix);
-      Index nnz = 0;
-      Index end = m_outerStart + m_outerSize.value();
-      for(Index j=m_outerStart; j<end; ++j)
-        for(typename EvaluatorType::InnerIterator it(matEval, j); it; ++it)
-          ++nnz;
-      return nnz;
-    }
+  inline BlockImpl(XprType& xpr, Index i) : m_matrix(xpr), m_outerStart(convert_index(i)), m_outerSize(OuterSize) {}
 
-    inline const Scalar coeff(Index row, Index col) const
-    {
-      return m_matrix.coeff(row + (IsRowMajor ? m_outerStart : 0), col + (IsRowMajor ? 0 :  m_outerStart));
-    }
+  inline BlockImpl(XprType& xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
+      : m_matrix(xpr),
+        m_outerStart(convert_index(IsRowMajor ? startRow : startCol)),
+        m_outerSize(convert_index(IsRowMajor ? blockRows : blockCols)) {}
 
-    inline const Scalar coeff(Index index) const
-    {
-      return m_matrix.coeff(IsRowMajor ? m_outerStart : index, IsRowMajor ? index :  m_outerStart);
-    }
+  EIGEN_STRONG_INLINE Index rows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
+  EIGEN_STRONG_INLINE Index cols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
 
-    inline const XprType& nestedExpression() const { return m_matrix; }
-    inline XprType& nestedExpression() { return m_matrix; }
-    Index startRow() const { return IsRowMajor ? m_outerStart : 0; }
-    Index startCol() const { return IsRowMajor ? 0 : m_outerStart; }
-    Index blockRows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
-    Index blockCols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
+  Index nonZeros() const {
+    typedef internal::evaluator<XprType> EvaluatorType;
+    EvaluatorType matEval(m_matrix);
+    Index nnz = 0;
+    Index end = m_outerStart + m_outerSize.value();
+    for (Index j = m_outerStart; j < end; ++j)
+      for (typename EvaluatorType::InnerIterator it(matEval, j); it; ++it) ++nnz;
+    return nnz;
+  }
 
-  protected:
+  inline const Scalar coeff(Index row, Index col) const {
+    return m_matrix.coeff(row + (IsRowMajor ? m_outerStart : 0), col + (IsRowMajor ? 0 : m_outerStart));
+  }
 
-    typename internal::ref_selector<XprType>::non_const_type m_matrix;
-    Index m_outerStart;
-    const internal::variable_if_dynamic<Index, OuterSize> m_outerSize;
+  inline const Scalar coeff(Index index) const {
+    return m_matrix.coeff(IsRowMajor ? m_outerStart : index, IsRowMajor ? index : m_outerStart);
+  }
 
-  protected:
-    // Disable assignment with clear error message.
-    // Note that simply removing operator= yields compilation errors with ICC+MSVC
-    template<typename T>
-    BlockImpl& operator=(const T&)
-    {
-      EIGEN_STATIC_ASSERT(sizeof(T)==0, THIS_SPARSE_BLOCK_SUBEXPRESSION_IS_READ_ONLY);
-      return *this;
-    }
+  inline const XprType& nestedExpression() const { return m_matrix; }
+  inline XprType& nestedExpression() { return m_matrix; }
+  Index startRow() const { return IsRowMajor ? m_outerStart : 0; }
+  Index startCol() const { return IsRowMajor ? 0 : m_outerStart; }
+  Index blockRows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
+  Index blockCols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
+
+ protected:
+  typename internal::ref_selector<XprType>::non_const_type m_matrix;
+  Index m_outerStart;
+  const internal::variable_if_dynamic<Index, OuterSize> m_outerSize;
+
+ protected:
+  // Disable assignment with clear error message.
+  // Note that simply removing operator= yields compilation errors with ICC+MSVC
+  template <typename T>
+  BlockImpl& operator=(const T&) {
+    EIGEN_STATIC_ASSERT(sizeof(T) == 0, THIS_SPARSE_BLOCK_SUBEXPRESSION_IS_READ_ONLY);
+    return *this;
+  }
 };
 
-
 /***************************************************************************
-* specialization for SparseMatrix
-***************************************************************************/
+ * specialization for SparseMatrix
+ ***************************************************************************/
 
 namespace internal {
 
-template<typename SparseMatrixType, int BlockRows, int BlockCols>
-class sparse_matrix_block_impl
-  : public SparseCompressedBase<Block<SparseMatrixType,BlockRows,BlockCols,true> >
-{
-    typedef internal::remove_all_t<typename SparseMatrixType::Nested> MatrixTypeNested_;
-    typedef Block<SparseMatrixType, BlockRows, BlockCols, true> BlockType;
-    typedef SparseCompressedBase<Block<SparseMatrixType,BlockRows,BlockCols,true> > Base;
-    using Base::convert_index;
-public:
-    enum { IsRowMajor = internal::traits<BlockType>::IsRowMajor };
-    EIGEN_SPARSE_PUBLIC_INTERFACE(BlockType)
-protected:
-    typedef typename Base::IndexVector IndexVector;
-    enum { OuterSize = IsRowMajor ? BlockRows : BlockCols };
-public:
+template <typename SparseMatrixType, int BlockRows, int BlockCols>
+class sparse_matrix_block_impl : public SparseCompressedBase<Block<SparseMatrixType, BlockRows, BlockCols, true> > {
+  typedef internal::remove_all_t<typename SparseMatrixType::Nested> MatrixTypeNested_;
+  typedef Block<SparseMatrixType, BlockRows, BlockCols, true> BlockType;
+  typedef SparseCompressedBase<Block<SparseMatrixType, BlockRows, BlockCols, true> > Base;
+  using Base::convert_index;
 
-    inline sparse_matrix_block_impl(SparseMatrixType& xpr, Index i)
-      : m_matrix(xpr), m_outerStart(convert_index(i)), m_outerSize(OuterSize)
-    {}
+ public:
+  enum { IsRowMajor = internal::traits<BlockType>::IsRowMajor };
+  EIGEN_SPARSE_PUBLIC_INTERFACE(BlockType)
+ protected:
+  typedef typename Base::IndexVector IndexVector;
+  enum { OuterSize = IsRowMajor ? BlockRows : BlockCols };
 
-    inline sparse_matrix_block_impl(SparseMatrixType& xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
-      : m_matrix(xpr), m_outerStart(convert_index(IsRowMajor ? startRow : startCol)), m_outerSize(convert_index(IsRowMajor ? blockRows : blockCols))
-    {}
+ public:
+  inline sparse_matrix_block_impl(SparseMatrixType& xpr, Index i)
+      : m_matrix(xpr), m_outerStart(convert_index(i)), m_outerSize(OuterSize) {}
 
-    template<typename OtherDerived>
-    inline BlockType& operator=(const SparseMatrixBase<OtherDerived>& other)
-    {
-      typedef internal::remove_all_t<typename SparseMatrixType::Nested> NestedMatrixType_;
-      NestedMatrixType_& matrix = m_matrix;
-      // This assignment is slow if this vector set is not empty
-      // and/or it is not at the end of the nonzeros of the underlying matrix.
+  inline sparse_matrix_block_impl(SparseMatrixType& xpr, Index startRow, Index startCol, Index blockRows,
+                                  Index blockCols)
+      : m_matrix(xpr),
+        m_outerStart(convert_index(IsRowMajor ? startRow : startCol)),
+        m_outerSize(convert_index(IsRowMajor ? blockRows : blockCols)) {}
 
-      // 1 - eval to a temporary to avoid transposition and/or aliasing issues
-      Ref<const SparseMatrix<Scalar, IsRowMajor ? RowMajor : ColMajor, StorageIndex> > tmp(other.derived());
-      eigen_internal_assert(tmp.outerSize()==m_outerSize.value());
+  template <typename OtherDerived>
+  inline BlockType& operator=(const SparseMatrixBase<OtherDerived>& other) {
+    typedef internal::remove_all_t<typename SparseMatrixType::Nested> NestedMatrixType_;
+    NestedMatrixType_& matrix = m_matrix;
+    // This assignment is slow if this vector set is not empty
+    // and/or it is not at the end of the nonzeros of the underlying matrix.
 
-      // 2 - let's check whether there is enough allocated memory
-      Index nnz           = tmp.nonZeros();
-      Index start         = m_outerStart==0 ? 0 : m_matrix.outerIndexPtr()[m_outerStart]; // starting position of the current block
-      Index end           = m_matrix.outerIndexPtr()[m_outerStart+m_outerSize.value()]; // ending position of the current block
-      Index block_size    = end - start;                                                // available room in the current block
-      Index tail_size     = m_matrix.outerIndexPtr()[m_matrix.outerSize()] - end;
+    // 1 - eval to a temporary to avoid transposition and/or aliasing issues
+    Ref<const SparseMatrix<Scalar, IsRowMajor ? RowMajor : ColMajor, StorageIndex> > tmp(other.derived());
+    eigen_internal_assert(tmp.outerSize() == m_outerSize.value());
 
-      Index free_size     = m_matrix.isCompressed()
-                          ? Index(matrix.data().allocatedSize()) + block_size
-                          : block_size;
+    // 2 - let's check whether there is enough allocated memory
+    Index nnz = tmp.nonZeros();
+    Index start =
+        m_outerStart == 0 ? 0 : m_matrix.outerIndexPtr()[m_outerStart];        // starting position of the current block
+    Index end = m_matrix.outerIndexPtr()[m_outerStart + m_outerSize.value()];  // ending position of the current block
+    Index block_size = end - start;                                            // available room in the current block
+    Index tail_size = m_matrix.outerIndexPtr()[m_matrix.outerSize()] - end;
 
-      Index tmp_start = tmp.outerIndexPtr()[0];
+    Index free_size = m_matrix.isCompressed() ? Index(matrix.data().allocatedSize()) + block_size : block_size;
 
-      bool update_trailing_pointers = false;
-      if(nnz>free_size)
-      {
-        // realloc manually to reduce copies
-        typename SparseMatrixType::Storage newdata(m_matrix.data().allocatedSize() - block_size + nnz);
+    Index tmp_start = tmp.outerIndexPtr()[0];
 
-        internal::smart_copy(m_matrix.valuePtr(),       m_matrix.valuePtr() + start,      newdata.valuePtr());
-        internal::smart_copy(m_matrix.innerIndexPtr(),  m_matrix.innerIndexPtr() + start, newdata.indexPtr());
+    bool update_trailing_pointers = false;
+    if (nnz > free_size) {
+      // realloc manually to reduce copies
+      typename SparseMatrixType::Storage newdata(m_matrix.data().allocatedSize() - block_size + nnz);
 
-        internal::smart_copy(tmp.valuePtr() + tmp_start,      tmp.valuePtr() + tmp_start + nnz,       newdata.valuePtr() + start);
-        internal::smart_copy(tmp.innerIndexPtr() + tmp_start, tmp.innerIndexPtr() + tmp_start + nnz,  newdata.indexPtr() + start);
+      internal::smart_copy(m_matrix.valuePtr(), m_matrix.valuePtr() + start, newdata.valuePtr());
+      internal::smart_copy(m_matrix.innerIndexPtr(), m_matrix.innerIndexPtr() + start, newdata.indexPtr());
 
-        internal::smart_copy(matrix.valuePtr()+end,       matrix.valuePtr()+end + tail_size,      newdata.valuePtr()+start+nnz);
-        internal::smart_copy(matrix.innerIndexPtr()+end,  matrix.innerIndexPtr()+end + tail_size, newdata.indexPtr()+start+nnz);
+      internal::smart_copy(tmp.valuePtr() + tmp_start, tmp.valuePtr() + tmp_start + nnz, newdata.valuePtr() + start);
+      internal::smart_copy(tmp.innerIndexPtr() + tmp_start, tmp.innerIndexPtr() + tmp_start + nnz,
+                           newdata.indexPtr() + start);
 
-        newdata.resize(m_matrix.outerIndexPtr()[m_matrix.outerSize()] - block_size + nnz);
+      internal::smart_copy(matrix.valuePtr() + end, matrix.valuePtr() + end + tail_size,
+                           newdata.valuePtr() + start + nnz);
+      internal::smart_copy(matrix.innerIndexPtr() + end, matrix.innerIndexPtr() + end + tail_size,
+                           newdata.indexPtr() + start + nnz);
 
-        matrix.data().swap(newdata);
+      newdata.resize(m_matrix.outerIndexPtr()[m_matrix.outerSize()] - block_size + nnz);
+
+      matrix.data().swap(newdata);
+
+      update_trailing_pointers = true;
+    } else {
+      if (m_matrix.isCompressed() && nnz != block_size) {
+        // no need to realloc, simply copy the tail at its respective position and insert tmp
+        matrix.data().resize(start + nnz + tail_size);
+
+        internal::smart_memmove(matrix.valuePtr() + end, matrix.valuePtr() + end + tail_size,
+                                matrix.valuePtr() + start + nnz);
+        internal::smart_memmove(matrix.innerIndexPtr() + end, matrix.innerIndexPtr() + end + tail_size,
+                                matrix.innerIndexPtr() + start + nnz);
 
         update_trailing_pointers = true;
       }
-      else
-      {
-        if(m_matrix.isCompressed() && nnz!=block_size)
-        {
-          // no need to realloc, simply copy the tail at its respective position and insert tmp
-          matrix.data().resize(start + nnz + tail_size);
 
-          internal::smart_memmove(matrix.valuePtr()+end,      matrix.valuePtr() + end+tail_size,      matrix.valuePtr() + start+nnz);
-          internal::smart_memmove(matrix.innerIndexPtr()+end, matrix.innerIndexPtr() + end+tail_size, matrix.innerIndexPtr() + start+nnz);
+      internal::smart_copy(tmp.valuePtr() + tmp_start, tmp.valuePtr() + tmp_start + nnz, matrix.valuePtr() + start);
+      internal::smart_copy(tmp.innerIndexPtr() + tmp_start, tmp.innerIndexPtr() + tmp_start + nnz,
+                           matrix.innerIndexPtr() + start);
+    }
 
-          update_trailing_pointers = true;
-        }
-
-        internal::smart_copy(tmp.valuePtr() + tmp_start,      tmp.valuePtr() + tmp_start + nnz,       matrix.valuePtr() + start);
-        internal::smart_copy(tmp.innerIndexPtr() + tmp_start, tmp.innerIndexPtr() + tmp_start + nnz,  matrix.innerIndexPtr() + start);
+    // update outer index pointers and innerNonZeros
+    if (IsVectorAtCompileTime) {
+      if (!m_matrix.isCompressed()) matrix.innerNonZeroPtr()[m_outerStart] = StorageIndex(nnz);
+      matrix.outerIndexPtr()[m_outerStart] = StorageIndex(start);
+    } else {
+      StorageIndex p = StorageIndex(start);
+      for (Index k = 0; k < m_outerSize.value(); ++k) {
+        StorageIndex nnz_k = internal::convert_index<StorageIndex>(tmp.innerVector(k).nonZeros());
+        if (!m_matrix.isCompressed()) matrix.innerNonZeroPtr()[m_outerStart + k] = nnz_k;
+        matrix.outerIndexPtr()[m_outerStart + k] = p;
+        p += nnz_k;
       }
+    }
 
-      // update outer index pointers and innerNonZeros
-      if(IsVectorAtCompileTime)
-      {
-        if(!m_matrix.isCompressed())
-          matrix.innerNonZeroPtr()[m_outerStart] = StorageIndex(nnz);
-        matrix.outerIndexPtr()[m_outerStart] = StorageIndex(start);
+    if (update_trailing_pointers) {
+      StorageIndex offset = internal::convert_index<StorageIndex>(nnz - block_size);
+      for (Index k = m_outerStart + m_outerSize.value(); k <= matrix.outerSize(); ++k) {
+        matrix.outerIndexPtr()[k] += offset;
       }
-      else
-      {
-        StorageIndex p = StorageIndex(start);
-        for(Index k=0; k<m_outerSize.value(); ++k)
-        {
-          StorageIndex nnz_k = internal::convert_index<StorageIndex>(tmp.innerVector(k).nonZeros());
-          if(!m_matrix.isCompressed())
-            matrix.innerNonZeroPtr()[m_outerStart+k] = nnz_k;
-          matrix.outerIndexPtr()[m_outerStart+k] = p;
-          p += nnz_k;
-        }
-      }
-
-      if(update_trailing_pointers)
-      {
-        StorageIndex offset = internal::convert_index<StorageIndex>(nnz - block_size);
-        for(Index k = m_outerStart + m_outerSize.value(); k<=matrix.outerSize(); ++k)
-        {
-          matrix.outerIndexPtr()[k] += offset;
-        }
-      }
-
-      return derived();
     }
 
-    inline BlockType& operator=(const BlockType& other)
-    {
-      return operator=<BlockType>(other);
-    }
+    return derived();
+  }
 
-    inline const Scalar* valuePtr() const
-    { return m_matrix.valuePtr(); }
-    inline Scalar* valuePtr()
-    { return m_matrix.valuePtr(); }
+  inline BlockType& operator=(const BlockType& other) { return operator= <BlockType>(other); }
 
-    inline const StorageIndex* innerIndexPtr() const
-    { return m_matrix.innerIndexPtr(); }
-    inline StorageIndex* innerIndexPtr()
-    { return m_matrix.innerIndexPtr(); }
+  inline const Scalar* valuePtr() const { return m_matrix.valuePtr(); }
+  inline Scalar* valuePtr() { return m_matrix.valuePtr(); }
 
-    inline const StorageIndex* outerIndexPtr() const
-    { return m_matrix.outerIndexPtr() + m_outerStart; }
-    inline StorageIndex* outerIndexPtr()
-    { return m_matrix.outerIndexPtr() + m_outerStart; }
+  inline const StorageIndex* innerIndexPtr() const { return m_matrix.innerIndexPtr(); }
+  inline StorageIndex* innerIndexPtr() { return m_matrix.innerIndexPtr(); }
 
-    inline const StorageIndex* innerNonZeroPtr() const
-    { return isCompressed() ? 0 : (m_matrix.innerNonZeroPtr()+m_outerStart); }
-    inline StorageIndex* innerNonZeroPtr()
-    { return isCompressed() ? 0 : (m_matrix.innerNonZeroPtr()+m_outerStart); }
+  inline const StorageIndex* outerIndexPtr() const { return m_matrix.outerIndexPtr() + m_outerStart; }
+  inline StorageIndex* outerIndexPtr() { return m_matrix.outerIndexPtr() + m_outerStart; }
 
-    bool isCompressed() const { return m_matrix.innerNonZeroPtr()==0; }
+  inline const StorageIndex* innerNonZeroPtr() const {
+    return isCompressed() ? 0 : (m_matrix.innerNonZeroPtr() + m_outerStart);
+  }
+  inline StorageIndex* innerNonZeroPtr() { return isCompressed() ? 0 : (m_matrix.innerNonZeroPtr() + m_outerStart); }
 
-    inline Scalar& coeffRef(Index row, Index col)
-    {
-      return m_matrix.coeffRef(row + (IsRowMajor ? m_outerStart : 0), col + (IsRowMajor ? 0 :  m_outerStart));
-    }
+  bool isCompressed() const { return m_matrix.innerNonZeroPtr() == 0; }
 
-    inline const Scalar coeff(Index row, Index col) const
-    {
-      return m_matrix.coeff(row + (IsRowMajor ? m_outerStart : 0), col + (IsRowMajor ? 0 :  m_outerStart));
-    }
+  inline Scalar& coeffRef(Index row, Index col) {
+    return m_matrix.coeffRef(row + (IsRowMajor ? m_outerStart : 0), col + (IsRowMajor ? 0 : m_outerStart));
+  }
 
-    inline const Scalar coeff(Index index) const
-    {
-      return m_matrix.coeff(IsRowMajor ? m_outerStart : index, IsRowMajor ? index :  m_outerStart);
-    }
+  inline const Scalar coeff(Index row, Index col) const {
+    return m_matrix.coeff(row + (IsRowMajor ? m_outerStart : 0), col + (IsRowMajor ? 0 : m_outerStart));
+  }
 
-    const Scalar& lastCoeff() const
-    {
-      EIGEN_STATIC_ASSERT_VECTOR_ONLY(sparse_matrix_block_impl);
-      eigen_assert(Base::nonZeros()>0);
-      if(m_matrix.isCompressed())
-        return m_matrix.valuePtr()[m_matrix.outerIndexPtr()[m_outerStart+1]-1];
-      else
-        return m_matrix.valuePtr()[m_matrix.outerIndexPtr()[m_outerStart]+m_matrix.innerNonZeroPtr()[m_outerStart]-1];
-    }
+  inline const Scalar coeff(Index index) const {
+    return m_matrix.coeff(IsRowMajor ? m_outerStart : index, IsRowMajor ? index : m_outerStart);
+  }
 
-    EIGEN_STRONG_INLINE Index rows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
-    EIGEN_STRONG_INLINE Index cols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
+  const Scalar& lastCoeff() const {
+    EIGEN_STATIC_ASSERT_VECTOR_ONLY(sparse_matrix_block_impl);
+    eigen_assert(Base::nonZeros() > 0);
+    if (m_matrix.isCompressed())
+      return m_matrix.valuePtr()[m_matrix.outerIndexPtr()[m_outerStart + 1] - 1];
+    else
+      return m_matrix.valuePtr()[m_matrix.outerIndexPtr()[m_outerStart] + m_matrix.innerNonZeroPtr()[m_outerStart] - 1];
+  }
 
-    inline const SparseMatrixType& nestedExpression() const { return m_matrix; }
-    inline SparseMatrixType& nestedExpression() { return m_matrix; }
-    Index startRow() const { return IsRowMajor ? m_outerStart : 0; }
-    Index startCol() const { return IsRowMajor ? 0 : m_outerStart; }
-    Index blockRows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
-    Index blockCols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
+  EIGEN_STRONG_INLINE Index rows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
+  EIGEN_STRONG_INLINE Index cols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
 
-  protected:
+  inline const SparseMatrixType& nestedExpression() const { return m_matrix; }
+  inline SparseMatrixType& nestedExpression() { return m_matrix; }
+  Index startRow() const { return IsRowMajor ? m_outerStart : 0; }
+  Index startCol() const { return IsRowMajor ? 0 : m_outerStart; }
+  Index blockRows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
+  Index blockCols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
 
-    typename internal::ref_selector<SparseMatrixType>::non_const_type m_matrix;
-    Index m_outerStart;
-    const internal::variable_if_dynamic<Index, OuterSize> m_outerSize;
-
+ protected:
+  typename internal::ref_selector<SparseMatrixType>::non_const_type m_matrix;
+  Index m_outerStart;
+  const internal::variable_if_dynamic<Index, OuterSize> m_outerSize;
 };
 
-} // namespace internal
+}  // namespace internal
 
-template<typename Scalar_, int Options_, typename StorageIndex_, int BlockRows, int BlockCols>
-class BlockImpl<SparseMatrix<Scalar_, Options_, StorageIndex_>,BlockRows,BlockCols,true,Sparse>
-  : public internal::sparse_matrix_block_impl<SparseMatrix<Scalar_, Options_, StorageIndex_>,BlockRows,BlockCols>
-{
-public:
+template <typename Scalar_, int Options_, typename StorageIndex_, int BlockRows, int BlockCols>
+class BlockImpl<SparseMatrix<Scalar_, Options_, StorageIndex_>, BlockRows, BlockCols, true, Sparse>
+    : public internal::sparse_matrix_block_impl<SparseMatrix<Scalar_, Options_, StorageIndex_>, BlockRows, BlockCols> {
+ public:
   typedef StorageIndex_ StorageIndex;
   typedef SparseMatrix<Scalar_, Options_, StorageIndex_> SparseMatrixType;
-  typedef internal::sparse_matrix_block_impl<SparseMatrixType,BlockRows,BlockCols> Base;
-  inline BlockImpl(SparseMatrixType& xpr, Index i)
-    : Base(xpr, i)
-  {}
+  typedef internal::sparse_matrix_block_impl<SparseMatrixType, BlockRows, BlockCols> Base;
+  inline BlockImpl(SparseMatrixType& xpr, Index i) : Base(xpr, i) {}
 
   inline BlockImpl(SparseMatrixType& xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
-    : Base(xpr, startRow, startCol, blockRows, blockCols)
-  {}
+      : Base(xpr, startRow, startCol, blockRows, blockCols) {}
 
   using Base::operator=;
 };
 
-template<typename Scalar_, int Options_, typename StorageIndex_, int BlockRows, int BlockCols>
-class BlockImpl<const SparseMatrix<Scalar_, Options_, StorageIndex_>,BlockRows,BlockCols,true,Sparse>
-  : public internal::sparse_matrix_block_impl<const SparseMatrix<Scalar_, Options_, StorageIndex_>,BlockRows,BlockCols>
-{
-public:
+template <typename Scalar_, int Options_, typename StorageIndex_, int BlockRows, int BlockCols>
+class BlockImpl<const SparseMatrix<Scalar_, Options_, StorageIndex_>, BlockRows, BlockCols, true, Sparse>
+    : public internal::sparse_matrix_block_impl<const SparseMatrix<Scalar_, Options_, StorageIndex_>, BlockRows,
+                                                BlockCols> {
+ public:
   typedef StorageIndex_ StorageIndex;
   typedef const SparseMatrix<Scalar_, Options_, StorageIndex_> SparseMatrixType;
-  typedef internal::sparse_matrix_block_impl<SparseMatrixType,BlockRows,BlockCols> Base;
-  inline BlockImpl(SparseMatrixType& xpr, Index i)
-    : Base(xpr, i)
-  {}
+  typedef internal::sparse_matrix_block_impl<SparseMatrixType, BlockRows, BlockCols> Base;
+  inline BlockImpl(SparseMatrixType& xpr, Index i) : Base(xpr, i) {}
 
   inline BlockImpl(SparseMatrixType& xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
-    : Base(xpr, startRow, startCol, blockRows, blockCols)
-  {}
+      : Base(xpr, startRow, startCol, blockRows, blockCols) {}
 
   using Base::operator=;
-private:
-  template<typename Derived> BlockImpl(const SparseMatrixBase<Derived>& xpr, Index i);
-  template<typename Derived> BlockImpl(const SparseMatrixBase<Derived>& xpr);
+
+ private:
+  template <typename Derived>
+  BlockImpl(const SparseMatrixBase<Derived>& xpr, Index i);
+  template <typename Derived>
+  BlockImpl(const SparseMatrixBase<Derived>& xpr);
 };
 
 //----------
 
 /** Generic implementation of sparse Block expression.
-  * Real-only.
-  */
-template<typename XprType, int BlockRows, int BlockCols, bool InnerPanel>
-class BlockImpl<XprType,BlockRows,BlockCols,InnerPanel,Sparse>
-  : public SparseMatrixBase<Block<XprType,BlockRows,BlockCols,InnerPanel> >, internal::no_assignment_operator
-{
-    typedef Block<XprType, BlockRows, BlockCols, InnerPanel> BlockType;
-    typedef SparseMatrixBase<BlockType> Base;
-    using Base::convert_index;
-public:
-    enum { IsRowMajor = internal::traits<BlockType>::IsRowMajor };
-    EIGEN_SPARSE_PUBLIC_INTERFACE(BlockType)
+ * Real-only.
+ */
+template <typename XprType, int BlockRows, int BlockCols, bool InnerPanel>
+class BlockImpl<XprType, BlockRows, BlockCols, InnerPanel, Sparse>
+    : public SparseMatrixBase<Block<XprType, BlockRows, BlockCols, InnerPanel> >, internal::no_assignment_operator {
+  typedef Block<XprType, BlockRows, BlockCols, InnerPanel> BlockType;
+  typedef SparseMatrixBase<BlockType> Base;
+  using Base::convert_index;
 
-    typedef internal::remove_all_t<typename XprType::Nested> MatrixTypeNested_;
+ public:
+  enum { IsRowMajor = internal::traits<BlockType>::IsRowMajor };
+  EIGEN_SPARSE_PUBLIC_INTERFACE(BlockType)
 
-    /** Column or Row constructor
-      */
-    inline BlockImpl(XprType& xpr, Index i)
+  typedef internal::remove_all_t<typename XprType::Nested> MatrixTypeNested_;
+
+  /** Column or Row constructor
+   */
+  inline BlockImpl(XprType& xpr, Index i)
       : m_matrix(xpr),
-        m_startRow( (BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) ? convert_index(i) : 0),
-        m_startCol( (BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) ? convert_index(i) : 0),
-        m_blockRows(BlockRows==1 ? 1 : xpr.rows()),
-        m_blockCols(BlockCols==1 ? 1 : xpr.cols())
-    {}
+        m_startRow((BlockRows == 1) && (BlockCols == XprType::ColsAtCompileTime) ? convert_index(i) : 0),
+        m_startCol((BlockRows == XprType::RowsAtCompileTime) && (BlockCols == 1) ? convert_index(i) : 0),
+        m_blockRows(BlockRows == 1 ? 1 : xpr.rows()),
+        m_blockCols(BlockCols == 1 ? 1 : xpr.cols()) {}
 
-    /** Dynamic-size constructor
-      */
-    inline BlockImpl(XprType& xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
-      : m_matrix(xpr), m_startRow(convert_index(startRow)), m_startCol(convert_index(startCol)), m_blockRows(convert_index(blockRows)), m_blockCols(convert_index(blockCols))
-    {}
+  /** Dynamic-size constructor
+   */
+  inline BlockImpl(XprType& xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
+      : m_matrix(xpr),
+        m_startRow(convert_index(startRow)),
+        m_startCol(convert_index(startCol)),
+        m_blockRows(convert_index(blockRows)),
+        m_blockCols(convert_index(blockCols)) {}
 
-    inline Index rows() const { return m_blockRows.value(); }
-    inline Index cols() const { return m_blockCols.value(); }
+  inline Index rows() const { return m_blockRows.value(); }
+  inline Index cols() const { return m_blockCols.value(); }
 
-    inline Scalar& coeffRef(Index row, Index col)
-    {
-      return m_matrix.coeffRef(row + m_startRow.value(), col + m_startCol.value());
-    }
+  inline Scalar& coeffRef(Index row, Index col) {
+    return m_matrix.coeffRef(row + m_startRow.value(), col + m_startCol.value());
+  }
 
-    inline const Scalar coeff(Index row, Index col) const
-    {
-      return m_matrix.coeff(row + m_startRow.value(), col + m_startCol.value());
-    }
+  inline const Scalar coeff(Index row, Index col) const {
+    return m_matrix.coeff(row + m_startRow.value(), col + m_startCol.value());
+  }
 
-    inline Scalar& coeffRef(Index index)
-    {
-      return m_matrix.coeffRef(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
-                               m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
-    }
+  inline Scalar& coeffRef(Index index) {
+    return m_matrix.coeffRef(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
+                             m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
+  }
 
-    inline const Scalar coeff(Index index) const
-    {
-      return m_matrix.coeff(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
-                            m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
-    }
+  inline const Scalar coeff(Index index) const {
+    return m_matrix.coeff(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
+                          m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
+  }
 
-    inline const XprType& nestedExpression() const { return m_matrix; }
-    inline XprType& nestedExpression() { return m_matrix; }
-    Index startRow() const { return m_startRow.value(); }
-    Index startCol() const { return m_startCol.value(); }
-    Index blockRows() const { return m_blockRows.value(); }
-    Index blockCols() const { return m_blockCols.value(); }
+  inline const XprType& nestedExpression() const { return m_matrix; }
+  inline XprType& nestedExpression() { return m_matrix; }
+  Index startRow() const { return m_startRow.value(); }
+  Index startCol() const { return m_startCol.value(); }
+  Index blockRows() const { return m_blockRows.value(); }
+  Index blockCols() const { return m_blockCols.value(); }
 
-  protected:
-//     friend class internal::GenericSparseBlockInnerIteratorImpl<XprType,BlockRows,BlockCols,InnerPanel>;
-    friend struct internal::unary_evaluator<Block<XprType,BlockRows,BlockCols,InnerPanel>, internal::IteratorBased, Scalar >;
+ protected:
+  //     friend class internal::GenericSparseBlockInnerIteratorImpl<XprType,BlockRows,BlockCols,InnerPanel>;
+  friend struct internal::unary_evaluator<Block<XprType, BlockRows, BlockCols, InnerPanel>, internal::IteratorBased,
+                                          Scalar>;
 
-    Index nonZeros() const { return Dynamic; }
+  Index nonZeros() const { return Dynamic; }
 
-    typename internal::ref_selector<XprType>::non_const_type m_matrix;
-    const internal::variable_if_dynamic<Index, XprType::RowsAtCompileTime == 1 ? 0 : Dynamic> m_startRow;
-    const internal::variable_if_dynamic<Index, XprType::ColsAtCompileTime == 1 ? 0 : Dynamic> m_startCol;
-    const internal::variable_if_dynamic<Index, RowsAtCompileTime> m_blockRows;
-    const internal::variable_if_dynamic<Index, ColsAtCompileTime> m_blockCols;
+  typename internal::ref_selector<XprType>::non_const_type m_matrix;
+  const internal::variable_if_dynamic<Index, XprType::RowsAtCompileTime == 1 ? 0 : Dynamic> m_startRow;
+  const internal::variable_if_dynamic<Index, XprType::ColsAtCompileTime == 1 ? 0 : Dynamic> m_startCol;
+  const internal::variable_if_dynamic<Index, RowsAtCompileTime> m_blockRows;
+  const internal::variable_if_dynamic<Index, ColsAtCompileTime> m_blockCols;
 
-  protected:
-    // Disable assignment with clear error message.
-    // Note that simply removing operator= yields compilation errors with ICC+MSVC
-    template<typename T>
-    BlockImpl& operator=(const T&)
-    {
-      EIGEN_STATIC_ASSERT(sizeof(T)==0, THIS_SPARSE_BLOCK_SUBEXPRESSION_IS_READ_ONLY);
-      return *this;
-    }
-
+ protected:
+  // Disable assignment with clear error message.
+  // Note that simply removing operator= yields compilation errors with ICC+MSVC
+  template <typename T>
+  BlockImpl& operator=(const T&) {
+    EIGEN_STATIC_ASSERT(sizeof(T) == 0, THIS_SPARSE_BLOCK_SUBEXPRESSION_IS_READ_ONLY);
+    return *this;
+  }
 };
 
 namespace internal {
 
-template<typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
-struct unary_evaluator<Block<ArgType,BlockRows,BlockCols,InnerPanel>, IteratorBased >
- : public evaluator_base<Block<ArgType,BlockRows,BlockCols,InnerPanel> >
-{
-    class InnerVectorInnerIterator;
-    class OuterVectorInnerIterator;
-  public:
-    typedef Block<ArgType,BlockRows,BlockCols,InnerPanel> XprType;
-    typedef typename XprType::StorageIndex StorageIndex;
-    typedef typename XprType::Scalar Scalar;
+template <typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
+struct unary_evaluator<Block<ArgType, BlockRows, BlockCols, InnerPanel>, IteratorBased>
+    : public evaluator_base<Block<ArgType, BlockRows, BlockCols, InnerPanel> > {
+  class InnerVectorInnerIterator;
+  class OuterVectorInnerIterator;
 
-    enum {
-      IsRowMajor = XprType::IsRowMajor,
-      OuterVector = (BlockCols == 1 && ArgType::IsRowMajor) || (BlockRows == 1 && !ArgType::IsRowMajor),
-      CoeffReadCost = evaluator<ArgType>::CoeffReadCost,
-      Flags = XprType::Flags
-    };
+ public:
+  typedef Block<ArgType, BlockRows, BlockCols, InnerPanel> XprType;
+  typedef typename XprType::StorageIndex StorageIndex;
+  typedef typename XprType::Scalar Scalar;
 
-    typedef std::conditional_t<OuterVector,OuterVectorInnerIterator,InnerVectorInnerIterator> InnerIterator;
+  enum {
+    IsRowMajor = XprType::IsRowMajor,
+    OuterVector = (BlockCols == 1 && ArgType::IsRowMajor) || (BlockRows == 1 && !ArgType::IsRowMajor),
+    CoeffReadCost = evaluator<ArgType>::CoeffReadCost,
+    Flags = XprType::Flags
+  };
 
-    explicit unary_evaluator(const XprType& op)
-      : m_argImpl(op.nestedExpression()), m_block(op)
-    {}
+  typedef std::conditional_t<OuterVector, OuterVectorInnerIterator, InnerVectorInnerIterator> InnerIterator;
 
-    inline Index nonZerosEstimate() const {
-      const Index nnz = m_block.nonZeros();
-      if(nnz < 0) {
-        // Scale the non-zero estimate for the underlying expression linearly with block size.
-        // Return zero if the underlying block is empty.
-        const Index nested_sz = m_block.nestedExpression().size();        
-        return nested_sz == 0 ? 0 : m_argImpl.nonZerosEstimate() * m_block.size() / nested_sz;
-      }
-      return nnz;
+  explicit unary_evaluator(const XprType& op) : m_argImpl(op.nestedExpression()), m_block(op) {}
+
+  inline Index nonZerosEstimate() const {
+    const Index nnz = m_block.nonZeros();
+    if (nnz < 0) {
+      // Scale the non-zero estimate for the underlying expression linearly with block size.
+      // Return zero if the underlying block is empty.
+      const Index nested_sz = m_block.nestedExpression().size();
+      return nested_sz == 0 ? 0 : m_argImpl.nonZerosEstimate() * m_block.size() / nested_sz;
     }
+    return nnz;
+  }
 
-  protected:
-    typedef typename evaluator<ArgType>::InnerIterator EvalIterator;
+ protected:
+  typedef typename evaluator<ArgType>::InnerIterator EvalIterator;
 
-    evaluator<ArgType> m_argImpl;
-    const XprType &m_block;
+  evaluator<ArgType> m_argImpl;
+  const XprType& m_block;
 };
 
-template<typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
-class unary_evaluator<Block<ArgType,BlockRows,BlockCols,InnerPanel>, IteratorBased>::InnerVectorInnerIterator
- : public EvalIterator
-{
+template <typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
+class unary_evaluator<Block<ArgType, BlockRows, BlockCols, InnerPanel>, IteratorBased>::InnerVectorInnerIterator
+    : public EvalIterator {
   // NOTE MSVC fails to compile if we don't explicitly "import" IsRowMajor from unary_evaluator
   //      because the base class EvalIterator has a private IsRowMajor enum too. (bug #1786)
   // NOTE We cannot call it IsRowMajor because it would shadow unary_evaluator::IsRowMajor
   enum { XprIsRowMajor = unary_evaluator::IsRowMajor };
   const XprType& m_block;
   Index m_end;
-public:
 
+ public:
   EIGEN_STRONG_INLINE InnerVectorInnerIterator(const unary_evaluator& aEval, Index outer)
-    : EvalIterator(aEval.m_argImpl, outer + (XprIsRowMajor ? aEval.m_block.startRow() : aEval.m_block.startCol())),
-      m_block(aEval.m_block),
-      m_end(XprIsRowMajor ? aEval.m_block.startCol()+aEval.m_block.blockCols() : aEval.m_block.startRow()+aEval.m_block.blockRows())
-  {
-    while( (EvalIterator::operator bool()) && (EvalIterator::index() < (XprIsRowMajor ? m_block.startCol() : m_block.startRow())) )
+      : EvalIterator(aEval.m_argImpl, outer + (XprIsRowMajor ? aEval.m_block.startRow() : aEval.m_block.startCol())),
+        m_block(aEval.m_block),
+        m_end(XprIsRowMajor ? aEval.m_block.startCol() + aEval.m_block.blockCols()
+                            : aEval.m_block.startRow() + aEval.m_block.blockRows()) {
+    while ((EvalIterator::operator bool()) &&
+           (EvalIterator::index() < (XprIsRowMajor ? m_block.startCol() : m_block.startRow())))
       EvalIterator::operator++();
   }
 
-  inline StorageIndex index() const { return EvalIterator::index() - convert_index<StorageIndex>(XprIsRowMajor ? m_block.startCol() : m_block.startRow()); }
-  inline Index outer()  const { return EvalIterator::outer() - (XprIsRowMajor ? m_block.startRow() : m_block.startCol()); }
-  inline Index row()    const { return EvalIterator::row()   - m_block.startRow(); }
-  inline Index col()    const { return EvalIterator::col()   - m_block.startCol(); }
+  inline StorageIndex index() const {
+    return EvalIterator::index() - convert_index<StorageIndex>(XprIsRowMajor ? m_block.startCol() : m_block.startRow());
+  }
+  inline Index outer() const {
+    return EvalIterator::outer() - (XprIsRowMajor ? m_block.startRow() : m_block.startCol());
+  }
+  inline Index row() const { return EvalIterator::row() - m_block.startRow(); }
+  inline Index col() const { return EvalIterator::col() - m_block.startCol(); }
 
   inline operator bool() const { return EvalIterator::operator bool() && EvalIterator::index() < m_end; }
 };
 
-template<typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
-class unary_evaluator<Block<ArgType,BlockRows,BlockCols,InnerPanel>, IteratorBased>::OuterVectorInnerIterator
-{
+template <typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
+class unary_evaluator<Block<ArgType, BlockRows, BlockCols, InnerPanel>, IteratorBased>::OuterVectorInnerIterator {
   // NOTE see above
   enum { XprIsRowMajor = unary_evaluator::IsRowMajor };
   const unary_evaluator& m_eval;
@@ -500,42 +465,42 @@
   const Index m_innerIndex;
   Index m_end;
   EvalIterator m_it;
-public:
 
+ public:
   EIGEN_STRONG_INLINE OuterVectorInnerIterator(const unary_evaluator& aEval, Index outer)
-    : m_eval(aEval),
-      m_outerPos( (XprIsRowMajor ? aEval.m_block.startCol() : aEval.m_block.startRow()) ),
-      m_innerIndex(XprIsRowMajor ? aEval.m_block.startRow() : aEval.m_block.startCol()),
-      m_end(XprIsRowMajor ? aEval.m_block.startCol()+aEval.m_block.blockCols() : aEval.m_block.startRow()+aEval.m_block.blockRows()),
-      m_it(m_eval.m_argImpl, m_outerPos)
-  {
+      : m_eval(aEval),
+        m_outerPos((XprIsRowMajor ? aEval.m_block.startCol() : aEval.m_block.startRow())),
+        m_innerIndex(XprIsRowMajor ? aEval.m_block.startRow() : aEval.m_block.startCol()),
+        m_end(XprIsRowMajor ? aEval.m_block.startCol() + aEval.m_block.blockCols()
+                            : aEval.m_block.startRow() + aEval.m_block.blockRows()),
+        m_it(m_eval.m_argImpl, m_outerPos) {
     EIGEN_UNUSED_VARIABLE(outer);
-    eigen_assert(outer==0);
+    eigen_assert(outer == 0);
 
-    while(m_it && m_it.index() < m_innerIndex) ++m_it;
-    if((!m_it) || (m_it.index()!=m_innerIndex))
-      ++(*this);
+    while (m_it && m_it.index() < m_innerIndex) ++m_it;
+    if ((!m_it) || (m_it.index() != m_innerIndex)) ++(*this);
   }
 
-  inline StorageIndex index() const { return convert_index<StorageIndex>(m_outerPos - (XprIsRowMajor ? m_eval.m_block.startCol() : m_eval.m_block.startRow())); }
-  inline Index outer()  const { return 0; }
-  inline Index row()    const { return XprIsRowMajor ? 0 : index(); }
-  inline Index col()    const { return XprIsRowMajor ? index() : 0; }
+  inline StorageIndex index() const {
+    return convert_index<StorageIndex>(m_outerPos -
+                                       (XprIsRowMajor ? m_eval.m_block.startCol() : m_eval.m_block.startRow()));
+  }
+  inline Index outer() const { return 0; }
+  inline Index row() const { return XprIsRowMajor ? 0 : index(); }
+  inline Index col() const { return XprIsRowMajor ? index() : 0; }
 
   inline Scalar value() const { return m_it.value(); }
   inline Scalar& valueRef() { return m_it.valueRef(); }
 
-  inline OuterVectorInnerIterator& operator++()
-  {
+  inline OuterVectorInnerIterator& operator++() {
     // search next non-zero entry
-    while(++m_outerPos<m_end)
-    {
+    while (++m_outerPos < m_end) {
       // Restart iterator at the next inner-vector:
       internal::destroy_at(&m_it);
       internal::construct_at(&m_it, m_eval.m_argImpl, m_outerPos);
       // search for the key m_innerIndex in the current outer-vector
-      while(m_it && m_it.index() < m_innerIndex) ++m_it;
-      if(m_it && m_it.index()==m_innerIndex) break;
+      while (m_it && m_it.index() < m_innerIndex) ++m_it;
+      if (m_it && m_it.index() == m_innerIndex) break;
     }
     return *this;
   }
@@ -543,27 +508,27 @@
   inline operator bool() const { return m_outerPos < m_end; }
 };
 
-template<typename Scalar_, int Options_, typename StorageIndex_, int BlockRows, int BlockCols>
-struct unary_evaluator<Block<SparseMatrix<Scalar_, Options_, StorageIndex_>,BlockRows,BlockCols,true>, IteratorBased>
-  : evaluator<SparseCompressedBase<Block<SparseMatrix<Scalar_, Options_, StorageIndex_>,BlockRows,BlockCols,true> > >
-{
-  typedef Block<SparseMatrix<Scalar_, Options_, StorageIndex_>,BlockRows,BlockCols,true> XprType;
+template <typename Scalar_, int Options_, typename StorageIndex_, int BlockRows, int BlockCols>
+struct unary_evaluator<Block<SparseMatrix<Scalar_, Options_, StorageIndex_>, BlockRows, BlockCols, true>, IteratorBased>
+    : evaluator<
+          SparseCompressedBase<Block<SparseMatrix<Scalar_, Options_, StorageIndex_>, BlockRows, BlockCols, true> > > {
+  typedef Block<SparseMatrix<Scalar_, Options_, StorageIndex_>, BlockRows, BlockCols, true> XprType;
   typedef evaluator<SparseCompressedBase<XprType> > Base;
-  explicit unary_evaluator(const XprType &xpr) : Base(xpr) {}
+  explicit unary_evaluator(const XprType& xpr) : Base(xpr) {}
 };
 
-template<typename Scalar_, int Options_, typename StorageIndex_, int BlockRows, int BlockCols>
-struct unary_evaluator<Block<const SparseMatrix<Scalar_, Options_, StorageIndex_>,BlockRows,BlockCols,true>, IteratorBased>
-  : evaluator<SparseCompressedBase<Block<const SparseMatrix<Scalar_, Options_, StorageIndex_>,BlockRows,BlockCols,true> > >
-{
-  typedef Block<const SparseMatrix<Scalar_, Options_, StorageIndex_>,BlockRows,BlockCols,true> XprType;
+template <typename Scalar_, int Options_, typename StorageIndex_, int BlockRows, int BlockCols>
+struct unary_evaluator<Block<const SparseMatrix<Scalar_, Options_, StorageIndex_>, BlockRows, BlockCols, true>,
+                       IteratorBased>
+    : evaluator<SparseCompressedBase<
+          Block<const SparseMatrix<Scalar_, Options_, StorageIndex_>, BlockRows, BlockCols, true> > > {
+  typedef Block<const SparseMatrix<Scalar_, Options_, StorageIndex_>, BlockRows, BlockCols, true> XprType;
   typedef evaluator<SparseCompressedBase<XprType> > Base;
-  explicit unary_evaluator(const XprType &xpr) : Base(xpr) {}
+  explicit unary_evaluator(const XprType& xpr) : Base(xpr) {}
 };
 
-} // end namespace internal
+}  // end namespace internal
 
+}  // end namespace Eigen
 
-} // end namespace Eigen
-
-#endif // EIGEN_SPARSE_BLOCK_H
+#endif  // EIGEN_SPARSE_BLOCK_H
diff --git a/Eigen/src/SparseCore/SparseColEtree.h b/Eigen/src/SparseCore/SparseColEtree.h
index 7cead04..76575c9 100644
--- a/Eigen/src/SparseCore/SparseColEtree.h
+++ b/Eigen/src/SparseCore/SparseColEtree.h
@@ -7,11 +7,10 @@
 // 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/.
 
+/*
 
-/* 
- 
- * NOTE: This file is the modified version of sp_coletree.c file in SuperLU 
- 
+ * NOTE: This file is the modified version of sp_coletree.c file in SuperLU
+
  * -- SuperLU routine (version 3.1) --
  * Univ. of California Berkeley, Xerox Palo Alto Research Center,
  * and Lawrence Berkeley National Lab.
@@ -38,51 +37,47 @@
 
 namespace internal {
 
-/** Find the root of the tree/set containing the vertex i : Use Path halving */ 
-template<typename Index, typename IndexVector>
-Index etree_find (Index i, IndexVector& pp)
-{
-  Index p = pp(i); // Parent 
-  Index gp = pp(p); // Grand parent 
-  while (gp != p) 
-  {
-    pp(i) = gp; // Parent pointer on find path is changed to former grand parent
-    i = gp; 
+/** Find the root of the tree/set containing the vertex i : Use Path halving */
+template <typename Index, typename IndexVector>
+Index etree_find(Index i, IndexVector& pp) {
+  Index p = pp(i);   // Parent
+  Index gp = pp(p);  // Grand parent
+  while (gp != p) {
+    pp(i) = gp;  // Parent pointer on find path is changed to former grand parent
+    i = gp;
     p = pp(i);
     gp = pp(p);
   }
-  return p; 
+  return p;
 }
 
 /** Compute the column elimination tree of a sparse matrix
-  * \param mat The matrix in column-major format. 
-  * \param parent The elimination tree
-  * \param firstRowElt The column index of the first element in each row
-  * \param perm The permutation to apply to the column of \b mat
-  */
+ * \param mat The matrix in column-major format.
+ * \param parent The elimination tree
+ * \param firstRowElt The column index of the first element in each row
+ * \param perm The permutation to apply to the column of \b mat
+ */
 template <typename MatrixType, typename IndexVector>
-int coletree(const MatrixType& mat, IndexVector& parent, IndexVector& firstRowElt, typename MatrixType::StorageIndex *perm=0)
-{
+int coletree(const MatrixType& mat, IndexVector& parent, IndexVector& firstRowElt,
+             typename MatrixType::StorageIndex* perm = 0) {
   typedef typename MatrixType::StorageIndex StorageIndex;
-  StorageIndex nc = convert_index<StorageIndex>(mat.cols()); // Number of columns
+  StorageIndex nc = convert_index<StorageIndex>(mat.cols());  // Number of columns
   StorageIndex m = convert_index<StorageIndex>(mat.rows());
-  StorageIndex diagSize = (std::min)(nc,m);
-  IndexVector root(nc); // root of subtree of etree 
+  StorageIndex diagSize = (std::min)(nc, m);
+  IndexVector root(nc);  // root of subtree of etree
   root.setZero();
-  IndexVector pp(nc); // disjoint sets 
-  pp.setZero(); // Initialize disjoint sets 
+  IndexVector pp(nc);  // disjoint sets
+  pp.setZero();        // Initialize disjoint sets
   parent.resize(mat.cols());
-  //Compute first nonzero column in each row 
+  // Compute first nonzero column in each row
   firstRowElt.resize(m);
   firstRowElt.setConstant(nc);
-  firstRowElt.segment(0, diagSize).setLinSpaced(diagSize, 0, diagSize-1);
+  firstRowElt.segment(0, diagSize).setLinSpaced(diagSize, 0, diagSize - 1);
   bool found_diag;
-  for (StorageIndex col = 0; col < nc; col++)
-  {
+  for (StorageIndex col = 0; col < nc; col++) {
     StorageIndex pcol = col;
-    if(perm) pcol  = perm[col];
-    for (typename MatrixType::InnerIterator it(mat, pcol); it; ++it)
-    { 
+    if (perm) pcol = perm[col];
+    for (typename MatrixType::InnerIterator it(mat, pcol); it; ++it) {
       Index row = it.row();
       firstRowElt(row) = (std::min)(firstRowElt(row), col);
     }
@@ -92,118 +87,108 @@
     Thus each row clique in A'*A is replaced by a star
     centered at its first vertex, which has the same fill. */
   StorageIndex rset, cset, rroot;
-  for (StorageIndex col = 0; col < nc; col++) 
-  {
-    found_diag = col>=m;
-    pp(col) = col; 
-    cset = col; 
-    root(cset) = col; 
-    parent(col) = nc; 
+  for (StorageIndex col = 0; col < nc; col++) {
+    found_diag = col >= m;
+    pp(col) = col;
+    cset = col;
+    root(cset) = col;
+    parent(col) = nc;
     /* The diagonal element is treated here even if it does not exist in the matrix
-     * hence the loop is executed once more */ 
+     * hence the loop is executed once more */
     StorageIndex pcol = col;
-    if(perm) pcol  = perm[col];
-    for (typename MatrixType::InnerIterator it(mat, pcol); it||!found_diag; ++it)
-    { //  A sequence of interleaved find and union is performed 
+    if (perm) pcol = perm[col];
+    for (typename MatrixType::InnerIterator it(mat, pcol); it || !found_diag;
+         ++it) {  //  A sequence of interleaved find and union is performed
       Index i = col;
-      if(it) i = it.index();
+      if (it) i = it.index();
       if (i == col) found_diag = true;
-      
+
       StorageIndex row = firstRowElt(i);
-      if (row >= col) continue; 
-      rset = internal::etree_find(row, pp); // Find the name of the set containing row
+      if (row >= col) continue;
+      rset = internal::etree_find(row, pp);  // Find the name of the set containing row
       rroot = root(rset);
-      if (rroot != col) 
-      {
-        parent(rroot) = col; 
-        pp(cset) = rset; 
-        cset = rset; 
-        root(cset) = col; 
+      if (rroot != col) {
+        parent(rroot) = col;
+        pp(cset) = rset;
+        cset = rset;
+        root(cset) = col;
       }
     }
   }
-  return 0;  
+  return 0;
 }
 
-/** 
-  * Depth-first search from vertex n.  No recursion.
-  * This routine was contributed by Cédric Doucet, CEDRAT Group, Meylan, France.
-*/
-template <typename IndexVector>
-void nr_etdfs (typename IndexVector::Scalar n, IndexVector& parent, IndexVector& first_kid, IndexVector& next_kid, IndexVector& post, typename IndexVector::Scalar postnum)
-{
-  typedef typename IndexVector::Scalar StorageIndex;
-  StorageIndex current = n, first, next;
-  while (postnum != n) 
-  {
-    // No kid for the current node
-    first = first_kid(current);
-    
-    // no kid for the current node
-    if (first == -1) 
-    {
-      // Numbering this node because it has no kid 
-      post(current) = postnum++;
-      
-      // looking for the next kid 
-      next = next_kid(current); 
-      while (next == -1) 
-      {
-        // No more kids : back to the parent node
-        current = parent(current); 
-        // numbering the parent node 
-        post(current) = postnum++;
-        
-        // Get the next kid 
-        next = next_kid(current); 
-      }
-      // stopping criterion 
-      if (postnum == n+1) return; 
-      
-      // Updating current node 
-      current = next; 
-    }
-    else 
-    {
-      current = first; 
-    }
-  }
-}
-
-
 /**
-  * \brief Post order a tree 
-  * \param n the number of nodes
-  * \param parent Input tree
-  * \param post postordered tree
-  */
+ * Depth-first search from vertex n.  No recursion.
+ * This routine was contributed by Cédric Doucet, CEDRAT Group, Meylan, France.
+ */
 template <typename IndexVector>
-void treePostorder(typename IndexVector::Scalar n, IndexVector& parent, IndexVector& post)
-{
+void nr_etdfs(typename IndexVector::Scalar n, IndexVector& parent, IndexVector& first_kid, IndexVector& next_kid,
+              IndexVector& post, typename IndexVector::Scalar postnum) {
   typedef typename IndexVector::Scalar StorageIndex;
-  IndexVector first_kid, next_kid; // Linked list of children 
-  StorageIndex postnum; 
-  // Allocate storage for working arrays and results 
-  first_kid.resize(n+1); 
-  next_kid.setZero(n+1);
-  post.setZero(n+1);
-  
-  // Set up structure describing children
-  first_kid.setConstant(-1); 
-  for (StorageIndex v = n-1; v >= 0; v--) 
-  {
-    StorageIndex dad = parent(v);
-    next_kid(v) = first_kid(dad); 
-    first_kid(dad) = v; 
+  StorageIndex current = n, first, next;
+  while (postnum != n) {
+    // No kid for the current node
+    first = first_kid(current);
+
+    // no kid for the current node
+    if (first == -1) {
+      // Numbering this node because it has no kid
+      post(current) = postnum++;
+
+      // looking for the next kid
+      next = next_kid(current);
+      while (next == -1) {
+        // No more kids : back to the parent node
+        current = parent(current);
+        // numbering the parent node
+        post(current) = postnum++;
+
+        // Get the next kid
+        next = next_kid(current);
+      }
+      // stopping criterion
+      if (postnum == n + 1) return;
+
+      // Updating current node
+      current = next;
+    } else {
+      current = first;
+    }
   }
-  
+}
+
+/**
+ * \brief Post order a tree
+ * \param n the number of nodes
+ * \param parent Input tree
+ * \param post postordered tree
+ */
+template <typename IndexVector>
+void treePostorder(typename IndexVector::Scalar n, IndexVector& parent, IndexVector& post) {
+  typedef typename IndexVector::Scalar StorageIndex;
+  IndexVector first_kid, next_kid;  // Linked list of children
+  StorageIndex postnum;
+  // Allocate storage for working arrays and results
+  first_kid.resize(n + 1);
+  next_kid.setZero(n + 1);
+  post.setZero(n + 1);
+
+  // Set up structure describing children
+  first_kid.setConstant(-1);
+  for (StorageIndex v = n - 1; v >= 0; v--) {
+    StorageIndex dad = parent(v);
+    next_kid(v) = first_kid(dad);
+    first_kid(dad) = v;
+  }
+
   // Depth-first search from dummy root vertex #n
-  postnum = 0; 
+  postnum = 0;
   internal::nr_etdfs(n, parent, first_kid, next_kid, post, postnum);
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // SPARSE_COLETREE_H
+#endif  // SPARSE_COLETREE_H
diff --git a/Eigen/src/SparseCore/SparseCompressedBase.h b/Eigen/src/SparseCore/SparseCompressedBase.h
index c28cc95..c168283 100644
--- a/Eigen/src/SparseCore/SparseCompressedBase.h
+++ b/Eigen/src/SparseCore/SparseCompressedBase.h
@@ -13,333 +13,340 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
-template<typename Derived> class SparseCompressedBase;
-  
+template <typename Derived>
+class SparseCompressedBase;
+
 namespace internal {
 
-template<typename Derived>
-struct traits<SparseCompressedBase<Derived> > : traits<Derived>
-{};
+template <typename Derived>
+struct traits<SparseCompressedBase<Derived>> : traits<Derived> {};
 
 template <typename Derived, class Comp, bool IsVector>
 struct inner_sort_impl;
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \ingroup SparseCore_Module
-  * \class SparseCompressedBase
-  * \brief Common base class for sparse [compressed]-{row|column}-storage format.
-  *
-  * This class defines the common interface for all derived classes implementing the compressed sparse storage format, such as:
-  *  - SparseMatrix
-  *  - Ref<SparseMatrixType,Options>
-  *  - Map<SparseMatrixType>
-  *
-  */
-template<typename Derived>
-class SparseCompressedBase
-  : public SparseMatrixBase<Derived>
-{
-  public:
-    typedef SparseMatrixBase<Derived> Base;
-    EIGEN_SPARSE_PUBLIC_INTERFACE(SparseCompressedBase)
-    using Base::operator=;
-    using Base::IsRowMajor;
-    
-    class InnerIterator;
-    class ReverseInnerIterator;
-    
-  protected:
-    typedef typename Base::IndexVector IndexVector;
-    Eigen::Map<IndexVector> innerNonZeros() { return Eigen::Map<IndexVector>(innerNonZeroPtr(), isCompressed()?0:derived().outerSize()); }
-    const  Eigen::Map<const IndexVector> innerNonZeros() const { return Eigen::Map<const IndexVector>(innerNonZeroPtr(), isCompressed()?0:derived().outerSize()); }
-        
-  public:
-    
-    /** \returns the number of non zero coefficients */
-    inline Index nonZeros() const
-    {
-     if (Derived::IsVectorAtCompileTime && outerIndexPtr() == 0)
-       return derived().nonZeros();
-     else if (derived().outerSize() == 0)
-       return 0;
-     else if (isCompressed())
-       return outerIndexPtr()[derived().outerSize()] - outerIndexPtr()[0];
-     else
-       return innerNonZeros().sum();
-    }
-    
-    /** \returns a const pointer to the array of values.
-      * This function is aimed at interoperability with other libraries.
-      * \sa innerIndexPtr(), outerIndexPtr() */
-    inline const Scalar* valuePtr() const { return derived().valuePtr(); }
-    /** \returns a non-const pointer to the array of values.
-      * This function is aimed at interoperability with other libraries.
-      * \sa innerIndexPtr(), outerIndexPtr() */
-    inline Scalar* valuePtr() { return derived().valuePtr(); }
+ * \class SparseCompressedBase
+ * \brief Common base class for sparse [compressed]-{row|column}-storage format.
+ *
+ * This class defines the common interface for all derived classes implementing the compressed sparse storage format,
+ * such as:
+ *  - SparseMatrix
+ *  - Ref<SparseMatrixType,Options>
+ *  - Map<SparseMatrixType>
+ *
+ */
+template <typename Derived>
+class SparseCompressedBase : public SparseMatrixBase<Derived> {
+ public:
+  typedef SparseMatrixBase<Derived> Base;
+  EIGEN_SPARSE_PUBLIC_INTERFACE(SparseCompressedBase)
+  using Base::operator=;
+  using Base::IsRowMajor;
 
-    /** \returns a const pointer to the array of inner indices.
-      * This function is aimed at interoperability with other libraries.
-      * \sa valuePtr(), outerIndexPtr() */
-    inline const StorageIndex* innerIndexPtr() const { return derived().innerIndexPtr(); }
-    /** \returns a non-const pointer to the array of inner indices.
-      * This function is aimed at interoperability with other libraries.
-      * \sa valuePtr(), outerIndexPtr() */
-    inline StorageIndex* innerIndexPtr() { return derived().innerIndexPtr(); }
+  class InnerIterator;
+  class ReverseInnerIterator;
 
-    /** \returns a const pointer to the array of the starting positions of the inner vectors.
-      * This function is aimed at interoperability with other libraries.
-      * \warning it returns the null pointer 0 for SparseVector
-      * \sa valuePtr(), innerIndexPtr() */
-    inline const StorageIndex* outerIndexPtr() const { return derived().outerIndexPtr(); }
-    /** \returns a non-const pointer to the array of the starting positions of the inner vectors.
-      * This function is aimed at interoperability with other libraries.
-      * \warning it returns the null pointer 0 for SparseVector
-      * \sa valuePtr(), innerIndexPtr() */
-    inline StorageIndex* outerIndexPtr() { return derived().outerIndexPtr(); }
+ protected:
+  typedef typename Base::IndexVector IndexVector;
+  Eigen::Map<IndexVector> innerNonZeros() {
+    return Eigen::Map<IndexVector>(innerNonZeroPtr(), isCompressed() ? 0 : derived().outerSize());
+  }
+  const Eigen::Map<const IndexVector> innerNonZeros() const {
+    return Eigen::Map<const IndexVector>(innerNonZeroPtr(), isCompressed() ? 0 : derived().outerSize());
+  }
 
-    /** \returns a const pointer to the array of the number of non zeros of the inner vectors.
-      * This function is aimed at interoperability with other libraries.
-      * \warning it returns the null pointer 0 in compressed mode */
-    inline const StorageIndex* innerNonZeroPtr() const { return derived().innerNonZeroPtr(); }
-    /** \returns a non-const pointer to the array of the number of non zeros of the inner vectors.
-      * This function is aimed at interoperability with other libraries.
-      * \warning it returns the null pointer 0 in compressed mode */
-    inline StorageIndex* innerNonZeroPtr() { return derived().innerNonZeroPtr(); }
-    
-    /** \returns whether \c *this is in compressed form. */
-    inline bool isCompressed() const { return innerNonZeroPtr()==0; }
+ public:
+  /** \returns the number of non zero coefficients */
+  inline Index nonZeros() const {
+    if (Derived::IsVectorAtCompileTime && outerIndexPtr() == 0)
+      return derived().nonZeros();
+    else if (derived().outerSize() == 0)
+      return 0;
+    else if (isCompressed())
+      return outerIndexPtr()[derived().outerSize()] - outerIndexPtr()[0];
+    else
+      return innerNonZeros().sum();
+  }
 
-    /** \returns a read-only view of the stored coefficients as a 1D array expression.
-      *
-      * \warning this method is for \b compressed \b storage \b only, and it will trigger an assertion otherwise.
-      *
-      * \sa valuePtr(), isCompressed() */
-    const Map<const Array<Scalar,Dynamic,1> > coeffs() const { eigen_assert(isCompressed()); return Array<Scalar,Dynamic,1>::Map(valuePtr(),nonZeros()); }
+  /** \returns a const pointer to the array of values.
+   * This function is aimed at interoperability with other libraries.
+   * \sa innerIndexPtr(), outerIndexPtr() */
+  inline const Scalar* valuePtr() const { return derived().valuePtr(); }
+  /** \returns a non-const pointer to the array of values.
+   * This function is aimed at interoperability with other libraries.
+   * \sa innerIndexPtr(), outerIndexPtr() */
+  inline Scalar* valuePtr() { return derived().valuePtr(); }
 
-    /** \returns a read-write view of the stored coefficients as a 1D array expression
-      *
-      * \warning this method is for \b compressed \b storage \b only, and it will trigger an assertion otherwise.
-      *
-      * Here is an example:
-      * \include SparseMatrix_coeffs.cpp
-      * and the output is:
-      * \include SparseMatrix_coeffs.out
-      *
-      * \sa valuePtr(), isCompressed() */
-    Map<Array<Scalar,Dynamic,1> > coeffs() { eigen_assert(isCompressed()); return Array<Scalar,Dynamic,1>::Map(valuePtr(),nonZeros()); }
-    
-    /** sorts the inner vectors in the range [begin,end) with respect to `Comp`  
-      * \sa innerIndicesAreSorted() */
-    template <class Comp = std::less<>>
-    inline void sortInnerIndices(Index begin, Index end) {
-      eigen_assert(begin >= 0 && end <= derived().outerSize() && end >= begin);
-      internal::inner_sort_impl<Derived, Comp, IsVectorAtCompileTime>::run(*this, begin, end);
-    }
-    
-    /** \returns the index of the first inner vector in the range [begin,end) that is not sorted with respect to `Comp`, or `end` if the range is fully sorted
-      * \sa sortInnerIndices() */
-    template <class Comp = std::less<>>
-    inline Index innerIndicesAreSorted(Index begin, Index end) const {
-      eigen_assert(begin >= 0 && end <= derived().outerSize() && end >= begin);
-      return internal::inner_sort_impl<Derived, Comp, IsVectorAtCompileTime>::check(*this, begin, end);
-    }
+  /** \returns a const pointer to the array of inner indices.
+   * This function is aimed at interoperability with other libraries.
+   * \sa valuePtr(), outerIndexPtr() */
+  inline const StorageIndex* innerIndexPtr() const { return derived().innerIndexPtr(); }
+  /** \returns a non-const pointer to the array of inner indices.
+   * This function is aimed at interoperability with other libraries.
+   * \sa valuePtr(), outerIndexPtr() */
+  inline StorageIndex* innerIndexPtr() { return derived().innerIndexPtr(); }
 
-    /** sorts the inner vectors in the range [0,outerSize) with respect to `Comp`
-      * \sa innerIndicesAreSorted() */
-    template <class Comp = std::less<>>
-    inline void sortInnerIndices() {
-      Index begin = 0;
-      Index end = derived().outerSize();
-      internal::inner_sort_impl<Derived, Comp, IsVectorAtCompileTime>::run(*this, begin, end);
-    }
+  /** \returns a const pointer to the array of the starting positions of the inner vectors.
+   * This function is aimed at interoperability with other libraries.
+   * \warning it returns the null pointer 0 for SparseVector
+   * \sa valuePtr(), innerIndexPtr() */
+  inline const StorageIndex* outerIndexPtr() const { return derived().outerIndexPtr(); }
+  /** \returns a non-const pointer to the array of the starting positions of the inner vectors.
+   * This function is aimed at interoperability with other libraries.
+   * \warning it returns the null pointer 0 for SparseVector
+   * \sa valuePtr(), innerIndexPtr() */
+  inline StorageIndex* outerIndexPtr() { return derived().outerIndexPtr(); }
 
-    /** \returns the index of the first inner vector in the range [0,outerSize) that is not sorted with respect to `Comp`, or `outerSize` if the range is fully sorted
-      * \sa sortInnerIndices() */
-    template<class Comp = std::less<>>
-    inline Index innerIndicesAreSorted() const {
-      Index begin = 0;
-      Index end = derived().outerSize();
-      return internal::inner_sort_impl<Derived, Comp, IsVectorAtCompileTime>::check(*this, begin, end);
-    }
+  /** \returns a const pointer to the array of the number of non zeros of the inner vectors.
+   * This function is aimed at interoperability with other libraries.
+   * \warning it returns the null pointer 0 in compressed mode */
+  inline const StorageIndex* innerNonZeroPtr() const { return derived().innerNonZeroPtr(); }
+  /** \returns a non-const pointer to the array of the number of non zeros of the inner vectors.
+   * This function is aimed at interoperability with other libraries.
+   * \warning it returns the null pointer 0 in compressed mode */
+  inline StorageIndex* innerNonZeroPtr() { return derived().innerNonZeroPtr(); }
 
-  protected:
-    /** Default constructor. Do nothing. */
-    SparseCompressedBase() {}
+  /** \returns whether \c *this is in compressed form. */
+  inline bool isCompressed() const { return innerNonZeroPtr() == 0; }
 
-    /** \internal return the index of the coeff at (row,col) or just before if it does not exist.
-      * This is an analogue of std::lower_bound.
-      */
-    internal::LowerBoundIndex lower_bound(Index row, Index col) const
-    {
-      eigen_internal_assert(row>=0 && row<this->rows() && col>=0 && col<this->cols());
+  /** \returns a read-only view of the stored coefficients as a 1D array expression.
+   *
+   * \warning this method is for \b compressed \b storage \b only, and it will trigger an assertion otherwise.
+   *
+   * \sa valuePtr(), isCompressed() */
+  const Map<const Array<Scalar, Dynamic, 1>> coeffs() const {
+    eigen_assert(isCompressed());
+    return Array<Scalar, Dynamic, 1>::Map(valuePtr(), nonZeros());
+  }
 
-      const Index outer = Derived::IsRowMajor ? row : col;
-      const Index inner = Derived::IsRowMajor ? col : row;
+  /** \returns a read-write view of the stored coefficients as a 1D array expression
+   *
+   * \warning this method is for \b compressed \b storage \b only, and it will trigger an assertion otherwise.
+   *
+   * Here is an example:
+   * \include SparseMatrix_coeffs.cpp
+   * and the output is:
+   * \include SparseMatrix_coeffs.out
+   *
+   * \sa valuePtr(), isCompressed() */
+  Map<Array<Scalar, Dynamic, 1>> coeffs() {
+    eigen_assert(isCompressed());
+    return Array<Scalar, Dynamic, 1>::Map(valuePtr(), nonZeros());
+  }
 
-      Index start = this->outerIndexPtr()[outer];
-      Index end = this->isCompressed() ? this->outerIndexPtr()[outer+1] : this->outerIndexPtr()[outer] + this->innerNonZeroPtr()[outer];
-      eigen_assert(end>=start && "you are using a non finalized sparse matrix or written coefficient does not exist");
-      internal::LowerBoundIndex p;
-      p.value = std::lower_bound(this->innerIndexPtr()+start, this->innerIndexPtr()+end,inner) - this->innerIndexPtr();
-      p.found = (p.value<end) && (this->innerIndexPtr()[p.value]==inner);
-      return p;
-    }
+  /** sorts the inner vectors in the range [begin,end) with respect to `Comp`
+   * \sa innerIndicesAreSorted() */
+  template <class Comp = std::less<>>
+  inline void sortInnerIndices(Index begin, Index end) {
+    eigen_assert(begin >= 0 && end <= derived().outerSize() && end >= begin);
+    internal::inner_sort_impl<Derived, Comp, IsVectorAtCompileTime>::run(*this, begin, end);
+  }
 
-    friend struct internal::evaluator<SparseCompressedBase<Derived> >;
+  /** \returns the index of the first inner vector in the range [begin,end) that is not sorted with respect to `Comp`,
+   * or `end` if the range is fully sorted \sa sortInnerIndices() */
+  template <class Comp = std::less<>>
+  inline Index innerIndicesAreSorted(Index begin, Index end) const {
+    eigen_assert(begin >= 0 && end <= derived().outerSize() && end >= begin);
+    return internal::inner_sort_impl<Derived, Comp, IsVectorAtCompileTime>::check(*this, begin, end);
+  }
 
-  private:
-    template<typename OtherDerived> explicit SparseCompressedBase(const SparseCompressedBase<OtherDerived>&);
+  /** sorts the inner vectors in the range [0,outerSize) with respect to `Comp`
+   * \sa innerIndicesAreSorted() */
+  template <class Comp = std::less<>>
+  inline void sortInnerIndices() {
+    Index begin = 0;
+    Index end = derived().outerSize();
+    internal::inner_sort_impl<Derived, Comp, IsVectorAtCompileTime>::run(*this, begin, end);
+  }
+
+  /** \returns the index of the first inner vector in the range [0,outerSize) that is not sorted with respect to `Comp`,
+   * or `outerSize` if the range is fully sorted \sa sortInnerIndices() */
+  template <class Comp = std::less<>>
+  inline Index innerIndicesAreSorted() const {
+    Index begin = 0;
+    Index end = derived().outerSize();
+    return internal::inner_sort_impl<Derived, Comp, IsVectorAtCompileTime>::check(*this, begin, end);
+  }
+
+ protected:
+  /** Default constructor. Do nothing. */
+  SparseCompressedBase() {}
+
+  /** \internal return the index of the coeff at (row,col) or just before if it does not exist.
+   * This is an analogue of std::lower_bound.
+   */
+  internal::LowerBoundIndex lower_bound(Index row, Index col) const {
+    eigen_internal_assert(row >= 0 && row < this->rows() && col >= 0 && col < this->cols());
+
+    const Index outer = Derived::IsRowMajor ? row : col;
+    const Index inner = Derived::IsRowMajor ? col : row;
+
+    Index start = this->outerIndexPtr()[outer];
+    Index end = this->isCompressed() ? this->outerIndexPtr()[outer + 1]
+                                     : this->outerIndexPtr()[outer] + this->innerNonZeroPtr()[outer];
+    eigen_assert(end >= start && "you are using a non finalized sparse matrix or written coefficient does not exist");
+    internal::LowerBoundIndex p;
+    p.value =
+        std::lower_bound(this->innerIndexPtr() + start, this->innerIndexPtr() + end, inner) - this->innerIndexPtr();
+    p.found = (p.value < end) && (this->innerIndexPtr()[p.value] == inner);
+    return p;
+  }
+
+  friend struct internal::evaluator<SparseCompressedBase<Derived>>;
+
+ private:
+  template <typename OtherDerived>
+  explicit SparseCompressedBase(const SparseCompressedBase<OtherDerived>&);
 };
 
-template<typename Derived>
-class SparseCompressedBase<Derived>::InnerIterator
-{
-  public:
-    InnerIterator()
-      : m_values(0), m_indices(0), m_outer(0), m_id(0), m_end(0)
-    {}
+template <typename Derived>
+class SparseCompressedBase<Derived>::InnerIterator {
+ public:
+  InnerIterator() : m_values(0), m_indices(0), m_outer(0), m_id(0), m_end(0) {}
 
-    InnerIterator(const InnerIterator& other)
-      : m_values(other.m_values), m_indices(other.m_indices), m_outer(other.m_outer), m_id(other.m_id), m_end(other.m_end)
-    {}
+  InnerIterator(const InnerIterator& other)
+      : m_values(other.m_values),
+        m_indices(other.m_indices),
+        m_outer(other.m_outer),
+        m_id(other.m_id),
+        m_end(other.m_end) {}
 
-    InnerIterator& operator=(const InnerIterator& other)
-    {
-      m_values = other.m_values;
-      m_indices = other.m_indices;
-      const_cast<OuterType&>(m_outer).setValue(other.m_outer.value());
-      m_id = other.m_id;
-      m_end = other.m_end;
-      return *this;
-    }
+  InnerIterator& operator=(const InnerIterator& other) {
+    m_values = other.m_values;
+    m_indices = other.m_indices;
+    const_cast<OuterType&>(m_outer).setValue(other.m_outer.value());
+    m_id = other.m_id;
+    m_end = other.m_end;
+    return *this;
+  }
 
-    InnerIterator(const SparseCompressedBase& mat, Index outer)
-      : m_values(mat.valuePtr()), m_indices(mat.innerIndexPtr()), m_outer(outer)
-    {
-      if(Derived::IsVectorAtCompileTime && mat.outerIndexPtr()==0)
-      {
-        m_id = 0;
-        m_end = mat.nonZeros();
-      }
+  InnerIterator(const SparseCompressedBase& mat, Index outer)
+      : m_values(mat.valuePtr()), m_indices(mat.innerIndexPtr()), m_outer(outer) {
+    if (Derived::IsVectorAtCompileTime && mat.outerIndexPtr() == 0) {
+      m_id = 0;
+      m_end = mat.nonZeros();
+    } else {
+      m_id = mat.outerIndexPtr()[outer];
+      if (mat.isCompressed())
+        m_end = mat.outerIndexPtr()[outer + 1];
       else
-      {
-        m_id = mat.outerIndexPtr()[outer];
-        if(mat.isCompressed())
-          m_end = mat.outerIndexPtr()[outer+1];
-        else
-          m_end = m_id + mat.innerNonZeroPtr()[outer];
-      }
+        m_end = m_id + mat.innerNonZeroPtr()[outer];
     }
+  }
 
-    explicit InnerIterator(const SparseCompressedBase& mat) : InnerIterator(mat, Index(0))
-    {
-      EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
-    }
+  explicit InnerIterator(const SparseCompressedBase& mat) : InnerIterator(mat, Index(0)) {
+    EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
+  }
 
-    explicit InnerIterator(const internal::CompressedStorage<Scalar,StorageIndex>& data)
-      : m_values(data.valuePtr()), m_indices(data.indexPtr()), m_outer(0), m_id(0), m_end(data.size())
-    {
-      EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
-    }
+  explicit InnerIterator(const internal::CompressedStorage<Scalar, StorageIndex>& data)
+      : m_values(data.valuePtr()), m_indices(data.indexPtr()), m_outer(0), m_id(0), m_end(data.size()) {
+    EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
+  }
 
-    inline InnerIterator& operator++() { m_id++; return *this; }
-    inline InnerIterator& operator+=(Index i) { m_id += i ; return *this; }
+  inline InnerIterator& operator++() {
+    m_id++;
+    return *this;
+  }
+  inline InnerIterator& operator+=(Index i) {
+    m_id += i;
+    return *this;
+  }
 
-    inline InnerIterator operator+(Index i) 
-    { 
-        InnerIterator result = *this;
-        result += i;
-        return result;
-    }
+  inline InnerIterator operator+(Index i) {
+    InnerIterator result = *this;
+    result += i;
+    return result;
+  }
 
-    inline const Scalar& value() const { return m_values[m_id]; }
-    inline Scalar& valueRef() { return const_cast<Scalar&>(m_values[m_id]); }
+  inline const Scalar& value() const { return m_values[m_id]; }
+  inline Scalar& valueRef() { return const_cast<Scalar&>(m_values[m_id]); }
 
-    inline StorageIndex index() const { return m_indices[m_id]; }
-    inline Index outer() const { return m_outer.value(); }
-    inline Index row() const { return IsRowMajor ? m_outer.value() : index(); }
-    inline Index col() const { return IsRowMajor ? index() : m_outer.value(); }
+  inline StorageIndex index() const { return m_indices[m_id]; }
+  inline Index outer() const { return m_outer.value(); }
+  inline Index row() const { return IsRowMajor ? m_outer.value() : index(); }
+  inline Index col() const { return IsRowMajor ? index() : m_outer.value(); }
 
-    inline operator bool() const { return (m_id < m_end); }
+  inline operator bool() const { return (m_id < m_end); }
 
-  protected:
-    const Scalar* m_values;
-    const StorageIndex* m_indices;
-    typedef internal::variable_if_dynamic<Index,Derived::IsVectorAtCompileTime?0:Dynamic> OuterType;
-    const OuterType m_outer;
-    Index m_id;
-    Index m_end;
-  private:
-    // If you get here, then you're not using the right InnerIterator type, e.g.:
-    //   SparseMatrix<double,RowMajor> A;
-    //   SparseMatrix<double>::InnerIterator it(A,0);
-    template<typename T> InnerIterator(const SparseMatrixBase<T>&, Index outer);
+ protected:
+  const Scalar* m_values;
+  const StorageIndex* m_indices;
+  typedef internal::variable_if_dynamic<Index, Derived::IsVectorAtCompileTime ? 0 : Dynamic> OuterType;
+  const OuterType m_outer;
+  Index m_id;
+  Index m_end;
+
+ private:
+  // If you get here, then you're not using the right InnerIterator type, e.g.:
+  //   SparseMatrix<double,RowMajor> A;
+  //   SparseMatrix<double>::InnerIterator it(A,0);
+  template <typename T>
+  InnerIterator(const SparseMatrixBase<T>&, Index outer);
 };
 
-template<typename Derived>
-class SparseCompressedBase<Derived>::ReverseInnerIterator
-{
-  public:
-    ReverseInnerIterator(const SparseCompressedBase& mat, Index outer)
-      : m_values(mat.valuePtr()), m_indices(mat.innerIndexPtr()), m_outer(outer)
-    {
-      if(Derived::IsVectorAtCompileTime && mat.outerIndexPtr()==0)
-      {
-        m_start = 0;
-        m_id = mat.nonZeros();
-      }
+template <typename Derived>
+class SparseCompressedBase<Derived>::ReverseInnerIterator {
+ public:
+  ReverseInnerIterator(const SparseCompressedBase& mat, Index outer)
+      : m_values(mat.valuePtr()), m_indices(mat.innerIndexPtr()), m_outer(outer) {
+    if (Derived::IsVectorAtCompileTime && mat.outerIndexPtr() == 0) {
+      m_start = 0;
+      m_id = mat.nonZeros();
+    } else {
+      m_start = mat.outerIndexPtr()[outer];
+      if (mat.isCompressed())
+        m_id = mat.outerIndexPtr()[outer + 1];
       else
-      {
-        m_start = mat.outerIndexPtr()[outer];
-        if(mat.isCompressed())
-          m_id = mat.outerIndexPtr()[outer+1];
-        else
-          m_id = m_start + mat.innerNonZeroPtr()[outer];
-      }
+        m_id = m_start + mat.innerNonZeroPtr()[outer];
     }
+  }
 
-    explicit ReverseInnerIterator(const SparseCompressedBase& mat)
-      : m_values(mat.valuePtr()), m_indices(mat.innerIndexPtr()), m_outer(0), m_start(0), m_id(mat.nonZeros())
-    {
-      EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
-    }
+  explicit ReverseInnerIterator(const SparseCompressedBase& mat)
+      : m_values(mat.valuePtr()), m_indices(mat.innerIndexPtr()), m_outer(0), m_start(0), m_id(mat.nonZeros()) {
+    EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
+  }
 
-    explicit ReverseInnerIterator(const internal::CompressedStorage<Scalar,StorageIndex>& data)
-      : m_values(data.valuePtr()), m_indices(data.indexPtr()), m_outer(0), m_start(0), m_id(data.size())
-    {
-      EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
-    }
+  explicit ReverseInnerIterator(const internal::CompressedStorage<Scalar, StorageIndex>& data)
+      : m_values(data.valuePtr()), m_indices(data.indexPtr()), m_outer(0), m_start(0), m_id(data.size()) {
+    EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
+  }
 
-    inline ReverseInnerIterator& operator--() { --m_id; return *this; }
-    inline ReverseInnerIterator& operator-=(Index i) { m_id -= i; return *this; }
+  inline ReverseInnerIterator& operator--() {
+    --m_id;
+    return *this;
+  }
+  inline ReverseInnerIterator& operator-=(Index i) {
+    m_id -= i;
+    return *this;
+  }
 
-    inline ReverseInnerIterator operator-(Index i) 
-    {
-        ReverseInnerIterator result = *this;
-        result -= i;
-        return result;
-    }
+  inline ReverseInnerIterator operator-(Index i) {
+    ReverseInnerIterator result = *this;
+    result -= i;
+    return result;
+  }
 
-    inline const Scalar& value() const { return m_values[m_id-1]; }
-    inline Scalar& valueRef() { return const_cast<Scalar&>(m_values[m_id-1]); }
+  inline const Scalar& value() const { return m_values[m_id - 1]; }
+  inline Scalar& valueRef() { return const_cast<Scalar&>(m_values[m_id - 1]); }
 
-    inline StorageIndex index() const { return m_indices[m_id-1]; }
-    inline Index outer() const { return m_outer.value(); }
-    inline Index row() const { return IsRowMajor ? m_outer.value() : index(); }
-    inline Index col() const { return IsRowMajor ? index() : m_outer.value(); }
+  inline StorageIndex index() const { return m_indices[m_id - 1]; }
+  inline Index outer() const { return m_outer.value(); }
+  inline Index row() const { return IsRowMajor ? m_outer.value() : index(); }
+  inline Index col() const { return IsRowMajor ? index() : m_outer.value(); }
 
-    inline operator bool() const { return (m_id > m_start); }
+  inline operator bool() const { return (m_id > m_start); }
 
-  protected:
-    const Scalar* m_values;
-    const StorageIndex* m_indices;
-    typedef internal::variable_if_dynamic<Index,Derived::IsVectorAtCompileTime?0:Dynamic> OuterType;
-    const OuterType m_outer;
-    Index m_start;
-    Index m_id;
+ protected:
+  const Scalar* m_values;
+  const StorageIndex* m_indices;
+  typedef internal::variable_if_dynamic<Index, Derived::IsVectorAtCompileTime ? 0 : Dynamic> OuterType;
+  const OuterType m_outer;
+  Index m_start;
+  Index m_id;
 };
 
 namespace internal {
@@ -355,10 +362,8 @@
 
 // class to hold an index/value pair
 template <typename Scalar, typename StorageIndex>
-class StorageVal
-{
-public:
-    
+class StorageVal {
+ public:
   StorageVal(const StorageIndex& innerIndex, const Scalar& value) : m_innerIndex(innerIndex), m_value(value) {}
   StorageVal(const StorageVal& other) : m_innerIndex(other.m_innerIndex), m_value(other.m_value) {}
   StorageVal(StorageVal&& other) = default;
@@ -371,20 +376,20 @@
   // enables StorageVal to be compared with respect to any type that is convertible to StorageIndex
   inline operator StorageIndex() const { return m_innerIndex; }
 
-protected:
+ protected:
   StorageIndex m_innerIndex;
   Scalar m_value;
-private:
+
+ private:
   StorageVal() = delete;
 };
 // class to hold an index/value iterator pair
 // used to define assignment, swap, and comparison operators for CompressedStorageIterator
 template <typename Scalar, typename StorageIndex>
-class StorageRef 
-{
-public:
+class StorageRef {
+ public:
   using value_type = StorageVal<Scalar, StorageIndex>;
-  
+
   // StorageRef Needs to be move-able for sort on macos.
   StorageRef(StorageRef&& other) = default;
 
@@ -414,23 +419,25 @@
   // enables StorageRef to be compared with respect to any type that is convertible to StorageIndex
   inline operator StorageIndex() const { return *m_innerIndexIterator; }
 
-protected:
+ protected:
   StorageIndex* m_innerIndexIterator;
   Scalar* m_valueIterator;
-private:
+
+ private:
   StorageRef() = delete;
   // these constructors are called by the CompressedStorageIterator constructors for convenience only
-  StorageRef(StorageIndex* innerIndexIterator, Scalar* valueIterator) : m_innerIndexIterator(innerIndexIterator), m_valueIterator(valueIterator) {}
-  StorageRef(const StorageRef& other) : m_innerIndexIterator(other.m_innerIndexIterator), m_valueIterator(other.m_valueIterator) {}
+  StorageRef(StorageIndex* innerIndexIterator, Scalar* valueIterator)
+      : m_innerIndexIterator(innerIndexIterator), m_valueIterator(valueIterator) {}
+  StorageRef(const StorageRef& other)
+      : m_innerIndexIterator(other.m_innerIndexIterator), m_valueIterator(other.m_valueIterator) {}
 
   friend class CompressedStorageIterator<Scalar, StorageIndex>;
 };
 
 // STL-compatible iterator class that operates on inner indices and values
-template<typename Scalar, typename StorageIndex>
-class CompressedStorageIterator
-{
-public:
+template <typename Scalar, typename StorageIndex>
+class CompressedStorageIterator {
+ public:
   using iterator_category = std::random_access_iterator_tag;
   using reference = StorageRef<Scalar, StorageIndex>;
   using difference_type = Index;
@@ -438,7 +445,8 @@
   using pointer = value_type*;
 
   CompressedStorageIterator() = delete;
-  CompressedStorageIterator(difference_type index, StorageIndex* innerIndexPtr, Scalar* valuePtr) : m_index(index), m_data(innerIndexPtr, valuePtr) {}
+  CompressedStorageIterator(difference_type index, StorageIndex* innerIndexPtr, Scalar* valuePtr)
+      : m_index(index), m_data(innerIndexPtr, valuePtr) {}
   CompressedStorageIterator(difference_type index, reference data) : m_index(index), m_data(data) {}
   CompressedStorageIterator(const CompressedStorageIterator& other) : m_index(other.m_index), m_data(other.m_data) {}
   CompressedStorageIterator(CompressedStorageIterator&& other) = default;
@@ -448,25 +456,42 @@
     return *this;
   }
 
-  inline CompressedStorageIterator operator+(difference_type offset) const { return CompressedStorageIterator(m_index + offset, m_data); }
-  inline CompressedStorageIterator operator-(difference_type offset) const { return CompressedStorageIterator(m_index - offset, m_data); }
+  inline CompressedStorageIterator operator+(difference_type offset) const {
+    return CompressedStorageIterator(m_index + offset, m_data);
+  }
+  inline CompressedStorageIterator operator-(difference_type offset) const {
+    return CompressedStorageIterator(m_index - offset, m_data);
+  }
   inline difference_type operator-(const CompressedStorageIterator& other) const { return m_index - other.m_index; }
-  inline CompressedStorageIterator& operator++() { ++m_index; return *this; }
-  inline CompressedStorageIterator& operator--() { --m_index; return *this; }
-  inline CompressedStorageIterator& operator+=(difference_type offset) { m_index += offset; return *this; }
-  inline CompressedStorageIterator& operator-=(difference_type offset) { m_index -= offset; return *this; }
+  inline CompressedStorageIterator& operator++() {
+    ++m_index;
+    return *this;
+  }
+  inline CompressedStorageIterator& operator--() {
+    --m_index;
+    return *this;
+  }
+  inline CompressedStorageIterator& operator+=(difference_type offset) {
+    m_index += offset;
+    return *this;
+  }
+  inline CompressedStorageIterator& operator-=(difference_type offset) {
+    m_index -= offset;
+    return *this;
+  }
   inline reference operator*() const { return reference(m_data.keyPtr() + m_index, m_data.valuePtr() + m_index); }
 
-  #define MAKE_COMP(OP) inline bool operator OP(const CompressedStorageIterator& other) const { return m_index OP other.m_index; }
+#define MAKE_COMP(OP) \
+  inline bool operator OP(const CompressedStorageIterator& other) const { return m_index OP other.m_index; }
   MAKE_COMP(<)
   MAKE_COMP(>)
   MAKE_COMP(>=)
   MAKE_COMP(<=)
   MAKE_COMP(!=)
   MAKE_COMP(==)
-  #undef MAKE_COMP
+#undef MAKE_COMP
 
-protected:
+ protected:
   difference_type m_index;
   reference m_data;
 };
@@ -518,66 +543,49 @@
   }
 };
 
-template<typename Derived>
-struct evaluator<SparseCompressedBase<Derived> >
-  : evaluator_base<Derived>
-{
+template <typename Derived>
+struct evaluator<SparseCompressedBase<Derived>> : evaluator_base<Derived> {
   typedef typename Derived::Scalar Scalar;
   typedef typename Derived::InnerIterator InnerIterator;
-  
-  enum {
-    CoeffReadCost = NumTraits<Scalar>::ReadCost,
-    Flags = Derived::Flags
-  };
-  
-  evaluator() : m_matrix(0), m_zero(0)
-  {
-    EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
-  }
-  explicit evaluator(const Derived &mat) : m_matrix(&mat), m_zero(0)
-  {
-    EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
-  }
-  
-  inline Index nonZerosEstimate() const {
-    return m_matrix->nonZeros();
-  }
-  
+
+  enum { CoeffReadCost = NumTraits<Scalar>::ReadCost, Flags = Derived::Flags };
+
+  evaluator() : m_matrix(0), m_zero(0) { EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); }
+  explicit evaluator(const Derived& mat) : m_matrix(&mat), m_zero(0) { EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); }
+
+  inline Index nonZerosEstimate() const { return m_matrix->nonZeros(); }
+
   operator Derived&() { return m_matrix->const_cast_derived(); }
   operator const Derived&() const { return *m_matrix; }
-  
-  typedef typename DenseCoeffsBase<Derived,ReadOnlyAccessors>::CoeffReturnType CoeffReturnType;
-  const Scalar& coeff(Index row, Index col) const
-  {
-    Index p = find(row,col);
 
-    if(p==Dynamic)
+  typedef typename DenseCoeffsBase<Derived, ReadOnlyAccessors>::CoeffReturnType CoeffReturnType;
+  const Scalar& coeff(Index row, Index col) const {
+    Index p = find(row, col);
+
+    if (p == Dynamic)
       return m_zero;
     else
       return m_matrix->const_cast_derived().valuePtr()[p];
   }
 
-  Scalar& coeffRef(Index row, Index col)
-  {
-    Index p = find(row,col);
-    eigen_assert(p!=Dynamic && "written coefficient does not exist");
+  Scalar& coeffRef(Index row, Index col) {
+    Index p = find(row, col);
+    eigen_assert(p != Dynamic && "written coefficient does not exist");
     return m_matrix->const_cast_derived().valuePtr()[p];
   }
 
-protected:
-
-  Index find(Index row, Index col) const
-  {
-    internal::LowerBoundIndex p = m_matrix->lower_bound(row,col);
+ protected:
+  Index find(Index row, Index col) const {
+    internal::LowerBoundIndex p = m_matrix->lower_bound(row, col);
     return p.found ? p.value : Dynamic;
   }
 
-  const Derived *m_matrix;
+  const Derived* m_matrix;
   const Scalar m_zero;
 };
 
-}
+}  // namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SPARSE_COMPRESSED_BASE_H
+#endif  // EIGEN_SPARSE_COMPRESSED_BASE_H
diff --git a/Eigen/src/SparseCore/SparseCwiseBinaryOp.h b/Eigen/src/SparseCore/SparseCwiseBinaryOp.h
index 92be6d2..6858263 100644
--- a/Eigen/src/SparseCore/SparseCwiseBinaryOp.h
+++ b/Eigen/src/SparseCore/SparseCwiseBinaryOp.h
@@ -13,7 +13,7 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 // Here we have to handle 3 cases:
 //  1 - sparse op dense
@@ -35,78 +35,68 @@
 // TODO to ease compiler job, we could specialize product/quotient with a scalar
 //      and fallback to cwise-unary evaluator using bind1st_op and bind2nd_op.
 
-template<typename BinaryOp, typename Lhs, typename Rhs>
-class CwiseBinaryOpImpl<BinaryOp, Lhs, Rhs, Sparse>
-  : public SparseMatrixBase<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >
-{
-  public:
-    typedef CwiseBinaryOp<BinaryOp, Lhs, Rhs> Derived;
-    typedef SparseMatrixBase<Derived> Base;
-    EIGEN_SPARSE_PUBLIC_INTERFACE(Derived)
-    EIGEN_STATIC_ASSERT((
-              (!internal::is_same<typename internal::traits<Lhs>::StorageKind,
-                                  typename internal::traits<Rhs>::StorageKind>::value)
-          ||  ((internal::evaluator<Lhs>::Flags&RowMajorBit) == (internal::evaluator<Rhs>::Flags&RowMajorBit))),
-          THE_STORAGE_ORDER_OF_BOTH_SIDES_MUST_MATCH)
+template <typename BinaryOp, typename Lhs, typename Rhs>
+class CwiseBinaryOpImpl<BinaryOp, Lhs, Rhs, Sparse> : public SparseMatrixBase<CwiseBinaryOp<BinaryOp, Lhs, Rhs> > {
+ public:
+  typedef CwiseBinaryOp<BinaryOp, Lhs, Rhs> Derived;
+  typedef SparseMatrixBase<Derived> Base;
+  EIGEN_SPARSE_PUBLIC_INTERFACE(Derived)
+  EIGEN_STATIC_ASSERT(((!internal::is_same<typename internal::traits<Lhs>::StorageKind,
+                                           typename internal::traits<Rhs>::StorageKind>::value) ||
+                       ((internal::evaluator<Lhs>::Flags & RowMajorBit) ==
+                        (internal::evaluator<Rhs>::Flags & RowMajorBit))),
+                      THE_STORAGE_ORDER_OF_BOTH_SIDES_MUST_MATCH)
 };
 
 namespace internal {
 
 // The default evaluator performs an "arithmetic" operation on two input arrays.
-// Given input arrays 'lhs' and 'rhs' and binary functor 'func', 
+// Given input arrays 'lhs' and 'rhs' and binary functor 'func',
 // the sparse destination array 'dst' is evaluated as follows:
 //   if lhs(i,j) and rhs(i,j) are present, dst(i,j) = func(lhs(i,j), rhs(i,j))
 //   if lhs(i,j) is present and rhs(i,j) is null, dst(i,j) = func(lhs(i,j), 0)
 //   if lhs(i,j) is null and rhs(i,j) is present, dst(i,j) = func(0, rhs(i,j))
-  
-// Generic "sparse OP sparse"
-template<typename XprType> struct binary_sparse_evaluator;
 
-template<typename BinaryOp, typename Lhs, typename Rhs>
+// Generic "sparse OP sparse"
+template <typename XprType>
+struct binary_sparse_evaluator;
+
+template <typename BinaryOp, typename Lhs, typename Rhs>
 struct binary_evaluator<CwiseBinaryOp<BinaryOp, Lhs, Rhs>, IteratorBased, IteratorBased>
-  : evaluator_base<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >
-{
-protected:
-  typedef typename evaluator<Lhs>::InnerIterator  LhsIterator;
-  typedef typename evaluator<Rhs>::InnerIterator  RhsIterator;
+    : evaluator_base<CwiseBinaryOp<BinaryOp, Lhs, Rhs> > {
+ protected:
+  typedef typename evaluator<Lhs>::InnerIterator LhsIterator;
+  typedef typename evaluator<Rhs>::InnerIterator RhsIterator;
   typedef CwiseBinaryOp<BinaryOp, Lhs, Rhs> XprType;
   typedef typename traits<XprType>::Scalar Scalar;
   typedef typename XprType::StorageIndex StorageIndex;
-public:
 
-  class InnerIterator
-  {
-  public:
-    
+ public:
+  class InnerIterator {
+   public:
     EIGEN_STRONG_INLINE InnerIterator(const binary_evaluator& aEval, Index outer)
-      : m_lhsIter(aEval.m_lhsImpl,outer), m_rhsIter(aEval.m_rhsImpl,outer), m_functor(aEval.m_functor), m_value(Scalar(0))
-    {
+        : m_lhsIter(aEval.m_lhsImpl, outer),
+          m_rhsIter(aEval.m_rhsImpl, outer),
+          m_functor(aEval.m_functor),
+          m_value(Scalar(0)) {
       this->operator++();
     }
 
-    EIGEN_STRONG_INLINE InnerIterator& operator++()
-    {
-      if (m_lhsIter && m_rhsIter && (m_lhsIter.index() == m_rhsIter.index()))
-      {
+    EIGEN_STRONG_INLINE InnerIterator& operator++() {
+      if (m_lhsIter && m_rhsIter && (m_lhsIter.index() == m_rhsIter.index())) {
         m_id = m_lhsIter.index();
         m_value = m_functor(m_lhsIter.value(), m_rhsIter.value());
         ++m_lhsIter;
         ++m_rhsIter;
-      }
-      else if (m_lhsIter && (!m_rhsIter || (m_lhsIter.index() < m_rhsIter.index())))
-      {
+      } else if (m_lhsIter && (!m_rhsIter || (m_lhsIter.index() < m_rhsIter.index()))) {
         m_id = m_lhsIter.index();
         m_value = m_functor(m_lhsIter.value(), Scalar(0));
         ++m_lhsIter;
-      }
-      else if (m_rhsIter && (!m_lhsIter || (m_lhsIter.index() > m_rhsIter.index())))
-      {
+      } else if (m_rhsIter && (!m_lhsIter || (m_lhsIter.index() > m_rhsIter.index()))) {
         m_id = m_rhsIter.index();
         m_value = m_functor(Scalar(0), m_rhsIter.value());
         ++m_rhsIter;
-      }
-      else
-      {
+      } else {
         m_id = -1;
       }
       return *this;
@@ -119,94 +109,88 @@
     EIGEN_STRONG_INLINE Index row() const { return Lhs::IsRowMajor ? m_lhsIter.row() : index(); }
     EIGEN_STRONG_INLINE Index col() const { return Lhs::IsRowMajor ? index() : m_lhsIter.col(); }
 
-    EIGEN_STRONG_INLINE operator bool() const { return m_id>=0; }
+    EIGEN_STRONG_INLINE operator bool() const { return m_id >= 0; }
 
-  protected:
+   protected:
     LhsIterator m_lhsIter;
     RhsIterator m_rhsIter;
     const BinaryOp& m_functor;
     Scalar m_value;
     StorageIndex m_id;
   };
-  
-  
+
   enum {
-    CoeffReadCost = int(evaluator<Lhs>::CoeffReadCost) + int(evaluator<Rhs>::CoeffReadCost) + int(functor_traits<BinaryOp>::Cost),
+    CoeffReadCost =
+        int(evaluator<Lhs>::CoeffReadCost) + int(evaluator<Rhs>::CoeffReadCost) + int(functor_traits<BinaryOp>::Cost),
     Flags = XprType::Flags
   };
-  
-  explicit binary_evaluator(const XprType& xpr)
-    : m_functor(xpr.functor()),
-      m_lhsImpl(xpr.lhs()), 
-      m_rhsImpl(xpr.rhs())  
-  {
+
+  explicit binary_evaluator(const XprType& xpr) : m_functor(xpr.functor()), m_lhsImpl(xpr.lhs()), m_rhsImpl(xpr.rhs()) {
     EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits<BinaryOp>::Cost);
     EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
   }
-  
-  inline Index nonZerosEstimate() const {
-    return m_lhsImpl.nonZerosEstimate() + m_rhsImpl.nonZerosEstimate();
-  }
 
-protected:
+  inline Index nonZerosEstimate() const { return m_lhsImpl.nonZerosEstimate() + m_rhsImpl.nonZerosEstimate(); }
+
+ protected:
   const BinaryOp m_functor;
   evaluator<Lhs> m_lhsImpl;
   evaluator<Rhs> m_rhsImpl;
 };
 
 // dense op sparse
-template<typename BinaryOp, typename Lhs, typename Rhs>
+template <typename BinaryOp, typename Lhs, typename Rhs>
 struct binary_evaluator<CwiseBinaryOp<BinaryOp, Lhs, Rhs>, IndexBased, IteratorBased>
-  : evaluator_base<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >
-{
-protected:
-  typedef typename evaluator<Rhs>::InnerIterator  RhsIterator;
+    : evaluator_base<CwiseBinaryOp<BinaryOp, Lhs, Rhs> > {
+ protected:
+  typedef typename evaluator<Rhs>::InnerIterator RhsIterator;
   typedef CwiseBinaryOp<BinaryOp, Lhs, Rhs> XprType;
   typedef typename traits<XprType>::Scalar Scalar;
   typedef typename XprType::StorageIndex StorageIndex;
-public:
 
-  class InnerIterator
-  {
-    enum { IsRowMajor = (int(Rhs::Flags)&RowMajorBit)==RowMajorBit };
-  public:
+ public:
+  class InnerIterator {
+    enum { IsRowMajor = (int(Rhs::Flags) & RowMajorBit) == RowMajorBit };
 
+   public:
     EIGEN_STRONG_INLINE InnerIterator(const binary_evaluator& aEval, Index outer)
-      : m_lhsEval(aEval.m_lhsImpl), m_rhsIter(aEval.m_rhsImpl,outer), m_functor(aEval.m_functor), m_value(0), m_id(-1), m_innerSize(aEval.m_expr.rhs().innerSize())
-    {
+        : m_lhsEval(aEval.m_lhsImpl),
+          m_rhsIter(aEval.m_rhsImpl, outer),
+          m_functor(aEval.m_functor),
+          m_value(0),
+          m_id(-1),
+          m_innerSize(aEval.m_expr.rhs().innerSize()) {
       this->operator++();
     }
 
-    EIGEN_STRONG_INLINE InnerIterator& operator++()
-    {
+    EIGEN_STRONG_INLINE InnerIterator& operator++() {
       ++m_id;
-      if(m_id<m_innerSize)
-      {
-        Scalar lhsVal = m_lhsEval.coeff(IsRowMajor?m_rhsIter.outer():m_id,
-                                        IsRowMajor?m_id:m_rhsIter.outer());
-        if(m_rhsIter && m_rhsIter.index()==m_id)
-        {
+      if (m_id < m_innerSize) {
+        Scalar lhsVal = m_lhsEval.coeff(IsRowMajor ? m_rhsIter.outer() : m_id, IsRowMajor ? m_id : m_rhsIter.outer());
+        if (m_rhsIter && m_rhsIter.index() == m_id) {
           m_value = m_functor(lhsVal, m_rhsIter.value());
           ++m_rhsIter;
-        }
-        else
+        } else
           m_value = m_functor(lhsVal, Scalar(0));
       }
 
       return *this;
     }
 
-    EIGEN_STRONG_INLINE Scalar value() const { eigen_internal_assert(m_id<m_innerSize); return m_value; }
+    EIGEN_STRONG_INLINE Scalar value() const {
+      eigen_internal_assert(m_id < m_innerSize);
+      return m_value;
+    }
 
     EIGEN_STRONG_INLINE StorageIndex index() const { return m_id; }
     EIGEN_STRONG_INLINE Index outer() const { return m_rhsIter.outer(); }
     EIGEN_STRONG_INLINE Index row() const { return IsRowMajor ? m_rhsIter.outer() : m_id; }
     EIGEN_STRONG_INLINE Index col() const { return IsRowMajor ? m_id : m_rhsIter.outer(); }
 
-    EIGEN_STRONG_INLINE operator bool() const { return m_id<m_innerSize; }
+    EIGEN_STRONG_INLINE operator bool() const { return m_id < m_innerSize; }
 
-  protected:
-    const evaluator<Lhs> &m_lhsEval;
+   protected:
+    const evaluator<Lhs>& m_lhsEval;
     RhsIterator m_rhsIter;
     const BinaryOp& m_functor;
     Scalar m_value;
@@ -214,223 +198,198 @@
     StorageIndex m_innerSize;
   };
 
-
   enum {
-    CoeffReadCost = int(evaluator<Lhs>::CoeffReadCost) + int(evaluator<Rhs>::CoeffReadCost) + int(functor_traits<BinaryOp>::Cost),
+    CoeffReadCost =
+        int(evaluator<Lhs>::CoeffReadCost) + int(evaluator<Rhs>::CoeffReadCost) + int(functor_traits<BinaryOp>::Cost),
     Flags = XprType::Flags
   };
 
   explicit binary_evaluator(const XprType& xpr)
-    : m_functor(xpr.functor()),
-      m_lhsImpl(xpr.lhs()),
-      m_rhsImpl(xpr.rhs()),
-      m_expr(xpr)
-  {
+      : m_functor(xpr.functor()), m_lhsImpl(xpr.lhs()), m_rhsImpl(xpr.rhs()), m_expr(xpr) {
     EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits<BinaryOp>::Cost);
     EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
   }
 
-  inline Index nonZerosEstimate() const {
-    return m_expr.size();
-  }
+  inline Index nonZerosEstimate() const { return m_expr.size(); }
 
-protected:
+ protected:
   const BinaryOp m_functor;
   evaluator<Lhs> m_lhsImpl;
   evaluator<Rhs> m_rhsImpl;
-  const XprType &m_expr;
+  const XprType& m_expr;
 };
 
 // sparse op dense
-template<typename BinaryOp, typename Lhs, typename Rhs>
+template <typename BinaryOp, typename Lhs, typename Rhs>
 struct binary_evaluator<CwiseBinaryOp<BinaryOp, Lhs, Rhs>, IteratorBased, IndexBased>
-  : evaluator_base<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >
-{
-protected:
-  typedef typename evaluator<Lhs>::InnerIterator  LhsIterator;
+    : evaluator_base<CwiseBinaryOp<BinaryOp, Lhs, Rhs> > {
+ protected:
+  typedef typename evaluator<Lhs>::InnerIterator LhsIterator;
   typedef CwiseBinaryOp<BinaryOp, Lhs, Rhs> XprType;
   typedef typename traits<XprType>::Scalar Scalar;
   typedef typename XprType::StorageIndex StorageIndex;
-public:
 
-  class InnerIterator
-  {
-    enum { IsRowMajor = (int(Lhs::Flags)&RowMajorBit)==RowMajorBit };
-  public:
+ public:
+  class InnerIterator {
+    enum { IsRowMajor = (int(Lhs::Flags) & RowMajorBit) == RowMajorBit };
 
+   public:
     EIGEN_STRONG_INLINE InnerIterator(const binary_evaluator& aEval, Index outer)
-      : m_lhsIter(aEval.m_lhsImpl,outer), m_rhsEval(aEval.m_rhsImpl), m_functor(aEval.m_functor), m_value(0), m_id(-1), m_innerSize(aEval.m_expr.lhs().innerSize())
-    {
+        : m_lhsIter(aEval.m_lhsImpl, outer),
+          m_rhsEval(aEval.m_rhsImpl),
+          m_functor(aEval.m_functor),
+          m_value(0),
+          m_id(-1),
+          m_innerSize(aEval.m_expr.lhs().innerSize()) {
       this->operator++();
     }
 
-    EIGEN_STRONG_INLINE InnerIterator& operator++()
-    {
+    EIGEN_STRONG_INLINE InnerIterator& operator++() {
       ++m_id;
-      if(m_id<m_innerSize)
-      {
-        Scalar rhsVal = m_rhsEval.coeff(IsRowMajor?m_lhsIter.outer():m_id,
-                                        IsRowMajor?m_id:m_lhsIter.outer());
-        if(m_lhsIter && m_lhsIter.index()==m_id)
-        {
+      if (m_id < m_innerSize) {
+        Scalar rhsVal = m_rhsEval.coeff(IsRowMajor ? m_lhsIter.outer() : m_id, IsRowMajor ? m_id : m_lhsIter.outer());
+        if (m_lhsIter && m_lhsIter.index() == m_id) {
           m_value = m_functor(m_lhsIter.value(), rhsVal);
           ++m_lhsIter;
-        }
-        else
-          m_value = m_functor(Scalar(0),rhsVal);
+        } else
+          m_value = m_functor(Scalar(0), rhsVal);
       }
 
       return *this;
     }
 
-    EIGEN_STRONG_INLINE Scalar value() const { eigen_internal_assert(m_id<m_innerSize); return m_value; }
+    EIGEN_STRONG_INLINE Scalar value() const {
+      eigen_internal_assert(m_id < m_innerSize);
+      return m_value;
+    }
 
     EIGEN_STRONG_INLINE StorageIndex index() const { return m_id; }
     EIGEN_STRONG_INLINE Index outer() const { return m_lhsIter.outer(); }
     EIGEN_STRONG_INLINE Index row() const { return IsRowMajor ? m_lhsIter.outer() : m_id; }
     EIGEN_STRONG_INLINE Index col() const { return IsRowMajor ? m_id : m_lhsIter.outer(); }
 
-    EIGEN_STRONG_INLINE operator bool() const { return m_id<m_innerSize; }
+    EIGEN_STRONG_INLINE operator bool() const { return m_id < m_innerSize; }
 
-  protected:
+   protected:
     LhsIterator m_lhsIter;
-    const evaluator<Rhs> &m_rhsEval;
+    const evaluator<Rhs>& m_rhsEval;
     const BinaryOp& m_functor;
     Scalar m_value;
     StorageIndex m_id;
     StorageIndex m_innerSize;
   };
 
-
   enum {
-    CoeffReadCost = int(evaluator<Lhs>::CoeffReadCost) + int(evaluator<Rhs>::CoeffReadCost) + int(functor_traits<BinaryOp>::Cost),
+    CoeffReadCost =
+        int(evaluator<Lhs>::CoeffReadCost) + int(evaluator<Rhs>::CoeffReadCost) + int(functor_traits<BinaryOp>::Cost),
     Flags = XprType::Flags
   };
 
   explicit binary_evaluator(const XprType& xpr)
-    : m_functor(xpr.functor()),
-      m_lhsImpl(xpr.lhs()),
-      m_rhsImpl(xpr.rhs()),
-      m_expr(xpr)
-  {
+      : m_functor(xpr.functor()), m_lhsImpl(xpr.lhs()), m_rhsImpl(xpr.rhs()), m_expr(xpr) {
     EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits<BinaryOp>::Cost);
     EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
   }
 
-  inline Index nonZerosEstimate() const {
-    return m_expr.size();
-  }
+  inline Index nonZerosEstimate() const { return m_expr.size(); }
 
-protected:
+ protected:
   const BinaryOp m_functor;
   evaluator<Lhs> m_lhsImpl;
   evaluator<Rhs> m_rhsImpl;
-  const XprType &m_expr;
+  const XprType& m_expr;
 };
 
-template<typename T,
-         typename LhsKind   = typename evaluator_traits<typename T::Lhs>::Kind,
-         typename RhsKind   = typename evaluator_traits<typename T::Rhs>::Kind,
-         typename LhsScalar = typename traits<typename T::Lhs>::Scalar,
-         typename RhsScalar = typename traits<typename T::Rhs>::Scalar> struct sparse_conjunction_evaluator;
+template <typename T, typename LhsKind = typename evaluator_traits<typename T::Lhs>::Kind,
+          typename RhsKind = typename evaluator_traits<typename T::Rhs>::Kind,
+          typename LhsScalar = typename traits<typename T::Lhs>::Scalar,
+          typename RhsScalar = typename traits<typename T::Rhs>::Scalar>
+struct sparse_conjunction_evaluator;
 
 // "sparse .* sparse"
-template<typename T1, typename T2, typename Lhs, typename Rhs>
-struct binary_evaluator<CwiseBinaryOp<scalar_product_op<T1,T2>, Lhs, Rhs>, IteratorBased, IteratorBased>
-  : sparse_conjunction_evaluator<CwiseBinaryOp<scalar_product_op<T1,T2>, Lhs, Rhs> >
-{
-  typedef CwiseBinaryOp<scalar_product_op<T1,T2>, Lhs, Rhs> XprType;
+template <typename T1, typename T2, typename Lhs, typename Rhs>
+struct binary_evaluator<CwiseBinaryOp<scalar_product_op<T1, T2>, Lhs, Rhs>, IteratorBased, IteratorBased>
+    : sparse_conjunction_evaluator<CwiseBinaryOp<scalar_product_op<T1, T2>, Lhs, Rhs> > {
+  typedef CwiseBinaryOp<scalar_product_op<T1, T2>, Lhs, Rhs> XprType;
   typedef sparse_conjunction_evaluator<XprType> Base;
   explicit binary_evaluator(const XprType& xpr) : Base(xpr) {}
 };
 // "dense .* sparse"
-template<typename T1, typename T2, typename Lhs, typename Rhs>
-struct binary_evaluator<CwiseBinaryOp<scalar_product_op<T1,T2>, Lhs, Rhs>, IndexBased, IteratorBased>
-  : sparse_conjunction_evaluator<CwiseBinaryOp<scalar_product_op<T1,T2>, Lhs, Rhs> >
-{
-  typedef CwiseBinaryOp<scalar_product_op<T1,T2>, Lhs, Rhs> XprType;
+template <typename T1, typename T2, typename Lhs, typename Rhs>
+struct binary_evaluator<CwiseBinaryOp<scalar_product_op<T1, T2>, Lhs, Rhs>, IndexBased, IteratorBased>
+    : sparse_conjunction_evaluator<CwiseBinaryOp<scalar_product_op<T1, T2>, Lhs, Rhs> > {
+  typedef CwiseBinaryOp<scalar_product_op<T1, T2>, Lhs, Rhs> XprType;
   typedef sparse_conjunction_evaluator<XprType> Base;
   explicit binary_evaluator(const XprType& xpr) : Base(xpr) {}
 };
 // "sparse .* dense"
-template<typename T1, typename T2, typename Lhs, typename Rhs>
-struct binary_evaluator<CwiseBinaryOp<scalar_product_op<T1,T2>, Lhs, Rhs>, IteratorBased, IndexBased>
-  : sparse_conjunction_evaluator<CwiseBinaryOp<scalar_product_op<T1,T2>, Lhs, Rhs> >
-{
-  typedef CwiseBinaryOp<scalar_product_op<T1,T2>, Lhs, Rhs> XprType;
+template <typename T1, typename T2, typename Lhs, typename Rhs>
+struct binary_evaluator<CwiseBinaryOp<scalar_product_op<T1, T2>, Lhs, Rhs>, IteratorBased, IndexBased>
+    : sparse_conjunction_evaluator<CwiseBinaryOp<scalar_product_op<T1, T2>, Lhs, Rhs> > {
+  typedef CwiseBinaryOp<scalar_product_op<T1, T2>, Lhs, Rhs> XprType;
   typedef sparse_conjunction_evaluator<XprType> Base;
   explicit binary_evaluator(const XprType& xpr) : Base(xpr) {}
 };
 
 // "sparse ./ dense"
-template<typename T1, typename T2, typename Lhs, typename Rhs>
-struct binary_evaluator<CwiseBinaryOp<scalar_quotient_op<T1,T2>, Lhs, Rhs>, IteratorBased, IndexBased>
-  : sparse_conjunction_evaluator<CwiseBinaryOp<scalar_quotient_op<T1,T2>, Lhs, Rhs> >
-{
-  typedef CwiseBinaryOp<scalar_quotient_op<T1,T2>, Lhs, Rhs> XprType;
+template <typename T1, typename T2, typename Lhs, typename Rhs>
+struct binary_evaluator<CwiseBinaryOp<scalar_quotient_op<T1, T2>, Lhs, Rhs>, IteratorBased, IndexBased>
+    : sparse_conjunction_evaluator<CwiseBinaryOp<scalar_quotient_op<T1, T2>, Lhs, Rhs> > {
+  typedef CwiseBinaryOp<scalar_quotient_op<T1, T2>, Lhs, Rhs> XprType;
   typedef sparse_conjunction_evaluator<XprType> Base;
   explicit binary_evaluator(const XprType& xpr) : Base(xpr) {}
 };
 
 // "sparse && sparse"
-template<typename Lhs, typename Rhs>
+template <typename Lhs, typename Rhs>
 struct binary_evaluator<CwiseBinaryOp<scalar_boolean_and_op<bool>, Lhs, Rhs>, IteratorBased, IteratorBased>
-  : sparse_conjunction_evaluator<CwiseBinaryOp<scalar_boolean_and_op<bool>, Lhs, Rhs> >
-{
+    : sparse_conjunction_evaluator<CwiseBinaryOp<scalar_boolean_and_op<bool>, Lhs, Rhs> > {
   typedef CwiseBinaryOp<scalar_boolean_and_op<bool>, Lhs, Rhs> XprType;
   typedef sparse_conjunction_evaluator<XprType> Base;
   explicit binary_evaluator(const XprType& xpr) : Base(xpr) {}
 };
 // "dense && sparse"
-template<typename Lhs, typename Rhs>
+template <typename Lhs, typename Rhs>
 struct binary_evaluator<CwiseBinaryOp<scalar_boolean_and_op<bool>, Lhs, Rhs>, IndexBased, IteratorBased>
-  : sparse_conjunction_evaluator<CwiseBinaryOp<scalar_boolean_and_op<bool>, Lhs, Rhs> >
-{
+    : sparse_conjunction_evaluator<CwiseBinaryOp<scalar_boolean_and_op<bool>, Lhs, Rhs> > {
   typedef CwiseBinaryOp<scalar_boolean_and_op<bool>, Lhs, Rhs> XprType;
   typedef sparse_conjunction_evaluator<XprType> Base;
   explicit binary_evaluator(const XprType& xpr) : Base(xpr) {}
 };
 // "sparse && dense"
-template<typename Lhs, typename Rhs>
+template <typename Lhs, typename Rhs>
 struct binary_evaluator<CwiseBinaryOp<scalar_boolean_and_op<bool>, Lhs, Rhs>, IteratorBased, IndexBased>
-  : sparse_conjunction_evaluator<CwiseBinaryOp<scalar_boolean_and_op<bool>, Lhs, Rhs> >
-{
+    : sparse_conjunction_evaluator<CwiseBinaryOp<scalar_boolean_and_op<bool>, Lhs, Rhs> > {
   typedef CwiseBinaryOp<scalar_boolean_and_op<bool>, Lhs, Rhs> XprType;
   typedef sparse_conjunction_evaluator<XprType> Base;
   explicit binary_evaluator(const XprType& xpr) : Base(xpr) {}
 };
 
 // The conjunction "^" evaluator performs a logical "and" or set "intersection" operation on two input arrays.
-// Given input arrays 'lhs' and 'rhs' and binary functor 'func', 
+// Given input arrays 'lhs' and 'rhs' and binary functor 'func',
 // the sparse destination array 'dst' is evaluated as follows:
 //   if lhs(i,j) and rhs(i,j) are present, dst(i,j) = func(lhs(i,j), rhs(i,j))
 //   if lhs(i,j) is present and rhs(i,j) is null, dst(i,j) is null
 //   if lhs(i,j) is null and rhs(i,j) is present, dst(i,j) is null
 
 // "sparse ^ sparse"
-template<typename XprType>
-struct sparse_conjunction_evaluator<XprType, IteratorBased, IteratorBased>
-  : evaluator_base<XprType>
-{
-protected:
+template <typename XprType>
+struct sparse_conjunction_evaluator<XprType, IteratorBased, IteratorBased> : evaluator_base<XprType> {
+ protected:
   typedef typename XprType::Functor BinaryOp;
   typedef typename XprType::Lhs LhsArg;
   typedef typename XprType::Rhs RhsArg;
-  typedef typename evaluator<LhsArg>::InnerIterator  LhsIterator;
-  typedef typename evaluator<RhsArg>::InnerIterator  RhsIterator;
+  typedef typename evaluator<LhsArg>::InnerIterator LhsIterator;
+  typedef typename evaluator<RhsArg>::InnerIterator RhsIterator;
   typedef typename XprType::StorageIndex StorageIndex;
   typedef typename traits<XprType>::Scalar Scalar;
-public:
 
-  class InnerIterator
-  {
-  public:
-    
+ public:
+  class InnerIterator {
+   public:
     EIGEN_STRONG_INLINE InnerIterator(const sparse_conjunction_evaluator& aEval, Index outer)
-      : m_lhsIter(aEval.m_lhsImpl,outer), m_rhsIter(aEval.m_rhsImpl,outer), m_functor(aEval.m_functor)
-    {
-      while (m_lhsIter && m_rhsIter && (m_lhsIter.index() != m_rhsIter.index()))
-      {
+        : m_lhsIter(aEval.m_lhsImpl, outer), m_rhsIter(aEval.m_rhsImpl, outer), m_functor(aEval.m_functor) {
+      while (m_lhsIter && m_rhsIter && (m_lhsIter.index() != m_rhsIter.index())) {
         if (m_lhsIter.index() < m_rhsIter.index())
           ++m_lhsIter;
         else
@@ -438,12 +397,10 @@
       }
     }
 
-    EIGEN_STRONG_INLINE InnerIterator& operator++()
-    {
+    EIGEN_STRONG_INLINE InnerIterator& operator++() {
       ++m_lhsIter;
       ++m_rhsIter;
-      while (m_lhsIter && m_rhsIter && (m_lhsIter.index() != m_rhsIter.index()))
-      {
+      while (m_lhsIter && m_rhsIter && (m_lhsIter.index() != m_rhsIter.index())) {
         if (m_lhsIter.index() < m_rhsIter.index())
           ++m_lhsIter;
         else
@@ -451,7 +408,7 @@
       }
       return *this;
     }
-    
+
     EIGEN_STRONG_INLINE Scalar value() const { return m_functor(m_lhsIter.value(), m_rhsIter.value()); }
 
     EIGEN_STRONG_INLINE StorageIndex index() const { return m_lhsIter.index(); }
@@ -461,70 +418,64 @@
 
     EIGEN_STRONG_INLINE operator bool() const { return (m_lhsIter && m_rhsIter); }
 
-  protected:
+   protected:
     LhsIterator m_lhsIter;
     RhsIterator m_rhsIter;
     const BinaryOp& m_functor;
   };
-  
-  
+
   enum {
-    CoeffReadCost = int(evaluator<LhsArg>::CoeffReadCost) + int(evaluator<RhsArg>::CoeffReadCost) + int(functor_traits<BinaryOp>::Cost),
+    CoeffReadCost = int(evaluator<LhsArg>::CoeffReadCost) + int(evaluator<RhsArg>::CoeffReadCost) +
+                    int(functor_traits<BinaryOp>::Cost),
     Flags = XprType::Flags
   };
-  
+
   explicit sparse_conjunction_evaluator(const XprType& xpr)
-    : m_functor(xpr.functor()),
-      m_lhsImpl(xpr.lhs()), 
-      m_rhsImpl(xpr.rhs())  
-  {
+      : m_functor(xpr.functor()), m_lhsImpl(xpr.lhs()), m_rhsImpl(xpr.rhs()) {
     EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits<BinaryOp>::Cost);
     EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
   }
-  
+
   inline Index nonZerosEstimate() const {
     return (std::min)(m_lhsImpl.nonZerosEstimate(), m_rhsImpl.nonZerosEstimate());
   }
 
-protected:
+ protected:
   const BinaryOp m_functor;
   evaluator<LhsArg> m_lhsImpl;
   evaluator<RhsArg> m_rhsImpl;
 };
 
 // "dense ^ sparse"
-template<typename XprType>
-struct sparse_conjunction_evaluator<XprType, IndexBased, IteratorBased>
-  : evaluator_base<XprType>
-{
-protected:
+template <typename XprType>
+struct sparse_conjunction_evaluator<XprType, IndexBased, IteratorBased> : evaluator_base<XprType> {
+ protected:
   typedef typename XprType::Functor BinaryOp;
   typedef typename XprType::Lhs LhsArg;
   typedef typename XprType::Rhs RhsArg;
   typedef evaluator<LhsArg> LhsEvaluator;
-  typedef typename evaluator<RhsArg>::InnerIterator  RhsIterator;
+  typedef typename evaluator<RhsArg>::InnerIterator RhsIterator;
   typedef typename XprType::StorageIndex StorageIndex;
   typedef typename traits<XprType>::Scalar Scalar;
-public:
 
-  class InnerIterator
-  {
-    enum { IsRowMajor = (int(RhsArg::Flags)&RowMajorBit)==RowMajorBit };
+ public:
+  class InnerIterator {
+    enum { IsRowMajor = (int(RhsArg::Flags) & RowMajorBit) == RowMajorBit };
 
-  public:
-    
+   public:
     EIGEN_STRONG_INLINE InnerIterator(const sparse_conjunction_evaluator& aEval, Index outer)
-      : m_lhsEval(aEval.m_lhsImpl), m_rhsIter(aEval.m_rhsImpl,outer), m_functor(aEval.m_functor), m_outer(outer)
-    {}
+        : m_lhsEval(aEval.m_lhsImpl), m_rhsIter(aEval.m_rhsImpl, outer), m_functor(aEval.m_functor), m_outer(outer) {}
 
-    EIGEN_STRONG_INLINE InnerIterator& operator++()
-    {
+    EIGEN_STRONG_INLINE InnerIterator& operator++() {
       ++m_rhsIter;
       return *this;
     }
 
-    EIGEN_STRONG_INLINE Scalar value() const
-    { return m_functor(m_lhsEval.coeff(IsRowMajor?m_outer:m_rhsIter.index(),IsRowMajor?m_rhsIter.index():m_outer), m_rhsIter.value()); }
+    EIGEN_STRONG_INLINE Scalar value() const {
+      return m_functor(
+          m_lhsEval.coeff(IsRowMajor ? m_outer : m_rhsIter.index(), IsRowMajor ? m_rhsIter.index() : m_outer),
+          m_rhsIter.value());
+    }
 
     EIGEN_STRONG_INLINE StorageIndex index() const { return m_rhsIter.index(); }
     EIGEN_STRONG_INLINE Index outer() const { return m_rhsIter.outer(); }
@@ -532,45 +483,38 @@
     EIGEN_STRONG_INLINE Index col() const { return m_rhsIter.col(); }
 
     EIGEN_STRONG_INLINE operator bool() const { return m_rhsIter; }
-    
-  protected:
-    const LhsEvaluator &m_lhsEval;
+
+   protected:
+    const LhsEvaluator& m_lhsEval;
     RhsIterator m_rhsIter;
     const BinaryOp& m_functor;
     const Index m_outer;
   };
-  
-  
+
   enum {
-    CoeffReadCost = int(evaluator<LhsArg>::CoeffReadCost) + int(evaluator<RhsArg>::CoeffReadCost) + int(functor_traits<BinaryOp>::Cost),
+    CoeffReadCost = int(evaluator<LhsArg>::CoeffReadCost) + int(evaluator<RhsArg>::CoeffReadCost) +
+                    int(functor_traits<BinaryOp>::Cost),
     Flags = XprType::Flags
   };
-  
+
   explicit sparse_conjunction_evaluator(const XprType& xpr)
-    : m_functor(xpr.functor()),
-      m_lhsImpl(xpr.lhs()), 
-      m_rhsImpl(xpr.rhs())  
-  {
+      : m_functor(xpr.functor()), m_lhsImpl(xpr.lhs()), m_rhsImpl(xpr.rhs()) {
     EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits<BinaryOp>::Cost);
     EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
   }
-  
-  inline Index nonZerosEstimate() const {
-    return m_rhsImpl.nonZerosEstimate();
-  }
 
-protected:
+  inline Index nonZerosEstimate() const { return m_rhsImpl.nonZerosEstimate(); }
+
+ protected:
   const BinaryOp m_functor;
   evaluator<LhsArg> m_lhsImpl;
   evaluator<RhsArg> m_rhsImpl;
 };
 
 // "sparse ^ dense"
-template<typename XprType>
-struct sparse_conjunction_evaluator<XprType, IteratorBased, IndexBased>
-  : evaluator_base<XprType>
-{
-protected:
+template <typename XprType>
+struct sparse_conjunction_evaluator<XprType, IteratorBased, IndexBased> : evaluator_base<XprType> {
+ protected:
   typedef typename XprType::Functor BinaryOp;
   typedef typename XprType::Lhs LhsArg;
   typedef typename XprType::Rhs RhsArg;
@@ -578,27 +522,24 @@
   typedef evaluator<RhsArg> RhsEvaluator;
   typedef typename XprType::StorageIndex StorageIndex;
   typedef typename traits<XprType>::Scalar Scalar;
-public:
 
-  class InnerIterator
-  {
-    enum { IsRowMajor = (int(LhsArg::Flags)&RowMajorBit)==RowMajorBit };
+ public:
+  class InnerIterator {
+    enum { IsRowMajor = (int(LhsArg::Flags) & RowMajorBit) == RowMajorBit };
 
-  public:
-    
+   public:
     EIGEN_STRONG_INLINE InnerIterator(const sparse_conjunction_evaluator& aEval, Index outer)
-      : m_lhsIter(aEval.m_lhsImpl,outer), m_rhsEval(aEval.m_rhsImpl), m_functor(aEval.m_functor), m_outer(outer)
-    {}
+        : m_lhsIter(aEval.m_lhsImpl, outer), m_rhsEval(aEval.m_rhsImpl), m_functor(aEval.m_functor), m_outer(outer) {}
 
-    EIGEN_STRONG_INLINE InnerIterator& operator++()
-    {
+    EIGEN_STRONG_INLINE InnerIterator& operator++() {
       ++m_lhsIter;
       return *this;
     }
 
-    EIGEN_STRONG_INLINE Scalar value() const
-    { return m_functor(m_lhsIter.value(),
-                       m_rhsEval.coeff(IsRowMajor?m_outer:m_lhsIter.index(),IsRowMajor?m_lhsIter.index():m_outer)); }
+    EIGEN_STRONG_INLINE Scalar value() const {
+      return m_functor(m_lhsIter.value(), m_rhsEval.coeff(IsRowMajor ? m_outer : m_lhsIter.index(),
+                                                          IsRowMajor ? m_lhsIter.index() : m_outer));
+    }
 
     EIGEN_STRONG_INLINE StorageIndex index() const { return m_lhsIter.index(); }
     EIGEN_STRONG_INLINE Index outer() const { return m_lhsIter.outer(); }
@@ -606,47 +547,42 @@
     EIGEN_STRONG_INLINE Index col() const { return m_lhsIter.col(); }
 
     EIGEN_STRONG_INLINE operator bool() const { return m_lhsIter; }
-    
-  protected:
+
+   protected:
     LhsIterator m_lhsIter;
-    const evaluator<RhsArg> &m_rhsEval;
+    const evaluator<RhsArg>& m_rhsEval;
     const BinaryOp& m_functor;
     const Index m_outer;
   };
-  
-  
+
   enum {
-    CoeffReadCost = int(evaluator<LhsArg>::CoeffReadCost) + int(evaluator<RhsArg>::CoeffReadCost) + int(functor_traits<BinaryOp>::Cost),
+    CoeffReadCost = int(evaluator<LhsArg>::CoeffReadCost) + int(evaluator<RhsArg>::CoeffReadCost) +
+                    int(functor_traits<BinaryOp>::Cost),
     Flags = XprType::Flags
   };
-  
+
   explicit sparse_conjunction_evaluator(const XprType& xpr)
-    : m_functor(xpr.functor()),
-      m_lhsImpl(xpr.lhs()), 
-      m_rhsImpl(xpr.rhs())  
-  {
+      : m_functor(xpr.functor()), m_lhsImpl(xpr.lhs()), m_rhsImpl(xpr.rhs()) {
     EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits<BinaryOp>::Cost);
     EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
   }
-  
-  inline Index nonZerosEstimate() const {
-    return m_lhsImpl.nonZerosEstimate();
-  }
 
-protected:
+  inline Index nonZerosEstimate() const { return m_lhsImpl.nonZerosEstimate(); }
+
+ protected:
   const BinaryOp m_functor;
   evaluator<LhsArg> m_lhsImpl;
   evaluator<RhsArg> m_rhsImpl;
 };
 
-template<typename T,
-    typename LhsKind = typename evaluator_traits<typename T::Lhs>::Kind,
-    typename RhsKind = typename evaluator_traits<typename T::Rhs>::Kind,
-    typename LhsScalar = typename traits<typename T::Lhs>::Scalar,
-    typename RhsScalar = typename traits<typename T::Rhs>::Scalar> struct sparse_disjunction_evaluator;
+template <typename T, typename LhsKind = typename evaluator_traits<typename T::Lhs>::Kind,
+          typename RhsKind = typename evaluator_traits<typename T::Rhs>::Kind,
+          typename LhsScalar = typename traits<typename T::Lhs>::Scalar,
+          typename RhsScalar = typename traits<typename T::Rhs>::Scalar>
+struct sparse_disjunction_evaluator;
 
 // The disjunction "v" evaluator performs a logical "or" or set "union" operation on two input arrays.
-// Given input arrays 'lhs' and 'rhs' and binary functor 'func', 
+// Given input arrays 'lhs' and 'rhs' and binary functor 'func',
 // the sparse destination array 'dst' is evaluated as follows:
 //   if lhs(i,j) and rhs(i,j) are present, dst(i,j) = func(lhs(i,j), rhs(i,j))
 //   if lhs(i,j) is present and rhs(i,j) is null, dst(i,j) = lhs(i,j)
@@ -906,96 +842,97 @@
   typedef sparse_disjunction_evaluator<XprType> Base;
   explicit binary_evaluator(const XprType& xpr) : Base(xpr) {}
 };
-}
+}  // namespace internal
 
 /***************************************************************************
-* Implementation of SparseMatrixBase and SparseCwise functions/operators
-***************************************************************************/
+ * Implementation of SparseMatrixBase and SparseCwise functions/operators
+ ***************************************************************************/
 
-template<typename Derived>
-template<typename OtherDerived>
-Derived& SparseMatrixBase<Derived>::operator+=(const EigenBase<OtherDerived> &other)
-{
-  call_assignment(derived(), other.derived(), internal::add_assign_op<Scalar,typename OtherDerived::Scalar>());
+template <typename Derived>
+template <typename OtherDerived>
+Derived& SparseMatrixBase<Derived>::operator+=(const EigenBase<OtherDerived>& other) {
+  call_assignment(derived(), other.derived(), internal::add_assign_op<Scalar, typename OtherDerived::Scalar>());
   return derived();
 }
 
-template<typename Derived>
-template<typename OtherDerived>
-Derived& SparseMatrixBase<Derived>::operator-=(const EigenBase<OtherDerived> &other)
-{
-  call_assignment(derived(), other.derived(), internal::assign_op<Scalar,typename OtherDerived::Scalar>());
+template <typename Derived>
+template <typename OtherDerived>
+Derived& SparseMatrixBase<Derived>::operator-=(const EigenBase<OtherDerived>& other) {
+  call_assignment(derived(), other.derived(), internal::assign_op<Scalar, typename OtherDerived::Scalar>());
   return derived();
 }
 
-template<typename Derived>
-template<typename OtherDerived>
-EIGEN_STRONG_INLINE Derived &
-SparseMatrixBase<Derived>::operator-=(const SparseMatrixBase<OtherDerived> &other)
-{
+template <typename Derived>
+template <typename OtherDerived>
+EIGEN_STRONG_INLINE Derived& SparseMatrixBase<Derived>::operator-=(const SparseMatrixBase<OtherDerived>& other) {
   return derived() = derived() - other.derived();
 }
 
-template<typename Derived>
-template<typename OtherDerived>
-EIGEN_STRONG_INLINE Derived &
-SparseMatrixBase<Derived>::operator+=(const SparseMatrixBase<OtherDerived>& other)
-{
+template <typename Derived>
+template <typename OtherDerived>
+EIGEN_STRONG_INLINE Derived& SparseMatrixBase<Derived>::operator+=(const SparseMatrixBase<OtherDerived>& other) {
   return derived() = derived() + other.derived();
 }
 
-template<typename Derived>
-template<typename OtherDerived>
-Derived& SparseMatrixBase<Derived>::operator+=(const DiagonalBase<OtherDerived>& other)
-{
-  call_assignment_no_alias(derived(), other.derived(), internal::add_assign_op<Scalar,typename OtherDerived::Scalar>());
+template <typename Derived>
+template <typename OtherDerived>
+Derived& SparseMatrixBase<Derived>::operator+=(const DiagonalBase<OtherDerived>& other) {
+  call_assignment_no_alias(derived(), other.derived(),
+                           internal::add_assign_op<Scalar, typename OtherDerived::Scalar>());
   return derived();
 }
 
-template<typename Derived>
-template<typename OtherDerived>
-Derived& SparseMatrixBase<Derived>::operator-=(const DiagonalBase<OtherDerived>& other)
-{
-  call_assignment_no_alias(derived(), other.derived(), internal::sub_assign_op<Scalar,typename OtherDerived::Scalar>());
+template <typename Derived>
+template <typename OtherDerived>
+Derived& SparseMatrixBase<Derived>::operator-=(const DiagonalBase<OtherDerived>& other) {
+  call_assignment_no_alias(derived(), other.derived(),
+                           internal::sub_assign_op<Scalar, typename OtherDerived::Scalar>());
   return derived();
 }
-    
-template<typename Derived>
-template<typename OtherDerived>
+
+template <typename Derived>
+template <typename OtherDerived>
 EIGEN_STRONG_INLINE const typename SparseMatrixBase<Derived>::template CwiseProductDenseReturnType<OtherDerived>::Type
-SparseMatrixBase<Derived>::cwiseProduct(const MatrixBase<OtherDerived> &other) const
-{
+SparseMatrixBase<Derived>::cwiseProduct(const MatrixBase<OtherDerived>& other) const {
   return typename CwiseProductDenseReturnType<OtherDerived>::Type(derived(), other.derived());
 }
 
-template<typename DenseDerived, typename SparseDerived>
-EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_sum_op<typename DenseDerived::Scalar,typename SparseDerived::Scalar>, const DenseDerived, const SparseDerived>
-operator+(const MatrixBase<DenseDerived> &a, const SparseMatrixBase<SparseDerived> &b)
-{
-  return CwiseBinaryOp<internal::scalar_sum_op<typename DenseDerived::Scalar,typename SparseDerived::Scalar>, const DenseDerived, const SparseDerived>(a.derived(), b.derived());
+template <typename DenseDerived, typename SparseDerived>
+EIGEN_STRONG_INLINE const
+    CwiseBinaryOp<internal::scalar_sum_op<typename DenseDerived::Scalar, typename SparseDerived::Scalar>,
+                  const DenseDerived, const SparseDerived>
+    operator+(const MatrixBase<DenseDerived>& a, const SparseMatrixBase<SparseDerived>& b) {
+  return CwiseBinaryOp<internal::scalar_sum_op<typename DenseDerived::Scalar, typename SparseDerived::Scalar>,
+                       const DenseDerived, const SparseDerived>(a.derived(), b.derived());
 }
 
-template<typename SparseDerived, typename DenseDerived>
-EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_sum_op<typename SparseDerived::Scalar,typename DenseDerived::Scalar>, const SparseDerived, const DenseDerived>
-operator+(const SparseMatrixBase<SparseDerived> &a, const MatrixBase<DenseDerived> &b)
-{
-  return CwiseBinaryOp<internal::scalar_sum_op<typename SparseDerived::Scalar,typename DenseDerived::Scalar>, const SparseDerived, const DenseDerived>(a.derived(), b.derived());
+template <typename SparseDerived, typename DenseDerived>
+EIGEN_STRONG_INLINE const
+    CwiseBinaryOp<internal::scalar_sum_op<typename SparseDerived::Scalar, typename DenseDerived::Scalar>,
+                  const SparseDerived, const DenseDerived>
+    operator+(const SparseMatrixBase<SparseDerived>& a, const MatrixBase<DenseDerived>& b) {
+  return CwiseBinaryOp<internal::scalar_sum_op<typename SparseDerived::Scalar, typename DenseDerived::Scalar>,
+                       const SparseDerived, const DenseDerived>(a.derived(), b.derived());
 }
 
-template<typename DenseDerived, typename SparseDerived>
-EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_difference_op<typename DenseDerived::Scalar,typename SparseDerived::Scalar>, const DenseDerived, const SparseDerived>
-operator-(const MatrixBase<DenseDerived> &a, const SparseMatrixBase<SparseDerived> &b)
-{
-  return CwiseBinaryOp<internal::scalar_difference_op<typename DenseDerived::Scalar,typename SparseDerived::Scalar>, const DenseDerived, const SparseDerived>(a.derived(), b.derived());
+template <typename DenseDerived, typename SparseDerived>
+EIGEN_STRONG_INLINE const
+    CwiseBinaryOp<internal::scalar_difference_op<typename DenseDerived::Scalar, typename SparseDerived::Scalar>,
+                  const DenseDerived, const SparseDerived>
+    operator-(const MatrixBase<DenseDerived>& a, const SparseMatrixBase<SparseDerived>& b) {
+  return CwiseBinaryOp<internal::scalar_difference_op<typename DenseDerived::Scalar, typename SparseDerived::Scalar>,
+                       const DenseDerived, const SparseDerived>(a.derived(), b.derived());
 }
 
-template<typename SparseDerived, typename DenseDerived>
-EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_difference_op<typename SparseDerived::Scalar,typename DenseDerived::Scalar>, const SparseDerived, const DenseDerived>
-operator-(const SparseMatrixBase<SparseDerived> &a, const MatrixBase<DenseDerived> &b)
-{
-  return CwiseBinaryOp<internal::scalar_difference_op<typename SparseDerived::Scalar,typename DenseDerived::Scalar>, const SparseDerived, const DenseDerived>(a.derived(), b.derived());
+template <typename SparseDerived, typename DenseDerived>
+EIGEN_STRONG_INLINE const
+    CwiseBinaryOp<internal::scalar_difference_op<typename SparseDerived::Scalar, typename DenseDerived::Scalar>,
+                  const SparseDerived, const DenseDerived>
+    operator-(const SparseMatrixBase<SparseDerived>& a, const MatrixBase<DenseDerived>& b) {
+  return CwiseBinaryOp<internal::scalar_difference_op<typename SparseDerived::Scalar, typename DenseDerived::Scalar>,
+                       const SparseDerived, const DenseDerived>(a.derived(), b.derived());
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SPARSE_CWISE_BINARY_OP_H
+#endif  // EIGEN_SPARSE_CWISE_BINARY_OP_H
diff --git a/Eigen/src/SparseCore/SparseCwiseUnaryOp.h b/Eigen/src/SparseCore/SparseCwiseUnaryOp.h
index 974b22f..9fc1e66 100644
--- a/Eigen/src/SparseCore/SparseCwiseUnaryOp.h
+++ b/Eigen/src/SparseCore/SparseCwiseUnaryOp.h
@@ -13,141 +13,130 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
-  
-template<typename UnaryOp, typename ArgType>
-struct unary_evaluator<CwiseUnaryOp<UnaryOp,ArgType>, IteratorBased>
-  : public evaluator_base<CwiseUnaryOp<UnaryOp,ArgType> >
-{
-  public:
-    typedef CwiseUnaryOp<UnaryOp, ArgType> XprType;
 
-    class InnerIterator;
-    
-    enum {
-      CoeffReadCost = int(evaluator<ArgType>::CoeffReadCost) + int(functor_traits<UnaryOp>::Cost),
-      Flags = XprType::Flags
-    };
-    
-    explicit unary_evaluator(const XprType& op) : m_functor(op.functor()), m_argImpl(op.nestedExpression())
-    {
-      EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits<UnaryOp>::Cost);
-      EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
-    }
-    
-    inline Index nonZerosEstimate() const {
-      return m_argImpl.nonZerosEstimate();
-    }
+template <typename UnaryOp, typename ArgType>
+struct unary_evaluator<CwiseUnaryOp<UnaryOp, ArgType>, IteratorBased>
+    : public evaluator_base<CwiseUnaryOp<UnaryOp, ArgType> > {
+ public:
+  typedef CwiseUnaryOp<UnaryOp, ArgType> XprType;
 
-  protected:
-    typedef typename evaluator<ArgType>::InnerIterator        EvalIterator;
-    
-    const UnaryOp m_functor;
-    evaluator<ArgType> m_argImpl;
+  class InnerIterator;
+
+  enum {
+    CoeffReadCost = int(evaluator<ArgType>::CoeffReadCost) + int(functor_traits<UnaryOp>::Cost),
+    Flags = XprType::Flags
+  };
+
+  explicit unary_evaluator(const XprType& op) : m_functor(op.functor()), m_argImpl(op.nestedExpression()) {
+    EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits<UnaryOp>::Cost);
+    EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
+  }
+
+  inline Index nonZerosEstimate() const { return m_argImpl.nonZerosEstimate(); }
+
+ protected:
+  typedef typename evaluator<ArgType>::InnerIterator EvalIterator;
+
+  const UnaryOp m_functor;
+  evaluator<ArgType> m_argImpl;
 };
 
-template<typename UnaryOp, typename ArgType>
-class unary_evaluator<CwiseUnaryOp<UnaryOp,ArgType>, IteratorBased>::InnerIterator
-    : public unary_evaluator<CwiseUnaryOp<UnaryOp,ArgType>, IteratorBased>::EvalIterator
-{
-  protected:
-    typedef typename XprType::Scalar Scalar;
-    typedef typename unary_evaluator<CwiseUnaryOp<UnaryOp,ArgType>, IteratorBased>::EvalIterator Base;
-  public:
+template <typename UnaryOp, typename ArgType>
+class unary_evaluator<CwiseUnaryOp<UnaryOp, ArgType>, IteratorBased>::InnerIterator
+    : public unary_evaluator<CwiseUnaryOp<UnaryOp, ArgType>, IteratorBased>::EvalIterator {
+ protected:
+  typedef typename XprType::Scalar Scalar;
+  typedef typename unary_evaluator<CwiseUnaryOp<UnaryOp, ArgType>, IteratorBased>::EvalIterator Base;
 
-    EIGEN_STRONG_INLINE InnerIterator(const unary_evaluator& unaryOp, Index outer)
-      : Base(unaryOp.m_argImpl,outer), m_functor(unaryOp.m_functor)
-    {}
+ public:
+  EIGEN_STRONG_INLINE InnerIterator(const unary_evaluator& unaryOp, Index outer)
+      : Base(unaryOp.m_argImpl, outer), m_functor(unaryOp.m_functor) {}
 
-    EIGEN_STRONG_INLINE InnerIterator& operator++()
-    { Base::operator++(); return *this; }
+  EIGEN_STRONG_INLINE InnerIterator& operator++() {
+    Base::operator++();
+    return *this;
+  }
 
-    EIGEN_STRONG_INLINE Scalar value() const { return m_functor(Base::value()); }
+  EIGEN_STRONG_INLINE Scalar value() const { return m_functor(Base::value()); }
 
-  protected:
-    const UnaryOp m_functor;
-  private:
-    Scalar& valueRef();
+ protected:
+  const UnaryOp m_functor;
+
+ private:
+  Scalar& valueRef();
 };
 
-template<typename ViewOp, typename ArgType>
-struct unary_evaluator<CwiseUnaryView<ViewOp,ArgType>, IteratorBased>
-  : public evaluator_base<CwiseUnaryView<ViewOp,ArgType> >
-{
-  public:
-    typedef CwiseUnaryView<ViewOp, ArgType> XprType;
+template <typename ViewOp, typename ArgType>
+struct unary_evaluator<CwiseUnaryView<ViewOp, ArgType>, IteratorBased>
+    : public evaluator_base<CwiseUnaryView<ViewOp, ArgType> > {
+ public:
+  typedef CwiseUnaryView<ViewOp, ArgType> XprType;
 
-    class InnerIterator;
-    
-    enum {
-      CoeffReadCost = int(evaluator<ArgType>::CoeffReadCost) + int(functor_traits<ViewOp>::Cost),
-      Flags = XprType::Flags
-    };
-    
-    explicit unary_evaluator(const XprType& op) : m_functor(op.functor()), m_argImpl(op.nestedExpression())
-    {
-      EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits<ViewOp>::Cost);
-      EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
-    }
+  class InnerIterator;
 
-  protected:
-    typedef typename evaluator<ArgType>::InnerIterator        EvalIterator;
-    
-    const ViewOp m_functor;
-    evaluator<ArgType> m_argImpl;
+  enum {
+    CoeffReadCost = int(evaluator<ArgType>::CoeffReadCost) + int(functor_traits<ViewOp>::Cost),
+    Flags = XprType::Flags
+  };
+
+  explicit unary_evaluator(const XprType& op) : m_functor(op.functor()), m_argImpl(op.nestedExpression()) {
+    EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits<ViewOp>::Cost);
+    EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
+  }
+
+ protected:
+  typedef typename evaluator<ArgType>::InnerIterator EvalIterator;
+
+  const ViewOp m_functor;
+  evaluator<ArgType> m_argImpl;
 };
 
-template<typename ViewOp, typename ArgType>
-class unary_evaluator<CwiseUnaryView<ViewOp,ArgType>, IteratorBased>::InnerIterator
-    : public unary_evaluator<CwiseUnaryView<ViewOp,ArgType>, IteratorBased>::EvalIterator
-{
-  protected:
-    typedef typename XprType::Scalar Scalar;
-    typedef typename unary_evaluator<CwiseUnaryView<ViewOp,ArgType>, IteratorBased>::EvalIterator Base;
-  public:
+template <typename ViewOp, typename ArgType>
+class unary_evaluator<CwiseUnaryView<ViewOp, ArgType>, IteratorBased>::InnerIterator
+    : public unary_evaluator<CwiseUnaryView<ViewOp, ArgType>, IteratorBased>::EvalIterator {
+ protected:
+  typedef typename XprType::Scalar Scalar;
+  typedef typename unary_evaluator<CwiseUnaryView<ViewOp, ArgType>, IteratorBased>::EvalIterator Base;
 
-    EIGEN_STRONG_INLINE InnerIterator(const unary_evaluator& unaryOp, Index outer)
-      : Base(unaryOp.m_argImpl,outer), m_functor(unaryOp.m_functor)
-    {}
+ public:
+  EIGEN_STRONG_INLINE InnerIterator(const unary_evaluator& unaryOp, Index outer)
+      : Base(unaryOp.m_argImpl, outer), m_functor(unaryOp.m_functor) {}
 
-    EIGEN_STRONG_INLINE InnerIterator& operator++()
-    { Base::operator++(); return *this; }
+  EIGEN_STRONG_INLINE InnerIterator& operator++() {
+    Base::operator++();
+    return *this;
+  }
 
-    EIGEN_STRONG_INLINE Scalar value() const { return m_functor(Base::value()); }
-    EIGEN_STRONG_INLINE Scalar& valueRef() { return m_functor(Base::valueRef()); }
+  EIGEN_STRONG_INLINE Scalar value() const { return m_functor(Base::value()); }
+  EIGEN_STRONG_INLINE Scalar& valueRef() { return m_functor(Base::valueRef()); }
 
-  protected:
-    const ViewOp m_functor;
+ protected:
+  const ViewOp m_functor;
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-template<typename Derived>
-EIGEN_STRONG_INLINE Derived&
-SparseMatrixBase<Derived>::operator*=(const Scalar& other)
-{
+template <typename Derived>
+EIGEN_STRONG_INLINE Derived& SparseMatrixBase<Derived>::operator*=(const Scalar& other) {
   typedef typename internal::evaluator<Derived>::InnerIterator EvalIterator;
   internal::evaluator<Derived> thisEval(derived());
-  for (Index j=0; j<outerSize(); ++j)
-    for (EvalIterator i(thisEval,j); i; ++i)
-      i.valueRef() *= other;
+  for (Index j = 0; j < outerSize(); ++j)
+    for (EvalIterator i(thisEval, j); i; ++i) i.valueRef() *= other;
   return derived();
 }
 
-template<typename Derived>
-EIGEN_STRONG_INLINE Derived&
-SparseMatrixBase<Derived>::operator/=(const Scalar& other)
-{
+template <typename Derived>
+EIGEN_STRONG_INLINE Derived& SparseMatrixBase<Derived>::operator/=(const Scalar& other) {
   typedef typename internal::evaluator<Derived>::InnerIterator EvalIterator;
   internal::evaluator<Derived> thisEval(derived());
-  for (Index j=0; j<outerSize(); ++j)
-    for (EvalIterator i(thisEval,j); i; ++i)
-      i.valueRef() /= other;
+  for (Index j = 0; j < outerSize(); ++j)
+    for (EvalIterator i(thisEval, j); i; ++i) i.valueRef() /= other;
   return derived();
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SPARSE_CWISE_UNARY_OP_H
+#endif  // EIGEN_SPARSE_CWISE_UNARY_OP_H
diff --git a/Eigen/src/SparseCore/SparseDenseProduct.h b/Eigen/src/SparseCore/SparseDenseProduct.h
index 6c3cd29..db70810 100644
--- a/Eigen/src/SparseCore/SparseDenseProduct.h
+++ b/Eigen/src/SparseCore/SparseDenseProduct.h
@@ -13,73 +13,72 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
-template <> struct product_promote_storage_type<Sparse,Dense, OuterProduct> { typedef Sparse ret; };
-template <> struct product_promote_storage_type<Dense,Sparse, OuterProduct> { typedef Sparse ret; };
+template <>
+struct product_promote_storage_type<Sparse, Dense, OuterProduct> {
+  typedef Sparse ret;
+};
+template <>
+struct product_promote_storage_type<Dense, Sparse, OuterProduct> {
+  typedef Sparse ret;
+};
 
-template<typename SparseLhsType, typename DenseRhsType, typename DenseResType,
-         typename AlphaType,
-         int LhsStorageOrder = ((SparseLhsType::Flags&RowMajorBit)==RowMajorBit) ? RowMajor : ColMajor,
-         bool ColPerCol = ((DenseRhsType::Flags&RowMajorBit)==0) || DenseRhsType::ColsAtCompileTime==1>
+template <typename SparseLhsType, typename DenseRhsType, typename DenseResType, typename AlphaType,
+          int LhsStorageOrder = ((SparseLhsType::Flags & RowMajorBit) == RowMajorBit) ? RowMajor : ColMajor,
+          bool ColPerCol = ((DenseRhsType::Flags & RowMajorBit) == 0) || DenseRhsType::ColsAtCompileTime == 1>
 struct sparse_time_dense_product_impl;
 
-template<typename SparseLhsType, typename DenseRhsType, typename DenseResType>
-struct sparse_time_dense_product_impl<SparseLhsType,DenseRhsType,DenseResType, typename DenseResType::Scalar, RowMajor, true>
-{
+template <typename SparseLhsType, typename DenseRhsType, typename DenseResType>
+struct sparse_time_dense_product_impl<SparseLhsType, DenseRhsType, DenseResType, typename DenseResType::Scalar,
+                                      RowMajor, true> {
   typedef internal::remove_all_t<SparseLhsType> Lhs;
   typedef internal::remove_all_t<DenseRhsType> Rhs;
   typedef internal::remove_all_t<DenseResType> Res;
   typedef typename evaluator<Lhs>::InnerIterator LhsInnerIterator;
   typedef evaluator<Lhs> LhsEval;
-  static void run(const SparseLhsType& lhs, const DenseRhsType& rhs, DenseResType& res, const typename Res::Scalar& alpha)
-  {
+  static void run(const SparseLhsType& lhs, const DenseRhsType& rhs, DenseResType& res,
+                  const typename Res::Scalar& alpha) {
     LhsEval lhsEval(lhs);
-    
+
     Index n = lhs.outerSize();
 #ifdef EIGEN_HAS_OPENMP
     Eigen::initParallel();
     Index threads = Eigen::nbThreads();
 #endif
-    
-    for(Index c=0; c<rhs.cols(); ++c)
-    {
+
+    for (Index c = 0; c < rhs.cols(); ++c) {
 #ifdef EIGEN_HAS_OPENMP
       // This 20000 threshold has been found experimentally on 2D and 3D Poisson problems.
       // It basically represents the minimal amount of work to be done to be worth it.
-      if(threads>1 && lhsEval.nonZerosEstimate() > 20000)
-      {
-        #pragma omp parallel for schedule(dynamic,(n+threads*4-1)/(threads*4)) num_threads(threads)
-        for(Index i=0; i<n; ++i)
-          processRow(lhsEval,rhs,res,alpha,i,c);
-      }
-      else
+      if (threads > 1 && lhsEval.nonZerosEstimate() > 20000) {
+#pragma omp parallel for schedule(dynamic, (n + threads * 4 - 1) / (threads * 4)) num_threads(threads)
+        for (Index i = 0; i < n; ++i) processRow(lhsEval, rhs, res, alpha, i, c);
+      } else
 #endif
       {
-        for(Index i=0; i<n; ++i)
-          processRow(lhsEval,rhs,res,alpha,i,c);
+        for (Index i = 0; i < n; ++i) processRow(lhsEval, rhs, res, alpha, i, c);
       }
     }
   }
-  
-  static void processRow(const LhsEval& lhsEval, const DenseRhsType& rhs, DenseResType& res, const typename Res::Scalar& alpha, Index i, Index col)
-  {
+
+  static void processRow(const LhsEval& lhsEval, const DenseRhsType& rhs, DenseResType& res,
+                         const typename Res::Scalar& alpha, Index i, Index col) {
     // Two accumulators, which breaks the dependency chain on the accumulator
     // and allows more instruction-level parallelism in the following loop
     typename Res::Scalar tmp_a(0);
     typename Res::Scalar tmp_b(0);
-    for(LhsInnerIterator it(lhsEval,i); it ;++it) {
+    for (LhsInnerIterator it(lhsEval, i); it; ++it) {
       tmp_a += it.value() * rhs.coeff(it.index(), col);
       ++it;
-      if(it) {
+      if (it) {
         tmp_b += it.value() * rhs.coeff(it.index(), col);
       }
     }
     res.coeffRef(i, col) += alpha * (tmp_a + tmp_b);
   }
-  
 };
 
 // FIXME: what is the purpose of the following specialization? Is it for the BlockedSparse format?
@@ -93,40 +92,35 @@
 //   typedef typename CwiseUnaryOp<scalar_multiple2_op<T1, typename T2::Scalar>, T2>::PlainObject ReturnType;
 // };
 
-template<typename SparseLhsType, typename DenseRhsType, typename DenseResType, typename AlphaType>
-struct sparse_time_dense_product_impl<SparseLhsType,DenseRhsType,DenseResType, AlphaType, ColMajor, true>
-{
+template <typename SparseLhsType, typename DenseRhsType, typename DenseResType, typename AlphaType>
+struct sparse_time_dense_product_impl<SparseLhsType, DenseRhsType, DenseResType, AlphaType, ColMajor, true> {
   typedef internal::remove_all_t<SparseLhsType> Lhs;
   typedef internal::remove_all_t<DenseRhsType> Rhs;
   typedef internal::remove_all_t<DenseResType> Res;
   typedef evaluator<Lhs> LhsEval;
   typedef typename LhsEval::InnerIterator LhsInnerIterator;
-  static void run(const SparseLhsType& lhs, const DenseRhsType& rhs, DenseResType& res, const AlphaType& alpha)
-  {
+  static void run(const SparseLhsType& lhs, const DenseRhsType& rhs, DenseResType& res, const AlphaType& alpha) {
     LhsEval lhsEval(lhs);
-    for(Index c=0; c<rhs.cols(); ++c)
-    {
-      for(Index j=0; j<lhs.outerSize(); ++j)
-      {
-//        typename Res::Scalar rhs_j = alpha * rhs.coeff(j,c);
-        typename ScalarBinaryOpTraits<AlphaType, typename Rhs::Scalar>::ReturnType rhs_j(alpha * rhs.coeff(j,c));
-        for(LhsInnerIterator it(lhsEval,j); it ;++it)
-          res.coeffRef(it.index(),c) += it.value() * rhs_j;
+    for (Index c = 0; c < rhs.cols(); ++c) {
+      for (Index j = 0; j < lhs.outerSize(); ++j) {
+        //        typename Res::Scalar rhs_j = alpha * rhs.coeff(j,c);
+        typename ScalarBinaryOpTraits<AlphaType, typename Rhs::Scalar>::ReturnType rhs_j(alpha * rhs.coeff(j, c));
+        for (LhsInnerIterator it(lhsEval, j); it; ++it) res.coeffRef(it.index(), c) += it.value() * rhs_j;
       }
     }
   }
 };
 
-template<typename SparseLhsType, typename DenseRhsType, typename DenseResType>
-struct sparse_time_dense_product_impl<SparseLhsType,DenseRhsType,DenseResType, typename DenseResType::Scalar, RowMajor, false>
-{
+template <typename SparseLhsType, typename DenseRhsType, typename DenseResType>
+struct sparse_time_dense_product_impl<SparseLhsType, DenseRhsType, DenseResType, typename DenseResType::Scalar,
+                                      RowMajor, false> {
   typedef internal::remove_all_t<SparseLhsType> Lhs;
   typedef internal::remove_all_t<DenseRhsType> Rhs;
   typedef internal::remove_all_t<DenseResType> Res;
   typedef evaluator<Lhs> LhsEval;
   typedef typename LhsEval::InnerIterator LhsInnerIterator;
-  static void run(const SparseLhsType& lhs, const DenseRhsType& rhs, DenseResType& res, const typename Res::Scalar& alpha)
-  {
+  static void run(const SparseLhsType& lhs, const DenseRhsType& rhs, DenseResType& res,
+                  const typename Res::Scalar& alpha) {
     Index n = lhs.rows();
     LhsEval lhsEval(lhs);
 
@@ -135,219 +129,188 @@
     Index threads = Eigen::nbThreads();
     // This 20000 threshold has been found experimentally on 2D and 3D Poisson problems.
     // It basically represents the minimal amount of work to be done to be worth it.
-    if(threads>1 && lhsEval.nonZerosEstimate()*rhs.cols() > 20000)
-    {
-      #pragma omp parallel for schedule(dynamic,(n+threads*4-1)/(threads*4)) num_threads(threads)
-      for(Index i=0; i<n; ++i)
-        processRow(lhsEval,rhs,res,alpha,i);
-    }
-    else
+    if (threads > 1 && lhsEval.nonZerosEstimate() * rhs.cols() > 20000) {
+#pragma omp parallel for schedule(dynamic, (n + threads * 4 - 1) / (threads * 4)) num_threads(threads)
+      for (Index i = 0; i < n; ++i) processRow(lhsEval, rhs, res, alpha, i);
+    } else
 #endif
     {
-      for(Index i=0; i<n; ++i)
-        processRow(lhsEval, rhs, res, alpha, i);
+      for (Index i = 0; i < n; ++i) processRow(lhsEval, rhs, res, alpha, i);
     }
   }
 
-  static void processRow(const LhsEval& lhsEval, const DenseRhsType& rhs, Res& res, const typename Res::Scalar& alpha, Index i)
-  {
+  static void processRow(const LhsEval& lhsEval, const DenseRhsType& rhs, Res& res, const typename Res::Scalar& alpha,
+                         Index i) {
     typename Res::RowXpr res_i(res.row(i));
-    for(LhsInnerIterator it(lhsEval,i); it ;++it)
-      res_i += (alpha*it.value()) * rhs.row(it.index());
+    for (LhsInnerIterator it(lhsEval, i); it; ++it) res_i += (alpha * it.value()) * rhs.row(it.index());
   }
 };
 
-template<typename SparseLhsType, typename DenseRhsType, typename DenseResType>
-struct sparse_time_dense_product_impl<SparseLhsType,DenseRhsType,DenseResType, typename DenseResType::Scalar, ColMajor, false>
-{
+template <typename SparseLhsType, typename DenseRhsType, typename DenseResType>
+struct sparse_time_dense_product_impl<SparseLhsType, DenseRhsType, DenseResType, typename DenseResType::Scalar,
+                                      ColMajor, false> {
   typedef internal::remove_all_t<SparseLhsType> Lhs;
   typedef internal::remove_all_t<DenseRhsType> Rhs;
   typedef internal::remove_all_t<DenseResType> Res;
   typedef typename evaluator<Lhs>::InnerIterator LhsInnerIterator;
-  static void run(const SparseLhsType& lhs, const DenseRhsType& rhs, DenseResType& res, const typename Res::Scalar& alpha)
-  {
+  static void run(const SparseLhsType& lhs, const DenseRhsType& rhs, DenseResType& res,
+                  const typename Res::Scalar& alpha) {
     evaluator<Lhs> lhsEval(lhs);
-    for(Index j=0; j<lhs.outerSize(); ++j)
-    {
+    for (Index j = 0; j < lhs.outerSize(); ++j) {
       typename Rhs::ConstRowXpr rhs_j(rhs.row(j));
-      for(LhsInnerIterator it(lhsEval,j); it ;++it)
-        res.row(it.index()) += (alpha*it.value()) * rhs_j;
+      for (LhsInnerIterator it(lhsEval, j); it; ++it) res.row(it.index()) += (alpha * it.value()) * rhs_j;
     }
   }
 };
 
-template<typename SparseLhsType, typename DenseRhsType, typename DenseResType,typename AlphaType>
-inline void sparse_time_dense_product(const SparseLhsType& lhs, const DenseRhsType& rhs, DenseResType& res, const AlphaType& alpha)
-{
-  sparse_time_dense_product_impl<SparseLhsType,DenseRhsType,DenseResType, AlphaType>::run(lhs, rhs, res, alpha);
+template <typename SparseLhsType, typename DenseRhsType, typename DenseResType, typename AlphaType>
+inline void sparse_time_dense_product(const SparseLhsType& lhs, const DenseRhsType& rhs, DenseResType& res,
+                                      const AlphaType& alpha) {
+  sparse_time_dense_product_impl<SparseLhsType, DenseRhsType, DenseResType, AlphaType>::run(lhs, rhs, res, alpha);
 }
 
-} // end namespace internal
+}  // end namespace internal
 
 namespace internal {
 
-template<typename Lhs, typename Rhs, int ProductType>
+template <typename Lhs, typename Rhs, int ProductType>
 struct generic_product_impl<Lhs, Rhs, SparseShape, DenseShape, ProductType>
- : generic_product_impl_base<Lhs,Rhs,generic_product_impl<Lhs,Rhs,SparseShape,DenseShape,ProductType> >
-{
-  typedef typename Product<Lhs,Rhs>::Scalar Scalar;
-  
-  template<typename Dest>
-  static void scaleAndAddTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha)
-  {
-    typedef typename nested_eval<Lhs,((Rhs::Flags&RowMajorBit)==0) ? 1 : Rhs::ColsAtCompileTime>::type LhsNested;
-    typedef typename nested_eval<Rhs,((Lhs::Flags&RowMajorBit)==0) ? 1 : Dynamic>::type RhsNested;
+    : generic_product_impl_base<Lhs, Rhs, generic_product_impl<Lhs, Rhs, SparseShape, DenseShape, ProductType> > {
+  typedef typename Product<Lhs, Rhs>::Scalar Scalar;
+
+  template <typename Dest>
+  static void scaleAndAddTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha) {
+    typedef typename nested_eval<Lhs, ((Rhs::Flags & RowMajorBit) == 0) ? 1 : Rhs::ColsAtCompileTime>::type LhsNested;
+    typedef typename nested_eval<Rhs, ((Lhs::Flags & RowMajorBit) == 0) ? 1 : Dynamic>::type RhsNested;
     LhsNested lhsNested(lhs);
     RhsNested rhsNested(rhs);
     internal::sparse_time_dense_product(lhsNested, rhsNested, dst, alpha);
   }
 };
 
-template<typename Lhs, typename Rhs, int ProductType>
+template <typename Lhs, typename Rhs, int ProductType>
 struct generic_product_impl<Lhs, Rhs, SparseTriangularShape, DenseShape, ProductType>
-  : generic_product_impl<Lhs, Rhs, SparseShape, DenseShape, ProductType>
-{};
+    : generic_product_impl<Lhs, Rhs, SparseShape, DenseShape, ProductType> {};
 
-template<typename Lhs, typename Rhs, int ProductType>
+template <typename Lhs, typename Rhs, int ProductType>
 struct generic_product_impl<Lhs, Rhs, DenseShape, SparseShape, ProductType>
-  : generic_product_impl_base<Lhs,Rhs,generic_product_impl<Lhs,Rhs,DenseShape,SparseShape,ProductType> >
-{
-  typedef typename Product<Lhs,Rhs>::Scalar Scalar;
-  
-  template<typename Dst>
-  static void scaleAndAddTo(Dst& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha)
-  {
-    typedef typename nested_eval<Lhs,((Rhs::Flags&RowMajorBit)==0) ? Dynamic : 1>::type LhsNested;
-    typedef typename nested_eval<Rhs,((Lhs::Flags&RowMajorBit)==RowMajorBit) ? 1 : Lhs::RowsAtCompileTime>::type RhsNested;
+    : generic_product_impl_base<Lhs, Rhs, generic_product_impl<Lhs, Rhs, DenseShape, SparseShape, ProductType> > {
+  typedef typename Product<Lhs, Rhs>::Scalar Scalar;
+
+  template <typename Dst>
+  static void scaleAndAddTo(Dst& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha) {
+    typedef typename nested_eval<Lhs, ((Rhs::Flags & RowMajorBit) == 0) ? Dynamic : 1>::type LhsNested;
+    typedef typename nested_eval<Rhs, ((Lhs::Flags & RowMajorBit) == RowMajorBit) ? 1 : Lhs::RowsAtCompileTime>::type
+        RhsNested;
     LhsNested lhsNested(lhs);
     RhsNested rhsNested(rhs);
-    
+
     // transpose everything
     Transpose<Dst> dstT(dst);
     internal::sparse_time_dense_product(rhsNested.transpose(), lhsNested.transpose(), dstT, alpha);
   }
 };
 
-template<typename Lhs, typename Rhs, int ProductType>
+template <typename Lhs, typename Rhs, int ProductType>
 struct generic_product_impl<Lhs, Rhs, DenseShape, SparseTriangularShape, ProductType>
-  : generic_product_impl<Lhs, Rhs, DenseShape, SparseShape, ProductType>
-{};
+    : generic_product_impl<Lhs, Rhs, DenseShape, SparseShape, ProductType> {};
 
-template<typename LhsT, typename RhsT, bool NeedToTranspose>
-struct sparse_dense_outer_product_evaluator
-{
-protected:
-  typedef std::conditional_t<NeedToTranspose,RhsT,LhsT> Lhs1;
-  typedef std::conditional_t<NeedToTranspose,LhsT,RhsT> ActualRhs;
-  typedef Product<LhsT,RhsT,DefaultProduct> ProdXprType;
-  
+template <typename LhsT, typename RhsT, bool NeedToTranspose>
+struct sparse_dense_outer_product_evaluator {
+ protected:
+  typedef std::conditional_t<NeedToTranspose, RhsT, LhsT> Lhs1;
+  typedef std::conditional_t<NeedToTranspose, LhsT, RhsT> ActualRhs;
+  typedef Product<LhsT, RhsT, DefaultProduct> ProdXprType;
+
   // if the actual left-hand side is a dense vector,
   // then build a sparse-view so that we can seamlessly iterate over it.
-  typedef std::conditional_t<is_same<typename internal::traits<Lhs1>::StorageKind,Sparse>::value,
-            Lhs1, SparseView<Lhs1> > ActualLhs;
-  typedef std::conditional_t<is_same<typename internal::traits<Lhs1>::StorageKind,Sparse>::value,
-            Lhs1 const&, SparseView<Lhs1> > LhsArg;
-            
+  typedef std::conditional_t<is_same<typename internal::traits<Lhs1>::StorageKind, Sparse>::value, Lhs1,
+                             SparseView<Lhs1> >
+      ActualLhs;
+  typedef std::conditional_t<is_same<typename internal::traits<Lhs1>::StorageKind, Sparse>::value, Lhs1 const&,
+                             SparseView<Lhs1> >
+      LhsArg;
+
   typedef evaluator<ActualLhs> LhsEval;
   typedef evaluator<ActualRhs> RhsEval;
   typedef typename evaluator<ActualLhs>::InnerIterator LhsIterator;
   typedef typename ProdXprType::Scalar Scalar;
-  
-public:
-  enum {
-    Flags = NeedToTranspose ? RowMajorBit : 0,
-    CoeffReadCost = HugeCost
-  };
-  
-  class InnerIterator : public LhsIterator
-  {
-  public:
-    InnerIterator(const sparse_dense_outer_product_evaluator &xprEval, Index outer)
-      : LhsIterator(xprEval.m_lhsXprImpl, 0),
-        m_outer(outer),
-        m_empty(false),
-        m_factor(get(xprEval.m_rhsXprImpl, outer, typename internal::traits<ActualRhs>::StorageKind() ))
-    {}
-    
+
+ public:
+  enum { Flags = NeedToTranspose ? RowMajorBit : 0, CoeffReadCost = HugeCost };
+
+  class InnerIterator : public LhsIterator {
+   public:
+    InnerIterator(const sparse_dense_outer_product_evaluator& xprEval, Index outer)
+        : LhsIterator(xprEval.m_lhsXprImpl, 0),
+          m_outer(outer),
+          m_empty(false),
+          m_factor(get(xprEval.m_rhsXprImpl, outer, typename internal::traits<ActualRhs>::StorageKind())) {}
+
     EIGEN_STRONG_INLINE Index outer() const { return m_outer; }
-    EIGEN_STRONG_INLINE Index row()   const { return NeedToTranspose ? m_outer : LhsIterator::index(); }
-    EIGEN_STRONG_INLINE Index col()   const { return NeedToTranspose ? LhsIterator::index() : m_outer; }
+    EIGEN_STRONG_INLINE Index row() const { return NeedToTranspose ? m_outer : LhsIterator::index(); }
+    EIGEN_STRONG_INLINE Index col() const { return NeedToTranspose ? LhsIterator::index() : m_outer; }
 
     EIGEN_STRONG_INLINE Scalar value() const { return LhsIterator::value() * m_factor; }
     EIGEN_STRONG_INLINE operator bool() const { return LhsIterator::operator bool() && (!m_empty); }
-    
-  protected:
-    Scalar get(const RhsEval &rhs, Index outer, Dense = Dense()) const
-    {
-      return rhs.coeff(outer);
-    }
-    
-    Scalar get(const RhsEval &rhs, Index outer, Sparse = Sparse())
-    {
+
+   protected:
+    Scalar get(const RhsEval& rhs, Index outer, Dense = Dense()) const { return rhs.coeff(outer); }
+
+    Scalar get(const RhsEval& rhs, Index outer, Sparse = Sparse()) {
       typename RhsEval::InnerIterator it(rhs, outer);
-      if (it && it.index()==0 && it.value()!=Scalar(0))
-        return it.value();
+      if (it && it.index() == 0 && it.value() != Scalar(0)) return it.value();
       m_empty = true;
       return Scalar(0);
     }
-    
+
     Index m_outer;
     bool m_empty;
     Scalar m_factor;
   };
-  
-  sparse_dense_outer_product_evaluator(const Lhs1 &lhs, const ActualRhs &rhs)
-     : m_lhs(lhs), m_lhsXprImpl(m_lhs), m_rhsXprImpl(rhs)
-  {
+
+  sparse_dense_outer_product_evaluator(const Lhs1& lhs, const ActualRhs& rhs)
+      : m_lhs(lhs), m_lhsXprImpl(m_lhs), m_rhsXprImpl(rhs) {
     EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
   }
-  
+
   // transpose case
-  sparse_dense_outer_product_evaluator(const ActualRhs &rhs, const Lhs1 &lhs)
-     : m_lhs(lhs), m_lhsXprImpl(m_lhs), m_rhsXprImpl(rhs)
-  {
+  sparse_dense_outer_product_evaluator(const ActualRhs& rhs, const Lhs1& lhs)
+      : m_lhs(lhs), m_lhsXprImpl(m_lhs), m_rhsXprImpl(rhs) {
     EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
   }
-    
-protected:
+
+ protected:
   const LhsArg m_lhs;
   evaluator<ActualLhs> m_lhsXprImpl;
   evaluator<ActualRhs> m_rhsXprImpl;
 };
 
 // sparse * dense outer product
-template<typename Lhs, typename Rhs>
+template <typename Lhs, typename Rhs>
 struct product_evaluator<Product<Lhs, Rhs, DefaultProduct>, OuterProduct, SparseShape, DenseShape>
-  : sparse_dense_outer_product_evaluator<Lhs,Rhs, Lhs::IsRowMajor>
-{
-  typedef sparse_dense_outer_product_evaluator<Lhs,Rhs, Lhs::IsRowMajor> Base;
-  
+    : sparse_dense_outer_product_evaluator<Lhs, Rhs, Lhs::IsRowMajor> {
+  typedef sparse_dense_outer_product_evaluator<Lhs, Rhs, Lhs::IsRowMajor> Base;
+
   typedef Product<Lhs, Rhs> XprType;
   typedef typename XprType::PlainObject PlainObject;
 
-  explicit product_evaluator(const XprType& xpr)
-    : Base(xpr.lhs(), xpr.rhs())
-  {}
-  
+  explicit product_evaluator(const XprType& xpr) : Base(xpr.lhs(), xpr.rhs()) {}
 };
 
-template<typename Lhs, typename Rhs>
+template <typename Lhs, typename Rhs>
 struct product_evaluator<Product<Lhs, Rhs, DefaultProduct>, OuterProduct, DenseShape, SparseShape>
-  : sparse_dense_outer_product_evaluator<Lhs,Rhs, Rhs::IsRowMajor>
-{
-  typedef sparse_dense_outer_product_evaluator<Lhs,Rhs, Rhs::IsRowMajor> Base;
-  
+    : sparse_dense_outer_product_evaluator<Lhs, Rhs, Rhs::IsRowMajor> {
+  typedef sparse_dense_outer_product_evaluator<Lhs, Rhs, Rhs::IsRowMajor> Base;
+
   typedef Product<Lhs, Rhs> XprType;
   typedef typename XprType::PlainObject PlainObject;
 
-  explicit product_evaluator(const XprType& xpr)
-    : Base(xpr.lhs(), xpr.rhs())
-  {}
-  
+  explicit product_evaluator(const XprType& xpr) : Base(xpr.lhs(), xpr.rhs()) {}
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SPARSEDENSEPRODUCT_H
+#endif  // EIGEN_SPARSEDENSEPRODUCT_H
diff --git a/Eigen/src/SparseCore/SparseDiagonalProduct.h b/Eigen/src/SparseCore/SparseDiagonalProduct.h
index 49bc851..1f72a6b 100644
--- a/Eigen/src/SparseCore/SparseDiagonalProduct.h
+++ b/Eigen/src/SparseCore/SparseDiagonalProduct.h
@@ -13,7 +13,7 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 // The product of a diagonal matrix with a sparse matrix can be easily
 // implemented using expression template.
@@ -29,113 +29,110 @@
 
 namespace internal {
 
-enum {
-  SDP_AsScalarProduct,
-  SDP_AsCwiseProduct
-};
-  
-template<typename SparseXprType, typename DiagonalCoeffType, int SDP_Tag>
+enum { SDP_AsScalarProduct, SDP_AsCwiseProduct };
+
+template <typename SparseXprType, typename DiagonalCoeffType, int SDP_Tag>
 struct sparse_diagonal_product_evaluator;
 
-template<typename Lhs, typename Rhs, int ProductTag>
+template <typename Lhs, typename Rhs, int ProductTag>
 struct product_evaluator<Product<Lhs, Rhs, DefaultProduct>, ProductTag, DiagonalShape, SparseShape>
-  : public sparse_diagonal_product_evaluator<Rhs, typename Lhs::DiagonalVectorType, Rhs::Flags&RowMajorBit?SDP_AsScalarProduct:SDP_AsCwiseProduct>
-{
+    : public sparse_diagonal_product_evaluator<Rhs, typename Lhs::DiagonalVectorType,
+                                               Rhs::Flags & RowMajorBit ? SDP_AsScalarProduct : SDP_AsCwiseProduct> {
   typedef Product<Lhs, Rhs, DefaultProduct> XprType;
-  enum { CoeffReadCost = HugeCost, Flags = Rhs::Flags&RowMajorBit, Alignment = 0 }; // FIXME CoeffReadCost & Flags
-  
-  typedef sparse_diagonal_product_evaluator<Rhs, typename Lhs::DiagonalVectorType, Rhs::Flags&RowMajorBit?SDP_AsScalarProduct:SDP_AsCwiseProduct> Base;
-  explicit product_evaluator(const XprType& xpr) : Base(xpr.rhs(), xpr.lhs().diagonal()) {}
+  enum { CoeffReadCost = HugeCost, Flags = Rhs::Flags & RowMajorBit, Alignment = 0 };  // FIXME CoeffReadCost & Flags
+
+  typedef sparse_diagonal_product_evaluator<Rhs, typename Lhs::DiagonalVectorType,
+                                            Rhs::Flags & RowMajorBit ? SDP_AsScalarProduct : SDP_AsCwiseProduct>
+      Base;
+  explicit product_evaluator(const XprType &xpr) : Base(xpr.rhs(), xpr.lhs().diagonal()) {}
 };
 
-template<typename Lhs, typename Rhs, int ProductTag>
+template <typename Lhs, typename Rhs, int ProductTag>
 struct product_evaluator<Product<Lhs, Rhs, DefaultProduct>, ProductTag, SparseShape, DiagonalShape>
-  : public sparse_diagonal_product_evaluator<Lhs, Transpose<const typename Rhs::DiagonalVectorType>, Lhs::Flags&RowMajorBit?SDP_AsCwiseProduct:SDP_AsScalarProduct>
-{
+    : public sparse_diagonal_product_evaluator<Lhs, Transpose<const typename Rhs::DiagonalVectorType>,
+                                               Lhs::Flags & RowMajorBit ? SDP_AsCwiseProduct : SDP_AsScalarProduct> {
   typedef Product<Lhs, Rhs, DefaultProduct> XprType;
-  enum { CoeffReadCost = HugeCost, Flags = Lhs::Flags&RowMajorBit, Alignment = 0 }; // FIXME CoeffReadCost & Flags
-  
-  typedef sparse_diagonal_product_evaluator<Lhs, Transpose<const typename Rhs::DiagonalVectorType>, Lhs::Flags&RowMajorBit?SDP_AsCwiseProduct:SDP_AsScalarProduct> Base;
-  explicit product_evaluator(const XprType& xpr) : Base(xpr.lhs(), xpr.rhs().diagonal().transpose()) {}
+  enum { CoeffReadCost = HugeCost, Flags = Lhs::Flags & RowMajorBit, Alignment = 0 };  // FIXME CoeffReadCost & Flags
+
+  typedef sparse_diagonal_product_evaluator<Lhs, Transpose<const typename Rhs::DiagonalVectorType>,
+                                            Lhs::Flags & RowMajorBit ? SDP_AsCwiseProduct : SDP_AsScalarProduct>
+      Base;
+  explicit product_evaluator(const XprType &xpr) : Base(xpr.lhs(), xpr.rhs().diagonal().transpose()) {}
 };
 
-template<typename SparseXprType, typename DiagonalCoeffType>
-struct sparse_diagonal_product_evaluator<SparseXprType, DiagonalCoeffType, SDP_AsScalarProduct>
-{
-protected:
+template <typename SparseXprType, typename DiagonalCoeffType>
+struct sparse_diagonal_product_evaluator<SparseXprType, DiagonalCoeffType, SDP_AsScalarProduct> {
+ protected:
   typedef typename evaluator<SparseXprType>::InnerIterator SparseXprInnerIterator;
   typedef typename SparseXprType::Scalar Scalar;
-  
-public:
-  class InnerIterator : public SparseXprInnerIterator
-  {
-  public:
+
+ public:
+  class InnerIterator : public SparseXprInnerIterator {
+   public:
     InnerIterator(const sparse_diagonal_product_evaluator &xprEval, Index outer)
-      : SparseXprInnerIterator(xprEval.m_sparseXprImpl, outer),
-        m_coeff(xprEval.m_diagCoeffImpl.coeff(outer))
-    {}
-    
+        : SparseXprInnerIterator(xprEval.m_sparseXprImpl, outer), m_coeff(xprEval.m_diagCoeffImpl.coeff(outer)) {}
+
     EIGEN_STRONG_INLINE Scalar value() const { return m_coeff * SparseXprInnerIterator::value(); }
-  protected:
+
+   protected:
     typename DiagonalCoeffType::Scalar m_coeff;
   };
-  
+
   sparse_diagonal_product_evaluator(const SparseXprType &sparseXpr, const DiagonalCoeffType &diagCoeff)
-    : m_sparseXprImpl(sparseXpr), m_diagCoeffImpl(diagCoeff)
-  {}
+      : m_sparseXprImpl(sparseXpr), m_diagCoeffImpl(diagCoeff) {}
 
   Index nonZerosEstimate() const { return m_sparseXprImpl.nonZerosEstimate(); }
-    
-protected:
+
+ protected:
   evaluator<SparseXprType> m_sparseXprImpl;
   evaluator<DiagonalCoeffType> m_diagCoeffImpl;
 };
 
-
-template<typename SparseXprType, typename DiagCoeffType>
-struct sparse_diagonal_product_evaluator<SparseXprType, DiagCoeffType, SDP_AsCwiseProduct>
-{
+template <typename SparseXprType, typename DiagCoeffType>
+struct sparse_diagonal_product_evaluator<SparseXprType, DiagCoeffType, SDP_AsCwiseProduct> {
   typedef typename SparseXprType::Scalar Scalar;
   typedef typename SparseXprType::StorageIndex StorageIndex;
-  
-  typedef typename nested_eval<DiagCoeffType,SparseXprType::IsRowMajor ? SparseXprType::RowsAtCompileTime
-                                                                       : SparseXprType::ColsAtCompileTime>::type DiagCoeffNested;
-  
-  class InnerIterator
-  {
+
+  typedef typename nested_eval<DiagCoeffType, SparseXprType::IsRowMajor ? SparseXprType::RowsAtCompileTime
+                                                                        : SparseXprType::ColsAtCompileTime>::type
+      DiagCoeffNested;
+
+  class InnerIterator {
     typedef typename evaluator<SparseXprType>::InnerIterator SparseXprIter;
-  public:
+
+   public:
     InnerIterator(const sparse_diagonal_product_evaluator &xprEval, Index outer)
-      : m_sparseIter(xprEval.m_sparseXprEval, outer), m_diagCoeffNested(xprEval.m_diagCoeffNested)
-    {}
-    
+        : m_sparseIter(xprEval.m_sparseXprEval, outer), m_diagCoeffNested(xprEval.m_diagCoeffNested) {}
+
     inline Scalar value() const { return m_sparseIter.value() * m_diagCoeffNested.coeff(index()); }
-    inline StorageIndex index() const  { return m_sparseIter.index(); }
-    inline Index outer() const  { return m_sparseIter.outer(); }
-    inline Index col() const    { return SparseXprType::IsRowMajor ? m_sparseIter.index() : m_sparseIter.outer(); }
-    inline Index row() const    { return SparseXprType::IsRowMajor ? m_sparseIter.outer() : m_sparseIter.index(); }
-    
-    EIGEN_STRONG_INLINE InnerIterator& operator++() { ++m_sparseIter; return *this; }
-    inline operator bool() const  { return m_sparseIter; }
-    
-  protected:
+    inline StorageIndex index() const { return m_sparseIter.index(); }
+    inline Index outer() const { return m_sparseIter.outer(); }
+    inline Index col() const { return SparseXprType::IsRowMajor ? m_sparseIter.index() : m_sparseIter.outer(); }
+    inline Index row() const { return SparseXprType::IsRowMajor ? m_sparseIter.outer() : m_sparseIter.index(); }
+
+    EIGEN_STRONG_INLINE InnerIterator &operator++() {
+      ++m_sparseIter;
+      return *this;
+    }
+    inline operator bool() const { return m_sparseIter; }
+
+   protected:
     SparseXprIter m_sparseIter;
     DiagCoeffNested m_diagCoeffNested;
   };
-  
+
   sparse_diagonal_product_evaluator(const SparseXprType &sparseXpr, const DiagCoeffType &diagCoeff)
-    : m_sparseXprEval(sparseXpr), m_diagCoeffNested(diagCoeff)
-  {}
+      : m_sparseXprEval(sparseXpr), m_diagCoeffNested(diagCoeff) {}
 
   Index nonZerosEstimate() const { return m_sparseXprEval.nonZerosEstimate(); }
-    
-protected:
+
+ protected:
   evaluator<SparseXprType> m_sparseXprEval;
   DiagCoeffNested m_diagCoeffNested;
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SPARSE_DIAGONAL_PRODUCT_H
+#endif  // EIGEN_SPARSE_DIAGONAL_PRODUCT_H
diff --git a/Eigen/src/SparseCore/SparseDot.h b/Eigen/src/SparseCore/SparseDot.h
index 826c09b..aa876ec 100644
--- a/Eigen/src/SparseCore/SparseDot.h
+++ b/Eigen/src/SparseCore/SparseDot.h
@@ -13,61 +13,57 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
-template<typename Derived>
-template<typename OtherDerived>
-typename internal::traits<Derived>::Scalar
-SparseMatrixBase<Derived>::dot(const MatrixBase<OtherDerived>& other) const
-{
+template <typename Derived>
+template <typename OtherDerived>
+typename internal::traits<Derived>::Scalar SparseMatrixBase<Derived>::dot(const MatrixBase<OtherDerived>& other) const {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
-  EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived)
-  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename OtherDerived::Scalar>::value),
-    YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
+  EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived, OtherDerived)
+  EIGEN_STATIC_ASSERT(
+      (internal::is_same<Scalar, typename OtherDerived::Scalar>::value),
+      YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
 
   eigen_assert(size() == other.size());
-  eigen_assert(other.size()>0 && "you are using a non initialized vector");
+  eigen_assert(other.size() > 0 && "you are using a non initialized vector");
 
   internal::evaluator<Derived> thisEval(derived());
   typename internal::evaluator<Derived>::InnerIterator i(thisEval, 0);
   Scalar res(0);
-  while (i)
-  {
+  while (i) {
     res += numext::conj(i.value()) * other.coeff(i.index());
     ++i;
   }
   return res;
 }
 
-template<typename Derived>
-template<typename OtherDerived>
-typename internal::traits<Derived>::Scalar
-SparseMatrixBase<Derived>::dot(const SparseMatrixBase<OtherDerived>& other) const
-{
+template <typename Derived>
+template <typename OtherDerived>
+typename internal::traits<Derived>::Scalar SparseMatrixBase<Derived>::dot(
+    const SparseMatrixBase<OtherDerived>& other) const {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
-  EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived)
-  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename OtherDerived::Scalar>::value),
-    YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
+  EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived, OtherDerived)
+  EIGEN_STATIC_ASSERT(
+      (internal::is_same<Scalar, typename OtherDerived::Scalar>::value),
+      YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
 
   eigen_assert(size() == other.size());
 
   internal::evaluator<Derived> thisEval(derived());
   typename internal::evaluator<Derived>::InnerIterator i(thisEval, 0);
-  
-  internal::evaluator<OtherDerived>  otherEval(other.derived());
+
+  internal::evaluator<OtherDerived> otherEval(other.derived());
   typename internal::evaluator<OtherDerived>::InnerIterator j(otherEval, 0);
 
   Scalar res(0);
-  while (i && j)
-  {
-    if (i.index()==j.index())
-    {
+  while (i && j) {
+    if (i.index() == j.index()) {
       res += numext::conj(i.value()) * j.value();
-      ++i; ++j;
-    }
-    else if (i.index()<j.index())
+      ++i;
+      ++j;
+    } else if (i.index() < j.index())
       ++i;
     else
       ++j;
@@ -75,27 +71,23 @@
   return res;
 }
 
-template<typename Derived>
-inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
-SparseMatrixBase<Derived>::squaredNorm() const
-{
+template <typename Derived>
+inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real SparseMatrixBase<Derived>::squaredNorm()
+    const {
   return numext::real((*this).cwiseAbs2().sum());
 }
 
-template<typename Derived>
-inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
-SparseMatrixBase<Derived>::norm() const
-{
+template <typename Derived>
+inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real SparseMatrixBase<Derived>::norm() const {
   using std::sqrt;
   return sqrt(squaredNorm());
 }
 
-template<typename Derived>
-inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
-SparseMatrixBase<Derived>::blueNorm() const
-{
+template <typename Derived>
+inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real SparseMatrixBase<Derived>::blueNorm()
+    const {
   return internal::blueNorm_impl(*this);
 }
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SPARSE_DOT_H
+#endif  // EIGEN_SPARSE_DOT_H
diff --git a/Eigen/src/SparseCore/SparseFuzzy.h b/Eigen/src/SparseCore/SparseFuzzy.h
index 7ca4243..2285845 100644
--- a/Eigen/src/SparseCore/SparseFuzzy.h
+++ b/Eigen/src/SparseCore/SparseFuzzy.h
@@ -14,19 +14,18 @@
 #include "./InternalHeaderCheck.h"
 
 namespace Eigen {
-  
-template<typename Derived>
-template<typename OtherDerived>
-bool SparseMatrixBase<Derived>::isApprox(const SparseMatrixBase<OtherDerived>& other, const RealScalar &prec) const
-{
-  const typename internal::nested_eval<Derived,2,PlainObject>::type actualA(derived());
-  std::conditional_t<bool(IsRowMajor)==bool(OtherDerived::IsRowMajor),
-    const typename internal::nested_eval<OtherDerived,2,PlainObject>::type,
-    const PlainObject> actualB(other.derived());
+
+template <typename Derived>
+template <typename OtherDerived>
+bool SparseMatrixBase<Derived>::isApprox(const SparseMatrixBase<OtherDerived>& other, const RealScalar& prec) const {
+  const typename internal::nested_eval<Derived, 2, PlainObject>::type actualA(derived());
+  std::conditional_t<bool(IsRowMajor) == bool(OtherDerived::IsRowMajor),
+                     const typename internal::nested_eval<OtherDerived, 2, PlainObject>::type, const PlainObject>
+      actualB(other.derived());
 
   return (actualA - actualB).squaredNorm() <= prec * prec * numext::mini(actualA.squaredNorm(), actualB.squaredNorm());
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SPARSE_FUZZY_H
+#endif  // EIGEN_SPARSE_FUZZY_H
diff --git a/Eigen/src/SparseCore/SparseMap.h b/Eigen/src/SparseCore/SparseMap.h
index f2923a3..73e29c7 100644
--- a/Eigen/src/SparseCore/SparseMap.h
+++ b/Eigen/src/SparseCore/SparseMap.h
@@ -17,293 +17,279 @@
 
 namespace internal {
 
-template<typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
-struct traits<Map<SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> >
-  : public traits<SparseMatrix<MatScalar,MatOptions,MatIndex> >
-{
-  typedef SparseMatrix<MatScalar,MatOptions,MatIndex> PlainObjectType;
+template <typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
+struct traits<Map<SparseMatrix<MatScalar, MatOptions, MatIndex>, Options, StrideType> >
+    : public traits<SparseMatrix<MatScalar, MatOptions, MatIndex> > {
+  typedef SparseMatrix<MatScalar, MatOptions, MatIndex> PlainObjectType;
   typedef traits<PlainObjectType> TraitsBase;
-  enum {
-    Flags = TraitsBase::Flags & (~NestByRefBit)
-  };
+  enum { Flags = TraitsBase::Flags & (~NestByRefBit) };
 };
 
-template<typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
-struct traits<Map<const SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> >
-  : public traits<SparseMatrix<MatScalar,MatOptions,MatIndex> >
-{
-  typedef SparseMatrix<MatScalar,MatOptions,MatIndex> PlainObjectType;
+template <typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
+struct traits<Map<const SparseMatrix<MatScalar, MatOptions, MatIndex>, Options, StrideType> >
+    : public traits<SparseMatrix<MatScalar, MatOptions, MatIndex> > {
+  typedef SparseMatrix<MatScalar, MatOptions, MatIndex> PlainObjectType;
   typedef traits<PlainObjectType> TraitsBase;
-  enum {
-    Flags = TraitsBase::Flags & (~ (NestByRefBit | LvalueBit))
-  };
+  enum { Flags = TraitsBase::Flags & (~(NestByRefBit | LvalueBit)) };
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-template<typename Derived,
-         int Level = internal::accessors_level<Derived>::has_write_access ? WriteAccessors : ReadOnlyAccessors
-> class SparseMapBase;
+template <typename Derived,
+          int Level = internal::accessors_level<Derived>::has_write_access ? WriteAccessors : ReadOnlyAccessors>
+class SparseMapBase;
 
 /** \ingroup SparseCore_Module
-  * class SparseMapBase
-  * \brief Common base class for Map and Ref instance of sparse matrix and vector.
-  */
-template<typename Derived>
-class SparseMapBase<Derived,ReadOnlyAccessors>
-  : public SparseCompressedBase<Derived>
-{
-  public:
-    typedef SparseCompressedBase<Derived> Base;
-    typedef typename Base::Scalar Scalar;
-    typedef typename Base::StorageIndex StorageIndex;
-    enum { IsRowMajor = Base::IsRowMajor };
-    using Base::operator=;
-  protected:
-    
-    typedef std::conditional_t<
-                 bool(internal::is_lvalue<Derived>::value),
-                 Scalar *, const Scalar *> ScalarPointer;
-    typedef std::conditional_t<
-                 bool(internal::is_lvalue<Derived>::value),
-                 StorageIndex *, const StorageIndex *> IndexPointer;
+ * class SparseMapBase
+ * \brief Common base class for Map and Ref instance of sparse matrix and vector.
+ */
+template <typename Derived>
+class SparseMapBase<Derived, ReadOnlyAccessors> : public SparseCompressedBase<Derived> {
+ public:
+  typedef SparseCompressedBase<Derived> Base;
+  typedef typename Base::Scalar Scalar;
+  typedef typename Base::StorageIndex StorageIndex;
+  enum { IsRowMajor = Base::IsRowMajor };
+  using Base::operator=;
 
-    Index   m_outerSize;
-    Index   m_innerSize;
-    Array<StorageIndex,2,1>  m_zero_nnz;
-    IndexPointer  m_outerIndex;
-    IndexPointer  m_innerIndices;
-    ScalarPointer m_values;
-    IndexPointer  m_innerNonZeros;
+ protected:
+  typedef std::conditional_t<bool(internal::is_lvalue<Derived>::value), Scalar*, const Scalar*> ScalarPointer;
+  typedef std::conditional_t<bool(internal::is_lvalue<Derived>::value), StorageIndex*, const StorageIndex*>
+      IndexPointer;
 
-  public:
+  Index m_outerSize;
+  Index m_innerSize;
+  Array<StorageIndex, 2, 1> m_zero_nnz;
+  IndexPointer m_outerIndex;
+  IndexPointer m_innerIndices;
+  ScalarPointer m_values;
+  IndexPointer m_innerNonZeros;
 
-    /** \copydoc SparseMatrixBase::rows() */
-    inline Index rows() const { return IsRowMajor ? m_outerSize : m_innerSize; }
-    /** \copydoc SparseMatrixBase::cols() */
-    inline Index cols() const { return IsRowMajor ? m_innerSize : m_outerSize; }
-    /** \copydoc SparseMatrixBase::innerSize() */
-    inline Index innerSize() const { return m_innerSize; }
-    /** \copydoc SparseMatrixBase::outerSize() */
-    inline Index outerSize() const { return m_outerSize; }
-    /** \copydoc SparseCompressedBase::nonZeros */
-    inline Index nonZeros() const { return m_zero_nnz[1]; }
-    
-    /** \copydoc SparseCompressedBase::isCompressed */
-    bool isCompressed() const { return m_innerNonZeros==0; }
+ public:
+  /** \copydoc SparseMatrixBase::rows() */
+  inline Index rows() const { return IsRowMajor ? m_outerSize : m_innerSize; }
+  /** \copydoc SparseMatrixBase::cols() */
+  inline Index cols() const { return IsRowMajor ? m_innerSize : m_outerSize; }
+  /** \copydoc SparseMatrixBase::innerSize() */
+  inline Index innerSize() const { return m_innerSize; }
+  /** \copydoc SparseMatrixBase::outerSize() */
+  inline Index outerSize() const { return m_outerSize; }
+  /** \copydoc SparseCompressedBase::nonZeros */
+  inline Index nonZeros() const { return m_zero_nnz[1]; }
 
-    //----------------------------------------
-    // direct access interface
-    /** \copydoc SparseMatrix::valuePtr */
-    inline const Scalar* valuePtr() const { return m_values; }
-    /** \copydoc SparseMatrix::innerIndexPtr */
-    inline const StorageIndex* innerIndexPtr() const { return m_innerIndices; }
-    /** \copydoc SparseMatrix::outerIndexPtr */
-    inline const StorageIndex* outerIndexPtr() const { return m_outerIndex; }
-    /** \copydoc SparseMatrix::innerNonZeroPtr */
-    inline const StorageIndex* innerNonZeroPtr() const { return m_innerNonZeros; }
-    //----------------------------------------
+  /** \copydoc SparseCompressedBase::isCompressed */
+  bool isCompressed() const { return m_innerNonZeros == 0; }
 
-    /** \copydoc SparseMatrix::coeff */
-    inline Scalar coeff(Index row, Index col) const
-    {
-      const Index outer = IsRowMajor ? row : col;
-      const Index inner = IsRowMajor ? col : row;
+  //----------------------------------------
+  // direct access interface
+  /** \copydoc SparseMatrix::valuePtr */
+  inline const Scalar* valuePtr() const { return m_values; }
+  /** \copydoc SparseMatrix::innerIndexPtr */
+  inline const StorageIndex* innerIndexPtr() const { return m_innerIndices; }
+  /** \copydoc SparseMatrix::outerIndexPtr */
+  inline const StorageIndex* outerIndexPtr() const { return m_outerIndex; }
+  /** \copydoc SparseMatrix::innerNonZeroPtr */
+  inline const StorageIndex* innerNonZeroPtr() const { return m_innerNonZeros; }
+  //----------------------------------------
 
-      Index start = m_outerIndex[outer];
-      Index end = isCompressed() ? m_outerIndex[outer+1] : start + m_innerNonZeros[outer];
-      if (start==end)
-        return Scalar(0);
-      else if (end>0 && inner==m_innerIndices[end-1])
-        return m_values[end-1];
-      // ^^  optimization: let's first check if it is the last coefficient
-      // (very common in high level algorithms)
+  /** \copydoc SparseMatrix::coeff */
+  inline Scalar coeff(Index row, Index col) const {
+    const Index outer = IsRowMajor ? row : col;
+    const Index inner = IsRowMajor ? col : row;
 
-      const StorageIndex* r = std::lower_bound(&m_innerIndices[start],&m_innerIndices[end-1],inner);
-      const Index id = r-&m_innerIndices[0];
-      return ((*r==inner) && (id<end)) ? m_values[id] : Scalar(0);
-    }
+    Index start = m_outerIndex[outer];
+    Index end = isCompressed() ? m_outerIndex[outer + 1] : start + m_innerNonZeros[outer];
+    if (start == end)
+      return Scalar(0);
+    else if (end > 0 && inner == m_innerIndices[end - 1])
+      return m_values[end - 1];
+    // ^^  optimization: let's first check if it is the last coefficient
+    // (very common in high level algorithms)
 
-    inline SparseMapBase(Index rows, Index cols, Index nnz, IndexPointer outerIndexPtr, IndexPointer innerIndexPtr,
-                              ScalarPointer valuePtr, IndexPointer innerNonZerosPtr = 0)
-      : m_outerSize(IsRowMajor?rows:cols), m_innerSize(IsRowMajor?cols:rows), m_zero_nnz(0,internal::convert_index<StorageIndex>(nnz)), m_outerIndex(outerIndexPtr),
-        m_innerIndices(innerIndexPtr), m_values(valuePtr), m_innerNonZeros(innerNonZerosPtr)
-    {}
+    const StorageIndex* r = std::lower_bound(&m_innerIndices[start], &m_innerIndices[end - 1], inner);
+    const Index id = r - &m_innerIndices[0];
+    return ((*r == inner) && (id < end)) ? m_values[id] : Scalar(0);
+  }
 
-    // for vectors
-    inline SparseMapBase(Index size, Index nnz, IndexPointer innerIndexPtr, ScalarPointer valuePtr)
-      : m_outerSize(1), m_innerSize(size), m_zero_nnz(0,internal::convert_index<StorageIndex>(nnz)), m_outerIndex(m_zero_nnz.data()),
-        m_innerIndices(innerIndexPtr), m_values(valuePtr), m_innerNonZeros(0)
-    {}
+  inline SparseMapBase(Index rows, Index cols, Index nnz, IndexPointer outerIndexPtr, IndexPointer innerIndexPtr,
+                       ScalarPointer valuePtr, IndexPointer innerNonZerosPtr = 0)
+      : m_outerSize(IsRowMajor ? rows : cols),
+        m_innerSize(IsRowMajor ? cols : rows),
+        m_zero_nnz(0, internal::convert_index<StorageIndex>(nnz)),
+        m_outerIndex(outerIndexPtr),
+        m_innerIndices(innerIndexPtr),
+        m_values(valuePtr),
+        m_innerNonZeros(innerNonZerosPtr) {}
 
-    /** Empty destructor */
-    inline ~SparseMapBase() {}
+  // for vectors
+  inline SparseMapBase(Index size, Index nnz, IndexPointer innerIndexPtr, ScalarPointer valuePtr)
+      : m_outerSize(1),
+        m_innerSize(size),
+        m_zero_nnz(0, internal::convert_index<StorageIndex>(nnz)),
+        m_outerIndex(m_zero_nnz.data()),
+        m_innerIndices(innerIndexPtr),
+        m_values(valuePtr),
+        m_innerNonZeros(0) {}
 
-  protected:
-    inline SparseMapBase() {}
+  /** Empty destructor */
+  inline ~SparseMapBase() {}
+
+ protected:
+  inline SparseMapBase() {}
 };
 
 /** \ingroup SparseCore_Module
-  * class SparseMapBase
-  * \brief Common base class for writable Map and Ref instance of sparse matrix and vector.
-  */
-template<typename Derived>
-class SparseMapBase<Derived,WriteAccessors>
-  : public SparseMapBase<Derived,ReadOnlyAccessors>
-{
-    typedef MapBase<Derived, ReadOnlyAccessors> ReadOnlyMapBase;
-    
-  public:
-    typedef SparseMapBase<Derived, ReadOnlyAccessors> Base;
-    typedef typename Base::Scalar Scalar;
-    typedef typename Base::StorageIndex StorageIndex;
-    enum { IsRowMajor = Base::IsRowMajor };
-    
-    using Base::operator=;
+ * class SparseMapBase
+ * \brief Common base class for writable Map and Ref instance of sparse matrix and vector.
+ */
+template <typename Derived>
+class SparseMapBase<Derived, WriteAccessors> : public SparseMapBase<Derived, ReadOnlyAccessors> {
+  typedef MapBase<Derived, ReadOnlyAccessors> ReadOnlyMapBase;
 
-  public:
-    
-    //----------------------------------------
-    // direct access interface
-    using Base::valuePtr;
-    using Base::innerIndexPtr;
-    using Base::outerIndexPtr;
-    using Base::innerNonZeroPtr;
-    /** \copydoc SparseMatrix::valuePtr */
-    inline Scalar* valuePtr()              { return Base::m_values; }
-    /** \copydoc SparseMatrix::innerIndexPtr */
-    inline StorageIndex* innerIndexPtr()   { return Base::m_innerIndices; }
-    /** \copydoc SparseMatrix::outerIndexPtr */
-    inline StorageIndex* outerIndexPtr()   { return Base::m_outerIndex; }
-    /** \copydoc SparseMatrix::innerNonZeroPtr */
-    inline StorageIndex* innerNonZeroPtr() { return Base::m_innerNonZeros; }
-    //----------------------------------------
+ public:
+  typedef SparseMapBase<Derived, ReadOnlyAccessors> Base;
+  typedef typename Base::Scalar Scalar;
+  typedef typename Base::StorageIndex StorageIndex;
+  enum { IsRowMajor = Base::IsRowMajor };
 
-    /** \copydoc SparseMatrix::coeffRef */
-    inline Scalar& coeffRef(Index row, Index col)
-    {
-      const Index outer = IsRowMajor ? row : col;
-      const Index inner = IsRowMajor ? col : row;
+  using Base::operator=;
 
-      Index start = Base::m_outerIndex[outer];
-      Index end = Base::isCompressed() ? Base::m_outerIndex[outer+1] : start + Base::m_innerNonZeros[outer];
-      eigen_assert(end>=start && "you probably called coeffRef on a non finalized matrix");
-      eigen_assert(end>start && "coeffRef cannot be called on a zero coefficient");
-      StorageIndex* r = std::lower_bound(&Base::m_innerIndices[start],&Base::m_innerIndices[end],inner);
-      const Index id = r - &Base::m_innerIndices[0];
-      eigen_assert((*r==inner) && (id<end) && "coeffRef cannot be called on a zero coefficient");
-      return const_cast<Scalar*>(Base::m_values)[id];
-    }
-    
-    inline SparseMapBase(Index rows, Index cols, Index nnz, StorageIndex* outerIndexPtr, StorageIndex* innerIndexPtr,
-                         Scalar* valuePtr, StorageIndex* innerNonZerosPtr = 0)
-      : Base(rows, cols, nnz, outerIndexPtr, innerIndexPtr, valuePtr, innerNonZerosPtr)
-    {}
+ public:
+  //----------------------------------------
+  // direct access interface
+  using Base::innerIndexPtr;
+  using Base::innerNonZeroPtr;
+  using Base::outerIndexPtr;
+  using Base::valuePtr;
+  /** \copydoc SparseMatrix::valuePtr */
+  inline Scalar* valuePtr() { return Base::m_values; }
+  /** \copydoc SparseMatrix::innerIndexPtr */
+  inline StorageIndex* innerIndexPtr() { return Base::m_innerIndices; }
+  /** \copydoc SparseMatrix::outerIndexPtr */
+  inline StorageIndex* outerIndexPtr() { return Base::m_outerIndex; }
+  /** \copydoc SparseMatrix::innerNonZeroPtr */
+  inline StorageIndex* innerNonZeroPtr() { return Base::m_innerNonZeros; }
+  //----------------------------------------
 
-    // for vectors
-    inline SparseMapBase(Index size, Index nnz, StorageIndex* innerIndexPtr, Scalar* valuePtr)
-      : Base(size, nnz, innerIndexPtr, valuePtr)
-    {}
+  /** \copydoc SparseMatrix::coeffRef */
+  inline Scalar& coeffRef(Index row, Index col) {
+    const Index outer = IsRowMajor ? row : col;
+    const Index inner = IsRowMajor ? col : row;
 
-    /** Empty destructor */
-    inline ~SparseMapBase() {}
+    Index start = Base::m_outerIndex[outer];
+    Index end = Base::isCompressed() ? Base::m_outerIndex[outer + 1] : start + Base::m_innerNonZeros[outer];
+    eigen_assert(end >= start && "you probably called coeffRef on a non finalized matrix");
+    eigen_assert(end > start && "coeffRef cannot be called on a zero coefficient");
+    StorageIndex* r = std::lower_bound(&Base::m_innerIndices[start], &Base::m_innerIndices[end], inner);
+    const Index id = r - &Base::m_innerIndices[0];
+    eigen_assert((*r == inner) && (id < end) && "coeffRef cannot be called on a zero coefficient");
+    return const_cast<Scalar*>(Base::m_values)[id];
+  }
 
-  protected:
-    inline SparseMapBase() {}
+  inline SparseMapBase(Index rows, Index cols, Index nnz, StorageIndex* outerIndexPtr, StorageIndex* innerIndexPtr,
+                       Scalar* valuePtr, StorageIndex* innerNonZerosPtr = 0)
+      : Base(rows, cols, nnz, outerIndexPtr, innerIndexPtr, valuePtr, innerNonZerosPtr) {}
+
+  // for vectors
+  inline SparseMapBase(Index size, Index nnz, StorageIndex* innerIndexPtr, Scalar* valuePtr)
+      : Base(size, nnz, innerIndexPtr, valuePtr) {}
+
+  /** Empty destructor */
+  inline ~SparseMapBase() {}
+
+ protected:
+  inline SparseMapBase() {}
 };
 
 /** \ingroup SparseCore_Module
-  *
-  * \brief Specialization of class Map for SparseMatrix-like storage.
-  *
-  * \tparam SparseMatrixType the equivalent sparse matrix type of the referenced data, it must be a template instance of class SparseMatrix.
-  *
-  * \sa class Map, class SparseMatrix, class Ref<SparseMatrixType,Options>
-  */
+ *
+ * \brief Specialization of class Map for SparseMatrix-like storage.
+ *
+ * \tparam SparseMatrixType the equivalent sparse matrix type of the referenced data, it must be a template instance of
+ * class SparseMatrix.
+ *
+ * \sa class Map, class SparseMatrix, class Ref<SparseMatrixType,Options>
+ */
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-template<typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
-class Map<SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType>
-  : public SparseMapBase<Map<SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> >
+template <typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
+class Map<SparseMatrix<MatScalar, MatOptions, MatIndex>, Options, StrideType>
+    : public SparseMapBase<Map<SparseMatrix<MatScalar, MatOptions, MatIndex>, Options, StrideType> >
 #else
-template<typename SparseMatrixType>
-class Map<SparseMatrixType>
-  : public SparseMapBase<Derived,WriteAccessors>
+template <typename SparseMatrixType>
+class Map<SparseMatrixType> : public SparseMapBase<Derived, WriteAccessors>
 #endif
 {
-  public:
-    typedef SparseMapBase<Map> Base;
-    EIGEN_SPARSE_PUBLIC_INTERFACE(Map)
-    enum { IsRowMajor = Base::IsRowMajor };
+ public:
+  typedef SparseMapBase<Map> Base;
+  EIGEN_SPARSE_PUBLIC_INTERFACE(Map)
+  enum { IsRowMajor = Base::IsRowMajor };
 
-  public:
-
-    /** Constructs a read-write Map to a sparse matrix of size \a rows x \a cols, containing \a nnz non-zero coefficients,
-      * stored as a sparse format as defined by the pointers \a outerIndexPtr, \a innerIndexPtr, and \a valuePtr.
-      * If the optional parameter \a innerNonZerosPtr is the null pointer, then a standard compressed format is assumed.
-      * The inner indices must be sorted appropriately.
-      *
-      * This constructor is available only if \c SparseMatrixType is non-const.
-      *
-      * More details on the expected storage schemes are given in the \ref TutorialSparse "manual pages".
-      */
-    inline Map(Index rows, Index cols, Index nnz, StorageIndex* outerIndexPtr,
-               StorageIndex* innerIndexPtr, Scalar* valuePtr, StorageIndex* innerNonZerosPtr = 0)
-      : Base(rows, cols, nnz, outerIndexPtr, innerIndexPtr, valuePtr, innerNonZerosPtr)
-    {}
+ public:
+  /** Constructs a read-write Map to a sparse matrix of size \a rows x \a cols, containing \a nnz non-zero coefficients,
+   * stored as a sparse format as defined by the pointers \a outerIndexPtr, \a innerIndexPtr, and \a valuePtr.
+   * If the optional parameter \a innerNonZerosPtr is the null pointer, then a standard compressed format is assumed.
+   * The inner indices must be sorted appropriately.
+   *
+   * This constructor is available only if \c SparseMatrixType is non-const.
+   *
+   * More details on the expected storage schemes are given in the \ref TutorialSparse "manual pages".
+   */
+  inline Map(Index rows, Index cols, Index nnz, StorageIndex* outerIndexPtr, StorageIndex* innerIndexPtr,
+             Scalar* valuePtr, StorageIndex* innerNonZerosPtr = 0)
+      : Base(rows, cols, nnz, outerIndexPtr, innerIndexPtr, valuePtr, innerNonZerosPtr) {}
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-    /** Empty destructor */
-    inline ~Map() {}
+  /** Empty destructor */
+  inline ~Map() {}
 };
 
-template<typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
-class Map<const SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType>
-  : public SparseMapBase<Map<const SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> >
-{
-  public:
-    typedef SparseMapBase<Map> Base;
-    EIGEN_SPARSE_PUBLIC_INTERFACE(Map)
-    enum { IsRowMajor = Base::IsRowMajor };
+template <typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
+class Map<const SparseMatrix<MatScalar, MatOptions, MatIndex>, Options, StrideType>
+    : public SparseMapBase<Map<const SparseMatrix<MatScalar, MatOptions, MatIndex>, Options, StrideType> > {
+ public:
+  typedef SparseMapBase<Map> Base;
+  EIGEN_SPARSE_PUBLIC_INTERFACE(Map)
+  enum { IsRowMajor = Base::IsRowMajor };
 
-  public:
+ public:
 #endif
-    /** This is the const version of the above constructor.
-      *
-      * This constructor is available only if \c SparseMatrixType is const, e.g.:
-      * \code Map<const SparseMatrix<double> >  \endcode
-      */
-    inline Map(Index rows, Index cols, Index nnz, const StorageIndex* outerIndexPtr,
-               const StorageIndex* innerIndexPtr, const Scalar* valuePtr, const StorageIndex* innerNonZerosPtr = 0)
-      : Base(rows, cols, nnz, outerIndexPtr, innerIndexPtr, valuePtr, innerNonZerosPtr)
-    {}
+  /** This is the const version of the above constructor.
+   *
+   * This constructor is available only if \c SparseMatrixType is const, e.g.:
+   * \code Map<const SparseMatrix<double> >  \endcode
+   */
+  inline Map(Index rows, Index cols, Index nnz, const StorageIndex* outerIndexPtr, const StorageIndex* innerIndexPtr,
+             const Scalar* valuePtr, const StorageIndex* innerNonZerosPtr = 0)
+      : Base(rows, cols, nnz, outerIndexPtr, innerIndexPtr, valuePtr, innerNonZerosPtr) {}
 
-    /** Empty destructor */
-    inline ~Map() {}
+  /** Empty destructor */
+  inline ~Map() {}
 };
 
 namespace internal {
 
-template<typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
-struct evaluator<Map<SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> >
-  : evaluator<SparseCompressedBase<Map<SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> > >
-{
-  typedef evaluator<SparseCompressedBase<Map<SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> > > Base;
-  typedef Map<SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> XprType;  
+template <typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
+struct evaluator<Map<SparseMatrix<MatScalar, MatOptions, MatIndex>, Options, StrideType> >
+    : evaluator<SparseCompressedBase<Map<SparseMatrix<MatScalar, MatOptions, MatIndex>, Options, StrideType> > > {
+  typedef evaluator<SparseCompressedBase<Map<SparseMatrix<MatScalar, MatOptions, MatIndex>, Options, StrideType> > >
+      Base;
+  typedef Map<SparseMatrix<MatScalar, MatOptions, MatIndex>, Options, StrideType> XprType;
   evaluator() : Base() {}
-  explicit evaluator(const XprType &mat) : Base(mat) {}
+  explicit evaluator(const XprType& mat) : Base(mat) {}
 };
 
-template<typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
-struct evaluator<Map<const SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> >
-  : evaluator<SparseCompressedBase<Map<const SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> > >
-{
-  typedef evaluator<SparseCompressedBase<Map<const SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> > > Base;
-  typedef Map<const SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> XprType;  
+template <typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
+struct evaluator<Map<const SparseMatrix<MatScalar, MatOptions, MatIndex>, Options, StrideType> >
+    : evaluator<SparseCompressedBase<Map<const SparseMatrix<MatScalar, MatOptions, MatIndex>, Options, StrideType> > > {
+  typedef evaluator<
+      SparseCompressedBase<Map<const SparseMatrix<MatScalar, MatOptions, MatIndex>, Options, StrideType> > >
+      Base;
+  typedef Map<const SparseMatrix<MatScalar, MatOptions, MatIndex>, Options, StrideType> XprType;
   evaluator() : Base() {}
-  explicit evaluator(const XprType &mat) : Base(mat) {}
+  explicit evaluator(const XprType& mat) : Base(mat) {}
 };
 
-}
+}  // namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SPARSE_MAP_H
+#endif  // EIGEN_SPARSE_MAP_H
diff --git a/Eigen/src/SparseCore/SparseMatrix.h b/Eigen/src/SparseCore/SparseMatrix.h
index 8537c79..19dd40c 100644
--- a/Eigen/src/SparseCore/SparseMatrix.h
+++ b/Eigen/src/SparseCore/SparseMatrix.h
@@ -13,42 +13,42 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 /** \ingroup SparseCore_Module
-  *
-  * \class SparseMatrix
-  *
-  * \brief A versatible sparse matrix representation
-  *
-  * This class implements a more versatile variants of the common \em compressed row/column storage format.
-  * Each colmun's (resp. row) non zeros are stored as a pair of value with associated row (resp. colmiun) index.
-  * All the non zeros are stored in a single large buffer. Unlike the \em compressed format, there might be extra
-  * space in between the nonzeros of two successive colmuns (resp. rows) such that insertion of new non-zero
-  * can be done with limited memory reallocation and copies.
-  *
-  * A call to the function makeCompressed() turns the matrix into the standard \em compressed format
-  * compatible with many library.
-  *
-  * More details on this storage sceheme are given in the \ref TutorialSparse "manual pages".
-  *
-  * \tparam Scalar_ the scalar type, i.e. the type of the coefficients
-  * \tparam Options_ Union of bit flags controlling the storage scheme. Currently the only possibility
-  *                 is ColMajor or RowMajor. The default is 0 which means column-major.
-  * \tparam StorageIndex_ the type of the indices. It has to be a \b signed type (e.g., short, int, std::ptrdiff_t). Default is \c int.
-  *
-  * \warning In %Eigen 3.2, the undocumented type \c SparseMatrix::Index was improperly defined as the storage index type (e.g., int),
-  *          whereas it is now (starting from %Eigen 3.3) deprecated and always defined as Eigen::Index.
-  *          Codes making use of \c SparseMatrix::Index, might thus likely have to be changed to use \c SparseMatrix::StorageIndex instead.
-  *
-  * This class can be extended with the help of the plugin mechanism described on the page
-  * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_SPARSEMATRIX_PLUGIN.
-  */
+ *
+ * \class SparseMatrix
+ *
+ * \brief A versatible sparse matrix representation
+ *
+ * This class implements a more versatile variants of the common \em compressed row/column storage format.
+ * Each colmun's (resp. row) non zeros are stored as a pair of value with associated row (resp. colmiun) index.
+ * All the non zeros are stored in a single large buffer. Unlike the \em compressed format, there might be extra
+ * space in between the nonzeros of two successive colmuns (resp. rows) such that insertion of new non-zero
+ * can be done with limited memory reallocation and copies.
+ *
+ * A call to the function makeCompressed() turns the matrix into the standard \em compressed format
+ * compatible with many library.
+ *
+ * More details on this storage sceheme are given in the \ref TutorialSparse "manual pages".
+ *
+ * \tparam Scalar_ the scalar type, i.e. the type of the coefficients
+ * \tparam Options_ Union of bit flags controlling the storage scheme. Currently the only possibility
+ *                 is ColMajor or RowMajor. The default is 0 which means column-major.
+ * \tparam StorageIndex_ the type of the indices. It has to be a \b signed type (e.g., short, int, std::ptrdiff_t).
+ * Default is \c int.
+ *
+ * \warning In %Eigen 3.2, the undocumented type \c SparseMatrix::Index was improperly defined as the storage index type
+ * (e.g., int), whereas it is now (starting from %Eigen 3.3) deprecated and always defined as Eigen::Index. Codes making
+ * use of \c SparseMatrix::Index, might thus likely have to be changed to use \c SparseMatrix::StorageIndex instead.
+ *
+ * This class can be extended with the help of the plugin mechanism described on the page
+ * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_SPARSEMATRIX_PLUGIN.
+ */
 
 namespace internal {
-template<typename Scalar_, int Options_, typename StorageIndex_>
-struct traits<SparseMatrix<Scalar_, Options_, StorageIndex_> >
-{
+template <typename Scalar_, int Options_, typename StorageIndex_>
+struct traits<SparseMatrix<Scalar_, Options_, StorageIndex_>> {
   typedef Scalar_ Scalar;
   typedef StorageIndex_ StorageIndex;
   typedef Sparse StorageKind;
@@ -63,9 +63,8 @@
   };
 };
 
-template<typename Scalar_, int Options_, typename StorageIndex_, int DiagIndex>
-struct traits<Diagonal<SparseMatrix<Scalar_, Options_, StorageIndex_>, DiagIndex> >
-{
+template <typename Scalar_, int Options_, typename StorageIndex_, int DiagIndex>
+struct traits<Diagonal<SparseMatrix<Scalar_, Options_, StorageIndex_>, DiagIndex>> {
   typedef SparseMatrix<Scalar_, Options_, StorageIndex_> MatrixType;
   typedef typename ref_selector<MatrixType>::type MatrixTypeNested;
   typedef std::remove_reference_t<MatrixTypeNested> MatrixTypeNested_;
@@ -84,13 +83,10 @@
   };
 };
 
-template<typename Scalar_, int Options_, typename StorageIndex_, int DiagIndex>
-struct traits<Diagonal<const SparseMatrix<Scalar_, Options_, StorageIndex_>, DiagIndex> >
- : public traits<Diagonal<SparseMatrix<Scalar_, Options_, StorageIndex_>, DiagIndex> >
-{
-  enum {
-    Flags = 0
-  };
+template <typename Scalar_, int Options_, typename StorageIndex_, int DiagIndex>
+struct traits<Diagonal<const SparseMatrix<Scalar_, Options_, StorageIndex_>, DiagIndex>>
+    : public traits<Diagonal<SparseMatrix<Scalar_, Options_, StorageIndex_>, DiagIndex>> {
+  enum { Flags = 0 };
 };
 
 template <typename StorageIndex>
@@ -118,1040 +114,958 @@
   enum { Cost = 1, PacketAccess = false, IsRepeatable = true };
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-template<typename Scalar_, int Options_, typename StorageIndex_>
-class SparseMatrix
-  : public SparseCompressedBase<SparseMatrix<Scalar_, Options_, StorageIndex_> >
-{
-    typedef SparseCompressedBase<SparseMatrix> Base;
-    using Base::convert_index;
-    friend class SparseVector<Scalar_,0,StorageIndex_>;
-    template<typename, typename, typename, typename, typename>
-    friend struct internal::Assignment;
-  public:
-    using Base::isCompressed;
-    using Base::nonZeros;
-    EIGEN_SPARSE_PUBLIC_INTERFACE(SparseMatrix)
-    using Base::operator+=;
-    using Base::operator-=;
+template <typename Scalar_, int Options_, typename StorageIndex_>
+class SparseMatrix : public SparseCompressedBase<SparseMatrix<Scalar_, Options_, StorageIndex_>> {
+  typedef SparseCompressedBase<SparseMatrix> Base;
+  using Base::convert_index;
+  friend class SparseVector<Scalar_, 0, StorageIndex_>;
+  template <typename, typename, typename, typename, typename>
+  friend struct internal::Assignment;
 
-    typedef Eigen::Map<SparseMatrix<Scalar,Options_,StorageIndex>> Map;
-    typedef Diagonal<SparseMatrix> DiagonalReturnType;
-    typedef Diagonal<const SparseMatrix> ConstDiagonalReturnType;
-    typedef typename Base::InnerIterator InnerIterator;
-    typedef typename Base::ReverseInnerIterator ReverseInnerIterator;
-    
+ public:
+  using Base::isCompressed;
+  using Base::nonZeros;
+  EIGEN_SPARSE_PUBLIC_INTERFACE(SparseMatrix)
+  using Base::operator+=;
+  using Base::operator-=;
 
-    using Base::IsRowMajor;
-    typedef internal::CompressedStorage<Scalar,StorageIndex> Storage;
-    enum {
-      Options = Options_
-    };
+  typedef Eigen::Map<SparseMatrix<Scalar, Options_, StorageIndex>> Map;
+  typedef Diagonal<SparseMatrix> DiagonalReturnType;
+  typedef Diagonal<const SparseMatrix> ConstDiagonalReturnType;
+  typedef typename Base::InnerIterator InnerIterator;
+  typedef typename Base::ReverseInnerIterator ReverseInnerIterator;
 
-    typedef typename Base::IndexVector IndexVector;
-    typedef typename Base::ScalarVector ScalarVector;
-  protected:
-    typedef SparseMatrix<Scalar, IsRowMajor ? ColMajor : RowMajor, StorageIndex> TransposedSparseMatrix;
+  using Base::IsRowMajor;
+  typedef internal::CompressedStorage<Scalar, StorageIndex> Storage;
+  enum { Options = Options_ };
 
-    Index m_outerSize;
-    Index m_innerSize;
-    StorageIndex* m_outerIndex;
-    StorageIndex* m_innerNonZeros;     // optional, if null then the data is compressed
-    Storage m_data;
+  typedef typename Base::IndexVector IndexVector;
+  typedef typename Base::ScalarVector ScalarVector;
 
-  public:
-    
-    /** \returns the number of rows of the matrix */
-    inline Index rows() const { return IsRowMajor ? m_outerSize : m_innerSize; }
-    /** \returns the number of columns of the matrix */
-    inline Index cols() const { return IsRowMajor ? m_innerSize : m_outerSize; }
+ protected:
+  typedef SparseMatrix<Scalar, IsRowMajor ? ColMajor : RowMajor, StorageIndex> TransposedSparseMatrix;
 
-    /** \returns the number of rows (resp. columns) of the matrix if the storage order column major (resp. row major) */
-    inline Index innerSize() const { return m_innerSize; }
-    /** \returns the number of columns (resp. rows) of the matrix if the storage order column major (resp. row major) */
-    inline Index outerSize() const { return m_outerSize; }
-    
-    /** \returns a const pointer to the array of values.
-      * This function is aimed at interoperability with other libraries.
-      * \sa innerIndexPtr(), outerIndexPtr() */
-    inline const Scalar* valuePtr() const { return m_data.valuePtr(); }
-    /** \returns a non-const pointer to the array of values.
-      * This function is aimed at interoperability with other libraries.
-      * \sa innerIndexPtr(), outerIndexPtr() */
-    inline Scalar* valuePtr() { return m_data.valuePtr(); }
+  Index m_outerSize;
+  Index m_innerSize;
+  StorageIndex* m_outerIndex;
+  StorageIndex* m_innerNonZeros;  // optional, if null then the data is compressed
+  Storage m_data;
 
-    /** \returns a const pointer to the array of inner indices.
-      * This function is aimed at interoperability with other libraries.
-      * \sa valuePtr(), outerIndexPtr() */
-    inline const StorageIndex* innerIndexPtr() const { return m_data.indexPtr(); }
-    /** \returns a non-const pointer to the array of inner indices.
-      * This function is aimed at interoperability with other libraries.
-      * \sa valuePtr(), outerIndexPtr() */
-    inline StorageIndex* innerIndexPtr() { return m_data.indexPtr(); }
+ public:
+  /** \returns the number of rows of the matrix */
+  inline Index rows() const { return IsRowMajor ? m_outerSize : m_innerSize; }
+  /** \returns the number of columns of the matrix */
+  inline Index cols() const { return IsRowMajor ? m_innerSize : m_outerSize; }
 
-    /** \returns a const pointer to the array of the starting positions of the inner vectors.
-      * This function is aimed at interoperability with other libraries.
-      * \sa valuePtr(), innerIndexPtr() */
-    inline const StorageIndex* outerIndexPtr() const { return m_outerIndex; }
-    /** \returns a non-const pointer to the array of the starting positions of the inner vectors.
-      * This function is aimed at interoperability with other libraries.
-      * \sa valuePtr(), innerIndexPtr() */
-    inline StorageIndex* outerIndexPtr() { return m_outerIndex; }
+  /** \returns the number of rows (resp. columns) of the matrix if the storage order column major (resp. row major) */
+  inline Index innerSize() const { return m_innerSize; }
+  /** \returns the number of columns (resp. rows) of the matrix if the storage order column major (resp. row major) */
+  inline Index outerSize() const { return m_outerSize; }
 
-    /** \returns a const pointer to the array of the number of non zeros of the inner vectors.
-      * This function is aimed at interoperability with other libraries.
-      * \warning it returns the null pointer 0 in compressed mode */
-    inline const StorageIndex* innerNonZeroPtr() const { return m_innerNonZeros; }
-    /** \returns a non-const pointer to the array of the number of non zeros of the inner vectors.
-      * This function is aimed at interoperability with other libraries.
-      * \warning it returns the null pointer 0 in compressed mode */
-    inline StorageIndex* innerNonZeroPtr() { return m_innerNonZeros; }
+  /** \returns a const pointer to the array of values.
+   * This function is aimed at interoperability with other libraries.
+   * \sa innerIndexPtr(), outerIndexPtr() */
+  inline const Scalar* valuePtr() const { return m_data.valuePtr(); }
+  /** \returns a non-const pointer to the array of values.
+   * This function is aimed at interoperability with other libraries.
+   * \sa innerIndexPtr(), outerIndexPtr() */
+  inline Scalar* valuePtr() { return m_data.valuePtr(); }
 
-    /** \internal */
-    inline Storage& data() { return m_data; }
-    /** \internal */
-    inline const Storage& data() const { return m_data; }
+  /** \returns a const pointer to the array of inner indices.
+   * This function is aimed at interoperability with other libraries.
+   * \sa valuePtr(), outerIndexPtr() */
+  inline const StorageIndex* innerIndexPtr() const { return m_data.indexPtr(); }
+  /** \returns a non-const pointer to the array of inner indices.
+   * This function is aimed at interoperability with other libraries.
+   * \sa valuePtr(), outerIndexPtr() */
+  inline StorageIndex* innerIndexPtr() { return m_data.indexPtr(); }
 
-    /** \returns the value of the matrix at position \a i, \a j
-      * This function returns Scalar(0) if the element is an explicit \em zero */
-    inline Scalar coeff(Index row, Index col) const
-    {
-      eigen_assert(row>=0 && row<rows() && col>=0 && col<cols());
-      
-      const Index outer = IsRowMajor ? row : col;
-      const Index inner = IsRowMajor ? col : row;
-      Index end = m_innerNonZeros ? m_outerIndex[outer] + m_innerNonZeros[outer] : m_outerIndex[outer+1];
-      return m_data.atInRange(m_outerIndex[outer], end, inner);
-    }
+  /** \returns a const pointer to the array of the starting positions of the inner vectors.
+   * This function is aimed at interoperability with other libraries.
+   * \sa valuePtr(), innerIndexPtr() */
+  inline const StorageIndex* outerIndexPtr() const { return m_outerIndex; }
+  /** \returns a non-const pointer to the array of the starting positions of the inner vectors.
+   * This function is aimed at interoperability with other libraries.
+   * \sa valuePtr(), innerIndexPtr() */
+  inline StorageIndex* outerIndexPtr() { return m_outerIndex; }
 
-    /** \returns a non-const reference to the value of the matrix at position \a i, \a j
-      *
-      * If the element does not exist then it is inserted via the insert(Index,Index) function
-      * which itself turns the matrix into a non compressed form if that was not the case.
-      *
-      * This is a O(log(nnz_j)) operation (binary search) plus the cost of insert(Index,Index)
-      * function if the element does not already exist.
-      */
-    inline Scalar& coeffRef(Index row, Index col)
-    {
-      eigen_assert(row>=0 && row<rows() && col>=0 && col<cols());
-      const Index outer = IsRowMajor ? row : col;
-      const Index inner = IsRowMajor ? col : row;
-      Index start = m_outerIndex[outer];
-      Index end = isCompressed() ? m_outerIndex[outer + 1] : m_outerIndex[outer] + m_innerNonZeros[outer];
-      eigen_assert(end >= start && "you probably called coeffRef on a non finalized matrix");
-      Index dst = start == end ? end : m_data.searchLowerIndex(start, end, inner);
-      if (dst == end) {
-        Index capacity = m_outerIndex[outer + 1] - end;
-        if (capacity > 0) {
-          // implies uncompressed: push to back of vector
-          m_innerNonZeros[outer]++;
-          m_data.index(end) = StorageIndex(inner);
-          m_data.value(end) = Scalar(0);
-          return m_data.value(end);
-        }
-      }
-      if ((dst < end) && (m_data.index(dst) == inner))
-        // this coefficient exists, return a refernece to it
-        return m_data.value(dst);
-      else
-        // insertion will require reconfiguring the buffer
-        return insertAtByOuterInner(outer, inner, dst);
-    }
+  /** \returns a const pointer to the array of the number of non zeros of the inner vectors.
+   * This function is aimed at interoperability with other libraries.
+   * \warning it returns the null pointer 0 in compressed mode */
+  inline const StorageIndex* innerNonZeroPtr() const { return m_innerNonZeros; }
+  /** \returns a non-const pointer to the array of the number of non zeros of the inner vectors.
+   * This function is aimed at interoperability with other libraries.
+   * \warning it returns the null pointer 0 in compressed mode */
+  inline StorageIndex* innerNonZeroPtr() { return m_innerNonZeros; }
 
-    /** \returns a reference to a novel non zero coefficient with coordinates \a row x \a col.
-      * The non zero coefficient must \b not already exist.
-      *
-      * If the matrix \c *this is in compressed mode, then \c *this is turned into uncompressed
-      * mode while reserving room for 2 x this->innerSize() non zeros if reserve(Index) has not been called earlier.
-      * In this case, the insertion procedure is optimized for a \e sequential insertion mode where elements are assumed to be
-      * inserted by increasing outer-indices.
-      * 
-      * If that's not the case, then it is strongly recommended to either use a triplet-list to assemble the matrix, or to first
-      * call reserve(const SizesType &) to reserve the appropriate number of non-zero elements per inner vector.
-      *
-      * Assuming memory has been appropriately reserved, this function performs a sorted insertion in O(1)
-      * if the elements of each inner vector are inserted in increasing inner index order, and in O(nnz_j) for a random insertion.
-      *
-      */
-    inline Scalar& insert(Index row, Index col);
+  /** \internal */
+  inline Storage& data() { return m_data; }
+  /** \internal */
+  inline const Storage& data() const { return m_data; }
 
-  public:
+  /** \returns the value of the matrix at position \a i, \a j
+   * This function returns Scalar(0) if the element is an explicit \em zero */
+  inline Scalar coeff(Index row, Index col) const {
+    eigen_assert(row >= 0 && row < rows() && col >= 0 && col < cols());
 
-    /** Removes all non zeros but keep allocated memory
-      *
-      * This function does not free the currently allocated memory. To release as much as memory as possible,
-      * call \code mat.data().squeeze(); \endcode after resizing it.
-      * 
-      * \sa resize(Index,Index), data()
-      */
-    inline void setZero()
-    {
-      m_data.clear();
-      std::fill_n(m_outerIndex, m_outerSize + 1, StorageIndex(0));
-      if(m_innerNonZeros) {
-        std::fill_n(m_innerNonZeros, m_outerSize, StorageIndex(0));
+    const Index outer = IsRowMajor ? row : col;
+    const Index inner = IsRowMajor ? col : row;
+    Index end = m_innerNonZeros ? m_outerIndex[outer] + m_innerNonZeros[outer] : m_outerIndex[outer + 1];
+    return m_data.atInRange(m_outerIndex[outer], end, inner);
+  }
+
+  /** \returns a non-const reference to the value of the matrix at position \a i, \a j
+   *
+   * If the element does not exist then it is inserted via the insert(Index,Index) function
+   * which itself turns the matrix into a non compressed form if that was not the case.
+   *
+   * This is a O(log(nnz_j)) operation (binary search) plus the cost of insert(Index,Index)
+   * function if the element does not already exist.
+   */
+  inline Scalar& coeffRef(Index row, Index col) {
+    eigen_assert(row >= 0 && row < rows() && col >= 0 && col < cols());
+    const Index outer = IsRowMajor ? row : col;
+    const Index inner = IsRowMajor ? col : row;
+    Index start = m_outerIndex[outer];
+    Index end = isCompressed() ? m_outerIndex[outer + 1] : m_outerIndex[outer] + m_innerNonZeros[outer];
+    eigen_assert(end >= start && "you probably called coeffRef on a non finalized matrix");
+    Index dst = start == end ? end : m_data.searchLowerIndex(start, end, inner);
+    if (dst == end) {
+      Index capacity = m_outerIndex[outer + 1] - end;
+      if (capacity > 0) {
+        // implies uncompressed: push to back of vector
+        m_innerNonZeros[outer]++;
+        m_data.index(end) = StorageIndex(inner);
+        m_data.value(end) = Scalar(0);
+        return m_data.value(end);
       }
     }
+    if ((dst < end) && (m_data.index(dst) == inner))
+      // this coefficient exists, return a refernece to it
+      return m_data.value(dst);
+    else
+      // insertion will require reconfiguring the buffer
+      return insertAtByOuterInner(outer, inner, dst);
+  }
 
-    /** Preallocates \a reserveSize non zeros.
-      *
-      * Precondition: the matrix must be in compressed mode. */
-    inline void reserve(Index reserveSize)
-    {
-      eigen_assert(isCompressed() && "This function does not make sense in non compressed mode.");
-      m_data.reserve(reserveSize);
+  /** \returns a reference to a novel non zero coefficient with coordinates \a row x \a col.
+   * The non zero coefficient must \b not already exist.
+   *
+   * If the matrix \c *this is in compressed mode, then \c *this is turned into uncompressed
+   * mode while reserving room for 2 x this->innerSize() non zeros if reserve(Index) has not been called earlier.
+   * In this case, the insertion procedure is optimized for a \e sequential insertion mode where elements are assumed to
+   * be inserted by increasing outer-indices.
+   *
+   * If that's not the case, then it is strongly recommended to either use a triplet-list to assemble the matrix, or to
+   * first call reserve(const SizesType &) to reserve the appropriate number of non-zero elements per inner vector.
+   *
+   * Assuming memory has been appropriately reserved, this function performs a sorted insertion in O(1)
+   * if the elements of each inner vector are inserted in increasing inner index order, and in O(nnz_j) for a random
+   * insertion.
+   *
+   */
+  inline Scalar& insert(Index row, Index col);
+
+ public:
+  /** Removes all non zeros but keep allocated memory
+   *
+   * This function does not free the currently allocated memory. To release as much as memory as possible,
+   * call \code mat.data().squeeze(); \endcode after resizing it.
+   *
+   * \sa resize(Index,Index), data()
+   */
+  inline void setZero() {
+    m_data.clear();
+    std::fill_n(m_outerIndex, m_outerSize + 1, StorageIndex(0));
+    if (m_innerNonZeros) {
+      std::fill_n(m_innerNonZeros, m_outerSize, StorageIndex(0));
     }
-    
-    #ifdef EIGEN_PARSED_BY_DOXYGEN
-    /** Preallocates \a reserveSize[\c j] non zeros for each column (resp. row) \c j.
-      *
-      * This function turns the matrix in non-compressed mode.
-      * 
-      * The type \c SizesType must expose the following interface:
-        \code
-        typedef value_type;
-        const value_type& operator[](i) const;
-        \endcode
-      * for \c i in the [0,this->outerSize()[ range.
-      * Typical choices include std::vector<int>, Eigen::VectorXi, Eigen::VectorXi::Constant, etc.
-      */
-    template<class SizesType>
-    inline void reserve(const SizesType& reserveSizes);
-    #else
-    template<class SizesType>
-    inline void reserve(const SizesType& reserveSizes, const typename SizesType::value_type& enableif =
-        typename SizesType::value_type())
-    {
-      EIGEN_UNUSED_VARIABLE(enableif);
-      reserveInnerVectors(reserveSizes);
-    }
-    #endif // EIGEN_PARSED_BY_DOXYGEN
-  protected:
-    template<class SizesType>
-    inline void reserveInnerVectors(const SizesType& reserveSizes)
-    {
-      if(isCompressed())
-      {
-        Index totalReserveSize = 0;
-        for (Index j = 0; j < m_outerSize; ++j) totalReserveSize += internal::convert_index<Index>(reserveSizes[j]);
+  }
 
-        // if reserveSizes is empty, don't do anything!
-        if (totalReserveSize == 0) return;
+  /** Preallocates \a reserveSize non zeros.
+   *
+   * Precondition: the matrix must be in compressed mode. */
+  inline void reserve(Index reserveSize) {
+    eigen_assert(isCompressed() && "This function does not make sense in non compressed mode.");
+    m_data.reserve(reserveSize);
+  }
 
-        // turn the matrix into non-compressed mode
-        m_innerNonZeros = internal::conditional_aligned_new_auto<StorageIndex, true>(m_outerSize);
-        
-        // temporarily use m_innerSizes to hold the new starting points.
-        StorageIndex* newOuterIndex = m_innerNonZeros;
-        
-        Index count = 0;
-        for(Index j=0; j<m_outerSize; ++j)
-        {
-          newOuterIndex[j] = internal::convert_index<StorageIndex>(count);
-          Index reserveSize = internal::convert_index<Index>(reserveSizes[j]);
-          count += reserveSize + internal::convert_index<Index>(m_outerIndex[j+1]-m_outerIndex[j]);
-        }
+#ifdef EIGEN_PARSED_BY_DOXYGEN
+  /** Preallocates \a reserveSize[\c j] non zeros for each column (resp. row) \c j.
+    *
+    * This function turns the matrix in non-compressed mode.
+    *
+    * The type \c SizesType must expose the following interface:
+      \code
+      typedef value_type;
+      const value_type& operator[](i) const;
+      \endcode
+    * for \c i in the [0,this->outerSize()[ range.
+    * Typical choices include std::vector<int>, Eigen::VectorXi, Eigen::VectorXi::Constant, etc.
+    */
+  template <class SizesType>
+  inline void reserve(const SizesType& reserveSizes);
+#else
+  template <class SizesType>
+  inline void reserve(const SizesType& reserveSizes,
+                      const typename SizesType::value_type& enableif = typename SizesType::value_type()) {
+    EIGEN_UNUSED_VARIABLE(enableif);
+    reserveInnerVectors(reserveSizes);
+  }
+#endif  // EIGEN_PARSED_BY_DOXYGEN
+ protected:
+  template <class SizesType>
+  inline void reserveInnerVectors(const SizesType& reserveSizes) {
+    if (isCompressed()) {
+      Index totalReserveSize = 0;
+      for (Index j = 0; j < m_outerSize; ++j) totalReserveSize += internal::convert_index<Index>(reserveSizes[j]);
 
-        m_data.reserve(totalReserveSize);
-        StorageIndex previousOuterIndex = m_outerIndex[m_outerSize];
-        for(Index j=m_outerSize-1; j>=0; --j)
-        {
-          StorageIndex innerNNZ = previousOuterIndex - m_outerIndex[j];
-          StorageIndex begin = m_outerIndex[j];
-          StorageIndex end = begin + innerNNZ;
-          StorageIndex target = newOuterIndex[j];
-          internal::smart_memmove(innerIndexPtr() + begin, innerIndexPtr() + end, innerIndexPtr() + target);
-          internal::smart_memmove(valuePtr() + begin, valuePtr() + end, valuePtr() + target);
-          previousOuterIndex = m_outerIndex[j];
-          m_outerIndex[j] = newOuterIndex[j];
-          m_innerNonZeros[j] = innerNNZ;
-        }
-        if(m_outerSize>0)
-          m_outerIndex[m_outerSize] = m_outerIndex[m_outerSize-1] + m_innerNonZeros[m_outerSize-1] + internal::convert_index<StorageIndex>(reserveSizes[m_outerSize-1]);
-        
-        m_data.resize(m_outerIndex[m_outerSize]);
-      }
-      else
-      {
-        StorageIndex* newOuterIndex = internal::conditional_aligned_new_auto<StorageIndex, true>(m_outerSize + 1);
-        
-        Index count = 0;
-        for(Index j=0; j<m_outerSize; ++j)
-        {
-          newOuterIndex[j] = internal::convert_index<StorageIndex>(count);
-          Index alreadyReserved = internal::convert_index<Index>(m_outerIndex[j+1] - m_outerIndex[j] - m_innerNonZeros[j]);
-          Index reserveSize = internal::convert_index<Index>(reserveSizes[j]);
-          Index toReserve = numext::maxi(reserveSize, alreadyReserved);
-          count += toReserve + internal::convert_index<Index>(m_innerNonZeros[j]);
-        }
-        newOuterIndex[m_outerSize] = internal::convert_index<StorageIndex>(count);
+      // if reserveSizes is empty, don't do anything!
+      if (totalReserveSize == 0) return;
 
-        m_data.resize(count);
-        for(Index j=m_outerSize-1; j>=0; --j)
-        {
-          StorageIndex innerNNZ = m_innerNonZeros[j];
-          StorageIndex begin = m_outerIndex[j];
-          StorageIndex target = newOuterIndex[j];
-          m_data.moveChunk(begin, target, innerNNZ);
-        }
-        
-        std::swap(m_outerIndex, newOuterIndex);
-        internal::conditional_aligned_delete_auto<StorageIndex, true>(newOuterIndex, m_outerSize + 1);
-      }
-      
-    }
-  public:
-
-    //--- low level purely coherent filling ---
-
-    /** \internal
-      * \returns a reference to the non zero coefficient at position \a row, \a col assuming that:
-      * - the nonzero does not already exist
-      * - the new coefficient is the last one according to the storage order
-      *
-      * Before filling a given inner vector you must call the statVec(Index) function.
-      *
-      * After an insertion session, you should call the finalize() function.
-      *
-      * \sa insert, insertBackByOuterInner, startVec */
-    inline Scalar& insertBack(Index row, Index col)
-    {
-      return insertBackByOuterInner(IsRowMajor?row:col, IsRowMajor?col:row);
-    }
-
-    /** \internal
-      * \sa insertBack, startVec */
-    inline Scalar& insertBackByOuterInner(Index outer, Index inner)
-    {
-      eigen_assert(Index(m_outerIndex[outer+1]) == m_data.size() && "Invalid ordered insertion (invalid outer index)");
-      eigen_assert( (m_outerIndex[outer+1]-m_outerIndex[outer]==0 || m_data.index(m_data.size()-1)<inner) && "Invalid ordered insertion (invalid inner index)");
-      StorageIndex p = m_outerIndex[outer+1];
-      ++m_outerIndex[outer+1];
-      m_data.append(Scalar(0), inner);
-      return m_data.value(p);
-    }
-
-    /** \internal
-      * \warning use it only if you know what you are doing */
-    inline Scalar& insertBackByOuterInnerUnordered(Index outer, Index inner)
-    {
-      StorageIndex p = m_outerIndex[outer+1];
-      ++m_outerIndex[outer+1];
-      m_data.append(Scalar(0), inner);
-      return m_data.value(p);
-    }
-
-    /** \internal
-      * \sa insertBack, insertBackByOuterInner */
-    inline void startVec(Index outer)
-    {
-      eigen_assert(m_outerIndex[outer]==Index(m_data.size()) && "You must call startVec for each inner vector sequentially");
-      eigen_assert(m_outerIndex[outer+1]==0 && "You must call startVec for each inner vector sequentially");
-      m_outerIndex[outer+1] = m_outerIndex[outer];
-    }
-
-    /** \internal
-      * Must be called after inserting a set of non zero entries using the low level compressed API.
-      */
-    inline void finalize()
-    {
-      if(isCompressed())
-      {
-        StorageIndex size = internal::convert_index<StorageIndex>(m_data.size());
-        Index i = m_outerSize;
-        // find the last filled column
-        while (i>=0 && m_outerIndex[i]==0)
-          --i;
-        ++i;
-        while (i<=m_outerSize)
-        {
-          m_outerIndex[i] = size;
-          ++i;
-        }
-      }
-    }
-
-    // remove outer vectors j, j+1 ... j+num-1 and resize the matrix
-    void removeOuterVectors(Index j, Index num = 1) {
-      eigen_assert(num >= 0 && j >= 0 && j + num <= m_outerSize && "Invalid parameters");
-
-      const Index newRows = IsRowMajor ? m_outerSize - num : rows();
-      const Index newCols = IsRowMajor ? cols() : m_outerSize - num;
-
-      const Index begin = j + num;
-      const Index end = m_outerSize;
-      const Index target = j;
-
-      // if the removed vectors are not empty, uncompress the matrix
-      if (m_outerIndex[j + num] > m_outerIndex[j]) uncompress();
-
-      // shift m_outerIndex and m_innerNonZeros [num] to the left
-      internal::smart_memmove(m_outerIndex + begin, m_outerIndex + end + 1, m_outerIndex + target);
-      if (!isCompressed())
-        internal::smart_memmove(m_innerNonZeros + begin, m_innerNonZeros + end, m_innerNonZeros + target);
-
-      // if m_outerIndex[0] > 0, shift the data within the first vector while it is easy to do so
-      if (m_outerIndex[0] > StorageIndex(0)) {
-        uncompress();
-        const Index from = internal::convert_index<Index>(m_outerIndex[0]);
-        const Index to = Index(0);
-        const Index chunkSize = internal::convert_index<Index>(m_innerNonZeros[0]);
-        m_data.moveChunk(from, to, chunkSize);
-        m_outerIndex[0] = StorageIndex(0);
-      }
-
-      // truncate the matrix to the smaller size
-      conservativeResize(newRows, newCols);
-    }
-
-    // insert empty outer vectors at indices j, j+1 ... j+num-1 and resize the matrix
-    void insertEmptyOuterVectors(Index j, Index num = 1) {
-      EIGEN_USING_STD(fill_n);
-      eigen_assert(num >= 0 && j >= 0 && j < m_outerSize && "Invalid parameters");
-
-      const Index newRows = IsRowMajor ? m_outerSize + num : rows();
-      const Index newCols = IsRowMajor ? cols() : m_outerSize + num;
-
-      const Index begin = j;
-      const Index end = m_outerSize;
-      const Index target = j + num;
-
-      // expand the matrix to the larger size
-      conservativeResize(newRows, newCols);
-
-      // shift m_outerIndex and m_innerNonZeros [num] to the right
-      internal::smart_memmove(m_outerIndex + begin, m_outerIndex + end + 1, m_outerIndex + target);
-      // m_outerIndex[begin] == m_outerIndex[target], set all indices in this range to same value
-      fill_n(m_outerIndex + begin, num, m_outerIndex[begin]);
-
-      if (!isCompressed()) {
-        internal::smart_memmove(m_innerNonZeros + begin, m_innerNonZeros + end, m_innerNonZeros + target);
-        // set the nonzeros of the newly inserted vectors to 0
-        fill_n(m_innerNonZeros + begin, num, StorageIndex(0));
-      }
-    }
-
-    template<typename InputIterators>
-    void setFromTriplets(const InputIterators& begin, const InputIterators& end);
-
-    template<typename InputIterators,typename DupFunctor>
-    void setFromTriplets(const InputIterators& begin, const InputIterators& end, DupFunctor dup_func);
-
-    template<typename Derived, typename DupFunctor>
-    void collapseDuplicates(DenseBase<Derived>& wi, DupFunctor dup_func = DupFunctor());
-
-    template<typename InputIterators>
-    void setFromSortedTriplets(const InputIterators& begin, const InputIterators& end);
-
-    template<typename InputIterators, typename DupFunctor>
-    void setFromSortedTriplets(const InputIterators& begin, const InputIterators& end, DupFunctor dup_func);
-
-    template<typename InputIterators>
-    void insertFromTriplets(const InputIterators& begin, const InputIterators& end);
-
-    template<typename InputIterators, typename DupFunctor>
-    void insertFromTriplets(const InputIterators& begin, const InputIterators& end, DupFunctor dup_func);
-
-    template<typename InputIterators>
-    void insertFromSortedTriplets(const InputIterators& begin, const InputIterators& end);
-
-    template<typename InputIterators, typename DupFunctor>
-    void insertFromSortedTriplets(const InputIterators& begin, const InputIterators& end, DupFunctor dup_func);
-
-    //---
-    
-    /** \internal
-      * same as insert(Index,Index) except that the indices are given relative to the storage order */
-    Scalar& insertByOuterInner(Index j, Index i)
-    {
-      Index start = m_outerIndex[j];
-      Index end = isCompressed() ? m_outerIndex[j + 1] : start + m_innerNonZeros[j];
-      Index dst = start == end ? end : m_data.searchLowerIndex(start, end, i);
-      if (dst == end) {
-        Index capacity = m_outerIndex[j + 1] - end;
-        if (capacity > 0) {
-          // implies uncompressed: push to back of vector
-          m_innerNonZeros[j]++;
-          m_data.index(end) = StorageIndex(i);
-          m_data.value(end) = Scalar(0);
-          return m_data.value(end);
-        }
-      }
-      eigen_assert((dst == end || m_data.index(dst) != i) &&
-          "you cannot insert an element that already exists, you must call coeffRef to this end");
-      return insertAtByOuterInner(j, i, dst);
-    }
-
-    /** Turns the matrix into the \em compressed format.
-      */
-    void makeCompressed()
-    {
-      if (isCompressed()) return;
-      
-      eigen_internal_assert(m_outerIndex!=0 && m_outerSize>0);
-
-      StorageIndex start = m_outerIndex[1];
-      m_outerIndex[1] = m_innerNonZeros[0];
-      // try to move fewer, larger contiguous chunks
-      Index copyStart = start;
-      Index copyTarget = m_innerNonZeros[0];
-      for (Index j = 1; j < m_outerSize; j++)
-      {
-        StorageIndex end = start + m_innerNonZeros[j];
-        StorageIndex nextStart = m_outerIndex[j + 1];
-        // dont forget to move the last chunk!
-        bool breakUpCopy = (end != nextStart) || (j == m_outerSize - 1);
-        if (breakUpCopy)
-        {
-          Index chunkSize = end - copyStart;
-          if(chunkSize > 0) m_data.moveChunk(copyStart, copyTarget, chunkSize);
-          copyStart = nextStart;
-          copyTarget += chunkSize;
-        }
-        start = nextStart;
-        m_outerIndex[j + 1] = m_outerIndex[j] + m_innerNonZeros[j];
-      }
-      m_data.resize(m_outerIndex[m_outerSize]);
-
-      // release as much memory as possible
-      internal::conditional_aligned_delete_auto<StorageIndex, true>(m_innerNonZeros, m_outerSize);
-      m_innerNonZeros = 0;
-      m_data.squeeze();
-    }
-
-    /** Turns the matrix into the uncompressed mode */
-    void uncompress()
-    {
-      if (!isCompressed()) return;
+      // turn the matrix into non-compressed mode
       m_innerNonZeros = internal::conditional_aligned_new_auto<StorageIndex, true>(m_outerSize);
-      if (m_outerIndex[m_outerSize] == 0)
-        std::fill_n(m_innerNonZeros, m_outerSize, StorageIndex(0));
+
+      // temporarily use m_innerSizes to hold the new starting points.
+      StorageIndex* newOuterIndex = m_innerNonZeros;
+
+      Index count = 0;
+      for (Index j = 0; j < m_outerSize; ++j) {
+        newOuterIndex[j] = internal::convert_index<StorageIndex>(count);
+        Index reserveSize = internal::convert_index<Index>(reserveSizes[j]);
+        count += reserveSize + internal::convert_index<Index>(m_outerIndex[j + 1] - m_outerIndex[j]);
+      }
+
+      m_data.reserve(totalReserveSize);
+      StorageIndex previousOuterIndex = m_outerIndex[m_outerSize];
+      for (Index j = m_outerSize - 1; j >= 0; --j) {
+        StorageIndex innerNNZ = previousOuterIndex - m_outerIndex[j];
+        StorageIndex begin = m_outerIndex[j];
+        StorageIndex end = begin + innerNNZ;
+        StorageIndex target = newOuterIndex[j];
+        internal::smart_memmove(innerIndexPtr() + begin, innerIndexPtr() + end, innerIndexPtr() + target);
+        internal::smart_memmove(valuePtr() + begin, valuePtr() + end, valuePtr() + target);
+        previousOuterIndex = m_outerIndex[j];
+        m_outerIndex[j] = newOuterIndex[j];
+        m_innerNonZeros[j] = innerNNZ;
+      }
+      if (m_outerSize > 0)
+        m_outerIndex[m_outerSize] = m_outerIndex[m_outerSize - 1] + m_innerNonZeros[m_outerSize - 1] +
+                                    internal::convert_index<StorageIndex>(reserveSizes[m_outerSize - 1]);
+
+      m_data.resize(m_outerIndex[m_outerSize]);
+    } else {
+      StorageIndex* newOuterIndex = internal::conditional_aligned_new_auto<StorageIndex, true>(m_outerSize + 1);
+
+      Index count = 0;
+      for (Index j = 0; j < m_outerSize; ++j) {
+        newOuterIndex[j] = internal::convert_index<StorageIndex>(count);
+        Index alreadyReserved =
+            internal::convert_index<Index>(m_outerIndex[j + 1] - m_outerIndex[j] - m_innerNonZeros[j]);
+        Index reserveSize = internal::convert_index<Index>(reserveSizes[j]);
+        Index toReserve = numext::maxi(reserveSize, alreadyReserved);
+        count += toReserve + internal::convert_index<Index>(m_innerNonZeros[j]);
+      }
+      newOuterIndex[m_outerSize] = internal::convert_index<StorageIndex>(count);
+
+      m_data.resize(count);
+      for (Index j = m_outerSize - 1; j >= 0; --j) {
+        StorageIndex innerNNZ = m_innerNonZeros[j];
+        StorageIndex begin = m_outerIndex[j];
+        StorageIndex target = newOuterIndex[j];
+        m_data.moveChunk(begin, target, innerNNZ);
+      }
+
+      std::swap(m_outerIndex, newOuterIndex);
+      internal::conditional_aligned_delete_auto<StorageIndex, true>(newOuterIndex, m_outerSize + 1);
+    }
+  }
+
+ public:
+  //--- low level purely coherent filling ---
+
+  /** \internal
+   * \returns a reference to the non zero coefficient at position \a row, \a col assuming that:
+   * - the nonzero does not already exist
+   * - the new coefficient is the last one according to the storage order
+   *
+   * Before filling a given inner vector you must call the statVec(Index) function.
+   *
+   * After an insertion session, you should call the finalize() function.
+   *
+   * \sa insert, insertBackByOuterInner, startVec */
+  inline Scalar& insertBack(Index row, Index col) {
+    return insertBackByOuterInner(IsRowMajor ? row : col, IsRowMajor ? col : row);
+  }
+
+  /** \internal
+   * \sa insertBack, startVec */
+  inline Scalar& insertBackByOuterInner(Index outer, Index inner) {
+    eigen_assert(Index(m_outerIndex[outer + 1]) == m_data.size() && "Invalid ordered insertion (invalid outer index)");
+    eigen_assert((m_outerIndex[outer + 1] - m_outerIndex[outer] == 0 || m_data.index(m_data.size() - 1) < inner) &&
+                 "Invalid ordered insertion (invalid inner index)");
+    StorageIndex p = m_outerIndex[outer + 1];
+    ++m_outerIndex[outer + 1];
+    m_data.append(Scalar(0), inner);
+    return m_data.value(p);
+  }
+
+  /** \internal
+   * \warning use it only if you know what you are doing */
+  inline Scalar& insertBackByOuterInnerUnordered(Index outer, Index inner) {
+    StorageIndex p = m_outerIndex[outer + 1];
+    ++m_outerIndex[outer + 1];
+    m_data.append(Scalar(0), inner);
+    return m_data.value(p);
+  }
+
+  /** \internal
+   * \sa insertBack, insertBackByOuterInner */
+  inline void startVec(Index outer) {
+    eigen_assert(m_outerIndex[outer] == Index(m_data.size()) &&
+                 "You must call startVec for each inner vector sequentially");
+    eigen_assert(m_outerIndex[outer + 1] == 0 && "You must call startVec for each inner vector sequentially");
+    m_outerIndex[outer + 1] = m_outerIndex[outer];
+  }
+
+  /** \internal
+   * Must be called after inserting a set of non zero entries using the low level compressed API.
+   */
+  inline void finalize() {
+    if (isCompressed()) {
+      StorageIndex size = internal::convert_index<StorageIndex>(m_data.size());
+      Index i = m_outerSize;
+      // find the last filled column
+      while (i >= 0 && m_outerIndex[i] == 0) --i;
+      ++i;
+      while (i <= m_outerSize) {
+        m_outerIndex[i] = size;
+        ++i;
+      }
+    }
+  }
+
+  // remove outer vectors j, j+1 ... j+num-1 and resize the matrix
+  void removeOuterVectors(Index j, Index num = 1) {
+    eigen_assert(num >= 0 && j >= 0 && j + num <= m_outerSize && "Invalid parameters");
+
+    const Index newRows = IsRowMajor ? m_outerSize - num : rows();
+    const Index newCols = IsRowMajor ? cols() : m_outerSize - num;
+
+    const Index begin = j + num;
+    const Index end = m_outerSize;
+    const Index target = j;
+
+    // if the removed vectors are not empty, uncompress the matrix
+    if (m_outerIndex[j + num] > m_outerIndex[j]) uncompress();
+
+    // shift m_outerIndex and m_innerNonZeros [num] to the left
+    internal::smart_memmove(m_outerIndex + begin, m_outerIndex + end + 1, m_outerIndex + target);
+    if (!isCompressed())
+      internal::smart_memmove(m_innerNonZeros + begin, m_innerNonZeros + end, m_innerNonZeros + target);
+
+    // if m_outerIndex[0] > 0, shift the data within the first vector while it is easy to do so
+    if (m_outerIndex[0] > StorageIndex(0)) {
+      uncompress();
+      const Index from = internal::convert_index<Index>(m_outerIndex[0]);
+      const Index to = Index(0);
+      const Index chunkSize = internal::convert_index<Index>(m_innerNonZeros[0]);
+      m_data.moveChunk(from, to, chunkSize);
+      m_outerIndex[0] = StorageIndex(0);
+    }
+
+    // truncate the matrix to the smaller size
+    conservativeResize(newRows, newCols);
+  }
+
+  // insert empty outer vectors at indices j, j+1 ... j+num-1 and resize the matrix
+  void insertEmptyOuterVectors(Index j, Index num = 1) {
+    EIGEN_USING_STD(fill_n);
+    eigen_assert(num >= 0 && j >= 0 && j < m_outerSize && "Invalid parameters");
+
+    const Index newRows = IsRowMajor ? m_outerSize + num : rows();
+    const Index newCols = IsRowMajor ? cols() : m_outerSize + num;
+
+    const Index begin = j;
+    const Index end = m_outerSize;
+    const Index target = j + num;
+
+    // expand the matrix to the larger size
+    conservativeResize(newRows, newCols);
+
+    // shift m_outerIndex and m_innerNonZeros [num] to the right
+    internal::smart_memmove(m_outerIndex + begin, m_outerIndex + end + 1, m_outerIndex + target);
+    // m_outerIndex[begin] == m_outerIndex[target], set all indices in this range to same value
+    fill_n(m_outerIndex + begin, num, m_outerIndex[begin]);
+
+    if (!isCompressed()) {
+      internal::smart_memmove(m_innerNonZeros + begin, m_innerNonZeros + end, m_innerNonZeros + target);
+      // set the nonzeros of the newly inserted vectors to 0
+      fill_n(m_innerNonZeros + begin, num, StorageIndex(0));
+    }
+  }
+
+  template <typename InputIterators>
+  void setFromTriplets(const InputIterators& begin, const InputIterators& end);
+
+  template <typename InputIterators, typename DupFunctor>
+  void setFromTriplets(const InputIterators& begin, const InputIterators& end, DupFunctor dup_func);
+
+  template <typename Derived, typename DupFunctor>
+  void collapseDuplicates(DenseBase<Derived>& wi, DupFunctor dup_func = DupFunctor());
+
+  template <typename InputIterators>
+  void setFromSortedTriplets(const InputIterators& begin, const InputIterators& end);
+
+  template <typename InputIterators, typename DupFunctor>
+  void setFromSortedTriplets(const InputIterators& begin, const InputIterators& end, DupFunctor dup_func);
+
+  template <typename InputIterators>
+  void insertFromTriplets(const InputIterators& begin, const InputIterators& end);
+
+  template <typename InputIterators, typename DupFunctor>
+  void insertFromTriplets(const InputIterators& begin, const InputIterators& end, DupFunctor dup_func);
+
+  template <typename InputIterators>
+  void insertFromSortedTriplets(const InputIterators& begin, const InputIterators& end);
+
+  template <typename InputIterators, typename DupFunctor>
+  void insertFromSortedTriplets(const InputIterators& begin, const InputIterators& end, DupFunctor dup_func);
+
+  //---
+
+  /** \internal
+   * same as insert(Index,Index) except that the indices are given relative to the storage order */
+  Scalar& insertByOuterInner(Index j, Index i) {
+    Index start = m_outerIndex[j];
+    Index end = isCompressed() ? m_outerIndex[j + 1] : start + m_innerNonZeros[j];
+    Index dst = start == end ? end : m_data.searchLowerIndex(start, end, i);
+    if (dst == end) {
+      Index capacity = m_outerIndex[j + 1] - end;
+      if (capacity > 0) {
+        // implies uncompressed: push to back of vector
+        m_innerNonZeros[j]++;
+        m_data.index(end) = StorageIndex(i);
+        m_data.value(end) = Scalar(0);
+        return m_data.value(end);
+      }
+    }
+    eigen_assert((dst == end || m_data.index(dst) != i) &&
+                 "you cannot insert an element that already exists, you must call coeffRef to this end");
+    return insertAtByOuterInner(j, i, dst);
+  }
+
+  /** Turns the matrix into the \em compressed format.
+   */
+  void makeCompressed() {
+    if (isCompressed()) return;
+
+    eigen_internal_assert(m_outerIndex != 0 && m_outerSize > 0);
+
+    StorageIndex start = m_outerIndex[1];
+    m_outerIndex[1] = m_innerNonZeros[0];
+    // try to move fewer, larger contiguous chunks
+    Index copyStart = start;
+    Index copyTarget = m_innerNonZeros[0];
+    for (Index j = 1; j < m_outerSize; j++) {
+      StorageIndex end = start + m_innerNonZeros[j];
+      StorageIndex nextStart = m_outerIndex[j + 1];
+      // dont forget to move the last chunk!
+      bool breakUpCopy = (end != nextStart) || (j == m_outerSize - 1);
+      if (breakUpCopy) {
+        Index chunkSize = end - copyStart;
+        if (chunkSize > 0) m_data.moveChunk(copyStart, copyTarget, chunkSize);
+        copyStart = nextStart;
+        copyTarget += chunkSize;
+      }
+      start = nextStart;
+      m_outerIndex[j + 1] = m_outerIndex[j] + m_innerNonZeros[j];
+    }
+    m_data.resize(m_outerIndex[m_outerSize]);
+
+    // release as much memory as possible
+    internal::conditional_aligned_delete_auto<StorageIndex, true>(m_innerNonZeros, m_outerSize);
+    m_innerNonZeros = 0;
+    m_data.squeeze();
+  }
+
+  /** Turns the matrix into the uncompressed mode */
+  void uncompress() {
+    if (!isCompressed()) return;
+    m_innerNonZeros = internal::conditional_aligned_new_auto<StorageIndex, true>(m_outerSize);
+    if (m_outerIndex[m_outerSize] == 0)
+      std::fill_n(m_innerNonZeros, m_outerSize, StorageIndex(0));
+    else
+      for (Index j = 0; j < m_outerSize; j++) m_innerNonZeros[j] = m_outerIndex[j + 1] - m_outerIndex[j];
+  }
+
+  /** Suppresses all nonzeros which are \b much \b smaller \b than \a reference under the tolerance \a epsilon */
+  void prune(const Scalar& reference, const RealScalar& epsilon = NumTraits<RealScalar>::dummy_precision()) {
+    prune(default_prunning_func(reference, epsilon));
+  }
+
+  /** Turns the matrix into compressed format, and suppresses all nonzeros which do not satisfy the predicate \a keep.
+   * The functor type \a KeepFunc must implement the following function:
+   * \code
+   * bool operator() (const Index& row, const Index& col, const Scalar& value) const;
+   * \endcode
+   * \sa prune(Scalar,RealScalar)
+   */
+  template <typename KeepFunc>
+  void prune(const KeepFunc& keep = KeepFunc()) {
+    StorageIndex k = 0;
+    for (Index j = 0; j < m_outerSize; ++j) {
+      StorageIndex previousStart = m_outerIndex[j];
+      if (isCompressed())
+        m_outerIndex[j] = k;
       else
-        for (Index j = 0; j < m_outerSize; j++) m_innerNonZeros[j] = m_outerIndex[j + 1] - m_outerIndex[j];
+        k = m_outerIndex[j];
+      StorageIndex end = isCompressed() ? m_outerIndex[j + 1] : previousStart + m_innerNonZeros[j];
+      for (StorageIndex i = previousStart; i < end; ++i) {
+        StorageIndex row = IsRowMajor ? StorageIndex(j) : m_data.index(i);
+        StorageIndex col = IsRowMajor ? m_data.index(i) : StorageIndex(j);
+        bool keepEntry = keep(row, col, m_data.value(i));
+        if (keepEntry) {
+          m_data.value(k) = m_data.value(i);
+          m_data.index(k) = m_data.index(i);
+          ++k;
+        } else if (!isCompressed())
+          m_innerNonZeros[j]--;
+      }
     }
+    if (isCompressed()) {
+      m_outerIndex[m_outerSize] = k;
+      m_data.resize(k, 0);
+    }
+  }
 
-    /** Suppresses all nonzeros which are \b much \b smaller \b than \a reference under the tolerance \a epsilon */
-    void prune(const Scalar& reference, const RealScalar& epsilon = NumTraits<RealScalar>::dummy_precision())
-    {
-      prune(default_prunning_func(reference,epsilon));
+  /** Resizes the matrix to a \a rows x \a cols matrix leaving old values untouched.
+   *
+   * If the sizes of the matrix are decreased, then the matrix is turned to \b uncompressed-mode
+   * and the storage of the out of bounds coefficients is kept and reserved.
+   * Call makeCompressed() to pack the entries and squeeze extra memory.
+   *
+   * \sa reserve(), setZero(), makeCompressed()
+   */
+  void conservativeResize(Index rows, Index cols) {
+    // If one dimension is null, then there is nothing to be preserved
+    if (rows == 0 || cols == 0) return resize(rows, cols);
+
+    Index newOuterSize = IsRowMajor ? rows : cols;
+    Index newInnerSize = IsRowMajor ? cols : rows;
+
+    Index innerChange = newInnerSize - m_innerSize;
+    Index outerChange = newOuterSize - m_outerSize;
+
+    if (outerChange != 0) {
+      m_outerIndex = internal::conditional_aligned_realloc_new_auto<StorageIndex, true>(m_outerIndex, newOuterSize + 1,
+                                                                                        m_outerSize + 1);
+
+      if (!isCompressed())
+        m_innerNonZeros = internal::conditional_aligned_realloc_new_auto<StorageIndex, true>(m_innerNonZeros,
+                                                                                             newOuterSize, m_outerSize);
+
+      if (outerChange > 0) {
+        StorageIndex lastIdx = m_outerSize == 0 ? StorageIndex(0) : m_outerIndex[m_outerSize];
+        std::fill_n(m_outerIndex + m_outerSize, outerChange + 1, lastIdx);
+
+        if (!isCompressed()) std::fill_n(m_innerNonZeros + m_outerSize, outerChange, StorageIndex(0));
+      }
     }
-    
-    /** Turns the matrix into compressed format, and suppresses all nonzeros which do not satisfy the predicate \a keep.
-      * The functor type \a KeepFunc must implement the following function:
-      * \code
-      * bool operator() (const Index& row, const Index& col, const Scalar& value) const;
-      * \endcode
-      * \sa prune(Scalar,RealScalar)
-      */
-    template<typename KeepFunc>
-    void prune(const KeepFunc& keep = KeepFunc())
-    {
-      StorageIndex k = 0;
-      for(Index j=0; j<m_outerSize; ++j)
-      {
-        StorageIndex previousStart = m_outerIndex[j];
-        if (isCompressed())
-          m_outerIndex[j] = k;
-        else
-          k = m_outerIndex[j];
-        StorageIndex end = isCompressed() ? m_outerIndex[j+1] : previousStart + m_innerNonZeros[j];
-        for(StorageIndex i=previousStart; i<end; ++i)
-        {
-          StorageIndex row = IsRowMajor ? StorageIndex(j) : m_data.index(i);
-          StorageIndex col = IsRowMajor ? m_data.index(i) : StorageIndex(j);
-          bool keepEntry = keep(row, col, m_data.value(i));
-          if (keepEntry) {
-            m_data.value(k) = m_data.value(i);
-            m_data.index(k) = m_data.index(i);
-            ++k;
-          } else if (!isCompressed())
-            m_innerNonZeros[j]--;
+    m_outerSize = newOuterSize;
+
+    if (innerChange < 0) {
+      for (Index j = 0; j < m_outerSize; j++) {
+        Index start = m_outerIndex[j];
+        Index end = isCompressed() ? m_outerIndex[j + 1] : start + m_innerNonZeros[j];
+        Index lb = m_data.searchLowerIndex(start, end, newInnerSize);
+        if (lb != end) {
+          uncompress();
+          m_innerNonZeros[j] = StorageIndex(lb - start);
         }
       }
-      if (isCompressed()) {
-        m_outerIndex[m_outerSize] = k;
-        m_data.resize(k, 0);
-      }
+    }
+    m_innerSize = newInnerSize;
+
+    Index newSize = m_outerIndex[m_outerSize];
+    eigen_assert(newSize <= m_data.size());
+    m_data.resize(newSize);
+  }
+
+  /** Resizes the matrix to a \a rows x \a cols matrix and initializes it to zero.
+   *
+   * This function does not free the currently allocated memory. To release as much as memory as possible,
+   * call \code mat.data().squeeze(); \endcode after resizing it.
+   *
+   * \sa reserve(), setZero()
+   */
+  void resize(Index rows, Index cols) {
+    const Index outerSize = IsRowMajor ? rows : cols;
+    m_innerSize = IsRowMajor ? cols : rows;
+    m_data.clear();
+
+    if ((m_outerIndex == 0) || (m_outerSize != outerSize)) {
+      m_outerIndex = internal::conditional_aligned_realloc_new_auto<StorageIndex, true>(m_outerIndex, outerSize + 1,
+                                                                                        m_outerSize + 1);
+      m_outerSize = outerSize;
     }
 
-    /** Resizes the matrix to a \a rows x \a cols matrix leaving old values untouched.
-      *
-      * If the sizes of the matrix are decreased, then the matrix is turned to \b uncompressed-mode
-      * and the storage of the out of bounds coefficients is kept and reserved.
-      * Call makeCompressed() to pack the entries and squeeze extra memory.
-      *
-      * \sa reserve(), setZero(), makeCompressed()
-      */
-    void conservativeResize(Index rows, Index cols) {
+    internal::conditional_aligned_delete_auto<StorageIndex, true>(m_innerNonZeros, m_outerSize);
+    m_innerNonZeros = 0;
 
-      // If one dimension is null, then there is nothing to be preserved
-      if (rows == 0 || cols == 0) return resize(rows, cols);
+    std::fill_n(m_outerIndex, m_outerSize + 1, StorageIndex(0));
+  }
 
-      Index newOuterSize = IsRowMajor ? rows : cols;
-      Index newInnerSize = IsRowMajor ? cols : rows;
+  /** \internal
+   * Resize the nonzero vector to \a size */
+  void resizeNonZeros(Index size) { m_data.resize(size); }
 
-      Index innerChange = newInnerSize - m_innerSize;
-      Index outerChange = newOuterSize - m_outerSize;
+  /** \returns a const expression of the diagonal coefficients. */
+  const ConstDiagonalReturnType diagonal() const { return ConstDiagonalReturnType(*this); }
 
-      if (outerChange != 0) {
-        m_outerIndex = internal::conditional_aligned_realloc_new_auto<StorageIndex, true>(
-            m_outerIndex, newOuterSize + 1, m_outerSize + 1);
+  /** \returns a read-write expression of the diagonal coefficients.
+   * \warning If the diagonal entries are written, then all diagonal
+   * entries \b must already exist, otherwise an assertion will be raised.
+   */
+  DiagonalReturnType diagonal() { return DiagonalReturnType(*this); }
 
-        if (!isCompressed())
-          m_innerNonZeros = internal::conditional_aligned_realloc_new_auto<StorageIndex, true>(
-              m_innerNonZeros, newOuterSize, m_outerSize);
+  /** Default constructor yielding an empty \c 0 \c x \c 0 matrix */
+  inline SparseMatrix() : m_outerSize(0), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0) { resize(0, 0); }
 
-        if (outerChange > 0) {
-          StorageIndex lastIdx = m_outerSize == 0 ? StorageIndex(0) : m_outerIndex[m_outerSize];
-          std::fill_n(m_outerIndex + m_outerSize, outerChange + 1, lastIdx);
+  /** Constructs a \a rows \c x \a cols empty matrix */
+  inline SparseMatrix(Index rows, Index cols) : m_outerSize(0), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0) {
+    resize(rows, cols);
+  }
 
-          if (!isCompressed()) std::fill_n(m_innerNonZeros + m_outerSize, outerChange, StorageIndex(0));
-        }
-      }
-      m_outerSize = newOuterSize;
-
-      if (innerChange < 0) {
-        for (Index j = 0; j < m_outerSize; j++) {
-          Index start = m_outerIndex[j];
-          Index end = isCompressed() ? m_outerIndex[j + 1] : start + m_innerNonZeros[j];
-          Index lb = m_data.searchLowerIndex(start, end, newInnerSize);
-          if (lb != end) {
-            uncompress();
-            m_innerNonZeros[j] = StorageIndex(lb - start);
-          }
-        }
-      }
-      m_innerSize = newInnerSize;
-
-      Index newSize = m_outerIndex[m_outerSize];
-      eigen_assert(newSize <= m_data.size());
-      m_data.resize(newSize);
-    }
-    
-    /** Resizes the matrix to a \a rows x \a cols matrix and initializes it to zero.
-      * 
-      * This function does not free the currently allocated memory. To release as much as memory as possible,
-      * call \code mat.data().squeeze(); \endcode after resizing it.
-      * 
-      * \sa reserve(), setZero()
-      */
-    void resize(Index rows, Index cols)
-    {
-      const Index outerSize = IsRowMajor ? rows : cols;
-      m_innerSize = IsRowMajor ? cols : rows;
-      m_data.clear();
-
-      if ((m_outerIndex == 0) || (m_outerSize != outerSize)) {
-        m_outerIndex = internal::conditional_aligned_realloc_new_auto<StorageIndex, true>(m_outerIndex, outerSize + 1, m_outerSize + 1);
-        m_outerSize = outerSize;
-      }
-
-      internal::conditional_aligned_delete_auto<StorageIndex, true>(m_innerNonZeros, m_outerSize);
-      m_innerNonZeros = 0;
-
-      std::fill_n(m_outerIndex, m_outerSize + 1, StorageIndex(0));
-    }
-
-    /** \internal
-      * Resize the nonzero vector to \a size */
-    void resizeNonZeros(Index size)
-    {
-      m_data.resize(size);
-    }
-
-    /** \returns a const expression of the diagonal coefficients. */
-    const ConstDiagonalReturnType diagonal() const { return ConstDiagonalReturnType(*this); }
-    
-    /** \returns a read-write expression of the diagonal coefficients.
-      * \warning If the diagonal entries are written, then all diagonal
-      * entries \b must already exist, otherwise an assertion will be raised.
-      */
-    DiagonalReturnType diagonal() { return DiagonalReturnType(*this); }
-
-    /** Default constructor yielding an empty \c 0 \c x \c 0 matrix */
-    inline SparseMatrix()
-      : m_outerSize(0), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0)
-    {
-      resize(0, 0);
-    }
-
-    /** Constructs a \a rows \c x \a cols empty matrix */
-    inline SparseMatrix(Index rows, Index cols)
-      : m_outerSize(0), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0)
-    {
-      resize(rows, cols);
-    }
-
-    /** Constructs a sparse matrix from the sparse expression \a other */
-    template<typename OtherDerived>
-    inline SparseMatrix(const SparseMatrixBase<OtherDerived>& other)
-      : m_outerSize(0), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0)
-    {
-      EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename OtherDerived::Scalar>::value),
+  /** Constructs a sparse matrix from the sparse expression \a other */
+  template <typename OtherDerived>
+  inline SparseMatrix(const SparseMatrixBase<OtherDerived>& other)
+      : m_outerSize(0), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0) {
+    EIGEN_STATIC_ASSERT(
+        (internal::is_same<Scalar, typename OtherDerived::Scalar>::value),
         YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
-      const bool needToTranspose = (Flags & RowMajorBit) != (internal::evaluator<OtherDerived>::Flags & RowMajorBit);
-      if (needToTranspose)
-        *this = other.derived();
-      else
-      {
-        #ifdef EIGEN_SPARSE_CREATE_TEMPORARY_PLUGIN
-          EIGEN_SPARSE_CREATE_TEMPORARY_PLUGIN
-        #endif
-        internal::call_assignment_no_alias(*this, other.derived());
-      }
-    }
-
-    /** Constructs a sparse matrix from the sparse selfadjoint view \a other */
-    template<typename OtherDerived, unsigned int UpLo>
-    inline SparseMatrix(const SparseSelfAdjointView<OtherDerived, UpLo>& other)
-      : m_outerSize(0), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0)
-    {
-      Base::operator=(other);
-    }
-
-    inline SparseMatrix(SparseMatrix&& other) : Base(), m_outerSize(0), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0)
-    {
-      *this = other.derived().markAsRValue();
-    }
-
-    /** Copy constructor (it performs a deep copy) */
-    inline SparseMatrix(const SparseMatrix& other)
-      : Base(), m_outerSize(0), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0)
-    {
+    const bool needToTranspose = (Flags & RowMajorBit) != (internal::evaluator<OtherDerived>::Flags & RowMajorBit);
+    if (needToTranspose)
       *this = other.derived();
+    else {
+#ifdef EIGEN_SPARSE_CREATE_TEMPORARY_PLUGIN
+      EIGEN_SPARSE_CREATE_TEMPORARY_PLUGIN
+#endif
+      internal::call_assignment_no_alias(*this, other.derived());
     }
+  }
 
-    /** \brief Copy constructor with in-place evaluation */
-    template<typename OtherDerived>
-    SparseMatrix(const ReturnByValue<OtherDerived>& other)
-      : Base(), m_outerSize(0), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0)
-    {
+  /** Constructs a sparse matrix from the sparse selfadjoint view \a other */
+  template <typename OtherDerived, unsigned int UpLo>
+  inline SparseMatrix(const SparseSelfAdjointView<OtherDerived, UpLo>& other)
+      : m_outerSize(0), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0) {
+    Base::operator=(other);
+  }
+
+  inline SparseMatrix(SparseMatrix&& other)
+      : Base(), m_outerSize(0), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0) {
+    *this = other.derived().markAsRValue();
+  }
+
+  /** Copy constructor (it performs a deep copy) */
+  inline SparseMatrix(const SparseMatrix& other)
+      : Base(), m_outerSize(0), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0) {
+    *this = other.derived();
+  }
+
+  /** \brief Copy constructor with in-place evaluation */
+  template <typename OtherDerived>
+  SparseMatrix(const ReturnByValue<OtherDerived>& other)
+      : Base(), m_outerSize(0), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0) {
+    initAssignment(other);
+    other.evalTo(*this);
+  }
+
+  /** \brief Copy constructor with in-place evaluation */
+  template <typename OtherDerived>
+  explicit SparseMatrix(const DiagonalBase<OtherDerived>& other)
+      : Base(), m_outerSize(0), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0) {
+    *this = other.derived();
+  }
+
+  /** Swaps the content of two sparse matrices of the same type.
+   * This is a fast operation that simply swaps the underlying pointers and parameters. */
+  inline void swap(SparseMatrix& other) {
+    // EIGEN_DBG_SPARSE(std::cout << "SparseMatrix:: swap\n");
+    std::swap(m_outerIndex, other.m_outerIndex);
+    std::swap(m_innerSize, other.m_innerSize);
+    std::swap(m_outerSize, other.m_outerSize);
+    std::swap(m_innerNonZeros, other.m_innerNonZeros);
+    m_data.swap(other.m_data);
+  }
+
+  /** Sets *this to the identity matrix.
+   * This function also turns the matrix into compressed mode, and drop any reserved memory. */
+  inline void setIdentity() {
+    eigen_assert(m_outerSize == m_innerSize && "ONLY FOR SQUARED MATRICES");
+    internal::conditional_aligned_delete_auto<StorageIndex, true>(m_innerNonZeros, m_outerSize);
+    m_innerNonZeros = 0;
+    m_data.resize(m_outerSize);
+    // is it necessary to squeeze?
+    m_data.squeeze();
+    std::iota(m_outerIndex, m_outerIndex + m_outerSize + 1, StorageIndex(0));
+    std::iota(innerIndexPtr(), innerIndexPtr() + m_outerSize, StorageIndex(0));
+    std::fill_n(valuePtr(), m_outerSize, Scalar(1));
+  }
+
+  inline SparseMatrix& operator=(const SparseMatrix& other) {
+    if (other.isRValue()) {
+      swap(other.const_cast_derived());
+    } else if (this != &other) {
+#ifdef EIGEN_SPARSE_CREATE_TEMPORARY_PLUGIN
+      EIGEN_SPARSE_CREATE_TEMPORARY_PLUGIN
+#endif
       initAssignment(other);
-      other.evalTo(*this);
-    }
-
-    /** \brief Copy constructor with in-place evaluation */
-    template<typename OtherDerived>
-    explicit SparseMatrix(const DiagonalBase<OtherDerived>& other)
-      : Base(), m_outerSize(0), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0)
-    {
-      *this = other.derived();
-    }
-
-    /** Swaps the content of two sparse matrices of the same type.
-      * This is a fast operation that simply swaps the underlying pointers and parameters. */
-    inline void swap(SparseMatrix& other)
-    {
-      //EIGEN_DBG_SPARSE(std::cout << "SparseMatrix:: swap\n");
-      std::swap(m_outerIndex, other.m_outerIndex);
-      std::swap(m_innerSize, other.m_innerSize);
-      std::swap(m_outerSize, other.m_outerSize);
-      std::swap(m_innerNonZeros, other.m_innerNonZeros);
-      m_data.swap(other.m_data);
-    }
-
-    /** Sets *this to the identity matrix.
-      * This function also turns the matrix into compressed mode, and drop any reserved memory. */
-    inline void setIdentity()
-    {
-      eigen_assert(m_outerSize == m_innerSize && "ONLY FOR SQUARED MATRICES");
-      internal::conditional_aligned_delete_auto<StorageIndex, true>(m_innerNonZeros, m_outerSize);
-      m_innerNonZeros = 0;
-      m_data.resize(m_outerSize);
-      // is it necessary to squeeze?
-      m_data.squeeze();
-      std::iota(m_outerIndex, m_outerIndex + m_outerSize + 1, StorageIndex(0));
-      std::iota(innerIndexPtr(), innerIndexPtr() + m_outerSize, StorageIndex(0));
-      std::fill_n(valuePtr(), m_outerSize, Scalar(1));
-    }
-
-    inline SparseMatrix& operator=(const SparseMatrix& other)
-    {
-      if (other.isRValue())
-      {
-        swap(other.const_cast_derived());
+      if (other.isCompressed()) {
+        internal::smart_copy(other.m_outerIndex, other.m_outerIndex + m_outerSize + 1, m_outerIndex);
+        m_data = other.m_data;
+      } else {
+        Base::operator=(other);
       }
-      else if(this!=&other)
-      {
-        #ifdef EIGEN_SPARSE_CREATE_TEMPORARY_PLUGIN
-          EIGEN_SPARSE_CREATE_TEMPORARY_PLUGIN
-        #endif
-        initAssignment(other);
-        if(other.isCompressed())
-        {
-          internal::smart_copy(other.m_outerIndex, other.m_outerIndex + m_outerSize + 1, m_outerIndex);
-          m_data = other.m_data;
-        }
-        else
-        {
-          Base::operator=(other);
-        }
-      }
-      return *this;
     }
+    return *this;
+  }
 
-    inline SparseMatrix& operator=(SparseMatrix&& other) {
-      return *this = other.derived().markAsRValue();
-    }
+  inline SparseMatrix& operator=(SparseMatrix&& other) { return *this = other.derived().markAsRValue(); }
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-    template<typename OtherDerived>
-    inline SparseMatrix& operator=(const EigenBase<OtherDerived>& other)
-    { return Base::operator=(other.derived()); }
+  template <typename OtherDerived>
+  inline SparseMatrix& operator=(const EigenBase<OtherDerived>& other) {
+    return Base::operator=(other.derived());
+  }
 
-    template<typename Lhs, typename Rhs>
-    inline SparseMatrix& operator=(const Product<Lhs,Rhs,AliasFreeProduct>& other);
-#endif // EIGEN_PARSED_BY_DOXYGEN
+  template <typename Lhs, typename Rhs>
+  inline SparseMatrix& operator=(const Product<Lhs, Rhs, AliasFreeProduct>& other);
+#endif  // EIGEN_PARSED_BY_DOXYGEN
 
-    template<typename OtherDerived>
-    EIGEN_DONT_INLINE SparseMatrix& operator=(const SparseMatrixBase<OtherDerived>& other);
+  template <typename OtherDerived>
+  EIGEN_DONT_INLINE SparseMatrix& operator=(const SparseMatrixBase<OtherDerived>& other);
 
 #ifndef EIGEN_NO_IO
-    friend std::ostream & operator << (std::ostream & s, const SparseMatrix& m)
-    {
-      EIGEN_DBG_SPARSE(
-        s << "Nonzero entries:\n";
-        if(m.isCompressed())
-        {
-          for (Index i=0; i<m.nonZeros(); ++i)
-            s << "(" << m.m_data.value(i) << "," << m.m_data.index(i) << ") ";
-        }
-        else
-        {
-          for (Index i=0; i<m.outerSize(); ++i)
-          {
+  friend std::ostream& operator<<(std::ostream& s, const SparseMatrix& m) {
+    EIGEN_DBG_SPARSE(
+        s << "Nonzero entries:\n"; if (m.isCompressed()) {
+          for (Index i = 0; i < m.nonZeros(); ++i) s << "(" << m.m_data.value(i) << "," << m.m_data.index(i) << ") ";
+        } else {
+          for (Index i = 0; i < m.outerSize(); ++i) {
             Index p = m.m_outerIndex[i];
-            Index pe = m.m_outerIndex[i]+m.m_innerNonZeros[i];
-            Index k=p;
-            for (; k<pe; ++k) {
+            Index pe = m.m_outerIndex[i] + m.m_innerNonZeros[i];
+            Index k = p;
+            for (; k < pe; ++k) {
               s << "(" << m.m_data.value(k) << "," << m.m_data.index(k) << ") ";
             }
-            for (; k<m.m_outerIndex[i+1]; ++k) {
+            for (; k < m.m_outerIndex[i + 1]; ++k) {
               s << "(_,_) ";
             }
           }
-        }
-        s << std::endl;
-        s << std::endl;
-        s << "Outer pointers:\n";
-        for (Index i=0; i<m.outerSize(); ++i) {
-          s << m.m_outerIndex[i] << " ";
-        }
-        s << " $" << std::endl;
-        if(!m.isCompressed())
-        {
+        } s << std::endl;
+        s << std::endl; s << "Outer pointers:\n";
+        for (Index i = 0; i < m.outerSize(); ++i) { s << m.m_outerIndex[i] << " "; } s << " $" << std::endl;
+        if (!m.isCompressed()) {
           s << "Inner non zeros:\n";
-          for (Index i=0; i<m.outerSize(); ++i) {
+          for (Index i = 0; i < m.outerSize(); ++i) {
             s << m.m_innerNonZeros[i] << " ";
           }
           s << " $" << std::endl;
-        }
-        s << std::endl;
-      );
-      s << static_cast<const SparseMatrixBase<SparseMatrix>&>(m);
-      return s;
-    }
+        } s
+        << std::endl;);
+    s << static_cast<const SparseMatrixBase<SparseMatrix>&>(m);
+    return s;
+  }
 #endif
 
-    /** Destructor */
-    inline ~SparseMatrix()
-    {
-      internal::conditional_aligned_delete_auto<StorageIndex, true>(m_outerIndex, m_outerSize + 1);
-      internal::conditional_aligned_delete_auto<StorageIndex, true>(m_innerNonZeros, m_outerSize);
+  /** Destructor */
+  inline ~SparseMatrix() {
+    internal::conditional_aligned_delete_auto<StorageIndex, true>(m_outerIndex, m_outerSize + 1);
+    internal::conditional_aligned_delete_auto<StorageIndex, true>(m_innerNonZeros, m_outerSize);
+  }
+
+  /** Overloaded for performance */
+  Scalar sum() const;
+
+#ifdef EIGEN_SPARSEMATRIX_PLUGIN
+#include EIGEN_SPARSEMATRIX_PLUGIN
+#endif
+
+ protected:
+  template <typename Other>
+  void initAssignment(const Other& other) {
+    resize(other.rows(), other.cols());
+    internal::conditional_aligned_delete_auto<StorageIndex, true>(m_innerNonZeros, m_outerSize);
+    m_innerNonZeros = 0;
+  }
+
+  /** \internal
+   * \sa insert(Index,Index) */
+  EIGEN_DEPRECATED EIGEN_DONT_INLINE Scalar& insertCompressed(Index row, Index col);
+
+  /** \internal
+   * A vector object that is equal to 0 everywhere but v at the position i */
+  class SingletonVector {
+    StorageIndex m_index;
+    StorageIndex m_value;
+
+   public:
+    typedef StorageIndex value_type;
+    SingletonVector(Index i, Index v) : m_index(convert_index(i)), m_value(convert_index(v)) {}
+
+    StorageIndex operator[](Index i) const { return i == m_index ? m_value : 0; }
+  };
+
+  /** \internal
+   * \sa insert(Index,Index) */
+  EIGEN_DEPRECATED EIGEN_DONT_INLINE Scalar& insertUncompressed(Index row, Index col);
+
+ public:
+  /** \internal
+   * \sa insert(Index,Index) */
+  EIGEN_STRONG_INLINE Scalar& insertBackUncompressed(Index row, Index col) {
+    const Index outer = IsRowMajor ? row : col;
+    const Index inner = IsRowMajor ? col : row;
+
+    eigen_assert(!isCompressed());
+    eigen_assert(m_innerNonZeros[outer] <= (m_outerIndex[outer + 1] - m_outerIndex[outer]));
+
+    Index p = m_outerIndex[outer] + m_innerNonZeros[outer]++;
+    m_data.index(p) = StorageIndex(inner);
+    m_data.value(p) = Scalar(0);
+    return m_data.value(p);
+  }
+
+ protected:
+  struct IndexPosPair {
+    IndexPosPair(Index a_i, Index a_p) : i(a_i), p(a_p) {}
+    Index i;
+    Index p;
+  };
+
+  /** \internal assign \a diagXpr to the diagonal of \c *this
+   * There are different strategies:
+   *   1 - if *this is overwritten (Func==assign_op) or *this is empty, then we can work treat *this as a dense vector
+   * expression. 2 - otherwise, for each diagonal coeff, 2.a - if it already exists, then we update it, 2.b - if the
+   * correct position is at the end of the vector, and there is capacity, push to back 2.b - otherwise, the insertion
+   * requires a data move, record insertion locations and handle in a second pass 3 - at the end, if some entries failed
+   * to be updated in-place, then we alloc a new buffer, copy each chunk at the right position, and insert the new
+   * elements.
+   */
+  template <typename DiagXpr, typename Func>
+  void assignDiagonal(const DiagXpr diagXpr, const Func& assignFunc) {
+    constexpr StorageIndex kEmptyIndexVal(-1);
+    typedef typename ScalarVector::AlignedMapType ValueMap;
+
+    Index n = diagXpr.size();
+
+    const bool overwrite = internal::is_same<Func, internal::assign_op<Scalar, Scalar>>::value;
+    if (overwrite) {
+      if ((m_outerSize != n) || (m_innerSize != n)) resize(n, n);
     }
 
-    /** Overloaded for performance */
-    Scalar sum() const;
-    
-#   ifdef EIGEN_SPARSEMATRIX_PLUGIN
-#     include EIGEN_SPARSEMATRIX_PLUGIN
-#   endif
-
-protected:
-
-    template<typename Other>
-    void initAssignment(const Other& other)
-    {
-      resize(other.rows(), other.cols());
+    if (m_data.size() == 0 || overwrite) {
       internal::conditional_aligned_delete_auto<StorageIndex, true>(m_innerNonZeros, m_outerSize);
       m_innerNonZeros = 0;
-    }
+      resizeNonZeros(n);
+      ValueMap valueMap(valuePtr(), n);
+      std::iota(m_outerIndex, m_outerIndex + n + 1, StorageIndex(0));
+      std::iota(innerIndexPtr(), innerIndexPtr() + n, StorageIndex(0));
+      valueMap.setZero();
+      internal::call_assignment_no_alias(valueMap, diagXpr, assignFunc);
+    } else {
+      internal::evaluator<DiagXpr> diaEval(diagXpr);
 
-    /** \internal
-      * \sa insert(Index,Index) */
-    EIGEN_DEPRECATED EIGEN_DONT_INLINE Scalar& insertCompressed(Index row, Index col);
+      ei_declare_aligned_stack_constructed_variable(StorageIndex, tmp, n, 0);
+      typename IndexVector::AlignedMapType insertionLocations(tmp, n);
+      insertionLocations.setConstant(kEmptyIndexVal);
 
-    /** \internal
-      * A vector object that is equal to 0 everywhere but v at the position i */
-    class SingletonVector
-    {
-        StorageIndex m_index;
-        StorageIndex m_value;
-      public:
-        typedef StorageIndex value_type;
-        SingletonVector(Index i, Index v)
-          : m_index(convert_index(i)), m_value(convert_index(v))
-        {}
+      Index deferredInsertions = 0;
+      Index shift = 0;
 
-        StorageIndex operator[](Index i) const { return i==m_index ? m_value : 0; }
-    };
-
-    /** \internal
-      * \sa insert(Index,Index) */
-    EIGEN_DEPRECATED EIGEN_DONT_INLINE Scalar& insertUncompressed(Index row, Index col);
-
-public:
-    /** \internal
-      * \sa insert(Index,Index) */
-    EIGEN_STRONG_INLINE Scalar& insertBackUncompressed(Index row, Index col)
-    {
-      const Index outer = IsRowMajor ? row : col;
-      const Index inner = IsRowMajor ? col : row;
-
-      eigen_assert(!isCompressed());
-      eigen_assert(m_innerNonZeros[outer]<=(m_outerIndex[outer+1] - m_outerIndex[outer]));
-
-      Index p = m_outerIndex[outer] + m_innerNonZeros[outer]++;
-      m_data.index(p) = StorageIndex(inner);
-      m_data.value(p) = Scalar(0);
-      return m_data.value(p);
-    }
-protected:
-    struct IndexPosPair {
-      IndexPosPair(Index a_i, Index a_p) : i(a_i), p(a_p) {}
-      Index i;
-      Index p;
-    };
-
-    /** \internal assign \a diagXpr to the diagonal of \c *this
-      * There are different strategies:
-      *   1 - if *this is overwritten (Func==assign_op) or *this is empty, then we can work treat *this as a dense vector expression.
-      *   2 - otherwise, for each diagonal coeff,
-      *     2.a - if it already exists, then we update it,
-      *     2.b - if the correct position is at the end of the vector, and there is capacity, push to back
-      *     2.b - otherwise, the insertion requires a data move, record insertion locations and handle in a second pass
-      *   3 - at the end, if some entries failed to be updated in-place, then we alloc a new buffer, copy each chunk at the right position, and insert the new elements.
-      */
-    template<typename DiagXpr, typename Func>
-    void assignDiagonal(const DiagXpr diagXpr, const Func& assignFunc)
-    {
-      
-      constexpr StorageIndex kEmptyIndexVal(-1);
-      typedef typename ScalarVector::AlignedMapType ValueMap;
-
-      Index n = diagXpr.size();
-
-      const bool overwrite = internal::is_same<Func, internal::assign_op<Scalar,Scalar> >::value;
-      if(overwrite)
-      {
-        if((m_outerSize != n) || (m_innerSize != n))
-          resize(n, n);
+      for (Index j = 0; j < n; j++) {
+        Index begin = m_outerIndex[j];
+        Index end = isCompressed() ? m_outerIndex[j + 1] : begin + m_innerNonZeros[j];
+        Index capacity = m_outerIndex[j + 1] - end;
+        Index dst = m_data.searchLowerIndex(begin, end, j);
+        // the entry exists: update it now
+        if (dst != end && m_data.index(dst) == StorageIndex(j))
+          assignFunc.assignCoeff(m_data.value(dst), diaEval.coeff(j));
+        // the entry belongs at the back of the vector: push to back
+        else if (dst == end && capacity > 0)
+          assignFunc.assignCoeff(insertBackUncompressed(j, j), diaEval.coeff(j));
+        // the insertion requires a data move, record insertion location and handle in second pass
+        else {
+          insertionLocations.coeffRef(j) = StorageIndex(dst);
+          deferredInsertions++;
+          // if there is no capacity, all vectors to the right of this are shifted
+          if (capacity == 0) shift++;
+        }
       }
 
-      if(m_data.size()==0 || overwrite)
-      {
-        internal::conditional_aligned_delete_auto<StorageIndex, true>(m_innerNonZeros, m_outerSize);
-        m_innerNonZeros = 0;
-        resizeNonZeros(n);
-        ValueMap valueMap(valuePtr(), n);
-        std::iota(m_outerIndex, m_outerIndex + n + 1, StorageIndex(0));
-        std::iota(innerIndexPtr(), innerIndexPtr() + n, StorageIndex(0));
-        valueMap.setZero();
-        internal::call_assignment_no_alias(valueMap, diagXpr, assignFunc);
-      }
-      else
-      {
-          internal::evaluator<DiagXpr> diaEval(diagXpr);
+      if (deferredInsertions > 0) {
+        m_data.resize(m_data.size() + shift);
+        Index copyEnd = isCompressed() ? m_outerIndex[m_outerSize]
+                                       : m_outerIndex[m_outerSize - 1] + m_innerNonZeros[m_outerSize - 1];
+        for (Index j = m_outerSize - 1; deferredInsertions > 0; j--) {
+          Index begin = m_outerIndex[j];
+          Index end = isCompressed() ? m_outerIndex[j + 1] : begin + m_innerNonZeros[j];
+          Index capacity = m_outerIndex[j + 1] - end;
 
-          ei_declare_aligned_stack_constructed_variable(StorageIndex, tmp, n, 0);
-          typename IndexVector::AlignedMapType insertionLocations(tmp, n);
-          insertionLocations.setConstant(kEmptyIndexVal);
-
-          Index deferredInsertions = 0;
-          Index shift = 0;
-
-          for (Index j = 0; j < n; j++) {
-            Index begin = m_outerIndex[j];
-            Index end = isCompressed() ? m_outerIndex[j + 1] : begin + m_innerNonZeros[j];
-            Index capacity = m_outerIndex[j + 1] - end;
-            Index dst = m_data.searchLowerIndex(begin, end, j);
-            // the entry exists: update it now
-            if (dst != end && m_data.index(dst) == StorageIndex(j)) assignFunc.assignCoeff(m_data.value(dst), diaEval.coeff(j));
-            // the entry belongs at the back of the vector: push to back
-            else if (dst == end && capacity > 0)
-              assignFunc.assignCoeff(insertBackUncompressed(j, j), diaEval.coeff(j));
-            // the insertion requires a data move, record insertion location and handle in second pass
-            else {
-              insertionLocations.coeffRef(j) = StorageIndex(dst);
-              deferredInsertions++;
-              // if there is no capacity, all vectors to the right of this are shifted
-              if (capacity == 0) shift++;
-            }
+          bool doInsertion = insertionLocations(j) >= 0;
+          bool breakUpCopy = doInsertion && (capacity > 0);
+          // break up copy for sorted insertion into inactive nonzeros
+          // optionally, add another criterium, i.e. 'breakUpCopy || (capacity > threhsold)'
+          // where `threshold >= 0` to skip inactive nonzeros in each vector
+          // this reduces the total number of copied elements, but requires more moveChunk calls
+          if (breakUpCopy) {
+            Index copyBegin = m_outerIndex[j + 1];
+            Index to = copyBegin + shift;
+            Index chunkSize = copyEnd - copyBegin;
+            m_data.moveChunk(copyBegin, to, chunkSize);
+            copyEnd = end;
           }
-          
-          if (deferredInsertions > 0) {
 
-            m_data.resize(m_data.size() + shift);
-            Index copyEnd = isCompressed() ? m_outerIndex[m_outerSize]
-                                           : m_outerIndex[m_outerSize - 1] + m_innerNonZeros[m_outerSize - 1];
-            for (Index j = m_outerSize - 1; deferredInsertions > 0; j--) {
-              Index begin = m_outerIndex[j];
-              Index end = isCompressed() ? m_outerIndex[j + 1] : begin + m_innerNonZeros[j];
-              Index capacity = m_outerIndex[j + 1] - end;
+          m_outerIndex[j + 1] += shift;
 
-              bool doInsertion = insertionLocations(j) >= 0;
-              bool breakUpCopy = doInsertion && (capacity > 0);
-              // break up copy for sorted insertion into inactive nonzeros
-              // optionally, add another criterium, i.e. 'breakUpCopy || (capacity > threhsold)'
-              // where `threshold >= 0` to skip inactive nonzeros in each vector
-              // this reduces the total number of copied elements, but requires more moveChunk calls
-              if (breakUpCopy) {
-                Index copyBegin = m_outerIndex[j + 1];
-                Index to = copyBegin + shift;
-                Index chunkSize = copyEnd - copyBegin;
-                m_data.moveChunk(copyBegin, to, chunkSize);
-                copyEnd = end;
-              }
-
-              m_outerIndex[j + 1] += shift;
-              
-              if (doInsertion) {
-                // if there is capacity, shift into the inactive nonzeros
-                if (capacity > 0) shift++;
-                Index copyBegin = insertionLocations(j);
-                Index to = copyBegin + shift;
-                Index chunkSize = copyEnd - copyBegin;
-                m_data.moveChunk(copyBegin, to, chunkSize);
-                Index dst = to - 1;
-                m_data.index(dst) = StorageIndex(j);
-                m_data.value(dst) = Scalar(0);
-                assignFunc.assignCoeff(m_data.value(dst), diaEval.coeff(j));
-                if (!isCompressed()) m_innerNonZeros[j]++;
-                shift--;
-                deferredInsertions--;
-                copyEnd = copyBegin;
-              }
-            }
-          }     
-          eigen_assert((shift == 0) && (deferredInsertions == 0));
+          if (doInsertion) {
+            // if there is capacity, shift into the inactive nonzeros
+            if (capacity > 0) shift++;
+            Index copyBegin = insertionLocations(j);
+            Index to = copyBegin + shift;
+            Index chunkSize = copyEnd - copyBegin;
+            m_data.moveChunk(copyBegin, to, chunkSize);
+            Index dst = to - 1;
+            m_data.index(dst) = StorageIndex(j);
+            m_data.value(dst) = Scalar(0);
+            assignFunc.assignCoeff(m_data.value(dst), diaEval.coeff(j));
+            if (!isCompressed()) m_innerNonZeros[j]++;
+            shift--;
+            deferredInsertions--;
+            copyEnd = copyBegin;
+          }
+        }
       }
+      eigen_assert((shift == 0) && (deferredInsertions == 0));
     }
+  }
 
-    /* These functions are used to avoid a redundant binary search operation in functions such as coeffRef() and assume `dst` is the appropriate sorted insertion point */
-    EIGEN_STRONG_INLINE Scalar& insertAtByOuterInner(Index outer, Index inner, Index dst);
-    Scalar& insertCompressedAtByOuterInner(Index outer, Index inner, Index dst);
-    Scalar& insertUncompressedAtByOuterInner(Index outer, Index inner, Index dst);
+  /* These functions are used to avoid a redundant binary search operation in functions such as coeffRef() and assume
+   * `dst` is the appropriate sorted insertion point */
+  EIGEN_STRONG_INLINE Scalar& insertAtByOuterInner(Index outer, Index inner, Index dst);
+  Scalar& insertCompressedAtByOuterInner(Index outer, Index inner, Index dst);
+  Scalar& insertUncompressedAtByOuterInner(Index outer, Index inner, Index dst);
 
-private:
-  EIGEN_STATIC_ASSERT(NumTraits<StorageIndex>::IsSigned,THE_INDEX_TYPE_MUST_BE_A_SIGNED_TYPE)
-  EIGEN_STATIC_ASSERT((Options&(ColMajor|RowMajor))==Options,INVALID_MATRIX_TEMPLATE_PARAMETERS)
+ private:
+  EIGEN_STATIC_ASSERT(NumTraits<StorageIndex>::IsSigned, THE_INDEX_TYPE_MUST_BE_A_SIGNED_TYPE)
+  EIGEN_STATIC_ASSERT((Options & (ColMajor | RowMajor)) == Options, INVALID_MATRIX_TEMPLATE_PARAMETERS)
 
   struct default_prunning_func {
     default_prunning_func(const Scalar& ref, const RealScalar& eps) : reference(ref), epsilon(eps) {}
-    inline bool operator() (const Index&, const Index&, const Scalar& value) const
-    {
+    inline bool operator()(const Index&, const Index&, const Scalar& value) const {
       return !internal::isMuchSmallerThan(value, reference, epsilon);
     }
     Scalar reference;
@@ -1169,12 +1083,13 @@
   constexpr bool IsRowMajor = SparseMatrixType::IsRowMajor;
   using StorageIndex = typename SparseMatrixType::StorageIndex;
   using IndexMap = typename VectorX<StorageIndex>::AlignedMapType;
-  using TransposedSparseMatrix = SparseMatrix<typename SparseMatrixType::Scalar, IsRowMajor ? ColMajor : RowMajor, StorageIndex>;
+  using TransposedSparseMatrix =
+      SparseMatrix<typename SparseMatrixType::Scalar, IsRowMajor ? ColMajor : RowMajor, StorageIndex>;
 
   if (begin == end) return;
 
   // There are two strategies to consider for constructing a matrix from unordered triplets:
-  // A) construct the 'mat' in its native storage order and sort in-place (less memory); or, 
+  // A) construct the 'mat' in its native storage order and sort in-place (less memory); or,
   // B) construct the transposed matrix and use an implicit sort upon assignment to `mat` (less time).
   // This routine uses B) for faster execution time.
   TransposedSparseMatrix trmat(mat.rows(), mat.cols());
@@ -1273,13 +1188,15 @@
   // matrix is finalized
 }
 
-// thin wrapper around a generic binary functor to use the sparse disjunction evaulator instead of the default "arithmetic" evaulator
-template<typename DupFunctor, typename LhsScalar, typename RhsScalar = LhsScalar>
-struct scalar_disjunction_op
-{
+// thin wrapper around a generic binary functor to use the sparse disjunction evaulator instead of the default
+// "arithmetic" evaulator
+template <typename DupFunctor, typename LhsScalar, typename RhsScalar = LhsScalar>
+struct scalar_disjunction_op {
   using result_type = typename result_of<DupFunctor(LhsScalar, RhsScalar)>::type;
   scalar_disjunction_op(const DupFunctor& op) : m_functor(op) {}
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return m_functor(a, b); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const LhsScalar& a, const RhsScalar& b) const {
+    return m_functor(a, b);
+  }
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const DupFunctor& functor() const { return m_functor; }
   const DupFunctor& m_functor;
 };
@@ -1292,7 +1209,8 @@
 void insert_from_triplets(const InputIterator& begin, const InputIterator& end, SparseMatrixType& mat,
                           DupFunctor dup_func) {
   using Scalar = typename SparseMatrixType::Scalar;
-  using SrcXprType = CwiseBinaryOp<scalar_disjunction_op<DupFunctor, Scalar>, const SparseMatrixType, const SparseMatrixType>;
+  using SrcXprType =
+      CwiseBinaryOp<scalar_disjunction_op<DupFunctor, Scalar>, const SparseMatrixType, const SparseMatrixType>;
 
   // set_from_triplets is necessary to sort the inner indices and remove the duplicate entries
   SparseMatrixType trips(mat.rows(), mat.cols());
@@ -1308,7 +1226,8 @@
 void insert_from_triplets_sorted(const InputIterator& begin, const InputIterator& end, SparseMatrixType& mat,
                                  DupFunctor dup_func) {
   using Scalar = typename SparseMatrixType::Scalar;
-  using SrcXprType = CwiseBinaryOp<scalar_disjunction_op<DupFunctor, Scalar>, const SparseMatrixType, const SparseMatrixType>;
+  using SrcXprType =
+      CwiseBinaryOp<scalar_disjunction_op<DupFunctor, Scalar>, const SparseMatrixType, const SparseMatrixType>;
 
   // TODO: process triplets without making a copy
   SparseMatrixType trips(mat.rows(), mat.cols());
@@ -1358,60 +1277,63 @@
   * an abstract iterator over a complex data-structure that would be expensive to evaluate. The triplets should rather
   * be explicitly stored into a std::vector for instance.
   */
-template<typename Scalar, int Options_, typename StorageIndex_>
-template<typename InputIterators>
-void SparseMatrix<Scalar,Options_,StorageIndex_>::setFromTriplets(const InputIterators& begin, const InputIterators& end)
-{
-  internal::set_from_triplets<InputIterators, SparseMatrix<Scalar,Options_,StorageIndex_> >(begin, end, *this, internal::scalar_sum_op<Scalar,Scalar>());
+template <typename Scalar, int Options_, typename StorageIndex_>
+template <typename InputIterators>
+void SparseMatrix<Scalar, Options_, StorageIndex_>::setFromTriplets(const InputIterators& begin,
+                                                                    const InputIterators& end) {
+  internal::set_from_triplets<InputIterators, SparseMatrix<Scalar, Options_, StorageIndex_>>(
+      begin, end, *this, internal::scalar_sum_op<Scalar, Scalar>());
 }
 
 /** The same as setFromTriplets but when duplicates are met the functor \a dup_func is applied:
-  * \code
-  * value = dup_func(OldValue, NewValue)
-  * \endcode
-  * Here is a C++11 example keeping the latest entry only:
-  * \code
-  * mat.setFromTriplets(triplets.begin(), triplets.end(), [] (const Scalar&,const Scalar &b) { return b; });
-  * \endcode
-  */
-template<typename Scalar, int Options_, typename StorageIndex_>
-template<typename InputIterators, typename DupFunctor>
-void SparseMatrix<Scalar, Options_, StorageIndex_>::setFromTriplets(const InputIterators& begin, const InputIterators& end, DupFunctor dup_func)
-{
-  internal::set_from_triplets<InputIterators, SparseMatrix<Scalar, Options_, StorageIndex_>, DupFunctor>(begin, end, *this, dup_func);
+ * \code
+ * value = dup_func(OldValue, NewValue)
+ * \endcode
+ * Here is a C++11 example keeping the latest entry only:
+ * \code
+ * mat.setFromTriplets(triplets.begin(), triplets.end(), [] (const Scalar&,const Scalar &b) { return b; });
+ * \endcode
+ */
+template <typename Scalar, int Options_, typename StorageIndex_>
+template <typename InputIterators, typename DupFunctor>
+void SparseMatrix<Scalar, Options_, StorageIndex_>::setFromTriplets(const InputIterators& begin,
+                                                                    const InputIterators& end, DupFunctor dup_func) {
+  internal::set_from_triplets<InputIterators, SparseMatrix<Scalar, Options_, StorageIndex_>, DupFunctor>(
+      begin, end, *this, dup_func);
 }
 
-/** The same as setFromTriplets but triplets are assumed to be pre-sorted. This is faster and requires less temporary storage. 
-  * Two triplets `a` and `b` are appropriately ordered if:
-  * \code
-  * ColMajor: ((a.col() != b.col()) ? (a.col() < b.col()) : (a.row() < b.row())
-  * RowMajor: ((a.row() != b.row()) ? (a.row() < b.row()) : (a.col() < b.col())
-  * \endcode
-  */
-template<typename Scalar, int Options_, typename StorageIndex_>
-template<typename InputIterators>
-void SparseMatrix<Scalar, Options_, StorageIndex_>::setFromSortedTriplets(const InputIterators& begin, const InputIterators& end)
-{
-  internal::set_from_triplets_sorted<InputIterators, SparseMatrix<Scalar, Options_, StorageIndex_> >(begin, end, *this, internal::scalar_sum_op<Scalar, Scalar>());
+/** The same as setFromTriplets but triplets are assumed to be pre-sorted. This is faster and requires less temporary
+ * storage. Two triplets `a` and `b` are appropriately ordered if: \code ColMajor: ((a.col() != b.col()) ? (a.col() <
+ * b.col()) : (a.row() < b.row()) RowMajor: ((a.row() != b.row()) ? (a.row() < b.row()) : (a.col() < b.col()) \endcode
+ */
+template <typename Scalar, int Options_, typename StorageIndex_>
+template <typename InputIterators>
+void SparseMatrix<Scalar, Options_, StorageIndex_>::setFromSortedTriplets(const InputIterators& begin,
+                                                                          const InputIterators& end) {
+  internal::set_from_triplets_sorted<InputIterators, SparseMatrix<Scalar, Options_, StorageIndex_>>(
+      begin, end, *this, internal::scalar_sum_op<Scalar, Scalar>());
 }
 
 /** The same as setFromSortedTriplets but when duplicates are met the functor \a dup_func is applied:
-  * \code
-  * value = dup_func(OldValue, NewValue)
-  * \endcode
-  * Here is a C++11 example keeping the latest entry only:
-  * \code
-  * mat.setFromSortedTriplets(triplets.begin(), triplets.end(), [] (const Scalar&,const Scalar &b) { return b; });
-  * \endcode
-  */
-template<typename Scalar, int Options_, typename StorageIndex_>
-template<typename InputIterators, typename DupFunctor>
-void SparseMatrix<Scalar, Options_, StorageIndex_>::setFromSortedTriplets(const InputIterators& begin, const InputIterators& end, DupFunctor dup_func)
-{
-  internal::set_from_triplets_sorted<InputIterators, SparseMatrix<Scalar, Options_, StorageIndex_>, DupFunctor>(begin, end, *this, dup_func);
+ * \code
+ * value = dup_func(OldValue, NewValue)
+ * \endcode
+ * Here is a C++11 example keeping the latest entry only:
+ * \code
+ * mat.setFromSortedTriplets(triplets.begin(), triplets.end(), [] (const Scalar&,const Scalar &b) { return b; });
+ * \endcode
+ */
+template <typename Scalar, int Options_, typename StorageIndex_>
+template <typename InputIterators, typename DupFunctor>
+void SparseMatrix<Scalar, Options_, StorageIndex_>::setFromSortedTriplets(const InputIterators& begin,
+                                                                          const InputIterators& end,
+                                                                          DupFunctor dup_func) {
+  internal::set_from_triplets_sorted<InputIterators, SparseMatrix<Scalar, Options_, StorageIndex_>, DupFunctor>(
+      begin, end, *this, dup_func);
 }
 
-/** Insert a batch of elements into the matrix \c *this with the list of \em triplets defined in the half-open range from \a begin to \a end.
+/** Insert a batch of elements into the matrix \c *this with the list of \em triplets defined in the half-open range
+  from \a begin to \a end.
   *
   * A \em triplet is a tuple (i,j,value) defining a non-zero element.
   * The input list of triplets does not have to be sorted, and may contain duplicated elements.
@@ -1439,7 +1361,7 @@
       // ...
       tripletList.push_back(T(i,j,v_ij));
     }
-    
+
     m.insertFromTriplets(tripletList.begin(), tripletList.end());
     // m is ready to go!
   * \endcode
@@ -1448,57 +1370,59 @@
   * an abstract iterator over a complex data-structure that would be expensive to evaluate. The triplets should rather
   * be explicitly stored into a std::vector for instance.
   */
-template<typename Scalar, int Options_, typename StorageIndex_>
-template<typename InputIterators>
-void SparseMatrix<Scalar, Options_, StorageIndex_>::insertFromTriplets(const InputIterators& begin, const InputIterators& end)
-{
-  internal::insert_from_triplets<InputIterators, SparseMatrix<Scalar, Options_, StorageIndex_> >(begin, end, *this, internal::scalar_sum_op<Scalar, Scalar>());
+template <typename Scalar, int Options_, typename StorageIndex_>
+template <typename InputIterators>
+void SparseMatrix<Scalar, Options_, StorageIndex_>::insertFromTriplets(const InputIterators& begin,
+                                                                       const InputIterators& end) {
+  internal::insert_from_triplets<InputIterators, SparseMatrix<Scalar, Options_, StorageIndex_>>(
+      begin, end, *this, internal::scalar_sum_op<Scalar, Scalar>());
 }
 
 /** The same as insertFromTriplets but when duplicates are met the functor \a dup_func is applied:
-  * \code
-  * value = dup_func(OldValue, NewValue)
-  * \endcode
-  * Here is a C++11 example keeping the latest entry only:
-  * \code
-  * mat.insertFromTriplets(triplets.begin(), triplets.end(), [] (const Scalar&,const Scalar &b) { return b; });
-  * \endcode
-  */
-template<typename Scalar, int Options_, typename StorageIndex_>
-template<typename InputIterators, typename DupFunctor>
-void SparseMatrix<Scalar, Options_, StorageIndex_>::insertFromTriplets(const InputIterators& begin, const InputIterators& end, DupFunctor dup_func)
-{
-  internal::insert_from_triplets<InputIterators, SparseMatrix<Scalar, Options_, StorageIndex_>, DupFunctor>(begin, end, *this, dup_func);
+ * \code
+ * value = dup_func(OldValue, NewValue)
+ * \endcode
+ * Here is a C++11 example keeping the latest entry only:
+ * \code
+ * mat.insertFromTriplets(triplets.begin(), triplets.end(), [] (const Scalar&,const Scalar &b) { return b; });
+ * \endcode
+ */
+template <typename Scalar, int Options_, typename StorageIndex_>
+template <typename InputIterators, typename DupFunctor>
+void SparseMatrix<Scalar, Options_, StorageIndex_>::insertFromTriplets(const InputIterators& begin,
+                                                                       const InputIterators& end, DupFunctor dup_func) {
+  internal::insert_from_triplets<InputIterators, SparseMatrix<Scalar, Options_, StorageIndex_>, DupFunctor>(
+      begin, end, *this, dup_func);
 }
 
-/** The same as insertFromTriplets but triplets are assumed to be pre-sorted. This is faster and requires less temporary storage.
-  * Two triplets `a` and `b` are appropriately ordered if:
-  * \code
-  * ColMajor: ((a.col() != b.col()) ? (a.col() < b.col()) : (a.row() < b.row())
-  * RowMajor: ((a.row() != b.row()) ? (a.row() < b.row()) : (a.col() < b.col())
-  * \endcode
-  */
-template<typename Scalar, int Options_, typename StorageIndex_>
-template<typename InputIterators>
-void SparseMatrix<Scalar, Options_, StorageIndex_>::insertFromSortedTriplets(const InputIterators& begin, const InputIterators& end)
-{
-  internal::insert_from_triplets_sorted<InputIterators, SparseMatrix<Scalar, Options_, StorageIndex_> >(begin, end, *this, internal::scalar_sum_op<Scalar, Scalar>());
+/** The same as insertFromTriplets but triplets are assumed to be pre-sorted. This is faster and requires less temporary
+ * storage. Two triplets `a` and `b` are appropriately ordered if: \code ColMajor: ((a.col() != b.col()) ? (a.col() <
+ * b.col()) : (a.row() < b.row()) RowMajor: ((a.row() != b.row()) ? (a.row() < b.row()) : (a.col() < b.col()) \endcode
+ */
+template <typename Scalar, int Options_, typename StorageIndex_>
+template <typename InputIterators>
+void SparseMatrix<Scalar, Options_, StorageIndex_>::insertFromSortedTriplets(const InputIterators& begin,
+                                                                             const InputIterators& end) {
+  internal::insert_from_triplets_sorted<InputIterators, SparseMatrix<Scalar, Options_, StorageIndex_>>(
+      begin, end, *this, internal::scalar_sum_op<Scalar, Scalar>());
 }
 
 /** The same as insertFromSortedTriplets but when duplicates are met the functor \a dup_func is applied:
-  * \code
-  * value = dup_func(OldValue, NewValue)
-  * \endcode
-  * Here is a C++11 example keeping the latest entry only:
-  * \code
-  * mat.insertFromSortedTriplets(triplets.begin(), triplets.end(), [] (const Scalar&,const Scalar &b) { return b; });
-  * \endcode
-  */
-template<typename Scalar, int Options_, typename StorageIndex_>
-template<typename InputIterators, typename DupFunctor>
-void SparseMatrix<Scalar, Options_, StorageIndex_>::insertFromSortedTriplets(const InputIterators& begin, const InputIterators& end, DupFunctor dup_func)
-{
-  internal::insert_from_triplets_sorted<InputIterators, SparseMatrix<Scalar, Options_, StorageIndex_>, DupFunctor>(begin, end, *this, dup_func);
+ * \code
+ * value = dup_func(OldValue, NewValue)
+ * \endcode
+ * Here is a C++11 example keeping the latest entry only:
+ * \code
+ * mat.insertFromSortedTriplets(triplets.begin(), triplets.end(), [] (const Scalar&,const Scalar &b) { return b; });
+ * \endcode
+ */
+template <typename Scalar, int Options_, typename StorageIndex_>
+template <typename InputIterators, typename DupFunctor>
+void SparseMatrix<Scalar, Options_, StorageIndex_>::insertFromSortedTriplets(const InputIterators& begin,
+                                                                             const InputIterators& end,
+                                                                             DupFunctor dup_func) {
+  internal::insert_from_triplets_sorted<InputIterators, SparseMatrix<Scalar, Options_, StorageIndex_>, DupFunctor>(
+      begin, end, *this, dup_func);
 }
 
 /** \internal */
@@ -1543,47 +1467,47 @@
 }
 
 /** \internal */
-template<typename Scalar, int Options_, typename StorageIndex_>
-template<typename OtherDerived>
-EIGEN_DONT_INLINE SparseMatrix<Scalar,Options_,StorageIndex_>& SparseMatrix<Scalar,Options_,StorageIndex_>::operator=(const SparseMatrixBase<OtherDerived>& other)
-{
-  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename OtherDerived::Scalar>::value),
-        YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
+template <typename Scalar, int Options_, typename StorageIndex_>
+template <typename OtherDerived>
+EIGEN_DONT_INLINE SparseMatrix<Scalar, Options_, StorageIndex_>&
+SparseMatrix<Scalar, Options_, StorageIndex_>::operator=(const SparseMatrixBase<OtherDerived>& other) {
+  EIGEN_STATIC_ASSERT(
+      (internal::is_same<Scalar, typename OtherDerived::Scalar>::value),
+      YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
 
-  #ifdef EIGEN_SPARSE_CREATE_TEMPORARY_PLUGIN
-    EIGEN_SPARSE_CREATE_TEMPORARY_PLUGIN
-  #endif
-      
+#ifdef EIGEN_SPARSE_CREATE_TEMPORARY_PLUGIN
+  EIGEN_SPARSE_CREATE_TEMPORARY_PLUGIN
+#endif
+
   const bool needToTranspose = (Flags & RowMajorBit) != (internal::evaluator<OtherDerived>::Flags & RowMajorBit);
-  if (needToTranspose)
-  {
-    #ifdef EIGEN_SPARSE_TRANSPOSED_COPY_PLUGIN
-      EIGEN_SPARSE_TRANSPOSED_COPY_PLUGIN
-    #endif
+  if (needToTranspose) {
+#ifdef EIGEN_SPARSE_TRANSPOSED_COPY_PLUGIN
+    EIGEN_SPARSE_TRANSPOSED_COPY_PLUGIN
+#endif
     // two passes algorithm:
     //  1 - compute the number of coeffs per dest inner vector
     //  2 - do the actual copy/eval
     // Since each coeff of the rhs has to be evaluated twice, let's evaluate it if needed
-    typedef typename internal::nested_eval<OtherDerived,2,typename internal::plain_matrix_type<OtherDerived>::type >::type OtherCopy;
+    typedef
+        typename internal::nested_eval<OtherDerived, 2, typename internal::plain_matrix_type<OtherDerived>::type>::type
+            OtherCopy;
     typedef internal::remove_all_t<OtherCopy> OtherCopy_;
     typedef internal::evaluator<OtherCopy_> OtherCopyEval;
     OtherCopy otherCopy(other.derived());
     OtherCopyEval otherCopyEval(otherCopy);
 
-    SparseMatrix dest(other.rows(),other.cols());
-    Eigen::Map<IndexVector> (dest.m_outerIndex,dest.outerSize()).setZero();
+    SparseMatrix dest(other.rows(), other.cols());
+    Eigen::Map<IndexVector>(dest.m_outerIndex, dest.outerSize()).setZero();
 
     // pass 1
     // FIXME the above copy could be merged with that pass
-    for (Index j=0; j<otherCopy.outerSize(); ++j)
-      for (typename OtherCopyEval::InnerIterator it(otherCopyEval, j); it; ++it)
-        ++dest.m_outerIndex[it.index()];
+    for (Index j = 0; j < otherCopy.outerSize(); ++j)
+      for (typename OtherCopyEval::InnerIterator it(otherCopyEval, j); it; ++it) ++dest.m_outerIndex[it.index()];
 
     // prefix sum
     StorageIndex count = 0;
     IndexVector positions(dest.outerSize());
-    for (Index j=0; j<dest.outerSize(); ++j)
-    {
+    for (Index j = 0; j < dest.outerSize(); ++j) {
       StorageIndex tmp = dest.m_outerIndex[j];
       dest.m_outerIndex[j] = count;
       positions[j] = count;
@@ -1593,10 +1517,8 @@
     // alloc
     dest.m_data.resize(count);
     // pass 2
-    for (StorageIndex j=0; j<otherCopy.outerSize(); ++j)
-    {
-      for (typename OtherCopyEval::InnerIterator it(otherCopyEval, j); it; ++it)
-      {
+    for (StorageIndex j = 0; j < otherCopy.outerSize(); ++j) {
+      for (typename OtherCopyEval::InnerIterator it(otherCopyEval, j); it; ++it) {
         Index pos = positions[it.index()]++;
         dest.m_data.index(pos) = j;
         dest.m_data.value(pos) = it.value();
@@ -1604,11 +1526,8 @@
     }
     this->swap(dest);
     return *this;
-  }
-  else
-  {
-    if(other.isRValue())
-    {
+  } else {
+    if (other.isRValue()) {
       initAssignment(other.derived());
     }
     // there is no special optimization
@@ -1777,16 +1696,16 @@
 
 namespace internal {
 
-    template <typename Scalar_, int Options_, typename StorageIndex_>
-    struct evaluator<SparseMatrix<Scalar_, Options_, StorageIndex_>>
-        : evaluator<SparseCompressedBase<SparseMatrix<Scalar_, Options_, StorageIndex_>>> {
-      typedef evaluator<SparseCompressedBase<SparseMatrix<Scalar_, Options_, StorageIndex_>>> Base;
-      typedef SparseMatrix<Scalar_, Options_, StorageIndex_> SparseMatrixType;
-      evaluator() : Base() {}
-      explicit evaluator(const SparseMatrixType& mat) : Base(mat) {}
-    };
+template <typename Scalar_, int Options_, typename StorageIndex_>
+struct evaluator<SparseMatrix<Scalar_, Options_, StorageIndex_>>
+    : evaluator<SparseCompressedBase<SparseMatrix<Scalar_, Options_, StorageIndex_>>> {
+  typedef evaluator<SparseCompressedBase<SparseMatrix<Scalar_, Options_, StorageIndex_>>> Base;
+  typedef SparseMatrix<Scalar_, Options_, StorageIndex_> SparseMatrixType;
+  evaluator() : Base() {}
+  explicit evaluator(const SparseMatrixType& mat) : Base(mat) {}
+};
 
-}
+}  // namespace internal
 
 // Specialization for SparseMatrix.
 // Serializes [rows, cols, isCompressed, outerSize, innerBufferSize,
@@ -1814,18 +1733,16 @@
     num_storage_indices += inner_buffer_size;
     // Values.
     std::size_t num_values = inner_buffer_size;
-    return sizeof(Header) + sizeof(Scalar) * num_values +
-           sizeof(StorageIndex) * num_storage_indices;
+    return sizeof(Header) + sizeof(Scalar) * num_values + sizeof(StorageIndex) * num_storage_indices;
   }
 
-  EIGEN_DEVICE_FUNC uint8_t* serialize(uint8_t* dest, uint8_t* end,
-                                       const SparseMat& value) {
+  EIGEN_DEVICE_FUNC uint8_t* serialize(uint8_t* dest, uint8_t* end, const SparseMat& value) {
     if (EIGEN_PREDICT_FALSE(dest == nullptr)) return nullptr;
     if (EIGEN_PREDICT_FALSE(dest + size(value) > end)) return nullptr;
 
     const size_t header_bytes = sizeof(Header);
-    Header header = {value.rows(), value.cols(), value.isCompressed(),
-                     value.outerSize(), value.outerIndexPtr()[value.outerSize()]};
+    Header header = {value.rows(), value.cols(), value.isCompressed(), value.outerSize(),
+                     value.outerIndexPtr()[value.outerSize()]};
     EIGEN_USING_STD(memcpy)
     memcpy(dest, &header, header_bytes);
     dest += header_bytes;
@@ -1855,9 +1772,7 @@
     return dest;
   }
 
-  EIGEN_DEVICE_FUNC const uint8_t* deserialize(const uint8_t* src,
-                                               const uint8_t* end,
-                                               SparseMat& value) const {
+  EIGEN_DEVICE_FUNC const uint8_t* deserialize(const uint8_t* src, const uint8_t* end, SparseMat& value) const {
     if (EIGEN_PREDICT_FALSE(src == nullptr)) return nullptr;
     if (EIGEN_PREDICT_FALSE(src + sizeof(Header) > end)) return nullptr;
 
@@ -1874,12 +1789,12 @@
     } else {
       value.uncompress();
     }
-    
+
     // Adjust value ptr size.
     value.data().resize(header.inner_buffer_size);
 
     // Initialize compressed state and inner non-zeros.
-    if (!header.compressed) {           
+    if (!header.compressed) {
       // Inner non-zero counts.
       std::size_t data_bytes = sizeof(StorageIndex) * header.outer_size;
       if (EIGEN_PREDICT_FALSE(src + data_bytes > end)) return nullptr;
@@ -1908,6 +1823,6 @@
   }
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SPARSEMATRIX_H
+#endif  // EIGEN_SPARSEMATRIX_H
diff --git a/Eigen/src/SparseCore/SparseMatrixBase.h b/Eigen/src/SparseCore/SparseMatrixBase.h
index f96d2a7..b58bb38 100644
--- a/Eigen/src/SparseCore/SparseMatrixBase.h
+++ b/Eigen/src/SparseCore/SparseMatrixBase.h
@@ -13,388 +13,388 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 /** \ingroup SparseCore_Module
-  *
-  * \class SparseMatrixBase
-  *
-  * \brief Base class of any sparse matrices or sparse expressions
-  *
-  * \tparam Derived is the derived type, e.g. a sparse matrix type, or an expression, etc.
-  *
-  * This class can be extended with the help of the plugin mechanism described on the page
-  * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_SPARSEMATRIXBASE_PLUGIN.
-  */
-template<typename Derived> class SparseMatrixBase
-  : public EigenBase<Derived>
-{
-  public:
+ *
+ * \class SparseMatrixBase
+ *
+ * \brief Base class of any sparse matrices or sparse expressions
+ *
+ * \tparam Derived is the derived type, e.g. a sparse matrix type, or an expression, etc.
+ *
+ * This class can be extended with the help of the plugin mechanism described on the page
+ * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_SPARSEMATRIXBASE_PLUGIN.
+ */
+template <typename Derived>
+class SparseMatrixBase : public EigenBase<Derived> {
+ public:
+  typedef typename internal::traits<Derived>::Scalar Scalar;
 
-    typedef typename internal::traits<Derived>::Scalar Scalar;
-    
-    /** The numeric type of the expression' coefficients, e.g. float, double, int or std::complex<float>, etc.
-      *
-      * It is an alias for the Scalar type */
-    typedef Scalar value_type;
-    
-    typedef typename internal::packet_traits<Scalar>::type PacketScalar;
-    typedef typename internal::traits<Derived>::StorageKind StorageKind;
+  /** The numeric type of the expression' coefficients, e.g. float, double, int or std::complex<float>, etc.
+   *
+   * It is an alias for the Scalar type */
+  typedef Scalar value_type;
 
-    /** The integer type used to \b store indices within a SparseMatrix.
-      * For a \c SparseMatrix<Scalar,Options,IndexType> it an alias of the third template parameter \c IndexType. */
-    typedef typename internal::traits<Derived>::StorageIndex StorageIndex;
+  typedef typename internal::packet_traits<Scalar>::type PacketScalar;
+  typedef typename internal::traits<Derived>::StorageKind StorageKind;
 
-    typedef typename internal::add_const_on_value_type_if_arithmetic<
-                         typename internal::packet_traits<Scalar>::type
-                     >::type PacketReturnType;
+  /** The integer type used to \b store indices within a SparseMatrix.
+   * For a \c SparseMatrix<Scalar,Options,IndexType> it an alias of the third template parameter \c IndexType. */
+  typedef typename internal::traits<Derived>::StorageIndex StorageIndex;
 
-    typedef SparseMatrixBase StorageBaseType;
+  typedef typename internal::add_const_on_value_type_if_arithmetic<typename internal::packet_traits<Scalar>::type>::type
+      PacketReturnType;
 
-    typedef Matrix<StorageIndex,Dynamic,1> IndexVector;
-    typedef Matrix<Scalar,Dynamic,1> ScalarVector;
-    
-    template<typename OtherDerived>
-    Derived& operator=(const EigenBase<OtherDerived> &other);
+  typedef SparseMatrixBase StorageBaseType;
 
-    enum {
+  typedef Matrix<StorageIndex, Dynamic, 1> IndexVector;
+  typedef Matrix<Scalar, Dynamic, 1> ScalarVector;
 
-      RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
-        /**< The number of rows at compile-time. This is just a copy of the value provided
-          * by the \a Derived type. If a value is not known at compile-time,
-          * it is set to the \a Dynamic constant.
-          * \sa MatrixBase::rows(), MatrixBase::cols(), ColsAtCompileTime, SizeAtCompileTime */
+  template <typename OtherDerived>
+  Derived& operator=(const EigenBase<OtherDerived>& other);
 
-      ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
-        /**< The number of columns at compile-time. This is just a copy of the value provided
-          * by the \a Derived type. If a value is not known at compile-time,
-          * it is set to the \a Dynamic constant.
-          * \sa MatrixBase::rows(), MatrixBase::cols(), RowsAtCompileTime, SizeAtCompileTime */
+  enum {
 
+    RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
+    /**< The number of rows at compile-time. This is just a copy of the value provided
+     * by the \a Derived type. If a value is not known at compile-time,
+     * it is set to the \a Dynamic constant.
+     * \sa MatrixBase::rows(), MatrixBase::cols(), ColsAtCompileTime, SizeAtCompileTime */
 
-      SizeAtCompileTime = (internal::size_of_xpr_at_compile_time<Derived>::ret),
-        /**< This is equal to the number of coefficients, i.e. the number of
-          * rows times the number of columns, or to \a Dynamic if this is not
-          * known at compile-time. \sa RowsAtCompileTime, ColsAtCompileTime */
+    ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
+    /**< The number of columns at compile-time. This is just a copy of the value provided
+     * by the \a Derived type. If a value is not known at compile-time,
+     * it is set to the \a Dynamic constant.
+     * \sa MatrixBase::rows(), MatrixBase::cols(), RowsAtCompileTime, SizeAtCompileTime */
 
-      MaxRowsAtCompileTime = RowsAtCompileTime,
-      MaxColsAtCompileTime = ColsAtCompileTime,
+    SizeAtCompileTime = (internal::size_of_xpr_at_compile_time<Derived>::ret),
+    /**< This is equal to the number of coefficients, i.e. the number of
+     * rows times the number of columns, or to \a Dynamic if this is not
+     * known at compile-time. \sa RowsAtCompileTime, ColsAtCompileTime */
 
-      MaxSizeAtCompileTime = internal::size_at_compile_time(MaxRowsAtCompileTime, MaxColsAtCompileTime),
+    MaxRowsAtCompileTime = RowsAtCompileTime,
+    MaxColsAtCompileTime = ColsAtCompileTime,
 
-      IsVectorAtCompileTime = RowsAtCompileTime == 1 || ColsAtCompileTime == 1,
-        /**< This is set to true if either the number of rows or the number of
-          * columns is known at compile-time to be equal to 1. Indeed, in that case,
-          * we are dealing with a column-vector (if there is only one column) or with
-          * a row-vector (if there is only one row). */
+    MaxSizeAtCompileTime = internal::size_at_compile_time(MaxRowsAtCompileTime, MaxColsAtCompileTime),
 
-      NumDimensions = int(MaxSizeAtCompileTime) == 1 ? 0 : bool(IsVectorAtCompileTime) ? 1 : 2,
-        /**< This value is equal to Tensor::NumDimensions, i.e. 0 for scalars, 1 for vectors,
-         * and 2 for matrices.
-         */
+    IsVectorAtCompileTime = RowsAtCompileTime == 1 || ColsAtCompileTime == 1,
+    /**< This is set to true if either the number of rows or the number of
+     * columns is known at compile-time to be equal to 1. Indeed, in that case,
+     * we are dealing with a column-vector (if there is only one column) or with
+     * a row-vector (if there is only one row). */
 
-      Flags = internal::traits<Derived>::Flags,
-        /**< This stores expression \ref flags flags which may or may not be inherited by new expressions
-          * constructed from this one. See the \ref flags "list of flags".
-          */
+    NumDimensions = int(MaxSizeAtCompileTime) == 1 ? 0
+                    : bool(IsVectorAtCompileTime)  ? 1
+                                                   : 2,
+    /**< This value is equal to Tensor::NumDimensions, i.e. 0 for scalars, 1 for vectors,
+     * and 2 for matrices.
+     */
 
-      IsRowMajor = Flags&RowMajorBit ? 1 : 0,
-      
-      InnerSizeAtCompileTime = int(IsVectorAtCompileTime) ? int(SizeAtCompileTime)
-                             : int(IsRowMajor) ? int(ColsAtCompileTime) : int(RowsAtCompileTime),
+    Flags = internal::traits<Derived>::Flags,
+    /**< This stores expression \ref flags flags which may or may not be inherited by new expressions
+     * constructed from this one. See the \ref flags "list of flags".
+     */
 
-      #ifndef EIGEN_PARSED_BY_DOXYGEN
-      HasDirectAccess_ = (int(Flags)&DirectAccessBit) ? 1 : 0 // workaround sunCC
-      #endif
-    };
+    IsRowMajor = Flags & RowMajorBit ? 1 : 0,
 
-    /** \internal the return type of MatrixBase::adjoint() */
-    typedef std::conditional_t<NumTraits<Scalar>::IsComplex,
-                        CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>, Eigen::Transpose<const Derived> >,
-                        Transpose<const Derived>
-                     > AdjointReturnType;
-    typedef Transpose<Derived> TransposeReturnType;
-    typedef Transpose<const Derived> ConstTransposeReturnType;
-
-    // FIXME storage order do not match evaluator storage order
-    typedef SparseMatrix<Scalar, Flags&RowMajorBit ? RowMajor : ColMajor, StorageIndex> PlainObject;
+    InnerSizeAtCompileTime = int(IsVectorAtCompileTime) ? int(SizeAtCompileTime)
+                             : int(IsRowMajor)          ? int(ColsAtCompileTime)
+                                                        : int(RowsAtCompileTime),
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-    /** This is the "real scalar" type; if the \a Scalar type is already real numbers
-      * (e.g. int, float or double) then \a RealScalar is just the same as \a Scalar. If
-      * \a Scalar is \a std::complex<T> then RealScalar is \a T.
-      *
-      * \sa class NumTraits
-      */
-    typedef typename NumTraits<Scalar>::Real RealScalar;
+    HasDirectAccess_ = (int(Flags) & DirectAccessBit) ? 1 : 0  // workaround sunCC
+#endif
+  };
 
-    /** \internal the return type of coeff()
-      */
-    typedef std::conditional_t<HasDirectAccess_, const Scalar&, Scalar> CoeffReturnType;
+  /** \internal the return type of MatrixBase::adjoint() */
+  typedef std::conditional_t<NumTraits<Scalar>::IsComplex,
+                             CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>, Eigen::Transpose<const Derived> >,
+                             Transpose<const Derived> >
+      AdjointReturnType;
+  typedef Transpose<Derived> TransposeReturnType;
+  typedef Transpose<const Derived> ConstTransposeReturnType;
 
-    /** \internal Represents a matrix with all coefficients equal to one another*/
-    typedef CwiseNullaryOp<internal::scalar_constant_op<Scalar>,Matrix<Scalar,Dynamic,Dynamic> > ConstantReturnType;
+  // FIXME storage order do not match evaluator storage order
+  typedef SparseMatrix<Scalar, Flags & RowMajorBit ? RowMajor : ColMajor, StorageIndex> PlainObject;
 
-    /** type of the equivalent dense matrix */
-    typedef Matrix<Scalar,RowsAtCompileTime,ColsAtCompileTime> DenseMatrixType;
-    /** type of the equivalent square matrix */
-    typedef Matrix<Scalar, internal::max_size_prefer_dynamic(RowsAtCompileTime, ColsAtCompileTime),
-                           internal::max_size_prefer_dynamic(RowsAtCompileTime, ColsAtCompileTime)> SquareMatrixType;
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  /** This is the "real scalar" type; if the \a Scalar type is already real numbers
+   * (e.g. int, float or double) then \a RealScalar is just the same as \a Scalar. If
+   * \a Scalar is \a std::complex<T> then RealScalar is \a T.
+   *
+   * \sa class NumTraits
+   */
+  typedef typename NumTraits<Scalar>::Real RealScalar;
 
-    inline const Derived& derived() const { return *static_cast<const Derived*>(this); }
-    inline Derived& derived() { return *static_cast<Derived*>(this); }
-    inline Derived& const_cast_derived() const
-    { return *static_cast<Derived*>(const_cast<SparseMatrixBase*>(this)); }
+  /** \internal the return type of coeff()
+   */
+  typedef std::conditional_t<HasDirectAccess_, const Scalar&, Scalar> CoeffReturnType;
 
-    typedef EigenBase<Derived> Base;
+  /** \internal Represents a matrix with all coefficients equal to one another*/
+  typedef CwiseNullaryOp<internal::scalar_constant_op<Scalar>, Matrix<Scalar, Dynamic, Dynamic> > ConstantReturnType;
 
-#endif // not EIGEN_PARSED_BY_DOXYGEN
+  /** type of the equivalent dense matrix */
+  typedef Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime> DenseMatrixType;
+  /** type of the equivalent square matrix */
+  typedef Matrix<Scalar, internal::max_size_prefer_dynamic(RowsAtCompileTime, ColsAtCompileTime),
+                 internal::max_size_prefer_dynamic(RowsAtCompileTime, ColsAtCompileTime)>
+      SquareMatrixType;
+
+  inline const Derived& derived() const { return *static_cast<const Derived*>(this); }
+  inline Derived& derived() { return *static_cast<Derived*>(this); }
+  inline Derived& const_cast_derived() const { return *static_cast<Derived*>(const_cast<SparseMatrixBase*>(this)); }
+
+  typedef EigenBase<Derived> Base;
+
+#endif  // not EIGEN_PARSED_BY_DOXYGEN
 
 #define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::SparseMatrixBase
 #ifdef EIGEN_PARSED_BY_DOXYGEN
-#define EIGEN_DOC_UNARY_ADDONS(METHOD,OP)           /** <p>This method does not change the sparsity of \c *this: the OP is applied to explicitly stored coefficients only. \sa SparseCompressedBase::coeffs() </p> */
-#define EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL      /** <p> \warning This method returns a read-only expression for any sparse matrices. \sa \ref TutorialSparse_SubMatrices "Sparse block operations" </p> */
-#define EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(COND) /** <p> \warning This method returns a read-write expression for COND sparse matrices only. Otherwise, the returned expression is read-only. \sa \ref TutorialSparse_SubMatrices "Sparse block operations" </p> */
+#define EIGEN_DOC_UNARY_ADDONS(METHOD,                                                                               \
+                               OP) /** <p>This method does not change the sparsity of \c *this: the OP is applied to \
+                                      explicitly stored coefficients only. \sa SparseCompressedBase::coeffs() </p> */
+#define EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL /** <p> \warning This method returns a read-only expression for any   \
+                                                  sparse matrices. \sa \ref TutorialSparse_SubMatrices "Sparse block \
+                                                  operations" </p> */
+#define EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(                                                                       \
+    COND) /** <p> \warning This method returns a read-write expression for COND sparse matrices only. Otherwise, the \
+             returned expression is read-only. \sa \ref TutorialSparse_SubMatrices "Sparse block operations" </p> */
 #else
-#define EIGEN_DOC_UNARY_ADDONS(X,Y)
+#define EIGEN_DOC_UNARY_ADDONS(X, Y)
 #define EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
 #define EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(COND)
 #endif
-#   include "../plugins/CommonCwiseUnaryOps.inc"
-#   include "../plugins/CommonCwiseBinaryOps.inc"
-#   include "../plugins/MatrixCwiseUnaryOps.inc"
-#   include "../plugins/MatrixCwiseBinaryOps.inc"
-#   include "../plugins/BlockMethods.inc"
-#   ifdef EIGEN_SPARSEMATRIXBASE_PLUGIN
-#     include EIGEN_SPARSEMATRIXBASE_PLUGIN
-#   endif
+#include "../plugins/CommonCwiseUnaryOps.inc"
+#include "../plugins/CommonCwiseBinaryOps.inc"
+#include "../plugins/MatrixCwiseUnaryOps.inc"
+#include "../plugins/MatrixCwiseBinaryOps.inc"
+#include "../plugins/BlockMethods.inc"
+#ifdef EIGEN_SPARSEMATRIXBASE_PLUGIN
+#include EIGEN_SPARSEMATRIXBASE_PLUGIN
+#endif
 #undef EIGEN_CURRENT_STORAGE_BASE_CLASS
 #undef EIGEN_DOC_UNARY_ADDONS
 #undef EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
 #undef EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF
 
-    /** \returns the number of rows. \sa cols() */
-    inline Index rows() const { return derived().rows(); }
-    /** \returns the number of columns. \sa rows() */
-    inline Index cols() const { return derived().cols(); }
-    /** \returns the number of coefficients, which is \a rows()*cols().
-      * \sa rows(), cols(). */
-    inline Index size() const { return rows() * cols(); }
-    /** \returns true if either the number of rows or the number of columns is equal to 1.
-      * In other words, this function returns
-      * \code rows()==1 || cols()==1 \endcode
-      * \sa rows(), cols(), IsVectorAtCompileTime. */
-    inline bool isVector() const { return rows()==1 || cols()==1; }
-    /** \returns the size of the storage major dimension,
-      * i.e., the number of columns for a columns major matrix, and the number of rows otherwise */
-    Index outerSize() const { return (int(Flags)&RowMajorBit) ? this->rows() : this->cols(); }
-    /** \returns the size of the inner dimension according to the storage order,
-      * i.e., the number of rows for a columns major matrix, and the number of cols otherwise */
-    Index innerSize() const { return (int(Flags)&RowMajorBit) ? this->cols() : this->rows(); }
+  /** \returns the number of rows. \sa cols() */
+  inline Index rows() const { return derived().rows(); }
+  /** \returns the number of columns. \sa rows() */
+  inline Index cols() const { return derived().cols(); }
+  /** \returns the number of coefficients, which is \a rows()*cols().
+   * \sa rows(), cols(). */
+  inline Index size() const { return rows() * cols(); }
+  /** \returns true if either the number of rows or the number of columns is equal to 1.
+   * In other words, this function returns
+   * \code rows()==1 || cols()==1 \endcode
+   * \sa rows(), cols(), IsVectorAtCompileTime. */
+  inline bool isVector() const { return rows() == 1 || cols() == 1; }
+  /** \returns the size of the storage major dimension,
+   * i.e., the number of columns for a columns major matrix, and the number of rows otherwise */
+  Index outerSize() const { return (int(Flags) & RowMajorBit) ? this->rows() : this->cols(); }
+  /** \returns the size of the inner dimension according to the storage order,
+   * i.e., the number of rows for a columns major matrix, and the number of cols otherwise */
+  Index innerSize() const { return (int(Flags) & RowMajorBit) ? this->cols() : this->rows(); }
 
-    bool isRValue() const { return m_isRValue; }
-    Derived& markAsRValue() { m_isRValue = true; return derived(); }
+  bool isRValue() const { return m_isRValue; }
+  Derived& markAsRValue() {
+    m_isRValue = true;
+    return derived();
+  }
 
-    SparseMatrixBase() : m_isRValue(false) { /* TODO check flags */ }
+  SparseMatrixBase() : m_isRValue(false) { /* TODO check flags */
+  }
 
-    
-    template<typename OtherDerived>
-    Derived& operator=(const ReturnByValue<OtherDerived>& other);
+  template <typename OtherDerived>
+  Derived& operator=(const ReturnByValue<OtherDerived>& other);
 
-    template<typename OtherDerived>
-    inline Derived& operator=(const SparseMatrixBase<OtherDerived>& other);
+  template <typename OtherDerived>
+  inline Derived& operator=(const SparseMatrixBase<OtherDerived>& other);
 
-    inline Derived& operator=(const Derived& other);
+  inline Derived& operator=(const Derived& other);
 
-  protected:
+ protected:
+  template <typename OtherDerived>
+  inline Derived& assign(const OtherDerived& other);
 
-    template<typename OtherDerived>
-    inline Derived& assign(const OtherDerived& other);
+  template <typename OtherDerived>
+  inline void assignGeneric(const OtherDerived& other);
 
-    template<typename OtherDerived>
-    inline void assignGeneric(const OtherDerived& other);
-
-  public:
+ public:
 #ifndef EIGEN_NO_IO
-    friend std::ostream & operator << (std::ostream & s, const SparseMatrixBase& m)
-    {
-      typedef typename Derived::Nested Nested;
-      typedef internal::remove_all_t<Nested> NestedCleaned;
+  friend std::ostream& operator<<(std::ostream& s, const SparseMatrixBase& m) {
+    typedef typename Derived::Nested Nested;
+    typedef internal::remove_all_t<Nested> NestedCleaned;
 
-      if (Flags&RowMajorBit)
-      {
-        Nested nm(m.derived());
-        internal::evaluator<NestedCleaned> thisEval(nm);
-        for (Index row=0; row<nm.outerSize(); ++row)
-        {
-          Index col = 0;
-          for (typename internal::evaluator<NestedCleaned>::InnerIterator it(thisEval, row); it; ++it)
-          {
-            for ( ; col<it.index(); ++col)
-              s << "0 ";
-            s << it.value() << " ";
-            ++col;
-          }
-          for ( ; col<m.cols(); ++col)
-            s << "0 ";
-          s << std::endl;
+    if (Flags & RowMajorBit) {
+      Nested nm(m.derived());
+      internal::evaluator<NestedCleaned> thisEval(nm);
+      for (Index row = 0; row < nm.outerSize(); ++row) {
+        Index col = 0;
+        for (typename internal::evaluator<NestedCleaned>::InnerIterator it(thisEval, row); it; ++it) {
+          for (; col < it.index(); ++col) s << "0 ";
+          s << it.value() << " ";
+          ++col;
         }
+        for (; col < m.cols(); ++col) s << "0 ";
+        s << std::endl;
       }
-      else
-      {
-        Nested nm(m.derived());
-        internal::evaluator<NestedCleaned> thisEval(nm);
-        if (m.cols() == 1) {
-          Index row = 0;
-          for (typename internal::evaluator<NestedCleaned>::InnerIterator it(thisEval, 0); it; ++it)
-          {
-            for ( ; row<it.index(); ++row)
-              s << "0" << std::endl;
-            s << it.value() << std::endl;
-            ++row;
-          }
-          for ( ; row<m.rows(); ++row)
-            s << "0" << std::endl;
+    } else {
+      Nested nm(m.derived());
+      internal::evaluator<NestedCleaned> thisEval(nm);
+      if (m.cols() == 1) {
+        Index row = 0;
+        for (typename internal::evaluator<NestedCleaned>::InnerIterator it(thisEval, 0); it; ++it) {
+          for (; row < it.index(); ++row) s << "0" << std::endl;
+          s << it.value() << std::endl;
+          ++row;
         }
-        else
-        {
-          SparseMatrix<Scalar, RowMajorBit, StorageIndex> trans = m;
-          s << static_cast<const SparseMatrixBase<SparseMatrix<Scalar, RowMajorBit, StorageIndex> >&>(trans);
-        }
+        for (; row < m.rows(); ++row) s << "0" << std::endl;
+      } else {
+        SparseMatrix<Scalar, RowMajorBit, StorageIndex> trans = m;
+        s << static_cast<const SparseMatrixBase<SparseMatrix<Scalar, RowMajorBit, StorageIndex> >&>(trans);
       }
-      return s;
     }
+    return s;
+  }
 #endif
 
-    template<typename OtherDerived>
-    Derived& operator+=(const SparseMatrixBase<OtherDerived>& other);
-    template<typename OtherDerived>
-    Derived& operator-=(const SparseMatrixBase<OtherDerived>& other);
-    
-    template<typename OtherDerived>
-    Derived& operator+=(const DiagonalBase<OtherDerived>& other);
-    template<typename OtherDerived>
-    Derived& operator-=(const DiagonalBase<OtherDerived>& other);
+  template <typename OtherDerived>
+  Derived& operator+=(const SparseMatrixBase<OtherDerived>& other);
+  template <typename OtherDerived>
+  Derived& operator-=(const SparseMatrixBase<OtherDerived>& other);
 
-    template<typename OtherDerived>
-    Derived& operator+=(const EigenBase<OtherDerived> &other);
-    template<typename OtherDerived>
-    Derived& operator-=(const EigenBase<OtherDerived> &other);
+  template <typename OtherDerived>
+  Derived& operator+=(const DiagonalBase<OtherDerived>& other);
+  template <typename OtherDerived>
+  Derived& operator-=(const DiagonalBase<OtherDerived>& other);
 
-    Derived& operator*=(const Scalar& other);
-    Derived& operator/=(const Scalar& other);
+  template <typename OtherDerived>
+  Derived& operator+=(const EigenBase<OtherDerived>& other);
+  template <typename OtherDerived>
+  Derived& operator-=(const EigenBase<OtherDerived>& other);
 
-    template<typename OtherDerived> struct CwiseProductDenseReturnType {
-      typedef CwiseBinaryOp<internal::scalar_product_op<typename ScalarBinaryOpTraits<
-                                                          typename internal::traits<Derived>::Scalar,
-                                                          typename internal::traits<OtherDerived>::Scalar
-                                                        >::ReturnType>,
-                            const Derived,
-                            const OtherDerived
-                          > Type;
-    };
+  Derived& operator*=(const Scalar& other);
+  Derived& operator/=(const Scalar& other);
 
-    template<typename OtherDerived>
-    EIGEN_STRONG_INLINE const typename CwiseProductDenseReturnType<OtherDerived>::Type
-    cwiseProduct(const MatrixBase<OtherDerived> &other) const;
+  template <typename OtherDerived>
+  struct CwiseProductDenseReturnType {
+    typedef CwiseBinaryOp<
+        internal::scalar_product_op<typename ScalarBinaryOpTraits<
+            typename internal::traits<Derived>::Scalar, typename internal::traits<OtherDerived>::Scalar>::ReturnType>,
+        const Derived, const OtherDerived>
+        Type;
+  };
 
-    // sparse * diagonal
-    template<typename OtherDerived>
-    const Product<Derived,OtherDerived>
-    operator*(const DiagonalBase<OtherDerived> &other) const
-    { return Product<Derived,OtherDerived>(derived(), other.derived()); }
+  template <typename OtherDerived>
+  EIGEN_STRONG_INLINE const typename CwiseProductDenseReturnType<OtherDerived>::Type cwiseProduct(
+      const MatrixBase<OtherDerived>& other) const;
 
-    // diagonal * sparse
-    template<typename OtherDerived> friend
-    const Product<OtherDerived,Derived>
-    operator*(const DiagonalBase<OtherDerived> &lhs, const SparseMatrixBase& rhs)
-    { return Product<OtherDerived,Derived>(lhs.derived(), rhs.derived()); }
-    
-    // sparse * sparse
-    template<typename OtherDerived>
-    const Product<Derived,OtherDerived,AliasFreeProduct>
-    operator*(const SparseMatrixBase<OtherDerived> &other) const;
-    
-    // sparse * dense
-    template<typename OtherDerived>
-    const Product<Derived,OtherDerived>
-    operator*(const MatrixBase<OtherDerived> &other) const
-    { return Product<Derived,OtherDerived>(derived(), other.derived()); }
-    
-    // dense * sparse
-    template<typename OtherDerived> friend
-    const Product<OtherDerived,Derived>
-    operator*(const MatrixBase<OtherDerived> &lhs, const SparseMatrixBase& rhs)
-    { return Product<OtherDerived,Derived>(lhs.derived(), rhs.derived()); }
-    
-     /** \returns an expression of P H P^-1 where H is the matrix represented by \c *this */
-    SparseSymmetricPermutationProduct<Derived,Upper|Lower> twistedBy(const PermutationMatrix<Dynamic,Dynamic,StorageIndex>& perm) const
-    {
-      return SparseSymmetricPermutationProduct<Derived,Upper|Lower>(derived(), perm);
-    }
+  // sparse * diagonal
+  template <typename OtherDerived>
+  const Product<Derived, OtherDerived> operator*(const DiagonalBase<OtherDerived>& other) const {
+    return Product<Derived, OtherDerived>(derived(), other.derived());
+  }
 
-    template<typename OtherDerived>
-    Derived& operator*=(const SparseMatrixBase<OtherDerived>& other);
+  // diagonal * sparse
+  template <typename OtherDerived>
+  friend const Product<OtherDerived, Derived> operator*(const DiagonalBase<OtherDerived>& lhs,
+                                                        const SparseMatrixBase& rhs) {
+    return Product<OtherDerived, Derived>(lhs.derived(), rhs.derived());
+  }
 
-    template<int Mode>
-    inline const TriangularView<const Derived, Mode> triangularView() const;
-    
-    template<unsigned int UpLo> struct SelfAdjointViewReturnType { typedef SparseSelfAdjointView<Derived, UpLo> Type; };
-    template<unsigned int UpLo> struct ConstSelfAdjointViewReturnType { typedef const SparseSelfAdjointView<const Derived, UpLo> Type; };
+  // sparse * sparse
+  template <typename OtherDerived>
+  const Product<Derived, OtherDerived, AliasFreeProduct> operator*(const SparseMatrixBase<OtherDerived>& other) const;
 
-    template<unsigned int UpLo> inline 
-    typename ConstSelfAdjointViewReturnType<UpLo>::Type selfadjointView() const;
-    template<unsigned int UpLo> inline
-    typename SelfAdjointViewReturnType<UpLo>::Type selfadjointView();
+  // sparse * dense
+  template <typename OtherDerived>
+  const Product<Derived, OtherDerived> operator*(const MatrixBase<OtherDerived>& other) const {
+    return Product<Derived, OtherDerived>(derived(), other.derived());
+  }
 
-    template<typename OtherDerived> Scalar dot(const MatrixBase<OtherDerived>& other) const;
-    template<typename OtherDerived> Scalar dot(const SparseMatrixBase<OtherDerived>& other) const;
-    RealScalar squaredNorm() const;
-    RealScalar norm()  const;
-    RealScalar blueNorm() const;
+  // dense * sparse
+  template <typename OtherDerived>
+  friend const Product<OtherDerived, Derived> operator*(const MatrixBase<OtherDerived>& lhs,
+                                                        const SparseMatrixBase& rhs) {
+    return Product<OtherDerived, Derived>(lhs.derived(), rhs.derived());
+  }
 
-    TransposeReturnType transpose() { return TransposeReturnType(derived()); }
-    const ConstTransposeReturnType transpose() const { return ConstTransposeReturnType(derived()); }
-    const AdjointReturnType adjoint() const { return AdjointReturnType(transpose()); }
+  /** \returns an expression of P H P^-1 where H is the matrix represented by \c *this */
+  SparseSymmetricPermutationProduct<Derived, Upper | Lower> twistedBy(
+      const PermutationMatrix<Dynamic, Dynamic, StorageIndex>& perm) const {
+    return SparseSymmetricPermutationProduct<Derived, Upper | Lower>(derived(), perm);
+  }
 
-    DenseMatrixType toDense() const
-    {
-      return DenseMatrixType(derived());
-    }
+  template <typename OtherDerived>
+  Derived& operator*=(const SparseMatrixBase<OtherDerived>& other);
 
-    template<typename OtherDerived>
-    bool isApprox(const SparseMatrixBase<OtherDerived>& other,
-                  const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
+  template <int Mode>
+  inline const TriangularView<const Derived, Mode> triangularView() const;
 
-    template<typename OtherDerived>
-    bool isApprox(const MatrixBase<OtherDerived>& other,
-                  const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const
-    { return toDense().isApprox(other,prec); }
+  template <unsigned int UpLo>
+  struct SelfAdjointViewReturnType {
+    typedef SparseSelfAdjointView<Derived, UpLo> Type;
+  };
+  template <unsigned int UpLo>
+  struct ConstSelfAdjointViewReturnType {
+    typedef const SparseSelfAdjointView<const Derived, UpLo> Type;
+  };
 
-    /** \returns the matrix or vector obtained by evaluating this expression.
-      *
-      * Notice that in the case of a plain matrix or vector (not an expression) this function just returns
-      * a const reference, in order to avoid a useless copy.
-      */
-    inline const typename internal::eval<Derived>::type eval() const
-    { return typename internal::eval<Derived>::type(derived()); }
+  template <unsigned int UpLo>
+  inline typename ConstSelfAdjointViewReturnType<UpLo>::Type selfadjointView() const;
+  template <unsigned int UpLo>
+  inline typename SelfAdjointViewReturnType<UpLo>::Type selfadjointView();
 
-    Scalar sum() const;
-    
-    inline const SparseView<Derived>
-    pruned(const Scalar& reference = Scalar(0), const RealScalar& epsilon = NumTraits<Scalar>::dummy_precision()) const;
+  template <typename OtherDerived>
+  Scalar dot(const MatrixBase<OtherDerived>& other) const;
+  template <typename OtherDerived>
+  Scalar dot(const SparseMatrixBase<OtherDerived>& other) const;
+  RealScalar squaredNorm() const;
+  RealScalar norm() const;
+  RealScalar blueNorm() const;
 
-  protected:
+  TransposeReturnType transpose() { return TransposeReturnType(derived()); }
+  const ConstTransposeReturnType transpose() const { return ConstTransposeReturnType(derived()); }
+  const AdjointReturnType adjoint() const { return AdjointReturnType(transpose()); }
 
-    bool m_isRValue;
+  DenseMatrixType toDense() const { return DenseMatrixType(derived()); }
 
-    static inline StorageIndex convert_index(const Index idx) {
-      return internal::convert_index<StorageIndex>(idx);
-    }
-  private:
-    template<typename Dest> void evalTo(Dest &) const;
+  template <typename OtherDerived>
+  bool isApprox(const SparseMatrixBase<OtherDerived>& other,
+                const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
+
+  template <typename OtherDerived>
+  bool isApprox(const MatrixBase<OtherDerived>& other,
+                const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const {
+    return toDense().isApprox(other, prec);
+  }
+
+  /** \returns the matrix or vector obtained by evaluating this expression.
+   *
+   * Notice that in the case of a plain matrix or vector (not an expression) this function just returns
+   * a const reference, in order to avoid a useless copy.
+   */
+  inline const typename internal::eval<Derived>::type eval() const {
+    return typename internal::eval<Derived>::type(derived());
+  }
+
+  Scalar sum() const;
+
+  inline const SparseView<Derived> pruned(const Scalar& reference = Scalar(0),
+                                          const RealScalar& epsilon = NumTraits<Scalar>::dummy_precision()) const;
+
+ protected:
+  bool m_isRValue;
+
+  static inline StorageIndex convert_index(const Index idx) { return internal::convert_index<StorageIndex>(idx); }
+
+ private:
+  template <typename Dest>
+  void evalTo(Dest&) const;
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SPARSEMATRIXBASE_H
+#endif  // EIGEN_SPARSEMATRIXBASE_H
diff --git a/Eigen/src/SparseCore/SparsePermutation.h b/Eigen/src/SparseCore/SparsePermutation.h
index 2ae9c15..56f572d 100644
--- a/Eigen/src/SparseCore/SparsePermutation.h
+++ b/Eigen/src/SparseCore/SparsePermutation.h
@@ -15,206 +15,202 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
-template<typename ExpressionType, typename PlainObjectType, bool NeedEval = !is_same<ExpressionType, PlainObjectType>::value>
-struct XprHelper
-{
-    XprHelper(const ExpressionType& xpr) : m_xpr(xpr) {}
-    inline const PlainObjectType& xpr() const { return m_xpr; }
-    // this is a new PlainObjectType initialized by xpr
-    const PlainObjectType m_xpr;
+template <typename ExpressionType, typename PlainObjectType,
+          bool NeedEval = !is_same<ExpressionType, PlainObjectType>::value>
+struct XprHelper {
+  XprHelper(const ExpressionType& xpr) : m_xpr(xpr) {}
+  inline const PlainObjectType& xpr() const { return m_xpr; }
+  // this is a new PlainObjectType initialized by xpr
+  const PlainObjectType m_xpr;
 };
-template<typename ExpressionType, typename PlainObjectType>
-struct XprHelper<ExpressionType, PlainObjectType, false>
-{
-    XprHelper(const ExpressionType& xpr) : m_xpr(xpr) {}
-    inline const PlainObjectType& xpr() const { return m_xpr; }
-    // this is a reference to xpr
-    const PlainObjectType& m_xpr;
+template <typename ExpressionType, typename PlainObjectType>
+struct XprHelper<ExpressionType, PlainObjectType, false> {
+  XprHelper(const ExpressionType& xpr) : m_xpr(xpr) {}
+  inline const PlainObjectType& xpr() const { return m_xpr; }
+  // this is a reference to xpr
+  const PlainObjectType& m_xpr;
 };
 
-template<typename PermDerived, bool NeedInverseEval>
-struct PermHelper
-{
-    using IndicesType = typename PermDerived::IndicesType;
-    using PermutationIndex = typename IndicesType::Scalar;
-    using type = PermutationMatrix<IndicesType::SizeAtCompileTime, IndicesType::MaxSizeAtCompileTime, PermutationIndex>;
-    PermHelper(const PermDerived& perm) : m_perm(perm.inverse()) {}
-    inline const type& perm() const { return m_perm; }
-    // this is a new PermutationMatrix initialized by perm.inverse()
-    const type m_perm;
+template <typename PermDerived, bool NeedInverseEval>
+struct PermHelper {
+  using IndicesType = typename PermDerived::IndicesType;
+  using PermutationIndex = typename IndicesType::Scalar;
+  using type = PermutationMatrix<IndicesType::SizeAtCompileTime, IndicesType::MaxSizeAtCompileTime, PermutationIndex>;
+  PermHelper(const PermDerived& perm) : m_perm(perm.inverse()) {}
+  inline const type& perm() const { return m_perm; }
+  // this is a new PermutationMatrix initialized by perm.inverse()
+  const type m_perm;
 };
-template<typename PermDerived>
-struct PermHelper<PermDerived, false>
-{
-    using type = PermDerived;
-    PermHelper(const PermDerived& perm) : m_perm(perm) {}
-    inline const type& perm() const { return m_perm; }
-    // this is a reference to perm
-    const type& m_perm;
+template <typename PermDerived>
+struct PermHelper<PermDerived, false> {
+  using type = PermDerived;
+  PermHelper(const PermDerived& perm) : m_perm(perm) {}
+  inline const type& perm() const { return m_perm; }
+  // this is a reference to perm
+  const type& m_perm;
 };
 
-template<typename ExpressionType, int Side, bool Transposed>
-struct permutation_matrix_product<ExpressionType, Side, Transposed, SparseShape>
-{
-    using MatrixType = typename nested_eval<ExpressionType, 1>::type;
-    using MatrixTypeCleaned = remove_all_t<MatrixType>;
+template <typename ExpressionType, int Side, bool Transposed>
+struct permutation_matrix_product<ExpressionType, Side, Transposed, SparseShape> {
+  using MatrixType = typename nested_eval<ExpressionType, 1>::type;
+  using MatrixTypeCleaned = remove_all_t<MatrixType>;
 
-    using Scalar = typename MatrixTypeCleaned::Scalar;
-    using StorageIndex = typename MatrixTypeCleaned::StorageIndex;
+  using Scalar = typename MatrixTypeCleaned::Scalar;
+  using StorageIndex = typename MatrixTypeCleaned::StorageIndex;
 
-    // the actual "return type" is `Dest`. this is a temporary type
-    using ReturnType = SparseMatrix<Scalar, MatrixTypeCleaned::IsRowMajor ? RowMajor : ColMajor, StorageIndex>;
-    using TmpHelper = XprHelper<ExpressionType, ReturnType>;
+  // the actual "return type" is `Dest`. this is a temporary type
+  using ReturnType = SparseMatrix<Scalar, MatrixTypeCleaned::IsRowMajor ? RowMajor : ColMajor, StorageIndex>;
+  using TmpHelper = XprHelper<ExpressionType, ReturnType>;
 
-    static constexpr bool NeedOuterPermutation = ExpressionType::IsRowMajor ? Side == OnTheLeft : Side == OnTheRight;
-    static constexpr bool NeedInversePermutation = Transposed ? Side == OnTheLeft : Side == OnTheRight;
+  static constexpr bool NeedOuterPermutation = ExpressionType::IsRowMajor ? Side == OnTheLeft : Side == OnTheRight;
+  static constexpr bool NeedInversePermutation = Transposed ? Side == OnTheLeft : Side == OnTheRight;
 
-    template <typename Dest, typename PermutationType>
-    static inline void permute_outer(Dest& dst, const PermutationType& perm, const ExpressionType& xpr) {
+  template <typename Dest, typename PermutationType>
+  static inline void permute_outer(Dest& dst, const PermutationType& perm, const ExpressionType& xpr) {
+    // if ExpressionType is not ReturnType, evaluate `xpr` (allocation)
+    // otherwise, just reference `xpr`
+    // TODO: handle trivial expressions such as CwiseBinaryOp without temporary
+    const TmpHelper tmpHelper(xpr);
+    const ReturnType& tmp = tmpHelper.xpr();
 
-        // if ExpressionType is not ReturnType, evaluate `xpr` (allocation)
-        // otherwise, just reference `xpr`
-        // TODO: handle trivial expressions such as CwiseBinaryOp without temporary
-        const TmpHelper tmpHelper(xpr);
-        const ReturnType& tmp = tmpHelper.xpr();
+    ReturnType result(tmp.rows(), tmp.cols());
 
-        ReturnType result(tmp.rows(), tmp.cols());
-
-        for (Index j = 0; j < tmp.outerSize(); j++) {
-          Index jp = perm.indices().coeff(j);
-          Index jsrc = NeedInversePermutation ? jp : j;
-          Index jdst = NeedInversePermutation ? j : jp;
-          Index begin = tmp.outerIndexPtr()[jsrc];
-          Index end = tmp.isCompressed() ? tmp.outerIndexPtr()[jsrc + 1] : begin + tmp.innerNonZeroPtr()[jsrc];
-          result.outerIndexPtr()[jdst + 1] += end - begin;
-        }
-
-        std::partial_sum(result.outerIndexPtr(), result.outerIndexPtr() + result.outerSize() + 1,
-                         result.outerIndexPtr());
-        result.resizeNonZeros(result.nonZeros());
-
-        for (Index j = 0; j < tmp.outerSize(); j++) {
-          Index jp = perm.indices().coeff(j);
-          Index jsrc = NeedInversePermutation ? jp : j;
-          Index jdst = NeedInversePermutation ? j : jp;
-          Index begin = tmp.outerIndexPtr()[jsrc];
-          Index end = tmp.isCompressed() ? tmp.outerIndexPtr()[jsrc + 1] : begin + tmp.innerNonZeroPtr()[jsrc];
-          Index target = result.outerIndexPtr()[jdst];
-          smart_copy(tmp.innerIndexPtr() + begin, tmp.innerIndexPtr() + end, result.innerIndexPtr() + target);
-          smart_copy(tmp.valuePtr() + begin, tmp.valuePtr() + end, result.valuePtr() + target);
-        }
-        dst = std::move(result);
+    for (Index j = 0; j < tmp.outerSize(); j++) {
+      Index jp = perm.indices().coeff(j);
+      Index jsrc = NeedInversePermutation ? jp : j;
+      Index jdst = NeedInversePermutation ? j : jp;
+      Index begin = tmp.outerIndexPtr()[jsrc];
+      Index end = tmp.isCompressed() ? tmp.outerIndexPtr()[jsrc + 1] : begin + tmp.innerNonZeroPtr()[jsrc];
+      result.outerIndexPtr()[jdst + 1] += end - begin;
     }
 
-    template <typename Dest, typename PermutationType>
-    static inline void permute_inner(Dest& dst, const PermutationType& perm, const ExpressionType& xpr) {
-        using InnerPermHelper = PermHelper<PermutationType, NeedInversePermutation>;
-        using InnerPermType = typename InnerPermHelper::type;
+    std::partial_sum(result.outerIndexPtr(), result.outerIndexPtr() + result.outerSize() + 1, result.outerIndexPtr());
+    result.resizeNonZeros(result.nonZeros());
 
-        // if ExpressionType is not ReturnType, evaluate `xpr` (allocation)
-        // otherwise, just reference `xpr`
-        // TODO: handle trivial expressions such as CwiseBinaryOp without temporary
-        const TmpHelper tmpHelper(xpr);
-        const ReturnType& tmp = tmpHelper.xpr();
+    for (Index j = 0; j < tmp.outerSize(); j++) {
+      Index jp = perm.indices().coeff(j);
+      Index jsrc = NeedInversePermutation ? jp : j;
+      Index jdst = NeedInversePermutation ? j : jp;
+      Index begin = tmp.outerIndexPtr()[jsrc];
+      Index end = tmp.isCompressed() ? tmp.outerIndexPtr()[jsrc + 1] : begin + tmp.innerNonZeroPtr()[jsrc];
+      Index target = result.outerIndexPtr()[jdst];
+      smart_copy(tmp.innerIndexPtr() + begin, tmp.innerIndexPtr() + end, result.innerIndexPtr() + target);
+      smart_copy(tmp.valuePtr() + begin, tmp.valuePtr() + end, result.valuePtr() + target);
+    }
+    dst = std::move(result);
+  }
 
-        // if inverse permutation of inner indices is requested, calculate perm.inverse() (allocation)
-        // otherwise, just reference `perm`
-        const InnerPermHelper permHelper(perm);
-        const InnerPermType& innerPerm = permHelper.perm();
+  template <typename Dest, typename PermutationType>
+  static inline void permute_inner(Dest& dst, const PermutationType& perm, const ExpressionType& xpr) {
+    using InnerPermHelper = PermHelper<PermutationType, NeedInversePermutation>;
+    using InnerPermType = typename InnerPermHelper::type;
 
-        ReturnType result(tmp.rows(), tmp.cols());
+    // if ExpressionType is not ReturnType, evaluate `xpr` (allocation)
+    // otherwise, just reference `xpr`
+    // TODO: handle trivial expressions such as CwiseBinaryOp without temporary
+    const TmpHelper tmpHelper(xpr);
+    const ReturnType& tmp = tmpHelper.xpr();
 
-        for (Index j = 0; j < tmp.outerSize(); j++) {
-            Index begin = tmp.outerIndexPtr()[j];
-            Index end = tmp.isCompressed() ? tmp.outerIndexPtr()[j + 1] : begin + tmp.innerNonZeroPtr()[j];
-            result.outerIndexPtr()[j + 1] += end - begin;
-        }
+    // if inverse permutation of inner indices is requested, calculate perm.inverse() (allocation)
+    // otherwise, just reference `perm`
+    const InnerPermHelper permHelper(perm);
+    const InnerPermType& innerPerm = permHelper.perm();
 
-        std::partial_sum(result.outerIndexPtr(), result.outerIndexPtr() + result.outerSize() + 1, result.outerIndexPtr());
-        result.resizeNonZeros(result.nonZeros());
+    ReturnType result(tmp.rows(), tmp.cols());
 
-        for (Index j = 0; j < tmp.outerSize(); j++) {
-            Index begin = tmp.outerIndexPtr()[j];
-            Index end = tmp.isCompressed() ? tmp.outerIndexPtr()[j + 1] : begin + tmp.innerNonZeroPtr()[j];
-            Index target = result.outerIndexPtr()[j];
-            std::transform(tmp.innerIndexPtr() + begin, tmp.innerIndexPtr() + end, result.innerIndexPtr() + target,
-                           [&innerPerm](StorageIndex i) { return innerPerm.indices().coeff(i); });
-            smart_copy(tmp.valuePtr() + begin, tmp.valuePtr() + end, result.valuePtr() + target);
-        }
-        // the inner indices were permuted, and must be sorted
-        result.sortInnerIndices();
-        dst = std::move(result);
+    for (Index j = 0; j < tmp.outerSize(); j++) {
+      Index begin = tmp.outerIndexPtr()[j];
+      Index end = tmp.isCompressed() ? tmp.outerIndexPtr()[j + 1] : begin + tmp.innerNonZeroPtr()[j];
+      result.outerIndexPtr()[j + 1] += end - begin;
     }
 
-    template <typename Dest, typename PermutationType, bool DoOuter = NeedOuterPermutation, std::enable_if_t<DoOuter, int> = 0>
-    static inline void run(Dest& dst, const PermutationType& perm, const ExpressionType& xpr) { permute_outer(dst, perm, xpr); }
+    std::partial_sum(result.outerIndexPtr(), result.outerIndexPtr() + result.outerSize() + 1, result.outerIndexPtr());
+    result.resizeNonZeros(result.nonZeros());
 
-    template <typename Dest, typename PermutationType, bool DoOuter = NeedOuterPermutation, std::enable_if_t<!DoOuter, int> = 0>
-    static inline void run(Dest& dst, const PermutationType& perm, const ExpressionType& xpr) { permute_inner(dst, perm, xpr); }
+    for (Index j = 0; j < tmp.outerSize(); j++) {
+      Index begin = tmp.outerIndexPtr()[j];
+      Index end = tmp.isCompressed() ? tmp.outerIndexPtr()[j + 1] : begin + tmp.innerNonZeroPtr()[j];
+      Index target = result.outerIndexPtr()[j];
+      std::transform(tmp.innerIndexPtr() + begin, tmp.innerIndexPtr() + end, result.innerIndexPtr() + target,
+                     [&innerPerm](StorageIndex i) { return innerPerm.indices().coeff(i); });
+      smart_copy(tmp.valuePtr() + begin, tmp.valuePtr() + end, result.valuePtr() + target);
+    }
+    // the inner indices were permuted, and must be sorted
+    result.sortInnerIndices();
+    dst = std::move(result);
+  }
+
+  template <typename Dest, typename PermutationType, bool DoOuter = NeedOuterPermutation,
+            std::enable_if_t<DoOuter, int> = 0>
+  static inline void run(Dest& dst, const PermutationType& perm, const ExpressionType& xpr) {
+    permute_outer(dst, perm, xpr);
+  }
+
+  template <typename Dest, typename PermutationType, bool DoOuter = NeedOuterPermutation,
+            std::enable_if_t<!DoOuter, int> = 0>
+  static inline void run(Dest& dst, const PermutationType& perm, const ExpressionType& xpr) {
+    permute_inner(dst, perm, xpr);
+  }
 };
 
-}
+}  // namespace internal
 
 namespace internal {
 
-template <int ProductTag> struct product_promote_storage_type<Sparse,             PermutationStorage, ProductTag> { typedef Sparse ret; };
-template <int ProductTag> struct product_promote_storage_type<PermutationStorage, Sparse,             ProductTag> { typedef Sparse ret; };
+template <int ProductTag>
+struct product_promote_storage_type<Sparse, PermutationStorage, ProductTag> {
+  typedef Sparse ret;
+};
+template <int ProductTag>
+struct product_promote_storage_type<PermutationStorage, Sparse, ProductTag> {
+  typedef Sparse ret;
+};
 
-// TODO, the following two overloads are only needed to define the right temporary type through 
+// TODO, the following two overloads are only needed to define the right temporary type through
 // typename traits<permutation_sparse_matrix_product<Rhs,Lhs,OnTheRight,false> >::ReturnType
 // whereas it should be correctly handled by traits<Product<> >::PlainObject
 
-template<typename Lhs, typename Rhs, int ProductTag>
+template <typename Lhs, typename Rhs, int ProductTag>
 struct product_evaluator<Product<Lhs, Rhs, AliasFreeProduct>, ProductTag, PermutationShape, SparseShape>
-  : public evaluator<typename permutation_matrix_product<Rhs,OnTheLeft,false,SparseShape>::ReturnType>
-{
+    : public evaluator<typename permutation_matrix_product<Rhs, OnTheLeft, false, SparseShape>::ReturnType> {
   typedef Product<Lhs, Rhs, AliasFreeProduct> XprType;
-  typedef typename permutation_matrix_product<Rhs,OnTheLeft,false,SparseShape>::ReturnType PlainObject;
+  typedef typename permutation_matrix_product<Rhs, OnTheLeft, false, SparseShape>::ReturnType PlainObject;
   typedef evaluator<PlainObject> Base;
 
-  enum {
-    Flags = Base::Flags | EvalBeforeNestingBit
-  };
+  enum { Flags = Base::Flags | EvalBeforeNestingBit };
 
-  explicit product_evaluator(const XprType& xpr)
-    : m_result(xpr.rows(), xpr.cols())
-  {
+  explicit product_evaluator(const XprType& xpr) : m_result(xpr.rows(), xpr.cols()) {
     internal::construct_at<Base>(this, m_result);
     generic_product_impl<Lhs, Rhs, PermutationShape, SparseShape, ProductTag>::evalTo(m_result, xpr.lhs(), xpr.rhs());
   }
 
-protected:
+ protected:
   PlainObject m_result;
 };
 
-template<typename Lhs, typename Rhs, int ProductTag>
-struct product_evaluator<Product<Lhs, Rhs, AliasFreeProduct>, ProductTag, SparseShape, PermutationShape >
-  : public evaluator<typename permutation_matrix_product<Lhs,OnTheRight,false,SparseShape>::ReturnType>
-{
+template <typename Lhs, typename Rhs, int ProductTag>
+struct product_evaluator<Product<Lhs, Rhs, AliasFreeProduct>, ProductTag, SparseShape, PermutationShape>
+    : public evaluator<typename permutation_matrix_product<Lhs, OnTheRight, false, SparseShape>::ReturnType> {
   typedef Product<Lhs, Rhs, AliasFreeProduct> XprType;
-  typedef typename permutation_matrix_product<Lhs,OnTheRight,false,SparseShape>::ReturnType PlainObject;
+  typedef typename permutation_matrix_product<Lhs, OnTheRight, false, SparseShape>::ReturnType PlainObject;
   typedef evaluator<PlainObject> Base;
 
-  enum {
-    Flags = Base::Flags | EvalBeforeNestingBit
-  };
+  enum { Flags = Base::Flags | EvalBeforeNestingBit };
 
-  explicit product_evaluator(const XprType& xpr)
-    : m_result(xpr.rows(), xpr.cols())
-  {
+  explicit product_evaluator(const XprType& xpr) : m_result(xpr.rows(), xpr.cols()) {
     ::new (static_cast<Base*>(this)) Base(m_result);
     generic_product_impl<Lhs, Rhs, SparseShape, PermutationShape, ProductTag>::evalTo(m_result, xpr.lhs(), xpr.rhs());
   }
 
-protected:
+ protected:
   PlainObject m_result;
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \returns the matrix with the permutation applied to the columns
  */
@@ -248,6 +244,6 @@
   return Product<Inverse<PermutationType>, SparseDerived, AliasFreeProduct>(tperm.derived(), matrix.derived());
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SPARSE_SELFADJOINTVIEW_H
+#endif  // EIGEN_SPARSE_SELFADJOINTVIEW_H
diff --git a/Eigen/src/SparseCore/SparseProduct.h b/Eigen/src/SparseCore/SparseProduct.h
index 64a63a3..249dabc 100644
--- a/Eigen/src/SparseCore/SparseProduct.h
+++ b/Eigen/src/SparseCore/SparseProduct.h
@@ -13,172 +13,166 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 /** \returns an expression of the product of two sparse matrices.
-  * By default a conservative product preserving the symbolic non zeros is performed.
-  * The automatic pruning of the small values can be achieved by calling the pruned() function
-  * in which case a totally different product algorithm is employed:
-  * \code
-  * C = (A*B).pruned();             // suppress numerical zeros (exact)
-  * C = (A*B).pruned(ref);
-  * C = (A*B).pruned(ref,epsilon);
-  * \endcode
-  * where \c ref is a meaningful non zero reference value.
-  * */
-template<typename Derived>
-template<typename OtherDerived>
-inline const Product<Derived,OtherDerived,AliasFreeProduct>
-SparseMatrixBase<Derived>::operator*(const SparseMatrixBase<OtherDerived> &other) const
-{
-  return Product<Derived,OtherDerived,AliasFreeProduct>(derived(), other.derived());
+ * By default a conservative product preserving the symbolic non zeros is performed.
+ * The automatic pruning of the small values can be achieved by calling the pruned() function
+ * in which case a totally different product algorithm is employed:
+ * \code
+ * C = (A*B).pruned();             // suppress numerical zeros (exact)
+ * C = (A*B).pruned(ref);
+ * C = (A*B).pruned(ref,epsilon);
+ * \endcode
+ * where \c ref is a meaningful non zero reference value.
+ * */
+template <typename Derived>
+template <typename OtherDerived>
+inline const Product<Derived, OtherDerived, AliasFreeProduct> SparseMatrixBase<Derived>::operator*(
+    const SparseMatrixBase<OtherDerived>& other) const {
+  return Product<Derived, OtherDerived, AliasFreeProduct>(derived(), other.derived());
 }
 
 namespace internal {
 
 // sparse * sparse
-template<typename Lhs, typename Rhs, int ProductType>
-struct generic_product_impl<Lhs, Rhs, SparseShape, SparseShape, ProductType>
-{
-  template<typename Dest>
-  static void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs)
-  {
+template <typename Lhs, typename Rhs, int ProductType>
+struct generic_product_impl<Lhs, Rhs, SparseShape, SparseShape, ProductType> {
+  template <typename Dest>
+  static void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs) {
     evalTo(dst, lhs, rhs, typename evaluator_traits<Dest>::Shape());
   }
 
   // dense += sparse * sparse
-  template<typename Dest,typename ActualLhs>
-  static void addTo(Dest& dst, const ActualLhs& lhs, const Rhs& rhs, std::enable_if_t<is_same<typename evaluator_traits<Dest>::Shape,DenseShape>::value,int*>* = 0)
-  {
-    typedef typename nested_eval<ActualLhs,Dynamic>::type LhsNested;
-    typedef typename nested_eval<Rhs,Dynamic>::type RhsNested;
+  template <typename Dest, typename ActualLhs>
+  static void addTo(Dest& dst, const ActualLhs& lhs, const Rhs& rhs,
+                    std::enable_if_t<is_same<typename evaluator_traits<Dest>::Shape, DenseShape>::value, int*>* = 0) {
+    typedef typename nested_eval<ActualLhs, Dynamic>::type LhsNested;
+    typedef typename nested_eval<Rhs, Dynamic>::type RhsNested;
     LhsNested lhsNested(lhs);
     RhsNested rhsNested(rhs);
-    internal::sparse_sparse_to_dense_product_selector<remove_all_t<LhsNested>,
-                                                      remove_all_t<RhsNested>, Dest>::run(lhsNested,rhsNested,dst);
+    internal::sparse_sparse_to_dense_product_selector<remove_all_t<LhsNested>, remove_all_t<RhsNested>, Dest>::run(
+        lhsNested, rhsNested, dst);
   }
 
   // dense -= sparse * sparse
-  template<typename Dest>
-  static void subTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, std::enable_if_t<is_same<typename evaluator_traits<Dest>::Shape,DenseShape>::value,int*>* = 0)
-  {
+  template <typename Dest>
+  static void subTo(Dest& dst, const Lhs& lhs, const Rhs& rhs,
+                    std::enable_if_t<is_same<typename evaluator_traits<Dest>::Shape, DenseShape>::value, int*>* = 0) {
     addTo(dst, -lhs, rhs);
   }
 
-protected:
-
+ protected:
   // sparse = sparse * sparse
-  template<typename Dest>
-  static void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, SparseShape)
-  {
-    typedef typename nested_eval<Lhs,Dynamic>::type LhsNested;
-    typedef typename nested_eval<Rhs,Dynamic>::type RhsNested;
+  template <typename Dest>
+  static void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, SparseShape) {
+    typedef typename nested_eval<Lhs, Dynamic>::type LhsNested;
+    typedef typename nested_eval<Rhs, Dynamic>::type RhsNested;
     LhsNested lhsNested(lhs);
     RhsNested rhsNested(rhs);
-    internal::conservative_sparse_sparse_product_selector<remove_all_t<LhsNested>,
-                                                          remove_all_t<RhsNested>, Dest>::run(lhsNested,rhsNested,dst);
+    internal::conservative_sparse_sparse_product_selector<remove_all_t<LhsNested>, remove_all_t<RhsNested>, Dest>::run(
+        lhsNested, rhsNested, dst);
   }
 
   // dense = sparse * sparse
-  template<typename Dest>
-  static void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, DenseShape)
-  {
+  template <typename Dest>
+  static void evalTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, DenseShape) {
     dst.setZero();
     addTo(dst, lhs, rhs);
   }
 };
 
 // sparse * sparse-triangular
-template<typename Lhs, typename Rhs, int ProductType>
+template <typename Lhs, typename Rhs, int ProductType>
 struct generic_product_impl<Lhs, Rhs, SparseShape, SparseTriangularShape, ProductType>
- : public generic_product_impl<Lhs, Rhs, SparseShape, SparseShape, ProductType>
-{};
+    : public generic_product_impl<Lhs, Rhs, SparseShape, SparseShape, ProductType> {};
 
 // sparse-triangular * sparse
-template<typename Lhs, typename Rhs, int ProductType>
+template <typename Lhs, typename Rhs, int ProductType>
 struct generic_product_impl<Lhs, Rhs, SparseTriangularShape, SparseShape, ProductType>
- : public generic_product_impl<Lhs, Rhs, SparseShape, SparseShape, ProductType>
-{};
+    : public generic_product_impl<Lhs, Rhs, SparseShape, SparseShape, ProductType> {};
 
 // dense = sparse-product (can be sparse*sparse, sparse*perm, etc.)
-template< typename DstXprType, typename Lhs, typename Rhs>
-struct Assignment<DstXprType, Product<Lhs,Rhs,AliasFreeProduct>, internal::assign_op<typename DstXprType::Scalar,typename Product<Lhs,Rhs,AliasFreeProduct>::Scalar>, Sparse2Dense>
-{
-  typedef Product<Lhs,Rhs,AliasFreeProduct> SrcXprType;
-  static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &)
-  {
+template <typename DstXprType, typename Lhs, typename Rhs>
+struct Assignment<
+    DstXprType, Product<Lhs, Rhs, AliasFreeProduct>,
+    internal::assign_op<typename DstXprType::Scalar, typename Product<Lhs, Rhs, AliasFreeProduct>::Scalar>,
+    Sparse2Dense> {
+  typedef Product<Lhs, Rhs, AliasFreeProduct> SrcXprType;
+  static void run(DstXprType& dst, const SrcXprType& src,
+                  const internal::assign_op<typename DstXprType::Scalar, typename SrcXprType::Scalar>&) {
     Index dstRows = src.rows();
     Index dstCols = src.cols();
-    if((dst.rows()!=dstRows) || (dst.cols()!=dstCols))
-      dst.resize(dstRows, dstCols);
-    
-    generic_product_impl<Lhs, Rhs>::evalTo(dst,src.lhs(),src.rhs());
+    if ((dst.rows() != dstRows) || (dst.cols() != dstCols)) dst.resize(dstRows, dstCols);
+
+    generic_product_impl<Lhs, Rhs>::evalTo(dst, src.lhs(), src.rhs());
   }
 };
 
 // dense += sparse-product (can be sparse*sparse, sparse*perm, etc.)
-template< typename DstXprType, typename Lhs, typename Rhs>
-struct Assignment<DstXprType, Product<Lhs,Rhs,AliasFreeProduct>, internal::add_assign_op<typename DstXprType::Scalar,typename Product<Lhs,Rhs,AliasFreeProduct>::Scalar>, Sparse2Dense>
-{
-  typedef Product<Lhs,Rhs,AliasFreeProduct> SrcXprType;
-  static void run(DstXprType &dst, const SrcXprType &src, const internal::add_assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &)
-  {
-    generic_product_impl<Lhs, Rhs>::addTo(dst,src.lhs(),src.rhs());
+template <typename DstXprType, typename Lhs, typename Rhs>
+struct Assignment<
+    DstXprType, Product<Lhs, Rhs, AliasFreeProduct>,
+    internal::add_assign_op<typename DstXprType::Scalar, typename Product<Lhs, Rhs, AliasFreeProduct>::Scalar>,
+    Sparse2Dense> {
+  typedef Product<Lhs, Rhs, AliasFreeProduct> SrcXprType;
+  static void run(DstXprType& dst, const SrcXprType& src,
+                  const internal::add_assign_op<typename DstXprType::Scalar, typename SrcXprType::Scalar>&) {
+    generic_product_impl<Lhs, Rhs>::addTo(dst, src.lhs(), src.rhs());
   }
 };
 
 // dense -= sparse-product (can be sparse*sparse, sparse*perm, etc.)
-template< typename DstXprType, typename Lhs, typename Rhs>
-struct Assignment<DstXprType, Product<Lhs,Rhs,AliasFreeProduct>, internal::sub_assign_op<typename DstXprType::Scalar,typename Product<Lhs,Rhs,AliasFreeProduct>::Scalar>, Sparse2Dense>
-{
-  typedef Product<Lhs,Rhs,AliasFreeProduct> SrcXprType;
-  static void run(DstXprType &dst, const SrcXprType &src, const internal::sub_assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> &)
-  {
-    generic_product_impl<Lhs, Rhs>::subTo(dst,src.lhs(),src.rhs());
+template <typename DstXprType, typename Lhs, typename Rhs>
+struct Assignment<
+    DstXprType, Product<Lhs, Rhs, AliasFreeProduct>,
+    internal::sub_assign_op<typename DstXprType::Scalar, typename Product<Lhs, Rhs, AliasFreeProduct>::Scalar>,
+    Sparse2Dense> {
+  typedef Product<Lhs, Rhs, AliasFreeProduct> SrcXprType;
+  static void run(DstXprType& dst, const SrcXprType& src,
+                  const internal::sub_assign_op<typename DstXprType::Scalar, typename SrcXprType::Scalar>&) {
+    generic_product_impl<Lhs, Rhs>::subTo(dst, src.lhs(), src.rhs());
   }
 };
 
-template<typename Lhs, typename Rhs, int Options>
+template <typename Lhs, typename Rhs, int Options>
 struct unary_evaluator<SparseView<Product<Lhs, Rhs, Options> >, IteratorBased>
- : public evaluator<typename Product<Lhs, Rhs, DefaultProduct>::PlainObject>
-{
+    : public evaluator<typename Product<Lhs, Rhs, DefaultProduct>::PlainObject> {
   typedef SparseView<Product<Lhs, Rhs, Options> > XprType;
   typedef typename XprType::PlainObject PlainObject;
   typedef evaluator<PlainObject> Base;
 
-  explicit unary_evaluator(const XprType& xpr)
-    : m_result(xpr.rows(), xpr.cols())
-  {
+  explicit unary_evaluator(const XprType& xpr) : m_result(xpr.rows(), xpr.cols()) {
     using std::abs;
     internal::construct_at<Base>(this, m_result);
-    typedef typename nested_eval<Lhs,Dynamic>::type LhsNested;
-    typedef typename nested_eval<Rhs,Dynamic>::type RhsNested;
+    typedef typename nested_eval<Lhs, Dynamic>::type LhsNested;
+    typedef typename nested_eval<Rhs, Dynamic>::type RhsNested;
     LhsNested lhsNested(xpr.nestedExpression().lhs());
     RhsNested rhsNested(xpr.nestedExpression().rhs());
 
-    internal::sparse_sparse_product_with_pruning_selector<remove_all_t<LhsNested>,
-                                                          remove_all_t<RhsNested>, PlainObject>::run(lhsNested,rhsNested,m_result,
-                                                                                                                  abs(xpr.reference())*xpr.epsilon());
+    internal::sparse_sparse_product_with_pruning_selector<remove_all_t<LhsNested>, remove_all_t<RhsNested>,
+                                                          PlainObject>::run(lhsNested, rhsNested, m_result,
+                                                                            abs(xpr.reference()) * xpr.epsilon());
   }
 
-protected:
+ protected:
   PlainObject m_result;
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 // sparse matrix = sparse-product (can be sparse*sparse, sparse*perm, etc.)
-template<typename Scalar, int Options_, typename StorageIndex_>
-template<typename Lhs, typename Rhs>
-SparseMatrix<Scalar,Options_,StorageIndex_>& SparseMatrix<Scalar,Options_,StorageIndex_>::operator=(const Product<Lhs,Rhs,AliasFreeProduct>& src)
-{
+template <typename Scalar, int Options_, typename StorageIndex_>
+template <typename Lhs, typename Rhs>
+SparseMatrix<Scalar, Options_, StorageIndex_>& SparseMatrix<Scalar, Options_, StorageIndex_>::operator=(
+    const Product<Lhs, Rhs, AliasFreeProduct>& src) {
   // std::cout << "in Assignment : " << DstOptions << "\n";
-  SparseMatrix dst(src.rows(),src.cols());
-  internal::generic_product_impl<Lhs, Rhs>::evalTo(dst,src.lhs(),src.rhs());
+  SparseMatrix dst(src.rows(), src.cols());
+  internal::generic_product_impl<Lhs, Rhs>::evalTo(dst, src.lhs(), src.rhs());
   this->swap(dst);
   return *this;
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SPARSEPRODUCT_H
+#endif  // EIGEN_SPARSEPRODUCT_H
diff --git a/Eigen/src/SparseCore/SparseRedux.h b/Eigen/src/SparseCore/SparseRedux.h
index e39a944..732e4f7 100644
--- a/Eigen/src/SparseCore/SparseRedux.h
+++ b/Eigen/src/SparseCore/SparseRedux.h
@@ -13,40 +13,35 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
-template<typename Derived>
-typename internal::traits<Derived>::Scalar
-SparseMatrixBase<Derived>::sum() const
-{
-  eigen_assert(rows()>0 && cols()>0 && "you are using a non initialized matrix");
+template <typename Derived>
+typename internal::traits<Derived>::Scalar SparseMatrixBase<Derived>::sum() const {
+  eigen_assert(rows() > 0 && cols() > 0 && "you are using a non initialized matrix");
   Scalar res(0);
   internal::evaluator<Derived> thisEval(derived());
-  for (Index j=0; j<outerSize(); ++j)
-    for (typename internal::evaluator<Derived>::InnerIterator iter(thisEval,j); iter; ++iter)
-      res += iter.value();
+  for (Index j = 0; j < outerSize(); ++j)
+    for (typename internal::evaluator<Derived>::InnerIterator iter(thisEval, j); iter; ++iter) res += iter.value();
   return res;
 }
 
-template<typename Scalar_, int Options_, typename Index_>
-typename internal::traits<SparseMatrix<Scalar_,Options_,Index_> >::Scalar
-SparseMatrix<Scalar_,Options_,Index_>::sum() const
-{
-  eigen_assert(rows()>0 && cols()>0 && "you are using a non initialized matrix");
-  if(this->isCompressed())
-    return Matrix<Scalar,1,Dynamic>::Map(m_data.valuePtr(), m_data.size()).sum();
+template <typename Scalar_, int Options_, typename Index_>
+typename internal::traits<SparseMatrix<Scalar_, Options_, Index_> >::Scalar
+SparseMatrix<Scalar_, Options_, Index_>::sum() const {
+  eigen_assert(rows() > 0 && cols() > 0 && "you are using a non initialized matrix");
+  if (this->isCompressed())
+    return Matrix<Scalar, 1, Dynamic>::Map(m_data.valuePtr(), m_data.size()).sum();
   else
     return Base::sum();
 }
 
-template<typename Scalar_, int Options_, typename Index_>
-typename internal::traits<SparseVector<Scalar_,Options_, Index_> >::Scalar
-SparseVector<Scalar_,Options_,Index_>::sum() const
-{
-  eigen_assert(rows()>0 && cols()>0 && "you are using a non initialized matrix");
-  return Matrix<Scalar,1,Dynamic>::Map(m_data.valuePtr(), m_data.size()).sum();
+template <typename Scalar_, int Options_, typename Index_>
+typename internal::traits<SparseVector<Scalar_, Options_, Index_> >::Scalar
+SparseVector<Scalar_, Options_, Index_>::sum() const {
+  eigen_assert(rows() > 0 && cols() > 0 && "you are using a non initialized matrix");
+  return Matrix<Scalar, 1, Dynamic>::Map(m_data.valuePtr(), m_data.size()).sum();
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SPARSEREDUX_H
+#endif  // EIGEN_SPARSEREDUX_H
diff --git a/Eigen/src/SparseCore/SparseRef.h b/Eigen/src/SparseCore/SparseRef.h
index a69ad01..c205e6d 100644
--- a/Eigen/src/SparseCore/SparseRef.h
+++ b/Eigen/src/SparseCore/SparseRef.h
@@ -16,380 +16,355 @@
 namespace Eigen {
 
 enum {
-  StandardCompressedFormat = 2 /**< used by Ref<SparseMatrix> to specify whether the input storage must be in standard compressed form */
+  StandardCompressedFormat =
+      2 /**< used by Ref<SparseMatrix> to specify whether the input storage must be in standard compressed form */
 };
-  
+
 namespace internal {
 
-template<typename Derived> class SparseRefBase;
+template <typename Derived>
+class SparseRefBase;
 
-template<typename MatScalar, int MatOptions, typename MatIndex, int Options_, typename StrideType_>
-struct traits<Ref<SparseMatrix<MatScalar,MatOptions,MatIndex>, Options_, StrideType_> >
-  : public traits<SparseMatrix<MatScalar,MatOptions,MatIndex> >
-{
-  typedef SparseMatrix<MatScalar,MatOptions,MatIndex> PlainObjectType;
-  enum {
-    Options = Options_,
-    Flags = traits<PlainObjectType>::Flags | CompressedAccessBit | NestByRefBit
-  };
+template <typename MatScalar, int MatOptions, typename MatIndex, int Options_, typename StrideType_>
+struct traits<Ref<SparseMatrix<MatScalar, MatOptions, MatIndex>, Options_, StrideType_>>
+    : public traits<SparseMatrix<MatScalar, MatOptions, MatIndex>> {
+  typedef SparseMatrix<MatScalar, MatOptions, MatIndex> PlainObjectType;
+  enum { Options = Options_, Flags = traits<PlainObjectType>::Flags | CompressedAccessBit | NestByRefBit };
 
-  template<typename Derived> struct match {
+  template <typename Derived>
+  struct match {
     enum {
-      StorageOrderMatch = PlainObjectType::IsVectorAtCompileTime || Derived::IsVectorAtCompileTime || ((PlainObjectType::Flags&RowMajorBit)==(Derived::Flags&RowMajorBit)),
-      MatchAtCompileTime = (Derived::Flags&CompressedAccessBit) && StorageOrderMatch
+      StorageOrderMatch = PlainObjectType::IsVectorAtCompileTime || Derived::IsVectorAtCompileTime ||
+                          ((PlainObjectType::Flags & RowMajorBit) == (Derived::Flags & RowMajorBit)),
+      MatchAtCompileTime = (Derived::Flags & CompressedAccessBit) && StorageOrderMatch
     };
-    typedef std::conditional_t<MatchAtCompileTime,internal::true_type,internal::false_type> type;
+    typedef std::conditional_t<MatchAtCompileTime, internal::true_type, internal::false_type> type;
   };
-  
 };
 
-template<typename MatScalar, int MatOptions, typename MatIndex, int Options_, typename StrideType_>
-struct traits<Ref<const SparseMatrix<MatScalar,MatOptions,MatIndex>, Options_, StrideType_> >
-  : public traits<Ref<SparseMatrix<MatScalar,MatOptions,MatIndex>, Options_, StrideType_> >
-{
+template <typename MatScalar, int MatOptions, typename MatIndex, int Options_, typename StrideType_>
+struct traits<Ref<const SparseMatrix<MatScalar, MatOptions, MatIndex>, Options_, StrideType_>>
+    : public traits<Ref<SparseMatrix<MatScalar, MatOptions, MatIndex>, Options_, StrideType_>> {
   enum {
-    Flags = (traits<SparseMatrix<MatScalar,MatOptions,MatIndex> >::Flags | CompressedAccessBit | NestByRefBit) & ~LvalueBit
+    Flags =
+        (traits<SparseMatrix<MatScalar, MatOptions, MatIndex>>::Flags | CompressedAccessBit | NestByRefBit) & ~LvalueBit
   };
 };
 
-template<typename MatScalar, int MatOptions, typename MatIndex, int Options_, typename StrideType_>
-struct traits<Ref<SparseVector<MatScalar,MatOptions,MatIndex>, Options_, StrideType_> >
-  : public traits<SparseVector<MatScalar,MatOptions,MatIndex> >
-{
-  typedef SparseVector<MatScalar,MatOptions,MatIndex> PlainObjectType;
+template <typename MatScalar, int MatOptions, typename MatIndex, int Options_, typename StrideType_>
+struct traits<Ref<SparseVector<MatScalar, MatOptions, MatIndex>, Options_, StrideType_>>
+    : public traits<SparseVector<MatScalar, MatOptions, MatIndex>> {
+  typedef SparseVector<MatScalar, MatOptions, MatIndex> PlainObjectType;
+  enum { Options = Options_, Flags = traits<PlainObjectType>::Flags | CompressedAccessBit | NestByRefBit };
+
+  template <typename Derived>
+  struct match {
+    enum { MatchAtCompileTime = (Derived::Flags & CompressedAccessBit) && Derived::IsVectorAtCompileTime };
+    typedef std::conditional_t<MatchAtCompileTime, internal::true_type, internal::false_type> type;
+  };
+};
+
+template <typename MatScalar, int MatOptions, typename MatIndex, int Options_, typename StrideType_>
+struct traits<Ref<const SparseVector<MatScalar, MatOptions, MatIndex>, Options_, StrideType_>>
+    : public traits<Ref<SparseVector<MatScalar, MatOptions, MatIndex>, Options_, StrideType_>> {
   enum {
-    Options = Options_,
-    Flags = traits<PlainObjectType>::Flags | CompressedAccessBit | NestByRefBit
-  };
-
-  template<typename Derived> struct match {
-    enum {
-      MatchAtCompileTime = (Derived::Flags&CompressedAccessBit) && Derived::IsVectorAtCompileTime
-    };
-    typedef std::conditional_t<MatchAtCompileTime,internal::true_type,internal::false_type> type;
-  };
-
-};
-
-template<typename MatScalar, int MatOptions, typename MatIndex, int Options_, typename StrideType_>
-struct traits<Ref<const SparseVector<MatScalar,MatOptions,MatIndex>, Options_, StrideType_> >
-  : public traits<Ref<SparseVector<MatScalar,MatOptions,MatIndex>, Options_, StrideType_> >
-{
-  enum {
-    Flags = (traits<SparseVector<MatScalar,MatOptions,MatIndex> >::Flags | CompressedAccessBit | NestByRefBit) & ~LvalueBit
+    Flags =
+        (traits<SparseVector<MatScalar, MatOptions, MatIndex>>::Flags | CompressedAccessBit | NestByRefBit) & ~LvalueBit
   };
 };
 
-template<typename Derived>
-struct traits<SparseRefBase<Derived> > : public traits<Derived> {};
+template <typename Derived>
+struct traits<SparseRefBase<Derived>> : public traits<Derived> {};
 
-template<typename Derived> class SparseRefBase
-  : public SparseMapBase<Derived>
-{
-public:
-
+template <typename Derived>
+class SparseRefBase : public SparseMapBase<Derived> {
+ public:
   typedef SparseMapBase<Derived> Base;
   EIGEN_SPARSE_PUBLIC_INTERFACE(SparseRefBase)
 
   SparseRefBase()
-    : Base(RowsAtCompileTime==Dynamic?0:RowsAtCompileTime,ColsAtCompileTime==Dynamic?0:ColsAtCompileTime, 0, 0, 0, 0, 0)
-  {}
-  
-protected:
+      : Base(RowsAtCompileTime == Dynamic ? 0 : RowsAtCompileTime, ColsAtCompileTime == Dynamic ? 0 : ColsAtCompileTime,
+             0, 0, 0, 0, 0) {}
 
-  template<typename Expression>
-  void construct(Expression& expr)
-  {
-    if(expr.outerIndexPtr()==0)
+ protected:
+  template <typename Expression>
+  void construct(Expression& expr) {
+    if (expr.outerIndexPtr() == 0)
       internal::construct_at<Base>(this, expr.size(), expr.nonZeros(), expr.innerIndexPtr(), expr.valuePtr());
     else
-      internal::construct_at<Base>(this, expr.rows(), expr.cols(), expr.nonZeros(), expr.outerIndexPtr(), expr.innerIndexPtr(), expr.valuePtr(), expr.innerNonZeroPtr());
+      internal::construct_at<Base>(this, expr.rows(), expr.cols(), expr.nonZeros(), expr.outerIndexPtr(),
+                                   expr.innerIndexPtr(), expr.valuePtr(), expr.innerNonZeroPtr());
   }
 };
 
-} // namespace internal
-
-
-/** 
-  * \ingroup SparseCore_Module
-  *
-  * \brief A sparse matrix expression referencing an existing sparse expression
-  *
-  * \tparam SparseMatrixType the equivalent sparse matrix type of the referenced data, it must be a template instance of class SparseMatrix.
-  * \tparam Options specifies whether the a standard compressed format is required \c Options is  \c #StandardCompressedFormat, or \c 0.
-  *                The default is \c 0.
-  *
-  * \sa class Ref
-  */
-#ifndef EIGEN_PARSED_BY_DOXYGEN
-template<typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
-class Ref<SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType >
-  : public internal::SparseRefBase<Ref<SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType > >
-#else
-template<typename SparseMatrixType, int Options>
-class Ref<SparseMatrixType, Options>
-  : public SparseMapBase<Derived,WriteAccessors> // yes, that's weird to use Derived here, but that works!
-#endif
-{
-    typedef SparseMatrix<MatScalar,MatOptions,MatIndex> PlainObjectType;
-    typedef internal::traits<Ref> Traits;
-    template<int OtherOptions>
-    inline Ref(const SparseMatrix<MatScalar,OtherOptions,MatIndex>& expr);
-    template<int OtherOptions>
-    inline Ref(const Map<SparseMatrix<MatScalar,OtherOptions,MatIndex>>& expr);
-  public:
-
-    typedef internal::SparseRefBase<Ref> Base;
-    EIGEN_SPARSE_PUBLIC_INTERFACE(Ref)
-
-
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    template<int OtherOptions>
-    inline Ref(SparseMatrix<MatScalar,OtherOptions,MatIndex>& expr)
-    {
-      EIGEN_STATIC_ASSERT(bool(Traits::template match<SparseMatrix<MatScalar,OtherOptions,MatIndex> >::MatchAtCompileTime), STORAGE_LAYOUT_DOES_NOT_MATCH);
-      eigen_assert( ((Options & int(StandardCompressedFormat))==0) || (expr.isCompressed()) );
-      Base::construct(expr.derived());
-    }
-
-    template<int OtherOptions>
-    inline Ref(Map<SparseMatrix<MatScalar,OtherOptions,MatIndex> >& expr)
-    {
-      EIGEN_STATIC_ASSERT(bool(Traits::template match<SparseMatrix<MatScalar,OtherOptions,MatIndex> >::MatchAtCompileTime), STORAGE_LAYOUT_DOES_NOT_MATCH);
-      eigen_assert( ((Options & int(StandardCompressedFormat))==0) || (expr.isCompressed()) );
-      Base::construct(expr.derived());
-    }
-
-    template<typename Derived>
-    inline Ref(const SparseCompressedBase<Derived>& expr)
-    #else
-    /** Implicit constructor from any sparse expression (2D matrix or 1D vector) */
-    template<typename Derived>
-    inline Ref(SparseCompressedBase<Derived>& expr)
-    #endif
-    {
-      EIGEN_STATIC_ASSERT(bool(internal::is_lvalue<Derived>::value), THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY);
-      EIGEN_STATIC_ASSERT(bool(Traits::template match<Derived>::MatchAtCompileTime), STORAGE_LAYOUT_DOES_NOT_MATCH);
-      eigen_assert( ((Options & int(StandardCompressedFormat))==0) || (expr.isCompressed()) );
-      Base::construct(expr.const_cast_derived());
-    }
-};
-
-// this is the const ref version
-template<typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
-class Ref<const SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType>
-  : public internal::SparseRefBase<Ref<const SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> >
-{
-    typedef SparseMatrix<MatScalar,MatOptions,MatIndex> TPlainObjectType;
-    typedef internal::traits<Ref> Traits;
-  public:
-
-    typedef internal::SparseRefBase<Ref> Base;
-    EIGEN_SPARSE_PUBLIC_INTERFACE(Ref)
-
-    template<typename Derived>
-    inline Ref(const SparseMatrixBase<Derived>& expr) : m_hasCopy(false)
-    {
-      construct(expr.derived(), typename Traits::template match<Derived>::type());
-    }
-
-    inline Ref(const Ref& other) : Base(other), m_hasCopy(false) {
-      // copy constructor shall not copy the m_object, to avoid unnecessary malloc and copy
-    }
-
-    template<typename OtherRef>
-    inline Ref(const RefBase<OtherRef>& other) : m_hasCopy(false) {
-      construct(other.derived(), typename Traits::template match<OtherRef>::type());
-    }
-
-    ~Ref() {
-      if(m_hasCopy) {
-        internal::destroy_at(reinterpret_cast<TPlainObjectType*>(&m_storage));
-      }
-    }
-
-  protected:
-
-    template<typename Expression>
-    void construct(const Expression& expr,internal::true_type)
-    {
-      if((Options & int(StandardCompressedFormat)) && (!expr.isCompressed()))
-      {
-        TPlainObjectType* obj = internal::construct_at(reinterpret_cast<TPlainObjectType*>(&m_storage), expr);
-        m_hasCopy = true;
-        Base::construct(*obj);
-      }
-      else
-      {
-        Base::construct(expr);
-      }
-    }
-
-    template<typename Expression>
-    void construct(const Expression& expr, internal::false_type)
-    {
-      TPlainObjectType* obj = internal::construct_at(reinterpret_cast<TPlainObjectType*>(&m_storage), expr);
-      m_hasCopy = true;
-      Base::construct(*obj);
-    }
-
-  protected:
-    typename internal::aligned_storage<sizeof(TPlainObjectType), EIGEN_ALIGNOF(TPlainObjectType)>::type m_storage;
-    bool m_hasCopy;
-};
-
-
+}  // namespace internal
 
 /**
-  * \ingroup SparseCore_Module
-  *
-  * \brief A sparse vector expression referencing an existing sparse vector expression
-  *
-  * \tparam SparseVectorType the equivalent sparse vector type of the referenced data, it must be a template instance of class SparseVector.
-  *
-  * \sa class Ref
-  */
+ * \ingroup SparseCore_Module
+ *
+ * \brief A sparse matrix expression referencing an existing sparse expression
+ *
+ * \tparam SparseMatrixType the equivalent sparse matrix type of the referenced data, it must be a template instance of
+ * class SparseMatrix. \tparam Options specifies whether the a standard compressed format is required \c Options is  \c
+ * #StandardCompressedFormat, or \c 0. The default is \c 0.
+ *
+ * \sa class Ref
+ */
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-template<typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
-class Ref<SparseVector<MatScalar,MatOptions,MatIndex>, Options, StrideType >
-  : public internal::SparseRefBase<Ref<SparseVector<MatScalar,MatOptions,MatIndex>, Options, StrideType > >
+template <typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
+class Ref<SparseMatrix<MatScalar, MatOptions, MatIndex>, Options, StrideType>
+    : public internal::SparseRefBase<Ref<SparseMatrix<MatScalar, MatOptions, MatIndex>, Options, StrideType>>
 #else
-template<typename SparseVectorType>
-class Ref<SparseVectorType>
-  : public SparseMapBase<Derived,WriteAccessors>
+template <typename SparseMatrixType, int Options>
+class Ref<SparseMatrixType, Options>
+    : public SparseMapBase<Derived, WriteAccessors>  // yes, that's weird to use Derived here, but that works!
 #endif
 {
-    typedef SparseVector<MatScalar,MatOptions,MatIndex> PlainObjectType;
-    typedef internal::traits<Ref> Traits;
-    template<int OtherOptions>
-    inline Ref(const SparseVector<MatScalar,OtherOptions,MatIndex>& expr);
-  public:
+  typedef SparseMatrix<MatScalar, MatOptions, MatIndex> PlainObjectType;
+  typedef internal::traits<Ref> Traits;
+  template <int OtherOptions>
+  inline Ref(const SparseMatrix<MatScalar, OtherOptions, MatIndex>& expr);
+  template <int OtherOptions>
+  inline Ref(const Map<SparseMatrix<MatScalar, OtherOptions, MatIndex>>& expr);
 
-    typedef internal::SparseRefBase<Ref> Base;
-    EIGEN_SPARSE_PUBLIC_INTERFACE(Ref)
+ public:
+  typedef internal::SparseRefBase<Ref> Base;
+  EIGEN_SPARSE_PUBLIC_INTERFACE(Ref)
 
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    template<int OtherOptions>
-    inline Ref(SparseVector<MatScalar,OtherOptions,MatIndex>& expr)
-    {
-      EIGEN_STATIC_ASSERT(bool(Traits::template match<SparseVector<MatScalar,OtherOptions,MatIndex> >::MatchAtCompileTime), STORAGE_LAYOUT_DOES_NOT_MATCH);
-      Base::construct(expr.derived());
-    }
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  template <int OtherOptions>
+  inline Ref(SparseMatrix<MatScalar, OtherOptions, MatIndex>& expr) {
+    EIGEN_STATIC_ASSERT(
+        bool(Traits::template match<SparseMatrix<MatScalar, OtherOptions, MatIndex>>::MatchAtCompileTime),
+        STORAGE_LAYOUT_DOES_NOT_MATCH);
+    eigen_assert(((Options & int(StandardCompressedFormat)) == 0) || (expr.isCompressed()));
+    Base::construct(expr.derived());
+  }
 
-    template<typename Derived>
-    inline Ref(const SparseCompressedBase<Derived>& expr)
-    #else
-    /** Implicit constructor from any 1D sparse vector expression */
-    template<typename Derived>
-    inline Ref(SparseCompressedBase<Derived>& expr)
-    #endif
-    {
-      EIGEN_STATIC_ASSERT(bool(internal::is_lvalue<Derived>::value), THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY);
-      EIGEN_STATIC_ASSERT(bool(Traits::template match<Derived>::MatchAtCompileTime), STORAGE_LAYOUT_DOES_NOT_MATCH);
-      Base::construct(expr.const_cast_derived());
-    }
+  template <int OtherOptions>
+  inline Ref(Map<SparseMatrix<MatScalar, OtherOptions, MatIndex>>& expr) {
+    EIGEN_STATIC_ASSERT(
+        bool(Traits::template match<SparseMatrix<MatScalar, OtherOptions, MatIndex>>::MatchAtCompileTime),
+        STORAGE_LAYOUT_DOES_NOT_MATCH);
+    eigen_assert(((Options & int(StandardCompressedFormat)) == 0) || (expr.isCompressed()));
+    Base::construct(expr.derived());
+  }
+
+  template <typename Derived>
+  inline Ref(const SparseCompressedBase<Derived>& expr)
+#else
+  /** Implicit constructor from any sparse expression (2D matrix or 1D vector) */
+  template <typename Derived>
+  inline Ref(SparseCompressedBase<Derived>& expr)
+#endif
+  {
+    EIGEN_STATIC_ASSERT(bool(internal::is_lvalue<Derived>::value), THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY);
+    EIGEN_STATIC_ASSERT(bool(Traits::template match<Derived>::MatchAtCompileTime), STORAGE_LAYOUT_DOES_NOT_MATCH);
+    eigen_assert(((Options & int(StandardCompressedFormat)) == 0) || (expr.isCompressed()));
+    Base::construct(expr.const_cast_derived());
+  }
 };
 
 // this is the const ref version
-template<typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
-class Ref<const SparseVector<MatScalar,MatOptions,MatIndex>, Options, StrideType>
-  : public internal::SparseRefBase<Ref<const SparseVector<MatScalar,MatOptions,MatIndex>, Options, StrideType> >
-{
-    typedef SparseVector<MatScalar,MatOptions,MatIndex> TPlainObjectType;
-    typedef internal::traits<Ref> Traits;
-  public:
+template <typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
+class Ref<const SparseMatrix<MatScalar, MatOptions, MatIndex>, Options, StrideType>
+    : public internal::SparseRefBase<Ref<const SparseMatrix<MatScalar, MatOptions, MatIndex>, Options, StrideType>> {
+  typedef SparseMatrix<MatScalar, MatOptions, MatIndex> TPlainObjectType;
+  typedef internal::traits<Ref> Traits;
 
-    typedef internal::SparseRefBase<Ref> Base;
-    EIGEN_SPARSE_PUBLIC_INTERFACE(Ref)
+ public:
+  typedef internal::SparseRefBase<Ref> Base;
+  EIGEN_SPARSE_PUBLIC_INTERFACE(Ref)
 
-    template<typename Derived>
-    inline Ref(const SparseMatrixBase<Derived>& expr) : m_hasCopy(false)
-    {
-      construct(expr.derived(), typename Traits::template match<Derived>::type());
+  template <typename Derived>
+  inline Ref(const SparseMatrixBase<Derived>& expr) : m_hasCopy(false) {
+    construct(expr.derived(), typename Traits::template match<Derived>::type());
+  }
+
+  inline Ref(const Ref& other) : Base(other), m_hasCopy(false) {
+    // copy constructor shall not copy the m_object, to avoid unnecessary malloc and copy
+  }
+
+  template <typename OtherRef>
+  inline Ref(const RefBase<OtherRef>& other) : m_hasCopy(false) {
+    construct(other.derived(), typename Traits::template match<OtherRef>::type());
+  }
+
+  ~Ref() {
+    if (m_hasCopy) {
+      internal::destroy_at(reinterpret_cast<TPlainObjectType*>(&m_storage));
     }
+  }
 
-    inline Ref(const Ref& other) : Base(other), m_hasCopy(false) {
-      // copy constructor shall not copy the m_object, to avoid unnecessary malloc and copy
-    }
-
-    template<typename OtherRef>
-    inline Ref(const RefBase<OtherRef>& other) : m_hasCopy(false) {
-      construct(other.derived(), typename Traits::template match<OtherRef>::type());
-    }
-
-    ~Ref() {
-      if(m_hasCopy) {
-        internal::destroy_at(reinterpret_cast<TPlainObjectType*>(&m_storage));
-      }
-    }
-
-  protected:
-
-    template<typename Expression>
-    void construct(const Expression& expr,internal::true_type)
-    {
-      Base::construct(expr);
-    }
-
-    template<typename Expression>
-    void construct(const Expression& expr, internal::false_type)
-    {
+ protected:
+  template <typename Expression>
+  void construct(const Expression& expr, internal::true_type) {
+    if ((Options & int(StandardCompressedFormat)) && (!expr.isCompressed())) {
       TPlainObjectType* obj = internal::construct_at(reinterpret_cast<TPlainObjectType*>(&m_storage), expr);
       m_hasCopy = true;
       Base::construct(*obj);
+    } else {
+      Base::construct(expr);
     }
+  }
 
-  protected:
-    typename internal::aligned_storage<sizeof(TPlainObjectType), EIGEN_ALIGNOF(TPlainObjectType)>::type m_storage;
-    bool m_hasCopy;
+  template <typename Expression>
+  void construct(const Expression& expr, internal::false_type) {
+    TPlainObjectType* obj = internal::construct_at(reinterpret_cast<TPlainObjectType*>(&m_storage), expr);
+    m_hasCopy = true;
+    Base::construct(*obj);
+  }
+
+ protected:
+  typename internal::aligned_storage<sizeof(TPlainObjectType), EIGEN_ALIGNOF(TPlainObjectType)>::type m_storage;
+  bool m_hasCopy;
+};
+
+/**
+ * \ingroup SparseCore_Module
+ *
+ * \brief A sparse vector expression referencing an existing sparse vector expression
+ *
+ * \tparam SparseVectorType the equivalent sparse vector type of the referenced data, it must be a template instance of
+ * class SparseVector.
+ *
+ * \sa class Ref
+ */
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+template <typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
+class Ref<SparseVector<MatScalar, MatOptions, MatIndex>, Options, StrideType>
+    : public internal::SparseRefBase<Ref<SparseVector<MatScalar, MatOptions, MatIndex>, Options, StrideType>>
+#else
+template <typename SparseVectorType>
+class Ref<SparseVectorType> : public SparseMapBase<Derived, WriteAccessors>
+#endif
+{
+  typedef SparseVector<MatScalar, MatOptions, MatIndex> PlainObjectType;
+  typedef internal::traits<Ref> Traits;
+  template <int OtherOptions>
+  inline Ref(const SparseVector<MatScalar, OtherOptions, MatIndex>& expr);
+
+ public:
+  typedef internal::SparseRefBase<Ref> Base;
+  EIGEN_SPARSE_PUBLIC_INTERFACE(Ref)
+
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  template <int OtherOptions>
+  inline Ref(SparseVector<MatScalar, OtherOptions, MatIndex>& expr) {
+    EIGEN_STATIC_ASSERT(
+        bool(Traits::template match<SparseVector<MatScalar, OtherOptions, MatIndex>>::MatchAtCompileTime),
+        STORAGE_LAYOUT_DOES_NOT_MATCH);
+    Base::construct(expr.derived());
+  }
+
+  template <typename Derived>
+  inline Ref(const SparseCompressedBase<Derived>& expr)
+#else
+  /** Implicit constructor from any 1D sparse vector expression */
+  template <typename Derived>
+  inline Ref(SparseCompressedBase<Derived>& expr)
+#endif
+  {
+    EIGEN_STATIC_ASSERT(bool(internal::is_lvalue<Derived>::value), THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY);
+    EIGEN_STATIC_ASSERT(bool(Traits::template match<Derived>::MatchAtCompileTime), STORAGE_LAYOUT_DOES_NOT_MATCH);
+    Base::construct(expr.const_cast_derived());
+  }
+};
+
+// this is the const ref version
+template <typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
+class Ref<const SparseVector<MatScalar, MatOptions, MatIndex>, Options, StrideType>
+    : public internal::SparseRefBase<Ref<const SparseVector<MatScalar, MatOptions, MatIndex>, Options, StrideType>> {
+  typedef SparseVector<MatScalar, MatOptions, MatIndex> TPlainObjectType;
+  typedef internal::traits<Ref> Traits;
+
+ public:
+  typedef internal::SparseRefBase<Ref> Base;
+  EIGEN_SPARSE_PUBLIC_INTERFACE(Ref)
+
+  template <typename Derived>
+  inline Ref(const SparseMatrixBase<Derived>& expr) : m_hasCopy(false) {
+    construct(expr.derived(), typename Traits::template match<Derived>::type());
+  }
+
+  inline Ref(const Ref& other) : Base(other), m_hasCopy(false) {
+    // copy constructor shall not copy the m_object, to avoid unnecessary malloc and copy
+  }
+
+  template <typename OtherRef>
+  inline Ref(const RefBase<OtherRef>& other) : m_hasCopy(false) {
+    construct(other.derived(), typename Traits::template match<OtherRef>::type());
+  }
+
+  ~Ref() {
+    if (m_hasCopy) {
+      internal::destroy_at(reinterpret_cast<TPlainObjectType*>(&m_storage));
+    }
+  }
+
+ protected:
+  template <typename Expression>
+  void construct(const Expression& expr, internal::true_type) {
+    Base::construct(expr);
+  }
+
+  template <typename Expression>
+  void construct(const Expression& expr, internal::false_type) {
+    TPlainObjectType* obj = internal::construct_at(reinterpret_cast<TPlainObjectType*>(&m_storage), expr);
+    m_hasCopy = true;
+    Base::construct(*obj);
+  }
+
+ protected:
+  typename internal::aligned_storage<sizeof(TPlainObjectType), EIGEN_ALIGNOF(TPlainObjectType)>::type m_storage;
+  bool m_hasCopy;
 };
 
 namespace internal {
 
-// FIXME shall we introduce a general evaluatior_ref that we can specialize for any sparse object once, and thus remove this copy-pasta thing...
+// FIXME shall we introduce a general evaluatior_ref that we can specialize for any sparse object once, and thus remove
+// this copy-pasta thing...
 
-template<typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
-struct evaluator<Ref<SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> >
-  : evaluator<SparseCompressedBase<Ref<SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> > >
-{
-  typedef evaluator<SparseCompressedBase<Ref<SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> > > Base;
-  typedef Ref<SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> XprType;
+template <typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
+struct evaluator<Ref<SparseMatrix<MatScalar, MatOptions, MatIndex>, Options, StrideType>>
+    : evaluator<SparseCompressedBase<Ref<SparseMatrix<MatScalar, MatOptions, MatIndex>, Options, StrideType>>> {
+  typedef evaluator<SparseCompressedBase<Ref<SparseMatrix<MatScalar, MatOptions, MatIndex>, Options, StrideType>>> Base;
+  typedef Ref<SparseMatrix<MatScalar, MatOptions, MatIndex>, Options, StrideType> XprType;
   evaluator() : Base() {}
-  explicit evaluator(const XprType &mat) : Base(mat) {}
+  explicit evaluator(const XprType& mat) : Base(mat) {}
 };
 
-template<typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
-struct evaluator<Ref<const SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> >
-  : evaluator<SparseCompressedBase<Ref<const SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> > >
-{
-  typedef evaluator<SparseCompressedBase<Ref<const SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> > > Base;
-  typedef Ref<const SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType> XprType;
+template <typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
+struct evaluator<Ref<const SparseMatrix<MatScalar, MatOptions, MatIndex>, Options, StrideType>>
+    : evaluator<SparseCompressedBase<Ref<const SparseMatrix<MatScalar, MatOptions, MatIndex>, Options, StrideType>>> {
+  typedef evaluator<SparseCompressedBase<Ref<const SparseMatrix<MatScalar, MatOptions, MatIndex>, Options, StrideType>>>
+      Base;
+  typedef Ref<const SparseMatrix<MatScalar, MatOptions, MatIndex>, Options, StrideType> XprType;
   evaluator() : Base() {}
-  explicit evaluator(const XprType &mat) : Base(mat) {}
+  explicit evaluator(const XprType& mat) : Base(mat) {}
 };
 
-template<typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
-struct evaluator<Ref<SparseVector<MatScalar,MatOptions,MatIndex>, Options, StrideType> >
-  : evaluator<SparseCompressedBase<Ref<SparseVector<MatScalar,MatOptions,MatIndex>, Options, StrideType> > >
-{
-  typedef evaluator<SparseCompressedBase<Ref<SparseVector<MatScalar,MatOptions,MatIndex>, Options, StrideType> > > Base;
-  typedef Ref<SparseVector<MatScalar,MatOptions,MatIndex>, Options, StrideType> XprType;
+template <typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
+struct evaluator<Ref<SparseVector<MatScalar, MatOptions, MatIndex>, Options, StrideType>>
+    : evaluator<SparseCompressedBase<Ref<SparseVector<MatScalar, MatOptions, MatIndex>, Options, StrideType>>> {
+  typedef evaluator<SparseCompressedBase<Ref<SparseVector<MatScalar, MatOptions, MatIndex>, Options, StrideType>>> Base;
+  typedef Ref<SparseVector<MatScalar, MatOptions, MatIndex>, Options, StrideType> XprType;
   evaluator() : Base() {}
-  explicit evaluator(const XprType &mat) : Base(mat) {}
+  explicit evaluator(const XprType& mat) : Base(mat) {}
 };
 
-template<typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
-struct evaluator<Ref<const SparseVector<MatScalar,MatOptions,MatIndex>, Options, StrideType> >
-  : evaluator<SparseCompressedBase<Ref<const SparseVector<MatScalar,MatOptions,MatIndex>, Options, StrideType> > >
-{
-  typedef evaluator<SparseCompressedBase<Ref<const SparseVector<MatScalar,MatOptions,MatIndex>, Options, StrideType> > > Base;
-  typedef Ref<const SparseVector<MatScalar,MatOptions,MatIndex>, Options, StrideType> XprType;
+template <typename MatScalar, int MatOptions, typename MatIndex, int Options, typename StrideType>
+struct evaluator<Ref<const SparseVector<MatScalar, MatOptions, MatIndex>, Options, StrideType>>
+    : evaluator<SparseCompressedBase<Ref<const SparseVector<MatScalar, MatOptions, MatIndex>, Options, StrideType>>> {
+  typedef evaluator<SparseCompressedBase<Ref<const SparseVector<MatScalar, MatOptions, MatIndex>, Options, StrideType>>>
+      Base;
+  typedef Ref<const SparseVector<MatScalar, MatOptions, MatIndex>, Options, StrideType> XprType;
   evaluator() : Base() {}
-  explicit evaluator(const XprType &mat) : Base(mat) {}
+  explicit evaluator(const XprType& mat) : Base(mat) {}
 };
 
-}
+}  // namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SPARSE_REF_H
+#endif  // EIGEN_SPARSE_REF_H
diff --git a/Eigen/src/SparseCore/SparseSelfAdjointView.h b/Eigen/src/SparseCore/SparseSelfAdjointView.h
index d775a3f..129899c 100644
--- a/Eigen/src/SparseCore/SparseSelfAdjointView.h
+++ b/Eigen/src/SparseCore/SparseSelfAdjointView.h
@@ -13,194 +13,189 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
-  
+namespace Eigen {
+
 /** \ingroup SparseCore_Module
-  * \class SparseSelfAdjointView
-  *
-  * \brief Pseudo expression to manipulate a triangular sparse matrix as a selfadjoint matrix.
-  *
-  * \param MatrixType the type of the dense matrix storing the coefficients
-  * \param Mode can be either \c #Lower or \c #Upper
-  *
-  * This class is an expression of a sefladjoint matrix from a triangular part of a matrix
-  * with given dense storage of the coefficients. It is the return type of MatrixBase::selfadjointView()
-  * and most of the time this is the only way that it is used.
-  *
-  * \sa SparseMatrixBase::selfadjointView()
-  */
+ * \class SparseSelfAdjointView
+ *
+ * \brief Pseudo expression to manipulate a triangular sparse matrix as a selfadjoint matrix.
+ *
+ * \param MatrixType the type of the dense matrix storing the coefficients
+ * \param Mode can be either \c #Lower or \c #Upper
+ *
+ * This class is an expression of a sefladjoint matrix from a triangular part of a matrix
+ * with given dense storage of the coefficients. It is the return type of MatrixBase::selfadjointView()
+ * and most of the time this is the only way that it is used.
+ *
+ * \sa SparseMatrixBase::selfadjointView()
+ */
 namespace internal {
-  
-template<typename MatrixType, unsigned int Mode>
-struct traits<SparseSelfAdjointView<MatrixType,Mode> > : traits<MatrixType> {
-};
 
-template<int SrcMode,int DstMode,typename MatrixType,int DestOrder>
-void permute_symm_to_symm(const MatrixType& mat, SparseMatrix<typename MatrixType::Scalar,DestOrder,typename MatrixType::StorageIndex>& _dest, const typename MatrixType::StorageIndex* perm = 0);
+template <typename MatrixType, unsigned int Mode>
+struct traits<SparseSelfAdjointView<MatrixType, Mode> > : traits<MatrixType> {};
 
-template<int Mode,typename MatrixType,int DestOrder>
-void permute_symm_to_fullsymm(const MatrixType& mat, SparseMatrix<typename MatrixType::Scalar,DestOrder,typename MatrixType::StorageIndex>& _dest, const typename MatrixType::StorageIndex* perm = 0);
+template <int SrcMode, int DstMode, typename MatrixType, int DestOrder>
+void permute_symm_to_symm(
+    const MatrixType& mat,
+    SparseMatrix<typename MatrixType::Scalar, DestOrder, typename MatrixType::StorageIndex>& _dest,
+    const typename MatrixType::StorageIndex* perm = 0);
 
-}
+template <int Mode, typename MatrixType, int DestOrder>
+void permute_symm_to_fullsymm(
+    const MatrixType& mat,
+    SparseMatrix<typename MatrixType::Scalar, DestOrder, typename MatrixType::StorageIndex>& _dest,
+    const typename MatrixType::StorageIndex* perm = 0);
 
-template<typename MatrixType, unsigned int Mode_> class SparseSelfAdjointView
-  : public EigenBase<SparseSelfAdjointView<MatrixType,Mode_> >
-{
-  public:
-    
-    enum {
-      Mode = Mode_,
-      TransposeMode = ((Mode & Upper) ? Lower : 0) | ((Mode & Lower) ? Upper : 0),
-      RowsAtCompileTime = internal::traits<SparseSelfAdjointView>::RowsAtCompileTime,
-      ColsAtCompileTime = internal::traits<SparseSelfAdjointView>::ColsAtCompileTime
-    };
+}  // namespace internal
 
-    typedef EigenBase<SparseSelfAdjointView> Base;
-    typedef typename MatrixType::Scalar Scalar;
-    typedef typename MatrixType::StorageIndex StorageIndex;
-    typedef Matrix<StorageIndex,Dynamic,1> VectorI;
-    typedef typename internal::ref_selector<MatrixType>::non_const_type MatrixTypeNested;
-    typedef internal::remove_all_t<MatrixTypeNested> MatrixTypeNested_;
-    
-    explicit inline SparseSelfAdjointView(MatrixType& matrix) : m_matrix(matrix)
-    {
-      eigen_assert(rows()==cols() && "SelfAdjointView is only for squared matrices");
-    }
+template <typename MatrixType, unsigned int Mode_>
+class SparseSelfAdjointView : public EigenBase<SparseSelfAdjointView<MatrixType, Mode_> > {
+ public:
+  enum {
+    Mode = Mode_,
+    TransposeMode = ((Mode & Upper) ? Lower : 0) | ((Mode & Lower) ? Upper : 0),
+    RowsAtCompileTime = internal::traits<SparseSelfAdjointView>::RowsAtCompileTime,
+    ColsAtCompileTime = internal::traits<SparseSelfAdjointView>::ColsAtCompileTime
+  };
 
-    inline Index rows() const { return m_matrix.rows(); }
-    inline Index cols() const { return m_matrix.cols(); }
+  typedef EigenBase<SparseSelfAdjointView> Base;
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::StorageIndex StorageIndex;
+  typedef Matrix<StorageIndex, Dynamic, 1> VectorI;
+  typedef typename internal::ref_selector<MatrixType>::non_const_type MatrixTypeNested;
+  typedef internal::remove_all_t<MatrixTypeNested> MatrixTypeNested_;
 
-    /** \internal \returns a reference to the nested matrix */
-    const MatrixTypeNested_& matrix() const { return m_matrix; }
-    std::remove_reference_t<MatrixTypeNested>& matrix() { return m_matrix; }
+  explicit inline SparseSelfAdjointView(MatrixType& matrix) : m_matrix(matrix) {
+    eigen_assert(rows() == cols() && "SelfAdjointView is only for squared matrices");
+  }
 
-    /** \returns an expression of the matrix product between a sparse self-adjoint matrix \c *this and a sparse matrix \a rhs.
-      *
-      * Note that there is no algorithmic advantage of performing such a product compared to a general sparse-sparse matrix product.
-      * Indeed, the SparseSelfadjointView operand is first copied into a temporary SparseMatrix before computing the product.
-      */
-    template<typename OtherDerived>
-    Product<SparseSelfAdjointView, OtherDerived>
-    operator*(const SparseMatrixBase<OtherDerived>& rhs) const
-    {
-      return Product<SparseSelfAdjointView, OtherDerived>(*this, rhs.derived());
-    }
+  inline Index rows() const { return m_matrix.rows(); }
+  inline Index cols() const { return m_matrix.cols(); }
 
-    /** \returns an expression of the matrix product between a sparse matrix \a lhs and a sparse self-adjoint matrix \a rhs.
-      *
-      * Note that there is no algorithmic advantage of performing such a product compared to a general sparse-sparse matrix product.
-      * Indeed, the SparseSelfadjointView operand is first copied into a temporary SparseMatrix before computing the product.
-      */
-    template<typename OtherDerived> friend
-    Product<OtherDerived, SparseSelfAdjointView>
-    operator*(const SparseMatrixBase<OtherDerived>& lhs, const SparseSelfAdjointView& rhs)
-    {
-      return Product<OtherDerived, SparseSelfAdjointView>(lhs.derived(), rhs);
-    }
-    
-    /** Efficient sparse self-adjoint matrix times dense vector/matrix product */
-    template<typename OtherDerived>
-    Product<SparseSelfAdjointView,OtherDerived>
-    operator*(const MatrixBase<OtherDerived>& rhs) const
-    {
-      return Product<SparseSelfAdjointView,OtherDerived>(*this, rhs.derived());
-    }
+  /** \internal \returns a reference to the nested matrix */
+  const MatrixTypeNested_& matrix() const { return m_matrix; }
+  std::remove_reference_t<MatrixTypeNested>& matrix() { return m_matrix; }
 
-    /** Efficient dense vector/matrix times sparse self-adjoint matrix product */
-    template<typename OtherDerived> friend
-    Product<OtherDerived,SparseSelfAdjointView>
-    operator*(const MatrixBase<OtherDerived>& lhs, const SparseSelfAdjointView& rhs)
-    {
-      return Product<OtherDerived,SparseSelfAdjointView>(lhs.derived(), rhs);
-    }
+  /** \returns an expression of the matrix product between a sparse self-adjoint matrix \c *this and a sparse matrix \a
+   * rhs.
+   *
+   * Note that there is no algorithmic advantage of performing such a product compared to a general sparse-sparse matrix
+   * product. Indeed, the SparseSelfadjointView operand is first copied into a temporary SparseMatrix before computing
+   * the product.
+   */
+  template <typename OtherDerived>
+  Product<SparseSelfAdjointView, OtherDerived> operator*(const SparseMatrixBase<OtherDerived>& rhs) const {
+    return Product<SparseSelfAdjointView, OtherDerived>(*this, rhs.derived());
+  }
 
-    /** Perform a symmetric rank K update of the selfadjoint matrix \c *this:
-      * \f$ this = this + \alpha ( u u^* ) \f$ where \a u is a vector or matrix.
-      *
-      * \returns a reference to \c *this
-      *
-      * To perform \f$ this = this + \alpha ( u^* u ) \f$ you can simply
-      * call this function with u.adjoint().
-      */
-    template<typename DerivedU>
-    SparseSelfAdjointView& rankUpdate(const SparseMatrixBase<DerivedU>& u, const Scalar& alpha = Scalar(1));
-    
-    /** \returns an expression of P H P^-1 */
-    // TODO implement twists in a more evaluator friendly fashion
-    SparseSymmetricPermutationProduct<MatrixTypeNested_,Mode> twistedBy(const PermutationMatrix<Dynamic,Dynamic,StorageIndex>& perm) const
-    {
-      return SparseSymmetricPermutationProduct<MatrixTypeNested_,Mode>(m_matrix, perm);
-    }
+  /** \returns an expression of the matrix product between a sparse matrix \a lhs and a sparse self-adjoint matrix \a
+   * rhs.
+   *
+   * Note that there is no algorithmic advantage of performing such a product compared to a general sparse-sparse matrix
+   * product. Indeed, the SparseSelfadjointView operand is first copied into a temporary SparseMatrix before computing
+   * the product.
+   */
+  template <typename OtherDerived>
+  friend Product<OtherDerived, SparseSelfAdjointView> operator*(const SparseMatrixBase<OtherDerived>& lhs,
+                                                                const SparseSelfAdjointView& rhs) {
+    return Product<OtherDerived, SparseSelfAdjointView>(lhs.derived(), rhs);
+  }
 
-    template<typename SrcMatrixType,int SrcMode>
-    SparseSelfAdjointView& operator=(const SparseSymmetricPermutationProduct<SrcMatrixType,SrcMode>& permutedMatrix)
-    {
-      internal::call_assignment_no_alias_no_transpose(*this, permutedMatrix);
-      return *this;
-    }
+  /** Efficient sparse self-adjoint matrix times dense vector/matrix product */
+  template <typename OtherDerived>
+  Product<SparseSelfAdjointView, OtherDerived> operator*(const MatrixBase<OtherDerived>& rhs) const {
+    return Product<SparseSelfAdjointView, OtherDerived>(*this, rhs.derived());
+  }
 
-    SparseSelfAdjointView& operator=(const SparseSelfAdjointView& src)
-    {
-      PermutationMatrix<Dynamic,Dynamic,StorageIndex> pnull;
-      return *this = src.twistedBy(pnull);
-    }
+  /** Efficient dense vector/matrix times sparse self-adjoint matrix product */
+  template <typename OtherDerived>
+  friend Product<OtherDerived, SparseSelfAdjointView> operator*(const MatrixBase<OtherDerived>& lhs,
+                                                                const SparseSelfAdjointView& rhs) {
+    return Product<OtherDerived, SparseSelfAdjointView>(lhs.derived(), rhs);
+  }
 
-    // Since we override the copy-assignment operator, we need to explicitly re-declare the copy-constructor
-    EIGEN_DEFAULT_COPY_CONSTRUCTOR(SparseSelfAdjointView)
+  /** Perform a symmetric rank K update of the selfadjoint matrix \c *this:
+   * \f$ this = this + \alpha ( u u^* ) \f$ where \a u is a vector or matrix.
+   *
+   * \returns a reference to \c *this
+   *
+   * To perform \f$ this = this + \alpha ( u^* u ) \f$ you can simply
+   * call this function with u.adjoint().
+   */
+  template <typename DerivedU>
+  SparseSelfAdjointView& rankUpdate(const SparseMatrixBase<DerivedU>& u, const Scalar& alpha = Scalar(1));
 
-    template<typename SrcMatrixType,unsigned int SrcMode>
-    SparseSelfAdjointView& operator=(const SparseSelfAdjointView<SrcMatrixType,SrcMode>& src)
-    {
-      PermutationMatrix<Dynamic,Dynamic,StorageIndex> pnull;
-      return *this = src.twistedBy(pnull);
-    }
-    
-    void resize(Index rows, Index cols)
-    {
-      EIGEN_ONLY_USED_FOR_DEBUG(rows);
-      EIGEN_ONLY_USED_FOR_DEBUG(cols);
-      eigen_assert(rows == this->rows() && cols == this->cols()
-                && "SparseSelfadjointView::resize() does not actually allow to resize.");
-    }
-    
-  protected:
+  /** \returns an expression of P H P^-1 */
+  // TODO implement twists in a more evaluator friendly fashion
+  SparseSymmetricPermutationProduct<MatrixTypeNested_, Mode> twistedBy(
+      const PermutationMatrix<Dynamic, Dynamic, StorageIndex>& perm) const {
+    return SparseSymmetricPermutationProduct<MatrixTypeNested_, Mode>(m_matrix, perm);
+  }
 
-    MatrixTypeNested m_matrix;
-    //mutable VectorI m_countPerRow;
-    //mutable VectorI m_countPerCol;
-  private:
-    template<typename Dest> void evalTo(Dest &) const;
+  template <typename SrcMatrixType, int SrcMode>
+  SparseSelfAdjointView& operator=(const SparseSymmetricPermutationProduct<SrcMatrixType, SrcMode>& permutedMatrix) {
+    internal::call_assignment_no_alias_no_transpose(*this, permutedMatrix);
+    return *this;
+  }
+
+  SparseSelfAdjointView& operator=(const SparseSelfAdjointView& src) {
+    PermutationMatrix<Dynamic, Dynamic, StorageIndex> pnull;
+    return *this = src.twistedBy(pnull);
+  }
+
+  // Since we override the copy-assignment operator, we need to explicitly re-declare the copy-constructor
+  EIGEN_DEFAULT_COPY_CONSTRUCTOR(SparseSelfAdjointView)
+
+  template <typename SrcMatrixType, unsigned int SrcMode>
+  SparseSelfAdjointView& operator=(const SparseSelfAdjointView<SrcMatrixType, SrcMode>& src) {
+    PermutationMatrix<Dynamic, Dynamic, StorageIndex> pnull;
+    return *this = src.twistedBy(pnull);
+  }
+
+  void resize(Index rows, Index cols) {
+    EIGEN_ONLY_USED_FOR_DEBUG(rows);
+    EIGEN_ONLY_USED_FOR_DEBUG(cols);
+    eigen_assert(rows == this->rows() && cols == this->cols() &&
+                 "SparseSelfadjointView::resize() does not actually allow to resize.");
+  }
+
+ protected:
+  MatrixTypeNested m_matrix;
+  // mutable VectorI m_countPerRow;
+  // mutable VectorI m_countPerCol;
+ private:
+  template <typename Dest>
+  void evalTo(Dest&) const;
 };
 
 /***************************************************************************
-* Implementation of SparseMatrixBase methods
-***************************************************************************/
+ * Implementation of SparseMatrixBase methods
+ ***************************************************************************/
 
-template<typename Derived>
-template<unsigned int UpLo>
-typename SparseMatrixBase<Derived>::template ConstSelfAdjointViewReturnType<UpLo>::Type SparseMatrixBase<Derived>::selfadjointView() const
-{
+template <typename Derived>
+template <unsigned int UpLo>
+typename SparseMatrixBase<Derived>::template ConstSelfAdjointViewReturnType<UpLo>::Type
+SparseMatrixBase<Derived>::selfadjointView() const {
   return SparseSelfAdjointView<const Derived, UpLo>(derived());
 }
 
-template<typename Derived>
-template<unsigned int UpLo>
-typename SparseMatrixBase<Derived>::template SelfAdjointViewReturnType<UpLo>::Type SparseMatrixBase<Derived>::selfadjointView()
-{
+template <typename Derived>
+template <unsigned int UpLo>
+typename SparseMatrixBase<Derived>::template SelfAdjointViewReturnType<UpLo>::Type
+SparseMatrixBase<Derived>::selfadjointView() {
   return SparseSelfAdjointView<Derived, UpLo>(derived());
 }
 
 /***************************************************************************
-* Implementation of SparseSelfAdjointView methods
-***************************************************************************/
+ * Implementation of SparseSelfAdjointView methods
+ ***************************************************************************/
 
-template<typename MatrixType, unsigned int Mode>
-template<typename DerivedU>
-SparseSelfAdjointView<MatrixType,Mode>&
-SparseSelfAdjointView<MatrixType,Mode>::rankUpdate(const SparseMatrixBase<DerivedU>& u, const Scalar& alpha)
-{
-  SparseMatrix<Scalar,(MatrixType::Flags&RowMajorBit)?RowMajor:ColMajor> tmp = u * u.adjoint();
-  if(alpha==Scalar(0))
+template <typename MatrixType, unsigned int Mode>
+template <typename DerivedU>
+SparseSelfAdjointView<MatrixType, Mode>& SparseSelfAdjointView<MatrixType, Mode>::rankUpdate(
+    const SparseMatrixBase<DerivedU>& u, const Scalar& alpha) {
+  SparseMatrix<Scalar, (MatrixType::Flags & RowMajorBit) ? RowMajor : ColMajor> tmp = u * u.adjoint();
+  if (alpha == Scalar(0))
     m_matrix = tmp.template triangularView<Mode>();
   else
     m_matrix += alpha * tmp.template triangularView<Mode>();
@@ -209,296 +204,273 @@
 }
 
 namespace internal {
-  
+
 // TODO currently a selfadjoint expression has the form SelfAdjointView<.,.>
 //      in the future selfadjoint-ness should be defined by the expression traits
-//      such that Transpose<SelfAdjointView<.,.> > is valid. (currently TriangularBase::transpose() is overloaded to make it work)
-template<typename MatrixType, unsigned int Mode>
-struct evaluator_traits<SparseSelfAdjointView<MatrixType,Mode> >
-{
+//      such that Transpose<SelfAdjointView<.,.> > is valid. (currently TriangularBase::transpose() is overloaded to
+//      make it work)
+template <typename MatrixType, unsigned int Mode>
+struct evaluator_traits<SparseSelfAdjointView<MatrixType, Mode> > {
   typedef typename storage_kind_to_evaluator_kind<typename MatrixType::StorageKind>::Kind Kind;
   typedef SparseSelfAdjointShape Shape;
 };
 
 struct SparseSelfAdjoint2Sparse {};
 
-template<> struct AssignmentKind<SparseShape,SparseSelfAdjointShape> { typedef SparseSelfAdjoint2Sparse Kind; };
-template<> struct AssignmentKind<SparseSelfAdjointShape,SparseShape> { typedef Sparse2Sparse Kind; };
+template <>
+struct AssignmentKind<SparseShape, SparseSelfAdjointShape> {
+  typedef SparseSelfAdjoint2Sparse Kind;
+};
+template <>
+struct AssignmentKind<SparseSelfAdjointShape, SparseShape> {
+  typedef Sparse2Sparse Kind;
+};
 
-template< typename DstXprType, typename SrcXprType, typename Functor>
-struct Assignment<DstXprType, SrcXprType, Functor, SparseSelfAdjoint2Sparse>
-{
+template <typename DstXprType, typename SrcXprType, typename Functor>
+struct Assignment<DstXprType, SrcXprType, Functor, SparseSelfAdjoint2Sparse> {
   typedef typename DstXprType::StorageIndex StorageIndex;
-  typedef internal::assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> AssignOpType;
+  typedef internal::assign_op<typename DstXprType::Scalar, typename SrcXprType::Scalar> AssignOpType;
 
-  template<typename DestScalar,int StorageOrder>
-  static void run(SparseMatrix<DestScalar,StorageOrder,StorageIndex> &dst, const SrcXprType &src, const AssignOpType&/*func*/)
-  {
+  template <typename DestScalar, int StorageOrder>
+  static void run(SparseMatrix<DestScalar, StorageOrder, StorageIndex>& dst, const SrcXprType& src,
+                  const AssignOpType& /*func*/) {
     internal::permute_symm_to_fullsymm<SrcXprType::Mode>(src.matrix(), dst);
   }
 
-  // FIXME: the handling of += and -= in sparse matrices should be cleanup so that next two overloads could be reduced to:
-  template<typename DestScalar,int StorageOrder,typename AssignFunc>
-  static void run(SparseMatrix<DestScalar,StorageOrder,StorageIndex> &dst, const SrcXprType &src, const AssignFunc& func)
-  {
-    SparseMatrix<DestScalar,StorageOrder,StorageIndex> tmp(src.rows(),src.cols());
+  // FIXME: the handling of += and -= in sparse matrices should be cleanup so that next two overloads could be reduced
+  // to:
+  template <typename DestScalar, int StorageOrder, typename AssignFunc>
+  static void run(SparseMatrix<DestScalar, StorageOrder, StorageIndex>& dst, const SrcXprType& src,
+                  const AssignFunc& func) {
+    SparseMatrix<DestScalar, StorageOrder, StorageIndex> tmp(src.rows(), src.cols());
     run(tmp, src, AssignOpType());
     call_assignment_no_alias_no_transpose(dst, tmp, func);
   }
 
-  template<typename DestScalar,int StorageOrder>
-  static void run(SparseMatrix<DestScalar,StorageOrder,StorageIndex> &dst, const SrcXprType &src,
-                  const internal::add_assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar>& /* func */)
-  {
-    SparseMatrix<DestScalar,StorageOrder,StorageIndex> tmp(src.rows(),src.cols());
+  template <typename DestScalar, int StorageOrder>
+  static void run(SparseMatrix<DestScalar, StorageOrder, StorageIndex>& dst, const SrcXprType& src,
+                  const internal::add_assign_op<typename DstXprType::Scalar, typename SrcXprType::Scalar>& /* func */) {
+    SparseMatrix<DestScalar, StorageOrder, StorageIndex> tmp(src.rows(), src.cols());
     run(tmp, src, AssignOpType());
     dst += tmp;
   }
 
-  template<typename DestScalar,int StorageOrder>
-  static void run(SparseMatrix<DestScalar,StorageOrder,StorageIndex> &dst, const SrcXprType &src,
-                  const internal::sub_assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar>& /* func */)
-  {
-    SparseMatrix<DestScalar,StorageOrder,StorageIndex> tmp(src.rows(),src.cols());
+  template <typename DestScalar, int StorageOrder>
+  static void run(SparseMatrix<DestScalar, StorageOrder, StorageIndex>& dst, const SrcXprType& src,
+                  const internal::sub_assign_op<typename DstXprType::Scalar, typename SrcXprType::Scalar>& /* func */) {
+    SparseMatrix<DestScalar, StorageOrder, StorageIndex> tmp(src.rows(), src.cols());
     run(tmp, src, AssignOpType());
     dst -= tmp;
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /***************************************************************************
-* Implementation of sparse self-adjoint time dense matrix
-***************************************************************************/
+ * Implementation of sparse self-adjoint time dense matrix
+ ***************************************************************************/
 
 namespace internal {
 
-template<int Mode, typename SparseLhsType, typename DenseRhsType, typename DenseResType, typename AlphaType>
-inline void sparse_selfadjoint_time_dense_product(const SparseLhsType& lhs, const DenseRhsType& rhs, DenseResType& res, const AlphaType& alpha)
-{
+template <int Mode, typename SparseLhsType, typename DenseRhsType, typename DenseResType, typename AlphaType>
+inline void sparse_selfadjoint_time_dense_product(const SparseLhsType& lhs, const DenseRhsType& rhs, DenseResType& res,
+                                                  const AlphaType& alpha) {
   EIGEN_ONLY_USED_FOR_DEBUG(alpha);
-  
-  typedef typename internal::nested_eval<SparseLhsType,DenseRhsType::MaxColsAtCompileTime>::type SparseLhsTypeNested;
+
+  typedef typename internal::nested_eval<SparseLhsType, DenseRhsType::MaxColsAtCompileTime>::type SparseLhsTypeNested;
   typedef internal::remove_all_t<SparseLhsTypeNested> SparseLhsTypeNestedCleaned;
   typedef evaluator<SparseLhsTypeNestedCleaned> LhsEval;
   typedef typename LhsEval::InnerIterator LhsIterator;
   typedef typename SparseLhsType::Scalar LhsScalar;
-  
+
   enum {
-    LhsIsRowMajor = (LhsEval::Flags&RowMajorBit)==RowMajorBit,
-    ProcessFirstHalf =
-              ((Mode&(Upper|Lower))==(Upper|Lower))
-          || ( (Mode&Upper) && !LhsIsRowMajor)
-          || ( (Mode&Lower) && LhsIsRowMajor),
+    LhsIsRowMajor = (LhsEval::Flags & RowMajorBit) == RowMajorBit,
+    ProcessFirstHalf = ((Mode & (Upper | Lower)) == (Upper | Lower)) || ((Mode & Upper) && !LhsIsRowMajor) ||
+                       ((Mode & Lower) && LhsIsRowMajor),
     ProcessSecondHalf = !ProcessFirstHalf
   };
-  
+
   SparseLhsTypeNested lhs_nested(lhs);
   LhsEval lhsEval(lhs_nested);
 
   // work on one column at once
-  for (Index k=0; k<rhs.cols(); ++k)
-  {
-    for (Index j=0; j<lhs.outerSize(); ++j)
-    {
-      LhsIterator i(lhsEval,j);
+  for (Index k = 0; k < rhs.cols(); ++k) {
+    for (Index j = 0; j < lhs.outerSize(); ++j) {
+      LhsIterator i(lhsEval, j);
       // handle diagonal coeff
-      if (ProcessSecondHalf)
-      {
-        while (i && i.index()<j) ++i;
-        if(i && i.index()==j)
-        {
-          res.coeffRef(j,k) += alpha * i.value() * rhs.coeff(j,k);
+      if (ProcessSecondHalf) {
+        while (i && i.index() < j) ++i;
+        if (i && i.index() == j) {
+          res.coeffRef(j, k) += alpha * i.value() * rhs.coeff(j, k);
           ++i;
         }
       }
 
       // premultiplied rhs for scatters
-      typename ScalarBinaryOpTraits<AlphaType, typename DenseRhsType::Scalar>::ReturnType rhs_j(alpha*rhs(j,k));
+      typename ScalarBinaryOpTraits<AlphaType, typename DenseRhsType::Scalar>::ReturnType rhs_j(alpha * rhs(j, k));
       // accumulator for partial scalar product
       typename DenseResType::Scalar res_j(0);
-      for(; (ProcessFirstHalf ? i && i.index() < j : i) ; ++i)
-      {
+      for (; (ProcessFirstHalf ? i && i.index() < j : i); ++i) {
         LhsScalar lhs_ij = i.value();
-        if(!LhsIsRowMajor) lhs_ij = numext::conj(lhs_ij);
-        res_j += lhs_ij * rhs.coeff(i.index(),k);
-        res(i.index(),k) += numext::conj(lhs_ij) * rhs_j;
+        if (!LhsIsRowMajor) lhs_ij = numext::conj(lhs_ij);
+        res_j += lhs_ij * rhs.coeff(i.index(), k);
+        res(i.index(), k) += numext::conj(lhs_ij) * rhs_j;
       }
-      res.coeffRef(j,k) += alpha * res_j;
+      res.coeffRef(j, k) += alpha * res_j;
 
       // handle diagonal coeff
-      if (ProcessFirstHalf && i && (i.index()==j))
-        res.coeffRef(j,k) += alpha * i.value() * rhs.coeff(j,k);
+      if (ProcessFirstHalf && i && (i.index() == j)) res.coeffRef(j, k) += alpha * i.value() * rhs.coeff(j, k);
     }
   }
 }
 
-
-template<typename LhsView, typename Rhs, int ProductType>
+template <typename LhsView, typename Rhs, int ProductType>
 struct generic_product_impl<LhsView, Rhs, SparseSelfAdjointShape, DenseShape, ProductType>
-: generic_product_impl_base<LhsView, Rhs, generic_product_impl<LhsView, Rhs, SparseSelfAdjointShape, DenseShape, ProductType> >
-{
-  template<typename Dest>
-  static void scaleAndAddTo(Dest& dst, const LhsView& lhsView, const Rhs& rhs, const typename Dest::Scalar& alpha)
-  {
+    : generic_product_impl_base<LhsView, Rhs,
+                                generic_product_impl<LhsView, Rhs, SparseSelfAdjointShape, DenseShape, ProductType> > {
+  template <typename Dest>
+  static void scaleAndAddTo(Dest& dst, const LhsView& lhsView, const Rhs& rhs, const typename Dest::Scalar& alpha) {
     typedef typename LhsView::MatrixTypeNested_ Lhs;
-    typedef typename nested_eval<Lhs,Dynamic>::type LhsNested;
-    typedef typename nested_eval<Rhs,Dynamic>::type RhsNested;
+    typedef typename nested_eval<Lhs, Dynamic>::type LhsNested;
+    typedef typename nested_eval<Rhs, Dynamic>::type RhsNested;
     LhsNested lhsNested(lhsView.matrix());
     RhsNested rhsNested(rhs);
-    
+
     internal::sparse_selfadjoint_time_dense_product<LhsView::Mode>(lhsNested, rhsNested, dst, alpha);
   }
 };
 
-template<typename Lhs, typename RhsView, int ProductType>
+template <typename Lhs, typename RhsView, int ProductType>
 struct generic_product_impl<Lhs, RhsView, DenseShape, SparseSelfAdjointShape, ProductType>
-: generic_product_impl_base<Lhs, RhsView, generic_product_impl<Lhs, RhsView, DenseShape, SparseSelfAdjointShape, ProductType> >
-{
-  template<typename Dest>
-  static void scaleAndAddTo(Dest& dst, const Lhs& lhs, const RhsView& rhsView, const typename Dest::Scalar& alpha)
-  {
+    : generic_product_impl_base<Lhs, RhsView,
+                                generic_product_impl<Lhs, RhsView, DenseShape, SparseSelfAdjointShape, ProductType> > {
+  template <typename Dest>
+  static void scaleAndAddTo(Dest& dst, const Lhs& lhs, const RhsView& rhsView, const typename Dest::Scalar& alpha) {
     typedef typename RhsView::MatrixTypeNested_ Rhs;
-    typedef typename nested_eval<Lhs,Dynamic>::type LhsNested;
-    typedef typename nested_eval<Rhs,Dynamic>::type RhsNested;
+    typedef typename nested_eval<Lhs, Dynamic>::type LhsNested;
+    typedef typename nested_eval<Rhs, Dynamic>::type RhsNested;
     LhsNested lhsNested(lhs);
     RhsNested rhsNested(rhsView.matrix());
-    
+
     // transpose everything
     Transpose<Dest> dstT(dst);
-    internal::sparse_selfadjoint_time_dense_product<RhsView::TransposeMode>(rhsNested.transpose(), lhsNested.transpose(), dstT, alpha);
+    internal::sparse_selfadjoint_time_dense_product<RhsView::TransposeMode>(rhsNested.transpose(),
+                                                                            lhsNested.transpose(), dstT, alpha);
   }
 };
 
 // NOTE: these two overloads are needed to evaluate the sparse selfadjoint view into a full sparse matrix
 // TODO: maybe the copy could be handled by generic_product_impl so that these overloads would not be needed anymore
 
-template<typename LhsView, typename Rhs, int ProductTag>
+template <typename LhsView, typename Rhs, int ProductTag>
 struct product_evaluator<Product<LhsView, Rhs, DefaultProduct>, ProductTag, SparseSelfAdjointShape, SparseShape>
-  : public evaluator<typename Product<typename Rhs::PlainObject, Rhs, DefaultProduct>::PlainObject>
-{
+    : public evaluator<typename Product<typename Rhs::PlainObject, Rhs, DefaultProduct>::PlainObject> {
   typedef Product<LhsView, Rhs, DefaultProduct> XprType;
   typedef typename XprType::PlainObject PlainObject;
   typedef evaluator<PlainObject> Base;
 
-  product_evaluator(const XprType& xpr)
-    : m_lhs(xpr.lhs()), m_result(xpr.rows(), xpr.cols())
-  {
+  product_evaluator(const XprType& xpr) : m_lhs(xpr.lhs()), m_result(xpr.rows(), xpr.cols()) {
     internal::construct_at<Base>(this, m_result);
-    generic_product_impl<typename Rhs::PlainObject, Rhs, SparseShape, SparseShape, ProductTag>::evalTo(m_result, m_lhs, xpr.rhs());
+    generic_product_impl<typename Rhs::PlainObject, Rhs, SparseShape, SparseShape, ProductTag>::evalTo(m_result, m_lhs,
+                                                                                                       xpr.rhs());
   }
-  
-protected:
+
+ protected:
   typename Rhs::PlainObject m_lhs;
   PlainObject m_result;
 };
 
-template<typename Lhs, typename RhsView, int ProductTag>
+template <typename Lhs, typename RhsView, int ProductTag>
 struct product_evaluator<Product<Lhs, RhsView, DefaultProduct>, ProductTag, SparseShape, SparseSelfAdjointShape>
-  : public evaluator<typename Product<Lhs, typename Lhs::PlainObject, DefaultProduct>::PlainObject>
-{
+    : public evaluator<typename Product<Lhs, typename Lhs::PlainObject, DefaultProduct>::PlainObject> {
   typedef Product<Lhs, RhsView, DefaultProduct> XprType;
   typedef typename XprType::PlainObject PlainObject;
   typedef evaluator<PlainObject> Base;
 
-  product_evaluator(const XprType& xpr)
-    : m_rhs(xpr.rhs()), m_result(xpr.rows(), xpr.cols())
-  {
+  product_evaluator(const XprType& xpr) : m_rhs(xpr.rhs()), m_result(xpr.rows(), xpr.cols()) {
     ::new (static_cast<Base*>(this)) Base(m_result);
-    generic_product_impl<Lhs, typename Lhs::PlainObject, SparseShape, SparseShape, ProductTag>::evalTo(m_result, xpr.lhs(), m_rhs);
+    generic_product_impl<Lhs, typename Lhs::PlainObject, SparseShape, SparseShape, ProductTag>::evalTo(
+        m_result, xpr.lhs(), m_rhs);
   }
-  
-protected:
+
+ protected:
   typename Lhs::PlainObject m_rhs;
   PlainObject m_result;
 };
 
-} // namespace internal
+}  // namespace internal
 
 /***************************************************************************
-* Implementation of symmetric copies and permutations
-***************************************************************************/
+ * Implementation of symmetric copies and permutations
+ ***************************************************************************/
 namespace internal {
 
-template<int Mode,typename MatrixType,int DestOrder>
-void permute_symm_to_fullsymm(const MatrixType& mat, SparseMatrix<typename MatrixType::Scalar,DestOrder,typename MatrixType::StorageIndex>& _dest, const typename MatrixType::StorageIndex* perm)
-{
+template <int Mode, typename MatrixType, int DestOrder>
+void permute_symm_to_fullsymm(
+    const MatrixType& mat,
+    SparseMatrix<typename MatrixType::Scalar, DestOrder, typename MatrixType::StorageIndex>& _dest,
+    const typename MatrixType::StorageIndex* perm) {
   typedef typename MatrixType::StorageIndex StorageIndex;
   typedef typename MatrixType::Scalar Scalar;
-  typedef SparseMatrix<Scalar,DestOrder,StorageIndex> Dest;
-  typedef Matrix<StorageIndex,Dynamic,1> VectorI;
+  typedef SparseMatrix<Scalar, DestOrder, StorageIndex> Dest;
+  typedef Matrix<StorageIndex, Dynamic, 1> VectorI;
   typedef evaluator<MatrixType> MatEval;
   typedef typename evaluator<MatrixType>::InnerIterator MatIterator;
-  
+
   MatEval matEval(mat);
   Dest& dest(_dest.derived());
-  enum {
-    StorageOrderMatch = int(Dest::IsRowMajor) == int(MatrixType::IsRowMajor)
-  };
-  
+  enum { StorageOrderMatch = int(Dest::IsRowMajor) == int(MatrixType::IsRowMajor) };
+
   Index size = mat.rows();
   VectorI count;
   count.resize(size);
   count.setZero();
-  dest.resize(size,size);
-  for(Index j = 0; j<size; ++j)
-  {
+  dest.resize(size, size);
+  for (Index j = 0; j < size; ++j) {
     Index jp = perm ? perm[j] : j;
-    for(MatIterator it(matEval,j); it; ++it)
-    {
+    for (MatIterator it(matEval, j); it; ++it) {
       Index i = it.index();
       Index r = it.row();
       Index c = it.col();
       Index ip = perm ? perm[i] : i;
-      if(Mode==int(Upper|Lower))
+      if (Mode == int(Upper | Lower))
         count[StorageOrderMatch ? jp : ip]++;
-      else if(r==c)
+      else if (r == c)
         count[ip]++;
-      else if(( Mode==Lower && r>c) || ( Mode==Upper && r<c))
-      {
+      else if ((Mode == Lower && r > c) || (Mode == Upper && r < c)) {
         count[ip]++;
         count[jp]++;
       }
     }
   }
   Index nnz = count.sum();
-  
+
   // reserve space
   dest.resizeNonZeros(nnz);
   dest.outerIndexPtr()[0] = 0;
-  for(Index j=0; j<size; ++j)
-    dest.outerIndexPtr()[j+1] = dest.outerIndexPtr()[j] + count[j];
-  for(Index j=0; j<size; ++j)
-    count[j] = dest.outerIndexPtr()[j];
-  
+  for (Index j = 0; j < size; ++j) dest.outerIndexPtr()[j + 1] = dest.outerIndexPtr()[j] + count[j];
+  for (Index j = 0; j < size; ++j) count[j] = dest.outerIndexPtr()[j];
+
   // copy data
-  for(StorageIndex j = 0; j<size; ++j)
-  {
-    for(MatIterator it(matEval,j); it; ++it)
-    {
+  for (StorageIndex j = 0; j < size; ++j) {
+    for (MatIterator it(matEval, j); it; ++it) {
       StorageIndex i = internal::convert_index<StorageIndex>(it.index());
       Index r = it.row();
       Index c = it.col();
-      
+
       StorageIndex jp = perm ? perm[j] : j;
       StorageIndex ip = perm ? perm[i] : i;
-      
-      if(Mode==int(Upper|Lower))
-      {
+
+      if (Mode == int(Upper | Lower)) {
         Index k = count[StorageOrderMatch ? jp : ip]++;
         dest.innerIndexPtr()[k] = StorageOrderMatch ? ip : jp;
         dest.valuePtr()[k] = it.value();
-      }
-      else if(r==c)
-      {
+      } else if (r == c) {
         Index k = count[ip]++;
         dest.innerIndexPtr()[k] = ip;
         dest.valuePtr()[k] = it.value();
-      }
-      else if(( (Mode&Lower)==Lower && r>c) || ( (Mode&Upper)==Upper && r<c))
-      {
-        if(!StorageOrderMatch)
-          std::swap(ip,jp);
+      } else if (((Mode & Lower) == Lower && r > c) || ((Mode & Upper) == Upper && r < c)) {
+        if (!StorageOrderMatch) std::swap(ip, jp);
         Index k = count[jp]++;
         dest.innerIndexPtr()[k] = ip;
         dest.valuePtr()[k] = it.value();
@@ -510,66 +482,58 @@
   }
 }
 
-template<int SrcMode_,int DstMode_,typename MatrixType,int DstOrder>
-void permute_symm_to_symm(const MatrixType& mat, SparseMatrix<typename MatrixType::Scalar,DstOrder,typename MatrixType::StorageIndex>& _dest, const typename MatrixType::StorageIndex* perm)
-{
+template <int SrcMode_, int DstMode_, typename MatrixType, int DstOrder>
+void permute_symm_to_symm(const MatrixType& mat,
+                          SparseMatrix<typename MatrixType::Scalar, DstOrder, typename MatrixType::StorageIndex>& _dest,
+                          const typename MatrixType::StorageIndex* perm) {
   typedef typename MatrixType::StorageIndex StorageIndex;
   typedef typename MatrixType::Scalar Scalar;
-  SparseMatrix<Scalar,DstOrder,StorageIndex>& dest(_dest.derived());
-  typedef Matrix<StorageIndex,Dynamic,1> VectorI;
+  SparseMatrix<Scalar, DstOrder, StorageIndex>& dest(_dest.derived());
+  typedef Matrix<StorageIndex, Dynamic, 1> VectorI;
   typedef evaluator<MatrixType> MatEval;
   typedef typename evaluator<MatrixType>::InnerIterator MatIterator;
 
   enum {
     SrcOrder = MatrixType::IsRowMajor ? RowMajor : ColMajor,
     StorageOrderMatch = int(SrcOrder) == int(DstOrder),
-    DstMode = DstOrder==RowMajor ? (DstMode_==Upper ? Lower : Upper) : DstMode_,
-    SrcMode = SrcOrder==RowMajor ? (SrcMode_==Upper ? Lower : Upper) : SrcMode_
+    DstMode = DstOrder == RowMajor ? (DstMode_ == Upper ? Lower : Upper) : DstMode_,
+    SrcMode = SrcOrder == RowMajor ? (SrcMode_ == Upper ? Lower : Upper) : SrcMode_
   };
 
   MatEval matEval(mat);
-  
+
   Index size = mat.rows();
   VectorI count(size);
   count.setZero();
-  dest.resize(size,size);
-  for(StorageIndex j = 0; j<size; ++j)
-  {
+  dest.resize(size, size);
+  for (StorageIndex j = 0; j < size; ++j) {
     StorageIndex jp = perm ? perm[j] : j;
-    for(MatIterator it(matEval,j); it; ++it)
-    {
+    for (MatIterator it(matEval, j); it; ++it) {
       StorageIndex i = it.index();
-      if((int(SrcMode)==int(Lower) && i<j) || (int(SrcMode)==int(Upper) && i>j))
-        continue;
-                  
+      if ((int(SrcMode) == int(Lower) && i < j) || (int(SrcMode) == int(Upper) && i > j)) continue;
+
       StorageIndex ip = perm ? perm[i] : i;
-      count[int(DstMode)==int(Lower) ? (std::min)(ip,jp) : (std::max)(ip,jp)]++;
+      count[int(DstMode) == int(Lower) ? (std::min)(ip, jp) : (std::max)(ip, jp)]++;
     }
   }
   dest.outerIndexPtr()[0] = 0;
-  for(Index j=0; j<size; ++j)
-    dest.outerIndexPtr()[j+1] = dest.outerIndexPtr()[j] + count[j];
+  for (Index j = 0; j < size; ++j) dest.outerIndexPtr()[j + 1] = dest.outerIndexPtr()[j] + count[j];
   dest.resizeNonZeros(dest.outerIndexPtr()[size]);
-  for(Index j=0; j<size; ++j)
-    count[j] = dest.outerIndexPtr()[j];
-  
-  for(StorageIndex j = 0; j<size; ++j)
-  {
-    
-    for(MatIterator it(matEval,j); it; ++it)
-    {
+  for (Index j = 0; j < size; ++j) count[j] = dest.outerIndexPtr()[j];
+
+  for (StorageIndex j = 0; j < size; ++j) {
+    for (MatIterator it(matEval, j); it; ++it) {
       StorageIndex i = it.index();
-      if((int(SrcMode)==int(Lower) && i<j) || (int(SrcMode)==int(Upper) && i>j))
-        continue;
-                  
+      if ((int(SrcMode) == int(Lower) && i < j) || (int(SrcMode) == int(Upper) && i > j)) continue;
+
       StorageIndex jp = perm ? perm[j] : j;
-      StorageIndex ip = perm? perm[i] : i;
-      
-      Index k = count[int(DstMode)==int(Lower) ? (std::min)(ip,jp) : (std::max)(ip,jp)]++;
-      dest.innerIndexPtr()[k] = int(DstMode)==int(Lower) ? (std::max)(ip,jp) : (std::min)(ip,jp);
-      
-      if(!StorageOrderMatch) std::swap(ip,jp);
-      if( ((int(DstMode)==int(Lower) && ip<jp) || (int(DstMode)==int(Upper) && ip>jp)))
+      StorageIndex ip = perm ? perm[i] : i;
+
+      Index k = count[int(DstMode) == int(Lower) ? (std::min)(ip, jp) : (std::max)(ip, jp)]++;
+      dest.innerIndexPtr()[k] = int(DstMode) == int(Lower) ? (std::max)(ip, jp) : (std::min)(ip, jp);
+
+      if (!StorageOrderMatch) std::swap(ip, jp);
+      if (((int(DstMode) == int(Lower) && ip < jp) || (int(DstMode) == int(Upper) && ip > jp)))
         dest.valuePtr()[k] = numext::conj(it.value());
       else
         dest.valuePtr()[k] = it.value();
@@ -577,77 +541,73 @@
   }
 }
 
-}
+}  // namespace internal
 
 // TODO implement twists in a more evaluator friendly fashion
 
 namespace internal {
 
-template<typename MatrixType, int Mode>
-struct traits<SparseSymmetricPermutationProduct<MatrixType,Mode> > : traits<MatrixType> {
-};
+template <typename MatrixType, int Mode>
+struct traits<SparseSymmetricPermutationProduct<MatrixType, Mode> > : traits<MatrixType> {};
 
-}
+}  // namespace internal
 
-template<typename MatrixType,int Mode>
-class SparseSymmetricPermutationProduct
-  : public EigenBase<SparseSymmetricPermutationProduct<MatrixType,Mode> >
-{
-  public:
-    typedef typename MatrixType::Scalar Scalar;
-    typedef typename MatrixType::StorageIndex StorageIndex;
-    enum {
-      RowsAtCompileTime = internal::traits<SparseSymmetricPermutationProduct>::RowsAtCompileTime,
-      ColsAtCompileTime = internal::traits<SparseSymmetricPermutationProduct>::ColsAtCompileTime
-    };
-  protected:
-    typedef PermutationMatrix<Dynamic,Dynamic,StorageIndex> Perm;
-  public:
-    typedef Matrix<StorageIndex,Dynamic,1> VectorI;
-    typedef typename MatrixType::Nested MatrixTypeNested;
-    typedef internal::remove_all_t<MatrixTypeNested> NestedExpression;
-    
-    SparseSymmetricPermutationProduct(const MatrixType& mat, const Perm& perm)
-      : m_matrix(mat), m_perm(perm)
-    {}
-    
-    inline Index rows() const { return m_matrix.rows(); }
-    inline Index cols() const { return m_matrix.cols(); }
-        
-    const NestedExpression& matrix() const { return m_matrix; }
-    const Perm& perm() const { return m_perm; }
-    
-  protected:
-    MatrixTypeNested m_matrix;
-    const Perm& m_perm;
+template <typename MatrixType, int Mode>
+class SparseSymmetricPermutationProduct : public EigenBase<SparseSymmetricPermutationProduct<MatrixType, Mode> > {
+ public:
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::StorageIndex StorageIndex;
+  enum {
+    RowsAtCompileTime = internal::traits<SparseSymmetricPermutationProduct>::RowsAtCompileTime,
+    ColsAtCompileTime = internal::traits<SparseSymmetricPermutationProduct>::ColsAtCompileTime
+  };
 
+ protected:
+  typedef PermutationMatrix<Dynamic, Dynamic, StorageIndex> Perm;
+
+ public:
+  typedef Matrix<StorageIndex, Dynamic, 1> VectorI;
+  typedef typename MatrixType::Nested MatrixTypeNested;
+  typedef internal::remove_all_t<MatrixTypeNested> NestedExpression;
+
+  SparseSymmetricPermutationProduct(const MatrixType& mat, const Perm& perm) : m_matrix(mat), m_perm(perm) {}
+
+  inline Index rows() const { return m_matrix.rows(); }
+  inline Index cols() const { return m_matrix.cols(); }
+
+  const NestedExpression& matrix() const { return m_matrix; }
+  const Perm& perm() const { return m_perm; }
+
+ protected:
+  MatrixTypeNested m_matrix;
+  const Perm& m_perm;
 };
 
 namespace internal {
-  
-template<typename DstXprType, typename MatrixType, int Mode, typename Scalar>
-struct Assignment<DstXprType, SparseSymmetricPermutationProduct<MatrixType,Mode>, internal::assign_op<Scalar,typename MatrixType::Scalar>, Sparse2Sparse>
-{
-  typedef SparseSymmetricPermutationProduct<MatrixType,Mode> SrcXprType;
+
+template <typename DstXprType, typename MatrixType, int Mode, typename Scalar>
+struct Assignment<DstXprType, SparseSymmetricPermutationProduct<MatrixType, Mode>,
+                  internal::assign_op<Scalar, typename MatrixType::Scalar>, Sparse2Sparse> {
+  typedef SparseSymmetricPermutationProduct<MatrixType, Mode> SrcXprType;
   typedef typename DstXprType::StorageIndex DstIndex;
-  template<int Options>
-  static void run(SparseMatrix<Scalar,Options,DstIndex> &dst, const SrcXprType &src, const internal::assign_op<Scalar,typename MatrixType::Scalar> &)
-  {
+  template <int Options>
+  static void run(SparseMatrix<Scalar, Options, DstIndex>& dst, const SrcXprType& src,
+                  const internal::assign_op<Scalar, typename MatrixType::Scalar>&) {
     // internal::permute_symm_to_fullsymm<Mode>(m_matrix,_dest,m_perm.indices().data());
-    SparseMatrix<Scalar,(Options&RowMajor)==RowMajor ? ColMajor : RowMajor, DstIndex> tmp;
-    internal::permute_symm_to_fullsymm<Mode>(src.matrix(),tmp,src.perm().indices().data());
+    SparseMatrix<Scalar, (Options & RowMajor) == RowMajor ? ColMajor : RowMajor, DstIndex> tmp;
+    internal::permute_symm_to_fullsymm<Mode>(src.matrix(), tmp, src.perm().indices().data());
     dst = tmp;
   }
-  
-  template<typename DestType,unsigned int DestMode>
-  static void run(SparseSelfAdjointView<DestType,DestMode>& dst, const SrcXprType &src, const internal::assign_op<Scalar,typename MatrixType::Scalar> &)
-  {
-    internal::permute_symm_to_symm<Mode,DestMode>(src.matrix(),dst.matrix(),src.perm().indices().data());
+
+  template <typename DestType, unsigned int DestMode>
+  static void run(SparseSelfAdjointView<DestType, DestMode>& dst, const SrcXprType& src,
+                  const internal::assign_op<Scalar, typename MatrixType::Scalar>&) {
+    internal::permute_symm_to_symm<Mode, DestMode>(src.matrix(), dst.matrix(), src.perm().indices().data());
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SPARSE_SELFADJOINTVIEW_H
+#endif  // EIGEN_SPARSE_SELFADJOINTVIEW_H
diff --git a/Eigen/src/SparseCore/SparseSolverBase.h b/Eigen/src/SparseCore/SparseSolverBase.h
index c2926f4..d67a677 100644
--- a/Eigen/src/SparseCore/SparseSolverBase.h
+++ b/Eigen/src/SparseCore/SparseSolverBase.h
@@ -13,117 +13,103 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
-  /** \internal
-  * Helper functions to solve with a sparse right-hand-side and result.
-  * The rhs is decomposed into small vertical panels which are solved through dense temporaries.
-  */
-template<typename Decomposition, typename Rhs, typename Dest>
-std::enable_if_t<Rhs::ColsAtCompileTime!=1 && Dest::ColsAtCompileTime!=1>
-solve_sparse_through_dense_panels(const Decomposition &dec, const Rhs& rhs, Dest &dest)
-{
-  EIGEN_STATIC_ASSERT((Dest::Flags&RowMajorBit)==0,THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);
+/** \internal
+ * Helper functions to solve with a sparse right-hand-side and result.
+ * The rhs is decomposed into small vertical panels which are solved through dense temporaries.
+ */
+template <typename Decomposition, typename Rhs, typename Dest>
+std::enable_if_t<Rhs::ColsAtCompileTime != 1 && Dest::ColsAtCompileTime != 1> solve_sparse_through_dense_panels(
+    const Decomposition& dec, const Rhs& rhs, Dest& dest) {
+  EIGEN_STATIC_ASSERT((Dest::Flags & RowMajorBit) == 0, THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);
   typedef typename Dest::Scalar DestScalar;
   // we process the sparse rhs per block of NbColsAtOnce columns temporarily stored into a dense matrix.
   static const Index NbColsAtOnce = 4;
   Index rhsCols = rhs.cols();
   Index size = rhs.rows();
   // the temporary matrices do not need more columns than NbColsAtOnce:
-  Index tmpCols = (std::min)(rhsCols, NbColsAtOnce); 
-  Eigen::Matrix<DestScalar,Dynamic,Dynamic> tmp(size,tmpCols);
-  Eigen::Matrix<DestScalar,Dynamic,Dynamic> tmpX(size,tmpCols);
-  for(Index k=0; k<rhsCols; k+=NbColsAtOnce)
-  {
-    Index actualCols = std::min<Index>(rhsCols-k, NbColsAtOnce);
-    tmp.leftCols(actualCols) = rhs.middleCols(k,actualCols);
+  Index tmpCols = (std::min)(rhsCols, NbColsAtOnce);
+  Eigen::Matrix<DestScalar, Dynamic, Dynamic> tmp(size, tmpCols);
+  Eigen::Matrix<DestScalar, Dynamic, Dynamic> tmpX(size, tmpCols);
+  for (Index k = 0; k < rhsCols; k += NbColsAtOnce) {
+    Index actualCols = std::min<Index>(rhsCols - k, NbColsAtOnce);
+    tmp.leftCols(actualCols) = rhs.middleCols(k, actualCols);
     tmpX.leftCols(actualCols) = dec.solve(tmp.leftCols(actualCols));
-    dest.middleCols(k,actualCols) = tmpX.leftCols(actualCols).sparseView();
+    dest.middleCols(k, actualCols) = tmpX.leftCols(actualCols).sparseView();
   }
 }
 
 // Overload for vector as rhs
-template<typename Decomposition, typename Rhs, typename Dest>
-std::enable_if_t<Rhs::ColsAtCompileTime==1 || Dest::ColsAtCompileTime==1>
-solve_sparse_through_dense_panels(const Decomposition &dec, const Rhs& rhs, Dest &dest)
-{
+template <typename Decomposition, typename Rhs, typename Dest>
+std::enable_if_t<Rhs::ColsAtCompileTime == 1 || Dest::ColsAtCompileTime == 1> solve_sparse_through_dense_panels(
+    const Decomposition& dec, const Rhs& rhs, Dest& dest) {
   typedef typename Dest::Scalar DestScalar;
   Index size = rhs.rows();
-  Eigen::Matrix<DestScalar,Dynamic,1> rhs_dense(rhs);
-  Eigen::Matrix<DestScalar,Dynamic,1> dest_dense(size);
+  Eigen::Matrix<DestScalar, Dynamic, 1> rhs_dense(rhs);
+  Eigen::Matrix<DestScalar, Dynamic, 1> dest_dense(size);
   dest_dense = dec.solve(rhs_dense);
   dest = dest_dense.sparseView();
 }
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \class SparseSolverBase
-  * \ingroup SparseCore_Module
-  * \brief A base class for sparse solvers
-  *
-  * \tparam Derived the actual type of the solver.
-  *
-  */
-template<typename Derived>
-class SparseSolverBase : internal::noncopyable
-{
-  public:
+ * \ingroup SparseCore_Module
+ * \brief A base class for sparse solvers
+ *
+ * \tparam Derived the actual type of the solver.
+ *
+ */
+template <typename Derived>
+class SparseSolverBase : internal::noncopyable {
+ public:
+  /** Default constructor */
+  SparseSolverBase() : m_isInitialized(false) {}
 
-    /** Default constructor */
-    SparseSolverBase()
-      : m_isInitialized(false)
-    {}
+  SparseSolverBase(SparseSolverBase&& other) : internal::noncopyable{}, m_isInitialized{other.m_isInitialized} {}
 
-    SparseSolverBase(SparseSolverBase&&other ) : internal::noncopyable{}, m_isInitialized{other.m_isInitialized} {}
+  ~SparseSolverBase() {}
 
-    ~SparseSolverBase()
-    {}
+  Derived& derived() { return *static_cast<Derived*>(this); }
+  const Derived& derived() const { return *static_cast<const Derived*>(this); }
 
-    Derived& derived() { return *static_cast<Derived*>(this); }
-    const Derived& derived() const { return *static_cast<const Derived*>(this); }
-    
-    /** \returns an expression of the solution x of \f$ A x = b \f$ using the current decomposition of A.
-      *
-      * \sa compute()
-      */
-    template<typename Rhs>
-    inline const Solve<Derived, Rhs>
-    solve(const MatrixBase<Rhs>& b) const
-    {
-      eigen_assert(m_isInitialized && "Solver is not initialized.");
-      eigen_assert(derived().rows()==b.rows() && "solve(): invalid number of rows of the right hand side matrix b");
-      return Solve<Derived, Rhs>(derived(), b.derived());
-    }
-    
-    /** \returns an expression of the solution x of \f$ A x = b \f$ using the current decomposition of A.
-      *
-      * \sa compute()
-      */
-    template<typename Rhs>
-    inline const Solve<Derived, Rhs>
-    solve(const SparseMatrixBase<Rhs>& b) const
-    {
-      eigen_assert(m_isInitialized && "Solver is not initialized.");
-      eigen_assert(derived().rows()==b.rows() && "solve(): invalid number of rows of the right hand side matrix b");
-      return Solve<Derived, Rhs>(derived(), b.derived());
-    }
-    
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    /** \internal default implementation of solving with a sparse rhs */
-    template<typename Rhs,typename Dest>
-    void _solve_impl(const SparseMatrixBase<Rhs> &b, SparseMatrixBase<Dest> &dest) const
-    {
-      internal::solve_sparse_through_dense_panels(derived(), b.derived(), dest.derived());
-    }
-    #endif // EIGEN_PARSED_BY_DOXYGEN
+  /** \returns an expression of the solution x of \f$ A x = b \f$ using the current decomposition of A.
+   *
+   * \sa compute()
+   */
+  template <typename Rhs>
+  inline const Solve<Derived, Rhs> solve(const MatrixBase<Rhs>& b) const {
+    eigen_assert(m_isInitialized && "Solver is not initialized.");
+    eigen_assert(derived().rows() == b.rows() && "solve(): invalid number of rows of the right hand side matrix b");
+    return Solve<Derived, Rhs>(derived(), b.derived());
+  }
 
-  protected:
-    
-    mutable bool m_isInitialized;
+  /** \returns an expression of the solution x of \f$ A x = b \f$ using the current decomposition of A.
+   *
+   * \sa compute()
+   */
+  template <typename Rhs>
+  inline const Solve<Derived, Rhs> solve(const SparseMatrixBase<Rhs>& b) const {
+    eigen_assert(m_isInitialized && "Solver is not initialized.");
+    eigen_assert(derived().rows() == b.rows() && "solve(): invalid number of rows of the right hand side matrix b");
+    return Solve<Derived, Rhs>(derived(), b.derived());
+  }
+
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  /** \internal default implementation of solving with a sparse rhs */
+  template <typename Rhs, typename Dest>
+  void _solve_impl(const SparseMatrixBase<Rhs>& b, SparseMatrixBase<Dest>& dest) const {
+    internal::solve_sparse_through_dense_panels(derived(), b.derived(), dest.derived());
+  }
+#endif  // EIGEN_PARSED_BY_DOXYGEN
+
+ protected:
+  mutable bool m_isInitialized;
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SPARSESOLVERBASE_H
+#endif  // EIGEN_SPARSESOLVERBASE_H
diff --git a/Eigen/src/SparseCore/SparseSparseProductWithPruning.h b/Eigen/src/SparseCore/SparseSparseProductWithPruning.h
index 9ee9292..6e1c9cf 100644
--- a/Eigen/src/SparseCore/SparseSparseProductWithPruning.h
+++ b/Eigen/src/SparseCore/SparseSparseProductWithPruning.h
@@ -13,15 +13,14 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
-
 // perform a pseudo in-place sparse * sparse product assuming all matrices are col major
-template<typename Lhs, typename Rhs, typename ResultType>
-static void sparse_sparse_product_with_pruning_impl(const Lhs& lhs, const Rhs& rhs, ResultType& res, const typename ResultType::RealScalar& tolerance)
-{
+template <typename Lhs, typename Rhs, typename ResultType>
+static void sparse_sparse_product_with_pruning_impl(const Lhs& lhs, const Rhs& rhs, ResultType& res,
+                                                    const typename ResultType::RealScalar& tolerance) {
   // return sparse_sparse_product_with_pruning_impl2(lhs,rhs,res);
 
   typedef typename remove_all_t<Rhs>::Scalar RhsScalar;
@@ -31,21 +30,21 @@
   // make sure to call innerSize/outerSize since we fake the storage order.
   Index rows = lhs.innerSize();
   Index cols = rhs.outerSize();
-  //Index size = lhs.outerSize();
+  // Index size = lhs.outerSize();
   eigen_assert(lhs.outerSize() == rhs.innerSize());
 
   // allocate a temporary buffer
-  AmbiVector<ResScalar,StorageIndex> tempVector(rows);
+  AmbiVector<ResScalar, StorageIndex> tempVector(rows);
 
   // mimics a resizeByInnerOuter:
-  if(ResultType::IsRowMajor)
+  if (ResultType::IsRowMajor)
     res.resize(cols, rows);
   else
     res.resize(rows, cols);
-  
+
   evaluator<Lhs> lhsEval(lhs);
   evaluator<Rhs> rhsEval(rhs);
-  
+
   // estimate the number of non zero entries
   // given a rhs column containing Y non zeros, we assume that the respective Y columns
   // of the lhs differs in average of one non zeros, thus the number of non zeros for
@@ -55,147 +54,131 @@
   Index estimated_nnz_prod = lhsEval.nonZerosEstimate() + rhsEval.nonZerosEstimate();
 
   res.reserve(estimated_nnz_prod);
-  double ratioColRes = double(estimated_nnz_prod)/(double(lhs.rows())*double(rhs.cols()));
-  for (Index j=0; j<cols; ++j)
-  {
+  double ratioColRes = double(estimated_nnz_prod) / (double(lhs.rows()) * double(rhs.cols()));
+  for (Index j = 0; j < cols; ++j) {
     // FIXME:
-    //double ratioColRes = (double(rhs.innerVector(j).nonZeros()) + double(lhs.nonZeros())/double(lhs.cols()))/double(lhs.rows());
+    // double ratioColRes = (double(rhs.innerVector(j).nonZeros()) +
+    // double(lhs.nonZeros())/double(lhs.cols()))/double(lhs.rows());
     // let's do a more accurate determination of the nnz ratio for the current column j of res
     tempVector.init(ratioColRes);
     tempVector.setZero();
-    for (typename evaluator<Rhs>::InnerIterator rhsIt(rhsEval, j); rhsIt; ++rhsIt)
-    {
+    for (typename evaluator<Rhs>::InnerIterator rhsIt(rhsEval, j); rhsIt; ++rhsIt) {
       // FIXME should be written like this: tmp += rhsIt.value() * lhs.col(rhsIt.index())
       tempVector.restart();
       RhsScalar x = rhsIt.value();
-      for (typename evaluator<Lhs>::InnerIterator lhsIt(lhsEval, rhsIt.index()); lhsIt; ++lhsIt)
-      {
+      for (typename evaluator<Lhs>::InnerIterator lhsIt(lhsEval, rhsIt.index()); lhsIt; ++lhsIt) {
         tempVector.coeffRef(lhsIt.index()) += lhsIt.value() * x;
       }
     }
     res.startVec(j);
-    for (typename AmbiVector<ResScalar,StorageIndex>::Iterator it(tempVector,tolerance); it; ++it)
-      res.insertBackByOuterInner(j,it.index()) = it.value();
+    for (typename AmbiVector<ResScalar, StorageIndex>::Iterator it(tempVector, tolerance); it; ++it)
+      res.insertBackByOuterInner(j, it.index()) = it.value();
   }
   res.finalize();
 }
 
-template<typename Lhs, typename Rhs, typename ResultType,
-  int LhsStorageOrder = traits<Lhs>::Flags&RowMajorBit,
-  int RhsStorageOrder = traits<Rhs>::Flags&RowMajorBit,
-  int ResStorageOrder = traits<ResultType>::Flags&RowMajorBit>
+template <typename Lhs, typename Rhs, typename ResultType, int LhsStorageOrder = traits<Lhs>::Flags & RowMajorBit,
+          int RhsStorageOrder = traits<Rhs>::Flags & RowMajorBit,
+          int ResStorageOrder = traits<ResultType>::Flags & RowMajorBit>
 struct sparse_sparse_product_with_pruning_selector;
 
-template<typename Lhs, typename Rhs, typename ResultType>
-struct sparse_sparse_product_with_pruning_selector<Lhs,Rhs,ResultType,ColMajor,ColMajor,ColMajor>
-{
+template <typename Lhs, typename Rhs, typename ResultType>
+struct sparse_sparse_product_with_pruning_selector<Lhs, Rhs, ResultType, ColMajor, ColMajor, ColMajor> {
   typedef typename ResultType::RealScalar RealScalar;
 
-  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res, const RealScalar& tolerance)
-  {
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res, const RealScalar& tolerance) {
     remove_all_t<ResultType> res_(res.rows(), res.cols());
-    internal::sparse_sparse_product_with_pruning_impl<Lhs,Rhs,ResultType>(lhs, rhs, res_, tolerance);
+    internal::sparse_sparse_product_with_pruning_impl<Lhs, Rhs, ResultType>(lhs, rhs, res_, tolerance);
     res.swap(res_);
   }
 };
 
-template<typename Lhs, typename Rhs, typename ResultType>
-struct sparse_sparse_product_with_pruning_selector<Lhs,Rhs,ResultType,ColMajor,ColMajor,RowMajor>
-{
+template <typename Lhs, typename Rhs, typename ResultType>
+struct sparse_sparse_product_with_pruning_selector<Lhs, Rhs, ResultType, ColMajor, ColMajor, RowMajor> {
   typedef typename ResultType::RealScalar RealScalar;
-  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res, const RealScalar& tolerance)
-  {
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res, const RealScalar& tolerance) {
     // we need a col-major matrix to hold the result
-    typedef SparseMatrix<typename ResultType::Scalar,ColMajor,typename ResultType::StorageIndex> SparseTemporaryType;
+    typedef SparseMatrix<typename ResultType::Scalar, ColMajor, typename ResultType::StorageIndex> SparseTemporaryType;
     SparseTemporaryType res_(res.rows(), res.cols());
-    internal::sparse_sparse_product_with_pruning_impl<Lhs,Rhs,SparseTemporaryType>(lhs, rhs, res_, tolerance);
+    internal::sparse_sparse_product_with_pruning_impl<Lhs, Rhs, SparseTemporaryType>(lhs, rhs, res_, tolerance);
     res = res_;
   }
 };
 
-template<typename Lhs, typename Rhs, typename ResultType>
-struct sparse_sparse_product_with_pruning_selector<Lhs,Rhs,ResultType,RowMajor,RowMajor,RowMajor>
-{
+template <typename Lhs, typename Rhs, typename ResultType>
+struct sparse_sparse_product_with_pruning_selector<Lhs, Rhs, ResultType, RowMajor, RowMajor, RowMajor> {
   typedef typename ResultType::RealScalar RealScalar;
-  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res, const RealScalar& tolerance)
-  {
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res, const RealScalar& tolerance) {
     // let's transpose the product to get a column x column product
     remove_all_t<ResultType> res_(res.rows(), res.cols());
-    internal::sparse_sparse_product_with_pruning_impl<Rhs,Lhs,ResultType>(rhs, lhs, res_, tolerance);
+    internal::sparse_sparse_product_with_pruning_impl<Rhs, Lhs, ResultType>(rhs, lhs, res_, tolerance);
     res.swap(res_);
   }
 };
 
-template<typename Lhs, typename Rhs, typename ResultType>
-struct sparse_sparse_product_with_pruning_selector<Lhs,Rhs,ResultType,RowMajor,RowMajor,ColMajor>
-{
+template <typename Lhs, typename Rhs, typename ResultType>
+struct sparse_sparse_product_with_pruning_selector<Lhs, Rhs, ResultType, RowMajor, RowMajor, ColMajor> {
   typedef typename ResultType::RealScalar RealScalar;
-  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res, const RealScalar& tolerance)
-  {
-    typedef SparseMatrix<typename Lhs::Scalar,ColMajor,typename Lhs::StorageIndex> ColMajorMatrixLhs;
-    typedef SparseMatrix<typename Rhs::Scalar,ColMajor,typename Lhs::StorageIndex> ColMajorMatrixRhs;
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res, const RealScalar& tolerance) {
+    typedef SparseMatrix<typename Lhs::Scalar, ColMajor, typename Lhs::StorageIndex> ColMajorMatrixLhs;
+    typedef SparseMatrix<typename Rhs::Scalar, ColMajor, typename Lhs::StorageIndex> ColMajorMatrixRhs;
     ColMajorMatrixLhs colLhs(lhs);
     ColMajorMatrixRhs colRhs(rhs);
-    internal::sparse_sparse_product_with_pruning_impl<ColMajorMatrixLhs,ColMajorMatrixRhs,ResultType>(colLhs, colRhs, res, tolerance);
+    internal::sparse_sparse_product_with_pruning_impl<ColMajorMatrixLhs, ColMajorMatrixRhs, ResultType>(colLhs, colRhs,
+                                                                                                        res, tolerance);
 
     // let's transpose the product to get a column x column product
-//     typedef SparseMatrix<typename ResultType::Scalar> SparseTemporaryType;
-//     SparseTemporaryType res_(res.cols(), res.rows());
-//     sparse_sparse_product_with_pruning_impl<Rhs,Lhs,SparseTemporaryType>(rhs, lhs, res_);
-//     res = res_.transpose();
+    //     typedef SparseMatrix<typename ResultType::Scalar> SparseTemporaryType;
+    //     SparseTemporaryType res_(res.cols(), res.rows());
+    //     sparse_sparse_product_with_pruning_impl<Rhs,Lhs,SparseTemporaryType>(rhs, lhs, res_);
+    //     res = res_.transpose();
   }
 };
 
-template<typename Lhs, typename Rhs, typename ResultType>
-struct sparse_sparse_product_with_pruning_selector<Lhs,Rhs,ResultType,ColMajor,RowMajor,RowMajor>
-{
+template <typename Lhs, typename Rhs, typename ResultType>
+struct sparse_sparse_product_with_pruning_selector<Lhs, Rhs, ResultType, ColMajor, RowMajor, RowMajor> {
   typedef typename ResultType::RealScalar RealScalar;
-  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res, const RealScalar& tolerance)
-  {
-    typedef SparseMatrix<typename Lhs::Scalar,RowMajor,typename Lhs::StorageIndex> RowMajorMatrixLhs;
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res, const RealScalar& tolerance) {
+    typedef SparseMatrix<typename Lhs::Scalar, RowMajor, typename Lhs::StorageIndex> RowMajorMatrixLhs;
     RowMajorMatrixLhs rowLhs(lhs);
-    sparse_sparse_product_with_pruning_selector<RowMajorMatrixLhs,Rhs,ResultType,RowMajor,RowMajor>(rowLhs,rhs,res,tolerance);
+    sparse_sparse_product_with_pruning_selector<RowMajorMatrixLhs, Rhs, ResultType, RowMajor, RowMajor>(rowLhs, rhs,
+                                                                                                        res, tolerance);
   }
 };
 
-template<typename Lhs, typename Rhs, typename ResultType>
-struct sparse_sparse_product_with_pruning_selector<Lhs,Rhs,ResultType,RowMajor,ColMajor,RowMajor>
-{
+template <typename Lhs, typename Rhs, typename ResultType>
+struct sparse_sparse_product_with_pruning_selector<Lhs, Rhs, ResultType, RowMajor, ColMajor, RowMajor> {
   typedef typename ResultType::RealScalar RealScalar;
-  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res, const RealScalar& tolerance)
-  {
-    typedef SparseMatrix<typename Rhs::Scalar,RowMajor,typename Lhs::StorageIndex> RowMajorMatrixRhs;
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res, const RealScalar& tolerance) {
+    typedef SparseMatrix<typename Rhs::Scalar, RowMajor, typename Lhs::StorageIndex> RowMajorMatrixRhs;
     RowMajorMatrixRhs rowRhs(rhs);
-    sparse_sparse_product_with_pruning_selector<Lhs,RowMajorMatrixRhs,ResultType,RowMajor,RowMajor,RowMajor>(lhs,rowRhs,res,tolerance);
+    sparse_sparse_product_with_pruning_selector<Lhs, RowMajorMatrixRhs, ResultType, RowMajor, RowMajor, RowMajor>(
+        lhs, rowRhs, res, tolerance);
   }
 };
 
-template<typename Lhs, typename Rhs, typename ResultType>
-struct sparse_sparse_product_with_pruning_selector<Lhs,Rhs,ResultType,ColMajor,RowMajor,ColMajor>
-{
+template <typename Lhs, typename Rhs, typename ResultType>
+struct sparse_sparse_product_with_pruning_selector<Lhs, Rhs, ResultType, ColMajor, RowMajor, ColMajor> {
   typedef typename ResultType::RealScalar RealScalar;
-  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res, const RealScalar& tolerance)
-  {
-    typedef SparseMatrix<typename Rhs::Scalar,ColMajor,typename Lhs::StorageIndex> ColMajorMatrixRhs;
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res, const RealScalar& tolerance) {
+    typedef SparseMatrix<typename Rhs::Scalar, ColMajor, typename Lhs::StorageIndex> ColMajorMatrixRhs;
     ColMajorMatrixRhs colRhs(rhs);
-    internal::sparse_sparse_product_with_pruning_impl<Lhs,ColMajorMatrixRhs,ResultType>(lhs, colRhs, res, tolerance);
+    internal::sparse_sparse_product_with_pruning_impl<Lhs, ColMajorMatrixRhs, ResultType>(lhs, colRhs, res, tolerance);
   }
 };
 
-template<typename Lhs, typename Rhs, typename ResultType>
-struct sparse_sparse_product_with_pruning_selector<Lhs,Rhs,ResultType,RowMajor,ColMajor,ColMajor>
-{
+template <typename Lhs, typename Rhs, typename ResultType>
+struct sparse_sparse_product_with_pruning_selector<Lhs, Rhs, ResultType, RowMajor, ColMajor, ColMajor> {
   typedef typename ResultType::RealScalar RealScalar;
-  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res, const RealScalar& tolerance)
-  {
-    typedef SparseMatrix<typename Lhs::Scalar,ColMajor,typename Lhs::StorageIndex> ColMajorMatrixLhs;
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res, const RealScalar& tolerance) {
+    typedef SparseMatrix<typename Lhs::Scalar, ColMajor, typename Lhs::StorageIndex> ColMajorMatrixLhs;
     ColMajorMatrixLhs colLhs(lhs);
-    internal::sparse_sparse_product_with_pruning_impl<ColMajorMatrixLhs,Rhs,ResultType>(colLhs, rhs, res, tolerance);
+    internal::sparse_sparse_product_with_pruning_impl<ColMajorMatrixLhs, Rhs, ResultType>(colLhs, rhs, res, tolerance);
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SPARSESPARSEPRODUCTWITHPRUNING_H
+#endif  // EIGEN_SPARSESPARSEPRODUCTWITHPRUNING_H
diff --git a/Eigen/src/SparseCore/SparseTranspose.h b/Eigen/src/SparseCore/SparseTranspose.h
index b774caf..158f778 100644
--- a/Eigen/src/SparseCore/SparseTranspose.h
+++ b/Eigen/src/SparseCore/SparseTranspose.h
@@ -13,83 +13,71 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
-  template<typename MatrixType,int CompressedAccess=int(MatrixType::Flags&CompressedAccessBit)>
-  class SparseTransposeImpl
-    : public SparseMatrixBase<Transpose<MatrixType> >
-  {};
-  
-  template<typename MatrixType>
-  class SparseTransposeImpl<MatrixType,CompressedAccessBit>
-    : public SparseCompressedBase<Transpose<MatrixType> >
-  {
-    typedef SparseCompressedBase<Transpose<MatrixType> > Base;
-  public:
-    using Base::derived;
-    typedef typename Base::Scalar Scalar;
-    typedef typename Base::StorageIndex StorageIndex;
+template <typename MatrixType, int CompressedAccess = int(MatrixType::Flags & CompressedAccessBit)>
+class SparseTransposeImpl : public SparseMatrixBase<Transpose<MatrixType> > {};
 
-    inline Index nonZeros() const { return derived().nestedExpression().nonZeros(); }
-    
-    inline const Scalar* valuePtr() const { return derived().nestedExpression().valuePtr(); }
-    inline const StorageIndex* innerIndexPtr() const { return derived().nestedExpression().innerIndexPtr(); }
-    inline const StorageIndex* outerIndexPtr() const { return derived().nestedExpression().outerIndexPtr(); }
-    inline const StorageIndex* innerNonZeroPtr() const { return derived().nestedExpression().innerNonZeroPtr(); }
+template <typename MatrixType>
+class SparseTransposeImpl<MatrixType, CompressedAccessBit> : public SparseCompressedBase<Transpose<MatrixType> > {
+  typedef SparseCompressedBase<Transpose<MatrixType> > Base;
 
-    inline Scalar* valuePtr() { return derived().nestedExpression().valuePtr(); }
-    inline StorageIndex* innerIndexPtr() { return derived().nestedExpression().innerIndexPtr(); }
-    inline StorageIndex* outerIndexPtr() { return derived().nestedExpression().outerIndexPtr(); }
-    inline StorageIndex* innerNonZeroPtr() { return derived().nestedExpression().innerNonZeroPtr(); }
+ public:
+  using Base::derived;
+  typedef typename Base::Scalar Scalar;
+  typedef typename Base::StorageIndex StorageIndex;
+
+  inline Index nonZeros() const { return derived().nestedExpression().nonZeros(); }
+
+  inline const Scalar* valuePtr() const { return derived().nestedExpression().valuePtr(); }
+  inline const StorageIndex* innerIndexPtr() const { return derived().nestedExpression().innerIndexPtr(); }
+  inline const StorageIndex* outerIndexPtr() const { return derived().nestedExpression().outerIndexPtr(); }
+  inline const StorageIndex* innerNonZeroPtr() const { return derived().nestedExpression().innerNonZeroPtr(); }
+
+  inline Scalar* valuePtr() { return derived().nestedExpression().valuePtr(); }
+  inline StorageIndex* innerIndexPtr() { return derived().nestedExpression().innerIndexPtr(); }
+  inline StorageIndex* outerIndexPtr() { return derived().nestedExpression().outerIndexPtr(); }
+  inline StorageIndex* innerNonZeroPtr() { return derived().nestedExpression().innerNonZeroPtr(); }
+};
+}  // namespace internal
+
+template <typename MatrixType>
+class TransposeImpl<MatrixType, Sparse> : public internal::SparseTransposeImpl<MatrixType> {
+ protected:
+  typedef internal::SparseTransposeImpl<MatrixType> Base;
+};
+
+namespace internal {
+
+template <typename ArgType>
+struct unary_evaluator<Transpose<ArgType>, IteratorBased> : public evaluator_base<Transpose<ArgType> > {
+  typedef typename evaluator<ArgType>::InnerIterator EvalIterator;
+
+ public:
+  typedef Transpose<ArgType> XprType;
+
+  inline Index nonZerosEstimate() const { return m_argImpl.nonZerosEstimate(); }
+
+  class InnerIterator : public EvalIterator {
+   public:
+    EIGEN_STRONG_INLINE InnerIterator(const unary_evaluator& unaryOp, Index outer)
+        : EvalIterator(unaryOp.m_argImpl, outer) {}
+
+    Index row() const { return EvalIterator::col(); }
+    Index col() const { return EvalIterator::row(); }
   };
-}
-  
-template<typename MatrixType> class TransposeImpl<MatrixType,Sparse>
-  : public internal::SparseTransposeImpl<MatrixType>
-{
-  protected:
-    typedef internal::SparseTransposeImpl<MatrixType> Base;
+
+  enum { CoeffReadCost = evaluator<ArgType>::CoeffReadCost, Flags = XprType::Flags };
+
+  explicit unary_evaluator(const XprType& op) : m_argImpl(op.nestedExpression()) {}
+
+ protected:
+  evaluator<ArgType> m_argImpl;
 };
 
-namespace internal {
-  
-template<typename ArgType>
-struct unary_evaluator<Transpose<ArgType>, IteratorBased>
-  : public evaluator_base<Transpose<ArgType> >
-{
-    typedef typename evaluator<ArgType>::InnerIterator        EvalIterator;
-  public:
-    typedef Transpose<ArgType> XprType;
-    
-    inline Index nonZerosEstimate() const {
-      return m_argImpl.nonZerosEstimate();
-    }
+}  // end namespace internal
 
-    class InnerIterator : public EvalIterator
-    {
-    public:
-      EIGEN_STRONG_INLINE InnerIterator(const unary_evaluator& unaryOp, Index outer)
-        : EvalIterator(unaryOp.m_argImpl,outer)
-      {}
-      
-      Index row() const { return EvalIterator::col(); }
-      Index col() const { return EvalIterator::row(); }
-    };
-    
-    enum {
-      CoeffReadCost = evaluator<ArgType>::CoeffReadCost,
-      Flags = XprType::Flags
-    };
-    
-    explicit unary_evaluator(const XprType& op) :m_argImpl(op.nestedExpression()) {}
+}  // end namespace Eigen
 
-  protected:
-    evaluator<ArgType> m_argImpl;
-};
-
-} // end namespace internal
-
-} // end namespace Eigen
-
-#endif // EIGEN_SPARSETRANSPOSE_H
+#endif  // EIGEN_SPARSETRANSPOSE_H
diff --git a/Eigen/src/SparseCore/SparseTriangularView.h b/Eigen/src/SparseCore/SparseTriangularView.h
index 2e53114..a6c3eaa 100644
--- a/Eigen/src/SparseCore/SparseTriangularView.h
+++ b/Eigen/src/SparseCore/SparseTriangularView.h
@@ -17,176 +17,161 @@
 namespace Eigen {
 
 /** \ingroup SparseCore_Module
-  *
-  * \brief Base class for a triangular part in a \b sparse matrix
-  *
-  * This class is an abstract base class of class TriangularView, and objects of type TriangularViewImpl cannot be instantiated.
-  * It extends class TriangularView with additional methods which are available for sparse expressions only.
-  *
-  * \sa class TriangularView, SparseMatrixBase::triangularView()
-  */
-template<typename MatrixType, unsigned int Mode> class TriangularViewImpl<MatrixType,Mode,Sparse>
-  : public SparseMatrixBase<TriangularView<MatrixType,Mode> >
-{
-    enum { SkipFirst = ((Mode&Lower) && !(MatrixType::Flags&RowMajorBit))
-                    || ((Mode&Upper) &&  (MatrixType::Flags&RowMajorBit)),
-           SkipLast = !SkipFirst,
-           SkipDiag = (Mode&ZeroDiag) ? 1 : 0,
-           HasUnitDiag = (Mode&UnitDiag) ? 1 : 0
-    };
-    
-    typedef TriangularView<MatrixType,Mode> TriangularViewType;
-    
-  protected:
-    // dummy solve function to make TriangularView happy.
-    void solve() const;
+ *
+ * \brief Base class for a triangular part in a \b sparse matrix
+ *
+ * This class is an abstract base class of class TriangularView, and objects of type TriangularViewImpl cannot be
+ * instantiated. It extends class TriangularView with additional methods which are available for sparse expressions
+ * only.
+ *
+ * \sa class TriangularView, SparseMatrixBase::triangularView()
+ */
+template <typename MatrixType, unsigned int Mode>
+class TriangularViewImpl<MatrixType, Mode, Sparse> : public SparseMatrixBase<TriangularView<MatrixType, Mode> > {
+  enum {
+    SkipFirst =
+        ((Mode & Lower) && !(MatrixType::Flags & RowMajorBit)) || ((Mode & Upper) && (MatrixType::Flags & RowMajorBit)),
+    SkipLast = !SkipFirst,
+    SkipDiag = (Mode & ZeroDiag) ? 1 : 0,
+    HasUnitDiag = (Mode & UnitDiag) ? 1 : 0
+  };
 
-    typedef SparseMatrixBase<TriangularViewType> Base;
-  public:
-    
-    EIGEN_SPARSE_PUBLIC_INTERFACE(TriangularViewType)
-    
-    typedef typename MatrixType::Nested MatrixTypeNested;
-    typedef std::remove_reference_t<MatrixTypeNested> MatrixTypeNestedNonRef;
-    typedef internal::remove_all_t<MatrixTypeNested> MatrixTypeNestedCleaned;
+  typedef TriangularView<MatrixType, Mode> TriangularViewType;
 
-    template<typename RhsType, typename DstType>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE void _solve_impl(const RhsType &rhs, DstType &dst) const {
-      if(!(internal::is_same<RhsType,DstType>::value && internal::extract_data(dst) == internal::extract_data(rhs)))
-        dst = rhs;
-      this->solveInPlace(dst);
-    }
+ protected:
+  // dummy solve function to make TriangularView happy.
+  void solve() const;
 
-    /** Applies the inverse of \c *this to the dense vector or matrix \a other, "in-place" */
-    template<typename OtherDerived> void solveInPlace(MatrixBase<OtherDerived>& other) const;
+  typedef SparseMatrixBase<TriangularViewType> Base;
 
-    /** Applies the inverse of \c *this to the sparse vector or matrix \a other, "in-place" */
-    template<typename OtherDerived> void solveInPlace(SparseMatrixBase<OtherDerived>& other) const;
-  
+ public:
+  EIGEN_SPARSE_PUBLIC_INTERFACE(TriangularViewType)
+
+  typedef typename MatrixType::Nested MatrixTypeNested;
+  typedef std::remove_reference_t<MatrixTypeNested> MatrixTypeNestedNonRef;
+  typedef internal::remove_all_t<MatrixTypeNested> MatrixTypeNestedCleaned;
+
+  template <typename RhsType, typename DstType>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void _solve_impl(const RhsType& rhs, DstType& dst) const {
+    if (!(internal::is_same<RhsType, DstType>::value && internal::extract_data(dst) == internal::extract_data(rhs)))
+      dst = rhs;
+    this->solveInPlace(dst);
+  }
+
+  /** Applies the inverse of \c *this to the dense vector or matrix \a other, "in-place" */
+  template <typename OtherDerived>
+  void solveInPlace(MatrixBase<OtherDerived>& other) const;
+
+  /** Applies the inverse of \c *this to the sparse vector or matrix \a other, "in-place" */
+  template <typename OtherDerived>
+  void solveInPlace(SparseMatrixBase<OtherDerived>& other) const;
 };
 
 namespace internal {
 
-template<typename ArgType, unsigned int Mode>
-struct unary_evaluator<TriangularView<ArgType,Mode>, IteratorBased>
- : evaluator_base<TriangularView<ArgType,Mode> >
-{
-  typedef TriangularView<ArgType,Mode> XprType;
-  
-protected:
-  
+template <typename ArgType, unsigned int Mode>
+struct unary_evaluator<TriangularView<ArgType, Mode>, IteratorBased> : evaluator_base<TriangularView<ArgType, Mode> > {
+  typedef TriangularView<ArgType, Mode> XprType;
+
+ protected:
   typedef typename XprType::Scalar Scalar;
   typedef typename XprType::StorageIndex StorageIndex;
   typedef typename evaluator<ArgType>::InnerIterator EvalIterator;
-  
-  enum { SkipFirst = ((Mode&Lower) && !(ArgType::Flags&RowMajorBit))
-                    || ((Mode&Upper) &&  (ArgType::Flags&RowMajorBit)),
-         SkipLast = !SkipFirst,
-         SkipDiag = (Mode&ZeroDiag) ? 1 : 0,
-         HasUnitDiag = (Mode&UnitDiag) ? 1 : 0
-  };
-  
-public:
-  
-  enum {
-    CoeffReadCost = evaluator<ArgType>::CoeffReadCost,
-    Flags = XprType::Flags
-  };
-    
-  explicit unary_evaluator(const XprType &xpr) : m_argImpl(xpr.nestedExpression()), m_arg(xpr.nestedExpression()) {}
-  
-  inline Index nonZerosEstimate() const {
-    return m_argImpl.nonZerosEstimate();
-  }
-  
-  class InnerIterator : public EvalIterator
-  {
-      typedef EvalIterator Base;
-    public:
 
-      EIGEN_STRONG_INLINE InnerIterator(const unary_evaluator& xprEval, Index outer)
-        : Base(xprEval.m_argImpl,outer), m_returnOne(false), m_containsDiag(Base::outer()<xprEval.m_arg.innerSize())
-      {
-        if(SkipFirst)
-        {
-          while((*this) && ((HasUnitDiag||SkipDiag)  ? this->index()<=outer : this->index()<outer))
-            Base::operator++();
-          if(HasUnitDiag)
-            m_returnOne = m_containsDiag;
-        }
-        else if(HasUnitDiag && ((!Base::operator bool()) || Base::index()>=Base::outer()))
-        {
-          if((!SkipFirst) && Base::operator bool())
-            Base::operator++();
+  enum {
+    SkipFirst =
+        ((Mode & Lower) && !(ArgType::Flags & RowMajorBit)) || ((Mode & Upper) && (ArgType::Flags & RowMajorBit)),
+    SkipLast = !SkipFirst,
+    SkipDiag = (Mode & ZeroDiag) ? 1 : 0,
+    HasUnitDiag = (Mode & UnitDiag) ? 1 : 0
+  };
+
+ public:
+  enum { CoeffReadCost = evaluator<ArgType>::CoeffReadCost, Flags = XprType::Flags };
+
+  explicit unary_evaluator(const XprType& xpr) : m_argImpl(xpr.nestedExpression()), m_arg(xpr.nestedExpression()) {}
+
+  inline Index nonZerosEstimate() const { return m_argImpl.nonZerosEstimate(); }
+
+  class InnerIterator : public EvalIterator {
+    typedef EvalIterator Base;
+
+   public:
+    EIGEN_STRONG_INLINE InnerIterator(const unary_evaluator& xprEval, Index outer)
+        : Base(xprEval.m_argImpl, outer),
+          m_returnOne(false),
+          m_containsDiag(Base::outer() < xprEval.m_arg.innerSize()) {
+      if (SkipFirst) {
+        while ((*this) && ((HasUnitDiag || SkipDiag) ? this->index() <= outer : this->index() < outer))
+          Base::operator++();
+        if (HasUnitDiag) m_returnOne = m_containsDiag;
+      } else if (HasUnitDiag && ((!Base::operator bool()) || Base::index() >= Base::outer())) {
+        if ((!SkipFirst) && Base::operator bool()) Base::operator++();
+        m_returnOne = m_containsDiag;
+      }
+    }
+
+    EIGEN_STRONG_INLINE InnerIterator& operator++() {
+      if (HasUnitDiag && m_returnOne)
+        m_returnOne = false;
+      else {
+        Base::operator++();
+        if (HasUnitDiag && (!SkipFirst) && ((!Base::operator bool()) || Base::index() >= Base::outer())) {
+          if ((!SkipFirst) && Base::operator bool()) Base::operator++();
           m_returnOne = m_containsDiag;
         }
       }
+      return *this;
+    }
 
-      EIGEN_STRONG_INLINE InnerIterator& operator++()
-      {
-        if(HasUnitDiag && m_returnOne)
-          m_returnOne = false;
+    EIGEN_STRONG_INLINE operator bool() const {
+      if (HasUnitDiag && m_returnOne) return true;
+      if (SkipFirst)
+        return Base::operator bool();
+      else {
+        if (SkipDiag)
+          return (Base::operator bool() && this->index() < this->outer());
         else
-        {
-          Base::operator++();
-          if(HasUnitDiag && (!SkipFirst) && ((!Base::operator bool()) || Base::index()>=Base::outer()))
-          {
-            if((!SkipFirst) && Base::operator bool())
-              Base::operator++();
-            m_returnOne = m_containsDiag;
-          }
-        }
-        return *this;
+          return (Base::operator bool() && this->index() <= this->outer());
       }
-      
-      EIGEN_STRONG_INLINE operator bool() const
-      {
-        if(HasUnitDiag && m_returnOne)
-          return true;
-        if(SkipFirst) return  Base::operator bool();
-        else
-        {
-          if (SkipDiag) return (Base::operator bool() && this->index() < this->outer());
-          else return (Base::operator bool() && this->index() <= this->outer());
-        }
-      }
+    }
 
-      inline Index row() const { return (ArgType::Flags&RowMajorBit ? Base::outer() : this->index()); }
-      inline Index col() const { return (ArgType::Flags&RowMajorBit ? this->index() : Base::outer()); }
-      inline StorageIndex index() const
-      {
-        if(HasUnitDiag && m_returnOne)  return internal::convert_index<StorageIndex>(Base::outer());
-        else                            return Base::index();
-      }
-      inline Scalar value() const
-      {
-        if(HasUnitDiag && m_returnOne)  return Scalar(1);
-        else                            return Base::value();
-      }
+    inline Index row() const { return (ArgType::Flags & RowMajorBit ? Base::outer() : this->index()); }
+    inline Index col() const { return (ArgType::Flags & RowMajorBit ? this->index() : Base::outer()); }
+    inline StorageIndex index() const {
+      if (HasUnitDiag && m_returnOne)
+        return internal::convert_index<StorageIndex>(Base::outer());
+      else
+        return Base::index();
+    }
+    inline Scalar value() const {
+      if (HasUnitDiag && m_returnOne)
+        return Scalar(1);
+      else
+        return Base::value();
+    }
 
-    protected:
-      bool m_returnOne;
-      bool m_containsDiag;
-    private:
-      Scalar& valueRef();
+   protected:
+    bool m_returnOne;
+    bool m_containsDiag;
+
+   private:
+    Scalar& valueRef();
   };
-  
-protected:
+
+ protected:
   evaluator<ArgType> m_argImpl;
   const ArgType& m_arg;
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-template<typename Derived>
-template<int Mode>
-inline const TriangularView<const Derived, Mode>
-SparseMatrixBase<Derived>::triangularView() const
-{
+template <typename Derived>
+template <int Mode>
+inline const TriangularView<const Derived, Mode> SparseMatrixBase<Derived>::triangularView() const {
   return TriangularView<const Derived, Mode>(derived());
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SPARSE_TRIANGULARVIEW_H
+#endif  // EIGEN_SPARSE_TRIANGULARVIEW_H
diff --git a/Eigen/src/SparseCore/SparseUtil.h b/Eigen/src/SparseCore/SparseUtil.h
index c9b5e83..33cedaf 100644
--- a/Eigen/src/SparseCore/SparseUtil.h
+++ b/Eigen/src/SparseCore/SparseUtil.h
@@ -13,7 +13,7 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 #ifdef NDEBUG
 #define EIGEN_DBG_SPARSE(X)
@@ -21,125 +21,149 @@
 #define EIGEN_DBG_SPARSE(X) X
 #endif
 
-#define EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(Derived, Op) \
-template<typename OtherDerived> \
-EIGEN_STRONG_INLINE Derived& operator Op(const Eigen::SparseMatrixBase<OtherDerived>& other) \
-{ \
-  return Base::operator Op(other.derived()); \
-} \
-EIGEN_STRONG_INLINE Derived& operator Op(const Derived& other) \
-{ \
-  return Base::operator Op(other); \
-}
+#define EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(Derived, Op)                                    \
+  template <typename OtherDerived>                                                               \
+  EIGEN_STRONG_INLINE Derived& operator Op(const Eigen::SparseMatrixBase<OtherDerived>& other) { \
+    return Base::operator Op(other.derived());                                                   \
+  }                                                                                              \
+  EIGEN_STRONG_INLINE Derived& operator Op(const Derived & other) { return Base::operator Op(other); }
 
 #define EIGEN_SPARSE_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, Op) \
-template<typename Other> \
-EIGEN_STRONG_INLINE Derived& operator Op(const Other& scalar) \
-{ \
-  return Base::operator Op(scalar); \
-}
+  template <typename Other>                                          \
+  EIGEN_STRONG_INLINE Derived& operator Op(const Other & scalar) {   \
+    return Base::operator Op(scalar);                                \
+  }
 
-#define EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATORS(Derived) \
-EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(Derived, =)
+#define EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATORS(Derived) EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(Derived, =)
 
+#define EIGEN_SPARSE_PUBLIC_INTERFACE(Derived) EIGEN_GENERIC_PUBLIC_INTERFACE(Derived)
 
-#define EIGEN_SPARSE_PUBLIC_INTERFACE(Derived) \
-  EIGEN_GENERIC_PUBLIC_INTERFACE(Derived)
+const int CoherentAccessPattern = 0x1;
+const int InnerRandomAccessPattern = 0x2 | CoherentAccessPattern;
+const int OuterRandomAccessPattern = 0x4 | CoherentAccessPattern;
+const int RandomAccessPattern = 0x8 | OuterRandomAccessPattern | InnerRandomAccessPattern;
 
-  
-const int CoherentAccessPattern     = 0x1;
-const int InnerRandomAccessPattern  = 0x2 | CoherentAccessPattern;
-const int OuterRandomAccessPattern  = 0x4 | CoherentAccessPattern;
-const int RandomAccessPattern       = 0x8 | OuterRandomAccessPattern | InnerRandomAccessPattern;
+template <typename Scalar_, int Flags_ = 0, typename StorageIndex_ = int>
+class SparseMatrix;
+template <typename Scalar_, int Flags_ = 0, typename StorageIndex_ = int>
+class SparseVector;
 
-template<typename Scalar_, int Flags_ = 0, typename StorageIndex_ = int>  class SparseMatrix;
-template<typename Scalar_, int Flags_ = 0, typename StorageIndex_ = int>  class SparseVector;
+template <typename MatrixType, unsigned int UpLo>
+class SparseSelfAdjointView;
+template <typename Lhs, typename Rhs>
+class SparseDiagonalProduct;
+template <typename MatrixType>
+class SparseView;
 
-template<typename MatrixType, unsigned int UpLo>  class SparseSelfAdjointView;
-template<typename Lhs, typename Rhs>              class SparseDiagonalProduct;
-template<typename MatrixType> class SparseView;
+template <typename Lhs, typename Rhs>
+class SparseSparseProduct;
+template <typename Lhs, typename Rhs>
+class SparseTimeDenseProduct;
+template <typename Lhs, typename Rhs>
+class DenseTimeSparseProduct;
+template <typename Lhs, typename Rhs, bool Transpose>
+class SparseDenseOuterProduct;
 
-template<typename Lhs, typename Rhs>        class SparseSparseProduct;
-template<typename Lhs, typename Rhs>        class SparseTimeDenseProduct;
-template<typename Lhs, typename Rhs>        class DenseTimeSparseProduct;
-template<typename Lhs, typename Rhs, bool Transpose> class SparseDenseOuterProduct;
+template <typename Lhs, typename Rhs>
+struct SparseSparseProductReturnType;
+template <typename Lhs, typename Rhs,
+          int InnerSize = internal::min_size_prefer_fixed(internal::traits<Lhs>::ColsAtCompileTime,
+                                                          internal::traits<Rhs>::RowsAtCompileTime)>
+struct DenseSparseProductReturnType;
 
-template<typename Lhs, typename Rhs> struct SparseSparseProductReturnType;
-template<typename Lhs, typename Rhs,
-         int InnerSize = internal::min_size_prefer_fixed(internal::traits<Lhs>::ColsAtCompileTime, internal::traits<Rhs>::RowsAtCompileTime)> struct DenseSparseProductReturnType;
-         
-template<typename Lhs, typename Rhs,
-         int InnerSize = internal::min_size_prefer_fixed(internal::traits<Lhs>::ColsAtCompileTime, internal::traits<Rhs>::RowsAtCompileTime)> struct SparseDenseProductReturnType;
-template<typename MatrixType,int UpLo> class SparseSymmetricPermutationProduct;
+template <typename Lhs, typename Rhs,
+          int InnerSize = internal::min_size_prefer_fixed(internal::traits<Lhs>::ColsAtCompileTime,
+                                                          internal::traits<Rhs>::RowsAtCompileTime)>
+struct SparseDenseProductReturnType;
+template <typename MatrixType, int UpLo>
+class SparseSymmetricPermutationProduct;
 
 namespace internal {
 
-template<typename T,int Rows,int Cols,int Flags> struct sparse_eval;
+template <typename T, int Rows, int Cols, int Flags>
+struct sparse_eval;
 
-template<typename T> struct eval<T,Sparse>
-  : sparse_eval<T, traits<T>::RowsAtCompileTime,traits<T>::ColsAtCompileTime,traits<T>::Flags>
-{};
-
-template<typename T,int Cols,int Flags> struct sparse_eval<T,1,Cols,Flags> {
-    typedef typename traits<T>::Scalar Scalar_;
-    typedef typename traits<T>::StorageIndex StorageIndex_;
-  public:
-    typedef SparseVector<Scalar_, RowMajor, StorageIndex_> type;
+template <typename T>
+struct eval<T, Sparse> : sparse_eval<T, traits<T>::RowsAtCompileTime, traits<T>::ColsAtCompileTime, traits<T>::Flags> {
 };
 
-template<typename T,int Rows,int Flags> struct sparse_eval<T,Rows,1,Flags> {
-    typedef typename traits<T>::Scalar Scalar_;
-    typedef typename traits<T>::StorageIndex StorageIndex_;
-  public:
-    typedef SparseVector<Scalar_, ColMajor, StorageIndex_> type;
+template <typename T, int Cols, int Flags>
+struct sparse_eval<T, 1, Cols, Flags> {
+  typedef typename traits<T>::Scalar Scalar_;
+  typedef typename traits<T>::StorageIndex StorageIndex_;
+
+ public:
+  typedef SparseVector<Scalar_, RowMajor, StorageIndex_> type;
+};
+
+template <typename T, int Rows, int Flags>
+struct sparse_eval<T, Rows, 1, Flags> {
+  typedef typename traits<T>::Scalar Scalar_;
+  typedef typename traits<T>::StorageIndex StorageIndex_;
+
+ public:
+  typedef SparseVector<Scalar_, ColMajor, StorageIndex_> type;
 };
 
 // TODO this seems almost identical to plain_matrix_type<T, Sparse>
-template<typename T,int Rows,int Cols,int Flags> struct sparse_eval {
-    typedef typename traits<T>::Scalar Scalar_;
-    typedef typename traits<T>::StorageIndex StorageIndex_;
-    enum { Options_ = ((Flags&RowMajorBit)==RowMajorBit) ? RowMajor : ColMajor };
-  public:
-    typedef SparseMatrix<Scalar_, Options_, StorageIndex_> type;
-};
-
-template<typename T,int Flags> struct sparse_eval<T,1,1,Flags> {
-    typedef typename traits<T>::Scalar Scalar_;
-  public:
-    typedef Matrix<Scalar_, 1, 1> type;
-};
-
-template<typename T> struct plain_matrix_type<T,Sparse>
-{
+template <typename T, int Rows, int Cols, int Flags>
+struct sparse_eval {
   typedef typename traits<T>::Scalar Scalar_;
   typedef typename traits<T>::StorageIndex StorageIndex_;
-  enum { Options_ = ((evaluator<T>::Flags&RowMajorBit)==RowMajorBit) ? RowMajor : ColMajor };
-  public:
-    typedef SparseMatrix<Scalar_, Options_, StorageIndex_> type;
+  enum { Options_ = ((Flags & RowMajorBit) == RowMajorBit) ? RowMajor : ColMajor };
+
+ public:
+  typedef SparseMatrix<Scalar_, Options_, StorageIndex_> type;
 };
 
-template<typename T>
-struct plain_object_eval<T,Sparse>
-  : sparse_eval<T, traits<T>::RowsAtCompileTime,traits<T>::ColsAtCompileTime, evaluator<T>::Flags>
-{};
+template <typename T, int Flags>
+struct sparse_eval<T, 1, 1, Flags> {
+  typedef typename traits<T>::Scalar Scalar_;
 
-template<typename Decomposition, typename RhsType>
-struct solve_traits<Decomposition,RhsType,Sparse>
-{
-  typedef typename sparse_eval<RhsType, RhsType::RowsAtCompileTime, RhsType::ColsAtCompileTime,traits<RhsType>::Flags>::type PlainObject;
+ public:
+  typedef Matrix<Scalar_, 1, 1> type;
 };
 
-template<typename Derived>
-struct generic_xpr_base<Derived, MatrixXpr, Sparse>
-{
+template <typename T>
+struct plain_matrix_type<T, Sparse> {
+  typedef typename traits<T>::Scalar Scalar_;
+  typedef typename traits<T>::StorageIndex StorageIndex_;
+  enum { Options_ = ((evaluator<T>::Flags & RowMajorBit) == RowMajorBit) ? RowMajor : ColMajor };
+
+ public:
+  typedef SparseMatrix<Scalar_, Options_, StorageIndex_> type;
+};
+
+template <typename T>
+struct plain_object_eval<T, Sparse>
+    : sparse_eval<T, traits<T>::RowsAtCompileTime, traits<T>::ColsAtCompileTime, evaluator<T>::Flags> {};
+
+template <typename Decomposition, typename RhsType>
+struct solve_traits<Decomposition, RhsType, Sparse> {
+  typedef typename sparse_eval<RhsType, RhsType::RowsAtCompileTime, RhsType::ColsAtCompileTime,
+                               traits<RhsType>::Flags>::type PlainObject;
+};
+
+template <typename Derived>
+struct generic_xpr_base<Derived, MatrixXpr, Sparse> {
   typedef SparseMatrixBase<Derived> type;
 };
 
-struct SparseTriangularShape  { static std::string debugName() { return "SparseTriangularShape"; } };
-struct SparseSelfAdjointShape { static std::string debugName() { return "SparseSelfAdjointShape"; } };
+struct SparseTriangularShape {
+  static std::string debugName() { return "SparseTriangularShape"; }
+};
+struct SparseSelfAdjointShape {
+  static std::string debugName() { return "SparseSelfAdjointShape"; }
+};
 
-template<> struct glue_shapes<SparseShape,SelfAdjointShape> { typedef SparseSelfAdjointShape type;  };
-template<> struct glue_shapes<SparseShape,TriangularShape > { typedef SparseTriangularShape  type;  };
+template <>
+struct glue_shapes<SparseShape, SelfAdjointShape> {
+  typedef SparseSelfAdjointShape type;
+};
+template <>
+struct glue_shapes<SparseShape, TriangularShape> {
+  typedef SparseTriangularShape type;
+};
 
 // return type of SparseCompressedBase::lower_bound;
 struct LowerBoundIndex {
@@ -149,25 +173,22 @@
   bool found;
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \ingroup SparseCore_Module
-  *
-  * \class Triplet
-  *
-  * \brief A small structure to hold a non zero as a triplet (i,j,value).
-  *
-  * \sa SparseMatrix::setFromTriplets()
-  */
-template<typename Scalar, typename StorageIndex=typename SparseMatrix<Scalar>::StorageIndex >
-class Triplet
-{
-public:
+ *
+ * \class Triplet
+ *
+ * \brief A small structure to hold a non zero as a triplet (i,j,value).
+ *
+ * \sa SparseMatrix::setFromTriplets()
+ */
+template <typename Scalar, typename StorageIndex = typename SparseMatrix<Scalar>::StorageIndex>
+class Triplet {
+ public:
   Triplet() : m_row(0), m_col(0), m_value(0) {}
 
-  Triplet(const StorageIndex& i, const StorageIndex& j, const Scalar& v = Scalar(0))
-    : m_row(i), m_col(j), m_value(v)
-  {}
+  Triplet(const StorageIndex& i, const StorageIndex& j, const Scalar& v = Scalar(0)) : m_row(i), m_col(j), m_value(v) {}
 
   /** \returns the row index of the element */
   const StorageIndex& row() const { return m_row; }
@@ -177,11 +198,12 @@
 
   /** \returns the value of the element */
   const Scalar& value() const { return m_value; }
-protected:
+
+ protected:
   StorageIndex m_row, m_col;
   Scalar m_value;
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SPARSEUTIL_H
+#endif  // EIGEN_SPARSEUTIL_H
diff --git a/Eigen/src/SparseCore/SparseVector.h b/Eigen/src/SparseCore/SparseVector.h
index fd5eb19..0733718 100644
--- a/Eigen/src/SparseCore/SparseVector.h
+++ b/Eigen/src/SparseCore/SparseVector.h
@@ -13,25 +13,24 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 /** \ingroup SparseCore_Module
-  * \class SparseVector
-  *
-  * \brief a sparse vector class
-  *
-  * \tparam Scalar_ the scalar type, i.e. the type of the coefficients
-  *
-  * See http://www.netlib.org/linalg/html_templates/node91.html for details on the storage scheme.
-  *
-  * This class can be extended with the help of the plugin mechanism described on the page
-  * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_SPARSEVECTOR_PLUGIN.
-  */
+ * \class SparseVector
+ *
+ * \brief a sparse vector class
+ *
+ * \tparam Scalar_ the scalar type, i.e. the type of the coefficients
+ *
+ * See http://www.netlib.org/linalg/html_templates/node91.html for details on the storage scheme.
+ *
+ * This class can be extended with the help of the plugin mechanism described on the page
+ * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_SPARSEVECTOR_PLUGIN.
+ */
 
 namespace internal {
-template<typename Scalar_, int Options_, typename StorageIndex_>
-struct traits<SparseVector<Scalar_, Options_, StorageIndex_> >
-{
+template <typename Scalar_, int Options_, typename StorageIndex_>
+struct traits<SparseVector<Scalar_, Options_, StorageIndex_> > {
   typedef Scalar_ Scalar;
   typedef StorageIndex_ StorageIndex;
   typedef Sparse StorageKind;
@@ -49,452 +48,389 @@
 };
 
 // Sparse-Vector-Assignment kinds:
-enum {
-  SVA_RuntimeSwitch,
-  SVA_Inner,
-  SVA_Outer
-};
+enum { SVA_RuntimeSwitch, SVA_Inner, SVA_Outer };
 
-template< typename Dest, typename Src,
-          int AssignmentKind = !bool(Src::IsVectorAtCompileTime) ? SVA_RuntimeSwitch
-                             : Src::InnerSizeAtCompileTime==1 ? SVA_Outer
-                             : SVA_Inner>
+template <typename Dest, typename Src,
+          int AssignmentKind = !bool(Src::IsVectorAtCompileTime)  ? SVA_RuntimeSwitch
+                               : Src::InnerSizeAtCompileTime == 1 ? SVA_Outer
+                                                                  : SVA_Inner>
 struct sparse_vector_assign_selector;
 
-}
+}  // namespace internal
 
-template<typename Scalar_, int Options_, typename StorageIndex_>
-class SparseVector
-  : public SparseCompressedBase<SparseVector<Scalar_, Options_, StorageIndex_> >
-{
-    typedef SparseCompressedBase<SparseVector> Base;
-    using Base::convert_index;
-  public:
-    EIGEN_SPARSE_PUBLIC_INTERFACE(SparseVector)
-    EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(SparseVector, +=)
-    EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(SparseVector, -=)
-    
-    typedef internal::CompressedStorage<Scalar,StorageIndex> Storage;
-    enum { IsColVector = internal::traits<SparseVector>::IsColVector };
-    
-    enum {
-      Options = Options_
-    };
-    
-    EIGEN_STRONG_INLINE Index rows() const { return IsColVector ? m_size : 1; }
-    EIGEN_STRONG_INLINE Index cols() const { return IsColVector ? 1 : m_size; }
-    EIGEN_STRONG_INLINE Index innerSize() const { return m_size; }
-    EIGEN_STRONG_INLINE Index outerSize() const { return 1; }
+template <typename Scalar_, int Options_, typename StorageIndex_>
+class SparseVector : public SparseCompressedBase<SparseVector<Scalar_, Options_, StorageIndex_> > {
+  typedef SparseCompressedBase<SparseVector> Base;
+  using Base::convert_index;
 
-    EIGEN_STRONG_INLINE const Scalar* valuePtr() const { return m_data.valuePtr(); }
-    EIGEN_STRONG_INLINE Scalar* valuePtr() { return m_data.valuePtr(); }
+ public:
+  EIGEN_SPARSE_PUBLIC_INTERFACE(SparseVector)
+  EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(SparseVector, +=)
+  EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(SparseVector, -=)
 
-    EIGEN_STRONG_INLINE const StorageIndex* innerIndexPtr() const { return m_data.indexPtr(); }
-    EIGEN_STRONG_INLINE StorageIndex* innerIndexPtr() { return m_data.indexPtr(); }
+  typedef internal::CompressedStorage<Scalar, StorageIndex> Storage;
+  enum { IsColVector = internal::traits<SparseVector>::IsColVector };
 
-    inline const StorageIndex* outerIndexPtr() const { return 0; }
-    inline StorageIndex* outerIndexPtr() { return 0; }
-    inline const StorageIndex* innerNonZeroPtr() const { return 0; }
-    inline StorageIndex* innerNonZeroPtr() { return 0; }
-    
-    /** \internal */
-    inline Storage& data() { return m_data; }
-    /** \internal */
-    inline const Storage& data() const { return m_data; }
+  enum { Options = Options_ };
 
-    inline Scalar coeff(Index row, Index col) const
-    {
-      eigen_assert(IsColVector ? (col==0 && row>=0 && row<m_size) : (row==0 && col>=0 && col<m_size));
-      return coeff(IsColVector ? row : col);
+  EIGEN_STRONG_INLINE Index rows() const { return IsColVector ? m_size : 1; }
+  EIGEN_STRONG_INLINE Index cols() const { return IsColVector ? 1 : m_size; }
+  EIGEN_STRONG_INLINE Index innerSize() const { return m_size; }
+  EIGEN_STRONG_INLINE Index outerSize() const { return 1; }
+
+  EIGEN_STRONG_INLINE const Scalar* valuePtr() const { return m_data.valuePtr(); }
+  EIGEN_STRONG_INLINE Scalar* valuePtr() { return m_data.valuePtr(); }
+
+  EIGEN_STRONG_INLINE const StorageIndex* innerIndexPtr() const { return m_data.indexPtr(); }
+  EIGEN_STRONG_INLINE StorageIndex* innerIndexPtr() { return m_data.indexPtr(); }
+
+  inline const StorageIndex* outerIndexPtr() const { return 0; }
+  inline StorageIndex* outerIndexPtr() { return 0; }
+  inline const StorageIndex* innerNonZeroPtr() const { return 0; }
+  inline StorageIndex* innerNonZeroPtr() { return 0; }
+
+  /** \internal */
+  inline Storage& data() { return m_data; }
+  /** \internal */
+  inline const Storage& data() const { return m_data; }
+
+  inline Scalar coeff(Index row, Index col) const {
+    eigen_assert(IsColVector ? (col == 0 && row >= 0 && row < m_size) : (row == 0 && col >= 0 && col < m_size));
+    return coeff(IsColVector ? row : col);
+  }
+  inline Scalar coeff(Index i) const {
+    eigen_assert(i >= 0 && i < m_size);
+    return m_data.at(StorageIndex(i));
+  }
+
+  inline Scalar& coeffRef(Index row, Index col) {
+    eigen_assert(IsColVector ? (col == 0 && row >= 0 && row < m_size) : (row == 0 && col >= 0 && col < m_size));
+    return coeffRef(IsColVector ? row : col);
+  }
+
+  /** \returns a reference to the coefficient value at given index \a i
+   * This operation involes a log(rho*size) binary search. If the coefficient does not
+   * exist yet, then a sorted insertion into a sequential buffer is performed.
+   *
+   * This insertion might be very costly if the number of nonzeros above \a i is large.
+   */
+  inline Scalar& coeffRef(Index i) {
+    eigen_assert(i >= 0 && i < m_size);
+
+    return m_data.atWithInsertion(StorageIndex(i));
+  }
+
+ public:
+  typedef typename Base::InnerIterator InnerIterator;
+  typedef typename Base::ReverseInnerIterator ReverseInnerIterator;
+
+  inline void setZero() { m_data.clear(); }
+
+  /** \returns the number of non zero coefficients */
+  inline Index nonZeros() const { return m_data.size(); }
+
+  inline void startVec(Index outer) {
+    EIGEN_UNUSED_VARIABLE(outer);
+    eigen_assert(outer == 0);
+  }
+
+  inline Scalar& insertBackByOuterInner(Index outer, Index inner) {
+    EIGEN_UNUSED_VARIABLE(outer);
+    eigen_assert(outer == 0);
+    return insertBack(inner);
+  }
+  inline Scalar& insertBack(Index i) {
+    m_data.append(0, i);
+    return m_data.value(m_data.size() - 1);
+  }
+
+  Scalar& insertBackByOuterInnerUnordered(Index outer, Index inner) {
+    EIGEN_UNUSED_VARIABLE(outer);
+    eigen_assert(outer == 0);
+    return insertBackUnordered(inner);
+  }
+  inline Scalar& insertBackUnordered(Index i) {
+    m_data.append(0, i);
+    return m_data.value(m_data.size() - 1);
+  }
+
+  inline Scalar& insert(Index row, Index col) {
+    eigen_assert(IsColVector ? (col == 0 && row >= 0 && row < m_size) : (row == 0 && col >= 0 && col < m_size));
+
+    Index inner = IsColVector ? row : col;
+    Index outer = IsColVector ? col : row;
+    EIGEN_ONLY_USED_FOR_DEBUG(outer);
+    eigen_assert(outer == 0);
+    return insert(inner);
+  }
+  Scalar& insert(Index i) {
+    eigen_assert(i >= 0 && i < m_size);
+
+    Index startId = 0;
+    Index p = Index(m_data.size()) - 1;
+    // TODO smart realloc
+    m_data.resize(p + 2, 1);
+
+    while ((p >= startId) && (m_data.index(p) > i)) {
+      m_data.index(p + 1) = m_data.index(p);
+      m_data.value(p + 1) = m_data.value(p);
+      --p;
     }
-    inline Scalar coeff(Index i) const
-    {
-      eigen_assert(i>=0 && i<m_size);
-      return m_data.at(StorageIndex(i));
-    }
+    m_data.index(p + 1) = convert_index(i);
+    m_data.value(p + 1) = 0;
+    return m_data.value(p + 1);
+  }
 
-    inline Scalar& coeffRef(Index row, Index col)
-    {
-      eigen_assert(IsColVector ? (col==0 && row>=0 && row<m_size) : (row==0 && col>=0 && col<m_size));
-      return coeffRef(IsColVector ? row : col);
-    }
+  /**
+   */
+  inline void reserve(Index reserveSize) { m_data.reserve(reserveSize); }
 
-    /** \returns a reference to the coefficient value at given index \a i
-      * This operation involes a log(rho*size) binary search. If the coefficient does not
-      * exist yet, then a sorted insertion into a sequential buffer is performed.
-      *
-      * This insertion might be very costly if the number of nonzeros above \a i is large.
-      */
-    inline Scalar& coeffRef(Index i)
-    {
-      eigen_assert(i>=0 && i<m_size);
+  inline void finalize() {}
 
-      return m_data.atWithInsertion(StorageIndex(i));
-    }
+  /** \copydoc SparseMatrix::prune(const Scalar&,const RealScalar&) */
+  Index prune(const Scalar& reference, const RealScalar& epsilon = NumTraits<RealScalar>::dummy_precision()) {
+    return prune([&](const Scalar& val) { return !internal::isMuchSmallerThan(val, reference, epsilon); });
+  }
 
-  public:
-
-    typedef typename Base::InnerIterator InnerIterator;
-    typedef typename Base::ReverseInnerIterator ReverseInnerIterator;
-
-    inline void setZero() { m_data.clear(); }
-
-    /** \returns the number of non zero coefficients */
-    inline Index nonZeros() const  { return m_data.size(); }
-
-    inline void startVec(Index outer)
-    {
-      EIGEN_UNUSED_VARIABLE(outer);
-      eigen_assert(outer==0);
-    }
-
-    inline Scalar& insertBackByOuterInner(Index outer, Index inner)
-    {
-      EIGEN_UNUSED_VARIABLE(outer);
-      eigen_assert(outer==0);
-      return insertBack(inner);
-    }
-    inline Scalar& insertBack(Index i)
-    {
-      m_data.append(0, i);
-      return m_data.value(m_data.size()-1);
-    }
-    
-    Scalar& insertBackByOuterInnerUnordered(Index outer, Index inner)
-    {
-      EIGEN_UNUSED_VARIABLE(outer);
-      eigen_assert(outer==0);
-      return insertBackUnordered(inner);
-    }
-    inline Scalar& insertBackUnordered(Index i)
-    {
-      m_data.append(0, i);
-      return m_data.value(m_data.size()-1);
-    }
-
-    inline Scalar& insert(Index row, Index col)
-    {
-      eigen_assert(IsColVector ? (col==0 && row>=0 && row<m_size) : (row==0 && col>=0 && col<m_size));
-      
-      Index inner = IsColVector ? row : col;
-      Index outer = IsColVector ? col : row;
-      EIGEN_ONLY_USED_FOR_DEBUG(outer);
-      eigen_assert(outer==0);
-      return insert(inner);
-    }
-    Scalar& insert(Index i)
-    {
-      eigen_assert(i>=0 && i<m_size);
-      
-      Index startId = 0;
-      Index p = Index(m_data.size()) - 1;
-      // TODO smart realloc
-      m_data.resize(p+2,1);
-
-      while ( (p >= startId) && (m_data.index(p) > i) )
-      {
-        m_data.index(p+1) = m_data.index(p);
-        m_data.value(p+1) = m_data.value(p);
-        --p;
+  /**
+   * \brief Prunes the entries of the vector based on a `predicate`
+   * \tparam F Type of the predicate.
+   * \param keep_predicate The predicate that is used to test whether a value should be kept. A callable that
+   * gets passed om a `Scalar` value and returns a boolean. If the predicate returns true, the value is kept.
+   * \return The new number of structural non-zeros.
+   */
+  template <class F>
+  Index prune(F&& keep_predicate) {
+    Index k = 0;
+    Index n = m_data.size();
+    for (Index i = 0; i < n; ++i) {
+      if (keep_predicate(m_data.value(i))) {
+        m_data.value(k) = std::move(m_data.value(i));
+        m_data.index(k) = m_data.index(i);
+        ++k;
       }
-      m_data.index(p+1) = convert_index(i);
-      m_data.value(p+1) = 0;
-      return m_data.value(p+1);
     }
+    m_data.resize(k);
+    return k;
+  }
 
-    /**
-      */
-    inline void reserve(Index reserveSize) { m_data.reserve(reserveSize); }
+  /** Resizes the sparse vector to \a rows x \a cols
+   *
+   * This method is provided for compatibility with matrices.
+   * For a column vector, \a cols must be equal to 1.
+   * For a row vector, \a rows must be equal to 1.
+   *
+   * \sa resize(Index)
+   */
+  void resize(Index rows, Index cols) {
+    eigen_assert((IsColVector ? cols : rows) == 1 && "Outer dimension must equal 1");
+    resize(IsColVector ? rows : cols);
+  }
 
+  /** Resizes the sparse vector to \a newSize
+   * This method deletes all entries, thus leaving an empty sparse vector
+   *
+   * \sa  conservativeResize(), setZero() */
+  void resize(Index newSize) {
+    m_size = newSize;
+    m_data.clear();
+  }
 
-    inline void finalize() {}
-
-    /** \copydoc SparseMatrix::prune(const Scalar&,const RealScalar&) */
-    Index prune(const Scalar& reference, const RealScalar& epsilon = NumTraits<RealScalar>::dummy_precision()) {
-      return prune([&](const Scalar& val){ return !internal::isMuchSmallerThan(val, reference, epsilon); });
+  /** Resizes the sparse vector to \a newSize, while leaving old values untouched.
+   *
+   * If the size of the vector is decreased, then the storage of the out-of bounds coefficients is kept and reserved.
+   * Call .data().squeeze() to free extra memory.
+   *
+   * \sa reserve(), setZero()
+   */
+  void conservativeResize(Index newSize) {
+    if (newSize < m_size) {
+      Index i = 0;
+      while (i < m_data.size() && m_data.index(i) < newSize) ++i;
+      m_data.resize(i);
     }
+    m_size = newSize;
+  }
 
-    /**
-     * \brief Prunes the entries of the vector based on a `predicate`
-     * \tparam F Type of the predicate.
-     * \param keep_predicate The predicate that is used to test whether a value should be kept. A callable that
-     * gets passed om a `Scalar` value and returns a boolean. If the predicate returns true, the value is kept.
-     * \return The new number of structural non-zeros.
-     */
-    template<class F>
-    Index prune(F&& keep_predicate)
-    {
-      Index k = 0;
-      Index n = m_data.size();
-      for (Index i = 0; i < n; ++i)
-      {
-        if (keep_predicate(m_data.value(i)))
-        {
-          m_data.value(k) = std::move(m_data.value(i));
-          m_data.index(k) = m_data.index(i);
-          ++k;
-        }
-      }
-      m_data.resize(k);
-      return k;
+  void resizeNonZeros(Index size) { m_data.resize(size); }
+
+  inline SparseVector() : m_size(0) { resize(0); }
+
+  explicit inline SparseVector(Index size) : m_size(0) { resize(size); }
+
+  inline SparseVector(Index rows, Index cols) : m_size(0) { resize(rows, cols); }
+
+  template <typename OtherDerived>
+  inline SparseVector(const SparseMatrixBase<OtherDerived>& other) : m_size(0) {
+#ifdef EIGEN_SPARSE_CREATE_TEMPORARY_PLUGIN
+    EIGEN_SPARSE_CREATE_TEMPORARY_PLUGIN
+#endif
+    *this = other.derived();
+  }
+
+  inline SparseVector(const SparseVector& other) : Base(other), m_size(0) { *this = other.derived(); }
+
+  /** Swaps the values of \c *this and \a other.
+   * Overloaded for performance: this version performs a \em shallow swap by swapping pointers and attributes only.
+   * \sa SparseMatrixBase::swap()
+   */
+  inline void swap(SparseVector& other) {
+    std::swap(m_size, other.m_size);
+    m_data.swap(other.m_data);
+  }
+
+  template <int OtherOptions>
+  inline void swap(SparseMatrix<Scalar, OtherOptions, StorageIndex>& other) {
+    eigen_assert(other.outerSize() == 1);
+    std::swap(m_size, other.m_innerSize);
+    m_data.swap(other.m_data);
+  }
+
+  inline SparseVector& operator=(const SparseVector& other) {
+    if (other.isRValue()) {
+      swap(other.const_cast_derived());
+    } else {
+      resize(other.size());
+      m_data = other.m_data;
     }
+    return *this;
+  }
 
-    /** Resizes the sparse vector to \a rows x \a cols
-      *
-      * This method is provided for compatibility with matrices.
-      * For a column vector, \a cols must be equal to 1.
-      * For a row vector, \a rows must be equal to 1.
-      *
-      * \sa resize(Index)
-      */
-    void resize(Index rows, Index cols)
-    {
-      eigen_assert((IsColVector ? cols : rows)==1 && "Outer dimension must equal 1");
-      resize(IsColVector ? rows : cols);
-    }
+  template <typename OtherDerived>
+  inline SparseVector& operator=(const SparseMatrixBase<OtherDerived>& other) {
+    SparseVector tmp(other.size());
+    internal::sparse_vector_assign_selector<SparseVector, OtherDerived>::run(tmp, other.derived());
+    this->swap(tmp);
+    return *this;
+  }
 
-    /** Resizes the sparse vector to \a newSize
-      * This method deletes all entries, thus leaving an empty sparse vector
-      *
-      * \sa  conservativeResize(), setZero() */
-    void resize(Index newSize)
-    {
-      m_size = newSize;
-      m_data.clear();
-    }
-
-    /** Resizes the sparse vector to \a newSize, while leaving old values untouched.
-      *
-      * If the size of the vector is decreased, then the storage of the out-of bounds coefficients is kept and reserved.
-      * Call .data().squeeze() to free extra memory.
-      *
-      * \sa reserve(), setZero()
-      */
-    void conservativeResize(Index newSize)
-    {
-      if (newSize < m_size)
-      {
-        Index i = 0;
-        while (i<m_data.size() && m_data.index(i)<newSize) ++i;
-        m_data.resize(i);
-      }
-      m_size = newSize;
-    }
-
-    void resizeNonZeros(Index size) { m_data.resize(size); }
-
-    inline SparseVector() : m_size(0) { resize(0); }
-
-    explicit inline SparseVector(Index size) : m_size(0) { resize(size); }
-
-    inline SparseVector(Index rows, Index cols) : m_size(0) { resize(rows,cols); }
-
-    template<typename OtherDerived>
-    inline SparseVector(const SparseMatrixBase<OtherDerived>& other)
-      : m_size(0)
-    {
-      #ifdef EIGEN_SPARSE_CREATE_TEMPORARY_PLUGIN
-        EIGEN_SPARSE_CREATE_TEMPORARY_PLUGIN
-      #endif
-      *this = other.derived();
-    }
-
-    inline SparseVector(const SparseVector& other)
-      : Base(other), m_size(0)
-    {
-      *this = other.derived();
-    }
-
-    /** Swaps the values of \c *this and \a other.
-      * Overloaded for performance: this version performs a \em shallow swap by swapping pointers and attributes only.
-      * \sa SparseMatrixBase::swap()
-      */
-    inline void swap(SparseVector& other)
-    {
-      std::swap(m_size, other.m_size);
-      m_data.swap(other.m_data);
-    }
-
-    template<int OtherOptions>
-    inline void swap(SparseMatrix<Scalar,OtherOptions,StorageIndex>& other)
-    {
-      eigen_assert(other.outerSize()==1);
-      std::swap(m_size, other.m_innerSize);
-      m_data.swap(other.m_data);
-    }
-
-    inline SparseVector& operator=(const SparseVector& other)
-    {
-      if (other.isRValue())
-      {
-        swap(other.const_cast_derived());
-      }
-      else
-      {
-        resize(other.size());
-        m_data = other.m_data;
-      }
-      return *this;
-    }
-
-    template<typename OtherDerived>
-    inline SparseVector& operator=(const SparseMatrixBase<OtherDerived>& other)
-    {
-      SparseVector tmp(other.size());
-      internal::sparse_vector_assign_selector<SparseVector,OtherDerived>::run(tmp,other.derived());
-      this->swap(tmp);
-      return *this;
-    }
-
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    template<typename Lhs, typename Rhs>
-    inline SparseVector& operator=(const SparseSparseProduct<Lhs,Rhs>& product)
-    {
-      return Base::operator=(product);
-    }
-    #endif
-
-#ifndef EIGEN_NO_IO
-    friend std::ostream & operator << (std::ostream & s, const SparseVector& m)
-    {
-      for (Index i=0; i<m.nonZeros(); ++i)
-        s << "(" << m.m_data.value(i) << "," << m.m_data.index(i) << ") ";
-      s << std::endl;
-      return s;
-    }
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  template <typename Lhs, typename Rhs>
+  inline SparseVector& operator=(const SparseSparseProduct<Lhs, Rhs>& product) {
+    return Base::operator=(product);
+  }
 #endif
 
-    /** Destructor */
-    inline ~SparseVector() {}
+#ifndef EIGEN_NO_IO
+  friend std::ostream& operator<<(std::ostream& s, const SparseVector& m) {
+    for (Index i = 0; i < m.nonZeros(); ++i) s << "(" << m.m_data.value(i) << "," << m.m_data.index(i) << ") ";
+    s << std::endl;
+    return s;
+  }
+#endif
 
-    /** Overloaded for performance */
-    Scalar sum() const;
+  /** Destructor */
+  inline ~SparseVector() {}
 
-  public:
+  /** Overloaded for performance */
+  Scalar sum() const;
 
-    /** \internal \deprecated use setZero() and reserve() */
-    EIGEN_DEPRECATED void startFill(Index reserve)
-    {
-      setZero();
-      m_data.reserve(reserve);
-    }
+ public:
+  /** \internal \deprecated use setZero() and reserve() */
+  EIGEN_DEPRECATED void startFill(Index reserve) {
+    setZero();
+    m_data.reserve(reserve);
+  }
 
-    /** \internal \deprecated use insertBack(Index,Index) */
-    EIGEN_DEPRECATED Scalar& fill(Index r, Index c)
-    {
-      eigen_assert(r==0 || c==0);
-      return fill(IsColVector ? r : c);
-    }
+  /** \internal \deprecated use insertBack(Index,Index) */
+  EIGEN_DEPRECATED Scalar& fill(Index r, Index c) {
+    eigen_assert(r == 0 || c == 0);
+    return fill(IsColVector ? r : c);
+  }
 
-    /** \internal \deprecated use insertBack(Index) */
-    EIGEN_DEPRECATED Scalar& fill(Index i)
-    {
-      m_data.append(0, i);
-      return m_data.value(m_data.size()-1);
-    }
+  /** \internal \deprecated use insertBack(Index) */
+  EIGEN_DEPRECATED Scalar& fill(Index i) {
+    m_data.append(0, i);
+    return m_data.value(m_data.size() - 1);
+  }
 
-    /** \internal \deprecated use insert(Index,Index) */
-    EIGEN_DEPRECATED Scalar& fillrand(Index r, Index c)
-    {
-      eigen_assert(r==0 || c==0);
-      return fillrand(IsColVector ? r : c);
-    }
+  /** \internal \deprecated use insert(Index,Index) */
+  EIGEN_DEPRECATED Scalar& fillrand(Index r, Index c) {
+    eigen_assert(r == 0 || c == 0);
+    return fillrand(IsColVector ? r : c);
+  }
 
-    /** \internal \deprecated use insert(Index) */
-    EIGEN_DEPRECATED Scalar& fillrand(Index i)
-    {
-      return insert(i);
-    }
+  /** \internal \deprecated use insert(Index) */
+  EIGEN_DEPRECATED Scalar& fillrand(Index i) { return insert(i); }
 
-    /** \internal \deprecated use finalize() */
-    EIGEN_DEPRECATED void endFill() {}
-    
-    // These two functions were here in the 3.1 release, so let's keep them in case some code rely on them.
-    /** \internal \deprecated use data() */
-    EIGEN_DEPRECATED Storage& _data() { return m_data; }
-    /** \internal \deprecated use data() */
-    EIGEN_DEPRECATED const Storage& _data() const { return m_data; }
-    
-#   ifdef EIGEN_SPARSEVECTOR_PLUGIN
-#     include EIGEN_SPARSEVECTOR_PLUGIN
-#   endif
+  /** \internal \deprecated use finalize() */
+  EIGEN_DEPRECATED void endFill() {}
 
-protected:
-    EIGEN_STATIC_ASSERT(NumTraits<StorageIndex>::IsSigned,THE_INDEX_TYPE_MUST_BE_A_SIGNED_TYPE)
-    EIGEN_STATIC_ASSERT((Options_&(ColMajor|RowMajor))==Options,INVALID_MATRIX_TEMPLATE_PARAMETERS)
+  // These two functions were here in the 3.1 release, so let's keep them in case some code rely on them.
+  /** \internal \deprecated use data() */
+  EIGEN_DEPRECATED Storage& _data() { return m_data; }
+  /** \internal \deprecated use data() */
+  EIGEN_DEPRECATED const Storage& _data() const { return m_data; }
 
-    Storage m_data;
-    Index m_size;
+#ifdef EIGEN_SPARSEVECTOR_PLUGIN
+#include EIGEN_SPARSEVECTOR_PLUGIN
+#endif
+
+ protected:
+  EIGEN_STATIC_ASSERT(NumTraits<StorageIndex>::IsSigned, THE_INDEX_TYPE_MUST_BE_A_SIGNED_TYPE)
+  EIGEN_STATIC_ASSERT((Options_ & (ColMajor | RowMajor)) == Options, INVALID_MATRIX_TEMPLATE_PARAMETERS)
+
+  Storage m_data;
+  Index m_size;
 };
 
 namespace internal {
 
-template<typename Scalar_, int Options_, typename Index_>
-struct evaluator<SparseVector<Scalar_,Options_,Index_> >
-  : evaluator_base<SparseVector<Scalar_,Options_,Index_> >
-{
-  typedef SparseVector<Scalar_,Options_,Index_> SparseVectorType;
+template <typename Scalar_, int Options_, typename Index_>
+struct evaluator<SparseVector<Scalar_, Options_, Index_> > : evaluator_base<SparseVector<Scalar_, Options_, Index_> > {
+  typedef SparseVector<Scalar_, Options_, Index_> SparseVectorType;
   typedef evaluator_base<SparseVectorType> Base;
   typedef typename SparseVectorType::InnerIterator InnerIterator;
   typedef typename SparseVectorType::ReverseInnerIterator ReverseInnerIterator;
-  
-  enum {
-    CoeffReadCost = NumTraits<Scalar_>::ReadCost,
-    Flags = SparseVectorType::Flags
-  };
+
+  enum { CoeffReadCost = NumTraits<Scalar_>::ReadCost, Flags = SparseVectorType::Flags };
 
   evaluator() : Base() {}
-  
-  explicit evaluator(const SparseVectorType &mat) : m_matrix(&mat)
-  {
-    EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
-  }
-  
-  inline Index nonZerosEstimate() const {
-    return m_matrix->nonZeros();
-  }
-  
+
+  explicit evaluator(const SparseVectorType& mat) : m_matrix(&mat) { EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost); }
+
+  inline Index nonZerosEstimate() const { return m_matrix->nonZeros(); }
+
   operator SparseVectorType&() { return m_matrix->const_cast_derived(); }
   operator const SparseVectorType&() const { return *m_matrix; }
-  
-  const SparseVectorType *m_matrix;
+
+  const SparseVectorType* m_matrix;
 };
 
-template< typename Dest, typename Src>
-struct sparse_vector_assign_selector<Dest,Src,SVA_Inner> {
+template <typename Dest, typename Src>
+struct sparse_vector_assign_selector<Dest, Src, SVA_Inner> {
   static void run(Dest& dst, const Src& src) {
-    eigen_internal_assert(src.innerSize()==src.size());
+    eigen_internal_assert(src.innerSize() == src.size());
     typedef internal::evaluator<Src> SrcEvaluatorType;
     SrcEvaluatorType srcEval(src);
-    for(typename SrcEvaluatorType::InnerIterator it(srcEval, 0); it; ++it)
-      dst.insert(it.index()) = it.value();
+    for (typename SrcEvaluatorType::InnerIterator it(srcEval, 0); it; ++it) dst.insert(it.index()) = it.value();
   }
 };
 
-template< typename Dest, typename Src>
-struct sparse_vector_assign_selector<Dest,Src,SVA_Outer> {
+template <typename Dest, typename Src>
+struct sparse_vector_assign_selector<Dest, Src, SVA_Outer> {
   static void run(Dest& dst, const Src& src) {
-    eigen_internal_assert(src.outerSize()==src.size());
+    eigen_internal_assert(src.outerSize() == src.size());
     typedef internal::evaluator<Src> SrcEvaluatorType;
     SrcEvaluatorType srcEval(src);
-    for(Index i=0; i<src.size(); ++i)
-    {
+    for (Index i = 0; i < src.size(); ++i) {
       typename SrcEvaluatorType::InnerIterator it(srcEval, i);
-      if(it)
-        dst.insert(i) = it.value();
+      if (it) dst.insert(i) = it.value();
     }
   }
 };
 
-template< typename Dest, typename Src>
-struct sparse_vector_assign_selector<Dest,Src,SVA_RuntimeSwitch> {
+template <typename Dest, typename Src>
+struct sparse_vector_assign_selector<Dest, Src, SVA_RuntimeSwitch> {
   static void run(Dest& dst, const Src& src) {
-    if(src.outerSize()==1)  sparse_vector_assign_selector<Dest,Src,SVA_Inner>::run(dst, src);
-    else                    sparse_vector_assign_selector<Dest,Src,SVA_Outer>::run(dst, src);
+    if (src.outerSize() == 1)
+      sparse_vector_assign_selector<Dest, Src, SVA_Inner>::run(dst, src);
+    else
+      sparse_vector_assign_selector<Dest, Src, SVA_Outer>::run(dst, src);
   }
 };
 
-}
+}  // namespace internal
 
 // Specialization for SparseVector.
 // Serializes [size, numNonZeros, innerIndices, values].
@@ -509,12 +445,10 @@
   };
 
   EIGEN_DEVICE_FUNC size_t size(const SparseMat& value) const {
-    return sizeof(Header) +
-           (sizeof(Scalar) + sizeof(StorageIndex)) * value.nonZeros();
+    return sizeof(Header) + (sizeof(Scalar) + sizeof(StorageIndex)) * value.nonZeros();
   }
 
-  EIGEN_DEVICE_FUNC uint8_t* serialize(uint8_t* dest, uint8_t* end,
-                                       const SparseMat& value) {
+  EIGEN_DEVICE_FUNC uint8_t* serialize(uint8_t* dest, uint8_t* end, const SparseMat& value) {
     if (EIGEN_PREDICT_FALSE(dest == nullptr)) return nullptr;
     if (EIGEN_PREDICT_FALSE(dest + size(value) > end)) return nullptr;
 
@@ -537,9 +471,7 @@
     return dest;
   }
 
-  EIGEN_DEVICE_FUNC const uint8_t* deserialize(const uint8_t* src,
-                                               const uint8_t* end,
-                                               SparseMat& value) const {
+  EIGEN_DEVICE_FUNC const uint8_t* deserialize(const uint8_t* src, const uint8_t* end, SparseMat& value) const {
     if (EIGEN_PREDICT_FALSE(src == nullptr)) return nullptr;
     if (EIGEN_PREDICT_FALSE(src + sizeof(Header) > end)) return nullptr;
 
@@ -568,6 +500,6 @@
   }
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SPARSEVECTOR_H
+#endif  // EIGEN_SPARSEVECTOR_H
diff --git a/Eigen/src/SparseCore/SparseView.h b/Eigen/src/SparseCore/SparseView.h
index a1cdcf8..7220bee 100644
--- a/Eigen/src/SparseCore/SparseView.h
+++ b/Eigen/src/SparseCore/SparseView.h
@@ -14,64 +14,60 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
-template<typename MatrixType>
-struct traits<SparseView<MatrixType> > : traits<MatrixType>
-{
+template <typename MatrixType>
+struct traits<SparseView<MatrixType> > : traits<MatrixType> {
   typedef typename MatrixType::StorageIndex StorageIndex;
   typedef Sparse StorageKind;
-  enum {
-    Flags = int(traits<MatrixType>::Flags) & (RowMajorBit)
-  };
+  enum { Flags = int(traits<MatrixType>::Flags) & (RowMajorBit) };
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \ingroup SparseCore_Module
-  * \class SparseView
-  *
-  * \brief Expression of a dense or sparse matrix with zero or too small values removed
-  *
-  * \tparam MatrixType the type of the object of which we are removing the small entries
-  *
-  * This class represents an expression of a given dense or sparse matrix with
-  * entries smaller than \c reference * \c epsilon are removed.
-  * It is the return type of MatrixBase::sparseView() and SparseMatrixBase::pruned()
-  * and most of the time this is the only way it is used.
-  *
-  * \sa MatrixBase::sparseView(), SparseMatrixBase::pruned()
-  */
-template<typename MatrixType>
-class SparseView : public SparseMatrixBase<SparseView<MatrixType> >
-{
+ * \class SparseView
+ *
+ * \brief Expression of a dense or sparse matrix with zero or too small values removed
+ *
+ * \tparam MatrixType the type of the object of which we are removing the small entries
+ *
+ * This class represents an expression of a given dense or sparse matrix with
+ * entries smaller than \c reference * \c epsilon are removed.
+ * It is the return type of MatrixBase::sparseView() and SparseMatrixBase::pruned()
+ * and most of the time this is the only way it is used.
+ *
+ * \sa MatrixBase::sparseView(), SparseMatrixBase::pruned()
+ */
+template <typename MatrixType>
+class SparseView : public SparseMatrixBase<SparseView<MatrixType> > {
   typedef typename MatrixType::Nested MatrixTypeNested;
   typedef internal::remove_all_t<MatrixTypeNested> MatrixTypeNested_;
-  typedef SparseMatrixBase<SparseView > Base;
-public:
+  typedef SparseMatrixBase<SparseView> Base;
+
+ public:
   EIGEN_SPARSE_PUBLIC_INTERFACE(SparseView)
   typedef internal::remove_all_t<MatrixType> NestedExpression;
 
   explicit SparseView(const MatrixType& mat, const Scalar& reference = Scalar(0),
-                      const RealScalar &epsilon = NumTraits<Scalar>::dummy_precision())
-    : m_matrix(mat), m_reference(reference), m_epsilon(epsilon) {}
+                      const RealScalar& epsilon = NumTraits<Scalar>::dummy_precision())
+      : m_matrix(mat), m_reference(reference), m_epsilon(epsilon) {}
 
   inline Index rows() const { return m_matrix.rows(); }
   inline Index cols() const { return m_matrix.cols(); }
 
   inline Index innerSize() const { return m_matrix.innerSize(); }
   inline Index outerSize() const { return m_matrix.outerSize(); }
-  
+
   /** \returns the nested expression */
-  const internal::remove_all_t<MatrixTypeNested>&
-  nestedExpression() const { return m_matrix; }
-  
+  const internal::remove_all_t<MatrixTypeNested>& nestedExpression() const { return m_matrix; }
+
   Scalar reference() const { return m_reference; }
   RealScalar epsilon() const { return m_epsilon; }
-  
-protected:
+
+ protected:
   MatrixTypeNested m_matrix;
   Scalar m_reference;
   RealScalar m_epsilon;
@@ -82,176 +78,148 @@
 // TODO find a way to unify the two following variants
 // This is tricky because implementing an inner iterator on top of an IndexBased evaluator is
 // not easy because the evaluators do not expose the sizes of the underlying expression.
-  
-template<typename ArgType>
-struct unary_evaluator<SparseView<ArgType>, IteratorBased>
-  : public evaluator_base<SparseView<ArgType> >
-{
-    typedef typename evaluator<ArgType>::InnerIterator EvalIterator;
-  public:
-    typedef SparseView<ArgType> XprType;
-    
-    class InnerIterator : public EvalIterator
-    {
-      protected:
-        typedef typename XprType::Scalar Scalar;
-      public:
 
-        EIGEN_STRONG_INLINE InnerIterator(const unary_evaluator& sve, Index outer)
-          : EvalIterator(sve.m_argImpl,outer), m_view(sve.m_view)
-        {
-          incrementToNonZero();
-        }
+template <typename ArgType>
+struct unary_evaluator<SparseView<ArgType>, IteratorBased> : public evaluator_base<SparseView<ArgType> > {
+  typedef typename evaluator<ArgType>::InnerIterator EvalIterator;
 
-        EIGEN_STRONG_INLINE InnerIterator& operator++()
-        {
-          EvalIterator::operator++();
-          incrementToNonZero();
-          return *this;
-        }
+ public:
+  typedef SparseView<ArgType> XprType;
 
-        using EvalIterator::value;
-
-      protected:
-        const XprType &m_view;
-
-      private:
-        void incrementToNonZero()
-        {
-          while((bool(*this)) && internal::isMuchSmallerThan(value(), m_view.reference(), m_view.epsilon()))
-          {
-            EvalIterator::operator++();
-          }
-        }
-    };
-    
-    enum {
-      CoeffReadCost = evaluator<ArgType>::CoeffReadCost,
-      Flags = XprType::Flags
-    };
-    
-    explicit unary_evaluator(const XprType& xpr) : m_argImpl(xpr.nestedExpression()), m_view(xpr) {}
-
-  protected:
-    evaluator<ArgType> m_argImpl;
-    const XprType &m_view;
-};
-
-template<typename ArgType>
-struct unary_evaluator<SparseView<ArgType>, IndexBased>
-  : public evaluator_base<SparseView<ArgType> >
-{
-  public:
-    typedef SparseView<ArgType> XprType;
-  protected:
-    enum { IsRowMajor = (XprType::Flags&RowMajorBit)==RowMajorBit };
+  class InnerIterator : public EvalIterator {
+   protected:
     typedef typename XprType::Scalar Scalar;
-    typedef typename XprType::StorageIndex StorageIndex;
-  public:
-    
-    class InnerIterator
-    {
-      public:
 
-        EIGEN_STRONG_INLINE InnerIterator(const unary_evaluator& sve, Index outer)
-          : m_sve(sve), m_inner(0), m_outer(outer), m_end(sve.m_view.innerSize())
-        {
-          incrementToNonZero();
-        }
+   public:
+    EIGEN_STRONG_INLINE InnerIterator(const unary_evaluator& sve, Index outer)
+        : EvalIterator(sve.m_argImpl, outer), m_view(sve.m_view) {
+      incrementToNonZero();
+    }
 
-        EIGEN_STRONG_INLINE InnerIterator& operator++()
-        {
-          m_inner++;
-          incrementToNonZero();
-          return *this;
-        }
+    EIGEN_STRONG_INLINE InnerIterator& operator++() {
+      EvalIterator::operator++();
+      incrementToNonZero();
+      return *this;
+    }
 
-        EIGEN_STRONG_INLINE Scalar value() const
-        {
-          return (IsRowMajor) ? m_sve.m_argImpl.coeff(m_outer, m_inner)
-                              : m_sve.m_argImpl.coeff(m_inner, m_outer);
-        }
+    using EvalIterator::value;
 
-        EIGEN_STRONG_INLINE StorageIndex index() const { return m_inner; }
-        inline Index row() const { return IsRowMajor ? m_outer : index(); }
-        inline Index col() const { return IsRowMajor ? index() : m_outer; }
+   protected:
+    const XprType& m_view;
 
-        EIGEN_STRONG_INLINE operator bool() const { return m_inner < m_end && m_inner>=0; }
+   private:
+    void incrementToNonZero() {
+      while ((bool(*this)) && internal::isMuchSmallerThan(value(), m_view.reference(), m_view.epsilon())) {
+        EvalIterator::operator++();
+      }
+    }
+  };
 
-      protected:
-        const unary_evaluator &m_sve;
-        Index m_inner;
-        const Index m_outer;
-        const Index m_end;
+  enum { CoeffReadCost = evaluator<ArgType>::CoeffReadCost, Flags = XprType::Flags };
 
-      private:
-        void incrementToNonZero()
-        {
-          while((bool(*this)) && internal::isMuchSmallerThan(value(), m_sve.m_view.reference(), m_sve.m_view.epsilon()))
-          {
-            m_inner++;
-          }
-        }
-    };
-    
-    enum {
-      CoeffReadCost = evaluator<ArgType>::CoeffReadCost,
-      Flags = XprType::Flags
-    };
-    
-    explicit unary_evaluator(const XprType& xpr) : m_argImpl(xpr.nestedExpression()), m_view(xpr) {}
+  explicit unary_evaluator(const XprType& xpr) : m_argImpl(xpr.nestedExpression()), m_view(xpr) {}
 
-  protected:
-    evaluator<ArgType> m_argImpl;
-    const XprType &m_view;
+ protected:
+  evaluator<ArgType> m_argImpl;
+  const XprType& m_view;
 };
 
-} // end namespace internal
+template <typename ArgType>
+struct unary_evaluator<SparseView<ArgType>, IndexBased> : public evaluator_base<SparseView<ArgType> > {
+ public:
+  typedef SparseView<ArgType> XprType;
+
+ protected:
+  enum { IsRowMajor = (XprType::Flags & RowMajorBit) == RowMajorBit };
+  typedef typename XprType::Scalar Scalar;
+  typedef typename XprType::StorageIndex StorageIndex;
+
+ public:
+  class InnerIterator {
+   public:
+    EIGEN_STRONG_INLINE InnerIterator(const unary_evaluator& sve, Index outer)
+        : m_sve(sve), m_inner(0), m_outer(outer), m_end(sve.m_view.innerSize()) {
+      incrementToNonZero();
+    }
+
+    EIGEN_STRONG_INLINE InnerIterator& operator++() {
+      m_inner++;
+      incrementToNonZero();
+      return *this;
+    }
+
+    EIGEN_STRONG_INLINE Scalar value() const {
+      return (IsRowMajor) ? m_sve.m_argImpl.coeff(m_outer, m_inner) : m_sve.m_argImpl.coeff(m_inner, m_outer);
+    }
+
+    EIGEN_STRONG_INLINE StorageIndex index() const { return m_inner; }
+    inline Index row() const { return IsRowMajor ? m_outer : index(); }
+    inline Index col() const { return IsRowMajor ? index() : m_outer; }
+
+    EIGEN_STRONG_INLINE operator bool() const { return m_inner < m_end && m_inner >= 0; }
+
+   protected:
+    const unary_evaluator& m_sve;
+    Index m_inner;
+    const Index m_outer;
+    const Index m_end;
+
+   private:
+    void incrementToNonZero() {
+      while ((bool(*this)) && internal::isMuchSmallerThan(value(), m_sve.m_view.reference(), m_sve.m_view.epsilon())) {
+        m_inner++;
+      }
+    }
+  };
+
+  enum { CoeffReadCost = evaluator<ArgType>::CoeffReadCost, Flags = XprType::Flags };
+
+  explicit unary_evaluator(const XprType& xpr) : m_argImpl(xpr.nestedExpression()), m_view(xpr) {}
+
+ protected:
+  evaluator<ArgType> m_argImpl;
+  const XprType& m_view;
+};
+
+}  // end namespace internal
 
 /** \ingroup SparseCore_Module
-  *
-  * \returns a sparse expression of the dense expression \c *this with values smaller than
-  * \a reference * \a epsilon removed.
-  *
-  * This method is typically used when prototyping to convert a quickly assembled dense Matrix \c D to a SparseMatrix \c S:
-  * \code
-  * MatrixXd D(n,m);
-  * SparseMatrix<double> S;
-  * S = D.sparseView();             // suppress numerical zeros (exact)
-  * S = D.sparseView(reference);
-  * S = D.sparseView(reference,epsilon);
-  * \endcode
-  * where \a reference is a meaningful non zero reference value,
-  * and \a epsilon is a tolerance factor defaulting to NumTraits<Scalar>::dummy_precision().
-  *
-  * \sa SparseMatrixBase::pruned(), class SparseView */
-template<typename Derived>
+ *
+ * \returns a sparse expression of the dense expression \c *this with values smaller than
+ * \a reference * \a epsilon removed.
+ *
+ * This method is typically used when prototyping to convert a quickly assembled dense Matrix \c D to a SparseMatrix \c
+ * S: \code MatrixXd D(n,m); SparseMatrix<double> S; S = D.sparseView();             // suppress numerical zeros (exact)
+ * S = D.sparseView(reference);
+ * S = D.sparseView(reference,epsilon);
+ * \endcode
+ * where \a reference is a meaningful non zero reference value,
+ * and \a epsilon is a tolerance factor defaulting to NumTraits<Scalar>::dummy_precision().
+ *
+ * \sa SparseMatrixBase::pruned(), class SparseView */
+template <typename Derived>
 const SparseView<Derived> MatrixBase<Derived>::sparseView(const Scalar& reference,
-                                                          const typename NumTraits<Scalar>::Real& epsilon) const
-{
+                                                          const typename NumTraits<Scalar>::Real& epsilon) const {
   return SparseView<Derived>(derived(), reference, epsilon);
 }
 
 /** \returns an expression of \c *this with values smaller than
-  * \a reference * \a epsilon removed.
-  *
-  * This method is typically used in conjunction with the product of two sparse matrices
-  * to automatically prune the smallest values as follows:
-  * \code
-  * C = (A*B).pruned();             // suppress numerical zeros (exact)
-  * C = (A*B).pruned(ref);
-  * C = (A*B).pruned(ref,epsilon);
-  * \endcode
-  * where \c ref is a meaningful non zero reference value.
-  * */
-template<typename Derived>
-const SparseView<Derived>
-SparseMatrixBase<Derived>::pruned(const Scalar& reference,
-                                  const RealScalar& epsilon) const
-{
+ * \a reference * \a epsilon removed.
+ *
+ * This method is typically used in conjunction with the product of two sparse matrices
+ * to automatically prune the smallest values as follows:
+ * \code
+ * C = (A*B).pruned();             // suppress numerical zeros (exact)
+ * C = (A*B).pruned(ref);
+ * C = (A*B).pruned(ref,epsilon);
+ * \endcode
+ * where \c ref is a meaningful non zero reference value.
+ * */
+template <typename Derived>
+const SparseView<Derived> SparseMatrixBase<Derived>::pruned(const Scalar& reference, const RealScalar& epsilon) const {
   return SparseView<Derived>(derived(), reference, epsilon);
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
 #endif
diff --git a/Eigen/src/SparseCore/TriangularSolver.h b/Eigen/src/SparseCore/TriangularSolver.h
index 39fa7c7..7753a24 100644
--- a/Eigen/src/SparseCore/TriangularSolver.h
+++ b/Eigen/src/SparseCore/TriangularSolver.h
@@ -13,50 +13,41 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
-template<typename Lhs, typename Rhs, int Mode,
-  int UpLo = (Mode & Lower)
-           ? Lower
-           : (Mode & Upper)
-           ? Upper
-           : -1,
-  int StorageOrder = int(traits<Lhs>::Flags) & RowMajorBit>
+template <typename Lhs, typename Rhs, int Mode,
+          int UpLo = (Mode & Lower)   ? Lower
+                     : (Mode & Upper) ? Upper
+                                      : -1,
+          int StorageOrder = int(traits<Lhs>::Flags) & RowMajorBit>
 struct sparse_solve_triangular_selector;
 
 // forward substitution, row-major
-template<typename Lhs, typename Rhs, int Mode>
-struct sparse_solve_triangular_selector<Lhs,Rhs,Mode,Lower,RowMajor>
-{
+template <typename Lhs, typename Rhs, int Mode>
+struct sparse_solve_triangular_selector<Lhs, Rhs, Mode, Lower, RowMajor> {
   typedef typename Rhs::Scalar Scalar;
   typedef evaluator<Lhs> LhsEval;
   typedef typename evaluator<Lhs>::InnerIterator LhsIterator;
-  static void run(const Lhs& lhs, Rhs& other)
-  {
+  static void run(const Lhs& lhs, Rhs& other) {
     LhsEval lhsEval(lhs);
-    for(Index col=0 ; col<other.cols() ; ++col)
-    {
-      for(Index i=0; i<lhs.rows(); ++i)
-      {
-        Scalar tmp = other.coeff(i,col);
+    for (Index col = 0; col < other.cols(); ++col) {
+      for (Index i = 0; i < lhs.rows(); ++i) {
+        Scalar tmp = other.coeff(i, col);
         Scalar lastVal(0);
         Index lastIndex = 0;
-        for(LhsIterator it(lhsEval, i); it; ++it)
-        {
+        for (LhsIterator it(lhsEval, i); it; ++it) {
           lastVal = it.value();
           lastIndex = it.index();
-          if(lastIndex==i)
-            break;
-          tmp -= lastVal * other.coeff(lastIndex,col);
+          if (lastIndex == i) break;
+          tmp -= lastVal * other.coeff(lastIndex, col);
         }
         if (Mode & UnitDiag)
-          other.coeffRef(i,col) = tmp;
-        else
-        {
-          eigen_assert(lastIndex==i);
-          other.coeffRef(i,col) = tmp/lastVal;
+          other.coeffRef(i, col) = tmp;
+        else {
+          eigen_assert(lastIndex == i);
+          other.coeffRef(i, col) = tmp / lastVal;
         }
       }
     }
@@ -64,73 +55,59 @@
 };
 
 // backward substitution, row-major
-template<typename Lhs, typename Rhs, int Mode>
-struct sparse_solve_triangular_selector<Lhs,Rhs,Mode,Upper,RowMajor>
-{
+template <typename Lhs, typename Rhs, int Mode>
+struct sparse_solve_triangular_selector<Lhs, Rhs, Mode, Upper, RowMajor> {
   typedef typename Rhs::Scalar Scalar;
   typedef evaluator<Lhs> LhsEval;
   typedef typename evaluator<Lhs>::InnerIterator LhsIterator;
-  static void run(const Lhs& lhs, Rhs& other)
-  {
+  static void run(const Lhs& lhs, Rhs& other) {
     LhsEval lhsEval(lhs);
-    for(Index col=0 ; col<other.cols() ; ++col)
-    {
-      for(Index i=lhs.rows()-1 ; i>=0 ; --i)
-      {
-        Scalar tmp = other.coeff(i,col);
+    for (Index col = 0; col < other.cols(); ++col) {
+      for (Index i = lhs.rows() - 1; i >= 0; --i) {
+        Scalar tmp = other.coeff(i, col);
         Scalar l_ii(0);
         LhsIterator it(lhsEval, i);
-        while(it && it.index()<i)
-          ++it;
-        if(!(Mode & UnitDiag))
-        {
-          eigen_assert(it && it.index()==i);
+        while (it && it.index() < i) ++it;
+        if (!(Mode & UnitDiag)) {
+          eigen_assert(it && it.index() == i);
           l_ii = it.value();
           ++it;
-        }
-        else if (it && it.index() == i)
+        } else if (it && it.index() == i)
           ++it;
-        for(; it; ++it)
-        {
-          tmp -= it.value() * other.coeff(it.index(),col);
+        for (; it; ++it) {
+          tmp -= it.value() * other.coeff(it.index(), col);
         }
 
-        if (Mode & UnitDiag)  other.coeffRef(i,col) = tmp;
-        else                  other.coeffRef(i,col) = tmp/l_ii;
+        if (Mode & UnitDiag)
+          other.coeffRef(i, col) = tmp;
+        else
+          other.coeffRef(i, col) = tmp / l_ii;
       }
     }
   }
 };
 
 // forward substitution, col-major
-template<typename Lhs, typename Rhs, int Mode>
-struct sparse_solve_triangular_selector<Lhs,Rhs,Mode,Lower,ColMajor>
-{
+template <typename Lhs, typename Rhs, int Mode>
+struct sparse_solve_triangular_selector<Lhs, Rhs, Mode, Lower, ColMajor> {
   typedef typename Rhs::Scalar Scalar;
   typedef evaluator<Lhs> LhsEval;
   typedef typename evaluator<Lhs>::InnerIterator LhsIterator;
-  static void run(const Lhs& lhs, Rhs& other)
-  {
+  static void run(const Lhs& lhs, Rhs& other) {
     LhsEval lhsEval(lhs);
-    for(Index col=0 ; col<other.cols() ; ++col)
-    {
-      for(Index i=0; i<lhs.cols(); ++i)
-      {
-        Scalar& tmp = other.coeffRef(i,col);
-        if (!numext::is_exactly_zero(tmp)) // optimization when other is actually sparse
+    for (Index col = 0; col < other.cols(); ++col) {
+      for (Index i = 0; i < lhs.cols(); ++i) {
+        Scalar& tmp = other.coeffRef(i, col);
+        if (!numext::is_exactly_zero(tmp))  // optimization when other is actually sparse
         {
           LhsIterator it(lhsEval, i);
-          while(it && it.index()<i)
-            ++it;
-          if(!(Mode & UnitDiag))
-          {
-            eigen_assert(it && it.index()==i);
+          while (it && it.index() < i) ++it;
+          if (!(Mode & UnitDiag)) {
+            eigen_assert(it && it.index() == i);
             tmp /= it.value();
           }
-          if (it && it.index()==i)
-            ++it;
-          for(; it; ++it)
-            other.coeffRef(it.index(), col) -= tmp * it.value();
+          if (it && it.index() == i) ++it;
+          for (; it; ++it) other.coeffRef(it.index(), col) -= tmp * it.value();
         }
       }
     }
@@ -138,61 +115,53 @@
 };
 
 // backward substitution, col-major
-template<typename Lhs, typename Rhs, int Mode>
-struct sparse_solve_triangular_selector<Lhs,Rhs,Mode,Upper,ColMajor>
-{
+template <typename Lhs, typename Rhs, int Mode>
+struct sparse_solve_triangular_selector<Lhs, Rhs, Mode, Upper, ColMajor> {
   typedef typename Rhs::Scalar Scalar;
   typedef evaluator<Lhs> LhsEval;
   typedef typename evaluator<Lhs>::InnerIterator LhsIterator;
-  static void run(const Lhs& lhs, Rhs& other)
-  {
+  static void run(const Lhs& lhs, Rhs& other) {
     LhsEval lhsEval(lhs);
-    for(Index col=0 ; col<other.cols() ; ++col)
-    {
-      for(Index i=lhs.cols()-1; i>=0; --i)
-      {
-        Scalar& tmp = other.coeffRef(i,col);
-        if (!numext::is_exactly_zero(tmp)) // optimization when other is actually sparse
+    for (Index col = 0; col < other.cols(); ++col) {
+      for (Index i = lhs.cols() - 1; i >= 0; --i) {
+        Scalar& tmp = other.coeffRef(i, col);
+        if (!numext::is_exactly_zero(tmp))  // optimization when other is actually sparse
         {
-          if(!(Mode & UnitDiag))
-          {
+          if (!(Mode & UnitDiag)) {
             // TODO replace this by a binary search. make sure the binary search is safe for partially sorted elements
             LhsIterator it(lhsEval, i);
-            while(it && it.index()!=i)
-              ++it;
-            eigen_assert(it && it.index()==i);
-            other.coeffRef(i,col) /= it.value();
+            while (it && it.index() != i) ++it;
+            eigen_assert(it && it.index() == i);
+            other.coeffRef(i, col) /= it.value();
           }
           LhsIterator it(lhsEval, i);
-          for(; it && it.index()<i; ++it)
-            other.coeffRef(it.index(), col) -= tmp * it.value();
+          for (; it && it.index() < i; ++it) other.coeffRef(it.index(), col) -= tmp * it.value();
         }
       }
     }
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
 
-template<typename ExpressionType,unsigned int Mode>
-template<typename OtherDerived>
-void TriangularViewImpl<ExpressionType,Mode,Sparse>::solveInPlace(MatrixBase<OtherDerived>& other) const
-{
+template <typename ExpressionType, unsigned int Mode>
+template <typename OtherDerived>
+void TriangularViewImpl<ExpressionType, Mode, Sparse>::solveInPlace(MatrixBase<OtherDerived>& other) const {
   eigen_assert(derived().cols() == derived().rows() && derived().cols() == other.rows());
-  eigen_assert((!(Mode & ZeroDiag)) && bool(Mode & (Upper|Lower)));
+  eigen_assert((!(Mode & ZeroDiag)) && bool(Mode & (Upper | Lower)));
 
   enum { copy = internal::traits<OtherDerived>::Flags & RowMajorBit };
 
-  typedef std::conditional_t<copy,
-    typename internal::plain_matrix_type_column_major<OtherDerived>::type, OtherDerived&> OtherCopy;
+  typedef std::conditional_t<copy, typename internal::plain_matrix_type_column_major<OtherDerived>::type, OtherDerived&>
+      OtherCopy;
   OtherCopy otherCopy(other.derived());
 
-  internal::sparse_solve_triangular_selector<ExpressionType, std::remove_reference_t<OtherCopy>, Mode>::run(derived().nestedExpression(), otherCopy);
+  internal::sparse_solve_triangular_selector<ExpressionType, std::remove_reference_t<OtherCopy>, Mode>::run(
+      derived().nestedExpression(), otherCopy);
 
-  if (copy)
-    other = otherCopy;
+  if (copy) other = otherCopy;
 }
 #endif
 
@@ -200,119 +169,98 @@
 
 namespace internal {
 
-template<typename Lhs, typename Rhs, int Mode,
-  int UpLo = (Mode & Lower)
-           ? Lower
-           : (Mode & Upper)
-           ? Upper
-           : -1,
-  int StorageOrder = int(Lhs::Flags) & (RowMajorBit)>
+template <typename Lhs, typename Rhs, int Mode,
+          int UpLo = (Mode & Lower)   ? Lower
+                     : (Mode & Upper) ? Upper
+                                      : -1,
+          int StorageOrder = int(Lhs::Flags) & (RowMajorBit)>
 struct sparse_solve_triangular_sparse_selector;
 
 // forward substitution, col-major
-template<typename Lhs, typename Rhs, int Mode, int UpLo>
-struct sparse_solve_triangular_sparse_selector<Lhs,Rhs,Mode,UpLo,ColMajor>
-{
+template <typename Lhs, typename Rhs, int Mode, int UpLo>
+struct sparse_solve_triangular_sparse_selector<Lhs, Rhs, Mode, UpLo, ColMajor> {
   typedef typename Rhs::Scalar Scalar;
-  typedef typename promote_index_type<typename traits<Lhs>::StorageIndex,
-                                      typename traits<Rhs>::StorageIndex>::type StorageIndex;
-  static void run(const Lhs& lhs, Rhs& other)
-  {
-    const bool IsLower = (UpLo==Lower);
-    AmbiVector<Scalar,StorageIndex> tempVector(other.rows()*2);
-    tempVector.setBounds(0,other.rows());
+  typedef typename promote_index_type<typename traits<Lhs>::StorageIndex, typename traits<Rhs>::StorageIndex>::type
+      StorageIndex;
+  static void run(const Lhs& lhs, Rhs& other) {
+    const bool IsLower = (UpLo == Lower);
+    AmbiVector<Scalar, StorageIndex> tempVector(other.rows() * 2);
+    tempVector.setBounds(0, other.rows());
 
     Rhs res(other.rows(), other.cols());
     res.reserve(other.nonZeros());
 
-    for(Index col=0 ; col<other.cols() ; ++col)
-    {
+    for (Index col = 0; col < other.cols(); ++col) {
       // FIXME estimate number of non zeros
-      tempVector.init(.99/*float(other.col(col).nonZeros())/float(other.rows())*/);
+      tempVector.init(.99 /*float(other.col(col).nonZeros())/float(other.rows())*/);
       tempVector.setZero();
       tempVector.restart();
-      for (typename Rhs::InnerIterator rhsIt(other, col); rhsIt; ++rhsIt)
-      {
+      for (typename Rhs::InnerIterator rhsIt(other, col); rhsIt; ++rhsIt) {
         tempVector.coeffRef(rhsIt.index()) = rhsIt.value();
       }
 
-      for(Index i=IsLower?0:lhs.cols()-1;
-          IsLower?i<lhs.cols():i>=0;
-          i+=IsLower?1:-1)
-      {
+      for (Index i = IsLower ? 0 : lhs.cols() - 1; IsLower ? i < lhs.cols() : i >= 0; i += IsLower ? 1 : -1) {
         tempVector.restart();
         Scalar& ci = tempVector.coeffRef(i);
-        if (!numext::is_exactly_zero(ci))
-        {
+        if (!numext::is_exactly_zero(ci)) {
           // find
           typename Lhs::InnerIterator it(lhs, i);
-          if(!(Mode & UnitDiag))
-          {
-            if (IsLower)
-            {
-              eigen_assert(it.index()==i);
+          if (!(Mode & UnitDiag)) {
+            if (IsLower) {
+              eigen_assert(it.index() == i);
               ci /= it.value();
-            }
-            else
-              ci /= lhs.coeff(i,i);
+            } else
+              ci /= lhs.coeff(i, i);
           }
           tempVector.restart();
-          if (IsLower)
-          {
-            if (it.index()==i)
-              ++it;
-            for(; it; ++it)
-              tempVector.coeffRef(it.index()) -= ci * it.value();
-          }
-          else
-          {
-            for(; it && it.index()<i; ++it)
-              tempVector.coeffRef(it.index()) -= ci * it.value();
+          if (IsLower) {
+            if (it.index() == i) ++it;
+            for (; it; ++it) tempVector.coeffRef(it.index()) -= ci * it.value();
+          } else {
+            for (; it && it.index() < i; ++it) tempVector.coeffRef(it.index()) -= ci * it.value();
           }
         }
       }
 
-
-//       Index count = 0;
+      //       Index count = 0;
       // FIXME compute a reference value to filter zeros
-      for (typename AmbiVector<Scalar,StorageIndex>::Iterator it(tempVector/*,1e-12*/); it; ++it)
-      {
-//         ++ count;
-//         std::cerr << "fill " << it.index() << ", " << col << "\n";
-//         std::cout << it.value() << "  ";
+      for (typename AmbiVector<Scalar, StorageIndex>::Iterator it(tempVector /*,1e-12*/); it; ++it) {
+        //         ++ count;
+        //         std::cerr << "fill " << it.index() << ", " << col << "\n";
+        //         std::cout << it.value() << "  ";
         // FIXME use insertBack
         res.insert(it.index(), col) = it.value();
       }
-//       std::cout << "tempVector.nonZeros() == " << int(count) << " / " << (other.rows()) << "\n";
+      //       std::cout << "tempVector.nonZeros() == " << int(count) << " / " << (other.rows()) << "\n";
     }
     res.finalize();
     other = res.markAsRValue();
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-template<typename ExpressionType,unsigned int Mode>
-template<typename OtherDerived>
-void TriangularViewImpl<ExpressionType,Mode,Sparse>::solveInPlace(SparseMatrixBase<OtherDerived>& other) const
-{
+template <typename ExpressionType, unsigned int Mode>
+template <typename OtherDerived>
+void TriangularViewImpl<ExpressionType, Mode, Sparse>::solveInPlace(SparseMatrixBase<OtherDerived>& other) const {
   eigen_assert(derived().cols() == derived().rows() && derived().cols() == other.rows());
-  eigen_assert( (!(Mode & ZeroDiag)) && bool(Mode & (Upper|Lower)));
+  eigen_assert((!(Mode & ZeroDiag)) && bool(Mode & (Upper | Lower)));
 
-//   enum { copy = internal::traits<OtherDerived>::Flags & RowMajorBit };
+  //   enum { copy = internal::traits<OtherDerived>::Flags & RowMajorBit };
 
-//   typedef std::conditional_t<copy,
-//     typename internal::plain_matrix_type_column_major<OtherDerived>::type, OtherDerived&> OtherCopy;
-//   OtherCopy otherCopy(other.derived());
+  //   typedef std::conditional_t<copy,
+  //     typename internal::plain_matrix_type_column_major<OtherDerived>::type, OtherDerived&> OtherCopy;
+  //   OtherCopy otherCopy(other.derived());
 
-  internal::sparse_solve_triangular_sparse_selector<ExpressionType, OtherDerived, Mode>::run(derived().nestedExpression(), other.derived());
+  internal::sparse_solve_triangular_sparse_selector<ExpressionType, OtherDerived, Mode>::run(
+      derived().nestedExpression(), other.derived());
 
-//   if (copy)
-//     other = otherCopy;
+  //   if (copy)
+  //     other = otherCopy;
 }
 #endif
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SPARSETRIANGULARSOLVER_H
+#endif  // EIGEN_SPARSETRIANGULARSOLVER_H
diff --git a/Eigen/src/SparseLU/SparseLU.h b/Eigen/src/SparseLU/SparseLU.h
index 4edd267..aee3d94 100644
--- a/Eigen/src/SparseLU/SparseLU.h
+++ b/Eigen/src/SparseLU/SparseLU.h
@@ -8,7 +8,6 @@
 // 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_SPARSE_LU_H
 #define EIGEN_SPARSE_LU_H
 
@@ -17,745 +16,677 @@
 
 namespace Eigen {
 
-template <typename MatrixType_, typename OrderingType_ = COLAMDOrdering<typename MatrixType_::StorageIndex> > class SparseLU;
-template <typename MappedSparseMatrixType> struct SparseLUMatrixLReturnType;
-template <typename MatrixLType, typename MatrixUType> struct SparseLUMatrixUReturnType;
+template <typename MatrixType_, typename OrderingType_ = COLAMDOrdering<typename MatrixType_::StorageIndex>>
+class SparseLU;
+template <typename MappedSparseMatrixType>
+struct SparseLUMatrixLReturnType;
+template <typename MatrixLType, typename MatrixUType>
+struct SparseLUMatrixUReturnType;
 
-template <bool Conjugate,class SparseLUType>
-class SparseLUTransposeView : public SparseSolverBase<SparseLUTransposeView<Conjugate,SparseLUType> >
-{
-protected:
-  typedef SparseSolverBase<SparseLUTransposeView<Conjugate,SparseLUType> > APIBase;
+template <bool Conjugate, class SparseLUType>
+class SparseLUTransposeView : public SparseSolverBase<SparseLUTransposeView<Conjugate, SparseLUType>> {
+ protected:
+  typedef SparseSolverBase<SparseLUTransposeView<Conjugate, SparseLUType>> APIBase;
   using APIBase::m_isInitialized;
-public:
+
+ public:
   typedef typename SparseLUType::Scalar Scalar;
   typedef typename SparseLUType::StorageIndex StorageIndex;
   typedef typename SparseLUType::MatrixType MatrixType;
   typedef typename SparseLUType::OrderingType OrderingType;
 
-  enum {
-    ColsAtCompileTime = MatrixType::ColsAtCompileTime,
-    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
-  };
+  enum { ColsAtCompileTime = MatrixType::ColsAtCompileTime, MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime };
 
   SparseLUTransposeView() : APIBase(), m_sparseLU(NULL) {}
   SparseLUTransposeView(const SparseLUTransposeView& view) : APIBase() {
     this->m_sparseLU = view.m_sparseLU;
     this->m_isInitialized = view.m_isInitialized;
   }
-  void setIsInitialized(const bool isInitialized) {this->m_isInitialized = isInitialized;}
-  void setSparseLU(SparseLUType* sparseLU) {m_sparseLU = sparseLU;}
+  void setIsInitialized(const bool isInitialized) { this->m_isInitialized = isInitialized; }
+  void setSparseLU(SparseLUType* sparseLU) { m_sparseLU = sparseLU; }
   using APIBase::_solve_impl;
-  template<typename Rhs, typename Dest>
-  bool _solve_impl(const MatrixBase<Rhs> &B, MatrixBase<Dest> &X_base) const
-  {
+  template <typename Rhs, typename Dest>
+  bool _solve_impl(const MatrixBase<Rhs>& B, MatrixBase<Dest>& X_base) const {
     Dest& X(X_base.derived());
     eigen_assert(m_sparseLU->info() == Success && "The matrix should be factorized first");
-    EIGEN_STATIC_ASSERT((Dest::Flags&RowMajorBit)==0,
-                        THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);
-
+    EIGEN_STATIC_ASSERT((Dest::Flags & RowMajorBit) == 0, THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);
 
     // this ugly const_cast_derived() helps to detect aliasing when applying the permutations
-    for(Index j = 0; j < B.cols(); ++j){
+    for (Index j = 0; j < B.cols(); ++j) {
       X.col(j) = m_sparseLU->colsPermutation() * B.const_cast_derived().col(j);
     }
-    //Forward substitution with transposed or adjoint of U
+    // Forward substitution with transposed or adjoint of U
     m_sparseLU->matrixU().template solveTransposedInPlace<Conjugate>(X);
 
-    //Backward substitution with transposed or adjoint of L
+    // Backward substitution with transposed or adjoint of L
     m_sparseLU->matrixL().template solveTransposedInPlace<Conjugate>(X);
 
     // Permute back the solution
-    for (Index j = 0; j < B.cols(); ++j)
-      X.col(j) = m_sparseLU->rowsPermutation().transpose() * X.col(j);
+    for (Index j = 0; j < B.cols(); ++j) X.col(j) = m_sparseLU->rowsPermutation().transpose() * X.col(j);
     return true;
   }
   inline Index rows() const { return m_sparseLU->rows(); }
   inline Index cols() const { return m_sparseLU->cols(); }
 
-private:
-  SparseLUType *m_sparseLU;
+ private:
+  SparseLUType* m_sparseLU;
   SparseLUTransposeView& operator=(const SparseLUTransposeView&);
 };
 
-
 /** \ingroup SparseLU_Module
-  * \class SparseLU
-  * 
-  * \brief Sparse supernodal LU factorization for general matrices
-  * 
-  * This class implements the supernodal LU factorization for general matrices.
-  * It uses the main techniques from the sequential SuperLU package 
-  * (http://crd-legacy.lbl.gov/~xiaoye/SuperLU/). It handles transparently real 
-  * and complex arithmetic with single and double precision, depending on the 
-  * scalar type of your input matrix. 
-  * The code has been optimized to provide BLAS-3 operations during supernode-panel updates. 
-  * It benefits directly from the built-in high-performant Eigen BLAS routines. 
-  * Moreover, when the size of a supernode is very small, the BLAS calls are avoided to 
-  * enable a better optimization from the compiler. For best performance, 
-  * you should compile it with NDEBUG flag to avoid the numerous bounds checking on vectors. 
-  * 
-  * An important parameter of this class is the ordering method. It is used to reorder the columns 
-  * (and eventually the rows) of the matrix to reduce the number of new elements that are created during 
-  * numerical factorization. The cheapest method available is COLAMD. 
-  * See  \link OrderingMethods_Module the OrderingMethods module \endlink for the list of 
-  * built-in and external ordering methods. 
-  *
-  * Simple example with key steps 
-  * \code
-  * VectorXd x(n), b(n);
-  * SparseMatrix<double> A;
-  * SparseLU<SparseMatrix<double>, COLAMDOrdering<int> >   solver;
-  * // fill A and b;
-  * // Compute the ordering permutation vector from the structural pattern of A
-  * solver.analyzePattern(A); 
-  * // Compute the numerical factorization 
-  * solver.factorize(A); 
-  * //Use the factors to solve the linear system 
-  * x = solver.solve(b); 
-  * \endcode
-  * 
-  * \warning The input matrix A should be in a \b compressed and \b column-major form.
-  * Otherwise an expensive copy will be made. You can call the inexpensive makeCompressed() to get a compressed matrix.
-  * 
-  * \note Unlike the initial SuperLU implementation, there is no step to equilibrate the matrix. 
-  * For badly scaled matrices, this step can be useful to reduce the pivoting during factorization. 
-  * If this is the case for your matrices, you can try the basic scaling method at
-  *  "unsupported/Eigen/src/IterativeSolvers/Scaling.h"
-  * 
-  * \tparam MatrixType_ The type of the sparse matrix. It must be a column-major SparseMatrix<>
-  * \tparam OrderingType_ The ordering method to use, either AMD, COLAMD or METIS. Default is COLMAD
-  *
-  * \implsparsesolverconcept
-  * 
-  * \sa \ref TutorialSparseSolverConcept
-  * \sa \ref OrderingMethods_Module
-  */
+ * \class SparseLU
+ *
+ * \brief Sparse supernodal LU factorization for general matrices
+ *
+ * This class implements the supernodal LU factorization for general matrices.
+ * It uses the main techniques from the sequential SuperLU package
+ * (http://crd-legacy.lbl.gov/~xiaoye/SuperLU/). It handles transparently real
+ * and complex arithmetic with single and double precision, depending on the
+ * scalar type of your input matrix.
+ * The code has been optimized to provide BLAS-3 operations during supernode-panel updates.
+ * It benefits directly from the built-in high-performant Eigen BLAS routines.
+ * Moreover, when the size of a supernode is very small, the BLAS calls are avoided to
+ * enable a better optimization from the compiler. For best performance,
+ * you should compile it with NDEBUG flag to avoid the numerous bounds checking on vectors.
+ *
+ * An important parameter of this class is the ordering method. It is used to reorder the columns
+ * (and eventually the rows) of the matrix to reduce the number of new elements that are created during
+ * numerical factorization. The cheapest method available is COLAMD.
+ * See  \link OrderingMethods_Module the OrderingMethods module \endlink for the list of
+ * built-in and external ordering methods.
+ *
+ * Simple example with key steps
+ * \code
+ * VectorXd x(n), b(n);
+ * SparseMatrix<double> A;
+ * SparseLU<SparseMatrix<double>, COLAMDOrdering<int> >   solver;
+ * // fill A and b;
+ * // Compute the ordering permutation vector from the structural pattern of A
+ * solver.analyzePattern(A);
+ * // Compute the numerical factorization
+ * solver.factorize(A);
+ * //Use the factors to solve the linear system
+ * x = solver.solve(b);
+ * \endcode
+ *
+ * \warning The input matrix A should be in a \b compressed and \b column-major form.
+ * Otherwise an expensive copy will be made. You can call the inexpensive makeCompressed() to get a compressed matrix.
+ *
+ * \note Unlike the initial SuperLU implementation, there is no step to equilibrate the matrix.
+ * For badly scaled matrices, this step can be useful to reduce the pivoting during factorization.
+ * If this is the case for your matrices, you can try the basic scaling method at
+ *  "unsupported/Eigen/src/IterativeSolvers/Scaling.h"
+ *
+ * \tparam MatrixType_ The type of the sparse matrix. It must be a column-major SparseMatrix<>
+ * \tparam OrderingType_ The ordering method to use, either AMD, COLAMD or METIS. Default is COLMAD
+ *
+ * \implsparsesolverconcept
+ *
+ * \sa \ref TutorialSparseSolverConcept
+ * \sa \ref OrderingMethods_Module
+ */
 template <typename MatrixType_, typename OrderingType_>
-class SparseLU : public SparseSolverBase<SparseLU<MatrixType_,OrderingType_> >, public internal::SparseLUImpl<typename MatrixType_::Scalar, typename MatrixType_::StorageIndex>
-{
-  protected:
-    typedef SparseSolverBase<SparseLU<MatrixType_,OrderingType_> > APIBase;
-    using APIBase::m_isInitialized;
-  public:
-    using APIBase::_solve_impl;
-    
-    typedef MatrixType_ MatrixType;
-    typedef OrderingType_ OrderingType;
-    typedef typename MatrixType::Scalar Scalar; 
-    typedef typename MatrixType::RealScalar RealScalar; 
-    typedef typename MatrixType::StorageIndex StorageIndex;
-    typedef SparseMatrix<Scalar,ColMajor,StorageIndex> NCMatrix;
-    typedef internal::MappedSuperNodalMatrix<Scalar, StorageIndex> SCMatrix;
-    typedef Matrix<Scalar,Dynamic,1> ScalarVector;
-    typedef Matrix<StorageIndex,Dynamic,1> IndexVector;
-    typedef PermutationMatrix<Dynamic, Dynamic, StorageIndex> PermutationType;
-    typedef internal::SparseLUImpl<Scalar, StorageIndex> Base;
+class SparseLU : public SparseSolverBase<SparseLU<MatrixType_, OrderingType_>>,
+                 public internal::SparseLUImpl<typename MatrixType_::Scalar, typename MatrixType_::StorageIndex> {
+ protected:
+  typedef SparseSolverBase<SparseLU<MatrixType_, OrderingType_>> APIBase;
+  using APIBase::m_isInitialized;
 
-    enum {
-      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
-      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
-    };
-    
-  public:
+ public:
+  using APIBase::_solve_impl;
 
-    SparseLU():m_lastError(""),m_Ustore(0,0,0,0,0,0),m_symmetricmode(false),m_diagpivotthresh(1.0),m_detPermR(1)
-    {
-      initperfvalues(); 
-    }
-    explicit SparseLU(const MatrixType& matrix)
-      : m_lastError(""),m_Ustore(0,0,0,0,0,0),m_symmetricmode(false),m_diagpivotthresh(1.0),m_detPermR(1)
-    {
-      initperfvalues(); 
-      compute(matrix);
-    }
-    
-    ~SparseLU()
-    {
-      // Free all explicit dynamic pointers 
-    }
-    
-    void analyzePattern (const MatrixType& matrix);
-    void factorize (const MatrixType& matrix);
-    void simplicialfactorize(const MatrixType& matrix);
-    
-    /**
-      * Compute the symbolic and numeric factorization of the input sparse matrix.
-      * The input matrix should be in column-major storage. 
-      */
-    void compute (const MatrixType& matrix)
-    {
-      // Analyze 
-      analyzePattern(matrix); 
-      //Factorize
-      factorize(matrix);
-    } 
+  typedef MatrixType_ MatrixType;
+  typedef OrderingType_ OrderingType;
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::RealScalar RealScalar;
+  typedef typename MatrixType::StorageIndex StorageIndex;
+  typedef SparseMatrix<Scalar, ColMajor, StorageIndex> NCMatrix;
+  typedef internal::MappedSuperNodalMatrix<Scalar, StorageIndex> SCMatrix;
+  typedef Matrix<Scalar, Dynamic, 1> ScalarVector;
+  typedef Matrix<StorageIndex, Dynamic, 1> IndexVector;
+  typedef PermutationMatrix<Dynamic, Dynamic, StorageIndex> PermutationType;
+  typedef internal::SparseLUImpl<Scalar, StorageIndex> Base;
 
-    /** \returns an expression of the transposed of the factored matrix.
-      *
-      * A typical usage is to solve for the transposed problem A^T x = b:
-      * \code
-      * solver.compute(A);
-      * x = solver.transpose().solve(b);
-      * \endcode
-      *
-      * \sa adjoint(), solve()
-      */
-    const SparseLUTransposeView<false,SparseLU<MatrixType_,OrderingType_> > transpose()
-    {
-      SparseLUTransposeView<false,  SparseLU<MatrixType_,OrderingType_> > transposeView;
-      transposeView.setSparseLU(this);
-      transposeView.setIsInitialized(this->m_isInitialized);
-      return transposeView;
-    }
+  enum { ColsAtCompileTime = MatrixType::ColsAtCompileTime, MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime };
 
+ public:
+  SparseLU()
+      : m_lastError(""), m_Ustore(0, 0, 0, 0, 0, 0), m_symmetricmode(false), m_diagpivotthresh(1.0), m_detPermR(1) {
+    initperfvalues();
+  }
+  explicit SparseLU(const MatrixType& matrix)
+      : m_lastError(""), m_Ustore(0, 0, 0, 0, 0, 0), m_symmetricmode(false), m_diagpivotthresh(1.0), m_detPermR(1) {
+    initperfvalues();
+    compute(matrix);
+  }
 
-    /** \returns an expression of the adjoint of the factored matrix
-      *
-      * A typical usage is to solve for the adjoint problem A' x = b:
-      * \code
-      * solver.compute(A);
-      * x = solver.adjoint().solve(b);
-      * \endcode
-      *
-      * For real scalar types, this function is equivalent to transpose().
-      *
-      * \sa transpose(), solve()
-      */
-    const SparseLUTransposeView<true, SparseLU<MatrixType_,OrderingType_> > adjoint()
-    {
-      SparseLUTransposeView<true,  SparseLU<MatrixType_,OrderingType_> > adjointView;
-      adjointView.setSparseLU(this);
-      adjointView.setIsInitialized(this->m_isInitialized);
-      return adjointView;
-    }
-    
-    inline Index rows() const { return m_mat.rows(); }
-    inline Index cols() const { return m_mat.cols(); }
-    /** Indicate that the pattern of the input matrix is symmetric */
-    void isSymmetric(bool sym)
-    {
-      m_symmetricmode = sym;
-    }
-    
-    /** \returns an expression of the matrix L, internally stored as supernodes
-      * The only operation available with this expression is the triangular solve
-      * \code
-      * y = b; matrixL().solveInPlace(y);
-      * \endcode
-      */
-    SparseLUMatrixLReturnType<SCMatrix> matrixL() const
-    {
-      return SparseLUMatrixLReturnType<SCMatrix>(m_Lstore);
-    }
-    /** \returns an expression of the matrix U,
-      * The only operation available with this expression is the triangular solve
-      * \code
-      * y = b; matrixU().solveInPlace(y);
-      * \endcode
-      */
-    SparseLUMatrixUReturnType<SCMatrix,Map<SparseMatrix<Scalar,ColMajor,StorageIndex> > > matrixU() const
-    {
-      return SparseLUMatrixUReturnType<SCMatrix, Map<SparseMatrix<Scalar,ColMajor,StorageIndex> > >(m_Lstore, m_Ustore);
-    }
+  ~SparseLU() {
+    // Free all explicit dynamic pointers
+  }
 
-    /**
-      * \returns a reference to the row matrix permutation \f$ P_r \f$ such that \f$P_r A P_c^T = L U\f$
-      * \sa colsPermutation()
-      */
-    inline const PermutationType& rowsPermutation() const
-    {
-      return m_perm_r;
-    }
-    /**
-      * \returns a reference to the column matrix permutation\f$ P_c^T \f$ such that \f$P_r A P_c^T = L U\f$
-      * \sa rowsPermutation()
-      */
-    inline const PermutationType& colsPermutation() const
-    {
-      return m_perm_c;
-    }
-    /** Set the threshold used for a diagonal entry to be an acceptable pivot. */
-    void setPivotThreshold(const RealScalar& thresh)
-    {
-      m_diagpivotthresh = thresh; 
-    }
+  void analyzePattern(const MatrixType& matrix);
+  void factorize(const MatrixType& matrix);
+  void simplicialfactorize(const MatrixType& matrix);
+
+  /**
+   * Compute the symbolic and numeric factorization of the input sparse matrix.
+   * The input matrix should be in column-major storage.
+   */
+  void compute(const MatrixType& matrix) {
+    // Analyze
+    analyzePattern(matrix);
+    // Factorize
+    factorize(matrix);
+  }
+
+  /** \returns an expression of the transposed of the factored matrix.
+   *
+   * A typical usage is to solve for the transposed problem A^T x = b:
+   * \code
+   * solver.compute(A);
+   * x = solver.transpose().solve(b);
+   * \endcode
+   *
+   * \sa adjoint(), solve()
+   */
+  const SparseLUTransposeView<false, SparseLU<MatrixType_, OrderingType_>> transpose() {
+    SparseLUTransposeView<false, SparseLU<MatrixType_, OrderingType_>> transposeView;
+    transposeView.setSparseLU(this);
+    transposeView.setIsInitialized(this->m_isInitialized);
+    return transposeView;
+  }
+
+  /** \returns an expression of the adjoint of the factored matrix
+   *
+   * A typical usage is to solve for the adjoint problem A' x = b:
+   * \code
+   * solver.compute(A);
+   * x = solver.adjoint().solve(b);
+   * \endcode
+   *
+   * For real scalar types, this function is equivalent to transpose().
+   *
+   * \sa transpose(), solve()
+   */
+  const SparseLUTransposeView<true, SparseLU<MatrixType_, OrderingType_>> adjoint() {
+    SparseLUTransposeView<true, SparseLU<MatrixType_, OrderingType_>> adjointView;
+    adjointView.setSparseLU(this);
+    adjointView.setIsInitialized(this->m_isInitialized);
+    return adjointView;
+  }
+
+  inline Index rows() const { return m_mat.rows(); }
+  inline Index cols() const { return m_mat.cols(); }
+  /** Indicate that the pattern of the input matrix is symmetric */
+  void isSymmetric(bool sym) { m_symmetricmode = sym; }
+
+  /** \returns an expression of the matrix L, internally stored as supernodes
+   * The only operation available with this expression is the triangular solve
+   * \code
+   * y = b; matrixL().solveInPlace(y);
+   * \endcode
+   */
+  SparseLUMatrixLReturnType<SCMatrix> matrixL() const { return SparseLUMatrixLReturnType<SCMatrix>(m_Lstore); }
+  /** \returns an expression of the matrix U,
+   * The only operation available with this expression is the triangular solve
+   * \code
+   * y = b; matrixU().solveInPlace(y);
+   * \endcode
+   */
+  SparseLUMatrixUReturnType<SCMatrix, Map<SparseMatrix<Scalar, ColMajor, StorageIndex>>> matrixU() const {
+    return SparseLUMatrixUReturnType<SCMatrix, Map<SparseMatrix<Scalar, ColMajor, StorageIndex>>>(m_Lstore, m_Ustore);
+  }
+
+  /**
+   * \returns a reference to the row matrix permutation \f$ P_r \f$ such that \f$P_r A P_c^T = L U\f$
+   * \sa colsPermutation()
+   */
+  inline const PermutationType& rowsPermutation() const { return m_perm_r; }
+  /**
+   * \returns a reference to the column matrix permutation\f$ P_c^T \f$ such that \f$P_r A P_c^T = L U\f$
+   * \sa rowsPermutation()
+   */
+  inline const PermutationType& colsPermutation() const { return m_perm_c; }
+  /** Set the threshold used for a diagonal entry to be an acceptable pivot. */
+  void setPivotThreshold(const RealScalar& thresh) { m_diagpivotthresh = thresh; }
 
 #ifdef EIGEN_PARSED_BY_DOXYGEN
-    /** \returns the solution X of \f$ A X = B \f$ using the current decomposition of A.
-      *
-      * \warning the destination matrix X in X = this->solve(B) must be colmun-major.
-      *
-      * \sa compute()
-      */
-    template<typename Rhs>
-    inline const Solve<SparseLU, Rhs> solve(const MatrixBase<Rhs>& B) const;
-#endif // EIGEN_PARSED_BY_DOXYGEN
-    
-    /** \brief Reports whether previous computation was successful.
-      *
-      * \returns \c Success if computation was successful,
-      *          \c NumericalIssue if the LU factorization reports a problem, zero diagonal for instance
-      *          \c InvalidInput if the input matrix is invalid
-      *
-      * \sa iparm()          
-      */
-    ComputationInfo info() const
-    {
-      eigen_assert(m_isInitialized && "Decomposition is not initialized.");
-      return m_info;
-    }
-    
-    /**
-      * \returns A string describing the type of error
-      */
-    std::string lastErrorMessage() const
-    {
-      return m_lastError; 
-    }
+  /** \returns the solution X of \f$ A X = B \f$ using the current decomposition of A.
+   *
+   * \warning the destination matrix X in X = this->solve(B) must be colmun-major.
+   *
+   * \sa compute()
+   */
+  template <typename Rhs>
+  inline const Solve<SparseLU, Rhs> solve(const MatrixBase<Rhs>& B) const;
+#endif  // EIGEN_PARSED_BY_DOXYGEN
 
-    template<typename Rhs, typename Dest>
-    bool _solve_impl(const MatrixBase<Rhs> &B, MatrixBase<Dest> &X_base) const
-    {
-      Dest& X(X_base.derived());
-      eigen_assert(m_factorizationIsOk && "The matrix should be factorized first");
-      EIGEN_STATIC_ASSERT((Dest::Flags&RowMajorBit)==0,
-                        THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);
-      
-      // Permute the right hand side to form X = Pr*B
-      // on return, X is overwritten by the computed solution
-      X.resize(B.rows(),B.cols());
+  /** \brief Reports whether previous computation was successful.
+   *
+   * \returns \c Success if computation was successful,
+   *          \c NumericalIssue if the LU factorization reports a problem, zero diagonal for instance
+   *          \c InvalidInput if the input matrix is invalid
+   *
+   * \sa iparm()
+   */
+  ComputationInfo info() const {
+    eigen_assert(m_isInitialized && "Decomposition is not initialized.");
+    return m_info;
+  }
 
-      // this ugly const_cast_derived() helps to detect aliasing when applying the permutations
-      for(Index j = 0; j < B.cols(); ++j)
-        X.col(j) = rowsPermutation() * B.const_cast_derived().col(j);
-      
-      //Forward substitution with L
-      this->matrixL().solveInPlace(X);
-      this->matrixU().solveInPlace(X);
-      
-      // Permute back the solution 
-      for (Index j = 0; j < B.cols(); ++j)
-        X.col(j) = colsPermutation().inverse() * X.col(j);
-      
-      return true; 
-    }
-    
-    /**
-      * \returns the absolute value of the determinant of the matrix of which
-      * *this is the QR decomposition.
-      *
-      * \warning a determinant can be very big or small, so for matrices
-      * of large enough dimension, there is a risk of overflow/underflow.
-      * One way to work around that is to use logAbsDeterminant() instead.
-      *
-      * \sa logAbsDeterminant(), signDeterminant()
-      */
-    Scalar absDeterminant()
-    {
-      using std::abs;
-      eigen_assert(m_factorizationIsOk && "The matrix should be factorized first.");
-      // Initialize with the determinant of the row matrix
-      Scalar det = Scalar(1.);
-      // Note that the diagonal blocks of U are stored in supernodes,
-      // which are available in the  L part :)
-      for (Index j = 0; j < this->cols(); ++j)
-      {
-        for (typename SCMatrix::InnerIterator it(m_Lstore, j); it; ++it)
-        {
-          if(it.index() == j)
-          {
-            det *= abs(it.value());
-            break;
-          }
+  /**
+   * \returns A string describing the type of error
+   */
+  std::string lastErrorMessage() const { return m_lastError; }
+
+  template <typename Rhs, typename Dest>
+  bool _solve_impl(const MatrixBase<Rhs>& B, MatrixBase<Dest>& X_base) const {
+    Dest& X(X_base.derived());
+    eigen_assert(m_factorizationIsOk && "The matrix should be factorized first");
+    EIGEN_STATIC_ASSERT((Dest::Flags & RowMajorBit) == 0, THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);
+
+    // Permute the right hand side to form X = Pr*B
+    // on return, X is overwritten by the computed solution
+    X.resize(B.rows(), B.cols());
+
+    // this ugly const_cast_derived() helps to detect aliasing when applying the permutations
+    for (Index j = 0; j < B.cols(); ++j) X.col(j) = rowsPermutation() * B.const_cast_derived().col(j);
+
+    // Forward substitution with L
+    this->matrixL().solveInPlace(X);
+    this->matrixU().solveInPlace(X);
+
+    // Permute back the solution
+    for (Index j = 0; j < B.cols(); ++j) X.col(j) = colsPermutation().inverse() * X.col(j);
+
+    return true;
+  }
+
+  /**
+   * \returns the absolute value of the determinant of the matrix of which
+   * *this is the QR decomposition.
+   *
+   * \warning a determinant can be very big or small, so for matrices
+   * of large enough dimension, there is a risk of overflow/underflow.
+   * One way to work around that is to use logAbsDeterminant() instead.
+   *
+   * \sa logAbsDeterminant(), signDeterminant()
+   */
+  Scalar absDeterminant() {
+    using std::abs;
+    eigen_assert(m_factorizationIsOk && "The matrix should be factorized first.");
+    // Initialize with the determinant of the row matrix
+    Scalar det = Scalar(1.);
+    // Note that the diagonal blocks of U are stored in supernodes,
+    // which are available in the  L part :)
+    for (Index j = 0; j < this->cols(); ++j) {
+      for (typename SCMatrix::InnerIterator it(m_Lstore, j); it; ++it) {
+        if (it.index() == j) {
+          det *= abs(it.value());
+          break;
         }
       }
-      return det;
     }
+    return det;
+  }
 
-    /** \returns the natural log of the absolute value of the determinant of the matrix
-      * of which **this is the QR decomposition
-      *
-      * \note This method is useful to work around the risk of overflow/underflow that's
-      * inherent to the determinant computation.
-      *
-      * \sa absDeterminant(), signDeterminant()
-      */
-    Scalar logAbsDeterminant() const
-    {
-      using std::log;
-      using std::abs;
+  /** \returns the natural log of the absolute value of the determinant of the matrix
+   * of which **this is the QR decomposition
+   *
+   * \note This method is useful to work around the risk of overflow/underflow that's
+   * inherent to the determinant computation.
+   *
+   * \sa absDeterminant(), signDeterminant()
+   */
+  Scalar logAbsDeterminant() const {
+    using std::abs;
+    using std::log;
 
-      eigen_assert(m_factorizationIsOk && "The matrix should be factorized first.");
-      Scalar det = Scalar(0.);
-      for (Index j = 0; j < this->cols(); ++j)
-      {
-        for (typename SCMatrix::InnerIterator it(m_Lstore, j); it; ++it)
-        {
-          if(it.row() < j) continue;
-          if(it.row() == j)
-          {
-            det += log(abs(it.value()));
-            break;
-          }
+    eigen_assert(m_factorizationIsOk && "The matrix should be factorized first.");
+    Scalar det = Scalar(0.);
+    for (Index j = 0; j < this->cols(); ++j) {
+      for (typename SCMatrix::InnerIterator it(m_Lstore, j); it; ++it) {
+        if (it.row() < j) continue;
+        if (it.row() == j) {
+          det += log(abs(it.value()));
+          break;
         }
       }
-      return det;
     }
+    return det;
+  }
 
-    /** \returns A number representing the sign of the determinant
-      *
-      * \sa absDeterminant(), logAbsDeterminant()
-      */
-    Scalar signDeterminant()
-    {
-      eigen_assert(m_factorizationIsOk && "The matrix should be factorized first.");
-      // Initialize with the determinant of the row matrix
-      Index det = 1;
-      // Note that the diagonal blocks of U are stored in supernodes,
-      // which are available in the  L part :)
-      for (Index j = 0; j < this->cols(); ++j)
-      {
-        for (typename SCMatrix::InnerIterator it(m_Lstore, j); it; ++it)
-        {
-          if(it.index() == j)
-          {
-            if(it.value()<0)
-              det = -det;
-            else if(it.value()==0)
-              return 0;
-            break;
-          }
+  /** \returns A number representing the sign of the determinant
+   *
+   * \sa absDeterminant(), logAbsDeterminant()
+   */
+  Scalar signDeterminant() {
+    eigen_assert(m_factorizationIsOk && "The matrix should be factorized first.");
+    // Initialize with the determinant of the row matrix
+    Index det = 1;
+    // Note that the diagonal blocks of U are stored in supernodes,
+    // which are available in the  L part :)
+    for (Index j = 0; j < this->cols(); ++j) {
+      for (typename SCMatrix::InnerIterator it(m_Lstore, j); it; ++it) {
+        if (it.index() == j) {
+          if (it.value() < 0)
+            det = -det;
+          else if (it.value() == 0)
+            return 0;
+          break;
         }
       }
-      return det * m_detPermR * m_detPermC;
     }
-    
-    /** \returns The determinant of the matrix.
-      *
-      * \sa absDeterminant(), logAbsDeterminant()
-      */
-    Scalar determinant()
-    {
-      eigen_assert(m_factorizationIsOk && "The matrix should be factorized first.");
-      // Initialize with the determinant of the row matrix
-      Scalar det = Scalar(1.);
-      // Note that the diagonal blocks of U are stored in supernodes,
-      // which are available in the  L part :)
-      for (Index j = 0; j < this->cols(); ++j)
-      {
-        for (typename SCMatrix::InnerIterator it(m_Lstore, j); it; ++it)
-        {
-          if(it.index() == j)
-          {
-            det *= it.value();
-            break;
-          }
+    return det * m_detPermR * m_detPermC;
+  }
+
+  /** \returns The determinant of the matrix.
+   *
+   * \sa absDeterminant(), logAbsDeterminant()
+   */
+  Scalar determinant() {
+    eigen_assert(m_factorizationIsOk && "The matrix should be factorized first.");
+    // Initialize with the determinant of the row matrix
+    Scalar det = Scalar(1.);
+    // Note that the diagonal blocks of U are stored in supernodes,
+    // which are available in the  L part :)
+    for (Index j = 0; j < this->cols(); ++j) {
+      for (typename SCMatrix::InnerIterator it(m_Lstore, j); it; ++it) {
+        if (it.index() == j) {
+          det *= it.value();
+          break;
         }
       }
-      return (m_detPermR * m_detPermC) > 0 ? det : -det;
     }
+    return (m_detPermR * m_detPermC) > 0 ? det : -det;
+  }
 
-    Index nnzL() const { return m_nnzL; }
-    Index nnzU() const { return m_nnzU; }
+  Index nnzL() const { return m_nnzL; }
+  Index nnzU() const { return m_nnzU; }
 
-  protected:
-    // Functions 
-    void initperfvalues()
-    {
-      m_perfv.panel_size = 16;
-      m_perfv.relax = 1; 
-      m_perfv.maxsuper = 128; 
-      m_perfv.rowblk = 16; 
-      m_perfv.colblk = 8; 
-      m_perfv.fillfactor = 20;  
-    }
-      
-    // Variables 
-    mutable ComputationInfo m_info;
-    bool m_factorizationIsOk;
-    bool m_analysisIsOk;
-    std::string m_lastError;
-    NCMatrix m_mat; // The input (permuted ) matrix 
-    SCMatrix m_Lstore; // The lower triangular matrix (supernodal)
-    Map<SparseMatrix<Scalar,ColMajor,StorageIndex>> m_Ustore; // The upper triangular matrix
-    PermutationType m_perm_c; // Column permutation 
-    PermutationType m_perm_r ; // Row permutation
-    IndexVector m_etree; // Column elimination tree 
-    
-    typename Base::GlobalLU_t m_glu; 
-                               
-    // SparseLU options 
-    bool m_symmetricmode;
-    // values for performance 
-    internal::perfvalues m_perfv;
-    RealScalar m_diagpivotthresh; // Specifies the threshold used for a diagonal entry to be an acceptable pivot
-    Index m_nnzL, m_nnzU; // Nonzeros in L and U factors
-    Index m_detPermR, m_detPermC; // Determinants of the permutation matrices
-  private:
-    // Disable copy constructor 
-    SparseLU (const SparseLU& );
-}; // End class SparseLU
+ protected:
+  // Functions
+  void initperfvalues() {
+    m_perfv.panel_size = 16;
+    m_perfv.relax = 1;
+    m_perfv.maxsuper = 128;
+    m_perfv.rowblk = 16;
+    m_perfv.colblk = 8;
+    m_perfv.fillfactor = 20;
+  }
 
+  // Variables
+  mutable ComputationInfo m_info;
+  bool m_factorizationIsOk;
+  bool m_analysisIsOk;
+  std::string m_lastError;
+  NCMatrix m_mat;                                              // The input (permuted ) matrix
+  SCMatrix m_Lstore;                                           // The lower triangular matrix (supernodal)
+  Map<SparseMatrix<Scalar, ColMajor, StorageIndex>> m_Ustore;  // The upper triangular matrix
+  PermutationType m_perm_c;                                    // Column permutation
+  PermutationType m_perm_r;                                    // Row permutation
+  IndexVector m_etree;                                         // Column elimination tree
 
+  typename Base::GlobalLU_t m_glu;
+
+  // SparseLU options
+  bool m_symmetricmode;
+  // values for performance
+  internal::perfvalues m_perfv;
+  RealScalar m_diagpivotthresh;  // Specifies the threshold used for a diagonal entry to be an acceptable pivot
+  Index m_nnzL, m_nnzU;          // Nonzeros in L and U factors
+  Index m_detPermR, m_detPermC;  // Determinants of the permutation matrices
+ private:
+  // Disable copy constructor
+  SparseLU(const SparseLU&);
+};  // End class SparseLU
 
 // Functions needed by the anaysis phase
-/** 
-  * Compute the column permutation to minimize the fill-in
-  * 
-  *  - Apply this permutation to the input matrix - 
-  * 
-  *  - Compute the column elimination tree on the permuted matrix 
-  * 
-  *  - Postorder the elimination tree and the column permutation
-  * 
-  */
+/**
+ * Compute the column permutation to minimize the fill-in
+ *
+ *  - Apply this permutation to the input matrix -
+ *
+ *  - Compute the column elimination tree on the permuted matrix
+ *
+ *  - Postorder the elimination tree and the column permutation
+ *
+ */
 template <typename MatrixType, typename OrderingType>
-void SparseLU<MatrixType, OrderingType>::analyzePattern(const MatrixType& mat)
-{
-  
-  //TODO  It is possible as in SuperLU to compute row and columns scaling vectors to equilibrate the matrix mat.
-  
-  // Firstly, copy the whole input matrix. 
+void SparseLU<MatrixType, OrderingType>::analyzePattern(const MatrixType& mat) {
+  // TODO  It is possible as in SuperLU to compute row and columns scaling vectors to equilibrate the matrix mat.
+
+  // Firstly, copy the whole input matrix.
   m_mat = mat;
-  
+
   // Compute fill-in ordering
-  OrderingType ord; 
-  ord(m_mat,m_perm_c);
-  
+  OrderingType ord;
+  ord(m_mat, m_perm_c);
+
   // Apply the permutation to the column of the input  matrix
-  if (m_perm_c.size())
-  {
-    m_mat.uncompress(); //NOTE: The effect of this command is only to create the InnerNonzeros pointers. FIXME : This vector is filled but not subsequently used.  
+  if (m_perm_c.size()) {
+    m_mat.uncompress();  // NOTE: The effect of this command is only to create the InnerNonzeros pointers. FIXME : This
+                         // vector is filled but not subsequently used.
     // Then, permute only the column pointers
-    ei_declare_aligned_stack_constructed_variable(StorageIndex,outerIndexPtr,mat.cols()+1,mat.isCompressed()?const_cast<StorageIndex*>(mat.outerIndexPtr()):0);
-    
-    // If the input matrix 'mat' is uncompressed, then the outer-indices do not match the ones of m_mat, and a copy is thus needed.
-    if(!mat.isCompressed()) 
-      IndexVector::Map(outerIndexPtr, mat.cols()+1) = IndexVector::Map(m_mat.outerIndexPtr(),mat.cols()+1);
-    
+    ei_declare_aligned_stack_constructed_variable(
+        StorageIndex, outerIndexPtr, mat.cols() + 1,
+        mat.isCompressed() ? const_cast<StorageIndex*>(mat.outerIndexPtr()) : 0);
+
+    // If the input matrix 'mat' is uncompressed, then the outer-indices do not match the ones of m_mat, and a copy is
+    // thus needed.
+    if (!mat.isCompressed())
+      IndexVector::Map(outerIndexPtr, mat.cols() + 1) = IndexVector::Map(m_mat.outerIndexPtr(), mat.cols() + 1);
+
     // Apply the permutation and compute the nnz per column.
-    for (Index i = 0; i < mat.cols(); i++)
-    {
+    for (Index i = 0; i < mat.cols(); i++) {
       m_mat.outerIndexPtr()[m_perm_c.indices()(i)] = outerIndexPtr[i];
-      m_mat.innerNonZeroPtr()[m_perm_c.indices()(i)] = outerIndexPtr[i+1] - outerIndexPtr[i];
+      m_mat.innerNonZeroPtr()[m_perm_c.indices()(i)] = outerIndexPtr[i + 1] - outerIndexPtr[i];
     }
   }
-  
-  // Compute the column elimination tree of the permuted matrix 
+
+  // Compute the column elimination tree of the permuted matrix
   IndexVector firstRowElt;
-  internal::coletree(m_mat, m_etree,firstRowElt); 
-     
+  internal::coletree(m_mat, m_etree, firstRowElt);
+
   // In symmetric mode, do not do postorder here
   if (!m_symmetricmode) {
-    IndexVector post, iwork; 
+    IndexVector post, iwork;
     // Post order etree
-    internal::treePostorder(StorageIndex(m_mat.cols()), m_etree, post); 
-      
-   
-    // Renumber etree in postorder 
-    Index m = m_mat.cols(); 
-    iwork.resize(m+1);
+    internal::treePostorder(StorageIndex(m_mat.cols()), m_etree, post);
+
+    // Renumber etree in postorder
+    Index m = m_mat.cols();
+    iwork.resize(m + 1);
     for (Index i = 0; i < m; ++i) iwork(post(i)) = post(m_etree(i));
     m_etree = iwork;
-    
+
     // Postmultiply A*Pc by post, i.e reorder the matrix according to the postorder of the etree
-    PermutationType post_perm(m); 
-    for (Index i = 0; i < m; i++) 
-      post_perm.indices()(i) = post(i); 
-        
+    PermutationType post_perm(m);
+    for (Index i = 0; i < m; i++) post_perm.indices()(i) = post(i);
+
     // Combine the two permutations : postorder the permutation for future use
-    if(m_perm_c.size()) {
+    if (m_perm_c.size()) {
       m_perm_c = post_perm * m_perm_c;
     }
-    
-  } // end postordering 
-  
-  m_analysisIsOk = true; 
+
+  }  // end postordering
+
+  m_analysisIsOk = true;
 }
 
 // Functions needed by the numerical factorization phase
 
-
-/** 
-  *  - Numerical factorization 
-  *  - Interleaved with the symbolic factorization 
-  * On exit,  info is 
-  * 
-  *    = 0: successful factorization
-  * 
-  *    > 0: if info = i, and i is
-  * 
-  *       <= A->ncol: U(i,i) is exactly zero. The factorization has
-  *          been completed, but the factor U is exactly singular,
-  *          and division by zero will occur if it is used to solve a
-  *          system of equations.
-  * 
-  *       > A->ncol: number of bytes allocated when memory allocation
-  *         failure occurred, plus A->ncol. If lwork = -1, it is
-  *         the estimated amount of space needed, plus A->ncol.  
-  */
+/**
+ *  - Numerical factorization
+ *  - Interleaved with the symbolic factorization
+ * On exit,  info is
+ *
+ *    = 0: successful factorization
+ *
+ *    > 0: if info = i, and i is
+ *
+ *       <= A->ncol: U(i,i) is exactly zero. The factorization has
+ *          been completed, but the factor U is exactly singular,
+ *          and division by zero will occur if it is used to solve a
+ *          system of equations.
+ *
+ *       > A->ncol: number of bytes allocated when memory allocation
+ *         failure occurred, plus A->ncol. If lwork = -1, it is
+ *         the estimated amount of space needed, plus A->ncol.
+ */
 template <typename MatrixType, typename OrderingType>
-void SparseLU<MatrixType, OrderingType>::factorize(const MatrixType& matrix)
-{
+void SparseLU<MatrixType, OrderingType>::factorize(const MatrixType& matrix) {
   using internal::emptyIdxLU;
-  eigen_assert(m_analysisIsOk && "analyzePattern() should be called first"); 
+  eigen_assert(m_analysisIsOk && "analyzePattern() should be called first");
   eigen_assert((matrix.rows() == matrix.cols()) && "Only for squared matrices");
-  
+
   m_isInitialized = true;
-  
+
   // Apply the column permutation computed in analyzepattern()
-  //   m_mat = matrix * m_perm_c.inverse(); 
+  //   m_mat = matrix * m_perm_c.inverse();
   m_mat = matrix;
-  if (m_perm_c.size()) 
-  {
-    m_mat.uncompress(); //NOTE: The effect of this command is only to create the InnerNonzeros pointers.
-    //Then, permute only the column pointers
-    const StorageIndex * outerIndexPtr;
-    if (matrix.isCompressed()) outerIndexPtr = matrix.outerIndexPtr();
-    else
-    {
-      StorageIndex* outerIndexPtr_t = new StorageIndex[matrix.cols()+1];
-      for(Index i = 0; i <= matrix.cols(); i++) outerIndexPtr_t[i] = m_mat.outerIndexPtr()[i];
+  if (m_perm_c.size()) {
+    m_mat.uncompress();  // NOTE: The effect of this command is only to create the InnerNonzeros pointers.
+    // Then, permute only the column pointers
+    const StorageIndex* outerIndexPtr;
+    if (matrix.isCompressed())
+      outerIndexPtr = matrix.outerIndexPtr();
+    else {
+      StorageIndex* outerIndexPtr_t = new StorageIndex[matrix.cols() + 1];
+      for (Index i = 0; i <= matrix.cols(); i++) outerIndexPtr_t[i] = m_mat.outerIndexPtr()[i];
       outerIndexPtr = outerIndexPtr_t;
     }
-    for (Index i = 0; i < matrix.cols(); i++)
-    {
+    for (Index i = 0; i < matrix.cols(); i++) {
       m_mat.outerIndexPtr()[m_perm_c.indices()(i)] = outerIndexPtr[i];
-      m_mat.innerNonZeroPtr()[m_perm_c.indices()(i)] = outerIndexPtr[i+1] - outerIndexPtr[i];
+      m_mat.innerNonZeroPtr()[m_perm_c.indices()(i)] = outerIndexPtr[i + 1] - outerIndexPtr[i];
     }
-    if(!matrix.isCompressed()) delete[] outerIndexPtr;
-  } 
-  else 
-  { //FIXME This should not be needed if the empty permutation is handled transparently
+    if (!matrix.isCompressed()) delete[] outerIndexPtr;
+  } else {  // FIXME This should not be needed if the empty permutation is handled transparently
     m_perm_c.resize(matrix.cols());
-    for(StorageIndex i = 0; i < matrix.cols(); ++i) m_perm_c.indices()(i) = i;
+    for (StorageIndex i = 0; i < matrix.cols(); ++i) m_perm_c.indices()(i) = i;
   }
-  
+
   Index m = m_mat.rows();
   Index n = m_mat.cols();
   Index nnz = m_mat.nonZeros();
   Index maxpanel = m_perfv.panel_size * m;
   // Allocate working storage common to the factor routines
   Index lwork = 0;
-  Index info = Base::memInit(m, n, nnz, lwork, m_perfv.fillfactor, m_perfv.panel_size, m_glu); 
-  if (info) 
-  {
-    m_lastError = "UNABLE TO ALLOCATE WORKING MEMORY\n\n" ;
+  Index info = Base::memInit(m, n, nnz, lwork, m_perfv.fillfactor, m_perfv.panel_size, m_glu);
+  if (info) {
+    m_lastError = "UNABLE TO ALLOCATE WORKING MEMORY\n\n";
     m_factorizationIsOk = false;
-    return ; 
+    return;
   }
-  
-  // Set up pointers for integer working arrays 
-  IndexVector segrep(m); segrep.setZero();
-  IndexVector parent(m); parent.setZero();
-  IndexVector xplore(m); xplore.setZero();
+
+  // Set up pointers for integer working arrays
+  IndexVector segrep(m);
+  segrep.setZero();
+  IndexVector parent(m);
+  parent.setZero();
+  IndexVector xplore(m);
+  xplore.setZero();
   IndexVector repfnz(maxpanel);
   IndexVector panel_lsub(maxpanel);
-  IndexVector xprune(n); xprune.setZero();
-  IndexVector marker(m*internal::LUNoMarker); marker.setZero();
-  
-  repfnz.setConstant(-1); 
+  IndexVector xprune(n);
+  xprune.setZero();
+  IndexVector marker(m * internal::LUNoMarker);
+  marker.setZero();
+
+  repfnz.setConstant(-1);
   panel_lsub.setConstant(-1);
-  
-  // Set up pointers for scalar working arrays 
-  ScalarVector dense; 
+
+  // Set up pointers for scalar working arrays
+  ScalarVector dense;
   dense.setZero(maxpanel);
-  ScalarVector tempv; 
-  tempv.setZero(internal::LUnumTempV(m, m_perfv.panel_size, m_perfv.maxsuper, /*m_perfv.rowblk*/m) );
-  
+  ScalarVector tempv;
+  tempv.setZero(internal::LUnumTempV(m, m_perfv.panel_size, m_perfv.maxsuper, /*m_perfv.rowblk*/ m));
+
   // Compute the inverse of perm_c
-  PermutationType iperm_c(m_perm_c.inverse()); 
-  
+  PermutationType iperm_c(m_perm_c.inverse());
+
   // Identify initial relaxed snodes
   IndexVector relax_end(n);
-  if ( m_symmetricmode == true ) 
+  if (m_symmetricmode == true)
     Base::heap_relax_snode(n, m_etree, m_perfv.relax, marker, relax_end);
   else
     Base::relax_snode(n, m_etree, m_perfv.relax, marker, relax_end);
-  
-  
-  m_perm_r.resize(m); 
+
+  m_perm_r.resize(m);
   m_perm_r.indices().setConstant(-1);
   marker.setConstant(-1);
-  m_detPermR = 1; // Record the determinant of the row permutation
-  
-  m_glu.supno(0) = emptyIdxLU; m_glu.xsup.setConstant(0);
+  m_detPermR = 1;  // Record the determinant of the row permutation
+
+  m_glu.supno(0) = emptyIdxLU;
+  m_glu.xsup.setConstant(0);
   m_glu.xsup(0) = m_glu.xlsub(0) = m_glu.xusub(0) = m_glu.xlusup(0) = Index(0);
-  
+
   // Work on one 'panel' at a time. A panel is one of the following :
   //  (a) a relaxed supernode at the bottom of the etree, or
   //  (b) panel_size contiguous columns, <panel_size> defined by the user
-  Index jcol; 
-  Index pivrow; // Pivotal row number in the original row matrix
-  Index nseg1; // Number of segments in U-column above panel row jcol
-  Index nseg; // Number of segments in each U-column 
-  Index irep; 
-  Index i, k, jj; 
-  for (jcol = 0; jcol < n; )
-  {
-    // Adjust panel size so that a panel won't overlap with the next relaxed snode. 
-    Index panel_size = m_perfv.panel_size; // upper bound on panel width
-    for (k = jcol + 1; k < (std::min)(jcol+panel_size, n); k++)
-    {
-      if (relax_end(k) != emptyIdxLU) 
-      {
-        panel_size = k - jcol; 
-        break; 
+  Index jcol;
+  Index pivrow;  // Pivotal row number in the original row matrix
+  Index nseg1;   // Number of segments in U-column above panel row jcol
+  Index nseg;    // Number of segments in each U-column
+  Index irep;
+  Index i, k, jj;
+  for (jcol = 0; jcol < n;) {
+    // Adjust panel size so that a panel won't overlap with the next relaxed snode.
+    Index panel_size = m_perfv.panel_size;  // upper bound on panel width
+    for (k = jcol + 1; k < (std::min)(jcol + panel_size, n); k++) {
+      if (relax_end(k) != emptyIdxLU) {
+        panel_size = k - jcol;
+        break;
       }
     }
-    if (k == n) 
-      panel_size = n - jcol; 
-      
-    // Symbolic outer factorization on a panel of columns 
-    Base::panel_dfs(m, panel_size, jcol, m_mat, m_perm_r.indices(), nseg1, dense, panel_lsub, segrep, repfnz, xprune, marker, parent, xplore, m_glu); 
-    
-    // Numeric sup-panel updates in topological order 
-    Base::panel_bmod(m, panel_size, jcol, nseg1, dense, tempv, segrep, repfnz, m_glu); 
-    
-    // Sparse LU within the panel, and below the panel diagonal 
-    for ( jj = jcol; jj< jcol + panel_size; jj++) 
-    {
-      k = (jj - jcol) * m; // Column index for w-wide arrays 
-      
-      nseg = nseg1; // begin after all the panel segments
-      //Depth-first-search for the current column
+    if (k == n) panel_size = n - jcol;
+
+    // Symbolic outer factorization on a panel of columns
+    Base::panel_dfs(m, panel_size, jcol, m_mat, m_perm_r.indices(), nseg1, dense, panel_lsub, segrep, repfnz, xprune,
+                    marker, parent, xplore, m_glu);
+
+    // Numeric sup-panel updates in topological order
+    Base::panel_bmod(m, panel_size, jcol, nseg1, dense, tempv, segrep, repfnz, m_glu);
+
+    // Sparse LU within the panel, and below the panel diagonal
+    for (jj = jcol; jj < jcol + panel_size; jj++) {
+      k = (jj - jcol) * m;  // Column index for w-wide arrays
+
+      nseg = nseg1;  // begin after all the panel segments
+      // Depth-first-search for the current column
       VectorBlock<IndexVector> panel_lsubk(panel_lsub, k, m);
-      VectorBlock<IndexVector> repfnz_k(repfnz, k, m); 
-      info = Base::column_dfs(m, jj, m_perm_r.indices(), m_perfv.maxsuper, nseg, panel_lsubk, segrep, repfnz_k, xprune, marker, parent, xplore, m_glu); 
-      if ( info ) 
-      {
-        m_lastError =  "UNABLE TO EXPAND MEMORY IN COLUMN_DFS() ";
-        m_info = NumericalIssue; 
-        m_factorizationIsOk = false; 
-        return; 
+      VectorBlock<IndexVector> repfnz_k(repfnz, k, m);
+      info = Base::column_dfs(m, jj, m_perm_r.indices(), m_perfv.maxsuper, nseg, panel_lsubk, segrep, repfnz_k, xprune,
+                              marker, parent, xplore, m_glu);
+      if (info) {
+        m_lastError = "UNABLE TO EXPAND MEMORY IN COLUMN_DFS() ";
+        m_info = NumericalIssue;
+        m_factorizationIsOk = false;
+        return;
       }
-      // Numeric updates to this column 
-      VectorBlock<ScalarVector> dense_k(dense, k, m); 
-      VectorBlock<IndexVector> segrep_k(segrep, nseg1, m-nseg1); 
-      info = Base::column_bmod(jj, (nseg - nseg1), dense_k, tempv, segrep_k, repfnz_k, jcol, m_glu); 
-      if ( info ) 
-      {
+      // Numeric updates to this column
+      VectorBlock<ScalarVector> dense_k(dense, k, m);
+      VectorBlock<IndexVector> segrep_k(segrep, nseg1, m - nseg1);
+      info = Base::column_bmod(jj, (nseg - nseg1), dense_k, tempv, segrep_k, repfnz_k, jcol, m_glu);
+      if (info) {
         m_lastError = "UNABLE TO EXPAND MEMORY IN COLUMN_BMOD() ";
-        m_info = NumericalIssue; 
-        m_factorizationIsOk = false; 
-        return; 
+        m_info = NumericalIssue;
+        m_factorizationIsOk = false;
+        return;
       }
-      
+
       // Copy the U-segments to ucol(*)
-      info = Base::copy_to_ucol(jj, nseg, segrep, repfnz_k ,m_perm_r.indices(), dense_k, m_glu); 
-      if ( info ) 
-      {
+      info = Base::copy_to_ucol(jj, nseg, segrep, repfnz_k, m_perm_r.indices(), dense_k, m_glu);
+      if (info) {
         m_lastError = "UNABLE TO EXPAND MEMORY IN COPY_TO_UCOL() ";
-        m_info = NumericalIssue; 
-        m_factorizationIsOk = false; 
-        return; 
+        m_info = NumericalIssue;
+        m_factorizationIsOk = false;
+        return;
       }
-      
-      // Form the L-segment 
+
+      // Form the L-segment
       info = Base::pivotL(jj, m_diagpivotthresh, m_perm_r.indices(), iperm_c.indices(), pivrow, m_glu);
-      if ( info ) 
-      {
+      if (info) {
         m_lastError = "THE MATRIX IS STRUCTURALLY SINGULAR";
 #ifndef EIGEN_NO_IO
         std::ostringstream returnInfo;
@@ -763,61 +694,58 @@
         returnInfo << info;
         m_lastError += returnInfo.str();
 #endif
-        m_info = NumericalIssue; 
-        m_factorizationIsOk = false; 
-        return; 
+        m_info = NumericalIssue;
+        m_factorizationIsOk = false;
+        return;
       }
-      
+
       // Update the determinant of the row permutation matrix
-      // FIXME: the following test is not correct, we should probably take iperm_c into account and pivrow is not directly the row pivot.
+      // FIXME: the following test is not correct, we should probably take iperm_c into account and pivrow is not
+      // directly the row pivot.
       if (pivrow != jj) m_detPermR = -m_detPermR;
 
       // Prune columns (0:jj-1) using column jj
-      Base::pruneL(jj, m_perm_r.indices(), pivrow, nseg, segrep, repfnz_k, xprune, m_glu); 
-      
-      // Reset repfnz for this column 
-      for (i = 0; i < nseg; i++)
-      {
-        irep = segrep(i); 
-        repfnz_k(irep) = emptyIdxLU; 
+      Base::pruneL(jj, m_perm_r.indices(), pivrow, nseg, segrep, repfnz_k, xprune, m_glu);
+
+      // Reset repfnz for this column
+      for (i = 0; i < nseg; i++) {
+        irep = segrep(i);
+        repfnz_k(irep) = emptyIdxLU;
       }
-    } // end SparseLU within the panel  
+    }                    // end SparseLU within the panel
     jcol += panel_size;  // Move to the next panel
-  } // end for -- end elimination 
-  
+  }                      // end for -- end elimination
+
   m_detPermR = m_perm_r.determinant();
   m_detPermC = m_perm_c.determinant();
-  
-  // Count the number of nonzeros in factors 
-  Base::countnz(n, m_nnzL, m_nnzU, m_glu); 
-  // Apply permutation  to the L subscripts 
+
+  // Count the number of nonzeros in factors
+  Base::countnz(n, m_nnzL, m_nnzU, m_glu);
+  // Apply permutation  to the L subscripts
   Base::fixupL(n, m_perm_r.indices(), m_glu);
-  
-  // Create supernode matrix L 
-  m_Lstore.setInfos(m, n, m_glu.lusup, m_glu.xlusup, m_glu.lsub, m_glu.xlsub, m_glu.supno, m_glu.xsup); 
-  // Create the column major upper sparse matrix  U; 
-  new (&m_Ustore) Map<SparseMatrix<Scalar, ColMajor, StorageIndex>> ( m, n, m_nnzU, m_glu.xusub.data(), m_glu.usub.data(), m_glu.ucol.data() );
-  
+
+  // Create supernode matrix L
+  m_Lstore.setInfos(m, n, m_glu.lusup, m_glu.xlusup, m_glu.lsub, m_glu.xlsub, m_glu.supno, m_glu.xsup);
+  // Create the column major upper sparse matrix  U;
+  new (&m_Ustore) Map<SparseMatrix<Scalar, ColMajor, StorageIndex>>(m, n, m_nnzU, m_glu.xusub.data(), m_glu.usub.data(),
+                                                                    m_glu.ucol.data());
+
   m_info = Success;
   m_factorizationIsOk = true;
 }
 
-template<typename MappedSupernodalType>
-struct SparseLUMatrixLReturnType : internal::no_assignment_operator
-{
+template <typename MappedSupernodalType>
+struct SparseLUMatrixLReturnType : internal::no_assignment_operator {
   typedef typename MappedSupernodalType::Scalar Scalar;
-  explicit SparseLUMatrixLReturnType(const MappedSupernodalType& mapL) : m_mapL(mapL)
-  { }
+  explicit SparseLUMatrixLReturnType(const MappedSupernodalType& mapL) : m_mapL(mapL) {}
   Index rows() const { return m_mapL.rows(); }
   Index cols() const { return m_mapL.cols(); }
-  template<typename Dest>
-  void solveInPlace( MatrixBase<Dest> &X) const
-  {
+  template <typename Dest>
+  void solveInPlace(MatrixBase<Dest>& X) const {
     m_mapL.solveInPlace(X);
   }
-  template<bool Conjugate, typename Dest>
-  void solveTransposedInPlace( MatrixBase<Dest> &X) const
-  {
+  template <bool Conjugate, typename Dest>
+  void solveTransposedInPlace(MatrixBase<Dest>& X) const {
     m_mapL.template solveTransposedInPlace<Conjugate>(X);
   }
 
@@ -849,98 +777,81 @@
   const MappedSupernodalType& m_mapL;
 };
 
-template<typename MatrixLType, typename MatrixUType>
-struct SparseLUMatrixUReturnType : internal::no_assignment_operator
-{
+template <typename MatrixLType, typename MatrixUType>
+struct SparseLUMatrixUReturnType : internal::no_assignment_operator {
   typedef typename MatrixLType::Scalar Scalar;
-  SparseLUMatrixUReturnType(const MatrixLType& mapL, const MatrixUType& mapU)
-  : m_mapL(mapL),m_mapU(mapU)
-  { }
+  SparseLUMatrixUReturnType(const MatrixLType& mapL, const MatrixUType& mapU) : m_mapL(mapL), m_mapU(mapU) {}
   Index rows() const { return m_mapL.rows(); }
   Index cols() const { return m_mapL.cols(); }
 
-  template<typename Dest>   void solveInPlace(MatrixBase<Dest> &X) const
-  {
+  template <typename Dest>
+  void solveInPlace(MatrixBase<Dest>& X) const {
     Index nrhs = X.cols();
     // Backward solve with U
-    for (Index k = m_mapL.nsuper(); k >= 0; k--)
-    {
+    for (Index k = m_mapL.nsuper(); k >= 0; k--) {
       Index fsupc = m_mapL.supToCol()[k];
-      Index lda = m_mapL.colIndexPtr()[fsupc+1] - m_mapL.colIndexPtr()[fsupc]; // leading dimension
-      Index nsupc = m_mapL.supToCol()[k+1] - fsupc;
+      Index lda = m_mapL.colIndexPtr()[fsupc + 1] - m_mapL.colIndexPtr()[fsupc];  // leading dimension
+      Index nsupc = m_mapL.supToCol()[k + 1] - fsupc;
       Index luptr = m_mapL.colIndexPtr()[fsupc];
 
-      if (nsupc == 1)
-      {
-        for (Index j = 0; j < nrhs; j++)
-        {
+      if (nsupc == 1) {
+        for (Index j = 0; j < nrhs; j++) {
           X(fsupc, j) /= m_mapL.valuePtr()[luptr];
         }
-      }
-      else
-      {
+      } else {
         // FIXME: the following lines should use Block expressions and not Map!
-        Map<const Matrix<Scalar,Dynamic,Dynamic, ColMajor>, 0, OuterStride<> > A( &(m_mapL.valuePtr()[luptr]), nsupc, nsupc, OuterStride<>(lda) );
+        Map<const Matrix<Scalar, Dynamic, Dynamic, ColMajor>, 0, OuterStride<>> A(&(m_mapL.valuePtr()[luptr]), nsupc,
+                                                                                  nsupc, OuterStride<>(lda));
         typename Dest::RowsBlockXpr U = X.derived().middleRows(fsupc, nsupc);
         U = A.template triangularView<Upper>().solve(U);
       }
 
-      for (Index j = 0; j < nrhs; ++j)
-      {
-        for (Index jcol = fsupc; jcol < fsupc + nsupc; jcol++)
-        {
+      for (Index j = 0; j < nrhs; ++j) {
+        for (Index jcol = fsupc; jcol < fsupc + nsupc; jcol++) {
           typename MatrixUType::InnerIterator it(m_mapU, jcol);
-          for ( ; it; ++it)
-          {
+          for (; it; ++it) {
             Index irow = it.index();
             X(irow, j) -= X(jcol, j) * it.value();
           }
         }
       }
-    } // End For U-solve
+    }  // End For U-solve
   }
 
-  template<bool Conjugate, typename Dest>   void solveTransposedInPlace(MatrixBase<Dest> &X) const
-  {
+  template <bool Conjugate, typename Dest>
+  void solveTransposedInPlace(MatrixBase<Dest>& X) const {
     using numext::conj;
     Index nrhs = X.cols();
     // Forward solve with U
-    for (Index k = 0; k <=  m_mapL.nsuper(); k++)
-    {
+    for (Index k = 0; k <= m_mapL.nsuper(); k++) {
       Index fsupc = m_mapL.supToCol()[k];
-      Index lda = m_mapL.colIndexPtr()[fsupc+1] - m_mapL.colIndexPtr()[fsupc]; // leading dimension
-      Index nsupc = m_mapL.supToCol()[k+1] - fsupc;
+      Index lda = m_mapL.colIndexPtr()[fsupc + 1] - m_mapL.colIndexPtr()[fsupc];  // leading dimension
+      Index nsupc = m_mapL.supToCol()[k + 1] - fsupc;
       Index luptr = m_mapL.colIndexPtr()[fsupc];
 
-      for (Index j = 0; j < nrhs; ++j)
-      {
-        for (Index jcol = fsupc; jcol < fsupc + nsupc; jcol++)
-        {
+      for (Index j = 0; j < nrhs; ++j) {
+        for (Index jcol = fsupc; jcol < fsupc + nsupc; jcol++) {
           typename MatrixUType::InnerIterator it(m_mapU, jcol);
-          for ( ; it; ++it)
-          {
+          for (; it; ++it) {
             Index irow = it.index();
-            X(jcol, j) -= X(irow, j) * (Conjugate? conj(it.value()): it.value());
+            X(jcol, j) -= X(irow, j) * (Conjugate ? conj(it.value()) : it.value());
           }
         }
       }
-      if (nsupc == 1)
-      {
-        for (Index j = 0; j < nrhs; j++)
-        {
-          X(fsupc, j) /= (Conjugate? conj(m_mapL.valuePtr()[luptr]) : m_mapL.valuePtr()[luptr]);
+      if (nsupc == 1) {
+        for (Index j = 0; j < nrhs; j++) {
+          X(fsupc, j) /= (Conjugate ? conj(m_mapL.valuePtr()[luptr]) : m_mapL.valuePtr()[luptr]);
         }
-      }
-      else
-      {
-        Map<const Matrix<Scalar,Dynamic,Dynamic, ColMajor>, 0, OuterStride<> > A( &(m_mapL.valuePtr()[luptr]), nsupc, nsupc, OuterStride<>(lda) );
+      } else {
+        Map<const Matrix<Scalar, Dynamic, Dynamic, ColMajor>, 0, OuterStride<>> A(&(m_mapL.valuePtr()[luptr]), nsupc,
+                                                                                  nsupc, OuterStride<>(lda));
         typename Dest::RowsBlockXpr U = X.derived().middleRows(fsupc, nsupc);
-        if(Conjugate)
+        if (Conjugate)
           U = A.adjoint().template triangularView<Lower>().solve(U);
         else
           U = A.transpose().template triangularView<Lower>().solve(U);
       }
-    }// End For U-solve
+    }  // End For U-solve
   }
 
   SparseMatrix<Scalar, RowMajor, Index> toSparse() {
@@ -974,6 +885,6 @@
   const MatrixUType& m_mapU;
 };
 
-} // End namespace Eigen 
+}  // End namespace Eigen
 
 #endif
diff --git a/Eigen/src/SparseLU/SparseLUImpl.h b/Eigen/src/SparseLU/SparseLUImpl.h
index ff2b111..96b9c65 100644
--- a/Eigen/src/SparseLU/SparseLUImpl.h
+++ b/Eigen/src/SparseLU/SparseLUImpl.h
@@ -14,56 +14,66 @@
 
 namespace Eigen {
 namespace internal {
-  
-/** \ingroup SparseLU_Module
-  * \class SparseLUImpl
-  * Base class for sparseLU
-  */
-template <typename Scalar, typename StorageIndex>
-class SparseLUImpl
-{
-  public:
-    typedef Matrix<Scalar,Dynamic,1> ScalarVector;
-    typedef Matrix<StorageIndex,Dynamic,1> IndexVector; 
-    typedef Matrix<Scalar,Dynamic,Dynamic,ColMajor> ScalarMatrix;
-    typedef Map<ScalarMatrix, 0,  OuterStride<> > MappedMatrixBlock;
-    typedef typename ScalarVector::RealScalar RealScalar; 
-    typedef Ref<Matrix<Scalar,Dynamic,1> > BlockScalarVector;
-    typedef Ref<Matrix<StorageIndex,Dynamic,1> > BlockIndexVector;
-    typedef LU_GlobalLU_t<IndexVector, ScalarVector> GlobalLU_t; 
-    typedef SparseMatrix<Scalar,ColMajor,StorageIndex> MatrixType; 
-    
-  protected:
-     template <typename VectorType>
-     Index expand(VectorType& vec, Index& length, Index nbElts, Index keep_prev, Index& num_expansions);
-     Index memInit(Index m, Index n, Index annz, Index lwork, Index fillratio, Index panel_size,  GlobalLU_t& glu); 
-     template <typename VectorType>
-     Index memXpand(VectorType& vec, Index& maxlen, Index nbElts, MemType memtype, Index& num_expansions);
-     void heap_relax_snode (const Index n, IndexVector& et, const Index relax_columns, IndexVector& descendants, IndexVector& relax_end); 
-     void relax_snode (const Index n, IndexVector& et, const Index relax_columns, IndexVector& descendants, IndexVector& relax_end); 
-     Index snode_dfs(const Index jcol, const Index kcol,const MatrixType& mat,  IndexVector& xprune, IndexVector& marker, GlobalLU_t& glu); 
-     Index snode_bmod (const Index jcol, const Index fsupc, ScalarVector& dense, GlobalLU_t& glu);
-     Index pivotL(const Index jcol, const RealScalar& diagpivotthresh, IndexVector& perm_r, IndexVector& iperm_c, Index& pivrow, GlobalLU_t& glu);
-     template <typename Traits>
-     void dfs_kernel(const StorageIndex jj, IndexVector& perm_r,
-                    Index& nseg, IndexVector& panel_lsub, IndexVector& segrep,
-                    Ref<IndexVector> repfnz_col, IndexVector& xprune, Ref<IndexVector> marker, IndexVector& parent,
-                    IndexVector& xplore, GlobalLU_t& glu, Index& nextl_col, Index krow, Traits& traits);
-     void panel_dfs(const Index m, const Index w, const Index jcol, MatrixType& A, IndexVector& perm_r, Index& nseg, ScalarVector& dense, IndexVector& panel_lsub, IndexVector& segrep, IndexVector& repfnz, IndexVector& xprune, IndexVector& marker, IndexVector& parent, IndexVector& xplore, GlobalLU_t& glu);
-    
-     void panel_bmod(const Index m, const Index w, const Index jcol, const Index nseg, ScalarVector& dense, ScalarVector& tempv, IndexVector& segrep, IndexVector& repfnz, GlobalLU_t& glu);
-     Index column_dfs(const Index m, const Index jcol, IndexVector& perm_r, Index maxsuper, Index& nseg,  BlockIndexVector lsub_col, IndexVector& segrep, BlockIndexVector repfnz, IndexVector& xprune, IndexVector& marker, IndexVector& parent, IndexVector& xplore, GlobalLU_t& glu);
-     Index column_bmod(const Index jcol, const Index nseg, BlockScalarVector dense, ScalarVector& tempv, BlockIndexVector segrep, BlockIndexVector repfnz, Index fpanelc, GlobalLU_t& glu); 
-     Index copy_to_ucol(const Index jcol, const Index nseg, IndexVector& segrep, BlockIndexVector repfnz ,IndexVector& perm_r, BlockScalarVector dense, GlobalLU_t& glu); 
-     void pruneL(const Index jcol, const IndexVector& perm_r, const Index pivrow, const Index nseg, const IndexVector& segrep, BlockIndexVector repfnz, IndexVector& xprune, GlobalLU_t& glu);
-     void countnz(const Index n, Index& nnzL, Index& nnzU, GlobalLU_t& glu); 
-     void fixupL(const Index n, const IndexVector& perm_r, GlobalLU_t& glu); 
-     
-     template<typename , typename >
-     friend struct column_dfs_traits;
-}; 
 
-} // end namespace internal
-} // namespace Eigen
+/** \ingroup SparseLU_Module
+ * \class SparseLUImpl
+ * Base class for sparseLU
+ */
+template <typename Scalar, typename StorageIndex>
+class SparseLUImpl {
+ public:
+  typedef Matrix<Scalar, Dynamic, 1> ScalarVector;
+  typedef Matrix<StorageIndex, Dynamic, 1> IndexVector;
+  typedef Matrix<Scalar, Dynamic, Dynamic, ColMajor> ScalarMatrix;
+  typedef Map<ScalarMatrix, 0, OuterStride<> > MappedMatrixBlock;
+  typedef typename ScalarVector::RealScalar RealScalar;
+  typedef Ref<Matrix<Scalar, Dynamic, 1> > BlockScalarVector;
+  typedef Ref<Matrix<StorageIndex, Dynamic, 1> > BlockIndexVector;
+  typedef LU_GlobalLU_t<IndexVector, ScalarVector> GlobalLU_t;
+  typedef SparseMatrix<Scalar, ColMajor, StorageIndex> MatrixType;
+
+ protected:
+  template <typename VectorType>
+  Index expand(VectorType& vec, Index& length, Index nbElts, Index keep_prev, Index& num_expansions);
+  Index memInit(Index m, Index n, Index annz, Index lwork, Index fillratio, Index panel_size, GlobalLU_t& glu);
+  template <typename VectorType>
+  Index memXpand(VectorType& vec, Index& maxlen, Index nbElts, MemType memtype, Index& num_expansions);
+  void heap_relax_snode(const Index n, IndexVector& et, const Index relax_columns, IndexVector& descendants,
+                        IndexVector& relax_end);
+  void relax_snode(const Index n, IndexVector& et, const Index relax_columns, IndexVector& descendants,
+                   IndexVector& relax_end);
+  Index snode_dfs(const Index jcol, const Index kcol, const MatrixType& mat, IndexVector& xprune, IndexVector& marker,
+                  GlobalLU_t& glu);
+  Index snode_bmod(const Index jcol, const Index fsupc, ScalarVector& dense, GlobalLU_t& glu);
+  Index pivotL(const Index jcol, const RealScalar& diagpivotthresh, IndexVector& perm_r, IndexVector& iperm_c,
+               Index& pivrow, GlobalLU_t& glu);
+  template <typename Traits>
+  void dfs_kernel(const StorageIndex jj, IndexVector& perm_r, Index& nseg, IndexVector& panel_lsub, IndexVector& segrep,
+                  Ref<IndexVector> repfnz_col, IndexVector& xprune, Ref<IndexVector> marker, IndexVector& parent,
+                  IndexVector& xplore, GlobalLU_t& glu, Index& nextl_col, Index krow, Traits& traits);
+  void panel_dfs(const Index m, const Index w, const Index jcol, MatrixType& A, IndexVector& perm_r, Index& nseg,
+                 ScalarVector& dense, IndexVector& panel_lsub, IndexVector& segrep, IndexVector& repfnz,
+                 IndexVector& xprune, IndexVector& marker, IndexVector& parent, IndexVector& xplore, GlobalLU_t& glu);
+
+  void panel_bmod(const Index m, const Index w, const Index jcol, const Index nseg, ScalarVector& dense,
+                  ScalarVector& tempv, IndexVector& segrep, IndexVector& repfnz, GlobalLU_t& glu);
+  Index column_dfs(const Index m, const Index jcol, IndexVector& perm_r, Index maxsuper, Index& nseg,
+                   BlockIndexVector lsub_col, IndexVector& segrep, BlockIndexVector repfnz, IndexVector& xprune,
+                   IndexVector& marker, IndexVector& parent, IndexVector& xplore, GlobalLU_t& glu);
+  Index column_bmod(const Index jcol, const Index nseg, BlockScalarVector dense, ScalarVector& tempv,
+                    BlockIndexVector segrep, BlockIndexVector repfnz, Index fpanelc, GlobalLU_t& glu);
+  Index copy_to_ucol(const Index jcol, const Index nseg, IndexVector& segrep, BlockIndexVector repfnz,
+                     IndexVector& perm_r, BlockScalarVector dense, GlobalLU_t& glu);
+  void pruneL(const Index jcol, const IndexVector& perm_r, const Index pivrow, const Index nseg,
+              const IndexVector& segrep, BlockIndexVector repfnz, IndexVector& xprune, GlobalLU_t& glu);
+  void countnz(const Index n, Index& nnzL, Index& nnzU, GlobalLU_t& glu);
+  void fixupL(const Index n, const IndexVector& perm_r, GlobalLU_t& glu);
+
+  template <typename, typename>
+  friend struct column_dfs_traits;
+};
+
+}  // end namespace internal
+}  // namespace Eigen
 
 #endif
diff --git a/Eigen/src/SparseLU/SparseLU_Memory.h b/Eigen/src/SparseLU/SparseLU_Memory.h
index cc26256..22affd2 100644
--- a/Eigen/src/SparseLU/SparseLU_Memory.h
+++ b/Eigen/src/SparseLU/SparseLU_Memory.h
@@ -7,10 +7,10 @@
 // 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/.
 
-/* 
- 
- * NOTE: This file is the modified version of [s,d,c,z]memory.c files in SuperLU 
- 
+/*
+
+ * NOTE: This file is the modified version of [s,d,c,z]memory.c files in SuperLU
+
  * -- SuperLU routine (version 3.1) --
  * Univ. of California Berkeley, Xerox Palo Alto Research Center,
  * and Lawrence Berkeley National Lab.
@@ -36,194 +36,175 @@
 
 namespace Eigen {
 namespace internal {
-  
+
 enum { LUNoMarker = 3 };
-enum {emptyIdxLU = -1};
-inline Index LUnumTempV(Index& m, Index& w, Index& t, Index& b)
-{
-  return (std::max)(m, (t+b)*w);
+enum { emptyIdxLU = -1 };
+inline Index LUnumTempV(Index& m, Index& w, Index& t, Index& b) { return (std::max)(m, (t + b) * w); }
+
+template <typename Scalar>
+inline Index LUTempSpace(Index& m, Index& w) {
+  return (2 * w + 4 + LUNoMarker) * m * sizeof(Index) + (w + 1) * m * sizeof(Scalar);
 }
 
-template< typename Scalar>
-inline Index LUTempSpace(Index&m, Index& w)
-{
-  return (2*w + 4 + LUNoMarker) * m * sizeof(Index) + (w + 1) * m * sizeof(Scalar);
-}
-
-
-
-
-/** 
-  * Expand the existing storage to accommodate more fill-ins
-  * \param vec Valid pointer to the vector to allocate or expand
-  * \param[in,out] length  At input, contain the current length of the vector that is to be increased. At output, length of the newly allocated vector
-  * \param[in] nbElts Current number of elements in the factors
-  * \param keep_prev  1: use length  and do not expand the vector; 0: compute new_len and expand
-  * \param[in,out] num_expansions Number of times the memory has been expanded
-  */
+/**
+ * Expand the existing storage to accommodate more fill-ins
+ * \param vec Valid pointer to the vector to allocate or expand
+ * \param[in,out] length  At input, contain the current length of the vector that is to be increased. At output, length
+ * of the newly allocated vector \param[in] nbElts Current number of elements in the factors \param keep_prev  1: use
+ * length  and do not expand the vector; 0: compute new_len and expand \param[in,out] num_expansions Number of times the
+ * memory has been expanded
+ */
 template <typename Scalar, typename StorageIndex>
 template <typename VectorType>
-Index  SparseLUImpl<Scalar,StorageIndex>::expand(VectorType& vec, Index& length, Index nbElts, Index keep_prev, Index& num_expansions) 
-{
-  
-  float alpha = 1.5; // Ratio of the memory increase 
-  Index new_len; // New size of the allocated memory
-  
-  if(num_expansions == 0 || keep_prev) 
-    new_len = length ; // First time allocate requested
-  else 
-    new_len = (std::max)(length+1,Index(alpha * length));
-  
-  VectorType old_vec; // Temporary vector to hold the previous values   
-  if (nbElts > 0 )
-    old_vec = vec.segment(0,nbElts); 
-  
-  //Allocate or expand the current vector
+Index SparseLUImpl<Scalar, StorageIndex>::expand(VectorType& vec, Index& length, Index nbElts, Index keep_prev,
+                                                 Index& num_expansions) {
+  float alpha = 1.5;  // Ratio of the memory increase
+  Index new_len;      // New size of the allocated memory
+
+  if (num_expansions == 0 || keep_prev)
+    new_len = length;  // First time allocate requested
+  else
+    new_len = (std::max)(length + 1, Index(alpha * length));
+
+  VectorType old_vec;  // Temporary vector to hold the previous values
+  if (nbElts > 0) old_vec = vec.segment(0, nbElts);
+
+    // Allocate or expand the current vector
 #ifdef EIGEN_EXCEPTIONS
   try
 #endif
   {
-    vec.resize(new_len); 
+    vec.resize(new_len);
   }
 #ifdef EIGEN_EXCEPTIONS
-  catch(std::bad_alloc& )
+  catch (std::bad_alloc&)
 #else
-  if(!vec.size())
+  if (!vec.size())
 #endif
   {
-    if (!num_expansions)
-    {
+    if (!num_expansions) {
       // First time to allocate from LUMemInit()
       // Let LUMemInit() deals with it.
       return -1;
     }
-    if (keep_prev)
-    {
+    if (keep_prev) {
       // In this case, the memory length should not not be reduced
       return new_len;
-    }
-    else 
-    {
-      // Reduce the size and increase again 
-      Index tries = 0; // Number of attempts
-      do 
-      {
-        alpha = (alpha + 1)/2;
-        new_len = (std::max)(length+1,Index(alpha * length));
+    } else {
+      // Reduce the size and increase again
+      Index tries = 0;  // Number of attempts
+      do {
+        alpha = (alpha + 1) / 2;
+        new_len = (std::max)(length + 1, Index(alpha * length));
 #ifdef EIGEN_EXCEPTIONS
         try
 #endif
         {
-          vec.resize(new_len); 
+          vec.resize(new_len);
         }
 #ifdef EIGEN_EXCEPTIONS
-        catch(std::bad_alloc& )
+        catch (std::bad_alloc&)
 #else
         if (!vec.size())
 #endif
         {
-          tries += 1; 
-          if ( tries > 10) return new_len; 
+          tries += 1;
+          if (tries > 10) return new_len;
         }
       } while (!vec.size());
     }
   }
-  //Copy the previous values to the newly allocated space 
-  if (nbElts > 0)
-    vec.segment(0, nbElts) = old_vec;   
-   
-  
-  length  = new_len;
-  if(num_expansions) ++num_expansions;
-  return 0; 
+  // Copy the previous values to the newly allocated space
+  if (nbElts > 0) vec.segment(0, nbElts) = old_vec;
+
+  length = new_len;
+  if (num_expansions) ++num_expansions;
+  return 0;
 }
 
 /**
  * \brief  Allocate various working space for the numerical factorization phase.
- * \param m number of rows of the input matrix 
- * \param n number of columns 
- * \param annz number of initial nonzeros in the matrix 
+ * \param m number of rows of the input matrix
+ * \param n number of columns
+ * \param annz number of initial nonzeros in the matrix
  * \param lwork  if lwork=-1, this routine returns an estimated size of the required memory
  * \param glu persistent data to facilitate multiple factors : will be deleted later ??
  * \param fillratio estimated ratio of fill in the factors
  * \param panel_size Size of a panel
- * \return an estimated size of the required memory if lwork = -1; otherwise, return the size of actually allocated memory when allocation failed, and 0 on success
- * \note Unlike SuperLU, this routine does not support successive factorization with the same pattern and the same row permutation
+ * \return an estimated size of the required memory if lwork = -1; otherwise, return the size of actually allocated
+ * memory when allocation failed, and 0 on success \note Unlike SuperLU, this routine does not support successive
+ * factorization with the same pattern and the same row permutation
  */
 template <typename Scalar, typename StorageIndex>
-Index SparseLUImpl<Scalar,StorageIndex>::memInit(Index m, Index n, Index annz, Index lwork, Index fillratio, Index panel_size,  GlobalLU_t& glu)
-{
-  Index& num_expansions = glu.num_expansions; //No memory expansions so far
+Index SparseLUImpl<Scalar, StorageIndex>::memInit(Index m, Index n, Index annz, Index lwork, Index fillratio,
+                                                  Index panel_size, GlobalLU_t& glu) {
+  Index& num_expansions = glu.num_expansions;  // No memory expansions so far
   num_expansions = 0;
-  glu.nzumax = glu.nzlumax = (std::min)(fillratio * (annz+1) / n, m) * n; // estimated number of nonzeros in U 
-  glu.nzlmax = (std::max)(Index(4), fillratio) * (annz+1) / 4; // estimated  nnz in L factor
+  glu.nzumax = glu.nzlumax = (std::min)(fillratio * (annz + 1) / n, m) * n;  // estimated number of nonzeros in U
+  glu.nzlmax = (std::max)(Index(4), fillratio) * (annz + 1) / 4;             // estimated  nnz in L factor
   // Return the estimated size to the user if necessary
   Index tempSpace;
-  tempSpace = (2*panel_size + 4 + LUNoMarker) * m * sizeof(Index) + (panel_size + 1) * m * sizeof(Scalar);
-  if (lwork == emptyIdxLU) 
-  {
+  tempSpace = (2 * panel_size + 4 + LUNoMarker) * m * sizeof(Index) + (panel_size + 1) * m * sizeof(Scalar);
+  if (lwork == emptyIdxLU) {
     Index estimated_size;
-    estimated_size = (5 * n + 5) * sizeof(Index)  + tempSpace
-                    + (glu.nzlmax + glu.nzumax) * sizeof(Index) + (glu.nzlumax+glu.nzumax) *  sizeof(Scalar) + n; 
+    estimated_size = (5 * n + 5) * sizeof(Index) + tempSpace + (glu.nzlmax + glu.nzumax) * sizeof(Index) +
+                     (glu.nzlumax + glu.nzumax) * sizeof(Scalar) + n;
     return estimated_size;
   }
-  
-  // Setup the required space 
-  
+
+  // Setup the required space
+
   // First allocate Integer pointers for L\U factors
-  glu.xsup.resize(n+1);
-  glu.supno.resize(n+1);
-  glu.xlsub.resize(n+1);
-  glu.xlusup.resize(n+1);
-  glu.xusub.resize(n+1);
+  glu.xsup.resize(n + 1);
+  glu.supno.resize(n + 1);
+  glu.xlsub.resize(n + 1);
+  glu.xlusup.resize(n + 1);
+  glu.xusub.resize(n + 1);
 
   // Reserve memory for L/U factors
-  do 
-  {
-    if(     (expand<ScalarVector>(glu.lusup, glu.nzlumax, 0, 0, num_expansions)<0)
-        ||  (expand<ScalarVector>(glu.ucol,  glu.nzumax,  0, 0, num_expansions)<0)
-        ||  (expand<IndexVector> (glu.lsub,  glu.nzlmax,  0, 0, num_expansions)<0)
-        ||  (expand<IndexVector> (glu.usub,  glu.nzumax,  0, 1, num_expansions)<0) )
-    {
-      //Reduce the estimated size and retry
+  do {
+    if ((expand<ScalarVector>(glu.lusup, glu.nzlumax, 0, 0, num_expansions) < 0) ||
+        (expand<ScalarVector>(glu.ucol, glu.nzumax, 0, 0, num_expansions) < 0) ||
+        (expand<IndexVector>(glu.lsub, glu.nzlmax, 0, 0, num_expansions) < 0) ||
+        (expand<IndexVector>(glu.usub, glu.nzumax, 0, 1, num_expansions) < 0)) {
+      // Reduce the estimated size and retry
       glu.nzlumax /= 2;
       glu.nzumax /= 2;
       glu.nzlmax /= 2;
-      if (glu.nzlumax < annz ) return glu.nzlumax; 
+      if (glu.nzlumax < annz) return glu.nzlumax;
     }
   } while (!glu.lusup.size() || !glu.ucol.size() || !glu.lsub.size() || !glu.usub.size());
-  
+
   ++num_expansions;
   return 0;
-  
-} // end LuMemInit
 
-/** 
- * \brief Expand the existing storage 
- * \param vec vector to expand 
+}  // end LuMemInit
+
+/**
+ * \brief Expand the existing storage
+ * \param vec vector to expand
  * \param[in,out] maxlen On input, previous size of vec (Number of elements to copy ). on output, new size
  * \param nbElts current number of elements in the vector.
  * \param memtype Type of the element to expand
- * \param num_expansions Number of expansions 
+ * \param num_expansions Number of expansions
  * \return 0 on success, > 0 size of the memory allocated so far
  */
 template <typename Scalar, typename StorageIndex>
 template <typename VectorType>
-Index SparseLUImpl<Scalar,StorageIndex>::memXpand(VectorType& vec, Index& maxlen, Index nbElts, MemType memtype, Index& num_expansions)
-{
-  Index failed_size; 
+Index SparseLUImpl<Scalar, StorageIndex>::memXpand(VectorType& vec, Index& maxlen, Index nbElts, MemType memtype,
+                                                   Index& num_expansions) {
+  Index failed_size;
   if (memtype == USUB)
-     failed_size = this->expand<VectorType>(vec, maxlen, nbElts, 1, num_expansions);
+    failed_size = this->expand<VectorType>(vec, maxlen, nbElts, 1, num_expansions);
   else
     failed_size = this->expand<VectorType>(vec, maxlen, nbElts, 0, num_expansions);
 
-  if (failed_size)
-    return failed_size; 
-  
-  return 0 ;  
+  if (failed_size) return failed_size;
+
+  return 0;
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
-#endif // EIGEN_SPARSELU_MEMORY
+}  // end namespace Eigen
+#endif  // EIGEN_SPARSELU_MEMORY
diff --git a/Eigen/src/SparseLU/SparseLU_Structs.h b/Eigen/src/SparseLU/SparseLU_Structs.h
index f1f109a..2afab01 100644
--- a/Eigen/src/SparseLU/SparseLU_Structs.h
+++ b/Eigen/src/SparseLU/SparseLU_Structs.h
@@ -7,26 +7,26 @@
 // 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/.
 
-/* 
+/*
  * NOTE: This file comes from a partly modified version of files slu_[s,d,c,z]defs.h
  * -- SuperLU routine (version 4.1) --
  * Univ. of California Berkeley, Xerox Palo Alto Research Center,
  * and Lawrence Berkeley National Lab.
  * November, 2010
- * 
+ *
  * Global data structures used in LU factorization -
- * 
+ *
  *   nsuper: #supernodes = nsuper + 1, numbered [0, nsuper].
  *   (xsup,supno): supno[i] is the supernode no to which i belongs;
  *  xsup(s) points to the beginning of the s-th supernode.
  *  e.g.   supno 0 1 2 2 3 3 3 4 4 4 4 4   (n=12)
  *          xsup 0 1 2 4 7 12
- *  Note: dfs will be performed on supernode rep. relative to the new 
+ *  Note: dfs will be performed on supernode rep. relative to the new
  *        row pivoting ordering
  *
  *   (xlsub,lsub): lsub[*] contains the compressed subscript of
  *  rectangular supernodes; xlsub[j] points to the starting
- *  location of the j-th column in lsub[*]. Note that xlsub 
+ *  location of the j-th column in lsub[*]. Note that xlsub
  *  is indexed by column.
  *  Storage: original row subscripts
  *
@@ -74,40 +74,40 @@
 namespace Eigen {
 namespace internal {
 
-enum MemType {LUSUP, UCOL, LSUB, USUB, LLVL, ULVL};
+enum MemType { LUSUP, UCOL, LSUB, USUB, LLVL, ULVL };
 
 template <typename IndexVector, typename ScalarVector>
 struct LU_GlobalLU_t {
-  typedef typename IndexVector::Scalar StorageIndex; 
-  IndexVector xsup; //First supernode column ... xsup(s) points to the beginning of the s-th supernode
-  IndexVector supno; // Supernode number corresponding to this column (column to supernode mapping)
-  ScalarVector  lusup; // nonzero values of L ordered by columns 
-  IndexVector lsub; // Compressed row indices of L rectangular supernodes. 
-  IndexVector xlusup; // pointers to the beginning of each column in lusup
-  IndexVector xlsub; // pointers to the beginning of each column in lsub
-  Index   nzlmax; // Current max size of lsub
-  Index   nzlumax; // Current max size of lusup
-  ScalarVector  ucol; // nonzero values of U ordered by columns 
-  IndexVector usub; // row indices of U columns in ucol
-  IndexVector xusub; // Pointers to the beginning of each column of U in ucol 
-  Index   nzumax; // Current max size of ucol
-  Index   n; // Number of columns in the matrix  
-  Index   num_expansions; 
+  typedef typename IndexVector::Scalar StorageIndex;
+  IndexVector xsup;    // First supernode column ... xsup(s) points to the beginning of the s-th supernode
+  IndexVector supno;   // Supernode number corresponding to this column (column to supernode mapping)
+  ScalarVector lusup;  // nonzero values of L ordered by columns
+  IndexVector lsub;    // Compressed row indices of L rectangular supernodes.
+  IndexVector xlusup;  // pointers to the beginning of each column in lusup
+  IndexVector xlsub;   // pointers to the beginning of each column in lsub
+  Index nzlmax;        // Current max size of lsub
+  Index nzlumax;       // Current max size of lusup
+  ScalarVector ucol;   // nonzero values of U ordered by columns
+  IndexVector usub;    // row indices of U columns in ucol
+  IndexVector xusub;   // Pointers to the beginning of each column of U in ucol
+  Index nzumax;        // Current max size of ucol
+  Index n;             // Number of columns in the matrix
+  Index num_expansions;
 };
 
 // Values to set for performance
 struct perfvalues {
-  Index panel_size; // a panel consists of at most <panel_size> consecutive columns
-  Index relax; // To control degree of relaxing supernodes. If the number of nodes (columns) 
-                // in a subtree of the elimination tree is less than relax, this subtree is considered 
-                // as one supernode regardless of the row structures of those columns
-  Index maxsuper; // The maximum size for a supernode in complete LU
-  Index rowblk; // The minimum row dimension for 2-D blocking to be used;
-  Index colblk; // The minimum column dimension for 2-D blocking to be used;
-  Index fillfactor; // The estimated fills factors for L and U, compared with A
-}; 
+  Index panel_size;  // a panel consists of at most <panel_size> consecutive columns
+  Index relax;       // To control degree of relaxing supernodes. If the number of nodes (columns)
+                     // in a subtree of the elimination tree is less than relax, this subtree is considered
+                     // as one supernode regardless of the row structures of those columns
+  Index maxsuper;    // The maximum size for a supernode in complete LU
+  Index rowblk;      // The minimum row dimension for 2-D blocking to be used;
+  Index colblk;      // The minimum column dimension for 2-D blocking to be used;
+  Index fillfactor;  // The estimated fills factors for L and U, compared with A
+};
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
-#endif // EIGEN_LU_STRUCTS
+}  // end namespace Eigen
+#endif  // EIGEN_LU_STRUCTS
diff --git a/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h b/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h
index 627e55d..eb15909 100644
--- a/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h
+++ b/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h
@@ -19,359 +19,301 @@
 
 /** \ingroup SparseLU_Module
  * \brief a class to manipulate the L supernodal factor from the SparseLU factorization
- * 
- * This class  contain the data to easily store 
- * and manipulate the supernodes during the factorization and solution phase of Sparse LU. 
+ *
+ * This class  contain the data to easily store
+ * and manipulate the supernodes during the factorization and solution phase of Sparse LU.
  * Only the lower triangular matrix has supernodes.
- * 
+ *
  * NOTE : This class corresponds to the SCformat structure in SuperLU
- * 
+ *
  */
 /* TODO
- * InnerIterator as for sparsematrix 
- * SuperInnerIterator to iterate through all supernodes 
+ * InnerIterator as for sparsematrix
+ * SuperInnerIterator to iterate through all supernodes
  * Function for triangular solve
  */
 template <typename Scalar_, typename StorageIndex_>
-class MappedSuperNodalMatrix
-{
-  public:
-    typedef Scalar_ Scalar;
-    typedef StorageIndex_ StorageIndex;
-    typedef Matrix<StorageIndex,Dynamic,1> IndexVector;
-    typedef Matrix<Scalar,Dynamic,1> ScalarVector;
-  public:
-    MappedSuperNodalMatrix()
-    {
-      
-    }
-    MappedSuperNodalMatrix(Index m, Index n,  ScalarVector& nzval, IndexVector& nzval_colptr, IndexVector& rowind,
-             IndexVector& rowind_colptr, IndexVector& col_to_sup, IndexVector& sup_to_col )
-    {
-      setInfos(m, n, nzval, nzval_colptr, rowind, rowind_colptr, col_to_sup, sup_to_col);
-    }
-    
-    ~MappedSuperNodalMatrix()
-    {
-      
-    }
-    /**
-     * Set appropriate pointers for the lower triangular supernodal matrix
-     * These infos are available at the end of the numerical factorization
-     * FIXME This class will be modified such that it can be use in the course 
-     * of the factorization.
-     */
-    void setInfos(Index m, Index n, ScalarVector& nzval, IndexVector& nzval_colptr, IndexVector& rowind,
-             IndexVector& rowind_colptr, IndexVector& col_to_sup, IndexVector& sup_to_col )
-    {
-      m_row = m;
-      m_col = n; 
-      m_nzval = nzval.data(); 
-      m_nzval_colptr = nzval_colptr.data(); 
-      m_rowind = rowind.data(); 
-      m_rowind_colptr = rowind_colptr.data(); 
-      m_nsuper = col_to_sup(n); 
-      m_col_to_sup = col_to_sup.data(); 
-      m_sup_to_col = sup_to_col.data(); 
-    }
-    
-    /**
-     * Number of rows
-     */
-    Index rows() const { return m_row; }
-    
-    /**
-     * Number of columns
-     */
-    Index cols() const { return m_col; }
-    
-    /**
-     * Return the array of nonzero values packed by column
-     * 
-     * The size is nnz
-     */
-    Scalar* valuePtr() {  return m_nzval; }
-    
-    const Scalar* valuePtr() const 
-    {
-      return m_nzval; 
-    }
-    /**
-     * Return the pointers to the beginning of each column in \ref valuePtr()
-     */
-    StorageIndex* colIndexPtr()
-    {
-      return m_nzval_colptr; 
-    }
-    
-    const StorageIndex* colIndexPtr() const
-    {
-      return m_nzval_colptr; 
-    }
-    
-    /**
-     * Return the array of compressed row indices of all supernodes
-     */
-    StorageIndex* rowIndex()  { return m_rowind; }
-    
-    const StorageIndex* rowIndex() const
-    {
-      return m_rowind; 
-    }
-    
-    /**
-     * Return the location in \em rowvaluePtr() which starts each column
-     */
-    StorageIndex* rowIndexPtr() { return m_rowind_colptr; }
-    
-    const StorageIndex* rowIndexPtr() const
-    {
-      return m_rowind_colptr; 
-    }
-    
-    /** 
-     * Return the array of column-to-supernode mapping 
-     */
-    StorageIndex* colToSup()  { return m_col_to_sup; }
-    
-    const StorageIndex* colToSup() const
-    {
-      return m_col_to_sup;       
-    }
-    /**
-     * Return the array of supernode-to-column mapping
-     */
-    StorageIndex* supToCol() { return m_sup_to_col; }
-    
-    const StorageIndex* supToCol() const
-    {
-      return m_sup_to_col;
-    }
-    
-    /**
-     * Return the number of supernodes
-     */
-    Index nsuper() const
-    {
-      return m_nsuper; 
-    }
-    
-    class InnerIterator; 
-    template<typename Dest>
-    void solveInPlace( MatrixBase<Dest>&X) const;
-    template<bool Conjugate, typename Dest>
-    void solveTransposedInPlace( MatrixBase<Dest>&X) const;
+class MappedSuperNodalMatrix {
+ public:
+  typedef Scalar_ Scalar;
+  typedef StorageIndex_ StorageIndex;
+  typedef Matrix<StorageIndex, Dynamic, 1> IndexVector;
+  typedef Matrix<Scalar, Dynamic, 1> ScalarVector;
 
-    
-      
-      
-    
-  protected:
-    Index m_row; // Number of rows
-    Index m_col; // Number of columns
-    Index m_nsuper; // Number of supernodes
-    Scalar* m_nzval; //array of nonzero values packed by column
-    StorageIndex* m_nzval_colptr; //nzval_colptr[j] Stores the location in nzval[] which starts column j
-    StorageIndex* m_rowind; // Array of compressed row indices of rectangular supernodes
-    StorageIndex* m_rowind_colptr; //rowind_colptr[j] stores the location in rowind[] which starts column j
-    StorageIndex* m_col_to_sup; // col_to_sup[j] is the supernode number to which column j belongs
-    StorageIndex* m_sup_to_col; //sup_to_col[s] points to the starting column of the s-th supernode
-    
-  private :
+ public:
+  MappedSuperNodalMatrix() {}
+  MappedSuperNodalMatrix(Index m, Index n, ScalarVector& nzval, IndexVector& nzval_colptr, IndexVector& rowind,
+                         IndexVector& rowind_colptr, IndexVector& col_to_sup, IndexVector& sup_to_col) {
+    setInfos(m, n, nzval, nzval_colptr, rowind, rowind_colptr, col_to_sup, sup_to_col);
+  }
+
+  ~MappedSuperNodalMatrix() {}
+  /**
+   * Set appropriate pointers for the lower triangular supernodal matrix
+   * These infos are available at the end of the numerical factorization
+   * FIXME This class will be modified such that it can be use in the course
+   * of the factorization.
+   */
+  void setInfos(Index m, Index n, ScalarVector& nzval, IndexVector& nzval_colptr, IndexVector& rowind,
+                IndexVector& rowind_colptr, IndexVector& col_to_sup, IndexVector& sup_to_col) {
+    m_row = m;
+    m_col = n;
+    m_nzval = nzval.data();
+    m_nzval_colptr = nzval_colptr.data();
+    m_rowind = rowind.data();
+    m_rowind_colptr = rowind_colptr.data();
+    m_nsuper = col_to_sup(n);
+    m_col_to_sup = col_to_sup.data();
+    m_sup_to_col = sup_to_col.data();
+  }
+
+  /**
+   * Number of rows
+   */
+  Index rows() const { return m_row; }
+
+  /**
+   * Number of columns
+   */
+  Index cols() const { return m_col; }
+
+  /**
+   * Return the array of nonzero values packed by column
+   *
+   * The size is nnz
+   */
+  Scalar* valuePtr() { return m_nzval; }
+
+  const Scalar* valuePtr() const { return m_nzval; }
+  /**
+   * Return the pointers to the beginning of each column in \ref valuePtr()
+   */
+  StorageIndex* colIndexPtr() { return m_nzval_colptr; }
+
+  const StorageIndex* colIndexPtr() const { return m_nzval_colptr; }
+
+  /**
+   * Return the array of compressed row indices of all supernodes
+   */
+  StorageIndex* rowIndex() { return m_rowind; }
+
+  const StorageIndex* rowIndex() const { return m_rowind; }
+
+  /**
+   * Return the location in \em rowvaluePtr() which starts each column
+   */
+  StorageIndex* rowIndexPtr() { return m_rowind_colptr; }
+
+  const StorageIndex* rowIndexPtr() const { return m_rowind_colptr; }
+
+  /**
+   * Return the array of column-to-supernode mapping
+   */
+  StorageIndex* colToSup() { return m_col_to_sup; }
+
+  const StorageIndex* colToSup() const { return m_col_to_sup; }
+  /**
+   * Return the array of supernode-to-column mapping
+   */
+  StorageIndex* supToCol() { return m_sup_to_col; }
+
+  const StorageIndex* supToCol() const { return m_sup_to_col; }
+
+  /**
+   * Return the number of supernodes
+   */
+  Index nsuper() const { return m_nsuper; }
+
+  class InnerIterator;
+  template <typename Dest>
+  void solveInPlace(MatrixBase<Dest>& X) const;
+  template <bool Conjugate, typename Dest>
+  void solveTransposedInPlace(MatrixBase<Dest>& X) const;
+
+ protected:
+  Index m_row;                    // Number of rows
+  Index m_col;                    // Number of columns
+  Index m_nsuper;                 // Number of supernodes
+  Scalar* m_nzval;                // array of nonzero values packed by column
+  StorageIndex* m_nzval_colptr;   // nzval_colptr[j] Stores the location in nzval[] which starts column j
+  StorageIndex* m_rowind;         // Array of compressed row indices of rectangular supernodes
+  StorageIndex* m_rowind_colptr;  // rowind_colptr[j] stores the location in rowind[] which starts column j
+  StorageIndex* m_col_to_sup;     // col_to_sup[j] is the supernode number to which column j belongs
+  StorageIndex* m_sup_to_col;     // sup_to_col[s] points to the starting column of the s-th supernode
+
+ private:
 };
 
 /**
-  * \brief InnerIterator class to iterate over nonzero values of the current column in the supernodal matrix L
-  * 
-  */
-template<typename Scalar, typename StorageIndex>
-class MappedSuperNodalMatrix<Scalar,StorageIndex>::InnerIterator
-{
-  public:
-     InnerIterator(const MappedSuperNodalMatrix& mat, Index outer)
+ * \brief InnerIterator class to iterate over nonzero values of the current column in the supernodal matrix L
+ *
+ */
+template <typename Scalar, typename StorageIndex>
+class MappedSuperNodalMatrix<Scalar, StorageIndex>::InnerIterator {
+ public:
+  InnerIterator(const MappedSuperNodalMatrix& mat, Index outer)
       : m_matrix(mat),
         m_outer(outer),
         m_supno(mat.colToSup()[outer]),
         m_idval(mat.colIndexPtr()[outer]),
         m_startidval(m_idval),
-        m_endidval(mat.colIndexPtr()[outer+1]),
+        m_endidval(mat.colIndexPtr()[outer + 1]),
         m_idrow(mat.rowIndexPtr()[mat.supToCol()[mat.colToSup()[outer]]]),
-        m_endidrow(mat.rowIndexPtr()[mat.supToCol()[mat.colToSup()[outer]]+1])
-    {}
-    inline InnerIterator& operator++()
-    { 
-      m_idval++; 
-      m_idrow++;
-      return *this;
-    }
-    inline Scalar value() const { return m_matrix.valuePtr()[m_idval]; }
-    
-    inline Scalar& valueRef() { return const_cast<Scalar&>(m_matrix.valuePtr()[m_idval]); }
-    
-    inline Index index() const { return m_matrix.rowIndex()[m_idrow]; }
-    inline Index row() const { return index(); }
-    inline Index col() const { return m_outer; }
-    
-    inline Index supIndex() const { return m_supno; }
-    
-    inline operator bool() const 
-    { 
-      return ( (m_idval < m_endidval) && (m_idval >= m_startidval)
-                && (m_idrow < m_endidrow) );
-    }
-    
-  protected:
-    const MappedSuperNodalMatrix& m_matrix; // Supernodal lower triangular matrix 
-    const Index m_outer;                    // Current column 
-    const Index m_supno;                    // Current SuperNode number
-    Index m_idval;                          // Index to browse the values in the current column
-    const Index m_startidval;               // Start of the column value
-    const Index m_endidval;                 // End of the column value
-    Index m_idrow;                          // Index to browse the row indices 
-    Index m_endidrow;                       // End index of row indices of the current column
+        m_endidrow(mat.rowIndexPtr()[mat.supToCol()[mat.colToSup()[outer]] + 1]) {}
+  inline InnerIterator& operator++() {
+    m_idval++;
+    m_idrow++;
+    return *this;
+  }
+  inline Scalar value() const { return m_matrix.valuePtr()[m_idval]; }
+
+  inline Scalar& valueRef() { return const_cast<Scalar&>(m_matrix.valuePtr()[m_idval]); }
+
+  inline Index index() const { return m_matrix.rowIndex()[m_idrow]; }
+  inline Index row() const { return index(); }
+  inline Index col() const { return m_outer; }
+
+  inline Index supIndex() const { return m_supno; }
+
+  inline operator bool() const {
+    return ((m_idval < m_endidval) && (m_idval >= m_startidval) && (m_idrow < m_endidrow));
+  }
+
+ protected:
+  const MappedSuperNodalMatrix& m_matrix;  // Supernodal lower triangular matrix
+  const Index m_outer;                     // Current column
+  const Index m_supno;                     // Current SuperNode number
+  Index m_idval;                           // Index to browse the values in the current column
+  const Index m_startidval;                // Start of the column value
+  const Index m_endidval;                  // End of the column value
+  Index m_idrow;                           // Index to browse the row indices
+  Index m_endidrow;                        // End index of row indices of the current column
 };
 
 /**
  * \brief Solve with the supernode triangular matrix
- * 
+ *
  */
-template<typename Scalar, typename Index_>
-template<typename Dest>
-void MappedSuperNodalMatrix<Scalar,Index_>::solveInPlace( MatrixBase<Dest>&X) const
-{
-    /* Explicit type conversion as the Index type of MatrixBase<Dest> may be wider than Index */
-//    eigen_assert(X.rows() <= NumTraits<Index>::highest());
-//    eigen_assert(X.cols() <= NumTraits<Index>::highest());
-    Index n    = int(X.rows());
-    Index nrhs = Index(X.cols());
-    const Scalar * Lval = valuePtr();                 // Nonzero values 
-    Matrix<Scalar,Dynamic,Dest::ColsAtCompileTime, ColMajor> work(n, nrhs);     // working vector
-    work.setZero();
-    for (Index k = 0; k <= nsuper(); k ++)
-    {
-      Index fsupc = supToCol()[k];                    // First column of the current supernode 
-      Index istart = rowIndexPtr()[fsupc];            // Pointer index to the subscript of the current column
-      Index nsupr = rowIndexPtr()[fsupc+1] - istart;  // Number of rows in the current supernode
-      Index nsupc = supToCol()[k+1] - fsupc;          // Number of columns in the current supernode
-      Index nrow = nsupr - nsupc;                     // Number of rows in the non-diagonal part of the supernode
-      Index irow;                                     //Current index row
-      
-      if (nsupc == 1 )
-      {
-        for (Index j = 0; j < nrhs; j++)
-        {
-          InnerIterator it(*this, fsupc);
-          ++it; // Skip the diagonal element
-          for (; it; ++it)
-          {
-            irow = it.row();
-            X(irow, j) -= X(fsupc, j) * it.value();
-          }
-        }
-      }
-      else
-      {
-        // The supernode has more than one column 
-        Index luptr = colIndexPtr()[fsupc]; 
-        Index lda = colIndexPtr()[fsupc+1] - luptr;
-        
-        // Triangular solve 
-        Map<const Matrix<Scalar,Dynamic,Dynamic, ColMajor>, 0, OuterStride<> > A( &(Lval[luptr]), nsupc, nsupc, OuterStride<>(lda) );
-        typename Dest::RowsBlockXpr U = X.derived().middleRows(fsupc, nsupc);
-        U = A.template triangularView<UnitLower>().solve(U);        
-        // Matrix-vector product 
-        new (&A) Map<const Matrix<Scalar,Dynamic,Dynamic, ColMajor>, 0, OuterStride<> > ( &(Lval[luptr+nsupc]), nrow, nsupc, OuterStride<>(lda) );
-        work.topRows(nrow).noalias() = A * U;
-        
-        //Begin Scatter 
-        for (Index j = 0; j < nrhs; j++)
-        {
-          Index iptr = istart + nsupc; 
-          for (Index i = 0; i < nrow; i++)
-          {
-            irow = rowIndex()[iptr]; 
-            X(irow, j) -= work(i, j); // Scatter operation
-            work(i, j) = Scalar(0); 
-            iptr++;
-          }
-        }
-      }
-    } 
-}
-
-template<typename Scalar, typename Index_>
-template<bool Conjugate, typename Dest>
-void MappedSuperNodalMatrix<Scalar,Index_>::solveTransposedInPlace( MatrixBase<Dest>&X) const
-{
-    using numext::conj;
-  Index n    = int(X.rows());
+template <typename Scalar, typename Index_>
+template <typename Dest>
+void MappedSuperNodalMatrix<Scalar, Index_>::solveInPlace(MatrixBase<Dest>& X) const {
+  /* Explicit type conversion as the Index type of MatrixBase<Dest> may be wider than Index */
+  //    eigen_assert(X.rows() <= NumTraits<Index>::highest());
+  //    eigen_assert(X.cols() <= NumTraits<Index>::highest());
+  Index n = int(X.rows());
   Index nrhs = Index(X.cols());
-  const Scalar * Lval = valuePtr();                 // Nonzero values
-  Matrix<Scalar,Dynamic,Dest::ColsAtCompileTime, ColMajor> work(n, nrhs);     // working vector
+  const Scalar* Lval = valuePtr();                                           // Nonzero values
+  Matrix<Scalar, Dynamic, Dest::ColsAtCompileTime, ColMajor> work(n, nrhs);  // working vector
   work.setZero();
-  for (Index k = nsuper(); k >= 0; k--)
-  {
-    Index fsupc = supToCol()[k];                    // First column of the current supernode
-    Index istart = rowIndexPtr()[fsupc];            // Pointer index to the subscript of the current column
-    Index nsupr = rowIndexPtr()[fsupc+1] - istart;  // Number of rows in the current supernode
-    Index nsupc = supToCol()[k+1] - fsupc;          // Number of columns in the current supernode
-    Index nrow = nsupr - nsupc;                     // Number of rows in the non-diagonal part of the supernode
-    Index irow;                                     //Current index row
+  for (Index k = 0; k <= nsuper(); k++) {
+    Index fsupc = supToCol()[k];                      // First column of the current supernode
+    Index istart = rowIndexPtr()[fsupc];              // Pointer index to the subscript of the current column
+    Index nsupr = rowIndexPtr()[fsupc + 1] - istart;  // Number of rows in the current supernode
+    Index nsupc = supToCol()[k + 1] - fsupc;          // Number of columns in the current supernode
+    Index nrow = nsupr - nsupc;                       // Number of rows in the non-diagonal part of the supernode
+    Index irow;                                       // Current index row
 
-    if (nsupc == 1 )
-    {
-      for (Index j = 0; j < nrhs; j++)
-      {
+    if (nsupc == 1) {
+      for (Index j = 0; j < nrhs; j++) {
         InnerIterator it(*this, fsupc);
-        ++it; // Skip the diagonal element
-        for (; it; ++it)
-        {
+        ++it;  // Skip the diagonal element
+        for (; it; ++it) {
           irow = it.row();
-          X(fsupc,j) -= X(irow, j) * (Conjugate?conj(it.value()):it.value());
+          X(irow, j) -= X(fsupc, j) * it.value();
+        }
+      }
+    } else {
+      // The supernode has more than one column
+      Index luptr = colIndexPtr()[fsupc];
+      Index lda = colIndexPtr()[fsupc + 1] - luptr;
+
+      // Triangular solve
+      Map<const Matrix<Scalar, Dynamic, Dynamic, ColMajor>, 0, OuterStride<> > A(&(Lval[luptr]), nsupc, nsupc,
+                                                                                 OuterStride<>(lda));
+      typename Dest::RowsBlockXpr U = X.derived().middleRows(fsupc, nsupc);
+      U = A.template triangularView<UnitLower>().solve(U);
+      // Matrix-vector product
+      new (&A) Map<const Matrix<Scalar, Dynamic, Dynamic, ColMajor>, 0, OuterStride<> >(&(Lval[luptr + nsupc]), nrow,
+                                                                                        nsupc, OuterStride<>(lda));
+      work.topRows(nrow).noalias() = A * U;
+
+      // Begin Scatter
+      for (Index j = 0; j < nrhs; j++) {
+        Index iptr = istart + nsupc;
+        for (Index i = 0; i < nrow; i++) {
+          irow = rowIndex()[iptr];
+          X(irow, j) -= work(i, j);  // Scatter operation
+          work(i, j) = Scalar(0);
+          iptr++;
         }
       }
     }
-    else
-    {
+  }
+}
+
+template <typename Scalar, typename Index_>
+template <bool Conjugate, typename Dest>
+void MappedSuperNodalMatrix<Scalar, Index_>::solveTransposedInPlace(MatrixBase<Dest>& X) const {
+  using numext::conj;
+  Index n = int(X.rows());
+  Index nrhs = Index(X.cols());
+  const Scalar* Lval = valuePtr();                                           // Nonzero values
+  Matrix<Scalar, Dynamic, Dest::ColsAtCompileTime, ColMajor> work(n, nrhs);  // working vector
+  work.setZero();
+  for (Index k = nsuper(); k >= 0; k--) {
+    Index fsupc = supToCol()[k];                      // First column of the current supernode
+    Index istart = rowIndexPtr()[fsupc];              // Pointer index to the subscript of the current column
+    Index nsupr = rowIndexPtr()[fsupc + 1] - istart;  // Number of rows in the current supernode
+    Index nsupc = supToCol()[k + 1] - fsupc;          // Number of columns in the current supernode
+    Index nrow = nsupr - nsupc;                       // Number of rows in the non-diagonal part of the supernode
+    Index irow;                                       // Current index row
+
+    if (nsupc == 1) {
+      for (Index j = 0; j < nrhs; j++) {
+        InnerIterator it(*this, fsupc);
+        ++it;  // Skip the diagonal element
+        for (; it; ++it) {
+          irow = it.row();
+          X(fsupc, j) -= X(irow, j) * (Conjugate ? conj(it.value()) : it.value());
+        }
+      }
+    } else {
       // The supernode has more than one column
       Index luptr = colIndexPtr()[fsupc];
-      Index lda = colIndexPtr()[fsupc+1] - luptr;
+      Index lda = colIndexPtr()[fsupc + 1] - luptr;
 
-      //Begin Gather
-      for (Index j = 0; j < nrhs; j++)
-      {
+      // Begin Gather
+      for (Index j = 0; j < nrhs; j++) {
         Index iptr = istart + nsupc;
-        for (Index i = 0; i < nrow; i++)
-        {
+        for (Index i = 0; i < nrow; i++) {
           irow = rowIndex()[iptr];
-          work.topRows(nrow)(i,j)= X(irow,j); // Gather operation
+          work.topRows(nrow)(i, j) = X(irow, j);  // Gather operation
           iptr++;
         }
       }
 
       // Matrix-vector product with transposed submatrix
-      Map<const Matrix<Scalar,Dynamic,Dynamic, ColMajor>, 0, OuterStride<> > A( &(Lval[luptr+nsupc]), nrow, nsupc, OuterStride<>(lda) );
+      Map<const Matrix<Scalar, Dynamic, Dynamic, ColMajor>, 0, OuterStride<> > A(&(Lval[luptr + nsupc]), nrow, nsupc,
+                                                                                 OuterStride<>(lda));
       typename Dest::RowsBlockXpr U = X.derived().middleRows(fsupc, nsupc);
-      if(Conjugate)
+      if (Conjugate)
         U = U - A.adjoint() * work.topRows(nrow);
       else
         U = U - A.transpose() * work.topRows(nrow);
 
       // Triangular solve (of transposed diagonal block)
-      new (&A) Map<const Matrix<Scalar,Dynamic,Dynamic, ColMajor>, 0, OuterStride<> > ( &(Lval[luptr]), nsupc, nsupc, OuterStride<>(lda) );
-      if(Conjugate)
+      new (&A) Map<const Matrix<Scalar, Dynamic, Dynamic, ColMajor>, 0, OuterStride<> >(&(Lval[luptr]), nsupc, nsupc,
+                                                                                        OuterStride<>(lda));
+      if (Conjugate)
         U = A.adjoint().template triangularView<UnitUpper>().solve(U);
       else
         U = A.transpose().template triangularView<UnitUpper>().solve(U);
-
     }
-
   }
 }
 
+}  // end namespace internal
 
-} // end namespace internal
+}  // end namespace Eigen
 
-} // end namespace Eigen
-
-#endif // EIGEN_SPARSELU_MATRIX_H
+#endif  // EIGEN_SPARSELU_MATRIX_H
diff --git a/Eigen/src/SparseLU/SparseLU_Utils.h b/Eigen/src/SparseLU/SparseLU_Utils.h
index 79544e6..ef087cd 100644
--- a/Eigen/src/SparseLU/SparseLU_Utils.h
+++ b/Eigen/src/SparseLU/SparseLU_Utils.h
@@ -7,7 +7,6 @@
 // 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_SPARSELU_UTILS_H
 #define EIGEN_SPARSELU_UTILS_H
 
@@ -21,63 +20,56 @@
  * \brief Count Nonzero elements in the factors
  */
 template <typename Scalar, typename StorageIndex>
-void SparseLUImpl<Scalar,StorageIndex>::countnz(const Index n, Index& nnzL, Index& nnzU, GlobalLU_t& glu)
-{
- nnzL = 0; 
- nnzU = (glu.xusub)(n); 
- Index nsuper = (glu.supno)(n); 
- Index jlen; 
- Index i, j, fsupc;
- if (n <= 0 ) return; 
- // For each supernode
- for (i = 0; i <= nsuper; i++)
- {
-   fsupc = glu.xsup(i); 
-   jlen = glu.xlsub(fsupc+1) - glu.xlsub(fsupc); 
-   
-   for (j = fsupc; j < glu.xsup(i+1); j++)
-   {
-     nnzL += jlen; 
-     nnzU += j - fsupc + 1; 
-     jlen--; 
-   }
- }
+void SparseLUImpl<Scalar, StorageIndex>::countnz(const Index n, Index& nnzL, Index& nnzU, GlobalLU_t& glu) {
+  nnzL = 0;
+  nnzU = (glu.xusub)(n);
+  Index nsuper = (glu.supno)(n);
+  Index jlen;
+  Index i, j, fsupc;
+  if (n <= 0) return;
+  // For each supernode
+  for (i = 0; i <= nsuper; i++) {
+    fsupc = glu.xsup(i);
+    jlen = glu.xlsub(fsupc + 1) - glu.xlsub(fsupc);
+
+    for (j = fsupc; j < glu.xsup(i + 1); j++) {
+      nnzL += jlen;
+      nnzU += j - fsupc + 1;
+      jlen--;
+    }
+  }
 }
 
 /**
- * \brief Fix up the data storage lsub for L-subscripts. 
- * 
- * It removes the subscripts sets for structural pruning, 
+ * \brief Fix up the data storage lsub for L-subscripts.
+ *
+ * It removes the subscripts sets for structural pruning,
  * and applies permutation to the remaining subscripts
- * 
+ *
  */
 template <typename Scalar, typename StorageIndex>
-void SparseLUImpl<Scalar,StorageIndex>::fixupL(const Index n, const IndexVector& perm_r, GlobalLU_t& glu)
-{
-  Index fsupc, i, j, k, jstart; 
-  
-  StorageIndex nextl = 0; 
-  Index nsuper = (glu.supno)(n); 
-  
-  // For each supernode 
-  for (i = 0; i <= nsuper; i++)
-  {
-    fsupc = glu.xsup(i); 
-    jstart = glu.xlsub(fsupc); 
-    glu.xlsub(fsupc) = nextl; 
-    for (j = jstart; j < glu.xlsub(fsupc + 1); j++)
-    {
-      glu.lsub(nextl) = perm_r(glu.lsub(j)); // Now indexed into P*A
+void SparseLUImpl<Scalar, StorageIndex>::fixupL(const Index n, const IndexVector& perm_r, GlobalLU_t& glu) {
+  Index fsupc, i, j, k, jstart;
+
+  StorageIndex nextl = 0;
+  Index nsuper = (glu.supno)(n);
+
+  // For each supernode
+  for (i = 0; i <= nsuper; i++) {
+    fsupc = glu.xsup(i);
+    jstart = glu.xlsub(fsupc);
+    glu.xlsub(fsupc) = nextl;
+    for (j = jstart; j < glu.xlsub(fsupc + 1); j++) {
+      glu.lsub(nextl) = perm_r(glu.lsub(j));  // Now indexed into P*A
       nextl++;
     }
-    for (k = fsupc+1; k < glu.xsup(i+1); k++)
-      glu.xlsub(k) = nextl; // other columns in supernode i
+    for (k = fsupc + 1; k < glu.xsup(i + 1); k++) glu.xlsub(k) = nextl;  // other columns in supernode i
   }
-  
-  glu.xlsub(n) = nextl; 
+
+  glu.xlsub(n) = nextl;
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
-#endif // EIGEN_SPARSELU_UTILS_H
+}  // end namespace Eigen
+#endif  // EIGEN_SPARSELU_UTILS_H
diff --git a/Eigen/src/SparseLU/SparseLU_column_bmod.h b/Eigen/src/SparseLU/SparseLU_column_bmod.h
index 0416607..8435b56 100644
--- a/Eigen/src/SparseLU/SparseLU_column_bmod.h
+++ b/Eigen/src/SparseLU/SparseLU_column_bmod.h
@@ -8,10 +8,10 @@
 // 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/.
 
-/* 
- 
- * NOTE: This file is the modified version of xcolumn_bmod.c file in SuperLU 
- 
+/*
+
+ * NOTE: This file is the modified version of xcolumn_bmod.c file in SuperLU
+
  * -- SuperLU routine (version 3.0) --
  * Univ. of California Berkeley, Xerox Palo Alto Research Center,
  * and Lawrence Berkeley National Lab.
@@ -39,146 +39,139 @@
 namespace internal {
 /**
  * \brief Performs numeric block updates (sup-col) in topological order
- * 
+ *
  * \param jcol current column to update
  * \param nseg Number of segments in the U part
  * \param dense Store the full representation of the column
- * \param tempv working array 
+ * \param tempv working array
  * \param segrep segment representative ...
  * \param repfnz ??? First nonzero column in each row ???  ...
  * \param fpanelc First column in the current panel
- * \param glu Global LU data. 
- * \return 0 - successful return 
+ * \param glu Global LU data.
+ * \return 0 - successful return
  *         > 0 - number of bytes allocated when run out of space
- * 
+ *
  */
 template <typename Scalar, typename StorageIndex>
-Index SparseLUImpl<Scalar,StorageIndex>::column_bmod(const Index jcol, const Index nseg, BlockScalarVector dense, ScalarVector& tempv,
-                                                     BlockIndexVector segrep, BlockIndexVector repfnz, Index fpanelc, GlobalLU_t& glu)
-{
-  Index  jsupno, k, ksub, krep, ksupno; 
-  Index lptr, nrow, isub, irow, nextlu, new_next, ufirst; 
-  Index fsupc, nsupc, nsupr, luptr, kfnz, no_zeros; 
+Index SparseLUImpl<Scalar, StorageIndex>::column_bmod(const Index jcol, const Index nseg, BlockScalarVector dense,
+                                                      ScalarVector& tempv, BlockIndexVector segrep,
+                                                      BlockIndexVector repfnz, Index fpanelc, GlobalLU_t& glu) {
+  Index jsupno, k, ksub, krep, ksupno;
+  Index lptr, nrow, isub, irow, nextlu, new_next, ufirst;
+  Index fsupc, nsupc, nsupr, luptr, kfnz, no_zeros;
   /* krep = representative of current k-th supernode
-    * fsupc =  first supernodal column
-    * nsupc = number of columns in a supernode
-    * nsupr = number of rows in a supernode
-    * luptr = location of supernodal LU-block in storage
-    * kfnz = first nonz in the k-th supernodal segment
-    * no_zeros = no lf leading zeros in a supernodal U-segment
-    */
-  
+   * fsupc =  first supernodal column
+   * nsupc = number of columns in a supernode
+   * nsupr = number of rows in a supernode
+   * luptr = location of supernodal LU-block in storage
+   * kfnz = first nonz in the k-th supernodal segment
+   * no_zeros = no lf leading zeros in a supernodal U-segment
+   */
+
   jsupno = glu.supno(jcol);
-  // For each nonzero supernode segment of U[*,j] in topological order 
-  k = nseg - 1; 
-  Index d_fsupc; // distance between the first column of the current panel and the 
-               // first column of the current snode
-  Index fst_col; // First column within small LU update
-  Index segsize; 
-  for (ksub = 0; ksub < nseg; ksub++)
-  {
-    krep = segrep(k); k--; 
-    ksupno = glu.supno(krep); 
-    if (jsupno != ksupno )
-    {
-      // outside the rectangular supernode 
-      fsupc = glu.xsup(ksupno); 
-      fst_col = (std::max)(fsupc, fpanelc); 
-      
-      // Distance from the current supernode to the current panel; 
+  // For each nonzero supernode segment of U[*,j] in topological order
+  k = nseg - 1;
+  Index d_fsupc;  // distance between the first column of the current panel and the
+                  // first column of the current snode
+  Index fst_col;  // First column within small LU update
+  Index segsize;
+  for (ksub = 0; ksub < nseg; ksub++) {
+    krep = segrep(k);
+    k--;
+    ksupno = glu.supno(krep);
+    if (jsupno != ksupno) {
+      // outside the rectangular supernode
+      fsupc = glu.xsup(ksupno);
+      fst_col = (std::max)(fsupc, fpanelc);
+
+      // Distance from the current supernode to the current panel;
       // d_fsupc = 0 if fsupc > fpanelc
-      d_fsupc = fst_col - fsupc; 
-      
-      luptr = glu.xlusup(fst_col) + d_fsupc; 
-      lptr = glu.xlsub(fsupc) + d_fsupc; 
-      
-      kfnz = repfnz(krep); 
-      kfnz = (std::max)(kfnz, fpanelc); 
-      
-      segsize = krep - kfnz + 1; 
-      nsupc = krep - fst_col + 1; 
-      nsupr = glu.xlsub(fsupc+1) - glu.xlsub(fsupc); 
+      d_fsupc = fst_col - fsupc;
+
+      luptr = glu.xlusup(fst_col) + d_fsupc;
+      lptr = glu.xlsub(fsupc) + d_fsupc;
+
+      kfnz = repfnz(krep);
+      kfnz = (std::max)(kfnz, fpanelc);
+
+      segsize = krep - kfnz + 1;
+      nsupc = krep - fst_col + 1;
+      nsupr = glu.xlsub(fsupc + 1) - glu.xlsub(fsupc);
       nrow = nsupr - d_fsupc - nsupc;
-      Index lda = glu.xlusup(fst_col+1) - glu.xlusup(fst_col);
-      
-      
-      // Perform a triangular solver and block update, 
+      Index lda = glu.xlusup(fst_col + 1) - glu.xlusup(fst_col);
+
+      // Perform a triangular solver and block update,
       // then scatter the result of sup-col update to dense
-      no_zeros = kfnz - fst_col; 
-      if(segsize==1)
+      no_zeros = kfnz - fst_col;
+      if (segsize == 1)
         LU_kernel_bmod<1>::run(segsize, dense, tempv, glu.lusup, luptr, lda, nrow, glu.lsub, lptr, no_zeros);
       else
         LU_kernel_bmod<Dynamic>::run(segsize, dense, tempv, glu.lusup, luptr, lda, nrow, glu.lsub, lptr, no_zeros);
-    } // end if jsupno 
-  } // end for each segment
-  
+    }  // end if jsupno
+  }    // end for each segment
+
   // Process the supernodal portion of  L\U[*,j]
-  nextlu = glu.xlusup(jcol); 
+  nextlu = glu.xlusup(jcol);
   fsupc = glu.xsup(jsupno);
-  
+
   // copy the SPA dense into L\U[*,j]
-  Index mem; 
-  new_next = nextlu + glu.xlsub(fsupc + 1) - glu.xlsub(fsupc); 
+  Index mem;
+  new_next = nextlu + glu.xlsub(fsupc + 1) - glu.xlsub(fsupc);
   Index offset = internal::first_multiple<Index>(new_next, internal::packet_traits<Scalar>::size) - new_next;
-  if(offset)
-    new_next += offset;
-  while (new_next > glu.nzlumax )
-  {
-    mem = memXpand<ScalarVector>(glu.lusup, glu.nzlumax, nextlu, LUSUP, glu.num_expansions);  
-    if (mem) return mem; 
+  if (offset) new_next += offset;
+  while (new_next > glu.nzlumax) {
+    mem = memXpand<ScalarVector>(glu.lusup, glu.nzlumax, nextlu, LUSUP, glu.num_expansions);
+    if (mem) return mem;
   }
-  
-  for (isub = glu.xlsub(fsupc); isub < glu.xlsub(fsupc+1); isub++)
-  {
+
+  for (isub = glu.xlsub(fsupc); isub < glu.xlsub(fsupc + 1); isub++) {
     irow = glu.lsub(isub);
     glu.lusup(nextlu) = dense(irow);
-    dense(irow) = Scalar(0.0); 
-    ++nextlu; 
+    dense(irow) = Scalar(0.0);
+    ++nextlu;
   }
-  
-  if(offset)
-  {
-    glu.lusup.segment(nextlu,offset).setZero();
+
+  if (offset) {
+    glu.lusup.segment(nextlu, offset).setZero();
     nextlu += offset;
   }
-  glu.xlusup(jcol + 1) = StorageIndex(nextlu);  // close L\U(*,jcol); 
-  
+  glu.xlusup(jcol + 1) = StorageIndex(nextlu);  // close L\U(*,jcol);
+
   /* For more updates within the panel (also within the current supernode),
    * should start from the first column of the panel, or the first column
    * of the supernode, whichever is bigger. There are two cases:
    *  1) fsupc < fpanelc, then fst_col <-- fpanelc
    *  2) fsupc >= fpanelc, then fst_col <-- fsupc
    */
-  fst_col = (std::max)(fsupc, fpanelc); 
-  
-  if (fst_col  < jcol)
-  {
+  fst_col = (std::max)(fsupc, fpanelc);
+
+  if (fst_col < jcol) {
     // Distance between the current supernode and the current panel
     // d_fsupc = 0 if fsupc >= fpanelc
-    d_fsupc = fst_col - fsupc; 
-    
-    lptr = glu.xlsub(fsupc) + d_fsupc; 
-    luptr = glu.xlusup(fst_col) + d_fsupc; 
-    nsupr = glu.xlsub(fsupc+1) - glu.xlsub(fsupc); // leading dimension
-    nsupc = jcol - fst_col; // excluding jcol 
-    nrow = nsupr - d_fsupc - nsupc; 
-    
-    // points to the beginning of jcol in snode L\U(jsupno) 
-    ufirst = glu.xlusup(jcol) + d_fsupc; 
-    Index lda = glu.xlusup(jcol+1) - glu.xlusup(jcol);
-    MappedMatrixBlock A( &(glu.lusup.data()[luptr]), nsupc, nsupc, OuterStride<>(lda) );
-    VectorBlock<ScalarVector> u(glu.lusup, ufirst, nsupc); 
-    u = A.template triangularView<UnitLower>().solve(u); 
-    
-    new (&A) MappedMatrixBlock ( &(glu.lusup.data()[luptr+nsupc]), nrow, nsupc, OuterStride<>(lda) );
-    VectorBlock<ScalarVector> l(glu.lusup, ufirst+nsupc, nrow); 
+    d_fsupc = fst_col - fsupc;
+
+    lptr = glu.xlsub(fsupc) + d_fsupc;
+    luptr = glu.xlusup(fst_col) + d_fsupc;
+    nsupr = glu.xlsub(fsupc + 1) - glu.xlsub(fsupc);  // leading dimension
+    nsupc = jcol - fst_col;                           // excluding jcol
+    nrow = nsupr - d_fsupc - nsupc;
+
+    // points to the beginning of jcol in snode L\U(jsupno)
+    ufirst = glu.xlusup(jcol) + d_fsupc;
+    Index lda = glu.xlusup(jcol + 1) - glu.xlusup(jcol);
+    MappedMatrixBlock A(&(glu.lusup.data()[luptr]), nsupc, nsupc, OuterStride<>(lda));
+    VectorBlock<ScalarVector> u(glu.lusup, ufirst, nsupc);
+    u = A.template triangularView<UnitLower>().solve(u);
+
+    new (&A) MappedMatrixBlock(&(glu.lusup.data()[luptr + nsupc]), nrow, nsupc, OuterStride<>(lda));
+    VectorBlock<ScalarVector> l(glu.lusup, ufirst + nsupc, nrow);
     l.noalias() -= A * u;
-    
-  } // End if fst_col
-  return 0; 
+
+  }  // End if fst_col
+  return 0;
 }
 
-} // end namespace internal
-} // end namespace Eigen
+}  // end namespace internal
+}  // end namespace Eigen
 
-#endif // SPARSELU_COLUMN_BMOD_H
+#endif  // SPARSELU_COLUMN_BMOD_H
diff --git a/Eigen/src/SparseLU/SparseLU_column_dfs.h b/Eigen/src/SparseLU/SparseLU_column_dfs.h
index ddead00..e5fb771 100644
--- a/Eigen/src/SparseLU/SparseLU_column_dfs.h
+++ b/Eigen/src/SparseLU/SparseLU_column_dfs.h
@@ -7,10 +7,10 @@
 // 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/.
 
-/* 
- 
- * NOTE: This file is the modified version of [s,d,c,z]column_dfs.c file in SuperLU 
- 
+/*
+
+ * NOTE: This file is the modified version of [s,d,c,z]column_dfs.c file in SuperLU
+
  * -- SuperLU routine (version 2.0) --
  * Univ. of California Berkeley, Xerox Palo Alto Research Center,
  * and Lawrence Berkeley National Lab.
@@ -30,7 +30,8 @@
 #ifndef SPARSELU_COLUMN_DFS_H
 #define SPARSELU_COLUMN_DFS_H
 
-template <typename Scalar, typename StorageIndex> class SparseLUImpl;
+template <typename Scalar, typename StorageIndex>
+class SparseLUImpl;
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
@@ -38,145 +39,130 @@
 
 namespace internal {
 
-template<typename IndexVector, typename ScalarVector>
-struct column_dfs_traits : no_assignment_operator
-{
+template <typename IndexVector, typename ScalarVector>
+struct column_dfs_traits : no_assignment_operator {
   typedef typename ScalarVector::Scalar Scalar;
   typedef typename IndexVector::Scalar StorageIndex;
-  column_dfs_traits(Index jcol, Index& jsuper, typename SparseLUImpl<Scalar, StorageIndex>::GlobalLU_t& glu, SparseLUImpl<Scalar, StorageIndex>& luImpl)
-   : m_jcol(jcol), m_jsuper_ref(jsuper), m_glu(glu), m_luImpl(luImpl)
- {}
-  bool update_segrep(Index /*krep*/, Index /*jj*/)
-  {
-    return true;
-  }
-  void mem_expand(IndexVector& lsub, Index& nextl, Index chmark)
-  {
-    if (nextl >= m_glu.nzlmax)
-      m_luImpl.memXpand(lsub, m_glu.nzlmax, nextl, LSUB, m_glu.num_expansions); 
-    if (chmark != (m_jcol-1)) m_jsuper_ref = emptyIdxLU;
+  column_dfs_traits(Index jcol, Index& jsuper, typename SparseLUImpl<Scalar, StorageIndex>::GlobalLU_t& glu,
+                    SparseLUImpl<Scalar, StorageIndex>& luImpl)
+      : m_jcol(jcol), m_jsuper_ref(jsuper), m_glu(glu), m_luImpl(luImpl) {}
+  bool update_segrep(Index /*krep*/, Index /*jj*/) { return true; }
+  void mem_expand(IndexVector& lsub, Index& nextl, Index chmark) {
+    if (nextl >= m_glu.nzlmax) m_luImpl.memXpand(lsub, m_glu.nzlmax, nextl, LSUB, m_glu.num_expansions);
+    if (chmark != (m_jcol - 1)) m_jsuper_ref = emptyIdxLU;
   }
   enum { ExpandMem = true };
-  
+
   Index m_jcol;
   Index& m_jsuper_ref;
   typename SparseLUImpl<Scalar, StorageIndex>::GlobalLU_t& m_glu;
   SparseLUImpl<Scalar, StorageIndex>& m_luImpl;
 };
 
-
 /**
  * \brief Performs a symbolic factorization on column jcol and decide the supernode boundary
- * 
+ *
  * A supernode representative is the last column of a supernode.
- * The nonzeros in U[*,j] are segments that end at supernodes representatives. 
- * The routine returns a list of the supernodal representatives 
- * in topological order of the dfs that generates them. 
- * The location of the first nonzero in each supernodal segment 
- * (supernodal entry location) is also returned. 
- * 
+ * The nonzeros in U[*,j] are segments that end at supernodes representatives.
+ * The routine returns a list of the supernodal representatives
+ * in topological order of the dfs that generates them.
+ * The location of the first nonzero in each supernodal segment
+ * (supernodal entry location) is also returned.
+ *
  * \param m number of rows in the matrix
- * \param jcol Current column 
+ * \param jcol Current column
  * \param perm_r Row permutation
  * \param maxsuper  Maximum number of column allowed in a supernode
  * \param [in,out] nseg Number of segments in current U[*,j] - new segments appended
  * \param lsub_col defines the rhs vector to start the dfs
- * \param [in,out] segrep Segment representatives - new segments appended 
+ * \param [in,out] segrep Segment representatives - new segments appended
  * \param repfnz  First nonzero location in each row
- * \param xprune 
+ * \param xprune
  * \param marker  marker[i] == jj, if i was visited during dfs of current column jj;
  * \param parent
  * \param xplore working array
- * \param glu global LU data 
+ * \param glu global LU data
  * \return 0 success
  *         > 0 number of bytes allocated when run out of space
- * 
+ *
  */
 template <typename Scalar, typename StorageIndex>
-Index SparseLUImpl<Scalar,StorageIndex>::column_dfs(const Index m, const Index jcol, IndexVector& perm_r, Index maxsuper, Index& nseg,
-                                                    BlockIndexVector lsub_col, IndexVector& segrep, BlockIndexVector repfnz, IndexVector& xprune,
-                                                    IndexVector& marker, IndexVector& parent, IndexVector& xplore, GlobalLU_t& glu)
-{
-  
-  Index jsuper = glu.supno(jcol); 
-  Index nextl = glu.xlsub(jcol); 
-  VectorBlock<IndexVector> marker2(marker, 2*m, m); 
-  
-  
+Index SparseLUImpl<Scalar, StorageIndex>::column_dfs(const Index m, const Index jcol, IndexVector& perm_r,
+                                                     Index maxsuper, Index& nseg, BlockIndexVector lsub_col,
+                                                     IndexVector& segrep, BlockIndexVector repfnz, IndexVector& xprune,
+                                                     IndexVector& marker, IndexVector& parent, IndexVector& xplore,
+                                                     GlobalLU_t& glu) {
+  Index jsuper = glu.supno(jcol);
+  Index nextl = glu.xlsub(jcol);
+  VectorBlock<IndexVector> marker2(marker, 2 * m, m);
+
   column_dfs_traits<IndexVector, ScalarVector> traits(jcol, jsuper, glu, *this);
-  
-  // For each nonzero in A(*,jcol) do dfs 
-  for (Index k = 0; ((k < m) ? lsub_col[k] != emptyIdxLU : false) ; k++)
-  {
-    Index krow = lsub_col(k); 
-    lsub_col(k) = emptyIdxLU; 
-    Index kmark = marker2(krow); 
-    
-    // krow was visited before, go to the next nonz; 
+
+  // For each nonzero in A(*,jcol) do dfs
+  for (Index k = 0; ((k < m) ? lsub_col[k] != emptyIdxLU : false); k++) {
+    Index krow = lsub_col(k);
+    lsub_col(k) = emptyIdxLU;
+    Index kmark = marker2(krow);
+
+    // krow was visited before, go to the next nonz;
     if (kmark == jcol) continue;
-    
-    dfs_kernel(StorageIndex(jcol), perm_r, nseg, glu.lsub, segrep, repfnz, xprune, marker2, parent,
-                   xplore, glu, nextl, krow, traits);
-  } // for each nonzero ... 
-  
+
+    dfs_kernel(StorageIndex(jcol), perm_r, nseg, glu.lsub, segrep, repfnz, xprune, marker2, parent, xplore, glu, nextl,
+               krow, traits);
+  }  // for each nonzero ...
+
   Index fsupc;
   StorageIndex nsuper = glu.supno(jcol);
   StorageIndex jcolp1 = StorageIndex(jcol) + 1;
   Index jcolm1 = jcol - 1;
-  
+
   // check to see if j belongs in the same supernode as j-1
-  if ( jcol == 0 )
-  { // Do nothing for column 0 
-    nsuper = glu.supno(0) = 0 ;
-  }
-  else 
-  {
-    fsupc = glu.xsup(nsuper); 
-    StorageIndex jptr = glu.xlsub(jcol); // Not yet compressed
-    StorageIndex jm1ptr = glu.xlsub(jcolm1); 
-    
+  if (jcol == 0) {  // Do nothing for column 0
+    nsuper = glu.supno(0) = 0;
+  } else {
+    fsupc = glu.xsup(nsuper);
+    StorageIndex jptr = glu.xlsub(jcol);  // Not yet compressed
+    StorageIndex jm1ptr = glu.xlsub(jcolm1);
+
     // Use supernodes of type T2 : see SuperLU paper
-    if ( (nextl-jptr != jptr-jm1ptr-1) ) jsuper = emptyIdxLU;
-    
+    if ((nextl - jptr != jptr - jm1ptr - 1)) jsuper = emptyIdxLU;
+
     // Make sure the number of columns in a supernode doesn't
     // exceed threshold
-    if ( (jcol - fsupc) >= maxsuper) jsuper = emptyIdxLU; 
-    
+    if ((jcol - fsupc) >= maxsuper) jsuper = emptyIdxLU;
+
     /* If jcol starts a new supernode, reclaim storage space in
-     * glu.lsub from previous supernode. Note we only store 
-     * the subscript set of the first and last columns of 
+     * glu.lsub from previous supernode. Note we only store
+     * the subscript set of the first and last columns of
      * a supernode. (first for num values, last for pruning)
      */
-    if (jsuper == emptyIdxLU)
-    { // starts a new supernode 
-      if ( (fsupc < jcolm1-1) ) 
-      { // >= 3 columns in nsuper
-        StorageIndex ito = glu.xlsub(fsupc+1);
-        glu.xlsub(jcolm1) = ito; 
-        StorageIndex istop = ito + jptr - jm1ptr; 
-        xprune(jcolm1) = istop; // initialize xprune(jcol-1)
-        glu.xlsub(jcol) = istop; 
-        
-        for (StorageIndex ifrom = jm1ptr; ifrom < nextl; ++ifrom, ++ito)
-          glu.lsub(ito) = glu.lsub(ifrom); 
+    if (jsuper == emptyIdxLU) {    // starts a new supernode
+      if ((fsupc < jcolm1 - 1)) {  // >= 3 columns in nsuper
+        StorageIndex ito = glu.xlsub(fsupc + 1);
+        glu.xlsub(jcolm1) = ito;
+        StorageIndex istop = ito + jptr - jm1ptr;
+        xprune(jcolm1) = istop;  // initialize xprune(jcol-1)
+        glu.xlsub(jcol) = istop;
+
+        for (StorageIndex ifrom = jm1ptr; ifrom < nextl; ++ifrom, ++ito) glu.lsub(ito) = glu.lsub(ifrom);
         nextl = ito;  // = istop + length(jcol)
       }
-      nsuper++; 
-      glu.supno(jcol) = nsuper; 
-    } // if a new supernode 
-  } // end else:  jcol > 0
-  
+      nsuper++;
+      glu.supno(jcol) = nsuper;
+    }  // if a new supernode
+  }    // end else:  jcol > 0
+
   // Tidy up the pointers before exit
-  glu.xsup(nsuper+1) = jcolp1; 
-  glu.supno(jcolp1) = nsuper; 
+  glu.xsup(nsuper + 1) = jcolp1;
+  glu.supno(jcolp1) = nsuper;
   xprune(jcol) = StorageIndex(nextl);  // Initialize upper bound for pruning
-  glu.xlsub(jcolp1) = StorageIndex(nextl); 
-  
-  return 0; 
+  glu.xlsub(jcolp1) = StorageIndex(nextl);
+
+  return 0;
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
 #endif
diff --git a/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h b/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h
index b9e7c62..12e7650 100644
--- a/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h
+++ b/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h
@@ -6,10 +6,10 @@
 // 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/.
-/* 
- 
- * NOTE: This file is the modified version of [s,d,c,z]copy_to_ucol.c file in SuperLU 
- 
+/*
+
+ * NOTE: This file is the modified version of [s,d,c,z]copy_to_ucol.c file in SuperLU
+
  * -- SuperLU routine (version 2.0) --
  * Univ. of California Berkeley, Xerox Palo Alto Research Center,
  * and Lawrence Berkeley National Lab.
@@ -37,74 +37,70 @@
 
 /**
  * \brief Performs numeric block updates (sup-col) in topological order
- * 
+ *
  * \param jcol current column to update
  * \param nseg Number of segments in the U part
  * \param segrep segment representative ...
  * \param repfnz First nonzero column in each row  ...
- * \param perm_r Row permutation 
+ * \param perm_r Row permutation
  * \param dense Store the full representation of the column
- * \param glu Global LU data. 
- * \return 0 - successful return 
+ * \param glu Global LU data.
+ * \return 0 - successful return
  *         > 0 - number of bytes allocated when run out of space
- * 
+ *
  */
 template <typename Scalar, typename StorageIndex>
-Index SparseLUImpl<Scalar,StorageIndex>::copy_to_ucol(const Index jcol, const Index nseg, IndexVector& segrep,
-                                                      BlockIndexVector repfnz ,IndexVector& perm_r, BlockScalarVector dense, GlobalLU_t& glu)
-{  
-  Index ksub, krep, ksupno; 
-    
+Index SparseLUImpl<Scalar, StorageIndex>::copy_to_ucol(const Index jcol, const Index nseg, IndexVector& segrep,
+                                                       BlockIndexVector repfnz, IndexVector& perm_r,
+                                                       BlockScalarVector dense, GlobalLU_t& glu) {
+  Index ksub, krep, ksupno;
+
   Index jsupno = glu.supno(jcol);
-  
-  // For each nonzero supernode segment of U[*,j] in topological order 
-  Index k = nseg - 1, i; 
-  StorageIndex nextu = glu.xusub(jcol); 
-  Index kfnz, isub, segsize; 
-  Index new_next,irow; 
-  Index fsupc, mem; 
-  for (ksub = 0; ksub < nseg; ksub++)
-  {
-    krep = segrep(k); k--; 
-    ksupno = glu.supno(krep); 
-    if (jsupno != ksupno ) // should go into ucol(); 
+
+  // For each nonzero supernode segment of U[*,j] in topological order
+  Index k = nseg - 1, i;
+  StorageIndex nextu = glu.xusub(jcol);
+  Index kfnz, isub, segsize;
+  Index new_next, irow;
+  Index fsupc, mem;
+  for (ksub = 0; ksub < nseg; ksub++) {
+    krep = segrep(k);
+    k--;
+    ksupno = glu.supno(krep);
+    if (jsupno != ksupno)  // should go into ucol();
     {
-      kfnz = repfnz(krep); 
-      if (kfnz != emptyIdxLU)
-      { // Nonzero U-segment 
-        fsupc = glu.xsup(ksupno); 
-        isub = glu.xlsub(fsupc) + kfnz - fsupc; 
-        segsize = krep - kfnz + 1; 
-        new_next = nextu + segsize; 
-        while (new_next > glu.nzumax) 
-        {
-          mem = memXpand<ScalarVector>(glu.ucol, glu.nzumax, nextu, UCOL, glu.num_expansions); 
-          if (mem) return mem; 
-          mem = memXpand<IndexVector>(glu.usub, glu.nzumax, nextu, USUB, glu.num_expansions); 
-          if (mem) return mem; 
-          
+      kfnz = repfnz(krep);
+      if (kfnz != emptyIdxLU) {  // Nonzero U-segment
+        fsupc = glu.xsup(ksupno);
+        isub = glu.xlsub(fsupc) + kfnz - fsupc;
+        segsize = krep - kfnz + 1;
+        new_next = nextu + segsize;
+        while (new_next > glu.nzumax) {
+          mem = memXpand<ScalarVector>(glu.ucol, glu.nzumax, nextu, UCOL, glu.num_expansions);
+          if (mem) return mem;
+          mem = memXpand<IndexVector>(glu.usub, glu.nzumax, nextu, USUB, glu.num_expansions);
+          if (mem) return mem;
         }
-        
-        for (i = 0; i < segsize; i++)
-        {
-          irow = glu.lsub(isub); 
-          glu.usub(nextu) = perm_r(irow); // Unlike the L part, the U part is stored in its final order
-          glu.ucol(nextu) = dense(irow); 
-          dense(irow) = Scalar(0.0); 
+
+        for (i = 0; i < segsize; i++) {
+          irow = glu.lsub(isub);
+          glu.usub(nextu) = perm_r(irow);  // Unlike the L part, the U part is stored in its final order
+          glu.ucol(nextu) = dense(irow);
+          dense(irow) = Scalar(0.0);
           nextu++;
           isub++;
         }
-        
-      } // end nonzero U-segment 
-      
-    } // end if jsupno 
-    
-  } // end for each segment
-  glu.xusub(jcol + 1) = nextu; // close U(*,jcol)
-  return 0; 
+
+      }  // end nonzero U-segment
+
+    }  // end if jsupno
+
+  }                             // end for each segment
+  glu.xusub(jcol + 1) = nextu;  // close U(*,jcol)
+  return 0;
 }
 
-} // namespace internal
-} // end namespace Eigen
+}  // namespace internal
+}  // end namespace Eigen
 
-#endif // SPARSELU_COPY_TO_UCOL_H
+#endif  // SPARSELU_COPY_TO_UCOL_H
diff --git a/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h b/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h
index 4df0dcd..8df830b 100644
--- a/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h
+++ b/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h
@@ -34,77 +34,67 @@
 namespace Eigen {
 namespace internal {
 
-/** 
+/**
  * \brief Identify the initial relaxed supernodes
- * 
- * This routine applied to a symmetric elimination tree. 
+ *
+ * This routine applied to a symmetric elimination tree.
  * It assumes that the matrix has been reordered according to the postorder of the etree
  * \param n The number of columns
- * \param et elimination tree 
- * \param relax_columns Maximum number of columns allowed in a relaxed snode 
+ * \param et elimination tree
+ * \param relax_columns Maximum number of columns allowed in a relaxed snode
  * \param descendants Number of descendants of each node in the etree
  * \param relax_end last column in a supernode
  */
 template <typename Scalar, typename StorageIndex>
-void SparseLUImpl<Scalar,StorageIndex>::heap_relax_snode (const Index n, IndexVector& et, const Index relax_columns, IndexVector& descendants, IndexVector& relax_end)
-{
-  
-  // The etree may not be postordered, but its heap ordered  
+void SparseLUImpl<Scalar, StorageIndex>::heap_relax_snode(const Index n, IndexVector& et, const Index relax_columns,
+                                                          IndexVector& descendants, IndexVector& relax_end) {
+  // The etree may not be postordered, but its heap ordered
   IndexVector post;
-  internal::treePostorder(StorageIndex(n), et, post); // Post order etree
-  IndexVector inv_post(n+1); 
-  for (StorageIndex i = 0; i < n+1; ++i) inv_post(post(i)) = i; // inv_post = post.inverse()???
-  
-  // Renumber etree in postorder 
+  internal::treePostorder(StorageIndex(n), et, post);  // Post order etree
+  IndexVector inv_post(n + 1);
+  for (StorageIndex i = 0; i < n + 1; ++i) inv_post(post(i)) = i;  // inv_post = post.inverse()???
+
+  // Renumber etree in postorder
   IndexVector iwork(n);
-  IndexVector et_save(n+1);
-  for (Index i = 0; i < n; ++i)
-  {
+  IndexVector et_save(n + 1);
+  for (Index i = 0; i < n; ++i) {
     iwork(post(i)) = post(et(i));
   }
-  et_save = et; // Save the original etree
-  et = iwork; 
-  
+  et_save = et;  // Save the original etree
+  et = iwork;
+
   // compute the number of descendants of each node in the etree
   relax_end.setConstant(emptyIdxLU);
-  Index j, parent; 
+  Index j, parent;
   descendants.setZero();
-  for (j = 0; j < n; j++) 
-  {
+  for (j = 0; j < n; j++) {
     parent = et(j);
-    if (parent != n) // not the dummy root
+    if (parent != n)  // not the dummy root
       descendants(parent) += descendants(j) + 1;
   }
   // Identify the relaxed supernodes by postorder traversal of the etree
-  Index snode_start; // beginning of a snode 
+  Index snode_start;  // beginning of a snode
   StorageIndex k;
-  StorageIndex l; 
-  for (j = 0; j < n; )
-  {
+  StorageIndex l;
+  for (j = 0; j < n;) {
     parent = et(j);
-    snode_start = j; 
-    while ( parent != n && descendants(parent) < relax_columns ) 
-    {
-      j = parent; 
+    snode_start = j;
+    while (parent != n && descendants(parent) < relax_columns) {
+      j = parent;
       parent = et(j);
     }
-    // Found a supernode in postordered etree, j is the last column 
+    // Found a supernode in postordered etree, j is the last column
     k = StorageIndex(n);
-    for (Index i = snode_start; i <= j; ++i)
-      k = (std::min)(k, inv_post(i));
+    for (Index i = snode_start; i <= j; ++i) k = (std::min)(k, inv_post(i));
     l = inv_post(j);
-    if ( (l - k) == (j - snode_start) )  // Same number of columns in the snode
+    if ((l - k) == (j - snode_start))  // Same number of columns in the snode
     {
       // This is also a supernode in the original etree
-      relax_end(k) = l; // Record last column 
-    }
-    else 
-    {
-      for (Index i = snode_start; i <= j; ++i) 
-      {
+      relax_end(k) = l;  // Record last column
+    } else {
+      for (Index i = snode_start; i <= j; ++i) {
         l = inv_post(i);
-        if (descendants(i) == 0) 
-        {
+        if (descendants(i) == 0) {
           relax_end(l) = l;
         }
       }
@@ -112,13 +102,13 @@
     j++;
     // Search for a new leaf
     while (descendants(j) != 0 && j < n) j++;
-  } // End postorder traversal of the etree
-  
+  }  // End postorder traversal of the etree
+
   // Recover the original etree
-  et = et_save; 
+  et = et_save;
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
-#endif // SPARSELU_HEAP_RELAX_SNODE_H
+}  // end namespace Eigen
+#endif  // SPARSELU_HEAP_RELAX_SNODE_H
diff --git a/Eigen/src/SparseLU/SparseLU_kernel_bmod.h b/Eigen/src/SparseLU/SparseLU_kernel_bmod.h
index da32041..54bda0c 100644
--- a/Eigen/src/SparseLU/SparseLU_kernel_bmod.h
+++ b/Eigen/src/SparseLU/SparseLU_kernel_bmod.h
@@ -16,117 +16,118 @@
 
 namespace Eigen {
 namespace internal {
-  
-template <int SegSizeAtCompileTime> struct LU_kernel_bmod
-{
+
+template <int SegSizeAtCompileTime>
+struct LU_kernel_bmod {
   /** \internal
-    * \brief Performs numeric block updates from a given supernode to a single column
-    *
-    * \param segsize Size of the segment (and blocks ) to use for updates
-    * \param[in,out] dense Packed values of the original matrix
-    * \param tempv temporary vector to use for updates
-    * \param lusup array containing the supernodes
-    * \param lda Leading dimension in the supernode
-    * \param nrow Number of rows in the rectangular part of the supernode
-    * \param lsub compressed row subscripts of supernodes
-    * \param lptr pointer to the first column of the current supernode in lsub
-    * \param no_zeros Number of nonzeros elements before the diagonal part of the supernode
-    */
+   * \brief Performs numeric block updates from a given supernode to a single column
+   *
+   * \param segsize Size of the segment (and blocks ) to use for updates
+   * \param[in,out] dense Packed values of the original matrix
+   * \param tempv temporary vector to use for updates
+   * \param lusup array containing the supernodes
+   * \param lda Leading dimension in the supernode
+   * \param nrow Number of rows in the rectangular part of the supernode
+   * \param lsub compressed row subscripts of supernodes
+   * \param lptr pointer to the first column of the current supernode in lsub
+   * \param no_zeros Number of nonzeros elements before the diagonal part of the supernode
+   */
   template <typename BlockScalarVector, typename ScalarVector, typename IndexVector>
-  static EIGEN_DONT_INLINE void run(const Index segsize, BlockScalarVector& dense, ScalarVector& tempv, ScalarVector& lusup, Index& luptr, const Index lda,
-                                    const Index nrow, IndexVector& lsub, const Index lptr, const Index no_zeros);
+  static EIGEN_DONT_INLINE void run(const Index segsize, BlockScalarVector& dense, ScalarVector& tempv,
+                                    ScalarVector& lusup, Index& luptr, const Index lda, const Index nrow,
+                                    IndexVector& lsub, const Index lptr, const Index no_zeros);
 };
 
 template <int SegSizeAtCompileTime>
 template <typename BlockScalarVector, typename ScalarVector, typename IndexVector>
-EIGEN_DONT_INLINE void LU_kernel_bmod<SegSizeAtCompileTime>::run(const Index segsize, BlockScalarVector& dense, ScalarVector& tempv, ScalarVector& lusup, Index& luptr, const Index lda,
-                                                                  const Index nrow, IndexVector& lsub, const Index lptr, const Index no_zeros)
-{
+EIGEN_DONT_INLINE void LU_kernel_bmod<SegSizeAtCompileTime>::run(const Index segsize, BlockScalarVector& dense,
+                                                                 ScalarVector& tempv, ScalarVector& lusup, Index& luptr,
+                                                                 const Index lda, const Index nrow, IndexVector& lsub,
+                                                                 const Index lptr, const Index no_zeros) {
   typedef typename ScalarVector::Scalar Scalar;
   // First, copy U[*,j] segment from dense(*) to tempv(*)
-  // The result of triangular solve is in tempv[*]; 
-    // The result of matric-vector update is in dense[*]
-  Index isub = lptr + no_zeros; 
+  // The result of triangular solve is in tempv[*];
+  // The result of matric-vector update is in dense[*]
+  Index isub = lptr + no_zeros;
   Index i;
   Index irow;
-  for (i = 0; i < ((SegSizeAtCompileTime==Dynamic)?segsize:SegSizeAtCompileTime); i++)
-  {
-    irow = lsub(isub); 
-    tempv(i) = dense(irow); 
-    ++isub; 
+  for (i = 0; i < ((SegSizeAtCompileTime == Dynamic) ? segsize : SegSizeAtCompileTime); i++) {
+    irow = lsub(isub);
+    tempv(i) = dense(irow);
+    ++isub;
   }
   // Dense triangular solve -- start effective triangle
-  luptr += lda * no_zeros + no_zeros; 
-  // Form Eigen matrix and vector 
-  Map<Matrix<Scalar,SegSizeAtCompileTime,SegSizeAtCompileTime, ColMajor>, 0, OuterStride<> > A( &(lusup.data()[luptr]), segsize, segsize, OuterStride<>(lda) );
-  Map<Matrix<Scalar,SegSizeAtCompileTime,1> > u(tempv.data(), segsize);
-  
-  u = A.template triangularView<UnitLower>().solve(u); 
-  
-  // Dense matrix-vector product y <-- B*x 
+  luptr += lda * no_zeros + no_zeros;
+  // Form Eigen matrix and vector
+  Map<Matrix<Scalar, SegSizeAtCompileTime, SegSizeAtCompileTime, ColMajor>, 0, OuterStride<> > A(
+      &(lusup.data()[luptr]), segsize, segsize, OuterStride<>(lda));
+  Map<Matrix<Scalar, SegSizeAtCompileTime, 1> > u(tempv.data(), segsize);
+
+  u = A.template triangularView<UnitLower>().solve(u);
+
+  // Dense matrix-vector product y <-- B*x
   luptr += segsize;
   const Index PacketSize = internal::packet_traits<Scalar>::size;
   Index ldl = internal::first_multiple(nrow, PacketSize);
-  Map<Matrix<Scalar,Dynamic,SegSizeAtCompileTime, ColMajor>, 0, OuterStride<> > B( &(lusup.data()[luptr]), nrow, segsize, OuterStride<>(lda) );
-  Index aligned_offset = internal::first_default_aligned(tempv.data()+segsize, PacketSize);
-  Index aligned_with_B_offset = (PacketSize-internal::first_default_aligned(B.data(), PacketSize))%PacketSize;
-  Map<Matrix<Scalar,Dynamic,1>, 0, OuterStride<> > l(tempv.data()+segsize+aligned_offset+aligned_with_B_offset, nrow, OuterStride<>(ldl) );
-  
+  Map<Matrix<Scalar, Dynamic, SegSizeAtCompileTime, ColMajor>, 0, OuterStride<> > B(&(lusup.data()[luptr]), nrow,
+                                                                                    segsize, OuterStride<>(lda));
+  Index aligned_offset = internal::first_default_aligned(tempv.data() + segsize, PacketSize);
+  Index aligned_with_B_offset = (PacketSize - internal::first_default_aligned(B.data(), PacketSize)) % PacketSize;
+  Map<Matrix<Scalar, Dynamic, 1>, 0, OuterStride<> > l(tempv.data() + segsize + aligned_offset + aligned_with_B_offset,
+                                                       nrow, OuterStride<>(ldl));
+
   l.noalias() = B * u;
-  
-  // Scatter tempv[] into SPA dense[] as a temporary storage 
+
+  // Scatter tempv[] into SPA dense[] as a temporary storage
   isub = lptr + no_zeros;
-  for (i = 0; i < ((SegSizeAtCompileTime==Dynamic)?segsize:SegSizeAtCompileTime); i++)
-  {
-    irow = lsub(isub++); 
+  for (i = 0; i < ((SegSizeAtCompileTime == Dynamic) ? segsize : SegSizeAtCompileTime); i++) {
+    irow = lsub(isub++);
     dense(irow) = tempv(i);
   }
-  
+
   // Scatter l into SPA dense[]
-  for (i = 0; i < nrow; i++)
-  {
-    irow = lsub(isub++); 
+  for (i = 0; i < nrow; i++) {
+    irow = lsub(isub++);
     dense(irow) -= l(i);
-  } 
+  }
 }
 
-template <> struct LU_kernel_bmod<1>
-{
+template <>
+struct LU_kernel_bmod<1> {
   template <typename BlockScalarVector, typename ScalarVector, typename IndexVector>
-  static EIGEN_DONT_INLINE void run(const Index /*segsize*/, BlockScalarVector& dense, ScalarVector& /*tempv*/, ScalarVector& lusup, Index& luptr,
-                                    const Index lda, const Index nrow, IndexVector& lsub, const Index lptr, const Index no_zeros);
+  static EIGEN_DONT_INLINE void run(const Index /*segsize*/, BlockScalarVector& dense, ScalarVector& /*tempv*/,
+                                    ScalarVector& lusup, Index& luptr, const Index lda, const Index nrow,
+                                    IndexVector& lsub, const Index lptr, const Index no_zeros);
 };
 
-
 template <typename BlockScalarVector, typename ScalarVector, typename IndexVector>
-EIGEN_DONT_INLINE void LU_kernel_bmod<1>::run(const Index /*segsize*/, BlockScalarVector& dense, ScalarVector& /*tempv*/, ScalarVector& lusup, Index& luptr,
-                                              const Index lda, const Index nrow, IndexVector& lsub, const Index lptr, const Index no_zeros)
-{
+EIGEN_DONT_INLINE void LU_kernel_bmod<1>::run(const Index /*segsize*/, BlockScalarVector& dense,
+                                              ScalarVector& /*tempv*/, ScalarVector& lusup, Index& luptr,
+                                              const Index lda, const Index nrow, IndexVector& lsub, const Index lptr,
+                                              const Index no_zeros) {
   typedef typename ScalarVector::Scalar Scalar;
   typedef typename IndexVector::Scalar StorageIndex;
   Scalar f = dense(lsub(lptr + no_zeros));
   luptr += lda * no_zeros + no_zeros + 1;
   const Scalar* a(lusup.data() + luptr);
-  const StorageIndex*  irow(lsub.data()+lptr + no_zeros + 1);
+  const StorageIndex* irow(lsub.data() + lptr + no_zeros + 1);
   Index i = 0;
-  for (; i+1 < nrow; i+=2)
-  {
+  for (; i + 1 < nrow; i += 2) {
     Index i0 = *(irow++);
     Index i1 = *(irow++);
     Scalar a0 = *(a++);
     Scalar a1 = *(a++);
     Scalar d0 = dense.coeff(i0);
     Scalar d1 = dense.coeff(i1);
-    d0 -= f*a0;
-    d1 -= f*a1;
+    d0 -= f * a0;
+    d1 -= f * a1;
     dense.coeffRef(i0) = d0;
     dense.coeffRef(i1) = d1;
   }
-  if(i<nrow)
-    dense.coeffRef(*(irow++)) -= f * *(a++);
+  if (i < nrow) dense.coeffRef(*(irow++)) -= f * *(a++);
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
-#endif // SPARSELU_KERNEL_BMOD_H
+}  // end namespace Eigen
+#endif  // SPARSELU_KERNEL_BMOD_H
diff --git a/Eigen/src/SparseLU/SparseLU_panel_bmod.h b/Eigen/src/SparseLU/SparseLU_panel_bmod.h
index d12d0e2..505d982 100644
--- a/Eigen/src/SparseLU/SparseLU_panel_bmod.h
+++ b/Eigen/src/SparseLU/SparseLU_panel_bmod.h
@@ -8,10 +8,10 @@
 // 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/.
 
-/* 
- 
- * NOTE: This file is the modified version of [s,d,c,z]panel_bmod.c file in SuperLU 
- 
+/*
+
+ * NOTE: This file is the modified version of [s,d,c,z]panel_bmod.c file in SuperLU
+
  * -- SuperLU routine (version 3.0) --
  * Univ. of California Berkeley, Xerox Palo Alto Research Center,
  * and Lawrence Berkeley National Lab.
@@ -39,187 +39,177 @@
 
 /**
  * \brief Performs numeric block updates (sup-panel) in topological order.
- * 
+ *
  * Before entering this routine, the original nonzeros in the panel
  * were already copied into the spa[m,w]
- * 
+ *
  * \param m number of rows in the matrix
  * \param w Panel size
  * \param jcol Starting  column of the panel
  * \param nseg Number of segments in the U part
- * \param dense Store the full representation of the panel 
- * \param tempv working array 
+ * \param dense Store the full representation of the panel
+ * \param tempv working array
  * \param segrep segment representative... first row in the segment
  * \param repfnz First nonzero rows
- * \param glu Global LU data. 
- * 
- * 
+ * \param glu Global LU data.
+ *
+ *
  */
 template <typename Scalar, typename StorageIndex>
-void SparseLUImpl<Scalar,StorageIndex>::panel_bmod(const Index m, const Index w, const Index jcol, 
-                                            const Index nseg, ScalarVector& dense, ScalarVector& tempv,
-                                            IndexVector& segrep, IndexVector& repfnz, GlobalLU_t& glu)
-{
-  
-  Index ksub,jj,nextl_col; 
-  Index fsupc, nsupc, nsupr, nrow; 
-  Index krep, kfnz; 
-  Index lptr; // points to the row subscripts of a supernode 
-  Index luptr; // ...
-  Index segsize,no_zeros ; 
+void SparseLUImpl<Scalar, StorageIndex>::panel_bmod(const Index m, const Index w, const Index jcol, const Index nseg,
+                                                    ScalarVector& dense, ScalarVector& tempv, IndexVector& segrep,
+                                                    IndexVector& repfnz, GlobalLU_t& glu) {
+  Index ksub, jj, nextl_col;
+  Index fsupc, nsupc, nsupr, nrow;
+  Index krep, kfnz;
+  Index lptr;   // points to the row subscripts of a supernode
+  Index luptr;  // ...
+  Index segsize, no_zeros;
   // For each nonz supernode segment of U[*,j] in topological order
-  Index k = nseg - 1; 
+  Index k = nseg - 1;
   const Index PacketSize = internal::packet_traits<Scalar>::size;
-  
-  for (ksub = 0; ksub < nseg; ksub++)
-  { // For each updating supernode
+
+  for (ksub = 0; ksub < nseg; ksub++) {  // For each updating supernode
     /* krep = representative of current k-th supernode
      * fsupc =  first supernodal column
      * nsupc = number of columns in a supernode
      * nsupr = number of rows in a supernode
      */
-    krep = segrep(k); k--; 
-    fsupc = glu.xsup(glu.supno(krep)); 
-    nsupc = krep - fsupc + 1; 
-    nsupr = glu.xlsub(fsupc+1) - glu.xlsub(fsupc); 
-    nrow = nsupr - nsupc; 
-    lptr = glu.xlsub(fsupc); 
-    
+    krep = segrep(k);
+    k--;
+    fsupc = glu.xsup(glu.supno(krep));
+    nsupc = krep - fsupc + 1;
+    nsupr = glu.xlsub(fsupc + 1) - glu.xlsub(fsupc);
+    nrow = nsupr - nsupc;
+    lptr = glu.xlsub(fsupc);
+
     // loop over the panel columns to detect the actual number of columns and rows
     Index u_rows = 0;
     Index u_cols = 0;
-    for (jj = jcol; jj < jcol + w; jj++)
-    {
-      nextl_col = (jj-jcol) * m; 
-      VectorBlock<IndexVector> repfnz_col(repfnz, nextl_col, m); // First nonzero column index for each row
-      
-      kfnz = repfnz_col(krep); 
-      if ( kfnz == emptyIdxLU ) 
-        continue; // skip any zero segment
-      
+    for (jj = jcol; jj < jcol + w; jj++) {
+      nextl_col = (jj - jcol) * m;
+      VectorBlock<IndexVector> repfnz_col(repfnz, nextl_col, m);  // First nonzero column index for each row
+
+      kfnz = repfnz_col(krep);
+      if (kfnz == emptyIdxLU) continue;  // skip any zero segment
+
       segsize = krep - kfnz + 1;
       u_cols++;
-      u_rows = (std::max)(segsize,u_rows);
+      u_rows = (std::max)(segsize, u_rows);
     }
-    
-    if(nsupc >= 2)
-    { 
+
+    if (nsupc >= 2) {
       Index ldu = internal::first_multiple<Index>(u_rows, PacketSize);
-      Map<ScalarMatrix, Aligned,  OuterStride<> > U(tempv.data(), u_rows, u_cols, OuterStride<>(ldu));
-      
+      Map<ScalarMatrix, Aligned, OuterStride<> > U(tempv.data(), u_rows, u_cols, OuterStride<>(ldu));
+
       // gather U
       Index u_col = 0;
-      for (jj = jcol; jj < jcol + w; jj++)
-      {
-        nextl_col = (jj-jcol) * m; 
-        VectorBlock<IndexVector> repfnz_col(repfnz, nextl_col, m); // First nonzero column index for each row
-        VectorBlock<ScalarVector> dense_col(dense, nextl_col, m); // Scatter/gather entire matrix column from/to here
-        
-        kfnz = repfnz_col(krep); 
-        if ( kfnz == emptyIdxLU ) 
-          continue; // skip any zero segment
-        
+      for (jj = jcol; jj < jcol + w; jj++) {
+        nextl_col = (jj - jcol) * m;
+        VectorBlock<IndexVector> repfnz_col(repfnz, nextl_col, m);  // First nonzero column index for each row
+        VectorBlock<ScalarVector> dense_col(dense, nextl_col, m);   // Scatter/gather entire matrix column from/to here
+
+        kfnz = repfnz_col(krep);
+        if (kfnz == emptyIdxLU) continue;  // skip any zero segment
+
         segsize = krep - kfnz + 1;
-        luptr = glu.xlusup(fsupc);    
-        no_zeros = kfnz - fsupc; 
-        
+        luptr = glu.xlusup(fsupc);
+        no_zeros = kfnz - fsupc;
+
         Index isub = lptr + no_zeros;
-        Index off = u_rows-segsize;
-        for (Index i = 0; i < off; i++) U(i,u_col) = 0;
-        for (Index i = 0; i < segsize; i++)
-        {
-          Index irow = glu.lsub(isub); 
-          U(i+off,u_col) = dense_col(irow); 
-          ++isub; 
+        Index off = u_rows - segsize;
+        for (Index i = 0; i < off; i++) U(i, u_col) = 0;
+        for (Index i = 0; i < segsize; i++) {
+          Index irow = glu.lsub(isub);
+          U(i + off, u_col) = dense_col(irow);
+          ++isub;
         }
         u_col++;
       }
       // solve U = A^-1 U
       luptr = glu.xlusup(fsupc);
-      Index lda = glu.xlusup(fsupc+1) - glu.xlusup(fsupc);
+      Index lda = glu.xlusup(fsupc + 1) - glu.xlusup(fsupc);
       no_zeros = (krep - u_rows + 1) - fsupc;
       luptr += lda * no_zeros + no_zeros;
-      MappedMatrixBlock A(glu.lusup.data()+luptr, u_rows, u_rows, OuterStride<>(lda) );
+      MappedMatrixBlock A(glu.lusup.data() + luptr, u_rows, u_rows, OuterStride<>(lda));
       U = A.template triangularView<UnitLower>().solve(U);
-      
+
       // update
       luptr += u_rows;
-      MappedMatrixBlock B(glu.lusup.data()+luptr, nrow, u_rows, OuterStride<>(lda) );
-      eigen_assert(tempv.size()>w*ldu + nrow*w + 1);
-      
+      MappedMatrixBlock B(glu.lusup.data() + luptr, nrow, u_rows, OuterStride<>(lda));
+      eigen_assert(tempv.size() > w * ldu + nrow * w + 1);
+
       Index ldl = internal::first_multiple<Index>(nrow, PacketSize);
-      Index offset = (PacketSize-internal::first_default_aligned(B.data(), PacketSize)) % PacketSize;
-      MappedMatrixBlock L(tempv.data()+w*ldu+offset, nrow, u_cols, OuterStride<>(ldl));
-      
+      Index offset = (PacketSize - internal::first_default_aligned(B.data(), PacketSize)) % PacketSize;
+      MappedMatrixBlock L(tempv.data() + w * ldu + offset, nrow, u_cols, OuterStride<>(ldl));
+
       L.noalias() = B * U;
-      
+
       // scatter U and L
       u_col = 0;
-      for (jj = jcol; jj < jcol + w; jj++)
-      {
-        nextl_col = (jj-jcol) * m; 
-        VectorBlock<IndexVector> repfnz_col(repfnz, nextl_col, m); // First nonzero column index for each row
-        VectorBlock<ScalarVector> dense_col(dense, nextl_col, m); // Scatter/gather entire matrix column from/to here
-        
-        kfnz = repfnz_col(krep); 
-        if ( kfnz == emptyIdxLU ) 
-          continue; // skip any zero segment
-        
+      for (jj = jcol; jj < jcol + w; jj++) {
+        nextl_col = (jj - jcol) * m;
+        VectorBlock<IndexVector> repfnz_col(repfnz, nextl_col, m);  // First nonzero column index for each row
+        VectorBlock<ScalarVector> dense_col(dense, nextl_col, m);   // Scatter/gather entire matrix column from/to here
+
+        kfnz = repfnz_col(krep);
+        if (kfnz == emptyIdxLU) continue;  // skip any zero segment
+
         segsize = krep - kfnz + 1;
-        no_zeros = kfnz - fsupc; 
+        no_zeros = kfnz - fsupc;
         Index isub = lptr + no_zeros;
-        
-        Index off = u_rows-segsize;
-        for (Index i = 0; i < segsize; i++)
-        {
-          Index irow = glu.lsub(isub++); 
-          dense_col(irow) = U.coeff(i+off,u_col);
-          U.coeffRef(i+off,u_col) = 0;
+
+        Index off = u_rows - segsize;
+        for (Index i = 0; i < segsize; i++) {
+          Index irow = glu.lsub(isub++);
+          dense_col(irow) = U.coeff(i + off, u_col);
+          U.coeffRef(i + off, u_col) = 0;
         }
-        
+
         // Scatter l into SPA dense[]
-        for (Index i = 0; i < nrow; i++)
-        {
-          Index irow = glu.lsub(isub++); 
-          dense_col(irow) -= L.coeff(i,u_col);
-          L.coeffRef(i,u_col) = 0;
+        for (Index i = 0; i < nrow; i++) {
+          Index irow = glu.lsub(isub++);
+          dense_col(irow) -= L.coeff(i, u_col);
+          L.coeffRef(i, u_col) = 0;
         }
         u_col++;
       }
-    }
-    else // level 2 only
+    } else  // level 2 only
     {
       // Sequence through each column in the panel
-      for (jj = jcol; jj < jcol + w; jj++)
-      {
-        nextl_col = (jj-jcol) * m; 
-        VectorBlock<IndexVector> repfnz_col(repfnz, nextl_col, m); // First nonzero column index for each row
-        VectorBlock<ScalarVector> dense_col(dense, nextl_col, m); // Scatter/gather entire matrix column from/to here
-        
-        kfnz = repfnz_col(krep); 
-        if ( kfnz == emptyIdxLU ) 
-          continue; // skip any zero segment
-        
+      for (jj = jcol; jj < jcol + w; jj++) {
+        nextl_col = (jj - jcol) * m;
+        VectorBlock<IndexVector> repfnz_col(repfnz, nextl_col, m);  // First nonzero column index for each row
+        VectorBlock<ScalarVector> dense_col(dense, nextl_col, m);   // Scatter/gather entire matrix column from/to here
+
+        kfnz = repfnz_col(krep);
+        if (kfnz == emptyIdxLU) continue;  // skip any zero segment
+
         segsize = krep - kfnz + 1;
         luptr = glu.xlusup(fsupc);
-        
-        Index lda = glu.xlusup(fsupc+1)-glu.xlusup(fsupc);// nsupr
-        
-        // Perform a trianglar solve and block update, 
+
+        Index lda = glu.xlusup(fsupc + 1) - glu.xlusup(fsupc);  // nsupr
+
+        // Perform a trianglar solve and block update,
         // then scatter the result of sup-col update to dense[]
-        no_zeros = kfnz - fsupc; 
-              if(segsize==1)  LU_kernel_bmod<1>::run(segsize, dense_col, tempv, glu.lusup, luptr, lda, nrow, glu.lsub, lptr, no_zeros);
-        else  if(segsize==2)  LU_kernel_bmod<2>::run(segsize, dense_col, tempv, glu.lusup, luptr, lda, nrow, glu.lsub, lptr, no_zeros);
-        else  if(segsize==3)  LU_kernel_bmod<3>::run(segsize, dense_col, tempv, glu.lusup, luptr, lda, nrow, glu.lsub, lptr, no_zeros);
-        else                  LU_kernel_bmod<Dynamic>::run(segsize, dense_col, tempv, glu.lusup, luptr, lda, nrow, glu.lsub, lptr, no_zeros); 
-      } // End for each column in the panel 
+        no_zeros = kfnz - fsupc;
+        if (segsize == 1)
+          LU_kernel_bmod<1>::run(segsize, dense_col, tempv, glu.lusup, luptr, lda, nrow, glu.lsub, lptr, no_zeros);
+        else if (segsize == 2)
+          LU_kernel_bmod<2>::run(segsize, dense_col, tempv, glu.lusup, luptr, lda, nrow, glu.lsub, lptr, no_zeros);
+        else if (segsize == 3)
+          LU_kernel_bmod<3>::run(segsize, dense_col, tempv, glu.lusup, luptr, lda, nrow, glu.lsub, lptr, no_zeros);
+        else
+          LU_kernel_bmod<Dynamic>::run(segsize, dense_col, tempv, glu.lusup, luptr, lda, nrow, glu.lsub, lptr,
+                                       no_zeros);
+      }  // End for each column in the panel
     }
-    
-  } // End for each updating supernode
-} // end panel bmod
 
-} // end namespace internal
+  }  // End for each updating supernode
+}  // end panel bmod
 
-} // end namespace Eigen
+}  // end namespace internal
 
-#endif // SPARSELU_PANEL_BMOD_H
+}  // end namespace Eigen
+
+#endif  // SPARSELU_PANEL_BMOD_H
diff --git a/Eigen/src/SparseLU/SparseLU_panel_dfs.h b/Eigen/src/SparseLU/SparseLU_panel_dfs.h
index 5a3fd10..df31548 100644
--- a/Eigen/src/SparseLU/SparseLU_panel_dfs.h
+++ b/Eigen/src/SparseLU/SparseLU_panel_dfs.h
@@ -7,10 +7,10 @@
 // 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/.
 
-/* 
- 
- * NOTE: This file is the modified version of [s,d,c,z]panel_dfs.c file in SuperLU 
- 
+/*
+
+ * NOTE: This file is the modified version of [s,d,c,z]panel_dfs.c file in SuperLU
+
  * -- SuperLU routine (version 2.0) --
  * Univ. of California Berkeley, Xerox Palo Alto Research Center,
  * and Lawrence Berkeley National Lab.
@@ -36,19 +36,14 @@
 namespace Eigen {
 
 namespace internal {
-  
-template<typename IndexVector>
-struct panel_dfs_traits
-{
+
+template <typename IndexVector>
+struct panel_dfs_traits {
   typedef typename IndexVector::Scalar StorageIndex;
-  panel_dfs_traits(Index jcol, StorageIndex* marker)
-    : m_jcol(jcol), m_marker(marker)
-  {}
-  bool update_segrep(Index krep, StorageIndex jj)
-  {
-    if(m_marker[krep]<m_jcol)
-    {
-      m_marker[krep] = jj; 
+  panel_dfs_traits(Index jcol, StorageIndex* marker) : m_jcol(jcol), m_marker(marker) {}
+  bool update_segrep(Index krep, StorageIndex jj) {
+    if (m_marker[krep] < m_jcol) {
+      m_marker[krep] = jj;
       return true;
     }
     return false;
@@ -59,147 +54,127 @@
   StorageIndex* m_marker;
 };
 
-
 template <typename Scalar, typename StorageIndex>
 template <typename Traits>
-void SparseLUImpl<Scalar,StorageIndex>::dfs_kernel(const StorageIndex jj, IndexVector& perm_r,
-                   Index& nseg, IndexVector& panel_lsub, IndexVector& segrep,
-                   Ref<IndexVector> repfnz_col, IndexVector& xprune, Ref<IndexVector> marker, IndexVector& parent,
-                   IndexVector& xplore, GlobalLU_t& glu,
-                   Index& nextl_col, Index krow, Traits& traits
-                  )
-{
-  
+void SparseLUImpl<Scalar, StorageIndex>::dfs_kernel(const StorageIndex jj, IndexVector& perm_r, Index& nseg,
+                                                    IndexVector& panel_lsub, IndexVector& segrep,
+                                                    Ref<IndexVector> repfnz_col, IndexVector& xprune,
+                                                    Ref<IndexVector> marker, IndexVector& parent, IndexVector& xplore,
+                                                    GlobalLU_t& glu, Index& nextl_col, Index krow, Traits& traits) {
   StorageIndex kmark = marker(krow);
-      
+
   // For each unmarked krow of jj
-  marker(krow) = jj; 
-  StorageIndex kperm = perm_r(krow); 
-  if (kperm == emptyIdxLU ) {
+  marker(krow) = jj;
+  StorageIndex kperm = perm_r(krow);
+  if (kperm == emptyIdxLU) {
     // krow is in L : place it in structure of L(*, jj)
     panel_lsub(nextl_col++) = StorageIndex(krow);  // krow is indexed into A
-    
+
     traits.mem_expand(panel_lsub, nextl_col, kmark);
-  }
-  else 
-  {
+  } else {
     // krow is in U : if its supernode-representative krep
     // has been explored, update repfnz(*)
     // krep = supernode representative of the current row
-    StorageIndex krep = glu.xsup(glu.supno(kperm)+1) - 1; 
+    StorageIndex krep = glu.xsup(glu.supno(kperm) + 1) - 1;
     // First nonzero element in the current column:
-    StorageIndex myfnz = repfnz_col(krep); 
-    
-    if (myfnz != emptyIdxLU )
-    {
+    StorageIndex myfnz = repfnz_col(krep);
+
+    if (myfnz != emptyIdxLU) {
       // Representative visited before
-      if (myfnz > kperm ) repfnz_col(krep) = kperm; 
-      
-    }
-    else 
-    {
+      if (myfnz > kperm) repfnz_col(krep) = kperm;
+
+    } else {
       // Otherwise, perform dfs starting at krep
-      StorageIndex oldrep = emptyIdxLU; 
-      parent(krep) = oldrep; 
-      repfnz_col(krep) = kperm; 
-      StorageIndex xdfs =  glu.xlsub(krep); 
-      Index maxdfs = xprune(krep); 
-      
+      StorageIndex oldrep = emptyIdxLU;
+      parent(krep) = oldrep;
+      repfnz_col(krep) = kperm;
+      StorageIndex xdfs = glu.xlsub(krep);
+      Index maxdfs = xprune(krep);
+
       StorageIndex kpar;
-      do 
-      {
+      do {
         // For each unmarked kchild of krep
-        while (xdfs < maxdfs) 
-        {
-          StorageIndex kchild = glu.lsub(xdfs); 
-          xdfs++; 
-          StorageIndex chmark = marker(kchild); 
-          
-          if (chmark != jj ) 
-          {
-            marker(kchild) = jj; 
-            StorageIndex chperm = perm_r(kchild); 
-            
-            if (chperm == emptyIdxLU) 
-            {
+        while (xdfs < maxdfs) {
+          StorageIndex kchild = glu.lsub(xdfs);
+          xdfs++;
+          StorageIndex chmark = marker(kchild);
+
+          if (chmark != jj) {
+            marker(kchild) = jj;
+            StorageIndex chperm = perm_r(kchild);
+
+            if (chperm == emptyIdxLU) {
               // case kchild is in L: place it in L(*, j)
               panel_lsub(nextl_col++) = kchild;
               traits.mem_expand(panel_lsub, nextl_col, chmark);
-            }
-            else
-            {
+            } else {
               // case kchild is in U :
-              // chrep = its supernode-rep. If its rep has been explored, 
+              // chrep = its supernode-rep. If its rep has been explored,
               // update its repfnz(*)
-              StorageIndex chrep = glu.xsup(glu.supno(chperm)+1) - 1; 
-              myfnz = repfnz_col(chrep); 
-              
-              if (myfnz != emptyIdxLU) 
-              { // Visited before 
-                if (myfnz > chperm) 
-                  repfnz_col(chrep) = chperm; 
-              }
-              else 
-              { // Cont. dfs at snode-rep of kchild
-                xplore(krep) = xdfs; 
-                oldrep = krep; 
-                krep = chrep; // Go deeper down G(L)
-                parent(krep) = oldrep; 
-                repfnz_col(krep) = chperm; 
-                xdfs = glu.xlsub(krep); 
-                maxdfs = xprune(krep); 
-                
-              } // end if myfnz != -1
-            } // end if chperm == -1 
-                
-          } // end if chmark !=jj
-        } // end while xdfs < maxdfs
-        
+              StorageIndex chrep = glu.xsup(glu.supno(chperm) + 1) - 1;
+              myfnz = repfnz_col(chrep);
+
+              if (myfnz != emptyIdxLU) {  // Visited before
+                if (myfnz > chperm) repfnz_col(chrep) = chperm;
+              } else {  // Cont. dfs at snode-rep of kchild
+                xplore(krep) = xdfs;
+                oldrep = krep;
+                krep = chrep;  // Go deeper down G(L)
+                parent(krep) = oldrep;
+                repfnz_col(krep) = chperm;
+                xdfs = glu.xlsub(krep);
+                maxdfs = xprune(krep);
+
+              }  // end if myfnz != -1
+            }    // end if chperm == -1
+
+          }  // end if chmark !=jj
+        }    // end while xdfs < maxdfs
+
         // krow has no more unexplored nbrs :
-        //    Place snode-rep krep in postorder DFS, if this 
-        //    segment is seen for the first time. (Note that 
+        //    Place snode-rep krep in postorder DFS, if this
+        //    segment is seen for the first time. (Note that
         //    "repfnz(krep)" may change later.)
         //    Baktrack dfs to its parent
-        if(traits.update_segrep(krep,jj))
-        //if (marker1(krep) < jcol )
+        if (traits.update_segrep(krep, jj))
+        // if (marker1(krep) < jcol )
         {
-          segrep(nseg) = krep; 
-          ++nseg; 
-          //marker1(krep) = jj; 
+          segrep(nseg) = krep;
+          ++nseg;
+          // marker1(krep) = jj;
         }
-        
-        kpar = parent(krep); // Pop recursion, mimic recursion 
-        if (kpar == emptyIdxLU) 
-          break; // dfs done 
-        krep = kpar; 
-        xdfs = xplore(krep); 
-        maxdfs = xprune(krep); 
 
-      } while (kpar != emptyIdxLU); // Do until empty stack 
-      
-    } // end if (myfnz = -1)
+        kpar = parent(krep);            // Pop recursion, mimic recursion
+        if (kpar == emptyIdxLU) break;  // dfs done
+        krep = kpar;
+        xdfs = xplore(krep);
+        maxdfs = xprune(krep);
 
-  } // end if (kperm == -1)   
+      } while (kpar != emptyIdxLU);  // Do until empty stack
+
+    }  // end if (myfnz = -1)
+
+  }  // end if (kperm == -1)
 }
 
 /**
  * \brief Performs a symbolic factorization on a panel of columns [jcol, jcol+w)
- * 
+ *
  * A supernode representative is the last column of a supernode.
  * The nonzeros in U[*,j] are segments that end at supernodes representatives
- * 
- * The routine returns a list of the supernodal representatives 
- * in topological order of the dfs that generates them. This list is 
- * a superset of the topological order of each individual column within 
+ *
+ * The routine returns a list of the supernodal representatives
+ * in topological order of the dfs that generates them. This list is
+ * a superset of the topological order of each individual column within
  * the panel.
- * The location of the first nonzero in each supernodal segment 
- * (supernodal entry location) is also returned. Each column has 
- * a separate list for this purpose. 
- * 
+ * The location of the first nonzero in each supernodal segment
+ * (supernodal entry location) is also returned. Each column has
+ * a separate list for this purpose.
+ *
  * Two markers arrays are used for dfs :
  *    marker[i] == jj, if i was visited during dfs of current column jj;
- *    marker1[i] >= jcol, if i was visited by earlier columns in this panel; 
- * 
+ *    marker1[i] >= jcol, if i was visited by earlier columns in this panel;
+ *
  * \param[in] m number of rows in the matrix
  * \param[in] w Panel size
  * \param[in] jcol Starting  column of the panel
@@ -207,7 +182,7 @@
  * \param[in] perm_r Row permutation
  * \param[out] nseg Number of U segments
  * \param[out] dense Accumulate the column vectors of the panel
- * \param[out] panel_lsub Subscripts of the row in the panel 
+ * \param[out] panel_lsub Subscripts of the row in the panel
  * \param[out] segrep Segment representative i.e first nonzero row of each segment
  * \param[out] repfnz First nonzero location in each row
  * \param[out] xprune The pruned elimination tree
@@ -215,47 +190,46 @@
  * \param  parent The elimination tree
  * \param xplore work vector
  * \param glu The global data structure
- * 
+ *
  */
 
 template <typename Scalar, typename StorageIndex>
-void SparseLUImpl<Scalar,StorageIndex>::panel_dfs(const Index m, const Index w, const Index jcol, MatrixType& A, IndexVector& perm_r, Index& nseg, ScalarVector& dense, IndexVector& panel_lsub, IndexVector& segrep, IndexVector& repfnz, IndexVector& xprune, IndexVector& marker, IndexVector& parent, IndexVector& xplore, GlobalLU_t& glu)
-{
-  Index nextl_col; // Next available position in panel_lsub[*,jj] 
-  
-  // Initialize pointers 
-  VectorBlock<IndexVector> marker1(marker, m, m); 
-  nseg = 0; 
-  
+void SparseLUImpl<Scalar, StorageIndex>::panel_dfs(const Index m, const Index w, const Index jcol, MatrixType& A,
+                                                   IndexVector& perm_r, Index& nseg, ScalarVector& dense,
+                                                   IndexVector& panel_lsub, IndexVector& segrep, IndexVector& repfnz,
+                                                   IndexVector& xprune, IndexVector& marker, IndexVector& parent,
+                                                   IndexVector& xplore, GlobalLU_t& glu) {
+  Index nextl_col;  // Next available position in panel_lsub[*,jj]
+
+  // Initialize pointers
+  VectorBlock<IndexVector> marker1(marker, m, m);
+  nseg = 0;
+
   panel_dfs_traits<IndexVector> traits(jcol, marker1.data());
-  
-  // For each column in the panel 
-  for (StorageIndex jj = StorageIndex(jcol); jj < jcol + w; jj++) 
-  {
-    nextl_col = (jj - jcol) * m; 
-    
-    VectorBlock<IndexVector> repfnz_col(repfnz, nextl_col, m); // First nonzero location in each row
-    VectorBlock<ScalarVector> dense_col(dense,nextl_col, m); // Accumulate a column vector here
-    
-    
+
+  // For each column in the panel
+  for (StorageIndex jj = StorageIndex(jcol); jj < jcol + w; jj++) {
+    nextl_col = (jj - jcol) * m;
+
+    VectorBlock<IndexVector> repfnz_col(repfnz, nextl_col, m);  // First nonzero location in each row
+    VectorBlock<ScalarVector> dense_col(dense, nextl_col, m);   // Accumulate a column vector here
+
     // For each nnz in A[*, jj] do depth first search
-    for (typename MatrixType::InnerIterator it(A, jj); it; ++it)
-    {
-      Index krow = it.row(); 
+    for (typename MatrixType::InnerIterator it(A, jj); it; ++it) {
+      Index krow = it.row();
       dense_col(krow) = it.value();
-      
-      StorageIndex kmark = marker(krow); 
-      if (kmark == jj) 
-        continue; // krow visited before, go to the next nonzero
-      
-      dfs_kernel(jj, perm_r, nseg, panel_lsub, segrep, repfnz_col, xprune, marker, parent,
-                   xplore, glu, nextl_col, krow, traits);
-    }// end for nonzeros in column jj
-    
-  } // end for column jj
+
+      StorageIndex kmark = marker(krow);
+      if (kmark == jj) continue;  // krow visited before, go to the next nonzero
+
+      dfs_kernel(jj, perm_r, nseg, panel_lsub, segrep, repfnz_col, xprune, marker, parent, xplore, glu, nextl_col, krow,
+                 traits);
+    }  // end for nonzeros in column jj
+
+  }  // end for column jj
 }
 
-} // end namespace internal
-} // end namespace Eigen
+}  // end namespace internal
+}  // end namespace Eigen
 
-#endif // SPARSELU_PANEL_DFS_H
+#endif  // SPARSELU_PANEL_DFS_H
diff --git a/Eigen/src/SparseLU/SparseLU_pivotL.h b/Eigen/src/SparseLU/SparseLU_pivotL.h
index 79510bc..ada511e 100644
--- a/Eigen/src/SparseLU/SparseLU_pivotL.h
+++ b/Eigen/src/SparseLU/SparseLU_pivotL.h
@@ -7,10 +7,10 @@
 // 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/.
 
-/* 
- 
- * NOTE: This file is the modified version of xpivotL.c file in SuperLU 
- 
+/*
+
+ * NOTE: This file is the modified version of xpivotL.c file in SuperLU
+
  * -- SuperLU routine (version 3.0) --
  * Univ. of California Berkeley, Xerox Palo Alto Research Center,
  * and Lawrence Berkeley National Lab.
@@ -35,10 +35,10 @@
 
 namespace Eigen {
 namespace internal {
-  
+
 /**
  * \brief Performs the numerical pivotin on the current column of L, and the CDIV operation.
- * 
+ *
  * Pivot policy :
  * (1) Compute thresh = u * max_(i>=j) abs(A_ij);
  * (2) IF user specifies pivot row k and abs(A_kj) >= thresh THEN
@@ -47,64 +47,63 @@
  *           pivot row = j;
  *       ELSE
  *           pivot row = m;
- * 
+ *
  *   Note: If you absolutely want to use a given pivot order, then set u=0.0.
- * 
+ *
  * \param jcol The current column of L
  * \param diagpivotthresh diagonal pivoting threshold
  * \param[in,out] perm_r Row permutation (threshold pivoting)
  * \param[in] iperm_c column permutation - used to finf diagonal of Pc*A*Pc'
  * \param[out] pivrow  The pivot row
  * \param glu Global LU data
- * \return 0 if success, i > 0 if U(i,i) is exactly zero 
- * 
+ * \return 0 if success, i > 0 if U(i,i) is exactly zero
+ *
  */
 template <typename Scalar, typename StorageIndex>
-Index SparseLUImpl<Scalar,StorageIndex>::pivotL(const Index jcol, const RealScalar& diagpivotthresh, IndexVector& perm_r, IndexVector& iperm_c, Index& pivrow, GlobalLU_t& glu)
-{
-  
-  Index fsupc = (glu.xsup)((glu.supno)(jcol)); // First column in the supernode containing the column jcol
-  Index nsupc = jcol - fsupc; // Number of columns in the supernode portion, excluding jcol; nsupc >=0
-  Index lptr = glu.xlsub(fsupc); // pointer to the starting location of the row subscripts for this supernode portion
-  Index nsupr = glu.xlsub(fsupc+1) - lptr; // Number of rows in the supernode
-  Index lda = glu.xlusup(fsupc+1) - glu.xlusup(fsupc); // leading dimension
-  Scalar* lu_sup_ptr = &(glu.lusup.data()[glu.xlusup(fsupc)]); // Start of the current supernode
-  Scalar* lu_col_ptr = &(glu.lusup.data()[glu.xlusup(jcol)]); // Start of jcol in the supernode
-  StorageIndex* lsub_ptr = &(glu.lsub.data()[lptr]); // Start of row indices of the supernode
-  
-  // Determine the largest abs numerical value for partial pivoting 
-  Index diagind = iperm_c(jcol); // diagonal index 
+Index SparseLUImpl<Scalar, StorageIndex>::pivotL(const Index jcol, const RealScalar& diagpivotthresh,
+                                                 IndexVector& perm_r, IndexVector& iperm_c, Index& pivrow,
+                                                 GlobalLU_t& glu) {
+  Index fsupc = (glu.xsup)((glu.supno)(jcol));  // First column in the supernode containing the column jcol
+  Index nsupc = jcol - fsupc;                   // Number of columns in the supernode portion, excluding jcol; nsupc >=0
+  Index lptr = glu.xlsub(fsupc);  // pointer to the starting location of the row subscripts for this supernode portion
+  Index nsupr = glu.xlsub(fsupc + 1) - lptr;                    // Number of rows in the supernode
+  Index lda = glu.xlusup(fsupc + 1) - glu.xlusup(fsupc);        // leading dimension
+  Scalar* lu_sup_ptr = &(glu.lusup.data()[glu.xlusup(fsupc)]);  // Start of the current supernode
+  Scalar* lu_col_ptr = &(glu.lusup.data()[glu.xlusup(jcol)]);   // Start of jcol in the supernode
+  StorageIndex* lsub_ptr = &(glu.lsub.data()[lptr]);            // Start of row indices of the supernode
+
+  // Determine the largest abs numerical value for partial pivoting
+  Index diagind = iperm_c(jcol);  // diagonal index
   RealScalar pivmax(-1.0);
-  Index pivptr = nsupc; 
-  Index diag = emptyIdxLU; 
+  Index pivptr = nsupc;
+  Index diag = emptyIdxLU;
   RealScalar rtemp;
-  Index isub, icol, itemp, k; 
+  Index isub, icol, itemp, k;
   for (isub = nsupc; isub < nsupr; ++isub) {
     using std::abs;
     rtemp = abs(lu_col_ptr[isub]);
     if (rtemp > pivmax) {
-      pivmax = rtemp; 
+      pivmax = rtemp;
       pivptr = isub;
-    } 
+    }
     if (lsub_ptr[isub] == diagind) diag = isub;
   }
-  
+
   // Test for singularity
-  if ( pivmax <= RealScalar(0.0) ) {
+  if (pivmax <= RealScalar(0.0)) {
     // if pivmax == -1, the column is structurally empty, otherwise it is only numerically zero
     pivrow = pivmax < RealScalar(0.0) ? diagind : lsub_ptr[pivptr];
     perm_r(pivrow) = StorageIndex(jcol);
-    return (jcol+1);
+    return (jcol + 1);
   }
-  
-  RealScalar thresh = diagpivotthresh * pivmax; 
-  
-  // Choose appropriate pivotal element 
-  
+
+  RealScalar thresh = diagpivotthresh * pivmax;
+
+  // Choose appropriate pivotal element
+
   {
     // Test if the diagonal element can be used as a pivot (given the threshold value)
-    if (diag >= 0 ) 
-    {
+    if (diag >= 0) {
       // Diagonal element exists
       using std::abs;
       rtemp = abs(lu_col_ptr[diag]);
@@ -112,29 +111,26 @@
     }
     pivrow = lsub_ptr[pivptr];
   }
-  
+
   // Record pivot row
   perm_r(pivrow) = StorageIndex(jcol);
   // Interchange row subscripts
-  if (pivptr != nsupc )
-  {
-    std::swap( lsub_ptr[pivptr], lsub_ptr[nsupc] );
+  if (pivptr != nsupc) {
+    std::swap(lsub_ptr[pivptr], lsub_ptr[nsupc]);
     // Interchange numerical values as well, for the two rows in the whole snode
     // such that L is indexed the same way as A
-    for (icol = 0; icol <= nsupc; icol++)
-    {
-      itemp = pivptr + icol * lda; 
+    for (icol = 0; icol <= nsupc; icol++) {
+      itemp = pivptr + icol * lda;
       std::swap(lu_sup_ptr[itemp], lu_sup_ptr[nsupc + icol * lda]);
     }
   }
   // cdiv operations
   Scalar temp = Scalar(1.0) / lu_col_ptr[nsupc];
-  for (k = nsupc+1; k < nsupr; k++)
-    lu_col_ptr[k] *= temp; 
+  for (k = nsupc + 1; k < nsupr; k++) lu_col_ptr[k] *= temp;
   return 0;
 }
 
-} // end namespace internal
-} // end namespace Eigen
+}  // end namespace internal
+}  // end namespace Eigen
 
-#endif // SPARSELU_PIVOTL_H
+#endif  // SPARSELU_PIVOTL_H
diff --git a/Eigen/src/SparseLU/SparseLU_pruneL.h b/Eigen/src/SparseLU/SparseLU_pruneL.h
index c184274..4f51d59 100644
--- a/Eigen/src/SparseLU/SparseLU_pruneL.h
+++ b/Eigen/src/SparseLU/SparseLU_pruneL.h
@@ -7,10 +7,10 @@
 // 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/.
 
-/* 
- 
- * NOTE: This file is the modified version of [s,d,c,z]pruneL.c file in SuperLU 
- 
+/*
+
+ * NOTE: This file is the modified version of [s,d,c,z]pruneL.c file in SuperLU
+
  * -- SuperLU routine (version 2.0) --
  * Univ. of California Berkeley, Xerox Palo Alto Research Center,
  * and Lawrence Berkeley National Lab.
@@ -40,100 +40,91 @@
  * \brief Prunes the L-structure.
  *
  * It prunes the L-structure  of supernodes whose L-structure contains the current pivot row "pivrow"
- * 
- * 
+ *
+ *
  * \param jcol The current column of L
  * \param[in] perm_r Row permutation
  * \param[out] pivrow  The pivot row
  * \param nseg Number of segments
- * \param segrep 
+ * \param segrep
  * \param repfnz
- * \param[out] xprune 
+ * \param[out] xprune
  * \param glu Global LU data
- * 
+ *
  */
 template <typename Scalar, typename StorageIndex>
-void SparseLUImpl<Scalar,StorageIndex>::pruneL(const Index jcol, const IndexVector& perm_r, const Index pivrow, const Index nseg,
-                                               const IndexVector& segrep, BlockIndexVector repfnz, IndexVector& xprune, GlobalLU_t& glu)
-{
+void SparseLUImpl<Scalar, StorageIndex>::pruneL(const Index jcol, const IndexVector& perm_r, const Index pivrow,
+                                                const Index nseg, const IndexVector& segrep, BlockIndexVector repfnz,
+                                                IndexVector& xprune, GlobalLU_t& glu) {
   // For each supernode-rep irep in U(*,j]
-  Index jsupno = glu.supno(jcol); 
-  Index i,irep,irep1; 
-  bool movnum, do_prune = false; 
-  Index kmin = 0, kmax = 0, minloc, maxloc,krow; 
-  for (i = 0; i < nseg; i++)
-  {
-    irep = segrep(i); 
-    irep1 = irep + 1; 
-    do_prune = false; 
-    
-    // Don't prune with a zero U-segment 
-    if (repfnz(irep) == emptyIdxLU) continue; 
-    
+  Index jsupno = glu.supno(jcol);
+  Index i, irep, irep1;
+  bool movnum, do_prune = false;
+  Index kmin = 0, kmax = 0, minloc, maxloc, krow;
+  for (i = 0; i < nseg; i++) {
+    irep = segrep(i);
+    irep1 = irep + 1;
+    do_prune = false;
+
+    // Don't prune with a zero U-segment
+    if (repfnz(irep) == emptyIdxLU) continue;
+
     // If a snode overlaps with the next panel, then the U-segment
-    // is fragmented into two parts -- irep and irep1. We should let 
-    // pruning occur at the rep-column in irep1s snode. 
-    if (glu.supno(irep) == glu.supno(irep1) ) continue; // don't prune 
-    
+    // is fragmented into two parts -- irep and irep1. We should let
+    // pruning occur at the rep-column in irep1s snode.
+    if (glu.supno(irep) == glu.supno(irep1)) continue;  // don't prune
+
     // If it has not been pruned & it has a nonz in row L(pivrow,i)
-    if (glu.supno(irep) != jsupno )
-    {
-      if ( xprune (irep) >= glu.xlsub(irep1) )
-      {
+    if (glu.supno(irep) != jsupno) {
+      if (xprune(irep) >= glu.xlsub(irep1)) {
         kmin = glu.xlsub(irep);
-        kmax = glu.xlsub(irep1) - 1; 
-        for (krow = kmin; krow <= kmax; krow++)
-        {
-          if (glu.lsub(krow) == pivrow) 
-          {
-            do_prune = true; 
-            break; 
+        kmax = glu.xlsub(irep1) - 1;
+        for (krow = kmin; krow <= kmax; krow++) {
+          if (glu.lsub(krow) == pivrow) {
+            do_prune = true;
+            break;
           }
         }
       }
-      
-      if (do_prune) 
-      {
+
+      if (do_prune) {
         // do a quicksort-type partition
         // movnum=true means that the num values have to be exchanged
-        movnum = false; 
-        if (irep == glu.xsup(glu.supno(irep)) ) // Snode of size 1 
-          movnum = true; 
-        
-        while (kmin <= kmax)
-        {
+        movnum = false;
+        if (irep == glu.xsup(glu.supno(irep)))  // Snode of size 1
+          movnum = true;
+
+        while (kmin <= kmax) {
           if (perm_r(glu.lsub(kmax)) == emptyIdxLU)
-            kmax--; 
-          else if ( perm_r(glu.lsub(kmin)) != emptyIdxLU)
+            kmax--;
+          else if (perm_r(glu.lsub(kmin)) != emptyIdxLU)
             kmin++;
-          else 
-          {
+          else {
             // kmin below pivrow (not yet pivoted), and kmax
             // above pivrow: interchange the two suscripts
-            std::swap(glu.lsub(kmin), glu.lsub(kmax)); 
-            
-            // If the supernode has only one column, then we 
+            std::swap(glu.lsub(kmin), glu.lsub(kmax));
+
+            // If the supernode has only one column, then we
             // only keep one set of subscripts. For any subscript
-            // intercnahge performed, similar interchange must be 
-            // done on the numerical values. 
-            if (movnum) 
-            {
-              minloc = glu.xlusup(irep) + ( kmin - glu.xlsub(irep) ); 
-              maxloc = glu.xlusup(irep) + ( kmax - glu.xlsub(irep) ); 
-              std::swap(glu.lusup(minloc), glu.lusup(maxloc)); 
+            // intercnahge performed, similar interchange must be
+            // done on the numerical values.
+            if (movnum) {
+              minloc = glu.xlusup(irep) + (kmin - glu.xlsub(irep));
+              maxloc = glu.xlusup(irep) + (kmax - glu.xlsub(irep));
+              std::swap(glu.lusup(minloc), glu.lusup(maxloc));
             }
             kmin++;
             kmax--;
           }
-        } // end while 
-        
-        xprune(irep) = StorageIndex(kmin);  //Pruning 
-      } // end if do_prune 
-    } // end pruning 
-  } // End for each U-segment
+        }  // end while
+
+        xprune(irep) = StorageIndex(kmin);  // Pruning
+      }                                     // end if do_prune
+    }                                       // end pruning
+  }                                         // End for each U-segment
 }
 
-} // end namespace internal
-} // end namespace Eigen
+}  // end namespace internal
+}  // end namespace Eigen
 
-#endif // SPARSELU_PRUNEL_H
+#endif  // SPARSELU_PRUNEL_H
diff --git a/Eigen/src/SparseLU/SparseLU_relax_snode.h b/Eigen/src/SparseLU/SparseLU_relax_snode.h
index 6153149..df3869e 100644
--- a/Eigen/src/SparseLU/SparseLU_relax_snode.h
+++ b/Eigen/src/SparseLU/SparseLU_relax_snode.h
@@ -34,53 +34,48 @@
 namespace Eigen {
 
 namespace internal {
- 
-/** 
+
+/**
  * \brief Identify the initial relaxed supernodes
- * 
- * This routine is applied to a column elimination tree. 
+ *
+ * This routine is applied to a column elimination tree.
  * It assumes that the matrix has been reordered according to the postorder of the etree
  * \param n  the number of columns
- * \param et elimination tree 
- * \param relax_columns Maximum number of columns allowed in a relaxed snode 
+ * \param et elimination tree
+ * \param relax_columns Maximum number of columns allowed in a relaxed snode
  * \param descendants Number of descendants of each node in the etree
  * \param relax_end last column in a supernode
  */
 template <typename Scalar, typename StorageIndex>
-void SparseLUImpl<Scalar,StorageIndex>::relax_snode (const Index n, IndexVector& et, const Index relax_columns, IndexVector& descendants, IndexVector& relax_end)
-{
-  
+void SparseLUImpl<Scalar, StorageIndex>::relax_snode(const Index n, IndexVector& et, const Index relax_columns,
+                                                     IndexVector& descendants, IndexVector& relax_end) {
   // compute the number of descendants of each node in the etree
-  Index parent; 
+  Index parent;
   relax_end.setConstant(emptyIdxLU);
   descendants.setZero();
-  for (Index j = 0; j < n; j++) 
-  {
+  for (Index j = 0; j < n; j++) {
     parent = et(j);
-    if (parent != n) // not the dummy root
+    if (parent != n)  // not the dummy root
       descendants(parent) += descendants(j) + 1;
   }
   // Identify the relaxed supernodes by postorder traversal of the etree
-  Index snode_start; // beginning of a snode 
-  for (Index j = 0; j < n; )
-  {
+  Index snode_start;  // beginning of a snode
+  for (Index j = 0; j < n;) {
     parent = et(j);
-    snode_start = j; 
-    while ( parent != n && descendants(parent) < relax_columns ) 
-    {
-      j = parent; 
+    snode_start = j;
+    while (parent != n && descendants(parent) < relax_columns) {
+      j = parent;
       parent = et(j);
     }
-    // Found a supernode in postordered etree, j is the last column 
-    relax_end(snode_start) = StorageIndex(j); // Record last column
+    // Found a supernode in postordered etree, j is the last column
+    relax_end(snode_start) = StorageIndex(j);  // Record last column
     j++;
     // Search for a new leaf
     while (descendants(j) != 0 && j < n) j++;
-  } // End postorder traversal of the etree
-  
+  }  // End postorder traversal of the etree
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 #endif
diff --git a/Eigen/src/SparseQR/SparseQR.h b/Eigen/src/SparseQR/SparseQR.h
index a027a2d..3e3352f 100644
--- a/Eigen/src/SparseQR/SparseQR.h
+++ b/Eigen/src/SparseQR/SparseQR.h
@@ -16,467 +16,452 @@
 
 namespace Eigen {
 
-template<typename MatrixType, typename OrderingType> class SparseQR;
-template<typename SparseQRType> struct SparseQRMatrixQReturnType;
-template<typename SparseQRType> struct SparseQRMatrixQTransposeReturnType;
-template<typename SparseQRType, typename Derived> struct SparseQR_QProduct;
+template <typename MatrixType, typename OrderingType>
+class SparseQR;
+template <typename SparseQRType>
+struct SparseQRMatrixQReturnType;
+template <typename SparseQRType>
+struct SparseQRMatrixQTransposeReturnType;
+template <typename SparseQRType, typename Derived>
+struct SparseQR_QProduct;
 namespace internal {
-  template <typename SparseQRType> struct traits<SparseQRMatrixQReturnType<SparseQRType> >
-  {
-    typedef typename SparseQRType::MatrixType ReturnType;
-    typedef typename ReturnType::StorageIndex StorageIndex;
-    typedef typename ReturnType::StorageKind StorageKind;
-    enum {
-      RowsAtCompileTime = Dynamic,
-      ColsAtCompileTime = Dynamic
-    };
-  };
-  template <typename SparseQRType> struct traits<SparseQRMatrixQTransposeReturnType<SparseQRType> >
-  {
-    typedef typename SparseQRType::MatrixType ReturnType;
-  };
-  template <typename SparseQRType, typename Derived> struct traits<SparseQR_QProduct<SparseQRType, Derived> >
-  {
-    typedef typename Derived::PlainObject ReturnType;
-  };
-} // End namespace internal
+template <typename SparseQRType>
+struct traits<SparseQRMatrixQReturnType<SparseQRType> > {
+  typedef typename SparseQRType::MatrixType ReturnType;
+  typedef typename ReturnType::StorageIndex StorageIndex;
+  typedef typename ReturnType::StorageKind StorageKind;
+  enum { RowsAtCompileTime = Dynamic, ColsAtCompileTime = Dynamic };
+};
+template <typename SparseQRType>
+struct traits<SparseQRMatrixQTransposeReturnType<SparseQRType> > {
+  typedef typename SparseQRType::MatrixType ReturnType;
+};
+template <typename SparseQRType, typename Derived>
+struct traits<SparseQR_QProduct<SparseQRType, Derived> > {
+  typedef typename Derived::PlainObject ReturnType;
+};
+}  // End namespace internal
 
 /**
-  * \ingroup SparseQR_Module
-  * \class SparseQR
-  * \brief Sparse left-looking QR factorization with numerical column pivoting
-  * 
-  * This class implements a left-looking QR decomposition of sparse matrices
-  * with numerical column pivoting.
-  * When a column has a norm less than a given tolerance
-  * it is implicitly permuted to the end. The QR factorization thus obtained is 
-  * given by A*P = Q*R where R is upper triangular or trapezoidal. 
-  * 
-  * P is the column permutation which is the product of the fill-reducing and the
-  * numerical permutations. Use colsPermutation() to get it.
-  * 
-  * Q is the orthogonal matrix represented as products of Householder reflectors. 
-  * Use matrixQ() to get an expression and matrixQ().adjoint() to get the adjoint.
-  * You can then apply it to a vector.
-  * 
-  * R is the sparse triangular or trapezoidal matrix. The later occurs when A is rank-deficient.
-  * matrixR().topLeftCorner(rank(), rank()) always returns a triangular factor of full rank.
-  * 
-  * \tparam MatrixType_ The type of the sparse matrix A, must be a column-major SparseMatrix<>
-  * \tparam OrderingType_ The fill-reducing ordering method. See the \link OrderingMethods_Module
-  *  OrderingMethods \endlink module for the list of built-in and external ordering methods.
-  * 
-  * \implsparsesolverconcept
-  *
-  * The numerical pivoting strategy and default threshold are the same as in SuiteSparse QR, and
-  * detailed in the following paper:
-  * <i>
-  * Tim Davis, "Algorithm 915, SuiteSparseQR: Multifrontal Multithreaded Rank-Revealing
-  * Sparse QR Factorization, ACM Trans. on Math. Soft. 38(1), 2011.
-  * </i>
-  * Even though it is qualified as "rank-revealing", this strategy might fail for some 
-  * rank deficient problems. When this class is used to solve linear or least-square problems
-  * it is thus strongly recommended to check the accuracy of the computed solution. If it
-  * failed, it usually helps to increase the threshold with setPivotThreshold.
-  * 
-  * \warning The input sparse matrix A must be in compressed mode (see SparseMatrix::makeCompressed()).
-  * \warning For complex matrices matrixQ().transpose() will actually return the adjoint matrix.
-  * 
-  */
-template<typename MatrixType_, typename OrderingType_>
-class SparseQR : public SparseSolverBase<SparseQR<MatrixType_,OrderingType_> >
-{
-  protected:
-    typedef SparseSolverBase<SparseQR<MatrixType_,OrderingType_> > Base;
-    using Base::m_isInitialized;
-  public:
-    using Base::_solve_impl;
-    typedef MatrixType_ MatrixType;
-    typedef OrderingType_ OrderingType;
-    typedef typename MatrixType::Scalar Scalar;
-    typedef typename MatrixType::RealScalar RealScalar;
-    typedef typename MatrixType::StorageIndex StorageIndex;
-    typedef SparseMatrix<Scalar,ColMajor,StorageIndex> QRMatrixType;
-    typedef Matrix<StorageIndex, Dynamic, 1> IndexVector;
-    typedef Matrix<Scalar, Dynamic, 1> ScalarVector;
-    typedef PermutationMatrix<Dynamic, Dynamic, StorageIndex> PermutationType;
+ * \ingroup SparseQR_Module
+ * \class SparseQR
+ * \brief Sparse left-looking QR factorization with numerical column pivoting
+ *
+ * This class implements a left-looking QR decomposition of sparse matrices
+ * with numerical column pivoting.
+ * When a column has a norm less than a given tolerance
+ * it is implicitly permuted to the end. The QR factorization thus obtained is
+ * given by A*P = Q*R where R is upper triangular or trapezoidal.
+ *
+ * P is the column permutation which is the product of the fill-reducing and the
+ * numerical permutations. Use colsPermutation() to get it.
+ *
+ * Q is the orthogonal matrix represented as products of Householder reflectors.
+ * Use matrixQ() to get an expression and matrixQ().adjoint() to get the adjoint.
+ * You can then apply it to a vector.
+ *
+ * R is the sparse triangular or trapezoidal matrix. The later occurs when A is rank-deficient.
+ * matrixR().topLeftCorner(rank(), rank()) always returns a triangular factor of full rank.
+ *
+ * \tparam MatrixType_ The type of the sparse matrix A, must be a column-major SparseMatrix<>
+ * \tparam OrderingType_ The fill-reducing ordering method. See the \link OrderingMethods_Module
+ *  OrderingMethods \endlink module for the list of built-in and external ordering methods.
+ *
+ * \implsparsesolverconcept
+ *
+ * The numerical pivoting strategy and default threshold are the same as in SuiteSparse QR, and
+ * detailed in the following paper:
+ * <i>
+ * Tim Davis, "Algorithm 915, SuiteSparseQR: Multifrontal Multithreaded Rank-Revealing
+ * Sparse QR Factorization, ACM Trans. on Math. Soft. 38(1), 2011.
+ * </i>
+ * Even though it is qualified as "rank-revealing", this strategy might fail for some
+ * rank deficient problems. When this class is used to solve linear or least-square problems
+ * it is thus strongly recommended to check the accuracy of the computed solution. If it
+ * failed, it usually helps to increase the threshold with setPivotThreshold.
+ *
+ * \warning The input sparse matrix A must be in compressed mode (see SparseMatrix::makeCompressed()).
+ * \warning For complex matrices matrixQ().transpose() will actually return the adjoint matrix.
+ *
+ */
+template <typename MatrixType_, typename OrderingType_>
+class SparseQR : public SparseSolverBase<SparseQR<MatrixType_, OrderingType_> > {
+ protected:
+  typedef SparseSolverBase<SparseQR<MatrixType_, OrderingType_> > Base;
+  using Base::m_isInitialized;
 
-    enum {
-      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
-      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
-    };
-    
-  public:
-    SparseQR () :  m_analysisIsok(false), m_lastError(""), m_useDefaultThreshold(true),m_isQSorted(false),m_isEtreeOk(false)
-    { }
-    
-    /** Construct a QR factorization of the matrix \a mat.
-      * 
-      * \warning The matrix \a mat must be in compressed mode (see SparseMatrix::makeCompressed()).
-      * 
-      * \sa compute()
-      */
-    explicit SparseQR(const MatrixType& mat) : m_analysisIsok(false), m_lastError(""), m_useDefaultThreshold(true),m_isQSorted(false),m_isEtreeOk(false)
-    {
-      compute(mat);
-    }
-    
-    /** Computes the QR factorization of the sparse matrix \a mat.
-      * 
-      * \warning The matrix \a mat must be in compressed mode (see SparseMatrix::makeCompressed()).
-      * 
-      * \sa analyzePattern(), factorize()
-      */
-    void compute(const MatrixType& mat)
-    {
-      analyzePattern(mat);
-      factorize(mat);
-    }
-    void analyzePattern(const MatrixType& mat);
-    void factorize(const MatrixType& mat);
-    
-    /** \returns the number of rows of the represented matrix. 
-      */
-    inline Index rows() const { return m_pmat.rows(); }
-    
-    /** \returns the number of columns of the represented matrix. 
-      */
-    inline Index cols() const { return m_pmat.cols();}
-    
-    /** \returns a const reference to the \b sparse upper triangular matrix R of the QR factorization.
-      * \warning The entries of the returned matrix are not sorted. This means that using it in algorithms
-      *          expecting sorted entries will fail. This include random coefficient accesses (SpaseMatrix::coeff()),
-      *          and coefficient-wise operations. Matrix products and triangular solves are fine though.
-      *
-      * To sort the entries, you can assign it to a row-major matrix, and if a column-major matrix
-      * is required, you can copy it again:
-      * \code
-      * SparseMatrix<double>          R  = qr.matrixR();  // column-major, not sorted!
-      * SparseMatrix<double,RowMajor> Rr = qr.matrixR();  // row-major, sorted
-      * SparseMatrix<double>          Rc = Rr;            // column-major, sorted
-      * \endcode
-      */
-    const QRMatrixType& matrixR() const { return m_R; }
-    
-    /** \returns the number of non linearly dependent columns as determined by the pivoting threshold.
-      *
-      * \sa setPivotThreshold()
-      */
-    Index rank() const
-    {
-      eigen_assert(m_isInitialized && "The factorization should be called first, use compute()");
-      return m_nonzeropivots; 
-    }
-    
-    /** \returns an expression of the matrix Q as products of sparse Householder reflectors.
-    * The common usage of this function is to apply it to a dense matrix or vector
-    * \code
-    * VectorXd B1, B2;
-    * // Initialize B1
-    * B2 = matrixQ() * B1;
-    * \endcode
-    *
-    * To get a plain SparseMatrix representation of Q:
-    * \code
-    * SparseMatrix<double> Q;
-    * Q = SparseQR<SparseMatrix<double> >(A).matrixQ();
-    * \endcode
-    * Internally, this call simply performs a sparse product between the matrix Q
-    * and a sparse identity matrix. However, due to the fact that the sparse
-    * reflectors are stored unsorted, two transpositions are needed to sort
-    * them before performing the product.
-    */
-    SparseQRMatrixQReturnType<SparseQR> matrixQ() const 
-    { return SparseQRMatrixQReturnType<SparseQR>(*this); }
-    
-    /** \returns a const reference to the column permutation P that was applied to A such that A*P = Q*R
-      * It is the combination of the fill-in reducing permutation and numerical column pivoting.
-      */
-    const PermutationType& colsPermutation() const
-    { 
-      eigen_assert(m_isInitialized && "Decomposition is not initialized.");
-      return m_outputPerm_c;
-    }
-    
-    /** \returns A string describing the type of error.
-      * This method is provided to ease debugging, not to handle errors.
-      */
-    std::string lastErrorMessage() const { return m_lastError; }
-    
-    /** \internal */
-    template<typename Rhs, typename Dest>
-    bool _solve_impl(const MatrixBase<Rhs> &B, MatrixBase<Dest> &dest) const
-    {
-      eigen_assert(m_isInitialized && "The factorization should be called first, use compute()");
-      eigen_assert(this->rows() == B.rows() && "SparseQR::solve() : invalid number of rows in the right hand side matrix");
+ public:
+  using Base::_solve_impl;
+  typedef MatrixType_ MatrixType;
+  typedef OrderingType_ OrderingType;
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::RealScalar RealScalar;
+  typedef typename MatrixType::StorageIndex StorageIndex;
+  typedef SparseMatrix<Scalar, ColMajor, StorageIndex> QRMatrixType;
+  typedef Matrix<StorageIndex, Dynamic, 1> IndexVector;
+  typedef Matrix<Scalar, Dynamic, 1> ScalarVector;
+  typedef PermutationMatrix<Dynamic, Dynamic, StorageIndex> PermutationType;
 
-      Index rank = this->rank();
-      
-      // Compute Q^* * b;
-      typename Dest::PlainObject y, b;
-      y = this->matrixQ().adjoint() * B;
-      b = y;
-      
-      // Solve with the triangular matrix R
-      y.resize((std::max<Index>)(cols(),y.rows()),y.cols());
-      y.topRows(rank) = this->matrixR().topLeftCorner(rank, rank).template triangularView<Upper>().solve(b.topRows(rank));
-      y.bottomRows(y.rows()-rank).setZero();
-      
-      // Apply the column permutation
-      if (m_perm_c.size())  dest = colsPermutation() * y.topRows(cols());
-      else                  dest = y.topRows(cols());
-      
-      m_info = Success;
-      return true;
-    }
+  enum { ColsAtCompileTime = MatrixType::ColsAtCompileTime, MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime };
 
-    /** Sets the threshold that is used to determine linearly dependent columns during the factorization.
-      *
-      * In practice, if during the factorization the norm of the column that has to be eliminated is below
-      * this threshold, then the entire column is treated as zero, and it is moved at the end.
-      */
-    void setPivotThreshold(const RealScalar& threshold)
-    {
-      m_useDefaultThreshold = false;
-      m_threshold = threshold;
-    }
-    
-    /** \returns the solution X of \f$ A X = B \f$ using the current decomposition of A.
-      *
-      * \sa compute()
-      */
-    template<typename Rhs>
-    inline const Solve<SparseQR, Rhs> solve(const MatrixBase<Rhs>& B) const 
-    {
-      eigen_assert(m_isInitialized && "The factorization should be called first, use compute()");
-      eigen_assert(this->rows() == B.rows() && "SparseQR::solve() : invalid number of rows in the right hand side matrix");
-      return Solve<SparseQR, Rhs>(*this, B.derived());
-    }
-    template<typename Rhs>
-    inline const Solve<SparseQR, Rhs> solve(const SparseMatrixBase<Rhs>& B) const
-    {
-          eigen_assert(m_isInitialized && "The factorization should be called first, use compute()");
-          eigen_assert(this->rows() == B.rows() && "SparseQR::solve() : invalid number of rows in the right hand side matrix");
-          return Solve<SparseQR, Rhs>(*this, B.derived());
-    }
-    
-    /** \brief Reports whether previous computation was successful.
-      *
-      * \returns \c Success if computation was successful,
-      *          \c NumericalIssue if the QR factorization reports a numerical problem
-      *          \c InvalidInput if the input matrix is invalid
-      *
-      * \sa iparm()          
-      */
-    ComputationInfo info() const
-    {
-      eigen_assert(m_isInitialized && "Decomposition is not initialized.");
-      return m_info;
-    }
+ public:
+  SparseQR()
+      : m_analysisIsok(false), m_lastError(""), m_useDefaultThreshold(true), m_isQSorted(false), m_isEtreeOk(false) {}
 
+  /** Construct a QR factorization of the matrix \a mat.
+   *
+   * \warning The matrix \a mat must be in compressed mode (see SparseMatrix::makeCompressed()).
+   *
+   * \sa compute()
+   */
+  explicit SparseQR(const MatrixType& mat)
+      : m_analysisIsok(false), m_lastError(""), m_useDefaultThreshold(true), m_isQSorted(false), m_isEtreeOk(false) {
+    compute(mat);
+  }
 
-    /** \internal */
-    inline void _sort_matrix_Q()
-    {
-      if(this->m_isQSorted) return;
-      // The matrix Q is sorted during the transposition
-      SparseMatrix<Scalar, RowMajor, Index> mQrm(this->m_Q);
-      this->m_Q = mQrm;
-      this->m_isQSorted = true;
-    }
+  /** Computes the QR factorization of the sparse matrix \a mat.
+   *
+   * \warning The matrix \a mat must be in compressed mode (see SparseMatrix::makeCompressed()).
+   *
+   * \sa analyzePattern(), factorize()
+   */
+  void compute(const MatrixType& mat) {
+    analyzePattern(mat);
+    factorize(mat);
+  }
+  void analyzePattern(const MatrixType& mat);
+  void factorize(const MatrixType& mat);
 
-    
-  protected:
-    bool m_analysisIsok;
-    bool m_factorizationIsok;
-    mutable ComputationInfo m_info;
-    std::string m_lastError;
-    QRMatrixType m_pmat;            // Temporary matrix
-    QRMatrixType m_R;               // The triangular factor matrix
-    QRMatrixType m_Q;               // The orthogonal reflectors
-    ScalarVector m_hcoeffs;         // The Householder coefficients
-    PermutationType m_perm_c;       // Fill-reducing  Column  permutation
-    PermutationType m_pivotperm;    // The permutation for rank revealing
-    PermutationType m_outputPerm_c; // The final column permutation
-    RealScalar m_threshold;         // Threshold to determine null Householder reflections
-    bool m_useDefaultThreshold;     // Use default threshold
-    Index m_nonzeropivots;          // Number of non zero pivots found
-    IndexVector m_etree;            // Column elimination tree
-    IndexVector m_firstRowElt;      // First element in each row
-    bool m_isQSorted;               // whether Q is sorted or not
-    bool m_isEtreeOk;               // whether the elimination tree match the initial input matrix
-    
-    template <typename, typename > friend struct SparseQR_QProduct;
-    
+  /** \returns the number of rows of the represented matrix.
+   */
+  inline Index rows() const { return m_pmat.rows(); }
+
+  /** \returns the number of columns of the represented matrix.
+   */
+  inline Index cols() const { return m_pmat.cols(); }
+
+  /** \returns a const reference to the \b sparse upper triangular matrix R of the QR factorization.
+   * \warning The entries of the returned matrix are not sorted. This means that using it in algorithms
+   *          expecting sorted entries will fail. This include random coefficient accesses (SpaseMatrix::coeff()),
+   *          and coefficient-wise operations. Matrix products and triangular solves are fine though.
+   *
+   * To sort the entries, you can assign it to a row-major matrix, and if a column-major matrix
+   * is required, you can copy it again:
+   * \code
+   * SparseMatrix<double>          R  = qr.matrixR();  // column-major, not sorted!
+   * SparseMatrix<double,RowMajor> Rr = qr.matrixR();  // row-major, sorted
+   * SparseMatrix<double>          Rc = Rr;            // column-major, sorted
+   * \endcode
+   */
+  const QRMatrixType& matrixR() const { return m_R; }
+
+  /** \returns the number of non linearly dependent columns as determined by the pivoting threshold.
+   *
+   * \sa setPivotThreshold()
+   */
+  Index rank() const {
+    eigen_assert(m_isInitialized && "The factorization should be called first, use compute()");
+    return m_nonzeropivots;
+  }
+
+  /** \returns an expression of the matrix Q as products of sparse Householder reflectors.
+   * The common usage of this function is to apply it to a dense matrix or vector
+   * \code
+   * VectorXd B1, B2;
+   * // Initialize B1
+   * B2 = matrixQ() * B1;
+   * \endcode
+   *
+   * To get a plain SparseMatrix representation of Q:
+   * \code
+   * SparseMatrix<double> Q;
+   * Q = SparseQR<SparseMatrix<double> >(A).matrixQ();
+   * \endcode
+   * Internally, this call simply performs a sparse product between the matrix Q
+   * and a sparse identity matrix. However, due to the fact that the sparse
+   * reflectors are stored unsorted, two transpositions are needed to sort
+   * them before performing the product.
+   */
+  SparseQRMatrixQReturnType<SparseQR> matrixQ() const { return SparseQRMatrixQReturnType<SparseQR>(*this); }
+
+  /** \returns a const reference to the column permutation P that was applied to A such that A*P = Q*R
+   * It is the combination of the fill-in reducing permutation and numerical column pivoting.
+   */
+  const PermutationType& colsPermutation() const {
+    eigen_assert(m_isInitialized && "Decomposition is not initialized.");
+    return m_outputPerm_c;
+  }
+
+  /** \returns A string describing the type of error.
+   * This method is provided to ease debugging, not to handle errors.
+   */
+  std::string lastErrorMessage() const { return m_lastError; }
+
+  /** \internal */
+  template <typename Rhs, typename Dest>
+  bool _solve_impl(const MatrixBase<Rhs>& B, MatrixBase<Dest>& dest) const {
+    eigen_assert(m_isInitialized && "The factorization should be called first, use compute()");
+    eigen_assert(this->rows() == B.rows() &&
+                 "SparseQR::solve() : invalid number of rows in the right hand side matrix");
+
+    Index rank = this->rank();
+
+    // Compute Q^* * b;
+    typename Dest::PlainObject y, b;
+    y = this->matrixQ().adjoint() * B;
+    b = y;
+
+    // Solve with the triangular matrix R
+    y.resize((std::max<Index>)(cols(), y.rows()), y.cols());
+    y.topRows(rank) = this->matrixR().topLeftCorner(rank, rank).template triangularView<Upper>().solve(b.topRows(rank));
+    y.bottomRows(y.rows() - rank).setZero();
+
+    // Apply the column permutation
+    if (m_perm_c.size())
+      dest = colsPermutation() * y.topRows(cols());
+    else
+      dest = y.topRows(cols());
+
+    m_info = Success;
+    return true;
+  }
+
+  /** Sets the threshold that is used to determine linearly dependent columns during the factorization.
+   *
+   * In practice, if during the factorization the norm of the column that has to be eliminated is below
+   * this threshold, then the entire column is treated as zero, and it is moved at the end.
+   */
+  void setPivotThreshold(const RealScalar& threshold) {
+    m_useDefaultThreshold = false;
+    m_threshold = threshold;
+  }
+
+  /** \returns the solution X of \f$ A X = B \f$ using the current decomposition of A.
+   *
+   * \sa compute()
+   */
+  template <typename Rhs>
+  inline const Solve<SparseQR, Rhs> solve(const MatrixBase<Rhs>& B) const {
+    eigen_assert(m_isInitialized && "The factorization should be called first, use compute()");
+    eigen_assert(this->rows() == B.rows() &&
+                 "SparseQR::solve() : invalid number of rows in the right hand side matrix");
+    return Solve<SparseQR, Rhs>(*this, B.derived());
+  }
+  template <typename Rhs>
+  inline const Solve<SparseQR, Rhs> solve(const SparseMatrixBase<Rhs>& B) const {
+    eigen_assert(m_isInitialized && "The factorization should be called first, use compute()");
+    eigen_assert(this->rows() == B.rows() &&
+                 "SparseQR::solve() : invalid number of rows in the right hand side matrix");
+    return Solve<SparseQR, Rhs>(*this, B.derived());
+  }
+
+  /** \brief Reports whether previous computation was successful.
+   *
+   * \returns \c Success if computation was successful,
+   *          \c NumericalIssue if the QR factorization reports a numerical problem
+   *          \c InvalidInput if the input matrix is invalid
+   *
+   * \sa iparm()
+   */
+  ComputationInfo info() const {
+    eigen_assert(m_isInitialized && "Decomposition is not initialized.");
+    return m_info;
+  }
+
+  /** \internal */
+  inline void _sort_matrix_Q() {
+    if (this->m_isQSorted) return;
+    // The matrix Q is sorted during the transposition
+    SparseMatrix<Scalar, RowMajor, Index> mQrm(this->m_Q);
+    this->m_Q = mQrm;
+    this->m_isQSorted = true;
+  }
+
+ protected:
+  bool m_analysisIsok;
+  bool m_factorizationIsok;
+  mutable ComputationInfo m_info;
+  std::string m_lastError;
+  QRMatrixType m_pmat;             // Temporary matrix
+  QRMatrixType m_R;                // The triangular factor matrix
+  QRMatrixType m_Q;                // The orthogonal reflectors
+  ScalarVector m_hcoeffs;          // The Householder coefficients
+  PermutationType m_perm_c;        // Fill-reducing  Column  permutation
+  PermutationType m_pivotperm;     // The permutation for rank revealing
+  PermutationType m_outputPerm_c;  // The final column permutation
+  RealScalar m_threshold;          // Threshold to determine null Householder reflections
+  bool m_useDefaultThreshold;      // Use default threshold
+  Index m_nonzeropivots;           // Number of non zero pivots found
+  IndexVector m_etree;             // Column elimination tree
+  IndexVector m_firstRowElt;       // First element in each row
+  bool m_isQSorted;                // whether Q is sorted or not
+  bool m_isEtreeOk;                // whether the elimination tree match the initial input matrix
+
+  template <typename, typename>
+  friend struct SparseQR_QProduct;
 };
 
-/** \brief Preprocessing step of a QR factorization 
-  * 
-  * \warning The matrix \a mat must be in compressed mode (see SparseMatrix::makeCompressed()).
-  * 
-  * In this step, the fill-reducing permutation is computed and applied to the columns of A
-  * and the column elimination tree is computed as well. Only the sparsity pattern of \a mat is exploited.
-  * 
-  * \note In this step it is assumed that there is no empty row in the matrix \a mat.
-  */
+/** \brief Preprocessing step of a QR factorization
+ *
+ * \warning The matrix \a mat must be in compressed mode (see SparseMatrix::makeCompressed()).
+ *
+ * In this step, the fill-reducing permutation is computed and applied to the columns of A
+ * and the column elimination tree is computed as well. Only the sparsity pattern of \a mat is exploited.
+ *
+ * \note In this step it is assumed that there is no empty row in the matrix \a mat.
+ */
 template <typename MatrixType, typename OrderingType>
-void SparseQR<MatrixType,OrderingType>::analyzePattern(const MatrixType& mat)
-{
-  eigen_assert(mat.isCompressed() && "SparseQR requires a sparse matrix in compressed mode. Call .makeCompressed() before passing it to SparseQR");
+void SparseQR<MatrixType, OrderingType>::analyzePattern(const MatrixType& mat) {
+  eigen_assert(
+      mat.isCompressed() &&
+      "SparseQR requires a sparse matrix in compressed mode. Call .makeCompressed() before passing it to SparseQR");
   // Copy to a column major matrix if the input is rowmajor
-  std::conditional_t<MatrixType::IsRowMajor,QRMatrixType,const MatrixType&> matCpy(mat);
+  std::conditional_t<MatrixType::IsRowMajor, QRMatrixType, const MatrixType&> matCpy(mat);
   // Compute the column fill reducing ordering
-  OrderingType ord; 
-  ord(matCpy, m_perm_c); 
+  OrderingType ord;
+  ord(matCpy, m_perm_c);
   Index n = mat.cols();
   Index m = mat.rows();
-  Index diagSize = (std::min)(m,n);
-  
-  if (!m_perm_c.size())
-  {
+  Index diagSize = (std::min)(m, n);
+
+  if (!m_perm_c.size()) {
     m_perm_c.resize(n);
-    m_perm_c.indices().setLinSpaced(n, 0,StorageIndex(n-1));
+    m_perm_c.indices().setLinSpaced(n, 0, StorageIndex(n - 1));
   }
-  
+
   // Compute the column elimination tree of the permuted matrix
   m_outputPerm_c = m_perm_c.inverse();
   internal::coletree(matCpy, m_etree, m_firstRowElt, m_outputPerm_c.indices().data());
   m_isEtreeOk = true;
-  
+
   m_R.resize(m, n);
   m_Q.resize(m, diagSize);
-  
+
   // Allocate space for nonzero elements: rough estimation
-  m_R.reserve(2*mat.nonZeros()); //FIXME Get a more accurate estimation through symbolic factorization with the etree
-  m_Q.reserve(2*mat.nonZeros());
+  m_R.reserve(2 * mat.nonZeros());  // FIXME Get a more accurate estimation through symbolic factorization with the
+                                    // etree
+  m_Q.reserve(2 * mat.nonZeros());
   m_hcoeffs.resize(diagSize);
   m_analysisIsok = true;
 }
 
 /** \brief Performs the numerical QR factorization of the input matrix
-  * 
-  * The function SparseQR::analyzePattern(const MatrixType&) must have been called beforehand with
-  * a matrix having the same sparsity pattern than \a mat.
-  * 
-  * \param mat The sparse column-major matrix
-  */
+ *
+ * The function SparseQR::analyzePattern(const MatrixType&) must have been called beforehand with
+ * a matrix having the same sparsity pattern than \a mat.
+ *
+ * \param mat The sparse column-major matrix
+ */
 template <typename MatrixType, typename OrderingType>
-void SparseQR<MatrixType,OrderingType>::factorize(const MatrixType& mat)
-{
+void SparseQR<MatrixType, OrderingType>::factorize(const MatrixType& mat) {
   using std::abs;
-  
+
   eigen_assert(m_analysisIsok && "analyzePattern() should be called before this step");
   StorageIndex m = StorageIndex(mat.rows());
   StorageIndex n = StorageIndex(mat.cols());
-  StorageIndex diagSize = (std::min)(m,n);
-  IndexVector mark((std::max)(m,n)); mark.setConstant(-1);  // Record the visited nodes
-  IndexVector Ridx(n), Qidx(m);                             // Store temporarily the row indexes for the current column of R and Q
-  Index nzcolR, nzcolQ;                                     // Number of nonzero for the current column of R and Q
-  ScalarVector tval(m);                                     // The dense vector used to compute the current column
+  StorageIndex diagSize = (std::min)(m, n);
+  IndexVector mark((std::max)(m, n));
+  mark.setConstant(-1);          // Record the visited nodes
+  IndexVector Ridx(n), Qidx(m);  // Store temporarily the row indexes for the current column of R and Q
+  Index nzcolR, nzcolQ;          // Number of nonzero for the current column of R and Q
+  ScalarVector tval(m);          // The dense vector used to compute the current column
   RealScalar pivotThreshold = m_threshold;
-  
+
   m_R.setZero();
   m_Q.setZero();
   m_pmat = mat;
-  if(!m_isEtreeOk)
-  {
+  if (!m_isEtreeOk) {
     m_outputPerm_c = m_perm_c.inverse();
     internal::coletree(m_pmat, m_etree, m_firstRowElt, m_outputPerm_c.indices().data());
     m_isEtreeOk = true;
   }
 
-  m_pmat.uncompress(); // To have the innerNonZeroPtr allocated
-  
+  m_pmat.uncompress();  // To have the innerNonZeroPtr allocated
+
   // Apply the fill-in reducing permutation lazily:
   {
     // If the input is row major, copy the original column indices,
     // otherwise directly use the input matrix
-    // 
+    //
     IndexVector originalOuterIndicesCpy;
-    const StorageIndex *originalOuterIndices = mat.outerIndexPtr();
-    if(MatrixType::IsRowMajor)
-    {
-      originalOuterIndicesCpy = IndexVector::Map(m_pmat.outerIndexPtr(),n+1);
+    const StorageIndex* originalOuterIndices = mat.outerIndexPtr();
+    if (MatrixType::IsRowMajor) {
+      originalOuterIndicesCpy = IndexVector::Map(m_pmat.outerIndexPtr(), n + 1);
       originalOuterIndices = originalOuterIndicesCpy.data();
     }
-    
-    for (int i = 0; i < n; i++)
-    {
+
+    for (int i = 0; i < n; i++) {
       Index p = m_perm_c.size() ? m_perm_c.indices()(i) : i;
-      m_pmat.outerIndexPtr()[p] = originalOuterIndices[i]; 
-      m_pmat.innerNonZeroPtr()[p] = originalOuterIndices[i+1] - originalOuterIndices[i]; 
+      m_pmat.outerIndexPtr()[p] = originalOuterIndices[i];
+      m_pmat.innerNonZeroPtr()[p] = originalOuterIndices[i + 1] - originalOuterIndices[i];
     }
   }
-  
+
   /* Compute the default threshold as in MatLab, see:
    * Tim Davis, "Algorithm 915, SuiteSparseQR: Multifrontal Multithreaded Rank-Revealing
-   * Sparse QR Factorization, ACM Trans. on Math. Soft. 38(1), 2011, Page 8:3 
+   * Sparse QR Factorization, ACM Trans. on Math. Soft. 38(1), 2011, Page 8:3
    */
-  if(m_useDefaultThreshold) 
-  {
+  if (m_useDefaultThreshold) {
     RealScalar max2Norm = 0.0;
     for (int j = 0; j < n; j++) max2Norm = numext::maxi(max2Norm, m_pmat.col(j).norm());
-    if(max2Norm==RealScalar(0))
-      max2Norm = RealScalar(1);
+    if (max2Norm == RealScalar(0)) max2Norm = RealScalar(1);
     pivotThreshold = 20 * (m + n) * max2Norm * NumTraits<RealScalar>::epsilon();
   }
-  
+
   // Initialize the numerical permutation
   m_pivotperm.setIdentity(n);
-  
-  StorageIndex nonzeroCol = 0; // Record the number of valid pivots
+
+  StorageIndex nonzeroCol = 0;  // Record the number of valid pivots
   m_Q.startVec(0);
 
   // Left looking rank-revealing QR factorization: compute a column of R and Q at a time
-  for (StorageIndex col = 0; col < n; ++col)
-  {
+  for (StorageIndex col = 0; col < n; ++col) {
     mark.setConstant(-1);
     m_R.startVec(col);
     mark(nonzeroCol) = col;
     Qidx(0) = nonzeroCol;
-    nzcolR = 0; nzcolQ = 1;
-    bool found_diag = nonzeroCol>=m;
-    tval.setZero(); 
-    
+    nzcolR = 0;
+    nzcolQ = 1;
+    bool found_diag = nonzeroCol >= m;
+    tval.setZero();
+
     // Symbolic factorization: find the nonzero locations of the column k of the factors R and Q, i.e.,
-    // all the nodes (with indexes lower than rank) reachable through the column elimination tree (etree) rooted at node k.
-    // Note: if the diagonal entry does not exist, then its contribution must be explicitly added,
-    // thus the trick with found_diag that permits to do one more iteration on the diagonal element if this one has not been found.
-    for (typename QRMatrixType::InnerIterator itp(m_pmat, col); itp || !found_diag; ++itp)
-    {
+    // all the nodes (with indexes lower than rank) reachable through the column elimination tree (etree) rooted at node
+    // k. Note: if the diagonal entry does not exist, then its contribution must be explicitly added, thus the trick
+    // with found_diag that permits to do one more iteration on the diagonal element if this one has not been found.
+    for (typename QRMatrixType::InnerIterator itp(m_pmat, col); itp || !found_diag; ++itp) {
       StorageIndex curIdx = nonzeroCol;
-      if(itp) curIdx = StorageIndex(itp.row());
-      if(curIdx == nonzeroCol) found_diag = true;
-      
+      if (itp) curIdx = StorageIndex(itp.row());
+      if (curIdx == nonzeroCol) found_diag = true;
+
       // Get the nonzeros indexes of the current column of R
-      StorageIndex st = m_firstRowElt(curIdx); // The traversal of the etree starts here
-      if (st < 0 )
-      {
+      StorageIndex st = m_firstRowElt(curIdx);  // The traversal of the etree starts here
+      if (st < 0) {
         m_lastError = "Empty row found during numerical factorization";
         m_info = InvalidInput;
         return;
       }
 
-      // Traverse the etree 
+      // Traverse the etree
       Index bi = nzcolR;
-      for (; mark(st) != col; st = m_etree(st))
-      {
+      for (; mark(st) != col; st = m_etree(st)) {
         Ridx(nzcolR) = st;  // Add this row to the list,
         mark(st) = col;     // and mark this row as visited
         nzcolR++;
       }
 
       // Reverse the list to get the topological ordering
-      Index nt = nzcolR-bi;
-      for(Index i = 0; i < nt/2; i++) std::swap(Ridx(bi+i), Ridx(nzcolR-i-1));
-       
+      Index nt = nzcolR - bi;
+      for (Index i = 0; i < nt / 2; i++) std::swap(Ridx(bi + i), Ridx(nzcolR - i - 1));
+
       // Copy the current (curIdx,pcol) value of the input matrix
-      if(itp) tval(curIdx) = itp.value();
-      else    tval(curIdx) = Scalar(0);
-      
+      if (itp)
+        tval(curIdx) = itp.value();
+      else
+        tval(curIdx) = Scalar(0);
+
       // Compute the pattern of Q(:,k)
-      if(curIdx > nonzeroCol && mark(curIdx) != col ) 
-      {
+      if (curIdx > nonzeroCol && mark(curIdx) != col) {
         Qidx(nzcolQ) = curIdx;  // Add this row to the pattern of Q,
         mark(curIdx) = col;     // and mark it as visited
         nzcolQ++;
@@ -484,110 +469,91 @@
     }
 
     // Browse all the indexes of R(:,col) in reverse order
-    for (Index i = nzcolR-1; i >= 0; i--)
-    {
+    for (Index i = nzcolR - 1; i >= 0; i--) {
       Index curIdx = Ridx(i);
-      
+
       // Apply the curIdx-th householder vector to the current column (temporarily stored into tval)
       Scalar tdot(0);
-      
+
       // First compute q' * tval
       tdot = m_Q.col(curIdx).dot(tval);
 
       tdot *= m_hcoeffs(curIdx);
-      
+
       // Then update tval = tval - q * tau
-      // FIXME: tval -= tdot * m_Q.col(curIdx) should amount to the same (need to check/add support for efficient "dense ?= sparse")
-      for (typename QRMatrixType::InnerIterator itq(m_Q, curIdx); itq; ++itq)
-        tval(itq.row()) -= itq.value() * tdot;
+      // FIXME: tval -= tdot * m_Q.col(curIdx) should amount to the same (need to check/add support for efficient "dense
+      // ?= sparse")
+      for (typename QRMatrixType::InnerIterator itq(m_Q, curIdx); itq; ++itq) tval(itq.row()) -= itq.value() * tdot;
 
       // Detect fill-in for the current column of Q
-      if(m_etree(Ridx(i)) == nonzeroCol)
-      {
-        for (typename QRMatrixType::InnerIterator itq(m_Q, curIdx); itq; ++itq)
-        {
+      if (m_etree(Ridx(i)) == nonzeroCol) {
+        for (typename QRMatrixType::InnerIterator itq(m_Q, curIdx); itq; ++itq) {
           StorageIndex iQ = StorageIndex(itq.row());
-          if (mark(iQ) != col)
-          {
+          if (mark(iQ) != col) {
             Qidx(nzcolQ++) = iQ;  // Add this row to the pattern of Q,
             mark(iQ) = col;       // and mark it as visited
           }
         }
       }
-    } // End update current column
-    
+    }  // End update current column
+
     Scalar tau = RealScalar(0);
     RealScalar beta = 0;
-    
-    if(nonzeroCol < diagSize)
-    {
+
+    if (nonzeroCol < diagSize) {
       // Compute the Householder reflection that eliminate the current column
       // FIXME this step should call the Householder module.
       Scalar c0 = nzcolQ ? tval(Qidx(0)) : Scalar(0);
-      
+
       // First, the squared norm of Q((col+1):m, col)
       RealScalar sqrNorm = 0.;
       for (Index itq = 1; itq < nzcolQ; ++itq) sqrNorm += numext::abs2(tval(Qidx(itq)));
-      if(sqrNorm == RealScalar(0) && numext::imag(c0) == RealScalar(0))
-      {
+      if (sqrNorm == RealScalar(0) && numext::imag(c0) == RealScalar(0)) {
         beta = numext::real(c0);
         tval(Qidx(0)) = 1;
-      }
-      else
-      {
+      } else {
         using std::sqrt;
         beta = sqrt(numext::abs2(c0) + sqrNorm);
-        if(numext::real(c0) >= RealScalar(0))
-          beta = -beta;
+        if (numext::real(c0) >= RealScalar(0)) beta = -beta;
         tval(Qidx(0)) = 1;
-        for (Index itq = 1; itq < nzcolQ; ++itq)
-          tval(Qidx(itq)) /= (c0 - beta);
-        tau = numext::conj((beta-c0) / beta);
-          
+        for (Index itq = 1; itq < nzcolQ; ++itq) tval(Qidx(itq)) /= (c0 - beta);
+        tau = numext::conj((beta - c0) / beta);
       }
     }
 
     // Insert values in R
-    for (Index  i = nzcolR-1; i >= 0; i--)
-    {
+    for (Index i = nzcolR - 1; i >= 0; i--) {
       Index curIdx = Ridx(i);
-      if(curIdx < nonzeroCol) 
-      {
+      if (curIdx < nonzeroCol) {
         m_R.insertBackByOuterInnerUnordered(col, curIdx) = tval(curIdx);
         tval(curIdx) = Scalar(0.);
       }
     }
 
-    if(nonzeroCol < diagSize && abs(beta) >= pivotThreshold)
-    {
+    if (nonzeroCol < diagSize && abs(beta) >= pivotThreshold) {
       m_R.insertBackByOuterInner(col, nonzeroCol) = beta;
       // The householder coefficient
       m_hcoeffs(nonzeroCol) = tau;
       // Record the householder reflections
-      for (Index itq = 0; itq < nzcolQ; ++itq)
-      {
+      for (Index itq = 0; itq < nzcolQ; ++itq) {
         Index iQ = Qidx(itq);
-        m_Q.insertBackByOuterInnerUnordered(nonzeroCol,iQ) = tval(iQ);
+        m_Q.insertBackByOuterInnerUnordered(nonzeroCol, iQ) = tval(iQ);
         tval(iQ) = Scalar(0.);
       }
       nonzeroCol++;
-      if(nonzeroCol<diagSize)
-        m_Q.startVec(nonzeroCol);
-    }
-    else
-    {
+      if (nonzeroCol < diagSize) m_Q.startVec(nonzeroCol);
+    } else {
       // Zero pivot found: move implicitly this column to the end
-      for (Index j = nonzeroCol; j < n-1; j++) 
-        std::swap(m_pivotperm.indices()(j), m_pivotperm.indices()[j+1]);
-      
+      for (Index j = nonzeroCol; j < n - 1; j++) std::swap(m_pivotperm.indices()(j), m_pivotperm.indices()[j + 1]);
+
       // Recompute the column elimination tree
       internal::coletree(m_pmat, m_etree, m_firstRowElt, m_pivotperm.indices().data());
       m_isEtreeOk = false;
     }
   }
-  
-  m_hcoeffs.tail(diagSize-nonzeroCol).setZero();
-  
+
+  m_hcoeffs.tail(diagSize - nonzeroCol).setZero();
+
   // Finalize the column pointers of the sparse matrices R and Q
   m_Q.finalize();
   m_Q.makeCompressed();
@@ -596,166 +562,145 @@
   m_isQSorted = false;
 
   m_nonzeropivots = nonzeroCol;
-  
-  if(nonzeroCol<n)
-  {
+
+  if (nonzeroCol < n) {
     // Permute the triangular factor to put the 'dead' columns to the end
     QRMatrixType tempR(m_R);
     m_R = tempR * m_pivotperm;
-    
+
     // Update the column permutation
     m_outputPerm_c = m_outputPerm_c * m_pivotperm;
   }
-  
-  m_isInitialized = true; 
+
+  m_isInitialized = true;
   m_factorizationIsok = true;
   m_info = Success;
 }
 
 template <typename SparseQRType, typename Derived>
-struct SparseQR_QProduct : ReturnByValue<SparseQR_QProduct<SparseQRType, Derived> >
-{
+struct SparseQR_QProduct : ReturnByValue<SparseQR_QProduct<SparseQRType, Derived> > {
   typedef typename SparseQRType::QRMatrixType MatrixType;
   typedef typename SparseQRType::Scalar Scalar;
-  // Get the references 
-  SparseQR_QProduct(const SparseQRType& qr, const Derived& other, bool transpose) : 
-  m_qr(qr),m_other(other),m_transpose(transpose) {}
+  // Get the references
+  SparseQR_QProduct(const SparseQRType& qr, const Derived& other, bool transpose)
+      : m_qr(qr), m_other(other), m_transpose(transpose) {}
   inline Index rows() const { return m_qr.matrixQ().rows(); }
   inline Index cols() const { return m_other.cols(); }
-  
+
   // Assign to a vector
-  template<typename DesType>
-  void evalTo(DesType& res) const
-  {
+  template <typename DesType>
+  void evalTo(DesType& res) const {
     Index m = m_qr.rows();
     Index n = m_qr.cols();
-    Index diagSize = (std::min)(m,n);
+    Index diagSize = (std::min)(m, n);
     res = m_other;
-    if (m_transpose)
-    {
+    if (m_transpose) {
       eigen_assert(m_qr.m_Q.rows() == m_other.rows() && "Non conforming object sizes");
-      //Compute res = Q' * other column by column
-      for(Index j = 0; j < res.cols(); j++){
-        for (Index k = 0; k < diagSize; k++)
-        {
+      // Compute res = Q' * other column by column
+      for (Index j = 0; j < res.cols(); j++) {
+        for (Index k = 0; k < diagSize; k++) {
           Scalar tau = Scalar(0);
           tau = m_qr.m_Q.col(k).dot(res.col(j));
-          if(tau==Scalar(0)) continue;
+          if (tau == Scalar(0)) continue;
           tau = tau * m_qr.m_hcoeffs(k);
           res.col(j) -= tau * m_qr.m_Q.col(k);
         }
       }
-    }
-    else
-    {
+    } else {
       eigen_assert(m_qr.matrixQ().cols() == m_other.rows() && "Non conforming object sizes");
 
       res.conservativeResize(rows(), cols());
 
       // Compute res = Q * other column by column
-      for(Index j = 0; j < res.cols(); j++)
-      {
-        Index start_k = internal::is_identity<Derived>::value ? numext::mini(j,diagSize-1) : diagSize-1;
-        for (Index k = start_k; k >=0; k--)
-        {
+      for (Index j = 0; j < res.cols(); j++) {
+        Index start_k = internal::is_identity<Derived>::value ? numext::mini(j, diagSize - 1) : diagSize - 1;
+        for (Index k = start_k; k >= 0; k--) {
           Scalar tau = Scalar(0);
           tau = m_qr.m_Q.col(k).dot(res.col(j));
-          if(tau==Scalar(0)) continue;
+          if (tau == Scalar(0)) continue;
           tau = tau * numext::conj(m_qr.m_hcoeffs(k));
           res.col(j) -= tau * m_qr.m_Q.col(k);
         }
       }
     }
   }
-  
+
   const SparseQRType& m_qr;
   const Derived& m_other;
-  bool m_transpose; // TODO this actually means adjoint
+  bool m_transpose;  // TODO this actually means adjoint
 };
 
-template<typename SparseQRType>
-struct SparseQRMatrixQReturnType : public EigenBase<SparseQRMatrixQReturnType<SparseQRType> >
-{  
+template <typename SparseQRType>
+struct SparseQRMatrixQReturnType : public EigenBase<SparseQRMatrixQReturnType<SparseQRType> > {
   typedef typename SparseQRType::Scalar Scalar;
-  typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix;
-  enum {
-    RowsAtCompileTime = Dynamic,
-    ColsAtCompileTime = Dynamic
-  };
+  typedef Matrix<Scalar, Dynamic, Dynamic> DenseMatrix;
+  enum { RowsAtCompileTime = Dynamic, ColsAtCompileTime = Dynamic };
   explicit SparseQRMatrixQReturnType(const SparseQRType& qr) : m_qr(qr) {}
-  template<typename Derived>
-  SparseQR_QProduct<SparseQRType, Derived> operator*(const MatrixBase<Derived>& other)
-  {
-    return SparseQR_QProduct<SparseQRType,Derived>(m_qr,other.derived(),false);
+  template <typename Derived>
+  SparseQR_QProduct<SparseQRType, Derived> operator*(const MatrixBase<Derived>& other) {
+    return SparseQR_QProduct<SparseQRType, Derived>(m_qr, other.derived(), false);
   }
   // To use for operations with the adjoint of Q
-  SparseQRMatrixQTransposeReturnType<SparseQRType> adjoint() const
-  {
+  SparseQRMatrixQTransposeReturnType<SparseQRType> adjoint() const {
     return SparseQRMatrixQTransposeReturnType<SparseQRType>(m_qr);
   }
   inline Index rows() const { return m_qr.rows(); }
   inline Index cols() const { return m_qr.rows(); }
   // To use for operations with the transpose of Q FIXME this is the same as adjoint at the moment
-  SparseQRMatrixQTransposeReturnType<SparseQRType> transpose() const
-  {
+  SparseQRMatrixQTransposeReturnType<SparseQRType> transpose() const {
     return SparseQRMatrixQTransposeReturnType<SparseQRType>(m_qr);
   }
   const SparseQRType& m_qr;
 };
 
 // TODO this actually represents the adjoint of Q
-template<typename SparseQRType>
-struct SparseQRMatrixQTransposeReturnType
-{
+template <typename SparseQRType>
+struct SparseQRMatrixQTransposeReturnType {
   explicit SparseQRMatrixQTransposeReturnType(const SparseQRType& qr) : m_qr(qr) {}
-  template<typename Derived>
-  SparseQR_QProduct<SparseQRType,Derived> operator*(const MatrixBase<Derived>& other)
-  {
-    return SparseQR_QProduct<SparseQRType,Derived>(m_qr,other.derived(), true);
+  template <typename Derived>
+  SparseQR_QProduct<SparseQRType, Derived> operator*(const MatrixBase<Derived>& other) {
+    return SparseQR_QProduct<SparseQRType, Derived>(m_qr, other.derived(), true);
   }
   const SparseQRType& m_qr;
 };
 
 namespace internal {
-  
-template<typename SparseQRType>
-struct evaluator_traits<SparseQRMatrixQReturnType<SparseQRType> >
-{
+
+template <typename SparseQRType>
+struct evaluator_traits<SparseQRMatrixQReturnType<SparseQRType> > {
   typedef typename SparseQRType::MatrixType MatrixType;
   typedef typename storage_kind_to_evaluator_kind<typename MatrixType::StorageKind>::Kind Kind;
   typedef SparseShape Shape;
 };
 
-template< typename DstXprType, typename SparseQRType>
-struct Assignment<DstXprType, SparseQRMatrixQReturnType<SparseQRType>, internal::assign_op<typename DstXprType::Scalar,typename DstXprType::Scalar>, Sparse2Sparse>
-{
+template <typename DstXprType, typename SparseQRType>
+struct Assignment<DstXprType, SparseQRMatrixQReturnType<SparseQRType>,
+                  internal::assign_op<typename DstXprType::Scalar, typename DstXprType::Scalar>, Sparse2Sparse> {
   typedef SparseQRMatrixQReturnType<SparseQRType> SrcXprType;
   typedef typename DstXprType::Scalar Scalar;
   typedef typename DstXprType::StorageIndex StorageIndex;
-  static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<Scalar,Scalar> &/*func*/)
-  {
+  static void run(DstXprType& dst, const SrcXprType& src, const internal::assign_op<Scalar, Scalar>& /*func*/) {
     typename DstXprType::PlainObject idMat(src.rows(), src.cols());
     idMat.setIdentity();
     // Sort the sparse householder reflectors if needed
-    const_cast<SparseQRType *>(&src.m_qr)->_sort_matrix_Q();
+    const_cast<SparseQRType*>(&src.m_qr)->_sort_matrix_Q();
     dst = SparseQR_QProduct<SparseQRType, DstXprType>(src.m_qr, idMat, false);
   }
 };
 
-template< typename DstXprType, typename SparseQRType>
-struct Assignment<DstXprType, SparseQRMatrixQReturnType<SparseQRType>, internal::assign_op<typename DstXprType::Scalar,typename DstXprType::Scalar>, Sparse2Dense>
-{
+template <typename DstXprType, typename SparseQRType>
+struct Assignment<DstXprType, SparseQRMatrixQReturnType<SparseQRType>,
+                  internal::assign_op<typename DstXprType::Scalar, typename DstXprType::Scalar>, Sparse2Dense> {
   typedef SparseQRMatrixQReturnType<SparseQRType> SrcXprType;
   typedef typename DstXprType::Scalar Scalar;
   typedef typename DstXprType::StorageIndex StorageIndex;
-  static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<Scalar,Scalar> &/*func*/)
-  {
+  static void run(DstXprType& dst, const SrcXprType& src, const internal::assign_op<Scalar, Scalar>& /*func*/) {
     dst = src.m_qr.matrixQ() * DstXprType::Identity(src.m_qr.rows(), src.m_qr.rows());
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
 #endif
diff --git a/Eigen/src/StlSupport/StdDeque.h b/Eigen/src/StlSupport/StdDeque.h
index 1e95182..692281b 100644
--- a/Eigen/src/StlSupport/StdDeque.h
+++ b/Eigen/src/StlSupport/StdDeque.h
@@ -22,30 +22,30 @@
  * std::deque such that for data types with alignment issues the correct allocator
  * is used automatically.
  */
-#define EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(...) \
-namespace std \
-{ \
-  template<> \
-  class deque<__VA_ARGS__, std::allocator<__VA_ARGS__> >           \
-    : public deque<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > \
-  { \
-    typedef deque<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > deque_base; \
-  public: \
-    typedef __VA_ARGS__ value_type; \
-    typedef deque_base::allocator_type allocator_type; \
-    typedef deque_base::size_type size_type;  \
-    typedef deque_base::iterator iterator;  \
-    explicit deque(const allocator_type& a = allocator_type()) : deque_base(a) {}  \
-    template<typename InputIterator> \
-    deque(InputIterator first, InputIterator last, const allocator_type& a = allocator_type()) : deque_base(first, last, a) {} \
-    deque(const deque& c) : deque_base(c) {}  \
+#define EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(...)                                                \
+  namespace std {                                                                                 \
+  template <>                                                                                     \
+  class deque<__VA_ARGS__, std::allocator<__VA_ARGS__> >                                          \
+      : public deque<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > {                        \
+    typedef deque<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > deque_base;                 \
+                                                                                                  \
+   public:                                                                                        \
+    typedef __VA_ARGS__ value_type;                                                               \
+    typedef deque_base::allocator_type allocator_type;                                            \
+    typedef deque_base::size_type size_type;                                                      \
+    typedef deque_base::iterator iterator;                                                        \
+    explicit deque(const allocator_type& a = allocator_type()) : deque_base(a) {}                 \
+    template <typename InputIterator>                                                             \
+    deque(InputIterator first, InputIterator last, const allocator_type& a = allocator_type())    \
+        : deque_base(first, last, a) {}                                                           \
+    deque(const deque& c) : deque_base(c) {}                                                      \
     explicit deque(size_type num, const value_type& val = value_type()) : deque_base(num, val) {} \
-    deque(iterator start_, iterator end_) : deque_base(start_, end_) {}  \
-    deque& operator=(const deque& x) {  \
-      deque_base::operator=(x);  \
-      return *this;  \
-    } \
-  }; \
-}
+    deque(iterator start_, iterator end_) : deque_base(start_, end_) {}                           \
+    deque& operator=(const deque& x) {                                                            \
+      deque_base::operator=(x);                                                                   \
+      return *this;                                                                               \
+    }                                                                                             \
+  };                                                                                              \
+  }
 
-#endif // EIGEN_STDDEQUE_H
+#endif  // EIGEN_STDDEQUE_H
diff --git a/Eigen/src/StlSupport/StdList.h b/Eigen/src/StlSupport/StdList.h
index da36677..26395df 100644
--- a/Eigen/src/StlSupport/StdList.h
+++ b/Eigen/src/StlSupport/StdList.h
@@ -21,30 +21,30 @@
  * std::list such that for data types with alignment issues the correct allocator
  * is used automatically.
  */
-#define EIGEN_DEFINE_STL_LIST_SPECIALIZATION(...) \
-namespace std \
-{ \
-  template<> \
-  class list<__VA_ARGS__, std::allocator<__VA_ARGS__> >           \
-    : public list<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > \
-  { \
-    typedef list<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > list_base; \
-  public: \
-    typedef __VA_ARGS__ value_type; \
-    typedef list_base::allocator_type allocator_type; \
-    typedef list_base::size_type size_type;  \
-    typedef list_base::iterator iterator;  \
-    explicit list(const allocator_type& a = allocator_type()) : list_base(a) {}  \
-    template<typename InputIterator> \
-    list(InputIterator first, InputIterator last, const allocator_type& a = allocator_type()) : list_base(first, last, a) {} \
-    list(const list& c) : list_base(c) {}  \
+#define EIGEN_DEFINE_STL_LIST_SPECIALIZATION(...)                                               \
+  namespace std {                                                                               \
+  template <>                                                                                   \
+  class list<__VA_ARGS__, std::allocator<__VA_ARGS__> >                                         \
+      : public list<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > {                       \
+    typedef list<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > list_base;                 \
+                                                                                                \
+   public:                                                                                      \
+    typedef __VA_ARGS__ value_type;                                                             \
+    typedef list_base::allocator_type allocator_type;                                           \
+    typedef list_base::size_type size_type;                                                     \
+    typedef list_base::iterator iterator;                                                       \
+    explicit list(const allocator_type& a = allocator_type()) : list_base(a) {}                 \
+    template <typename InputIterator>                                                           \
+    list(InputIterator first, InputIterator last, const allocator_type& a = allocator_type())   \
+        : list_base(first, last, a) {}                                                          \
+    list(const list& c) : list_base(c) {}                                                       \
     explicit list(size_type num, const value_type& val = value_type()) : list_base(num, val) {} \
-    list(iterator start_, iterator end_) : list_base(start_, end_) {}  \
-    list& operator=(const list& x) {  \
-      list_base::operator=(x);  \
-      return *this;  \
-    } \
-  }; \
-}
+    list(iterator start_, iterator end_) : list_base(start_, end_) {}                           \
+    list& operator=(const list& x) {                                                            \
+      list_base::operator=(x);                                                                  \
+      return *this;                                                                             \
+    }                                                                                           \
+  };                                                                                            \
+  }
 
-#endif // EIGEN_STDLIST_H
+#endif  // EIGEN_STDLIST_H
diff --git a/Eigen/src/StlSupport/StdVector.h b/Eigen/src/StlSupport/StdVector.h
index 02dfb39..dd538e9 100644
--- a/Eigen/src/StlSupport/StdVector.h
+++ b/Eigen/src/StlSupport/StdVector.h
@@ -22,30 +22,30 @@
  * std::vector such that for data types with alignment issues the correct allocator
  * is used automatically.
  */
-#define EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(...) \
-namespace std \
-{ \
-  template<> \
-  class vector<__VA_ARGS__, std::allocator<__VA_ARGS__> >  \
-    : public vector<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > \
-  { \
-    typedef vector<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > vector_base; \
-  public: \
-    typedef __VA_ARGS__ value_type; \
-    typedef vector_base::allocator_type allocator_type; \
-    typedef vector_base::size_type size_type;  \
-    typedef vector_base::iterator iterator;  \
-    explicit vector(const allocator_type& a = allocator_type()) : vector_base(a) {}  \
-    template<typename InputIterator> \
-    vector(InputIterator first, InputIterator last, const allocator_type& a = allocator_type()) : vector_base(first, last, a) {} \
-    vector(const vector& c) : vector_base(c) {}  \
+#define EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(...)                                                 \
+  namespace std {                                                                                   \
+  template <>                                                                                       \
+  class vector<__VA_ARGS__, std::allocator<__VA_ARGS__> >                                           \
+      : public vector<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > {                         \
+    typedef vector<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > vector_base;                 \
+                                                                                                    \
+   public:                                                                                          \
+    typedef __VA_ARGS__ value_type;                                                                 \
+    typedef vector_base::allocator_type allocator_type;                                             \
+    typedef vector_base::size_type size_type;                                                       \
+    typedef vector_base::iterator iterator;                                                         \
+    explicit vector(const allocator_type& a = allocator_type()) : vector_base(a) {}                 \
+    template <typename InputIterator>                                                               \
+    vector(InputIterator first, InputIterator last, const allocator_type& a = allocator_type())     \
+        : vector_base(first, last, a) {}                                                            \
+    vector(const vector& c) : vector_base(c) {}                                                     \
     explicit vector(size_type num, const value_type& val = value_type()) : vector_base(num, val) {} \
-    vector(iterator start_, iterator end_) : vector_base(start_, end_) {}  \
-    vector& operator=(const vector& x) {  \
-      vector_base::operator=(x);  \
-      return *this;  \
-    } \
-  }; \
-}
+    vector(iterator start_, iterator end_) : vector_base(start_, end_) {}                           \
+    vector& operator=(const vector& x) {                                                            \
+      vector_base::operator=(x);                                                                    \
+      return *this;                                                                                 \
+    }                                                                                               \
+  };                                                                                                \
+  }
 
-#endif // EIGEN_STDVECTOR_H
+#endif  // EIGEN_STDVECTOR_H
diff --git a/Eigen/src/StlSupport/details.h b/Eigen/src/StlSupport/details.h
index 29fd871..9bc9d21 100644
--- a/Eigen/src/StlSupport/details.h
+++ b/Eigen/src/StlSupport/details.h
@@ -12,62 +12,64 @@
 #define EIGEN_STL_DETAILS_H
 
 #ifndef EIGEN_ALIGNED_ALLOCATOR
-  #define EIGEN_ALIGNED_ALLOCATOR Eigen::aligned_allocator
+#define EIGEN_ALIGNED_ALLOCATOR Eigen::aligned_allocator
 #endif
 
 namespace Eigen {
 
-  // This one is needed to prevent reimplementing the whole std::vector.
-  template <class T>
-  class aligned_allocator_indirection : public EIGEN_ALIGNED_ALLOCATOR<T>
-  {
-  public:
-    typedef std::size_t     size_type;
-    typedef std::ptrdiff_t  difference_type;
-    typedef T*              pointer;
-    typedef const T*        const_pointer;
-    typedef T&              reference;
-    typedef const T&        const_reference;
-    typedef T               value_type;
+// This one is needed to prevent reimplementing the whole std::vector.
+template <class T>
+class aligned_allocator_indirection : public EIGEN_ALIGNED_ALLOCATOR<T> {
+ public:
+  typedef std::size_t size_type;
+  typedef std::ptrdiff_t difference_type;
+  typedef T* pointer;
+  typedef const T* const_pointer;
+  typedef T& reference;
+  typedef const T& const_reference;
+  typedef T value_type;
 
-    template<class U>
-    struct rebind
-    {
-      typedef aligned_allocator_indirection<U> other;
-    };
-
-    aligned_allocator_indirection() {}
-    aligned_allocator_indirection(const aligned_allocator_indirection& ) : EIGEN_ALIGNED_ALLOCATOR<T>() {}
-    aligned_allocator_indirection(const EIGEN_ALIGNED_ALLOCATOR<T>& ) {}
-    template<class U>
-    aligned_allocator_indirection(const aligned_allocator_indirection<U>& ) {}
-    template<class U>
-    aligned_allocator_indirection(const EIGEN_ALIGNED_ALLOCATOR<U>& ) {}
-    ~aligned_allocator_indirection() {}
+  template <class U>
+  struct rebind {
+    typedef aligned_allocator_indirection<U> other;
   };
 
+  aligned_allocator_indirection() {}
+  aligned_allocator_indirection(const aligned_allocator_indirection&) : EIGEN_ALIGNED_ALLOCATOR<T>() {}
+  aligned_allocator_indirection(const EIGEN_ALIGNED_ALLOCATOR<T>&) {}
+  template <class U>
+  aligned_allocator_indirection(const aligned_allocator_indirection<U>&) {}
+  template <class U>
+  aligned_allocator_indirection(const EIGEN_ALIGNED_ALLOCATOR<U>&) {}
+  ~aligned_allocator_indirection() {}
+};
+
 #if EIGEN_COMP_MSVC
 
-  // sometimes, MSVC detects, at compile time, that the argument x
-  // in std::vector::resize(size_t s,T x) won't be aligned and generate an error
-  // even if this function is never called. Whence this little wrapper.
+// sometimes, MSVC detects, at compile time, that the argument x
+// in std::vector::resize(size_t s,T x) won't be aligned and generate an error
+// even if this function is never called. Whence this little wrapper.
 #define EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T) \
   std::conditional_t<Eigen::internal::is_arithmetic<T>::value, T, Eigen::internal::workaround_msvc_stl_support<T> >
 
-  namespace internal {
-  template<typename T> struct workaround_msvc_stl_support : public T
-  {
-    inline workaround_msvc_stl_support() : T() {}
-    inline workaround_msvc_stl_support(const T& other) : T(other) {}
-    inline operator T& () { return *static_cast<T*>(this); }
-    inline operator const T& () const { return *static_cast<const T*>(this); }
-    template<typename OtherT>
-    inline T& operator=(const OtherT& other)
-    { T::operator=(other); return *this; }
-    inline workaround_msvc_stl_support& operator=(const workaround_msvc_stl_support& other)
-    { T::operator=(other); return *this; }
-  };
+namespace internal {
+template <typename T>
+struct workaround_msvc_stl_support : public T {
+  inline workaround_msvc_stl_support() : T() {}
+  inline workaround_msvc_stl_support(const T& other) : T(other) {}
+  inline operator T&() { return *static_cast<T*>(this); }
+  inline operator const T&() const { return *static_cast<const T*>(this); }
+  template <typename OtherT>
+  inline T& operator=(const OtherT& other) {
+    T::operator=(other);
+    return *this;
   }
+  inline workaround_msvc_stl_support& operator=(const workaround_msvc_stl_support& other) {
+    T::operator=(other);
+    return *this;
+  }
+};
+}  // namespace internal
 
 #else
 
@@ -75,6 +77,6 @@
 
 #endif
 
-}
+}  // namespace Eigen
 
-#endif // EIGEN_STL_DETAILS_H
+#endif  // EIGEN_STL_DETAILS_H
diff --git a/Eigen/src/SuperLUSupport/SuperLUSupport.h b/Eigen/src/SuperLUSupport/SuperLUSupport.h
index 419d7d8..0c10149 100644
--- a/Eigen/src/SuperLUSupport/SuperLUSupport.h
+++ b/Eigen/src/SuperLUSupport/SuperLUSupport.h
@@ -16,58 +16,47 @@
 namespace Eigen {
 
 #if defined(SUPERLU_MAJOR_VERSION) && (SUPERLU_MAJOR_VERSION >= 5)
-#define DECL_GSSVX(PREFIX,FLOATTYPE,KEYTYPE)		\
-    extern "C" {                                                                                          \
-      extern void PREFIX##gssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *,                  \
-                                char *, FLOATTYPE *, FLOATTYPE *, SuperMatrix *, SuperMatrix *,           \
-                                void *, int, SuperMatrix *, SuperMatrix *,                                \
-                                FLOATTYPE *, FLOATTYPE *, FLOATTYPE *, FLOATTYPE *,                       \
-                                GlobalLU_t *, mem_usage_t *, SuperLUStat_t *, int *);                     \
-    }                                                                                                     \
-    inline float SuperLU_gssvx(superlu_options_t *options, SuperMatrix *A,                                \
-         int *perm_c, int *perm_r, int *etree, char *equed,                                               \
-         FLOATTYPE *R, FLOATTYPE *C, SuperMatrix *L,                                                      \
-         SuperMatrix *U, void *work, int lwork,                                                           \
-         SuperMatrix *B, SuperMatrix *X,                                                                  \
-         FLOATTYPE *recip_pivot_growth,                                                                   \
-         FLOATTYPE *rcond, FLOATTYPE *ferr, FLOATTYPE *berr,                                              \
-         SuperLUStat_t *stats, int *info, KEYTYPE) {                                                      \
-    mem_usage_t mem_usage;                                                                                \
-    GlobalLU_t gLU;                                                                                       \
-    PREFIX##gssvx(options, A, perm_c, perm_r, etree, equed, R, C, L,                                      \
-         U, work, lwork, B, X, recip_pivot_growth, rcond,                                                 \
-         ferr, berr, &gLU, &mem_usage, stats, info);                                                      \
-    return mem_usage.for_lu; /* bytes used by the factor storage */                                       \
+#define DECL_GSSVX(PREFIX, FLOATTYPE, KEYTYPE)                                                                         \
+  extern "C" {                                                                                                         \
+  extern void PREFIX##gssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *, char *, FLOATTYPE *, FLOATTYPE *, \
+                            SuperMatrix *, SuperMatrix *, void *, int, SuperMatrix *, SuperMatrix *, FLOATTYPE *,      \
+                            FLOATTYPE *, FLOATTYPE *, FLOATTYPE *, GlobalLU_t *, mem_usage_t *, SuperLUStat_t *,       \
+                            int *);                                                                                    \
+  }                                                                                                                    \
+  inline float SuperLU_gssvx(superlu_options_t *options, SuperMatrix *A, int *perm_c, int *perm_r, int *etree,         \
+                             char *equed, FLOATTYPE *R, FLOATTYPE *C, SuperMatrix *L, SuperMatrix *U, void *work,      \
+                             int lwork, SuperMatrix *B, SuperMatrix *X, FLOATTYPE *recip_pivot_growth,                 \
+                             FLOATTYPE *rcond, FLOATTYPE *ferr, FLOATTYPE *berr, SuperLUStat_t *stats, int *info,      \
+                             KEYTYPE) {                                                                                \
+    mem_usage_t mem_usage;                                                                                             \
+    GlobalLU_t gLU;                                                                                                    \
+    PREFIX##gssvx(options, A, perm_c, perm_r, etree, equed, R, C, L, U, work, lwork, B, X, recip_pivot_growth, rcond,  \
+                  ferr, berr, &gLU, &mem_usage, stats, info);                                                          \
+    return mem_usage.for_lu; /* bytes used by the factor storage */                                                    \
   }
-#else // version < 5.0
-#define DECL_GSSVX(PREFIX,FLOATTYPE,KEYTYPE)		\
-    extern "C" {                                                                                          \
-      extern void PREFIX##gssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *,                  \
-                                char *, FLOATTYPE *, FLOATTYPE *, SuperMatrix *, SuperMatrix *,           \
-                                void *, int, SuperMatrix *, SuperMatrix *,                                \
-                                FLOATTYPE *, FLOATTYPE *, FLOATTYPE *, FLOATTYPE *,                       \
-                                mem_usage_t *, SuperLUStat_t *, int *);                                   \
-    }                                                                                                     \
-    inline float SuperLU_gssvx(superlu_options_t *options, SuperMatrix *A,                                \
-         int *perm_c, int *perm_r, int *etree, char *equed,                                               \
-         FLOATTYPE *R, FLOATTYPE *C, SuperMatrix *L,                                                      \
-         SuperMatrix *U, void *work, int lwork,                                                           \
-         SuperMatrix *B, SuperMatrix *X,                                                                  \
-         FLOATTYPE *recip_pivot_growth,                                                                   \
-         FLOATTYPE *rcond, FLOATTYPE *ferr, FLOATTYPE *berr,                                              \
-         SuperLUStat_t *stats, int *info, KEYTYPE) {                                                      \
-    mem_usage_t mem_usage;                                                                                \
-    PREFIX##gssvx(options, A, perm_c, perm_r, etree, equed, R, C, L,                                      \
-         U, work, lwork, B, X, recip_pivot_growth, rcond,                                                 \
-         ferr, berr, &mem_usage, stats, info);                                                            \
-    return mem_usage.for_lu; /* bytes used by the factor storage */                                       \
+#else  // version < 5.0
+#define DECL_GSSVX(PREFIX, FLOATTYPE, KEYTYPE)                                                                         \
+  extern "C" {                                                                                                         \
+  extern void PREFIX##gssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *, char *, FLOATTYPE *, FLOATTYPE *, \
+                            SuperMatrix *, SuperMatrix *, void *, int, SuperMatrix *, SuperMatrix *, FLOATTYPE *,      \
+                            FLOATTYPE *, FLOATTYPE *, FLOATTYPE *, mem_usage_t *, SuperLUStat_t *, int *);             \
+  }                                                                                                                    \
+  inline float SuperLU_gssvx(superlu_options_t *options, SuperMatrix *A, int *perm_c, int *perm_r, int *etree,         \
+                             char *equed, FLOATTYPE *R, FLOATTYPE *C, SuperMatrix *L, SuperMatrix *U, void *work,      \
+                             int lwork, SuperMatrix *B, SuperMatrix *X, FLOATTYPE *recip_pivot_growth,                 \
+                             FLOATTYPE *rcond, FLOATTYPE *ferr, FLOATTYPE *berr, SuperLUStat_t *stats, int *info,      \
+                             KEYTYPE) {                                                                                \
+    mem_usage_t mem_usage;                                                                                             \
+    PREFIX##gssvx(options, A, perm_c, perm_r, etree, equed, R, C, L, U, work, lwork, B, X, recip_pivot_growth, rcond,  \
+                  ferr, berr, &mem_usage, stats, info);                                                                \
+    return mem_usage.for_lu; /* bytes used by the factor storage */                                                    \
   }
 #endif
 
-DECL_GSSVX(s,float,float)
-DECL_GSSVX(c,float,std::complex<float>)
-DECL_GSSVX(d,double,double)
-DECL_GSSVX(z,double,std::complex<double>)
+DECL_GSSVX(s, float, float)
+DECL_GSSVX(c, float, std::complex<float>)
+DECL_GSSVX(d, double, double)
+DECL_GSSVX(z, double, std::complex<double>)
 
 #ifdef MILU_ALPHA
 #define EIGEN_SUPERLU_HAS_ILU
@@ -76,567 +65,499 @@
 #ifdef EIGEN_SUPERLU_HAS_ILU
 
 // similarly for the incomplete factorization using gsisx
-#define DECL_GSISX(PREFIX,FLOATTYPE,KEYTYPE)                                                    \
-    extern "C" {                                                                                \
-      extern void PREFIX##gsisx(superlu_options_t *, SuperMatrix *, int *, int *, int *,        \
-                         char *, FLOATTYPE *, FLOATTYPE *, SuperMatrix *, SuperMatrix *,        \
-                         void *, int, SuperMatrix *, SuperMatrix *, FLOATTYPE *, FLOATTYPE *,   \
-                         mem_usage_t *, SuperLUStat_t *, int *);                        \
-    }                                                                                           \
-    inline float SuperLU_gsisx(superlu_options_t *options, SuperMatrix *A,                      \
-         int *perm_c, int *perm_r, int *etree, char *equed,                                     \
-         FLOATTYPE *R, FLOATTYPE *C, SuperMatrix *L,                                            \
-         SuperMatrix *U, void *work, int lwork,                                                 \
-         SuperMatrix *B, SuperMatrix *X,                                                        \
-         FLOATTYPE *recip_pivot_growth,                                                         \
-         FLOATTYPE *rcond,                                                                      \
-         SuperLUStat_t *stats, int *info, KEYTYPE) {                                            \
-    mem_usage_t mem_usage;                                                              \
-    PREFIX##gsisx(options, A, perm_c, perm_r, etree, equed, R, C, L,                            \
-         U, work, lwork, B, X, recip_pivot_growth, rcond,                                       \
-         &mem_usage, stats, info);                                                              \
-    return mem_usage.for_lu; /* bytes used by the factor storage */                             \
+#define DECL_GSISX(PREFIX, FLOATTYPE, KEYTYPE)                                                                         \
+  extern "C" {                                                                                                         \
+  extern void PREFIX##gsisx(superlu_options_t *, SuperMatrix *, int *, int *, int *, char *, FLOATTYPE *, FLOATTYPE *, \
+                            SuperMatrix *, SuperMatrix *, void *, int, SuperMatrix *, SuperMatrix *, FLOATTYPE *,      \
+                            FLOATTYPE *, mem_usage_t *, SuperLUStat_t *, int *);                                       \
+  }                                                                                                                    \
+  inline float SuperLU_gsisx(superlu_options_t *options, SuperMatrix *A, int *perm_c, int *perm_r, int *etree,         \
+                             char *equed, FLOATTYPE *R, FLOATTYPE *C, SuperMatrix *L, SuperMatrix *U, void *work,      \
+                             int lwork, SuperMatrix *B, SuperMatrix *X, FLOATTYPE *recip_pivot_growth,                 \
+                             FLOATTYPE *rcond, SuperLUStat_t *stats, int *info, KEYTYPE) {                             \
+    mem_usage_t mem_usage;                                                                                             \
+    PREFIX##gsisx(options, A, perm_c, perm_r, etree, equed, R, C, L, U, work, lwork, B, X, recip_pivot_growth, rcond,  \
+                  &mem_usage, stats, info);                                                                            \
+    return mem_usage.for_lu; /* bytes used by the factor storage */                                                    \
   }
 
-DECL_GSISX(s,float,float)
-DECL_GSISX(c,float,std::complex<float>)
-DECL_GSISX(d,double,double)
-DECL_GSISX(z,double,std::complex<double>)
+DECL_GSISX(s, float, float)
+DECL_GSISX(c, float, std::complex<float>)
+DECL_GSISX(d, double, double)
+DECL_GSISX(z, double, std::complex<double>)
 
 #endif
 
-template<typename MatrixType>
+template <typename MatrixType>
 struct SluMatrixMapHelper;
 
 /** \internal
-  *
-  * A wrapper class for SuperLU matrices. It supports only compressed sparse matrices
-  * and dense matrices. Supernodal and other fancy format are not supported by this wrapper.
-  *
-  * This wrapper class mainly aims to avoids the need of dynamic allocation of the storage structure.
-  */
-struct SluMatrix : SuperMatrix
-{
-  SluMatrix()
-  {
-    Store = &storage;
-  }
+ *
+ * A wrapper class for SuperLU matrices. It supports only compressed sparse matrices
+ * and dense matrices. Supernodal and other fancy format are not supported by this wrapper.
+ *
+ * This wrapper class mainly aims to avoids the need of dynamic allocation of the storage structure.
+ */
+struct SluMatrix : SuperMatrix {
+  SluMatrix() { Store = &storage; }
 
-  SluMatrix(const SluMatrix& other)
-    : SuperMatrix(other)
-  {
+  SluMatrix(const SluMatrix &other) : SuperMatrix(other) {
     Store = &storage;
     storage = other.storage;
   }
 
-  SluMatrix& operator=(const SluMatrix& other)
-  {
-    SuperMatrix::operator=(static_cast<const SuperMatrix&>(other));
+  SluMatrix &operator=(const SluMatrix &other) {
+    SuperMatrix::operator=(static_cast<const SuperMatrix &>(other));
     Store = &storage;
     storage = other.storage;
     return *this;
   }
 
-  struct
-  {
-    union {int nnz;int lda;};
+  struct {
+    union {
+      int nnz;
+      int lda;
+    };
     void *values;
     int *innerInd;
     int *outerInd;
   } storage;
 
-  void setStorageType(Stype_t t)
-  {
+  void setStorageType(Stype_t t) {
     Stype = t;
-    if (t==SLU_NC || t==SLU_NR || t==SLU_DN)
+    if (t == SLU_NC || t == SLU_NR || t == SLU_DN)
       Store = &storage;
-    else
-    {
+    else {
       eigen_assert(false && "storage type not supported");
       Store = 0;
     }
   }
 
-  template<typename Scalar>
-  void setScalarType()
-  {
-    if (internal::is_same<Scalar,float>::value)
+  template <typename Scalar>
+  void setScalarType() {
+    if (internal::is_same<Scalar, float>::value)
       Dtype = SLU_S;
-    else if (internal::is_same<Scalar,double>::value)
+    else if (internal::is_same<Scalar, double>::value)
       Dtype = SLU_D;
-    else if (internal::is_same<Scalar,std::complex<float> >::value)
+    else if (internal::is_same<Scalar, std::complex<float> >::value)
       Dtype = SLU_C;
-    else if (internal::is_same<Scalar,std::complex<double> >::value)
+    else if (internal::is_same<Scalar, std::complex<double> >::value)
       Dtype = SLU_Z;
-    else
-    {
+    else {
       eigen_assert(false && "Scalar type not supported by SuperLU");
     }
   }
 
-  template<typename MatrixType>
-  static SluMatrix Map(MatrixBase<MatrixType>& _mat)
-  {
-    MatrixType& mat(_mat.derived());
-    eigen_assert( ((MatrixType::Flags&RowMajorBit)!=RowMajorBit) && "row-major dense matrices are not supported by SuperLU");
+  template <typename MatrixType>
+  static SluMatrix Map(MatrixBase<MatrixType> &_mat) {
+    MatrixType &mat(_mat.derived());
+    eigen_assert(((MatrixType::Flags & RowMajorBit) != RowMajorBit) &&
+                 "row-major dense matrices are not supported by SuperLU");
     SluMatrix res;
     res.setStorageType(SLU_DN);
     res.setScalarType<typename MatrixType::Scalar>();
-    res.Mtype     = SLU_GE;
+    res.Mtype = SLU_GE;
 
-    res.nrow      = internal::convert_index<int>(mat.rows());
-    res.ncol      = internal::convert_index<int>(mat.cols());
+    res.nrow = internal::convert_index<int>(mat.rows());
+    res.ncol = internal::convert_index<int>(mat.cols());
 
-    res.storage.lda       = internal::convert_index<int>(MatrixType::IsVectorAtCompileTime ? mat.size() : mat.outerStride());
-    res.storage.values    = (void*)(mat.data());
+    res.storage.lda = internal::convert_index<int>(MatrixType::IsVectorAtCompileTime ? mat.size() : mat.outerStride());
+    res.storage.values = (void *)(mat.data());
     return res;
   }
 
-  template<typename MatrixType>
-  static SluMatrix Map(SparseMatrixBase<MatrixType>& a_mat)
-  {
+  template <typename MatrixType>
+  static SluMatrix Map(SparseMatrixBase<MatrixType> &a_mat) {
     MatrixType &mat(a_mat.derived());
     SluMatrix res;
-    if ((MatrixType::Flags&RowMajorBit)==RowMajorBit)
-    {
+    if ((MatrixType::Flags & RowMajorBit) == RowMajorBit) {
       res.setStorageType(SLU_NR);
-      res.nrow      = internal::convert_index<int>(mat.cols());
-      res.ncol      = internal::convert_index<int>(mat.rows());
-    }
-    else
-    {
+      res.nrow = internal::convert_index<int>(mat.cols());
+      res.ncol = internal::convert_index<int>(mat.rows());
+    } else {
       res.setStorageType(SLU_NC);
-      res.nrow      = internal::convert_index<int>(mat.rows());
-      res.ncol      = internal::convert_index<int>(mat.cols());
+      res.nrow = internal::convert_index<int>(mat.rows());
+      res.ncol = internal::convert_index<int>(mat.cols());
     }
 
-    res.Mtype       = SLU_GE;
+    res.Mtype = SLU_GE;
 
-    res.storage.nnz       = internal::convert_index<int>(mat.nonZeros());
-    res.storage.values    = mat.valuePtr();
-    res.storage.innerInd  = mat.innerIndexPtr();
-    res.storage.outerInd  = mat.outerIndexPtr();
+    res.storage.nnz = internal::convert_index<int>(mat.nonZeros());
+    res.storage.values = mat.valuePtr();
+    res.storage.innerInd = mat.innerIndexPtr();
+    res.storage.outerInd = mat.outerIndexPtr();
 
     res.setScalarType<typename MatrixType::Scalar>();
 
     // FIXME the following is not very accurate
-    if (int(MatrixType::Flags) & int(Upper))
-      res.Mtype = SLU_TRU;
-    if (int(MatrixType::Flags) & int(Lower))
-      res.Mtype = SLU_TRL;
+    if (int(MatrixType::Flags) & int(Upper)) res.Mtype = SLU_TRU;
+    if (int(MatrixType::Flags) & int(Lower)) res.Mtype = SLU_TRL;
 
-    eigen_assert(((int(MatrixType::Flags) & int(SelfAdjoint))==0) && "SelfAdjoint matrix shape not supported by SuperLU");
+    eigen_assert(((int(MatrixType::Flags) & int(SelfAdjoint)) == 0) &&
+                 "SelfAdjoint matrix shape not supported by SuperLU");
 
     return res;
   }
 };
 
-template<typename Scalar, int Rows, int Cols, int Options, int MRows, int MCols>
-struct SluMatrixMapHelper<Matrix<Scalar,Rows,Cols,Options,MRows,MCols> >
-{
-  typedef Matrix<Scalar,Rows,Cols,Options,MRows,MCols> MatrixType;
-  static void run(MatrixType& mat, SluMatrix& res)
-  {
-    eigen_assert( ((Options&RowMajor)!=RowMajor) && "row-major dense matrices is not supported by SuperLU");
+template <typename Scalar, int Rows, int Cols, int Options, int MRows, int MCols>
+struct SluMatrixMapHelper<Matrix<Scalar, Rows, Cols, Options, MRows, MCols> > {
+  typedef Matrix<Scalar, Rows, Cols, Options, MRows, MCols> MatrixType;
+  static void run(MatrixType &mat, SluMatrix &res) {
+    eigen_assert(((Options & RowMajor) != RowMajor) && "row-major dense matrices is not supported by SuperLU");
     res.setStorageType(SLU_DN);
     res.setScalarType<Scalar>();
-    res.Mtype     = SLU_GE;
+    res.Mtype = SLU_GE;
 
-    res.nrow      = mat.rows();
-    res.ncol      = mat.cols();
+    res.nrow = mat.rows();
+    res.ncol = mat.cols();
 
-    res.storage.lda       = mat.outerStride();
-    res.storage.values    = mat.data();
+    res.storage.lda = mat.outerStride();
+    res.storage.values = mat.data();
   }
 };
 
-template<typename Derived>
-struct SluMatrixMapHelper<SparseMatrixBase<Derived> >
-{
+template <typename Derived>
+struct SluMatrixMapHelper<SparseMatrixBase<Derived> > {
   typedef Derived MatrixType;
-  static void run(MatrixType& mat, SluMatrix& res)
-  {
-    if ((MatrixType::Flags&RowMajorBit)==RowMajorBit)
-    {
+  static void run(MatrixType &mat, SluMatrix &res) {
+    if ((MatrixType::Flags & RowMajorBit) == RowMajorBit) {
       res.setStorageType(SLU_NR);
-      res.nrow      = mat.cols();
-      res.ncol      = mat.rows();
-    }
-    else
-    {
+      res.nrow = mat.cols();
+      res.ncol = mat.rows();
+    } else {
       res.setStorageType(SLU_NC);
-      res.nrow      = mat.rows();
-      res.ncol      = mat.cols();
+      res.nrow = mat.rows();
+      res.ncol = mat.cols();
     }
 
-    res.Mtype       = SLU_GE;
+    res.Mtype = SLU_GE;
 
-    res.storage.nnz       = mat.nonZeros();
-    res.storage.values    = mat.valuePtr();
-    res.storage.innerInd  = mat.innerIndexPtr();
-    res.storage.outerInd  = mat.outerIndexPtr();
+    res.storage.nnz = mat.nonZeros();
+    res.storage.values = mat.valuePtr();
+    res.storage.innerInd = mat.innerIndexPtr();
+    res.storage.outerInd = mat.outerIndexPtr();
 
     res.setScalarType<typename MatrixType::Scalar>();
 
     // FIXME the following is not very accurate
-    if (MatrixType::Flags & Upper)
-      res.Mtype = SLU_TRU;
-    if (MatrixType::Flags & Lower)
-      res.Mtype = SLU_TRL;
+    if (MatrixType::Flags & Upper) res.Mtype = SLU_TRU;
+    if (MatrixType::Flags & Lower) res.Mtype = SLU_TRL;
 
-    eigen_assert(((MatrixType::Flags & SelfAdjoint)==0) && "SelfAdjoint matrix shape not supported by SuperLU");
+    eigen_assert(((MatrixType::Flags & SelfAdjoint) == 0) && "SelfAdjoint matrix shape not supported by SuperLU");
   }
 };
 
 namespace internal {
 
-template<typename MatrixType>
-SluMatrix asSluMatrix(MatrixType& mat)
-{
+template <typename MatrixType>
+SluMatrix asSluMatrix(MatrixType &mat) {
   return SluMatrix::Map(mat);
 }
 
 /** View a Super LU matrix as an Eigen expression */
-template<typename Scalar, int Flags, typename Index>
-Map<SparseMatrix<Scalar,Flags,Index> > map_superlu(SluMatrix& sluMat)
-{
-  eigen_assert(((Flags&RowMajor)==RowMajor && sluMat.Stype == SLU_NR)
-         || ((Flags&ColMajor)==ColMajor && sluMat.Stype == SLU_NC));
+template <typename Scalar, int Flags, typename Index>
+Map<SparseMatrix<Scalar, Flags, Index> > map_superlu(SluMatrix &sluMat) {
+  eigen_assert(((Flags & RowMajor) == RowMajor && sluMat.Stype == SLU_NR) ||
+               ((Flags & ColMajor) == ColMajor && sluMat.Stype == SLU_NC));
 
-  Index outerSize = (Flags&RowMajor)==RowMajor ? sluMat.ncol : sluMat.nrow;
+  Index outerSize = (Flags & RowMajor) == RowMajor ? sluMat.ncol : sluMat.nrow;
 
-  return Map<SparseMatrix<Scalar,Flags,Index> >(
-    sluMat.nrow, sluMat.ncol, sluMat.storage.outerInd[outerSize],
-    sluMat.storage.outerInd, sluMat.storage.innerInd, reinterpret_cast<Scalar*>(sluMat.storage.values) );
+  return Map<SparseMatrix<Scalar, Flags, Index> >(sluMat.nrow, sluMat.ncol, sluMat.storage.outerInd[outerSize],
+                                                  sluMat.storage.outerInd, sluMat.storage.innerInd,
+                                                  reinterpret_cast<Scalar *>(sluMat.storage.values));
 }
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \ingroup SuperLUSupport_Module
-  * \class SuperLUBase
-  * \brief The base class for the direct and incomplete LU factorization of SuperLU
-  */
-template<typename MatrixType_, typename Derived>
-class SuperLUBase : public SparseSolverBase<Derived>
-{
-  protected:
-    typedef SparseSolverBase<Derived> Base;
-    using Base::derived;
-    using Base::m_isInitialized;
-  public:
-    typedef MatrixType_ MatrixType;
-    typedef typename MatrixType::Scalar Scalar;
-    typedef typename MatrixType::RealScalar RealScalar;
-    typedef typename MatrixType::StorageIndex StorageIndex;
-    typedef Matrix<Scalar,Dynamic,1> Vector;
-    typedef Matrix<int, 1, MatrixType::ColsAtCompileTime> IntRowVectorType;
-    typedef Matrix<int, MatrixType::RowsAtCompileTime, 1> IntColVectorType;    
-    typedef Map<PermutationMatrix<Dynamic,Dynamic,int> > PermutationMap;
-    typedef SparseMatrix<Scalar> LUMatrixType;
-    enum {
-      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
-      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
-    };
+ * \class SuperLUBase
+ * \brief The base class for the direct and incomplete LU factorization of SuperLU
+ */
+template <typename MatrixType_, typename Derived>
+class SuperLUBase : public SparseSolverBase<Derived> {
+ protected:
+  typedef SparseSolverBase<Derived> Base;
+  using Base::derived;
+  using Base::m_isInitialized;
 
-  public:
+ public:
+  typedef MatrixType_ MatrixType;
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::RealScalar RealScalar;
+  typedef typename MatrixType::StorageIndex StorageIndex;
+  typedef Matrix<Scalar, Dynamic, 1> Vector;
+  typedef Matrix<int, 1, MatrixType::ColsAtCompileTime> IntRowVectorType;
+  typedef Matrix<int, MatrixType::RowsAtCompileTime, 1> IntColVectorType;
+  typedef Map<PermutationMatrix<Dynamic, Dynamic, int> > PermutationMap;
+  typedef SparseMatrix<Scalar> LUMatrixType;
+  enum { ColsAtCompileTime = MatrixType::ColsAtCompileTime, MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime };
 
-    SuperLUBase() {}
+ public:
+  SuperLUBase() {}
 
-    ~SuperLUBase()
-    {
-      clearFactors();
-    }
-    
-    inline Index rows() const { return m_matrix.rows(); }
-    inline Index cols() const { return m_matrix.cols(); }
-    
-    /** \returns a reference to the Super LU option object to configure the  Super LU algorithms. */
-    inline superlu_options_t& options() { return m_sluOptions; }
-    
-    /** \brief Reports whether previous computation was successful.
-      *
-      * \returns \c Success if computation was successful,
-      *          \c NumericalIssue if the matrix.appears to be negative.
-      */
-    ComputationInfo info() const
-    {
-      eigen_assert(m_isInitialized && "Decomposition is not initialized.");
-      return m_info;
-    }
+  ~SuperLUBase() { clearFactors(); }
 
-    /** Computes the sparse Cholesky decomposition of \a matrix */
-    void compute(const MatrixType& matrix)
-    {
-      derived().analyzePattern(matrix);
-      derived().factorize(matrix);
-    }
+  inline Index rows() const { return m_matrix.rows(); }
+  inline Index cols() const { return m_matrix.cols(); }
 
-    /** Performs a symbolic decomposition on the sparcity of \a matrix.
-      *
-      * This function is particularly useful when solving for several problems having the same structure.
-      * 
-      * \sa factorize()
-      */
-    void analyzePattern(const MatrixType& /*matrix*/)
-    {
-      m_isInitialized = true;
-      m_info = Success;
-      m_analysisIsOk = true;
-      m_factorizationIsOk = false;
-    }
-    
-    template<typename Stream>
-    void dumpMemory(Stream& /*s*/)
-    {}
-    
-  protected:
-    
-    void initFactorization(const MatrixType& a)
-    {
-      set_default_options(&this->m_sluOptions);
-      
-      const Index size = a.rows();
-      m_matrix = a;
+  /** \returns a reference to the Super LU option object to configure the  Super LU algorithms. */
+  inline superlu_options_t &options() { return m_sluOptions; }
 
-      m_sluA = internal::asSluMatrix(m_matrix);
-      clearFactors();
+  /** \brief Reports whether previous computation was successful.
+   *
+   * \returns \c Success if computation was successful,
+   *          \c NumericalIssue if the matrix.appears to be negative.
+   */
+  ComputationInfo info() const {
+    eigen_assert(m_isInitialized && "Decomposition is not initialized.");
+    return m_info;
+  }
 
-      m_p.resize(size);
-      m_q.resize(size);
-      m_sluRscale.resize(size);
-      m_sluCscale.resize(size);
-      m_sluEtree.resize(size);
+  /** Computes the sparse Cholesky decomposition of \a matrix */
+  void compute(const MatrixType &matrix) {
+    derived().analyzePattern(matrix);
+    derived().factorize(matrix);
+  }
 
-      // set empty B and X
-      m_sluB.setStorageType(SLU_DN);
-      m_sluB.setScalarType<Scalar>();
-      m_sluB.Mtype          = SLU_GE;
-      m_sluB.storage.values = 0;
-      m_sluB.nrow           = 0;
-      m_sluB.ncol           = 0;
-      m_sluB.storage.lda    = internal::convert_index<int>(size);
-      m_sluX                = m_sluB;
-      
-      m_extractedDataAreDirty = true;
-    }
-    
-    void init()
-    {
-      m_info = InvalidInput;
-      m_isInitialized = false;
-      m_sluL.Store = 0;
-      m_sluU.Store = 0;
-    }
-    
-    void extractData() const;
+  /** Performs a symbolic decomposition on the sparcity of \a matrix.
+   *
+   * This function is particularly useful when solving for several problems having the same structure.
+   *
+   * \sa factorize()
+   */
+  void analyzePattern(const MatrixType & /*matrix*/) {
+    m_isInitialized = true;
+    m_info = Success;
+    m_analysisIsOk = true;
+    m_factorizationIsOk = false;
+  }
 
-    void clearFactors()
-    {
-      if(m_sluL.Store)
-        Destroy_SuperNode_Matrix(&m_sluL);
-      if(m_sluU.Store)
-        Destroy_CompCol_Matrix(&m_sluU);
+  template <typename Stream>
+  void dumpMemory(Stream & /*s*/) {}
 
-      m_sluL.Store = 0;
-      m_sluU.Store = 0;
+ protected:
+  void initFactorization(const MatrixType &a) {
+    set_default_options(&this->m_sluOptions);
 
-      memset(&m_sluL,0,sizeof m_sluL);
-      memset(&m_sluU,0,sizeof m_sluU);
-    }
+    const Index size = a.rows();
+    m_matrix = a;
 
-    // cached data to reduce reallocation, etc.
-    mutable LUMatrixType m_l;
-    mutable LUMatrixType m_u;
-    mutable IntColVectorType m_p;
-    mutable IntRowVectorType m_q;
+    m_sluA = internal::asSluMatrix(m_matrix);
+    clearFactors();
 
-    mutable LUMatrixType m_matrix;  // copy of the factorized matrix
-    mutable SluMatrix m_sluA;
-    mutable SuperMatrix m_sluL, m_sluU;
-    mutable SluMatrix m_sluB, m_sluX;
-    mutable SuperLUStat_t m_sluStat;
-    mutable superlu_options_t m_sluOptions;
-    mutable std::vector<int> m_sluEtree;
-    mutable Matrix<RealScalar,Dynamic,1> m_sluRscale, m_sluCscale;
-    mutable Matrix<RealScalar,Dynamic,1> m_sluFerr, m_sluBerr;
-    mutable char m_sluEqued;
+    m_p.resize(size);
+    m_q.resize(size);
+    m_sluRscale.resize(size);
+    m_sluCscale.resize(size);
+    m_sluEtree.resize(size);
 
-    mutable ComputationInfo m_info;
-    int m_factorizationIsOk;
-    int m_analysisIsOk;
-    mutable bool m_extractedDataAreDirty;
-    
-  private:
-    SuperLUBase(SuperLUBase& ) { }
+    // set empty B and X
+    m_sluB.setStorageType(SLU_DN);
+    m_sluB.setScalarType<Scalar>();
+    m_sluB.Mtype = SLU_GE;
+    m_sluB.storage.values = 0;
+    m_sluB.nrow = 0;
+    m_sluB.ncol = 0;
+    m_sluB.storage.lda = internal::convert_index<int>(size);
+    m_sluX = m_sluB;
+
+    m_extractedDataAreDirty = true;
+  }
+
+  void init() {
+    m_info = InvalidInput;
+    m_isInitialized = false;
+    m_sluL.Store = 0;
+    m_sluU.Store = 0;
+  }
+
+  void extractData() const;
+
+  void clearFactors() {
+    if (m_sluL.Store) Destroy_SuperNode_Matrix(&m_sluL);
+    if (m_sluU.Store) Destroy_CompCol_Matrix(&m_sluU);
+
+    m_sluL.Store = 0;
+    m_sluU.Store = 0;
+
+    memset(&m_sluL, 0, sizeof m_sluL);
+    memset(&m_sluU, 0, sizeof m_sluU);
+  }
+
+  // cached data to reduce reallocation, etc.
+  mutable LUMatrixType m_l;
+  mutable LUMatrixType m_u;
+  mutable IntColVectorType m_p;
+  mutable IntRowVectorType m_q;
+
+  mutable LUMatrixType m_matrix;  // copy of the factorized matrix
+  mutable SluMatrix m_sluA;
+  mutable SuperMatrix m_sluL, m_sluU;
+  mutable SluMatrix m_sluB, m_sluX;
+  mutable SuperLUStat_t m_sluStat;
+  mutable superlu_options_t m_sluOptions;
+  mutable std::vector<int> m_sluEtree;
+  mutable Matrix<RealScalar, Dynamic, 1> m_sluRscale, m_sluCscale;
+  mutable Matrix<RealScalar, Dynamic, 1> m_sluFerr, m_sluBerr;
+  mutable char m_sluEqued;
+
+  mutable ComputationInfo m_info;
+  int m_factorizationIsOk;
+  int m_analysisIsOk;
+  mutable bool m_extractedDataAreDirty;
+
+ private:
+  SuperLUBase(SuperLUBase &) {}
 };
 
-
 /** \ingroup SuperLUSupport_Module
-  * \class SuperLU
-  * \brief A sparse direct LU factorization and solver based on the SuperLU library
-  *
-  * This class allows to solve for A.X = B sparse linear problems via a direct LU factorization
-  * using the SuperLU library. The sparse matrix A must be squared and invertible. The vectors or matrices
-  * X and B can be either dense or sparse.
-  *
-  * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
-  *
-  * \warning This class is only for the 4.x versions of SuperLU. The 3.x and 5.x versions are not supported.
-  *
-  * \implsparsesolverconcept
-  *
-  * \sa \ref TutorialSparseSolverConcept, class SparseLU
-  */
-template<typename MatrixType_>
-class SuperLU : public SuperLUBase<MatrixType_,SuperLU<MatrixType_> >
-{
-  public:
-    typedef SuperLUBase<MatrixType_,SuperLU> Base;
-    typedef MatrixType_ MatrixType;
-    typedef typename Base::Scalar Scalar;
-    typedef typename Base::RealScalar RealScalar;
-    typedef typename Base::StorageIndex StorageIndex;
-    typedef typename Base::IntRowVectorType IntRowVectorType;
-    typedef typename Base::IntColVectorType IntColVectorType;   
-    typedef typename Base::PermutationMap PermutationMap;
-    typedef typename Base::LUMatrixType LUMatrixType;
-    typedef TriangularView<LUMatrixType, Lower|UnitDiag>  LMatrixType;
-    typedef TriangularView<LUMatrixType,  Upper>          UMatrixType;
+ * \class SuperLU
+ * \brief A sparse direct LU factorization and solver based on the SuperLU library
+ *
+ * This class allows to solve for A.X = B sparse linear problems via a direct LU factorization
+ * using the SuperLU library. The sparse matrix A must be squared and invertible. The vectors or matrices
+ * X and B can be either dense or sparse.
+ *
+ * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
+ *
+ * \warning This class is only for the 4.x versions of SuperLU. The 3.x and 5.x versions are not supported.
+ *
+ * \implsparsesolverconcept
+ *
+ * \sa \ref TutorialSparseSolverConcept, class SparseLU
+ */
+template <typename MatrixType_>
+class SuperLU : public SuperLUBase<MatrixType_, SuperLU<MatrixType_> > {
+ public:
+  typedef SuperLUBase<MatrixType_, SuperLU> Base;
+  typedef MatrixType_ MatrixType;
+  typedef typename Base::Scalar Scalar;
+  typedef typename Base::RealScalar RealScalar;
+  typedef typename Base::StorageIndex StorageIndex;
+  typedef typename Base::IntRowVectorType IntRowVectorType;
+  typedef typename Base::IntColVectorType IntColVectorType;
+  typedef typename Base::PermutationMap PermutationMap;
+  typedef typename Base::LUMatrixType LUMatrixType;
+  typedef TriangularView<LUMatrixType, Lower | UnitDiag> LMatrixType;
+  typedef TriangularView<LUMatrixType, Upper> UMatrixType;
 
-  public:
-    using Base::_solve_impl;
+ public:
+  using Base::_solve_impl;
 
-    SuperLU() : Base() { init(); }
+  SuperLU() : Base() { init(); }
 
-    explicit SuperLU(const MatrixType& matrix) : Base()
-    {
-      init();
-      Base::compute(matrix);
-    }
+  explicit SuperLU(const MatrixType &matrix) : Base() {
+    init();
+    Base::compute(matrix);
+  }
 
-    ~SuperLU()
-    {
-    }
-    
-    /** Performs a symbolic decomposition on the sparcity of \a matrix.
-      *
-      * This function is particularly useful when solving for several problems having the same structure.
-      * 
-      * \sa factorize()
-      */
-    void analyzePattern(const MatrixType& matrix)
-    {
-      m_info = InvalidInput;
-      m_isInitialized = false;
-      Base::analyzePattern(matrix);
-    }
-    
-    /** Performs a numeric decomposition of \a matrix
-      *
-      * The given matrix must has the same sparcity than the matrix on which the symbolic decomposition has been performed.
-      *
-      * \sa analyzePattern()
-      */
-    void factorize(const MatrixType& matrix);
-    
-    /** \internal */
-    template<typename Rhs,typename Dest>
-    void _solve_impl(const MatrixBase<Rhs> &b, MatrixBase<Dest> &dest) const;
-    
-    inline const LMatrixType& matrixL() const
-    {
-      if (m_extractedDataAreDirty) this->extractData();
-      return m_l;
-    }
+  ~SuperLU() {}
 
-    inline const UMatrixType& matrixU() const
-    {
-      if (m_extractedDataAreDirty) this->extractData();
-      return m_u;
-    }
+  /** Performs a symbolic decomposition on the sparcity of \a matrix.
+   *
+   * This function is particularly useful when solving for several problems having the same structure.
+   *
+   * \sa factorize()
+   */
+  void analyzePattern(const MatrixType &matrix) {
+    m_info = InvalidInput;
+    m_isInitialized = false;
+    Base::analyzePattern(matrix);
+  }
 
-    inline const IntColVectorType& permutationP() const
-    {
-      if (m_extractedDataAreDirty) this->extractData();
-      return m_p;
-    }
+  /** Performs a numeric decomposition of \a matrix
+   *
+   * The given matrix must has the same sparcity than the matrix on which the symbolic decomposition has been performed.
+   *
+   * \sa analyzePattern()
+   */
+  void factorize(const MatrixType &matrix);
 
-    inline const IntRowVectorType& permutationQ() const
-    {
-      if (m_extractedDataAreDirty) this->extractData();
-      return m_q;
-    }
-    
-    Scalar determinant() const;
-    
-  protected:
-    
-    using Base::m_matrix;
-    using Base::m_sluOptions;
-    using Base::m_sluA;
-    using Base::m_sluB;
-    using Base::m_sluX;
-    using Base::m_p;
-    using Base::m_q;
-    using Base::m_sluEtree;
-    using Base::m_sluEqued;
-    using Base::m_sluRscale;
-    using Base::m_sluCscale;
-    using Base::m_sluL;
-    using Base::m_sluU;
-    using Base::m_sluStat;
-    using Base::m_sluFerr;
-    using Base::m_sluBerr;
-    using Base::m_l;
-    using Base::m_u;
-    
-    using Base::m_analysisIsOk;
-    using Base::m_factorizationIsOk;
-    using Base::m_extractedDataAreDirty;
-    using Base::m_isInitialized;
-    using Base::m_info;
-    
-    void init()
-    {
-      Base::init();
-      
-      set_default_options(&this->m_sluOptions);
-      m_sluOptions.PrintStat        = NO;
-      m_sluOptions.ConditionNumber  = NO;
-      m_sluOptions.Trans            = NOTRANS;
-      m_sluOptions.ColPerm          = COLAMD;
-    }
-    
-    
-  private:
-    SuperLU(SuperLU& ) { }
+  /** \internal */
+  template <typename Rhs, typename Dest>
+  void _solve_impl(const MatrixBase<Rhs> &b, MatrixBase<Dest> &dest) const;
+
+  inline const LMatrixType &matrixL() const {
+    if (m_extractedDataAreDirty) this->extractData();
+    return m_l;
+  }
+
+  inline const UMatrixType &matrixU() const {
+    if (m_extractedDataAreDirty) this->extractData();
+    return m_u;
+  }
+
+  inline const IntColVectorType &permutationP() const {
+    if (m_extractedDataAreDirty) this->extractData();
+    return m_p;
+  }
+
+  inline const IntRowVectorType &permutationQ() const {
+    if (m_extractedDataAreDirty) this->extractData();
+    return m_q;
+  }
+
+  Scalar determinant() const;
+
+ protected:
+  using Base::m_l;
+  using Base::m_matrix;
+  using Base::m_p;
+  using Base::m_q;
+  using Base::m_sluA;
+  using Base::m_sluB;
+  using Base::m_sluBerr;
+  using Base::m_sluCscale;
+  using Base::m_sluEqued;
+  using Base::m_sluEtree;
+  using Base::m_sluFerr;
+  using Base::m_sluL;
+  using Base::m_sluOptions;
+  using Base::m_sluRscale;
+  using Base::m_sluStat;
+  using Base::m_sluU;
+  using Base::m_sluX;
+  using Base::m_u;
+
+  using Base::m_analysisIsOk;
+  using Base::m_extractedDataAreDirty;
+  using Base::m_factorizationIsOk;
+  using Base::m_info;
+  using Base::m_isInitialized;
+
+  void init() {
+    Base::init();
+
+    set_default_options(&this->m_sluOptions);
+    m_sluOptions.PrintStat = NO;
+    m_sluOptions.ConditionNumber = NO;
+    m_sluOptions.Trans = NOTRANS;
+    m_sluOptions.ColPerm = COLAMD;
+  }
+
+ private:
+  SuperLU(SuperLU &) {}
 };
 
-template<typename MatrixType>
-void SuperLU<MatrixType>::factorize(const MatrixType& a)
-{
+template <typename MatrixType>
+void SuperLU<MatrixType>::factorize(const MatrixType &a) {
   eigen_assert(m_analysisIsOk && "You must first call analyzePattern()");
-  if(!m_analysisIsOk)
-  {
+  if (!m_analysisIsOk) {
     m_info = InvalidInput;
     return;
   }
-  
+
   this->initFactorization(a);
-  
+
   m_sluOptions.ColPerm = COLAMD;
   int info = 0;
   RealScalar recip_pivot_growth, rcond;
   RealScalar ferr, berr;
 
   StatInit(&m_sluStat);
-  SuperLU_gssvx(&m_sluOptions, &m_sluA, m_q.data(), m_p.data(), &m_sluEtree[0],
-                &m_sluEqued, &m_sluRscale[0], &m_sluCscale[0],
-                &m_sluL, &m_sluU,
-                NULL, 0,
-                &m_sluB, &m_sluX,
-                &recip_pivot_growth, &rcond,
-                &ferr, &berr,
+  SuperLU_gssvx(&m_sluOptions, &m_sluA, m_q.data(), m_p.data(), &m_sluEtree[0], &m_sluEqued, &m_sluRscale[0],
+                &m_sluCscale[0], &m_sluL, &m_sluU, NULL, 0, &m_sluB, &m_sluX, &recip_pivot_growth, &rcond, &ferr, &berr,
                 &m_sluStat, &info, Scalar());
   StatFree(&m_sluStat);
 
@@ -647,55 +568,46 @@
   m_factorizationIsOk = true;
 }
 
-template<typename MatrixType>
-template<typename Rhs,typename Dest>
-void SuperLU<MatrixType>::_solve_impl(const MatrixBase<Rhs> &b, MatrixBase<Dest>& x) const
-{
-  eigen_assert(m_factorizationIsOk && "The decomposition is not in a valid state for solving, you must first call either compute() or analyzePattern()/factorize()");
+template <typename MatrixType>
+template <typename Rhs, typename Dest>
+void SuperLU<MatrixType>::_solve_impl(const MatrixBase<Rhs> &b, MatrixBase<Dest> &x) const {
+  eigen_assert(m_factorizationIsOk &&
+               "The decomposition is not in a valid state for solving, you must first call either compute() or "
+               "analyzePattern()/factorize()");
 
   const Index rhsCols = b.cols();
-  eigen_assert(m_matrix.rows()==b.rows());
+  eigen_assert(m_matrix.rows() == b.rows());
 
   m_sluOptions.Trans = NOTRANS;
   m_sluOptions.Fact = FACTORED;
   m_sluOptions.IterRefine = NOREFINE;
-  
 
   m_sluFerr.resize(rhsCols);
   m_sluBerr.resize(rhsCols);
-  
-  Ref<const Matrix<typename Rhs::Scalar,Dynamic,Dynamic,ColMajor> > b_ref(b);
-  Ref<const Matrix<typename Dest::Scalar,Dynamic,Dynamic,ColMajor> > x_ref(x);
-  
+
+  Ref<const Matrix<typename Rhs::Scalar, Dynamic, Dynamic, ColMajor> > b_ref(b);
+  Ref<const Matrix<typename Dest::Scalar, Dynamic, Dynamic, ColMajor> > x_ref(x);
+
   m_sluB = SluMatrix::Map(b_ref.const_cast_derived());
   m_sluX = SluMatrix::Map(x_ref.const_cast_derived());
-  
+
   typename Rhs::PlainObject b_cpy;
-  if(m_sluEqued!='N')
-  {
+  if (m_sluEqued != 'N') {
     b_cpy = b;
-    m_sluB = SluMatrix::Map(b_cpy.const_cast_derived());  
+    m_sluB = SluMatrix::Map(b_cpy.const_cast_derived());
   }
 
   StatInit(&m_sluStat);
   int info = 0;
   RealScalar recip_pivot_growth, rcond;
-  SuperLU_gssvx(&m_sluOptions, &m_sluA,
-                m_q.data(), m_p.data(),
-                &m_sluEtree[0], &m_sluEqued,
-                &m_sluRscale[0], &m_sluCscale[0],
-                &m_sluL, &m_sluU,
-                NULL, 0,
-                &m_sluB, &m_sluX,
-                &recip_pivot_growth, &rcond,
-                &m_sluFerr[0], &m_sluBerr[0],
-                &m_sluStat, &info, Scalar());
+  SuperLU_gssvx(&m_sluOptions, &m_sluA, m_q.data(), m_p.data(), &m_sluEtree[0], &m_sluEqued, &m_sluRscale[0],
+                &m_sluCscale[0], &m_sluL, &m_sluU, NULL, 0, &m_sluB, &m_sluX, &recip_pivot_growth, &rcond,
+                &m_sluFerr[0], &m_sluBerr[0], &m_sluStat, &info, Scalar());
   StatFree(&m_sluStat);
-  
-  if(x.derived().data() != x_ref.data())
-    x = x_ref;
-  
-  m_info = info==0 ? Success : NumericalIssue;
+
+  if (x.derived().data() != x_ref.data()) x = x_ref;
+
+  m_info = info == 0 ? Success : NumericalIssue;
 }
 
 // the code of this extractData() function has been adapted from the SuperLU's Matlab support code,
@@ -705,78 +617,70 @@
 //  THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
 //  EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
 //
-template<typename MatrixType, typename Derived>
-void SuperLUBase<MatrixType,Derived>::extractData() const
-{
-  eigen_assert(m_factorizationIsOk && "The decomposition is not in a valid state for extracting factors, you must first call either compute() or analyzePattern()/factorize()");
-  if (m_extractedDataAreDirty)
-  {
-    int         upper;
-    int         fsupc, istart, nsupr;
-    int         lastl = 0, lastu = 0;
-    SCformat    *Lstore = static_cast<SCformat*>(m_sluL.Store);
-    NCformat    *Ustore = static_cast<NCformat*>(m_sluU.Store);
-    Scalar      *SNptr;
+template <typename MatrixType, typename Derived>
+void SuperLUBase<MatrixType, Derived>::extractData() const {
+  eigen_assert(m_factorizationIsOk &&
+               "The decomposition is not in a valid state for extracting factors, you must first call either compute() "
+               "or analyzePattern()/factorize()");
+  if (m_extractedDataAreDirty) {
+    int upper;
+    int fsupc, istart, nsupr;
+    int lastl = 0, lastu = 0;
+    SCformat *Lstore = static_cast<SCformat *>(m_sluL.Store);
+    NCformat *Ustore = static_cast<NCformat *>(m_sluU.Store);
+    Scalar *SNptr;
 
     const Index size = m_matrix.rows();
-    m_l.resize(size,size);
+    m_l.resize(size, size);
     m_l.resizeNonZeros(Lstore->nnz);
-    m_u.resize(size,size);
+    m_u.resize(size, size);
     m_u.resizeNonZeros(Ustore->nnz);
 
-    int* Lcol = m_l.outerIndexPtr();
-    int* Lrow = m_l.innerIndexPtr();
-    Scalar* Lval = m_l.valuePtr();
+    int *Lcol = m_l.outerIndexPtr();
+    int *Lrow = m_l.innerIndexPtr();
+    Scalar *Lval = m_l.valuePtr();
 
-    int* Ucol = m_u.outerIndexPtr();
-    int* Urow = m_u.innerIndexPtr();
-    Scalar* Uval = m_u.valuePtr();
+    int *Ucol = m_u.outerIndexPtr();
+    int *Urow = m_u.innerIndexPtr();
+    Scalar *Uval = m_u.valuePtr();
 
     Ucol[0] = 0;
     Ucol[0] = 0;
 
     /* for each supernode */
-    for (int k = 0; k <= Lstore->nsuper; ++k)
-    {
-      fsupc   = L_FST_SUPC(k);
-      istart  = L_SUB_START(fsupc);
-      nsupr   = L_SUB_START(fsupc+1) - istart;
-      upper   = 1;
+    for (int k = 0; k <= Lstore->nsuper; ++k) {
+      fsupc = L_FST_SUPC(k);
+      istart = L_SUB_START(fsupc);
+      nsupr = L_SUB_START(fsupc + 1) - istart;
+      upper = 1;
 
       /* for each column in the supernode */
-      for (int j = fsupc; j < L_FST_SUPC(k+1); ++j)
-      {
-        SNptr = &((Scalar*)Lstore->nzval)[L_NZ_START(j)];
+      for (int j = fsupc; j < L_FST_SUPC(k + 1); ++j) {
+        SNptr = &((Scalar *)Lstore->nzval)[L_NZ_START(j)];
 
         /* Extract U */
-        for (int i = U_NZ_START(j); i < U_NZ_START(j+1); ++i)
-        {
-          Uval[lastu] = ((Scalar*)Ustore->nzval)[i];
+        for (int i = U_NZ_START(j); i < U_NZ_START(j + 1); ++i) {
+          Uval[lastu] = ((Scalar *)Ustore->nzval)[i];
           /* Matlab doesn't like explicit zero. */
-          if (Uval[lastu] != 0.0)
-            Urow[lastu++] = U_SUB(i);
+          if (Uval[lastu] != 0.0) Urow[lastu++] = U_SUB(i);
         }
-        for (int i = 0; i < upper; ++i)
-        {
+        for (int i = 0; i < upper; ++i) {
           /* upper triangle in the supernode */
           Uval[lastu] = SNptr[i];
           /* Matlab doesn't like explicit zero. */
-          if (Uval[lastu] != 0.0)
-            Urow[lastu++] = L_SUB(istart+i);
+          if (Uval[lastu] != 0.0) Urow[lastu++] = L_SUB(istart + i);
         }
-        Ucol[j+1] = lastu;
+        Ucol[j + 1] = lastu;
 
         /* Extract L */
         Lval[lastl] = 1.0; /* unit diagonal */
         Lrow[lastl++] = L_SUB(istart + upper - 1);
-        for (int i = upper; i < nsupr; ++i)
-        {
+        for (int i = upper; i < nsupr; ++i) {
           Lval[lastl] = SNptr[i];
           /* Matlab doesn't like explicit zero. */
-          if (Lval[lastl] != 0.0)
-            Lrow[lastl++] = L_SUB(istart+i);
+          if (Lval[lastl] != 0.0) Lrow[lastl++] = L_SUB(istart + i);
         }
-        Lcol[j+1] = lastl;
+        Lcol[j + 1] = lastl;
 
         ++upper;
       } /* for j ... */
@@ -791,29 +695,26 @@
   }
 }
 
-template<typename MatrixType>
-typename SuperLU<MatrixType>::Scalar SuperLU<MatrixType>::determinant() const
-{
-  eigen_assert(m_factorizationIsOk && "The decomposition is not in a valid state for computing the determinant, you must first call either compute() or analyzePattern()/factorize()");
-  
-  if (m_extractedDataAreDirty)
-    this->extractData();
+template <typename MatrixType>
+typename SuperLU<MatrixType>::Scalar SuperLU<MatrixType>::determinant() const {
+  eigen_assert(m_factorizationIsOk &&
+               "The decomposition is not in a valid state for computing the determinant, you must first call either "
+               "compute() or analyzePattern()/factorize()");
+
+  if (m_extractedDataAreDirty) this->extractData();
 
   Scalar det = Scalar(1);
-  for (int j=0; j<m_u.cols(); ++j)
-  {
-    if (m_u.outerIndexPtr()[j+1]-m_u.outerIndexPtr()[j] > 0)
-    {
-      int lastId = m_u.outerIndexPtr()[j+1]-1;
-      eigen_assert(m_u.innerIndexPtr()[lastId]<=j);
-      if (m_u.innerIndexPtr()[lastId]==j)
-        det *= m_u.valuePtr()[lastId];
+  for (int j = 0; j < m_u.cols(); ++j) {
+    if (m_u.outerIndexPtr()[j + 1] - m_u.outerIndexPtr()[j] > 0) {
+      int lastId = m_u.outerIndexPtr()[j + 1] - 1;
+      eigen_assert(m_u.innerIndexPtr()[lastId] <= j);
+      if (m_u.innerIndexPtr()[lastId] == j) det *= m_u.valuePtr()[lastId];
     }
   }
-  if(PermutationMap(m_p.data(),m_p.size()).determinant()*PermutationMap(m_q.data(),m_q.size()).determinant()<0)
+  if (PermutationMap(m_p.data(), m_p.size()).determinant() * PermutationMap(m_q.data(), m_q.size()).determinant() < 0)
     det = -det;
-  if(m_sluEqued!='N')
-    return det/m_sluRscale.prod()/m_sluCscale.prod();
+  if (m_sluEqued != 'N')
+    return det / m_sluRscale.prod() / m_sluCscale.prod();
   else
     return det;
 }
@@ -825,143 +726,129 @@
 #ifdef EIGEN_SUPERLU_HAS_ILU
 
 /** \ingroup SuperLUSupport_Module
-  * \class SuperILU
-  * \brief A sparse direct \b incomplete LU factorization and solver based on the SuperLU library
-  *
-  * This class allows to solve for an approximate solution of A.X = B sparse linear problems via an incomplete LU factorization
-  * using the SuperLU library. This class is aimed to be used as a preconditioner of the iterative linear solvers.
-  *
-  * \warning This class is only for the 4.x versions of SuperLU. The 3.x and 5.x versions are not supported.
-  *
-  * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
-  *
-  * \implsparsesolverconcept
-  *
-  * \sa \ref TutorialSparseSolverConcept, class IncompleteLUT, class ConjugateGradient, class BiCGSTAB
-  */
+ * \class SuperILU
+ * \brief A sparse direct \b incomplete LU factorization and solver based on the SuperLU library
+ *
+ * This class allows to solve for an approximate solution of A.X = B sparse linear problems via an incomplete LU
+ * factorization using the SuperLU library. This class is aimed to be used as a preconditioner of the iterative linear
+ * solvers.
+ *
+ * \warning This class is only for the 4.x versions of SuperLU. The 3.x and 5.x versions are not supported.
+ *
+ * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
+ *
+ * \implsparsesolverconcept
+ *
+ * \sa \ref TutorialSparseSolverConcept, class IncompleteLUT, class ConjugateGradient, class BiCGSTAB
+ */
 
-template<typename MatrixType_>
-class SuperILU : public SuperLUBase<MatrixType_,SuperILU<MatrixType_> >
-{
-  public:
-    typedef SuperLUBase<MatrixType_,SuperILU> Base;
-    typedef MatrixType_ MatrixType;
-    typedef typename Base::Scalar Scalar;
-    typedef typename Base::RealScalar RealScalar;
+template <typename MatrixType_>
+class SuperILU : public SuperLUBase<MatrixType_, SuperILU<MatrixType_> > {
+ public:
+  typedef SuperLUBase<MatrixType_, SuperILU> Base;
+  typedef MatrixType_ MatrixType;
+  typedef typename Base::Scalar Scalar;
+  typedef typename Base::RealScalar RealScalar;
 
-  public:
-    using Base::_solve_impl;
+ public:
+  using Base::_solve_impl;
 
-    SuperILU() : Base() { init(); }
+  SuperILU() : Base() { init(); }
 
-    SuperILU(const MatrixType& matrix) : Base()
-    {
-      init();
-      Base::compute(matrix);
-    }
+  SuperILU(const MatrixType &matrix) : Base() {
+    init();
+    Base::compute(matrix);
+  }
 
-    ~SuperILU()
-    {
-    }
-    
-    /** Performs a symbolic decomposition on the sparcity of \a matrix.
-      *
-      * This function is particularly useful when solving for several problems having the same structure.
-      * 
-      * \sa factorize()
-      */
-    void analyzePattern(const MatrixType& matrix)
-    {
-      Base::analyzePattern(matrix);
-    }
-    
-    /** Performs a numeric decomposition of \a matrix
-      *
-      * The given matrix must has the same sparcity than the matrix on which the symbolic decomposition has been performed.
-      *
-      * \sa analyzePattern()
-      */
-    void factorize(const MatrixType& matrix);
-    
-    #ifndef EIGEN_PARSED_BY_DOXYGEN
-    /** \internal */
-    template<typename Rhs,typename Dest>
-    void _solve_impl(const MatrixBase<Rhs> &b, MatrixBase<Dest> &dest) const;
-    #endif // EIGEN_PARSED_BY_DOXYGEN
-    
-  protected:
-    
-    using Base::m_matrix;
-    using Base::m_sluOptions;
-    using Base::m_sluA;
-    using Base::m_sluB;
-    using Base::m_sluX;
-    using Base::m_p;
-    using Base::m_q;
-    using Base::m_sluEtree;
-    using Base::m_sluEqued;
-    using Base::m_sluRscale;
-    using Base::m_sluCscale;
-    using Base::m_sluL;
-    using Base::m_sluU;
-    using Base::m_sluStat;
-    using Base::m_sluFerr;
-    using Base::m_sluBerr;
-    using Base::m_l;
-    using Base::m_u;
-    
-    using Base::m_analysisIsOk;
-    using Base::m_factorizationIsOk;
-    using Base::m_extractedDataAreDirty;
-    using Base::m_isInitialized;
-    using Base::m_info;
+  ~SuperILU() {}
 
-    void init()
-    {
-      Base::init();
-      
-      ilu_set_default_options(&m_sluOptions);
-      m_sluOptions.PrintStat        = NO;
-      m_sluOptions.ConditionNumber  = NO;
-      m_sluOptions.Trans            = NOTRANS;
-      m_sluOptions.ColPerm          = MMD_AT_PLUS_A;
-      
-      // no attempt to preserve column sum
-      m_sluOptions.ILU_MILU = SILU;
-      // only basic ILU(k) support -- no direct control over memory consumption
-      // better to use ILU_DropRule = DROP_BASIC | DROP_AREA
-      // and set ILU_FillFactor to max memory growth
-      m_sluOptions.ILU_DropRule = DROP_BASIC;
-      m_sluOptions.ILU_DropTol = NumTraits<Scalar>::dummy_precision()*10;
-    }
-    
-  private:
-    SuperILU(SuperILU& ) { }
+  /** Performs a symbolic decomposition on the sparcity of \a matrix.
+   *
+   * This function is particularly useful when solving for several problems having the same structure.
+   *
+   * \sa factorize()
+   */
+  void analyzePattern(const MatrixType &matrix) { Base::analyzePattern(matrix); }
+
+  /** Performs a numeric decomposition of \a matrix
+   *
+   * The given matrix must has the same sparcity than the matrix on which the symbolic decomposition has been performed.
+   *
+   * \sa analyzePattern()
+   */
+  void factorize(const MatrixType &matrix);
+
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  /** \internal */
+  template <typename Rhs, typename Dest>
+  void _solve_impl(const MatrixBase<Rhs> &b, MatrixBase<Dest> &dest) const;
+#endif  // EIGEN_PARSED_BY_DOXYGEN
+
+ protected:
+  using Base::m_l;
+  using Base::m_matrix;
+  using Base::m_p;
+  using Base::m_q;
+  using Base::m_sluA;
+  using Base::m_sluB;
+  using Base::m_sluBerr;
+  using Base::m_sluCscale;
+  using Base::m_sluEqued;
+  using Base::m_sluEtree;
+  using Base::m_sluFerr;
+  using Base::m_sluL;
+  using Base::m_sluOptions;
+  using Base::m_sluRscale;
+  using Base::m_sluStat;
+  using Base::m_sluU;
+  using Base::m_sluX;
+  using Base::m_u;
+
+  using Base::m_analysisIsOk;
+  using Base::m_extractedDataAreDirty;
+  using Base::m_factorizationIsOk;
+  using Base::m_info;
+  using Base::m_isInitialized;
+
+  void init() {
+    Base::init();
+
+    ilu_set_default_options(&m_sluOptions);
+    m_sluOptions.PrintStat = NO;
+    m_sluOptions.ConditionNumber = NO;
+    m_sluOptions.Trans = NOTRANS;
+    m_sluOptions.ColPerm = MMD_AT_PLUS_A;
+
+    // no attempt to preserve column sum
+    m_sluOptions.ILU_MILU = SILU;
+    // only basic ILU(k) support -- no direct control over memory consumption
+    // better to use ILU_DropRule = DROP_BASIC | DROP_AREA
+    // and set ILU_FillFactor to max memory growth
+    m_sluOptions.ILU_DropRule = DROP_BASIC;
+    m_sluOptions.ILU_DropTol = NumTraits<Scalar>::dummy_precision() * 10;
+  }
+
+ private:
+  SuperILU(SuperILU &) {}
 };
 
-template<typename MatrixType>
-void SuperILU<MatrixType>::factorize(const MatrixType& a)
-{
+template <typename MatrixType>
+void SuperILU<MatrixType>::factorize(const MatrixType &a) {
   eigen_assert(m_analysisIsOk && "You must first call analyzePattern()");
-  if(!m_analysisIsOk)
-  {
+  if (!m_analysisIsOk) {
     m_info = InvalidInput;
     return;
   }
-  
+
   this->initFactorization(a);
 
   int info = 0;
   RealScalar recip_pivot_growth, rcond;
 
   StatInit(&m_sluStat);
-  SuperLU_gsisx(&m_sluOptions, &m_sluA, m_q.data(), m_p.data(), &m_sluEtree[0],
-                &m_sluEqued, &m_sluRscale[0], &m_sluCscale[0],
-                &m_sluL, &m_sluU,
-                NULL, 0,
-                &m_sluB, &m_sluX,
-                &recip_pivot_growth, &rcond,
-                &m_sluStat, &info, Scalar());
+  SuperLU_gsisx(&m_sluOptions, &m_sluA, m_q.data(), m_p.data(), &m_sluEtree[0], &m_sluEqued, &m_sluRscale[0],
+                &m_sluCscale[0], &m_sluL, &m_sluU, NULL, 0, &m_sluB, &m_sluX, &recip_pivot_growth, &rcond, &m_sluStat,
+                &info, Scalar());
   StatFree(&m_sluStat);
 
   // FIXME how to better check for errors ???
@@ -970,14 +857,15 @@
 }
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-template<typename MatrixType>
-template<typename Rhs,typename Dest>
-void SuperILU<MatrixType>::_solve_impl(const MatrixBase<Rhs> &b, MatrixBase<Dest>& x) const
-{
-  eigen_assert(m_factorizationIsOk && "The decomposition is not in a valid state for solving, you must first call either compute() or analyzePattern()/factorize()");
+template <typename MatrixType>
+template <typename Rhs, typename Dest>
+void SuperILU<MatrixType>::_solve_impl(const MatrixBase<Rhs> &b, MatrixBase<Dest> &x) const {
+  eigen_assert(m_factorizationIsOk &&
+               "The decomposition is not in a valid state for solving, you must first call either compute() or "
+               "analyzePattern()/factorize()");
 
   const int rhsCols = b.cols();
-  eigen_assert(m_matrix.rows()==b.rows());
+  eigen_assert(m_matrix.rows() == b.rows());
 
   m_sluOptions.Trans = NOTRANS;
   m_sluOptions.Fact = FACTORED;
@@ -985,44 +873,36 @@
 
   m_sluFerr.resize(rhsCols);
   m_sluBerr.resize(rhsCols);
-  
-  Ref<const Matrix<typename Rhs::Scalar,Dynamic,Dynamic,ColMajor> > b_ref(b);
-  Ref<const Matrix<typename Dest::Scalar,Dynamic,Dynamic,ColMajor> > x_ref(x);
-  
+
+  Ref<const Matrix<typename Rhs::Scalar, Dynamic, Dynamic, ColMajor> > b_ref(b);
+  Ref<const Matrix<typename Dest::Scalar, Dynamic, Dynamic, ColMajor> > x_ref(x);
+
   m_sluB = SluMatrix::Map(b_ref.const_cast_derived());
   m_sluX = SluMatrix::Map(x_ref.const_cast_derived());
 
   typename Rhs::PlainObject b_cpy;
-  if(m_sluEqued!='N')
-  {
+  if (m_sluEqued != 'N') {
     b_cpy = b;
-    m_sluB = SluMatrix::Map(b_cpy.const_cast_derived());  
+    m_sluB = SluMatrix::Map(b_cpy.const_cast_derived());
   }
-  
+
   int info = 0;
   RealScalar recip_pivot_growth, rcond;
 
   StatInit(&m_sluStat);
-  SuperLU_gsisx(&m_sluOptions, &m_sluA,
-                m_q.data(), m_p.data(),
-                &m_sluEtree[0], &m_sluEqued,
-                &m_sluRscale[0], &m_sluCscale[0],
-                &m_sluL, &m_sluU,
-                NULL, 0,
-                &m_sluB, &m_sluX,
-                &recip_pivot_growth, &rcond,
-                &m_sluStat, &info, Scalar());
+  SuperLU_gsisx(&m_sluOptions, &m_sluA, m_q.data(), m_p.data(), &m_sluEtree[0], &m_sluEqued, &m_sluRscale[0],
+                &m_sluCscale[0], &m_sluL, &m_sluU, NULL, 0, &m_sluB, &m_sluX, &recip_pivot_growth, &rcond, &m_sluStat,
+                &info, Scalar());
   StatFree(&m_sluStat);
-  
-  if(x.derived().data() != x_ref.data())
-    x = x_ref;
 
-  m_info = info==0 ? Success : NumericalIssue;
+  if (x.derived().data() != x_ref.data()) x = x_ref;
+
+  m_info = info == 0 ? Success : NumericalIssue;
 }
 #endif
 
 #endif
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SUPERLUSUPPORT_H
+#endif  // EIGEN_SUPERLUSUPPORT_H
diff --git a/Eigen/src/ThreadPool/EventCount.h b/Eigen/src/ThreadPool/EventCount.h
index 1e8aa8a..0117b4b 100644
--- a/Eigen/src/ThreadPool/EventCount.h
+++ b/Eigen/src/ThreadPool/EventCount.h
@@ -53,8 +53,7 @@
  public:
   class Waiter;
 
-  EventCount(MaxSizeVector<Waiter>& waiters)
-      : state_(kStackMask), waiters_(waiters) {
+  EventCount(MaxSizeVector<Waiter>& waiters) : state_(kStackMask), waiters_(waiters) {
     eigen_plain_assert(waiters.size() < (1 << kWaiterBits) - 1);
   }
 
@@ -72,9 +71,7 @@
       CheckState(state);
       uint64_t newstate = state + kWaiterInc;
       CheckState(newstate);
-      if (state_.compare_exchange_weak(state, newstate,
-                                       std::memory_order_seq_cst))
-        return;
+      if (state_.compare_exchange_weak(state, newstate, std::memory_order_seq_cst)) return;
     }
   }
 
@@ -93,12 +90,10 @@
       } else {
         // Remove this thread from pre-wait counter and add to the waiter stack.
         newstate = ((state & kWaiterMask) - kWaiterInc) | me;
-        w->next.store(state & (kStackMask | kEpochMask),
-                      std::memory_order_relaxed);
+        w->next.store(state & (kStackMask | kEpochMask), std::memory_order_relaxed);
       }
       CheckState(newstate);
-      if (state_.compare_exchange_weak(state, newstate,
-                                       std::memory_order_acq_rel)) {
+      if (state_.compare_exchange_weak(state, newstate, std::memory_order_acq_rel)) {
         if ((state & kSignalMask) == 0) {
           w->epoch += kEpochInc;
           Park(w);
@@ -118,13 +113,9 @@
       // so we should not consume a signal unconditionally.
       // Only if number of waiters is equal to number of signals,
       // we know that the thread was notified and we must take away the signal.
-      if (((state & kWaiterMask) >> kWaiterShift) ==
-          ((state & kSignalMask) >> kSignalShift))
-        newstate -= kSignalInc;
+      if (((state & kWaiterMask) >> kWaiterShift) == ((state & kSignalMask) >> kSignalShift)) newstate -= kSignalInc;
       CheckState(newstate);
-      if (state_.compare_exchange_weak(state, newstate,
-                                       std::memory_order_acq_rel))
-        return;
+      if (state_.compare_exchange_weak(state, newstate, std::memory_order_acq_rel)) return;
     }
   }
 
@@ -142,8 +133,7 @@
       uint64_t newstate;
       if (notifyAll) {
         // Empty wait stack and set signal to number of pre-wait threads.
-        newstate =
-            (state & kWaiterMask) | (waiters << kSignalShift) | kStackMask;
+        newstate = (state & kWaiterMask) | (waiters << kSignalShift) | kStackMask;
       } else if (signals < waiters) {
         // There is a thread in pre-wait state, unblock it.
         newstate = state + kSignalInc;
@@ -154,10 +144,8 @@
         newstate = (state & (kWaiterMask | kSignalMask)) | next;
       }
       CheckState(newstate);
-      if (state_.compare_exchange_weak(state, newstate,
-                                       std::memory_order_acq_rel)) {
-        if (!notifyAll && (signals < waiters))
-          return;  // unblocked pre-wait thread
+      if (state_.compare_exchange_weak(state, newstate, std::memory_order_acq_rel)) {
+        if (!notifyAll && (signals < waiters)) return;  // unblocked pre-wait thread
         if ((state & kStackMask) == kStackMask) return;
         Waiter* w = &waiters_[state & kStackMask];
         if (!notifyAll) w->next.store(kStackMask, std::memory_order_relaxed);
@@ -195,12 +183,10 @@
   static const uint64_t kWaiterBits = 14;
   static const uint64_t kStackMask = (1ull << kWaiterBits) - 1;
   static const uint64_t kWaiterShift = kWaiterBits;
-  static const uint64_t kWaiterMask = ((1ull << kWaiterBits) - 1)
-                                      << kWaiterShift;
+  static const uint64_t kWaiterMask = ((1ull << kWaiterBits) - 1) << kWaiterShift;
   static const uint64_t kWaiterInc = 1ull << kWaiterShift;
   static const uint64_t kSignalShift = 2 * kWaiterBits;
-  static const uint64_t kSignalMask = ((1ull << kWaiterBits) - 1)
-                                      << kSignalShift;
+  static const uint64_t kSignalMask = ((1ull << kWaiterBits) - 1) << kSignalShift;
   static const uint64_t kSignalInc = 1ull << kSignalShift;
   static const uint64_t kEpochShift = 3 * kWaiterBits;
   static const uint64_t kEpochBits = 64 - kEpochShift;
diff --git a/Eigen/src/ThreadPool/InternalHeaderCheck.h b/Eigen/src/ThreadPool/InternalHeaderCheck.h
index 44c0fca..5b27ef4 100644
--- a/Eigen/src/ThreadPool/InternalHeaderCheck.h
+++ b/Eigen/src/ThreadPool/InternalHeaderCheck.h
@@ -1,3 +1,4 @@
 #ifndef EIGEN_THREADPOOL_MODULE_H
-#error "Please include unsupported/Eigen/CXX11/ThreadPool instead of including headers inside the src directory directly."
+#error \
+    "Please include unsupported/Eigen/CXX11/ThreadPool instead of including headers inside the src directory directly."
 #endif
diff --git a/Eigen/src/ThreadPool/NonBlockingThreadPool.h b/Eigen/src/ThreadPool/NonBlockingThreadPool.h
index 6d0c3ad..efa6ef5 100644
--- a/Eigen/src/ThreadPool/NonBlockingThreadPool.h
+++ b/Eigen/src/ThreadPool/NonBlockingThreadPool.h
@@ -21,11 +21,9 @@
   typedef typename Environment::Task Task;
   typedef RunQueue<Task, 1024> Queue;
 
-  ThreadPoolTempl(int num_threads, Environment env = Environment())
-      : ThreadPoolTempl(num_threads, true, env) {}
+  ThreadPoolTempl(int num_threads, Environment env = Environment()) : ThreadPoolTempl(num_threads, true, env) {}
 
-  ThreadPoolTempl(int num_threads, bool allow_spinning,
-                  Environment env = Environment())
+  ThreadPoolTempl(int num_threads, bool allow_spinning, Environment env = Environment())
       : env_(env),
         num_threads_(num_threads),
         allow_spinning_(allow_spinning),
@@ -57,8 +55,7 @@
     thread_data_.resize(num_threads_);
     for (int i = 0; i < num_threads_; i++) {
       SetStealPartition(i, EncodePartition(0, num_threads_));
-      thread_data_[i].thread.reset(
-          env_.CreateThread([this, i]() { WorkerLoop(i); }));
+      thread_data_[i].thread.reset(env_.CreateThread([this, i]() { WorkerLoop(i); }));
     }
 #ifndef EIGEN_THREAD_LOCAL
     // Wait for workers to initialize per_thread_map_. Otherwise we might race
@@ -84,8 +81,7 @@
     }
     // Join threads explicitly (by destroying) to avoid destruction order within
     // this class.
-    for (size_t i = 0; i < thread_data_.size(); ++i)
-      thread_data_[i].thread.reset();
+    for (size_t i = 0; i < thread_data_.size(); ++i) thread_data_[i].thread.reset();
   }
 
   void SetStealPartitions(const std::vector<std::pair<unsigned, unsigned>>& partitions) {
@@ -101,12 +97,9 @@
     }
   }
 
-  void Schedule(std::function<void()> fn) EIGEN_OVERRIDE {
-    ScheduleWithHint(std::move(fn), 0, num_threads_);
-  }
+  void Schedule(std::function<void()> fn) EIGEN_OVERRIDE { ScheduleWithHint(std::move(fn), 0, num_threads_); }
 
-  void ScheduleWithHint(std::function<void()> fn, int start,
-                        int limit) override {
+  void ScheduleWithHint(std::function<void()> fn, int start, int limit) override {
     Task t = env_.CreateTask(std::move(fn));
     PerThread* pt = GetPerThread();
     if (pt->pool == this) {
@@ -175,9 +168,7 @@
   static const int kMaxPartitionBits = 16;
   static const int kMaxThreads = 1 << kMaxPartitionBits;
 
-  inline unsigned EncodePartition(unsigned start, unsigned limit) {
-    return (start << kMaxPartitionBits) | limit;
-  }
+  inline unsigned EncodePartition(unsigned start, unsigned limit) { return (start << kMaxPartitionBits) | limit; }
 
   inline void DecodePartition(unsigned val, unsigned* start, unsigned* limit) {
     *limit = val & (kMaxThreads - 1);
@@ -195,9 +186,7 @@
     thread_data_[i].steal_partition.store(val, std::memory_order_relaxed);
   }
 
-  inline unsigned GetStealPartition(int i) {
-    return thread_data_[i].steal_partition.load(std::memory_order_relaxed);
-  }
+  inline unsigned GetStealPartition(int i) { return thread_data_[i].steal_partition.load(std::memory_order_relaxed); }
 
   void ComputeCoprimes(int N, MaxSizeVector<unsigned>* coprimes) {
     for (int i = 1; i <= N; i++) {
@@ -275,8 +264,7 @@
     // proportional to num_threads_ and we assume that new work is scheduled at
     // a constant rate, so we set spin_count to 5000 / num_threads_. The
     // constant was picked based on a fair dice roll, tune it.
-    const int spin_count =
-        allow_spinning_ && num_threads_ > 0 ? 5000 / num_threads_ : 0;
+    const int spin_count = allow_spinning_ && num_threads_ > 0 ? 5000 / num_threads_ : 0;
     if (num_threads_ == 1) {
       // For num_threads_ == 1 there is no point in going through the expensive
       // steal loop. Moreover, since NonEmptyQueueIndex() calls PopBack() on the
@@ -342,9 +330,9 @@
     unsigned r = Rand(&pt->rand);
     // Reduce r into [0, size) range, this utilizes trick from
     // https://lemire.me/blog/2016/06/27/a-fast-alternative-to-the-modulo-reduction/
-    eigen_plain_assert(all_coprimes_[size - 1].size() < (1<<30));
+    eigen_plain_assert(all_coprimes_[size - 1].size() < (1 << 30));
     unsigned victim = ((uint64_t)r * (uint64_t)size) >> 32;
-    unsigned index = ((uint64_t) all_coprimes_[size - 1].size() * (uint64_t)r) >> 32;
+    unsigned index = ((uint64_t)all_coprimes_[size - 1].size() * (uint64_t)r) >> 32;
     unsigned inc = all_coprimes_[size - 1][index];
 
     for (unsigned i = 0; i < size; i++) {
@@ -376,10 +364,7 @@
   }
 
   // Steals work from any other thread in the pool.
-  Task GlobalSteal() {
-    return Steal(0, num_threads_);
-  }
-
+  Task GlobalSteal() { return Steal(0, num_threads_); }
 
   // WaitForWork blocks until new work is available (returns true), or if it is
   // time to exit (returns false). Can optionally return a task to execute in t
@@ -477,8 +462,7 @@
     // Update the internal state
     *state = current * 6364136223846793005ULL + 0xda3e39cb94b95bdbULL;
     // Generate the random output (using the PCG-XSH-RS scheme)
-    return static_cast<unsigned>((current ^ (current >> 22)) >>
-                                 (22 + (current >> 61)));
+    return static_cast<unsigned>((current ^ (current >> 22)) >> (22 + (current >> 61)));
   }
 };
 
diff --git a/Eigen/src/ThreadPool/RunQueue.h b/Eigen/src/ThreadPool/RunQueue.h
index 44b668d..9f40e9d 100644
--- a/Eigen/src/ThreadPool/RunQueue.h
+++ b/Eigen/src/ThreadPool/RunQueue.h
@@ -45,8 +45,7 @@
     eigen_plain_assert((kSize & (kSize - 1)) == 0);
     eigen_plain_assert(kSize > 2);            // why would you do this?
     eigen_plain_assert(kSize <= (64 << 10));  // leave enough space for counter
-    for (unsigned i = 0; i < kSize; i++)
-      array_[i].state.store(kEmpty, std::memory_order_relaxed);
+    for (unsigned i = 0; i < kSize; i++) array_[i].state.store(kEmpty, std::memory_order_relaxed);
   }
 
   ~RunQueue() { eigen_plain_assert(Size() == 0); }
@@ -57,9 +56,7 @@
     unsigned front = front_.load(std::memory_order_relaxed);
     Elem* e = &array_[front & kMask];
     uint8_t s = e->state.load(std::memory_order_relaxed);
-    if (s != kEmpty ||
-        !e->state.compare_exchange_strong(s, kBusy, std::memory_order_acquire))
-      return w;
+    if (s != kEmpty || !e->state.compare_exchange_strong(s, kBusy, std::memory_order_acquire)) return w;
     front_.store(front + 1 + (kSize << 1), std::memory_order_relaxed);
     e->w = std::move(w);
     e->state.store(kReady, std::memory_order_release);
@@ -72,9 +69,7 @@
     unsigned front = front_.load(std::memory_order_relaxed);
     Elem* e = &array_[(front - 1) & kMask];
     uint8_t s = e->state.load(std::memory_order_relaxed);
-    if (s != kReady ||
-        !e->state.compare_exchange_strong(s, kBusy, std::memory_order_acquire))
-      return Work();
+    if (s != kReady || !e->state.compare_exchange_strong(s, kBusy, std::memory_order_acquire)) return Work();
     Work w = std::move(e->w);
     e->state.store(kEmpty, std::memory_order_release);
     front = ((front - 1) & kMask2) | (front & ~kMask2);
@@ -89,9 +84,7 @@
     unsigned back = back_.load(std::memory_order_relaxed);
     Elem* e = &array_[(back - 1) & kMask];
     uint8_t s = e->state.load(std::memory_order_relaxed);
-    if (s != kEmpty ||
-        !e->state.compare_exchange_strong(s, kBusy, std::memory_order_acquire))
-      return w;
+    if (s != kEmpty || !e->state.compare_exchange_strong(s, kBusy, std::memory_order_acquire)) return w;
     back = ((back - 1) & kMask2) | (back & ~kMask2);
     back_.store(back, std::memory_order_relaxed);
     e->w = std::move(w);
@@ -106,9 +99,7 @@
     unsigned back = back_.load(std::memory_order_relaxed);
     Elem* e = &array_[back & kMask];
     uint8_t s = e->state.load(std::memory_order_relaxed);
-    if (s != kReady ||
-        !e->state.compare_exchange_strong(s, kBusy, std::memory_order_acquire))
-      return Work();
+    if (s != kReady || !e->state.compare_exchange_strong(s, kBusy, std::memory_order_acquire)) return Work();
     Work w = std::move(e->w);
     e->state.store(kEmpty, std::memory_order_release);
     back_.store(back + 1 + (kSize << 1), std::memory_order_relaxed);
@@ -130,9 +121,7 @@
       Elem* e = &array_[mid & kMask];
       uint8_t s = e->state.load(std::memory_order_relaxed);
       if (n == 0) {
-        if (s != kReady || !e->state.compare_exchange_strong(
-                               s, kBusy, std::memory_order_acquire))
-          continue;
+        if (s != kReady || !e->state.compare_exchange_strong(s, kBusy, std::memory_order_acquire)) continue;
         start = mid;
       } else {
         // Note: no need to store temporal kBusy, we exclusively own these
@@ -143,8 +132,7 @@
       e->state.store(kEmpty, std::memory_order_release);
       n++;
     }
-    if (n != 0)
-      back_.store(start + 1 + (kSize << 1), std::memory_order_relaxed);
+    if (n != 0) back_.store(start + 1 + (kSize << 1), std::memory_order_relaxed);
     return n;
   }
 
@@ -190,7 +178,7 @@
   // SizeOrNotEmpty returns current queue size; if NeedSizeEstimate is false,
   // only whether the size is 0 is guaranteed to be correct.
   // Can be called by any thread at any time.
-  template<bool NeedSizeEstimate>
+  template <bool NeedSizeEstimate>
   unsigned SizeOrNotEmpty() const {
     // Emptiness plays critical role in thread pool blocking. So we go to great
     // effort to not produce false positives (claim non-empty queue as empty).
@@ -217,8 +205,7 @@
     }
   }
 
-  EIGEN_ALWAYS_INLINE
-  unsigned CalculateSize(unsigned front, unsigned back) const {
+  EIGEN_ALWAYS_INLINE unsigned CalculateSize(unsigned front, unsigned back) const {
     int size = (front & kMask2) - (back & kMask2);
     // Fix overflow.
     if (size < 0) size += 2 * kSize;
diff --git a/Eigen/src/ThreadPool/ThreadCancel.h b/Eigen/src/ThreadPool/ThreadCancel.h
index a05685f..6f4dc67 100644
--- a/Eigen/src/ThreadPool/ThreadCancel.h
+++ b/Eigen/src/ThreadPool/ThreadCancel.h
@@ -12,12 +12,10 @@
 
 // Try to come up with a portable way to cancel a thread
 #if EIGEN_OS_GNULINUX
-  #define EIGEN_THREAD_CANCEL(t)                  \
-    pthread_cancel(t.native_handle());
-  #define EIGEN_SUPPORTS_THREAD_CANCELLATION 1
+#define EIGEN_THREAD_CANCEL(t) pthread_cancel(t.native_handle());
+#define EIGEN_SUPPORTS_THREAD_CANCELLATION 1
 #else
 #define EIGEN_THREAD_CANCEL(t)
 #endif
 
-
 #endif  // EIGEN_CXX11_THREADPOOL_THREAD_CANCEL_H
diff --git a/Eigen/src/ThreadPool/ThreadEnvironment.h b/Eigen/src/ThreadPool/ThreadEnvironment.h
index 0e3a49b..b4dd05c 100644
--- a/Eigen/src/ThreadPool/ThreadEnvironment.h
+++ b/Eigen/src/ThreadPool/ThreadEnvironment.h
@@ -27,7 +27,7 @@
     EnvThread(std::function<void()> f) : thr_(std::move(f)) {}
     ~EnvThread() { thr_.join(); }
     // This function is called when the threadpool is cancelled.
-    void OnCancel() { }
+    void OnCancel() {}
 
    private:
     std::thread thr_;
diff --git a/Eigen/src/ThreadPool/ThreadLocal.h b/Eigen/src/ThreadPool/ThreadLocal.h
index ef9c61e..71df401 100644
--- a/Eigen/src/ThreadPool/ThreadLocal.h
+++ b/Eigen/src/ThreadPool/ThreadLocal.h
@@ -18,7 +18,7 @@
 
 #else
 
-#if ((EIGEN_COMP_GNUC) || __has_feature(cxx_thread_local) || EIGEN_COMP_MSVC )
+#if ((EIGEN_COMP_GNUC) || __has_feature(cxx_thread_local) || EIGEN_COMP_MSVC)
 #define EIGEN_THREAD_LOCAL static thread_local
 #endif
 
@@ -31,8 +31,8 @@
 #endif
 // Checks whether C++11's `thread_local` storage duration specifier is
 // supported.
-#if EIGEN_COMP_CLANGAPPLE && ((EIGEN_COMP_CLANGAPPLE < 8000042) || \
-     (TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_9_0))
+#if EIGEN_COMP_CLANGAPPLE && \
+    ((EIGEN_COMP_CLANGAPPLE < 8000042) || (TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_9_0))
 // Notes: Xcode's clang did not support `thread_local` until version
 // 8, and even then not for all iOS < 9.0.
 #undef EIGEN_THREAD_LOCAL
@@ -49,8 +49,7 @@
 #if __has_include(<android/ndk-version.h>)
 #include <android/ndk-version.h>
 #endif  // __has_include(<android/ndk-version.h>)
-#if defined(__ANDROID__) && defined(__clang__) && defined(__NDK_MAJOR__) && \
-    defined(__NDK_MINOR__) &&                                               \
+#if defined(__ANDROID__) && defined(__clang__) && defined(__NDK_MAJOR__) && defined(__NDK_MINOR__) && \
     ((__NDK_MAJOR__ < 12) || ((__NDK_MAJOR__ == 12) && (__NDK_MINOR__ < 1)))
 #undef EIGEN_THREAD_LOCAL
 #endif
@@ -108,22 +107,18 @@
 // Somewhat similar to TBB thread local storage, with similar restrictions:
 // https://www.threadingbuildingblocks.org/docs/help/reference/thread_local_storage/enumerable_thread_specific_cls.html
 //
-template <typename T,
-          typename Initialize = internal::ThreadLocalNoOpInitialize<T>,
+template <typename T, typename Initialize = internal::ThreadLocalNoOpInitialize<T>,
           typename Release = internal::ThreadLocalNoOpRelease<T>>
 class ThreadLocal {
   // We preallocate default constructed elements in MaxSizedVector.
-  static_assert(std::is_default_constructible<T>::value,
-                "ThreadLocal data type must be default constructible");
+  static_assert(std::is_default_constructible<T>::value, "ThreadLocal data type must be default constructible");
 
  public:
   explicit ThreadLocal(int capacity)
-      : ThreadLocal(capacity, internal::ThreadLocalNoOpInitialize<T>(),
-                    internal::ThreadLocalNoOpRelease<T>()) {}
+      : ThreadLocal(capacity, internal::ThreadLocalNoOpInitialize<T>(), internal::ThreadLocalNoOpRelease<T>()) {}
 
   ThreadLocal(int capacity, Initialize initialize)
-      : ThreadLocal(capacity, std::move(initialize),
-                    internal::ThreadLocalNoOpRelease<T>()) {}
+      : ThreadLocal(capacity, std::move(initialize), internal::ThreadLocalNoOpRelease<T>()) {}
 
   ThreadLocal(int capacity, Initialize initialize, Release release)
       : initialize_(std::move(initialize)),
@@ -174,8 +169,7 @@
     // free storage. If old value in `filled_records_` is larger than the
     // records capacity, it means that some other thread added an element while
     // we were traversing lookup table.
-    int insertion_index =
-        filled_records_.fetch_add(1, std::memory_order_relaxed);
+    int insertion_index = filled_records_.fetch_add(1, std::memory_order_relaxed);
     if (insertion_index >= capacity_) return SpilledLocal(this_thread);
 
     // At this point it's guaranteed that we can access to
diff --git a/Eigen/src/ThreadPool/ThreadPoolInterface.h b/Eigen/src/ThreadPool/ThreadPoolInterface.h
index 9b01c87..d07c03e 100644
--- a/Eigen/src/ThreadPool/ThreadPoolInterface.h
+++ b/Eigen/src/ThreadPool/ThreadPoolInterface.h
@@ -24,8 +24,7 @@
 
   // Submits a closure to be run by threads in the range [start, end) in the
   // pool.
-  virtual void ScheduleWithHint(std::function<void()> fn, int /*start*/,
-                                int /*end*/) {
+  virtual void ScheduleWithHint(std::function<void()> fn, int /*start*/, int /*end*/) {
     // Just defer to Schedule in case sub-classes aren't interested in
     // overriding this functionality.
     Schedule(fn);
diff --git a/Eigen/src/UmfPackSupport/UmfPackSupport.h b/Eigen/src/UmfPackSupport/UmfPackSupport.h
index da631d3..3fdcc1f 100644
--- a/Eigen/src/UmfPackSupport/UmfPackSupport.h
+++ b/Eigen/src/UmfPackSupport/UmfPackSupport.h
@@ -29,617 +29,578 @@
 
 // generic double/complex<double> wrapper functions:
 
+// Defaults
+inline void umfpack_defaults(double control[UMFPACK_CONTROL], double, int) { umfpack_di_defaults(control); }
 
- // Defaults
-inline void umfpack_defaults(double control[UMFPACK_CONTROL], double, int)
-{ umfpack_di_defaults(control); }
+inline void umfpack_defaults(double control[UMFPACK_CONTROL], std::complex<double>, int) {
+  umfpack_zi_defaults(control);
+}
 
-inline void umfpack_defaults(double control[UMFPACK_CONTROL], std::complex<double>, int)
-{ umfpack_zi_defaults(control); }
+inline void umfpack_defaults(double control[UMFPACK_CONTROL], double, SuiteSparse_long) {
+  umfpack_dl_defaults(control);
+}
 
-inline void umfpack_defaults(double control[UMFPACK_CONTROL], double, SuiteSparse_long)
-{ umfpack_dl_defaults(control); }
-
-inline void umfpack_defaults(double control[UMFPACK_CONTROL], std::complex<double>, SuiteSparse_long)
-{ umfpack_zl_defaults(control); }
+inline void umfpack_defaults(double control[UMFPACK_CONTROL], std::complex<double>, SuiteSparse_long) {
+  umfpack_zl_defaults(control);
+}
 
 // Report info
-inline void umfpack_report_info(double control[UMFPACK_CONTROL], double info[UMFPACK_INFO], double, int)
-{ umfpack_di_report_info(control, info);}
+inline void umfpack_report_info(double control[UMFPACK_CONTROL], double info[UMFPACK_INFO], double, int) {
+  umfpack_di_report_info(control, info);
+}
 
-inline void umfpack_report_info(double control[UMFPACK_CONTROL], double info[UMFPACK_INFO], std::complex<double>, int)
-{ umfpack_zi_report_info(control, info);}
+inline void umfpack_report_info(double control[UMFPACK_CONTROL], double info[UMFPACK_INFO], std::complex<double>, int) {
+  umfpack_zi_report_info(control, info);
+}
 
-inline void umfpack_report_info(double control[UMFPACK_CONTROL], double info[UMFPACK_INFO], double, SuiteSparse_long)
-{ umfpack_dl_report_info(control, info);}
+inline void umfpack_report_info(double control[UMFPACK_CONTROL], double info[UMFPACK_INFO], double, SuiteSparse_long) {
+  umfpack_dl_report_info(control, info);
+}
 
-inline void umfpack_report_info(double control[UMFPACK_CONTROL], double info[UMFPACK_INFO], std::complex<double>, SuiteSparse_long)
-{ umfpack_zl_report_info(control, info);}
+inline void umfpack_report_info(double control[UMFPACK_CONTROL], double info[UMFPACK_INFO], std::complex<double>,
+                                SuiteSparse_long) {
+  umfpack_zl_report_info(control, info);
+}
 
 // Report status
-inline void umfpack_report_status(double control[UMFPACK_CONTROL], int status, double, int)
-{ umfpack_di_report_status(control, status);}
+inline void umfpack_report_status(double control[UMFPACK_CONTROL], int status, double, int) {
+  umfpack_di_report_status(control, status);
+}
 
-inline void umfpack_report_status(double control[UMFPACK_CONTROL], int status, std::complex<double>, int)
-{ umfpack_zi_report_status(control, status);}
+inline void umfpack_report_status(double control[UMFPACK_CONTROL], int status, std::complex<double>, int) {
+  umfpack_zi_report_status(control, status);
+}
 
-inline void umfpack_report_status(double control[UMFPACK_CONTROL], int status, double, SuiteSparse_long)
-{ umfpack_dl_report_status(control, status);}
+inline void umfpack_report_status(double control[UMFPACK_CONTROL], int status, double, SuiteSparse_long) {
+  umfpack_dl_report_status(control, status);
+}
 
-inline void umfpack_report_status(double control[UMFPACK_CONTROL], int status, std::complex<double>, SuiteSparse_long)
-{ umfpack_zl_report_status(control, status);}
+inline void umfpack_report_status(double control[UMFPACK_CONTROL], int status, std::complex<double>, SuiteSparse_long) {
+  umfpack_zl_report_status(control, status);
+}
 
 // report control
-inline void umfpack_report_control(double control[UMFPACK_CONTROL], double, int)
-{ umfpack_di_report_control(control);}
+inline void umfpack_report_control(double control[UMFPACK_CONTROL], double, int) { umfpack_di_report_control(control); }
 
-inline void umfpack_report_control(double control[UMFPACK_CONTROL], std::complex<double>, int)
-{ umfpack_zi_report_control(control);}
+inline void umfpack_report_control(double control[UMFPACK_CONTROL], std::complex<double>, int) {
+  umfpack_zi_report_control(control);
+}
 
-inline void umfpack_report_control(double control[UMFPACK_CONTROL], double, SuiteSparse_long)
-{ umfpack_dl_report_control(control);}
+inline void umfpack_report_control(double control[UMFPACK_CONTROL], double, SuiteSparse_long) {
+  umfpack_dl_report_control(control);
+}
 
-inline void umfpack_report_control(double control[UMFPACK_CONTROL], std::complex<double>, SuiteSparse_long)
-{ umfpack_zl_report_control(control);}
+inline void umfpack_report_control(double control[UMFPACK_CONTROL], std::complex<double>, SuiteSparse_long) {
+  umfpack_zl_report_control(control);
+}
 
 // Free numeric
-inline void umfpack_free_numeric(void **Numeric, double, int)
-{ umfpack_di_free_numeric(Numeric); *Numeric = 0; }
+inline void umfpack_free_numeric(void **Numeric, double, int) {
+  umfpack_di_free_numeric(Numeric);
+  *Numeric = 0;
+}
 
-inline void umfpack_free_numeric(void **Numeric, std::complex<double>, int)
-{ umfpack_zi_free_numeric(Numeric); *Numeric = 0; }
+inline void umfpack_free_numeric(void **Numeric, std::complex<double>, int) {
+  umfpack_zi_free_numeric(Numeric);
+  *Numeric = 0;
+}
 
-inline void umfpack_free_numeric(void **Numeric, double, SuiteSparse_long)
-{ umfpack_dl_free_numeric(Numeric); *Numeric = 0; }
+inline void umfpack_free_numeric(void **Numeric, double, SuiteSparse_long) {
+  umfpack_dl_free_numeric(Numeric);
+  *Numeric = 0;
+}
 
-inline void umfpack_free_numeric(void **Numeric, std::complex<double>, SuiteSparse_long)
-{ umfpack_zl_free_numeric(Numeric); *Numeric = 0; }
+inline void umfpack_free_numeric(void **Numeric, std::complex<double>, SuiteSparse_long) {
+  umfpack_zl_free_numeric(Numeric);
+  *Numeric = 0;
+}
 
 // Free symbolic
-inline void umfpack_free_symbolic(void **Symbolic, double, int)
-{ umfpack_di_free_symbolic(Symbolic); *Symbolic = 0; }
+inline void umfpack_free_symbolic(void **Symbolic, double, int) {
+  umfpack_di_free_symbolic(Symbolic);
+  *Symbolic = 0;
+}
 
-inline void umfpack_free_symbolic(void **Symbolic, std::complex<double>, int)
-{ umfpack_zi_free_symbolic(Symbolic); *Symbolic = 0; }
+inline void umfpack_free_symbolic(void **Symbolic, std::complex<double>, int) {
+  umfpack_zi_free_symbolic(Symbolic);
+  *Symbolic = 0;
+}
 
-inline void umfpack_free_symbolic(void **Symbolic, double, SuiteSparse_long)
-{ umfpack_dl_free_symbolic(Symbolic); *Symbolic = 0; }
+inline void umfpack_free_symbolic(void **Symbolic, double, SuiteSparse_long) {
+  umfpack_dl_free_symbolic(Symbolic);
+  *Symbolic = 0;
+}
 
-inline void umfpack_free_symbolic(void **Symbolic, std::complex<double>, SuiteSparse_long)
-{ umfpack_zl_free_symbolic(Symbolic); *Symbolic = 0; }
+inline void umfpack_free_symbolic(void **Symbolic, std::complex<double>, SuiteSparse_long) {
+  umfpack_zl_free_symbolic(Symbolic);
+  *Symbolic = 0;
+}
 
 // Symbolic
-inline int umfpack_symbolic(int n_row,int n_col,
-                            const int Ap[], const int Ai[], const double Ax[], void **Symbolic,
-                            const double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])
-{
-  return umfpack_di_symbolic(n_row,n_col,Ap,Ai,Ax,Symbolic,Control,Info);
+inline int umfpack_symbolic(int n_row, int n_col, const int Ap[], const int Ai[], const double Ax[], void **Symbolic,
+                            const double Control[UMFPACK_CONTROL], double Info[UMFPACK_INFO]) {
+  return umfpack_di_symbolic(n_row, n_col, Ap, Ai, Ax, Symbolic, Control, Info);
 }
 
-inline int umfpack_symbolic(int n_row,int n_col,
-                            const int Ap[], const int Ai[], const std::complex<double> Ax[], void **Symbolic,
-                            const double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])
-{
-  return umfpack_zi_symbolic(n_row,n_col,Ap,Ai,&numext::real_ref(Ax[0]),0,Symbolic,Control,Info);
+inline int umfpack_symbolic(int n_row, int n_col, const int Ap[], const int Ai[], const std::complex<double> Ax[],
+                            void **Symbolic, const double Control[UMFPACK_CONTROL], double Info[UMFPACK_INFO]) {
+  return umfpack_zi_symbolic(n_row, n_col, Ap, Ai, &numext::real_ref(Ax[0]), 0, Symbolic, Control, Info);
 }
-inline SuiteSparse_long umfpack_symbolic( SuiteSparse_long n_row,SuiteSparse_long n_col,
-                                          const SuiteSparse_long Ap[], const SuiteSparse_long Ai[], const double Ax[], void **Symbolic,
-                                          const double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])
-{
-  return umfpack_dl_symbolic(n_row,n_col,Ap,Ai,Ax,Symbolic,Control,Info);
+inline SuiteSparse_long umfpack_symbolic(SuiteSparse_long n_row, SuiteSparse_long n_col, const SuiteSparse_long Ap[],
+                                         const SuiteSparse_long Ai[], const double Ax[], void **Symbolic,
+                                         const double Control[UMFPACK_CONTROL], double Info[UMFPACK_INFO]) {
+  return umfpack_dl_symbolic(n_row, n_col, Ap, Ai, Ax, Symbolic, Control, Info);
 }
 
-inline SuiteSparse_long umfpack_symbolic( SuiteSparse_long n_row,SuiteSparse_long n_col,
-                                          const SuiteSparse_long Ap[], const SuiteSparse_long Ai[], const std::complex<double> Ax[], void **Symbolic,
-                                          const double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])
-{
-  return umfpack_zl_symbolic(n_row,n_col,Ap,Ai,&numext::real_ref(Ax[0]),0,Symbolic,Control,Info);
+inline SuiteSparse_long umfpack_symbolic(SuiteSparse_long n_row, SuiteSparse_long n_col, const SuiteSparse_long Ap[],
+                                         const SuiteSparse_long Ai[], const std::complex<double> Ax[], void **Symbolic,
+                                         const double Control[UMFPACK_CONTROL], double Info[UMFPACK_INFO]) {
+  return umfpack_zl_symbolic(n_row, n_col, Ap, Ai, &numext::real_ref(Ax[0]), 0, Symbolic, Control, Info);
 }
 
 // Numeric
-inline int umfpack_numeric( const int Ap[], const int Ai[], const double Ax[],
-                            void *Symbolic, void **Numeric,
-                            const double Control[UMFPACK_CONTROL],double Info [UMFPACK_INFO])
-{
-  return umfpack_di_numeric(Ap,Ai,Ax,Symbolic,Numeric,Control,Info);
+inline int umfpack_numeric(const int Ap[], const int Ai[], const double Ax[], void *Symbolic, void **Numeric,
+                           const double Control[UMFPACK_CONTROL], double Info[UMFPACK_INFO]) {
+  return umfpack_di_numeric(Ap, Ai, Ax, Symbolic, Numeric, Control, Info);
 }
 
-inline int umfpack_numeric( const int Ap[], const int Ai[], const std::complex<double> Ax[],
-                            void *Symbolic, void **Numeric,
-                            const double Control[UMFPACK_CONTROL],double Info [UMFPACK_INFO])
-{
-  return umfpack_zi_numeric(Ap,Ai,&numext::real_ref(Ax[0]),0,Symbolic,Numeric,Control,Info);
+inline int umfpack_numeric(const int Ap[], const int Ai[], const std::complex<double> Ax[], void *Symbolic,
+                           void **Numeric, const double Control[UMFPACK_CONTROL], double Info[UMFPACK_INFO]) {
+  return umfpack_zi_numeric(Ap, Ai, &numext::real_ref(Ax[0]), 0, Symbolic, Numeric, Control, Info);
 }
 inline SuiteSparse_long umfpack_numeric(const SuiteSparse_long Ap[], const SuiteSparse_long Ai[], const double Ax[],
-                                        void *Symbolic, void **Numeric,
-                                        const double Control[UMFPACK_CONTROL],double Info [UMFPACK_INFO])
-{
-  return umfpack_dl_numeric(Ap,Ai,Ax,Symbolic,Numeric,Control,Info);
+                                        void *Symbolic, void **Numeric, const double Control[UMFPACK_CONTROL],
+                                        double Info[UMFPACK_INFO]) {
+  return umfpack_dl_numeric(Ap, Ai, Ax, Symbolic, Numeric, Control, Info);
 }
 
-inline SuiteSparse_long umfpack_numeric(const SuiteSparse_long Ap[], const SuiteSparse_long Ai[], const std::complex<double> Ax[],
-                                        void *Symbolic, void **Numeric,
-                                        const double Control[UMFPACK_CONTROL],double Info [UMFPACK_INFO])
-{
-  return umfpack_zl_numeric(Ap,Ai,&numext::real_ref(Ax[0]),0,Symbolic,Numeric,Control,Info);
+inline SuiteSparse_long umfpack_numeric(const SuiteSparse_long Ap[], const SuiteSparse_long Ai[],
+                                        const std::complex<double> Ax[], void *Symbolic, void **Numeric,
+                                        const double Control[UMFPACK_CONTROL], double Info[UMFPACK_INFO]) {
+  return umfpack_zl_numeric(Ap, Ai, &numext::real_ref(Ax[0]), 0, Symbolic, Numeric, Control, Info);
 }
 
 // solve
-inline int umfpack_solve( int sys, const int Ap[], const int Ai[], const double Ax[],
-                          double X[], const double B[], void *Numeric,
-                          const double Control[UMFPACK_CONTROL], double Info[UMFPACK_INFO])
-{
-  return umfpack_di_solve(sys,Ap,Ai,Ax,X,B,Numeric,Control,Info);
+inline int umfpack_solve(int sys, const int Ap[], const int Ai[], const double Ax[], double X[], const double B[],
+                         void *Numeric, const double Control[UMFPACK_CONTROL], double Info[UMFPACK_INFO]) {
+  return umfpack_di_solve(sys, Ap, Ai, Ax, X, B, Numeric, Control, Info);
 }
 
-inline int umfpack_solve( int sys, const int Ap[], const int Ai[], const std::complex<double> Ax[],
-                          std::complex<double> X[], const std::complex<double> B[], void *Numeric,
-                          const double Control[UMFPACK_CONTROL], double Info[UMFPACK_INFO])
-{
-  return umfpack_zi_solve(sys,Ap,Ai,&numext::real_ref(Ax[0]),0,&numext::real_ref(X[0]),0,&numext::real_ref(B[0]),0,Numeric,Control,Info);
+inline int umfpack_solve(int sys, const int Ap[], const int Ai[], const std::complex<double> Ax[],
+                         std::complex<double> X[], const std::complex<double> B[], void *Numeric,
+                         const double Control[UMFPACK_CONTROL], double Info[UMFPACK_INFO]) {
+  return umfpack_zi_solve(sys, Ap, Ai, &numext::real_ref(Ax[0]), 0, &numext::real_ref(X[0]), 0, &numext::real_ref(B[0]),
+                          0, Numeric, Control, Info);
 }
 
-inline SuiteSparse_long umfpack_solve(int sys, const SuiteSparse_long Ap[], const SuiteSparse_long Ai[], const double Ax[],
-                                      double X[], const double B[], void *Numeric,
-                                      const double Control[UMFPACK_CONTROL], double Info[UMFPACK_INFO])
-{
-  return umfpack_dl_solve(sys,Ap,Ai,Ax,X,B,Numeric,Control,Info);
+inline SuiteSparse_long umfpack_solve(int sys, const SuiteSparse_long Ap[], const SuiteSparse_long Ai[],
+                                      const double Ax[], double X[], const double B[], void *Numeric,
+                                      const double Control[UMFPACK_CONTROL], double Info[UMFPACK_INFO]) {
+  return umfpack_dl_solve(sys, Ap, Ai, Ax, X, B, Numeric, Control, Info);
 }
 
-inline SuiteSparse_long umfpack_solve(int sys, const SuiteSparse_long Ap[], const SuiteSparse_long Ai[], const std::complex<double> Ax[],
-                                      std::complex<double> X[], const std::complex<double> B[], void *Numeric,
-                                      const double Control[UMFPACK_CONTROL], double Info[UMFPACK_INFO])
-{
-  return umfpack_zl_solve(sys,Ap,Ai,&numext::real_ref(Ax[0]),0,&numext::real_ref(X[0]),0,&numext::real_ref(B[0]),0,Numeric,Control,Info);
+inline SuiteSparse_long umfpack_solve(int sys, const SuiteSparse_long Ap[], const SuiteSparse_long Ai[],
+                                      const std::complex<double> Ax[], std::complex<double> X[],
+                                      const std::complex<double> B[], void *Numeric,
+                                      const double Control[UMFPACK_CONTROL], double Info[UMFPACK_INFO]) {
+  return umfpack_zl_solve(sys, Ap, Ai, &numext::real_ref(Ax[0]), 0, &numext::real_ref(X[0]), 0, &numext::real_ref(B[0]),
+                          0, Numeric, Control, Info);
 }
 
 // Get Lunz
-inline int umfpack_get_lunz(int *lnz, int *unz, int *n_row, int *n_col, int *nz_udiag, void *Numeric, double)
-{
-  return umfpack_di_get_lunz(lnz,unz,n_row,n_col,nz_udiag,Numeric);
+inline int umfpack_get_lunz(int *lnz, int *unz, int *n_row, int *n_col, int *nz_udiag, void *Numeric, double) {
+  return umfpack_di_get_lunz(lnz, unz, n_row, n_col, nz_udiag, Numeric);
 }
 
-inline int umfpack_get_lunz(int *lnz, int *unz, int *n_row, int *n_col, int *nz_udiag, void *Numeric, std::complex<double>)
-{
-  return umfpack_zi_get_lunz(lnz,unz,n_row,n_col,nz_udiag,Numeric);
+inline int umfpack_get_lunz(int *lnz, int *unz, int *n_row, int *n_col, int *nz_udiag, void *Numeric,
+                            std::complex<double>) {
+  return umfpack_zi_get_lunz(lnz, unz, n_row, n_col, nz_udiag, Numeric);
 }
 
-inline SuiteSparse_long umfpack_get_lunz( SuiteSparse_long *lnz, SuiteSparse_long *unz, SuiteSparse_long *n_row, SuiteSparse_long *n_col,
-                                          SuiteSparse_long *nz_udiag, void *Numeric, double)
-{
-  return umfpack_dl_get_lunz(lnz,unz,n_row,n_col,nz_udiag,Numeric);
+inline SuiteSparse_long umfpack_get_lunz(SuiteSparse_long *lnz, SuiteSparse_long *unz, SuiteSparse_long *n_row,
+                                         SuiteSparse_long *n_col, SuiteSparse_long *nz_udiag, void *Numeric, double) {
+  return umfpack_dl_get_lunz(lnz, unz, n_row, n_col, nz_udiag, Numeric);
 }
 
-inline SuiteSparse_long umfpack_get_lunz( SuiteSparse_long *lnz, SuiteSparse_long *unz, SuiteSparse_long *n_row, SuiteSparse_long *n_col,
-                                          SuiteSparse_long *nz_udiag, void *Numeric, std::complex<double>)
-{
-  return umfpack_zl_get_lunz(lnz,unz,n_row,n_col,nz_udiag,Numeric);
+inline SuiteSparse_long umfpack_get_lunz(SuiteSparse_long *lnz, SuiteSparse_long *unz, SuiteSparse_long *n_row,
+                                         SuiteSparse_long *n_col, SuiteSparse_long *nz_udiag, void *Numeric,
+                                         std::complex<double>) {
+  return umfpack_zl_get_lunz(lnz, unz, n_row, n_col, nz_udiag, Numeric);
 }
 
 // Get Numeric
-inline int umfpack_get_numeric(int Lp[], int Lj[], double Lx[], int Up[], int Ui[], double Ux[],
-                               int P[], int Q[], double Dx[], int *do_recip, double Rs[], void *Numeric)
-{
-  return umfpack_di_get_numeric(Lp,Lj,Lx,Up,Ui,Ux,P,Q,Dx,do_recip,Rs,Numeric);
+inline int umfpack_get_numeric(int Lp[], int Lj[], double Lx[], int Up[], int Ui[], double Ux[], int P[], int Q[],
+                               double Dx[], int *do_recip, double Rs[], void *Numeric) {
+  return umfpack_di_get_numeric(Lp, Lj, Lx, Up, Ui, Ux, P, Q, Dx, do_recip, Rs, Numeric);
 }
 
-inline int umfpack_get_numeric(int Lp[], int Lj[], std::complex<double> Lx[], int Up[], int Ui[], std::complex<double> Ux[],
-                               int P[], int Q[], std::complex<double> Dx[], int *do_recip, double Rs[], void *Numeric)
-{
-  double& lx0_real = numext::real_ref(Lx[0]);
-  double& ux0_real = numext::real_ref(Ux[0]);
-  double& dx0_real = numext::real_ref(Dx[0]);
-  return umfpack_zi_get_numeric(Lp,Lj,Lx?&lx0_real:0,0,Up,Ui,Ux?&ux0_real:0,0,P,Q,
-                                Dx?&dx0_real:0,0,do_recip,Rs,Numeric);
+inline int umfpack_get_numeric(int Lp[], int Lj[], std::complex<double> Lx[], int Up[], int Ui[],
+                               std::complex<double> Ux[], int P[], int Q[], std::complex<double> Dx[], int *do_recip,
+                               double Rs[], void *Numeric) {
+  double &lx0_real = numext::real_ref(Lx[0]);
+  double &ux0_real = numext::real_ref(Ux[0]);
+  double &dx0_real = numext::real_ref(Dx[0]);
+  return umfpack_zi_get_numeric(Lp, Lj, Lx ? &lx0_real : 0, 0, Up, Ui, Ux ? &ux0_real : 0, 0, P, Q, Dx ? &dx0_real : 0,
+                                0, do_recip, Rs, Numeric);
 }
-inline SuiteSparse_long umfpack_get_numeric(SuiteSparse_long Lp[], SuiteSparse_long Lj[], double Lx[], SuiteSparse_long Up[], SuiteSparse_long Ui[], double Ux[],
-                                            SuiteSparse_long P[], SuiteSparse_long Q[], double Dx[], SuiteSparse_long *do_recip, double Rs[], void *Numeric)
-{
-  return umfpack_dl_get_numeric(Lp,Lj,Lx,Up,Ui,Ux,P,Q,Dx,do_recip,Rs,Numeric);
+inline SuiteSparse_long umfpack_get_numeric(SuiteSparse_long Lp[], SuiteSparse_long Lj[], double Lx[],
+                                            SuiteSparse_long Up[], SuiteSparse_long Ui[], double Ux[],
+                                            SuiteSparse_long P[], SuiteSparse_long Q[], double Dx[],
+                                            SuiteSparse_long *do_recip, double Rs[], void *Numeric) {
+  return umfpack_dl_get_numeric(Lp, Lj, Lx, Up, Ui, Ux, P, Q, Dx, do_recip, Rs, Numeric);
 }
 
-inline SuiteSparse_long umfpack_get_numeric(SuiteSparse_long Lp[], SuiteSparse_long Lj[], std::complex<double> Lx[], SuiteSparse_long Up[], SuiteSparse_long Ui[], std::complex<double> Ux[],
-                                            SuiteSparse_long P[], SuiteSparse_long Q[], std::complex<double> Dx[], SuiteSparse_long *do_recip, double Rs[], void *Numeric)
-{
-  double& lx0_real = numext::real_ref(Lx[0]);
-  double& ux0_real = numext::real_ref(Ux[0]);
-  double& dx0_real = numext::real_ref(Dx[0]);
-  return umfpack_zl_get_numeric(Lp,Lj,Lx?&lx0_real:0,0,Up,Ui,Ux?&ux0_real:0,0,P,Q,
-                                Dx?&dx0_real:0,0,do_recip,Rs,Numeric);
+inline SuiteSparse_long umfpack_get_numeric(SuiteSparse_long Lp[], SuiteSparse_long Lj[], std::complex<double> Lx[],
+                                            SuiteSparse_long Up[], SuiteSparse_long Ui[], std::complex<double> Ux[],
+                                            SuiteSparse_long P[], SuiteSparse_long Q[], std::complex<double> Dx[],
+                                            SuiteSparse_long *do_recip, double Rs[], void *Numeric) {
+  double &lx0_real = numext::real_ref(Lx[0]);
+  double &ux0_real = numext::real_ref(Ux[0]);
+  double &dx0_real = numext::real_ref(Dx[0]);
+  return umfpack_zl_get_numeric(Lp, Lj, Lx ? &lx0_real : 0, 0, Up, Ui, Ux ? &ux0_real : 0, 0, P, Q, Dx ? &dx0_real : 0,
+                                0, do_recip, Rs, Numeric);
 }
 
 // Get Determinant
-inline int umfpack_get_determinant(double *Mx, double *Ex, void *NumericHandle, double User_Info [UMFPACK_INFO], int)
-{
-  return umfpack_di_get_determinant(Mx,Ex,NumericHandle,User_Info);
+inline int umfpack_get_determinant(double *Mx, double *Ex, void *NumericHandle, double User_Info[UMFPACK_INFO], int) {
+  return umfpack_di_get_determinant(Mx, Ex, NumericHandle, User_Info);
 }
 
-inline int umfpack_get_determinant(std::complex<double> *Mx, double *Ex, void *NumericHandle, double User_Info [UMFPACK_INFO], int)
-{
-  double& mx_real = numext::real_ref(*Mx);
-  return umfpack_zi_get_determinant(&mx_real,0,Ex,NumericHandle,User_Info);
+inline int umfpack_get_determinant(std::complex<double> *Mx, double *Ex, void *NumericHandle,
+                                   double User_Info[UMFPACK_INFO], int) {
+  double &mx_real = numext::real_ref(*Mx);
+  return umfpack_zi_get_determinant(&mx_real, 0, Ex, NumericHandle, User_Info);
 }
 
-inline SuiteSparse_long umfpack_get_determinant(double *Mx, double *Ex, void *NumericHandle, double User_Info [UMFPACK_INFO], SuiteSparse_long)
-{
-  return umfpack_dl_get_determinant(Mx,Ex,NumericHandle,User_Info);
+inline SuiteSparse_long umfpack_get_determinant(double *Mx, double *Ex, void *NumericHandle,
+                                                double User_Info[UMFPACK_INFO], SuiteSparse_long) {
+  return umfpack_dl_get_determinant(Mx, Ex, NumericHandle, User_Info);
 }
 
-inline SuiteSparse_long umfpack_get_determinant(std::complex<double> *Mx, double *Ex, void *NumericHandle, double User_Info [UMFPACK_INFO], SuiteSparse_long)
-{
-  double& mx_real = numext::real_ref(*Mx);
-  return umfpack_zl_get_determinant(&mx_real,0,Ex,NumericHandle,User_Info);
+inline SuiteSparse_long umfpack_get_determinant(std::complex<double> *Mx, double *Ex, void *NumericHandle,
+                                                double User_Info[UMFPACK_INFO], SuiteSparse_long) {
+  double &mx_real = numext::real_ref(*Mx);
+  return umfpack_zl_get_determinant(&mx_real, 0, Ex, NumericHandle, User_Info);
 }
 
-
 /** \ingroup UmfPackSupport_Module
-  * \brief A sparse LU factorization and solver based on UmfPack
-  *
-  * This class allows to solve for A.X = B sparse linear problems via a LU factorization
-  * using the UmfPack library. The sparse matrix A must be squared and full rank.
-  * The vectors or matrices X and B can be either dense or sparse.
-  *
-  * \warning The input matrix A should be in a \b compressed and \b column-major form.
-  * Otherwise an expensive copy will be made. You can call the inexpensive makeCompressed() to get a compressed matrix.
-  * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
-  *
-  * \implsparsesolverconcept
-  *
-  * \sa \ref TutorialSparseSolverConcept, class SparseLU
-  */
-template<typename MatrixType_>
-class UmfPackLU : public SparseSolverBase<UmfPackLU<MatrixType_> >
-{
-  protected:
-    typedef SparseSolverBase<UmfPackLU<MatrixType_> > Base;
-    using Base::m_isInitialized;
-  public:
-    using Base::_solve_impl;
-    typedef MatrixType_ MatrixType;
-    typedef typename MatrixType::Scalar Scalar;
-    typedef typename MatrixType::RealScalar RealScalar;
-    typedef typename MatrixType::StorageIndex StorageIndex;
-    typedef Matrix<Scalar,Dynamic,1> Vector;
-    typedef Matrix<int, 1, MatrixType::ColsAtCompileTime> IntRowVectorType;
-    typedef Matrix<int, MatrixType::RowsAtCompileTime, 1> IntColVectorType;
-    typedef SparseMatrix<Scalar> LUMatrixType;
-    typedef SparseMatrix<Scalar,ColMajor,StorageIndex> UmfpackMatrixType;
-    typedef Ref<const UmfpackMatrixType, StandardCompressedFormat> UmfpackMatrixRef;
-    enum {
-      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
-      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
-    };
+ * \brief A sparse LU factorization and solver based on UmfPack
+ *
+ * This class allows to solve for A.X = B sparse linear problems via a LU factorization
+ * using the UmfPack library. The sparse matrix A must be squared and full rank.
+ * The vectors or matrices X and B can be either dense or sparse.
+ *
+ * \warning The input matrix A should be in a \b compressed and \b column-major form.
+ * Otherwise an expensive copy will be made. You can call the inexpensive makeCompressed() to get a compressed matrix.
+ * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
+ *
+ * \implsparsesolverconcept
+ *
+ * \sa \ref TutorialSparseSolverConcept, class SparseLU
+ */
+template <typename MatrixType_>
+class UmfPackLU : public SparseSolverBase<UmfPackLU<MatrixType_> > {
+ protected:
+  typedef SparseSolverBase<UmfPackLU<MatrixType_> > Base;
+  using Base::m_isInitialized;
 
-  public:
+ public:
+  using Base::_solve_impl;
+  typedef MatrixType_ MatrixType;
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::RealScalar RealScalar;
+  typedef typename MatrixType::StorageIndex StorageIndex;
+  typedef Matrix<Scalar, Dynamic, 1> Vector;
+  typedef Matrix<int, 1, MatrixType::ColsAtCompileTime> IntRowVectorType;
+  typedef Matrix<int, MatrixType::RowsAtCompileTime, 1> IntColVectorType;
+  typedef SparseMatrix<Scalar> LUMatrixType;
+  typedef SparseMatrix<Scalar, ColMajor, StorageIndex> UmfpackMatrixType;
+  typedef Ref<const UmfpackMatrixType, StandardCompressedFormat> UmfpackMatrixRef;
+  enum { ColsAtCompileTime = MatrixType::ColsAtCompileTime, MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime };
 
-    typedef Array<double, UMFPACK_CONTROL, 1> UmfpackControl;
-    typedef Array<double, UMFPACK_INFO, 1> UmfpackInfo;
+ public:
+  typedef Array<double, UMFPACK_CONTROL, 1> UmfpackControl;
+  typedef Array<double, UMFPACK_INFO, 1> UmfpackInfo;
 
-    UmfPackLU()
-      : m_dummy(0,0), mp_matrix(m_dummy)
-    {
-      init();
-    }
+  UmfPackLU() : m_dummy(0, 0), mp_matrix(m_dummy) { init(); }
 
-    template<typename InputMatrixType>
-    explicit UmfPackLU(const InputMatrixType& matrix)
-      : mp_matrix(matrix)
-    {
-      init();
-      compute(matrix);
-    }
+  template <typename InputMatrixType>
+  explicit UmfPackLU(const InputMatrixType &matrix) : mp_matrix(matrix) {
+    init();
+    compute(matrix);
+  }
 
-    ~UmfPackLU()
-    {
-      if(m_symbolic) umfpack_free_symbolic(&m_symbolic,Scalar(), StorageIndex());
-      if(m_numeric)  umfpack_free_numeric(&m_numeric,Scalar(), StorageIndex());
-    }
+  ~UmfPackLU() {
+    if (m_symbolic) umfpack_free_symbolic(&m_symbolic, Scalar(), StorageIndex());
+    if (m_numeric) umfpack_free_numeric(&m_numeric, Scalar(), StorageIndex());
+  }
 
-    inline Index rows() const { return mp_matrix.rows(); }
-    inline Index cols() const { return mp_matrix.cols(); }
+  inline Index rows() const { return mp_matrix.rows(); }
+  inline Index cols() const { return mp_matrix.cols(); }
 
-    /** \brief Reports whether previous computation was successful.
-      *
-      * \returns \c Success if computation was successful,
-      *          \c NumericalIssue if the matrix.appears to be negative.
-      */
-    ComputationInfo info() const
-    {
-      eigen_assert(m_isInitialized && "Decomposition is not initialized.");
-      return m_info;
-    }
+  /** \brief Reports whether previous computation was successful.
+   *
+   * \returns \c Success if computation was successful,
+   *          \c NumericalIssue if the matrix.appears to be negative.
+   */
+  ComputationInfo info() const {
+    eigen_assert(m_isInitialized && "Decomposition is not initialized.");
+    return m_info;
+  }
 
-    inline const LUMatrixType& matrixL() const
-    {
-      if (m_extractedDataAreDirty) extractData();
-      return m_l;
-    }
+  inline const LUMatrixType &matrixL() const {
+    if (m_extractedDataAreDirty) extractData();
+    return m_l;
+  }
 
-    inline const LUMatrixType& matrixU() const
-    {
-      if (m_extractedDataAreDirty) extractData();
-      return m_u;
-    }
+  inline const LUMatrixType &matrixU() const {
+    if (m_extractedDataAreDirty) extractData();
+    return m_u;
+  }
 
-    inline const IntColVectorType& permutationP() const
-    {
-      if (m_extractedDataAreDirty) extractData();
-      return m_p;
-    }
+  inline const IntColVectorType &permutationP() const {
+    if (m_extractedDataAreDirty) extractData();
+    return m_p;
+  }
 
-    inline const IntRowVectorType& permutationQ() const
-    {
-      if (m_extractedDataAreDirty) extractData();
-      return m_q;
-    }
+  inline const IntRowVectorType &permutationQ() const {
+    if (m_extractedDataAreDirty) extractData();
+    return m_q;
+  }
 
-    /** Computes the sparse Cholesky decomposition of \a matrix
-     *  Note that the matrix should be column-major, and in compressed format for best performance.
-     *  \sa SparseMatrix::makeCompressed().
-     */
-    template<typename InputMatrixType>
-    void compute(const InputMatrixType& matrix)
-    {
-      if(m_symbolic) umfpack_free_symbolic(&m_symbolic,Scalar(),StorageIndex());
-      if(m_numeric)  umfpack_free_numeric(&m_numeric,Scalar(),StorageIndex());
-      grab(matrix.derived());
-      analyzePattern_impl();
-      factorize_impl();
-    }
+  /** Computes the sparse Cholesky decomposition of \a matrix
+   *  Note that the matrix should be column-major, and in compressed format for best performance.
+   *  \sa SparseMatrix::makeCompressed().
+   */
+  template <typename InputMatrixType>
+  void compute(const InputMatrixType &matrix) {
+    if (m_symbolic) umfpack_free_symbolic(&m_symbolic, Scalar(), StorageIndex());
+    if (m_numeric) umfpack_free_numeric(&m_numeric, Scalar(), StorageIndex());
+    grab(matrix.derived());
+    analyzePattern_impl();
+    factorize_impl();
+  }
 
-    /** Performs a symbolic decomposition on the sparcity of \a matrix.
-      *
-      * This function is particularly useful when solving for several problems having the same structure.
-      *
-      * \sa factorize(), compute()
-      */
-    template<typename InputMatrixType>
-    void analyzePattern(const InputMatrixType& matrix)
-    {
-      if(m_symbolic) umfpack_free_symbolic(&m_symbolic,Scalar(),StorageIndex());
-      if(m_numeric)  umfpack_free_numeric(&m_numeric,Scalar(),StorageIndex());
+  /** Performs a symbolic decomposition on the sparcity of \a matrix.
+   *
+   * This function is particularly useful when solving for several problems having the same structure.
+   *
+   * \sa factorize(), compute()
+   */
+  template <typename InputMatrixType>
+  void analyzePattern(const InputMatrixType &matrix) {
+    if (m_symbolic) umfpack_free_symbolic(&m_symbolic, Scalar(), StorageIndex());
+    if (m_numeric) umfpack_free_numeric(&m_numeric, Scalar(), StorageIndex());
 
-      grab(matrix.derived());
+    grab(matrix.derived());
 
-      analyzePattern_impl();
-    }
+    analyzePattern_impl();
+  }
 
-    /** Provides the return status code returned by UmfPack during the numeric
-      * factorization.
-      *
-      * \sa factorize(), compute()
-      */
-    inline int umfpackFactorizeReturncode() const
-    {
-      eigen_assert(m_numeric && "UmfPackLU: you must first call factorize()");
-      return m_fact_errorCode;
-    }
+  /** Provides the return status code returned by UmfPack during the numeric
+   * factorization.
+   *
+   * \sa factorize(), compute()
+   */
+  inline int umfpackFactorizeReturncode() const {
+    eigen_assert(m_numeric && "UmfPackLU: you must first call factorize()");
+    return m_fact_errorCode;
+  }
 
-    /** Provides access to the control settings array used by UmfPack.
-      *
-      * If this array contains NaN's, the default values are used.
-      *
-      * See UMFPACK documentation for details.
-      */
-    inline const UmfpackControl& umfpackControl() const
-    {
-      return m_control;
-    }
+  /** Provides access to the control settings array used by UmfPack.
+   *
+   * If this array contains NaN's, the default values are used.
+   *
+   * See UMFPACK documentation for details.
+   */
+  inline const UmfpackControl &umfpackControl() const { return m_control; }
 
-    /** Provides access to the control settings array used by UmfPack.
-      *
-      * If this array contains NaN's, the default values are used.
-      *
-      * See UMFPACK documentation for details.
-      */
-    inline UmfpackControl& umfpackControl()
-    {
-      return m_control;
-    }
+  /** Provides access to the control settings array used by UmfPack.
+   *
+   * If this array contains NaN's, the default values are used.
+   *
+   * See UMFPACK documentation for details.
+   */
+  inline UmfpackControl &umfpackControl() { return m_control; }
 
-    /** Performs a numeric decomposition of \a matrix
-      *
-      * The given matrix must has the same sparcity than the matrix on which the pattern anylysis has been performed.
-      *
-      * \sa analyzePattern(), compute()
-      */
-    template<typename InputMatrixType>
-    void factorize(const InputMatrixType& matrix)
-    {
-      eigen_assert(m_analysisIsOk && "UmfPackLU: you must first call analyzePattern()");
-      if(m_numeric)
-        umfpack_free_numeric(&m_numeric,Scalar(),StorageIndex());
+  /** Performs a numeric decomposition of \a matrix
+   *
+   * The given matrix must has the same sparcity than the matrix on which the pattern anylysis has been performed.
+   *
+   * \sa analyzePattern(), compute()
+   */
+  template <typename InputMatrixType>
+  void factorize(const InputMatrixType &matrix) {
+    eigen_assert(m_analysisIsOk && "UmfPackLU: you must first call analyzePattern()");
+    if (m_numeric) umfpack_free_numeric(&m_numeric, Scalar(), StorageIndex());
 
-      grab(matrix.derived());
+    grab(matrix.derived());
 
-      factorize_impl();
-    }
+    factorize_impl();
+  }
 
-    /** Prints the current UmfPack control settings.
-      *
-      * \sa umfpackControl()
-      */
-    void printUmfpackControl()
-    {
-      umfpack_report_control(m_control.data(), Scalar(),StorageIndex());
-    }
+  /** Prints the current UmfPack control settings.
+   *
+   * \sa umfpackControl()
+   */
+  void printUmfpackControl() { umfpack_report_control(m_control.data(), Scalar(), StorageIndex()); }
 
-    /** Prints statistics collected by UmfPack.
-      *
-      * \sa analyzePattern(), compute()
-      */
-    void printUmfpackInfo()
-    {
-      eigen_assert(m_analysisIsOk && "UmfPackLU: you must first call analyzePattern()");
-      umfpack_report_info(m_control.data(), m_umfpackInfo.data(), Scalar(),StorageIndex());
-    }
+  /** Prints statistics collected by UmfPack.
+   *
+   * \sa analyzePattern(), compute()
+   */
+  void printUmfpackInfo() {
+    eigen_assert(m_analysisIsOk && "UmfPackLU: you must first call analyzePattern()");
+    umfpack_report_info(m_control.data(), m_umfpackInfo.data(), Scalar(), StorageIndex());
+  }
 
-    /** Prints the status of the previous factorization operation performed by UmfPack (symbolic or numerical factorization).
-      *
-      * \sa analyzePattern(), compute()
-      */
-    void printUmfpackStatus() {
-      eigen_assert(m_analysisIsOk && "UmfPackLU: you must first call analyzePattern()");
-      umfpack_report_status(m_control.data(), m_fact_errorCode, Scalar(),StorageIndex());
-    }
+  /** Prints the status of the previous factorization operation performed by UmfPack (symbolic or numerical
+   * factorization).
+   *
+   * \sa analyzePattern(), compute()
+   */
+  void printUmfpackStatus() {
+    eigen_assert(m_analysisIsOk && "UmfPackLU: you must first call analyzePattern()");
+    umfpack_report_status(m_control.data(), m_fact_errorCode, Scalar(), StorageIndex());
+  }
 
-    /** \internal */
-    template<typename BDerived,typename XDerived>
-    bool _solve_impl(const MatrixBase<BDerived> &b, MatrixBase<XDerived> &x) const;
+  /** \internal */
+  template <typename BDerived, typename XDerived>
+  bool _solve_impl(const MatrixBase<BDerived> &b, MatrixBase<XDerived> &x) const;
 
-    Scalar determinant() const;
+  Scalar determinant() const;
 
-    void extractData() const;
+  void extractData() const;
 
-  protected:
+ protected:
+  void init() {
+    m_info = InvalidInput;
+    m_isInitialized = false;
+    m_numeric = 0;
+    m_symbolic = 0;
+    m_extractedDataAreDirty = true;
 
-    void init()
-    {
-      m_info                  = InvalidInput;
-      m_isInitialized         = false;
-      m_numeric               = 0;
-      m_symbolic              = 0;
-      m_extractedDataAreDirty = true;
+    umfpack_defaults(m_control.data(), Scalar(), StorageIndex());
+  }
 
-      umfpack_defaults(m_control.data(), Scalar(),StorageIndex());
-    }
+  void analyzePattern_impl() {
+    m_fact_errorCode = umfpack_symbolic(internal::convert_index<StorageIndex>(mp_matrix.rows()),
+                                        internal::convert_index<StorageIndex>(mp_matrix.cols()),
+                                        mp_matrix.outerIndexPtr(), mp_matrix.innerIndexPtr(), mp_matrix.valuePtr(),
+                                        &m_symbolic, m_control.data(), m_umfpackInfo.data());
 
-    void analyzePattern_impl()
-    {
-      m_fact_errorCode = umfpack_symbolic(internal::convert_index<StorageIndex>(mp_matrix.rows()),
-                                          internal::convert_index<StorageIndex>(mp_matrix.cols()),
-                                          mp_matrix.outerIndexPtr(), mp_matrix.innerIndexPtr(), mp_matrix.valuePtr(),
-                                          &m_symbolic, m_control.data(), m_umfpackInfo.data());
+    m_isInitialized = true;
+    m_info = m_fact_errorCode ? InvalidInput : Success;
+    m_analysisIsOk = true;
+    m_factorizationIsOk = false;
+    m_extractedDataAreDirty = true;
+  }
 
-      m_isInitialized = true;
-      m_info = m_fact_errorCode ? InvalidInput : Success;
-      m_analysisIsOk = true;
-      m_factorizationIsOk = false;
-      m_extractedDataAreDirty = true;
-    }
+  void factorize_impl() {
+    m_fact_errorCode = umfpack_numeric(mp_matrix.outerIndexPtr(), mp_matrix.innerIndexPtr(), mp_matrix.valuePtr(),
+                                       m_symbolic, &m_numeric, m_control.data(), m_umfpackInfo.data());
 
-    void factorize_impl()
-    {
+    m_info = m_fact_errorCode == UMFPACK_OK ? Success : NumericalIssue;
+    m_factorizationIsOk = true;
+    m_extractedDataAreDirty = true;
+  }
 
-      m_fact_errorCode = umfpack_numeric(mp_matrix.outerIndexPtr(), mp_matrix.innerIndexPtr(), mp_matrix.valuePtr(),
-                                         m_symbolic, &m_numeric, m_control.data(), m_umfpackInfo.data());
+  template <typename MatrixDerived>
+  void grab(const EigenBase<MatrixDerived> &A) {
+    internal::destroy_at(&mp_matrix);
+    internal::construct_at(&mp_matrix, A.derived());
+  }
 
-      m_info = m_fact_errorCode == UMFPACK_OK ? Success : NumericalIssue;
-      m_factorizationIsOk = true;
-      m_extractedDataAreDirty = true;
-    }
-
-    template<typename MatrixDerived>
-    void grab(const EigenBase<MatrixDerived> &A)
-    {
+  void grab(const UmfpackMatrixRef &A) {
+    if (&(A.derived()) != &mp_matrix) {
       internal::destroy_at(&mp_matrix);
-      internal::construct_at(&mp_matrix, A.derived());
+      internal::construct_at(&mp_matrix, A);
     }
+  }
 
-    void grab(const UmfpackMatrixRef &A)
-    {
-      if(&(A.derived()) != &mp_matrix)
-      {
-        internal::destroy_at(&mp_matrix);
-        internal::construct_at(&mp_matrix, A);
-      }
-    }
+  // cached data to reduce reallocation, etc.
+  mutable LUMatrixType m_l;
+  StorageIndex m_fact_errorCode;
+  UmfpackControl m_control;
+  mutable UmfpackInfo m_umfpackInfo;
 
-    // cached data to reduce reallocation, etc.
-    mutable LUMatrixType m_l;
-    StorageIndex m_fact_errorCode;
-    UmfpackControl m_control;
-    mutable UmfpackInfo m_umfpackInfo;
+  mutable LUMatrixType m_u;
+  mutable IntColVectorType m_p;
+  mutable IntRowVectorType m_q;
 
-    mutable LUMatrixType m_u;
-    mutable IntColVectorType m_p;
-    mutable IntRowVectorType m_q;
+  UmfpackMatrixType m_dummy;
+  UmfpackMatrixRef mp_matrix;
 
-    UmfpackMatrixType m_dummy;
-    UmfpackMatrixRef mp_matrix;
+  void *m_numeric;
+  void *m_symbolic;
 
-    void* m_numeric;
-    void* m_symbolic;
+  mutable ComputationInfo m_info;
+  int m_factorizationIsOk;
+  int m_analysisIsOk;
+  mutable bool m_extractedDataAreDirty;
 
-    mutable ComputationInfo m_info;
-    int m_factorizationIsOk;
-    int m_analysisIsOk;
-    mutable bool m_extractedDataAreDirty;
-
-  private:
-    UmfPackLU(const UmfPackLU& ) { }
+ private:
+  UmfPackLU(const UmfPackLU &) {}
 };
 
-
-template<typename MatrixType>
-void UmfPackLU<MatrixType>::extractData() const
-{
-  if (m_extractedDataAreDirty)
-  {
+template <typename MatrixType>
+void UmfPackLU<MatrixType>::extractData() const {
+  if (m_extractedDataAreDirty) {
     // get size of the data
     StorageIndex lnz, unz, rows, cols, nz_udiag;
     umfpack_get_lunz(&lnz, &unz, &rows, &cols, &nz_udiag, m_numeric, Scalar());
 
     // allocate data
-    m_l.resize(rows,(std::min)(rows,cols));
+    m_l.resize(rows, (std::min)(rows, cols));
     m_l.resizeNonZeros(lnz);
 
-    m_u.resize((std::min)(rows,cols),cols);
+    m_u.resize((std::min)(rows, cols), cols);
     m_u.resizeNonZeros(unz);
 
     m_p.resize(rows);
     m_q.resize(cols);
 
     // extract
-    umfpack_get_numeric(m_l.outerIndexPtr(), m_l.innerIndexPtr(), m_l.valuePtr(),
-                        m_u.outerIndexPtr(), m_u.innerIndexPtr(), m_u.valuePtr(),
-                        m_p.data(), m_q.data(), 0, 0, 0, m_numeric);
+    umfpack_get_numeric(m_l.outerIndexPtr(), m_l.innerIndexPtr(), m_l.valuePtr(), m_u.outerIndexPtr(),
+                        m_u.innerIndexPtr(), m_u.valuePtr(), m_p.data(), m_q.data(), 0, 0, 0, m_numeric);
 
     m_extractedDataAreDirty = false;
   }
 }
 
-template<typename MatrixType>
-typename UmfPackLU<MatrixType>::Scalar UmfPackLU<MatrixType>::determinant() const
-{
+template <typename MatrixType>
+typename UmfPackLU<MatrixType>::Scalar UmfPackLU<MatrixType>::determinant() const {
   Scalar det;
   umfpack_get_determinant(&det, 0, m_numeric, 0, StorageIndex());
   return det;
 }
 
-template<typename MatrixType>
-template<typename BDerived,typename XDerived>
-bool UmfPackLU<MatrixType>::_solve_impl(const MatrixBase<BDerived> &b, MatrixBase<XDerived> &x) const
-{
+template <typename MatrixType>
+template <typename BDerived, typename XDerived>
+bool UmfPackLU<MatrixType>::_solve_impl(const MatrixBase<BDerived> &b, MatrixBase<XDerived> &x) const {
   Index rhsCols = b.cols();
-  eigen_assert((BDerived::Flags&RowMajorBit)==0 && "UmfPackLU backend does not support non col-major rhs yet");
-  eigen_assert((XDerived::Flags&RowMajorBit)==0 && "UmfPackLU backend does not support non col-major result yet");
+  eigen_assert((BDerived::Flags & RowMajorBit) == 0 && "UmfPackLU backend does not support non col-major rhs yet");
+  eigen_assert((XDerived::Flags & RowMajorBit) == 0 && "UmfPackLU backend does not support non col-major result yet");
   eigen_assert(b.derived().data() != x.derived().data() && " Umfpack does not support inplace solve");
 
-  Scalar* x_ptr = 0;
-  Matrix<Scalar,Dynamic,1> x_tmp;
-  if(x.innerStride()!=1)
-  {
+  Scalar *x_ptr = 0;
+  Matrix<Scalar, Dynamic, 1> x_tmp;
+  if (x.innerStride() != 1) {
     x_tmp.resize(x.rows());
     x_ptr = x_tmp.data();
   }
-  for (int j=0; j<rhsCols; ++j)
-  {
-    if(x.innerStride()==1)
-      x_ptr = &x.col(j).coeffRef(0);
-    StorageIndex errorCode = umfpack_solve(UMFPACK_A,
-                                mp_matrix.outerIndexPtr(), mp_matrix.innerIndexPtr(), mp_matrix.valuePtr(),
-                                x_ptr, &b.const_cast_derived().col(j).coeffRef(0),
-                                m_numeric, m_control.data(), m_umfpackInfo.data());
-    if(x.innerStride()!=1)
-      x.col(j) = x_tmp;
-    if (errorCode!=0)
-      return false;
+  for (int j = 0; j < rhsCols; ++j) {
+    if (x.innerStride() == 1) x_ptr = &x.col(j).coeffRef(0);
+    StorageIndex errorCode =
+        umfpack_solve(UMFPACK_A, mp_matrix.outerIndexPtr(), mp_matrix.innerIndexPtr(), mp_matrix.valuePtr(), x_ptr,
+                      &b.const_cast_derived().col(j).coeffRef(0), m_numeric, m_control.data(), m_umfpackInfo.data());
+    if (x.innerStride() != 1) x.col(j) = x_tmp;
+    if (errorCode != 0) return false;
   }
 
   return true;
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_UMFPACKSUPPORT_H
+#endif  // EIGEN_UMFPACKSUPPORT_H
diff --git a/Eigen/src/misc/Image.h b/Eigen/src/misc/Image.h
index d7c99f0..fd1ac99 100644
--- a/Eigen/src/misc/Image.h
+++ b/Eigen/src/misc/Image.h
@@ -13,40 +13,36 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
 /** \class image_retval_base
-  *
-  */
-template<typename DecompositionType>
-struct traits<image_retval_base<DecompositionType> >
-{
+ *
+ */
+template <typename DecompositionType>
+struct traits<image_retval_base<DecompositionType> > {
   typedef typename DecompositionType::MatrixType MatrixType;
-  typedef Matrix<
-    typename MatrixType::Scalar,
-    MatrixType::RowsAtCompileTime, // the image is a subspace of the destination space, whose
-                                   // dimension is the number of rows of the original matrix
-    Dynamic,                       // we don't know at compile time the dimension of the image (the rank)
-    MatrixType::Options,
-    MatrixType::MaxRowsAtCompileTime, // the image matrix will consist of columns from the original matrix,
-    MatrixType::MaxColsAtCompileTime  // so it has the same number of rows and at most as many columns.
-  > ReturnType;
+  typedef Matrix<typename MatrixType::Scalar,
+                 MatrixType::RowsAtCompileTime,  // the image is a subspace of the destination space, whose
+                                                 // dimension is the number of rows of the original matrix
+                 Dynamic,                        // we don't know at compile time the dimension of the image (the rank)
+                 MatrixType::Options,
+                 MatrixType::MaxRowsAtCompileTime,  // the image matrix will consist of columns from the original
+                                                    // matrix,
+                 MatrixType::MaxColsAtCompileTime   // so it has the same number of rows and at most as many columns.
+                 >
+      ReturnType;
 };
 
-template<typename DecompositionType_> struct image_retval_base
- : public ReturnByValue<image_retval_base<DecompositionType_> >
-{
+template <typename DecompositionType_>
+struct image_retval_base : public ReturnByValue<image_retval_base<DecompositionType_> > {
   typedef DecompositionType_ DecompositionType;
   typedef typename DecompositionType::MatrixType MatrixType;
   typedef ReturnByValue<image_retval_base> Base;
 
   image_retval_base(const DecompositionType& dec, const MatrixType& originalMatrix)
-    : m_dec(dec), m_rank(dec.rank()),
-      m_cols(m_rank == 0 ? 1 : m_rank),
-      m_originalMatrix(originalMatrix)
-  {}
+      : m_dec(dec), m_rank(dec.rank()), m_cols(m_rank == 0 ? 1 : m_rank), m_originalMatrix(originalMatrix) {}
 
   inline Index rows() const { return m_dec.rows(); }
   inline Index cols() const { return m_cols; }
@@ -54,32 +50,31 @@
   inline const DecompositionType& dec() const { return m_dec; }
   inline const MatrixType& originalMatrix() const { return m_originalMatrix; }
 
-  template<typename Dest> inline void evalTo(Dest& dst) const
-  {
+  template <typename Dest>
+  inline void evalTo(Dest& dst) const {
     static_cast<const image_retval<DecompositionType>*>(this)->evalTo(dst);
   }
 
-  protected:
-    const DecompositionType& m_dec;
-    Index m_rank, m_cols;
-    const MatrixType& m_originalMatrix;
+ protected:
+  const DecompositionType& m_dec;
+  Index m_rank, m_cols;
+  const MatrixType& m_originalMatrix;
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-#define EIGEN_MAKE_IMAGE_HELPERS(DecompositionType) \
-  typedef typename DecompositionType::MatrixType MatrixType; \
-  typedef typename MatrixType::Scalar Scalar; \
-  typedef typename MatrixType::RealScalar RealScalar; \
+#define EIGEN_MAKE_IMAGE_HELPERS(DecompositionType)                   \
+  typedef typename DecompositionType::MatrixType MatrixType;          \
+  typedef typename MatrixType::Scalar Scalar;                         \
+  typedef typename MatrixType::RealScalar RealScalar;                 \
   typedef Eigen::internal::image_retval_base<DecompositionType> Base; \
-  using Base::dec; \
-  using Base::originalMatrix; \
-  using Base::rank; \
-  using Base::rows; \
-  using Base::cols; \
-  image_retval(const DecompositionType& dec, const MatrixType& originalMatrix) \
-    : Base(dec, originalMatrix) {}
+  using Base::dec;                                                    \
+  using Base::originalMatrix;                                         \
+  using Base::rank;                                                   \
+  using Base::rows;                                                   \
+  using Base::cols;                                                   \
+  image_retval(const DecompositionType& dec, const MatrixType& originalMatrix) : Base(dec, originalMatrix) {}
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_MISC_IMAGE_H
+#endif  // EIGEN_MISC_IMAGE_H
diff --git a/Eigen/src/misc/Kernel.h b/Eigen/src/misc/Kernel.h
index 676f0ca..55c3efe 100644
--- a/Eigen/src/misc/Kernel.h
+++ b/Eigen/src/misc/Kernel.h
@@ -13,70 +13,65 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
 /** \class kernel_retval_base
-  *
-  */
-template<typename DecompositionType>
-struct traits<kernel_retval_base<DecompositionType> >
-{
+ *
+ */
+template <typename DecompositionType>
+struct traits<kernel_retval_base<DecompositionType> > {
   typedef typename DecompositionType::MatrixType MatrixType;
-  typedef Matrix<
-    typename MatrixType::Scalar,
-    MatrixType::ColsAtCompileTime, // the number of rows in the "kernel matrix"
-                                   // is the number of cols of the original matrix
-                                   // so that the product "matrix * kernel = zero" makes sense
-    Dynamic,                       // we don't know at compile-time the dimension of the kernel
-    MatrixType::Options,
-    MatrixType::MaxColsAtCompileTime, // see explanation for 2nd template parameter
-    MatrixType::MaxColsAtCompileTime // the kernel is a subspace of the domain space,
-                                     // whose dimension is the number of columns of the original matrix
-  > ReturnType;
+  typedef Matrix<typename MatrixType::Scalar,
+                 MatrixType::ColsAtCompileTime,  // the number of rows in the "kernel matrix"
+                                                 // is the number of cols of the original matrix
+                                                 // so that the product "matrix * kernel = zero" makes sense
+                 Dynamic,                        // we don't know at compile-time the dimension of the kernel
+                 MatrixType::Options,
+                 MatrixType::MaxColsAtCompileTime,  // see explanation for 2nd template parameter
+                 MatrixType::MaxColsAtCompileTime   // the kernel is a subspace of the domain space,
+                                                    // whose dimension is the number of columns of the original matrix
+                 >
+      ReturnType;
 };
 
-template<typename DecompositionType_> struct kernel_retval_base
- : public ReturnByValue<kernel_retval_base<DecompositionType_> >
-{
+template <typename DecompositionType_>
+struct kernel_retval_base : public ReturnByValue<kernel_retval_base<DecompositionType_> > {
   typedef DecompositionType_ DecompositionType;
   typedef ReturnByValue<kernel_retval_base> Base;
 
   explicit kernel_retval_base(const DecompositionType& dec)
-    : m_dec(dec),
-      m_rank(dec.rank()),
-      m_cols(m_rank==dec.cols() ? 1 : dec.cols() - m_rank)
-  {}
+      : m_dec(dec), m_rank(dec.rank()), m_cols(m_rank == dec.cols() ? 1 : dec.cols() - m_rank) {}
 
   inline Index rows() const { return m_dec.cols(); }
   inline Index cols() const { return m_cols; }
   inline Index rank() const { return m_rank; }
   inline const DecompositionType& dec() const { return m_dec; }
 
-  template<typename Dest> inline void evalTo(Dest& dst) const
-  {
+  template <typename Dest>
+  inline void evalTo(Dest& dst) const {
     static_cast<const kernel_retval<DecompositionType>*>(this)->evalTo(dst);
   }
 
-  protected:
-    const DecompositionType& m_dec;
-    Index m_rank, m_cols;
+ protected:
+  const DecompositionType& m_dec;
+  Index m_rank, m_cols;
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-#define EIGEN_MAKE_KERNEL_HELPERS(DecompositionType) \
-  typedef typename DecompositionType::MatrixType MatrixType; \
-  typedef typename MatrixType::Scalar Scalar; \
-  typedef typename MatrixType::RealScalar RealScalar; \
+#define EIGEN_MAKE_KERNEL_HELPERS(DecompositionType)                   \
+  typedef typename DecompositionType::MatrixType MatrixType;           \
+  typedef typename MatrixType::Scalar Scalar;                          \
+  typedef typename MatrixType::RealScalar RealScalar;                  \
   typedef Eigen::internal::kernel_retval_base<DecompositionType> Base; \
-  using Base::dec; \
-  using Base::rank; \
-  using Base::rows; \
-  using Base::cols; \
+  using Base::dec;                                                     \
+  using Base::rank;                                                    \
+  using Base::rows;                                                    \
+  using Base::cols;                                                    \
   kernel_retval(const DecompositionType& dec) : Base(dec) {}
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_MISC_KERNEL_H
+#endif  // EIGEN_MISC_KERNEL_H
diff --git a/Eigen/src/misc/RealSvd2x2.h b/Eigen/src/misc/RealSvd2x2.h
index 084bd35..332a5ab 100644
--- a/Eigen/src/misc/RealSvd2x2.h
+++ b/Eigen/src/misc/RealSvd2x2.h
@@ -18,27 +18,22 @@
 
 namespace internal {
 
-template<typename MatrixType, typename RealScalar, typename Index>
-void real_2x2_jacobi_svd(const MatrixType& matrix, Index p, Index q,
-                         JacobiRotation<RealScalar> *j_left,
-                         JacobiRotation<RealScalar> *j_right)
-{
-  using std::sqrt;
+template <typename MatrixType, typename RealScalar, typename Index>
+void real_2x2_jacobi_svd(const MatrixType &matrix, Index p, Index q, JacobiRotation<RealScalar> *j_left,
+                         JacobiRotation<RealScalar> *j_right) {
   using std::abs;
-  Matrix<RealScalar,2,2> m;
-  m << numext::real(matrix.coeff(p,p)), numext::real(matrix.coeff(p,q)),
-       numext::real(matrix.coeff(q,p)), numext::real(matrix.coeff(q,q));
+  using std::sqrt;
+  Matrix<RealScalar, 2, 2> m;
+  m << numext::real(matrix.coeff(p, p)), numext::real(matrix.coeff(p, q)), numext::real(matrix.coeff(q, p)),
+      numext::real(matrix.coeff(q, q));
   JacobiRotation<RealScalar> rot1;
-  RealScalar t = m.coeff(0,0) + m.coeff(1,1);
-  RealScalar d = m.coeff(1,0) - m.coeff(0,1);
+  RealScalar t = m.coeff(0, 0) + m.coeff(1, 1);
+  RealScalar d = m.coeff(1, 0) - m.coeff(0, 1);
 
-  if(abs(d) < (std::numeric_limits<RealScalar>::min)())
-  {
+  if (abs(d) < (std::numeric_limits<RealScalar>::min)()) {
     rot1.s() = RealScalar(0);
     rot1.c() = RealScalar(1);
-  }
-  else
-  {
+  } else {
     // If d!=0, then t/d cannot overflow because the magnitude of the
     // entries forming d are not too small compared to the ones forming t.
     RealScalar u = t / d;
@@ -46,13 +41,13 @@
     rot1.s() = RealScalar(1) / tmp;
     rot1.c() = u / tmp;
   }
-  m.applyOnTheLeft(0,1,rot1);
-  j_right->makeJacobi(m,0,1);
+  m.applyOnTheLeft(0, 1, rot1);
+  j_right->makeJacobi(m, 0, 1);
   *j_left = rot1 * j_right->transpose();
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_REALSVD2X2_H
+#endif  // EIGEN_REALSVD2X2_H
diff --git a/Eigen/src/misc/blas.h b/Eigen/src/misc/blas.h
index 0170eef..bb133bb 100644
--- a/Eigen/src/misc/blas.h
+++ b/Eigen/src/misc/blas.h
@@ -7,60 +7,91 @@
 
 /* Level 1 routines */
 
-int BLASFUNC(saxpy)(const int *, const float  *, const float  *, const int *, float  *, const int *);
+int BLASFUNC(saxpy)(const int *, const float *, const float *, const int *, float *, const int *);
 int BLASFUNC(daxpy)(const int *, const double *, const double *, const int *, double *, const int *);
-int BLASFUNC(caxpy)(const int *, const float  *, const float  *, const int *, float  *, const int *);
+int BLASFUNC(caxpy)(const int *, const float *, const float *, const int *, float *, const int *);
 int BLASFUNC(zaxpy)(const int *, const double *, const double *, const int *, double *, const int *);
 
 /* Level 2 routines */
 
-int BLASFUNC(sgemv)(const char *, const int *, const int *, const float  *, const float  *, const int *, const float  *, const int *, const float  *, float  *, const int *);
-int BLASFUNC(dgemv)(const char *, const int *, const int *, const double *, const double *, const int *, const double *, const int *, const double *, double *, const int *);
-int BLASFUNC(cgemv)(const char *, const int *, const int *, const float  *, const float  *, const int *, const float  *, const int *, const float  *, float  *, const int *);
-int BLASFUNC(zgemv)(const char *, const int *, const int *, const double *, const double *, const int *, const double *, const int *, const double *, double *, const int *);
+int BLASFUNC(sgemv)(const char *, const int *, const int *, const float *, const float *, const int *, const float *,
+                    const int *, const float *, float *, const int *);
+int BLASFUNC(dgemv)(const char *, const int *, const int *, const double *, const double *, const int *, const double *,
+                    const int *, const double *, double *, const int *);
+int BLASFUNC(cgemv)(const char *, const int *, const int *, const float *, const float *, const int *, const float *,
+                    const int *, const float *, float *, const int *);
+int BLASFUNC(zgemv)(const char *, const int *, const int *, const double *, const double *, const int *, const double *,
+                    const int *, const double *, double *, const int *);
 
-int BLASFUNC(strmv)(const char *, const char *, const char *, const int *, const float  *, const int *, float  *, const int *);
-int BLASFUNC(dtrmv)(const char *, const char *, const char *, const int *, const double *, const int *, double *, const int *);
-int BLASFUNC(ctrmv)(const char *, const char *, const char *, const int *, const float  *, const int *, float  *, const int *);
-int BLASFUNC(ztrmv)(const char *, const char *, const char *, const int *, const double *, const int *, double *, const int *);
+int BLASFUNC(strmv)(const char *, const char *, const char *, const int *, const float *, const int *, float *,
+                    const int *);
+int BLASFUNC(dtrmv)(const char *, const char *, const char *, const int *, const double *, const int *, double *,
+                    const int *);
+int BLASFUNC(ctrmv)(const char *, const char *, const char *, const int *, const float *, const int *, float *,
+                    const int *);
+int BLASFUNC(ztrmv)(const char *, const char *, const char *, const int *, const double *, const int *, double *,
+                    const int *);
 
-int BLASFUNC(ssymv)(const char *, const int *, const float  *, const float  *, const int *, const float  *, const int *, const float  *, float  *, const int *);
-int BLASFUNC(dsymv)(const char *, const int *, const double *, const double *, const int *, const double *, const int *, const double *, double *, const int *);
+int BLASFUNC(ssymv)(const char *, const int *, const float *, const float *, const int *, const float *, const int *,
+                    const float *, float *, const int *);
+int BLASFUNC(dsymv)(const char *, const int *, const double *, const double *, const int *, const double *, const int *,
+                    const double *, double *, const int *);
 
-int BLASFUNC(chemv)(const char *, const int *, const float  *, const float  *, const int *, const float  *, const int *, const float  *, float  *, const int *);
-int BLASFUNC(zhemv)(const char *, const int *, const double *, const double *, const int *, const double *, const int *, const double *, double *, const int *);
+int BLASFUNC(chemv)(const char *, const int *, const float *, const float *, const int *, const float *, const int *,
+                    const float *, float *, const int *);
+int BLASFUNC(zhemv)(const char *, const int *, const double *, const double *, const int *, const double *, const int *,
+                    const double *, double *, const int *);
 
 /* Level 3 routines */
 
-int BLASFUNC(sgemm)(const char *, const char *, const int *, const int *, const int *, const float  *, const float  *, const int *, const float  *, const int *, const float  *, float  *, const int *);
-int BLASFUNC(dgemm)(const char *, const char *, const int *, const int *, const int *, const double *, const double *, const int *, const double *, const int *, const double *, double *, const int *);
-int BLASFUNC(cgemm)(const char *, const char *, const int *, const int *, const int *, const float  *, const float  *, const int *, const float  *, const int *, const float  *, float  *, const int *);
-int BLASFUNC(zgemm)(const char *, const char *, const int *, const int *, const int *, const double *, const double *, const int *, const double *, const int *, const double *, double *, const int *);
+int BLASFUNC(sgemm)(const char *, const char *, const int *, const int *, const int *, const float *, const float *,
+                    const int *, const float *, const int *, const float *, float *, const int *);
+int BLASFUNC(dgemm)(const char *, const char *, const int *, const int *, const int *, const double *, const double *,
+                    const int *, const double *, const int *, const double *, double *, const int *);
+int BLASFUNC(cgemm)(const char *, const char *, const int *, const int *, const int *, const float *, const float *,
+                    const int *, const float *, const int *, const float *, float *, const int *);
+int BLASFUNC(zgemm)(const char *, const char *, const int *, const int *, const int *, const double *, const double *,
+                    const int *, const double *, const int *, const double *, double *, const int *);
 
-int BLASFUNC(strsm)(const char *, const char *, const char *, const char *, const int *, const int *, const float *,  const float *,  const int *, float *,  const int *);
-int BLASFUNC(dtrsm)(const char *, const char *, const char *, const char *, const int *, const int *, const double *, const double *, const int *, double *, const int *);
-int BLASFUNC(ctrsm)(const char *, const char *, const char *, const char *, const int *, const int *, const float *,  const float *,  const int *, float *,  const int *);
-int BLASFUNC(ztrsm)(const char *, const char *, const char *, const char *, const int *, const int *, const double *, const double *, const int *, double *, const int *);
+int BLASFUNC(strsm)(const char *, const char *, const char *, const char *, const int *, const int *, const float *,
+                    const float *, const int *, float *, const int *);
+int BLASFUNC(dtrsm)(const char *, const char *, const char *, const char *, const int *, const int *, const double *,
+                    const double *, const int *, double *, const int *);
+int BLASFUNC(ctrsm)(const char *, const char *, const char *, const char *, const int *, const int *, const float *,
+                    const float *, const int *, float *, const int *);
+int BLASFUNC(ztrsm)(const char *, const char *, const char *, const char *, const int *, const int *, const double *,
+                    const double *, const int *, double *, const int *);
 
-int BLASFUNC(strmm)(const char *, const char *, const char *, const char *, const int *, const int *, const float *,  const float *,  const int *, float *,  const int *);
-int BLASFUNC(dtrmm)(const char *, const char *, const char *, const char *, const int *, const int *, const double *, const double *, const int *, double *, const int *);
-int BLASFUNC(ctrmm)(const char *, const char *, const char *, const char *, const int *, const int *, const float *,  const float *,  const int *, float *,  const int *);
-int BLASFUNC(ztrmm)(const char *, const char *, const char *, const char *, const int *, const int *, const double *, const double *, const int *, double *, const int *);
+int BLASFUNC(strmm)(const char *, const char *, const char *, const char *, const int *, const int *, const float *,
+                    const float *, const int *, float *, const int *);
+int BLASFUNC(dtrmm)(const char *, const char *, const char *, const char *, const int *, const int *, const double *,
+                    const double *, const int *, double *, const int *);
+int BLASFUNC(ctrmm)(const char *, const char *, const char *, const char *, const int *, const int *, const float *,
+                    const float *, const int *, float *, const int *);
+int BLASFUNC(ztrmm)(const char *, const char *, const char *, const char *, const int *, const int *, const double *,
+                    const double *, const int *, double *, const int *);
 
-int BLASFUNC(ssymm)(const char *, const char *, const int *, const int *, const float  *, const float  *, const int *, const float  *, const int *, const float  *, float  *, const int *);
-int BLASFUNC(dsymm)(const char *, const char *, const int *, const int *, const double *, const double *, const int *, const double *, const int *, const double *, double *, const int *);
+int BLASFUNC(ssymm)(const char *, const char *, const int *, const int *, const float *, const float *, const int *,
+                    const float *, const int *, const float *, float *, const int *);
+int BLASFUNC(dsymm)(const char *, const char *, const int *, const int *, const double *, const double *, const int *,
+                    const double *, const int *, const double *, double *, const int *);
 
-int BLASFUNC(ssyrk)(const char *, const char *, const int *, const int *, const float  *, const float  *, const int *, const float  *, float  *, const int *);
-int BLASFUNC(dsyrk)(const char *, const char *, const int *, const int *, const double *, const double *, const int *, const double *, double *, const int *);
+int BLASFUNC(ssyrk)(const char *, const char *, const int *, const int *, const float *, const float *, const int *,
+                    const float *, float *, const int *);
+int BLASFUNC(dsyrk)(const char *, const char *, const int *, const int *, const double *, const double *, const int *,
+                    const double *, double *, const int *);
 
-int BLASFUNC(chemm)(const char *, const char *, const int *, const int *, const float  *, const float  *, const int *, const float  *, const int *, const float  *, float  *, const int *);
-int BLASFUNC(zhemm)(const char *, const char *, const int *, const int *, const double *, const double *, const int *, const double *, const int *, const double *, double *, const int *);
+int BLASFUNC(chemm)(const char *, const char *, const int *, const int *, const float *, const float *, const int *,
+                    const float *, const int *, const float *, float *, const int *);
+int BLASFUNC(zhemm)(const char *, const char *, const int *, const int *, const double *, const double *, const int *,
+                    const double *, const int *, const double *, double *, const int *);
 
-int BLASFUNC(cherk)(const char *, const char *, const int *, const int *, const float  *, const float  *, const int *, const float  *, float  *, const int *);
-int BLASFUNC(zherk)(const char *, const char *, const int *, const int *, const double *, const double *, const int *, const double *, double *, const int *);
+int BLASFUNC(cherk)(const char *, const char *, const int *, const int *, const float *, const float *, const int *,
+                    const float *, float *, const int *);
+int BLASFUNC(zherk)(const char *, const char *, const int *, const int *, const double *, const double *, const int *,
+                    const double *, double *, const int *);
 
 #undef BLASFUNC
-
 }
 
 #endif
diff --git a/Eigen/src/misc/lapacke.h b/Eigen/src/misc/lapacke.h
index c20204c..94afd50 100644
--- a/Eigen/src/misc/lapacke.h
+++ b/Eigen/src/misc/lapacke.h
@@ -37,8 +37,8 @@
 #define _LAPACKE_H_
 
 /*
-*  Turn on HAVE_LAPACK_CONFIG_H to redefine C-LAPACK datatypes
-*/
+ *  Turn on HAVE_LAPACK_CONFIG_H to redefine C-LAPACK datatypes
+ */
 #ifdef HAVE_LAPACK_CONFIG_H
 #include "lapacke_config.h"
 #endif
@@ -46,11 +46,11 @@
 #include <stdlib.h>
 
 #ifndef lapack_int
-  #ifdef LAPACK_ILP64
-    #define lapack_int int64_t
-  #else
-    #define lapack_int int
-  #endif
+#ifdef LAPACK_ILP64
+#define lapack_int int64_t
+#else
+#define lapack_int int
+#endif
 #endif
 
 #ifndef lapack_logical
@@ -58,19 +58,19 @@
 #endif
 
 /* Complex types are structures equivalent to the
-* Fortran complex types COMPLEX(4) and COMPLEX(8).
-*
-* One can also redefine the types with his own types
-* for example by including in the code definitions like
-*
-* #define lapack_complex_float std::complex<float>
-* #define lapack_complex_double std::complex<double>
-*
-* or define these types in the command line:
-*
-* -Dlapack_complex_float="std::complex<float>"
-* -Dlapack_complex_double="std::complex<double>"
-*/
+ * Fortran complex types COMPLEX(4) and COMPLEX(8).
+ *
+ * One can also redefine the types with his own types
+ * for example by including in the code definitions like
+ *
+ * #define lapack_complex_float std::complex<float>
+ * #define lapack_complex_double std::complex<double>
+ *
+ * or define these types in the command line:
+ *
+ * -Dlapack_complex_float="std::complex<float>"
+ * -Dlapack_complex_double="std::complex<double>"
+ */
 
 #ifndef LAPACK_COMPLEX_CUSTOM
 
@@ -80,14 +80,14 @@
 #endif
 
 #ifndef lapack_complex_float_real
-#define lapack_complex_float_real(z)       (creal(z))
+#define lapack_complex_float_real(z) (creal(z))
 #endif
 
 #ifndef lapack_complex_float_imag
-#define lapack_complex_float_imag(z)       (cimag(z))
+#define lapack_complex_float_imag(z) (cimag(z))
 #endif
 
-lapack_complex_float lapack_make_complex_float( float re, float im );
+lapack_complex_float lapack_make_complex_float(float re, float im);
 
 /* Complex type (double precision) */
 #ifndef lapack_complex_double
@@ -95,16195 +95,9986 @@
 #endif
 
 #ifndef lapack_complex_double_real
-#define lapack_complex_double_real(z)      (creal(z))
+#define lapack_complex_double_real(z) (creal(z))
 #endif
 
 #ifndef lapack_complex_double_imag
-#define lapack_complex_double_imag(z)       (cimag(z))
+#define lapack_complex_double_imag(z) (cimag(z))
 #endif
 
-lapack_complex_double lapack_make_complex_double( double re, double im );
+lapack_complex_double lapack_make_complex_double(double re, double im);
 
 #endif
 
-
 #ifdef __cplusplus
 extern "C" {
 #endif /* __cplusplus */
 
 #ifndef LAPACKE_malloc
-#define LAPACKE_malloc( size ) malloc( size )
+#define LAPACKE_malloc(size) malloc(size)
 #endif
 #ifndef LAPACKE_free
-#define LAPACKE_free( p )      free( p )
+#define LAPACKE_free(p) free(p)
 #endif
 
-#define LAPACK_C2INT( x ) (lapack_int)(*((float*)&x ))
-#define LAPACK_Z2INT( x ) (lapack_int)(*((double*)&x ))
+#define LAPACK_C2INT(x) (lapack_int)(*((float*)&x))
+#define LAPACK_Z2INT(x) (lapack_int)(*((double*)&x))
 
-#define LAPACK_ROW_MAJOR               101
-#define LAPACK_COL_MAJOR               102
+#define LAPACK_ROW_MAJOR 101
+#define LAPACK_COL_MAJOR 102
 
-#define LAPACK_WORK_MEMORY_ERROR       -1010
-#define LAPACK_TRANSPOSE_MEMORY_ERROR  -1011
+#define LAPACK_WORK_MEMORY_ERROR -1010
+#define LAPACK_TRANSPOSE_MEMORY_ERROR -1011
 
 /* Callback logical functions of one, two, or three arguments are used
-*  to select eigenvalues to sort to the top left of the Schur form.
-*  The value is selected if function returns TRUE (non-zero). */
+ *  to select eigenvalues to sort to the top left of the Schur form.
+ *  The value is selected if function returns TRUE (non-zero). */
 
-typedef lapack_logical (*LAPACK_S_SELECT2) ( const float*, const float* );
-typedef lapack_logical (*LAPACK_S_SELECT3)
-    ( const float*, const float*, const float* );
-typedef lapack_logical (*LAPACK_D_SELECT2) ( const double*, const double* );
-typedef lapack_logical (*LAPACK_D_SELECT3)
-    ( const double*, const double*, const double* );
+typedef lapack_logical (*LAPACK_S_SELECT2)(const float*, const float*);
+typedef lapack_logical (*LAPACK_S_SELECT3)(const float*, const float*, const float*);
+typedef lapack_logical (*LAPACK_D_SELECT2)(const double*, const double*);
+typedef lapack_logical (*LAPACK_D_SELECT3)(const double*, const double*, const double*);
 
-typedef lapack_logical (*LAPACK_C_SELECT1) ( const lapack_complex_float* );
-typedef lapack_logical (*LAPACK_C_SELECT2)
-    ( const lapack_complex_float*, const lapack_complex_float* );
-typedef lapack_logical (*LAPACK_Z_SELECT1) ( const lapack_complex_double* );
-typedef lapack_logical (*LAPACK_Z_SELECT2)
-    ( const lapack_complex_double*, const lapack_complex_double* );
+typedef lapack_logical (*LAPACK_C_SELECT1)(const lapack_complex_float*);
+typedef lapack_logical (*LAPACK_C_SELECT2)(const lapack_complex_float*, const lapack_complex_float*);
+typedef lapack_logical (*LAPACK_Z_SELECT1)(const lapack_complex_double*);
+typedef lapack_logical (*LAPACK_Z_SELECT2)(const lapack_complex_double*, const lapack_complex_double*);
 
 #include "lapacke_mangling.h"
 
-#define LAPACK_lsame LAPACK_GLOBAL(lsame,LSAME)
-lapack_logical LAPACK_lsame( char* ca,  char* cb,
-                              lapack_int lca, lapack_int lcb );
+#define LAPACK_lsame LAPACK_GLOBAL(lsame, LSAME)
+lapack_logical LAPACK_lsame(char* ca, char* cb, lapack_int lca, lapack_int lcb);
 
 /* C-LAPACK function prototypes */
 
-lapack_int LAPACKE_sbdsdc( int matrix_order, char uplo, char compq,
-                           lapack_int n, float* d, float* e, float* u,
-                           lapack_int ldu, float* vt, lapack_int ldvt, float* q,
-                           lapack_int* iq );
-lapack_int LAPACKE_dbdsdc( int matrix_order, char uplo, char compq,
-                           lapack_int n, double* d, double* e, double* u,
-                           lapack_int ldu, double* vt, lapack_int ldvt,
-                           double* q, lapack_int* iq );
+lapack_int LAPACKE_sbdsdc(int matrix_order, char uplo, char compq, lapack_int n, float* d, float* e, float* u,
+                          lapack_int ldu, float* vt, lapack_int ldvt, float* q, lapack_int* iq);
+lapack_int LAPACKE_dbdsdc(int matrix_order, char uplo, char compq, lapack_int n, double* d, double* e, double* u,
+                          lapack_int ldu, double* vt, lapack_int ldvt, double* q, lapack_int* iq);
 
-lapack_int LAPACKE_sbdsqr( int matrix_order, char uplo, lapack_int n,
-                           lapack_int ncvt, lapack_int nru, lapack_int ncc,
-                           float* d, float* e, float* vt, lapack_int ldvt,
-                           float* u, lapack_int ldu, float* c, lapack_int ldc );
-lapack_int LAPACKE_dbdsqr( int matrix_order, char uplo, lapack_int n,
-                           lapack_int ncvt, lapack_int nru, lapack_int ncc,
-                           double* d, double* e, double* vt, lapack_int ldvt,
-                           double* u, lapack_int ldu, double* c,
-                           lapack_int ldc );
-lapack_int LAPACKE_cbdsqr( int matrix_order, char uplo, lapack_int n,
-                           lapack_int ncvt, lapack_int nru, lapack_int ncc,
-                           float* d, float* e, lapack_complex_float* vt,
-                           lapack_int ldvt, lapack_complex_float* u,
-                           lapack_int ldu, lapack_complex_float* c,
-                           lapack_int ldc );
-lapack_int LAPACKE_zbdsqr( int matrix_order, char uplo, lapack_int n,
-                           lapack_int ncvt, lapack_int nru, lapack_int ncc,
-                           double* d, double* e, lapack_complex_double* vt,
-                           lapack_int ldvt, lapack_complex_double* u,
-                           lapack_int ldu, lapack_complex_double* c,
-                           lapack_int ldc );
+lapack_int LAPACKE_sbdsqr(int matrix_order, char uplo, lapack_int n, lapack_int ncvt, lapack_int nru, lapack_int ncc,
+                          float* d, float* e, float* vt, lapack_int ldvt, float* u, lapack_int ldu, float* c,
+                          lapack_int ldc);
+lapack_int LAPACKE_dbdsqr(int matrix_order, char uplo, lapack_int n, lapack_int ncvt, lapack_int nru, lapack_int ncc,
+                          double* d, double* e, double* vt, lapack_int ldvt, double* u, lapack_int ldu, double* c,
+                          lapack_int ldc);
+lapack_int LAPACKE_cbdsqr(int matrix_order, char uplo, lapack_int n, lapack_int ncvt, lapack_int nru, lapack_int ncc,
+                          float* d, float* e, lapack_complex_float* vt, lapack_int ldvt, lapack_complex_float* u,
+                          lapack_int ldu, lapack_complex_float* c, lapack_int ldc);
+lapack_int LAPACKE_zbdsqr(int matrix_order, char uplo, lapack_int n, lapack_int ncvt, lapack_int nru, lapack_int ncc,
+                          double* d, double* e, lapack_complex_double* vt, lapack_int ldvt, lapack_complex_double* u,
+                          lapack_int ldu, lapack_complex_double* c, lapack_int ldc);
 
-lapack_int LAPACKE_sdisna( char job, lapack_int m, lapack_int n, const float* d,
-                           float* sep );
-lapack_int LAPACKE_ddisna( char job, lapack_int m, lapack_int n,
-                           const double* d, double* sep );
+lapack_int LAPACKE_sdisna(char job, lapack_int m, lapack_int n, const float* d, float* sep);
+lapack_int LAPACKE_ddisna(char job, lapack_int m, lapack_int n, const double* d, double* sep);
 
-lapack_int LAPACKE_sgbbrd( int matrix_order, char vect, lapack_int m,
-                           lapack_int n, lapack_int ncc, lapack_int kl,
-                           lapack_int ku, float* ab, lapack_int ldab, float* d,
-                           float* e, float* q, lapack_int ldq, float* pt,
-                           lapack_int ldpt, float* c, lapack_int ldc );
-lapack_int LAPACKE_dgbbrd( int matrix_order, char vect, lapack_int m,
-                           lapack_int n, lapack_int ncc, lapack_int kl,
-                           lapack_int ku, double* ab, lapack_int ldab,
-                           double* d, double* e, double* q, lapack_int ldq,
-                           double* pt, lapack_int ldpt, double* c,
-                           lapack_int ldc );
-lapack_int LAPACKE_cgbbrd( int matrix_order, char vect, lapack_int m,
-                           lapack_int n, lapack_int ncc, lapack_int kl,
-                           lapack_int ku, lapack_complex_float* ab,
-                           lapack_int ldab, float* d, float* e,
-                           lapack_complex_float* q, lapack_int ldq,
-                           lapack_complex_float* pt, lapack_int ldpt,
-                           lapack_complex_float* c, lapack_int ldc );
-lapack_int LAPACKE_zgbbrd( int matrix_order, char vect, lapack_int m,
-                           lapack_int n, lapack_int ncc, lapack_int kl,
-                           lapack_int ku, lapack_complex_double* ab,
-                           lapack_int ldab, double* d, double* e,
-                           lapack_complex_double* q, lapack_int ldq,
-                           lapack_complex_double* pt, lapack_int ldpt,
-                           lapack_complex_double* c, lapack_int ldc );
+lapack_int LAPACKE_sgbbrd(int matrix_order, char vect, lapack_int m, lapack_int n, lapack_int ncc, lapack_int kl,
+                          lapack_int ku, float* ab, lapack_int ldab, float* d, float* e, float* q, lapack_int ldq,
+                          float* pt, lapack_int ldpt, float* c, lapack_int ldc);
+lapack_int LAPACKE_dgbbrd(int matrix_order, char vect, lapack_int m, lapack_int n, lapack_int ncc, lapack_int kl,
+                          lapack_int ku, double* ab, lapack_int ldab, double* d, double* e, double* q, lapack_int ldq,
+                          double* pt, lapack_int ldpt, double* c, lapack_int ldc);
+lapack_int LAPACKE_cgbbrd(int matrix_order, char vect, lapack_int m, lapack_int n, lapack_int ncc, lapack_int kl,
+                          lapack_int ku, lapack_complex_float* ab, lapack_int ldab, float* d, float* e,
+                          lapack_complex_float* q, lapack_int ldq, lapack_complex_float* pt, lapack_int ldpt,
+                          lapack_complex_float* c, lapack_int ldc);
+lapack_int LAPACKE_zgbbrd(int matrix_order, char vect, lapack_int m, lapack_int n, lapack_int ncc, lapack_int kl,
+                          lapack_int ku, lapack_complex_double* ab, lapack_int ldab, double* d, double* e,
+                          lapack_complex_double* q, lapack_int ldq, lapack_complex_double* pt, lapack_int ldpt,
+                          lapack_complex_double* c, lapack_int ldc);
 
-lapack_int LAPACKE_sgbcon( int matrix_order, char norm, lapack_int n,
-                           lapack_int kl, lapack_int ku, const float* ab,
-                           lapack_int ldab, const lapack_int* ipiv, float anorm,
-                           float* rcond );
-lapack_int LAPACKE_dgbcon( int matrix_order, char norm, lapack_int n,
-                           lapack_int kl, lapack_int ku, const double* ab,
-                           lapack_int ldab, const lapack_int* ipiv,
-                           double anorm, double* rcond );
-lapack_int LAPACKE_cgbcon( int matrix_order, char norm, lapack_int n,
-                           lapack_int kl, lapack_int ku,
-                           const lapack_complex_float* ab, lapack_int ldab,
-                           const lapack_int* ipiv, float anorm, float* rcond );
-lapack_int LAPACKE_zgbcon( int matrix_order, char norm, lapack_int n,
-                           lapack_int kl, lapack_int ku,
-                           const lapack_complex_double* ab, lapack_int ldab,
-                           const lapack_int* ipiv, double anorm,
-                           double* rcond );
+lapack_int LAPACKE_sgbcon(int matrix_order, char norm, lapack_int n, lapack_int kl, lapack_int ku, const float* ab,
+                          lapack_int ldab, const lapack_int* ipiv, float anorm, float* rcond);
+lapack_int LAPACKE_dgbcon(int matrix_order, char norm, lapack_int n, lapack_int kl, lapack_int ku, const double* ab,
+                          lapack_int ldab, const lapack_int* ipiv, double anorm, double* rcond);
+lapack_int LAPACKE_cgbcon(int matrix_order, char norm, lapack_int n, lapack_int kl, lapack_int ku,
+                          const lapack_complex_float* ab, lapack_int ldab, const lapack_int* ipiv, float anorm,
+                          float* rcond);
+lapack_int LAPACKE_zgbcon(int matrix_order, char norm, lapack_int n, lapack_int kl, lapack_int ku,
+                          const lapack_complex_double* ab, lapack_int ldab, const lapack_int* ipiv, double anorm,
+                          double* rcond);
 
-lapack_int LAPACKE_sgbequ( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int kl, lapack_int ku, const float* ab,
-                           lapack_int ldab, float* r, float* c, float* rowcnd,
-                           float* colcnd, float* amax );
-lapack_int LAPACKE_dgbequ( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int kl, lapack_int ku, const double* ab,
-                           lapack_int ldab, double* r, double* c,
-                           double* rowcnd, double* colcnd, double* amax );
-lapack_int LAPACKE_cgbequ( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int kl, lapack_int ku,
-                           const lapack_complex_float* ab, lapack_int ldab,
-                           float* r, float* c, float* rowcnd, float* colcnd,
-                           float* amax );
-lapack_int LAPACKE_zgbequ( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int kl, lapack_int ku,
-                           const lapack_complex_double* ab, lapack_int ldab,
-                           double* r, double* c, double* rowcnd, double* colcnd,
-                           double* amax );
+lapack_int LAPACKE_sgbequ(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku, const float* ab,
+                          lapack_int ldab, float* r, float* c, float* rowcnd, float* colcnd, float* amax);
+lapack_int LAPACKE_dgbequ(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku, const double* ab,
+                          lapack_int ldab, double* r, double* c, double* rowcnd, double* colcnd, double* amax);
+lapack_int LAPACKE_cgbequ(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku,
+                          const lapack_complex_float* ab, lapack_int ldab, float* r, float* c, float* rowcnd,
+                          float* colcnd, float* amax);
+lapack_int LAPACKE_zgbequ(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku,
+                          const lapack_complex_double* ab, lapack_int ldab, double* r, double* c, double* rowcnd,
+                          double* colcnd, double* amax);
 
-lapack_int LAPACKE_sgbequb( int matrix_order, lapack_int m, lapack_int n,
-                            lapack_int kl, lapack_int ku, const float* ab,
-                            lapack_int ldab, float* r, float* c, float* rowcnd,
-                            float* colcnd, float* amax );
-lapack_int LAPACKE_dgbequb( int matrix_order, lapack_int m, lapack_int n,
-                            lapack_int kl, lapack_int ku, const double* ab,
-                            lapack_int ldab, double* r, double* c,
-                            double* rowcnd, double* colcnd, double* amax );
-lapack_int LAPACKE_cgbequb( int matrix_order, lapack_int m, lapack_int n,
-                            lapack_int kl, lapack_int ku,
-                            const lapack_complex_float* ab, lapack_int ldab,
-                            float* r, float* c, float* rowcnd, float* colcnd,
-                            float* amax );
-lapack_int LAPACKE_zgbequb( int matrix_order, lapack_int m, lapack_int n,
-                            lapack_int kl, lapack_int ku,
-                            const lapack_complex_double* ab, lapack_int ldab,
-                            double* r, double* c, double* rowcnd,
-                            double* colcnd, double* amax );
+lapack_int LAPACKE_sgbequb(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku, const float* ab,
+                           lapack_int ldab, float* r, float* c, float* rowcnd, float* colcnd, float* amax);
+lapack_int LAPACKE_dgbequb(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku, const double* ab,
+                           lapack_int ldab, double* r, double* c, double* rowcnd, double* colcnd, double* amax);
+lapack_int LAPACKE_cgbequb(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku,
+                           const lapack_complex_float* ab, lapack_int ldab, float* r, float* c, float* rowcnd,
+                           float* colcnd, float* amax);
+lapack_int LAPACKE_zgbequb(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku,
+                           const lapack_complex_double* ab, lapack_int ldab, double* r, double* c, double* rowcnd,
+                           double* colcnd, double* amax);
 
-lapack_int LAPACKE_sgbrfs( int matrix_order, char trans, lapack_int n,
-                           lapack_int kl, lapack_int ku, lapack_int nrhs,
-                           const float* ab, lapack_int ldab, const float* afb,
-                           lapack_int ldafb, const lapack_int* ipiv,
-                           const float* b, lapack_int ldb, float* x,
-                           lapack_int ldx, float* ferr, float* berr );
-lapack_int LAPACKE_dgbrfs( int matrix_order, char trans, lapack_int n,
-                           lapack_int kl, lapack_int ku, lapack_int nrhs,
-                           const double* ab, lapack_int ldab, const double* afb,
-                           lapack_int ldafb, const lapack_int* ipiv,
-                           const double* b, lapack_int ldb, double* x,
-                           lapack_int ldx, double* ferr, double* berr );
-lapack_int LAPACKE_cgbrfs( int matrix_order, char trans, lapack_int n,
-                           lapack_int kl, lapack_int ku, lapack_int nrhs,
-                           const lapack_complex_float* ab, lapack_int ldab,
-                           const lapack_complex_float* afb, lapack_int ldafb,
-                           const lapack_int* ipiv,
-                           const lapack_complex_float* b, lapack_int ldb,
-                           lapack_complex_float* x, lapack_int ldx, float* ferr,
-                           float* berr );
-lapack_int LAPACKE_zgbrfs( int matrix_order, char trans, lapack_int n,
-                           lapack_int kl, lapack_int ku, lapack_int nrhs,
-                           const lapack_complex_double* ab, lapack_int ldab,
-                           const lapack_complex_double* afb, lapack_int ldafb,
-                           const lapack_int* ipiv,
-                           const lapack_complex_double* b, lapack_int ldb,
-                           lapack_complex_double* x, lapack_int ldx,
-                           double* ferr, double* berr );
+lapack_int LAPACKE_sgbrfs(int matrix_order, char trans, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs,
+                          const float* ab, lapack_int ldab, const float* afb, lapack_int ldafb, const lapack_int* ipiv,
+                          const float* b, lapack_int ldb, float* x, lapack_int ldx, float* ferr, float* berr);
+lapack_int LAPACKE_dgbrfs(int matrix_order, char trans, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs,
+                          const double* ab, lapack_int ldab, const double* afb, lapack_int ldafb,
+                          const lapack_int* ipiv, const double* b, lapack_int ldb, double* x, lapack_int ldx,
+                          double* ferr, double* berr);
+lapack_int LAPACKE_cgbrfs(int matrix_order, char trans, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs,
+                          const lapack_complex_float* ab, lapack_int ldab, const lapack_complex_float* afb,
+                          lapack_int ldafb, const lapack_int* ipiv, const lapack_complex_float* b, lapack_int ldb,
+                          lapack_complex_float* x, lapack_int ldx, float* ferr, float* berr);
+lapack_int LAPACKE_zgbrfs(int matrix_order, char trans, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs,
+                          const lapack_complex_double* ab, lapack_int ldab, const lapack_complex_double* afb,
+                          lapack_int ldafb, const lapack_int* ipiv, const lapack_complex_double* b, lapack_int ldb,
+                          lapack_complex_double* x, lapack_int ldx, double* ferr, double* berr);
 
-lapack_int LAPACKE_sgbrfsx( int matrix_order, char trans, char equed,
-                            lapack_int n, lapack_int kl, lapack_int ku,
-                            lapack_int nrhs, const float* ab, lapack_int ldab,
-                            const float* afb, lapack_int ldafb,
-                            const lapack_int* ipiv, const float* r,
-                            const float* c, const float* b, lapack_int ldb,
-                            float* x, lapack_int ldx, float* rcond, float* berr,
-                            lapack_int n_err_bnds, float* err_bnds_norm,
-                            float* err_bnds_comp, lapack_int nparams,
-                            float* params );
-lapack_int LAPACKE_dgbrfsx( int matrix_order, char trans, char equed,
-                            lapack_int n, lapack_int kl, lapack_int ku,
-                            lapack_int nrhs, const double* ab, lapack_int ldab,
-                            const double* afb, lapack_int ldafb,
-                            const lapack_int* ipiv, const double* r,
-                            const double* c, const double* b, lapack_int ldb,
-                            double* x, lapack_int ldx, double* rcond,
-                            double* berr, lapack_int n_err_bnds,
-                            double* err_bnds_norm, double* err_bnds_comp,
-                            lapack_int nparams, double* params );
-lapack_int LAPACKE_cgbrfsx( int matrix_order, char trans, char equed,
-                            lapack_int n, lapack_int kl, lapack_int ku,
-                            lapack_int nrhs, const lapack_complex_float* ab,
-                            lapack_int ldab, const lapack_complex_float* afb,
-                            lapack_int ldafb, const lapack_int* ipiv,
-                            const float* r, const float* c,
-                            const lapack_complex_float* b, lapack_int ldb,
-                            lapack_complex_float* x, lapack_int ldx,
-                            float* rcond, float* berr, lapack_int n_err_bnds,
-                            float* err_bnds_norm, float* err_bnds_comp,
-                            lapack_int nparams, float* params );
-lapack_int LAPACKE_zgbrfsx( int matrix_order, char trans, char equed,
-                            lapack_int n, lapack_int kl, lapack_int ku,
-                            lapack_int nrhs, const lapack_complex_double* ab,
-                            lapack_int ldab, const lapack_complex_double* afb,
-                            lapack_int ldafb, const lapack_int* ipiv,
-                            const double* r, const double* c,
-                            const lapack_complex_double* b, lapack_int ldb,
-                            lapack_complex_double* x, lapack_int ldx,
-                            double* rcond, double* berr, lapack_int n_err_bnds,
-                            double* err_bnds_norm, double* err_bnds_comp,
-                            lapack_int nparams, double* params );
+lapack_int LAPACKE_sgbrfsx(int matrix_order, char trans, char equed, lapack_int n, lapack_int kl, lapack_int ku,
+                           lapack_int nrhs, const float* ab, lapack_int ldab, const float* afb, lapack_int ldafb,
+                           const lapack_int* ipiv, const float* r, const float* c, const float* b, lapack_int ldb,
+                           float* x, lapack_int ldx, float* rcond, float* berr, lapack_int n_err_bnds,
+                           float* err_bnds_norm, float* err_bnds_comp, lapack_int nparams, float* params);
+lapack_int LAPACKE_dgbrfsx(int matrix_order, char trans, char equed, lapack_int n, lapack_int kl, lapack_int ku,
+                           lapack_int nrhs, const double* ab, lapack_int ldab, const double* afb, lapack_int ldafb,
+                           const lapack_int* ipiv, const double* r, const double* c, const double* b, lapack_int ldb,
+                           double* x, lapack_int ldx, double* rcond, double* berr, lapack_int n_err_bnds,
+                           double* err_bnds_norm, double* err_bnds_comp, lapack_int nparams, double* params);
+lapack_int LAPACKE_cgbrfsx(int matrix_order, char trans, char equed, lapack_int n, lapack_int kl, lapack_int ku,
+                           lapack_int nrhs, const lapack_complex_float* ab, lapack_int ldab,
+                           const lapack_complex_float* afb, lapack_int ldafb, const lapack_int* ipiv, const float* r,
+                           const float* c, const lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x,
+                           lapack_int ldx, float* rcond, float* berr, lapack_int n_err_bnds, float* err_bnds_norm,
+                           float* err_bnds_comp, lapack_int nparams, float* params);
+lapack_int LAPACKE_zgbrfsx(int matrix_order, char trans, char equed, lapack_int n, lapack_int kl, lapack_int ku,
+                           lapack_int nrhs, const lapack_complex_double* ab, lapack_int ldab,
+                           const lapack_complex_double* afb, lapack_int ldafb, const lapack_int* ipiv, const double* r,
+                           const double* c, const lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x,
+                           lapack_int ldx, double* rcond, double* berr, lapack_int n_err_bnds, double* err_bnds_norm,
+                           double* err_bnds_comp, lapack_int nparams, double* params);
 
-lapack_int LAPACKE_sgbsv( int matrix_order, lapack_int n, lapack_int kl,
-                          lapack_int ku, lapack_int nrhs, float* ab,
-                          lapack_int ldab, lapack_int* ipiv, float* b,
-                          lapack_int ldb );
-lapack_int LAPACKE_dgbsv( int matrix_order, lapack_int n, lapack_int kl,
-                          lapack_int ku, lapack_int nrhs, double* ab,
-                          lapack_int ldab, lapack_int* ipiv, double* b,
-                          lapack_int ldb );
-lapack_int LAPACKE_cgbsv( int matrix_order, lapack_int n, lapack_int kl,
-                          lapack_int ku, lapack_int nrhs,
-                          lapack_complex_float* ab, lapack_int ldab,
-                          lapack_int* ipiv, lapack_complex_float* b,
-                          lapack_int ldb );
-lapack_int LAPACKE_zgbsv( int matrix_order, lapack_int n, lapack_int kl,
-                          lapack_int ku, lapack_int nrhs,
-                          lapack_complex_double* ab, lapack_int ldab,
-                          lapack_int* ipiv, lapack_complex_double* b,
-                          lapack_int ldb );
+lapack_int LAPACKE_sgbsv(int matrix_order, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, float* ab,
+                         lapack_int ldab, lapack_int* ipiv, float* b, lapack_int ldb);
+lapack_int LAPACKE_dgbsv(int matrix_order, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, double* ab,
+                         lapack_int ldab, lapack_int* ipiv, double* b, lapack_int ldb);
+lapack_int LAPACKE_cgbsv(int matrix_order, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs,
+                         lapack_complex_float* ab, lapack_int ldab, lapack_int* ipiv, lapack_complex_float* b,
+                         lapack_int ldb);
+lapack_int LAPACKE_zgbsv(int matrix_order, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs,
+                         lapack_complex_double* ab, lapack_int ldab, lapack_int* ipiv, lapack_complex_double* b,
+                         lapack_int ldb);
 
-lapack_int LAPACKE_sgbsvx( int matrix_order, char fact, char trans,
-                           lapack_int n, lapack_int kl, lapack_int ku,
-                           lapack_int nrhs, float* ab, lapack_int ldab,
-                           float* afb, lapack_int ldafb, lapack_int* ipiv,
-                           char* equed, float* r, float* c, float* b,
-                           lapack_int ldb, float* x, lapack_int ldx,
-                           float* rcond, float* ferr, float* berr,
-                           float* rpivot );
-lapack_int LAPACKE_dgbsvx( int matrix_order, char fact, char trans,
-                           lapack_int n, lapack_int kl, lapack_int ku,
-                           lapack_int nrhs, double* ab, lapack_int ldab,
-                           double* afb, lapack_int ldafb, lapack_int* ipiv,
-                           char* equed, double* r, double* c, double* b,
-                           lapack_int ldb, double* x, lapack_int ldx,
-                           double* rcond, double* ferr, double* berr,
-                           double* rpivot );
-lapack_int LAPACKE_cgbsvx( int matrix_order, char fact, char trans,
-                           lapack_int n, lapack_int kl, lapack_int ku,
-                           lapack_int nrhs, lapack_complex_float* ab,
-                           lapack_int ldab, lapack_complex_float* afb,
-                           lapack_int ldafb, lapack_int* ipiv, char* equed,
-                           float* r, float* c, lapack_complex_float* b,
-                           lapack_int ldb, lapack_complex_float* x,
-                           lapack_int ldx, float* rcond, float* ferr,
-                           float* berr, float* rpivot );
-lapack_int LAPACKE_zgbsvx( int matrix_order, char fact, char trans,
-                           lapack_int n, lapack_int kl, lapack_int ku,
-                           lapack_int nrhs, lapack_complex_double* ab,
-                           lapack_int ldab, lapack_complex_double* afb,
-                           lapack_int ldafb, lapack_int* ipiv, char* equed,
-                           double* r, double* c, lapack_complex_double* b,
-                           lapack_int ldb, lapack_complex_double* x,
-                           lapack_int ldx, double* rcond, double* ferr,
-                           double* berr, double* rpivot );
+lapack_int LAPACKE_sgbsvx(int matrix_order, char fact, char trans, lapack_int n, lapack_int kl, lapack_int ku,
+                          lapack_int nrhs, float* ab, lapack_int ldab, float* afb, lapack_int ldafb, lapack_int* ipiv,
+                          char* equed, float* r, float* c, float* b, lapack_int ldb, float* x, lapack_int ldx,
+                          float* rcond, float* ferr, float* berr, float* rpivot);
+lapack_int LAPACKE_dgbsvx(int matrix_order, char fact, char trans, lapack_int n, lapack_int kl, lapack_int ku,
+                          lapack_int nrhs, double* ab, lapack_int ldab, double* afb, lapack_int ldafb, lapack_int* ipiv,
+                          char* equed, double* r, double* c, double* b, lapack_int ldb, double* x, lapack_int ldx,
+                          double* rcond, double* ferr, double* berr, double* rpivot);
+lapack_int LAPACKE_cgbsvx(int matrix_order, char fact, char trans, lapack_int n, lapack_int kl, lapack_int ku,
+                          lapack_int nrhs, lapack_complex_float* ab, lapack_int ldab, lapack_complex_float* afb,
+                          lapack_int ldafb, lapack_int* ipiv, char* equed, float* r, float* c, lapack_complex_float* b,
+                          lapack_int ldb, lapack_complex_float* x, lapack_int ldx, float* rcond, float* ferr,
+                          float* berr, float* rpivot);
+lapack_int LAPACKE_zgbsvx(int matrix_order, char fact, char trans, lapack_int n, lapack_int kl, lapack_int ku,
+                          lapack_int nrhs, lapack_complex_double* ab, lapack_int ldab, lapack_complex_double* afb,
+                          lapack_int ldafb, lapack_int* ipiv, char* equed, double* r, double* c,
+                          lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x, lapack_int ldx,
+                          double* rcond, double* ferr, double* berr, double* rpivot);
 
-lapack_int LAPACKE_sgbsvxx( int matrix_order, char fact, char trans,
-                            lapack_int n, lapack_int kl, lapack_int ku,
-                            lapack_int nrhs, float* ab, lapack_int ldab,
-                            float* afb, lapack_int ldafb, lapack_int* ipiv,
-                            char* equed, float* r, float* c, float* b,
-                            lapack_int ldb, float* x, lapack_int ldx,
-                            float* rcond, float* rpvgrw, float* berr,
-                            lapack_int n_err_bnds, float* err_bnds_norm,
-                            float* err_bnds_comp, lapack_int nparams,
-                            float* params );
-lapack_int LAPACKE_dgbsvxx( int matrix_order, char fact, char trans,
-                            lapack_int n, lapack_int kl, lapack_int ku,
-                            lapack_int nrhs, double* ab, lapack_int ldab,
-                            double* afb, lapack_int ldafb, lapack_int* ipiv,
-                            char* equed, double* r, double* c, double* b,
-                            lapack_int ldb, double* x, lapack_int ldx,
-                            double* rcond, double* rpvgrw, double* berr,
-                            lapack_int n_err_bnds, double* err_bnds_norm,
-                            double* err_bnds_comp, lapack_int nparams,
-                            double* params );
-lapack_int LAPACKE_cgbsvxx( int matrix_order, char fact, char trans,
-                            lapack_int n, lapack_int kl, lapack_int ku,
-                            lapack_int nrhs, lapack_complex_float* ab,
-                            lapack_int ldab, lapack_complex_float* afb,
-                            lapack_int ldafb, lapack_int* ipiv, char* equed,
-                            float* r, float* c, lapack_complex_float* b,
-                            lapack_int ldb, lapack_complex_float* x,
-                            lapack_int ldx, float* rcond, float* rpvgrw,
-                            float* berr, lapack_int n_err_bnds,
-                            float* err_bnds_norm, float* err_bnds_comp,
-                            lapack_int nparams, float* params );
-lapack_int LAPACKE_zgbsvxx( int matrix_order, char fact, char trans,
-                            lapack_int n, lapack_int kl, lapack_int ku,
-                            lapack_int nrhs, lapack_complex_double* ab,
-                            lapack_int ldab, lapack_complex_double* afb,
-                            lapack_int ldafb, lapack_int* ipiv, char* equed,
-                            double* r, double* c, lapack_complex_double* b,
-                            lapack_int ldb, lapack_complex_double* x,
-                            lapack_int ldx, double* rcond, double* rpvgrw,
-                            double* berr, lapack_int n_err_bnds,
-                            double* err_bnds_norm, double* err_bnds_comp,
-                            lapack_int nparams, double* params );
+lapack_int LAPACKE_sgbsvxx(int matrix_order, char fact, char trans, lapack_int n, lapack_int kl, lapack_int ku,
+                           lapack_int nrhs, float* ab, lapack_int ldab, float* afb, lapack_int ldafb, lapack_int* ipiv,
+                           char* equed, float* r, float* c, float* b, lapack_int ldb, float* x, lapack_int ldx,
+                           float* rcond, float* rpvgrw, float* berr, lapack_int n_err_bnds, float* err_bnds_norm,
+                           float* err_bnds_comp, lapack_int nparams, float* params);
+lapack_int LAPACKE_dgbsvxx(int matrix_order, char fact, char trans, lapack_int n, lapack_int kl, lapack_int ku,
+                           lapack_int nrhs, double* ab, lapack_int ldab, double* afb, lapack_int ldafb,
+                           lapack_int* ipiv, char* equed, double* r, double* c, double* b, lapack_int ldb, double* x,
+                           lapack_int ldx, double* rcond, double* rpvgrw, double* berr, lapack_int n_err_bnds,
+                           double* err_bnds_norm, double* err_bnds_comp, lapack_int nparams, double* params);
+lapack_int LAPACKE_cgbsvxx(int matrix_order, char fact, char trans, lapack_int n, lapack_int kl, lapack_int ku,
+                           lapack_int nrhs, lapack_complex_float* ab, lapack_int ldab, lapack_complex_float* afb,
+                           lapack_int ldafb, lapack_int* ipiv, char* equed, float* r, float* c, lapack_complex_float* b,
+                           lapack_int ldb, lapack_complex_float* x, lapack_int ldx, float* rcond, float* rpvgrw,
+                           float* berr, lapack_int n_err_bnds, float* err_bnds_norm, float* err_bnds_comp,
+                           lapack_int nparams, float* params);
+lapack_int LAPACKE_zgbsvxx(int matrix_order, char fact, char trans, lapack_int n, lapack_int kl, lapack_int ku,
+                           lapack_int nrhs, lapack_complex_double* ab, lapack_int ldab, lapack_complex_double* afb,
+                           lapack_int ldafb, lapack_int* ipiv, char* equed, double* r, double* c,
+                           lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x, lapack_int ldx,
+                           double* rcond, double* rpvgrw, double* berr, lapack_int n_err_bnds, double* err_bnds_norm,
+                           double* err_bnds_comp, lapack_int nparams, double* params);
 
-lapack_int LAPACKE_sgbtrf( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int kl, lapack_int ku, float* ab,
-                           lapack_int ldab, lapack_int* ipiv );
-lapack_int LAPACKE_dgbtrf( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int kl, lapack_int ku, double* ab,
-                           lapack_int ldab, lapack_int* ipiv );
-lapack_int LAPACKE_cgbtrf( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int kl, lapack_int ku,
-                           lapack_complex_float* ab, lapack_int ldab,
-                           lapack_int* ipiv );
-lapack_int LAPACKE_zgbtrf( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int kl, lapack_int ku,
-                           lapack_complex_double* ab, lapack_int ldab,
-                           lapack_int* ipiv );
+lapack_int LAPACKE_sgbtrf(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku, float* ab,
+                          lapack_int ldab, lapack_int* ipiv);
+lapack_int LAPACKE_dgbtrf(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku, double* ab,
+                          lapack_int ldab, lapack_int* ipiv);
+lapack_int LAPACKE_cgbtrf(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku,
+                          lapack_complex_float* ab, lapack_int ldab, lapack_int* ipiv);
+lapack_int LAPACKE_zgbtrf(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku,
+                          lapack_complex_double* ab, lapack_int ldab, lapack_int* ipiv);
 
-lapack_int LAPACKE_sgbtrs( int matrix_order, char trans, lapack_int n,
-                           lapack_int kl, lapack_int ku, lapack_int nrhs,
-                           const float* ab, lapack_int ldab,
-                           const lapack_int* ipiv, float* b, lapack_int ldb );
-lapack_int LAPACKE_dgbtrs( int matrix_order, char trans, lapack_int n,
-                           lapack_int kl, lapack_int ku, lapack_int nrhs,
-                           const double* ab, lapack_int ldab,
-                           const lapack_int* ipiv, double* b, lapack_int ldb );
-lapack_int LAPACKE_cgbtrs( int matrix_order, char trans, lapack_int n,
-                           lapack_int kl, lapack_int ku, lapack_int nrhs,
-                           const lapack_complex_float* ab, lapack_int ldab,
-                           const lapack_int* ipiv, lapack_complex_float* b,
-                           lapack_int ldb );
-lapack_int LAPACKE_zgbtrs( int matrix_order, char trans, lapack_int n,
-                           lapack_int kl, lapack_int ku, lapack_int nrhs,
-                           const lapack_complex_double* ab, lapack_int ldab,
-                           const lapack_int* ipiv, lapack_complex_double* b,
-                           lapack_int ldb );
+lapack_int LAPACKE_sgbtrs(int matrix_order, char trans, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs,
+                          const float* ab, lapack_int ldab, const lapack_int* ipiv, float* b, lapack_int ldb);
+lapack_int LAPACKE_dgbtrs(int matrix_order, char trans, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs,
+                          const double* ab, lapack_int ldab, const lapack_int* ipiv, double* b, lapack_int ldb);
+lapack_int LAPACKE_cgbtrs(int matrix_order, char trans, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs,
+                          const lapack_complex_float* ab, lapack_int ldab, const lapack_int* ipiv,
+                          lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zgbtrs(int matrix_order, char trans, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs,
+                          const lapack_complex_double* ab, lapack_int ldab, const lapack_int* ipiv,
+                          lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_sgebak( int matrix_order, char job, char side, lapack_int n,
-                           lapack_int ilo, lapack_int ihi, const float* scale,
-                           lapack_int m, float* v, lapack_int ldv );
-lapack_int LAPACKE_dgebak( int matrix_order, char job, char side, lapack_int n,
-                           lapack_int ilo, lapack_int ihi, const double* scale,
-                           lapack_int m, double* v, lapack_int ldv );
-lapack_int LAPACKE_cgebak( int matrix_order, char job, char side, lapack_int n,
-                           lapack_int ilo, lapack_int ihi, const float* scale,
-                           lapack_int m, lapack_complex_float* v,
-                           lapack_int ldv );
-lapack_int LAPACKE_zgebak( int matrix_order, char job, char side, lapack_int n,
-                           lapack_int ilo, lapack_int ihi, const double* scale,
-                           lapack_int m, lapack_complex_double* v,
-                           lapack_int ldv );
+lapack_int LAPACKE_sgebak(int matrix_order, char job, char side, lapack_int n, lapack_int ilo, lapack_int ihi,
+                          const float* scale, lapack_int m, float* v, lapack_int ldv);
+lapack_int LAPACKE_dgebak(int matrix_order, char job, char side, lapack_int n, lapack_int ilo, lapack_int ihi,
+                          const double* scale, lapack_int m, double* v, lapack_int ldv);
+lapack_int LAPACKE_cgebak(int matrix_order, char job, char side, lapack_int n, lapack_int ilo, lapack_int ihi,
+                          const float* scale, lapack_int m, lapack_complex_float* v, lapack_int ldv);
+lapack_int LAPACKE_zgebak(int matrix_order, char job, char side, lapack_int n, lapack_int ilo, lapack_int ihi,
+                          const double* scale, lapack_int m, lapack_complex_double* v, lapack_int ldv);
 
-lapack_int LAPACKE_sgebal( int matrix_order, char job, lapack_int n, float* a,
-                           lapack_int lda, lapack_int* ilo, lapack_int* ihi,
-                           float* scale );
-lapack_int LAPACKE_dgebal( int matrix_order, char job, lapack_int n, double* a,
-                           lapack_int lda, lapack_int* ilo, lapack_int* ihi,
-                           double* scale );
-lapack_int LAPACKE_cgebal( int matrix_order, char job, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda,
-                           lapack_int* ilo, lapack_int* ihi, float* scale );
-lapack_int LAPACKE_zgebal( int matrix_order, char job, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_int* ilo, lapack_int* ihi, double* scale );
+lapack_int LAPACKE_sgebal(int matrix_order, char job, lapack_int n, float* a, lapack_int lda, lapack_int* ilo,
+                          lapack_int* ihi, float* scale);
+lapack_int LAPACKE_dgebal(int matrix_order, char job, lapack_int n, double* a, lapack_int lda, lapack_int* ilo,
+                          lapack_int* ihi, double* scale);
+lapack_int LAPACKE_cgebal(int matrix_order, char job, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                          lapack_int* ilo, lapack_int* ihi, float* scale);
+lapack_int LAPACKE_zgebal(int matrix_order, char job, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                          lapack_int* ilo, lapack_int* ihi, double* scale);
 
-lapack_int LAPACKE_sgebrd( int matrix_order, lapack_int m, lapack_int n,
-                           float* a, lapack_int lda, float* d, float* e,
-                           float* tauq, float* taup );
-lapack_int LAPACKE_dgebrd( int matrix_order, lapack_int m, lapack_int n,
-                           double* a, lapack_int lda, double* d, double* e,
-                           double* tauq, double* taup );
-lapack_int LAPACKE_cgebrd( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda, float* d,
-                           float* e, lapack_complex_float* tauq,
-                           lapack_complex_float* taup );
-lapack_int LAPACKE_zgebrd( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda, double* d,
-                           double* e, lapack_complex_double* tauq,
-                           lapack_complex_double* taup );
+lapack_int LAPACKE_sgebrd(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, float* d, float* e,
+                          float* tauq, float* taup);
+lapack_int LAPACKE_dgebrd(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda, double* d, double* e,
+                          double* tauq, double* taup);
+lapack_int LAPACKE_cgebrd(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                          float* d, float* e, lapack_complex_float* tauq, lapack_complex_float* taup);
+lapack_int LAPACKE_zgebrd(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                          double* d, double* e, lapack_complex_double* tauq, lapack_complex_double* taup);
 
-lapack_int LAPACKE_sgecon( int matrix_order, char norm, lapack_int n,
-                           const float* a, lapack_int lda, float anorm,
-                           float* rcond );
-lapack_int LAPACKE_dgecon( int matrix_order, char norm, lapack_int n,
-                           const double* a, lapack_int lda, double anorm,
-                           double* rcond );
-lapack_int LAPACKE_cgecon( int matrix_order, char norm, lapack_int n,
-                           const lapack_complex_float* a, lapack_int lda,
-                           float anorm, float* rcond );
-lapack_int LAPACKE_zgecon( int matrix_order, char norm, lapack_int n,
-                           const lapack_complex_double* a, lapack_int lda,
-                           double anorm, double* rcond );
+lapack_int LAPACKE_sgecon(int matrix_order, char norm, lapack_int n, const float* a, lapack_int lda, float anorm,
+                          float* rcond);
+lapack_int LAPACKE_dgecon(int matrix_order, char norm, lapack_int n, const double* a, lapack_int lda, double anorm,
+                          double* rcond);
+lapack_int LAPACKE_cgecon(int matrix_order, char norm, lapack_int n, const lapack_complex_float* a, lapack_int lda,
+                          float anorm, float* rcond);
+lapack_int LAPACKE_zgecon(int matrix_order, char norm, lapack_int n, const lapack_complex_double* a, lapack_int lda,
+                          double anorm, double* rcond);
 
-lapack_int LAPACKE_sgeequ( int matrix_order, lapack_int m, lapack_int n,
-                           const float* a, lapack_int lda, float* r, float* c,
-                           float* rowcnd, float* colcnd, float* amax );
-lapack_int LAPACKE_dgeequ( int matrix_order, lapack_int m, lapack_int n,
-                           const double* a, lapack_int lda, double* r,
-                           double* c, double* rowcnd, double* colcnd,
-                           double* amax );
-lapack_int LAPACKE_cgeequ( int matrix_order, lapack_int m, lapack_int n,
-                           const lapack_complex_float* a, lapack_int lda,
-                           float* r, float* c, float* rowcnd, float* colcnd,
-                           float* amax );
-lapack_int LAPACKE_zgeequ( int matrix_order, lapack_int m, lapack_int n,
-                           const lapack_complex_double* a, lapack_int lda,
-                           double* r, double* c, double* rowcnd, double* colcnd,
-                           double* amax );
+lapack_int LAPACKE_sgeequ(int matrix_order, lapack_int m, lapack_int n, const float* a, lapack_int lda, float* r,
+                          float* c, float* rowcnd, float* colcnd, float* amax);
+lapack_int LAPACKE_dgeequ(int matrix_order, lapack_int m, lapack_int n, const double* a, lapack_int lda, double* r,
+                          double* c, double* rowcnd, double* colcnd, double* amax);
+lapack_int LAPACKE_cgeequ(int matrix_order, lapack_int m, lapack_int n, const lapack_complex_float* a, lapack_int lda,
+                          float* r, float* c, float* rowcnd, float* colcnd, float* amax);
+lapack_int LAPACKE_zgeequ(int matrix_order, lapack_int m, lapack_int n, const lapack_complex_double* a, lapack_int lda,
+                          double* r, double* c, double* rowcnd, double* colcnd, double* amax);
 
-lapack_int LAPACKE_sgeequb( int matrix_order, lapack_int m, lapack_int n,
-                            const float* a, lapack_int lda, float* r, float* c,
-                            float* rowcnd, float* colcnd, float* amax );
-lapack_int LAPACKE_dgeequb( int matrix_order, lapack_int m, lapack_int n,
-                            const double* a, lapack_int lda, double* r,
-                            double* c, double* rowcnd, double* colcnd,
-                            double* amax );
-lapack_int LAPACKE_cgeequb( int matrix_order, lapack_int m, lapack_int n,
-                            const lapack_complex_float* a, lapack_int lda,
-                            float* r, float* c, float* rowcnd, float* colcnd,
-                            float* amax );
-lapack_int LAPACKE_zgeequb( int matrix_order, lapack_int m, lapack_int n,
-                            const lapack_complex_double* a, lapack_int lda,
-                            double* r, double* c, double* rowcnd,
-                            double* colcnd, double* amax );
+lapack_int LAPACKE_sgeequb(int matrix_order, lapack_int m, lapack_int n, const float* a, lapack_int lda, float* r,
+                           float* c, float* rowcnd, float* colcnd, float* amax);
+lapack_int LAPACKE_dgeequb(int matrix_order, lapack_int m, lapack_int n, const double* a, lapack_int lda, double* r,
+                           double* c, double* rowcnd, double* colcnd, double* amax);
+lapack_int LAPACKE_cgeequb(int matrix_order, lapack_int m, lapack_int n, const lapack_complex_float* a, lapack_int lda,
+                           float* r, float* c, float* rowcnd, float* colcnd, float* amax);
+lapack_int LAPACKE_zgeequb(int matrix_order, lapack_int m, lapack_int n, const lapack_complex_double* a, lapack_int lda,
+                           double* r, double* c, double* rowcnd, double* colcnd, double* amax);
 
-lapack_int LAPACKE_sgees( int matrix_order, char jobvs, char sort,
-                          LAPACK_S_SELECT2 select, lapack_int n, float* a,
-                          lapack_int lda, lapack_int* sdim, float* wr,
-                          float* wi, float* vs, lapack_int ldvs );
-lapack_int LAPACKE_dgees( int matrix_order, char jobvs, char sort,
-                          LAPACK_D_SELECT2 select, lapack_int n, double* a,
-                          lapack_int lda, lapack_int* sdim, double* wr,
-                          double* wi, double* vs, lapack_int ldvs );
-lapack_int LAPACKE_cgees( int matrix_order, char jobvs, char sort,
-                          LAPACK_C_SELECT1 select, lapack_int n,
-                          lapack_complex_float* a, lapack_int lda,
-                          lapack_int* sdim, lapack_complex_float* w,
-                          lapack_complex_float* vs, lapack_int ldvs );
-lapack_int LAPACKE_zgees( int matrix_order, char jobvs, char sort,
-                          LAPACK_Z_SELECT1 select, lapack_int n,
-                          lapack_complex_double* a, lapack_int lda,
-                          lapack_int* sdim, lapack_complex_double* w,
-                          lapack_complex_double* vs, lapack_int ldvs );
+lapack_int LAPACKE_sgees(int matrix_order, char jobvs, char sort, LAPACK_S_SELECT2 select, lapack_int n, float* a,
+                         lapack_int lda, lapack_int* sdim, float* wr, float* wi, float* vs, lapack_int ldvs);
+lapack_int LAPACKE_dgees(int matrix_order, char jobvs, char sort, LAPACK_D_SELECT2 select, lapack_int n, double* a,
+                         lapack_int lda, lapack_int* sdim, double* wr, double* wi, double* vs, lapack_int ldvs);
+lapack_int LAPACKE_cgees(int matrix_order, char jobvs, char sort, LAPACK_C_SELECT1 select, lapack_int n,
+                         lapack_complex_float* a, lapack_int lda, lapack_int* sdim, lapack_complex_float* w,
+                         lapack_complex_float* vs, lapack_int ldvs);
+lapack_int LAPACKE_zgees(int matrix_order, char jobvs, char sort, LAPACK_Z_SELECT1 select, lapack_int n,
+                         lapack_complex_double* a, lapack_int lda, lapack_int* sdim, lapack_complex_double* w,
+                         lapack_complex_double* vs, lapack_int ldvs);
 
-lapack_int LAPACKE_sgeesx( int matrix_order, char jobvs, char sort,
-                           LAPACK_S_SELECT2 select, char sense, lapack_int n,
-                           float* a, lapack_int lda, lapack_int* sdim,
-                           float* wr, float* wi, float* vs, lapack_int ldvs,
-                           float* rconde, float* rcondv );
-lapack_int LAPACKE_dgeesx( int matrix_order, char jobvs, char sort,
-                           LAPACK_D_SELECT2 select, char sense, lapack_int n,
-                           double* a, lapack_int lda, lapack_int* sdim,
-                           double* wr, double* wi, double* vs, lapack_int ldvs,
-                           double* rconde, double* rcondv );
-lapack_int LAPACKE_cgeesx( int matrix_order, char jobvs, char sort,
-                           LAPACK_C_SELECT1 select, char sense, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda,
-                           lapack_int* sdim, lapack_complex_float* w,
-                           lapack_complex_float* vs, lapack_int ldvs,
-                           float* rconde, float* rcondv );
-lapack_int LAPACKE_zgeesx( int matrix_order, char jobvs, char sort,
-                           LAPACK_Z_SELECT1 select, char sense, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_int* sdim, lapack_complex_double* w,
-                           lapack_complex_double* vs, lapack_int ldvs,
-                           double* rconde, double* rcondv );
+lapack_int LAPACKE_sgeesx(int matrix_order, char jobvs, char sort, LAPACK_S_SELECT2 select, char sense, lapack_int n,
+                          float* a, lapack_int lda, lapack_int* sdim, float* wr, float* wi, float* vs, lapack_int ldvs,
+                          float* rconde, float* rcondv);
+lapack_int LAPACKE_dgeesx(int matrix_order, char jobvs, char sort, LAPACK_D_SELECT2 select, char sense, lapack_int n,
+                          double* a, lapack_int lda, lapack_int* sdim, double* wr, double* wi, double* vs,
+                          lapack_int ldvs, double* rconde, double* rcondv);
+lapack_int LAPACKE_cgeesx(int matrix_order, char jobvs, char sort, LAPACK_C_SELECT1 select, char sense, lapack_int n,
+                          lapack_complex_float* a, lapack_int lda, lapack_int* sdim, lapack_complex_float* w,
+                          lapack_complex_float* vs, lapack_int ldvs, float* rconde, float* rcondv);
+lapack_int LAPACKE_zgeesx(int matrix_order, char jobvs, char sort, LAPACK_Z_SELECT1 select, char sense, lapack_int n,
+                          lapack_complex_double* a, lapack_int lda, lapack_int* sdim, lapack_complex_double* w,
+                          lapack_complex_double* vs, lapack_int ldvs, double* rconde, double* rcondv);
 
-lapack_int LAPACKE_sgeev( int matrix_order, char jobvl, char jobvr,
-                          lapack_int n, float* a, lapack_int lda, float* wr,
-                          float* wi, float* vl, lapack_int ldvl, float* vr,
-                          lapack_int ldvr );
-lapack_int LAPACKE_dgeev( int matrix_order, char jobvl, char jobvr,
-                          lapack_int n, double* a, lapack_int lda, double* wr,
-                          double* wi, double* vl, lapack_int ldvl, double* vr,
-                          lapack_int ldvr );
-lapack_int LAPACKE_cgeev( int matrix_order, char jobvl, char jobvr,
-                          lapack_int n, lapack_complex_float* a, lapack_int lda,
-                          lapack_complex_float* w, lapack_complex_float* vl,
-                          lapack_int ldvl, lapack_complex_float* vr,
-                          lapack_int ldvr );
-lapack_int LAPACKE_zgeev( int matrix_order, char jobvl, char jobvr,
-                          lapack_int n, lapack_complex_double* a,
-                          lapack_int lda, lapack_complex_double* w,
-                          lapack_complex_double* vl, lapack_int ldvl,
-                          lapack_complex_double* vr, lapack_int ldvr );
+lapack_int LAPACKE_sgeev(int matrix_order, char jobvl, char jobvr, lapack_int n, float* a, lapack_int lda, float* wr,
+                         float* wi, float* vl, lapack_int ldvl, float* vr, lapack_int ldvr);
+lapack_int LAPACKE_dgeev(int matrix_order, char jobvl, char jobvr, lapack_int n, double* a, lapack_int lda, double* wr,
+                         double* wi, double* vl, lapack_int ldvl, double* vr, lapack_int ldvr);
+lapack_int LAPACKE_cgeev(int matrix_order, char jobvl, char jobvr, lapack_int n, lapack_complex_float* a,
+                         lapack_int lda, lapack_complex_float* w, lapack_complex_float* vl, lapack_int ldvl,
+                         lapack_complex_float* vr, lapack_int ldvr);
+lapack_int LAPACKE_zgeev(int matrix_order, char jobvl, char jobvr, lapack_int n, lapack_complex_double* a,
+                         lapack_int lda, lapack_complex_double* w, lapack_complex_double* vl, lapack_int ldvl,
+                         lapack_complex_double* vr, lapack_int ldvr);
 
-lapack_int LAPACKE_sgeevx( int matrix_order, char balanc, char jobvl,
-                           char jobvr, char sense, lapack_int n, float* a,
-                           lapack_int lda, float* wr, float* wi, float* vl,
-                           lapack_int ldvl, float* vr, lapack_int ldvr,
-                           lapack_int* ilo, lapack_int* ihi, float* scale,
-                           float* abnrm, float* rconde, float* rcondv );
-lapack_int LAPACKE_dgeevx( int matrix_order, char balanc, char jobvl,
-                           char jobvr, char sense, lapack_int n, double* a,
-                           lapack_int lda, double* wr, double* wi, double* vl,
-                           lapack_int ldvl, double* vr, lapack_int ldvr,
-                           lapack_int* ilo, lapack_int* ihi, double* scale,
-                           double* abnrm, double* rconde, double* rcondv );
-lapack_int LAPACKE_cgeevx( int matrix_order, char balanc, char jobvl,
-                           char jobvr, char sense, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda,
-                           lapack_complex_float* w, lapack_complex_float* vl,
-                           lapack_int ldvl, lapack_complex_float* vr,
-                           lapack_int ldvr, lapack_int* ilo, lapack_int* ihi,
-                           float* scale, float* abnrm, float* rconde,
-                           float* rcondv );
-lapack_int LAPACKE_zgeevx( int matrix_order, char balanc, char jobvl,
-                           char jobvr, char sense, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_complex_double* w, lapack_complex_double* vl,
-                           lapack_int ldvl, lapack_complex_double* vr,
-                           lapack_int ldvr, lapack_int* ilo, lapack_int* ihi,
-                           double* scale, double* abnrm, double* rconde,
-                           double* rcondv );
+lapack_int LAPACKE_sgeevx(int matrix_order, char balanc, char jobvl, char jobvr, char sense, lapack_int n, float* a,
+                          lapack_int lda, float* wr, float* wi, float* vl, lapack_int ldvl, float* vr, lapack_int ldvr,
+                          lapack_int* ilo, lapack_int* ihi, float* scale, float* abnrm, float* rconde, float* rcondv);
+lapack_int LAPACKE_dgeevx(int matrix_order, char balanc, char jobvl, char jobvr, char sense, lapack_int n, double* a,
+                          lapack_int lda, double* wr, double* wi, double* vl, lapack_int ldvl, double* vr,
+                          lapack_int ldvr, lapack_int* ilo, lapack_int* ihi, double* scale, double* abnrm,
+                          double* rconde, double* rcondv);
+lapack_int LAPACKE_cgeevx(int matrix_order, char balanc, char jobvl, char jobvr, char sense, lapack_int n,
+                          lapack_complex_float* a, lapack_int lda, lapack_complex_float* w, lapack_complex_float* vl,
+                          lapack_int ldvl, lapack_complex_float* vr, lapack_int ldvr, lapack_int* ilo, lapack_int* ihi,
+                          float* scale, float* abnrm, float* rconde, float* rcondv);
+lapack_int LAPACKE_zgeevx(int matrix_order, char balanc, char jobvl, char jobvr, char sense, lapack_int n,
+                          lapack_complex_double* a, lapack_int lda, lapack_complex_double* w, lapack_complex_double* vl,
+                          lapack_int ldvl, lapack_complex_double* vr, lapack_int ldvr, lapack_int* ilo, lapack_int* ihi,
+                          double* scale, double* abnrm, double* rconde, double* rcondv);
 
-lapack_int LAPACKE_sgehrd( int matrix_order, lapack_int n, lapack_int ilo,
-                           lapack_int ihi, float* a, lapack_int lda,
-                           float* tau );
-lapack_int LAPACKE_dgehrd( int matrix_order, lapack_int n, lapack_int ilo,
-                           lapack_int ihi, double* a, lapack_int lda,
-                           double* tau );
-lapack_int LAPACKE_cgehrd( int matrix_order, lapack_int n, lapack_int ilo,
-                           lapack_int ihi, lapack_complex_float* a,
-                           lapack_int lda, lapack_complex_float* tau );
-lapack_int LAPACKE_zgehrd( int matrix_order, lapack_int n, lapack_int ilo,
-                           lapack_int ihi, lapack_complex_double* a,
-                           lapack_int lda, lapack_complex_double* tau );
+lapack_int LAPACKE_sgehrd(int matrix_order, lapack_int n, lapack_int ilo, lapack_int ihi, float* a, lapack_int lda,
+                          float* tau);
+lapack_int LAPACKE_dgehrd(int matrix_order, lapack_int n, lapack_int ilo, lapack_int ihi, double* a, lapack_int lda,
+                          double* tau);
+lapack_int LAPACKE_cgehrd(int matrix_order, lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_float* a,
+                          lapack_int lda, lapack_complex_float* tau);
+lapack_int LAPACKE_zgehrd(int matrix_order, lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_double* a,
+                          lapack_int lda, lapack_complex_double* tau);
 
-lapack_int LAPACKE_sgejsv( int matrix_order, char joba, char jobu, char jobv,
-                           char jobr, char jobt, char jobp, lapack_int m,
-                           lapack_int n, float* a, lapack_int lda, float* sva,
-                           float* u, lapack_int ldu, float* v, lapack_int ldv,
-                           float* stat, lapack_int* istat );
-lapack_int LAPACKE_dgejsv( int matrix_order, char joba, char jobu, char jobv,
-                           char jobr, char jobt, char jobp, lapack_int m,
-                           lapack_int n, double* a, lapack_int lda, double* sva,
-                           double* u, lapack_int ldu, double* v, lapack_int ldv,
-                           double* stat, lapack_int* istat );
+lapack_int LAPACKE_sgejsv(int matrix_order, char joba, char jobu, char jobv, char jobr, char jobt, char jobp,
+                          lapack_int m, lapack_int n, float* a, lapack_int lda, float* sva, float* u, lapack_int ldu,
+                          float* v, lapack_int ldv, float* stat, lapack_int* istat);
+lapack_int LAPACKE_dgejsv(int matrix_order, char joba, char jobu, char jobv, char jobr, char jobt, char jobp,
+                          lapack_int m, lapack_int n, double* a, lapack_int lda, double* sva, double* u, lapack_int ldu,
+                          double* v, lapack_int ldv, double* stat, lapack_int* istat);
 
-lapack_int LAPACKE_sgelq2( int matrix_order, lapack_int m, lapack_int n,
-                           float* a, lapack_int lda, float* tau );
-lapack_int LAPACKE_dgelq2( int matrix_order, lapack_int m, lapack_int n,
-                           double* a, lapack_int lda, double* tau );
-lapack_int LAPACKE_cgelq2( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda,
-                           lapack_complex_float* tau );
-lapack_int LAPACKE_zgelq2( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_complex_double* tau );
+lapack_int LAPACKE_sgelq2(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, float* tau);
+lapack_int LAPACKE_dgelq2(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda, double* tau);
+lapack_int LAPACKE_cgelq2(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                          lapack_complex_float* tau);
+lapack_int LAPACKE_zgelq2(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                          lapack_complex_double* tau);
 
-lapack_int LAPACKE_sgelqf( int matrix_order, lapack_int m, lapack_int n,
-                           float* a, lapack_int lda, float* tau );
-lapack_int LAPACKE_dgelqf( int matrix_order, lapack_int m, lapack_int n,
-                           double* a, lapack_int lda, double* tau );
-lapack_int LAPACKE_cgelqf( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda,
-                           lapack_complex_float* tau );
-lapack_int LAPACKE_zgelqf( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_complex_double* tau );
+lapack_int LAPACKE_sgelqf(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, float* tau);
+lapack_int LAPACKE_dgelqf(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda, double* tau);
+lapack_int LAPACKE_cgelqf(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                          lapack_complex_float* tau);
+lapack_int LAPACKE_zgelqf(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                          lapack_complex_double* tau);
 
-lapack_int LAPACKE_sgels( int matrix_order, char trans, lapack_int m,
-                          lapack_int n, lapack_int nrhs, float* a,
-                          lapack_int lda, float* b, lapack_int ldb );
-lapack_int LAPACKE_dgels( int matrix_order, char trans, lapack_int m,
-                          lapack_int n, lapack_int nrhs, double* a,
-                          lapack_int lda, double* b, lapack_int ldb );
-lapack_int LAPACKE_cgels( int matrix_order, char trans, lapack_int m,
-                          lapack_int n, lapack_int nrhs,
-                          lapack_complex_float* a, lapack_int lda,
-                          lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_zgels( int matrix_order, char trans, lapack_int m,
-                          lapack_int n, lapack_int nrhs,
-                          lapack_complex_double* a, lapack_int lda,
-                          lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_sgels(int matrix_order, char trans, lapack_int m, lapack_int n, lapack_int nrhs, float* a,
+                         lapack_int lda, float* b, lapack_int ldb);
+lapack_int LAPACKE_dgels(int matrix_order, char trans, lapack_int m, lapack_int n, lapack_int nrhs, double* a,
+                         lapack_int lda, double* b, lapack_int ldb);
+lapack_int LAPACKE_cgels(int matrix_order, char trans, lapack_int m, lapack_int n, lapack_int nrhs,
+                         lapack_complex_float* a, lapack_int lda, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zgels(int matrix_order, char trans, lapack_int m, lapack_int n, lapack_int nrhs,
+                         lapack_complex_double* a, lapack_int lda, lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_sgelsd( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int nrhs, float* a, lapack_int lda, float* b,
-                           lapack_int ldb, float* s, float rcond,
-                           lapack_int* rank );
-lapack_int LAPACKE_dgelsd( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int nrhs, double* a, lapack_int lda,
-                           double* b, lapack_int ldb, double* s, double rcond,
-                           lapack_int* rank );
-lapack_int LAPACKE_cgelsd( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int nrhs, lapack_complex_float* a,
-                           lapack_int lda, lapack_complex_float* b,
-                           lapack_int ldb, float* s, float rcond,
-                           lapack_int* rank );
-lapack_int LAPACKE_zgelsd( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int nrhs, lapack_complex_double* a,
-                           lapack_int lda, lapack_complex_double* b,
-                           lapack_int ldb, double* s, double rcond,
-                           lapack_int* rank );
+lapack_int LAPACKE_sgelsd(int matrix_order, lapack_int m, lapack_int n, lapack_int nrhs, float* a, lapack_int lda,
+                          float* b, lapack_int ldb, float* s, float rcond, lapack_int* rank);
+lapack_int LAPACKE_dgelsd(int matrix_order, lapack_int m, lapack_int n, lapack_int nrhs, double* a, lapack_int lda,
+                          double* b, lapack_int ldb, double* s, double rcond, lapack_int* rank);
+lapack_int LAPACKE_cgelsd(int matrix_order, lapack_int m, lapack_int n, lapack_int nrhs, lapack_complex_float* a,
+                          lapack_int lda, lapack_complex_float* b, lapack_int ldb, float* s, float rcond,
+                          lapack_int* rank);
+lapack_int LAPACKE_zgelsd(int matrix_order, lapack_int m, lapack_int n, lapack_int nrhs, lapack_complex_double* a,
+                          lapack_int lda, lapack_complex_double* b, lapack_int ldb, double* s, double rcond,
+                          lapack_int* rank);
 
-lapack_int LAPACKE_sgelss( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int nrhs, float* a, lapack_int lda, float* b,
-                           lapack_int ldb, float* s, float rcond,
-                           lapack_int* rank );
-lapack_int LAPACKE_dgelss( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int nrhs, double* a, lapack_int lda,
-                           double* b, lapack_int ldb, double* s, double rcond,
-                           lapack_int* rank );
-lapack_int LAPACKE_cgelss( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int nrhs, lapack_complex_float* a,
-                           lapack_int lda, lapack_complex_float* b,
-                           lapack_int ldb, float* s, float rcond,
-                           lapack_int* rank );
-lapack_int LAPACKE_zgelss( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int nrhs, lapack_complex_double* a,
-                           lapack_int lda, lapack_complex_double* b,
-                           lapack_int ldb, double* s, double rcond,
-                           lapack_int* rank );
+lapack_int LAPACKE_sgelss(int matrix_order, lapack_int m, lapack_int n, lapack_int nrhs, float* a, lapack_int lda,
+                          float* b, lapack_int ldb, float* s, float rcond, lapack_int* rank);
+lapack_int LAPACKE_dgelss(int matrix_order, lapack_int m, lapack_int n, lapack_int nrhs, double* a, lapack_int lda,
+                          double* b, lapack_int ldb, double* s, double rcond, lapack_int* rank);
+lapack_int LAPACKE_cgelss(int matrix_order, lapack_int m, lapack_int n, lapack_int nrhs, lapack_complex_float* a,
+                          lapack_int lda, lapack_complex_float* b, lapack_int ldb, float* s, float rcond,
+                          lapack_int* rank);
+lapack_int LAPACKE_zgelss(int matrix_order, lapack_int m, lapack_int n, lapack_int nrhs, lapack_complex_double* a,
+                          lapack_int lda, lapack_complex_double* b, lapack_int ldb, double* s, double rcond,
+                          lapack_int* rank);
 
-lapack_int LAPACKE_sgelsy( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int nrhs, float* a, lapack_int lda, float* b,
-                           lapack_int ldb, lapack_int* jpvt, float rcond,
-                           lapack_int* rank );
-lapack_int LAPACKE_dgelsy( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int nrhs, double* a, lapack_int lda,
-                           double* b, lapack_int ldb, lapack_int* jpvt,
-                           double rcond, lapack_int* rank );
-lapack_int LAPACKE_cgelsy( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int nrhs, lapack_complex_float* a,
-                           lapack_int lda, lapack_complex_float* b,
-                           lapack_int ldb, lapack_int* jpvt, float rcond,
-                           lapack_int* rank );
-lapack_int LAPACKE_zgelsy( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int nrhs, lapack_complex_double* a,
-                           lapack_int lda, lapack_complex_double* b,
-                           lapack_int ldb, lapack_int* jpvt, double rcond,
-                           lapack_int* rank );
+lapack_int LAPACKE_sgelsy(int matrix_order, lapack_int m, lapack_int n, lapack_int nrhs, float* a, lapack_int lda,
+                          float* b, lapack_int ldb, lapack_int* jpvt, float rcond, lapack_int* rank);
+lapack_int LAPACKE_dgelsy(int matrix_order, lapack_int m, lapack_int n, lapack_int nrhs, double* a, lapack_int lda,
+                          double* b, lapack_int ldb, lapack_int* jpvt, double rcond, lapack_int* rank);
+lapack_int LAPACKE_cgelsy(int matrix_order, lapack_int m, lapack_int n, lapack_int nrhs, lapack_complex_float* a,
+                          lapack_int lda, lapack_complex_float* b, lapack_int ldb, lapack_int* jpvt, float rcond,
+                          lapack_int* rank);
+lapack_int LAPACKE_zgelsy(int matrix_order, lapack_int m, lapack_int n, lapack_int nrhs, lapack_complex_double* a,
+                          lapack_int lda, lapack_complex_double* b, lapack_int ldb, lapack_int* jpvt, double rcond,
+                          lapack_int* rank);
 
-lapack_int LAPACKE_sgeqlf( int matrix_order, lapack_int m, lapack_int n,
-                           float* a, lapack_int lda, float* tau );
-lapack_int LAPACKE_dgeqlf( int matrix_order, lapack_int m, lapack_int n,
-                           double* a, lapack_int lda, double* tau );
-lapack_int LAPACKE_cgeqlf( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda,
-                           lapack_complex_float* tau );
-lapack_int LAPACKE_zgeqlf( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_complex_double* tau );
+lapack_int LAPACKE_sgeqlf(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, float* tau);
+lapack_int LAPACKE_dgeqlf(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda, double* tau);
+lapack_int LAPACKE_cgeqlf(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                          lapack_complex_float* tau);
+lapack_int LAPACKE_zgeqlf(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                          lapack_complex_double* tau);
 
-lapack_int LAPACKE_sgeqp3( int matrix_order, lapack_int m, lapack_int n,
-                           float* a, lapack_int lda, lapack_int* jpvt,
-                           float* tau );
-lapack_int LAPACKE_dgeqp3( int matrix_order, lapack_int m, lapack_int n,
-                           double* a, lapack_int lda, lapack_int* jpvt,
-                           double* tau );
-lapack_int LAPACKE_cgeqp3( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda,
-                           lapack_int* jpvt, lapack_complex_float* tau );
-lapack_int LAPACKE_zgeqp3( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_int* jpvt, lapack_complex_double* tau );
+lapack_int LAPACKE_sgeqp3(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, lapack_int* jpvt,
+                          float* tau);
+lapack_int LAPACKE_dgeqp3(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda, lapack_int* jpvt,
+                          double* tau);
+lapack_int LAPACKE_cgeqp3(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                          lapack_int* jpvt, lapack_complex_float* tau);
+lapack_int LAPACKE_zgeqp3(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                          lapack_int* jpvt, lapack_complex_double* tau);
 
-lapack_int LAPACKE_sgeqpf( int matrix_order, lapack_int m, lapack_int n,
-                           float* a, lapack_int lda, lapack_int* jpvt,
-                           float* tau );
-lapack_int LAPACKE_dgeqpf( int matrix_order, lapack_int m, lapack_int n,
-                           double* a, lapack_int lda, lapack_int* jpvt,
-                           double* tau );
-lapack_int LAPACKE_cgeqpf( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda,
-                           lapack_int* jpvt, lapack_complex_float* tau );
-lapack_int LAPACKE_zgeqpf( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_int* jpvt, lapack_complex_double* tau );
+lapack_int LAPACKE_sgeqpf(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, lapack_int* jpvt,
+                          float* tau);
+lapack_int LAPACKE_dgeqpf(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda, lapack_int* jpvt,
+                          double* tau);
+lapack_int LAPACKE_cgeqpf(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                          lapack_int* jpvt, lapack_complex_float* tau);
+lapack_int LAPACKE_zgeqpf(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                          lapack_int* jpvt, lapack_complex_double* tau);
 
-lapack_int LAPACKE_sgeqr2( int matrix_order, lapack_int m, lapack_int n,
-                           float* a, lapack_int lda, float* tau );
-lapack_int LAPACKE_dgeqr2( int matrix_order, lapack_int m, lapack_int n,
-                           double* a, lapack_int lda, double* tau );
-lapack_int LAPACKE_cgeqr2( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda,
-                           lapack_complex_float* tau );
-lapack_int LAPACKE_zgeqr2( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_complex_double* tau );
+lapack_int LAPACKE_sgeqr2(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, float* tau);
+lapack_int LAPACKE_dgeqr2(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda, double* tau);
+lapack_int LAPACKE_cgeqr2(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                          lapack_complex_float* tau);
+lapack_int LAPACKE_zgeqr2(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                          lapack_complex_double* tau);
 
-lapack_int LAPACKE_sgeqrf( int matrix_order, lapack_int m, lapack_int n,
-                           float* a, lapack_int lda, float* tau );
-lapack_int LAPACKE_dgeqrf( int matrix_order, lapack_int m, lapack_int n,
-                           double* a, lapack_int lda, double* tau );
-lapack_int LAPACKE_cgeqrf( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda,
-                           lapack_complex_float* tau );
-lapack_int LAPACKE_zgeqrf( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_complex_double* tau );
+lapack_int LAPACKE_sgeqrf(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, float* tau);
+lapack_int LAPACKE_dgeqrf(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda, double* tau);
+lapack_int LAPACKE_cgeqrf(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                          lapack_complex_float* tau);
+lapack_int LAPACKE_zgeqrf(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                          lapack_complex_double* tau);
 
-lapack_int LAPACKE_sgeqrfp( int matrix_order, lapack_int m, lapack_int n,
-                            float* a, lapack_int lda, float* tau );
-lapack_int LAPACKE_dgeqrfp( int matrix_order, lapack_int m, lapack_int n,
-                            double* a, lapack_int lda, double* tau );
-lapack_int LAPACKE_cgeqrfp( int matrix_order, lapack_int m, lapack_int n,
-                            lapack_complex_float* a, lapack_int lda,
-                            lapack_complex_float* tau );
-lapack_int LAPACKE_zgeqrfp( int matrix_order, lapack_int m, lapack_int n,
-                            lapack_complex_double* a, lapack_int lda,
-                            lapack_complex_double* tau );
+lapack_int LAPACKE_sgeqrfp(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, float* tau);
+lapack_int LAPACKE_dgeqrfp(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda, double* tau);
+lapack_int LAPACKE_cgeqrfp(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                           lapack_complex_float* tau);
+lapack_int LAPACKE_zgeqrfp(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                           lapack_complex_double* tau);
 
-lapack_int LAPACKE_sgerfs( int matrix_order, char trans, lapack_int n,
-                           lapack_int nrhs, const float* a, lapack_int lda,
-                           const float* af, lapack_int ldaf,
-                           const lapack_int* ipiv, const float* b,
-                           lapack_int ldb, float* x, lapack_int ldx,
-                           float* ferr, float* berr );
-lapack_int LAPACKE_dgerfs( int matrix_order, char trans, lapack_int n,
-                           lapack_int nrhs, const double* a, lapack_int lda,
-                           const double* af, lapack_int ldaf,
-                           const lapack_int* ipiv, const double* b,
-                           lapack_int ldb, double* x, lapack_int ldx,
-                           double* ferr, double* berr );
-lapack_int LAPACKE_cgerfs( int matrix_order, char trans, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_float* a,
-                           lapack_int lda, const lapack_complex_float* af,
-                           lapack_int ldaf, const lapack_int* ipiv,
-                           const lapack_complex_float* b, lapack_int ldb,
-                           lapack_complex_float* x, lapack_int ldx, float* ferr,
-                           float* berr );
-lapack_int LAPACKE_zgerfs( int matrix_order, char trans, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_double* a,
-                           lapack_int lda, const lapack_complex_double* af,
-                           lapack_int ldaf, const lapack_int* ipiv,
-                           const lapack_complex_double* b, lapack_int ldb,
-                           lapack_complex_double* x, lapack_int ldx,
-                           double* ferr, double* berr );
+lapack_int LAPACKE_sgerfs(int matrix_order, char trans, lapack_int n, lapack_int nrhs, const float* a, lapack_int lda,
+                          const float* af, lapack_int ldaf, const lapack_int* ipiv, const float* b, lapack_int ldb,
+                          float* x, lapack_int ldx, float* ferr, float* berr);
+lapack_int LAPACKE_dgerfs(int matrix_order, char trans, lapack_int n, lapack_int nrhs, const double* a, lapack_int lda,
+                          const double* af, lapack_int ldaf, const lapack_int* ipiv, const double* b, lapack_int ldb,
+                          double* x, lapack_int ldx, double* ferr, double* berr);
+lapack_int LAPACKE_cgerfs(int matrix_order, char trans, lapack_int n, lapack_int nrhs, const lapack_complex_float* a,
+                          lapack_int lda, const lapack_complex_float* af, lapack_int ldaf, const lapack_int* ipiv,
+                          const lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x, lapack_int ldx,
+                          float* ferr, float* berr);
+lapack_int LAPACKE_zgerfs(int matrix_order, char trans, lapack_int n, lapack_int nrhs, const lapack_complex_double* a,
+                          lapack_int lda, const lapack_complex_double* af, lapack_int ldaf, const lapack_int* ipiv,
+                          const lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x, lapack_int ldx,
+                          double* ferr, double* berr);
 
-lapack_int LAPACKE_sgerfsx( int matrix_order, char trans, char equed,
-                            lapack_int n, lapack_int nrhs, const float* a,
-                            lapack_int lda, const float* af, lapack_int ldaf,
-                            const lapack_int* ipiv, const float* r,
-                            const float* c, const float* b, lapack_int ldb,
-                            float* x, lapack_int ldx, float* rcond, float* berr,
-                            lapack_int n_err_bnds, float* err_bnds_norm,
-                            float* err_bnds_comp, lapack_int nparams,
-                            float* params );
-lapack_int LAPACKE_dgerfsx( int matrix_order, char trans, char equed,
-                            lapack_int n, lapack_int nrhs, const double* a,
-                            lapack_int lda, const double* af, lapack_int ldaf,
-                            const lapack_int* ipiv, const double* r,
-                            const double* c, const double* b, lapack_int ldb,
-                            double* x, lapack_int ldx, double* rcond,
-                            double* berr, lapack_int n_err_bnds,
-                            double* err_bnds_norm, double* err_bnds_comp,
-                            lapack_int nparams, double* params );
-lapack_int LAPACKE_cgerfsx( int matrix_order, char trans, char equed,
-                            lapack_int n, lapack_int nrhs,
-                            const lapack_complex_float* a, lapack_int lda,
-                            const lapack_complex_float* af, lapack_int ldaf,
-                            const lapack_int* ipiv, const float* r,
-                            const float* c, const lapack_complex_float* b,
-                            lapack_int ldb, lapack_complex_float* x,
-                            lapack_int ldx, float* rcond, float* berr,
-                            lapack_int n_err_bnds, float* err_bnds_norm,
-                            float* err_bnds_comp, lapack_int nparams,
-                            float* params );
-lapack_int LAPACKE_zgerfsx( int matrix_order, char trans, char equed,
-                            lapack_int n, lapack_int nrhs,
-                            const lapack_complex_double* a, lapack_int lda,
-                            const lapack_complex_double* af, lapack_int ldaf,
-                            const lapack_int* ipiv, const double* r,
-                            const double* c, const lapack_complex_double* b,
-                            lapack_int ldb, lapack_complex_double* x,
-                            lapack_int ldx, double* rcond, double* berr,
-                            lapack_int n_err_bnds, double* err_bnds_norm,
-                            double* err_bnds_comp, lapack_int nparams,
-                            double* params );
+lapack_int LAPACKE_sgerfsx(int matrix_order, char trans, char equed, lapack_int n, lapack_int nrhs, const float* a,
+                           lapack_int lda, const float* af, lapack_int ldaf, const lapack_int* ipiv, const float* r,
+                           const float* c, const float* b, lapack_int ldb, float* x, lapack_int ldx, float* rcond,
+                           float* berr, lapack_int n_err_bnds, float* err_bnds_norm, float* err_bnds_comp,
+                           lapack_int nparams, float* params);
+lapack_int LAPACKE_dgerfsx(int matrix_order, char trans, char equed, lapack_int n, lapack_int nrhs, const double* a,
+                           lapack_int lda, const double* af, lapack_int ldaf, const lapack_int* ipiv, const double* r,
+                           const double* c, const double* b, lapack_int ldb, double* x, lapack_int ldx, double* rcond,
+                           double* berr, lapack_int n_err_bnds, double* err_bnds_norm, double* err_bnds_comp,
+                           lapack_int nparams, double* params);
+lapack_int LAPACKE_cgerfsx(int matrix_order, char trans, char equed, lapack_int n, lapack_int nrhs,
+                           const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* af,
+                           lapack_int ldaf, const lapack_int* ipiv, const float* r, const float* c,
+                           const lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x, lapack_int ldx,
+                           float* rcond, float* berr, lapack_int n_err_bnds, float* err_bnds_norm, float* err_bnds_comp,
+                           lapack_int nparams, float* params);
+lapack_int LAPACKE_zgerfsx(int matrix_order, char trans, char equed, lapack_int n, lapack_int nrhs,
+                           const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* af,
+                           lapack_int ldaf, const lapack_int* ipiv, const double* r, const double* c,
+                           const lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x, lapack_int ldx,
+                           double* rcond, double* berr, lapack_int n_err_bnds, double* err_bnds_norm,
+                           double* err_bnds_comp, lapack_int nparams, double* params);
 
-lapack_int LAPACKE_sgerqf( int matrix_order, lapack_int m, lapack_int n,
-                           float* a, lapack_int lda, float* tau );
-lapack_int LAPACKE_dgerqf( int matrix_order, lapack_int m, lapack_int n,
-                           double* a, lapack_int lda, double* tau );
-lapack_int LAPACKE_cgerqf( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda,
-                           lapack_complex_float* tau );
-lapack_int LAPACKE_zgerqf( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_complex_double* tau );
+lapack_int LAPACKE_sgerqf(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, float* tau);
+lapack_int LAPACKE_dgerqf(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda, double* tau);
+lapack_int LAPACKE_cgerqf(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                          lapack_complex_float* tau);
+lapack_int LAPACKE_zgerqf(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                          lapack_complex_double* tau);
 
-lapack_int LAPACKE_sgesdd( int matrix_order, char jobz, lapack_int m,
-                           lapack_int n, float* a, lapack_int lda, float* s,
-                           float* u, lapack_int ldu, float* vt,
-                           lapack_int ldvt );
-lapack_int LAPACKE_dgesdd( int matrix_order, char jobz, lapack_int m,
-                           lapack_int n, double* a, lapack_int lda, double* s,
-                           double* u, lapack_int ldu, double* vt,
-                           lapack_int ldvt );
-lapack_int LAPACKE_cgesdd( int matrix_order, char jobz, lapack_int m,
-                           lapack_int n, lapack_complex_float* a,
-                           lapack_int lda, float* s, lapack_complex_float* u,
-                           lapack_int ldu, lapack_complex_float* vt,
-                           lapack_int ldvt );
-lapack_int LAPACKE_zgesdd( int matrix_order, char jobz, lapack_int m,
-                           lapack_int n, lapack_complex_double* a,
-                           lapack_int lda, double* s, lapack_complex_double* u,
-                           lapack_int ldu, lapack_complex_double* vt,
-                           lapack_int ldvt );
+lapack_int LAPACKE_sgesdd(int matrix_order, char jobz, lapack_int m, lapack_int n, float* a, lapack_int lda, float* s,
+                          float* u, lapack_int ldu, float* vt, lapack_int ldvt);
+lapack_int LAPACKE_dgesdd(int matrix_order, char jobz, lapack_int m, lapack_int n, double* a, lapack_int lda, double* s,
+                          double* u, lapack_int ldu, double* vt, lapack_int ldvt);
+lapack_int LAPACKE_cgesdd(int matrix_order, char jobz, lapack_int m, lapack_int n, lapack_complex_float* a,
+                          lapack_int lda, float* s, lapack_complex_float* u, lapack_int ldu, lapack_complex_float* vt,
+                          lapack_int ldvt);
+lapack_int LAPACKE_zgesdd(int matrix_order, char jobz, lapack_int m, lapack_int n, lapack_complex_double* a,
+                          lapack_int lda, double* s, lapack_complex_double* u, lapack_int ldu,
+                          lapack_complex_double* vt, lapack_int ldvt);
 
-lapack_int LAPACKE_sgesv( int matrix_order, lapack_int n, lapack_int nrhs,
-                          float* a, lapack_int lda, lapack_int* ipiv, float* b,
-                          lapack_int ldb );
-lapack_int LAPACKE_dgesv( int matrix_order, lapack_int n, lapack_int nrhs,
-                          double* a, lapack_int lda, lapack_int* ipiv,
-                          double* b, lapack_int ldb );
-lapack_int LAPACKE_cgesv( int matrix_order, lapack_int n, lapack_int nrhs,
-                          lapack_complex_float* a, lapack_int lda,
-                          lapack_int* ipiv, lapack_complex_float* b,
-                          lapack_int ldb );
-lapack_int LAPACKE_zgesv( int matrix_order, lapack_int n, lapack_int nrhs,
-                          lapack_complex_double* a, lapack_int lda,
-                          lapack_int* ipiv, lapack_complex_double* b,
-                          lapack_int ldb );
-lapack_int LAPACKE_dsgesv( int matrix_order, lapack_int n, lapack_int nrhs,
-                           double* a, lapack_int lda, lapack_int* ipiv,
-                           double* b, lapack_int ldb, double* x, lapack_int ldx,
-                           lapack_int* iter );
-lapack_int LAPACKE_zcgesv( int matrix_order, lapack_int n, lapack_int nrhs,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_int* ipiv, lapack_complex_double* b,
-                           lapack_int ldb, lapack_complex_double* x,
-                           lapack_int ldx, lapack_int* iter );
+lapack_int LAPACKE_sgesv(int matrix_order, lapack_int n, lapack_int nrhs, float* a, lapack_int lda, lapack_int* ipiv,
+                         float* b, lapack_int ldb);
+lapack_int LAPACKE_dgesv(int matrix_order, lapack_int n, lapack_int nrhs, double* a, lapack_int lda, lapack_int* ipiv,
+                         double* b, lapack_int ldb);
+lapack_int LAPACKE_cgesv(int matrix_order, lapack_int n, lapack_int nrhs, lapack_complex_float* a, lapack_int lda,
+                         lapack_int* ipiv, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zgesv(int matrix_order, lapack_int n, lapack_int nrhs, lapack_complex_double* a, lapack_int lda,
+                         lapack_int* ipiv, lapack_complex_double* b, lapack_int ldb);
+lapack_int LAPACKE_dsgesv(int matrix_order, lapack_int n, lapack_int nrhs, double* a, lapack_int lda, lapack_int* ipiv,
+                          double* b, lapack_int ldb, double* x, lapack_int ldx, lapack_int* iter);
+lapack_int LAPACKE_zcgesv(int matrix_order, lapack_int n, lapack_int nrhs, lapack_complex_double* a, lapack_int lda,
+                          lapack_int* ipiv, lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x,
+                          lapack_int ldx, lapack_int* iter);
 
-lapack_int LAPACKE_sgesvd( int matrix_order, char jobu, char jobvt,
-                           lapack_int m, lapack_int n, float* a, lapack_int lda,
-                           float* s, float* u, lapack_int ldu, float* vt,
-                           lapack_int ldvt, float* superb );
-lapack_int LAPACKE_dgesvd( int matrix_order, char jobu, char jobvt,
-                           lapack_int m, lapack_int n, double* a,
-                           lapack_int lda, double* s, double* u, lapack_int ldu,
-                           double* vt, lapack_int ldvt, double* superb );
-lapack_int LAPACKE_cgesvd( int matrix_order, char jobu, char jobvt,
-                           lapack_int m, lapack_int n, lapack_complex_float* a,
-                           lapack_int lda, float* s, lapack_complex_float* u,
-                           lapack_int ldu, lapack_complex_float* vt,
-                           lapack_int ldvt, float* superb );
-lapack_int LAPACKE_zgesvd( int matrix_order, char jobu, char jobvt,
-                           lapack_int m, lapack_int n, lapack_complex_double* a,
-                           lapack_int lda, double* s, lapack_complex_double* u,
-                           lapack_int ldu, lapack_complex_double* vt,
-                           lapack_int ldvt, double* superb );
+lapack_int LAPACKE_sgesvd(int matrix_order, char jobu, char jobvt, lapack_int m, lapack_int n, float* a, lapack_int lda,
+                          float* s, float* u, lapack_int ldu, float* vt, lapack_int ldvt, float* superb);
+lapack_int LAPACKE_dgesvd(int matrix_order, char jobu, char jobvt, lapack_int m, lapack_int n, double* a,
+                          lapack_int lda, double* s, double* u, lapack_int ldu, double* vt, lapack_int ldvt,
+                          double* superb);
+lapack_int LAPACKE_cgesvd(int matrix_order, char jobu, char jobvt, lapack_int m, lapack_int n, lapack_complex_float* a,
+                          lapack_int lda, float* s, lapack_complex_float* u, lapack_int ldu, lapack_complex_float* vt,
+                          lapack_int ldvt, float* superb);
+lapack_int LAPACKE_zgesvd(int matrix_order, char jobu, char jobvt, lapack_int m, lapack_int n, lapack_complex_double* a,
+                          lapack_int lda, double* s, lapack_complex_double* u, lapack_int ldu,
+                          lapack_complex_double* vt, lapack_int ldvt, double* superb);
 
-lapack_int LAPACKE_sgesvj( int matrix_order, char joba, char jobu, char jobv,
-                           lapack_int m, lapack_int n, float* a, lapack_int lda,
-                           float* sva, lapack_int mv, float* v, lapack_int ldv,
-                           float* stat );
-lapack_int LAPACKE_dgesvj( int matrix_order, char joba, char jobu, char jobv,
-                           lapack_int m, lapack_int n, double* a,
-                           lapack_int lda, double* sva, lapack_int mv,
-                           double* v, lapack_int ldv, double* stat );
+lapack_int LAPACKE_sgesvj(int matrix_order, char joba, char jobu, char jobv, lapack_int m, lapack_int n, float* a,
+                          lapack_int lda, float* sva, lapack_int mv, float* v, lapack_int ldv, float* stat);
+lapack_int LAPACKE_dgesvj(int matrix_order, char joba, char jobu, char jobv, lapack_int m, lapack_int n, double* a,
+                          lapack_int lda, double* sva, lapack_int mv, double* v, lapack_int ldv, double* stat);
 
-lapack_int LAPACKE_sgesvx( int matrix_order, char fact, char trans,
-                           lapack_int n, lapack_int nrhs, float* a,
-                           lapack_int lda, float* af, lapack_int ldaf,
-                           lapack_int* ipiv, char* equed, float* r, float* c,
-                           float* b, lapack_int ldb, float* x, lapack_int ldx,
-                           float* rcond, float* ferr, float* berr,
-                           float* rpivot );
-lapack_int LAPACKE_dgesvx( int matrix_order, char fact, char trans,
-                           lapack_int n, lapack_int nrhs, double* a,
-                           lapack_int lda, double* af, lapack_int ldaf,
-                           lapack_int* ipiv, char* equed, double* r, double* c,
-                           double* b, lapack_int ldb, double* x, lapack_int ldx,
-                           double* rcond, double* ferr, double* berr,
-                           double* rpivot );
-lapack_int LAPACKE_cgesvx( int matrix_order, char fact, char trans,
-                           lapack_int n, lapack_int nrhs,
-                           lapack_complex_float* a, lapack_int lda,
-                           lapack_complex_float* af, lapack_int ldaf,
-                           lapack_int* ipiv, char* equed, float* r, float* c,
-                           lapack_complex_float* b, lapack_int ldb,
-                           lapack_complex_float* x, lapack_int ldx,
-                           float* rcond, float* ferr, float* berr,
-                           float* rpivot );
-lapack_int LAPACKE_zgesvx( int matrix_order, char fact, char trans,
-                           lapack_int n, lapack_int nrhs,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_complex_double* af, lapack_int ldaf,
-                           lapack_int* ipiv, char* equed, double* r, double* c,
-                           lapack_complex_double* b, lapack_int ldb,
-                           lapack_complex_double* x, lapack_int ldx,
-                           double* rcond, double* ferr, double* berr,
-                           double* rpivot );
+lapack_int LAPACKE_sgesvx(int matrix_order, char fact, char trans, lapack_int n, lapack_int nrhs, float* a,
+                          lapack_int lda, float* af, lapack_int ldaf, lapack_int* ipiv, char* equed, float* r, float* c,
+                          float* b, lapack_int ldb, float* x, lapack_int ldx, float* rcond, float* ferr, float* berr,
+                          float* rpivot);
+lapack_int LAPACKE_dgesvx(int matrix_order, char fact, char trans, lapack_int n, lapack_int nrhs, double* a,
+                          lapack_int lda, double* af, lapack_int ldaf, lapack_int* ipiv, char* equed, double* r,
+                          double* c, double* b, lapack_int ldb, double* x, lapack_int ldx, double* rcond, double* ferr,
+                          double* berr, double* rpivot);
+lapack_int LAPACKE_cgesvx(int matrix_order, char fact, char trans, lapack_int n, lapack_int nrhs,
+                          lapack_complex_float* a, lapack_int lda, lapack_complex_float* af, lapack_int ldaf,
+                          lapack_int* ipiv, char* equed, float* r, float* c, lapack_complex_float* b, lapack_int ldb,
+                          lapack_complex_float* x, lapack_int ldx, float* rcond, float* ferr, float* berr,
+                          float* rpivot);
+lapack_int LAPACKE_zgesvx(int matrix_order, char fact, char trans, lapack_int n, lapack_int nrhs,
+                          lapack_complex_double* a, lapack_int lda, lapack_complex_double* af, lapack_int ldaf,
+                          lapack_int* ipiv, char* equed, double* r, double* c, lapack_complex_double* b, lapack_int ldb,
+                          lapack_complex_double* x, lapack_int ldx, double* rcond, double* ferr, double* berr,
+                          double* rpivot);
 
-lapack_int LAPACKE_sgesvxx( int matrix_order, char fact, char trans,
-                            lapack_int n, lapack_int nrhs, float* a,
-                            lapack_int lda, float* af, lapack_int ldaf,
-                            lapack_int* ipiv, char* equed, float* r, float* c,
-                            float* b, lapack_int ldb, float* x, lapack_int ldx,
-                            float* rcond, float* rpvgrw, float* berr,
-                            lapack_int n_err_bnds, float* err_bnds_norm,
-                            float* err_bnds_comp, lapack_int nparams,
-                            float* params );
-lapack_int LAPACKE_dgesvxx( int matrix_order, char fact, char trans,
-                            lapack_int n, lapack_int nrhs, double* a,
-                            lapack_int lda, double* af, lapack_int ldaf,
-                            lapack_int* ipiv, char* equed, double* r, double* c,
-                            double* b, lapack_int ldb, double* x,
-                            lapack_int ldx, double* rcond, double* rpvgrw,
-                            double* berr, lapack_int n_err_bnds,
-                            double* err_bnds_norm, double* err_bnds_comp,
-                            lapack_int nparams, double* params );
-lapack_int LAPACKE_cgesvxx( int matrix_order, char fact, char trans,
-                            lapack_int n, lapack_int nrhs,
-                            lapack_complex_float* a, lapack_int lda,
-                            lapack_complex_float* af, lapack_int ldaf,
-                            lapack_int* ipiv, char* equed, float* r, float* c,
-                            lapack_complex_float* b, lapack_int ldb,
-                            lapack_complex_float* x, lapack_int ldx,
-                            float* rcond, float* rpvgrw, float* berr,
-                            lapack_int n_err_bnds, float* err_bnds_norm,
-                            float* err_bnds_comp, lapack_int nparams,
-                            float* params );
-lapack_int LAPACKE_zgesvxx( int matrix_order, char fact, char trans,
-                            lapack_int n, lapack_int nrhs,
-                            lapack_complex_double* a, lapack_int lda,
-                            lapack_complex_double* af, lapack_int ldaf,
-                            lapack_int* ipiv, char* equed, double* r, double* c,
-                            lapack_complex_double* b, lapack_int ldb,
-                            lapack_complex_double* x, lapack_int ldx,
-                            double* rcond, double* rpvgrw, double* berr,
-                            lapack_int n_err_bnds, double* err_bnds_norm,
-                            double* err_bnds_comp, lapack_int nparams,
-                            double* params );
+lapack_int LAPACKE_sgesvxx(int matrix_order, char fact, char trans, lapack_int n, lapack_int nrhs, float* a,
+                           lapack_int lda, float* af, lapack_int ldaf, lapack_int* ipiv, char* equed, float* r,
+                           float* c, float* b, lapack_int ldb, float* x, lapack_int ldx, float* rcond, float* rpvgrw,
+                           float* berr, lapack_int n_err_bnds, float* err_bnds_norm, float* err_bnds_comp,
+                           lapack_int nparams, float* params);
+lapack_int LAPACKE_dgesvxx(int matrix_order, char fact, char trans, lapack_int n, lapack_int nrhs, double* a,
+                           lapack_int lda, double* af, lapack_int ldaf, lapack_int* ipiv, char* equed, double* r,
+                           double* c, double* b, lapack_int ldb, double* x, lapack_int ldx, double* rcond,
+                           double* rpvgrw, double* berr, lapack_int n_err_bnds, double* err_bnds_norm,
+                           double* err_bnds_comp, lapack_int nparams, double* params);
+lapack_int LAPACKE_cgesvxx(int matrix_order, char fact, char trans, lapack_int n, lapack_int nrhs,
+                           lapack_complex_float* a, lapack_int lda, lapack_complex_float* af, lapack_int ldaf,
+                           lapack_int* ipiv, char* equed, float* r, float* c, lapack_complex_float* b, lapack_int ldb,
+                           lapack_complex_float* x, lapack_int ldx, float* rcond, float* rpvgrw, float* berr,
+                           lapack_int n_err_bnds, float* err_bnds_norm, float* err_bnds_comp, lapack_int nparams,
+                           float* params);
+lapack_int LAPACKE_zgesvxx(int matrix_order, char fact, char trans, lapack_int n, lapack_int nrhs,
+                           lapack_complex_double* a, lapack_int lda, lapack_complex_double* af, lapack_int ldaf,
+                           lapack_int* ipiv, char* equed, double* r, double* c, lapack_complex_double* b,
+                           lapack_int ldb, lapack_complex_double* x, lapack_int ldx, double* rcond, double* rpvgrw,
+                           double* berr, lapack_int n_err_bnds, double* err_bnds_norm, double* err_bnds_comp,
+                           lapack_int nparams, double* params);
 
-lapack_int LAPACKE_sgetf2( int matrix_order, lapack_int m, lapack_int n,
-                           float* a, lapack_int lda, lapack_int* ipiv );
-lapack_int LAPACKE_dgetf2( int matrix_order, lapack_int m, lapack_int n,
-                           double* a, lapack_int lda, lapack_int* ipiv );
-lapack_int LAPACKE_cgetf2( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda,
-                           lapack_int* ipiv );
-lapack_int LAPACKE_zgetf2( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_int* ipiv );
+lapack_int LAPACKE_sgetf2(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, lapack_int* ipiv);
+lapack_int LAPACKE_dgetf2(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda, lapack_int* ipiv);
+lapack_int LAPACKE_cgetf2(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                          lapack_int* ipiv);
+lapack_int LAPACKE_zgetf2(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                          lapack_int* ipiv);
 
-lapack_int LAPACKE_sgetrf( int matrix_order, lapack_int m, lapack_int n,
-                           float* a, lapack_int lda, lapack_int* ipiv );
-lapack_int LAPACKE_dgetrf( int matrix_order, lapack_int m, lapack_int n,
-                           double* a, lapack_int lda, lapack_int* ipiv );
-lapack_int LAPACKE_cgetrf( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda,
-                           lapack_int* ipiv );
-lapack_int LAPACKE_zgetrf( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_int* ipiv );
+lapack_int LAPACKE_sgetrf(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, lapack_int* ipiv);
+lapack_int LAPACKE_dgetrf(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda, lapack_int* ipiv);
+lapack_int LAPACKE_cgetrf(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                          lapack_int* ipiv);
+lapack_int LAPACKE_zgetrf(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                          lapack_int* ipiv);
 
-lapack_int LAPACKE_sgetri( int matrix_order, lapack_int n, float* a,
-                           lapack_int lda, const lapack_int* ipiv );
-lapack_int LAPACKE_dgetri( int matrix_order, lapack_int n, double* a,
-                           lapack_int lda, const lapack_int* ipiv );
-lapack_int LAPACKE_cgetri( int matrix_order, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda,
-                           const lapack_int* ipiv );
-lapack_int LAPACKE_zgetri( int matrix_order, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda,
-                           const lapack_int* ipiv );
+lapack_int LAPACKE_sgetri(int matrix_order, lapack_int n, float* a, lapack_int lda, const lapack_int* ipiv);
+lapack_int LAPACKE_dgetri(int matrix_order, lapack_int n, double* a, lapack_int lda, const lapack_int* ipiv);
+lapack_int LAPACKE_cgetri(int matrix_order, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                          const lapack_int* ipiv);
+lapack_int LAPACKE_zgetri(int matrix_order, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                          const lapack_int* ipiv);
 
-lapack_int LAPACKE_sgetrs( int matrix_order, char trans, lapack_int n,
-                           lapack_int nrhs, const float* a, lapack_int lda,
-                           const lapack_int* ipiv, float* b, lapack_int ldb );
-lapack_int LAPACKE_dgetrs( int matrix_order, char trans, lapack_int n,
-                           lapack_int nrhs, const double* a, lapack_int lda,
-                           const lapack_int* ipiv, double* b, lapack_int ldb );
-lapack_int LAPACKE_cgetrs( int matrix_order, char trans, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_float* a,
-                           lapack_int lda, const lapack_int* ipiv,
-                           lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_zgetrs( int matrix_order, char trans, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_double* a,
-                           lapack_int lda, const lapack_int* ipiv,
-                           lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_sgetrs(int matrix_order, char trans, lapack_int n, lapack_int nrhs, const float* a, lapack_int lda,
+                          const lapack_int* ipiv, float* b, lapack_int ldb);
+lapack_int LAPACKE_dgetrs(int matrix_order, char trans, lapack_int n, lapack_int nrhs, const double* a, lapack_int lda,
+                          const lapack_int* ipiv, double* b, lapack_int ldb);
+lapack_int LAPACKE_cgetrs(int matrix_order, char trans, lapack_int n, lapack_int nrhs, const lapack_complex_float* a,
+                          lapack_int lda, const lapack_int* ipiv, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zgetrs(int matrix_order, char trans, lapack_int n, lapack_int nrhs, const lapack_complex_double* a,
+                          lapack_int lda, const lapack_int* ipiv, lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_sggbak( int matrix_order, char job, char side, lapack_int n,
-                           lapack_int ilo, lapack_int ihi, const float* lscale,
-                           const float* rscale, lapack_int m, float* v,
-                           lapack_int ldv );
-lapack_int LAPACKE_dggbak( int matrix_order, char job, char side, lapack_int n,
-                           lapack_int ilo, lapack_int ihi, const double* lscale,
-                           const double* rscale, lapack_int m, double* v,
-                           lapack_int ldv );
-lapack_int LAPACKE_cggbak( int matrix_order, char job, char side, lapack_int n,
-                           lapack_int ilo, lapack_int ihi, const float* lscale,
-                           const float* rscale, lapack_int m,
-                           lapack_complex_float* v, lapack_int ldv );
-lapack_int LAPACKE_zggbak( int matrix_order, char job, char side, lapack_int n,
-                           lapack_int ilo, lapack_int ihi, const double* lscale,
-                           const double* rscale, lapack_int m,
-                           lapack_complex_double* v, lapack_int ldv );
+lapack_int LAPACKE_sggbak(int matrix_order, char job, char side, lapack_int n, lapack_int ilo, lapack_int ihi,
+                          const float* lscale, const float* rscale, lapack_int m, float* v, lapack_int ldv);
+lapack_int LAPACKE_dggbak(int matrix_order, char job, char side, lapack_int n, lapack_int ilo, lapack_int ihi,
+                          const double* lscale, const double* rscale, lapack_int m, double* v, lapack_int ldv);
+lapack_int LAPACKE_cggbak(int matrix_order, char job, char side, lapack_int n, lapack_int ilo, lapack_int ihi,
+                          const float* lscale, const float* rscale, lapack_int m, lapack_complex_float* v,
+                          lapack_int ldv);
+lapack_int LAPACKE_zggbak(int matrix_order, char job, char side, lapack_int n, lapack_int ilo, lapack_int ihi,
+                          const double* lscale, const double* rscale, lapack_int m, lapack_complex_double* v,
+                          lapack_int ldv);
 
-lapack_int LAPACKE_sggbal( int matrix_order, char job, lapack_int n, float* a,
-                           lapack_int lda, float* b, lapack_int ldb,
-                           lapack_int* ilo, lapack_int* ihi, float* lscale,
-                           float* rscale );
-lapack_int LAPACKE_dggbal( int matrix_order, char job, lapack_int n, double* a,
-                           lapack_int lda, double* b, lapack_int ldb,
-                           lapack_int* ilo, lapack_int* ihi, double* lscale,
-                           double* rscale );
-lapack_int LAPACKE_cggbal( int matrix_order, char job, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda,
-                           lapack_complex_float* b, lapack_int ldb,
-                           lapack_int* ilo, lapack_int* ihi, float* lscale,
-                           float* rscale );
-lapack_int LAPACKE_zggbal( int matrix_order, char job, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_complex_double* b, lapack_int ldb,
-                           lapack_int* ilo, lapack_int* ihi, double* lscale,
-                           double* rscale );
+lapack_int LAPACKE_sggbal(int matrix_order, char job, lapack_int n, float* a, lapack_int lda, float* b, lapack_int ldb,
+                          lapack_int* ilo, lapack_int* ihi, float* lscale, float* rscale);
+lapack_int LAPACKE_dggbal(int matrix_order, char job, lapack_int n, double* a, lapack_int lda, double* b,
+                          lapack_int ldb, lapack_int* ilo, lapack_int* ihi, double* lscale, double* rscale);
+lapack_int LAPACKE_cggbal(int matrix_order, char job, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                          lapack_complex_float* b, lapack_int ldb, lapack_int* ilo, lapack_int* ihi, float* lscale,
+                          float* rscale);
+lapack_int LAPACKE_zggbal(int matrix_order, char job, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                          lapack_complex_double* b, lapack_int ldb, lapack_int* ilo, lapack_int* ihi, double* lscale,
+                          double* rscale);
 
-lapack_int LAPACKE_sgges( int matrix_order, char jobvsl, char jobvsr, char sort,
-                          LAPACK_S_SELECT3 selctg, lapack_int n, float* a,
-                          lapack_int lda, float* b, lapack_int ldb,
-                          lapack_int* sdim, float* alphar, float* alphai,
-                          float* beta, float* vsl, lapack_int ldvsl, float* vsr,
-                          lapack_int ldvsr );
-lapack_int LAPACKE_dgges( int matrix_order, char jobvsl, char jobvsr, char sort,
-                          LAPACK_D_SELECT3 selctg, lapack_int n, double* a,
-                          lapack_int lda, double* b, lapack_int ldb,
-                          lapack_int* sdim, double* alphar, double* alphai,
-                          double* beta, double* vsl, lapack_int ldvsl,
-                          double* vsr, lapack_int ldvsr );
-lapack_int LAPACKE_cgges( int matrix_order, char jobvsl, char jobvsr, char sort,
-                          LAPACK_C_SELECT2 selctg, lapack_int n,
-                          lapack_complex_float* a, lapack_int lda,
-                          lapack_complex_float* b, lapack_int ldb,
-                          lapack_int* sdim, lapack_complex_float* alpha,
-                          lapack_complex_float* beta, lapack_complex_float* vsl,
-                          lapack_int ldvsl, lapack_complex_float* vsr,
-                          lapack_int ldvsr );
-lapack_int LAPACKE_zgges( int matrix_order, char jobvsl, char jobvsr, char sort,
-                          LAPACK_Z_SELECT2 selctg, lapack_int n,
-                          lapack_complex_double* a, lapack_int lda,
-                          lapack_complex_double* b, lapack_int ldb,
-                          lapack_int* sdim, lapack_complex_double* alpha,
-                          lapack_complex_double* beta,
-                          lapack_complex_double* vsl, lapack_int ldvsl,
-                          lapack_complex_double* vsr, lapack_int ldvsr );
+lapack_int LAPACKE_sgges(int matrix_order, char jobvsl, char jobvsr, char sort, LAPACK_S_SELECT3 selctg, lapack_int n,
+                         float* a, lapack_int lda, float* b, lapack_int ldb, lapack_int* sdim, float* alphar,
+                         float* alphai, float* beta, float* vsl, lapack_int ldvsl, float* vsr, lapack_int ldvsr);
+lapack_int LAPACKE_dgges(int matrix_order, char jobvsl, char jobvsr, char sort, LAPACK_D_SELECT3 selctg, lapack_int n,
+                         double* a, lapack_int lda, double* b, lapack_int ldb, lapack_int* sdim, double* alphar,
+                         double* alphai, double* beta, double* vsl, lapack_int ldvsl, double* vsr, lapack_int ldvsr);
+lapack_int LAPACKE_cgges(int matrix_order, char jobvsl, char jobvsr, char sort, LAPACK_C_SELECT2 selctg, lapack_int n,
+                         lapack_complex_float* a, lapack_int lda, lapack_complex_float* b, lapack_int ldb,
+                         lapack_int* sdim, lapack_complex_float* alpha, lapack_complex_float* beta,
+                         lapack_complex_float* vsl, lapack_int ldvsl, lapack_complex_float* vsr, lapack_int ldvsr);
+lapack_int LAPACKE_zgges(int matrix_order, char jobvsl, char jobvsr, char sort, LAPACK_Z_SELECT2 selctg, lapack_int n,
+                         lapack_complex_double* a, lapack_int lda, lapack_complex_double* b, lapack_int ldb,
+                         lapack_int* sdim, lapack_complex_double* alpha, lapack_complex_double* beta,
+                         lapack_complex_double* vsl, lapack_int ldvsl, lapack_complex_double* vsr, lapack_int ldvsr);
 
-lapack_int LAPACKE_sggesx( int matrix_order, char jobvsl, char jobvsr,
-                           char sort, LAPACK_S_SELECT3 selctg, char sense,
-                           lapack_int n, float* a, lapack_int lda, float* b,
-                           lapack_int ldb, lapack_int* sdim, float* alphar,
-                           float* alphai, float* beta, float* vsl,
-                           lapack_int ldvsl, float* vsr, lapack_int ldvsr,
-                           float* rconde, float* rcondv );
-lapack_int LAPACKE_dggesx( int matrix_order, char jobvsl, char jobvsr,
-                           char sort, LAPACK_D_SELECT3 selctg, char sense,
-                           lapack_int n, double* a, lapack_int lda, double* b,
-                           lapack_int ldb, lapack_int* sdim, double* alphar,
-                           double* alphai, double* beta, double* vsl,
-                           lapack_int ldvsl, double* vsr, lapack_int ldvsr,
-                           double* rconde, double* rcondv );
-lapack_int LAPACKE_cggesx( int matrix_order, char jobvsl, char jobvsr,
-                           char sort, LAPACK_C_SELECT2 selctg, char sense,
-                           lapack_int n, lapack_complex_float* a,
-                           lapack_int lda, lapack_complex_float* b,
-                           lapack_int ldb, lapack_int* sdim,
-                           lapack_complex_float* alpha,
-                           lapack_complex_float* beta,
-                           lapack_complex_float* vsl, lapack_int ldvsl,
-                           lapack_complex_float* vsr, lapack_int ldvsr,
-                           float* rconde, float* rcondv );
-lapack_int LAPACKE_zggesx( int matrix_order, char jobvsl, char jobvsr,
-                           char sort, LAPACK_Z_SELECT2 selctg, char sense,
-                           lapack_int n, lapack_complex_double* a,
-                           lapack_int lda, lapack_complex_double* b,
-                           lapack_int ldb, lapack_int* sdim,
-                           lapack_complex_double* alpha,
-                           lapack_complex_double* beta,
-                           lapack_complex_double* vsl, lapack_int ldvsl,
-                           lapack_complex_double* vsr, lapack_int ldvsr,
-                           double* rconde, double* rcondv );
+lapack_int LAPACKE_sggesx(int matrix_order, char jobvsl, char jobvsr, char sort, LAPACK_S_SELECT3 selctg, char sense,
+                          lapack_int n, float* a, lapack_int lda, float* b, lapack_int ldb, lapack_int* sdim,
+                          float* alphar, float* alphai, float* beta, float* vsl, lapack_int ldvsl, float* vsr,
+                          lapack_int ldvsr, float* rconde, float* rcondv);
+lapack_int LAPACKE_dggesx(int matrix_order, char jobvsl, char jobvsr, char sort, LAPACK_D_SELECT3 selctg, char sense,
+                          lapack_int n, double* a, lapack_int lda, double* b, lapack_int ldb, lapack_int* sdim,
+                          double* alphar, double* alphai, double* beta, double* vsl, lapack_int ldvsl, double* vsr,
+                          lapack_int ldvsr, double* rconde, double* rcondv);
+lapack_int LAPACKE_cggesx(int matrix_order, char jobvsl, char jobvsr, char sort, LAPACK_C_SELECT2 selctg, char sense,
+                          lapack_int n, lapack_complex_float* a, lapack_int lda, lapack_complex_float* b,
+                          lapack_int ldb, lapack_int* sdim, lapack_complex_float* alpha, lapack_complex_float* beta,
+                          lapack_complex_float* vsl, lapack_int ldvsl, lapack_complex_float* vsr, lapack_int ldvsr,
+                          float* rconde, float* rcondv);
+lapack_int LAPACKE_zggesx(int matrix_order, char jobvsl, char jobvsr, char sort, LAPACK_Z_SELECT2 selctg, char sense,
+                          lapack_int n, lapack_complex_double* a, lapack_int lda, lapack_complex_double* b,
+                          lapack_int ldb, lapack_int* sdim, lapack_complex_double* alpha, lapack_complex_double* beta,
+                          lapack_complex_double* vsl, lapack_int ldvsl, lapack_complex_double* vsr, lapack_int ldvsr,
+                          double* rconde, double* rcondv);
 
-lapack_int LAPACKE_sggev( int matrix_order, char jobvl, char jobvr,
-                          lapack_int n, float* a, lapack_int lda, float* b,
-                          lapack_int ldb, float* alphar, float* alphai,
-                          float* beta, float* vl, lapack_int ldvl, float* vr,
-                          lapack_int ldvr );
-lapack_int LAPACKE_dggev( int matrix_order, char jobvl, char jobvr,
-                          lapack_int n, double* a, lapack_int lda, double* b,
-                          lapack_int ldb, double* alphar, double* alphai,
-                          double* beta, double* vl, lapack_int ldvl, double* vr,
-                          lapack_int ldvr );
-lapack_int LAPACKE_cggev( int matrix_order, char jobvl, char jobvr,
-                          lapack_int n, lapack_complex_float* a, lapack_int lda,
-                          lapack_complex_float* b, lapack_int ldb,
-                          lapack_complex_float* alpha,
-                          lapack_complex_float* beta, lapack_complex_float* vl,
-                          lapack_int ldvl, lapack_complex_float* vr,
-                          lapack_int ldvr );
-lapack_int LAPACKE_zggev( int matrix_order, char jobvl, char jobvr,
-                          lapack_int n, lapack_complex_double* a,
-                          lapack_int lda, lapack_complex_double* b,
-                          lapack_int ldb, lapack_complex_double* alpha,
-                          lapack_complex_double* beta,
-                          lapack_complex_double* vl, lapack_int ldvl,
-                          lapack_complex_double* vr, lapack_int ldvr );
+lapack_int LAPACKE_sggev(int matrix_order, char jobvl, char jobvr, lapack_int n, float* a, lapack_int lda, float* b,
+                         lapack_int ldb, float* alphar, float* alphai, float* beta, float* vl, lapack_int ldvl,
+                         float* vr, lapack_int ldvr);
+lapack_int LAPACKE_dggev(int matrix_order, char jobvl, char jobvr, lapack_int n, double* a, lapack_int lda, double* b,
+                         lapack_int ldb, double* alphar, double* alphai, double* beta, double* vl, lapack_int ldvl,
+                         double* vr, lapack_int ldvr);
+lapack_int LAPACKE_cggev(int matrix_order, char jobvl, char jobvr, lapack_int n, lapack_complex_float* a,
+                         lapack_int lda, lapack_complex_float* b, lapack_int ldb, lapack_complex_float* alpha,
+                         lapack_complex_float* beta, lapack_complex_float* vl, lapack_int ldvl,
+                         lapack_complex_float* vr, lapack_int ldvr);
+lapack_int LAPACKE_zggev(int matrix_order, char jobvl, char jobvr, lapack_int n, lapack_complex_double* a,
+                         lapack_int lda, lapack_complex_double* b, lapack_int ldb, lapack_complex_double* alpha,
+                         lapack_complex_double* beta, lapack_complex_double* vl, lapack_int ldvl,
+                         lapack_complex_double* vr, lapack_int ldvr);
 
-lapack_int LAPACKE_sggevx( int matrix_order, char balanc, char jobvl,
-                           char jobvr, char sense, lapack_int n, float* a,
-                           lapack_int lda, float* b, lapack_int ldb,
-                           float* alphar, float* alphai, float* beta, float* vl,
-                           lapack_int ldvl, float* vr, lapack_int ldvr,
-                           lapack_int* ilo, lapack_int* ihi, float* lscale,
-                           float* rscale, float* abnrm, float* bbnrm,
-                           float* rconde, float* rcondv );
-lapack_int LAPACKE_dggevx( int matrix_order, char balanc, char jobvl,
-                           char jobvr, char sense, lapack_int n, double* a,
-                           lapack_int lda, double* b, lapack_int ldb,
-                           double* alphar, double* alphai, double* beta,
-                           double* vl, lapack_int ldvl, double* vr,
-                           lapack_int ldvr, lapack_int* ilo, lapack_int* ihi,
-                           double* lscale, double* rscale, double* abnrm,
-                           double* bbnrm, double* rconde, double* rcondv );
-lapack_int LAPACKE_cggevx( int matrix_order, char balanc, char jobvl,
-                           char jobvr, char sense, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda,
-                           lapack_complex_float* b, lapack_int ldb,
-                           lapack_complex_float* alpha,
-                           lapack_complex_float* beta, lapack_complex_float* vl,
-                           lapack_int ldvl, lapack_complex_float* vr,
-                           lapack_int ldvr, lapack_int* ilo, lapack_int* ihi,
-                           float* lscale, float* rscale, float* abnrm,
-                           float* bbnrm, float* rconde, float* rcondv );
-lapack_int LAPACKE_zggevx( int matrix_order, char balanc, char jobvl,
-                           char jobvr, char sense, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_complex_double* b, lapack_int ldb,
-                           lapack_complex_double* alpha,
-                           lapack_complex_double* beta,
-                           lapack_complex_double* vl, lapack_int ldvl,
-                           lapack_complex_double* vr, lapack_int ldvr,
-                           lapack_int* ilo, lapack_int* ihi, double* lscale,
-                           double* rscale, double* abnrm, double* bbnrm,
-                           double* rconde, double* rcondv );
+lapack_int LAPACKE_sggevx(int matrix_order, char balanc, char jobvl, char jobvr, char sense, lapack_int n, float* a,
+                          lapack_int lda, float* b, lapack_int ldb, float* alphar, float* alphai, float* beta,
+                          float* vl, lapack_int ldvl, float* vr, lapack_int ldvr, lapack_int* ilo, lapack_int* ihi,
+                          float* lscale, float* rscale, float* abnrm, float* bbnrm, float* rconde, float* rcondv);
+lapack_int LAPACKE_dggevx(int matrix_order, char balanc, char jobvl, char jobvr, char sense, lapack_int n, double* a,
+                          lapack_int lda, double* b, lapack_int ldb, double* alphar, double* alphai, double* beta,
+                          double* vl, lapack_int ldvl, double* vr, lapack_int ldvr, lapack_int* ilo, lapack_int* ihi,
+                          double* lscale, double* rscale, double* abnrm, double* bbnrm, double* rconde, double* rcondv);
+lapack_int LAPACKE_cggevx(int matrix_order, char balanc, char jobvl, char jobvr, char sense, lapack_int n,
+                          lapack_complex_float* a, lapack_int lda, lapack_complex_float* b, lapack_int ldb,
+                          lapack_complex_float* alpha, lapack_complex_float* beta, lapack_complex_float* vl,
+                          lapack_int ldvl, lapack_complex_float* vr, lapack_int ldvr, lapack_int* ilo, lapack_int* ihi,
+                          float* lscale, float* rscale, float* abnrm, float* bbnrm, float* rconde, float* rcondv);
+lapack_int LAPACKE_zggevx(int matrix_order, char balanc, char jobvl, char jobvr, char sense, lapack_int n,
+                          lapack_complex_double* a, lapack_int lda, lapack_complex_double* b, lapack_int ldb,
+                          lapack_complex_double* alpha, lapack_complex_double* beta, lapack_complex_double* vl,
+                          lapack_int ldvl, lapack_complex_double* vr, lapack_int ldvr, lapack_int* ilo, lapack_int* ihi,
+                          double* lscale, double* rscale, double* abnrm, double* bbnrm, double* rconde, double* rcondv);
 
-lapack_int LAPACKE_sggglm( int matrix_order, lapack_int n, lapack_int m,
-                           lapack_int p, float* a, lapack_int lda, float* b,
-                           lapack_int ldb, float* d, float* x, float* y );
-lapack_int LAPACKE_dggglm( int matrix_order, lapack_int n, lapack_int m,
-                           lapack_int p, double* a, lapack_int lda, double* b,
-                           lapack_int ldb, double* d, double* x, double* y );
-lapack_int LAPACKE_cggglm( int matrix_order, lapack_int n, lapack_int m,
-                           lapack_int p, lapack_complex_float* a,
-                           lapack_int lda, lapack_complex_float* b,
-                           lapack_int ldb, lapack_complex_float* d,
-                           lapack_complex_float* x, lapack_complex_float* y );
-lapack_int LAPACKE_zggglm( int matrix_order, lapack_int n, lapack_int m,
-                           lapack_int p, lapack_complex_double* a,
-                           lapack_int lda, lapack_complex_double* b,
-                           lapack_int ldb, lapack_complex_double* d,
-                           lapack_complex_double* x, lapack_complex_double* y );
+lapack_int LAPACKE_sggglm(int matrix_order, lapack_int n, lapack_int m, lapack_int p, float* a, lapack_int lda,
+                          float* b, lapack_int ldb, float* d, float* x, float* y);
+lapack_int LAPACKE_dggglm(int matrix_order, lapack_int n, lapack_int m, lapack_int p, double* a, lapack_int lda,
+                          double* b, lapack_int ldb, double* d, double* x, double* y);
+lapack_int LAPACKE_cggglm(int matrix_order, lapack_int n, lapack_int m, lapack_int p, lapack_complex_float* a,
+                          lapack_int lda, lapack_complex_float* b, lapack_int ldb, lapack_complex_float* d,
+                          lapack_complex_float* x, lapack_complex_float* y);
+lapack_int LAPACKE_zggglm(int matrix_order, lapack_int n, lapack_int m, lapack_int p, lapack_complex_double* a,
+                          lapack_int lda, lapack_complex_double* b, lapack_int ldb, lapack_complex_double* d,
+                          lapack_complex_double* x, lapack_complex_double* y);
 
-lapack_int LAPACKE_sgghrd( int matrix_order, char compq, char compz,
-                           lapack_int n, lapack_int ilo, lapack_int ihi,
-                           float* a, lapack_int lda, float* b, lapack_int ldb,
-                           float* q, lapack_int ldq, float* z, lapack_int ldz );
-lapack_int LAPACKE_dgghrd( int matrix_order, char compq, char compz,
-                           lapack_int n, lapack_int ilo, lapack_int ihi,
-                           double* a, lapack_int lda, double* b, lapack_int ldb,
-                           double* q, lapack_int ldq, double* z,
-                           lapack_int ldz );
-lapack_int LAPACKE_cgghrd( int matrix_order, char compq, char compz,
-                           lapack_int n, lapack_int ilo, lapack_int ihi,
-                           lapack_complex_float* a, lapack_int lda,
-                           lapack_complex_float* b, lapack_int ldb,
-                           lapack_complex_float* q, lapack_int ldq,
-                           lapack_complex_float* z, lapack_int ldz );
-lapack_int LAPACKE_zgghrd( int matrix_order, char compq, char compz,
-                           lapack_int n, lapack_int ilo, lapack_int ihi,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_complex_double* b, lapack_int ldb,
-                           lapack_complex_double* q, lapack_int ldq,
-                           lapack_complex_double* z, lapack_int ldz );
+lapack_int LAPACKE_sgghrd(int matrix_order, char compq, char compz, lapack_int n, lapack_int ilo, lapack_int ihi,
+                          float* a, lapack_int lda, float* b, lapack_int ldb, float* q, lapack_int ldq, float* z,
+                          lapack_int ldz);
+lapack_int LAPACKE_dgghrd(int matrix_order, char compq, char compz, lapack_int n, lapack_int ilo, lapack_int ihi,
+                          double* a, lapack_int lda, double* b, lapack_int ldb, double* q, lapack_int ldq, double* z,
+                          lapack_int ldz);
+lapack_int LAPACKE_cgghrd(int matrix_order, char compq, char compz, lapack_int n, lapack_int ilo, lapack_int ihi,
+                          lapack_complex_float* a, lapack_int lda, lapack_complex_float* b, lapack_int ldb,
+                          lapack_complex_float* q, lapack_int ldq, lapack_complex_float* z, lapack_int ldz);
+lapack_int LAPACKE_zgghrd(int matrix_order, char compq, char compz, lapack_int n, lapack_int ilo, lapack_int ihi,
+                          lapack_complex_double* a, lapack_int lda, lapack_complex_double* b, lapack_int ldb,
+                          lapack_complex_double* q, lapack_int ldq, lapack_complex_double* z, lapack_int ldz);
 
-lapack_int LAPACKE_sgglse( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int p, float* a, lapack_int lda, float* b,
-                           lapack_int ldb, float* c, float* d, float* x );
-lapack_int LAPACKE_dgglse( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int p, double* a, lapack_int lda, double* b,
-                           lapack_int ldb, double* c, double* d, double* x );
-lapack_int LAPACKE_cgglse( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int p, lapack_complex_float* a,
-                           lapack_int lda, lapack_complex_float* b,
-                           lapack_int ldb, lapack_complex_float* c,
-                           lapack_complex_float* d, lapack_complex_float* x );
-lapack_int LAPACKE_zgglse( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int p, lapack_complex_double* a,
-                           lapack_int lda, lapack_complex_double* b,
-                           lapack_int ldb, lapack_complex_double* c,
-                           lapack_complex_double* d, lapack_complex_double* x );
+lapack_int LAPACKE_sgglse(int matrix_order, lapack_int m, lapack_int n, lapack_int p, float* a, lapack_int lda,
+                          float* b, lapack_int ldb, float* c, float* d, float* x);
+lapack_int LAPACKE_dgglse(int matrix_order, lapack_int m, lapack_int n, lapack_int p, double* a, lapack_int lda,
+                          double* b, lapack_int ldb, double* c, double* d, double* x);
+lapack_int LAPACKE_cgglse(int matrix_order, lapack_int m, lapack_int n, lapack_int p, lapack_complex_float* a,
+                          lapack_int lda, lapack_complex_float* b, lapack_int ldb, lapack_complex_float* c,
+                          lapack_complex_float* d, lapack_complex_float* x);
+lapack_int LAPACKE_zgglse(int matrix_order, lapack_int m, lapack_int n, lapack_int p, lapack_complex_double* a,
+                          lapack_int lda, lapack_complex_double* b, lapack_int ldb, lapack_complex_double* c,
+                          lapack_complex_double* d, lapack_complex_double* x);
 
-lapack_int LAPACKE_sggqrf( int matrix_order, lapack_int n, lapack_int m,
-                           lapack_int p, float* a, lapack_int lda, float* taua,
-                           float* b, lapack_int ldb, float* taub );
-lapack_int LAPACKE_dggqrf( int matrix_order, lapack_int n, lapack_int m,
-                           lapack_int p, double* a, lapack_int lda,
-                           double* taua, double* b, lapack_int ldb,
-                           double* taub );
-lapack_int LAPACKE_cggqrf( int matrix_order, lapack_int n, lapack_int m,
-                           lapack_int p, lapack_complex_float* a,
-                           lapack_int lda, lapack_complex_float* taua,
-                           lapack_complex_float* b, lapack_int ldb,
-                           lapack_complex_float* taub );
-lapack_int LAPACKE_zggqrf( int matrix_order, lapack_int n, lapack_int m,
-                           lapack_int p, lapack_complex_double* a,
-                           lapack_int lda, lapack_complex_double* taua,
-                           lapack_complex_double* b, lapack_int ldb,
-                           lapack_complex_double* taub );
+lapack_int LAPACKE_sggqrf(int matrix_order, lapack_int n, lapack_int m, lapack_int p, float* a, lapack_int lda,
+                          float* taua, float* b, lapack_int ldb, float* taub);
+lapack_int LAPACKE_dggqrf(int matrix_order, lapack_int n, lapack_int m, lapack_int p, double* a, lapack_int lda,
+                          double* taua, double* b, lapack_int ldb, double* taub);
+lapack_int LAPACKE_cggqrf(int matrix_order, lapack_int n, lapack_int m, lapack_int p, lapack_complex_float* a,
+                          lapack_int lda, lapack_complex_float* taua, lapack_complex_float* b, lapack_int ldb,
+                          lapack_complex_float* taub);
+lapack_int LAPACKE_zggqrf(int matrix_order, lapack_int n, lapack_int m, lapack_int p, lapack_complex_double* a,
+                          lapack_int lda, lapack_complex_double* taua, lapack_complex_double* b, lapack_int ldb,
+                          lapack_complex_double* taub);
 
-lapack_int LAPACKE_sggrqf( int matrix_order, lapack_int m, lapack_int p,
-                           lapack_int n, float* a, lapack_int lda, float* taua,
-                           float* b, lapack_int ldb, float* taub );
-lapack_int LAPACKE_dggrqf( int matrix_order, lapack_int m, lapack_int p,
-                           lapack_int n, double* a, lapack_int lda,
-                           double* taua, double* b, lapack_int ldb,
-                           double* taub );
-lapack_int LAPACKE_cggrqf( int matrix_order, lapack_int m, lapack_int p,
-                           lapack_int n, lapack_complex_float* a,
-                           lapack_int lda, lapack_complex_float* taua,
-                           lapack_complex_float* b, lapack_int ldb,
-                           lapack_complex_float* taub );
-lapack_int LAPACKE_zggrqf( int matrix_order, lapack_int m, lapack_int p,
-                           lapack_int n, lapack_complex_double* a,
-                           lapack_int lda, lapack_complex_double* taua,
-                           lapack_complex_double* b, lapack_int ldb,
-                           lapack_complex_double* taub );
+lapack_int LAPACKE_sggrqf(int matrix_order, lapack_int m, lapack_int p, lapack_int n, float* a, lapack_int lda,
+                          float* taua, float* b, lapack_int ldb, float* taub);
+lapack_int LAPACKE_dggrqf(int matrix_order, lapack_int m, lapack_int p, lapack_int n, double* a, lapack_int lda,
+                          double* taua, double* b, lapack_int ldb, double* taub);
+lapack_int LAPACKE_cggrqf(int matrix_order, lapack_int m, lapack_int p, lapack_int n, lapack_complex_float* a,
+                          lapack_int lda, lapack_complex_float* taua, lapack_complex_float* b, lapack_int ldb,
+                          lapack_complex_float* taub);
+lapack_int LAPACKE_zggrqf(int matrix_order, lapack_int m, lapack_int p, lapack_int n, lapack_complex_double* a,
+                          lapack_int lda, lapack_complex_double* taua, lapack_complex_double* b, lapack_int ldb,
+                          lapack_complex_double* taub);
 
-lapack_int LAPACKE_sggsvd( int matrix_order, char jobu, char jobv, char jobq,
-                           lapack_int m, lapack_int n, lapack_int p,
-                           lapack_int* k, lapack_int* l, float* a,
-                           lapack_int lda, float* b, lapack_int ldb,
-                           float* alpha, float* beta, float* u, lapack_int ldu,
-                           float* v, lapack_int ldv, float* q, lapack_int ldq,
-                           lapack_int* iwork );
-lapack_int LAPACKE_dggsvd( int matrix_order, char jobu, char jobv, char jobq,
-                           lapack_int m, lapack_int n, lapack_int p,
-                           lapack_int* k, lapack_int* l, double* a,
-                           lapack_int lda, double* b, lapack_int ldb,
-                           double* alpha, double* beta, double* u,
-                           lapack_int ldu, double* v, lapack_int ldv, double* q,
-                           lapack_int ldq, lapack_int* iwork );
-lapack_int LAPACKE_cggsvd( int matrix_order, char jobu, char jobv, char jobq,
-                           lapack_int m, lapack_int n, lapack_int p,
-                           lapack_int* k, lapack_int* l,
-                           lapack_complex_float* a, lapack_int lda,
-                           lapack_complex_float* b, lapack_int ldb,
-                           float* alpha, float* beta, lapack_complex_float* u,
-                           lapack_int ldu, lapack_complex_float* v,
-                           lapack_int ldv, lapack_complex_float* q,
-                           lapack_int ldq, lapack_int* iwork );
-lapack_int LAPACKE_zggsvd( int matrix_order, char jobu, char jobv, char jobq,
-                           lapack_int m, lapack_int n, lapack_int p,
-                           lapack_int* k, lapack_int* l,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_complex_double* b, lapack_int ldb,
-                           double* alpha, double* beta,
-                           lapack_complex_double* u, lapack_int ldu,
-                           lapack_complex_double* v, lapack_int ldv,
-                           lapack_complex_double* q, lapack_int ldq,
-                           lapack_int* iwork );
+lapack_int LAPACKE_sggsvd(int matrix_order, char jobu, char jobv, char jobq, lapack_int m, lapack_int n, lapack_int p,
+                          lapack_int* k, lapack_int* l, float* a, lapack_int lda, float* b, lapack_int ldb,
+                          float* alpha, float* beta, float* u, lapack_int ldu, float* v, lapack_int ldv, float* q,
+                          lapack_int ldq, lapack_int* iwork);
+lapack_int LAPACKE_dggsvd(int matrix_order, char jobu, char jobv, char jobq, lapack_int m, lapack_int n, lapack_int p,
+                          lapack_int* k, lapack_int* l, double* a, lapack_int lda, double* b, lapack_int ldb,
+                          double* alpha, double* beta, double* u, lapack_int ldu, double* v, lapack_int ldv, double* q,
+                          lapack_int ldq, lapack_int* iwork);
+lapack_int LAPACKE_cggsvd(int matrix_order, char jobu, char jobv, char jobq, lapack_int m, lapack_int n, lapack_int p,
+                          lapack_int* k, lapack_int* l, lapack_complex_float* a, lapack_int lda,
+                          lapack_complex_float* b, lapack_int ldb, float* alpha, float* beta, lapack_complex_float* u,
+                          lapack_int ldu, lapack_complex_float* v, lapack_int ldv, lapack_complex_float* q,
+                          lapack_int ldq, lapack_int* iwork);
+lapack_int LAPACKE_zggsvd(int matrix_order, char jobu, char jobv, char jobq, lapack_int m, lapack_int n, lapack_int p,
+                          lapack_int* k, lapack_int* l, lapack_complex_double* a, lapack_int lda,
+                          lapack_complex_double* b, lapack_int ldb, double* alpha, double* beta,
+                          lapack_complex_double* u, lapack_int ldu, lapack_complex_double* v, lapack_int ldv,
+                          lapack_complex_double* q, lapack_int ldq, lapack_int* iwork);
 
-lapack_int LAPACKE_sggsvp( int matrix_order, char jobu, char jobv, char jobq,
-                           lapack_int m, lapack_int p, lapack_int n, float* a,
-                           lapack_int lda, float* b, lapack_int ldb, float tola,
-                           float tolb, lapack_int* k, lapack_int* l, float* u,
-                           lapack_int ldu, float* v, lapack_int ldv, float* q,
-                           lapack_int ldq );
-lapack_int LAPACKE_dggsvp( int matrix_order, char jobu, char jobv, char jobq,
-                           lapack_int m, lapack_int p, lapack_int n, double* a,
-                           lapack_int lda, double* b, lapack_int ldb,
-                           double tola, double tolb, lapack_int* k,
-                           lapack_int* l, double* u, lapack_int ldu, double* v,
-                           lapack_int ldv, double* q, lapack_int ldq );
-lapack_int LAPACKE_cggsvp( int matrix_order, char jobu, char jobv, char jobq,
-                           lapack_int m, lapack_int p, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda,
-                           lapack_complex_float* b, lapack_int ldb, float tola,
-                           float tolb, lapack_int* k, lapack_int* l,
-                           lapack_complex_float* u, lapack_int ldu,
-                           lapack_complex_float* v, lapack_int ldv,
-                           lapack_complex_float* q, lapack_int ldq );
-lapack_int LAPACKE_zggsvp( int matrix_order, char jobu, char jobv, char jobq,
-                           lapack_int m, lapack_int p, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_complex_double* b, lapack_int ldb,
-                           double tola, double tolb, lapack_int* k,
-                           lapack_int* l, lapack_complex_double* u,
-                           lapack_int ldu, lapack_complex_double* v,
-                           lapack_int ldv, lapack_complex_double* q,
-                           lapack_int ldq );
+lapack_int LAPACKE_sggsvp(int matrix_order, char jobu, char jobv, char jobq, lapack_int m, lapack_int p, lapack_int n,
+                          float* a, lapack_int lda, float* b, lapack_int ldb, float tola, float tolb, lapack_int* k,
+                          lapack_int* l, float* u, lapack_int ldu, float* v, lapack_int ldv, float* q, lapack_int ldq);
+lapack_int LAPACKE_dggsvp(int matrix_order, char jobu, char jobv, char jobq, lapack_int m, lapack_int p, lapack_int n,
+                          double* a, lapack_int lda, double* b, lapack_int ldb, double tola, double tolb, lapack_int* k,
+                          lapack_int* l, double* u, lapack_int ldu, double* v, lapack_int ldv, double* q,
+                          lapack_int ldq);
+lapack_int LAPACKE_cggsvp(int matrix_order, char jobu, char jobv, char jobq, lapack_int m, lapack_int p, lapack_int n,
+                          lapack_complex_float* a, lapack_int lda, lapack_complex_float* b, lapack_int ldb, float tola,
+                          float tolb, lapack_int* k, lapack_int* l, lapack_complex_float* u, lapack_int ldu,
+                          lapack_complex_float* v, lapack_int ldv, lapack_complex_float* q, lapack_int ldq);
+lapack_int LAPACKE_zggsvp(int matrix_order, char jobu, char jobv, char jobq, lapack_int m, lapack_int p, lapack_int n,
+                          lapack_complex_double* a, lapack_int lda, lapack_complex_double* b, lapack_int ldb,
+                          double tola, double tolb, lapack_int* k, lapack_int* l, lapack_complex_double* u,
+                          lapack_int ldu, lapack_complex_double* v, lapack_int ldv, lapack_complex_double* q,
+                          lapack_int ldq);
 
-lapack_int LAPACKE_sgtcon( char norm, lapack_int n, const float* dl,
-                           const float* d, const float* du, const float* du2,
-                           const lapack_int* ipiv, float anorm, float* rcond );
-lapack_int LAPACKE_dgtcon( char norm, lapack_int n, const double* dl,
-                           const double* d, const double* du, const double* du2,
-                           const lapack_int* ipiv, double anorm,
-                           double* rcond );
-lapack_int LAPACKE_cgtcon( char norm, lapack_int n,
-                           const lapack_complex_float* dl,
-                           const lapack_complex_float* d,
-                           const lapack_complex_float* du,
-                           const lapack_complex_float* du2,
-                           const lapack_int* ipiv, float anorm, float* rcond );
-lapack_int LAPACKE_zgtcon( char norm, lapack_int n,
-                           const lapack_complex_double* dl,
-                           const lapack_complex_double* d,
-                           const lapack_complex_double* du,
-                           const lapack_complex_double* du2,
-                           const lapack_int* ipiv, double anorm,
-                           double* rcond );
+lapack_int LAPACKE_sgtcon(char norm, lapack_int n, const float* dl, const float* d, const float* du, const float* du2,
+                          const lapack_int* ipiv, float anorm, float* rcond);
+lapack_int LAPACKE_dgtcon(char norm, lapack_int n, const double* dl, const double* d, const double* du,
+                          const double* du2, const lapack_int* ipiv, double anorm, double* rcond);
+lapack_int LAPACKE_cgtcon(char norm, lapack_int n, const lapack_complex_float* dl, const lapack_complex_float* d,
+                          const lapack_complex_float* du, const lapack_complex_float* du2, const lapack_int* ipiv,
+                          float anorm, float* rcond);
+lapack_int LAPACKE_zgtcon(char norm, lapack_int n, const lapack_complex_double* dl, const lapack_complex_double* d,
+                          const lapack_complex_double* du, const lapack_complex_double* du2, const lapack_int* ipiv,
+                          double anorm, double* rcond);
 
-lapack_int LAPACKE_sgtrfs( int matrix_order, char trans, lapack_int n,
-                           lapack_int nrhs, const float* dl, const float* d,
-                           const float* du, const float* dlf, const float* df,
-                           const float* duf, const float* du2,
-                           const lapack_int* ipiv, const float* b,
-                           lapack_int ldb, float* x, lapack_int ldx,
-                           float* ferr, float* berr );
-lapack_int LAPACKE_dgtrfs( int matrix_order, char trans, lapack_int n,
-                           lapack_int nrhs, const double* dl, const double* d,
-                           const double* du, const double* dlf,
-                           const double* df, const double* duf,
-                           const double* du2, const lapack_int* ipiv,
-                           const double* b, lapack_int ldb, double* x,
-                           lapack_int ldx, double* ferr, double* berr );
-lapack_int LAPACKE_cgtrfs( int matrix_order, char trans, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_float* dl,
-                           const lapack_complex_float* d,
-                           const lapack_complex_float* du,
-                           const lapack_complex_float* dlf,
-                           const lapack_complex_float* df,
-                           const lapack_complex_float* duf,
-                           const lapack_complex_float* du2,
-                           const lapack_int* ipiv,
-                           const lapack_complex_float* b, lapack_int ldb,
-                           lapack_complex_float* x, lapack_int ldx, float* ferr,
-                           float* berr );
-lapack_int LAPACKE_zgtrfs( int matrix_order, char trans, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_double* dl,
-                           const lapack_complex_double* d,
-                           const lapack_complex_double* du,
-                           const lapack_complex_double* dlf,
-                           const lapack_complex_double* df,
-                           const lapack_complex_double* duf,
-                           const lapack_complex_double* du2,
-                           const lapack_int* ipiv,
-                           const lapack_complex_double* b, lapack_int ldb,
-                           lapack_complex_double* x, lapack_int ldx,
-                           double* ferr, double* berr );
+lapack_int LAPACKE_sgtrfs(int matrix_order, char trans, lapack_int n, lapack_int nrhs, const float* dl, const float* d,
+                          const float* du, const float* dlf, const float* df, const float* duf, const float* du2,
+                          const lapack_int* ipiv, const float* b, lapack_int ldb, float* x, lapack_int ldx, float* ferr,
+                          float* berr);
+lapack_int LAPACKE_dgtrfs(int matrix_order, char trans, lapack_int n, lapack_int nrhs, const double* dl,
+                          const double* d, const double* du, const double* dlf, const double* df, const double* duf,
+                          const double* du2, const lapack_int* ipiv, const double* b, lapack_int ldb, double* x,
+                          lapack_int ldx, double* ferr, double* berr);
+lapack_int LAPACKE_cgtrfs(int matrix_order, char trans, lapack_int n, lapack_int nrhs, const lapack_complex_float* dl,
+                          const lapack_complex_float* d, const lapack_complex_float* du,
+                          const lapack_complex_float* dlf, const lapack_complex_float* df,
+                          const lapack_complex_float* duf, const lapack_complex_float* du2, const lapack_int* ipiv,
+                          const lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x, lapack_int ldx,
+                          float* ferr, float* berr);
+lapack_int LAPACKE_zgtrfs(int matrix_order, char trans, lapack_int n, lapack_int nrhs, const lapack_complex_double* dl,
+                          const lapack_complex_double* d, const lapack_complex_double* du,
+                          const lapack_complex_double* dlf, const lapack_complex_double* df,
+                          const lapack_complex_double* duf, const lapack_complex_double* du2, const lapack_int* ipiv,
+                          const lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x, lapack_int ldx,
+                          double* ferr, double* berr);
 
-lapack_int LAPACKE_sgtsv( int matrix_order, lapack_int n, lapack_int nrhs,
-                          float* dl, float* d, float* du, float* b,
-                          lapack_int ldb );
-lapack_int LAPACKE_dgtsv( int matrix_order, lapack_int n, lapack_int nrhs,
-                          double* dl, double* d, double* du, double* b,
-                          lapack_int ldb );
-lapack_int LAPACKE_cgtsv( int matrix_order, lapack_int n, lapack_int nrhs,
-                          lapack_complex_float* dl, lapack_complex_float* d,
-                          lapack_complex_float* du, lapack_complex_float* b,
-                          lapack_int ldb );
-lapack_int LAPACKE_zgtsv( int matrix_order, lapack_int n, lapack_int nrhs,
-                          lapack_complex_double* dl, lapack_complex_double* d,
-                          lapack_complex_double* du, lapack_complex_double* b,
-                          lapack_int ldb );
+lapack_int LAPACKE_sgtsv(int matrix_order, lapack_int n, lapack_int nrhs, float* dl, float* d, float* du, float* b,
+                         lapack_int ldb);
+lapack_int LAPACKE_dgtsv(int matrix_order, lapack_int n, lapack_int nrhs, double* dl, double* d, double* du, double* b,
+                         lapack_int ldb);
+lapack_int LAPACKE_cgtsv(int matrix_order, lapack_int n, lapack_int nrhs, lapack_complex_float* dl,
+                         lapack_complex_float* d, lapack_complex_float* du, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zgtsv(int matrix_order, lapack_int n, lapack_int nrhs, lapack_complex_double* dl,
+                         lapack_complex_double* d, lapack_complex_double* du, lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_sgtsvx( int matrix_order, char fact, char trans,
-                           lapack_int n, lapack_int nrhs, const float* dl,
-                           const float* d, const float* du, float* dlf,
-                           float* df, float* duf, float* du2, lapack_int* ipiv,
-                           const float* b, lapack_int ldb, float* x,
-                           lapack_int ldx, float* rcond, float* ferr,
-                           float* berr );
-lapack_int LAPACKE_dgtsvx( int matrix_order, char fact, char trans,
-                           lapack_int n, lapack_int nrhs, const double* dl,
-                           const double* d, const double* du, double* dlf,
-                           double* df, double* duf, double* du2,
-                           lapack_int* ipiv, const double* b, lapack_int ldb,
-                           double* x, lapack_int ldx, double* rcond,
-                           double* ferr, double* berr );
-lapack_int LAPACKE_cgtsvx( int matrix_order, char fact, char trans,
-                           lapack_int n, lapack_int nrhs,
-                           const lapack_complex_float* dl,
-                           const lapack_complex_float* d,
-                           const lapack_complex_float* du,
-                           lapack_complex_float* dlf, lapack_complex_float* df,
-                           lapack_complex_float* duf, lapack_complex_float* du2,
-                           lapack_int* ipiv, const lapack_complex_float* b,
-                           lapack_int ldb, lapack_complex_float* x,
-                           lapack_int ldx, float* rcond, float* ferr,
-                           float* berr );
-lapack_int LAPACKE_zgtsvx( int matrix_order, char fact, char trans,
-                           lapack_int n, lapack_int nrhs,
-                           const lapack_complex_double* dl,
-                           const lapack_complex_double* d,
-                           const lapack_complex_double* du,
-                           lapack_complex_double* dlf,
-                           lapack_complex_double* df,
-                           lapack_complex_double* duf,
-                           lapack_complex_double* du2, lapack_int* ipiv,
-                           const lapack_complex_double* b, lapack_int ldb,
-                           lapack_complex_double* x, lapack_int ldx,
-                           double* rcond, double* ferr, double* berr );
+lapack_int LAPACKE_sgtsvx(int matrix_order, char fact, char trans, lapack_int n, lapack_int nrhs, const float* dl,
+                          const float* d, const float* du, float* dlf, float* df, float* duf, float* du2,
+                          lapack_int* ipiv, const float* b, lapack_int ldb, float* x, lapack_int ldx, float* rcond,
+                          float* ferr, float* berr);
+lapack_int LAPACKE_dgtsvx(int matrix_order, char fact, char trans, lapack_int n, lapack_int nrhs, const double* dl,
+                          const double* d, const double* du, double* dlf, double* df, double* duf, double* du2,
+                          lapack_int* ipiv, const double* b, lapack_int ldb, double* x, lapack_int ldx, double* rcond,
+                          double* ferr, double* berr);
+lapack_int LAPACKE_cgtsvx(int matrix_order, char fact, char trans, lapack_int n, lapack_int nrhs,
+                          const lapack_complex_float* dl, const lapack_complex_float* d, const lapack_complex_float* du,
+                          lapack_complex_float* dlf, lapack_complex_float* df, lapack_complex_float* duf,
+                          lapack_complex_float* du2, lapack_int* ipiv, const lapack_complex_float* b, lapack_int ldb,
+                          lapack_complex_float* x, lapack_int ldx, float* rcond, float* ferr, float* berr);
+lapack_int LAPACKE_zgtsvx(int matrix_order, char fact, char trans, lapack_int n, lapack_int nrhs,
+                          const lapack_complex_double* dl, const lapack_complex_double* d,
+                          const lapack_complex_double* du, lapack_complex_double* dlf, lapack_complex_double* df,
+                          lapack_complex_double* duf, lapack_complex_double* du2, lapack_int* ipiv,
+                          const lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x, lapack_int ldx,
+                          double* rcond, double* ferr, double* berr);
 
-lapack_int LAPACKE_sgttrf( lapack_int n, float* dl, float* d, float* du,
-                           float* du2, lapack_int* ipiv );
-lapack_int LAPACKE_dgttrf( lapack_int n, double* dl, double* d, double* du,
-                           double* du2, lapack_int* ipiv );
-lapack_int LAPACKE_cgttrf( lapack_int n, lapack_complex_float* dl,
-                           lapack_complex_float* d, lapack_complex_float* du,
-                           lapack_complex_float* du2, lapack_int* ipiv );
-lapack_int LAPACKE_zgttrf( lapack_int n, lapack_complex_double* dl,
-                           lapack_complex_double* d, lapack_complex_double* du,
-                           lapack_complex_double* du2, lapack_int* ipiv );
+lapack_int LAPACKE_sgttrf(lapack_int n, float* dl, float* d, float* du, float* du2, lapack_int* ipiv);
+lapack_int LAPACKE_dgttrf(lapack_int n, double* dl, double* d, double* du, double* du2, lapack_int* ipiv);
+lapack_int LAPACKE_cgttrf(lapack_int n, lapack_complex_float* dl, lapack_complex_float* d, lapack_complex_float* du,
+                          lapack_complex_float* du2, lapack_int* ipiv);
+lapack_int LAPACKE_zgttrf(lapack_int n, lapack_complex_double* dl, lapack_complex_double* d, lapack_complex_double* du,
+                          lapack_complex_double* du2, lapack_int* ipiv);
 
-lapack_int LAPACKE_sgttrs( int matrix_order, char trans, lapack_int n,
-                           lapack_int nrhs, const float* dl, const float* d,
-                           const float* du, const float* du2,
-                           const lapack_int* ipiv, float* b, lapack_int ldb );
-lapack_int LAPACKE_dgttrs( int matrix_order, char trans, lapack_int n,
-                           lapack_int nrhs, const double* dl, const double* d,
-                           const double* du, const double* du2,
-                           const lapack_int* ipiv, double* b, lapack_int ldb );
-lapack_int LAPACKE_cgttrs( int matrix_order, char trans, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_float* dl,
-                           const lapack_complex_float* d,
-                           const lapack_complex_float* du,
-                           const lapack_complex_float* du2,
-                           const lapack_int* ipiv, lapack_complex_float* b,
-                           lapack_int ldb );
-lapack_int LAPACKE_zgttrs( int matrix_order, char trans, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_double* dl,
-                           const lapack_complex_double* d,
-                           const lapack_complex_double* du,
-                           const lapack_complex_double* du2,
-                           const lapack_int* ipiv, lapack_complex_double* b,
-                           lapack_int ldb );
+lapack_int LAPACKE_sgttrs(int matrix_order, char trans, lapack_int n, lapack_int nrhs, const float* dl, const float* d,
+                          const float* du, const float* du2, const lapack_int* ipiv, float* b, lapack_int ldb);
+lapack_int LAPACKE_dgttrs(int matrix_order, char trans, lapack_int n, lapack_int nrhs, const double* dl,
+                          const double* d, const double* du, const double* du2, const lapack_int* ipiv, double* b,
+                          lapack_int ldb);
+lapack_int LAPACKE_cgttrs(int matrix_order, char trans, lapack_int n, lapack_int nrhs, const lapack_complex_float* dl,
+                          const lapack_complex_float* d, const lapack_complex_float* du,
+                          const lapack_complex_float* du2, const lapack_int* ipiv, lapack_complex_float* b,
+                          lapack_int ldb);
+lapack_int LAPACKE_zgttrs(int matrix_order, char trans, lapack_int n, lapack_int nrhs, const lapack_complex_double* dl,
+                          const lapack_complex_double* d, const lapack_complex_double* du,
+                          const lapack_complex_double* du2, const lapack_int* ipiv, lapack_complex_double* b,
+                          lapack_int ldb);
 
-lapack_int LAPACKE_chbev( int matrix_order, char jobz, char uplo, lapack_int n,
-                          lapack_int kd, lapack_complex_float* ab,
-                          lapack_int ldab, float* w, lapack_complex_float* z,
-                          lapack_int ldz );
-lapack_int LAPACKE_zhbev( int matrix_order, char jobz, char uplo, lapack_int n,
-                          lapack_int kd, lapack_complex_double* ab,
-                          lapack_int ldab, double* w, lapack_complex_double* z,
-                          lapack_int ldz );
+lapack_int LAPACKE_chbev(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int kd, lapack_complex_float* ab,
+                         lapack_int ldab, float* w, lapack_complex_float* z, lapack_int ldz);
+lapack_int LAPACKE_zhbev(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int kd, lapack_complex_double* ab,
+                         lapack_int ldab, double* w, lapack_complex_double* z, lapack_int ldz);
 
-lapack_int LAPACKE_chbevd( int matrix_order, char jobz, char uplo, lapack_int n,
-                           lapack_int kd, lapack_complex_float* ab,
-                           lapack_int ldab, float* w, lapack_complex_float* z,
-                           lapack_int ldz );
-lapack_int LAPACKE_zhbevd( int matrix_order, char jobz, char uplo, lapack_int n,
-                           lapack_int kd, lapack_complex_double* ab,
-                           lapack_int ldab, double* w, lapack_complex_double* z,
-                           lapack_int ldz );
+lapack_int LAPACKE_chbevd(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int kd, lapack_complex_float* ab,
+                          lapack_int ldab, float* w, lapack_complex_float* z, lapack_int ldz);
+lapack_int LAPACKE_zhbevd(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int kd,
+                          lapack_complex_double* ab, lapack_int ldab, double* w, lapack_complex_double* z,
+                          lapack_int ldz);
 
-lapack_int LAPACKE_chbevx( int matrix_order, char jobz, char range, char uplo,
-                           lapack_int n, lapack_int kd,
-                           lapack_complex_float* ab, lapack_int ldab,
-                           lapack_complex_float* q, lapack_int ldq, float vl,
-                           float vu, lapack_int il, lapack_int iu, float abstol,
-                           lapack_int* m, float* w, lapack_complex_float* z,
-                           lapack_int ldz, lapack_int* ifail );
-lapack_int LAPACKE_zhbevx( int matrix_order, char jobz, char range, char uplo,
-                           lapack_int n, lapack_int kd,
-                           lapack_complex_double* ab, lapack_int ldab,
-                           lapack_complex_double* q, lapack_int ldq, double vl,
-                           double vu, lapack_int il, lapack_int iu,
-                           double abstol, lapack_int* m, double* w,
-                           lapack_complex_double* z, lapack_int ldz,
-                           lapack_int* ifail );
+lapack_int LAPACKE_chbevx(int matrix_order, char jobz, char range, char uplo, lapack_int n, lapack_int kd,
+                          lapack_complex_float* ab, lapack_int ldab, lapack_complex_float* q, lapack_int ldq, float vl,
+                          float vu, lapack_int il, lapack_int iu, float abstol, lapack_int* m, float* w,
+                          lapack_complex_float* z, lapack_int ldz, lapack_int* ifail);
+lapack_int LAPACKE_zhbevx(int matrix_order, char jobz, char range, char uplo, lapack_int n, lapack_int kd,
+                          lapack_complex_double* ab, lapack_int ldab, lapack_complex_double* q, lapack_int ldq,
+                          double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int* m, double* w,
+                          lapack_complex_double* z, lapack_int ldz, lapack_int* ifail);
 
-lapack_int LAPACKE_chbgst( int matrix_order, char vect, char uplo, lapack_int n,
-                           lapack_int ka, lapack_int kb,
-                           lapack_complex_float* ab, lapack_int ldab,
-                           const lapack_complex_float* bb, lapack_int ldbb,
-                           lapack_complex_float* x, lapack_int ldx );
-lapack_int LAPACKE_zhbgst( int matrix_order, char vect, char uplo, lapack_int n,
-                           lapack_int ka, lapack_int kb,
-                           lapack_complex_double* ab, lapack_int ldab,
-                           const lapack_complex_double* bb, lapack_int ldbb,
-                           lapack_complex_double* x, lapack_int ldx );
+lapack_int LAPACKE_chbgst(int matrix_order, char vect, char uplo, lapack_int n, lapack_int ka, lapack_int kb,
+                          lapack_complex_float* ab, lapack_int ldab, const lapack_complex_float* bb, lapack_int ldbb,
+                          lapack_complex_float* x, lapack_int ldx);
+lapack_int LAPACKE_zhbgst(int matrix_order, char vect, char uplo, lapack_int n, lapack_int ka, lapack_int kb,
+                          lapack_complex_double* ab, lapack_int ldab, const lapack_complex_double* bb, lapack_int ldbb,
+                          lapack_complex_double* x, lapack_int ldx);
 
-lapack_int LAPACKE_chbgv( int matrix_order, char jobz, char uplo, lapack_int n,
-                          lapack_int ka, lapack_int kb,
-                          lapack_complex_float* ab, lapack_int ldab,
-                          lapack_complex_float* bb, lapack_int ldbb, float* w,
-                          lapack_complex_float* z, lapack_int ldz );
-lapack_int LAPACKE_zhbgv( int matrix_order, char jobz, char uplo, lapack_int n,
-                          lapack_int ka, lapack_int kb,
-                          lapack_complex_double* ab, lapack_int ldab,
-                          lapack_complex_double* bb, lapack_int ldbb, double* w,
-                          lapack_complex_double* z, lapack_int ldz );
+lapack_int LAPACKE_chbgv(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int ka, lapack_int kb,
+                         lapack_complex_float* ab, lapack_int ldab, lapack_complex_float* bb, lapack_int ldbb, float* w,
+                         lapack_complex_float* z, lapack_int ldz);
+lapack_int LAPACKE_zhbgv(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int ka, lapack_int kb,
+                         lapack_complex_double* ab, lapack_int ldab, lapack_complex_double* bb, lapack_int ldbb,
+                         double* w, lapack_complex_double* z, lapack_int ldz);
 
-lapack_int LAPACKE_chbgvd( int matrix_order, char jobz, char uplo, lapack_int n,
-                           lapack_int ka, lapack_int kb,
-                           lapack_complex_float* ab, lapack_int ldab,
-                           lapack_complex_float* bb, lapack_int ldbb, float* w,
-                           lapack_complex_float* z, lapack_int ldz );
-lapack_int LAPACKE_zhbgvd( int matrix_order, char jobz, char uplo, lapack_int n,
-                           lapack_int ka, lapack_int kb,
-                           lapack_complex_double* ab, lapack_int ldab,
-                           lapack_complex_double* bb, lapack_int ldbb,
-                           double* w, lapack_complex_double* z,
-                           lapack_int ldz );
+lapack_int LAPACKE_chbgvd(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int ka, lapack_int kb,
+                          lapack_complex_float* ab, lapack_int ldab, lapack_complex_float* bb, lapack_int ldbb,
+                          float* w, lapack_complex_float* z, lapack_int ldz);
+lapack_int LAPACKE_zhbgvd(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int ka, lapack_int kb,
+                          lapack_complex_double* ab, lapack_int ldab, lapack_complex_double* bb, lapack_int ldbb,
+                          double* w, lapack_complex_double* z, lapack_int ldz);
 
-lapack_int LAPACKE_chbgvx( int matrix_order, char jobz, char range, char uplo,
-                           lapack_int n, lapack_int ka, lapack_int kb,
-                           lapack_complex_float* ab, lapack_int ldab,
-                           lapack_complex_float* bb, lapack_int ldbb,
-                           lapack_complex_float* q, lapack_int ldq, float vl,
-                           float vu, lapack_int il, lapack_int iu, float abstol,
-                           lapack_int* m, float* w, lapack_complex_float* z,
-                           lapack_int ldz, lapack_int* ifail );
-lapack_int LAPACKE_zhbgvx( int matrix_order, char jobz, char range, char uplo,
-                           lapack_int n, lapack_int ka, lapack_int kb,
-                           lapack_complex_double* ab, lapack_int ldab,
-                           lapack_complex_double* bb, lapack_int ldbb,
-                           lapack_complex_double* q, lapack_int ldq, double vl,
-                           double vu, lapack_int il, lapack_int iu,
-                           double abstol, lapack_int* m, double* w,
-                           lapack_complex_double* z, lapack_int ldz,
-                           lapack_int* ifail );
+lapack_int LAPACKE_chbgvx(int matrix_order, char jobz, char range, char uplo, lapack_int n, lapack_int ka,
+                          lapack_int kb, lapack_complex_float* ab, lapack_int ldab, lapack_complex_float* bb,
+                          lapack_int ldbb, lapack_complex_float* q, lapack_int ldq, float vl, float vu, lapack_int il,
+                          lapack_int iu, float abstol, lapack_int* m, float* w, lapack_complex_float* z, lapack_int ldz,
+                          lapack_int* ifail);
+lapack_int LAPACKE_zhbgvx(int matrix_order, char jobz, char range, char uplo, lapack_int n, lapack_int ka,
+                          lapack_int kb, lapack_complex_double* ab, lapack_int ldab, lapack_complex_double* bb,
+                          lapack_int ldbb, lapack_complex_double* q, lapack_int ldq, double vl, double vu,
+                          lapack_int il, lapack_int iu, double abstol, lapack_int* m, double* w,
+                          lapack_complex_double* z, lapack_int ldz, lapack_int* ifail);
 
-lapack_int LAPACKE_chbtrd( int matrix_order, char vect, char uplo, lapack_int n,
-                           lapack_int kd, lapack_complex_float* ab,
-                           lapack_int ldab, float* d, float* e,
-                           lapack_complex_float* q, lapack_int ldq );
-lapack_int LAPACKE_zhbtrd( int matrix_order, char vect, char uplo, lapack_int n,
-                           lapack_int kd, lapack_complex_double* ab,
-                           lapack_int ldab, double* d, double* e,
-                           lapack_complex_double* q, lapack_int ldq );
+lapack_int LAPACKE_chbtrd(int matrix_order, char vect, char uplo, lapack_int n, lapack_int kd, lapack_complex_float* ab,
+                          lapack_int ldab, float* d, float* e, lapack_complex_float* q, lapack_int ldq);
+lapack_int LAPACKE_zhbtrd(int matrix_order, char vect, char uplo, lapack_int n, lapack_int kd,
+                          lapack_complex_double* ab, lapack_int ldab, double* d, double* e, lapack_complex_double* q,
+                          lapack_int ldq);
 
-lapack_int LAPACKE_checon( int matrix_order, char uplo, lapack_int n,
-                           const lapack_complex_float* a, lapack_int lda,
-                           const lapack_int* ipiv, float anorm, float* rcond );
-lapack_int LAPACKE_zhecon( int matrix_order, char uplo, lapack_int n,
-                           const lapack_complex_double* a, lapack_int lda,
-                           const lapack_int* ipiv, double anorm,
-                           double* rcond );
+lapack_int LAPACKE_checon(int matrix_order, char uplo, lapack_int n, const lapack_complex_float* a, lapack_int lda,
+                          const lapack_int* ipiv, float anorm, float* rcond);
+lapack_int LAPACKE_zhecon(int matrix_order, char uplo, lapack_int n, const lapack_complex_double* a, lapack_int lda,
+                          const lapack_int* ipiv, double anorm, double* rcond);
 
-lapack_int LAPACKE_cheequb( int matrix_order, char uplo, lapack_int n,
-                            const lapack_complex_float* a, lapack_int lda,
-                            float* s, float* scond, float* amax );
-lapack_int LAPACKE_zheequb( int matrix_order, char uplo, lapack_int n,
-                            const lapack_complex_double* a, lapack_int lda,
-                            double* s, double* scond, double* amax );
+lapack_int LAPACKE_cheequb(int matrix_order, char uplo, lapack_int n, const lapack_complex_float* a, lapack_int lda,
+                           float* s, float* scond, float* amax);
+lapack_int LAPACKE_zheequb(int matrix_order, char uplo, lapack_int n, const lapack_complex_double* a, lapack_int lda,
+                           double* s, double* scond, double* amax);
 
-lapack_int LAPACKE_cheev( int matrix_order, char jobz, char uplo, lapack_int n,
-                          lapack_complex_float* a, lapack_int lda, float* w );
-lapack_int LAPACKE_zheev( int matrix_order, char jobz, char uplo, lapack_int n,
-                          lapack_complex_double* a, lapack_int lda, double* w );
+lapack_int LAPACKE_cheev(int matrix_order, char jobz, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                         float* w);
+lapack_int LAPACKE_zheev(int matrix_order, char jobz, char uplo, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                         double* w);
 
-lapack_int LAPACKE_cheevd( int matrix_order, char jobz, char uplo, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda, float* w );
-lapack_int LAPACKE_zheevd( int matrix_order, char jobz, char uplo, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda,
-                           double* w );
+lapack_int LAPACKE_cheevd(int matrix_order, char jobz, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                          float* w);
+lapack_int LAPACKE_zheevd(int matrix_order, char jobz, char uplo, lapack_int n, lapack_complex_double* a,
+                          lapack_int lda, double* w);
 
-lapack_int LAPACKE_cheevr( int matrix_order, char jobz, char range, char uplo,
-                           lapack_int n, lapack_complex_float* a,
-                           lapack_int lda, float vl, float vu, lapack_int il,
-                           lapack_int iu, float abstol, lapack_int* m, float* w,
-                           lapack_complex_float* z, lapack_int ldz,
-                           lapack_int* isuppz );
-lapack_int LAPACKE_zheevr( int matrix_order, char jobz, char range, char uplo,
-                           lapack_int n, lapack_complex_double* a,
-                           lapack_int lda, double vl, double vu, lapack_int il,
-                           lapack_int iu, double abstol, lapack_int* m,
-                           double* w, lapack_complex_double* z, lapack_int ldz,
-                           lapack_int* isuppz );
+lapack_int LAPACKE_cheevr(int matrix_order, char jobz, char range, char uplo, lapack_int n, lapack_complex_float* a,
+                          lapack_int lda, float vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int* m,
+                          float* w, lapack_complex_float* z, lapack_int ldz, lapack_int* isuppz);
+lapack_int LAPACKE_zheevr(int matrix_order, char jobz, char range, char uplo, lapack_int n, lapack_complex_double* a,
+                          lapack_int lda, double vl, double vu, lapack_int il, lapack_int iu, double abstol,
+                          lapack_int* m, double* w, lapack_complex_double* z, lapack_int ldz, lapack_int* isuppz);
 
-lapack_int LAPACKE_cheevx( int matrix_order, char jobz, char range, char uplo,
-                           lapack_int n, lapack_complex_float* a,
-                           lapack_int lda, float vl, float vu, lapack_int il,
-                           lapack_int iu, float abstol, lapack_int* m, float* w,
-                           lapack_complex_float* z, lapack_int ldz,
-                           lapack_int* ifail );
-lapack_int LAPACKE_zheevx( int matrix_order, char jobz, char range, char uplo,
-                           lapack_int n, lapack_complex_double* a,
-                           lapack_int lda, double vl, double vu, lapack_int il,
-                           lapack_int iu, double abstol, lapack_int* m,
-                           double* w, lapack_complex_double* z, lapack_int ldz,
-                           lapack_int* ifail );
+lapack_int LAPACKE_cheevx(int matrix_order, char jobz, char range, char uplo, lapack_int n, lapack_complex_float* a,
+                          lapack_int lda, float vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int* m,
+                          float* w, lapack_complex_float* z, lapack_int ldz, lapack_int* ifail);
+lapack_int LAPACKE_zheevx(int matrix_order, char jobz, char range, char uplo, lapack_int n, lapack_complex_double* a,
+                          lapack_int lda, double vl, double vu, lapack_int il, lapack_int iu, double abstol,
+                          lapack_int* m, double* w, lapack_complex_double* z, lapack_int ldz, lapack_int* ifail);
 
-lapack_int LAPACKE_chegst( int matrix_order, lapack_int itype, char uplo,
-                           lapack_int n, lapack_complex_float* a,
-                           lapack_int lda, const lapack_complex_float* b,
-                           lapack_int ldb );
-lapack_int LAPACKE_zhegst( int matrix_order, lapack_int itype, char uplo,
-                           lapack_int n, lapack_complex_double* a,
-                           lapack_int lda, const lapack_complex_double* b,
-                           lapack_int ldb );
+lapack_int LAPACKE_chegst(int matrix_order, lapack_int itype, char uplo, lapack_int n, lapack_complex_float* a,
+                          lapack_int lda, const lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zhegst(int matrix_order, lapack_int itype, char uplo, lapack_int n, lapack_complex_double* a,
+                          lapack_int lda, const lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_chegv( int matrix_order, lapack_int itype, char jobz,
-                          char uplo, lapack_int n, lapack_complex_float* a,
-                          lapack_int lda, lapack_complex_float* b,
-                          lapack_int ldb, float* w );
-lapack_int LAPACKE_zhegv( int matrix_order, lapack_int itype, char jobz,
-                          char uplo, lapack_int n, lapack_complex_double* a,
-                          lapack_int lda, lapack_complex_double* b,
-                          lapack_int ldb, double* w );
+lapack_int LAPACKE_chegv(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n,
+                         lapack_complex_float* a, lapack_int lda, lapack_complex_float* b, lapack_int ldb, float* w);
+lapack_int LAPACKE_zhegv(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n,
+                         lapack_complex_double* a, lapack_int lda, lapack_complex_double* b, lapack_int ldb, double* w);
 
-lapack_int LAPACKE_chegvd( int matrix_order, lapack_int itype, char jobz,
-                           char uplo, lapack_int n, lapack_complex_float* a,
-                           lapack_int lda, lapack_complex_float* b,
-                           lapack_int ldb, float* w );
-lapack_int LAPACKE_zhegvd( int matrix_order, lapack_int itype, char jobz,
-                           char uplo, lapack_int n, lapack_complex_double* a,
-                           lapack_int lda, lapack_complex_double* b,
-                           lapack_int ldb, double* w );
+lapack_int LAPACKE_chegvd(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n,
+                          lapack_complex_float* a, lapack_int lda, lapack_complex_float* b, lapack_int ldb, float* w);
+lapack_int LAPACKE_zhegvd(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n,
+                          lapack_complex_double* a, lapack_int lda, lapack_complex_double* b, lapack_int ldb,
+                          double* w);
 
-lapack_int LAPACKE_chegvx( int matrix_order, lapack_int itype, char jobz,
-                           char range, char uplo, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda,
-                           lapack_complex_float* b, lapack_int ldb, float vl,
-                           float vu, lapack_int il, lapack_int iu, float abstol,
-                           lapack_int* m, float* w, lapack_complex_float* z,
-                           lapack_int ldz, lapack_int* ifail );
-lapack_int LAPACKE_zhegvx( int matrix_order, lapack_int itype, char jobz,
-                           char range, char uplo, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_complex_double* b, lapack_int ldb, double vl,
-                           double vu, lapack_int il, lapack_int iu,
-                           double abstol, lapack_int* m, double* w,
-                           lapack_complex_double* z, lapack_int ldz,
-                           lapack_int* ifail );
+lapack_int LAPACKE_chegvx(int matrix_order, lapack_int itype, char jobz, char range, char uplo, lapack_int n,
+                          lapack_complex_float* a, lapack_int lda, lapack_complex_float* b, lapack_int ldb, float vl,
+                          float vu, lapack_int il, lapack_int iu, float abstol, lapack_int* m, float* w,
+                          lapack_complex_float* z, lapack_int ldz, lapack_int* ifail);
+lapack_int LAPACKE_zhegvx(int matrix_order, lapack_int itype, char jobz, char range, char uplo, lapack_int n,
+                          lapack_complex_double* a, lapack_int lda, lapack_complex_double* b, lapack_int ldb, double vl,
+                          double vu, lapack_int il, lapack_int iu, double abstol, lapack_int* m, double* w,
+                          lapack_complex_double* z, lapack_int ldz, lapack_int* ifail);
 
-lapack_int LAPACKE_cherfs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_float* a,
-                           lapack_int lda, const lapack_complex_float* af,
-                           lapack_int ldaf, const lapack_int* ipiv,
-                           const lapack_complex_float* b, lapack_int ldb,
-                           lapack_complex_float* x, lapack_int ldx, float* ferr,
-                           float* berr );
-lapack_int LAPACKE_zherfs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_double* a,
-                           lapack_int lda, const lapack_complex_double* af,
-                           lapack_int ldaf, const lapack_int* ipiv,
-                           const lapack_complex_double* b, lapack_int ldb,
-                           lapack_complex_double* x, lapack_int ldx,
-                           double* ferr, double* berr );
+lapack_int LAPACKE_cherfs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_float* a,
+                          lapack_int lda, const lapack_complex_float* af, lapack_int ldaf, const lapack_int* ipiv,
+                          const lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x, lapack_int ldx,
+                          float* ferr, float* berr);
+lapack_int LAPACKE_zherfs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double* a,
+                          lapack_int lda, const lapack_complex_double* af, lapack_int ldaf, const lapack_int* ipiv,
+                          const lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x, lapack_int ldx,
+                          double* ferr, double* berr);
 
-lapack_int LAPACKE_cherfsx( int matrix_order, char uplo, char equed,
-                            lapack_int n, lapack_int nrhs,
-                            const lapack_complex_float* a, lapack_int lda,
-                            const lapack_complex_float* af, lapack_int ldaf,
-                            const lapack_int* ipiv, const float* s,
-                            const lapack_complex_float* b, lapack_int ldb,
-                            lapack_complex_float* x, lapack_int ldx,
-                            float* rcond, float* berr, lapack_int n_err_bnds,
-                            float* err_bnds_norm, float* err_bnds_comp,
-                            lapack_int nparams, float* params );
-lapack_int LAPACKE_zherfsx( int matrix_order, char uplo, char equed,
-                            lapack_int n, lapack_int nrhs,
-                            const lapack_complex_double* a, lapack_int lda,
-                            const lapack_complex_double* af, lapack_int ldaf,
-                            const lapack_int* ipiv, const double* s,
-                            const lapack_complex_double* b, lapack_int ldb,
-                            lapack_complex_double* x, lapack_int ldx,
-                            double* rcond, double* berr, lapack_int n_err_bnds,
-                            double* err_bnds_norm, double* err_bnds_comp,
-                            lapack_int nparams, double* params );
+lapack_int LAPACKE_cherfsx(int matrix_order, char uplo, char equed, lapack_int n, lapack_int nrhs,
+                           const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* af,
+                           lapack_int ldaf, const lapack_int* ipiv, const float* s, const lapack_complex_float* b,
+                           lapack_int ldb, lapack_complex_float* x, lapack_int ldx, float* rcond, float* berr,
+                           lapack_int n_err_bnds, float* err_bnds_norm, float* err_bnds_comp, lapack_int nparams,
+                           float* params);
+lapack_int LAPACKE_zherfsx(int matrix_order, char uplo, char equed, lapack_int n, lapack_int nrhs,
+                           const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* af,
+                           lapack_int ldaf, const lapack_int* ipiv, const double* s, const lapack_complex_double* b,
+                           lapack_int ldb, lapack_complex_double* x, lapack_int ldx, double* rcond, double* berr,
+                           lapack_int n_err_bnds, double* err_bnds_norm, double* err_bnds_comp, lapack_int nparams,
+                           double* params);
 
-lapack_int LAPACKE_chesv( int matrix_order, char uplo, lapack_int n,
-                          lapack_int nrhs, lapack_complex_float* a,
-                          lapack_int lda, lapack_int* ipiv,
-                          lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_zhesv( int matrix_order, char uplo, lapack_int n,
-                          lapack_int nrhs, lapack_complex_double* a,
-                          lapack_int lda, lapack_int* ipiv,
-                          lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_chesv(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_float* a,
+                         lapack_int lda, lapack_int* ipiv, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zhesv(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double* a,
+                         lapack_int lda, lapack_int* ipiv, lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_chesvx( int matrix_order, char fact, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_float* a,
-                           lapack_int lda, lapack_complex_float* af,
-                           lapack_int ldaf, lapack_int* ipiv,
-                           const lapack_complex_float* b, lapack_int ldb,
-                           lapack_complex_float* x, lapack_int ldx,
-                           float* rcond, float* ferr, float* berr );
-lapack_int LAPACKE_zhesvx( int matrix_order, char fact, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_double* a,
-                           lapack_int lda, lapack_complex_double* af,
-                           lapack_int ldaf, lapack_int* ipiv,
-                           const lapack_complex_double* b, lapack_int ldb,
-                           lapack_complex_double* x, lapack_int ldx,
-                           double* rcond, double* ferr, double* berr );
+lapack_int LAPACKE_chesvx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                          const lapack_complex_float* a, lapack_int lda, lapack_complex_float* af, lapack_int ldaf,
+                          lapack_int* ipiv, const lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x,
+                          lapack_int ldx, float* rcond, float* ferr, float* berr);
+lapack_int LAPACKE_zhesvx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                          const lapack_complex_double* a, lapack_int lda, lapack_complex_double* af, lapack_int ldaf,
+                          lapack_int* ipiv, const lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x,
+                          lapack_int ldx, double* rcond, double* ferr, double* berr);
 
-lapack_int LAPACKE_chesvxx( int matrix_order, char fact, char uplo,
-                            lapack_int n, lapack_int nrhs,
-                            lapack_complex_float* a, lapack_int lda,
-                            lapack_complex_float* af, lapack_int ldaf,
-                            lapack_int* ipiv, char* equed, float* s,
-                            lapack_complex_float* b, lapack_int ldb,
-                            lapack_complex_float* x, lapack_int ldx,
-                            float* rcond, float* rpvgrw, float* berr,
-                            lapack_int n_err_bnds, float* err_bnds_norm,
-                            float* err_bnds_comp, lapack_int nparams,
-                            float* params );
-lapack_int LAPACKE_zhesvxx( int matrix_order, char fact, char uplo,
-                            lapack_int n, lapack_int nrhs,
-                            lapack_complex_double* a, lapack_int lda,
-                            lapack_complex_double* af, lapack_int ldaf,
-                            lapack_int* ipiv, char* equed, double* s,
-                            lapack_complex_double* b, lapack_int ldb,
-                            lapack_complex_double* x, lapack_int ldx,
-                            double* rcond, double* rpvgrw, double* berr,
-                            lapack_int n_err_bnds, double* err_bnds_norm,
-                            double* err_bnds_comp, lapack_int nparams,
-                            double* params );
+lapack_int LAPACKE_chesvxx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                           lapack_complex_float* a, lapack_int lda, lapack_complex_float* af, lapack_int ldaf,
+                           lapack_int* ipiv, char* equed, float* s, lapack_complex_float* b, lapack_int ldb,
+                           lapack_complex_float* x, lapack_int ldx, float* rcond, float* rpvgrw, float* berr,
+                           lapack_int n_err_bnds, float* err_bnds_norm, float* err_bnds_comp, lapack_int nparams,
+                           float* params);
+lapack_int LAPACKE_zhesvxx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                           lapack_complex_double* a, lapack_int lda, lapack_complex_double* af, lapack_int ldaf,
+                           lapack_int* ipiv, char* equed, double* s, lapack_complex_double* b, lapack_int ldb,
+                           lapack_complex_double* x, lapack_int ldx, double* rcond, double* rpvgrw, double* berr,
+                           lapack_int n_err_bnds, double* err_bnds_norm, double* err_bnds_comp, lapack_int nparams,
+                           double* params);
 
-lapack_int LAPACKE_chetrd( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda, float* d,
-                           float* e, lapack_complex_float* tau );
-lapack_int LAPACKE_zhetrd( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda, double* d,
-                           double* e, lapack_complex_double* tau );
+lapack_int LAPACKE_chetrd(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda, float* d,
+                          float* e, lapack_complex_float* tau);
+lapack_int LAPACKE_zhetrd(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                          double* d, double* e, lapack_complex_double* tau);
 
-lapack_int LAPACKE_chetrf( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda,
-                           lapack_int* ipiv );
-lapack_int LAPACKE_zhetrf( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_int* ipiv );
+lapack_int LAPACKE_chetrf(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                          lapack_int* ipiv);
+lapack_int LAPACKE_zhetrf(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                          lapack_int* ipiv);
 
-lapack_int LAPACKE_chetri( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda,
-                           const lapack_int* ipiv );
-lapack_int LAPACKE_zhetri( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda,
-                           const lapack_int* ipiv );
+lapack_int LAPACKE_chetri(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                          const lapack_int* ipiv);
+lapack_int LAPACKE_zhetri(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                          const lapack_int* ipiv);
 
-lapack_int LAPACKE_chetrs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_float* a,
-                           lapack_int lda, const lapack_int* ipiv,
-                           lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_zhetrs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_double* a,
-                           lapack_int lda, const lapack_int* ipiv,
-                           lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_chetrs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_float* a,
+                          lapack_int lda, const lapack_int* ipiv, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zhetrs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double* a,
+                          lapack_int lda, const lapack_int* ipiv, lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_chfrk( int matrix_order, char transr, char uplo, char trans,
-                          lapack_int n, lapack_int k, float alpha,
-                          const lapack_complex_float* a, lapack_int lda,
-                          float beta, lapack_complex_float* c );
-lapack_int LAPACKE_zhfrk( int matrix_order, char transr, char uplo, char trans,
-                          lapack_int n, lapack_int k, double alpha,
-                          const lapack_complex_double* a, lapack_int lda,
-                          double beta, lapack_complex_double* c );
+lapack_int LAPACKE_chfrk(int matrix_order, char transr, char uplo, char trans, lapack_int n, lapack_int k, float alpha,
+                         const lapack_complex_float* a, lapack_int lda, float beta, lapack_complex_float* c);
+lapack_int LAPACKE_zhfrk(int matrix_order, char transr, char uplo, char trans, lapack_int n, lapack_int k, double alpha,
+                         const lapack_complex_double* a, lapack_int lda, double beta, lapack_complex_double* c);
 
-lapack_int LAPACKE_shgeqz( int matrix_order, char job, char compq, char compz,
-                           lapack_int n, lapack_int ilo, lapack_int ihi,
-                           float* h, lapack_int ldh, float* t, lapack_int ldt,
-                           float* alphar, float* alphai, float* beta, float* q,
-                           lapack_int ldq, float* z, lapack_int ldz );
-lapack_int LAPACKE_dhgeqz( int matrix_order, char job, char compq, char compz,
-                           lapack_int n, lapack_int ilo, lapack_int ihi,
-                           double* h, lapack_int ldh, double* t, lapack_int ldt,
-                           double* alphar, double* alphai, double* beta,
-                           double* q, lapack_int ldq, double* z,
-                           lapack_int ldz );
-lapack_int LAPACKE_chgeqz( int matrix_order, char job, char compq, char compz,
-                           lapack_int n, lapack_int ilo, lapack_int ihi,
-                           lapack_complex_float* h, lapack_int ldh,
-                           lapack_complex_float* t, lapack_int ldt,
-                           lapack_complex_float* alpha,
-                           lapack_complex_float* beta, lapack_complex_float* q,
-                           lapack_int ldq, lapack_complex_float* z,
-                           lapack_int ldz );
-lapack_int LAPACKE_zhgeqz( int matrix_order, char job, char compq, char compz,
-                           lapack_int n, lapack_int ilo, lapack_int ihi,
-                           lapack_complex_double* h, lapack_int ldh,
-                           lapack_complex_double* t, lapack_int ldt,
-                           lapack_complex_double* alpha,
-                           lapack_complex_double* beta,
-                           lapack_complex_double* q, lapack_int ldq,
-                           lapack_complex_double* z, lapack_int ldz );
+lapack_int LAPACKE_shgeqz(int matrix_order, char job, char compq, char compz, lapack_int n, lapack_int ilo,
+                          lapack_int ihi, float* h, lapack_int ldh, float* t, lapack_int ldt, float* alphar,
+                          float* alphai, float* beta, float* q, lapack_int ldq, float* z, lapack_int ldz);
+lapack_int LAPACKE_dhgeqz(int matrix_order, char job, char compq, char compz, lapack_int n, lapack_int ilo,
+                          lapack_int ihi, double* h, lapack_int ldh, double* t, lapack_int ldt, double* alphar,
+                          double* alphai, double* beta, double* q, lapack_int ldq, double* z, lapack_int ldz);
+lapack_int LAPACKE_chgeqz(int matrix_order, char job, char compq, char compz, lapack_int n, lapack_int ilo,
+                          lapack_int ihi, lapack_complex_float* h, lapack_int ldh, lapack_complex_float* t,
+                          lapack_int ldt, lapack_complex_float* alpha, lapack_complex_float* beta,
+                          lapack_complex_float* q, lapack_int ldq, lapack_complex_float* z, lapack_int ldz);
+lapack_int LAPACKE_zhgeqz(int matrix_order, char job, char compq, char compz, lapack_int n, lapack_int ilo,
+                          lapack_int ihi, lapack_complex_double* h, lapack_int ldh, lapack_complex_double* t,
+                          lapack_int ldt, lapack_complex_double* alpha, lapack_complex_double* beta,
+                          lapack_complex_double* q, lapack_int ldq, lapack_complex_double* z, lapack_int ldz);
 
-lapack_int LAPACKE_chpcon( int matrix_order, char uplo, lapack_int n,
-                           const lapack_complex_float* ap,
-                           const lapack_int* ipiv, float anorm, float* rcond );
-lapack_int LAPACKE_zhpcon( int matrix_order, char uplo, lapack_int n,
-                           const lapack_complex_double* ap,
-                           const lapack_int* ipiv, double anorm,
-                           double* rcond );
+lapack_int LAPACKE_chpcon(int matrix_order, char uplo, lapack_int n, const lapack_complex_float* ap,
+                          const lapack_int* ipiv, float anorm, float* rcond);
+lapack_int LAPACKE_zhpcon(int matrix_order, char uplo, lapack_int n, const lapack_complex_double* ap,
+                          const lapack_int* ipiv, double anorm, double* rcond);
 
-lapack_int LAPACKE_chpev( int matrix_order, char jobz, char uplo, lapack_int n,
-                          lapack_complex_float* ap, float* w,
-                          lapack_complex_float* z, lapack_int ldz );
-lapack_int LAPACKE_zhpev( int matrix_order, char jobz, char uplo, lapack_int n,
-                          lapack_complex_double* ap, double* w,
-                          lapack_complex_double* z, lapack_int ldz );
+lapack_int LAPACKE_chpev(int matrix_order, char jobz, char uplo, lapack_int n, lapack_complex_float* ap, float* w,
+                         lapack_complex_float* z, lapack_int ldz);
+lapack_int LAPACKE_zhpev(int matrix_order, char jobz, char uplo, lapack_int n, lapack_complex_double* ap, double* w,
+                         lapack_complex_double* z, lapack_int ldz);
 
-lapack_int LAPACKE_chpevd( int matrix_order, char jobz, char uplo, lapack_int n,
-                           lapack_complex_float* ap, float* w,
-                           lapack_complex_float* z, lapack_int ldz );
-lapack_int LAPACKE_zhpevd( int matrix_order, char jobz, char uplo, lapack_int n,
-                           lapack_complex_double* ap, double* w,
-                           lapack_complex_double* z, lapack_int ldz );
+lapack_int LAPACKE_chpevd(int matrix_order, char jobz, char uplo, lapack_int n, lapack_complex_float* ap, float* w,
+                          lapack_complex_float* z, lapack_int ldz);
+lapack_int LAPACKE_zhpevd(int matrix_order, char jobz, char uplo, lapack_int n, lapack_complex_double* ap, double* w,
+                          lapack_complex_double* z, lapack_int ldz);
 
-lapack_int LAPACKE_chpevx( int matrix_order, char jobz, char range, char uplo,
-                           lapack_int n, lapack_complex_float* ap, float vl,
-                           float vu, lapack_int il, lapack_int iu, float abstol,
-                           lapack_int* m, float* w, lapack_complex_float* z,
-                           lapack_int ldz, lapack_int* ifail );
-lapack_int LAPACKE_zhpevx( int matrix_order, char jobz, char range, char uplo,
-                           lapack_int n, lapack_complex_double* ap, double vl,
-                           double vu, lapack_int il, lapack_int iu,
-                           double abstol, lapack_int* m, double* w,
-                           lapack_complex_double* z, lapack_int ldz,
-                           lapack_int* ifail );
+lapack_int LAPACKE_chpevx(int matrix_order, char jobz, char range, char uplo, lapack_int n, lapack_complex_float* ap,
+                          float vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int* m, float* w,
+                          lapack_complex_float* z, lapack_int ldz, lapack_int* ifail);
+lapack_int LAPACKE_zhpevx(int matrix_order, char jobz, char range, char uplo, lapack_int n, lapack_complex_double* ap,
+                          double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int* m, double* w,
+                          lapack_complex_double* z, lapack_int ldz, lapack_int* ifail);
 
-lapack_int LAPACKE_chpgst( int matrix_order, lapack_int itype, char uplo,
-                           lapack_int n, lapack_complex_float* ap,
-                           const lapack_complex_float* bp );
-lapack_int LAPACKE_zhpgst( int matrix_order, lapack_int itype, char uplo,
-                           lapack_int n, lapack_complex_double* ap,
-                           const lapack_complex_double* bp );
+lapack_int LAPACKE_chpgst(int matrix_order, lapack_int itype, char uplo, lapack_int n, lapack_complex_float* ap,
+                          const lapack_complex_float* bp);
+lapack_int LAPACKE_zhpgst(int matrix_order, lapack_int itype, char uplo, lapack_int n, lapack_complex_double* ap,
+                          const lapack_complex_double* bp);
 
-lapack_int LAPACKE_chpgv( int matrix_order, lapack_int itype, char jobz,
-                          char uplo, lapack_int n, lapack_complex_float* ap,
-                          lapack_complex_float* bp, float* w,
-                          lapack_complex_float* z, lapack_int ldz );
-lapack_int LAPACKE_zhpgv( int matrix_order, lapack_int itype, char jobz,
-                          char uplo, lapack_int n, lapack_complex_double* ap,
-                          lapack_complex_double* bp, double* w,
-                          lapack_complex_double* z, lapack_int ldz );
+lapack_int LAPACKE_chpgv(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n,
+                         lapack_complex_float* ap, lapack_complex_float* bp, float* w, lapack_complex_float* z,
+                         lapack_int ldz);
+lapack_int LAPACKE_zhpgv(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n,
+                         lapack_complex_double* ap, lapack_complex_double* bp, double* w, lapack_complex_double* z,
+                         lapack_int ldz);
 
-lapack_int LAPACKE_chpgvd( int matrix_order, lapack_int itype, char jobz,
-                           char uplo, lapack_int n, lapack_complex_float* ap,
-                           lapack_complex_float* bp, float* w,
-                           lapack_complex_float* z, lapack_int ldz );
-lapack_int LAPACKE_zhpgvd( int matrix_order, lapack_int itype, char jobz,
-                           char uplo, lapack_int n, lapack_complex_double* ap,
-                           lapack_complex_double* bp, double* w,
-                           lapack_complex_double* z, lapack_int ldz );
+lapack_int LAPACKE_chpgvd(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n,
+                          lapack_complex_float* ap, lapack_complex_float* bp, float* w, lapack_complex_float* z,
+                          lapack_int ldz);
+lapack_int LAPACKE_zhpgvd(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n,
+                          lapack_complex_double* ap, lapack_complex_double* bp, double* w, lapack_complex_double* z,
+                          lapack_int ldz);
 
-lapack_int LAPACKE_chpgvx( int matrix_order, lapack_int itype, char jobz,
-                           char range, char uplo, lapack_int n,
-                           lapack_complex_float* ap, lapack_complex_float* bp,
-                           float vl, float vu, lapack_int il, lapack_int iu,
-                           float abstol, lapack_int* m, float* w,
-                           lapack_complex_float* z, lapack_int ldz,
-                           lapack_int* ifail );
-lapack_int LAPACKE_zhpgvx( int matrix_order, lapack_int itype, char jobz,
-                           char range, char uplo, lapack_int n,
-                           lapack_complex_double* ap, lapack_complex_double* bp,
-                           double vl, double vu, lapack_int il, lapack_int iu,
-                           double abstol, lapack_int* m, double* w,
-                           lapack_complex_double* z, lapack_int ldz,
-                           lapack_int* ifail );
+lapack_int LAPACKE_chpgvx(int matrix_order, lapack_int itype, char jobz, char range, char uplo, lapack_int n,
+                          lapack_complex_float* ap, lapack_complex_float* bp, float vl, float vu, lapack_int il,
+                          lapack_int iu, float abstol, lapack_int* m, float* w, lapack_complex_float* z, lapack_int ldz,
+                          lapack_int* ifail);
+lapack_int LAPACKE_zhpgvx(int matrix_order, lapack_int itype, char jobz, char range, char uplo, lapack_int n,
+                          lapack_complex_double* ap, lapack_complex_double* bp, double vl, double vu, lapack_int il,
+                          lapack_int iu, double abstol, lapack_int* m, double* w, lapack_complex_double* z,
+                          lapack_int ldz, lapack_int* ifail);
 
-lapack_int LAPACKE_chprfs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_float* ap,
-                           const lapack_complex_float* afp,
-                           const lapack_int* ipiv,
-                           const lapack_complex_float* b, lapack_int ldb,
-                           lapack_complex_float* x, lapack_int ldx, float* ferr,
-                           float* berr );
-lapack_int LAPACKE_zhprfs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_double* ap,
-                           const lapack_complex_double* afp,
-                           const lapack_int* ipiv,
-                           const lapack_complex_double* b, lapack_int ldb,
-                           lapack_complex_double* x, lapack_int ldx,
-                           double* ferr, double* berr );
+lapack_int LAPACKE_chprfs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_float* ap,
+                          const lapack_complex_float* afp, const lapack_int* ipiv, const lapack_complex_float* b,
+                          lapack_int ldb, lapack_complex_float* x, lapack_int ldx, float* ferr, float* berr);
+lapack_int LAPACKE_zhprfs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double* ap,
+                          const lapack_complex_double* afp, const lapack_int* ipiv, const lapack_complex_double* b,
+                          lapack_int ldb, lapack_complex_double* x, lapack_int ldx, double* ferr, double* berr);
 
-lapack_int LAPACKE_chpsv( int matrix_order, char uplo, lapack_int n,
-                          lapack_int nrhs, lapack_complex_float* ap,
-                          lapack_int* ipiv, lapack_complex_float* b,
-                          lapack_int ldb );
-lapack_int LAPACKE_zhpsv( int matrix_order, char uplo, lapack_int n,
-                          lapack_int nrhs, lapack_complex_double* ap,
-                          lapack_int* ipiv, lapack_complex_double* b,
-                          lapack_int ldb );
+lapack_int LAPACKE_chpsv(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_float* ap,
+                         lapack_int* ipiv, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zhpsv(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double* ap,
+                         lapack_int* ipiv, lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_chpsvx( int matrix_order, char fact, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_float* ap,
-                           lapack_complex_float* afp, lapack_int* ipiv,
-                           const lapack_complex_float* b, lapack_int ldb,
-                           lapack_complex_float* x, lapack_int ldx,
-                           float* rcond, float* ferr, float* berr );
-lapack_int LAPACKE_zhpsvx( int matrix_order, char fact, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_double* ap,
-                           lapack_complex_double* afp, lapack_int* ipiv,
-                           const lapack_complex_double* b, lapack_int ldb,
-                           lapack_complex_double* x, lapack_int ldx,
-                           double* rcond, double* ferr, double* berr );
+lapack_int LAPACKE_chpsvx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                          const lapack_complex_float* ap, lapack_complex_float* afp, lapack_int* ipiv,
+                          const lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x, lapack_int ldx,
+                          float* rcond, float* ferr, float* berr);
+lapack_int LAPACKE_zhpsvx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                          const lapack_complex_double* ap, lapack_complex_double* afp, lapack_int* ipiv,
+                          const lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x, lapack_int ldx,
+                          double* rcond, double* ferr, double* berr);
 
-lapack_int LAPACKE_chptrd( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_float* ap, float* d, float* e,
-                           lapack_complex_float* tau );
-lapack_int LAPACKE_zhptrd( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_double* ap, double* d, double* e,
-                           lapack_complex_double* tau );
+lapack_int LAPACKE_chptrd(int matrix_order, char uplo, lapack_int n, lapack_complex_float* ap, float* d, float* e,
+                          lapack_complex_float* tau);
+lapack_int LAPACKE_zhptrd(int matrix_order, char uplo, lapack_int n, lapack_complex_double* ap, double* d, double* e,
+                          lapack_complex_double* tau);
 
-lapack_int LAPACKE_chptrf( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_float* ap, lapack_int* ipiv );
-lapack_int LAPACKE_zhptrf( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_double* ap, lapack_int* ipiv );
+lapack_int LAPACKE_chptrf(int matrix_order, char uplo, lapack_int n, lapack_complex_float* ap, lapack_int* ipiv);
+lapack_int LAPACKE_zhptrf(int matrix_order, char uplo, lapack_int n, lapack_complex_double* ap, lapack_int* ipiv);
 
-lapack_int LAPACKE_chptri( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_float* ap, const lapack_int* ipiv );
-lapack_int LAPACKE_zhptri( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_double* ap, const lapack_int* ipiv );
+lapack_int LAPACKE_chptri(int matrix_order, char uplo, lapack_int n, lapack_complex_float* ap, const lapack_int* ipiv);
+lapack_int LAPACKE_zhptri(int matrix_order, char uplo, lapack_int n, lapack_complex_double* ap, const lapack_int* ipiv);
 
-lapack_int LAPACKE_chptrs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_float* ap,
-                           const lapack_int* ipiv, lapack_complex_float* b,
-                           lapack_int ldb );
-lapack_int LAPACKE_zhptrs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_double* ap,
-                           const lapack_int* ipiv, lapack_complex_double* b,
-                           lapack_int ldb );
+lapack_int LAPACKE_chptrs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_float* ap,
+                          const lapack_int* ipiv, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zhptrs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double* ap,
+                          const lapack_int* ipiv, lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_shsein( int matrix_order, char job, char eigsrc, char initv,
-                           lapack_logical* select, lapack_int n, const float* h,
-                           lapack_int ldh, float* wr, const float* wi,
-                           float* vl, lapack_int ldvl, float* vr,
-                           lapack_int ldvr, lapack_int mm, lapack_int* m,
-                           lapack_int* ifaill, lapack_int* ifailr );
-lapack_int LAPACKE_dhsein( int matrix_order, char job, char eigsrc, char initv,
-                           lapack_logical* select, lapack_int n,
-                           const double* h, lapack_int ldh, double* wr,
-                           const double* wi, double* vl, lapack_int ldvl,
-                           double* vr, lapack_int ldvr, lapack_int mm,
-                           lapack_int* m, lapack_int* ifaill,
-                           lapack_int* ifailr );
-lapack_int LAPACKE_chsein( int matrix_order, char job, char eigsrc, char initv,
-                           const lapack_logical* select, lapack_int n,
-                           const lapack_complex_float* h, lapack_int ldh,
-                           lapack_complex_float* w, lapack_complex_float* vl,
-                           lapack_int ldvl, lapack_complex_float* vr,
-                           lapack_int ldvr, lapack_int mm, lapack_int* m,
-                           lapack_int* ifaill, lapack_int* ifailr );
-lapack_int LAPACKE_zhsein( int matrix_order, char job, char eigsrc, char initv,
-                           const lapack_logical* select, lapack_int n,
-                           const lapack_complex_double* h, lapack_int ldh,
-                           lapack_complex_double* w, lapack_complex_double* vl,
-                           lapack_int ldvl, lapack_complex_double* vr,
-                           lapack_int ldvr, lapack_int mm, lapack_int* m,
-                           lapack_int* ifaill, lapack_int* ifailr );
+lapack_int LAPACKE_shsein(int matrix_order, char job, char eigsrc, char initv, lapack_logical* select, lapack_int n,
+                          const float* h, lapack_int ldh, float* wr, const float* wi, float* vl, lapack_int ldvl,
+                          float* vr, lapack_int ldvr, lapack_int mm, lapack_int* m, lapack_int* ifaill,
+                          lapack_int* ifailr);
+lapack_int LAPACKE_dhsein(int matrix_order, char job, char eigsrc, char initv, lapack_logical* select, lapack_int n,
+                          const double* h, lapack_int ldh, double* wr, const double* wi, double* vl, lapack_int ldvl,
+                          double* vr, lapack_int ldvr, lapack_int mm, lapack_int* m, lapack_int* ifaill,
+                          lapack_int* ifailr);
+lapack_int LAPACKE_chsein(int matrix_order, char job, char eigsrc, char initv, const lapack_logical* select,
+                          lapack_int n, const lapack_complex_float* h, lapack_int ldh, lapack_complex_float* w,
+                          lapack_complex_float* vl, lapack_int ldvl, lapack_complex_float* vr, lapack_int ldvr,
+                          lapack_int mm, lapack_int* m, lapack_int* ifaill, lapack_int* ifailr);
+lapack_int LAPACKE_zhsein(int matrix_order, char job, char eigsrc, char initv, const lapack_logical* select,
+                          lapack_int n, const lapack_complex_double* h, lapack_int ldh, lapack_complex_double* w,
+                          lapack_complex_double* vl, lapack_int ldvl, lapack_complex_double* vr, lapack_int ldvr,
+                          lapack_int mm, lapack_int* m, lapack_int* ifaill, lapack_int* ifailr);
 
-lapack_int LAPACKE_shseqr( int matrix_order, char job, char compz, lapack_int n,
-                           lapack_int ilo, lapack_int ihi, float* h,
-                           lapack_int ldh, float* wr, float* wi, float* z,
-                           lapack_int ldz );
-lapack_int LAPACKE_dhseqr( int matrix_order, char job, char compz, lapack_int n,
-                           lapack_int ilo, lapack_int ihi, double* h,
-                           lapack_int ldh, double* wr, double* wi, double* z,
-                           lapack_int ldz );
-lapack_int LAPACKE_chseqr( int matrix_order, char job, char compz, lapack_int n,
-                           lapack_int ilo, lapack_int ihi,
-                           lapack_complex_float* h, lapack_int ldh,
-                           lapack_complex_float* w, lapack_complex_float* z,
-                           lapack_int ldz );
-lapack_int LAPACKE_zhseqr( int matrix_order, char job, char compz, lapack_int n,
-                           lapack_int ilo, lapack_int ihi,
-                           lapack_complex_double* h, lapack_int ldh,
-                           lapack_complex_double* w, lapack_complex_double* z,
-                           lapack_int ldz );
+lapack_int LAPACKE_shseqr(int matrix_order, char job, char compz, lapack_int n, lapack_int ilo, lapack_int ihi,
+                          float* h, lapack_int ldh, float* wr, float* wi, float* z, lapack_int ldz);
+lapack_int LAPACKE_dhseqr(int matrix_order, char job, char compz, lapack_int n, lapack_int ilo, lapack_int ihi,
+                          double* h, lapack_int ldh, double* wr, double* wi, double* z, lapack_int ldz);
+lapack_int LAPACKE_chseqr(int matrix_order, char job, char compz, lapack_int n, lapack_int ilo, lapack_int ihi,
+                          lapack_complex_float* h, lapack_int ldh, lapack_complex_float* w, lapack_complex_float* z,
+                          lapack_int ldz);
+lapack_int LAPACKE_zhseqr(int matrix_order, char job, char compz, lapack_int n, lapack_int ilo, lapack_int ihi,
+                          lapack_complex_double* h, lapack_int ldh, lapack_complex_double* w, lapack_complex_double* z,
+                          lapack_int ldz);
 
-lapack_int LAPACKE_clacgv( lapack_int n, lapack_complex_float* x,
-                           lapack_int incx );
-lapack_int LAPACKE_zlacgv( lapack_int n, lapack_complex_double* x,
-                           lapack_int incx );
+lapack_int LAPACKE_clacgv(lapack_int n, lapack_complex_float* x, lapack_int incx);
+lapack_int LAPACKE_zlacgv(lapack_int n, lapack_complex_double* x, lapack_int incx);
 
-lapack_int LAPACKE_slacpy( int matrix_order, char uplo, lapack_int m,
-                           lapack_int n, const float* a, lapack_int lda, float* b,
-                           lapack_int ldb );
-lapack_int LAPACKE_dlacpy( int matrix_order, char uplo, lapack_int m,
-                           lapack_int n, const double* a, lapack_int lda, double* b,
-                           lapack_int ldb );
-lapack_int LAPACKE_clacpy( int matrix_order, char uplo, lapack_int m,
-                           lapack_int n, const lapack_complex_float* a,
-                           lapack_int lda, lapack_complex_float* b,
-                           lapack_int ldb );
-lapack_int LAPACKE_zlacpy( int matrix_order, char uplo, lapack_int m,
-                           lapack_int n, const lapack_complex_double* a,
-                           lapack_int lda, lapack_complex_double* b,
-                           lapack_int ldb );
+lapack_int LAPACKE_slacpy(int matrix_order, char uplo, lapack_int m, lapack_int n, const float* a, lapack_int lda,
+                          float* b, lapack_int ldb);
+lapack_int LAPACKE_dlacpy(int matrix_order, char uplo, lapack_int m, lapack_int n, const double* a, lapack_int lda,
+                          double* b, lapack_int ldb);
+lapack_int LAPACKE_clacpy(int matrix_order, char uplo, lapack_int m, lapack_int n, const lapack_complex_float* a,
+                          lapack_int lda, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zlacpy(int matrix_order, char uplo, lapack_int m, lapack_int n, const lapack_complex_double* a,
+                          lapack_int lda, lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_zlag2c( int matrix_order, lapack_int m, lapack_int n,
-                           const lapack_complex_double* a, lapack_int lda,
-                           lapack_complex_float* sa, lapack_int ldsa );
+lapack_int LAPACKE_zlag2c(int matrix_order, lapack_int m, lapack_int n, const lapack_complex_double* a, lapack_int lda,
+                          lapack_complex_float* sa, lapack_int ldsa);
 
-lapack_int LAPACKE_slag2d( int matrix_order, lapack_int m, lapack_int n,
-                           const float* sa, lapack_int ldsa, double* a,
-                           lapack_int lda );
+lapack_int LAPACKE_slag2d(int matrix_order, lapack_int m, lapack_int n, const float* sa, lapack_int ldsa, double* a,
+                          lapack_int lda);
 
-lapack_int LAPACKE_dlag2s( int matrix_order, lapack_int m, lapack_int n,
-                           const double* a, lapack_int lda, float* sa,
-                           lapack_int ldsa );
+lapack_int LAPACKE_dlag2s(int matrix_order, lapack_int m, lapack_int n, const double* a, lapack_int lda, float* sa,
+                          lapack_int ldsa);
 
-lapack_int LAPACKE_clag2z( int matrix_order, lapack_int m, lapack_int n,
-                           const lapack_complex_float* sa, lapack_int ldsa,
-                           lapack_complex_double* a, lapack_int lda );
+lapack_int LAPACKE_clag2z(int matrix_order, lapack_int m, lapack_int n, const lapack_complex_float* sa, lapack_int ldsa,
+                          lapack_complex_double* a, lapack_int lda);
 
-lapack_int LAPACKE_slagge( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int kl, lapack_int ku, const float* d,
-                           float* a, lapack_int lda, lapack_int* iseed );
-lapack_int LAPACKE_dlagge( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int kl, lapack_int ku, const double* d,
-                           double* a, lapack_int lda, lapack_int* iseed );
-lapack_int LAPACKE_clagge( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int kl, lapack_int ku, const float* d,
-                           lapack_complex_float* a, lapack_int lda,
-                           lapack_int* iseed );
-lapack_int LAPACKE_zlagge( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int kl, lapack_int ku, const double* d,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_int* iseed );
+lapack_int LAPACKE_slagge(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku, const float* d,
+                          float* a, lapack_int lda, lapack_int* iseed);
+lapack_int LAPACKE_dlagge(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku, const double* d,
+                          double* a, lapack_int lda, lapack_int* iseed);
+lapack_int LAPACKE_clagge(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku, const float* d,
+                          lapack_complex_float* a, lapack_int lda, lapack_int* iseed);
+lapack_int LAPACKE_zlagge(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku, const double* d,
+                          lapack_complex_double* a, lapack_int lda, lapack_int* iseed);
 
-float LAPACKE_slamch( char cmach );
-double LAPACKE_dlamch( char cmach );
+float LAPACKE_slamch(char cmach);
+double LAPACKE_dlamch(char cmach);
 
-float LAPACKE_slange( int matrix_order, char norm, lapack_int m,
-                           lapack_int n, const float* a, lapack_int lda );
-double LAPACKE_dlange( int matrix_order, char norm, lapack_int m,
-                           lapack_int n, const double* a, lapack_int lda );
-float LAPACKE_clange( int matrix_order, char norm, lapack_int m,
-                           lapack_int n, const lapack_complex_float* a,
-                           lapack_int lda );
-double LAPACKE_zlange( int matrix_order, char norm, lapack_int m,
-                           lapack_int n, const lapack_complex_double* a,
-                           lapack_int lda );
+float LAPACKE_slange(int matrix_order, char norm, lapack_int m, lapack_int n, const float* a, lapack_int lda);
+double LAPACKE_dlange(int matrix_order, char norm, lapack_int m, lapack_int n, const double* a, lapack_int lda);
+float LAPACKE_clange(int matrix_order, char norm, lapack_int m, lapack_int n, const lapack_complex_float* a,
+                     lapack_int lda);
+double LAPACKE_zlange(int matrix_order, char norm, lapack_int m, lapack_int n, const lapack_complex_double* a,
+                      lapack_int lda);
 
-float LAPACKE_clanhe( int matrix_order, char norm, char uplo, lapack_int n,
-                           const lapack_complex_float* a, lapack_int lda );
-double LAPACKE_zlanhe( int matrix_order, char norm, char uplo, lapack_int n,
-                           const lapack_complex_double* a, lapack_int lda );
+float LAPACKE_clanhe(int matrix_order, char norm, char uplo, lapack_int n, const lapack_complex_float* a,
+                     lapack_int lda);
+double LAPACKE_zlanhe(int matrix_order, char norm, char uplo, lapack_int n, const lapack_complex_double* a,
+                      lapack_int lda);
 
-float LAPACKE_slansy( int matrix_order, char norm, char uplo, lapack_int n,
-                           const float* a, lapack_int lda );
-double LAPACKE_dlansy( int matrix_order, char norm, char uplo, lapack_int n,
-                           const double* a, lapack_int lda );
-float LAPACKE_clansy( int matrix_order, char norm, char uplo, lapack_int n,
-                           const lapack_complex_float* a, lapack_int lda );
-double LAPACKE_zlansy( int matrix_order, char norm, char uplo, lapack_int n,
-                           const lapack_complex_double* a, lapack_int lda );
+float LAPACKE_slansy(int matrix_order, char norm, char uplo, lapack_int n, const float* a, lapack_int lda);
+double LAPACKE_dlansy(int matrix_order, char norm, char uplo, lapack_int n, const double* a, lapack_int lda);
+float LAPACKE_clansy(int matrix_order, char norm, char uplo, lapack_int n, const lapack_complex_float* a,
+                     lapack_int lda);
+double LAPACKE_zlansy(int matrix_order, char norm, char uplo, lapack_int n, const lapack_complex_double* a,
+                      lapack_int lda);
 
-float LAPACKE_slantr( int matrix_order, char norm, char uplo, char diag,
-                           lapack_int m, lapack_int n, const float* a,
-                           lapack_int lda );
-double LAPACKE_dlantr( int matrix_order, char norm, char uplo, char diag,
-                           lapack_int m, lapack_int n, const double* a,
-                           lapack_int lda );
-float LAPACKE_clantr( int matrix_order, char norm, char uplo, char diag,
-                           lapack_int m, lapack_int n, const lapack_complex_float* a,
-                           lapack_int lda );
-double LAPACKE_zlantr( int matrix_order, char norm, char uplo, char diag,
-                           lapack_int m, lapack_int n, const lapack_complex_double* a,
-                           lapack_int lda );
+float LAPACKE_slantr(int matrix_order, char norm, char uplo, char diag, lapack_int m, lapack_int n, const float* a,
+                     lapack_int lda);
+double LAPACKE_dlantr(int matrix_order, char norm, char uplo, char diag, lapack_int m, lapack_int n, const double* a,
+                      lapack_int lda);
+float LAPACKE_clantr(int matrix_order, char norm, char uplo, char diag, lapack_int m, lapack_int n,
+                     const lapack_complex_float* a, lapack_int lda);
+double LAPACKE_zlantr(int matrix_order, char norm, char uplo, char diag, lapack_int m, lapack_int n,
+                      const lapack_complex_double* a, lapack_int lda);
 
+lapack_int LAPACKE_slarfb(int matrix_order, char side, char trans, char direct, char storev, lapack_int m, lapack_int n,
+                          lapack_int k, const float* v, lapack_int ldv, const float* t, lapack_int ldt, float* c,
+                          lapack_int ldc);
+lapack_int LAPACKE_dlarfb(int matrix_order, char side, char trans, char direct, char storev, lapack_int m, lapack_int n,
+                          lapack_int k, const double* v, lapack_int ldv, const double* t, lapack_int ldt, double* c,
+                          lapack_int ldc);
+lapack_int LAPACKE_clarfb(int matrix_order, char side, char trans, char direct, char storev, lapack_int m, lapack_int n,
+                          lapack_int k, const lapack_complex_float* v, lapack_int ldv, const lapack_complex_float* t,
+                          lapack_int ldt, lapack_complex_float* c, lapack_int ldc);
+lapack_int LAPACKE_zlarfb(int matrix_order, char side, char trans, char direct, char storev, lapack_int m, lapack_int n,
+                          lapack_int k, const lapack_complex_double* v, lapack_int ldv, const lapack_complex_double* t,
+                          lapack_int ldt, lapack_complex_double* c, lapack_int ldc);
 
-lapack_int LAPACKE_slarfb( int matrix_order, char side, char trans, char direct,
-                           char storev, lapack_int m, lapack_int n,
-                           lapack_int k, const float* v, lapack_int ldv,
-                           const float* t, lapack_int ldt, float* c,
-                           lapack_int ldc );
-lapack_int LAPACKE_dlarfb( int matrix_order, char side, char trans, char direct,
-                           char storev, lapack_int m, lapack_int n,
-                           lapack_int k, const double* v, lapack_int ldv,
-                           const double* t, lapack_int ldt, double* c,
-                           lapack_int ldc );
-lapack_int LAPACKE_clarfb( int matrix_order, char side, char trans, char direct,
-                           char storev, lapack_int m, lapack_int n,
-                           lapack_int k, const lapack_complex_float* v,
-                           lapack_int ldv, const lapack_complex_float* t,
-                           lapack_int ldt, lapack_complex_float* c,
-                           lapack_int ldc );
-lapack_int LAPACKE_zlarfb( int matrix_order, char side, char trans, char direct,
-                           char storev, lapack_int m, lapack_int n,
-                           lapack_int k, const lapack_complex_double* v,
-                           lapack_int ldv, const lapack_complex_double* t,
-                           lapack_int ldt, lapack_complex_double* c,
-                           lapack_int ldc );
+lapack_int LAPACKE_slarfg(lapack_int n, float* alpha, float* x, lapack_int incx, float* tau);
+lapack_int LAPACKE_dlarfg(lapack_int n, double* alpha, double* x, lapack_int incx, double* tau);
+lapack_int LAPACKE_clarfg(lapack_int n, lapack_complex_float* alpha, lapack_complex_float* x, lapack_int incx,
+                          lapack_complex_float* tau);
+lapack_int LAPACKE_zlarfg(lapack_int n, lapack_complex_double* alpha, lapack_complex_double* x, lapack_int incx,
+                          lapack_complex_double* tau);
 
-lapack_int LAPACKE_slarfg( lapack_int n, float* alpha, float* x,
-                           lapack_int incx, float* tau );
-lapack_int LAPACKE_dlarfg( lapack_int n, double* alpha, double* x,
-                           lapack_int incx, double* tau );
-lapack_int LAPACKE_clarfg( lapack_int n, lapack_complex_float* alpha,
-                           lapack_complex_float* x, lapack_int incx,
-                           lapack_complex_float* tau );
-lapack_int LAPACKE_zlarfg( lapack_int n, lapack_complex_double* alpha,
-                           lapack_complex_double* x, lapack_int incx,
-                           lapack_complex_double* tau );
+lapack_int LAPACKE_slarft(int matrix_order, char direct, char storev, lapack_int n, lapack_int k, const float* v,
+                          lapack_int ldv, const float* tau, float* t, lapack_int ldt);
+lapack_int LAPACKE_dlarft(int matrix_order, char direct, char storev, lapack_int n, lapack_int k, const double* v,
+                          lapack_int ldv, const double* tau, double* t, lapack_int ldt);
+lapack_int LAPACKE_clarft(int matrix_order, char direct, char storev, lapack_int n, lapack_int k,
+                          const lapack_complex_float* v, lapack_int ldv, const lapack_complex_float* tau,
+                          lapack_complex_float* t, lapack_int ldt);
+lapack_int LAPACKE_zlarft(int matrix_order, char direct, char storev, lapack_int n, lapack_int k,
+                          const lapack_complex_double* v, lapack_int ldv, const lapack_complex_double* tau,
+                          lapack_complex_double* t, lapack_int ldt);
 
-lapack_int LAPACKE_slarft( int matrix_order, char direct, char storev,
-                           lapack_int n, lapack_int k, const float* v,
-                           lapack_int ldv, const float* tau, float* t,
-                           lapack_int ldt );
-lapack_int LAPACKE_dlarft( int matrix_order, char direct, char storev,
-                           lapack_int n, lapack_int k, const double* v,
-                           lapack_int ldv, const double* tau, double* t,
-                           lapack_int ldt );
-lapack_int LAPACKE_clarft( int matrix_order, char direct, char storev,
-                           lapack_int n, lapack_int k,
-                           const lapack_complex_float* v, lapack_int ldv,
-                           const lapack_complex_float* tau,
-                           lapack_complex_float* t, lapack_int ldt );
-lapack_int LAPACKE_zlarft( int matrix_order, char direct, char storev,
-                           lapack_int n, lapack_int k,
-                           const lapack_complex_double* v, lapack_int ldv,
-                           const lapack_complex_double* tau,
-                           lapack_complex_double* t, lapack_int ldt );
+lapack_int LAPACKE_slarfx(int matrix_order, char side, lapack_int m, lapack_int n, const float* v, float tau, float* c,
+                          lapack_int ldc, float* work);
+lapack_int LAPACKE_dlarfx(int matrix_order, char side, lapack_int m, lapack_int n, const double* v, double tau,
+                          double* c, lapack_int ldc, double* work);
+lapack_int LAPACKE_clarfx(int matrix_order, char side, lapack_int m, lapack_int n, const lapack_complex_float* v,
+                          lapack_complex_float tau, lapack_complex_float* c, lapack_int ldc,
+                          lapack_complex_float* work);
+lapack_int LAPACKE_zlarfx(int matrix_order, char side, lapack_int m, lapack_int n, const lapack_complex_double* v,
+                          lapack_complex_double tau, lapack_complex_double* c, lapack_int ldc,
+                          lapack_complex_double* work);
 
-lapack_int LAPACKE_slarfx( int matrix_order, char side, lapack_int m,
-                           lapack_int n, const float* v, float tau, float* c,
-                           lapack_int ldc, float* work );
-lapack_int LAPACKE_dlarfx( int matrix_order, char side, lapack_int m,
-                           lapack_int n, const double* v, double tau, double* c,
-                           lapack_int ldc, double* work );
-lapack_int LAPACKE_clarfx( int matrix_order, char side, lapack_int m,
-                           lapack_int n, const lapack_complex_float* v,
-                           lapack_complex_float tau, lapack_complex_float* c,
-                           lapack_int ldc, lapack_complex_float* work );
-lapack_int LAPACKE_zlarfx( int matrix_order, char side, lapack_int m,
-                           lapack_int n, const lapack_complex_double* v,
-                           lapack_complex_double tau, lapack_complex_double* c,
-                           lapack_int ldc, lapack_complex_double* work );
+lapack_int LAPACKE_slarnv(lapack_int idist, lapack_int* iseed, lapack_int n, float* x);
+lapack_int LAPACKE_dlarnv(lapack_int idist, lapack_int* iseed, lapack_int n, double* x);
+lapack_int LAPACKE_clarnv(lapack_int idist, lapack_int* iseed, lapack_int n, lapack_complex_float* x);
+lapack_int LAPACKE_zlarnv(lapack_int idist, lapack_int* iseed, lapack_int n, lapack_complex_double* x);
 
-lapack_int LAPACKE_slarnv( lapack_int idist, lapack_int* iseed, lapack_int n,
-                           float* x );
-lapack_int LAPACKE_dlarnv( lapack_int idist, lapack_int* iseed, lapack_int n,
-                           double* x );
-lapack_int LAPACKE_clarnv( lapack_int idist, lapack_int* iseed, lapack_int n,
-                           lapack_complex_float* x );
-lapack_int LAPACKE_zlarnv( lapack_int idist, lapack_int* iseed, lapack_int n,
-                           lapack_complex_double* x );
+lapack_int LAPACKE_slaset(int matrix_order, char uplo, lapack_int m, lapack_int n, float alpha, float beta, float* a,
+                          lapack_int lda);
+lapack_int LAPACKE_dlaset(int matrix_order, char uplo, lapack_int m, lapack_int n, double alpha, double beta, double* a,
+                          lapack_int lda);
+lapack_int LAPACKE_claset(int matrix_order, char uplo, lapack_int m, lapack_int n, lapack_complex_float alpha,
+                          lapack_complex_float beta, lapack_complex_float* a, lapack_int lda);
+lapack_int LAPACKE_zlaset(int matrix_order, char uplo, lapack_int m, lapack_int n, lapack_complex_double alpha,
+                          lapack_complex_double beta, lapack_complex_double* a, lapack_int lda);
 
-lapack_int LAPACKE_slaset( int matrix_order, char uplo, lapack_int m,
-                           lapack_int n, float alpha, float beta, float* a,
-                           lapack_int lda );
-lapack_int LAPACKE_dlaset( int matrix_order, char uplo, lapack_int m,
-                           lapack_int n, double alpha, double beta, double* a,
-                           lapack_int lda );
-lapack_int LAPACKE_claset( int matrix_order, char uplo, lapack_int m,
-                           lapack_int n, lapack_complex_float alpha,
-                           lapack_complex_float beta, lapack_complex_float* a,
-                           lapack_int lda );
-lapack_int LAPACKE_zlaset( int matrix_order, char uplo, lapack_int m,
-                           lapack_int n, lapack_complex_double alpha,
-                           lapack_complex_double beta, lapack_complex_double* a,
-                           lapack_int lda );
+lapack_int LAPACKE_slasrt(char id, lapack_int n, float* d);
+lapack_int LAPACKE_dlasrt(char id, lapack_int n, double* d);
 
-lapack_int LAPACKE_slasrt( char id, lapack_int n, float* d );
-lapack_int LAPACKE_dlasrt( char id, lapack_int n, double* d );
+lapack_int LAPACKE_slaswp(int matrix_order, lapack_int n, float* a, lapack_int lda, lapack_int k1, lapack_int k2,
+                          const lapack_int* ipiv, lapack_int incx);
+lapack_int LAPACKE_dlaswp(int matrix_order, lapack_int n, double* a, lapack_int lda, lapack_int k1, lapack_int k2,
+                          const lapack_int* ipiv, lapack_int incx);
+lapack_int LAPACKE_claswp(int matrix_order, lapack_int n, lapack_complex_float* a, lapack_int lda, lapack_int k1,
+                          lapack_int k2, const lapack_int* ipiv, lapack_int incx);
+lapack_int LAPACKE_zlaswp(int matrix_order, lapack_int n, lapack_complex_double* a, lapack_int lda, lapack_int k1,
+                          lapack_int k2, const lapack_int* ipiv, lapack_int incx);
 
-lapack_int LAPACKE_slaswp( int matrix_order, lapack_int n, float* a,
-                           lapack_int lda, lapack_int k1, lapack_int k2,
-                           const lapack_int* ipiv, lapack_int incx );
-lapack_int LAPACKE_dlaswp( int matrix_order, lapack_int n, double* a,
-                           lapack_int lda, lapack_int k1, lapack_int k2,
-                           const lapack_int* ipiv, lapack_int incx );
-lapack_int LAPACKE_claswp( int matrix_order, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda,
-                           lapack_int k1, lapack_int k2, const lapack_int* ipiv,
-                           lapack_int incx );
-lapack_int LAPACKE_zlaswp( int matrix_order, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_int k1, lapack_int k2, const lapack_int* ipiv,
-                           lapack_int incx );
+lapack_int LAPACKE_slatms(int matrix_order, lapack_int m, lapack_int n, char dist, lapack_int* iseed, char sym,
+                          float* d, lapack_int mode, float cond, float dmax, lapack_int kl, lapack_int ku, char pack,
+                          float* a, lapack_int lda);
+lapack_int LAPACKE_dlatms(int matrix_order, lapack_int m, lapack_int n, char dist, lapack_int* iseed, char sym,
+                          double* d, lapack_int mode, double cond, double dmax, lapack_int kl, lapack_int ku, char pack,
+                          double* a, lapack_int lda);
+lapack_int LAPACKE_clatms(int matrix_order, lapack_int m, lapack_int n, char dist, lapack_int* iseed, char sym,
+                          float* d, lapack_int mode, float cond, float dmax, lapack_int kl, lapack_int ku, char pack,
+                          lapack_complex_float* a, lapack_int lda);
+lapack_int LAPACKE_zlatms(int matrix_order, lapack_int m, lapack_int n, char dist, lapack_int* iseed, char sym,
+                          double* d, lapack_int mode, double cond, double dmax, lapack_int kl, lapack_int ku, char pack,
+                          lapack_complex_double* a, lapack_int lda);
 
-lapack_int LAPACKE_slatms( int matrix_order, lapack_int m, lapack_int n,
-                           char dist, lapack_int* iseed, char sym, float* d,
-                           lapack_int mode, float cond, float dmax,
-                           lapack_int kl, lapack_int ku, char pack, float* a,
-                           lapack_int lda );
-lapack_int LAPACKE_dlatms( int matrix_order, lapack_int m, lapack_int n,
-                           char dist, lapack_int* iseed, char sym, double* d,
-                           lapack_int mode, double cond, double dmax,
-                           lapack_int kl, lapack_int ku, char pack, double* a,
-                           lapack_int lda );
-lapack_int LAPACKE_clatms( int matrix_order, lapack_int m, lapack_int n,
-                           char dist, lapack_int* iseed, char sym, float* d,
-                           lapack_int mode, float cond, float dmax,
-                           lapack_int kl, lapack_int ku, char pack,
-                           lapack_complex_float* a, lapack_int lda );
-lapack_int LAPACKE_zlatms( int matrix_order, lapack_int m, lapack_int n,
-                           char dist, lapack_int* iseed, char sym, double* d,
-                           lapack_int mode, double cond, double dmax,
-                           lapack_int kl, lapack_int ku, char pack,
-                           lapack_complex_double* a, lapack_int lda );
+lapack_int LAPACKE_slauum(int matrix_order, char uplo, lapack_int n, float* a, lapack_int lda);
+lapack_int LAPACKE_dlauum(int matrix_order, char uplo, lapack_int n, double* a, lapack_int lda);
+lapack_int LAPACKE_clauum(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda);
+lapack_int LAPACKE_zlauum(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int lda);
 
-lapack_int LAPACKE_slauum( int matrix_order, char uplo, lapack_int n, float* a,
-                           lapack_int lda );
-lapack_int LAPACKE_dlauum( int matrix_order, char uplo, lapack_int n, double* a,
-                           lapack_int lda );
-lapack_int LAPACKE_clauum( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda );
-lapack_int LAPACKE_zlauum( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda );
+lapack_int LAPACKE_sopgtr(int matrix_order, char uplo, lapack_int n, const float* ap, const float* tau, float* q,
+                          lapack_int ldq);
+lapack_int LAPACKE_dopgtr(int matrix_order, char uplo, lapack_int n, const double* ap, const double* tau, double* q,
+                          lapack_int ldq);
 
-lapack_int LAPACKE_sopgtr( int matrix_order, char uplo, lapack_int n,
-                           const float* ap, const float* tau, float* q,
-                           lapack_int ldq );
-lapack_int LAPACKE_dopgtr( int matrix_order, char uplo, lapack_int n,
-                           const double* ap, const double* tau, double* q,
-                           lapack_int ldq );
+lapack_int LAPACKE_sopmtr(int matrix_order, char side, char uplo, char trans, lapack_int m, lapack_int n,
+                          const float* ap, const float* tau, float* c, lapack_int ldc);
+lapack_int LAPACKE_dopmtr(int matrix_order, char side, char uplo, char trans, lapack_int m, lapack_int n,
+                          const double* ap, const double* tau, double* c, lapack_int ldc);
 
-lapack_int LAPACKE_sopmtr( int matrix_order, char side, char uplo, char trans,
-                           lapack_int m, lapack_int n, const float* ap,
-                           const float* tau, float* c, lapack_int ldc );
-lapack_int LAPACKE_dopmtr( int matrix_order, char side, char uplo, char trans,
-                           lapack_int m, lapack_int n, const double* ap,
-                           const double* tau, double* c, lapack_int ldc );
+lapack_int LAPACKE_sorgbr(int matrix_order, char vect, lapack_int m, lapack_int n, lapack_int k, float* a,
+                          lapack_int lda, const float* tau);
+lapack_int LAPACKE_dorgbr(int matrix_order, char vect, lapack_int m, lapack_int n, lapack_int k, double* a,
+                          lapack_int lda, const double* tau);
 
-lapack_int LAPACKE_sorgbr( int matrix_order, char vect, lapack_int m,
-                           lapack_int n, lapack_int k, float* a, lapack_int lda,
-                           const float* tau );
-lapack_int LAPACKE_dorgbr( int matrix_order, char vect, lapack_int m,
-                           lapack_int n, lapack_int k, double* a,
-                           lapack_int lda, const double* tau );
+lapack_int LAPACKE_sorghr(int matrix_order, lapack_int n, lapack_int ilo, lapack_int ihi, float* a, lapack_int lda,
+                          const float* tau);
+lapack_int LAPACKE_dorghr(int matrix_order, lapack_int n, lapack_int ilo, lapack_int ihi, double* a, lapack_int lda,
+                          const double* tau);
 
-lapack_int LAPACKE_sorghr( int matrix_order, lapack_int n, lapack_int ilo,
-                           lapack_int ihi, float* a, lapack_int lda,
-                           const float* tau );
-lapack_int LAPACKE_dorghr( int matrix_order, lapack_int n, lapack_int ilo,
-                           lapack_int ihi, double* a, lapack_int lda,
-                           const double* tau );
+lapack_int LAPACKE_sorglq(int matrix_order, lapack_int m, lapack_int n, lapack_int k, float* a, lapack_int lda,
+                          const float* tau);
+lapack_int LAPACKE_dorglq(int matrix_order, lapack_int m, lapack_int n, lapack_int k, double* a, lapack_int lda,
+                          const double* tau);
 
-lapack_int LAPACKE_sorglq( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int k, float* a, lapack_int lda,
-                           const float* tau );
-lapack_int LAPACKE_dorglq( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int k, double* a, lapack_int lda,
-                           const double* tau );
+lapack_int LAPACKE_sorgql(int matrix_order, lapack_int m, lapack_int n, lapack_int k, float* a, lapack_int lda,
+                          const float* tau);
+lapack_int LAPACKE_dorgql(int matrix_order, lapack_int m, lapack_int n, lapack_int k, double* a, lapack_int lda,
+                          const double* tau);
 
-lapack_int LAPACKE_sorgql( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int k, float* a, lapack_int lda,
-                           const float* tau );
-lapack_int LAPACKE_dorgql( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int k, double* a, lapack_int lda,
-                           const double* tau );
+lapack_int LAPACKE_sorgqr(int matrix_order, lapack_int m, lapack_int n, lapack_int k, float* a, lapack_int lda,
+                          const float* tau);
+lapack_int LAPACKE_dorgqr(int matrix_order, lapack_int m, lapack_int n, lapack_int k, double* a, lapack_int lda,
+                          const double* tau);
 
-lapack_int LAPACKE_sorgqr( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int k, float* a, lapack_int lda,
-                           const float* tau );
-lapack_int LAPACKE_dorgqr( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int k, double* a, lapack_int lda,
-                           const double* tau );
+lapack_int LAPACKE_sorgrq(int matrix_order, lapack_int m, lapack_int n, lapack_int k, float* a, lapack_int lda,
+                          const float* tau);
+lapack_int LAPACKE_dorgrq(int matrix_order, lapack_int m, lapack_int n, lapack_int k, double* a, lapack_int lda,
+                          const double* tau);
 
-lapack_int LAPACKE_sorgrq( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int k, float* a, lapack_int lda,
-                           const float* tau );
-lapack_int LAPACKE_dorgrq( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int k, double* a, lapack_int lda,
-                           const double* tau );
+lapack_int LAPACKE_sorgtr(int matrix_order, char uplo, lapack_int n, float* a, lapack_int lda, const float* tau);
+lapack_int LAPACKE_dorgtr(int matrix_order, char uplo, lapack_int n, double* a, lapack_int lda, const double* tau);
 
-lapack_int LAPACKE_sorgtr( int matrix_order, char uplo, lapack_int n, float* a,
-                           lapack_int lda, const float* tau );
-lapack_int LAPACKE_dorgtr( int matrix_order, char uplo, lapack_int n, double* a,
-                           lapack_int lda, const double* tau );
+lapack_int LAPACKE_sormbr(int matrix_order, char vect, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                          const float* a, lapack_int lda, const float* tau, float* c, lapack_int ldc);
+lapack_int LAPACKE_dormbr(int matrix_order, char vect, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                          const double* a, lapack_int lda, const double* tau, double* c, lapack_int ldc);
 
-lapack_int LAPACKE_sormbr( int matrix_order, char vect, char side, char trans,
-                           lapack_int m, lapack_int n, lapack_int k,
-                           const float* a, lapack_int lda, const float* tau,
-                           float* c, lapack_int ldc );
-lapack_int LAPACKE_dormbr( int matrix_order, char vect, char side, char trans,
-                           lapack_int m, lapack_int n, lapack_int k,
-                           const double* a, lapack_int lda, const double* tau,
-                           double* c, lapack_int ldc );
+lapack_int LAPACKE_sormhr(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int ilo,
+                          lapack_int ihi, const float* a, lapack_int lda, const float* tau, float* c, lapack_int ldc);
+lapack_int LAPACKE_dormhr(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int ilo,
+                          lapack_int ihi, const double* a, lapack_int lda, const double* tau, double* c,
+                          lapack_int ldc);
 
-lapack_int LAPACKE_sormhr( int matrix_order, char side, char trans,
-                           lapack_int m, lapack_int n, lapack_int ilo,
-                           lapack_int ihi, const float* a, lapack_int lda,
-                           const float* tau, float* c, lapack_int ldc );
-lapack_int LAPACKE_dormhr( int matrix_order, char side, char trans,
-                           lapack_int m, lapack_int n, lapack_int ilo,
-                           lapack_int ihi, const double* a, lapack_int lda,
-                           const double* tau, double* c, lapack_int ldc );
+lapack_int LAPACKE_sormlq(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                          const float* a, lapack_int lda, const float* tau, float* c, lapack_int ldc);
+lapack_int LAPACKE_dormlq(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                          const double* a, lapack_int lda, const double* tau, double* c, lapack_int ldc);
 
-lapack_int LAPACKE_sormlq( int matrix_order, char side, char trans,
-                           lapack_int m, lapack_int n, lapack_int k,
-                           const float* a, lapack_int lda, const float* tau,
-                           float* c, lapack_int ldc );
-lapack_int LAPACKE_dormlq( int matrix_order, char side, char trans,
-                           lapack_int m, lapack_int n, lapack_int k,
-                           const double* a, lapack_int lda, const double* tau,
-                           double* c, lapack_int ldc );
+lapack_int LAPACKE_sormql(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                          const float* a, lapack_int lda, const float* tau, float* c, lapack_int ldc);
+lapack_int LAPACKE_dormql(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                          const double* a, lapack_int lda, const double* tau, double* c, lapack_int ldc);
 
-lapack_int LAPACKE_sormql( int matrix_order, char side, char trans,
-                           lapack_int m, lapack_int n, lapack_int k,
-                           const float* a, lapack_int lda, const float* tau,
-                           float* c, lapack_int ldc );
-lapack_int LAPACKE_dormql( int matrix_order, char side, char trans,
-                           lapack_int m, lapack_int n, lapack_int k,
-                           const double* a, lapack_int lda, const double* tau,
-                           double* c, lapack_int ldc );
+lapack_int LAPACKE_sormqr(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                          const float* a, lapack_int lda, const float* tau, float* c, lapack_int ldc);
+lapack_int LAPACKE_dormqr(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                          const double* a, lapack_int lda, const double* tau, double* c, lapack_int ldc);
 
-lapack_int LAPACKE_sormqr( int matrix_order, char side, char trans,
-                           lapack_int m, lapack_int n, lapack_int k,
-                           const float* a, lapack_int lda, const float* tau,
-                           float* c, lapack_int ldc );
-lapack_int LAPACKE_dormqr( int matrix_order, char side, char trans,
-                           lapack_int m, lapack_int n, lapack_int k,
-                           const double* a, lapack_int lda, const double* tau,
-                           double* c, lapack_int ldc );
+lapack_int LAPACKE_sormrq(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                          const float* a, lapack_int lda, const float* tau, float* c, lapack_int ldc);
+lapack_int LAPACKE_dormrq(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                          const double* a, lapack_int lda, const double* tau, double* c, lapack_int ldc);
 
-lapack_int LAPACKE_sormrq( int matrix_order, char side, char trans,
-                           lapack_int m, lapack_int n, lapack_int k,
-                           const float* a, lapack_int lda, const float* tau,
-                           float* c, lapack_int ldc );
-lapack_int LAPACKE_dormrq( int matrix_order, char side, char trans,
-                           lapack_int m, lapack_int n, lapack_int k,
-                           const double* a, lapack_int lda, const double* tau,
-                           double* c, lapack_int ldc );
+lapack_int LAPACKE_sormrz(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                          lapack_int l, const float* a, lapack_int lda, const float* tau, float* c, lapack_int ldc);
+lapack_int LAPACKE_dormrz(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                          lapack_int l, const double* a, lapack_int lda, const double* tau, double* c, lapack_int ldc);
 
-lapack_int LAPACKE_sormrz( int matrix_order, char side, char trans,
-                           lapack_int m, lapack_int n, lapack_int k,
-                           lapack_int l, const float* a, lapack_int lda,
-                           const float* tau, float* c, lapack_int ldc );
-lapack_int LAPACKE_dormrz( int matrix_order, char side, char trans,
-                           lapack_int m, lapack_int n, lapack_int k,
-                           lapack_int l, const double* a, lapack_int lda,
-                           const double* tau, double* c, lapack_int ldc );
+lapack_int LAPACKE_sormtr(int matrix_order, char side, char uplo, char trans, lapack_int m, lapack_int n,
+                          const float* a, lapack_int lda, const float* tau, float* c, lapack_int ldc);
+lapack_int LAPACKE_dormtr(int matrix_order, char side, char uplo, char trans, lapack_int m, lapack_int n,
+                          const double* a, lapack_int lda, const double* tau, double* c, lapack_int ldc);
 
-lapack_int LAPACKE_sormtr( int matrix_order, char side, char uplo, char trans,
-                           lapack_int m, lapack_int n, const float* a,
-                           lapack_int lda, const float* tau, float* c,
-                           lapack_int ldc );
-lapack_int LAPACKE_dormtr( int matrix_order, char side, char uplo, char trans,
-                           lapack_int m, lapack_int n, const double* a,
-                           lapack_int lda, const double* tau, double* c,
-                           lapack_int ldc );
+lapack_int LAPACKE_spbcon(int matrix_order, char uplo, lapack_int n, lapack_int kd, const float* ab, lapack_int ldab,
+                          float anorm, float* rcond);
+lapack_int LAPACKE_dpbcon(int matrix_order, char uplo, lapack_int n, lapack_int kd, const double* ab, lapack_int ldab,
+                          double anorm, double* rcond);
+lapack_int LAPACKE_cpbcon(int matrix_order, char uplo, lapack_int n, lapack_int kd, const lapack_complex_float* ab,
+                          lapack_int ldab, float anorm, float* rcond);
+lapack_int LAPACKE_zpbcon(int matrix_order, char uplo, lapack_int n, lapack_int kd, const lapack_complex_double* ab,
+                          lapack_int ldab, double anorm, double* rcond);
 
-lapack_int LAPACKE_spbcon( int matrix_order, char uplo, lapack_int n,
-                           lapack_int kd, const float* ab, lapack_int ldab,
-                           float anorm, float* rcond );
-lapack_int LAPACKE_dpbcon( int matrix_order, char uplo, lapack_int n,
-                           lapack_int kd, const double* ab, lapack_int ldab,
-                           double anorm, double* rcond );
-lapack_int LAPACKE_cpbcon( int matrix_order, char uplo, lapack_int n,
-                           lapack_int kd, const lapack_complex_float* ab,
-                           lapack_int ldab, float anorm, float* rcond );
-lapack_int LAPACKE_zpbcon( int matrix_order, char uplo, lapack_int n,
-                           lapack_int kd, const lapack_complex_double* ab,
-                           lapack_int ldab, double anorm, double* rcond );
+lapack_int LAPACKE_spbequ(int matrix_order, char uplo, lapack_int n, lapack_int kd, const float* ab, lapack_int ldab,
+                          float* s, float* scond, float* amax);
+lapack_int LAPACKE_dpbequ(int matrix_order, char uplo, lapack_int n, lapack_int kd, const double* ab, lapack_int ldab,
+                          double* s, double* scond, double* amax);
+lapack_int LAPACKE_cpbequ(int matrix_order, char uplo, lapack_int n, lapack_int kd, const lapack_complex_float* ab,
+                          lapack_int ldab, float* s, float* scond, float* amax);
+lapack_int LAPACKE_zpbequ(int matrix_order, char uplo, lapack_int n, lapack_int kd, const lapack_complex_double* ab,
+                          lapack_int ldab, double* s, double* scond, double* amax);
 
-lapack_int LAPACKE_spbequ( int matrix_order, char uplo, lapack_int n,
-                           lapack_int kd, const float* ab, lapack_int ldab,
-                           float* s, float* scond, float* amax );
-lapack_int LAPACKE_dpbequ( int matrix_order, char uplo, lapack_int n,
-                           lapack_int kd, const double* ab, lapack_int ldab,
-                           double* s, double* scond, double* amax );
-lapack_int LAPACKE_cpbequ( int matrix_order, char uplo, lapack_int n,
-                           lapack_int kd, const lapack_complex_float* ab,
-                           lapack_int ldab, float* s, float* scond,
-                           float* amax );
-lapack_int LAPACKE_zpbequ( int matrix_order, char uplo, lapack_int n,
-                           lapack_int kd, const lapack_complex_double* ab,
-                           lapack_int ldab, double* s, double* scond,
-                           double* amax );
+lapack_int LAPACKE_spbrfs(int matrix_order, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs, const float* ab,
+                          lapack_int ldab, const float* afb, lapack_int ldafb, const float* b, lapack_int ldb, float* x,
+                          lapack_int ldx, float* ferr, float* berr);
+lapack_int LAPACKE_dpbrfs(int matrix_order, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs, const double* ab,
+                          lapack_int ldab, const double* afb, lapack_int ldafb, const double* b, lapack_int ldb,
+                          double* x, lapack_int ldx, double* ferr, double* berr);
+lapack_int LAPACKE_cpbrfs(int matrix_order, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs,
+                          const lapack_complex_float* ab, lapack_int ldab, const lapack_complex_float* afb,
+                          lapack_int ldafb, const lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x,
+                          lapack_int ldx, float* ferr, float* berr);
+lapack_int LAPACKE_zpbrfs(int matrix_order, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs,
+                          const lapack_complex_double* ab, lapack_int ldab, const lapack_complex_double* afb,
+                          lapack_int ldafb, const lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x,
+                          lapack_int ldx, double* ferr, double* berr);
 
-lapack_int LAPACKE_spbrfs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int kd, lapack_int nrhs, const float* ab,
-                           lapack_int ldab, const float* afb, lapack_int ldafb,
-                           const float* b, lapack_int ldb, float* x,
-                           lapack_int ldx, float* ferr, float* berr );
-lapack_int LAPACKE_dpbrfs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int kd, lapack_int nrhs, const double* ab,
-                           lapack_int ldab, const double* afb, lapack_int ldafb,
-                           const double* b, lapack_int ldb, double* x,
-                           lapack_int ldx, double* ferr, double* berr );
-lapack_int LAPACKE_cpbrfs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int kd, lapack_int nrhs,
-                           const lapack_complex_float* ab, lapack_int ldab,
-                           const lapack_complex_float* afb, lapack_int ldafb,
-                           const lapack_complex_float* b, lapack_int ldb,
-                           lapack_complex_float* x, lapack_int ldx, float* ferr,
-                           float* berr );
-lapack_int LAPACKE_zpbrfs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int kd, lapack_int nrhs,
-                           const lapack_complex_double* ab, lapack_int ldab,
-                           const lapack_complex_double* afb, lapack_int ldafb,
-                           const lapack_complex_double* b, lapack_int ldb,
-                           lapack_complex_double* x, lapack_int ldx,
-                           double* ferr, double* berr );
+lapack_int LAPACKE_spbstf(int matrix_order, char uplo, lapack_int n, lapack_int kb, float* bb, lapack_int ldbb);
+lapack_int LAPACKE_dpbstf(int matrix_order, char uplo, lapack_int n, lapack_int kb, double* bb, lapack_int ldbb);
+lapack_int LAPACKE_cpbstf(int matrix_order, char uplo, lapack_int n, lapack_int kb, lapack_complex_float* bb,
+                          lapack_int ldbb);
+lapack_int LAPACKE_zpbstf(int matrix_order, char uplo, lapack_int n, lapack_int kb, lapack_complex_double* bb,
+                          lapack_int ldbb);
 
-lapack_int LAPACKE_spbstf( int matrix_order, char uplo, lapack_int n,
-                           lapack_int kb, float* bb, lapack_int ldbb );
-lapack_int LAPACKE_dpbstf( int matrix_order, char uplo, lapack_int n,
-                           lapack_int kb, double* bb, lapack_int ldbb );
-lapack_int LAPACKE_cpbstf( int matrix_order, char uplo, lapack_int n,
-                           lapack_int kb, lapack_complex_float* bb,
-                           lapack_int ldbb );
-lapack_int LAPACKE_zpbstf( int matrix_order, char uplo, lapack_int n,
-                           lapack_int kb, lapack_complex_double* bb,
-                           lapack_int ldbb );
+lapack_int LAPACKE_spbsv(int matrix_order, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs, float* ab,
+                         lapack_int ldab, float* b, lapack_int ldb);
+lapack_int LAPACKE_dpbsv(int matrix_order, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs, double* ab,
+                         lapack_int ldab, double* b, lapack_int ldb);
+lapack_int LAPACKE_cpbsv(int matrix_order, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs,
+                         lapack_complex_float* ab, lapack_int ldab, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zpbsv(int matrix_order, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs,
+                         lapack_complex_double* ab, lapack_int ldab, lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_spbsv( int matrix_order, char uplo, lapack_int n,
-                          lapack_int kd, lapack_int nrhs, float* ab,
-                          lapack_int ldab, float* b, lapack_int ldb );
-lapack_int LAPACKE_dpbsv( int matrix_order, char uplo, lapack_int n,
-                          lapack_int kd, lapack_int nrhs, double* ab,
-                          lapack_int ldab, double* b, lapack_int ldb );
-lapack_int LAPACKE_cpbsv( int matrix_order, char uplo, lapack_int n,
-                          lapack_int kd, lapack_int nrhs,
-                          lapack_complex_float* ab, lapack_int ldab,
-                          lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_zpbsv( int matrix_order, char uplo, lapack_int n,
-                          lapack_int kd, lapack_int nrhs,
-                          lapack_complex_double* ab, lapack_int ldab,
-                          lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_spbsvx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs,
+                          float* ab, lapack_int ldab, float* afb, lapack_int ldafb, char* equed, float* s, float* b,
+                          lapack_int ldb, float* x, lapack_int ldx, float* rcond, float* ferr, float* berr);
+lapack_int LAPACKE_dpbsvx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs,
+                          double* ab, lapack_int ldab, double* afb, lapack_int ldafb, char* equed, double* s, double* b,
+                          lapack_int ldb, double* x, lapack_int ldx, double* rcond, double* ferr, double* berr);
+lapack_int LAPACKE_cpbsvx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs,
+                          lapack_complex_float* ab, lapack_int ldab, lapack_complex_float* afb, lapack_int ldafb,
+                          char* equed, float* s, lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x,
+                          lapack_int ldx, float* rcond, float* ferr, float* berr);
+lapack_int LAPACKE_zpbsvx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs,
+                          lapack_complex_double* ab, lapack_int ldab, lapack_complex_double* afb, lapack_int ldafb,
+                          char* equed, double* s, lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x,
+                          lapack_int ldx, double* rcond, double* ferr, double* berr);
 
-lapack_int LAPACKE_spbsvx( int matrix_order, char fact, char uplo, lapack_int n,
-                           lapack_int kd, lapack_int nrhs, float* ab,
-                           lapack_int ldab, float* afb, lapack_int ldafb,
-                           char* equed, float* s, float* b, lapack_int ldb,
-                           float* x, lapack_int ldx, float* rcond, float* ferr,
-                           float* berr );
-lapack_int LAPACKE_dpbsvx( int matrix_order, char fact, char uplo, lapack_int n,
-                           lapack_int kd, lapack_int nrhs, double* ab,
-                           lapack_int ldab, double* afb, lapack_int ldafb,
-                           char* equed, double* s, double* b, lapack_int ldb,
-                           double* x, lapack_int ldx, double* rcond,
-                           double* ferr, double* berr );
-lapack_int LAPACKE_cpbsvx( int matrix_order, char fact, char uplo, lapack_int n,
-                           lapack_int kd, lapack_int nrhs,
-                           lapack_complex_float* ab, lapack_int ldab,
-                           lapack_complex_float* afb, lapack_int ldafb,
-                           char* equed, float* s, lapack_complex_float* b,
-                           lapack_int ldb, lapack_complex_float* x,
-                           lapack_int ldx, float* rcond, float* ferr,
-                           float* berr );
-lapack_int LAPACKE_zpbsvx( int matrix_order, char fact, char uplo, lapack_int n,
-                           lapack_int kd, lapack_int nrhs,
-                           lapack_complex_double* ab, lapack_int ldab,
-                           lapack_complex_double* afb, lapack_int ldafb,
-                           char* equed, double* s, lapack_complex_double* b,
-                           lapack_int ldb, lapack_complex_double* x,
-                           lapack_int ldx, double* rcond, double* ferr,
-                           double* berr );
+lapack_int LAPACKE_spbtrf(int matrix_order, char uplo, lapack_int n, lapack_int kd, float* ab, lapack_int ldab);
+lapack_int LAPACKE_dpbtrf(int matrix_order, char uplo, lapack_int n, lapack_int kd, double* ab, lapack_int ldab);
+lapack_int LAPACKE_cpbtrf(int matrix_order, char uplo, lapack_int n, lapack_int kd, lapack_complex_float* ab,
+                          lapack_int ldab);
+lapack_int LAPACKE_zpbtrf(int matrix_order, char uplo, lapack_int n, lapack_int kd, lapack_complex_double* ab,
+                          lapack_int ldab);
 
-lapack_int LAPACKE_spbtrf( int matrix_order, char uplo, lapack_int n,
-                           lapack_int kd, float* ab, lapack_int ldab );
-lapack_int LAPACKE_dpbtrf( int matrix_order, char uplo, lapack_int n,
-                           lapack_int kd, double* ab, lapack_int ldab );
-lapack_int LAPACKE_cpbtrf( int matrix_order, char uplo, lapack_int n,
-                           lapack_int kd, lapack_complex_float* ab,
-                           lapack_int ldab );
-lapack_int LAPACKE_zpbtrf( int matrix_order, char uplo, lapack_int n,
-                           lapack_int kd, lapack_complex_double* ab,
-                           lapack_int ldab );
+lapack_int LAPACKE_spbtrs(int matrix_order, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs, const float* ab,
+                          lapack_int ldab, float* b, lapack_int ldb);
+lapack_int LAPACKE_dpbtrs(int matrix_order, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs, const double* ab,
+                          lapack_int ldab, double* b, lapack_int ldb);
+lapack_int LAPACKE_cpbtrs(int matrix_order, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs,
+                          const lapack_complex_float* ab, lapack_int ldab, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zpbtrs(int matrix_order, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs,
+                          const lapack_complex_double* ab, lapack_int ldab, lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_spbtrs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int kd, lapack_int nrhs, const float* ab,
-                           lapack_int ldab, float* b, lapack_int ldb );
-lapack_int LAPACKE_dpbtrs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int kd, lapack_int nrhs, const double* ab,
-                           lapack_int ldab, double* b, lapack_int ldb );
-lapack_int LAPACKE_cpbtrs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int kd, lapack_int nrhs,
-                           const lapack_complex_float* ab, lapack_int ldab,
-                           lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_zpbtrs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int kd, lapack_int nrhs,
-                           const lapack_complex_double* ab, lapack_int ldab,
-                           lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_spftrf(int matrix_order, char transr, char uplo, lapack_int n, float* a);
+lapack_int LAPACKE_dpftrf(int matrix_order, char transr, char uplo, lapack_int n, double* a);
+lapack_int LAPACKE_cpftrf(int matrix_order, char transr, char uplo, lapack_int n, lapack_complex_float* a);
+lapack_int LAPACKE_zpftrf(int matrix_order, char transr, char uplo, lapack_int n, lapack_complex_double* a);
 
-lapack_int LAPACKE_spftrf( int matrix_order, char transr, char uplo,
-                           lapack_int n, float* a );
-lapack_int LAPACKE_dpftrf( int matrix_order, char transr, char uplo,
-                           lapack_int n, double* a );
-lapack_int LAPACKE_cpftrf( int matrix_order, char transr, char uplo,
-                           lapack_int n, lapack_complex_float* a );
-lapack_int LAPACKE_zpftrf( int matrix_order, char transr, char uplo,
-                           lapack_int n, lapack_complex_double* a );
+lapack_int LAPACKE_spftri(int matrix_order, char transr, char uplo, lapack_int n, float* a);
+lapack_int LAPACKE_dpftri(int matrix_order, char transr, char uplo, lapack_int n, double* a);
+lapack_int LAPACKE_cpftri(int matrix_order, char transr, char uplo, lapack_int n, lapack_complex_float* a);
+lapack_int LAPACKE_zpftri(int matrix_order, char transr, char uplo, lapack_int n, lapack_complex_double* a);
 
-lapack_int LAPACKE_spftri( int matrix_order, char transr, char uplo,
-                           lapack_int n, float* a );
-lapack_int LAPACKE_dpftri( int matrix_order, char transr, char uplo,
-                           lapack_int n, double* a );
-lapack_int LAPACKE_cpftri( int matrix_order, char transr, char uplo,
-                           lapack_int n, lapack_complex_float* a );
-lapack_int LAPACKE_zpftri( int matrix_order, char transr, char uplo,
-                           lapack_int n, lapack_complex_double* a );
+lapack_int LAPACKE_spftrs(int matrix_order, char transr, char uplo, lapack_int n, lapack_int nrhs, const float* a,
+                          float* b, lapack_int ldb);
+lapack_int LAPACKE_dpftrs(int matrix_order, char transr, char uplo, lapack_int n, lapack_int nrhs, const double* a,
+                          double* b, lapack_int ldb);
+lapack_int LAPACKE_cpftrs(int matrix_order, char transr, char uplo, lapack_int n, lapack_int nrhs,
+                          const lapack_complex_float* a, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zpftrs(int matrix_order, char transr, char uplo, lapack_int n, lapack_int nrhs,
+                          const lapack_complex_double* a, lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_spftrs( int matrix_order, char transr, char uplo,
-                           lapack_int n, lapack_int nrhs, const float* a,
-                           float* b, lapack_int ldb );
-lapack_int LAPACKE_dpftrs( int matrix_order, char transr, char uplo,
-                           lapack_int n, lapack_int nrhs, const double* a,
-                           double* b, lapack_int ldb );
-lapack_int LAPACKE_cpftrs( int matrix_order, char transr, char uplo,
-                           lapack_int n, lapack_int nrhs,
-                           const lapack_complex_float* a,
-                           lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_zpftrs( int matrix_order, char transr, char uplo,
-                           lapack_int n, lapack_int nrhs,
-                           const lapack_complex_double* a,
-                           lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_spocon(int matrix_order, char uplo, lapack_int n, const float* a, lapack_int lda, float anorm,
+                          float* rcond);
+lapack_int LAPACKE_dpocon(int matrix_order, char uplo, lapack_int n, const double* a, lapack_int lda, double anorm,
+                          double* rcond);
+lapack_int LAPACKE_cpocon(int matrix_order, char uplo, lapack_int n, const lapack_complex_float* a, lapack_int lda,
+                          float anorm, float* rcond);
+lapack_int LAPACKE_zpocon(int matrix_order, char uplo, lapack_int n, const lapack_complex_double* a, lapack_int lda,
+                          double anorm, double* rcond);
 
-lapack_int LAPACKE_spocon( int matrix_order, char uplo, lapack_int n,
-                           const float* a, lapack_int lda, float anorm,
-                           float* rcond );
-lapack_int LAPACKE_dpocon( int matrix_order, char uplo, lapack_int n,
-                           const double* a, lapack_int lda, double anorm,
-                           double* rcond );
-lapack_int LAPACKE_cpocon( int matrix_order, char uplo, lapack_int n,
-                           const lapack_complex_float* a, lapack_int lda,
-                           float anorm, float* rcond );
-lapack_int LAPACKE_zpocon( int matrix_order, char uplo, lapack_int n,
-                           const lapack_complex_double* a, lapack_int lda,
-                           double anorm, double* rcond );
+lapack_int LAPACKE_spoequ(int matrix_order, lapack_int n, const float* a, lapack_int lda, float* s, float* scond,
+                          float* amax);
+lapack_int LAPACKE_dpoequ(int matrix_order, lapack_int n, const double* a, lapack_int lda, double* s, double* scond,
+                          double* amax);
+lapack_int LAPACKE_cpoequ(int matrix_order, lapack_int n, const lapack_complex_float* a, lapack_int lda, float* s,
+                          float* scond, float* amax);
+lapack_int LAPACKE_zpoequ(int matrix_order, lapack_int n, const lapack_complex_double* a, lapack_int lda, double* s,
+                          double* scond, double* amax);
 
-lapack_int LAPACKE_spoequ( int matrix_order, lapack_int n, const float* a,
-                           lapack_int lda, float* s, float* scond,
-                           float* amax );
-lapack_int LAPACKE_dpoequ( int matrix_order, lapack_int n, const double* a,
-                           lapack_int lda, double* s, double* scond,
-                           double* amax );
-lapack_int LAPACKE_cpoequ( int matrix_order, lapack_int n,
-                           const lapack_complex_float* a, lapack_int lda,
-                           float* s, float* scond, float* amax );
-lapack_int LAPACKE_zpoequ( int matrix_order, lapack_int n,
-                           const lapack_complex_double* a, lapack_int lda,
-                           double* s, double* scond, double* amax );
+lapack_int LAPACKE_spoequb(int matrix_order, lapack_int n, const float* a, lapack_int lda, float* s, float* scond,
+                           float* amax);
+lapack_int LAPACKE_dpoequb(int matrix_order, lapack_int n, const double* a, lapack_int lda, double* s, double* scond,
+                           double* amax);
+lapack_int LAPACKE_cpoequb(int matrix_order, lapack_int n, const lapack_complex_float* a, lapack_int lda, float* s,
+                           float* scond, float* amax);
+lapack_int LAPACKE_zpoequb(int matrix_order, lapack_int n, const lapack_complex_double* a, lapack_int lda, double* s,
+                           double* scond, double* amax);
 
-lapack_int LAPACKE_spoequb( int matrix_order, lapack_int n, const float* a,
-                            lapack_int lda, float* s, float* scond,
-                            float* amax );
-lapack_int LAPACKE_dpoequb( int matrix_order, lapack_int n, const double* a,
-                            lapack_int lda, double* s, double* scond,
-                            double* amax );
-lapack_int LAPACKE_cpoequb( int matrix_order, lapack_int n,
-                            const lapack_complex_float* a, lapack_int lda,
-                            float* s, float* scond, float* amax );
-lapack_int LAPACKE_zpoequb( int matrix_order, lapack_int n,
-                            const lapack_complex_double* a, lapack_int lda,
-                            double* s, double* scond, double* amax );
+lapack_int LAPACKE_sporfs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const float* a, lapack_int lda,
+                          const float* af, lapack_int ldaf, const float* b, lapack_int ldb, float* x, lapack_int ldx,
+                          float* ferr, float* berr);
+lapack_int LAPACKE_dporfs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const double* a, lapack_int lda,
+                          const double* af, lapack_int ldaf, const double* b, lapack_int ldb, double* x, lapack_int ldx,
+                          double* ferr, double* berr);
+lapack_int LAPACKE_cporfs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_float* a,
+                          lapack_int lda, const lapack_complex_float* af, lapack_int ldaf,
+                          const lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x, lapack_int ldx,
+                          float* ferr, float* berr);
+lapack_int LAPACKE_zporfs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double* a,
+                          lapack_int lda, const lapack_complex_double* af, lapack_int ldaf,
+                          const lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x, lapack_int ldx,
+                          double* ferr, double* berr);
 
-lapack_int LAPACKE_sporfs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const float* a, lapack_int lda,
-                           const float* af, lapack_int ldaf, const float* b,
-                           lapack_int ldb, float* x, lapack_int ldx,
-                           float* ferr, float* berr );
-lapack_int LAPACKE_dporfs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const double* a, lapack_int lda,
-                           const double* af, lapack_int ldaf, const double* b,
-                           lapack_int ldb, double* x, lapack_int ldx,
-                           double* ferr, double* berr );
-lapack_int LAPACKE_cporfs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_float* a,
-                           lapack_int lda, const lapack_complex_float* af,
-                           lapack_int ldaf, const lapack_complex_float* b,
-                           lapack_int ldb, lapack_complex_float* x,
-                           lapack_int ldx, float* ferr, float* berr );
-lapack_int LAPACKE_zporfs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_double* a,
-                           lapack_int lda, const lapack_complex_double* af,
-                           lapack_int ldaf, const lapack_complex_double* b,
-                           lapack_int ldb, lapack_complex_double* x,
-                           lapack_int ldx, double* ferr, double* berr );
+lapack_int LAPACKE_sporfsx(int matrix_order, char uplo, char equed, lapack_int n, lapack_int nrhs, const float* a,
+                           lapack_int lda, const float* af, lapack_int ldaf, const float* s, const float* b,
+                           lapack_int ldb, float* x, lapack_int ldx, float* rcond, float* berr, lapack_int n_err_bnds,
+                           float* err_bnds_norm, float* err_bnds_comp, lapack_int nparams, float* params);
+lapack_int LAPACKE_dporfsx(int matrix_order, char uplo, char equed, lapack_int n, lapack_int nrhs, const double* a,
+                           lapack_int lda, const double* af, lapack_int ldaf, const double* s, const double* b,
+                           lapack_int ldb, double* x, lapack_int ldx, double* rcond, double* berr,
+                           lapack_int n_err_bnds, double* err_bnds_norm, double* err_bnds_comp, lapack_int nparams,
+                           double* params);
+lapack_int LAPACKE_cporfsx(int matrix_order, char uplo, char equed, lapack_int n, lapack_int nrhs,
+                           const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* af,
+                           lapack_int ldaf, const float* s, const lapack_complex_float* b, lapack_int ldb,
+                           lapack_complex_float* x, lapack_int ldx, float* rcond, float* berr, lapack_int n_err_bnds,
+                           float* err_bnds_norm, float* err_bnds_comp, lapack_int nparams, float* params);
+lapack_int LAPACKE_zporfsx(int matrix_order, char uplo, char equed, lapack_int n, lapack_int nrhs,
+                           const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* af,
+                           lapack_int ldaf, const double* s, const lapack_complex_double* b, lapack_int ldb,
+                           lapack_complex_double* x, lapack_int ldx, double* rcond, double* berr, lapack_int n_err_bnds,
+                           double* err_bnds_norm, double* err_bnds_comp, lapack_int nparams, double* params);
 
-lapack_int LAPACKE_sporfsx( int matrix_order, char uplo, char equed,
-                            lapack_int n, lapack_int nrhs, const float* a,
-                            lapack_int lda, const float* af, lapack_int ldaf,
-                            const float* s, const float* b, lapack_int ldb,
-                            float* x, lapack_int ldx, float* rcond, float* berr,
-                            lapack_int n_err_bnds, float* err_bnds_norm,
-                            float* err_bnds_comp, lapack_int nparams,
-                            float* params );
-lapack_int LAPACKE_dporfsx( int matrix_order, char uplo, char equed,
-                            lapack_int n, lapack_int nrhs, const double* a,
-                            lapack_int lda, const double* af, lapack_int ldaf,
-                            const double* s, const double* b, lapack_int ldb,
-                            double* x, lapack_int ldx, double* rcond,
-                            double* berr, lapack_int n_err_bnds,
-                            double* err_bnds_norm, double* err_bnds_comp,
-                            lapack_int nparams, double* params );
-lapack_int LAPACKE_cporfsx( int matrix_order, char uplo, char equed,
-                            lapack_int n, lapack_int nrhs,
-                            const lapack_complex_float* a, lapack_int lda,
-                            const lapack_complex_float* af, lapack_int ldaf,
-                            const float* s, const lapack_complex_float* b,
-                            lapack_int ldb, lapack_complex_float* x,
-                            lapack_int ldx, float* rcond, float* berr,
-                            lapack_int n_err_bnds, float* err_bnds_norm,
-                            float* err_bnds_comp, lapack_int nparams,
-                            float* params );
-lapack_int LAPACKE_zporfsx( int matrix_order, char uplo, char equed,
-                            lapack_int n, lapack_int nrhs,
-                            const lapack_complex_double* a, lapack_int lda,
-                            const lapack_complex_double* af, lapack_int ldaf,
-                            const double* s, const lapack_complex_double* b,
-                            lapack_int ldb, lapack_complex_double* x,
-                            lapack_int ldx, double* rcond, double* berr,
-                            lapack_int n_err_bnds, double* err_bnds_norm,
-                            double* err_bnds_comp, lapack_int nparams,
-                            double* params );
+lapack_int LAPACKE_sposv(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, float* a, lapack_int lda, float* b,
+                         lapack_int ldb);
+lapack_int LAPACKE_dposv(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, double* a, lapack_int lda,
+                         double* b, lapack_int ldb);
+lapack_int LAPACKE_cposv(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_float* a,
+                         lapack_int lda, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zposv(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double* a,
+                         lapack_int lda, lapack_complex_double* b, lapack_int ldb);
+lapack_int LAPACKE_dsposv(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, double* a, lapack_int lda,
+                          double* b, lapack_int ldb, double* x, lapack_int ldx, lapack_int* iter);
+lapack_int LAPACKE_zcposv(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double* a,
+                          lapack_int lda, lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x,
+                          lapack_int ldx, lapack_int* iter);
 
-lapack_int LAPACKE_sposv( int matrix_order, char uplo, lapack_int n,
-                          lapack_int nrhs, float* a, lapack_int lda, float* b,
-                          lapack_int ldb );
-lapack_int LAPACKE_dposv( int matrix_order, char uplo, lapack_int n,
-                          lapack_int nrhs, double* a, lapack_int lda, double* b,
-                          lapack_int ldb );
-lapack_int LAPACKE_cposv( int matrix_order, char uplo, lapack_int n,
-                          lapack_int nrhs, lapack_complex_float* a,
-                          lapack_int lda, lapack_complex_float* b,
-                          lapack_int ldb );
-lapack_int LAPACKE_zposv( int matrix_order, char uplo, lapack_int n,
-                          lapack_int nrhs, lapack_complex_double* a,
-                          lapack_int lda, lapack_complex_double* b,
-                          lapack_int ldb );
-lapack_int LAPACKE_dsposv( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, double* a, lapack_int lda,
-                           double* b, lapack_int ldb, double* x, lapack_int ldx,
-                           lapack_int* iter );
-lapack_int LAPACKE_zcposv( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, lapack_complex_double* a,
-                           lapack_int lda, lapack_complex_double* b,
-                           lapack_int ldb, lapack_complex_double* x,
-                           lapack_int ldx, lapack_int* iter );
+lapack_int LAPACKE_sposvx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs, float* a,
+                          lapack_int lda, float* af, lapack_int ldaf, char* equed, float* s, float* b, lapack_int ldb,
+                          float* x, lapack_int ldx, float* rcond, float* ferr, float* berr);
+lapack_int LAPACKE_dposvx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs, double* a,
+                          lapack_int lda, double* af, lapack_int ldaf, char* equed, double* s, double* b,
+                          lapack_int ldb, double* x, lapack_int ldx, double* rcond, double* ferr, double* berr);
+lapack_int LAPACKE_cposvx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                          lapack_complex_float* a, lapack_int lda, lapack_complex_float* af, lapack_int ldaf,
+                          char* equed, float* s, lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x,
+                          lapack_int ldx, float* rcond, float* ferr, float* berr);
+lapack_int LAPACKE_zposvx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                          lapack_complex_double* a, lapack_int lda, lapack_complex_double* af, lapack_int ldaf,
+                          char* equed, double* s, lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x,
+                          lapack_int ldx, double* rcond, double* ferr, double* berr);
 
-lapack_int LAPACKE_sposvx( int matrix_order, char fact, char uplo, lapack_int n,
-                           lapack_int nrhs, float* a, lapack_int lda, float* af,
-                           lapack_int ldaf, char* equed, float* s, float* b,
-                           lapack_int ldb, float* x, lapack_int ldx,
-                           float* rcond, float* ferr, float* berr );
-lapack_int LAPACKE_dposvx( int matrix_order, char fact, char uplo, lapack_int n,
-                           lapack_int nrhs, double* a, lapack_int lda,
-                           double* af, lapack_int ldaf, char* equed, double* s,
-                           double* b, lapack_int ldb, double* x, lapack_int ldx,
-                           double* rcond, double* ferr, double* berr );
-lapack_int LAPACKE_cposvx( int matrix_order, char fact, char uplo, lapack_int n,
-                           lapack_int nrhs, lapack_complex_float* a,
-                           lapack_int lda, lapack_complex_float* af,
-                           lapack_int ldaf, char* equed, float* s,
-                           lapack_complex_float* b, lapack_int ldb,
-                           lapack_complex_float* x, lapack_int ldx,
-                           float* rcond, float* ferr, float* berr );
-lapack_int LAPACKE_zposvx( int matrix_order, char fact, char uplo, lapack_int n,
-                           lapack_int nrhs, lapack_complex_double* a,
-                           lapack_int lda, lapack_complex_double* af,
-                           lapack_int ldaf, char* equed, double* s,
-                           lapack_complex_double* b, lapack_int ldb,
-                           lapack_complex_double* x, lapack_int ldx,
-                           double* rcond, double* ferr, double* berr );
+lapack_int LAPACKE_sposvxx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs, float* a,
+                           lapack_int lda, float* af, lapack_int ldaf, char* equed, float* s, float* b, lapack_int ldb,
+                           float* x, lapack_int ldx, float* rcond, float* rpvgrw, float* berr, lapack_int n_err_bnds,
+                           float* err_bnds_norm, float* err_bnds_comp, lapack_int nparams, float* params);
+lapack_int LAPACKE_dposvxx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs, double* a,
+                           lapack_int lda, double* af, lapack_int ldaf, char* equed, double* s, double* b,
+                           lapack_int ldb, double* x, lapack_int ldx, double* rcond, double* rpvgrw, double* berr,
+                           lapack_int n_err_bnds, double* err_bnds_norm, double* err_bnds_comp, lapack_int nparams,
+                           double* params);
+lapack_int LAPACKE_cposvxx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                           lapack_complex_float* a, lapack_int lda, lapack_complex_float* af, lapack_int ldaf,
+                           char* equed, float* s, lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x,
+                           lapack_int ldx, float* rcond, float* rpvgrw, float* berr, lapack_int n_err_bnds,
+                           float* err_bnds_norm, float* err_bnds_comp, lapack_int nparams, float* params);
+lapack_int LAPACKE_zposvxx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                           lapack_complex_double* a, lapack_int lda, lapack_complex_double* af, lapack_int ldaf,
+                           char* equed, double* s, lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x,
+                           lapack_int ldx, double* rcond, double* rpvgrw, double* berr, lapack_int n_err_bnds,
+                           double* err_bnds_norm, double* err_bnds_comp, lapack_int nparams, double* params);
 
-lapack_int LAPACKE_sposvxx( int matrix_order, char fact, char uplo,
-                            lapack_int n, lapack_int nrhs, float* a,
-                            lapack_int lda, float* af, lapack_int ldaf,
-                            char* equed, float* s, float* b, lapack_int ldb,
-                            float* x, lapack_int ldx, float* rcond,
-                            float* rpvgrw, float* berr, lapack_int n_err_bnds,
-                            float* err_bnds_norm, float* err_bnds_comp,
-                            lapack_int nparams, float* params );
-lapack_int LAPACKE_dposvxx( int matrix_order, char fact, char uplo,
-                            lapack_int n, lapack_int nrhs, double* a,
-                            lapack_int lda, double* af, lapack_int ldaf,
-                            char* equed, double* s, double* b, lapack_int ldb,
-                            double* x, lapack_int ldx, double* rcond,
-                            double* rpvgrw, double* berr, lapack_int n_err_bnds,
-                            double* err_bnds_norm, double* err_bnds_comp,
-                            lapack_int nparams, double* params );
-lapack_int LAPACKE_cposvxx( int matrix_order, char fact, char uplo,
-                            lapack_int n, lapack_int nrhs,
-                            lapack_complex_float* a, lapack_int lda,
-                            lapack_complex_float* af, lapack_int ldaf,
-                            char* equed, float* s, lapack_complex_float* b,
-                            lapack_int ldb, lapack_complex_float* x,
-                            lapack_int ldx, float* rcond, float* rpvgrw,
-                            float* berr, lapack_int n_err_bnds,
-                            float* err_bnds_norm, float* err_bnds_comp,
-                            lapack_int nparams, float* params );
-lapack_int LAPACKE_zposvxx( int matrix_order, char fact, char uplo,
-                            lapack_int n, lapack_int nrhs,
-                            lapack_complex_double* a, lapack_int lda,
-                            lapack_complex_double* af, lapack_int ldaf,
-                            char* equed, double* s, lapack_complex_double* b,
-                            lapack_int ldb, lapack_complex_double* x,
-                            lapack_int ldx, double* rcond, double* rpvgrw,
-                            double* berr, lapack_int n_err_bnds,
-                            double* err_bnds_norm, double* err_bnds_comp,
-                            lapack_int nparams, double* params );
+lapack_int LAPACKE_spotrf(int matrix_order, char uplo, lapack_int n, float* a, lapack_int lda);
+lapack_int LAPACKE_dpotrf(int matrix_order, char uplo, lapack_int n, double* a, lapack_int lda);
+lapack_int LAPACKE_cpotrf(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda);
+lapack_int LAPACKE_zpotrf(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int lda);
 
-lapack_int LAPACKE_spotrf( int matrix_order, char uplo, lapack_int n, float* a,
-                           lapack_int lda );
-lapack_int LAPACKE_dpotrf( int matrix_order, char uplo, lapack_int n, double* a,
-                           lapack_int lda );
-lapack_int LAPACKE_cpotrf( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda );
-lapack_int LAPACKE_zpotrf( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda );
+lapack_int LAPACKE_spotri(int matrix_order, char uplo, lapack_int n, float* a, lapack_int lda);
+lapack_int LAPACKE_dpotri(int matrix_order, char uplo, lapack_int n, double* a, lapack_int lda);
+lapack_int LAPACKE_cpotri(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda);
+lapack_int LAPACKE_zpotri(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int lda);
 
-lapack_int LAPACKE_spotri( int matrix_order, char uplo, lapack_int n, float* a,
-                           lapack_int lda );
-lapack_int LAPACKE_dpotri( int matrix_order, char uplo, lapack_int n, double* a,
-                           lapack_int lda );
-lapack_int LAPACKE_cpotri( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda );
-lapack_int LAPACKE_zpotri( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda );
+lapack_int LAPACKE_spotrs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const float* a, lapack_int lda,
+                          float* b, lapack_int ldb);
+lapack_int LAPACKE_dpotrs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const double* a, lapack_int lda,
+                          double* b, lapack_int ldb);
+lapack_int LAPACKE_cpotrs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_float* a,
+                          lapack_int lda, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zpotrs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double* a,
+                          lapack_int lda, lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_spotrs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const float* a, lapack_int lda,
-                           float* b, lapack_int ldb );
-lapack_int LAPACKE_dpotrs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const double* a, lapack_int lda,
-                           double* b, lapack_int ldb );
-lapack_int LAPACKE_cpotrs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_float* a,
-                           lapack_int lda, lapack_complex_float* b,
-                           lapack_int ldb );
-lapack_int LAPACKE_zpotrs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_double* a,
-                           lapack_int lda, lapack_complex_double* b,
-                           lapack_int ldb );
+lapack_int LAPACKE_sppcon(int matrix_order, char uplo, lapack_int n, const float* ap, float anorm, float* rcond);
+lapack_int LAPACKE_dppcon(int matrix_order, char uplo, lapack_int n, const double* ap, double anorm, double* rcond);
+lapack_int LAPACKE_cppcon(int matrix_order, char uplo, lapack_int n, const lapack_complex_float* ap, float anorm,
+                          float* rcond);
+lapack_int LAPACKE_zppcon(int matrix_order, char uplo, lapack_int n, const lapack_complex_double* ap, double anorm,
+                          double* rcond);
 
-lapack_int LAPACKE_sppcon( int matrix_order, char uplo, lapack_int n,
-                           const float* ap, float anorm, float* rcond );
-lapack_int LAPACKE_dppcon( int matrix_order, char uplo, lapack_int n,
-                           const double* ap, double anorm, double* rcond );
-lapack_int LAPACKE_cppcon( int matrix_order, char uplo, lapack_int n,
-                           const lapack_complex_float* ap, float anorm,
-                           float* rcond );
-lapack_int LAPACKE_zppcon( int matrix_order, char uplo, lapack_int n,
-                           const lapack_complex_double* ap, double anorm,
-                           double* rcond );
+lapack_int LAPACKE_sppequ(int matrix_order, char uplo, lapack_int n, const float* ap, float* s, float* scond,
+                          float* amax);
+lapack_int LAPACKE_dppequ(int matrix_order, char uplo, lapack_int n, const double* ap, double* s, double* scond,
+                          double* amax);
+lapack_int LAPACKE_cppequ(int matrix_order, char uplo, lapack_int n, const lapack_complex_float* ap, float* s,
+                          float* scond, float* amax);
+lapack_int LAPACKE_zppequ(int matrix_order, char uplo, lapack_int n, const lapack_complex_double* ap, double* s,
+                          double* scond, double* amax);
 
-lapack_int LAPACKE_sppequ( int matrix_order, char uplo, lapack_int n,
-                           const float* ap, float* s, float* scond,
-                           float* amax );
-lapack_int LAPACKE_dppequ( int matrix_order, char uplo, lapack_int n,
-                           const double* ap, double* s, double* scond,
-                           double* amax );
-lapack_int LAPACKE_cppequ( int matrix_order, char uplo, lapack_int n,
-                           const lapack_complex_float* ap, float* s,
-                           float* scond, float* amax );
-lapack_int LAPACKE_zppequ( int matrix_order, char uplo, lapack_int n,
-                           const lapack_complex_double* ap, double* s,
-                           double* scond, double* amax );
+lapack_int LAPACKE_spprfs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const float* ap, const float* afp,
+                          const float* b, lapack_int ldb, float* x, lapack_int ldx, float* ferr, float* berr);
+lapack_int LAPACKE_dpprfs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const double* ap,
+                          const double* afp, const double* b, lapack_int ldb, double* x, lapack_int ldx, double* ferr,
+                          double* berr);
+lapack_int LAPACKE_cpprfs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_float* ap,
+                          const lapack_complex_float* afp, const lapack_complex_float* b, lapack_int ldb,
+                          lapack_complex_float* x, lapack_int ldx, float* ferr, float* berr);
+lapack_int LAPACKE_zpprfs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double* ap,
+                          const lapack_complex_double* afp, const lapack_complex_double* b, lapack_int ldb,
+                          lapack_complex_double* x, lapack_int ldx, double* ferr, double* berr);
 
-lapack_int LAPACKE_spprfs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const float* ap, const float* afp,
-                           const float* b, lapack_int ldb, float* x,
-                           lapack_int ldx, float* ferr, float* berr );
-lapack_int LAPACKE_dpprfs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const double* ap, const double* afp,
-                           const double* b, lapack_int ldb, double* x,
-                           lapack_int ldx, double* ferr, double* berr );
-lapack_int LAPACKE_cpprfs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_float* ap,
-                           const lapack_complex_float* afp,
-                           const lapack_complex_float* b, lapack_int ldb,
-                           lapack_complex_float* x, lapack_int ldx, float* ferr,
-                           float* berr );
-lapack_int LAPACKE_zpprfs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_double* ap,
-                           const lapack_complex_double* afp,
-                           const lapack_complex_double* b, lapack_int ldb,
-                           lapack_complex_double* x, lapack_int ldx,
-                           double* ferr, double* berr );
+lapack_int LAPACKE_sppsv(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, float* ap, float* b,
+                         lapack_int ldb);
+lapack_int LAPACKE_dppsv(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, double* ap, double* b,
+                         lapack_int ldb);
+lapack_int LAPACKE_cppsv(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_float* ap,
+                         lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zppsv(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double* ap,
+                         lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_sppsv( int matrix_order, char uplo, lapack_int n,
-                          lapack_int nrhs, float* ap, float* b,
-                          lapack_int ldb );
-lapack_int LAPACKE_dppsv( int matrix_order, char uplo, lapack_int n,
-                          lapack_int nrhs, double* ap, double* b,
-                          lapack_int ldb );
-lapack_int LAPACKE_cppsv( int matrix_order, char uplo, lapack_int n,
-                          lapack_int nrhs, lapack_complex_float* ap,
-                          lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_zppsv( int matrix_order, char uplo, lapack_int n,
-                          lapack_int nrhs, lapack_complex_double* ap,
-                          lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_sppsvx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs, float* ap, float* afp,
+                          char* equed, float* s, float* b, lapack_int ldb, float* x, lapack_int ldx, float* rcond,
+                          float* ferr, float* berr);
+lapack_int LAPACKE_dppsvx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs, double* ap,
+                          double* afp, char* equed, double* s, double* b, lapack_int ldb, double* x, lapack_int ldx,
+                          double* rcond, double* ferr, double* berr);
+lapack_int LAPACKE_cppsvx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                          lapack_complex_float* ap, lapack_complex_float* afp, char* equed, float* s,
+                          lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x, lapack_int ldx,
+                          float* rcond, float* ferr, float* berr);
+lapack_int LAPACKE_zppsvx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                          lapack_complex_double* ap, lapack_complex_double* afp, char* equed, double* s,
+                          lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x, lapack_int ldx,
+                          double* rcond, double* ferr, double* berr);
 
-lapack_int LAPACKE_sppsvx( int matrix_order, char fact, char uplo, lapack_int n,
-                           lapack_int nrhs, float* ap, float* afp, char* equed,
-                           float* s, float* b, lapack_int ldb, float* x,
-                           lapack_int ldx, float* rcond, float* ferr,
-                           float* berr );
-lapack_int LAPACKE_dppsvx( int matrix_order, char fact, char uplo, lapack_int n,
-                           lapack_int nrhs, double* ap, double* afp,
-                           char* equed, double* s, double* b, lapack_int ldb,
-                           double* x, lapack_int ldx, double* rcond,
-                           double* ferr, double* berr );
-lapack_int LAPACKE_cppsvx( int matrix_order, char fact, char uplo, lapack_int n,
-                           lapack_int nrhs, lapack_complex_float* ap,
-                           lapack_complex_float* afp, char* equed, float* s,
-                           lapack_complex_float* b, lapack_int ldb,
-                           lapack_complex_float* x, lapack_int ldx,
-                           float* rcond, float* ferr, float* berr );
-lapack_int LAPACKE_zppsvx( int matrix_order, char fact, char uplo, lapack_int n,
-                           lapack_int nrhs, lapack_complex_double* ap,
-                           lapack_complex_double* afp, char* equed, double* s,
-                           lapack_complex_double* b, lapack_int ldb,
-                           lapack_complex_double* x, lapack_int ldx,
-                           double* rcond, double* ferr, double* berr );
+lapack_int LAPACKE_spptrf(int matrix_order, char uplo, lapack_int n, float* ap);
+lapack_int LAPACKE_dpptrf(int matrix_order, char uplo, lapack_int n, double* ap);
+lapack_int LAPACKE_cpptrf(int matrix_order, char uplo, lapack_int n, lapack_complex_float* ap);
+lapack_int LAPACKE_zpptrf(int matrix_order, char uplo, lapack_int n, lapack_complex_double* ap);
 
-lapack_int LAPACKE_spptrf( int matrix_order, char uplo, lapack_int n,
-                           float* ap );
-lapack_int LAPACKE_dpptrf( int matrix_order, char uplo, lapack_int n,
-                           double* ap );
-lapack_int LAPACKE_cpptrf( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_float* ap );
-lapack_int LAPACKE_zpptrf( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_double* ap );
+lapack_int LAPACKE_spptri(int matrix_order, char uplo, lapack_int n, float* ap);
+lapack_int LAPACKE_dpptri(int matrix_order, char uplo, lapack_int n, double* ap);
+lapack_int LAPACKE_cpptri(int matrix_order, char uplo, lapack_int n, lapack_complex_float* ap);
+lapack_int LAPACKE_zpptri(int matrix_order, char uplo, lapack_int n, lapack_complex_double* ap);
 
-lapack_int LAPACKE_spptri( int matrix_order, char uplo, lapack_int n,
-                           float* ap );
-lapack_int LAPACKE_dpptri( int matrix_order, char uplo, lapack_int n,
-                           double* ap );
-lapack_int LAPACKE_cpptri( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_float* ap );
-lapack_int LAPACKE_zpptri( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_double* ap );
+lapack_int LAPACKE_spptrs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const float* ap, float* b,
+                          lapack_int ldb);
+lapack_int LAPACKE_dpptrs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const double* ap, double* b,
+                          lapack_int ldb);
+lapack_int LAPACKE_cpptrs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_float* ap,
+                          lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zpptrs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double* ap,
+                          lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_spptrs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const float* ap, float* b,
-                           lapack_int ldb );
-lapack_int LAPACKE_dpptrs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const double* ap, double* b,
-                           lapack_int ldb );
-lapack_int LAPACKE_cpptrs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_float* ap,
-                           lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_zpptrs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_double* ap,
-                           lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_spstrf(int matrix_order, char uplo, lapack_int n, float* a, lapack_int lda, lapack_int* piv,
+                          lapack_int* rank, float tol);
+lapack_int LAPACKE_dpstrf(int matrix_order, char uplo, lapack_int n, double* a, lapack_int lda, lapack_int* piv,
+                          lapack_int* rank, double tol);
+lapack_int LAPACKE_cpstrf(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                          lapack_int* piv, lapack_int* rank, float tol);
+lapack_int LAPACKE_zpstrf(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                          lapack_int* piv, lapack_int* rank, double tol);
 
-lapack_int LAPACKE_spstrf( int matrix_order, char uplo, lapack_int n, float* a,
-                           lapack_int lda, lapack_int* piv, lapack_int* rank,
-                           float tol );
-lapack_int LAPACKE_dpstrf( int matrix_order, char uplo, lapack_int n, double* a,
-                           lapack_int lda, lapack_int* piv, lapack_int* rank,
-                           double tol );
-lapack_int LAPACKE_cpstrf( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda,
-                           lapack_int* piv, lapack_int* rank, float tol );
-lapack_int LAPACKE_zpstrf( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_int* piv, lapack_int* rank, double tol );
+lapack_int LAPACKE_sptcon(lapack_int n, const float* d, const float* e, float anorm, float* rcond);
+lapack_int LAPACKE_dptcon(lapack_int n, const double* d, const double* e, double anorm, double* rcond);
+lapack_int LAPACKE_cptcon(lapack_int n, const float* d, const lapack_complex_float* e, float anorm, float* rcond);
+lapack_int LAPACKE_zptcon(lapack_int n, const double* d, const lapack_complex_double* e, double anorm, double* rcond);
 
-lapack_int LAPACKE_sptcon( lapack_int n, const float* d, const float* e,
-                           float anorm, float* rcond );
-lapack_int LAPACKE_dptcon( lapack_int n, const double* d, const double* e,
-                           double anorm, double* rcond );
-lapack_int LAPACKE_cptcon( lapack_int n, const float* d,
-                           const lapack_complex_float* e, float anorm,
-                           float* rcond );
-lapack_int LAPACKE_zptcon( lapack_int n, const double* d,
-                           const lapack_complex_double* e, double anorm,
-                           double* rcond );
+lapack_int LAPACKE_spteqr(int matrix_order, char compz, lapack_int n, float* d, float* e, float* z, lapack_int ldz);
+lapack_int LAPACKE_dpteqr(int matrix_order, char compz, lapack_int n, double* d, double* e, double* z, lapack_int ldz);
+lapack_int LAPACKE_cpteqr(int matrix_order, char compz, lapack_int n, float* d, float* e, lapack_complex_float* z,
+                          lapack_int ldz);
+lapack_int LAPACKE_zpteqr(int matrix_order, char compz, lapack_int n, double* d, double* e, lapack_complex_double* z,
+                          lapack_int ldz);
 
-lapack_int LAPACKE_spteqr( int matrix_order, char compz, lapack_int n, float* d,
-                           float* e, float* z, lapack_int ldz );
-lapack_int LAPACKE_dpteqr( int matrix_order, char compz, lapack_int n,
-                           double* d, double* e, double* z, lapack_int ldz );
-lapack_int LAPACKE_cpteqr( int matrix_order, char compz, lapack_int n, float* d,
-                           float* e, lapack_complex_float* z, lapack_int ldz );
-lapack_int LAPACKE_zpteqr( int matrix_order, char compz, lapack_int n,
-                           double* d, double* e, lapack_complex_double* z,
-                           lapack_int ldz );
+lapack_int LAPACKE_sptrfs(int matrix_order, lapack_int n, lapack_int nrhs, const float* d, const float* e,
+                          const float* df, const float* ef, const float* b, lapack_int ldb, float* x, lapack_int ldx,
+                          float* ferr, float* berr);
+lapack_int LAPACKE_dptrfs(int matrix_order, lapack_int n, lapack_int nrhs, const double* d, const double* e,
+                          const double* df, const double* ef, const double* b, lapack_int ldb, double* x,
+                          lapack_int ldx, double* ferr, double* berr);
+lapack_int LAPACKE_cptrfs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const float* d,
+                          const lapack_complex_float* e, const float* df, const lapack_complex_float* ef,
+                          const lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x, lapack_int ldx,
+                          float* ferr, float* berr);
+lapack_int LAPACKE_zptrfs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const double* d,
+                          const lapack_complex_double* e, const double* df, const lapack_complex_double* ef,
+                          const lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x, lapack_int ldx,
+                          double* ferr, double* berr);
 
-lapack_int LAPACKE_sptrfs( int matrix_order, lapack_int n, lapack_int nrhs,
-                           const float* d, const float* e, const float* df,
-                           const float* ef, const float* b, lapack_int ldb,
-                           float* x, lapack_int ldx, float* ferr, float* berr );
-lapack_int LAPACKE_dptrfs( int matrix_order, lapack_int n, lapack_int nrhs,
-                           const double* d, const double* e, const double* df,
-                           const double* ef, const double* b, lapack_int ldb,
-                           double* x, lapack_int ldx, double* ferr,
-                           double* berr );
-lapack_int LAPACKE_cptrfs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const float* d,
-                           const lapack_complex_float* e, const float* df,
-                           const lapack_complex_float* ef,
-                           const lapack_complex_float* b, lapack_int ldb,
-                           lapack_complex_float* x, lapack_int ldx, float* ferr,
-                           float* berr );
-lapack_int LAPACKE_zptrfs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const double* d,
-                           const lapack_complex_double* e, const double* df,
-                           const lapack_complex_double* ef,
-                           const lapack_complex_double* b, lapack_int ldb,
-                           lapack_complex_double* x, lapack_int ldx,
-                           double* ferr, double* berr );
+lapack_int LAPACKE_sptsv(int matrix_order, lapack_int n, lapack_int nrhs, float* d, float* e, float* b, lapack_int ldb);
+lapack_int LAPACKE_dptsv(int matrix_order, lapack_int n, lapack_int nrhs, double* d, double* e, double* b,
+                         lapack_int ldb);
+lapack_int LAPACKE_cptsv(int matrix_order, lapack_int n, lapack_int nrhs, float* d, lapack_complex_float* e,
+                         lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zptsv(int matrix_order, lapack_int n, lapack_int nrhs, double* d, lapack_complex_double* e,
+                         lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_sptsv( int matrix_order, lapack_int n, lapack_int nrhs,
-                          float* d, float* e, float* b, lapack_int ldb );
-lapack_int LAPACKE_dptsv( int matrix_order, lapack_int n, lapack_int nrhs,
-                          double* d, double* e, double* b, lapack_int ldb );
-lapack_int LAPACKE_cptsv( int matrix_order, lapack_int n, lapack_int nrhs,
-                          float* d, lapack_complex_float* e,
-                          lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_zptsv( int matrix_order, lapack_int n, lapack_int nrhs,
-                          double* d, lapack_complex_double* e,
-                          lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_sptsvx(int matrix_order, char fact, lapack_int n, lapack_int nrhs, const float* d, const float* e,
+                          float* df, float* ef, const float* b, lapack_int ldb, float* x, lapack_int ldx, float* rcond,
+                          float* ferr, float* berr);
+lapack_int LAPACKE_dptsvx(int matrix_order, char fact, lapack_int n, lapack_int nrhs, const double* d, const double* e,
+                          double* df, double* ef, const double* b, lapack_int ldb, double* x, lapack_int ldx,
+                          double* rcond, double* ferr, double* berr);
+lapack_int LAPACKE_cptsvx(int matrix_order, char fact, lapack_int n, lapack_int nrhs, const float* d,
+                          const lapack_complex_float* e, float* df, lapack_complex_float* ef,
+                          const lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x, lapack_int ldx,
+                          float* rcond, float* ferr, float* berr);
+lapack_int LAPACKE_zptsvx(int matrix_order, char fact, lapack_int n, lapack_int nrhs, const double* d,
+                          const lapack_complex_double* e, double* df, lapack_complex_double* ef,
+                          const lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x, lapack_int ldx,
+                          double* rcond, double* ferr, double* berr);
 
-lapack_int LAPACKE_sptsvx( int matrix_order, char fact, lapack_int n,
-                           lapack_int nrhs, const float* d, const float* e,
-                           float* df, float* ef, const float* b, lapack_int ldb,
-                           float* x, lapack_int ldx, float* rcond, float* ferr,
-                           float* berr );
-lapack_int LAPACKE_dptsvx( int matrix_order, char fact, lapack_int n,
-                           lapack_int nrhs, const double* d, const double* e,
-                           double* df, double* ef, const double* b,
-                           lapack_int ldb, double* x, lapack_int ldx,
-                           double* rcond, double* ferr, double* berr );
-lapack_int LAPACKE_cptsvx( int matrix_order, char fact, lapack_int n,
-                           lapack_int nrhs, const float* d,
-                           const lapack_complex_float* e, float* df,
-                           lapack_complex_float* ef,
-                           const lapack_complex_float* b, lapack_int ldb,
-                           lapack_complex_float* x, lapack_int ldx,
-                           float* rcond, float* ferr, float* berr );
-lapack_int LAPACKE_zptsvx( int matrix_order, char fact, lapack_int n,
-                           lapack_int nrhs, const double* d,
-                           const lapack_complex_double* e, double* df,
-                           lapack_complex_double* ef,
-                           const lapack_complex_double* b, lapack_int ldb,
-                           lapack_complex_double* x, lapack_int ldx,
-                           double* rcond, double* ferr, double* berr );
+lapack_int LAPACKE_spttrf(lapack_int n, float* d, float* e);
+lapack_int LAPACKE_dpttrf(lapack_int n, double* d, double* e);
+lapack_int LAPACKE_cpttrf(lapack_int n, float* d, lapack_complex_float* e);
+lapack_int LAPACKE_zpttrf(lapack_int n, double* d, lapack_complex_double* e);
 
-lapack_int LAPACKE_spttrf( lapack_int n, float* d, float* e );
-lapack_int LAPACKE_dpttrf( lapack_int n, double* d, double* e );
-lapack_int LAPACKE_cpttrf( lapack_int n, float* d, lapack_complex_float* e );
-lapack_int LAPACKE_zpttrf( lapack_int n, double* d, lapack_complex_double* e );
+lapack_int LAPACKE_spttrs(int matrix_order, lapack_int n, lapack_int nrhs, const float* d, const float* e, float* b,
+                          lapack_int ldb);
+lapack_int LAPACKE_dpttrs(int matrix_order, lapack_int n, lapack_int nrhs, const double* d, const double* e, double* b,
+                          lapack_int ldb);
+lapack_int LAPACKE_cpttrs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const float* d,
+                          const lapack_complex_float* e, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zpttrs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const double* d,
+                          const lapack_complex_double* e, lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_spttrs( int matrix_order, lapack_int n, lapack_int nrhs,
-                           const float* d, const float* e, float* b,
-                           lapack_int ldb );
-lapack_int LAPACKE_dpttrs( int matrix_order, lapack_int n, lapack_int nrhs,
-                           const double* d, const double* e, double* b,
-                           lapack_int ldb );
-lapack_int LAPACKE_cpttrs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const float* d,
-                           const lapack_complex_float* e,
-                           lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_zpttrs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const double* d,
-                           const lapack_complex_double* e,
-                           lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_ssbev(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int kd, float* ab,
+                         lapack_int ldab, float* w, float* z, lapack_int ldz);
+lapack_int LAPACKE_dsbev(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int kd, double* ab,
+                         lapack_int ldab, double* w, double* z, lapack_int ldz);
 
-lapack_int LAPACKE_ssbev( int matrix_order, char jobz, char uplo, lapack_int n,
-                          lapack_int kd, float* ab, lapack_int ldab, float* w,
-                          float* z, lapack_int ldz );
-lapack_int LAPACKE_dsbev( int matrix_order, char jobz, char uplo, lapack_int n,
-                          lapack_int kd, double* ab, lapack_int ldab, double* w,
-                          double* z, lapack_int ldz );
+lapack_int LAPACKE_ssbevd(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int kd, float* ab,
+                          lapack_int ldab, float* w, float* z, lapack_int ldz);
+lapack_int LAPACKE_dsbevd(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int kd, double* ab,
+                          lapack_int ldab, double* w, double* z, lapack_int ldz);
 
-lapack_int LAPACKE_ssbevd( int matrix_order, char jobz, char uplo, lapack_int n,
-                           lapack_int kd, float* ab, lapack_int ldab, float* w,
-                           float* z, lapack_int ldz );
-lapack_int LAPACKE_dsbevd( int matrix_order, char jobz, char uplo, lapack_int n,
-                           lapack_int kd, double* ab, lapack_int ldab,
-                           double* w, double* z, lapack_int ldz );
+lapack_int LAPACKE_ssbevx(int matrix_order, char jobz, char range, char uplo, lapack_int n, lapack_int kd, float* ab,
+                          lapack_int ldab, float* q, lapack_int ldq, float vl, float vu, lapack_int il, lapack_int iu,
+                          float abstol, lapack_int* m, float* w, float* z, lapack_int ldz, lapack_int* ifail);
+lapack_int LAPACKE_dsbevx(int matrix_order, char jobz, char range, char uplo, lapack_int n, lapack_int kd, double* ab,
+                          lapack_int ldab, double* q, lapack_int ldq, double vl, double vu, lapack_int il,
+                          lapack_int iu, double abstol, lapack_int* m, double* w, double* z, lapack_int ldz,
+                          lapack_int* ifail);
 
-lapack_int LAPACKE_ssbevx( int matrix_order, char jobz, char range, char uplo,
-                           lapack_int n, lapack_int kd, float* ab,
-                           lapack_int ldab, float* q, lapack_int ldq, float vl,
-                           float vu, lapack_int il, lapack_int iu, float abstol,
-                           lapack_int* m, float* w, float* z, lapack_int ldz,
-                           lapack_int* ifail );
-lapack_int LAPACKE_dsbevx( int matrix_order, char jobz, char range, char uplo,
-                           lapack_int n, lapack_int kd, double* ab,
-                           lapack_int ldab, double* q, lapack_int ldq,
-                           double vl, double vu, lapack_int il, lapack_int iu,
-                           double abstol, lapack_int* m, double* w, double* z,
-                           lapack_int ldz, lapack_int* ifail );
+lapack_int LAPACKE_ssbgst(int matrix_order, char vect, char uplo, lapack_int n, lapack_int ka, lapack_int kb, float* ab,
+                          lapack_int ldab, const float* bb, lapack_int ldbb, float* x, lapack_int ldx);
+lapack_int LAPACKE_dsbgst(int matrix_order, char vect, char uplo, lapack_int n, lapack_int ka, lapack_int kb,
+                          double* ab, lapack_int ldab, const double* bb, lapack_int ldbb, double* x, lapack_int ldx);
 
-lapack_int LAPACKE_ssbgst( int matrix_order, char vect, char uplo, lapack_int n,
-                           lapack_int ka, lapack_int kb, float* ab,
-                           lapack_int ldab, const float* bb, lapack_int ldbb,
-                           float* x, lapack_int ldx );
-lapack_int LAPACKE_dsbgst( int matrix_order, char vect, char uplo, lapack_int n,
-                           lapack_int ka, lapack_int kb, double* ab,
-                           lapack_int ldab, const double* bb, lapack_int ldbb,
-                           double* x, lapack_int ldx );
+lapack_int LAPACKE_ssbgv(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int ka, lapack_int kb, float* ab,
+                         lapack_int ldab, float* bb, lapack_int ldbb, float* w, float* z, lapack_int ldz);
+lapack_int LAPACKE_dsbgv(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int ka, lapack_int kb, double* ab,
+                         lapack_int ldab, double* bb, lapack_int ldbb, double* w, double* z, lapack_int ldz);
 
-lapack_int LAPACKE_ssbgv( int matrix_order, char jobz, char uplo, lapack_int n,
-                          lapack_int ka, lapack_int kb, float* ab,
-                          lapack_int ldab, float* bb, lapack_int ldbb, float* w,
-                          float* z, lapack_int ldz );
-lapack_int LAPACKE_dsbgv( int matrix_order, char jobz, char uplo, lapack_int n,
-                          lapack_int ka, lapack_int kb, double* ab,
-                          lapack_int ldab, double* bb, lapack_int ldbb,
-                          double* w, double* z, lapack_int ldz );
+lapack_int LAPACKE_ssbgvd(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int ka, lapack_int kb, float* ab,
+                          lapack_int ldab, float* bb, lapack_int ldbb, float* w, float* z, lapack_int ldz);
+lapack_int LAPACKE_dsbgvd(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int ka, lapack_int kb,
+                          double* ab, lapack_int ldab, double* bb, lapack_int ldbb, double* w, double* z,
+                          lapack_int ldz);
 
-lapack_int LAPACKE_ssbgvd( int matrix_order, char jobz, char uplo, lapack_int n,
-                           lapack_int ka, lapack_int kb, float* ab,
-                           lapack_int ldab, float* bb, lapack_int ldbb,
-                           float* w, float* z, lapack_int ldz );
-lapack_int LAPACKE_dsbgvd( int matrix_order, char jobz, char uplo, lapack_int n,
-                           lapack_int ka, lapack_int kb, double* ab,
-                           lapack_int ldab, double* bb, lapack_int ldbb,
-                           double* w, double* z, lapack_int ldz );
+lapack_int LAPACKE_ssbgvx(int matrix_order, char jobz, char range, char uplo, lapack_int n, lapack_int ka,
+                          lapack_int kb, float* ab, lapack_int ldab, float* bb, lapack_int ldbb, float* q,
+                          lapack_int ldq, float vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int* m,
+                          float* w, float* z, lapack_int ldz, lapack_int* ifail);
+lapack_int LAPACKE_dsbgvx(int matrix_order, char jobz, char range, char uplo, lapack_int n, lapack_int ka,
+                          lapack_int kb, double* ab, lapack_int ldab, double* bb, lapack_int ldbb, double* q,
+                          lapack_int ldq, double vl, double vu, lapack_int il, lapack_int iu, double abstol,
+                          lapack_int* m, double* w, double* z, lapack_int ldz, lapack_int* ifail);
 
-lapack_int LAPACKE_ssbgvx( int matrix_order, char jobz, char range, char uplo,
-                           lapack_int n, lapack_int ka, lapack_int kb,
-                           float* ab, lapack_int ldab, float* bb,
-                           lapack_int ldbb, float* q, lapack_int ldq, float vl,
-                           float vu, lapack_int il, lapack_int iu, float abstol,
-                           lapack_int* m, float* w, float* z, lapack_int ldz,
-                           lapack_int* ifail );
-lapack_int LAPACKE_dsbgvx( int matrix_order, char jobz, char range, char uplo,
-                           lapack_int n, lapack_int ka, lapack_int kb,
-                           double* ab, lapack_int ldab, double* bb,
-                           lapack_int ldbb, double* q, lapack_int ldq,
-                           double vl, double vu, lapack_int il, lapack_int iu,
-                           double abstol, lapack_int* m, double* w, double* z,
-                           lapack_int ldz, lapack_int* ifail );
+lapack_int LAPACKE_ssbtrd(int matrix_order, char vect, char uplo, lapack_int n, lapack_int kd, float* ab,
+                          lapack_int ldab, float* d, float* e, float* q, lapack_int ldq);
+lapack_int LAPACKE_dsbtrd(int matrix_order, char vect, char uplo, lapack_int n, lapack_int kd, double* ab,
+                          lapack_int ldab, double* d, double* e, double* q, lapack_int ldq);
 
-lapack_int LAPACKE_ssbtrd( int matrix_order, char vect, char uplo, lapack_int n,
-                           lapack_int kd, float* ab, lapack_int ldab, float* d,
-                           float* e, float* q, lapack_int ldq );
-lapack_int LAPACKE_dsbtrd( int matrix_order, char vect, char uplo, lapack_int n,
-                           lapack_int kd, double* ab, lapack_int ldab,
-                           double* d, double* e, double* q, lapack_int ldq );
+lapack_int LAPACKE_ssfrk(int matrix_order, char transr, char uplo, char trans, lapack_int n, lapack_int k, float alpha,
+                         const float* a, lapack_int lda, float beta, float* c);
+lapack_int LAPACKE_dsfrk(int matrix_order, char transr, char uplo, char trans, lapack_int n, lapack_int k, double alpha,
+                         const double* a, lapack_int lda, double beta, double* c);
 
-lapack_int LAPACKE_ssfrk( int matrix_order, char transr, char uplo, char trans,
-                          lapack_int n, lapack_int k, float alpha,
-                          const float* a, lapack_int lda, float beta,
-                          float* c );
-lapack_int LAPACKE_dsfrk( int matrix_order, char transr, char uplo, char trans,
-                          lapack_int n, lapack_int k, double alpha,
-                          const double* a, lapack_int lda, double beta,
-                          double* c );
+lapack_int LAPACKE_sspcon(int matrix_order, char uplo, lapack_int n, const float* ap, const lapack_int* ipiv,
+                          float anorm, float* rcond);
+lapack_int LAPACKE_dspcon(int matrix_order, char uplo, lapack_int n, const double* ap, const lapack_int* ipiv,
+                          double anorm, double* rcond);
+lapack_int LAPACKE_cspcon(int matrix_order, char uplo, lapack_int n, const lapack_complex_float* ap,
+                          const lapack_int* ipiv, float anorm, float* rcond);
+lapack_int LAPACKE_zspcon(int matrix_order, char uplo, lapack_int n, const lapack_complex_double* ap,
+                          const lapack_int* ipiv, double anorm, double* rcond);
 
-lapack_int LAPACKE_sspcon( int matrix_order, char uplo, lapack_int n,
-                           const float* ap, const lapack_int* ipiv, float anorm,
-                           float* rcond );
-lapack_int LAPACKE_dspcon( int matrix_order, char uplo, lapack_int n,
-                           const double* ap, const lapack_int* ipiv,
-                           double anorm, double* rcond );
-lapack_int LAPACKE_cspcon( int matrix_order, char uplo, lapack_int n,
-                           const lapack_complex_float* ap,
-                           const lapack_int* ipiv, float anorm, float* rcond );
-lapack_int LAPACKE_zspcon( int matrix_order, char uplo, lapack_int n,
-                           const lapack_complex_double* ap,
-                           const lapack_int* ipiv, double anorm,
-                           double* rcond );
+lapack_int LAPACKE_sspev(int matrix_order, char jobz, char uplo, lapack_int n, float* ap, float* w, float* z,
+                         lapack_int ldz);
+lapack_int LAPACKE_dspev(int matrix_order, char jobz, char uplo, lapack_int n, double* ap, double* w, double* z,
+                         lapack_int ldz);
 
-lapack_int LAPACKE_sspev( int matrix_order, char jobz, char uplo, lapack_int n,
-                          float* ap, float* w, float* z, lapack_int ldz );
-lapack_int LAPACKE_dspev( int matrix_order, char jobz, char uplo, lapack_int n,
-                          double* ap, double* w, double* z, lapack_int ldz );
+lapack_int LAPACKE_sspevd(int matrix_order, char jobz, char uplo, lapack_int n, float* ap, float* w, float* z,
+                          lapack_int ldz);
+lapack_int LAPACKE_dspevd(int matrix_order, char jobz, char uplo, lapack_int n, double* ap, double* w, double* z,
+                          lapack_int ldz);
 
-lapack_int LAPACKE_sspevd( int matrix_order, char jobz, char uplo, lapack_int n,
-                           float* ap, float* w, float* z, lapack_int ldz );
-lapack_int LAPACKE_dspevd( int matrix_order, char jobz, char uplo, lapack_int n,
-                           double* ap, double* w, double* z, lapack_int ldz );
+lapack_int LAPACKE_sspevx(int matrix_order, char jobz, char range, char uplo, lapack_int n, float* ap, float vl,
+                          float vu, lapack_int il, lapack_int iu, float abstol, lapack_int* m, float* w, float* z,
+                          lapack_int ldz, lapack_int* ifail);
+lapack_int LAPACKE_dspevx(int matrix_order, char jobz, char range, char uplo, lapack_int n, double* ap, double vl,
+                          double vu, lapack_int il, lapack_int iu, double abstol, lapack_int* m, double* w, double* z,
+                          lapack_int ldz, lapack_int* ifail);
 
-lapack_int LAPACKE_sspevx( int matrix_order, char jobz, char range, char uplo,
-                           lapack_int n, float* ap, float vl, float vu,
-                           lapack_int il, lapack_int iu, float abstol,
-                           lapack_int* m, float* w, float* z, lapack_int ldz,
-                           lapack_int* ifail );
-lapack_int LAPACKE_dspevx( int matrix_order, char jobz, char range, char uplo,
-                           lapack_int n, double* ap, double vl, double vu,
-                           lapack_int il, lapack_int iu, double abstol,
-                           lapack_int* m, double* w, double* z, lapack_int ldz,
-                           lapack_int* ifail );
+lapack_int LAPACKE_sspgst(int matrix_order, lapack_int itype, char uplo, lapack_int n, float* ap, const float* bp);
+lapack_int LAPACKE_dspgst(int matrix_order, lapack_int itype, char uplo, lapack_int n, double* ap, const double* bp);
 
-lapack_int LAPACKE_sspgst( int matrix_order, lapack_int itype, char uplo,
-                           lapack_int n, float* ap, const float* bp );
-lapack_int LAPACKE_dspgst( int matrix_order, lapack_int itype, char uplo,
-                           lapack_int n, double* ap, const double* bp );
+lapack_int LAPACKE_sspgv(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n, float* ap, float* bp,
+                         float* w, float* z, lapack_int ldz);
+lapack_int LAPACKE_dspgv(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n, double* ap, double* bp,
+                         double* w, double* z, lapack_int ldz);
 
-lapack_int LAPACKE_sspgv( int matrix_order, lapack_int itype, char jobz,
-                          char uplo, lapack_int n, float* ap, float* bp,
-                          float* w, float* z, lapack_int ldz );
-lapack_int LAPACKE_dspgv( int matrix_order, lapack_int itype, char jobz,
-                          char uplo, lapack_int n, double* ap, double* bp,
-                          double* w, double* z, lapack_int ldz );
+lapack_int LAPACKE_sspgvd(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n, float* ap, float* bp,
+                          float* w, float* z, lapack_int ldz);
+lapack_int LAPACKE_dspgvd(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n, double* ap,
+                          double* bp, double* w, double* z, lapack_int ldz);
 
-lapack_int LAPACKE_sspgvd( int matrix_order, lapack_int itype, char jobz,
-                           char uplo, lapack_int n, float* ap, float* bp,
-                           float* w, float* z, lapack_int ldz );
-lapack_int LAPACKE_dspgvd( int matrix_order, lapack_int itype, char jobz,
-                           char uplo, lapack_int n, double* ap, double* bp,
-                           double* w, double* z, lapack_int ldz );
+lapack_int LAPACKE_sspgvx(int matrix_order, lapack_int itype, char jobz, char range, char uplo, lapack_int n, float* ap,
+                          float* bp, float vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int* m,
+                          float* w, float* z, lapack_int ldz, lapack_int* ifail);
+lapack_int LAPACKE_dspgvx(int matrix_order, lapack_int itype, char jobz, char range, char uplo, lapack_int n,
+                          double* ap, double* bp, double vl, double vu, lapack_int il, lapack_int iu, double abstol,
+                          lapack_int* m, double* w, double* z, lapack_int ldz, lapack_int* ifail);
 
-lapack_int LAPACKE_sspgvx( int matrix_order, lapack_int itype, char jobz,
-                           char range, char uplo, lapack_int n, float* ap,
-                           float* bp, float vl, float vu, lapack_int il,
-                           lapack_int iu, float abstol, lapack_int* m, float* w,
-                           float* z, lapack_int ldz, lapack_int* ifail );
-lapack_int LAPACKE_dspgvx( int matrix_order, lapack_int itype, char jobz,
-                           char range, char uplo, lapack_int n, double* ap,
-                           double* bp, double vl, double vu, lapack_int il,
-                           lapack_int iu, double abstol, lapack_int* m,
-                           double* w, double* z, lapack_int ldz,
-                           lapack_int* ifail );
+lapack_int LAPACKE_ssprfs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const float* ap, const float* afp,
+                          const lapack_int* ipiv, const float* b, lapack_int ldb, float* x, lapack_int ldx, float* ferr,
+                          float* berr);
+lapack_int LAPACKE_dsprfs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const double* ap,
+                          const double* afp, const lapack_int* ipiv, const double* b, lapack_int ldb, double* x,
+                          lapack_int ldx, double* ferr, double* berr);
+lapack_int LAPACKE_csprfs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_float* ap,
+                          const lapack_complex_float* afp, const lapack_int* ipiv, const lapack_complex_float* b,
+                          lapack_int ldb, lapack_complex_float* x, lapack_int ldx, float* ferr, float* berr);
+lapack_int LAPACKE_zsprfs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double* ap,
+                          const lapack_complex_double* afp, const lapack_int* ipiv, const lapack_complex_double* b,
+                          lapack_int ldb, lapack_complex_double* x, lapack_int ldx, double* ferr, double* berr);
 
-lapack_int LAPACKE_ssprfs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const float* ap, const float* afp,
-                           const lapack_int* ipiv, const float* b,
-                           lapack_int ldb, float* x, lapack_int ldx,
-                           float* ferr, float* berr );
-lapack_int LAPACKE_dsprfs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const double* ap, const double* afp,
-                           const lapack_int* ipiv, const double* b,
-                           lapack_int ldb, double* x, lapack_int ldx,
-                           double* ferr, double* berr );
-lapack_int LAPACKE_csprfs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_float* ap,
-                           const lapack_complex_float* afp,
-                           const lapack_int* ipiv,
-                           const lapack_complex_float* b, lapack_int ldb,
-                           lapack_complex_float* x, lapack_int ldx, float* ferr,
-                           float* berr );
-lapack_int LAPACKE_zsprfs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_double* ap,
-                           const lapack_complex_double* afp,
-                           const lapack_int* ipiv,
-                           const lapack_complex_double* b, lapack_int ldb,
-                           lapack_complex_double* x, lapack_int ldx,
-                           double* ferr, double* berr );
+lapack_int LAPACKE_sspsv(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, float* ap, lapack_int* ipiv,
+                         float* b, lapack_int ldb);
+lapack_int LAPACKE_dspsv(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, double* ap, lapack_int* ipiv,
+                         double* b, lapack_int ldb);
+lapack_int LAPACKE_cspsv(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_float* ap,
+                         lapack_int* ipiv, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zspsv(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double* ap,
+                         lapack_int* ipiv, lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_sspsv( int matrix_order, char uplo, lapack_int n,
-                          lapack_int nrhs, float* ap, lapack_int* ipiv,
-                          float* b, lapack_int ldb );
-lapack_int LAPACKE_dspsv( int matrix_order, char uplo, lapack_int n,
-                          lapack_int nrhs, double* ap, lapack_int* ipiv,
-                          double* b, lapack_int ldb );
-lapack_int LAPACKE_cspsv( int matrix_order, char uplo, lapack_int n,
-                          lapack_int nrhs, lapack_complex_float* ap,
-                          lapack_int* ipiv, lapack_complex_float* b,
-                          lapack_int ldb );
-lapack_int LAPACKE_zspsv( int matrix_order, char uplo, lapack_int n,
-                          lapack_int nrhs, lapack_complex_double* ap,
-                          lapack_int* ipiv, lapack_complex_double* b,
-                          lapack_int ldb );
+lapack_int LAPACKE_sspsvx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs, const float* ap,
+                          float* afp, lapack_int* ipiv, const float* b, lapack_int ldb, float* x, lapack_int ldx,
+                          float* rcond, float* ferr, float* berr);
+lapack_int LAPACKE_dspsvx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs, const double* ap,
+                          double* afp, lapack_int* ipiv, const double* b, lapack_int ldb, double* x, lapack_int ldx,
+                          double* rcond, double* ferr, double* berr);
+lapack_int LAPACKE_cspsvx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                          const lapack_complex_float* ap, lapack_complex_float* afp, lapack_int* ipiv,
+                          const lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x, lapack_int ldx,
+                          float* rcond, float* ferr, float* berr);
+lapack_int LAPACKE_zspsvx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                          const lapack_complex_double* ap, lapack_complex_double* afp, lapack_int* ipiv,
+                          const lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x, lapack_int ldx,
+                          double* rcond, double* ferr, double* berr);
 
-lapack_int LAPACKE_sspsvx( int matrix_order, char fact, char uplo, lapack_int n,
-                           lapack_int nrhs, const float* ap, float* afp,
-                           lapack_int* ipiv, const float* b, lapack_int ldb,
-                           float* x, lapack_int ldx, float* rcond, float* ferr,
-                           float* berr );
-lapack_int LAPACKE_dspsvx( int matrix_order, char fact, char uplo, lapack_int n,
-                           lapack_int nrhs, const double* ap, double* afp,
-                           lapack_int* ipiv, const double* b, lapack_int ldb,
-                           double* x, lapack_int ldx, double* rcond,
-                           double* ferr, double* berr );
-lapack_int LAPACKE_cspsvx( int matrix_order, char fact, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_float* ap,
-                           lapack_complex_float* afp, lapack_int* ipiv,
-                           const lapack_complex_float* b, lapack_int ldb,
-                           lapack_complex_float* x, lapack_int ldx,
-                           float* rcond, float* ferr, float* berr );
-lapack_int LAPACKE_zspsvx( int matrix_order, char fact, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_double* ap,
-                           lapack_complex_double* afp, lapack_int* ipiv,
-                           const lapack_complex_double* b, lapack_int ldb,
-                           lapack_complex_double* x, lapack_int ldx,
-                           double* rcond, double* ferr, double* berr );
+lapack_int LAPACKE_ssptrd(int matrix_order, char uplo, lapack_int n, float* ap, float* d, float* e, float* tau);
+lapack_int LAPACKE_dsptrd(int matrix_order, char uplo, lapack_int n, double* ap, double* d, double* e, double* tau);
 
-lapack_int LAPACKE_ssptrd( int matrix_order, char uplo, lapack_int n, float* ap,
-                           float* d, float* e, float* tau );
-lapack_int LAPACKE_dsptrd( int matrix_order, char uplo, lapack_int n,
-                           double* ap, double* d, double* e, double* tau );
+lapack_int LAPACKE_ssptrf(int matrix_order, char uplo, lapack_int n, float* ap, lapack_int* ipiv);
+lapack_int LAPACKE_dsptrf(int matrix_order, char uplo, lapack_int n, double* ap, lapack_int* ipiv);
+lapack_int LAPACKE_csptrf(int matrix_order, char uplo, lapack_int n, lapack_complex_float* ap, lapack_int* ipiv);
+lapack_int LAPACKE_zsptrf(int matrix_order, char uplo, lapack_int n, lapack_complex_double* ap, lapack_int* ipiv);
 
-lapack_int LAPACKE_ssptrf( int matrix_order, char uplo, lapack_int n, float* ap,
-                           lapack_int* ipiv );
-lapack_int LAPACKE_dsptrf( int matrix_order, char uplo, lapack_int n,
-                           double* ap, lapack_int* ipiv );
-lapack_int LAPACKE_csptrf( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_float* ap, lapack_int* ipiv );
-lapack_int LAPACKE_zsptrf( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_double* ap, lapack_int* ipiv );
+lapack_int LAPACKE_ssptri(int matrix_order, char uplo, lapack_int n, float* ap, const lapack_int* ipiv);
+lapack_int LAPACKE_dsptri(int matrix_order, char uplo, lapack_int n, double* ap, const lapack_int* ipiv);
+lapack_int LAPACKE_csptri(int matrix_order, char uplo, lapack_int n, lapack_complex_float* ap, const lapack_int* ipiv);
+lapack_int LAPACKE_zsptri(int matrix_order, char uplo, lapack_int n, lapack_complex_double* ap, const lapack_int* ipiv);
 
-lapack_int LAPACKE_ssptri( int matrix_order, char uplo, lapack_int n, float* ap,
-                           const lapack_int* ipiv );
-lapack_int LAPACKE_dsptri( int matrix_order, char uplo, lapack_int n,
-                           double* ap, const lapack_int* ipiv );
-lapack_int LAPACKE_csptri( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_float* ap, const lapack_int* ipiv );
-lapack_int LAPACKE_zsptri( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_double* ap, const lapack_int* ipiv );
+lapack_int LAPACKE_ssptrs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const float* ap,
+                          const lapack_int* ipiv, float* b, lapack_int ldb);
+lapack_int LAPACKE_dsptrs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const double* ap,
+                          const lapack_int* ipiv, double* b, lapack_int ldb);
+lapack_int LAPACKE_csptrs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_float* ap,
+                          const lapack_int* ipiv, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zsptrs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double* ap,
+                          const lapack_int* ipiv, lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_ssptrs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const float* ap,
-                           const lapack_int* ipiv, float* b, lapack_int ldb );
-lapack_int LAPACKE_dsptrs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const double* ap,
-                           const lapack_int* ipiv, double* b, lapack_int ldb );
-lapack_int LAPACKE_csptrs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_float* ap,
-                           const lapack_int* ipiv, lapack_complex_float* b,
-                           lapack_int ldb );
-lapack_int LAPACKE_zsptrs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_double* ap,
-                           const lapack_int* ipiv, lapack_complex_double* b,
-                           lapack_int ldb );
+lapack_int LAPACKE_sstebz(char range, char order, lapack_int n, float vl, float vu, lapack_int il, lapack_int iu,
+                          float abstol, const float* d, const float* e, lapack_int* m, lapack_int* nsplit, float* w,
+                          lapack_int* iblock, lapack_int* isplit);
+lapack_int LAPACKE_dstebz(char range, char order, lapack_int n, double vl, double vu, lapack_int il, lapack_int iu,
+                          double abstol, const double* d, const double* e, lapack_int* m, lapack_int* nsplit, double* w,
+                          lapack_int* iblock, lapack_int* isplit);
 
-lapack_int LAPACKE_sstebz( char range, char order, lapack_int n, float vl,
-                           float vu, lapack_int il, lapack_int iu, float abstol,
-                           const float* d, const float* e, lapack_int* m,
-                           lapack_int* nsplit, float* w, lapack_int* iblock,
-                           lapack_int* isplit );
-lapack_int LAPACKE_dstebz( char range, char order, lapack_int n, double vl,
-                           double vu, lapack_int il, lapack_int iu,
-                           double abstol, const double* d, const double* e,
-                           lapack_int* m, lapack_int* nsplit, double* w,
-                           lapack_int* iblock, lapack_int* isplit );
+lapack_int LAPACKE_sstedc(int matrix_order, char compz, lapack_int n, float* d, float* e, float* z, lapack_int ldz);
+lapack_int LAPACKE_dstedc(int matrix_order, char compz, lapack_int n, double* d, double* e, double* z, lapack_int ldz);
+lapack_int LAPACKE_cstedc(int matrix_order, char compz, lapack_int n, float* d, float* e, lapack_complex_float* z,
+                          lapack_int ldz);
+lapack_int LAPACKE_zstedc(int matrix_order, char compz, lapack_int n, double* d, double* e, lapack_complex_double* z,
+                          lapack_int ldz);
 
-lapack_int LAPACKE_sstedc( int matrix_order, char compz, lapack_int n, float* d,
-                           float* e, float* z, lapack_int ldz );
-lapack_int LAPACKE_dstedc( int matrix_order, char compz, lapack_int n,
-                           double* d, double* e, double* z, lapack_int ldz );
-lapack_int LAPACKE_cstedc( int matrix_order, char compz, lapack_int n, float* d,
-                           float* e, lapack_complex_float* z, lapack_int ldz );
-lapack_int LAPACKE_zstedc( int matrix_order, char compz, lapack_int n,
-                           double* d, double* e, lapack_complex_double* z,
-                           lapack_int ldz );
+lapack_int LAPACKE_sstegr(int matrix_order, char jobz, char range, lapack_int n, float* d, float* e, float vl, float vu,
+                          lapack_int il, lapack_int iu, float abstol, lapack_int* m, float* w, float* z, lapack_int ldz,
+                          lapack_int* isuppz);
+lapack_int LAPACKE_dstegr(int matrix_order, char jobz, char range, lapack_int n, double* d, double* e, double vl,
+                          double vu, lapack_int il, lapack_int iu, double abstol, lapack_int* m, double* w, double* z,
+                          lapack_int ldz, lapack_int* isuppz);
+lapack_int LAPACKE_cstegr(int matrix_order, char jobz, char range, lapack_int n, float* d, float* e, float vl, float vu,
+                          lapack_int il, lapack_int iu, float abstol, lapack_int* m, float* w, lapack_complex_float* z,
+                          lapack_int ldz, lapack_int* isuppz);
+lapack_int LAPACKE_zstegr(int matrix_order, char jobz, char range, lapack_int n, double* d, double* e, double vl,
+                          double vu, lapack_int il, lapack_int iu, double abstol, lapack_int* m, double* w,
+                          lapack_complex_double* z, lapack_int ldz, lapack_int* isuppz);
 
-lapack_int LAPACKE_sstegr( int matrix_order, char jobz, char range,
-                           lapack_int n, float* d, float* e, float vl, float vu,
-                           lapack_int il, lapack_int iu, float abstol,
-                           lapack_int* m, float* w, float* z, lapack_int ldz,
-                           lapack_int* isuppz );
-lapack_int LAPACKE_dstegr( int matrix_order, char jobz, char range,
-                           lapack_int n, double* d, double* e, double vl,
-                           double vu, lapack_int il, lapack_int iu,
-                           double abstol, lapack_int* m, double* w, double* z,
-                           lapack_int ldz, lapack_int* isuppz );
-lapack_int LAPACKE_cstegr( int matrix_order, char jobz, char range,
-                           lapack_int n, float* d, float* e, float vl, float vu,
-                           lapack_int il, lapack_int iu, float abstol,
-                           lapack_int* m, float* w, lapack_complex_float* z,
-                           lapack_int ldz, lapack_int* isuppz );
-lapack_int LAPACKE_zstegr( int matrix_order, char jobz, char range,
-                           lapack_int n, double* d, double* e, double vl,
-                           double vu, lapack_int il, lapack_int iu,
-                           double abstol, lapack_int* m, double* w,
-                           lapack_complex_double* z, lapack_int ldz,
-                           lapack_int* isuppz );
+lapack_int LAPACKE_sstein(int matrix_order, lapack_int n, const float* d, const float* e, lapack_int m, const float* w,
+                          const lapack_int* iblock, const lapack_int* isplit, float* z, lapack_int ldz,
+                          lapack_int* ifailv);
+lapack_int LAPACKE_dstein(int matrix_order, lapack_int n, const double* d, const double* e, lapack_int m,
+                          const double* w, const lapack_int* iblock, const lapack_int* isplit, double* z,
+                          lapack_int ldz, lapack_int* ifailv);
+lapack_int LAPACKE_cstein(int matrix_order, lapack_int n, const float* d, const float* e, lapack_int m, const float* w,
+                          const lapack_int* iblock, const lapack_int* isplit, lapack_complex_float* z, lapack_int ldz,
+                          lapack_int* ifailv);
+lapack_int LAPACKE_zstein(int matrix_order, lapack_int n, const double* d, const double* e, lapack_int m,
+                          const double* w, const lapack_int* iblock, const lapack_int* isplit, lapack_complex_double* z,
+                          lapack_int ldz, lapack_int* ifailv);
 
-lapack_int LAPACKE_sstein( int matrix_order, lapack_int n, const float* d,
-                           const float* e, lapack_int m, const float* w,
-                           const lapack_int* iblock, const lapack_int* isplit,
-                           float* z, lapack_int ldz, lapack_int* ifailv );
-lapack_int LAPACKE_dstein( int matrix_order, lapack_int n, const double* d,
-                           const double* e, lapack_int m, const double* w,
-                           const lapack_int* iblock, const lapack_int* isplit,
-                           double* z, lapack_int ldz, lapack_int* ifailv );
-lapack_int LAPACKE_cstein( int matrix_order, lapack_int n, const float* d,
-                           const float* e, lapack_int m, const float* w,
-                           const lapack_int* iblock, const lapack_int* isplit,
-                           lapack_complex_float* z, lapack_int ldz,
-                           lapack_int* ifailv );
-lapack_int LAPACKE_zstein( int matrix_order, lapack_int n, const double* d,
-                           const double* e, lapack_int m, const double* w,
-                           const lapack_int* iblock, const lapack_int* isplit,
-                           lapack_complex_double* z, lapack_int ldz,
-                           lapack_int* ifailv );
+lapack_int LAPACKE_sstemr(int matrix_order, char jobz, char range, lapack_int n, float* d, float* e, float vl, float vu,
+                          lapack_int il, lapack_int iu, lapack_int* m, float* w, float* z, lapack_int ldz,
+                          lapack_int nzc, lapack_int* isuppz, lapack_logical* tryrac);
+lapack_int LAPACKE_dstemr(int matrix_order, char jobz, char range, lapack_int n, double* d, double* e, double vl,
+                          double vu, lapack_int il, lapack_int iu, lapack_int* m, double* w, double* z, lapack_int ldz,
+                          lapack_int nzc, lapack_int* isuppz, lapack_logical* tryrac);
+lapack_int LAPACKE_cstemr(int matrix_order, char jobz, char range, lapack_int n, float* d, float* e, float vl, float vu,
+                          lapack_int il, lapack_int iu, lapack_int* m, float* w, lapack_complex_float* z,
+                          lapack_int ldz, lapack_int nzc, lapack_int* isuppz, lapack_logical* tryrac);
+lapack_int LAPACKE_zstemr(int matrix_order, char jobz, char range, lapack_int n, double* d, double* e, double vl,
+                          double vu, lapack_int il, lapack_int iu, lapack_int* m, double* w, lapack_complex_double* z,
+                          lapack_int ldz, lapack_int nzc, lapack_int* isuppz, lapack_logical* tryrac);
 
-lapack_int LAPACKE_sstemr( int matrix_order, char jobz, char range,
-                           lapack_int n, float* d, float* e, float vl, float vu,
-                           lapack_int il, lapack_int iu, lapack_int* m,
-                           float* w, float* z, lapack_int ldz, lapack_int nzc,
-                           lapack_int* isuppz, lapack_logical* tryrac );
-lapack_int LAPACKE_dstemr( int matrix_order, char jobz, char range,
-                           lapack_int n, double* d, double* e, double vl,
-                           double vu, lapack_int il, lapack_int iu,
-                           lapack_int* m, double* w, double* z, lapack_int ldz,
-                           lapack_int nzc, lapack_int* isuppz,
-                           lapack_logical* tryrac );
-lapack_int LAPACKE_cstemr( int matrix_order, char jobz, char range,
-                           lapack_int n, float* d, float* e, float vl, float vu,
-                           lapack_int il, lapack_int iu, lapack_int* m,
-                           float* w, lapack_complex_float* z, lapack_int ldz,
-                           lapack_int nzc, lapack_int* isuppz,
-                           lapack_logical* tryrac );
-lapack_int LAPACKE_zstemr( int matrix_order, char jobz, char range,
-                           lapack_int n, double* d, double* e, double vl,
-                           double vu, lapack_int il, lapack_int iu,
-                           lapack_int* m, double* w, lapack_complex_double* z,
-                           lapack_int ldz, lapack_int nzc, lapack_int* isuppz,
-                           lapack_logical* tryrac );
+lapack_int LAPACKE_ssteqr(int matrix_order, char compz, lapack_int n, float* d, float* e, float* z, lapack_int ldz);
+lapack_int LAPACKE_dsteqr(int matrix_order, char compz, lapack_int n, double* d, double* e, double* z, lapack_int ldz);
+lapack_int LAPACKE_csteqr(int matrix_order, char compz, lapack_int n, float* d, float* e, lapack_complex_float* z,
+                          lapack_int ldz);
+lapack_int LAPACKE_zsteqr(int matrix_order, char compz, lapack_int n, double* d, double* e, lapack_complex_double* z,
+                          lapack_int ldz);
 
-lapack_int LAPACKE_ssteqr( int matrix_order, char compz, lapack_int n, float* d,
-                           float* e, float* z, lapack_int ldz );
-lapack_int LAPACKE_dsteqr( int matrix_order, char compz, lapack_int n,
-                           double* d, double* e, double* z, lapack_int ldz );
-lapack_int LAPACKE_csteqr( int matrix_order, char compz, lapack_int n, float* d,
-                           float* e, lapack_complex_float* z, lapack_int ldz );
-lapack_int LAPACKE_zsteqr( int matrix_order, char compz, lapack_int n,
-                           double* d, double* e, lapack_complex_double* z,
-                           lapack_int ldz );
+lapack_int LAPACKE_ssterf(lapack_int n, float* d, float* e);
+lapack_int LAPACKE_dsterf(lapack_int n, double* d, double* e);
 
-lapack_int LAPACKE_ssterf( lapack_int n, float* d, float* e );
-lapack_int LAPACKE_dsterf( lapack_int n, double* d, double* e );
+lapack_int LAPACKE_sstev(int matrix_order, char jobz, lapack_int n, float* d, float* e, float* z, lapack_int ldz);
+lapack_int LAPACKE_dstev(int matrix_order, char jobz, lapack_int n, double* d, double* e, double* z, lapack_int ldz);
 
-lapack_int LAPACKE_sstev( int matrix_order, char jobz, lapack_int n, float* d,
-                          float* e, float* z, lapack_int ldz );
-lapack_int LAPACKE_dstev( int matrix_order, char jobz, lapack_int n, double* d,
-                          double* e, double* z, lapack_int ldz );
+lapack_int LAPACKE_sstevd(int matrix_order, char jobz, lapack_int n, float* d, float* e, float* z, lapack_int ldz);
+lapack_int LAPACKE_dstevd(int matrix_order, char jobz, lapack_int n, double* d, double* e, double* z, lapack_int ldz);
 
-lapack_int LAPACKE_sstevd( int matrix_order, char jobz, lapack_int n, float* d,
-                           float* e, float* z, lapack_int ldz );
-lapack_int LAPACKE_dstevd( int matrix_order, char jobz, lapack_int n, double* d,
-                           double* e, double* z, lapack_int ldz );
+lapack_int LAPACKE_sstevr(int matrix_order, char jobz, char range, lapack_int n, float* d, float* e, float vl, float vu,
+                          lapack_int il, lapack_int iu, float abstol, lapack_int* m, float* w, float* z, lapack_int ldz,
+                          lapack_int* isuppz);
+lapack_int LAPACKE_dstevr(int matrix_order, char jobz, char range, lapack_int n, double* d, double* e, double vl,
+                          double vu, lapack_int il, lapack_int iu, double abstol, lapack_int* m, double* w, double* z,
+                          lapack_int ldz, lapack_int* isuppz);
 
-lapack_int LAPACKE_sstevr( int matrix_order, char jobz, char range,
-                           lapack_int n, float* d, float* e, float vl, float vu,
-                           lapack_int il, lapack_int iu, float abstol,
-                           lapack_int* m, float* w, float* z, lapack_int ldz,
-                           lapack_int* isuppz );
-lapack_int LAPACKE_dstevr( int matrix_order, char jobz, char range,
-                           lapack_int n, double* d, double* e, double vl,
-                           double vu, lapack_int il, lapack_int iu,
-                           double abstol, lapack_int* m, double* w, double* z,
-                           lapack_int ldz, lapack_int* isuppz );
+lapack_int LAPACKE_sstevx(int matrix_order, char jobz, char range, lapack_int n, float* d, float* e, float vl, float vu,
+                          lapack_int il, lapack_int iu, float abstol, lapack_int* m, float* w, float* z, lapack_int ldz,
+                          lapack_int* ifail);
+lapack_int LAPACKE_dstevx(int matrix_order, char jobz, char range, lapack_int n, double* d, double* e, double vl,
+                          double vu, lapack_int il, lapack_int iu, double abstol, lapack_int* m, double* w, double* z,
+                          lapack_int ldz, lapack_int* ifail);
 
-lapack_int LAPACKE_sstevx( int matrix_order, char jobz, char range,
-                           lapack_int n, float* d, float* e, float vl, float vu,
-                           lapack_int il, lapack_int iu, float abstol,
-                           lapack_int* m, float* w, float* z, lapack_int ldz,
-                           lapack_int* ifail );
-lapack_int LAPACKE_dstevx( int matrix_order, char jobz, char range,
-                           lapack_int n, double* d, double* e, double vl,
-                           double vu, lapack_int il, lapack_int iu,
-                           double abstol, lapack_int* m, double* w, double* z,
-                           lapack_int ldz, lapack_int* ifail );
+lapack_int LAPACKE_ssycon(int matrix_order, char uplo, lapack_int n, const float* a, lapack_int lda,
+                          const lapack_int* ipiv, float anorm, float* rcond);
+lapack_int LAPACKE_dsycon(int matrix_order, char uplo, lapack_int n, const double* a, lapack_int lda,
+                          const lapack_int* ipiv, double anorm, double* rcond);
+lapack_int LAPACKE_csycon(int matrix_order, char uplo, lapack_int n, const lapack_complex_float* a, lapack_int lda,
+                          const lapack_int* ipiv, float anorm, float* rcond);
+lapack_int LAPACKE_zsycon(int matrix_order, char uplo, lapack_int n, const lapack_complex_double* a, lapack_int lda,
+                          const lapack_int* ipiv, double anorm, double* rcond);
 
-lapack_int LAPACKE_ssycon( int matrix_order, char uplo, lapack_int n,
-                           const float* a, lapack_int lda,
-                           const lapack_int* ipiv, float anorm, float* rcond );
-lapack_int LAPACKE_dsycon( int matrix_order, char uplo, lapack_int n,
-                           const double* a, lapack_int lda,
-                           const lapack_int* ipiv, double anorm,
-                           double* rcond );
-lapack_int LAPACKE_csycon( int matrix_order, char uplo, lapack_int n,
-                           const lapack_complex_float* a, lapack_int lda,
-                           const lapack_int* ipiv, float anorm, float* rcond );
-lapack_int LAPACKE_zsycon( int matrix_order, char uplo, lapack_int n,
-                           const lapack_complex_double* a, lapack_int lda,
-                           const lapack_int* ipiv, double anorm,
-                           double* rcond );
+lapack_int LAPACKE_ssyequb(int matrix_order, char uplo, lapack_int n, const float* a, lapack_int lda, float* s,
+                           float* scond, float* amax);
+lapack_int LAPACKE_dsyequb(int matrix_order, char uplo, lapack_int n, const double* a, lapack_int lda, double* s,
+                           double* scond, double* amax);
+lapack_int LAPACKE_csyequb(int matrix_order, char uplo, lapack_int n, const lapack_complex_float* a, lapack_int lda,
+                           float* s, float* scond, float* amax);
+lapack_int LAPACKE_zsyequb(int matrix_order, char uplo, lapack_int n, const lapack_complex_double* a, lapack_int lda,
+                           double* s, double* scond, double* amax);
 
-lapack_int LAPACKE_ssyequb( int matrix_order, char uplo, lapack_int n,
-                            const float* a, lapack_int lda, float* s,
-                            float* scond, float* amax );
-lapack_int LAPACKE_dsyequb( int matrix_order, char uplo, lapack_int n,
-                            const double* a, lapack_int lda, double* s,
-                            double* scond, double* amax );
-lapack_int LAPACKE_csyequb( int matrix_order, char uplo, lapack_int n,
-                            const lapack_complex_float* a, lapack_int lda,
-                            float* s, float* scond, float* amax );
-lapack_int LAPACKE_zsyequb( int matrix_order, char uplo, lapack_int n,
-                            const lapack_complex_double* a, lapack_int lda,
-                            double* s, double* scond, double* amax );
+lapack_int LAPACKE_ssyev(int matrix_order, char jobz, char uplo, lapack_int n, float* a, lapack_int lda, float* w);
+lapack_int LAPACKE_dsyev(int matrix_order, char jobz, char uplo, lapack_int n, double* a, lapack_int lda, double* w);
 
-lapack_int LAPACKE_ssyev( int matrix_order, char jobz, char uplo, lapack_int n,
-                          float* a, lapack_int lda, float* w );
-lapack_int LAPACKE_dsyev( int matrix_order, char jobz, char uplo, lapack_int n,
-                          double* a, lapack_int lda, double* w );
+lapack_int LAPACKE_ssyevd(int matrix_order, char jobz, char uplo, lapack_int n, float* a, lapack_int lda, float* w);
+lapack_int LAPACKE_dsyevd(int matrix_order, char jobz, char uplo, lapack_int n, double* a, lapack_int lda, double* w);
 
-lapack_int LAPACKE_ssyevd( int matrix_order, char jobz, char uplo, lapack_int n,
-                           float* a, lapack_int lda, float* w );
-lapack_int LAPACKE_dsyevd( int matrix_order, char jobz, char uplo, lapack_int n,
-                           double* a, lapack_int lda, double* w );
+lapack_int LAPACKE_ssyevr(int matrix_order, char jobz, char range, char uplo, lapack_int n, float* a, lapack_int lda,
+                          float vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int* m, float* w,
+                          float* z, lapack_int ldz, lapack_int* isuppz);
+lapack_int LAPACKE_dsyevr(int matrix_order, char jobz, char range, char uplo, lapack_int n, double* a, lapack_int lda,
+                          double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int* m, double* w,
+                          double* z, lapack_int ldz, lapack_int* isuppz);
 
-lapack_int LAPACKE_ssyevr( int matrix_order, char jobz, char range, char uplo,
-                           lapack_int n, float* a, lapack_int lda, float vl,
-                           float vu, lapack_int il, lapack_int iu, float abstol,
-                           lapack_int* m, float* w, float* z, lapack_int ldz,
-                           lapack_int* isuppz );
-lapack_int LAPACKE_dsyevr( int matrix_order, char jobz, char range, char uplo,
-                           lapack_int n, double* a, lapack_int lda, double vl,
-                           double vu, lapack_int il, lapack_int iu,
-                           double abstol, lapack_int* m, double* w, double* z,
-                           lapack_int ldz, lapack_int* isuppz );
+lapack_int LAPACKE_ssyevx(int matrix_order, char jobz, char range, char uplo, lapack_int n, float* a, lapack_int lda,
+                          float vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int* m, float* w,
+                          float* z, lapack_int ldz, lapack_int* ifail);
+lapack_int LAPACKE_dsyevx(int matrix_order, char jobz, char range, char uplo, lapack_int n, double* a, lapack_int lda,
+                          double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int* m, double* w,
+                          double* z, lapack_int ldz, lapack_int* ifail);
 
-lapack_int LAPACKE_ssyevx( int matrix_order, char jobz, char range, char uplo,
-                           lapack_int n, float* a, lapack_int lda, float vl,
-                           float vu, lapack_int il, lapack_int iu, float abstol,
-                           lapack_int* m, float* w, float* z, lapack_int ldz,
-                           lapack_int* ifail );
-lapack_int LAPACKE_dsyevx( int matrix_order, char jobz, char range, char uplo,
-                           lapack_int n, double* a, lapack_int lda, double vl,
-                           double vu, lapack_int il, lapack_int iu,
-                           double abstol, lapack_int* m, double* w, double* z,
-                           lapack_int ldz, lapack_int* ifail );
+lapack_int LAPACKE_ssygst(int matrix_order, lapack_int itype, char uplo, lapack_int n, float* a, lapack_int lda,
+                          const float* b, lapack_int ldb);
+lapack_int LAPACKE_dsygst(int matrix_order, lapack_int itype, char uplo, lapack_int n, double* a, lapack_int lda,
+                          const double* b, lapack_int ldb);
 
-lapack_int LAPACKE_ssygst( int matrix_order, lapack_int itype, char uplo,
-                           lapack_int n, float* a, lapack_int lda,
-                           const float* b, lapack_int ldb );
-lapack_int LAPACKE_dsygst( int matrix_order, lapack_int itype, char uplo,
-                           lapack_int n, double* a, lapack_int lda,
-                           const double* b, lapack_int ldb );
+lapack_int LAPACKE_ssygv(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n, float* a,
+                         lapack_int lda, float* b, lapack_int ldb, float* w);
+lapack_int LAPACKE_dsygv(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n, double* a,
+                         lapack_int lda, double* b, lapack_int ldb, double* w);
 
-lapack_int LAPACKE_ssygv( int matrix_order, lapack_int itype, char jobz,
-                          char uplo, lapack_int n, float* a, lapack_int lda,
-                          float* b, lapack_int ldb, float* w );
-lapack_int LAPACKE_dsygv( int matrix_order, lapack_int itype, char jobz,
-                          char uplo, lapack_int n, double* a, lapack_int lda,
-                          double* b, lapack_int ldb, double* w );
+lapack_int LAPACKE_ssygvd(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n, float* a,
+                          lapack_int lda, float* b, lapack_int ldb, float* w);
+lapack_int LAPACKE_dsygvd(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n, double* a,
+                          lapack_int lda, double* b, lapack_int ldb, double* w);
 
-lapack_int LAPACKE_ssygvd( int matrix_order, lapack_int itype, char jobz,
-                           char uplo, lapack_int n, float* a, lapack_int lda,
-                           float* b, lapack_int ldb, float* w );
-lapack_int LAPACKE_dsygvd( int matrix_order, lapack_int itype, char jobz,
-                           char uplo, lapack_int n, double* a, lapack_int lda,
-                           double* b, lapack_int ldb, double* w );
+lapack_int LAPACKE_ssygvx(int matrix_order, lapack_int itype, char jobz, char range, char uplo, lapack_int n, float* a,
+                          lapack_int lda, float* b, lapack_int ldb, float vl, float vu, lapack_int il, lapack_int iu,
+                          float abstol, lapack_int* m, float* w, float* z, lapack_int ldz, lapack_int* ifail);
+lapack_int LAPACKE_dsygvx(int matrix_order, lapack_int itype, char jobz, char range, char uplo, lapack_int n, double* a,
+                          lapack_int lda, double* b, lapack_int ldb, double vl, double vu, lapack_int il, lapack_int iu,
+                          double abstol, lapack_int* m, double* w, double* z, lapack_int ldz, lapack_int* ifail);
 
-lapack_int LAPACKE_ssygvx( int matrix_order, lapack_int itype, char jobz,
-                           char range, char uplo, lapack_int n, float* a,
-                           lapack_int lda, float* b, lapack_int ldb, float vl,
-                           float vu, lapack_int il, lapack_int iu, float abstol,
-                           lapack_int* m, float* w, float* z, lapack_int ldz,
-                           lapack_int* ifail );
-lapack_int LAPACKE_dsygvx( int matrix_order, lapack_int itype, char jobz,
-                           char range, char uplo, lapack_int n, double* a,
-                           lapack_int lda, double* b, lapack_int ldb, double vl,
-                           double vu, lapack_int il, lapack_int iu,
-                           double abstol, lapack_int* m, double* w, double* z,
-                           lapack_int ldz, lapack_int* ifail );
+lapack_int LAPACKE_ssyrfs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const float* a, lapack_int lda,
+                          const float* af, lapack_int ldaf, const lapack_int* ipiv, const float* b, lapack_int ldb,
+                          float* x, lapack_int ldx, float* ferr, float* berr);
+lapack_int LAPACKE_dsyrfs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const double* a, lapack_int lda,
+                          const double* af, lapack_int ldaf, const lapack_int* ipiv, const double* b, lapack_int ldb,
+                          double* x, lapack_int ldx, double* ferr, double* berr);
+lapack_int LAPACKE_csyrfs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_float* a,
+                          lapack_int lda, const lapack_complex_float* af, lapack_int ldaf, const lapack_int* ipiv,
+                          const lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x, lapack_int ldx,
+                          float* ferr, float* berr);
+lapack_int LAPACKE_zsyrfs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double* a,
+                          lapack_int lda, const lapack_complex_double* af, lapack_int ldaf, const lapack_int* ipiv,
+                          const lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x, lapack_int ldx,
+                          double* ferr, double* berr);
 
-lapack_int LAPACKE_ssyrfs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const float* a, lapack_int lda,
-                           const float* af, lapack_int ldaf,
-                           const lapack_int* ipiv, const float* b,
-                           lapack_int ldb, float* x, lapack_int ldx,
-                           float* ferr, float* berr );
-lapack_int LAPACKE_dsyrfs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const double* a, lapack_int lda,
-                           const double* af, lapack_int ldaf,
-                           const lapack_int* ipiv, const double* b,
-                           lapack_int ldb, double* x, lapack_int ldx,
-                           double* ferr, double* berr );
-lapack_int LAPACKE_csyrfs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_float* a,
-                           lapack_int lda, const lapack_complex_float* af,
-                           lapack_int ldaf, const lapack_int* ipiv,
-                           const lapack_complex_float* b, lapack_int ldb,
-                           lapack_complex_float* x, lapack_int ldx, float* ferr,
-                           float* berr );
-lapack_int LAPACKE_zsyrfs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_double* a,
-                           lapack_int lda, const lapack_complex_double* af,
-                           lapack_int ldaf, const lapack_int* ipiv,
-                           const lapack_complex_double* b, lapack_int ldb,
-                           lapack_complex_double* x, lapack_int ldx,
-                           double* ferr, double* berr );
+lapack_int LAPACKE_ssyrfsx(int matrix_order, char uplo, char equed, lapack_int n, lapack_int nrhs, const float* a,
+                           lapack_int lda, const float* af, lapack_int ldaf, const lapack_int* ipiv, const float* s,
+                           const float* b, lapack_int ldb, float* x, lapack_int ldx, float* rcond, float* berr,
+                           lapack_int n_err_bnds, float* err_bnds_norm, float* err_bnds_comp, lapack_int nparams,
+                           float* params);
+lapack_int LAPACKE_dsyrfsx(int matrix_order, char uplo, char equed, lapack_int n, lapack_int nrhs, const double* a,
+                           lapack_int lda, const double* af, lapack_int ldaf, const lapack_int* ipiv, const double* s,
+                           const double* b, lapack_int ldb, double* x, lapack_int ldx, double* rcond, double* berr,
+                           lapack_int n_err_bnds, double* err_bnds_norm, double* err_bnds_comp, lapack_int nparams,
+                           double* params);
+lapack_int LAPACKE_csyrfsx(int matrix_order, char uplo, char equed, lapack_int n, lapack_int nrhs,
+                           const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* af,
+                           lapack_int ldaf, const lapack_int* ipiv, const float* s, const lapack_complex_float* b,
+                           lapack_int ldb, lapack_complex_float* x, lapack_int ldx, float* rcond, float* berr,
+                           lapack_int n_err_bnds, float* err_bnds_norm, float* err_bnds_comp, lapack_int nparams,
+                           float* params);
+lapack_int LAPACKE_zsyrfsx(int matrix_order, char uplo, char equed, lapack_int n, lapack_int nrhs,
+                           const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* af,
+                           lapack_int ldaf, const lapack_int* ipiv, const double* s, const lapack_complex_double* b,
+                           lapack_int ldb, lapack_complex_double* x, lapack_int ldx, double* rcond, double* berr,
+                           lapack_int n_err_bnds, double* err_bnds_norm, double* err_bnds_comp, lapack_int nparams,
+                           double* params);
 
-lapack_int LAPACKE_ssyrfsx( int matrix_order, char uplo, char equed,
-                            lapack_int n, lapack_int nrhs, const float* a,
-                            lapack_int lda, const float* af, lapack_int ldaf,
-                            const lapack_int* ipiv, const float* s,
-                            const float* b, lapack_int ldb, float* x,
-                            lapack_int ldx, float* rcond, float* berr,
-                            lapack_int n_err_bnds, float* err_bnds_norm,
-                            float* err_bnds_comp, lapack_int nparams,
-                            float* params );
-lapack_int LAPACKE_dsyrfsx( int matrix_order, char uplo, char equed,
-                            lapack_int n, lapack_int nrhs, const double* a,
-                            lapack_int lda, const double* af, lapack_int ldaf,
-                            const lapack_int* ipiv, const double* s,
-                            const double* b, lapack_int ldb, double* x,
-                            lapack_int ldx, double* rcond, double* berr,
-                            lapack_int n_err_bnds, double* err_bnds_norm,
-                            double* err_bnds_comp, lapack_int nparams,
-                            double* params );
-lapack_int LAPACKE_csyrfsx( int matrix_order, char uplo, char equed,
-                            lapack_int n, lapack_int nrhs,
-                            const lapack_complex_float* a, lapack_int lda,
-                            const lapack_complex_float* af, lapack_int ldaf,
-                            const lapack_int* ipiv, const float* s,
-                            const lapack_complex_float* b, lapack_int ldb,
-                            lapack_complex_float* x, lapack_int ldx,
-                            float* rcond, float* berr, lapack_int n_err_bnds,
-                            float* err_bnds_norm, float* err_bnds_comp,
-                            lapack_int nparams, float* params );
-lapack_int LAPACKE_zsyrfsx( int matrix_order, char uplo, char equed,
-                            lapack_int n, lapack_int nrhs,
-                            const lapack_complex_double* a, lapack_int lda,
-                            const lapack_complex_double* af, lapack_int ldaf,
-                            const lapack_int* ipiv, const double* s,
-                            const lapack_complex_double* b, lapack_int ldb,
-                            lapack_complex_double* x, lapack_int ldx,
-                            double* rcond, double* berr, lapack_int n_err_bnds,
-                            double* err_bnds_norm, double* err_bnds_comp,
-                            lapack_int nparams, double* params );
+lapack_int LAPACKE_ssysv(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, float* a, lapack_int lda,
+                         lapack_int* ipiv, float* b, lapack_int ldb);
+lapack_int LAPACKE_dsysv(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, double* a, lapack_int lda,
+                         lapack_int* ipiv, double* b, lapack_int ldb);
+lapack_int LAPACKE_csysv(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_float* a,
+                         lapack_int lda, lapack_int* ipiv, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zsysv(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double* a,
+                         lapack_int lda, lapack_int* ipiv, lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_ssysv( int matrix_order, char uplo, lapack_int n,
-                          lapack_int nrhs, float* a, lapack_int lda,
-                          lapack_int* ipiv, float* b, lapack_int ldb );
-lapack_int LAPACKE_dsysv( int matrix_order, char uplo, lapack_int n,
-                          lapack_int nrhs, double* a, lapack_int lda,
-                          lapack_int* ipiv, double* b, lapack_int ldb );
-lapack_int LAPACKE_csysv( int matrix_order, char uplo, lapack_int n,
-                          lapack_int nrhs, lapack_complex_float* a,
-                          lapack_int lda, lapack_int* ipiv,
-                          lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_zsysv( int matrix_order, char uplo, lapack_int n,
-                          lapack_int nrhs, lapack_complex_double* a,
-                          lapack_int lda, lapack_int* ipiv,
-                          lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_ssysvx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs, const float* a,
+                          lapack_int lda, float* af, lapack_int ldaf, lapack_int* ipiv, const float* b, lapack_int ldb,
+                          float* x, lapack_int ldx, float* rcond, float* ferr, float* berr);
+lapack_int LAPACKE_dsysvx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs, const double* a,
+                          lapack_int lda, double* af, lapack_int ldaf, lapack_int* ipiv, const double* b,
+                          lapack_int ldb, double* x, lapack_int ldx, double* rcond, double* ferr, double* berr);
+lapack_int LAPACKE_csysvx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                          const lapack_complex_float* a, lapack_int lda, lapack_complex_float* af, lapack_int ldaf,
+                          lapack_int* ipiv, const lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x,
+                          lapack_int ldx, float* rcond, float* ferr, float* berr);
+lapack_int LAPACKE_zsysvx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                          const lapack_complex_double* a, lapack_int lda, lapack_complex_double* af, lapack_int ldaf,
+                          lapack_int* ipiv, const lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x,
+                          lapack_int ldx, double* rcond, double* ferr, double* berr);
 
-lapack_int LAPACKE_ssysvx( int matrix_order, char fact, char uplo, lapack_int n,
-                           lapack_int nrhs, const float* a, lapack_int lda,
-                           float* af, lapack_int ldaf, lapack_int* ipiv,
-                           const float* b, lapack_int ldb, float* x,
-                           lapack_int ldx, float* rcond, float* ferr,
-                           float* berr );
-lapack_int LAPACKE_dsysvx( int matrix_order, char fact, char uplo, lapack_int n,
-                           lapack_int nrhs, const double* a, lapack_int lda,
-                           double* af, lapack_int ldaf, lapack_int* ipiv,
-                           const double* b, lapack_int ldb, double* x,
-                           lapack_int ldx, double* rcond, double* ferr,
-                           double* berr );
-lapack_int LAPACKE_csysvx( int matrix_order, char fact, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_float* a,
-                           lapack_int lda, lapack_complex_float* af,
-                           lapack_int ldaf, lapack_int* ipiv,
-                           const lapack_complex_float* b, lapack_int ldb,
-                           lapack_complex_float* x, lapack_int ldx,
-                           float* rcond, float* ferr, float* berr );
-lapack_int LAPACKE_zsysvx( int matrix_order, char fact, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_double* a,
-                           lapack_int lda, lapack_complex_double* af,
-                           lapack_int ldaf, lapack_int* ipiv,
-                           const lapack_complex_double* b, lapack_int ldb,
-                           lapack_complex_double* x, lapack_int ldx,
-                           double* rcond, double* ferr, double* berr );
+lapack_int LAPACKE_ssysvxx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs, float* a,
+                           lapack_int lda, float* af, lapack_int ldaf, lapack_int* ipiv, char* equed, float* s,
+                           float* b, lapack_int ldb, float* x, lapack_int ldx, float* rcond, float* rpvgrw, float* berr,
+                           lapack_int n_err_bnds, float* err_bnds_norm, float* err_bnds_comp, lapack_int nparams,
+                           float* params);
+lapack_int LAPACKE_dsysvxx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs, double* a,
+                           lapack_int lda, double* af, lapack_int ldaf, lapack_int* ipiv, char* equed, double* s,
+                           double* b, lapack_int ldb, double* x, lapack_int ldx, double* rcond, double* rpvgrw,
+                           double* berr, lapack_int n_err_bnds, double* err_bnds_norm, double* err_bnds_comp,
+                           lapack_int nparams, double* params);
+lapack_int LAPACKE_csysvxx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                           lapack_complex_float* a, lapack_int lda, lapack_complex_float* af, lapack_int ldaf,
+                           lapack_int* ipiv, char* equed, float* s, lapack_complex_float* b, lapack_int ldb,
+                           lapack_complex_float* x, lapack_int ldx, float* rcond, float* rpvgrw, float* berr,
+                           lapack_int n_err_bnds, float* err_bnds_norm, float* err_bnds_comp, lapack_int nparams,
+                           float* params);
+lapack_int LAPACKE_zsysvxx(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                           lapack_complex_double* a, lapack_int lda, lapack_complex_double* af, lapack_int ldaf,
+                           lapack_int* ipiv, char* equed, double* s, lapack_complex_double* b, lapack_int ldb,
+                           lapack_complex_double* x, lapack_int ldx, double* rcond, double* rpvgrw, double* berr,
+                           lapack_int n_err_bnds, double* err_bnds_norm, double* err_bnds_comp, lapack_int nparams,
+                           double* params);
 
-lapack_int LAPACKE_ssysvxx( int matrix_order, char fact, char uplo,
-                            lapack_int n, lapack_int nrhs, float* a,
-                            lapack_int lda, float* af, lapack_int ldaf,
-                            lapack_int* ipiv, char* equed, float* s, float* b,
-                            lapack_int ldb, float* x, lapack_int ldx,
-                            float* rcond, float* rpvgrw, float* berr,
-                            lapack_int n_err_bnds, float* err_bnds_norm,
-                            float* err_bnds_comp, lapack_int nparams,
-                            float* params );
-lapack_int LAPACKE_dsysvxx( int matrix_order, char fact, char uplo,
-                            lapack_int n, lapack_int nrhs, double* a,
-                            lapack_int lda, double* af, lapack_int ldaf,
-                            lapack_int* ipiv, char* equed, double* s, double* b,
-                            lapack_int ldb, double* x, lapack_int ldx,
-                            double* rcond, double* rpvgrw, double* berr,
-                            lapack_int n_err_bnds, double* err_bnds_norm,
-                            double* err_bnds_comp, lapack_int nparams,
-                            double* params );
-lapack_int LAPACKE_csysvxx( int matrix_order, char fact, char uplo,
-                            lapack_int n, lapack_int nrhs,
-                            lapack_complex_float* a, lapack_int lda,
-                            lapack_complex_float* af, lapack_int ldaf,
-                            lapack_int* ipiv, char* equed, float* s,
-                            lapack_complex_float* b, lapack_int ldb,
-                            lapack_complex_float* x, lapack_int ldx,
-                            float* rcond, float* rpvgrw, float* berr,
-                            lapack_int n_err_bnds, float* err_bnds_norm,
-                            float* err_bnds_comp, lapack_int nparams,
-                            float* params );
-lapack_int LAPACKE_zsysvxx( int matrix_order, char fact, char uplo,
-                            lapack_int n, lapack_int nrhs,
-                            lapack_complex_double* a, lapack_int lda,
-                            lapack_complex_double* af, lapack_int ldaf,
-                            lapack_int* ipiv, char* equed, double* s,
-                            lapack_complex_double* b, lapack_int ldb,
-                            lapack_complex_double* x, lapack_int ldx,
-                            double* rcond, double* rpvgrw, double* berr,
-                            lapack_int n_err_bnds, double* err_bnds_norm,
-                            double* err_bnds_comp, lapack_int nparams,
-                            double* params );
+lapack_int LAPACKE_ssytrd(int matrix_order, char uplo, lapack_int n, float* a, lapack_int lda, float* d, float* e,
+                          float* tau);
+lapack_int LAPACKE_dsytrd(int matrix_order, char uplo, lapack_int n, double* a, lapack_int lda, double* d, double* e,
+                          double* tau);
 
-lapack_int LAPACKE_ssytrd( int matrix_order, char uplo, lapack_int n, float* a,
-                           lapack_int lda, float* d, float* e, float* tau );
-lapack_int LAPACKE_dsytrd( int matrix_order, char uplo, lapack_int n, double* a,
-                           lapack_int lda, double* d, double* e, double* tau );
+lapack_int LAPACKE_ssytrf(int matrix_order, char uplo, lapack_int n, float* a, lapack_int lda, lapack_int* ipiv);
+lapack_int LAPACKE_dsytrf(int matrix_order, char uplo, lapack_int n, double* a, lapack_int lda, lapack_int* ipiv);
+lapack_int LAPACKE_csytrf(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                          lapack_int* ipiv);
+lapack_int LAPACKE_zsytrf(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                          lapack_int* ipiv);
 
-lapack_int LAPACKE_ssytrf( int matrix_order, char uplo, lapack_int n, float* a,
-                           lapack_int lda, lapack_int* ipiv );
-lapack_int LAPACKE_dsytrf( int matrix_order, char uplo, lapack_int n, double* a,
-                           lapack_int lda, lapack_int* ipiv );
-lapack_int LAPACKE_csytrf( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda,
-                           lapack_int* ipiv );
-lapack_int LAPACKE_zsytrf( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_int* ipiv );
+lapack_int LAPACKE_ssytri(int matrix_order, char uplo, lapack_int n, float* a, lapack_int lda, const lapack_int* ipiv);
+lapack_int LAPACKE_dsytri(int matrix_order, char uplo, lapack_int n, double* a, lapack_int lda, const lapack_int* ipiv);
+lapack_int LAPACKE_csytri(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                          const lapack_int* ipiv);
+lapack_int LAPACKE_zsytri(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                          const lapack_int* ipiv);
 
-lapack_int LAPACKE_ssytri( int matrix_order, char uplo, lapack_int n, float* a,
-                           lapack_int lda, const lapack_int* ipiv );
-lapack_int LAPACKE_dsytri( int matrix_order, char uplo, lapack_int n, double* a,
-                           lapack_int lda, const lapack_int* ipiv );
-lapack_int LAPACKE_csytri( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda,
-                           const lapack_int* ipiv );
-lapack_int LAPACKE_zsytri( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda,
-                           const lapack_int* ipiv );
+lapack_int LAPACKE_ssytrs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const float* a, lapack_int lda,
+                          const lapack_int* ipiv, float* b, lapack_int ldb);
+lapack_int LAPACKE_dsytrs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const double* a, lapack_int lda,
+                          const lapack_int* ipiv, double* b, lapack_int ldb);
+lapack_int LAPACKE_csytrs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_float* a,
+                          lapack_int lda, const lapack_int* ipiv, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zsytrs(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double* a,
+                          lapack_int lda, const lapack_int* ipiv, lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_ssytrs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const float* a, lapack_int lda,
-                           const lapack_int* ipiv, float* b, lapack_int ldb );
-lapack_int LAPACKE_dsytrs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const double* a, lapack_int lda,
-                           const lapack_int* ipiv, double* b, lapack_int ldb );
-lapack_int LAPACKE_csytrs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_float* a,
-                           lapack_int lda, const lapack_int* ipiv,
-                           lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_zsytrs( int matrix_order, char uplo, lapack_int n,
-                           lapack_int nrhs, const lapack_complex_double* a,
-                           lapack_int lda, const lapack_int* ipiv,
-                           lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_stbcon(int matrix_order, char norm, char uplo, char diag, lapack_int n, lapack_int kd,
+                          const float* ab, lapack_int ldab, float* rcond);
+lapack_int LAPACKE_dtbcon(int matrix_order, char norm, char uplo, char diag, lapack_int n, lapack_int kd,
+                          const double* ab, lapack_int ldab, double* rcond);
+lapack_int LAPACKE_ctbcon(int matrix_order, char norm, char uplo, char diag, lapack_int n, lapack_int kd,
+                          const lapack_complex_float* ab, lapack_int ldab, float* rcond);
+lapack_int LAPACKE_ztbcon(int matrix_order, char norm, char uplo, char diag, lapack_int n, lapack_int kd,
+                          const lapack_complex_double* ab, lapack_int ldab, double* rcond);
 
-lapack_int LAPACKE_stbcon( int matrix_order, char norm, char uplo, char diag,
-                           lapack_int n, lapack_int kd, const float* ab,
-                           lapack_int ldab, float* rcond );
-lapack_int LAPACKE_dtbcon( int matrix_order, char norm, char uplo, char diag,
-                           lapack_int n, lapack_int kd, const double* ab,
-                           lapack_int ldab, double* rcond );
-lapack_int LAPACKE_ctbcon( int matrix_order, char norm, char uplo, char diag,
-                           lapack_int n, lapack_int kd,
-                           const lapack_complex_float* ab, lapack_int ldab,
-                           float* rcond );
-lapack_int LAPACKE_ztbcon( int matrix_order, char norm, char uplo, char diag,
-                           lapack_int n, lapack_int kd,
-                           const lapack_complex_double* ab, lapack_int ldab,
-                           double* rcond );
+lapack_int LAPACKE_stbrfs(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int kd,
+                          lapack_int nrhs, const float* ab, lapack_int ldab, const float* b, lapack_int ldb,
+                          const float* x, lapack_int ldx, float* ferr, float* berr);
+lapack_int LAPACKE_dtbrfs(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int kd,
+                          lapack_int nrhs, const double* ab, lapack_int ldab, const double* b, lapack_int ldb,
+                          const double* x, lapack_int ldx, double* ferr, double* berr);
+lapack_int LAPACKE_ctbrfs(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int kd,
+                          lapack_int nrhs, const lapack_complex_float* ab, lapack_int ldab,
+                          const lapack_complex_float* b, lapack_int ldb, const lapack_complex_float* x, lapack_int ldx,
+                          float* ferr, float* berr);
+lapack_int LAPACKE_ztbrfs(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int kd,
+                          lapack_int nrhs, const lapack_complex_double* ab, lapack_int ldab,
+                          const lapack_complex_double* b, lapack_int ldb, const lapack_complex_double* x,
+                          lapack_int ldx, double* ferr, double* berr);
 
-lapack_int LAPACKE_stbrfs( int matrix_order, char uplo, char trans, char diag,
-                           lapack_int n, lapack_int kd, lapack_int nrhs,
-                           const float* ab, lapack_int ldab, const float* b,
-                           lapack_int ldb, const float* x, lapack_int ldx,
-                           float* ferr, float* berr );
-lapack_int LAPACKE_dtbrfs( int matrix_order, char uplo, char trans, char diag,
-                           lapack_int n, lapack_int kd, lapack_int nrhs,
-                           const double* ab, lapack_int ldab, const double* b,
-                           lapack_int ldb, const double* x, lapack_int ldx,
-                           double* ferr, double* berr );
-lapack_int LAPACKE_ctbrfs( int matrix_order, char uplo, char trans, char diag,
-                           lapack_int n, lapack_int kd, lapack_int nrhs,
-                           const lapack_complex_float* ab, lapack_int ldab,
-                           const lapack_complex_float* b, lapack_int ldb,
-                           const lapack_complex_float* x, lapack_int ldx,
-                           float* ferr, float* berr );
-lapack_int LAPACKE_ztbrfs( int matrix_order, char uplo, char trans, char diag,
-                           lapack_int n, lapack_int kd, lapack_int nrhs,
-                           const lapack_complex_double* ab, lapack_int ldab,
-                           const lapack_complex_double* b, lapack_int ldb,
-                           const lapack_complex_double* x, lapack_int ldx,
-                           double* ferr, double* berr );
+lapack_int LAPACKE_stbtrs(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int kd,
+                          lapack_int nrhs, const float* ab, lapack_int ldab, float* b, lapack_int ldb);
+lapack_int LAPACKE_dtbtrs(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int kd,
+                          lapack_int nrhs, const double* ab, lapack_int ldab, double* b, lapack_int ldb);
+lapack_int LAPACKE_ctbtrs(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int kd,
+                          lapack_int nrhs, const lapack_complex_float* ab, lapack_int ldab, lapack_complex_float* b,
+                          lapack_int ldb);
+lapack_int LAPACKE_ztbtrs(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int kd,
+                          lapack_int nrhs, const lapack_complex_double* ab, lapack_int ldab, lapack_complex_double* b,
+                          lapack_int ldb);
 
-lapack_int LAPACKE_stbtrs( int matrix_order, char uplo, char trans, char diag,
-                           lapack_int n, lapack_int kd, lapack_int nrhs,
-                           const float* ab, lapack_int ldab, float* b,
-                           lapack_int ldb );
-lapack_int LAPACKE_dtbtrs( int matrix_order, char uplo, char trans, char diag,
-                           lapack_int n, lapack_int kd, lapack_int nrhs,
-                           const double* ab, lapack_int ldab, double* b,
-                           lapack_int ldb );
-lapack_int LAPACKE_ctbtrs( int matrix_order, char uplo, char trans, char diag,
-                           lapack_int n, lapack_int kd, lapack_int nrhs,
-                           const lapack_complex_float* ab, lapack_int ldab,
-                           lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_ztbtrs( int matrix_order, char uplo, char trans, char diag,
-                           lapack_int n, lapack_int kd, lapack_int nrhs,
-                           const lapack_complex_double* ab, lapack_int ldab,
-                           lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_stfsm(int matrix_order, char transr, char side, char uplo, char trans, char diag, lapack_int m,
+                         lapack_int n, float alpha, const float* a, float* b, lapack_int ldb);
+lapack_int LAPACKE_dtfsm(int matrix_order, char transr, char side, char uplo, char trans, char diag, lapack_int m,
+                         lapack_int n, double alpha, const double* a, double* b, lapack_int ldb);
+lapack_int LAPACKE_ctfsm(int matrix_order, char transr, char side, char uplo, char trans, char diag, lapack_int m,
+                         lapack_int n, lapack_complex_float alpha, const lapack_complex_float* a,
+                         lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_ztfsm(int matrix_order, char transr, char side, char uplo, char trans, char diag, lapack_int m,
+                         lapack_int n, lapack_complex_double alpha, const lapack_complex_double* a,
+                         lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_stfsm( int matrix_order, char transr, char side, char uplo,
-                          char trans, char diag, lapack_int m, lapack_int n,
-                          float alpha, const float* a, float* b,
-                          lapack_int ldb );
-lapack_int LAPACKE_dtfsm( int matrix_order, char transr, char side, char uplo,
-                          char trans, char diag, lapack_int m, lapack_int n,
-                          double alpha, const double* a, double* b,
-                          lapack_int ldb );
-lapack_int LAPACKE_ctfsm( int matrix_order, char transr, char side, char uplo,
-                          char trans, char diag, lapack_int m, lapack_int n,
-                          lapack_complex_float alpha,
-                          const lapack_complex_float* a,
-                          lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_ztfsm( int matrix_order, char transr, char side, char uplo,
-                          char trans, char diag, lapack_int m, lapack_int n,
-                          lapack_complex_double alpha,
-                          const lapack_complex_double* a,
-                          lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_stftri(int matrix_order, char transr, char uplo, char diag, lapack_int n, float* a);
+lapack_int LAPACKE_dtftri(int matrix_order, char transr, char uplo, char diag, lapack_int n, double* a);
+lapack_int LAPACKE_ctftri(int matrix_order, char transr, char uplo, char diag, lapack_int n, lapack_complex_float* a);
+lapack_int LAPACKE_ztftri(int matrix_order, char transr, char uplo, char diag, lapack_int n, lapack_complex_double* a);
 
-lapack_int LAPACKE_stftri( int matrix_order, char transr, char uplo, char diag,
-                           lapack_int n, float* a );
-lapack_int LAPACKE_dtftri( int matrix_order, char transr, char uplo, char diag,
-                           lapack_int n, double* a );
-lapack_int LAPACKE_ctftri( int matrix_order, char transr, char uplo, char diag,
-                           lapack_int n, lapack_complex_float* a );
-lapack_int LAPACKE_ztftri( int matrix_order, char transr, char uplo, char diag,
-                           lapack_int n, lapack_complex_double* a );
+lapack_int LAPACKE_stfttp(int matrix_order, char transr, char uplo, lapack_int n, const float* arf, float* ap);
+lapack_int LAPACKE_dtfttp(int matrix_order, char transr, char uplo, lapack_int n, const double* arf, double* ap);
+lapack_int LAPACKE_ctfttp(int matrix_order, char transr, char uplo, lapack_int n, const lapack_complex_float* arf,
+                          lapack_complex_float* ap);
+lapack_int LAPACKE_ztfttp(int matrix_order, char transr, char uplo, lapack_int n, const lapack_complex_double* arf,
+                          lapack_complex_double* ap);
 
-lapack_int LAPACKE_stfttp( int matrix_order, char transr, char uplo,
-                           lapack_int n, const float* arf, float* ap );
-lapack_int LAPACKE_dtfttp( int matrix_order, char transr, char uplo,
-                           lapack_int n, const double* arf, double* ap );
-lapack_int LAPACKE_ctfttp( int matrix_order, char transr, char uplo,
-                           lapack_int n, const lapack_complex_float* arf,
-                           lapack_complex_float* ap );
-lapack_int LAPACKE_ztfttp( int matrix_order, char transr, char uplo,
-                           lapack_int n, const lapack_complex_double* arf,
-                           lapack_complex_double* ap );
+lapack_int LAPACKE_stfttr(int matrix_order, char transr, char uplo, lapack_int n, const float* arf, float* a,
+                          lapack_int lda);
+lapack_int LAPACKE_dtfttr(int matrix_order, char transr, char uplo, lapack_int n, const double* arf, double* a,
+                          lapack_int lda);
+lapack_int LAPACKE_ctfttr(int matrix_order, char transr, char uplo, lapack_int n, const lapack_complex_float* arf,
+                          lapack_complex_float* a, lapack_int lda);
+lapack_int LAPACKE_ztfttr(int matrix_order, char transr, char uplo, lapack_int n, const lapack_complex_double* arf,
+                          lapack_complex_double* a, lapack_int lda);
 
-lapack_int LAPACKE_stfttr( int matrix_order, char transr, char uplo,
-                           lapack_int n, const float* arf, float* a,
-                           lapack_int lda );
-lapack_int LAPACKE_dtfttr( int matrix_order, char transr, char uplo,
-                           lapack_int n, const double* arf, double* a,
-                           lapack_int lda );
-lapack_int LAPACKE_ctfttr( int matrix_order, char transr, char uplo,
-                           lapack_int n, const lapack_complex_float* arf,
-                           lapack_complex_float* a, lapack_int lda );
-lapack_int LAPACKE_ztfttr( int matrix_order, char transr, char uplo,
-                           lapack_int n, const lapack_complex_double* arf,
-                           lapack_complex_double* a, lapack_int lda );
+lapack_int LAPACKE_stgevc(int matrix_order, char side, char howmny, const lapack_logical* select, lapack_int n,
+                          const float* s, lapack_int lds, const float* p, lapack_int ldp, float* vl, lapack_int ldvl,
+                          float* vr, lapack_int ldvr, lapack_int mm, lapack_int* m);
+lapack_int LAPACKE_dtgevc(int matrix_order, char side, char howmny, const lapack_logical* select, lapack_int n,
+                          const double* s, lapack_int lds, const double* p, lapack_int ldp, double* vl, lapack_int ldvl,
+                          double* vr, lapack_int ldvr, lapack_int mm, lapack_int* m);
+lapack_int LAPACKE_ctgevc(int matrix_order, char side, char howmny, const lapack_logical* select, lapack_int n,
+                          const lapack_complex_float* s, lapack_int lds, const lapack_complex_float* p, lapack_int ldp,
+                          lapack_complex_float* vl, lapack_int ldvl, lapack_complex_float* vr, lapack_int ldvr,
+                          lapack_int mm, lapack_int* m);
+lapack_int LAPACKE_ztgevc(int matrix_order, char side, char howmny, const lapack_logical* select, lapack_int n,
+                          const lapack_complex_double* s, lapack_int lds, const lapack_complex_double* p,
+                          lapack_int ldp, lapack_complex_double* vl, lapack_int ldvl, lapack_complex_double* vr,
+                          lapack_int ldvr, lapack_int mm, lapack_int* m);
 
-lapack_int LAPACKE_stgevc( int matrix_order, char side, char howmny,
-                           const lapack_logical* select, lapack_int n,
-                           const float* s, lapack_int lds, const float* p,
-                           lapack_int ldp, float* vl, lapack_int ldvl,
-                           float* vr, lapack_int ldvr, lapack_int mm,
-                           lapack_int* m );
-lapack_int LAPACKE_dtgevc( int matrix_order, char side, char howmny,
-                           const lapack_logical* select, lapack_int n,
-                           const double* s, lapack_int lds, const double* p,
-                           lapack_int ldp, double* vl, lapack_int ldvl,
-                           double* vr, lapack_int ldvr, lapack_int mm,
-                           lapack_int* m );
-lapack_int LAPACKE_ctgevc( int matrix_order, char side, char howmny,
-                           const lapack_logical* select, lapack_int n,
-                           const lapack_complex_float* s, lapack_int lds,
-                           const lapack_complex_float* p, lapack_int ldp,
-                           lapack_complex_float* vl, lapack_int ldvl,
-                           lapack_complex_float* vr, lapack_int ldvr,
-                           lapack_int mm, lapack_int* m );
-lapack_int LAPACKE_ztgevc( int matrix_order, char side, char howmny,
-                           const lapack_logical* select, lapack_int n,
-                           const lapack_complex_double* s, lapack_int lds,
-                           const lapack_complex_double* p, lapack_int ldp,
-                           lapack_complex_double* vl, lapack_int ldvl,
-                           lapack_complex_double* vr, lapack_int ldvr,
-                           lapack_int mm, lapack_int* m );
+lapack_int LAPACKE_stgexc(int matrix_order, lapack_logical wantq, lapack_logical wantz, lapack_int n, float* a,
+                          lapack_int lda, float* b, lapack_int ldb, float* q, lapack_int ldq, float* z, lapack_int ldz,
+                          lapack_int* ifst, lapack_int* ilst);
+lapack_int LAPACKE_dtgexc(int matrix_order, lapack_logical wantq, lapack_logical wantz, lapack_int n, double* a,
+                          lapack_int lda, double* b, lapack_int ldb, double* q, lapack_int ldq, double* z,
+                          lapack_int ldz, lapack_int* ifst, lapack_int* ilst);
+lapack_int LAPACKE_ctgexc(int matrix_order, lapack_logical wantq, lapack_logical wantz, lapack_int n,
+                          lapack_complex_float* a, lapack_int lda, lapack_complex_float* b, lapack_int ldb,
+                          lapack_complex_float* q, lapack_int ldq, lapack_complex_float* z, lapack_int ldz,
+                          lapack_int ifst, lapack_int ilst);
+lapack_int LAPACKE_ztgexc(int matrix_order, lapack_logical wantq, lapack_logical wantz, lapack_int n,
+                          lapack_complex_double* a, lapack_int lda, lapack_complex_double* b, lapack_int ldb,
+                          lapack_complex_double* q, lapack_int ldq, lapack_complex_double* z, lapack_int ldz,
+                          lapack_int ifst, lapack_int ilst);
 
-lapack_int LAPACKE_stgexc( int matrix_order, lapack_logical wantq,
-                           lapack_logical wantz, lapack_int n, float* a,
-                           lapack_int lda, float* b, lapack_int ldb, float* q,
-                           lapack_int ldq, float* z, lapack_int ldz,
-                           lapack_int* ifst, lapack_int* ilst );
-lapack_int LAPACKE_dtgexc( int matrix_order, lapack_logical wantq,
-                           lapack_logical wantz, lapack_int n, double* a,
-                           lapack_int lda, double* b, lapack_int ldb, double* q,
-                           lapack_int ldq, double* z, lapack_int ldz,
-                           lapack_int* ifst, lapack_int* ilst );
-lapack_int LAPACKE_ctgexc( int matrix_order, lapack_logical wantq,
-                           lapack_logical wantz, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda,
-                           lapack_complex_float* b, lapack_int ldb,
-                           lapack_complex_float* q, lapack_int ldq,
-                           lapack_complex_float* z, lapack_int ldz,
-                           lapack_int ifst, lapack_int ilst );
-lapack_int LAPACKE_ztgexc( int matrix_order, lapack_logical wantq,
-                           lapack_logical wantz, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_complex_double* b, lapack_int ldb,
-                           lapack_complex_double* q, lapack_int ldq,
-                           lapack_complex_double* z, lapack_int ldz,
-                           lapack_int ifst, lapack_int ilst );
+lapack_int LAPACKE_stgsen(int matrix_order, lapack_int ijob, lapack_logical wantq, lapack_logical wantz,
+                          const lapack_logical* select, lapack_int n, float* a, lapack_int lda, float* b,
+                          lapack_int ldb, float* alphar, float* alphai, float* beta, float* q, lapack_int ldq, float* z,
+                          lapack_int ldz, lapack_int* m, float* pl, float* pr, float* dif);
+lapack_int LAPACKE_dtgsen(int matrix_order, lapack_int ijob, lapack_logical wantq, lapack_logical wantz,
+                          const lapack_logical* select, lapack_int n, double* a, lapack_int lda, double* b,
+                          lapack_int ldb, double* alphar, double* alphai, double* beta, double* q, lapack_int ldq,
+                          double* z, lapack_int ldz, lapack_int* m, double* pl, double* pr, double* dif);
+lapack_int LAPACKE_ctgsen(int matrix_order, lapack_int ijob, lapack_logical wantq, lapack_logical wantz,
+                          const lapack_logical* select, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                          lapack_complex_float* b, lapack_int ldb, lapack_complex_float* alpha,
+                          lapack_complex_float* beta, lapack_complex_float* q, lapack_int ldq, lapack_complex_float* z,
+                          lapack_int ldz, lapack_int* m, float* pl, float* pr, float* dif);
+lapack_int LAPACKE_ztgsen(int matrix_order, lapack_int ijob, lapack_logical wantq, lapack_logical wantz,
+                          const lapack_logical* select, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                          lapack_complex_double* b, lapack_int ldb, lapack_complex_double* alpha,
+                          lapack_complex_double* beta, lapack_complex_double* q, lapack_int ldq,
+                          lapack_complex_double* z, lapack_int ldz, lapack_int* m, double* pl, double* pr, double* dif);
 
-lapack_int LAPACKE_stgsen( int matrix_order, lapack_int ijob,
-                           lapack_logical wantq, lapack_logical wantz,
-                           const lapack_logical* select, lapack_int n, float* a,
-                           lapack_int lda, float* b, lapack_int ldb,
-                           float* alphar, float* alphai, float* beta, float* q,
-                           lapack_int ldq, float* z, lapack_int ldz,
-                           lapack_int* m, float* pl, float* pr, float* dif );
-lapack_int LAPACKE_dtgsen( int matrix_order, lapack_int ijob,
-                           lapack_logical wantq, lapack_logical wantz,
-                           const lapack_logical* select, lapack_int n,
-                           double* a, lapack_int lda, double* b, lapack_int ldb,
-                           double* alphar, double* alphai, double* beta,
-                           double* q, lapack_int ldq, double* z, lapack_int ldz,
-                           lapack_int* m, double* pl, double* pr, double* dif );
-lapack_int LAPACKE_ctgsen( int matrix_order, lapack_int ijob,
-                           lapack_logical wantq, lapack_logical wantz,
-                           const lapack_logical* select, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda,
-                           lapack_complex_float* b, lapack_int ldb,
-                           lapack_complex_float* alpha,
-                           lapack_complex_float* beta, lapack_complex_float* q,
-                           lapack_int ldq, lapack_complex_float* z,
-                           lapack_int ldz, lapack_int* m, float* pl, float* pr,
-                           float* dif );
-lapack_int LAPACKE_ztgsen( int matrix_order, lapack_int ijob,
-                           lapack_logical wantq, lapack_logical wantz,
-                           const lapack_logical* select, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_complex_double* b, lapack_int ldb,
-                           lapack_complex_double* alpha,
-                           lapack_complex_double* beta,
-                           lapack_complex_double* q, lapack_int ldq,
-                           lapack_complex_double* z, lapack_int ldz,
-                           lapack_int* m, double* pl, double* pr, double* dif );
+lapack_int LAPACKE_stgsja(int matrix_order, char jobu, char jobv, char jobq, lapack_int m, lapack_int p, lapack_int n,
+                          lapack_int k, lapack_int l, float* a, lapack_int lda, float* b, lapack_int ldb, float tola,
+                          float tolb, float* alpha, float* beta, float* u, lapack_int ldu, float* v, lapack_int ldv,
+                          float* q, lapack_int ldq, lapack_int* ncycle);
+lapack_int LAPACKE_dtgsja(int matrix_order, char jobu, char jobv, char jobq, lapack_int m, lapack_int p, lapack_int n,
+                          lapack_int k, lapack_int l, double* a, lapack_int lda, double* b, lapack_int ldb, double tola,
+                          double tolb, double* alpha, double* beta, double* u, lapack_int ldu, double* v,
+                          lapack_int ldv, double* q, lapack_int ldq, lapack_int* ncycle);
+lapack_int LAPACKE_ctgsja(int matrix_order, char jobu, char jobv, char jobq, lapack_int m, lapack_int p, lapack_int n,
+                          lapack_int k, lapack_int l, lapack_complex_float* a, lapack_int lda, lapack_complex_float* b,
+                          lapack_int ldb, float tola, float tolb, float* alpha, float* beta, lapack_complex_float* u,
+                          lapack_int ldu, lapack_complex_float* v, lapack_int ldv, lapack_complex_float* q,
+                          lapack_int ldq, lapack_int* ncycle);
+lapack_int LAPACKE_ztgsja(int matrix_order, char jobu, char jobv, char jobq, lapack_int m, lapack_int p, lapack_int n,
+                          lapack_int k, lapack_int l, lapack_complex_double* a, lapack_int lda,
+                          lapack_complex_double* b, lapack_int ldb, double tola, double tolb, double* alpha,
+                          double* beta, lapack_complex_double* u, lapack_int ldu, lapack_complex_double* v,
+                          lapack_int ldv, lapack_complex_double* q, lapack_int ldq, lapack_int* ncycle);
 
-lapack_int LAPACKE_stgsja( int matrix_order, char jobu, char jobv, char jobq,
-                           lapack_int m, lapack_int p, lapack_int n,
-                           lapack_int k, lapack_int l, float* a, lapack_int lda,
-                           float* b, lapack_int ldb, float tola, float tolb,
-                           float* alpha, float* beta, float* u, lapack_int ldu,
-                           float* v, lapack_int ldv, float* q, lapack_int ldq,
-                           lapack_int* ncycle );
-lapack_int LAPACKE_dtgsja( int matrix_order, char jobu, char jobv, char jobq,
-                           lapack_int m, lapack_int p, lapack_int n,
-                           lapack_int k, lapack_int l, double* a,
-                           lapack_int lda, double* b, lapack_int ldb,
-                           double tola, double tolb, double* alpha,
-                           double* beta, double* u, lapack_int ldu, double* v,
-                           lapack_int ldv, double* q, lapack_int ldq,
-                           lapack_int* ncycle );
-lapack_int LAPACKE_ctgsja( int matrix_order, char jobu, char jobv, char jobq,
-                           lapack_int m, lapack_int p, lapack_int n,
-                           lapack_int k, lapack_int l, lapack_complex_float* a,
-                           lapack_int lda, lapack_complex_float* b,
-                           lapack_int ldb, float tola, float tolb, float* alpha,
-                           float* beta, lapack_complex_float* u, lapack_int ldu,
-                           lapack_complex_float* v, lapack_int ldv,
-                           lapack_complex_float* q, lapack_int ldq,
-                           lapack_int* ncycle );
-lapack_int LAPACKE_ztgsja( int matrix_order, char jobu, char jobv, char jobq,
-                           lapack_int m, lapack_int p, lapack_int n,
-                           lapack_int k, lapack_int l, lapack_complex_double* a,
-                           lapack_int lda, lapack_complex_double* b,
-                           lapack_int ldb, double tola, double tolb,
-                           double* alpha, double* beta,
-                           lapack_complex_double* u, lapack_int ldu,
-                           lapack_complex_double* v, lapack_int ldv,
-                           lapack_complex_double* q, lapack_int ldq,
-                           lapack_int* ncycle );
+lapack_int LAPACKE_stgsna(int matrix_order, char job, char howmny, const lapack_logical* select, lapack_int n,
+                          const float* a, lapack_int lda, const float* b, lapack_int ldb, const float* vl,
+                          lapack_int ldvl, const float* vr, lapack_int ldvr, float* s, float* dif, lapack_int mm,
+                          lapack_int* m);
+lapack_int LAPACKE_dtgsna(int matrix_order, char job, char howmny, const lapack_logical* select, lapack_int n,
+                          const double* a, lapack_int lda, const double* b, lapack_int ldb, const double* vl,
+                          lapack_int ldvl, const double* vr, lapack_int ldvr, double* s, double* dif, lapack_int mm,
+                          lapack_int* m);
+lapack_int LAPACKE_ctgsna(int matrix_order, char job, char howmny, const lapack_logical* select, lapack_int n,
+                          const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* b, lapack_int ldb,
+                          const lapack_complex_float* vl, lapack_int ldvl, const lapack_complex_float* vr,
+                          lapack_int ldvr, float* s, float* dif, lapack_int mm, lapack_int* m);
+lapack_int LAPACKE_ztgsna(int matrix_order, char job, char howmny, const lapack_logical* select, lapack_int n,
+                          const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* b,
+                          lapack_int ldb, const lapack_complex_double* vl, lapack_int ldvl,
+                          const lapack_complex_double* vr, lapack_int ldvr, double* s, double* dif, lapack_int mm,
+                          lapack_int* m);
 
-lapack_int LAPACKE_stgsna( int matrix_order, char job, char howmny,
-                           const lapack_logical* select, lapack_int n,
-                           const float* a, lapack_int lda, const float* b,
-                           lapack_int ldb, const float* vl, lapack_int ldvl,
-                           const float* vr, lapack_int ldvr, float* s,
-                           float* dif, lapack_int mm, lapack_int* m );
-lapack_int LAPACKE_dtgsna( int matrix_order, char job, char howmny,
-                           const lapack_logical* select, lapack_int n,
-                           const double* a, lapack_int lda, const double* b,
-                           lapack_int ldb, const double* vl, lapack_int ldvl,
-                           const double* vr, lapack_int ldvr, double* s,
-                           double* dif, lapack_int mm, lapack_int* m );
-lapack_int LAPACKE_ctgsna( int matrix_order, char job, char howmny,
-                           const lapack_logical* select, lapack_int n,
-                           const lapack_complex_float* a, lapack_int lda,
-                           const lapack_complex_float* b, lapack_int ldb,
-                           const lapack_complex_float* vl, lapack_int ldvl,
-                           const lapack_complex_float* vr, lapack_int ldvr,
-                           float* s, float* dif, lapack_int mm, lapack_int* m );
-lapack_int LAPACKE_ztgsna( int matrix_order, char job, char howmny,
-                           const lapack_logical* select, lapack_int n,
-                           const lapack_complex_double* a, lapack_int lda,
-                           const lapack_complex_double* b, lapack_int ldb,
-                           const lapack_complex_double* vl, lapack_int ldvl,
-                           const lapack_complex_double* vr, lapack_int ldvr,
-                           double* s, double* dif, lapack_int mm,
-                           lapack_int* m );
+lapack_int LAPACKE_stgsyl(int matrix_order, char trans, lapack_int ijob, lapack_int m, lapack_int n, const float* a,
+                          lapack_int lda, const float* b, lapack_int ldb, float* c, lapack_int ldc, const float* d,
+                          lapack_int ldd, const float* e, lapack_int lde, float* f, lapack_int ldf, float* scale,
+                          float* dif);
+lapack_int LAPACKE_dtgsyl(int matrix_order, char trans, lapack_int ijob, lapack_int m, lapack_int n, const double* a,
+                          lapack_int lda, const double* b, lapack_int ldb, double* c, lapack_int ldc, const double* d,
+                          lapack_int ldd, const double* e, lapack_int lde, double* f, lapack_int ldf, double* scale,
+                          double* dif);
+lapack_int LAPACKE_ctgsyl(int matrix_order, char trans, lapack_int ijob, lapack_int m, lapack_int n,
+                          const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* b, lapack_int ldb,
+                          lapack_complex_float* c, lapack_int ldc, const lapack_complex_float* d, lapack_int ldd,
+                          const lapack_complex_float* e, lapack_int lde, lapack_complex_float* f, lapack_int ldf,
+                          float* scale, float* dif);
+lapack_int LAPACKE_ztgsyl(int matrix_order, char trans, lapack_int ijob, lapack_int m, lapack_int n,
+                          const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* b,
+                          lapack_int ldb, lapack_complex_double* c, lapack_int ldc, const lapack_complex_double* d,
+                          lapack_int ldd, const lapack_complex_double* e, lapack_int lde, lapack_complex_double* f,
+                          lapack_int ldf, double* scale, double* dif);
 
-lapack_int LAPACKE_stgsyl( int matrix_order, char trans, lapack_int ijob,
-                           lapack_int m, lapack_int n, const float* a,
-                           lapack_int lda, const float* b, lapack_int ldb,
-                           float* c, lapack_int ldc, const float* d,
-                           lapack_int ldd, const float* e, lapack_int lde,
-                           float* f, lapack_int ldf, float* scale, float* dif );
-lapack_int LAPACKE_dtgsyl( int matrix_order, char trans, lapack_int ijob,
-                           lapack_int m, lapack_int n, const double* a,
-                           lapack_int lda, const double* b, lapack_int ldb,
-                           double* c, lapack_int ldc, const double* d,
-                           lapack_int ldd, const double* e, lapack_int lde,
-                           double* f, lapack_int ldf, double* scale,
-                           double* dif );
-lapack_int LAPACKE_ctgsyl( int matrix_order, char trans, lapack_int ijob,
-                           lapack_int m, lapack_int n,
-                           const lapack_complex_float* a, lapack_int lda,
-                           const lapack_complex_float* b, lapack_int ldb,
-                           lapack_complex_float* c, lapack_int ldc,
-                           const lapack_complex_float* d, lapack_int ldd,
-                           const lapack_complex_float* e, lapack_int lde,
-                           lapack_complex_float* f, lapack_int ldf,
-                           float* scale, float* dif );
-lapack_int LAPACKE_ztgsyl( int matrix_order, char trans, lapack_int ijob,
-                           lapack_int m, lapack_int n,
-                           const lapack_complex_double* a, lapack_int lda,
-                           const lapack_complex_double* b, lapack_int ldb,
-                           lapack_complex_double* c, lapack_int ldc,
-                           const lapack_complex_double* d, lapack_int ldd,
-                           const lapack_complex_double* e, lapack_int lde,
-                           lapack_complex_double* f, lapack_int ldf,
-                           double* scale, double* dif );
+lapack_int LAPACKE_stpcon(int matrix_order, char norm, char uplo, char diag, lapack_int n, const float* ap,
+                          float* rcond);
+lapack_int LAPACKE_dtpcon(int matrix_order, char norm, char uplo, char diag, lapack_int n, const double* ap,
+                          double* rcond);
+lapack_int LAPACKE_ctpcon(int matrix_order, char norm, char uplo, char diag, lapack_int n,
+                          const lapack_complex_float* ap, float* rcond);
+lapack_int LAPACKE_ztpcon(int matrix_order, char norm, char uplo, char diag, lapack_int n,
+                          const lapack_complex_double* ap, double* rcond);
 
-lapack_int LAPACKE_stpcon( int matrix_order, char norm, char uplo, char diag,
-                           lapack_int n, const float* ap, float* rcond );
-lapack_int LAPACKE_dtpcon( int matrix_order, char norm, char uplo, char diag,
-                           lapack_int n, const double* ap, double* rcond );
-lapack_int LAPACKE_ctpcon( int matrix_order, char norm, char uplo, char diag,
-                           lapack_int n, const lapack_complex_float* ap,
-                           float* rcond );
-lapack_int LAPACKE_ztpcon( int matrix_order, char norm, char uplo, char diag,
-                           lapack_int n, const lapack_complex_double* ap,
-                           double* rcond );
+lapack_int LAPACKE_stprfs(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                          const float* ap, const float* b, lapack_int ldb, const float* x, lapack_int ldx, float* ferr,
+                          float* berr);
+lapack_int LAPACKE_dtprfs(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                          const double* ap, const double* b, lapack_int ldb, const double* x, lapack_int ldx,
+                          double* ferr, double* berr);
+lapack_int LAPACKE_ctprfs(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                          const lapack_complex_float* ap, const lapack_complex_float* b, lapack_int ldb,
+                          const lapack_complex_float* x, lapack_int ldx, float* ferr, float* berr);
+lapack_int LAPACKE_ztprfs(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                          const lapack_complex_double* ap, const lapack_complex_double* b, lapack_int ldb,
+                          const lapack_complex_double* x, lapack_int ldx, double* ferr, double* berr);
 
-lapack_int LAPACKE_stprfs( int matrix_order, char uplo, char trans, char diag,
-                           lapack_int n, lapack_int nrhs, const float* ap,
-                           const float* b, lapack_int ldb, const float* x,
-                           lapack_int ldx, float* ferr, float* berr );
-lapack_int LAPACKE_dtprfs( int matrix_order, char uplo, char trans, char diag,
-                           lapack_int n, lapack_int nrhs, const double* ap,
-                           const double* b, lapack_int ldb, const double* x,
-                           lapack_int ldx, double* ferr, double* berr );
-lapack_int LAPACKE_ctprfs( int matrix_order, char uplo, char trans, char diag,
-                           lapack_int n, lapack_int nrhs,
-                           const lapack_complex_float* ap,
-                           const lapack_complex_float* b, lapack_int ldb,
-                           const lapack_complex_float* x, lapack_int ldx,
-                           float* ferr, float* berr );
-lapack_int LAPACKE_ztprfs( int matrix_order, char uplo, char trans, char diag,
-                           lapack_int n, lapack_int nrhs,
-                           const lapack_complex_double* ap,
-                           const lapack_complex_double* b, lapack_int ldb,
-                           const lapack_complex_double* x, lapack_int ldx,
-                           double* ferr, double* berr );
+lapack_int LAPACKE_stptri(int matrix_order, char uplo, char diag, lapack_int n, float* ap);
+lapack_int LAPACKE_dtptri(int matrix_order, char uplo, char diag, lapack_int n, double* ap);
+lapack_int LAPACKE_ctptri(int matrix_order, char uplo, char diag, lapack_int n, lapack_complex_float* ap);
+lapack_int LAPACKE_ztptri(int matrix_order, char uplo, char diag, lapack_int n, lapack_complex_double* ap);
 
-lapack_int LAPACKE_stptri( int matrix_order, char uplo, char diag, lapack_int n,
-                           float* ap );
-lapack_int LAPACKE_dtptri( int matrix_order, char uplo, char diag, lapack_int n,
-                           double* ap );
-lapack_int LAPACKE_ctptri( int matrix_order, char uplo, char diag, lapack_int n,
-                           lapack_complex_float* ap );
-lapack_int LAPACKE_ztptri( int matrix_order, char uplo, char diag, lapack_int n,
-                           lapack_complex_double* ap );
+lapack_int LAPACKE_stptrs(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                          const float* ap, float* b, lapack_int ldb);
+lapack_int LAPACKE_dtptrs(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                          const double* ap, double* b, lapack_int ldb);
+lapack_int LAPACKE_ctptrs(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                          const lapack_complex_float* ap, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_ztptrs(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                          const lapack_complex_double* ap, lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_stptrs( int matrix_order, char uplo, char trans, char diag,
-                           lapack_int n, lapack_int nrhs, const float* ap,
-                           float* b, lapack_int ldb );
-lapack_int LAPACKE_dtptrs( int matrix_order, char uplo, char trans, char diag,
-                           lapack_int n, lapack_int nrhs, const double* ap,
-                           double* b, lapack_int ldb );
-lapack_int LAPACKE_ctptrs( int matrix_order, char uplo, char trans, char diag,
-                           lapack_int n, lapack_int nrhs,
-                           const lapack_complex_float* ap,
-                           lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_ztptrs( int matrix_order, char uplo, char trans, char diag,
-                           lapack_int n, lapack_int nrhs,
-                           const lapack_complex_double* ap,
-                           lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_stpttf(int matrix_order, char transr, char uplo, lapack_int n, const float* ap, float* arf);
+lapack_int LAPACKE_dtpttf(int matrix_order, char transr, char uplo, lapack_int n, const double* ap, double* arf);
+lapack_int LAPACKE_ctpttf(int matrix_order, char transr, char uplo, lapack_int n, const lapack_complex_float* ap,
+                          lapack_complex_float* arf);
+lapack_int LAPACKE_ztpttf(int matrix_order, char transr, char uplo, lapack_int n, const lapack_complex_double* ap,
+                          lapack_complex_double* arf);
 
-lapack_int LAPACKE_stpttf( int matrix_order, char transr, char uplo,
-                           lapack_int n, const float* ap, float* arf );
-lapack_int LAPACKE_dtpttf( int matrix_order, char transr, char uplo,
-                           lapack_int n, const double* ap, double* arf );
-lapack_int LAPACKE_ctpttf( int matrix_order, char transr, char uplo,
-                           lapack_int n, const lapack_complex_float* ap,
-                           lapack_complex_float* arf );
-lapack_int LAPACKE_ztpttf( int matrix_order, char transr, char uplo,
-                           lapack_int n, const lapack_complex_double* ap,
-                           lapack_complex_double* arf );
+lapack_int LAPACKE_stpttr(int matrix_order, char uplo, lapack_int n, const float* ap, float* a, lapack_int lda);
+lapack_int LAPACKE_dtpttr(int matrix_order, char uplo, lapack_int n, const double* ap, double* a, lapack_int lda);
+lapack_int LAPACKE_ctpttr(int matrix_order, char uplo, lapack_int n, const lapack_complex_float* ap,
+                          lapack_complex_float* a, lapack_int lda);
+lapack_int LAPACKE_ztpttr(int matrix_order, char uplo, lapack_int n, const lapack_complex_double* ap,
+                          lapack_complex_double* a, lapack_int lda);
 
-lapack_int LAPACKE_stpttr( int matrix_order, char uplo, lapack_int n,
-                           const float* ap, float* a, lapack_int lda );
-lapack_int LAPACKE_dtpttr( int matrix_order, char uplo, lapack_int n,
-                           const double* ap, double* a, lapack_int lda );
-lapack_int LAPACKE_ctpttr( int matrix_order, char uplo, lapack_int n,
-                           const lapack_complex_float* ap,
-                           lapack_complex_float* a, lapack_int lda );
-lapack_int LAPACKE_ztpttr( int matrix_order, char uplo, lapack_int n,
-                           const lapack_complex_double* ap,
-                           lapack_complex_double* a, lapack_int lda );
+lapack_int LAPACKE_strcon(int matrix_order, char norm, char uplo, char diag, lapack_int n, const float* a,
+                          lapack_int lda, float* rcond);
+lapack_int LAPACKE_dtrcon(int matrix_order, char norm, char uplo, char diag, lapack_int n, const double* a,
+                          lapack_int lda, double* rcond);
+lapack_int LAPACKE_ctrcon(int matrix_order, char norm, char uplo, char diag, lapack_int n,
+                          const lapack_complex_float* a, lapack_int lda, float* rcond);
+lapack_int LAPACKE_ztrcon(int matrix_order, char norm, char uplo, char diag, lapack_int n,
+                          const lapack_complex_double* a, lapack_int lda, double* rcond);
 
-lapack_int LAPACKE_strcon( int matrix_order, char norm, char uplo, char diag,
-                           lapack_int n, const float* a, lapack_int lda,
-                           float* rcond );
-lapack_int LAPACKE_dtrcon( int matrix_order, char norm, char uplo, char diag,
-                           lapack_int n, const double* a, lapack_int lda,
-                           double* rcond );
-lapack_int LAPACKE_ctrcon( int matrix_order, char norm, char uplo, char diag,
-                           lapack_int n, const lapack_complex_float* a,
-                           lapack_int lda, float* rcond );
-lapack_int LAPACKE_ztrcon( int matrix_order, char norm, char uplo, char diag,
-                           lapack_int n, const lapack_complex_double* a,
-                           lapack_int lda, double* rcond );
+lapack_int LAPACKE_strevc(int matrix_order, char side, char howmny, lapack_logical* select, lapack_int n,
+                          const float* t, lapack_int ldt, float* vl, lapack_int ldvl, float* vr, lapack_int ldvr,
+                          lapack_int mm, lapack_int* m);
+lapack_int LAPACKE_dtrevc(int matrix_order, char side, char howmny, lapack_logical* select, lapack_int n,
+                          const double* t, lapack_int ldt, double* vl, lapack_int ldvl, double* vr, lapack_int ldvr,
+                          lapack_int mm, lapack_int* m);
+lapack_int LAPACKE_ctrevc(int matrix_order, char side, char howmny, const lapack_logical* select, lapack_int n,
+                          lapack_complex_float* t, lapack_int ldt, lapack_complex_float* vl, lapack_int ldvl,
+                          lapack_complex_float* vr, lapack_int ldvr, lapack_int mm, lapack_int* m);
+lapack_int LAPACKE_ztrevc(int matrix_order, char side, char howmny, const lapack_logical* select, lapack_int n,
+                          lapack_complex_double* t, lapack_int ldt, lapack_complex_double* vl, lapack_int ldvl,
+                          lapack_complex_double* vr, lapack_int ldvr, lapack_int mm, lapack_int* m);
 
-lapack_int LAPACKE_strevc( int matrix_order, char side, char howmny,
-                           lapack_logical* select, lapack_int n, const float* t,
-                           lapack_int ldt, float* vl, lapack_int ldvl,
-                           float* vr, lapack_int ldvr, lapack_int mm,
-                           lapack_int* m );
-lapack_int LAPACKE_dtrevc( int matrix_order, char side, char howmny,
-                           lapack_logical* select, lapack_int n,
-                           const double* t, lapack_int ldt, double* vl,
-                           lapack_int ldvl, double* vr, lapack_int ldvr,
-                           lapack_int mm, lapack_int* m );
-lapack_int LAPACKE_ctrevc( int matrix_order, char side, char howmny,
-                           const lapack_logical* select, lapack_int n,
-                           lapack_complex_float* t, lapack_int ldt,
-                           lapack_complex_float* vl, lapack_int ldvl,
-                           lapack_complex_float* vr, lapack_int ldvr,
-                           lapack_int mm, lapack_int* m );
-lapack_int LAPACKE_ztrevc( int matrix_order, char side, char howmny,
-                           const lapack_logical* select, lapack_int n,
-                           lapack_complex_double* t, lapack_int ldt,
-                           lapack_complex_double* vl, lapack_int ldvl,
-                           lapack_complex_double* vr, lapack_int ldvr,
-                           lapack_int mm, lapack_int* m );
+lapack_int LAPACKE_strexc(int matrix_order, char compq, lapack_int n, float* t, lapack_int ldt, float* q,
+                          lapack_int ldq, lapack_int* ifst, lapack_int* ilst);
+lapack_int LAPACKE_dtrexc(int matrix_order, char compq, lapack_int n, double* t, lapack_int ldt, double* q,
+                          lapack_int ldq, lapack_int* ifst, lapack_int* ilst);
+lapack_int LAPACKE_ctrexc(int matrix_order, char compq, lapack_int n, lapack_complex_float* t, lapack_int ldt,
+                          lapack_complex_float* q, lapack_int ldq, lapack_int ifst, lapack_int ilst);
+lapack_int LAPACKE_ztrexc(int matrix_order, char compq, lapack_int n, lapack_complex_double* t, lapack_int ldt,
+                          lapack_complex_double* q, lapack_int ldq, lapack_int ifst, lapack_int ilst);
 
-lapack_int LAPACKE_strexc( int matrix_order, char compq, lapack_int n, float* t,
-                           lapack_int ldt, float* q, lapack_int ldq,
-                           lapack_int* ifst, lapack_int* ilst );
-lapack_int LAPACKE_dtrexc( int matrix_order, char compq, lapack_int n,
-                           double* t, lapack_int ldt, double* q, lapack_int ldq,
-                           lapack_int* ifst, lapack_int* ilst );
-lapack_int LAPACKE_ctrexc( int matrix_order, char compq, lapack_int n,
-                           lapack_complex_float* t, lapack_int ldt,
-                           lapack_complex_float* q, lapack_int ldq,
-                           lapack_int ifst, lapack_int ilst );
-lapack_int LAPACKE_ztrexc( int matrix_order, char compq, lapack_int n,
-                           lapack_complex_double* t, lapack_int ldt,
-                           lapack_complex_double* q, lapack_int ldq,
-                           lapack_int ifst, lapack_int ilst );
+lapack_int LAPACKE_strrfs(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                          const float* a, lapack_int lda, const float* b, lapack_int ldb, const float* x,
+                          lapack_int ldx, float* ferr, float* berr);
+lapack_int LAPACKE_dtrrfs(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                          const double* a, lapack_int lda, const double* b, lapack_int ldb, const double* x,
+                          lapack_int ldx, double* ferr, double* berr);
+lapack_int LAPACKE_ctrrfs(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                          const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* b, lapack_int ldb,
+                          const lapack_complex_float* x, lapack_int ldx, float* ferr, float* berr);
+lapack_int LAPACKE_ztrrfs(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                          const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* b,
+                          lapack_int ldb, const lapack_complex_double* x, lapack_int ldx, double* ferr, double* berr);
 
-lapack_int LAPACKE_strrfs( int matrix_order, char uplo, char trans, char diag,
-                           lapack_int n, lapack_int nrhs, const float* a,
-                           lapack_int lda, const float* b, lapack_int ldb,
-                           const float* x, lapack_int ldx, float* ferr,
-                           float* berr );
-lapack_int LAPACKE_dtrrfs( int matrix_order, char uplo, char trans, char diag,
-                           lapack_int n, lapack_int nrhs, const double* a,
-                           lapack_int lda, const double* b, lapack_int ldb,
-                           const double* x, lapack_int ldx, double* ferr,
-                           double* berr );
-lapack_int LAPACKE_ctrrfs( int matrix_order, char uplo, char trans, char diag,
-                           lapack_int n, lapack_int nrhs,
-                           const lapack_complex_float* a, lapack_int lda,
-                           const lapack_complex_float* b, lapack_int ldb,
-                           const lapack_complex_float* x, lapack_int ldx,
-                           float* ferr, float* berr );
-lapack_int LAPACKE_ztrrfs( int matrix_order, char uplo, char trans, char diag,
-                           lapack_int n, lapack_int nrhs,
-                           const lapack_complex_double* a, lapack_int lda,
-                           const lapack_complex_double* b, lapack_int ldb,
-                           const lapack_complex_double* x, lapack_int ldx,
-                           double* ferr, double* berr );
+lapack_int LAPACKE_strsen(int matrix_order, char job, char compq, const lapack_logical* select, lapack_int n, float* t,
+                          lapack_int ldt, float* q, lapack_int ldq, float* wr, float* wi, lapack_int* m, float* s,
+                          float* sep);
+lapack_int LAPACKE_dtrsen(int matrix_order, char job, char compq, const lapack_logical* select, lapack_int n, double* t,
+                          lapack_int ldt, double* q, lapack_int ldq, double* wr, double* wi, lapack_int* m, double* s,
+                          double* sep);
+lapack_int LAPACKE_ctrsen(int matrix_order, char job, char compq, const lapack_logical* select, lapack_int n,
+                          lapack_complex_float* t, lapack_int ldt, lapack_complex_float* q, lapack_int ldq,
+                          lapack_complex_float* w, lapack_int* m, float* s, float* sep);
+lapack_int LAPACKE_ztrsen(int matrix_order, char job, char compq, const lapack_logical* select, lapack_int n,
+                          lapack_complex_double* t, lapack_int ldt, lapack_complex_double* q, lapack_int ldq,
+                          lapack_complex_double* w, lapack_int* m, double* s, double* sep);
 
-lapack_int LAPACKE_strsen( int matrix_order, char job, char compq,
-                           const lapack_logical* select, lapack_int n, float* t,
-                           lapack_int ldt, float* q, lapack_int ldq, float* wr,
-                           float* wi, lapack_int* m, float* s, float* sep );
-lapack_int LAPACKE_dtrsen( int matrix_order, char job, char compq,
-                           const lapack_logical* select, lapack_int n,
-                           double* t, lapack_int ldt, double* q, lapack_int ldq,
-                           double* wr, double* wi, lapack_int* m, double* s,
-                           double* sep );
-lapack_int LAPACKE_ctrsen( int matrix_order, char job, char compq,
-                           const lapack_logical* select, lapack_int n,
-                           lapack_complex_float* t, lapack_int ldt,
-                           lapack_complex_float* q, lapack_int ldq,
-                           lapack_complex_float* w, lapack_int* m, float* s,
-                           float* sep );
-lapack_int LAPACKE_ztrsen( int matrix_order, char job, char compq,
-                           const lapack_logical* select, lapack_int n,
-                           lapack_complex_double* t, lapack_int ldt,
-                           lapack_complex_double* q, lapack_int ldq,
-                           lapack_complex_double* w, lapack_int* m, double* s,
-                           double* sep );
+lapack_int LAPACKE_strsna(int matrix_order, char job, char howmny, const lapack_logical* select, lapack_int n,
+                          const float* t, lapack_int ldt, const float* vl, lapack_int ldvl, const float* vr,
+                          lapack_int ldvr, float* s, float* sep, lapack_int mm, lapack_int* m);
+lapack_int LAPACKE_dtrsna(int matrix_order, char job, char howmny, const lapack_logical* select, lapack_int n,
+                          const double* t, lapack_int ldt, const double* vl, lapack_int ldvl, const double* vr,
+                          lapack_int ldvr, double* s, double* sep, lapack_int mm, lapack_int* m);
+lapack_int LAPACKE_ctrsna(int matrix_order, char job, char howmny, const lapack_logical* select, lapack_int n,
+                          const lapack_complex_float* t, lapack_int ldt, const lapack_complex_float* vl,
+                          lapack_int ldvl, const lapack_complex_float* vr, lapack_int ldvr, float* s, float* sep,
+                          lapack_int mm, lapack_int* m);
+lapack_int LAPACKE_ztrsna(int matrix_order, char job, char howmny, const lapack_logical* select, lapack_int n,
+                          const lapack_complex_double* t, lapack_int ldt, const lapack_complex_double* vl,
+                          lapack_int ldvl, const lapack_complex_double* vr, lapack_int ldvr, double* s, double* sep,
+                          lapack_int mm, lapack_int* m);
 
-lapack_int LAPACKE_strsna( int matrix_order, char job, char howmny,
-                           const lapack_logical* select, lapack_int n,
-                           const float* t, lapack_int ldt, const float* vl,
-                           lapack_int ldvl, const float* vr, lapack_int ldvr,
-                           float* s, float* sep, lapack_int mm, lapack_int* m );
-lapack_int LAPACKE_dtrsna( int matrix_order, char job, char howmny,
-                           const lapack_logical* select, lapack_int n,
-                           const double* t, lapack_int ldt, const double* vl,
-                           lapack_int ldvl, const double* vr, lapack_int ldvr,
-                           double* s, double* sep, lapack_int mm,
-                           lapack_int* m );
-lapack_int LAPACKE_ctrsna( int matrix_order, char job, char howmny,
-                           const lapack_logical* select, lapack_int n,
-                           const lapack_complex_float* t, lapack_int ldt,
-                           const lapack_complex_float* vl, lapack_int ldvl,
-                           const lapack_complex_float* vr, lapack_int ldvr,
-                           float* s, float* sep, lapack_int mm, lapack_int* m );
-lapack_int LAPACKE_ztrsna( int matrix_order, char job, char howmny,
-                           const lapack_logical* select, lapack_int n,
-                           const lapack_complex_double* t, lapack_int ldt,
-                           const lapack_complex_double* vl, lapack_int ldvl,
-                           const lapack_complex_double* vr, lapack_int ldvr,
-                           double* s, double* sep, lapack_int mm,
-                           lapack_int* m );
+lapack_int LAPACKE_strsyl(int matrix_order, char trana, char tranb, lapack_int isgn, lapack_int m, lapack_int n,
+                          const float* a, lapack_int lda, const float* b, lapack_int ldb, float* c, lapack_int ldc,
+                          float* scale);
+lapack_int LAPACKE_dtrsyl(int matrix_order, char trana, char tranb, lapack_int isgn, lapack_int m, lapack_int n,
+                          const double* a, lapack_int lda, const double* b, lapack_int ldb, double* c, lapack_int ldc,
+                          double* scale);
+lapack_int LAPACKE_ctrsyl(int matrix_order, char trana, char tranb, lapack_int isgn, lapack_int m, lapack_int n,
+                          const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* b, lapack_int ldb,
+                          lapack_complex_float* c, lapack_int ldc, float* scale);
+lapack_int LAPACKE_ztrsyl(int matrix_order, char trana, char tranb, lapack_int isgn, lapack_int m, lapack_int n,
+                          const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* b,
+                          lapack_int ldb, lapack_complex_double* c, lapack_int ldc, double* scale);
 
-lapack_int LAPACKE_strsyl( int matrix_order, char trana, char tranb,
-                           lapack_int isgn, lapack_int m, lapack_int n,
-                           const float* a, lapack_int lda, const float* b,
-                           lapack_int ldb, float* c, lapack_int ldc,
-                           float* scale );
-lapack_int LAPACKE_dtrsyl( int matrix_order, char trana, char tranb,
-                           lapack_int isgn, lapack_int m, lapack_int n,
-                           const double* a, lapack_int lda, const double* b,
-                           lapack_int ldb, double* c, lapack_int ldc,
-                           double* scale );
-lapack_int LAPACKE_ctrsyl( int matrix_order, char trana, char tranb,
-                           lapack_int isgn, lapack_int m, lapack_int n,
-                           const lapack_complex_float* a, lapack_int lda,
-                           const lapack_complex_float* b, lapack_int ldb,
-                           lapack_complex_float* c, lapack_int ldc,
-                           float* scale );
-lapack_int LAPACKE_ztrsyl( int matrix_order, char trana, char tranb,
-                           lapack_int isgn, lapack_int m, lapack_int n,
-                           const lapack_complex_double* a, lapack_int lda,
-                           const lapack_complex_double* b, lapack_int ldb,
-                           lapack_complex_double* c, lapack_int ldc,
-                           double* scale );
+lapack_int LAPACKE_strtri(int matrix_order, char uplo, char diag, lapack_int n, float* a, lapack_int lda);
+lapack_int LAPACKE_dtrtri(int matrix_order, char uplo, char diag, lapack_int n, double* a, lapack_int lda);
+lapack_int LAPACKE_ctrtri(int matrix_order, char uplo, char diag, lapack_int n, lapack_complex_float* a,
+                          lapack_int lda);
+lapack_int LAPACKE_ztrtri(int matrix_order, char uplo, char diag, lapack_int n, lapack_complex_double* a,
+                          lapack_int lda);
 
-lapack_int LAPACKE_strtri( int matrix_order, char uplo, char diag, lapack_int n,
-                           float* a, lapack_int lda );
-lapack_int LAPACKE_dtrtri( int matrix_order, char uplo, char diag, lapack_int n,
-                           double* a, lapack_int lda );
-lapack_int LAPACKE_ctrtri( int matrix_order, char uplo, char diag, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda );
-lapack_int LAPACKE_ztrtri( int matrix_order, char uplo, char diag, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda );
+lapack_int LAPACKE_strtrs(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                          const float* a, lapack_int lda, float* b, lapack_int ldb);
+lapack_int LAPACKE_dtrtrs(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                          const double* a, lapack_int lda, double* b, lapack_int ldb);
+lapack_int LAPACKE_ctrtrs(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                          const lapack_complex_float* a, lapack_int lda, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_ztrtrs(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                          const lapack_complex_double* a, lapack_int lda, lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_strtrs( int matrix_order, char uplo, char trans, char diag,
-                           lapack_int n, lapack_int nrhs, const float* a,
-                           lapack_int lda, float* b, lapack_int ldb );
-lapack_int LAPACKE_dtrtrs( int matrix_order, char uplo, char trans, char diag,
-                           lapack_int n, lapack_int nrhs, const double* a,
-                           lapack_int lda, double* b, lapack_int ldb );
-lapack_int LAPACKE_ctrtrs( int matrix_order, char uplo, char trans, char diag,
-                           lapack_int n, lapack_int nrhs,
-                           const lapack_complex_float* a, lapack_int lda,
-                           lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_ztrtrs( int matrix_order, char uplo, char trans, char diag,
-                           lapack_int n, lapack_int nrhs,
-                           const lapack_complex_double* a, lapack_int lda,
-                           lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_strttf(int matrix_order, char transr, char uplo, lapack_int n, const float* a, lapack_int lda,
+                          float* arf);
+lapack_int LAPACKE_dtrttf(int matrix_order, char transr, char uplo, lapack_int n, const double* a, lapack_int lda,
+                          double* arf);
+lapack_int LAPACKE_ctrttf(int matrix_order, char transr, char uplo, lapack_int n, const lapack_complex_float* a,
+                          lapack_int lda, lapack_complex_float* arf);
+lapack_int LAPACKE_ztrttf(int matrix_order, char transr, char uplo, lapack_int n, const lapack_complex_double* a,
+                          lapack_int lda, lapack_complex_double* arf);
 
-lapack_int LAPACKE_strttf( int matrix_order, char transr, char uplo,
-                           lapack_int n, const float* a, lapack_int lda,
-                           float* arf );
-lapack_int LAPACKE_dtrttf( int matrix_order, char transr, char uplo,
-                           lapack_int n, const double* a, lapack_int lda,
-                           double* arf );
-lapack_int LAPACKE_ctrttf( int matrix_order, char transr, char uplo,
-                           lapack_int n, const lapack_complex_float* a,
-                           lapack_int lda, lapack_complex_float* arf );
-lapack_int LAPACKE_ztrttf( int matrix_order, char transr, char uplo,
-                           lapack_int n, const lapack_complex_double* a,
-                           lapack_int lda, lapack_complex_double* arf );
+lapack_int LAPACKE_strttp(int matrix_order, char uplo, lapack_int n, const float* a, lapack_int lda, float* ap);
+lapack_int LAPACKE_dtrttp(int matrix_order, char uplo, lapack_int n, const double* a, lapack_int lda, double* ap);
+lapack_int LAPACKE_ctrttp(int matrix_order, char uplo, lapack_int n, const lapack_complex_float* a, lapack_int lda,
+                          lapack_complex_float* ap);
+lapack_int LAPACKE_ztrttp(int matrix_order, char uplo, lapack_int n, const lapack_complex_double* a, lapack_int lda,
+                          lapack_complex_double* ap);
 
-lapack_int LAPACKE_strttp( int matrix_order, char uplo, lapack_int n,
-                           const float* a, lapack_int lda, float* ap );
-lapack_int LAPACKE_dtrttp( int matrix_order, char uplo, lapack_int n,
-                           const double* a, lapack_int lda, double* ap );
-lapack_int LAPACKE_ctrttp( int matrix_order, char uplo, lapack_int n,
-                           const lapack_complex_float* a, lapack_int lda,
-                           lapack_complex_float* ap );
-lapack_int LAPACKE_ztrttp( int matrix_order, char uplo, lapack_int n,
-                           const lapack_complex_double* a, lapack_int lda,
-                           lapack_complex_double* ap );
+lapack_int LAPACKE_stzrzf(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, float* tau);
+lapack_int LAPACKE_dtzrzf(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda, double* tau);
+lapack_int LAPACKE_ctzrzf(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                          lapack_complex_float* tau);
+lapack_int LAPACKE_ztzrzf(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                          lapack_complex_double* tau);
 
-lapack_int LAPACKE_stzrzf( int matrix_order, lapack_int m, lapack_int n,
-                           float* a, lapack_int lda, float* tau );
-lapack_int LAPACKE_dtzrzf( int matrix_order, lapack_int m, lapack_int n,
-                           double* a, lapack_int lda, double* tau );
-lapack_int LAPACKE_ctzrzf( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda,
-                           lapack_complex_float* tau );
-lapack_int LAPACKE_ztzrzf( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_complex_double* tau );
+lapack_int LAPACKE_cungbr(int matrix_order, char vect, lapack_int m, lapack_int n, lapack_int k,
+                          lapack_complex_float* a, lapack_int lda, const lapack_complex_float* tau);
+lapack_int LAPACKE_zungbr(int matrix_order, char vect, lapack_int m, lapack_int n, lapack_int k,
+                          lapack_complex_double* a, lapack_int lda, const lapack_complex_double* tau);
 
-lapack_int LAPACKE_cungbr( int matrix_order, char vect, lapack_int m,
-                           lapack_int n, lapack_int k, lapack_complex_float* a,
-                           lapack_int lda, const lapack_complex_float* tau );
-lapack_int LAPACKE_zungbr( int matrix_order, char vect, lapack_int m,
-                           lapack_int n, lapack_int k, lapack_complex_double* a,
-                           lapack_int lda, const lapack_complex_double* tau );
+lapack_int LAPACKE_cunghr(int matrix_order, lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_float* a,
+                          lapack_int lda, const lapack_complex_float* tau);
+lapack_int LAPACKE_zunghr(int matrix_order, lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_double* a,
+                          lapack_int lda, const lapack_complex_double* tau);
 
-lapack_int LAPACKE_cunghr( int matrix_order, lapack_int n, lapack_int ilo,
-                           lapack_int ihi, lapack_complex_float* a,
-                           lapack_int lda, const lapack_complex_float* tau );
-lapack_int LAPACKE_zunghr( int matrix_order, lapack_int n, lapack_int ilo,
-                           lapack_int ihi, lapack_complex_double* a,
-                           lapack_int lda, const lapack_complex_double* tau );
+lapack_int LAPACKE_cunglq(int matrix_order, lapack_int m, lapack_int n, lapack_int k, lapack_complex_float* a,
+                          lapack_int lda, const lapack_complex_float* tau);
+lapack_int LAPACKE_zunglq(int matrix_order, lapack_int m, lapack_int n, lapack_int k, lapack_complex_double* a,
+                          lapack_int lda, const lapack_complex_double* tau);
 
-lapack_int LAPACKE_cunglq( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int k, lapack_complex_float* a,
-                           lapack_int lda, const lapack_complex_float* tau );
-lapack_int LAPACKE_zunglq( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int k, lapack_complex_double* a,
-                           lapack_int lda, const lapack_complex_double* tau );
+lapack_int LAPACKE_cungql(int matrix_order, lapack_int m, lapack_int n, lapack_int k, lapack_complex_float* a,
+                          lapack_int lda, const lapack_complex_float* tau);
+lapack_int LAPACKE_zungql(int matrix_order, lapack_int m, lapack_int n, lapack_int k, lapack_complex_double* a,
+                          lapack_int lda, const lapack_complex_double* tau);
 
-lapack_int LAPACKE_cungql( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int k, lapack_complex_float* a,
-                           lapack_int lda, const lapack_complex_float* tau );
-lapack_int LAPACKE_zungql( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int k, lapack_complex_double* a,
-                           lapack_int lda, const lapack_complex_double* tau );
+lapack_int LAPACKE_cungqr(int matrix_order, lapack_int m, lapack_int n, lapack_int k, lapack_complex_float* a,
+                          lapack_int lda, const lapack_complex_float* tau);
+lapack_int LAPACKE_zungqr(int matrix_order, lapack_int m, lapack_int n, lapack_int k, lapack_complex_double* a,
+                          lapack_int lda, const lapack_complex_double* tau);
 
-lapack_int LAPACKE_cungqr( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int k, lapack_complex_float* a,
-                           lapack_int lda, const lapack_complex_float* tau );
-lapack_int LAPACKE_zungqr( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int k, lapack_complex_double* a,
-                           lapack_int lda, const lapack_complex_double* tau );
+lapack_int LAPACKE_cungrq(int matrix_order, lapack_int m, lapack_int n, lapack_int k, lapack_complex_float* a,
+                          lapack_int lda, const lapack_complex_float* tau);
+lapack_int LAPACKE_zungrq(int matrix_order, lapack_int m, lapack_int n, lapack_int k, lapack_complex_double* a,
+                          lapack_int lda, const lapack_complex_double* tau);
 
-lapack_int LAPACKE_cungrq( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int k, lapack_complex_float* a,
-                           lapack_int lda, const lapack_complex_float* tau );
-lapack_int LAPACKE_zungrq( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int k, lapack_complex_double* a,
-                           lapack_int lda, const lapack_complex_double* tau );
+lapack_int LAPACKE_cungtr(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                          const lapack_complex_float* tau);
+lapack_int LAPACKE_zungtr(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                          const lapack_complex_double* tau);
 
-lapack_int LAPACKE_cungtr( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_float* a, lapack_int lda,
-                           const lapack_complex_float* tau );
-lapack_int LAPACKE_zungtr( int matrix_order, char uplo, lapack_int n,
-                           lapack_complex_double* a, lapack_int lda,
-                           const lapack_complex_double* tau );
+lapack_int LAPACKE_cunmbr(int matrix_order, char vect, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                          const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* tau,
+                          lapack_complex_float* c, lapack_int ldc);
+lapack_int LAPACKE_zunmbr(int matrix_order, char vect, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                          const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* tau,
+                          lapack_complex_double* c, lapack_int ldc);
 
-lapack_int LAPACKE_cunmbr( int matrix_order, char vect, char side, char trans,
-                           lapack_int m, lapack_int n, lapack_int k,
-                           const lapack_complex_float* a, lapack_int lda,
-                           const lapack_complex_float* tau,
-                           lapack_complex_float* c, lapack_int ldc );
-lapack_int LAPACKE_zunmbr( int matrix_order, char vect, char side, char trans,
-                           lapack_int m, lapack_int n, lapack_int k,
-                           const lapack_complex_double* a, lapack_int lda,
-                           const lapack_complex_double* tau,
-                           lapack_complex_double* c, lapack_int ldc );
+lapack_int LAPACKE_cunmhr(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int ilo,
+                          lapack_int ihi, const lapack_complex_float* a, lapack_int lda,
+                          const lapack_complex_float* tau, lapack_complex_float* c, lapack_int ldc);
+lapack_int LAPACKE_zunmhr(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int ilo,
+                          lapack_int ihi, const lapack_complex_double* a, lapack_int lda,
+                          const lapack_complex_double* tau, lapack_complex_double* c, lapack_int ldc);
 
-lapack_int LAPACKE_cunmhr( int matrix_order, char side, char trans,
-                           lapack_int m, lapack_int n, lapack_int ilo,
-                           lapack_int ihi, const lapack_complex_float* a,
-                           lapack_int lda, const lapack_complex_float* tau,
-                           lapack_complex_float* c, lapack_int ldc );
-lapack_int LAPACKE_zunmhr( int matrix_order, char side, char trans,
-                           lapack_int m, lapack_int n, lapack_int ilo,
-                           lapack_int ihi, const lapack_complex_double* a,
-                           lapack_int lda, const lapack_complex_double* tau,
-                           lapack_complex_double* c, lapack_int ldc );
+lapack_int LAPACKE_cunmlq(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                          const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* tau,
+                          lapack_complex_float* c, lapack_int ldc);
+lapack_int LAPACKE_zunmlq(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                          const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* tau,
+                          lapack_complex_double* c, lapack_int ldc);
 
-lapack_int LAPACKE_cunmlq( int matrix_order, char side, char trans,
-                           lapack_int m, lapack_int n, lapack_int k,
-                           const lapack_complex_float* a, lapack_int lda,
-                           const lapack_complex_float* tau,
-                           lapack_complex_float* c, lapack_int ldc );
-lapack_int LAPACKE_zunmlq( int matrix_order, char side, char trans,
-                           lapack_int m, lapack_int n, lapack_int k,
-                           const lapack_complex_double* a, lapack_int lda,
-                           const lapack_complex_double* tau,
-                           lapack_complex_double* c, lapack_int ldc );
+lapack_int LAPACKE_cunmql(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                          const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* tau,
+                          lapack_complex_float* c, lapack_int ldc);
+lapack_int LAPACKE_zunmql(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                          const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* tau,
+                          lapack_complex_double* c, lapack_int ldc);
 
-lapack_int LAPACKE_cunmql( int matrix_order, char side, char trans,
-                           lapack_int m, lapack_int n, lapack_int k,
-                           const lapack_complex_float* a, lapack_int lda,
-                           const lapack_complex_float* tau,
-                           lapack_complex_float* c, lapack_int ldc );
-lapack_int LAPACKE_zunmql( int matrix_order, char side, char trans,
-                           lapack_int m, lapack_int n, lapack_int k,
-                           const lapack_complex_double* a, lapack_int lda,
-                           const lapack_complex_double* tau,
-                           lapack_complex_double* c, lapack_int ldc );
+lapack_int LAPACKE_cunmqr(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                          const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* tau,
+                          lapack_complex_float* c, lapack_int ldc);
+lapack_int LAPACKE_zunmqr(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                          const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* tau,
+                          lapack_complex_double* c, lapack_int ldc);
 
-lapack_int LAPACKE_cunmqr( int matrix_order, char side, char trans,
-                           lapack_int m, lapack_int n, lapack_int k,
-                           const lapack_complex_float* a, lapack_int lda,
-                           const lapack_complex_float* tau,
-                           lapack_complex_float* c, lapack_int ldc );
-lapack_int LAPACKE_zunmqr( int matrix_order, char side, char trans,
-                           lapack_int m, lapack_int n, lapack_int k,
-                           const lapack_complex_double* a, lapack_int lda,
-                           const lapack_complex_double* tau,
-                           lapack_complex_double* c, lapack_int ldc );
+lapack_int LAPACKE_cunmrq(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                          const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* tau,
+                          lapack_complex_float* c, lapack_int ldc);
+lapack_int LAPACKE_zunmrq(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                          const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* tau,
+                          lapack_complex_double* c, lapack_int ldc);
 
-lapack_int LAPACKE_cunmrq( int matrix_order, char side, char trans,
-                           lapack_int m, lapack_int n, lapack_int k,
-                           const lapack_complex_float* a, lapack_int lda,
-                           const lapack_complex_float* tau,
-                           lapack_complex_float* c, lapack_int ldc );
-lapack_int LAPACKE_zunmrq( int matrix_order, char side, char trans,
-                           lapack_int m, lapack_int n, lapack_int k,
-                           const lapack_complex_double* a, lapack_int lda,
-                           const lapack_complex_double* tau,
-                           lapack_complex_double* c, lapack_int ldc );
+lapack_int LAPACKE_cunmrz(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                          lapack_int l, const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* tau,
+                          lapack_complex_float* c, lapack_int ldc);
+lapack_int LAPACKE_zunmrz(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                          lapack_int l, const lapack_complex_double* a, lapack_int lda,
+                          const lapack_complex_double* tau, lapack_complex_double* c, lapack_int ldc);
 
-lapack_int LAPACKE_cunmrz( int matrix_order, char side, char trans,
-                           lapack_int m, lapack_int n, lapack_int k,
-                           lapack_int l, const lapack_complex_float* a,
-                           lapack_int lda, const lapack_complex_float* tau,
-                           lapack_complex_float* c, lapack_int ldc );
-lapack_int LAPACKE_zunmrz( int matrix_order, char side, char trans,
-                           lapack_int m, lapack_int n, lapack_int k,
-                           lapack_int l, const lapack_complex_double* a,
-                           lapack_int lda, const lapack_complex_double* tau,
-                           lapack_complex_double* c, lapack_int ldc );
+lapack_int LAPACKE_cunmtr(int matrix_order, char side, char uplo, char trans, lapack_int m, lapack_int n,
+                          const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* tau,
+                          lapack_complex_float* c, lapack_int ldc);
+lapack_int LAPACKE_zunmtr(int matrix_order, char side, char uplo, char trans, lapack_int m, lapack_int n,
+                          const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* tau,
+                          lapack_complex_double* c, lapack_int ldc);
 
-lapack_int LAPACKE_cunmtr( int matrix_order, char side, char uplo, char trans,
-                           lapack_int m, lapack_int n,
-                           const lapack_complex_float* a, lapack_int lda,
-                           const lapack_complex_float* tau,
-                           lapack_complex_float* c, lapack_int ldc );
-lapack_int LAPACKE_zunmtr( int matrix_order, char side, char uplo, char trans,
-                           lapack_int m, lapack_int n,
-                           const lapack_complex_double* a, lapack_int lda,
-                           const lapack_complex_double* tau,
-                           lapack_complex_double* c, lapack_int ldc );
+lapack_int LAPACKE_cupgtr(int matrix_order, char uplo, lapack_int n, const lapack_complex_float* ap,
+                          const lapack_complex_float* tau, lapack_complex_float* q, lapack_int ldq);
+lapack_int LAPACKE_zupgtr(int matrix_order, char uplo, lapack_int n, const lapack_complex_double* ap,
+                          const lapack_complex_double* tau, lapack_complex_double* q, lapack_int ldq);
 
-lapack_int LAPACKE_cupgtr( int matrix_order, char uplo, lapack_int n,
-                           const lapack_complex_float* ap,
-                           const lapack_complex_float* tau,
-                           lapack_complex_float* q, lapack_int ldq );
-lapack_int LAPACKE_zupgtr( int matrix_order, char uplo, lapack_int n,
-                           const lapack_complex_double* ap,
-                           const lapack_complex_double* tau,
-                           lapack_complex_double* q, lapack_int ldq );
+lapack_int LAPACKE_cupmtr(int matrix_order, char side, char uplo, char trans, lapack_int m, lapack_int n,
+                          const lapack_complex_float* ap, const lapack_complex_float* tau, lapack_complex_float* c,
+                          lapack_int ldc);
+lapack_int LAPACKE_zupmtr(int matrix_order, char side, char uplo, char trans, lapack_int m, lapack_int n,
+                          const lapack_complex_double* ap, const lapack_complex_double* tau, lapack_complex_double* c,
+                          lapack_int ldc);
 
-lapack_int LAPACKE_cupmtr( int matrix_order, char side, char uplo, char trans,
-                           lapack_int m, lapack_int n,
-                           const lapack_complex_float* ap,
-                           const lapack_complex_float* tau,
-                           lapack_complex_float* c, lapack_int ldc );
-lapack_int LAPACKE_zupmtr( int matrix_order, char side, char uplo, char trans,
-                           lapack_int m, lapack_int n,
-                           const lapack_complex_double* ap,
-                           const lapack_complex_double* tau,
-                           lapack_complex_double* c, lapack_int ldc );
+lapack_int LAPACKE_sbdsdc_work(int matrix_order, char uplo, char compq, lapack_int n, float* d, float* e, float* u,
+                               lapack_int ldu, float* vt, lapack_int ldvt, float* q, lapack_int* iq, float* work,
+                               lapack_int* iwork);
+lapack_int LAPACKE_dbdsdc_work(int matrix_order, char uplo, char compq, lapack_int n, double* d, double* e, double* u,
+                               lapack_int ldu, double* vt, lapack_int ldvt, double* q, lapack_int* iq, double* work,
+                               lapack_int* iwork);
 
-lapack_int LAPACKE_sbdsdc_work( int matrix_order, char uplo, char compq,
-                                lapack_int n, float* d, float* e, float* u,
-                                lapack_int ldu, float* vt, lapack_int ldvt,
-                                float* q, lapack_int* iq, float* work,
-                                lapack_int* iwork );
-lapack_int LAPACKE_dbdsdc_work( int matrix_order, char uplo, char compq,
-                                lapack_int n, double* d, double* e, double* u,
-                                lapack_int ldu, double* vt, lapack_int ldvt,
-                                double* q, lapack_int* iq, double* work,
-                                lapack_int* iwork );
+lapack_int LAPACKE_sbdsqr_work(int matrix_order, char uplo, lapack_int n, lapack_int ncvt, lapack_int nru,
+                               lapack_int ncc, float* d, float* e, float* vt, lapack_int ldvt, float* u, lapack_int ldu,
+                               float* c, lapack_int ldc, float* work);
+lapack_int LAPACKE_dbdsqr_work(int matrix_order, char uplo, lapack_int n, lapack_int ncvt, lapack_int nru,
+                               lapack_int ncc, double* d, double* e, double* vt, lapack_int ldvt, double* u,
+                               lapack_int ldu, double* c, lapack_int ldc, double* work);
+lapack_int LAPACKE_cbdsqr_work(int matrix_order, char uplo, lapack_int n, lapack_int ncvt, lapack_int nru,
+                               lapack_int ncc, float* d, float* e, lapack_complex_float* vt, lapack_int ldvt,
+                               lapack_complex_float* u, lapack_int ldu, lapack_complex_float* c, lapack_int ldc,
+                               float* work);
+lapack_int LAPACKE_zbdsqr_work(int matrix_order, char uplo, lapack_int n, lapack_int ncvt, lapack_int nru,
+                               lapack_int ncc, double* d, double* e, lapack_complex_double* vt, lapack_int ldvt,
+                               lapack_complex_double* u, lapack_int ldu, lapack_complex_double* c, lapack_int ldc,
+                               double* work);
 
-lapack_int LAPACKE_sbdsqr_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int ncvt, lapack_int nru, lapack_int ncc,
-                                float* d, float* e, float* vt, lapack_int ldvt,
-                                float* u, lapack_int ldu, float* c,
-                                lapack_int ldc, float* work );
-lapack_int LAPACKE_dbdsqr_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int ncvt, lapack_int nru, lapack_int ncc,
-                                double* d, double* e, double* vt,
-                                lapack_int ldvt, double* u, lapack_int ldu,
-                                double* c, lapack_int ldc, double* work );
-lapack_int LAPACKE_cbdsqr_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int ncvt, lapack_int nru, lapack_int ncc,
-                                float* d, float* e, lapack_complex_float* vt,
-                                lapack_int ldvt, lapack_complex_float* u,
-                                lapack_int ldu, lapack_complex_float* c,
-                                lapack_int ldc, float* work );
-lapack_int LAPACKE_zbdsqr_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int ncvt, lapack_int nru, lapack_int ncc,
-                                double* d, double* e, lapack_complex_double* vt,
-                                lapack_int ldvt, lapack_complex_double* u,
-                                lapack_int ldu, lapack_complex_double* c,
-                                lapack_int ldc, double* work );
+lapack_int LAPACKE_sdisna_work(char job, lapack_int m, lapack_int n, const float* d, float* sep);
+lapack_int LAPACKE_ddisna_work(char job, lapack_int m, lapack_int n, const double* d, double* sep);
 
-lapack_int LAPACKE_sdisna_work( char job, lapack_int m, lapack_int n,
-                                const float* d, float* sep );
-lapack_int LAPACKE_ddisna_work( char job, lapack_int m, lapack_int n,
-                                const double* d, double* sep );
+lapack_int LAPACKE_sgbbrd_work(int matrix_order, char vect, lapack_int m, lapack_int n, lapack_int ncc, lapack_int kl,
+                               lapack_int ku, float* ab, lapack_int ldab, float* d, float* e, float* q, lapack_int ldq,
+                               float* pt, lapack_int ldpt, float* c, lapack_int ldc, float* work);
+lapack_int LAPACKE_dgbbrd_work(int matrix_order, char vect, lapack_int m, lapack_int n, lapack_int ncc, lapack_int kl,
+                               lapack_int ku, double* ab, lapack_int ldab, double* d, double* e, double* q,
+                               lapack_int ldq, double* pt, lapack_int ldpt, double* c, lapack_int ldc, double* work);
+lapack_int LAPACKE_cgbbrd_work(int matrix_order, char vect, lapack_int m, lapack_int n, lapack_int ncc, lapack_int kl,
+                               lapack_int ku, lapack_complex_float* ab, lapack_int ldab, float* d, float* e,
+                               lapack_complex_float* q, lapack_int ldq, lapack_complex_float* pt, lapack_int ldpt,
+                               lapack_complex_float* c, lapack_int ldc, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zgbbrd_work(int matrix_order, char vect, lapack_int m, lapack_int n, lapack_int ncc, lapack_int kl,
+                               lapack_int ku, lapack_complex_double* ab, lapack_int ldab, double* d, double* e,
+                               lapack_complex_double* q, lapack_int ldq, lapack_complex_double* pt, lapack_int ldpt,
+                               lapack_complex_double* c, lapack_int ldc, lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_sgbbrd_work( int matrix_order, char vect, lapack_int m,
-                                lapack_int n, lapack_int ncc, lapack_int kl,
-                                lapack_int ku, float* ab, lapack_int ldab,
-                                float* d, float* e, float* q, lapack_int ldq,
-                                float* pt, lapack_int ldpt, float* c,
-                                lapack_int ldc, float* work );
-lapack_int LAPACKE_dgbbrd_work( int matrix_order, char vect, lapack_int m,
-                                lapack_int n, lapack_int ncc, lapack_int kl,
-                                lapack_int ku, double* ab, lapack_int ldab,
-                                double* d, double* e, double* q, lapack_int ldq,
-                                double* pt, lapack_int ldpt, double* c,
-                                lapack_int ldc, double* work );
-lapack_int LAPACKE_cgbbrd_work( int matrix_order, char vect, lapack_int m,
-                                lapack_int n, lapack_int ncc, lapack_int kl,
-                                lapack_int ku, lapack_complex_float* ab,
-                                lapack_int ldab, float* d, float* e,
-                                lapack_complex_float* q, lapack_int ldq,
-                                lapack_complex_float* pt, lapack_int ldpt,
-                                lapack_complex_float* c, lapack_int ldc,
-                                lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_zgbbrd_work( int matrix_order, char vect, lapack_int m,
-                                lapack_int n, lapack_int ncc, lapack_int kl,
-                                lapack_int ku, lapack_complex_double* ab,
-                                lapack_int ldab, double* d, double* e,
-                                lapack_complex_double* q, lapack_int ldq,
-                                lapack_complex_double* pt, lapack_int ldpt,
-                                lapack_complex_double* c, lapack_int ldc,
-                                lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_sgbcon_work(int matrix_order, char norm, lapack_int n, lapack_int kl, lapack_int ku, const float* ab,
+                               lapack_int ldab, const lapack_int* ipiv, float anorm, float* rcond, float* work,
+                               lapack_int* iwork);
+lapack_int LAPACKE_dgbcon_work(int matrix_order, char norm, lapack_int n, lapack_int kl, lapack_int ku,
+                               const double* ab, lapack_int ldab, const lapack_int* ipiv, double anorm, double* rcond,
+                               double* work, lapack_int* iwork);
+lapack_int LAPACKE_cgbcon_work(int matrix_order, char norm, lapack_int n, lapack_int kl, lapack_int ku,
+                               const lapack_complex_float* ab, lapack_int ldab, const lapack_int* ipiv, float anorm,
+                               float* rcond, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zgbcon_work(int matrix_order, char norm, lapack_int n, lapack_int kl, lapack_int ku,
+                               const lapack_complex_double* ab, lapack_int ldab, const lapack_int* ipiv, double anorm,
+                               double* rcond, lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_sgbcon_work( int matrix_order, char norm, lapack_int n,
-                                lapack_int kl, lapack_int ku, const float* ab,
-                                lapack_int ldab, const lapack_int* ipiv,
-                                float anorm, float* rcond, float* work,
-                                lapack_int* iwork );
-lapack_int LAPACKE_dgbcon_work( int matrix_order, char norm, lapack_int n,
-                                lapack_int kl, lapack_int ku, const double* ab,
-                                lapack_int ldab, const lapack_int* ipiv,
-                                double anorm, double* rcond, double* work,
-                                lapack_int* iwork );
-lapack_int LAPACKE_cgbcon_work( int matrix_order, char norm, lapack_int n,
-                                lapack_int kl, lapack_int ku,
-                                const lapack_complex_float* ab, lapack_int ldab,
-                                const lapack_int* ipiv, float anorm,
-                                float* rcond, lapack_complex_float* work,
-                                float* rwork );
-lapack_int LAPACKE_zgbcon_work( int matrix_order, char norm, lapack_int n,
-                                lapack_int kl, lapack_int ku,
-                                const lapack_complex_double* ab,
-                                lapack_int ldab, const lapack_int* ipiv,
-                                double anorm, double* rcond,
-                                lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_sgbequ_work(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku,
+                               const float* ab, lapack_int ldab, float* r, float* c, float* rowcnd, float* colcnd,
+                               float* amax);
+lapack_int LAPACKE_dgbequ_work(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku,
+                               const double* ab, lapack_int ldab, double* r, double* c, double* rowcnd, double* colcnd,
+                               double* amax);
+lapack_int LAPACKE_cgbequ_work(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku,
+                               const lapack_complex_float* ab, lapack_int ldab, float* r, float* c, float* rowcnd,
+                               float* colcnd, float* amax);
+lapack_int LAPACKE_zgbequ_work(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku,
+                               const lapack_complex_double* ab, lapack_int ldab, double* r, double* c, double* rowcnd,
+                               double* colcnd, double* amax);
 
-lapack_int LAPACKE_sgbequ_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int kl, lapack_int ku, const float* ab,
-                                lapack_int ldab, float* r, float* c,
-                                float* rowcnd, float* colcnd, float* amax );
-lapack_int LAPACKE_dgbequ_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int kl, lapack_int ku, const double* ab,
-                                lapack_int ldab, double* r, double* c,
-                                double* rowcnd, double* colcnd, double* amax );
-lapack_int LAPACKE_cgbequ_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int kl, lapack_int ku,
-                                const lapack_complex_float* ab, lapack_int ldab,
-                                float* r, float* c, float* rowcnd,
-                                float* colcnd, float* amax );
-lapack_int LAPACKE_zgbequ_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int kl, lapack_int ku,
-                                const lapack_complex_double* ab,
-                                lapack_int ldab, double* r, double* c,
-                                double* rowcnd, double* colcnd, double* amax );
+lapack_int LAPACKE_sgbequb_work(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku,
+                                const float* ab, lapack_int ldab, float* r, float* c, float* rowcnd, float* colcnd,
+                                float* amax);
+lapack_int LAPACKE_dgbequb_work(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku,
+                                const double* ab, lapack_int ldab, double* r, double* c, double* rowcnd, double* colcnd,
+                                double* amax);
+lapack_int LAPACKE_cgbequb_work(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku,
+                                const lapack_complex_float* ab, lapack_int ldab, float* r, float* c, float* rowcnd,
+                                float* colcnd, float* amax);
+lapack_int LAPACKE_zgbequb_work(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku,
+                                const lapack_complex_double* ab, lapack_int ldab, double* r, double* c, double* rowcnd,
+                                double* colcnd, double* amax);
 
-lapack_int LAPACKE_sgbequb_work( int matrix_order, lapack_int m, lapack_int n,
-                                 lapack_int kl, lapack_int ku, const float* ab,
-                                 lapack_int ldab, float* r, float* c,
-                                 float* rowcnd, float* colcnd, float* amax );
-lapack_int LAPACKE_dgbequb_work( int matrix_order, lapack_int m, lapack_int n,
-                                 lapack_int kl, lapack_int ku, const double* ab,
-                                 lapack_int ldab, double* r, double* c,
-                                 double* rowcnd, double* colcnd, double* amax );
-lapack_int LAPACKE_cgbequb_work( int matrix_order, lapack_int m, lapack_int n,
-                                 lapack_int kl, lapack_int ku,
-                                 const lapack_complex_float* ab,
-                                 lapack_int ldab, float* r, float* c,
-                                 float* rowcnd, float* colcnd, float* amax );
-lapack_int LAPACKE_zgbequb_work( int matrix_order, lapack_int m, lapack_int n,
-                                 lapack_int kl, lapack_int ku,
-                                 const lapack_complex_double* ab,
-                                 lapack_int ldab, double* r, double* c,
-                                 double* rowcnd, double* colcnd, double* amax );
+lapack_int LAPACKE_sgbrfs_work(int matrix_order, char trans, lapack_int n, lapack_int kl, lapack_int ku,
+                               lapack_int nrhs, const float* ab, lapack_int ldab, const float* afb, lapack_int ldafb,
+                               const lapack_int* ipiv, const float* b, lapack_int ldb, float* x, lapack_int ldx,
+                               float* ferr, float* berr, float* work, lapack_int* iwork);
+lapack_int LAPACKE_dgbrfs_work(int matrix_order, char trans, lapack_int n, lapack_int kl, lapack_int ku,
+                               lapack_int nrhs, const double* ab, lapack_int ldab, const double* afb, lapack_int ldafb,
+                               const lapack_int* ipiv, const double* b, lapack_int ldb, double* x, lapack_int ldx,
+                               double* ferr, double* berr, double* work, lapack_int* iwork);
+lapack_int LAPACKE_cgbrfs_work(int matrix_order, char trans, lapack_int n, lapack_int kl, lapack_int ku,
+                               lapack_int nrhs, const lapack_complex_float* ab, lapack_int ldab,
+                               const lapack_complex_float* afb, lapack_int ldafb, const lapack_int* ipiv,
+                               const lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x, lapack_int ldx,
+                               float* ferr, float* berr, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zgbrfs_work(int matrix_order, char trans, lapack_int n, lapack_int kl, lapack_int ku,
+                               lapack_int nrhs, const lapack_complex_double* ab, lapack_int ldab,
+                               const lapack_complex_double* afb, lapack_int ldafb, const lapack_int* ipiv,
+                               const lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x, lapack_int ldx,
+                               double* ferr, double* berr, lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_sgbrfs_work( int matrix_order, char trans, lapack_int n,
-                                lapack_int kl, lapack_int ku, lapack_int nrhs,
-                                const float* ab, lapack_int ldab,
-                                const float* afb, lapack_int ldafb,
-                                const lapack_int* ipiv, const float* b,
-                                lapack_int ldb, float* x, lapack_int ldx,
-                                float* ferr, float* berr, float* work,
-                                lapack_int* iwork );
-lapack_int LAPACKE_dgbrfs_work( int matrix_order, char trans, lapack_int n,
-                                lapack_int kl, lapack_int ku, lapack_int nrhs,
-                                const double* ab, lapack_int ldab,
-                                const double* afb, lapack_int ldafb,
-                                const lapack_int* ipiv, const double* b,
-                                lapack_int ldb, double* x, lapack_int ldx,
-                                double* ferr, double* berr, double* work,
-                                lapack_int* iwork );
-lapack_int LAPACKE_cgbrfs_work( int matrix_order, char trans, lapack_int n,
-                                lapack_int kl, lapack_int ku, lapack_int nrhs,
-                                const lapack_complex_float* ab, lapack_int ldab,
-                                const lapack_complex_float* afb,
-                                lapack_int ldafb, const lapack_int* ipiv,
-                                const lapack_complex_float* b, lapack_int ldb,
-                                lapack_complex_float* x, lapack_int ldx,
-                                float* ferr, float* berr,
-                                lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_zgbrfs_work( int matrix_order, char trans, lapack_int n,
-                                lapack_int kl, lapack_int ku, lapack_int nrhs,
-                                const lapack_complex_double* ab,
-                                lapack_int ldab,
-                                const lapack_complex_double* afb,
-                                lapack_int ldafb, const lapack_int* ipiv,
-                                const lapack_complex_double* b, lapack_int ldb,
-                                lapack_complex_double* x, lapack_int ldx,
-                                double* ferr, double* berr,
-                                lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_sgbrfsx_work(int matrix_order, char trans, char equed, lapack_int n, lapack_int kl, lapack_int ku,
+                                lapack_int nrhs, const float* ab, lapack_int ldab, const float* afb, lapack_int ldafb,
+                                const lapack_int* ipiv, const float* r, const float* c, const float* b, lapack_int ldb,
+                                float* x, lapack_int ldx, float* rcond, float* berr, lapack_int n_err_bnds,
+                                float* err_bnds_norm, float* err_bnds_comp, lapack_int nparams, float* params,
+                                float* work, lapack_int* iwork);
+lapack_int LAPACKE_dgbrfsx_work(int matrix_order, char trans, char equed, lapack_int n, lapack_int kl, lapack_int ku,
+                                lapack_int nrhs, const double* ab, lapack_int ldab, const double* afb, lapack_int ldafb,
+                                const lapack_int* ipiv, const double* r, const double* c, const double* b,
+                                lapack_int ldb, double* x, lapack_int ldx, double* rcond, double* berr,
+                                lapack_int n_err_bnds, double* err_bnds_norm, double* err_bnds_comp, lapack_int nparams,
+                                double* params, double* work, lapack_int* iwork);
+lapack_int LAPACKE_cgbrfsx_work(int matrix_order, char trans, char equed, lapack_int n, lapack_int kl, lapack_int ku,
+                                lapack_int nrhs, const lapack_complex_float* ab, lapack_int ldab,
+                                const lapack_complex_float* afb, lapack_int ldafb, const lapack_int* ipiv,
+                                const float* r, const float* c, const lapack_complex_float* b, lapack_int ldb,
+                                lapack_complex_float* x, lapack_int ldx, float* rcond, float* berr,
+                                lapack_int n_err_bnds, float* err_bnds_norm, float* err_bnds_comp, lapack_int nparams,
+                                float* params, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zgbrfsx_work(int matrix_order, char trans, char equed, lapack_int n, lapack_int kl, lapack_int ku,
+                                lapack_int nrhs, const lapack_complex_double* ab, lapack_int ldab,
+                                const lapack_complex_double* afb, lapack_int ldafb, const lapack_int* ipiv,
+                                const double* r, const double* c, const lapack_complex_double* b, lapack_int ldb,
+                                lapack_complex_double* x, lapack_int ldx, double* rcond, double* berr,
+                                lapack_int n_err_bnds, double* err_bnds_norm, double* err_bnds_comp, lapack_int nparams,
+                                double* params, lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_sgbrfsx_work( int matrix_order, char trans, char equed,
-                                 lapack_int n, lapack_int kl, lapack_int ku,
-                                 lapack_int nrhs, const float* ab,
-                                 lapack_int ldab, const float* afb,
-                                 lapack_int ldafb, const lapack_int* ipiv,
-                                 const float* r, const float* c, const float* b,
-                                 lapack_int ldb, float* x, lapack_int ldx,
-                                 float* rcond, float* berr,
-                                 lapack_int n_err_bnds, float* err_bnds_norm,
-                                 float* err_bnds_comp, lapack_int nparams,
-                                 float* params, float* work,
-                                 lapack_int* iwork );
-lapack_int LAPACKE_dgbrfsx_work( int matrix_order, char trans, char equed,
-                                 lapack_int n, lapack_int kl, lapack_int ku,
-                                 lapack_int nrhs, const double* ab,
-                                 lapack_int ldab, const double* afb,
-                                 lapack_int ldafb, const lapack_int* ipiv,
-                                 const double* r, const double* c,
-                                 const double* b, lapack_int ldb, double* x,
-                                 lapack_int ldx, double* rcond, double* berr,
-                                 lapack_int n_err_bnds, double* err_bnds_norm,
-                                 double* err_bnds_comp, lapack_int nparams,
-                                 double* params, double* work,
-                                 lapack_int* iwork );
-lapack_int LAPACKE_cgbrfsx_work( int matrix_order, char trans, char equed,
-                                 lapack_int n, lapack_int kl, lapack_int ku,
-                                 lapack_int nrhs,
-                                 const lapack_complex_float* ab,
-                                 lapack_int ldab,
-                                 const lapack_complex_float* afb,
-                                 lapack_int ldafb, const lapack_int* ipiv,
-                                 const float* r, const float* c,
-                                 const lapack_complex_float* b, lapack_int ldb,
-                                 lapack_complex_float* x, lapack_int ldx,
-                                 float* rcond, float* berr,
-                                 lapack_int n_err_bnds, float* err_bnds_norm,
-                                 float* err_bnds_comp, lapack_int nparams,
-                                 float* params, lapack_complex_float* work,
-                                 float* rwork );
-lapack_int LAPACKE_zgbrfsx_work( int matrix_order, char trans, char equed,
-                                 lapack_int n, lapack_int kl, lapack_int ku,
-                                 lapack_int nrhs,
-                                 const lapack_complex_double* ab,
-                                 lapack_int ldab,
-                                 const lapack_complex_double* afb,
-                                 lapack_int ldafb, const lapack_int* ipiv,
-                                 const double* r, const double* c,
-                                 const lapack_complex_double* b, lapack_int ldb,
-                                 lapack_complex_double* x, lapack_int ldx,
-                                 double* rcond, double* berr,
-                                 lapack_int n_err_bnds, double* err_bnds_norm,
-                                 double* err_bnds_comp, lapack_int nparams,
-                                 double* params, lapack_complex_double* work,
-                                 double* rwork );
+lapack_int LAPACKE_sgbsv_work(int matrix_order, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, float* ab,
+                              lapack_int ldab, lapack_int* ipiv, float* b, lapack_int ldb);
+lapack_int LAPACKE_dgbsv_work(int matrix_order, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, double* ab,
+                              lapack_int ldab, lapack_int* ipiv, double* b, lapack_int ldb);
+lapack_int LAPACKE_cgbsv_work(int matrix_order, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs,
+                              lapack_complex_float* ab, lapack_int ldab, lapack_int* ipiv, lapack_complex_float* b,
+                              lapack_int ldb);
+lapack_int LAPACKE_zgbsv_work(int matrix_order, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs,
+                              lapack_complex_double* ab, lapack_int ldab, lapack_int* ipiv, lapack_complex_double* b,
+                              lapack_int ldb);
 
-lapack_int LAPACKE_sgbsv_work( int matrix_order, lapack_int n, lapack_int kl,
-                               lapack_int ku, lapack_int nrhs, float* ab,
-                               lapack_int ldab, lapack_int* ipiv, float* b,
-                               lapack_int ldb );
-lapack_int LAPACKE_dgbsv_work( int matrix_order, lapack_int n, lapack_int kl,
-                               lapack_int ku, lapack_int nrhs, double* ab,
-                               lapack_int ldab, lapack_int* ipiv, double* b,
-                               lapack_int ldb );
-lapack_int LAPACKE_cgbsv_work( int matrix_order, lapack_int n, lapack_int kl,
-                               lapack_int ku, lapack_int nrhs,
-                               lapack_complex_float* ab, lapack_int ldab,
-                               lapack_int* ipiv, lapack_complex_float* b,
-                               lapack_int ldb );
-lapack_int LAPACKE_zgbsv_work( int matrix_order, lapack_int n, lapack_int kl,
-                               lapack_int ku, lapack_int nrhs,
-                               lapack_complex_double* ab, lapack_int ldab,
-                               lapack_int* ipiv, lapack_complex_double* b,
-                               lapack_int ldb );
+lapack_int LAPACKE_sgbsvx_work(int matrix_order, char fact, char trans, lapack_int n, lapack_int kl, lapack_int ku,
+                               lapack_int nrhs, float* ab, lapack_int ldab, float* afb, lapack_int ldafb,
+                               lapack_int* ipiv, char* equed, float* r, float* c, float* b, lapack_int ldb, float* x,
+                               lapack_int ldx, float* rcond, float* ferr, float* berr, float* work, lapack_int* iwork);
+lapack_int LAPACKE_dgbsvx_work(int matrix_order, char fact, char trans, lapack_int n, lapack_int kl, lapack_int ku,
+                               lapack_int nrhs, double* ab, lapack_int ldab, double* afb, lapack_int ldafb,
+                               lapack_int* ipiv, char* equed, double* r, double* c, double* b, lapack_int ldb,
+                               double* x, lapack_int ldx, double* rcond, double* ferr, double* berr, double* work,
+                               lapack_int* iwork);
+lapack_int LAPACKE_cgbsvx_work(int matrix_order, char fact, char trans, lapack_int n, lapack_int kl, lapack_int ku,
+                               lapack_int nrhs, lapack_complex_float* ab, lapack_int ldab, lapack_complex_float* afb,
+                               lapack_int ldafb, lapack_int* ipiv, char* equed, float* r, float* c,
+                               lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x, lapack_int ldx,
+                               float* rcond, float* ferr, float* berr, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zgbsvx_work(int matrix_order, char fact, char trans, lapack_int n, lapack_int kl, lapack_int ku,
+                               lapack_int nrhs, lapack_complex_double* ab, lapack_int ldab, lapack_complex_double* afb,
+                               lapack_int ldafb, lapack_int* ipiv, char* equed, double* r, double* c,
+                               lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x, lapack_int ldx,
+                               double* rcond, double* ferr, double* berr, lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_sgbsvx_work( int matrix_order, char fact, char trans,
-                                lapack_int n, lapack_int kl, lapack_int ku,
-                                lapack_int nrhs, float* ab, lapack_int ldab,
-                                float* afb, lapack_int ldafb, lapack_int* ipiv,
-                                char* equed, float* r, float* c, float* b,
-                                lapack_int ldb, float* x, lapack_int ldx,
-                                float* rcond, float* ferr, float* berr,
-                                float* work, lapack_int* iwork );
-lapack_int LAPACKE_dgbsvx_work( int matrix_order, char fact, char trans,
-                                lapack_int n, lapack_int kl, lapack_int ku,
-                                lapack_int nrhs, double* ab, lapack_int ldab,
-                                double* afb, lapack_int ldafb, lapack_int* ipiv,
-                                char* equed, double* r, double* c, double* b,
-                                lapack_int ldb, double* x, lapack_int ldx,
-                                double* rcond, double* ferr, double* berr,
-                                double* work, lapack_int* iwork );
-lapack_int LAPACKE_cgbsvx_work( int matrix_order, char fact, char trans,
-                                lapack_int n, lapack_int kl, lapack_int ku,
-                                lapack_int nrhs, lapack_complex_float* ab,
-                                lapack_int ldab, lapack_complex_float* afb,
-                                lapack_int ldafb, lapack_int* ipiv, char* equed,
-                                float* r, float* c, lapack_complex_float* b,
-                                lapack_int ldb, lapack_complex_float* x,
-                                lapack_int ldx, float* rcond, float* ferr,
-                                float* berr, lapack_complex_float* work,
-                                float* rwork );
-lapack_int LAPACKE_zgbsvx_work( int matrix_order, char fact, char trans,
-                                lapack_int n, lapack_int kl, lapack_int ku,
-                                lapack_int nrhs, lapack_complex_double* ab,
-                                lapack_int ldab, lapack_complex_double* afb,
-                                lapack_int ldafb, lapack_int* ipiv, char* equed,
-                                double* r, double* c, lapack_complex_double* b,
-                                lapack_int ldb, lapack_complex_double* x,
-                                lapack_int ldx, double* rcond, double* ferr,
-                                double* berr, lapack_complex_double* work,
-                                double* rwork );
+lapack_int LAPACKE_sgbsvxx_work(int matrix_order, char fact, char trans, lapack_int n, lapack_int kl, lapack_int ku,
+                                lapack_int nrhs, float* ab, lapack_int ldab, float* afb, lapack_int ldafb,
+                                lapack_int* ipiv, char* equed, float* r, float* c, float* b, lapack_int ldb, float* x,
+                                lapack_int ldx, float* rcond, float* rpvgrw, float* berr, lapack_int n_err_bnds,
+                                float* err_bnds_norm, float* err_bnds_comp, lapack_int nparams, float* params,
+                                float* work, lapack_int* iwork);
+lapack_int LAPACKE_dgbsvxx_work(int matrix_order, char fact, char trans, lapack_int n, lapack_int kl, lapack_int ku,
+                                lapack_int nrhs, double* ab, lapack_int ldab, double* afb, lapack_int ldafb,
+                                lapack_int* ipiv, char* equed, double* r, double* c, double* b, lapack_int ldb,
+                                double* x, lapack_int ldx, double* rcond, double* rpvgrw, double* berr,
+                                lapack_int n_err_bnds, double* err_bnds_norm, double* err_bnds_comp, lapack_int nparams,
+                                double* params, double* work, lapack_int* iwork);
+lapack_int LAPACKE_cgbsvxx_work(int matrix_order, char fact, char trans, lapack_int n, lapack_int kl, lapack_int ku,
+                                lapack_int nrhs, lapack_complex_float* ab, lapack_int ldab, lapack_complex_float* afb,
+                                lapack_int ldafb, lapack_int* ipiv, char* equed, float* r, float* c,
+                                lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x, lapack_int ldx,
+                                float* rcond, float* rpvgrw, float* berr, lapack_int n_err_bnds, float* err_bnds_norm,
+                                float* err_bnds_comp, lapack_int nparams, float* params, lapack_complex_float* work,
+                                float* rwork);
+lapack_int LAPACKE_zgbsvxx_work(int matrix_order, char fact, char trans, lapack_int n, lapack_int kl, lapack_int ku,
+                                lapack_int nrhs, lapack_complex_double* ab, lapack_int ldab, lapack_complex_double* afb,
+                                lapack_int ldafb, lapack_int* ipiv, char* equed, double* r, double* c,
+                                lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x, lapack_int ldx,
+                                double* rcond, double* rpvgrw, double* berr, lapack_int n_err_bnds,
+                                double* err_bnds_norm, double* err_bnds_comp, lapack_int nparams, double* params,
+                                lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_sgbsvxx_work( int matrix_order, char fact, char trans,
-                                 lapack_int n, lapack_int kl, lapack_int ku,
-                                 lapack_int nrhs, float* ab, lapack_int ldab,
-                                 float* afb, lapack_int ldafb, lapack_int* ipiv,
-                                 char* equed, float* r, float* c, float* b,
-                                 lapack_int ldb, float* x, lapack_int ldx,
-                                 float* rcond, float* rpvgrw, float* berr,
-                                 lapack_int n_err_bnds, float* err_bnds_norm,
-                                 float* err_bnds_comp, lapack_int nparams,
-                                 float* params, float* work,
-                                 lapack_int* iwork );
-lapack_int LAPACKE_dgbsvxx_work( int matrix_order, char fact, char trans,
-                                 lapack_int n, lapack_int kl, lapack_int ku,
-                                 lapack_int nrhs, double* ab, lapack_int ldab,
-                                 double* afb, lapack_int ldafb,
-                                 lapack_int* ipiv, char* equed, double* r,
-                                 double* c, double* b, lapack_int ldb,
-                                 double* x, lapack_int ldx, double* rcond,
-                                 double* rpvgrw, double* berr,
-                                 lapack_int n_err_bnds, double* err_bnds_norm,
-                                 double* err_bnds_comp, lapack_int nparams,
-                                 double* params, double* work,
-                                 lapack_int* iwork );
-lapack_int LAPACKE_cgbsvxx_work( int matrix_order, char fact, char trans,
-                                 lapack_int n, lapack_int kl, lapack_int ku,
-                                 lapack_int nrhs, lapack_complex_float* ab,
-                                 lapack_int ldab, lapack_complex_float* afb,
-                                 lapack_int ldafb, lapack_int* ipiv,
-                                 char* equed, float* r, float* c,
-                                 lapack_complex_float* b, lapack_int ldb,
-                                 lapack_complex_float* x, lapack_int ldx,
-                                 float* rcond, float* rpvgrw, float* berr,
-                                 lapack_int n_err_bnds, float* err_bnds_norm,
-                                 float* err_bnds_comp, lapack_int nparams,
-                                 float* params, lapack_complex_float* work,
-                                 float* rwork );
-lapack_int LAPACKE_zgbsvxx_work( int matrix_order, char fact, char trans,
-                                 lapack_int n, lapack_int kl, lapack_int ku,
-                                 lapack_int nrhs, lapack_complex_double* ab,
-                                 lapack_int ldab, lapack_complex_double* afb,
-                                 lapack_int ldafb, lapack_int* ipiv,
-                                 char* equed, double* r, double* c,
-                                 lapack_complex_double* b, lapack_int ldb,
-                                 lapack_complex_double* x, lapack_int ldx,
-                                 double* rcond, double* rpvgrw, double* berr,
-                                 lapack_int n_err_bnds, double* err_bnds_norm,
-                                 double* err_bnds_comp, lapack_int nparams,
-                                 double* params, lapack_complex_double* work,
-                                 double* rwork );
+lapack_int LAPACKE_sgbtrf_work(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku, float* ab,
+                               lapack_int ldab, lapack_int* ipiv);
+lapack_int LAPACKE_dgbtrf_work(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku, double* ab,
+                               lapack_int ldab, lapack_int* ipiv);
+lapack_int LAPACKE_cgbtrf_work(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku,
+                               lapack_complex_float* ab, lapack_int ldab, lapack_int* ipiv);
+lapack_int LAPACKE_zgbtrf_work(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku,
+                               lapack_complex_double* ab, lapack_int ldab, lapack_int* ipiv);
 
-lapack_int LAPACKE_sgbtrf_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int kl, lapack_int ku, float* ab,
-                                lapack_int ldab, lapack_int* ipiv );
-lapack_int LAPACKE_dgbtrf_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int kl, lapack_int ku, double* ab,
-                                lapack_int ldab, lapack_int* ipiv );
-lapack_int LAPACKE_cgbtrf_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int kl, lapack_int ku,
-                                lapack_complex_float* ab, lapack_int ldab,
-                                lapack_int* ipiv );
-lapack_int LAPACKE_zgbtrf_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int kl, lapack_int ku,
-                                lapack_complex_double* ab, lapack_int ldab,
-                                lapack_int* ipiv );
+lapack_int LAPACKE_sgbtrs_work(int matrix_order, char trans, lapack_int n, lapack_int kl, lapack_int ku,
+                               lapack_int nrhs, const float* ab, lapack_int ldab, const lapack_int* ipiv, float* b,
+                               lapack_int ldb);
+lapack_int LAPACKE_dgbtrs_work(int matrix_order, char trans, lapack_int n, lapack_int kl, lapack_int ku,
+                               lapack_int nrhs, const double* ab, lapack_int ldab, const lapack_int* ipiv, double* b,
+                               lapack_int ldb);
+lapack_int LAPACKE_cgbtrs_work(int matrix_order, char trans, lapack_int n, lapack_int kl, lapack_int ku,
+                               lapack_int nrhs, const lapack_complex_float* ab, lapack_int ldab, const lapack_int* ipiv,
+                               lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zgbtrs_work(int matrix_order, char trans, lapack_int n, lapack_int kl, lapack_int ku,
+                               lapack_int nrhs, const lapack_complex_double* ab, lapack_int ldab,
+                               const lapack_int* ipiv, lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_sgbtrs_work( int matrix_order, char trans, lapack_int n,
-                                lapack_int kl, lapack_int ku, lapack_int nrhs,
-                                const float* ab, lapack_int ldab,
-                                const lapack_int* ipiv, float* b,
-                                lapack_int ldb );
-lapack_int LAPACKE_dgbtrs_work( int matrix_order, char trans, lapack_int n,
-                                lapack_int kl, lapack_int ku, lapack_int nrhs,
-                                const double* ab, lapack_int ldab,
-                                const lapack_int* ipiv, double* b,
-                                lapack_int ldb );
-lapack_int LAPACKE_cgbtrs_work( int matrix_order, char trans, lapack_int n,
-                                lapack_int kl, lapack_int ku, lapack_int nrhs,
-                                const lapack_complex_float* ab, lapack_int ldab,
-                                const lapack_int* ipiv, lapack_complex_float* b,
-                                lapack_int ldb );
-lapack_int LAPACKE_zgbtrs_work( int matrix_order, char trans, lapack_int n,
-                                lapack_int kl, lapack_int ku, lapack_int nrhs,
-                                const lapack_complex_double* ab,
-                                lapack_int ldab, const lapack_int* ipiv,
-                                lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_sgebak_work(int matrix_order, char job, char side, lapack_int n, lapack_int ilo, lapack_int ihi,
+                               const float* scale, lapack_int m, float* v, lapack_int ldv);
+lapack_int LAPACKE_dgebak_work(int matrix_order, char job, char side, lapack_int n, lapack_int ilo, lapack_int ihi,
+                               const double* scale, lapack_int m, double* v, lapack_int ldv);
+lapack_int LAPACKE_cgebak_work(int matrix_order, char job, char side, lapack_int n, lapack_int ilo, lapack_int ihi,
+                               const float* scale, lapack_int m, lapack_complex_float* v, lapack_int ldv);
+lapack_int LAPACKE_zgebak_work(int matrix_order, char job, char side, lapack_int n, lapack_int ilo, lapack_int ihi,
+                               const double* scale, lapack_int m, lapack_complex_double* v, lapack_int ldv);
 
-lapack_int LAPACKE_sgebak_work( int matrix_order, char job, char side,
-                                lapack_int n, lapack_int ilo, lapack_int ihi,
-                                const float* scale, lapack_int m, float* v,
-                                lapack_int ldv );
-lapack_int LAPACKE_dgebak_work( int matrix_order, char job, char side,
-                                lapack_int n, lapack_int ilo, lapack_int ihi,
-                                const double* scale, lapack_int m, double* v,
-                                lapack_int ldv );
-lapack_int LAPACKE_cgebak_work( int matrix_order, char job, char side,
-                                lapack_int n, lapack_int ilo, lapack_int ihi,
-                                const float* scale, lapack_int m,
-                                lapack_complex_float* v, lapack_int ldv );
-lapack_int LAPACKE_zgebak_work( int matrix_order, char job, char side,
-                                lapack_int n, lapack_int ilo, lapack_int ihi,
-                                const double* scale, lapack_int m,
-                                lapack_complex_double* v, lapack_int ldv );
+lapack_int LAPACKE_sgebal_work(int matrix_order, char job, lapack_int n, float* a, lapack_int lda, lapack_int* ilo,
+                               lapack_int* ihi, float* scale);
+lapack_int LAPACKE_dgebal_work(int matrix_order, char job, lapack_int n, double* a, lapack_int lda, lapack_int* ilo,
+                               lapack_int* ihi, double* scale);
+lapack_int LAPACKE_cgebal_work(int matrix_order, char job, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                               lapack_int* ilo, lapack_int* ihi, float* scale);
+lapack_int LAPACKE_zgebal_work(int matrix_order, char job, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                               lapack_int* ilo, lapack_int* ihi, double* scale);
 
-lapack_int LAPACKE_sgebal_work( int matrix_order, char job, lapack_int n,
-                                float* a, lapack_int lda, lapack_int* ilo,
-                                lapack_int* ihi, float* scale );
-lapack_int LAPACKE_dgebal_work( int matrix_order, char job, lapack_int n,
-                                double* a, lapack_int lda, lapack_int* ilo,
-                                lapack_int* ihi, double* scale );
-lapack_int LAPACKE_cgebal_work( int matrix_order, char job, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_int* ilo, lapack_int* ihi,
-                                float* scale );
-lapack_int LAPACKE_zgebal_work( int matrix_order, char job, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_int* ilo, lapack_int* ihi,
-                                double* scale );
+lapack_int LAPACKE_sgebrd_work(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, float* d,
+                               float* e, float* tauq, float* taup, float* work, lapack_int lwork);
+lapack_int LAPACKE_dgebrd_work(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda, double* d,
+                               double* e, double* tauq, double* taup, double* work, lapack_int lwork);
+lapack_int LAPACKE_cgebrd_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                               float* d, float* e, lapack_complex_float* tauq, lapack_complex_float* taup,
+                               lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_zgebrd_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                               double* d, double* e, lapack_complex_double* tauq, lapack_complex_double* taup,
+                               lapack_complex_double* work, lapack_int lwork);
 
-lapack_int LAPACKE_sgebrd_work( int matrix_order, lapack_int m, lapack_int n,
-                                float* a, lapack_int lda, float* d, float* e,
-                                float* tauq, float* taup, float* work,
-                                lapack_int lwork );
-lapack_int LAPACKE_dgebrd_work( int matrix_order, lapack_int m, lapack_int n,
-                                double* a, lapack_int lda, double* d, double* e,
-                                double* tauq, double* taup, double* work,
-                                lapack_int lwork );
-lapack_int LAPACKE_cgebrd_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                float* d, float* e, lapack_complex_float* tauq,
-                                lapack_complex_float* taup,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zgebrd_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                double* d, double* e,
-                                lapack_complex_double* tauq,
-                                lapack_complex_double* taup,
-                                lapack_complex_double* work, lapack_int lwork );
+lapack_int LAPACKE_sgecon_work(int matrix_order, char norm, lapack_int n, const float* a, lapack_int lda, float anorm,
+                               float* rcond, float* work, lapack_int* iwork);
+lapack_int LAPACKE_dgecon_work(int matrix_order, char norm, lapack_int n, const double* a, lapack_int lda, double anorm,
+                               double* rcond, double* work, lapack_int* iwork);
+lapack_int LAPACKE_cgecon_work(int matrix_order, char norm, lapack_int n, const lapack_complex_float* a, lapack_int lda,
+                               float anorm, float* rcond, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zgecon_work(int matrix_order, char norm, lapack_int n, const lapack_complex_double* a,
+                               lapack_int lda, double anorm, double* rcond, lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_sgecon_work( int matrix_order, char norm, lapack_int n,
-                                const float* a, lapack_int lda, float anorm,
-                                float* rcond, float* work, lapack_int* iwork );
-lapack_int LAPACKE_dgecon_work( int matrix_order, char norm, lapack_int n,
-                                const double* a, lapack_int lda, double anorm,
-                                double* rcond, double* work,
-                                lapack_int* iwork );
-lapack_int LAPACKE_cgecon_work( int matrix_order, char norm, lapack_int n,
-                                const lapack_complex_float* a, lapack_int lda,
-                                float anorm, float* rcond,
-                                lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_zgecon_work( int matrix_order, char norm, lapack_int n,
-                                const lapack_complex_double* a, lapack_int lda,
-                                double anorm, double* rcond,
-                                lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_sgeequ_work(int matrix_order, lapack_int m, lapack_int n, const float* a, lapack_int lda, float* r,
+                               float* c, float* rowcnd, float* colcnd, float* amax);
+lapack_int LAPACKE_dgeequ_work(int matrix_order, lapack_int m, lapack_int n, const double* a, lapack_int lda, double* r,
+                               double* c, double* rowcnd, double* colcnd, double* amax);
+lapack_int LAPACKE_cgeequ_work(int matrix_order, lapack_int m, lapack_int n, const lapack_complex_float* a,
+                               lapack_int lda, float* r, float* c, float* rowcnd, float* colcnd, float* amax);
+lapack_int LAPACKE_zgeequ_work(int matrix_order, lapack_int m, lapack_int n, const lapack_complex_double* a,
+                               lapack_int lda, double* r, double* c, double* rowcnd, double* colcnd, double* amax);
 
-lapack_int LAPACKE_sgeequ_work( int matrix_order, lapack_int m, lapack_int n,
-                                const float* a, lapack_int lda, float* r,
-                                float* c, float* rowcnd, float* colcnd,
-                                float* amax );
-lapack_int LAPACKE_dgeequ_work( int matrix_order, lapack_int m, lapack_int n,
-                                const double* a, lapack_int lda, double* r,
-                                double* c, double* rowcnd, double* colcnd,
-                                double* amax );
-lapack_int LAPACKE_cgeequ_work( int matrix_order, lapack_int m, lapack_int n,
-                                const lapack_complex_float* a, lapack_int lda,
-                                float* r, float* c, float* rowcnd,
-                                float* colcnd, float* amax );
-lapack_int LAPACKE_zgeequ_work( int matrix_order, lapack_int m, lapack_int n,
-                                const lapack_complex_double* a, lapack_int lda,
-                                double* r, double* c, double* rowcnd,
-                                double* colcnd, double* amax );
+lapack_int LAPACKE_sgeequb_work(int matrix_order, lapack_int m, lapack_int n, const float* a, lapack_int lda, float* r,
+                                float* c, float* rowcnd, float* colcnd, float* amax);
+lapack_int LAPACKE_dgeequb_work(int matrix_order, lapack_int m, lapack_int n, const double* a, lapack_int lda,
+                                double* r, double* c, double* rowcnd, double* colcnd, double* amax);
+lapack_int LAPACKE_cgeequb_work(int matrix_order, lapack_int m, lapack_int n, const lapack_complex_float* a,
+                                lapack_int lda, float* r, float* c, float* rowcnd, float* colcnd, float* amax);
+lapack_int LAPACKE_zgeequb_work(int matrix_order, lapack_int m, lapack_int n, const lapack_complex_double* a,
+                                lapack_int lda, double* r, double* c, double* rowcnd, double* colcnd, double* amax);
 
-lapack_int LAPACKE_sgeequb_work( int matrix_order, lapack_int m, lapack_int n,
-                                 const float* a, lapack_int lda, float* r,
-                                 float* c, float* rowcnd, float* colcnd,
-                                 float* amax );
-lapack_int LAPACKE_dgeequb_work( int matrix_order, lapack_int m, lapack_int n,
-                                 const double* a, lapack_int lda, double* r,
-                                 double* c, double* rowcnd, double* colcnd,
-                                 double* amax );
-lapack_int LAPACKE_cgeequb_work( int matrix_order, lapack_int m, lapack_int n,
-                                 const lapack_complex_float* a, lapack_int lda,
-                                 float* r, float* c, float* rowcnd,
-                                 float* colcnd, float* amax );
-lapack_int LAPACKE_zgeequb_work( int matrix_order, lapack_int m, lapack_int n,
-                                 const lapack_complex_double* a, lapack_int lda,
-                                 double* r, double* c, double* rowcnd,
-                                 double* colcnd, double* amax );
+lapack_int LAPACKE_sgees_work(int matrix_order, char jobvs, char sort, LAPACK_S_SELECT2 select, lapack_int n, float* a,
+                              lapack_int lda, lapack_int* sdim, float* wr, float* wi, float* vs, lapack_int ldvs,
+                              float* work, lapack_int lwork, lapack_logical* bwork);
+lapack_int LAPACKE_dgees_work(int matrix_order, char jobvs, char sort, LAPACK_D_SELECT2 select, lapack_int n, double* a,
+                              lapack_int lda, lapack_int* sdim, double* wr, double* wi, double* vs, lapack_int ldvs,
+                              double* work, lapack_int lwork, lapack_logical* bwork);
+lapack_int LAPACKE_cgees_work(int matrix_order, char jobvs, char sort, LAPACK_C_SELECT1 select, lapack_int n,
+                              lapack_complex_float* a, lapack_int lda, lapack_int* sdim, lapack_complex_float* w,
+                              lapack_complex_float* vs, lapack_int ldvs, lapack_complex_float* work, lapack_int lwork,
+                              float* rwork, lapack_logical* bwork);
+lapack_int LAPACKE_zgees_work(int matrix_order, char jobvs, char sort, LAPACK_Z_SELECT1 select, lapack_int n,
+                              lapack_complex_double* a, lapack_int lda, lapack_int* sdim, lapack_complex_double* w,
+                              lapack_complex_double* vs, lapack_int ldvs, lapack_complex_double* work, lapack_int lwork,
+                              double* rwork, lapack_logical* bwork);
 
-lapack_int LAPACKE_sgees_work( int matrix_order, char jobvs, char sort,
-                               LAPACK_S_SELECT2 select, lapack_int n, float* a,
-                               lapack_int lda, lapack_int* sdim, float* wr,
-                               float* wi, float* vs, lapack_int ldvs,
-                               float* work, lapack_int lwork,
-                               lapack_logical* bwork );
-lapack_int LAPACKE_dgees_work( int matrix_order, char jobvs, char sort,
-                               LAPACK_D_SELECT2 select, lapack_int n, double* a,
-                               lapack_int lda, lapack_int* sdim, double* wr,
-                               double* wi, double* vs, lapack_int ldvs,
-                               double* work, lapack_int lwork,
-                               lapack_logical* bwork );
-lapack_int LAPACKE_cgees_work( int matrix_order, char jobvs, char sort,
-                               LAPACK_C_SELECT1 select, lapack_int n,
-                               lapack_complex_float* a, lapack_int lda,
-                               lapack_int* sdim, lapack_complex_float* w,
-                               lapack_complex_float* vs, lapack_int ldvs,
-                               lapack_complex_float* work, lapack_int lwork,
-                               float* rwork, lapack_logical* bwork );
-lapack_int LAPACKE_zgees_work( int matrix_order, char jobvs, char sort,
-                               LAPACK_Z_SELECT1 select, lapack_int n,
-                               lapack_complex_double* a, lapack_int lda,
-                               lapack_int* sdim, lapack_complex_double* w,
-                               lapack_complex_double* vs, lapack_int ldvs,
-                               lapack_complex_double* work, lapack_int lwork,
-                               double* rwork, lapack_logical* bwork );
+lapack_int LAPACKE_sgeesx_work(int matrix_order, char jobvs, char sort, LAPACK_S_SELECT2 select, char sense,
+                               lapack_int n, float* a, lapack_int lda, lapack_int* sdim, float* wr, float* wi,
+                               float* vs, lapack_int ldvs, float* rconde, float* rcondv, float* work, lapack_int lwork,
+                               lapack_int* iwork, lapack_int liwork, lapack_logical* bwork);
+lapack_int LAPACKE_dgeesx_work(int matrix_order, char jobvs, char sort, LAPACK_D_SELECT2 select, char sense,
+                               lapack_int n, double* a, lapack_int lda, lapack_int* sdim, double* wr, double* wi,
+                               double* vs, lapack_int ldvs, double* rconde, double* rcondv, double* work,
+                               lapack_int lwork, lapack_int* iwork, lapack_int liwork, lapack_logical* bwork);
+lapack_int LAPACKE_cgeesx_work(int matrix_order, char jobvs, char sort, LAPACK_C_SELECT1 select, char sense,
+                               lapack_int n, lapack_complex_float* a, lapack_int lda, lapack_int* sdim,
+                               lapack_complex_float* w, lapack_complex_float* vs, lapack_int ldvs, float* rconde,
+                               float* rcondv, lapack_complex_float* work, lapack_int lwork, float* rwork,
+                               lapack_logical* bwork);
+lapack_int LAPACKE_zgeesx_work(int matrix_order, char jobvs, char sort, LAPACK_Z_SELECT1 select, char sense,
+                               lapack_int n, lapack_complex_double* a, lapack_int lda, lapack_int* sdim,
+                               lapack_complex_double* w, lapack_complex_double* vs, lapack_int ldvs, double* rconde,
+                               double* rcondv, lapack_complex_double* work, lapack_int lwork, double* rwork,
+                               lapack_logical* bwork);
 
-lapack_int LAPACKE_sgeesx_work( int matrix_order, char jobvs, char sort,
-                                LAPACK_S_SELECT2 select, char sense,
-                                lapack_int n, float* a, lapack_int lda,
-                                lapack_int* sdim, float* wr, float* wi,
-                                float* vs, lapack_int ldvs, float* rconde,
-                                float* rcondv, float* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int liwork,
-                                lapack_logical* bwork );
-lapack_int LAPACKE_dgeesx_work( int matrix_order, char jobvs, char sort,
-                                LAPACK_D_SELECT2 select, char sense,
-                                lapack_int n, double* a, lapack_int lda,
-                                lapack_int* sdim, double* wr, double* wi,
-                                double* vs, lapack_int ldvs, double* rconde,
-                                double* rcondv, double* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int liwork,
-                                lapack_logical* bwork );
-lapack_int LAPACKE_cgeesx_work( int matrix_order, char jobvs, char sort,
-                                LAPACK_C_SELECT1 select, char sense,
-                                lapack_int n, lapack_complex_float* a,
-                                lapack_int lda, lapack_int* sdim,
-                                lapack_complex_float* w,
-                                lapack_complex_float* vs, lapack_int ldvs,
-                                float* rconde, float* rcondv,
-                                lapack_complex_float* work, lapack_int lwork,
-                                float* rwork, lapack_logical* bwork );
-lapack_int LAPACKE_zgeesx_work( int matrix_order, char jobvs, char sort,
-                                LAPACK_Z_SELECT1 select, char sense,
-                                lapack_int n, lapack_complex_double* a,
-                                lapack_int lda, lapack_int* sdim,
-                                lapack_complex_double* w,
-                                lapack_complex_double* vs, lapack_int ldvs,
-                                double* rconde, double* rcondv,
-                                lapack_complex_double* work, lapack_int lwork,
-                                double* rwork, lapack_logical* bwork );
+lapack_int LAPACKE_sgeev_work(int matrix_order, char jobvl, char jobvr, lapack_int n, float* a, lapack_int lda,
+                              float* wr, float* wi, float* vl, lapack_int ldvl, float* vr, lapack_int ldvr, float* work,
+                              lapack_int lwork);
+lapack_int LAPACKE_dgeev_work(int matrix_order, char jobvl, char jobvr, lapack_int n, double* a, lapack_int lda,
+                              double* wr, double* wi, double* vl, lapack_int ldvl, double* vr, lapack_int ldvr,
+                              double* work, lapack_int lwork);
+lapack_int LAPACKE_cgeev_work(int matrix_order, char jobvl, char jobvr, lapack_int n, lapack_complex_float* a,
+                              lapack_int lda, lapack_complex_float* w, lapack_complex_float* vl, lapack_int ldvl,
+                              lapack_complex_float* vr, lapack_int ldvr, lapack_complex_float* work, lapack_int lwork,
+                              float* rwork);
+lapack_int LAPACKE_zgeev_work(int matrix_order, char jobvl, char jobvr, lapack_int n, lapack_complex_double* a,
+                              lapack_int lda, lapack_complex_double* w, lapack_complex_double* vl, lapack_int ldvl,
+                              lapack_complex_double* vr, lapack_int ldvr, lapack_complex_double* work, lapack_int lwork,
+                              double* rwork);
 
-lapack_int LAPACKE_sgeev_work( int matrix_order, char jobvl, char jobvr,
-                               lapack_int n, float* a, lapack_int lda,
-                               float* wr, float* wi, float* vl, lapack_int ldvl,
-                               float* vr, lapack_int ldvr, float* work,
-                               lapack_int lwork );
-lapack_int LAPACKE_dgeev_work( int matrix_order, char jobvl, char jobvr,
-                               lapack_int n, double* a, lapack_int lda,
-                               double* wr, double* wi, double* vl,
-                               lapack_int ldvl, double* vr, lapack_int ldvr,
-                               double* work, lapack_int lwork );
-lapack_int LAPACKE_cgeev_work( int matrix_order, char jobvl, char jobvr,
-                               lapack_int n, lapack_complex_float* a,
-                               lapack_int lda, lapack_complex_float* w,
-                               lapack_complex_float* vl, lapack_int ldvl,
-                               lapack_complex_float* vr, lapack_int ldvr,
-                               lapack_complex_float* work, lapack_int lwork,
-                               float* rwork );
-lapack_int LAPACKE_zgeev_work( int matrix_order, char jobvl, char jobvr,
-                               lapack_int n, lapack_complex_double* a,
-                               lapack_int lda, lapack_complex_double* w,
-                               lapack_complex_double* vl, lapack_int ldvl,
-                               lapack_complex_double* vr, lapack_int ldvr,
-                               lapack_complex_double* work, lapack_int lwork,
-                               double* rwork );
+lapack_int LAPACKE_sgeevx_work(int matrix_order, char balanc, char jobvl, char jobvr, char sense, lapack_int n,
+                               float* a, lapack_int lda, float* wr, float* wi, float* vl, lapack_int ldvl, float* vr,
+                               lapack_int ldvr, lapack_int* ilo, lapack_int* ihi, float* scale, float* abnrm,
+                               float* rconde, float* rcondv, float* work, lapack_int lwork, lapack_int* iwork);
+lapack_int LAPACKE_dgeevx_work(int matrix_order, char balanc, char jobvl, char jobvr, char sense, lapack_int n,
+                               double* a, lapack_int lda, double* wr, double* wi, double* vl, lapack_int ldvl,
+                               double* vr, lapack_int ldvr, lapack_int* ilo, lapack_int* ihi, double* scale,
+                               double* abnrm, double* rconde, double* rcondv, double* work, lapack_int lwork,
+                               lapack_int* iwork);
+lapack_int LAPACKE_cgeevx_work(int matrix_order, char balanc, char jobvl, char jobvr, char sense, lapack_int n,
+                               lapack_complex_float* a, lapack_int lda, lapack_complex_float* w,
+                               lapack_complex_float* vl, lapack_int ldvl, lapack_complex_float* vr, lapack_int ldvr,
+                               lapack_int* ilo, lapack_int* ihi, float* scale, float* abnrm, float* rconde,
+                               float* rcondv, lapack_complex_float* work, lapack_int lwork, float* rwork);
+lapack_int LAPACKE_zgeevx_work(int matrix_order, char balanc, char jobvl, char jobvr, char sense, lapack_int n,
+                               lapack_complex_double* a, lapack_int lda, lapack_complex_double* w,
+                               lapack_complex_double* vl, lapack_int ldvl, lapack_complex_double* vr, lapack_int ldvr,
+                               lapack_int* ilo, lapack_int* ihi, double* scale, double* abnrm, double* rconde,
+                               double* rcondv, lapack_complex_double* work, lapack_int lwork, double* rwork);
 
-lapack_int LAPACKE_sgeevx_work( int matrix_order, char balanc, char jobvl,
-                                char jobvr, char sense, lapack_int n, float* a,
-                                lapack_int lda, float* wr, float* wi, float* vl,
-                                lapack_int ldvl, float* vr, lapack_int ldvr,
-                                lapack_int* ilo, lapack_int* ihi, float* scale,
-                                float* abnrm, float* rconde, float* rcondv,
-                                float* work, lapack_int lwork,
-                                lapack_int* iwork );
-lapack_int LAPACKE_dgeevx_work( int matrix_order, char balanc, char jobvl,
-                                char jobvr, char sense, lapack_int n, double* a,
-                                lapack_int lda, double* wr, double* wi,
-                                double* vl, lapack_int ldvl, double* vr,
-                                lapack_int ldvr, lapack_int* ilo,
-                                lapack_int* ihi, double* scale, double* abnrm,
-                                double* rconde, double* rcondv, double* work,
-                                lapack_int lwork, lapack_int* iwork );
-lapack_int LAPACKE_cgeevx_work( int matrix_order, char balanc, char jobvl,
-                                char jobvr, char sense, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_complex_float* w,
-                                lapack_complex_float* vl, lapack_int ldvl,
-                                lapack_complex_float* vr, lapack_int ldvr,
-                                lapack_int* ilo, lapack_int* ihi, float* scale,
-                                float* abnrm, float* rconde, float* rcondv,
-                                lapack_complex_float* work, lapack_int lwork,
-                                float* rwork );
-lapack_int LAPACKE_zgeevx_work( int matrix_order, char balanc, char jobvl,
-                                char jobvr, char sense, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_complex_double* w,
-                                lapack_complex_double* vl, lapack_int ldvl,
-                                lapack_complex_double* vr, lapack_int ldvr,
-                                lapack_int* ilo, lapack_int* ihi, double* scale,
-                                double* abnrm, double* rconde, double* rcondv,
-                                lapack_complex_double* work, lapack_int lwork,
-                                double* rwork );
+lapack_int LAPACKE_sgehrd_work(int matrix_order, lapack_int n, lapack_int ilo, lapack_int ihi, float* a, lapack_int lda,
+                               float* tau, float* work, lapack_int lwork);
+lapack_int LAPACKE_dgehrd_work(int matrix_order, lapack_int n, lapack_int ilo, lapack_int ihi, double* a,
+                               lapack_int lda, double* tau, double* work, lapack_int lwork);
+lapack_int LAPACKE_cgehrd_work(int matrix_order, lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_float* a,
+                               lapack_int lda, lapack_complex_float* tau, lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_zgehrd_work(int matrix_order, lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_double* a,
+                               lapack_int lda, lapack_complex_double* tau, lapack_complex_double* work,
+                               lapack_int lwork);
 
-lapack_int LAPACKE_sgehrd_work( int matrix_order, lapack_int n, lapack_int ilo,
-                                lapack_int ihi, float* a, lapack_int lda,
-                                float* tau, float* work, lapack_int lwork );
-lapack_int LAPACKE_dgehrd_work( int matrix_order, lapack_int n, lapack_int ilo,
-                                lapack_int ihi, double* a, lapack_int lda,
-                                double* tau, double* work, lapack_int lwork );
-lapack_int LAPACKE_cgehrd_work( int matrix_order, lapack_int n, lapack_int ilo,
-                                lapack_int ihi, lapack_complex_float* a,
-                                lapack_int lda, lapack_complex_float* tau,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zgehrd_work( int matrix_order, lapack_int n, lapack_int ilo,
-                                lapack_int ihi, lapack_complex_double* a,
-                                lapack_int lda, lapack_complex_double* tau,
-                                lapack_complex_double* work, lapack_int lwork );
+lapack_int LAPACKE_sgejsv_work(int matrix_order, char joba, char jobu, char jobv, char jobr, char jobt, char jobp,
+                               lapack_int m, lapack_int n, float* a, lapack_int lda, float* sva, float* u,
+                               lapack_int ldu, float* v, lapack_int ldv, float* work, lapack_int lwork,
+                               lapack_int* iwork);
+lapack_int LAPACKE_dgejsv_work(int matrix_order, char joba, char jobu, char jobv, char jobr, char jobt, char jobp,
+                               lapack_int m, lapack_int n, double* a, lapack_int lda, double* sva, double* u,
+                               lapack_int ldu, double* v, lapack_int ldv, double* work, lapack_int lwork,
+                               lapack_int* iwork);
 
-lapack_int LAPACKE_sgejsv_work( int matrix_order, char joba, char jobu,
-                                char jobv, char jobr, char jobt, char jobp,
-                                lapack_int m, lapack_int n, float* a,
-                                lapack_int lda, float* sva, float* u,
-                                lapack_int ldu, float* v, lapack_int ldv,
-                                float* work, lapack_int lwork,
-                                lapack_int* iwork );
-lapack_int LAPACKE_dgejsv_work( int matrix_order, char joba, char jobu,
-                                char jobv, char jobr, char jobt, char jobp,
-                                lapack_int m, lapack_int n, double* a,
-                                lapack_int lda, double* sva, double* u,
-                                lapack_int ldu, double* v, lapack_int ldv,
-                                double* work, lapack_int lwork,
-                                lapack_int* iwork );
+lapack_int LAPACKE_sgelq2_work(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, float* tau,
+                               float* work);
+lapack_int LAPACKE_dgelq2_work(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda, double* tau,
+                               double* work);
+lapack_int LAPACKE_cgelq2_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                               lapack_complex_float* tau, lapack_complex_float* work);
+lapack_int LAPACKE_zgelq2_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                               lapack_complex_double* tau, lapack_complex_double* work);
 
-lapack_int LAPACKE_sgelq2_work( int matrix_order, lapack_int m, lapack_int n,
-                                float* a, lapack_int lda, float* tau,
-                                float* work );
-lapack_int LAPACKE_dgelq2_work( int matrix_order, lapack_int m, lapack_int n,
-                                double* a, lapack_int lda, double* tau,
-                                double* work );
-lapack_int LAPACKE_cgelq2_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_complex_float* tau,
-                                lapack_complex_float* work );
-lapack_int LAPACKE_zgelq2_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_complex_double* tau,
-                                lapack_complex_double* work );
+lapack_int LAPACKE_sgelqf_work(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, float* tau,
+                               float* work, lapack_int lwork);
+lapack_int LAPACKE_dgelqf_work(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda, double* tau,
+                               double* work, lapack_int lwork);
+lapack_int LAPACKE_cgelqf_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                               lapack_complex_float* tau, lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_zgelqf_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                               lapack_complex_double* tau, lapack_complex_double* work, lapack_int lwork);
 
-lapack_int LAPACKE_sgelqf_work( int matrix_order, lapack_int m, lapack_int n,
-                                float* a, lapack_int lda, float* tau,
-                                float* work, lapack_int lwork );
-lapack_int LAPACKE_dgelqf_work( int matrix_order, lapack_int m, lapack_int n,
-                                double* a, lapack_int lda, double* tau,
-                                double* work, lapack_int lwork );
-lapack_int LAPACKE_cgelqf_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_complex_float* tau,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zgelqf_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_complex_double* tau,
-                                lapack_complex_double* work, lapack_int lwork );
+lapack_int LAPACKE_sgels_work(int matrix_order, char trans, lapack_int m, lapack_int n, lapack_int nrhs, float* a,
+                              lapack_int lda, float* b, lapack_int ldb, float* work, lapack_int lwork);
+lapack_int LAPACKE_dgels_work(int matrix_order, char trans, lapack_int m, lapack_int n, lapack_int nrhs, double* a,
+                              lapack_int lda, double* b, lapack_int ldb, double* work, lapack_int lwork);
+lapack_int LAPACKE_cgels_work(int matrix_order, char trans, lapack_int m, lapack_int n, lapack_int nrhs,
+                              lapack_complex_float* a, lapack_int lda, lapack_complex_float* b, lapack_int ldb,
+                              lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_zgels_work(int matrix_order, char trans, lapack_int m, lapack_int n, lapack_int nrhs,
+                              lapack_complex_double* a, lapack_int lda, lapack_complex_double* b, lapack_int ldb,
+                              lapack_complex_double* work, lapack_int lwork);
 
-lapack_int LAPACKE_sgels_work( int matrix_order, char trans, lapack_int m,
-                               lapack_int n, lapack_int nrhs, float* a,
-                               lapack_int lda, float* b, lapack_int ldb,
-                               float* work, lapack_int lwork );
-lapack_int LAPACKE_dgels_work( int matrix_order, char trans, lapack_int m,
-                               lapack_int n, lapack_int nrhs, double* a,
-                               lapack_int lda, double* b, lapack_int ldb,
-                               double* work, lapack_int lwork );
-lapack_int LAPACKE_cgels_work( int matrix_order, char trans, lapack_int m,
-                               lapack_int n, lapack_int nrhs,
-                               lapack_complex_float* a, lapack_int lda,
-                               lapack_complex_float* b, lapack_int ldb,
-                               lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zgels_work( int matrix_order, char trans, lapack_int m,
-                               lapack_int n, lapack_int nrhs,
-                               lapack_complex_double* a, lapack_int lda,
-                               lapack_complex_double* b, lapack_int ldb,
-                               lapack_complex_double* work, lapack_int lwork );
+lapack_int LAPACKE_sgelsd_work(int matrix_order, lapack_int m, lapack_int n, lapack_int nrhs, float* a, lapack_int lda,
+                               float* b, lapack_int ldb, float* s, float rcond, lapack_int* rank, float* work,
+                               lapack_int lwork, lapack_int* iwork);
+lapack_int LAPACKE_dgelsd_work(int matrix_order, lapack_int m, lapack_int n, lapack_int nrhs, double* a, lapack_int lda,
+                               double* b, lapack_int ldb, double* s, double rcond, lapack_int* rank, double* work,
+                               lapack_int lwork, lapack_int* iwork);
+lapack_int LAPACKE_cgelsd_work(int matrix_order, lapack_int m, lapack_int n, lapack_int nrhs, lapack_complex_float* a,
+                               lapack_int lda, lapack_complex_float* b, lapack_int ldb, float* s, float rcond,
+                               lapack_int* rank, lapack_complex_float* work, lapack_int lwork, float* rwork,
+                               lapack_int* iwork);
+lapack_int LAPACKE_zgelsd_work(int matrix_order, lapack_int m, lapack_int n, lapack_int nrhs, lapack_complex_double* a,
+                               lapack_int lda, lapack_complex_double* b, lapack_int ldb, double* s, double rcond,
+                               lapack_int* rank, lapack_complex_double* work, lapack_int lwork, double* rwork,
+                               lapack_int* iwork);
 
-lapack_int LAPACKE_sgelsd_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int nrhs, float* a, lapack_int lda,
-                                float* b, lapack_int ldb, float* s, float rcond,
-                                lapack_int* rank, float* work, lapack_int lwork,
-                                lapack_int* iwork );
-lapack_int LAPACKE_dgelsd_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int nrhs, double* a, lapack_int lda,
-                                double* b, lapack_int ldb, double* s,
-                                double rcond, lapack_int* rank, double* work,
-                                lapack_int lwork, lapack_int* iwork );
-lapack_int LAPACKE_cgelsd_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int nrhs, lapack_complex_float* a,
-                                lapack_int lda, lapack_complex_float* b,
-                                lapack_int ldb, float* s, float rcond,
-                                lapack_int* rank, lapack_complex_float* work,
-                                lapack_int lwork, float* rwork,
-                                lapack_int* iwork );
-lapack_int LAPACKE_zgelsd_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int nrhs, lapack_complex_double* a,
-                                lapack_int lda, lapack_complex_double* b,
-                                lapack_int ldb, double* s, double rcond,
-                                lapack_int* rank, lapack_complex_double* work,
-                                lapack_int lwork, double* rwork,
-                                lapack_int* iwork );
+lapack_int LAPACKE_sgelss_work(int matrix_order, lapack_int m, lapack_int n, lapack_int nrhs, float* a, lapack_int lda,
+                               float* b, lapack_int ldb, float* s, float rcond, lapack_int* rank, float* work,
+                               lapack_int lwork);
+lapack_int LAPACKE_dgelss_work(int matrix_order, lapack_int m, lapack_int n, lapack_int nrhs, double* a, lapack_int lda,
+                               double* b, lapack_int ldb, double* s, double rcond, lapack_int* rank, double* work,
+                               lapack_int lwork);
+lapack_int LAPACKE_cgelss_work(int matrix_order, lapack_int m, lapack_int n, lapack_int nrhs, lapack_complex_float* a,
+                               lapack_int lda, lapack_complex_float* b, lapack_int ldb, float* s, float rcond,
+                               lapack_int* rank, lapack_complex_float* work, lapack_int lwork, float* rwork);
+lapack_int LAPACKE_zgelss_work(int matrix_order, lapack_int m, lapack_int n, lapack_int nrhs, lapack_complex_double* a,
+                               lapack_int lda, lapack_complex_double* b, lapack_int ldb, double* s, double rcond,
+                               lapack_int* rank, lapack_complex_double* work, lapack_int lwork, double* rwork);
 
-lapack_int LAPACKE_sgelss_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int nrhs, float* a, lapack_int lda,
-                                float* b, lapack_int ldb, float* s, float rcond,
-                                lapack_int* rank, float* work,
-                                lapack_int lwork );
-lapack_int LAPACKE_dgelss_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int nrhs, double* a, lapack_int lda,
-                                double* b, lapack_int ldb, double* s,
-                                double rcond, lapack_int* rank, double* work,
-                                lapack_int lwork );
-lapack_int LAPACKE_cgelss_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int nrhs, lapack_complex_float* a,
-                                lapack_int lda, lapack_complex_float* b,
-                                lapack_int ldb, float* s, float rcond,
-                                lapack_int* rank, lapack_complex_float* work,
-                                lapack_int lwork, float* rwork );
-lapack_int LAPACKE_zgelss_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int nrhs, lapack_complex_double* a,
-                                lapack_int lda, lapack_complex_double* b,
-                                lapack_int ldb, double* s, double rcond,
-                                lapack_int* rank, lapack_complex_double* work,
-                                lapack_int lwork, double* rwork );
+lapack_int LAPACKE_sgelsy_work(int matrix_order, lapack_int m, lapack_int n, lapack_int nrhs, float* a, lapack_int lda,
+                               float* b, lapack_int ldb, lapack_int* jpvt, float rcond, lapack_int* rank, float* work,
+                               lapack_int lwork);
+lapack_int LAPACKE_dgelsy_work(int matrix_order, lapack_int m, lapack_int n, lapack_int nrhs, double* a, lapack_int lda,
+                               double* b, lapack_int ldb, lapack_int* jpvt, double rcond, lapack_int* rank,
+                               double* work, lapack_int lwork);
+lapack_int LAPACKE_cgelsy_work(int matrix_order, lapack_int m, lapack_int n, lapack_int nrhs, lapack_complex_float* a,
+                               lapack_int lda, lapack_complex_float* b, lapack_int ldb, lapack_int* jpvt, float rcond,
+                               lapack_int* rank, lapack_complex_float* work, lapack_int lwork, float* rwork);
+lapack_int LAPACKE_zgelsy_work(int matrix_order, lapack_int m, lapack_int n, lapack_int nrhs, lapack_complex_double* a,
+                               lapack_int lda, lapack_complex_double* b, lapack_int ldb, lapack_int* jpvt, double rcond,
+                               lapack_int* rank, lapack_complex_double* work, lapack_int lwork, double* rwork);
 
-lapack_int LAPACKE_sgelsy_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int nrhs, float* a, lapack_int lda,
-                                float* b, lapack_int ldb, lapack_int* jpvt,
-                                float rcond, lapack_int* rank, float* work,
-                                lapack_int lwork );
-lapack_int LAPACKE_dgelsy_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int nrhs, double* a, lapack_int lda,
-                                double* b, lapack_int ldb, lapack_int* jpvt,
-                                double rcond, lapack_int* rank, double* work,
-                                lapack_int lwork );
-lapack_int LAPACKE_cgelsy_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int nrhs, lapack_complex_float* a,
-                                lapack_int lda, lapack_complex_float* b,
-                                lapack_int ldb, lapack_int* jpvt, float rcond,
-                                lapack_int* rank, lapack_complex_float* work,
-                                lapack_int lwork, float* rwork );
-lapack_int LAPACKE_zgelsy_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int nrhs, lapack_complex_double* a,
-                                lapack_int lda, lapack_complex_double* b,
-                                lapack_int ldb, lapack_int* jpvt, double rcond,
-                                lapack_int* rank, lapack_complex_double* work,
-                                lapack_int lwork, double* rwork );
+lapack_int LAPACKE_sgeqlf_work(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, float* tau,
+                               float* work, lapack_int lwork);
+lapack_int LAPACKE_dgeqlf_work(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda, double* tau,
+                               double* work, lapack_int lwork);
+lapack_int LAPACKE_cgeqlf_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                               lapack_complex_float* tau, lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_zgeqlf_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                               lapack_complex_double* tau, lapack_complex_double* work, lapack_int lwork);
 
-lapack_int LAPACKE_sgeqlf_work( int matrix_order, lapack_int m, lapack_int n,
-                                float* a, lapack_int lda, float* tau,
-                                float* work, lapack_int lwork );
-lapack_int LAPACKE_dgeqlf_work( int matrix_order, lapack_int m, lapack_int n,
-                                double* a, lapack_int lda, double* tau,
-                                double* work, lapack_int lwork );
-lapack_int LAPACKE_cgeqlf_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_complex_float* tau,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zgeqlf_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_complex_double* tau,
-                                lapack_complex_double* work, lapack_int lwork );
+lapack_int LAPACKE_sgeqp3_work(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, lapack_int* jpvt,
+                               float* tau, float* work, lapack_int lwork);
+lapack_int LAPACKE_dgeqp3_work(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda,
+                               lapack_int* jpvt, double* tau, double* work, lapack_int lwork);
+lapack_int LAPACKE_cgeqp3_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                               lapack_int* jpvt, lapack_complex_float* tau, lapack_complex_float* work,
+                               lapack_int lwork, float* rwork);
+lapack_int LAPACKE_zgeqp3_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                               lapack_int* jpvt, lapack_complex_double* tau, lapack_complex_double* work,
+                               lapack_int lwork, double* rwork);
 
-lapack_int LAPACKE_sgeqp3_work( int matrix_order, lapack_int m, lapack_int n,
-                                float* a, lapack_int lda, lapack_int* jpvt,
-                                float* tau, float* work, lapack_int lwork );
-lapack_int LAPACKE_dgeqp3_work( int matrix_order, lapack_int m, lapack_int n,
-                                double* a, lapack_int lda, lapack_int* jpvt,
-                                double* tau, double* work, lapack_int lwork );
-lapack_int LAPACKE_cgeqp3_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_int* jpvt, lapack_complex_float* tau,
-                                lapack_complex_float* work, lapack_int lwork,
-                                float* rwork );
-lapack_int LAPACKE_zgeqp3_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_int* jpvt, lapack_complex_double* tau,
-                                lapack_complex_double* work, lapack_int lwork,
-                                double* rwork );
+lapack_int LAPACKE_sgeqpf_work(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, lapack_int* jpvt,
+                               float* tau, float* work);
+lapack_int LAPACKE_dgeqpf_work(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda,
+                               lapack_int* jpvt, double* tau, double* work);
+lapack_int LAPACKE_cgeqpf_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                               lapack_int* jpvt, lapack_complex_float* tau, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zgeqpf_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                               lapack_int* jpvt, lapack_complex_double* tau, lapack_complex_double* work,
+                               double* rwork);
 
-lapack_int LAPACKE_sgeqpf_work( int matrix_order, lapack_int m, lapack_int n,
-                                float* a, lapack_int lda, lapack_int* jpvt,
-                                float* tau, float* work );
-lapack_int LAPACKE_dgeqpf_work( int matrix_order, lapack_int m, lapack_int n,
-                                double* a, lapack_int lda, lapack_int* jpvt,
-                                double* tau, double* work );
-lapack_int LAPACKE_cgeqpf_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_int* jpvt, lapack_complex_float* tau,
-                                lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_zgeqpf_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_int* jpvt, lapack_complex_double* tau,
-                                lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_sgeqr2_work(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, float* tau,
+                               float* work);
+lapack_int LAPACKE_dgeqr2_work(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda, double* tau,
+                               double* work);
+lapack_int LAPACKE_cgeqr2_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                               lapack_complex_float* tau, lapack_complex_float* work);
+lapack_int LAPACKE_zgeqr2_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                               lapack_complex_double* tau, lapack_complex_double* work);
 
-lapack_int LAPACKE_sgeqr2_work( int matrix_order, lapack_int m, lapack_int n,
-                                float* a, lapack_int lda, float* tau,
-                                float* work );
-lapack_int LAPACKE_dgeqr2_work( int matrix_order, lapack_int m, lapack_int n,
-                                double* a, lapack_int lda, double* tau,
-                                double* work );
-lapack_int LAPACKE_cgeqr2_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_complex_float* tau,
-                                lapack_complex_float* work );
-lapack_int LAPACKE_zgeqr2_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_complex_double* tau,
-                                lapack_complex_double* work );
+lapack_int LAPACKE_sgeqrf_work(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, float* tau,
+                               float* work, lapack_int lwork);
+lapack_int LAPACKE_dgeqrf_work(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda, double* tau,
+                               double* work, lapack_int lwork);
+lapack_int LAPACKE_cgeqrf_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                               lapack_complex_float* tau, lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_zgeqrf_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                               lapack_complex_double* tau, lapack_complex_double* work, lapack_int lwork);
 
-lapack_int LAPACKE_sgeqrf_work( int matrix_order, lapack_int m, lapack_int n,
-                                float* a, lapack_int lda, float* tau,
-                                float* work, lapack_int lwork );
-lapack_int LAPACKE_dgeqrf_work( int matrix_order, lapack_int m, lapack_int n,
-                                double* a, lapack_int lda, double* tau,
-                                double* work, lapack_int lwork );
-lapack_int LAPACKE_cgeqrf_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_complex_float* tau,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zgeqrf_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_complex_double* tau,
-                                lapack_complex_double* work, lapack_int lwork );
+lapack_int LAPACKE_sgeqrfp_work(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, float* tau,
+                                float* work, lapack_int lwork);
+lapack_int LAPACKE_dgeqrfp_work(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda, double* tau,
+                                double* work, lapack_int lwork);
+lapack_int LAPACKE_cgeqrfp_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                                lapack_complex_float* tau, lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_zgeqrfp_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                                lapack_complex_double* tau, lapack_complex_double* work, lapack_int lwork);
 
-lapack_int LAPACKE_sgeqrfp_work( int matrix_order, lapack_int m, lapack_int n,
-                                 float* a, lapack_int lda, float* tau,
-                                 float* work, lapack_int lwork );
-lapack_int LAPACKE_dgeqrfp_work( int matrix_order, lapack_int m, lapack_int n,
-                                 double* a, lapack_int lda, double* tau,
-                                 double* work, lapack_int lwork );
-lapack_int LAPACKE_cgeqrfp_work( int matrix_order, lapack_int m, lapack_int n,
-                                 lapack_complex_float* a, lapack_int lda,
-                                 lapack_complex_float* tau,
-                                 lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zgeqrfp_work( int matrix_order, lapack_int m, lapack_int n,
-                                 lapack_complex_double* a, lapack_int lda,
-                                 lapack_complex_double* tau,
-                                 lapack_complex_double* work,
-                                 lapack_int lwork );
+lapack_int LAPACKE_sgerfs_work(int matrix_order, char trans, lapack_int n, lapack_int nrhs, const float* a,
+                               lapack_int lda, const float* af, lapack_int ldaf, const lapack_int* ipiv, const float* b,
+                               lapack_int ldb, float* x, lapack_int ldx, float* ferr, float* berr, float* work,
+                               lapack_int* iwork);
+lapack_int LAPACKE_dgerfs_work(int matrix_order, char trans, lapack_int n, lapack_int nrhs, const double* a,
+                               lapack_int lda, const double* af, lapack_int ldaf, const lapack_int* ipiv,
+                               const double* b, lapack_int ldb, double* x, lapack_int ldx, double* ferr, double* berr,
+                               double* work, lapack_int* iwork);
+lapack_int LAPACKE_cgerfs_work(int matrix_order, char trans, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* af,
+                               lapack_int ldaf, const lapack_int* ipiv, const lapack_complex_float* b, lapack_int ldb,
+                               lapack_complex_float* x, lapack_int ldx, float* ferr, float* berr,
+                               lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zgerfs_work(int matrix_order, char trans, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* af,
+                               lapack_int ldaf, const lapack_int* ipiv, const lapack_complex_double* b, lapack_int ldb,
+                               lapack_complex_double* x, lapack_int ldx, double* ferr, double* berr,
+                               lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_sgerfs_work( int matrix_order, char trans, lapack_int n,
-                                lapack_int nrhs, const float* a, lapack_int lda,
-                                const float* af, lapack_int ldaf,
-                                const lapack_int* ipiv, const float* b,
-                                lapack_int ldb, float* x, lapack_int ldx,
-                                float* ferr, float* berr, float* work,
-                                lapack_int* iwork );
-lapack_int LAPACKE_dgerfs_work( int matrix_order, char trans, lapack_int n,
-                                lapack_int nrhs, const double* a,
-                                lapack_int lda, const double* af,
-                                lapack_int ldaf, const lapack_int* ipiv,
-                                const double* b, lapack_int ldb, double* x,
-                                lapack_int ldx, double* ferr, double* berr,
-                                double* work, lapack_int* iwork );
-lapack_int LAPACKE_cgerfs_work( int matrix_order, char trans, lapack_int n,
-                                lapack_int nrhs, const lapack_complex_float* a,
-                                lapack_int lda, const lapack_complex_float* af,
-                                lapack_int ldaf, const lapack_int* ipiv,
-                                const lapack_complex_float* b, lapack_int ldb,
-                                lapack_complex_float* x, lapack_int ldx,
-                                float* ferr, float* berr,
-                                lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_zgerfs_work( int matrix_order, char trans, lapack_int n,
-                                lapack_int nrhs, const lapack_complex_double* a,
-                                lapack_int lda, const lapack_complex_double* af,
-                                lapack_int ldaf, const lapack_int* ipiv,
-                                const lapack_complex_double* b, lapack_int ldb,
-                                lapack_complex_double* x, lapack_int ldx,
-                                double* ferr, double* berr,
-                                lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_sgerfsx_work(int matrix_order, char trans, char equed, lapack_int n, lapack_int nrhs, const float* a,
+                                lapack_int lda, const float* af, lapack_int ldaf, const lapack_int* ipiv,
+                                const float* r, const float* c, const float* b, lapack_int ldb, float* x,
+                                lapack_int ldx, float* rcond, float* berr, lapack_int n_err_bnds, float* err_bnds_norm,
+                                float* err_bnds_comp, lapack_int nparams, float* params, float* work,
+                                lapack_int* iwork);
+lapack_int LAPACKE_dgerfsx_work(int matrix_order, char trans, char equed, lapack_int n, lapack_int nrhs,
+                                const double* a, lapack_int lda, const double* af, lapack_int ldaf,
+                                const lapack_int* ipiv, const double* r, const double* c, const double* b,
+                                lapack_int ldb, double* x, lapack_int ldx, double* rcond, double* berr,
+                                lapack_int n_err_bnds, double* err_bnds_norm, double* err_bnds_comp, lapack_int nparams,
+                                double* params, double* work, lapack_int* iwork);
+lapack_int LAPACKE_cgerfsx_work(int matrix_order, char trans, char equed, lapack_int n, lapack_int nrhs,
+                                const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* af,
+                                lapack_int ldaf, const lapack_int* ipiv, const float* r, const float* c,
+                                const lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x, lapack_int ldx,
+                                float* rcond, float* berr, lapack_int n_err_bnds, float* err_bnds_norm,
+                                float* err_bnds_comp, lapack_int nparams, float* params, lapack_complex_float* work,
+                                float* rwork);
+lapack_int LAPACKE_zgerfsx_work(int matrix_order, char trans, char equed, lapack_int n, lapack_int nrhs,
+                                const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* af,
+                                lapack_int ldaf, const lapack_int* ipiv, const double* r, const double* c,
+                                const lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x,
+                                lapack_int ldx, double* rcond, double* berr, lapack_int n_err_bnds,
+                                double* err_bnds_norm, double* err_bnds_comp, lapack_int nparams, double* params,
+                                lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_sgerfsx_work( int matrix_order, char trans, char equed,
-                                 lapack_int n, lapack_int nrhs, const float* a,
-                                 lapack_int lda, const float* af,
-                                 lapack_int ldaf, const lapack_int* ipiv,
-                                 const float* r, const float* c, const float* b,
-                                 lapack_int ldb, float* x, lapack_int ldx,
-                                 float* rcond, float* berr,
-                                 lapack_int n_err_bnds, float* err_bnds_norm,
-                                 float* err_bnds_comp, lapack_int nparams,
-                                 float* params, float* work,
-                                 lapack_int* iwork );
-lapack_int LAPACKE_dgerfsx_work( int matrix_order, char trans, char equed,
-                                 lapack_int n, lapack_int nrhs, const double* a,
-                                 lapack_int lda, const double* af,
-                                 lapack_int ldaf, const lapack_int* ipiv,
-                                 const double* r, const double* c,
-                                 const double* b, lapack_int ldb, double* x,
-                                 lapack_int ldx, double* rcond, double* berr,
-                                 lapack_int n_err_bnds, double* err_bnds_norm,
-                                 double* err_bnds_comp, lapack_int nparams,
-                                 double* params, double* work,
-                                 lapack_int* iwork );
-lapack_int LAPACKE_cgerfsx_work( int matrix_order, char trans, char equed,
-                                 lapack_int n, lapack_int nrhs,
-                                 const lapack_complex_float* a, lapack_int lda,
-                                 const lapack_complex_float* af,
-                                 lapack_int ldaf, const lapack_int* ipiv,
-                                 const float* r, const float* c,
-                                 const lapack_complex_float* b, lapack_int ldb,
-                                 lapack_complex_float* x, lapack_int ldx,
-                                 float* rcond, float* berr,
-                                 lapack_int n_err_bnds, float* err_bnds_norm,
-                                 float* err_bnds_comp, lapack_int nparams,
-                                 float* params, lapack_complex_float* work,
-                                 float* rwork );
-lapack_int LAPACKE_zgerfsx_work( int matrix_order, char trans, char equed,
-                                 lapack_int n, lapack_int nrhs,
-                                 const lapack_complex_double* a, lapack_int lda,
-                                 const lapack_complex_double* af,
-                                 lapack_int ldaf, const lapack_int* ipiv,
-                                 const double* r, const double* c,
-                                 const lapack_complex_double* b, lapack_int ldb,
-                                 lapack_complex_double* x, lapack_int ldx,
-                                 double* rcond, double* berr,
-                                 lapack_int n_err_bnds, double* err_bnds_norm,
-                                 double* err_bnds_comp, lapack_int nparams,
-                                 double* params, lapack_complex_double* work,
-                                 double* rwork );
+lapack_int LAPACKE_sgerqf_work(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, float* tau,
+                               float* work, lapack_int lwork);
+lapack_int LAPACKE_dgerqf_work(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda, double* tau,
+                               double* work, lapack_int lwork);
+lapack_int LAPACKE_cgerqf_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                               lapack_complex_float* tau, lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_zgerqf_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                               lapack_complex_double* tau, lapack_complex_double* work, lapack_int lwork);
 
-lapack_int LAPACKE_sgerqf_work( int matrix_order, lapack_int m, lapack_int n,
-                                float* a, lapack_int lda, float* tau,
-                                float* work, lapack_int lwork );
-lapack_int LAPACKE_dgerqf_work( int matrix_order, lapack_int m, lapack_int n,
-                                double* a, lapack_int lda, double* tau,
-                                double* work, lapack_int lwork );
-lapack_int LAPACKE_cgerqf_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_complex_float* tau,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zgerqf_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_complex_double* tau,
-                                lapack_complex_double* work, lapack_int lwork );
+lapack_int LAPACKE_sgesdd_work(int matrix_order, char jobz, lapack_int m, lapack_int n, float* a, lapack_int lda,
+                               float* s, float* u, lapack_int ldu, float* vt, lapack_int ldvt, float* work,
+                               lapack_int lwork, lapack_int* iwork);
+lapack_int LAPACKE_dgesdd_work(int matrix_order, char jobz, lapack_int m, lapack_int n, double* a, lapack_int lda,
+                               double* s, double* u, lapack_int ldu, double* vt, lapack_int ldvt, double* work,
+                               lapack_int lwork, lapack_int* iwork);
+lapack_int LAPACKE_cgesdd_work(int matrix_order, char jobz, lapack_int m, lapack_int n, lapack_complex_float* a,
+                               lapack_int lda, float* s, lapack_complex_float* u, lapack_int ldu,
+                               lapack_complex_float* vt, lapack_int ldvt, lapack_complex_float* work, lapack_int lwork,
+                               float* rwork, lapack_int* iwork);
+lapack_int LAPACKE_zgesdd_work(int matrix_order, char jobz, lapack_int m, lapack_int n, lapack_complex_double* a,
+                               lapack_int lda, double* s, lapack_complex_double* u, lapack_int ldu,
+                               lapack_complex_double* vt, lapack_int ldvt, lapack_complex_double* work,
+                               lapack_int lwork, double* rwork, lapack_int* iwork);
 
-lapack_int LAPACKE_sgesdd_work( int matrix_order, char jobz, lapack_int m,
-                                lapack_int n, float* a, lapack_int lda,
-                                float* s, float* u, lapack_int ldu, float* vt,
-                                lapack_int ldvt, float* work, lapack_int lwork,
-                                lapack_int* iwork );
-lapack_int LAPACKE_dgesdd_work( int matrix_order, char jobz, lapack_int m,
-                                lapack_int n, double* a, lapack_int lda,
-                                double* s, double* u, lapack_int ldu,
-                                double* vt, lapack_int ldvt, double* work,
-                                lapack_int lwork, lapack_int* iwork );
-lapack_int LAPACKE_cgesdd_work( int matrix_order, char jobz, lapack_int m,
-                                lapack_int n, lapack_complex_float* a,
-                                lapack_int lda, float* s,
-                                lapack_complex_float* u, lapack_int ldu,
-                                lapack_complex_float* vt, lapack_int ldvt,
-                                lapack_complex_float* work, lapack_int lwork,
-                                float* rwork, lapack_int* iwork );
-lapack_int LAPACKE_zgesdd_work( int matrix_order, char jobz, lapack_int m,
-                                lapack_int n, lapack_complex_double* a,
-                                lapack_int lda, double* s,
-                                lapack_complex_double* u, lapack_int ldu,
-                                lapack_complex_double* vt, lapack_int ldvt,
-                                lapack_complex_double* work, lapack_int lwork,
-                                double* rwork, lapack_int* iwork );
+lapack_int LAPACKE_sgesv_work(int matrix_order, lapack_int n, lapack_int nrhs, float* a, lapack_int lda,
+                              lapack_int* ipiv, float* b, lapack_int ldb);
+lapack_int LAPACKE_dgesv_work(int matrix_order, lapack_int n, lapack_int nrhs, double* a, lapack_int lda,
+                              lapack_int* ipiv, double* b, lapack_int ldb);
+lapack_int LAPACKE_cgesv_work(int matrix_order, lapack_int n, lapack_int nrhs, lapack_complex_float* a, lapack_int lda,
+                              lapack_int* ipiv, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zgesv_work(int matrix_order, lapack_int n, lapack_int nrhs, lapack_complex_double* a, lapack_int lda,
+                              lapack_int* ipiv, lapack_complex_double* b, lapack_int ldb);
+lapack_int LAPACKE_dsgesv_work(int matrix_order, lapack_int n, lapack_int nrhs, double* a, lapack_int lda,
+                               lapack_int* ipiv, double* b, lapack_int ldb, double* x, lapack_int ldx, double* work,
+                               float* swork, lapack_int* iter);
+lapack_int LAPACKE_zcgesv_work(int matrix_order, lapack_int n, lapack_int nrhs, lapack_complex_double* a,
+                               lapack_int lda, lapack_int* ipiv, lapack_complex_double* b, lapack_int ldb,
+                               lapack_complex_double* x, lapack_int ldx, lapack_complex_double* work,
+                               lapack_complex_float* swork, double* rwork, lapack_int* iter);
 
-lapack_int LAPACKE_sgesv_work( int matrix_order, lapack_int n, lapack_int nrhs,
-                               float* a, lapack_int lda, lapack_int* ipiv,
-                               float* b, lapack_int ldb );
-lapack_int LAPACKE_dgesv_work( int matrix_order, lapack_int n, lapack_int nrhs,
-                               double* a, lapack_int lda, lapack_int* ipiv,
-                               double* b, lapack_int ldb );
-lapack_int LAPACKE_cgesv_work( int matrix_order, lapack_int n, lapack_int nrhs,
-                               lapack_complex_float* a, lapack_int lda,
-                               lapack_int* ipiv, lapack_complex_float* b,
-                               lapack_int ldb );
-lapack_int LAPACKE_zgesv_work( int matrix_order, lapack_int n, lapack_int nrhs,
-                               lapack_complex_double* a, lapack_int lda,
-                               lapack_int* ipiv, lapack_complex_double* b,
-                               lapack_int ldb );
-lapack_int LAPACKE_dsgesv_work( int matrix_order, lapack_int n, lapack_int nrhs,
-                                double* a, lapack_int lda, lapack_int* ipiv,
-                                double* b, lapack_int ldb, double* x,
-                                lapack_int ldx, double* work, float* swork,
-                                lapack_int* iter );
-lapack_int LAPACKE_zcgesv_work( int matrix_order, lapack_int n, lapack_int nrhs,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_int* ipiv, lapack_complex_double* b,
-                                lapack_int ldb, lapack_complex_double* x,
-                                lapack_int ldx, lapack_complex_double* work,
-                                lapack_complex_float* swork, double* rwork,
-                                lapack_int* iter );
+lapack_int LAPACKE_sgesvd_work(int matrix_order, char jobu, char jobvt, lapack_int m, lapack_int n, float* a,
+                               lapack_int lda, float* s, float* u, lapack_int ldu, float* vt, lapack_int ldvt,
+                               float* work, lapack_int lwork);
+lapack_int LAPACKE_dgesvd_work(int matrix_order, char jobu, char jobvt, lapack_int m, lapack_int n, double* a,
+                               lapack_int lda, double* s, double* u, lapack_int ldu, double* vt, lapack_int ldvt,
+                               double* work, lapack_int lwork);
+lapack_int LAPACKE_cgesvd_work(int matrix_order, char jobu, char jobvt, lapack_int m, lapack_int n,
+                               lapack_complex_float* a, lapack_int lda, float* s, lapack_complex_float* u,
+                               lapack_int ldu, lapack_complex_float* vt, lapack_int ldvt, lapack_complex_float* work,
+                               lapack_int lwork, float* rwork);
+lapack_int LAPACKE_zgesvd_work(int matrix_order, char jobu, char jobvt, lapack_int m, lapack_int n,
+                               lapack_complex_double* a, lapack_int lda, double* s, lapack_complex_double* u,
+                               lapack_int ldu, lapack_complex_double* vt, lapack_int ldvt, lapack_complex_double* work,
+                               lapack_int lwork, double* rwork);
 
-lapack_int LAPACKE_sgesvd_work( int matrix_order, char jobu, char jobvt,
-                                lapack_int m, lapack_int n, float* a,
-                                lapack_int lda, float* s, float* u,
-                                lapack_int ldu, float* vt, lapack_int ldvt,
-                                float* work, lapack_int lwork );
-lapack_int LAPACKE_dgesvd_work( int matrix_order, char jobu, char jobvt,
-                                lapack_int m, lapack_int n, double* a,
-                                lapack_int lda, double* s, double* u,
-                                lapack_int ldu, double* vt, lapack_int ldvt,
-                                double* work, lapack_int lwork );
-lapack_int LAPACKE_cgesvd_work( int matrix_order, char jobu, char jobvt,
-                                lapack_int m, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                float* s, lapack_complex_float* u,
-                                lapack_int ldu, lapack_complex_float* vt,
-                                lapack_int ldvt, lapack_complex_float* work,
-                                lapack_int lwork, float* rwork );
-lapack_int LAPACKE_zgesvd_work( int matrix_order, char jobu, char jobvt,
-                                lapack_int m, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                double* s, lapack_complex_double* u,
-                                lapack_int ldu, lapack_complex_double* vt,
-                                lapack_int ldvt, lapack_complex_double* work,
-                                lapack_int lwork, double* rwork );
+lapack_int LAPACKE_sgesvj_work(int matrix_order, char joba, char jobu, char jobv, lapack_int m, lapack_int n, float* a,
+                               lapack_int lda, float* sva, lapack_int mv, float* v, lapack_int ldv, float* work,
+                               lapack_int lwork);
+lapack_int LAPACKE_dgesvj_work(int matrix_order, char joba, char jobu, char jobv, lapack_int m, lapack_int n, double* a,
+                               lapack_int lda, double* sva, lapack_int mv, double* v, lapack_int ldv, double* work,
+                               lapack_int lwork);
 
-lapack_int LAPACKE_sgesvj_work( int matrix_order, char joba, char jobu,
-                                char jobv, lapack_int m, lapack_int n, float* a,
-                                lapack_int lda, float* sva, lapack_int mv,
-                                float* v, lapack_int ldv, float* work,
-                                lapack_int lwork );
-lapack_int LAPACKE_dgesvj_work( int matrix_order, char joba, char jobu,
-                                char jobv, lapack_int m, lapack_int n,
-                                double* a, lapack_int lda, double* sva,
-                                lapack_int mv, double* v, lapack_int ldv,
-                                double* work, lapack_int lwork );
+lapack_int LAPACKE_sgesvx_work(int matrix_order, char fact, char trans, lapack_int n, lapack_int nrhs, float* a,
+                               lapack_int lda, float* af, lapack_int ldaf, lapack_int* ipiv, char* equed, float* r,
+                               float* c, float* b, lapack_int ldb, float* x, lapack_int ldx, float* rcond, float* ferr,
+                               float* berr, float* work, lapack_int* iwork);
+lapack_int LAPACKE_dgesvx_work(int matrix_order, char fact, char trans, lapack_int n, lapack_int nrhs, double* a,
+                               lapack_int lda, double* af, lapack_int ldaf, lapack_int* ipiv, char* equed, double* r,
+                               double* c, double* b, lapack_int ldb, double* x, lapack_int ldx, double* rcond,
+                               double* ferr, double* berr, double* work, lapack_int* iwork);
+lapack_int LAPACKE_cgesvx_work(int matrix_order, char fact, char trans, lapack_int n, lapack_int nrhs,
+                               lapack_complex_float* a, lapack_int lda, lapack_complex_float* af, lapack_int ldaf,
+                               lapack_int* ipiv, char* equed, float* r, float* c, lapack_complex_float* b,
+                               lapack_int ldb, lapack_complex_float* x, lapack_int ldx, float* rcond, float* ferr,
+                               float* berr, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zgesvx_work(int matrix_order, char fact, char trans, lapack_int n, lapack_int nrhs,
+                               lapack_complex_double* a, lapack_int lda, lapack_complex_double* af, lapack_int ldaf,
+                               lapack_int* ipiv, char* equed, double* r, double* c, lapack_complex_double* b,
+                               lapack_int ldb, lapack_complex_double* x, lapack_int ldx, double* rcond, double* ferr,
+                               double* berr, lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_sgesvx_work( int matrix_order, char fact, char trans,
-                                lapack_int n, lapack_int nrhs, float* a,
-                                lapack_int lda, float* af, lapack_int ldaf,
-                                lapack_int* ipiv, char* equed, float* r,
-                                float* c, float* b, lapack_int ldb, float* x,
-                                lapack_int ldx, float* rcond, float* ferr,
-                                float* berr, float* work, lapack_int* iwork );
-lapack_int LAPACKE_dgesvx_work( int matrix_order, char fact, char trans,
-                                lapack_int n, lapack_int nrhs, double* a,
-                                lapack_int lda, double* af, lapack_int ldaf,
-                                lapack_int* ipiv, char* equed, double* r,
-                                double* c, double* b, lapack_int ldb, double* x,
-                                lapack_int ldx, double* rcond, double* ferr,
-                                double* berr, double* work, lapack_int* iwork );
-lapack_int LAPACKE_cgesvx_work( int matrix_order, char fact, char trans,
-                                lapack_int n, lapack_int nrhs,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_complex_float* af, lapack_int ldaf,
-                                lapack_int* ipiv, char* equed, float* r,
-                                float* c, lapack_complex_float* b,
-                                lapack_int ldb, lapack_complex_float* x,
-                                lapack_int ldx, float* rcond, float* ferr,
-                                float* berr, lapack_complex_float* work,
-                                float* rwork );
-lapack_int LAPACKE_zgesvx_work( int matrix_order, char fact, char trans,
-                                lapack_int n, lapack_int nrhs,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_complex_double* af, lapack_int ldaf,
-                                lapack_int* ipiv, char* equed, double* r,
-                                double* c, lapack_complex_double* b,
-                                lapack_int ldb, lapack_complex_double* x,
-                                lapack_int ldx, double* rcond, double* ferr,
-                                double* berr, lapack_complex_double* work,
-                                double* rwork );
+lapack_int LAPACKE_sgesvxx_work(int matrix_order, char fact, char trans, lapack_int n, lapack_int nrhs, float* a,
+                                lapack_int lda, float* af, lapack_int ldaf, lapack_int* ipiv, char* equed, float* r,
+                                float* c, float* b, lapack_int ldb, float* x, lapack_int ldx, float* rcond,
+                                float* rpvgrw, float* berr, lapack_int n_err_bnds, float* err_bnds_norm,
+                                float* err_bnds_comp, lapack_int nparams, float* params, float* work,
+                                lapack_int* iwork);
+lapack_int LAPACKE_dgesvxx_work(int matrix_order, char fact, char trans, lapack_int n, lapack_int nrhs, double* a,
+                                lapack_int lda, double* af, lapack_int ldaf, lapack_int* ipiv, char* equed, double* r,
+                                double* c, double* b, lapack_int ldb, double* x, lapack_int ldx, double* rcond,
+                                double* rpvgrw, double* berr, lapack_int n_err_bnds, double* err_bnds_norm,
+                                double* err_bnds_comp, lapack_int nparams, double* params, double* work,
+                                lapack_int* iwork);
+lapack_int LAPACKE_cgesvxx_work(int matrix_order, char fact, char trans, lapack_int n, lapack_int nrhs,
+                                lapack_complex_float* a, lapack_int lda, lapack_complex_float* af, lapack_int ldaf,
+                                lapack_int* ipiv, char* equed, float* r, float* c, lapack_complex_float* b,
+                                lapack_int ldb, lapack_complex_float* x, lapack_int ldx, float* rcond, float* rpvgrw,
+                                float* berr, lapack_int n_err_bnds, float* err_bnds_norm, float* err_bnds_comp,
+                                lapack_int nparams, float* params, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zgesvxx_work(int matrix_order, char fact, char trans, lapack_int n, lapack_int nrhs,
+                                lapack_complex_double* a, lapack_int lda, lapack_complex_double* af, lapack_int ldaf,
+                                lapack_int* ipiv, char* equed, double* r, double* c, lapack_complex_double* b,
+                                lapack_int ldb, lapack_complex_double* x, lapack_int ldx, double* rcond, double* rpvgrw,
+                                double* berr, lapack_int n_err_bnds, double* err_bnds_norm, double* err_bnds_comp,
+                                lapack_int nparams, double* params, lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_sgesvxx_work( int matrix_order, char fact, char trans,
-                                 lapack_int n, lapack_int nrhs, float* a,
-                                 lapack_int lda, float* af, lapack_int ldaf,
-                                 lapack_int* ipiv, char* equed, float* r,
-                                 float* c, float* b, lapack_int ldb, float* x,
-                                 lapack_int ldx, float* rcond, float* rpvgrw,
-                                 float* berr, lapack_int n_err_bnds,
-                                 float* err_bnds_norm, float* err_bnds_comp,
-                                 lapack_int nparams, float* params, float* work,
-                                 lapack_int* iwork );
-lapack_int LAPACKE_dgesvxx_work( int matrix_order, char fact, char trans,
-                                 lapack_int n, lapack_int nrhs, double* a,
-                                 lapack_int lda, double* af, lapack_int ldaf,
-                                 lapack_int* ipiv, char* equed, double* r,
-                                 double* c, double* b, lapack_int ldb,
-                                 double* x, lapack_int ldx, double* rcond,
-                                 double* rpvgrw, double* berr,
-                                 lapack_int n_err_bnds, double* err_bnds_norm,
-                                 double* err_bnds_comp, lapack_int nparams,
-                                 double* params, double* work,
-                                 lapack_int* iwork );
-lapack_int LAPACKE_cgesvxx_work( int matrix_order, char fact, char trans,
-                                 lapack_int n, lapack_int nrhs,
-                                 lapack_complex_float* a, lapack_int lda,
-                                 lapack_complex_float* af, lapack_int ldaf,
-                                 lapack_int* ipiv, char* equed, float* r,
-                                 float* c, lapack_complex_float* b,
-                                 lapack_int ldb, lapack_complex_float* x,
-                                 lapack_int ldx, float* rcond, float* rpvgrw,
-                                 float* berr, lapack_int n_err_bnds,
-                                 float* err_bnds_norm, float* err_bnds_comp,
-                                 lapack_int nparams, float* params,
-                                 lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_zgesvxx_work( int matrix_order, char fact, char trans,
-                                 lapack_int n, lapack_int nrhs,
-                                 lapack_complex_double* a, lapack_int lda,
-                                 lapack_complex_double* af, lapack_int ldaf,
-                                 lapack_int* ipiv, char* equed, double* r,
-                                 double* c, lapack_complex_double* b,
-                                 lapack_int ldb, lapack_complex_double* x,
-                                 lapack_int ldx, double* rcond, double* rpvgrw,
-                                 double* berr, lapack_int n_err_bnds,
-                                 double* err_bnds_norm, double* err_bnds_comp,
-                                 lapack_int nparams, double* params,
-                                 lapack_complex_double* work, double* rwork );
-
-lapack_int LAPACKE_sgetf2_work( int matrix_order, lapack_int m, lapack_int n,
-                                float* a, lapack_int lda, lapack_int* ipiv );
-lapack_int LAPACKE_dgetf2_work( int matrix_order, lapack_int m, lapack_int n,
-                                double* a, lapack_int lda, lapack_int* ipiv );
-lapack_int LAPACKE_cgetf2_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_int* ipiv );
-lapack_int LAPACKE_zgetf2_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_int* ipiv );
-
-lapack_int LAPACKE_sgetrf_work( int matrix_order, lapack_int m, lapack_int n,
-                                float* a, lapack_int lda, lapack_int* ipiv );
-lapack_int LAPACKE_dgetrf_work( int matrix_order, lapack_int m, lapack_int n,
-                                double* a, lapack_int lda, lapack_int* ipiv );
-lapack_int LAPACKE_cgetrf_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_int* ipiv );
-lapack_int LAPACKE_zgetrf_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_int* ipiv );
-
-lapack_int LAPACKE_sgetri_work( int matrix_order, lapack_int n, float* a,
-                                lapack_int lda, const lapack_int* ipiv,
-                                float* work, lapack_int lwork );
-lapack_int LAPACKE_dgetri_work( int matrix_order, lapack_int n, double* a,
-                                lapack_int lda, const lapack_int* ipiv,
-                                double* work, lapack_int lwork );
-lapack_int LAPACKE_cgetri_work( int matrix_order, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                const lapack_int* ipiv,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zgetri_work( int matrix_order, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                const lapack_int* ipiv,
-                                lapack_complex_double* work, lapack_int lwork );
-
-lapack_int LAPACKE_sgetrs_work( int matrix_order, char trans, lapack_int n,
-                                lapack_int nrhs, const float* a, lapack_int lda,
-                                const lapack_int* ipiv, float* b,
-                                lapack_int ldb );
-lapack_int LAPACKE_dgetrs_work( int matrix_order, char trans, lapack_int n,
-                                lapack_int nrhs, const double* a,
-                                lapack_int lda, const lapack_int* ipiv,
-                                double* b, lapack_int ldb );
-lapack_int LAPACKE_cgetrs_work( int matrix_order, char trans, lapack_int n,
-                                lapack_int nrhs, const lapack_complex_float* a,
-                                lapack_int lda, const lapack_int* ipiv,
-                                lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_zgetrs_work( int matrix_order, char trans, lapack_int n,
-                                lapack_int nrhs, const lapack_complex_double* a,
-                                lapack_int lda, const lapack_int* ipiv,
-                                lapack_complex_double* b, lapack_int ldb );
-
-lapack_int LAPACKE_sggbak_work( int matrix_order, char job, char side,
-                                lapack_int n, lapack_int ilo, lapack_int ihi,
-                                const float* lscale, const float* rscale,
-                                lapack_int m, float* v, lapack_int ldv );
-lapack_int LAPACKE_dggbak_work( int matrix_order, char job, char side,
-                                lapack_int n, lapack_int ilo, lapack_int ihi,
-                                const double* lscale, const double* rscale,
-                                lapack_int m, double* v, lapack_int ldv );
-lapack_int LAPACKE_cggbak_work( int matrix_order, char job, char side,
-                                lapack_int n, lapack_int ilo, lapack_int ihi,
-                                const float* lscale, const float* rscale,
-                                lapack_int m, lapack_complex_float* v,
-                                lapack_int ldv );
-lapack_int LAPACKE_zggbak_work( int matrix_order, char job, char side,
-                                lapack_int n, lapack_int ilo, lapack_int ihi,
-                                const double* lscale, const double* rscale,
-                                lapack_int m, lapack_complex_double* v,
-                                lapack_int ldv );
-
-lapack_int LAPACKE_sggbal_work( int matrix_order, char job, lapack_int n,
-                                float* a, lapack_int lda, float* b,
-                                lapack_int ldb, lapack_int* ilo,
-                                lapack_int* ihi, float* lscale, float* rscale,
-                                float* work );
-lapack_int LAPACKE_dggbal_work( int matrix_order, char job, lapack_int n,
-                                double* a, lapack_int lda, double* b,
-                                lapack_int ldb, lapack_int* ilo,
-                                lapack_int* ihi, double* lscale, double* rscale,
-                                double* work );
-lapack_int LAPACKE_cggbal_work( int matrix_order, char job, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_complex_float* b, lapack_int ldb,
-                                lapack_int* ilo, lapack_int* ihi, float* lscale,
-                                float* rscale, float* work );
-lapack_int LAPACKE_zggbal_work( int matrix_order, char job, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_complex_double* b, lapack_int ldb,
-                                lapack_int* ilo, lapack_int* ihi,
-                                double* lscale, double* rscale, double* work );
-
-lapack_int LAPACKE_sgges_work( int matrix_order, char jobvsl, char jobvsr,
-                               char sort, LAPACK_S_SELECT3 selctg, lapack_int n,
-                               float* a, lapack_int lda, float* b,
-                               lapack_int ldb, lapack_int* sdim, float* alphar,
-                               float* alphai, float* beta, float* vsl,
-                               lapack_int ldvsl, float* vsr, lapack_int ldvsr,
-                               float* work, lapack_int lwork,
-                               lapack_logical* bwork );
-lapack_int LAPACKE_dgges_work( int matrix_order, char jobvsl, char jobvsr,
-                               char sort, LAPACK_D_SELECT3 selctg, lapack_int n,
-                               double* a, lapack_int lda, double* b,
-                               lapack_int ldb, lapack_int* sdim, double* alphar,
-                               double* alphai, double* beta, double* vsl,
-                               lapack_int ldvsl, double* vsr, lapack_int ldvsr,
-                               double* work, lapack_int lwork,
-                               lapack_logical* bwork );
-lapack_int LAPACKE_cgges_work( int matrix_order, char jobvsl, char jobvsr,
-                               char sort, LAPACK_C_SELECT2 selctg, lapack_int n,
-                               lapack_complex_float* a, lapack_int lda,
-                               lapack_complex_float* b, lapack_int ldb,
-                               lapack_int* sdim, lapack_complex_float* alpha,
-                               lapack_complex_float* beta,
-                               lapack_complex_float* vsl, lapack_int ldvsl,
-                               lapack_complex_float* vsr, lapack_int ldvsr,
-                               lapack_complex_float* work, lapack_int lwork,
-                               float* rwork, lapack_logical* bwork );
-lapack_int LAPACKE_zgges_work( int matrix_order, char jobvsl, char jobvsr,
-                               char sort, LAPACK_Z_SELECT2 selctg, lapack_int n,
-                               lapack_complex_double* a, lapack_int lda,
-                               lapack_complex_double* b, lapack_int ldb,
-                               lapack_int* sdim, lapack_complex_double* alpha,
-                               lapack_complex_double* beta,
-                               lapack_complex_double* vsl, lapack_int ldvsl,
-                               lapack_complex_double* vsr, lapack_int ldvsr,
-                               lapack_complex_double* work, lapack_int lwork,
-                               double* rwork, lapack_logical* bwork );
-
-lapack_int LAPACKE_sggesx_work( int matrix_order, char jobvsl, char jobvsr,
-                                char sort, LAPACK_S_SELECT3 selctg, char sense,
-                                lapack_int n, float* a, lapack_int lda,
-                                float* b, lapack_int ldb, lapack_int* sdim,
-                                float* alphar, float* alphai, float* beta,
-                                float* vsl, lapack_int ldvsl, float* vsr,
-                                lapack_int ldvsr, float* rconde, float* rcondv,
-                                float* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int liwork,
-                                lapack_logical* bwork );
-lapack_int LAPACKE_dggesx_work( int matrix_order, char jobvsl, char jobvsr,
-                                char sort, LAPACK_D_SELECT3 selctg, char sense,
-                                lapack_int n, double* a, lapack_int lda,
-                                double* b, lapack_int ldb, lapack_int* sdim,
-                                double* alphar, double* alphai, double* beta,
-                                double* vsl, lapack_int ldvsl, double* vsr,
-                                lapack_int ldvsr, double* rconde,
-                                double* rcondv, double* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int liwork,
-                                lapack_logical* bwork );
-lapack_int LAPACKE_cggesx_work( int matrix_order, char jobvsl, char jobvsr,
-                                char sort, LAPACK_C_SELECT2 selctg, char sense,
-                                lapack_int n, lapack_complex_float* a,
-                                lapack_int lda, lapack_complex_float* b,
-                                lapack_int ldb, lapack_int* sdim,
-                                lapack_complex_float* alpha,
-                                lapack_complex_float* beta,
-                                lapack_complex_float* vsl, lapack_int ldvsl,
-                                lapack_complex_float* vsr, lapack_int ldvsr,
-                                float* rconde, float* rcondv,
-                                lapack_complex_float* work, lapack_int lwork,
-                                float* rwork, lapack_int* iwork,
-                                lapack_int liwork, lapack_logical* bwork );
-lapack_int LAPACKE_zggesx_work( int matrix_order, char jobvsl, char jobvsr,
-                                char sort, LAPACK_Z_SELECT2 selctg, char sense,
-                                lapack_int n, lapack_complex_double* a,
-                                lapack_int lda, lapack_complex_double* b,
-                                lapack_int ldb, lapack_int* sdim,
-                                lapack_complex_double* alpha,
-                                lapack_complex_double* beta,
-                                lapack_complex_double* vsl, lapack_int ldvsl,
-                                lapack_complex_double* vsr, lapack_int ldvsr,
-                                double* rconde, double* rcondv,
-                                lapack_complex_double* work, lapack_int lwork,
-                                double* rwork, lapack_int* iwork,
-                                lapack_int liwork, lapack_logical* bwork );
-
-lapack_int LAPACKE_sggev_work( int matrix_order, char jobvl, char jobvr,
-                               lapack_int n, float* a, lapack_int lda, float* b,
-                               lapack_int ldb, float* alphar, float* alphai,
-                               float* beta, float* vl, lapack_int ldvl,
-                               float* vr, lapack_int ldvr, float* work,
-                               lapack_int lwork );
-lapack_int LAPACKE_dggev_work( int matrix_order, char jobvl, char jobvr,
-                               lapack_int n, double* a, lapack_int lda,
-                               double* b, lapack_int ldb, double* alphar,
-                               double* alphai, double* beta, double* vl,
-                               lapack_int ldvl, double* vr, lapack_int ldvr,
-                               double* work, lapack_int lwork );
-lapack_int LAPACKE_cggev_work( int matrix_order, char jobvl, char jobvr,
-                               lapack_int n, lapack_complex_float* a,
-                               lapack_int lda, lapack_complex_float* b,
-                               lapack_int ldb, lapack_complex_float* alpha,
-                               lapack_complex_float* beta,
-                               lapack_complex_float* vl, lapack_int ldvl,
-                               lapack_complex_float* vr, lapack_int ldvr,
-                               lapack_complex_float* work, lapack_int lwork,
-                               float* rwork );
-lapack_int LAPACKE_zggev_work( int matrix_order, char jobvl, char jobvr,
-                               lapack_int n, lapack_complex_double* a,
-                               lapack_int lda, lapack_complex_double* b,
-                               lapack_int ldb, lapack_complex_double* alpha,
-                               lapack_complex_double* beta,
-                               lapack_complex_double* vl, lapack_int ldvl,
-                               lapack_complex_double* vr, lapack_int ldvr,
-                               lapack_complex_double* work, lapack_int lwork,
-                               double* rwork );
-
-lapack_int LAPACKE_sggevx_work( int matrix_order, char balanc, char jobvl,
-                                char jobvr, char sense, lapack_int n, float* a,
-                                lapack_int lda, float* b, lapack_int ldb,
-                                float* alphar, float* alphai, float* beta,
-                                float* vl, lapack_int ldvl, float* vr,
-                                lapack_int ldvr, lapack_int* ilo,
-                                lapack_int* ihi, float* lscale, float* rscale,
-                                float* abnrm, float* bbnrm, float* rconde,
-                                float* rcondv, float* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_logical* bwork );
-lapack_int LAPACKE_dggevx_work( int matrix_order, char balanc, char jobvl,
-                                char jobvr, char sense, lapack_int n, double* a,
-                                lapack_int lda, double* b, lapack_int ldb,
-                                double* alphar, double* alphai, double* beta,
-                                double* vl, lapack_int ldvl, double* vr,
-                                lapack_int ldvr, lapack_int* ilo,
-                                lapack_int* ihi, double* lscale, double* rscale,
-                                double* abnrm, double* bbnrm, double* rconde,
-                                double* rcondv, double* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_logical* bwork );
-lapack_int LAPACKE_cggevx_work( int matrix_order, char balanc, char jobvl,
-                                char jobvr, char sense, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_complex_float* b, lapack_int ldb,
-                                lapack_complex_float* alpha,
-                                lapack_complex_float* beta,
-                                lapack_complex_float* vl, lapack_int ldvl,
-                                lapack_complex_float* vr, lapack_int ldvr,
-                                lapack_int* ilo, lapack_int* ihi, float* lscale,
-                                float* rscale, float* abnrm, float* bbnrm,
-                                float* rconde, float* rcondv,
-                                lapack_complex_float* work, lapack_int lwork,
-                                float* rwork, lapack_int* iwork,
-                                lapack_logical* bwork );
-lapack_int LAPACKE_zggevx_work( int matrix_order, char balanc, char jobvl,
-                                char jobvr, char sense, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_complex_double* b, lapack_int ldb,
-                                lapack_complex_double* alpha,
-                                lapack_complex_double* beta,
-                                lapack_complex_double* vl, lapack_int ldvl,
-                                lapack_complex_double* vr, lapack_int ldvr,
-                                lapack_int* ilo, lapack_int* ihi,
-                                double* lscale, double* rscale, double* abnrm,
-                                double* bbnrm, double* rconde, double* rcondv,
-                                lapack_complex_double* work, lapack_int lwork,
-                                double* rwork, lapack_int* iwork,
-                                lapack_logical* bwork );
-
-lapack_int LAPACKE_sggglm_work( int matrix_order, lapack_int n, lapack_int m,
-                                lapack_int p, float* a, lapack_int lda,
-                                float* b, lapack_int ldb, float* d, float* x,
-                                float* y, float* work, lapack_int lwork );
-lapack_int LAPACKE_dggglm_work( int matrix_order, lapack_int n, lapack_int m,
-                                lapack_int p, double* a, lapack_int lda,
-                                double* b, lapack_int ldb, double* d, double* x,
-                                double* y, double* work, lapack_int lwork );
-lapack_int LAPACKE_cggglm_work( int matrix_order, lapack_int n, lapack_int m,
-                                lapack_int p, lapack_complex_float* a,
-                                lapack_int lda, lapack_complex_float* b,
-                                lapack_int ldb, lapack_complex_float* d,
-                                lapack_complex_float* x,
-                                lapack_complex_float* y,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zggglm_work( int matrix_order, lapack_int n, lapack_int m,
-                                lapack_int p, lapack_complex_double* a,
-                                lapack_int lda, lapack_complex_double* b,
-                                lapack_int ldb, lapack_complex_double* d,
-                                lapack_complex_double* x,
-                                lapack_complex_double* y,
-                                lapack_complex_double* work, lapack_int lwork );
-
-lapack_int LAPACKE_sgghrd_work( int matrix_order, char compq, char compz,
-                                lapack_int n, lapack_int ilo, lapack_int ihi,
-                                float* a, lapack_int lda, float* b,
-                                lapack_int ldb, float* q, lapack_int ldq,
-                                float* z, lapack_int ldz );
-lapack_int LAPACKE_dgghrd_work( int matrix_order, char compq, char compz,
-                                lapack_int n, lapack_int ilo, lapack_int ihi,
-                                double* a, lapack_int lda, double* b,
-                                lapack_int ldb, double* q, lapack_int ldq,
-                                double* z, lapack_int ldz );
-lapack_int LAPACKE_cgghrd_work( int matrix_order, char compq, char compz,
-                                lapack_int n, lapack_int ilo, lapack_int ihi,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_complex_float* b, lapack_int ldb,
-                                lapack_complex_float* q, lapack_int ldq,
-                                lapack_complex_float* z, lapack_int ldz );
-lapack_int LAPACKE_zgghrd_work( int matrix_order, char compq, char compz,
-                                lapack_int n, lapack_int ilo, lapack_int ihi,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_complex_double* b, lapack_int ldb,
-                                lapack_complex_double* q, lapack_int ldq,
-                                lapack_complex_double* z, lapack_int ldz );
-
-lapack_int LAPACKE_sgglse_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int p, float* a, lapack_int lda,
-                                float* b, lapack_int ldb, float* c, float* d,
-                                float* x, float* work, lapack_int lwork );
-lapack_int LAPACKE_dgglse_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int p, double* a, lapack_int lda,
-                                double* b, lapack_int ldb, double* c, double* d,
-                                double* x, double* work, lapack_int lwork );
-lapack_int LAPACKE_cgglse_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int p, lapack_complex_float* a,
-                                lapack_int lda, lapack_complex_float* b,
-                                lapack_int ldb, lapack_complex_float* c,
-                                lapack_complex_float* d,
-                                lapack_complex_float* x,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zgglse_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int p, lapack_complex_double* a,
-                                lapack_int lda, lapack_complex_double* b,
-                                lapack_int ldb, lapack_complex_double* c,
-                                lapack_complex_double* d,
-                                lapack_complex_double* x,
-                                lapack_complex_double* work, lapack_int lwork );
-
-lapack_int LAPACKE_sggqrf_work( int matrix_order, lapack_int n, lapack_int m,
-                                lapack_int p, float* a, lapack_int lda,
-                                float* taua, float* b, lapack_int ldb,
-                                float* taub, float* work, lapack_int lwork );
-lapack_int LAPACKE_dggqrf_work( int matrix_order, lapack_int n, lapack_int m,
-                                lapack_int p, double* a, lapack_int lda,
-                                double* taua, double* b, lapack_int ldb,
-                                double* taub, double* work, lapack_int lwork );
-lapack_int LAPACKE_cggqrf_work( int matrix_order, lapack_int n, lapack_int m,
-                                lapack_int p, lapack_complex_float* a,
-                                lapack_int lda, lapack_complex_float* taua,
-                                lapack_complex_float* b, lapack_int ldb,
-                                lapack_complex_float* taub,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zggqrf_work( int matrix_order, lapack_int n, lapack_int m,
-                                lapack_int p, lapack_complex_double* a,
-                                lapack_int lda, lapack_complex_double* taua,
-                                lapack_complex_double* b, lapack_int ldb,
-                                lapack_complex_double* taub,
-                                lapack_complex_double* work, lapack_int lwork );
-
-lapack_int LAPACKE_sggrqf_work( int matrix_order, lapack_int m, lapack_int p,
-                                lapack_int n, float* a, lapack_int lda,
-                                float* taua, float* b, lapack_int ldb,
-                                float* taub, float* work, lapack_int lwork );
-lapack_int LAPACKE_dggrqf_work( int matrix_order, lapack_int m, lapack_int p,
-                                lapack_int n, double* a, lapack_int lda,
-                                double* taua, double* b, lapack_int ldb,
-                                double* taub, double* work, lapack_int lwork );
-lapack_int LAPACKE_cggrqf_work( int matrix_order, lapack_int m, lapack_int p,
-                                lapack_int n, lapack_complex_float* a,
-                                lapack_int lda, lapack_complex_float* taua,
-                                lapack_complex_float* b, lapack_int ldb,
-                                lapack_complex_float* taub,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zggrqf_work( int matrix_order, lapack_int m, lapack_int p,
-                                lapack_int n, lapack_complex_double* a,
-                                lapack_int lda, lapack_complex_double* taua,
-                                lapack_complex_double* b, lapack_int ldb,
-                                lapack_complex_double* taub,
-                                lapack_complex_double* work, lapack_int lwork );
-
-lapack_int LAPACKE_sggsvd_work( int matrix_order, char jobu, char jobv,
-                                char jobq, lapack_int m, lapack_int n,
-                                lapack_int p, lapack_int* k, lapack_int* l,
-                                float* a, lapack_int lda, float* b,
-                                lapack_int ldb, float* alpha, float* beta,
-                                float* u, lapack_int ldu, float* v,
-                                lapack_int ldv, float* q, lapack_int ldq,
-                                float* work, lapack_int* iwork );
-lapack_int LAPACKE_dggsvd_work( int matrix_order, char jobu, char jobv,
-                                char jobq, lapack_int m, lapack_int n,
-                                lapack_int p, lapack_int* k, lapack_int* l,
-                                double* a, lapack_int lda, double* b,
-                                lapack_int ldb, double* alpha, double* beta,
-                                double* u, lapack_int ldu, double* v,
-                                lapack_int ldv, double* q, lapack_int ldq,
-                                double* work, lapack_int* iwork );
-lapack_int LAPACKE_cggsvd_work( int matrix_order, char jobu, char jobv,
-                                char jobq, lapack_int m, lapack_int n,
-                                lapack_int p, lapack_int* k, lapack_int* l,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_complex_float* b, lapack_int ldb,
-                                float* alpha, float* beta,
-                                lapack_complex_float* u, lapack_int ldu,
-                                lapack_complex_float* v, lapack_int ldv,
-                                lapack_complex_float* q, lapack_int ldq,
-                                lapack_complex_float* work, float* rwork,
-                                lapack_int* iwork );
-lapack_int LAPACKE_zggsvd_work( int matrix_order, char jobu, char jobv,
-                                char jobq, lapack_int m, lapack_int n,
-                                lapack_int p, lapack_int* k, lapack_int* l,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_complex_double* b, lapack_int ldb,
-                                double* alpha, double* beta,
-                                lapack_complex_double* u, lapack_int ldu,
-                                lapack_complex_double* v, lapack_int ldv,
-                                lapack_complex_double* q, lapack_int ldq,
-                                lapack_complex_double* work, double* rwork,
-                                lapack_int* iwork );
-
-lapack_int LAPACKE_sggsvp_work( int matrix_order, char jobu, char jobv,
-                                char jobq, lapack_int m, lapack_int p,
-                                lapack_int n, float* a, lapack_int lda,
-                                float* b, lapack_int ldb, float tola,
-                                float tolb, lapack_int* k, lapack_int* l,
-                                float* u, lapack_int ldu, float* v,
-                                lapack_int ldv, float* q, lapack_int ldq,
-                                lapack_int* iwork, float* tau, float* work );
-lapack_int LAPACKE_dggsvp_work( int matrix_order, char jobu, char jobv,
-                                char jobq, lapack_int m, lapack_int p,
-                                lapack_int n, double* a, lapack_int lda,
-                                double* b, lapack_int ldb, double tola,
-                                double tolb, lapack_int* k, lapack_int* l,
-                                double* u, lapack_int ldu, double* v,
-                                lapack_int ldv, double* q, lapack_int ldq,
-                                lapack_int* iwork, double* tau, double* work );
-lapack_int LAPACKE_cggsvp_work( int matrix_order, char jobu, char jobv,
-                                char jobq, lapack_int m, lapack_int p,
-                                lapack_int n, lapack_complex_float* a,
-                                lapack_int lda, lapack_complex_float* b,
-                                lapack_int ldb, float tola, float tolb,
-                                lapack_int* k, lapack_int* l,
-                                lapack_complex_float* u, lapack_int ldu,
-                                lapack_complex_float* v, lapack_int ldv,
-                                lapack_complex_float* q, lapack_int ldq,
-                                lapack_int* iwork, float* rwork,
-                                lapack_complex_float* tau,
-                                lapack_complex_float* work );
-lapack_int LAPACKE_zggsvp_work( int matrix_order, char jobu, char jobv,
-                                char jobq, lapack_int m, lapack_int p,
-                                lapack_int n, lapack_complex_double* a,
-                                lapack_int lda, lapack_complex_double* b,
-                                lapack_int ldb, double tola, double tolb,
-                                lapack_int* k, lapack_int* l,
-                                lapack_complex_double* u, lapack_int ldu,
-                                lapack_complex_double* v, lapack_int ldv,
-                                lapack_complex_double* q, lapack_int ldq,
-                                lapack_int* iwork, double* rwork,
-                                lapack_complex_double* tau,
-                                lapack_complex_double* work );
-
-lapack_int LAPACKE_sgtcon_work( char norm, lapack_int n, const float* dl,
-                                const float* d, const float* du,
-                                const float* du2, const lapack_int* ipiv,
-                                float anorm, float* rcond, float* work,
-                                lapack_int* iwork );
-lapack_int LAPACKE_dgtcon_work( char norm, lapack_int n, const double* dl,
-                                const double* d, const double* du,
-                                const double* du2, const lapack_int* ipiv,
-                                double anorm, double* rcond, double* work,
-                                lapack_int* iwork );
-lapack_int LAPACKE_cgtcon_work( char norm, lapack_int n,
-                                const lapack_complex_float* dl,
-                                const lapack_complex_float* d,
-                                const lapack_complex_float* du,
-                                const lapack_complex_float* du2,
-                                const lapack_int* ipiv, float anorm,
-                                float* rcond, lapack_complex_float* work );
-lapack_int LAPACKE_zgtcon_work( char norm, lapack_int n,
-                                const lapack_complex_double* dl,
-                                const lapack_complex_double* d,
-                                const lapack_complex_double* du,
-                                const lapack_complex_double* du2,
-                                const lapack_int* ipiv, double anorm,
-                                double* rcond, lapack_complex_double* work );
-
-lapack_int LAPACKE_sgtrfs_work( int matrix_order, char trans, lapack_int n,
-                                lapack_int nrhs, const float* dl,
-                                const float* d, const float* du,
-                                const float* dlf, const float* df,
-                                const float* duf, const float* du2,
-                                const lapack_int* ipiv, const float* b,
-                                lapack_int ldb, float* x, lapack_int ldx,
-                                float* ferr, float* berr, float* work,
-                                lapack_int* iwork );
-lapack_int LAPACKE_dgtrfs_work( int matrix_order, char trans, lapack_int n,
-                                lapack_int nrhs, const double* dl,
-                                const double* d, const double* du,
-                                const double* dlf, const double* df,
-                                const double* duf, const double* du2,
-                                const lapack_int* ipiv, const double* b,
-                                lapack_int ldb, double* x, lapack_int ldx,
-                                double* ferr, double* berr, double* work,
-                                lapack_int* iwork );
-lapack_int LAPACKE_cgtrfs_work( int matrix_order, char trans, lapack_int n,
-                                lapack_int nrhs, const lapack_complex_float* dl,
-                                const lapack_complex_float* d,
-                                const lapack_complex_float* du,
-                                const lapack_complex_float* dlf,
-                                const lapack_complex_float* df,
-                                const lapack_complex_float* duf,
-                                const lapack_complex_float* du2,
-                                const lapack_int* ipiv,
-                                const lapack_complex_float* b, lapack_int ldb,
-                                lapack_complex_float* x, lapack_int ldx,
-                                float* ferr, float* berr,
-                                lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_zgtrfs_work( int matrix_order, char trans, lapack_int n,
-                                lapack_int nrhs,
-                                const lapack_complex_double* dl,
-                                const lapack_complex_double* d,
-                                const lapack_complex_double* du,
-                                const lapack_complex_double* dlf,
-                                const lapack_complex_double* df,
-                                const lapack_complex_double* duf,
-                                const lapack_complex_double* du2,
-                                const lapack_int* ipiv,
-                                const lapack_complex_double* b, lapack_int ldb,
-                                lapack_complex_double* x, lapack_int ldx,
-                                double* ferr, double* berr,
-                                lapack_complex_double* work, double* rwork );
-
-lapack_int LAPACKE_sgtsv_work( int matrix_order, lapack_int n, lapack_int nrhs,
-                               float* dl, float* d, float* du, float* b,
-                               lapack_int ldb );
-lapack_int LAPACKE_dgtsv_work( int matrix_order, lapack_int n, lapack_int nrhs,
-                               double* dl, double* d, double* du, double* b,
-                               lapack_int ldb );
-lapack_int LAPACKE_cgtsv_work( int matrix_order, lapack_int n, lapack_int nrhs,
-                               lapack_complex_float* dl,
-                               lapack_complex_float* d,
-                               lapack_complex_float* du,
-                               lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_zgtsv_work( int matrix_order, lapack_int n, lapack_int nrhs,
-                               lapack_complex_double* dl,
-                               lapack_complex_double* d,
-                               lapack_complex_double* du,
-                               lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_sgetf2_work(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda,
+                               lapack_int* ipiv);
+lapack_int LAPACKE_dgetf2_work(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda,
+                               lapack_int* ipiv);
+lapack_int LAPACKE_cgetf2_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                               lapack_int* ipiv);
+lapack_int LAPACKE_zgetf2_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                               lapack_int* ipiv);
 
-lapack_int LAPACKE_sgtsvx_work( int matrix_order, char fact, char trans,
-                                lapack_int n, lapack_int nrhs, const float* dl,
-                                const float* d, const float* du, float* dlf,
-                                float* df, float* duf, float* du2,
-                                lapack_int* ipiv, const float* b,
-                                lapack_int ldb, float* x, lapack_int ldx,
-                                float* rcond, float* ferr, float* berr,
-                                float* work, lapack_int* iwork );
-lapack_int LAPACKE_dgtsvx_work( int matrix_order, char fact, char trans,
-                                lapack_int n, lapack_int nrhs, const double* dl,
-                                const double* d, const double* du, double* dlf,
-                                double* df, double* duf, double* du2,
-                                lapack_int* ipiv, const double* b,
-                                lapack_int ldb, double* x, lapack_int ldx,
-                                double* rcond, double* ferr, double* berr,
-                                double* work, lapack_int* iwork );
-lapack_int LAPACKE_cgtsvx_work( int matrix_order, char fact, char trans,
-                                lapack_int n, lapack_int nrhs,
-                                const lapack_complex_float* dl,
-                                const lapack_complex_float* d,
-                                const lapack_complex_float* du,
-                                lapack_complex_float* dlf,
-                                lapack_complex_float* df,
-                                lapack_complex_float* duf,
-                                lapack_complex_float* du2, lapack_int* ipiv,
-                                const lapack_complex_float* b, lapack_int ldb,
-                                lapack_complex_float* x, lapack_int ldx,
-                                float* rcond, float* ferr, float* berr,
-                                lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_zgtsvx_work( int matrix_order, char fact, char trans,
-                                lapack_int n, lapack_int nrhs,
-                                const lapack_complex_double* dl,
-                                const lapack_complex_double* d,
-                                const lapack_complex_double* du,
-                                lapack_complex_double* dlf,
-                                lapack_complex_double* df,
-                                lapack_complex_double* duf,
-                                lapack_complex_double* du2, lapack_int* ipiv,
-                                const lapack_complex_double* b, lapack_int ldb,
-                                lapack_complex_double* x, lapack_int ldx,
-                                double* rcond, double* ferr, double* berr,
-                                lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_sgetrf_work(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda,
+                               lapack_int* ipiv);
+lapack_int LAPACKE_dgetrf_work(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda,
+                               lapack_int* ipiv);
+lapack_int LAPACKE_cgetrf_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                               lapack_int* ipiv);
+lapack_int LAPACKE_zgetrf_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                               lapack_int* ipiv);
 
-lapack_int LAPACKE_sgttrf_work( lapack_int n, float* dl, float* d, float* du,
-                                float* du2, lapack_int* ipiv );
-lapack_int LAPACKE_dgttrf_work( lapack_int n, double* dl, double* d, double* du,
-                                double* du2, lapack_int* ipiv );
-lapack_int LAPACKE_cgttrf_work( lapack_int n, lapack_complex_float* dl,
-                                lapack_complex_float* d,
-                                lapack_complex_float* du,
-                                lapack_complex_float* du2, lapack_int* ipiv );
-lapack_int LAPACKE_zgttrf_work( lapack_int n, lapack_complex_double* dl,
-                                lapack_complex_double* d,
-                                lapack_complex_double* du,
-                                lapack_complex_double* du2, lapack_int* ipiv );
+lapack_int LAPACKE_sgetri_work(int matrix_order, lapack_int n, float* a, lapack_int lda, const lapack_int* ipiv,
+                               float* work, lapack_int lwork);
+lapack_int LAPACKE_dgetri_work(int matrix_order, lapack_int n, double* a, lapack_int lda, const lapack_int* ipiv,
+                               double* work, lapack_int lwork);
+lapack_int LAPACKE_cgetri_work(int matrix_order, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                               const lapack_int* ipiv, lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_zgetri_work(int matrix_order, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                               const lapack_int* ipiv, lapack_complex_double* work, lapack_int lwork);
 
-lapack_int LAPACKE_sgttrs_work( int matrix_order, char trans, lapack_int n,
-                                lapack_int nrhs, const float* dl,
-                                const float* d, const float* du,
-                                const float* du2, const lapack_int* ipiv,
-                                float* b, lapack_int ldb );
-lapack_int LAPACKE_dgttrs_work( int matrix_order, char trans, lapack_int n,
-                                lapack_int nrhs, const double* dl,
-                                const double* d, const double* du,
-                                const double* du2, const lapack_int* ipiv,
-                                double* b, lapack_int ldb );
-lapack_int LAPACKE_cgttrs_work( int matrix_order, char trans, lapack_int n,
-                                lapack_int nrhs, const lapack_complex_float* dl,
-                                const lapack_complex_float* d,
-                                const lapack_complex_float* du,
-                                const lapack_complex_float* du2,
-                                const lapack_int* ipiv, lapack_complex_float* b,
-                                lapack_int ldb );
-lapack_int LAPACKE_zgttrs_work( int matrix_order, char trans, lapack_int n,
-                                lapack_int nrhs,
-                                const lapack_complex_double* dl,
-                                const lapack_complex_double* d,
-                                const lapack_complex_double* du,
-                                const lapack_complex_double* du2,
-                                const lapack_int* ipiv,
-                                lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_sgetrs_work(int matrix_order, char trans, lapack_int n, lapack_int nrhs, const float* a,
+                               lapack_int lda, const lapack_int* ipiv, float* b, lapack_int ldb);
+lapack_int LAPACKE_dgetrs_work(int matrix_order, char trans, lapack_int n, lapack_int nrhs, const double* a,
+                               lapack_int lda, const lapack_int* ipiv, double* b, lapack_int ldb);
+lapack_int LAPACKE_cgetrs_work(int matrix_order, char trans, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_float* a, lapack_int lda, const lapack_int* ipiv,
+                               lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zgetrs_work(int matrix_order, char trans, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_double* a, lapack_int lda, const lapack_int* ipiv,
+                               lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_chbev_work( int matrix_order, char jobz, char uplo,
-                               lapack_int n, lapack_int kd,
-                               lapack_complex_float* ab, lapack_int ldab,
-                               float* w, lapack_complex_float* z,
-                               lapack_int ldz, lapack_complex_float* work,
-                               float* rwork );
-lapack_int LAPACKE_zhbev_work( int matrix_order, char jobz, char uplo,
-                               lapack_int n, lapack_int kd,
-                               lapack_complex_double* ab, lapack_int ldab,
-                               double* w, lapack_complex_double* z,
-                               lapack_int ldz, lapack_complex_double* work,
-                               double* rwork );
+lapack_int LAPACKE_sggbak_work(int matrix_order, char job, char side, lapack_int n, lapack_int ilo, lapack_int ihi,
+                               const float* lscale, const float* rscale, lapack_int m, float* v, lapack_int ldv);
+lapack_int LAPACKE_dggbak_work(int matrix_order, char job, char side, lapack_int n, lapack_int ilo, lapack_int ihi,
+                               const double* lscale, const double* rscale, lapack_int m, double* v, lapack_int ldv);
+lapack_int LAPACKE_cggbak_work(int matrix_order, char job, char side, lapack_int n, lapack_int ilo, lapack_int ihi,
+                               const float* lscale, const float* rscale, lapack_int m, lapack_complex_float* v,
+                               lapack_int ldv);
+lapack_int LAPACKE_zggbak_work(int matrix_order, char job, char side, lapack_int n, lapack_int ilo, lapack_int ihi,
+                               const double* lscale, const double* rscale, lapack_int m, lapack_complex_double* v,
+                               lapack_int ldv);
 
-lapack_int LAPACKE_chbevd_work( int matrix_order, char jobz, char uplo,
-                                lapack_int n, lapack_int kd,
-                                lapack_complex_float* ab, lapack_int ldab,
-                                float* w, lapack_complex_float* z,
-                                lapack_int ldz, lapack_complex_float* work,
-                                lapack_int lwork, float* rwork,
-                                lapack_int lrwork, lapack_int* iwork,
-                                lapack_int liwork );
-lapack_int LAPACKE_zhbevd_work( int matrix_order, char jobz, char uplo,
-                                lapack_int n, lapack_int kd,
-                                lapack_complex_double* ab, lapack_int ldab,
-                                double* w, lapack_complex_double* z,
-                                lapack_int ldz, lapack_complex_double* work,
-                                lapack_int lwork, double* rwork,
-                                lapack_int lrwork, lapack_int* iwork,
-                                lapack_int liwork );
+lapack_int LAPACKE_sggbal_work(int matrix_order, char job, lapack_int n, float* a, lapack_int lda, float* b,
+                               lapack_int ldb, lapack_int* ilo, lapack_int* ihi, float* lscale, float* rscale,
+                               float* work);
+lapack_int LAPACKE_dggbal_work(int matrix_order, char job, lapack_int n, double* a, lapack_int lda, double* b,
+                               lapack_int ldb, lapack_int* ilo, lapack_int* ihi, double* lscale, double* rscale,
+                               double* work);
+lapack_int LAPACKE_cggbal_work(int matrix_order, char job, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                               lapack_complex_float* b, lapack_int ldb, lapack_int* ilo, lapack_int* ihi, float* lscale,
+                               float* rscale, float* work);
+lapack_int LAPACKE_zggbal_work(int matrix_order, char job, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                               lapack_complex_double* b, lapack_int ldb, lapack_int* ilo, lapack_int* ihi,
+                               double* lscale, double* rscale, double* work);
 
-lapack_int LAPACKE_chbevx_work( int matrix_order, char jobz, char range,
-                                char uplo, lapack_int n, lapack_int kd,
-                                lapack_complex_float* ab, lapack_int ldab,
-                                lapack_complex_float* q, lapack_int ldq,
-                                float vl, float vu, lapack_int il,
-                                lapack_int iu, float abstol, lapack_int* m,
-                                float* w, lapack_complex_float* z,
-                                lapack_int ldz, lapack_complex_float* work,
-                                float* rwork, lapack_int* iwork,
-                                lapack_int* ifail );
-lapack_int LAPACKE_zhbevx_work( int matrix_order, char jobz, char range,
-                                char uplo, lapack_int n, lapack_int kd,
-                                lapack_complex_double* ab, lapack_int ldab,
-                                lapack_complex_double* q, lapack_int ldq,
-                                double vl, double vu, lapack_int il,
-                                lapack_int iu, double abstol, lapack_int* m,
-                                double* w, lapack_complex_double* z,
-                                lapack_int ldz, lapack_complex_double* work,
-                                double* rwork, lapack_int* iwork,
-                                lapack_int* ifail );
+lapack_int LAPACKE_sgges_work(int matrix_order, char jobvsl, char jobvsr, char sort, LAPACK_S_SELECT3 selctg,
+                              lapack_int n, float* a, lapack_int lda, float* b, lapack_int ldb, lapack_int* sdim,
+                              float* alphar, float* alphai, float* beta, float* vsl, lapack_int ldvsl, float* vsr,
+                              lapack_int ldvsr, float* work, lapack_int lwork, lapack_logical* bwork);
+lapack_int LAPACKE_dgges_work(int matrix_order, char jobvsl, char jobvsr, char sort, LAPACK_D_SELECT3 selctg,
+                              lapack_int n, double* a, lapack_int lda, double* b, lapack_int ldb, lapack_int* sdim,
+                              double* alphar, double* alphai, double* beta, double* vsl, lapack_int ldvsl, double* vsr,
+                              lapack_int ldvsr, double* work, lapack_int lwork, lapack_logical* bwork);
+lapack_int LAPACKE_cgges_work(int matrix_order, char jobvsl, char jobvsr, char sort, LAPACK_C_SELECT2 selctg,
+                              lapack_int n, lapack_complex_float* a, lapack_int lda, lapack_complex_float* b,
+                              lapack_int ldb, lapack_int* sdim, lapack_complex_float* alpha, lapack_complex_float* beta,
+                              lapack_complex_float* vsl, lapack_int ldvsl, lapack_complex_float* vsr, lapack_int ldvsr,
+                              lapack_complex_float* work, lapack_int lwork, float* rwork, lapack_logical* bwork);
+lapack_int LAPACKE_zgges_work(int matrix_order, char jobvsl, char jobvsr, char sort, LAPACK_Z_SELECT2 selctg,
+                              lapack_int n, lapack_complex_double* a, lapack_int lda, lapack_complex_double* b,
+                              lapack_int ldb, lapack_int* sdim, lapack_complex_double* alpha,
+                              lapack_complex_double* beta, lapack_complex_double* vsl, lapack_int ldvsl,
+                              lapack_complex_double* vsr, lapack_int ldvsr, lapack_complex_double* work,
+                              lapack_int lwork, double* rwork, lapack_logical* bwork);
 
-lapack_int LAPACKE_chbgst_work( int matrix_order, char vect, char uplo,
-                                lapack_int n, lapack_int ka, lapack_int kb,
-                                lapack_complex_float* ab, lapack_int ldab,
-                                const lapack_complex_float* bb, lapack_int ldbb,
-                                lapack_complex_float* x, lapack_int ldx,
-                                lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_zhbgst_work( int matrix_order, char vect, char uplo,
-                                lapack_int n, lapack_int ka, lapack_int kb,
-                                lapack_complex_double* ab, lapack_int ldab,
-                                const lapack_complex_double* bb,
-                                lapack_int ldbb, lapack_complex_double* x,
-                                lapack_int ldx, lapack_complex_double* work,
-                                double* rwork );
+lapack_int LAPACKE_sggesx_work(int matrix_order, char jobvsl, char jobvsr, char sort, LAPACK_S_SELECT3 selctg,
+                               char sense, lapack_int n, float* a, lapack_int lda, float* b, lapack_int ldb,
+                               lapack_int* sdim, float* alphar, float* alphai, float* beta, float* vsl,
+                               lapack_int ldvsl, float* vsr, lapack_int ldvsr, float* rconde, float* rcondv,
+                               float* work, lapack_int lwork, lapack_int* iwork, lapack_int liwork,
+                               lapack_logical* bwork);
+lapack_int LAPACKE_dggesx_work(int matrix_order, char jobvsl, char jobvsr, char sort, LAPACK_D_SELECT3 selctg,
+                               char sense, lapack_int n, double* a, lapack_int lda, double* b, lapack_int ldb,
+                               lapack_int* sdim, double* alphar, double* alphai, double* beta, double* vsl,
+                               lapack_int ldvsl, double* vsr, lapack_int ldvsr, double* rconde, double* rcondv,
+                               double* work, lapack_int lwork, lapack_int* iwork, lapack_int liwork,
+                               lapack_logical* bwork);
+lapack_int LAPACKE_cggesx_work(int matrix_order, char jobvsl, char jobvsr, char sort, LAPACK_C_SELECT2 selctg,
+                               char sense, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                               lapack_complex_float* b, lapack_int ldb, lapack_int* sdim, lapack_complex_float* alpha,
+                               lapack_complex_float* beta, lapack_complex_float* vsl, lapack_int ldvsl,
+                               lapack_complex_float* vsr, lapack_int ldvsr, float* rconde, float* rcondv,
+                               lapack_complex_float* work, lapack_int lwork, float* rwork, lapack_int* iwork,
+                               lapack_int liwork, lapack_logical* bwork);
+lapack_int LAPACKE_zggesx_work(int matrix_order, char jobvsl, char jobvsr, char sort, LAPACK_Z_SELECT2 selctg,
+                               char sense, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                               lapack_complex_double* b, lapack_int ldb, lapack_int* sdim, lapack_complex_double* alpha,
+                               lapack_complex_double* beta, lapack_complex_double* vsl, lapack_int ldvsl,
+                               lapack_complex_double* vsr, lapack_int ldvsr, double* rconde, double* rcondv,
+                               lapack_complex_double* work, lapack_int lwork, double* rwork, lapack_int* iwork,
+                               lapack_int liwork, lapack_logical* bwork);
 
-lapack_int LAPACKE_chbgv_work( int matrix_order, char jobz, char uplo,
-                               lapack_int n, lapack_int ka, lapack_int kb,
-                               lapack_complex_float* ab, lapack_int ldab,
-                               lapack_complex_float* bb, lapack_int ldbb,
-                               float* w, lapack_complex_float* z,
-                               lapack_int ldz, lapack_complex_float* work,
-                               float* rwork );
-lapack_int LAPACKE_zhbgv_work( int matrix_order, char jobz, char uplo,
-                               lapack_int n, lapack_int ka, lapack_int kb,
-                               lapack_complex_double* ab, lapack_int ldab,
-                               lapack_complex_double* bb, lapack_int ldbb,
-                               double* w, lapack_complex_double* z,
-                               lapack_int ldz, lapack_complex_double* work,
-                               double* rwork );
+lapack_int LAPACKE_sggev_work(int matrix_order, char jobvl, char jobvr, lapack_int n, float* a, lapack_int lda,
+                              float* b, lapack_int ldb, float* alphar, float* alphai, float* beta, float* vl,
+                              lapack_int ldvl, float* vr, lapack_int ldvr, float* work, lapack_int lwork);
+lapack_int LAPACKE_dggev_work(int matrix_order, char jobvl, char jobvr, lapack_int n, double* a, lapack_int lda,
+                              double* b, lapack_int ldb, double* alphar, double* alphai, double* beta, double* vl,
+                              lapack_int ldvl, double* vr, lapack_int ldvr, double* work, lapack_int lwork);
+lapack_int LAPACKE_cggev_work(int matrix_order, char jobvl, char jobvr, lapack_int n, lapack_complex_float* a,
+                              lapack_int lda, lapack_complex_float* b, lapack_int ldb, lapack_complex_float* alpha,
+                              lapack_complex_float* beta, lapack_complex_float* vl, lapack_int ldvl,
+                              lapack_complex_float* vr, lapack_int ldvr, lapack_complex_float* work, lapack_int lwork,
+                              float* rwork);
+lapack_int LAPACKE_zggev_work(int matrix_order, char jobvl, char jobvr, lapack_int n, lapack_complex_double* a,
+                              lapack_int lda, lapack_complex_double* b, lapack_int ldb, lapack_complex_double* alpha,
+                              lapack_complex_double* beta, lapack_complex_double* vl, lapack_int ldvl,
+                              lapack_complex_double* vr, lapack_int ldvr, lapack_complex_double* work, lapack_int lwork,
+                              double* rwork);
 
-lapack_int LAPACKE_chbgvd_work( int matrix_order, char jobz, char uplo,
-                                lapack_int n, lapack_int ka, lapack_int kb,
-                                lapack_complex_float* ab, lapack_int ldab,
-                                lapack_complex_float* bb, lapack_int ldbb,
-                                float* w, lapack_complex_float* z,
-                                lapack_int ldz, lapack_complex_float* work,
-                                lapack_int lwork, float* rwork,
-                                lapack_int lrwork, lapack_int* iwork,
-                                lapack_int liwork );
-lapack_int LAPACKE_zhbgvd_work( int matrix_order, char jobz, char uplo,
-                                lapack_int n, lapack_int ka, lapack_int kb,
-                                lapack_complex_double* ab, lapack_int ldab,
-                                lapack_complex_double* bb, lapack_int ldbb,
-                                double* w, lapack_complex_double* z,
-                                lapack_int ldz, lapack_complex_double* work,
-                                lapack_int lwork, double* rwork,
-                                lapack_int lrwork, lapack_int* iwork,
-                                lapack_int liwork );
+lapack_int LAPACKE_sggevx_work(int matrix_order, char balanc, char jobvl, char jobvr, char sense, lapack_int n,
+                               float* a, lapack_int lda, float* b, lapack_int ldb, float* alphar, float* alphai,
+                               float* beta, float* vl, lapack_int ldvl, float* vr, lapack_int ldvr, lapack_int* ilo,
+                               lapack_int* ihi, float* lscale, float* rscale, float* abnrm, float* bbnrm, float* rconde,
+                               float* rcondv, float* work, lapack_int lwork, lapack_int* iwork, lapack_logical* bwork);
+lapack_int LAPACKE_dggevx_work(int matrix_order, char balanc, char jobvl, char jobvr, char sense, lapack_int n,
+                               double* a, lapack_int lda, double* b, lapack_int ldb, double* alphar, double* alphai,
+                               double* beta, double* vl, lapack_int ldvl, double* vr, lapack_int ldvr, lapack_int* ilo,
+                               lapack_int* ihi, double* lscale, double* rscale, double* abnrm, double* bbnrm,
+                               double* rconde, double* rcondv, double* work, lapack_int lwork, lapack_int* iwork,
+                               lapack_logical* bwork);
+lapack_int LAPACKE_cggevx_work(int matrix_order, char balanc, char jobvl, char jobvr, char sense, lapack_int n,
+                               lapack_complex_float* a, lapack_int lda, lapack_complex_float* b, lapack_int ldb,
+                               lapack_complex_float* alpha, lapack_complex_float* beta, lapack_complex_float* vl,
+                               lapack_int ldvl, lapack_complex_float* vr, lapack_int ldvr, lapack_int* ilo,
+                               lapack_int* ihi, float* lscale, float* rscale, float* abnrm, float* bbnrm, float* rconde,
+                               float* rcondv, lapack_complex_float* work, lapack_int lwork, float* rwork,
+                               lapack_int* iwork, lapack_logical* bwork);
+lapack_int LAPACKE_zggevx_work(int matrix_order, char balanc, char jobvl, char jobvr, char sense, lapack_int n,
+                               lapack_complex_double* a, lapack_int lda, lapack_complex_double* b, lapack_int ldb,
+                               lapack_complex_double* alpha, lapack_complex_double* beta, lapack_complex_double* vl,
+                               lapack_int ldvl, lapack_complex_double* vr, lapack_int ldvr, lapack_int* ilo,
+                               lapack_int* ihi, double* lscale, double* rscale, double* abnrm, double* bbnrm,
+                               double* rconde, double* rcondv, lapack_complex_double* work, lapack_int lwork,
+                               double* rwork, lapack_int* iwork, lapack_logical* bwork);
 
-lapack_int LAPACKE_chbgvx_work( int matrix_order, char jobz, char range,
-                                char uplo, lapack_int n, lapack_int ka,
-                                lapack_int kb, lapack_complex_float* ab,
-                                lapack_int ldab, lapack_complex_float* bb,
-                                lapack_int ldbb, lapack_complex_float* q,
-                                lapack_int ldq, float vl, float vu,
-                                lapack_int il, lapack_int iu, float abstol,
-                                lapack_int* m, float* w,
-                                lapack_complex_float* z, lapack_int ldz,
-                                lapack_complex_float* work, float* rwork,
-                                lapack_int* iwork, lapack_int* ifail );
-lapack_int LAPACKE_zhbgvx_work( int matrix_order, char jobz, char range,
-                                char uplo, lapack_int n, lapack_int ka,
-                                lapack_int kb, lapack_complex_double* ab,
-                                lapack_int ldab, lapack_complex_double* bb,
-                                lapack_int ldbb, lapack_complex_double* q,
-                                lapack_int ldq, double vl, double vu,
-                                lapack_int il, lapack_int iu, double abstol,
-                                lapack_int* m, double* w,
-                                lapack_complex_double* z, lapack_int ldz,
-                                lapack_complex_double* work, double* rwork,
-                                lapack_int* iwork, lapack_int* ifail );
+lapack_int LAPACKE_sggglm_work(int matrix_order, lapack_int n, lapack_int m, lapack_int p, float* a, lapack_int lda,
+                               float* b, lapack_int ldb, float* d, float* x, float* y, float* work, lapack_int lwork);
+lapack_int LAPACKE_dggglm_work(int matrix_order, lapack_int n, lapack_int m, lapack_int p, double* a, lapack_int lda,
+                               double* b, lapack_int ldb, double* d, double* x, double* y, double* work,
+                               lapack_int lwork);
+lapack_int LAPACKE_cggglm_work(int matrix_order, lapack_int n, lapack_int m, lapack_int p, lapack_complex_float* a,
+                               lapack_int lda, lapack_complex_float* b, lapack_int ldb, lapack_complex_float* d,
+                               lapack_complex_float* x, lapack_complex_float* y, lapack_complex_float* work,
+                               lapack_int lwork);
+lapack_int LAPACKE_zggglm_work(int matrix_order, lapack_int n, lapack_int m, lapack_int p, lapack_complex_double* a,
+                               lapack_int lda, lapack_complex_double* b, lapack_int ldb, lapack_complex_double* d,
+                               lapack_complex_double* x, lapack_complex_double* y, lapack_complex_double* work,
+                               lapack_int lwork);
 
-lapack_int LAPACKE_chbtrd_work( int matrix_order, char vect, char uplo,
-                                lapack_int n, lapack_int kd,
-                                lapack_complex_float* ab, lapack_int ldab,
-                                float* d, float* e, lapack_complex_float* q,
-                                lapack_int ldq, lapack_complex_float* work );
-lapack_int LAPACKE_zhbtrd_work( int matrix_order, char vect, char uplo,
-                                lapack_int n, lapack_int kd,
-                                lapack_complex_double* ab, lapack_int ldab,
-                                double* d, double* e, lapack_complex_double* q,
-                                lapack_int ldq, lapack_complex_double* work );
+lapack_int LAPACKE_sgghrd_work(int matrix_order, char compq, char compz, lapack_int n, lapack_int ilo, lapack_int ihi,
+                               float* a, lapack_int lda, float* b, lapack_int ldb, float* q, lapack_int ldq, float* z,
+                               lapack_int ldz);
+lapack_int LAPACKE_dgghrd_work(int matrix_order, char compq, char compz, lapack_int n, lapack_int ilo, lapack_int ihi,
+                               double* a, lapack_int lda, double* b, lapack_int ldb, double* q, lapack_int ldq,
+                               double* z, lapack_int ldz);
+lapack_int LAPACKE_cgghrd_work(int matrix_order, char compq, char compz, lapack_int n, lapack_int ilo, lapack_int ihi,
+                               lapack_complex_float* a, lapack_int lda, lapack_complex_float* b, lapack_int ldb,
+                               lapack_complex_float* q, lapack_int ldq, lapack_complex_float* z, lapack_int ldz);
+lapack_int LAPACKE_zgghrd_work(int matrix_order, char compq, char compz, lapack_int n, lapack_int ilo, lapack_int ihi,
+                               lapack_complex_double* a, lapack_int lda, lapack_complex_double* b, lapack_int ldb,
+                               lapack_complex_double* q, lapack_int ldq, lapack_complex_double* z, lapack_int ldz);
 
-lapack_int LAPACKE_checon_work( int matrix_order, char uplo, lapack_int n,
-                                const lapack_complex_float* a, lapack_int lda,
-                                const lapack_int* ipiv, float anorm,
-                                float* rcond, lapack_complex_float* work );
-lapack_int LAPACKE_zhecon_work( int matrix_order, char uplo, lapack_int n,
-                                const lapack_complex_double* a, lapack_int lda,
-                                const lapack_int* ipiv, double anorm,
-                                double* rcond, lapack_complex_double* work );
+lapack_int LAPACKE_sgglse_work(int matrix_order, lapack_int m, lapack_int n, lapack_int p, float* a, lapack_int lda,
+                               float* b, lapack_int ldb, float* c, float* d, float* x, float* work, lapack_int lwork);
+lapack_int LAPACKE_dgglse_work(int matrix_order, lapack_int m, lapack_int n, lapack_int p, double* a, lapack_int lda,
+                               double* b, lapack_int ldb, double* c, double* d, double* x, double* work,
+                               lapack_int lwork);
+lapack_int LAPACKE_cgglse_work(int matrix_order, lapack_int m, lapack_int n, lapack_int p, lapack_complex_float* a,
+                               lapack_int lda, lapack_complex_float* b, lapack_int ldb, lapack_complex_float* c,
+                               lapack_complex_float* d, lapack_complex_float* x, lapack_complex_float* work,
+                               lapack_int lwork);
+lapack_int LAPACKE_zgglse_work(int matrix_order, lapack_int m, lapack_int n, lapack_int p, lapack_complex_double* a,
+                               lapack_int lda, lapack_complex_double* b, lapack_int ldb, lapack_complex_double* c,
+                               lapack_complex_double* d, lapack_complex_double* x, lapack_complex_double* work,
+                               lapack_int lwork);
 
-lapack_int LAPACKE_cheequb_work( int matrix_order, char uplo, lapack_int n,
-                                 const lapack_complex_float* a, lapack_int lda,
-                                 float* s, float* scond, float* amax,
-                                 lapack_complex_float* work );
-lapack_int LAPACKE_zheequb_work( int matrix_order, char uplo, lapack_int n,
-                                 const lapack_complex_double* a, lapack_int lda,
-                                 double* s, double* scond, double* amax,
-                                 lapack_complex_double* work );
+lapack_int LAPACKE_sggqrf_work(int matrix_order, lapack_int n, lapack_int m, lapack_int p, float* a, lapack_int lda,
+                               float* taua, float* b, lapack_int ldb, float* taub, float* work, lapack_int lwork);
+lapack_int LAPACKE_dggqrf_work(int matrix_order, lapack_int n, lapack_int m, lapack_int p, double* a, lapack_int lda,
+                               double* taua, double* b, lapack_int ldb, double* taub, double* work, lapack_int lwork);
+lapack_int LAPACKE_cggqrf_work(int matrix_order, lapack_int n, lapack_int m, lapack_int p, lapack_complex_float* a,
+                               lapack_int lda, lapack_complex_float* taua, lapack_complex_float* b, lapack_int ldb,
+                               lapack_complex_float* taub, lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_zggqrf_work(int matrix_order, lapack_int n, lapack_int m, lapack_int p, lapack_complex_double* a,
+                               lapack_int lda, lapack_complex_double* taua, lapack_complex_double* b, lapack_int ldb,
+                               lapack_complex_double* taub, lapack_complex_double* work, lapack_int lwork);
 
-lapack_int LAPACKE_cheev_work( int matrix_order, char jobz, char uplo,
-                               lapack_int n, lapack_complex_float* a,
-                               lapack_int lda, float* w,
-                               lapack_complex_float* work, lapack_int lwork,
-                               float* rwork );
-lapack_int LAPACKE_zheev_work( int matrix_order, char jobz, char uplo,
-                               lapack_int n, lapack_complex_double* a,
-                               lapack_int lda, double* w,
-                               lapack_complex_double* work, lapack_int lwork,
-                               double* rwork );
+lapack_int LAPACKE_sggrqf_work(int matrix_order, lapack_int m, lapack_int p, lapack_int n, float* a, lapack_int lda,
+                               float* taua, float* b, lapack_int ldb, float* taub, float* work, lapack_int lwork);
+lapack_int LAPACKE_dggrqf_work(int matrix_order, lapack_int m, lapack_int p, lapack_int n, double* a, lapack_int lda,
+                               double* taua, double* b, lapack_int ldb, double* taub, double* work, lapack_int lwork);
+lapack_int LAPACKE_cggrqf_work(int matrix_order, lapack_int m, lapack_int p, lapack_int n, lapack_complex_float* a,
+                               lapack_int lda, lapack_complex_float* taua, lapack_complex_float* b, lapack_int ldb,
+                               lapack_complex_float* taub, lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_zggrqf_work(int matrix_order, lapack_int m, lapack_int p, lapack_int n, lapack_complex_double* a,
+                               lapack_int lda, lapack_complex_double* taua, lapack_complex_double* b, lapack_int ldb,
+                               lapack_complex_double* taub, lapack_complex_double* work, lapack_int lwork);
 
-lapack_int LAPACKE_cheevd_work( int matrix_order, char jobz, char uplo,
-                                lapack_int n, lapack_complex_float* a,
-                                lapack_int lda, float* w,
-                                lapack_complex_float* work, lapack_int lwork,
-                                float* rwork, lapack_int lrwork,
-                                lapack_int* iwork, lapack_int liwork );
-lapack_int LAPACKE_zheevd_work( int matrix_order, char jobz, char uplo,
-                                lapack_int n, lapack_complex_double* a,
-                                lapack_int lda, double* w,
-                                lapack_complex_double* work, lapack_int lwork,
-                                double* rwork, lapack_int lrwork,
-                                lapack_int* iwork, lapack_int liwork );
+lapack_int LAPACKE_sggsvd_work(int matrix_order, char jobu, char jobv, char jobq, lapack_int m, lapack_int n,
+                               lapack_int p, lapack_int* k, lapack_int* l, float* a, lapack_int lda, float* b,
+                               lapack_int ldb, float* alpha, float* beta, float* u, lapack_int ldu, float* v,
+                               lapack_int ldv, float* q, lapack_int ldq, float* work, lapack_int* iwork);
+lapack_int LAPACKE_dggsvd_work(int matrix_order, char jobu, char jobv, char jobq, lapack_int m, lapack_int n,
+                               lapack_int p, lapack_int* k, lapack_int* l, double* a, lapack_int lda, double* b,
+                               lapack_int ldb, double* alpha, double* beta, double* u, lapack_int ldu, double* v,
+                               lapack_int ldv, double* q, lapack_int ldq, double* work, lapack_int* iwork);
+lapack_int LAPACKE_cggsvd_work(int matrix_order, char jobu, char jobv, char jobq, lapack_int m, lapack_int n,
+                               lapack_int p, lapack_int* k, lapack_int* l, lapack_complex_float* a, lapack_int lda,
+                               lapack_complex_float* b, lapack_int ldb, float* alpha, float* beta,
+                               lapack_complex_float* u, lapack_int ldu, lapack_complex_float* v, lapack_int ldv,
+                               lapack_complex_float* q, lapack_int ldq, lapack_complex_float* work, float* rwork,
+                               lapack_int* iwork);
+lapack_int LAPACKE_zggsvd_work(int matrix_order, char jobu, char jobv, char jobq, lapack_int m, lapack_int n,
+                               lapack_int p, lapack_int* k, lapack_int* l, lapack_complex_double* a, lapack_int lda,
+                               lapack_complex_double* b, lapack_int ldb, double* alpha, double* beta,
+                               lapack_complex_double* u, lapack_int ldu, lapack_complex_double* v, lapack_int ldv,
+                               lapack_complex_double* q, lapack_int ldq, lapack_complex_double* work, double* rwork,
+                               lapack_int* iwork);
 
-lapack_int LAPACKE_cheevr_work( int matrix_order, char jobz, char range,
-                                char uplo, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                float vl, float vu, lapack_int il,
-                                lapack_int iu, float abstol, lapack_int* m,
-                                float* w, lapack_complex_float* z,
-                                lapack_int ldz, lapack_int* isuppz,
-                                lapack_complex_float* work, lapack_int lwork,
-                                float* rwork, lapack_int lrwork,
-                                lapack_int* iwork, lapack_int liwork );
-lapack_int LAPACKE_zheevr_work( int matrix_order, char jobz, char range,
-                                char uplo, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                double vl, double vu, lapack_int il,
-                                lapack_int iu, double abstol, lapack_int* m,
-                                double* w, lapack_complex_double* z,
-                                lapack_int ldz, lapack_int* isuppz,
-                                lapack_complex_double* work, lapack_int lwork,
-                                double* rwork, lapack_int lrwork,
-                                lapack_int* iwork, lapack_int liwork );
+lapack_int LAPACKE_sggsvp_work(int matrix_order, char jobu, char jobv, char jobq, lapack_int m, lapack_int p,
+                               lapack_int n, float* a, lapack_int lda, float* b, lapack_int ldb, float tola, float tolb,
+                               lapack_int* k, lapack_int* l, float* u, lapack_int ldu, float* v, lapack_int ldv,
+                               float* q, lapack_int ldq, lapack_int* iwork, float* tau, float* work);
+lapack_int LAPACKE_dggsvp_work(int matrix_order, char jobu, char jobv, char jobq, lapack_int m, lapack_int p,
+                               lapack_int n, double* a, lapack_int lda, double* b, lapack_int ldb, double tola,
+                               double tolb, lapack_int* k, lapack_int* l, double* u, lapack_int ldu, double* v,
+                               lapack_int ldv, double* q, lapack_int ldq, lapack_int* iwork, double* tau, double* work);
+lapack_int LAPACKE_cggsvp_work(int matrix_order, char jobu, char jobv, char jobq, lapack_int m, lapack_int p,
+                               lapack_int n, lapack_complex_float* a, lapack_int lda, lapack_complex_float* b,
+                               lapack_int ldb, float tola, float tolb, lapack_int* k, lapack_int* l,
+                               lapack_complex_float* u, lapack_int ldu, lapack_complex_float* v, lapack_int ldv,
+                               lapack_complex_float* q, lapack_int ldq, lapack_int* iwork, float* rwork,
+                               lapack_complex_float* tau, lapack_complex_float* work);
+lapack_int LAPACKE_zggsvp_work(int matrix_order, char jobu, char jobv, char jobq, lapack_int m, lapack_int p,
+                               lapack_int n, lapack_complex_double* a, lapack_int lda, lapack_complex_double* b,
+                               lapack_int ldb, double tola, double tolb, lapack_int* k, lapack_int* l,
+                               lapack_complex_double* u, lapack_int ldu, lapack_complex_double* v, lapack_int ldv,
+                               lapack_complex_double* q, lapack_int ldq, lapack_int* iwork, double* rwork,
+                               lapack_complex_double* tau, lapack_complex_double* work);
 
-lapack_int LAPACKE_cheevx_work( int matrix_order, char jobz, char range,
-                                char uplo, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                float vl, float vu, lapack_int il,
-                                lapack_int iu, float abstol, lapack_int* m,
-                                float* w, lapack_complex_float* z,
-                                lapack_int ldz, lapack_complex_float* work,
-                                lapack_int lwork, float* rwork,
-                                lapack_int* iwork, lapack_int* ifail );
-lapack_int LAPACKE_zheevx_work( int matrix_order, char jobz, char range,
-                                char uplo, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                double vl, double vu, lapack_int il,
-                                lapack_int iu, double abstol, lapack_int* m,
-                                double* w, lapack_complex_double* z,
-                                lapack_int ldz, lapack_complex_double* work,
-                                lapack_int lwork, double* rwork,
-                                lapack_int* iwork, lapack_int* ifail );
+lapack_int LAPACKE_sgtcon_work(char norm, lapack_int n, const float* dl, const float* d, const float* du,
+                               const float* du2, const lapack_int* ipiv, float anorm, float* rcond, float* work,
+                               lapack_int* iwork);
+lapack_int LAPACKE_dgtcon_work(char norm, lapack_int n, const double* dl, const double* d, const double* du,
+                               const double* du2, const lapack_int* ipiv, double anorm, double* rcond, double* work,
+                               lapack_int* iwork);
+lapack_int LAPACKE_cgtcon_work(char norm, lapack_int n, const lapack_complex_float* dl, const lapack_complex_float* d,
+                               const lapack_complex_float* du, const lapack_complex_float* du2, const lapack_int* ipiv,
+                               float anorm, float* rcond, lapack_complex_float* work);
+lapack_int LAPACKE_zgtcon_work(char norm, lapack_int n, const lapack_complex_double* dl, const lapack_complex_double* d,
+                               const lapack_complex_double* du, const lapack_complex_double* du2,
+                               const lapack_int* ipiv, double anorm, double* rcond, lapack_complex_double* work);
 
-lapack_int LAPACKE_chegst_work( int matrix_order, lapack_int itype, char uplo,
-                                lapack_int n, lapack_complex_float* a,
-                                lapack_int lda, const lapack_complex_float* b,
-                                lapack_int ldb );
-lapack_int LAPACKE_zhegst_work( int matrix_order, lapack_int itype, char uplo,
-                                lapack_int n, lapack_complex_double* a,
-                                lapack_int lda, const lapack_complex_double* b,
-                                lapack_int ldb );
+lapack_int LAPACKE_sgtrfs_work(int matrix_order, char trans, lapack_int n, lapack_int nrhs, const float* dl,
+                               const float* d, const float* du, const float* dlf, const float* df, const float* duf,
+                               const float* du2, const lapack_int* ipiv, const float* b, lapack_int ldb, float* x,
+                               lapack_int ldx, float* ferr, float* berr, float* work, lapack_int* iwork);
+lapack_int LAPACKE_dgtrfs_work(int matrix_order, char trans, lapack_int n, lapack_int nrhs, const double* dl,
+                               const double* d, const double* du, const double* dlf, const double* df,
+                               const double* duf, const double* du2, const lapack_int* ipiv, const double* b,
+                               lapack_int ldb, double* x, lapack_int ldx, double* ferr, double* berr, double* work,
+                               lapack_int* iwork);
+lapack_int LAPACKE_cgtrfs_work(int matrix_order, char trans, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_float* dl, const lapack_complex_float* d,
+                               const lapack_complex_float* du, const lapack_complex_float* dlf,
+                               const lapack_complex_float* df, const lapack_complex_float* duf,
+                               const lapack_complex_float* du2, const lapack_int* ipiv, const lapack_complex_float* b,
+                               lapack_int ldb, lapack_complex_float* x, lapack_int ldx, float* ferr, float* berr,
+                               lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zgtrfs_work(int matrix_order, char trans, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_double* dl, const lapack_complex_double* d,
+                               const lapack_complex_double* du, const lapack_complex_double* dlf,
+                               const lapack_complex_double* df, const lapack_complex_double* duf,
+                               const lapack_complex_double* du2, const lapack_int* ipiv, const lapack_complex_double* b,
+                               lapack_int ldb, lapack_complex_double* x, lapack_int ldx, double* ferr, double* berr,
+                               lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_chegv_work( int matrix_order, lapack_int itype, char jobz,
-                               char uplo, lapack_int n, lapack_complex_float* a,
-                               lapack_int lda, lapack_complex_float* b,
-                               lapack_int ldb, float* w,
-                               lapack_complex_float* work, lapack_int lwork,
-                               float* rwork );
-lapack_int LAPACKE_zhegv_work( int matrix_order, lapack_int itype, char jobz,
-                               char uplo, lapack_int n,
-                               lapack_complex_double* a, lapack_int lda,
-                               lapack_complex_double* b, lapack_int ldb,
-                               double* w, lapack_complex_double* work,
-                               lapack_int lwork, double* rwork );
+lapack_int LAPACKE_sgtsv_work(int matrix_order, lapack_int n, lapack_int nrhs, float* dl, float* d, float* du, float* b,
+                              lapack_int ldb);
+lapack_int LAPACKE_dgtsv_work(int matrix_order, lapack_int n, lapack_int nrhs, double* dl, double* d, double* du,
+                              double* b, lapack_int ldb);
+lapack_int LAPACKE_cgtsv_work(int matrix_order, lapack_int n, lapack_int nrhs, lapack_complex_float* dl,
+                              lapack_complex_float* d, lapack_complex_float* du, lapack_complex_float* b,
+                              lapack_int ldb);
+lapack_int LAPACKE_zgtsv_work(int matrix_order, lapack_int n, lapack_int nrhs, lapack_complex_double* dl,
+                              lapack_complex_double* d, lapack_complex_double* du, lapack_complex_double* b,
+                              lapack_int ldb);
 
-lapack_int LAPACKE_chegvd_work( int matrix_order, lapack_int itype, char jobz,
-                                char uplo, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_complex_float* b, lapack_int ldb,
-                                float* w, lapack_complex_float* work,
-                                lapack_int lwork, float* rwork,
-                                lapack_int lrwork, lapack_int* iwork,
-                                lapack_int liwork );
-lapack_int LAPACKE_zhegvd_work( int matrix_order, lapack_int itype, char jobz,
-                                char uplo, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_complex_double* b, lapack_int ldb,
-                                double* w, lapack_complex_double* work,
-                                lapack_int lwork, double* rwork,
-                                lapack_int lrwork, lapack_int* iwork,
-                                lapack_int liwork );
+lapack_int LAPACKE_sgtsvx_work(int matrix_order, char fact, char trans, lapack_int n, lapack_int nrhs, const float* dl,
+                               const float* d, const float* du, float* dlf, float* df, float* duf, float* du2,
+                               lapack_int* ipiv, const float* b, lapack_int ldb, float* x, lapack_int ldx, float* rcond,
+                               float* ferr, float* berr, float* work, lapack_int* iwork);
+lapack_int LAPACKE_dgtsvx_work(int matrix_order, char fact, char trans, lapack_int n, lapack_int nrhs, const double* dl,
+                               const double* d, const double* du, double* dlf, double* df, double* duf, double* du2,
+                               lapack_int* ipiv, const double* b, lapack_int ldb, double* x, lapack_int ldx,
+                               double* rcond, double* ferr, double* berr, double* work, lapack_int* iwork);
+lapack_int LAPACKE_cgtsvx_work(int matrix_order, char fact, char trans, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_float* dl, const lapack_complex_float* d,
+                               const lapack_complex_float* du, lapack_complex_float* dlf, lapack_complex_float* df,
+                               lapack_complex_float* duf, lapack_complex_float* du2, lapack_int* ipiv,
+                               const lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x, lapack_int ldx,
+                               float* rcond, float* ferr, float* berr, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zgtsvx_work(int matrix_order, char fact, char trans, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_double* dl, const lapack_complex_double* d,
+                               const lapack_complex_double* du, lapack_complex_double* dlf, lapack_complex_double* df,
+                               lapack_complex_double* duf, lapack_complex_double* du2, lapack_int* ipiv,
+                               const lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x, lapack_int ldx,
+                               double* rcond, double* ferr, double* berr, lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_chegvx_work( int matrix_order, lapack_int itype, char jobz,
-                                char range, char uplo, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_complex_float* b, lapack_int ldb,
-                                float vl, float vu, lapack_int il,
-                                lapack_int iu, float abstol, lapack_int* m,
-                                float* w, lapack_complex_float* z,
-                                lapack_int ldz, lapack_complex_float* work,
-                                lapack_int lwork, float* rwork,
-                                lapack_int* iwork, lapack_int* ifail );
-lapack_int LAPACKE_zhegvx_work( int matrix_order, lapack_int itype, char jobz,
-                                char range, char uplo, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_complex_double* b, lapack_int ldb,
-                                double vl, double vu, lapack_int il,
-                                lapack_int iu, double abstol, lapack_int* m,
-                                double* w, lapack_complex_double* z,
-                                lapack_int ldz, lapack_complex_double* work,
-                                lapack_int lwork, double* rwork,
-                                lapack_int* iwork, lapack_int* ifail );
+lapack_int LAPACKE_sgttrf_work(lapack_int n, float* dl, float* d, float* du, float* du2, lapack_int* ipiv);
+lapack_int LAPACKE_dgttrf_work(lapack_int n, double* dl, double* d, double* du, double* du2, lapack_int* ipiv);
+lapack_int LAPACKE_cgttrf_work(lapack_int n, lapack_complex_float* dl, lapack_complex_float* d,
+                               lapack_complex_float* du, lapack_complex_float* du2, lapack_int* ipiv);
+lapack_int LAPACKE_zgttrf_work(lapack_int n, lapack_complex_double* dl, lapack_complex_double* d,
+                               lapack_complex_double* du, lapack_complex_double* du2, lapack_int* ipiv);
 
-lapack_int LAPACKE_cherfs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const lapack_complex_float* a,
-                                lapack_int lda, const lapack_complex_float* af,
-                                lapack_int ldaf, const lapack_int* ipiv,
-                                const lapack_complex_float* b, lapack_int ldb,
-                                lapack_complex_float* x, lapack_int ldx,
-                                float* ferr, float* berr,
-                                lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_zherfs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const lapack_complex_double* a,
-                                lapack_int lda, const lapack_complex_double* af,
-                                lapack_int ldaf, const lapack_int* ipiv,
-                                const lapack_complex_double* b, lapack_int ldb,
-                                lapack_complex_double* x, lapack_int ldx,
-                                double* ferr, double* berr,
-                                lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_sgttrs_work(int matrix_order, char trans, lapack_int n, lapack_int nrhs, const float* dl,
+                               const float* d, const float* du, const float* du2, const lapack_int* ipiv, float* b,
+                               lapack_int ldb);
+lapack_int LAPACKE_dgttrs_work(int matrix_order, char trans, lapack_int n, lapack_int nrhs, const double* dl,
+                               const double* d, const double* du, const double* du2, const lapack_int* ipiv, double* b,
+                               lapack_int ldb);
+lapack_int LAPACKE_cgttrs_work(int matrix_order, char trans, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_float* dl, const lapack_complex_float* d,
+                               const lapack_complex_float* du, const lapack_complex_float* du2, const lapack_int* ipiv,
+                               lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zgttrs_work(int matrix_order, char trans, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_double* dl, const lapack_complex_double* d,
+                               const lapack_complex_double* du, const lapack_complex_double* du2,
+                               const lapack_int* ipiv, lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_cherfsx_work( int matrix_order, char uplo, char equed,
-                                 lapack_int n, lapack_int nrhs,
-                                 const lapack_complex_float* a, lapack_int lda,
-                                 const lapack_complex_float* af,
-                                 lapack_int ldaf, const lapack_int* ipiv,
-                                 const float* s, const lapack_complex_float* b,
-                                 lapack_int ldb, lapack_complex_float* x,
-                                 lapack_int ldx, float* rcond, float* berr,
-                                 lapack_int n_err_bnds, float* err_bnds_norm,
-                                 float* err_bnds_comp, lapack_int nparams,
-                                 float* params, lapack_complex_float* work,
-                                 float* rwork );
-lapack_int LAPACKE_zherfsx_work( int matrix_order, char uplo, char equed,
-                                 lapack_int n, lapack_int nrhs,
-                                 const lapack_complex_double* a, lapack_int lda,
-                                 const lapack_complex_double* af,
-                                 lapack_int ldaf, const lapack_int* ipiv,
-                                 const double* s,
-                                 const lapack_complex_double* b, lapack_int ldb,
-                                 lapack_complex_double* x, lapack_int ldx,
-                                 double* rcond, double* berr,
-                                 lapack_int n_err_bnds, double* err_bnds_norm,
-                                 double* err_bnds_comp, lapack_int nparams,
-                                 double* params, lapack_complex_double* work,
-                                 double* rwork );
+lapack_int LAPACKE_chbev_work(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int kd,
+                              lapack_complex_float* ab, lapack_int ldab, float* w, lapack_complex_float* z,
+                              lapack_int ldz, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zhbev_work(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int kd,
+                              lapack_complex_double* ab, lapack_int ldab, double* w, lapack_complex_double* z,
+                              lapack_int ldz, lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_chesv_work( int matrix_order, char uplo, lapack_int n,
-                               lapack_int nrhs, lapack_complex_float* a,
-                               lapack_int lda, lapack_int* ipiv,
-                               lapack_complex_float* b, lapack_int ldb,
-                               lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zhesv_work( int matrix_order, char uplo, lapack_int n,
-                               lapack_int nrhs, lapack_complex_double* a,
-                               lapack_int lda, lapack_int* ipiv,
-                               lapack_complex_double* b, lapack_int ldb,
-                               lapack_complex_double* work, lapack_int lwork );
+lapack_int LAPACKE_chbevd_work(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int kd,
+                               lapack_complex_float* ab, lapack_int ldab, float* w, lapack_complex_float* z,
+                               lapack_int ldz, lapack_complex_float* work, lapack_int lwork, float* rwork,
+                               lapack_int lrwork, lapack_int* iwork, lapack_int liwork);
+lapack_int LAPACKE_zhbevd_work(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int kd,
+                               lapack_complex_double* ab, lapack_int ldab, double* w, lapack_complex_double* z,
+                               lapack_int ldz, lapack_complex_double* work, lapack_int lwork, double* rwork,
+                               lapack_int lrwork, lapack_int* iwork, lapack_int liwork);
 
-lapack_int LAPACKE_chesvx_work( int matrix_order, char fact, char uplo,
-                                lapack_int n, lapack_int nrhs,
-                                const lapack_complex_float* a, lapack_int lda,
-                                lapack_complex_float* af, lapack_int ldaf,
-                                lapack_int* ipiv, const lapack_complex_float* b,
-                                lapack_int ldb, lapack_complex_float* x,
-                                lapack_int ldx, float* rcond, float* ferr,
-                                float* berr, lapack_complex_float* work,
-                                lapack_int lwork, float* rwork );
-lapack_int LAPACKE_zhesvx_work( int matrix_order, char fact, char uplo,
-                                lapack_int n, lapack_int nrhs,
-                                const lapack_complex_double* a, lapack_int lda,
-                                lapack_complex_double* af, lapack_int ldaf,
-                                lapack_int* ipiv,
-                                const lapack_complex_double* b, lapack_int ldb,
-                                lapack_complex_double* x, lapack_int ldx,
-                                double* rcond, double* ferr, double* berr,
-                                lapack_complex_double* work, lapack_int lwork,
-                                double* rwork );
+lapack_int LAPACKE_chbevx_work(int matrix_order, char jobz, char range, char uplo, lapack_int n, lapack_int kd,
+                               lapack_complex_float* ab, lapack_int ldab, lapack_complex_float* q, lapack_int ldq,
+                               float vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int* m, float* w,
+                               lapack_complex_float* z, lapack_int ldz, lapack_complex_float* work, float* rwork,
+                               lapack_int* iwork, lapack_int* ifail);
+lapack_int LAPACKE_zhbevx_work(int matrix_order, char jobz, char range, char uplo, lapack_int n, lapack_int kd,
+                               lapack_complex_double* ab, lapack_int ldab, lapack_complex_double* q, lapack_int ldq,
+                               double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int* m,
+                               double* w, lapack_complex_double* z, lapack_int ldz, lapack_complex_double* work,
+                               double* rwork, lapack_int* iwork, lapack_int* ifail);
 
-lapack_int LAPACKE_chesvxx_work( int matrix_order, char fact, char uplo,
-                                 lapack_int n, lapack_int nrhs,
-                                 lapack_complex_float* a, lapack_int lda,
-                                 lapack_complex_float* af, lapack_int ldaf,
-                                 lapack_int* ipiv, char* equed, float* s,
-                                 lapack_complex_float* b, lapack_int ldb,
-                                 lapack_complex_float* x, lapack_int ldx,
-                                 float* rcond, float* rpvgrw, float* berr,
-                                 lapack_int n_err_bnds, float* err_bnds_norm,
-                                 float* err_bnds_comp, lapack_int nparams,
-                                 float* params, lapack_complex_float* work,
-                                 float* rwork );
-lapack_int LAPACKE_zhesvxx_work( int matrix_order, char fact, char uplo,
-                                 lapack_int n, lapack_int nrhs,
-                                 lapack_complex_double* a, lapack_int lda,
-                                 lapack_complex_double* af, lapack_int ldaf,
-                                 lapack_int* ipiv, char* equed, double* s,
-                                 lapack_complex_double* b, lapack_int ldb,
-                                 lapack_complex_double* x, lapack_int ldx,
-                                 double* rcond, double* rpvgrw, double* berr,
-                                 lapack_int n_err_bnds, double* err_bnds_norm,
-                                 double* err_bnds_comp, lapack_int nparams,
-                                 double* params, lapack_complex_double* work,
-                                 double* rwork );
+lapack_int LAPACKE_chbgst_work(int matrix_order, char vect, char uplo, lapack_int n, lapack_int ka, lapack_int kb,
+                               lapack_complex_float* ab, lapack_int ldab, const lapack_complex_float* bb,
+                               lapack_int ldbb, lapack_complex_float* x, lapack_int ldx, lapack_complex_float* work,
+                               float* rwork);
+lapack_int LAPACKE_zhbgst_work(int matrix_order, char vect, char uplo, lapack_int n, lapack_int ka, lapack_int kb,
+                               lapack_complex_double* ab, lapack_int ldab, const lapack_complex_double* bb,
+                               lapack_int ldbb, lapack_complex_double* x, lapack_int ldx, lapack_complex_double* work,
+                               double* rwork);
 
-lapack_int LAPACKE_chetrd_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                float* d, float* e, lapack_complex_float* tau,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zhetrd_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                double* d, double* e,
-                                lapack_complex_double* tau,
-                                lapack_complex_double* work, lapack_int lwork );
+lapack_int LAPACKE_chbgv_work(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int ka, lapack_int kb,
+                              lapack_complex_float* ab, lapack_int ldab, lapack_complex_float* bb, lapack_int ldbb,
+                              float* w, lapack_complex_float* z, lapack_int ldz, lapack_complex_float* work,
+                              float* rwork);
+lapack_int LAPACKE_zhbgv_work(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int ka, lapack_int kb,
+                              lapack_complex_double* ab, lapack_int ldab, lapack_complex_double* bb, lapack_int ldbb,
+                              double* w, lapack_complex_double* z, lapack_int ldz, lapack_complex_double* work,
+                              double* rwork);
 
-lapack_int LAPACKE_chetrf_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_int* ipiv, lapack_complex_float* work,
-                                lapack_int lwork );
-lapack_int LAPACKE_zhetrf_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_int* ipiv, lapack_complex_double* work,
-                                lapack_int lwork );
+lapack_int LAPACKE_chbgvd_work(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int ka, lapack_int kb,
+                               lapack_complex_float* ab, lapack_int ldab, lapack_complex_float* bb, lapack_int ldbb,
+                               float* w, lapack_complex_float* z, lapack_int ldz, lapack_complex_float* work,
+                               lapack_int lwork, float* rwork, lapack_int lrwork, lapack_int* iwork, lapack_int liwork);
+lapack_int LAPACKE_zhbgvd_work(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int ka, lapack_int kb,
+                               lapack_complex_double* ab, lapack_int ldab, lapack_complex_double* bb, lapack_int ldbb,
+                               double* w, lapack_complex_double* z, lapack_int ldz, lapack_complex_double* work,
+                               lapack_int lwork, double* rwork, lapack_int lrwork, lapack_int* iwork,
+                               lapack_int liwork);
 
-lapack_int LAPACKE_chetri_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                const lapack_int* ipiv,
-                                lapack_complex_float* work );
-lapack_int LAPACKE_zhetri_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                const lapack_int* ipiv,
-                                lapack_complex_double* work );
+lapack_int LAPACKE_chbgvx_work(int matrix_order, char jobz, char range, char uplo, lapack_int n, lapack_int ka,
+                               lapack_int kb, lapack_complex_float* ab, lapack_int ldab, lapack_complex_float* bb,
+                               lapack_int ldbb, lapack_complex_float* q, lapack_int ldq, float vl, float vu,
+                               lapack_int il, lapack_int iu, float abstol, lapack_int* m, float* w,
+                               lapack_complex_float* z, lapack_int ldz, lapack_complex_float* work, float* rwork,
+                               lapack_int* iwork, lapack_int* ifail);
+lapack_int LAPACKE_zhbgvx_work(int matrix_order, char jobz, char range, char uplo, lapack_int n, lapack_int ka,
+                               lapack_int kb, lapack_complex_double* ab, lapack_int ldab, lapack_complex_double* bb,
+                               lapack_int ldbb, lapack_complex_double* q, lapack_int ldq, double vl, double vu,
+                               lapack_int il, lapack_int iu, double abstol, lapack_int* m, double* w,
+                               lapack_complex_double* z, lapack_int ldz, lapack_complex_double* work, double* rwork,
+                               lapack_int* iwork, lapack_int* ifail);
 
-lapack_int LAPACKE_chetrs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const lapack_complex_float* a,
-                                lapack_int lda, const lapack_int* ipiv,
-                                lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_zhetrs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const lapack_complex_double* a,
-                                lapack_int lda, const lapack_int* ipiv,
-                                lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_chbtrd_work(int matrix_order, char vect, char uplo, lapack_int n, lapack_int kd,
+                               lapack_complex_float* ab, lapack_int ldab, float* d, float* e, lapack_complex_float* q,
+                               lapack_int ldq, lapack_complex_float* work);
+lapack_int LAPACKE_zhbtrd_work(int matrix_order, char vect, char uplo, lapack_int n, lapack_int kd,
+                               lapack_complex_double* ab, lapack_int ldab, double* d, double* e,
+                               lapack_complex_double* q, lapack_int ldq, lapack_complex_double* work);
 
-lapack_int LAPACKE_chfrk_work( int matrix_order, char transr, char uplo,
-                               char trans, lapack_int n, lapack_int k,
-                               float alpha, const lapack_complex_float* a,
-                               lapack_int lda, float beta,
-                               lapack_complex_float* c );
-lapack_int LAPACKE_zhfrk_work( int matrix_order, char transr, char uplo,
-                               char trans, lapack_int n, lapack_int k,
-                               double alpha, const lapack_complex_double* a,
-                               lapack_int lda, double beta,
-                               lapack_complex_double* c );
+lapack_int LAPACKE_checon_work(int matrix_order, char uplo, lapack_int n, const lapack_complex_float* a, lapack_int lda,
+                               const lapack_int* ipiv, float anorm, float* rcond, lapack_complex_float* work);
+lapack_int LAPACKE_zhecon_work(int matrix_order, char uplo, lapack_int n, const lapack_complex_double* a,
+                               lapack_int lda, const lapack_int* ipiv, double anorm, double* rcond,
+                               lapack_complex_double* work);
 
-lapack_int LAPACKE_shgeqz_work( int matrix_order, char job, char compq,
-                                char compz, lapack_int n, lapack_int ilo,
-                                lapack_int ihi, float* h, lapack_int ldh,
-                                float* t, lapack_int ldt, float* alphar,
-                                float* alphai, float* beta, float* q,
-                                lapack_int ldq, float* z, lapack_int ldz,
-                                float* work, lapack_int lwork );
-lapack_int LAPACKE_dhgeqz_work( int matrix_order, char job, char compq,
-                                char compz, lapack_int n, lapack_int ilo,
-                                lapack_int ihi, double* h, lapack_int ldh,
-                                double* t, lapack_int ldt, double* alphar,
-                                double* alphai, double* beta, double* q,
-                                lapack_int ldq, double* z, lapack_int ldz,
-                                double* work, lapack_int lwork );
-lapack_int LAPACKE_chgeqz_work( int matrix_order, char job, char compq,
-                                char compz, lapack_int n, lapack_int ilo,
-                                lapack_int ihi, lapack_complex_float* h,
-                                lapack_int ldh, lapack_complex_float* t,
-                                lapack_int ldt, lapack_complex_float* alpha,
-                                lapack_complex_float* beta,
-                                lapack_complex_float* q, lapack_int ldq,
-                                lapack_complex_float* z, lapack_int ldz,
-                                lapack_complex_float* work, lapack_int lwork,
-                                float* rwork );
-lapack_int LAPACKE_zhgeqz_work( int matrix_order, char job, char compq,
-                                char compz, lapack_int n, lapack_int ilo,
-                                lapack_int ihi, lapack_complex_double* h,
-                                lapack_int ldh, lapack_complex_double* t,
-                                lapack_int ldt, lapack_complex_double* alpha,
-                                lapack_complex_double* beta,
-                                lapack_complex_double* q, lapack_int ldq,
-                                lapack_complex_double* z, lapack_int ldz,
-                                lapack_complex_double* work, lapack_int lwork,
-                                double* rwork );
+lapack_int LAPACKE_cheequb_work(int matrix_order, char uplo, lapack_int n, const lapack_complex_float* a,
+                                lapack_int lda, float* s, float* scond, float* amax, lapack_complex_float* work);
+lapack_int LAPACKE_zheequb_work(int matrix_order, char uplo, lapack_int n, const lapack_complex_double* a,
+                                lapack_int lda, double* s, double* scond, double* amax, lapack_complex_double* work);
 
-lapack_int LAPACKE_chpcon_work( int matrix_order, char uplo, lapack_int n,
-                                const lapack_complex_float* ap,
-                                const lapack_int* ipiv, float anorm,
-                                float* rcond, lapack_complex_float* work );
-lapack_int LAPACKE_zhpcon_work( int matrix_order, char uplo, lapack_int n,
-                                const lapack_complex_double* ap,
-                                const lapack_int* ipiv, double anorm,
-                                double* rcond, lapack_complex_double* work );
+lapack_int LAPACKE_cheev_work(int matrix_order, char jobz, char uplo, lapack_int n, lapack_complex_float* a,
+                              lapack_int lda, float* w, lapack_complex_float* work, lapack_int lwork, float* rwork);
+lapack_int LAPACKE_zheev_work(int matrix_order, char jobz, char uplo, lapack_int n, lapack_complex_double* a,
+                              lapack_int lda, double* w, lapack_complex_double* work, lapack_int lwork, double* rwork);
 
-lapack_int LAPACKE_chpev_work( int matrix_order, char jobz, char uplo,
-                               lapack_int n, lapack_complex_float* ap, float* w,
-                               lapack_complex_float* z, lapack_int ldz,
-                               lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_zhpev_work( int matrix_order, char jobz, char uplo,
-                               lapack_int n, lapack_complex_double* ap,
-                               double* w, lapack_complex_double* z,
-                               lapack_int ldz, lapack_complex_double* work,
-                               double* rwork );
+lapack_int LAPACKE_cheevd_work(int matrix_order, char jobz, char uplo, lapack_int n, lapack_complex_float* a,
+                               lapack_int lda, float* w, lapack_complex_float* work, lapack_int lwork, float* rwork,
+                               lapack_int lrwork, lapack_int* iwork, lapack_int liwork);
+lapack_int LAPACKE_zheevd_work(int matrix_order, char jobz, char uplo, lapack_int n, lapack_complex_double* a,
+                               lapack_int lda, double* w, lapack_complex_double* work, lapack_int lwork, double* rwork,
+                               lapack_int lrwork, lapack_int* iwork, lapack_int liwork);
 
-lapack_int LAPACKE_chpevd_work( int matrix_order, char jobz, char uplo,
-                                lapack_int n, lapack_complex_float* ap,
-                                float* w, lapack_complex_float* z,
-                                lapack_int ldz, lapack_complex_float* work,
-                                lapack_int lwork, float* rwork,
-                                lapack_int lrwork, lapack_int* iwork,
-                                lapack_int liwork );
-lapack_int LAPACKE_zhpevd_work( int matrix_order, char jobz, char uplo,
-                                lapack_int n, lapack_complex_double* ap,
-                                double* w, lapack_complex_double* z,
-                                lapack_int ldz, lapack_complex_double* work,
-                                lapack_int lwork, double* rwork,
-                                lapack_int lrwork, lapack_int* iwork,
-                                lapack_int liwork );
+lapack_int LAPACKE_cheevr_work(int matrix_order, char jobz, char range, char uplo, lapack_int n,
+                               lapack_complex_float* a, lapack_int lda, float vl, float vu, lapack_int il,
+                               lapack_int iu, float abstol, lapack_int* m, float* w, lapack_complex_float* z,
+                               lapack_int ldz, lapack_int* isuppz, lapack_complex_float* work, lapack_int lwork,
+                               float* rwork, lapack_int lrwork, lapack_int* iwork, lapack_int liwork);
+lapack_int LAPACKE_zheevr_work(int matrix_order, char jobz, char range, char uplo, lapack_int n,
+                               lapack_complex_double* a, lapack_int lda, double vl, double vu, lapack_int il,
+                               lapack_int iu, double abstol, lapack_int* m, double* w, lapack_complex_double* z,
+                               lapack_int ldz, lapack_int* isuppz, lapack_complex_double* work, lapack_int lwork,
+                               double* rwork, lapack_int lrwork, lapack_int* iwork, lapack_int liwork);
 
-lapack_int LAPACKE_chpevx_work( int matrix_order, char jobz, char range,
-                                char uplo, lapack_int n,
-                                lapack_complex_float* ap, float vl, float vu,
-                                lapack_int il, lapack_int iu, float abstol,
-                                lapack_int* m, float* w,
-                                lapack_complex_float* z, lapack_int ldz,
-                                lapack_complex_float* work, float* rwork,
-                                lapack_int* iwork, lapack_int* ifail );
-lapack_int LAPACKE_zhpevx_work( int matrix_order, char jobz, char range,
-                                char uplo, lapack_int n,
-                                lapack_complex_double* ap, double vl, double vu,
-                                lapack_int il, lapack_int iu, double abstol,
-                                lapack_int* m, double* w,
-                                lapack_complex_double* z, lapack_int ldz,
-                                lapack_complex_double* work, double* rwork,
-                                lapack_int* iwork, lapack_int* ifail );
+lapack_int LAPACKE_cheevx_work(int matrix_order, char jobz, char range, char uplo, lapack_int n,
+                               lapack_complex_float* a, lapack_int lda, float vl, float vu, lapack_int il,
+                               lapack_int iu, float abstol, lapack_int* m, float* w, lapack_complex_float* z,
+                               lapack_int ldz, lapack_complex_float* work, lapack_int lwork, float* rwork,
+                               lapack_int* iwork, lapack_int* ifail);
+lapack_int LAPACKE_zheevx_work(int matrix_order, char jobz, char range, char uplo, lapack_int n,
+                               lapack_complex_double* a, lapack_int lda, double vl, double vu, lapack_int il,
+                               lapack_int iu, double abstol, lapack_int* m, double* w, lapack_complex_double* z,
+                               lapack_int ldz, lapack_complex_double* work, lapack_int lwork, double* rwork,
+                               lapack_int* iwork, lapack_int* ifail);
 
-lapack_int LAPACKE_chpgst_work( int matrix_order, lapack_int itype, char uplo,
-                                lapack_int n, lapack_complex_float* ap,
-                                const lapack_complex_float* bp );
-lapack_int LAPACKE_zhpgst_work( int matrix_order, lapack_int itype, char uplo,
-                                lapack_int n, lapack_complex_double* ap,
-                                const lapack_complex_double* bp );
+lapack_int LAPACKE_chegst_work(int matrix_order, lapack_int itype, char uplo, lapack_int n, lapack_complex_float* a,
+                               lapack_int lda, const lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zhegst_work(int matrix_order, lapack_int itype, char uplo, lapack_int n, lapack_complex_double* a,
+                               lapack_int lda, const lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_chpgv_work( int matrix_order, lapack_int itype, char jobz,
-                               char uplo, lapack_int n,
-                               lapack_complex_float* ap,
-                               lapack_complex_float* bp, float* w,
-                               lapack_complex_float* z, lapack_int ldz,
-                               lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_zhpgv_work( int matrix_order, lapack_int itype, char jobz,
-                               char uplo, lapack_int n,
-                               lapack_complex_double* ap,
-                               lapack_complex_double* bp, double* w,
-                               lapack_complex_double* z, lapack_int ldz,
-                               lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_chegv_work(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n,
+                              lapack_complex_float* a, lapack_int lda, lapack_complex_float* b, lapack_int ldb,
+                              float* w, lapack_complex_float* work, lapack_int lwork, float* rwork);
+lapack_int LAPACKE_zhegv_work(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n,
+                              lapack_complex_double* a, lapack_int lda, lapack_complex_double* b, lapack_int ldb,
+                              double* w, lapack_complex_double* work, lapack_int lwork, double* rwork);
 
-lapack_int LAPACKE_chpgvd_work( int matrix_order, lapack_int itype, char jobz,
-                                char uplo, lapack_int n,
-                                lapack_complex_float* ap,
-                                lapack_complex_float* bp, float* w,
-                                lapack_complex_float* z, lapack_int ldz,
-                                lapack_complex_float* work, lapack_int lwork,
-                                float* rwork, lapack_int lrwork,
-                                lapack_int* iwork, lapack_int liwork );
-lapack_int LAPACKE_zhpgvd_work( int matrix_order, lapack_int itype, char jobz,
-                                char uplo, lapack_int n,
-                                lapack_complex_double* ap,
-                                lapack_complex_double* bp, double* w,
-                                lapack_complex_double* z, lapack_int ldz,
-                                lapack_complex_double* work, lapack_int lwork,
-                                double* rwork, lapack_int lrwork,
-                                lapack_int* iwork, lapack_int liwork );
+lapack_int LAPACKE_chegvd_work(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n,
+                               lapack_complex_float* a, lapack_int lda, lapack_complex_float* b, lapack_int ldb,
+                               float* w, lapack_complex_float* work, lapack_int lwork, float* rwork, lapack_int lrwork,
+                               lapack_int* iwork, lapack_int liwork);
+lapack_int LAPACKE_zhegvd_work(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n,
+                               lapack_complex_double* a, lapack_int lda, lapack_complex_double* b, lapack_int ldb,
+                               double* w, lapack_complex_double* work, lapack_int lwork, double* rwork,
+                               lapack_int lrwork, lapack_int* iwork, lapack_int liwork);
 
-lapack_int LAPACKE_chpgvx_work( int matrix_order, lapack_int itype, char jobz,
-                                char range, char uplo, lapack_int n,
-                                lapack_complex_float* ap,
-                                lapack_complex_float* bp, float vl, float vu,
-                                lapack_int il, lapack_int iu, float abstol,
-                                lapack_int* m, float* w,
-                                lapack_complex_float* z, lapack_int ldz,
-                                lapack_complex_float* work, float* rwork,
-                                lapack_int* iwork, lapack_int* ifail );
-lapack_int LAPACKE_zhpgvx_work( int matrix_order, lapack_int itype, char jobz,
-                                char range, char uplo, lapack_int n,
-                                lapack_complex_double* ap,
-                                lapack_complex_double* bp, double vl, double vu,
-                                lapack_int il, lapack_int iu, double abstol,
-                                lapack_int* m, double* w,
-                                lapack_complex_double* z, lapack_int ldz,
-                                lapack_complex_double* work, double* rwork,
-                                lapack_int* iwork, lapack_int* ifail );
+lapack_int LAPACKE_chegvx_work(int matrix_order, lapack_int itype, char jobz, char range, char uplo, lapack_int n,
+                               lapack_complex_float* a, lapack_int lda, lapack_complex_float* b, lapack_int ldb,
+                               float vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int* m, float* w,
+                               lapack_complex_float* z, lapack_int ldz, lapack_complex_float* work, lapack_int lwork,
+                               float* rwork, lapack_int* iwork, lapack_int* ifail);
+lapack_int LAPACKE_zhegvx_work(int matrix_order, lapack_int itype, char jobz, char range, char uplo, lapack_int n,
+                               lapack_complex_double* a, lapack_int lda, lapack_complex_double* b, lapack_int ldb,
+                               double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int* m,
+                               double* w, lapack_complex_double* z, lapack_int ldz, lapack_complex_double* work,
+                               lapack_int lwork, double* rwork, lapack_int* iwork, lapack_int* ifail);
 
-lapack_int LAPACKE_chprfs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const lapack_complex_float* ap,
-                                const lapack_complex_float* afp,
-                                const lapack_int* ipiv,
-                                const lapack_complex_float* b, lapack_int ldb,
-                                lapack_complex_float* x, lapack_int ldx,
-                                float* ferr, float* berr,
-                                lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_zhprfs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs,
-                                const lapack_complex_double* ap,
-                                const lapack_complex_double* afp,
-                                const lapack_int* ipiv,
-                                const lapack_complex_double* b, lapack_int ldb,
-                                lapack_complex_double* x, lapack_int ldx,
-                                double* ferr, double* berr,
-                                lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_cherfs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* af,
+                               lapack_int ldaf, const lapack_int* ipiv, const lapack_complex_float* b, lapack_int ldb,
+                               lapack_complex_float* x, lapack_int ldx, float* ferr, float* berr,
+                               lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zherfs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* af,
+                               lapack_int ldaf, const lapack_int* ipiv, const lapack_complex_double* b, lapack_int ldb,
+                               lapack_complex_double* x, lapack_int ldx, double* ferr, double* berr,
+                               lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_chpsv_work( int matrix_order, char uplo, lapack_int n,
-                               lapack_int nrhs, lapack_complex_float* ap,
-                               lapack_int* ipiv, lapack_complex_float* b,
-                               lapack_int ldb );
-lapack_int LAPACKE_zhpsv_work( int matrix_order, char uplo, lapack_int n,
-                               lapack_int nrhs, lapack_complex_double* ap,
-                               lapack_int* ipiv, lapack_complex_double* b,
-                               lapack_int ldb );
+lapack_int LAPACKE_cherfsx_work(int matrix_order, char uplo, char equed, lapack_int n, lapack_int nrhs,
+                                const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* af,
+                                lapack_int ldaf, const lapack_int* ipiv, const float* s, const lapack_complex_float* b,
+                                lapack_int ldb, lapack_complex_float* x, lapack_int ldx, float* rcond, float* berr,
+                                lapack_int n_err_bnds, float* err_bnds_norm, float* err_bnds_comp, lapack_int nparams,
+                                float* params, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zherfsx_work(int matrix_order, char uplo, char equed, lapack_int n, lapack_int nrhs,
+                                const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* af,
+                                lapack_int ldaf, const lapack_int* ipiv, const double* s,
+                                const lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x,
+                                lapack_int ldx, double* rcond, double* berr, lapack_int n_err_bnds,
+                                double* err_bnds_norm, double* err_bnds_comp, lapack_int nparams, double* params,
+                                lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_chpsvx_work( int matrix_order, char fact, char uplo,
-                                lapack_int n, lapack_int nrhs,
-                                const lapack_complex_float* ap,
-                                lapack_complex_float* afp, lapack_int* ipiv,
-                                const lapack_complex_float* b, lapack_int ldb,
-                                lapack_complex_float* x, lapack_int ldx,
-                                float* rcond, float* ferr, float* berr,
-                                lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_zhpsvx_work( int matrix_order, char fact, char uplo,
-                                lapack_int n, lapack_int nrhs,
-                                const lapack_complex_double* ap,
-                                lapack_complex_double* afp, lapack_int* ipiv,
-                                const lapack_complex_double* b, lapack_int ldb,
-                                lapack_complex_double* x, lapack_int ldx,
-                                double* rcond, double* ferr, double* berr,
-                                lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_chesv_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_float* a,
+                              lapack_int lda, lapack_int* ipiv, lapack_complex_float* b, lapack_int ldb,
+                              lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_zhesv_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double* a,
+                              lapack_int lda, lapack_int* ipiv, lapack_complex_double* b, lapack_int ldb,
+                              lapack_complex_double* work, lapack_int lwork);
 
-lapack_int LAPACKE_chptrd_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_float* ap, float* d, float* e,
-                                lapack_complex_float* tau );
-lapack_int LAPACKE_zhptrd_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_double* ap, double* d, double* e,
-                                lapack_complex_double* tau );
+lapack_int LAPACKE_chesvx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_float* a, lapack_int lda, lapack_complex_float* af, lapack_int ldaf,
+                               lapack_int* ipiv, const lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x,
+                               lapack_int ldx, float* rcond, float* ferr, float* berr, lapack_complex_float* work,
+                               lapack_int lwork, float* rwork);
+lapack_int LAPACKE_zhesvx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_double* a, lapack_int lda, lapack_complex_double* af,
+                               lapack_int ldaf, lapack_int* ipiv, const lapack_complex_double* b, lapack_int ldb,
+                               lapack_complex_double* x, lapack_int ldx, double* rcond, double* ferr, double* berr,
+                               lapack_complex_double* work, lapack_int lwork, double* rwork);
 
-lapack_int LAPACKE_chptrf_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_float* ap, lapack_int* ipiv );
-lapack_int LAPACKE_zhptrf_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_double* ap, lapack_int* ipiv );
+lapack_int LAPACKE_chesvxx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                                lapack_complex_float* a, lapack_int lda, lapack_complex_float* af, lapack_int ldaf,
+                                lapack_int* ipiv, char* equed, float* s, lapack_complex_float* b, lapack_int ldb,
+                                lapack_complex_float* x, lapack_int ldx, float* rcond, float* rpvgrw, float* berr,
+                                lapack_int n_err_bnds, float* err_bnds_norm, float* err_bnds_comp, lapack_int nparams,
+                                float* params, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zhesvxx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                                lapack_complex_double* a, lapack_int lda, lapack_complex_double* af, lapack_int ldaf,
+                                lapack_int* ipiv, char* equed, double* s, lapack_complex_double* b, lapack_int ldb,
+                                lapack_complex_double* x, lapack_int ldx, double* rcond, double* rpvgrw, double* berr,
+                                lapack_int n_err_bnds, double* err_bnds_norm, double* err_bnds_comp, lapack_int nparams,
+                                double* params, lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_chptri_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_float* ap,
-                                const lapack_int* ipiv,
-                                lapack_complex_float* work );
-lapack_int LAPACKE_zhptri_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_double* ap,
-                                const lapack_int* ipiv,
-                                lapack_complex_double* work );
+lapack_int LAPACKE_chetrd_work(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                               float* d, float* e, lapack_complex_float* tau, lapack_complex_float* work,
+                               lapack_int lwork);
+lapack_int LAPACKE_zhetrd_work(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                               double* d, double* e, lapack_complex_double* tau, lapack_complex_double* work,
+                               lapack_int lwork);
 
-lapack_int LAPACKE_chptrs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const lapack_complex_float* ap,
-                                const lapack_int* ipiv, lapack_complex_float* b,
-                                lapack_int ldb );
-lapack_int LAPACKE_zhptrs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs,
-                                const lapack_complex_double* ap,
-                                const lapack_int* ipiv,
-                                lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_chetrf_work(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                               lapack_int* ipiv, lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_zhetrf_work(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                               lapack_int* ipiv, lapack_complex_double* work, lapack_int lwork);
 
-lapack_int LAPACKE_shsein_work( int matrix_order, char job, char eigsrc,
-                                char initv, lapack_logical* select,
-                                lapack_int n, const float* h, lapack_int ldh,
-                                float* wr, const float* wi, float* vl,
-                                lapack_int ldvl, float* vr, lapack_int ldvr,
-                                lapack_int mm, lapack_int* m, float* work,
-                                lapack_int* ifaill, lapack_int* ifailr );
-lapack_int LAPACKE_dhsein_work( int matrix_order, char job, char eigsrc,
-                                char initv, lapack_logical* select,
-                                lapack_int n, const double* h, lapack_int ldh,
-                                double* wr, const double* wi, double* vl,
-                                lapack_int ldvl, double* vr, lapack_int ldvr,
-                                lapack_int mm, lapack_int* m, double* work,
-                                lapack_int* ifaill, lapack_int* ifailr );
-lapack_int LAPACKE_chsein_work( int matrix_order, char job, char eigsrc,
-                                char initv, const lapack_logical* select,
-                                lapack_int n, const lapack_complex_float* h,
-                                lapack_int ldh, lapack_complex_float* w,
-                                lapack_complex_float* vl, lapack_int ldvl,
-                                lapack_complex_float* vr, lapack_int ldvr,
-                                lapack_int mm, lapack_int* m,
-                                lapack_complex_float* work, float* rwork,
-                                lapack_int* ifaill, lapack_int* ifailr );
-lapack_int LAPACKE_zhsein_work( int matrix_order, char job, char eigsrc,
-                                char initv, const lapack_logical* select,
-                                lapack_int n, const lapack_complex_double* h,
-                                lapack_int ldh, lapack_complex_double* w,
-                                lapack_complex_double* vl, lapack_int ldvl,
-                                lapack_complex_double* vr, lapack_int ldvr,
-                                lapack_int mm, lapack_int* m,
-                                lapack_complex_double* work, double* rwork,
-                                lapack_int* ifaill, lapack_int* ifailr );
+lapack_int LAPACKE_chetri_work(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                               const lapack_int* ipiv, lapack_complex_float* work);
+lapack_int LAPACKE_zhetri_work(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                               const lapack_int* ipiv, lapack_complex_double* work);
 
-lapack_int LAPACKE_shseqr_work( int matrix_order, char job, char compz,
-                                lapack_int n, lapack_int ilo, lapack_int ihi,
-                                float* h, lapack_int ldh, float* wr, float* wi,
-                                float* z, lapack_int ldz, float* work,
-                                lapack_int lwork );
-lapack_int LAPACKE_dhseqr_work( int matrix_order, char job, char compz,
-                                lapack_int n, lapack_int ilo, lapack_int ihi,
-                                double* h, lapack_int ldh, double* wr,
-                                double* wi, double* z, lapack_int ldz,
-                                double* work, lapack_int lwork );
-lapack_int LAPACKE_chseqr_work( int matrix_order, char job, char compz,
-                                lapack_int n, lapack_int ilo, lapack_int ihi,
-                                lapack_complex_float* h, lapack_int ldh,
-                                lapack_complex_float* w,
-                                lapack_complex_float* z, lapack_int ldz,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zhseqr_work( int matrix_order, char job, char compz,
-                                lapack_int n, lapack_int ilo, lapack_int ihi,
-                                lapack_complex_double* h, lapack_int ldh,
-                                lapack_complex_double* w,
-                                lapack_complex_double* z, lapack_int ldz,
-                                lapack_complex_double* work, lapack_int lwork );
+lapack_int LAPACKE_chetrs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_float* a, lapack_int lda, const lapack_int* ipiv,
+                               lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zhetrs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_double* a, lapack_int lda, const lapack_int* ipiv,
+                               lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_clacgv_work( lapack_int n, lapack_complex_float* x,
-                                lapack_int incx );
-lapack_int LAPACKE_zlacgv_work( lapack_int n, lapack_complex_double* x,
-                                lapack_int incx );
+lapack_int LAPACKE_chfrk_work(int matrix_order, char transr, char uplo, char trans, lapack_int n, lapack_int k,
+                              float alpha, const lapack_complex_float* a, lapack_int lda, float beta,
+                              lapack_complex_float* c);
+lapack_int LAPACKE_zhfrk_work(int matrix_order, char transr, char uplo, char trans, lapack_int n, lapack_int k,
+                              double alpha, const lapack_complex_double* a, lapack_int lda, double beta,
+                              lapack_complex_double* c);
 
-lapack_int LAPACKE_slacpy_work( int matrix_order, char uplo, lapack_int m,
-                                lapack_int n, const float* a, lapack_int lda,
-                                float* b, lapack_int ldb );
-lapack_int LAPACKE_dlacpy_work( int matrix_order, char uplo, lapack_int m,
-                                lapack_int n, const double* a, lapack_int lda,
-                                double* b, lapack_int ldb );
-lapack_int LAPACKE_clacpy_work( int matrix_order, char uplo, lapack_int m,
-                                lapack_int n, const lapack_complex_float* a,
-                                lapack_int lda, lapack_complex_float* b,
-                                lapack_int ldb );
-lapack_int LAPACKE_zlacpy_work( int matrix_order, char uplo, lapack_int m,
-                                lapack_int n, const lapack_complex_double* a,
-                                lapack_int lda, lapack_complex_double* b,
-                                lapack_int ldb );
+lapack_int LAPACKE_shgeqz_work(int matrix_order, char job, char compq, char compz, lapack_int n, lapack_int ilo,
+                               lapack_int ihi, float* h, lapack_int ldh, float* t, lapack_int ldt, float* alphar,
+                               float* alphai, float* beta, float* q, lapack_int ldq, float* z, lapack_int ldz,
+                               float* work, lapack_int lwork);
+lapack_int LAPACKE_dhgeqz_work(int matrix_order, char job, char compq, char compz, lapack_int n, lapack_int ilo,
+                               lapack_int ihi, double* h, lapack_int ldh, double* t, lapack_int ldt, double* alphar,
+                               double* alphai, double* beta, double* q, lapack_int ldq, double* z, lapack_int ldz,
+                               double* work, lapack_int lwork);
+lapack_int LAPACKE_chgeqz_work(int matrix_order, char job, char compq, char compz, lapack_int n, lapack_int ilo,
+                               lapack_int ihi, lapack_complex_float* h, lapack_int ldh, lapack_complex_float* t,
+                               lapack_int ldt, lapack_complex_float* alpha, lapack_complex_float* beta,
+                               lapack_complex_float* q, lapack_int ldq, lapack_complex_float* z, lapack_int ldz,
+                               lapack_complex_float* work, lapack_int lwork, float* rwork);
+lapack_int LAPACKE_zhgeqz_work(int matrix_order, char job, char compq, char compz, lapack_int n, lapack_int ilo,
+                               lapack_int ihi, lapack_complex_double* h, lapack_int ldh, lapack_complex_double* t,
+                               lapack_int ldt, lapack_complex_double* alpha, lapack_complex_double* beta,
+                               lapack_complex_double* q, lapack_int ldq, lapack_complex_double* z, lapack_int ldz,
+                               lapack_complex_double* work, lapack_int lwork, double* rwork);
 
-lapack_int LAPACKE_zlag2c_work( int matrix_order, lapack_int m, lapack_int n,
-                                const lapack_complex_double* a, lapack_int lda,
-                                lapack_complex_float* sa, lapack_int ldsa );
+lapack_int LAPACKE_chpcon_work(int matrix_order, char uplo, lapack_int n, const lapack_complex_float* ap,
+                               const lapack_int* ipiv, float anorm, float* rcond, lapack_complex_float* work);
+lapack_int LAPACKE_zhpcon_work(int matrix_order, char uplo, lapack_int n, const lapack_complex_double* ap,
+                               const lapack_int* ipiv, double anorm, double* rcond, lapack_complex_double* work);
 
-lapack_int LAPACKE_slag2d_work( int matrix_order, lapack_int m, lapack_int n,
-                                const float* sa, lapack_int ldsa, double* a,
-                                lapack_int lda );
+lapack_int LAPACKE_chpev_work(int matrix_order, char jobz, char uplo, lapack_int n, lapack_complex_float* ap, float* w,
+                              lapack_complex_float* z, lapack_int ldz, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zhpev_work(int matrix_order, char jobz, char uplo, lapack_int n, lapack_complex_double* ap,
+                              double* w, lapack_complex_double* z, lapack_int ldz, lapack_complex_double* work,
+                              double* rwork);
 
-lapack_int LAPACKE_dlag2s_work( int matrix_order, lapack_int m, lapack_int n,
-                                const double* a, lapack_int lda, float* sa,
-                                lapack_int ldsa );
+lapack_int LAPACKE_chpevd_work(int matrix_order, char jobz, char uplo, lapack_int n, lapack_complex_float* ap, float* w,
+                               lapack_complex_float* z, lapack_int ldz, lapack_complex_float* work, lapack_int lwork,
+                               float* rwork, lapack_int lrwork, lapack_int* iwork, lapack_int liwork);
+lapack_int LAPACKE_zhpevd_work(int matrix_order, char jobz, char uplo, lapack_int n, lapack_complex_double* ap,
+                               double* w, lapack_complex_double* z, lapack_int ldz, lapack_complex_double* work,
+                               lapack_int lwork, double* rwork, lapack_int lrwork, lapack_int* iwork,
+                               lapack_int liwork);
 
-lapack_int LAPACKE_clag2z_work( int matrix_order, lapack_int m, lapack_int n,
-                                const lapack_complex_float* sa, lapack_int ldsa,
-                                lapack_complex_double* a, lapack_int lda );
+lapack_int LAPACKE_chpevx_work(int matrix_order, char jobz, char range, char uplo, lapack_int n,
+                               lapack_complex_float* ap, float vl, float vu, lapack_int il, lapack_int iu, float abstol,
+                               lapack_int* m, float* w, lapack_complex_float* z, lapack_int ldz,
+                               lapack_complex_float* work, float* rwork, lapack_int* iwork, lapack_int* ifail);
+lapack_int LAPACKE_zhpevx_work(int matrix_order, char jobz, char range, char uplo, lapack_int n,
+                               lapack_complex_double* ap, double vl, double vu, lapack_int il, lapack_int iu,
+                               double abstol, lapack_int* m, double* w, lapack_complex_double* z, lapack_int ldz,
+                               lapack_complex_double* work, double* rwork, lapack_int* iwork, lapack_int* ifail);
 
-lapack_int LAPACKE_slagge_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int kl, lapack_int ku, const float* d,
-                                float* a, lapack_int lda, lapack_int* iseed,
-                                float* work );
-lapack_int LAPACKE_dlagge_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int kl, lapack_int ku, const double* d,
-                                double* a, lapack_int lda, lapack_int* iseed,
-                                double* work );
-lapack_int LAPACKE_clagge_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int kl, lapack_int ku, const float* d,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_int* iseed, lapack_complex_float* work );
-lapack_int LAPACKE_zlagge_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int kl, lapack_int ku, const double* d,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_int* iseed,
-                                lapack_complex_double* work );
-                                
-lapack_int LAPACKE_claghe_work( int matrix_order, lapack_int n, lapack_int k,
-                                const float* d, lapack_complex_float* a,
-                                lapack_int lda, lapack_int* iseed,
-                                lapack_complex_float* work );
-lapack_int LAPACKE_zlaghe_work( int matrix_order, lapack_int n, lapack_int k,
-                                const double* d, lapack_complex_double* a,
-                                lapack_int lda, lapack_int* iseed,
-                                lapack_complex_double* work );
+lapack_int LAPACKE_chpgst_work(int matrix_order, lapack_int itype, char uplo, lapack_int n, lapack_complex_float* ap,
+                               const lapack_complex_float* bp);
+lapack_int LAPACKE_zhpgst_work(int matrix_order, lapack_int itype, char uplo, lapack_int n, lapack_complex_double* ap,
+                               const lapack_complex_double* bp);
 
-lapack_int LAPACKE_slagsy_work( int matrix_order, lapack_int n, lapack_int k,
-                                const float* d, float* a, lapack_int lda,
-                                lapack_int* iseed, float* work );
-lapack_int LAPACKE_dlagsy_work( int matrix_order, lapack_int n, lapack_int k,
-                                const double* d, double* a, lapack_int lda,
-                                lapack_int* iseed, double* work );
-lapack_int LAPACKE_clagsy_work( int matrix_order, lapack_int n, lapack_int k,
-                                const float* d, lapack_complex_float* a,
-                                lapack_int lda, lapack_int* iseed,
-                                lapack_complex_float* work );
-lapack_int LAPACKE_zlagsy_work( int matrix_order, lapack_int n, lapack_int k,
-                                const double* d, lapack_complex_double* a,
-                                lapack_int lda, lapack_int* iseed,
-                                lapack_complex_double* work );
+lapack_int LAPACKE_chpgv_work(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n,
+                              lapack_complex_float* ap, lapack_complex_float* bp, float* w, lapack_complex_float* z,
+                              lapack_int ldz, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zhpgv_work(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n,
+                              lapack_complex_double* ap, lapack_complex_double* bp, double* w, lapack_complex_double* z,
+                              lapack_int ldz, lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_slapmr_work( int matrix_order, lapack_logical forwrd,
-                                lapack_int m, lapack_int n, float* x,
-                                lapack_int ldx, lapack_int* k );
-lapack_int LAPACKE_dlapmr_work( int matrix_order, lapack_logical forwrd,
-                                lapack_int m, lapack_int n, double* x,
-                                lapack_int ldx, lapack_int* k );
-lapack_int LAPACKE_clapmr_work( int matrix_order, lapack_logical forwrd,
-                                lapack_int m, lapack_int n,
-                                lapack_complex_float* x, lapack_int ldx,
-                                lapack_int* k );
-lapack_int LAPACKE_zlapmr_work( int matrix_order, lapack_logical forwrd,
-                                lapack_int m, lapack_int n,
-                                lapack_complex_double* x, lapack_int ldx,
-                                lapack_int* k );
+lapack_int LAPACKE_chpgvd_work(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n,
+                               lapack_complex_float* ap, lapack_complex_float* bp, float* w, lapack_complex_float* z,
+                               lapack_int ldz, lapack_complex_float* work, lapack_int lwork, float* rwork,
+                               lapack_int lrwork, lapack_int* iwork, lapack_int liwork);
+lapack_int LAPACKE_zhpgvd_work(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n,
+                               lapack_complex_double* ap, lapack_complex_double* bp, double* w,
+                               lapack_complex_double* z, lapack_int ldz, lapack_complex_double* work, lapack_int lwork,
+                               double* rwork, lapack_int lrwork, lapack_int* iwork, lapack_int liwork);
 
-lapack_int LAPACKE_slartgp_work( float f, float g, float* cs, float* sn,
-                                 float* r );
-lapack_int LAPACKE_dlartgp_work( double f, double g, double* cs, double* sn,
-                                 double* r );
+lapack_int LAPACKE_chpgvx_work(int matrix_order, lapack_int itype, char jobz, char range, char uplo, lapack_int n,
+                               lapack_complex_float* ap, lapack_complex_float* bp, float vl, float vu, lapack_int il,
+                               lapack_int iu, float abstol, lapack_int* m, float* w, lapack_complex_float* z,
+                               lapack_int ldz, lapack_complex_float* work, float* rwork, lapack_int* iwork,
+                               lapack_int* ifail);
+lapack_int LAPACKE_zhpgvx_work(int matrix_order, lapack_int itype, char jobz, char range, char uplo, lapack_int n,
+                               lapack_complex_double* ap, lapack_complex_double* bp, double vl, double vu,
+                               lapack_int il, lapack_int iu, double abstol, lapack_int* m, double* w,
+                               lapack_complex_double* z, lapack_int ldz, lapack_complex_double* work, double* rwork,
+                               lapack_int* iwork, lapack_int* ifail);
 
-lapack_int LAPACKE_slartgs_work( float x, float y, float sigma, float* cs,
-                                 float* sn );
-lapack_int LAPACKE_dlartgs_work( double x, double y, double sigma, double* cs,
-                                 double* sn );
-                                
-float LAPACKE_slapy2_work( float x, float y );
-double LAPACKE_dlapy2_work( double x, double y );
+lapack_int LAPACKE_chprfs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_float* ap, const lapack_complex_float* afp, const lapack_int* ipiv,
+                               const lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x, lapack_int ldx,
+                               float* ferr, float* berr, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zhprfs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_double* ap, const lapack_complex_double* afp,
+                               const lapack_int* ipiv, const lapack_complex_double* b, lapack_int ldb,
+                               lapack_complex_double* x, lapack_int ldx, double* ferr, double* berr,
+                               lapack_complex_double* work, double* rwork);
 
-float LAPACKE_slapy3_work( float x, float y, float z );
-double LAPACKE_dlapy3_work( double x, double y, double z );
+lapack_int LAPACKE_chpsv_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_float* ap,
+                              lapack_int* ipiv, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zhpsv_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double* ap,
+                              lapack_int* ipiv, lapack_complex_double* b, lapack_int ldb);
 
-float LAPACKE_slamch_work( char cmach );
-double LAPACKE_dlamch_work( char cmach );
+lapack_int LAPACKE_chpsvx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_float* ap, lapack_complex_float* afp, lapack_int* ipiv,
+                               const lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x, lapack_int ldx,
+                               float* rcond, float* ferr, float* berr, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zhpsvx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_double* ap, lapack_complex_double* afp, lapack_int* ipiv,
+                               const lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x, lapack_int ldx,
+                               double* rcond, double* ferr, double* berr, lapack_complex_double* work, double* rwork);
 
-float LAPACKE_slange_work( int matrix_order, char norm, lapack_int m,
-                                lapack_int n, const float* a, lapack_int lda,
-                                float* work );
-double LAPACKE_dlange_work( int matrix_order, char norm, lapack_int m,
-                                lapack_int n, const double* a, lapack_int lda,
-                                double* work );
-float LAPACKE_clange_work( int matrix_order, char norm, lapack_int m,
-                                lapack_int n, const lapack_complex_float* a,
-                                lapack_int lda, float* work );
-double LAPACKE_zlange_work( int matrix_order, char norm, lapack_int m,
-                                lapack_int n, const lapack_complex_double* a,
-                                lapack_int lda, double* work );
+lapack_int LAPACKE_chptrd_work(int matrix_order, char uplo, lapack_int n, lapack_complex_float* ap, float* d, float* e,
+                               lapack_complex_float* tau);
+lapack_int LAPACKE_zhptrd_work(int matrix_order, char uplo, lapack_int n, lapack_complex_double* ap, double* d,
+                               double* e, lapack_complex_double* tau);
 
-float LAPACKE_clanhe_work( int matrix_order, char norm, char uplo,
-                                lapack_int n, const lapack_complex_float* a,
-                                lapack_int lda, float* work );
-double LAPACKE_zlanhe_work( int matrix_order, char norm, char uplo,
-                                lapack_int n, const lapack_complex_double* a,
-                                lapack_int lda, double* work );
+lapack_int LAPACKE_chptrf_work(int matrix_order, char uplo, lapack_int n, lapack_complex_float* ap, lapack_int* ipiv);
+lapack_int LAPACKE_zhptrf_work(int matrix_order, char uplo, lapack_int n, lapack_complex_double* ap, lapack_int* ipiv);
 
-float LAPACKE_slansy_work( int matrix_order, char norm, char uplo,
-                                lapack_int n, const float* a, lapack_int lda,
-                                float* work );
-double LAPACKE_dlansy_work( int matrix_order, char norm, char uplo,
-                                lapack_int n, const double* a, lapack_int lda,
-                                double* work );
-float LAPACKE_clansy_work( int matrix_order, char norm, char uplo,
-                                lapack_int n, const lapack_complex_float* a,
-                                lapack_int lda, float* work );
-double LAPACKE_zlansy_work( int matrix_order, char norm, char uplo,
-                                lapack_int n, const lapack_complex_double* a,
-                                lapack_int lda, double* work );
+lapack_int LAPACKE_chptri_work(int matrix_order, char uplo, lapack_int n, lapack_complex_float* ap,
+                               const lapack_int* ipiv, lapack_complex_float* work);
+lapack_int LAPACKE_zhptri_work(int matrix_order, char uplo, lapack_int n, lapack_complex_double* ap,
+                               const lapack_int* ipiv, lapack_complex_double* work);
 
-float LAPACKE_slantr_work( int matrix_order, char norm, char uplo,
-                                char diag, lapack_int m, lapack_int n, const float* a,
-                                lapack_int lda, float* work );
-double LAPACKE_dlantr_work( int matrix_order, char norm, char uplo,
-                                char diag, lapack_int m, lapack_int n,
-                                const double* a, lapack_int lda, double* work );
-float LAPACKE_clantr_work( int matrix_order, char norm, char uplo,
-                                char diag, lapack_int m, lapack_int n,
-                                const lapack_complex_float* a, lapack_int lda,
-                                float* work );
-double LAPACKE_zlantr_work( int matrix_order, char norm, char uplo,
-                                char diag, lapack_int m, lapack_int n,
-                                const lapack_complex_double* a, lapack_int lda,
-                                double* work );
+lapack_int LAPACKE_chptrs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_float* ap, const lapack_int* ipiv, lapack_complex_float* b,
+                               lapack_int ldb);
+lapack_int LAPACKE_zhptrs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_double* ap, const lapack_int* ipiv, lapack_complex_double* b,
+                               lapack_int ldb);
 
-lapack_int LAPACKE_slarfb_work( int matrix_order, char side, char trans,
-                                char direct, char storev, lapack_int m,
-                                lapack_int n, lapack_int k, const float* v,
-                                lapack_int ldv, const float* t, lapack_int ldt,
-                                float* c, lapack_int ldc, float* work,
-                                lapack_int ldwork );
-lapack_int LAPACKE_dlarfb_work( int matrix_order, char side, char trans,
-                                char direct, char storev, lapack_int m,
-                                lapack_int n, lapack_int k, const double* v,
-                                lapack_int ldv, const double* t, lapack_int ldt,
-                                double* c, lapack_int ldc, double* work,
-                                lapack_int ldwork );
-lapack_int LAPACKE_clarfb_work( int matrix_order, char side, char trans,
-                                char direct, char storev, lapack_int m,
-                                lapack_int n, lapack_int k,
-                                const lapack_complex_float* v, lapack_int ldv,
-                                const lapack_complex_float* t, lapack_int ldt,
-                                lapack_complex_float* c, lapack_int ldc,
-                                lapack_complex_float* work, lapack_int ldwork );
-lapack_int LAPACKE_zlarfb_work( int matrix_order, char side, char trans,
-                                char direct, char storev, lapack_int m,
-                                lapack_int n, lapack_int k,
-                                const lapack_complex_double* v, lapack_int ldv,
-                                const lapack_complex_double* t, lapack_int ldt,
-                                lapack_complex_double* c, lapack_int ldc,
-                                lapack_complex_double* work,
-                                lapack_int ldwork );
+lapack_int LAPACKE_shsein_work(int matrix_order, char job, char eigsrc, char initv, lapack_logical* select,
+                               lapack_int n, const float* h, lapack_int ldh, float* wr, const float* wi, float* vl,
+                               lapack_int ldvl, float* vr, lapack_int ldvr, lapack_int mm, lapack_int* m, float* work,
+                               lapack_int* ifaill, lapack_int* ifailr);
+lapack_int LAPACKE_dhsein_work(int matrix_order, char job, char eigsrc, char initv, lapack_logical* select,
+                               lapack_int n, const double* h, lapack_int ldh, double* wr, const double* wi, double* vl,
+                               lapack_int ldvl, double* vr, lapack_int ldvr, lapack_int mm, lapack_int* m, double* work,
+                               lapack_int* ifaill, lapack_int* ifailr);
+lapack_int LAPACKE_chsein_work(int matrix_order, char job, char eigsrc, char initv, const lapack_logical* select,
+                               lapack_int n, const lapack_complex_float* h, lapack_int ldh, lapack_complex_float* w,
+                               lapack_complex_float* vl, lapack_int ldvl, lapack_complex_float* vr, lapack_int ldvr,
+                               lapack_int mm, lapack_int* m, lapack_complex_float* work, float* rwork,
+                               lapack_int* ifaill, lapack_int* ifailr);
+lapack_int LAPACKE_zhsein_work(int matrix_order, char job, char eigsrc, char initv, const lapack_logical* select,
+                               lapack_int n, const lapack_complex_double* h, lapack_int ldh, lapack_complex_double* w,
+                               lapack_complex_double* vl, lapack_int ldvl, lapack_complex_double* vr, lapack_int ldvr,
+                               lapack_int mm, lapack_int* m, lapack_complex_double* work, double* rwork,
+                               lapack_int* ifaill, lapack_int* ifailr);
 
-lapack_int LAPACKE_slarfg_work( lapack_int n, float* alpha, float* x,
-                                lapack_int incx, float* tau );
-lapack_int LAPACKE_dlarfg_work( lapack_int n, double* alpha, double* x,
-                                lapack_int incx, double* tau );
-lapack_int LAPACKE_clarfg_work( lapack_int n, lapack_complex_float* alpha,
-                                lapack_complex_float* x, lapack_int incx,
-                                lapack_complex_float* tau );
-lapack_int LAPACKE_zlarfg_work( lapack_int n, lapack_complex_double* alpha,
-                                lapack_complex_double* x, lapack_int incx,
-                                lapack_complex_double* tau );
+lapack_int LAPACKE_shseqr_work(int matrix_order, char job, char compz, lapack_int n, lapack_int ilo, lapack_int ihi,
+                               float* h, lapack_int ldh, float* wr, float* wi, float* z, lapack_int ldz, float* work,
+                               lapack_int lwork);
+lapack_int LAPACKE_dhseqr_work(int matrix_order, char job, char compz, lapack_int n, lapack_int ilo, lapack_int ihi,
+                               double* h, lapack_int ldh, double* wr, double* wi, double* z, lapack_int ldz,
+                               double* work, lapack_int lwork);
+lapack_int LAPACKE_chseqr_work(int matrix_order, char job, char compz, lapack_int n, lapack_int ilo, lapack_int ihi,
+                               lapack_complex_float* h, lapack_int ldh, lapack_complex_float* w,
+                               lapack_complex_float* z, lapack_int ldz, lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_zhseqr_work(int matrix_order, char job, char compz, lapack_int n, lapack_int ilo, lapack_int ihi,
+                               lapack_complex_double* h, lapack_int ldh, lapack_complex_double* w,
+                               lapack_complex_double* z, lapack_int ldz, lapack_complex_double* work, lapack_int lwork);
 
-lapack_int LAPACKE_slarft_work( int matrix_order, char direct, char storev,
-                                lapack_int n, lapack_int k, const float* v,
-                                lapack_int ldv, const float* tau, float* t,
-                                lapack_int ldt );
-lapack_int LAPACKE_dlarft_work( int matrix_order, char direct, char storev,
-                                lapack_int n, lapack_int k, const double* v,
-                                lapack_int ldv, const double* tau, double* t,
-                                lapack_int ldt );
-lapack_int LAPACKE_clarft_work( int matrix_order, char direct, char storev,
-                                lapack_int n, lapack_int k,
-                                const lapack_complex_float* v, lapack_int ldv,
-                                const lapack_complex_float* tau,
-                                lapack_complex_float* t, lapack_int ldt );
-lapack_int LAPACKE_zlarft_work( int matrix_order, char direct, char storev,
-                                lapack_int n, lapack_int k,
-                                const lapack_complex_double* v, lapack_int ldv,
-                                const lapack_complex_double* tau,
-                                lapack_complex_double* t, lapack_int ldt );
+lapack_int LAPACKE_clacgv_work(lapack_int n, lapack_complex_float* x, lapack_int incx);
+lapack_int LAPACKE_zlacgv_work(lapack_int n, lapack_complex_double* x, lapack_int incx);
 
-lapack_int LAPACKE_slarfx_work( int matrix_order, char side, lapack_int m,
-                                lapack_int n, const float* v, float tau,
-                                float* c, lapack_int ldc, float* work );
-lapack_int LAPACKE_dlarfx_work( int matrix_order, char side, lapack_int m,
-                                lapack_int n, const double* v, double tau,
-                                double* c, lapack_int ldc, double* work );
-lapack_int LAPACKE_clarfx_work( int matrix_order, char side, lapack_int m,
-                                lapack_int n, const lapack_complex_float* v,
-                                lapack_complex_float tau,
-                                lapack_complex_float* c, lapack_int ldc,
-                                lapack_complex_float* work );
-lapack_int LAPACKE_zlarfx_work( int matrix_order, char side, lapack_int m,
-                                lapack_int n, const lapack_complex_double* v,
-                                lapack_complex_double tau,
-                                lapack_complex_double* c, lapack_int ldc,
-                                lapack_complex_double* work );
+lapack_int LAPACKE_slacpy_work(int matrix_order, char uplo, lapack_int m, lapack_int n, const float* a, lapack_int lda,
+                               float* b, lapack_int ldb);
+lapack_int LAPACKE_dlacpy_work(int matrix_order, char uplo, lapack_int m, lapack_int n, const double* a, lapack_int lda,
+                               double* b, lapack_int ldb);
+lapack_int LAPACKE_clacpy_work(int matrix_order, char uplo, lapack_int m, lapack_int n, const lapack_complex_float* a,
+                               lapack_int lda, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zlacpy_work(int matrix_order, char uplo, lapack_int m, lapack_int n, const lapack_complex_double* a,
+                               lapack_int lda, lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_slarnv_work( lapack_int idist, lapack_int* iseed,
-                                lapack_int n, float* x );
-lapack_int LAPACKE_dlarnv_work( lapack_int idist, lapack_int* iseed,
-                                lapack_int n, double* x );
-lapack_int LAPACKE_clarnv_work( lapack_int idist, lapack_int* iseed,
-                                lapack_int n, lapack_complex_float* x );
-lapack_int LAPACKE_zlarnv_work( lapack_int idist, lapack_int* iseed,
-                                lapack_int n, lapack_complex_double* x );
+lapack_int LAPACKE_zlag2c_work(int matrix_order, lapack_int m, lapack_int n, const lapack_complex_double* a,
+                               lapack_int lda, lapack_complex_float* sa, lapack_int ldsa);
 
-lapack_int LAPACKE_slaset_work( int matrix_order, char uplo, lapack_int m,
-                                lapack_int n, float alpha, float beta, float* a,
-                                lapack_int lda );
-lapack_int LAPACKE_dlaset_work( int matrix_order, char uplo, lapack_int m,
-                                lapack_int n, double alpha, double beta,
-                                double* a, lapack_int lda );
-lapack_int LAPACKE_claset_work( int matrix_order, char uplo, lapack_int m,
-                                lapack_int n, lapack_complex_float alpha,
-                                lapack_complex_float beta,
-                                lapack_complex_float* a, lapack_int lda );
-lapack_int LAPACKE_zlaset_work( int matrix_order, char uplo, lapack_int m,
-                                lapack_int n, lapack_complex_double alpha,
-                                lapack_complex_double beta,
-                                lapack_complex_double* a, lapack_int lda );
+lapack_int LAPACKE_slag2d_work(int matrix_order, lapack_int m, lapack_int n, const float* sa, lapack_int ldsa,
+                               double* a, lapack_int lda);
 
-lapack_int LAPACKE_slasrt_work( char id, lapack_int n, float* d );
-lapack_int LAPACKE_dlasrt_work( char id, lapack_int n, double* d );
+lapack_int LAPACKE_dlag2s_work(int matrix_order, lapack_int m, lapack_int n, const double* a, lapack_int lda, float* sa,
+                               lapack_int ldsa);
 
-lapack_int LAPACKE_slaswp_work( int matrix_order, lapack_int n, float* a,
-                                lapack_int lda, lapack_int k1, lapack_int k2,
-                                const lapack_int* ipiv, lapack_int incx );
-lapack_int LAPACKE_dlaswp_work( int matrix_order, lapack_int n, double* a,
-                                lapack_int lda, lapack_int k1, lapack_int k2,
-                                const lapack_int* ipiv, lapack_int incx );
-lapack_int LAPACKE_claswp_work( int matrix_order, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_int k1, lapack_int k2,
-                                const lapack_int* ipiv, lapack_int incx );
-lapack_int LAPACKE_zlaswp_work( int matrix_order, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_int k1, lapack_int k2,
-                                const lapack_int* ipiv, lapack_int incx );
+lapack_int LAPACKE_clag2z_work(int matrix_order, lapack_int m, lapack_int n, const lapack_complex_float* sa,
+                               lapack_int ldsa, lapack_complex_double* a, lapack_int lda);
 
-lapack_int LAPACKE_slatms_work( int matrix_order, lapack_int m, lapack_int n,
-                                char dist, lapack_int* iseed, char sym,
-                                float* d, lapack_int mode, float cond,
-                                float dmax, lapack_int kl, lapack_int ku,
-                                char pack, float* a, lapack_int lda,
-                                float* work );
-lapack_int LAPACKE_dlatms_work( int matrix_order, lapack_int m, lapack_int n,
-                                char dist, lapack_int* iseed, char sym,
-                                double* d, lapack_int mode, double cond,
-                                double dmax, lapack_int kl, lapack_int ku,
-                                char pack, double* a, lapack_int lda,
-                                double* work );
-lapack_int LAPACKE_clatms_work( int matrix_order, lapack_int m, lapack_int n,
-                                char dist, lapack_int* iseed, char sym,
-                                float* d, lapack_int mode, float cond,
-                                float dmax, lapack_int kl, lapack_int ku,
-                                char pack, lapack_complex_float* a,
-                                lapack_int lda, lapack_complex_float* work );
-lapack_int LAPACKE_zlatms_work( int matrix_order, lapack_int m, lapack_int n,
-                                char dist, lapack_int* iseed, char sym,
-                                double* d, lapack_int mode, double cond,
-                                double dmax, lapack_int kl, lapack_int ku,
-                                char pack, lapack_complex_double* a,
-                                lapack_int lda, lapack_complex_double* work );
+lapack_int LAPACKE_slagge_work(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku,
+                               const float* d, float* a, lapack_int lda, lapack_int* iseed, float* work);
+lapack_int LAPACKE_dlagge_work(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku,
+                               const double* d, double* a, lapack_int lda, lapack_int* iseed, double* work);
+lapack_int LAPACKE_clagge_work(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku,
+                               const float* d, lapack_complex_float* a, lapack_int lda, lapack_int* iseed,
+                               lapack_complex_float* work);
+lapack_int LAPACKE_zlagge_work(int matrix_order, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku,
+                               const double* d, lapack_complex_double* a, lapack_int lda, lapack_int* iseed,
+                               lapack_complex_double* work);
 
-lapack_int LAPACKE_slauum_work( int matrix_order, char uplo, lapack_int n,
-                                float* a, lapack_int lda );
-lapack_int LAPACKE_dlauum_work( int matrix_order, char uplo, lapack_int n,
-                                double* a, lapack_int lda );
-lapack_int LAPACKE_clauum_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda );
-lapack_int LAPACKE_zlauum_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda );
+lapack_int LAPACKE_claghe_work(int matrix_order, lapack_int n, lapack_int k, const float* d, lapack_complex_float* a,
+                               lapack_int lda, lapack_int* iseed, lapack_complex_float* work);
+lapack_int LAPACKE_zlaghe_work(int matrix_order, lapack_int n, lapack_int k, const double* d, lapack_complex_double* a,
+                               lapack_int lda, lapack_int* iseed, lapack_complex_double* work);
 
-lapack_int LAPACKE_sopgtr_work( int matrix_order, char uplo, lapack_int n,
-                                const float* ap, const float* tau, float* q,
-                                lapack_int ldq, float* work );
-lapack_int LAPACKE_dopgtr_work( int matrix_order, char uplo, lapack_int n,
-                                const double* ap, const double* tau, double* q,
-                                lapack_int ldq, double* work );
+lapack_int LAPACKE_slagsy_work(int matrix_order, lapack_int n, lapack_int k, const float* d, float* a, lapack_int lda,
+                               lapack_int* iseed, float* work);
+lapack_int LAPACKE_dlagsy_work(int matrix_order, lapack_int n, lapack_int k, const double* d, double* a, lapack_int lda,
+                               lapack_int* iseed, double* work);
+lapack_int LAPACKE_clagsy_work(int matrix_order, lapack_int n, lapack_int k, const float* d, lapack_complex_float* a,
+                               lapack_int lda, lapack_int* iseed, lapack_complex_float* work);
+lapack_int LAPACKE_zlagsy_work(int matrix_order, lapack_int n, lapack_int k, const double* d, lapack_complex_double* a,
+                               lapack_int lda, lapack_int* iseed, lapack_complex_double* work);
 
-lapack_int LAPACKE_sopmtr_work( int matrix_order, char side, char uplo,
-                                char trans, lapack_int m, lapack_int n,
-                                const float* ap, const float* tau, float* c,
-                                lapack_int ldc, float* work );
-lapack_int LAPACKE_dopmtr_work( int matrix_order, char side, char uplo,
-                                char trans, lapack_int m, lapack_int n,
-                                const double* ap, const double* tau, double* c,
-                                lapack_int ldc, double* work );
+lapack_int LAPACKE_slapmr_work(int matrix_order, lapack_logical forwrd, lapack_int m, lapack_int n, float* x,
+                               lapack_int ldx, lapack_int* k);
+lapack_int LAPACKE_dlapmr_work(int matrix_order, lapack_logical forwrd, lapack_int m, lapack_int n, double* x,
+                               lapack_int ldx, lapack_int* k);
+lapack_int LAPACKE_clapmr_work(int matrix_order, lapack_logical forwrd, lapack_int m, lapack_int n,
+                               lapack_complex_float* x, lapack_int ldx, lapack_int* k);
+lapack_int LAPACKE_zlapmr_work(int matrix_order, lapack_logical forwrd, lapack_int m, lapack_int n,
+                               lapack_complex_double* x, lapack_int ldx, lapack_int* k);
 
-lapack_int LAPACKE_sorgbr_work( int matrix_order, char vect, lapack_int m,
-                                lapack_int n, lapack_int k, float* a,
-                                lapack_int lda, const float* tau, float* work,
-                                lapack_int lwork );
-lapack_int LAPACKE_dorgbr_work( int matrix_order, char vect, lapack_int m,
-                                lapack_int n, lapack_int k, double* a,
-                                lapack_int lda, const double* tau, double* work,
-                                lapack_int lwork );
+lapack_int LAPACKE_slartgp_work(float f, float g, float* cs, float* sn, float* r);
+lapack_int LAPACKE_dlartgp_work(double f, double g, double* cs, double* sn, double* r);
 
-lapack_int LAPACKE_sorghr_work( int matrix_order, lapack_int n, lapack_int ilo,
-                                lapack_int ihi, float* a, lapack_int lda,
-                                const float* tau, float* work,
-                                lapack_int lwork );
-lapack_int LAPACKE_dorghr_work( int matrix_order, lapack_int n, lapack_int ilo,
-                                lapack_int ihi, double* a, lapack_int lda,
-                                const double* tau, double* work,
-                                lapack_int lwork );
+lapack_int LAPACKE_slartgs_work(float x, float y, float sigma, float* cs, float* sn);
+lapack_int LAPACKE_dlartgs_work(double x, double y, double sigma, double* cs, double* sn);
 
-lapack_int LAPACKE_sorglq_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int k, float* a, lapack_int lda,
-                                const float* tau, float* work,
-                                lapack_int lwork );
-lapack_int LAPACKE_dorglq_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int k, double* a, lapack_int lda,
-                                const double* tau, double* work,
-                                lapack_int lwork );
+float LAPACKE_slapy2_work(float x, float y);
+double LAPACKE_dlapy2_work(double x, double y);
 
-lapack_int LAPACKE_sorgql_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int k, float* a, lapack_int lda,
-                                const float* tau, float* work,
-                                lapack_int lwork );
-lapack_int LAPACKE_dorgql_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int k, double* a, lapack_int lda,
-                                const double* tau, double* work,
-                                lapack_int lwork );
+float LAPACKE_slapy3_work(float x, float y, float z);
+double LAPACKE_dlapy3_work(double x, double y, double z);
 
-lapack_int LAPACKE_sorgqr_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int k, float* a, lapack_int lda,
-                                const float* tau, float* work,
-                                lapack_int lwork );
-lapack_int LAPACKE_dorgqr_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int k, double* a, lapack_int lda,
-                                const double* tau, double* work,
-                                lapack_int lwork );
+float LAPACKE_slamch_work(char cmach);
+double LAPACKE_dlamch_work(char cmach);
 
-lapack_int LAPACKE_sorgrq_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int k, float* a, lapack_int lda,
-                                const float* tau, float* work,
-                                lapack_int lwork );
-lapack_int LAPACKE_dorgrq_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int k, double* a, lapack_int lda,
-                                const double* tau, double* work,
-                                lapack_int lwork );
+float LAPACKE_slange_work(int matrix_order, char norm, lapack_int m, lapack_int n, const float* a, lapack_int lda,
+                          float* work);
+double LAPACKE_dlange_work(int matrix_order, char norm, lapack_int m, lapack_int n, const double* a, lapack_int lda,
+                           double* work);
+float LAPACKE_clange_work(int matrix_order, char norm, lapack_int m, lapack_int n, const lapack_complex_float* a,
+                          lapack_int lda, float* work);
+double LAPACKE_zlange_work(int matrix_order, char norm, lapack_int m, lapack_int n, const lapack_complex_double* a,
+                           lapack_int lda, double* work);
 
-lapack_int LAPACKE_sorgtr_work( int matrix_order, char uplo, lapack_int n,
-                                float* a, lapack_int lda, const float* tau,
-                                float* work, lapack_int lwork );
-lapack_int LAPACKE_dorgtr_work( int matrix_order, char uplo, lapack_int n,
-                                double* a, lapack_int lda, const double* tau,
-                                double* work, lapack_int lwork );
+float LAPACKE_clanhe_work(int matrix_order, char norm, char uplo, lapack_int n, const lapack_complex_float* a,
+                          lapack_int lda, float* work);
+double LAPACKE_zlanhe_work(int matrix_order, char norm, char uplo, lapack_int n, const lapack_complex_double* a,
+                           lapack_int lda, double* work);
 
-lapack_int LAPACKE_sormbr_work( int matrix_order, char vect, char side,
-                                char trans, lapack_int m, lapack_int n,
-                                lapack_int k, const float* a, lapack_int lda,
-                                const float* tau, float* c, lapack_int ldc,
-                                float* work, lapack_int lwork );
-lapack_int LAPACKE_dormbr_work( int matrix_order, char vect, char side,
-                                char trans, lapack_int m, lapack_int n,
-                                lapack_int k, const double* a, lapack_int lda,
-                                const double* tau, double* c, lapack_int ldc,
-                                double* work, lapack_int lwork );
+float LAPACKE_slansy_work(int matrix_order, char norm, char uplo, lapack_int n, const float* a, lapack_int lda,
+                          float* work);
+double LAPACKE_dlansy_work(int matrix_order, char norm, char uplo, lapack_int n, const double* a, lapack_int lda,
+                           double* work);
+float LAPACKE_clansy_work(int matrix_order, char norm, char uplo, lapack_int n, const lapack_complex_float* a,
+                          lapack_int lda, float* work);
+double LAPACKE_zlansy_work(int matrix_order, char norm, char uplo, lapack_int n, const lapack_complex_double* a,
+                           lapack_int lda, double* work);
 
-lapack_int LAPACKE_sormhr_work( int matrix_order, char side, char trans,
-                                lapack_int m, lapack_int n, lapack_int ilo,
-                                lapack_int ihi, const float* a, lapack_int lda,
-                                const float* tau, float* c, lapack_int ldc,
-                                float* work, lapack_int lwork );
-lapack_int LAPACKE_dormhr_work( int matrix_order, char side, char trans,
-                                lapack_int m, lapack_int n, lapack_int ilo,
-                                lapack_int ihi, const double* a, lapack_int lda,
-                                const double* tau, double* c, lapack_int ldc,
-                                double* work, lapack_int lwork );
+float LAPACKE_slantr_work(int matrix_order, char norm, char uplo, char diag, lapack_int m, lapack_int n, const float* a,
+                          lapack_int lda, float* work);
+double LAPACKE_dlantr_work(int matrix_order, char norm, char uplo, char diag, lapack_int m, lapack_int n,
+                           const double* a, lapack_int lda, double* work);
+float LAPACKE_clantr_work(int matrix_order, char norm, char uplo, char diag, lapack_int m, lapack_int n,
+                          const lapack_complex_float* a, lapack_int lda, float* work);
+double LAPACKE_zlantr_work(int matrix_order, char norm, char uplo, char diag, lapack_int m, lapack_int n,
+                           const lapack_complex_double* a, lapack_int lda, double* work);
 
-lapack_int LAPACKE_sormlq_work( int matrix_order, char side, char trans,
-                                lapack_int m, lapack_int n, lapack_int k,
-                                const float* a, lapack_int lda,
-                                const float* tau, float* c, lapack_int ldc,
-                                float* work, lapack_int lwork );
-lapack_int LAPACKE_dormlq_work( int matrix_order, char side, char trans,
-                                lapack_int m, lapack_int n, lapack_int k,
-                                const double* a, lapack_int lda,
-                                const double* tau, double* c, lapack_int ldc,
-                                double* work, lapack_int lwork );
+lapack_int LAPACKE_slarfb_work(int matrix_order, char side, char trans, char direct, char storev, lapack_int m,
+                               lapack_int n, lapack_int k, const float* v, lapack_int ldv, const float* t,
+                               lapack_int ldt, float* c, lapack_int ldc, float* work, lapack_int ldwork);
+lapack_int LAPACKE_dlarfb_work(int matrix_order, char side, char trans, char direct, char storev, lapack_int m,
+                               lapack_int n, lapack_int k, const double* v, lapack_int ldv, const double* t,
+                               lapack_int ldt, double* c, lapack_int ldc, double* work, lapack_int ldwork);
+lapack_int LAPACKE_clarfb_work(int matrix_order, char side, char trans, char direct, char storev, lapack_int m,
+                               lapack_int n, lapack_int k, const lapack_complex_float* v, lapack_int ldv,
+                               const lapack_complex_float* t, lapack_int ldt, lapack_complex_float* c, lapack_int ldc,
+                               lapack_complex_float* work, lapack_int ldwork);
+lapack_int LAPACKE_zlarfb_work(int matrix_order, char side, char trans, char direct, char storev, lapack_int m,
+                               lapack_int n, lapack_int k, const lapack_complex_double* v, lapack_int ldv,
+                               const lapack_complex_double* t, lapack_int ldt, lapack_complex_double* c, lapack_int ldc,
+                               lapack_complex_double* work, lapack_int ldwork);
 
-lapack_int LAPACKE_sormql_work( int matrix_order, char side, char trans,
-                                lapack_int m, lapack_int n, lapack_int k,
-                                const float* a, lapack_int lda,
-                                const float* tau, float* c, lapack_int ldc,
-                                float* work, lapack_int lwork );
-lapack_int LAPACKE_dormql_work( int matrix_order, char side, char trans,
-                                lapack_int m, lapack_int n, lapack_int k,
-                                const double* a, lapack_int lda,
-                                const double* tau, double* c, lapack_int ldc,
-                                double* work, lapack_int lwork );
+lapack_int LAPACKE_slarfg_work(lapack_int n, float* alpha, float* x, lapack_int incx, float* tau);
+lapack_int LAPACKE_dlarfg_work(lapack_int n, double* alpha, double* x, lapack_int incx, double* tau);
+lapack_int LAPACKE_clarfg_work(lapack_int n, lapack_complex_float* alpha, lapack_complex_float* x, lapack_int incx,
+                               lapack_complex_float* tau);
+lapack_int LAPACKE_zlarfg_work(lapack_int n, lapack_complex_double* alpha, lapack_complex_double* x, lapack_int incx,
+                               lapack_complex_double* tau);
 
-lapack_int LAPACKE_sormqr_work( int matrix_order, char side, char trans,
-                                lapack_int m, lapack_int n, lapack_int k,
-                                const float* a, lapack_int lda,
-                                const float* tau, float* c, lapack_int ldc,
-                                float* work, lapack_int lwork );
-lapack_int LAPACKE_dormqr_work( int matrix_order, char side, char trans,
-                                lapack_int m, lapack_int n, lapack_int k,
-                                const double* a, lapack_int lda,
-                                const double* tau, double* c, lapack_int ldc,
-                                double* work, lapack_int lwork );
+lapack_int LAPACKE_slarft_work(int matrix_order, char direct, char storev, lapack_int n, lapack_int k, const float* v,
+                               lapack_int ldv, const float* tau, float* t, lapack_int ldt);
+lapack_int LAPACKE_dlarft_work(int matrix_order, char direct, char storev, lapack_int n, lapack_int k, const double* v,
+                               lapack_int ldv, const double* tau, double* t, lapack_int ldt);
+lapack_int LAPACKE_clarft_work(int matrix_order, char direct, char storev, lapack_int n, lapack_int k,
+                               const lapack_complex_float* v, lapack_int ldv, const lapack_complex_float* tau,
+                               lapack_complex_float* t, lapack_int ldt);
+lapack_int LAPACKE_zlarft_work(int matrix_order, char direct, char storev, lapack_int n, lapack_int k,
+                               const lapack_complex_double* v, lapack_int ldv, const lapack_complex_double* tau,
+                               lapack_complex_double* t, lapack_int ldt);
 
-lapack_int LAPACKE_sormrq_work( int matrix_order, char side, char trans,
-                                lapack_int m, lapack_int n, lapack_int k,
-                                const float* a, lapack_int lda,
-                                const float* tau, float* c, lapack_int ldc,
-                                float* work, lapack_int lwork );
-lapack_int LAPACKE_dormrq_work( int matrix_order, char side, char trans,
-                                lapack_int m, lapack_int n, lapack_int k,
-                                const double* a, lapack_int lda,
-                                const double* tau, double* c, lapack_int ldc,
-                                double* work, lapack_int lwork );
+lapack_int LAPACKE_slarfx_work(int matrix_order, char side, lapack_int m, lapack_int n, const float* v, float tau,
+                               float* c, lapack_int ldc, float* work);
+lapack_int LAPACKE_dlarfx_work(int matrix_order, char side, lapack_int m, lapack_int n, const double* v, double tau,
+                               double* c, lapack_int ldc, double* work);
+lapack_int LAPACKE_clarfx_work(int matrix_order, char side, lapack_int m, lapack_int n, const lapack_complex_float* v,
+                               lapack_complex_float tau, lapack_complex_float* c, lapack_int ldc,
+                               lapack_complex_float* work);
+lapack_int LAPACKE_zlarfx_work(int matrix_order, char side, lapack_int m, lapack_int n, const lapack_complex_double* v,
+                               lapack_complex_double tau, lapack_complex_double* c, lapack_int ldc,
+                               lapack_complex_double* work);
 
-lapack_int LAPACKE_sormrz_work( int matrix_order, char side, char trans,
-                                lapack_int m, lapack_int n, lapack_int k,
-                                lapack_int l, const float* a, lapack_int lda,
-                                const float* tau, float* c, lapack_int ldc,
-                                float* work, lapack_int lwork );
-lapack_int LAPACKE_dormrz_work( int matrix_order, char side, char trans,
-                                lapack_int m, lapack_int n, lapack_int k,
-                                lapack_int l, const double* a, lapack_int lda,
-                                const double* tau, double* c, lapack_int ldc,
-                                double* work, lapack_int lwork );
+lapack_int LAPACKE_slarnv_work(lapack_int idist, lapack_int* iseed, lapack_int n, float* x);
+lapack_int LAPACKE_dlarnv_work(lapack_int idist, lapack_int* iseed, lapack_int n, double* x);
+lapack_int LAPACKE_clarnv_work(lapack_int idist, lapack_int* iseed, lapack_int n, lapack_complex_float* x);
+lapack_int LAPACKE_zlarnv_work(lapack_int idist, lapack_int* iseed, lapack_int n, lapack_complex_double* x);
 
-lapack_int LAPACKE_sormtr_work( int matrix_order, char side, char uplo,
-                                char trans, lapack_int m, lapack_int n,
-                                const float* a, lapack_int lda,
-                                const float* tau, float* c, lapack_int ldc,
-                                float* work, lapack_int lwork );
-lapack_int LAPACKE_dormtr_work( int matrix_order, char side, char uplo,
-                                char trans, lapack_int m, lapack_int n,
-                                const double* a, lapack_int lda,
-                                const double* tau, double* c, lapack_int ldc,
-                                double* work, lapack_int lwork );
+lapack_int LAPACKE_slaset_work(int matrix_order, char uplo, lapack_int m, lapack_int n, float alpha, float beta,
+                               float* a, lapack_int lda);
+lapack_int LAPACKE_dlaset_work(int matrix_order, char uplo, lapack_int m, lapack_int n, double alpha, double beta,
+                               double* a, lapack_int lda);
+lapack_int LAPACKE_claset_work(int matrix_order, char uplo, lapack_int m, lapack_int n, lapack_complex_float alpha,
+                               lapack_complex_float beta, lapack_complex_float* a, lapack_int lda);
+lapack_int LAPACKE_zlaset_work(int matrix_order, char uplo, lapack_int m, lapack_int n, lapack_complex_double alpha,
+                               lapack_complex_double beta, lapack_complex_double* a, lapack_int lda);
 
-lapack_int LAPACKE_spbcon_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int kd, const float* ab, lapack_int ldab,
-                                float anorm, float* rcond, float* work,
-                                lapack_int* iwork );
-lapack_int LAPACKE_dpbcon_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int kd, const double* ab,
-                                lapack_int ldab, double anorm, double* rcond,
-                                double* work, lapack_int* iwork );
-lapack_int LAPACKE_cpbcon_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int kd, const lapack_complex_float* ab,
-                                lapack_int ldab, float anorm, float* rcond,
-                                lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_zpbcon_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int kd, const lapack_complex_double* ab,
-                                lapack_int ldab, double anorm, double* rcond,
-                                lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_slasrt_work(char id, lapack_int n, float* d);
+lapack_int LAPACKE_dlasrt_work(char id, lapack_int n, double* d);
 
-lapack_int LAPACKE_spbequ_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int kd, const float* ab, lapack_int ldab,
-                                float* s, float* scond, float* amax );
-lapack_int LAPACKE_dpbequ_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int kd, const double* ab,
-                                lapack_int ldab, double* s, double* scond,
-                                double* amax );
-lapack_int LAPACKE_cpbequ_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int kd, const lapack_complex_float* ab,
-                                lapack_int ldab, float* s, float* scond,
-                                float* amax );
-lapack_int LAPACKE_zpbequ_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int kd, const lapack_complex_double* ab,
-                                lapack_int ldab, double* s, double* scond,
-                                double* amax );
+lapack_int LAPACKE_slaswp_work(int matrix_order, lapack_int n, float* a, lapack_int lda, lapack_int k1, lapack_int k2,
+                               const lapack_int* ipiv, lapack_int incx);
+lapack_int LAPACKE_dlaswp_work(int matrix_order, lapack_int n, double* a, lapack_int lda, lapack_int k1, lapack_int k2,
+                               const lapack_int* ipiv, lapack_int incx);
+lapack_int LAPACKE_claswp_work(int matrix_order, lapack_int n, lapack_complex_float* a, lapack_int lda, lapack_int k1,
+                               lapack_int k2, const lapack_int* ipiv, lapack_int incx);
+lapack_int LAPACKE_zlaswp_work(int matrix_order, lapack_int n, lapack_complex_double* a, lapack_int lda, lapack_int k1,
+                               lapack_int k2, const lapack_int* ipiv, lapack_int incx);
 
-lapack_int LAPACKE_spbrfs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int kd, lapack_int nrhs, const float* ab,
-                                lapack_int ldab, const float* afb,
-                                lapack_int ldafb, const float* b,
-                                lapack_int ldb, float* x, lapack_int ldx,
-                                float* ferr, float* berr, float* work,
-                                lapack_int* iwork );
-lapack_int LAPACKE_dpbrfs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int kd, lapack_int nrhs,
-                                const double* ab, lapack_int ldab,
-                                const double* afb, lapack_int ldafb,
-                                const double* b, lapack_int ldb, double* x,
-                                lapack_int ldx, double* ferr, double* berr,
-                                double* work, lapack_int* iwork );
-lapack_int LAPACKE_cpbrfs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int kd, lapack_int nrhs,
-                                const lapack_complex_float* ab, lapack_int ldab,
-                                const lapack_complex_float* afb,
-                                lapack_int ldafb, const lapack_complex_float* b,
-                                lapack_int ldb, lapack_complex_float* x,
-                                lapack_int ldx, float* ferr, float* berr,
-                                lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_zpbrfs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int kd, lapack_int nrhs,
-                                const lapack_complex_double* ab,
-                                lapack_int ldab,
-                                const lapack_complex_double* afb,
-                                lapack_int ldafb,
-                                const lapack_complex_double* b, lapack_int ldb,
-                                lapack_complex_double* x, lapack_int ldx,
-                                double* ferr, double* berr,
-                                lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_slatms_work(int matrix_order, lapack_int m, lapack_int n, char dist, lapack_int* iseed, char sym,
+                               float* d, lapack_int mode, float cond, float dmax, lapack_int kl, lapack_int ku,
+                               char pack, float* a, lapack_int lda, float* work);
+lapack_int LAPACKE_dlatms_work(int matrix_order, lapack_int m, lapack_int n, char dist, lapack_int* iseed, char sym,
+                               double* d, lapack_int mode, double cond, double dmax, lapack_int kl, lapack_int ku,
+                               char pack, double* a, lapack_int lda, double* work);
+lapack_int LAPACKE_clatms_work(int matrix_order, lapack_int m, lapack_int n, char dist, lapack_int* iseed, char sym,
+                               float* d, lapack_int mode, float cond, float dmax, lapack_int kl, lapack_int ku,
+                               char pack, lapack_complex_float* a, lapack_int lda, lapack_complex_float* work);
+lapack_int LAPACKE_zlatms_work(int matrix_order, lapack_int m, lapack_int n, char dist, lapack_int* iseed, char sym,
+                               double* d, lapack_int mode, double cond, double dmax, lapack_int kl, lapack_int ku,
+                               char pack, lapack_complex_double* a, lapack_int lda, lapack_complex_double* work);
 
-lapack_int LAPACKE_spbstf_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int kb, float* bb, lapack_int ldbb );
-lapack_int LAPACKE_dpbstf_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int kb, double* bb, lapack_int ldbb );
-lapack_int LAPACKE_cpbstf_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int kb, lapack_complex_float* bb,
-                                lapack_int ldbb );
-lapack_int LAPACKE_zpbstf_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int kb, lapack_complex_double* bb,
-                                lapack_int ldbb );
+lapack_int LAPACKE_slauum_work(int matrix_order, char uplo, lapack_int n, float* a, lapack_int lda);
+lapack_int LAPACKE_dlauum_work(int matrix_order, char uplo, lapack_int n, double* a, lapack_int lda);
+lapack_int LAPACKE_clauum_work(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda);
+lapack_int LAPACKE_zlauum_work(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int lda);
 
-lapack_int LAPACKE_spbsv_work( int matrix_order, char uplo, lapack_int n,
-                               lapack_int kd, lapack_int nrhs, float* ab,
-                               lapack_int ldab, float* b, lapack_int ldb );
-lapack_int LAPACKE_dpbsv_work( int matrix_order, char uplo, lapack_int n,
-                               lapack_int kd, lapack_int nrhs, double* ab,
-                               lapack_int ldab, double* b, lapack_int ldb );
-lapack_int LAPACKE_cpbsv_work( int matrix_order, char uplo, lapack_int n,
-                               lapack_int kd, lapack_int nrhs,
-                               lapack_complex_float* ab, lapack_int ldab,
-                               lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_zpbsv_work( int matrix_order, char uplo, lapack_int n,
-                               lapack_int kd, lapack_int nrhs,
-                               lapack_complex_double* ab, lapack_int ldab,
-                               lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_sopgtr_work(int matrix_order, char uplo, lapack_int n, const float* ap, const float* tau, float* q,
+                               lapack_int ldq, float* work);
+lapack_int LAPACKE_dopgtr_work(int matrix_order, char uplo, lapack_int n, const double* ap, const double* tau,
+                               double* q, lapack_int ldq, double* work);
 
-lapack_int LAPACKE_spbsvx_work( int matrix_order, char fact, char uplo,
-                                lapack_int n, lapack_int kd, lapack_int nrhs,
-                                float* ab, lapack_int ldab, float* afb,
-                                lapack_int ldafb, char* equed, float* s,
-                                float* b, lapack_int ldb, float* x,
-                                lapack_int ldx, float* rcond, float* ferr,
-                                float* berr, float* work, lapack_int* iwork );
-lapack_int LAPACKE_dpbsvx_work( int matrix_order, char fact, char uplo,
-                                lapack_int n, lapack_int kd, lapack_int nrhs,
-                                double* ab, lapack_int ldab, double* afb,
-                                lapack_int ldafb, char* equed, double* s,
-                                double* b, lapack_int ldb, double* x,
-                                lapack_int ldx, double* rcond, double* ferr,
-                                double* berr, double* work, lapack_int* iwork );
-lapack_int LAPACKE_cpbsvx_work( int matrix_order, char fact, char uplo,
-                                lapack_int n, lapack_int kd, lapack_int nrhs,
-                                lapack_complex_float* ab, lapack_int ldab,
-                                lapack_complex_float* afb, lapack_int ldafb,
-                                char* equed, float* s, lapack_complex_float* b,
-                                lapack_int ldb, lapack_complex_float* x,
-                                lapack_int ldx, float* rcond, float* ferr,
-                                float* berr, lapack_complex_float* work,
-                                float* rwork );
-lapack_int LAPACKE_zpbsvx_work( int matrix_order, char fact, char uplo,
-                                lapack_int n, lapack_int kd, lapack_int nrhs,
-                                lapack_complex_double* ab, lapack_int ldab,
-                                lapack_complex_double* afb, lapack_int ldafb,
-                                char* equed, double* s,
-                                lapack_complex_double* b, lapack_int ldb,
-                                lapack_complex_double* x, lapack_int ldx,
-                                double* rcond, double* ferr, double* berr,
-                                lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_sopmtr_work(int matrix_order, char side, char uplo, char trans, lapack_int m, lapack_int n,
+                               const float* ap, const float* tau, float* c, lapack_int ldc, float* work);
+lapack_int LAPACKE_dopmtr_work(int matrix_order, char side, char uplo, char trans, lapack_int m, lapack_int n,
+                               const double* ap, const double* tau, double* c, lapack_int ldc, double* work);
 
-lapack_int LAPACKE_spbtrf_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int kd, float* ab, lapack_int ldab );
-lapack_int LAPACKE_dpbtrf_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int kd, double* ab, lapack_int ldab );
-lapack_int LAPACKE_cpbtrf_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int kd, lapack_complex_float* ab,
-                                lapack_int ldab );
-lapack_int LAPACKE_zpbtrf_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int kd, lapack_complex_double* ab,
-                                lapack_int ldab );
+lapack_int LAPACKE_sorgbr_work(int matrix_order, char vect, lapack_int m, lapack_int n, lapack_int k, float* a,
+                               lapack_int lda, const float* tau, float* work, lapack_int lwork);
+lapack_int LAPACKE_dorgbr_work(int matrix_order, char vect, lapack_int m, lapack_int n, lapack_int k, double* a,
+                               lapack_int lda, const double* tau, double* work, lapack_int lwork);
 
-lapack_int LAPACKE_spbtrs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int kd, lapack_int nrhs, const float* ab,
-                                lapack_int ldab, float* b, lapack_int ldb );
-lapack_int LAPACKE_dpbtrs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int kd, lapack_int nrhs,
-                                const double* ab, lapack_int ldab, double* b,
-                                lapack_int ldb );
-lapack_int LAPACKE_cpbtrs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int kd, lapack_int nrhs,
-                                const lapack_complex_float* ab, lapack_int ldab,
-                                lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_zpbtrs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int kd, lapack_int nrhs,
-                                const lapack_complex_double* ab,
-                                lapack_int ldab, lapack_complex_double* b,
-                                lapack_int ldb );
+lapack_int LAPACKE_sorghr_work(int matrix_order, lapack_int n, lapack_int ilo, lapack_int ihi, float* a, lapack_int lda,
+                               const float* tau, float* work, lapack_int lwork);
+lapack_int LAPACKE_dorghr_work(int matrix_order, lapack_int n, lapack_int ilo, lapack_int ihi, double* a,
+                               lapack_int lda, const double* tau, double* work, lapack_int lwork);
 
-lapack_int LAPACKE_spftrf_work( int matrix_order, char transr, char uplo,
-                                lapack_int n, float* a );
-lapack_int LAPACKE_dpftrf_work( int matrix_order, char transr, char uplo,
-                                lapack_int n, double* a );
-lapack_int LAPACKE_cpftrf_work( int matrix_order, char transr, char uplo,
-                                lapack_int n, lapack_complex_float* a );
-lapack_int LAPACKE_zpftrf_work( int matrix_order, char transr, char uplo,
-                                lapack_int n, lapack_complex_double* a );
+lapack_int LAPACKE_sorglq_work(int matrix_order, lapack_int m, lapack_int n, lapack_int k, float* a, lapack_int lda,
+                               const float* tau, float* work, lapack_int lwork);
+lapack_int LAPACKE_dorglq_work(int matrix_order, lapack_int m, lapack_int n, lapack_int k, double* a, lapack_int lda,
+                               const double* tau, double* work, lapack_int lwork);
 
-lapack_int LAPACKE_spftri_work( int matrix_order, char transr, char uplo,
-                                lapack_int n, float* a );
-lapack_int LAPACKE_dpftri_work( int matrix_order, char transr, char uplo,
-                                lapack_int n, double* a );
-lapack_int LAPACKE_cpftri_work( int matrix_order, char transr, char uplo,
-                                lapack_int n, lapack_complex_float* a );
-lapack_int LAPACKE_zpftri_work( int matrix_order, char transr, char uplo,
-                                lapack_int n, lapack_complex_double* a );
+lapack_int LAPACKE_sorgql_work(int matrix_order, lapack_int m, lapack_int n, lapack_int k, float* a, lapack_int lda,
+                               const float* tau, float* work, lapack_int lwork);
+lapack_int LAPACKE_dorgql_work(int matrix_order, lapack_int m, lapack_int n, lapack_int k, double* a, lapack_int lda,
+                               const double* tau, double* work, lapack_int lwork);
 
-lapack_int LAPACKE_spftrs_work( int matrix_order, char transr, char uplo,
-                                lapack_int n, lapack_int nrhs, const float* a,
-                                float* b, lapack_int ldb );
-lapack_int LAPACKE_dpftrs_work( int matrix_order, char transr, char uplo,
-                                lapack_int n, lapack_int nrhs, const double* a,
-                                double* b, lapack_int ldb );
-lapack_int LAPACKE_cpftrs_work( int matrix_order, char transr, char uplo,
-                                lapack_int n, lapack_int nrhs,
-                                const lapack_complex_float* a,
-                                lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_zpftrs_work( int matrix_order, char transr, char uplo,
-                                lapack_int n, lapack_int nrhs,
-                                const lapack_complex_double* a,
-                                lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_sorgqr_work(int matrix_order, lapack_int m, lapack_int n, lapack_int k, float* a, lapack_int lda,
+                               const float* tau, float* work, lapack_int lwork);
+lapack_int LAPACKE_dorgqr_work(int matrix_order, lapack_int m, lapack_int n, lapack_int k, double* a, lapack_int lda,
+                               const double* tau, double* work, lapack_int lwork);
 
-lapack_int LAPACKE_spocon_work( int matrix_order, char uplo, lapack_int n,
-                                const float* a, lapack_int lda, float anorm,
-                                float* rcond, float* work, lapack_int* iwork );
-lapack_int LAPACKE_dpocon_work( int matrix_order, char uplo, lapack_int n,
-                                const double* a, lapack_int lda, double anorm,
-                                double* rcond, double* work,
-                                lapack_int* iwork );
-lapack_int LAPACKE_cpocon_work( int matrix_order, char uplo, lapack_int n,
-                                const lapack_complex_float* a, lapack_int lda,
-                                float anorm, float* rcond,
-                                lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_zpocon_work( int matrix_order, char uplo, lapack_int n,
-                                const lapack_complex_double* a, lapack_int lda,
-                                double anorm, double* rcond,
-                                lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_sorgrq_work(int matrix_order, lapack_int m, lapack_int n, lapack_int k, float* a, lapack_int lda,
+                               const float* tau, float* work, lapack_int lwork);
+lapack_int LAPACKE_dorgrq_work(int matrix_order, lapack_int m, lapack_int n, lapack_int k, double* a, lapack_int lda,
+                               const double* tau, double* work, lapack_int lwork);
 
-lapack_int LAPACKE_spoequ_work( int matrix_order, lapack_int n, const float* a,
-                                lapack_int lda, float* s, float* scond,
-                                float* amax );
-lapack_int LAPACKE_dpoequ_work( int matrix_order, lapack_int n, const double* a,
-                                lapack_int lda, double* s, double* scond,
-                                double* amax );
-lapack_int LAPACKE_cpoequ_work( int matrix_order, lapack_int n,
-                                const lapack_complex_float* a, lapack_int lda,
-                                float* s, float* scond, float* amax );
-lapack_int LAPACKE_zpoequ_work( int matrix_order, lapack_int n,
-                                const lapack_complex_double* a, lapack_int lda,
-                                double* s, double* scond, double* amax );
+lapack_int LAPACKE_sorgtr_work(int matrix_order, char uplo, lapack_int n, float* a, lapack_int lda, const float* tau,
+                               float* work, lapack_int lwork);
+lapack_int LAPACKE_dorgtr_work(int matrix_order, char uplo, lapack_int n, double* a, lapack_int lda, const double* tau,
+                               double* work, lapack_int lwork);
 
-lapack_int LAPACKE_spoequb_work( int matrix_order, lapack_int n, const float* a,
-                                 lapack_int lda, float* s, float* scond,
-                                 float* amax );
-lapack_int LAPACKE_dpoequb_work( int matrix_order, lapack_int n,
-                                 const double* a, lapack_int lda, double* s,
-                                 double* scond, double* amax );
-lapack_int LAPACKE_cpoequb_work( int matrix_order, lapack_int n,
-                                 const lapack_complex_float* a, lapack_int lda,
-                                 float* s, float* scond, float* amax );
-lapack_int LAPACKE_zpoequb_work( int matrix_order, lapack_int n,
-                                 const lapack_complex_double* a, lapack_int lda,
-                                 double* s, double* scond, double* amax );
+lapack_int LAPACKE_sormbr_work(int matrix_order, char vect, char side, char trans, lapack_int m, lapack_int n,
+                               lapack_int k, const float* a, lapack_int lda, const float* tau, float* c, lapack_int ldc,
+                               float* work, lapack_int lwork);
+lapack_int LAPACKE_dormbr_work(int matrix_order, char vect, char side, char trans, lapack_int m, lapack_int n,
+                               lapack_int k, const double* a, lapack_int lda, const double* tau, double* c,
+                               lapack_int ldc, double* work, lapack_int lwork);
 
-lapack_int LAPACKE_sporfs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const float* a, lapack_int lda,
-                                const float* af, lapack_int ldaf,
-                                const float* b, lapack_int ldb, float* x,
-                                lapack_int ldx, float* ferr, float* berr,
-                                float* work, lapack_int* iwork );
-lapack_int LAPACKE_dporfs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const double* a,
-                                lapack_int lda, const double* af,
-                                lapack_int ldaf, const double* b,
-                                lapack_int ldb, double* x, lapack_int ldx,
-                                double* ferr, double* berr, double* work,
-                                lapack_int* iwork );
-lapack_int LAPACKE_cporfs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const lapack_complex_float* a,
-                                lapack_int lda, const lapack_complex_float* af,
-                                lapack_int ldaf, const lapack_complex_float* b,
-                                lapack_int ldb, lapack_complex_float* x,
-                                lapack_int ldx, float* ferr, float* berr,
-                                lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_zporfs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const lapack_complex_double* a,
-                                lapack_int lda, const lapack_complex_double* af,
-                                lapack_int ldaf, const lapack_complex_double* b,
-                                lapack_int ldb, lapack_complex_double* x,
-                                lapack_int ldx, double* ferr, double* berr,
-                                lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_sormhr_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int ilo,
+                               lapack_int ihi, const float* a, lapack_int lda, const float* tau, float* c,
+                               lapack_int ldc, float* work, lapack_int lwork);
+lapack_int LAPACKE_dormhr_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int ilo,
+                               lapack_int ihi, const double* a, lapack_int lda, const double* tau, double* c,
+                               lapack_int ldc, double* work, lapack_int lwork);
 
-lapack_int LAPACKE_sporfsx_work( int matrix_order, char uplo, char equed,
-                                 lapack_int n, lapack_int nrhs, const float* a,
-                                 lapack_int lda, const float* af,
-                                 lapack_int ldaf, const float* s,
-                                 const float* b, lapack_int ldb, float* x,
-                                 lapack_int ldx, float* rcond, float* berr,
-                                 lapack_int n_err_bnds, float* err_bnds_norm,
-                                 float* err_bnds_comp, lapack_int nparams,
-                                 float* params, float* work,
-                                 lapack_int* iwork );
-lapack_int LAPACKE_dporfsx_work( int matrix_order, char uplo, char equed,
-                                 lapack_int n, lapack_int nrhs, const double* a,
-                                 lapack_int lda, const double* af,
-                                 lapack_int ldaf, const double* s,
-                                 const double* b, lapack_int ldb, double* x,
-                                 lapack_int ldx, double* rcond, double* berr,
-                                 lapack_int n_err_bnds, double* err_bnds_norm,
-                                 double* err_bnds_comp, lapack_int nparams,
-                                 double* params, double* work,
-                                 lapack_int* iwork );
-lapack_int LAPACKE_cporfsx_work( int matrix_order, char uplo, char equed,
-                                 lapack_int n, lapack_int nrhs,
-                                 const lapack_complex_float* a, lapack_int lda,
-                                 const lapack_complex_float* af,
-                                 lapack_int ldaf, const float* s,
-                                 const lapack_complex_float* b, lapack_int ldb,
-                                 lapack_complex_float* x, lapack_int ldx,
-                                 float* rcond, float* berr,
-                                 lapack_int n_err_bnds, float* err_bnds_norm,
-                                 float* err_bnds_comp, lapack_int nparams,
-                                 float* params, lapack_complex_float* work,
-                                 float* rwork );
-lapack_int LAPACKE_zporfsx_work( int matrix_order, char uplo, char equed,
-                                 lapack_int n, lapack_int nrhs,
-                                 const lapack_complex_double* a, lapack_int lda,
-                                 const lapack_complex_double* af,
-                                 lapack_int ldaf, const double* s,
-                                 const lapack_complex_double* b, lapack_int ldb,
-                                 lapack_complex_double* x, lapack_int ldx,
-                                 double* rcond, double* berr,
-                                 lapack_int n_err_bnds, double* err_bnds_norm,
-                                 double* err_bnds_comp, lapack_int nparams,
-                                 double* params, lapack_complex_double* work,
-                                 double* rwork );
+lapack_int LAPACKE_sormlq_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                               const float* a, lapack_int lda, const float* tau, float* c, lapack_int ldc, float* work,
+                               lapack_int lwork);
+lapack_int LAPACKE_dormlq_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                               const double* a, lapack_int lda, const double* tau, double* c, lapack_int ldc,
+                               double* work, lapack_int lwork);
 
-lapack_int LAPACKE_sposv_work( int matrix_order, char uplo, lapack_int n,
-                               lapack_int nrhs, float* a, lapack_int lda,
-                               float* b, lapack_int ldb );
-lapack_int LAPACKE_dposv_work( int matrix_order, char uplo, lapack_int n,
-                               lapack_int nrhs, double* a, lapack_int lda,
-                               double* b, lapack_int ldb );
-lapack_int LAPACKE_cposv_work( int matrix_order, char uplo, lapack_int n,
-                               lapack_int nrhs, lapack_complex_float* a,
-                               lapack_int lda, lapack_complex_float* b,
-                               lapack_int ldb );
-lapack_int LAPACKE_zposv_work( int matrix_order, char uplo, lapack_int n,
-                               lapack_int nrhs, lapack_complex_double* a,
-                               lapack_int lda, lapack_complex_double* b,
-                               lapack_int ldb );
-lapack_int LAPACKE_dsposv_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, double* a, lapack_int lda,
-                                double* b, lapack_int ldb, double* x,
-                                lapack_int ldx, double* work, float* swork,
-                                lapack_int* iter );
-lapack_int LAPACKE_zcposv_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, lapack_complex_double* a,
-                                lapack_int lda, lapack_complex_double* b,
-                                lapack_int ldb, lapack_complex_double* x,
-                                lapack_int ldx, lapack_complex_double* work,
-                                lapack_complex_float* swork, double* rwork,
-                                lapack_int* iter );
+lapack_int LAPACKE_sormql_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                               const float* a, lapack_int lda, const float* tau, float* c, lapack_int ldc, float* work,
+                               lapack_int lwork);
+lapack_int LAPACKE_dormql_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                               const double* a, lapack_int lda, const double* tau, double* c, lapack_int ldc,
+                               double* work, lapack_int lwork);
 
-lapack_int LAPACKE_sposvx_work( int matrix_order, char fact, char uplo,
-                                lapack_int n, lapack_int nrhs, float* a,
-                                lapack_int lda, float* af, lapack_int ldaf,
-                                char* equed, float* s, float* b, lapack_int ldb,
-                                float* x, lapack_int ldx, float* rcond,
-                                float* ferr, float* berr, float* work,
-                                lapack_int* iwork );
-lapack_int LAPACKE_dposvx_work( int matrix_order, char fact, char uplo,
-                                lapack_int n, lapack_int nrhs, double* a,
-                                lapack_int lda, double* af, lapack_int ldaf,
-                                char* equed, double* s, double* b,
-                                lapack_int ldb, double* x, lapack_int ldx,
-                                double* rcond, double* ferr, double* berr,
-                                double* work, lapack_int* iwork );
-lapack_int LAPACKE_cposvx_work( int matrix_order, char fact, char uplo,
-                                lapack_int n, lapack_int nrhs,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_complex_float* af, lapack_int ldaf,
-                                char* equed, float* s, lapack_complex_float* b,
-                                lapack_int ldb, lapack_complex_float* x,
-                                lapack_int ldx, float* rcond, float* ferr,
-                                float* berr, lapack_complex_float* work,
-                                float* rwork );
-lapack_int LAPACKE_zposvx_work( int matrix_order, char fact, char uplo,
-                                lapack_int n, lapack_int nrhs,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_complex_double* af, lapack_int ldaf,
-                                char* equed, double* s,
-                                lapack_complex_double* b, lapack_int ldb,
-                                lapack_complex_double* x, lapack_int ldx,
-                                double* rcond, double* ferr, double* berr,
-                                lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_sormqr_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                               const float* a, lapack_int lda, const float* tau, float* c, lapack_int ldc, float* work,
+                               lapack_int lwork);
+lapack_int LAPACKE_dormqr_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                               const double* a, lapack_int lda, const double* tau, double* c, lapack_int ldc,
+                               double* work, lapack_int lwork);
 
-lapack_int LAPACKE_sposvxx_work( int matrix_order, char fact, char uplo,
-                                 lapack_int n, lapack_int nrhs, float* a,
-                                 lapack_int lda, float* af, lapack_int ldaf,
-                                 char* equed, float* s, float* b,
-                                 lapack_int ldb, float* x, lapack_int ldx,
-                                 float* rcond, float* rpvgrw, float* berr,
-                                 lapack_int n_err_bnds, float* err_bnds_norm,
-                                 float* err_bnds_comp, lapack_int nparams,
-                                 float* params, float* work,
-                                 lapack_int* iwork );
-lapack_int LAPACKE_dposvxx_work( int matrix_order, char fact, char uplo,
-                                 lapack_int n, lapack_int nrhs, double* a,
-                                 lapack_int lda, double* af, lapack_int ldaf,
-                                 char* equed, double* s, double* b,
-                                 lapack_int ldb, double* x, lapack_int ldx,
-                                 double* rcond, double* rpvgrw, double* berr,
-                                 lapack_int n_err_bnds, double* err_bnds_norm,
-                                 double* err_bnds_comp, lapack_int nparams,
-                                 double* params, double* work,
-                                 lapack_int* iwork );
-lapack_int LAPACKE_cposvxx_work( int matrix_order, char fact, char uplo,
-                                 lapack_int n, lapack_int nrhs,
-                                 lapack_complex_float* a, lapack_int lda,
-                                 lapack_complex_float* af, lapack_int ldaf,
-                                 char* equed, float* s, lapack_complex_float* b,
-                                 lapack_int ldb, lapack_complex_float* x,
-                                 lapack_int ldx, float* rcond, float* rpvgrw,
-                                 float* berr, lapack_int n_err_bnds,
-                                 float* err_bnds_norm, float* err_bnds_comp,
-                                 lapack_int nparams, float* params,
-                                 lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_zposvxx_work( int matrix_order, char fact, char uplo,
-                                 lapack_int n, lapack_int nrhs,
-                                 lapack_complex_double* a, lapack_int lda,
-                                 lapack_complex_double* af, lapack_int ldaf,
-                                 char* equed, double* s,
-                                 lapack_complex_double* b, lapack_int ldb,
-                                 lapack_complex_double* x, lapack_int ldx,
-                                 double* rcond, double* rpvgrw, double* berr,
-                                 lapack_int n_err_bnds, double* err_bnds_norm,
-                                 double* err_bnds_comp, lapack_int nparams,
-                                 double* params, lapack_complex_double* work,
-                                 double* rwork );
+lapack_int LAPACKE_sormrq_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                               const float* a, lapack_int lda, const float* tau, float* c, lapack_int ldc, float* work,
+                               lapack_int lwork);
+lapack_int LAPACKE_dormrq_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                               const double* a, lapack_int lda, const double* tau, double* c, lapack_int ldc,
+                               double* work, lapack_int lwork);
 
-lapack_int LAPACKE_spotrf_work( int matrix_order, char uplo, lapack_int n,
-                                float* a, lapack_int lda );
-lapack_int LAPACKE_dpotrf_work( int matrix_order, char uplo, lapack_int n,
-                                double* a, lapack_int lda );
-lapack_int LAPACKE_cpotrf_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda );
-lapack_int LAPACKE_zpotrf_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda );
+lapack_int LAPACKE_sormrz_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                               lapack_int l, const float* a, lapack_int lda, const float* tau, float* c, lapack_int ldc,
+                               float* work, lapack_int lwork);
+lapack_int LAPACKE_dormrz_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                               lapack_int l, const double* a, lapack_int lda, const double* tau, double* c,
+                               lapack_int ldc, double* work, lapack_int lwork);
 
-lapack_int LAPACKE_spotri_work( int matrix_order, char uplo, lapack_int n,
-                                float* a, lapack_int lda );
-lapack_int LAPACKE_dpotri_work( int matrix_order, char uplo, lapack_int n,
-                                double* a, lapack_int lda );
-lapack_int LAPACKE_cpotri_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda );
-lapack_int LAPACKE_zpotri_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda );
+lapack_int LAPACKE_sormtr_work(int matrix_order, char side, char uplo, char trans, lapack_int m, lapack_int n,
+                               const float* a, lapack_int lda, const float* tau, float* c, lapack_int ldc, float* work,
+                               lapack_int lwork);
+lapack_int LAPACKE_dormtr_work(int matrix_order, char side, char uplo, char trans, lapack_int m, lapack_int n,
+                               const double* a, lapack_int lda, const double* tau, double* c, lapack_int ldc,
+                               double* work, lapack_int lwork);
 
-lapack_int LAPACKE_spotrs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const float* a, lapack_int lda,
-                                float* b, lapack_int ldb );
-lapack_int LAPACKE_dpotrs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const double* a,
-                                lapack_int lda, double* b, lapack_int ldb );
-lapack_int LAPACKE_cpotrs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const lapack_complex_float* a,
-                                lapack_int lda, lapack_complex_float* b,
-                                lapack_int ldb );
-lapack_int LAPACKE_zpotrs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const lapack_complex_double* a,
-                                lapack_int lda, lapack_complex_double* b,
-                                lapack_int ldb );
+lapack_int LAPACKE_spbcon_work(int matrix_order, char uplo, lapack_int n, lapack_int kd, const float* ab,
+                               lapack_int ldab, float anorm, float* rcond, float* work, lapack_int* iwork);
+lapack_int LAPACKE_dpbcon_work(int matrix_order, char uplo, lapack_int n, lapack_int kd, const double* ab,
+                               lapack_int ldab, double anorm, double* rcond, double* work, lapack_int* iwork);
+lapack_int LAPACKE_cpbcon_work(int matrix_order, char uplo, lapack_int n, lapack_int kd, const lapack_complex_float* ab,
+                               lapack_int ldab, float anorm, float* rcond, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zpbcon_work(int matrix_order, char uplo, lapack_int n, lapack_int kd,
+                               const lapack_complex_double* ab, lapack_int ldab, double anorm, double* rcond,
+                               lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_sppcon_work( int matrix_order, char uplo, lapack_int n,
-                                const float* ap, float anorm, float* rcond,
-                                float* work, lapack_int* iwork );
-lapack_int LAPACKE_dppcon_work( int matrix_order, char uplo, lapack_int n,
-                                const double* ap, double anorm, double* rcond,
-                                double* work, lapack_int* iwork );
-lapack_int LAPACKE_cppcon_work( int matrix_order, char uplo, lapack_int n,
-                                const lapack_complex_float* ap, float anorm,
-                                float* rcond, lapack_complex_float* work,
-                                float* rwork );
-lapack_int LAPACKE_zppcon_work( int matrix_order, char uplo, lapack_int n,
-                                const lapack_complex_double* ap, double anorm,
-                                double* rcond, lapack_complex_double* work,
-                                double* rwork );
+lapack_int LAPACKE_spbequ_work(int matrix_order, char uplo, lapack_int n, lapack_int kd, const float* ab,
+                               lapack_int ldab, float* s, float* scond, float* amax);
+lapack_int LAPACKE_dpbequ_work(int matrix_order, char uplo, lapack_int n, lapack_int kd, const double* ab,
+                               lapack_int ldab, double* s, double* scond, double* amax);
+lapack_int LAPACKE_cpbequ_work(int matrix_order, char uplo, lapack_int n, lapack_int kd, const lapack_complex_float* ab,
+                               lapack_int ldab, float* s, float* scond, float* amax);
+lapack_int LAPACKE_zpbequ_work(int matrix_order, char uplo, lapack_int n, lapack_int kd,
+                               const lapack_complex_double* ab, lapack_int ldab, double* s, double* scond,
+                               double* amax);
 
-lapack_int LAPACKE_sppequ_work( int matrix_order, char uplo, lapack_int n,
-                                const float* ap, float* s, float* scond,
-                                float* amax );
-lapack_int LAPACKE_dppequ_work( int matrix_order, char uplo, lapack_int n,
-                                const double* ap, double* s, double* scond,
-                                double* amax );
-lapack_int LAPACKE_cppequ_work( int matrix_order, char uplo, lapack_int n,
-                                const lapack_complex_float* ap, float* s,
-                                float* scond, float* amax );
-lapack_int LAPACKE_zppequ_work( int matrix_order, char uplo, lapack_int n,
-                                const lapack_complex_double* ap, double* s,
-                                double* scond, double* amax );
+lapack_int LAPACKE_spbrfs_work(int matrix_order, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs,
+                               const float* ab, lapack_int ldab, const float* afb, lapack_int ldafb, const float* b,
+                               lapack_int ldb, float* x, lapack_int ldx, float* ferr, float* berr, float* work,
+                               lapack_int* iwork);
+lapack_int LAPACKE_dpbrfs_work(int matrix_order, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs,
+                               const double* ab, lapack_int ldab, const double* afb, lapack_int ldafb, const double* b,
+                               lapack_int ldb, double* x, lapack_int ldx, double* ferr, double* berr, double* work,
+                               lapack_int* iwork);
+lapack_int LAPACKE_cpbrfs_work(int matrix_order, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs,
+                               const lapack_complex_float* ab, lapack_int ldab, const lapack_complex_float* afb,
+                               lapack_int ldafb, const lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x,
+                               lapack_int ldx, float* ferr, float* berr, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zpbrfs_work(int matrix_order, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs,
+                               const lapack_complex_double* ab, lapack_int ldab, const lapack_complex_double* afb,
+                               lapack_int ldafb, const lapack_complex_double* b, lapack_int ldb,
+                               lapack_complex_double* x, lapack_int ldx, double* ferr, double* berr,
+                               lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_spprfs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const float* ap,
-                                const float* afp, const float* b,
-                                lapack_int ldb, float* x, lapack_int ldx,
-                                float* ferr, float* berr, float* work,
-                                lapack_int* iwork );
-lapack_int LAPACKE_dpprfs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const double* ap,
-                                const double* afp, const double* b,
-                                lapack_int ldb, double* x, lapack_int ldx,
-                                double* ferr, double* berr, double* work,
-                                lapack_int* iwork );
-lapack_int LAPACKE_cpprfs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const lapack_complex_float* ap,
-                                const lapack_complex_float* afp,
-                                const lapack_complex_float* b, lapack_int ldb,
-                                lapack_complex_float* x, lapack_int ldx,
-                                float* ferr, float* berr,
-                                lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_zpprfs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs,
-                                const lapack_complex_double* ap,
-                                const lapack_complex_double* afp,
-                                const lapack_complex_double* b, lapack_int ldb,
-                                lapack_complex_double* x, lapack_int ldx,
-                                double* ferr, double* berr,
-                                lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_spbstf_work(int matrix_order, char uplo, lapack_int n, lapack_int kb, float* bb, lapack_int ldbb);
+lapack_int LAPACKE_dpbstf_work(int matrix_order, char uplo, lapack_int n, lapack_int kb, double* bb, lapack_int ldbb);
+lapack_int LAPACKE_cpbstf_work(int matrix_order, char uplo, lapack_int n, lapack_int kb, lapack_complex_float* bb,
+                               lapack_int ldbb);
+lapack_int LAPACKE_zpbstf_work(int matrix_order, char uplo, lapack_int n, lapack_int kb, lapack_complex_double* bb,
+                               lapack_int ldbb);
 
-lapack_int LAPACKE_sppsv_work( int matrix_order, char uplo, lapack_int n,
-                               lapack_int nrhs, float* ap, float* b,
-                               lapack_int ldb );
-lapack_int LAPACKE_dppsv_work( int matrix_order, char uplo, lapack_int n,
-                               lapack_int nrhs, double* ap, double* b,
-                               lapack_int ldb );
-lapack_int LAPACKE_cppsv_work( int matrix_order, char uplo, lapack_int n,
-                               lapack_int nrhs, lapack_complex_float* ap,
-                               lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_zppsv_work( int matrix_order, char uplo, lapack_int n,
-                               lapack_int nrhs, lapack_complex_double* ap,
-                               lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_spbsv_work(int matrix_order, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs, float* ab,
+                              lapack_int ldab, float* b, lapack_int ldb);
+lapack_int LAPACKE_dpbsv_work(int matrix_order, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs, double* ab,
+                              lapack_int ldab, double* b, lapack_int ldb);
+lapack_int LAPACKE_cpbsv_work(int matrix_order, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs,
+                              lapack_complex_float* ab, lapack_int ldab, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zpbsv_work(int matrix_order, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs,
+                              lapack_complex_double* ab, lapack_int ldab, lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_sppsvx_work( int matrix_order, char fact, char uplo,
-                                lapack_int n, lapack_int nrhs, float* ap,
-                                float* afp, char* equed, float* s, float* b,
-                                lapack_int ldb, float* x, lapack_int ldx,
-                                float* rcond, float* ferr, float* berr,
-                                float* work, lapack_int* iwork );
-lapack_int LAPACKE_dppsvx_work( int matrix_order, char fact, char uplo,
-                                lapack_int n, lapack_int nrhs, double* ap,
-                                double* afp, char* equed, double* s, double* b,
-                                lapack_int ldb, double* x, lapack_int ldx,
-                                double* rcond, double* ferr, double* berr,
-                                double* work, lapack_int* iwork );
-lapack_int LAPACKE_cppsvx_work( int matrix_order, char fact, char uplo,
-                                lapack_int n, lapack_int nrhs,
-                                lapack_complex_float* ap,
-                                lapack_complex_float* afp, char* equed,
-                                float* s, lapack_complex_float* b,
-                                lapack_int ldb, lapack_complex_float* x,
-                                lapack_int ldx, float* rcond, float* ferr,
-                                float* berr, lapack_complex_float* work,
-                                float* rwork );
-lapack_int LAPACKE_zppsvx_work( int matrix_order, char fact, char uplo,
-                                lapack_int n, lapack_int nrhs,
-                                lapack_complex_double* ap,
-                                lapack_complex_double* afp, char* equed,
-                                double* s, lapack_complex_double* b,
-                                lapack_int ldb, lapack_complex_double* x,
-                                lapack_int ldx, double* rcond, double* ferr,
-                                double* berr, lapack_complex_double* work,
-                                double* rwork );
+lapack_int LAPACKE_spbsvx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs,
+                               float* ab, lapack_int ldab, float* afb, lapack_int ldafb, char* equed, float* s,
+                               float* b, lapack_int ldb, float* x, lapack_int ldx, float* rcond, float* ferr,
+                               float* berr, float* work, lapack_int* iwork);
+lapack_int LAPACKE_dpbsvx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs,
+                               double* ab, lapack_int ldab, double* afb, lapack_int ldafb, char* equed, double* s,
+                               double* b, lapack_int ldb, double* x, lapack_int ldx, double* rcond, double* ferr,
+                               double* berr, double* work, lapack_int* iwork);
+lapack_int LAPACKE_cpbsvx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs,
+                               lapack_complex_float* ab, lapack_int ldab, lapack_complex_float* afb, lapack_int ldafb,
+                               char* equed, float* s, lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x,
+                               lapack_int ldx, float* rcond, float* ferr, float* berr, lapack_complex_float* work,
+                               float* rwork);
+lapack_int LAPACKE_zpbsvx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs,
+                               lapack_complex_double* ab, lapack_int ldab, lapack_complex_double* afb, lapack_int ldafb,
+                               char* equed, double* s, lapack_complex_double* b, lapack_int ldb,
+                               lapack_complex_double* x, lapack_int ldx, double* rcond, double* ferr, double* berr,
+                               lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_spptrf_work( int matrix_order, char uplo, lapack_int n,
-                                float* ap );
-lapack_int LAPACKE_dpptrf_work( int matrix_order, char uplo, lapack_int n,
-                                double* ap );
-lapack_int LAPACKE_cpptrf_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_float* ap );
-lapack_int LAPACKE_zpptrf_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_double* ap );
+lapack_int LAPACKE_spbtrf_work(int matrix_order, char uplo, lapack_int n, lapack_int kd, float* ab, lapack_int ldab);
+lapack_int LAPACKE_dpbtrf_work(int matrix_order, char uplo, lapack_int n, lapack_int kd, double* ab, lapack_int ldab);
+lapack_int LAPACKE_cpbtrf_work(int matrix_order, char uplo, lapack_int n, lapack_int kd, lapack_complex_float* ab,
+                               lapack_int ldab);
+lapack_int LAPACKE_zpbtrf_work(int matrix_order, char uplo, lapack_int n, lapack_int kd, lapack_complex_double* ab,
+                               lapack_int ldab);
 
-lapack_int LAPACKE_spptri_work( int matrix_order, char uplo, lapack_int n,
-                                float* ap );
-lapack_int LAPACKE_dpptri_work( int matrix_order, char uplo, lapack_int n,
-                                double* ap );
-lapack_int LAPACKE_cpptri_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_float* ap );
-lapack_int LAPACKE_zpptri_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_double* ap );
+lapack_int LAPACKE_spbtrs_work(int matrix_order, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs,
+                               const float* ab, lapack_int ldab, float* b, lapack_int ldb);
+lapack_int LAPACKE_dpbtrs_work(int matrix_order, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs,
+                               const double* ab, lapack_int ldab, double* b, lapack_int ldb);
+lapack_int LAPACKE_cpbtrs_work(int matrix_order, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs,
+                               const lapack_complex_float* ab, lapack_int ldab, lapack_complex_float* b,
+                               lapack_int ldb);
+lapack_int LAPACKE_zpbtrs_work(int matrix_order, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs,
+                               const lapack_complex_double* ab, lapack_int ldab, lapack_complex_double* b,
+                               lapack_int ldb);
 
-lapack_int LAPACKE_spptrs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const float* ap, float* b,
-                                lapack_int ldb );
-lapack_int LAPACKE_dpptrs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const double* ap, double* b,
-                                lapack_int ldb );
-lapack_int LAPACKE_cpptrs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const lapack_complex_float* ap,
-                                lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_zpptrs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs,
-                                const lapack_complex_double* ap,
-                                lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_spftrf_work(int matrix_order, char transr, char uplo, lapack_int n, float* a);
+lapack_int LAPACKE_dpftrf_work(int matrix_order, char transr, char uplo, lapack_int n, double* a);
+lapack_int LAPACKE_cpftrf_work(int matrix_order, char transr, char uplo, lapack_int n, lapack_complex_float* a);
+lapack_int LAPACKE_zpftrf_work(int matrix_order, char transr, char uplo, lapack_int n, lapack_complex_double* a);
 
-lapack_int LAPACKE_spstrf_work( int matrix_order, char uplo, lapack_int n,
-                                float* a, lapack_int lda, lapack_int* piv,
-                                lapack_int* rank, float tol, float* work );
-lapack_int LAPACKE_dpstrf_work( int matrix_order, char uplo, lapack_int n,
-                                double* a, lapack_int lda, lapack_int* piv,
-                                lapack_int* rank, double tol, double* work );
-lapack_int LAPACKE_cpstrf_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_int* piv, lapack_int* rank, float tol,
-                                float* work );
-lapack_int LAPACKE_zpstrf_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_int* piv, lapack_int* rank, double tol,
-                                double* work );
+lapack_int LAPACKE_spftri_work(int matrix_order, char transr, char uplo, lapack_int n, float* a);
+lapack_int LAPACKE_dpftri_work(int matrix_order, char transr, char uplo, lapack_int n, double* a);
+lapack_int LAPACKE_cpftri_work(int matrix_order, char transr, char uplo, lapack_int n, lapack_complex_float* a);
+lapack_int LAPACKE_zpftri_work(int matrix_order, char transr, char uplo, lapack_int n, lapack_complex_double* a);
 
-lapack_int LAPACKE_sptcon_work( lapack_int n, const float* d, const float* e,
-                                float anorm, float* rcond, float* work );
-lapack_int LAPACKE_dptcon_work( lapack_int n, const double* d, const double* e,
-                                double anorm, double* rcond, double* work );
-lapack_int LAPACKE_cptcon_work( lapack_int n, const float* d,
-                                const lapack_complex_float* e, float anorm,
-                                float* rcond, float* work );
-lapack_int LAPACKE_zptcon_work( lapack_int n, const double* d,
-                                const lapack_complex_double* e, double anorm,
-                                double* rcond, double* work );
+lapack_int LAPACKE_spftrs_work(int matrix_order, char transr, char uplo, lapack_int n, lapack_int nrhs, const float* a,
+                               float* b, lapack_int ldb);
+lapack_int LAPACKE_dpftrs_work(int matrix_order, char transr, char uplo, lapack_int n, lapack_int nrhs, const double* a,
+                               double* b, lapack_int ldb);
+lapack_int LAPACKE_cpftrs_work(int matrix_order, char transr, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_float* a, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zpftrs_work(int matrix_order, char transr, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_double* a, lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_spteqr_work( int matrix_order, char compz, lapack_int n,
-                                float* d, float* e, float* z, lapack_int ldz,
-                                float* work );
-lapack_int LAPACKE_dpteqr_work( int matrix_order, char compz, lapack_int n,
-                                double* d, double* e, double* z, lapack_int ldz,
-                                double* work );
-lapack_int LAPACKE_cpteqr_work( int matrix_order, char compz, lapack_int n,
-                                float* d, float* e, lapack_complex_float* z,
-                                lapack_int ldz, float* work );
-lapack_int LAPACKE_zpteqr_work( int matrix_order, char compz, lapack_int n,
-                                double* d, double* e, lapack_complex_double* z,
-                                lapack_int ldz, double* work );
+lapack_int LAPACKE_spocon_work(int matrix_order, char uplo, lapack_int n, const float* a, lapack_int lda, float anorm,
+                               float* rcond, float* work, lapack_int* iwork);
+lapack_int LAPACKE_dpocon_work(int matrix_order, char uplo, lapack_int n, const double* a, lapack_int lda, double anorm,
+                               double* rcond, double* work, lapack_int* iwork);
+lapack_int LAPACKE_cpocon_work(int matrix_order, char uplo, lapack_int n, const lapack_complex_float* a, lapack_int lda,
+                               float anorm, float* rcond, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zpocon_work(int matrix_order, char uplo, lapack_int n, const lapack_complex_double* a,
+                               lapack_int lda, double anorm, double* rcond, lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_sptrfs_work( int matrix_order, lapack_int n, lapack_int nrhs,
-                                const float* d, const float* e, const float* df,
-                                const float* ef, const float* b, lapack_int ldb,
-                                float* x, lapack_int ldx, float* ferr,
-                                float* berr, float* work );
-lapack_int LAPACKE_dptrfs_work( int matrix_order, lapack_int n, lapack_int nrhs,
-                                const double* d, const double* e,
-                                const double* df, const double* ef,
-                                const double* b, lapack_int ldb, double* x,
-                                lapack_int ldx, double* ferr, double* berr,
-                                double* work );
-lapack_int LAPACKE_cptrfs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const float* d,
-                                const lapack_complex_float* e, const float* df,
-                                const lapack_complex_float* ef,
-                                const lapack_complex_float* b, lapack_int ldb,
-                                lapack_complex_float* x, lapack_int ldx,
-                                float* ferr, float* berr,
-                                lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_zptrfs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const double* d,
-                                const lapack_complex_double* e,
-                                const double* df,
-                                const lapack_complex_double* ef,
-                                const lapack_complex_double* b, lapack_int ldb,
-                                lapack_complex_double* x, lapack_int ldx,
-                                double* ferr, double* berr,
-                                lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_spoequ_work(int matrix_order, lapack_int n, const float* a, lapack_int lda, float* s, float* scond,
+                               float* amax);
+lapack_int LAPACKE_dpoequ_work(int matrix_order, lapack_int n, const double* a, lapack_int lda, double* s,
+                               double* scond, double* amax);
+lapack_int LAPACKE_cpoequ_work(int matrix_order, lapack_int n, const lapack_complex_float* a, lapack_int lda, float* s,
+                               float* scond, float* amax);
+lapack_int LAPACKE_zpoequ_work(int matrix_order, lapack_int n, const lapack_complex_double* a, lapack_int lda,
+                               double* s, double* scond, double* amax);
 
-lapack_int LAPACKE_sptsv_work( int matrix_order, lapack_int n, lapack_int nrhs,
-                               float* d, float* e, float* b, lapack_int ldb );
-lapack_int LAPACKE_dptsv_work( int matrix_order, lapack_int n, lapack_int nrhs,
-                               double* d, double* e, double* b,
-                               lapack_int ldb );
-lapack_int LAPACKE_cptsv_work( int matrix_order, lapack_int n, lapack_int nrhs,
-                               float* d, lapack_complex_float* e,
-                               lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_zptsv_work( int matrix_order, lapack_int n, lapack_int nrhs,
-                               double* d, lapack_complex_double* e,
-                               lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_spoequb_work(int matrix_order, lapack_int n, const float* a, lapack_int lda, float* s, float* scond,
+                                float* amax);
+lapack_int LAPACKE_dpoequb_work(int matrix_order, lapack_int n, const double* a, lapack_int lda, double* s,
+                                double* scond, double* amax);
+lapack_int LAPACKE_cpoequb_work(int matrix_order, lapack_int n, const lapack_complex_float* a, lapack_int lda, float* s,
+                                float* scond, float* amax);
+lapack_int LAPACKE_zpoequb_work(int matrix_order, lapack_int n, const lapack_complex_double* a, lapack_int lda,
+                                double* s, double* scond, double* amax);
 
-lapack_int LAPACKE_sptsvx_work( int matrix_order, char fact, lapack_int n,
-                                lapack_int nrhs, const float* d, const float* e,
-                                float* df, float* ef, const float* b,
-                                lapack_int ldb, float* x, lapack_int ldx,
-                                float* rcond, float* ferr, float* berr,
-                                float* work );
-lapack_int LAPACKE_dptsvx_work( int matrix_order, char fact, lapack_int n,
-                                lapack_int nrhs, const double* d,
-                                const double* e, double* df, double* ef,
-                                const double* b, lapack_int ldb, double* x,
-                                lapack_int ldx, double* rcond, double* ferr,
-                                double* berr, double* work );
-lapack_int LAPACKE_cptsvx_work( int matrix_order, char fact, lapack_int n,
-                                lapack_int nrhs, const float* d,
-                                const lapack_complex_float* e, float* df,
-                                lapack_complex_float* ef,
-                                const lapack_complex_float* b, lapack_int ldb,
-                                lapack_complex_float* x, lapack_int ldx,
-                                float* rcond, float* ferr, float* berr,
-                                lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_zptsvx_work( int matrix_order, char fact, lapack_int n,
-                                lapack_int nrhs, const double* d,
-                                const lapack_complex_double* e, double* df,
-                                lapack_complex_double* ef,
-                                const lapack_complex_double* b, lapack_int ldb,
-                                lapack_complex_double* x, lapack_int ldx,
-                                double* rcond, double* ferr, double* berr,
-                                lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_sporfs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const float* a,
+                               lapack_int lda, const float* af, lapack_int ldaf, const float* b, lapack_int ldb,
+                               float* x, lapack_int ldx, float* ferr, float* berr, float* work, lapack_int* iwork);
+lapack_int LAPACKE_dporfs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const double* a,
+                               lapack_int lda, const double* af, lapack_int ldaf, const double* b, lapack_int ldb,
+                               double* x, lapack_int ldx, double* ferr, double* berr, double* work, lapack_int* iwork);
+lapack_int LAPACKE_cporfs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* af,
+                               lapack_int ldaf, const lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x,
+                               lapack_int ldx, float* ferr, float* berr, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zporfs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* af,
+                               lapack_int ldaf, const lapack_complex_double* b, lapack_int ldb,
+                               lapack_complex_double* x, lapack_int ldx, double* ferr, double* berr,
+                               lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_spttrf_work( lapack_int n, float* d, float* e );
-lapack_int LAPACKE_dpttrf_work( lapack_int n, double* d, double* e );
-lapack_int LAPACKE_cpttrf_work( lapack_int n, float* d,
-                                lapack_complex_float* e );
-lapack_int LAPACKE_zpttrf_work( lapack_int n, double* d,
-                                lapack_complex_double* e );
+lapack_int LAPACKE_sporfsx_work(int matrix_order, char uplo, char equed, lapack_int n, lapack_int nrhs, const float* a,
+                                lapack_int lda, const float* af, lapack_int ldaf, const float* s, const float* b,
+                                lapack_int ldb, float* x, lapack_int ldx, float* rcond, float* berr,
+                                lapack_int n_err_bnds, float* err_bnds_norm, float* err_bnds_comp, lapack_int nparams,
+                                float* params, float* work, lapack_int* iwork);
+lapack_int LAPACKE_dporfsx_work(int matrix_order, char uplo, char equed, lapack_int n, lapack_int nrhs, const double* a,
+                                lapack_int lda, const double* af, lapack_int ldaf, const double* s, const double* b,
+                                lapack_int ldb, double* x, lapack_int ldx, double* rcond, double* berr,
+                                lapack_int n_err_bnds, double* err_bnds_norm, double* err_bnds_comp, lapack_int nparams,
+                                double* params, double* work, lapack_int* iwork);
+lapack_int LAPACKE_cporfsx_work(int matrix_order, char uplo, char equed, lapack_int n, lapack_int nrhs,
+                                const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* af,
+                                lapack_int ldaf, const float* s, const lapack_complex_float* b, lapack_int ldb,
+                                lapack_complex_float* x, lapack_int ldx, float* rcond, float* berr,
+                                lapack_int n_err_bnds, float* err_bnds_norm, float* err_bnds_comp, lapack_int nparams,
+                                float* params, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zporfsx_work(int matrix_order, char uplo, char equed, lapack_int n, lapack_int nrhs,
+                                const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* af,
+                                lapack_int ldaf, const double* s, const lapack_complex_double* b, lapack_int ldb,
+                                lapack_complex_double* x, lapack_int ldx, double* rcond, double* berr,
+                                lapack_int n_err_bnds, double* err_bnds_norm, double* err_bnds_comp, lapack_int nparams,
+                                double* params, lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_spttrs_work( int matrix_order, lapack_int n, lapack_int nrhs,
-                                const float* d, const float* e, float* b,
-                                lapack_int ldb );
-lapack_int LAPACKE_dpttrs_work( int matrix_order, lapack_int n, lapack_int nrhs,
-                                const double* d, const double* e, double* b,
-                                lapack_int ldb );
-lapack_int LAPACKE_cpttrs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const float* d,
-                                const lapack_complex_float* e,
-                                lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_zpttrs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const double* d,
-                                const lapack_complex_double* e,
-                                lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_sposv_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, float* a, lapack_int lda,
+                              float* b, lapack_int ldb);
+lapack_int LAPACKE_dposv_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, double* a, lapack_int lda,
+                              double* b, lapack_int ldb);
+lapack_int LAPACKE_cposv_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_float* a,
+                              lapack_int lda, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zposv_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double* a,
+                              lapack_int lda, lapack_complex_double* b, lapack_int ldb);
+lapack_int LAPACKE_dsposv_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, double* a, lapack_int lda,
+                               double* b, lapack_int ldb, double* x, lapack_int ldx, double* work, float* swork,
+                               lapack_int* iter);
+lapack_int LAPACKE_zcposv_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double* a,
+                               lapack_int lda, lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x,
+                               lapack_int ldx, lapack_complex_double* work, lapack_complex_float* swork, double* rwork,
+                               lapack_int* iter);
 
-lapack_int LAPACKE_ssbev_work( int matrix_order, char jobz, char uplo,
-                               lapack_int n, lapack_int kd, float* ab,
-                               lapack_int ldab, float* w, float* z,
-                               lapack_int ldz, float* work );
-lapack_int LAPACKE_dsbev_work( int matrix_order, char jobz, char uplo,
-                               lapack_int n, lapack_int kd, double* ab,
-                               lapack_int ldab, double* w, double* z,
-                               lapack_int ldz, double* work );
+lapack_int LAPACKE_sposvx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs, float* a,
+                               lapack_int lda, float* af, lapack_int ldaf, char* equed, float* s, float* b,
+                               lapack_int ldb, float* x, lapack_int ldx, float* rcond, float* ferr, float* berr,
+                               float* work, lapack_int* iwork);
+lapack_int LAPACKE_dposvx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs, double* a,
+                               lapack_int lda, double* af, lapack_int ldaf, char* equed, double* s, double* b,
+                               lapack_int ldb, double* x, lapack_int ldx, double* rcond, double* ferr, double* berr,
+                               double* work, lapack_int* iwork);
+lapack_int LAPACKE_cposvx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                               lapack_complex_float* a, lapack_int lda, lapack_complex_float* af, lapack_int ldaf,
+                               char* equed, float* s, lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x,
+                               lapack_int ldx, float* rcond, float* ferr, float* berr, lapack_complex_float* work,
+                               float* rwork);
+lapack_int LAPACKE_zposvx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                               lapack_complex_double* a, lapack_int lda, lapack_complex_double* af, lapack_int ldaf,
+                               char* equed, double* s, lapack_complex_double* b, lapack_int ldb,
+                               lapack_complex_double* x, lapack_int ldx, double* rcond, double* ferr, double* berr,
+                               lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_ssbevd_work( int matrix_order, char jobz, char uplo,
-                                lapack_int n, lapack_int kd, float* ab,
-                                lapack_int ldab, float* w, float* z,
-                                lapack_int ldz, float* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int liwork );
-lapack_int LAPACKE_dsbevd_work( int matrix_order, char jobz, char uplo,
-                                lapack_int n, lapack_int kd, double* ab,
-                                lapack_int ldab, double* w, double* z,
-                                lapack_int ldz, double* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int liwork );
+lapack_int LAPACKE_sposvxx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs, float* a,
+                                lapack_int lda, float* af, lapack_int ldaf, char* equed, float* s, float* b,
+                                lapack_int ldb, float* x, lapack_int ldx, float* rcond, float* rpvgrw, float* berr,
+                                lapack_int n_err_bnds, float* err_bnds_norm, float* err_bnds_comp, lapack_int nparams,
+                                float* params, float* work, lapack_int* iwork);
+lapack_int LAPACKE_dposvxx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs, double* a,
+                                lapack_int lda, double* af, lapack_int ldaf, char* equed, double* s, double* b,
+                                lapack_int ldb, double* x, lapack_int ldx, double* rcond, double* rpvgrw, double* berr,
+                                lapack_int n_err_bnds, double* err_bnds_norm, double* err_bnds_comp, lapack_int nparams,
+                                double* params, double* work, lapack_int* iwork);
+lapack_int LAPACKE_cposvxx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                                lapack_complex_float* a, lapack_int lda, lapack_complex_float* af, lapack_int ldaf,
+                                char* equed, float* s, lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x,
+                                lapack_int ldx, float* rcond, float* rpvgrw, float* berr, lapack_int n_err_bnds,
+                                float* err_bnds_norm, float* err_bnds_comp, lapack_int nparams, float* params,
+                                lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zposvxx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                                lapack_complex_double* a, lapack_int lda, lapack_complex_double* af, lapack_int ldaf,
+                                char* equed, double* s, lapack_complex_double* b, lapack_int ldb,
+                                lapack_complex_double* x, lapack_int ldx, double* rcond, double* rpvgrw, double* berr,
+                                lapack_int n_err_bnds, double* err_bnds_norm, double* err_bnds_comp, lapack_int nparams,
+                                double* params, lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_ssbevx_work( int matrix_order, char jobz, char range,
-                                char uplo, lapack_int n, lapack_int kd,
-                                float* ab, lapack_int ldab, float* q,
-                                lapack_int ldq, float vl, float vu,
-                                lapack_int il, lapack_int iu, float abstol,
-                                lapack_int* m, float* w, float* z,
-                                lapack_int ldz, float* work, lapack_int* iwork,
-                                lapack_int* ifail );
-lapack_int LAPACKE_dsbevx_work( int matrix_order, char jobz, char range,
-                                char uplo, lapack_int n, lapack_int kd,
-                                double* ab, lapack_int ldab, double* q,
-                                lapack_int ldq, double vl, double vu,
-                                lapack_int il, lapack_int iu, double abstol,
-                                lapack_int* m, double* w, double* z,
-                                lapack_int ldz, double* work, lapack_int* iwork,
-                                lapack_int* ifail );
+lapack_int LAPACKE_spotrf_work(int matrix_order, char uplo, lapack_int n, float* a, lapack_int lda);
+lapack_int LAPACKE_dpotrf_work(int matrix_order, char uplo, lapack_int n, double* a, lapack_int lda);
+lapack_int LAPACKE_cpotrf_work(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda);
+lapack_int LAPACKE_zpotrf_work(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int lda);
 
-lapack_int LAPACKE_ssbgst_work( int matrix_order, char vect, char uplo,
-                                lapack_int n, lapack_int ka, lapack_int kb,
-                                float* ab, lapack_int ldab, const float* bb,
-                                lapack_int ldbb, float* x, lapack_int ldx,
-                                float* work );
-lapack_int LAPACKE_dsbgst_work( int matrix_order, char vect, char uplo,
-                                lapack_int n, lapack_int ka, lapack_int kb,
-                                double* ab, lapack_int ldab, const double* bb,
-                                lapack_int ldbb, double* x, lapack_int ldx,
-                                double* work );
+lapack_int LAPACKE_spotri_work(int matrix_order, char uplo, lapack_int n, float* a, lapack_int lda);
+lapack_int LAPACKE_dpotri_work(int matrix_order, char uplo, lapack_int n, double* a, lapack_int lda);
+lapack_int LAPACKE_cpotri_work(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda);
+lapack_int LAPACKE_zpotri_work(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int lda);
 
-lapack_int LAPACKE_ssbgv_work( int matrix_order, char jobz, char uplo,
-                               lapack_int n, lapack_int ka, lapack_int kb,
-                               float* ab, lapack_int ldab, float* bb,
-                               lapack_int ldbb, float* w, float* z,
-                               lapack_int ldz, float* work );
-lapack_int LAPACKE_dsbgv_work( int matrix_order, char jobz, char uplo,
-                               lapack_int n, lapack_int ka, lapack_int kb,
-                               double* ab, lapack_int ldab, double* bb,
-                               lapack_int ldbb, double* w, double* z,
-                               lapack_int ldz, double* work );
+lapack_int LAPACKE_spotrs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const float* a,
+                               lapack_int lda, float* b, lapack_int ldb);
+lapack_int LAPACKE_dpotrs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const double* a,
+                               lapack_int lda, double* b, lapack_int ldb);
+lapack_int LAPACKE_cpotrs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_float* a, lapack_int lda, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zpotrs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_double* a, lapack_int lda, lapack_complex_double* b,
+                               lapack_int ldb);
 
-lapack_int LAPACKE_ssbgvd_work( int matrix_order, char jobz, char uplo,
-                                lapack_int n, lapack_int ka, lapack_int kb,
-                                float* ab, lapack_int ldab, float* bb,
-                                lapack_int ldbb, float* w, float* z,
-                                lapack_int ldz, float* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int liwork );
-lapack_int LAPACKE_dsbgvd_work( int matrix_order, char jobz, char uplo,
-                                lapack_int n, lapack_int ka, lapack_int kb,
-                                double* ab, lapack_int ldab, double* bb,
-                                lapack_int ldbb, double* w, double* z,
-                                lapack_int ldz, double* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int liwork );
+lapack_int LAPACKE_sppcon_work(int matrix_order, char uplo, lapack_int n, const float* ap, float anorm, float* rcond,
+                               float* work, lapack_int* iwork);
+lapack_int LAPACKE_dppcon_work(int matrix_order, char uplo, lapack_int n, const double* ap, double anorm, double* rcond,
+                               double* work, lapack_int* iwork);
+lapack_int LAPACKE_cppcon_work(int matrix_order, char uplo, lapack_int n, const lapack_complex_float* ap, float anorm,
+                               float* rcond, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zppcon_work(int matrix_order, char uplo, lapack_int n, const lapack_complex_double* ap, double anorm,
+                               double* rcond, lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_ssbgvx_work( int matrix_order, char jobz, char range,
-                                char uplo, lapack_int n, lapack_int ka,
-                                lapack_int kb, float* ab, lapack_int ldab,
-                                float* bb, lapack_int ldbb, float* q,
-                                lapack_int ldq, float vl, float vu,
-                                lapack_int il, lapack_int iu, float abstol,
-                                lapack_int* m, float* w, float* z,
-                                lapack_int ldz, float* work, lapack_int* iwork,
-                                lapack_int* ifail );
-lapack_int LAPACKE_dsbgvx_work( int matrix_order, char jobz, char range,
-                                char uplo, lapack_int n, lapack_int ka,
-                                lapack_int kb, double* ab, lapack_int ldab,
-                                double* bb, lapack_int ldbb, double* q,
-                                lapack_int ldq, double vl, double vu,
-                                lapack_int il, lapack_int iu, double abstol,
-                                lapack_int* m, double* w, double* z,
-                                lapack_int ldz, double* work, lapack_int* iwork,
-                                lapack_int* ifail );
+lapack_int LAPACKE_sppequ_work(int matrix_order, char uplo, lapack_int n, const float* ap, float* s, float* scond,
+                               float* amax);
+lapack_int LAPACKE_dppequ_work(int matrix_order, char uplo, lapack_int n, const double* ap, double* s, double* scond,
+                               double* amax);
+lapack_int LAPACKE_cppequ_work(int matrix_order, char uplo, lapack_int n, const lapack_complex_float* ap, float* s,
+                               float* scond, float* amax);
+lapack_int LAPACKE_zppequ_work(int matrix_order, char uplo, lapack_int n, const lapack_complex_double* ap, double* s,
+                               double* scond, double* amax);
 
-lapack_int LAPACKE_ssbtrd_work( int matrix_order, char vect, char uplo,
-                                lapack_int n, lapack_int kd, float* ab,
-                                lapack_int ldab, float* d, float* e, float* q,
-                                lapack_int ldq, float* work );
-lapack_int LAPACKE_dsbtrd_work( int matrix_order, char vect, char uplo,
-                                lapack_int n, lapack_int kd, double* ab,
-                                lapack_int ldab, double* d, double* e,
-                                double* q, lapack_int ldq, double* work );
+lapack_int LAPACKE_spprfs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const float* ap,
+                               const float* afp, const float* b, lapack_int ldb, float* x, lapack_int ldx, float* ferr,
+                               float* berr, float* work, lapack_int* iwork);
+lapack_int LAPACKE_dpprfs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const double* ap,
+                               const double* afp, const double* b, lapack_int ldb, double* x, lapack_int ldx,
+                               double* ferr, double* berr, double* work, lapack_int* iwork);
+lapack_int LAPACKE_cpprfs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_float* ap, const lapack_complex_float* afp,
+                               const lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x, lapack_int ldx,
+                               float* ferr, float* berr, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zpprfs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_double* ap, const lapack_complex_double* afp,
+                               const lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x, lapack_int ldx,
+                               double* ferr, double* berr, lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_ssfrk_work( int matrix_order, char transr, char uplo,
-                               char trans, lapack_int n, lapack_int k,
-                               float alpha, const float* a, lapack_int lda,
-                               float beta, float* c );
-lapack_int LAPACKE_dsfrk_work( int matrix_order, char transr, char uplo,
-                               char trans, lapack_int n, lapack_int k,
-                               double alpha, const double* a, lapack_int lda,
-                               double beta, double* c );
+lapack_int LAPACKE_sppsv_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, float* ap, float* b,
+                              lapack_int ldb);
+lapack_int LAPACKE_dppsv_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, double* ap, double* b,
+                              lapack_int ldb);
+lapack_int LAPACKE_cppsv_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_float* ap,
+                              lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zppsv_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double* ap,
+                              lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_sspcon_work( int matrix_order, char uplo, lapack_int n,
-                                const float* ap, const lapack_int* ipiv,
-                                float anorm, float* rcond, float* work,
-                                lapack_int* iwork );
-lapack_int LAPACKE_dspcon_work( int matrix_order, char uplo, lapack_int n,
-                                const double* ap, const lapack_int* ipiv,
-                                double anorm, double* rcond, double* work,
-                                lapack_int* iwork );
-lapack_int LAPACKE_cspcon_work( int matrix_order, char uplo, lapack_int n,
-                                const lapack_complex_float* ap,
-                                const lapack_int* ipiv, float anorm,
-                                float* rcond, lapack_complex_float* work );
-lapack_int LAPACKE_zspcon_work( int matrix_order, char uplo, lapack_int n,
-                                const lapack_complex_double* ap,
-                                const lapack_int* ipiv, double anorm,
-                                double* rcond, lapack_complex_double* work );
+lapack_int LAPACKE_sppsvx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs, float* ap,
+                               float* afp, char* equed, float* s, float* b, lapack_int ldb, float* x, lapack_int ldx,
+                               float* rcond, float* ferr, float* berr, float* work, lapack_int* iwork);
+lapack_int LAPACKE_dppsvx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs, double* ap,
+                               double* afp, char* equed, double* s, double* b, lapack_int ldb, double* x,
+                               lapack_int ldx, double* rcond, double* ferr, double* berr, double* work,
+                               lapack_int* iwork);
+lapack_int LAPACKE_cppsvx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                               lapack_complex_float* ap, lapack_complex_float* afp, char* equed, float* s,
+                               lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x, lapack_int ldx,
+                               float* rcond, float* ferr, float* berr, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zppsvx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                               lapack_complex_double* ap, lapack_complex_double* afp, char* equed, double* s,
+                               lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x, lapack_int ldx,
+                               double* rcond, double* ferr, double* berr, lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_sspev_work( int matrix_order, char jobz, char uplo,
-                               lapack_int n, float* ap, float* w, float* z,
-                               lapack_int ldz, float* work );
-lapack_int LAPACKE_dspev_work( int matrix_order, char jobz, char uplo,
-                               lapack_int n, double* ap, double* w, double* z,
-                               lapack_int ldz, double* work );
+lapack_int LAPACKE_spptrf_work(int matrix_order, char uplo, lapack_int n, float* ap);
+lapack_int LAPACKE_dpptrf_work(int matrix_order, char uplo, lapack_int n, double* ap);
+lapack_int LAPACKE_cpptrf_work(int matrix_order, char uplo, lapack_int n, lapack_complex_float* ap);
+lapack_int LAPACKE_zpptrf_work(int matrix_order, char uplo, lapack_int n, lapack_complex_double* ap);
 
-lapack_int LAPACKE_sspevd_work( int matrix_order, char jobz, char uplo,
-                                lapack_int n, float* ap, float* w, float* z,
-                                lapack_int ldz, float* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int liwork );
-lapack_int LAPACKE_dspevd_work( int matrix_order, char jobz, char uplo,
-                                lapack_int n, double* ap, double* w, double* z,
-                                lapack_int ldz, double* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int liwork );
+lapack_int LAPACKE_spptri_work(int matrix_order, char uplo, lapack_int n, float* ap);
+lapack_int LAPACKE_dpptri_work(int matrix_order, char uplo, lapack_int n, double* ap);
+lapack_int LAPACKE_cpptri_work(int matrix_order, char uplo, lapack_int n, lapack_complex_float* ap);
+lapack_int LAPACKE_zpptri_work(int matrix_order, char uplo, lapack_int n, lapack_complex_double* ap);
 
-lapack_int LAPACKE_sspevx_work( int matrix_order, char jobz, char range,
-                                char uplo, lapack_int n, float* ap, float vl,
-                                float vu, lapack_int il, lapack_int iu,
-                                float abstol, lapack_int* m, float* w, float* z,
-                                lapack_int ldz, float* work, lapack_int* iwork,
-                                lapack_int* ifail );
-lapack_int LAPACKE_dspevx_work( int matrix_order, char jobz, char range,
-                                char uplo, lapack_int n, double* ap, double vl,
-                                double vu, lapack_int il, lapack_int iu,
-                                double abstol, lapack_int* m, double* w,
-                                double* z, lapack_int ldz, double* work,
-                                lapack_int* iwork, lapack_int* ifail );
+lapack_int LAPACKE_spptrs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const float* ap, float* b,
+                               lapack_int ldb);
+lapack_int LAPACKE_dpptrs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const double* ap, double* b,
+                               lapack_int ldb);
+lapack_int LAPACKE_cpptrs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_float* ap, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zpptrs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_double* ap, lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_sspgst_work( int matrix_order, lapack_int itype, char uplo,
-                                lapack_int n, float* ap, const float* bp );
-lapack_int LAPACKE_dspgst_work( int matrix_order, lapack_int itype, char uplo,
-                                lapack_int n, double* ap, const double* bp );
+lapack_int LAPACKE_spstrf_work(int matrix_order, char uplo, lapack_int n, float* a, lapack_int lda, lapack_int* piv,
+                               lapack_int* rank, float tol, float* work);
+lapack_int LAPACKE_dpstrf_work(int matrix_order, char uplo, lapack_int n, double* a, lapack_int lda, lapack_int* piv,
+                               lapack_int* rank, double tol, double* work);
+lapack_int LAPACKE_cpstrf_work(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                               lapack_int* piv, lapack_int* rank, float tol, float* work);
+lapack_int LAPACKE_zpstrf_work(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                               lapack_int* piv, lapack_int* rank, double tol, double* work);
 
-lapack_int LAPACKE_sspgv_work( int matrix_order, lapack_int itype, char jobz,
-                               char uplo, lapack_int n, float* ap, float* bp,
-                               float* w, float* z, lapack_int ldz,
-                               float* work );
-lapack_int LAPACKE_dspgv_work( int matrix_order, lapack_int itype, char jobz,
-                               char uplo, lapack_int n, double* ap, double* bp,
-                               double* w, double* z, lapack_int ldz,
-                               double* work );
+lapack_int LAPACKE_sptcon_work(lapack_int n, const float* d, const float* e, float anorm, float* rcond, float* work);
+lapack_int LAPACKE_dptcon_work(lapack_int n, const double* d, const double* e, double anorm, double* rcond,
+                               double* work);
+lapack_int LAPACKE_cptcon_work(lapack_int n, const float* d, const lapack_complex_float* e, float anorm, float* rcond,
+                               float* work);
+lapack_int LAPACKE_zptcon_work(lapack_int n, const double* d, const lapack_complex_double* e, double anorm,
+                               double* rcond, double* work);
 
-lapack_int LAPACKE_sspgvd_work( int matrix_order, lapack_int itype, char jobz,
-                                char uplo, lapack_int n, float* ap, float* bp,
-                                float* w, float* z, lapack_int ldz, float* work,
-                                lapack_int lwork, lapack_int* iwork,
-                                lapack_int liwork );
-lapack_int LAPACKE_dspgvd_work( int matrix_order, lapack_int itype, char jobz,
-                                char uplo, lapack_int n, double* ap, double* bp,
-                                double* w, double* z, lapack_int ldz,
-                                double* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int liwork );
+lapack_int LAPACKE_spteqr_work(int matrix_order, char compz, lapack_int n, float* d, float* e, float* z, lapack_int ldz,
+                               float* work);
+lapack_int LAPACKE_dpteqr_work(int matrix_order, char compz, lapack_int n, double* d, double* e, double* z,
+                               lapack_int ldz, double* work);
+lapack_int LAPACKE_cpteqr_work(int matrix_order, char compz, lapack_int n, float* d, float* e, lapack_complex_float* z,
+                               lapack_int ldz, float* work);
+lapack_int LAPACKE_zpteqr_work(int matrix_order, char compz, lapack_int n, double* d, double* e,
+                               lapack_complex_double* z, lapack_int ldz, double* work);
 
-lapack_int LAPACKE_sspgvx_work( int matrix_order, lapack_int itype, char jobz,
-                                char range, char uplo, lapack_int n, float* ap,
-                                float* bp, float vl, float vu, lapack_int il,
-                                lapack_int iu, float abstol, lapack_int* m,
-                                float* w, float* z, lapack_int ldz, float* work,
-                                lapack_int* iwork, lapack_int* ifail );
-lapack_int LAPACKE_dspgvx_work( int matrix_order, lapack_int itype, char jobz,
-                                char range, char uplo, lapack_int n, double* ap,
-                                double* bp, double vl, double vu, lapack_int il,
-                                lapack_int iu, double abstol, lapack_int* m,
-                                double* w, double* z, lapack_int ldz,
-                                double* work, lapack_int* iwork,
-                                lapack_int* ifail );
+lapack_int LAPACKE_sptrfs_work(int matrix_order, lapack_int n, lapack_int nrhs, const float* d, const float* e,
+                               const float* df, const float* ef, const float* b, lapack_int ldb, float* x,
+                               lapack_int ldx, float* ferr, float* berr, float* work);
+lapack_int LAPACKE_dptrfs_work(int matrix_order, lapack_int n, lapack_int nrhs, const double* d, const double* e,
+                               const double* df, const double* ef, const double* b, lapack_int ldb, double* x,
+                               lapack_int ldx, double* ferr, double* berr, double* work);
+lapack_int LAPACKE_cptrfs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const float* d,
+                               const lapack_complex_float* e, const float* df, const lapack_complex_float* ef,
+                               const lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x, lapack_int ldx,
+                               float* ferr, float* berr, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zptrfs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const double* d,
+                               const lapack_complex_double* e, const double* df, const lapack_complex_double* ef,
+                               const lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x, lapack_int ldx,
+                               double* ferr, double* berr, lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_ssprfs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const float* ap,
-                                const float* afp, const lapack_int* ipiv,
-                                const float* b, lapack_int ldb, float* x,
-                                lapack_int ldx, float* ferr, float* berr,
-                                float* work, lapack_int* iwork );
-lapack_int LAPACKE_dsprfs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const double* ap,
-                                const double* afp, const lapack_int* ipiv,
-                                const double* b, lapack_int ldb, double* x,
-                                lapack_int ldx, double* ferr, double* berr,
-                                double* work, lapack_int* iwork );
-lapack_int LAPACKE_csprfs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const lapack_complex_float* ap,
-                                const lapack_complex_float* afp,
-                                const lapack_int* ipiv,
-                                const lapack_complex_float* b, lapack_int ldb,
-                                lapack_complex_float* x, lapack_int ldx,
-                                float* ferr, float* berr,
-                                lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_zsprfs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs,
-                                const lapack_complex_double* ap,
-                                const lapack_complex_double* afp,
-                                const lapack_int* ipiv,
-                                const lapack_complex_double* b, lapack_int ldb,
-                                lapack_complex_double* x, lapack_int ldx,
-                                double* ferr, double* berr,
-                                lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_sptsv_work(int matrix_order, lapack_int n, lapack_int nrhs, float* d, float* e, float* b,
+                              lapack_int ldb);
+lapack_int LAPACKE_dptsv_work(int matrix_order, lapack_int n, lapack_int nrhs, double* d, double* e, double* b,
+                              lapack_int ldb);
+lapack_int LAPACKE_cptsv_work(int matrix_order, lapack_int n, lapack_int nrhs, float* d, lapack_complex_float* e,
+                              lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zptsv_work(int matrix_order, lapack_int n, lapack_int nrhs, double* d, lapack_complex_double* e,
+                              lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_sspsv_work( int matrix_order, char uplo, lapack_int n,
-                               lapack_int nrhs, float* ap, lapack_int* ipiv,
-                               float* b, lapack_int ldb );
-lapack_int LAPACKE_dspsv_work( int matrix_order, char uplo, lapack_int n,
-                               lapack_int nrhs, double* ap, lapack_int* ipiv,
-                               double* b, lapack_int ldb );
-lapack_int LAPACKE_cspsv_work( int matrix_order, char uplo, lapack_int n,
-                               lapack_int nrhs, lapack_complex_float* ap,
-                               lapack_int* ipiv, lapack_complex_float* b,
-                               lapack_int ldb );
-lapack_int LAPACKE_zspsv_work( int matrix_order, char uplo, lapack_int n,
-                               lapack_int nrhs, lapack_complex_double* ap,
-                               lapack_int* ipiv, lapack_complex_double* b,
-                               lapack_int ldb );
+lapack_int LAPACKE_sptsvx_work(int matrix_order, char fact, lapack_int n, lapack_int nrhs, const float* d,
+                               const float* e, float* df, float* ef, const float* b, lapack_int ldb, float* x,
+                               lapack_int ldx, float* rcond, float* ferr, float* berr, float* work);
+lapack_int LAPACKE_dptsvx_work(int matrix_order, char fact, lapack_int n, lapack_int nrhs, const double* d,
+                               const double* e, double* df, double* ef, const double* b, lapack_int ldb, double* x,
+                               lapack_int ldx, double* rcond, double* ferr, double* berr, double* work);
+lapack_int LAPACKE_cptsvx_work(int matrix_order, char fact, lapack_int n, lapack_int nrhs, const float* d,
+                               const lapack_complex_float* e, float* df, lapack_complex_float* ef,
+                               const lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x, lapack_int ldx,
+                               float* rcond, float* ferr, float* berr, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zptsvx_work(int matrix_order, char fact, lapack_int n, lapack_int nrhs, const double* d,
+                               const lapack_complex_double* e, double* df, lapack_complex_double* ef,
+                               const lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x, lapack_int ldx,
+                               double* rcond, double* ferr, double* berr, lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_sspsvx_work( int matrix_order, char fact, char uplo,
-                                lapack_int n, lapack_int nrhs, const float* ap,
-                                float* afp, lapack_int* ipiv, const float* b,
-                                lapack_int ldb, float* x, lapack_int ldx,
-                                float* rcond, float* ferr, float* berr,
-                                float* work, lapack_int* iwork );
-lapack_int LAPACKE_dspsvx_work( int matrix_order, char fact, char uplo,
-                                lapack_int n, lapack_int nrhs, const double* ap,
-                                double* afp, lapack_int* ipiv, const double* b,
-                                lapack_int ldb, double* x, lapack_int ldx,
-                                double* rcond, double* ferr, double* berr,
-                                double* work, lapack_int* iwork );
-lapack_int LAPACKE_cspsvx_work( int matrix_order, char fact, char uplo,
-                                lapack_int n, lapack_int nrhs,
-                                const lapack_complex_float* ap,
-                                lapack_complex_float* afp, lapack_int* ipiv,
-                                const lapack_complex_float* b, lapack_int ldb,
-                                lapack_complex_float* x, lapack_int ldx,
-                                float* rcond, float* ferr, float* berr,
-                                lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_zspsvx_work( int matrix_order, char fact, char uplo,
-                                lapack_int n, lapack_int nrhs,
-                                const lapack_complex_double* ap,
-                                lapack_complex_double* afp, lapack_int* ipiv,
-                                const lapack_complex_double* b, lapack_int ldb,
-                                lapack_complex_double* x, lapack_int ldx,
-                                double* rcond, double* ferr, double* berr,
-                                lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_spttrf_work(lapack_int n, float* d, float* e);
+lapack_int LAPACKE_dpttrf_work(lapack_int n, double* d, double* e);
+lapack_int LAPACKE_cpttrf_work(lapack_int n, float* d, lapack_complex_float* e);
+lapack_int LAPACKE_zpttrf_work(lapack_int n, double* d, lapack_complex_double* e);
 
-lapack_int LAPACKE_ssptrd_work( int matrix_order, char uplo, lapack_int n,
-                                float* ap, float* d, float* e, float* tau );
-lapack_int LAPACKE_dsptrd_work( int matrix_order, char uplo, lapack_int n,
-                                double* ap, double* d, double* e, double* tau );
+lapack_int LAPACKE_spttrs_work(int matrix_order, lapack_int n, lapack_int nrhs, const float* d, const float* e,
+                               float* b, lapack_int ldb);
+lapack_int LAPACKE_dpttrs_work(int matrix_order, lapack_int n, lapack_int nrhs, const double* d, const double* e,
+                               double* b, lapack_int ldb);
+lapack_int LAPACKE_cpttrs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const float* d,
+                               const lapack_complex_float* e, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zpttrs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const double* d,
+                               const lapack_complex_double* e, lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_ssptrf_work( int matrix_order, char uplo, lapack_int n,
-                                float* ap, lapack_int* ipiv );
-lapack_int LAPACKE_dsptrf_work( int matrix_order, char uplo, lapack_int n,
-                                double* ap, lapack_int* ipiv );
-lapack_int LAPACKE_csptrf_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_float* ap, lapack_int* ipiv );
-lapack_int LAPACKE_zsptrf_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_double* ap, lapack_int* ipiv );
+lapack_int LAPACKE_ssbev_work(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int kd, float* ab,
+                              lapack_int ldab, float* w, float* z, lapack_int ldz, float* work);
+lapack_int LAPACKE_dsbev_work(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int kd, double* ab,
+                              lapack_int ldab, double* w, double* z, lapack_int ldz, double* work);
 
-lapack_int LAPACKE_ssptri_work( int matrix_order, char uplo, lapack_int n,
-                                float* ap, const lapack_int* ipiv,
-                                float* work );
-lapack_int LAPACKE_dsptri_work( int matrix_order, char uplo, lapack_int n,
-                                double* ap, const lapack_int* ipiv,
-                                double* work );
-lapack_int LAPACKE_csptri_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_float* ap,
-                                const lapack_int* ipiv,
-                                lapack_complex_float* work );
-lapack_int LAPACKE_zsptri_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_double* ap,
-                                const lapack_int* ipiv,
-                                lapack_complex_double* work );
+lapack_int LAPACKE_ssbevd_work(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int kd, float* ab,
+                               lapack_int ldab, float* w, float* z, lapack_int ldz, float* work, lapack_int lwork,
+                               lapack_int* iwork, lapack_int liwork);
+lapack_int LAPACKE_dsbevd_work(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int kd, double* ab,
+                               lapack_int ldab, double* w, double* z, lapack_int ldz, double* work, lapack_int lwork,
+                               lapack_int* iwork, lapack_int liwork);
 
-lapack_int LAPACKE_ssptrs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const float* ap,
-                                const lapack_int* ipiv, float* b,
-                                lapack_int ldb );
-lapack_int LAPACKE_dsptrs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const double* ap,
-                                const lapack_int* ipiv, double* b,
-                                lapack_int ldb );
-lapack_int LAPACKE_csptrs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const lapack_complex_float* ap,
-                                const lapack_int* ipiv, lapack_complex_float* b,
-                                lapack_int ldb );
-lapack_int LAPACKE_zsptrs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs,
-                                const lapack_complex_double* ap,
-                                const lapack_int* ipiv,
-                                lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_ssbevx_work(int matrix_order, char jobz, char range, char uplo, lapack_int n, lapack_int kd,
+                               float* ab, lapack_int ldab, float* q, lapack_int ldq, float vl, float vu, lapack_int il,
+                               lapack_int iu, float abstol, lapack_int* m, float* w, float* z, lapack_int ldz,
+                               float* work, lapack_int* iwork, lapack_int* ifail);
+lapack_int LAPACKE_dsbevx_work(int matrix_order, char jobz, char range, char uplo, lapack_int n, lapack_int kd,
+                               double* ab, lapack_int ldab, double* q, lapack_int ldq, double vl, double vu,
+                               lapack_int il, lapack_int iu, double abstol, lapack_int* m, double* w, double* z,
+                               lapack_int ldz, double* work, lapack_int* iwork, lapack_int* ifail);
 
-lapack_int LAPACKE_sstebz_work( char range, char order, lapack_int n, float vl,
-                                float vu, lapack_int il, lapack_int iu,
-                                float abstol, const float* d, const float* e,
-                                lapack_int* m, lapack_int* nsplit, float* w,
-                                lapack_int* iblock, lapack_int* isplit,
-                                float* work, lapack_int* iwork );
-lapack_int LAPACKE_dstebz_work( char range, char order, lapack_int n, double vl,
-                                double vu, lapack_int il, lapack_int iu,
-                                double abstol, const double* d, const double* e,
-                                lapack_int* m, lapack_int* nsplit, double* w,
-                                lapack_int* iblock, lapack_int* isplit,
-                                double* work, lapack_int* iwork );
+lapack_int LAPACKE_ssbgst_work(int matrix_order, char vect, char uplo, lapack_int n, lapack_int ka, lapack_int kb,
+                               float* ab, lapack_int ldab, const float* bb, lapack_int ldbb, float* x, lapack_int ldx,
+                               float* work);
+lapack_int LAPACKE_dsbgst_work(int matrix_order, char vect, char uplo, lapack_int n, lapack_int ka, lapack_int kb,
+                               double* ab, lapack_int ldab, const double* bb, lapack_int ldbb, double* x,
+                               lapack_int ldx, double* work);
 
-lapack_int LAPACKE_sstedc_work( int matrix_order, char compz, lapack_int n,
-                                float* d, float* e, float* z, lapack_int ldz,
-                                float* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int liwork );
-lapack_int LAPACKE_dstedc_work( int matrix_order, char compz, lapack_int n,
-                                double* d, double* e, double* z, lapack_int ldz,
-                                double* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int liwork );
-lapack_int LAPACKE_cstedc_work( int matrix_order, char compz, lapack_int n,
-                                float* d, float* e, lapack_complex_float* z,
-                                lapack_int ldz, lapack_complex_float* work,
-                                lapack_int lwork, float* rwork,
-                                lapack_int lrwork, lapack_int* iwork,
-                                lapack_int liwork );
-lapack_int LAPACKE_zstedc_work( int matrix_order, char compz, lapack_int n,
-                                double* d, double* e, lapack_complex_double* z,
-                                lapack_int ldz, lapack_complex_double* work,
-                                lapack_int lwork, double* rwork,
-                                lapack_int lrwork, lapack_int* iwork,
-                                lapack_int liwork );
+lapack_int LAPACKE_ssbgv_work(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int ka, lapack_int kb,
+                              float* ab, lapack_int ldab, float* bb, lapack_int ldbb, float* w, float* z,
+                              lapack_int ldz, float* work);
+lapack_int LAPACKE_dsbgv_work(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int ka, lapack_int kb,
+                              double* ab, lapack_int ldab, double* bb, lapack_int ldbb, double* w, double* z,
+                              lapack_int ldz, double* work);
 
-lapack_int LAPACKE_sstegr_work( int matrix_order, char jobz, char range,
-                                lapack_int n, float* d, float* e, float vl,
-                                float vu, lapack_int il, lapack_int iu,
-                                float abstol, lapack_int* m, float* w, float* z,
-                                lapack_int ldz, lapack_int* isuppz, float* work,
-                                lapack_int lwork, lapack_int* iwork,
-                                lapack_int liwork );
-lapack_int LAPACKE_dstegr_work( int matrix_order, char jobz, char range,
-                                lapack_int n, double* d, double* e, double vl,
-                                double vu, lapack_int il, lapack_int iu,
-                                double abstol, lapack_int* m, double* w,
-                                double* z, lapack_int ldz, lapack_int* isuppz,
-                                double* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int liwork );
-lapack_int LAPACKE_cstegr_work( int matrix_order, char jobz, char range,
-                                lapack_int n, float* d, float* e, float vl,
-                                float vu, lapack_int il, lapack_int iu,
-                                float abstol, lapack_int* m, float* w,
-                                lapack_complex_float* z, lapack_int ldz,
-                                lapack_int* isuppz, float* work,
-                                lapack_int lwork, lapack_int* iwork,
-                                lapack_int liwork );
-lapack_int LAPACKE_zstegr_work( int matrix_order, char jobz, char range,
-                                lapack_int n, double* d, double* e, double vl,
-                                double vu, lapack_int il, lapack_int iu,
-                                double abstol, lapack_int* m, double* w,
-                                lapack_complex_double* z, lapack_int ldz,
-                                lapack_int* isuppz, double* work,
-                                lapack_int lwork, lapack_int* iwork,
-                                lapack_int liwork );
+lapack_int LAPACKE_ssbgvd_work(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int ka, lapack_int kb,
+                               float* ab, lapack_int ldab, float* bb, lapack_int ldbb, float* w, float* z,
+                               lapack_int ldz, float* work, lapack_int lwork, lapack_int* iwork, lapack_int liwork);
+lapack_int LAPACKE_dsbgvd_work(int matrix_order, char jobz, char uplo, lapack_int n, lapack_int ka, lapack_int kb,
+                               double* ab, lapack_int ldab, double* bb, lapack_int ldbb, double* w, double* z,
+                               lapack_int ldz, double* work, lapack_int lwork, lapack_int* iwork, lapack_int liwork);
 
-lapack_int LAPACKE_sstein_work( int matrix_order, lapack_int n, const float* d,
-                                const float* e, lapack_int m, const float* w,
-                                const lapack_int* iblock,
-                                const lapack_int* isplit, float* z,
-                                lapack_int ldz, float* work, lapack_int* iwork,
-                                lapack_int* ifailv );
-lapack_int LAPACKE_dstein_work( int matrix_order, lapack_int n, const double* d,
-                                const double* e, lapack_int m, const double* w,
-                                const lapack_int* iblock,
-                                const lapack_int* isplit, double* z,
-                                lapack_int ldz, double* work, lapack_int* iwork,
-                                lapack_int* ifailv );
-lapack_int LAPACKE_cstein_work( int matrix_order, lapack_int n, const float* d,
-                                const float* e, lapack_int m, const float* w,
-                                const lapack_int* iblock,
-                                const lapack_int* isplit,
-                                lapack_complex_float* z, lapack_int ldz,
-                                float* work, lapack_int* iwork,
-                                lapack_int* ifailv );
-lapack_int LAPACKE_zstein_work( int matrix_order, lapack_int n, const double* d,
-                                const double* e, lapack_int m, const double* w,
-                                const lapack_int* iblock,
-                                const lapack_int* isplit,
-                                lapack_complex_double* z, lapack_int ldz,
-                                double* work, lapack_int* iwork,
-                                lapack_int* ifailv );
+lapack_int LAPACKE_ssbgvx_work(int matrix_order, char jobz, char range, char uplo, lapack_int n, lapack_int ka,
+                               lapack_int kb, float* ab, lapack_int ldab, float* bb, lapack_int ldbb, float* q,
+                               lapack_int ldq, float vl, float vu, lapack_int il, lapack_int iu, float abstol,
+                               lapack_int* m, float* w, float* z, lapack_int ldz, float* work, lapack_int* iwork,
+                               lapack_int* ifail);
+lapack_int LAPACKE_dsbgvx_work(int matrix_order, char jobz, char range, char uplo, lapack_int n, lapack_int ka,
+                               lapack_int kb, double* ab, lapack_int ldab, double* bb, lapack_int ldbb, double* q,
+                               lapack_int ldq, double vl, double vu, lapack_int il, lapack_int iu, double abstol,
+                               lapack_int* m, double* w, double* z, lapack_int ldz, double* work, lapack_int* iwork,
+                               lapack_int* ifail);
 
-lapack_int LAPACKE_sstemr_work( int matrix_order, char jobz, char range,
-                                lapack_int n, float* d, float* e, float vl,
-                                float vu, lapack_int il, lapack_int iu,
-                                lapack_int* m, float* w, float* z,
-                                lapack_int ldz, lapack_int nzc,
-                                lapack_int* isuppz, lapack_logical* tryrac,
-                                float* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int liwork );
-lapack_int LAPACKE_dstemr_work( int matrix_order, char jobz, char range,
-                                lapack_int n, double* d, double* e, double vl,
-                                double vu, lapack_int il, lapack_int iu,
-                                lapack_int* m, double* w, double* z,
-                                lapack_int ldz, lapack_int nzc,
-                                lapack_int* isuppz, lapack_logical* tryrac,
-                                double* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int liwork );
-lapack_int LAPACKE_cstemr_work( int matrix_order, char jobz, char range,
-                                lapack_int n, float* d, float* e, float vl,
-                                float vu, lapack_int il, lapack_int iu,
-                                lapack_int* m, float* w,
-                                lapack_complex_float* z, lapack_int ldz,
-                                lapack_int nzc, lapack_int* isuppz,
-                                lapack_logical* tryrac, float* work,
-                                lapack_int lwork, lapack_int* iwork,
-                                lapack_int liwork );
-lapack_int LAPACKE_zstemr_work( int matrix_order, char jobz, char range,
-                                lapack_int n, double* d, double* e, double vl,
-                                double vu, lapack_int il, lapack_int iu,
-                                lapack_int* m, double* w,
-                                lapack_complex_double* z, lapack_int ldz,
-                                lapack_int nzc, lapack_int* isuppz,
-                                lapack_logical* tryrac, double* work,
-                                lapack_int lwork, lapack_int* iwork,
-                                lapack_int liwork );
+lapack_int LAPACKE_ssbtrd_work(int matrix_order, char vect, char uplo, lapack_int n, lapack_int kd, float* ab,
+                               lapack_int ldab, float* d, float* e, float* q, lapack_int ldq, float* work);
+lapack_int LAPACKE_dsbtrd_work(int matrix_order, char vect, char uplo, lapack_int n, lapack_int kd, double* ab,
+                               lapack_int ldab, double* d, double* e, double* q, lapack_int ldq, double* work);
 
-lapack_int LAPACKE_ssteqr_work( int matrix_order, char compz, lapack_int n,
-                                float* d, float* e, float* z, lapack_int ldz,
-                                float* work );
-lapack_int LAPACKE_dsteqr_work( int matrix_order, char compz, lapack_int n,
-                                double* d, double* e, double* z, lapack_int ldz,
-                                double* work );
-lapack_int LAPACKE_csteqr_work( int matrix_order, char compz, lapack_int n,
-                                float* d, float* e, lapack_complex_float* z,
-                                lapack_int ldz, float* work );
-lapack_int LAPACKE_zsteqr_work( int matrix_order, char compz, lapack_int n,
-                                double* d, double* e, lapack_complex_double* z,
-                                lapack_int ldz, double* work );
+lapack_int LAPACKE_ssfrk_work(int matrix_order, char transr, char uplo, char trans, lapack_int n, lapack_int k,
+                              float alpha, const float* a, lapack_int lda, float beta, float* c);
+lapack_int LAPACKE_dsfrk_work(int matrix_order, char transr, char uplo, char trans, lapack_int n, lapack_int k,
+                              double alpha, const double* a, lapack_int lda, double beta, double* c);
 
-lapack_int LAPACKE_ssterf_work( lapack_int n, float* d, float* e );
-lapack_int LAPACKE_dsterf_work( lapack_int n, double* d, double* e );
+lapack_int LAPACKE_sspcon_work(int matrix_order, char uplo, lapack_int n, const float* ap, const lapack_int* ipiv,
+                               float anorm, float* rcond, float* work, lapack_int* iwork);
+lapack_int LAPACKE_dspcon_work(int matrix_order, char uplo, lapack_int n, const double* ap, const lapack_int* ipiv,
+                               double anorm, double* rcond, double* work, lapack_int* iwork);
+lapack_int LAPACKE_cspcon_work(int matrix_order, char uplo, lapack_int n, const lapack_complex_float* ap,
+                               const lapack_int* ipiv, float anorm, float* rcond, lapack_complex_float* work);
+lapack_int LAPACKE_zspcon_work(int matrix_order, char uplo, lapack_int n, const lapack_complex_double* ap,
+                               const lapack_int* ipiv, double anorm, double* rcond, lapack_complex_double* work);
 
-lapack_int LAPACKE_sstev_work( int matrix_order, char jobz, lapack_int n,
-                               float* d, float* e, float* z, lapack_int ldz,
-                               float* work );
-lapack_int LAPACKE_dstev_work( int matrix_order, char jobz, lapack_int n,
-                               double* d, double* e, double* z, lapack_int ldz,
-                               double* work );
+lapack_int LAPACKE_sspev_work(int matrix_order, char jobz, char uplo, lapack_int n, float* ap, float* w, float* z,
+                              lapack_int ldz, float* work);
+lapack_int LAPACKE_dspev_work(int matrix_order, char jobz, char uplo, lapack_int n, double* ap, double* w, double* z,
+                              lapack_int ldz, double* work);
 
-lapack_int LAPACKE_sstevd_work( int matrix_order, char jobz, lapack_int n,
-                                float* d, float* e, float* z, lapack_int ldz,
-                                float* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int liwork );
-lapack_int LAPACKE_dstevd_work( int matrix_order, char jobz, lapack_int n,
-                                double* d, double* e, double* z, lapack_int ldz,
-                                double* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int liwork );
+lapack_int LAPACKE_sspevd_work(int matrix_order, char jobz, char uplo, lapack_int n, float* ap, float* w, float* z,
+                               lapack_int ldz, float* work, lapack_int lwork, lapack_int* iwork, lapack_int liwork);
+lapack_int LAPACKE_dspevd_work(int matrix_order, char jobz, char uplo, lapack_int n, double* ap, double* w, double* z,
+                               lapack_int ldz, double* work, lapack_int lwork, lapack_int* iwork, lapack_int liwork);
 
-lapack_int LAPACKE_sstevr_work( int matrix_order, char jobz, char range,
-                                lapack_int n, float* d, float* e, float vl,
-                                float vu, lapack_int il, lapack_int iu,
-                                float abstol, lapack_int* m, float* w, float* z,
-                                lapack_int ldz, lapack_int* isuppz, float* work,
-                                lapack_int lwork, lapack_int* iwork,
-                                lapack_int liwork );
-lapack_int LAPACKE_dstevr_work( int matrix_order, char jobz, char range,
-                                lapack_int n, double* d, double* e, double vl,
-                                double vu, lapack_int il, lapack_int iu,
-                                double abstol, lapack_int* m, double* w,
-                                double* z, lapack_int ldz, lapack_int* isuppz,
-                                double* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int liwork );
+lapack_int LAPACKE_sspevx_work(int matrix_order, char jobz, char range, char uplo, lapack_int n, float* ap, float vl,
+                               float vu, lapack_int il, lapack_int iu, float abstol, lapack_int* m, float* w, float* z,
+                               lapack_int ldz, float* work, lapack_int* iwork, lapack_int* ifail);
+lapack_int LAPACKE_dspevx_work(int matrix_order, char jobz, char range, char uplo, lapack_int n, double* ap, double vl,
+                               double vu, lapack_int il, lapack_int iu, double abstol, lapack_int* m, double* w,
+                               double* z, lapack_int ldz, double* work, lapack_int* iwork, lapack_int* ifail);
 
-lapack_int LAPACKE_sstevx_work( int matrix_order, char jobz, char range,
-                                lapack_int n, float* d, float* e, float vl,
-                                float vu, lapack_int il, lapack_int iu,
-                                float abstol, lapack_int* m, float* w, float* z,
-                                lapack_int ldz, float* work, lapack_int* iwork,
-                                lapack_int* ifail );
-lapack_int LAPACKE_dstevx_work( int matrix_order, char jobz, char range,
-                                lapack_int n, double* d, double* e, double vl,
-                                double vu, lapack_int il, lapack_int iu,
-                                double abstol, lapack_int* m, double* w,
-                                double* z, lapack_int ldz, double* work,
-                                lapack_int* iwork, lapack_int* ifail );
+lapack_int LAPACKE_sspgst_work(int matrix_order, lapack_int itype, char uplo, lapack_int n, float* ap, const float* bp);
+lapack_int LAPACKE_dspgst_work(int matrix_order, lapack_int itype, char uplo, lapack_int n, double* ap,
+                               const double* bp);
 
-lapack_int LAPACKE_ssycon_work( int matrix_order, char uplo, lapack_int n,
-                                const float* a, lapack_int lda,
-                                const lapack_int* ipiv, float anorm,
-                                float* rcond, float* work, lapack_int* iwork );
-lapack_int LAPACKE_dsycon_work( int matrix_order, char uplo, lapack_int n,
-                                const double* a, lapack_int lda,
-                                const lapack_int* ipiv, double anorm,
-                                double* rcond, double* work,
-                                lapack_int* iwork );
-lapack_int LAPACKE_csycon_work( int matrix_order, char uplo, lapack_int n,
-                                const lapack_complex_float* a, lapack_int lda,
-                                const lapack_int* ipiv, float anorm,
-                                float* rcond, lapack_complex_float* work );
-lapack_int LAPACKE_zsycon_work( int matrix_order, char uplo, lapack_int n,
-                                const lapack_complex_double* a, lapack_int lda,
-                                const lapack_int* ipiv, double anorm,
-                                double* rcond, lapack_complex_double* work );
+lapack_int LAPACKE_sspgv_work(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n, float* ap,
+                              float* bp, float* w, float* z, lapack_int ldz, float* work);
+lapack_int LAPACKE_dspgv_work(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n, double* ap,
+                              double* bp, double* w, double* z, lapack_int ldz, double* work);
 
-lapack_int LAPACKE_ssyequb_work( int matrix_order, char uplo, lapack_int n,
-                                 const float* a, lapack_int lda, float* s,
-                                 float* scond, float* amax, float* work );
-lapack_int LAPACKE_dsyequb_work( int matrix_order, char uplo, lapack_int n,
-                                 const double* a, lapack_int lda, double* s,
-                                 double* scond, double* amax, double* work );
-lapack_int LAPACKE_csyequb_work( int matrix_order, char uplo, lapack_int n,
-                                 const lapack_complex_float* a, lapack_int lda,
-                                 float* s, float* scond, float* amax,
-                                 lapack_complex_float* work );
-lapack_int LAPACKE_zsyequb_work( int matrix_order, char uplo, lapack_int n,
-                                 const lapack_complex_double* a, lapack_int lda,
-                                 double* s, double* scond, double* amax,
-                                 lapack_complex_double* work );
+lapack_int LAPACKE_sspgvd_work(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n, float* ap,
+                               float* bp, float* w, float* z, lapack_int ldz, float* work, lapack_int lwork,
+                               lapack_int* iwork, lapack_int liwork);
+lapack_int LAPACKE_dspgvd_work(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n, double* ap,
+                               double* bp, double* w, double* z, lapack_int ldz, double* work, lapack_int lwork,
+                               lapack_int* iwork, lapack_int liwork);
 
-lapack_int LAPACKE_ssyev_work( int matrix_order, char jobz, char uplo,
-                               lapack_int n, float* a, lapack_int lda, float* w,
-                               float* work, lapack_int lwork );
-lapack_int LAPACKE_dsyev_work( int matrix_order, char jobz, char uplo,
-                               lapack_int n, double* a, lapack_int lda,
-                               double* w, double* work, lapack_int lwork );
+lapack_int LAPACKE_sspgvx_work(int matrix_order, lapack_int itype, char jobz, char range, char uplo, lapack_int n,
+                               float* ap, float* bp, float vl, float vu, lapack_int il, lapack_int iu, float abstol,
+                               lapack_int* m, float* w, float* z, lapack_int ldz, float* work, lapack_int* iwork,
+                               lapack_int* ifail);
+lapack_int LAPACKE_dspgvx_work(int matrix_order, lapack_int itype, char jobz, char range, char uplo, lapack_int n,
+                               double* ap, double* bp, double vl, double vu, lapack_int il, lapack_int iu,
+                               double abstol, lapack_int* m, double* w, double* z, lapack_int ldz, double* work,
+                               lapack_int* iwork, lapack_int* ifail);
 
-lapack_int LAPACKE_ssyevd_work( int matrix_order, char jobz, char uplo,
-                                lapack_int n, float* a, lapack_int lda,
-                                float* w, float* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int liwork );
-lapack_int LAPACKE_dsyevd_work( int matrix_order, char jobz, char uplo,
-                                lapack_int n, double* a, lapack_int lda,
-                                double* w, double* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int liwork );
+lapack_int LAPACKE_ssprfs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const float* ap,
+                               const float* afp, const lapack_int* ipiv, const float* b, lapack_int ldb, float* x,
+                               lapack_int ldx, float* ferr, float* berr, float* work, lapack_int* iwork);
+lapack_int LAPACKE_dsprfs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const double* ap,
+                               const double* afp, const lapack_int* ipiv, const double* b, lapack_int ldb, double* x,
+                               lapack_int ldx, double* ferr, double* berr, double* work, lapack_int* iwork);
+lapack_int LAPACKE_csprfs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_float* ap, const lapack_complex_float* afp, const lapack_int* ipiv,
+                               const lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x, lapack_int ldx,
+                               float* ferr, float* berr, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zsprfs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_double* ap, const lapack_complex_double* afp,
+                               const lapack_int* ipiv, const lapack_complex_double* b, lapack_int ldb,
+                               lapack_complex_double* x, lapack_int ldx, double* ferr, double* berr,
+                               lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_ssyevr_work( int matrix_order, char jobz, char range,
-                                char uplo, lapack_int n, float* a,
-                                lapack_int lda, float vl, float vu,
-                                lapack_int il, lapack_int iu, float abstol,
-                                lapack_int* m, float* w, float* z,
-                                lapack_int ldz, lapack_int* isuppz, float* work,
-                                lapack_int lwork, lapack_int* iwork,
-                                lapack_int liwork );
-lapack_int LAPACKE_dsyevr_work( int matrix_order, char jobz, char range,
-                                char uplo, lapack_int n, double* a,
-                                lapack_int lda, double vl, double vu,
-                                lapack_int il, lapack_int iu, double abstol,
-                                lapack_int* m, double* w, double* z,
-                                lapack_int ldz, lapack_int* isuppz,
-                                double* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int liwork );
+lapack_int LAPACKE_sspsv_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, float* ap, lapack_int* ipiv,
+                              float* b, lapack_int ldb);
+lapack_int LAPACKE_dspsv_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, double* ap, lapack_int* ipiv,
+                              double* b, lapack_int ldb);
+lapack_int LAPACKE_cspsv_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_float* ap,
+                              lapack_int* ipiv, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zspsv_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double* ap,
+                              lapack_int* ipiv, lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_ssyevx_work( int matrix_order, char jobz, char range,
-                                char uplo, lapack_int n, float* a,
-                                lapack_int lda, float vl, float vu,
-                                lapack_int il, lapack_int iu, float abstol,
-                                lapack_int* m, float* w, float* z,
-                                lapack_int ldz, float* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int* ifail );
-lapack_int LAPACKE_dsyevx_work( int matrix_order, char jobz, char range,
-                                char uplo, lapack_int n, double* a,
-                                lapack_int lda, double vl, double vu,
-                                lapack_int il, lapack_int iu, double abstol,
-                                lapack_int* m, double* w, double* z,
-                                lapack_int ldz, double* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int* ifail );
+lapack_int LAPACKE_sspsvx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs, const float* ap,
+                               float* afp, lapack_int* ipiv, const float* b, lapack_int ldb, float* x, lapack_int ldx,
+                               float* rcond, float* ferr, float* berr, float* work, lapack_int* iwork);
+lapack_int LAPACKE_dspsvx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs, const double* ap,
+                               double* afp, lapack_int* ipiv, const double* b, lapack_int ldb, double* x,
+                               lapack_int ldx, double* rcond, double* ferr, double* berr, double* work,
+                               lapack_int* iwork);
+lapack_int LAPACKE_cspsvx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_float* ap, lapack_complex_float* afp, lapack_int* ipiv,
+                               const lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x, lapack_int ldx,
+                               float* rcond, float* ferr, float* berr, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zspsvx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_double* ap, lapack_complex_double* afp, lapack_int* ipiv,
+                               const lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x, lapack_int ldx,
+                               double* rcond, double* ferr, double* berr, lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_ssygst_work( int matrix_order, lapack_int itype, char uplo,
-                                lapack_int n, float* a, lapack_int lda,
-                                const float* b, lapack_int ldb );
-lapack_int LAPACKE_dsygst_work( int matrix_order, lapack_int itype, char uplo,
-                                lapack_int n, double* a, lapack_int lda,
-                                const double* b, lapack_int ldb );
+lapack_int LAPACKE_ssptrd_work(int matrix_order, char uplo, lapack_int n, float* ap, float* d, float* e, float* tau);
+lapack_int LAPACKE_dsptrd_work(int matrix_order, char uplo, lapack_int n, double* ap, double* d, double* e,
+                               double* tau);
 
-lapack_int LAPACKE_ssygv_work( int matrix_order, lapack_int itype, char jobz,
-                               char uplo, lapack_int n, float* a,
-                               lapack_int lda, float* b, lapack_int ldb,
-                               float* w, float* work, lapack_int lwork );
-lapack_int LAPACKE_dsygv_work( int matrix_order, lapack_int itype, char jobz,
-                               char uplo, lapack_int n, double* a,
-                               lapack_int lda, double* b, lapack_int ldb,
-                               double* w, double* work, lapack_int lwork );
+lapack_int LAPACKE_ssptrf_work(int matrix_order, char uplo, lapack_int n, float* ap, lapack_int* ipiv);
+lapack_int LAPACKE_dsptrf_work(int matrix_order, char uplo, lapack_int n, double* ap, lapack_int* ipiv);
+lapack_int LAPACKE_csptrf_work(int matrix_order, char uplo, lapack_int n, lapack_complex_float* ap, lapack_int* ipiv);
+lapack_int LAPACKE_zsptrf_work(int matrix_order, char uplo, lapack_int n, lapack_complex_double* ap, lapack_int* ipiv);
 
-lapack_int LAPACKE_ssygvd_work( int matrix_order, lapack_int itype, char jobz,
-                                char uplo, lapack_int n, float* a,
-                                lapack_int lda, float* b, lapack_int ldb,
-                                float* w, float* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int liwork );
-lapack_int LAPACKE_dsygvd_work( int matrix_order, lapack_int itype, char jobz,
-                                char uplo, lapack_int n, double* a,
-                                lapack_int lda, double* b, lapack_int ldb,
-                                double* w, double* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int liwork );
+lapack_int LAPACKE_ssptri_work(int matrix_order, char uplo, lapack_int n, float* ap, const lapack_int* ipiv,
+                               float* work);
+lapack_int LAPACKE_dsptri_work(int matrix_order, char uplo, lapack_int n, double* ap, const lapack_int* ipiv,
+                               double* work);
+lapack_int LAPACKE_csptri_work(int matrix_order, char uplo, lapack_int n, lapack_complex_float* ap,
+                               const lapack_int* ipiv, lapack_complex_float* work);
+lapack_int LAPACKE_zsptri_work(int matrix_order, char uplo, lapack_int n, lapack_complex_double* ap,
+                               const lapack_int* ipiv, lapack_complex_double* work);
 
-lapack_int LAPACKE_ssygvx_work( int matrix_order, lapack_int itype, char jobz,
-                                char range, char uplo, lapack_int n, float* a,
-                                lapack_int lda, float* b, lapack_int ldb,
-                                float vl, float vu, lapack_int il,
-                                lapack_int iu, float abstol, lapack_int* m,
-                                float* w, float* z, lapack_int ldz, float* work,
-                                lapack_int lwork, lapack_int* iwork,
-                                lapack_int* ifail );
-lapack_int LAPACKE_dsygvx_work( int matrix_order, lapack_int itype, char jobz,
-                                char range, char uplo, lapack_int n, double* a,
-                                lapack_int lda, double* b, lapack_int ldb,
-                                double vl, double vu, lapack_int il,
-                                lapack_int iu, double abstol, lapack_int* m,
-                                double* w, double* z, lapack_int ldz,
-                                double* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int* ifail );
+lapack_int LAPACKE_ssptrs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const float* ap,
+                               const lapack_int* ipiv, float* b, lapack_int ldb);
+lapack_int LAPACKE_dsptrs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const double* ap,
+                               const lapack_int* ipiv, double* b, lapack_int ldb);
+lapack_int LAPACKE_csptrs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_float* ap, const lapack_int* ipiv, lapack_complex_float* b,
+                               lapack_int ldb);
+lapack_int LAPACKE_zsptrs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_double* ap, const lapack_int* ipiv, lapack_complex_double* b,
+                               lapack_int ldb);
 
-lapack_int LAPACKE_ssyrfs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const float* a, lapack_int lda,
-                                const float* af, lapack_int ldaf,
-                                const lapack_int* ipiv, const float* b,
-                                lapack_int ldb, float* x, lapack_int ldx,
-                                float* ferr, float* berr, float* work,
-                                lapack_int* iwork );
-lapack_int LAPACKE_dsyrfs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const double* a,
-                                lapack_int lda, const double* af,
-                                lapack_int ldaf, const lapack_int* ipiv,
-                                const double* b, lapack_int ldb, double* x,
-                                lapack_int ldx, double* ferr, double* berr,
-                                double* work, lapack_int* iwork );
-lapack_int LAPACKE_csyrfs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const lapack_complex_float* a,
-                                lapack_int lda, const lapack_complex_float* af,
-                                lapack_int ldaf, const lapack_int* ipiv,
-                                const lapack_complex_float* b, lapack_int ldb,
-                                lapack_complex_float* x, lapack_int ldx,
-                                float* ferr, float* berr,
-                                lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_zsyrfs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const lapack_complex_double* a,
-                                lapack_int lda, const lapack_complex_double* af,
-                                lapack_int ldaf, const lapack_int* ipiv,
-                                const lapack_complex_double* b, lapack_int ldb,
-                                lapack_complex_double* x, lapack_int ldx,
-                                double* ferr, double* berr,
-                                lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_sstebz_work(char range, char order, lapack_int n, float vl, float vu, lapack_int il, lapack_int iu,
+                               float abstol, const float* d, const float* e, lapack_int* m, lapack_int* nsplit,
+                               float* w, lapack_int* iblock, lapack_int* isplit, float* work, lapack_int* iwork);
+lapack_int LAPACKE_dstebz_work(char range, char order, lapack_int n, double vl, double vu, lapack_int il, lapack_int iu,
+                               double abstol, const double* d, const double* e, lapack_int* m, lapack_int* nsplit,
+                               double* w, lapack_int* iblock, lapack_int* isplit, double* work, lapack_int* iwork);
 
-lapack_int LAPACKE_ssyrfsx_work( int matrix_order, char uplo, char equed,
-                                 lapack_int n, lapack_int nrhs, const float* a,
-                                 lapack_int lda, const float* af,
-                                 lapack_int ldaf, const lapack_int* ipiv,
-                                 const float* s, const float* b, lapack_int ldb,
-                                 float* x, lapack_int ldx, float* rcond,
-                                 float* berr, lapack_int n_err_bnds,
-                                 float* err_bnds_norm, float* err_bnds_comp,
-                                 lapack_int nparams, float* params, float* work,
-                                 lapack_int* iwork );
-lapack_int LAPACKE_dsyrfsx_work( int matrix_order, char uplo, char equed,
-                                 lapack_int n, lapack_int nrhs, const double* a,
-                                 lapack_int lda, const double* af,
-                                 lapack_int ldaf, const lapack_int* ipiv,
-                                 const double* s, const double* b,
-                                 lapack_int ldb, double* x, lapack_int ldx,
-                                 double* rcond, double* berr,
-                                 lapack_int n_err_bnds, double* err_bnds_norm,
-                                 double* err_bnds_comp, lapack_int nparams,
-                                 double* params, double* work,
-                                 lapack_int* iwork );
-lapack_int LAPACKE_csyrfsx_work( int matrix_order, char uplo, char equed,
-                                 lapack_int n, lapack_int nrhs,
-                                 const lapack_complex_float* a, lapack_int lda,
-                                 const lapack_complex_float* af,
-                                 lapack_int ldaf, const lapack_int* ipiv,
-                                 const float* s, const lapack_complex_float* b,
-                                 lapack_int ldb, lapack_complex_float* x,
-                                 lapack_int ldx, float* rcond, float* berr,
-                                 lapack_int n_err_bnds, float* err_bnds_norm,
-                                 float* err_bnds_comp, lapack_int nparams,
-                                 float* params, lapack_complex_float* work,
-                                 float* rwork );
-lapack_int LAPACKE_zsyrfsx_work( int matrix_order, char uplo, char equed,
-                                 lapack_int n, lapack_int nrhs,
-                                 const lapack_complex_double* a, lapack_int lda,
-                                 const lapack_complex_double* af,
-                                 lapack_int ldaf, const lapack_int* ipiv,
-                                 const double* s,
-                                 const lapack_complex_double* b, lapack_int ldb,
-                                 lapack_complex_double* x, lapack_int ldx,
-                                 double* rcond, double* berr,
-                                 lapack_int n_err_bnds, double* err_bnds_norm,
-                                 double* err_bnds_comp, lapack_int nparams,
-                                 double* params, lapack_complex_double* work,
-                                 double* rwork );
+lapack_int LAPACKE_sstedc_work(int matrix_order, char compz, lapack_int n, float* d, float* e, float* z, lapack_int ldz,
+                               float* work, lapack_int lwork, lapack_int* iwork, lapack_int liwork);
+lapack_int LAPACKE_dstedc_work(int matrix_order, char compz, lapack_int n, double* d, double* e, double* z,
+                               lapack_int ldz, double* work, lapack_int lwork, lapack_int* iwork, lapack_int liwork);
+lapack_int LAPACKE_cstedc_work(int matrix_order, char compz, lapack_int n, float* d, float* e, lapack_complex_float* z,
+                               lapack_int ldz, lapack_complex_float* work, lapack_int lwork, float* rwork,
+                               lapack_int lrwork, lapack_int* iwork, lapack_int liwork);
+lapack_int LAPACKE_zstedc_work(int matrix_order, char compz, lapack_int n, double* d, double* e,
+                               lapack_complex_double* z, lapack_int ldz, lapack_complex_double* work, lapack_int lwork,
+                               double* rwork, lapack_int lrwork, lapack_int* iwork, lapack_int liwork);
 
-lapack_int LAPACKE_ssysv_work( int matrix_order, char uplo, lapack_int n,
-                               lapack_int nrhs, float* a, lapack_int lda,
-                               lapack_int* ipiv, float* b, lapack_int ldb,
-                               float* work, lapack_int lwork );
-lapack_int LAPACKE_dsysv_work( int matrix_order, char uplo, lapack_int n,
-                               lapack_int nrhs, double* a, lapack_int lda,
-                               lapack_int* ipiv, double* b, lapack_int ldb,
-                               double* work, lapack_int lwork );
-lapack_int LAPACKE_csysv_work( int matrix_order, char uplo, lapack_int n,
-                               lapack_int nrhs, lapack_complex_float* a,
-                               lapack_int lda, lapack_int* ipiv,
-                               lapack_complex_float* b, lapack_int ldb,
-                               lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zsysv_work( int matrix_order, char uplo, lapack_int n,
-                               lapack_int nrhs, lapack_complex_double* a,
-                               lapack_int lda, lapack_int* ipiv,
-                               lapack_complex_double* b, lapack_int ldb,
-                               lapack_complex_double* work, lapack_int lwork );
+lapack_int LAPACKE_sstegr_work(int matrix_order, char jobz, char range, lapack_int n, float* d, float* e, float vl,
+                               float vu, lapack_int il, lapack_int iu, float abstol, lapack_int* m, float* w, float* z,
+                               lapack_int ldz, lapack_int* isuppz, float* work, lapack_int lwork, lapack_int* iwork,
+                               lapack_int liwork);
+lapack_int LAPACKE_dstegr_work(int matrix_order, char jobz, char range, lapack_int n, double* d, double* e, double vl,
+                               double vu, lapack_int il, lapack_int iu, double abstol, lapack_int* m, double* w,
+                               double* z, lapack_int ldz, lapack_int* isuppz, double* work, lapack_int lwork,
+                               lapack_int* iwork, lapack_int liwork);
+lapack_int LAPACKE_cstegr_work(int matrix_order, char jobz, char range, lapack_int n, float* d, float* e, float vl,
+                               float vu, lapack_int il, lapack_int iu, float abstol, lapack_int* m, float* w,
+                               lapack_complex_float* z, lapack_int ldz, lapack_int* isuppz, float* work,
+                               lapack_int lwork, lapack_int* iwork, lapack_int liwork);
+lapack_int LAPACKE_zstegr_work(int matrix_order, char jobz, char range, lapack_int n, double* d, double* e, double vl,
+                               double vu, lapack_int il, lapack_int iu, double abstol, lapack_int* m, double* w,
+                               lapack_complex_double* z, lapack_int ldz, lapack_int* isuppz, double* work,
+                               lapack_int lwork, lapack_int* iwork, lapack_int liwork);
 
-lapack_int LAPACKE_ssysvx_work( int matrix_order, char fact, char uplo,
-                                lapack_int n, lapack_int nrhs, const float* a,
-                                lapack_int lda, float* af, lapack_int ldaf,
-                                lapack_int* ipiv, const float* b,
-                                lapack_int ldb, float* x, lapack_int ldx,
-                                float* rcond, float* ferr, float* berr,
-                                float* work, lapack_int lwork,
-                                lapack_int* iwork );
-lapack_int LAPACKE_dsysvx_work( int matrix_order, char fact, char uplo,
-                                lapack_int n, lapack_int nrhs, const double* a,
-                                lapack_int lda, double* af, lapack_int ldaf,
-                                lapack_int* ipiv, const double* b,
-                                lapack_int ldb, double* x, lapack_int ldx,
-                                double* rcond, double* ferr, double* berr,
-                                double* work, lapack_int lwork,
-                                lapack_int* iwork );
-lapack_int LAPACKE_csysvx_work( int matrix_order, char fact, char uplo,
-                                lapack_int n, lapack_int nrhs,
-                                const lapack_complex_float* a, lapack_int lda,
-                                lapack_complex_float* af, lapack_int ldaf,
-                                lapack_int* ipiv, const lapack_complex_float* b,
-                                lapack_int ldb, lapack_complex_float* x,
-                                lapack_int ldx, float* rcond, float* ferr,
-                                float* berr, lapack_complex_float* work,
-                                lapack_int lwork, float* rwork );
-lapack_int LAPACKE_zsysvx_work( int matrix_order, char fact, char uplo,
-                                lapack_int n, lapack_int nrhs,
-                                const lapack_complex_double* a, lapack_int lda,
-                                lapack_complex_double* af, lapack_int ldaf,
-                                lapack_int* ipiv,
-                                const lapack_complex_double* b, lapack_int ldb,
-                                lapack_complex_double* x, lapack_int ldx,
-                                double* rcond, double* ferr, double* berr,
-                                lapack_complex_double* work, lapack_int lwork,
-                                double* rwork );
+lapack_int LAPACKE_sstein_work(int matrix_order, lapack_int n, const float* d, const float* e, lapack_int m,
+                               const float* w, const lapack_int* iblock, const lapack_int* isplit, float* z,
+                               lapack_int ldz, float* work, lapack_int* iwork, lapack_int* ifailv);
+lapack_int LAPACKE_dstein_work(int matrix_order, lapack_int n, const double* d, const double* e, lapack_int m,
+                               const double* w, const lapack_int* iblock, const lapack_int* isplit, double* z,
+                               lapack_int ldz, double* work, lapack_int* iwork, lapack_int* ifailv);
+lapack_int LAPACKE_cstein_work(int matrix_order, lapack_int n, const float* d, const float* e, lapack_int m,
+                               const float* w, const lapack_int* iblock, const lapack_int* isplit,
+                               lapack_complex_float* z, lapack_int ldz, float* work, lapack_int* iwork,
+                               lapack_int* ifailv);
+lapack_int LAPACKE_zstein_work(int matrix_order, lapack_int n, const double* d, const double* e, lapack_int m,
+                               const double* w, const lapack_int* iblock, const lapack_int* isplit,
+                               lapack_complex_double* z, lapack_int ldz, double* work, lapack_int* iwork,
+                               lapack_int* ifailv);
 
-lapack_int LAPACKE_ssysvxx_work( int matrix_order, char fact, char uplo,
-                                 lapack_int n, lapack_int nrhs, float* a,
-                                 lapack_int lda, float* af, lapack_int ldaf,
-                                 lapack_int* ipiv, char* equed, float* s,
-                                 float* b, lapack_int ldb, float* x,
-                                 lapack_int ldx, float* rcond, float* rpvgrw,
-                                 float* berr, lapack_int n_err_bnds,
-                                 float* err_bnds_norm, float* err_bnds_comp,
-                                 lapack_int nparams, float* params, float* work,
-                                 lapack_int* iwork );
-lapack_int LAPACKE_dsysvxx_work( int matrix_order, char fact, char uplo,
-                                 lapack_int n, lapack_int nrhs, double* a,
-                                 lapack_int lda, double* af, lapack_int ldaf,
-                                 lapack_int* ipiv, char* equed, double* s,
-                                 double* b, lapack_int ldb, double* x,
-                                 lapack_int ldx, double* rcond, double* rpvgrw,
-                                 double* berr, lapack_int n_err_bnds,
-                                 double* err_bnds_norm, double* err_bnds_comp,
-                                 lapack_int nparams, double* params,
-                                 double* work, lapack_int* iwork );
-lapack_int LAPACKE_csysvxx_work( int matrix_order, char fact, char uplo,
-                                 lapack_int n, lapack_int nrhs,
-                                 lapack_complex_float* a, lapack_int lda,
-                                 lapack_complex_float* af, lapack_int ldaf,
-                                 lapack_int* ipiv, char* equed, float* s,
-                                 lapack_complex_float* b, lapack_int ldb,
-                                 lapack_complex_float* x, lapack_int ldx,
-                                 float* rcond, float* rpvgrw, float* berr,
-                                 lapack_int n_err_bnds, float* err_bnds_norm,
-                                 float* err_bnds_comp, lapack_int nparams,
-                                 float* params, lapack_complex_float* work,
-                                 float* rwork );
-lapack_int LAPACKE_zsysvxx_work( int matrix_order, char fact, char uplo,
-                                 lapack_int n, lapack_int nrhs,
-                                 lapack_complex_double* a, lapack_int lda,
-                                 lapack_complex_double* af, lapack_int ldaf,
-                                 lapack_int* ipiv, char* equed, double* s,
-                                 lapack_complex_double* b, lapack_int ldb,
-                                 lapack_complex_double* x, lapack_int ldx,
-                                 double* rcond, double* rpvgrw, double* berr,
-                                 lapack_int n_err_bnds, double* err_bnds_norm,
-                                 double* err_bnds_comp, lapack_int nparams,
-                                 double* params, lapack_complex_double* work,
-                                 double* rwork );
+lapack_int LAPACKE_sstemr_work(int matrix_order, char jobz, char range, lapack_int n, float* d, float* e, float vl,
+                               float vu, lapack_int il, lapack_int iu, lapack_int* m, float* w, float* z,
+                               lapack_int ldz, lapack_int nzc, lapack_int* isuppz, lapack_logical* tryrac, float* work,
+                               lapack_int lwork, lapack_int* iwork, lapack_int liwork);
+lapack_int LAPACKE_dstemr_work(int matrix_order, char jobz, char range, lapack_int n, double* d, double* e, double vl,
+                               double vu, lapack_int il, lapack_int iu, lapack_int* m, double* w, double* z,
+                               lapack_int ldz, lapack_int nzc, lapack_int* isuppz, lapack_logical* tryrac, double* work,
+                               lapack_int lwork, lapack_int* iwork, lapack_int liwork);
+lapack_int LAPACKE_cstemr_work(int matrix_order, char jobz, char range, lapack_int n, float* d, float* e, float vl,
+                               float vu, lapack_int il, lapack_int iu, lapack_int* m, float* w, lapack_complex_float* z,
+                               lapack_int ldz, lapack_int nzc, lapack_int* isuppz, lapack_logical* tryrac, float* work,
+                               lapack_int lwork, lapack_int* iwork, lapack_int liwork);
+lapack_int LAPACKE_zstemr_work(int matrix_order, char jobz, char range, lapack_int n, double* d, double* e, double vl,
+                               double vu, lapack_int il, lapack_int iu, lapack_int* m, double* w,
+                               lapack_complex_double* z, lapack_int ldz, lapack_int nzc, lapack_int* isuppz,
+                               lapack_logical* tryrac, double* work, lapack_int lwork, lapack_int* iwork,
+                               lapack_int liwork);
 
-lapack_int LAPACKE_ssytrd_work( int matrix_order, char uplo, lapack_int n,
-                                float* a, lapack_int lda, float* d, float* e,
-                                float* tau, float* work, lapack_int lwork );
-lapack_int LAPACKE_dsytrd_work( int matrix_order, char uplo, lapack_int n,
-                                double* a, lapack_int lda, double* d, double* e,
-                                double* tau, double* work, lapack_int lwork );
+lapack_int LAPACKE_ssteqr_work(int matrix_order, char compz, lapack_int n, float* d, float* e, float* z, lapack_int ldz,
+                               float* work);
+lapack_int LAPACKE_dsteqr_work(int matrix_order, char compz, lapack_int n, double* d, double* e, double* z,
+                               lapack_int ldz, double* work);
+lapack_int LAPACKE_csteqr_work(int matrix_order, char compz, lapack_int n, float* d, float* e, lapack_complex_float* z,
+                               lapack_int ldz, float* work);
+lapack_int LAPACKE_zsteqr_work(int matrix_order, char compz, lapack_int n, double* d, double* e,
+                               lapack_complex_double* z, lapack_int ldz, double* work);
 
-lapack_int LAPACKE_ssytrf_work( int matrix_order, char uplo, lapack_int n,
-                                float* a, lapack_int lda, lapack_int* ipiv,
-                                float* work, lapack_int lwork );
-lapack_int LAPACKE_dsytrf_work( int matrix_order, char uplo, lapack_int n,
-                                double* a, lapack_int lda, lapack_int* ipiv,
-                                double* work, lapack_int lwork );
-lapack_int LAPACKE_csytrf_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_int* ipiv, lapack_complex_float* work,
-                                lapack_int lwork );
-lapack_int LAPACKE_zsytrf_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_int* ipiv, lapack_complex_double* work,
-                                lapack_int lwork );
+lapack_int LAPACKE_ssterf_work(lapack_int n, float* d, float* e);
+lapack_int LAPACKE_dsterf_work(lapack_int n, double* d, double* e);
 
-lapack_int LAPACKE_ssytri_work( int matrix_order, char uplo, lapack_int n,
-                                float* a, lapack_int lda,
-                                const lapack_int* ipiv, float* work );
-lapack_int LAPACKE_dsytri_work( int matrix_order, char uplo, lapack_int n,
-                                double* a, lapack_int lda,
-                                const lapack_int* ipiv, double* work );
-lapack_int LAPACKE_csytri_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                const lapack_int* ipiv,
-                                lapack_complex_float* work );
-lapack_int LAPACKE_zsytri_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                const lapack_int* ipiv,
-                                lapack_complex_double* work );
+lapack_int LAPACKE_sstev_work(int matrix_order, char jobz, lapack_int n, float* d, float* e, float* z, lapack_int ldz,
+                              float* work);
+lapack_int LAPACKE_dstev_work(int matrix_order, char jobz, lapack_int n, double* d, double* e, double* z,
+                              lapack_int ldz, double* work);
 
-lapack_int LAPACKE_ssytrs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const float* a, lapack_int lda,
-                                const lapack_int* ipiv, float* b,
-                                lapack_int ldb );
-lapack_int LAPACKE_dsytrs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const double* a,
-                                lapack_int lda, const lapack_int* ipiv,
-                                double* b, lapack_int ldb );
-lapack_int LAPACKE_csytrs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const lapack_complex_float* a,
-                                lapack_int lda, const lapack_int* ipiv,
-                                lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_zsytrs_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_int nrhs, const lapack_complex_double* a,
-                                lapack_int lda, const lapack_int* ipiv,
-                                lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_sstevd_work(int matrix_order, char jobz, lapack_int n, float* d, float* e, float* z, lapack_int ldz,
+                               float* work, lapack_int lwork, lapack_int* iwork, lapack_int liwork);
+lapack_int LAPACKE_dstevd_work(int matrix_order, char jobz, lapack_int n, double* d, double* e, double* z,
+                               lapack_int ldz, double* work, lapack_int lwork, lapack_int* iwork, lapack_int liwork);
 
-lapack_int LAPACKE_stbcon_work( int matrix_order, char norm, char uplo,
-                                char diag, lapack_int n, lapack_int kd,
-                                const float* ab, lapack_int ldab, float* rcond,
-                                float* work, lapack_int* iwork );
-lapack_int LAPACKE_dtbcon_work( int matrix_order, char norm, char uplo,
-                                char diag, lapack_int n, lapack_int kd,
-                                const double* ab, lapack_int ldab,
-                                double* rcond, double* work,
-                                lapack_int* iwork );
-lapack_int LAPACKE_ctbcon_work( int matrix_order, char norm, char uplo,
-                                char diag, lapack_int n, lapack_int kd,
-                                const lapack_complex_float* ab, lapack_int ldab,
-                                float* rcond, lapack_complex_float* work,
-                                float* rwork );
-lapack_int LAPACKE_ztbcon_work( int matrix_order, char norm, char uplo,
-                                char diag, lapack_int n, lapack_int kd,
-                                const lapack_complex_double* ab,
-                                lapack_int ldab, double* rcond,
-                                lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_sstevr_work(int matrix_order, char jobz, char range, lapack_int n, float* d, float* e, float vl,
+                               float vu, lapack_int il, lapack_int iu, float abstol, lapack_int* m, float* w, float* z,
+                               lapack_int ldz, lapack_int* isuppz, float* work, lapack_int lwork, lapack_int* iwork,
+                               lapack_int liwork);
+lapack_int LAPACKE_dstevr_work(int matrix_order, char jobz, char range, lapack_int n, double* d, double* e, double vl,
+                               double vu, lapack_int il, lapack_int iu, double abstol, lapack_int* m, double* w,
+                               double* z, lapack_int ldz, lapack_int* isuppz, double* work, lapack_int lwork,
+                               lapack_int* iwork, lapack_int liwork);
 
-lapack_int LAPACKE_stbrfs_work( int matrix_order, char uplo, char trans,
-                                char diag, lapack_int n, lapack_int kd,
-                                lapack_int nrhs, const float* ab,
-                                lapack_int ldab, const float* b, lapack_int ldb,
-                                const float* x, lapack_int ldx, float* ferr,
-                                float* berr, float* work, lapack_int* iwork );
-lapack_int LAPACKE_dtbrfs_work( int matrix_order, char uplo, char trans,
-                                char diag, lapack_int n, lapack_int kd,
-                                lapack_int nrhs, const double* ab,
-                                lapack_int ldab, const double* b,
-                                lapack_int ldb, const double* x, lapack_int ldx,
-                                double* ferr, double* berr, double* work,
-                                lapack_int* iwork );
-lapack_int LAPACKE_ctbrfs_work( int matrix_order, char uplo, char trans,
-                                char diag, lapack_int n, lapack_int kd,
-                                lapack_int nrhs, const lapack_complex_float* ab,
-                                lapack_int ldab, const lapack_complex_float* b,
-                                lapack_int ldb, const lapack_complex_float* x,
-                                lapack_int ldx, float* ferr, float* berr,
-                                lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_ztbrfs_work( int matrix_order, char uplo, char trans,
-                                char diag, lapack_int n, lapack_int kd,
-                                lapack_int nrhs,
-                                const lapack_complex_double* ab,
-                                lapack_int ldab, const lapack_complex_double* b,
-                                lapack_int ldb, const lapack_complex_double* x,
-                                lapack_int ldx, double* ferr, double* berr,
-                                lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_sstevx_work(int matrix_order, char jobz, char range, lapack_int n, float* d, float* e, float vl,
+                               float vu, lapack_int il, lapack_int iu, float abstol, lapack_int* m, float* w, float* z,
+                               lapack_int ldz, float* work, lapack_int* iwork, lapack_int* ifail);
+lapack_int LAPACKE_dstevx_work(int matrix_order, char jobz, char range, lapack_int n, double* d, double* e, double vl,
+                               double vu, lapack_int il, lapack_int iu, double abstol, lapack_int* m, double* w,
+                               double* z, lapack_int ldz, double* work, lapack_int* iwork, lapack_int* ifail);
 
-lapack_int LAPACKE_stbtrs_work( int matrix_order, char uplo, char trans,
-                                char diag, lapack_int n, lapack_int kd,
-                                lapack_int nrhs, const float* ab,
-                                lapack_int ldab, float* b, lapack_int ldb );
-lapack_int LAPACKE_dtbtrs_work( int matrix_order, char uplo, char trans,
-                                char diag, lapack_int n, lapack_int kd,
-                                lapack_int nrhs, const double* ab,
-                                lapack_int ldab, double* b, lapack_int ldb );
-lapack_int LAPACKE_ctbtrs_work( int matrix_order, char uplo, char trans,
-                                char diag, lapack_int n, lapack_int kd,
-                                lapack_int nrhs, const lapack_complex_float* ab,
-                                lapack_int ldab, lapack_complex_float* b,
-                                lapack_int ldb );
-lapack_int LAPACKE_ztbtrs_work( int matrix_order, char uplo, char trans,
-                                char diag, lapack_int n, lapack_int kd,
-                                lapack_int nrhs,
-                                const lapack_complex_double* ab,
-                                lapack_int ldab, lapack_complex_double* b,
-                                lapack_int ldb );
+lapack_int LAPACKE_ssycon_work(int matrix_order, char uplo, lapack_int n, const float* a, lapack_int lda,
+                               const lapack_int* ipiv, float anorm, float* rcond, float* work, lapack_int* iwork);
+lapack_int LAPACKE_dsycon_work(int matrix_order, char uplo, lapack_int n, const double* a, lapack_int lda,
+                               const lapack_int* ipiv, double anorm, double* rcond, double* work, lapack_int* iwork);
+lapack_int LAPACKE_csycon_work(int matrix_order, char uplo, lapack_int n, const lapack_complex_float* a, lapack_int lda,
+                               const lapack_int* ipiv, float anorm, float* rcond, lapack_complex_float* work);
+lapack_int LAPACKE_zsycon_work(int matrix_order, char uplo, lapack_int n, const lapack_complex_double* a,
+                               lapack_int lda, const lapack_int* ipiv, double anorm, double* rcond,
+                               lapack_complex_double* work);
 
-lapack_int LAPACKE_stfsm_work( int matrix_order, char transr, char side,
-                               char uplo, char trans, char diag, lapack_int m,
-                               lapack_int n, float alpha, const float* a,
-                               float* b, lapack_int ldb );
-lapack_int LAPACKE_dtfsm_work( int matrix_order, char transr, char side,
-                               char uplo, char trans, char diag, lapack_int m,
-                               lapack_int n, double alpha, const double* a,
-                               double* b, lapack_int ldb );
-lapack_int LAPACKE_ctfsm_work( int matrix_order, char transr, char side,
-                               char uplo, char trans, char diag, lapack_int m,
-                               lapack_int n, lapack_complex_float alpha,
-                               const lapack_complex_float* a,
-                               lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_ztfsm_work( int matrix_order, char transr, char side,
-                               char uplo, char trans, char diag, lapack_int m,
-                               lapack_int n, lapack_complex_double alpha,
-                               const lapack_complex_double* a,
-                               lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_ssyequb_work(int matrix_order, char uplo, lapack_int n, const float* a, lapack_int lda, float* s,
+                                float* scond, float* amax, float* work);
+lapack_int LAPACKE_dsyequb_work(int matrix_order, char uplo, lapack_int n, const double* a, lapack_int lda, double* s,
+                                double* scond, double* amax, double* work);
+lapack_int LAPACKE_csyequb_work(int matrix_order, char uplo, lapack_int n, const lapack_complex_float* a,
+                                lapack_int lda, float* s, float* scond, float* amax, lapack_complex_float* work);
+lapack_int LAPACKE_zsyequb_work(int matrix_order, char uplo, lapack_int n, const lapack_complex_double* a,
+                                lapack_int lda, double* s, double* scond, double* amax, lapack_complex_double* work);
 
-lapack_int LAPACKE_stftri_work( int matrix_order, char transr, char uplo,
-                                char diag, lapack_int n, float* a );
-lapack_int LAPACKE_dtftri_work( int matrix_order, char transr, char uplo,
-                                char diag, lapack_int n, double* a );
-lapack_int LAPACKE_ctftri_work( int matrix_order, char transr, char uplo,
-                                char diag, lapack_int n,
-                                lapack_complex_float* a );
-lapack_int LAPACKE_ztftri_work( int matrix_order, char transr, char uplo,
-                                char diag, lapack_int n,
-                                lapack_complex_double* a );
+lapack_int LAPACKE_ssyev_work(int matrix_order, char jobz, char uplo, lapack_int n, float* a, lapack_int lda, float* w,
+                              float* work, lapack_int lwork);
+lapack_int LAPACKE_dsyev_work(int matrix_order, char jobz, char uplo, lapack_int n, double* a, lapack_int lda,
+                              double* w, double* work, lapack_int lwork);
 
-lapack_int LAPACKE_stfttp_work( int matrix_order, char transr, char uplo,
-                                lapack_int n, const float* arf, float* ap );
-lapack_int LAPACKE_dtfttp_work( int matrix_order, char transr, char uplo,
-                                lapack_int n, const double* arf, double* ap );
-lapack_int LAPACKE_ctfttp_work( int matrix_order, char transr, char uplo,
-                                lapack_int n, const lapack_complex_float* arf,
-                                lapack_complex_float* ap );
-lapack_int LAPACKE_ztfttp_work( int matrix_order, char transr, char uplo,
-                                lapack_int n, const lapack_complex_double* arf,
-                                lapack_complex_double* ap );
+lapack_int LAPACKE_ssyevd_work(int matrix_order, char jobz, char uplo, lapack_int n, float* a, lapack_int lda, float* w,
+                               float* work, lapack_int lwork, lapack_int* iwork, lapack_int liwork);
+lapack_int LAPACKE_dsyevd_work(int matrix_order, char jobz, char uplo, lapack_int n, double* a, lapack_int lda,
+                               double* w, double* work, lapack_int lwork, lapack_int* iwork, lapack_int liwork);
 
-lapack_int LAPACKE_stfttr_work( int matrix_order, char transr, char uplo,
-                                lapack_int n, const float* arf, float* a,
-                                lapack_int lda );
-lapack_int LAPACKE_dtfttr_work( int matrix_order, char transr, char uplo,
-                                lapack_int n, const double* arf, double* a,
-                                lapack_int lda );
-lapack_int LAPACKE_ctfttr_work( int matrix_order, char transr, char uplo,
-                                lapack_int n, const lapack_complex_float* arf,
-                                lapack_complex_float* a, lapack_int lda );
-lapack_int LAPACKE_ztfttr_work( int matrix_order, char transr, char uplo,
-                                lapack_int n, const lapack_complex_double* arf,
-                                lapack_complex_double* a, lapack_int lda );
+lapack_int LAPACKE_ssyevr_work(int matrix_order, char jobz, char range, char uplo, lapack_int n, float* a,
+                               lapack_int lda, float vl, float vu, lapack_int il, lapack_int iu, float abstol,
+                               lapack_int* m, float* w, float* z, lapack_int ldz, lapack_int* isuppz, float* work,
+                               lapack_int lwork, lapack_int* iwork, lapack_int liwork);
+lapack_int LAPACKE_dsyevr_work(int matrix_order, char jobz, char range, char uplo, lapack_int n, double* a,
+                               lapack_int lda, double vl, double vu, lapack_int il, lapack_int iu, double abstol,
+                               lapack_int* m, double* w, double* z, lapack_int ldz, lapack_int* isuppz, double* work,
+                               lapack_int lwork, lapack_int* iwork, lapack_int liwork);
 
-lapack_int LAPACKE_stgevc_work( int matrix_order, char side, char howmny,
-                                const lapack_logical* select, lapack_int n,
-                                const float* s, lapack_int lds, const float* p,
-                                lapack_int ldp, float* vl, lapack_int ldvl,
-                                float* vr, lapack_int ldvr, lapack_int mm,
-                                lapack_int* m, float* work );
-lapack_int LAPACKE_dtgevc_work( int matrix_order, char side, char howmny,
-                                const lapack_logical* select, lapack_int n,
-                                const double* s, lapack_int lds,
-                                const double* p, lapack_int ldp, double* vl,
-                                lapack_int ldvl, double* vr, lapack_int ldvr,
-                                lapack_int mm, lapack_int* m, double* work );
-lapack_int LAPACKE_ctgevc_work( int matrix_order, char side, char howmny,
-                                const lapack_logical* select, lapack_int n,
-                                const lapack_complex_float* s, lapack_int lds,
-                                const lapack_complex_float* p, lapack_int ldp,
-                                lapack_complex_float* vl, lapack_int ldvl,
-                                lapack_complex_float* vr, lapack_int ldvr,
-                                lapack_int mm, lapack_int* m,
-                                lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_ztgevc_work( int matrix_order, char side, char howmny,
-                                const lapack_logical* select, lapack_int n,
-                                const lapack_complex_double* s, lapack_int lds,
-                                const lapack_complex_double* p, lapack_int ldp,
-                                lapack_complex_double* vl, lapack_int ldvl,
-                                lapack_complex_double* vr, lapack_int ldvr,
-                                lapack_int mm, lapack_int* m,
-                                lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_ssyevx_work(int matrix_order, char jobz, char range, char uplo, lapack_int n, float* a,
+                               lapack_int lda, float vl, float vu, lapack_int il, lapack_int iu, float abstol,
+                               lapack_int* m, float* w, float* z, lapack_int ldz, float* work, lapack_int lwork,
+                               lapack_int* iwork, lapack_int* ifail);
+lapack_int LAPACKE_dsyevx_work(int matrix_order, char jobz, char range, char uplo, lapack_int n, double* a,
+                               lapack_int lda, double vl, double vu, lapack_int il, lapack_int iu, double abstol,
+                               lapack_int* m, double* w, double* z, lapack_int ldz, double* work, lapack_int lwork,
+                               lapack_int* iwork, lapack_int* ifail);
 
-lapack_int LAPACKE_stgexc_work( int matrix_order, lapack_logical wantq,
-                                lapack_logical wantz, lapack_int n, float* a,
-                                lapack_int lda, float* b, lapack_int ldb,
-                                float* q, lapack_int ldq, float* z,
-                                lapack_int ldz, lapack_int* ifst,
-                                lapack_int* ilst, float* work,
-                                lapack_int lwork );
-lapack_int LAPACKE_dtgexc_work( int matrix_order, lapack_logical wantq,
-                                lapack_logical wantz, lapack_int n, double* a,
-                                lapack_int lda, double* b, lapack_int ldb,
-                                double* q, lapack_int ldq, double* z,
-                                lapack_int ldz, lapack_int* ifst,
-                                lapack_int* ilst, double* work,
-                                lapack_int lwork );
-lapack_int LAPACKE_ctgexc_work( int matrix_order, lapack_logical wantq,
-                                lapack_logical wantz, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_complex_float* b, lapack_int ldb,
-                                lapack_complex_float* q, lapack_int ldq,
-                                lapack_complex_float* z, lapack_int ldz,
-                                lapack_int ifst, lapack_int ilst );
-lapack_int LAPACKE_ztgexc_work( int matrix_order, lapack_logical wantq,
-                                lapack_logical wantz, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_complex_double* b, lapack_int ldb,
-                                lapack_complex_double* q, lapack_int ldq,
-                                lapack_complex_double* z, lapack_int ldz,
-                                lapack_int ifst, lapack_int ilst );
+lapack_int LAPACKE_ssygst_work(int matrix_order, lapack_int itype, char uplo, lapack_int n, float* a, lapack_int lda,
+                               const float* b, lapack_int ldb);
+lapack_int LAPACKE_dsygst_work(int matrix_order, lapack_int itype, char uplo, lapack_int n, double* a, lapack_int lda,
+                               const double* b, lapack_int ldb);
 
-lapack_int LAPACKE_stgsen_work( int matrix_order, lapack_int ijob,
-                                lapack_logical wantq, lapack_logical wantz,
-                                const lapack_logical* select, lapack_int n,
-                                float* a, lapack_int lda, float* b,
-                                lapack_int ldb, float* alphar, float* alphai,
-                                float* beta, float* q, lapack_int ldq, float* z,
-                                lapack_int ldz, lapack_int* m, float* pl,
-                                float* pr, float* dif, float* work,
-                                lapack_int lwork, lapack_int* iwork,
-                                lapack_int liwork );
-lapack_int LAPACKE_dtgsen_work( int matrix_order, lapack_int ijob,
-                                lapack_logical wantq, lapack_logical wantz,
-                                const lapack_logical* select, lapack_int n,
-                                double* a, lapack_int lda, double* b,
-                                lapack_int ldb, double* alphar, double* alphai,
-                                double* beta, double* q, lapack_int ldq,
-                                double* z, lapack_int ldz, lapack_int* m,
-                                double* pl, double* pr, double* dif,
-                                double* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int liwork );
-lapack_int LAPACKE_ctgsen_work( int matrix_order, lapack_int ijob,
-                                lapack_logical wantq, lapack_logical wantz,
-                                const lapack_logical* select, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_complex_float* b, lapack_int ldb,
-                                lapack_complex_float* alpha,
-                                lapack_complex_float* beta,
-                                lapack_complex_float* q, lapack_int ldq,
-                                lapack_complex_float* z, lapack_int ldz,
-                                lapack_int* m, float* pl, float* pr, float* dif,
-                                lapack_complex_float* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int liwork );
-lapack_int LAPACKE_ztgsen_work( int matrix_order, lapack_int ijob,
-                                lapack_logical wantq, lapack_logical wantz,
-                                const lapack_logical* select, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_complex_double* b, lapack_int ldb,
-                                lapack_complex_double* alpha,
-                                lapack_complex_double* beta,
-                                lapack_complex_double* q, lapack_int ldq,
-                                lapack_complex_double* z, lapack_int ldz,
-                                lapack_int* m, double* pl, double* pr,
-                                double* dif, lapack_complex_double* work,
-                                lapack_int lwork, lapack_int* iwork,
-                                lapack_int liwork );
+lapack_int LAPACKE_ssygv_work(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n, float* a,
+                              lapack_int lda, float* b, lapack_int ldb, float* w, float* work, lapack_int lwork);
+lapack_int LAPACKE_dsygv_work(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n, double* a,
+                              lapack_int lda, double* b, lapack_int ldb, double* w, double* work, lapack_int lwork);
 
-lapack_int LAPACKE_stgsja_work( int matrix_order, char jobu, char jobv,
-                                char jobq, lapack_int m, lapack_int p,
-                                lapack_int n, lapack_int k, lapack_int l,
-                                float* a, lapack_int lda, float* b,
-                                lapack_int ldb, float tola, float tolb,
-                                float* alpha, float* beta, float* u,
-                                lapack_int ldu, float* v, lapack_int ldv,
-                                float* q, lapack_int ldq, float* work,
-                                lapack_int* ncycle );
-lapack_int LAPACKE_dtgsja_work( int matrix_order, char jobu, char jobv,
-                                char jobq, lapack_int m, lapack_int p,
-                                lapack_int n, lapack_int k, lapack_int l,
-                                double* a, lapack_int lda, double* b,
-                                lapack_int ldb, double tola, double tolb,
-                                double* alpha, double* beta, double* u,
-                                lapack_int ldu, double* v, lapack_int ldv,
-                                double* q, lapack_int ldq, double* work,
-                                lapack_int* ncycle );
-lapack_int LAPACKE_ctgsja_work( int matrix_order, char jobu, char jobv,
-                                char jobq, lapack_int m, lapack_int p,
-                                lapack_int n, lapack_int k, lapack_int l,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_complex_float* b, lapack_int ldb,
-                                float tola, float tolb, float* alpha,
-                                float* beta, lapack_complex_float* u,
-                                lapack_int ldu, lapack_complex_float* v,
-                                lapack_int ldv, lapack_complex_float* q,
-                                lapack_int ldq, lapack_complex_float* work,
-                                lapack_int* ncycle );
-lapack_int LAPACKE_ztgsja_work( int matrix_order, char jobu, char jobv,
-                                char jobq, lapack_int m, lapack_int p,
-                                lapack_int n, lapack_int k, lapack_int l,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_complex_double* b, lapack_int ldb,
-                                double tola, double tolb, double* alpha,
-                                double* beta, lapack_complex_double* u,
-                                lapack_int ldu, lapack_complex_double* v,
-                                lapack_int ldv, lapack_complex_double* q,
-                                lapack_int ldq, lapack_complex_double* work,
-                                lapack_int* ncycle );
+lapack_int LAPACKE_ssygvd_work(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n, float* a,
+                               lapack_int lda, float* b, lapack_int ldb, float* w, float* work, lapack_int lwork,
+                               lapack_int* iwork, lapack_int liwork);
+lapack_int LAPACKE_dsygvd_work(int matrix_order, lapack_int itype, char jobz, char uplo, lapack_int n, double* a,
+                               lapack_int lda, double* b, lapack_int ldb, double* w, double* work, lapack_int lwork,
+                               lapack_int* iwork, lapack_int liwork);
 
-lapack_int LAPACKE_stgsna_work( int matrix_order, char job, char howmny,
-                                const lapack_logical* select, lapack_int n,
-                                const float* a, lapack_int lda, const float* b,
-                                lapack_int ldb, const float* vl,
-                                lapack_int ldvl, const float* vr,
-                                lapack_int ldvr, float* s, float* dif,
-                                lapack_int mm, lapack_int* m, float* work,
-                                lapack_int lwork, lapack_int* iwork );
-lapack_int LAPACKE_dtgsna_work( int matrix_order, char job, char howmny,
-                                const lapack_logical* select, lapack_int n,
-                                const double* a, lapack_int lda,
-                                const double* b, lapack_int ldb,
-                                const double* vl, lapack_int ldvl,
-                                const double* vr, lapack_int ldvr, double* s,
-                                double* dif, lapack_int mm, lapack_int* m,
-                                double* work, lapack_int lwork,
-                                lapack_int* iwork );
-lapack_int LAPACKE_ctgsna_work( int matrix_order, char job, char howmny,
-                                const lapack_logical* select, lapack_int n,
-                                const lapack_complex_float* a, lapack_int lda,
-                                const lapack_complex_float* b, lapack_int ldb,
-                                const lapack_complex_float* vl, lapack_int ldvl,
-                                const lapack_complex_float* vr, lapack_int ldvr,
-                                float* s, float* dif, lapack_int mm,
-                                lapack_int* m, lapack_complex_float* work,
-                                lapack_int lwork, lapack_int* iwork );
-lapack_int LAPACKE_ztgsna_work( int matrix_order, char job, char howmny,
-                                const lapack_logical* select, lapack_int n,
-                                const lapack_complex_double* a, lapack_int lda,
-                                const lapack_complex_double* b, lapack_int ldb,
-                                const lapack_complex_double* vl,
-                                lapack_int ldvl,
-                                const lapack_complex_double* vr,
-                                lapack_int ldvr, double* s, double* dif,
-                                lapack_int mm, lapack_int* m,
-                                lapack_complex_double* work, lapack_int lwork,
-                                lapack_int* iwork );
+lapack_int LAPACKE_ssygvx_work(int matrix_order, lapack_int itype, char jobz, char range, char uplo, lapack_int n,
+                               float* a, lapack_int lda, float* b, lapack_int ldb, float vl, float vu, lapack_int il,
+                               lapack_int iu, float abstol, lapack_int* m, float* w, float* z, lapack_int ldz,
+                               float* work, lapack_int lwork, lapack_int* iwork, lapack_int* ifail);
+lapack_int LAPACKE_dsygvx_work(int matrix_order, lapack_int itype, char jobz, char range, char uplo, lapack_int n,
+                               double* a, lapack_int lda, double* b, lapack_int ldb, double vl, double vu,
+                               lapack_int il, lapack_int iu, double abstol, lapack_int* m, double* w, double* z,
+                               lapack_int ldz, double* work, lapack_int lwork, lapack_int* iwork, lapack_int* ifail);
 
-lapack_int LAPACKE_stgsyl_work( int matrix_order, char trans, lapack_int ijob,
-                                lapack_int m, lapack_int n, const float* a,
-                                lapack_int lda, const float* b, lapack_int ldb,
-                                float* c, lapack_int ldc, const float* d,
-                                lapack_int ldd, const float* e, lapack_int lde,
-                                float* f, lapack_int ldf, float* scale,
-                                float* dif, float* work, lapack_int lwork,
-                                lapack_int* iwork );
-lapack_int LAPACKE_dtgsyl_work( int matrix_order, char trans, lapack_int ijob,
-                                lapack_int m, lapack_int n, const double* a,
-                                lapack_int lda, const double* b, lapack_int ldb,
-                                double* c, lapack_int ldc, const double* d,
-                                lapack_int ldd, const double* e, lapack_int lde,
-                                double* f, lapack_int ldf, double* scale,
-                                double* dif, double* work, lapack_int lwork,
-                                lapack_int* iwork );
-lapack_int LAPACKE_ctgsyl_work( int matrix_order, char trans, lapack_int ijob,
-                                lapack_int m, lapack_int n,
-                                const lapack_complex_float* a, lapack_int lda,
-                                const lapack_complex_float* b, lapack_int ldb,
-                                lapack_complex_float* c, lapack_int ldc,
-                                const lapack_complex_float* d, lapack_int ldd,
-                                const lapack_complex_float* e, lapack_int lde,
-                                lapack_complex_float* f, lapack_int ldf,
-                                float* scale, float* dif,
-                                lapack_complex_float* work, lapack_int lwork,
-                                lapack_int* iwork );
-lapack_int LAPACKE_ztgsyl_work( int matrix_order, char trans, lapack_int ijob,
-                                lapack_int m, lapack_int n,
-                                const lapack_complex_double* a, lapack_int lda,
-                                const lapack_complex_double* b, lapack_int ldb,
-                                lapack_complex_double* c, lapack_int ldc,
-                                const lapack_complex_double* d, lapack_int ldd,
-                                const lapack_complex_double* e, lapack_int lde,
-                                lapack_complex_double* f, lapack_int ldf,
-                                double* scale, double* dif,
-                                lapack_complex_double* work, lapack_int lwork,
-                                lapack_int* iwork );
+lapack_int LAPACKE_ssyrfs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const float* a,
+                               lapack_int lda, const float* af, lapack_int ldaf, const lapack_int* ipiv, const float* b,
+                               lapack_int ldb, float* x, lapack_int ldx, float* ferr, float* berr, float* work,
+                               lapack_int* iwork);
+lapack_int LAPACKE_dsyrfs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const double* a,
+                               lapack_int lda, const double* af, lapack_int ldaf, const lapack_int* ipiv,
+                               const double* b, lapack_int ldb, double* x, lapack_int ldx, double* ferr, double* berr,
+                               double* work, lapack_int* iwork);
+lapack_int LAPACKE_csyrfs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* af,
+                               lapack_int ldaf, const lapack_int* ipiv, const lapack_complex_float* b, lapack_int ldb,
+                               lapack_complex_float* x, lapack_int ldx, float* ferr, float* berr,
+                               lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zsyrfs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* af,
+                               lapack_int ldaf, const lapack_int* ipiv, const lapack_complex_double* b, lapack_int ldb,
+                               lapack_complex_double* x, lapack_int ldx, double* ferr, double* berr,
+                               lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_stpcon_work( int matrix_order, char norm, char uplo,
-                                char diag, lapack_int n, const float* ap,
-                                float* rcond, float* work, lapack_int* iwork );
-lapack_int LAPACKE_dtpcon_work( int matrix_order, char norm, char uplo,
-                                char diag, lapack_int n, const double* ap,
-                                double* rcond, double* work,
-                                lapack_int* iwork );
-lapack_int LAPACKE_ctpcon_work( int matrix_order, char norm, char uplo,
-                                char diag, lapack_int n,
-                                const lapack_complex_float* ap, float* rcond,
-                                lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_ztpcon_work( int matrix_order, char norm, char uplo,
-                                char diag, lapack_int n,
-                                const lapack_complex_double* ap, double* rcond,
-                                lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_ssyrfsx_work(int matrix_order, char uplo, char equed, lapack_int n, lapack_int nrhs, const float* a,
+                                lapack_int lda, const float* af, lapack_int ldaf, const lapack_int* ipiv,
+                                const float* s, const float* b, lapack_int ldb, float* x, lapack_int ldx, float* rcond,
+                                float* berr, lapack_int n_err_bnds, float* err_bnds_norm, float* err_bnds_comp,
+                                lapack_int nparams, float* params, float* work, lapack_int* iwork);
+lapack_int LAPACKE_dsyrfsx_work(int matrix_order, char uplo, char equed, lapack_int n, lapack_int nrhs, const double* a,
+                                lapack_int lda, const double* af, lapack_int ldaf, const lapack_int* ipiv,
+                                const double* s, const double* b, lapack_int ldb, double* x, lapack_int ldx,
+                                double* rcond, double* berr, lapack_int n_err_bnds, double* err_bnds_norm,
+                                double* err_bnds_comp, lapack_int nparams, double* params, double* work,
+                                lapack_int* iwork);
+lapack_int LAPACKE_csyrfsx_work(int matrix_order, char uplo, char equed, lapack_int n, lapack_int nrhs,
+                                const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* af,
+                                lapack_int ldaf, const lapack_int* ipiv, const float* s, const lapack_complex_float* b,
+                                lapack_int ldb, lapack_complex_float* x, lapack_int ldx, float* rcond, float* berr,
+                                lapack_int n_err_bnds, float* err_bnds_norm, float* err_bnds_comp, lapack_int nparams,
+                                float* params, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zsyrfsx_work(int matrix_order, char uplo, char equed, lapack_int n, lapack_int nrhs,
+                                const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* af,
+                                lapack_int ldaf, const lapack_int* ipiv, const double* s,
+                                const lapack_complex_double* b, lapack_int ldb, lapack_complex_double* x,
+                                lapack_int ldx, double* rcond, double* berr, lapack_int n_err_bnds,
+                                double* err_bnds_norm, double* err_bnds_comp, lapack_int nparams, double* params,
+                                lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_stprfs_work( int matrix_order, char uplo, char trans,
-                                char diag, lapack_int n, lapack_int nrhs,
-                                const float* ap, const float* b, lapack_int ldb,
-                                const float* x, lapack_int ldx, float* ferr,
-                                float* berr, float* work, lapack_int* iwork );
-lapack_int LAPACKE_dtprfs_work( int matrix_order, char uplo, char trans,
-                                char diag, lapack_int n, lapack_int nrhs,
-                                const double* ap, const double* b,
-                                lapack_int ldb, const double* x, lapack_int ldx,
-                                double* ferr, double* berr, double* work,
-                                lapack_int* iwork );
-lapack_int LAPACKE_ctprfs_work( int matrix_order, char uplo, char trans,
-                                char diag, lapack_int n, lapack_int nrhs,
-                                const lapack_complex_float* ap,
-                                const lapack_complex_float* b, lapack_int ldb,
-                                const lapack_complex_float* x, lapack_int ldx,
-                                float* ferr, float* berr,
-                                lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_ztprfs_work( int matrix_order, char uplo, char trans,
-                                char diag, lapack_int n, lapack_int nrhs,
-                                const lapack_complex_double* ap,
-                                const lapack_complex_double* b, lapack_int ldb,
-                                const lapack_complex_double* x, lapack_int ldx,
-                                double* ferr, double* berr,
-                                lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_ssysv_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, float* a, lapack_int lda,
+                              lapack_int* ipiv, float* b, lapack_int ldb, float* work, lapack_int lwork);
+lapack_int LAPACKE_dsysv_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, double* a, lapack_int lda,
+                              lapack_int* ipiv, double* b, lapack_int ldb, double* work, lapack_int lwork);
+lapack_int LAPACKE_csysv_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_float* a,
+                              lapack_int lda, lapack_int* ipiv, lapack_complex_float* b, lapack_int ldb,
+                              lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_zsysv_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double* a,
+                              lapack_int lda, lapack_int* ipiv, lapack_complex_double* b, lapack_int ldb,
+                              lapack_complex_double* work, lapack_int lwork);
 
-lapack_int LAPACKE_stptri_work( int matrix_order, char uplo, char diag,
-                                lapack_int n, float* ap );
-lapack_int LAPACKE_dtptri_work( int matrix_order, char uplo, char diag,
-                                lapack_int n, double* ap );
-lapack_int LAPACKE_ctptri_work( int matrix_order, char uplo, char diag,
-                                lapack_int n, lapack_complex_float* ap );
-lapack_int LAPACKE_ztptri_work( int matrix_order, char uplo, char diag,
-                                lapack_int n, lapack_complex_double* ap );
+lapack_int LAPACKE_ssysvx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs, const float* a,
+                               lapack_int lda, float* af, lapack_int ldaf, lapack_int* ipiv, const float* b,
+                               lapack_int ldb, float* x, lapack_int ldx, float* rcond, float* ferr, float* berr,
+                               float* work, lapack_int lwork, lapack_int* iwork);
+lapack_int LAPACKE_dsysvx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs, const double* a,
+                               lapack_int lda, double* af, lapack_int ldaf, lapack_int* ipiv, const double* b,
+                               lapack_int ldb, double* x, lapack_int ldx, double* rcond, double* ferr, double* berr,
+                               double* work, lapack_int lwork, lapack_int* iwork);
+lapack_int LAPACKE_csysvx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_float* a, lapack_int lda, lapack_complex_float* af, lapack_int ldaf,
+                               lapack_int* ipiv, const lapack_complex_float* b, lapack_int ldb, lapack_complex_float* x,
+                               lapack_int ldx, float* rcond, float* ferr, float* berr, lapack_complex_float* work,
+                               lapack_int lwork, float* rwork);
+lapack_int LAPACKE_zsysvx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_double* a, lapack_int lda, lapack_complex_double* af,
+                               lapack_int ldaf, lapack_int* ipiv, const lapack_complex_double* b, lapack_int ldb,
+                               lapack_complex_double* x, lapack_int ldx, double* rcond, double* ferr, double* berr,
+                               lapack_complex_double* work, lapack_int lwork, double* rwork);
 
-lapack_int LAPACKE_stptrs_work( int matrix_order, char uplo, char trans,
-                                char diag, lapack_int n, lapack_int nrhs,
-                                const float* ap, float* b, lapack_int ldb );
-lapack_int LAPACKE_dtptrs_work( int matrix_order, char uplo, char trans,
-                                char diag, lapack_int n, lapack_int nrhs,
-                                const double* ap, double* b, lapack_int ldb );
-lapack_int LAPACKE_ctptrs_work( int matrix_order, char uplo, char trans,
-                                char diag, lapack_int n, lapack_int nrhs,
-                                const lapack_complex_float* ap,
-                                lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_ztptrs_work( int matrix_order, char uplo, char trans,
-                                char diag, lapack_int n, lapack_int nrhs,
-                                const lapack_complex_double* ap,
-                                lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_ssysvxx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs, float* a,
+                                lapack_int lda, float* af, lapack_int ldaf, lapack_int* ipiv, char* equed, float* s,
+                                float* b, lapack_int ldb, float* x, lapack_int ldx, float* rcond, float* rpvgrw,
+                                float* berr, lapack_int n_err_bnds, float* err_bnds_norm, float* err_bnds_comp,
+                                lapack_int nparams, float* params, float* work, lapack_int* iwork);
+lapack_int LAPACKE_dsysvxx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs, double* a,
+                                lapack_int lda, double* af, lapack_int ldaf, lapack_int* ipiv, char* equed, double* s,
+                                double* b, lapack_int ldb, double* x, lapack_int ldx, double* rcond, double* rpvgrw,
+                                double* berr, lapack_int n_err_bnds, double* err_bnds_norm, double* err_bnds_comp,
+                                lapack_int nparams, double* params, double* work, lapack_int* iwork);
+lapack_int LAPACKE_csysvxx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                                lapack_complex_float* a, lapack_int lda, lapack_complex_float* af, lapack_int ldaf,
+                                lapack_int* ipiv, char* equed, float* s, lapack_complex_float* b, lapack_int ldb,
+                                lapack_complex_float* x, lapack_int ldx, float* rcond, float* rpvgrw, float* berr,
+                                lapack_int n_err_bnds, float* err_bnds_norm, float* err_bnds_comp, lapack_int nparams,
+                                float* params, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_zsysvxx_work(int matrix_order, char fact, char uplo, lapack_int n, lapack_int nrhs,
+                                lapack_complex_double* a, lapack_int lda, lapack_complex_double* af, lapack_int ldaf,
+                                lapack_int* ipiv, char* equed, double* s, lapack_complex_double* b, lapack_int ldb,
+                                lapack_complex_double* x, lapack_int ldx, double* rcond, double* rpvgrw, double* berr,
+                                lapack_int n_err_bnds, double* err_bnds_norm, double* err_bnds_comp, lapack_int nparams,
+                                double* params, lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_stpttf_work( int matrix_order, char transr, char uplo,
-                                lapack_int n, const float* ap, float* arf );
-lapack_int LAPACKE_dtpttf_work( int matrix_order, char transr, char uplo,
-                                lapack_int n, const double* ap, double* arf );
-lapack_int LAPACKE_ctpttf_work( int matrix_order, char transr, char uplo,
-                                lapack_int n, const lapack_complex_float* ap,
-                                lapack_complex_float* arf );
-lapack_int LAPACKE_ztpttf_work( int matrix_order, char transr, char uplo,
-                                lapack_int n, const lapack_complex_double* ap,
-                                lapack_complex_double* arf );
+lapack_int LAPACKE_ssytrd_work(int matrix_order, char uplo, lapack_int n, float* a, lapack_int lda, float* d, float* e,
+                               float* tau, float* work, lapack_int lwork);
+lapack_int LAPACKE_dsytrd_work(int matrix_order, char uplo, lapack_int n, double* a, lapack_int lda, double* d,
+                               double* e, double* tau, double* work, lapack_int lwork);
 
-lapack_int LAPACKE_stpttr_work( int matrix_order, char uplo, lapack_int n,
-                                const float* ap, float* a, lapack_int lda );
-lapack_int LAPACKE_dtpttr_work( int matrix_order, char uplo, lapack_int n,
-                                const double* ap, double* a, lapack_int lda );
-lapack_int LAPACKE_ctpttr_work( int matrix_order, char uplo, lapack_int n,
-                                const lapack_complex_float* ap,
-                                lapack_complex_float* a, lapack_int lda );
-lapack_int LAPACKE_ztpttr_work( int matrix_order, char uplo, lapack_int n,
-                                const lapack_complex_double* ap,
-                                lapack_complex_double* a, lapack_int lda );
+lapack_int LAPACKE_ssytrf_work(int matrix_order, char uplo, lapack_int n, float* a, lapack_int lda, lapack_int* ipiv,
+                               float* work, lapack_int lwork);
+lapack_int LAPACKE_dsytrf_work(int matrix_order, char uplo, lapack_int n, double* a, lapack_int lda, lapack_int* ipiv,
+                               double* work, lapack_int lwork);
+lapack_int LAPACKE_csytrf_work(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                               lapack_int* ipiv, lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_zsytrf_work(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                               lapack_int* ipiv, lapack_complex_double* work, lapack_int lwork);
 
-lapack_int LAPACKE_strcon_work( int matrix_order, char norm, char uplo,
-                                char diag, lapack_int n, const float* a,
-                                lapack_int lda, float* rcond, float* work,
-                                lapack_int* iwork );
-lapack_int LAPACKE_dtrcon_work( int matrix_order, char norm, char uplo,
-                                char diag, lapack_int n, const double* a,
-                                lapack_int lda, double* rcond, double* work,
-                                lapack_int* iwork );
-lapack_int LAPACKE_ctrcon_work( int matrix_order, char norm, char uplo,
-                                char diag, lapack_int n,
-                                const lapack_complex_float* a, lapack_int lda,
-                                float* rcond, lapack_complex_float* work,
-                                float* rwork );
-lapack_int LAPACKE_ztrcon_work( int matrix_order, char norm, char uplo,
-                                char diag, lapack_int n,
-                                const lapack_complex_double* a, lapack_int lda,
-                                double* rcond, lapack_complex_double* work,
-                                double* rwork );
+lapack_int LAPACKE_ssytri_work(int matrix_order, char uplo, lapack_int n, float* a, lapack_int lda,
+                               const lapack_int* ipiv, float* work);
+lapack_int LAPACKE_dsytri_work(int matrix_order, char uplo, lapack_int n, double* a, lapack_int lda,
+                               const lapack_int* ipiv, double* work);
+lapack_int LAPACKE_csytri_work(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                               const lapack_int* ipiv, lapack_complex_float* work);
+lapack_int LAPACKE_zsytri_work(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                               const lapack_int* ipiv, lapack_complex_double* work);
 
-lapack_int LAPACKE_strevc_work( int matrix_order, char side, char howmny,
-                                lapack_logical* select, lapack_int n,
-                                const float* t, lapack_int ldt, float* vl,
-                                lapack_int ldvl, float* vr, lapack_int ldvr,
-                                lapack_int mm, lapack_int* m, float* work );
-lapack_int LAPACKE_dtrevc_work( int matrix_order, char side, char howmny,
-                                lapack_logical* select, lapack_int n,
-                                const double* t, lapack_int ldt, double* vl,
-                                lapack_int ldvl, double* vr, lapack_int ldvr,
-                                lapack_int mm, lapack_int* m, double* work );
-lapack_int LAPACKE_ctrevc_work( int matrix_order, char side, char howmny,
-                                const lapack_logical* select, lapack_int n,
-                                lapack_complex_float* t, lapack_int ldt,
-                                lapack_complex_float* vl, lapack_int ldvl,
-                                lapack_complex_float* vr, lapack_int ldvr,
-                                lapack_int mm, lapack_int* m,
-                                lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_ztrevc_work( int matrix_order, char side, char howmny,
-                                const lapack_logical* select, lapack_int n,
-                                lapack_complex_double* t, lapack_int ldt,
-                                lapack_complex_double* vl, lapack_int ldvl,
-                                lapack_complex_double* vr, lapack_int ldvr,
-                                lapack_int mm, lapack_int* m,
-                                lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_ssytrs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const float* a,
+                               lapack_int lda, const lapack_int* ipiv, float* b, lapack_int ldb);
+lapack_int LAPACKE_dsytrs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const double* a,
+                               lapack_int lda, const lapack_int* ipiv, double* b, lapack_int ldb);
+lapack_int LAPACKE_csytrs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_float* a, lapack_int lda, const lapack_int* ipiv,
+                               lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_zsytrs_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_double* a, lapack_int lda, const lapack_int* ipiv,
+                               lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_strexc_work( int matrix_order, char compq, lapack_int n,
-                                float* t, lapack_int ldt, float* q,
-                                lapack_int ldq, lapack_int* ifst,
-                                lapack_int* ilst, float* work );
-lapack_int LAPACKE_dtrexc_work( int matrix_order, char compq, lapack_int n,
-                                double* t, lapack_int ldt, double* q,
-                                lapack_int ldq, lapack_int* ifst,
-                                lapack_int* ilst, double* work );
-lapack_int LAPACKE_ctrexc_work( int matrix_order, char compq, lapack_int n,
-                                lapack_complex_float* t, lapack_int ldt,
-                                lapack_complex_float* q, lapack_int ldq,
-                                lapack_int ifst, lapack_int ilst );
-lapack_int LAPACKE_ztrexc_work( int matrix_order, char compq, lapack_int n,
-                                lapack_complex_double* t, lapack_int ldt,
-                                lapack_complex_double* q, lapack_int ldq,
-                                lapack_int ifst, lapack_int ilst );
+lapack_int LAPACKE_stbcon_work(int matrix_order, char norm, char uplo, char diag, lapack_int n, lapack_int kd,
+                               const float* ab, lapack_int ldab, float* rcond, float* work, lapack_int* iwork);
+lapack_int LAPACKE_dtbcon_work(int matrix_order, char norm, char uplo, char diag, lapack_int n, lapack_int kd,
+                               const double* ab, lapack_int ldab, double* rcond, double* work, lapack_int* iwork);
+lapack_int LAPACKE_ctbcon_work(int matrix_order, char norm, char uplo, char diag, lapack_int n, lapack_int kd,
+                               const lapack_complex_float* ab, lapack_int ldab, float* rcond,
+                               lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_ztbcon_work(int matrix_order, char norm, char uplo, char diag, lapack_int n, lapack_int kd,
+                               const lapack_complex_double* ab, lapack_int ldab, double* rcond,
+                               lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_strrfs_work( int matrix_order, char uplo, char trans,
-                                char diag, lapack_int n, lapack_int nrhs,
-                                const float* a, lapack_int lda, const float* b,
-                                lapack_int ldb, const float* x, lapack_int ldx,
-                                float* ferr, float* berr, float* work,
-                                lapack_int* iwork );
-lapack_int LAPACKE_dtrrfs_work( int matrix_order, char uplo, char trans,
-                                char diag, lapack_int n, lapack_int nrhs,
-                                const double* a, lapack_int lda,
-                                const double* b, lapack_int ldb,
-                                const double* x, lapack_int ldx, double* ferr,
-                                double* berr, double* work, lapack_int* iwork );
-lapack_int LAPACKE_ctrrfs_work( int matrix_order, char uplo, char trans,
-                                char diag, lapack_int n, lapack_int nrhs,
-                                const lapack_complex_float* a, lapack_int lda,
-                                const lapack_complex_float* b, lapack_int ldb,
-                                const lapack_complex_float* x, lapack_int ldx,
-                                float* ferr, float* berr,
-                                lapack_complex_float* work, float* rwork );
-lapack_int LAPACKE_ztrrfs_work( int matrix_order, char uplo, char trans,
-                                char diag, lapack_int n, lapack_int nrhs,
-                                const lapack_complex_double* a, lapack_int lda,
-                                const lapack_complex_double* b, lapack_int ldb,
-                                const lapack_complex_double* x, lapack_int ldx,
-                                double* ferr, double* berr,
-                                lapack_complex_double* work, double* rwork );
+lapack_int LAPACKE_stbrfs_work(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int kd,
+                               lapack_int nrhs, const float* ab, lapack_int ldab, const float* b, lapack_int ldb,
+                               const float* x, lapack_int ldx, float* ferr, float* berr, float* work,
+                               lapack_int* iwork);
+lapack_int LAPACKE_dtbrfs_work(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int kd,
+                               lapack_int nrhs, const double* ab, lapack_int ldab, const double* b, lapack_int ldb,
+                               const double* x, lapack_int ldx, double* ferr, double* berr, double* work,
+                               lapack_int* iwork);
+lapack_int LAPACKE_ctbrfs_work(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int kd,
+                               lapack_int nrhs, const lapack_complex_float* ab, lapack_int ldab,
+                               const lapack_complex_float* b, lapack_int ldb, const lapack_complex_float* x,
+                               lapack_int ldx, float* ferr, float* berr, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_ztbrfs_work(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int kd,
+                               lapack_int nrhs, const lapack_complex_double* ab, lapack_int ldab,
+                               const lapack_complex_double* b, lapack_int ldb, const lapack_complex_double* x,
+                               lapack_int ldx, double* ferr, double* berr, lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_strsen_work( int matrix_order, char job, char compq,
-                                const lapack_logical* select, lapack_int n,
-                                float* t, lapack_int ldt, float* q,
-                                lapack_int ldq, float* wr, float* wi,
-                                lapack_int* m, float* s, float* sep,
-                                float* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int liwork );
-lapack_int LAPACKE_dtrsen_work( int matrix_order, char job, char compq,
-                                const lapack_logical* select, lapack_int n,
-                                double* t, lapack_int ldt, double* q,
-                                lapack_int ldq, double* wr, double* wi,
-                                lapack_int* m, double* s, double* sep,
-                                double* work, lapack_int lwork,
-                                lapack_int* iwork, lapack_int liwork );
-lapack_int LAPACKE_ctrsen_work( int matrix_order, char job, char compq,
-                                const lapack_logical* select, lapack_int n,
-                                lapack_complex_float* t, lapack_int ldt,
-                                lapack_complex_float* q, lapack_int ldq,
-                                lapack_complex_float* w, lapack_int* m,
-                                float* s, float* sep,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_ztrsen_work( int matrix_order, char job, char compq,
-                                const lapack_logical* select, lapack_int n,
-                                lapack_complex_double* t, lapack_int ldt,
-                                lapack_complex_double* q, lapack_int ldq,
-                                lapack_complex_double* w, lapack_int* m,
-                                double* s, double* sep,
-                                lapack_complex_double* work, lapack_int lwork );
+lapack_int LAPACKE_stbtrs_work(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int kd,
+                               lapack_int nrhs, const float* ab, lapack_int ldab, float* b, lapack_int ldb);
+lapack_int LAPACKE_dtbtrs_work(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int kd,
+                               lapack_int nrhs, const double* ab, lapack_int ldab, double* b, lapack_int ldb);
+lapack_int LAPACKE_ctbtrs_work(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int kd,
+                               lapack_int nrhs, const lapack_complex_float* ab, lapack_int ldab,
+                               lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_ztbtrs_work(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int kd,
+                               lapack_int nrhs, const lapack_complex_double* ab, lapack_int ldab,
+                               lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_strsna_work( int matrix_order, char job, char howmny,
-                                const lapack_logical* select, lapack_int n,
-                                const float* t, lapack_int ldt, const float* vl,
-                                lapack_int ldvl, const float* vr,
-                                lapack_int ldvr, float* s, float* sep,
-                                lapack_int mm, lapack_int* m, float* work,
-                                lapack_int ldwork, lapack_int* iwork );
-lapack_int LAPACKE_dtrsna_work( int matrix_order, char job, char howmny,
-                                const lapack_logical* select, lapack_int n,
-                                const double* t, lapack_int ldt,
-                                const double* vl, lapack_int ldvl,
-                                const double* vr, lapack_int ldvr, double* s,
-                                double* sep, lapack_int mm, lapack_int* m,
-                                double* work, lapack_int ldwork,
-                                lapack_int* iwork );
-lapack_int LAPACKE_ctrsna_work( int matrix_order, char job, char howmny,
-                                const lapack_logical* select, lapack_int n,
-                                const lapack_complex_float* t, lapack_int ldt,
-                                const lapack_complex_float* vl, lapack_int ldvl,
-                                const lapack_complex_float* vr, lapack_int ldvr,
-                                float* s, float* sep, lapack_int mm,
-                                lapack_int* m, lapack_complex_float* work,
-                                lapack_int ldwork, float* rwork );
-lapack_int LAPACKE_ztrsna_work( int matrix_order, char job, char howmny,
-                                const lapack_logical* select, lapack_int n,
-                                const lapack_complex_double* t, lapack_int ldt,
-                                const lapack_complex_double* vl,
-                                lapack_int ldvl,
-                                const lapack_complex_double* vr,
-                                lapack_int ldvr, double* s, double* sep,
-                                lapack_int mm, lapack_int* m,
-                                lapack_complex_double* work, lapack_int ldwork,
-                                double* rwork );
+lapack_int LAPACKE_stfsm_work(int matrix_order, char transr, char side, char uplo, char trans, char diag, lapack_int m,
+                              lapack_int n, float alpha, const float* a, float* b, lapack_int ldb);
+lapack_int LAPACKE_dtfsm_work(int matrix_order, char transr, char side, char uplo, char trans, char diag, lapack_int m,
+                              lapack_int n, double alpha, const double* a, double* b, lapack_int ldb);
+lapack_int LAPACKE_ctfsm_work(int matrix_order, char transr, char side, char uplo, char trans, char diag, lapack_int m,
+                              lapack_int n, lapack_complex_float alpha, const lapack_complex_float* a,
+                              lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_ztfsm_work(int matrix_order, char transr, char side, char uplo, char trans, char diag, lapack_int m,
+                              lapack_int n, lapack_complex_double alpha, const lapack_complex_double* a,
+                              lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_strsyl_work( int matrix_order, char trana, char tranb,
-                                lapack_int isgn, lapack_int m, lapack_int n,
-                                const float* a, lapack_int lda, const float* b,
-                                lapack_int ldb, float* c, lapack_int ldc,
-                                float* scale );
-lapack_int LAPACKE_dtrsyl_work( int matrix_order, char trana, char tranb,
-                                lapack_int isgn, lapack_int m, lapack_int n,
-                                const double* a, lapack_int lda,
-                                const double* b, lapack_int ldb, double* c,
-                                lapack_int ldc, double* scale );
-lapack_int LAPACKE_ctrsyl_work( int matrix_order, char trana, char tranb,
-                                lapack_int isgn, lapack_int m, lapack_int n,
-                                const lapack_complex_float* a, lapack_int lda,
-                                const lapack_complex_float* b, lapack_int ldb,
-                                lapack_complex_float* c, lapack_int ldc,
-                                float* scale );
-lapack_int LAPACKE_ztrsyl_work( int matrix_order, char trana, char tranb,
-                                lapack_int isgn, lapack_int m, lapack_int n,
-                                const lapack_complex_double* a, lapack_int lda,
-                                const lapack_complex_double* b, lapack_int ldb,
-                                lapack_complex_double* c, lapack_int ldc,
-                                double* scale );
+lapack_int LAPACKE_stftri_work(int matrix_order, char transr, char uplo, char diag, lapack_int n, float* a);
+lapack_int LAPACKE_dtftri_work(int matrix_order, char transr, char uplo, char diag, lapack_int n, double* a);
+lapack_int LAPACKE_ctftri_work(int matrix_order, char transr, char uplo, char diag, lapack_int n,
+                               lapack_complex_float* a);
+lapack_int LAPACKE_ztftri_work(int matrix_order, char transr, char uplo, char diag, lapack_int n,
+                               lapack_complex_double* a);
 
-lapack_int LAPACKE_strtri_work( int matrix_order, char uplo, char diag,
-                                lapack_int n, float* a, lapack_int lda );
-lapack_int LAPACKE_dtrtri_work( int matrix_order, char uplo, char diag,
-                                lapack_int n, double* a, lapack_int lda );
-lapack_int LAPACKE_ctrtri_work( int matrix_order, char uplo, char diag,
-                                lapack_int n, lapack_complex_float* a,
-                                lapack_int lda );
-lapack_int LAPACKE_ztrtri_work( int matrix_order, char uplo, char diag,
-                                lapack_int n, lapack_complex_double* a,
-                                lapack_int lda );
+lapack_int LAPACKE_stfttp_work(int matrix_order, char transr, char uplo, lapack_int n, const float* arf, float* ap);
+lapack_int LAPACKE_dtfttp_work(int matrix_order, char transr, char uplo, lapack_int n, const double* arf, double* ap);
+lapack_int LAPACKE_ctfttp_work(int matrix_order, char transr, char uplo, lapack_int n, const lapack_complex_float* arf,
+                               lapack_complex_float* ap);
+lapack_int LAPACKE_ztfttp_work(int matrix_order, char transr, char uplo, lapack_int n, const lapack_complex_double* arf,
+                               lapack_complex_double* ap);
 
-lapack_int LAPACKE_strtrs_work( int matrix_order, char uplo, char trans,
-                                char diag, lapack_int n, lapack_int nrhs,
-                                const float* a, lapack_int lda, float* b,
-                                lapack_int ldb );
-lapack_int LAPACKE_dtrtrs_work( int matrix_order, char uplo, char trans,
-                                char diag, lapack_int n, lapack_int nrhs,
-                                const double* a, lapack_int lda, double* b,
-                                lapack_int ldb );
-lapack_int LAPACKE_ctrtrs_work( int matrix_order, char uplo, char trans,
-                                char diag, lapack_int n, lapack_int nrhs,
-                                const lapack_complex_float* a, lapack_int lda,
-                                lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_ztrtrs_work( int matrix_order, char uplo, char trans,
-                                char diag, lapack_int n, lapack_int nrhs,
-                                const lapack_complex_double* a, lapack_int lda,
-                                lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_stfttr_work(int matrix_order, char transr, char uplo, lapack_int n, const float* arf, float* a,
+                               lapack_int lda);
+lapack_int LAPACKE_dtfttr_work(int matrix_order, char transr, char uplo, lapack_int n, const double* arf, double* a,
+                               lapack_int lda);
+lapack_int LAPACKE_ctfttr_work(int matrix_order, char transr, char uplo, lapack_int n, const lapack_complex_float* arf,
+                               lapack_complex_float* a, lapack_int lda);
+lapack_int LAPACKE_ztfttr_work(int matrix_order, char transr, char uplo, lapack_int n, const lapack_complex_double* arf,
+                               lapack_complex_double* a, lapack_int lda);
 
-lapack_int LAPACKE_strttf_work( int matrix_order, char transr, char uplo,
-                                lapack_int n, const float* a, lapack_int lda,
-                                float* arf );
-lapack_int LAPACKE_dtrttf_work( int matrix_order, char transr, char uplo,
-                                lapack_int n, const double* a, lapack_int lda,
-                                double* arf );
-lapack_int LAPACKE_ctrttf_work( int matrix_order, char transr, char uplo,
-                                lapack_int n, const lapack_complex_float* a,
-                                lapack_int lda, lapack_complex_float* arf );
-lapack_int LAPACKE_ztrttf_work( int matrix_order, char transr, char uplo,
-                                lapack_int n, const lapack_complex_double* a,
-                                lapack_int lda, lapack_complex_double* arf );
+lapack_int LAPACKE_stgevc_work(int matrix_order, char side, char howmny, const lapack_logical* select, lapack_int n,
+                               const float* s, lapack_int lds, const float* p, lapack_int ldp, float* vl,
+                               lapack_int ldvl, float* vr, lapack_int ldvr, lapack_int mm, lapack_int* m, float* work);
+lapack_int LAPACKE_dtgevc_work(int matrix_order, char side, char howmny, const lapack_logical* select, lapack_int n,
+                               const double* s, lapack_int lds, const double* p, lapack_int ldp, double* vl,
+                               lapack_int ldvl, double* vr, lapack_int ldvr, lapack_int mm, lapack_int* m,
+                               double* work);
+lapack_int LAPACKE_ctgevc_work(int matrix_order, char side, char howmny, const lapack_logical* select, lapack_int n,
+                               const lapack_complex_float* s, lapack_int lds, const lapack_complex_float* p,
+                               lapack_int ldp, lapack_complex_float* vl, lapack_int ldvl, lapack_complex_float* vr,
+                               lapack_int ldvr, lapack_int mm, lapack_int* m, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_ztgevc_work(int matrix_order, char side, char howmny, const lapack_logical* select, lapack_int n,
+                               const lapack_complex_double* s, lapack_int lds, const lapack_complex_double* p,
+                               lapack_int ldp, lapack_complex_double* vl, lapack_int ldvl, lapack_complex_double* vr,
+                               lapack_int ldvr, lapack_int mm, lapack_int* m, lapack_complex_double* work,
+                               double* rwork);
 
-lapack_int LAPACKE_strttp_work( int matrix_order, char uplo, lapack_int n,
-                                const float* a, lapack_int lda, float* ap );
-lapack_int LAPACKE_dtrttp_work( int matrix_order, char uplo, lapack_int n,
-                                const double* a, lapack_int lda, double* ap );
-lapack_int LAPACKE_ctrttp_work( int matrix_order, char uplo, lapack_int n,
-                                const lapack_complex_float* a, lapack_int lda,
-                                lapack_complex_float* ap );
-lapack_int LAPACKE_ztrttp_work( int matrix_order, char uplo, lapack_int n,
-                                const lapack_complex_double* a, lapack_int lda,
-                                lapack_complex_double* ap );
+lapack_int LAPACKE_stgexc_work(int matrix_order, lapack_logical wantq, lapack_logical wantz, lapack_int n, float* a,
+                               lapack_int lda, float* b, lapack_int ldb, float* q, lapack_int ldq, float* z,
+                               lapack_int ldz, lapack_int* ifst, lapack_int* ilst, float* work, lapack_int lwork);
+lapack_int LAPACKE_dtgexc_work(int matrix_order, lapack_logical wantq, lapack_logical wantz, lapack_int n, double* a,
+                               lapack_int lda, double* b, lapack_int ldb, double* q, lapack_int ldq, double* z,
+                               lapack_int ldz, lapack_int* ifst, lapack_int* ilst, double* work, lapack_int lwork);
+lapack_int LAPACKE_ctgexc_work(int matrix_order, lapack_logical wantq, lapack_logical wantz, lapack_int n,
+                               lapack_complex_float* a, lapack_int lda, lapack_complex_float* b, lapack_int ldb,
+                               lapack_complex_float* q, lapack_int ldq, lapack_complex_float* z, lapack_int ldz,
+                               lapack_int ifst, lapack_int ilst);
+lapack_int LAPACKE_ztgexc_work(int matrix_order, lapack_logical wantq, lapack_logical wantz, lapack_int n,
+                               lapack_complex_double* a, lapack_int lda, lapack_complex_double* b, lapack_int ldb,
+                               lapack_complex_double* q, lapack_int ldq, lapack_complex_double* z, lapack_int ldz,
+                               lapack_int ifst, lapack_int ilst);
 
-lapack_int LAPACKE_stzrzf_work( int matrix_order, lapack_int m, lapack_int n,
-                                float* a, lapack_int lda, float* tau,
-                                float* work, lapack_int lwork );
-lapack_int LAPACKE_dtzrzf_work( int matrix_order, lapack_int m, lapack_int n,
-                                double* a, lapack_int lda, double* tau,
-                                double* work, lapack_int lwork );
-lapack_int LAPACKE_ctzrzf_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_complex_float* tau,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_ztzrzf_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_complex_double* tau,
-                                lapack_complex_double* work, lapack_int lwork );
+lapack_int LAPACKE_stgsen_work(int matrix_order, lapack_int ijob, lapack_logical wantq, lapack_logical wantz,
+                               const lapack_logical* select, lapack_int n, float* a, lapack_int lda, float* b,
+                               lapack_int ldb, float* alphar, float* alphai, float* beta, float* q, lapack_int ldq,
+                               float* z, lapack_int ldz, lapack_int* m, float* pl, float* pr, float* dif, float* work,
+                               lapack_int lwork, lapack_int* iwork, lapack_int liwork);
+lapack_int LAPACKE_dtgsen_work(int matrix_order, lapack_int ijob, lapack_logical wantq, lapack_logical wantz,
+                               const lapack_logical* select, lapack_int n, double* a, lapack_int lda, double* b,
+                               lapack_int ldb, double* alphar, double* alphai, double* beta, double* q, lapack_int ldq,
+                               double* z, lapack_int ldz, lapack_int* m, double* pl, double* pr, double* dif,
+                               double* work, lapack_int lwork, lapack_int* iwork, lapack_int liwork);
+lapack_int LAPACKE_ctgsen_work(int matrix_order, lapack_int ijob, lapack_logical wantq, lapack_logical wantz,
+                               const lapack_logical* select, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                               lapack_complex_float* b, lapack_int ldb, lapack_complex_float* alpha,
+                               lapack_complex_float* beta, lapack_complex_float* q, lapack_int ldq,
+                               lapack_complex_float* z, lapack_int ldz, lapack_int* m, float* pl, float* pr, float* dif,
+                               lapack_complex_float* work, lapack_int lwork, lapack_int* iwork, lapack_int liwork);
+lapack_int LAPACKE_ztgsen_work(int matrix_order, lapack_int ijob, lapack_logical wantq, lapack_logical wantz,
+                               const lapack_logical* select, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                               lapack_complex_double* b, lapack_int ldb, lapack_complex_double* alpha,
+                               lapack_complex_double* beta, lapack_complex_double* q, lapack_int ldq,
+                               lapack_complex_double* z, lapack_int ldz, lapack_int* m, double* pl, double* pr,
+                               double* dif, lapack_complex_double* work, lapack_int lwork, lapack_int* iwork,
+                               lapack_int liwork);
 
-lapack_int LAPACKE_cungbr_work( int matrix_order, char vect, lapack_int m,
-                                lapack_int n, lapack_int k,
-                                lapack_complex_float* a, lapack_int lda,
-                                const lapack_complex_float* tau,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zungbr_work( int matrix_order, char vect, lapack_int m,
-                                lapack_int n, lapack_int k,
-                                lapack_complex_double* a, lapack_int lda,
-                                const lapack_complex_double* tau,
-                                lapack_complex_double* work, lapack_int lwork );
+lapack_int LAPACKE_stgsja_work(int matrix_order, char jobu, char jobv, char jobq, lapack_int m, lapack_int p,
+                               lapack_int n, lapack_int k, lapack_int l, float* a, lapack_int lda, float* b,
+                               lapack_int ldb, float tola, float tolb, float* alpha, float* beta, float* u,
+                               lapack_int ldu, float* v, lapack_int ldv, float* q, lapack_int ldq, float* work,
+                               lapack_int* ncycle);
+lapack_int LAPACKE_dtgsja_work(int matrix_order, char jobu, char jobv, char jobq, lapack_int m, lapack_int p,
+                               lapack_int n, lapack_int k, lapack_int l, double* a, lapack_int lda, double* b,
+                               lapack_int ldb, double tola, double tolb, double* alpha, double* beta, double* u,
+                               lapack_int ldu, double* v, lapack_int ldv, double* q, lapack_int ldq, double* work,
+                               lapack_int* ncycle);
+lapack_int LAPACKE_ctgsja_work(int matrix_order, char jobu, char jobv, char jobq, lapack_int m, lapack_int p,
+                               lapack_int n, lapack_int k, lapack_int l, lapack_complex_float* a, lapack_int lda,
+                               lapack_complex_float* b, lapack_int ldb, float tola, float tolb, float* alpha,
+                               float* beta, lapack_complex_float* u, lapack_int ldu, lapack_complex_float* v,
+                               lapack_int ldv, lapack_complex_float* q, lapack_int ldq, lapack_complex_float* work,
+                               lapack_int* ncycle);
+lapack_int LAPACKE_ztgsja_work(int matrix_order, char jobu, char jobv, char jobq, lapack_int m, lapack_int p,
+                               lapack_int n, lapack_int k, lapack_int l, lapack_complex_double* a, lapack_int lda,
+                               lapack_complex_double* b, lapack_int ldb, double tola, double tolb, double* alpha,
+                               double* beta, lapack_complex_double* u, lapack_int ldu, lapack_complex_double* v,
+                               lapack_int ldv, lapack_complex_double* q, lapack_int ldq, lapack_complex_double* work,
+                               lapack_int* ncycle);
 
-lapack_int LAPACKE_cunghr_work( int matrix_order, lapack_int n, lapack_int ilo,
-                                lapack_int ihi, lapack_complex_float* a,
-                                lapack_int lda, const lapack_complex_float* tau,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zunghr_work( int matrix_order, lapack_int n, lapack_int ilo,
-                                lapack_int ihi, lapack_complex_double* a,
-                                lapack_int lda,
-                                const lapack_complex_double* tau,
-                                lapack_complex_double* work, lapack_int lwork );
+lapack_int LAPACKE_stgsna_work(int matrix_order, char job, char howmny, const lapack_logical* select, lapack_int n,
+                               const float* a, lapack_int lda, const float* b, lapack_int ldb, const float* vl,
+                               lapack_int ldvl, const float* vr, lapack_int ldvr, float* s, float* dif, lapack_int mm,
+                               lapack_int* m, float* work, lapack_int lwork, lapack_int* iwork);
+lapack_int LAPACKE_dtgsna_work(int matrix_order, char job, char howmny, const lapack_logical* select, lapack_int n,
+                               const double* a, lapack_int lda, const double* b, lapack_int ldb, const double* vl,
+                               lapack_int ldvl, const double* vr, lapack_int ldvr, double* s, double* dif,
+                               lapack_int mm, lapack_int* m, double* work, lapack_int lwork, lapack_int* iwork);
+lapack_int LAPACKE_ctgsna_work(int matrix_order, char job, char howmny, const lapack_logical* select, lapack_int n,
+                               const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* b,
+                               lapack_int ldb, const lapack_complex_float* vl, lapack_int ldvl,
+                               const lapack_complex_float* vr, lapack_int ldvr, float* s, float* dif, lapack_int mm,
+                               lapack_int* m, lapack_complex_float* work, lapack_int lwork, lapack_int* iwork);
+lapack_int LAPACKE_ztgsna_work(int matrix_order, char job, char howmny, const lapack_logical* select, lapack_int n,
+                               const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* b,
+                               lapack_int ldb, const lapack_complex_double* vl, lapack_int ldvl,
+                               const lapack_complex_double* vr, lapack_int ldvr, double* s, double* dif, lapack_int mm,
+                               lapack_int* m, lapack_complex_double* work, lapack_int lwork, lapack_int* iwork);
 
-lapack_int LAPACKE_cunglq_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int k, lapack_complex_float* a,
-                                lapack_int lda, const lapack_complex_float* tau,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zunglq_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int k, lapack_complex_double* a,
-                                lapack_int lda,
-                                const lapack_complex_double* tau,
-                                lapack_complex_double* work, lapack_int lwork );
+lapack_int LAPACKE_stgsyl_work(int matrix_order, char trans, lapack_int ijob, lapack_int m, lapack_int n,
+                               const float* a, lapack_int lda, const float* b, lapack_int ldb, float* c, lapack_int ldc,
+                               const float* d, lapack_int ldd, const float* e, lapack_int lde, float* f, lapack_int ldf,
+                               float* scale, float* dif, float* work, lapack_int lwork, lapack_int* iwork);
+lapack_int LAPACKE_dtgsyl_work(int matrix_order, char trans, lapack_int ijob, lapack_int m, lapack_int n,
+                               const double* a, lapack_int lda, const double* b, lapack_int ldb, double* c,
+                               lapack_int ldc, const double* d, lapack_int ldd, const double* e, lapack_int lde,
+                               double* f, lapack_int ldf, double* scale, double* dif, double* work, lapack_int lwork,
+                               lapack_int* iwork);
+lapack_int LAPACKE_ctgsyl_work(int matrix_order, char trans, lapack_int ijob, lapack_int m, lapack_int n,
+                               const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* b,
+                               lapack_int ldb, lapack_complex_float* c, lapack_int ldc, const lapack_complex_float* d,
+                               lapack_int ldd, const lapack_complex_float* e, lapack_int lde, lapack_complex_float* f,
+                               lapack_int ldf, float* scale, float* dif, lapack_complex_float* work, lapack_int lwork,
+                               lapack_int* iwork);
+lapack_int LAPACKE_ztgsyl_work(int matrix_order, char trans, lapack_int ijob, lapack_int m, lapack_int n,
+                               const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* b,
+                               lapack_int ldb, lapack_complex_double* c, lapack_int ldc, const lapack_complex_double* d,
+                               lapack_int ldd, const lapack_complex_double* e, lapack_int lde, lapack_complex_double* f,
+                               lapack_int ldf, double* scale, double* dif, lapack_complex_double* work,
+                               lapack_int lwork, lapack_int* iwork);
 
-lapack_int LAPACKE_cungql_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int k, lapack_complex_float* a,
-                                lapack_int lda, const lapack_complex_float* tau,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zungql_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int k, lapack_complex_double* a,
-                                lapack_int lda,
-                                const lapack_complex_double* tau,
-                                lapack_complex_double* work, lapack_int lwork );
+lapack_int LAPACKE_stpcon_work(int matrix_order, char norm, char uplo, char diag, lapack_int n, const float* ap,
+                               float* rcond, float* work, lapack_int* iwork);
+lapack_int LAPACKE_dtpcon_work(int matrix_order, char norm, char uplo, char diag, lapack_int n, const double* ap,
+                               double* rcond, double* work, lapack_int* iwork);
+lapack_int LAPACKE_ctpcon_work(int matrix_order, char norm, char uplo, char diag, lapack_int n,
+                               const lapack_complex_float* ap, float* rcond, lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_ztpcon_work(int matrix_order, char norm, char uplo, char diag, lapack_int n,
+                               const lapack_complex_double* ap, double* rcond, lapack_complex_double* work,
+                               double* rwork);
 
-lapack_int LAPACKE_cungqr_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int k, lapack_complex_float* a,
-                                lapack_int lda, const lapack_complex_float* tau,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zungqr_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int k, lapack_complex_double* a,
-                                lapack_int lda,
-                                const lapack_complex_double* tau,
-                                lapack_complex_double* work, lapack_int lwork );
+lapack_int LAPACKE_stprfs_work(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                               const float* ap, const float* b, lapack_int ldb, const float* x, lapack_int ldx,
+                               float* ferr, float* berr, float* work, lapack_int* iwork);
+lapack_int LAPACKE_dtprfs_work(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                               const double* ap, const double* b, lapack_int ldb, const double* x, lapack_int ldx,
+                               double* ferr, double* berr, double* work, lapack_int* iwork);
+lapack_int LAPACKE_ctprfs_work(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_float* ap, const lapack_complex_float* b, lapack_int ldb,
+                               const lapack_complex_float* x, lapack_int ldx, float* ferr, float* berr,
+                               lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_ztprfs_work(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_double* ap, const lapack_complex_double* b, lapack_int ldb,
+                               const lapack_complex_double* x, lapack_int ldx, double* ferr, double* berr,
+                               lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_cungrq_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int k, lapack_complex_float* a,
-                                lapack_int lda, const lapack_complex_float* tau,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zungrq_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int k, lapack_complex_double* a,
-                                lapack_int lda,
-                                const lapack_complex_double* tau,
-                                lapack_complex_double* work, lapack_int lwork );
+lapack_int LAPACKE_stptri_work(int matrix_order, char uplo, char diag, lapack_int n, float* ap);
+lapack_int LAPACKE_dtptri_work(int matrix_order, char uplo, char diag, lapack_int n, double* ap);
+lapack_int LAPACKE_ctptri_work(int matrix_order, char uplo, char diag, lapack_int n, lapack_complex_float* ap);
+lapack_int LAPACKE_ztptri_work(int matrix_order, char uplo, char diag, lapack_int n, lapack_complex_double* ap);
 
-lapack_int LAPACKE_cungtr_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_float* a, lapack_int lda,
-                                const lapack_complex_float* tau,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zungtr_work( int matrix_order, char uplo, lapack_int n,
-                                lapack_complex_double* a, lapack_int lda,
-                                const lapack_complex_double* tau,
-                                lapack_complex_double* work, lapack_int lwork );
+lapack_int LAPACKE_stptrs_work(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                               const float* ap, float* b, lapack_int ldb);
+lapack_int LAPACKE_dtptrs_work(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                               const double* ap, double* b, lapack_int ldb);
+lapack_int LAPACKE_ctptrs_work(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_float* ap, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_ztptrs_work(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_double* ap, lapack_complex_double* b, lapack_int ldb);
 
-lapack_int LAPACKE_cunmbr_work( int matrix_order, char vect, char side,
-                                char trans, lapack_int m, lapack_int n,
-                                lapack_int k, const lapack_complex_float* a,
-                                lapack_int lda, const lapack_complex_float* tau,
-                                lapack_complex_float* c, lapack_int ldc,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zunmbr_work( int matrix_order, char vect, char side,
-                                char trans, lapack_int m, lapack_int n,
-                                lapack_int k, const lapack_complex_double* a,
-                                lapack_int lda,
-                                const lapack_complex_double* tau,
-                                lapack_complex_double* c, lapack_int ldc,
-                                lapack_complex_double* work, lapack_int lwork );
+lapack_int LAPACKE_stpttf_work(int matrix_order, char transr, char uplo, lapack_int n, const float* ap, float* arf);
+lapack_int LAPACKE_dtpttf_work(int matrix_order, char transr, char uplo, lapack_int n, const double* ap, double* arf);
+lapack_int LAPACKE_ctpttf_work(int matrix_order, char transr, char uplo, lapack_int n, const lapack_complex_float* ap,
+                               lapack_complex_float* arf);
+lapack_int LAPACKE_ztpttf_work(int matrix_order, char transr, char uplo, lapack_int n, const lapack_complex_double* ap,
+                               lapack_complex_double* arf);
 
-lapack_int LAPACKE_cunmhr_work( int matrix_order, char side, char trans,
-                                lapack_int m, lapack_int n, lapack_int ilo,
-                                lapack_int ihi, const lapack_complex_float* a,
-                                lapack_int lda, const lapack_complex_float* tau,
-                                lapack_complex_float* c, lapack_int ldc,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zunmhr_work( int matrix_order, char side, char trans,
-                                lapack_int m, lapack_int n, lapack_int ilo,
-                                lapack_int ihi, const lapack_complex_double* a,
-                                lapack_int lda,
-                                const lapack_complex_double* tau,
-                                lapack_complex_double* c, lapack_int ldc,
-                                lapack_complex_double* work, lapack_int lwork );
+lapack_int LAPACKE_stpttr_work(int matrix_order, char uplo, lapack_int n, const float* ap, float* a, lapack_int lda);
+lapack_int LAPACKE_dtpttr_work(int matrix_order, char uplo, lapack_int n, const double* ap, double* a, lapack_int lda);
+lapack_int LAPACKE_ctpttr_work(int matrix_order, char uplo, lapack_int n, const lapack_complex_float* ap,
+                               lapack_complex_float* a, lapack_int lda);
+lapack_int LAPACKE_ztpttr_work(int matrix_order, char uplo, lapack_int n, const lapack_complex_double* ap,
+                               lapack_complex_double* a, lapack_int lda);
 
-lapack_int LAPACKE_cunmlq_work( int matrix_order, char side, char trans,
-                                lapack_int m, lapack_int n, lapack_int k,
-                                const lapack_complex_float* a, lapack_int lda,
-                                const lapack_complex_float* tau,
-                                lapack_complex_float* c, lapack_int ldc,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zunmlq_work( int matrix_order, char side, char trans,
-                                lapack_int m, lapack_int n, lapack_int k,
-                                const lapack_complex_double* a, lapack_int lda,
-                                const lapack_complex_double* tau,
-                                lapack_complex_double* c, lapack_int ldc,
-                                lapack_complex_double* work, lapack_int lwork );
+lapack_int LAPACKE_strcon_work(int matrix_order, char norm, char uplo, char diag, lapack_int n, const float* a,
+                               lapack_int lda, float* rcond, float* work, lapack_int* iwork);
+lapack_int LAPACKE_dtrcon_work(int matrix_order, char norm, char uplo, char diag, lapack_int n, const double* a,
+                               lapack_int lda, double* rcond, double* work, lapack_int* iwork);
+lapack_int LAPACKE_ctrcon_work(int matrix_order, char norm, char uplo, char diag, lapack_int n,
+                               const lapack_complex_float* a, lapack_int lda, float* rcond, lapack_complex_float* work,
+                               float* rwork);
+lapack_int LAPACKE_ztrcon_work(int matrix_order, char norm, char uplo, char diag, lapack_int n,
+                               const lapack_complex_double* a, lapack_int lda, double* rcond,
+                               lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_cunmql_work( int matrix_order, char side, char trans,
-                                lapack_int m, lapack_int n, lapack_int k,
-                                const lapack_complex_float* a, lapack_int lda,
-                                const lapack_complex_float* tau,
-                                lapack_complex_float* c, lapack_int ldc,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zunmql_work( int matrix_order, char side, char trans,
-                                lapack_int m, lapack_int n, lapack_int k,
-                                const lapack_complex_double* a, lapack_int lda,
-                                const lapack_complex_double* tau,
-                                lapack_complex_double* c, lapack_int ldc,
-                                lapack_complex_double* work, lapack_int lwork );
+lapack_int LAPACKE_strevc_work(int matrix_order, char side, char howmny, lapack_logical* select, lapack_int n,
+                               const float* t, lapack_int ldt, float* vl, lapack_int ldvl, float* vr, lapack_int ldvr,
+                               lapack_int mm, lapack_int* m, float* work);
+lapack_int LAPACKE_dtrevc_work(int matrix_order, char side, char howmny, lapack_logical* select, lapack_int n,
+                               const double* t, lapack_int ldt, double* vl, lapack_int ldvl, double* vr,
+                               lapack_int ldvr, lapack_int mm, lapack_int* m, double* work);
+lapack_int LAPACKE_ctrevc_work(int matrix_order, char side, char howmny, const lapack_logical* select, lapack_int n,
+                               lapack_complex_float* t, lapack_int ldt, lapack_complex_float* vl, lapack_int ldvl,
+                               lapack_complex_float* vr, lapack_int ldvr, lapack_int mm, lapack_int* m,
+                               lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_ztrevc_work(int matrix_order, char side, char howmny, const lapack_logical* select, lapack_int n,
+                               lapack_complex_double* t, lapack_int ldt, lapack_complex_double* vl, lapack_int ldvl,
+                               lapack_complex_double* vr, lapack_int ldvr, lapack_int mm, lapack_int* m,
+                               lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_cunmqr_work( int matrix_order, char side, char trans,
-                                lapack_int m, lapack_int n, lapack_int k,
-                                const lapack_complex_float* a, lapack_int lda,
-                                const lapack_complex_float* tau,
-                                lapack_complex_float* c, lapack_int ldc,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zunmqr_work( int matrix_order, char side, char trans,
-                                lapack_int m, lapack_int n, lapack_int k,
-                                const lapack_complex_double* a, lapack_int lda,
-                                const lapack_complex_double* tau,
-                                lapack_complex_double* c, lapack_int ldc,
-                                lapack_complex_double* work, lapack_int lwork );
+lapack_int LAPACKE_strexc_work(int matrix_order, char compq, lapack_int n, float* t, lapack_int ldt, float* q,
+                               lapack_int ldq, lapack_int* ifst, lapack_int* ilst, float* work);
+lapack_int LAPACKE_dtrexc_work(int matrix_order, char compq, lapack_int n, double* t, lapack_int ldt, double* q,
+                               lapack_int ldq, lapack_int* ifst, lapack_int* ilst, double* work);
+lapack_int LAPACKE_ctrexc_work(int matrix_order, char compq, lapack_int n, lapack_complex_float* t, lapack_int ldt,
+                               lapack_complex_float* q, lapack_int ldq, lapack_int ifst, lapack_int ilst);
+lapack_int LAPACKE_ztrexc_work(int matrix_order, char compq, lapack_int n, lapack_complex_double* t, lapack_int ldt,
+                               lapack_complex_double* q, lapack_int ldq, lapack_int ifst, lapack_int ilst);
 
-lapack_int LAPACKE_cunmrq_work( int matrix_order, char side, char trans,
-                                lapack_int m, lapack_int n, lapack_int k,
-                                const lapack_complex_float* a, lapack_int lda,
-                                const lapack_complex_float* tau,
-                                lapack_complex_float* c, lapack_int ldc,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zunmrq_work( int matrix_order, char side, char trans,
-                                lapack_int m, lapack_int n, lapack_int k,
-                                const lapack_complex_double* a, lapack_int lda,
-                                const lapack_complex_double* tau,
-                                lapack_complex_double* c, lapack_int ldc,
-                                lapack_complex_double* work, lapack_int lwork );
+lapack_int LAPACKE_strrfs_work(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                               const float* a, lapack_int lda, const float* b, lapack_int ldb, const float* x,
+                               lapack_int ldx, float* ferr, float* berr, float* work, lapack_int* iwork);
+lapack_int LAPACKE_dtrrfs_work(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                               const double* a, lapack_int lda, const double* b, lapack_int ldb, const double* x,
+                               lapack_int ldx, double* ferr, double* berr, double* work, lapack_int* iwork);
+lapack_int LAPACKE_ctrrfs_work(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* b,
+                               lapack_int ldb, const lapack_complex_float* x, lapack_int ldx, float* ferr, float* berr,
+                               lapack_complex_float* work, float* rwork);
+lapack_int LAPACKE_ztrrfs_work(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* b,
+                               lapack_int ldb, const lapack_complex_double* x, lapack_int ldx, double* ferr,
+                               double* berr, lapack_complex_double* work, double* rwork);
 
-lapack_int LAPACKE_cunmrz_work( int matrix_order, char side, char trans,
-                                lapack_int m, lapack_int n, lapack_int k,
-                                lapack_int l, const lapack_complex_float* a,
-                                lapack_int lda, const lapack_complex_float* tau,
-                                lapack_complex_float* c, lapack_int ldc,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zunmrz_work( int matrix_order, char side, char trans,
-                                lapack_int m, lapack_int n, lapack_int k,
-                                lapack_int l, const lapack_complex_double* a,
-                                lapack_int lda,
-                                const lapack_complex_double* tau,
-                                lapack_complex_double* c, lapack_int ldc,
-                                lapack_complex_double* work, lapack_int lwork );
+lapack_int LAPACKE_strsen_work(int matrix_order, char job, char compq, const lapack_logical* select, lapack_int n,
+                               float* t, lapack_int ldt, float* q, lapack_int ldq, float* wr, float* wi, lapack_int* m,
+                               float* s, float* sep, float* work, lapack_int lwork, lapack_int* iwork,
+                               lapack_int liwork);
+lapack_int LAPACKE_dtrsen_work(int matrix_order, char job, char compq, const lapack_logical* select, lapack_int n,
+                               double* t, lapack_int ldt, double* q, lapack_int ldq, double* wr, double* wi,
+                               lapack_int* m, double* s, double* sep, double* work, lapack_int lwork, lapack_int* iwork,
+                               lapack_int liwork);
+lapack_int LAPACKE_ctrsen_work(int matrix_order, char job, char compq, const lapack_logical* select, lapack_int n,
+                               lapack_complex_float* t, lapack_int ldt, lapack_complex_float* q, lapack_int ldq,
+                               lapack_complex_float* w, lapack_int* m, float* s, float* sep, lapack_complex_float* work,
+                               lapack_int lwork);
+lapack_int LAPACKE_ztrsen_work(int matrix_order, char job, char compq, const lapack_logical* select, lapack_int n,
+                               lapack_complex_double* t, lapack_int ldt, lapack_complex_double* q, lapack_int ldq,
+                               lapack_complex_double* w, lapack_int* m, double* s, double* sep,
+                               lapack_complex_double* work, lapack_int lwork);
 
-lapack_int LAPACKE_cunmtr_work( int matrix_order, char side, char uplo,
-                                char trans, lapack_int m, lapack_int n,
-                                const lapack_complex_float* a, lapack_int lda,
-                                const lapack_complex_float* tau,
-                                lapack_complex_float* c, lapack_int ldc,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_zunmtr_work( int matrix_order, char side, char uplo,
-                                char trans, lapack_int m, lapack_int n,
-                                const lapack_complex_double* a, lapack_int lda,
-                                const lapack_complex_double* tau,
-                                lapack_complex_double* c, lapack_int ldc,
-                                lapack_complex_double* work, lapack_int lwork );
+lapack_int LAPACKE_strsna_work(int matrix_order, char job, char howmny, const lapack_logical* select, lapack_int n,
+                               const float* t, lapack_int ldt, const float* vl, lapack_int ldvl, const float* vr,
+                               lapack_int ldvr, float* s, float* sep, lapack_int mm, lapack_int* m, float* work,
+                               lapack_int ldwork, lapack_int* iwork);
+lapack_int LAPACKE_dtrsna_work(int matrix_order, char job, char howmny, const lapack_logical* select, lapack_int n,
+                               const double* t, lapack_int ldt, const double* vl, lapack_int ldvl, const double* vr,
+                               lapack_int ldvr, double* s, double* sep, lapack_int mm, lapack_int* m, double* work,
+                               lapack_int ldwork, lapack_int* iwork);
+lapack_int LAPACKE_ctrsna_work(int matrix_order, char job, char howmny, const lapack_logical* select, lapack_int n,
+                               const lapack_complex_float* t, lapack_int ldt, const lapack_complex_float* vl,
+                               lapack_int ldvl, const lapack_complex_float* vr, lapack_int ldvr, float* s, float* sep,
+                               lapack_int mm, lapack_int* m, lapack_complex_float* work, lapack_int ldwork,
+                               float* rwork);
+lapack_int LAPACKE_ztrsna_work(int matrix_order, char job, char howmny, const lapack_logical* select, lapack_int n,
+                               const lapack_complex_double* t, lapack_int ldt, const lapack_complex_double* vl,
+                               lapack_int ldvl, const lapack_complex_double* vr, lapack_int ldvr, double* s,
+                               double* sep, lapack_int mm, lapack_int* m, lapack_complex_double* work,
+                               lapack_int ldwork, double* rwork);
 
-lapack_int LAPACKE_cupgtr_work( int matrix_order, char uplo, lapack_int n,
-                                const lapack_complex_float* ap,
-                                const lapack_complex_float* tau,
-                                lapack_complex_float* q, lapack_int ldq,
-                                lapack_complex_float* work );
-lapack_int LAPACKE_zupgtr_work( int matrix_order, char uplo, lapack_int n,
-                                const lapack_complex_double* ap,
-                                const lapack_complex_double* tau,
-                                lapack_complex_double* q, lapack_int ldq,
-                                lapack_complex_double* work );
+lapack_int LAPACKE_strsyl_work(int matrix_order, char trana, char tranb, lapack_int isgn, lapack_int m, lapack_int n,
+                               const float* a, lapack_int lda, const float* b, lapack_int ldb, float* c, lapack_int ldc,
+                               float* scale);
+lapack_int LAPACKE_dtrsyl_work(int matrix_order, char trana, char tranb, lapack_int isgn, lapack_int m, lapack_int n,
+                               const double* a, lapack_int lda, const double* b, lapack_int ldb, double* c,
+                               lapack_int ldc, double* scale);
+lapack_int LAPACKE_ctrsyl_work(int matrix_order, char trana, char tranb, lapack_int isgn, lapack_int m, lapack_int n,
+                               const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* b,
+                               lapack_int ldb, lapack_complex_float* c, lapack_int ldc, float* scale);
+lapack_int LAPACKE_ztrsyl_work(int matrix_order, char trana, char tranb, lapack_int isgn, lapack_int m, lapack_int n,
+                               const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* b,
+                               lapack_int ldb, lapack_complex_double* c, lapack_int ldc, double* scale);
 
-lapack_int LAPACKE_cupmtr_work( int matrix_order, char side, char uplo,
-                                char trans, lapack_int m, lapack_int n,
-                                const lapack_complex_float* ap,
-                                const lapack_complex_float* tau,
-                                lapack_complex_float* c, lapack_int ldc,
-                                lapack_complex_float* work );
-lapack_int LAPACKE_zupmtr_work( int matrix_order, char side, char uplo,
-                                char trans, lapack_int m, lapack_int n,
-                                const lapack_complex_double* ap,
-                                const lapack_complex_double* tau,
-                                lapack_complex_double* c, lapack_int ldc,
-                                lapack_complex_double* work );
+lapack_int LAPACKE_strtri_work(int matrix_order, char uplo, char diag, lapack_int n, float* a, lapack_int lda);
+lapack_int LAPACKE_dtrtri_work(int matrix_order, char uplo, char diag, lapack_int n, double* a, lapack_int lda);
+lapack_int LAPACKE_ctrtri_work(int matrix_order, char uplo, char diag, lapack_int n, lapack_complex_float* a,
+                               lapack_int lda);
+lapack_int LAPACKE_ztrtri_work(int matrix_order, char uplo, char diag, lapack_int n, lapack_complex_double* a,
+                               lapack_int lda);
 
-lapack_int LAPACKE_claghe( int matrix_order, lapack_int n, lapack_int k,
-                           const float* d, lapack_complex_float* a,
-                           lapack_int lda, lapack_int* iseed );
-lapack_int LAPACKE_zlaghe( int matrix_order, lapack_int n, lapack_int k,
-                           const double* d, lapack_complex_double* a,
-                           lapack_int lda, lapack_int* iseed );
+lapack_int LAPACKE_strtrs_work(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                               const float* a, lapack_int lda, float* b, lapack_int ldb);
+lapack_int LAPACKE_dtrtrs_work(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                               const double* a, lapack_int lda, double* b, lapack_int ldb);
+lapack_int LAPACKE_ctrtrs_work(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_float* a, lapack_int lda, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_ztrtrs_work(int matrix_order, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs,
+                               const lapack_complex_double* a, lapack_int lda, lapack_complex_double* b,
+                               lapack_int ldb);
 
-lapack_int LAPACKE_slagsy( int matrix_order, lapack_int n, lapack_int k,
-                           const float* d, float* a, lapack_int lda,
-                           lapack_int* iseed );
-lapack_int LAPACKE_dlagsy( int matrix_order, lapack_int n, lapack_int k,
-                           const double* d, double* a, lapack_int lda,
-                           lapack_int* iseed );
-lapack_int LAPACKE_clagsy( int matrix_order, lapack_int n, lapack_int k,
-                           const float* d, lapack_complex_float* a,
-                           lapack_int lda, lapack_int* iseed );
-lapack_int LAPACKE_zlagsy( int matrix_order, lapack_int n, lapack_int k,
-                           const double* d, lapack_complex_double* a,
-                           lapack_int lda, lapack_int* iseed );
+lapack_int LAPACKE_strttf_work(int matrix_order, char transr, char uplo, lapack_int n, const float* a, lapack_int lda,
+                               float* arf);
+lapack_int LAPACKE_dtrttf_work(int matrix_order, char transr, char uplo, lapack_int n, const double* a, lapack_int lda,
+                               double* arf);
+lapack_int LAPACKE_ctrttf_work(int matrix_order, char transr, char uplo, lapack_int n, const lapack_complex_float* a,
+                               lapack_int lda, lapack_complex_float* arf);
+lapack_int LAPACKE_ztrttf_work(int matrix_order, char transr, char uplo, lapack_int n, const lapack_complex_double* a,
+                               lapack_int lda, lapack_complex_double* arf);
 
-lapack_int LAPACKE_slapmr( int matrix_order, lapack_logical forwrd,
-                           lapack_int m, lapack_int n, float* x, lapack_int ldx,
-                           lapack_int* k );
-lapack_int LAPACKE_dlapmr( int matrix_order, lapack_logical forwrd,
-                           lapack_int m, lapack_int n, double* x,
-                           lapack_int ldx, lapack_int* k );
-lapack_int LAPACKE_clapmr( int matrix_order, lapack_logical forwrd,
-                           lapack_int m, lapack_int n, lapack_complex_float* x,
-                           lapack_int ldx, lapack_int* k );
-lapack_int LAPACKE_zlapmr( int matrix_order, lapack_logical forwrd,
-                           lapack_int m, lapack_int n, lapack_complex_double* x,
-                           lapack_int ldx, lapack_int* k );
+lapack_int LAPACKE_strttp_work(int matrix_order, char uplo, lapack_int n, const float* a, lapack_int lda, float* ap);
+lapack_int LAPACKE_dtrttp_work(int matrix_order, char uplo, lapack_int n, const double* a, lapack_int lda, double* ap);
+lapack_int LAPACKE_ctrttp_work(int matrix_order, char uplo, lapack_int n, const lapack_complex_float* a, lapack_int lda,
+                               lapack_complex_float* ap);
+lapack_int LAPACKE_ztrttp_work(int matrix_order, char uplo, lapack_int n, const lapack_complex_double* a,
+                               lapack_int lda, lapack_complex_double* ap);
 
+lapack_int LAPACKE_stzrzf_work(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, float* tau,
+                               float* work, lapack_int lwork);
+lapack_int LAPACKE_dtzrzf_work(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda, double* tau,
+                               double* work, lapack_int lwork);
+lapack_int LAPACKE_ctzrzf_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                               lapack_complex_float* tau, lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_ztzrzf_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                               lapack_complex_double* tau, lapack_complex_double* work, lapack_int lwork);
 
-float LAPACKE_slapy2( float x, float y );
-double LAPACKE_dlapy2( double x, double y );
+lapack_int LAPACKE_cungbr_work(int matrix_order, char vect, lapack_int m, lapack_int n, lapack_int k,
+                               lapack_complex_float* a, lapack_int lda, const lapack_complex_float* tau,
+                               lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_zungbr_work(int matrix_order, char vect, lapack_int m, lapack_int n, lapack_int k,
+                               lapack_complex_double* a, lapack_int lda, const lapack_complex_double* tau,
+                               lapack_complex_double* work, lapack_int lwork);
 
-float LAPACKE_slapy3( float x, float y, float z );
-double LAPACKE_dlapy3( double x, double y, double z );
+lapack_int LAPACKE_cunghr_work(int matrix_order, lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_float* a,
+                               lapack_int lda, const lapack_complex_float* tau, lapack_complex_float* work,
+                               lapack_int lwork);
+lapack_int LAPACKE_zunghr_work(int matrix_order, lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_double* a,
+                               lapack_int lda, const lapack_complex_double* tau, lapack_complex_double* work,
+                               lapack_int lwork);
 
-lapack_int LAPACKE_slartgp( float f, float g, float* cs, float* sn, float* r );
-lapack_int LAPACKE_dlartgp( double f, double g, double* cs, double* sn,
-                            double* r );
+lapack_int LAPACKE_cunglq_work(int matrix_order, lapack_int m, lapack_int n, lapack_int k, lapack_complex_float* a,
+                               lapack_int lda, const lapack_complex_float* tau, lapack_complex_float* work,
+                               lapack_int lwork);
+lapack_int LAPACKE_zunglq_work(int matrix_order, lapack_int m, lapack_int n, lapack_int k, lapack_complex_double* a,
+                               lapack_int lda, const lapack_complex_double* tau, lapack_complex_double* work,
+                               lapack_int lwork);
 
-lapack_int LAPACKE_slartgs( float x, float y, float sigma, float* cs,
-                            float* sn );
-lapack_int LAPACKE_dlartgs( double x, double y, double sigma, double* cs,
-                            double* sn );
+lapack_int LAPACKE_cungql_work(int matrix_order, lapack_int m, lapack_int n, lapack_int k, lapack_complex_float* a,
+                               lapack_int lda, const lapack_complex_float* tau, lapack_complex_float* work,
+                               lapack_int lwork);
+lapack_int LAPACKE_zungql_work(int matrix_order, lapack_int m, lapack_int n, lapack_int k, lapack_complex_double* a,
+                               lapack_int lda, const lapack_complex_double* tau, lapack_complex_double* work,
+                               lapack_int lwork);
 
+lapack_int LAPACKE_cungqr_work(int matrix_order, lapack_int m, lapack_int n, lapack_int k, lapack_complex_float* a,
+                               lapack_int lda, const lapack_complex_float* tau, lapack_complex_float* work,
+                               lapack_int lwork);
+lapack_int LAPACKE_zungqr_work(int matrix_order, lapack_int m, lapack_int n, lapack_int k, lapack_complex_double* a,
+                               lapack_int lda, const lapack_complex_double* tau, lapack_complex_double* work,
+                               lapack_int lwork);
 
-//LAPACK 3.3.0
-lapack_int LAPACKE_cbbcsd( int matrix_order, char jobu1, char jobu2,
-                           char jobv1t, char jobv2t, char trans, lapack_int m,
-                           lapack_int p, lapack_int q, float* theta, float* phi,
-                           lapack_complex_float* u1, lapack_int ldu1,
-                           lapack_complex_float* u2, lapack_int ldu2,
-                           lapack_complex_float* v1t, lapack_int ldv1t,
-                           lapack_complex_float* v2t, lapack_int ldv2t,
-                           float* b11d, float* b11e, float* b12d, float* b12e,
-                           float* b21d, float* b21e, float* b22d, float* b22e );
-lapack_int LAPACKE_cbbcsd_work( int matrix_order, char jobu1, char jobu2,
-                                char jobv1t, char jobv2t, char trans,
-                                lapack_int m, lapack_int p, lapack_int q,
-                                float* theta, float* phi,
-                                lapack_complex_float* u1, lapack_int ldu1,
-                                lapack_complex_float* u2, lapack_int ldu2,
-                                lapack_complex_float* v1t, lapack_int ldv1t,
-                                lapack_complex_float* v2t, lapack_int ldv2t,
-                                float* b11d, float* b11e, float* b12d,
-                                float* b12e, float* b21d, float* b21e,
-                                float* b22d, float* b22e, float* rwork,
-                                lapack_int lrwork );
-lapack_int LAPACKE_cheswapr( int matrix_order, char uplo, lapack_int n,
-                             lapack_complex_float* a, lapack_int i1,
-                             lapack_int i2 );
-lapack_int LAPACKE_cheswapr_work( int matrix_order, char uplo, lapack_int n,
-                                  lapack_complex_float* a, lapack_int i1,
-                                  lapack_int i2 );
-lapack_int LAPACKE_chetri2( int matrix_order, char uplo, lapack_int n,
-                            lapack_complex_float* a, lapack_int lda,
-                            const lapack_int* ipiv );
-lapack_int LAPACKE_chetri2_work( int matrix_order, char uplo, lapack_int n,
-                                 lapack_complex_float* a, lapack_int lda,
-                                 const lapack_int* ipiv,
-                                 lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_chetri2x( int matrix_order, char uplo, lapack_int n,
-                             lapack_complex_float* a, lapack_int lda,
-                             const lapack_int* ipiv, lapack_int nb );
-lapack_int LAPACKE_chetri2x_work( int matrix_order, char uplo, lapack_int n,
-                                  lapack_complex_float* a, lapack_int lda,
-                                  const lapack_int* ipiv,
-                                  lapack_complex_float* work, lapack_int nb );
-lapack_int LAPACKE_chetrs2( int matrix_order, char uplo, lapack_int n,
-                            lapack_int nrhs, const lapack_complex_float* a,
-                            lapack_int lda, const lapack_int* ipiv,
-                            lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_chetrs2_work( int matrix_order, char uplo, lapack_int n,
-                                 lapack_int nrhs, const lapack_complex_float* a,
-                                 lapack_int lda, const lapack_int* ipiv,
-                                 lapack_complex_float* b, lapack_int ldb,
-                                 lapack_complex_float* work );
-lapack_int LAPACKE_csyconv( int matrix_order, char uplo, char way, lapack_int n,
-                            lapack_complex_float* a, lapack_int lda,
-                            const lapack_int* ipiv );
-lapack_int LAPACKE_csyconv_work( int matrix_order, char uplo, char way,
-                                 lapack_int n, lapack_complex_float* a,
-                                 lapack_int lda, const lapack_int* ipiv,
-                                 lapack_complex_float* work );
-lapack_int LAPACKE_csyswapr( int matrix_order, char uplo, lapack_int n,
-                             lapack_complex_float* a, lapack_int i1,
-                             lapack_int i2 );
-lapack_int LAPACKE_csyswapr_work( int matrix_order, char uplo, lapack_int n,
-                                  lapack_complex_float* a, lapack_int i1,
-                                  lapack_int i2 );
-lapack_int LAPACKE_csytri2( int matrix_order, char uplo, lapack_int n,
-                            lapack_complex_float* a, lapack_int lda,
-                            const lapack_int* ipiv );
-lapack_int LAPACKE_csytri2_work( int matrix_order, char uplo, lapack_int n,
-                                 lapack_complex_float* a, lapack_int lda,
-                                 const lapack_int* ipiv,
-                                 lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_csytri2x( int matrix_order, char uplo, lapack_int n,
-                             lapack_complex_float* a, lapack_int lda,
-                             const lapack_int* ipiv, lapack_int nb );
-lapack_int LAPACKE_csytri2x_work( int matrix_order, char uplo, lapack_int n,
-                                  lapack_complex_float* a, lapack_int lda,
-                                  const lapack_int* ipiv,
-                                  lapack_complex_float* work, lapack_int nb );
-lapack_int LAPACKE_csytrs2( int matrix_order, char uplo, lapack_int n,
-                            lapack_int nrhs, const lapack_complex_float* a,
-                            lapack_int lda, const lapack_int* ipiv,
-                            lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_csytrs2_work( int matrix_order, char uplo, lapack_int n,
-                                 lapack_int nrhs, const lapack_complex_float* a,
-                                 lapack_int lda, const lapack_int* ipiv,
-                                 lapack_complex_float* b, lapack_int ldb,
-                                 lapack_complex_float* work );
-lapack_int LAPACKE_cunbdb( int matrix_order, char trans, char signs,
-                           lapack_int m, lapack_int p, lapack_int q,
-                           lapack_complex_float* x11, lapack_int ldx11,
-                           lapack_complex_float* x12, lapack_int ldx12,
-                           lapack_complex_float* x21, lapack_int ldx21,
-                           lapack_complex_float* x22, lapack_int ldx22,
-                           float* theta, float* phi,
-                           lapack_complex_float* taup1,
-                           lapack_complex_float* taup2,
-                           lapack_complex_float* tauq1,
-                           lapack_complex_float* tauq2 );
-lapack_int LAPACKE_cunbdb_work( int matrix_order, char trans, char signs,
-                                lapack_int m, lapack_int p, lapack_int q,
-                                lapack_complex_float* x11, lapack_int ldx11,
-                                lapack_complex_float* x12, lapack_int ldx12,
-                                lapack_complex_float* x21, lapack_int ldx21,
-                                lapack_complex_float* x22, lapack_int ldx22,
-                                float* theta, float* phi,
-                                lapack_complex_float* taup1,
-                                lapack_complex_float* taup2,
-                                lapack_complex_float* tauq1,
-                                lapack_complex_float* tauq2,
-                                lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_cuncsd( int matrix_order, char jobu1, char jobu2,
-                           char jobv1t, char jobv2t, char trans, char signs,
-                           lapack_int m, lapack_int p, lapack_int q,
-                           lapack_complex_float* x11, lapack_int ldx11,
-                           lapack_complex_float* x12, lapack_int ldx12,
-                           lapack_complex_float* x21, lapack_int ldx21,
-                           lapack_complex_float* x22, lapack_int ldx22,
-                           float* theta, lapack_complex_float* u1,
-                           lapack_int ldu1, lapack_complex_float* u2,
-                           lapack_int ldu2, lapack_complex_float* v1t,
-                           lapack_int ldv1t, lapack_complex_float* v2t,
-                           lapack_int ldv2t );
-lapack_int LAPACKE_cuncsd_work( int matrix_order, char jobu1, char jobu2,
-                                char jobv1t, char jobv2t, char trans,
-                                char signs, lapack_int m, lapack_int p,
-                                lapack_int q, lapack_complex_float* x11,
-                                lapack_int ldx11, lapack_complex_float* x12,
-                                lapack_int ldx12, lapack_complex_float* x21,
-                                lapack_int ldx21, lapack_complex_float* x22,
-                                lapack_int ldx22, float* theta,
-                                lapack_complex_float* u1, lapack_int ldu1,
-                                lapack_complex_float* u2, lapack_int ldu2,
-                                lapack_complex_float* v1t, lapack_int ldv1t,
-                                lapack_complex_float* v2t, lapack_int ldv2t,
-                                lapack_complex_float* work, lapack_int lwork,
-                                float* rwork, lapack_int lrwork,
-                                lapack_int* iwork );
-lapack_int LAPACKE_dbbcsd( int matrix_order, char jobu1, char jobu2,
-                           char jobv1t, char jobv2t, char trans, lapack_int m,
-                           lapack_int p, lapack_int q, double* theta,
-                           double* phi, double* u1, lapack_int ldu1, double* u2,
-                           lapack_int ldu2, double* v1t, lapack_int ldv1t,
-                           double* v2t, lapack_int ldv2t, double* b11d,
-                           double* b11e, double* b12d, double* b12e,
-                           double* b21d, double* b21e, double* b22d,
-                           double* b22e );
-lapack_int LAPACKE_dbbcsd_work( int matrix_order, char jobu1, char jobu2,
-                                char jobv1t, char jobv2t, char trans,
-                                lapack_int m, lapack_int p, lapack_int q,
-                                double* theta, double* phi, double* u1,
-                                lapack_int ldu1, double* u2, lapack_int ldu2,
-                                double* v1t, lapack_int ldv1t, double* v2t,
-                                lapack_int ldv2t, double* b11d, double* b11e,
-                                double* b12d, double* b12e, double* b21d,
-                                double* b21e, double* b22d, double* b22e,
-                                double* work, lapack_int lwork );
-lapack_int LAPACKE_dorbdb( int matrix_order, char trans, char signs,
-                           lapack_int m, lapack_int p, lapack_int q,
-                           double* x11, lapack_int ldx11, double* x12,
-                           lapack_int ldx12, double* x21, lapack_int ldx21,
-                           double* x22, lapack_int ldx22, double* theta,
-                           double* phi, double* taup1, double* taup2,
-                           double* tauq1, double* tauq2 );
-lapack_int LAPACKE_dorbdb_work( int matrix_order, char trans, char signs,
-                                lapack_int m, lapack_int p, lapack_int q,
-                                double* x11, lapack_int ldx11, double* x12,
-                                lapack_int ldx12, double* x21, lapack_int ldx21,
-                                double* x22, lapack_int ldx22, double* theta,
-                                double* phi, double* taup1, double* taup2,
-                                double* tauq1, double* tauq2, double* work,
-                                lapack_int lwork );
-lapack_int LAPACKE_dorcsd( int matrix_order, char jobu1, char jobu2,
-                           char jobv1t, char jobv2t, char trans, char signs,
-                           lapack_int m, lapack_int p, lapack_int q,
-                           double* x11, lapack_int ldx11, double* x12,
-                           lapack_int ldx12, double* x21, lapack_int ldx21,
-                           double* x22, lapack_int ldx22, double* theta,
-                           double* u1, lapack_int ldu1, double* u2,
-                           lapack_int ldu2, double* v1t, lapack_int ldv1t,
-                           double* v2t, lapack_int ldv2t );
-lapack_int LAPACKE_dorcsd_work( int matrix_order, char jobu1, char jobu2,
-                                char jobv1t, char jobv2t, char trans,
-                                char signs, lapack_int m, lapack_int p,
-                                lapack_int q, double* x11, lapack_int ldx11,
-                                double* x12, lapack_int ldx12, double* x21,
-                                lapack_int ldx21, double* x22, lapack_int ldx22,
-                                double* theta, double* u1, lapack_int ldu1,
-                                double* u2, lapack_int ldu2, double* v1t,
-                                lapack_int ldv1t, double* v2t, lapack_int ldv2t,
-                                double* work, lapack_int lwork,
-                                lapack_int* iwork );
-lapack_int LAPACKE_dsyconv( int matrix_order, char uplo, char way, lapack_int n,
-                            double* a, lapack_int lda, const lapack_int* ipiv );
-lapack_int LAPACKE_dsyconv_work( int matrix_order, char uplo, char way,
-                                 lapack_int n, double* a, lapack_int lda,
-                                 const lapack_int* ipiv, double* work );
-lapack_int LAPACKE_dsyswapr( int matrix_order, char uplo, lapack_int n,
-                             double* a, lapack_int i1, lapack_int i2 );
-lapack_int LAPACKE_dsyswapr_work( int matrix_order, char uplo, lapack_int n,
-                                  double* a, lapack_int i1, lapack_int i2 );
-lapack_int LAPACKE_dsytri2( int matrix_order, char uplo, lapack_int n,
-                            double* a, lapack_int lda, const lapack_int* ipiv );
-lapack_int LAPACKE_dsytri2_work( int matrix_order, char uplo, lapack_int n,
-                                 double* a, lapack_int lda,
-                                 const lapack_int* ipiv,
-                                 lapack_complex_double* work, lapack_int lwork );
-lapack_int LAPACKE_dsytri2x( int matrix_order, char uplo, lapack_int n,
-                             double* a, lapack_int lda, const lapack_int* ipiv,
-                             lapack_int nb );
-lapack_int LAPACKE_dsytri2x_work( int matrix_order, char uplo, lapack_int n,
-                                  double* a, lapack_int lda,
-                                  const lapack_int* ipiv, double* work,
-                                  lapack_int nb );
-lapack_int LAPACKE_dsytrs2( int matrix_order, char uplo, lapack_int n,
-                            lapack_int nrhs, const double* a, lapack_int lda,
-                            const lapack_int* ipiv, double* b, lapack_int ldb );
-lapack_int LAPACKE_dsytrs2_work( int matrix_order, char uplo, lapack_int n,
-                                 lapack_int nrhs, const double* a,
-                                 lapack_int lda, const lapack_int* ipiv,
-                                 double* b, lapack_int ldb, double* work );
-lapack_int LAPACKE_sbbcsd( int matrix_order, char jobu1, char jobu2,
-                           char jobv1t, char jobv2t, char trans, lapack_int m,
-                           lapack_int p, lapack_int q, float* theta, float* phi,
-                           float* u1, lapack_int ldu1, float* u2,
-                           lapack_int ldu2, float* v1t, lapack_int ldv1t,
-                           float* v2t, lapack_int ldv2t, float* b11d,
-                           float* b11e, float* b12d, float* b12e, float* b21d,
-                           float* b21e, float* b22d, float* b22e );
-lapack_int LAPACKE_sbbcsd_work( int matrix_order, char jobu1, char jobu2,
-                                char jobv1t, char jobv2t, char trans,
-                                lapack_int m, lapack_int p, lapack_int q,
-                                float* theta, float* phi, float* u1,
-                                lapack_int ldu1, float* u2, lapack_int ldu2,
-                                float* v1t, lapack_int ldv1t, float* v2t,
-                                lapack_int ldv2t, float* b11d, float* b11e,
-                                float* b12d, float* b12e, float* b21d,
-                                float* b21e, float* b22d, float* b22e,
-                                float* work, lapack_int lwork );
-lapack_int LAPACKE_sorbdb( int matrix_order, char trans, char signs,
-                           lapack_int m, lapack_int p, lapack_int q, float* x11,
-                           lapack_int ldx11, float* x12, lapack_int ldx12,
-                           float* x21, lapack_int ldx21, float* x22,
-                           lapack_int ldx22, float* theta, float* phi,
-                           float* taup1, float* taup2, float* tauq1,
-                           float* tauq2 );
-lapack_int LAPACKE_sorbdb_work( int matrix_order, char trans, char signs,
-                                lapack_int m, lapack_int p, lapack_int q,
-                                float* x11, lapack_int ldx11, float* x12,
-                                lapack_int ldx12, float* x21, lapack_int ldx21,
-                                float* x22, lapack_int ldx22, float* theta,
-                                float* phi, float* taup1, float* taup2,
-                                float* tauq1, float* tauq2, float* work,
-                                lapack_int lwork );
-lapack_int LAPACKE_sorcsd( int matrix_order, char jobu1, char jobu2,
-                           char jobv1t, char jobv2t, char trans, char signs,
-                           lapack_int m, lapack_int p, lapack_int q, float* x11,
-                           lapack_int ldx11, float* x12, lapack_int ldx12,
-                           float* x21, lapack_int ldx21, float* x22,
-                           lapack_int ldx22, float* theta, float* u1,
-                           lapack_int ldu1, float* u2, lapack_int ldu2,
-                           float* v1t, lapack_int ldv1t, float* v2t,
-                           lapack_int ldv2t );
-lapack_int LAPACKE_sorcsd_work( int matrix_order, char jobu1, char jobu2,
-                                char jobv1t, char jobv2t, char trans,
-                                char signs, lapack_int m, lapack_int p,
-                                lapack_int q, float* x11, lapack_int ldx11,
-                                float* x12, lapack_int ldx12, float* x21,
-                                lapack_int ldx21, float* x22, lapack_int ldx22,
-                                float* theta, float* u1, lapack_int ldu1,
-                                float* u2, lapack_int ldu2, float* v1t,
-                                lapack_int ldv1t, float* v2t, lapack_int ldv2t,
-                                float* work, lapack_int lwork,
-                                lapack_int* iwork );
-lapack_int LAPACKE_ssyconv( int matrix_order, char uplo, char way, lapack_int n,
-                            float* a, lapack_int lda, const lapack_int* ipiv );
-lapack_int LAPACKE_ssyconv_work( int matrix_order, char uplo, char way,
-                                 lapack_int n, float* a, lapack_int lda,
-                                 const lapack_int* ipiv, float* work );
-lapack_int LAPACKE_ssyswapr( int matrix_order, char uplo, lapack_int n,
-                             float* a, lapack_int i1, lapack_int i2 );
-lapack_int LAPACKE_ssyswapr_work( int matrix_order, char uplo, lapack_int n,
-                                  float* a, lapack_int i1, lapack_int i2 );
-lapack_int LAPACKE_ssytri2( int matrix_order, char uplo, lapack_int n, float* a,
-                            lapack_int lda, const lapack_int* ipiv );
-lapack_int LAPACKE_ssytri2_work( int matrix_order, char uplo, lapack_int n,
-                                 float* a, lapack_int lda,
-                                 const lapack_int* ipiv,
-                                 lapack_complex_float* work, lapack_int lwork );
-lapack_int LAPACKE_ssytri2x( int matrix_order, char uplo, lapack_int n,
-                             float* a, lapack_int lda, const lapack_int* ipiv,
-                             lapack_int nb );
-lapack_int LAPACKE_ssytri2x_work( int matrix_order, char uplo, lapack_int n,
-                                  float* a, lapack_int lda,
-                                  const lapack_int* ipiv, float* work,
-                                  lapack_int nb );
-lapack_int LAPACKE_ssytrs2( int matrix_order, char uplo, lapack_int n,
-                            lapack_int nrhs, const float* a, lapack_int lda,
-                            const lapack_int* ipiv, float* b, lapack_int ldb );
-lapack_int LAPACKE_ssytrs2_work( int matrix_order, char uplo, lapack_int n,
-                                 lapack_int nrhs, const float* a,
-                                 lapack_int lda, const lapack_int* ipiv,
-                                 float* b, lapack_int ldb, float* work );
-lapack_int LAPACKE_zbbcsd( int matrix_order, char jobu1, char jobu2,
-                           char jobv1t, char jobv2t, char trans, lapack_int m,
-                           lapack_int p, lapack_int q, double* theta,
-                           double* phi, lapack_complex_double* u1,
-                           lapack_int ldu1, lapack_complex_double* u2,
-                           lapack_int ldu2, lapack_complex_double* v1t,
-                           lapack_int ldv1t, lapack_complex_double* v2t,
-                           lapack_int ldv2t, double* b11d, double* b11e,
-                           double* b12d, double* b12e, double* b21d,
-                           double* b21e, double* b22d, double* b22e );
-lapack_int LAPACKE_zbbcsd_work( int matrix_order, char jobu1, char jobu2,
-                                char jobv1t, char jobv2t, char trans,
-                                lapack_int m, lapack_int p, lapack_int q,
-                                double* theta, double* phi,
-                                lapack_complex_double* u1, lapack_int ldu1,
-                                lapack_complex_double* u2, lapack_int ldu2,
-                                lapack_complex_double* v1t, lapack_int ldv1t,
-                                lapack_complex_double* v2t, lapack_int ldv2t,
-                                double* b11d, double* b11e, double* b12d,
-                                double* b12e, double* b21d, double* b21e,
-                                double* b22d, double* b22e, double* rwork,
-                                lapack_int lrwork );
-lapack_int LAPACKE_zheswapr( int matrix_order, char uplo, lapack_int n,
-                             lapack_complex_double* a, lapack_int i1,
-                             lapack_int i2 );
-lapack_int LAPACKE_zheswapr_work( int matrix_order, char uplo, lapack_int n,
-                                  lapack_complex_double* a, lapack_int i1,
-                                  lapack_int i2 );
-lapack_int LAPACKE_zhetri2( int matrix_order, char uplo, lapack_int n,
-                            lapack_complex_double* a, lapack_int lda,
-                            const lapack_int* ipiv );
-lapack_int LAPACKE_zhetri2_work( int matrix_order, char uplo, lapack_int n,
-                                 lapack_complex_double* a, lapack_int lda,
-                                 const lapack_int* ipiv,
-                                 lapack_complex_double* work, lapack_int lwork );
-lapack_int LAPACKE_zhetri2x( int matrix_order, char uplo, lapack_int n,
-                             lapack_complex_double* a, lapack_int lda,
-                             const lapack_int* ipiv, lapack_int nb );
-lapack_int LAPACKE_zhetri2x_work( int matrix_order, char uplo, lapack_int n,
-                                  lapack_complex_double* a, lapack_int lda,
-                                  const lapack_int* ipiv,
-                                  lapack_complex_double* work, lapack_int nb );
-lapack_int LAPACKE_zhetrs2( int matrix_order, char uplo, lapack_int n,
-                            lapack_int nrhs, const lapack_complex_double* a,
-                            lapack_int lda, const lapack_int* ipiv,
-                            lapack_complex_double* b, lapack_int ldb );
-lapack_int LAPACKE_zhetrs2_work( int matrix_order, char uplo, lapack_int n,
-                                 lapack_int nrhs, const lapack_complex_double* a,
-                                 lapack_int lda, const lapack_int* ipiv,
-                                 lapack_complex_double* b, lapack_int ldb,
-                                 lapack_complex_double* work );
-lapack_int LAPACKE_zsyconv( int matrix_order, char uplo, char way, lapack_int n,
-                            lapack_complex_double* a, lapack_int lda,
-                            const lapack_int* ipiv );
-lapack_int LAPACKE_zsyconv_work( int matrix_order, char uplo, char way,
-                                 lapack_int n, lapack_complex_double* a,
-                                 lapack_int lda, const lapack_int* ipiv,
-                                 lapack_complex_double* work );
-lapack_int LAPACKE_zsyswapr( int matrix_order, char uplo, lapack_int n,
-                             lapack_complex_double* a, lapack_int i1,
-                             lapack_int i2 );
-lapack_int LAPACKE_zsyswapr_work( int matrix_order, char uplo, lapack_int n,
-                                  lapack_complex_double* a, lapack_int i1,
-                                  lapack_int i2 );
-lapack_int LAPACKE_zsytri2( int matrix_order, char uplo, lapack_int n,
-                            lapack_complex_double* a, lapack_int lda,
-                            const lapack_int* ipiv );
-lapack_int LAPACKE_zsytri2_work( int matrix_order, char uplo, lapack_int n,
-                                 lapack_complex_double* a, lapack_int lda,
-                                 const lapack_int* ipiv,
-                                 lapack_complex_double* work, lapack_int lwork );
-lapack_int LAPACKE_zsytri2x( int matrix_order, char uplo, lapack_int n,
-                             lapack_complex_double* a, lapack_int lda,
-                             const lapack_int* ipiv, lapack_int nb );
-lapack_int LAPACKE_zsytri2x_work( int matrix_order, char uplo, lapack_int n,
-                                  lapack_complex_double* a, lapack_int lda,
-                                  const lapack_int* ipiv,
-                                  lapack_complex_double* work, lapack_int nb );
-lapack_int LAPACKE_zsytrs2( int matrix_order, char uplo, lapack_int n,
-                            lapack_int nrhs, const lapack_complex_double* a,
-                            lapack_int lda, const lapack_int* ipiv,
-                            lapack_complex_double* b, lapack_int ldb );
-lapack_int LAPACKE_zsytrs2_work( int matrix_order, char uplo, lapack_int n,
-                                 lapack_int nrhs, const lapack_complex_double* a,
-                                 lapack_int lda, const lapack_int* ipiv,
-                                 lapack_complex_double* b, lapack_int ldb,
-                                 lapack_complex_double* work );
-lapack_int LAPACKE_zunbdb( int matrix_order, char trans, char signs,
-                           lapack_int m, lapack_int p, lapack_int q,
-                           lapack_complex_double* x11, lapack_int ldx11,
-                           lapack_complex_double* x12, lapack_int ldx12,
-                           lapack_complex_double* x21, lapack_int ldx21,
-                           lapack_complex_double* x22, lapack_int ldx22,
-                           double* theta, double* phi,
-                           lapack_complex_double* taup1,
-                           lapack_complex_double* taup2,
-                           lapack_complex_double* tauq1,
-                           lapack_complex_double* tauq2 );
-lapack_int LAPACKE_zunbdb_work( int matrix_order, char trans, char signs,
-                                lapack_int m, lapack_int p, lapack_int q,
-                                lapack_complex_double* x11, lapack_int ldx11,
-                                lapack_complex_double* x12, lapack_int ldx12,
-                                lapack_complex_double* x21, lapack_int ldx21,
-                                lapack_complex_double* x22, lapack_int ldx22,
-                                double* theta, double* phi,
-                                lapack_complex_double* taup1,
-                                lapack_complex_double* taup2,
-                                lapack_complex_double* tauq1,
-                                lapack_complex_double* tauq2,
-                                lapack_complex_double* work, lapack_int lwork );
-lapack_int LAPACKE_zuncsd( int matrix_order, char jobu1, char jobu2,
-                           char jobv1t, char jobv2t, char trans, char signs,
-                           lapack_int m, lapack_int p, lapack_int q,
-                           lapack_complex_double* x11, lapack_int ldx11,
-                           lapack_complex_double* x12, lapack_int ldx12,
-                           lapack_complex_double* x21, lapack_int ldx21,
-                           lapack_complex_double* x22, lapack_int ldx22,
-                           double* theta, lapack_complex_double* u1,
-                           lapack_int ldu1, lapack_complex_double* u2,
-                           lapack_int ldu2, lapack_complex_double* v1t,
-                           lapack_int ldv1t, lapack_complex_double* v2t,
-                           lapack_int ldv2t );
-lapack_int LAPACKE_zuncsd_work( int matrix_order, char jobu1, char jobu2,
-                                char jobv1t, char jobv2t, char trans,
-                                char signs, lapack_int m, lapack_int p,
-                                lapack_int q, lapack_complex_double* x11,
-                                lapack_int ldx11, lapack_complex_double* x12,
-                                lapack_int ldx12, lapack_complex_double* x21,
-                                lapack_int ldx21, lapack_complex_double* x22,
-                                lapack_int ldx22, double* theta,
-                                lapack_complex_double* u1, lapack_int ldu1,
-                                lapack_complex_double* u2, lapack_int ldu2,
-                                lapack_complex_double* v1t, lapack_int ldv1t,
-                                lapack_complex_double* v2t, lapack_int ldv2t,
-                                lapack_complex_double* work, lapack_int lwork,
-                                double* rwork, lapack_int lrwork,
-                                lapack_int* iwork );
-//LAPACK 3.4.0
-lapack_int LAPACKE_sgemqrt( int matrix_order, char side, char trans,
-                            lapack_int m, lapack_int n, lapack_int k,
-                            lapack_int nb, const float* v, lapack_int ldv,
-                            const float* t, lapack_int ldt, float* c,
-                            lapack_int ldc );
-lapack_int LAPACKE_dgemqrt( int matrix_order, char side, char trans,
-                            lapack_int m, lapack_int n, lapack_int k,
-                            lapack_int nb, const double* v, lapack_int ldv,
-                            const double* t, lapack_int ldt, double* c,
-                            lapack_int ldc );
-lapack_int LAPACKE_cgemqrt( int matrix_order, char side, char trans,
-                            lapack_int m, lapack_int n, lapack_int k,
-                            lapack_int nb, const lapack_complex_float* v,
-                            lapack_int ldv, const lapack_complex_float* t,
-                            lapack_int ldt, lapack_complex_float* c,
-                            lapack_int ldc );
-lapack_int LAPACKE_zgemqrt( int matrix_order, char side, char trans,
-                            lapack_int m, lapack_int n, lapack_int k,
-                            lapack_int nb, const lapack_complex_double* v,
-                            lapack_int ldv, const lapack_complex_double* t,
-                            lapack_int ldt, lapack_complex_double* c,
-                            lapack_int ldc );
+lapack_int LAPACKE_cungrq_work(int matrix_order, lapack_int m, lapack_int n, lapack_int k, lapack_complex_float* a,
+                               lapack_int lda, const lapack_complex_float* tau, lapack_complex_float* work,
+                               lapack_int lwork);
+lapack_int LAPACKE_zungrq_work(int matrix_order, lapack_int m, lapack_int n, lapack_int k, lapack_complex_double* a,
+                               lapack_int lda, const lapack_complex_double* tau, lapack_complex_double* work,
+                               lapack_int lwork);
 
-lapack_int LAPACKE_sgeqrt( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int nb, float* a, lapack_int lda, float* t,
-                           lapack_int ldt );
-lapack_int LAPACKE_dgeqrt( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int nb, double* a, lapack_int lda, double* t,
-                           lapack_int ldt );
-lapack_int LAPACKE_cgeqrt( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int nb, lapack_complex_float* a,
-                           lapack_int lda, lapack_complex_float* t,
-                           lapack_int ldt );
-lapack_int LAPACKE_zgeqrt( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int nb, lapack_complex_double* a,
-                           lapack_int lda, lapack_complex_double* t,
-                           lapack_int ldt );
+lapack_int LAPACKE_cungtr_work(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                               const lapack_complex_float* tau, lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_zungtr_work(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                               const lapack_complex_double* tau, lapack_complex_double* work, lapack_int lwork);
 
-lapack_int LAPACKE_sgeqrt2( int matrix_order, lapack_int m, lapack_int n,
-                            float* a, lapack_int lda, float* t,
-                            lapack_int ldt );
-lapack_int LAPACKE_dgeqrt2( int matrix_order, lapack_int m, lapack_int n,
-                            double* a, lapack_int lda, double* t,
-                            lapack_int ldt );
-lapack_int LAPACKE_cgeqrt2( int matrix_order, lapack_int m, lapack_int n,
-                            lapack_complex_float* a, lapack_int lda,
-                            lapack_complex_float* t, lapack_int ldt );
-lapack_int LAPACKE_zgeqrt2( int matrix_order, lapack_int m, lapack_int n,
-                            lapack_complex_double* a, lapack_int lda,
-                            lapack_complex_double* t, lapack_int ldt );
+lapack_int LAPACKE_cunmbr_work(int matrix_order, char vect, char side, char trans, lapack_int m, lapack_int n,
+                               lapack_int k, const lapack_complex_float* a, lapack_int lda,
+                               const lapack_complex_float* tau, lapack_complex_float* c, lapack_int ldc,
+                               lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_zunmbr_work(int matrix_order, char vect, char side, char trans, lapack_int m, lapack_int n,
+                               lapack_int k, const lapack_complex_double* a, lapack_int lda,
+                               const lapack_complex_double* tau, lapack_complex_double* c, lapack_int ldc,
+                               lapack_complex_double* work, lapack_int lwork);
 
-lapack_int LAPACKE_sgeqrt3( int matrix_order, lapack_int m, lapack_int n,
-                            float* a, lapack_int lda, float* t,
-                            lapack_int ldt );
-lapack_int LAPACKE_dgeqrt3( int matrix_order, lapack_int m, lapack_int n,
-                            double* a, lapack_int lda, double* t,
-                            lapack_int ldt );
-lapack_int LAPACKE_cgeqrt3( int matrix_order, lapack_int m, lapack_int n,
-                            lapack_complex_float* a, lapack_int lda,
-                            lapack_complex_float* t, lapack_int ldt );
-lapack_int LAPACKE_zgeqrt3( int matrix_order, lapack_int m, lapack_int n,
-                            lapack_complex_double* a, lapack_int lda,
-                            lapack_complex_double* t, lapack_int ldt );
+lapack_int LAPACKE_cunmhr_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int ilo,
+                               lapack_int ihi, const lapack_complex_float* a, lapack_int lda,
+                               const lapack_complex_float* tau, lapack_complex_float* c, lapack_int ldc,
+                               lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_zunmhr_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int ilo,
+                               lapack_int ihi, const lapack_complex_double* a, lapack_int lda,
+                               const lapack_complex_double* tau, lapack_complex_double* c, lapack_int ldc,
+                               lapack_complex_double* work, lapack_int lwork);
 
-lapack_int LAPACKE_stpmqrt( int matrix_order, char side, char trans,
-                            lapack_int m, lapack_int n, lapack_int k,
-                            lapack_int l, lapack_int nb, const float* v,
-                            lapack_int ldv, const float* t, lapack_int ldt,
-                            float* a, lapack_int lda, float* b,
-                            lapack_int ldb );
-lapack_int LAPACKE_dtpmqrt( int matrix_order, char side, char trans,
-                            lapack_int m, lapack_int n, lapack_int k,
-                            lapack_int l, lapack_int nb, const double* v,
-                            lapack_int ldv, const double* t, lapack_int ldt,
-                            double* a, lapack_int lda, double* b,
-                            lapack_int ldb );
-lapack_int LAPACKE_ctpmqrt( int matrix_order, char side, char trans,
-                            lapack_int m, lapack_int n, lapack_int k,
-                            lapack_int l, lapack_int nb,
-                            const lapack_complex_float* v, lapack_int ldv,
-                            const lapack_complex_float* t, lapack_int ldt,
-                            lapack_complex_float* a, lapack_int lda,
-                            lapack_complex_float* b, lapack_int ldb );
-lapack_int LAPACKE_ztpmqrt( int matrix_order, char side, char trans,
-                            lapack_int m, lapack_int n, lapack_int k,
-                            lapack_int l, lapack_int nb,
-                            const lapack_complex_double* v, lapack_int ldv,
-                            const lapack_complex_double* t, lapack_int ldt,
-                            lapack_complex_double* a, lapack_int lda,
-                            lapack_complex_double* b, lapack_int ldb );
+lapack_int LAPACKE_cunmlq_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                               const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* tau,
+                               lapack_complex_float* c, lapack_int ldc, lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_zunmlq_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                               const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* tau,
+                               lapack_complex_double* c, lapack_int ldc, lapack_complex_double* work, lapack_int lwork);
 
-lapack_int LAPACKE_dtpqrt( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int l, lapack_int nb, double* a,
-                           lapack_int lda, double* b, lapack_int ldb, double* t,
-                           lapack_int ldt );
-lapack_int LAPACKE_ctpqrt( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int l, lapack_int nb, lapack_complex_float* a,
-                           lapack_int lda, lapack_complex_float* t,
-                           lapack_complex_float* b, lapack_int ldb,
-                           lapack_int ldt );
-lapack_int LAPACKE_ztpqrt( int matrix_order, lapack_int m, lapack_int n,
-                           lapack_int l, lapack_int nb,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_complex_double* b, lapack_int ldb,
-                           lapack_complex_double* t, lapack_int ldt );
+lapack_int LAPACKE_cunmql_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                               const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* tau,
+                               lapack_complex_float* c, lapack_int ldc, lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_zunmql_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                               const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* tau,
+                               lapack_complex_double* c, lapack_int ldc, lapack_complex_double* work, lapack_int lwork);
 
-lapack_int LAPACKE_stpqrt2( int matrix_order, lapack_int m, lapack_int n,
-                            float* a, lapack_int lda, float* b, lapack_int ldb,
-                            float* t, lapack_int ldt );
-lapack_int LAPACKE_dtpqrt2( int matrix_order, lapack_int m, lapack_int n,
-                            double* a, lapack_int lda, double* b,
-                            lapack_int ldb, double* t, lapack_int ldt );
-lapack_int LAPACKE_ctpqrt2( int matrix_order, lapack_int m, lapack_int n,
-                            lapack_complex_float* a, lapack_int lda,
-                            lapack_complex_float* b, lapack_int ldb,
-                            lapack_complex_float* t, lapack_int ldt );
-lapack_int LAPACKE_ztpqrt2( int matrix_order, lapack_int m, lapack_int n,
-                            lapack_complex_double* a, lapack_int lda,
-                            lapack_complex_double* b, lapack_int ldb,
-                            lapack_complex_double* t, lapack_int ldt );
+lapack_int LAPACKE_cunmqr_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                               const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* tau,
+                               lapack_complex_float* c, lapack_int ldc, lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_zunmqr_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                               const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* tau,
+                               lapack_complex_double* c, lapack_int ldc, lapack_complex_double* work, lapack_int lwork);
 
-lapack_int LAPACKE_stprfb( int matrix_order, char side, char trans, char direct,
-                           char storev, lapack_int m, lapack_int n,
-                           lapack_int k, lapack_int l, const float* v,
-                           lapack_int ldv, const float* t, lapack_int ldt,
-                           float* a, lapack_int lda, float* b, lapack_int ldb,
-                           lapack_int myldwork );
-lapack_int LAPACKE_dtprfb( int matrix_order, char side, char trans, char direct,
-                           char storev, lapack_int m, lapack_int n,
-                           lapack_int k, lapack_int l, const double* v,
-                           lapack_int ldv, const double* t, lapack_int ldt,
-                           double* a, lapack_int lda, double* b, lapack_int ldb,
-                           lapack_int myldwork );
-lapack_int LAPACKE_ctprfb( int matrix_order, char side, char trans, char direct,
-                           char storev, lapack_int m, lapack_int n,
-                           lapack_int k, lapack_int l,
-                           const lapack_complex_float* v, lapack_int ldv,
-                           const lapack_complex_float* t, lapack_int ldt,
-                           lapack_complex_float* a, lapack_int lda,
-                           lapack_complex_float* b, lapack_int ldb,
-                           lapack_int myldwork );
-lapack_int LAPACKE_ztprfb( int matrix_order, char side, char trans, char direct,
-                           char storev, lapack_int m, lapack_int n,
-                           lapack_int k, lapack_int l,
-                           const lapack_complex_double* v, lapack_int ldv,
-                           const lapack_complex_double* t, lapack_int ldt,
-                           lapack_complex_double* a, lapack_int lda,
-                           lapack_complex_double* b, lapack_int ldb,
-                           lapack_int myldwork );
+lapack_int LAPACKE_cunmrq_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                               const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* tau,
+                               lapack_complex_float* c, lapack_int ldc, lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_zunmrq_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                               const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* tau,
+                               lapack_complex_double* c, lapack_int ldc, lapack_complex_double* work, lapack_int lwork);
 
-lapack_int LAPACKE_sgemqrt_work( int matrix_order, char side, char trans,
-                                 lapack_int m, lapack_int n, lapack_int k,
-                                 lapack_int nb, const float* v, lapack_int ldv,
-                                 const float* t, lapack_int ldt, float* c,
-                                 lapack_int ldc, float* work );
-lapack_int LAPACKE_dgemqrt_work( int matrix_order, char side, char trans,
-                                 lapack_int m, lapack_int n, lapack_int k,
-                                 lapack_int nb, const double* v, lapack_int ldv,
-                                 const double* t, lapack_int ldt, double* c,
-                                 lapack_int ldc, double* work );
-lapack_int LAPACKE_cgemqrt_work( int matrix_order, char side, char trans,
-                                 lapack_int m, lapack_int n, lapack_int k,
-                                 lapack_int nb, const lapack_complex_float* v,
-                                 lapack_int ldv, const lapack_complex_float* t,
-                                 lapack_int ldt, lapack_complex_float* c,
-                                 lapack_int ldc, lapack_complex_float* work );
-lapack_int LAPACKE_zgemqrt_work( int matrix_order, char side, char trans,
-                                 lapack_int m, lapack_int n, lapack_int k,
-                                 lapack_int nb, const lapack_complex_double* v,
-                                 lapack_int ldv, const lapack_complex_double* t,
-                                 lapack_int ldt, lapack_complex_double* c,
-                                 lapack_int ldc, lapack_complex_double* work );
+lapack_int LAPACKE_cunmrz_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                               lapack_int l, const lapack_complex_float* a, lapack_int lda,
+                               const lapack_complex_float* tau, lapack_complex_float* c, lapack_int ldc,
+                               lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_zunmrz_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                               lapack_int l, const lapack_complex_double* a, lapack_int lda,
+                               const lapack_complex_double* tau, lapack_complex_double* c, lapack_int ldc,
+                               lapack_complex_double* work, lapack_int lwork);
 
-lapack_int LAPACKE_sgeqrt_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int nb, float* a, lapack_int lda,
-                                float* t, lapack_int ldt, float* work );
-lapack_int LAPACKE_dgeqrt_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int nb, double* a, lapack_int lda,
-                                double* t, lapack_int ldt, double* work );
-lapack_int LAPACKE_cgeqrt_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int nb, lapack_complex_float* a,
-                                lapack_int lda, lapack_complex_float* t,
-                                lapack_int ldt, lapack_complex_float* work );
-lapack_int LAPACKE_zgeqrt_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int nb, lapack_complex_double* a,
-                                lapack_int lda, lapack_complex_double* t,
-                                lapack_int ldt, lapack_complex_double* work );
+lapack_int LAPACKE_cunmtr_work(int matrix_order, char side, char uplo, char trans, lapack_int m, lapack_int n,
+                               const lapack_complex_float* a, lapack_int lda, const lapack_complex_float* tau,
+                               lapack_complex_float* c, lapack_int ldc, lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_zunmtr_work(int matrix_order, char side, char uplo, char trans, lapack_int m, lapack_int n,
+                               const lapack_complex_double* a, lapack_int lda, const lapack_complex_double* tau,
+                               lapack_complex_double* c, lapack_int ldc, lapack_complex_double* work, lapack_int lwork);
 
-lapack_int LAPACKE_sgeqrt2_work( int matrix_order, lapack_int m, lapack_int n,
-                                 float* a, lapack_int lda, float* t,
-                                 lapack_int ldt );
-lapack_int LAPACKE_dgeqrt2_work( int matrix_order, lapack_int m, lapack_int n,
-                                 double* a, lapack_int lda, double* t,
-                                 lapack_int ldt );
-lapack_int LAPACKE_cgeqrt2_work( int matrix_order, lapack_int m, lapack_int n,
-                                 lapack_complex_float* a, lapack_int lda,
-                                 lapack_complex_float* t, lapack_int ldt );
-lapack_int LAPACKE_zgeqrt2_work( int matrix_order, lapack_int m, lapack_int n,
-                                 lapack_complex_double* a, lapack_int lda,
-                                 lapack_complex_double* t, lapack_int ldt );
+lapack_int LAPACKE_cupgtr_work(int matrix_order, char uplo, lapack_int n, const lapack_complex_float* ap,
+                               const lapack_complex_float* tau, lapack_complex_float* q, lapack_int ldq,
+                               lapack_complex_float* work);
+lapack_int LAPACKE_zupgtr_work(int matrix_order, char uplo, lapack_int n, const lapack_complex_double* ap,
+                               const lapack_complex_double* tau, lapack_complex_double* q, lapack_int ldq,
+                               lapack_complex_double* work);
 
-lapack_int LAPACKE_sgeqrt3_work( int matrix_order, lapack_int m, lapack_int n,
-                                 float* a, lapack_int lda, float* t,
-                                 lapack_int ldt );
-lapack_int LAPACKE_dgeqrt3_work( int matrix_order, lapack_int m, lapack_int n,
-                                 double* a, lapack_int lda, double* t,
-                                 lapack_int ldt );
-lapack_int LAPACKE_cgeqrt3_work( int matrix_order, lapack_int m, lapack_int n,
-                                 lapack_complex_float* a, lapack_int lda,
-                                 lapack_complex_float* t, lapack_int ldt );
-lapack_int LAPACKE_zgeqrt3_work( int matrix_order, lapack_int m, lapack_int n,
-                                 lapack_complex_double* a, lapack_int lda,
-                                 lapack_complex_double* t, lapack_int ldt );
+lapack_int LAPACKE_cupmtr_work(int matrix_order, char side, char uplo, char trans, lapack_int m, lapack_int n,
+                               const lapack_complex_float* ap, const lapack_complex_float* tau, lapack_complex_float* c,
+                               lapack_int ldc, lapack_complex_float* work);
+lapack_int LAPACKE_zupmtr_work(int matrix_order, char side, char uplo, char trans, lapack_int m, lapack_int n,
+                               const lapack_complex_double* ap, const lapack_complex_double* tau,
+                               lapack_complex_double* c, lapack_int ldc, lapack_complex_double* work);
 
-lapack_int LAPACKE_stpmqrt_work( int matrix_order, char side, char trans,
-                                 lapack_int m, lapack_int n, lapack_int k,
-                                 lapack_int l, lapack_int nb, const float* v,
-                                 lapack_int ldv, const float* t, lapack_int ldt,
-                                 float* a, lapack_int lda, float* b,
-                                 lapack_int ldb, float* work );
-lapack_int LAPACKE_dtpmqrt_work( int matrix_order, char side, char trans,
-                                 lapack_int m, lapack_int n, lapack_int k,
-                                 lapack_int l, lapack_int nb, const double* v,
-                                 lapack_int ldv, const double* t,
-                                 lapack_int ldt, double* a, lapack_int lda,
-                                 double* b, lapack_int ldb, double* work );
-lapack_int LAPACKE_ctpmqrt_work( int matrix_order, char side, char trans,
-                                 lapack_int m, lapack_int n, lapack_int k,
-                                 lapack_int l, lapack_int nb,
-                                 const lapack_complex_float* v, lapack_int ldv,
-                                 const lapack_complex_float* t, lapack_int ldt,
-                                 lapack_complex_float* a, lapack_int lda,
-                                 lapack_complex_float* b, lapack_int ldb,
-                                 lapack_complex_float* work );
-lapack_int LAPACKE_ztpmqrt_work( int matrix_order, char side, char trans,
-                                 lapack_int m, lapack_int n, lapack_int k,
-                                 lapack_int l, lapack_int nb,
-                                 const lapack_complex_double* v, lapack_int ldv,
-                                 const lapack_complex_double* t, lapack_int ldt,
-                                 lapack_complex_double* a, lapack_int lda,
-                                 lapack_complex_double* b, lapack_int ldb,
-                                 lapack_complex_double* work );
+lapack_int LAPACKE_claghe(int matrix_order, lapack_int n, lapack_int k, const float* d, lapack_complex_float* a,
+                          lapack_int lda, lapack_int* iseed);
+lapack_int LAPACKE_zlaghe(int matrix_order, lapack_int n, lapack_int k, const double* d, lapack_complex_double* a,
+                          lapack_int lda, lapack_int* iseed);
 
-lapack_int LAPACKE_dtpqrt_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int l, lapack_int nb, double* a,
-                                lapack_int lda, double* b, lapack_int ldb,
-                                double* t, lapack_int ldt, double* work );
-lapack_int LAPACKE_ctpqrt_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int l, lapack_int nb,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_complex_float* t,
-                                lapack_complex_float* b, lapack_int ldb,
-                                lapack_int ldt, lapack_complex_float* work );
-lapack_int LAPACKE_ztpqrt_work( int matrix_order, lapack_int m, lapack_int n,
-                                lapack_int l, lapack_int nb,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_complex_double* b, lapack_int ldb,
-                                lapack_complex_double* t, lapack_int ldt,
-                                lapack_complex_double* work );
+lapack_int LAPACKE_slagsy(int matrix_order, lapack_int n, lapack_int k, const float* d, float* a, lapack_int lda,
+                          lapack_int* iseed);
+lapack_int LAPACKE_dlagsy(int matrix_order, lapack_int n, lapack_int k, const double* d, double* a, lapack_int lda,
+                          lapack_int* iseed);
+lapack_int LAPACKE_clagsy(int matrix_order, lapack_int n, lapack_int k, const float* d, lapack_complex_float* a,
+                          lapack_int lda, lapack_int* iseed);
+lapack_int LAPACKE_zlagsy(int matrix_order, lapack_int n, lapack_int k, const double* d, lapack_complex_double* a,
+                          lapack_int lda, lapack_int* iseed);
 
-lapack_int LAPACKE_stpqrt2_work( int matrix_order, lapack_int m, lapack_int n,
-                                 float* a, lapack_int lda, float* b,
-                                 lapack_int ldb, float* t, lapack_int ldt );
-lapack_int LAPACKE_dtpqrt2_work( int matrix_order, lapack_int m, lapack_int n,
-                                 double* a, lapack_int lda, double* b,
-                                 lapack_int ldb, double* t, lapack_int ldt );
-lapack_int LAPACKE_ctpqrt2_work( int matrix_order, lapack_int m, lapack_int n,
-                                 lapack_complex_float* a, lapack_int lda,
-                                 lapack_complex_float* b, lapack_int ldb,
-                                 lapack_complex_float* t, lapack_int ldt );
-lapack_int LAPACKE_ztpqrt2_work( int matrix_order, lapack_int m, lapack_int n,
-                                 lapack_complex_double* a, lapack_int lda,
-                                 lapack_complex_double* b, lapack_int ldb,
-                                 lapack_complex_double* t, lapack_int ldt );
+lapack_int LAPACKE_slapmr(int matrix_order, lapack_logical forwrd, lapack_int m, lapack_int n, float* x, lapack_int ldx,
+                          lapack_int* k);
+lapack_int LAPACKE_dlapmr(int matrix_order, lapack_logical forwrd, lapack_int m, lapack_int n, double* x,
+                          lapack_int ldx, lapack_int* k);
+lapack_int LAPACKE_clapmr(int matrix_order, lapack_logical forwrd, lapack_int m, lapack_int n, lapack_complex_float* x,
+                          lapack_int ldx, lapack_int* k);
+lapack_int LAPACKE_zlapmr(int matrix_order, lapack_logical forwrd, lapack_int m, lapack_int n, lapack_complex_double* x,
+                          lapack_int ldx, lapack_int* k);
 
-lapack_int LAPACKE_stprfb_work( int matrix_order, char side, char trans,
-                                char direct, char storev, lapack_int m,
-                                lapack_int n, lapack_int k, lapack_int l,
-                                const float* v, lapack_int ldv, const float* t,
-                                lapack_int ldt, float* a, lapack_int lda,
-                                float* b, lapack_int ldb, const float* mywork,
-                                lapack_int myldwork );
-lapack_int LAPACKE_dtprfb_work( int matrix_order, char side, char trans,
-                                char direct, char storev, lapack_int m,
-                                lapack_int n, lapack_int k, lapack_int l,
-                                const double* v, lapack_int ldv,
-                                const double* t, lapack_int ldt, double* a,
-                                lapack_int lda, double* b, lapack_int ldb,
-                                const double* mywork, lapack_int myldwork );
-lapack_int LAPACKE_ctprfb_work( int matrix_order, char side, char trans,
-                                char direct, char storev, lapack_int m,
-                                lapack_int n, lapack_int k, lapack_int l,
-                                const lapack_complex_float* v, lapack_int ldv,
-                                const lapack_complex_float* t, lapack_int ldt,
-                                lapack_complex_float* a, lapack_int lda,
-                                lapack_complex_float* b, lapack_int ldb,
-                                const float* mywork, lapack_int myldwork );
-lapack_int LAPACKE_ztprfb_work( int matrix_order, char side, char trans,
-                                char direct, char storev, lapack_int m,
-                                lapack_int n, lapack_int k, lapack_int l,
-                                const lapack_complex_double* v, lapack_int ldv,
-                                const lapack_complex_double* t, lapack_int ldt,
-                                lapack_complex_double* a, lapack_int lda,
-                                lapack_complex_double* b, lapack_int ldb,
-                                const double* mywork, lapack_int myldwork );
-//LAPACK 3.X.X
-lapack_int LAPACKE_csyr( int matrix_order, char uplo, lapack_int n,
-                             lapack_complex_float alpha,
-                             const lapack_complex_float* x, lapack_int incx,
-                             lapack_complex_float* a, lapack_int lda );
-lapack_int LAPACKE_zsyr( int matrix_order, char uplo, lapack_int n,
-                             lapack_complex_double alpha,
-                             const lapack_complex_double* x, lapack_int incx,
-                             lapack_complex_double* a, lapack_int lda );
+float LAPACKE_slapy2(float x, float y);
+double LAPACKE_dlapy2(double x, double y);
 
-lapack_int LAPACKE_csyr_work( int matrix_order, char uplo, lapack_int n,
-                                  lapack_complex_float alpha,
-                                  const lapack_complex_float* x,
-                                  lapack_int incx, lapack_complex_float* a,
-                                  lapack_int lda );
-lapack_int LAPACKE_zsyr_work( int matrix_order, char uplo, lapack_int n,
-                                  lapack_complex_double alpha,
-                                  const lapack_complex_double* x,
-                                  lapack_int incx, lapack_complex_double* a,
-                                  lapack_int lda );
+float LAPACKE_slapy3(float x, float y, float z);
+double LAPACKE_dlapy3(double x, double y, double z);
 
+lapack_int LAPACKE_slartgp(float f, float g, float* cs, float* sn, float* r);
+lapack_int LAPACKE_dlartgp(double f, double g, double* cs, double* sn, double* r);
 
+lapack_int LAPACKE_slartgs(float x, float y, float sigma, float* cs, float* sn);
+lapack_int LAPACKE_dlartgs(double x, double y, double sigma, double* cs, double* sn);
 
-#define LAPACK_sgetrf LAPACK_GLOBAL(sgetrf,SGETRF)
-#define LAPACK_dgetrf LAPACK_GLOBAL(dgetrf,DGETRF)
-#define LAPACK_cgetrf LAPACK_GLOBAL(cgetrf,CGETRF)
-#define LAPACK_zgetrf LAPACK_GLOBAL(zgetrf,ZGETRF)
-#define LAPACK_sgbtrf LAPACK_GLOBAL(sgbtrf,SGBTRF)
-#define LAPACK_dgbtrf LAPACK_GLOBAL(dgbtrf,DGBTRF)
-#define LAPACK_cgbtrf LAPACK_GLOBAL(cgbtrf,CGBTRF)
-#define LAPACK_zgbtrf LAPACK_GLOBAL(zgbtrf,ZGBTRF)
-#define LAPACK_sgttrf LAPACK_GLOBAL(sgttrf,SGTTRF)
-#define LAPACK_dgttrf LAPACK_GLOBAL(dgttrf,DGTTRF)
-#define LAPACK_cgttrf LAPACK_GLOBAL(cgttrf,CGTTRF)
-#define LAPACK_zgttrf LAPACK_GLOBAL(zgttrf,ZGTTRF)
-#define LAPACK_spotrf LAPACK_GLOBAL(spotrf,SPOTRF)
-#define LAPACK_dpotrf LAPACK_GLOBAL(dpotrf,DPOTRF)
-#define LAPACK_cpotrf LAPACK_GLOBAL(cpotrf,CPOTRF)
-#define LAPACK_zpotrf LAPACK_GLOBAL(zpotrf,ZPOTRF)
-#define LAPACK_dpstrf LAPACK_GLOBAL(dpstrf,DPSTRF)
-#define LAPACK_spstrf LAPACK_GLOBAL(spstrf,SPSTRF)
-#define LAPACK_zpstrf LAPACK_GLOBAL(zpstrf,ZPSTRF)
-#define LAPACK_cpstrf LAPACK_GLOBAL(cpstrf,CPSTRF)
-#define LAPACK_dpftrf LAPACK_GLOBAL(dpftrf,DPFTRF)
-#define LAPACK_spftrf LAPACK_GLOBAL(spftrf,SPFTRF)
-#define LAPACK_zpftrf LAPACK_GLOBAL(zpftrf,ZPFTRF)
-#define LAPACK_cpftrf LAPACK_GLOBAL(cpftrf,CPFTRF)
-#define LAPACK_spptrf LAPACK_GLOBAL(spptrf,SPPTRF)
-#define LAPACK_dpptrf LAPACK_GLOBAL(dpptrf,DPPTRF)
-#define LAPACK_cpptrf LAPACK_GLOBAL(cpptrf,CPPTRF)
-#define LAPACK_zpptrf LAPACK_GLOBAL(zpptrf,ZPPTRF)
-#define LAPACK_spbtrf LAPACK_GLOBAL(spbtrf,SPBTRF)
-#define LAPACK_dpbtrf LAPACK_GLOBAL(dpbtrf,DPBTRF)
-#define LAPACK_cpbtrf LAPACK_GLOBAL(cpbtrf,CPBTRF)
-#define LAPACK_zpbtrf LAPACK_GLOBAL(zpbtrf,ZPBTRF)
-#define LAPACK_spttrf LAPACK_GLOBAL(spttrf,SPTTRF)
-#define LAPACK_dpttrf LAPACK_GLOBAL(dpttrf,DPTTRF)
-#define LAPACK_cpttrf LAPACK_GLOBAL(cpttrf,CPTTRF)
-#define LAPACK_zpttrf LAPACK_GLOBAL(zpttrf,ZPTTRF)
-#define LAPACK_ssytrf LAPACK_GLOBAL(ssytrf,SSYTRF)
-#define LAPACK_dsytrf LAPACK_GLOBAL(dsytrf,DSYTRF)
-#define LAPACK_csytrf LAPACK_GLOBAL(csytrf,CSYTRF)
-#define LAPACK_zsytrf LAPACK_GLOBAL(zsytrf,ZSYTRF)
-#define LAPACK_chetrf LAPACK_GLOBAL(chetrf,CHETRF)
-#define LAPACK_zhetrf LAPACK_GLOBAL(zhetrf,ZHETRF)
-#define LAPACK_ssptrf LAPACK_GLOBAL(ssptrf,SSPTRF)
-#define LAPACK_dsptrf LAPACK_GLOBAL(dsptrf,DSPTRF)
-#define LAPACK_csptrf LAPACK_GLOBAL(csptrf,CSPTRF)
-#define LAPACK_zsptrf LAPACK_GLOBAL(zsptrf,ZSPTRF)
-#define LAPACK_chptrf LAPACK_GLOBAL(chptrf,CHPTRF)
-#define LAPACK_zhptrf LAPACK_GLOBAL(zhptrf,ZHPTRF)
-#define LAPACK_sgetrs LAPACK_GLOBAL(sgetrs,SGETRS)
-#define LAPACK_dgetrs LAPACK_GLOBAL(dgetrs,DGETRS)
-#define LAPACK_cgetrs LAPACK_GLOBAL(cgetrs,CGETRS)
-#define LAPACK_zgetrs LAPACK_GLOBAL(zgetrs,ZGETRS)
-#define LAPACK_sgbtrs LAPACK_GLOBAL(sgbtrs,SGBTRS)
-#define LAPACK_dgbtrs LAPACK_GLOBAL(dgbtrs,DGBTRS)
-#define LAPACK_cgbtrs LAPACK_GLOBAL(cgbtrs,CGBTRS)
-#define LAPACK_zgbtrs LAPACK_GLOBAL(zgbtrs,ZGBTRS)
-#define LAPACK_sgttrs LAPACK_GLOBAL(sgttrs,SGTTRS)
-#define LAPACK_dgttrs LAPACK_GLOBAL(dgttrs,DGTTRS)
-#define LAPACK_cgttrs LAPACK_GLOBAL(cgttrs,CGTTRS)
-#define LAPACK_zgttrs LAPACK_GLOBAL(zgttrs,ZGTTRS)
-#define LAPACK_spotrs LAPACK_GLOBAL(spotrs,SPOTRS)
-#define LAPACK_dpotrs LAPACK_GLOBAL(dpotrs,DPOTRS)
-#define LAPACK_cpotrs LAPACK_GLOBAL(cpotrs,CPOTRS)
-#define LAPACK_zpotrs LAPACK_GLOBAL(zpotrs,ZPOTRS)
-#define LAPACK_dpftrs LAPACK_GLOBAL(dpftrs,DPFTRS)
-#define LAPACK_spftrs LAPACK_GLOBAL(spftrs,SPFTRS)
-#define LAPACK_zpftrs LAPACK_GLOBAL(zpftrs,ZPFTRS)
-#define LAPACK_cpftrs LAPACK_GLOBAL(cpftrs,CPFTRS)
-#define LAPACK_spptrs LAPACK_GLOBAL(spptrs,SPPTRS)
-#define LAPACK_dpptrs LAPACK_GLOBAL(dpptrs,DPPTRS)
-#define LAPACK_cpptrs LAPACK_GLOBAL(cpptrs,CPPTRS)
-#define LAPACK_zpptrs LAPACK_GLOBAL(zpptrs,ZPPTRS)
-#define LAPACK_spbtrs LAPACK_GLOBAL(spbtrs,SPBTRS)
-#define LAPACK_dpbtrs LAPACK_GLOBAL(dpbtrs,DPBTRS)
-#define LAPACK_cpbtrs LAPACK_GLOBAL(cpbtrs,CPBTRS)
-#define LAPACK_zpbtrs LAPACK_GLOBAL(zpbtrs,ZPBTRS)
-#define LAPACK_spttrs LAPACK_GLOBAL(spttrs,SPTTRS)
-#define LAPACK_dpttrs LAPACK_GLOBAL(dpttrs,DPTTRS)
-#define LAPACK_cpttrs LAPACK_GLOBAL(cpttrs,CPTTRS)
-#define LAPACK_zpttrs LAPACK_GLOBAL(zpttrs,ZPTTRS)
-#define LAPACK_ssytrs LAPACK_GLOBAL(ssytrs,SSYTRS)
-#define LAPACK_dsytrs LAPACK_GLOBAL(dsytrs,DSYTRS)
-#define LAPACK_csytrs LAPACK_GLOBAL(csytrs,CSYTRS)
-#define LAPACK_zsytrs LAPACK_GLOBAL(zsytrs,ZSYTRS)
-#define LAPACK_chetrs LAPACK_GLOBAL(chetrs,CHETRS)
-#define LAPACK_zhetrs LAPACK_GLOBAL(zhetrs,ZHETRS)
-#define LAPACK_ssptrs LAPACK_GLOBAL(ssptrs,SSPTRS)
-#define LAPACK_dsptrs LAPACK_GLOBAL(dsptrs,DSPTRS)
-#define LAPACK_csptrs LAPACK_GLOBAL(csptrs,CSPTRS)
-#define LAPACK_zsptrs LAPACK_GLOBAL(zsptrs,ZSPTRS)
-#define LAPACK_chptrs LAPACK_GLOBAL(chptrs,CHPTRS)
-#define LAPACK_zhptrs LAPACK_GLOBAL(zhptrs,ZHPTRS)
-#define LAPACK_strtrs LAPACK_GLOBAL(strtrs,STRTRS)
-#define LAPACK_dtrtrs LAPACK_GLOBAL(dtrtrs,DTRTRS)
-#define LAPACK_ctrtrs LAPACK_GLOBAL(ctrtrs,CTRTRS)
-#define LAPACK_ztrtrs LAPACK_GLOBAL(ztrtrs,ZTRTRS)
-#define LAPACK_stptrs LAPACK_GLOBAL(stptrs,STPTRS)
-#define LAPACK_dtptrs LAPACK_GLOBAL(dtptrs,DTPTRS)
-#define LAPACK_ctptrs LAPACK_GLOBAL(ctptrs,CTPTRS)
-#define LAPACK_ztptrs LAPACK_GLOBAL(ztptrs,ZTPTRS)
-#define LAPACK_stbtrs LAPACK_GLOBAL(stbtrs,STBTRS)
-#define LAPACK_dtbtrs LAPACK_GLOBAL(dtbtrs,DTBTRS)
-#define LAPACK_ctbtrs LAPACK_GLOBAL(ctbtrs,CTBTRS)
-#define LAPACK_ztbtrs LAPACK_GLOBAL(ztbtrs,ZTBTRS)
-#define LAPACK_sgecon LAPACK_GLOBAL(sgecon,SGECON)
-#define LAPACK_dgecon LAPACK_GLOBAL(dgecon,DGECON)
-#define LAPACK_cgecon LAPACK_GLOBAL(cgecon,CGECON)
-#define LAPACK_zgecon LAPACK_GLOBAL(zgecon,ZGECON)
-#define LAPACK_sgbcon LAPACK_GLOBAL(sgbcon,SGBCON)
-#define LAPACK_dgbcon LAPACK_GLOBAL(dgbcon,DGBCON)
-#define LAPACK_cgbcon LAPACK_GLOBAL(cgbcon,CGBCON)
-#define LAPACK_zgbcon LAPACK_GLOBAL(zgbcon,ZGBCON)
-#define LAPACK_sgtcon LAPACK_GLOBAL(sgtcon,SGTCON)
-#define LAPACK_dgtcon LAPACK_GLOBAL(dgtcon,DGTCON)
-#define LAPACK_cgtcon LAPACK_GLOBAL(cgtcon,CGTCON)
-#define LAPACK_zgtcon LAPACK_GLOBAL(zgtcon,ZGTCON)
-#define LAPACK_spocon LAPACK_GLOBAL(spocon,SPOCON)
-#define LAPACK_dpocon LAPACK_GLOBAL(dpocon,DPOCON)
-#define LAPACK_cpocon LAPACK_GLOBAL(cpocon,CPOCON)
-#define LAPACK_zpocon LAPACK_GLOBAL(zpocon,ZPOCON)
-#define LAPACK_sppcon LAPACK_GLOBAL(sppcon,SPPCON)
-#define LAPACK_dppcon LAPACK_GLOBAL(dppcon,DPPCON)
-#define LAPACK_cppcon LAPACK_GLOBAL(cppcon,CPPCON)
-#define LAPACK_zppcon LAPACK_GLOBAL(zppcon,ZPPCON)
-#define LAPACK_spbcon LAPACK_GLOBAL(spbcon,SPBCON)
-#define LAPACK_dpbcon LAPACK_GLOBAL(dpbcon,DPBCON)
-#define LAPACK_cpbcon LAPACK_GLOBAL(cpbcon,CPBCON)
-#define LAPACK_zpbcon LAPACK_GLOBAL(zpbcon,ZPBCON)
-#define LAPACK_sptcon LAPACK_GLOBAL(sptcon,SPTCON)
-#define LAPACK_dptcon LAPACK_GLOBAL(dptcon,DPTCON)
-#define LAPACK_cptcon LAPACK_GLOBAL(cptcon,CPTCON)
-#define LAPACK_zptcon LAPACK_GLOBAL(zptcon,ZPTCON)
-#define LAPACK_ssycon LAPACK_GLOBAL(ssycon,SSYCON)
-#define LAPACK_dsycon LAPACK_GLOBAL(dsycon,DSYCON)
-#define LAPACK_csycon LAPACK_GLOBAL(csycon,CSYCON)
-#define LAPACK_zsycon LAPACK_GLOBAL(zsycon,ZSYCON)
-#define LAPACK_checon LAPACK_GLOBAL(checon,CHECON)
-#define LAPACK_zhecon LAPACK_GLOBAL(zhecon,ZHECON)
-#define LAPACK_sspcon LAPACK_GLOBAL(sspcon,SSPCON)
-#define LAPACK_dspcon LAPACK_GLOBAL(dspcon,DSPCON)
-#define LAPACK_cspcon LAPACK_GLOBAL(cspcon,CSPCON)
-#define LAPACK_zspcon LAPACK_GLOBAL(zspcon,ZSPCON)
-#define LAPACK_chpcon LAPACK_GLOBAL(chpcon,CHPCON)
-#define LAPACK_zhpcon LAPACK_GLOBAL(zhpcon,ZHPCON)
-#define LAPACK_strcon LAPACK_GLOBAL(strcon,STRCON)
-#define LAPACK_dtrcon LAPACK_GLOBAL(dtrcon,DTRCON)
-#define LAPACK_ctrcon LAPACK_GLOBAL(ctrcon,CTRCON)
-#define LAPACK_ztrcon LAPACK_GLOBAL(ztrcon,ZTRCON)
-#define LAPACK_stpcon LAPACK_GLOBAL(stpcon,STPCON)
-#define LAPACK_dtpcon LAPACK_GLOBAL(dtpcon,DTPCON)
-#define LAPACK_ctpcon LAPACK_GLOBAL(ctpcon,CTPCON)
-#define LAPACK_ztpcon LAPACK_GLOBAL(ztpcon,ZTPCON)
-#define LAPACK_stbcon LAPACK_GLOBAL(stbcon,STBCON)
-#define LAPACK_dtbcon LAPACK_GLOBAL(dtbcon,DTBCON)
-#define LAPACK_ctbcon LAPACK_GLOBAL(ctbcon,CTBCON)
-#define LAPACK_ztbcon LAPACK_GLOBAL(ztbcon,ZTBCON)
-#define LAPACK_sgerfs LAPACK_GLOBAL(sgerfs,SGERFS)
-#define LAPACK_dgerfs LAPACK_GLOBAL(dgerfs,DGERFS)
-#define LAPACK_cgerfs LAPACK_GLOBAL(cgerfs,CGERFS)
-#define LAPACK_zgerfs LAPACK_GLOBAL(zgerfs,ZGERFS)
-#define LAPACK_dgerfsx LAPACK_GLOBAL(dgerfsx,DGERFSX)
-#define LAPACK_sgerfsx LAPACK_GLOBAL(sgerfsx,SGERFSX)
-#define LAPACK_zgerfsx LAPACK_GLOBAL(zgerfsx,ZGERFSX)
-#define LAPACK_cgerfsx LAPACK_GLOBAL(cgerfsx,CGERFSX)
-#define LAPACK_sgbrfs LAPACK_GLOBAL(sgbrfs,SGBRFS)
-#define LAPACK_dgbrfs LAPACK_GLOBAL(dgbrfs,DGBRFS)
-#define LAPACK_cgbrfs LAPACK_GLOBAL(cgbrfs,CGBRFS)
-#define LAPACK_zgbrfs LAPACK_GLOBAL(zgbrfs,ZGBRFS)
-#define LAPACK_dgbrfsx LAPACK_GLOBAL(dgbrfsx,DGBRFSX)
-#define LAPACK_sgbrfsx LAPACK_GLOBAL(sgbrfsx,SGBRFSX)
-#define LAPACK_zgbrfsx LAPACK_GLOBAL(zgbrfsx,ZGBRFSX)
-#define LAPACK_cgbrfsx LAPACK_GLOBAL(cgbrfsx,CGBRFSX)
-#define LAPACK_sgtrfs LAPACK_GLOBAL(sgtrfs,SGTRFS)
-#define LAPACK_dgtrfs LAPACK_GLOBAL(dgtrfs,DGTRFS)
-#define LAPACK_cgtrfs LAPACK_GLOBAL(cgtrfs,CGTRFS)
-#define LAPACK_zgtrfs LAPACK_GLOBAL(zgtrfs,ZGTRFS)
-#define LAPACK_sporfs LAPACK_GLOBAL(sporfs,SPORFS)
-#define LAPACK_dporfs LAPACK_GLOBAL(dporfs,DPORFS)
-#define LAPACK_cporfs LAPACK_GLOBAL(cporfs,CPORFS)
-#define LAPACK_zporfs LAPACK_GLOBAL(zporfs,ZPORFS)
-#define LAPACK_dporfsx LAPACK_GLOBAL(dporfsx,DPORFSX)
-#define LAPACK_sporfsx LAPACK_GLOBAL(sporfsx,SPORFSX)
-#define LAPACK_zporfsx LAPACK_GLOBAL(zporfsx,ZPORFSX)
-#define LAPACK_cporfsx LAPACK_GLOBAL(cporfsx,CPORFSX)
-#define LAPACK_spprfs LAPACK_GLOBAL(spprfs,SPPRFS)
-#define LAPACK_dpprfs LAPACK_GLOBAL(dpprfs,DPPRFS)
-#define LAPACK_cpprfs LAPACK_GLOBAL(cpprfs,CPPRFS)
-#define LAPACK_zpprfs LAPACK_GLOBAL(zpprfs,ZPPRFS)
-#define LAPACK_spbrfs LAPACK_GLOBAL(spbrfs,SPBRFS)
-#define LAPACK_dpbrfs LAPACK_GLOBAL(dpbrfs,DPBRFS)
-#define LAPACK_cpbrfs LAPACK_GLOBAL(cpbrfs,CPBRFS)
-#define LAPACK_zpbrfs LAPACK_GLOBAL(zpbrfs,ZPBRFS)
-#define LAPACK_sptrfs LAPACK_GLOBAL(sptrfs,SPTRFS)
-#define LAPACK_dptrfs LAPACK_GLOBAL(dptrfs,DPTRFS)
-#define LAPACK_cptrfs LAPACK_GLOBAL(cptrfs,CPTRFS)
-#define LAPACK_zptrfs LAPACK_GLOBAL(zptrfs,ZPTRFS)
-#define LAPACK_ssyrfs LAPACK_GLOBAL(ssyrfs,SSYRFS)
-#define LAPACK_dsyrfs LAPACK_GLOBAL(dsyrfs,DSYRFS)
-#define LAPACK_csyrfs LAPACK_GLOBAL(csyrfs,CSYRFS)
-#define LAPACK_zsyrfs LAPACK_GLOBAL(zsyrfs,ZSYRFS)
-#define LAPACK_dsyrfsx LAPACK_GLOBAL(dsyrfsx,DSYRFSX)
-#define LAPACK_ssyrfsx LAPACK_GLOBAL(ssyrfsx,SSYRFSX)
-#define LAPACK_zsyrfsx LAPACK_GLOBAL(zsyrfsx,ZSYRFSX)
-#define LAPACK_csyrfsx LAPACK_GLOBAL(csyrfsx,CSYRFSX)
-#define LAPACK_cherfs LAPACK_GLOBAL(cherfs,CHERFS)
-#define LAPACK_zherfs LAPACK_GLOBAL(zherfs,ZHERFS)
-#define LAPACK_zherfsx LAPACK_GLOBAL(zherfsx,ZHERFSX)
-#define LAPACK_cherfsx LAPACK_GLOBAL(cherfsx,CHERFSX)
-#define LAPACK_ssprfs LAPACK_GLOBAL(ssprfs,SSPRFS)
-#define LAPACK_dsprfs LAPACK_GLOBAL(dsprfs,DSPRFS)
-#define LAPACK_csprfs LAPACK_GLOBAL(csprfs,CSPRFS)
-#define LAPACK_zsprfs LAPACK_GLOBAL(zsprfs,ZSPRFS)
-#define LAPACK_chprfs LAPACK_GLOBAL(chprfs,CHPRFS)
-#define LAPACK_zhprfs LAPACK_GLOBAL(zhprfs,ZHPRFS)
-#define LAPACK_strrfs LAPACK_GLOBAL(strrfs,STRRFS)
-#define LAPACK_dtrrfs LAPACK_GLOBAL(dtrrfs,DTRRFS)
-#define LAPACK_ctrrfs LAPACK_GLOBAL(ctrrfs,CTRRFS)
-#define LAPACK_ztrrfs LAPACK_GLOBAL(ztrrfs,ZTRRFS)
-#define LAPACK_stprfs LAPACK_GLOBAL(stprfs,STPRFS)
-#define LAPACK_dtprfs LAPACK_GLOBAL(dtprfs,DTPRFS)
-#define LAPACK_ctprfs LAPACK_GLOBAL(ctprfs,CTPRFS)
-#define LAPACK_ztprfs LAPACK_GLOBAL(ztprfs,ZTPRFS)
-#define LAPACK_stbrfs LAPACK_GLOBAL(stbrfs,STBRFS)
-#define LAPACK_dtbrfs LAPACK_GLOBAL(dtbrfs,DTBRFS)
-#define LAPACK_ctbrfs LAPACK_GLOBAL(ctbrfs,CTBRFS)
-#define LAPACK_ztbrfs LAPACK_GLOBAL(ztbrfs,ZTBRFS)
-#define LAPACK_sgetri LAPACK_GLOBAL(sgetri,SGETRI)
-#define LAPACK_dgetri LAPACK_GLOBAL(dgetri,DGETRI)
-#define LAPACK_cgetri LAPACK_GLOBAL(cgetri,CGETRI)
-#define LAPACK_zgetri LAPACK_GLOBAL(zgetri,ZGETRI)
-#define LAPACK_spotri LAPACK_GLOBAL(spotri,SPOTRI)
-#define LAPACK_dpotri LAPACK_GLOBAL(dpotri,DPOTRI)
-#define LAPACK_cpotri LAPACK_GLOBAL(cpotri,CPOTRI)
-#define LAPACK_zpotri LAPACK_GLOBAL(zpotri,ZPOTRI)
-#define LAPACK_dpftri LAPACK_GLOBAL(dpftri,DPFTRI)
-#define LAPACK_spftri LAPACK_GLOBAL(spftri,SPFTRI)
-#define LAPACK_zpftri LAPACK_GLOBAL(zpftri,ZPFTRI)
-#define LAPACK_cpftri LAPACK_GLOBAL(cpftri,CPFTRI)
-#define LAPACK_spptri LAPACK_GLOBAL(spptri,SPPTRI)
-#define LAPACK_dpptri LAPACK_GLOBAL(dpptri,DPPTRI)
-#define LAPACK_cpptri LAPACK_GLOBAL(cpptri,CPPTRI)
-#define LAPACK_zpptri LAPACK_GLOBAL(zpptri,ZPPTRI)
-#define LAPACK_ssytri LAPACK_GLOBAL(ssytri,SSYTRI)
-#define LAPACK_dsytri LAPACK_GLOBAL(dsytri,DSYTRI)
-#define LAPACK_csytri LAPACK_GLOBAL(csytri,CSYTRI)
-#define LAPACK_zsytri LAPACK_GLOBAL(zsytri,ZSYTRI)
-#define LAPACK_chetri LAPACK_GLOBAL(chetri,CHETRI)
-#define LAPACK_zhetri LAPACK_GLOBAL(zhetri,ZHETRI)
-#define LAPACK_ssptri LAPACK_GLOBAL(ssptri,SSPTRI)
-#define LAPACK_dsptri LAPACK_GLOBAL(dsptri,DSPTRI)
-#define LAPACK_csptri LAPACK_GLOBAL(csptri,CSPTRI)
-#define LAPACK_zsptri LAPACK_GLOBAL(zsptri,ZSPTRI)
-#define LAPACK_chptri LAPACK_GLOBAL(chptri,CHPTRI)
-#define LAPACK_zhptri LAPACK_GLOBAL(zhptri,ZHPTRI)
-#define LAPACK_strtri LAPACK_GLOBAL(strtri,STRTRI)
-#define LAPACK_dtrtri LAPACK_GLOBAL(dtrtri,DTRTRI)
-#define LAPACK_ctrtri LAPACK_GLOBAL(ctrtri,CTRTRI)
-#define LAPACK_ztrtri LAPACK_GLOBAL(ztrtri,ZTRTRI)
-#define LAPACK_dtftri LAPACK_GLOBAL(dtftri,DTFTRI)
-#define LAPACK_stftri LAPACK_GLOBAL(stftri,STFTRI)
-#define LAPACK_ztftri LAPACK_GLOBAL(ztftri,ZTFTRI)
-#define LAPACK_ctftri LAPACK_GLOBAL(ctftri,CTFTRI)
-#define LAPACK_stptri LAPACK_GLOBAL(stptri,STPTRI)
-#define LAPACK_dtptri LAPACK_GLOBAL(dtptri,DTPTRI)
-#define LAPACK_ctptri LAPACK_GLOBAL(ctptri,CTPTRI)
-#define LAPACK_ztptri LAPACK_GLOBAL(ztptri,ZTPTRI)
-#define LAPACK_sgeequ LAPACK_GLOBAL(sgeequ,SGEEQU)
-#define LAPACK_dgeequ LAPACK_GLOBAL(dgeequ,DGEEQU)
-#define LAPACK_cgeequ LAPACK_GLOBAL(cgeequ,CGEEQU)
-#define LAPACK_zgeequ LAPACK_GLOBAL(zgeequ,ZGEEQU)
-#define LAPACK_dgeequb LAPACK_GLOBAL(dgeequb,DGEEQUB)
-#define LAPACK_sgeequb LAPACK_GLOBAL(sgeequb,SGEEQUB)
-#define LAPACK_zgeequb LAPACK_GLOBAL(zgeequb,ZGEEQUB)
-#define LAPACK_cgeequb LAPACK_GLOBAL(cgeequb,CGEEQUB)
-#define LAPACK_sgbequ LAPACK_GLOBAL(sgbequ,SGBEQU)
-#define LAPACK_dgbequ LAPACK_GLOBAL(dgbequ,DGBEQU)
-#define LAPACK_cgbequ LAPACK_GLOBAL(cgbequ,CGBEQU)
-#define LAPACK_zgbequ LAPACK_GLOBAL(zgbequ,ZGBEQU)
-#define LAPACK_dgbequb LAPACK_GLOBAL(dgbequb,DGBEQUB)
-#define LAPACK_sgbequb LAPACK_GLOBAL(sgbequb,SGBEQUB)
-#define LAPACK_zgbequb LAPACK_GLOBAL(zgbequb,ZGBEQUB)
-#define LAPACK_cgbequb LAPACK_GLOBAL(cgbequb,CGBEQUB)
-#define LAPACK_spoequ LAPACK_GLOBAL(spoequ,SPOEQU)
-#define LAPACK_dpoequ LAPACK_GLOBAL(dpoequ,DPOEQU)
-#define LAPACK_cpoequ LAPACK_GLOBAL(cpoequ,CPOEQU)
-#define LAPACK_zpoequ LAPACK_GLOBAL(zpoequ,ZPOEQU)
-#define LAPACK_dpoequb LAPACK_GLOBAL(dpoequb,DPOEQUB)
-#define LAPACK_spoequb LAPACK_GLOBAL(spoequb,SPOEQUB)
-#define LAPACK_zpoequb LAPACK_GLOBAL(zpoequb,ZPOEQUB)
-#define LAPACK_cpoequb LAPACK_GLOBAL(cpoequb,CPOEQUB)
-#define LAPACK_sppequ LAPACK_GLOBAL(sppequ,SPPEQU)
-#define LAPACK_dppequ LAPACK_GLOBAL(dppequ,DPPEQU)
-#define LAPACK_cppequ LAPACK_GLOBAL(cppequ,CPPEQU)
-#define LAPACK_zppequ LAPACK_GLOBAL(zppequ,ZPPEQU)
-#define LAPACK_spbequ LAPACK_GLOBAL(spbequ,SPBEQU)
-#define LAPACK_dpbequ LAPACK_GLOBAL(dpbequ,DPBEQU)
-#define LAPACK_cpbequ LAPACK_GLOBAL(cpbequ,CPBEQU)
-#define LAPACK_zpbequ LAPACK_GLOBAL(zpbequ,ZPBEQU)
-#define LAPACK_dsyequb LAPACK_GLOBAL(dsyequb,DSYEQUB)
-#define LAPACK_ssyequb LAPACK_GLOBAL(ssyequb,SSYEQUB)
-#define LAPACK_zsyequb LAPACK_GLOBAL(zsyequb,ZSYEQUB)
-#define LAPACK_csyequb LAPACK_GLOBAL(csyequb,CSYEQUB)
-#define LAPACK_zheequb LAPACK_GLOBAL(zheequb,ZHEEQUB)
-#define LAPACK_cheequb LAPACK_GLOBAL(cheequb,CHEEQUB)
-#define LAPACK_sgesv LAPACK_GLOBAL(sgesv,SGESV)
-#define LAPACK_dgesv LAPACK_GLOBAL(dgesv,DGESV)
-#define LAPACK_cgesv LAPACK_GLOBAL(cgesv,CGESV)
-#define LAPACK_zgesv LAPACK_GLOBAL(zgesv,ZGESV)
-#define LAPACK_dsgesv LAPACK_GLOBAL(dsgesv,DSGESV)
-#define LAPACK_zcgesv LAPACK_GLOBAL(zcgesv,ZCGESV)
-#define LAPACK_sgesvx LAPACK_GLOBAL(sgesvx,SGESVX)
-#define LAPACK_dgesvx LAPACK_GLOBAL(dgesvx,DGESVX)
-#define LAPACK_cgesvx LAPACK_GLOBAL(cgesvx,CGESVX)
-#define LAPACK_zgesvx LAPACK_GLOBAL(zgesvx,ZGESVX)
-#define LAPACK_dgesvxx LAPACK_GLOBAL(dgesvxx,DGESVXX)
-#define LAPACK_sgesvxx LAPACK_GLOBAL(sgesvxx,SGESVXX)
-#define LAPACK_zgesvxx LAPACK_GLOBAL(zgesvxx,ZGESVXX)
-#define LAPACK_cgesvxx LAPACK_GLOBAL(cgesvxx,CGESVXX)
-#define LAPACK_sgbsv LAPACK_GLOBAL(sgbsv,SGBSV)
-#define LAPACK_dgbsv LAPACK_GLOBAL(dgbsv,DGBSV)
-#define LAPACK_cgbsv LAPACK_GLOBAL(cgbsv,CGBSV)
-#define LAPACK_zgbsv LAPACK_GLOBAL(zgbsv,ZGBSV)
-#define LAPACK_sgbsvx LAPACK_GLOBAL(sgbsvx,SGBSVX)
-#define LAPACK_dgbsvx LAPACK_GLOBAL(dgbsvx,DGBSVX)
-#define LAPACK_cgbsvx LAPACK_GLOBAL(cgbsvx,CGBSVX)
-#define LAPACK_zgbsvx LAPACK_GLOBAL(zgbsvx,ZGBSVX)
-#define LAPACK_dgbsvxx LAPACK_GLOBAL(dgbsvxx,DGBSVXX)
-#define LAPACK_sgbsvxx LAPACK_GLOBAL(sgbsvxx,SGBSVXX)
-#define LAPACK_zgbsvxx LAPACK_GLOBAL(zgbsvxx,ZGBSVXX)
-#define LAPACK_cgbsvxx LAPACK_GLOBAL(cgbsvxx,CGBSVXX)
-#define LAPACK_sgtsv LAPACK_GLOBAL(sgtsv,SGTSV)
-#define LAPACK_dgtsv LAPACK_GLOBAL(dgtsv,DGTSV)
-#define LAPACK_cgtsv LAPACK_GLOBAL(cgtsv,CGTSV)
-#define LAPACK_zgtsv LAPACK_GLOBAL(zgtsv,ZGTSV)
-#define LAPACK_sgtsvx LAPACK_GLOBAL(sgtsvx,SGTSVX)
-#define LAPACK_dgtsvx LAPACK_GLOBAL(dgtsvx,DGTSVX)
-#define LAPACK_cgtsvx LAPACK_GLOBAL(cgtsvx,CGTSVX)
-#define LAPACK_zgtsvx LAPACK_GLOBAL(zgtsvx,ZGTSVX)
-#define LAPACK_sposv LAPACK_GLOBAL(sposv,SPOSV)
-#define LAPACK_dposv LAPACK_GLOBAL(dposv,DPOSV)
-#define LAPACK_cposv LAPACK_GLOBAL(cposv,CPOSV)
-#define LAPACK_zposv LAPACK_GLOBAL(zposv,ZPOSV)
-#define LAPACK_dsposv LAPACK_GLOBAL(dsposv,DSPOSV)
-#define LAPACK_zcposv LAPACK_GLOBAL(zcposv,ZCPOSV)
-#define LAPACK_sposvx LAPACK_GLOBAL(sposvx,SPOSVX)
-#define LAPACK_dposvx LAPACK_GLOBAL(dposvx,DPOSVX)
-#define LAPACK_cposvx LAPACK_GLOBAL(cposvx,CPOSVX)
-#define LAPACK_zposvx LAPACK_GLOBAL(zposvx,ZPOSVX)
-#define LAPACK_dposvxx LAPACK_GLOBAL(dposvxx,DPOSVXX)
-#define LAPACK_sposvxx LAPACK_GLOBAL(sposvxx,SPOSVXX)
-#define LAPACK_zposvxx LAPACK_GLOBAL(zposvxx,ZPOSVXX)
-#define LAPACK_cposvxx LAPACK_GLOBAL(cposvxx,CPOSVXX)
-#define LAPACK_sppsv LAPACK_GLOBAL(sppsv,SPPSV)
-#define LAPACK_dppsv LAPACK_GLOBAL(dppsv,DPPSV)
-#define LAPACK_cppsv LAPACK_GLOBAL(cppsv,CPPSV)
-#define LAPACK_zppsv LAPACK_GLOBAL(zppsv,ZPPSV)
-#define LAPACK_sppsvx LAPACK_GLOBAL(sppsvx,SPPSVX)
-#define LAPACK_dppsvx LAPACK_GLOBAL(dppsvx,DPPSVX)
-#define LAPACK_cppsvx LAPACK_GLOBAL(cppsvx,CPPSVX)
-#define LAPACK_zppsvx LAPACK_GLOBAL(zppsvx,ZPPSVX)
-#define LAPACK_spbsv LAPACK_GLOBAL(spbsv,SPBSV)
-#define LAPACK_dpbsv LAPACK_GLOBAL(dpbsv,DPBSV)
-#define LAPACK_cpbsv LAPACK_GLOBAL(cpbsv,CPBSV)
-#define LAPACK_zpbsv LAPACK_GLOBAL(zpbsv,ZPBSV)
-#define LAPACK_spbsvx LAPACK_GLOBAL(spbsvx,SPBSVX)
-#define LAPACK_dpbsvx LAPACK_GLOBAL(dpbsvx,DPBSVX)
-#define LAPACK_cpbsvx LAPACK_GLOBAL(cpbsvx,CPBSVX)
-#define LAPACK_zpbsvx LAPACK_GLOBAL(zpbsvx,ZPBSVX)
-#define LAPACK_sptsv LAPACK_GLOBAL(sptsv,SPTSV)
-#define LAPACK_dptsv LAPACK_GLOBAL(dptsv,DPTSV)
-#define LAPACK_cptsv LAPACK_GLOBAL(cptsv,CPTSV)
-#define LAPACK_zptsv LAPACK_GLOBAL(zptsv,ZPTSV)
-#define LAPACK_sptsvx LAPACK_GLOBAL(sptsvx,SPTSVX)
-#define LAPACK_dptsvx LAPACK_GLOBAL(dptsvx,DPTSVX)
-#define LAPACK_cptsvx LAPACK_GLOBAL(cptsvx,CPTSVX)
-#define LAPACK_zptsvx LAPACK_GLOBAL(zptsvx,ZPTSVX)
-#define LAPACK_ssysv LAPACK_GLOBAL(ssysv,SSYSV)
-#define LAPACK_dsysv LAPACK_GLOBAL(dsysv,DSYSV)
-#define LAPACK_csysv LAPACK_GLOBAL(csysv,CSYSV)
-#define LAPACK_zsysv LAPACK_GLOBAL(zsysv,ZSYSV)
-#define LAPACK_ssysvx LAPACK_GLOBAL(ssysvx,SSYSVX)
-#define LAPACK_dsysvx LAPACK_GLOBAL(dsysvx,DSYSVX)
-#define LAPACK_csysvx LAPACK_GLOBAL(csysvx,CSYSVX)
-#define LAPACK_zsysvx LAPACK_GLOBAL(zsysvx,ZSYSVX)
-#define LAPACK_dsysvxx LAPACK_GLOBAL(dsysvxx,DSYSVXX)
-#define LAPACK_ssysvxx LAPACK_GLOBAL(ssysvxx,SSYSVXX)
-#define LAPACK_zsysvxx LAPACK_GLOBAL(zsysvxx,ZSYSVXX)
-#define LAPACK_csysvxx LAPACK_GLOBAL(csysvxx,CSYSVXX)
-#define LAPACK_chesv LAPACK_GLOBAL(chesv,CHESV)
-#define LAPACK_zhesv LAPACK_GLOBAL(zhesv,ZHESV)
-#define LAPACK_chesvx LAPACK_GLOBAL(chesvx,CHESVX)
-#define LAPACK_zhesvx LAPACK_GLOBAL(zhesvx,ZHESVX)
-#define LAPACK_zhesvxx LAPACK_GLOBAL(zhesvxx,ZHESVXX)
-#define LAPACK_chesvxx LAPACK_GLOBAL(chesvxx,CHESVXX)
-#define LAPACK_sspsv LAPACK_GLOBAL(sspsv,SSPSV)
-#define LAPACK_dspsv LAPACK_GLOBAL(dspsv,DSPSV)
-#define LAPACK_cspsv LAPACK_GLOBAL(cspsv,CSPSV)
-#define LAPACK_zspsv LAPACK_GLOBAL(zspsv,ZSPSV)
-#define LAPACK_sspsvx LAPACK_GLOBAL(sspsvx,SSPSVX)
-#define LAPACK_dspsvx LAPACK_GLOBAL(dspsvx,DSPSVX)
-#define LAPACK_cspsvx LAPACK_GLOBAL(cspsvx,CSPSVX)
-#define LAPACK_zspsvx LAPACK_GLOBAL(zspsvx,ZSPSVX)
-#define LAPACK_chpsv LAPACK_GLOBAL(chpsv,CHPSV)
-#define LAPACK_zhpsv LAPACK_GLOBAL(zhpsv,ZHPSV)
-#define LAPACK_chpsvx LAPACK_GLOBAL(chpsvx,CHPSVX)
-#define LAPACK_zhpsvx LAPACK_GLOBAL(zhpsvx,ZHPSVX)
-#define LAPACK_sgeqrf LAPACK_GLOBAL(sgeqrf,SGEQRF)
-#define LAPACK_dgeqrf LAPACK_GLOBAL(dgeqrf,DGEQRF)
-#define LAPACK_cgeqrf LAPACK_GLOBAL(cgeqrf,CGEQRF)
-#define LAPACK_zgeqrf LAPACK_GLOBAL(zgeqrf,ZGEQRF)
-#define LAPACK_sgeqpf LAPACK_GLOBAL(sgeqpf,SGEQPF)
-#define LAPACK_dgeqpf LAPACK_GLOBAL(dgeqpf,DGEQPF)
-#define LAPACK_cgeqpf LAPACK_GLOBAL(cgeqpf,CGEQPF)
-#define LAPACK_zgeqpf LAPACK_GLOBAL(zgeqpf,ZGEQPF)
-#define LAPACK_sgeqp3 LAPACK_GLOBAL(sgeqp3,SGEQP3)
-#define LAPACK_dgeqp3 LAPACK_GLOBAL(dgeqp3,DGEQP3)
-#define LAPACK_cgeqp3 LAPACK_GLOBAL(cgeqp3,CGEQP3)
-#define LAPACK_zgeqp3 LAPACK_GLOBAL(zgeqp3,ZGEQP3)
-#define LAPACK_sorgqr LAPACK_GLOBAL(sorgqr,SORGQR)
-#define LAPACK_dorgqr LAPACK_GLOBAL(dorgqr,DORGQR)
-#define LAPACK_sormqr LAPACK_GLOBAL(sormqr,SORMQR)
-#define LAPACK_dormqr LAPACK_GLOBAL(dormqr,DORMQR)
-#define LAPACK_cungqr LAPACK_GLOBAL(cungqr,CUNGQR)
-#define LAPACK_zungqr LAPACK_GLOBAL(zungqr,ZUNGQR)
-#define LAPACK_cunmqr LAPACK_GLOBAL(cunmqr,CUNMQR)
-#define LAPACK_zunmqr LAPACK_GLOBAL(zunmqr,ZUNMQR)
-#define LAPACK_sgelqf LAPACK_GLOBAL(sgelqf,SGELQF)
-#define LAPACK_dgelqf LAPACK_GLOBAL(dgelqf,DGELQF)
-#define LAPACK_cgelqf LAPACK_GLOBAL(cgelqf,CGELQF)
-#define LAPACK_zgelqf LAPACK_GLOBAL(zgelqf,ZGELQF)
-#define LAPACK_sorglq LAPACK_GLOBAL(sorglq,SORGLQ)
-#define LAPACK_dorglq LAPACK_GLOBAL(dorglq,DORGLQ)
-#define LAPACK_sormlq LAPACK_GLOBAL(sormlq,SORMLQ)
-#define LAPACK_dormlq LAPACK_GLOBAL(dormlq,DORMLQ)
-#define LAPACK_cunglq LAPACK_GLOBAL(cunglq,CUNGLQ)
-#define LAPACK_zunglq LAPACK_GLOBAL(zunglq,ZUNGLQ)
-#define LAPACK_cunmlq LAPACK_GLOBAL(cunmlq,CUNMLQ)
-#define LAPACK_zunmlq LAPACK_GLOBAL(zunmlq,ZUNMLQ)
-#define LAPACK_sgeqlf LAPACK_GLOBAL(sgeqlf,SGEQLF)
-#define LAPACK_dgeqlf LAPACK_GLOBAL(dgeqlf,DGEQLF)
-#define LAPACK_cgeqlf LAPACK_GLOBAL(cgeqlf,CGEQLF)
-#define LAPACK_zgeqlf LAPACK_GLOBAL(zgeqlf,ZGEQLF)
-#define LAPACK_sorgql LAPACK_GLOBAL(sorgql,SORGQL)
-#define LAPACK_dorgql LAPACK_GLOBAL(dorgql,DORGQL)
-#define LAPACK_cungql LAPACK_GLOBAL(cungql,CUNGQL)
-#define LAPACK_zungql LAPACK_GLOBAL(zungql,ZUNGQL)
-#define LAPACK_sormql LAPACK_GLOBAL(sormql,SORMQL)
-#define LAPACK_dormql LAPACK_GLOBAL(dormql,DORMQL)
-#define LAPACK_cunmql LAPACK_GLOBAL(cunmql,CUNMQL)
-#define LAPACK_zunmql LAPACK_GLOBAL(zunmql,ZUNMQL)
-#define LAPACK_sgerqf LAPACK_GLOBAL(sgerqf,SGERQF)
-#define LAPACK_dgerqf LAPACK_GLOBAL(dgerqf,DGERQF)
-#define LAPACK_cgerqf LAPACK_GLOBAL(cgerqf,CGERQF)
-#define LAPACK_zgerqf LAPACK_GLOBAL(zgerqf,ZGERQF)
-#define LAPACK_sorgrq LAPACK_GLOBAL(sorgrq,SORGRQ)
-#define LAPACK_dorgrq LAPACK_GLOBAL(dorgrq,DORGRQ)
-#define LAPACK_cungrq LAPACK_GLOBAL(cungrq,CUNGRQ)
-#define LAPACK_zungrq LAPACK_GLOBAL(zungrq,ZUNGRQ)
-#define LAPACK_sormrq LAPACK_GLOBAL(sormrq,SORMRQ)
-#define LAPACK_dormrq LAPACK_GLOBAL(dormrq,DORMRQ)
-#define LAPACK_cunmrq LAPACK_GLOBAL(cunmrq,CUNMRQ)
-#define LAPACK_zunmrq LAPACK_GLOBAL(zunmrq,ZUNMRQ)
-#define LAPACK_stzrzf LAPACK_GLOBAL(stzrzf,STZRZF)
-#define LAPACK_dtzrzf LAPACK_GLOBAL(dtzrzf,DTZRZF)
-#define LAPACK_ctzrzf LAPACK_GLOBAL(ctzrzf,CTZRZF)
-#define LAPACK_ztzrzf LAPACK_GLOBAL(ztzrzf,ZTZRZF)
-#define LAPACK_sormrz LAPACK_GLOBAL(sormrz,SORMRZ)
-#define LAPACK_dormrz LAPACK_GLOBAL(dormrz,DORMRZ)
-#define LAPACK_cunmrz LAPACK_GLOBAL(cunmrz,CUNMRZ)
-#define LAPACK_zunmrz LAPACK_GLOBAL(zunmrz,ZUNMRZ)
-#define LAPACK_sggqrf LAPACK_GLOBAL(sggqrf,SGGQRF)
-#define LAPACK_dggqrf LAPACK_GLOBAL(dggqrf,DGGQRF)
-#define LAPACK_cggqrf LAPACK_GLOBAL(cggqrf,CGGQRF)
-#define LAPACK_zggqrf LAPACK_GLOBAL(zggqrf,ZGGQRF)
-#define LAPACK_sggrqf LAPACK_GLOBAL(sggrqf,SGGRQF)
-#define LAPACK_dggrqf LAPACK_GLOBAL(dggrqf,DGGRQF)
-#define LAPACK_cggrqf LAPACK_GLOBAL(cggrqf,CGGRQF)
-#define LAPACK_zggrqf LAPACK_GLOBAL(zggrqf,ZGGRQF)
-#define LAPACK_sgebrd LAPACK_GLOBAL(sgebrd,SGEBRD)
-#define LAPACK_dgebrd LAPACK_GLOBAL(dgebrd,DGEBRD)
-#define LAPACK_cgebrd LAPACK_GLOBAL(cgebrd,CGEBRD)
-#define LAPACK_zgebrd LAPACK_GLOBAL(zgebrd,ZGEBRD)
-#define LAPACK_sgbbrd LAPACK_GLOBAL(sgbbrd,SGBBRD)
-#define LAPACK_dgbbrd LAPACK_GLOBAL(dgbbrd,DGBBRD)
-#define LAPACK_cgbbrd LAPACK_GLOBAL(cgbbrd,CGBBRD)
-#define LAPACK_zgbbrd LAPACK_GLOBAL(zgbbrd,ZGBBRD)
-#define LAPACK_sorgbr LAPACK_GLOBAL(sorgbr,SORGBR)
-#define LAPACK_dorgbr LAPACK_GLOBAL(dorgbr,DORGBR)
-#define LAPACK_sormbr LAPACK_GLOBAL(sormbr,SORMBR)
-#define LAPACK_dormbr LAPACK_GLOBAL(dormbr,DORMBR)
-#define LAPACK_cungbr LAPACK_GLOBAL(cungbr,CUNGBR)
-#define LAPACK_zungbr LAPACK_GLOBAL(zungbr,ZUNGBR)
-#define LAPACK_cunmbr LAPACK_GLOBAL(cunmbr,CUNMBR)
-#define LAPACK_zunmbr LAPACK_GLOBAL(zunmbr,ZUNMBR)
-#define LAPACK_sbdsqr LAPACK_GLOBAL(sbdsqr,SBDSQR)
-#define LAPACK_dbdsqr LAPACK_GLOBAL(dbdsqr,DBDSQR)
-#define LAPACK_cbdsqr LAPACK_GLOBAL(cbdsqr,CBDSQR)
-#define LAPACK_zbdsqr LAPACK_GLOBAL(zbdsqr,ZBDSQR)
-#define LAPACK_sbdsdc LAPACK_GLOBAL(sbdsdc,SBDSDC)
-#define LAPACK_dbdsdc LAPACK_GLOBAL(dbdsdc,DBDSDC)
-#define LAPACK_ssytrd LAPACK_GLOBAL(ssytrd,SSYTRD)
-#define LAPACK_dsytrd LAPACK_GLOBAL(dsytrd,DSYTRD)
-#define LAPACK_sorgtr LAPACK_GLOBAL(sorgtr,SORGTR)
-#define LAPACK_dorgtr LAPACK_GLOBAL(dorgtr,DORGTR)
-#define LAPACK_sormtr LAPACK_GLOBAL(sormtr,SORMTR)
-#define LAPACK_dormtr LAPACK_GLOBAL(dormtr,DORMTR)
-#define LAPACK_chetrd LAPACK_GLOBAL(chetrd,CHETRD)
-#define LAPACK_zhetrd LAPACK_GLOBAL(zhetrd,ZHETRD)
-#define LAPACK_cungtr LAPACK_GLOBAL(cungtr,CUNGTR)
-#define LAPACK_zungtr LAPACK_GLOBAL(zungtr,ZUNGTR)
-#define LAPACK_cunmtr LAPACK_GLOBAL(cunmtr,CUNMTR)
-#define LAPACK_zunmtr LAPACK_GLOBAL(zunmtr,ZUNMTR)
-#define LAPACK_ssptrd LAPACK_GLOBAL(ssptrd,SSPTRD)
-#define LAPACK_dsptrd LAPACK_GLOBAL(dsptrd,DSPTRD)
-#define LAPACK_sopgtr LAPACK_GLOBAL(sopgtr,SOPGTR)
-#define LAPACK_dopgtr LAPACK_GLOBAL(dopgtr,DOPGTR)
-#define LAPACK_sopmtr LAPACK_GLOBAL(sopmtr,SOPMTR)
-#define LAPACK_dopmtr LAPACK_GLOBAL(dopmtr,DOPMTR)
-#define LAPACK_chptrd LAPACK_GLOBAL(chptrd,CHPTRD)
-#define LAPACK_zhptrd LAPACK_GLOBAL(zhptrd,ZHPTRD)
-#define LAPACK_cupgtr LAPACK_GLOBAL(cupgtr,CUPGTR)
-#define LAPACK_zupgtr LAPACK_GLOBAL(zupgtr,ZUPGTR)
-#define LAPACK_cupmtr LAPACK_GLOBAL(cupmtr,CUPMTR)
-#define LAPACK_zupmtr LAPACK_GLOBAL(zupmtr,ZUPMTR)
-#define LAPACK_ssbtrd LAPACK_GLOBAL(ssbtrd,SSBTRD)
-#define LAPACK_dsbtrd LAPACK_GLOBAL(dsbtrd,DSBTRD)
-#define LAPACK_chbtrd LAPACK_GLOBAL(chbtrd,CHBTRD)
-#define LAPACK_zhbtrd LAPACK_GLOBAL(zhbtrd,ZHBTRD)
-#define LAPACK_ssterf LAPACK_GLOBAL(ssterf,SSTERF)
-#define LAPACK_dsterf LAPACK_GLOBAL(dsterf,DSTERF)
-#define LAPACK_ssteqr LAPACK_GLOBAL(ssteqr,SSTEQR)
-#define LAPACK_dsteqr LAPACK_GLOBAL(dsteqr,DSTEQR)
-#define LAPACK_csteqr LAPACK_GLOBAL(csteqr,CSTEQR)
-#define LAPACK_zsteqr LAPACK_GLOBAL(zsteqr,ZSTEQR)
-#define LAPACK_sstemr LAPACK_GLOBAL(sstemr,SSTEMR)
-#define LAPACK_dstemr LAPACK_GLOBAL(dstemr,DSTEMR)
-#define LAPACK_cstemr LAPACK_GLOBAL(cstemr,CSTEMR)
-#define LAPACK_zstemr LAPACK_GLOBAL(zstemr,ZSTEMR)
-#define LAPACK_sstedc LAPACK_GLOBAL(sstedc,SSTEDC)
-#define LAPACK_dstedc LAPACK_GLOBAL(dstedc,DSTEDC)
-#define LAPACK_cstedc LAPACK_GLOBAL(cstedc,CSTEDC)
-#define LAPACK_zstedc LAPACK_GLOBAL(zstedc,ZSTEDC)
-#define LAPACK_sstegr LAPACK_GLOBAL(sstegr,SSTEGR)
-#define LAPACK_dstegr LAPACK_GLOBAL(dstegr,DSTEGR)
-#define LAPACK_cstegr LAPACK_GLOBAL(cstegr,CSTEGR)
-#define LAPACK_zstegr LAPACK_GLOBAL(zstegr,ZSTEGR)
-#define LAPACK_spteqr LAPACK_GLOBAL(spteqr,SPTEQR)
-#define LAPACK_dpteqr LAPACK_GLOBAL(dpteqr,DPTEQR)
-#define LAPACK_cpteqr LAPACK_GLOBAL(cpteqr,CPTEQR)
-#define LAPACK_zpteqr LAPACK_GLOBAL(zpteqr,ZPTEQR)
-#define LAPACK_sstebz LAPACK_GLOBAL(sstebz,SSTEBZ)
-#define LAPACK_dstebz LAPACK_GLOBAL(dstebz,DSTEBZ)
-#define LAPACK_sstein LAPACK_GLOBAL(sstein,SSTEIN)
-#define LAPACK_dstein LAPACK_GLOBAL(dstein,DSTEIN)
-#define LAPACK_cstein LAPACK_GLOBAL(cstein,CSTEIN)
-#define LAPACK_zstein LAPACK_GLOBAL(zstein,ZSTEIN)
-#define LAPACK_sdisna LAPACK_GLOBAL(sdisna,SDISNA)
-#define LAPACK_ddisna LAPACK_GLOBAL(ddisna,DDISNA)
-#define LAPACK_ssygst LAPACK_GLOBAL(ssygst,SSYGST)
-#define LAPACK_dsygst LAPACK_GLOBAL(dsygst,DSYGST)
-#define LAPACK_chegst LAPACK_GLOBAL(chegst,CHEGST)
-#define LAPACK_zhegst LAPACK_GLOBAL(zhegst,ZHEGST)
-#define LAPACK_sspgst LAPACK_GLOBAL(sspgst,SSPGST)
-#define LAPACK_dspgst LAPACK_GLOBAL(dspgst,DSPGST)
-#define LAPACK_chpgst LAPACK_GLOBAL(chpgst,CHPGST)
-#define LAPACK_zhpgst LAPACK_GLOBAL(zhpgst,ZHPGST)
-#define LAPACK_ssbgst LAPACK_GLOBAL(ssbgst,SSBGST)
-#define LAPACK_dsbgst LAPACK_GLOBAL(dsbgst,DSBGST)
-#define LAPACK_chbgst LAPACK_GLOBAL(chbgst,CHBGST)
-#define LAPACK_zhbgst LAPACK_GLOBAL(zhbgst,ZHBGST)
-#define LAPACK_spbstf LAPACK_GLOBAL(spbstf,SPBSTF)
-#define LAPACK_dpbstf LAPACK_GLOBAL(dpbstf,DPBSTF)
-#define LAPACK_cpbstf LAPACK_GLOBAL(cpbstf,CPBSTF)
-#define LAPACK_zpbstf LAPACK_GLOBAL(zpbstf,ZPBSTF)
-#define LAPACK_sgehrd LAPACK_GLOBAL(sgehrd,SGEHRD)
-#define LAPACK_dgehrd LAPACK_GLOBAL(dgehrd,DGEHRD)
-#define LAPACK_cgehrd LAPACK_GLOBAL(cgehrd,CGEHRD)
-#define LAPACK_zgehrd LAPACK_GLOBAL(zgehrd,ZGEHRD)
-#define LAPACK_sorghr LAPACK_GLOBAL(sorghr,SORGHR)
-#define LAPACK_dorghr LAPACK_GLOBAL(dorghr,DORGHR)
-#define LAPACK_sormhr LAPACK_GLOBAL(sormhr,SORMHR)
-#define LAPACK_dormhr LAPACK_GLOBAL(dormhr,DORMHR)
-#define LAPACK_cunghr LAPACK_GLOBAL(cunghr,CUNGHR)
-#define LAPACK_zunghr LAPACK_GLOBAL(zunghr,ZUNGHR)
-#define LAPACK_cunmhr LAPACK_GLOBAL(cunmhr,CUNMHR)
-#define LAPACK_zunmhr LAPACK_GLOBAL(zunmhr,ZUNMHR)
-#define LAPACK_sgebal LAPACK_GLOBAL(sgebal,SGEBAL)
-#define LAPACK_dgebal LAPACK_GLOBAL(dgebal,DGEBAL)
-#define LAPACK_cgebal LAPACK_GLOBAL(cgebal,CGEBAL)
-#define LAPACK_zgebal LAPACK_GLOBAL(zgebal,ZGEBAL)
-#define LAPACK_sgebak LAPACK_GLOBAL(sgebak,SGEBAK)
-#define LAPACK_dgebak LAPACK_GLOBAL(dgebak,DGEBAK)
-#define LAPACK_cgebak LAPACK_GLOBAL(cgebak,CGEBAK)
-#define LAPACK_zgebak LAPACK_GLOBAL(zgebak,ZGEBAK)
-#define LAPACK_shseqr LAPACK_GLOBAL(shseqr,SHSEQR)
-#define LAPACK_dhseqr LAPACK_GLOBAL(dhseqr,DHSEQR)
-#define LAPACK_chseqr LAPACK_GLOBAL(chseqr,CHSEQR)
-#define LAPACK_zhseqr LAPACK_GLOBAL(zhseqr,ZHSEQR)
-#define LAPACK_shsein LAPACK_GLOBAL(shsein,SHSEIN)
-#define LAPACK_dhsein LAPACK_GLOBAL(dhsein,DHSEIN)
-#define LAPACK_chsein LAPACK_GLOBAL(chsein,CHSEIN)
-#define LAPACK_zhsein LAPACK_GLOBAL(zhsein,ZHSEIN)
-#define LAPACK_strevc LAPACK_GLOBAL(strevc,STREVC)
-#define LAPACK_dtrevc LAPACK_GLOBAL(dtrevc,DTREVC)
-#define LAPACK_ctrevc LAPACK_GLOBAL(ctrevc,CTREVC)
-#define LAPACK_ztrevc LAPACK_GLOBAL(ztrevc,ZTREVC)
-#define LAPACK_strsna LAPACK_GLOBAL(strsna,STRSNA)
-#define LAPACK_dtrsna LAPACK_GLOBAL(dtrsna,DTRSNA)
-#define LAPACK_ctrsna LAPACK_GLOBAL(ctrsna,CTRSNA)
-#define LAPACK_ztrsna LAPACK_GLOBAL(ztrsna,ZTRSNA)
-#define LAPACK_strexc LAPACK_GLOBAL(strexc,STREXC)
-#define LAPACK_dtrexc LAPACK_GLOBAL(dtrexc,DTREXC)
-#define LAPACK_ctrexc LAPACK_GLOBAL(ctrexc,CTREXC)
-#define LAPACK_ztrexc LAPACK_GLOBAL(ztrexc,ZTREXC)
-#define LAPACK_strsen LAPACK_GLOBAL(strsen,STRSEN)
-#define LAPACK_dtrsen LAPACK_GLOBAL(dtrsen,DTRSEN)
-#define LAPACK_ctrsen LAPACK_GLOBAL(ctrsen,CTRSEN)
-#define LAPACK_ztrsen LAPACK_GLOBAL(ztrsen,ZTRSEN)
-#define LAPACK_strsyl LAPACK_GLOBAL(strsyl,STRSYL)
-#define LAPACK_dtrsyl LAPACK_GLOBAL(dtrsyl,DTRSYL)
-#define LAPACK_ctrsyl LAPACK_GLOBAL(ctrsyl,CTRSYL)
-#define LAPACK_ztrsyl LAPACK_GLOBAL(ztrsyl,ZTRSYL)
-#define LAPACK_sgghrd LAPACK_GLOBAL(sgghrd,SGGHRD)
-#define LAPACK_dgghrd LAPACK_GLOBAL(dgghrd,DGGHRD)
-#define LAPACK_cgghrd LAPACK_GLOBAL(cgghrd,CGGHRD)
-#define LAPACK_zgghrd LAPACK_GLOBAL(zgghrd,ZGGHRD)
-#define LAPACK_sggbal LAPACK_GLOBAL(sggbal,SGGBAL)
-#define LAPACK_dggbal LAPACK_GLOBAL(dggbal,DGGBAL)
-#define LAPACK_cggbal LAPACK_GLOBAL(cggbal,CGGBAL)
-#define LAPACK_zggbal LAPACK_GLOBAL(zggbal,ZGGBAL)
-#define LAPACK_sggbak LAPACK_GLOBAL(sggbak,SGGBAK)
-#define LAPACK_dggbak LAPACK_GLOBAL(dggbak,DGGBAK)
-#define LAPACK_cggbak LAPACK_GLOBAL(cggbak,CGGBAK)
-#define LAPACK_zggbak LAPACK_GLOBAL(zggbak,ZGGBAK)
-#define LAPACK_shgeqz LAPACK_GLOBAL(shgeqz,SHGEQZ)
-#define LAPACK_dhgeqz LAPACK_GLOBAL(dhgeqz,DHGEQZ)
-#define LAPACK_chgeqz LAPACK_GLOBAL(chgeqz,CHGEQZ)
-#define LAPACK_zhgeqz LAPACK_GLOBAL(zhgeqz,ZHGEQZ)
-#define LAPACK_stgevc LAPACK_GLOBAL(stgevc,STGEVC)
-#define LAPACK_dtgevc LAPACK_GLOBAL(dtgevc,DTGEVC)
-#define LAPACK_ctgevc LAPACK_GLOBAL(ctgevc,CTGEVC)
-#define LAPACK_ztgevc LAPACK_GLOBAL(ztgevc,ZTGEVC)
-#define LAPACK_stgexc LAPACK_GLOBAL(stgexc,STGEXC)
-#define LAPACK_dtgexc LAPACK_GLOBAL(dtgexc,DTGEXC)
-#define LAPACK_ctgexc LAPACK_GLOBAL(ctgexc,CTGEXC)
-#define LAPACK_ztgexc LAPACK_GLOBAL(ztgexc,ZTGEXC)
-#define LAPACK_stgsen LAPACK_GLOBAL(stgsen,STGSEN)
-#define LAPACK_dtgsen LAPACK_GLOBAL(dtgsen,DTGSEN)
-#define LAPACK_ctgsen LAPACK_GLOBAL(ctgsen,CTGSEN)
-#define LAPACK_ztgsen LAPACK_GLOBAL(ztgsen,ZTGSEN)
-#define LAPACK_stgsyl LAPACK_GLOBAL(stgsyl,STGSYL)
-#define LAPACK_dtgsyl LAPACK_GLOBAL(dtgsyl,DTGSYL)
-#define LAPACK_ctgsyl LAPACK_GLOBAL(ctgsyl,CTGSYL)
-#define LAPACK_ztgsyl LAPACK_GLOBAL(ztgsyl,ZTGSYL)
-#define LAPACK_stgsna LAPACK_GLOBAL(stgsna,STGSNA)
-#define LAPACK_dtgsna LAPACK_GLOBAL(dtgsna,DTGSNA)
-#define LAPACK_ctgsna LAPACK_GLOBAL(ctgsna,CTGSNA)
-#define LAPACK_ztgsna LAPACK_GLOBAL(ztgsna,ZTGSNA)
-#define LAPACK_sggsvp LAPACK_GLOBAL(sggsvp,SGGSVP)
-#define LAPACK_dggsvp LAPACK_GLOBAL(dggsvp,DGGSVP)
-#define LAPACK_cggsvp LAPACK_GLOBAL(cggsvp,CGGSVP)
-#define LAPACK_zggsvp LAPACK_GLOBAL(zggsvp,ZGGSVP)
-#define LAPACK_stgsja LAPACK_GLOBAL(stgsja,STGSJA)
-#define LAPACK_dtgsja LAPACK_GLOBAL(dtgsja,DTGSJA)
-#define LAPACK_ctgsja LAPACK_GLOBAL(ctgsja,CTGSJA)
-#define LAPACK_ztgsja LAPACK_GLOBAL(ztgsja,ZTGSJA)
-#define LAPACK_sgels LAPACK_GLOBAL(sgels,SGELS)
-#define LAPACK_dgels LAPACK_GLOBAL(dgels,DGELS)
-#define LAPACK_cgels LAPACK_GLOBAL(cgels,CGELS)
-#define LAPACK_zgels LAPACK_GLOBAL(zgels,ZGELS)
-#define LAPACK_sgelsy LAPACK_GLOBAL(sgelsy,SGELSY)
-#define LAPACK_dgelsy LAPACK_GLOBAL(dgelsy,DGELSY)
-#define LAPACK_cgelsy LAPACK_GLOBAL(cgelsy,CGELSY)
-#define LAPACK_zgelsy LAPACK_GLOBAL(zgelsy,ZGELSY)
-#define LAPACK_sgelss LAPACK_GLOBAL(sgelss,SGELSS)
-#define LAPACK_dgelss LAPACK_GLOBAL(dgelss,DGELSS)
-#define LAPACK_cgelss LAPACK_GLOBAL(cgelss,CGELSS)
-#define LAPACK_zgelss LAPACK_GLOBAL(zgelss,ZGELSS)
-#define LAPACK_sgelsd LAPACK_GLOBAL(sgelsd,SGELSD)
-#define LAPACK_dgelsd LAPACK_GLOBAL(dgelsd,DGELSD)
-#define LAPACK_cgelsd LAPACK_GLOBAL(cgelsd,CGELSD)
-#define LAPACK_zgelsd LAPACK_GLOBAL(zgelsd,ZGELSD)
-#define LAPACK_sgglse LAPACK_GLOBAL(sgglse,SGGLSE)
-#define LAPACK_dgglse LAPACK_GLOBAL(dgglse,DGGLSE)
-#define LAPACK_cgglse LAPACK_GLOBAL(cgglse,CGGLSE)
-#define LAPACK_zgglse LAPACK_GLOBAL(zgglse,ZGGLSE)
-#define LAPACK_sggglm LAPACK_GLOBAL(sggglm,SGGGLM)
-#define LAPACK_dggglm LAPACK_GLOBAL(dggglm,DGGGLM)
-#define LAPACK_cggglm LAPACK_GLOBAL(cggglm,CGGGLM)
-#define LAPACK_zggglm LAPACK_GLOBAL(zggglm,ZGGGLM)
-#define LAPACK_ssyev LAPACK_GLOBAL(ssyev,SSYEV)
-#define LAPACK_dsyev LAPACK_GLOBAL(dsyev,DSYEV)
-#define LAPACK_cheev LAPACK_GLOBAL(cheev,CHEEV)
-#define LAPACK_zheev LAPACK_GLOBAL(zheev,ZHEEV)
-#define LAPACK_ssyevd LAPACK_GLOBAL(ssyevd,SSYEVD)
-#define LAPACK_dsyevd LAPACK_GLOBAL(dsyevd,DSYEVD)
-#define LAPACK_cheevd LAPACK_GLOBAL(cheevd,CHEEVD)
-#define LAPACK_zheevd LAPACK_GLOBAL(zheevd,ZHEEVD)
-#define LAPACK_ssyevx LAPACK_GLOBAL(ssyevx,SSYEVX)
-#define LAPACK_dsyevx LAPACK_GLOBAL(dsyevx,DSYEVX)
-#define LAPACK_cheevx LAPACK_GLOBAL(cheevx,CHEEVX)
-#define LAPACK_zheevx LAPACK_GLOBAL(zheevx,ZHEEVX)
-#define LAPACK_ssyevr LAPACK_GLOBAL(ssyevr,SSYEVR)
-#define LAPACK_dsyevr LAPACK_GLOBAL(dsyevr,DSYEVR)
-#define LAPACK_cheevr LAPACK_GLOBAL(cheevr,CHEEVR)
-#define LAPACK_zheevr LAPACK_GLOBAL(zheevr,ZHEEVR)
-#define LAPACK_sspev LAPACK_GLOBAL(sspev,SSPEV)
-#define LAPACK_dspev LAPACK_GLOBAL(dspev,DSPEV)
-#define LAPACK_chpev LAPACK_GLOBAL(chpev,CHPEV)
-#define LAPACK_zhpev LAPACK_GLOBAL(zhpev,ZHPEV)
-#define LAPACK_sspevd LAPACK_GLOBAL(sspevd,SSPEVD)
-#define LAPACK_dspevd LAPACK_GLOBAL(dspevd,DSPEVD)
-#define LAPACK_chpevd LAPACK_GLOBAL(chpevd,CHPEVD)
-#define LAPACK_zhpevd LAPACK_GLOBAL(zhpevd,ZHPEVD)
-#define LAPACK_sspevx LAPACK_GLOBAL(sspevx,SSPEVX)
-#define LAPACK_dspevx LAPACK_GLOBAL(dspevx,DSPEVX)
-#define LAPACK_chpevx LAPACK_GLOBAL(chpevx,CHPEVX)
-#define LAPACK_zhpevx LAPACK_GLOBAL(zhpevx,ZHPEVX)
-#define LAPACK_ssbev LAPACK_GLOBAL(ssbev,SSBEV)
-#define LAPACK_dsbev LAPACK_GLOBAL(dsbev,DSBEV)
-#define LAPACK_chbev LAPACK_GLOBAL(chbev,CHBEV)
-#define LAPACK_zhbev LAPACK_GLOBAL(zhbev,ZHBEV)
-#define LAPACK_ssbevd LAPACK_GLOBAL(ssbevd,SSBEVD)
-#define LAPACK_dsbevd LAPACK_GLOBAL(dsbevd,DSBEVD)
-#define LAPACK_chbevd LAPACK_GLOBAL(chbevd,CHBEVD)
-#define LAPACK_zhbevd LAPACK_GLOBAL(zhbevd,ZHBEVD)
-#define LAPACK_ssbevx LAPACK_GLOBAL(ssbevx,SSBEVX)
-#define LAPACK_dsbevx LAPACK_GLOBAL(dsbevx,DSBEVX)
-#define LAPACK_chbevx LAPACK_GLOBAL(chbevx,CHBEVX)
-#define LAPACK_zhbevx LAPACK_GLOBAL(zhbevx,ZHBEVX)
-#define LAPACK_sstev LAPACK_GLOBAL(sstev,SSTEV)
-#define LAPACK_dstev LAPACK_GLOBAL(dstev,DSTEV)
-#define LAPACK_sstevd LAPACK_GLOBAL(sstevd,SSTEVD)
-#define LAPACK_dstevd LAPACK_GLOBAL(dstevd,DSTEVD)
-#define LAPACK_sstevx LAPACK_GLOBAL(sstevx,SSTEVX)
-#define LAPACK_dstevx LAPACK_GLOBAL(dstevx,DSTEVX)
-#define LAPACK_sstevr LAPACK_GLOBAL(sstevr,SSTEVR)
-#define LAPACK_dstevr LAPACK_GLOBAL(dstevr,DSTEVR)
-#define LAPACK_sgees LAPACK_GLOBAL(sgees,SGEES)
-#define LAPACK_dgees LAPACK_GLOBAL(dgees,DGEES)
-#define LAPACK_cgees LAPACK_GLOBAL(cgees,CGEES)
-#define LAPACK_zgees LAPACK_GLOBAL(zgees,ZGEES)
-#define LAPACK_sgeesx LAPACK_GLOBAL(sgeesx,SGEESX)
-#define LAPACK_dgeesx LAPACK_GLOBAL(dgeesx,DGEESX)
-#define LAPACK_cgeesx LAPACK_GLOBAL(cgeesx,CGEESX)
-#define LAPACK_zgeesx LAPACK_GLOBAL(zgeesx,ZGEESX)
-#define LAPACK_sgeev LAPACK_GLOBAL(sgeev,SGEEV)
-#define LAPACK_dgeev LAPACK_GLOBAL(dgeev,DGEEV)
-#define LAPACK_cgeev LAPACK_GLOBAL(cgeev,CGEEV)
-#define LAPACK_zgeev LAPACK_GLOBAL(zgeev,ZGEEV)
-#define LAPACK_sgeevx LAPACK_GLOBAL(sgeevx,SGEEVX)
-#define LAPACK_dgeevx LAPACK_GLOBAL(dgeevx,DGEEVX)
-#define LAPACK_cgeevx LAPACK_GLOBAL(cgeevx,CGEEVX)
-#define LAPACK_zgeevx LAPACK_GLOBAL(zgeevx,ZGEEVX)
-#define LAPACK_sgesvd LAPACK_GLOBAL(sgesvd,SGESVD)
-#define LAPACK_dgesvd LAPACK_GLOBAL(dgesvd,DGESVD)
-#define LAPACK_cgesvd LAPACK_GLOBAL(cgesvd,CGESVD)
-#define LAPACK_zgesvd LAPACK_GLOBAL(zgesvd,ZGESVD)
-#define LAPACK_sgesdd LAPACK_GLOBAL(sgesdd,SGESDD)
-#define LAPACK_dgesdd LAPACK_GLOBAL(dgesdd,DGESDD)
-#define LAPACK_cgesdd LAPACK_GLOBAL(cgesdd,CGESDD)
-#define LAPACK_zgesdd LAPACK_GLOBAL(zgesdd,ZGESDD)
-#define LAPACK_dgejsv LAPACK_GLOBAL(dgejsv,DGEJSV)
-#define LAPACK_sgejsv LAPACK_GLOBAL(sgejsv,SGEJSV)
-#define LAPACK_dgesvj LAPACK_GLOBAL(dgesvj,DGESVJ)
-#define LAPACK_sgesvj LAPACK_GLOBAL(sgesvj,SGESVJ)
-#define LAPACK_sggsvd LAPACK_GLOBAL(sggsvd,SGGSVD)
-#define LAPACK_dggsvd LAPACK_GLOBAL(dggsvd,DGGSVD)
-#define LAPACK_cggsvd LAPACK_GLOBAL(cggsvd,CGGSVD)
-#define LAPACK_zggsvd LAPACK_GLOBAL(zggsvd,ZGGSVD)
-#define LAPACK_ssygv LAPACK_GLOBAL(ssygv,SSYGV)
-#define LAPACK_dsygv LAPACK_GLOBAL(dsygv,DSYGV)
-#define LAPACK_chegv LAPACK_GLOBAL(chegv,CHEGV)
-#define LAPACK_zhegv LAPACK_GLOBAL(zhegv,ZHEGV)
-#define LAPACK_ssygvd LAPACK_GLOBAL(ssygvd,SSYGVD)
-#define LAPACK_dsygvd LAPACK_GLOBAL(dsygvd,DSYGVD)
-#define LAPACK_chegvd LAPACK_GLOBAL(chegvd,CHEGVD)
-#define LAPACK_zhegvd LAPACK_GLOBAL(zhegvd,ZHEGVD)
-#define LAPACK_ssygvx LAPACK_GLOBAL(ssygvx,SSYGVX)
-#define LAPACK_dsygvx LAPACK_GLOBAL(dsygvx,DSYGVX)
-#define LAPACK_chegvx LAPACK_GLOBAL(chegvx,CHEGVX)
-#define LAPACK_zhegvx LAPACK_GLOBAL(zhegvx,ZHEGVX)
-#define LAPACK_sspgv LAPACK_GLOBAL(sspgv,SSPGV)
-#define LAPACK_dspgv LAPACK_GLOBAL(dspgv,DSPGV)
-#define LAPACK_chpgv LAPACK_GLOBAL(chpgv,CHPGV)
-#define LAPACK_zhpgv LAPACK_GLOBAL(zhpgv,ZHPGV)
-#define LAPACK_sspgvd LAPACK_GLOBAL(sspgvd,SSPGVD)
-#define LAPACK_dspgvd LAPACK_GLOBAL(dspgvd,DSPGVD)
-#define LAPACK_chpgvd LAPACK_GLOBAL(chpgvd,CHPGVD)
-#define LAPACK_zhpgvd LAPACK_GLOBAL(zhpgvd,ZHPGVD)
-#define LAPACK_sspgvx LAPACK_GLOBAL(sspgvx,SSPGVX)
-#define LAPACK_dspgvx LAPACK_GLOBAL(dspgvx,DSPGVX)
-#define LAPACK_chpgvx LAPACK_GLOBAL(chpgvx,CHPGVX)
-#define LAPACK_zhpgvx LAPACK_GLOBAL(zhpgvx,ZHPGVX)
-#define LAPACK_ssbgv LAPACK_GLOBAL(ssbgv,SSBGV)
-#define LAPACK_dsbgv LAPACK_GLOBAL(dsbgv,DSBGV)
-#define LAPACK_chbgv LAPACK_GLOBAL(chbgv,CHBGV)
-#define LAPACK_zhbgv LAPACK_GLOBAL(zhbgv,ZHBGV)
-#define LAPACK_ssbgvd LAPACK_GLOBAL(ssbgvd,SSBGVD)
-#define LAPACK_dsbgvd LAPACK_GLOBAL(dsbgvd,DSBGVD)
-#define LAPACK_chbgvd LAPACK_GLOBAL(chbgvd,CHBGVD)
-#define LAPACK_zhbgvd LAPACK_GLOBAL(zhbgvd,ZHBGVD)
-#define LAPACK_ssbgvx LAPACK_GLOBAL(ssbgvx,SSBGVX)
-#define LAPACK_dsbgvx LAPACK_GLOBAL(dsbgvx,DSBGVX)
-#define LAPACK_chbgvx LAPACK_GLOBAL(chbgvx,CHBGVX)
-#define LAPACK_zhbgvx LAPACK_GLOBAL(zhbgvx,ZHBGVX)
-#define LAPACK_sgges LAPACK_GLOBAL(sgges,SGGES)
-#define LAPACK_dgges LAPACK_GLOBAL(dgges,DGGES)
-#define LAPACK_cgges LAPACK_GLOBAL(cgges,CGGES)
-#define LAPACK_zgges LAPACK_GLOBAL(zgges,ZGGES)
-#define LAPACK_sggesx LAPACK_GLOBAL(sggesx,SGGESX)
-#define LAPACK_dggesx LAPACK_GLOBAL(dggesx,DGGESX)
-#define LAPACK_cggesx LAPACK_GLOBAL(cggesx,CGGESX)
-#define LAPACK_zggesx LAPACK_GLOBAL(zggesx,ZGGESX)
-#define LAPACK_sggev LAPACK_GLOBAL(sggev,SGGEV)
-#define LAPACK_dggev LAPACK_GLOBAL(dggev,DGGEV)
-#define LAPACK_cggev LAPACK_GLOBAL(cggev,CGGEV)
-#define LAPACK_zggev LAPACK_GLOBAL(zggev,ZGGEV)
-#define LAPACK_sggevx LAPACK_GLOBAL(sggevx,SGGEVX)
-#define LAPACK_dggevx LAPACK_GLOBAL(dggevx,DGGEVX)
-#define LAPACK_cggevx LAPACK_GLOBAL(cggevx,CGGEVX)
-#define LAPACK_zggevx LAPACK_GLOBAL(zggevx,ZGGEVX)
-#define LAPACK_dsfrk LAPACK_GLOBAL(dsfrk,DSFRK)
-#define LAPACK_ssfrk LAPACK_GLOBAL(ssfrk,SSFRK)
-#define LAPACK_zhfrk LAPACK_GLOBAL(zhfrk,ZHFRK)
-#define LAPACK_chfrk LAPACK_GLOBAL(chfrk,CHFRK)
-#define LAPACK_dtfsm LAPACK_GLOBAL(dtfsm,DTFSM)
-#define LAPACK_stfsm LAPACK_GLOBAL(stfsm,STFSM)
-#define LAPACK_ztfsm LAPACK_GLOBAL(ztfsm,ZTFSM)
-#define LAPACK_ctfsm LAPACK_GLOBAL(ctfsm,CTFSM)
-#define LAPACK_dtfttp LAPACK_GLOBAL(dtfttp,DTFTTP)
-#define LAPACK_stfttp LAPACK_GLOBAL(stfttp,STFTTP)
-#define LAPACK_ztfttp LAPACK_GLOBAL(ztfttp,ZTFTTP)
-#define LAPACK_ctfttp LAPACK_GLOBAL(ctfttp,CTFTTP)
-#define LAPACK_dtfttr LAPACK_GLOBAL(dtfttr,DTFTTR)
-#define LAPACK_stfttr LAPACK_GLOBAL(stfttr,STFTTR)
-#define LAPACK_ztfttr LAPACK_GLOBAL(ztfttr,ZTFTTR)
-#define LAPACK_ctfttr LAPACK_GLOBAL(ctfttr,CTFTTR)
-#define LAPACK_dtpttf LAPACK_GLOBAL(dtpttf,DTPTTF)
-#define LAPACK_stpttf LAPACK_GLOBAL(stpttf,STPTTF)
-#define LAPACK_ztpttf LAPACK_GLOBAL(ztpttf,ZTPTTF)
-#define LAPACK_ctpttf LAPACK_GLOBAL(ctpttf,CTPTTF)
-#define LAPACK_dtpttr LAPACK_GLOBAL(dtpttr,DTPTTR)
-#define LAPACK_stpttr LAPACK_GLOBAL(stpttr,STPTTR)
-#define LAPACK_ztpttr LAPACK_GLOBAL(ztpttr,ZTPTTR)
-#define LAPACK_ctpttr LAPACK_GLOBAL(ctpttr,CTPTTR)
-#define LAPACK_dtrttf LAPACK_GLOBAL(dtrttf,DTRTTF)
-#define LAPACK_strttf LAPACK_GLOBAL(strttf,STRTTF)
-#define LAPACK_ztrttf LAPACK_GLOBAL(ztrttf,ZTRTTF)
-#define LAPACK_ctrttf LAPACK_GLOBAL(ctrttf,CTRTTF)
-#define LAPACK_dtrttp LAPACK_GLOBAL(dtrttp,DTRTTP)
-#define LAPACK_strttp LAPACK_GLOBAL(strttp,STRTTP)
-#define LAPACK_ztrttp LAPACK_GLOBAL(ztrttp,ZTRTTP)
-#define LAPACK_ctrttp LAPACK_GLOBAL(ctrttp,CTRTTP)
-#define LAPACK_sgeqrfp LAPACK_GLOBAL(sgeqrfp,SGEQRFP)
-#define LAPACK_dgeqrfp LAPACK_GLOBAL(dgeqrfp,DGEQRFP)
-#define LAPACK_cgeqrfp LAPACK_GLOBAL(cgeqrfp,CGEQRFP)
-#define LAPACK_zgeqrfp LAPACK_GLOBAL(zgeqrfp,ZGEQRFP)
-#define LAPACK_clacgv LAPACK_GLOBAL(clacgv,CLACGV)
-#define LAPACK_zlacgv LAPACK_GLOBAL(zlacgv,ZLACGV)
-#define LAPACK_slarnv LAPACK_GLOBAL(slarnv,SLARNV)
-#define LAPACK_dlarnv LAPACK_GLOBAL(dlarnv,DLARNV)
-#define LAPACK_clarnv LAPACK_GLOBAL(clarnv,CLARNV)
-#define LAPACK_zlarnv LAPACK_GLOBAL(zlarnv,ZLARNV)
-#define LAPACK_sgeqr2 LAPACK_GLOBAL(sgeqr2,SGEQR2)
-#define LAPACK_dgeqr2 LAPACK_GLOBAL(dgeqr2,DGEQR2)
-#define LAPACK_cgeqr2 LAPACK_GLOBAL(cgeqr2,CGEQR2)
-#define LAPACK_zgeqr2 LAPACK_GLOBAL(zgeqr2,ZGEQR2)
-#define LAPACK_slacpy LAPACK_GLOBAL(slacpy,SLACPY)
-#define LAPACK_dlacpy LAPACK_GLOBAL(dlacpy,DLACPY)
-#define LAPACK_clacpy LAPACK_GLOBAL(clacpy,CLACPY)
-#define LAPACK_zlacpy LAPACK_GLOBAL(zlacpy,ZLACPY)
-#define LAPACK_sgetf2 LAPACK_GLOBAL(sgetf2,SGETF2)
-#define LAPACK_dgetf2 LAPACK_GLOBAL(dgetf2,DGETF2)
-#define LAPACK_cgetf2 LAPACK_GLOBAL(cgetf2,CGETF2)
-#define LAPACK_zgetf2 LAPACK_GLOBAL(zgetf2,ZGETF2)
-#define LAPACK_slaswp LAPACK_GLOBAL(slaswp,SLASWP)
-#define LAPACK_dlaswp LAPACK_GLOBAL(dlaswp,DLASWP)
-#define LAPACK_claswp LAPACK_GLOBAL(claswp,CLASWP)
-#define LAPACK_zlaswp LAPACK_GLOBAL(zlaswp,ZLASWP)
-#define LAPACK_slange LAPACK_GLOBAL(slange,SLANGE)
-#define LAPACK_dlange LAPACK_GLOBAL(dlange,DLANGE)
-#define LAPACK_clange LAPACK_GLOBAL(clange,CLANGE)
-#define LAPACK_zlange LAPACK_GLOBAL(zlange,ZLANGE)
-#define LAPACK_clanhe LAPACK_GLOBAL(clanhe,CLANHE)
-#define LAPACK_zlanhe LAPACK_GLOBAL(zlanhe,ZLANHE)
-#define LAPACK_slansy LAPACK_GLOBAL(slansy,SLANSY)
-#define LAPACK_dlansy LAPACK_GLOBAL(dlansy,DLANSY)
-#define LAPACK_clansy LAPACK_GLOBAL(clansy,CLANSY)
-#define LAPACK_zlansy LAPACK_GLOBAL(zlansy,ZLANSY)
-#define LAPACK_slantr LAPACK_GLOBAL(slantr,SLANTR)
-#define LAPACK_dlantr LAPACK_GLOBAL(dlantr,DLANTR)
-#define LAPACK_clantr LAPACK_GLOBAL(clantr,CLANTR)
-#define LAPACK_zlantr LAPACK_GLOBAL(zlantr,ZLANTR)
-#define LAPACK_slamch LAPACK_GLOBAL(slamch,SLAMCH)
-#define LAPACK_dlamch LAPACK_GLOBAL(dlamch,DLAMCH)
-#define LAPACK_sgelq2 LAPACK_GLOBAL(sgelq2,SGELQ2)
-#define LAPACK_dgelq2 LAPACK_GLOBAL(dgelq2,DGELQ2)
-#define LAPACK_cgelq2 LAPACK_GLOBAL(cgelq2,CGELQ2)
-#define LAPACK_zgelq2 LAPACK_GLOBAL(zgelq2,ZGELQ2)
-#define LAPACK_slarfb LAPACK_GLOBAL(slarfb,SLARFB)
-#define LAPACK_dlarfb LAPACK_GLOBAL(dlarfb,DLARFB)
-#define LAPACK_clarfb LAPACK_GLOBAL(clarfb,CLARFB)
-#define LAPACK_zlarfb LAPACK_GLOBAL(zlarfb,ZLARFB)
-#define LAPACK_slarfg LAPACK_GLOBAL(slarfg,SLARFG)
-#define LAPACK_dlarfg LAPACK_GLOBAL(dlarfg,DLARFG)
-#define LAPACK_clarfg LAPACK_GLOBAL(clarfg,CLARFG)
-#define LAPACK_zlarfg LAPACK_GLOBAL(zlarfg,ZLARFG)
-#define LAPACK_slarft LAPACK_GLOBAL(slarft,SLARFT)
-#define LAPACK_dlarft LAPACK_GLOBAL(dlarft,DLARFT)
-#define LAPACK_clarft LAPACK_GLOBAL(clarft,CLARFT)
-#define LAPACK_zlarft LAPACK_GLOBAL(zlarft,ZLARFT)
-#define LAPACK_slarfx LAPACK_GLOBAL(slarfx,SLARFX)
-#define LAPACK_dlarfx LAPACK_GLOBAL(dlarfx,DLARFX)
-#define LAPACK_clarfx LAPACK_GLOBAL(clarfx,CLARFX)
-#define LAPACK_zlarfx LAPACK_GLOBAL(zlarfx,ZLARFX)
-#define LAPACK_slatms LAPACK_GLOBAL(slatms,SLATMS)
-#define LAPACK_dlatms LAPACK_GLOBAL(dlatms,DLATMS)
-#define LAPACK_clatms LAPACK_GLOBAL(clatms,CLATMS)
-#define LAPACK_zlatms LAPACK_GLOBAL(zlatms,ZLATMS)
-#define LAPACK_slag2d LAPACK_GLOBAL(slag2d,SLAG2D)
-#define LAPACK_dlag2s LAPACK_GLOBAL(dlag2s,DLAG2S)
-#define LAPACK_clag2z LAPACK_GLOBAL(clag2z,CLAG2Z)
-#define LAPACK_zlag2c LAPACK_GLOBAL(zlag2c,ZLAG2C)
-#define LAPACK_slauum LAPACK_GLOBAL(slauum,SLAUUM)
-#define LAPACK_dlauum LAPACK_GLOBAL(dlauum,DLAUUM)
-#define LAPACK_clauum LAPACK_GLOBAL(clauum,CLAUUM)
-#define LAPACK_zlauum LAPACK_GLOBAL(zlauum,ZLAUUM)
-#define LAPACK_slagge LAPACK_GLOBAL(slagge,SLAGGE)
-#define LAPACK_dlagge LAPACK_GLOBAL(dlagge,DLAGGE)
-#define LAPACK_clagge LAPACK_GLOBAL(clagge,CLAGGE)
-#define LAPACK_zlagge LAPACK_GLOBAL(zlagge,ZLAGGE)
-#define LAPACK_slaset LAPACK_GLOBAL(slaset,SLASET)
-#define LAPACK_dlaset LAPACK_GLOBAL(dlaset,DLASET)
-#define LAPACK_claset LAPACK_GLOBAL(claset,CLASET)
-#define LAPACK_zlaset LAPACK_GLOBAL(zlaset,ZLASET)
-#define LAPACK_slasrt LAPACK_GLOBAL(slasrt,SLASRT)
-#define LAPACK_dlasrt LAPACK_GLOBAL(dlasrt,DLASRT)
-#define LAPACK_slagsy LAPACK_GLOBAL(slagsy,SLAGSY)
-#define LAPACK_dlagsy LAPACK_GLOBAL(dlagsy,DLAGSY)
-#define LAPACK_clagsy LAPACK_GLOBAL(clagsy,CLAGSY)
-#define LAPACK_zlagsy LAPACK_GLOBAL(zlagsy,ZLAGSY)
-#define LAPACK_claghe LAPACK_GLOBAL(claghe,CLAGHE)
-#define LAPACK_zlaghe LAPACK_GLOBAL(zlaghe,ZLAGHE)
-#define LAPACK_slapmr LAPACK_GLOBAL(slapmr,SLAPMR)
-#define LAPACK_dlapmr LAPACK_GLOBAL(dlapmr,DLAPMR)
-#define LAPACK_clapmr LAPACK_GLOBAL(clapmr,CLAPMR)
-#define LAPACK_zlapmr LAPACK_GLOBAL(zlapmr,ZLAPMR)
-#define LAPACK_slapy2 LAPACK_GLOBAL(slapy2,SLAPY2)
-#define LAPACK_dlapy2 LAPACK_GLOBAL(dlapy2,DLAPY2)
-#define LAPACK_slapy3 LAPACK_GLOBAL(slapy3,SLAPY3)
-#define LAPACK_dlapy3 LAPACK_GLOBAL(dlapy3,DLAPY3)
-#define LAPACK_slartgp LAPACK_GLOBAL(slartgp,SLARTGP)
-#define LAPACK_dlartgp LAPACK_GLOBAL(dlartgp,DLARTGP)
-#define LAPACK_slartgs LAPACK_GLOBAL(slartgs,SLARTGS)
-#define LAPACK_dlartgs LAPACK_GLOBAL(dlartgs,DLARTGS)
 // LAPACK 3.3.0
-#define LAPACK_cbbcsd LAPACK_GLOBAL(cbbcsd,CBBCSD)
-#define LAPACK_cheswapr LAPACK_GLOBAL(cheswapr,CHESWAPR)
-#define LAPACK_chetri2 LAPACK_GLOBAL(chetri2,CHETRI2)
-#define LAPACK_chetri2x LAPACK_GLOBAL(chetri2x,CHETRI2X)
-#define LAPACK_chetrs2 LAPACK_GLOBAL(chetrs2,CHETRS2)
-#define LAPACK_csyconv LAPACK_GLOBAL(csyconv,CSYCONV)
-#define LAPACK_csyswapr LAPACK_GLOBAL(csyswapr,CSYSWAPR)
-#define LAPACK_csytri2 LAPACK_GLOBAL(csytri2,CSYTRI2)
-#define LAPACK_csytri2x LAPACK_GLOBAL(csytri2x,CSYTRI2X)
-#define LAPACK_csytrs2 LAPACK_GLOBAL(csytrs2,CSYTRS2)
-#define LAPACK_cunbdb LAPACK_GLOBAL(cunbdb,CUNBDB)
-#define LAPACK_cuncsd LAPACK_GLOBAL(cuncsd,CUNCSD)
-#define LAPACK_dbbcsd LAPACK_GLOBAL(dbbcsd,DBBCSD)
-#define LAPACK_dorbdb LAPACK_GLOBAL(dorbdb,DORBDB)
-#define LAPACK_dorcsd LAPACK_GLOBAL(dorcsd,DORCSD)
-#define LAPACK_dsyconv LAPACK_GLOBAL(dsyconv,DSYCONV)
-#define LAPACK_dsyswapr LAPACK_GLOBAL(dsyswapr,DSYSWAPR)
-#define LAPACK_dsytri2 LAPACK_GLOBAL(dsytri2,DSYTRI2)
-#define LAPACK_dsytri2x LAPACK_GLOBAL(dsytri2x,DSYTRI2X)
-#define LAPACK_dsytrs2 LAPACK_GLOBAL(dsytrs2,DSYTRS2)
-#define LAPACK_sbbcsd LAPACK_GLOBAL(sbbcsd,SBBCSD)
-#define LAPACK_sorbdb LAPACK_GLOBAL(sorbdb,SORBDB)
-#define LAPACK_sorcsd LAPACK_GLOBAL(sorcsd,SORCSD)
-#define LAPACK_ssyconv LAPACK_GLOBAL(ssyconv,SSYCONV)
-#define LAPACK_ssyswapr LAPACK_GLOBAL(ssyswapr,SSYSWAPR)
-#define LAPACK_ssytri2 LAPACK_GLOBAL(ssytri2,SSYTRI2)
-#define LAPACK_ssytri2x LAPACK_GLOBAL(ssytri2x,SSYTRI2X)
-#define LAPACK_ssytrs2 LAPACK_GLOBAL(ssytrs2,SSYTRS2)
-#define LAPACK_zbbcsd LAPACK_GLOBAL(zbbcsd,ZBBCSD)
-#define LAPACK_zheswapr LAPACK_GLOBAL(zheswapr,ZHESWAPR)
-#define LAPACK_zhetri2 LAPACK_GLOBAL(zhetri2,ZHETRI2)
-#define LAPACK_zhetri2x LAPACK_GLOBAL(zhetri2x,ZHETRI2X)
-#define LAPACK_zhetrs2 LAPACK_GLOBAL(zhetrs2,ZHETRS2)
-#define LAPACK_zsyconv LAPACK_GLOBAL(zsyconv,ZSYCONV)
-#define LAPACK_zsyswapr LAPACK_GLOBAL(zsyswapr,ZSYSWAPR)
-#define LAPACK_zsytri2 LAPACK_GLOBAL(zsytri2,ZSYTRI2)
-#define LAPACK_zsytri2x LAPACK_GLOBAL(zsytri2x,ZSYTRI2X)
-#define LAPACK_zsytrs2 LAPACK_GLOBAL(zsytrs2,ZSYTRS2)
-#define LAPACK_zunbdb LAPACK_GLOBAL(zunbdb,ZUNBDB)
-#define LAPACK_zuncsd LAPACK_GLOBAL(zuncsd,ZUNCSD)
+lapack_int LAPACKE_cbbcsd(int matrix_order, char jobu1, char jobu2, char jobv1t, char jobv2t, char trans, lapack_int m,
+                          lapack_int p, lapack_int q, float* theta, float* phi, lapack_complex_float* u1,
+                          lapack_int ldu1, lapack_complex_float* u2, lapack_int ldu2, lapack_complex_float* v1t,
+                          lapack_int ldv1t, lapack_complex_float* v2t, lapack_int ldv2t, float* b11d, float* b11e,
+                          float* b12d, float* b12e, float* b21d, float* b21e, float* b22d, float* b22e);
+lapack_int LAPACKE_cbbcsd_work(int matrix_order, char jobu1, char jobu2, char jobv1t, char jobv2t, char trans,
+                               lapack_int m, lapack_int p, lapack_int q, float* theta, float* phi,
+                               lapack_complex_float* u1, lapack_int ldu1, lapack_complex_float* u2, lapack_int ldu2,
+                               lapack_complex_float* v1t, lapack_int ldv1t, lapack_complex_float* v2t, lapack_int ldv2t,
+                               float* b11d, float* b11e, float* b12d, float* b12e, float* b21d, float* b21e,
+                               float* b22d, float* b22e, float* rwork, lapack_int lrwork);
+lapack_int LAPACKE_cheswapr(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int i1,
+                            lapack_int i2);
+lapack_int LAPACKE_cheswapr_work(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int i1,
+                                 lapack_int i2);
+lapack_int LAPACKE_chetri2(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                           const lapack_int* ipiv);
+lapack_int LAPACKE_chetri2_work(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                                const lapack_int* ipiv, lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_chetri2x(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                            const lapack_int* ipiv, lapack_int nb);
+lapack_int LAPACKE_chetri2x_work(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                                 const lapack_int* ipiv, lapack_complex_float* work, lapack_int nb);
+lapack_int LAPACKE_chetrs2(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_float* a,
+                           lapack_int lda, const lapack_int* ipiv, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_chetrs2_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs,
+                                const lapack_complex_float* a, lapack_int lda, const lapack_int* ipiv,
+                                lapack_complex_float* b, lapack_int ldb, lapack_complex_float* work);
+lapack_int LAPACKE_csyconv(int matrix_order, char uplo, char way, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                           const lapack_int* ipiv);
+lapack_int LAPACKE_csyconv_work(int matrix_order, char uplo, char way, lapack_int n, lapack_complex_float* a,
+                                lapack_int lda, const lapack_int* ipiv, lapack_complex_float* work);
+lapack_int LAPACKE_csyswapr(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int i1,
+                            lapack_int i2);
+lapack_int LAPACKE_csyswapr_work(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int i1,
+                                 lapack_int i2);
+lapack_int LAPACKE_csytri2(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                           const lapack_int* ipiv);
+lapack_int LAPACKE_csytri2_work(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                                const lapack_int* ipiv, lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_csytri2x(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                            const lapack_int* ipiv, lapack_int nb);
+lapack_int LAPACKE_csytri2x_work(int matrix_order, char uplo, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                                 const lapack_int* ipiv, lapack_complex_float* work, lapack_int nb);
+lapack_int LAPACKE_csytrs2(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_float* a,
+                           lapack_int lda, const lapack_int* ipiv, lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_csytrs2_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs,
+                                const lapack_complex_float* a, lapack_int lda, const lapack_int* ipiv,
+                                lapack_complex_float* b, lapack_int ldb, lapack_complex_float* work);
+lapack_int LAPACKE_cunbdb(int matrix_order, char trans, char signs, lapack_int m, lapack_int p, lapack_int q,
+                          lapack_complex_float* x11, lapack_int ldx11, lapack_complex_float* x12, lapack_int ldx12,
+                          lapack_complex_float* x21, lapack_int ldx21, lapack_complex_float* x22, lapack_int ldx22,
+                          float* theta, float* phi, lapack_complex_float* taup1, lapack_complex_float* taup2,
+                          lapack_complex_float* tauq1, lapack_complex_float* tauq2);
+lapack_int LAPACKE_cunbdb_work(int matrix_order, char trans, char signs, lapack_int m, lapack_int p, lapack_int q,
+                               lapack_complex_float* x11, lapack_int ldx11, lapack_complex_float* x12, lapack_int ldx12,
+                               lapack_complex_float* x21, lapack_int ldx21, lapack_complex_float* x22, lapack_int ldx22,
+                               float* theta, float* phi, lapack_complex_float* taup1, lapack_complex_float* taup2,
+                               lapack_complex_float* tauq1, lapack_complex_float* tauq2, lapack_complex_float* work,
+                               lapack_int lwork);
+lapack_int LAPACKE_cuncsd(int matrix_order, char jobu1, char jobu2, char jobv1t, char jobv2t, char trans, char signs,
+                          lapack_int m, lapack_int p, lapack_int q, lapack_complex_float* x11, lapack_int ldx11,
+                          lapack_complex_float* x12, lapack_int ldx12, lapack_complex_float* x21, lapack_int ldx21,
+                          lapack_complex_float* x22, lapack_int ldx22, float* theta, lapack_complex_float* u1,
+                          lapack_int ldu1, lapack_complex_float* u2, lapack_int ldu2, lapack_complex_float* v1t,
+                          lapack_int ldv1t, lapack_complex_float* v2t, lapack_int ldv2t);
+lapack_int LAPACKE_cuncsd_work(int matrix_order, char jobu1, char jobu2, char jobv1t, char jobv2t, char trans,
+                               char signs, lapack_int m, lapack_int p, lapack_int q, lapack_complex_float* x11,
+                               lapack_int ldx11, lapack_complex_float* x12, lapack_int ldx12, lapack_complex_float* x21,
+                               lapack_int ldx21, lapack_complex_float* x22, lapack_int ldx22, float* theta,
+                               lapack_complex_float* u1, lapack_int ldu1, lapack_complex_float* u2, lapack_int ldu2,
+                               lapack_complex_float* v1t, lapack_int ldv1t, lapack_complex_float* v2t, lapack_int ldv2t,
+                               lapack_complex_float* work, lapack_int lwork, float* rwork, lapack_int lrwork,
+                               lapack_int* iwork);
+lapack_int LAPACKE_dbbcsd(int matrix_order, char jobu1, char jobu2, char jobv1t, char jobv2t, char trans, lapack_int m,
+                          lapack_int p, lapack_int q, double* theta, double* phi, double* u1, lapack_int ldu1,
+                          double* u2, lapack_int ldu2, double* v1t, lapack_int ldv1t, double* v2t, lapack_int ldv2t,
+                          double* b11d, double* b11e, double* b12d, double* b12e, double* b21d, double* b21e,
+                          double* b22d, double* b22e);
+lapack_int LAPACKE_dbbcsd_work(int matrix_order, char jobu1, char jobu2, char jobv1t, char jobv2t, char trans,
+                               lapack_int m, lapack_int p, lapack_int q, double* theta, double* phi, double* u1,
+                               lapack_int ldu1, double* u2, lapack_int ldu2, double* v1t, lapack_int ldv1t, double* v2t,
+                               lapack_int ldv2t, double* b11d, double* b11e, double* b12d, double* b12e, double* b21d,
+                               double* b21e, double* b22d, double* b22e, double* work, lapack_int lwork);
+lapack_int LAPACKE_dorbdb(int matrix_order, char trans, char signs, lapack_int m, lapack_int p, lapack_int q,
+                          double* x11, lapack_int ldx11, double* x12, lapack_int ldx12, double* x21, lapack_int ldx21,
+                          double* x22, lapack_int ldx22, double* theta, double* phi, double* taup1, double* taup2,
+                          double* tauq1, double* tauq2);
+lapack_int LAPACKE_dorbdb_work(int matrix_order, char trans, char signs, lapack_int m, lapack_int p, lapack_int q,
+                               double* x11, lapack_int ldx11, double* x12, lapack_int ldx12, double* x21,
+                               lapack_int ldx21, double* x22, lapack_int ldx22, double* theta, double* phi,
+                               double* taup1, double* taup2, double* tauq1, double* tauq2, double* work,
+                               lapack_int lwork);
+lapack_int LAPACKE_dorcsd(int matrix_order, char jobu1, char jobu2, char jobv1t, char jobv2t, char trans, char signs,
+                          lapack_int m, lapack_int p, lapack_int q, double* x11, lapack_int ldx11, double* x12,
+                          lapack_int ldx12, double* x21, lapack_int ldx21, double* x22, lapack_int ldx22, double* theta,
+                          double* u1, lapack_int ldu1, double* u2, lapack_int ldu2, double* v1t, lapack_int ldv1t,
+                          double* v2t, lapack_int ldv2t);
+lapack_int LAPACKE_dorcsd_work(int matrix_order, char jobu1, char jobu2, char jobv1t, char jobv2t, char trans,
+                               char signs, lapack_int m, lapack_int p, lapack_int q, double* x11, lapack_int ldx11,
+                               double* x12, lapack_int ldx12, double* x21, lapack_int ldx21, double* x22,
+                               lapack_int ldx22, double* theta, double* u1, lapack_int ldu1, double* u2,
+                               lapack_int ldu2, double* v1t, lapack_int ldv1t, double* v2t, lapack_int ldv2t,
+                               double* work, lapack_int lwork, lapack_int* iwork);
+lapack_int LAPACKE_dsyconv(int matrix_order, char uplo, char way, lapack_int n, double* a, lapack_int lda,
+                           const lapack_int* ipiv);
+lapack_int LAPACKE_dsyconv_work(int matrix_order, char uplo, char way, lapack_int n, double* a, lapack_int lda,
+                                const lapack_int* ipiv, double* work);
+lapack_int LAPACKE_dsyswapr(int matrix_order, char uplo, lapack_int n, double* a, lapack_int i1, lapack_int i2);
+lapack_int LAPACKE_dsyswapr_work(int matrix_order, char uplo, lapack_int n, double* a, lapack_int i1, lapack_int i2);
+lapack_int LAPACKE_dsytri2(int matrix_order, char uplo, lapack_int n, double* a, lapack_int lda,
+                           const lapack_int* ipiv);
+lapack_int LAPACKE_dsytri2_work(int matrix_order, char uplo, lapack_int n, double* a, lapack_int lda,
+                                const lapack_int* ipiv, lapack_complex_double* work, lapack_int lwork);
+lapack_int LAPACKE_dsytri2x(int matrix_order, char uplo, lapack_int n, double* a, lapack_int lda,
+                            const lapack_int* ipiv, lapack_int nb);
+lapack_int LAPACKE_dsytri2x_work(int matrix_order, char uplo, lapack_int n, double* a, lapack_int lda,
+                                 const lapack_int* ipiv, double* work, lapack_int nb);
+lapack_int LAPACKE_dsytrs2(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const double* a, lapack_int lda,
+                           const lapack_int* ipiv, double* b, lapack_int ldb);
+lapack_int LAPACKE_dsytrs2_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const double* a,
+                                lapack_int lda, const lapack_int* ipiv, double* b, lapack_int ldb, double* work);
+lapack_int LAPACKE_sbbcsd(int matrix_order, char jobu1, char jobu2, char jobv1t, char jobv2t, char trans, lapack_int m,
+                          lapack_int p, lapack_int q, float* theta, float* phi, float* u1, lapack_int ldu1, float* u2,
+                          lapack_int ldu2, float* v1t, lapack_int ldv1t, float* v2t, lapack_int ldv2t, float* b11d,
+                          float* b11e, float* b12d, float* b12e, float* b21d, float* b21e, float* b22d, float* b22e);
+lapack_int LAPACKE_sbbcsd_work(int matrix_order, char jobu1, char jobu2, char jobv1t, char jobv2t, char trans,
+                               lapack_int m, lapack_int p, lapack_int q, float* theta, float* phi, float* u1,
+                               lapack_int ldu1, float* u2, lapack_int ldu2, float* v1t, lapack_int ldv1t, float* v2t,
+                               lapack_int ldv2t, float* b11d, float* b11e, float* b12d, float* b12e, float* b21d,
+                               float* b21e, float* b22d, float* b22e, float* work, lapack_int lwork);
+lapack_int LAPACKE_sorbdb(int matrix_order, char trans, char signs, lapack_int m, lapack_int p, lapack_int q,
+                          float* x11, lapack_int ldx11, float* x12, lapack_int ldx12, float* x21, lapack_int ldx21,
+                          float* x22, lapack_int ldx22, float* theta, float* phi, float* taup1, float* taup2,
+                          float* tauq1, float* tauq2);
+lapack_int LAPACKE_sorbdb_work(int matrix_order, char trans, char signs, lapack_int m, lapack_int p, lapack_int q,
+                               float* x11, lapack_int ldx11, float* x12, lapack_int ldx12, float* x21, lapack_int ldx21,
+                               float* x22, lapack_int ldx22, float* theta, float* phi, float* taup1, float* taup2,
+                               float* tauq1, float* tauq2, float* work, lapack_int lwork);
+lapack_int LAPACKE_sorcsd(int matrix_order, char jobu1, char jobu2, char jobv1t, char jobv2t, char trans, char signs,
+                          lapack_int m, lapack_int p, lapack_int q, float* x11, lapack_int ldx11, float* x12,
+                          lapack_int ldx12, float* x21, lapack_int ldx21, float* x22, lapack_int ldx22, float* theta,
+                          float* u1, lapack_int ldu1, float* u2, lapack_int ldu2, float* v1t, lapack_int ldv1t,
+                          float* v2t, lapack_int ldv2t);
+lapack_int LAPACKE_sorcsd_work(int matrix_order, char jobu1, char jobu2, char jobv1t, char jobv2t, char trans,
+                               char signs, lapack_int m, lapack_int p, lapack_int q, float* x11, lapack_int ldx11,
+                               float* x12, lapack_int ldx12, float* x21, lapack_int ldx21, float* x22, lapack_int ldx22,
+                               float* theta, float* u1, lapack_int ldu1, float* u2, lapack_int ldu2, float* v1t,
+                               lapack_int ldv1t, float* v2t, lapack_int ldv2t, float* work, lapack_int lwork,
+                               lapack_int* iwork);
+lapack_int LAPACKE_ssyconv(int matrix_order, char uplo, char way, lapack_int n, float* a, lapack_int lda,
+                           const lapack_int* ipiv);
+lapack_int LAPACKE_ssyconv_work(int matrix_order, char uplo, char way, lapack_int n, float* a, lapack_int lda,
+                                const lapack_int* ipiv, float* work);
+lapack_int LAPACKE_ssyswapr(int matrix_order, char uplo, lapack_int n, float* a, lapack_int i1, lapack_int i2);
+lapack_int LAPACKE_ssyswapr_work(int matrix_order, char uplo, lapack_int n, float* a, lapack_int i1, lapack_int i2);
+lapack_int LAPACKE_ssytri2(int matrix_order, char uplo, lapack_int n, float* a, lapack_int lda, const lapack_int* ipiv);
+lapack_int LAPACKE_ssytri2_work(int matrix_order, char uplo, lapack_int n, float* a, lapack_int lda,
+                                const lapack_int* ipiv, lapack_complex_float* work, lapack_int lwork);
+lapack_int LAPACKE_ssytri2x(int matrix_order, char uplo, lapack_int n, float* a, lapack_int lda, const lapack_int* ipiv,
+                            lapack_int nb);
+lapack_int LAPACKE_ssytri2x_work(int matrix_order, char uplo, lapack_int n, float* a, lapack_int lda,
+                                 const lapack_int* ipiv, float* work, lapack_int nb);
+lapack_int LAPACKE_ssytrs2(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const float* a, lapack_int lda,
+                           const lapack_int* ipiv, float* b, lapack_int ldb);
+lapack_int LAPACKE_ssytrs2_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const float* a,
+                                lapack_int lda, const lapack_int* ipiv, float* b, lapack_int ldb, float* work);
+lapack_int LAPACKE_zbbcsd(int matrix_order, char jobu1, char jobu2, char jobv1t, char jobv2t, char trans, lapack_int m,
+                          lapack_int p, lapack_int q, double* theta, double* phi, lapack_complex_double* u1,
+                          lapack_int ldu1, lapack_complex_double* u2, lapack_int ldu2, lapack_complex_double* v1t,
+                          lapack_int ldv1t, lapack_complex_double* v2t, lapack_int ldv2t, double* b11d, double* b11e,
+                          double* b12d, double* b12e, double* b21d, double* b21e, double* b22d, double* b22e);
+lapack_int LAPACKE_zbbcsd_work(int matrix_order, char jobu1, char jobu2, char jobv1t, char jobv2t, char trans,
+                               lapack_int m, lapack_int p, lapack_int q, double* theta, double* phi,
+                               lapack_complex_double* u1, lapack_int ldu1, lapack_complex_double* u2, lapack_int ldu2,
+                               lapack_complex_double* v1t, lapack_int ldv1t, lapack_complex_double* v2t,
+                               lapack_int ldv2t, double* b11d, double* b11e, double* b12d, double* b12e, double* b21d,
+                               double* b21e, double* b22d, double* b22e, double* rwork, lapack_int lrwork);
+lapack_int LAPACKE_zheswapr(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int i1,
+                            lapack_int i2);
+lapack_int LAPACKE_zheswapr_work(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int i1,
+                                 lapack_int i2);
+lapack_int LAPACKE_zhetri2(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                           const lapack_int* ipiv);
+lapack_int LAPACKE_zhetri2_work(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                                const lapack_int* ipiv, lapack_complex_double* work, lapack_int lwork);
+lapack_int LAPACKE_zhetri2x(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                            const lapack_int* ipiv, lapack_int nb);
+lapack_int LAPACKE_zhetri2x_work(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                                 const lapack_int* ipiv, lapack_complex_double* work, lapack_int nb);
+lapack_int LAPACKE_zhetrs2(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double* a,
+                           lapack_int lda, const lapack_int* ipiv, lapack_complex_double* b, lapack_int ldb);
+lapack_int LAPACKE_zhetrs2_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs,
+                                const lapack_complex_double* a, lapack_int lda, const lapack_int* ipiv,
+                                lapack_complex_double* b, lapack_int ldb, lapack_complex_double* work);
+lapack_int LAPACKE_zsyconv(int matrix_order, char uplo, char way, lapack_int n, lapack_complex_double* a,
+                           lapack_int lda, const lapack_int* ipiv);
+lapack_int LAPACKE_zsyconv_work(int matrix_order, char uplo, char way, lapack_int n, lapack_complex_double* a,
+                                lapack_int lda, const lapack_int* ipiv, lapack_complex_double* work);
+lapack_int LAPACKE_zsyswapr(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int i1,
+                            lapack_int i2);
+lapack_int LAPACKE_zsyswapr_work(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int i1,
+                                 lapack_int i2);
+lapack_int LAPACKE_zsytri2(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                           const lapack_int* ipiv);
+lapack_int LAPACKE_zsytri2_work(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                                const lapack_int* ipiv, lapack_complex_double* work, lapack_int lwork);
+lapack_int LAPACKE_zsytri2x(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                            const lapack_int* ipiv, lapack_int nb);
+lapack_int LAPACKE_zsytri2x_work(int matrix_order, char uplo, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                                 const lapack_int* ipiv, lapack_complex_double* work, lapack_int nb);
+lapack_int LAPACKE_zsytrs2(int matrix_order, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double* a,
+                           lapack_int lda, const lapack_int* ipiv, lapack_complex_double* b, lapack_int ldb);
+lapack_int LAPACKE_zsytrs2_work(int matrix_order, char uplo, lapack_int n, lapack_int nrhs,
+                                const lapack_complex_double* a, lapack_int lda, const lapack_int* ipiv,
+                                lapack_complex_double* b, lapack_int ldb, lapack_complex_double* work);
+lapack_int LAPACKE_zunbdb(int matrix_order, char trans, char signs, lapack_int m, lapack_int p, lapack_int q,
+                          lapack_complex_double* x11, lapack_int ldx11, lapack_complex_double* x12, lapack_int ldx12,
+                          lapack_complex_double* x21, lapack_int ldx21, lapack_complex_double* x22, lapack_int ldx22,
+                          double* theta, double* phi, lapack_complex_double* taup1, lapack_complex_double* taup2,
+                          lapack_complex_double* tauq1, lapack_complex_double* tauq2);
+lapack_int LAPACKE_zunbdb_work(int matrix_order, char trans, char signs, lapack_int m, lapack_int p, lapack_int q,
+                               lapack_complex_double* x11, lapack_int ldx11, lapack_complex_double* x12,
+                               lapack_int ldx12, lapack_complex_double* x21, lapack_int ldx21,
+                               lapack_complex_double* x22, lapack_int ldx22, double* theta, double* phi,
+                               lapack_complex_double* taup1, lapack_complex_double* taup2, lapack_complex_double* tauq1,
+                               lapack_complex_double* tauq2, lapack_complex_double* work, lapack_int lwork);
+lapack_int LAPACKE_zuncsd(int matrix_order, char jobu1, char jobu2, char jobv1t, char jobv2t, char trans, char signs,
+                          lapack_int m, lapack_int p, lapack_int q, lapack_complex_double* x11, lapack_int ldx11,
+                          lapack_complex_double* x12, lapack_int ldx12, lapack_complex_double* x21, lapack_int ldx21,
+                          lapack_complex_double* x22, lapack_int ldx22, double* theta, lapack_complex_double* u1,
+                          lapack_int ldu1, lapack_complex_double* u2, lapack_int ldu2, lapack_complex_double* v1t,
+                          lapack_int ldv1t, lapack_complex_double* v2t, lapack_int ldv2t);
+lapack_int LAPACKE_zuncsd_work(int matrix_order, char jobu1, char jobu2, char jobv1t, char jobv2t, char trans,
+                               char signs, lapack_int m, lapack_int p, lapack_int q, lapack_complex_double* x11,
+                               lapack_int ldx11, lapack_complex_double* x12, lapack_int ldx12,
+                               lapack_complex_double* x21, lapack_int ldx21, lapack_complex_double* x22,
+                               lapack_int ldx22, double* theta, lapack_complex_double* u1, lapack_int ldu1,
+                               lapack_complex_double* u2, lapack_int ldu2, lapack_complex_double* v1t, lapack_int ldv1t,
+                               lapack_complex_double* v2t, lapack_int ldv2t, lapack_complex_double* work,
+                               lapack_int lwork, double* rwork, lapack_int lrwork, lapack_int* iwork);
 // LAPACK 3.4.0
-#define LAPACK_sgemqrt LAPACK_GLOBAL(sgemqrt,SGEMQRT)
-#define LAPACK_dgemqrt LAPACK_GLOBAL(dgemqrt,DGEMQRT)
-#define LAPACK_cgemqrt LAPACK_GLOBAL(cgemqrt,CGEMQRT)
-#define LAPACK_zgemqrt LAPACK_GLOBAL(zgemqrt,ZGEMQRT)
-#define LAPACK_sgeqrt LAPACK_GLOBAL(sgeqrt,SGEQRT)
-#define LAPACK_dgeqrt LAPACK_GLOBAL(dgeqrt,DGEQRT)
-#define LAPACK_cgeqrt LAPACK_GLOBAL(cgeqrt,CGEQRT)
-#define LAPACK_zgeqrt LAPACK_GLOBAL(zgeqrt,ZGEQRT)
-#define LAPACK_sgeqrt2 LAPACK_GLOBAL(sgeqrt2,SGEQRT2)
-#define LAPACK_dgeqrt2 LAPACK_GLOBAL(dgeqrt2,DGEQRT2)
-#define LAPACK_cgeqrt2 LAPACK_GLOBAL(cgeqrt2,CGEQRT2)
-#define LAPACK_zgeqrt2 LAPACK_GLOBAL(zgeqrt2,ZGEQRT2)
-#define LAPACK_sgeqrt3 LAPACK_GLOBAL(sgeqrt3,SGEQRT3)
-#define LAPACK_dgeqrt3 LAPACK_GLOBAL(dgeqrt3,DGEQRT3)
-#define LAPACK_cgeqrt3 LAPACK_GLOBAL(cgeqrt3,CGEQRT3)
-#define LAPACK_zgeqrt3 LAPACK_GLOBAL(zgeqrt3,ZGEQRT3)
-#define LAPACK_stpmqrt LAPACK_GLOBAL(stpmqrt,STPMQRT)
-#define LAPACK_dtpmqrt LAPACK_GLOBAL(dtpmqrt,DTPMQRT)
-#define LAPACK_ctpmqrt LAPACK_GLOBAL(ctpmqrt,CTPMQRT)
-#define LAPACK_ztpmqrt LAPACK_GLOBAL(ztpmqrt,ZTPMQRT)
-#define LAPACK_dtpqrt LAPACK_GLOBAL(dtpqrt,DTPQRT)
-#define LAPACK_ctpqrt LAPACK_GLOBAL(ctpqrt,CTPQRT)
-#define LAPACK_ztpqrt LAPACK_GLOBAL(ztpqrt,ZTPQRT)
-#define LAPACK_stpqrt2 LAPACK_GLOBAL(stpqrt2,STPQRT2)
-#define LAPACK_dtpqrt2 LAPACK_GLOBAL(dtpqrt2,DTPQRT2)
-#define LAPACK_ctpqrt2 LAPACK_GLOBAL(ctpqrt2,CTPQRT2)
-#define LAPACK_ztpqrt2 LAPACK_GLOBAL(ztpqrt2,ZTPQRT2)
-#define LAPACK_stprfb LAPACK_GLOBAL(stprfb,STPRFB)
-#define LAPACK_dtprfb LAPACK_GLOBAL(dtprfb,DTPRFB)
-#define LAPACK_ctprfb LAPACK_GLOBAL(ctprfb,CTPRFB)
-#define LAPACK_ztprfb LAPACK_GLOBAL(ztprfb,ZTPRFB)
+lapack_int LAPACKE_sgemqrt(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                           lapack_int nb, const float* v, lapack_int ldv, const float* t, lapack_int ldt, float* c,
+                           lapack_int ldc);
+lapack_int LAPACKE_dgemqrt(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                           lapack_int nb, const double* v, lapack_int ldv, const double* t, lapack_int ldt, double* c,
+                           lapack_int ldc);
+lapack_int LAPACKE_cgemqrt(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                           lapack_int nb, const lapack_complex_float* v, lapack_int ldv, const lapack_complex_float* t,
+                           lapack_int ldt, lapack_complex_float* c, lapack_int ldc);
+lapack_int LAPACKE_zgemqrt(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                           lapack_int nb, const lapack_complex_double* v, lapack_int ldv,
+                           const lapack_complex_double* t, lapack_int ldt, lapack_complex_double* c, lapack_int ldc);
+
+lapack_int LAPACKE_sgeqrt(int matrix_order, lapack_int m, lapack_int n, lapack_int nb, float* a, lapack_int lda,
+                          float* t, lapack_int ldt);
+lapack_int LAPACKE_dgeqrt(int matrix_order, lapack_int m, lapack_int n, lapack_int nb, double* a, lapack_int lda,
+                          double* t, lapack_int ldt);
+lapack_int LAPACKE_cgeqrt(int matrix_order, lapack_int m, lapack_int n, lapack_int nb, lapack_complex_float* a,
+                          lapack_int lda, lapack_complex_float* t, lapack_int ldt);
+lapack_int LAPACKE_zgeqrt(int matrix_order, lapack_int m, lapack_int n, lapack_int nb, lapack_complex_double* a,
+                          lapack_int lda, lapack_complex_double* t, lapack_int ldt);
+
+lapack_int LAPACKE_sgeqrt2(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, float* t,
+                           lapack_int ldt);
+lapack_int LAPACKE_dgeqrt2(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda, double* t,
+                           lapack_int ldt);
+lapack_int LAPACKE_cgeqrt2(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                           lapack_complex_float* t, lapack_int ldt);
+lapack_int LAPACKE_zgeqrt2(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                           lapack_complex_double* t, lapack_int ldt);
+
+lapack_int LAPACKE_sgeqrt3(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, float* t,
+                           lapack_int ldt);
+lapack_int LAPACKE_dgeqrt3(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda, double* t,
+                           lapack_int ldt);
+lapack_int LAPACKE_cgeqrt3(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                           lapack_complex_float* t, lapack_int ldt);
+lapack_int LAPACKE_zgeqrt3(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                           lapack_complex_double* t, lapack_int ldt);
+
+lapack_int LAPACKE_stpmqrt(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                           lapack_int l, lapack_int nb, const float* v, lapack_int ldv, const float* t, lapack_int ldt,
+                           float* a, lapack_int lda, float* b, lapack_int ldb);
+lapack_int LAPACKE_dtpmqrt(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                           lapack_int l, lapack_int nb, const double* v, lapack_int ldv, const double* t,
+                           lapack_int ldt, double* a, lapack_int lda, double* b, lapack_int ldb);
+lapack_int LAPACKE_ctpmqrt(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                           lapack_int l, lapack_int nb, const lapack_complex_float* v, lapack_int ldv,
+                           const lapack_complex_float* t, lapack_int ldt, lapack_complex_float* a, lapack_int lda,
+                           lapack_complex_float* b, lapack_int ldb);
+lapack_int LAPACKE_ztpmqrt(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                           lapack_int l, lapack_int nb, const lapack_complex_double* v, lapack_int ldv,
+                           const lapack_complex_double* t, lapack_int ldt, lapack_complex_double* a, lapack_int lda,
+                           lapack_complex_double* b, lapack_int ldb);
+
+lapack_int LAPACKE_dtpqrt(int matrix_order, lapack_int m, lapack_int n, lapack_int l, lapack_int nb, double* a,
+                          lapack_int lda, double* b, lapack_int ldb, double* t, lapack_int ldt);
+lapack_int LAPACKE_ctpqrt(int matrix_order, lapack_int m, lapack_int n, lapack_int l, lapack_int nb,
+                          lapack_complex_float* a, lapack_int lda, lapack_complex_float* t, lapack_complex_float* b,
+                          lapack_int ldb, lapack_int ldt);
+lapack_int LAPACKE_ztpqrt(int matrix_order, lapack_int m, lapack_int n, lapack_int l, lapack_int nb,
+                          lapack_complex_double* a, lapack_int lda, lapack_complex_double* b, lapack_int ldb,
+                          lapack_complex_double* t, lapack_int ldt);
+
+lapack_int LAPACKE_stpqrt2(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, float* b,
+                           lapack_int ldb, float* t, lapack_int ldt);
+lapack_int LAPACKE_dtpqrt2(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda, double* b,
+                           lapack_int ldb, double* t, lapack_int ldt);
+lapack_int LAPACKE_ctpqrt2(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                           lapack_complex_float* b, lapack_int ldb, lapack_complex_float* t, lapack_int ldt);
+lapack_int LAPACKE_ztpqrt2(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                           lapack_complex_double* b, lapack_int ldb, lapack_complex_double* t, lapack_int ldt);
+
+lapack_int LAPACKE_stprfb(int matrix_order, char side, char trans, char direct, char storev, lapack_int m, lapack_int n,
+                          lapack_int k, lapack_int l, const float* v, lapack_int ldv, const float* t, lapack_int ldt,
+                          float* a, lapack_int lda, float* b, lapack_int ldb, lapack_int myldwork);
+lapack_int LAPACKE_dtprfb(int matrix_order, char side, char trans, char direct, char storev, lapack_int m, lapack_int n,
+                          lapack_int k, lapack_int l, const double* v, lapack_int ldv, const double* t, lapack_int ldt,
+                          double* a, lapack_int lda, double* b, lapack_int ldb, lapack_int myldwork);
+lapack_int LAPACKE_ctprfb(int matrix_order, char side, char trans, char direct, char storev, lapack_int m, lapack_int n,
+                          lapack_int k, lapack_int l, const lapack_complex_float* v, lapack_int ldv,
+                          const lapack_complex_float* t, lapack_int ldt, lapack_complex_float* a, lapack_int lda,
+                          lapack_complex_float* b, lapack_int ldb, lapack_int myldwork);
+lapack_int LAPACKE_ztprfb(int matrix_order, char side, char trans, char direct, char storev, lapack_int m, lapack_int n,
+                          lapack_int k, lapack_int l, const lapack_complex_double* v, lapack_int ldv,
+                          const lapack_complex_double* t, lapack_int ldt, lapack_complex_double* a, lapack_int lda,
+                          lapack_complex_double* b, lapack_int ldb, lapack_int myldwork);
+
+lapack_int LAPACKE_sgemqrt_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                                lapack_int nb, const float* v, lapack_int ldv, const float* t, lapack_int ldt, float* c,
+                                lapack_int ldc, float* work);
+lapack_int LAPACKE_dgemqrt_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                                lapack_int nb, const double* v, lapack_int ldv, const double* t, lapack_int ldt,
+                                double* c, lapack_int ldc, double* work);
+lapack_int LAPACKE_cgemqrt_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                                lapack_int nb, const lapack_complex_float* v, lapack_int ldv,
+                                const lapack_complex_float* t, lapack_int ldt, lapack_complex_float* c, lapack_int ldc,
+                                lapack_complex_float* work);
+lapack_int LAPACKE_zgemqrt_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                                lapack_int nb, const lapack_complex_double* v, lapack_int ldv,
+                                const lapack_complex_double* t, lapack_int ldt, lapack_complex_double* c,
+                                lapack_int ldc, lapack_complex_double* work);
+
+lapack_int LAPACKE_sgeqrt_work(int matrix_order, lapack_int m, lapack_int n, lapack_int nb, float* a, lapack_int lda,
+                               float* t, lapack_int ldt, float* work);
+lapack_int LAPACKE_dgeqrt_work(int matrix_order, lapack_int m, lapack_int n, lapack_int nb, double* a, lapack_int lda,
+                               double* t, lapack_int ldt, double* work);
+lapack_int LAPACKE_cgeqrt_work(int matrix_order, lapack_int m, lapack_int n, lapack_int nb, lapack_complex_float* a,
+                               lapack_int lda, lapack_complex_float* t, lapack_int ldt, lapack_complex_float* work);
+lapack_int LAPACKE_zgeqrt_work(int matrix_order, lapack_int m, lapack_int n, lapack_int nb, lapack_complex_double* a,
+                               lapack_int lda, lapack_complex_double* t, lapack_int ldt, lapack_complex_double* work);
+
+lapack_int LAPACKE_sgeqrt2_work(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, float* t,
+                                lapack_int ldt);
+lapack_int LAPACKE_dgeqrt2_work(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda, double* t,
+                                lapack_int ldt);
+lapack_int LAPACKE_cgeqrt2_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                                lapack_complex_float* t, lapack_int ldt);
+lapack_int LAPACKE_zgeqrt2_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                                lapack_complex_double* t, lapack_int ldt);
+
+lapack_int LAPACKE_sgeqrt3_work(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, float* t,
+                                lapack_int ldt);
+lapack_int LAPACKE_dgeqrt3_work(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda, double* t,
+                                lapack_int ldt);
+lapack_int LAPACKE_cgeqrt3_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                                lapack_complex_float* t, lapack_int ldt);
+lapack_int LAPACKE_zgeqrt3_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                                lapack_complex_double* t, lapack_int ldt);
+
+lapack_int LAPACKE_stpmqrt_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                                lapack_int l, lapack_int nb, const float* v, lapack_int ldv, const float* t,
+                                lapack_int ldt, float* a, lapack_int lda, float* b, lapack_int ldb, float* work);
+lapack_int LAPACKE_dtpmqrt_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                                lapack_int l, lapack_int nb, const double* v, lapack_int ldv, const double* t,
+                                lapack_int ldt, double* a, lapack_int lda, double* b, lapack_int ldb, double* work);
+lapack_int LAPACKE_ctpmqrt_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                                lapack_int l, lapack_int nb, const lapack_complex_float* v, lapack_int ldv,
+                                const lapack_complex_float* t, lapack_int ldt, lapack_complex_float* a, lapack_int lda,
+                                lapack_complex_float* b, lapack_int ldb, lapack_complex_float* work);
+lapack_int LAPACKE_ztpmqrt_work(int matrix_order, char side, char trans, lapack_int m, lapack_int n, lapack_int k,
+                                lapack_int l, lapack_int nb, const lapack_complex_double* v, lapack_int ldv,
+                                const lapack_complex_double* t, lapack_int ldt, lapack_complex_double* a,
+                                lapack_int lda, lapack_complex_double* b, lapack_int ldb, lapack_complex_double* work);
+
+lapack_int LAPACKE_dtpqrt_work(int matrix_order, lapack_int m, lapack_int n, lapack_int l, lapack_int nb, double* a,
+                               lapack_int lda, double* b, lapack_int ldb, double* t, lapack_int ldt, double* work);
+lapack_int LAPACKE_ctpqrt_work(int matrix_order, lapack_int m, lapack_int n, lapack_int l, lapack_int nb,
+                               lapack_complex_float* a, lapack_int lda, lapack_complex_float* t,
+                               lapack_complex_float* b, lapack_int ldb, lapack_int ldt, lapack_complex_float* work);
+lapack_int LAPACKE_ztpqrt_work(int matrix_order, lapack_int m, lapack_int n, lapack_int l, lapack_int nb,
+                               lapack_complex_double* a, lapack_int lda, lapack_complex_double* b, lapack_int ldb,
+                               lapack_complex_double* t, lapack_int ldt, lapack_complex_double* work);
+
+lapack_int LAPACKE_stpqrt2_work(int matrix_order, lapack_int m, lapack_int n, float* a, lapack_int lda, float* b,
+                                lapack_int ldb, float* t, lapack_int ldt);
+lapack_int LAPACKE_dtpqrt2_work(int matrix_order, lapack_int m, lapack_int n, double* a, lapack_int lda, double* b,
+                                lapack_int ldb, double* t, lapack_int ldt);
+lapack_int LAPACKE_ctpqrt2_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_float* a, lapack_int lda,
+                                lapack_complex_float* b, lapack_int ldb, lapack_complex_float* t, lapack_int ldt);
+lapack_int LAPACKE_ztpqrt2_work(int matrix_order, lapack_int m, lapack_int n, lapack_complex_double* a, lapack_int lda,
+                                lapack_complex_double* b, lapack_int ldb, lapack_complex_double* t, lapack_int ldt);
+
+lapack_int LAPACKE_stprfb_work(int matrix_order, char side, char trans, char direct, char storev, lapack_int m,
+                               lapack_int n, lapack_int k, lapack_int l, const float* v, lapack_int ldv, const float* t,
+                               lapack_int ldt, float* a, lapack_int lda, float* b, lapack_int ldb, const float* mywork,
+                               lapack_int myldwork);
+lapack_int LAPACKE_dtprfb_work(int matrix_order, char side, char trans, char direct, char storev, lapack_int m,
+                               lapack_int n, lapack_int k, lapack_int l, const double* v, lapack_int ldv,
+                               const double* t, lapack_int ldt, double* a, lapack_int lda, double* b, lapack_int ldb,
+                               const double* mywork, lapack_int myldwork);
+lapack_int LAPACKE_ctprfb_work(int matrix_order, char side, char trans, char direct, char storev, lapack_int m,
+                               lapack_int n, lapack_int k, lapack_int l, const lapack_complex_float* v, lapack_int ldv,
+                               const lapack_complex_float* t, lapack_int ldt, lapack_complex_float* a, lapack_int lda,
+                               lapack_complex_float* b, lapack_int ldb, const float* mywork, lapack_int myldwork);
+lapack_int LAPACKE_ztprfb_work(int matrix_order, char side, char trans, char direct, char storev, lapack_int m,
+                               lapack_int n, lapack_int k, lapack_int l, const lapack_complex_double* v, lapack_int ldv,
+                               const lapack_complex_double* t, lapack_int ldt, lapack_complex_double* a, lapack_int lda,
+                               lapack_complex_double* b, lapack_int ldb, const double* mywork, lapack_int myldwork);
 // LAPACK 3.X.X
-#define LAPACK_csyr LAPACK_GLOBAL(csyr,CSYR)
-#define LAPACK_zsyr LAPACK_GLOBAL(zsyr,ZSYR)
+lapack_int LAPACKE_csyr(int matrix_order, char uplo, lapack_int n, lapack_complex_float alpha,
+                        const lapack_complex_float* x, lapack_int incx, lapack_complex_float* a, lapack_int lda);
+lapack_int LAPACKE_zsyr(int matrix_order, char uplo, lapack_int n, lapack_complex_double alpha,
+                        const lapack_complex_double* x, lapack_int incx, lapack_complex_double* a, lapack_int lda);
 
+lapack_int LAPACKE_csyr_work(int matrix_order, char uplo, lapack_int n, lapack_complex_float alpha,
+                             const lapack_complex_float* x, lapack_int incx, lapack_complex_float* a, lapack_int lda);
+lapack_int LAPACKE_zsyr_work(int matrix_order, char uplo, lapack_int n, lapack_complex_double alpha,
+                             const lapack_complex_double* x, lapack_int incx, lapack_complex_double* a, lapack_int lda);
 
-void LAPACK_sgetrf( lapack_int* m, lapack_int* n, float* a, lapack_int* lda,
-                    lapack_int* ipiv, lapack_int *info );
-void LAPACK_dgetrf( lapack_int* m, lapack_int* n, double* a, lapack_int* lda,
-                    lapack_int* ipiv, lapack_int *info );
-void LAPACK_cgetrf( lapack_int* m, lapack_int* n, lapack_complex_float* a,
-                    lapack_int* lda, lapack_int* ipiv, lapack_int *info );
-void LAPACK_zgetrf( lapack_int* m, lapack_int* n, lapack_complex_double* a,
-                    lapack_int* lda, lapack_int* ipiv, lapack_int *info );
-void LAPACK_sgbtrf( lapack_int* m, lapack_int* n, lapack_int* kl,
-                    lapack_int* ku, float* ab, lapack_int* ldab,
-                    lapack_int* ipiv, lapack_int *info );
-void LAPACK_dgbtrf( lapack_int* m, lapack_int* n, lapack_int* kl,
-                    lapack_int* ku, double* ab, lapack_int* ldab,
-                    lapack_int* ipiv, lapack_int *info );
-void LAPACK_cgbtrf( lapack_int* m, lapack_int* n, lapack_int* kl,
-                    lapack_int* ku, lapack_complex_float* ab, lapack_int* ldab,
-                    lapack_int* ipiv, lapack_int *info );
-void LAPACK_zgbtrf( lapack_int* m, lapack_int* n, lapack_int* kl,
-                    lapack_int* ku, lapack_complex_double* ab, lapack_int* ldab,
-                    lapack_int* ipiv, lapack_int *info );
-void LAPACK_sgttrf( lapack_int* n, float* dl, float* d, float* du, float* du2,
-                    lapack_int* ipiv, lapack_int *info );
-void LAPACK_dgttrf( lapack_int* n, double* dl, double* d, double* du,
-                    double* du2, lapack_int* ipiv, lapack_int *info );
-void LAPACK_cgttrf( lapack_int* n, lapack_complex_float* dl,
-                    lapack_complex_float* d, lapack_complex_float* du,
-                    lapack_complex_float* du2, lapack_int* ipiv,
-                    lapack_int *info );
-void LAPACK_zgttrf( lapack_int* n, lapack_complex_double* dl,
-                    lapack_complex_double* d, lapack_complex_double* du,
-                    lapack_complex_double* du2, lapack_int* ipiv,
-                    lapack_int *info );
-void LAPACK_spotrf( char* uplo, lapack_int* n, float* a, lapack_int* lda,
-                    lapack_int *info );
-void LAPACK_dpotrf( char* uplo, lapack_int* n, double* a, lapack_int* lda,
-                    lapack_int *info );
-void LAPACK_cpotrf( char* uplo, lapack_int* n, lapack_complex_float* a,
-                    lapack_int* lda, lapack_int *info );
-void LAPACK_zpotrf( char* uplo, lapack_int* n, lapack_complex_double* a,
-                    lapack_int* lda, lapack_int *info );
-void LAPACK_dpstrf( char* uplo, lapack_int* n, double* a, lapack_int* lda,
-                    lapack_int* piv, lapack_int* rank, double* tol,
-                    double* work, lapack_int *info );
-void LAPACK_spstrf( char* uplo, lapack_int* n, float* a, lapack_int* lda,
-                    lapack_int* piv, lapack_int* rank, float* tol, float* work,
-                    lapack_int *info );
-void LAPACK_zpstrf( char* uplo, lapack_int* n, lapack_complex_double* a,
-                    lapack_int* lda, lapack_int* piv, lapack_int* rank,
-                    double* tol, double* work, lapack_int *info );
-void LAPACK_cpstrf( char* uplo, lapack_int* n, lapack_complex_float* a,
-                    lapack_int* lda, lapack_int* piv, lapack_int* rank,
-                    float* tol, float* work, lapack_int *info );
-void LAPACK_dpftrf( char* transr, char* uplo, lapack_int* n, double* a,
-                    lapack_int *info );
-void LAPACK_spftrf( char* transr, char* uplo, lapack_int* n, float* a,
-                    lapack_int *info );
-void LAPACK_zpftrf( char* transr, char* uplo, lapack_int* n,
-                    lapack_complex_double* a, lapack_int *info );
-void LAPACK_cpftrf( char* transr, char* uplo, lapack_int* n,
-                    lapack_complex_float* a, lapack_int *info );
-void LAPACK_spptrf( char* uplo, lapack_int* n, float* ap, lapack_int *info );
-void LAPACK_dpptrf( char* uplo, lapack_int* n, double* ap, lapack_int *info );
-void LAPACK_cpptrf( char* uplo, lapack_int* n, lapack_complex_float* ap,
-                    lapack_int *info );
-void LAPACK_zpptrf( char* uplo, lapack_int* n, lapack_complex_double* ap,
-                    lapack_int *info );
-void LAPACK_spbtrf( char* uplo, lapack_int* n, lapack_int* kd, float* ab,
-                    lapack_int* ldab, lapack_int *info );
-void LAPACK_dpbtrf( char* uplo, lapack_int* n, lapack_int* kd, double* ab,
-                    lapack_int* ldab, lapack_int *info );
-void LAPACK_cpbtrf( char* uplo, lapack_int* n, lapack_int* kd,
-                    lapack_complex_float* ab, lapack_int* ldab,
-                    lapack_int *info );
-void LAPACK_zpbtrf( char* uplo, lapack_int* n, lapack_int* kd,
-                    lapack_complex_double* ab, lapack_int* ldab,
-                    lapack_int *info );
-void LAPACK_spttrf( lapack_int* n, float* d, float* e, lapack_int *info );
-void LAPACK_dpttrf( lapack_int* n, double* d, double* e, lapack_int *info );
-void LAPACK_cpttrf( lapack_int* n, float* d, lapack_complex_float* e,
-                    lapack_int *info );
-void LAPACK_zpttrf( lapack_int* n, double* d, lapack_complex_double* e,
-                    lapack_int *info );
-void LAPACK_ssytrf( char* uplo, lapack_int* n, float* a, lapack_int* lda,
-                    lapack_int* ipiv, float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_dsytrf( char* uplo, lapack_int* n, double* a, lapack_int* lda,
-                    lapack_int* ipiv, double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_csytrf( char* uplo, lapack_int* n, lapack_complex_float* a,
-                    lapack_int* lda, lapack_int* ipiv,
-                    lapack_complex_float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_zsytrf( char* uplo, lapack_int* n, lapack_complex_double* a,
-                    lapack_int* lda, lapack_int* ipiv,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_chetrf( char* uplo, lapack_int* n, lapack_complex_float* a,
-                    lapack_int* lda, lapack_int* ipiv,
-                    lapack_complex_float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_zhetrf( char* uplo, lapack_int* n, lapack_complex_double* a,
-                    lapack_int* lda, lapack_int* ipiv,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_ssptrf( char* uplo, lapack_int* n, float* ap, lapack_int* ipiv,
-                    lapack_int *info );
-void LAPACK_dsptrf( char* uplo, lapack_int* n, double* ap, lapack_int* ipiv,
-                    lapack_int *info );
-void LAPACK_csptrf( char* uplo, lapack_int* n, lapack_complex_float* ap,
-                    lapack_int* ipiv, lapack_int *info );
-void LAPACK_zsptrf( char* uplo, lapack_int* n, lapack_complex_double* ap,
-                    lapack_int* ipiv, lapack_int *info );
-void LAPACK_chptrf( char* uplo, lapack_int* n, lapack_complex_float* ap,
-                    lapack_int* ipiv, lapack_int *info );
-void LAPACK_zhptrf( char* uplo, lapack_int* n, lapack_complex_double* ap,
-                    lapack_int* ipiv, lapack_int *info );
-void LAPACK_sgetrs( char* trans, lapack_int* n, lapack_int* nrhs,
-                    const float* a, lapack_int* lda, const lapack_int* ipiv,
-                    float* b, lapack_int* ldb, lapack_int *info );
-void LAPACK_dgetrs( char* trans, lapack_int* n, lapack_int* nrhs,
-                    const double* a, lapack_int* lda, const lapack_int* ipiv,
-                    double* b, lapack_int* ldb, lapack_int *info );
-void LAPACK_cgetrs( char* trans, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_float* a, lapack_int* lda,
-                    const lapack_int* ipiv, lapack_complex_float* b,
-                    lapack_int* ldb, lapack_int *info );
-void LAPACK_zgetrs( char* trans, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_double* a, lapack_int* lda,
-                    const lapack_int* ipiv, lapack_complex_double* b,
-                    lapack_int* ldb, lapack_int *info );
-void LAPACK_sgbtrs( char* trans, lapack_int* n, lapack_int* kl, lapack_int* ku,
-                    lapack_int* nrhs, const float* ab, lapack_int* ldab,
-                    const lapack_int* ipiv, float* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_dgbtrs( char* trans, lapack_int* n, lapack_int* kl, lapack_int* ku,
-                    lapack_int* nrhs, const double* ab, lapack_int* ldab,
-                    const lapack_int* ipiv, double* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_cgbtrs( char* trans, lapack_int* n, lapack_int* kl, lapack_int* ku,
-                    lapack_int* nrhs, const lapack_complex_float* ab,
-                    lapack_int* ldab, const lapack_int* ipiv,
-                    lapack_complex_float* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_zgbtrs( char* trans, lapack_int* n, lapack_int* kl, lapack_int* ku,
-                    lapack_int* nrhs, const lapack_complex_double* ab,
-                    lapack_int* ldab, const lapack_int* ipiv,
-                    lapack_complex_double* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_sgttrs( char* trans, lapack_int* n, lapack_int* nrhs,
-                    const float* dl, const float* d, const float* du,
-                    const float* du2, const lapack_int* ipiv, float* b,
-                    lapack_int* ldb, lapack_int *info );
-void LAPACK_dgttrs( char* trans, lapack_int* n, lapack_int* nrhs,
-                    const double* dl, const double* d, const double* du,
-                    const double* du2, const lapack_int* ipiv, double* b,
-                    lapack_int* ldb, lapack_int *info );
-void LAPACK_cgttrs( char* trans, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_float* dl,
-                    const lapack_complex_float* d,
-                    const lapack_complex_float* du,
-                    const lapack_complex_float* du2, const lapack_int* ipiv,
-                    lapack_complex_float* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_zgttrs( char* trans, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_double* dl,
-                    const lapack_complex_double* d,
-                    const lapack_complex_double* du,
-                    const lapack_complex_double* du2, const lapack_int* ipiv,
-                    lapack_complex_double* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_spotrs( char* uplo, lapack_int* n, lapack_int* nrhs, const float* a,
-                    lapack_int* lda, float* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_dpotrs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const double* a, lapack_int* lda, double* b,
-                    lapack_int* ldb, lapack_int *info );
-void LAPACK_cpotrs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_float* a, lapack_int* lda,
-                    lapack_complex_float* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_zpotrs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_dpftrs( char* transr, char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const double* a, double* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_spftrs( char* transr, char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const float* a, float* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_zpftrs( char* transr, char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_double* a, lapack_complex_double* b,
-                    lapack_int* ldb, lapack_int *info );
-void LAPACK_cpftrs( char* transr, char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_float* a, lapack_complex_float* b,
-                    lapack_int* ldb, lapack_int *info );
-void LAPACK_spptrs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const float* ap, float* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_dpptrs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const double* ap, double* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_cpptrs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_float* ap, lapack_complex_float* b,
-                    lapack_int* ldb, lapack_int *info );
-void LAPACK_zpptrs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_double* ap, lapack_complex_double* b,
-                    lapack_int* ldb, lapack_int *info );
-void LAPACK_spbtrs( char* uplo, lapack_int* n, lapack_int* kd, lapack_int* nrhs,
-                    const float* ab, lapack_int* ldab, float* b,
-                    lapack_int* ldb, lapack_int *info );
-void LAPACK_dpbtrs( char* uplo, lapack_int* n, lapack_int* kd, lapack_int* nrhs,
-                    const double* ab, lapack_int* ldab, double* b,
-                    lapack_int* ldb, lapack_int *info );
-void LAPACK_cpbtrs( char* uplo, lapack_int* n, lapack_int* kd, lapack_int* nrhs,
-                    const lapack_complex_float* ab, lapack_int* ldab,
-                    lapack_complex_float* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_zpbtrs( char* uplo, lapack_int* n, lapack_int* kd, lapack_int* nrhs,
-                    const lapack_complex_double* ab, lapack_int* ldab,
-                    lapack_complex_double* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_spttrs( lapack_int* n, lapack_int* nrhs, const float* d,
-                    const float* e, float* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_dpttrs( lapack_int* n, lapack_int* nrhs, const double* d,
-                    const double* e, double* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_cpttrs( char* uplo, lapack_int* n, lapack_int* nrhs, const float* d,
-                    const lapack_complex_float* e, lapack_complex_float* b,
-                    lapack_int* ldb, lapack_int *info );
-void LAPACK_zpttrs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const double* d, const lapack_complex_double* e,
-                    lapack_complex_double* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_ssytrs( char* uplo, lapack_int* n, lapack_int* nrhs, const float* a,
-                    lapack_int* lda, const lapack_int* ipiv, float* b,
-                    lapack_int* ldb, lapack_int *info );
-void LAPACK_dsytrs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const double* a, lapack_int* lda, const lapack_int* ipiv,
-                    double* b, lapack_int* ldb, lapack_int *info );
-void LAPACK_csytrs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_float* a, lapack_int* lda,
-                    const lapack_int* ipiv, lapack_complex_float* b,
-                    lapack_int* ldb, lapack_int *info );
-void LAPACK_zsytrs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_double* a, lapack_int* lda,
-                    const lapack_int* ipiv, lapack_complex_double* b,
-                    lapack_int* ldb, lapack_int *info );
-void LAPACK_chetrs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_float* a, lapack_int* lda,
-                    const lapack_int* ipiv, lapack_complex_float* b,
-                    lapack_int* ldb, lapack_int *info );
-void LAPACK_zhetrs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_double* a, lapack_int* lda,
-                    const lapack_int* ipiv, lapack_complex_double* b,
-                    lapack_int* ldb, lapack_int *info );
-void LAPACK_ssptrs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const float* ap, const lapack_int* ipiv, float* b,
-                    lapack_int* ldb, lapack_int *info );
-void LAPACK_dsptrs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const double* ap, const lapack_int* ipiv, double* b,
-                    lapack_int* ldb, lapack_int *info );
-void LAPACK_csptrs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_float* ap, const lapack_int* ipiv,
-                    lapack_complex_float* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_zsptrs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_double* ap, const lapack_int* ipiv,
-                    lapack_complex_double* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_chptrs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_float* ap, const lapack_int* ipiv,
-                    lapack_complex_float* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_zhptrs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_double* ap, const lapack_int* ipiv,
-                    lapack_complex_double* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_strtrs( char* uplo, char* trans, char* diag, lapack_int* n,
-                    lapack_int* nrhs, const float* a, lapack_int* lda, float* b,
-                    lapack_int* ldb, lapack_int *info );
-void LAPACK_dtrtrs( char* uplo, char* trans, char* diag, lapack_int* n,
-                    lapack_int* nrhs, const double* a, lapack_int* lda,
-                    double* b, lapack_int* ldb, lapack_int *info );
-void LAPACK_ctrtrs( char* uplo, char* trans, char* diag, lapack_int* n,
-                    lapack_int* nrhs, const lapack_complex_float* a,
-                    lapack_int* lda, lapack_complex_float* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_ztrtrs( char* uplo, char* trans, char* diag, lapack_int* n,
-                    lapack_int* nrhs, const lapack_complex_double* a,
-                    lapack_int* lda, lapack_complex_double* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_stptrs( char* uplo, char* trans, char* diag, lapack_int* n,
-                    lapack_int* nrhs, const float* ap, float* b,
-                    lapack_int* ldb, lapack_int *info );
-void LAPACK_dtptrs( char* uplo, char* trans, char* diag, lapack_int* n,
-                    lapack_int* nrhs, const double* ap, double* b,
-                    lapack_int* ldb, lapack_int *info );
-void LAPACK_ctptrs( char* uplo, char* trans, char* diag, lapack_int* n,
-                    lapack_int* nrhs, const lapack_complex_float* ap,
-                    lapack_complex_float* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_ztptrs( char* uplo, char* trans, char* diag, lapack_int* n,
-                    lapack_int* nrhs, const lapack_complex_double* ap,
-                    lapack_complex_double* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_stbtrs( char* uplo, char* trans, char* diag, lapack_int* n,
-                    lapack_int* kd, lapack_int* nrhs, const float* ab,
-                    lapack_int* ldab, float* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_dtbtrs( char* uplo, char* trans, char* diag, lapack_int* n,
-                    lapack_int* kd, lapack_int* nrhs, const double* ab,
-                    lapack_int* ldab, double* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_ctbtrs( char* uplo, char* trans, char* diag, lapack_int* n,
-                    lapack_int* kd, lapack_int* nrhs,
-                    const lapack_complex_float* ab, lapack_int* ldab,
-                    lapack_complex_float* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_ztbtrs( char* uplo, char* trans, char* diag, lapack_int* n,
-                    lapack_int* kd, lapack_int* nrhs,
-                    const lapack_complex_double* ab, lapack_int* ldab,
-                    lapack_complex_double* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_sgecon( char* norm, lapack_int* n, const float* a, lapack_int* lda,
-                    float* anorm, float* rcond, float* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_dgecon( char* norm, lapack_int* n, const double* a, lapack_int* lda,
-                    double* anorm, double* rcond, double* work,
-                    lapack_int* iwork, lapack_int *info );
-void LAPACK_cgecon( char* norm, lapack_int* n, const lapack_complex_float* a,
-                    lapack_int* lda, float* anorm, float* rcond,
-                    lapack_complex_float* work, float* rwork,
-                    lapack_int *info );
-void LAPACK_zgecon( char* norm, lapack_int* n, const lapack_complex_double* a,
-                    lapack_int* lda, double* anorm, double* rcond,
-                    lapack_complex_double* work, double* rwork,
-                    lapack_int *info );
-void LAPACK_sgbcon( char* norm, lapack_int* n, lapack_int* kl, lapack_int* ku,
-                    const float* ab, lapack_int* ldab, const lapack_int* ipiv,
-                    float* anorm, float* rcond, float* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_dgbcon( char* norm, lapack_int* n, lapack_int* kl, lapack_int* ku,
-                    const double* ab, lapack_int* ldab, const lapack_int* ipiv,
-                    double* anorm, double* rcond, double* work,
-                    lapack_int* iwork, lapack_int *info );
-void LAPACK_cgbcon( char* norm, lapack_int* n, lapack_int* kl, lapack_int* ku,
-                    const lapack_complex_float* ab, lapack_int* ldab,
-                    const lapack_int* ipiv, float* anorm, float* rcond,
-                    lapack_complex_float* work, float* rwork,
-                    lapack_int *info );
-void LAPACK_zgbcon( char* norm, lapack_int* n, lapack_int* kl, lapack_int* ku,
-                    const lapack_complex_double* ab, lapack_int* ldab,
-                    const lapack_int* ipiv, double* anorm, double* rcond,
-                    lapack_complex_double* work, double* rwork,
-                    lapack_int *info );
-void LAPACK_sgtcon( char* norm, lapack_int* n, const float* dl, const float* d,
-                    const float* du, const float* du2, const lapack_int* ipiv,
-                    float* anorm, float* rcond, float* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_dgtcon( char* norm, lapack_int* n, const double* dl,
-                    const double* d, const double* du, const double* du2,
-                    const lapack_int* ipiv, double* anorm, double* rcond,
-                    double* work, lapack_int* iwork, lapack_int *info );
-void LAPACK_cgtcon( char* norm, lapack_int* n, const lapack_complex_float* dl,
-                    const lapack_complex_float* d,
-                    const lapack_complex_float* du,
-                    const lapack_complex_float* du2, const lapack_int* ipiv,
-                    float* anorm, float* rcond, lapack_complex_float* work,
-                    lapack_int *info );
-void LAPACK_zgtcon( char* norm, lapack_int* n, const lapack_complex_double* dl,
-                    const lapack_complex_double* d,
-                    const lapack_complex_double* du,
-                    const lapack_complex_double* du2, const lapack_int* ipiv,
-                    double* anorm, double* rcond, lapack_complex_double* work,
-                    lapack_int *info );
-void LAPACK_spocon( char* uplo, lapack_int* n, const float* a, lapack_int* lda,
-                    float* anorm, float* rcond, float* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_dpocon( char* uplo, lapack_int* n, const double* a, lapack_int* lda,
-                    double* anorm, double* rcond, double* work,
-                    lapack_int* iwork, lapack_int *info );
-void LAPACK_cpocon( char* uplo, lapack_int* n, const lapack_complex_float* a,
-                    lapack_int* lda, float* anorm, float* rcond,
-                    lapack_complex_float* work, float* rwork,
-                    lapack_int *info );
-void LAPACK_zpocon( char* uplo, lapack_int* n, const lapack_complex_double* a,
-                    lapack_int* lda, double* anorm, double* rcond,
-                    lapack_complex_double* work, double* rwork,
-                    lapack_int *info );
-void LAPACK_sppcon( char* uplo, lapack_int* n, const float* ap, float* anorm,
-                    float* rcond, float* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_dppcon( char* uplo, lapack_int* n, const double* ap, double* anorm,
-                    double* rcond, double* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_cppcon( char* uplo, lapack_int* n, const lapack_complex_float* ap,
-                    float* anorm, float* rcond, lapack_complex_float* work,
-                    float* rwork, lapack_int *info );
-void LAPACK_zppcon( char* uplo, lapack_int* n, const lapack_complex_double* ap,
-                    double* anorm, double* rcond, lapack_complex_double* work,
-                    double* rwork, lapack_int *info );
-void LAPACK_spbcon( char* uplo, lapack_int* n, lapack_int* kd, const float* ab,
-                    lapack_int* ldab, float* anorm, float* rcond, float* work,
-                    lapack_int* iwork, lapack_int *info );
-void LAPACK_dpbcon( char* uplo, lapack_int* n, lapack_int* kd, const double* ab,
-                    lapack_int* ldab, double* anorm, double* rcond,
-                    double* work, lapack_int* iwork, lapack_int *info );
-void LAPACK_cpbcon( char* uplo, lapack_int* n, lapack_int* kd,
-                    const lapack_complex_float* ab, lapack_int* ldab,
-                    float* anorm, float* rcond, lapack_complex_float* work,
-                    float* rwork, lapack_int *info );
-void LAPACK_zpbcon( char* uplo, lapack_int* n, lapack_int* kd,
-                    const lapack_complex_double* ab, lapack_int* ldab,
-                    double* anorm, double* rcond, lapack_complex_double* work,
-                    double* rwork, lapack_int *info );
-void LAPACK_sptcon( lapack_int* n, const float* d, const float* e, float* anorm,
-                    float* rcond, float* work, lapack_int *info );
-void LAPACK_dptcon( lapack_int* n, const double* d, const double* e,
-                    double* anorm, double* rcond, double* work,
-                    lapack_int *info );
-void LAPACK_cptcon( lapack_int* n, const float* d,
-                    const lapack_complex_float* e, float* anorm, float* rcond,
-                    float* work, lapack_int *info );
-void LAPACK_zptcon( lapack_int* n, const double* d,
-                    const lapack_complex_double* e, double* anorm,
-                    double* rcond, double* work, lapack_int *info );
-void LAPACK_ssycon( char* uplo, lapack_int* n, const float* a, lapack_int* lda,
-                    const lapack_int* ipiv, float* anorm, float* rcond,
-                    float* work, lapack_int* iwork, lapack_int *info );
-void LAPACK_dsycon( char* uplo, lapack_int* n, const double* a, lapack_int* lda,
-                    const lapack_int* ipiv, double* anorm, double* rcond,
-                    double* work, lapack_int* iwork, lapack_int *info );
-void LAPACK_csycon( char* uplo, lapack_int* n, const lapack_complex_float* a,
-                    lapack_int* lda, const lapack_int* ipiv, float* anorm,
-                    float* rcond, lapack_complex_float* work,
-                    lapack_int *info );
-void LAPACK_zsycon( char* uplo, lapack_int* n, const lapack_complex_double* a,
-                    lapack_int* lda, const lapack_int* ipiv, double* anorm,
-                    double* rcond, lapack_complex_double* work,
-                    lapack_int *info );
-void LAPACK_checon( char* uplo, lapack_int* n, const lapack_complex_float* a,
-                    lapack_int* lda, const lapack_int* ipiv, float* anorm,
-                    float* rcond, lapack_complex_float* work,
-                    lapack_int *info );
-void LAPACK_zhecon( char* uplo, lapack_int* n, const lapack_complex_double* a,
-                    lapack_int* lda, const lapack_int* ipiv, double* anorm,
-                    double* rcond, lapack_complex_double* work,
-                    lapack_int *info );
-void LAPACK_sspcon( char* uplo, lapack_int* n, const float* ap,
-                    const lapack_int* ipiv, float* anorm, float* rcond,
-                    float* work, lapack_int* iwork, lapack_int *info );
-void LAPACK_dspcon( char* uplo, lapack_int* n, const double* ap,
-                    const lapack_int* ipiv, double* anorm, double* rcond,
-                    double* work, lapack_int* iwork, lapack_int *info );
-void LAPACK_cspcon( char* uplo, lapack_int* n, const lapack_complex_float* ap,
-                    const lapack_int* ipiv, float* anorm, float* rcond,
-                    lapack_complex_float* work, lapack_int *info );
-void LAPACK_zspcon( char* uplo, lapack_int* n, const lapack_complex_double* ap,
-                    const lapack_int* ipiv, double* anorm, double* rcond,
-                    lapack_complex_double* work, lapack_int *info );
-void LAPACK_chpcon( char* uplo, lapack_int* n, const lapack_complex_float* ap,
-                    const lapack_int* ipiv, float* anorm, float* rcond,
-                    lapack_complex_float* work, lapack_int *info );
-void LAPACK_zhpcon( char* uplo, lapack_int* n, const lapack_complex_double* ap,
-                    const lapack_int* ipiv, double* anorm, double* rcond,
-                    lapack_complex_double* work, lapack_int *info );
-void LAPACK_strcon( char* norm, char* uplo, char* diag, lapack_int* n,
-                    const float* a, lapack_int* lda, float* rcond, float* work,
-                    lapack_int* iwork, lapack_int *info );
-void LAPACK_dtrcon( char* norm, char* uplo, char* diag, lapack_int* n,
-                    const double* a, lapack_int* lda, double* rcond,
-                    double* work, lapack_int* iwork, lapack_int *info );
-void LAPACK_ctrcon( char* norm, char* uplo, char* diag, lapack_int* n,
-                    const lapack_complex_float* a, lapack_int* lda,
-                    float* rcond, lapack_complex_float* work, float* rwork,
-                    lapack_int *info );
-void LAPACK_ztrcon( char* norm, char* uplo, char* diag, lapack_int* n,
-                    const lapack_complex_double* a, lapack_int* lda,
-                    double* rcond, lapack_complex_double* work, double* rwork,
-                    lapack_int *info );
-void LAPACK_stpcon( char* norm, char* uplo, char* diag, lapack_int* n,
-                    const float* ap, float* rcond, float* work,
-                    lapack_int* iwork, lapack_int *info );
-void LAPACK_dtpcon( char* norm, char* uplo, char* diag, lapack_int* n,
-                    const double* ap, double* rcond, double* work,
-                    lapack_int* iwork, lapack_int *info );
-void LAPACK_ctpcon( char* norm, char* uplo, char* diag, lapack_int* n,
-                    const lapack_complex_float* ap, float* rcond,
-                    lapack_complex_float* work, float* rwork,
-                    lapack_int *info );
-void LAPACK_ztpcon( char* norm, char* uplo, char* diag, lapack_int* n,
-                    const lapack_complex_double* ap, double* rcond,
-                    lapack_complex_double* work, double* rwork,
-                    lapack_int *info );
-void LAPACK_stbcon( char* norm, char* uplo, char* diag, lapack_int* n,
-                    lapack_int* kd, const float* ab, lapack_int* ldab,
-                    float* rcond, float* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_dtbcon( char* norm, char* uplo, char* diag, lapack_int* n,
-                    lapack_int* kd, const double* ab, lapack_int* ldab,
-                    double* rcond, double* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_ctbcon( char* norm, char* uplo, char* diag, lapack_int* n,
-                    lapack_int* kd, const lapack_complex_float* ab,
-                    lapack_int* ldab, float* rcond, lapack_complex_float* work,
-                    float* rwork, lapack_int *info );
-void LAPACK_ztbcon( char* norm, char* uplo, char* diag, lapack_int* n,
-                    lapack_int* kd, const lapack_complex_double* ab,
-                    lapack_int* ldab, double* rcond,
-                    lapack_complex_double* work, double* rwork,
-                    lapack_int *info );
-void LAPACK_sgerfs( char* trans, lapack_int* n, lapack_int* nrhs,
-                    const float* a, lapack_int* lda, const float* af,
-                    lapack_int* ldaf, const lapack_int* ipiv, const float* b,
-                    lapack_int* ldb, float* x, lapack_int* ldx, float* ferr,
-                    float* berr, float* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_dgerfs( char* trans, lapack_int* n, lapack_int* nrhs,
-                    const double* a, lapack_int* lda, const double* af,
-                    lapack_int* ldaf, const lapack_int* ipiv, const double* b,
-                    lapack_int* ldb, double* x, lapack_int* ldx, double* ferr,
-                    double* berr, double* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_cgerfs( char* trans, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_float* a, lapack_int* lda,
-                    const lapack_complex_float* af, lapack_int* ldaf,
-                    const lapack_int* ipiv, const lapack_complex_float* b,
-                    lapack_int* ldb, lapack_complex_float* x, lapack_int* ldx,
-                    float* ferr, float* berr, lapack_complex_float* work,
-                    float* rwork, lapack_int *info );
-void LAPACK_zgerfs( char* trans, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_double* a, lapack_int* lda,
-                    const lapack_complex_double* af, lapack_int* ldaf,
-                    const lapack_int* ipiv, const lapack_complex_double* b,
-                    lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx,
-                    double* ferr, double* berr, lapack_complex_double* work,
-                    double* rwork, lapack_int *info );
-void LAPACK_dgerfsx( char* trans, char* equed, lapack_int* n, lapack_int* nrhs,
-                     const double* a, lapack_int* lda, const double* af,
-                     lapack_int* ldaf, const lapack_int* ipiv, const double* r,
-                     const double* c, const double* b, lapack_int* ldb,
-                     double* x, lapack_int* ldx, double* rcond, double* berr,
-                     lapack_int* n_err_bnds, double* err_bnds_norm,
-                     double* err_bnds_comp, lapack_int* nparams, double* params,
-                     double* work, lapack_int* iwork, lapack_int *info );
-void LAPACK_sgerfsx( char* trans, char* equed, lapack_int* n, lapack_int* nrhs,
-                     const float* a, lapack_int* lda, const float* af,
-                     lapack_int* ldaf, const lapack_int* ipiv, const float* r,
-                     const float* c, const float* b, lapack_int* ldb, float* x,
-                     lapack_int* ldx, float* rcond, float* berr,
-                     lapack_int* n_err_bnds, float* err_bnds_norm,
-                     float* err_bnds_comp, lapack_int* nparams, float* params,
-                     float* work, lapack_int* iwork, lapack_int *info );
-void LAPACK_zgerfsx( char* trans, char* equed, lapack_int* n, lapack_int* nrhs,
-                     const lapack_complex_double* a, lapack_int* lda,
-                     const lapack_complex_double* af, lapack_int* ldaf,
-                     const lapack_int* ipiv, const double* r, const double* c,
-                     const lapack_complex_double* b, lapack_int* ldb,
-                     lapack_complex_double* x, lapack_int* ldx, double* rcond,
-                     double* berr, lapack_int* n_err_bnds,
-                     double* err_bnds_norm, double* err_bnds_comp,
-                     lapack_int* nparams, double* params,
-                     lapack_complex_double* work, double* rwork,
-                     lapack_int *info );
-void LAPACK_cgerfsx( char* trans, char* equed, lapack_int* n, lapack_int* nrhs,
-                     const lapack_complex_float* a, lapack_int* lda,
-                     const lapack_complex_float* af, lapack_int* ldaf,
-                     const lapack_int* ipiv, const float* r, const float* c,
-                     const lapack_complex_float* b, lapack_int* ldb,
-                     lapack_complex_float* x, lapack_int* ldx, float* rcond,
-                     float* berr, lapack_int* n_err_bnds, float* err_bnds_norm,
-                     float* err_bnds_comp, lapack_int* nparams, float* params,
-                     lapack_complex_float* work, float* rwork,
-                     lapack_int *info );
-void LAPACK_sgbrfs( char* trans, lapack_int* n, lapack_int* kl, lapack_int* ku,
-                    lapack_int* nrhs, const float* ab, lapack_int* ldab,
-                    const float* afb, lapack_int* ldafb, const lapack_int* ipiv,
-                    const float* b, lapack_int* ldb, float* x, lapack_int* ldx,
-                    float* ferr, float* berr, float* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_dgbrfs( char* trans, lapack_int* n, lapack_int* kl, lapack_int* ku,
-                    lapack_int* nrhs, const double* ab, lapack_int* ldab,
-                    const double* afb, lapack_int* ldafb,
-                    const lapack_int* ipiv, const double* b, lapack_int* ldb,
-                    double* x, lapack_int* ldx, double* ferr, double* berr,
-                    double* work, lapack_int* iwork, lapack_int *info );
-void LAPACK_cgbrfs( char* trans, lapack_int* n, lapack_int* kl, lapack_int* ku,
-                    lapack_int* nrhs, const lapack_complex_float* ab,
-                    lapack_int* ldab, const lapack_complex_float* afb,
-                    lapack_int* ldafb, const lapack_int* ipiv,
-                    const lapack_complex_float* b, lapack_int* ldb,
-                    lapack_complex_float* x, lapack_int* ldx, float* ferr,
-                    float* berr, lapack_complex_float* work, float* rwork,
-                    lapack_int *info );
-void LAPACK_zgbrfs( char* trans, lapack_int* n, lapack_int* kl, lapack_int* ku,
-                    lapack_int* nrhs, const lapack_complex_double* ab,
-                    lapack_int* ldab, const lapack_complex_double* afb,
-                    lapack_int* ldafb, const lapack_int* ipiv,
-                    const lapack_complex_double* b, lapack_int* ldb,
-                    lapack_complex_double* x, lapack_int* ldx, double* ferr,
-                    double* berr, lapack_complex_double* work, double* rwork,
-                    lapack_int *info );
-void LAPACK_dgbrfsx( char* trans, char* equed, lapack_int* n, lapack_int* kl,
-                     lapack_int* ku, lapack_int* nrhs, const double* ab,
-                     lapack_int* ldab, const double* afb, lapack_int* ldafb,
-                     const lapack_int* ipiv, const double* r, const double* c,
-                     const double* b, lapack_int* ldb, double* x,
-                     lapack_int* ldx, double* rcond, double* berr,
-                     lapack_int* n_err_bnds, double* err_bnds_norm,
-                     double* err_bnds_comp, lapack_int* nparams, double* params,
-                     double* work, lapack_int* iwork, lapack_int *info );
-void LAPACK_sgbrfsx( char* trans, char* equed, lapack_int* n, lapack_int* kl,
-                     lapack_int* ku, lapack_int* nrhs, const float* ab,
-                     lapack_int* ldab, const float* afb, lapack_int* ldafb,
-                     const lapack_int* ipiv, const float* r, const float* c,
-                     const float* b, lapack_int* ldb, float* x, lapack_int* ldx,
-                     float* rcond, float* berr, lapack_int* n_err_bnds,
-                     float* err_bnds_norm, float* err_bnds_comp,
-                     lapack_int* nparams, float* params, float* work,
-                     lapack_int* iwork, lapack_int *info );
-void LAPACK_zgbrfsx( char* trans, char* equed, lapack_int* n, lapack_int* kl,
-                     lapack_int* ku, lapack_int* nrhs,
-                     const lapack_complex_double* ab, lapack_int* ldab,
-                     const lapack_complex_double* afb, lapack_int* ldafb,
-                     const lapack_int* ipiv, const double* r, const double* c,
-                     const lapack_complex_double* b, lapack_int* ldb,
-                     lapack_complex_double* x, lapack_int* ldx, double* rcond,
-                     double* berr, lapack_int* n_err_bnds,
-                     double* err_bnds_norm, double* err_bnds_comp,
-                     lapack_int* nparams, double* params,
-                     lapack_complex_double* work, double* rwork,
-                     lapack_int *info );
-void LAPACK_cgbrfsx( char* trans, char* equed, lapack_int* n, lapack_int* kl,
-                     lapack_int* ku, lapack_int* nrhs,
-                     const lapack_complex_float* ab, lapack_int* ldab,
-                     const lapack_complex_float* afb, lapack_int* ldafb,
-                     const lapack_int* ipiv, const float* r, const float* c,
-                     const lapack_complex_float* b, lapack_int* ldb,
-                     lapack_complex_float* x, lapack_int* ldx, float* rcond,
-                     float* berr, lapack_int* n_err_bnds, float* err_bnds_norm,
-                     float* err_bnds_comp, lapack_int* nparams, float* params,
-                     lapack_complex_float* work, float* rwork,
-                     lapack_int *info );
-void LAPACK_sgtrfs( char* trans, lapack_int* n, lapack_int* nrhs,
-                    const float* dl, const float* d, const float* du,
-                    const float* dlf, const float* df, const float* duf,
-                    const float* du2, const lapack_int* ipiv, const float* b,
-                    lapack_int* ldb, float* x, lapack_int* ldx, float* ferr,
-                    float* berr, float* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_dgtrfs( char* trans, lapack_int* n, lapack_int* nrhs,
-                    const double* dl, const double* d, const double* du,
-                    const double* dlf, const double* df, const double* duf,
-                    const double* du2, const lapack_int* ipiv, const double* b,
-                    lapack_int* ldb, double* x, lapack_int* ldx, double* ferr,
-                    double* berr, double* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_cgtrfs( char* trans, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_float* dl,
-                    const lapack_complex_float* d,
-                    const lapack_complex_float* du,
-                    const lapack_complex_float* dlf,
-                    const lapack_complex_float* df,
-                    const lapack_complex_float* duf,
-                    const lapack_complex_float* du2, const lapack_int* ipiv,
-                    const lapack_complex_float* b, lapack_int* ldb,
-                    lapack_complex_float* x, lapack_int* ldx, float* ferr,
-                    float* berr, lapack_complex_float* work, float* rwork,
-                    lapack_int *info );
-void LAPACK_zgtrfs( char* trans, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_double* dl,
-                    const lapack_complex_double* d,
-                    const lapack_complex_double* du,
-                    const lapack_complex_double* dlf,
-                    const lapack_complex_double* df,
-                    const lapack_complex_double* duf,
-                    const lapack_complex_double* du2, const lapack_int* ipiv,
-                    const lapack_complex_double* b, lapack_int* ldb,
-                    lapack_complex_double* x, lapack_int* ldx, double* ferr,
-                    double* berr, lapack_complex_double* work, double* rwork,
-                    lapack_int *info );
-void LAPACK_sporfs( char* uplo, lapack_int* n, lapack_int* nrhs, const float* a,
-                    lapack_int* lda, const float* af, lapack_int* ldaf,
-                    const float* b, lapack_int* ldb, float* x, lapack_int* ldx,
-                    float* ferr, float* berr, float* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_dporfs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const double* a, lapack_int* lda, const double* af,
-                    lapack_int* ldaf, const double* b, lapack_int* ldb,
-                    double* x, lapack_int* ldx, double* ferr, double* berr,
-                    double* work, lapack_int* iwork, lapack_int *info );
-void LAPACK_cporfs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_float* a, lapack_int* lda,
-                    const lapack_complex_float* af, lapack_int* ldaf,
-                    const lapack_complex_float* b, lapack_int* ldb,
-                    lapack_complex_float* x, lapack_int* ldx, float* ferr,
-                    float* berr, lapack_complex_float* work, float* rwork,
-                    lapack_int *info );
-void LAPACK_zporfs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_double* a, lapack_int* lda,
-                    const lapack_complex_double* af, lapack_int* ldaf,
-                    const lapack_complex_double* b, lapack_int* ldb,
-                    lapack_complex_double* x, lapack_int* ldx, double* ferr,
-                    double* berr, lapack_complex_double* work, double* rwork,
-                    lapack_int *info );
-void LAPACK_dporfsx( char* uplo, char* equed, lapack_int* n, lapack_int* nrhs,
-                     const double* a, lapack_int* lda, const double* af,
-                     lapack_int* ldaf, const double* s, const double* b,
-                     lapack_int* ldb, double* x, lapack_int* ldx, double* rcond,
-                     double* berr, lapack_int* n_err_bnds,
-                     double* err_bnds_norm, double* err_bnds_comp,
-                     lapack_int* nparams, double* params, double* work,
-                     lapack_int* iwork, lapack_int *info );
-void LAPACK_sporfsx( char* uplo, char* equed, lapack_int* n, lapack_int* nrhs,
-                     const float* a, lapack_int* lda, const float* af,
-                     lapack_int* ldaf, const float* s, const float* b,
-                     lapack_int* ldb, float* x, lapack_int* ldx, float* rcond,
-                     float* berr, lapack_int* n_err_bnds, float* err_bnds_norm,
-                     float* err_bnds_comp, lapack_int* nparams, float* params,
-                     float* work, lapack_int* iwork, lapack_int *info );
-void LAPACK_zporfsx( char* uplo, char* equed, lapack_int* n, lapack_int* nrhs,
-                     const lapack_complex_double* a, lapack_int* lda,
-                     const lapack_complex_double* af, lapack_int* ldaf,
-                     const double* s, const lapack_complex_double* b,
-                     lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx,
-                     double* rcond, double* berr, lapack_int* n_err_bnds,
-                     double* err_bnds_norm, double* err_bnds_comp,
-                     lapack_int* nparams, double* params,
-                     lapack_complex_double* work, double* rwork,
-                     lapack_int *info );
-void LAPACK_cporfsx( char* uplo, char* equed, lapack_int* n, lapack_int* nrhs,
-                     const lapack_complex_float* a, lapack_int* lda,
-                     const lapack_complex_float* af, lapack_int* ldaf,
-                     const float* s, const lapack_complex_float* b,
-                     lapack_int* ldb, lapack_complex_float* x, lapack_int* ldx,
-                     float* rcond, float* berr, lapack_int* n_err_bnds,
-                     float* err_bnds_norm, float* err_bnds_comp,
-                     lapack_int* nparams, float* params,
-                     lapack_complex_float* work, float* rwork,
-                     lapack_int *info );
-void LAPACK_spprfs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const float* ap, const float* afp, const float* b,
-                    lapack_int* ldb, float* x, lapack_int* ldx, float* ferr,
-                    float* berr, float* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_dpprfs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const double* ap, const double* afp, const double* b,
-                    lapack_int* ldb, double* x, lapack_int* ldx, double* ferr,
-                    double* berr, double* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_cpprfs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_float* ap,
-                    const lapack_complex_float* afp,
-                    const lapack_complex_float* b, lapack_int* ldb,
-                    lapack_complex_float* x, lapack_int* ldx, float* ferr,
-                    float* berr, lapack_complex_float* work, float* rwork,
-                    lapack_int *info );
-void LAPACK_zpprfs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_double* ap,
-                    const lapack_complex_double* afp,
-                    const lapack_complex_double* b, lapack_int* ldb,
-                    lapack_complex_double* x, lapack_int* ldx, double* ferr,
-                    double* berr, lapack_complex_double* work, double* rwork,
-                    lapack_int *info );
-void LAPACK_spbrfs( char* uplo, lapack_int* n, lapack_int* kd, lapack_int* nrhs,
-                    const float* ab, lapack_int* ldab, const float* afb,
-                    lapack_int* ldafb, const float* b, lapack_int* ldb,
-                    float* x, lapack_int* ldx, float* ferr, float* berr,
-                    float* work, lapack_int* iwork, lapack_int *info );
-void LAPACK_dpbrfs( char* uplo, lapack_int* n, lapack_int* kd, lapack_int* nrhs,
-                    const double* ab, lapack_int* ldab, const double* afb,
-                    lapack_int* ldafb, const double* b, lapack_int* ldb,
-                    double* x, lapack_int* ldx, double* ferr, double* berr,
-                    double* work, lapack_int* iwork, lapack_int *info );
-void LAPACK_cpbrfs( char* uplo, lapack_int* n, lapack_int* kd, lapack_int* nrhs,
-                    const lapack_complex_float* ab, lapack_int* ldab,
-                    const lapack_complex_float* afb, lapack_int* ldafb,
-                    const lapack_complex_float* b, lapack_int* ldb,
-                    lapack_complex_float* x, lapack_int* ldx, float* ferr,
-                    float* berr, lapack_complex_float* work, float* rwork,
-                    lapack_int *info );
-void LAPACK_zpbrfs( char* uplo, lapack_int* n, lapack_int* kd, lapack_int* nrhs,
-                    const lapack_complex_double* ab, lapack_int* ldab,
-                    const lapack_complex_double* afb, lapack_int* ldafb,
-                    const lapack_complex_double* b, lapack_int* ldb,
-                    lapack_complex_double* x, lapack_int* ldx, double* ferr,
-                    double* berr, lapack_complex_double* work, double* rwork,
-                    lapack_int *info );
-void LAPACK_sptrfs( lapack_int* n, lapack_int* nrhs, const float* d,
-                    const float* e, const float* df, const float* ef,
-                    const float* b, lapack_int* ldb, float* x, lapack_int* ldx,
-                    float* ferr, float* berr, float* work, lapack_int *info );
-void LAPACK_dptrfs( lapack_int* n, lapack_int* nrhs, const double* d,
-                    const double* e, const double* df, const double* ef,
-                    const double* b, lapack_int* ldb, double* x,
-                    lapack_int* ldx, double* ferr, double* berr, double* work,
-                    lapack_int *info );
-void LAPACK_cptrfs( char* uplo, lapack_int* n, lapack_int* nrhs, const float* d,
-                    const lapack_complex_float* e, const float* df,
-                    const lapack_complex_float* ef,
-                    const lapack_complex_float* b, lapack_int* ldb,
-                    lapack_complex_float* x, lapack_int* ldx, float* ferr,
-                    float* berr, lapack_complex_float* work, float* rwork,
-                    lapack_int *info );
-void LAPACK_zptrfs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const double* d, const lapack_complex_double* e,
-                    const double* df, const lapack_complex_double* ef,
-                    const lapack_complex_double* b, lapack_int* ldb,
-                    lapack_complex_double* x, lapack_int* ldx, double* ferr,
-                    double* berr, lapack_complex_double* work, double* rwork,
-                    lapack_int *info );
-void LAPACK_ssyrfs( char* uplo, lapack_int* n, lapack_int* nrhs, const float* a,
-                    lapack_int* lda, const float* af, lapack_int* ldaf,
-                    const lapack_int* ipiv, const float* b, lapack_int* ldb,
-                    float* x, lapack_int* ldx, float* ferr, float* berr,
-                    float* work, lapack_int* iwork, lapack_int *info );
-void LAPACK_dsyrfs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const double* a, lapack_int* lda, const double* af,
-                    lapack_int* ldaf, const lapack_int* ipiv, const double* b,
-                    lapack_int* ldb, double* x, lapack_int* ldx, double* ferr,
-                    double* berr, double* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_csyrfs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_float* a, lapack_int* lda,
-                    const lapack_complex_float* af, lapack_int* ldaf,
-                    const lapack_int* ipiv, const lapack_complex_float* b,
-                    lapack_int* ldb, lapack_complex_float* x, lapack_int* ldx,
-                    float* ferr, float* berr, lapack_complex_float* work,
-                    float* rwork, lapack_int *info );
-void LAPACK_zsyrfs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_double* a, lapack_int* lda,
-                    const lapack_complex_double* af, lapack_int* ldaf,
-                    const lapack_int* ipiv, const lapack_complex_double* b,
-                    lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx,
-                    double* ferr, double* berr, lapack_complex_double* work,
-                    double* rwork, lapack_int *info );
-void LAPACK_dsyrfsx( char* uplo, char* equed, lapack_int* n, lapack_int* nrhs,
-                     const double* a, lapack_int* lda, const double* af,
-                     lapack_int* ldaf, const lapack_int* ipiv, const double* s,
-                     const double* b, lapack_int* ldb, double* x,
-                     lapack_int* ldx, double* rcond, double* berr,
-                     lapack_int* n_err_bnds, double* err_bnds_norm,
-                     double* err_bnds_comp, lapack_int* nparams, double* params,
-                     double* work, lapack_int* iwork, lapack_int *info );
-void LAPACK_ssyrfsx( char* uplo, char* equed, lapack_int* n, lapack_int* nrhs,
-                     const float* a, lapack_int* lda, const float* af,
-                     lapack_int* ldaf, const lapack_int* ipiv, const float* s,
-                     const float* b, lapack_int* ldb, float* x, lapack_int* ldx,
-                     float* rcond, float* berr, lapack_int* n_err_bnds,
-                     float* err_bnds_norm, float* err_bnds_comp,
-                     lapack_int* nparams, float* params, float* work,
-                     lapack_int* iwork, lapack_int *info );
-void LAPACK_zsyrfsx( char* uplo, char* equed, lapack_int* n, lapack_int* nrhs,
-                     const lapack_complex_double* a, lapack_int* lda,
-                     const lapack_complex_double* af, lapack_int* ldaf,
-                     const lapack_int* ipiv, const double* s,
-                     const lapack_complex_double* b, lapack_int* ldb,
-                     lapack_complex_double* x, lapack_int* ldx, double* rcond,
-                     double* berr, lapack_int* n_err_bnds,
-                     double* err_bnds_norm, double* err_bnds_comp,
-                     lapack_int* nparams, double* params,
-                     lapack_complex_double* work, double* rwork,
-                     lapack_int *info );
-void LAPACK_csyrfsx( char* uplo, char* equed, lapack_int* n, lapack_int* nrhs,
-                     const lapack_complex_float* a, lapack_int* lda,
-                     const lapack_complex_float* af, lapack_int* ldaf,
-                     const lapack_int* ipiv, const float* s,
-                     const lapack_complex_float* b, lapack_int* ldb,
-                     lapack_complex_float* x, lapack_int* ldx, float* rcond,
-                     float* berr, lapack_int* n_err_bnds, float* err_bnds_norm,
-                     float* err_bnds_comp, lapack_int* nparams, float* params,
-                     lapack_complex_float* work, float* rwork,
-                     lapack_int *info );
-void LAPACK_cherfs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_float* a, lapack_int* lda,
-                    const lapack_complex_float* af, lapack_int* ldaf,
-                    const lapack_int* ipiv, const lapack_complex_float* b,
-                    lapack_int* ldb, lapack_complex_float* x, lapack_int* ldx,
-                    float* ferr, float* berr, lapack_complex_float* work,
-                    float* rwork, lapack_int *info );
-void LAPACK_zherfs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_double* a, lapack_int* lda,
-                    const lapack_complex_double* af, lapack_int* ldaf,
-                    const lapack_int* ipiv, const lapack_complex_double* b,
-                    lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx,
-                    double* ferr, double* berr, lapack_complex_double* work,
-                    double* rwork, lapack_int *info );
-void LAPACK_zherfsx( char* uplo, char* equed, lapack_int* n, lapack_int* nrhs,
-                     const lapack_complex_double* a, lapack_int* lda,
-                     const lapack_complex_double* af, lapack_int* ldaf,
-                     const lapack_int* ipiv, const double* s,
-                     const lapack_complex_double* b, lapack_int* ldb,
-                     lapack_complex_double* x, lapack_int* ldx, double* rcond,
-                     double* berr, lapack_int* n_err_bnds,
-                     double* err_bnds_norm, double* err_bnds_comp,
-                     lapack_int* nparams, double* params,
-                     lapack_complex_double* work, double* rwork,
-                     lapack_int *info );
-void LAPACK_cherfsx( char* uplo, char* equed, lapack_int* n, lapack_int* nrhs,
-                     const lapack_complex_float* a, lapack_int* lda,
-                     const lapack_complex_float* af, lapack_int* ldaf,
-                     const lapack_int* ipiv, const float* s,
-                     const lapack_complex_float* b, lapack_int* ldb,
-                     lapack_complex_float* x, lapack_int* ldx, float* rcond,
-                     float* berr, lapack_int* n_err_bnds, float* err_bnds_norm,
-                     float* err_bnds_comp, lapack_int* nparams, float* params,
-                     lapack_complex_float* work, float* rwork,
-                     lapack_int *info );
-void LAPACK_ssprfs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const float* ap, const float* afp, const lapack_int* ipiv,
-                    const float* b, lapack_int* ldb, float* x, lapack_int* ldx,
-                    float* ferr, float* berr, float* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_dsprfs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const double* ap, const double* afp, const lapack_int* ipiv,
-                    const double* b, lapack_int* ldb, double* x,
-                    lapack_int* ldx, double* ferr, double* berr, double* work,
-                    lapack_int* iwork, lapack_int *info );
-void LAPACK_csprfs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_float* ap,
-                    const lapack_complex_float* afp, const lapack_int* ipiv,
-                    const lapack_complex_float* b, lapack_int* ldb,
-                    lapack_complex_float* x, lapack_int* ldx, float* ferr,
-                    float* berr, lapack_complex_float* work, float* rwork,
-                    lapack_int *info );
-void LAPACK_zsprfs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_double* ap,
-                    const lapack_complex_double* afp, const lapack_int* ipiv,
-                    const lapack_complex_double* b, lapack_int* ldb,
-                    lapack_complex_double* x, lapack_int* ldx, double* ferr,
-                    double* berr, lapack_complex_double* work, double* rwork,
-                    lapack_int *info );
-void LAPACK_chprfs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_float* ap,
-                    const lapack_complex_float* afp, const lapack_int* ipiv,
-                    const lapack_complex_float* b, lapack_int* ldb,
-                    lapack_complex_float* x, lapack_int* ldx, float* ferr,
-                    float* berr, lapack_complex_float* work, float* rwork,
-                    lapack_int *info );
-void LAPACK_zhprfs( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_double* ap,
-                    const lapack_complex_double* afp, const lapack_int* ipiv,
-                    const lapack_complex_double* b, lapack_int* ldb,
-                    lapack_complex_double* x, lapack_int* ldx, double* ferr,
-                    double* berr, lapack_complex_double* work, double* rwork,
-                    lapack_int *info );
-void LAPACK_strrfs( char* uplo, char* trans, char* diag, lapack_int* n,
-                    lapack_int* nrhs, const float* a, lapack_int* lda,
-                    const float* b, lapack_int* ldb, const float* x,
-                    lapack_int* ldx, float* ferr, float* berr, float* work,
-                    lapack_int* iwork, lapack_int *info );
-void LAPACK_dtrrfs( char* uplo, char* trans, char* diag, lapack_int* n,
-                    lapack_int* nrhs, const double* a, lapack_int* lda,
-                    const double* b, lapack_int* ldb, const double* x,
-                    lapack_int* ldx, double* ferr, double* berr, double* work,
-                    lapack_int* iwork, lapack_int *info );
-void LAPACK_ctrrfs( char* uplo, char* trans, char* diag, lapack_int* n,
-                    lapack_int* nrhs, const lapack_complex_float* a,
-                    lapack_int* lda, const lapack_complex_float* b,
-                    lapack_int* ldb, const lapack_complex_float* x,
-                    lapack_int* ldx, float* ferr, float* berr,
-                    lapack_complex_float* work, float* rwork,
-                    lapack_int *info );
-void LAPACK_ztrrfs( char* uplo, char* trans, char* diag, lapack_int* n,
-                    lapack_int* nrhs, const lapack_complex_double* a,
-                    lapack_int* lda, const lapack_complex_double* b,
-                    lapack_int* ldb, const lapack_complex_double* x,
-                    lapack_int* ldx, double* ferr, double* berr,
-                    lapack_complex_double* work, double* rwork,
-                    lapack_int *info );
-void LAPACK_stprfs( char* uplo, char* trans, char* diag, lapack_int* n,
-                    lapack_int* nrhs, const float* ap, const float* b,
-                    lapack_int* ldb, const float* x, lapack_int* ldx,
-                    float* ferr, float* berr, float* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_dtprfs( char* uplo, char* trans, char* diag, lapack_int* n,
-                    lapack_int* nrhs, const double* ap, const double* b,
-                    lapack_int* ldb, const double* x, lapack_int* ldx,
-                    double* ferr, double* berr, double* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_ctprfs( char* uplo, char* trans, char* diag, lapack_int* n,
-                    lapack_int* nrhs, const lapack_complex_float* ap,
-                    const lapack_complex_float* b, lapack_int* ldb,
-                    const lapack_complex_float* x, lapack_int* ldx, float* ferr,
-                    float* berr, lapack_complex_float* work, float* rwork,
-                    lapack_int *info );
-void LAPACK_ztprfs( char* uplo, char* trans, char* diag, lapack_int* n,
-                    lapack_int* nrhs, const lapack_complex_double* ap,
-                    const lapack_complex_double* b, lapack_int* ldb,
-                    const lapack_complex_double* x, lapack_int* ldx,
-                    double* ferr, double* berr, lapack_complex_double* work,
-                    double* rwork, lapack_int *info );
-void LAPACK_stbrfs( char* uplo, char* trans, char* diag, lapack_int* n,
-                    lapack_int* kd, lapack_int* nrhs, const float* ab,
-                    lapack_int* ldab, const float* b, lapack_int* ldb,
-                    const float* x, lapack_int* ldx, float* ferr, float* berr,
-                    float* work, lapack_int* iwork, lapack_int *info );
-void LAPACK_dtbrfs( char* uplo, char* trans, char* diag, lapack_int* n,
-                    lapack_int* kd, lapack_int* nrhs, const double* ab,
-                    lapack_int* ldab, const double* b, lapack_int* ldb,
-                    const double* x, lapack_int* ldx, double* ferr,
-                    double* berr, double* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_ctbrfs( char* uplo, char* trans, char* diag, lapack_int* n,
-                    lapack_int* kd, lapack_int* nrhs,
-                    const lapack_complex_float* ab, lapack_int* ldab,
-                    const lapack_complex_float* b, lapack_int* ldb,
-                    const lapack_complex_float* x, lapack_int* ldx, float* ferr,
-                    float* berr, lapack_complex_float* work, float* rwork,
-                    lapack_int *info );
-void LAPACK_ztbrfs( char* uplo, char* trans, char* diag, lapack_int* n,
-                    lapack_int* kd, lapack_int* nrhs,
-                    const lapack_complex_double* ab, lapack_int* ldab,
-                    const lapack_complex_double* b, lapack_int* ldb,
-                    const lapack_complex_double* x, lapack_int* ldx,
-                    double* ferr, double* berr, lapack_complex_double* work,
-                    double* rwork, lapack_int *info );
-void LAPACK_sgetri( lapack_int* n, float* a, lapack_int* lda,
-                    const lapack_int* ipiv, float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_dgetri( lapack_int* n, double* a, lapack_int* lda,
-                    const lapack_int* ipiv, double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_cgetri( lapack_int* n, lapack_complex_float* a, lapack_int* lda,
-                    const lapack_int* ipiv, lapack_complex_float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_zgetri( lapack_int* n, lapack_complex_double* a, lapack_int* lda,
-                    const lapack_int* ipiv, lapack_complex_double* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_spotri( char* uplo, lapack_int* n, float* a, lapack_int* lda,
-                    lapack_int *info );
-void LAPACK_dpotri( char* uplo, lapack_int* n, double* a, lapack_int* lda,
-                    lapack_int *info );
-void LAPACK_cpotri( char* uplo, lapack_int* n, lapack_complex_float* a,
-                    lapack_int* lda, lapack_int *info );
-void LAPACK_zpotri( char* uplo, lapack_int* n, lapack_complex_double* a,
-                    lapack_int* lda, lapack_int *info );
-void LAPACK_dpftri( char* transr, char* uplo, lapack_int* n, double* a,
-                    lapack_int *info );
-void LAPACK_spftri( char* transr, char* uplo, lapack_int* n, float* a,
-                    lapack_int *info );
-void LAPACK_zpftri( char* transr, char* uplo, lapack_int* n,
-                    lapack_complex_double* a, lapack_int *info );
-void LAPACK_cpftri( char* transr, char* uplo, lapack_int* n,
-                    lapack_complex_float* a, lapack_int *info );
-void LAPACK_spptri( char* uplo, lapack_int* n, float* ap, lapack_int *info );
-void LAPACK_dpptri( char* uplo, lapack_int* n, double* ap, lapack_int *info );
-void LAPACK_cpptri( char* uplo, lapack_int* n, lapack_complex_float* ap,
-                    lapack_int *info );
-void LAPACK_zpptri( char* uplo, lapack_int* n, lapack_complex_double* ap,
-                    lapack_int *info );
-void LAPACK_ssytri( char* uplo, lapack_int* n, float* a, lapack_int* lda,
-                    const lapack_int* ipiv, float* work, lapack_int *info );
-void LAPACK_dsytri( char* uplo, lapack_int* n, double* a, lapack_int* lda,
-                    const lapack_int* ipiv, double* work, lapack_int *info );
-void LAPACK_csytri( char* uplo, lapack_int* n, lapack_complex_float* a,
-                    lapack_int* lda, const lapack_int* ipiv,
-                    lapack_complex_float* work, lapack_int *info );
-void LAPACK_zsytri( char* uplo, lapack_int* n, lapack_complex_double* a,
-                    lapack_int* lda, const lapack_int* ipiv,
-                    lapack_complex_double* work, lapack_int *info );
-void LAPACK_chetri( char* uplo, lapack_int* n, lapack_complex_float* a,
-                    lapack_int* lda, const lapack_int* ipiv,
-                    lapack_complex_float* work, lapack_int *info );
-void LAPACK_zhetri( char* uplo, lapack_int* n, lapack_complex_double* a,
-                    lapack_int* lda, const lapack_int* ipiv,
-                    lapack_complex_double* work, lapack_int *info );
-void LAPACK_ssptri( char* uplo, lapack_int* n, float* ap,
-                    const lapack_int* ipiv, float* work, lapack_int *info );
-void LAPACK_dsptri( char* uplo, lapack_int* n, double* ap,
-                    const lapack_int* ipiv, double* work, lapack_int *info );
-void LAPACK_csptri( char* uplo, lapack_int* n, lapack_complex_float* ap,
-                    const lapack_int* ipiv, lapack_complex_float* work,
-                    lapack_int *info );
-void LAPACK_zsptri( char* uplo, lapack_int* n, lapack_complex_double* ap,
-                    const lapack_int* ipiv, lapack_complex_double* work,
-                    lapack_int *info );
-void LAPACK_chptri( char* uplo, lapack_int* n, lapack_complex_float* ap,
-                    const lapack_int* ipiv, lapack_complex_float* work,
-                    lapack_int *info );
-void LAPACK_zhptri( char* uplo, lapack_int* n, lapack_complex_double* ap,
-                    const lapack_int* ipiv, lapack_complex_double* work,
-                    lapack_int *info );
-void LAPACK_strtri( char* uplo, char* diag, lapack_int* n, float* a,
-                    lapack_int* lda, lapack_int *info );
-void LAPACK_dtrtri( char* uplo, char* diag, lapack_int* n, double* a,
-                    lapack_int* lda, lapack_int *info );
-void LAPACK_ctrtri( char* uplo, char* diag, lapack_int* n,
-                    lapack_complex_float* a, lapack_int* lda,
-                    lapack_int *info );
-void LAPACK_ztrtri( char* uplo, char* diag, lapack_int* n,
-                    lapack_complex_double* a, lapack_int* lda,
-                    lapack_int *info );
-void LAPACK_dtftri( char* transr, char* uplo, char* diag, lapack_int* n,
-                    double* a, lapack_int *info );
-void LAPACK_stftri( char* transr, char* uplo, char* diag, lapack_int* n,
-                    float* a, lapack_int *info );
-void LAPACK_ztftri( char* transr, char* uplo, char* diag, lapack_int* n,
-                    lapack_complex_double* a, lapack_int *info );
-void LAPACK_ctftri( char* transr, char* uplo, char* diag, lapack_int* n,
-                    lapack_complex_float* a, lapack_int *info );
-void LAPACK_stptri( char* uplo, char* diag, lapack_int* n, float* ap,
-                    lapack_int *info );
-void LAPACK_dtptri( char* uplo, char* diag, lapack_int* n, double* ap,
-                    lapack_int *info );
-void LAPACK_ctptri( char* uplo, char* diag, lapack_int* n,
-                    lapack_complex_float* ap, lapack_int *info );
-void LAPACK_ztptri( char* uplo, char* diag, lapack_int* n,
-                    lapack_complex_double* ap, lapack_int *info );
-void LAPACK_sgeequ( lapack_int* m, lapack_int* n, const float* a,
-                    lapack_int* lda, float* r, float* c, float* rowcnd,
-                    float* colcnd, float* amax, lapack_int *info );
-void LAPACK_dgeequ( lapack_int* m, lapack_int* n, const double* a,
-                    lapack_int* lda, double* r, double* c, double* rowcnd,
-                    double* colcnd, double* amax, lapack_int *info );
-void LAPACK_cgeequ( lapack_int* m, lapack_int* n, const lapack_complex_float* a,
-                    lapack_int* lda, float* r, float* c, float* rowcnd,
-                    float* colcnd, float* amax, lapack_int *info );
-void LAPACK_zgeequ( lapack_int* m, lapack_int* n,
-                    const lapack_complex_double* a, lapack_int* lda, double* r,
-                    double* c, double* rowcnd, double* colcnd, double* amax,
-                    lapack_int *info );
-void LAPACK_dgeequb( lapack_int* m, lapack_int* n, const double* a,
-                     lapack_int* lda, double* r, double* c, double* rowcnd,
-                     double* colcnd, double* amax, lapack_int *info );
-void LAPACK_sgeequb( lapack_int* m, lapack_int* n, const float* a,
-                     lapack_int* lda, float* r, float* c, float* rowcnd,
-                     float* colcnd, float* amax, lapack_int *info );
-void LAPACK_zgeequb( lapack_int* m, lapack_int* n,
-                     const lapack_complex_double* a, lapack_int* lda, double* r,
-                     double* c, double* rowcnd, double* colcnd, double* amax,
-                     lapack_int *info );
-void LAPACK_cgeequb( lapack_int* m, lapack_int* n,
-                     const lapack_complex_float* a, lapack_int* lda, float* r,
-                     float* c, float* rowcnd, float* colcnd, float* amax,
-                     lapack_int *info );
-void LAPACK_sgbequ( lapack_int* m, lapack_int* n, lapack_int* kl,
-                    lapack_int* ku, const float* ab, lapack_int* ldab, float* r,
-                    float* c, float* rowcnd, float* colcnd, float* amax,
-                    lapack_int *info );
-void LAPACK_dgbequ( lapack_int* m, lapack_int* n, lapack_int* kl,
-                    lapack_int* ku, const double* ab, lapack_int* ldab,
-                    double* r, double* c, double* rowcnd, double* colcnd,
-                    double* amax, lapack_int *info );
-void LAPACK_cgbequ( lapack_int* m, lapack_int* n, lapack_int* kl,
-                    lapack_int* ku, const lapack_complex_float* ab,
-                    lapack_int* ldab, float* r, float* c, float* rowcnd,
-                    float* colcnd, float* amax, lapack_int *info );
-void LAPACK_zgbequ( lapack_int* m, lapack_int* n, lapack_int* kl,
-                    lapack_int* ku, const lapack_complex_double* ab,
-                    lapack_int* ldab, double* r, double* c, double* rowcnd,
-                    double* colcnd, double* amax, lapack_int *info );
-void LAPACK_dgbequb( lapack_int* m, lapack_int* n, lapack_int* kl,
-                     lapack_int* ku, const double* ab, lapack_int* ldab,
-                     double* r, double* c, double* rowcnd, double* colcnd,
-                     double* amax, lapack_int *info );
-void LAPACK_sgbequb( lapack_int* m, lapack_int* n, lapack_int* kl,
-                     lapack_int* ku, const float* ab, lapack_int* ldab,
-                     float* r, float* c, float* rowcnd, float* colcnd,
-                     float* amax, lapack_int *info );
-void LAPACK_zgbequb( lapack_int* m, lapack_int* n, lapack_int* kl,
-                     lapack_int* ku, const lapack_complex_double* ab,
-                     lapack_int* ldab, double* r, double* c, double* rowcnd,
-                     double* colcnd, double* amax, lapack_int *info );
-void LAPACK_cgbequb( lapack_int* m, lapack_int* n, lapack_int* kl,
-                     lapack_int* ku, const lapack_complex_float* ab,
-                     lapack_int* ldab, float* r, float* c, float* rowcnd,
-                     float* colcnd, float* amax, lapack_int *info );
-void LAPACK_spoequ( lapack_int* n, const float* a, lapack_int* lda, float* s,
-                    float* scond, float* amax, lapack_int *info );
-void LAPACK_dpoequ( lapack_int* n, const double* a, lapack_int* lda, double* s,
-                    double* scond, double* amax, lapack_int *info );
-void LAPACK_cpoequ( lapack_int* n, const lapack_complex_float* a,
-                    lapack_int* lda, float* s, float* scond, float* amax,
-                    lapack_int *info );
-void LAPACK_zpoequ( lapack_int* n, const lapack_complex_double* a,
-                    lapack_int* lda, double* s, double* scond, double* amax,
-                    lapack_int *info );
-void LAPACK_dpoequb( lapack_int* n, const double* a, lapack_int* lda, double* s,
-                     double* scond, double* amax, lapack_int *info );
-void LAPACK_spoequb( lapack_int* n, const float* a, lapack_int* lda, float* s,
-                     float* scond, float* amax, lapack_int *info );
-void LAPACK_zpoequb( lapack_int* n, const lapack_complex_double* a,
-                     lapack_int* lda, double* s, double* scond, double* amax,
-                     lapack_int *info );
-void LAPACK_cpoequb( lapack_int* n, const lapack_complex_float* a,
-                     lapack_int* lda, float* s, float* scond, float* amax,
-                     lapack_int *info );
-void LAPACK_sppequ( char* uplo, lapack_int* n, const float* ap, float* s,
-                    float* scond, float* amax, lapack_int *info );
-void LAPACK_dppequ( char* uplo, lapack_int* n, const double* ap, double* s,
-                    double* scond, double* amax, lapack_int *info );
-void LAPACK_cppequ( char* uplo, lapack_int* n, const lapack_complex_float* ap,
-                    float* s, float* scond, float* amax, lapack_int *info );
-void LAPACK_zppequ( char* uplo, lapack_int* n, const lapack_complex_double* ap,
-                    double* s, double* scond, double* amax, lapack_int *info );
-void LAPACK_spbequ( char* uplo, lapack_int* n, lapack_int* kd, const float* ab,
-                    lapack_int* ldab, float* s, float* scond, float* amax,
-                    lapack_int *info );
-void LAPACK_dpbequ( char* uplo, lapack_int* n, lapack_int* kd, const double* ab,
-                    lapack_int* ldab, double* s, double* scond, double* amax,
-                    lapack_int *info );
-void LAPACK_cpbequ( char* uplo, lapack_int* n, lapack_int* kd,
-                    const lapack_complex_float* ab, lapack_int* ldab, float* s,
-                    float* scond, float* amax, lapack_int *info );
-void LAPACK_zpbequ( char* uplo, lapack_int* n, lapack_int* kd,
-                    const lapack_complex_double* ab, lapack_int* ldab,
-                    double* s, double* scond, double* amax, lapack_int *info );
-void LAPACK_dsyequb( char* uplo, lapack_int* n, const double* a,
-                     lapack_int* lda, double* s, double* scond, double* amax,
-                     double* work, lapack_int *info );
-void LAPACK_ssyequb( char* uplo, lapack_int* n, const float* a, lapack_int* lda,
-                     float* s, float* scond, float* amax, float* work,
-                     lapack_int *info );
-void LAPACK_zsyequb( char* uplo, lapack_int* n, const lapack_complex_double* a,
-                     lapack_int* lda, double* s, double* scond, double* amax,
-                     lapack_complex_double* work, lapack_int *info );
-void LAPACK_csyequb( char* uplo, lapack_int* n, const lapack_complex_float* a,
-                     lapack_int* lda, float* s, float* scond, float* amax,
-                     lapack_complex_float* work, lapack_int *info );
-void LAPACK_zheequb( char* uplo, lapack_int* n, const lapack_complex_double* a,
-                     lapack_int* lda, double* s, double* scond, double* amax,
-                     lapack_complex_double* work, lapack_int *info );
-void LAPACK_cheequb( char* uplo, lapack_int* n, const lapack_complex_float* a,
-                     lapack_int* lda, float* s, float* scond, float* amax,
-                     lapack_complex_float* work, lapack_int *info );
-void LAPACK_sgesv( lapack_int* n, lapack_int* nrhs, float* a, lapack_int* lda,
-                   lapack_int* ipiv, float* b, lapack_int* ldb,
-                   lapack_int *info );
-void LAPACK_dgesv( lapack_int* n, lapack_int* nrhs, double* a, lapack_int* lda,
-                   lapack_int* ipiv, double* b, lapack_int* ldb,
-                   lapack_int *info );
-void LAPACK_cgesv( lapack_int* n, lapack_int* nrhs, lapack_complex_float* a,
-                   lapack_int* lda, lapack_int* ipiv, lapack_complex_float* b,
-                   lapack_int* ldb, lapack_int *info );
-void LAPACK_zgesv( lapack_int* n, lapack_int* nrhs, lapack_complex_double* a,
-                   lapack_int* lda, lapack_int* ipiv, lapack_complex_double* b,
-                   lapack_int* ldb, lapack_int *info );
-void LAPACK_dsgesv( lapack_int* n, lapack_int* nrhs, double* a, lapack_int* lda,
-                    lapack_int* ipiv, double* b, lapack_int* ldb, double* x,
-                    lapack_int* ldx, double* work, float* swork,
-                    lapack_int* iter, lapack_int *info );
-void LAPACK_zcgesv( lapack_int* n, lapack_int* nrhs, lapack_complex_double* a,
-                    lapack_int* lda, lapack_int* ipiv, lapack_complex_double* b,
-                    lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx,
-                    lapack_complex_double* work, lapack_complex_float* swork,
-                    double* rwork, lapack_int* iter, lapack_int *info );
-void LAPACK_sgesvx( char* fact, char* trans, lapack_int* n, lapack_int* nrhs,
-                    float* a, lapack_int* lda, float* af, lapack_int* ldaf,
-                    lapack_int* ipiv, char* equed, float* r, float* c, float* b,
-                    lapack_int* ldb, float* x, lapack_int* ldx, float* rcond,
-                    float* ferr, float* berr, float* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_dgesvx( char* fact, char* trans, lapack_int* n, lapack_int* nrhs,
-                    double* a, lapack_int* lda, double* af, lapack_int* ldaf,
-                    lapack_int* ipiv, char* equed, double* r, double* c,
-                    double* b, lapack_int* ldb, double* x, lapack_int* ldx,
-                    double* rcond, double* ferr, double* berr, double* work,
-                    lapack_int* iwork, lapack_int *info );
-void LAPACK_cgesvx( char* fact, char* trans, lapack_int* n, lapack_int* nrhs,
-                    lapack_complex_float* a, lapack_int* lda,
-                    lapack_complex_float* af, lapack_int* ldaf,
-                    lapack_int* ipiv, char* equed, float* r, float* c,
-                    lapack_complex_float* b, lapack_int* ldb,
-                    lapack_complex_float* x, lapack_int* ldx, float* rcond,
-                    float* ferr, float* berr, lapack_complex_float* work,
-                    float* rwork, lapack_int *info );
-void LAPACK_zgesvx( char* fact, char* trans, lapack_int* n, lapack_int* nrhs,
-                    lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* af, lapack_int* ldaf,
-                    lapack_int* ipiv, char* equed, double* r, double* c,
-                    lapack_complex_double* b, lapack_int* ldb,
-                    lapack_complex_double* x, lapack_int* ldx, double* rcond,
-                    double* ferr, double* berr, lapack_complex_double* work,
-                    double* rwork, lapack_int *info );
-void LAPACK_dgesvxx( char* fact, char* trans, lapack_int* n, lapack_int* nrhs,
-                     double* a, lapack_int* lda, double* af, lapack_int* ldaf,
-                     lapack_int* ipiv, char* equed, double* r, double* c,
-                     double* b, lapack_int* ldb, double* x, lapack_int* ldx,
-                     double* rcond, double* rpvgrw, double* berr,
-                     lapack_int* n_err_bnds, double* err_bnds_norm,
-                     double* err_bnds_comp, lapack_int* nparams, double* params,
-                     double* work, lapack_int* iwork, lapack_int *info );
-void LAPACK_sgesvxx( char* fact, char* trans, lapack_int* n, lapack_int* nrhs,
-                     float* a, lapack_int* lda, float* af, lapack_int* ldaf,
-                     lapack_int* ipiv, char* equed, float* r, float* c,
-                     float* b, lapack_int* ldb, float* x, lapack_int* ldx,
-                     float* rcond, float* rpvgrw, float* berr,
-                     lapack_int* n_err_bnds, float* err_bnds_norm,
-                     float* err_bnds_comp, lapack_int* nparams, float* params,
-                     float* work, lapack_int* iwork, lapack_int *info );
-void LAPACK_zgesvxx( char* fact, char* trans, lapack_int* n, lapack_int* nrhs,
-                     lapack_complex_double* a, lapack_int* lda,
-                     lapack_complex_double* af, lapack_int* ldaf,
-                     lapack_int* ipiv, char* equed, double* r, double* c,
-                     lapack_complex_double* b, lapack_int* ldb,
-                     lapack_complex_double* x, lapack_int* ldx, double* rcond,
-                     double* rpvgrw, double* berr, lapack_int* n_err_bnds,
-                     double* err_bnds_norm, double* err_bnds_comp,
-                     lapack_int* nparams, double* params,
-                     lapack_complex_double* work, double* rwork,
-                     lapack_int *info );
-void LAPACK_cgesvxx( char* fact, char* trans, lapack_int* n, lapack_int* nrhs,
-                     lapack_complex_float* a, lapack_int* lda,
-                     lapack_complex_float* af, lapack_int* ldaf,
-                     lapack_int* ipiv, char* equed, float* r, float* c,
-                     lapack_complex_float* b, lapack_int* ldb,
-                     lapack_complex_float* x, lapack_int* ldx, float* rcond,
-                     float* rpvgrw, float* berr, lapack_int* n_err_bnds,
-                     float* err_bnds_norm, float* err_bnds_comp,
-                     lapack_int* nparams, float* params,
-                     lapack_complex_float* work, float* rwork,
-                     lapack_int *info );
-void LAPACK_sgbsv( lapack_int* n, lapack_int* kl, lapack_int* ku,
-                   lapack_int* nrhs, float* ab, lapack_int* ldab,
-                   lapack_int* ipiv, float* b, lapack_int* ldb,
-                   lapack_int *info );
-void LAPACK_dgbsv( lapack_int* n, lapack_int* kl, lapack_int* ku,
-                   lapack_int* nrhs, double* ab, lapack_int* ldab,
-                   lapack_int* ipiv, double* b, lapack_int* ldb,
-                   lapack_int *info );
-void LAPACK_cgbsv( lapack_int* n, lapack_int* kl, lapack_int* ku,
-                   lapack_int* nrhs, lapack_complex_float* ab, lapack_int* ldab,
-                   lapack_int* ipiv, lapack_complex_float* b, lapack_int* ldb,
-                   lapack_int *info );
-void LAPACK_zgbsv( lapack_int* n, lapack_int* kl, lapack_int* ku,
-                   lapack_int* nrhs, lapack_complex_double* ab,
-                   lapack_int* ldab, lapack_int* ipiv, lapack_complex_double* b,
-                   lapack_int* ldb, lapack_int *info );
-void LAPACK_sgbsvx( char* fact, char* trans, lapack_int* n, lapack_int* kl,
-                    lapack_int* ku, lapack_int* nrhs, float* ab,
-                    lapack_int* ldab, float* afb, lapack_int* ldafb,
-                    lapack_int* ipiv, char* equed, float* r, float* c, float* b,
-                    lapack_int* ldb, float* x, lapack_int* ldx, float* rcond,
-                    float* ferr, float* berr, float* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_dgbsvx( char* fact, char* trans, lapack_int* n, lapack_int* kl,
-                    lapack_int* ku, lapack_int* nrhs, double* ab,
-                    lapack_int* ldab, double* afb, lapack_int* ldafb,
-                    lapack_int* ipiv, char* equed, double* r, double* c,
-                    double* b, lapack_int* ldb, double* x, lapack_int* ldx,
-                    double* rcond, double* ferr, double* berr, double* work,
-                    lapack_int* iwork, lapack_int *info );
-void LAPACK_cgbsvx( char* fact, char* trans, lapack_int* n, lapack_int* kl,
-                    lapack_int* ku, lapack_int* nrhs, lapack_complex_float* ab,
-                    lapack_int* ldab, lapack_complex_float* afb,
-                    lapack_int* ldafb, lapack_int* ipiv, char* equed, float* r,
-                    float* c, lapack_complex_float* b, lapack_int* ldb,
-                    lapack_complex_float* x, lapack_int* ldx, float* rcond,
-                    float* ferr, float* berr, lapack_complex_float* work,
-                    float* rwork, lapack_int *info );
-void LAPACK_zgbsvx( char* fact, char* trans, lapack_int* n, lapack_int* kl,
-                    lapack_int* ku, lapack_int* nrhs, lapack_complex_double* ab,
-                    lapack_int* ldab, lapack_complex_double* afb,
-                    lapack_int* ldafb, lapack_int* ipiv, char* equed, double* r,
-                    double* c, lapack_complex_double* b, lapack_int* ldb,
-                    lapack_complex_double* x, lapack_int* ldx, double* rcond,
-                    double* ferr, double* berr, lapack_complex_double* work,
-                    double* rwork, lapack_int *info );
-void LAPACK_dgbsvxx( char* fact, char* trans, lapack_int* n, lapack_int* kl,
-                     lapack_int* ku, lapack_int* nrhs, double* ab,
-                     lapack_int* ldab, double* afb, lapack_int* ldafb,
-                     lapack_int* ipiv, char* equed, double* r, double* c,
-                     double* b, lapack_int* ldb, double* x, lapack_int* ldx,
-                     double* rcond, double* rpvgrw, double* berr,
-                     lapack_int* n_err_bnds, double* err_bnds_norm,
-                     double* err_bnds_comp, lapack_int* nparams, double* params,
-                     double* work, lapack_int* iwork, lapack_int *info );
-void LAPACK_sgbsvxx( char* fact, char* trans, lapack_int* n, lapack_int* kl,
-                     lapack_int* ku, lapack_int* nrhs, float* ab,
-                     lapack_int* ldab, float* afb, lapack_int* ldafb,
-                     lapack_int* ipiv, char* equed, float* r, float* c,
-                     float* b, lapack_int* ldb, float* x, lapack_int* ldx,
-                     float* rcond, float* rpvgrw, float* berr,
-                     lapack_int* n_err_bnds, float* err_bnds_norm,
-                     float* err_bnds_comp, lapack_int* nparams, float* params,
-                     float* work, lapack_int* iwork, lapack_int *info );
-void LAPACK_zgbsvxx( char* fact, char* trans, lapack_int* n, lapack_int* kl,
-                     lapack_int* ku, lapack_int* nrhs,
-                     lapack_complex_double* ab, lapack_int* ldab,
-                     lapack_complex_double* afb, lapack_int* ldafb,
-                     lapack_int* ipiv, char* equed, double* r, double* c,
-                     lapack_complex_double* b, lapack_int* ldb,
-                     lapack_complex_double* x, lapack_int* ldx, double* rcond,
-                     double* rpvgrw, double* berr, lapack_int* n_err_bnds,
-                     double* err_bnds_norm, double* err_bnds_comp,
-                     lapack_int* nparams, double* params,
-                     lapack_complex_double* work, double* rwork,
-                     lapack_int *info );
-void LAPACK_cgbsvxx( char* fact, char* trans, lapack_int* n, lapack_int* kl,
-                     lapack_int* ku, lapack_int* nrhs, lapack_complex_float* ab,
-                     lapack_int* ldab, lapack_complex_float* afb,
-                     lapack_int* ldafb, lapack_int* ipiv, char* equed, float* r,
-                     float* c, lapack_complex_float* b, lapack_int* ldb,
-                     lapack_complex_float* x, lapack_int* ldx, float* rcond,
-                     float* rpvgrw, float* berr, lapack_int* n_err_bnds,
-                     float* err_bnds_norm, float* err_bnds_comp,
-                     lapack_int* nparams, float* params,
-                     lapack_complex_float* work, float* rwork,
-                     lapack_int *info );
-void LAPACK_sgtsv( lapack_int* n, lapack_int* nrhs, float* dl, float* d,
-                   float* du, float* b, lapack_int* ldb, lapack_int *info );
-void LAPACK_dgtsv( lapack_int* n, lapack_int* nrhs, double* dl, double* d,
-                   double* du, double* b, lapack_int* ldb, lapack_int *info );
-void LAPACK_cgtsv( lapack_int* n, lapack_int* nrhs, lapack_complex_float* dl,
-                   lapack_complex_float* d, lapack_complex_float* du,
-                   lapack_complex_float* b, lapack_int* ldb, lapack_int *info );
-void LAPACK_zgtsv( lapack_int* n, lapack_int* nrhs, lapack_complex_double* dl,
-                   lapack_complex_double* d, lapack_complex_double* du,
-                   lapack_complex_double* b, lapack_int* ldb,
-                   lapack_int *info );
-void LAPACK_sgtsvx( char* fact, char* trans, lapack_int* n, lapack_int* nrhs,
-                    const float* dl, const float* d, const float* du,
-                    float* dlf, float* df, float* duf, float* du2,
-                    lapack_int* ipiv, const float* b, lapack_int* ldb, float* x,
-                    lapack_int* ldx, float* rcond, float* ferr, float* berr,
-                    float* work, lapack_int* iwork, lapack_int *info );
-void LAPACK_dgtsvx( char* fact, char* trans, lapack_int* n, lapack_int* nrhs,
-                    const double* dl, const double* d, const double* du,
-                    double* dlf, double* df, double* duf, double* du2,
-                    lapack_int* ipiv, const double* b, lapack_int* ldb,
-                    double* x, lapack_int* ldx, double* rcond, double* ferr,
-                    double* berr, double* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_cgtsvx( char* fact, char* trans, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_float* dl,
-                    const lapack_complex_float* d,
-                    const lapack_complex_float* du, lapack_complex_float* dlf,
-                    lapack_complex_float* df, lapack_complex_float* duf,
-                    lapack_complex_float* du2, lapack_int* ipiv,
-                    const lapack_complex_float* b, lapack_int* ldb,
-                    lapack_complex_float* x, lapack_int* ldx, float* rcond,
-                    float* ferr, float* berr, lapack_complex_float* work,
-                    float* rwork, lapack_int *info );
-void LAPACK_zgtsvx( char* fact, char* trans, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_double* dl,
-                    const lapack_complex_double* d,
-                    const lapack_complex_double* du, lapack_complex_double* dlf,
-                    lapack_complex_double* df, lapack_complex_double* duf,
-                    lapack_complex_double* du2, lapack_int* ipiv,
-                    const lapack_complex_double* b, lapack_int* ldb,
-                    lapack_complex_double* x, lapack_int* ldx, double* rcond,
-                    double* ferr, double* berr, lapack_complex_double* work,
-                    double* rwork, lapack_int *info );
-void LAPACK_sposv( char* uplo, lapack_int* n, lapack_int* nrhs, float* a,
-                   lapack_int* lda, float* b, lapack_int* ldb,
-                   lapack_int *info );
-void LAPACK_dposv( char* uplo, lapack_int* n, lapack_int* nrhs, double* a,
-                   lapack_int* lda, double* b, lapack_int* ldb,
-                   lapack_int *info );
-void LAPACK_cposv( char* uplo, lapack_int* n, lapack_int* nrhs,
-                   lapack_complex_float* a, lapack_int* lda,
-                   lapack_complex_float* b, lapack_int* ldb, lapack_int *info );
-void LAPACK_zposv( char* uplo, lapack_int* n, lapack_int* nrhs,
-                   lapack_complex_double* a, lapack_int* lda,
-                   lapack_complex_double* b, lapack_int* ldb,
-                   lapack_int *info );
-void LAPACK_dsposv( char* uplo, lapack_int* n, lapack_int* nrhs, double* a,
-                    lapack_int* lda, double* b, lapack_int* ldb, double* x,
-                    lapack_int* ldx, double* work, float* swork,
-                    lapack_int* iter, lapack_int *info );
-void LAPACK_zcposv( char* uplo, lapack_int* n, lapack_int* nrhs,
-                    lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* b, lapack_int* ldb,
-                    lapack_complex_double* x, lapack_int* ldx,
-                    lapack_complex_double* work, lapack_complex_float* swork,
-                    double* rwork, lapack_int* iter, lapack_int *info );
-void LAPACK_sposvx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                    float* a, lapack_int* lda, float* af, lapack_int* ldaf,
-                    char* equed, float* s, float* b, lapack_int* ldb, float* x,
-                    lapack_int* ldx, float* rcond, float* ferr, float* berr,
-                    float* work, lapack_int* iwork, lapack_int *info );
-void LAPACK_dposvx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                    double* a, lapack_int* lda, double* af, lapack_int* ldaf,
-                    char* equed, double* s, double* b, lapack_int* ldb,
-                    double* x, lapack_int* ldx, double* rcond, double* ferr,
-                    double* berr, double* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_cposvx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                    lapack_complex_float* a, lapack_int* lda,
-                    lapack_complex_float* af, lapack_int* ldaf, char* equed,
-                    float* s, lapack_complex_float* b, lapack_int* ldb,
-                    lapack_complex_float* x, lapack_int* ldx, float* rcond,
-                    float* ferr, float* berr, lapack_complex_float* work,
-                    float* rwork, lapack_int *info );
-void LAPACK_zposvx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                    lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* af, lapack_int* ldaf, char* equed,
-                    double* s, lapack_complex_double* b, lapack_int* ldb,
-                    lapack_complex_double* x, lapack_int* ldx, double* rcond,
-                    double* ferr, double* berr, lapack_complex_double* work,
-                    double* rwork, lapack_int *info );
-void LAPACK_dposvxx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                     double* a, lapack_int* lda, double* af, lapack_int* ldaf,
-                     char* equed, double* s, double* b, lapack_int* ldb,
-                     double* x, lapack_int* ldx, double* rcond, double* rpvgrw,
-                     double* berr, lapack_int* n_err_bnds,
-                     double* err_bnds_norm, double* err_bnds_comp,
-                     lapack_int* nparams, double* params, double* work,
-                     lapack_int* iwork, lapack_int *info );
-void LAPACK_sposvxx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                     float* a, lapack_int* lda, float* af, lapack_int* ldaf,
-                     char* equed, float* s, float* b, lapack_int* ldb, float* x,
-                     lapack_int* ldx, float* rcond, float* rpvgrw, float* berr,
-                     lapack_int* n_err_bnds, float* err_bnds_norm,
-                     float* err_bnds_comp, lapack_int* nparams, float* params,
-                     float* work, lapack_int* iwork, lapack_int *info );
-void LAPACK_zposvxx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                     lapack_complex_double* a, lapack_int* lda,
-                     lapack_complex_double* af, lapack_int* ldaf, char* equed,
-                     double* s, lapack_complex_double* b, lapack_int* ldb,
-                     lapack_complex_double* x, lapack_int* ldx, double* rcond,
-                     double* rpvgrw, double* berr, lapack_int* n_err_bnds,
-                     double* err_bnds_norm, double* err_bnds_comp,
-                     lapack_int* nparams, double* params,
-                     lapack_complex_double* work, double* rwork,
-                     lapack_int *info );
-void LAPACK_cposvxx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                     lapack_complex_float* a, lapack_int* lda,
-                     lapack_complex_float* af, lapack_int* ldaf, char* equed,
-                     float* s, lapack_complex_float* b, lapack_int* ldb,
-                     lapack_complex_float* x, lapack_int* ldx, float* rcond,
-                     float* rpvgrw, float* berr, lapack_int* n_err_bnds,
-                     float* err_bnds_norm, float* err_bnds_comp,
-                     lapack_int* nparams, float* params,
-                     lapack_complex_float* work, float* rwork,
-                     lapack_int *info );
-void LAPACK_sppsv( char* uplo, lapack_int* n, lapack_int* nrhs, float* ap,
-                   float* b, lapack_int* ldb, lapack_int *info );
-void LAPACK_dppsv( char* uplo, lapack_int* n, lapack_int* nrhs, double* ap,
-                   double* b, lapack_int* ldb, lapack_int *info );
-void LAPACK_cppsv( char* uplo, lapack_int* n, lapack_int* nrhs,
-                   lapack_complex_float* ap, lapack_complex_float* b,
-                   lapack_int* ldb, lapack_int *info );
-void LAPACK_zppsv( char* uplo, lapack_int* n, lapack_int* nrhs,
-                   lapack_complex_double* ap, lapack_complex_double* b,
-                   lapack_int* ldb, lapack_int *info );
-void LAPACK_sppsvx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                    float* ap, float* afp, char* equed, float* s, float* b,
-                    lapack_int* ldb, float* x, lapack_int* ldx, float* rcond,
-                    float* ferr, float* berr, float* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_dppsvx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                    double* ap, double* afp, char* equed, double* s, double* b,
-                    lapack_int* ldb, double* x, lapack_int* ldx, double* rcond,
-                    double* ferr, double* berr, double* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_cppsvx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                    lapack_complex_float* ap, lapack_complex_float* afp,
-                    char* equed, float* s, lapack_complex_float* b,
-                    lapack_int* ldb, lapack_complex_float* x, lapack_int* ldx,
-                    float* rcond, float* ferr, float* berr,
-                    lapack_complex_float* work, float* rwork,
-                    lapack_int *info );
-void LAPACK_zppsvx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                    lapack_complex_double* ap, lapack_complex_double* afp,
-                    char* equed, double* s, lapack_complex_double* b,
-                    lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx,
-                    double* rcond, double* ferr, double* berr,
-                    lapack_complex_double* work, double* rwork,
-                    lapack_int *info );
-void LAPACK_spbsv( char* uplo, lapack_int* n, lapack_int* kd, lapack_int* nrhs,
-                   float* ab, lapack_int* ldab, float* b, lapack_int* ldb,
-                   lapack_int *info );
-void LAPACK_dpbsv( char* uplo, lapack_int* n, lapack_int* kd, lapack_int* nrhs,
-                   double* ab, lapack_int* ldab, double* b, lapack_int* ldb,
-                   lapack_int *info );
-void LAPACK_cpbsv( char* uplo, lapack_int* n, lapack_int* kd, lapack_int* nrhs,
-                   lapack_complex_float* ab, lapack_int* ldab,
-                   lapack_complex_float* b, lapack_int* ldb, lapack_int *info );
-void LAPACK_zpbsv( char* uplo, lapack_int* n, lapack_int* kd, lapack_int* nrhs,
-                   lapack_complex_double* ab, lapack_int* ldab,
-                   lapack_complex_double* b, lapack_int* ldb,
-                   lapack_int *info );
-void LAPACK_spbsvx( char* fact, char* uplo, lapack_int* n, lapack_int* kd,
-                    lapack_int* nrhs, float* ab, lapack_int* ldab, float* afb,
-                    lapack_int* ldafb, char* equed, float* s, float* b,
-                    lapack_int* ldb, float* x, lapack_int* ldx, float* rcond,
-                    float* ferr, float* berr, float* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_dpbsvx( char* fact, char* uplo, lapack_int* n, lapack_int* kd,
-                    lapack_int* nrhs, double* ab, lapack_int* ldab, double* afb,
-                    lapack_int* ldafb, char* equed, double* s, double* b,
-                    lapack_int* ldb, double* x, lapack_int* ldx, double* rcond,
-                    double* ferr, double* berr, double* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_cpbsvx( char* fact, char* uplo, lapack_int* n, lapack_int* kd,
-                    lapack_int* nrhs, lapack_complex_float* ab,
-                    lapack_int* ldab, lapack_complex_float* afb,
-                    lapack_int* ldafb, char* equed, float* s,
-                    lapack_complex_float* b, lapack_int* ldb,
-                    lapack_complex_float* x, lapack_int* ldx, float* rcond,
-                    float* ferr, float* berr, lapack_complex_float* work,
-                    float* rwork, lapack_int *info );
-void LAPACK_zpbsvx( char* fact, char* uplo, lapack_int* n, lapack_int* kd,
-                    lapack_int* nrhs, lapack_complex_double* ab,
-                    lapack_int* ldab, lapack_complex_double* afb,
-                    lapack_int* ldafb, char* equed, double* s,
-                    lapack_complex_double* b, lapack_int* ldb,
-                    lapack_complex_double* x, lapack_int* ldx, double* rcond,
-                    double* ferr, double* berr, lapack_complex_double* work,
-                    double* rwork, lapack_int *info );
-void LAPACK_sptsv( lapack_int* n, lapack_int* nrhs, float* d, float* e,
-                   float* b, lapack_int* ldb, lapack_int *info );
-void LAPACK_dptsv( lapack_int* n, lapack_int* nrhs, double* d, double* e,
-                   double* b, lapack_int* ldb, lapack_int *info );
-void LAPACK_cptsv( lapack_int* n, lapack_int* nrhs, float* d,
-                   lapack_complex_float* e, lapack_complex_float* b,
-                   lapack_int* ldb, lapack_int *info );
-void LAPACK_zptsv( lapack_int* n, lapack_int* nrhs, double* d,
-                   lapack_complex_double* e, lapack_complex_double* b,
-                   lapack_int* ldb, lapack_int *info );
-void LAPACK_sptsvx( char* fact, lapack_int* n, lapack_int* nrhs, const float* d,
-                    const float* e, float* df, float* ef, const float* b,
-                    lapack_int* ldb, float* x, lapack_int* ldx, float* rcond,
-                    float* ferr, float* berr, float* work, lapack_int *info );
-void LAPACK_dptsvx( char* fact, lapack_int* n, lapack_int* nrhs,
-                    const double* d, const double* e, double* df, double* ef,
-                    const double* b, lapack_int* ldb, double* x,
-                    lapack_int* ldx, double* rcond, double* ferr, double* berr,
-                    double* work, lapack_int *info );
-void LAPACK_cptsvx( char* fact, lapack_int* n, lapack_int* nrhs, const float* d,
-                    const lapack_complex_float* e, float* df,
-                    lapack_complex_float* ef, const lapack_complex_float* b,
-                    lapack_int* ldb, lapack_complex_float* x, lapack_int* ldx,
-                    float* rcond, float* ferr, float* berr,
-                    lapack_complex_float* work, float* rwork,
-                    lapack_int *info );
-void LAPACK_zptsvx( char* fact, lapack_int* n, lapack_int* nrhs,
-                    const double* d, const lapack_complex_double* e, double* df,
-                    lapack_complex_double* ef, const lapack_complex_double* b,
-                    lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx,
-                    double* rcond, double* ferr, double* berr,
-                    lapack_complex_double* work, double* rwork,
-                    lapack_int *info );
-void LAPACK_ssysv( char* uplo, lapack_int* n, lapack_int* nrhs, float* a,
-                   lapack_int* lda, lapack_int* ipiv, float* b, lapack_int* ldb,
-                   float* work, lapack_int* lwork, lapack_int *info );
-void LAPACK_dsysv( char* uplo, lapack_int* n, lapack_int* nrhs, double* a,
-                   lapack_int* lda, lapack_int* ipiv, double* b,
-                   lapack_int* ldb, double* work, lapack_int* lwork,
-                   lapack_int *info );
-void LAPACK_csysv( char* uplo, lapack_int* n, lapack_int* nrhs,
-                   lapack_complex_float* a, lapack_int* lda, lapack_int* ipiv,
-                   lapack_complex_float* b, lapack_int* ldb,
-                   lapack_complex_float* work, lapack_int* lwork,
-                   lapack_int *info );
-void LAPACK_zsysv( char* uplo, lapack_int* n, lapack_int* nrhs,
-                   lapack_complex_double* a, lapack_int* lda, lapack_int* ipiv,
-                   lapack_complex_double* b, lapack_int* ldb,
-                   lapack_complex_double* work, lapack_int* lwork,
-                   lapack_int *info );
-void LAPACK_ssysvx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const float* a, lapack_int* lda, float* af,
-                    lapack_int* ldaf, lapack_int* ipiv, const float* b,
-                    lapack_int* ldb, float* x, lapack_int* ldx, float* rcond,
-                    float* ferr, float* berr, float* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int *info );
-void LAPACK_dsysvx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const double* a, lapack_int* lda, double* af,
-                    lapack_int* ldaf, lapack_int* ipiv, const double* b,
-                    lapack_int* ldb, double* x, lapack_int* ldx, double* rcond,
-                    double* ferr, double* berr, double* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int *info );
-void LAPACK_csysvx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_float* a, lapack_int* lda,
-                    lapack_complex_float* af, lapack_int* ldaf,
-                    lapack_int* ipiv, const lapack_complex_float* b,
-                    lapack_int* ldb, lapack_complex_float* x, lapack_int* ldx,
-                    float* rcond, float* ferr, float* berr,
-                    lapack_complex_float* work, lapack_int* lwork, float* rwork,
-                    lapack_int *info );
-void LAPACK_zsysvx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* af, lapack_int* ldaf,
-                    lapack_int* ipiv, const lapack_complex_double* b,
-                    lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx,
-                    double* rcond, double* ferr, double* berr,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    double* rwork, lapack_int *info );
-void LAPACK_dsysvxx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                     double* a, lapack_int* lda, double* af, lapack_int* ldaf,
-                     lapack_int* ipiv, char* equed, double* s, double* b,
-                     lapack_int* ldb, double* x, lapack_int* ldx, double* rcond,
-                     double* rpvgrw, double* berr, lapack_int* n_err_bnds,
-                     double* err_bnds_norm, double* err_bnds_comp,
-                     lapack_int* nparams, double* params, double* work,
-                     lapack_int* iwork, lapack_int *info );
-void LAPACK_ssysvxx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                     float* a, lapack_int* lda, float* af, lapack_int* ldaf,
-                     lapack_int* ipiv, char* equed, float* s, float* b,
-                     lapack_int* ldb, float* x, lapack_int* ldx, float* rcond,
-                     float* rpvgrw, float* berr, lapack_int* n_err_bnds,
-                     float* err_bnds_norm, float* err_bnds_comp,
-                     lapack_int* nparams, float* params, float* work,
-                     lapack_int* iwork, lapack_int *info );
-void LAPACK_zsysvxx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                     lapack_complex_double* a, lapack_int* lda,
-                     lapack_complex_double* af, lapack_int* ldaf,
-                     lapack_int* ipiv, char* equed, double* s,
-                     lapack_complex_double* b, lapack_int* ldb,
-                     lapack_complex_double* x, lapack_int* ldx, double* rcond,
-                     double* rpvgrw, double* berr, lapack_int* n_err_bnds,
-                     double* err_bnds_norm, double* err_bnds_comp,
-                     lapack_int* nparams, double* params,
-                     lapack_complex_double* work, double* rwork,
-                     lapack_int *info );
-void LAPACK_csysvxx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                     lapack_complex_float* a, lapack_int* lda,
-                     lapack_complex_float* af, lapack_int* ldaf,
-                     lapack_int* ipiv, char* equed, float* s,
-                     lapack_complex_float* b, lapack_int* ldb,
-                     lapack_complex_float* x, lapack_int* ldx, float* rcond,
-                     float* rpvgrw, float* berr, lapack_int* n_err_bnds,
-                     float* err_bnds_norm, float* err_bnds_comp,
-                     lapack_int* nparams, float* params,
-                     lapack_complex_float* work, float* rwork,
-                     lapack_int *info );
-void LAPACK_chesv( char* uplo, lapack_int* n, lapack_int* nrhs,
-                   lapack_complex_float* a, lapack_int* lda, lapack_int* ipiv,
-                   lapack_complex_float* b, lapack_int* ldb,
-                   lapack_complex_float* work, lapack_int* lwork,
-                   lapack_int *info );
-void LAPACK_zhesv( char* uplo, lapack_int* n, lapack_int* nrhs,
-                   lapack_complex_double* a, lapack_int* lda, lapack_int* ipiv,
-                   lapack_complex_double* b, lapack_int* ldb,
-                   lapack_complex_double* work, lapack_int* lwork,
-                   lapack_int *info );
-void LAPACK_chesvx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_float* a, lapack_int* lda,
-                    lapack_complex_float* af, lapack_int* ldaf,
-                    lapack_int* ipiv, const lapack_complex_float* b,
-                    lapack_int* ldb, lapack_complex_float* x, lapack_int* ldx,
-                    float* rcond, float* ferr, float* berr,
-                    lapack_complex_float* work, lapack_int* lwork, float* rwork,
-                    lapack_int *info );
-void LAPACK_zhesvx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* af, lapack_int* ldaf,
-                    lapack_int* ipiv, const lapack_complex_double* b,
-                    lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx,
-                    double* rcond, double* ferr, double* berr,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    double* rwork, lapack_int *info );
-void LAPACK_zhesvxx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                     lapack_complex_double* a, lapack_int* lda,
-                     lapack_complex_double* af, lapack_int* ldaf,
-                     lapack_int* ipiv, char* equed, double* s,
-                     lapack_complex_double* b, lapack_int* ldb,
-                     lapack_complex_double* x, lapack_int* ldx, double* rcond,
-                     double* rpvgrw, double* berr, lapack_int* n_err_bnds,
-                     double* err_bnds_norm, double* err_bnds_comp,
-                     lapack_int* nparams, double* params,
-                     lapack_complex_double* work, double* rwork,
-                     lapack_int *info );
-void LAPACK_chesvxx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                     lapack_complex_float* a, lapack_int* lda,
-                     lapack_complex_float* af, lapack_int* ldaf,
-                     lapack_int* ipiv, char* equed, float* s,
-                     lapack_complex_float* b, lapack_int* ldb,
-                     lapack_complex_float* x, lapack_int* ldx, float* rcond,
-                     float* rpvgrw, float* berr, lapack_int* n_err_bnds,
-                     float* err_bnds_norm, float* err_bnds_comp,
-                     lapack_int* nparams, float* params,
-                     lapack_complex_float* work, float* rwork,
-                     lapack_int *info );
-void LAPACK_sspsv( char* uplo, lapack_int* n, lapack_int* nrhs, float* ap,
-                   lapack_int* ipiv, float* b, lapack_int* ldb,
-                   lapack_int *info );
-void LAPACK_dspsv( char* uplo, lapack_int* n, lapack_int* nrhs, double* ap,
-                   lapack_int* ipiv, double* b, lapack_int* ldb,
-                   lapack_int *info );
-void LAPACK_cspsv( char* uplo, lapack_int* n, lapack_int* nrhs,
-                   lapack_complex_float* ap, lapack_int* ipiv,
-                   lapack_complex_float* b, lapack_int* ldb, lapack_int *info );
-void LAPACK_zspsv( char* uplo, lapack_int* n, lapack_int* nrhs,
-                   lapack_complex_double* ap, lapack_int* ipiv,
-                   lapack_complex_double* b, lapack_int* ldb,
-                   lapack_int *info );
-void LAPACK_sspsvx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const float* ap, float* afp, lapack_int* ipiv,
-                    const float* b, lapack_int* ldb, float* x, lapack_int* ldx,
-                    float* rcond, float* ferr, float* berr, float* work,
-                    lapack_int* iwork, lapack_int *info );
-void LAPACK_dspsvx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const double* ap, double* afp, lapack_int* ipiv,
-                    const double* b, lapack_int* ldb, double* x,
-                    lapack_int* ldx, double* rcond, double* ferr, double* berr,
-                    double* work, lapack_int* iwork, lapack_int *info );
-void LAPACK_cspsvx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_float* ap, lapack_complex_float* afp,
-                    lapack_int* ipiv, const lapack_complex_float* b,
-                    lapack_int* ldb, lapack_complex_float* x, lapack_int* ldx,
-                    float* rcond, float* ferr, float* berr,
-                    lapack_complex_float* work, float* rwork,
-                    lapack_int *info );
-void LAPACK_zspsvx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_double* ap, lapack_complex_double* afp,
-                    lapack_int* ipiv, const lapack_complex_double* b,
-                    lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx,
-                    double* rcond, double* ferr, double* berr,
-                    lapack_complex_double* work, double* rwork,
-                    lapack_int *info );
-void LAPACK_chpsv( char* uplo, lapack_int* n, lapack_int* nrhs,
-                   lapack_complex_float* ap, lapack_int* ipiv,
-                   lapack_complex_float* b, lapack_int* ldb, lapack_int *info );
-void LAPACK_zhpsv( char* uplo, lapack_int* n, lapack_int* nrhs,
-                   lapack_complex_double* ap, lapack_int* ipiv,
-                   lapack_complex_double* b, lapack_int* ldb,
-                   lapack_int *info );
-void LAPACK_chpsvx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_float* ap, lapack_complex_float* afp,
-                    lapack_int* ipiv, const lapack_complex_float* b,
-                    lapack_int* ldb, lapack_complex_float* x, lapack_int* ldx,
-                    float* rcond, float* ferr, float* berr,
-                    lapack_complex_float* work, float* rwork,
-                    lapack_int *info );
-void LAPACK_zhpsvx( char* fact, char* uplo, lapack_int* n, lapack_int* nrhs,
-                    const lapack_complex_double* ap, lapack_complex_double* afp,
-                    lapack_int* ipiv, const lapack_complex_double* b,
-                    lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx,
-                    double* rcond, double* ferr, double* berr,
-                    lapack_complex_double* work, double* rwork,
-                    lapack_int *info );
-void LAPACK_sgeqrf( lapack_int* m, lapack_int* n, float* a, lapack_int* lda,
-                    float* tau, float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_dgeqrf( lapack_int* m, lapack_int* n, double* a, lapack_int* lda,
-                    double* tau, double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_cgeqrf( lapack_int* m, lapack_int* n, lapack_complex_float* a,
-                    lapack_int* lda, lapack_complex_float* tau,
-                    lapack_complex_float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_zgeqrf( lapack_int* m, lapack_int* n, lapack_complex_double* a,
-                    lapack_int* lda, lapack_complex_double* tau,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_sgeqpf( lapack_int* m, lapack_int* n, float* a, lapack_int* lda,
-                    lapack_int* jpvt, float* tau, float* work,
-                    lapack_int *info );
-void LAPACK_dgeqpf( lapack_int* m, lapack_int* n, double* a, lapack_int* lda,
-                    lapack_int* jpvt, double* tau, double* work,
-                    lapack_int *info );
-void LAPACK_cgeqpf( lapack_int* m, lapack_int* n, lapack_complex_float* a,
-                    lapack_int* lda, lapack_int* jpvt,
-                    lapack_complex_float* tau, lapack_complex_float* work,
-                    float* rwork, lapack_int *info );
-void LAPACK_zgeqpf( lapack_int* m, lapack_int* n, lapack_complex_double* a,
-                    lapack_int* lda, lapack_int* jpvt,
-                    lapack_complex_double* tau, lapack_complex_double* work,
-                    double* rwork, lapack_int *info );
-void LAPACK_sgeqp3( lapack_int* m, lapack_int* n, float* a, lapack_int* lda,
-                    lapack_int* jpvt, float* tau, float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_dgeqp3( lapack_int* m, lapack_int* n, double* a, lapack_int* lda,
-                    lapack_int* jpvt, double* tau, double* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_cgeqp3( lapack_int* m, lapack_int* n, lapack_complex_float* a,
-                    lapack_int* lda, lapack_int* jpvt,
-                    lapack_complex_float* tau, lapack_complex_float* work,
-                    lapack_int* lwork, float* rwork, lapack_int *info );
-void LAPACK_zgeqp3( lapack_int* m, lapack_int* n, lapack_complex_double* a,
-                    lapack_int* lda, lapack_int* jpvt,
-                    lapack_complex_double* tau, lapack_complex_double* work,
-                    lapack_int* lwork, double* rwork, lapack_int *info );
-void LAPACK_sorgqr( lapack_int* m, lapack_int* n, lapack_int* k, float* a,
-                    lapack_int* lda, const float* tau, float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_dorgqr( lapack_int* m, lapack_int* n, lapack_int* k, double* a,
-                    lapack_int* lda, const double* tau, double* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_sormqr( char* side, char* trans, lapack_int* m, lapack_int* n,
-                    lapack_int* k, const float* a, lapack_int* lda,
-                    const float* tau, float* c, lapack_int* ldc, float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_dormqr( char* side, char* trans, lapack_int* m, lapack_int* n,
-                    lapack_int* k, const double* a, lapack_int* lda,
-                    const double* tau, double* c, lapack_int* ldc, double* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_cungqr( lapack_int* m, lapack_int* n, lapack_int* k,
-                    lapack_complex_float* a, lapack_int* lda,
-                    const lapack_complex_float* tau, lapack_complex_float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_zungqr( lapack_int* m, lapack_int* n, lapack_int* k,
-                    lapack_complex_double* a, lapack_int* lda,
-                    const lapack_complex_double* tau,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_cunmqr( char* side, char* trans, lapack_int* m, lapack_int* n,
-                    lapack_int* k, const lapack_complex_float* a,
-                    lapack_int* lda, const lapack_complex_float* tau,
-                    lapack_complex_float* c, lapack_int* ldc,
-                    lapack_complex_float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_zunmqr( char* side, char* trans, lapack_int* m, lapack_int* n,
-                    lapack_int* k, const lapack_complex_double* a,
-                    lapack_int* lda, const lapack_complex_double* tau,
-                    lapack_complex_double* c, lapack_int* ldc,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_sgelqf( lapack_int* m, lapack_int* n, float* a, lapack_int* lda,
-                    float* tau, float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_dgelqf( lapack_int* m, lapack_int* n, double* a, lapack_int* lda,
-                    double* tau, double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_cgelqf( lapack_int* m, lapack_int* n, lapack_complex_float* a,
-                    lapack_int* lda, lapack_complex_float* tau,
-                    lapack_complex_float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_zgelqf( lapack_int* m, lapack_int* n, lapack_complex_double* a,
-                    lapack_int* lda, lapack_complex_double* tau,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_sorglq( lapack_int* m, lapack_int* n, lapack_int* k, float* a,
-                    lapack_int* lda, const float* tau, float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_dorglq( lapack_int* m, lapack_int* n, lapack_int* k, double* a,
-                    lapack_int* lda, const double* tau, double* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_sormlq( char* side, char* trans, lapack_int* m, lapack_int* n,
-                    lapack_int* k, const float* a, lapack_int* lda,
-                    const float* tau, float* c, lapack_int* ldc, float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_dormlq( char* side, char* trans, lapack_int* m, lapack_int* n,
-                    lapack_int* k, const double* a, lapack_int* lda,
-                    const double* tau, double* c, lapack_int* ldc, double* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_cunglq( lapack_int* m, lapack_int* n, lapack_int* k,
-                    lapack_complex_float* a, lapack_int* lda,
-                    const lapack_complex_float* tau, lapack_complex_float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_zunglq( lapack_int* m, lapack_int* n, lapack_int* k,
-                    lapack_complex_double* a, lapack_int* lda,
-                    const lapack_complex_double* tau,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_cunmlq( char* side, char* trans, lapack_int* m, lapack_int* n,
-                    lapack_int* k, const lapack_complex_float* a,
-                    lapack_int* lda, const lapack_complex_float* tau,
-                    lapack_complex_float* c, lapack_int* ldc,
-                    lapack_complex_float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_zunmlq( char* side, char* trans, lapack_int* m, lapack_int* n,
-                    lapack_int* k, const lapack_complex_double* a,
-                    lapack_int* lda, const lapack_complex_double* tau,
-                    lapack_complex_double* c, lapack_int* ldc,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_sgeqlf( lapack_int* m, lapack_int* n, float* a, lapack_int* lda,
-                    float* tau, float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_dgeqlf( lapack_int* m, lapack_int* n, double* a, lapack_int* lda,
-                    double* tau, double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_cgeqlf( lapack_int* m, lapack_int* n, lapack_complex_float* a,
-                    lapack_int* lda, lapack_complex_float* tau,
-                    lapack_complex_float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_zgeqlf( lapack_int* m, lapack_int* n, lapack_complex_double* a,
-                    lapack_int* lda, lapack_complex_double* tau,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_sorgql( lapack_int* m, lapack_int* n, lapack_int* k, float* a,
-                    lapack_int* lda, const float* tau, float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_dorgql( lapack_int* m, lapack_int* n, lapack_int* k, double* a,
-                    lapack_int* lda, const double* tau, double* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_cungql( lapack_int* m, lapack_int* n, lapack_int* k,
-                    lapack_complex_float* a, lapack_int* lda,
-                    const lapack_complex_float* tau, lapack_complex_float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_zungql( lapack_int* m, lapack_int* n, lapack_int* k,
-                    lapack_complex_double* a, lapack_int* lda,
-                    const lapack_complex_double* tau,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_sormql( char* side, char* trans, lapack_int* m, lapack_int* n,
-                    lapack_int* k, const float* a, lapack_int* lda,
-                    const float* tau, float* c, lapack_int* ldc, float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_dormql( char* side, char* trans, lapack_int* m, lapack_int* n,
-                    lapack_int* k, const double* a, lapack_int* lda,
-                    const double* tau, double* c, lapack_int* ldc, double* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_cunmql( char* side, char* trans, lapack_int* m, lapack_int* n,
-                    lapack_int* k, const lapack_complex_float* a,
-                    lapack_int* lda, const lapack_complex_float* tau,
-                    lapack_complex_float* c, lapack_int* ldc,
-                    lapack_complex_float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_zunmql( char* side, char* trans, lapack_int* m, lapack_int* n,
-                    lapack_int* k, const lapack_complex_double* a,
-                    lapack_int* lda, const lapack_complex_double* tau,
-                    lapack_complex_double* c, lapack_int* ldc,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_sgerqf( lapack_int* m, lapack_int* n, float* a, lapack_int* lda,
-                    float* tau, float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_dgerqf( lapack_int* m, lapack_int* n, double* a, lapack_int* lda,
-                    double* tau, double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_cgerqf( lapack_int* m, lapack_int* n, lapack_complex_float* a,
-                    lapack_int* lda, lapack_complex_float* tau,
-                    lapack_complex_float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_zgerqf( lapack_int* m, lapack_int* n, lapack_complex_double* a,
-                    lapack_int* lda, lapack_complex_double* tau,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_sorgrq( lapack_int* m, lapack_int* n, lapack_int* k, float* a,
-                    lapack_int* lda, const float* tau, float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_dorgrq( lapack_int* m, lapack_int* n, lapack_int* k, double* a,
-                    lapack_int* lda, const double* tau, double* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_cungrq( lapack_int* m, lapack_int* n, lapack_int* k,
-                    lapack_complex_float* a, lapack_int* lda,
-                    const lapack_complex_float* tau, lapack_complex_float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_zungrq( lapack_int* m, lapack_int* n, lapack_int* k,
-                    lapack_complex_double* a, lapack_int* lda,
-                    const lapack_complex_double* tau,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_sormrq( char* side, char* trans, lapack_int* m, lapack_int* n,
-                    lapack_int* k, const float* a, lapack_int* lda,
-                    const float* tau, float* c, lapack_int* ldc, float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_dormrq( char* side, char* trans, lapack_int* m, lapack_int* n,
-                    lapack_int* k, const double* a, lapack_int* lda,
-                    const double* tau, double* c, lapack_int* ldc, double* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_cunmrq( char* side, char* trans, lapack_int* m, lapack_int* n,
-                    lapack_int* k, const lapack_complex_float* a,
-                    lapack_int* lda, const lapack_complex_float* tau,
-                    lapack_complex_float* c, lapack_int* ldc,
-                    lapack_complex_float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_zunmrq( char* side, char* trans, lapack_int* m, lapack_int* n,
-                    lapack_int* k, const lapack_complex_double* a,
-                    lapack_int* lda, const lapack_complex_double* tau,
-                    lapack_complex_double* c, lapack_int* ldc,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_stzrzf( lapack_int* m, lapack_int* n, float* a, lapack_int* lda,
-                    float* tau, float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_dtzrzf( lapack_int* m, lapack_int* n, double* a, lapack_int* lda,
-                    double* tau, double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_ctzrzf( lapack_int* m, lapack_int* n, lapack_complex_float* a,
-                    lapack_int* lda, lapack_complex_float* tau,
-                    lapack_complex_float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_ztzrzf( lapack_int* m, lapack_int* n, lapack_complex_double* a,
-                    lapack_int* lda, lapack_complex_double* tau,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_sormrz( char* side, char* trans, lapack_int* m, lapack_int* n,
-                    lapack_int* k, lapack_int* l, const float* a,
-                    lapack_int* lda, const float* tau, float* c,
-                    lapack_int* ldc, float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_dormrz( char* side, char* trans, lapack_int* m, lapack_int* n,
-                    lapack_int* k, lapack_int* l, const double* a,
-                    lapack_int* lda, const double* tau, double* c,
-                    lapack_int* ldc, double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_cunmrz( char* side, char* trans, lapack_int* m, lapack_int* n,
-                    lapack_int* k, lapack_int* l, const lapack_complex_float* a,
-                    lapack_int* lda, const lapack_complex_float* tau,
-                    lapack_complex_float* c, lapack_int* ldc,
-                    lapack_complex_float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_zunmrz( char* side, char* trans, lapack_int* m, lapack_int* n,
-                    lapack_int* k, lapack_int* l,
-                    const lapack_complex_double* a, lapack_int* lda,
-                    const lapack_complex_double* tau, lapack_complex_double* c,
-                    lapack_int* ldc, lapack_complex_double* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_sggqrf( lapack_int* n, lapack_int* m, lapack_int* p, float* a,
-                    lapack_int* lda, float* taua, float* b, lapack_int* ldb,
-                    float* taub, float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_dggqrf( lapack_int* n, lapack_int* m, lapack_int* p, double* a,
-                    lapack_int* lda, double* taua, double* b, lapack_int* ldb,
-                    double* taub, double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_cggqrf( lapack_int* n, lapack_int* m, lapack_int* p,
-                    lapack_complex_float* a, lapack_int* lda,
-                    lapack_complex_float* taua, lapack_complex_float* b,
-                    lapack_int* ldb, lapack_complex_float* taub,
-                    lapack_complex_float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_zggqrf( lapack_int* n, lapack_int* m, lapack_int* p,
-                    lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* taua, lapack_complex_double* b,
-                    lapack_int* ldb, lapack_complex_double* taub,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_sggrqf( lapack_int* m, lapack_int* p, lapack_int* n, float* a,
-                    lapack_int* lda, float* taua, float* b, lapack_int* ldb,
-                    float* taub, float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_dggrqf( lapack_int* m, lapack_int* p, lapack_int* n, double* a,
-                    lapack_int* lda, double* taua, double* b, lapack_int* ldb,
-                    double* taub, double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_cggrqf( lapack_int* m, lapack_int* p, lapack_int* n,
-                    lapack_complex_float* a, lapack_int* lda,
-                    lapack_complex_float* taua, lapack_complex_float* b,
-                    lapack_int* ldb, lapack_complex_float* taub,
-                    lapack_complex_float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_zggrqf( lapack_int* m, lapack_int* p, lapack_int* n,
-                    lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* taua, lapack_complex_double* b,
-                    lapack_int* ldb, lapack_complex_double* taub,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_sgebrd( lapack_int* m, lapack_int* n, float* a, lapack_int* lda,
-                    float* d, float* e, float* tauq, float* taup, float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_dgebrd( lapack_int* m, lapack_int* n, double* a, lapack_int* lda,
-                    double* d, double* e, double* tauq, double* taup,
-                    double* work, lapack_int* lwork, lapack_int *info );
-void LAPACK_cgebrd( lapack_int* m, lapack_int* n, lapack_complex_float* a,
-                    lapack_int* lda, float* d, float* e,
-                    lapack_complex_float* tauq, lapack_complex_float* taup,
-                    lapack_complex_float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_zgebrd( lapack_int* m, lapack_int* n, lapack_complex_double* a,
-                    lapack_int* lda, double* d, double* e,
-                    lapack_complex_double* tauq, lapack_complex_double* taup,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_sgbbrd( char* vect, lapack_int* m, lapack_int* n, lapack_int* ncc,
-                    lapack_int* kl, lapack_int* ku, float* ab, lapack_int* ldab,
-                    float* d, float* e, float* q, lapack_int* ldq, float* pt,
-                    lapack_int* ldpt, float* c, lapack_int* ldc, float* work,
-                    lapack_int *info );
-void LAPACK_dgbbrd( char* vect, lapack_int* m, lapack_int* n, lapack_int* ncc,
-                    lapack_int* kl, lapack_int* ku, double* ab,
-                    lapack_int* ldab, double* d, double* e, double* q,
-                    lapack_int* ldq, double* pt, lapack_int* ldpt, double* c,
-                    lapack_int* ldc, double* work, lapack_int *info );
-void LAPACK_cgbbrd( char* vect, lapack_int* m, lapack_int* n, lapack_int* ncc,
-                    lapack_int* kl, lapack_int* ku, lapack_complex_float* ab,
-                    lapack_int* ldab, float* d, float* e,
-                    lapack_complex_float* q, lapack_int* ldq,
-                    lapack_complex_float* pt, lapack_int* ldpt,
-                    lapack_complex_float* c, lapack_int* ldc,
-                    lapack_complex_float* work, float* rwork,
-                    lapack_int *info );
-void LAPACK_zgbbrd( char* vect, lapack_int* m, lapack_int* n, lapack_int* ncc,
-                    lapack_int* kl, lapack_int* ku, lapack_complex_double* ab,
-                    lapack_int* ldab, double* d, double* e,
-                    lapack_complex_double* q, lapack_int* ldq,
-                    lapack_complex_double* pt, lapack_int* ldpt,
-                    lapack_complex_double* c, lapack_int* ldc,
-                    lapack_complex_double* work, double* rwork,
-                    lapack_int *info );
-void LAPACK_sorgbr( char* vect, lapack_int* m, lapack_int* n, lapack_int* k,
-                    float* a, lapack_int* lda, const float* tau, float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_dorgbr( char* vect, lapack_int* m, lapack_int* n, lapack_int* k,
-                    double* a, lapack_int* lda, const double* tau, double* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_sormbr( char* vect, char* side, char* trans, lapack_int* m,
-                    lapack_int* n, lapack_int* k, const float* a,
-                    lapack_int* lda, const float* tau, float* c,
-                    lapack_int* ldc, float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_dormbr( char* vect, char* side, char* trans, lapack_int* m,
-                    lapack_int* n, lapack_int* k, const double* a,
-                    lapack_int* lda, const double* tau, double* c,
-                    lapack_int* ldc, double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_cungbr( char* vect, lapack_int* m, lapack_int* n, lapack_int* k,
-                    lapack_complex_float* a, lapack_int* lda,
-                    const lapack_complex_float* tau, lapack_complex_float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_zungbr( char* vect, lapack_int* m, lapack_int* n, lapack_int* k,
-                    lapack_complex_double* a, lapack_int* lda,
-                    const lapack_complex_double* tau,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_cunmbr( char* vect, char* side, char* trans, lapack_int* m,
-                    lapack_int* n, lapack_int* k, const lapack_complex_float* a,
-                    lapack_int* lda, const lapack_complex_float* tau,
-                    lapack_complex_float* c, lapack_int* ldc,
-                    lapack_complex_float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_zunmbr( char* vect, char* side, char* trans, lapack_int* m,
-                    lapack_int* n, lapack_int* k,
-                    const lapack_complex_double* a, lapack_int* lda,
-                    const lapack_complex_double* tau, lapack_complex_double* c,
-                    lapack_int* ldc, lapack_complex_double* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_sbdsqr( char* uplo, lapack_int* n, lapack_int* ncvt,
-                    lapack_int* nru, lapack_int* ncc, float* d, float* e,
-                    float* vt, lapack_int* ldvt, float* u, lapack_int* ldu,
-                    float* c, lapack_int* ldc, float* work, lapack_int *info );
-void LAPACK_dbdsqr( char* uplo, lapack_int* n, lapack_int* ncvt,
-                    lapack_int* nru, lapack_int* ncc, double* d, double* e,
-                    double* vt, lapack_int* ldvt, double* u, lapack_int* ldu,
-                    double* c, lapack_int* ldc, double* work,
-                    lapack_int *info );
-void LAPACK_cbdsqr( char* uplo, lapack_int* n, lapack_int* ncvt,
-                    lapack_int* nru, lapack_int* ncc, float* d, float* e,
-                    lapack_complex_float* vt, lapack_int* ldvt,
-                    lapack_complex_float* u, lapack_int* ldu,
-                    lapack_complex_float* c, lapack_int* ldc, float* work,
-                    lapack_int *info );
-void LAPACK_zbdsqr( char* uplo, lapack_int* n, lapack_int* ncvt,
-                    lapack_int* nru, lapack_int* ncc, double* d, double* e,
-                    lapack_complex_double* vt, lapack_int* ldvt,
-                    lapack_complex_double* u, lapack_int* ldu,
-                    lapack_complex_double* c, lapack_int* ldc, double* work,
-                    lapack_int *info );
-void LAPACK_sbdsdc( char* uplo, char* compq, lapack_int* n, float* d, float* e,
-                    float* u, lapack_int* ldu, float* vt, lapack_int* ldvt,
-                    float* q, lapack_int* iq, float* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_dbdsdc( char* uplo, char* compq, lapack_int* n, double* d,
-                    double* e, double* u, lapack_int* ldu, double* vt,
-                    lapack_int* ldvt, double* q, lapack_int* iq, double* work,
-                    lapack_int* iwork, lapack_int *info );
-void LAPACK_ssytrd( char* uplo, lapack_int* n, float* a, lapack_int* lda,
-                    float* d, float* e, float* tau, float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_dsytrd( char* uplo, lapack_int* n, double* a, lapack_int* lda,
-                    double* d, double* e, double* tau, double* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_sorgtr( char* uplo, lapack_int* n, float* a, lapack_int* lda,
-                    const float* tau, float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_dorgtr( char* uplo, lapack_int* n, double* a, lapack_int* lda,
-                    const double* tau, double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_sormtr( char* side, char* uplo, char* trans, lapack_int* m,
-                    lapack_int* n, const float* a, lapack_int* lda,
-                    const float* tau, float* c, lapack_int* ldc, float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_dormtr( char* side, char* uplo, char* trans, lapack_int* m,
-                    lapack_int* n, const double* a, lapack_int* lda,
-                    const double* tau, double* c, lapack_int* ldc, double* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_chetrd( char* uplo, lapack_int* n, lapack_complex_float* a,
-                    lapack_int* lda, float* d, float* e,
-                    lapack_complex_float* tau, lapack_complex_float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_zhetrd( char* uplo, lapack_int* n, lapack_complex_double* a,
-                    lapack_int* lda, double* d, double* e,
-                    lapack_complex_double* tau, lapack_complex_double* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_cungtr( char* uplo, lapack_int* n, lapack_complex_float* a,
-                    lapack_int* lda, const lapack_complex_float* tau,
-                    lapack_complex_float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_zungtr( char* uplo, lapack_int* n, lapack_complex_double* a,
-                    lapack_int* lda, const lapack_complex_double* tau,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_cunmtr( char* side, char* uplo, char* trans, lapack_int* m,
-                    lapack_int* n, const lapack_complex_float* a,
-                    lapack_int* lda, const lapack_complex_float* tau,
-                    lapack_complex_float* c, lapack_int* ldc,
-                    lapack_complex_float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_zunmtr( char* side, char* uplo, char* trans, lapack_int* m,
-                    lapack_int* n, const lapack_complex_double* a,
-                    lapack_int* lda, const lapack_complex_double* tau,
-                    lapack_complex_double* c, lapack_int* ldc,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_ssptrd( char* uplo, lapack_int* n, float* ap, float* d, float* e,
-                    float* tau, lapack_int *info );
-void LAPACK_dsptrd( char* uplo, lapack_int* n, double* ap, double* d, double* e,
-                    double* tau, lapack_int *info );
-void LAPACK_sopgtr( char* uplo, lapack_int* n, const float* ap,
-                    const float* tau, float* q, lapack_int* ldq, float* work,
-                    lapack_int *info );
-void LAPACK_dopgtr( char* uplo, lapack_int* n, const double* ap,
-                    const double* tau, double* q, lapack_int* ldq, double* work,
-                    lapack_int *info );
-void LAPACK_sopmtr( char* side, char* uplo, char* trans, lapack_int* m,
-                    lapack_int* n, const float* ap, const float* tau, float* c,
-                    lapack_int* ldc, float* work, lapack_int *info );
-void LAPACK_dopmtr( char* side, char* uplo, char* trans, lapack_int* m,
-                    lapack_int* n, const double* ap, const double* tau,
-                    double* c, lapack_int* ldc, double* work,
-                    lapack_int *info );
-void LAPACK_chptrd( char* uplo, lapack_int* n, lapack_complex_float* ap,
-                    float* d, float* e, lapack_complex_float* tau,
-                    lapack_int *info );
-void LAPACK_zhptrd( char* uplo, lapack_int* n, lapack_complex_double* ap,
-                    double* d, double* e, lapack_complex_double* tau,
-                    lapack_int *info );
-void LAPACK_cupgtr( char* uplo, lapack_int* n, const lapack_complex_float* ap,
-                    const lapack_complex_float* tau, lapack_complex_float* q,
-                    lapack_int* ldq, lapack_complex_float* work,
-                    lapack_int *info );
-void LAPACK_zupgtr( char* uplo, lapack_int* n, const lapack_complex_double* ap,
-                    const lapack_complex_double* tau, lapack_complex_double* q,
-                    lapack_int* ldq, lapack_complex_double* work,
-                    lapack_int *info );
-void LAPACK_cupmtr( char* side, char* uplo, char* trans, lapack_int* m,
-                    lapack_int* n, const lapack_complex_float* ap,
-                    const lapack_complex_float* tau, lapack_complex_float* c,
-                    lapack_int* ldc, lapack_complex_float* work,
-                    lapack_int *info );
-void LAPACK_zupmtr( char* side, char* uplo, char* trans, lapack_int* m,
-                    lapack_int* n, const lapack_complex_double* ap,
-                    const lapack_complex_double* tau, lapack_complex_double* c,
-                    lapack_int* ldc, lapack_complex_double* work,
-                    lapack_int *info );
-void LAPACK_ssbtrd( char* vect, char* uplo, lapack_int* n, lapack_int* kd,
-                    float* ab, lapack_int* ldab, float* d, float* e, float* q,
-                    lapack_int* ldq, float* work, lapack_int *info );
-void LAPACK_dsbtrd( char* vect, char* uplo, lapack_int* n, lapack_int* kd,
-                    double* ab, lapack_int* ldab, double* d, double* e,
-                    double* q, lapack_int* ldq, double* work,
-                    lapack_int *info );
-void LAPACK_chbtrd( char* vect, char* uplo, lapack_int* n, lapack_int* kd,
-                    lapack_complex_float* ab, lapack_int* ldab, float* d,
-                    float* e, lapack_complex_float* q, lapack_int* ldq,
-                    lapack_complex_float* work, lapack_int *info );
-void LAPACK_zhbtrd( char* vect, char* uplo, lapack_int* n, lapack_int* kd,
-                    lapack_complex_double* ab, lapack_int* ldab, double* d,
-                    double* e, lapack_complex_double* q, lapack_int* ldq,
-                    lapack_complex_double* work, lapack_int *info );
-void LAPACK_ssterf( lapack_int* n, float* d, float* e, lapack_int *info );
-void LAPACK_dsterf( lapack_int* n, double* d, double* e, lapack_int *info );
-void LAPACK_ssteqr( char* compz, lapack_int* n, float* d, float* e, float* z,
-                    lapack_int* ldz, float* work, lapack_int *info );
-void LAPACK_dsteqr( char* compz, lapack_int* n, double* d, double* e, double* z,
-                    lapack_int* ldz, double* work, lapack_int *info );
-void LAPACK_csteqr( char* compz, lapack_int* n, float* d, float* e,
-                    lapack_complex_float* z, lapack_int* ldz, float* work,
-                    lapack_int *info );
-void LAPACK_zsteqr( char* compz, lapack_int* n, double* d, double* e,
-                    lapack_complex_double* z, lapack_int* ldz, double* work,
-                    lapack_int *info );
-void LAPACK_sstemr( char* jobz, char* range, lapack_int* n, float* d, float* e,
-                    float* vl, float* vu, lapack_int* il, lapack_int* iu,
-                    lapack_int* m, float* w, float* z, lapack_int* ldz,
-                    lapack_int* nzc, lapack_int* isuppz, lapack_logical* tryrac,
-                    float* work, lapack_int* lwork, lapack_int* iwork,
-                    lapack_int* liwork, lapack_int *info );
-void LAPACK_dstemr( char* jobz, char* range, lapack_int* n, double* d,
-                    double* e, double* vl, double* vu, lapack_int* il,
-                    lapack_int* iu, lapack_int* m, double* w, double* z,
-                    lapack_int* ldz, lapack_int* nzc, lapack_int* isuppz,
-                    lapack_logical* tryrac, double* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int* liwork, lapack_int *info );
-void LAPACK_cstemr( char* jobz, char* range, lapack_int* n, float* d, float* e,
-                    float* vl, float* vu, lapack_int* il, lapack_int* iu,
-                    lapack_int* m, float* w, lapack_complex_float* z,
-                    lapack_int* ldz, lapack_int* nzc, lapack_int* isuppz,
-                    lapack_logical* tryrac, float* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int* liwork, lapack_int *info );
-void LAPACK_zstemr( char* jobz, char* range, lapack_int* n, double* d,
-                    double* e, double* vl, double* vu, lapack_int* il,
-                    lapack_int* iu, lapack_int* m, double* w,
-                    lapack_complex_double* z, lapack_int* ldz, lapack_int* nzc,
-                    lapack_int* isuppz, lapack_logical* tryrac, double* work,
-                    lapack_int* lwork, lapack_int* iwork, lapack_int* liwork,
-                    lapack_int *info );
-void LAPACK_sstedc( char* compz, lapack_int* n, float* d, float* e, float* z,
-                    lapack_int* ldz, float* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int* liwork, lapack_int *info );
-void LAPACK_dstedc( char* compz, lapack_int* n, double* d, double* e, double* z,
-                    lapack_int* ldz, double* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int* liwork, lapack_int *info );
-void LAPACK_cstedc( char* compz, lapack_int* n, float* d, float* e,
-                    lapack_complex_float* z, lapack_int* ldz,
-                    lapack_complex_float* work, lapack_int* lwork, float* rwork,
-                    lapack_int* lrwork, lapack_int* iwork, lapack_int* liwork,
-                    lapack_int *info );
-void LAPACK_zstedc( char* compz, lapack_int* n, double* d, double* e,
-                    lapack_complex_double* z, lapack_int* ldz,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    double* rwork, lapack_int* lrwork, lapack_int* iwork,
-                    lapack_int* liwork, lapack_int *info );
-void LAPACK_sstegr( char* jobz, char* range, lapack_int* n, float* d, float* e,
-                    float* vl, float* vu, lapack_int* il, lapack_int* iu,
-                    float* abstol, lapack_int* m, float* w, float* z,
-                    lapack_int* ldz, lapack_int* isuppz, float* work,
-                    lapack_int* lwork, lapack_int* iwork, lapack_int* liwork,
-                    lapack_int *info );
-void LAPACK_dstegr( char* jobz, char* range, lapack_int* n, double* d,
-                    double* e, double* vl, double* vu, lapack_int* il,
-                    lapack_int* iu, double* abstol, lapack_int* m, double* w,
-                    double* z, lapack_int* ldz, lapack_int* isuppz,
-                    double* work, lapack_int* lwork, lapack_int* iwork,
-                    lapack_int* liwork, lapack_int *info );
-void LAPACK_cstegr( char* jobz, char* range, lapack_int* n, float* d, float* e,
-                    float* vl, float* vu, lapack_int* il, lapack_int* iu,
-                    float* abstol, lapack_int* m, float* w,
-                    lapack_complex_float* z, lapack_int* ldz,
-                    lapack_int* isuppz, float* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int* liwork, lapack_int *info );
-void LAPACK_zstegr( char* jobz, char* range, lapack_int* n, double* d,
-                    double* e, double* vl, double* vu, lapack_int* il,
-                    lapack_int* iu, double* abstol, lapack_int* m, double* w,
-                    lapack_complex_double* z, lapack_int* ldz,
-                    lapack_int* isuppz, double* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int* liwork, lapack_int *info );
-void LAPACK_spteqr( char* compz, lapack_int* n, float* d, float* e, float* z,
-                    lapack_int* ldz, float* work, lapack_int *info );
-void LAPACK_dpteqr( char* compz, lapack_int* n, double* d, double* e, double* z,
-                    lapack_int* ldz, double* work, lapack_int *info );
-void LAPACK_cpteqr( char* compz, lapack_int* n, float* d, float* e,
-                    lapack_complex_float* z, lapack_int* ldz, float* work,
-                    lapack_int *info );
-void LAPACK_zpteqr( char* compz, lapack_int* n, double* d, double* e,
-                    lapack_complex_double* z, lapack_int* ldz, double* work,
-                    lapack_int *info );
-void LAPACK_sstebz( char* range, char* order, lapack_int* n, float* vl,
-                    float* vu, lapack_int* il, lapack_int* iu, float* abstol,
-                    const float* d, const float* e, lapack_int* m,
-                    lapack_int* nsplit, float* w, lapack_int* iblock,
-                    lapack_int* isplit, float* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_dstebz( char* range, char* order, lapack_int* n, double* vl,
-                    double* vu, lapack_int* il, lapack_int* iu, double* abstol,
-                    const double* d, const double* e, lapack_int* m,
-                    lapack_int* nsplit, double* w, lapack_int* iblock,
-                    lapack_int* isplit, double* work, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_sstein( lapack_int* n, const float* d, const float* e,
-                    lapack_int* m, const float* w, const lapack_int* iblock,
-                    const lapack_int* isplit, float* z, lapack_int* ldz,
-                    float* work, lapack_int* iwork, lapack_int* ifailv,
-                    lapack_int *info );
-void LAPACK_dstein( lapack_int* n, const double* d, const double* e,
-                    lapack_int* m, const double* w, const lapack_int* iblock,
-                    const lapack_int* isplit, double* z, lapack_int* ldz,
-                    double* work, lapack_int* iwork, lapack_int* ifailv,
-                    lapack_int *info );
-void LAPACK_cstein( lapack_int* n, const float* d, const float* e,
-                    lapack_int* m, const float* w, const lapack_int* iblock,
-                    const lapack_int* isplit, lapack_complex_float* z,
-                    lapack_int* ldz, float* work, lapack_int* iwork,
-                    lapack_int* ifailv, lapack_int *info );
-void LAPACK_zstein( lapack_int* n, const double* d, const double* e,
-                    lapack_int* m, const double* w, const lapack_int* iblock,
-                    const lapack_int* isplit, lapack_complex_double* z,
-                    lapack_int* ldz, double* work, lapack_int* iwork,
-                    lapack_int* ifailv, lapack_int *info );
-void LAPACK_sdisna( char* job, lapack_int* m, lapack_int* n, const float* d,
-                    float* sep, lapack_int *info );
-void LAPACK_ddisna( char* job, lapack_int* m, lapack_int* n, const double* d,
-                    double* sep, lapack_int *info );
-void LAPACK_ssygst( lapack_int* itype, char* uplo, lapack_int* n, float* a,
-                    lapack_int* lda, const float* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_dsygst( lapack_int* itype, char* uplo, lapack_int* n, double* a,
-                    lapack_int* lda, const double* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_chegst( lapack_int* itype, char* uplo, lapack_int* n,
-                    lapack_complex_float* a, lapack_int* lda,
-                    const lapack_complex_float* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_zhegst( lapack_int* itype, char* uplo, lapack_int* n,
-                    lapack_complex_double* a, lapack_int* lda,
-                    const lapack_complex_double* b, lapack_int* ldb,
-                    lapack_int *info );
-void LAPACK_sspgst( lapack_int* itype, char* uplo, lapack_int* n, float* ap,
-                    const float* bp, lapack_int *info );
-void LAPACK_dspgst( lapack_int* itype, char* uplo, lapack_int* n, double* ap,
-                    const double* bp, lapack_int *info );
-void LAPACK_chpgst( lapack_int* itype, char* uplo, lapack_int* n,
-                    lapack_complex_float* ap, const lapack_complex_float* bp,
-                    lapack_int *info );
-void LAPACK_zhpgst( lapack_int* itype, char* uplo, lapack_int* n,
-                    lapack_complex_double* ap, const lapack_complex_double* bp,
-                    lapack_int *info );
-void LAPACK_ssbgst( char* vect, char* uplo, lapack_int* n, lapack_int* ka,
-                    lapack_int* kb, float* ab, lapack_int* ldab,
-                    const float* bb, lapack_int* ldbb, float* x,
-                    lapack_int* ldx, float* work, lapack_int *info );
-void LAPACK_dsbgst( char* vect, char* uplo, lapack_int* n, lapack_int* ka,
-                    lapack_int* kb, double* ab, lapack_int* ldab,
-                    const double* bb, lapack_int* ldbb, double* x,
-                    lapack_int* ldx, double* work, lapack_int *info );
-void LAPACK_chbgst( char* vect, char* uplo, lapack_int* n, lapack_int* ka,
-                    lapack_int* kb, lapack_complex_float* ab, lapack_int* ldab,
-                    const lapack_complex_float* bb, lapack_int* ldbb,
-                    lapack_complex_float* x, lapack_int* ldx,
-                    lapack_complex_float* work, float* rwork,
-                    lapack_int *info );
-void LAPACK_zhbgst( char* vect, char* uplo, lapack_int* n, lapack_int* ka,
-                    lapack_int* kb, lapack_complex_double* ab, lapack_int* ldab,
-                    const lapack_complex_double* bb, lapack_int* ldbb,
-                    lapack_complex_double* x, lapack_int* ldx,
-                    lapack_complex_double* work, double* rwork,
-                    lapack_int *info );
-void LAPACK_spbstf( char* uplo, lapack_int* n, lapack_int* kb, float* bb,
-                    lapack_int* ldbb, lapack_int *info );
-void LAPACK_dpbstf( char* uplo, lapack_int* n, lapack_int* kb, double* bb,
-                    lapack_int* ldbb, lapack_int *info );
-void LAPACK_cpbstf( char* uplo, lapack_int* n, lapack_int* kb,
-                    lapack_complex_float* bb, lapack_int* ldbb,
-                    lapack_int *info );
-void LAPACK_zpbstf( char* uplo, lapack_int* n, lapack_int* kb,
-                    lapack_complex_double* bb, lapack_int* ldbb,
-                    lapack_int *info );
-void LAPACK_sgehrd( lapack_int* n, lapack_int* ilo, lapack_int* ihi, float* a,
-                    lapack_int* lda, float* tau, float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_dgehrd( lapack_int* n, lapack_int* ilo, lapack_int* ihi, double* a,
-                    lapack_int* lda, double* tau, double* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_cgehrd( lapack_int* n, lapack_int* ilo, lapack_int* ihi,
-                    lapack_complex_float* a, lapack_int* lda,
-                    lapack_complex_float* tau, lapack_complex_float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_zgehrd( lapack_int* n, lapack_int* ilo, lapack_int* ihi,
-                    lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* tau, lapack_complex_double* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_sorghr( lapack_int* n, lapack_int* ilo, lapack_int* ihi, float* a,
-                    lapack_int* lda, const float* tau, float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_dorghr( lapack_int* n, lapack_int* ilo, lapack_int* ihi, double* a,
-                    lapack_int* lda, const double* tau, double* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_sormhr( char* side, char* trans, lapack_int* m, lapack_int* n,
-                    lapack_int* ilo, lapack_int* ihi, const float* a,
-                    lapack_int* lda, const float* tau, float* c,
-                    lapack_int* ldc, float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_dormhr( char* side, char* trans, lapack_int* m, lapack_int* n,
-                    lapack_int* ilo, lapack_int* ihi, const double* a,
-                    lapack_int* lda, const double* tau, double* c,
-                    lapack_int* ldc, double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_cunghr( lapack_int* n, lapack_int* ilo, lapack_int* ihi,
-                    lapack_complex_float* a, lapack_int* lda,
-                    const lapack_complex_float* tau, lapack_complex_float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_zunghr( lapack_int* n, lapack_int* ilo, lapack_int* ihi,
-                    lapack_complex_double* a, lapack_int* lda,
-                    const lapack_complex_double* tau,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_cunmhr( char* side, char* trans, lapack_int* m, lapack_int* n,
-                    lapack_int* ilo, lapack_int* ihi,
-                    const lapack_complex_float* a, lapack_int* lda,
-                    const lapack_complex_float* tau, lapack_complex_float* c,
-                    lapack_int* ldc, lapack_complex_float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_zunmhr( char* side, char* trans, lapack_int* m, lapack_int* n,
-                    lapack_int* ilo, lapack_int* ihi,
-                    const lapack_complex_double* a, lapack_int* lda,
-                    const lapack_complex_double* tau, lapack_complex_double* c,
-                    lapack_int* ldc, lapack_complex_double* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_sgebal( char* job, lapack_int* n, float* a, lapack_int* lda,
-                    lapack_int* ilo, lapack_int* ihi, float* scale,
-                    lapack_int *info );
-void LAPACK_dgebal( char* job, lapack_int* n, double* a, lapack_int* lda,
-                    lapack_int* ilo, lapack_int* ihi, double* scale,
-                    lapack_int *info );
-void LAPACK_cgebal( char* job, lapack_int* n, lapack_complex_float* a,
-                    lapack_int* lda, lapack_int* ilo, lapack_int* ihi,
-                    float* scale, lapack_int *info );
-void LAPACK_zgebal( char* job, lapack_int* n, lapack_complex_double* a,
-                    lapack_int* lda, lapack_int* ilo, lapack_int* ihi,
-                    double* scale, lapack_int *info );
-void LAPACK_sgebak( char* job, char* side, lapack_int* n, lapack_int* ilo,
-                    lapack_int* ihi, const float* scale, lapack_int* m,
-                    float* v, lapack_int* ldv, lapack_int *info );
-void LAPACK_dgebak( char* job, char* side, lapack_int* n, lapack_int* ilo,
-                    lapack_int* ihi, const double* scale, lapack_int* m,
-                    double* v, lapack_int* ldv, lapack_int *info );
-void LAPACK_cgebak( char* job, char* side, lapack_int* n, lapack_int* ilo,
-                    lapack_int* ihi, const float* scale, lapack_int* m,
-                    lapack_complex_float* v, lapack_int* ldv,
-                    lapack_int *info );
-void LAPACK_zgebak( char* job, char* side, lapack_int* n, lapack_int* ilo,
-                    lapack_int* ihi, const double* scale, lapack_int* m,
-                    lapack_complex_double* v, lapack_int* ldv,
-                    lapack_int *info );
-void LAPACK_shseqr( char* job, char* compz, lapack_int* n, lapack_int* ilo,
-                    lapack_int* ihi, float* h, lapack_int* ldh, float* wr,
-                    float* wi, float* z, lapack_int* ldz, float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_dhseqr( char* job, char* compz, lapack_int* n, lapack_int* ilo,
-                    lapack_int* ihi, double* h, lapack_int* ldh, double* wr,
-                    double* wi, double* z, lapack_int* ldz, double* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_chseqr( char* job, char* compz, lapack_int* n, lapack_int* ilo,
-                    lapack_int* ihi, lapack_complex_float* h, lapack_int* ldh,
-                    lapack_complex_float* w, lapack_complex_float* z,
-                    lapack_int* ldz, lapack_complex_float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_zhseqr( char* job, char* compz, lapack_int* n, lapack_int* ilo,
-                    lapack_int* ihi, lapack_complex_double* h, lapack_int* ldh,
-                    lapack_complex_double* w, lapack_complex_double* z,
-                    lapack_int* ldz, lapack_complex_double* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_shsein( char* job, char* eigsrc, char* initv,
-                    lapack_logical* select, lapack_int* n, const float* h,
-                    lapack_int* ldh, float* wr, const float* wi, float* vl,
-                    lapack_int* ldvl, float* vr, lapack_int* ldvr,
-                    lapack_int* mm, lapack_int* m, float* work,
-                    lapack_int* ifaill, lapack_int* ifailr, lapack_int *info );
-void LAPACK_dhsein( char* job, char* eigsrc, char* initv,
-                    lapack_logical* select, lapack_int* n, const double* h,
-                    lapack_int* ldh, double* wr, const double* wi, double* vl,
-                    lapack_int* ldvl, double* vr, lapack_int* ldvr,
-                    lapack_int* mm, lapack_int* m, double* work,
-                    lapack_int* ifaill, lapack_int* ifailr, lapack_int *info );
-void LAPACK_chsein( char* job, char* eigsrc, char* initv,
-                    const lapack_logical* select, lapack_int* n,
-                    const lapack_complex_float* h, lapack_int* ldh,
-                    lapack_complex_float* w, lapack_complex_float* vl,
-                    lapack_int* ldvl, lapack_complex_float* vr,
-                    lapack_int* ldvr, lapack_int* mm, lapack_int* m,
-                    lapack_complex_float* work, float* rwork,
-                    lapack_int* ifaill, lapack_int* ifailr, lapack_int *info );
-void LAPACK_zhsein( char* job, char* eigsrc, char* initv,
-                    const lapack_logical* select, lapack_int* n,
-                    const lapack_complex_double* h, lapack_int* ldh,
-                    lapack_complex_double* w, lapack_complex_double* vl,
-                    lapack_int* ldvl, lapack_complex_double* vr,
-                    lapack_int* ldvr, lapack_int* mm, lapack_int* m,
-                    lapack_complex_double* work, double* rwork,
-                    lapack_int* ifaill, lapack_int* ifailr, lapack_int *info );
-void LAPACK_strevc( char* side, char* howmny, lapack_logical* select,
-                    lapack_int* n, const float* t, lapack_int* ldt, float* vl,
-                    lapack_int* ldvl, float* vr, lapack_int* ldvr,
-                    lapack_int* mm, lapack_int* m, float* work,
-                    lapack_int *info );
-void LAPACK_dtrevc( char* side, char* howmny, lapack_logical* select,
-                    lapack_int* n, const double* t, lapack_int* ldt, double* vl,
-                    lapack_int* ldvl, double* vr, lapack_int* ldvr,
-                    lapack_int* mm, lapack_int* m, double* work,
-                    lapack_int *info );
-void LAPACK_ctrevc( char* side, char* howmny, const lapack_logical* select,
-                    lapack_int* n, lapack_complex_float* t, lapack_int* ldt,
-                    lapack_complex_float* vl, lapack_int* ldvl,
-                    lapack_complex_float* vr, lapack_int* ldvr, lapack_int* mm,
-                    lapack_int* m, lapack_complex_float* work, float* rwork,
-                    lapack_int *info );
-void LAPACK_ztrevc( char* side, char* howmny, const lapack_logical* select,
-                    lapack_int* n, lapack_complex_double* t, lapack_int* ldt,
-                    lapack_complex_double* vl, lapack_int* ldvl,
-                    lapack_complex_double* vr, lapack_int* ldvr, lapack_int* mm,
-                    lapack_int* m, lapack_complex_double* work, double* rwork,
-                    lapack_int *info );
-void LAPACK_strsna( char* job, char* howmny, const lapack_logical* select,
-                    lapack_int* n, const float* t, lapack_int* ldt,
-                    const float* vl, lapack_int* ldvl, const float* vr,
-                    lapack_int* ldvr, float* s, float* sep, lapack_int* mm,
-                    lapack_int* m, float* work, lapack_int* ldwork,
-                    lapack_int* iwork, lapack_int *info );
-void LAPACK_dtrsna( char* job, char* howmny, const lapack_logical* select,
-                    lapack_int* n, const double* t, lapack_int* ldt,
-                    const double* vl, lapack_int* ldvl, const double* vr,
-                    lapack_int* ldvr, double* s, double* sep, lapack_int* mm,
-                    lapack_int* m, double* work, lapack_int* ldwork,
-                    lapack_int* iwork, lapack_int *info );
-void LAPACK_ctrsna( char* job, char* howmny, const lapack_logical* select,
-                    lapack_int* n, const lapack_complex_float* t,
-                    lapack_int* ldt, const lapack_complex_float* vl,
-                    lapack_int* ldvl, const lapack_complex_float* vr,
-                    lapack_int* ldvr, float* s, float* sep, lapack_int* mm,
-                    lapack_int* m, lapack_complex_float* work,
-                    lapack_int* ldwork, float* rwork, lapack_int *info );
-void LAPACK_ztrsna( char* job, char* howmny, const lapack_logical* select,
-                    lapack_int* n, const lapack_complex_double* t,
-                    lapack_int* ldt, const lapack_complex_double* vl,
-                    lapack_int* ldvl, const lapack_complex_double* vr,
-                    lapack_int* ldvr, double* s, double* sep, lapack_int* mm,
-                    lapack_int* m, lapack_complex_double* work,
-                    lapack_int* ldwork, double* rwork, lapack_int *info );
-void LAPACK_strexc( char* compq, lapack_int* n, float* t, lapack_int* ldt,
-                    float* q, lapack_int* ldq, lapack_int* ifst,
-                    lapack_int* ilst, float* work, lapack_int *info );
-void LAPACK_dtrexc( char* compq, lapack_int* n, double* t, lapack_int* ldt,
-                    double* q, lapack_int* ldq, lapack_int* ifst,
-                    lapack_int* ilst, double* work, lapack_int *info );
-void LAPACK_ctrexc( char* compq, lapack_int* n, lapack_complex_float* t,
-                    lapack_int* ldt, lapack_complex_float* q, lapack_int* ldq,
-                    lapack_int* ifst, lapack_int* ilst, lapack_int *info );
-void LAPACK_ztrexc( char* compq, lapack_int* n, lapack_complex_double* t,
-                    lapack_int* ldt, lapack_complex_double* q, lapack_int* ldq,
-                    lapack_int* ifst, lapack_int* ilst, lapack_int *info );
-void LAPACK_strsen( char* job, char* compq, const lapack_logical* select,
-                    lapack_int* n, float* t, lapack_int* ldt, float* q,
-                    lapack_int* ldq, float* wr, float* wi, lapack_int* m,
-                    float* s, float* sep, float* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int* liwork, lapack_int *info );
-void LAPACK_dtrsen( char* job, char* compq, const lapack_logical* select,
-                    lapack_int* n, double* t, lapack_int* ldt, double* q,
-                    lapack_int* ldq, double* wr, double* wi, lapack_int* m,
-                    double* s, double* sep, double* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int* liwork, lapack_int *info );
-void LAPACK_ctrsen( char* job, char* compq, const lapack_logical* select,
-                    lapack_int* n, lapack_complex_float* t, lapack_int* ldt,
-                    lapack_complex_float* q, lapack_int* ldq,
-                    lapack_complex_float* w, lapack_int* m, float* s,
-                    float* sep, lapack_complex_float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_ztrsen( char* job, char* compq, const lapack_logical* select,
-                    lapack_int* n, lapack_complex_double* t, lapack_int* ldt,
-                    lapack_complex_double* q, lapack_int* ldq,
-                    lapack_complex_double* w, lapack_int* m, double* s,
-                    double* sep, lapack_complex_double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_strsyl( char* trana, char* tranb, lapack_int* isgn, lapack_int* m,
-                    lapack_int* n, const float* a, lapack_int* lda,
-                    const float* b, lapack_int* ldb, float* c, lapack_int* ldc,
-                    float* scale, lapack_int *info );
-void LAPACK_dtrsyl( char* trana, char* tranb, lapack_int* isgn, lapack_int* m,
-                    lapack_int* n, const double* a, lapack_int* lda,
-                    const double* b, lapack_int* ldb, double* c,
-                    lapack_int* ldc, double* scale, lapack_int *info );
-void LAPACK_ctrsyl( char* trana, char* tranb, lapack_int* isgn, lapack_int* m,
-                    lapack_int* n, const lapack_complex_float* a,
-                    lapack_int* lda, const lapack_complex_float* b,
-                    lapack_int* ldb, lapack_complex_float* c, lapack_int* ldc,
-                    float* scale, lapack_int *info );
-void LAPACK_ztrsyl( char* trana, char* tranb, lapack_int* isgn, lapack_int* m,
-                    lapack_int* n, const lapack_complex_double* a,
-                    lapack_int* lda, const lapack_complex_double* b,
-                    lapack_int* ldb, lapack_complex_double* c, lapack_int* ldc,
-                    double* scale, lapack_int *info );
-void LAPACK_sgghrd( char* compq, char* compz, lapack_int* n, lapack_int* ilo,
-                    lapack_int* ihi, float* a, lapack_int* lda, float* b,
-                    lapack_int* ldb, float* q, lapack_int* ldq, float* z,
-                    lapack_int* ldz, lapack_int *info );
-void LAPACK_dgghrd( char* compq, char* compz, lapack_int* n, lapack_int* ilo,
-                    lapack_int* ihi, double* a, lapack_int* lda, double* b,
-                    lapack_int* ldb, double* q, lapack_int* ldq, double* z,
-                    lapack_int* ldz, lapack_int *info );
-void LAPACK_cgghrd( char* compq, char* compz, lapack_int* n, lapack_int* ilo,
-                    lapack_int* ihi, lapack_complex_float* a, lapack_int* lda,
-                    lapack_complex_float* b, lapack_int* ldb,
-                    lapack_complex_float* q, lapack_int* ldq,
-                    lapack_complex_float* z, lapack_int* ldz,
-                    lapack_int *info );
-void LAPACK_zgghrd( char* compq, char* compz, lapack_int* n, lapack_int* ilo,
-                    lapack_int* ihi, lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* b, lapack_int* ldb,
-                    lapack_complex_double* q, lapack_int* ldq,
-                    lapack_complex_double* z, lapack_int* ldz,
-                    lapack_int *info );
-void LAPACK_sggbal( char* job, lapack_int* n, float* a, lapack_int* lda,
-                    float* b, lapack_int* ldb, lapack_int* ilo, lapack_int* ihi,
-                    float* lscale, float* rscale, float* work,
-                    lapack_int *info );
-void LAPACK_dggbal( char* job, lapack_int* n, double* a, lapack_int* lda,
-                    double* b, lapack_int* ldb, lapack_int* ilo,
-                    lapack_int* ihi, double* lscale, double* rscale,
-                    double* work, lapack_int *info );
-void LAPACK_cggbal( char* job, lapack_int* n, lapack_complex_float* a,
-                    lapack_int* lda, lapack_complex_float* b, lapack_int* ldb,
-                    lapack_int* ilo, lapack_int* ihi, float* lscale,
-                    float* rscale, float* work, lapack_int *info );
-void LAPACK_zggbal( char* job, lapack_int* n, lapack_complex_double* a,
-                    lapack_int* lda, lapack_complex_double* b, lapack_int* ldb,
-                    lapack_int* ilo, lapack_int* ihi, double* lscale,
-                    double* rscale, double* work, lapack_int *info );
-void LAPACK_sggbak( char* job, char* side, lapack_int* n, lapack_int* ilo,
-                    lapack_int* ihi, const float* lscale, const float* rscale,
-                    lapack_int* m, float* v, lapack_int* ldv,
-                    lapack_int *info );
-void LAPACK_dggbak( char* job, char* side, lapack_int* n, lapack_int* ilo,
-                    lapack_int* ihi, const double* lscale, const double* rscale,
-                    lapack_int* m, double* v, lapack_int* ldv,
-                    lapack_int *info );
-void LAPACK_cggbak( char* job, char* side, lapack_int* n, lapack_int* ilo,
-                    lapack_int* ihi, const float* lscale, const float* rscale,
-                    lapack_int* m, lapack_complex_float* v, lapack_int* ldv,
-                    lapack_int *info );
-void LAPACK_zggbak( char* job, char* side, lapack_int* n, lapack_int* ilo,
-                    lapack_int* ihi, const double* lscale, const double* rscale,
-                    lapack_int* m, lapack_complex_double* v, lapack_int* ldv,
-                    lapack_int *info );
-void LAPACK_shgeqz( char* job, char* compq, char* compz, lapack_int* n,
-                    lapack_int* ilo, lapack_int* ihi, float* h, lapack_int* ldh,
-                    float* t, lapack_int* ldt, float* alphar, float* alphai,
-                    float* beta, float* q, lapack_int* ldq, float* z,
-                    lapack_int* ldz, float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_dhgeqz( char* job, char* compq, char* compz, lapack_int* n,
-                    lapack_int* ilo, lapack_int* ihi, double* h,
-                    lapack_int* ldh, double* t, lapack_int* ldt, double* alphar,
-                    double* alphai, double* beta, double* q, lapack_int* ldq,
-                    double* z, lapack_int* ldz, double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_chgeqz( char* job, char* compq, char* compz, lapack_int* n,
-                    lapack_int* ilo, lapack_int* ihi, lapack_complex_float* h,
-                    lapack_int* ldh, lapack_complex_float* t, lapack_int* ldt,
-                    lapack_complex_float* alpha, lapack_complex_float* beta,
-                    lapack_complex_float* q, lapack_int* ldq,
-                    lapack_complex_float* z, lapack_int* ldz,
-                    lapack_complex_float* work, lapack_int* lwork, float* rwork,
-                    lapack_int *info );
-void LAPACK_zhgeqz( char* job, char* compq, char* compz, lapack_int* n,
-                    lapack_int* ilo, lapack_int* ihi, lapack_complex_double* h,
-                    lapack_int* ldh, lapack_complex_double* t, lapack_int* ldt,
-                    lapack_complex_double* alpha, lapack_complex_double* beta,
-                    lapack_complex_double* q, lapack_int* ldq,
-                    lapack_complex_double* z, lapack_int* ldz,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    double* rwork, lapack_int *info );
-void LAPACK_stgevc( char* side, char* howmny, const lapack_logical* select,
-                    lapack_int* n, const float* s, lapack_int* lds,
-                    const float* p, lapack_int* ldp, float* vl,
-                    lapack_int* ldvl, float* vr, lapack_int* ldvr,
-                    lapack_int* mm, lapack_int* m, float* work,
-                    lapack_int *info );
-void LAPACK_dtgevc( char* side, char* howmny, const lapack_logical* select,
-                    lapack_int* n, const double* s, lapack_int* lds,
-                    const double* p, lapack_int* ldp, double* vl,
-                    lapack_int* ldvl, double* vr, lapack_int* ldvr,
-                    lapack_int* mm, lapack_int* m, double* work,
-                    lapack_int *info );
-void LAPACK_ctgevc( char* side, char* howmny, const lapack_logical* select,
-                    lapack_int* n, const lapack_complex_float* s,
-                    lapack_int* lds, const lapack_complex_float* p,
-                    lapack_int* ldp, lapack_complex_float* vl, lapack_int* ldvl,
-                    lapack_complex_float* vr, lapack_int* ldvr, lapack_int* mm,
-                    lapack_int* m, lapack_complex_float* work, float* rwork,
-                    lapack_int *info );
-void LAPACK_ztgevc( char* side, char* howmny, const lapack_logical* select,
-                    lapack_int* n, const lapack_complex_double* s,
-                    lapack_int* lds, const lapack_complex_double* p,
-                    lapack_int* ldp, lapack_complex_double* vl,
-                    lapack_int* ldvl, lapack_complex_double* vr,
-                    lapack_int* ldvr, lapack_int* mm, lapack_int* m,
-                    lapack_complex_double* work, double* rwork,
-                    lapack_int *info );
-void LAPACK_stgexc( lapack_logical* wantq, lapack_logical* wantz, lapack_int* n,
-                    float* a, lapack_int* lda, float* b, lapack_int* ldb,
-                    float* q, lapack_int* ldq, float* z, lapack_int* ldz,
-                    lapack_int* ifst, lapack_int* ilst, float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_dtgexc( lapack_logical* wantq, lapack_logical* wantz, lapack_int* n,
-                    double* a, lapack_int* lda, double* b, lapack_int* ldb,
-                    double* q, lapack_int* ldq, double* z, lapack_int* ldz,
-                    lapack_int* ifst, lapack_int* ilst, double* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_ctgexc( lapack_logical* wantq, lapack_logical* wantz, lapack_int* n,
-                    lapack_complex_float* a, lapack_int* lda,
-                    lapack_complex_float* b, lapack_int* ldb,
-                    lapack_complex_float* q, lapack_int* ldq,
-                    lapack_complex_float* z, lapack_int* ldz, lapack_int* ifst,
-                    lapack_int* ilst, lapack_int *info );
-void LAPACK_ztgexc( lapack_logical* wantq, lapack_logical* wantz, lapack_int* n,
-                    lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* b, lapack_int* ldb,
-                    lapack_complex_double* q, lapack_int* ldq,
-                    lapack_complex_double* z, lapack_int* ldz, lapack_int* ifst,
-                    lapack_int* ilst, lapack_int *info );
-void LAPACK_stgsen( lapack_int* ijob, lapack_logical* wantq,
-                    lapack_logical* wantz, const lapack_logical* select,
-                    lapack_int* n, float* a, lapack_int* lda, float* b,
-                    lapack_int* ldb, float* alphar, float* alphai, float* beta,
-                    float* q, lapack_int* ldq, float* z, lapack_int* ldz,
-                    lapack_int* m, float* pl, float* pr, float* dif,
-                    float* work, lapack_int* lwork, lapack_int* iwork,
-                    lapack_int* liwork, lapack_int *info );
-void LAPACK_dtgsen( lapack_int* ijob, lapack_logical* wantq,
-                    lapack_logical* wantz, const lapack_logical* select,
-                    lapack_int* n, double* a, lapack_int* lda, double* b,
-                    lapack_int* ldb, double* alphar, double* alphai,
-                    double* beta, double* q, lapack_int* ldq, double* z,
-                    lapack_int* ldz, lapack_int* m, double* pl, double* pr,
-                    double* dif, double* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int* liwork, lapack_int *info );
-void LAPACK_ctgsen( lapack_int* ijob, lapack_logical* wantq,
-                    lapack_logical* wantz, const lapack_logical* select,
-                    lapack_int* n, lapack_complex_float* a, lapack_int* lda,
-                    lapack_complex_float* b, lapack_int* ldb,
-                    lapack_complex_float* alpha, lapack_complex_float* beta,
-                    lapack_complex_float* q, lapack_int* ldq,
-                    lapack_complex_float* z, lapack_int* ldz, lapack_int* m,
-                    float* pl, float* pr, float* dif,
-                    lapack_complex_float* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int* liwork, lapack_int *info );
-void LAPACK_ztgsen( lapack_int* ijob, lapack_logical* wantq,
-                    lapack_logical* wantz, const lapack_logical* select,
-                    lapack_int* n, lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* b, lapack_int* ldb,
-                    lapack_complex_double* alpha, lapack_complex_double* beta,
-                    lapack_complex_double* q, lapack_int* ldq,
-                    lapack_complex_double* z, lapack_int* ldz, lapack_int* m,
-                    double* pl, double* pr, double* dif,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int* liwork, lapack_int *info );
-void LAPACK_stgsyl( char* trans, lapack_int* ijob, lapack_int* m, lapack_int* n,
-                    const float* a, lapack_int* lda, const float* b,
-                    lapack_int* ldb, float* c, lapack_int* ldc, const float* d,
-                    lapack_int* ldd, const float* e, lapack_int* lde, float* f,
-                    lapack_int* ldf, float* scale, float* dif, float* work,
-                    lapack_int* lwork, lapack_int* iwork, lapack_int *info );
-void LAPACK_dtgsyl( char* trans, lapack_int* ijob, lapack_int* m, lapack_int* n,
-                    const double* a, lapack_int* lda, const double* b,
-                    lapack_int* ldb, double* c, lapack_int* ldc,
-                    const double* d, lapack_int* ldd, const double* e,
-                    lapack_int* lde, double* f, lapack_int* ldf, double* scale,
-                    double* dif, double* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int *info );
-void LAPACK_ctgsyl( char* trans, lapack_int* ijob, lapack_int* m, lapack_int* n,
-                    const lapack_complex_float* a, lapack_int* lda,
-                    const lapack_complex_float* b, lapack_int* ldb,
-                    lapack_complex_float* c, lapack_int* ldc,
-                    const lapack_complex_float* d, lapack_int* ldd,
-                    const lapack_complex_float* e, lapack_int* lde,
-                    lapack_complex_float* f, lapack_int* ldf, float* scale,
-                    float* dif, lapack_complex_float* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int *info );
-void LAPACK_ztgsyl( char* trans, lapack_int* ijob, lapack_int* m, lapack_int* n,
-                    const lapack_complex_double* a, lapack_int* lda,
-                    const lapack_complex_double* b, lapack_int* ldb,
-                    lapack_complex_double* c, lapack_int* ldc,
-                    const lapack_complex_double* d, lapack_int* ldd,
-                    const lapack_complex_double* e, lapack_int* lde,
-                    lapack_complex_double* f, lapack_int* ldf, double* scale,
-                    double* dif, lapack_complex_double* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int *info );
-void LAPACK_stgsna( char* job, char* howmny, const lapack_logical* select,
-                    lapack_int* n, const float* a, lapack_int* lda,
-                    const float* b, lapack_int* ldb, const float* vl,
-                    lapack_int* ldvl, const float* vr, lapack_int* ldvr,
-                    float* s, float* dif, lapack_int* mm, lapack_int* m,
-                    float* work, lapack_int* lwork, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_dtgsna( char* job, char* howmny, const lapack_logical* select,
-                    lapack_int* n, const double* a, lapack_int* lda,
-                    const double* b, lapack_int* ldb, const double* vl,
-                    lapack_int* ldvl, const double* vr, lapack_int* ldvr,
-                    double* s, double* dif, lapack_int* mm, lapack_int* m,
-                    double* work, lapack_int* lwork, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_ctgsna( char* job, char* howmny, const lapack_logical* select,
-                    lapack_int* n, const lapack_complex_float* a,
-                    lapack_int* lda, const lapack_complex_float* b,
-                    lapack_int* ldb, const lapack_complex_float* vl,
-                    lapack_int* ldvl, const lapack_complex_float* vr,
-                    lapack_int* ldvr, float* s, float* dif, lapack_int* mm,
-                    lapack_int* m, lapack_complex_float* work,
-                    lapack_int* lwork, lapack_int* iwork, lapack_int *info );
-void LAPACK_ztgsna( char* job, char* howmny, const lapack_logical* select,
-                    lapack_int* n, const lapack_complex_double* a,
-                    lapack_int* lda, const lapack_complex_double* b,
-                    lapack_int* ldb, const lapack_complex_double* vl,
-                    lapack_int* ldvl, const lapack_complex_double* vr,
-                    lapack_int* ldvr, double* s, double* dif, lapack_int* mm,
-                    lapack_int* m, lapack_complex_double* work,
-                    lapack_int* lwork, lapack_int* iwork, lapack_int *info );
-void LAPACK_sggsvp( char* jobu, char* jobv, char* jobq, lapack_int* m,
-                    lapack_int* p, lapack_int* n, float* a, lapack_int* lda,
-                    float* b, lapack_int* ldb, float* tola, float* tolb,
-                    lapack_int* k, lapack_int* l, float* u, lapack_int* ldu,
-                    float* v, lapack_int* ldv, float* q, lapack_int* ldq,
-                    lapack_int* iwork, float* tau, float* work,
-                    lapack_int *info );
-void LAPACK_dggsvp( char* jobu, char* jobv, char* jobq, lapack_int* m,
-                    lapack_int* p, lapack_int* n, double* a, lapack_int* lda,
-                    double* b, lapack_int* ldb, double* tola, double* tolb,
-                    lapack_int* k, lapack_int* l, double* u, lapack_int* ldu,
-                    double* v, lapack_int* ldv, double* q, lapack_int* ldq,
-                    lapack_int* iwork, double* tau, double* work,
-                    lapack_int *info );
-void LAPACK_cggsvp( char* jobu, char* jobv, char* jobq, lapack_int* m,
-                    lapack_int* p, lapack_int* n, lapack_complex_float* a,
-                    lapack_int* lda, lapack_complex_float* b, lapack_int* ldb,
-                    float* tola, float* tolb, lapack_int* k, lapack_int* l,
-                    lapack_complex_float* u, lapack_int* ldu,
-                    lapack_complex_float* v, lapack_int* ldv,
-                    lapack_complex_float* q, lapack_int* ldq, lapack_int* iwork,
-                    float* rwork, lapack_complex_float* tau,
-                    lapack_complex_float* work, lapack_int *info );
-void LAPACK_zggsvp( char* jobu, char* jobv, char* jobq, lapack_int* m,
-                    lapack_int* p, lapack_int* n, lapack_complex_double* a,
-                    lapack_int* lda, lapack_complex_double* b, lapack_int* ldb,
-                    double* tola, double* tolb, lapack_int* k, lapack_int* l,
-                    lapack_complex_double* u, lapack_int* ldu,
-                    lapack_complex_double* v, lapack_int* ldv,
-                    lapack_complex_double* q, lapack_int* ldq,
-                    lapack_int* iwork, double* rwork,
-                    lapack_complex_double* tau, lapack_complex_double* work,
-                    lapack_int *info );
-void LAPACK_stgsja( char* jobu, char* jobv, char* jobq, lapack_int* m,
-                    lapack_int* p, lapack_int* n, lapack_int* k, lapack_int* l,
-                    float* a, lapack_int* lda, float* b, lapack_int* ldb,
-                    float* tola, float* tolb, float* alpha, float* beta,
-                    float* u, lapack_int* ldu, float* v, lapack_int* ldv,
-                    float* q, lapack_int* ldq, float* work, lapack_int* ncycle,
-                    lapack_int *info );
-void LAPACK_dtgsja( char* jobu, char* jobv, char* jobq, lapack_int* m,
-                    lapack_int* p, lapack_int* n, lapack_int* k, lapack_int* l,
-                    double* a, lapack_int* lda, double* b, lapack_int* ldb,
-                    double* tola, double* tolb, double* alpha, double* beta,
-                    double* u, lapack_int* ldu, double* v, lapack_int* ldv,
-                    double* q, lapack_int* ldq, double* work,
-                    lapack_int* ncycle, lapack_int *info );
-void LAPACK_ctgsja( char* jobu, char* jobv, char* jobq, lapack_int* m,
-                    lapack_int* p, lapack_int* n, lapack_int* k, lapack_int* l,
-                    lapack_complex_float* a, lapack_int* lda,
-                    lapack_complex_float* b, lapack_int* ldb, float* tola,
-                    float* tolb, float* alpha, float* beta,
-                    lapack_complex_float* u, lapack_int* ldu,
-                    lapack_complex_float* v, lapack_int* ldv,
-                    lapack_complex_float* q, lapack_int* ldq,
-                    lapack_complex_float* work, lapack_int* ncycle,
-                    lapack_int *info );
-void LAPACK_ztgsja( char* jobu, char* jobv, char* jobq, lapack_int* m,
-                    lapack_int* p, lapack_int* n, lapack_int* k, lapack_int* l,
-                    lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* b, lapack_int* ldb, double* tola,
-                    double* tolb, double* alpha, double* beta,
-                    lapack_complex_double* u, lapack_int* ldu,
-                    lapack_complex_double* v, lapack_int* ldv,
-                    lapack_complex_double* q, lapack_int* ldq,
-                    lapack_complex_double* work, lapack_int* ncycle,
-                    lapack_int *info );
-void LAPACK_sgels( char* trans, lapack_int* m, lapack_int* n, lapack_int* nrhs,
-                   float* a, lapack_int* lda, float* b, lapack_int* ldb,
-                   float* work, lapack_int* lwork, lapack_int *info );
-void LAPACK_dgels( char* trans, lapack_int* m, lapack_int* n, lapack_int* nrhs,
-                   double* a, lapack_int* lda, double* b, lapack_int* ldb,
-                   double* work, lapack_int* lwork, lapack_int *info );
-void LAPACK_cgels( char* trans, lapack_int* m, lapack_int* n, lapack_int* nrhs,
-                   lapack_complex_float* a, lapack_int* lda,
-                   lapack_complex_float* b, lapack_int* ldb,
-                   lapack_complex_float* work, lapack_int* lwork,
-                   lapack_int *info );
-void LAPACK_zgels( char* trans, lapack_int* m, lapack_int* n, lapack_int* nrhs,
-                   lapack_complex_double* a, lapack_int* lda,
-                   lapack_complex_double* b, lapack_int* ldb,
-                   lapack_complex_double* work, lapack_int* lwork,
-                   lapack_int *info );
-void LAPACK_sgelsy( lapack_int* m, lapack_int* n, lapack_int* nrhs, float* a,
-                    lapack_int* lda, float* b, lapack_int* ldb,
-                    lapack_int* jpvt, float* rcond, lapack_int* rank,
-                    float* work, lapack_int* lwork, lapack_int *info );
-void LAPACK_dgelsy( lapack_int* m, lapack_int* n, lapack_int* nrhs, double* a,
-                    lapack_int* lda, double* b, lapack_int* ldb,
-                    lapack_int* jpvt, double* rcond, lapack_int* rank,
-                    double* work, lapack_int* lwork, lapack_int *info );
-void LAPACK_cgelsy( lapack_int* m, lapack_int* n, lapack_int* nrhs,
-                    lapack_complex_float* a, lapack_int* lda,
-                    lapack_complex_float* b, lapack_int* ldb, lapack_int* jpvt,
-                    float* rcond, lapack_int* rank, lapack_complex_float* work,
-                    lapack_int* lwork, float* rwork, lapack_int *info );
-void LAPACK_zgelsy( lapack_int* m, lapack_int* n, lapack_int* nrhs,
-                    lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* b, lapack_int* ldb, lapack_int* jpvt,
-                    double* rcond, lapack_int* rank,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    double* rwork, lapack_int *info );
-void LAPACK_sgelss( lapack_int* m, lapack_int* n, lapack_int* nrhs, float* a,
-                    lapack_int* lda, float* b, lapack_int* ldb, float* s,
-                    float* rcond, lapack_int* rank, float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_dgelss( lapack_int* m, lapack_int* n, lapack_int* nrhs, double* a,
-                    lapack_int* lda, double* b, lapack_int* ldb, double* s,
-                    double* rcond, lapack_int* rank, double* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_cgelss( lapack_int* m, lapack_int* n, lapack_int* nrhs,
-                    lapack_complex_float* a, lapack_int* lda,
-                    lapack_complex_float* b, lapack_int* ldb, float* s,
-                    float* rcond, lapack_int* rank, lapack_complex_float* work,
-                    lapack_int* lwork, float* rwork, lapack_int *info );
-void LAPACK_zgelss( lapack_int* m, lapack_int* n, lapack_int* nrhs,
-                    lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* b, lapack_int* ldb, double* s,
-                    double* rcond, lapack_int* rank,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    double* rwork, lapack_int *info );
-void LAPACK_sgelsd( lapack_int* m, lapack_int* n, lapack_int* nrhs, float* a,
-                    lapack_int* lda, float* b, lapack_int* ldb, float* s,
-                    float* rcond, lapack_int* rank, float* work,
-                    lapack_int* lwork, lapack_int* iwork, lapack_int *info );
-void LAPACK_dgelsd( lapack_int* m, lapack_int* n, lapack_int* nrhs, double* a,
-                    lapack_int* lda, double* b, lapack_int* ldb, double* s,
-                    double* rcond, lapack_int* rank, double* work,
-                    lapack_int* lwork, lapack_int* iwork, lapack_int *info );
-void LAPACK_cgelsd( lapack_int* m, lapack_int* n, lapack_int* nrhs,
-                    lapack_complex_float* a, lapack_int* lda,
-                    lapack_complex_float* b, lapack_int* ldb, float* s,
-                    float* rcond, lapack_int* rank, lapack_complex_float* work,
-                    lapack_int* lwork, float* rwork, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_zgelsd( lapack_int* m, lapack_int* n, lapack_int* nrhs,
-                    lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* b, lapack_int* ldb, double* s,
-                    double* rcond, lapack_int* rank,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    double* rwork, lapack_int* iwork, lapack_int *info );
-void LAPACK_sgglse( lapack_int* m, lapack_int* n, lapack_int* p, float* a,
-                    lapack_int* lda, float* b, lapack_int* ldb, float* c,
-                    float* d, float* x, float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_dgglse( lapack_int* m, lapack_int* n, lapack_int* p, double* a,
-                    lapack_int* lda, double* b, lapack_int* ldb, double* c,
-                    double* d, double* x, double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_cgglse( lapack_int* m, lapack_int* n, lapack_int* p,
-                    lapack_complex_float* a, lapack_int* lda,
-                    lapack_complex_float* b, lapack_int* ldb,
-                    lapack_complex_float* c, lapack_complex_float* d,
-                    lapack_complex_float* x, lapack_complex_float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_zgglse( lapack_int* m, lapack_int* n, lapack_int* p,
-                    lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* b, lapack_int* ldb,
-                    lapack_complex_double* c, lapack_complex_double* d,
-                    lapack_complex_double* x, lapack_complex_double* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_sggglm( lapack_int* n, lapack_int* m, lapack_int* p, float* a,
-                    lapack_int* lda, float* b, lapack_int* ldb, float* d,
-                    float* x, float* y, float* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_dggglm( lapack_int* n, lapack_int* m, lapack_int* p, double* a,
-                    lapack_int* lda, double* b, lapack_int* ldb, double* d,
-                    double* x, double* y, double* work, lapack_int* lwork,
-                    lapack_int *info );
-void LAPACK_cggglm( lapack_int* n, lapack_int* m, lapack_int* p,
-                    lapack_complex_float* a, lapack_int* lda,
-                    lapack_complex_float* b, lapack_int* ldb,
-                    lapack_complex_float* d, lapack_complex_float* x,
-                    lapack_complex_float* y, lapack_complex_float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_zggglm( lapack_int* n, lapack_int* m, lapack_int* p,
-                    lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* b, lapack_int* ldb,
-                    lapack_complex_double* d, lapack_complex_double* x,
-                    lapack_complex_double* y, lapack_complex_double* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_ssyev( char* jobz, char* uplo, lapack_int* n, float* a,
-                   lapack_int* lda, float* w, float* work, lapack_int* lwork,
-                   lapack_int *info );
-void LAPACK_dsyev( char* jobz, char* uplo, lapack_int* n, double* a,
-                   lapack_int* lda, double* w, double* work, lapack_int* lwork,
-                   lapack_int *info );
-void LAPACK_cheev( char* jobz, char* uplo, lapack_int* n,
-                   lapack_complex_float* a, lapack_int* lda, float* w,
-                   lapack_complex_float* work, lapack_int* lwork, float* rwork,
-                   lapack_int *info );
-void LAPACK_zheev( char* jobz, char* uplo, lapack_int* n,
-                   lapack_complex_double* a, lapack_int* lda, double* w,
-                   lapack_complex_double* work, lapack_int* lwork,
-                   double* rwork, lapack_int *info );
-void LAPACK_ssyevd( char* jobz, char* uplo, lapack_int* n, float* a,
-                    lapack_int* lda, float* w, float* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int* liwork, lapack_int *info );
-void LAPACK_dsyevd( char* jobz, char* uplo, lapack_int* n, double* a,
-                    lapack_int* lda, double* w, double* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int* liwork, lapack_int *info );
-void LAPACK_cheevd( char* jobz, char* uplo, lapack_int* n,
-                    lapack_complex_float* a, lapack_int* lda, float* w,
-                    lapack_complex_float* work, lapack_int* lwork, float* rwork,
-                    lapack_int* lrwork, lapack_int* iwork, lapack_int* liwork,
-                    lapack_int *info );
-void LAPACK_zheevd( char* jobz, char* uplo, lapack_int* n,
-                    lapack_complex_double* a, lapack_int* lda, double* w,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    double* rwork, lapack_int* lrwork, lapack_int* iwork,
-                    lapack_int* liwork, lapack_int *info );
-void LAPACK_ssyevx( char* jobz, char* range, char* uplo, lapack_int* n,
-                    float* a, lapack_int* lda, float* vl, float* vu,
-                    lapack_int* il, lapack_int* iu, float* abstol,
-                    lapack_int* m, float* w, float* z, lapack_int* ldz,
-                    float* work, lapack_int* lwork, lapack_int* iwork,
-                    lapack_int* ifail, lapack_int *info );
-void LAPACK_dsyevx( char* jobz, char* range, char* uplo, lapack_int* n,
-                    double* a, lapack_int* lda, double* vl, double* vu,
-                    lapack_int* il, lapack_int* iu, double* abstol,
-                    lapack_int* m, double* w, double* z, lapack_int* ldz,
-                    double* work, lapack_int* lwork, lapack_int* iwork,
-                    lapack_int* ifail, lapack_int *info );
-void LAPACK_cheevx( char* jobz, char* range, char* uplo, lapack_int* n,
-                    lapack_complex_float* a, lapack_int* lda, float* vl,
-                    float* vu, lapack_int* il, lapack_int* iu, float* abstol,
-                    lapack_int* m, float* w, lapack_complex_float* z,
-                    lapack_int* ldz, lapack_complex_float* work,
-                    lapack_int* lwork, float* rwork, lapack_int* iwork,
-                    lapack_int* ifail, lapack_int *info );
-void LAPACK_zheevx( char* jobz, char* range, char* uplo, lapack_int* n,
-                    lapack_complex_double* a, lapack_int* lda, double* vl,
-                    double* vu, lapack_int* il, lapack_int* iu, double* abstol,
-                    lapack_int* m, double* w, lapack_complex_double* z,
-                    lapack_int* ldz, lapack_complex_double* work,
-                    lapack_int* lwork, double* rwork, lapack_int* iwork,
-                    lapack_int* ifail, lapack_int *info );
-void LAPACK_ssyevr( char* jobz, char* range, char* uplo, lapack_int* n,
-                    float* a, lapack_int* lda, float* vl, float* vu,
-                    lapack_int* il, lapack_int* iu, float* abstol,
-                    lapack_int* m, float* w, float* z, lapack_int* ldz,
-                    lapack_int* isuppz, float* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int* liwork, lapack_int *info );
-void LAPACK_dsyevr( char* jobz, char* range, char* uplo, lapack_int* n,
-                    double* a, lapack_int* lda, double* vl, double* vu,
-                    lapack_int* il, lapack_int* iu, double* abstol,
-                    lapack_int* m, double* w, double* z, lapack_int* ldz,
-                    lapack_int* isuppz, double* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int* liwork, lapack_int *info );
-void LAPACK_cheevr( char* jobz, char* range, char* uplo, lapack_int* n,
-                    lapack_complex_float* a, lapack_int* lda, float* vl,
-                    float* vu, lapack_int* il, lapack_int* iu, float* abstol,
-                    lapack_int* m, float* w, lapack_complex_float* z,
-                    lapack_int* ldz, lapack_int* isuppz,
-                    lapack_complex_float* work, lapack_int* lwork, float* rwork,
-                    lapack_int* lrwork, lapack_int* iwork, lapack_int* liwork,
-                    lapack_int *info );
-void LAPACK_zheevr( char* jobz, char* range, char* uplo, lapack_int* n,
-                    lapack_complex_double* a, lapack_int* lda, double* vl,
-                    double* vu, lapack_int* il, lapack_int* iu, double* abstol,
-                    lapack_int* m, double* w, lapack_complex_double* z,
-                    lapack_int* ldz, lapack_int* isuppz,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    double* rwork, lapack_int* lrwork, lapack_int* iwork,
-                    lapack_int* liwork, lapack_int *info );
-void LAPACK_sspev( char* jobz, char* uplo, lapack_int* n, float* ap, float* w,
-                   float* z, lapack_int* ldz, float* work, lapack_int *info );
-void LAPACK_dspev( char* jobz, char* uplo, lapack_int* n, double* ap, double* w,
-                   double* z, lapack_int* ldz, double* work, lapack_int *info );
-void LAPACK_chpev( char* jobz, char* uplo, lapack_int* n,
-                   lapack_complex_float* ap, float* w, lapack_complex_float* z,
-                   lapack_int* ldz, lapack_complex_float* work, float* rwork,
-                   lapack_int *info );
-void LAPACK_zhpev( char* jobz, char* uplo, lapack_int* n,
-                   lapack_complex_double* ap, double* w,
-                   lapack_complex_double* z, lapack_int* ldz,
-                   lapack_complex_double* work, double* rwork,
-                   lapack_int *info );
-void LAPACK_sspevd( char* jobz, char* uplo, lapack_int* n, float* ap, float* w,
-                    float* z, lapack_int* ldz, float* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int* liwork, lapack_int *info );
-void LAPACK_dspevd( char* jobz, char* uplo, lapack_int* n, double* ap,
-                    double* w, double* z, lapack_int* ldz, double* work,
-                    lapack_int* lwork, lapack_int* iwork, lapack_int* liwork,
-                    lapack_int *info );
-void LAPACK_chpevd( char* jobz, char* uplo, lapack_int* n,
-                    lapack_complex_float* ap, float* w, lapack_complex_float* z,
-                    lapack_int* ldz, lapack_complex_float* work,
-                    lapack_int* lwork, float* rwork, lapack_int* lrwork,
-                    lapack_int* iwork, lapack_int* liwork, lapack_int *info );
-void LAPACK_zhpevd( char* jobz, char* uplo, lapack_int* n,
-                    lapack_complex_double* ap, double* w,
-                    lapack_complex_double* z, lapack_int* ldz,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    double* rwork, lapack_int* lrwork, lapack_int* iwork,
-                    lapack_int* liwork, lapack_int *info );
-void LAPACK_sspevx( char* jobz, char* range, char* uplo, lapack_int* n,
-                    float* ap, float* vl, float* vu, lapack_int* il,
-                    lapack_int* iu, float* abstol, lapack_int* m, float* w,
-                    float* z, lapack_int* ldz, float* work, lapack_int* iwork,
-                    lapack_int* ifail, lapack_int *info );
-void LAPACK_dspevx( char* jobz, char* range, char* uplo, lapack_int* n,
-                    double* ap, double* vl, double* vu, lapack_int* il,
-                    lapack_int* iu, double* abstol, lapack_int* m, double* w,
-                    double* z, lapack_int* ldz, double* work, lapack_int* iwork,
-                    lapack_int* ifail, lapack_int *info );
-void LAPACK_chpevx( char* jobz, char* range, char* uplo, lapack_int* n,
-                    lapack_complex_float* ap, float* vl, float* vu,
-                    lapack_int* il, lapack_int* iu, float* abstol,
-                    lapack_int* m, float* w, lapack_complex_float* z,
-                    lapack_int* ldz, lapack_complex_float* work, float* rwork,
-                    lapack_int* iwork, lapack_int* ifail, lapack_int *info );
-void LAPACK_zhpevx( char* jobz, char* range, char* uplo, lapack_int* n,
-                    lapack_complex_double* ap, double* vl, double* vu,
-                    lapack_int* il, lapack_int* iu, double* abstol,
-                    lapack_int* m, double* w, lapack_complex_double* z,
-                    lapack_int* ldz, lapack_complex_double* work, double* rwork,
-                    lapack_int* iwork, lapack_int* ifail, lapack_int *info );
-void LAPACK_ssbev( char* jobz, char* uplo, lapack_int* n, lapack_int* kd,
-                   float* ab, lapack_int* ldab, float* w, float* z,
-                   lapack_int* ldz, float* work, lapack_int *info );
-void LAPACK_dsbev( char* jobz, char* uplo, lapack_int* n, lapack_int* kd,
-                   double* ab, lapack_int* ldab, double* w, double* z,
-                   lapack_int* ldz, double* work, lapack_int *info );
-void LAPACK_chbev( char* jobz, char* uplo, lapack_int* n, lapack_int* kd,
-                   lapack_complex_float* ab, lapack_int* ldab, float* w,
-                   lapack_complex_float* z, lapack_int* ldz,
-                   lapack_complex_float* work, float* rwork, lapack_int *info );
-void LAPACK_zhbev( char* jobz, char* uplo, lapack_int* n, lapack_int* kd,
-                   lapack_complex_double* ab, lapack_int* ldab, double* w,
-                   lapack_complex_double* z, lapack_int* ldz,
-                   lapack_complex_double* work, double* rwork,
-                   lapack_int *info );
-void LAPACK_ssbevd( char* jobz, char* uplo, lapack_int* n, lapack_int* kd,
-                    float* ab, lapack_int* ldab, float* w, float* z,
-                    lapack_int* ldz, float* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int* liwork, lapack_int *info );
-void LAPACK_dsbevd( char* jobz, char* uplo, lapack_int* n, lapack_int* kd,
-                    double* ab, lapack_int* ldab, double* w, double* z,
-                    lapack_int* ldz, double* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int* liwork, lapack_int *info );
-void LAPACK_chbevd( char* jobz, char* uplo, lapack_int* n, lapack_int* kd,
-                    lapack_complex_float* ab, lapack_int* ldab, float* w,
-                    lapack_complex_float* z, lapack_int* ldz,
-                    lapack_complex_float* work, lapack_int* lwork, float* rwork,
-                    lapack_int* lrwork, lapack_int* iwork, lapack_int* liwork,
-                    lapack_int *info );
-void LAPACK_zhbevd( char* jobz, char* uplo, lapack_int* n, lapack_int* kd,
-                    lapack_complex_double* ab, lapack_int* ldab, double* w,
-                    lapack_complex_double* z, lapack_int* ldz,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    double* rwork, lapack_int* lrwork, lapack_int* iwork,
-                    lapack_int* liwork, lapack_int *info );
-void LAPACK_ssbevx( char* jobz, char* range, char* uplo, lapack_int* n,
-                    lapack_int* kd, float* ab, lapack_int* ldab, float* q,
-                    lapack_int* ldq, float* vl, float* vu, lapack_int* il,
-                    lapack_int* iu, float* abstol, lapack_int* m, float* w,
-                    float* z, lapack_int* ldz, float* work, lapack_int* iwork,
-                    lapack_int* ifail, lapack_int *info );
-void LAPACK_dsbevx( char* jobz, char* range, char* uplo, lapack_int* n,
-                    lapack_int* kd, double* ab, lapack_int* ldab, double* q,
-                    lapack_int* ldq, double* vl, double* vu, lapack_int* il,
-                    lapack_int* iu, double* abstol, lapack_int* m, double* w,
-                    double* z, lapack_int* ldz, double* work, lapack_int* iwork,
-                    lapack_int* ifail, lapack_int *info );
-void LAPACK_chbevx( char* jobz, char* range, char* uplo, lapack_int* n,
-                    lapack_int* kd, lapack_complex_float* ab, lapack_int* ldab,
-                    lapack_complex_float* q, lapack_int* ldq, float* vl,
-                    float* vu, lapack_int* il, lapack_int* iu, float* abstol,
-                    lapack_int* m, float* w, lapack_complex_float* z,
-                    lapack_int* ldz, lapack_complex_float* work, float* rwork,
-                    lapack_int* iwork, lapack_int* ifail, lapack_int *info );
-void LAPACK_zhbevx( char* jobz, char* range, char* uplo, lapack_int* n,
-                    lapack_int* kd, lapack_complex_double* ab, lapack_int* ldab,
-                    lapack_complex_double* q, lapack_int* ldq, double* vl,
-                    double* vu, lapack_int* il, lapack_int* iu, double* abstol,
-                    lapack_int* m, double* w, lapack_complex_double* z,
-                    lapack_int* ldz, lapack_complex_double* work, double* rwork,
-                    lapack_int* iwork, lapack_int* ifail, lapack_int *info );
-void LAPACK_sstev( char* jobz, lapack_int* n, float* d, float* e, float* z,
-                   lapack_int* ldz, float* work, lapack_int *info );
-void LAPACK_dstev( char* jobz, lapack_int* n, double* d, double* e, double* z,
-                   lapack_int* ldz, double* work, lapack_int *info );
-void LAPACK_sstevd( char* jobz, lapack_int* n, float* d, float* e, float* z,
-                    lapack_int* ldz, float* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int* liwork, lapack_int *info );
-void LAPACK_dstevd( char* jobz, lapack_int* n, double* d, double* e, double* z,
-                    lapack_int* ldz, double* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int* liwork, lapack_int *info );
-void LAPACK_sstevx( char* jobz, char* range, lapack_int* n, float* d, float* e,
-                    float* vl, float* vu, lapack_int* il, lapack_int* iu,
-                    float* abstol, lapack_int* m, float* w, float* z,
-                    lapack_int* ldz, float* work, lapack_int* iwork,
-                    lapack_int* ifail, lapack_int *info );
-void LAPACK_dstevx( char* jobz, char* range, lapack_int* n, double* d,
-                    double* e, double* vl, double* vu, lapack_int* il,
-                    lapack_int* iu, double* abstol, lapack_int* m, double* w,
-                    double* z, lapack_int* ldz, double* work, lapack_int* iwork,
-                    lapack_int* ifail, lapack_int *info );
-void LAPACK_sstevr( char* jobz, char* range, lapack_int* n, float* d, float* e,
-                    float* vl, float* vu, lapack_int* il, lapack_int* iu,
-                    float* abstol, lapack_int* m, float* w, float* z,
-                    lapack_int* ldz, lapack_int* isuppz, float* work,
-                    lapack_int* lwork, lapack_int* iwork, lapack_int* liwork,
-                    lapack_int *info );
-void LAPACK_dstevr( char* jobz, char* range, lapack_int* n, double* d,
-                    double* e, double* vl, double* vu, lapack_int* il,
-                    lapack_int* iu, double* abstol, lapack_int* m, double* w,
-                    double* z, lapack_int* ldz, lapack_int* isuppz,
-                    double* work, lapack_int* lwork, lapack_int* iwork,
-                    lapack_int* liwork, lapack_int *info );
-void LAPACK_sgees( char* jobvs, char* sort, LAPACK_S_SELECT2 select,
-                   lapack_int* n, float* a, lapack_int* lda, lapack_int* sdim,
-                   float* wr, float* wi, float* vs, lapack_int* ldvs,
-                   float* work, lapack_int* lwork, lapack_logical* bwork,
-                   lapack_int *info );
-void LAPACK_dgees( char* jobvs, char* sort, LAPACK_D_SELECT2 select,
-                   lapack_int* n, double* a, lapack_int* lda, lapack_int* sdim,
-                   double* wr, double* wi, double* vs, lapack_int* ldvs,
-                   double* work, lapack_int* lwork, lapack_logical* bwork,
-                   lapack_int *info );
-void LAPACK_cgees( char* jobvs, char* sort, LAPACK_C_SELECT1 select,
-                   lapack_int* n, lapack_complex_float* a, lapack_int* lda,
-                   lapack_int* sdim, lapack_complex_float* w,
-                   lapack_complex_float* vs, lapack_int* ldvs,
-                   lapack_complex_float* work, lapack_int* lwork, float* rwork,
-                   lapack_logical* bwork, lapack_int *info );
-void LAPACK_zgees( char* jobvs, char* sort, LAPACK_Z_SELECT1 select,
-                   lapack_int* n, lapack_complex_double* a, lapack_int* lda,
-                   lapack_int* sdim, lapack_complex_double* w,
-                   lapack_complex_double* vs, lapack_int* ldvs,
-                   lapack_complex_double* work, lapack_int* lwork,
-                   double* rwork, lapack_logical* bwork, lapack_int *info );
-void LAPACK_sgeesx( char* jobvs, char* sort, LAPACK_S_SELECT2 select,
-                    char* sense, lapack_int* n, float* a, lapack_int* lda,
-                    lapack_int* sdim, float* wr, float* wi, float* vs,
-                    lapack_int* ldvs, float* rconde, float* rcondv, float* work,
-                    lapack_int* lwork, lapack_int* iwork, lapack_int* liwork,
-                    lapack_logical* bwork, lapack_int *info );
-void LAPACK_dgeesx( char* jobvs, char* sort, LAPACK_D_SELECT2 select,
-                    char* sense, lapack_int* n, double* a, lapack_int* lda,
-                    lapack_int* sdim, double* wr, double* wi, double* vs,
-                    lapack_int* ldvs, double* rconde, double* rcondv,
-                    double* work, lapack_int* lwork, lapack_int* iwork,
-                    lapack_int* liwork, lapack_logical* bwork,
-                    lapack_int *info );
-void LAPACK_cgeesx( char* jobvs, char* sort, LAPACK_C_SELECT1 select,
-                    char* sense, lapack_int* n, lapack_complex_float* a,
-                    lapack_int* lda, lapack_int* sdim, lapack_complex_float* w,
-                    lapack_complex_float* vs, lapack_int* ldvs, float* rconde,
-                    float* rcondv, lapack_complex_float* work,
-                    lapack_int* lwork, float* rwork, lapack_logical* bwork,
-                    lapack_int *info );
-void LAPACK_zgeesx( char* jobvs, char* sort, LAPACK_Z_SELECT1 select,
-                    char* sense, lapack_int* n, lapack_complex_double* a,
-                    lapack_int* lda, lapack_int* sdim, lapack_complex_double* w,
-                    lapack_complex_double* vs, lapack_int* ldvs, double* rconde,
-                    double* rcondv, lapack_complex_double* work,
-                    lapack_int* lwork, double* rwork, lapack_logical* bwork,
-                    lapack_int *info );
-void LAPACK_sgeev( char* jobvl, char* jobvr, lapack_int* n, float* a,
-                   lapack_int* lda, float* wr, float* wi, float* vl,
-                   lapack_int* ldvl, float* vr, lapack_int* ldvr, float* work,
-                   lapack_int* lwork, lapack_int *info );
-void LAPACK_dgeev( char* jobvl, char* jobvr, lapack_int* n, double* a,
-                   lapack_int* lda, double* wr, double* wi, double* vl,
-                   lapack_int* ldvl, double* vr, lapack_int* ldvr, double* work,
-                   lapack_int* lwork, lapack_int *info );
-void LAPACK_cgeev( char* jobvl, char* jobvr, lapack_int* n,
-                   lapack_complex_float* a, lapack_int* lda,
-                   lapack_complex_float* w, lapack_complex_float* vl,
-                   lapack_int* ldvl, lapack_complex_float* vr, lapack_int* ldvr,
-                   lapack_complex_float* work, lapack_int* lwork, float* rwork,
-                   lapack_int *info );
-void LAPACK_zgeev( char* jobvl, char* jobvr, lapack_int* n,
-                   lapack_complex_double* a, lapack_int* lda,
-                   lapack_complex_double* w, lapack_complex_double* vl,
-                   lapack_int* ldvl, lapack_complex_double* vr,
-                   lapack_int* ldvr, lapack_complex_double* work,
-                   lapack_int* lwork, double* rwork, lapack_int *info );
-void LAPACK_sgeevx( char* balanc, char* jobvl, char* jobvr, char* sense,
-                    lapack_int* n, float* a, lapack_int* lda, float* wr,
-                    float* wi, float* vl, lapack_int* ldvl, float* vr,
-                    lapack_int* ldvr, lapack_int* ilo, lapack_int* ihi,
-                    float* scale, float* abnrm, float* rconde, float* rcondv,
-                    float* work, lapack_int* lwork, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_dgeevx( char* balanc, char* jobvl, char* jobvr, char* sense,
-                    lapack_int* n, double* a, lapack_int* lda, double* wr,
-                    double* wi, double* vl, lapack_int* ldvl, double* vr,
-                    lapack_int* ldvr, lapack_int* ilo, lapack_int* ihi,
-                    double* scale, double* abnrm, double* rconde,
-                    double* rcondv, double* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int *info );
-void LAPACK_cgeevx( char* balanc, char* jobvl, char* jobvr, char* sense,
-                    lapack_int* n, lapack_complex_float* a, lapack_int* lda,
-                    lapack_complex_float* w, lapack_complex_float* vl,
-                    lapack_int* ldvl, lapack_complex_float* vr,
-                    lapack_int* ldvr, lapack_int* ilo, lapack_int* ihi,
-                    float* scale, float* abnrm, float* rconde, float* rcondv,
-                    lapack_complex_float* work, lapack_int* lwork, float* rwork,
-                    lapack_int *info );
-void LAPACK_zgeevx( char* balanc, char* jobvl, char* jobvr, char* sense,
-                    lapack_int* n, lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* w, lapack_complex_double* vl,
-                    lapack_int* ldvl, lapack_complex_double* vr,
-                    lapack_int* ldvr, lapack_int* ilo, lapack_int* ihi,
-                    double* scale, double* abnrm, double* rconde,
-                    double* rcondv, lapack_complex_double* work,
-                    lapack_int* lwork, double* rwork, lapack_int *info );
-void LAPACK_sgesvd( char* jobu, char* jobvt, lapack_int* m, lapack_int* n,
-                    float* a, lapack_int* lda, float* s, float* u,
-                    lapack_int* ldu, float* vt, lapack_int* ldvt, float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_dgesvd( char* jobu, char* jobvt, lapack_int* m, lapack_int* n,
-                    double* a, lapack_int* lda, double* s, double* u,
-                    lapack_int* ldu, double* vt, lapack_int* ldvt, double* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_cgesvd( char* jobu, char* jobvt, lapack_int* m, lapack_int* n,
-                    lapack_complex_float* a, lapack_int* lda, float* s,
-                    lapack_complex_float* u, lapack_int* ldu,
-                    lapack_complex_float* vt, lapack_int* ldvt,
-                    lapack_complex_float* work, lapack_int* lwork, float* rwork,
-                    lapack_int *info );
-void LAPACK_zgesvd( char* jobu, char* jobvt, lapack_int* m, lapack_int* n,
-                    lapack_complex_double* a, lapack_int* lda, double* s,
-                    lapack_complex_double* u, lapack_int* ldu,
-                    lapack_complex_double* vt, lapack_int* ldvt,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    double* rwork, lapack_int *info );
-void LAPACK_sgesdd( char* jobz, lapack_int* m, lapack_int* n, float* a,
-                    lapack_int* lda, float* s, float* u, lapack_int* ldu,
-                    float* vt, lapack_int* ldvt, float* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int *info );
-void LAPACK_dgesdd( char* jobz, lapack_int* m, lapack_int* n, double* a,
-                    lapack_int* lda, double* s, double* u, lapack_int* ldu,
-                    double* vt, lapack_int* ldvt, double* work,
-                    lapack_int* lwork, lapack_int* iwork, lapack_int *info );
-void LAPACK_cgesdd( char* jobz, lapack_int* m, lapack_int* n,
-                    lapack_complex_float* a, lapack_int* lda, float* s,
-                    lapack_complex_float* u, lapack_int* ldu,
-                    lapack_complex_float* vt, lapack_int* ldvt,
-                    lapack_complex_float* work, lapack_int* lwork, float* rwork,
-                    lapack_int* iwork, lapack_int *info );
-void LAPACK_zgesdd( char* jobz, lapack_int* m, lapack_int* n,
-                    lapack_complex_double* a, lapack_int* lda, double* s,
-                    lapack_complex_double* u, lapack_int* ldu,
-                    lapack_complex_double* vt, lapack_int* ldvt,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    double* rwork, lapack_int* iwork, lapack_int *info );
-void LAPACK_dgejsv( char* joba, char* jobu, char* jobv, char* jobr, char* jobt,
-                    char* jobp, lapack_int* m, lapack_int* n, double* a,
-                    lapack_int* lda, double* sva, double* u, lapack_int* ldu,
-                    double* v, lapack_int* ldv, double* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int *info );
-void LAPACK_sgejsv( char* joba, char* jobu, char* jobv, char* jobr, char* jobt,
-                    char* jobp, lapack_int* m, lapack_int* n, float* a,
-                    lapack_int* lda, float* sva, float* u, lapack_int* ldu,
-                    float* v, lapack_int* ldv, float* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int *info );
-void LAPACK_dgesvj( char* joba, char* jobu, char* jobv, lapack_int* m,
-                    lapack_int* n, double* a, lapack_int* lda, double* sva,
-                    lapack_int* mv, double* v, lapack_int* ldv, double* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_sgesvj( char* joba, char* jobu, char* jobv, lapack_int* m,
-                    lapack_int* n, float* a, lapack_int* lda, float* sva,
-                    lapack_int* mv, float* v, lapack_int* ldv, float* work,
-                    lapack_int* lwork, lapack_int *info );
-void LAPACK_sggsvd( char* jobu, char* jobv, char* jobq, lapack_int* m,
-                    lapack_int* n, lapack_int* p, lapack_int* k, lapack_int* l,
-                    float* a, lapack_int* lda, float* b, lapack_int* ldb,
-                    float* alpha, float* beta, float* u, lapack_int* ldu,
-                    float* v, lapack_int* ldv, float* q, lapack_int* ldq,
-                    float* work, lapack_int* iwork, lapack_int *info );
-void LAPACK_dggsvd( char* jobu, char* jobv, char* jobq, lapack_int* m,
-                    lapack_int* n, lapack_int* p, lapack_int* k, lapack_int* l,
-                    double* a, lapack_int* lda, double* b, lapack_int* ldb,
-                    double* alpha, double* beta, double* u, lapack_int* ldu,
-                    double* v, lapack_int* ldv, double* q, lapack_int* ldq,
-                    double* work, lapack_int* iwork, lapack_int *info );
-void LAPACK_cggsvd( char* jobu, char* jobv, char* jobq, lapack_int* m,
-                    lapack_int* n, lapack_int* p, lapack_int* k, lapack_int* l,
-                    lapack_complex_float* a, lapack_int* lda,
-                    lapack_complex_float* b, lapack_int* ldb, float* alpha,
-                    float* beta, lapack_complex_float* u, lapack_int* ldu,
-                    lapack_complex_float* v, lapack_int* ldv,
-                    lapack_complex_float* q, lapack_int* ldq,
-                    lapack_complex_float* work, float* rwork, lapack_int* iwork,
-                    lapack_int *info );
-void LAPACK_zggsvd( char* jobu, char* jobv, char* jobq, lapack_int* m,
-                    lapack_int* n, lapack_int* p, lapack_int* k, lapack_int* l,
-                    lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* b, lapack_int* ldb, double* alpha,
-                    double* beta, lapack_complex_double* u, lapack_int* ldu,
-                    lapack_complex_double* v, lapack_int* ldv,
-                    lapack_complex_double* q, lapack_int* ldq,
-                    lapack_complex_double* work, double* rwork,
-                    lapack_int* iwork, lapack_int *info );
-void LAPACK_ssygv( lapack_int* itype, char* jobz, char* uplo, lapack_int* n,
-                   float* a, lapack_int* lda, float* b, lapack_int* ldb,
-                   float* w, float* work, lapack_int* lwork, lapack_int *info );
-void LAPACK_dsygv( lapack_int* itype, char* jobz, char* uplo, lapack_int* n,
-                   double* a, lapack_int* lda, double* b, lapack_int* ldb,
-                   double* w, double* work, lapack_int* lwork,
-                   lapack_int *info );
-void LAPACK_chegv( lapack_int* itype, char* jobz, char* uplo, lapack_int* n,
-                   lapack_complex_float* a, lapack_int* lda,
-                   lapack_complex_float* b, lapack_int* ldb, float* w,
-                   lapack_complex_float* work, lapack_int* lwork, float* rwork,
-                   lapack_int *info );
-void LAPACK_zhegv( lapack_int* itype, char* jobz, char* uplo, lapack_int* n,
-                   lapack_complex_double* a, lapack_int* lda,
-                   lapack_complex_double* b, lapack_int* ldb, double* w,
-                   lapack_complex_double* work, lapack_int* lwork,
-                   double* rwork, lapack_int *info );
-void LAPACK_ssygvd( lapack_int* itype, char* jobz, char* uplo, lapack_int* n,
-                    float* a, lapack_int* lda, float* b, lapack_int* ldb,
-                    float* w, float* work, lapack_int* lwork, lapack_int* iwork,
-                    lapack_int* liwork, lapack_int *info );
-void LAPACK_dsygvd( lapack_int* itype, char* jobz, char* uplo, lapack_int* n,
-                    double* a, lapack_int* lda, double* b, lapack_int* ldb,
-                    double* w, double* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int* liwork, lapack_int *info );
-void LAPACK_chegvd( lapack_int* itype, char* jobz, char* uplo, lapack_int* n,
-                    lapack_complex_float* a, lapack_int* lda,
-                    lapack_complex_float* b, lapack_int* ldb, float* w,
-                    lapack_complex_float* work, lapack_int* lwork, float* rwork,
-                    lapack_int* lrwork, lapack_int* iwork, lapack_int* liwork,
-                    lapack_int *info );
-void LAPACK_zhegvd( lapack_int* itype, char* jobz, char* uplo, lapack_int* n,
-                    lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* b, lapack_int* ldb, double* w,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    double* rwork, lapack_int* lrwork, lapack_int* iwork,
-                    lapack_int* liwork, lapack_int *info );
-void LAPACK_ssygvx( lapack_int* itype, char* jobz, char* range, char* uplo,
-                    lapack_int* n, float* a, lapack_int* lda, float* b,
-                    lapack_int* ldb, float* vl, float* vu, lapack_int* il,
-                    lapack_int* iu, float* abstol, lapack_int* m, float* w,
-                    float* z, lapack_int* ldz, float* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int* ifail, lapack_int *info );
-void LAPACK_dsygvx( lapack_int* itype, char* jobz, char* range, char* uplo,
-                    lapack_int* n, double* a, lapack_int* lda, double* b,
-                    lapack_int* ldb, double* vl, double* vu, lapack_int* il,
-                    lapack_int* iu, double* abstol, lapack_int* m, double* w,
-                    double* z, lapack_int* ldz, double* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int* ifail, lapack_int *info );
-void LAPACK_chegvx( lapack_int* itype, char* jobz, char* range, char* uplo,
-                    lapack_int* n, lapack_complex_float* a, lapack_int* lda,
-                    lapack_complex_float* b, lapack_int* ldb, float* vl,
-                    float* vu, lapack_int* il, lapack_int* iu, float* abstol,
-                    lapack_int* m, float* w, lapack_complex_float* z,
-                    lapack_int* ldz, lapack_complex_float* work,
-                    lapack_int* lwork, float* rwork, lapack_int* iwork,
-                    lapack_int* ifail, lapack_int *info );
-void LAPACK_zhegvx( lapack_int* itype, char* jobz, char* range, char* uplo,
-                    lapack_int* n, lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* b, lapack_int* ldb, double* vl,
-                    double* vu, lapack_int* il, lapack_int* iu, double* abstol,
-                    lapack_int* m, double* w, lapack_complex_double* z,
-                    lapack_int* ldz, lapack_complex_double* work,
-                    lapack_int* lwork, double* rwork, lapack_int* iwork,
-                    lapack_int* ifail, lapack_int *info );
-void LAPACK_sspgv( lapack_int* itype, char* jobz, char* uplo, lapack_int* n,
-                   float* ap, float* bp, float* w, float* z, lapack_int* ldz,
-                   float* work, lapack_int *info );
-void LAPACK_dspgv( lapack_int* itype, char* jobz, char* uplo, lapack_int* n,
-                   double* ap, double* bp, double* w, double* z,
-                   lapack_int* ldz, double* work, lapack_int *info );
-void LAPACK_chpgv( lapack_int* itype, char* jobz, char* uplo, lapack_int* n,
-                   lapack_complex_float* ap, lapack_complex_float* bp, float* w,
-                   lapack_complex_float* z, lapack_int* ldz,
-                   lapack_complex_float* work, float* rwork, lapack_int *info );
-void LAPACK_zhpgv( lapack_int* itype, char* jobz, char* uplo, lapack_int* n,
-                   lapack_complex_double* ap, lapack_complex_double* bp,
-                   double* w, lapack_complex_double* z, lapack_int* ldz,
-                   lapack_complex_double* work, double* rwork,
-                   lapack_int *info );
-void LAPACK_sspgvd( lapack_int* itype, char* jobz, char* uplo, lapack_int* n,
-                    float* ap, float* bp, float* w, float* z, lapack_int* ldz,
-                    float* work, lapack_int* lwork, lapack_int* iwork,
-                    lapack_int* liwork, lapack_int *info );
-void LAPACK_dspgvd( lapack_int* itype, char* jobz, char* uplo, lapack_int* n,
-                    double* ap, double* bp, double* w, double* z,
-                    lapack_int* ldz, double* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_int* liwork, lapack_int *info );
-void LAPACK_chpgvd( lapack_int* itype, char* jobz, char* uplo, lapack_int* n,
-                    lapack_complex_float* ap, lapack_complex_float* bp,
-                    float* w, lapack_complex_float* z, lapack_int* ldz,
-                    lapack_complex_float* work, lapack_int* lwork, float* rwork,
-                    lapack_int* lrwork, lapack_int* iwork, lapack_int* liwork,
-                    lapack_int *info );
-void LAPACK_zhpgvd( lapack_int* itype, char* jobz, char* uplo, lapack_int* n,
-                    lapack_complex_double* ap, lapack_complex_double* bp,
-                    double* w, lapack_complex_double* z, lapack_int* ldz,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    double* rwork, lapack_int* lrwork, lapack_int* iwork,
-                    lapack_int* liwork, lapack_int *info );
-void LAPACK_sspgvx( lapack_int* itype, char* jobz, char* range, char* uplo,
-                    lapack_int* n, float* ap, float* bp, float* vl, float* vu,
-                    lapack_int* il, lapack_int* iu, float* abstol,
-                    lapack_int* m, float* w, float* z, lapack_int* ldz,
-                    float* work, lapack_int* iwork, lapack_int* ifail,
-                    lapack_int *info );
-void LAPACK_dspgvx( lapack_int* itype, char* jobz, char* range, char* uplo,
-                    lapack_int* n, double* ap, double* bp, double* vl,
-                    double* vu, lapack_int* il, lapack_int* iu, double* abstol,
-                    lapack_int* m, double* w, double* z, lapack_int* ldz,
-                    double* work, lapack_int* iwork, lapack_int* ifail,
-                    lapack_int *info );
-void LAPACK_chpgvx( lapack_int* itype, char* jobz, char* range, char* uplo,
-                    lapack_int* n, lapack_complex_float* ap,
-                    lapack_complex_float* bp, float* vl, float* vu,
-                    lapack_int* il, lapack_int* iu, float* abstol,
-                    lapack_int* m, float* w, lapack_complex_float* z,
-                    lapack_int* ldz, lapack_complex_float* work, float* rwork,
-                    lapack_int* iwork, lapack_int* ifail, lapack_int *info );
-void LAPACK_zhpgvx( lapack_int* itype, char* jobz, char* range, char* uplo,
-                    lapack_int* n, lapack_complex_double* ap,
-                    lapack_complex_double* bp, double* vl, double* vu,
-                    lapack_int* il, lapack_int* iu, double* abstol,
-                    lapack_int* m, double* w, lapack_complex_double* z,
-                    lapack_int* ldz, lapack_complex_double* work, double* rwork,
-                    lapack_int* iwork, lapack_int* ifail, lapack_int *info );
-void LAPACK_ssbgv( char* jobz, char* uplo, lapack_int* n, lapack_int* ka,
-                   lapack_int* kb, float* ab, lapack_int* ldab, float* bb,
-                   lapack_int* ldbb, float* w, float* z, lapack_int* ldz,
-                   float* work, lapack_int *info );
-void LAPACK_dsbgv( char* jobz, char* uplo, lapack_int* n, lapack_int* ka,
-                   lapack_int* kb, double* ab, lapack_int* ldab, double* bb,
-                   lapack_int* ldbb, double* w, double* z, lapack_int* ldz,
-                   double* work, lapack_int *info );
-void LAPACK_chbgv( char* jobz, char* uplo, lapack_int* n, lapack_int* ka,
-                   lapack_int* kb, lapack_complex_float* ab, lapack_int* ldab,
-                   lapack_complex_float* bb, lapack_int* ldbb, float* w,
-                   lapack_complex_float* z, lapack_int* ldz,
-                   lapack_complex_float* work, float* rwork, lapack_int *info );
-void LAPACK_zhbgv( char* jobz, char* uplo, lapack_int* n, lapack_int* ka,
-                   lapack_int* kb, lapack_complex_double* ab, lapack_int* ldab,
-                   lapack_complex_double* bb, lapack_int* ldbb, double* w,
-                   lapack_complex_double* z, lapack_int* ldz,
-                   lapack_complex_double* work, double* rwork,
-                   lapack_int *info );
-void LAPACK_ssbgvd( char* jobz, char* uplo, lapack_int* n, lapack_int* ka,
-                    lapack_int* kb, float* ab, lapack_int* ldab, float* bb,
-                    lapack_int* ldbb, float* w, float* z, lapack_int* ldz,
-                    float* work, lapack_int* lwork, lapack_int* iwork,
-                    lapack_int* liwork, lapack_int *info );
-void LAPACK_dsbgvd( char* jobz, char* uplo, lapack_int* n, lapack_int* ka,
-                    lapack_int* kb, double* ab, lapack_int* ldab, double* bb,
-                    lapack_int* ldbb, double* w, double* z, lapack_int* ldz,
-                    double* work, lapack_int* lwork, lapack_int* iwork,
-                    lapack_int* liwork, lapack_int *info );
-void LAPACK_chbgvd( char* jobz, char* uplo, lapack_int* n, lapack_int* ka,
-                    lapack_int* kb, lapack_complex_float* ab, lapack_int* ldab,
-                    lapack_complex_float* bb, lapack_int* ldbb, float* w,
-                    lapack_complex_float* z, lapack_int* ldz,
-                    lapack_complex_float* work, lapack_int* lwork, float* rwork,
-                    lapack_int* lrwork, lapack_int* iwork, lapack_int* liwork,
-                    lapack_int *info );
-void LAPACK_zhbgvd( char* jobz, char* uplo, lapack_int* n, lapack_int* ka,
-                    lapack_int* kb, lapack_complex_double* ab, lapack_int* ldab,
-                    lapack_complex_double* bb, lapack_int* ldbb, double* w,
-                    lapack_complex_double* z, lapack_int* ldz,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    double* rwork, lapack_int* lrwork, lapack_int* iwork,
-                    lapack_int* liwork, lapack_int *info );
-void LAPACK_ssbgvx( char* jobz, char* range, char* uplo, lapack_int* n,
-                    lapack_int* ka, lapack_int* kb, float* ab, lapack_int* ldab,
-                    float* bb, lapack_int* ldbb, float* q, lapack_int* ldq,
-                    float* vl, float* vu, lapack_int* il, lapack_int* iu,
-                    float* abstol, lapack_int* m, float* w, float* z,
-                    lapack_int* ldz, float* work, lapack_int* iwork,
-                    lapack_int* ifail, lapack_int *info );
-void LAPACK_dsbgvx( char* jobz, char* range, char* uplo, lapack_int* n,
-                    lapack_int* ka, lapack_int* kb, double* ab,
-                    lapack_int* ldab, double* bb, lapack_int* ldbb, double* q,
-                    lapack_int* ldq, double* vl, double* vu, lapack_int* il,
-                    lapack_int* iu, double* abstol, lapack_int* m, double* w,
-                    double* z, lapack_int* ldz, double* work, lapack_int* iwork,
-                    lapack_int* ifail, lapack_int *info );
-void LAPACK_chbgvx( char* jobz, char* range, char* uplo, lapack_int* n,
-                    lapack_int* ka, lapack_int* kb, lapack_complex_float* ab,
-                    lapack_int* ldab, lapack_complex_float* bb,
-                    lapack_int* ldbb, lapack_complex_float* q, lapack_int* ldq,
-                    float* vl, float* vu, lapack_int* il, lapack_int* iu,
-                    float* abstol, lapack_int* m, float* w,
-                    lapack_complex_float* z, lapack_int* ldz,
-                    lapack_complex_float* work, float* rwork, lapack_int* iwork,
-                    lapack_int* ifail, lapack_int *info );
-void LAPACK_zhbgvx( char* jobz, char* range, char* uplo, lapack_int* n,
-                    lapack_int* ka, lapack_int* kb, lapack_complex_double* ab,
-                    lapack_int* ldab, lapack_complex_double* bb,
-                    lapack_int* ldbb, lapack_complex_double* q, lapack_int* ldq,
-                    double* vl, double* vu, lapack_int* il, lapack_int* iu,
-                    double* abstol, lapack_int* m, double* w,
-                    lapack_complex_double* z, lapack_int* ldz,
-                    lapack_complex_double* work, double* rwork,
-                    lapack_int* iwork, lapack_int* ifail, lapack_int *info );
-void LAPACK_sgges( char* jobvsl, char* jobvsr, char* sort,
-                   LAPACK_S_SELECT3 selctg, lapack_int* n, float* a,
-                   lapack_int* lda, float* b, lapack_int* ldb, lapack_int* sdim,
-                   float* alphar, float* alphai, float* beta, float* vsl,
-                   lapack_int* ldvsl, float* vsr, lapack_int* ldvsr,
-                   float* work, lapack_int* lwork, lapack_logical* bwork,
-                   lapack_int *info );
-void LAPACK_dgges( char* jobvsl, char* jobvsr, char* sort,
-                   LAPACK_D_SELECT3 selctg, lapack_int* n, double* a,
-                   lapack_int* lda, double* b, lapack_int* ldb,
-                   lapack_int* sdim, double* alphar, double* alphai,
-                   double* beta, double* vsl, lapack_int* ldvsl, double* vsr,
-                   lapack_int* ldvsr, double* work, lapack_int* lwork,
-                   lapack_logical* bwork, lapack_int *info );
-void LAPACK_cgges( char* jobvsl, char* jobvsr, char* sort,
-                   LAPACK_C_SELECT2 selctg, lapack_int* n,
-                   lapack_complex_float* a, lapack_int* lda,
-                   lapack_complex_float* b, lapack_int* ldb, lapack_int* sdim,
-                   lapack_complex_float* alpha, lapack_complex_float* beta,
-                   lapack_complex_float* vsl, lapack_int* ldvsl,
-                   lapack_complex_float* vsr, lapack_int* ldvsr,
-                   lapack_complex_float* work, lapack_int* lwork, float* rwork,
-                   lapack_logical* bwork, lapack_int *info );
-void LAPACK_zgges( char* jobvsl, char* jobvsr, char* sort,
-                   LAPACK_Z_SELECT2 selctg, lapack_int* n,
-                   lapack_complex_double* a, lapack_int* lda,
-                   lapack_complex_double* b, lapack_int* ldb, lapack_int* sdim,
-                   lapack_complex_double* alpha, lapack_complex_double* beta,
-                   lapack_complex_double* vsl, lapack_int* ldvsl,
-                   lapack_complex_double* vsr, lapack_int* ldvsr,
-                   lapack_complex_double* work, lapack_int* lwork,
-                   double* rwork, lapack_logical* bwork, lapack_int *info );
-void LAPACK_sggesx( char* jobvsl, char* jobvsr, char* sort,
-                    LAPACK_S_SELECT3 selctg, char* sense, lapack_int* n,
-                    float* a, lapack_int* lda, float* b, lapack_int* ldb,
-                    lapack_int* sdim, float* alphar, float* alphai, float* beta,
-                    float* vsl, lapack_int* ldvsl, float* vsr,
-                    lapack_int* ldvsr, float* rconde, float* rcondv,
-                    float* work, lapack_int* lwork, lapack_int* iwork,
-                    lapack_int* liwork, lapack_logical* bwork,
-                    lapack_int *info );
-void LAPACK_dggesx( char* jobvsl, char* jobvsr, char* sort,
-                    LAPACK_D_SELECT3 selctg, char* sense, lapack_int* n,
-                    double* a, lapack_int* lda, double* b, lapack_int* ldb,
-                    lapack_int* sdim, double* alphar, double* alphai,
-                    double* beta, double* vsl, lapack_int* ldvsl, double* vsr,
-                    lapack_int* ldvsr, double* rconde, double* rcondv,
-                    double* work, lapack_int* lwork, lapack_int* iwork,
-                    lapack_int* liwork, lapack_logical* bwork,
-                    lapack_int *info );
-void LAPACK_cggesx( char* jobvsl, char* jobvsr, char* sort,
-                    LAPACK_C_SELECT2 selctg, char* sense, lapack_int* n,
-                    lapack_complex_float* a, lapack_int* lda,
-                    lapack_complex_float* b, lapack_int* ldb, lapack_int* sdim,
-                    lapack_complex_float* alpha, lapack_complex_float* beta,
-                    lapack_complex_float* vsl, lapack_int* ldvsl,
-                    lapack_complex_float* vsr, lapack_int* ldvsr, float* rconde,
-                    float* rcondv, lapack_complex_float* work,
-                    lapack_int* lwork, float* rwork, lapack_int* iwork,
-                    lapack_int* liwork, lapack_logical* bwork,
-                    lapack_int *info );
-void LAPACK_zggesx( char* jobvsl, char* jobvsr, char* sort,
-                    LAPACK_Z_SELECT2 selctg, char* sense, lapack_int* n,
-                    lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* b, lapack_int* ldb, lapack_int* sdim,
-                    lapack_complex_double* alpha, lapack_complex_double* beta,
-                    lapack_complex_double* vsl, lapack_int* ldvsl,
-                    lapack_complex_double* vsr, lapack_int* ldvsr,
-                    double* rconde, double* rcondv, lapack_complex_double* work,
-                    lapack_int* lwork, double* rwork, lapack_int* iwork,
-                    lapack_int* liwork, lapack_logical* bwork,
-                    lapack_int *info );
-void LAPACK_sggev( char* jobvl, char* jobvr, lapack_int* n, float* a,
-                   lapack_int* lda, float* b, lapack_int* ldb, float* alphar,
-                   float* alphai, float* beta, float* vl, lapack_int* ldvl,
-                   float* vr, lapack_int* ldvr, float* work, lapack_int* lwork,
-                   lapack_int *info );
-void LAPACK_dggev( char* jobvl, char* jobvr, lapack_int* n, double* a,
-                   lapack_int* lda, double* b, lapack_int* ldb, double* alphar,
-                   double* alphai, double* beta, double* vl, lapack_int* ldvl,
-                   double* vr, lapack_int* ldvr, double* work,
-                   lapack_int* lwork, lapack_int *info );
-void LAPACK_cggev( char* jobvl, char* jobvr, lapack_int* n,
-                   lapack_complex_float* a, lapack_int* lda,
-                   lapack_complex_float* b, lapack_int* ldb,
-                   lapack_complex_float* alpha, lapack_complex_float* beta,
-                   lapack_complex_float* vl, lapack_int* ldvl,
-                   lapack_complex_float* vr, lapack_int* ldvr,
-                   lapack_complex_float* work, lapack_int* lwork, float* rwork,
-                   lapack_int *info );
-void LAPACK_zggev( char* jobvl, char* jobvr, lapack_int* n,
-                   lapack_complex_double* a, lapack_int* lda,
-                   lapack_complex_double* b, lapack_int* ldb,
-                   lapack_complex_double* alpha, lapack_complex_double* beta,
-                   lapack_complex_double* vl, lapack_int* ldvl,
-                   lapack_complex_double* vr, lapack_int* ldvr,
-                   lapack_complex_double* work, lapack_int* lwork,
-                   double* rwork, lapack_int *info );
-void LAPACK_sggevx( char* balanc, char* jobvl, char* jobvr, char* sense,
-                    lapack_int* n, float* a, lapack_int* lda, float* b,
-                    lapack_int* ldb, float* alphar, float* alphai, float* beta,
-                    float* vl, lapack_int* ldvl, float* vr, lapack_int* ldvr,
-                    lapack_int* ilo, lapack_int* ihi, float* lscale,
-                    float* rscale, float* abnrm, float* bbnrm, float* rconde,
-                    float* rcondv, float* work, lapack_int* lwork,
-                    lapack_int* iwork, lapack_logical* bwork,
-                    lapack_int *info );
-void LAPACK_dggevx( char* balanc, char* jobvl, char* jobvr, char* sense,
-                    lapack_int* n, double* a, lapack_int* lda, double* b,
-                    lapack_int* ldb, double* alphar, double* alphai,
-                    double* beta, double* vl, lapack_int* ldvl, double* vr,
-                    lapack_int* ldvr, lapack_int* ilo, lapack_int* ihi,
-                    double* lscale, double* rscale, double* abnrm,
-                    double* bbnrm, double* rconde, double* rcondv, double* work,
-                    lapack_int* lwork, lapack_int* iwork, lapack_logical* bwork,
-                    lapack_int *info );
-void LAPACK_cggevx( char* balanc, char* jobvl, char* jobvr, char* sense,
-                    lapack_int* n, lapack_complex_float* a, lapack_int* lda,
-                    lapack_complex_float* b, lapack_int* ldb,
-                    lapack_complex_float* alpha, lapack_complex_float* beta,
-                    lapack_complex_float* vl, lapack_int* ldvl,
-                    lapack_complex_float* vr, lapack_int* ldvr, lapack_int* ilo,
-                    lapack_int* ihi, float* lscale, float* rscale, float* abnrm,
-                    float* bbnrm, float* rconde, float* rcondv,
-                    lapack_complex_float* work, lapack_int* lwork, float* rwork,
-                    lapack_int* iwork, lapack_logical* bwork,
-                    lapack_int *info );
-void LAPACK_zggevx( char* balanc, char* jobvl, char* jobvr, char* sense,
-                    lapack_int* n, lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* b, lapack_int* ldb,
-                    lapack_complex_double* alpha, lapack_complex_double* beta,
-                    lapack_complex_double* vl, lapack_int* ldvl,
-                    lapack_complex_double* vr, lapack_int* ldvr,
-                    lapack_int* ilo, lapack_int* ihi, double* lscale,
-                    double* rscale, double* abnrm, double* bbnrm,
-                    double* rconde, double* rcondv, lapack_complex_double* work,
-                    lapack_int* lwork, double* rwork, lapack_int* iwork,
-                    lapack_logical* bwork, lapack_int *info );
-void LAPACK_dsfrk( char* transr, char* uplo, char* trans, lapack_int* n,
-                   lapack_int* k, double* alpha, const double* a,
-                   lapack_int* lda, double* beta, double* c );
-void LAPACK_ssfrk( char* transr, char* uplo, char* trans, lapack_int* n,
-                   lapack_int* k, float* alpha, const float* a, lapack_int* lda,
-                   float* beta, float* c );
-void LAPACK_zhfrk( char* transr, char* uplo, char* trans, lapack_int* n,
-                   lapack_int* k, double* alpha, const lapack_complex_double* a,
-                   lapack_int* lda, double* beta, lapack_complex_double* c );
-void LAPACK_chfrk( char* transr, char* uplo, char* trans, lapack_int* n,
-                   lapack_int* k, float* alpha, const lapack_complex_float* a,
-                   lapack_int* lda, float* beta, lapack_complex_float* c );
-void LAPACK_dtfsm( char* transr, char* side, char* uplo, char* trans,
-                   char* diag, lapack_int* m, lapack_int* n, double* alpha,
-                   const double* a, double* b, lapack_int* ldb );
-void LAPACK_stfsm( char* transr, char* side, char* uplo, char* trans,
-                   char* diag, lapack_int* m, lapack_int* n, float* alpha,
-                   const float* a, float* b, lapack_int* ldb );
-void LAPACK_ztfsm( char* transr, char* side, char* uplo, char* trans,
-                   char* diag, lapack_int* m, lapack_int* n,
-                   lapack_complex_double* alpha, const lapack_complex_double* a,
-                   lapack_complex_double* b, lapack_int* ldb );
-void LAPACK_ctfsm( char* transr, char* side, char* uplo, char* trans,
-                   char* diag, lapack_int* m, lapack_int* n,
-                   lapack_complex_float* alpha, const lapack_complex_float* a,
-                   lapack_complex_float* b, lapack_int* ldb );
-void LAPACK_dtfttp( char* transr, char* uplo, lapack_int* n, const double* arf,
-                    double* ap, lapack_int *info );
-void LAPACK_stfttp( char* transr, char* uplo, lapack_int* n, const float* arf,
-                    float* ap, lapack_int *info );
-void LAPACK_ztfttp( char* transr, char* uplo, lapack_int* n,
-                    const lapack_complex_double* arf, lapack_complex_double* ap,
-                    lapack_int *info );
-void LAPACK_ctfttp( char* transr, char* uplo, lapack_int* n,
-                    const lapack_complex_float* arf, lapack_complex_float* ap,
-                    lapack_int *info );
-void LAPACK_dtfttr( char* transr, char* uplo, lapack_int* n, const double* arf,
-                    double* a, lapack_int* lda, lapack_int *info );
-void LAPACK_stfttr( char* transr, char* uplo, lapack_int* n, const float* arf,
-                    float* a, lapack_int* lda, lapack_int *info );
-void LAPACK_ztfttr( char* transr, char* uplo, lapack_int* n,
-                    const lapack_complex_double* arf, lapack_complex_double* a,
-                    lapack_int* lda, lapack_int *info );
-void LAPACK_ctfttr( char* transr, char* uplo, lapack_int* n,
-                    const lapack_complex_float* arf, lapack_complex_float* a,
-                    lapack_int* lda, lapack_int *info );
-void LAPACK_dtpttf( char* transr, char* uplo, lapack_int* n, const double* ap,
-                    double* arf, lapack_int *info );
-void LAPACK_stpttf( char* transr, char* uplo, lapack_int* n, const float* ap,
-                    float* arf, lapack_int *info );
-void LAPACK_ztpttf( char* transr, char* uplo, lapack_int* n,
-                    const lapack_complex_double* ap, lapack_complex_double* arf,
-                    lapack_int *info );
-void LAPACK_ctpttf( char* transr, char* uplo, lapack_int* n,
-                    const lapack_complex_float* ap, lapack_complex_float* arf,
-                    lapack_int *info );
-void LAPACK_dtpttr( char* uplo, lapack_int* n, const double* ap, double* a,
-                    lapack_int* lda, lapack_int *info );
-void LAPACK_stpttr( char* uplo, lapack_int* n, const float* ap, float* a,
-                    lapack_int* lda, lapack_int *info );
-void LAPACK_ztpttr( char* uplo, lapack_int* n, const lapack_complex_double* ap,
-                    lapack_complex_double* a, lapack_int* lda,
-                    lapack_int *info );
-void LAPACK_ctpttr( char* uplo, lapack_int* n, const lapack_complex_float* ap,
-                    lapack_complex_float* a, lapack_int* lda,
-                    lapack_int *info );
-void LAPACK_dtrttf( char* transr, char* uplo, lapack_int* n, const double* a,
-                    lapack_int* lda, double* arf, lapack_int *info );
-void LAPACK_strttf( char* transr, char* uplo, lapack_int* n, const float* a,
-                    lapack_int* lda, float* arf, lapack_int *info );
-void LAPACK_ztrttf( char* transr, char* uplo, lapack_int* n,
-                    const lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* arf, lapack_int *info );
-void LAPACK_ctrttf( char* transr, char* uplo, lapack_int* n,
-                    const lapack_complex_float* a, lapack_int* lda,
-                    lapack_complex_float* arf, lapack_int *info );
-void LAPACK_dtrttp( char* uplo, lapack_int* n, const double* a, lapack_int* lda,
-                    double* ap, lapack_int *info );
-void LAPACK_strttp( char* uplo, lapack_int* n, const float* a, lapack_int* lda,
-                    float* ap, lapack_int *info );
-void LAPACK_ztrttp( char* uplo, lapack_int* n, const lapack_complex_double* a,
-                    lapack_int* lda, lapack_complex_double* ap,
-                    lapack_int *info );
-void LAPACK_ctrttp( char* uplo, lapack_int* n, const lapack_complex_float* a,
-                    lapack_int* lda, lapack_complex_float* ap,
-                    lapack_int *info );
-void LAPACK_sgeqrfp( lapack_int* m, lapack_int* n, float* a, lapack_int* lda,
-                     float* tau, float* work, lapack_int* lwork,
-                     lapack_int *info );
-void LAPACK_dgeqrfp( lapack_int* m, lapack_int* n, double* a, lapack_int* lda,
-                     double* tau, double* work, lapack_int* lwork,
-                     lapack_int *info );
-void LAPACK_cgeqrfp( lapack_int* m, lapack_int* n, lapack_complex_float* a,
-                     lapack_int* lda, lapack_complex_float* tau,
-                     lapack_complex_float* work, lapack_int* lwork,
-                     lapack_int *info );
-void LAPACK_zgeqrfp( lapack_int* m, lapack_int* n, lapack_complex_double* a,
-                     lapack_int* lda, lapack_complex_double* tau,
-                     lapack_complex_double* work, lapack_int* lwork,
-                     lapack_int *info );
-void LAPACK_clacgv( lapack_int* n, lapack_complex_float* x, lapack_int* incx );
-void LAPACK_zlacgv( lapack_int* n, lapack_complex_double* x, lapack_int* incx );
-void LAPACK_slarnv( lapack_int* idist, lapack_int* iseed, lapack_int* n,
-                    float* x );
-void LAPACK_dlarnv( lapack_int* idist, lapack_int* iseed, lapack_int* n,
-                    double* x );
-void LAPACK_clarnv( lapack_int* idist, lapack_int* iseed, lapack_int* n,
-                    lapack_complex_float* x );
-void LAPACK_zlarnv( lapack_int* idist, lapack_int* iseed, lapack_int* n,
-                    lapack_complex_double* x );
-void LAPACK_sgeqr2( lapack_int* m, lapack_int* n, float* a, lapack_int* lda,
-                    float* tau, float* work, lapack_int *info );
-void LAPACK_dgeqr2( lapack_int* m, lapack_int* n, double* a, lapack_int* lda,
-                    double* tau, double* work, lapack_int *info );
-void LAPACK_cgeqr2( lapack_int* m, lapack_int* n, lapack_complex_float* a,
-                    lapack_int* lda, lapack_complex_float* tau,
-                    lapack_complex_float* work, lapack_int *info );
-void LAPACK_zgeqr2( lapack_int* m, lapack_int* n, lapack_complex_double* a,
-                    lapack_int* lda, lapack_complex_double* tau,
-                    lapack_complex_double* work, lapack_int *info );
-void LAPACK_slacpy( char* uplo, lapack_int* m, lapack_int* n, const float* a,
-                    lapack_int* lda, float* b, lapack_int* ldb );
-void LAPACK_dlacpy( char* uplo, lapack_int* m, lapack_int* n, const double* a,
-                    lapack_int* lda, double* b, lapack_int* ldb );
-void LAPACK_clacpy( char* uplo, lapack_int* m, lapack_int* n,
-                    const lapack_complex_float* a, lapack_int* lda,
-                    lapack_complex_float* b, lapack_int* ldb );
-void LAPACK_zlacpy( char* uplo, lapack_int* m, lapack_int* n,
-                    const lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* b, lapack_int* ldb );
-void LAPACK_sgetf2( lapack_int* m, lapack_int* n, float* a, lapack_int* lda,
-                    lapack_int* ipiv, lapack_int *info );
-void LAPACK_dgetf2( lapack_int* m, lapack_int* n, double* a, lapack_int* lda,
-                    lapack_int* ipiv, lapack_int *info );
-void LAPACK_cgetf2( lapack_int* m, lapack_int* n, lapack_complex_float* a,
-                    lapack_int* lda, lapack_int* ipiv, lapack_int *info );
-void LAPACK_zgetf2( lapack_int* m, lapack_int* n, lapack_complex_double* a,
-                    lapack_int* lda, lapack_int* ipiv, lapack_int *info );
-void LAPACK_slaswp( lapack_int* n, float* a, lapack_int* lda, lapack_int* k1,
-                    lapack_int* k2, const lapack_int* ipiv, lapack_int* incx );
-void LAPACK_dlaswp( lapack_int* n, double* a, lapack_int* lda, lapack_int* k1,
-                    lapack_int* k2, const lapack_int* ipiv, lapack_int* incx );
-void LAPACK_claswp( lapack_int* n, lapack_complex_float* a, lapack_int* lda,
-                    lapack_int* k1, lapack_int* k2, const lapack_int* ipiv,
-                    lapack_int* incx );
-void LAPACK_zlaswp( lapack_int* n, lapack_complex_double* a, lapack_int* lda,
-                    lapack_int* k1, lapack_int* k2, const lapack_int* ipiv,
-                    lapack_int* incx );
-float LAPACK_slange( char* norm, lapack_int* m, lapack_int* n, const float* a,
-                    lapack_int* lda, float* work );
-double LAPACK_dlange( char* norm, lapack_int* m, lapack_int* n, const double* a,
-                    lapack_int* lda, double* work );
-float LAPACK_clange( char* norm, lapack_int* m, lapack_int* n,
-                    const lapack_complex_float* a, lapack_int* lda, float* work );
-double LAPACK_zlange( char* norm, lapack_int* m, lapack_int* n,
-                    const lapack_complex_double* a, lapack_int* lda, double* work );
-float LAPACK_clanhe( char* norm, char* uplo, lapack_int* n,
-                    const lapack_complex_float* a, lapack_int* lda, float* work );
-double LAPACK_zlanhe( char* norm, char* uplo, lapack_int* n,
-                    const lapack_complex_double* a, lapack_int* lda, double* work );
-float LAPACK_slansy( char* norm, char* uplo, lapack_int* n, const float* a,
-                    lapack_int* lda, float* work );
-double LAPACK_dlansy( char* norm, char* uplo, lapack_int* n, const double* a,
-                    lapack_int* lda, double* work );
-float LAPACK_clansy( char* norm, char* uplo, lapack_int* n,
-                    const lapack_complex_float* a, lapack_int* lda, float* work );
-double LAPACK_zlansy( char* norm, char* uplo, lapack_int* n,
-                    const lapack_complex_double* a, lapack_int* lda, double* work );
-float LAPACK_slantr( char* norm, char* uplo, char* diag, lapack_int* m,
-                    lapack_int* n, const float* a, lapack_int* lda, float* work );
-double LAPACK_dlantr( char* norm, char* uplo, char* diag, lapack_int* m,
-                    lapack_int* n, const double* a, lapack_int* lda, double* work );
-float LAPACK_clantr( char* norm, char* uplo, char* diag, lapack_int* m,
-                    lapack_int* n, const lapack_complex_float* a, lapack_int* lda,
-                    float* work );
-double LAPACK_zlantr( char* norm, char* uplo, char* diag, lapack_int* m,
-                    lapack_int* n, const lapack_complex_double* a, lapack_int* lda,
-                    double* work );
-float LAPACK_slamch( char* cmach );
-double LAPACK_dlamch( char* cmach );
-void LAPACK_sgelq2( lapack_int* m, lapack_int* n, float* a, lapack_int* lda,
-                    float* tau, float* work, lapack_int *info );
-void LAPACK_dgelq2( lapack_int* m, lapack_int* n, double* a, lapack_int* lda,
-                    double* tau, double* work, lapack_int *info );
-void LAPACK_cgelq2( lapack_int* m, lapack_int* n, lapack_complex_float* a,
-                    lapack_int* lda, lapack_complex_float* tau,
-                    lapack_complex_float* work, lapack_int *info );
-void LAPACK_zgelq2( lapack_int* m, lapack_int* n, lapack_complex_double* a,
-                    lapack_int* lda, lapack_complex_double* tau,
-                    lapack_complex_double* work, lapack_int *info );
-void LAPACK_slarfb( char* side, char* trans, char* direct, char* storev,
-                    lapack_int* m, lapack_int* n, lapack_int* k, const float* v,
-                    lapack_int* ldv, const float* t, lapack_int* ldt, float* c,
-                    lapack_int* ldc, float* work, lapack_int* ldwork );
-void LAPACK_dlarfb( char* side, char* trans, char* direct, char* storev,
-                    lapack_int* m, lapack_int* n, lapack_int* k,
-                    const double* v, lapack_int* ldv, const double* t,
-                    lapack_int* ldt, double* c, lapack_int* ldc, double* work,
-                    lapack_int* ldwork );
-void LAPACK_clarfb( char* side, char* trans, char* direct, char* storev,
-                    lapack_int* m, lapack_int* n, lapack_int* k,
-                    const lapack_complex_float* v, lapack_int* ldv,
-                    const lapack_complex_float* t, lapack_int* ldt,
-                    lapack_complex_float* c, lapack_int* ldc,
-                    lapack_complex_float* work, lapack_int* ldwork );
-void LAPACK_zlarfb( char* side, char* trans, char* direct, char* storev,
-                    lapack_int* m, lapack_int* n, lapack_int* k,
-                    const lapack_complex_double* v, lapack_int* ldv,
-                    const lapack_complex_double* t, lapack_int* ldt,
-                    lapack_complex_double* c, lapack_int* ldc,
-                    lapack_complex_double* work, lapack_int* ldwork );
-void LAPACK_slarfg( lapack_int* n, float* alpha, float* x, lapack_int* incx,
-                    float* tau );
-void LAPACK_dlarfg( lapack_int* n, double* alpha, double* x, lapack_int* incx,
-                    double* tau );
-void LAPACK_clarfg( lapack_int* n, lapack_complex_float* alpha,
-                    lapack_complex_float* x, lapack_int* incx,
-                    lapack_complex_float* tau );
-void LAPACK_zlarfg( lapack_int* n, lapack_complex_double* alpha,
-                    lapack_complex_double* x, lapack_int* incx,
-                    lapack_complex_double* tau );
-void LAPACK_slarft( char* direct, char* storev, lapack_int* n, lapack_int* k,
-                    const float* v, lapack_int* ldv, const float* tau, float* t,
-                    lapack_int* ldt );
-void LAPACK_dlarft( char* direct, char* storev, lapack_int* n, lapack_int* k,
-                    const double* v, lapack_int* ldv, const double* tau,
-                    double* t, lapack_int* ldt );
-void LAPACK_clarft( char* direct, char* storev, lapack_int* n, lapack_int* k,
-                    const lapack_complex_float* v, lapack_int* ldv,
-                    const lapack_complex_float* tau, lapack_complex_float* t,
-                    lapack_int* ldt );
-void LAPACK_zlarft( char* direct, char* storev, lapack_int* n, lapack_int* k,
-                    const lapack_complex_double* v, lapack_int* ldv,
-                    const lapack_complex_double* tau, lapack_complex_double* t,
-                    lapack_int* ldt );
-void LAPACK_slarfx( char* side, lapack_int* m, lapack_int* n, const float* v,
-                    float* tau, float* c, lapack_int* ldc, float* work );
-void LAPACK_dlarfx( char* side, lapack_int* m, lapack_int* n, const double* v,
-                    double* tau, double* c, lapack_int* ldc, double* work );
-void LAPACK_clarfx( char* side, lapack_int* m, lapack_int* n,
-                    const lapack_complex_float* v, lapack_complex_float* tau,
-                    lapack_complex_float* c, lapack_int* ldc,
-                    lapack_complex_float* work );
-void LAPACK_zlarfx( char* side, lapack_int* m, lapack_int* n,
-                    const lapack_complex_double* v, lapack_complex_double* tau,
-                    lapack_complex_double* c, lapack_int* ldc,
-                    lapack_complex_double* work );
-void LAPACK_slatms( lapack_int* m, lapack_int* n, char* dist, lapack_int* iseed,
-                    char* sym, float* d, lapack_int* mode, float* cond,
-                    float* dmax, lapack_int* kl, lapack_int* ku, char* pack,
-                    float* a, lapack_int* lda, float* work, lapack_int *info );
-void LAPACK_dlatms( lapack_int* m, lapack_int* n, char* dist, lapack_int* iseed,
-                    char* sym, double* d, lapack_int* mode, double* cond,
-                    double* dmax, lapack_int* kl, lapack_int* ku, char* pack,
-                    double* a, lapack_int* lda, double* work,
-                    lapack_int *info );
-void LAPACK_clatms( lapack_int* m, lapack_int* n, char* dist, lapack_int* iseed,
-                    char* sym, float* d, lapack_int* mode, float* cond,
-                    float* dmax, lapack_int* kl, lapack_int* ku, char* pack,
-                    lapack_complex_float* a, lapack_int* lda,
-                    lapack_complex_float* work, lapack_int *info );
-void LAPACK_zlatms( lapack_int* m, lapack_int* n, char* dist, lapack_int* iseed,
-                    char* sym, double* d, lapack_int* mode, double* cond,
-                    double* dmax, lapack_int* kl, lapack_int* ku, char* pack,
-                    lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* work, lapack_int *info );
-void LAPACK_slag2d( lapack_int* m, lapack_int* n, const float* sa,
-                    lapack_int* ldsa, double* a, lapack_int* lda,
-                    lapack_int *info );
-void LAPACK_dlag2s( lapack_int* m, lapack_int* n, const double* a,
-                    lapack_int* lda, float* sa, lapack_int* ldsa,
-                    lapack_int *info );
-void LAPACK_clag2z( lapack_int* m, lapack_int* n,
-                    const lapack_complex_float* sa, lapack_int* ldsa,
-                    lapack_complex_double* a, lapack_int* lda,
-                    lapack_int *info );
-void LAPACK_zlag2c( lapack_int* m, lapack_int* n,
-                    const lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_float* sa, lapack_int* ldsa,
-                    lapack_int *info );
-void LAPACK_slauum( char* uplo, lapack_int* n, float* a, lapack_int* lda,
-                    lapack_int *info );
-void LAPACK_dlauum( char* uplo, lapack_int* n, double* a, lapack_int* lda,
-                    lapack_int *info );
-void LAPACK_clauum( char* uplo, lapack_int* n, lapack_complex_float* a,
-                    lapack_int* lda, lapack_int *info );
-void LAPACK_zlauum( char* uplo, lapack_int* n, lapack_complex_double* a,
-                    lapack_int* lda, lapack_int *info );
-void LAPACK_slagge( lapack_int* m, lapack_int* n, lapack_int* kl,
-                    lapack_int* ku, const float* d, float* a, lapack_int* lda,
-                    lapack_int* iseed, float* work, lapack_int *info );
-void LAPACK_dlagge( lapack_int* m, lapack_int* n, lapack_int* kl,
-                    lapack_int* ku, const double* d, double* a, lapack_int* lda,
-                    lapack_int* iseed, double* work, lapack_int *info );
-void LAPACK_clagge( lapack_int* m, lapack_int* n, lapack_int* kl,
-                    lapack_int* ku, const float* d, lapack_complex_float* a,
-                    lapack_int* lda, lapack_int* iseed,
-                    lapack_complex_float* work, lapack_int *info );
-void LAPACK_zlagge( lapack_int* m, lapack_int* n, lapack_int* kl,
-                    lapack_int* ku, const double* d, lapack_complex_double* a,
-                    lapack_int* lda, lapack_int* iseed,
-                    lapack_complex_double* work, lapack_int *info );
-void LAPACK_slaset( char* uplo, lapack_int* m, lapack_int* n, float* alpha,
-                    float* beta, float* a, lapack_int* lda );
-void LAPACK_dlaset( char* uplo, lapack_int* m, lapack_int* n, double* alpha,
-                    double* beta, double* a, lapack_int* lda );
-void LAPACK_claset( char* uplo, lapack_int* m, lapack_int* n,
-                    lapack_complex_float* alpha, lapack_complex_float* beta,
-                    lapack_complex_float* a, lapack_int* lda );
-void LAPACK_zlaset( char* uplo, lapack_int* m, lapack_int* n,
-                    lapack_complex_double* alpha, lapack_complex_double* beta,
-                    lapack_complex_double* a, lapack_int* lda );
-void LAPACK_slasrt( char* id, lapack_int* n, float* d, lapack_int *info );
-void LAPACK_dlasrt( char* id, lapack_int* n, double* d, lapack_int *info );
-void LAPACK_claghe( lapack_int* n, lapack_int* k, const float* d,
-                    lapack_complex_float* a, lapack_int* lda, lapack_int* iseed,
-                    lapack_complex_float* work, lapack_int *info );
-void LAPACK_zlaghe( lapack_int* n, lapack_int* k, const double* d,
-                    lapack_complex_double* a, lapack_int* lda,
-                    lapack_int* iseed, lapack_complex_double* work,
-                    lapack_int *info );
-void LAPACK_slagsy( lapack_int* n, lapack_int* k, const float* d, float* a,
-                    lapack_int* lda, lapack_int* iseed, float* work,
-                    lapack_int *info );
-void LAPACK_dlagsy( lapack_int* n, lapack_int* k, const double* d, double* a,
-                    lapack_int* lda, lapack_int* iseed, double* work,
-                    lapack_int *info );
-void LAPACK_clagsy( lapack_int* n, lapack_int* k, const float* d,
-                    lapack_complex_float* a, lapack_int* lda, lapack_int* iseed,
-                    lapack_complex_float* work, lapack_int *info );
-void LAPACK_zlagsy( lapack_int* n, lapack_int* k, const double* d,
-                    lapack_complex_double* a, lapack_int* lda,
-                    lapack_int* iseed, lapack_complex_double* work,
-                    lapack_int *info );
-void LAPACK_slapmr( lapack_logical* forwrd, lapack_int* m, lapack_int* n,
-                    float* x, lapack_int* ldx, lapack_int* k );
-void LAPACK_dlapmr( lapack_logical* forwrd, lapack_int* m, lapack_int* n,
-                    double* x, lapack_int* ldx, lapack_int* k );
-void LAPACK_clapmr( lapack_logical* forwrd, lapack_int* m, lapack_int* n,
-                    lapack_complex_float* x, lapack_int* ldx, lapack_int* k );
-void LAPACK_zlapmr( lapack_logical* forwrd, lapack_int* m, lapack_int* n,
-                    lapack_complex_double* x, lapack_int* ldx, lapack_int* k );
-float LAPACK_slapy2( float* x, float* y );
-double LAPACK_dlapy2( double* x, double* y );
-float LAPACK_slapy3( float* x, float* y, float* z );
-double LAPACK_dlapy3( double* x, double* y, double* z );
-void LAPACK_slartgp( float* f, float* g, float* cs, float* sn, float* r );
-void LAPACK_dlartgp( double* f, double* g, double* cs, double* sn, double* r );
-void LAPACK_slartgs( float* x, float* y, float* sigma, float* cs, float* sn );
-void LAPACK_dlartgs( double* x, double* y, double* sigma, double* cs,
-                     double* sn );
+#define LAPACK_sgetrf LAPACK_GLOBAL(sgetrf, SGETRF)
+#define LAPACK_dgetrf LAPACK_GLOBAL(dgetrf, DGETRF)
+#define LAPACK_cgetrf LAPACK_GLOBAL(cgetrf, CGETRF)
+#define LAPACK_zgetrf LAPACK_GLOBAL(zgetrf, ZGETRF)
+#define LAPACK_sgbtrf LAPACK_GLOBAL(sgbtrf, SGBTRF)
+#define LAPACK_dgbtrf LAPACK_GLOBAL(dgbtrf, DGBTRF)
+#define LAPACK_cgbtrf LAPACK_GLOBAL(cgbtrf, CGBTRF)
+#define LAPACK_zgbtrf LAPACK_GLOBAL(zgbtrf, ZGBTRF)
+#define LAPACK_sgttrf LAPACK_GLOBAL(sgttrf, SGTTRF)
+#define LAPACK_dgttrf LAPACK_GLOBAL(dgttrf, DGTTRF)
+#define LAPACK_cgttrf LAPACK_GLOBAL(cgttrf, CGTTRF)
+#define LAPACK_zgttrf LAPACK_GLOBAL(zgttrf, ZGTTRF)
+#define LAPACK_spotrf LAPACK_GLOBAL(spotrf, SPOTRF)
+#define LAPACK_dpotrf LAPACK_GLOBAL(dpotrf, DPOTRF)
+#define LAPACK_cpotrf LAPACK_GLOBAL(cpotrf, CPOTRF)
+#define LAPACK_zpotrf LAPACK_GLOBAL(zpotrf, ZPOTRF)
+#define LAPACK_dpstrf LAPACK_GLOBAL(dpstrf, DPSTRF)
+#define LAPACK_spstrf LAPACK_GLOBAL(spstrf, SPSTRF)
+#define LAPACK_zpstrf LAPACK_GLOBAL(zpstrf, ZPSTRF)
+#define LAPACK_cpstrf LAPACK_GLOBAL(cpstrf, CPSTRF)
+#define LAPACK_dpftrf LAPACK_GLOBAL(dpftrf, DPFTRF)
+#define LAPACK_spftrf LAPACK_GLOBAL(spftrf, SPFTRF)
+#define LAPACK_zpftrf LAPACK_GLOBAL(zpftrf, ZPFTRF)
+#define LAPACK_cpftrf LAPACK_GLOBAL(cpftrf, CPFTRF)
+#define LAPACK_spptrf LAPACK_GLOBAL(spptrf, SPPTRF)
+#define LAPACK_dpptrf LAPACK_GLOBAL(dpptrf, DPPTRF)
+#define LAPACK_cpptrf LAPACK_GLOBAL(cpptrf, CPPTRF)
+#define LAPACK_zpptrf LAPACK_GLOBAL(zpptrf, ZPPTRF)
+#define LAPACK_spbtrf LAPACK_GLOBAL(spbtrf, SPBTRF)
+#define LAPACK_dpbtrf LAPACK_GLOBAL(dpbtrf, DPBTRF)
+#define LAPACK_cpbtrf LAPACK_GLOBAL(cpbtrf, CPBTRF)
+#define LAPACK_zpbtrf LAPACK_GLOBAL(zpbtrf, ZPBTRF)
+#define LAPACK_spttrf LAPACK_GLOBAL(spttrf, SPTTRF)
+#define LAPACK_dpttrf LAPACK_GLOBAL(dpttrf, DPTTRF)
+#define LAPACK_cpttrf LAPACK_GLOBAL(cpttrf, CPTTRF)
+#define LAPACK_zpttrf LAPACK_GLOBAL(zpttrf, ZPTTRF)
+#define LAPACK_ssytrf LAPACK_GLOBAL(ssytrf, SSYTRF)
+#define LAPACK_dsytrf LAPACK_GLOBAL(dsytrf, DSYTRF)
+#define LAPACK_csytrf LAPACK_GLOBAL(csytrf, CSYTRF)
+#define LAPACK_zsytrf LAPACK_GLOBAL(zsytrf, ZSYTRF)
+#define LAPACK_chetrf LAPACK_GLOBAL(chetrf, CHETRF)
+#define LAPACK_zhetrf LAPACK_GLOBAL(zhetrf, ZHETRF)
+#define LAPACK_ssptrf LAPACK_GLOBAL(ssptrf, SSPTRF)
+#define LAPACK_dsptrf LAPACK_GLOBAL(dsptrf, DSPTRF)
+#define LAPACK_csptrf LAPACK_GLOBAL(csptrf, CSPTRF)
+#define LAPACK_zsptrf LAPACK_GLOBAL(zsptrf, ZSPTRF)
+#define LAPACK_chptrf LAPACK_GLOBAL(chptrf, CHPTRF)
+#define LAPACK_zhptrf LAPACK_GLOBAL(zhptrf, ZHPTRF)
+#define LAPACK_sgetrs LAPACK_GLOBAL(sgetrs, SGETRS)
+#define LAPACK_dgetrs LAPACK_GLOBAL(dgetrs, DGETRS)
+#define LAPACK_cgetrs LAPACK_GLOBAL(cgetrs, CGETRS)
+#define LAPACK_zgetrs LAPACK_GLOBAL(zgetrs, ZGETRS)
+#define LAPACK_sgbtrs LAPACK_GLOBAL(sgbtrs, SGBTRS)
+#define LAPACK_dgbtrs LAPACK_GLOBAL(dgbtrs, DGBTRS)
+#define LAPACK_cgbtrs LAPACK_GLOBAL(cgbtrs, CGBTRS)
+#define LAPACK_zgbtrs LAPACK_GLOBAL(zgbtrs, ZGBTRS)
+#define LAPACK_sgttrs LAPACK_GLOBAL(sgttrs, SGTTRS)
+#define LAPACK_dgttrs LAPACK_GLOBAL(dgttrs, DGTTRS)
+#define LAPACK_cgttrs LAPACK_GLOBAL(cgttrs, CGTTRS)
+#define LAPACK_zgttrs LAPACK_GLOBAL(zgttrs, ZGTTRS)
+#define LAPACK_spotrs LAPACK_GLOBAL(spotrs, SPOTRS)
+#define LAPACK_dpotrs LAPACK_GLOBAL(dpotrs, DPOTRS)
+#define LAPACK_cpotrs LAPACK_GLOBAL(cpotrs, CPOTRS)
+#define LAPACK_zpotrs LAPACK_GLOBAL(zpotrs, ZPOTRS)
+#define LAPACK_dpftrs LAPACK_GLOBAL(dpftrs, DPFTRS)
+#define LAPACK_spftrs LAPACK_GLOBAL(spftrs, SPFTRS)
+#define LAPACK_zpftrs LAPACK_GLOBAL(zpftrs, ZPFTRS)
+#define LAPACK_cpftrs LAPACK_GLOBAL(cpftrs, CPFTRS)
+#define LAPACK_spptrs LAPACK_GLOBAL(spptrs, SPPTRS)
+#define LAPACK_dpptrs LAPACK_GLOBAL(dpptrs, DPPTRS)
+#define LAPACK_cpptrs LAPACK_GLOBAL(cpptrs, CPPTRS)
+#define LAPACK_zpptrs LAPACK_GLOBAL(zpptrs, ZPPTRS)
+#define LAPACK_spbtrs LAPACK_GLOBAL(spbtrs, SPBTRS)
+#define LAPACK_dpbtrs LAPACK_GLOBAL(dpbtrs, DPBTRS)
+#define LAPACK_cpbtrs LAPACK_GLOBAL(cpbtrs, CPBTRS)
+#define LAPACK_zpbtrs LAPACK_GLOBAL(zpbtrs, ZPBTRS)
+#define LAPACK_spttrs LAPACK_GLOBAL(spttrs, SPTTRS)
+#define LAPACK_dpttrs LAPACK_GLOBAL(dpttrs, DPTTRS)
+#define LAPACK_cpttrs LAPACK_GLOBAL(cpttrs, CPTTRS)
+#define LAPACK_zpttrs LAPACK_GLOBAL(zpttrs, ZPTTRS)
+#define LAPACK_ssytrs LAPACK_GLOBAL(ssytrs, SSYTRS)
+#define LAPACK_dsytrs LAPACK_GLOBAL(dsytrs, DSYTRS)
+#define LAPACK_csytrs LAPACK_GLOBAL(csytrs, CSYTRS)
+#define LAPACK_zsytrs LAPACK_GLOBAL(zsytrs, ZSYTRS)
+#define LAPACK_chetrs LAPACK_GLOBAL(chetrs, CHETRS)
+#define LAPACK_zhetrs LAPACK_GLOBAL(zhetrs, ZHETRS)
+#define LAPACK_ssptrs LAPACK_GLOBAL(ssptrs, SSPTRS)
+#define LAPACK_dsptrs LAPACK_GLOBAL(dsptrs, DSPTRS)
+#define LAPACK_csptrs LAPACK_GLOBAL(csptrs, CSPTRS)
+#define LAPACK_zsptrs LAPACK_GLOBAL(zsptrs, ZSPTRS)
+#define LAPACK_chptrs LAPACK_GLOBAL(chptrs, CHPTRS)
+#define LAPACK_zhptrs LAPACK_GLOBAL(zhptrs, ZHPTRS)
+#define LAPACK_strtrs LAPACK_GLOBAL(strtrs, STRTRS)
+#define LAPACK_dtrtrs LAPACK_GLOBAL(dtrtrs, DTRTRS)
+#define LAPACK_ctrtrs LAPACK_GLOBAL(ctrtrs, CTRTRS)
+#define LAPACK_ztrtrs LAPACK_GLOBAL(ztrtrs, ZTRTRS)
+#define LAPACK_stptrs LAPACK_GLOBAL(stptrs, STPTRS)
+#define LAPACK_dtptrs LAPACK_GLOBAL(dtptrs, DTPTRS)
+#define LAPACK_ctptrs LAPACK_GLOBAL(ctptrs, CTPTRS)
+#define LAPACK_ztptrs LAPACK_GLOBAL(ztptrs, ZTPTRS)
+#define LAPACK_stbtrs LAPACK_GLOBAL(stbtrs, STBTRS)
+#define LAPACK_dtbtrs LAPACK_GLOBAL(dtbtrs, DTBTRS)
+#define LAPACK_ctbtrs LAPACK_GLOBAL(ctbtrs, CTBTRS)
+#define LAPACK_ztbtrs LAPACK_GLOBAL(ztbtrs, ZTBTRS)
+#define LAPACK_sgecon LAPACK_GLOBAL(sgecon, SGECON)
+#define LAPACK_dgecon LAPACK_GLOBAL(dgecon, DGECON)
+#define LAPACK_cgecon LAPACK_GLOBAL(cgecon, CGECON)
+#define LAPACK_zgecon LAPACK_GLOBAL(zgecon, ZGECON)
+#define LAPACK_sgbcon LAPACK_GLOBAL(sgbcon, SGBCON)
+#define LAPACK_dgbcon LAPACK_GLOBAL(dgbcon, DGBCON)
+#define LAPACK_cgbcon LAPACK_GLOBAL(cgbcon, CGBCON)
+#define LAPACK_zgbcon LAPACK_GLOBAL(zgbcon, ZGBCON)
+#define LAPACK_sgtcon LAPACK_GLOBAL(sgtcon, SGTCON)
+#define LAPACK_dgtcon LAPACK_GLOBAL(dgtcon, DGTCON)
+#define LAPACK_cgtcon LAPACK_GLOBAL(cgtcon, CGTCON)
+#define LAPACK_zgtcon LAPACK_GLOBAL(zgtcon, ZGTCON)
+#define LAPACK_spocon LAPACK_GLOBAL(spocon, SPOCON)
+#define LAPACK_dpocon LAPACK_GLOBAL(dpocon, DPOCON)
+#define LAPACK_cpocon LAPACK_GLOBAL(cpocon, CPOCON)
+#define LAPACK_zpocon LAPACK_GLOBAL(zpocon, ZPOCON)
+#define LAPACK_sppcon LAPACK_GLOBAL(sppcon, SPPCON)
+#define LAPACK_dppcon LAPACK_GLOBAL(dppcon, DPPCON)
+#define LAPACK_cppcon LAPACK_GLOBAL(cppcon, CPPCON)
+#define LAPACK_zppcon LAPACK_GLOBAL(zppcon, ZPPCON)
+#define LAPACK_spbcon LAPACK_GLOBAL(spbcon, SPBCON)
+#define LAPACK_dpbcon LAPACK_GLOBAL(dpbcon, DPBCON)
+#define LAPACK_cpbcon LAPACK_GLOBAL(cpbcon, CPBCON)
+#define LAPACK_zpbcon LAPACK_GLOBAL(zpbcon, ZPBCON)
+#define LAPACK_sptcon LAPACK_GLOBAL(sptcon, SPTCON)
+#define LAPACK_dptcon LAPACK_GLOBAL(dptcon, DPTCON)
+#define LAPACK_cptcon LAPACK_GLOBAL(cptcon, CPTCON)
+#define LAPACK_zptcon LAPACK_GLOBAL(zptcon, ZPTCON)
+#define LAPACK_ssycon LAPACK_GLOBAL(ssycon, SSYCON)
+#define LAPACK_dsycon LAPACK_GLOBAL(dsycon, DSYCON)
+#define LAPACK_csycon LAPACK_GLOBAL(csycon, CSYCON)
+#define LAPACK_zsycon LAPACK_GLOBAL(zsycon, ZSYCON)
+#define LAPACK_checon LAPACK_GLOBAL(checon, CHECON)
+#define LAPACK_zhecon LAPACK_GLOBAL(zhecon, ZHECON)
+#define LAPACK_sspcon LAPACK_GLOBAL(sspcon, SSPCON)
+#define LAPACK_dspcon LAPACK_GLOBAL(dspcon, DSPCON)
+#define LAPACK_cspcon LAPACK_GLOBAL(cspcon, CSPCON)
+#define LAPACK_zspcon LAPACK_GLOBAL(zspcon, ZSPCON)
+#define LAPACK_chpcon LAPACK_GLOBAL(chpcon, CHPCON)
+#define LAPACK_zhpcon LAPACK_GLOBAL(zhpcon, ZHPCON)
+#define LAPACK_strcon LAPACK_GLOBAL(strcon, STRCON)
+#define LAPACK_dtrcon LAPACK_GLOBAL(dtrcon, DTRCON)
+#define LAPACK_ctrcon LAPACK_GLOBAL(ctrcon, CTRCON)
+#define LAPACK_ztrcon LAPACK_GLOBAL(ztrcon, ZTRCON)
+#define LAPACK_stpcon LAPACK_GLOBAL(stpcon, STPCON)
+#define LAPACK_dtpcon LAPACK_GLOBAL(dtpcon, DTPCON)
+#define LAPACK_ctpcon LAPACK_GLOBAL(ctpcon, CTPCON)
+#define LAPACK_ztpcon LAPACK_GLOBAL(ztpcon, ZTPCON)
+#define LAPACK_stbcon LAPACK_GLOBAL(stbcon, STBCON)
+#define LAPACK_dtbcon LAPACK_GLOBAL(dtbcon, DTBCON)
+#define LAPACK_ctbcon LAPACK_GLOBAL(ctbcon, CTBCON)
+#define LAPACK_ztbcon LAPACK_GLOBAL(ztbcon, ZTBCON)
+#define LAPACK_sgerfs LAPACK_GLOBAL(sgerfs, SGERFS)
+#define LAPACK_dgerfs LAPACK_GLOBAL(dgerfs, DGERFS)
+#define LAPACK_cgerfs LAPACK_GLOBAL(cgerfs, CGERFS)
+#define LAPACK_zgerfs LAPACK_GLOBAL(zgerfs, ZGERFS)
+#define LAPACK_dgerfsx LAPACK_GLOBAL(dgerfsx, DGERFSX)
+#define LAPACK_sgerfsx LAPACK_GLOBAL(sgerfsx, SGERFSX)
+#define LAPACK_zgerfsx LAPACK_GLOBAL(zgerfsx, ZGERFSX)
+#define LAPACK_cgerfsx LAPACK_GLOBAL(cgerfsx, CGERFSX)
+#define LAPACK_sgbrfs LAPACK_GLOBAL(sgbrfs, SGBRFS)
+#define LAPACK_dgbrfs LAPACK_GLOBAL(dgbrfs, DGBRFS)
+#define LAPACK_cgbrfs LAPACK_GLOBAL(cgbrfs, CGBRFS)
+#define LAPACK_zgbrfs LAPACK_GLOBAL(zgbrfs, ZGBRFS)
+#define LAPACK_dgbrfsx LAPACK_GLOBAL(dgbrfsx, DGBRFSX)
+#define LAPACK_sgbrfsx LAPACK_GLOBAL(sgbrfsx, SGBRFSX)
+#define LAPACK_zgbrfsx LAPACK_GLOBAL(zgbrfsx, ZGBRFSX)
+#define LAPACK_cgbrfsx LAPACK_GLOBAL(cgbrfsx, CGBRFSX)
+#define LAPACK_sgtrfs LAPACK_GLOBAL(sgtrfs, SGTRFS)
+#define LAPACK_dgtrfs LAPACK_GLOBAL(dgtrfs, DGTRFS)
+#define LAPACK_cgtrfs LAPACK_GLOBAL(cgtrfs, CGTRFS)
+#define LAPACK_zgtrfs LAPACK_GLOBAL(zgtrfs, ZGTRFS)
+#define LAPACK_sporfs LAPACK_GLOBAL(sporfs, SPORFS)
+#define LAPACK_dporfs LAPACK_GLOBAL(dporfs, DPORFS)
+#define LAPACK_cporfs LAPACK_GLOBAL(cporfs, CPORFS)
+#define LAPACK_zporfs LAPACK_GLOBAL(zporfs, ZPORFS)
+#define LAPACK_dporfsx LAPACK_GLOBAL(dporfsx, DPORFSX)
+#define LAPACK_sporfsx LAPACK_GLOBAL(sporfsx, SPORFSX)
+#define LAPACK_zporfsx LAPACK_GLOBAL(zporfsx, ZPORFSX)
+#define LAPACK_cporfsx LAPACK_GLOBAL(cporfsx, CPORFSX)
+#define LAPACK_spprfs LAPACK_GLOBAL(spprfs, SPPRFS)
+#define LAPACK_dpprfs LAPACK_GLOBAL(dpprfs, DPPRFS)
+#define LAPACK_cpprfs LAPACK_GLOBAL(cpprfs, CPPRFS)
+#define LAPACK_zpprfs LAPACK_GLOBAL(zpprfs, ZPPRFS)
+#define LAPACK_spbrfs LAPACK_GLOBAL(spbrfs, SPBRFS)
+#define LAPACK_dpbrfs LAPACK_GLOBAL(dpbrfs, DPBRFS)
+#define LAPACK_cpbrfs LAPACK_GLOBAL(cpbrfs, CPBRFS)
+#define LAPACK_zpbrfs LAPACK_GLOBAL(zpbrfs, ZPBRFS)
+#define LAPACK_sptrfs LAPACK_GLOBAL(sptrfs, SPTRFS)
+#define LAPACK_dptrfs LAPACK_GLOBAL(dptrfs, DPTRFS)
+#define LAPACK_cptrfs LAPACK_GLOBAL(cptrfs, CPTRFS)
+#define LAPACK_zptrfs LAPACK_GLOBAL(zptrfs, ZPTRFS)
+#define LAPACK_ssyrfs LAPACK_GLOBAL(ssyrfs, SSYRFS)
+#define LAPACK_dsyrfs LAPACK_GLOBAL(dsyrfs, DSYRFS)
+#define LAPACK_csyrfs LAPACK_GLOBAL(csyrfs, CSYRFS)
+#define LAPACK_zsyrfs LAPACK_GLOBAL(zsyrfs, ZSYRFS)
+#define LAPACK_dsyrfsx LAPACK_GLOBAL(dsyrfsx, DSYRFSX)
+#define LAPACK_ssyrfsx LAPACK_GLOBAL(ssyrfsx, SSYRFSX)
+#define LAPACK_zsyrfsx LAPACK_GLOBAL(zsyrfsx, ZSYRFSX)
+#define LAPACK_csyrfsx LAPACK_GLOBAL(csyrfsx, CSYRFSX)
+#define LAPACK_cherfs LAPACK_GLOBAL(cherfs, CHERFS)
+#define LAPACK_zherfs LAPACK_GLOBAL(zherfs, ZHERFS)
+#define LAPACK_zherfsx LAPACK_GLOBAL(zherfsx, ZHERFSX)
+#define LAPACK_cherfsx LAPACK_GLOBAL(cherfsx, CHERFSX)
+#define LAPACK_ssprfs LAPACK_GLOBAL(ssprfs, SSPRFS)
+#define LAPACK_dsprfs LAPACK_GLOBAL(dsprfs, DSPRFS)
+#define LAPACK_csprfs LAPACK_GLOBAL(csprfs, CSPRFS)
+#define LAPACK_zsprfs LAPACK_GLOBAL(zsprfs, ZSPRFS)
+#define LAPACK_chprfs LAPACK_GLOBAL(chprfs, CHPRFS)
+#define LAPACK_zhprfs LAPACK_GLOBAL(zhprfs, ZHPRFS)
+#define LAPACK_strrfs LAPACK_GLOBAL(strrfs, STRRFS)
+#define LAPACK_dtrrfs LAPACK_GLOBAL(dtrrfs, DTRRFS)
+#define LAPACK_ctrrfs LAPACK_GLOBAL(ctrrfs, CTRRFS)
+#define LAPACK_ztrrfs LAPACK_GLOBAL(ztrrfs, ZTRRFS)
+#define LAPACK_stprfs LAPACK_GLOBAL(stprfs, STPRFS)
+#define LAPACK_dtprfs LAPACK_GLOBAL(dtprfs, DTPRFS)
+#define LAPACK_ctprfs LAPACK_GLOBAL(ctprfs, CTPRFS)
+#define LAPACK_ztprfs LAPACK_GLOBAL(ztprfs, ZTPRFS)
+#define LAPACK_stbrfs LAPACK_GLOBAL(stbrfs, STBRFS)
+#define LAPACK_dtbrfs LAPACK_GLOBAL(dtbrfs, DTBRFS)
+#define LAPACK_ctbrfs LAPACK_GLOBAL(ctbrfs, CTBRFS)
+#define LAPACK_ztbrfs LAPACK_GLOBAL(ztbrfs, ZTBRFS)
+#define LAPACK_sgetri LAPACK_GLOBAL(sgetri, SGETRI)
+#define LAPACK_dgetri LAPACK_GLOBAL(dgetri, DGETRI)
+#define LAPACK_cgetri LAPACK_GLOBAL(cgetri, CGETRI)
+#define LAPACK_zgetri LAPACK_GLOBAL(zgetri, ZGETRI)
+#define LAPACK_spotri LAPACK_GLOBAL(spotri, SPOTRI)
+#define LAPACK_dpotri LAPACK_GLOBAL(dpotri, DPOTRI)
+#define LAPACK_cpotri LAPACK_GLOBAL(cpotri, CPOTRI)
+#define LAPACK_zpotri LAPACK_GLOBAL(zpotri, ZPOTRI)
+#define LAPACK_dpftri LAPACK_GLOBAL(dpftri, DPFTRI)
+#define LAPACK_spftri LAPACK_GLOBAL(spftri, SPFTRI)
+#define LAPACK_zpftri LAPACK_GLOBAL(zpftri, ZPFTRI)
+#define LAPACK_cpftri LAPACK_GLOBAL(cpftri, CPFTRI)
+#define LAPACK_spptri LAPACK_GLOBAL(spptri, SPPTRI)
+#define LAPACK_dpptri LAPACK_GLOBAL(dpptri, DPPTRI)
+#define LAPACK_cpptri LAPACK_GLOBAL(cpptri, CPPTRI)
+#define LAPACK_zpptri LAPACK_GLOBAL(zpptri, ZPPTRI)
+#define LAPACK_ssytri LAPACK_GLOBAL(ssytri, SSYTRI)
+#define LAPACK_dsytri LAPACK_GLOBAL(dsytri, DSYTRI)
+#define LAPACK_csytri LAPACK_GLOBAL(csytri, CSYTRI)
+#define LAPACK_zsytri LAPACK_GLOBAL(zsytri, ZSYTRI)
+#define LAPACK_chetri LAPACK_GLOBAL(chetri, CHETRI)
+#define LAPACK_zhetri LAPACK_GLOBAL(zhetri, ZHETRI)
+#define LAPACK_ssptri LAPACK_GLOBAL(ssptri, SSPTRI)
+#define LAPACK_dsptri LAPACK_GLOBAL(dsptri, DSPTRI)
+#define LAPACK_csptri LAPACK_GLOBAL(csptri, CSPTRI)
+#define LAPACK_zsptri LAPACK_GLOBAL(zsptri, ZSPTRI)
+#define LAPACK_chptri LAPACK_GLOBAL(chptri, CHPTRI)
+#define LAPACK_zhptri LAPACK_GLOBAL(zhptri, ZHPTRI)
+#define LAPACK_strtri LAPACK_GLOBAL(strtri, STRTRI)
+#define LAPACK_dtrtri LAPACK_GLOBAL(dtrtri, DTRTRI)
+#define LAPACK_ctrtri LAPACK_GLOBAL(ctrtri, CTRTRI)
+#define LAPACK_ztrtri LAPACK_GLOBAL(ztrtri, ZTRTRI)
+#define LAPACK_dtftri LAPACK_GLOBAL(dtftri, DTFTRI)
+#define LAPACK_stftri LAPACK_GLOBAL(stftri, STFTRI)
+#define LAPACK_ztftri LAPACK_GLOBAL(ztftri, ZTFTRI)
+#define LAPACK_ctftri LAPACK_GLOBAL(ctftri, CTFTRI)
+#define LAPACK_stptri LAPACK_GLOBAL(stptri, STPTRI)
+#define LAPACK_dtptri LAPACK_GLOBAL(dtptri, DTPTRI)
+#define LAPACK_ctptri LAPACK_GLOBAL(ctptri, CTPTRI)
+#define LAPACK_ztptri LAPACK_GLOBAL(ztptri, ZTPTRI)
+#define LAPACK_sgeequ LAPACK_GLOBAL(sgeequ, SGEEQU)
+#define LAPACK_dgeequ LAPACK_GLOBAL(dgeequ, DGEEQU)
+#define LAPACK_cgeequ LAPACK_GLOBAL(cgeequ, CGEEQU)
+#define LAPACK_zgeequ LAPACK_GLOBAL(zgeequ, ZGEEQU)
+#define LAPACK_dgeequb LAPACK_GLOBAL(dgeequb, DGEEQUB)
+#define LAPACK_sgeequb LAPACK_GLOBAL(sgeequb, SGEEQUB)
+#define LAPACK_zgeequb LAPACK_GLOBAL(zgeequb, ZGEEQUB)
+#define LAPACK_cgeequb LAPACK_GLOBAL(cgeequb, CGEEQUB)
+#define LAPACK_sgbequ LAPACK_GLOBAL(sgbequ, SGBEQU)
+#define LAPACK_dgbequ LAPACK_GLOBAL(dgbequ, DGBEQU)
+#define LAPACK_cgbequ LAPACK_GLOBAL(cgbequ, CGBEQU)
+#define LAPACK_zgbequ LAPACK_GLOBAL(zgbequ, ZGBEQU)
+#define LAPACK_dgbequb LAPACK_GLOBAL(dgbequb, DGBEQUB)
+#define LAPACK_sgbequb LAPACK_GLOBAL(sgbequb, SGBEQUB)
+#define LAPACK_zgbequb LAPACK_GLOBAL(zgbequb, ZGBEQUB)
+#define LAPACK_cgbequb LAPACK_GLOBAL(cgbequb, CGBEQUB)
+#define LAPACK_spoequ LAPACK_GLOBAL(spoequ, SPOEQU)
+#define LAPACK_dpoequ LAPACK_GLOBAL(dpoequ, DPOEQU)
+#define LAPACK_cpoequ LAPACK_GLOBAL(cpoequ, CPOEQU)
+#define LAPACK_zpoequ LAPACK_GLOBAL(zpoequ, ZPOEQU)
+#define LAPACK_dpoequb LAPACK_GLOBAL(dpoequb, DPOEQUB)
+#define LAPACK_spoequb LAPACK_GLOBAL(spoequb, SPOEQUB)
+#define LAPACK_zpoequb LAPACK_GLOBAL(zpoequb, ZPOEQUB)
+#define LAPACK_cpoequb LAPACK_GLOBAL(cpoequb, CPOEQUB)
+#define LAPACK_sppequ LAPACK_GLOBAL(sppequ, SPPEQU)
+#define LAPACK_dppequ LAPACK_GLOBAL(dppequ, DPPEQU)
+#define LAPACK_cppequ LAPACK_GLOBAL(cppequ, CPPEQU)
+#define LAPACK_zppequ LAPACK_GLOBAL(zppequ, ZPPEQU)
+#define LAPACK_spbequ LAPACK_GLOBAL(spbequ, SPBEQU)
+#define LAPACK_dpbequ LAPACK_GLOBAL(dpbequ, DPBEQU)
+#define LAPACK_cpbequ LAPACK_GLOBAL(cpbequ, CPBEQU)
+#define LAPACK_zpbequ LAPACK_GLOBAL(zpbequ, ZPBEQU)
+#define LAPACK_dsyequb LAPACK_GLOBAL(dsyequb, DSYEQUB)
+#define LAPACK_ssyequb LAPACK_GLOBAL(ssyequb, SSYEQUB)
+#define LAPACK_zsyequb LAPACK_GLOBAL(zsyequb, ZSYEQUB)
+#define LAPACK_csyequb LAPACK_GLOBAL(csyequb, CSYEQUB)
+#define LAPACK_zheequb LAPACK_GLOBAL(zheequb, ZHEEQUB)
+#define LAPACK_cheequb LAPACK_GLOBAL(cheequb, CHEEQUB)
+#define LAPACK_sgesv LAPACK_GLOBAL(sgesv, SGESV)
+#define LAPACK_dgesv LAPACK_GLOBAL(dgesv, DGESV)
+#define LAPACK_cgesv LAPACK_GLOBAL(cgesv, CGESV)
+#define LAPACK_zgesv LAPACK_GLOBAL(zgesv, ZGESV)
+#define LAPACK_dsgesv LAPACK_GLOBAL(dsgesv, DSGESV)
+#define LAPACK_zcgesv LAPACK_GLOBAL(zcgesv, ZCGESV)
+#define LAPACK_sgesvx LAPACK_GLOBAL(sgesvx, SGESVX)
+#define LAPACK_dgesvx LAPACK_GLOBAL(dgesvx, DGESVX)
+#define LAPACK_cgesvx LAPACK_GLOBAL(cgesvx, CGESVX)
+#define LAPACK_zgesvx LAPACK_GLOBAL(zgesvx, ZGESVX)
+#define LAPACK_dgesvxx LAPACK_GLOBAL(dgesvxx, DGESVXX)
+#define LAPACK_sgesvxx LAPACK_GLOBAL(sgesvxx, SGESVXX)
+#define LAPACK_zgesvxx LAPACK_GLOBAL(zgesvxx, ZGESVXX)
+#define LAPACK_cgesvxx LAPACK_GLOBAL(cgesvxx, CGESVXX)
+#define LAPACK_sgbsv LAPACK_GLOBAL(sgbsv, SGBSV)
+#define LAPACK_dgbsv LAPACK_GLOBAL(dgbsv, DGBSV)
+#define LAPACK_cgbsv LAPACK_GLOBAL(cgbsv, CGBSV)
+#define LAPACK_zgbsv LAPACK_GLOBAL(zgbsv, ZGBSV)
+#define LAPACK_sgbsvx LAPACK_GLOBAL(sgbsvx, SGBSVX)
+#define LAPACK_dgbsvx LAPACK_GLOBAL(dgbsvx, DGBSVX)
+#define LAPACK_cgbsvx LAPACK_GLOBAL(cgbsvx, CGBSVX)
+#define LAPACK_zgbsvx LAPACK_GLOBAL(zgbsvx, ZGBSVX)
+#define LAPACK_dgbsvxx LAPACK_GLOBAL(dgbsvxx, DGBSVXX)
+#define LAPACK_sgbsvxx LAPACK_GLOBAL(sgbsvxx, SGBSVXX)
+#define LAPACK_zgbsvxx LAPACK_GLOBAL(zgbsvxx, ZGBSVXX)
+#define LAPACK_cgbsvxx LAPACK_GLOBAL(cgbsvxx, CGBSVXX)
+#define LAPACK_sgtsv LAPACK_GLOBAL(sgtsv, SGTSV)
+#define LAPACK_dgtsv LAPACK_GLOBAL(dgtsv, DGTSV)
+#define LAPACK_cgtsv LAPACK_GLOBAL(cgtsv, CGTSV)
+#define LAPACK_zgtsv LAPACK_GLOBAL(zgtsv, ZGTSV)
+#define LAPACK_sgtsvx LAPACK_GLOBAL(sgtsvx, SGTSVX)
+#define LAPACK_dgtsvx LAPACK_GLOBAL(dgtsvx, DGTSVX)
+#define LAPACK_cgtsvx LAPACK_GLOBAL(cgtsvx, CGTSVX)
+#define LAPACK_zgtsvx LAPACK_GLOBAL(zgtsvx, ZGTSVX)
+#define LAPACK_sposv LAPACK_GLOBAL(sposv, SPOSV)
+#define LAPACK_dposv LAPACK_GLOBAL(dposv, DPOSV)
+#define LAPACK_cposv LAPACK_GLOBAL(cposv, CPOSV)
+#define LAPACK_zposv LAPACK_GLOBAL(zposv, ZPOSV)
+#define LAPACK_dsposv LAPACK_GLOBAL(dsposv, DSPOSV)
+#define LAPACK_zcposv LAPACK_GLOBAL(zcposv, ZCPOSV)
+#define LAPACK_sposvx LAPACK_GLOBAL(sposvx, SPOSVX)
+#define LAPACK_dposvx LAPACK_GLOBAL(dposvx, DPOSVX)
+#define LAPACK_cposvx LAPACK_GLOBAL(cposvx, CPOSVX)
+#define LAPACK_zposvx LAPACK_GLOBAL(zposvx, ZPOSVX)
+#define LAPACK_dposvxx LAPACK_GLOBAL(dposvxx, DPOSVXX)
+#define LAPACK_sposvxx LAPACK_GLOBAL(sposvxx, SPOSVXX)
+#define LAPACK_zposvxx LAPACK_GLOBAL(zposvxx, ZPOSVXX)
+#define LAPACK_cposvxx LAPACK_GLOBAL(cposvxx, CPOSVXX)
+#define LAPACK_sppsv LAPACK_GLOBAL(sppsv, SPPSV)
+#define LAPACK_dppsv LAPACK_GLOBAL(dppsv, DPPSV)
+#define LAPACK_cppsv LAPACK_GLOBAL(cppsv, CPPSV)
+#define LAPACK_zppsv LAPACK_GLOBAL(zppsv, ZPPSV)
+#define LAPACK_sppsvx LAPACK_GLOBAL(sppsvx, SPPSVX)
+#define LAPACK_dppsvx LAPACK_GLOBAL(dppsvx, DPPSVX)
+#define LAPACK_cppsvx LAPACK_GLOBAL(cppsvx, CPPSVX)
+#define LAPACK_zppsvx LAPACK_GLOBAL(zppsvx, ZPPSVX)
+#define LAPACK_spbsv LAPACK_GLOBAL(spbsv, SPBSV)
+#define LAPACK_dpbsv LAPACK_GLOBAL(dpbsv, DPBSV)
+#define LAPACK_cpbsv LAPACK_GLOBAL(cpbsv, CPBSV)
+#define LAPACK_zpbsv LAPACK_GLOBAL(zpbsv, ZPBSV)
+#define LAPACK_spbsvx LAPACK_GLOBAL(spbsvx, SPBSVX)
+#define LAPACK_dpbsvx LAPACK_GLOBAL(dpbsvx, DPBSVX)
+#define LAPACK_cpbsvx LAPACK_GLOBAL(cpbsvx, CPBSVX)
+#define LAPACK_zpbsvx LAPACK_GLOBAL(zpbsvx, ZPBSVX)
+#define LAPACK_sptsv LAPACK_GLOBAL(sptsv, SPTSV)
+#define LAPACK_dptsv LAPACK_GLOBAL(dptsv, DPTSV)
+#define LAPACK_cptsv LAPACK_GLOBAL(cptsv, CPTSV)
+#define LAPACK_zptsv LAPACK_GLOBAL(zptsv, ZPTSV)
+#define LAPACK_sptsvx LAPACK_GLOBAL(sptsvx, SPTSVX)
+#define LAPACK_dptsvx LAPACK_GLOBAL(dptsvx, DPTSVX)
+#define LAPACK_cptsvx LAPACK_GLOBAL(cptsvx, CPTSVX)
+#define LAPACK_zptsvx LAPACK_GLOBAL(zptsvx, ZPTSVX)
+#define LAPACK_ssysv LAPACK_GLOBAL(ssysv, SSYSV)
+#define LAPACK_dsysv LAPACK_GLOBAL(dsysv, DSYSV)
+#define LAPACK_csysv LAPACK_GLOBAL(csysv, CSYSV)
+#define LAPACK_zsysv LAPACK_GLOBAL(zsysv, ZSYSV)
+#define LAPACK_ssysvx LAPACK_GLOBAL(ssysvx, SSYSVX)
+#define LAPACK_dsysvx LAPACK_GLOBAL(dsysvx, DSYSVX)
+#define LAPACK_csysvx LAPACK_GLOBAL(csysvx, CSYSVX)
+#define LAPACK_zsysvx LAPACK_GLOBAL(zsysvx, ZSYSVX)
+#define LAPACK_dsysvxx LAPACK_GLOBAL(dsysvxx, DSYSVXX)
+#define LAPACK_ssysvxx LAPACK_GLOBAL(ssysvxx, SSYSVXX)
+#define LAPACK_zsysvxx LAPACK_GLOBAL(zsysvxx, ZSYSVXX)
+#define LAPACK_csysvxx LAPACK_GLOBAL(csysvxx, CSYSVXX)
+#define LAPACK_chesv LAPACK_GLOBAL(chesv, CHESV)
+#define LAPACK_zhesv LAPACK_GLOBAL(zhesv, ZHESV)
+#define LAPACK_chesvx LAPACK_GLOBAL(chesvx, CHESVX)
+#define LAPACK_zhesvx LAPACK_GLOBAL(zhesvx, ZHESVX)
+#define LAPACK_zhesvxx LAPACK_GLOBAL(zhesvxx, ZHESVXX)
+#define LAPACK_chesvxx LAPACK_GLOBAL(chesvxx, CHESVXX)
+#define LAPACK_sspsv LAPACK_GLOBAL(sspsv, SSPSV)
+#define LAPACK_dspsv LAPACK_GLOBAL(dspsv, DSPSV)
+#define LAPACK_cspsv LAPACK_GLOBAL(cspsv, CSPSV)
+#define LAPACK_zspsv LAPACK_GLOBAL(zspsv, ZSPSV)
+#define LAPACK_sspsvx LAPACK_GLOBAL(sspsvx, SSPSVX)
+#define LAPACK_dspsvx LAPACK_GLOBAL(dspsvx, DSPSVX)
+#define LAPACK_cspsvx LAPACK_GLOBAL(cspsvx, CSPSVX)
+#define LAPACK_zspsvx LAPACK_GLOBAL(zspsvx, ZSPSVX)
+#define LAPACK_chpsv LAPACK_GLOBAL(chpsv, CHPSV)
+#define LAPACK_zhpsv LAPACK_GLOBAL(zhpsv, ZHPSV)
+#define LAPACK_chpsvx LAPACK_GLOBAL(chpsvx, CHPSVX)
+#define LAPACK_zhpsvx LAPACK_GLOBAL(zhpsvx, ZHPSVX)
+#define LAPACK_sgeqrf LAPACK_GLOBAL(sgeqrf, SGEQRF)
+#define LAPACK_dgeqrf LAPACK_GLOBAL(dgeqrf, DGEQRF)
+#define LAPACK_cgeqrf LAPACK_GLOBAL(cgeqrf, CGEQRF)
+#define LAPACK_zgeqrf LAPACK_GLOBAL(zgeqrf, ZGEQRF)
+#define LAPACK_sgeqpf LAPACK_GLOBAL(sgeqpf, SGEQPF)
+#define LAPACK_dgeqpf LAPACK_GLOBAL(dgeqpf, DGEQPF)
+#define LAPACK_cgeqpf LAPACK_GLOBAL(cgeqpf, CGEQPF)
+#define LAPACK_zgeqpf LAPACK_GLOBAL(zgeqpf, ZGEQPF)
+#define LAPACK_sgeqp3 LAPACK_GLOBAL(sgeqp3, SGEQP3)
+#define LAPACK_dgeqp3 LAPACK_GLOBAL(dgeqp3, DGEQP3)
+#define LAPACK_cgeqp3 LAPACK_GLOBAL(cgeqp3, CGEQP3)
+#define LAPACK_zgeqp3 LAPACK_GLOBAL(zgeqp3, ZGEQP3)
+#define LAPACK_sorgqr LAPACK_GLOBAL(sorgqr, SORGQR)
+#define LAPACK_dorgqr LAPACK_GLOBAL(dorgqr, DORGQR)
+#define LAPACK_sormqr LAPACK_GLOBAL(sormqr, SORMQR)
+#define LAPACK_dormqr LAPACK_GLOBAL(dormqr, DORMQR)
+#define LAPACK_cungqr LAPACK_GLOBAL(cungqr, CUNGQR)
+#define LAPACK_zungqr LAPACK_GLOBAL(zungqr, ZUNGQR)
+#define LAPACK_cunmqr LAPACK_GLOBAL(cunmqr, CUNMQR)
+#define LAPACK_zunmqr LAPACK_GLOBAL(zunmqr, ZUNMQR)
+#define LAPACK_sgelqf LAPACK_GLOBAL(sgelqf, SGELQF)
+#define LAPACK_dgelqf LAPACK_GLOBAL(dgelqf, DGELQF)
+#define LAPACK_cgelqf LAPACK_GLOBAL(cgelqf, CGELQF)
+#define LAPACK_zgelqf LAPACK_GLOBAL(zgelqf, ZGELQF)
+#define LAPACK_sorglq LAPACK_GLOBAL(sorglq, SORGLQ)
+#define LAPACK_dorglq LAPACK_GLOBAL(dorglq, DORGLQ)
+#define LAPACK_sormlq LAPACK_GLOBAL(sormlq, SORMLQ)
+#define LAPACK_dormlq LAPACK_GLOBAL(dormlq, DORMLQ)
+#define LAPACK_cunglq LAPACK_GLOBAL(cunglq, CUNGLQ)
+#define LAPACK_zunglq LAPACK_GLOBAL(zunglq, ZUNGLQ)
+#define LAPACK_cunmlq LAPACK_GLOBAL(cunmlq, CUNMLQ)
+#define LAPACK_zunmlq LAPACK_GLOBAL(zunmlq, ZUNMLQ)
+#define LAPACK_sgeqlf LAPACK_GLOBAL(sgeqlf, SGEQLF)
+#define LAPACK_dgeqlf LAPACK_GLOBAL(dgeqlf, DGEQLF)
+#define LAPACK_cgeqlf LAPACK_GLOBAL(cgeqlf, CGEQLF)
+#define LAPACK_zgeqlf LAPACK_GLOBAL(zgeqlf, ZGEQLF)
+#define LAPACK_sorgql LAPACK_GLOBAL(sorgql, SORGQL)
+#define LAPACK_dorgql LAPACK_GLOBAL(dorgql, DORGQL)
+#define LAPACK_cungql LAPACK_GLOBAL(cungql, CUNGQL)
+#define LAPACK_zungql LAPACK_GLOBAL(zungql, ZUNGQL)
+#define LAPACK_sormql LAPACK_GLOBAL(sormql, SORMQL)
+#define LAPACK_dormql LAPACK_GLOBAL(dormql, DORMQL)
+#define LAPACK_cunmql LAPACK_GLOBAL(cunmql, CUNMQL)
+#define LAPACK_zunmql LAPACK_GLOBAL(zunmql, ZUNMQL)
+#define LAPACK_sgerqf LAPACK_GLOBAL(sgerqf, SGERQF)
+#define LAPACK_dgerqf LAPACK_GLOBAL(dgerqf, DGERQF)
+#define LAPACK_cgerqf LAPACK_GLOBAL(cgerqf, CGERQF)
+#define LAPACK_zgerqf LAPACK_GLOBAL(zgerqf, ZGERQF)
+#define LAPACK_sorgrq LAPACK_GLOBAL(sorgrq, SORGRQ)
+#define LAPACK_dorgrq LAPACK_GLOBAL(dorgrq, DORGRQ)
+#define LAPACK_cungrq LAPACK_GLOBAL(cungrq, CUNGRQ)
+#define LAPACK_zungrq LAPACK_GLOBAL(zungrq, ZUNGRQ)
+#define LAPACK_sormrq LAPACK_GLOBAL(sormrq, SORMRQ)
+#define LAPACK_dormrq LAPACK_GLOBAL(dormrq, DORMRQ)
+#define LAPACK_cunmrq LAPACK_GLOBAL(cunmrq, CUNMRQ)
+#define LAPACK_zunmrq LAPACK_GLOBAL(zunmrq, ZUNMRQ)
+#define LAPACK_stzrzf LAPACK_GLOBAL(stzrzf, STZRZF)
+#define LAPACK_dtzrzf LAPACK_GLOBAL(dtzrzf, DTZRZF)
+#define LAPACK_ctzrzf LAPACK_GLOBAL(ctzrzf, CTZRZF)
+#define LAPACK_ztzrzf LAPACK_GLOBAL(ztzrzf, ZTZRZF)
+#define LAPACK_sormrz LAPACK_GLOBAL(sormrz, SORMRZ)
+#define LAPACK_dormrz LAPACK_GLOBAL(dormrz, DORMRZ)
+#define LAPACK_cunmrz LAPACK_GLOBAL(cunmrz, CUNMRZ)
+#define LAPACK_zunmrz LAPACK_GLOBAL(zunmrz, ZUNMRZ)
+#define LAPACK_sggqrf LAPACK_GLOBAL(sggqrf, SGGQRF)
+#define LAPACK_dggqrf LAPACK_GLOBAL(dggqrf, DGGQRF)
+#define LAPACK_cggqrf LAPACK_GLOBAL(cggqrf, CGGQRF)
+#define LAPACK_zggqrf LAPACK_GLOBAL(zggqrf, ZGGQRF)
+#define LAPACK_sggrqf LAPACK_GLOBAL(sggrqf, SGGRQF)
+#define LAPACK_dggrqf LAPACK_GLOBAL(dggrqf, DGGRQF)
+#define LAPACK_cggrqf LAPACK_GLOBAL(cggrqf, CGGRQF)
+#define LAPACK_zggrqf LAPACK_GLOBAL(zggrqf, ZGGRQF)
+#define LAPACK_sgebrd LAPACK_GLOBAL(sgebrd, SGEBRD)
+#define LAPACK_dgebrd LAPACK_GLOBAL(dgebrd, DGEBRD)
+#define LAPACK_cgebrd LAPACK_GLOBAL(cgebrd, CGEBRD)
+#define LAPACK_zgebrd LAPACK_GLOBAL(zgebrd, ZGEBRD)
+#define LAPACK_sgbbrd LAPACK_GLOBAL(sgbbrd, SGBBRD)
+#define LAPACK_dgbbrd LAPACK_GLOBAL(dgbbrd, DGBBRD)
+#define LAPACK_cgbbrd LAPACK_GLOBAL(cgbbrd, CGBBRD)
+#define LAPACK_zgbbrd LAPACK_GLOBAL(zgbbrd, ZGBBRD)
+#define LAPACK_sorgbr LAPACK_GLOBAL(sorgbr, SORGBR)
+#define LAPACK_dorgbr LAPACK_GLOBAL(dorgbr, DORGBR)
+#define LAPACK_sormbr LAPACK_GLOBAL(sormbr, SORMBR)
+#define LAPACK_dormbr LAPACK_GLOBAL(dormbr, DORMBR)
+#define LAPACK_cungbr LAPACK_GLOBAL(cungbr, CUNGBR)
+#define LAPACK_zungbr LAPACK_GLOBAL(zungbr, ZUNGBR)
+#define LAPACK_cunmbr LAPACK_GLOBAL(cunmbr, CUNMBR)
+#define LAPACK_zunmbr LAPACK_GLOBAL(zunmbr, ZUNMBR)
+#define LAPACK_sbdsqr LAPACK_GLOBAL(sbdsqr, SBDSQR)
+#define LAPACK_dbdsqr LAPACK_GLOBAL(dbdsqr, DBDSQR)
+#define LAPACK_cbdsqr LAPACK_GLOBAL(cbdsqr, CBDSQR)
+#define LAPACK_zbdsqr LAPACK_GLOBAL(zbdsqr, ZBDSQR)
+#define LAPACK_sbdsdc LAPACK_GLOBAL(sbdsdc, SBDSDC)
+#define LAPACK_dbdsdc LAPACK_GLOBAL(dbdsdc, DBDSDC)
+#define LAPACK_ssytrd LAPACK_GLOBAL(ssytrd, SSYTRD)
+#define LAPACK_dsytrd LAPACK_GLOBAL(dsytrd, DSYTRD)
+#define LAPACK_sorgtr LAPACK_GLOBAL(sorgtr, SORGTR)
+#define LAPACK_dorgtr LAPACK_GLOBAL(dorgtr, DORGTR)
+#define LAPACK_sormtr LAPACK_GLOBAL(sormtr, SORMTR)
+#define LAPACK_dormtr LAPACK_GLOBAL(dormtr, DORMTR)
+#define LAPACK_chetrd LAPACK_GLOBAL(chetrd, CHETRD)
+#define LAPACK_zhetrd LAPACK_GLOBAL(zhetrd, ZHETRD)
+#define LAPACK_cungtr LAPACK_GLOBAL(cungtr, CUNGTR)
+#define LAPACK_zungtr LAPACK_GLOBAL(zungtr, ZUNGTR)
+#define LAPACK_cunmtr LAPACK_GLOBAL(cunmtr, CUNMTR)
+#define LAPACK_zunmtr LAPACK_GLOBAL(zunmtr, ZUNMTR)
+#define LAPACK_ssptrd LAPACK_GLOBAL(ssptrd, SSPTRD)
+#define LAPACK_dsptrd LAPACK_GLOBAL(dsptrd, DSPTRD)
+#define LAPACK_sopgtr LAPACK_GLOBAL(sopgtr, SOPGTR)
+#define LAPACK_dopgtr LAPACK_GLOBAL(dopgtr, DOPGTR)
+#define LAPACK_sopmtr LAPACK_GLOBAL(sopmtr, SOPMTR)
+#define LAPACK_dopmtr LAPACK_GLOBAL(dopmtr, DOPMTR)
+#define LAPACK_chptrd LAPACK_GLOBAL(chptrd, CHPTRD)
+#define LAPACK_zhptrd LAPACK_GLOBAL(zhptrd, ZHPTRD)
+#define LAPACK_cupgtr LAPACK_GLOBAL(cupgtr, CUPGTR)
+#define LAPACK_zupgtr LAPACK_GLOBAL(zupgtr, ZUPGTR)
+#define LAPACK_cupmtr LAPACK_GLOBAL(cupmtr, CUPMTR)
+#define LAPACK_zupmtr LAPACK_GLOBAL(zupmtr, ZUPMTR)
+#define LAPACK_ssbtrd LAPACK_GLOBAL(ssbtrd, SSBTRD)
+#define LAPACK_dsbtrd LAPACK_GLOBAL(dsbtrd, DSBTRD)
+#define LAPACK_chbtrd LAPACK_GLOBAL(chbtrd, CHBTRD)
+#define LAPACK_zhbtrd LAPACK_GLOBAL(zhbtrd, ZHBTRD)
+#define LAPACK_ssterf LAPACK_GLOBAL(ssterf, SSTERF)
+#define LAPACK_dsterf LAPACK_GLOBAL(dsterf, DSTERF)
+#define LAPACK_ssteqr LAPACK_GLOBAL(ssteqr, SSTEQR)
+#define LAPACK_dsteqr LAPACK_GLOBAL(dsteqr, DSTEQR)
+#define LAPACK_csteqr LAPACK_GLOBAL(csteqr, CSTEQR)
+#define LAPACK_zsteqr LAPACK_GLOBAL(zsteqr, ZSTEQR)
+#define LAPACK_sstemr LAPACK_GLOBAL(sstemr, SSTEMR)
+#define LAPACK_dstemr LAPACK_GLOBAL(dstemr, DSTEMR)
+#define LAPACK_cstemr LAPACK_GLOBAL(cstemr, CSTEMR)
+#define LAPACK_zstemr LAPACK_GLOBAL(zstemr, ZSTEMR)
+#define LAPACK_sstedc LAPACK_GLOBAL(sstedc, SSTEDC)
+#define LAPACK_dstedc LAPACK_GLOBAL(dstedc, DSTEDC)
+#define LAPACK_cstedc LAPACK_GLOBAL(cstedc, CSTEDC)
+#define LAPACK_zstedc LAPACK_GLOBAL(zstedc, ZSTEDC)
+#define LAPACK_sstegr LAPACK_GLOBAL(sstegr, SSTEGR)
+#define LAPACK_dstegr LAPACK_GLOBAL(dstegr, DSTEGR)
+#define LAPACK_cstegr LAPACK_GLOBAL(cstegr, CSTEGR)
+#define LAPACK_zstegr LAPACK_GLOBAL(zstegr, ZSTEGR)
+#define LAPACK_spteqr LAPACK_GLOBAL(spteqr, SPTEQR)
+#define LAPACK_dpteqr LAPACK_GLOBAL(dpteqr, DPTEQR)
+#define LAPACK_cpteqr LAPACK_GLOBAL(cpteqr, CPTEQR)
+#define LAPACK_zpteqr LAPACK_GLOBAL(zpteqr, ZPTEQR)
+#define LAPACK_sstebz LAPACK_GLOBAL(sstebz, SSTEBZ)
+#define LAPACK_dstebz LAPACK_GLOBAL(dstebz, DSTEBZ)
+#define LAPACK_sstein LAPACK_GLOBAL(sstein, SSTEIN)
+#define LAPACK_dstein LAPACK_GLOBAL(dstein, DSTEIN)
+#define LAPACK_cstein LAPACK_GLOBAL(cstein, CSTEIN)
+#define LAPACK_zstein LAPACK_GLOBAL(zstein, ZSTEIN)
+#define LAPACK_sdisna LAPACK_GLOBAL(sdisna, SDISNA)
+#define LAPACK_ddisna LAPACK_GLOBAL(ddisna, DDISNA)
+#define LAPACK_ssygst LAPACK_GLOBAL(ssygst, SSYGST)
+#define LAPACK_dsygst LAPACK_GLOBAL(dsygst, DSYGST)
+#define LAPACK_chegst LAPACK_GLOBAL(chegst, CHEGST)
+#define LAPACK_zhegst LAPACK_GLOBAL(zhegst, ZHEGST)
+#define LAPACK_sspgst LAPACK_GLOBAL(sspgst, SSPGST)
+#define LAPACK_dspgst LAPACK_GLOBAL(dspgst, DSPGST)
+#define LAPACK_chpgst LAPACK_GLOBAL(chpgst, CHPGST)
+#define LAPACK_zhpgst LAPACK_GLOBAL(zhpgst, ZHPGST)
+#define LAPACK_ssbgst LAPACK_GLOBAL(ssbgst, SSBGST)
+#define LAPACK_dsbgst LAPACK_GLOBAL(dsbgst, DSBGST)
+#define LAPACK_chbgst LAPACK_GLOBAL(chbgst, CHBGST)
+#define LAPACK_zhbgst LAPACK_GLOBAL(zhbgst, ZHBGST)
+#define LAPACK_spbstf LAPACK_GLOBAL(spbstf, SPBSTF)
+#define LAPACK_dpbstf LAPACK_GLOBAL(dpbstf, DPBSTF)
+#define LAPACK_cpbstf LAPACK_GLOBAL(cpbstf, CPBSTF)
+#define LAPACK_zpbstf LAPACK_GLOBAL(zpbstf, ZPBSTF)
+#define LAPACK_sgehrd LAPACK_GLOBAL(sgehrd, SGEHRD)
+#define LAPACK_dgehrd LAPACK_GLOBAL(dgehrd, DGEHRD)
+#define LAPACK_cgehrd LAPACK_GLOBAL(cgehrd, CGEHRD)
+#define LAPACK_zgehrd LAPACK_GLOBAL(zgehrd, ZGEHRD)
+#define LAPACK_sorghr LAPACK_GLOBAL(sorghr, SORGHR)
+#define LAPACK_dorghr LAPACK_GLOBAL(dorghr, DORGHR)
+#define LAPACK_sormhr LAPACK_GLOBAL(sormhr, SORMHR)
+#define LAPACK_dormhr LAPACK_GLOBAL(dormhr, DORMHR)
+#define LAPACK_cunghr LAPACK_GLOBAL(cunghr, CUNGHR)
+#define LAPACK_zunghr LAPACK_GLOBAL(zunghr, ZUNGHR)
+#define LAPACK_cunmhr LAPACK_GLOBAL(cunmhr, CUNMHR)
+#define LAPACK_zunmhr LAPACK_GLOBAL(zunmhr, ZUNMHR)
+#define LAPACK_sgebal LAPACK_GLOBAL(sgebal, SGEBAL)
+#define LAPACK_dgebal LAPACK_GLOBAL(dgebal, DGEBAL)
+#define LAPACK_cgebal LAPACK_GLOBAL(cgebal, CGEBAL)
+#define LAPACK_zgebal LAPACK_GLOBAL(zgebal, ZGEBAL)
+#define LAPACK_sgebak LAPACK_GLOBAL(sgebak, SGEBAK)
+#define LAPACK_dgebak LAPACK_GLOBAL(dgebak, DGEBAK)
+#define LAPACK_cgebak LAPACK_GLOBAL(cgebak, CGEBAK)
+#define LAPACK_zgebak LAPACK_GLOBAL(zgebak, ZGEBAK)
+#define LAPACK_shseqr LAPACK_GLOBAL(shseqr, SHSEQR)
+#define LAPACK_dhseqr LAPACK_GLOBAL(dhseqr, DHSEQR)
+#define LAPACK_chseqr LAPACK_GLOBAL(chseqr, CHSEQR)
+#define LAPACK_zhseqr LAPACK_GLOBAL(zhseqr, ZHSEQR)
+#define LAPACK_shsein LAPACK_GLOBAL(shsein, SHSEIN)
+#define LAPACK_dhsein LAPACK_GLOBAL(dhsein, DHSEIN)
+#define LAPACK_chsein LAPACK_GLOBAL(chsein, CHSEIN)
+#define LAPACK_zhsein LAPACK_GLOBAL(zhsein, ZHSEIN)
+#define LAPACK_strevc LAPACK_GLOBAL(strevc, STREVC)
+#define LAPACK_dtrevc LAPACK_GLOBAL(dtrevc, DTREVC)
+#define LAPACK_ctrevc LAPACK_GLOBAL(ctrevc, CTREVC)
+#define LAPACK_ztrevc LAPACK_GLOBAL(ztrevc, ZTREVC)
+#define LAPACK_strsna LAPACK_GLOBAL(strsna, STRSNA)
+#define LAPACK_dtrsna LAPACK_GLOBAL(dtrsna, DTRSNA)
+#define LAPACK_ctrsna LAPACK_GLOBAL(ctrsna, CTRSNA)
+#define LAPACK_ztrsna LAPACK_GLOBAL(ztrsna, ZTRSNA)
+#define LAPACK_strexc LAPACK_GLOBAL(strexc, STREXC)
+#define LAPACK_dtrexc LAPACK_GLOBAL(dtrexc, DTREXC)
+#define LAPACK_ctrexc LAPACK_GLOBAL(ctrexc, CTREXC)
+#define LAPACK_ztrexc LAPACK_GLOBAL(ztrexc, ZTREXC)
+#define LAPACK_strsen LAPACK_GLOBAL(strsen, STRSEN)
+#define LAPACK_dtrsen LAPACK_GLOBAL(dtrsen, DTRSEN)
+#define LAPACK_ctrsen LAPACK_GLOBAL(ctrsen, CTRSEN)
+#define LAPACK_ztrsen LAPACK_GLOBAL(ztrsen, ZTRSEN)
+#define LAPACK_strsyl LAPACK_GLOBAL(strsyl, STRSYL)
+#define LAPACK_dtrsyl LAPACK_GLOBAL(dtrsyl, DTRSYL)
+#define LAPACK_ctrsyl LAPACK_GLOBAL(ctrsyl, CTRSYL)
+#define LAPACK_ztrsyl LAPACK_GLOBAL(ztrsyl, ZTRSYL)
+#define LAPACK_sgghrd LAPACK_GLOBAL(sgghrd, SGGHRD)
+#define LAPACK_dgghrd LAPACK_GLOBAL(dgghrd, DGGHRD)
+#define LAPACK_cgghrd LAPACK_GLOBAL(cgghrd, CGGHRD)
+#define LAPACK_zgghrd LAPACK_GLOBAL(zgghrd, ZGGHRD)
+#define LAPACK_sggbal LAPACK_GLOBAL(sggbal, SGGBAL)
+#define LAPACK_dggbal LAPACK_GLOBAL(dggbal, DGGBAL)
+#define LAPACK_cggbal LAPACK_GLOBAL(cggbal, CGGBAL)
+#define LAPACK_zggbal LAPACK_GLOBAL(zggbal, ZGGBAL)
+#define LAPACK_sggbak LAPACK_GLOBAL(sggbak, SGGBAK)
+#define LAPACK_dggbak LAPACK_GLOBAL(dggbak, DGGBAK)
+#define LAPACK_cggbak LAPACK_GLOBAL(cggbak, CGGBAK)
+#define LAPACK_zggbak LAPACK_GLOBAL(zggbak, ZGGBAK)
+#define LAPACK_shgeqz LAPACK_GLOBAL(shgeqz, SHGEQZ)
+#define LAPACK_dhgeqz LAPACK_GLOBAL(dhgeqz, DHGEQZ)
+#define LAPACK_chgeqz LAPACK_GLOBAL(chgeqz, CHGEQZ)
+#define LAPACK_zhgeqz LAPACK_GLOBAL(zhgeqz, ZHGEQZ)
+#define LAPACK_stgevc LAPACK_GLOBAL(stgevc, STGEVC)
+#define LAPACK_dtgevc LAPACK_GLOBAL(dtgevc, DTGEVC)
+#define LAPACK_ctgevc LAPACK_GLOBAL(ctgevc, CTGEVC)
+#define LAPACK_ztgevc LAPACK_GLOBAL(ztgevc, ZTGEVC)
+#define LAPACK_stgexc LAPACK_GLOBAL(stgexc, STGEXC)
+#define LAPACK_dtgexc LAPACK_GLOBAL(dtgexc, DTGEXC)
+#define LAPACK_ctgexc LAPACK_GLOBAL(ctgexc, CTGEXC)
+#define LAPACK_ztgexc LAPACK_GLOBAL(ztgexc, ZTGEXC)
+#define LAPACK_stgsen LAPACK_GLOBAL(stgsen, STGSEN)
+#define LAPACK_dtgsen LAPACK_GLOBAL(dtgsen, DTGSEN)
+#define LAPACK_ctgsen LAPACK_GLOBAL(ctgsen, CTGSEN)
+#define LAPACK_ztgsen LAPACK_GLOBAL(ztgsen, ZTGSEN)
+#define LAPACK_stgsyl LAPACK_GLOBAL(stgsyl, STGSYL)
+#define LAPACK_dtgsyl LAPACK_GLOBAL(dtgsyl, DTGSYL)
+#define LAPACK_ctgsyl LAPACK_GLOBAL(ctgsyl, CTGSYL)
+#define LAPACK_ztgsyl LAPACK_GLOBAL(ztgsyl, ZTGSYL)
+#define LAPACK_stgsna LAPACK_GLOBAL(stgsna, STGSNA)
+#define LAPACK_dtgsna LAPACK_GLOBAL(dtgsna, DTGSNA)
+#define LAPACK_ctgsna LAPACK_GLOBAL(ctgsna, CTGSNA)
+#define LAPACK_ztgsna LAPACK_GLOBAL(ztgsna, ZTGSNA)
+#define LAPACK_sggsvp LAPACK_GLOBAL(sggsvp, SGGSVP)
+#define LAPACK_dggsvp LAPACK_GLOBAL(dggsvp, DGGSVP)
+#define LAPACK_cggsvp LAPACK_GLOBAL(cggsvp, CGGSVP)
+#define LAPACK_zggsvp LAPACK_GLOBAL(zggsvp, ZGGSVP)
+#define LAPACK_stgsja LAPACK_GLOBAL(stgsja, STGSJA)
+#define LAPACK_dtgsja LAPACK_GLOBAL(dtgsja, DTGSJA)
+#define LAPACK_ctgsja LAPACK_GLOBAL(ctgsja, CTGSJA)
+#define LAPACK_ztgsja LAPACK_GLOBAL(ztgsja, ZTGSJA)
+#define LAPACK_sgels LAPACK_GLOBAL(sgels, SGELS)
+#define LAPACK_dgels LAPACK_GLOBAL(dgels, DGELS)
+#define LAPACK_cgels LAPACK_GLOBAL(cgels, CGELS)
+#define LAPACK_zgels LAPACK_GLOBAL(zgels, ZGELS)
+#define LAPACK_sgelsy LAPACK_GLOBAL(sgelsy, SGELSY)
+#define LAPACK_dgelsy LAPACK_GLOBAL(dgelsy, DGELSY)
+#define LAPACK_cgelsy LAPACK_GLOBAL(cgelsy, CGELSY)
+#define LAPACK_zgelsy LAPACK_GLOBAL(zgelsy, ZGELSY)
+#define LAPACK_sgelss LAPACK_GLOBAL(sgelss, SGELSS)
+#define LAPACK_dgelss LAPACK_GLOBAL(dgelss, DGELSS)
+#define LAPACK_cgelss LAPACK_GLOBAL(cgelss, CGELSS)
+#define LAPACK_zgelss LAPACK_GLOBAL(zgelss, ZGELSS)
+#define LAPACK_sgelsd LAPACK_GLOBAL(sgelsd, SGELSD)
+#define LAPACK_dgelsd LAPACK_GLOBAL(dgelsd, DGELSD)
+#define LAPACK_cgelsd LAPACK_GLOBAL(cgelsd, CGELSD)
+#define LAPACK_zgelsd LAPACK_GLOBAL(zgelsd, ZGELSD)
+#define LAPACK_sgglse LAPACK_GLOBAL(sgglse, SGGLSE)
+#define LAPACK_dgglse LAPACK_GLOBAL(dgglse, DGGLSE)
+#define LAPACK_cgglse LAPACK_GLOBAL(cgglse, CGGLSE)
+#define LAPACK_zgglse LAPACK_GLOBAL(zgglse, ZGGLSE)
+#define LAPACK_sggglm LAPACK_GLOBAL(sggglm, SGGGLM)
+#define LAPACK_dggglm LAPACK_GLOBAL(dggglm, DGGGLM)
+#define LAPACK_cggglm LAPACK_GLOBAL(cggglm, CGGGLM)
+#define LAPACK_zggglm LAPACK_GLOBAL(zggglm, ZGGGLM)
+#define LAPACK_ssyev LAPACK_GLOBAL(ssyev, SSYEV)
+#define LAPACK_dsyev LAPACK_GLOBAL(dsyev, DSYEV)
+#define LAPACK_cheev LAPACK_GLOBAL(cheev, CHEEV)
+#define LAPACK_zheev LAPACK_GLOBAL(zheev, ZHEEV)
+#define LAPACK_ssyevd LAPACK_GLOBAL(ssyevd, SSYEVD)
+#define LAPACK_dsyevd LAPACK_GLOBAL(dsyevd, DSYEVD)
+#define LAPACK_cheevd LAPACK_GLOBAL(cheevd, CHEEVD)
+#define LAPACK_zheevd LAPACK_GLOBAL(zheevd, ZHEEVD)
+#define LAPACK_ssyevx LAPACK_GLOBAL(ssyevx, SSYEVX)
+#define LAPACK_dsyevx LAPACK_GLOBAL(dsyevx, DSYEVX)
+#define LAPACK_cheevx LAPACK_GLOBAL(cheevx, CHEEVX)
+#define LAPACK_zheevx LAPACK_GLOBAL(zheevx, ZHEEVX)
+#define LAPACK_ssyevr LAPACK_GLOBAL(ssyevr, SSYEVR)
+#define LAPACK_dsyevr LAPACK_GLOBAL(dsyevr, DSYEVR)
+#define LAPACK_cheevr LAPACK_GLOBAL(cheevr, CHEEVR)
+#define LAPACK_zheevr LAPACK_GLOBAL(zheevr, ZHEEVR)
+#define LAPACK_sspev LAPACK_GLOBAL(sspev, SSPEV)
+#define LAPACK_dspev LAPACK_GLOBAL(dspev, DSPEV)
+#define LAPACK_chpev LAPACK_GLOBAL(chpev, CHPEV)
+#define LAPACK_zhpev LAPACK_GLOBAL(zhpev, ZHPEV)
+#define LAPACK_sspevd LAPACK_GLOBAL(sspevd, SSPEVD)
+#define LAPACK_dspevd LAPACK_GLOBAL(dspevd, DSPEVD)
+#define LAPACK_chpevd LAPACK_GLOBAL(chpevd, CHPEVD)
+#define LAPACK_zhpevd LAPACK_GLOBAL(zhpevd, ZHPEVD)
+#define LAPACK_sspevx LAPACK_GLOBAL(sspevx, SSPEVX)
+#define LAPACK_dspevx LAPACK_GLOBAL(dspevx, DSPEVX)
+#define LAPACK_chpevx LAPACK_GLOBAL(chpevx, CHPEVX)
+#define LAPACK_zhpevx LAPACK_GLOBAL(zhpevx, ZHPEVX)
+#define LAPACK_ssbev LAPACK_GLOBAL(ssbev, SSBEV)
+#define LAPACK_dsbev LAPACK_GLOBAL(dsbev, DSBEV)
+#define LAPACK_chbev LAPACK_GLOBAL(chbev, CHBEV)
+#define LAPACK_zhbev LAPACK_GLOBAL(zhbev, ZHBEV)
+#define LAPACK_ssbevd LAPACK_GLOBAL(ssbevd, SSBEVD)
+#define LAPACK_dsbevd LAPACK_GLOBAL(dsbevd, DSBEVD)
+#define LAPACK_chbevd LAPACK_GLOBAL(chbevd, CHBEVD)
+#define LAPACK_zhbevd LAPACK_GLOBAL(zhbevd, ZHBEVD)
+#define LAPACK_ssbevx LAPACK_GLOBAL(ssbevx, SSBEVX)
+#define LAPACK_dsbevx LAPACK_GLOBAL(dsbevx, DSBEVX)
+#define LAPACK_chbevx LAPACK_GLOBAL(chbevx, CHBEVX)
+#define LAPACK_zhbevx LAPACK_GLOBAL(zhbevx, ZHBEVX)
+#define LAPACK_sstev LAPACK_GLOBAL(sstev, SSTEV)
+#define LAPACK_dstev LAPACK_GLOBAL(dstev, DSTEV)
+#define LAPACK_sstevd LAPACK_GLOBAL(sstevd, SSTEVD)
+#define LAPACK_dstevd LAPACK_GLOBAL(dstevd, DSTEVD)
+#define LAPACK_sstevx LAPACK_GLOBAL(sstevx, SSTEVX)
+#define LAPACK_dstevx LAPACK_GLOBAL(dstevx, DSTEVX)
+#define LAPACK_sstevr LAPACK_GLOBAL(sstevr, SSTEVR)
+#define LAPACK_dstevr LAPACK_GLOBAL(dstevr, DSTEVR)
+#define LAPACK_sgees LAPACK_GLOBAL(sgees, SGEES)
+#define LAPACK_dgees LAPACK_GLOBAL(dgees, DGEES)
+#define LAPACK_cgees LAPACK_GLOBAL(cgees, CGEES)
+#define LAPACK_zgees LAPACK_GLOBAL(zgees, ZGEES)
+#define LAPACK_sgeesx LAPACK_GLOBAL(sgeesx, SGEESX)
+#define LAPACK_dgeesx LAPACK_GLOBAL(dgeesx, DGEESX)
+#define LAPACK_cgeesx LAPACK_GLOBAL(cgeesx, CGEESX)
+#define LAPACK_zgeesx LAPACK_GLOBAL(zgeesx, ZGEESX)
+#define LAPACK_sgeev LAPACK_GLOBAL(sgeev, SGEEV)
+#define LAPACK_dgeev LAPACK_GLOBAL(dgeev, DGEEV)
+#define LAPACK_cgeev LAPACK_GLOBAL(cgeev, CGEEV)
+#define LAPACK_zgeev LAPACK_GLOBAL(zgeev, ZGEEV)
+#define LAPACK_sgeevx LAPACK_GLOBAL(sgeevx, SGEEVX)
+#define LAPACK_dgeevx LAPACK_GLOBAL(dgeevx, DGEEVX)
+#define LAPACK_cgeevx LAPACK_GLOBAL(cgeevx, CGEEVX)
+#define LAPACK_zgeevx LAPACK_GLOBAL(zgeevx, ZGEEVX)
+#define LAPACK_sgesvd LAPACK_GLOBAL(sgesvd, SGESVD)
+#define LAPACK_dgesvd LAPACK_GLOBAL(dgesvd, DGESVD)
+#define LAPACK_cgesvd LAPACK_GLOBAL(cgesvd, CGESVD)
+#define LAPACK_zgesvd LAPACK_GLOBAL(zgesvd, ZGESVD)
+#define LAPACK_sgesdd LAPACK_GLOBAL(sgesdd, SGESDD)
+#define LAPACK_dgesdd LAPACK_GLOBAL(dgesdd, DGESDD)
+#define LAPACK_cgesdd LAPACK_GLOBAL(cgesdd, CGESDD)
+#define LAPACK_zgesdd LAPACK_GLOBAL(zgesdd, ZGESDD)
+#define LAPACK_dgejsv LAPACK_GLOBAL(dgejsv, DGEJSV)
+#define LAPACK_sgejsv LAPACK_GLOBAL(sgejsv, SGEJSV)
+#define LAPACK_dgesvj LAPACK_GLOBAL(dgesvj, DGESVJ)
+#define LAPACK_sgesvj LAPACK_GLOBAL(sgesvj, SGESVJ)
+#define LAPACK_sggsvd LAPACK_GLOBAL(sggsvd, SGGSVD)
+#define LAPACK_dggsvd LAPACK_GLOBAL(dggsvd, DGGSVD)
+#define LAPACK_cggsvd LAPACK_GLOBAL(cggsvd, CGGSVD)
+#define LAPACK_zggsvd LAPACK_GLOBAL(zggsvd, ZGGSVD)
+#define LAPACK_ssygv LAPACK_GLOBAL(ssygv, SSYGV)
+#define LAPACK_dsygv LAPACK_GLOBAL(dsygv, DSYGV)
+#define LAPACK_chegv LAPACK_GLOBAL(chegv, CHEGV)
+#define LAPACK_zhegv LAPACK_GLOBAL(zhegv, ZHEGV)
+#define LAPACK_ssygvd LAPACK_GLOBAL(ssygvd, SSYGVD)
+#define LAPACK_dsygvd LAPACK_GLOBAL(dsygvd, DSYGVD)
+#define LAPACK_chegvd LAPACK_GLOBAL(chegvd, CHEGVD)
+#define LAPACK_zhegvd LAPACK_GLOBAL(zhegvd, ZHEGVD)
+#define LAPACK_ssygvx LAPACK_GLOBAL(ssygvx, SSYGVX)
+#define LAPACK_dsygvx LAPACK_GLOBAL(dsygvx, DSYGVX)
+#define LAPACK_chegvx LAPACK_GLOBAL(chegvx, CHEGVX)
+#define LAPACK_zhegvx LAPACK_GLOBAL(zhegvx, ZHEGVX)
+#define LAPACK_sspgv LAPACK_GLOBAL(sspgv, SSPGV)
+#define LAPACK_dspgv LAPACK_GLOBAL(dspgv, DSPGV)
+#define LAPACK_chpgv LAPACK_GLOBAL(chpgv, CHPGV)
+#define LAPACK_zhpgv LAPACK_GLOBAL(zhpgv, ZHPGV)
+#define LAPACK_sspgvd LAPACK_GLOBAL(sspgvd, SSPGVD)
+#define LAPACK_dspgvd LAPACK_GLOBAL(dspgvd, DSPGVD)
+#define LAPACK_chpgvd LAPACK_GLOBAL(chpgvd, CHPGVD)
+#define LAPACK_zhpgvd LAPACK_GLOBAL(zhpgvd, ZHPGVD)
+#define LAPACK_sspgvx LAPACK_GLOBAL(sspgvx, SSPGVX)
+#define LAPACK_dspgvx LAPACK_GLOBAL(dspgvx, DSPGVX)
+#define LAPACK_chpgvx LAPACK_GLOBAL(chpgvx, CHPGVX)
+#define LAPACK_zhpgvx LAPACK_GLOBAL(zhpgvx, ZHPGVX)
+#define LAPACK_ssbgv LAPACK_GLOBAL(ssbgv, SSBGV)
+#define LAPACK_dsbgv LAPACK_GLOBAL(dsbgv, DSBGV)
+#define LAPACK_chbgv LAPACK_GLOBAL(chbgv, CHBGV)
+#define LAPACK_zhbgv LAPACK_GLOBAL(zhbgv, ZHBGV)
+#define LAPACK_ssbgvd LAPACK_GLOBAL(ssbgvd, SSBGVD)
+#define LAPACK_dsbgvd LAPACK_GLOBAL(dsbgvd, DSBGVD)
+#define LAPACK_chbgvd LAPACK_GLOBAL(chbgvd, CHBGVD)
+#define LAPACK_zhbgvd LAPACK_GLOBAL(zhbgvd, ZHBGVD)
+#define LAPACK_ssbgvx LAPACK_GLOBAL(ssbgvx, SSBGVX)
+#define LAPACK_dsbgvx LAPACK_GLOBAL(dsbgvx, DSBGVX)
+#define LAPACK_chbgvx LAPACK_GLOBAL(chbgvx, CHBGVX)
+#define LAPACK_zhbgvx LAPACK_GLOBAL(zhbgvx, ZHBGVX)
+#define LAPACK_sgges LAPACK_GLOBAL(sgges, SGGES)
+#define LAPACK_dgges LAPACK_GLOBAL(dgges, DGGES)
+#define LAPACK_cgges LAPACK_GLOBAL(cgges, CGGES)
+#define LAPACK_zgges LAPACK_GLOBAL(zgges, ZGGES)
+#define LAPACK_sggesx LAPACK_GLOBAL(sggesx, SGGESX)
+#define LAPACK_dggesx LAPACK_GLOBAL(dggesx, DGGESX)
+#define LAPACK_cggesx LAPACK_GLOBAL(cggesx, CGGESX)
+#define LAPACK_zggesx LAPACK_GLOBAL(zggesx, ZGGESX)
+#define LAPACK_sggev LAPACK_GLOBAL(sggev, SGGEV)
+#define LAPACK_dggev LAPACK_GLOBAL(dggev, DGGEV)
+#define LAPACK_cggev LAPACK_GLOBAL(cggev, CGGEV)
+#define LAPACK_zggev LAPACK_GLOBAL(zggev, ZGGEV)
+#define LAPACK_sggevx LAPACK_GLOBAL(sggevx, SGGEVX)
+#define LAPACK_dggevx LAPACK_GLOBAL(dggevx, DGGEVX)
+#define LAPACK_cggevx LAPACK_GLOBAL(cggevx, CGGEVX)
+#define LAPACK_zggevx LAPACK_GLOBAL(zggevx, ZGGEVX)
+#define LAPACK_dsfrk LAPACK_GLOBAL(dsfrk, DSFRK)
+#define LAPACK_ssfrk LAPACK_GLOBAL(ssfrk, SSFRK)
+#define LAPACK_zhfrk LAPACK_GLOBAL(zhfrk, ZHFRK)
+#define LAPACK_chfrk LAPACK_GLOBAL(chfrk, CHFRK)
+#define LAPACK_dtfsm LAPACK_GLOBAL(dtfsm, DTFSM)
+#define LAPACK_stfsm LAPACK_GLOBAL(stfsm, STFSM)
+#define LAPACK_ztfsm LAPACK_GLOBAL(ztfsm, ZTFSM)
+#define LAPACK_ctfsm LAPACK_GLOBAL(ctfsm, CTFSM)
+#define LAPACK_dtfttp LAPACK_GLOBAL(dtfttp, DTFTTP)
+#define LAPACK_stfttp LAPACK_GLOBAL(stfttp, STFTTP)
+#define LAPACK_ztfttp LAPACK_GLOBAL(ztfttp, ZTFTTP)
+#define LAPACK_ctfttp LAPACK_GLOBAL(ctfttp, CTFTTP)
+#define LAPACK_dtfttr LAPACK_GLOBAL(dtfttr, DTFTTR)
+#define LAPACK_stfttr LAPACK_GLOBAL(stfttr, STFTTR)
+#define LAPACK_ztfttr LAPACK_GLOBAL(ztfttr, ZTFTTR)
+#define LAPACK_ctfttr LAPACK_GLOBAL(ctfttr, CTFTTR)
+#define LAPACK_dtpttf LAPACK_GLOBAL(dtpttf, DTPTTF)
+#define LAPACK_stpttf LAPACK_GLOBAL(stpttf, STPTTF)
+#define LAPACK_ztpttf LAPACK_GLOBAL(ztpttf, ZTPTTF)
+#define LAPACK_ctpttf LAPACK_GLOBAL(ctpttf, CTPTTF)
+#define LAPACK_dtpttr LAPACK_GLOBAL(dtpttr, DTPTTR)
+#define LAPACK_stpttr LAPACK_GLOBAL(stpttr, STPTTR)
+#define LAPACK_ztpttr LAPACK_GLOBAL(ztpttr, ZTPTTR)
+#define LAPACK_ctpttr LAPACK_GLOBAL(ctpttr, CTPTTR)
+#define LAPACK_dtrttf LAPACK_GLOBAL(dtrttf, DTRTTF)
+#define LAPACK_strttf LAPACK_GLOBAL(strttf, STRTTF)
+#define LAPACK_ztrttf LAPACK_GLOBAL(ztrttf, ZTRTTF)
+#define LAPACK_ctrttf LAPACK_GLOBAL(ctrttf, CTRTTF)
+#define LAPACK_dtrttp LAPACK_GLOBAL(dtrttp, DTRTTP)
+#define LAPACK_strttp LAPACK_GLOBAL(strttp, STRTTP)
+#define LAPACK_ztrttp LAPACK_GLOBAL(ztrttp, ZTRTTP)
+#define LAPACK_ctrttp LAPACK_GLOBAL(ctrttp, CTRTTP)
+#define LAPACK_sgeqrfp LAPACK_GLOBAL(sgeqrfp, SGEQRFP)
+#define LAPACK_dgeqrfp LAPACK_GLOBAL(dgeqrfp, DGEQRFP)
+#define LAPACK_cgeqrfp LAPACK_GLOBAL(cgeqrfp, CGEQRFP)
+#define LAPACK_zgeqrfp LAPACK_GLOBAL(zgeqrfp, ZGEQRFP)
+#define LAPACK_clacgv LAPACK_GLOBAL(clacgv, CLACGV)
+#define LAPACK_zlacgv LAPACK_GLOBAL(zlacgv, ZLACGV)
+#define LAPACK_slarnv LAPACK_GLOBAL(slarnv, SLARNV)
+#define LAPACK_dlarnv LAPACK_GLOBAL(dlarnv, DLARNV)
+#define LAPACK_clarnv LAPACK_GLOBAL(clarnv, CLARNV)
+#define LAPACK_zlarnv LAPACK_GLOBAL(zlarnv, ZLARNV)
+#define LAPACK_sgeqr2 LAPACK_GLOBAL(sgeqr2, SGEQR2)
+#define LAPACK_dgeqr2 LAPACK_GLOBAL(dgeqr2, DGEQR2)
+#define LAPACK_cgeqr2 LAPACK_GLOBAL(cgeqr2, CGEQR2)
+#define LAPACK_zgeqr2 LAPACK_GLOBAL(zgeqr2, ZGEQR2)
+#define LAPACK_slacpy LAPACK_GLOBAL(slacpy, SLACPY)
+#define LAPACK_dlacpy LAPACK_GLOBAL(dlacpy, DLACPY)
+#define LAPACK_clacpy LAPACK_GLOBAL(clacpy, CLACPY)
+#define LAPACK_zlacpy LAPACK_GLOBAL(zlacpy, ZLACPY)
+#define LAPACK_sgetf2 LAPACK_GLOBAL(sgetf2, SGETF2)
+#define LAPACK_dgetf2 LAPACK_GLOBAL(dgetf2, DGETF2)
+#define LAPACK_cgetf2 LAPACK_GLOBAL(cgetf2, CGETF2)
+#define LAPACK_zgetf2 LAPACK_GLOBAL(zgetf2, ZGETF2)
+#define LAPACK_slaswp LAPACK_GLOBAL(slaswp, SLASWP)
+#define LAPACK_dlaswp LAPACK_GLOBAL(dlaswp, DLASWP)
+#define LAPACK_claswp LAPACK_GLOBAL(claswp, CLASWP)
+#define LAPACK_zlaswp LAPACK_GLOBAL(zlaswp, ZLASWP)
+#define LAPACK_slange LAPACK_GLOBAL(slange, SLANGE)
+#define LAPACK_dlange LAPACK_GLOBAL(dlange, DLANGE)
+#define LAPACK_clange LAPACK_GLOBAL(clange, CLANGE)
+#define LAPACK_zlange LAPACK_GLOBAL(zlange, ZLANGE)
+#define LAPACK_clanhe LAPACK_GLOBAL(clanhe, CLANHE)
+#define LAPACK_zlanhe LAPACK_GLOBAL(zlanhe, ZLANHE)
+#define LAPACK_slansy LAPACK_GLOBAL(slansy, SLANSY)
+#define LAPACK_dlansy LAPACK_GLOBAL(dlansy, DLANSY)
+#define LAPACK_clansy LAPACK_GLOBAL(clansy, CLANSY)
+#define LAPACK_zlansy LAPACK_GLOBAL(zlansy, ZLANSY)
+#define LAPACK_slantr LAPACK_GLOBAL(slantr, SLANTR)
+#define LAPACK_dlantr LAPACK_GLOBAL(dlantr, DLANTR)
+#define LAPACK_clantr LAPACK_GLOBAL(clantr, CLANTR)
+#define LAPACK_zlantr LAPACK_GLOBAL(zlantr, ZLANTR)
+#define LAPACK_slamch LAPACK_GLOBAL(slamch, SLAMCH)
+#define LAPACK_dlamch LAPACK_GLOBAL(dlamch, DLAMCH)
+#define LAPACK_sgelq2 LAPACK_GLOBAL(sgelq2, SGELQ2)
+#define LAPACK_dgelq2 LAPACK_GLOBAL(dgelq2, DGELQ2)
+#define LAPACK_cgelq2 LAPACK_GLOBAL(cgelq2, CGELQ2)
+#define LAPACK_zgelq2 LAPACK_GLOBAL(zgelq2, ZGELQ2)
+#define LAPACK_slarfb LAPACK_GLOBAL(slarfb, SLARFB)
+#define LAPACK_dlarfb LAPACK_GLOBAL(dlarfb, DLARFB)
+#define LAPACK_clarfb LAPACK_GLOBAL(clarfb, CLARFB)
+#define LAPACK_zlarfb LAPACK_GLOBAL(zlarfb, ZLARFB)
+#define LAPACK_slarfg LAPACK_GLOBAL(slarfg, SLARFG)
+#define LAPACK_dlarfg LAPACK_GLOBAL(dlarfg, DLARFG)
+#define LAPACK_clarfg LAPACK_GLOBAL(clarfg, CLARFG)
+#define LAPACK_zlarfg LAPACK_GLOBAL(zlarfg, ZLARFG)
+#define LAPACK_slarft LAPACK_GLOBAL(slarft, SLARFT)
+#define LAPACK_dlarft LAPACK_GLOBAL(dlarft, DLARFT)
+#define LAPACK_clarft LAPACK_GLOBAL(clarft, CLARFT)
+#define LAPACK_zlarft LAPACK_GLOBAL(zlarft, ZLARFT)
+#define LAPACK_slarfx LAPACK_GLOBAL(slarfx, SLARFX)
+#define LAPACK_dlarfx LAPACK_GLOBAL(dlarfx, DLARFX)
+#define LAPACK_clarfx LAPACK_GLOBAL(clarfx, CLARFX)
+#define LAPACK_zlarfx LAPACK_GLOBAL(zlarfx, ZLARFX)
+#define LAPACK_slatms LAPACK_GLOBAL(slatms, SLATMS)
+#define LAPACK_dlatms LAPACK_GLOBAL(dlatms, DLATMS)
+#define LAPACK_clatms LAPACK_GLOBAL(clatms, CLATMS)
+#define LAPACK_zlatms LAPACK_GLOBAL(zlatms, ZLATMS)
+#define LAPACK_slag2d LAPACK_GLOBAL(slag2d, SLAG2D)
+#define LAPACK_dlag2s LAPACK_GLOBAL(dlag2s, DLAG2S)
+#define LAPACK_clag2z LAPACK_GLOBAL(clag2z, CLAG2Z)
+#define LAPACK_zlag2c LAPACK_GLOBAL(zlag2c, ZLAG2C)
+#define LAPACK_slauum LAPACK_GLOBAL(slauum, SLAUUM)
+#define LAPACK_dlauum LAPACK_GLOBAL(dlauum, DLAUUM)
+#define LAPACK_clauum LAPACK_GLOBAL(clauum, CLAUUM)
+#define LAPACK_zlauum LAPACK_GLOBAL(zlauum, ZLAUUM)
+#define LAPACK_slagge LAPACK_GLOBAL(slagge, SLAGGE)
+#define LAPACK_dlagge LAPACK_GLOBAL(dlagge, DLAGGE)
+#define LAPACK_clagge LAPACK_GLOBAL(clagge, CLAGGE)
+#define LAPACK_zlagge LAPACK_GLOBAL(zlagge, ZLAGGE)
+#define LAPACK_slaset LAPACK_GLOBAL(slaset, SLASET)
+#define LAPACK_dlaset LAPACK_GLOBAL(dlaset, DLASET)
+#define LAPACK_claset LAPACK_GLOBAL(claset, CLASET)
+#define LAPACK_zlaset LAPACK_GLOBAL(zlaset, ZLASET)
+#define LAPACK_slasrt LAPACK_GLOBAL(slasrt, SLASRT)
+#define LAPACK_dlasrt LAPACK_GLOBAL(dlasrt, DLASRT)
+#define LAPACK_slagsy LAPACK_GLOBAL(slagsy, SLAGSY)
+#define LAPACK_dlagsy LAPACK_GLOBAL(dlagsy, DLAGSY)
+#define LAPACK_clagsy LAPACK_GLOBAL(clagsy, CLAGSY)
+#define LAPACK_zlagsy LAPACK_GLOBAL(zlagsy, ZLAGSY)
+#define LAPACK_claghe LAPACK_GLOBAL(claghe, CLAGHE)
+#define LAPACK_zlaghe LAPACK_GLOBAL(zlaghe, ZLAGHE)
+#define LAPACK_slapmr LAPACK_GLOBAL(slapmr, SLAPMR)
+#define LAPACK_dlapmr LAPACK_GLOBAL(dlapmr, DLAPMR)
+#define LAPACK_clapmr LAPACK_GLOBAL(clapmr, CLAPMR)
+#define LAPACK_zlapmr LAPACK_GLOBAL(zlapmr, ZLAPMR)
+#define LAPACK_slapy2 LAPACK_GLOBAL(slapy2, SLAPY2)
+#define LAPACK_dlapy2 LAPACK_GLOBAL(dlapy2, DLAPY2)
+#define LAPACK_slapy3 LAPACK_GLOBAL(slapy3, SLAPY3)
+#define LAPACK_dlapy3 LAPACK_GLOBAL(dlapy3, DLAPY3)
+#define LAPACK_slartgp LAPACK_GLOBAL(slartgp, SLARTGP)
+#define LAPACK_dlartgp LAPACK_GLOBAL(dlartgp, DLARTGP)
+#define LAPACK_slartgs LAPACK_GLOBAL(slartgs, SLARTGS)
+#define LAPACK_dlartgs LAPACK_GLOBAL(dlartgs, DLARTGS)
 // LAPACK 3.3.0
-void LAPACK_cbbcsd( char* jobu1, char* jobu2,
-                    char* jobv1t, char* jobv2t, char* trans,
-                    lapack_int* m, lapack_int* p, lapack_int* q,
-                    float* theta, float* phi,
-                    lapack_complex_float* u1, lapack_int* ldu1,
-                    lapack_complex_float* u2, lapack_int* ldu2,
-                    lapack_complex_float* v1t, lapack_int* ldv1t,
-                    lapack_complex_float* v2t, lapack_int* ldv2t,
-                    float* b11d, float* b11e, float* b12d,
-                    float* b12e, float* b21d, float* b21e,
-                    float* b22d, float* b22e, float* rwork,
-                    lapack_int* lrwork , lapack_int *info );
-void LAPACK_cheswapr( char* uplo, lapack_int* n,
-                      lapack_complex_float* a, lapack_int* i1,
-                      lapack_int* i2 );
-void LAPACK_chetri2( char* uplo, lapack_int* n,
-                     lapack_complex_float* a, lapack_int* lda,
-                     const lapack_int* ipiv,
-                     lapack_complex_float* work, lapack_int* lwork , lapack_int *info );
-void LAPACK_chetri2x( char* uplo, lapack_int* n,
-                      lapack_complex_float* a, lapack_int* lda,
-                      const lapack_int* ipiv,
-                      lapack_complex_float* work, lapack_int* nb , lapack_int *info );
-void LAPACK_chetrs2( char* uplo, lapack_int* n,
-                     lapack_int* nrhs, const lapack_complex_float* a,
-                     lapack_int* lda, const lapack_int* ipiv,
-                     lapack_complex_float* b, lapack_int* ldb,
-                     lapack_complex_float* work , lapack_int *info );
-void LAPACK_csyconv( char* uplo, char* way,
-                     lapack_int* n, lapack_complex_float* a,
-                     lapack_int* lda, const lapack_int* ipiv,
-                     lapack_complex_float* work , lapack_int *info );
-void LAPACK_csyswapr( char* uplo, lapack_int* n,
-                      lapack_complex_float* a, lapack_int* i1,
-                      lapack_int* i2 );
-void LAPACK_csytri2( char* uplo, lapack_int* n,
-                     lapack_complex_float* a, lapack_int* lda,
-                     const lapack_int* ipiv,
-                     lapack_complex_float* work, lapack_int* lwork , lapack_int *info );
-void LAPACK_csytri2x( char* uplo, lapack_int* n,
-                      lapack_complex_float* a, lapack_int* lda,
-                      const lapack_int* ipiv,
-                      lapack_complex_float* work, lapack_int* nb , lapack_int *info );
-void LAPACK_csytrs2( char* uplo, lapack_int* n,
-                     lapack_int* nrhs, const lapack_complex_float* a,
-                     lapack_int* lda, const lapack_int* ipiv,
-                     lapack_complex_float* b, lapack_int* ldb,
-                     lapack_complex_float* work , lapack_int *info );
-void LAPACK_cunbdb( char* trans, char* signs,
-                    lapack_int* m, lapack_int* p, lapack_int* q,
-                    lapack_complex_float* x11, lapack_int* ldx11,
-                    lapack_complex_float* x12, lapack_int* ldx12,
-                    lapack_complex_float* x21, lapack_int* ldx21,
-                    lapack_complex_float* x22, lapack_int* ldx22,
-                    float* theta, float* phi,
-                    lapack_complex_float* taup1,
-                    lapack_complex_float* taup2,
-                    lapack_complex_float* tauq1,
-                    lapack_complex_float* tauq2,
-                    lapack_complex_float* work, lapack_int* lwork , lapack_int *info );
-void LAPACK_cuncsd( char* jobu1, char* jobu2,
-                    char* jobv1t, char* jobv2t, char* trans,
-                    char* signs, lapack_int* m, lapack_int* p,
-                    lapack_int* q, lapack_complex_float* x11,
-                    lapack_int* ldx11, lapack_complex_float* x12,
-                    lapack_int* ldx12, lapack_complex_float* x21,
-                    lapack_int* ldx21, lapack_complex_float* x22,
-                    lapack_int* ldx22, float* theta,
-                    lapack_complex_float* u1, lapack_int* ldu1,
-                    lapack_complex_float* u2, lapack_int* ldu2,
-                    lapack_complex_float* v1t, lapack_int* ldv1t,
-                    lapack_complex_float* v2t, lapack_int* ldv2t,
-                    lapack_complex_float* work, lapack_int* lwork,
-                    float* rwork, lapack_int* lrwork,
-                    lapack_int* iwork , lapack_int *info );
-void LAPACK_dbbcsd( char* jobu1, char* jobu2,
-                    char* jobv1t, char* jobv2t, char* trans,
-                    lapack_int* m, lapack_int* p, lapack_int* q,
-                    double* theta, double* phi, double* u1,
-                    lapack_int* ldu1, double* u2, lapack_int* ldu2,
-                    double* v1t, lapack_int* ldv1t, double* v2t,
-                    lapack_int* ldv2t, double* b11d, double* b11e,
-                    double* b12d, double* b12e, double* b21d,
-                    double* b21e, double* b22d, double* b22e,
-                    double* work, lapack_int* lwork , lapack_int *info );
-void LAPACK_dorbdb( char* trans, char* signs,
-                    lapack_int* m, lapack_int* p, lapack_int* q,
-                    double* x11, lapack_int* ldx11, double* x12,
-                    lapack_int* ldx12, double* x21, lapack_int* ldx21,
-                    double* x22, lapack_int* ldx22, double* theta,
-                    double* phi, double* taup1, double* taup2,
-                    double* tauq1, double* tauq2, double* work,
-                    lapack_int* lwork , lapack_int *info );
-void LAPACK_dorcsd( char* jobu1, char* jobu2,
-                    char* jobv1t, char* jobv2t, char* trans,
-                    char* signs, lapack_int* m, lapack_int* p,
-                    lapack_int* q, double* x11, lapack_int* ldx11,
-                    double* x12, lapack_int* ldx12, double* x21,
-                    lapack_int* ldx21, double* x22, lapack_int* ldx22,
-                    double* theta, double* u1, lapack_int* ldu1,
-                    double* u2, lapack_int* ldu2, double* v1t,
-                    lapack_int* ldv1t, double* v2t, lapack_int* ldv2t,
-                    double* work, lapack_int* lwork,
-                    lapack_int* iwork , lapack_int *info );
-void LAPACK_dsyconv( char* uplo, char* way,
-                     lapack_int* n, double* a, lapack_int* lda,
-                     const lapack_int* ipiv, double* work , lapack_int *info );
-void LAPACK_dsyswapr( char* uplo, lapack_int* n,
-                      double* a, lapack_int* i1, lapack_int* i2 );
-void LAPACK_dsytri2( char* uplo, lapack_int* n,
-                     double* a, lapack_int* lda,
-                     const lapack_int* ipiv,
-                     lapack_complex_double* work, lapack_int* lwork , lapack_int *info );
-void LAPACK_dsytri2x( char* uplo, lapack_int* n,
-                      double* a, lapack_int* lda,
-                      const lapack_int* ipiv, double* work,
-                      lapack_int* nb , lapack_int *info );
-void LAPACK_dsytrs2( char* uplo, lapack_int* n,
-                     lapack_int* nrhs, const double* a,
-                     lapack_int* lda, const lapack_int* ipiv,
-                     double* b, lapack_int* ldb, double* work , lapack_int *info );
-void LAPACK_sbbcsd( char* jobu1, char* jobu2,
-                    char* jobv1t, char* jobv2t, char* trans,
-                    lapack_int* m, lapack_int* p, lapack_int* q,
-                    float* theta, float* phi, float* u1,
-                    lapack_int* ldu1, float* u2, lapack_int* ldu2,
-                    float* v1t, lapack_int* ldv1t, float* v2t,
-                    lapack_int* ldv2t, float* b11d, float* b11e,
-                    float* b12d, float* b12e, float* b21d,
-                    float* b21e, float* b22d, float* b22e,
-                    float* work, lapack_int* lwork , lapack_int *info );
-void LAPACK_sorbdb( char* trans, char* signs,
-                    lapack_int* m, lapack_int* p, lapack_int* q,
-                    float* x11, lapack_int* ldx11, float* x12,
-                    lapack_int* ldx12, float* x21, lapack_int* ldx21,
-                    float* x22, lapack_int* ldx22, float* theta,
-                    float* phi, float* taup1, float* taup2,
-                    float* tauq1, float* tauq2, float* work,
-                    lapack_int* lwork , lapack_int *info );
-void LAPACK_sorcsd( char* jobu1, char* jobu2,
-                    char* jobv1t, char* jobv2t, char* trans,
-                    char* signs, lapack_int* m, lapack_int* p,
-                    lapack_int* q, float* x11, lapack_int* ldx11,
-                    float* x12, lapack_int* ldx12, float* x21,
-                    lapack_int* ldx21, float* x22, lapack_int* ldx22,
-                    float* theta, float* u1, lapack_int* ldu1,
-                    float* u2, lapack_int* ldu2, float* v1t,
-                    lapack_int* ldv1t, float* v2t, lapack_int* ldv2t,
-                    float* work, lapack_int* lwork,
-                    lapack_int* iwork , lapack_int *info );
-void LAPACK_ssyconv( char* uplo, char* way,
-                     lapack_int* n, float* a, lapack_int* lda,
-                     const lapack_int* ipiv, float* work , lapack_int *info );
-void LAPACK_ssyswapr( char* uplo, lapack_int* n,
-                      float* a, lapack_int* i1, lapack_int* i2 );
-void LAPACK_ssytri2( char* uplo, lapack_int* n,
-                     float* a, lapack_int* lda,
-                     const lapack_int* ipiv,
-                     lapack_complex_float* work, lapack_int* lwork , lapack_int *info );
-void LAPACK_ssytri2x( char* uplo, lapack_int* n,
-                      float* a, lapack_int* lda,
-                      const lapack_int* ipiv, float* work,
-                      lapack_int* nb , lapack_int *info );
-void LAPACK_ssytrs2( char* uplo, lapack_int* n,
-                     lapack_int* nrhs, const float* a,
-                     lapack_int* lda, const lapack_int* ipiv,
-                     float* b, lapack_int* ldb, float* work , lapack_int *info );
-void LAPACK_zbbcsd( char* jobu1, char* jobu2,
-                    char* jobv1t, char* jobv2t, char* trans,
-                    lapack_int* m, lapack_int* p, lapack_int* q,
-                    double* theta, double* phi,
-                    lapack_complex_double* u1, lapack_int* ldu1,
-                    lapack_complex_double* u2, lapack_int* ldu2,
-                    lapack_complex_double* v1t, lapack_int* ldv1t,
-                    lapack_complex_double* v2t, lapack_int* ldv2t,
-                    double* b11d, double* b11e, double* b12d,
-                    double* b12e, double* b21d, double* b21e,
-                    double* b22d, double* b22e, double* rwork,
-                    lapack_int* lrwork , lapack_int *info );
-void LAPACK_zheswapr( char* uplo, lapack_int* n,
-                      lapack_complex_double* a, lapack_int* i1,
-                      lapack_int* i2 );
-void LAPACK_zhetri2( char* uplo, lapack_int* n,
-                     lapack_complex_double* a, lapack_int* lda,
-                     const lapack_int* ipiv,
-                     lapack_complex_double* work, lapack_int* lwork , lapack_int *info );
-void LAPACK_zhetri2x( char* uplo, lapack_int* n,
-                      lapack_complex_double* a, lapack_int* lda,
-                      const lapack_int* ipiv,
-                      lapack_complex_double* work, lapack_int* nb , lapack_int *info );
-void LAPACK_zhetrs2( char* uplo, lapack_int* n,
-                     lapack_int* nrhs,
-                     const lapack_complex_double* a, lapack_int* lda,
-                     const lapack_int* ipiv,
-                     lapack_complex_double* b, lapack_int* ldb,
-                     lapack_complex_double* work , lapack_int *info );
-void LAPACK_zsyconv( char* uplo, char* way,
-                     lapack_int* n, lapack_complex_double* a,
-                     lapack_int* lda, const lapack_int* ipiv,
-                     lapack_complex_double* work , lapack_int *info );
-void LAPACK_zsyswapr( char* uplo, lapack_int* n,
-                      lapack_complex_double* a, lapack_int* i1,
-                      lapack_int* i2 );
-void LAPACK_zsytri2( char* uplo, lapack_int* n,
-                     lapack_complex_double* a, lapack_int* lda,
-                     const lapack_int* ipiv,
-                     lapack_complex_double* work, lapack_int* lwork , lapack_int *info );
-void LAPACK_zsytri2x( char* uplo, lapack_int* n,
-                      lapack_complex_double* a, lapack_int* lda,
-                      const lapack_int* ipiv,
-                      lapack_complex_double* work, lapack_int* nb , lapack_int *info );
-void LAPACK_zsytrs2( char* uplo, lapack_int* n,
-                     lapack_int* nrhs,
-                     const lapack_complex_double* a, lapack_int* lda,
-                     const lapack_int* ipiv,
-                     lapack_complex_double* b, lapack_int* ldb,
-                     lapack_complex_double* work , lapack_int *info );
-void LAPACK_zunbdb( char* trans, char* signs,
-                    lapack_int* m, lapack_int* p, lapack_int* q,
-                    lapack_complex_double* x11, lapack_int* ldx11,
-                    lapack_complex_double* x12, lapack_int* ldx12,
-                    lapack_complex_double* x21, lapack_int* ldx21,
-                    lapack_complex_double* x22, lapack_int* ldx22,
-                    double* theta, double* phi,
-                    lapack_complex_double* taup1,
-                    lapack_complex_double* taup2,
-                    lapack_complex_double* tauq1,
-                    lapack_complex_double* tauq2,
-                    lapack_complex_double* work, lapack_int* lwork , lapack_int *info );
-void LAPACK_zuncsd( char* jobu1, char* jobu2,
-                    char* jobv1t, char* jobv2t, char* trans,
-                    char* signs, lapack_int* m, lapack_int* p,
-                    lapack_int* q, lapack_complex_double* x11,
-                    lapack_int* ldx11, lapack_complex_double* x12,
-                    lapack_int* ldx12, lapack_complex_double* x21,
-                    lapack_int* ldx21, lapack_complex_double* x22,
-                    lapack_int* ldx22, double* theta,
-                    lapack_complex_double* u1, lapack_int* ldu1,
-                    lapack_complex_double* u2, lapack_int* ldu2,
-                    lapack_complex_double* v1t, lapack_int* ldv1t,
-                    lapack_complex_double* v2t, lapack_int* ldv2t,
-                    lapack_complex_double* work, lapack_int* lwork,
-                    double* rwork, lapack_int* lrwork,
-                    lapack_int* iwork , lapack_int *info );
+#define LAPACK_cbbcsd LAPACK_GLOBAL(cbbcsd, CBBCSD)
+#define LAPACK_cheswapr LAPACK_GLOBAL(cheswapr, CHESWAPR)
+#define LAPACK_chetri2 LAPACK_GLOBAL(chetri2, CHETRI2)
+#define LAPACK_chetri2x LAPACK_GLOBAL(chetri2x, CHETRI2X)
+#define LAPACK_chetrs2 LAPACK_GLOBAL(chetrs2, CHETRS2)
+#define LAPACK_csyconv LAPACK_GLOBAL(csyconv, CSYCONV)
+#define LAPACK_csyswapr LAPACK_GLOBAL(csyswapr, CSYSWAPR)
+#define LAPACK_csytri2 LAPACK_GLOBAL(csytri2, CSYTRI2)
+#define LAPACK_csytri2x LAPACK_GLOBAL(csytri2x, CSYTRI2X)
+#define LAPACK_csytrs2 LAPACK_GLOBAL(csytrs2, CSYTRS2)
+#define LAPACK_cunbdb LAPACK_GLOBAL(cunbdb, CUNBDB)
+#define LAPACK_cuncsd LAPACK_GLOBAL(cuncsd, CUNCSD)
+#define LAPACK_dbbcsd LAPACK_GLOBAL(dbbcsd, DBBCSD)
+#define LAPACK_dorbdb LAPACK_GLOBAL(dorbdb, DORBDB)
+#define LAPACK_dorcsd LAPACK_GLOBAL(dorcsd, DORCSD)
+#define LAPACK_dsyconv LAPACK_GLOBAL(dsyconv, DSYCONV)
+#define LAPACK_dsyswapr LAPACK_GLOBAL(dsyswapr, DSYSWAPR)
+#define LAPACK_dsytri2 LAPACK_GLOBAL(dsytri2, DSYTRI2)
+#define LAPACK_dsytri2x LAPACK_GLOBAL(dsytri2x, DSYTRI2X)
+#define LAPACK_dsytrs2 LAPACK_GLOBAL(dsytrs2, DSYTRS2)
+#define LAPACK_sbbcsd LAPACK_GLOBAL(sbbcsd, SBBCSD)
+#define LAPACK_sorbdb LAPACK_GLOBAL(sorbdb, SORBDB)
+#define LAPACK_sorcsd LAPACK_GLOBAL(sorcsd, SORCSD)
+#define LAPACK_ssyconv LAPACK_GLOBAL(ssyconv, SSYCONV)
+#define LAPACK_ssyswapr LAPACK_GLOBAL(ssyswapr, SSYSWAPR)
+#define LAPACK_ssytri2 LAPACK_GLOBAL(ssytri2, SSYTRI2)
+#define LAPACK_ssytri2x LAPACK_GLOBAL(ssytri2x, SSYTRI2X)
+#define LAPACK_ssytrs2 LAPACK_GLOBAL(ssytrs2, SSYTRS2)
+#define LAPACK_zbbcsd LAPACK_GLOBAL(zbbcsd, ZBBCSD)
+#define LAPACK_zheswapr LAPACK_GLOBAL(zheswapr, ZHESWAPR)
+#define LAPACK_zhetri2 LAPACK_GLOBAL(zhetri2, ZHETRI2)
+#define LAPACK_zhetri2x LAPACK_GLOBAL(zhetri2x, ZHETRI2X)
+#define LAPACK_zhetrs2 LAPACK_GLOBAL(zhetrs2, ZHETRS2)
+#define LAPACK_zsyconv LAPACK_GLOBAL(zsyconv, ZSYCONV)
+#define LAPACK_zsyswapr LAPACK_GLOBAL(zsyswapr, ZSYSWAPR)
+#define LAPACK_zsytri2 LAPACK_GLOBAL(zsytri2, ZSYTRI2)
+#define LAPACK_zsytri2x LAPACK_GLOBAL(zsytri2x, ZSYTRI2X)
+#define LAPACK_zsytrs2 LAPACK_GLOBAL(zsytrs2, ZSYTRS2)
+#define LAPACK_zunbdb LAPACK_GLOBAL(zunbdb, ZUNBDB)
+#define LAPACK_zuncsd LAPACK_GLOBAL(zuncsd, ZUNCSD)
 // LAPACK 3.4.0
-void LAPACK_sgemqrt( char* side, char* trans, lapack_int* m, lapack_int* n,
-                     lapack_int* k, lapack_int* nb, const float* v,
-                     lapack_int* ldv, const float* t, lapack_int* ldt, float* c,
-                     lapack_int* ldc, float* work, lapack_int *info );
-void LAPACK_dgemqrt( char* side, char* trans, lapack_int* m, lapack_int* n,
-                     lapack_int* k, lapack_int* nb, const double* v,
-                     lapack_int* ldv, const double* t, lapack_int* ldt,
-                     double* c, lapack_int* ldc, double* work,
-                     lapack_int *info );
-void LAPACK_cgemqrt( char* side, char* trans, lapack_int* m, lapack_int* n,
-                     lapack_int* k, lapack_int* nb,
-                     const lapack_complex_float* v, lapack_int* ldv,
-                     const lapack_complex_float* t, lapack_int* ldt,
-                     lapack_complex_float* c, lapack_int* ldc,
-                     lapack_complex_float* work, lapack_int *info );
-void LAPACK_zgemqrt( char* side, char* trans, lapack_int* m, lapack_int* n,
-                     lapack_int* k, lapack_int* nb,
-                     const lapack_complex_double* v, lapack_int* ldv,
-                     const lapack_complex_double* t, lapack_int* ldt,
-                     lapack_complex_double* c, lapack_int* ldc,
-                     lapack_complex_double* work, lapack_int *info );
-void LAPACK_sgeqrt( lapack_int* m, lapack_int* n, lapack_int* nb, float* a,
-                    lapack_int* lda, float* t, lapack_int* ldt, float* work,
-                    lapack_int *info );
-void LAPACK_dgeqrt( lapack_int* m, lapack_int* n, lapack_int* nb, double* a,
-                    lapack_int* lda, double* t, lapack_int* ldt, double* work,
-                    lapack_int *info );
-void LAPACK_cgeqrt( lapack_int* m, lapack_int* n, lapack_int* nb,
-                    lapack_complex_float* a, lapack_int* lda,
-                    lapack_complex_float* t, lapack_int* ldt,
-                    lapack_complex_float* work, lapack_int *info );
-void LAPACK_zgeqrt( lapack_int* m, lapack_int* n, lapack_int* nb,
-                    lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* t, lapack_int* ldt,
-                    lapack_complex_double* work, lapack_int *info );
-void LAPACK_sgeqrt2( lapack_int* m, lapack_int* n, float* a, lapack_int* lda,
-                     float* t, lapack_int* ldt, lapack_int *info );
-void LAPACK_dgeqrt2( lapack_int* m, lapack_int* n, double* a, lapack_int* lda,
-                     double* t, lapack_int* ldt, lapack_int *info );
-void LAPACK_cgeqrt2( lapack_int* m, lapack_int* n, lapack_complex_float* a,
-                     lapack_int* lda, lapack_complex_float* t, lapack_int* ldt,
-                     lapack_int *info );
-void LAPACK_zgeqrt2( lapack_int* m, lapack_int* n, lapack_complex_double* a,
-                     lapack_int* lda, lapack_complex_double* t, lapack_int* ldt,
-                     lapack_int *info );
-void LAPACK_sgeqrt3( lapack_int* m, lapack_int* n, float* a, lapack_int* lda,
-                     float* t, lapack_int* ldt, lapack_int *info );
-void LAPACK_dgeqrt3( lapack_int* m, lapack_int* n, double* a, lapack_int* lda,
-                     double* t, lapack_int* ldt, lapack_int *info );
-void LAPACK_cgeqrt3( lapack_int* m, lapack_int* n, lapack_complex_float* a,
-                     lapack_int* lda, lapack_complex_float* t, lapack_int* ldt,
-                     lapack_int *info );
-void LAPACK_zgeqrt3( lapack_int* m, lapack_int* n, lapack_complex_double* a,
-                     lapack_int* lda, lapack_complex_double* t, lapack_int* ldt,
-                     lapack_int *info );
-void LAPACK_stpmqrt( char* side, char* trans, lapack_int* m, lapack_int* n,
-                     lapack_int* k, lapack_int* l, lapack_int* nb,
-                     const float* v, lapack_int* ldv, const float* t,
-                     lapack_int* ldt, float* a, lapack_int* lda, float* b,
-                     lapack_int* ldb, float* work, lapack_int *info );
-void LAPACK_dtpmqrt( char* side, char* trans, lapack_int* m, lapack_int* n,
-                     lapack_int* k, lapack_int* l, lapack_int* nb,
-                     const double* v, lapack_int* ldv, const double* t,
-                     lapack_int* ldt, double* a, lapack_int* lda, double* b,
-                     lapack_int* ldb, double* work, lapack_int *info );
-void LAPACK_ctpmqrt( char* side, char* trans, lapack_int* m, lapack_int* n,
-                     lapack_int* k, lapack_int* l, lapack_int* nb,
-                     const lapack_complex_float* v, lapack_int* ldv,
-                     const lapack_complex_float* t, lapack_int* ldt,
-                     lapack_complex_float* a, lapack_int* lda,
-                     lapack_complex_float* b, lapack_int* ldb,
-                     lapack_complex_float* work, lapack_int *info );
-void LAPACK_ztpmqrt( char* side, char* trans, lapack_int* m, lapack_int* n,
-                     lapack_int* k, lapack_int* l, lapack_int* nb,
-                     const lapack_complex_double* v, lapack_int* ldv,
-                     const lapack_complex_double* t, lapack_int* ldt,
-                     lapack_complex_double* a, lapack_int* lda,
-                     lapack_complex_double* b, lapack_int* ldb,
-                     lapack_complex_double* work, lapack_int *info );
-void LAPACK_dtpqrt( lapack_int* m, lapack_int* n, lapack_int* l, lapack_int* nb,
-                    double* a, lapack_int* lda, double* b, lapack_int* ldb,
-                    double* t, lapack_int* ldt, double* work,
-                    lapack_int *info );
-void LAPACK_ctpqrt( lapack_int* m, lapack_int* n, lapack_int* l, lapack_int* nb,
-                    lapack_complex_float* a, lapack_int* lda,
-                    lapack_complex_float* t, lapack_complex_float* b,
-                    lapack_int* ldb, lapack_int* ldt,
-                    lapack_complex_float* work, lapack_int *info );
-void LAPACK_ztpqrt( lapack_int* m, lapack_int* n, lapack_int* l, lapack_int* nb,
-                    lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* b, lapack_int* ldb,
-                    lapack_complex_double* t, lapack_int* ldt,
-                    lapack_complex_double* work, lapack_int *info );
-void LAPACK_stpqrt2( lapack_int* m, lapack_int* n, float* a, lapack_int* lda,
-                     float* b, lapack_int* ldb, float* t, lapack_int* ldt,
-                     lapack_int *info );
-void LAPACK_dtpqrt2( lapack_int* m, lapack_int* n, double* a, lapack_int* lda,
-                     double* b, lapack_int* ldb, double* t, lapack_int* ldt,
-                     lapack_int *info );
-void LAPACK_ctpqrt2( lapack_int* m, lapack_int* n, lapack_complex_float* a,
-                     lapack_int* lda, lapack_complex_float* b, lapack_int* ldb,
-                     lapack_complex_float* t, lapack_int* ldt,
-                     lapack_int *info );
-void LAPACK_ztpqrt2( lapack_int* m, lapack_int* n, lapack_complex_double* a,
-                     lapack_int* lda, lapack_complex_double* b, lapack_int* ldb,
-                     lapack_complex_double* t, lapack_int* ldt,
-                     lapack_int *info );
-void LAPACK_stprfb( char* side, char* trans, char* direct, char* storev,
-                    lapack_int* m, lapack_int* n, lapack_int* k, lapack_int* l,
-                    const float* v, lapack_int* ldv, const float* t,
-                    lapack_int* ldt, float* a, lapack_int* lda, float* b,
-                    lapack_int* ldb, const float* mywork,
-                    lapack_int* myldwork );
-void LAPACK_dtprfb( char* side, char* trans, char* direct, char* storev,
-                    lapack_int* m, lapack_int* n, lapack_int* k, lapack_int* l,
-                    const double* v, lapack_int* ldv, const double* t,
-                    lapack_int* ldt, double* a, lapack_int* lda, double* b,
-                    lapack_int* ldb, const double* mywork,
-                    lapack_int* myldwork );
-void LAPACK_ctprfb( char* side, char* trans, char* direct, char* storev,
-                    lapack_int* m, lapack_int* n, lapack_int* k, lapack_int* l,
-                    const lapack_complex_float* v, lapack_int* ldv,
-                    const lapack_complex_float* t, lapack_int* ldt,
-                    lapack_complex_float* a, lapack_int* lda,
-                    lapack_complex_float* b, lapack_int* ldb,
-                    const float* mywork, lapack_int* myldwork );
-void LAPACK_ztprfb( char* side, char* trans, char* direct, char* storev,
-                    lapack_int* m, lapack_int* n, lapack_int* k, lapack_int* l,
-                    const lapack_complex_double* v, lapack_int* ldv,
-                    const lapack_complex_double* t, lapack_int* ldt,
-                    lapack_complex_double* a, lapack_int* lda,
-                    lapack_complex_double* b, lapack_int* ldb,
-                    const double* mywork, lapack_int* myldwork );
+#define LAPACK_sgemqrt LAPACK_GLOBAL(sgemqrt, SGEMQRT)
+#define LAPACK_dgemqrt LAPACK_GLOBAL(dgemqrt, DGEMQRT)
+#define LAPACK_cgemqrt LAPACK_GLOBAL(cgemqrt, CGEMQRT)
+#define LAPACK_zgemqrt LAPACK_GLOBAL(zgemqrt, ZGEMQRT)
+#define LAPACK_sgeqrt LAPACK_GLOBAL(sgeqrt, SGEQRT)
+#define LAPACK_dgeqrt LAPACK_GLOBAL(dgeqrt, DGEQRT)
+#define LAPACK_cgeqrt LAPACK_GLOBAL(cgeqrt, CGEQRT)
+#define LAPACK_zgeqrt LAPACK_GLOBAL(zgeqrt, ZGEQRT)
+#define LAPACK_sgeqrt2 LAPACK_GLOBAL(sgeqrt2, SGEQRT2)
+#define LAPACK_dgeqrt2 LAPACK_GLOBAL(dgeqrt2, DGEQRT2)
+#define LAPACK_cgeqrt2 LAPACK_GLOBAL(cgeqrt2, CGEQRT2)
+#define LAPACK_zgeqrt2 LAPACK_GLOBAL(zgeqrt2, ZGEQRT2)
+#define LAPACK_sgeqrt3 LAPACK_GLOBAL(sgeqrt3, SGEQRT3)
+#define LAPACK_dgeqrt3 LAPACK_GLOBAL(dgeqrt3, DGEQRT3)
+#define LAPACK_cgeqrt3 LAPACK_GLOBAL(cgeqrt3, CGEQRT3)
+#define LAPACK_zgeqrt3 LAPACK_GLOBAL(zgeqrt3, ZGEQRT3)
+#define LAPACK_stpmqrt LAPACK_GLOBAL(stpmqrt, STPMQRT)
+#define LAPACK_dtpmqrt LAPACK_GLOBAL(dtpmqrt, DTPMQRT)
+#define LAPACK_ctpmqrt LAPACK_GLOBAL(ctpmqrt, CTPMQRT)
+#define LAPACK_ztpmqrt LAPACK_GLOBAL(ztpmqrt, ZTPMQRT)
+#define LAPACK_dtpqrt LAPACK_GLOBAL(dtpqrt, DTPQRT)
+#define LAPACK_ctpqrt LAPACK_GLOBAL(ctpqrt, CTPQRT)
+#define LAPACK_ztpqrt LAPACK_GLOBAL(ztpqrt, ZTPQRT)
+#define LAPACK_stpqrt2 LAPACK_GLOBAL(stpqrt2, STPQRT2)
+#define LAPACK_dtpqrt2 LAPACK_GLOBAL(dtpqrt2, DTPQRT2)
+#define LAPACK_ctpqrt2 LAPACK_GLOBAL(ctpqrt2, CTPQRT2)
+#define LAPACK_ztpqrt2 LAPACK_GLOBAL(ztpqrt2, ZTPQRT2)
+#define LAPACK_stprfb LAPACK_GLOBAL(stprfb, STPRFB)
+#define LAPACK_dtprfb LAPACK_GLOBAL(dtprfb, DTPRFB)
+#define LAPACK_ctprfb LAPACK_GLOBAL(ctprfb, CTPRFB)
+#define LAPACK_ztprfb LAPACK_GLOBAL(ztprfb, ZTPRFB)
 // LAPACK 3.X.X
-void LAPACK_csyr( char* uplo, lapack_int* n, lapack_complex_float* alpha,
-                      const lapack_complex_float* x, lapack_int* incx,
-                      lapack_complex_float* a, lapack_int* lda );
-void LAPACK_zsyr( char* uplo, lapack_int* n, lapack_complex_double* alpha,
-                      const lapack_complex_double* x, lapack_int* incx,
-                      lapack_complex_double* a, lapack_int* lda );
+#define LAPACK_csyr LAPACK_GLOBAL(csyr, CSYR)
+#define LAPACK_zsyr LAPACK_GLOBAL(zsyr, ZSYR)
+
+void LAPACK_sgetrf(lapack_int* m, lapack_int* n, float* a, lapack_int* lda, lapack_int* ipiv, lapack_int* info);
+void LAPACK_dgetrf(lapack_int* m, lapack_int* n, double* a, lapack_int* lda, lapack_int* ipiv, lapack_int* info);
+void LAPACK_cgetrf(lapack_int* m, lapack_int* n, lapack_complex_float* a, lapack_int* lda, lapack_int* ipiv,
+                   lapack_int* info);
+void LAPACK_zgetrf(lapack_int* m, lapack_int* n, lapack_complex_double* a, lapack_int* lda, lapack_int* ipiv,
+                   lapack_int* info);
+void LAPACK_sgbtrf(lapack_int* m, lapack_int* n, lapack_int* kl, lapack_int* ku, float* ab, lapack_int* ldab,
+                   lapack_int* ipiv, lapack_int* info);
+void LAPACK_dgbtrf(lapack_int* m, lapack_int* n, lapack_int* kl, lapack_int* ku, double* ab, lapack_int* ldab,
+                   lapack_int* ipiv, lapack_int* info);
+void LAPACK_cgbtrf(lapack_int* m, lapack_int* n, lapack_int* kl, lapack_int* ku, lapack_complex_float* ab,
+                   lapack_int* ldab, lapack_int* ipiv, lapack_int* info);
+void LAPACK_zgbtrf(lapack_int* m, lapack_int* n, lapack_int* kl, lapack_int* ku, lapack_complex_double* ab,
+                   lapack_int* ldab, lapack_int* ipiv, lapack_int* info);
+void LAPACK_sgttrf(lapack_int* n, float* dl, float* d, float* du, float* du2, lapack_int* ipiv, lapack_int* info);
+void LAPACK_dgttrf(lapack_int* n, double* dl, double* d, double* du, double* du2, lapack_int* ipiv, lapack_int* info);
+void LAPACK_cgttrf(lapack_int* n, lapack_complex_float* dl, lapack_complex_float* d, lapack_complex_float* du,
+                   lapack_complex_float* du2, lapack_int* ipiv, lapack_int* info);
+void LAPACK_zgttrf(lapack_int* n, lapack_complex_double* dl, lapack_complex_double* d, lapack_complex_double* du,
+                   lapack_complex_double* du2, lapack_int* ipiv, lapack_int* info);
+void LAPACK_spotrf(char* uplo, lapack_int* n, float* a, lapack_int* lda, lapack_int* info);
+void LAPACK_dpotrf(char* uplo, lapack_int* n, double* a, lapack_int* lda, lapack_int* info);
+void LAPACK_cpotrf(char* uplo, lapack_int* n, lapack_complex_float* a, lapack_int* lda, lapack_int* info);
+void LAPACK_zpotrf(char* uplo, lapack_int* n, lapack_complex_double* a, lapack_int* lda, lapack_int* info);
+void LAPACK_dpstrf(char* uplo, lapack_int* n, double* a, lapack_int* lda, lapack_int* piv, lapack_int* rank,
+                   double* tol, double* work, lapack_int* info);
+void LAPACK_spstrf(char* uplo, lapack_int* n, float* a, lapack_int* lda, lapack_int* piv, lapack_int* rank, float* tol,
+                   float* work, lapack_int* info);
+void LAPACK_zpstrf(char* uplo, lapack_int* n, lapack_complex_double* a, lapack_int* lda, lapack_int* piv,
+                   lapack_int* rank, double* tol, double* work, lapack_int* info);
+void LAPACK_cpstrf(char* uplo, lapack_int* n, lapack_complex_float* a, lapack_int* lda, lapack_int* piv,
+                   lapack_int* rank, float* tol, float* work, lapack_int* info);
+void LAPACK_dpftrf(char* transr, char* uplo, lapack_int* n, double* a, lapack_int* info);
+void LAPACK_spftrf(char* transr, char* uplo, lapack_int* n, float* a, lapack_int* info);
+void LAPACK_zpftrf(char* transr, char* uplo, lapack_int* n, lapack_complex_double* a, lapack_int* info);
+void LAPACK_cpftrf(char* transr, char* uplo, lapack_int* n, lapack_complex_float* a, lapack_int* info);
+void LAPACK_spptrf(char* uplo, lapack_int* n, float* ap, lapack_int* info);
+void LAPACK_dpptrf(char* uplo, lapack_int* n, double* ap, lapack_int* info);
+void LAPACK_cpptrf(char* uplo, lapack_int* n, lapack_complex_float* ap, lapack_int* info);
+void LAPACK_zpptrf(char* uplo, lapack_int* n, lapack_complex_double* ap, lapack_int* info);
+void LAPACK_spbtrf(char* uplo, lapack_int* n, lapack_int* kd, float* ab, lapack_int* ldab, lapack_int* info);
+void LAPACK_dpbtrf(char* uplo, lapack_int* n, lapack_int* kd, double* ab, lapack_int* ldab, lapack_int* info);
+void LAPACK_cpbtrf(char* uplo, lapack_int* n, lapack_int* kd, lapack_complex_float* ab, lapack_int* ldab,
+                   lapack_int* info);
+void LAPACK_zpbtrf(char* uplo, lapack_int* n, lapack_int* kd, lapack_complex_double* ab, lapack_int* ldab,
+                   lapack_int* info);
+void LAPACK_spttrf(lapack_int* n, float* d, float* e, lapack_int* info);
+void LAPACK_dpttrf(lapack_int* n, double* d, double* e, lapack_int* info);
+void LAPACK_cpttrf(lapack_int* n, float* d, lapack_complex_float* e, lapack_int* info);
+void LAPACK_zpttrf(lapack_int* n, double* d, lapack_complex_double* e, lapack_int* info);
+void LAPACK_ssytrf(char* uplo, lapack_int* n, float* a, lapack_int* lda, lapack_int* ipiv, float* work,
+                   lapack_int* lwork, lapack_int* info);
+void LAPACK_dsytrf(char* uplo, lapack_int* n, double* a, lapack_int* lda, lapack_int* ipiv, double* work,
+                   lapack_int* lwork, lapack_int* info);
+void LAPACK_csytrf(char* uplo, lapack_int* n, lapack_complex_float* a, lapack_int* lda, lapack_int* ipiv,
+                   lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zsytrf(char* uplo, lapack_int* n, lapack_complex_double* a, lapack_int* lda, lapack_int* ipiv,
+                   lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_chetrf(char* uplo, lapack_int* n, lapack_complex_float* a, lapack_int* lda, lapack_int* ipiv,
+                   lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zhetrf(char* uplo, lapack_int* n, lapack_complex_double* a, lapack_int* lda, lapack_int* ipiv,
+                   lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_ssptrf(char* uplo, lapack_int* n, float* ap, lapack_int* ipiv, lapack_int* info);
+void LAPACK_dsptrf(char* uplo, lapack_int* n, double* ap, lapack_int* ipiv, lapack_int* info);
+void LAPACK_csptrf(char* uplo, lapack_int* n, lapack_complex_float* ap, lapack_int* ipiv, lapack_int* info);
+void LAPACK_zsptrf(char* uplo, lapack_int* n, lapack_complex_double* ap, lapack_int* ipiv, lapack_int* info);
+void LAPACK_chptrf(char* uplo, lapack_int* n, lapack_complex_float* ap, lapack_int* ipiv, lapack_int* info);
+void LAPACK_zhptrf(char* uplo, lapack_int* n, lapack_complex_double* ap, lapack_int* ipiv, lapack_int* info);
+void LAPACK_sgetrs(char* trans, lapack_int* n, lapack_int* nrhs, const float* a, lapack_int* lda,
+                   const lapack_int* ipiv, float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_dgetrs(char* trans, lapack_int* n, lapack_int* nrhs, const double* a, lapack_int* lda,
+                   const lapack_int* ipiv, double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_cgetrs(char* trans, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* a, lapack_int* lda,
+                   const lapack_int* ipiv, lapack_complex_float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_zgetrs(char* trans, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* a, lapack_int* lda,
+                   const lapack_int* ipiv, lapack_complex_double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_sgbtrs(char* trans, lapack_int* n, lapack_int* kl, lapack_int* ku, lapack_int* nrhs, const float* ab,
+                   lapack_int* ldab, const lapack_int* ipiv, float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_dgbtrs(char* trans, lapack_int* n, lapack_int* kl, lapack_int* ku, lapack_int* nrhs, const double* ab,
+                   lapack_int* ldab, const lapack_int* ipiv, double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_cgbtrs(char* trans, lapack_int* n, lapack_int* kl, lapack_int* ku, lapack_int* nrhs,
+                   const lapack_complex_float* ab, lapack_int* ldab, const lapack_int* ipiv, lapack_complex_float* b,
+                   lapack_int* ldb, lapack_int* info);
+void LAPACK_zgbtrs(char* trans, lapack_int* n, lapack_int* kl, lapack_int* ku, lapack_int* nrhs,
+                   const lapack_complex_double* ab, lapack_int* ldab, const lapack_int* ipiv, lapack_complex_double* b,
+                   lapack_int* ldb, lapack_int* info);
+void LAPACK_sgttrs(char* trans, lapack_int* n, lapack_int* nrhs, const float* dl, const float* d, const float* du,
+                   const float* du2, const lapack_int* ipiv, float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_dgttrs(char* trans, lapack_int* n, lapack_int* nrhs, const double* dl, const double* d, const double* du,
+                   const double* du2, const lapack_int* ipiv, double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_cgttrs(char* trans, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* dl,
+                   const lapack_complex_float* d, const lapack_complex_float* du, const lapack_complex_float* du2,
+                   const lapack_int* ipiv, lapack_complex_float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_zgttrs(char* trans, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* dl,
+                   const lapack_complex_double* d, const lapack_complex_double* du, const lapack_complex_double* du2,
+                   const lapack_int* ipiv, lapack_complex_double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_spotrs(char* uplo, lapack_int* n, lapack_int* nrhs, const float* a, lapack_int* lda, float* b,
+                   lapack_int* ldb, lapack_int* info);
+void LAPACK_dpotrs(char* uplo, lapack_int* n, lapack_int* nrhs, const double* a, lapack_int* lda, double* b,
+                   lapack_int* ldb, lapack_int* info);
+void LAPACK_cpotrs(char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* a, lapack_int* lda,
+                   lapack_complex_float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_zpotrs(char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* a, lapack_int* lda,
+                   lapack_complex_double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_dpftrs(char* transr, char* uplo, lapack_int* n, lapack_int* nrhs, const double* a, double* b,
+                   lapack_int* ldb, lapack_int* info);
+void LAPACK_spftrs(char* transr, char* uplo, lapack_int* n, lapack_int* nrhs, const float* a, float* b, lapack_int* ldb,
+                   lapack_int* info);
+void LAPACK_zpftrs(char* transr, char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* a,
+                   lapack_complex_double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_cpftrs(char* transr, char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* a,
+                   lapack_complex_float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_spptrs(char* uplo, lapack_int* n, lapack_int* nrhs, const float* ap, float* b, lapack_int* ldb,
+                   lapack_int* info);
+void LAPACK_dpptrs(char* uplo, lapack_int* n, lapack_int* nrhs, const double* ap, double* b, lapack_int* ldb,
+                   lapack_int* info);
+void LAPACK_cpptrs(char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* ap, lapack_complex_float* b,
+                   lapack_int* ldb, lapack_int* info);
+void LAPACK_zpptrs(char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* ap,
+                   lapack_complex_double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_spbtrs(char* uplo, lapack_int* n, lapack_int* kd, lapack_int* nrhs, const float* ab, lapack_int* ldab,
+                   float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_dpbtrs(char* uplo, lapack_int* n, lapack_int* kd, lapack_int* nrhs, const double* ab, lapack_int* ldab,
+                   double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_cpbtrs(char* uplo, lapack_int* n, lapack_int* kd, lapack_int* nrhs, const lapack_complex_float* ab,
+                   lapack_int* ldab, lapack_complex_float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_zpbtrs(char* uplo, lapack_int* n, lapack_int* kd, lapack_int* nrhs, const lapack_complex_double* ab,
+                   lapack_int* ldab, lapack_complex_double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_spttrs(lapack_int* n, lapack_int* nrhs, const float* d, const float* e, float* b, lapack_int* ldb,
+                   lapack_int* info);
+void LAPACK_dpttrs(lapack_int* n, lapack_int* nrhs, const double* d, const double* e, double* b, lapack_int* ldb,
+                   lapack_int* info);
+void LAPACK_cpttrs(char* uplo, lapack_int* n, lapack_int* nrhs, const float* d, const lapack_complex_float* e,
+                   lapack_complex_float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_zpttrs(char* uplo, lapack_int* n, lapack_int* nrhs, const double* d, const lapack_complex_double* e,
+                   lapack_complex_double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_ssytrs(char* uplo, lapack_int* n, lapack_int* nrhs, const float* a, lapack_int* lda, const lapack_int* ipiv,
+                   float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_dsytrs(char* uplo, lapack_int* n, lapack_int* nrhs, const double* a, lapack_int* lda,
+                   const lapack_int* ipiv, double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_csytrs(char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* a, lapack_int* lda,
+                   const lapack_int* ipiv, lapack_complex_float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_zsytrs(char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* a, lapack_int* lda,
+                   const lapack_int* ipiv, lapack_complex_double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_chetrs(char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* a, lapack_int* lda,
+                   const lapack_int* ipiv, lapack_complex_float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_zhetrs(char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* a, lapack_int* lda,
+                   const lapack_int* ipiv, lapack_complex_double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_ssptrs(char* uplo, lapack_int* n, lapack_int* nrhs, const float* ap, const lapack_int* ipiv, float* b,
+                   lapack_int* ldb, lapack_int* info);
+void LAPACK_dsptrs(char* uplo, lapack_int* n, lapack_int* nrhs, const double* ap, const lapack_int* ipiv, double* b,
+                   lapack_int* ldb, lapack_int* info);
+void LAPACK_csptrs(char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* ap, const lapack_int* ipiv,
+                   lapack_complex_float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_zsptrs(char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* ap, const lapack_int* ipiv,
+                   lapack_complex_double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_chptrs(char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* ap, const lapack_int* ipiv,
+                   lapack_complex_float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_zhptrs(char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* ap, const lapack_int* ipiv,
+                   lapack_complex_double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_strtrs(char* uplo, char* trans, char* diag, lapack_int* n, lapack_int* nrhs, const float* a,
+                   lapack_int* lda, float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_dtrtrs(char* uplo, char* trans, char* diag, lapack_int* n, lapack_int* nrhs, const double* a,
+                   lapack_int* lda, double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_ctrtrs(char* uplo, char* trans, char* diag, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* a,
+                   lapack_int* lda, lapack_complex_float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_ztrtrs(char* uplo, char* trans, char* diag, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* a,
+                   lapack_int* lda, lapack_complex_double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_stptrs(char* uplo, char* trans, char* diag, lapack_int* n, lapack_int* nrhs, const float* ap, float* b,
+                   lapack_int* ldb, lapack_int* info);
+void LAPACK_dtptrs(char* uplo, char* trans, char* diag, lapack_int* n, lapack_int* nrhs, const double* ap, double* b,
+                   lapack_int* ldb, lapack_int* info);
+void LAPACK_ctptrs(char* uplo, char* trans, char* diag, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* ap,
+                   lapack_complex_float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_ztptrs(char* uplo, char* trans, char* diag, lapack_int* n, lapack_int* nrhs,
+                   const lapack_complex_double* ap, lapack_complex_double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_stbtrs(char* uplo, char* trans, char* diag, lapack_int* n, lapack_int* kd, lapack_int* nrhs,
+                   const float* ab, lapack_int* ldab, float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_dtbtrs(char* uplo, char* trans, char* diag, lapack_int* n, lapack_int* kd, lapack_int* nrhs,
+                   const double* ab, lapack_int* ldab, double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_ctbtrs(char* uplo, char* trans, char* diag, lapack_int* n, lapack_int* kd, lapack_int* nrhs,
+                   const lapack_complex_float* ab, lapack_int* ldab, lapack_complex_float* b, lapack_int* ldb,
+                   lapack_int* info);
+void LAPACK_ztbtrs(char* uplo, char* trans, char* diag, lapack_int* n, lapack_int* kd, lapack_int* nrhs,
+                   const lapack_complex_double* ab, lapack_int* ldab, lapack_complex_double* b, lapack_int* ldb,
+                   lapack_int* info);
+void LAPACK_sgecon(char* norm, lapack_int* n, const float* a, lapack_int* lda, float* anorm, float* rcond, float* work,
+                   lapack_int* iwork, lapack_int* info);
+void LAPACK_dgecon(char* norm, lapack_int* n, const double* a, lapack_int* lda, double* anorm, double* rcond,
+                   double* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_cgecon(char* norm, lapack_int* n, const lapack_complex_float* a, lapack_int* lda, float* anorm,
+                   float* rcond, lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_zgecon(char* norm, lapack_int* n, const lapack_complex_double* a, lapack_int* lda, double* anorm,
+                   double* rcond, lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_sgbcon(char* norm, lapack_int* n, lapack_int* kl, lapack_int* ku, const float* ab, lapack_int* ldab,
+                   const lapack_int* ipiv, float* anorm, float* rcond, float* work, lapack_int* iwork,
+                   lapack_int* info);
+void LAPACK_dgbcon(char* norm, lapack_int* n, lapack_int* kl, lapack_int* ku, const double* ab, lapack_int* ldab,
+                   const lapack_int* ipiv, double* anorm, double* rcond, double* work, lapack_int* iwork,
+                   lapack_int* info);
+void LAPACK_cgbcon(char* norm, lapack_int* n, lapack_int* kl, lapack_int* ku, const lapack_complex_float* ab,
+                   lapack_int* ldab, const lapack_int* ipiv, float* anorm, float* rcond, lapack_complex_float* work,
+                   float* rwork, lapack_int* info);
+void LAPACK_zgbcon(char* norm, lapack_int* n, lapack_int* kl, lapack_int* ku, const lapack_complex_double* ab,
+                   lapack_int* ldab, const lapack_int* ipiv, double* anorm, double* rcond, lapack_complex_double* work,
+                   double* rwork, lapack_int* info);
+void LAPACK_sgtcon(char* norm, lapack_int* n, const float* dl, const float* d, const float* du, const float* du2,
+                   const lapack_int* ipiv, float* anorm, float* rcond, float* work, lapack_int* iwork,
+                   lapack_int* info);
+void LAPACK_dgtcon(char* norm, lapack_int* n, const double* dl, const double* d, const double* du, const double* du2,
+                   const lapack_int* ipiv, double* anorm, double* rcond, double* work, lapack_int* iwork,
+                   lapack_int* info);
+void LAPACK_cgtcon(char* norm, lapack_int* n, const lapack_complex_float* dl, const lapack_complex_float* d,
+                   const lapack_complex_float* du, const lapack_complex_float* du2, const lapack_int* ipiv,
+                   float* anorm, float* rcond, lapack_complex_float* work, lapack_int* info);
+void LAPACK_zgtcon(char* norm, lapack_int* n, const lapack_complex_double* dl, const lapack_complex_double* d,
+                   const lapack_complex_double* du, const lapack_complex_double* du2, const lapack_int* ipiv,
+                   double* anorm, double* rcond, lapack_complex_double* work, lapack_int* info);
+void LAPACK_spocon(char* uplo, lapack_int* n, const float* a, lapack_int* lda, float* anorm, float* rcond, float* work,
+                   lapack_int* iwork, lapack_int* info);
+void LAPACK_dpocon(char* uplo, lapack_int* n, const double* a, lapack_int* lda, double* anorm, double* rcond,
+                   double* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_cpocon(char* uplo, lapack_int* n, const lapack_complex_float* a, lapack_int* lda, float* anorm,
+                   float* rcond, lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_zpocon(char* uplo, lapack_int* n, const lapack_complex_double* a, lapack_int* lda, double* anorm,
+                   double* rcond, lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_sppcon(char* uplo, lapack_int* n, const float* ap, float* anorm, float* rcond, float* work,
+                   lapack_int* iwork, lapack_int* info);
+void LAPACK_dppcon(char* uplo, lapack_int* n, const double* ap, double* anorm, double* rcond, double* work,
+                   lapack_int* iwork, lapack_int* info);
+void LAPACK_cppcon(char* uplo, lapack_int* n, const lapack_complex_float* ap, float* anorm, float* rcond,
+                   lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_zppcon(char* uplo, lapack_int* n, const lapack_complex_double* ap, double* anorm, double* rcond,
+                   lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_spbcon(char* uplo, lapack_int* n, lapack_int* kd, const float* ab, lapack_int* ldab, float* anorm,
+                   float* rcond, float* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_dpbcon(char* uplo, lapack_int* n, lapack_int* kd, const double* ab, lapack_int* ldab, double* anorm,
+                   double* rcond, double* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_cpbcon(char* uplo, lapack_int* n, lapack_int* kd, const lapack_complex_float* ab, lapack_int* ldab,
+                   float* anorm, float* rcond, lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_zpbcon(char* uplo, lapack_int* n, lapack_int* kd, const lapack_complex_double* ab, lapack_int* ldab,
+                   double* anorm, double* rcond, lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_sptcon(lapack_int* n, const float* d, const float* e, float* anorm, float* rcond, float* work,
+                   lapack_int* info);
+void LAPACK_dptcon(lapack_int* n, const double* d, const double* e, double* anorm, double* rcond, double* work,
+                   lapack_int* info);
+void LAPACK_cptcon(lapack_int* n, const float* d, const lapack_complex_float* e, float* anorm, float* rcond,
+                   float* work, lapack_int* info);
+void LAPACK_zptcon(lapack_int* n, const double* d, const lapack_complex_double* e, double* anorm, double* rcond,
+                   double* work, lapack_int* info);
+void LAPACK_ssycon(char* uplo, lapack_int* n, const float* a, lapack_int* lda, const lapack_int* ipiv, float* anorm,
+                   float* rcond, float* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_dsycon(char* uplo, lapack_int* n, const double* a, lapack_int* lda, const lapack_int* ipiv, double* anorm,
+                   double* rcond, double* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_csycon(char* uplo, lapack_int* n, const lapack_complex_float* a, lapack_int* lda, const lapack_int* ipiv,
+                   float* anorm, float* rcond, lapack_complex_float* work, lapack_int* info);
+void LAPACK_zsycon(char* uplo, lapack_int* n, const lapack_complex_double* a, lapack_int* lda, const lapack_int* ipiv,
+                   double* anorm, double* rcond, lapack_complex_double* work, lapack_int* info);
+void LAPACK_checon(char* uplo, lapack_int* n, const lapack_complex_float* a, lapack_int* lda, const lapack_int* ipiv,
+                   float* anorm, float* rcond, lapack_complex_float* work, lapack_int* info);
+void LAPACK_zhecon(char* uplo, lapack_int* n, const lapack_complex_double* a, lapack_int* lda, const lapack_int* ipiv,
+                   double* anorm, double* rcond, lapack_complex_double* work, lapack_int* info);
+void LAPACK_sspcon(char* uplo, lapack_int* n, const float* ap, const lapack_int* ipiv, float* anorm, float* rcond,
+                   float* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_dspcon(char* uplo, lapack_int* n, const double* ap, const lapack_int* ipiv, double* anorm, double* rcond,
+                   double* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_cspcon(char* uplo, lapack_int* n, const lapack_complex_float* ap, const lapack_int* ipiv, float* anorm,
+                   float* rcond, lapack_complex_float* work, lapack_int* info);
+void LAPACK_zspcon(char* uplo, lapack_int* n, const lapack_complex_double* ap, const lapack_int* ipiv, double* anorm,
+                   double* rcond, lapack_complex_double* work, lapack_int* info);
+void LAPACK_chpcon(char* uplo, lapack_int* n, const lapack_complex_float* ap, const lapack_int* ipiv, float* anorm,
+                   float* rcond, lapack_complex_float* work, lapack_int* info);
+void LAPACK_zhpcon(char* uplo, lapack_int* n, const lapack_complex_double* ap, const lapack_int* ipiv, double* anorm,
+                   double* rcond, lapack_complex_double* work, lapack_int* info);
+void LAPACK_strcon(char* norm, char* uplo, char* diag, lapack_int* n, const float* a, lapack_int* lda, float* rcond,
+                   float* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_dtrcon(char* norm, char* uplo, char* diag, lapack_int* n, const double* a, lapack_int* lda, double* rcond,
+                   double* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_ctrcon(char* norm, char* uplo, char* diag, lapack_int* n, const lapack_complex_float* a, lapack_int* lda,
+                   float* rcond, lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_ztrcon(char* norm, char* uplo, char* diag, lapack_int* n, const lapack_complex_double* a, lapack_int* lda,
+                   double* rcond, lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_stpcon(char* norm, char* uplo, char* diag, lapack_int* n, const float* ap, float* rcond, float* work,
+                   lapack_int* iwork, lapack_int* info);
+void LAPACK_dtpcon(char* norm, char* uplo, char* diag, lapack_int* n, const double* ap, double* rcond, double* work,
+                   lapack_int* iwork, lapack_int* info);
+void LAPACK_ctpcon(char* norm, char* uplo, char* diag, lapack_int* n, const lapack_complex_float* ap, float* rcond,
+                   lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_ztpcon(char* norm, char* uplo, char* diag, lapack_int* n, const lapack_complex_double* ap, double* rcond,
+                   lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_stbcon(char* norm, char* uplo, char* diag, lapack_int* n, lapack_int* kd, const float* ab, lapack_int* ldab,
+                   float* rcond, float* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_dtbcon(char* norm, char* uplo, char* diag, lapack_int* n, lapack_int* kd, const double* ab,
+                   lapack_int* ldab, double* rcond, double* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_ctbcon(char* norm, char* uplo, char* diag, lapack_int* n, lapack_int* kd, const lapack_complex_float* ab,
+                   lapack_int* ldab, float* rcond, lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_ztbcon(char* norm, char* uplo, char* diag, lapack_int* n, lapack_int* kd, const lapack_complex_double* ab,
+                   lapack_int* ldab, double* rcond, lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_sgerfs(char* trans, lapack_int* n, lapack_int* nrhs, const float* a, lapack_int* lda, const float* af,
+                   lapack_int* ldaf, const lapack_int* ipiv, const float* b, lapack_int* ldb, float* x, lapack_int* ldx,
+                   float* ferr, float* berr, float* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_dgerfs(char* trans, lapack_int* n, lapack_int* nrhs, const double* a, lapack_int* lda, const double* af,
+                   lapack_int* ldaf, const lapack_int* ipiv, const double* b, lapack_int* ldb, double* x,
+                   lapack_int* ldx, double* ferr, double* berr, double* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_cgerfs(char* trans, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* a, lapack_int* lda,
+                   const lapack_complex_float* af, lapack_int* ldaf, const lapack_int* ipiv,
+                   const lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* x, lapack_int* ldx,
+                   float* ferr, float* berr, lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_zgerfs(char* trans, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* a, lapack_int* lda,
+                   const lapack_complex_double* af, lapack_int* ldaf, const lapack_int* ipiv,
+                   const lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx,
+                   double* ferr, double* berr, lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_dgerfsx(char* trans, char* equed, lapack_int* n, lapack_int* nrhs, const double* a, lapack_int* lda,
+                    const double* af, lapack_int* ldaf, const lapack_int* ipiv, const double* r, const double* c,
+                    const double* b, lapack_int* ldb, double* x, lapack_int* ldx, double* rcond, double* berr,
+                    lapack_int* n_err_bnds, double* err_bnds_norm, double* err_bnds_comp, lapack_int* nparams,
+                    double* params, double* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_sgerfsx(char* trans, char* equed, lapack_int* n, lapack_int* nrhs, const float* a, lapack_int* lda,
+                    const float* af, lapack_int* ldaf, const lapack_int* ipiv, const float* r, const float* c,
+                    const float* b, lapack_int* ldb, float* x, lapack_int* ldx, float* rcond, float* berr,
+                    lapack_int* n_err_bnds, float* err_bnds_norm, float* err_bnds_comp, lapack_int* nparams,
+                    float* params, float* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_zgerfsx(char* trans, char* equed, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* a,
+                    lapack_int* lda, const lapack_complex_double* af, lapack_int* ldaf, const lapack_int* ipiv,
+                    const double* r, const double* c, const lapack_complex_double* b, lapack_int* ldb,
+                    lapack_complex_double* x, lapack_int* ldx, double* rcond, double* berr, lapack_int* n_err_bnds,
+                    double* err_bnds_norm, double* err_bnds_comp, lapack_int* nparams, double* params,
+                    lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_cgerfsx(char* trans, char* equed, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* a,
+                    lapack_int* lda, const lapack_complex_float* af, lapack_int* ldaf, const lapack_int* ipiv,
+                    const float* r, const float* c, const lapack_complex_float* b, lapack_int* ldb,
+                    lapack_complex_float* x, lapack_int* ldx, float* rcond, float* berr, lapack_int* n_err_bnds,
+                    float* err_bnds_norm, float* err_bnds_comp, lapack_int* nparams, float* params,
+                    lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_sgbrfs(char* trans, lapack_int* n, lapack_int* kl, lapack_int* ku, lapack_int* nrhs, const float* ab,
+                   lapack_int* ldab, const float* afb, lapack_int* ldafb, const lapack_int* ipiv, const float* b,
+                   lapack_int* ldb, float* x, lapack_int* ldx, float* ferr, float* berr, float* work, lapack_int* iwork,
+                   lapack_int* info);
+void LAPACK_dgbrfs(char* trans, lapack_int* n, lapack_int* kl, lapack_int* ku, lapack_int* nrhs, const double* ab,
+                   lapack_int* ldab, const double* afb, lapack_int* ldafb, const lapack_int* ipiv, const double* b,
+                   lapack_int* ldb, double* x, lapack_int* ldx, double* ferr, double* berr, double* work,
+                   lapack_int* iwork, lapack_int* info);
+void LAPACK_cgbrfs(char* trans, lapack_int* n, lapack_int* kl, lapack_int* ku, lapack_int* nrhs,
+                   const lapack_complex_float* ab, lapack_int* ldab, const lapack_complex_float* afb, lapack_int* ldafb,
+                   const lapack_int* ipiv, const lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* x,
+                   lapack_int* ldx, float* ferr, float* berr, lapack_complex_float* work, float* rwork,
+                   lapack_int* info);
+void LAPACK_zgbrfs(char* trans, lapack_int* n, lapack_int* kl, lapack_int* ku, lapack_int* nrhs,
+                   const lapack_complex_double* ab, lapack_int* ldab, const lapack_complex_double* afb,
+                   lapack_int* ldafb, const lapack_int* ipiv, const lapack_complex_double* b, lapack_int* ldb,
+                   lapack_complex_double* x, lapack_int* ldx, double* ferr, double* berr, lapack_complex_double* work,
+                   double* rwork, lapack_int* info);
+void LAPACK_dgbrfsx(char* trans, char* equed, lapack_int* n, lapack_int* kl, lapack_int* ku, lapack_int* nrhs,
+                    const double* ab, lapack_int* ldab, const double* afb, lapack_int* ldafb, const lapack_int* ipiv,
+                    const double* r, const double* c, const double* b, lapack_int* ldb, double* x, lapack_int* ldx,
+                    double* rcond, double* berr, lapack_int* n_err_bnds, double* err_bnds_norm, double* err_bnds_comp,
+                    lapack_int* nparams, double* params, double* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_sgbrfsx(char* trans, char* equed, lapack_int* n, lapack_int* kl, lapack_int* ku, lapack_int* nrhs,
+                    const float* ab, lapack_int* ldab, const float* afb, lapack_int* ldafb, const lapack_int* ipiv,
+                    const float* r, const float* c, const float* b, lapack_int* ldb, float* x, lapack_int* ldx,
+                    float* rcond, float* berr, lapack_int* n_err_bnds, float* err_bnds_norm, float* err_bnds_comp,
+                    lapack_int* nparams, float* params, float* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_zgbrfsx(char* trans, char* equed, lapack_int* n, lapack_int* kl, lapack_int* ku, lapack_int* nrhs,
+                    const lapack_complex_double* ab, lapack_int* ldab, const lapack_complex_double* afb,
+                    lapack_int* ldafb, const lapack_int* ipiv, const double* r, const double* c,
+                    const lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx,
+                    double* rcond, double* berr, lapack_int* n_err_bnds, double* err_bnds_norm, double* err_bnds_comp,
+                    lapack_int* nparams, double* params, lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_cgbrfsx(char* trans, char* equed, lapack_int* n, lapack_int* kl, lapack_int* ku, lapack_int* nrhs,
+                    const lapack_complex_float* ab, lapack_int* ldab, const lapack_complex_float* afb,
+                    lapack_int* ldafb, const lapack_int* ipiv, const float* r, const float* c,
+                    const lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* x, lapack_int* ldx,
+                    float* rcond, float* berr, lapack_int* n_err_bnds, float* err_bnds_norm, float* err_bnds_comp,
+                    lapack_int* nparams, float* params, lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_sgtrfs(char* trans, lapack_int* n, lapack_int* nrhs, const float* dl, const float* d, const float* du,
+                   const float* dlf, const float* df, const float* duf, const float* du2, const lapack_int* ipiv,
+                   const float* b, lapack_int* ldb, float* x, lapack_int* ldx, float* ferr, float* berr, float* work,
+                   lapack_int* iwork, lapack_int* info);
+void LAPACK_dgtrfs(char* trans, lapack_int* n, lapack_int* nrhs, const double* dl, const double* d, const double* du,
+                   const double* dlf, const double* df, const double* duf, const double* du2, const lapack_int* ipiv,
+                   const double* b, lapack_int* ldb, double* x, lapack_int* ldx, double* ferr, double* berr,
+                   double* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_cgtrfs(char* trans, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* dl,
+                   const lapack_complex_float* d, const lapack_complex_float* du, const lapack_complex_float* dlf,
+                   const lapack_complex_float* df, const lapack_complex_float* duf, const lapack_complex_float* du2,
+                   const lapack_int* ipiv, const lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* x,
+                   lapack_int* ldx, float* ferr, float* berr, lapack_complex_float* work, float* rwork,
+                   lapack_int* info);
+void LAPACK_zgtrfs(char* trans, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* dl,
+                   const lapack_complex_double* d, const lapack_complex_double* du, const lapack_complex_double* dlf,
+                   const lapack_complex_double* df, const lapack_complex_double* duf, const lapack_complex_double* du2,
+                   const lapack_int* ipiv, const lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* x,
+                   lapack_int* ldx, double* ferr, double* berr, lapack_complex_double* work, double* rwork,
+                   lapack_int* info);
+void LAPACK_sporfs(char* uplo, lapack_int* n, lapack_int* nrhs, const float* a, lapack_int* lda, const float* af,
+                   lapack_int* ldaf, const float* b, lapack_int* ldb, float* x, lapack_int* ldx, float* ferr,
+                   float* berr, float* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_dporfs(char* uplo, lapack_int* n, lapack_int* nrhs, const double* a, lapack_int* lda, const double* af,
+                   lapack_int* ldaf, const double* b, lapack_int* ldb, double* x, lapack_int* ldx, double* ferr,
+                   double* berr, double* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_cporfs(char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* a, lapack_int* lda,
+                   const lapack_complex_float* af, lapack_int* ldaf, const lapack_complex_float* b, lapack_int* ldb,
+                   lapack_complex_float* x, lapack_int* ldx, float* ferr, float* berr, lapack_complex_float* work,
+                   float* rwork, lapack_int* info);
+void LAPACK_zporfs(char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* a, lapack_int* lda,
+                   const lapack_complex_double* af, lapack_int* ldaf, const lapack_complex_double* b, lapack_int* ldb,
+                   lapack_complex_double* x, lapack_int* ldx, double* ferr, double* berr, lapack_complex_double* work,
+                   double* rwork, lapack_int* info);
+void LAPACK_dporfsx(char* uplo, char* equed, lapack_int* n, lapack_int* nrhs, const double* a, lapack_int* lda,
+                    const double* af, lapack_int* ldaf, const double* s, const double* b, lapack_int* ldb, double* x,
+                    lapack_int* ldx, double* rcond, double* berr, lapack_int* n_err_bnds, double* err_bnds_norm,
+                    double* err_bnds_comp, lapack_int* nparams, double* params, double* work, lapack_int* iwork,
+                    lapack_int* info);
+void LAPACK_sporfsx(char* uplo, char* equed, lapack_int* n, lapack_int* nrhs, const float* a, lapack_int* lda,
+                    const float* af, lapack_int* ldaf, const float* s, const float* b, lapack_int* ldb, float* x,
+                    lapack_int* ldx, float* rcond, float* berr, lapack_int* n_err_bnds, float* err_bnds_norm,
+                    float* err_bnds_comp, lapack_int* nparams, float* params, float* work, lapack_int* iwork,
+                    lapack_int* info);
+void LAPACK_zporfsx(char* uplo, char* equed, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* a,
+                    lapack_int* lda, const lapack_complex_double* af, lapack_int* ldaf, const double* s,
+                    const lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx,
+                    double* rcond, double* berr, lapack_int* n_err_bnds, double* err_bnds_norm, double* err_bnds_comp,
+                    lapack_int* nparams, double* params, lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_cporfsx(char* uplo, char* equed, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* a,
+                    lapack_int* lda, const lapack_complex_float* af, lapack_int* ldaf, const float* s,
+                    const lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* x, lapack_int* ldx,
+                    float* rcond, float* berr, lapack_int* n_err_bnds, float* err_bnds_norm, float* err_bnds_comp,
+                    lapack_int* nparams, float* params, lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_spprfs(char* uplo, lapack_int* n, lapack_int* nrhs, const float* ap, const float* afp, const float* b,
+                   lapack_int* ldb, float* x, lapack_int* ldx, float* ferr, float* berr, float* work, lapack_int* iwork,
+                   lapack_int* info);
+void LAPACK_dpprfs(char* uplo, lapack_int* n, lapack_int* nrhs, const double* ap, const double* afp, const double* b,
+                   lapack_int* ldb, double* x, lapack_int* ldx, double* ferr, double* berr, double* work,
+                   lapack_int* iwork, lapack_int* info);
+void LAPACK_cpprfs(char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* ap,
+                   const lapack_complex_float* afp, const lapack_complex_float* b, lapack_int* ldb,
+                   lapack_complex_float* x, lapack_int* ldx, float* ferr, float* berr, lapack_complex_float* work,
+                   float* rwork, lapack_int* info);
+void LAPACK_zpprfs(char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* ap,
+                   const lapack_complex_double* afp, const lapack_complex_double* b, lapack_int* ldb,
+                   lapack_complex_double* x, lapack_int* ldx, double* ferr, double* berr, lapack_complex_double* work,
+                   double* rwork, lapack_int* info);
+void LAPACK_spbrfs(char* uplo, lapack_int* n, lapack_int* kd, lapack_int* nrhs, const float* ab, lapack_int* ldab,
+                   const float* afb, lapack_int* ldafb, const float* b, lapack_int* ldb, float* x, lapack_int* ldx,
+                   float* ferr, float* berr, float* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_dpbrfs(char* uplo, lapack_int* n, lapack_int* kd, lapack_int* nrhs, const double* ab, lapack_int* ldab,
+                   const double* afb, lapack_int* ldafb, const double* b, lapack_int* ldb, double* x, lapack_int* ldx,
+                   double* ferr, double* berr, double* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_cpbrfs(char* uplo, lapack_int* n, lapack_int* kd, lapack_int* nrhs, const lapack_complex_float* ab,
+                   lapack_int* ldab, const lapack_complex_float* afb, lapack_int* ldafb, const lapack_complex_float* b,
+                   lapack_int* ldb, lapack_complex_float* x, lapack_int* ldx, float* ferr, float* berr,
+                   lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_zpbrfs(char* uplo, lapack_int* n, lapack_int* kd, lapack_int* nrhs, const lapack_complex_double* ab,
+                   lapack_int* ldab, const lapack_complex_double* afb, lapack_int* ldafb,
+                   const lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx,
+                   double* ferr, double* berr, lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_sptrfs(lapack_int* n, lapack_int* nrhs, const float* d, const float* e, const float* df, const float* ef,
+                   const float* b, lapack_int* ldb, float* x, lapack_int* ldx, float* ferr, float* berr, float* work,
+                   lapack_int* info);
+void LAPACK_dptrfs(lapack_int* n, lapack_int* nrhs, const double* d, const double* e, const double* df,
+                   const double* ef, const double* b, lapack_int* ldb, double* x, lapack_int* ldx, double* ferr,
+                   double* berr, double* work, lapack_int* info);
+void LAPACK_cptrfs(char* uplo, lapack_int* n, lapack_int* nrhs, const float* d, const lapack_complex_float* e,
+                   const float* df, const lapack_complex_float* ef, const lapack_complex_float* b, lapack_int* ldb,
+                   lapack_complex_float* x, lapack_int* ldx, float* ferr, float* berr, lapack_complex_float* work,
+                   float* rwork, lapack_int* info);
+void LAPACK_zptrfs(char* uplo, lapack_int* n, lapack_int* nrhs, const double* d, const lapack_complex_double* e,
+                   const double* df, const lapack_complex_double* ef, const lapack_complex_double* b, lapack_int* ldb,
+                   lapack_complex_double* x, lapack_int* ldx, double* ferr, double* berr, lapack_complex_double* work,
+                   double* rwork, lapack_int* info);
+void LAPACK_ssyrfs(char* uplo, lapack_int* n, lapack_int* nrhs, const float* a, lapack_int* lda, const float* af,
+                   lapack_int* ldaf, const lapack_int* ipiv, const float* b, lapack_int* ldb, float* x, lapack_int* ldx,
+                   float* ferr, float* berr, float* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_dsyrfs(char* uplo, lapack_int* n, lapack_int* nrhs, const double* a, lapack_int* lda, const double* af,
+                   lapack_int* ldaf, const lapack_int* ipiv, const double* b, lapack_int* ldb, double* x,
+                   lapack_int* ldx, double* ferr, double* berr, double* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_csyrfs(char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* a, lapack_int* lda,
+                   const lapack_complex_float* af, lapack_int* ldaf, const lapack_int* ipiv,
+                   const lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* x, lapack_int* ldx,
+                   float* ferr, float* berr, lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_zsyrfs(char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* a, lapack_int* lda,
+                   const lapack_complex_double* af, lapack_int* ldaf, const lapack_int* ipiv,
+                   const lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx,
+                   double* ferr, double* berr, lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_dsyrfsx(char* uplo, char* equed, lapack_int* n, lapack_int* nrhs, const double* a, lapack_int* lda,
+                    const double* af, lapack_int* ldaf, const lapack_int* ipiv, const double* s, const double* b,
+                    lapack_int* ldb, double* x, lapack_int* ldx, double* rcond, double* berr, lapack_int* n_err_bnds,
+                    double* err_bnds_norm, double* err_bnds_comp, lapack_int* nparams, double* params, double* work,
+                    lapack_int* iwork, lapack_int* info);
+void LAPACK_ssyrfsx(char* uplo, char* equed, lapack_int* n, lapack_int* nrhs, const float* a, lapack_int* lda,
+                    const float* af, lapack_int* ldaf, const lapack_int* ipiv, const float* s, const float* b,
+                    lapack_int* ldb, float* x, lapack_int* ldx, float* rcond, float* berr, lapack_int* n_err_bnds,
+                    float* err_bnds_norm, float* err_bnds_comp, lapack_int* nparams, float* params, float* work,
+                    lapack_int* iwork, lapack_int* info);
+void LAPACK_zsyrfsx(char* uplo, char* equed, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* a,
+                    lapack_int* lda, const lapack_complex_double* af, lapack_int* ldaf, const lapack_int* ipiv,
+                    const double* s, const lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* x,
+                    lapack_int* ldx, double* rcond, double* berr, lapack_int* n_err_bnds, double* err_bnds_norm,
+                    double* err_bnds_comp, lapack_int* nparams, double* params, lapack_complex_double* work,
+                    double* rwork, lapack_int* info);
+void LAPACK_csyrfsx(char* uplo, char* equed, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* a,
+                    lapack_int* lda, const lapack_complex_float* af, lapack_int* ldaf, const lapack_int* ipiv,
+                    const float* s, const lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* x,
+                    lapack_int* ldx, float* rcond, float* berr, lapack_int* n_err_bnds, float* err_bnds_norm,
+                    float* err_bnds_comp, lapack_int* nparams, float* params, lapack_complex_float* work, float* rwork,
+                    lapack_int* info);
+void LAPACK_cherfs(char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* a, lapack_int* lda,
+                   const lapack_complex_float* af, lapack_int* ldaf, const lapack_int* ipiv,
+                   const lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* x, lapack_int* ldx,
+                   float* ferr, float* berr, lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_zherfs(char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* a, lapack_int* lda,
+                   const lapack_complex_double* af, lapack_int* ldaf, const lapack_int* ipiv,
+                   const lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx,
+                   double* ferr, double* berr, lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_zherfsx(char* uplo, char* equed, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* a,
+                    lapack_int* lda, const lapack_complex_double* af, lapack_int* ldaf, const lapack_int* ipiv,
+                    const double* s, const lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* x,
+                    lapack_int* ldx, double* rcond, double* berr, lapack_int* n_err_bnds, double* err_bnds_norm,
+                    double* err_bnds_comp, lapack_int* nparams, double* params, lapack_complex_double* work,
+                    double* rwork, lapack_int* info);
+void LAPACK_cherfsx(char* uplo, char* equed, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* a,
+                    lapack_int* lda, const lapack_complex_float* af, lapack_int* ldaf, const lapack_int* ipiv,
+                    const float* s, const lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* x,
+                    lapack_int* ldx, float* rcond, float* berr, lapack_int* n_err_bnds, float* err_bnds_norm,
+                    float* err_bnds_comp, lapack_int* nparams, float* params, lapack_complex_float* work, float* rwork,
+                    lapack_int* info);
+void LAPACK_ssprfs(char* uplo, lapack_int* n, lapack_int* nrhs, const float* ap, const float* afp,
+                   const lapack_int* ipiv, const float* b, lapack_int* ldb, float* x, lapack_int* ldx, float* ferr,
+                   float* berr, float* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_dsprfs(char* uplo, lapack_int* n, lapack_int* nrhs, const double* ap, const double* afp,
+                   const lapack_int* ipiv, const double* b, lapack_int* ldb, double* x, lapack_int* ldx, double* ferr,
+                   double* berr, double* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_csprfs(char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* ap,
+                   const lapack_complex_float* afp, const lapack_int* ipiv, const lapack_complex_float* b,
+                   lapack_int* ldb, lapack_complex_float* x, lapack_int* ldx, float* ferr, float* berr,
+                   lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_zsprfs(char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* ap,
+                   const lapack_complex_double* afp, const lapack_int* ipiv, const lapack_complex_double* b,
+                   lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx, double* ferr, double* berr,
+                   lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_chprfs(char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* ap,
+                   const lapack_complex_float* afp, const lapack_int* ipiv, const lapack_complex_float* b,
+                   lapack_int* ldb, lapack_complex_float* x, lapack_int* ldx, float* ferr, float* berr,
+                   lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_zhprfs(char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* ap,
+                   const lapack_complex_double* afp, const lapack_int* ipiv, const lapack_complex_double* b,
+                   lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx, double* ferr, double* berr,
+                   lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_strrfs(char* uplo, char* trans, char* diag, lapack_int* n, lapack_int* nrhs, const float* a,
+                   lapack_int* lda, const float* b, lapack_int* ldb, const float* x, lapack_int* ldx, float* ferr,
+                   float* berr, float* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_dtrrfs(char* uplo, char* trans, char* diag, lapack_int* n, lapack_int* nrhs, const double* a,
+                   lapack_int* lda, const double* b, lapack_int* ldb, const double* x, lapack_int* ldx, double* ferr,
+                   double* berr, double* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_ctrrfs(char* uplo, char* trans, char* diag, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* a,
+                   lapack_int* lda, const lapack_complex_float* b, lapack_int* ldb, const lapack_complex_float* x,
+                   lapack_int* ldx, float* ferr, float* berr, lapack_complex_float* work, float* rwork,
+                   lapack_int* info);
+void LAPACK_ztrrfs(char* uplo, char* trans, char* diag, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* a,
+                   lapack_int* lda, const lapack_complex_double* b, lapack_int* ldb, const lapack_complex_double* x,
+                   lapack_int* ldx, double* ferr, double* berr, lapack_complex_double* work, double* rwork,
+                   lapack_int* info);
+void LAPACK_stprfs(char* uplo, char* trans, char* diag, lapack_int* n, lapack_int* nrhs, const float* ap,
+                   const float* b, lapack_int* ldb, const float* x, lapack_int* ldx, float* ferr, float* berr,
+                   float* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_dtprfs(char* uplo, char* trans, char* diag, lapack_int* n, lapack_int* nrhs, const double* ap,
+                   const double* b, lapack_int* ldb, const double* x, lapack_int* ldx, double* ferr, double* berr,
+                   double* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_ctprfs(char* uplo, char* trans, char* diag, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* ap,
+                   const lapack_complex_float* b, lapack_int* ldb, const lapack_complex_float* x, lapack_int* ldx,
+                   float* ferr, float* berr, lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_ztprfs(char* uplo, char* trans, char* diag, lapack_int* n, lapack_int* nrhs,
+                   const lapack_complex_double* ap, const lapack_complex_double* b, lapack_int* ldb,
+                   const lapack_complex_double* x, lapack_int* ldx, double* ferr, double* berr,
+                   lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_stbrfs(char* uplo, char* trans, char* diag, lapack_int* n, lapack_int* kd, lapack_int* nrhs,
+                   const float* ab, lapack_int* ldab, const float* b, lapack_int* ldb, const float* x, lapack_int* ldx,
+                   float* ferr, float* berr, float* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_dtbrfs(char* uplo, char* trans, char* diag, lapack_int* n, lapack_int* kd, lapack_int* nrhs,
+                   const double* ab, lapack_int* ldab, const double* b, lapack_int* ldb, const double* x,
+                   lapack_int* ldx, double* ferr, double* berr, double* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_ctbrfs(char* uplo, char* trans, char* diag, lapack_int* n, lapack_int* kd, lapack_int* nrhs,
+                   const lapack_complex_float* ab, lapack_int* ldab, const lapack_complex_float* b, lapack_int* ldb,
+                   const lapack_complex_float* x, lapack_int* ldx, float* ferr, float* berr, lapack_complex_float* work,
+                   float* rwork, lapack_int* info);
+void LAPACK_ztbrfs(char* uplo, char* trans, char* diag, lapack_int* n, lapack_int* kd, lapack_int* nrhs,
+                   const lapack_complex_double* ab, lapack_int* ldab, const lapack_complex_double* b, lapack_int* ldb,
+                   const lapack_complex_double* x, lapack_int* ldx, double* ferr, double* berr,
+                   lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_sgetri(lapack_int* n, float* a, lapack_int* lda, const lapack_int* ipiv, float* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_dgetri(lapack_int* n, double* a, lapack_int* lda, const lapack_int* ipiv, double* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_cgetri(lapack_int* n, lapack_complex_float* a, lapack_int* lda, const lapack_int* ipiv,
+                   lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zgetri(lapack_int* n, lapack_complex_double* a, lapack_int* lda, const lapack_int* ipiv,
+                   lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_spotri(char* uplo, lapack_int* n, float* a, lapack_int* lda, lapack_int* info);
+void LAPACK_dpotri(char* uplo, lapack_int* n, double* a, lapack_int* lda, lapack_int* info);
+void LAPACK_cpotri(char* uplo, lapack_int* n, lapack_complex_float* a, lapack_int* lda, lapack_int* info);
+void LAPACK_zpotri(char* uplo, lapack_int* n, lapack_complex_double* a, lapack_int* lda, lapack_int* info);
+void LAPACK_dpftri(char* transr, char* uplo, lapack_int* n, double* a, lapack_int* info);
+void LAPACK_spftri(char* transr, char* uplo, lapack_int* n, float* a, lapack_int* info);
+void LAPACK_zpftri(char* transr, char* uplo, lapack_int* n, lapack_complex_double* a, lapack_int* info);
+void LAPACK_cpftri(char* transr, char* uplo, lapack_int* n, lapack_complex_float* a, lapack_int* info);
+void LAPACK_spptri(char* uplo, lapack_int* n, float* ap, lapack_int* info);
+void LAPACK_dpptri(char* uplo, lapack_int* n, double* ap, lapack_int* info);
+void LAPACK_cpptri(char* uplo, lapack_int* n, lapack_complex_float* ap, lapack_int* info);
+void LAPACK_zpptri(char* uplo, lapack_int* n, lapack_complex_double* ap, lapack_int* info);
+void LAPACK_ssytri(char* uplo, lapack_int* n, float* a, lapack_int* lda, const lapack_int* ipiv, float* work,
+                   lapack_int* info);
+void LAPACK_dsytri(char* uplo, lapack_int* n, double* a, lapack_int* lda, const lapack_int* ipiv, double* work,
+                   lapack_int* info);
+void LAPACK_csytri(char* uplo, lapack_int* n, lapack_complex_float* a, lapack_int* lda, const lapack_int* ipiv,
+                   lapack_complex_float* work, lapack_int* info);
+void LAPACK_zsytri(char* uplo, lapack_int* n, lapack_complex_double* a, lapack_int* lda, const lapack_int* ipiv,
+                   lapack_complex_double* work, lapack_int* info);
+void LAPACK_chetri(char* uplo, lapack_int* n, lapack_complex_float* a, lapack_int* lda, const lapack_int* ipiv,
+                   lapack_complex_float* work, lapack_int* info);
+void LAPACK_zhetri(char* uplo, lapack_int* n, lapack_complex_double* a, lapack_int* lda, const lapack_int* ipiv,
+                   lapack_complex_double* work, lapack_int* info);
+void LAPACK_ssptri(char* uplo, lapack_int* n, float* ap, const lapack_int* ipiv, float* work, lapack_int* info);
+void LAPACK_dsptri(char* uplo, lapack_int* n, double* ap, const lapack_int* ipiv, double* work, lapack_int* info);
+void LAPACK_csptri(char* uplo, lapack_int* n, lapack_complex_float* ap, const lapack_int* ipiv,
+                   lapack_complex_float* work, lapack_int* info);
+void LAPACK_zsptri(char* uplo, lapack_int* n, lapack_complex_double* ap, const lapack_int* ipiv,
+                   lapack_complex_double* work, lapack_int* info);
+void LAPACK_chptri(char* uplo, lapack_int* n, lapack_complex_float* ap, const lapack_int* ipiv,
+                   lapack_complex_float* work, lapack_int* info);
+void LAPACK_zhptri(char* uplo, lapack_int* n, lapack_complex_double* ap, const lapack_int* ipiv,
+                   lapack_complex_double* work, lapack_int* info);
+void LAPACK_strtri(char* uplo, char* diag, lapack_int* n, float* a, lapack_int* lda, lapack_int* info);
+void LAPACK_dtrtri(char* uplo, char* diag, lapack_int* n, double* a, lapack_int* lda, lapack_int* info);
+void LAPACK_ctrtri(char* uplo, char* diag, lapack_int* n, lapack_complex_float* a, lapack_int* lda, lapack_int* info);
+void LAPACK_ztrtri(char* uplo, char* diag, lapack_int* n, lapack_complex_double* a, lapack_int* lda, lapack_int* info);
+void LAPACK_dtftri(char* transr, char* uplo, char* diag, lapack_int* n, double* a, lapack_int* info);
+void LAPACK_stftri(char* transr, char* uplo, char* diag, lapack_int* n, float* a, lapack_int* info);
+void LAPACK_ztftri(char* transr, char* uplo, char* diag, lapack_int* n, lapack_complex_double* a, lapack_int* info);
+void LAPACK_ctftri(char* transr, char* uplo, char* diag, lapack_int* n, lapack_complex_float* a, lapack_int* info);
+void LAPACK_stptri(char* uplo, char* diag, lapack_int* n, float* ap, lapack_int* info);
+void LAPACK_dtptri(char* uplo, char* diag, lapack_int* n, double* ap, lapack_int* info);
+void LAPACK_ctptri(char* uplo, char* diag, lapack_int* n, lapack_complex_float* ap, lapack_int* info);
+void LAPACK_ztptri(char* uplo, char* diag, lapack_int* n, lapack_complex_double* ap, lapack_int* info);
+void LAPACK_sgeequ(lapack_int* m, lapack_int* n, const float* a, lapack_int* lda, float* r, float* c, float* rowcnd,
+                   float* colcnd, float* amax, lapack_int* info);
+void LAPACK_dgeequ(lapack_int* m, lapack_int* n, const double* a, lapack_int* lda, double* r, double* c, double* rowcnd,
+                   double* colcnd, double* amax, lapack_int* info);
+void LAPACK_cgeequ(lapack_int* m, lapack_int* n, const lapack_complex_float* a, lapack_int* lda, float* r, float* c,
+                   float* rowcnd, float* colcnd, float* amax, lapack_int* info);
+void LAPACK_zgeequ(lapack_int* m, lapack_int* n, const lapack_complex_double* a, lapack_int* lda, double* r, double* c,
+                   double* rowcnd, double* colcnd, double* amax, lapack_int* info);
+void LAPACK_dgeequb(lapack_int* m, lapack_int* n, const double* a, lapack_int* lda, double* r, double* c,
+                    double* rowcnd, double* colcnd, double* amax, lapack_int* info);
+void LAPACK_sgeequb(lapack_int* m, lapack_int* n, const float* a, lapack_int* lda, float* r, float* c, float* rowcnd,
+                    float* colcnd, float* amax, lapack_int* info);
+void LAPACK_zgeequb(lapack_int* m, lapack_int* n, const lapack_complex_double* a, lapack_int* lda, double* r, double* c,
+                    double* rowcnd, double* colcnd, double* amax, lapack_int* info);
+void LAPACK_cgeequb(lapack_int* m, lapack_int* n, const lapack_complex_float* a, lapack_int* lda, float* r, float* c,
+                    float* rowcnd, float* colcnd, float* amax, lapack_int* info);
+void LAPACK_sgbequ(lapack_int* m, lapack_int* n, lapack_int* kl, lapack_int* ku, const float* ab, lapack_int* ldab,
+                   float* r, float* c, float* rowcnd, float* colcnd, float* amax, lapack_int* info);
+void LAPACK_dgbequ(lapack_int* m, lapack_int* n, lapack_int* kl, lapack_int* ku, const double* ab, lapack_int* ldab,
+                   double* r, double* c, double* rowcnd, double* colcnd, double* amax, lapack_int* info);
+void LAPACK_cgbequ(lapack_int* m, lapack_int* n, lapack_int* kl, lapack_int* ku, const lapack_complex_float* ab,
+                   lapack_int* ldab, float* r, float* c, float* rowcnd, float* colcnd, float* amax, lapack_int* info);
+void LAPACK_zgbequ(lapack_int* m, lapack_int* n, lapack_int* kl, lapack_int* ku, const lapack_complex_double* ab,
+                   lapack_int* ldab, double* r, double* c, double* rowcnd, double* colcnd, double* amax,
+                   lapack_int* info);
+void LAPACK_dgbequb(lapack_int* m, lapack_int* n, lapack_int* kl, lapack_int* ku, const double* ab, lapack_int* ldab,
+                    double* r, double* c, double* rowcnd, double* colcnd, double* amax, lapack_int* info);
+void LAPACK_sgbequb(lapack_int* m, lapack_int* n, lapack_int* kl, lapack_int* ku, const float* ab, lapack_int* ldab,
+                    float* r, float* c, float* rowcnd, float* colcnd, float* amax, lapack_int* info);
+void LAPACK_zgbequb(lapack_int* m, lapack_int* n, lapack_int* kl, lapack_int* ku, const lapack_complex_double* ab,
+                    lapack_int* ldab, double* r, double* c, double* rowcnd, double* colcnd, double* amax,
+                    lapack_int* info);
+void LAPACK_cgbequb(lapack_int* m, lapack_int* n, lapack_int* kl, lapack_int* ku, const lapack_complex_float* ab,
+                    lapack_int* ldab, float* r, float* c, float* rowcnd, float* colcnd, float* amax, lapack_int* info);
+void LAPACK_spoequ(lapack_int* n, const float* a, lapack_int* lda, float* s, float* scond, float* amax,
+                   lapack_int* info);
+void LAPACK_dpoequ(lapack_int* n, const double* a, lapack_int* lda, double* s, double* scond, double* amax,
+                   lapack_int* info);
+void LAPACK_cpoequ(lapack_int* n, const lapack_complex_float* a, lapack_int* lda, float* s, float* scond, float* amax,
+                   lapack_int* info);
+void LAPACK_zpoequ(lapack_int* n, const lapack_complex_double* a, lapack_int* lda, double* s, double* scond,
+                   double* amax, lapack_int* info);
+void LAPACK_dpoequb(lapack_int* n, const double* a, lapack_int* lda, double* s, double* scond, double* amax,
+                    lapack_int* info);
+void LAPACK_spoequb(lapack_int* n, const float* a, lapack_int* lda, float* s, float* scond, float* amax,
+                    lapack_int* info);
+void LAPACK_zpoequb(lapack_int* n, const lapack_complex_double* a, lapack_int* lda, double* s, double* scond,
+                    double* amax, lapack_int* info);
+void LAPACK_cpoequb(lapack_int* n, const lapack_complex_float* a, lapack_int* lda, float* s, float* scond, float* amax,
+                    lapack_int* info);
+void LAPACK_sppequ(char* uplo, lapack_int* n, const float* ap, float* s, float* scond, float* amax, lapack_int* info);
+void LAPACK_dppequ(char* uplo, lapack_int* n, const double* ap, double* s, double* scond, double* amax,
+                   lapack_int* info);
+void LAPACK_cppequ(char* uplo, lapack_int* n, const lapack_complex_float* ap, float* s, float* scond, float* amax,
+                   lapack_int* info);
+void LAPACK_zppequ(char* uplo, lapack_int* n, const lapack_complex_double* ap, double* s, double* scond, double* amax,
+                   lapack_int* info);
+void LAPACK_spbequ(char* uplo, lapack_int* n, lapack_int* kd, const float* ab, lapack_int* ldab, float* s, float* scond,
+                   float* amax, lapack_int* info);
+void LAPACK_dpbequ(char* uplo, lapack_int* n, lapack_int* kd, const double* ab, lapack_int* ldab, double* s,
+                   double* scond, double* amax, lapack_int* info);
+void LAPACK_cpbequ(char* uplo, lapack_int* n, lapack_int* kd, const lapack_complex_float* ab, lapack_int* ldab,
+                   float* s, float* scond, float* amax, lapack_int* info);
+void LAPACK_zpbequ(char* uplo, lapack_int* n, lapack_int* kd, const lapack_complex_double* ab, lapack_int* ldab,
+                   double* s, double* scond, double* amax, lapack_int* info);
+void LAPACK_dsyequb(char* uplo, lapack_int* n, const double* a, lapack_int* lda, double* s, double* scond, double* amax,
+                    double* work, lapack_int* info);
+void LAPACK_ssyequb(char* uplo, lapack_int* n, const float* a, lapack_int* lda, float* s, float* scond, float* amax,
+                    float* work, lapack_int* info);
+void LAPACK_zsyequb(char* uplo, lapack_int* n, const lapack_complex_double* a, lapack_int* lda, double* s,
+                    double* scond, double* amax, lapack_complex_double* work, lapack_int* info);
+void LAPACK_csyequb(char* uplo, lapack_int* n, const lapack_complex_float* a, lapack_int* lda, float* s, float* scond,
+                    float* amax, lapack_complex_float* work, lapack_int* info);
+void LAPACK_zheequb(char* uplo, lapack_int* n, const lapack_complex_double* a, lapack_int* lda, double* s,
+                    double* scond, double* amax, lapack_complex_double* work, lapack_int* info);
+void LAPACK_cheequb(char* uplo, lapack_int* n, const lapack_complex_float* a, lapack_int* lda, float* s, float* scond,
+                    float* amax, lapack_complex_float* work, lapack_int* info);
+void LAPACK_sgesv(lapack_int* n, lapack_int* nrhs, float* a, lapack_int* lda, lapack_int* ipiv, float* b,
+                  lapack_int* ldb, lapack_int* info);
+void LAPACK_dgesv(lapack_int* n, lapack_int* nrhs, double* a, lapack_int* lda, lapack_int* ipiv, double* b,
+                  lapack_int* ldb, lapack_int* info);
+void LAPACK_cgesv(lapack_int* n, lapack_int* nrhs, lapack_complex_float* a, lapack_int* lda, lapack_int* ipiv,
+                  lapack_complex_float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_zgesv(lapack_int* n, lapack_int* nrhs, lapack_complex_double* a, lapack_int* lda, lapack_int* ipiv,
+                  lapack_complex_double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_dsgesv(lapack_int* n, lapack_int* nrhs, double* a, lapack_int* lda, lapack_int* ipiv, double* b,
+                   lapack_int* ldb, double* x, lapack_int* ldx, double* work, float* swork, lapack_int* iter,
+                   lapack_int* info);
+void LAPACK_zcgesv(lapack_int* n, lapack_int* nrhs, lapack_complex_double* a, lapack_int* lda, lapack_int* ipiv,
+                   lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx,
+                   lapack_complex_double* work, lapack_complex_float* swork, double* rwork, lapack_int* iter,
+                   lapack_int* info);
+void LAPACK_sgesvx(char* fact, char* trans, lapack_int* n, lapack_int* nrhs, float* a, lapack_int* lda, float* af,
+                   lapack_int* ldaf, lapack_int* ipiv, char* equed, float* r, float* c, float* b, lapack_int* ldb,
+                   float* x, lapack_int* ldx, float* rcond, float* ferr, float* berr, float* work, lapack_int* iwork,
+                   lapack_int* info);
+void LAPACK_dgesvx(char* fact, char* trans, lapack_int* n, lapack_int* nrhs, double* a, lapack_int* lda, double* af,
+                   lapack_int* ldaf, lapack_int* ipiv, char* equed, double* r, double* c, double* b, lapack_int* ldb,
+                   double* x, lapack_int* ldx, double* rcond, double* ferr, double* berr, double* work,
+                   lapack_int* iwork, lapack_int* info);
+void LAPACK_cgesvx(char* fact, char* trans, lapack_int* n, lapack_int* nrhs, lapack_complex_float* a, lapack_int* lda,
+                   lapack_complex_float* af, lapack_int* ldaf, lapack_int* ipiv, char* equed, float* r, float* c,
+                   lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* x, lapack_int* ldx, float* rcond,
+                   float* ferr, float* berr, lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_zgesvx(char* fact, char* trans, lapack_int* n, lapack_int* nrhs, lapack_complex_double* a, lapack_int* lda,
+                   lapack_complex_double* af, lapack_int* ldaf, lapack_int* ipiv, char* equed, double* r, double* c,
+                   lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx, double* rcond,
+                   double* ferr, double* berr, lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_dgesvxx(char* fact, char* trans, lapack_int* n, lapack_int* nrhs, double* a, lapack_int* lda, double* af,
+                    lapack_int* ldaf, lapack_int* ipiv, char* equed, double* r, double* c, double* b, lapack_int* ldb,
+                    double* x, lapack_int* ldx, double* rcond, double* rpvgrw, double* berr, lapack_int* n_err_bnds,
+                    double* err_bnds_norm, double* err_bnds_comp, lapack_int* nparams, double* params, double* work,
+                    lapack_int* iwork, lapack_int* info);
+void LAPACK_sgesvxx(char* fact, char* trans, lapack_int* n, lapack_int* nrhs, float* a, lapack_int* lda, float* af,
+                    lapack_int* ldaf, lapack_int* ipiv, char* equed, float* r, float* c, float* b, lapack_int* ldb,
+                    float* x, lapack_int* ldx, float* rcond, float* rpvgrw, float* berr, lapack_int* n_err_bnds,
+                    float* err_bnds_norm, float* err_bnds_comp, lapack_int* nparams, float* params, float* work,
+                    lapack_int* iwork, lapack_int* info);
+void LAPACK_zgesvxx(char* fact, char* trans, lapack_int* n, lapack_int* nrhs, lapack_complex_double* a, lapack_int* lda,
+                    lapack_complex_double* af, lapack_int* ldaf, lapack_int* ipiv, char* equed, double* r, double* c,
+                    lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx, double* rcond,
+                    double* rpvgrw, double* berr, lapack_int* n_err_bnds, double* err_bnds_norm, double* err_bnds_comp,
+                    lapack_int* nparams, double* params, lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_cgesvxx(char* fact, char* trans, lapack_int* n, lapack_int* nrhs, lapack_complex_float* a, lapack_int* lda,
+                    lapack_complex_float* af, lapack_int* ldaf, lapack_int* ipiv, char* equed, float* r, float* c,
+                    lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* x, lapack_int* ldx, float* rcond,
+                    float* rpvgrw, float* berr, lapack_int* n_err_bnds, float* err_bnds_norm, float* err_bnds_comp,
+                    lapack_int* nparams, float* params, lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_sgbsv(lapack_int* n, lapack_int* kl, lapack_int* ku, lapack_int* nrhs, float* ab, lapack_int* ldab,
+                  lapack_int* ipiv, float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_dgbsv(lapack_int* n, lapack_int* kl, lapack_int* ku, lapack_int* nrhs, double* ab, lapack_int* ldab,
+                  lapack_int* ipiv, double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_cgbsv(lapack_int* n, lapack_int* kl, lapack_int* ku, lapack_int* nrhs, lapack_complex_float* ab,
+                  lapack_int* ldab, lapack_int* ipiv, lapack_complex_float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_zgbsv(lapack_int* n, lapack_int* kl, lapack_int* ku, lapack_int* nrhs, lapack_complex_double* ab,
+                  lapack_int* ldab, lapack_int* ipiv, lapack_complex_double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_sgbsvx(char* fact, char* trans, lapack_int* n, lapack_int* kl, lapack_int* ku, lapack_int* nrhs, float* ab,
+                   lapack_int* ldab, float* afb, lapack_int* ldafb, lapack_int* ipiv, char* equed, float* r, float* c,
+                   float* b, lapack_int* ldb, float* x, lapack_int* ldx, float* rcond, float* ferr, float* berr,
+                   float* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_dgbsvx(char* fact, char* trans, lapack_int* n, lapack_int* kl, lapack_int* ku, lapack_int* nrhs, double* ab,
+                   lapack_int* ldab, double* afb, lapack_int* ldafb, lapack_int* ipiv, char* equed, double* r,
+                   double* c, double* b, lapack_int* ldb, double* x, lapack_int* ldx, double* rcond, double* ferr,
+                   double* berr, double* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_cgbsvx(char* fact, char* trans, lapack_int* n, lapack_int* kl, lapack_int* ku, lapack_int* nrhs,
+                   lapack_complex_float* ab, lapack_int* ldab, lapack_complex_float* afb, lapack_int* ldafb,
+                   lapack_int* ipiv, char* equed, float* r, float* c, lapack_complex_float* b, lapack_int* ldb,
+                   lapack_complex_float* x, lapack_int* ldx, float* rcond, float* ferr, float* berr,
+                   lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_zgbsvx(char* fact, char* trans, lapack_int* n, lapack_int* kl, lapack_int* ku, lapack_int* nrhs,
+                   lapack_complex_double* ab, lapack_int* ldab, lapack_complex_double* afb, lapack_int* ldafb,
+                   lapack_int* ipiv, char* equed, double* r, double* c, lapack_complex_double* b, lapack_int* ldb,
+                   lapack_complex_double* x, lapack_int* ldx, double* rcond, double* ferr, double* berr,
+                   lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_dgbsvxx(char* fact, char* trans, lapack_int* n, lapack_int* kl, lapack_int* ku, lapack_int* nrhs,
+                    double* ab, lapack_int* ldab, double* afb, lapack_int* ldafb, lapack_int* ipiv, char* equed,
+                    double* r, double* c, double* b, lapack_int* ldb, double* x, lapack_int* ldx, double* rcond,
+                    double* rpvgrw, double* berr, lapack_int* n_err_bnds, double* err_bnds_norm, double* err_bnds_comp,
+                    lapack_int* nparams, double* params, double* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_sgbsvxx(char* fact, char* trans, lapack_int* n, lapack_int* kl, lapack_int* ku, lapack_int* nrhs, float* ab,
+                    lapack_int* ldab, float* afb, lapack_int* ldafb, lapack_int* ipiv, char* equed, float* r, float* c,
+                    float* b, lapack_int* ldb, float* x, lapack_int* ldx, float* rcond, float* rpvgrw, float* berr,
+                    lapack_int* n_err_bnds, float* err_bnds_norm, float* err_bnds_comp, lapack_int* nparams,
+                    float* params, float* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_zgbsvxx(char* fact, char* trans, lapack_int* n, lapack_int* kl, lapack_int* ku, lapack_int* nrhs,
+                    lapack_complex_double* ab, lapack_int* ldab, lapack_complex_double* afb, lapack_int* ldafb,
+                    lapack_int* ipiv, char* equed, double* r, double* c, lapack_complex_double* b, lapack_int* ldb,
+                    lapack_complex_double* x, lapack_int* ldx, double* rcond, double* rpvgrw, double* berr,
+                    lapack_int* n_err_bnds, double* err_bnds_norm, double* err_bnds_comp, lapack_int* nparams,
+                    double* params, lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_cgbsvxx(char* fact, char* trans, lapack_int* n, lapack_int* kl, lapack_int* ku, lapack_int* nrhs,
+                    lapack_complex_float* ab, lapack_int* ldab, lapack_complex_float* afb, lapack_int* ldafb,
+                    lapack_int* ipiv, char* equed, float* r, float* c, lapack_complex_float* b, lapack_int* ldb,
+                    lapack_complex_float* x, lapack_int* ldx, float* rcond, float* rpvgrw, float* berr,
+                    lapack_int* n_err_bnds, float* err_bnds_norm, float* err_bnds_comp, lapack_int* nparams,
+                    float* params, lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_sgtsv(lapack_int* n, lapack_int* nrhs, float* dl, float* d, float* du, float* b, lapack_int* ldb,
+                  lapack_int* info);
+void LAPACK_dgtsv(lapack_int* n, lapack_int* nrhs, double* dl, double* d, double* du, double* b, lapack_int* ldb,
+                  lapack_int* info);
+void LAPACK_cgtsv(lapack_int* n, lapack_int* nrhs, lapack_complex_float* dl, lapack_complex_float* d,
+                  lapack_complex_float* du, lapack_complex_float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_zgtsv(lapack_int* n, lapack_int* nrhs, lapack_complex_double* dl, lapack_complex_double* d,
+                  lapack_complex_double* du, lapack_complex_double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_sgtsvx(char* fact, char* trans, lapack_int* n, lapack_int* nrhs, const float* dl, const float* d,
+                   const float* du, float* dlf, float* df, float* duf, float* du2, lapack_int* ipiv, const float* b,
+                   lapack_int* ldb, float* x, lapack_int* ldx, float* rcond, float* ferr, float* berr, float* work,
+                   lapack_int* iwork, lapack_int* info);
+void LAPACK_dgtsvx(char* fact, char* trans, lapack_int* n, lapack_int* nrhs, const double* dl, const double* d,
+                   const double* du, double* dlf, double* df, double* duf, double* du2, lapack_int* ipiv,
+                   const double* b, lapack_int* ldb, double* x, lapack_int* ldx, double* rcond, double* ferr,
+                   double* berr, double* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_cgtsvx(char* fact, char* trans, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* dl,
+                   const lapack_complex_float* d, const lapack_complex_float* du, lapack_complex_float* dlf,
+                   lapack_complex_float* df, lapack_complex_float* duf, lapack_complex_float* du2, lapack_int* ipiv,
+                   const lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* x, lapack_int* ldx,
+                   float* rcond, float* ferr, float* berr, lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_zgtsvx(char* fact, char* trans, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* dl,
+                   const lapack_complex_double* d, const lapack_complex_double* du, lapack_complex_double* dlf,
+                   lapack_complex_double* df, lapack_complex_double* duf, lapack_complex_double* du2, lapack_int* ipiv,
+                   const lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx,
+                   double* rcond, double* ferr, double* berr, lapack_complex_double* work, double* rwork,
+                   lapack_int* info);
+void LAPACK_sposv(char* uplo, lapack_int* n, lapack_int* nrhs, float* a, lapack_int* lda, float* b, lapack_int* ldb,
+                  lapack_int* info);
+void LAPACK_dposv(char* uplo, lapack_int* n, lapack_int* nrhs, double* a, lapack_int* lda, double* b, lapack_int* ldb,
+                  lapack_int* info);
+void LAPACK_cposv(char* uplo, lapack_int* n, lapack_int* nrhs, lapack_complex_float* a, lapack_int* lda,
+                  lapack_complex_float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_zposv(char* uplo, lapack_int* n, lapack_int* nrhs, lapack_complex_double* a, lapack_int* lda,
+                  lapack_complex_double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_dsposv(char* uplo, lapack_int* n, lapack_int* nrhs, double* a, lapack_int* lda, double* b, lapack_int* ldb,
+                   double* x, lapack_int* ldx, double* work, float* swork, lapack_int* iter, lapack_int* info);
+void LAPACK_zcposv(char* uplo, lapack_int* n, lapack_int* nrhs, lapack_complex_double* a, lapack_int* lda,
+                   lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx,
+                   lapack_complex_double* work, lapack_complex_float* swork, double* rwork, lapack_int* iter,
+                   lapack_int* info);
+void LAPACK_sposvx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, float* a, lapack_int* lda, float* af,
+                   lapack_int* ldaf, char* equed, float* s, float* b, lapack_int* ldb, float* x, lapack_int* ldx,
+                   float* rcond, float* ferr, float* berr, float* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_dposvx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, double* a, lapack_int* lda, double* af,
+                   lapack_int* ldaf, char* equed, double* s, double* b, lapack_int* ldb, double* x, lapack_int* ldx,
+                   double* rcond, double* ferr, double* berr, double* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_cposvx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, lapack_complex_float* a, lapack_int* lda,
+                   lapack_complex_float* af, lapack_int* ldaf, char* equed, float* s, lapack_complex_float* b,
+                   lapack_int* ldb, lapack_complex_float* x, lapack_int* ldx, float* rcond, float* ferr, float* berr,
+                   lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_zposvx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, lapack_complex_double* a, lapack_int* lda,
+                   lapack_complex_double* af, lapack_int* ldaf, char* equed, double* s, lapack_complex_double* b,
+                   lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx, double* rcond, double* ferr,
+                   double* berr, lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_dposvxx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, double* a, lapack_int* lda, double* af,
+                    lapack_int* ldaf, char* equed, double* s, double* b, lapack_int* ldb, double* x, lapack_int* ldx,
+                    double* rcond, double* rpvgrw, double* berr, lapack_int* n_err_bnds, double* err_bnds_norm,
+                    double* err_bnds_comp, lapack_int* nparams, double* params, double* work, lapack_int* iwork,
+                    lapack_int* info);
+void LAPACK_sposvxx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, float* a, lapack_int* lda, float* af,
+                    lapack_int* ldaf, char* equed, float* s, float* b, lapack_int* ldb, float* x, lapack_int* ldx,
+                    float* rcond, float* rpvgrw, float* berr, lapack_int* n_err_bnds, float* err_bnds_norm,
+                    float* err_bnds_comp, lapack_int* nparams, float* params, float* work, lapack_int* iwork,
+                    lapack_int* info);
+void LAPACK_zposvxx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, lapack_complex_double* a, lapack_int* lda,
+                    lapack_complex_double* af, lapack_int* ldaf, char* equed, double* s, lapack_complex_double* b,
+                    lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx, double* rcond, double* rpvgrw,
+                    double* berr, lapack_int* n_err_bnds, double* err_bnds_norm, double* err_bnds_comp,
+                    lapack_int* nparams, double* params, lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_cposvxx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, lapack_complex_float* a, lapack_int* lda,
+                    lapack_complex_float* af, lapack_int* ldaf, char* equed, float* s, lapack_complex_float* b,
+                    lapack_int* ldb, lapack_complex_float* x, lapack_int* ldx, float* rcond, float* rpvgrw, float* berr,
+                    lapack_int* n_err_bnds, float* err_bnds_norm, float* err_bnds_comp, lapack_int* nparams,
+                    float* params, lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_sppsv(char* uplo, lapack_int* n, lapack_int* nrhs, float* ap, float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_dppsv(char* uplo, lapack_int* n, lapack_int* nrhs, double* ap, double* b, lapack_int* ldb,
+                  lapack_int* info);
+void LAPACK_cppsv(char* uplo, lapack_int* n, lapack_int* nrhs, lapack_complex_float* ap, lapack_complex_float* b,
+                  lapack_int* ldb, lapack_int* info);
+void LAPACK_zppsv(char* uplo, lapack_int* n, lapack_int* nrhs, lapack_complex_double* ap, lapack_complex_double* b,
+                  lapack_int* ldb, lapack_int* info);
+void LAPACK_sppsvx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, float* ap, float* afp, char* equed,
+                   float* s, float* b, lapack_int* ldb, float* x, lapack_int* ldx, float* rcond, float* ferr,
+                   float* berr, float* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_dppsvx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, double* ap, double* afp, char* equed,
+                   double* s, double* b, lapack_int* ldb, double* x, lapack_int* ldx, double* rcond, double* ferr,
+                   double* berr, double* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_cppsvx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, lapack_complex_float* ap,
+                   lapack_complex_float* afp, char* equed, float* s, lapack_complex_float* b, lapack_int* ldb,
+                   lapack_complex_float* x, lapack_int* ldx, float* rcond, float* ferr, float* berr,
+                   lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_zppsvx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, lapack_complex_double* ap,
+                   lapack_complex_double* afp, char* equed, double* s, lapack_complex_double* b, lapack_int* ldb,
+                   lapack_complex_double* x, lapack_int* ldx, double* rcond, double* ferr, double* berr,
+                   lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_spbsv(char* uplo, lapack_int* n, lapack_int* kd, lapack_int* nrhs, float* ab, lapack_int* ldab, float* b,
+                  lapack_int* ldb, lapack_int* info);
+void LAPACK_dpbsv(char* uplo, lapack_int* n, lapack_int* kd, lapack_int* nrhs, double* ab, lapack_int* ldab, double* b,
+                  lapack_int* ldb, lapack_int* info);
+void LAPACK_cpbsv(char* uplo, lapack_int* n, lapack_int* kd, lapack_int* nrhs, lapack_complex_float* ab,
+                  lapack_int* ldab, lapack_complex_float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_zpbsv(char* uplo, lapack_int* n, lapack_int* kd, lapack_int* nrhs, lapack_complex_double* ab,
+                  lapack_int* ldab, lapack_complex_double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_spbsvx(char* fact, char* uplo, lapack_int* n, lapack_int* kd, lapack_int* nrhs, float* ab, lapack_int* ldab,
+                   float* afb, lapack_int* ldafb, char* equed, float* s, float* b, lapack_int* ldb, float* x,
+                   lapack_int* ldx, float* rcond, float* ferr, float* berr, float* work, lapack_int* iwork,
+                   lapack_int* info);
+void LAPACK_dpbsvx(char* fact, char* uplo, lapack_int* n, lapack_int* kd, lapack_int* nrhs, double* ab,
+                   lapack_int* ldab, double* afb, lapack_int* ldafb, char* equed, double* s, double* b, lapack_int* ldb,
+                   double* x, lapack_int* ldx, double* rcond, double* ferr, double* berr, double* work,
+                   lapack_int* iwork, lapack_int* info);
+void LAPACK_cpbsvx(char* fact, char* uplo, lapack_int* n, lapack_int* kd, lapack_int* nrhs, lapack_complex_float* ab,
+                   lapack_int* ldab, lapack_complex_float* afb, lapack_int* ldafb, char* equed, float* s,
+                   lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* x, lapack_int* ldx, float* rcond,
+                   float* ferr, float* berr, lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_zpbsvx(char* fact, char* uplo, lapack_int* n, lapack_int* kd, lapack_int* nrhs, lapack_complex_double* ab,
+                   lapack_int* ldab, lapack_complex_double* afb, lapack_int* ldafb, char* equed, double* s,
+                   lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx, double* rcond,
+                   double* ferr, double* berr, lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_sptsv(lapack_int* n, lapack_int* nrhs, float* d, float* e, float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_dptsv(lapack_int* n, lapack_int* nrhs, double* d, double* e, double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_cptsv(lapack_int* n, lapack_int* nrhs, float* d, lapack_complex_float* e, lapack_complex_float* b,
+                  lapack_int* ldb, lapack_int* info);
+void LAPACK_zptsv(lapack_int* n, lapack_int* nrhs, double* d, lapack_complex_double* e, lapack_complex_double* b,
+                  lapack_int* ldb, lapack_int* info);
+void LAPACK_sptsvx(char* fact, lapack_int* n, lapack_int* nrhs, const float* d, const float* e, float* df, float* ef,
+                   const float* b, lapack_int* ldb, float* x, lapack_int* ldx, float* rcond, float* ferr, float* berr,
+                   float* work, lapack_int* info);
+void LAPACK_dptsvx(char* fact, lapack_int* n, lapack_int* nrhs, const double* d, const double* e, double* df,
+                   double* ef, const double* b, lapack_int* ldb, double* x, lapack_int* ldx, double* rcond,
+                   double* ferr, double* berr, double* work, lapack_int* info);
+void LAPACK_cptsvx(char* fact, lapack_int* n, lapack_int* nrhs, const float* d, const lapack_complex_float* e,
+                   float* df, lapack_complex_float* ef, const lapack_complex_float* b, lapack_int* ldb,
+                   lapack_complex_float* x, lapack_int* ldx, float* rcond, float* ferr, float* berr,
+                   lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_zptsvx(char* fact, lapack_int* n, lapack_int* nrhs, const double* d, const lapack_complex_double* e,
+                   double* df, lapack_complex_double* ef, const lapack_complex_double* b, lapack_int* ldb,
+                   lapack_complex_double* x, lapack_int* ldx, double* rcond, double* ferr, double* berr,
+                   lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_ssysv(char* uplo, lapack_int* n, lapack_int* nrhs, float* a, lapack_int* lda, lapack_int* ipiv, float* b,
+                  lapack_int* ldb, float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_dsysv(char* uplo, lapack_int* n, lapack_int* nrhs, double* a, lapack_int* lda, lapack_int* ipiv, double* b,
+                  lapack_int* ldb, double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_csysv(char* uplo, lapack_int* n, lapack_int* nrhs, lapack_complex_float* a, lapack_int* lda,
+                  lapack_int* ipiv, lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* work,
+                  lapack_int* lwork, lapack_int* info);
+void LAPACK_zsysv(char* uplo, lapack_int* n, lapack_int* nrhs, lapack_complex_double* a, lapack_int* lda,
+                  lapack_int* ipiv, lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* work,
+                  lapack_int* lwork, lapack_int* info);
+void LAPACK_ssysvx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, const float* a, lapack_int* lda, float* af,
+                   lapack_int* ldaf, lapack_int* ipiv, const float* b, lapack_int* ldb, float* x, lapack_int* ldx,
+                   float* rcond, float* ferr, float* berr, float* work, lapack_int* lwork, lapack_int* iwork,
+                   lapack_int* info);
+void LAPACK_dsysvx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, const double* a, lapack_int* lda,
+                   double* af, lapack_int* ldaf, lapack_int* ipiv, const double* b, lapack_int* ldb, double* x,
+                   lapack_int* ldx, double* rcond, double* ferr, double* berr, double* work, lapack_int* lwork,
+                   lapack_int* iwork, lapack_int* info);
+void LAPACK_csysvx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* a,
+                   lapack_int* lda, lapack_complex_float* af, lapack_int* ldaf, lapack_int* ipiv,
+                   const lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* x, lapack_int* ldx,
+                   float* rcond, float* ferr, float* berr, lapack_complex_float* work, lapack_int* lwork, float* rwork,
+                   lapack_int* info);
+void LAPACK_zsysvx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* a,
+                   lapack_int* lda, lapack_complex_double* af, lapack_int* ldaf, lapack_int* ipiv,
+                   const lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx,
+                   double* rcond, double* ferr, double* berr, lapack_complex_double* work, lapack_int* lwork,
+                   double* rwork, lapack_int* info);
+void LAPACK_dsysvxx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, double* a, lapack_int* lda, double* af,
+                    lapack_int* ldaf, lapack_int* ipiv, char* equed, double* s, double* b, lapack_int* ldb, double* x,
+                    lapack_int* ldx, double* rcond, double* rpvgrw, double* berr, lapack_int* n_err_bnds,
+                    double* err_bnds_norm, double* err_bnds_comp, lapack_int* nparams, double* params, double* work,
+                    lapack_int* iwork, lapack_int* info);
+void LAPACK_ssysvxx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, float* a, lapack_int* lda, float* af,
+                    lapack_int* ldaf, lapack_int* ipiv, char* equed, float* s, float* b, lapack_int* ldb, float* x,
+                    lapack_int* ldx, float* rcond, float* rpvgrw, float* berr, lapack_int* n_err_bnds,
+                    float* err_bnds_norm, float* err_bnds_comp, lapack_int* nparams, float* params, float* work,
+                    lapack_int* iwork, lapack_int* info);
+void LAPACK_zsysvxx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, lapack_complex_double* a, lapack_int* lda,
+                    lapack_complex_double* af, lapack_int* ldaf, lapack_int* ipiv, char* equed, double* s,
+                    lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx, double* rcond,
+                    double* rpvgrw, double* berr, lapack_int* n_err_bnds, double* err_bnds_norm, double* err_bnds_comp,
+                    lapack_int* nparams, double* params, lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_csysvxx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, lapack_complex_float* a, lapack_int* lda,
+                    lapack_complex_float* af, lapack_int* ldaf, lapack_int* ipiv, char* equed, float* s,
+                    lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* x, lapack_int* ldx, float* rcond,
+                    float* rpvgrw, float* berr, lapack_int* n_err_bnds, float* err_bnds_norm, float* err_bnds_comp,
+                    lapack_int* nparams, float* params, lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_chesv(char* uplo, lapack_int* n, lapack_int* nrhs, lapack_complex_float* a, lapack_int* lda,
+                  lapack_int* ipiv, lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* work,
+                  lapack_int* lwork, lapack_int* info);
+void LAPACK_zhesv(char* uplo, lapack_int* n, lapack_int* nrhs, lapack_complex_double* a, lapack_int* lda,
+                  lapack_int* ipiv, lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* work,
+                  lapack_int* lwork, lapack_int* info);
+void LAPACK_chesvx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* a,
+                   lapack_int* lda, lapack_complex_float* af, lapack_int* ldaf, lapack_int* ipiv,
+                   const lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* x, lapack_int* ldx,
+                   float* rcond, float* ferr, float* berr, lapack_complex_float* work, lapack_int* lwork, float* rwork,
+                   lapack_int* info);
+void LAPACK_zhesvx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* a,
+                   lapack_int* lda, lapack_complex_double* af, lapack_int* ldaf, lapack_int* ipiv,
+                   const lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx,
+                   double* rcond, double* ferr, double* berr, lapack_complex_double* work, lapack_int* lwork,
+                   double* rwork, lapack_int* info);
+void LAPACK_zhesvxx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, lapack_complex_double* a, lapack_int* lda,
+                    lapack_complex_double* af, lapack_int* ldaf, lapack_int* ipiv, char* equed, double* s,
+                    lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* x, lapack_int* ldx, double* rcond,
+                    double* rpvgrw, double* berr, lapack_int* n_err_bnds, double* err_bnds_norm, double* err_bnds_comp,
+                    lapack_int* nparams, double* params, lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_chesvxx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, lapack_complex_float* a, lapack_int* lda,
+                    lapack_complex_float* af, lapack_int* ldaf, lapack_int* ipiv, char* equed, float* s,
+                    lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* x, lapack_int* ldx, float* rcond,
+                    float* rpvgrw, float* berr, lapack_int* n_err_bnds, float* err_bnds_norm, float* err_bnds_comp,
+                    lapack_int* nparams, float* params, lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_sspsv(char* uplo, lapack_int* n, lapack_int* nrhs, float* ap, lapack_int* ipiv, float* b, lapack_int* ldb,
+                  lapack_int* info);
+void LAPACK_dspsv(char* uplo, lapack_int* n, lapack_int* nrhs, double* ap, lapack_int* ipiv, double* b, lapack_int* ldb,
+                  lapack_int* info);
+void LAPACK_cspsv(char* uplo, lapack_int* n, lapack_int* nrhs, lapack_complex_float* ap, lapack_int* ipiv,
+                  lapack_complex_float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_zspsv(char* uplo, lapack_int* n, lapack_int* nrhs, lapack_complex_double* ap, lapack_int* ipiv,
+                  lapack_complex_double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_sspsvx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, const float* ap, float* afp,
+                   lapack_int* ipiv, const float* b, lapack_int* ldb, float* x, lapack_int* ldx, float* rcond,
+                   float* ferr, float* berr, float* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_dspsvx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, const double* ap, double* afp,
+                   lapack_int* ipiv, const double* b, lapack_int* ldb, double* x, lapack_int* ldx, double* rcond,
+                   double* ferr, double* berr, double* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_cspsvx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* ap,
+                   lapack_complex_float* afp, lapack_int* ipiv, const lapack_complex_float* b, lapack_int* ldb,
+                   lapack_complex_float* x, lapack_int* ldx, float* rcond, float* ferr, float* berr,
+                   lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_zspsvx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* ap,
+                   lapack_complex_double* afp, lapack_int* ipiv, const lapack_complex_double* b, lapack_int* ldb,
+                   lapack_complex_double* x, lapack_int* ldx, double* rcond, double* ferr, double* berr,
+                   lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_chpsv(char* uplo, lapack_int* n, lapack_int* nrhs, lapack_complex_float* ap, lapack_int* ipiv,
+                  lapack_complex_float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_zhpsv(char* uplo, lapack_int* n, lapack_int* nrhs, lapack_complex_double* ap, lapack_int* ipiv,
+                  lapack_complex_double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_chpsvx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* ap,
+                   lapack_complex_float* afp, lapack_int* ipiv, const lapack_complex_float* b, lapack_int* ldb,
+                   lapack_complex_float* x, lapack_int* ldx, float* rcond, float* ferr, float* berr,
+                   lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_zhpsvx(char* fact, char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* ap,
+                   lapack_complex_double* afp, lapack_int* ipiv, const lapack_complex_double* b, lapack_int* ldb,
+                   lapack_complex_double* x, lapack_int* ldx, double* rcond, double* ferr, double* berr,
+                   lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_sgeqrf(lapack_int* m, lapack_int* n, float* a, lapack_int* lda, float* tau, float* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_dgeqrf(lapack_int* m, lapack_int* n, double* a, lapack_int* lda, double* tau, double* work,
+                   lapack_int* lwork, lapack_int* info);
+void LAPACK_cgeqrf(lapack_int* m, lapack_int* n, lapack_complex_float* a, lapack_int* lda, lapack_complex_float* tau,
+                   lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zgeqrf(lapack_int* m, lapack_int* n, lapack_complex_double* a, lapack_int* lda, lapack_complex_double* tau,
+                   lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_sgeqpf(lapack_int* m, lapack_int* n, float* a, lapack_int* lda, lapack_int* jpvt, float* tau, float* work,
+                   lapack_int* info);
+void LAPACK_dgeqpf(lapack_int* m, lapack_int* n, double* a, lapack_int* lda, lapack_int* jpvt, double* tau,
+                   double* work, lapack_int* info);
+void LAPACK_cgeqpf(lapack_int* m, lapack_int* n, lapack_complex_float* a, lapack_int* lda, lapack_int* jpvt,
+                   lapack_complex_float* tau, lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_zgeqpf(lapack_int* m, lapack_int* n, lapack_complex_double* a, lapack_int* lda, lapack_int* jpvt,
+                   lapack_complex_double* tau, lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_sgeqp3(lapack_int* m, lapack_int* n, float* a, lapack_int* lda, lapack_int* jpvt, float* tau, float* work,
+                   lapack_int* lwork, lapack_int* info);
+void LAPACK_dgeqp3(lapack_int* m, lapack_int* n, double* a, lapack_int* lda, lapack_int* jpvt, double* tau,
+                   double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_cgeqp3(lapack_int* m, lapack_int* n, lapack_complex_float* a, lapack_int* lda, lapack_int* jpvt,
+                   lapack_complex_float* tau, lapack_complex_float* work, lapack_int* lwork, float* rwork,
+                   lapack_int* info);
+void LAPACK_zgeqp3(lapack_int* m, lapack_int* n, lapack_complex_double* a, lapack_int* lda, lapack_int* jpvt,
+                   lapack_complex_double* tau, lapack_complex_double* work, lapack_int* lwork, double* rwork,
+                   lapack_int* info);
+void LAPACK_sorgqr(lapack_int* m, lapack_int* n, lapack_int* k, float* a, lapack_int* lda, const float* tau,
+                   float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_dorgqr(lapack_int* m, lapack_int* n, lapack_int* k, double* a, lapack_int* lda, const double* tau,
+                   double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_sormqr(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, const float* a,
+                   lapack_int* lda, const float* tau, float* c, lapack_int* ldc, float* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_dormqr(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, const double* a,
+                   lapack_int* lda, const double* tau, double* c, lapack_int* ldc, double* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_cungqr(lapack_int* m, lapack_int* n, lapack_int* k, lapack_complex_float* a, lapack_int* lda,
+                   const lapack_complex_float* tau, lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zungqr(lapack_int* m, lapack_int* n, lapack_int* k, lapack_complex_double* a, lapack_int* lda,
+                   const lapack_complex_double* tau, lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_cunmqr(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, const lapack_complex_float* a,
+                   lapack_int* lda, const lapack_complex_float* tau, lapack_complex_float* c, lapack_int* ldc,
+                   lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zunmqr(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, const lapack_complex_double* a,
+                   lapack_int* lda, const lapack_complex_double* tau, lapack_complex_double* c, lapack_int* ldc,
+                   lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_sgelqf(lapack_int* m, lapack_int* n, float* a, lapack_int* lda, float* tau, float* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_dgelqf(lapack_int* m, lapack_int* n, double* a, lapack_int* lda, double* tau, double* work,
+                   lapack_int* lwork, lapack_int* info);
+void LAPACK_cgelqf(lapack_int* m, lapack_int* n, lapack_complex_float* a, lapack_int* lda, lapack_complex_float* tau,
+                   lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zgelqf(lapack_int* m, lapack_int* n, lapack_complex_double* a, lapack_int* lda, lapack_complex_double* tau,
+                   lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_sorglq(lapack_int* m, lapack_int* n, lapack_int* k, float* a, lapack_int* lda, const float* tau,
+                   float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_dorglq(lapack_int* m, lapack_int* n, lapack_int* k, double* a, lapack_int* lda, const double* tau,
+                   double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_sormlq(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, const float* a,
+                   lapack_int* lda, const float* tau, float* c, lapack_int* ldc, float* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_dormlq(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, const double* a,
+                   lapack_int* lda, const double* tau, double* c, lapack_int* ldc, double* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_cunglq(lapack_int* m, lapack_int* n, lapack_int* k, lapack_complex_float* a, lapack_int* lda,
+                   const lapack_complex_float* tau, lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zunglq(lapack_int* m, lapack_int* n, lapack_int* k, lapack_complex_double* a, lapack_int* lda,
+                   const lapack_complex_double* tau, lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_cunmlq(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, const lapack_complex_float* a,
+                   lapack_int* lda, const lapack_complex_float* tau, lapack_complex_float* c, lapack_int* ldc,
+                   lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zunmlq(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, const lapack_complex_double* a,
+                   lapack_int* lda, const lapack_complex_double* tau, lapack_complex_double* c, lapack_int* ldc,
+                   lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_sgeqlf(lapack_int* m, lapack_int* n, float* a, lapack_int* lda, float* tau, float* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_dgeqlf(lapack_int* m, lapack_int* n, double* a, lapack_int* lda, double* tau, double* work,
+                   lapack_int* lwork, lapack_int* info);
+void LAPACK_cgeqlf(lapack_int* m, lapack_int* n, lapack_complex_float* a, lapack_int* lda, lapack_complex_float* tau,
+                   lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zgeqlf(lapack_int* m, lapack_int* n, lapack_complex_double* a, lapack_int* lda, lapack_complex_double* tau,
+                   lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_sorgql(lapack_int* m, lapack_int* n, lapack_int* k, float* a, lapack_int* lda, const float* tau,
+                   float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_dorgql(lapack_int* m, lapack_int* n, lapack_int* k, double* a, lapack_int* lda, const double* tau,
+                   double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_cungql(lapack_int* m, lapack_int* n, lapack_int* k, lapack_complex_float* a, lapack_int* lda,
+                   const lapack_complex_float* tau, lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zungql(lapack_int* m, lapack_int* n, lapack_int* k, lapack_complex_double* a, lapack_int* lda,
+                   const lapack_complex_double* tau, lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_sormql(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, const float* a,
+                   lapack_int* lda, const float* tau, float* c, lapack_int* ldc, float* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_dormql(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, const double* a,
+                   lapack_int* lda, const double* tau, double* c, lapack_int* ldc, double* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_cunmql(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, const lapack_complex_float* a,
+                   lapack_int* lda, const lapack_complex_float* tau, lapack_complex_float* c, lapack_int* ldc,
+                   lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zunmql(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, const lapack_complex_double* a,
+                   lapack_int* lda, const lapack_complex_double* tau, lapack_complex_double* c, lapack_int* ldc,
+                   lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_sgerqf(lapack_int* m, lapack_int* n, float* a, lapack_int* lda, float* tau, float* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_dgerqf(lapack_int* m, lapack_int* n, double* a, lapack_int* lda, double* tau, double* work,
+                   lapack_int* lwork, lapack_int* info);
+void LAPACK_cgerqf(lapack_int* m, lapack_int* n, lapack_complex_float* a, lapack_int* lda, lapack_complex_float* tau,
+                   lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zgerqf(lapack_int* m, lapack_int* n, lapack_complex_double* a, lapack_int* lda, lapack_complex_double* tau,
+                   lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_sorgrq(lapack_int* m, lapack_int* n, lapack_int* k, float* a, lapack_int* lda, const float* tau,
+                   float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_dorgrq(lapack_int* m, lapack_int* n, lapack_int* k, double* a, lapack_int* lda, const double* tau,
+                   double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_cungrq(lapack_int* m, lapack_int* n, lapack_int* k, lapack_complex_float* a, lapack_int* lda,
+                   const lapack_complex_float* tau, lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zungrq(lapack_int* m, lapack_int* n, lapack_int* k, lapack_complex_double* a, lapack_int* lda,
+                   const lapack_complex_double* tau, lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_sormrq(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, const float* a,
+                   lapack_int* lda, const float* tau, float* c, lapack_int* ldc, float* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_dormrq(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, const double* a,
+                   lapack_int* lda, const double* tau, double* c, lapack_int* ldc, double* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_cunmrq(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, const lapack_complex_float* a,
+                   lapack_int* lda, const lapack_complex_float* tau, lapack_complex_float* c, lapack_int* ldc,
+                   lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zunmrq(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, const lapack_complex_double* a,
+                   lapack_int* lda, const lapack_complex_double* tau, lapack_complex_double* c, lapack_int* ldc,
+                   lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_stzrzf(lapack_int* m, lapack_int* n, float* a, lapack_int* lda, float* tau, float* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_dtzrzf(lapack_int* m, lapack_int* n, double* a, lapack_int* lda, double* tau, double* work,
+                   lapack_int* lwork, lapack_int* info);
+void LAPACK_ctzrzf(lapack_int* m, lapack_int* n, lapack_complex_float* a, lapack_int* lda, lapack_complex_float* tau,
+                   lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_ztzrzf(lapack_int* m, lapack_int* n, lapack_complex_double* a, lapack_int* lda, lapack_complex_double* tau,
+                   lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_sormrz(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, lapack_int* l, const float* a,
+                   lapack_int* lda, const float* tau, float* c, lapack_int* ldc, float* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_dormrz(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, lapack_int* l, const double* a,
+                   lapack_int* lda, const double* tau, double* c, lapack_int* ldc, double* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_cunmrz(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, lapack_int* l,
+                   const lapack_complex_float* a, lapack_int* lda, const lapack_complex_float* tau,
+                   lapack_complex_float* c, lapack_int* ldc, lapack_complex_float* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_zunmrz(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, lapack_int* l,
+                   const lapack_complex_double* a, lapack_int* lda, const lapack_complex_double* tau,
+                   lapack_complex_double* c, lapack_int* ldc, lapack_complex_double* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_sggqrf(lapack_int* n, lapack_int* m, lapack_int* p, float* a, lapack_int* lda, float* taua, float* b,
+                   lapack_int* ldb, float* taub, float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_dggqrf(lapack_int* n, lapack_int* m, lapack_int* p, double* a, lapack_int* lda, double* taua, double* b,
+                   lapack_int* ldb, double* taub, double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_cggqrf(lapack_int* n, lapack_int* m, lapack_int* p, lapack_complex_float* a, lapack_int* lda,
+                   lapack_complex_float* taua, lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* taub,
+                   lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zggqrf(lapack_int* n, lapack_int* m, lapack_int* p, lapack_complex_double* a, lapack_int* lda,
+                   lapack_complex_double* taua, lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* taub,
+                   lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_sggrqf(lapack_int* m, lapack_int* p, lapack_int* n, float* a, lapack_int* lda, float* taua, float* b,
+                   lapack_int* ldb, float* taub, float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_dggrqf(lapack_int* m, lapack_int* p, lapack_int* n, double* a, lapack_int* lda, double* taua, double* b,
+                   lapack_int* ldb, double* taub, double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_cggrqf(lapack_int* m, lapack_int* p, lapack_int* n, lapack_complex_float* a, lapack_int* lda,
+                   lapack_complex_float* taua, lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* taub,
+                   lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zggrqf(lapack_int* m, lapack_int* p, lapack_int* n, lapack_complex_double* a, lapack_int* lda,
+                   lapack_complex_double* taua, lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* taub,
+                   lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_sgebrd(lapack_int* m, lapack_int* n, float* a, lapack_int* lda, float* d, float* e, float* tauq,
+                   float* taup, float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_dgebrd(lapack_int* m, lapack_int* n, double* a, lapack_int* lda, double* d, double* e, double* tauq,
+                   double* taup, double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_cgebrd(lapack_int* m, lapack_int* n, lapack_complex_float* a, lapack_int* lda, float* d, float* e,
+                   lapack_complex_float* tauq, lapack_complex_float* taup, lapack_complex_float* work,
+                   lapack_int* lwork, lapack_int* info);
+void LAPACK_zgebrd(lapack_int* m, lapack_int* n, lapack_complex_double* a, lapack_int* lda, double* d, double* e,
+                   lapack_complex_double* tauq, lapack_complex_double* taup, lapack_complex_double* work,
+                   lapack_int* lwork, lapack_int* info);
+void LAPACK_sgbbrd(char* vect, lapack_int* m, lapack_int* n, lapack_int* ncc, lapack_int* kl, lapack_int* ku, float* ab,
+                   lapack_int* ldab, float* d, float* e, float* q, lapack_int* ldq, float* pt, lapack_int* ldpt,
+                   float* c, lapack_int* ldc, float* work, lapack_int* info);
+void LAPACK_dgbbrd(char* vect, lapack_int* m, lapack_int* n, lapack_int* ncc, lapack_int* kl, lapack_int* ku,
+                   double* ab, lapack_int* ldab, double* d, double* e, double* q, lapack_int* ldq, double* pt,
+                   lapack_int* ldpt, double* c, lapack_int* ldc, double* work, lapack_int* info);
+void LAPACK_cgbbrd(char* vect, lapack_int* m, lapack_int* n, lapack_int* ncc, lapack_int* kl, lapack_int* ku,
+                   lapack_complex_float* ab, lapack_int* ldab, float* d, float* e, lapack_complex_float* q,
+                   lapack_int* ldq, lapack_complex_float* pt, lapack_int* ldpt, lapack_complex_float* c,
+                   lapack_int* ldc, lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_zgbbrd(char* vect, lapack_int* m, lapack_int* n, lapack_int* ncc, lapack_int* kl, lapack_int* ku,
+                   lapack_complex_double* ab, lapack_int* ldab, double* d, double* e, lapack_complex_double* q,
+                   lapack_int* ldq, lapack_complex_double* pt, lapack_int* ldpt, lapack_complex_double* c,
+                   lapack_int* ldc, lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_sorgbr(char* vect, lapack_int* m, lapack_int* n, lapack_int* k, float* a, lapack_int* lda, const float* tau,
+                   float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_dorgbr(char* vect, lapack_int* m, lapack_int* n, lapack_int* k, double* a, lapack_int* lda,
+                   const double* tau, double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_sormbr(char* vect, char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, const float* a,
+                   lapack_int* lda, const float* tau, float* c, lapack_int* ldc, float* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_dormbr(char* vect, char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, const double* a,
+                   lapack_int* lda, const double* tau, double* c, lapack_int* ldc, double* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_cungbr(char* vect, lapack_int* m, lapack_int* n, lapack_int* k, lapack_complex_float* a, lapack_int* lda,
+                   const lapack_complex_float* tau, lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zungbr(char* vect, lapack_int* m, lapack_int* n, lapack_int* k, lapack_complex_double* a, lapack_int* lda,
+                   const lapack_complex_double* tau, lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_cunmbr(char* vect, char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k,
+                   const lapack_complex_float* a, lapack_int* lda, const lapack_complex_float* tau,
+                   lapack_complex_float* c, lapack_int* ldc, lapack_complex_float* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_zunmbr(char* vect, char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k,
+                   const lapack_complex_double* a, lapack_int* lda, const lapack_complex_double* tau,
+                   lapack_complex_double* c, lapack_int* ldc, lapack_complex_double* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_sbdsqr(char* uplo, lapack_int* n, lapack_int* ncvt, lapack_int* nru, lapack_int* ncc, float* d, float* e,
+                   float* vt, lapack_int* ldvt, float* u, lapack_int* ldu, float* c, lapack_int* ldc, float* work,
+                   lapack_int* info);
+void LAPACK_dbdsqr(char* uplo, lapack_int* n, lapack_int* ncvt, lapack_int* nru, lapack_int* ncc, double* d, double* e,
+                   double* vt, lapack_int* ldvt, double* u, lapack_int* ldu, double* c, lapack_int* ldc, double* work,
+                   lapack_int* info);
+void LAPACK_cbdsqr(char* uplo, lapack_int* n, lapack_int* ncvt, lapack_int* nru, lapack_int* ncc, float* d, float* e,
+                   lapack_complex_float* vt, lapack_int* ldvt, lapack_complex_float* u, lapack_int* ldu,
+                   lapack_complex_float* c, lapack_int* ldc, float* work, lapack_int* info);
+void LAPACK_zbdsqr(char* uplo, lapack_int* n, lapack_int* ncvt, lapack_int* nru, lapack_int* ncc, double* d, double* e,
+                   lapack_complex_double* vt, lapack_int* ldvt, lapack_complex_double* u, lapack_int* ldu,
+                   lapack_complex_double* c, lapack_int* ldc, double* work, lapack_int* info);
+void LAPACK_sbdsdc(char* uplo, char* compq, lapack_int* n, float* d, float* e, float* u, lapack_int* ldu, float* vt,
+                   lapack_int* ldvt, float* q, lapack_int* iq, float* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_dbdsdc(char* uplo, char* compq, lapack_int* n, double* d, double* e, double* u, lapack_int* ldu, double* vt,
+                   lapack_int* ldvt, double* q, lapack_int* iq, double* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_ssytrd(char* uplo, lapack_int* n, float* a, lapack_int* lda, float* d, float* e, float* tau, float* work,
+                   lapack_int* lwork, lapack_int* info);
+void LAPACK_dsytrd(char* uplo, lapack_int* n, double* a, lapack_int* lda, double* d, double* e, double* tau,
+                   double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_sorgtr(char* uplo, lapack_int* n, float* a, lapack_int* lda, const float* tau, float* work,
+                   lapack_int* lwork, lapack_int* info);
+void LAPACK_dorgtr(char* uplo, lapack_int* n, double* a, lapack_int* lda, const double* tau, double* work,
+                   lapack_int* lwork, lapack_int* info);
+void LAPACK_sormtr(char* side, char* uplo, char* trans, lapack_int* m, lapack_int* n, const float* a, lapack_int* lda,
+                   const float* tau, float* c, lapack_int* ldc, float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_dormtr(char* side, char* uplo, char* trans, lapack_int* m, lapack_int* n, const double* a, lapack_int* lda,
+                   const double* tau, double* c, lapack_int* ldc, double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_chetrd(char* uplo, lapack_int* n, lapack_complex_float* a, lapack_int* lda, float* d, float* e,
+                   lapack_complex_float* tau, lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zhetrd(char* uplo, lapack_int* n, lapack_complex_double* a, lapack_int* lda, double* d, double* e,
+                   lapack_complex_double* tau, lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_cungtr(char* uplo, lapack_int* n, lapack_complex_float* a, lapack_int* lda, const lapack_complex_float* tau,
+                   lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zungtr(char* uplo, lapack_int* n, lapack_complex_double* a, lapack_int* lda,
+                   const lapack_complex_double* tau, lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_cunmtr(char* side, char* uplo, char* trans, lapack_int* m, lapack_int* n, const lapack_complex_float* a,
+                   lapack_int* lda, const lapack_complex_float* tau, lapack_complex_float* c, lapack_int* ldc,
+                   lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zunmtr(char* side, char* uplo, char* trans, lapack_int* m, lapack_int* n, const lapack_complex_double* a,
+                   lapack_int* lda, const lapack_complex_double* tau, lapack_complex_double* c, lapack_int* ldc,
+                   lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_ssptrd(char* uplo, lapack_int* n, float* ap, float* d, float* e, float* tau, lapack_int* info);
+void LAPACK_dsptrd(char* uplo, lapack_int* n, double* ap, double* d, double* e, double* tau, lapack_int* info);
+void LAPACK_sopgtr(char* uplo, lapack_int* n, const float* ap, const float* tau, float* q, lapack_int* ldq, float* work,
+                   lapack_int* info);
+void LAPACK_dopgtr(char* uplo, lapack_int* n, const double* ap, const double* tau, double* q, lapack_int* ldq,
+                   double* work, lapack_int* info);
+void LAPACK_sopmtr(char* side, char* uplo, char* trans, lapack_int* m, lapack_int* n, const float* ap, const float* tau,
+                   float* c, lapack_int* ldc, float* work, lapack_int* info);
+void LAPACK_dopmtr(char* side, char* uplo, char* trans, lapack_int* m, lapack_int* n, const double* ap,
+                   const double* tau, double* c, lapack_int* ldc, double* work, lapack_int* info);
+void LAPACK_chptrd(char* uplo, lapack_int* n, lapack_complex_float* ap, float* d, float* e, lapack_complex_float* tau,
+                   lapack_int* info);
+void LAPACK_zhptrd(char* uplo, lapack_int* n, lapack_complex_double* ap, double* d, double* e,
+                   lapack_complex_double* tau, lapack_int* info);
+void LAPACK_cupgtr(char* uplo, lapack_int* n, const lapack_complex_float* ap, const lapack_complex_float* tau,
+                   lapack_complex_float* q, lapack_int* ldq, lapack_complex_float* work, lapack_int* info);
+void LAPACK_zupgtr(char* uplo, lapack_int* n, const lapack_complex_double* ap, const lapack_complex_double* tau,
+                   lapack_complex_double* q, lapack_int* ldq, lapack_complex_double* work, lapack_int* info);
+void LAPACK_cupmtr(char* side, char* uplo, char* trans, lapack_int* m, lapack_int* n, const lapack_complex_float* ap,
+                   const lapack_complex_float* tau, lapack_complex_float* c, lapack_int* ldc,
+                   lapack_complex_float* work, lapack_int* info);
+void LAPACK_zupmtr(char* side, char* uplo, char* trans, lapack_int* m, lapack_int* n, const lapack_complex_double* ap,
+                   const lapack_complex_double* tau, lapack_complex_double* c, lapack_int* ldc,
+                   lapack_complex_double* work, lapack_int* info);
+void LAPACK_ssbtrd(char* vect, char* uplo, lapack_int* n, lapack_int* kd, float* ab, lapack_int* ldab, float* d,
+                   float* e, float* q, lapack_int* ldq, float* work, lapack_int* info);
+void LAPACK_dsbtrd(char* vect, char* uplo, lapack_int* n, lapack_int* kd, double* ab, lapack_int* ldab, double* d,
+                   double* e, double* q, lapack_int* ldq, double* work, lapack_int* info);
+void LAPACK_chbtrd(char* vect, char* uplo, lapack_int* n, lapack_int* kd, lapack_complex_float* ab, lapack_int* ldab,
+                   float* d, float* e, lapack_complex_float* q, lapack_int* ldq, lapack_complex_float* work,
+                   lapack_int* info);
+void LAPACK_zhbtrd(char* vect, char* uplo, lapack_int* n, lapack_int* kd, lapack_complex_double* ab, lapack_int* ldab,
+                   double* d, double* e, lapack_complex_double* q, lapack_int* ldq, lapack_complex_double* work,
+                   lapack_int* info);
+void LAPACK_ssterf(lapack_int* n, float* d, float* e, lapack_int* info);
+void LAPACK_dsterf(lapack_int* n, double* d, double* e, lapack_int* info);
+void LAPACK_ssteqr(char* compz, lapack_int* n, float* d, float* e, float* z, lapack_int* ldz, float* work,
+                   lapack_int* info);
+void LAPACK_dsteqr(char* compz, lapack_int* n, double* d, double* e, double* z, lapack_int* ldz, double* work,
+                   lapack_int* info);
+void LAPACK_csteqr(char* compz, lapack_int* n, float* d, float* e, lapack_complex_float* z, lapack_int* ldz,
+                   float* work, lapack_int* info);
+void LAPACK_zsteqr(char* compz, lapack_int* n, double* d, double* e, lapack_complex_double* z, lapack_int* ldz,
+                   double* work, lapack_int* info);
+void LAPACK_sstemr(char* jobz, char* range, lapack_int* n, float* d, float* e, float* vl, float* vu, lapack_int* il,
+                   lapack_int* iu, lapack_int* m, float* w, float* z, lapack_int* ldz, lapack_int* nzc,
+                   lapack_int* isuppz, lapack_logical* tryrac, float* work, lapack_int* lwork, lapack_int* iwork,
+                   lapack_int* liwork, lapack_int* info);
+void LAPACK_dstemr(char* jobz, char* range, lapack_int* n, double* d, double* e, double* vl, double* vu, lapack_int* il,
+                   lapack_int* iu, lapack_int* m, double* w, double* z, lapack_int* ldz, lapack_int* nzc,
+                   lapack_int* isuppz, lapack_logical* tryrac, double* work, lapack_int* lwork, lapack_int* iwork,
+                   lapack_int* liwork, lapack_int* info);
+void LAPACK_cstemr(char* jobz, char* range, lapack_int* n, float* d, float* e, float* vl, float* vu, lapack_int* il,
+                   lapack_int* iu, lapack_int* m, float* w, lapack_complex_float* z, lapack_int* ldz, lapack_int* nzc,
+                   lapack_int* isuppz, lapack_logical* tryrac, float* work, lapack_int* lwork, lapack_int* iwork,
+                   lapack_int* liwork, lapack_int* info);
+void LAPACK_zstemr(char* jobz, char* range, lapack_int* n, double* d, double* e, double* vl, double* vu, lapack_int* il,
+                   lapack_int* iu, lapack_int* m, double* w, lapack_complex_double* z, lapack_int* ldz, lapack_int* nzc,
+                   lapack_int* isuppz, lapack_logical* tryrac, double* work, lapack_int* lwork, lapack_int* iwork,
+                   lapack_int* liwork, lapack_int* info);
+void LAPACK_sstedc(char* compz, lapack_int* n, float* d, float* e, float* z, lapack_int* ldz, float* work,
+                   lapack_int* lwork, lapack_int* iwork, lapack_int* liwork, lapack_int* info);
+void LAPACK_dstedc(char* compz, lapack_int* n, double* d, double* e, double* z, lapack_int* ldz, double* work,
+                   lapack_int* lwork, lapack_int* iwork, lapack_int* liwork, lapack_int* info);
+void LAPACK_cstedc(char* compz, lapack_int* n, float* d, float* e, lapack_complex_float* z, lapack_int* ldz,
+                   lapack_complex_float* work, lapack_int* lwork, float* rwork, lapack_int* lrwork, lapack_int* iwork,
+                   lapack_int* liwork, lapack_int* info);
+void LAPACK_zstedc(char* compz, lapack_int* n, double* d, double* e, lapack_complex_double* z, lapack_int* ldz,
+                   lapack_complex_double* work, lapack_int* lwork, double* rwork, lapack_int* lrwork, lapack_int* iwork,
+                   lapack_int* liwork, lapack_int* info);
+void LAPACK_sstegr(char* jobz, char* range, lapack_int* n, float* d, float* e, float* vl, float* vu, lapack_int* il,
+                   lapack_int* iu, float* abstol, lapack_int* m, float* w, float* z, lapack_int* ldz,
+                   lapack_int* isuppz, float* work, lapack_int* lwork, lapack_int* iwork, lapack_int* liwork,
+                   lapack_int* info);
+void LAPACK_dstegr(char* jobz, char* range, lapack_int* n, double* d, double* e, double* vl, double* vu, lapack_int* il,
+                   lapack_int* iu, double* abstol, lapack_int* m, double* w, double* z, lapack_int* ldz,
+                   lapack_int* isuppz, double* work, lapack_int* lwork, lapack_int* iwork, lapack_int* liwork,
+                   lapack_int* info);
+void LAPACK_cstegr(char* jobz, char* range, lapack_int* n, float* d, float* e, float* vl, float* vu, lapack_int* il,
+                   lapack_int* iu, float* abstol, lapack_int* m, float* w, lapack_complex_float* z, lapack_int* ldz,
+                   lapack_int* isuppz, float* work, lapack_int* lwork, lapack_int* iwork, lapack_int* liwork,
+                   lapack_int* info);
+void LAPACK_zstegr(char* jobz, char* range, lapack_int* n, double* d, double* e, double* vl, double* vu, lapack_int* il,
+                   lapack_int* iu, double* abstol, lapack_int* m, double* w, lapack_complex_double* z, lapack_int* ldz,
+                   lapack_int* isuppz, double* work, lapack_int* lwork, lapack_int* iwork, lapack_int* liwork,
+                   lapack_int* info);
+void LAPACK_spteqr(char* compz, lapack_int* n, float* d, float* e, float* z, lapack_int* ldz, float* work,
+                   lapack_int* info);
+void LAPACK_dpteqr(char* compz, lapack_int* n, double* d, double* e, double* z, lapack_int* ldz, double* work,
+                   lapack_int* info);
+void LAPACK_cpteqr(char* compz, lapack_int* n, float* d, float* e, lapack_complex_float* z, lapack_int* ldz,
+                   float* work, lapack_int* info);
+void LAPACK_zpteqr(char* compz, lapack_int* n, double* d, double* e, lapack_complex_double* z, lapack_int* ldz,
+                   double* work, lapack_int* info);
+void LAPACK_sstebz(char* range, char* order, lapack_int* n, float* vl, float* vu, lapack_int* il, lapack_int* iu,
+                   float* abstol, const float* d, const float* e, lapack_int* m, lapack_int* nsplit, float* w,
+                   lapack_int* iblock, lapack_int* isplit, float* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_dstebz(char* range, char* order, lapack_int* n, double* vl, double* vu, lapack_int* il, lapack_int* iu,
+                   double* abstol, const double* d, const double* e, lapack_int* m, lapack_int* nsplit, double* w,
+                   lapack_int* iblock, lapack_int* isplit, double* work, lapack_int* iwork, lapack_int* info);
+void LAPACK_sstein(lapack_int* n, const float* d, const float* e, lapack_int* m, const float* w,
+                   const lapack_int* iblock, const lapack_int* isplit, float* z, lapack_int* ldz, float* work,
+                   lapack_int* iwork, lapack_int* ifailv, lapack_int* info);
+void LAPACK_dstein(lapack_int* n, const double* d, const double* e, lapack_int* m, const double* w,
+                   const lapack_int* iblock, const lapack_int* isplit, double* z, lapack_int* ldz, double* work,
+                   lapack_int* iwork, lapack_int* ifailv, lapack_int* info);
+void LAPACK_cstein(lapack_int* n, const float* d, const float* e, lapack_int* m, const float* w,
+                   const lapack_int* iblock, const lapack_int* isplit, lapack_complex_float* z, lapack_int* ldz,
+                   float* work, lapack_int* iwork, lapack_int* ifailv, lapack_int* info);
+void LAPACK_zstein(lapack_int* n, const double* d, const double* e, lapack_int* m, const double* w,
+                   const lapack_int* iblock, const lapack_int* isplit, lapack_complex_double* z, lapack_int* ldz,
+                   double* work, lapack_int* iwork, lapack_int* ifailv, lapack_int* info);
+void LAPACK_sdisna(char* job, lapack_int* m, lapack_int* n, const float* d, float* sep, lapack_int* info);
+void LAPACK_ddisna(char* job, lapack_int* m, lapack_int* n, const double* d, double* sep, lapack_int* info);
+void LAPACK_ssygst(lapack_int* itype, char* uplo, lapack_int* n, float* a, lapack_int* lda, const float* b,
+                   lapack_int* ldb, lapack_int* info);
+void LAPACK_dsygst(lapack_int* itype, char* uplo, lapack_int* n, double* a, lapack_int* lda, const double* b,
+                   lapack_int* ldb, lapack_int* info);
+void LAPACK_chegst(lapack_int* itype, char* uplo, lapack_int* n, lapack_complex_float* a, lapack_int* lda,
+                   const lapack_complex_float* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_zhegst(lapack_int* itype, char* uplo, lapack_int* n, lapack_complex_double* a, lapack_int* lda,
+                   const lapack_complex_double* b, lapack_int* ldb, lapack_int* info);
+void LAPACK_sspgst(lapack_int* itype, char* uplo, lapack_int* n, float* ap, const float* bp, lapack_int* info);
+void LAPACK_dspgst(lapack_int* itype, char* uplo, lapack_int* n, double* ap, const double* bp, lapack_int* info);
+void LAPACK_chpgst(lapack_int* itype, char* uplo, lapack_int* n, lapack_complex_float* ap,
+                   const lapack_complex_float* bp, lapack_int* info);
+void LAPACK_zhpgst(lapack_int* itype, char* uplo, lapack_int* n, lapack_complex_double* ap,
+                   const lapack_complex_double* bp, lapack_int* info);
+void LAPACK_ssbgst(char* vect, char* uplo, lapack_int* n, lapack_int* ka, lapack_int* kb, float* ab, lapack_int* ldab,
+                   const float* bb, lapack_int* ldbb, float* x, lapack_int* ldx, float* work, lapack_int* info);
+void LAPACK_dsbgst(char* vect, char* uplo, lapack_int* n, lapack_int* ka, lapack_int* kb, double* ab, lapack_int* ldab,
+                   const double* bb, lapack_int* ldbb, double* x, lapack_int* ldx, double* work, lapack_int* info);
+void LAPACK_chbgst(char* vect, char* uplo, lapack_int* n, lapack_int* ka, lapack_int* kb, lapack_complex_float* ab,
+                   lapack_int* ldab, const lapack_complex_float* bb, lapack_int* ldbb, lapack_complex_float* x,
+                   lapack_int* ldx, lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_zhbgst(char* vect, char* uplo, lapack_int* n, lapack_int* ka, lapack_int* kb, lapack_complex_double* ab,
+                   lapack_int* ldab, const lapack_complex_double* bb, lapack_int* ldbb, lapack_complex_double* x,
+                   lapack_int* ldx, lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_spbstf(char* uplo, lapack_int* n, lapack_int* kb, float* bb, lapack_int* ldbb, lapack_int* info);
+void LAPACK_dpbstf(char* uplo, lapack_int* n, lapack_int* kb, double* bb, lapack_int* ldbb, lapack_int* info);
+void LAPACK_cpbstf(char* uplo, lapack_int* n, lapack_int* kb, lapack_complex_float* bb, lapack_int* ldbb,
+                   lapack_int* info);
+void LAPACK_zpbstf(char* uplo, lapack_int* n, lapack_int* kb, lapack_complex_double* bb, lapack_int* ldbb,
+                   lapack_int* info);
+void LAPACK_sgehrd(lapack_int* n, lapack_int* ilo, lapack_int* ihi, float* a, lapack_int* lda, float* tau, float* work,
+                   lapack_int* lwork, lapack_int* info);
+void LAPACK_dgehrd(lapack_int* n, lapack_int* ilo, lapack_int* ihi, double* a, lapack_int* lda, double* tau,
+                   double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_cgehrd(lapack_int* n, lapack_int* ilo, lapack_int* ihi, lapack_complex_float* a, lapack_int* lda,
+                   lapack_complex_float* tau, lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zgehrd(lapack_int* n, lapack_int* ilo, lapack_int* ihi, lapack_complex_double* a, lapack_int* lda,
+                   lapack_complex_double* tau, lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_sorghr(lapack_int* n, lapack_int* ilo, lapack_int* ihi, float* a, lapack_int* lda, const float* tau,
+                   float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_dorghr(lapack_int* n, lapack_int* ilo, lapack_int* ihi, double* a, lapack_int* lda, const double* tau,
+                   double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_sormhr(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* ilo, lapack_int* ihi,
+                   const float* a, lapack_int* lda, const float* tau, float* c, lapack_int* ldc, float* work,
+                   lapack_int* lwork, lapack_int* info);
+void LAPACK_dormhr(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* ilo, lapack_int* ihi,
+                   const double* a, lapack_int* lda, const double* tau, double* c, lapack_int* ldc, double* work,
+                   lapack_int* lwork, lapack_int* info);
+void LAPACK_cunghr(lapack_int* n, lapack_int* ilo, lapack_int* ihi, lapack_complex_float* a, lapack_int* lda,
+                   const lapack_complex_float* tau, lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zunghr(lapack_int* n, lapack_int* ilo, lapack_int* ihi, lapack_complex_double* a, lapack_int* lda,
+                   const lapack_complex_double* tau, lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_cunmhr(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* ilo, lapack_int* ihi,
+                   const lapack_complex_float* a, lapack_int* lda, const lapack_complex_float* tau,
+                   lapack_complex_float* c, lapack_int* ldc, lapack_complex_float* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_zunmhr(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* ilo, lapack_int* ihi,
+                   const lapack_complex_double* a, lapack_int* lda, const lapack_complex_double* tau,
+                   lapack_complex_double* c, lapack_int* ldc, lapack_complex_double* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_sgebal(char* job, lapack_int* n, float* a, lapack_int* lda, lapack_int* ilo, lapack_int* ihi, float* scale,
+                   lapack_int* info);
+void LAPACK_dgebal(char* job, lapack_int* n, double* a, lapack_int* lda, lapack_int* ilo, lapack_int* ihi,
+                   double* scale, lapack_int* info);
+void LAPACK_cgebal(char* job, lapack_int* n, lapack_complex_float* a, lapack_int* lda, lapack_int* ilo, lapack_int* ihi,
+                   float* scale, lapack_int* info);
+void LAPACK_zgebal(char* job, lapack_int* n, lapack_complex_double* a, lapack_int* lda, lapack_int* ilo,
+                   lapack_int* ihi, double* scale, lapack_int* info);
+void LAPACK_sgebak(char* job, char* side, lapack_int* n, lapack_int* ilo, lapack_int* ihi, const float* scale,
+                   lapack_int* m, float* v, lapack_int* ldv, lapack_int* info);
+void LAPACK_dgebak(char* job, char* side, lapack_int* n, lapack_int* ilo, lapack_int* ihi, const double* scale,
+                   lapack_int* m, double* v, lapack_int* ldv, lapack_int* info);
+void LAPACK_cgebak(char* job, char* side, lapack_int* n, lapack_int* ilo, lapack_int* ihi, const float* scale,
+                   lapack_int* m, lapack_complex_float* v, lapack_int* ldv, lapack_int* info);
+void LAPACK_zgebak(char* job, char* side, lapack_int* n, lapack_int* ilo, lapack_int* ihi, const double* scale,
+                   lapack_int* m, lapack_complex_double* v, lapack_int* ldv, lapack_int* info);
+void LAPACK_shseqr(char* job, char* compz, lapack_int* n, lapack_int* ilo, lapack_int* ihi, float* h, lapack_int* ldh,
+                   float* wr, float* wi, float* z, lapack_int* ldz, float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_dhseqr(char* job, char* compz, lapack_int* n, lapack_int* ilo, lapack_int* ihi, double* h, lapack_int* ldh,
+                   double* wr, double* wi, double* z, lapack_int* ldz, double* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_chseqr(char* job, char* compz, lapack_int* n, lapack_int* ilo, lapack_int* ihi, lapack_complex_float* h,
+                   lapack_int* ldh, lapack_complex_float* w, lapack_complex_float* z, lapack_int* ldz,
+                   lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zhseqr(char* job, char* compz, lapack_int* n, lapack_int* ilo, lapack_int* ihi, lapack_complex_double* h,
+                   lapack_int* ldh, lapack_complex_double* w, lapack_complex_double* z, lapack_int* ldz,
+                   lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_shsein(char* job, char* eigsrc, char* initv, lapack_logical* select, lapack_int* n, const float* h,
+                   lapack_int* ldh, float* wr, const float* wi, float* vl, lapack_int* ldvl, float* vr,
+                   lapack_int* ldvr, lapack_int* mm, lapack_int* m, float* work, lapack_int* ifaill, lapack_int* ifailr,
+                   lapack_int* info);
+void LAPACK_dhsein(char* job, char* eigsrc, char* initv, lapack_logical* select, lapack_int* n, const double* h,
+                   lapack_int* ldh, double* wr, const double* wi, double* vl, lapack_int* ldvl, double* vr,
+                   lapack_int* ldvr, lapack_int* mm, lapack_int* m, double* work, lapack_int* ifaill,
+                   lapack_int* ifailr, lapack_int* info);
+void LAPACK_chsein(char* job, char* eigsrc, char* initv, const lapack_logical* select, lapack_int* n,
+                   const lapack_complex_float* h, lapack_int* ldh, lapack_complex_float* w, lapack_complex_float* vl,
+                   lapack_int* ldvl, lapack_complex_float* vr, lapack_int* ldvr, lapack_int* mm, lapack_int* m,
+                   lapack_complex_float* work, float* rwork, lapack_int* ifaill, lapack_int* ifailr, lapack_int* info);
+void LAPACK_zhsein(char* job, char* eigsrc, char* initv, const lapack_logical* select, lapack_int* n,
+                   const lapack_complex_double* h, lapack_int* ldh, lapack_complex_double* w, lapack_complex_double* vl,
+                   lapack_int* ldvl, lapack_complex_double* vr, lapack_int* ldvr, lapack_int* mm, lapack_int* m,
+                   lapack_complex_double* work, double* rwork, lapack_int* ifaill, lapack_int* ifailr,
+                   lapack_int* info);
+void LAPACK_strevc(char* side, char* howmny, lapack_logical* select, lapack_int* n, const float* t, lapack_int* ldt,
+                   float* vl, lapack_int* ldvl, float* vr, lapack_int* ldvr, lapack_int* mm, lapack_int* m, float* work,
+                   lapack_int* info);
+void LAPACK_dtrevc(char* side, char* howmny, lapack_logical* select, lapack_int* n, const double* t, lapack_int* ldt,
+                   double* vl, lapack_int* ldvl, double* vr, lapack_int* ldvr, lapack_int* mm, lapack_int* m,
+                   double* work, lapack_int* info);
+void LAPACK_ctrevc(char* side, char* howmny, const lapack_logical* select, lapack_int* n, lapack_complex_float* t,
+                   lapack_int* ldt, lapack_complex_float* vl, lapack_int* ldvl, lapack_complex_float* vr,
+                   lapack_int* ldvr, lapack_int* mm, lapack_int* m, lapack_complex_float* work, float* rwork,
+                   lapack_int* info);
+void LAPACK_ztrevc(char* side, char* howmny, const lapack_logical* select, lapack_int* n, lapack_complex_double* t,
+                   lapack_int* ldt, lapack_complex_double* vl, lapack_int* ldvl, lapack_complex_double* vr,
+                   lapack_int* ldvr, lapack_int* mm, lapack_int* m, lapack_complex_double* work, double* rwork,
+                   lapack_int* info);
+void LAPACK_strsna(char* job, char* howmny, const lapack_logical* select, lapack_int* n, const float* t,
+                   lapack_int* ldt, const float* vl, lapack_int* ldvl, const float* vr, lapack_int* ldvr, float* s,
+                   float* sep, lapack_int* mm, lapack_int* m, float* work, lapack_int* ldwork, lapack_int* iwork,
+                   lapack_int* info);
+void LAPACK_dtrsna(char* job, char* howmny, const lapack_logical* select, lapack_int* n, const double* t,
+                   lapack_int* ldt, const double* vl, lapack_int* ldvl, const double* vr, lapack_int* ldvr, double* s,
+                   double* sep, lapack_int* mm, lapack_int* m, double* work, lapack_int* ldwork, lapack_int* iwork,
+                   lapack_int* info);
+void LAPACK_ctrsna(char* job, char* howmny, const lapack_logical* select, lapack_int* n, const lapack_complex_float* t,
+                   lapack_int* ldt, const lapack_complex_float* vl, lapack_int* ldvl, const lapack_complex_float* vr,
+                   lapack_int* ldvr, float* s, float* sep, lapack_int* mm, lapack_int* m, lapack_complex_float* work,
+                   lapack_int* ldwork, float* rwork, lapack_int* info);
+void LAPACK_ztrsna(char* job, char* howmny, const lapack_logical* select, lapack_int* n, const lapack_complex_double* t,
+                   lapack_int* ldt, const lapack_complex_double* vl, lapack_int* ldvl, const lapack_complex_double* vr,
+                   lapack_int* ldvr, double* s, double* sep, lapack_int* mm, lapack_int* m, lapack_complex_double* work,
+                   lapack_int* ldwork, double* rwork, lapack_int* info);
+void LAPACK_strexc(char* compq, lapack_int* n, float* t, lapack_int* ldt, float* q, lapack_int* ldq, lapack_int* ifst,
+                   lapack_int* ilst, float* work, lapack_int* info);
+void LAPACK_dtrexc(char* compq, lapack_int* n, double* t, lapack_int* ldt, double* q, lapack_int* ldq, lapack_int* ifst,
+                   lapack_int* ilst, double* work, lapack_int* info);
+void LAPACK_ctrexc(char* compq, lapack_int* n, lapack_complex_float* t, lapack_int* ldt, lapack_complex_float* q,
+                   lapack_int* ldq, lapack_int* ifst, lapack_int* ilst, lapack_int* info);
+void LAPACK_ztrexc(char* compq, lapack_int* n, lapack_complex_double* t, lapack_int* ldt, lapack_complex_double* q,
+                   lapack_int* ldq, lapack_int* ifst, lapack_int* ilst, lapack_int* info);
+void LAPACK_strsen(char* job, char* compq, const lapack_logical* select, lapack_int* n, float* t, lapack_int* ldt,
+                   float* q, lapack_int* ldq, float* wr, float* wi, lapack_int* m, float* s, float* sep, float* work,
+                   lapack_int* lwork, lapack_int* iwork, lapack_int* liwork, lapack_int* info);
+void LAPACK_dtrsen(char* job, char* compq, const lapack_logical* select, lapack_int* n, double* t, lapack_int* ldt,
+                   double* q, lapack_int* ldq, double* wr, double* wi, lapack_int* m, double* s, double* sep,
+                   double* work, lapack_int* lwork, lapack_int* iwork, lapack_int* liwork, lapack_int* info);
+void LAPACK_ctrsen(char* job, char* compq, const lapack_logical* select, lapack_int* n, lapack_complex_float* t,
+                   lapack_int* ldt, lapack_complex_float* q, lapack_int* ldq, lapack_complex_float* w, lapack_int* m,
+                   float* s, float* sep, lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_ztrsen(char* job, char* compq, const lapack_logical* select, lapack_int* n, lapack_complex_double* t,
+                   lapack_int* ldt, lapack_complex_double* q, lapack_int* ldq, lapack_complex_double* w, lapack_int* m,
+                   double* s, double* sep, lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_strsyl(char* trana, char* tranb, lapack_int* isgn, lapack_int* m, lapack_int* n, const float* a,
+                   lapack_int* lda, const float* b, lapack_int* ldb, float* c, lapack_int* ldc, float* scale,
+                   lapack_int* info);
+void LAPACK_dtrsyl(char* trana, char* tranb, lapack_int* isgn, lapack_int* m, lapack_int* n, const double* a,
+                   lapack_int* lda, const double* b, lapack_int* ldb, double* c, lapack_int* ldc, double* scale,
+                   lapack_int* info);
+void LAPACK_ctrsyl(char* trana, char* tranb, lapack_int* isgn, lapack_int* m, lapack_int* n,
+                   const lapack_complex_float* a, lapack_int* lda, const lapack_complex_float* b, lapack_int* ldb,
+                   lapack_complex_float* c, lapack_int* ldc, float* scale, lapack_int* info);
+void LAPACK_ztrsyl(char* trana, char* tranb, lapack_int* isgn, lapack_int* m, lapack_int* n,
+                   const lapack_complex_double* a, lapack_int* lda, const lapack_complex_double* b, lapack_int* ldb,
+                   lapack_complex_double* c, lapack_int* ldc, double* scale, lapack_int* info);
+void LAPACK_sgghrd(char* compq, char* compz, lapack_int* n, lapack_int* ilo, lapack_int* ihi, float* a, lapack_int* lda,
+                   float* b, lapack_int* ldb, float* q, lapack_int* ldq, float* z, lapack_int* ldz, lapack_int* info);
+void LAPACK_dgghrd(char* compq, char* compz, lapack_int* n, lapack_int* ilo, lapack_int* ihi, double* a,
+                   lapack_int* lda, double* b, lapack_int* ldb, double* q, lapack_int* ldq, double* z, lapack_int* ldz,
+                   lapack_int* info);
+void LAPACK_cgghrd(char* compq, char* compz, lapack_int* n, lapack_int* ilo, lapack_int* ihi, lapack_complex_float* a,
+                   lapack_int* lda, lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* q, lapack_int* ldq,
+                   lapack_complex_float* z, lapack_int* ldz, lapack_int* info);
+void LAPACK_zgghrd(char* compq, char* compz, lapack_int* n, lapack_int* ilo, lapack_int* ihi, lapack_complex_double* a,
+                   lapack_int* lda, lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* q,
+                   lapack_int* ldq, lapack_complex_double* z, lapack_int* ldz, lapack_int* info);
+void LAPACK_sggbal(char* job, lapack_int* n, float* a, lapack_int* lda, float* b, lapack_int* ldb, lapack_int* ilo,
+                   lapack_int* ihi, float* lscale, float* rscale, float* work, lapack_int* info);
+void LAPACK_dggbal(char* job, lapack_int* n, double* a, lapack_int* lda, double* b, lapack_int* ldb, lapack_int* ilo,
+                   lapack_int* ihi, double* lscale, double* rscale, double* work, lapack_int* info);
+void LAPACK_cggbal(char* job, lapack_int* n, lapack_complex_float* a, lapack_int* lda, lapack_complex_float* b,
+                   lapack_int* ldb, lapack_int* ilo, lapack_int* ihi, float* lscale, float* rscale, float* work,
+                   lapack_int* info);
+void LAPACK_zggbal(char* job, lapack_int* n, lapack_complex_double* a, lapack_int* lda, lapack_complex_double* b,
+                   lapack_int* ldb, lapack_int* ilo, lapack_int* ihi, double* lscale, double* rscale, double* work,
+                   lapack_int* info);
+void LAPACK_sggbak(char* job, char* side, lapack_int* n, lapack_int* ilo, lapack_int* ihi, const float* lscale,
+                   const float* rscale, lapack_int* m, float* v, lapack_int* ldv, lapack_int* info);
+void LAPACK_dggbak(char* job, char* side, lapack_int* n, lapack_int* ilo, lapack_int* ihi, const double* lscale,
+                   const double* rscale, lapack_int* m, double* v, lapack_int* ldv, lapack_int* info);
+void LAPACK_cggbak(char* job, char* side, lapack_int* n, lapack_int* ilo, lapack_int* ihi, const float* lscale,
+                   const float* rscale, lapack_int* m, lapack_complex_float* v, lapack_int* ldv, lapack_int* info);
+void LAPACK_zggbak(char* job, char* side, lapack_int* n, lapack_int* ilo, lapack_int* ihi, const double* lscale,
+                   const double* rscale, lapack_int* m, lapack_complex_double* v, lapack_int* ldv, lapack_int* info);
+void LAPACK_shgeqz(char* job, char* compq, char* compz, lapack_int* n, lapack_int* ilo, lapack_int* ihi, float* h,
+                   lapack_int* ldh, float* t, lapack_int* ldt, float* alphar, float* alphai, float* beta, float* q,
+                   lapack_int* ldq, float* z, lapack_int* ldz, float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_dhgeqz(char* job, char* compq, char* compz, lapack_int* n, lapack_int* ilo, lapack_int* ihi, double* h,
+                   lapack_int* ldh, double* t, lapack_int* ldt, double* alphar, double* alphai, double* beta, double* q,
+                   lapack_int* ldq, double* z, lapack_int* ldz, double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_chgeqz(char* job, char* compq, char* compz, lapack_int* n, lapack_int* ilo, lapack_int* ihi,
+                   lapack_complex_float* h, lapack_int* ldh, lapack_complex_float* t, lapack_int* ldt,
+                   lapack_complex_float* alpha, lapack_complex_float* beta, lapack_complex_float* q, lapack_int* ldq,
+                   lapack_complex_float* z, lapack_int* ldz, lapack_complex_float* work, lapack_int* lwork,
+                   float* rwork, lapack_int* info);
+void LAPACK_zhgeqz(char* job, char* compq, char* compz, lapack_int* n, lapack_int* ilo, lapack_int* ihi,
+                   lapack_complex_double* h, lapack_int* ldh, lapack_complex_double* t, lapack_int* ldt,
+                   lapack_complex_double* alpha, lapack_complex_double* beta, lapack_complex_double* q, lapack_int* ldq,
+                   lapack_complex_double* z, lapack_int* ldz, lapack_complex_double* work, lapack_int* lwork,
+                   double* rwork, lapack_int* info);
+void LAPACK_stgevc(char* side, char* howmny, const lapack_logical* select, lapack_int* n, const float* s,
+                   lapack_int* lds, const float* p, lapack_int* ldp, float* vl, lapack_int* ldvl, float* vr,
+                   lapack_int* ldvr, lapack_int* mm, lapack_int* m, float* work, lapack_int* info);
+void LAPACK_dtgevc(char* side, char* howmny, const lapack_logical* select, lapack_int* n, const double* s,
+                   lapack_int* lds, const double* p, lapack_int* ldp, double* vl, lapack_int* ldvl, double* vr,
+                   lapack_int* ldvr, lapack_int* mm, lapack_int* m, double* work, lapack_int* info);
+void LAPACK_ctgevc(char* side, char* howmny, const lapack_logical* select, lapack_int* n, const lapack_complex_float* s,
+                   lapack_int* lds, const lapack_complex_float* p, lapack_int* ldp, lapack_complex_float* vl,
+                   lapack_int* ldvl, lapack_complex_float* vr, lapack_int* ldvr, lapack_int* mm, lapack_int* m,
+                   lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_ztgevc(char* side, char* howmny, const lapack_logical* select, lapack_int* n,
+                   const lapack_complex_double* s, lapack_int* lds, const lapack_complex_double* p, lapack_int* ldp,
+                   lapack_complex_double* vl, lapack_int* ldvl, lapack_complex_double* vr, lapack_int* ldvr,
+                   lapack_int* mm, lapack_int* m, lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_stgexc(lapack_logical* wantq, lapack_logical* wantz, lapack_int* n, float* a, lapack_int* lda, float* b,
+                   lapack_int* ldb, float* q, lapack_int* ldq, float* z, lapack_int* ldz, lapack_int* ifst,
+                   lapack_int* ilst, float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_dtgexc(lapack_logical* wantq, lapack_logical* wantz, lapack_int* n, double* a, lapack_int* lda, double* b,
+                   lapack_int* ldb, double* q, lapack_int* ldq, double* z, lapack_int* ldz, lapack_int* ifst,
+                   lapack_int* ilst, double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_ctgexc(lapack_logical* wantq, lapack_logical* wantz, lapack_int* n, lapack_complex_float* a,
+                   lapack_int* lda, lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* q, lapack_int* ldq,
+                   lapack_complex_float* z, lapack_int* ldz, lapack_int* ifst, lapack_int* ilst, lapack_int* info);
+void LAPACK_ztgexc(lapack_logical* wantq, lapack_logical* wantz, lapack_int* n, lapack_complex_double* a,
+                   lapack_int* lda, lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* q,
+                   lapack_int* ldq, lapack_complex_double* z, lapack_int* ldz, lapack_int* ifst, lapack_int* ilst,
+                   lapack_int* info);
+void LAPACK_stgsen(lapack_int* ijob, lapack_logical* wantq, lapack_logical* wantz, const lapack_logical* select,
+                   lapack_int* n, float* a, lapack_int* lda, float* b, lapack_int* ldb, float* alphar, float* alphai,
+                   float* beta, float* q, lapack_int* ldq, float* z, lapack_int* ldz, lapack_int* m, float* pl,
+                   float* pr, float* dif, float* work, lapack_int* lwork, lapack_int* iwork, lapack_int* liwork,
+                   lapack_int* info);
+void LAPACK_dtgsen(lapack_int* ijob, lapack_logical* wantq, lapack_logical* wantz, const lapack_logical* select,
+                   lapack_int* n, double* a, lapack_int* lda, double* b, lapack_int* ldb, double* alphar,
+                   double* alphai, double* beta, double* q, lapack_int* ldq, double* z, lapack_int* ldz, lapack_int* m,
+                   double* pl, double* pr, double* dif, double* work, lapack_int* lwork, lapack_int* iwork,
+                   lapack_int* liwork, lapack_int* info);
+void LAPACK_ctgsen(lapack_int* ijob, lapack_logical* wantq, lapack_logical* wantz, const lapack_logical* select,
+                   lapack_int* n, lapack_complex_float* a, lapack_int* lda, lapack_complex_float* b, lapack_int* ldb,
+                   lapack_complex_float* alpha, lapack_complex_float* beta, lapack_complex_float* q, lapack_int* ldq,
+                   lapack_complex_float* z, lapack_int* ldz, lapack_int* m, float* pl, float* pr, float* dif,
+                   lapack_complex_float* work, lapack_int* lwork, lapack_int* iwork, lapack_int* liwork,
+                   lapack_int* info);
+void LAPACK_ztgsen(lapack_int* ijob, lapack_logical* wantq, lapack_logical* wantz, const lapack_logical* select,
+                   lapack_int* n, lapack_complex_double* a, lapack_int* lda, lapack_complex_double* b, lapack_int* ldb,
+                   lapack_complex_double* alpha, lapack_complex_double* beta, lapack_complex_double* q, lapack_int* ldq,
+                   lapack_complex_double* z, lapack_int* ldz, lapack_int* m, double* pl, double* pr, double* dif,
+                   lapack_complex_double* work, lapack_int* lwork, lapack_int* iwork, lapack_int* liwork,
+                   lapack_int* info);
+void LAPACK_stgsyl(char* trans, lapack_int* ijob, lapack_int* m, lapack_int* n, const float* a, lapack_int* lda,
+                   const float* b, lapack_int* ldb, float* c, lapack_int* ldc, const float* d, lapack_int* ldd,
+                   const float* e, lapack_int* lde, float* f, lapack_int* ldf, float* scale, float* dif, float* work,
+                   lapack_int* lwork, lapack_int* iwork, lapack_int* info);
+void LAPACK_dtgsyl(char* trans, lapack_int* ijob, lapack_int* m, lapack_int* n, const double* a, lapack_int* lda,
+                   const double* b, lapack_int* ldb, double* c, lapack_int* ldc, const double* d, lapack_int* ldd,
+                   const double* e, lapack_int* lde, double* f, lapack_int* ldf, double* scale, double* dif,
+                   double* work, lapack_int* lwork, lapack_int* iwork, lapack_int* info);
+void LAPACK_ctgsyl(char* trans, lapack_int* ijob, lapack_int* m, lapack_int* n, const lapack_complex_float* a,
+                   lapack_int* lda, const lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* c,
+                   lapack_int* ldc, const lapack_complex_float* d, lapack_int* ldd, const lapack_complex_float* e,
+                   lapack_int* lde, lapack_complex_float* f, lapack_int* ldf, float* scale, float* dif,
+                   lapack_complex_float* work, lapack_int* lwork, lapack_int* iwork, lapack_int* info);
+void LAPACK_ztgsyl(char* trans, lapack_int* ijob, lapack_int* m, lapack_int* n, const lapack_complex_double* a,
+                   lapack_int* lda, const lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* c,
+                   lapack_int* ldc, const lapack_complex_double* d, lapack_int* ldd, const lapack_complex_double* e,
+                   lapack_int* lde, lapack_complex_double* f, lapack_int* ldf, double* scale, double* dif,
+                   lapack_complex_double* work, lapack_int* lwork, lapack_int* iwork, lapack_int* info);
+void LAPACK_stgsna(char* job, char* howmny, const lapack_logical* select, lapack_int* n, const float* a,
+                   lapack_int* lda, const float* b, lapack_int* ldb, const float* vl, lapack_int* ldvl, const float* vr,
+                   lapack_int* ldvr, float* s, float* dif, lapack_int* mm, lapack_int* m, float* work,
+                   lapack_int* lwork, lapack_int* iwork, lapack_int* info);
+void LAPACK_dtgsna(char* job, char* howmny, const lapack_logical* select, lapack_int* n, const double* a,
+                   lapack_int* lda, const double* b, lapack_int* ldb, const double* vl, lapack_int* ldvl,
+                   const double* vr, lapack_int* ldvr, double* s, double* dif, lapack_int* mm, lapack_int* m,
+                   double* work, lapack_int* lwork, lapack_int* iwork, lapack_int* info);
+void LAPACK_ctgsna(char* job, char* howmny, const lapack_logical* select, lapack_int* n, const lapack_complex_float* a,
+                   lapack_int* lda, const lapack_complex_float* b, lapack_int* ldb, const lapack_complex_float* vl,
+                   lapack_int* ldvl, const lapack_complex_float* vr, lapack_int* ldvr, float* s, float* dif,
+                   lapack_int* mm, lapack_int* m, lapack_complex_float* work, lapack_int* lwork, lapack_int* iwork,
+                   lapack_int* info);
+void LAPACK_ztgsna(char* job, char* howmny, const lapack_logical* select, lapack_int* n, const lapack_complex_double* a,
+                   lapack_int* lda, const lapack_complex_double* b, lapack_int* ldb, const lapack_complex_double* vl,
+                   lapack_int* ldvl, const lapack_complex_double* vr, lapack_int* ldvr, double* s, double* dif,
+                   lapack_int* mm, lapack_int* m, lapack_complex_double* work, lapack_int* lwork, lapack_int* iwork,
+                   lapack_int* info);
+void LAPACK_sggsvp(char* jobu, char* jobv, char* jobq, lapack_int* m, lapack_int* p, lapack_int* n, float* a,
+                   lapack_int* lda, float* b, lapack_int* ldb, float* tola, float* tolb, lapack_int* k, lapack_int* l,
+                   float* u, lapack_int* ldu, float* v, lapack_int* ldv, float* q, lapack_int* ldq, lapack_int* iwork,
+                   float* tau, float* work, lapack_int* info);
+void LAPACK_dggsvp(char* jobu, char* jobv, char* jobq, lapack_int* m, lapack_int* p, lapack_int* n, double* a,
+                   lapack_int* lda, double* b, lapack_int* ldb, double* tola, double* tolb, lapack_int* k,
+                   lapack_int* l, double* u, lapack_int* ldu, double* v, lapack_int* ldv, double* q, lapack_int* ldq,
+                   lapack_int* iwork, double* tau, double* work, lapack_int* info);
+void LAPACK_cggsvp(char* jobu, char* jobv, char* jobq, lapack_int* m, lapack_int* p, lapack_int* n,
+                   lapack_complex_float* a, lapack_int* lda, lapack_complex_float* b, lapack_int* ldb, float* tola,
+                   float* tolb, lapack_int* k, lapack_int* l, lapack_complex_float* u, lapack_int* ldu,
+                   lapack_complex_float* v, lapack_int* ldv, lapack_complex_float* q, lapack_int* ldq,
+                   lapack_int* iwork, float* rwork, lapack_complex_float* tau, lapack_complex_float* work,
+                   lapack_int* info);
+void LAPACK_zggsvp(char* jobu, char* jobv, char* jobq, lapack_int* m, lapack_int* p, lapack_int* n,
+                   lapack_complex_double* a, lapack_int* lda, lapack_complex_double* b, lapack_int* ldb, double* tola,
+                   double* tolb, lapack_int* k, lapack_int* l, lapack_complex_double* u, lapack_int* ldu,
+                   lapack_complex_double* v, lapack_int* ldv, lapack_complex_double* q, lapack_int* ldq,
+                   lapack_int* iwork, double* rwork, lapack_complex_double* tau, lapack_complex_double* work,
+                   lapack_int* info);
+void LAPACK_stgsja(char* jobu, char* jobv, char* jobq, lapack_int* m, lapack_int* p, lapack_int* n, lapack_int* k,
+                   lapack_int* l, float* a, lapack_int* lda, float* b, lapack_int* ldb, float* tola, float* tolb,
+                   float* alpha, float* beta, float* u, lapack_int* ldu, float* v, lapack_int* ldv, float* q,
+                   lapack_int* ldq, float* work, lapack_int* ncycle, lapack_int* info);
+void LAPACK_dtgsja(char* jobu, char* jobv, char* jobq, lapack_int* m, lapack_int* p, lapack_int* n, lapack_int* k,
+                   lapack_int* l, double* a, lapack_int* lda, double* b, lapack_int* ldb, double* tola, double* tolb,
+                   double* alpha, double* beta, double* u, lapack_int* ldu, double* v, lapack_int* ldv, double* q,
+                   lapack_int* ldq, double* work, lapack_int* ncycle, lapack_int* info);
+void LAPACK_ctgsja(char* jobu, char* jobv, char* jobq, lapack_int* m, lapack_int* p, lapack_int* n, lapack_int* k,
+                   lapack_int* l, lapack_complex_float* a, lapack_int* lda, lapack_complex_float* b, lapack_int* ldb,
+                   float* tola, float* tolb, float* alpha, float* beta, lapack_complex_float* u, lapack_int* ldu,
+                   lapack_complex_float* v, lapack_int* ldv, lapack_complex_float* q, lapack_int* ldq,
+                   lapack_complex_float* work, lapack_int* ncycle, lapack_int* info);
+void LAPACK_ztgsja(char* jobu, char* jobv, char* jobq, lapack_int* m, lapack_int* p, lapack_int* n, lapack_int* k,
+                   lapack_int* l, lapack_complex_double* a, lapack_int* lda, lapack_complex_double* b, lapack_int* ldb,
+                   double* tola, double* tolb, double* alpha, double* beta, lapack_complex_double* u, lapack_int* ldu,
+                   lapack_complex_double* v, lapack_int* ldv, lapack_complex_double* q, lapack_int* ldq,
+                   lapack_complex_double* work, lapack_int* ncycle, lapack_int* info);
+void LAPACK_sgels(char* trans, lapack_int* m, lapack_int* n, lapack_int* nrhs, float* a, lapack_int* lda, float* b,
+                  lapack_int* ldb, float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_dgels(char* trans, lapack_int* m, lapack_int* n, lapack_int* nrhs, double* a, lapack_int* lda, double* b,
+                  lapack_int* ldb, double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_cgels(char* trans, lapack_int* m, lapack_int* n, lapack_int* nrhs, lapack_complex_float* a, lapack_int* lda,
+                  lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* work, lapack_int* lwork,
+                  lapack_int* info);
+void LAPACK_zgels(char* trans, lapack_int* m, lapack_int* n, lapack_int* nrhs, lapack_complex_double* a,
+                  lapack_int* lda, lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* work,
+                  lapack_int* lwork, lapack_int* info);
+void LAPACK_sgelsy(lapack_int* m, lapack_int* n, lapack_int* nrhs, float* a, lapack_int* lda, float* b, lapack_int* ldb,
+                   lapack_int* jpvt, float* rcond, lapack_int* rank, float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_dgelsy(lapack_int* m, lapack_int* n, lapack_int* nrhs, double* a, lapack_int* lda, double* b,
+                   lapack_int* ldb, lapack_int* jpvt, double* rcond, lapack_int* rank, double* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_cgelsy(lapack_int* m, lapack_int* n, lapack_int* nrhs, lapack_complex_float* a, lapack_int* lda,
+                   lapack_complex_float* b, lapack_int* ldb, lapack_int* jpvt, float* rcond, lapack_int* rank,
+                   lapack_complex_float* work, lapack_int* lwork, float* rwork, lapack_int* info);
+void LAPACK_zgelsy(lapack_int* m, lapack_int* n, lapack_int* nrhs, lapack_complex_double* a, lapack_int* lda,
+                   lapack_complex_double* b, lapack_int* ldb, lapack_int* jpvt, double* rcond, lapack_int* rank,
+                   lapack_complex_double* work, lapack_int* lwork, double* rwork, lapack_int* info);
+void LAPACK_sgelss(lapack_int* m, lapack_int* n, lapack_int* nrhs, float* a, lapack_int* lda, float* b, lapack_int* ldb,
+                   float* s, float* rcond, lapack_int* rank, float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_dgelss(lapack_int* m, lapack_int* n, lapack_int* nrhs, double* a, lapack_int* lda, double* b,
+                   lapack_int* ldb, double* s, double* rcond, lapack_int* rank, double* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_cgelss(lapack_int* m, lapack_int* n, lapack_int* nrhs, lapack_complex_float* a, lapack_int* lda,
+                   lapack_complex_float* b, lapack_int* ldb, float* s, float* rcond, lapack_int* rank,
+                   lapack_complex_float* work, lapack_int* lwork, float* rwork, lapack_int* info);
+void LAPACK_zgelss(lapack_int* m, lapack_int* n, lapack_int* nrhs, lapack_complex_double* a, lapack_int* lda,
+                   lapack_complex_double* b, lapack_int* ldb, double* s, double* rcond, lapack_int* rank,
+                   lapack_complex_double* work, lapack_int* lwork, double* rwork, lapack_int* info);
+void LAPACK_sgelsd(lapack_int* m, lapack_int* n, lapack_int* nrhs, float* a, lapack_int* lda, float* b, lapack_int* ldb,
+                   float* s, float* rcond, lapack_int* rank, float* work, lapack_int* lwork, lapack_int* iwork,
+                   lapack_int* info);
+void LAPACK_dgelsd(lapack_int* m, lapack_int* n, lapack_int* nrhs, double* a, lapack_int* lda, double* b,
+                   lapack_int* ldb, double* s, double* rcond, lapack_int* rank, double* work, lapack_int* lwork,
+                   lapack_int* iwork, lapack_int* info);
+void LAPACK_cgelsd(lapack_int* m, lapack_int* n, lapack_int* nrhs, lapack_complex_float* a, lapack_int* lda,
+                   lapack_complex_float* b, lapack_int* ldb, float* s, float* rcond, lapack_int* rank,
+                   lapack_complex_float* work, lapack_int* lwork, float* rwork, lapack_int* iwork, lapack_int* info);
+void LAPACK_zgelsd(lapack_int* m, lapack_int* n, lapack_int* nrhs, lapack_complex_double* a, lapack_int* lda,
+                   lapack_complex_double* b, lapack_int* ldb, double* s, double* rcond, lapack_int* rank,
+                   lapack_complex_double* work, lapack_int* lwork, double* rwork, lapack_int* iwork, lapack_int* info);
+void LAPACK_sgglse(lapack_int* m, lapack_int* n, lapack_int* p, float* a, lapack_int* lda, float* b, lapack_int* ldb,
+                   float* c, float* d, float* x, float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_dgglse(lapack_int* m, lapack_int* n, lapack_int* p, double* a, lapack_int* lda, double* b, lapack_int* ldb,
+                   double* c, double* d, double* x, double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_cgglse(lapack_int* m, lapack_int* n, lapack_int* p, lapack_complex_float* a, lapack_int* lda,
+                   lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* c, lapack_complex_float* d,
+                   lapack_complex_float* x, lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zgglse(lapack_int* m, lapack_int* n, lapack_int* p, lapack_complex_double* a, lapack_int* lda,
+                   lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* c, lapack_complex_double* d,
+                   lapack_complex_double* x, lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_sggglm(lapack_int* n, lapack_int* m, lapack_int* p, float* a, lapack_int* lda, float* b, lapack_int* ldb,
+                   float* d, float* x, float* y, float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_dggglm(lapack_int* n, lapack_int* m, lapack_int* p, double* a, lapack_int* lda, double* b, lapack_int* ldb,
+                   double* d, double* x, double* y, double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_cggglm(lapack_int* n, lapack_int* m, lapack_int* p, lapack_complex_float* a, lapack_int* lda,
+                   lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* d, lapack_complex_float* x,
+                   lapack_complex_float* y, lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zggglm(lapack_int* n, lapack_int* m, lapack_int* p, lapack_complex_double* a, lapack_int* lda,
+                   lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* d, lapack_complex_double* x,
+                   lapack_complex_double* y, lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_ssyev(char* jobz, char* uplo, lapack_int* n, float* a, lapack_int* lda, float* w, float* work,
+                  lapack_int* lwork, lapack_int* info);
+void LAPACK_dsyev(char* jobz, char* uplo, lapack_int* n, double* a, lapack_int* lda, double* w, double* work,
+                  lapack_int* lwork, lapack_int* info);
+void LAPACK_cheev(char* jobz, char* uplo, lapack_int* n, lapack_complex_float* a, lapack_int* lda, float* w,
+                  lapack_complex_float* work, lapack_int* lwork, float* rwork, lapack_int* info);
+void LAPACK_zheev(char* jobz, char* uplo, lapack_int* n, lapack_complex_double* a, lapack_int* lda, double* w,
+                  lapack_complex_double* work, lapack_int* lwork, double* rwork, lapack_int* info);
+void LAPACK_ssyevd(char* jobz, char* uplo, lapack_int* n, float* a, lapack_int* lda, float* w, float* work,
+                   lapack_int* lwork, lapack_int* iwork, lapack_int* liwork, lapack_int* info);
+void LAPACK_dsyevd(char* jobz, char* uplo, lapack_int* n, double* a, lapack_int* lda, double* w, double* work,
+                   lapack_int* lwork, lapack_int* iwork, lapack_int* liwork, lapack_int* info);
+void LAPACK_cheevd(char* jobz, char* uplo, lapack_int* n, lapack_complex_float* a, lapack_int* lda, float* w,
+                   lapack_complex_float* work, lapack_int* lwork, float* rwork, lapack_int* lrwork, lapack_int* iwork,
+                   lapack_int* liwork, lapack_int* info);
+void LAPACK_zheevd(char* jobz, char* uplo, lapack_int* n, lapack_complex_double* a, lapack_int* lda, double* w,
+                   lapack_complex_double* work, lapack_int* lwork, double* rwork, lapack_int* lrwork, lapack_int* iwork,
+                   lapack_int* liwork, lapack_int* info);
+void LAPACK_ssyevx(char* jobz, char* range, char* uplo, lapack_int* n, float* a, lapack_int* lda, float* vl, float* vu,
+                   lapack_int* il, lapack_int* iu, float* abstol, lapack_int* m, float* w, float* z, lapack_int* ldz,
+                   float* work, lapack_int* lwork, lapack_int* iwork, lapack_int* ifail, lapack_int* info);
+void LAPACK_dsyevx(char* jobz, char* range, char* uplo, lapack_int* n, double* a, lapack_int* lda, double* vl,
+                   double* vu, lapack_int* il, lapack_int* iu, double* abstol, lapack_int* m, double* w, double* z,
+                   lapack_int* ldz, double* work, lapack_int* lwork, lapack_int* iwork, lapack_int* ifail,
+                   lapack_int* info);
+void LAPACK_cheevx(char* jobz, char* range, char* uplo, lapack_int* n, lapack_complex_float* a, lapack_int* lda,
+                   float* vl, float* vu, lapack_int* il, lapack_int* iu, float* abstol, lapack_int* m, float* w,
+                   lapack_complex_float* z, lapack_int* ldz, lapack_complex_float* work, lapack_int* lwork,
+                   float* rwork, lapack_int* iwork, lapack_int* ifail, lapack_int* info);
+void LAPACK_zheevx(char* jobz, char* range, char* uplo, lapack_int* n, lapack_complex_double* a, lapack_int* lda,
+                   double* vl, double* vu, lapack_int* il, lapack_int* iu, double* abstol, lapack_int* m, double* w,
+                   lapack_complex_double* z, lapack_int* ldz, lapack_complex_double* work, lapack_int* lwork,
+                   double* rwork, lapack_int* iwork, lapack_int* ifail, lapack_int* info);
+void LAPACK_ssyevr(char* jobz, char* range, char* uplo, lapack_int* n, float* a, lapack_int* lda, float* vl, float* vu,
+                   lapack_int* il, lapack_int* iu, float* abstol, lapack_int* m, float* w, float* z, lapack_int* ldz,
+                   lapack_int* isuppz, float* work, lapack_int* lwork, lapack_int* iwork, lapack_int* liwork,
+                   lapack_int* info);
+void LAPACK_dsyevr(char* jobz, char* range, char* uplo, lapack_int* n, double* a, lapack_int* lda, double* vl,
+                   double* vu, lapack_int* il, lapack_int* iu, double* abstol, lapack_int* m, double* w, double* z,
+                   lapack_int* ldz, lapack_int* isuppz, double* work, lapack_int* lwork, lapack_int* iwork,
+                   lapack_int* liwork, lapack_int* info);
+void LAPACK_cheevr(char* jobz, char* range, char* uplo, lapack_int* n, lapack_complex_float* a, lapack_int* lda,
+                   float* vl, float* vu, lapack_int* il, lapack_int* iu, float* abstol, lapack_int* m, float* w,
+                   lapack_complex_float* z, lapack_int* ldz, lapack_int* isuppz, lapack_complex_float* work,
+                   lapack_int* lwork, float* rwork, lapack_int* lrwork, lapack_int* iwork, lapack_int* liwork,
+                   lapack_int* info);
+void LAPACK_zheevr(char* jobz, char* range, char* uplo, lapack_int* n, lapack_complex_double* a, lapack_int* lda,
+                   double* vl, double* vu, lapack_int* il, lapack_int* iu, double* abstol, lapack_int* m, double* w,
+                   lapack_complex_double* z, lapack_int* ldz, lapack_int* isuppz, lapack_complex_double* work,
+                   lapack_int* lwork, double* rwork, lapack_int* lrwork, lapack_int* iwork, lapack_int* liwork,
+                   lapack_int* info);
+void LAPACK_sspev(char* jobz, char* uplo, lapack_int* n, float* ap, float* w, float* z, lapack_int* ldz, float* work,
+                  lapack_int* info);
+void LAPACK_dspev(char* jobz, char* uplo, lapack_int* n, double* ap, double* w, double* z, lapack_int* ldz,
+                  double* work, lapack_int* info);
+void LAPACK_chpev(char* jobz, char* uplo, lapack_int* n, lapack_complex_float* ap, float* w, lapack_complex_float* z,
+                  lapack_int* ldz, lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_zhpev(char* jobz, char* uplo, lapack_int* n, lapack_complex_double* ap, double* w, lapack_complex_double* z,
+                  lapack_int* ldz, lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_sspevd(char* jobz, char* uplo, lapack_int* n, float* ap, float* w, float* z, lapack_int* ldz, float* work,
+                   lapack_int* lwork, lapack_int* iwork, lapack_int* liwork, lapack_int* info);
+void LAPACK_dspevd(char* jobz, char* uplo, lapack_int* n, double* ap, double* w, double* z, lapack_int* ldz,
+                   double* work, lapack_int* lwork, lapack_int* iwork, lapack_int* liwork, lapack_int* info);
+void LAPACK_chpevd(char* jobz, char* uplo, lapack_int* n, lapack_complex_float* ap, float* w, lapack_complex_float* z,
+                   lapack_int* ldz, lapack_complex_float* work, lapack_int* lwork, float* rwork, lapack_int* lrwork,
+                   lapack_int* iwork, lapack_int* liwork, lapack_int* info);
+void LAPACK_zhpevd(char* jobz, char* uplo, lapack_int* n, lapack_complex_double* ap, double* w,
+                   lapack_complex_double* z, lapack_int* ldz, lapack_complex_double* work, lapack_int* lwork,
+                   double* rwork, lapack_int* lrwork, lapack_int* iwork, lapack_int* liwork, lapack_int* info);
+void LAPACK_sspevx(char* jobz, char* range, char* uplo, lapack_int* n, float* ap, float* vl, float* vu, lapack_int* il,
+                   lapack_int* iu, float* abstol, lapack_int* m, float* w, float* z, lapack_int* ldz, float* work,
+                   lapack_int* iwork, lapack_int* ifail, lapack_int* info);
+void LAPACK_dspevx(char* jobz, char* range, char* uplo, lapack_int* n, double* ap, double* vl, double* vu,
+                   lapack_int* il, lapack_int* iu, double* abstol, lapack_int* m, double* w, double* z, lapack_int* ldz,
+                   double* work, lapack_int* iwork, lapack_int* ifail, lapack_int* info);
+void LAPACK_chpevx(char* jobz, char* range, char* uplo, lapack_int* n, lapack_complex_float* ap, float* vl, float* vu,
+                   lapack_int* il, lapack_int* iu, float* abstol, lapack_int* m, float* w, lapack_complex_float* z,
+                   lapack_int* ldz, lapack_complex_float* work, float* rwork, lapack_int* iwork, lapack_int* ifail,
+                   lapack_int* info);
+void LAPACK_zhpevx(char* jobz, char* range, char* uplo, lapack_int* n, lapack_complex_double* ap, double* vl,
+                   double* vu, lapack_int* il, lapack_int* iu, double* abstol, lapack_int* m, double* w,
+                   lapack_complex_double* z, lapack_int* ldz, lapack_complex_double* work, double* rwork,
+                   lapack_int* iwork, lapack_int* ifail, lapack_int* info);
+void LAPACK_ssbev(char* jobz, char* uplo, lapack_int* n, lapack_int* kd, float* ab, lapack_int* ldab, float* w,
+                  float* z, lapack_int* ldz, float* work, lapack_int* info);
+void LAPACK_dsbev(char* jobz, char* uplo, lapack_int* n, lapack_int* kd, double* ab, lapack_int* ldab, double* w,
+                  double* z, lapack_int* ldz, double* work, lapack_int* info);
+void LAPACK_chbev(char* jobz, char* uplo, lapack_int* n, lapack_int* kd, lapack_complex_float* ab, lapack_int* ldab,
+                  float* w, lapack_complex_float* z, lapack_int* ldz, lapack_complex_float* work, float* rwork,
+                  lapack_int* info);
+void LAPACK_zhbev(char* jobz, char* uplo, lapack_int* n, lapack_int* kd, lapack_complex_double* ab, lapack_int* ldab,
+                  double* w, lapack_complex_double* z, lapack_int* ldz, lapack_complex_double* work, double* rwork,
+                  lapack_int* info);
+void LAPACK_ssbevd(char* jobz, char* uplo, lapack_int* n, lapack_int* kd, float* ab, lapack_int* ldab, float* w,
+                   float* z, lapack_int* ldz, float* work, lapack_int* lwork, lapack_int* iwork, lapack_int* liwork,
+                   lapack_int* info);
+void LAPACK_dsbevd(char* jobz, char* uplo, lapack_int* n, lapack_int* kd, double* ab, lapack_int* ldab, double* w,
+                   double* z, lapack_int* ldz, double* work, lapack_int* lwork, lapack_int* iwork, lapack_int* liwork,
+                   lapack_int* info);
+void LAPACK_chbevd(char* jobz, char* uplo, lapack_int* n, lapack_int* kd, lapack_complex_float* ab, lapack_int* ldab,
+                   float* w, lapack_complex_float* z, lapack_int* ldz, lapack_complex_float* work, lapack_int* lwork,
+                   float* rwork, lapack_int* lrwork, lapack_int* iwork, lapack_int* liwork, lapack_int* info);
+void LAPACK_zhbevd(char* jobz, char* uplo, lapack_int* n, lapack_int* kd, lapack_complex_double* ab, lapack_int* ldab,
+                   double* w, lapack_complex_double* z, lapack_int* ldz, lapack_complex_double* work, lapack_int* lwork,
+                   double* rwork, lapack_int* lrwork, lapack_int* iwork, lapack_int* liwork, lapack_int* info);
+void LAPACK_ssbevx(char* jobz, char* range, char* uplo, lapack_int* n, lapack_int* kd, float* ab, lapack_int* ldab,
+                   float* q, lapack_int* ldq, float* vl, float* vu, lapack_int* il, lapack_int* iu, float* abstol,
+                   lapack_int* m, float* w, float* z, lapack_int* ldz, float* work, lapack_int* iwork,
+                   lapack_int* ifail, lapack_int* info);
+void LAPACK_dsbevx(char* jobz, char* range, char* uplo, lapack_int* n, lapack_int* kd, double* ab, lapack_int* ldab,
+                   double* q, lapack_int* ldq, double* vl, double* vu, lapack_int* il, lapack_int* iu, double* abstol,
+                   lapack_int* m, double* w, double* z, lapack_int* ldz, double* work, lapack_int* iwork,
+                   lapack_int* ifail, lapack_int* info);
+void LAPACK_chbevx(char* jobz, char* range, char* uplo, lapack_int* n, lapack_int* kd, lapack_complex_float* ab,
+                   lapack_int* ldab, lapack_complex_float* q, lapack_int* ldq, float* vl, float* vu, lapack_int* il,
+                   lapack_int* iu, float* abstol, lapack_int* m, float* w, lapack_complex_float* z, lapack_int* ldz,
+                   lapack_complex_float* work, float* rwork, lapack_int* iwork, lapack_int* ifail, lapack_int* info);
+void LAPACK_zhbevx(char* jobz, char* range, char* uplo, lapack_int* n, lapack_int* kd, lapack_complex_double* ab,
+                   lapack_int* ldab, lapack_complex_double* q, lapack_int* ldq, double* vl, double* vu, lapack_int* il,
+                   lapack_int* iu, double* abstol, lapack_int* m, double* w, lapack_complex_double* z, lapack_int* ldz,
+                   lapack_complex_double* work, double* rwork, lapack_int* iwork, lapack_int* ifail, lapack_int* info);
+void LAPACK_sstev(char* jobz, lapack_int* n, float* d, float* e, float* z, lapack_int* ldz, float* work,
+                  lapack_int* info);
+void LAPACK_dstev(char* jobz, lapack_int* n, double* d, double* e, double* z, lapack_int* ldz, double* work,
+                  lapack_int* info);
+void LAPACK_sstevd(char* jobz, lapack_int* n, float* d, float* e, float* z, lapack_int* ldz, float* work,
+                   lapack_int* lwork, lapack_int* iwork, lapack_int* liwork, lapack_int* info);
+void LAPACK_dstevd(char* jobz, lapack_int* n, double* d, double* e, double* z, lapack_int* ldz, double* work,
+                   lapack_int* lwork, lapack_int* iwork, lapack_int* liwork, lapack_int* info);
+void LAPACK_sstevx(char* jobz, char* range, lapack_int* n, float* d, float* e, float* vl, float* vu, lapack_int* il,
+                   lapack_int* iu, float* abstol, lapack_int* m, float* w, float* z, lapack_int* ldz, float* work,
+                   lapack_int* iwork, lapack_int* ifail, lapack_int* info);
+void LAPACK_dstevx(char* jobz, char* range, lapack_int* n, double* d, double* e, double* vl, double* vu, lapack_int* il,
+                   lapack_int* iu, double* abstol, lapack_int* m, double* w, double* z, lapack_int* ldz, double* work,
+                   lapack_int* iwork, lapack_int* ifail, lapack_int* info);
+void LAPACK_sstevr(char* jobz, char* range, lapack_int* n, float* d, float* e, float* vl, float* vu, lapack_int* il,
+                   lapack_int* iu, float* abstol, lapack_int* m, float* w, float* z, lapack_int* ldz,
+                   lapack_int* isuppz, float* work, lapack_int* lwork, lapack_int* iwork, lapack_int* liwork,
+                   lapack_int* info);
+void LAPACK_dstevr(char* jobz, char* range, lapack_int* n, double* d, double* e, double* vl, double* vu, lapack_int* il,
+                   lapack_int* iu, double* abstol, lapack_int* m, double* w, double* z, lapack_int* ldz,
+                   lapack_int* isuppz, double* work, lapack_int* lwork, lapack_int* iwork, lapack_int* liwork,
+                   lapack_int* info);
+void LAPACK_sgees(char* jobvs, char* sort, LAPACK_S_SELECT2 select, lapack_int* n, float* a, lapack_int* lda,
+                  lapack_int* sdim, float* wr, float* wi, float* vs, lapack_int* ldvs, float* work, lapack_int* lwork,
+                  lapack_logical* bwork, lapack_int* info);
+void LAPACK_dgees(char* jobvs, char* sort, LAPACK_D_SELECT2 select, lapack_int* n, double* a, lapack_int* lda,
+                  lapack_int* sdim, double* wr, double* wi, double* vs, lapack_int* ldvs, double* work,
+                  lapack_int* lwork, lapack_logical* bwork, lapack_int* info);
+void LAPACK_cgees(char* jobvs, char* sort, LAPACK_C_SELECT1 select, lapack_int* n, lapack_complex_float* a,
+                  lapack_int* lda, lapack_int* sdim, lapack_complex_float* w, lapack_complex_float* vs,
+                  lapack_int* ldvs, lapack_complex_float* work, lapack_int* lwork, float* rwork, lapack_logical* bwork,
+                  lapack_int* info);
+void LAPACK_zgees(char* jobvs, char* sort, LAPACK_Z_SELECT1 select, lapack_int* n, lapack_complex_double* a,
+                  lapack_int* lda, lapack_int* sdim, lapack_complex_double* w, lapack_complex_double* vs,
+                  lapack_int* ldvs, lapack_complex_double* work, lapack_int* lwork, double* rwork,
+                  lapack_logical* bwork, lapack_int* info);
+void LAPACK_sgeesx(char* jobvs, char* sort, LAPACK_S_SELECT2 select, char* sense, lapack_int* n, float* a,
+                   lapack_int* lda, lapack_int* sdim, float* wr, float* wi, float* vs, lapack_int* ldvs, float* rconde,
+                   float* rcondv, float* work, lapack_int* lwork, lapack_int* iwork, lapack_int* liwork,
+                   lapack_logical* bwork, lapack_int* info);
+void LAPACK_dgeesx(char* jobvs, char* sort, LAPACK_D_SELECT2 select, char* sense, lapack_int* n, double* a,
+                   lapack_int* lda, lapack_int* sdim, double* wr, double* wi, double* vs, lapack_int* ldvs,
+                   double* rconde, double* rcondv, double* work, lapack_int* lwork, lapack_int* iwork,
+                   lapack_int* liwork, lapack_logical* bwork, lapack_int* info);
+void LAPACK_cgeesx(char* jobvs, char* sort, LAPACK_C_SELECT1 select, char* sense, lapack_int* n,
+                   lapack_complex_float* a, lapack_int* lda, lapack_int* sdim, lapack_complex_float* w,
+                   lapack_complex_float* vs, lapack_int* ldvs, float* rconde, float* rcondv, lapack_complex_float* work,
+                   lapack_int* lwork, float* rwork, lapack_logical* bwork, lapack_int* info);
+void LAPACK_zgeesx(char* jobvs, char* sort, LAPACK_Z_SELECT1 select, char* sense, lapack_int* n,
+                   lapack_complex_double* a, lapack_int* lda, lapack_int* sdim, lapack_complex_double* w,
+                   lapack_complex_double* vs, lapack_int* ldvs, double* rconde, double* rcondv,
+                   lapack_complex_double* work, lapack_int* lwork, double* rwork, lapack_logical* bwork,
+                   lapack_int* info);
+void LAPACK_sgeev(char* jobvl, char* jobvr, lapack_int* n, float* a, lapack_int* lda, float* wr, float* wi, float* vl,
+                  lapack_int* ldvl, float* vr, lapack_int* ldvr, float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_dgeev(char* jobvl, char* jobvr, lapack_int* n, double* a, lapack_int* lda, double* wr, double* wi,
+                  double* vl, lapack_int* ldvl, double* vr, lapack_int* ldvr, double* work, lapack_int* lwork,
+                  lapack_int* info);
+void LAPACK_cgeev(char* jobvl, char* jobvr, lapack_int* n, lapack_complex_float* a, lapack_int* lda,
+                  lapack_complex_float* w, lapack_complex_float* vl, lapack_int* ldvl, lapack_complex_float* vr,
+                  lapack_int* ldvr, lapack_complex_float* work, lapack_int* lwork, float* rwork, lapack_int* info);
+void LAPACK_zgeev(char* jobvl, char* jobvr, lapack_int* n, lapack_complex_double* a, lapack_int* lda,
+                  lapack_complex_double* w, lapack_complex_double* vl, lapack_int* ldvl, lapack_complex_double* vr,
+                  lapack_int* ldvr, lapack_complex_double* work, lapack_int* lwork, double* rwork, lapack_int* info);
+void LAPACK_sgeevx(char* balanc, char* jobvl, char* jobvr, char* sense, lapack_int* n, float* a, lapack_int* lda,
+                   float* wr, float* wi, float* vl, lapack_int* ldvl, float* vr, lapack_int* ldvr, lapack_int* ilo,
+                   lapack_int* ihi, float* scale, float* abnrm, float* rconde, float* rcondv, float* work,
+                   lapack_int* lwork, lapack_int* iwork, lapack_int* info);
+void LAPACK_dgeevx(char* balanc, char* jobvl, char* jobvr, char* sense, lapack_int* n, double* a, lapack_int* lda,
+                   double* wr, double* wi, double* vl, lapack_int* ldvl, double* vr, lapack_int* ldvr, lapack_int* ilo,
+                   lapack_int* ihi, double* scale, double* abnrm, double* rconde, double* rcondv, double* work,
+                   lapack_int* lwork, lapack_int* iwork, lapack_int* info);
+void LAPACK_cgeevx(char* balanc, char* jobvl, char* jobvr, char* sense, lapack_int* n, lapack_complex_float* a,
+                   lapack_int* lda, lapack_complex_float* w, lapack_complex_float* vl, lapack_int* ldvl,
+                   lapack_complex_float* vr, lapack_int* ldvr, lapack_int* ilo, lapack_int* ihi, float* scale,
+                   float* abnrm, float* rconde, float* rcondv, lapack_complex_float* work, lapack_int* lwork,
+                   float* rwork, lapack_int* info);
+void LAPACK_zgeevx(char* balanc, char* jobvl, char* jobvr, char* sense, lapack_int* n, lapack_complex_double* a,
+                   lapack_int* lda, lapack_complex_double* w, lapack_complex_double* vl, lapack_int* ldvl,
+                   lapack_complex_double* vr, lapack_int* ldvr, lapack_int* ilo, lapack_int* ihi, double* scale,
+                   double* abnrm, double* rconde, double* rcondv, lapack_complex_double* work, lapack_int* lwork,
+                   double* rwork, lapack_int* info);
+void LAPACK_sgesvd(char* jobu, char* jobvt, lapack_int* m, lapack_int* n, float* a, lapack_int* lda, float* s, float* u,
+                   lapack_int* ldu, float* vt, lapack_int* ldvt, float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_dgesvd(char* jobu, char* jobvt, lapack_int* m, lapack_int* n, double* a, lapack_int* lda, double* s,
+                   double* u, lapack_int* ldu, double* vt, lapack_int* ldvt, double* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_cgesvd(char* jobu, char* jobvt, lapack_int* m, lapack_int* n, lapack_complex_float* a, lapack_int* lda,
+                   float* s, lapack_complex_float* u, lapack_int* ldu, lapack_complex_float* vt, lapack_int* ldvt,
+                   lapack_complex_float* work, lapack_int* lwork, float* rwork, lapack_int* info);
+void LAPACK_zgesvd(char* jobu, char* jobvt, lapack_int* m, lapack_int* n, lapack_complex_double* a, lapack_int* lda,
+                   double* s, lapack_complex_double* u, lapack_int* ldu, lapack_complex_double* vt, lapack_int* ldvt,
+                   lapack_complex_double* work, lapack_int* lwork, double* rwork, lapack_int* info);
+void LAPACK_sgesdd(char* jobz, lapack_int* m, lapack_int* n, float* a, lapack_int* lda, float* s, float* u,
+                   lapack_int* ldu, float* vt, lapack_int* ldvt, float* work, lapack_int* lwork, lapack_int* iwork,
+                   lapack_int* info);
+void LAPACK_dgesdd(char* jobz, lapack_int* m, lapack_int* n, double* a, lapack_int* lda, double* s, double* u,
+                   lapack_int* ldu, double* vt, lapack_int* ldvt, double* work, lapack_int* lwork, lapack_int* iwork,
+                   lapack_int* info);
+void LAPACK_cgesdd(char* jobz, lapack_int* m, lapack_int* n, lapack_complex_float* a, lapack_int* lda, float* s,
+                   lapack_complex_float* u, lapack_int* ldu, lapack_complex_float* vt, lapack_int* ldvt,
+                   lapack_complex_float* work, lapack_int* lwork, float* rwork, lapack_int* iwork, lapack_int* info);
+void LAPACK_zgesdd(char* jobz, lapack_int* m, lapack_int* n, lapack_complex_double* a, lapack_int* lda, double* s,
+                   lapack_complex_double* u, lapack_int* ldu, lapack_complex_double* vt, lapack_int* ldvt,
+                   lapack_complex_double* work, lapack_int* lwork, double* rwork, lapack_int* iwork, lapack_int* info);
+void LAPACK_dgejsv(char* joba, char* jobu, char* jobv, char* jobr, char* jobt, char* jobp, lapack_int* m, lapack_int* n,
+                   double* a, lapack_int* lda, double* sva, double* u, lapack_int* ldu, double* v, lapack_int* ldv,
+                   double* work, lapack_int* lwork, lapack_int* iwork, lapack_int* info);
+void LAPACK_sgejsv(char* joba, char* jobu, char* jobv, char* jobr, char* jobt, char* jobp, lapack_int* m, lapack_int* n,
+                   float* a, lapack_int* lda, float* sva, float* u, lapack_int* ldu, float* v, lapack_int* ldv,
+                   float* work, lapack_int* lwork, lapack_int* iwork, lapack_int* info);
+void LAPACK_dgesvj(char* joba, char* jobu, char* jobv, lapack_int* m, lapack_int* n, double* a, lapack_int* lda,
+                   double* sva, lapack_int* mv, double* v, lapack_int* ldv, double* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_sgesvj(char* joba, char* jobu, char* jobv, lapack_int* m, lapack_int* n, float* a, lapack_int* lda,
+                   float* sva, lapack_int* mv, float* v, lapack_int* ldv, float* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_sggsvd(char* jobu, char* jobv, char* jobq, lapack_int* m, lapack_int* n, lapack_int* p, lapack_int* k,
+                   lapack_int* l, float* a, lapack_int* lda, float* b, lapack_int* ldb, float* alpha, float* beta,
+                   float* u, lapack_int* ldu, float* v, lapack_int* ldv, float* q, lapack_int* ldq, float* work,
+                   lapack_int* iwork, lapack_int* info);
+void LAPACK_dggsvd(char* jobu, char* jobv, char* jobq, lapack_int* m, lapack_int* n, lapack_int* p, lapack_int* k,
+                   lapack_int* l, double* a, lapack_int* lda, double* b, lapack_int* ldb, double* alpha, double* beta,
+                   double* u, lapack_int* ldu, double* v, lapack_int* ldv, double* q, lapack_int* ldq, double* work,
+                   lapack_int* iwork, lapack_int* info);
+void LAPACK_cggsvd(char* jobu, char* jobv, char* jobq, lapack_int* m, lapack_int* n, lapack_int* p, lapack_int* k,
+                   lapack_int* l, lapack_complex_float* a, lapack_int* lda, lapack_complex_float* b, lapack_int* ldb,
+                   float* alpha, float* beta, lapack_complex_float* u, lapack_int* ldu, lapack_complex_float* v,
+                   lapack_int* ldv, lapack_complex_float* q, lapack_int* ldq, lapack_complex_float* work, float* rwork,
+                   lapack_int* iwork, lapack_int* info);
+void LAPACK_zggsvd(char* jobu, char* jobv, char* jobq, lapack_int* m, lapack_int* n, lapack_int* p, lapack_int* k,
+                   lapack_int* l, lapack_complex_double* a, lapack_int* lda, lapack_complex_double* b, lapack_int* ldb,
+                   double* alpha, double* beta, lapack_complex_double* u, lapack_int* ldu, lapack_complex_double* v,
+                   lapack_int* ldv, lapack_complex_double* q, lapack_int* ldq, lapack_complex_double* work,
+                   double* rwork, lapack_int* iwork, lapack_int* info);
+void LAPACK_ssygv(lapack_int* itype, char* jobz, char* uplo, lapack_int* n, float* a, lapack_int* lda, float* b,
+                  lapack_int* ldb, float* w, float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_dsygv(lapack_int* itype, char* jobz, char* uplo, lapack_int* n, double* a, lapack_int* lda, double* b,
+                  lapack_int* ldb, double* w, double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_chegv(lapack_int* itype, char* jobz, char* uplo, lapack_int* n, lapack_complex_float* a, lapack_int* lda,
+                  lapack_complex_float* b, lapack_int* ldb, float* w, lapack_complex_float* work, lapack_int* lwork,
+                  float* rwork, lapack_int* info);
+void LAPACK_zhegv(lapack_int* itype, char* jobz, char* uplo, lapack_int* n, lapack_complex_double* a, lapack_int* lda,
+                  lapack_complex_double* b, lapack_int* ldb, double* w, lapack_complex_double* work, lapack_int* lwork,
+                  double* rwork, lapack_int* info);
+void LAPACK_ssygvd(lapack_int* itype, char* jobz, char* uplo, lapack_int* n, float* a, lapack_int* lda, float* b,
+                   lapack_int* ldb, float* w, float* work, lapack_int* lwork, lapack_int* iwork, lapack_int* liwork,
+                   lapack_int* info);
+void LAPACK_dsygvd(lapack_int* itype, char* jobz, char* uplo, lapack_int* n, double* a, lapack_int* lda, double* b,
+                   lapack_int* ldb, double* w, double* work, lapack_int* lwork, lapack_int* iwork, lapack_int* liwork,
+                   lapack_int* info);
+void LAPACK_chegvd(lapack_int* itype, char* jobz, char* uplo, lapack_int* n, lapack_complex_float* a, lapack_int* lda,
+                   lapack_complex_float* b, lapack_int* ldb, float* w, lapack_complex_float* work, lapack_int* lwork,
+                   float* rwork, lapack_int* lrwork, lapack_int* iwork, lapack_int* liwork, lapack_int* info);
+void LAPACK_zhegvd(lapack_int* itype, char* jobz, char* uplo, lapack_int* n, lapack_complex_double* a, lapack_int* lda,
+                   lapack_complex_double* b, lapack_int* ldb, double* w, lapack_complex_double* work, lapack_int* lwork,
+                   double* rwork, lapack_int* lrwork, lapack_int* iwork, lapack_int* liwork, lapack_int* info);
+void LAPACK_ssygvx(lapack_int* itype, char* jobz, char* range, char* uplo, lapack_int* n, float* a, lapack_int* lda,
+                   float* b, lapack_int* ldb, float* vl, float* vu, lapack_int* il, lapack_int* iu, float* abstol,
+                   lapack_int* m, float* w, float* z, lapack_int* ldz, float* work, lapack_int* lwork,
+                   lapack_int* iwork, lapack_int* ifail, lapack_int* info);
+void LAPACK_dsygvx(lapack_int* itype, char* jobz, char* range, char* uplo, lapack_int* n, double* a, lapack_int* lda,
+                   double* b, lapack_int* ldb, double* vl, double* vu, lapack_int* il, lapack_int* iu, double* abstol,
+                   lapack_int* m, double* w, double* z, lapack_int* ldz, double* work, lapack_int* lwork,
+                   lapack_int* iwork, lapack_int* ifail, lapack_int* info);
+void LAPACK_chegvx(lapack_int* itype, char* jobz, char* range, char* uplo, lapack_int* n, lapack_complex_float* a,
+                   lapack_int* lda, lapack_complex_float* b, lapack_int* ldb, float* vl, float* vu, lapack_int* il,
+                   lapack_int* iu, float* abstol, lapack_int* m, float* w, lapack_complex_float* z, lapack_int* ldz,
+                   lapack_complex_float* work, lapack_int* lwork, float* rwork, lapack_int* iwork, lapack_int* ifail,
+                   lapack_int* info);
+void LAPACK_zhegvx(lapack_int* itype, char* jobz, char* range, char* uplo, lapack_int* n, lapack_complex_double* a,
+                   lapack_int* lda, lapack_complex_double* b, lapack_int* ldb, double* vl, double* vu, lapack_int* il,
+                   lapack_int* iu, double* abstol, lapack_int* m, double* w, lapack_complex_double* z, lapack_int* ldz,
+                   lapack_complex_double* work, lapack_int* lwork, double* rwork, lapack_int* iwork, lapack_int* ifail,
+                   lapack_int* info);
+void LAPACK_sspgv(lapack_int* itype, char* jobz, char* uplo, lapack_int* n, float* ap, float* bp, float* w, float* z,
+                  lapack_int* ldz, float* work, lapack_int* info);
+void LAPACK_dspgv(lapack_int* itype, char* jobz, char* uplo, lapack_int* n, double* ap, double* bp, double* w,
+                  double* z, lapack_int* ldz, double* work, lapack_int* info);
+void LAPACK_chpgv(lapack_int* itype, char* jobz, char* uplo, lapack_int* n, lapack_complex_float* ap,
+                  lapack_complex_float* bp, float* w, lapack_complex_float* z, lapack_int* ldz,
+                  lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_zhpgv(lapack_int* itype, char* jobz, char* uplo, lapack_int* n, lapack_complex_double* ap,
+                  lapack_complex_double* bp, double* w, lapack_complex_double* z, lapack_int* ldz,
+                  lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_sspgvd(lapack_int* itype, char* jobz, char* uplo, lapack_int* n, float* ap, float* bp, float* w, float* z,
+                   lapack_int* ldz, float* work, lapack_int* lwork, lapack_int* iwork, lapack_int* liwork,
+                   lapack_int* info);
+void LAPACK_dspgvd(lapack_int* itype, char* jobz, char* uplo, lapack_int* n, double* ap, double* bp, double* w,
+                   double* z, lapack_int* ldz, double* work, lapack_int* lwork, lapack_int* iwork, lapack_int* liwork,
+                   lapack_int* info);
+void LAPACK_chpgvd(lapack_int* itype, char* jobz, char* uplo, lapack_int* n, lapack_complex_float* ap,
+                   lapack_complex_float* bp, float* w, lapack_complex_float* z, lapack_int* ldz,
+                   lapack_complex_float* work, lapack_int* lwork, float* rwork, lapack_int* lrwork, lapack_int* iwork,
+                   lapack_int* liwork, lapack_int* info);
+void LAPACK_zhpgvd(lapack_int* itype, char* jobz, char* uplo, lapack_int* n, lapack_complex_double* ap,
+                   lapack_complex_double* bp, double* w, lapack_complex_double* z, lapack_int* ldz,
+                   lapack_complex_double* work, lapack_int* lwork, double* rwork, lapack_int* lrwork, lapack_int* iwork,
+                   lapack_int* liwork, lapack_int* info);
+void LAPACK_sspgvx(lapack_int* itype, char* jobz, char* range, char* uplo, lapack_int* n, float* ap, float* bp,
+                   float* vl, float* vu, lapack_int* il, lapack_int* iu, float* abstol, lapack_int* m, float* w,
+                   float* z, lapack_int* ldz, float* work, lapack_int* iwork, lapack_int* ifail, lapack_int* info);
+void LAPACK_dspgvx(lapack_int* itype, char* jobz, char* range, char* uplo, lapack_int* n, double* ap, double* bp,
+                   double* vl, double* vu, lapack_int* il, lapack_int* iu, double* abstol, lapack_int* m, double* w,
+                   double* z, lapack_int* ldz, double* work, lapack_int* iwork, lapack_int* ifail, lapack_int* info);
+void LAPACK_chpgvx(lapack_int* itype, char* jobz, char* range, char* uplo, lapack_int* n, lapack_complex_float* ap,
+                   lapack_complex_float* bp, float* vl, float* vu, lapack_int* il, lapack_int* iu, float* abstol,
+                   lapack_int* m, float* w, lapack_complex_float* z, lapack_int* ldz, lapack_complex_float* work,
+                   float* rwork, lapack_int* iwork, lapack_int* ifail, lapack_int* info);
+void LAPACK_zhpgvx(lapack_int* itype, char* jobz, char* range, char* uplo, lapack_int* n, lapack_complex_double* ap,
+                   lapack_complex_double* bp, double* vl, double* vu, lapack_int* il, lapack_int* iu, double* abstol,
+                   lapack_int* m, double* w, lapack_complex_double* z, lapack_int* ldz, lapack_complex_double* work,
+                   double* rwork, lapack_int* iwork, lapack_int* ifail, lapack_int* info);
+void LAPACK_ssbgv(char* jobz, char* uplo, lapack_int* n, lapack_int* ka, lapack_int* kb, float* ab, lapack_int* ldab,
+                  float* bb, lapack_int* ldbb, float* w, float* z, lapack_int* ldz, float* work, lapack_int* info);
+void LAPACK_dsbgv(char* jobz, char* uplo, lapack_int* n, lapack_int* ka, lapack_int* kb, double* ab, lapack_int* ldab,
+                  double* bb, lapack_int* ldbb, double* w, double* z, lapack_int* ldz, double* work, lapack_int* info);
+void LAPACK_chbgv(char* jobz, char* uplo, lapack_int* n, lapack_int* ka, lapack_int* kb, lapack_complex_float* ab,
+                  lapack_int* ldab, lapack_complex_float* bb, lapack_int* ldbb, float* w, lapack_complex_float* z,
+                  lapack_int* ldz, lapack_complex_float* work, float* rwork, lapack_int* info);
+void LAPACK_zhbgv(char* jobz, char* uplo, lapack_int* n, lapack_int* ka, lapack_int* kb, lapack_complex_double* ab,
+                  lapack_int* ldab, lapack_complex_double* bb, lapack_int* ldbb, double* w, lapack_complex_double* z,
+                  lapack_int* ldz, lapack_complex_double* work, double* rwork, lapack_int* info);
+void LAPACK_ssbgvd(char* jobz, char* uplo, lapack_int* n, lapack_int* ka, lapack_int* kb, float* ab, lapack_int* ldab,
+                   float* bb, lapack_int* ldbb, float* w, float* z, lapack_int* ldz, float* work, lapack_int* lwork,
+                   lapack_int* iwork, lapack_int* liwork, lapack_int* info);
+void LAPACK_dsbgvd(char* jobz, char* uplo, lapack_int* n, lapack_int* ka, lapack_int* kb, double* ab, lapack_int* ldab,
+                   double* bb, lapack_int* ldbb, double* w, double* z, lapack_int* ldz, double* work, lapack_int* lwork,
+                   lapack_int* iwork, lapack_int* liwork, lapack_int* info);
+void LAPACK_chbgvd(char* jobz, char* uplo, lapack_int* n, lapack_int* ka, lapack_int* kb, lapack_complex_float* ab,
+                   lapack_int* ldab, lapack_complex_float* bb, lapack_int* ldbb, float* w, lapack_complex_float* z,
+                   lapack_int* ldz, lapack_complex_float* work, lapack_int* lwork, float* rwork, lapack_int* lrwork,
+                   lapack_int* iwork, lapack_int* liwork, lapack_int* info);
+void LAPACK_zhbgvd(char* jobz, char* uplo, lapack_int* n, lapack_int* ka, lapack_int* kb, lapack_complex_double* ab,
+                   lapack_int* ldab, lapack_complex_double* bb, lapack_int* ldbb, double* w, lapack_complex_double* z,
+                   lapack_int* ldz, lapack_complex_double* work, lapack_int* lwork, double* rwork, lapack_int* lrwork,
+                   lapack_int* iwork, lapack_int* liwork, lapack_int* info);
+void LAPACK_ssbgvx(char* jobz, char* range, char* uplo, lapack_int* n, lapack_int* ka, lapack_int* kb, float* ab,
+                   lapack_int* ldab, float* bb, lapack_int* ldbb, float* q, lapack_int* ldq, float* vl, float* vu,
+                   lapack_int* il, lapack_int* iu, float* abstol, lapack_int* m, float* w, float* z, lapack_int* ldz,
+                   float* work, lapack_int* iwork, lapack_int* ifail, lapack_int* info);
+void LAPACK_dsbgvx(char* jobz, char* range, char* uplo, lapack_int* n, lapack_int* ka, lapack_int* kb, double* ab,
+                   lapack_int* ldab, double* bb, lapack_int* ldbb, double* q, lapack_int* ldq, double* vl, double* vu,
+                   lapack_int* il, lapack_int* iu, double* abstol, lapack_int* m, double* w, double* z, lapack_int* ldz,
+                   double* work, lapack_int* iwork, lapack_int* ifail, lapack_int* info);
+void LAPACK_chbgvx(char* jobz, char* range, char* uplo, lapack_int* n, lapack_int* ka, lapack_int* kb,
+                   lapack_complex_float* ab, lapack_int* ldab, lapack_complex_float* bb, lapack_int* ldbb,
+                   lapack_complex_float* q, lapack_int* ldq, float* vl, float* vu, lapack_int* il, lapack_int* iu,
+                   float* abstol, lapack_int* m, float* w, lapack_complex_float* z, lapack_int* ldz,
+                   lapack_complex_float* work, float* rwork, lapack_int* iwork, lapack_int* ifail, lapack_int* info);
+void LAPACK_zhbgvx(char* jobz, char* range, char* uplo, lapack_int* n, lapack_int* ka, lapack_int* kb,
+                   lapack_complex_double* ab, lapack_int* ldab, lapack_complex_double* bb, lapack_int* ldbb,
+                   lapack_complex_double* q, lapack_int* ldq, double* vl, double* vu, lapack_int* il, lapack_int* iu,
+                   double* abstol, lapack_int* m, double* w, lapack_complex_double* z, lapack_int* ldz,
+                   lapack_complex_double* work, double* rwork, lapack_int* iwork, lapack_int* ifail, lapack_int* info);
+void LAPACK_sgges(char* jobvsl, char* jobvsr, char* sort, LAPACK_S_SELECT3 selctg, lapack_int* n, float* a,
+                  lapack_int* lda, float* b, lapack_int* ldb, lapack_int* sdim, float* alphar, float* alphai,
+                  float* beta, float* vsl, lapack_int* ldvsl, float* vsr, lapack_int* ldvsr, float* work,
+                  lapack_int* lwork, lapack_logical* bwork, lapack_int* info);
+void LAPACK_dgges(char* jobvsl, char* jobvsr, char* sort, LAPACK_D_SELECT3 selctg, lapack_int* n, double* a,
+                  lapack_int* lda, double* b, lapack_int* ldb, lapack_int* sdim, double* alphar, double* alphai,
+                  double* beta, double* vsl, lapack_int* ldvsl, double* vsr, lapack_int* ldvsr, double* work,
+                  lapack_int* lwork, lapack_logical* bwork, lapack_int* info);
+void LAPACK_cgges(char* jobvsl, char* jobvsr, char* sort, LAPACK_C_SELECT2 selctg, lapack_int* n,
+                  lapack_complex_float* a, lapack_int* lda, lapack_complex_float* b, lapack_int* ldb, lapack_int* sdim,
+                  lapack_complex_float* alpha, lapack_complex_float* beta, lapack_complex_float* vsl, lapack_int* ldvsl,
+                  lapack_complex_float* vsr, lapack_int* ldvsr, lapack_complex_float* work, lapack_int* lwork,
+                  float* rwork, lapack_logical* bwork, lapack_int* info);
+void LAPACK_zgges(char* jobvsl, char* jobvsr, char* sort, LAPACK_Z_SELECT2 selctg, lapack_int* n,
+                  lapack_complex_double* a, lapack_int* lda, lapack_complex_double* b, lapack_int* ldb,
+                  lapack_int* sdim, lapack_complex_double* alpha, lapack_complex_double* beta,
+                  lapack_complex_double* vsl, lapack_int* ldvsl, lapack_complex_double* vsr, lapack_int* ldvsr,
+                  lapack_complex_double* work, lapack_int* lwork, double* rwork, lapack_logical* bwork,
+                  lapack_int* info);
+void LAPACK_sggesx(char* jobvsl, char* jobvsr, char* sort, LAPACK_S_SELECT3 selctg, char* sense, lapack_int* n,
+                   float* a, lapack_int* lda, float* b, lapack_int* ldb, lapack_int* sdim, float* alphar, float* alphai,
+                   float* beta, float* vsl, lapack_int* ldvsl, float* vsr, lapack_int* ldvsr, float* rconde,
+                   float* rcondv, float* work, lapack_int* lwork, lapack_int* iwork, lapack_int* liwork,
+                   lapack_logical* bwork, lapack_int* info);
+void LAPACK_dggesx(char* jobvsl, char* jobvsr, char* sort, LAPACK_D_SELECT3 selctg, char* sense, lapack_int* n,
+                   double* a, lapack_int* lda, double* b, lapack_int* ldb, lapack_int* sdim, double* alphar,
+                   double* alphai, double* beta, double* vsl, lapack_int* ldvsl, double* vsr, lapack_int* ldvsr,
+                   double* rconde, double* rcondv, double* work, lapack_int* lwork, lapack_int* iwork,
+                   lapack_int* liwork, lapack_logical* bwork, lapack_int* info);
+void LAPACK_cggesx(char* jobvsl, char* jobvsr, char* sort, LAPACK_C_SELECT2 selctg, char* sense, lapack_int* n,
+                   lapack_complex_float* a, lapack_int* lda, lapack_complex_float* b, lapack_int* ldb, lapack_int* sdim,
+                   lapack_complex_float* alpha, lapack_complex_float* beta, lapack_complex_float* vsl,
+                   lapack_int* ldvsl, lapack_complex_float* vsr, lapack_int* ldvsr, float* rconde, float* rcondv,
+                   lapack_complex_float* work, lapack_int* lwork, float* rwork, lapack_int* iwork, lapack_int* liwork,
+                   lapack_logical* bwork, lapack_int* info);
+void LAPACK_zggesx(char* jobvsl, char* jobvsr, char* sort, LAPACK_Z_SELECT2 selctg, char* sense, lapack_int* n,
+                   lapack_complex_double* a, lapack_int* lda, lapack_complex_double* b, lapack_int* ldb,
+                   lapack_int* sdim, lapack_complex_double* alpha, lapack_complex_double* beta,
+                   lapack_complex_double* vsl, lapack_int* ldvsl, lapack_complex_double* vsr, lapack_int* ldvsr,
+                   double* rconde, double* rcondv, lapack_complex_double* work, lapack_int* lwork, double* rwork,
+                   lapack_int* iwork, lapack_int* liwork, lapack_logical* bwork, lapack_int* info);
+void LAPACK_sggev(char* jobvl, char* jobvr, lapack_int* n, float* a, lapack_int* lda, float* b, lapack_int* ldb,
+                  float* alphar, float* alphai, float* beta, float* vl, lapack_int* ldvl, float* vr, lapack_int* ldvr,
+                  float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_dggev(char* jobvl, char* jobvr, lapack_int* n, double* a, lapack_int* lda, double* b, lapack_int* ldb,
+                  double* alphar, double* alphai, double* beta, double* vl, lapack_int* ldvl, double* vr,
+                  lapack_int* ldvr, double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_cggev(char* jobvl, char* jobvr, lapack_int* n, lapack_complex_float* a, lapack_int* lda,
+                  lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* alpha, lapack_complex_float* beta,
+                  lapack_complex_float* vl, lapack_int* ldvl, lapack_complex_float* vr, lapack_int* ldvr,
+                  lapack_complex_float* work, lapack_int* lwork, float* rwork, lapack_int* info);
+void LAPACK_zggev(char* jobvl, char* jobvr, lapack_int* n, lapack_complex_double* a, lapack_int* lda,
+                  lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* alpha, lapack_complex_double* beta,
+                  lapack_complex_double* vl, lapack_int* ldvl, lapack_complex_double* vr, lapack_int* ldvr,
+                  lapack_complex_double* work, lapack_int* lwork, double* rwork, lapack_int* info);
+void LAPACK_sggevx(char* balanc, char* jobvl, char* jobvr, char* sense, lapack_int* n, float* a, lapack_int* lda,
+                   float* b, lapack_int* ldb, float* alphar, float* alphai, float* beta, float* vl, lapack_int* ldvl,
+                   float* vr, lapack_int* ldvr, lapack_int* ilo, lapack_int* ihi, float* lscale, float* rscale,
+                   float* abnrm, float* bbnrm, float* rconde, float* rcondv, float* work, lapack_int* lwork,
+                   lapack_int* iwork, lapack_logical* bwork, lapack_int* info);
+void LAPACK_dggevx(char* balanc, char* jobvl, char* jobvr, char* sense, lapack_int* n, double* a, lapack_int* lda,
+                   double* b, lapack_int* ldb, double* alphar, double* alphai, double* beta, double* vl,
+                   lapack_int* ldvl, double* vr, lapack_int* ldvr, lapack_int* ilo, lapack_int* ihi, double* lscale,
+                   double* rscale, double* abnrm, double* bbnrm, double* rconde, double* rcondv, double* work,
+                   lapack_int* lwork, lapack_int* iwork, lapack_logical* bwork, lapack_int* info);
+void LAPACK_cggevx(char* balanc, char* jobvl, char* jobvr, char* sense, lapack_int* n, lapack_complex_float* a,
+                   lapack_int* lda, lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* alpha,
+                   lapack_complex_float* beta, lapack_complex_float* vl, lapack_int* ldvl, lapack_complex_float* vr,
+                   lapack_int* ldvr, lapack_int* ilo, lapack_int* ihi, float* lscale, float* rscale, float* abnrm,
+                   float* bbnrm, float* rconde, float* rcondv, lapack_complex_float* work, lapack_int* lwork,
+                   float* rwork, lapack_int* iwork, lapack_logical* bwork, lapack_int* info);
+void LAPACK_zggevx(char* balanc, char* jobvl, char* jobvr, char* sense, lapack_int* n, lapack_complex_double* a,
+                   lapack_int* lda, lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* alpha,
+                   lapack_complex_double* beta, lapack_complex_double* vl, lapack_int* ldvl, lapack_complex_double* vr,
+                   lapack_int* ldvr, lapack_int* ilo, lapack_int* ihi, double* lscale, double* rscale, double* abnrm,
+                   double* bbnrm, double* rconde, double* rcondv, lapack_complex_double* work, lapack_int* lwork,
+                   double* rwork, lapack_int* iwork, lapack_logical* bwork, lapack_int* info);
+void LAPACK_dsfrk(char* transr, char* uplo, char* trans, lapack_int* n, lapack_int* k, double* alpha, const double* a,
+                  lapack_int* lda, double* beta, double* c);
+void LAPACK_ssfrk(char* transr, char* uplo, char* trans, lapack_int* n, lapack_int* k, float* alpha, const float* a,
+                  lapack_int* lda, float* beta, float* c);
+void LAPACK_zhfrk(char* transr, char* uplo, char* trans, lapack_int* n, lapack_int* k, double* alpha,
+                  const lapack_complex_double* a, lapack_int* lda, double* beta, lapack_complex_double* c);
+void LAPACK_chfrk(char* transr, char* uplo, char* trans, lapack_int* n, lapack_int* k, float* alpha,
+                  const lapack_complex_float* a, lapack_int* lda, float* beta, lapack_complex_float* c);
+void LAPACK_dtfsm(char* transr, char* side, char* uplo, char* trans, char* diag, lapack_int* m, lapack_int* n,
+                  double* alpha, const double* a, double* b, lapack_int* ldb);
+void LAPACK_stfsm(char* transr, char* side, char* uplo, char* trans, char* diag, lapack_int* m, lapack_int* n,
+                  float* alpha, const float* a, float* b, lapack_int* ldb);
+void LAPACK_ztfsm(char* transr, char* side, char* uplo, char* trans, char* diag, lapack_int* m, lapack_int* n,
+                  lapack_complex_double* alpha, const lapack_complex_double* a, lapack_complex_double* b,
+                  lapack_int* ldb);
+void LAPACK_ctfsm(char* transr, char* side, char* uplo, char* trans, char* diag, lapack_int* m, lapack_int* n,
+                  lapack_complex_float* alpha, const lapack_complex_float* a, lapack_complex_float* b, lapack_int* ldb);
+void LAPACK_dtfttp(char* transr, char* uplo, lapack_int* n, const double* arf, double* ap, lapack_int* info);
+void LAPACK_stfttp(char* transr, char* uplo, lapack_int* n, const float* arf, float* ap, lapack_int* info);
+void LAPACK_ztfttp(char* transr, char* uplo, lapack_int* n, const lapack_complex_double* arf, lapack_complex_double* ap,
+                   lapack_int* info);
+void LAPACK_ctfttp(char* transr, char* uplo, lapack_int* n, const lapack_complex_float* arf, lapack_complex_float* ap,
+                   lapack_int* info);
+void LAPACK_dtfttr(char* transr, char* uplo, lapack_int* n, const double* arf, double* a, lapack_int* lda,
+                   lapack_int* info);
+void LAPACK_stfttr(char* transr, char* uplo, lapack_int* n, const float* arf, float* a, lapack_int* lda,
+                   lapack_int* info);
+void LAPACK_ztfttr(char* transr, char* uplo, lapack_int* n, const lapack_complex_double* arf, lapack_complex_double* a,
+                   lapack_int* lda, lapack_int* info);
+void LAPACK_ctfttr(char* transr, char* uplo, lapack_int* n, const lapack_complex_float* arf, lapack_complex_float* a,
+                   lapack_int* lda, lapack_int* info);
+void LAPACK_dtpttf(char* transr, char* uplo, lapack_int* n, const double* ap, double* arf, lapack_int* info);
+void LAPACK_stpttf(char* transr, char* uplo, lapack_int* n, const float* ap, float* arf, lapack_int* info);
+void LAPACK_ztpttf(char* transr, char* uplo, lapack_int* n, const lapack_complex_double* ap, lapack_complex_double* arf,
+                   lapack_int* info);
+void LAPACK_ctpttf(char* transr, char* uplo, lapack_int* n, const lapack_complex_float* ap, lapack_complex_float* arf,
+                   lapack_int* info);
+void LAPACK_dtpttr(char* uplo, lapack_int* n, const double* ap, double* a, lapack_int* lda, lapack_int* info);
+void LAPACK_stpttr(char* uplo, lapack_int* n, const float* ap, float* a, lapack_int* lda, lapack_int* info);
+void LAPACK_ztpttr(char* uplo, lapack_int* n, const lapack_complex_double* ap, lapack_complex_double* a,
+                   lapack_int* lda, lapack_int* info);
+void LAPACK_ctpttr(char* uplo, lapack_int* n, const lapack_complex_float* ap, lapack_complex_float* a, lapack_int* lda,
+                   lapack_int* info);
+void LAPACK_dtrttf(char* transr, char* uplo, lapack_int* n, const double* a, lapack_int* lda, double* arf,
+                   lapack_int* info);
+void LAPACK_strttf(char* transr, char* uplo, lapack_int* n, const float* a, lapack_int* lda, float* arf,
+                   lapack_int* info);
+void LAPACK_ztrttf(char* transr, char* uplo, lapack_int* n, const lapack_complex_double* a, lapack_int* lda,
+                   lapack_complex_double* arf, lapack_int* info);
+void LAPACK_ctrttf(char* transr, char* uplo, lapack_int* n, const lapack_complex_float* a, lapack_int* lda,
+                   lapack_complex_float* arf, lapack_int* info);
+void LAPACK_dtrttp(char* uplo, lapack_int* n, const double* a, lapack_int* lda, double* ap, lapack_int* info);
+void LAPACK_strttp(char* uplo, lapack_int* n, const float* a, lapack_int* lda, float* ap, lapack_int* info);
+void LAPACK_ztrttp(char* uplo, lapack_int* n, const lapack_complex_double* a, lapack_int* lda,
+                   lapack_complex_double* ap, lapack_int* info);
+void LAPACK_ctrttp(char* uplo, lapack_int* n, const lapack_complex_float* a, lapack_int* lda, lapack_complex_float* ap,
+                   lapack_int* info);
+void LAPACK_sgeqrfp(lapack_int* m, lapack_int* n, float* a, lapack_int* lda, float* tau, float* work, lapack_int* lwork,
+                    lapack_int* info);
+void LAPACK_dgeqrfp(lapack_int* m, lapack_int* n, double* a, lapack_int* lda, double* tau, double* work,
+                    lapack_int* lwork, lapack_int* info);
+void LAPACK_cgeqrfp(lapack_int* m, lapack_int* n, lapack_complex_float* a, lapack_int* lda, lapack_complex_float* tau,
+                    lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zgeqrfp(lapack_int* m, lapack_int* n, lapack_complex_double* a, lapack_int* lda, lapack_complex_double* tau,
+                    lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_clacgv(lapack_int* n, lapack_complex_float* x, lapack_int* incx);
+void LAPACK_zlacgv(lapack_int* n, lapack_complex_double* x, lapack_int* incx);
+void LAPACK_slarnv(lapack_int* idist, lapack_int* iseed, lapack_int* n, float* x);
+void LAPACK_dlarnv(lapack_int* idist, lapack_int* iseed, lapack_int* n, double* x);
+void LAPACK_clarnv(lapack_int* idist, lapack_int* iseed, lapack_int* n, lapack_complex_float* x);
+void LAPACK_zlarnv(lapack_int* idist, lapack_int* iseed, lapack_int* n, lapack_complex_double* x);
+void LAPACK_sgeqr2(lapack_int* m, lapack_int* n, float* a, lapack_int* lda, float* tau, float* work, lapack_int* info);
+void LAPACK_dgeqr2(lapack_int* m, lapack_int* n, double* a, lapack_int* lda, double* tau, double* work,
+                   lapack_int* info);
+void LAPACK_cgeqr2(lapack_int* m, lapack_int* n, lapack_complex_float* a, lapack_int* lda, lapack_complex_float* tau,
+                   lapack_complex_float* work, lapack_int* info);
+void LAPACK_zgeqr2(lapack_int* m, lapack_int* n, lapack_complex_double* a, lapack_int* lda, lapack_complex_double* tau,
+                   lapack_complex_double* work, lapack_int* info);
+void LAPACK_slacpy(char* uplo, lapack_int* m, lapack_int* n, const float* a, lapack_int* lda, float* b,
+                   lapack_int* ldb);
+void LAPACK_dlacpy(char* uplo, lapack_int* m, lapack_int* n, const double* a, lapack_int* lda, double* b,
+                   lapack_int* ldb);
+void LAPACK_clacpy(char* uplo, lapack_int* m, lapack_int* n, const lapack_complex_float* a, lapack_int* lda,
+                   lapack_complex_float* b, lapack_int* ldb);
+void LAPACK_zlacpy(char* uplo, lapack_int* m, lapack_int* n, const lapack_complex_double* a, lapack_int* lda,
+                   lapack_complex_double* b, lapack_int* ldb);
+void LAPACK_sgetf2(lapack_int* m, lapack_int* n, float* a, lapack_int* lda, lapack_int* ipiv, lapack_int* info);
+void LAPACK_dgetf2(lapack_int* m, lapack_int* n, double* a, lapack_int* lda, lapack_int* ipiv, lapack_int* info);
+void LAPACK_cgetf2(lapack_int* m, lapack_int* n, lapack_complex_float* a, lapack_int* lda, lapack_int* ipiv,
+                   lapack_int* info);
+void LAPACK_zgetf2(lapack_int* m, lapack_int* n, lapack_complex_double* a, lapack_int* lda, lapack_int* ipiv,
+                   lapack_int* info);
+void LAPACK_slaswp(lapack_int* n, float* a, lapack_int* lda, lapack_int* k1, lapack_int* k2, const lapack_int* ipiv,
+                   lapack_int* incx);
+void LAPACK_dlaswp(lapack_int* n, double* a, lapack_int* lda, lapack_int* k1, lapack_int* k2, const lapack_int* ipiv,
+                   lapack_int* incx);
+void LAPACK_claswp(lapack_int* n, lapack_complex_float* a, lapack_int* lda, lapack_int* k1, lapack_int* k2,
+                   const lapack_int* ipiv, lapack_int* incx);
+void LAPACK_zlaswp(lapack_int* n, lapack_complex_double* a, lapack_int* lda, lapack_int* k1, lapack_int* k2,
+                   const lapack_int* ipiv, lapack_int* incx);
+float LAPACK_slange(char* norm, lapack_int* m, lapack_int* n, const float* a, lapack_int* lda, float* work);
+double LAPACK_dlange(char* norm, lapack_int* m, lapack_int* n, const double* a, lapack_int* lda, double* work);
+float LAPACK_clange(char* norm, lapack_int* m, lapack_int* n, const lapack_complex_float* a, lapack_int* lda,
+                    float* work);
+double LAPACK_zlange(char* norm, lapack_int* m, lapack_int* n, const lapack_complex_double* a, lapack_int* lda,
+                     double* work);
+float LAPACK_clanhe(char* norm, char* uplo, lapack_int* n, const lapack_complex_float* a, lapack_int* lda, float* work);
+double LAPACK_zlanhe(char* norm, char* uplo, lapack_int* n, const lapack_complex_double* a, lapack_int* lda,
+                     double* work);
+float LAPACK_slansy(char* norm, char* uplo, lapack_int* n, const float* a, lapack_int* lda, float* work);
+double LAPACK_dlansy(char* norm, char* uplo, lapack_int* n, const double* a, lapack_int* lda, double* work);
+float LAPACK_clansy(char* norm, char* uplo, lapack_int* n, const lapack_complex_float* a, lapack_int* lda, float* work);
+double LAPACK_zlansy(char* norm, char* uplo, lapack_int* n, const lapack_complex_double* a, lapack_int* lda,
+                     double* work);
+float LAPACK_slantr(char* norm, char* uplo, char* diag, lapack_int* m, lapack_int* n, const float* a, lapack_int* lda,
+                    float* work);
+double LAPACK_dlantr(char* norm, char* uplo, char* diag, lapack_int* m, lapack_int* n, const double* a, lapack_int* lda,
+                     double* work);
+float LAPACK_clantr(char* norm, char* uplo, char* diag, lapack_int* m, lapack_int* n, const lapack_complex_float* a,
+                    lapack_int* lda, float* work);
+double LAPACK_zlantr(char* norm, char* uplo, char* diag, lapack_int* m, lapack_int* n, const lapack_complex_double* a,
+                     lapack_int* lda, double* work);
+float LAPACK_slamch(char* cmach);
+double LAPACK_dlamch(char* cmach);
+void LAPACK_sgelq2(lapack_int* m, lapack_int* n, float* a, lapack_int* lda, float* tau, float* work, lapack_int* info);
+void LAPACK_dgelq2(lapack_int* m, lapack_int* n, double* a, lapack_int* lda, double* tau, double* work,
+                   lapack_int* info);
+void LAPACK_cgelq2(lapack_int* m, lapack_int* n, lapack_complex_float* a, lapack_int* lda, lapack_complex_float* tau,
+                   lapack_complex_float* work, lapack_int* info);
+void LAPACK_zgelq2(lapack_int* m, lapack_int* n, lapack_complex_double* a, lapack_int* lda, lapack_complex_double* tau,
+                   lapack_complex_double* work, lapack_int* info);
+void LAPACK_slarfb(char* side, char* trans, char* direct, char* storev, lapack_int* m, lapack_int* n, lapack_int* k,
+                   const float* v, lapack_int* ldv, const float* t, lapack_int* ldt, float* c, lapack_int* ldc,
+                   float* work, lapack_int* ldwork);
+void LAPACK_dlarfb(char* side, char* trans, char* direct, char* storev, lapack_int* m, lapack_int* n, lapack_int* k,
+                   const double* v, lapack_int* ldv, const double* t, lapack_int* ldt, double* c, lapack_int* ldc,
+                   double* work, lapack_int* ldwork);
+void LAPACK_clarfb(char* side, char* trans, char* direct, char* storev, lapack_int* m, lapack_int* n, lapack_int* k,
+                   const lapack_complex_float* v, lapack_int* ldv, const lapack_complex_float* t, lapack_int* ldt,
+                   lapack_complex_float* c, lapack_int* ldc, lapack_complex_float* work, lapack_int* ldwork);
+void LAPACK_zlarfb(char* side, char* trans, char* direct, char* storev, lapack_int* m, lapack_int* n, lapack_int* k,
+                   const lapack_complex_double* v, lapack_int* ldv, const lapack_complex_double* t, lapack_int* ldt,
+                   lapack_complex_double* c, lapack_int* ldc, lapack_complex_double* work, lapack_int* ldwork);
+void LAPACK_slarfg(lapack_int* n, float* alpha, float* x, lapack_int* incx, float* tau);
+void LAPACK_dlarfg(lapack_int* n, double* alpha, double* x, lapack_int* incx, double* tau);
+void LAPACK_clarfg(lapack_int* n, lapack_complex_float* alpha, lapack_complex_float* x, lapack_int* incx,
+                   lapack_complex_float* tau);
+void LAPACK_zlarfg(lapack_int* n, lapack_complex_double* alpha, lapack_complex_double* x, lapack_int* incx,
+                   lapack_complex_double* tau);
+void LAPACK_slarft(char* direct, char* storev, lapack_int* n, lapack_int* k, const float* v, lapack_int* ldv,
+                   const float* tau, float* t, lapack_int* ldt);
+void LAPACK_dlarft(char* direct, char* storev, lapack_int* n, lapack_int* k, const double* v, lapack_int* ldv,
+                   const double* tau, double* t, lapack_int* ldt);
+void LAPACK_clarft(char* direct, char* storev, lapack_int* n, lapack_int* k, const lapack_complex_float* v,
+                   lapack_int* ldv, const lapack_complex_float* tau, lapack_complex_float* t, lapack_int* ldt);
+void LAPACK_zlarft(char* direct, char* storev, lapack_int* n, lapack_int* k, const lapack_complex_double* v,
+                   lapack_int* ldv, const lapack_complex_double* tau, lapack_complex_double* t, lapack_int* ldt);
+void LAPACK_slarfx(char* side, lapack_int* m, lapack_int* n, const float* v, float* tau, float* c, lapack_int* ldc,
+                   float* work);
+void LAPACK_dlarfx(char* side, lapack_int* m, lapack_int* n, const double* v, double* tau, double* c, lapack_int* ldc,
+                   double* work);
+void LAPACK_clarfx(char* side, lapack_int* m, lapack_int* n, const lapack_complex_float* v, lapack_complex_float* tau,
+                   lapack_complex_float* c, lapack_int* ldc, lapack_complex_float* work);
+void LAPACK_zlarfx(char* side, lapack_int* m, lapack_int* n, const lapack_complex_double* v, lapack_complex_double* tau,
+                   lapack_complex_double* c, lapack_int* ldc, lapack_complex_double* work);
+void LAPACK_slatms(lapack_int* m, lapack_int* n, char* dist, lapack_int* iseed, char* sym, float* d, lapack_int* mode,
+                   float* cond, float* dmax, lapack_int* kl, lapack_int* ku, char* pack, float* a, lapack_int* lda,
+                   float* work, lapack_int* info);
+void LAPACK_dlatms(lapack_int* m, lapack_int* n, char* dist, lapack_int* iseed, char* sym, double* d, lapack_int* mode,
+                   double* cond, double* dmax, lapack_int* kl, lapack_int* ku, char* pack, double* a, lapack_int* lda,
+                   double* work, lapack_int* info);
+void LAPACK_clatms(lapack_int* m, lapack_int* n, char* dist, lapack_int* iseed, char* sym, float* d, lapack_int* mode,
+                   float* cond, float* dmax, lapack_int* kl, lapack_int* ku, char* pack, lapack_complex_float* a,
+                   lapack_int* lda, lapack_complex_float* work, lapack_int* info);
+void LAPACK_zlatms(lapack_int* m, lapack_int* n, char* dist, lapack_int* iseed, char* sym, double* d, lapack_int* mode,
+                   double* cond, double* dmax, lapack_int* kl, lapack_int* ku, char* pack, lapack_complex_double* a,
+                   lapack_int* lda, lapack_complex_double* work, lapack_int* info);
+void LAPACK_slag2d(lapack_int* m, lapack_int* n, const float* sa, lapack_int* ldsa, double* a, lapack_int* lda,
+                   lapack_int* info);
+void LAPACK_dlag2s(lapack_int* m, lapack_int* n, const double* a, lapack_int* lda, float* sa, lapack_int* ldsa,
+                   lapack_int* info);
+void LAPACK_clag2z(lapack_int* m, lapack_int* n, const lapack_complex_float* sa, lapack_int* ldsa,
+                   lapack_complex_double* a, lapack_int* lda, lapack_int* info);
+void LAPACK_zlag2c(lapack_int* m, lapack_int* n, const lapack_complex_double* a, lapack_int* lda,
+                   lapack_complex_float* sa, lapack_int* ldsa, lapack_int* info);
+void LAPACK_slauum(char* uplo, lapack_int* n, float* a, lapack_int* lda, lapack_int* info);
+void LAPACK_dlauum(char* uplo, lapack_int* n, double* a, lapack_int* lda, lapack_int* info);
+void LAPACK_clauum(char* uplo, lapack_int* n, lapack_complex_float* a, lapack_int* lda, lapack_int* info);
+void LAPACK_zlauum(char* uplo, lapack_int* n, lapack_complex_double* a, lapack_int* lda, lapack_int* info);
+void LAPACK_slagge(lapack_int* m, lapack_int* n, lapack_int* kl, lapack_int* ku, const float* d, float* a,
+                   lapack_int* lda, lapack_int* iseed, float* work, lapack_int* info);
+void LAPACK_dlagge(lapack_int* m, lapack_int* n, lapack_int* kl, lapack_int* ku, const double* d, double* a,
+                   lapack_int* lda, lapack_int* iseed, double* work, lapack_int* info);
+void LAPACK_clagge(lapack_int* m, lapack_int* n, lapack_int* kl, lapack_int* ku, const float* d,
+                   lapack_complex_float* a, lapack_int* lda, lapack_int* iseed, lapack_complex_float* work,
+                   lapack_int* info);
+void LAPACK_zlagge(lapack_int* m, lapack_int* n, lapack_int* kl, lapack_int* ku, const double* d,
+                   lapack_complex_double* a, lapack_int* lda, lapack_int* iseed, lapack_complex_double* work,
+                   lapack_int* info);
+void LAPACK_slaset(char* uplo, lapack_int* m, lapack_int* n, float* alpha, float* beta, float* a, lapack_int* lda);
+void LAPACK_dlaset(char* uplo, lapack_int* m, lapack_int* n, double* alpha, double* beta, double* a, lapack_int* lda);
+void LAPACK_claset(char* uplo, lapack_int* m, lapack_int* n, lapack_complex_float* alpha, lapack_complex_float* beta,
+                   lapack_complex_float* a, lapack_int* lda);
+void LAPACK_zlaset(char* uplo, lapack_int* m, lapack_int* n, lapack_complex_double* alpha, lapack_complex_double* beta,
+                   lapack_complex_double* a, lapack_int* lda);
+void LAPACK_slasrt(char* id, lapack_int* n, float* d, lapack_int* info);
+void LAPACK_dlasrt(char* id, lapack_int* n, double* d, lapack_int* info);
+void LAPACK_claghe(lapack_int* n, lapack_int* k, const float* d, lapack_complex_float* a, lapack_int* lda,
+                   lapack_int* iseed, lapack_complex_float* work, lapack_int* info);
+void LAPACK_zlaghe(lapack_int* n, lapack_int* k, const double* d, lapack_complex_double* a, lapack_int* lda,
+                   lapack_int* iseed, lapack_complex_double* work, lapack_int* info);
+void LAPACK_slagsy(lapack_int* n, lapack_int* k, const float* d, float* a, lapack_int* lda, lapack_int* iseed,
+                   float* work, lapack_int* info);
+void LAPACK_dlagsy(lapack_int* n, lapack_int* k, const double* d, double* a, lapack_int* lda, lapack_int* iseed,
+                   double* work, lapack_int* info);
+void LAPACK_clagsy(lapack_int* n, lapack_int* k, const float* d, lapack_complex_float* a, lapack_int* lda,
+                   lapack_int* iseed, lapack_complex_float* work, lapack_int* info);
+void LAPACK_zlagsy(lapack_int* n, lapack_int* k, const double* d, lapack_complex_double* a, lapack_int* lda,
+                   lapack_int* iseed, lapack_complex_double* work, lapack_int* info);
+void LAPACK_slapmr(lapack_logical* forwrd, lapack_int* m, lapack_int* n, float* x, lapack_int* ldx, lapack_int* k);
+void LAPACK_dlapmr(lapack_logical* forwrd, lapack_int* m, lapack_int* n, double* x, lapack_int* ldx, lapack_int* k);
+void LAPACK_clapmr(lapack_logical* forwrd, lapack_int* m, lapack_int* n, lapack_complex_float* x, lapack_int* ldx,
+                   lapack_int* k);
+void LAPACK_zlapmr(lapack_logical* forwrd, lapack_int* m, lapack_int* n, lapack_complex_double* x, lapack_int* ldx,
+                   lapack_int* k);
+float LAPACK_slapy2(float* x, float* y);
+double LAPACK_dlapy2(double* x, double* y);
+float LAPACK_slapy3(float* x, float* y, float* z);
+double LAPACK_dlapy3(double* x, double* y, double* z);
+void LAPACK_slartgp(float* f, float* g, float* cs, float* sn, float* r);
+void LAPACK_dlartgp(double* f, double* g, double* cs, double* sn, double* r);
+void LAPACK_slartgs(float* x, float* y, float* sigma, float* cs, float* sn);
+void LAPACK_dlartgs(double* x, double* y, double* sigma, double* cs, double* sn);
+// LAPACK 3.3.0
+void LAPACK_cbbcsd(char* jobu1, char* jobu2, char* jobv1t, char* jobv2t, char* trans, lapack_int* m, lapack_int* p,
+                   lapack_int* q, float* theta, float* phi, lapack_complex_float* u1, lapack_int* ldu1,
+                   lapack_complex_float* u2, lapack_int* ldu2, lapack_complex_float* v1t, lapack_int* ldv1t,
+                   lapack_complex_float* v2t, lapack_int* ldv2t, float* b11d, float* b11e, float* b12d, float* b12e,
+                   float* b21d, float* b21e, float* b22d, float* b22e, float* rwork, lapack_int* lrwork,
+                   lapack_int* info);
+void LAPACK_cheswapr(char* uplo, lapack_int* n, lapack_complex_float* a, lapack_int* i1, lapack_int* i2);
+void LAPACK_chetri2(char* uplo, lapack_int* n, lapack_complex_float* a, lapack_int* lda, const lapack_int* ipiv,
+                    lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_chetri2x(char* uplo, lapack_int* n, lapack_complex_float* a, lapack_int* lda, const lapack_int* ipiv,
+                     lapack_complex_float* work, lapack_int* nb, lapack_int* info);
+void LAPACK_chetrs2(char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* a, lapack_int* lda,
+                    const lapack_int* ipiv, lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* work,
+                    lapack_int* info);
+void LAPACK_csyconv(char* uplo, char* way, lapack_int* n, lapack_complex_float* a, lapack_int* lda,
+                    const lapack_int* ipiv, lapack_complex_float* work, lapack_int* info);
+void LAPACK_csyswapr(char* uplo, lapack_int* n, lapack_complex_float* a, lapack_int* i1, lapack_int* i2);
+void LAPACK_csytri2(char* uplo, lapack_int* n, lapack_complex_float* a, lapack_int* lda, const lapack_int* ipiv,
+                    lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_csytri2x(char* uplo, lapack_int* n, lapack_complex_float* a, lapack_int* lda, const lapack_int* ipiv,
+                     lapack_complex_float* work, lapack_int* nb, lapack_int* info);
+void LAPACK_csytrs2(char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_float* a, lapack_int* lda,
+                    const lapack_int* ipiv, lapack_complex_float* b, lapack_int* ldb, lapack_complex_float* work,
+                    lapack_int* info);
+void LAPACK_cunbdb(char* trans, char* signs, lapack_int* m, lapack_int* p, lapack_int* q, lapack_complex_float* x11,
+                   lapack_int* ldx11, lapack_complex_float* x12, lapack_int* ldx12, lapack_complex_float* x21,
+                   lapack_int* ldx21, lapack_complex_float* x22, lapack_int* ldx22, float* theta, float* phi,
+                   lapack_complex_float* taup1, lapack_complex_float* taup2, lapack_complex_float* tauq1,
+                   lapack_complex_float* tauq2, lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_cuncsd(char* jobu1, char* jobu2, char* jobv1t, char* jobv2t, char* trans, char* signs, lapack_int* m,
+                   lapack_int* p, lapack_int* q, lapack_complex_float* x11, lapack_int* ldx11,
+                   lapack_complex_float* x12, lapack_int* ldx12, lapack_complex_float* x21, lapack_int* ldx21,
+                   lapack_complex_float* x22, lapack_int* ldx22, float* theta, lapack_complex_float* u1,
+                   lapack_int* ldu1, lapack_complex_float* u2, lapack_int* ldu2, lapack_complex_float* v1t,
+                   lapack_int* ldv1t, lapack_complex_float* v2t, lapack_int* ldv2t, lapack_complex_float* work,
+                   lapack_int* lwork, float* rwork, lapack_int* lrwork, lapack_int* iwork, lapack_int* info);
+void LAPACK_dbbcsd(char* jobu1, char* jobu2, char* jobv1t, char* jobv2t, char* trans, lapack_int* m, lapack_int* p,
+                   lapack_int* q, double* theta, double* phi, double* u1, lapack_int* ldu1, double* u2,
+                   lapack_int* ldu2, double* v1t, lapack_int* ldv1t, double* v2t, lapack_int* ldv2t, double* b11d,
+                   double* b11e, double* b12d, double* b12e, double* b21d, double* b21e, double* b22d, double* b22e,
+                   double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_dorbdb(char* trans, char* signs, lapack_int* m, lapack_int* p, lapack_int* q, double* x11,
+                   lapack_int* ldx11, double* x12, lapack_int* ldx12, double* x21, lapack_int* ldx21, double* x22,
+                   lapack_int* ldx22, double* theta, double* phi, double* taup1, double* taup2, double* tauq1,
+                   double* tauq2, double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_dorcsd(char* jobu1, char* jobu2, char* jobv1t, char* jobv2t, char* trans, char* signs, lapack_int* m,
+                   lapack_int* p, lapack_int* q, double* x11, lapack_int* ldx11, double* x12, lapack_int* ldx12,
+                   double* x21, lapack_int* ldx21, double* x22, lapack_int* ldx22, double* theta, double* u1,
+                   lapack_int* ldu1, double* u2, lapack_int* ldu2, double* v1t, lapack_int* ldv1t, double* v2t,
+                   lapack_int* ldv2t, double* work, lapack_int* lwork, lapack_int* iwork, lapack_int* info);
+void LAPACK_dsyconv(char* uplo, char* way, lapack_int* n, double* a, lapack_int* lda, const lapack_int* ipiv,
+                    double* work, lapack_int* info);
+void LAPACK_dsyswapr(char* uplo, lapack_int* n, double* a, lapack_int* i1, lapack_int* i2);
+void LAPACK_dsytri2(char* uplo, lapack_int* n, double* a, lapack_int* lda, const lapack_int* ipiv,
+                    lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_dsytri2x(char* uplo, lapack_int* n, double* a, lapack_int* lda, const lapack_int* ipiv, double* work,
+                     lapack_int* nb, lapack_int* info);
+void LAPACK_dsytrs2(char* uplo, lapack_int* n, lapack_int* nrhs, const double* a, lapack_int* lda,
+                    const lapack_int* ipiv, double* b, lapack_int* ldb, double* work, lapack_int* info);
+void LAPACK_sbbcsd(char* jobu1, char* jobu2, char* jobv1t, char* jobv2t, char* trans, lapack_int* m, lapack_int* p,
+                   lapack_int* q, float* theta, float* phi, float* u1, lapack_int* ldu1, float* u2, lapack_int* ldu2,
+                   float* v1t, lapack_int* ldv1t, float* v2t, lapack_int* ldv2t, float* b11d, float* b11e, float* b12d,
+                   float* b12e, float* b21d, float* b21e, float* b22d, float* b22e, float* work, lapack_int* lwork,
+                   lapack_int* info);
+void LAPACK_sorbdb(char* trans, char* signs, lapack_int* m, lapack_int* p, lapack_int* q, float* x11, lapack_int* ldx11,
+                   float* x12, lapack_int* ldx12, float* x21, lapack_int* ldx21, float* x22, lapack_int* ldx22,
+                   float* theta, float* phi, float* taup1, float* taup2, float* tauq1, float* tauq2, float* work,
+                   lapack_int* lwork, lapack_int* info);
+void LAPACK_sorcsd(char* jobu1, char* jobu2, char* jobv1t, char* jobv2t, char* trans, char* signs, lapack_int* m,
+                   lapack_int* p, lapack_int* q, float* x11, lapack_int* ldx11, float* x12, lapack_int* ldx12,
+                   float* x21, lapack_int* ldx21, float* x22, lapack_int* ldx22, float* theta, float* u1,
+                   lapack_int* ldu1, float* u2, lapack_int* ldu2, float* v1t, lapack_int* ldv1t, float* v2t,
+                   lapack_int* ldv2t, float* work, lapack_int* lwork, lapack_int* iwork, lapack_int* info);
+void LAPACK_ssyconv(char* uplo, char* way, lapack_int* n, float* a, lapack_int* lda, const lapack_int* ipiv,
+                    float* work, lapack_int* info);
+void LAPACK_ssyswapr(char* uplo, lapack_int* n, float* a, lapack_int* i1, lapack_int* i2);
+void LAPACK_ssytri2(char* uplo, lapack_int* n, float* a, lapack_int* lda, const lapack_int* ipiv,
+                    lapack_complex_float* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_ssytri2x(char* uplo, lapack_int* n, float* a, lapack_int* lda, const lapack_int* ipiv, float* work,
+                     lapack_int* nb, lapack_int* info);
+void LAPACK_ssytrs2(char* uplo, lapack_int* n, lapack_int* nrhs, const float* a, lapack_int* lda,
+                    const lapack_int* ipiv, float* b, lapack_int* ldb, float* work, lapack_int* info);
+void LAPACK_zbbcsd(char* jobu1, char* jobu2, char* jobv1t, char* jobv2t, char* trans, lapack_int* m, lapack_int* p,
+                   lapack_int* q, double* theta, double* phi, lapack_complex_double* u1, lapack_int* ldu1,
+                   lapack_complex_double* u2, lapack_int* ldu2, lapack_complex_double* v1t, lapack_int* ldv1t,
+                   lapack_complex_double* v2t, lapack_int* ldv2t, double* b11d, double* b11e, double* b12d,
+                   double* b12e, double* b21d, double* b21e, double* b22d, double* b22e, double* rwork,
+                   lapack_int* lrwork, lapack_int* info);
+void LAPACK_zheswapr(char* uplo, lapack_int* n, lapack_complex_double* a, lapack_int* i1, lapack_int* i2);
+void LAPACK_zhetri2(char* uplo, lapack_int* n, lapack_complex_double* a, lapack_int* lda, const lapack_int* ipiv,
+                    lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zhetri2x(char* uplo, lapack_int* n, lapack_complex_double* a, lapack_int* lda, const lapack_int* ipiv,
+                     lapack_complex_double* work, lapack_int* nb, lapack_int* info);
+void LAPACK_zhetrs2(char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* a, lapack_int* lda,
+                    const lapack_int* ipiv, lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* work,
+                    lapack_int* info);
+void LAPACK_zsyconv(char* uplo, char* way, lapack_int* n, lapack_complex_double* a, lapack_int* lda,
+                    const lapack_int* ipiv, lapack_complex_double* work, lapack_int* info);
+void LAPACK_zsyswapr(char* uplo, lapack_int* n, lapack_complex_double* a, lapack_int* i1, lapack_int* i2);
+void LAPACK_zsytri2(char* uplo, lapack_int* n, lapack_complex_double* a, lapack_int* lda, const lapack_int* ipiv,
+                    lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zsytri2x(char* uplo, lapack_int* n, lapack_complex_double* a, lapack_int* lda, const lapack_int* ipiv,
+                     lapack_complex_double* work, lapack_int* nb, lapack_int* info);
+void LAPACK_zsytrs2(char* uplo, lapack_int* n, lapack_int* nrhs, const lapack_complex_double* a, lapack_int* lda,
+                    const lapack_int* ipiv, lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* work,
+                    lapack_int* info);
+void LAPACK_zunbdb(char* trans, char* signs, lapack_int* m, lapack_int* p, lapack_int* q, lapack_complex_double* x11,
+                   lapack_int* ldx11, lapack_complex_double* x12, lapack_int* ldx12, lapack_complex_double* x21,
+                   lapack_int* ldx21, lapack_complex_double* x22, lapack_int* ldx22, double* theta, double* phi,
+                   lapack_complex_double* taup1, lapack_complex_double* taup2, lapack_complex_double* tauq1,
+                   lapack_complex_double* tauq2, lapack_complex_double* work, lapack_int* lwork, lapack_int* info);
+void LAPACK_zuncsd(char* jobu1, char* jobu2, char* jobv1t, char* jobv2t, char* trans, char* signs, lapack_int* m,
+                   lapack_int* p, lapack_int* q, lapack_complex_double* x11, lapack_int* ldx11,
+                   lapack_complex_double* x12, lapack_int* ldx12, lapack_complex_double* x21, lapack_int* ldx21,
+                   lapack_complex_double* x22, lapack_int* ldx22, double* theta, lapack_complex_double* u1,
+                   lapack_int* ldu1, lapack_complex_double* u2, lapack_int* ldu2, lapack_complex_double* v1t,
+                   lapack_int* ldv1t, lapack_complex_double* v2t, lapack_int* ldv2t, lapack_complex_double* work,
+                   lapack_int* lwork, double* rwork, lapack_int* lrwork, lapack_int* iwork, lapack_int* info);
+// LAPACK 3.4.0
+void LAPACK_sgemqrt(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, lapack_int* nb,
+                    const float* v, lapack_int* ldv, const float* t, lapack_int* ldt, float* c, lapack_int* ldc,
+                    float* work, lapack_int* info);
+void LAPACK_dgemqrt(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, lapack_int* nb,
+                    const double* v, lapack_int* ldv, const double* t, lapack_int* ldt, double* c, lapack_int* ldc,
+                    double* work, lapack_int* info);
+void LAPACK_cgemqrt(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, lapack_int* nb,
+                    const lapack_complex_float* v, lapack_int* ldv, const lapack_complex_float* t, lapack_int* ldt,
+                    lapack_complex_float* c, lapack_int* ldc, lapack_complex_float* work, lapack_int* info);
+void LAPACK_zgemqrt(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, lapack_int* nb,
+                    const lapack_complex_double* v, lapack_int* ldv, const lapack_complex_double* t, lapack_int* ldt,
+                    lapack_complex_double* c, lapack_int* ldc, lapack_complex_double* work, lapack_int* info);
+void LAPACK_sgeqrt(lapack_int* m, lapack_int* n, lapack_int* nb, float* a, lapack_int* lda, float* t, lapack_int* ldt,
+                   float* work, lapack_int* info);
+void LAPACK_dgeqrt(lapack_int* m, lapack_int* n, lapack_int* nb, double* a, lapack_int* lda, double* t, lapack_int* ldt,
+                   double* work, lapack_int* info);
+void LAPACK_cgeqrt(lapack_int* m, lapack_int* n, lapack_int* nb, lapack_complex_float* a, lapack_int* lda,
+                   lapack_complex_float* t, lapack_int* ldt, lapack_complex_float* work, lapack_int* info);
+void LAPACK_zgeqrt(lapack_int* m, lapack_int* n, lapack_int* nb, lapack_complex_double* a, lapack_int* lda,
+                   lapack_complex_double* t, lapack_int* ldt, lapack_complex_double* work, lapack_int* info);
+void LAPACK_sgeqrt2(lapack_int* m, lapack_int* n, float* a, lapack_int* lda, float* t, lapack_int* ldt,
+                    lapack_int* info);
+void LAPACK_dgeqrt2(lapack_int* m, lapack_int* n, double* a, lapack_int* lda, double* t, lapack_int* ldt,
+                    lapack_int* info);
+void LAPACK_cgeqrt2(lapack_int* m, lapack_int* n, lapack_complex_float* a, lapack_int* lda, lapack_complex_float* t,
+                    lapack_int* ldt, lapack_int* info);
+void LAPACK_zgeqrt2(lapack_int* m, lapack_int* n, lapack_complex_double* a, lapack_int* lda, lapack_complex_double* t,
+                    lapack_int* ldt, lapack_int* info);
+void LAPACK_sgeqrt3(lapack_int* m, lapack_int* n, float* a, lapack_int* lda, float* t, lapack_int* ldt,
+                    lapack_int* info);
+void LAPACK_dgeqrt3(lapack_int* m, lapack_int* n, double* a, lapack_int* lda, double* t, lapack_int* ldt,
+                    lapack_int* info);
+void LAPACK_cgeqrt3(lapack_int* m, lapack_int* n, lapack_complex_float* a, lapack_int* lda, lapack_complex_float* t,
+                    lapack_int* ldt, lapack_int* info);
+void LAPACK_zgeqrt3(lapack_int* m, lapack_int* n, lapack_complex_double* a, lapack_int* lda, lapack_complex_double* t,
+                    lapack_int* ldt, lapack_int* info);
+void LAPACK_stpmqrt(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, lapack_int* l, lapack_int* nb,
+                    const float* v, lapack_int* ldv, const float* t, lapack_int* ldt, float* a, lapack_int* lda,
+                    float* b, lapack_int* ldb, float* work, lapack_int* info);
+void LAPACK_dtpmqrt(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, lapack_int* l, lapack_int* nb,
+                    const double* v, lapack_int* ldv, const double* t, lapack_int* ldt, double* a, lapack_int* lda,
+                    double* b, lapack_int* ldb, double* work, lapack_int* info);
+void LAPACK_ctpmqrt(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, lapack_int* l, lapack_int* nb,
+                    const lapack_complex_float* v, lapack_int* ldv, const lapack_complex_float* t, lapack_int* ldt,
+                    lapack_complex_float* a, lapack_int* lda, lapack_complex_float* b, lapack_int* ldb,
+                    lapack_complex_float* work, lapack_int* info);
+void LAPACK_ztpmqrt(char* side, char* trans, lapack_int* m, lapack_int* n, lapack_int* k, lapack_int* l, lapack_int* nb,
+                    const lapack_complex_double* v, lapack_int* ldv, const lapack_complex_double* t, lapack_int* ldt,
+                    lapack_complex_double* a, lapack_int* lda, lapack_complex_double* b, lapack_int* ldb,
+                    lapack_complex_double* work, lapack_int* info);
+void LAPACK_dtpqrt(lapack_int* m, lapack_int* n, lapack_int* l, lapack_int* nb, double* a, lapack_int* lda, double* b,
+                   lapack_int* ldb, double* t, lapack_int* ldt, double* work, lapack_int* info);
+void LAPACK_ctpqrt(lapack_int* m, lapack_int* n, lapack_int* l, lapack_int* nb, lapack_complex_float* a,
+                   lapack_int* lda, lapack_complex_float* t, lapack_complex_float* b, lapack_int* ldb, lapack_int* ldt,
+                   lapack_complex_float* work, lapack_int* info);
+void LAPACK_ztpqrt(lapack_int* m, lapack_int* n, lapack_int* l, lapack_int* nb, lapack_complex_double* a,
+                   lapack_int* lda, lapack_complex_double* b, lapack_int* ldb, lapack_complex_double* t,
+                   lapack_int* ldt, lapack_complex_double* work, lapack_int* info);
+void LAPACK_stpqrt2(lapack_int* m, lapack_int* n, float* a, lapack_int* lda, float* b, lapack_int* ldb, float* t,
+                    lapack_int* ldt, lapack_int* info);
+void LAPACK_dtpqrt2(lapack_int* m, lapack_int* n, double* a, lapack_int* lda, double* b, lapack_int* ldb, double* t,
+                    lapack_int* ldt, lapack_int* info);
+void LAPACK_ctpqrt2(lapack_int* m, lapack_int* n, lapack_complex_float* a, lapack_int* lda, lapack_complex_float* b,
+                    lapack_int* ldb, lapack_complex_float* t, lapack_int* ldt, lapack_int* info);
+void LAPACK_ztpqrt2(lapack_int* m, lapack_int* n, lapack_complex_double* a, lapack_int* lda, lapack_complex_double* b,
+                    lapack_int* ldb, lapack_complex_double* t, lapack_int* ldt, lapack_int* info);
+void LAPACK_stprfb(char* side, char* trans, char* direct, char* storev, lapack_int* m, lapack_int* n, lapack_int* k,
+                   lapack_int* l, const float* v, lapack_int* ldv, const float* t, lapack_int* ldt, float* a,
+                   lapack_int* lda, float* b, lapack_int* ldb, const float* mywork, lapack_int* myldwork);
+void LAPACK_dtprfb(char* side, char* trans, char* direct, char* storev, lapack_int* m, lapack_int* n, lapack_int* k,
+                   lapack_int* l, const double* v, lapack_int* ldv, const double* t, lapack_int* ldt, double* a,
+                   lapack_int* lda, double* b, lapack_int* ldb, const double* mywork, lapack_int* myldwork);
+void LAPACK_ctprfb(char* side, char* trans, char* direct, char* storev, lapack_int* m, lapack_int* n, lapack_int* k,
+                   lapack_int* l, const lapack_complex_float* v, lapack_int* ldv, const lapack_complex_float* t,
+                   lapack_int* ldt, lapack_complex_float* a, lapack_int* lda, lapack_complex_float* b, lapack_int* ldb,
+                   const float* mywork, lapack_int* myldwork);
+void LAPACK_ztprfb(char* side, char* trans, char* direct, char* storev, lapack_int* m, lapack_int* n, lapack_int* k,
+                   lapack_int* l, const lapack_complex_double* v, lapack_int* ldv, const lapack_complex_double* t,
+                   lapack_int* ldt, lapack_complex_double* a, lapack_int* lda, lapack_complex_double* b,
+                   lapack_int* ldb, const double* mywork, lapack_int* myldwork);
+// LAPACK 3.X.X
+void LAPACK_csyr(char* uplo, lapack_int* n, lapack_complex_float* alpha, const lapack_complex_float* x,
+                 lapack_int* incx, lapack_complex_float* a, lapack_int* lda);
+void LAPACK_zsyr(char* uplo, lapack_int* n, lapack_complex_double* alpha, const lapack_complex_double* x,
+                 lapack_int* incx, lapack_complex_double* a, lapack_int* lda);
 
 #ifdef __cplusplus
 }
diff --git a/Eigen/src/misc/lapacke_helpers.h b/Eigen/src/misc/lapacke_helpers.h
index dc4a04e..5a2f38f 100644
--- a/Eigen/src/misc/lapacke_helpers.h
+++ b/Eigen/src/misc/lapacke_helpers.h
@@ -32,47 +32,49 @@
 // ---------------------------------------------------------------------------------------------------------------------
 
 // For complex numbers, the types in Eigen and Lapacke are different, but layout compatible.
-template<typename Scalar>
+template <typename Scalar>
 struct translate_type_imp;
-template<>
+template <>
 struct translate_type_imp<float> {
-    using type = float;
+  using type = float;
 };
-template<>
+template <>
 struct translate_type_imp<double> {
-    using type = double;
+  using type = double;
 };
-template<>
+template <>
 struct translate_type_imp<std::complex<double>> {
-    using type = lapack_complex_double;
+  using type = lapack_complex_double;
 };
-template<>
+template <>
 struct translate_type_imp<std::complex<float>> {
-    using type = lapack_complex_float;
+  using type = lapack_complex_float;
 };
 
 /// Given an Eigen types, this is defined to be the corresponding, layout-compatible lapack type
-template<typename Scalar>
+template <typename Scalar>
 using translated_type = typename translate_type_imp<Scalar>::type;
 
 /// These functions convert their arguments from Eigen to Lapack types
 /// This function performs conversion for any of the translations defined above.
-template<typename Source, typename Target=translated_type<Source>>
-EIGEN_ALWAYS_INLINE auto to_lapack(Source value) { return static_cast<Target>(value); }
+template <typename Source, typename Target = translated_type<Source>>
+EIGEN_ALWAYS_INLINE auto to_lapack(Source value) {
+  return static_cast<Target>(value);
+}
 
 /// This function performs conversions for pointer types corresponding to the translations abovce.
 /// This is valid because the translations are between layout-compatible types.
-template<typename Source, typename Target=translated_type<Source>>
-EIGEN_ALWAYS_INLINE auto to_lapack(Source *value) { return reinterpret_cast<Target*>(value); }
+template <typename Source, typename Target = translated_type<Source>>
+EIGEN_ALWAYS_INLINE auto to_lapack(Source *value) {
+  return reinterpret_cast<Target *>(value);
+}
 
 /// This function converts the Eigen Index to a lapack index, with possible range checks
 /// \sa internal::convert_index
-EIGEN_ALWAYS_INLINE lapack_int to_lapack(Index index) {
-  return convert_index<lapack_int>(index);
-}
+EIGEN_ALWAYS_INLINE lapack_int to_lapack(Index index) { return convert_index<lapack_int>(index); }
 
 /// translates storage order of the given Eigen object to the corresponding lapack constant
-template<typename Derived>
+template <typename Derived>
 EIGEN_ALWAYS_INLINE EIGEN_CONSTEXPR lapack_int lapack_storage_of(const EigenBase<Derived> &) {
   return Derived::IsRowMajor ? LAPACK_ROW_MAJOR : LAPACK_COL_MAJOR;
 }
@@ -83,38 +85,41 @@
 
 /*!
  * \internal
- * \brief Helper type to facilitate the wrapping of raw LAPACKE functions for different types into a single, overloaded C++ function.
- * This is achieved in combination with \r EIGEN_MAKE_LAPACKE_WRAPPER
- * \details This implementation works by providing an overloaded call function that just forwards its arguments to the
- * underlying lapack function. Each of these overloads is enabled only if the call is actually well formed.
- * Because these lapack functions take pointers to the underlying scalar type as arguments, even though the actual Scalars
- * would be implicitly convertible, the pointers are not and therefore only a single overload can be valid at the same time.
- * Thus, despite all functions taking fully generic `Args&&... args` as arguments, there is never any ambiguity.
+ * \brief Helper type to facilitate the wrapping of raw LAPACKE functions for different types into a single, overloaded
+ * C++ function. This is achieved in combination with \r EIGEN_MAKE_LAPACKE_WRAPPER \details This implementation works
+ * by providing an overloaded call function that just forwards its arguments to the underlying lapack function. Each of
+ * these overloads is enabled only if the call is actually well formed. Because these lapack functions take pointers to
+ * the underlying scalar type as arguments, even though the actual Scalars would be implicitly convertible, the pointers
+ * are not and therefore only a single overload can be valid at the same time. Thus, despite all functions taking fully
+ * generic `Args&&... args` as arguments, there is never any ambiguity.
  */
-template<typename DoubleFn, typename SingleFn, typename DoubleCpxFn, typename SingleCpxFn>
+template <typename DoubleFn, typename SingleFn, typename DoubleCpxFn, typename SingleCpxFn>
 struct WrappingHelper {
   // The naming of double, single, double complex and single complex is purely for readability
   // and doesn't actually affect the workings of this class. In principle, the arguments can
   // be supplied in any permuted order.
-  DoubleFn double_; SingleFn single_; DoubleCpxFn double_cpx_; SingleCpxFn single_cpx_;
+  DoubleFn double_;
+  SingleFn single_;
+  DoubleCpxFn double_cpx_;
+  SingleCpxFn single_cpx_;
 
-  template<typename... Args>
-  auto call(Args&&... args) -> decltype(double_(std::forward<Args>(args)...)) {
+  template <typename... Args>
+  auto call(Args &&...args) -> decltype(double_(std::forward<Args>(args)...)) {
     return double_(std::forward<Args>(args)...);
   }
 
-  template<typename... Args>
-  auto call(Args&&... args) -> decltype(single_(std::forward<Args>(args)...)){
+  template <typename... Args>
+  auto call(Args &&...args) -> decltype(single_(std::forward<Args>(args)...)) {
     return single_(std::forward<Args>(args)...);
   }
 
-  template<typename... Args>
-  auto call(Args&&... args) -> decltype(double_cpx_(std::forward<Args>(args)...)){
+  template <typename... Args>
+  auto call(Args &&...args) -> decltype(double_cpx_(std::forward<Args>(args)...)) {
     return double_cpx_(std::forward<Args>(args)...);
   }
 
-  template<typename... Args>
-  auto call(Args&&... args) -> decltype(single_cpx_(std::forward<Args>(args)...)){
+  template <typename... Args>
+  auto call(Args &&...args) -> decltype(single_cpx_(std::forward<Args>(args)...)) {
     return single_cpx_(std::forward<Args>(args)...);
   }
 };
@@ -123,8 +128,8 @@
  * invokes its `call` method, thus selecting one of the overloads.
  * \sa EIGEN_MAKE_LAPACKE_WRAPPER
  */
-template<typename DoubleFn, typename SingleFn, typename DoubleCpxFn, typename SingleCpxFn, typename... Args>
-EIGEN_ALWAYS_INLINE auto call_wrapper(DoubleFn df, SingleFn sf, DoubleCpxFn dcf, SingleCpxFn scf, Args&&... args) {
+template <typename DoubleFn, typename SingleFn, typename DoubleCpxFn, typename SingleCpxFn, typename... Args>
+EIGEN_ALWAYS_INLINE auto call_wrapper(DoubleFn df, SingleFn sf, DoubleCpxFn dcf, SingleCpxFn scf, Args &&...args) {
   WrappingHelper<DoubleFn, SingleFn, DoubleCpxFn, SingleCpxFn> helper{df, sf, dcf, scf};
   return helper.call(std::forward<Args>(args)...);
 }
@@ -134,9 +139,12 @@
  * Generates a new function `Function` that dispatches to the corresponding LAPACKE_? prefixed functions.
  * \sa WrappingHelper
  */
-#define EIGEN_MAKE_LAPACKE_WRAPPER(FUNCTION) \
-template<typename... Args> \
-EIGEN_ALWAYS_INLINE auto FUNCTION(Args&&... args) { return call_wrapper(LAPACKE_d##FUNCTION, LAPACKE_s##FUNCTION, LAPACKE_z##FUNCTION, LAPACKE_c##FUNCTION, std::forward<Args>(args)...); }
+#define EIGEN_MAKE_LAPACKE_WRAPPER(FUNCTION)                                                                \
+  template <typename... Args>                                                                               \
+  EIGEN_ALWAYS_INLINE auto FUNCTION(Args &&...args) {                                                       \
+    return call_wrapper(LAPACKE_d##FUNCTION, LAPACKE_s##FUNCTION, LAPACKE_z##FUNCTION, LAPACKE_c##FUNCTION, \
+                        std::forward<Args>(args)...);                                                       \
+  }
 
 // Now with this macro and the helper wrappers, we can generate the dispatch for all the lapacke functions that are
 // used in Eigen.
@@ -148,8 +156,8 @@
 EIGEN_MAKE_LAPACKE_WRAPPER(gesdd)
 
 #undef EIGEN_MAKE_LAPACKE_WRAPPER
-}
-}
-}
+}  // namespace lapacke_helpers
+}  // namespace internal
+}  // namespace Eigen
 
-#endif // EIGEN_LAPACKE_HELPERS_H
+#endif  // EIGEN_LAPACKE_HELPERS_H
diff --git a/Eigen/src/misc/lapacke_mangling.h b/Eigen/src/misc/lapacke_mangling.h
index 6211fd1..d852de7 100644
--- a/Eigen/src/misc/lapacke_mangling.h
+++ b/Eigen/src/misc/lapacke_mangling.h
@@ -3,15 +3,14 @@
 
 #ifndef LAPACK_GLOBAL
 #if defined(LAPACK_GLOBAL_PATTERN_LC) || defined(ADD_)
-#define LAPACK_GLOBAL(lcname,UCNAME)  lcname##_
+#define LAPACK_GLOBAL(lcname, UCNAME) lcname##_
 #elif defined(LAPACK_GLOBAL_PATTERN_UC) || defined(UPPER)
-#define LAPACK_GLOBAL(lcname,UCNAME)  UCNAME
+#define LAPACK_GLOBAL(lcname, UCNAME) UCNAME
 #elif defined(LAPACK_GLOBAL_PATTERN_MC) || defined(NOCHANGE)
-#define LAPACK_GLOBAL(lcname,UCNAME)  lcname
+#define LAPACK_GLOBAL(lcname, UCNAME) lcname
 #else
-#define LAPACK_GLOBAL(lcname,UCNAME)  lcname##_
+#define LAPACK_GLOBAL(lcname, UCNAME) lcname##_
 #endif
 #endif
 
 #endif
-
diff --git a/Eigen/src/plugins/ArrayCwiseBinaryOps.inc b/Eigen/src/plugins/ArrayCwiseBinaryOps.inc
index 35461da..10c7a3e 100644
--- a/Eigen/src/plugins/ArrayCwiseBinaryOps.inc
+++ b/Eigen/src/plugins/ArrayCwiseBinaryOps.inc
@@ -1,310 +1,307 @@
 
 /** \returns an expression of the coefficient wise product of \c *this and \a other
-  *
-  * \sa MatrixBase::cwiseProduct
-  */
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC
-EIGEN_STRONG_INLINE const EIGEN_CWISE_BINARY_RETURN_TYPE(Derived,OtherDerived,product)
-operator*(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const
-{
-  return EIGEN_CWISE_BINARY_RETURN_TYPE(Derived,OtherDerived,product)(derived(), other.derived());
+ *
+ * \sa MatrixBase::cwiseProduct
+ */
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const EIGEN_CWISE_BINARY_RETURN_TYPE(Derived, OtherDerived, product) operator*(
+    const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const {
+  return EIGEN_CWISE_BINARY_RETURN_TYPE(Derived, OtherDerived, product)(derived(), other.derived());
 }
 
 /** \returns an expression of the coefficient wise quotient of \c *this and \a other
-  *
-  * \sa MatrixBase::cwiseQuotient
-  */
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC
-EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_quotient_op<Scalar,typename OtherDerived::Scalar>, const Derived, const OtherDerived>
-operator/(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const
-{
-  return CwiseBinaryOp<internal::scalar_quotient_op<Scalar,typename OtherDerived::Scalar>, const Derived, const OtherDerived>(derived(), other.derived());
+ *
+ * \sa MatrixBase::cwiseQuotient
+ */
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseBinaryOp<
+    internal::scalar_quotient_op<Scalar, typename OtherDerived::Scalar>, const Derived, const OtherDerived>
+operator/(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const {
+  return CwiseBinaryOp<internal::scalar_quotient_op<Scalar, typename OtherDerived::Scalar>, const Derived,
+                       const OtherDerived>(derived(), other.derived());
 }
 
 /** \returns an expression of the coefficient-wise min of \c *this and \a other
-  *
-  * Example: \include Cwise_min.cpp
-  * Output: \verbinclude Cwise_min.out
-  *
-  * \sa max()
-  */
-template <int NaNPropagation=PropagateFast, typename OtherDerived>
-EIGEN_DEVICE_FUNC
-EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_min_op<Scalar,Scalar,NaNPropagation>, const Derived, const OtherDerived>
+ *
+ * Example: \include Cwise_min.cpp
+ * Output: \verbinclude Cwise_min.out
+ *
+ * \sa max()
+ */
+template <int NaNPropagation = PropagateFast, typename OtherDerived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const
+    CwiseBinaryOp<internal::scalar_min_op<Scalar, Scalar, NaNPropagation>, const Derived, const OtherDerived>
 #ifdef EIGEN_PARSED_BY_DOXYGEN
-min
+    min
 #else
-(min)
+    (min)
 #endif
-(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const
-{
-  return CwiseBinaryOp<internal::scalar_min_op<Scalar,Scalar,NaNPropagation>, const Derived, const OtherDerived>(derived(), other.derived());
+    (const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const {
+  return CwiseBinaryOp<internal::scalar_min_op<Scalar, Scalar, NaNPropagation>, const Derived, const OtherDerived>(
+      derived(), other.derived());
 }
 
 /** \returns an expression of the coefficient-wise min of \c *this and scalar \a other
-  *
-  * \sa max()
-  */
-template <int NaNPropagation=PropagateFast>
-EIGEN_DEVICE_FUNC
-EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_min_op<Scalar,Scalar,NaNPropagation>, const Derived,
-    const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject> >
+ *
+ * \sa max()
+ */
+template <int NaNPropagation = PropagateFast>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const
+    CwiseBinaryOp<internal::scalar_min_op<Scalar, Scalar, NaNPropagation>, const Derived,
+                  const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject> >
 #ifdef EIGEN_PARSED_BY_DOXYGEN
-min
+    min
 #else
-(min)
+    (min)
 #endif
-(const Scalar &other) const
-{
+    (const Scalar &other) const {
   return (min<NaNPropagation>)(Derived::PlainObject::Constant(rows(), cols(), other));
 }
 
 /** \returns an expression of the coefficient-wise max of \c *this and \a other
-  *
-  * Example: \include Cwise_max.cpp
-  * Output: \verbinclude Cwise_max.out
-  *
-  * \sa min()
-  */
-template <int NaNPropagation=PropagateFast, typename OtherDerived>
-EIGEN_DEVICE_FUNC
-EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_max_op<Scalar,Scalar,NaNPropagation>, const Derived, const OtherDerived>
+ *
+ * Example: \include Cwise_max.cpp
+ * Output: \verbinclude Cwise_max.out
+ *
+ * \sa min()
+ */
+template <int NaNPropagation = PropagateFast, typename OtherDerived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const
+    CwiseBinaryOp<internal::scalar_max_op<Scalar, Scalar, NaNPropagation>, const Derived, const OtherDerived>
 #ifdef EIGEN_PARSED_BY_DOXYGEN
-max
+    max
 #else
-(max)
+    (max)
 #endif
-(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const
-{
-  return CwiseBinaryOp<internal::scalar_max_op<Scalar,Scalar,NaNPropagation>, const Derived, const OtherDerived>(derived(), other.derived());
+    (const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const {
+  return CwiseBinaryOp<internal::scalar_max_op<Scalar, Scalar, NaNPropagation>, const Derived, const OtherDerived>(
+      derived(), other.derived());
 }
 
 /** \returns an expression of the coefficient-wise max of \c *this and scalar \a other
-  *
-  * \sa min()
-  */
-template <int NaNPropagation=PropagateFast>
-EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_max_op<Scalar,Scalar,NaNPropagation>, const Derived,
-                                        const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject> >
+ *
+ * \sa min()
+ */
+template <int NaNPropagation = PropagateFast>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const
+    CwiseBinaryOp<internal::scalar_max_op<Scalar, Scalar, NaNPropagation>, const Derived,
+                  const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject> >
 #ifdef EIGEN_PARSED_BY_DOXYGEN
-max
+    max
 #else
-(max)
+    (max)
 #endif
-(const Scalar &other) const
-{
+    (const Scalar &other) const {
   return (max<NaNPropagation>)(Derived::PlainObject::Constant(rows(), cols(), other));
 }
 
 /** \returns an expression of the coefficient-wise absdiff of \c *this and \a other
-  *
-  * Example: \include Cwise_absolute_difference.cpp
-  * Output: \verbinclude Cwise_absolute_difference.out
-  *
-  * \sa absolute_difference()
-  */
-EIGEN_MAKE_CWISE_BINARY_OP(absolute_difference,absolute_difference)
+ *
+ * Example: \include Cwise_absolute_difference.cpp
+ * Output: \verbinclude Cwise_absolute_difference.out
+ *
+ * \sa absolute_difference()
+ */
+EIGEN_MAKE_CWISE_BINARY_OP(absolute_difference, absolute_difference)
 
 /** \returns an expression of the coefficient-wise absolute_difference of \c *this and scalar \a other
-  *
-  * \sa absolute_difference()
-  */
-EIGEN_DEVICE_FUNC
-EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_absolute_difference_op<Scalar,Scalar>, const Derived,
-                                        const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject> >
+ *
+ * \sa absolute_difference()
+ */
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const
+    CwiseBinaryOp<internal::scalar_absolute_difference_op<Scalar, Scalar>, const Derived,
+                  const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject> >
 #ifdef EIGEN_PARSED_BY_DOXYGEN
-absolute_difference
+    absolute_difference
 #else
-(absolute_difference)
+    (absolute_difference)
 #endif
-(const Scalar &other) const
-{
+    (const Scalar &other) const {
   return (absolute_difference)(Derived::PlainObject::Constant(rows(), cols(), other));
 }
 
 /** \returns an expression of the coefficient-wise power of \c *this to the given array of \a exponents.
-  *
-  * This function computes the coefficient-wise power.
-  *
-  * Example: \include Cwise_array_power_array.cpp
-  * Output: \verbinclude Cwise_array_power_array.out
-  */
-EIGEN_MAKE_CWISE_BINARY_OP(pow,pow)
+ *
+ * This function computes the coefficient-wise power.
+ *
+ * Example: \include Cwise_array_power_array.cpp
+ * Output: \verbinclude Cwise_array_power_array.out
+ */
+EIGEN_MAKE_CWISE_BINARY_OP(pow, pow)
 
 /** \returns an expression of the coefficient-wise atan2(\c *this, \a y), where \a y is the given array argument.
-  *
-  * This function computes the coefficient-wise atan2.
-  *
-  */
-EIGEN_MAKE_CWISE_BINARY_OP(atan2,atan2)
-
+ *
+ * This function computes the coefficient-wise atan2.
+ *
+ */
+EIGEN_MAKE_CWISE_BINARY_OP(atan2, atan2)
 
 // TODO code generating macros could be moved to Macros.h and could include generation of documentation
-#define EIGEN_MAKE_CWISE_COMP_OP(OP, COMPARATOR) \
-template<typename OtherDerived> \
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_cmp_op<Scalar, typename OtherDerived::Scalar, internal::cmp_ ## COMPARATOR>, const Derived, const OtherDerived> \
-OP(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const \
-{ \
-  return CwiseBinaryOp<internal::scalar_cmp_op<Scalar, typename OtherDerived::Scalar, internal::cmp_ ## COMPARATOR>, const Derived, const OtherDerived>(derived(), other.derived()); \
-}\
-typedef CwiseBinaryOp<internal::scalar_cmp_op<Scalar,Scalar, internal::cmp_ ## COMPARATOR>, const Derived, const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject> > Cmp ## COMPARATOR ## ReturnType; \
-typedef CwiseBinaryOp<internal::scalar_cmp_op<Scalar,Scalar, internal::cmp_ ## COMPARATOR>, const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject>, const Derived > RCmp ## COMPARATOR ## ReturnType; \
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Cmp ## COMPARATOR ## ReturnType \
-OP(const Scalar& s) const { \
-  return this->OP(Derived::PlainObject::Constant(rows(), cols(), s)); \
-} \
-EIGEN_DEVICE_FUNC friend EIGEN_STRONG_INLINE const RCmp ## COMPARATOR ## ReturnType \
-OP(const Scalar& s, const EIGEN_CURRENT_STORAGE_BASE_CLASS<Derived>& d) { \
-  return Derived::PlainObject::Constant(d.rows(), d.cols(), s).OP(d); \
-}
+#define EIGEN_MAKE_CWISE_COMP_OP(OP, COMPARATOR)                                                                     \
+  template <typename OtherDerived>                                                                                   \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const                                                                        \
+      CwiseBinaryOp<internal::scalar_cmp_op<Scalar, typename OtherDerived::Scalar, internal::cmp_##COMPARATOR>,      \
+                    const Derived, const OtherDerived>                                                               \
+      OP(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const {                                        \
+    return CwiseBinaryOp<internal::scalar_cmp_op<Scalar, typename OtherDerived::Scalar, internal::cmp_##COMPARATOR>, \
+                         const Derived, const OtherDerived>(derived(), other.derived());                             \
+  }                                                                                                                  \
+  typedef CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_##COMPARATOR>, const Derived,          \
+                        const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject> >                    \
+      Cmp##COMPARATOR##ReturnType;                                                                                   \
+  typedef CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_##COMPARATOR>,                         \
+                        const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject>, const Derived>      \
+      RCmp##COMPARATOR##ReturnType;                                                                                  \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Cmp##COMPARATOR##ReturnType OP(const Scalar &s) const {                \
+    return this->OP(Derived::PlainObject::Constant(rows(), cols(), s));                                              \
+  }                                                                                                                  \
+  EIGEN_DEVICE_FUNC friend EIGEN_STRONG_INLINE const RCmp##COMPARATOR##ReturnType OP(                                \
+      const Scalar &s, const EIGEN_CURRENT_STORAGE_BASE_CLASS<Derived> &d) {                                         \
+    return Derived::PlainObject::Constant(d.rows(), d.cols(), s).OP(d);                                              \
+  }
 
-#define EIGEN_MAKE_CWISE_COMP_R_OP(OP, R_OP, RCOMPARATOR) \
-template<typename OtherDerived> \
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_cmp_op<typename OtherDerived::Scalar, Scalar, internal::cmp_##RCOMPARATOR>, const OtherDerived, const Derived> \
-OP(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const \
-{ \
-  return CwiseBinaryOp<internal::scalar_cmp_op<typename OtherDerived::Scalar, Scalar, internal::cmp_##RCOMPARATOR>, const OtherDerived, const Derived>(other.derived(), derived()); \
-} \
-EIGEN_DEVICE_FUNC \
-inline const RCmp ## RCOMPARATOR ## ReturnType \
-OP(const Scalar& s) const { \
-  return Derived::PlainObject::Constant(rows(), cols(), s).R_OP(*this); \
-} \
-friend inline const Cmp ## RCOMPARATOR ## ReturnType \
-OP(const Scalar& s, const Derived& d) { \
-  return d.R_OP(Derived::PlainObject::Constant(d.rows(), d.cols(), s)); \
-}
-
-
+#define EIGEN_MAKE_CWISE_COMP_R_OP(OP, R_OP, RCOMPARATOR)                                                             \
+  template <typename OtherDerived>                                                                                    \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const                                                                         \
+      CwiseBinaryOp<internal::scalar_cmp_op<typename OtherDerived::Scalar, Scalar, internal::cmp_##RCOMPARATOR>,      \
+                    const OtherDerived, const Derived>                                                                \
+      OP(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const {                                         \
+    return CwiseBinaryOp<internal::scalar_cmp_op<typename OtherDerived::Scalar, Scalar, internal::cmp_##RCOMPARATOR>, \
+                         const OtherDerived, const Derived>(other.derived(), derived());                              \
+  }                                                                                                                   \
+  EIGEN_DEVICE_FUNC inline const RCmp##RCOMPARATOR##ReturnType OP(const Scalar &s) const {                            \
+    return Derived::PlainObject::Constant(rows(), cols(), s).R_OP(*this);                                             \
+  }                                                                                                                   \
+  friend inline const Cmp##RCOMPARATOR##ReturnType OP(const Scalar &s, const Derived &d) {                            \
+    return d.R_OP(Derived::PlainObject::Constant(d.rows(), d.cols(), s));                                             \
+  }
 
 /** \returns an expression of the coefficient-wise \< operator of *this and \a other
-  *
-  * Example: \include Cwise_less.cpp
-  * Output: \verbinclude Cwise_less.out
-  *
-  * \sa all(), any(), operator>(), operator<=()
-  */
+ *
+ * Example: \include Cwise_less.cpp
+ * Output: \verbinclude Cwise_less.out
+ *
+ * \sa all(), any(), operator>(), operator<=()
+ */
 EIGEN_MAKE_CWISE_COMP_OP(operator<, LT)
 
 /** \returns an expression of the coefficient-wise \<= operator of *this and \a other
-  *
-  * Example: \include Cwise_less_equal.cpp
-  * Output: \verbinclude Cwise_less_equal.out
-  *
-  * \sa all(), any(), operator>=(), operator<()
-  */
+ *
+ * Example: \include Cwise_less_equal.cpp
+ * Output: \verbinclude Cwise_less_equal.out
+ *
+ * \sa all(), any(), operator>=(), operator<()
+ */
 EIGEN_MAKE_CWISE_COMP_OP(operator<=, LE)
 
 /** \returns an expression of the coefficient-wise \> operator of *this and \a other
-  *
-  * Example: \include Cwise_greater.cpp
-  * Output: \verbinclude Cwise_greater.out
-  *
-  * \sa all(), any(), operator>=(), operator<()
-  */
+ *
+ * Example: \include Cwise_greater.cpp
+ * Output: \verbinclude Cwise_greater.out
+ *
+ * \sa all(), any(), operator>=(), operator<()
+ */
 EIGEN_MAKE_CWISE_COMP_R_OP(operator>, operator<, LT)
 
 /** \returns an expression of the coefficient-wise \>= operator of *this and \a other
-  *
-  * Example: \include Cwise_greater_equal.cpp
-  * Output: \verbinclude Cwise_greater_equal.out
-  *
-  * \sa all(), any(), operator>(), operator<=()
-  */
+ *
+ * Example: \include Cwise_greater_equal.cpp
+ * Output: \verbinclude Cwise_greater_equal.out
+ *
+ * \sa all(), any(), operator>(), operator<=()
+ */
 EIGEN_MAKE_CWISE_COMP_R_OP(operator>=, operator<=, LE)
 
 /** \returns an expression of the coefficient-wise == operator of *this and \a other
-  *
-  * \warning this performs an exact comparison, which is generally a bad idea with floating-point types.
-  * In order to check for equality between two vectors or matrices with floating-point coefficients, it is
-  * generally a far better idea to use a fuzzy comparison as provided by isApprox() and
-  * isMuchSmallerThan().
-  *
-  * Example: \include Cwise_equal_equal.cpp
-  * Output: \verbinclude Cwise_equal_equal.out
-  *
-  * \sa all(), any(), isApprox(), isMuchSmallerThan()
-  */
+ *
+ * \warning this performs an exact comparison, which is generally a bad idea with floating-point types.
+ * In order to check for equality between two vectors or matrices with floating-point coefficients, it is
+ * generally a far better idea to use a fuzzy comparison as provided by isApprox() and
+ * isMuchSmallerThan().
+ *
+ * Example: \include Cwise_equal_equal.cpp
+ * Output: \verbinclude Cwise_equal_equal.out
+ *
+ * \sa all(), any(), isApprox(), isMuchSmallerThan()
+ */
 EIGEN_MAKE_CWISE_COMP_OP(operator==, EQ)
 
 /** \returns an expression of the coefficient-wise != operator of *this and \a other
-  *
-  * \warning this performs an exact comparison, which is generally a bad idea with floating-point types.
-  * In order to check for equality between two vectors or matrices with floating-point coefficients, it is
-  * generally a far better idea to use a fuzzy comparison as provided by isApprox() and
-  * isMuchSmallerThan().
-  *
-  * Example: \include Cwise_not_equal.cpp
-  * Output: \verbinclude Cwise_not_equal.out
-  *
-  * \sa all(), any(), isApprox(), isMuchSmallerThan()
-  */
+ *
+ * \warning this performs an exact comparison, which is generally a bad idea with floating-point types.
+ * In order to check for equality between two vectors or matrices with floating-point coefficients, it is
+ * generally a far better idea to use a fuzzy comparison as provided by isApprox() and
+ * isMuchSmallerThan().
+ *
+ * Example: \include Cwise_not_equal.cpp
+ * Output: \verbinclude Cwise_not_equal.out
+ *
+ * \sa all(), any(), isApprox(), isMuchSmallerThan()
+ */
 EIGEN_MAKE_CWISE_COMP_OP(operator!=, NEQ)
 
-
 #undef EIGEN_MAKE_CWISE_COMP_OP
 #undef EIGEN_MAKE_CWISE_COMP_R_OP
 
 // scalar addition
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-EIGEN_MAKE_SCALAR_BINARY_OP(operator+,sum)
+EIGEN_MAKE_SCALAR_BINARY_OP(operator+, sum)
 #else
 /** \returns an expression of \c *this with each coeff incremented by the constant \a scalar
-  *
-  * \tparam T is the scalar type of \a scalar. It must be compatible with the scalar type of the given expression.
-  *
-  * Example: \include Cwise_plus.cpp
-  * Output: \verbinclude Cwise_plus.out
-  *
-  * \sa operator+=(), operator-()
-  */
-template<typename T>
-const CwiseBinaryOp<internal::scalar_sum_op<Scalar,T>,Derived,Constant<T> > operator+(const T& scalar) const;
+ *
+ * \tparam T is the scalar type of \a scalar. It must be compatible with the scalar type of the given expression.
+ *
+ * Example: \include Cwise_plus.cpp
+ * Output: \verbinclude Cwise_plus.out
+ *
+ * \sa operator+=(), operator-()
+ */
+template <typename T>
+const CwiseBinaryOp<internal::scalar_sum_op<Scalar, T>, Derived, Constant<T> > operator+(const T &scalar) const;
 /** \returns an expression of \a expr with each coeff incremented by the constant \a scalar
-  *
-  * \tparam T is the scalar type of \a scalar. It must be compatible with the scalar type of the given expression.
-  */
-template<typename T> friend
-const CwiseBinaryOp<internal::scalar_sum_op<T,Scalar>,Constant<T>,Derived> operator+(const T& scalar, const StorageBaseType& expr);
+ *
+ * \tparam T is the scalar type of \a scalar. It must be compatible with the scalar type of the given expression.
+ */
+template <typename T>
+friend const CwiseBinaryOp<internal::scalar_sum_op<T, Scalar>, Constant<T>, Derived> operator+(
+    const T &scalar, const StorageBaseType &expr);
 #endif
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-EIGEN_MAKE_SCALAR_BINARY_OP(operator-,difference)
+EIGEN_MAKE_SCALAR_BINARY_OP(operator-, difference)
 #else
 /** \returns an expression of \c *this with each coeff decremented by the constant \a scalar
-  *
-  * \tparam T is the scalar type of \a scalar. It must be compatible with the scalar type of the given expression.
-  *
-  * Example: \include Cwise_minus.cpp
-  * Output: \verbinclude Cwise_minus.out
-  *
-  * \sa operator+=(), operator-()
-  */
-template<typename T>
-const CwiseBinaryOp<internal::scalar_difference_op<Scalar,T>,Derived,Constant<T> > operator-(const T& scalar) const;
+ *
+ * \tparam T is the scalar type of \a scalar. It must be compatible with the scalar type of the given expression.
+ *
+ * Example: \include Cwise_minus.cpp
+ * Output: \verbinclude Cwise_minus.out
+ *
+ * \sa operator+=(), operator-()
+ */
+template <typename T>
+const CwiseBinaryOp<internal::scalar_difference_op<Scalar, T>, Derived, Constant<T> > operator-(const T &scalar) const;
 /** \returns an expression of the constant matrix of value \a scalar decremented by the coefficients of \a expr
-  *
-  * \tparam T is the scalar type of \a scalar. It must be compatible with the scalar type of the given expression.
-  */
-template<typename T> friend
-const CwiseBinaryOp<internal::scalar_difference_op<T,Scalar>,Constant<T>,Derived> operator-(const T& scalar, const StorageBaseType& expr);
+ *
+ * \tparam T is the scalar type of \a scalar. It must be compatible with the scalar type of the given expression.
+ */
+template <typename T>
+friend const CwiseBinaryOp<internal::scalar_difference_op<T, Scalar>, Constant<T>, Derived> operator-(
+    const T &scalar, const StorageBaseType &expr);
 #endif
 
-
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-  EIGEN_MAKE_SCALAR_BINARY_OP_ONTHELEFT(operator/,quotient)
+EIGEN_MAKE_SCALAR_BINARY_OP_ONTHELEFT(operator/, quotient)
 #else
-  /**
-    * \brief Component-wise division of the scalar \a s by array elements of \a a.
-    *
-    * \tparam Scalar is the scalar type of \a x. It must be compatible with the scalar type of the given array expression (\c Derived::Scalar).
-    */
-  template<typename T> friend
-  inline const CwiseBinaryOp<internal::scalar_quotient_op<T,Scalar>,Constant<T>,Derived>
-  operator/(const T& s,const StorageBaseType& a);
+/**
+ * \brief Component-wise division of the scalar \a s by array elements of \a a.
+ *
+ * \tparam Scalar is the scalar type of \a x. It must be compatible with the scalar type of the given array expression
+ * (\c Derived::Scalar).
+ */
+template <typename T>
+friend inline const CwiseBinaryOp<internal::scalar_quotient_op<T, Scalar>, Constant<T>, Derived> operator/(
+    const T &s, const StorageBaseType &a);
 #endif
 
 // NOTE disabled until we agree on argument order
@@ -328,24 +325,23 @@
 #endif
 
 /** \returns an expression of the coefficient-wise zeta function.
-  *
-  * \specialfunctions_module
-  *
-  * It returns the Riemann zeta function of two arguments \c *this and \a q:
-  *
-  * \param q is the shift, it must be > 0
-  *
-  * \note *this is the exponent, it must be > 1.
-  * \note This function supports only float and double scalar types. To support other scalar types, the user has
-  * to provide implementations of zeta(T,T) for any scalar type T to be supported.
-  *
-  * This method is an alias for zeta(*this,q);
-  *
-  * \sa Eigen::zeta()
-  */
-template<typename DerivedQ>
-inline const CwiseBinaryOp<internal::scalar_zeta_op<Scalar>, const Derived, const DerivedQ>
-zeta(const EIGEN_CURRENT_STORAGE_BASE_CLASS<DerivedQ> &q) const
-{
+ *
+ * \specialfunctions_module
+ *
+ * It returns the Riemann zeta function of two arguments \c *this and \a q:
+ *
+ * \param q is the shift, it must be > 0
+ *
+ * \note *this is the exponent, it must be > 1.
+ * \note This function supports only float and double scalar types. To support other scalar types, the user has
+ * to provide implementations of zeta(T,T) for any scalar type T to be supported.
+ *
+ * This method is an alias for zeta(*this,q);
+ *
+ * \sa Eigen::zeta()
+ */
+template <typename DerivedQ>
+inline const CwiseBinaryOp<internal::scalar_zeta_op<Scalar>, const Derived, const DerivedQ> zeta(
+    const EIGEN_CURRENT_STORAGE_BASE_CLASS<DerivedQ> &q) const {
   return CwiseBinaryOp<internal::scalar_zeta_op<Scalar>, const Derived, const DerivedQ>(this->derived(), q.derived());
 }
diff --git a/Eigen/src/plugins/ArrayCwiseUnaryOps.inc b/Eigen/src/plugins/ArrayCwiseUnaryOps.inc
index b012326..d03edc2 100644
--- a/Eigen/src/plugins/ArrayCwiseUnaryOps.inc
+++ b/Eigen/src/plugins/ArrayCwiseUnaryOps.inc
@@ -42,584 +42,384 @@
 typedef CwiseUnaryOp<internal::scalar_isfinite_op<Scalar>, const Derived> IsFiniteReturnType;
 
 /** \returns an expression of the coefficient-wise absolute value of \c *this
-  *
-  * Example: \include Cwise_abs.cpp
-  * Output: \verbinclude Cwise_abs.out
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_abs">Math functions</a>, abs2()
-  */
-EIGEN_DEVICE_FUNC
-EIGEN_STRONG_INLINE const AbsReturnType
-abs() const
-{
-  return AbsReturnType(derived());
-}
+ *
+ * Example: \include Cwise_abs.cpp
+ * Output: \verbinclude Cwise_abs.out
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_abs">Math functions</a>, abs2()
+ */
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const AbsReturnType abs() const { return AbsReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise phase angle of \c *this
-  *
-  * Example: \include Cwise_arg.cpp
-  * Output: \verbinclude Cwise_arg.out
-  *
-  * \sa abs()
-  */
-EIGEN_DEVICE_FUNC
-EIGEN_STRONG_INLINE const ArgReturnType
-arg() const
-{
-  return ArgReturnType(derived());
-}
+ *
+ * Example: \include Cwise_arg.cpp
+ * Output: \verbinclude Cwise_arg.out
+ *
+ * \sa abs()
+ */
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const ArgReturnType arg() const { return ArgReturnType(derived()); }
 
-EIGEN_DEVICE_FUNC
-EIGEN_STRONG_INLINE const CArgReturnType
-carg() const { return CArgReturnType(derived()); }
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CArgReturnType carg() const { return CArgReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise squared absolute value of \c *this
-  *
-  * Example: \include Cwise_abs2.cpp
-  * Output: \verbinclude Cwise_abs2.out
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_abs2">Math functions</a>, abs(), square()
-  */
-EIGEN_DEVICE_FUNC
-EIGEN_STRONG_INLINE const Abs2ReturnType
-abs2() const
-{
-  return Abs2ReturnType(derived());
-}
+ *
+ * Example: \include Cwise_abs2.cpp
+ * Output: \verbinclude Cwise_abs2.out
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_abs2">Math functions</a>, abs(), square()
+ */
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Abs2ReturnType abs2() const { return Abs2ReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise exponential of *this.
-  *
-  * This function computes the coefficient-wise exponential. The function MatrixBase::exp() in the
-  * unsupported module MatrixFunctions computes the matrix exponential.
-  *
-  * Example: \include Cwise_exp.cpp
-  * Output: \verbinclude Cwise_exp.out
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_exp">Math functions</a>, pow(), log(), sin(), cos()
-  */
-EIGEN_DEVICE_FUNC
-inline const ExpReturnType
-exp() const
-{
-  return ExpReturnType(derived());
-}
+ *
+ * This function computes the coefficient-wise exponential. The function MatrixBase::exp() in the
+ * unsupported module MatrixFunctions computes the matrix exponential.
+ *
+ * Example: \include Cwise_exp.cpp
+ * Output: \verbinclude Cwise_exp.out
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_exp">Math functions</a>, pow(), log(), sin(), cos()
+ */
+EIGEN_DEVICE_FUNC inline const ExpReturnType exp() const { return ExpReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise exponential of *this minus 1.
-  *
-  * In exact arithmetic, \c x.expm1() is equivalent to \c x.exp() - 1,
-  * however, with finite precision, this function is much more accurate when \c x is close to zero.
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_expm1">Math functions</a>, exp()
-  */
-EIGEN_DEVICE_FUNC
-inline const Expm1ReturnType
-expm1() const
-{
-  return Expm1ReturnType(derived());
-}
+ *
+ * In exact arithmetic, \c x.expm1() is equivalent to \c x.exp() - 1,
+ * however, with finite precision, this function is much more accurate when \c x is close to zero.
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_expm1">Math functions</a>, exp()
+ */
+EIGEN_DEVICE_FUNC inline const Expm1ReturnType expm1() const { return Expm1ReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise logarithm of *this.
-  *
-  * This function computes the coefficient-wise logarithm. The function MatrixBase::log() in the
-  * unsupported module MatrixFunctions computes the matrix logarithm.
-  *
-  * Example: \include Cwise_log.cpp
-  * Output: \verbinclude Cwise_log.out
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_log">Math functions</a>, log()
-  */
-EIGEN_DEVICE_FUNC
-inline const LogReturnType
-log() const
-{
-  return LogReturnType(derived());
-}
+ *
+ * This function computes the coefficient-wise logarithm. The function MatrixBase::log() in the
+ * unsupported module MatrixFunctions computes the matrix logarithm.
+ *
+ * Example: \include Cwise_log.cpp
+ * Output: \verbinclude Cwise_log.out
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_log">Math functions</a>, log()
+ */
+EIGEN_DEVICE_FUNC inline const LogReturnType log() const { return LogReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise logarithm of 1 plus \c *this.
-  *
-  * In exact arithmetic, \c x.log() is equivalent to \c (x+1).log(),
-  * however, with finite precision, this function is much more accurate when \c x is close to zero.
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_log1p">Math functions</a>, log()
-  */
-EIGEN_DEVICE_FUNC
-inline const Log1pReturnType
-log1p() const
-{
-  return Log1pReturnType(derived());
-}
+ *
+ * In exact arithmetic, \c x.log() is equivalent to \c (x+1).log(),
+ * however, with finite precision, this function is much more accurate when \c x is close to zero.
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_log1p">Math functions</a>, log()
+ */
+EIGEN_DEVICE_FUNC inline const Log1pReturnType log1p() const { return Log1pReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise base-10 logarithm of *this.
-  *
-  * This function computes the coefficient-wise base-10 logarithm.
-  *
-  * Example: \include Cwise_log10.cpp
-  * Output: \verbinclude Cwise_log10.out
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_log10">Math functions</a>, log()
-  */
-EIGEN_DEVICE_FUNC
-inline const Log10ReturnType
-log10() const
-{
-  return Log10ReturnType(derived());
-}
+ *
+ * This function computes the coefficient-wise base-10 logarithm.
+ *
+ * Example: \include Cwise_log10.cpp
+ * Output: \verbinclude Cwise_log10.out
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_log10">Math functions</a>, log()
+ */
+EIGEN_DEVICE_FUNC inline const Log10ReturnType log10() const { return Log10ReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise base-2 logarithm of *this.
-  *
-  * This function computes the coefficient-wise base-2 logarithm.
-  *
-  */
-EIGEN_DEVICE_FUNC
-inline const Log2ReturnType
-log2() const
-{
-  return Log2ReturnType(derived());
-}
+ *
+ * This function computes the coefficient-wise base-2 logarithm.
+ *
+ */
+EIGEN_DEVICE_FUNC inline const Log2ReturnType log2() const { return Log2ReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise square root of *this.
-  *
-  * This function computes the coefficient-wise square root. The function MatrixBase::sqrt() in the
-  * unsupported module MatrixFunctions computes the matrix square root.
-  *
-  * Example: \include Cwise_sqrt.cpp
-  * Output: \verbinclude Cwise_sqrt.out
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_sqrt">Math functions</a>, pow(), square(), cbrt()
-  */
-EIGEN_DEVICE_FUNC
-inline const SqrtReturnType
-sqrt() const
-{
-  return SqrtReturnType(derived());
-}
+ *
+ * This function computes the coefficient-wise square root. The function MatrixBase::sqrt() in the
+ * unsupported module MatrixFunctions computes the matrix square root.
+ *
+ * Example: \include Cwise_sqrt.cpp
+ * Output: \verbinclude Cwise_sqrt.out
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_sqrt">Math functions</a>, pow(), square(), cbrt()
+ */
+EIGEN_DEVICE_FUNC inline const SqrtReturnType sqrt() const { return SqrtReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise cube root of *this.
-  *
-  * This function computes the coefficient-wise cube root. 
-  *
-  * Example: \include Cwise_cbrt.cpp
-  * Output: \verbinclude Cwise_cbrt.out
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_cbrt">Math functions</a>, sqrt(), pow(), square()
-  */
-EIGEN_DEVICE_FUNC
-inline const CbrtReturnType
-cbrt() const
-{
-  return CbrtReturnType(derived());
-}
+ *
+ * This function computes the coefficient-wise cube root.
+ *
+ * Example: \include Cwise_cbrt.cpp
+ * Output: \verbinclude Cwise_cbrt.out
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_cbrt">Math functions</a>, sqrt(), pow(), square()
+ */
+EIGEN_DEVICE_FUNC inline const CbrtReturnType cbrt() const { return CbrtReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise inverse square root of *this.
-  *
-  * This function computes the coefficient-wise inverse square root.
-  *
-  * Example: \include Cwise_sqrt.cpp
-  * Output: \verbinclude Cwise_sqrt.out
-  *
-  * \sa pow(), square()
-  */
-EIGEN_DEVICE_FUNC
-inline const RsqrtReturnType
-rsqrt() const
-{
-  return RsqrtReturnType(derived());
-}
+ *
+ * This function computes the coefficient-wise inverse square root.
+ *
+ * Example: \include Cwise_sqrt.cpp
+ * Output: \verbinclude Cwise_sqrt.out
+ *
+ * \sa pow(), square()
+ */
+EIGEN_DEVICE_FUNC inline const RsqrtReturnType rsqrt() const { return RsqrtReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise signum of *this.
-  *
-  * This function computes the coefficient-wise signum.
-  *
-  * Example: \include Cwise_sign.cpp
-  * Output: \verbinclude Cwise_sign.out
-  *
-  * \sa pow(), square()
-  */
-EIGEN_DEVICE_FUNC
-inline const SignReturnType
-sign() const
-{
-  return SignReturnType(derived());
-}
-
+ *
+ * This function computes the coefficient-wise signum.
+ *
+ * Example: \include Cwise_sign.cpp
+ * Output: \verbinclude Cwise_sign.out
+ *
+ * \sa pow(), square()
+ */
+EIGEN_DEVICE_FUNC inline const SignReturnType sign() const { return SignReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise cosine of *this.
-  *
-  * This function computes the coefficient-wise cosine. The function MatrixBase::cos() in the
-  * unsupported module MatrixFunctions computes the matrix cosine.
-  *
-  * Example: \include Cwise_cos.cpp
-  * Output: \verbinclude Cwise_cos.out
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_cos">Math functions</a>, sin(), acos()
-  */
-EIGEN_DEVICE_FUNC
-inline const CosReturnType
-cos() const
-{
-  return CosReturnType(derived());
-}
-
+ *
+ * This function computes the coefficient-wise cosine. The function MatrixBase::cos() in the
+ * unsupported module MatrixFunctions computes the matrix cosine.
+ *
+ * Example: \include Cwise_cos.cpp
+ * Output: \verbinclude Cwise_cos.out
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_cos">Math functions</a>, sin(), acos()
+ */
+EIGEN_DEVICE_FUNC inline const CosReturnType cos() const { return CosReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise sine of *this.
-  *
-  * This function computes the coefficient-wise sine. The function MatrixBase::sin() in the
-  * unsupported module MatrixFunctions computes the matrix sine.
-  *
-  * Example: \include Cwise_sin.cpp
-  * Output: \verbinclude Cwise_sin.out
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_sin">Math functions</a>, cos(), asin()
-  */
-EIGEN_DEVICE_FUNC
-inline const SinReturnType
-sin() const
-{
-  return SinReturnType(derived());
-}
+ *
+ * This function computes the coefficient-wise sine. The function MatrixBase::sin() in the
+ * unsupported module MatrixFunctions computes the matrix sine.
+ *
+ * Example: \include Cwise_sin.cpp
+ * Output: \verbinclude Cwise_sin.out
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_sin">Math functions</a>, cos(), asin()
+ */
+EIGEN_DEVICE_FUNC inline const SinReturnType sin() const { return SinReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise tan of *this.
-  *
-  * Example: \include Cwise_tan.cpp
-  * Output: \verbinclude Cwise_tan.out
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_tan">Math functions</a>, cos(), sin()
-  */
-EIGEN_DEVICE_FUNC
-inline const TanReturnType
-tan() const
-{
-  return TanReturnType(derived());
-}
+ *
+ * Example: \include Cwise_tan.cpp
+ * Output: \verbinclude Cwise_tan.out
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_tan">Math functions</a>, cos(), sin()
+ */
+EIGEN_DEVICE_FUNC inline const TanReturnType tan() const { return TanReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise arc tan of *this.
-  *
-  * Example: \include Cwise_atan.cpp
-  * Output: \verbinclude Cwise_atan.out
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_atan">Math functions</a>, tan(), asin(), acos()
-  */
-EIGEN_DEVICE_FUNC
-inline const AtanReturnType
-atan() const
-{
-  return AtanReturnType(derived());
-}
+ *
+ * Example: \include Cwise_atan.cpp
+ * Output: \verbinclude Cwise_atan.out
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_atan">Math functions</a>, tan(), asin(), acos()
+ */
+EIGEN_DEVICE_FUNC inline const AtanReturnType atan() const { return AtanReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise arc cosine of *this.
-  *
-  * Example: \include Cwise_acos.cpp
-  * Output: \verbinclude Cwise_acos.out
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_acos">Math functions</a>, cos(), asin()
-  */
-EIGEN_DEVICE_FUNC
-inline const AcosReturnType
-acos() const
-{
-  return AcosReturnType(derived());
-}
+ *
+ * Example: \include Cwise_acos.cpp
+ * Output: \verbinclude Cwise_acos.out
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_acos">Math functions</a>, cos(), asin()
+ */
+EIGEN_DEVICE_FUNC inline const AcosReturnType acos() const { return AcosReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise arc sine of *this.
-  *
-  * Example: \include Cwise_asin.cpp
-  * Output: \verbinclude Cwise_asin.out
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_asin">Math functions</a>, sin(), acos()
-  */
-EIGEN_DEVICE_FUNC
-inline const AsinReturnType
-asin() const
-{
-  return AsinReturnType(derived());
-}
+ *
+ * Example: \include Cwise_asin.cpp
+ * Output: \verbinclude Cwise_asin.out
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_asin">Math functions</a>, sin(), acos()
+ */
+EIGEN_DEVICE_FUNC inline const AsinReturnType asin() const { return AsinReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise hyperbolic tan of *this.
-  *
-  * Example: \include Cwise_tanh.cpp
-  * Output: \verbinclude Cwise_tanh.out
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_tanh">Math functions</a>, tan(), sinh(), cosh()
-  */
-EIGEN_DEVICE_FUNC
-inline const TanhReturnType
-tanh() const
-{
-  return TanhReturnType(derived());
-}
+ *
+ * Example: \include Cwise_tanh.cpp
+ * Output: \verbinclude Cwise_tanh.out
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_tanh">Math functions</a>, tan(), sinh(), cosh()
+ */
+EIGEN_DEVICE_FUNC inline const TanhReturnType tanh() const { return TanhReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise hyperbolic sin of *this.
-  *
-  * Example: \include Cwise_sinh.cpp
-  * Output: \verbinclude Cwise_sinh.out
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_sinh">Math functions</a>, sin(), tanh(), cosh()
-  */
-EIGEN_DEVICE_FUNC
-inline const SinhReturnType
-sinh() const
-{
-  return SinhReturnType(derived());
-}
+ *
+ * Example: \include Cwise_sinh.cpp
+ * Output: \verbinclude Cwise_sinh.out
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_sinh">Math functions</a>, sin(), tanh(), cosh()
+ */
+EIGEN_DEVICE_FUNC inline const SinhReturnType sinh() const { return SinhReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise hyperbolic cos of *this.
-  *
-  * Example: \include Cwise_cosh.cpp
-  * Output: \verbinclude Cwise_cosh.out
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_cosh">Math functions</a>, tanh(), sinh(), cosh()
-  */
-EIGEN_DEVICE_FUNC
-inline const CoshReturnType
-cosh() const
-{
-  return CoshReturnType(derived());
-}
+ *
+ * Example: \include Cwise_cosh.cpp
+ * Output: \verbinclude Cwise_cosh.out
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_cosh">Math functions</a>, tanh(), sinh(), cosh()
+ */
+EIGEN_DEVICE_FUNC inline const CoshReturnType cosh() const { return CoshReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise inverse hyperbolic tan of *this.
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_atanh">Math functions</a>, atanh(), asinh(), acosh()
-  */
-EIGEN_DEVICE_FUNC
-inline const AtanhReturnType
-atanh() const
-{
-  return AtanhReturnType(derived());
-}
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_atanh">Math functions</a>, atanh(), asinh(), acosh()
+ */
+EIGEN_DEVICE_FUNC inline const AtanhReturnType atanh() const { return AtanhReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise inverse hyperbolic sin of *this.
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_asinh">Math functions</a>, atanh(), asinh(), acosh()
-  */
-EIGEN_DEVICE_FUNC
-inline const AsinhReturnType
-asinh() const
-{
-  return AsinhReturnType(derived());
-}
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_asinh">Math functions</a>, atanh(), asinh(), acosh()
+ */
+EIGEN_DEVICE_FUNC inline const AsinhReturnType asinh() const { return AsinhReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise inverse hyperbolic cos of *this.
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_acosh">Math functions</a>, atanh(), asinh(), acosh()
-  */
-EIGEN_DEVICE_FUNC
-inline const AcoshReturnType
-acosh() const
-{
-  return AcoshReturnType(derived());
-}
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_acosh">Math functions</a>, atanh(), asinh(), acosh()
+ */
+EIGEN_DEVICE_FUNC inline const AcoshReturnType acosh() const { return AcoshReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise logistic of *this.
-  */
-EIGEN_DEVICE_FUNC
-inline const LogisticReturnType
-logistic() const
-{
-  return LogisticReturnType(derived());
-}
+ */
+EIGEN_DEVICE_FUNC inline const LogisticReturnType logistic() const { return LogisticReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise inverse of *this.
-  *
-  * Example: \include Cwise_inverse.cpp
-  * Output: \verbinclude Cwise_inverse.out
-  *
-  * \sa operator/(), operator*()
-  */
-EIGEN_DEVICE_FUNC
-inline const InverseReturnType
-inverse() const
-{
-  return InverseReturnType(derived());
-}
+ *
+ * Example: \include Cwise_inverse.cpp
+ * Output: \verbinclude Cwise_inverse.out
+ *
+ * \sa operator/(), operator*()
+ */
+EIGEN_DEVICE_FUNC inline const InverseReturnType inverse() const { return InverseReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise square of *this.
-  *
-  * Example: \include Cwise_square.cpp
-  * Output: \verbinclude Cwise_square.out
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_squareE">Math functions</a>, abs2(), cube(), pow()
-  */
-EIGEN_DEVICE_FUNC
-inline const SquareReturnType
-square() const
-{
-  return SquareReturnType(derived());
-}
+ *
+ * Example: \include Cwise_square.cpp
+ * Output: \verbinclude Cwise_square.out
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_squareE">Math functions</a>, abs2(), cube(), pow()
+ */
+EIGEN_DEVICE_FUNC inline const SquareReturnType square() const { return SquareReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise cube of *this.
-  *
-  * Example: \include Cwise_cube.cpp
-  * Output: \verbinclude Cwise_cube.out
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_cube">Math functions</a>, square(), pow()
-  */
-EIGEN_DEVICE_FUNC
-inline const CubeReturnType
-cube() const
-{
-  return CubeReturnType(derived());
-}
+ *
+ * Example: \include Cwise_cube.cpp
+ * Output: \verbinclude Cwise_cube.out
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_cube">Math functions</a>, square(), pow()
+ */
+EIGEN_DEVICE_FUNC inline const CubeReturnType cube() const { return CubeReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise rint of *this.
-  *
-  * Example: \include Cwise_rint.cpp
-  * Output: \verbinclude Cwise_rint.out
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_rint">Math functions</a>, ceil(), floor()
-  */
-EIGEN_DEVICE_FUNC
-inline const RintReturnType
-rint() const
-{
-  return RintReturnType(derived());
-}
+ *
+ * Example: \include Cwise_rint.cpp
+ * Output: \verbinclude Cwise_rint.out
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_rint">Math functions</a>, ceil(), floor()
+ */
+EIGEN_DEVICE_FUNC inline const RintReturnType rint() const { return RintReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise round of *this.
-  *
-  * Example: \include Cwise_round.cpp
-  * Output: \verbinclude Cwise_round.out
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_round">Math functions</a>, ceil(), floor()
-  */
-EIGEN_DEVICE_FUNC
-inline const RoundReturnType
-round() const
-{
-  return RoundReturnType(derived());
-}
+ *
+ * Example: \include Cwise_round.cpp
+ * Output: \verbinclude Cwise_round.out
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_round">Math functions</a>, ceil(), floor()
+ */
+EIGEN_DEVICE_FUNC inline const RoundReturnType round() const { return RoundReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise floor of *this.
-  *
-  * Example: \include Cwise_floor.cpp
-  * Output: \verbinclude Cwise_floor.out
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_floor">Math functions</a>, ceil(), round()
-  */
-EIGEN_DEVICE_FUNC
-inline const FloorReturnType
-floor() const
-{
-  return FloorReturnType(derived());
-}
+ *
+ * Example: \include Cwise_floor.cpp
+ * Output: \verbinclude Cwise_floor.out
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_floor">Math functions</a>, ceil(), round()
+ */
+EIGEN_DEVICE_FUNC inline const FloorReturnType floor() const { return FloorReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise ceil of *this.
-  *
-  * Example: \include Cwise_ceil.cpp
-  * Output: \verbinclude Cwise_ceil.out
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_ceil">Math functions</a>, floor(), round()
-  */
-EIGEN_DEVICE_FUNC
-inline const CeilReturnType
-ceil() const
-{
-  return CeilReturnType(derived());
-}
+ *
+ * Example: \include Cwise_ceil.cpp
+ * Output: \verbinclude Cwise_ceil.out
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_ceil">Math functions</a>, floor(), round()
+ */
+EIGEN_DEVICE_FUNC inline const CeilReturnType ceil() const { return CeilReturnType(derived()); }
 
-template<int N> struct ShiftRightXpr {
+template <int N>
+struct ShiftRightXpr {
   typedef CwiseUnaryOp<internal::scalar_shift_right_op<Scalar, N>, const Derived> Type;
 };
 
 /** \returns an expression of \c *this with the \a Scalar type arithmetically
-  * shifted right by \a N bit positions.
-  *
-  * The template parameter \a N specifies the number of bit positions to shift.
-  * 
-  * \sa shiftLeft()
-  */
-template<int N>
-EIGEN_DEVICE_FUNC
-typename ShiftRightXpr<N>::Type
-shiftRight() const
-{
+ * shifted right by \a N bit positions.
+ *
+ * The template parameter \a N specifies the number of bit positions to shift.
+ *
+ * \sa shiftLeft()
+ */
+template <int N>
+EIGEN_DEVICE_FUNC typename ShiftRightXpr<N>::Type shiftRight() const {
   return typename ShiftRightXpr<N>::Type(derived());
 }
 
-
-template<int N> struct ShiftLeftXpr {
+template <int N>
+struct ShiftLeftXpr {
   typedef CwiseUnaryOp<internal::scalar_shift_left_op<Scalar, N>, const Derived> Type;
 };
 
 /** \returns an expression of \c *this with the \a Scalar type logically
-  * shifted left by \a N bit positions.
-  *
-  * The template parameter \a N specifies the number of bit positions to shift.
-  *
-  * \sa shiftRight()
-  */
-template<int N>
-EIGEN_DEVICE_FUNC
-typename ShiftLeftXpr<N>::Type
-shiftLeft() const
-{
+ * shifted left by \a N bit positions.
+ *
+ * The template parameter \a N specifies the number of bit positions to shift.
+ *
+ * \sa shiftRight()
+ */
+template <int N>
+EIGEN_DEVICE_FUNC typename ShiftLeftXpr<N>::Type shiftLeft() const {
   return typename ShiftLeftXpr<N>::Type(derived());
 }
 
 /** \returns an expression of the coefficient-wise isnan of *this.
-  *
-  * Example: \include Cwise_isNaN.cpp
-  * Output: \verbinclude Cwise_isNaN.out
-  *
-  * \sa isfinite(), isinf()
-  */
-EIGEN_DEVICE_FUNC
-inline const IsNaNReturnType
-isNaN() const
-{
-  return IsNaNReturnType(derived());
-}
+ *
+ * Example: \include Cwise_isNaN.cpp
+ * Output: \verbinclude Cwise_isNaN.out
+ *
+ * \sa isfinite(), isinf()
+ */
+EIGEN_DEVICE_FUNC inline const IsNaNReturnType isNaN() const { return IsNaNReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise isinf of *this.
-  *
-  * Example: \include Cwise_isInf.cpp
-  * Output: \verbinclude Cwise_isInf.out
-  *
-  * \sa isnan(), isfinite()
-  */
-EIGEN_DEVICE_FUNC
-inline const IsInfReturnType
-isInf() const
-{
-  return IsInfReturnType(derived());
-}
+ *
+ * Example: \include Cwise_isInf.cpp
+ * Output: \verbinclude Cwise_isInf.out
+ *
+ * \sa isnan(), isfinite()
+ */
+EIGEN_DEVICE_FUNC inline const IsInfReturnType isInf() const { return IsInfReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise isfinite of *this.
-  *
-  * Example: \include Cwise_isFinite.cpp
-  * Output: \verbinclude Cwise_isFinite.out
-  *
-  * \sa isnan(), isinf()
-  */
-EIGEN_DEVICE_FUNC
-inline const IsFiniteReturnType
-isFinite() const
-{
-  return IsFiniteReturnType(derived());
-}
+ *
+ * Example: \include Cwise_isFinite.cpp
+ * Output: \verbinclude Cwise_isFinite.out
+ *
+ * \sa isnan(), isinf()
+ */
+EIGEN_DEVICE_FUNC inline const IsFiniteReturnType isFinite() const { return IsFiniteReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise ! operator of *this
-  *
-  * Example: \include Cwise_boolean_not.cpp
-  * Output: \verbinclude Cwise_boolean_not.out
-  *
-  * \sa operator!=()
-  */
-EIGEN_DEVICE_FUNC
-inline const BooleanNotReturnType
-operator!() const
-{
-  return BooleanNotReturnType(derived());
-}
+ *
+ * Example: \include Cwise_boolean_not.cpp
+ * Output: \verbinclude Cwise_boolean_not.out
+ *
+ * \sa operator!=()
+ */
+EIGEN_DEVICE_FUNC inline const BooleanNotReturnType operator!() const { return BooleanNotReturnType(derived()); }
 
 /** \returns an expression of the bitwise ~ operator of *this
-  */
-EIGEN_DEVICE_FUNC
-inline const BitwiseNotReturnType
-operator~() const
-{
-  return BitwiseNotReturnType(derived());
-}
-
+ */
+EIGEN_DEVICE_FUNC inline const BitwiseNotReturnType operator~() const { return BitwiseNotReturnType(derived()); }
 
 // --- SpecialFunctions module ---
 
@@ -630,94 +430,70 @@
 typedef CwiseUnaryOp<internal::scalar_ndtri_op<Scalar>, const Derived> NdtriReturnType;
 
 /** \cpp11 \returns an expression of the coefficient-wise ln(|gamma(*this)|).
-  *
-  * \specialfunctions_module
-  *
-  * \note This function supports only float and double scalar types in c++11 mode. To support other scalar types,
-  * or float/double in non c++11 mode, the user has to provide implementations of lgamma(T) for any scalar
-  * type T to be supported.
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_lgamma">Math functions</a>, digamma()
-  */
-EIGEN_DEVICE_FUNC
-inline const LgammaReturnType
-lgamma() const
-{
-  return LgammaReturnType(derived());
-}
+ *
+ * \specialfunctions_module
+ *
+ * \note This function supports only float and double scalar types in c++11 mode. To support other scalar types,
+ * or float/double in non c++11 mode, the user has to provide implementations of lgamma(T) for any scalar
+ * type T to be supported.
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_lgamma">Math functions</a>, digamma()
+ */
+EIGEN_DEVICE_FUNC inline const LgammaReturnType lgamma() const { return LgammaReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise digamma (psi, derivative of lgamma).
-  *
-  * \specialfunctions_module
-  *
-  * \note This function supports only float and double scalar types. To support other scalar types,
-  * the user has to provide implementations of digamma(T) for any scalar
-  * type T to be supported.
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_digamma">Math functions</a>, Eigen::digamma(), Eigen::polygamma(), lgamma()
-  */
-EIGEN_DEVICE_FUNC
-inline const DigammaReturnType
-digamma() const
-{
-  return DigammaReturnType(derived());
-}
+ *
+ * \specialfunctions_module
+ *
+ * \note This function supports only float and double scalar types. To support other scalar types,
+ * the user has to provide implementations of digamma(T) for any scalar
+ * type T to be supported.
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_digamma">Math functions</a>, Eigen::digamma(),
+ * Eigen::polygamma(), lgamma()
+ */
+EIGEN_DEVICE_FUNC inline const DigammaReturnType digamma() const { return DigammaReturnType(derived()); }
 
 /** \cpp11 \returns an expression of the coefficient-wise Gauss error
-  * function of *this.
-  *
-  * \specialfunctions_module
-  *
-  * \note This function supports only float and double scalar types in c++11 mode. To support other scalar types,
-  * or float/double in non c++11 mode, the user has to provide implementations of erf(T) for any scalar
-  * type T to be supported.
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_erf">Math functions</a>, erfc()
-  */
-EIGEN_DEVICE_FUNC
-inline const ErfReturnType
-erf() const
-{
-  return ErfReturnType(derived());
-}
+ * function of *this.
+ *
+ * \specialfunctions_module
+ *
+ * \note This function supports only float and double scalar types in c++11 mode. To support other scalar types,
+ * or float/double in non c++11 mode, the user has to provide implementations of erf(T) for any scalar
+ * type T to be supported.
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_erf">Math functions</a>, erfc()
+ */
+EIGEN_DEVICE_FUNC inline const ErfReturnType erf() const { return ErfReturnType(derived()); }
 
 /** \cpp11 \returns an expression of the coefficient-wise Complementary error
-  * function of *this.
-  *
-  * \specialfunctions_module
-  *
-  * \note This function supports only float and double scalar types in c++11 mode. To support other scalar types,
-  * or float/double in non c++11 mode, the user has to provide implementations of erfc(T) for any scalar
-  * type T to be supported.
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_erfc">Math functions</a>, erf()
-  */
-EIGEN_DEVICE_FUNC
-inline const ErfcReturnType
-erfc() const
-{
-  return ErfcReturnType(derived());
-}
+ * function of *this.
+ *
+ * \specialfunctions_module
+ *
+ * \note This function supports only float and double scalar types in c++11 mode. To support other scalar types,
+ * or float/double in non c++11 mode, the user has to provide implementations of erfc(T) for any scalar
+ * type T to be supported.
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_erfc">Math functions</a>, erf()
+ */
+EIGEN_DEVICE_FUNC inline const ErfcReturnType erfc() const { return ErfcReturnType(derived()); }
 
 /** \returns an expression of the coefficient-wise inverse of the CDF of the Normal distribution function
-  * function of *this.
-  *
-  * \specialfunctions_module
-  * 
-  * In other words, considering `x = ndtri(y)`, it returns the argument, x, for which the area under the
-  * Gaussian probability density function (integrated from minus infinity to x) is equal to y.
-  *
-  * \note This function supports only float and double scalar types. To support other scalar types,
-  * the user has to provide implementations of ndtri(T) for any scalar type T to be supported.
-  *
-  * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_ndtri">Math functions</a>
-  */
-EIGEN_DEVICE_FUNC
-inline const NdtriReturnType
-ndtri() const
-{
-  return NdtriReturnType(derived());
-}
+ * function of *this.
+ *
+ * \specialfunctions_module
+ *
+ * In other words, considering `x = ndtri(y)`, it returns the argument, x, for which the area under the
+ * Gaussian probability density function (integrated from minus infinity to x) is equal to y.
+ *
+ * \note This function supports only float and double scalar types. To support other scalar types,
+ * the user has to provide implementations of ndtri(T) for any scalar type T to be supported.
+ *
+ * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_ndtri">Math functions</a>
+ */
+EIGEN_DEVICE_FUNC inline const NdtriReturnType ndtri() const { return NdtriReturnType(derived()); }
 
 template <typename ScalarExponent>
 using UnaryPowReturnType =
diff --git a/Eigen/src/plugins/BlockMethods.inc b/Eigen/src/plugins/BlockMethods.inc
index 68b9413..122a2f4 100644
--- a/Eigen/src/plugins/BlockMethods.inc
+++ b/Eigen/src/plugins/BlockMethods.inc
@@ -18,37 +18,62 @@
 typedef const Block<const Derived, 1, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> ConstRowXpr;
 /// \internal expression type of a block of whole columns */
 typedef Block<Derived, internal::traits<Derived>::RowsAtCompileTime, Dynamic, !IsRowMajor> ColsBlockXpr;
-typedef const Block<const Derived, internal::traits<Derived>::RowsAtCompileTime, Dynamic, !IsRowMajor> ConstColsBlockXpr;
+typedef const Block<const Derived, internal::traits<Derived>::RowsAtCompileTime, Dynamic, !IsRowMajor>
+    ConstColsBlockXpr;
 /// \internal expression type of a block of whole rows */
 typedef Block<Derived, Dynamic, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> RowsBlockXpr;
 typedef const Block<const Derived, Dynamic, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> ConstRowsBlockXpr;
 /// \internal expression type of a block of whole columns */
-template<int N> struct NColsBlockXpr { typedef Block<Derived, internal::traits<Derived>::RowsAtCompileTime, N, !IsRowMajor> Type; };
-template<int N> struct ConstNColsBlockXpr { typedef const Block<const Derived, internal::traits<Derived>::RowsAtCompileTime, N, !IsRowMajor> Type; };
+template <int N>
+struct NColsBlockXpr {
+  typedef Block<Derived, internal::traits<Derived>::RowsAtCompileTime, N, !IsRowMajor> Type;
+};
+template <int N>
+struct ConstNColsBlockXpr {
+  typedef const Block<const Derived, internal::traits<Derived>::RowsAtCompileTime, N, !IsRowMajor> Type;
+};
 /// \internal expression type of a block of whole rows */
-template<int N> struct NRowsBlockXpr { typedef Block<Derived, N, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> Type; };
-template<int N> struct ConstNRowsBlockXpr { typedef const Block<const Derived, N, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> Type; };
+template <int N>
+struct NRowsBlockXpr {
+  typedef Block<Derived, N, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> Type;
+};
+template <int N>
+struct ConstNRowsBlockXpr {
+  typedef const Block<const Derived, N, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> Type;
+};
 /// \internal expression of a block */
 typedef Block<Derived> BlockXpr;
 typedef const Block<const Derived> ConstBlockXpr;
 /// \internal expression of a block of fixed sizes */
-template<int Rows, int Cols> struct FixedBlockXpr { typedef Block<Derived,Rows,Cols> Type; };
-template<int Rows, int Cols> struct ConstFixedBlockXpr { typedef Block<const Derived,Rows,Cols> Type; };
+template <int Rows, int Cols>
+struct FixedBlockXpr {
+  typedef Block<Derived, Rows, Cols> Type;
+};
+template <int Rows, int Cols>
+struct ConstFixedBlockXpr {
+  typedef Block<const Derived, Rows, Cols> Type;
+};
 
 typedef VectorBlock<Derived> SegmentReturnType;
 typedef const VectorBlock<const Derived> ConstSegmentReturnType;
-template<int Size> struct FixedSegmentReturnType { typedef VectorBlock<Derived, Size> Type; };
-template<int Size> struct ConstFixedSegmentReturnType { typedef const VectorBlock<const Derived, Size> Type; };
+template <int Size>
+struct FixedSegmentReturnType {
+  typedef VectorBlock<Derived, Size> Type;
+};
+template <int Size>
+struct ConstFixedSegmentReturnType {
+  typedef const VectorBlock<const Derived, Size> Type;
+};
 
 /// \internal inner-vector
-typedef Block<Derived,IsRowMajor?1:Dynamic,IsRowMajor?Dynamic:1,true>       InnerVectorReturnType;
-typedef Block<const Derived,IsRowMajor?1:Dynamic,IsRowMajor?Dynamic:1,true> ConstInnerVectorReturnType;
+typedef Block<Derived, IsRowMajor ? 1 : Dynamic, IsRowMajor ? Dynamic : 1, true> InnerVectorReturnType;
+typedef Block<const Derived, IsRowMajor ? 1 : Dynamic, IsRowMajor ? Dynamic : 1, true> ConstInnerVectorReturnType;
 
 /// \internal set of inner-vectors
-typedef Block<Derived,Dynamic,Dynamic,true> InnerVectorsReturnType;
-typedef Block<const Derived,Dynamic,Dynamic,true> ConstInnerVectorsReturnType;
+typedef Block<Derived, Dynamic, Dynamic, true> InnerVectorsReturnType;
+typedef Block<const Derived, Dynamic, Dynamic, true> ConstInnerVectorsReturnType;
 
-#endif // not EIGEN_PARSED_BY_DOXYGEN
+#endif  // not EIGEN_PARSED_BY_DOXYGEN
 
 /// \returns an expression of a block in \c *this with either dynamic or fixed sizes.
 ///
@@ -64,16 +89,15 @@
 ///
 /// \newin{3.4}:
 ///
-/// The number of rows \a blockRows and columns \a blockCols can also be specified at compile-time by passing Eigen::fix<N>,
-/// or Eigen::fix<N>(n) as arguments. In the later case, \c n plays the role of a runtime fallback value in case \c N equals Eigen::Dynamic.
-/// Here is an example with a fixed number of rows \c NRows and dynamic number of columns \c cols:
-/// \code
-/// mat.block(i,j,fix<NRows>,cols)
-/// \endcode
+/// The number of rows \a blockRows and columns \a blockCols can also be specified at compile-time by passing
+/// Eigen::fix<N>, or Eigen::fix<N>(n) as arguments. In the later case, \c n plays the role of a runtime fallback value
+/// in case \c N equals Eigen::Dynamic. Here is an example with a fixed number of rows \c NRows and dynamic number of
+/// columns \c cols: \code mat.block(i,j,fix<NRows>,cols) \endcode
 ///
 /// This function thus fully covers the features offered by the following overloads block<NRows,NCols>(Index, Index),
 /// and block<NRows,NCols>(Index, Index, Index, Index) that are thus obsolete. Indeed, this generic version avoids
-/// redundancy, it preserves the argument order, and prevents the need to rely on the template keyword in templated code.
+/// redundancy, it preserves the argument order, and prevents the need to rely on the template keyword in templated
+/// code.
 ///
 /// but with less redundancy and more consistency as it does not modify the argument order
 /// and seamlessly enable hybrid fixed/dynamic sizes.
@@ -86,35 +110,40 @@
 ///
 /// \sa class Block, fix, fix<N>(int)
 ///
-template<typename NRowsType, typename NColsType>
+template <typename NRowsType, typename NColsType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
+    typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value,
+                           internal::get_fixed_value<NColsType>::value>::Type
 #else
-typename FixedBlockXpr<...,...>::Type
+    typename FixedBlockXpr<..., ...>::Type
 #endif
-block(Index startRow, Index startCol, NRowsType blockRows, NColsType blockCols)
-{
-  return typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type(
-            derived(), startRow, startCol, internal::get_runtime_value(blockRows), internal::get_runtime_value(blockCols));
+    block(Index startRow, Index startCol, NRowsType blockRows, NColsType blockCols) {
+  return
+      typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value,
+                             internal::get_fixed_value<NColsType>::value>::Type(derived(), startRow, startCol,
+                                                                                internal::get_runtime_value(blockRows),
+                                                                                internal::get_runtime_value(blockCols));
 }
 
 /// This is the const version of block(Index,Index,NRowsType,NColsType)
-template<typename NRowsType, typename NColsType>
+template <typename NRowsType, typename NColsType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-const typename ConstFixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
+    const typename ConstFixedBlockXpr<internal::get_fixed_value<NRowsType>::value,
+                                      internal::get_fixed_value<NColsType>::value>::Type
 #else
-const typename ConstFixedBlockXpr<...,...>::Type
+    const typename ConstFixedBlockXpr<..., ...>::Type
 #endif
-block(Index startRow, Index startCol, NRowsType blockRows, NColsType blockCols) const
-{
-  return typename ConstFixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type(
-            derived(), startRow, startCol, internal::get_runtime_value(blockRows), internal::get_runtime_value(blockCols));
+    block(Index startRow, Index startCol, NRowsType blockRows, NColsType blockCols) const {
+  return typename ConstFixedBlockXpr<internal::get_fixed_value<NRowsType>::value,
+                                     internal::get_fixed_value<NColsType>::value>::Type(derived(), startRow, startCol,
+                                                                                        internal::get_runtime_value(
+                                                                                            blockRows),
+                                                                                        internal::get_runtime_value(
+                                                                                            blockCols));
 }
 
-
-
 /// \returns a expression of a top-right corner of \c *this with either dynamic or fixed sizes.
 ///
 /// \param cRows the number of rows in the corner
@@ -125,38 +154,50 @@
 /// Example with dynamic sizes: \include MatrixBase_topRightCorner_int_int.cpp
 /// Output: \verbinclude MatrixBase_topRightCorner_int_int.out
 ///
-/// The number of rows \a blockRows and columns \a blockCols can also be specified at compile-time by passing Eigen::fix<N>,
-/// or Eigen::fix<N>(n) as arguments. See \link block(Index,Index,NRowsType,NColsType) block() \endlink for the details.
+/// The number of rows \a blockRows and columns \a blockCols can also be specified at compile-time by passing
+/// Eigen::fix<N>, or Eigen::fix<N>(n) as arguments. See \link block(Index,Index,NRowsType,NColsType) block() \endlink
+/// for the details.
 ///
 EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
 ///
 /// \sa block(Index,Index,NRowsType,NColsType), class Block
 ///
-template<typename NRowsType, typename NColsType>
+template <typename NRowsType, typename NColsType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
+    typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value,
+                           internal::get_fixed_value<NColsType>::value>::Type
 #else
-typename FixedBlockXpr<...,...>::Type
+    typename FixedBlockXpr<..., ...>::Type
 #endif
-topRightCorner(NRowsType cRows, NColsType cCols)
-{
-  return typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
-            (derived(), 0, cols() - internal::get_runtime_value(cCols), internal::get_runtime_value(cRows), internal::get_runtime_value(cCols));
+    topRightCorner(NRowsType cRows, NColsType cCols) {
+  return typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value,
+                                internal::get_fixed_value<NColsType>::value>::Type(derived(), 0,
+                                                                                   cols() - internal::get_runtime_value(
+                                                                                                cCols),
+                                                                                   internal::get_runtime_value(cRows),
+                                                                                   internal::get_runtime_value(cCols));
 }
 
 /// This is the const version of topRightCorner(NRowsType, NColsType).
-template<typename NRowsType, typename NColsType>
+template <typename NRowsType, typename NColsType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-const typename ConstFixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
+    const typename ConstFixedBlockXpr<internal::get_fixed_value<NRowsType>::value,
+                                      internal::get_fixed_value<NColsType>::value>::Type
 #else
-const typename ConstFixedBlockXpr<...,...>::Type
+    const typename ConstFixedBlockXpr<..., ...>::Type
 #endif
-topRightCorner(NRowsType cRows, NColsType cCols) const
-{
-  return typename ConstFixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
-            (derived(), 0, cols() - internal::get_runtime_value(cCols), internal::get_runtime_value(cRows), internal::get_runtime_value(cCols));
+    topRightCorner(NRowsType cRows, NColsType cCols) const {
+  return
+      typename ConstFixedBlockXpr<internal::get_fixed_value<NRowsType>::value,
+                                  internal::get_fixed_value<NColsType>::value>::Type(derived(), 0,
+                                                                                     cols() -
+                                                                                         internal::get_runtime_value(
+                                                                                             cCols),
+                                                                                     internal::get_runtime_value(cRows),
+                                                                                     internal::get_runtime_value(
+                                                                                         cCols));
 }
 
 /// \returns an expression of a fixed-size top-right corner of \c *this.
@@ -171,19 +212,15 @@
 ///
 /// \sa class Block, block<int,int>(Index,Index)
 ///
-template<int CRows, int CCols>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename FixedBlockXpr<CRows,CCols>::Type topRightCorner()
-{
-  return typename FixedBlockXpr<CRows,CCols>::Type(derived(), 0, cols() - CCols);
+template <int CRows, int CCols>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename FixedBlockXpr<CRows, CCols>::Type topRightCorner() {
+  return typename FixedBlockXpr<CRows, CCols>::Type(derived(), 0, cols() - CCols);
 }
 
 /// This is the const version of topRightCorner<int, int>().
-template<int CRows, int CCols>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-const typename ConstFixedBlockXpr<CRows,CCols>::Type topRightCorner() const
-{
-  return typename ConstFixedBlockXpr<CRows,CCols>::Type(derived(), 0, cols() - CCols);
+template <int CRows, int CCols>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename ConstFixedBlockXpr<CRows, CCols>::Type topRightCorner() const {
+  return typename ConstFixedBlockXpr<CRows, CCols>::Type(derived(), 0, cols() - CCols);
 }
 
 /// \returns an expression of a top-right corner of \c *this.
@@ -205,23 +242,19 @@
 ///
 /// \sa class Block
 ///
-template<int CRows, int CCols>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename FixedBlockXpr<CRows,CCols>::Type topRightCorner(Index cRows, Index cCols)
-{
-  return typename FixedBlockXpr<CRows,CCols>::Type(derived(), 0, cols() - cCols, cRows, cCols);
+template <int CRows, int CCols>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename FixedBlockXpr<CRows, CCols>::Type topRightCorner(Index cRows,
+                                                                                                Index cCols) {
+  return typename FixedBlockXpr<CRows, CCols>::Type(derived(), 0, cols() - cCols, cRows, cCols);
 }
 
 /// This is the const version of topRightCorner<int, int>(Index, Index).
-template<int CRows, int CCols>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-const typename ConstFixedBlockXpr<CRows,CCols>::Type topRightCorner(Index cRows, Index cCols) const
-{
-  return typename ConstFixedBlockXpr<CRows,CCols>::Type(derived(), 0, cols() - cCols, cRows, cCols);
+template <int CRows, int CCols>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename ConstFixedBlockXpr<CRows, CCols>::Type topRightCorner(
+    Index cRows, Index cCols) const {
+  return typename ConstFixedBlockXpr<CRows, CCols>::Type(derived(), 0, cols() - cCols, cRows, cCols);
 }
 
-
-
 /// \returns an expression of a top-left corner of \c *this  with either dynamic or fixed sizes.
 ///
 /// \param cRows the number of rows in the corner
@@ -232,38 +265,45 @@
 /// Example: \include MatrixBase_topLeftCorner_int_int.cpp
 /// Output: \verbinclude MatrixBase_topLeftCorner_int_int.out
 ///
-/// The number of rows \a blockRows and columns \a blockCols can also be specified at compile-time by passing Eigen::fix<N>,
-/// or Eigen::fix<N>(n) as arguments. See \link block(Index,Index,NRowsType,NColsType) block() \endlink for the details.
+/// The number of rows \a blockRows and columns \a blockCols can also be specified at compile-time by passing
+/// Eigen::fix<N>, or Eigen::fix<N>(n) as arguments. See \link block(Index,Index,NRowsType,NColsType) block() \endlink
+/// for the details.
 ///
 EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
 ///
 /// \sa block(Index,Index,NRowsType,NColsType), class Block
 ///
-template<typename NRowsType, typename NColsType>
+template <typename NRowsType, typename NColsType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
+    typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value,
+                           internal::get_fixed_value<NColsType>::value>::Type
 #else
-typename FixedBlockXpr<...,...>::Type
+    typename FixedBlockXpr<..., ...>::Type
 #endif
-topLeftCorner(NRowsType cRows, NColsType cCols)
-{
-  return typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
-            (derived(), 0, 0, internal::get_runtime_value(cRows), internal::get_runtime_value(cCols));
+    topLeftCorner(NRowsType cRows, NColsType cCols) {
+  return typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value,
+                                internal::get_fixed_value<NColsType>::value>::Type(derived(), 0, 0,
+                                                                                   internal::get_runtime_value(cRows),
+                                                                                   internal::get_runtime_value(cCols));
 }
 
 /// This is the const version of topLeftCorner(Index, Index).
-template<typename NRowsType, typename NColsType>
+template <typename NRowsType, typename NColsType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-const typename ConstFixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
+    const typename ConstFixedBlockXpr<internal::get_fixed_value<NRowsType>::value,
+                                      internal::get_fixed_value<NColsType>::value>::Type
 #else
-const typename ConstFixedBlockXpr<...,...>::Type
+    const typename ConstFixedBlockXpr<..., ...>::Type
 #endif
-topLeftCorner(NRowsType cRows, NColsType cCols) const
-{
-  return typename ConstFixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
-            (derived(), 0, 0, internal::get_runtime_value(cRows), internal::get_runtime_value(cCols));
+    topLeftCorner(NRowsType cRows, NColsType cCols) const {
+  return
+      typename ConstFixedBlockXpr<internal::get_fixed_value<NRowsType>::value,
+                                  internal::get_fixed_value<NColsType>::value>::Type(derived(), 0, 0,
+                                                                                     internal::get_runtime_value(cRows),
+                                                                                     internal::get_runtime_value(
+                                                                                         cCols));
 }
 
 /// \returns an expression of a fixed-size top-left corner of \c *this.
@@ -277,19 +317,15 @@
 ///
 /// \sa block(Index,Index,NRowsType,NColsType), class Block
 ///
-template<int CRows, int CCols>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename FixedBlockXpr<CRows,CCols>::Type topLeftCorner()
-{
-  return typename FixedBlockXpr<CRows,CCols>::Type(derived(), 0, 0);
+template <int CRows, int CCols>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename FixedBlockXpr<CRows, CCols>::Type topLeftCorner() {
+  return typename FixedBlockXpr<CRows, CCols>::Type(derived(), 0, 0);
 }
 
 /// This is the const version of topLeftCorner<int, int>().
-template<int CRows, int CCols>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-const typename ConstFixedBlockXpr<CRows,CCols>::Type topLeftCorner() const
-{
-  return typename ConstFixedBlockXpr<CRows,CCols>::Type(derived(), 0, 0);
+template <int CRows, int CCols>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename ConstFixedBlockXpr<CRows, CCols>::Type topLeftCorner() const {
+  return typename ConstFixedBlockXpr<CRows, CCols>::Type(derived(), 0, 0);
 }
 
 /// \returns an expression of a top-left corner of \c *this.
@@ -311,23 +347,19 @@
 ///
 /// \sa class Block
 ///
-template<int CRows, int CCols>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename FixedBlockXpr<CRows,CCols>::Type topLeftCorner(Index cRows, Index cCols)
-{
-  return typename FixedBlockXpr<CRows,CCols>::Type(derived(), 0, 0, cRows, cCols);
+template <int CRows, int CCols>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename FixedBlockXpr<CRows, CCols>::Type topLeftCorner(Index cRows,
+                                                                                               Index cCols) {
+  return typename FixedBlockXpr<CRows, CCols>::Type(derived(), 0, 0, cRows, cCols);
 }
 
 /// This is the const version of topLeftCorner<int, int>(Index, Index).
-template<int CRows, int CCols>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-const typename ConstFixedBlockXpr<CRows,CCols>::Type topLeftCorner(Index cRows, Index cCols) const
-{
-  return typename ConstFixedBlockXpr<CRows,CCols>::Type(derived(), 0, 0, cRows, cCols);
+template <int CRows, int CCols>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename ConstFixedBlockXpr<CRows, CCols>::Type topLeftCorner(
+    Index cRows, Index cCols) const {
+  return typename ConstFixedBlockXpr<CRows, CCols>::Type(derived(), 0, 0, cRows, cCols);
 }
 
-
-
 /// \returns an expression of a bottom-right corner of \c *this  with either dynamic or fixed sizes.
 ///
 /// \param cRows the number of rows in the corner
@@ -338,40 +370,45 @@
 /// Example: \include MatrixBase_bottomRightCorner_int_int.cpp
 /// Output: \verbinclude MatrixBase_bottomRightCorner_int_int.out
 ///
-/// The number of rows \a blockRows and columns \a blockCols can also be specified at compile-time by passing Eigen::fix<N>,
-/// or Eigen::fix<N>(n) as arguments. See \link block(Index,Index,NRowsType,NColsType) block() \endlink for the details.
+/// The number of rows \a blockRows and columns \a blockCols can also be specified at compile-time by passing
+/// Eigen::fix<N>, or Eigen::fix<N>(n) as arguments. See \link block(Index,Index,NRowsType,NColsType) block() \endlink
+/// for the details.
 ///
 EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
 ///
 /// \sa block(Index,Index,NRowsType,NColsType), class Block
 ///
-template<typename NRowsType, typename NColsType>
+template <typename NRowsType, typename NColsType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
+    typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value,
+                           internal::get_fixed_value<NColsType>::value>::Type
 #else
-typename FixedBlockXpr<...,...>::Type
+    typename FixedBlockXpr<..., ...>::Type
 #endif
-bottomRightCorner(NRowsType cRows, NColsType cCols)
-{
-  return typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
-            (derived(), rows() - internal::get_runtime_value(cRows), cols() - internal::get_runtime_value(cCols),
-                        internal::get_runtime_value(cRows), internal::get_runtime_value(cCols));
+    bottomRightCorner(NRowsType cRows, NColsType cCols) {
+  return
+      typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value, internal::get_fixed_value<NColsType>::value>::
+          Type(derived(), rows() - internal::get_runtime_value(cRows), cols() - internal::get_runtime_value(cCols),
+               internal::get_runtime_value(cRows), internal::get_runtime_value(cCols));
 }
 
 /// This is the const version of bottomRightCorner(NRowsType, NColsType).
-template<typename NRowsType, typename NColsType>
+template <typename NRowsType, typename NColsType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-const typename ConstFixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
+    const typename ConstFixedBlockXpr<internal::get_fixed_value<NRowsType>::value,
+                                      internal::get_fixed_value<NColsType>::value>::Type
 #else
-const typename ConstFixedBlockXpr<...,...>::Type
+    const typename ConstFixedBlockXpr<..., ...>::Type
 #endif
-bottomRightCorner(NRowsType cRows, NColsType cCols) const
-{
-  return typename ConstFixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
-            (derived(), rows() - internal::get_runtime_value(cRows), cols() - internal::get_runtime_value(cCols),
-                        internal::get_runtime_value(cRows), internal::get_runtime_value(cCols));
+    bottomRightCorner(NRowsType cRows, NColsType cCols) const {
+  return typename ConstFixedBlockXpr<
+      internal::get_fixed_value<NRowsType>::value,
+      internal::get_fixed_value<NColsType>::value>::Type(derived(), rows() - internal::get_runtime_value(cRows),
+                                                         cols() - internal::get_runtime_value(cCols),
+                                                         internal::get_runtime_value(cRows),
+                                                         internal::get_runtime_value(cCols));
 }
 
 /// \returns an expression of a fixed-size bottom-right corner of \c *this.
@@ -385,19 +422,15 @@
 ///
 /// \sa block(Index,Index,NRowsType,NColsType), class Block
 ///
-template<int CRows, int CCols>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename FixedBlockXpr<CRows,CCols>::Type bottomRightCorner()
-{
-  return typename FixedBlockXpr<CRows,CCols>::Type(derived(), rows() - CRows, cols() - CCols);
+template <int CRows, int CCols>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename FixedBlockXpr<CRows, CCols>::Type bottomRightCorner() {
+  return typename FixedBlockXpr<CRows, CCols>::Type(derived(), rows() - CRows, cols() - CCols);
 }
 
 /// This is the const version of bottomRightCorner<int, int>().
-template<int CRows, int CCols>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-const typename ConstFixedBlockXpr<CRows,CCols>::Type bottomRightCorner() const
-{
-  return typename ConstFixedBlockXpr<CRows,CCols>::Type(derived(), rows() - CRows, cols() - CCols);
+template <int CRows, int CCols>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename ConstFixedBlockXpr<CRows, CCols>::Type bottomRightCorner() const {
+  return typename ConstFixedBlockXpr<CRows, CCols>::Type(derived(), rows() - CRows, cols() - CCols);
 }
 
 /// \returns an expression of a bottom-right corner of \c *this.
@@ -419,23 +452,19 @@
 ///
 /// \sa class Block
 ///
-template<int CRows, int CCols>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename FixedBlockXpr<CRows,CCols>::Type bottomRightCorner(Index cRows, Index cCols)
-{
-  return typename FixedBlockXpr<CRows,CCols>::Type(derived(), rows() - cRows, cols() - cCols, cRows, cCols);
+template <int CRows, int CCols>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename FixedBlockXpr<CRows, CCols>::Type bottomRightCorner(Index cRows,
+                                                                                                   Index cCols) {
+  return typename FixedBlockXpr<CRows, CCols>::Type(derived(), rows() - cRows, cols() - cCols, cRows, cCols);
 }
 
 /// This is the const version of bottomRightCorner<int, int>(Index, Index).
-template<int CRows, int CCols>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-const typename ConstFixedBlockXpr<CRows,CCols>::Type bottomRightCorner(Index cRows, Index cCols) const
-{
-  return typename ConstFixedBlockXpr<CRows,CCols>::Type(derived(), rows() - cRows, cols() - cCols, cRows, cCols);
+template <int CRows, int CCols>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename ConstFixedBlockXpr<CRows, CCols>::Type bottomRightCorner(
+    Index cRows, Index cCols) const {
+  return typename ConstFixedBlockXpr<CRows, CCols>::Type(derived(), rows() - cRows, cols() - cCols, cRows, cCols);
 }
 
-
-
 /// \returns an expression of a bottom-left corner of \c *this  with either dynamic or fixed sizes.
 ///
 /// \param cRows the number of rows in the corner
@@ -446,40 +475,47 @@
 /// Example: \include MatrixBase_bottomLeftCorner_int_int.cpp
 /// Output: \verbinclude MatrixBase_bottomLeftCorner_int_int.out
 ///
-/// The number of rows \a blockRows and columns \a blockCols can also be specified at compile-time by passing Eigen::fix<N>,
-/// or Eigen::fix<N>(n) as arguments. See \link block(Index,Index,NRowsType,NColsType) block() \endlink for the details.
+/// The number of rows \a blockRows and columns \a blockCols can also be specified at compile-time by passing
+/// Eigen::fix<N>, or Eigen::fix<N>(n) as arguments. See \link block(Index,Index,NRowsType,NColsType) block() \endlink
+/// for the details.
 ///
 EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
 ///
 /// \sa block(Index,Index,NRowsType,NColsType), class Block
 ///
-template<typename NRowsType, typename NColsType>
+template <typename NRowsType, typename NColsType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
+    typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value,
+                           internal::get_fixed_value<NColsType>::value>::Type
 #else
-typename FixedBlockXpr<...,...>::Type
+    typename FixedBlockXpr<..., ...>::Type
 #endif
-bottomLeftCorner(NRowsType cRows, NColsType cCols)
-{
-  return typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
-            (derived(), rows() - internal::get_runtime_value(cRows), 0,
-                        internal::get_runtime_value(cRows), internal::get_runtime_value(cCols));
+    bottomLeftCorner(NRowsType cRows, NColsType cCols) {
+  return
+      typename FixedBlockXpr<internal::get_fixed_value<NRowsType>::value,
+                             internal::get_fixed_value<NColsType>::value>::Type(derived(),
+                                                                                rows() -
+                                                                                    internal::get_runtime_value(cRows),
+                                                                                0, internal::get_runtime_value(cRows),
+                                                                                internal::get_runtime_value(cCols));
 }
 
 /// This is the const version of bottomLeftCorner(NRowsType, NColsType).
-template<typename NRowsType, typename NColsType>
+template <typename NRowsType, typename NColsType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-typename ConstFixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
+    typename ConstFixedBlockXpr<internal::get_fixed_value<NRowsType>::value,
+                                internal::get_fixed_value<NColsType>::value>::Type
 #else
-typename ConstFixedBlockXpr<...,...>::Type
+    typename ConstFixedBlockXpr<..., ...>::Type
 #endif
-bottomLeftCorner(NRowsType cRows, NColsType cCols) const
-{
-  return typename ConstFixedBlockXpr<internal::get_fixed_value<NRowsType>::value,internal::get_fixed_value<NColsType>::value>::Type
-            (derived(), rows() - internal::get_runtime_value(cRows), 0,
-                        internal::get_runtime_value(cRows), internal::get_runtime_value(cCols));
+    bottomLeftCorner(NRowsType cRows, NColsType cCols) const {
+  return typename ConstFixedBlockXpr<
+      internal::get_fixed_value<NRowsType>::value,
+      internal::get_fixed_value<NColsType>::value>::Type(derived(), rows() - internal::get_runtime_value(cRows), 0,
+                                                         internal::get_runtime_value(cRows),
+                                                         internal::get_runtime_value(cCols));
 }
 
 /// \returns an expression of a fixed-size bottom-left corner of \c *this.
@@ -493,19 +529,15 @@
 ///
 /// \sa block(Index,Index,NRowsType,NColsType), class Block
 ///
-template<int CRows, int CCols>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename FixedBlockXpr<CRows,CCols>::Type bottomLeftCorner()
-{
-  return typename FixedBlockXpr<CRows,CCols>::Type(derived(), rows() - CRows, 0);
+template <int CRows, int CCols>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename FixedBlockXpr<CRows, CCols>::Type bottomLeftCorner() {
+  return typename FixedBlockXpr<CRows, CCols>::Type(derived(), rows() - CRows, 0);
 }
 
 /// This is the const version of bottomLeftCorner<int, int>().
-template<int CRows, int CCols>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-const typename ConstFixedBlockXpr<CRows,CCols>::Type bottomLeftCorner() const
-{
-  return typename ConstFixedBlockXpr<CRows,CCols>::Type(derived(), rows() - CRows, 0);
+template <int CRows, int CCols>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename ConstFixedBlockXpr<CRows, CCols>::Type bottomLeftCorner() const {
+  return typename ConstFixedBlockXpr<CRows, CCols>::Type(derived(), rows() - CRows, 0);
 }
 
 /// \returns an expression of a bottom-left corner of \c *this.
@@ -527,23 +559,18 @@
 ///
 /// \sa class Block
 ///
-template<int CRows, int CCols>
-EIGEN_STRONG_INLINE
-typename FixedBlockXpr<CRows,CCols>::Type bottomLeftCorner(Index cRows, Index cCols)
-{
-  return typename FixedBlockXpr<CRows,CCols>::Type(derived(), rows() - cRows, 0, cRows, cCols);
+template <int CRows, int CCols>
+EIGEN_STRONG_INLINE typename FixedBlockXpr<CRows, CCols>::Type bottomLeftCorner(Index cRows, Index cCols) {
+  return typename FixedBlockXpr<CRows, CCols>::Type(derived(), rows() - cRows, 0, cRows, cCols);
 }
 
 /// This is the const version of bottomLeftCorner<int, int>(Index, Index).
-template<int CRows, int CCols>
-EIGEN_STRONG_INLINE
-const typename ConstFixedBlockXpr<CRows,CCols>::Type bottomLeftCorner(Index cRows, Index cCols) const
-{
-  return typename ConstFixedBlockXpr<CRows,CCols>::Type(derived(), rows() - cRows, 0, cRows, cCols);
+template <int CRows, int CCols>
+EIGEN_STRONG_INLINE const typename ConstFixedBlockXpr<CRows, CCols>::Type bottomLeftCorner(Index cRows,
+                                                                                           Index cCols) const {
+  return typename ConstFixedBlockXpr<CRows, CCols>::Type(derived(), rows() - cRows, 0, cRows, cCols);
 }
 
-
-
 /// \returns a block consisting of the top rows of \c *this.
 ///
 /// \param n the number of rows in the block
@@ -556,35 +583,33 @@
 /// or Eigen::fix<N>(n) as arguments.
 /// See \link block(Index,Index,NRowsType,NColsType) block() \endlink for the details.
 ///
-EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(row-major)
+EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(row - major)
 ///
 /// \sa block(Index,Index,NRowsType,NColsType), class Block
 ///
-template<typename NRowsType>
+template <typename NRowsType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-typename NRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
+    typename NRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
 #else
-typename NRowsBlockXpr<...>::Type
+    typename NRowsBlockXpr<...>::Type
 #endif
-topRows(NRowsType n)
-{
-  return typename NRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
-            (derived(), 0, 0, internal::get_runtime_value(n), cols());
+    topRows(NRowsType n) {
+  return typename NRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type(
+      derived(), 0, 0, internal::get_runtime_value(n), cols());
 }
 
 /// This is the const version of topRows(NRowsType).
-template<typename NRowsType>
+template <typename NRowsType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-const typename ConstNRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
+    const typename ConstNRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
 #else
-const typename ConstNRowsBlockXpr<...>::Type
+    const typename ConstNRowsBlockXpr<...>::Type
 #endif
-topRows(NRowsType n) const
-{
-  return typename ConstNRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
-            (derived(), 0, 0, internal::get_runtime_value(n), cols());
+    topRows(NRowsType n) const {
+  return typename ConstNRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type(
+      derived(), 0, 0, internal::get_runtime_value(n), cols());
 }
 
 /// \returns a block consisting of the top rows of \c *this.
@@ -598,27 +623,21 @@
 /// Example: \include MatrixBase_template_int_topRows.cpp
 /// Output: \verbinclude MatrixBase_template_int_topRows.out
 ///
-EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(row-major)
+EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(row - major)
 ///
 /// \sa block(Index,Index,NRowsType,NColsType), class Block
 ///
-template<int N>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename NRowsBlockXpr<N>::Type topRows(Index n = N)
-{
+template <int N>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename NRowsBlockXpr<N>::Type topRows(Index n = N) {
   return typename NRowsBlockXpr<N>::Type(derived(), 0, 0, n, cols());
 }
 
 /// This is the const version of topRows<int>().
-template<int N>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename ConstNRowsBlockXpr<N>::Type topRows(Index n = N) const
-{
+template <int N>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename ConstNRowsBlockXpr<N>::Type topRows(Index n = N) const {
   return typename ConstNRowsBlockXpr<N>::Type(derived(), 0, 0, n, cols());
 }
 
-
-
 /// \returns a block consisting of the bottom rows of \c *this.
 ///
 /// \param n the number of rows in the block
@@ -631,35 +650,33 @@
 /// or Eigen::fix<N>(n) as arguments.
 /// See \link block(Index,Index,NRowsType,NColsType) block() \endlink for the details.
 ///
-EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(row-major)
+EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(row - major)
 ///
 /// \sa block(Index,Index,NRowsType,NColsType), class Block
 ///
-template<typename NRowsType>
+template <typename NRowsType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-typename NRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
+    typename NRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
 #else
-typename NRowsBlockXpr<...>::Type
+    typename NRowsBlockXpr<...>::Type
 #endif
-bottomRows(NRowsType n)
-{
-  return typename NRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
-            (derived(), rows() - internal::get_runtime_value(n), 0, internal::get_runtime_value(n), cols());
+    bottomRows(NRowsType n) {
+  return typename NRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type(
+      derived(), rows() - internal::get_runtime_value(n), 0, internal::get_runtime_value(n), cols());
 }
 
 /// This is the const version of bottomRows(NRowsType).
-template<typename NRowsType>
+template <typename NRowsType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-const typename ConstNRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
+    const typename ConstNRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
 #else
-const typename ConstNRowsBlockXpr<...>::Type
+    const typename ConstNRowsBlockXpr<...>::Type
 #endif
-bottomRows(NRowsType n) const
-{
-  return typename ConstNRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
-            (derived(), rows() - internal::get_runtime_value(n), 0, internal::get_runtime_value(n), cols());
+    bottomRows(NRowsType n) const {
+  return typename ConstNRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type(
+      derived(), rows() - internal::get_runtime_value(n), 0, internal::get_runtime_value(n), cols());
 }
 
 /// \returns a block consisting of the bottom rows of \c *this.
@@ -673,27 +690,21 @@
 /// Example: \include MatrixBase_template_int_bottomRows.cpp
 /// Output: \verbinclude MatrixBase_template_int_bottomRows.out
 ///
-EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(row-major)
+EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(row - major)
 ///
 /// \sa block(Index,Index,NRowsType,NColsType), class Block
 ///
-template<int N>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename NRowsBlockXpr<N>::Type bottomRows(Index n = N)
-{
+template <int N>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename NRowsBlockXpr<N>::Type bottomRows(Index n = N) {
   return typename NRowsBlockXpr<N>::Type(derived(), rows() - n, 0, n, cols());
 }
 
 /// This is the const version of bottomRows<int>().
-template<int N>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename ConstNRowsBlockXpr<N>::Type bottomRows(Index n = N) const
-{
+template <int N>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename ConstNRowsBlockXpr<N>::Type bottomRows(Index n = N) const {
   return typename ConstNRowsBlockXpr<N>::Type(derived(), rows() - n, 0, n, cols());
 }
 
-
-
 /// \returns a block consisting of a range of rows of \c *this.
 ///
 /// \param startRow the index of the first row in the block
@@ -707,35 +718,33 @@
 /// or Eigen::fix<N>(n) as arguments.
 /// See \link block(Index,Index,NRowsType,NColsType) block() \endlink for the details.
 ///
-EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(row-major)
+EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(row - major)
 ///
 /// \sa block(Index,Index,NRowsType,NColsType), class Block
 ///
-template<typename NRowsType>
+template <typename NRowsType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-typename NRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
+    typename NRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
 #else
-typename NRowsBlockXpr<...>::Type
+    typename NRowsBlockXpr<...>::Type
 #endif
-middleRows(Index startRow, NRowsType n)
-{
-  return typename NRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
-            (derived(), startRow, 0, internal::get_runtime_value(n), cols());
+    middleRows(Index startRow, NRowsType n) {
+  return typename NRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type(
+      derived(), startRow, 0, internal::get_runtime_value(n), cols());
 }
 
 /// This is the const version of middleRows(Index,NRowsType).
-template<typename NRowsType>
+template <typename NRowsType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-const typename ConstNRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
+    const typename ConstNRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
 #else
-const typename ConstNRowsBlockXpr<...>::Type
+    const typename ConstNRowsBlockXpr<...>::Type
 #endif
-middleRows(Index startRow, NRowsType n) const
-{
-  return typename ConstNRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type
-            (derived(), startRow, 0, internal::get_runtime_value(n), cols());
+    middleRows(Index startRow, NRowsType n) const {
+  return typename ConstNRowsBlockXpr<internal::get_fixed_value<NRowsType>::value>::Type(
+      derived(), startRow, 0, internal::get_runtime_value(n), cols());
 }
 
 /// \returns a block consisting of a range of rows of \c *this.
@@ -750,27 +759,22 @@
 /// Example: \include DenseBase_template_int_middleRows.cpp
 /// Output: \verbinclude DenseBase_template_int_middleRows.out
 ///
-EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(row-major)
+EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(row - major)
 ///
 /// \sa block(Index,Index,NRowsType,NColsType), class Block
 ///
-template<int N>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename NRowsBlockXpr<N>::Type middleRows(Index startRow, Index n = N)
-{
+template <int N>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename NRowsBlockXpr<N>::Type middleRows(Index startRow, Index n = N) {
   return typename NRowsBlockXpr<N>::Type(derived(), startRow, 0, n, cols());
 }
 
 /// This is the const version of middleRows<int>().
-template<int N>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename ConstNRowsBlockXpr<N>::Type middleRows(Index startRow, Index n = N) const
-{
+template <int N>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename ConstNRowsBlockXpr<N>::Type middleRows(Index startRow,
+                                                                                      Index n = N) const {
   return typename ConstNRowsBlockXpr<N>::Type(derived(), startRow, 0, n, cols());
 }
 
-
-
 /// \returns a block consisting of the left columns of \c *this.
 ///
 /// \param n the number of columns in the block
@@ -783,35 +787,33 @@
 /// or Eigen::fix<N>(n) as arguments.
 /// See \link block(Index,Index,NRowsType,NColsType) block() \endlink for the details.
 ///
-EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(column-major)
+EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(column - major)
 ///
 /// \sa block(Index,Index,NRowsType,NColsType), class Block
 ///
-template<typename NColsType>
+template <typename NColsType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-typename NColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
+    typename NColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
 #else
-typename NColsBlockXpr<...>::Type
+    typename NColsBlockXpr<...>::Type
 #endif
-leftCols(NColsType n)
-{
-  return typename NColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
-            (derived(), 0, 0, rows(), internal::get_runtime_value(n));
+    leftCols(NColsType n) {
+  return typename NColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type(derived(), 0, 0, rows(),
+                                                                                   internal::get_runtime_value(n));
 }
 
 /// This is the const version of leftCols(NColsType).
-template<typename NColsType>
+template <typename NColsType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-const typename ConstNColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
+    const typename ConstNColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
 #else
-const typename ConstNColsBlockXpr<...>::Type
+    const typename ConstNColsBlockXpr<...>::Type
 #endif
-leftCols(NColsType n) const
-{
-  return typename ConstNColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
-            (derived(), 0, 0, rows(), internal::get_runtime_value(n));
+    leftCols(NColsType n) const {
+  return typename ConstNColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type(derived(), 0, 0, rows(),
+                                                                                        internal::get_runtime_value(n));
 }
 
 /// \returns a block consisting of the left columns of \c *this.
@@ -825,27 +827,21 @@
 /// Example: \include MatrixBase_template_int_leftCols.cpp
 /// Output: \verbinclude MatrixBase_template_int_leftCols.out
 ///
-EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(column-major)
+EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(column - major)
 ///
 /// \sa block(Index,Index,NRowsType,NColsType), class Block
 ///
-template<int N>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename NColsBlockXpr<N>::Type leftCols(Index n = N)
-{
+template <int N>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename NColsBlockXpr<N>::Type leftCols(Index n = N) {
   return typename NColsBlockXpr<N>::Type(derived(), 0, 0, rows(), n);
 }
 
 /// This is the const version of leftCols<int>().
-template<int N>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename ConstNColsBlockXpr<N>::Type leftCols(Index n = N) const
-{
+template <int N>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename ConstNColsBlockXpr<N>::Type leftCols(Index n = N) const {
   return typename ConstNColsBlockXpr<N>::Type(derived(), 0, 0, rows(), n);
 }
 
-
-
 /// \returns a block consisting of the right columns of \c *this.
 ///
 /// \param n the number of columns in the block
@@ -858,35 +854,33 @@
 /// or Eigen::fix<N>(n) as arguments.
 /// See \link block(Index,Index,NRowsType,NColsType) block() \endlink for the details.
 ///
-EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(column-major)
+EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(column - major)
 ///
 /// \sa block(Index,Index,NRowsType,NColsType), class Block
 ///
-template<typename NColsType>
+template <typename NColsType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-typename NColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
+    typename NColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
 #else
-typename NColsBlockXpr<...>::Type
+    typename NColsBlockXpr<...>::Type
 #endif
-rightCols(NColsType n)
-{
-  return typename NColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
-            (derived(), 0, cols() - internal::get_runtime_value(n), rows(), internal::get_runtime_value(n));
+    rightCols(NColsType n) {
+  return typename NColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type(
+      derived(), 0, cols() - internal::get_runtime_value(n), rows(), internal::get_runtime_value(n));
 }
 
 /// This is the const version of rightCols(NColsType).
-template<typename NColsType>
+template <typename NColsType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-const typename ConstNColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
+    const typename ConstNColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
 #else
-const typename ConstNColsBlockXpr<...>::Type
+    const typename ConstNColsBlockXpr<...>::Type
 #endif
-rightCols(NColsType n) const
-{
-  return typename ConstNColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
-            (derived(), 0, cols() - internal::get_runtime_value(n), rows(), internal::get_runtime_value(n));
+    rightCols(NColsType n) const {
+  return typename ConstNColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type(
+      derived(), 0, cols() - internal::get_runtime_value(n), rows(), internal::get_runtime_value(n));
 }
 
 /// \returns a block consisting of the right columns of \c *this.
@@ -900,27 +894,21 @@
 /// Example: \include MatrixBase_template_int_rightCols.cpp
 /// Output: \verbinclude MatrixBase_template_int_rightCols.out
 ///
-EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(column-major)
+EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(column - major)
 ///
 /// \sa block(Index,Index,NRowsType,NColsType), class Block
 ///
-template<int N>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename NColsBlockXpr<N>::Type rightCols(Index n = N)
-{
+template <int N>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename NColsBlockXpr<N>::Type rightCols(Index n = N) {
   return typename NColsBlockXpr<N>::Type(derived(), 0, cols() - n, rows(), n);
 }
 
 /// This is the const version of rightCols<int>().
-template<int N>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename ConstNColsBlockXpr<N>::Type rightCols(Index n = N) const
-{
+template <int N>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename ConstNColsBlockXpr<N>::Type rightCols(Index n = N) const {
   return typename ConstNColsBlockXpr<N>::Type(derived(), 0, cols() - n, rows(), n);
 }
 
-
-
 /// \returns a block consisting of a range of columns of \c *this.
 ///
 /// \param startCol the index of the first column in the block
@@ -934,35 +922,33 @@
 /// or Eigen::fix<N>(n) as arguments.
 /// See \link block(Index,Index,NRowsType,NColsType) block() \endlink for the details.
 ///
-EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(column-major)
+EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(column - major)
 ///
 /// \sa block(Index,Index,NRowsType,NColsType), class Block
 ///
-template<typename NColsType>
+template <typename NColsType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-typename NColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
+    typename NColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
 #else
-typename NColsBlockXpr<...>::Type
+    typename NColsBlockXpr<...>::Type
 #endif
-middleCols(Index startCol, NColsType numCols)
-{
-  return typename NColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
-            (derived(), 0, startCol, rows(), internal::get_runtime_value(numCols));
+    middleCols(Index startCol, NColsType numCols) {
+  return typename NColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type(
+      derived(), 0, startCol, rows(), internal::get_runtime_value(numCols));
 }
 
 /// This is the const version of middleCols(Index,NColsType).
-template<typename NColsType>
+template <typename NColsType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-const typename ConstNColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
+    const typename ConstNColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
 #else
-const typename ConstNColsBlockXpr<...>::Type
+    const typename ConstNColsBlockXpr<...>::Type
 #endif
-middleCols(Index startCol, NColsType numCols) const
-{
-  return typename ConstNColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type
-            (derived(), 0, startCol, rows(), internal::get_runtime_value(numCols));
+    middleCols(Index startCol, NColsType numCols) const {
+  return typename ConstNColsBlockXpr<internal::get_fixed_value<NColsType>::value>::Type(
+      derived(), 0, startCol, rows(), internal::get_runtime_value(numCols));
 }
 
 /// \returns a block consisting of a range of columns of \c *this.
@@ -977,27 +963,22 @@
 /// Example: \include DenseBase_template_int_middleCols.cpp
 /// Output: \verbinclude DenseBase_template_int_middleCols.out
 ///
-EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(column-major)
+EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(column - major)
 ///
 /// \sa block(Index,Index,NRowsType,NColsType), class Block
 ///
-template<int N>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename NColsBlockXpr<N>::Type middleCols(Index startCol, Index n = N)
-{
+template <int N>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename NColsBlockXpr<N>::Type middleCols(Index startCol, Index n = N) {
   return typename NColsBlockXpr<N>::Type(derived(), 0, startCol, rows(), n);
 }
 
 /// This is the const version of middleCols<int>().
-template<int N>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename ConstNColsBlockXpr<N>::Type middleCols(Index startCol, Index n = N) const
-{
+template <int N>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename ConstNColsBlockXpr<N>::Type middleCols(Index startCol,
+                                                                                      Index n = N) const {
   return typename ConstNColsBlockXpr<N>::Type(derived(), 0, startCol, rows(), n);
 }
 
-
-
 /// \returns a fixed-size expression of a block of \c *this.
 ///
 /// The template parameters \a NRows and \a NCols are the number of
@@ -1022,19 +1003,16 @@
 ///
 /// \sa block(Index,Index,NRowsType,NColsType), class Block
 ///
-template<int NRows, int NCols>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename FixedBlockXpr<NRows,NCols>::Type block(Index startRow, Index startCol)
-{
-  return typename FixedBlockXpr<NRows,NCols>::Type(derived(), startRow, startCol);
+template <int NRows, int NCols>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename FixedBlockXpr<NRows, NCols>::Type block(Index startRow, Index startCol) {
+  return typename FixedBlockXpr<NRows, NCols>::Type(derived(), startRow, startCol);
 }
 
 /// This is the const version of block<>(Index, Index). */
-template<int NRows, int NCols>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-const typename ConstFixedBlockXpr<NRows,NCols>::Type block(Index startRow, Index startCol) const
-{
-  return typename ConstFixedBlockXpr<NRows,NCols>::Type(derived(), startRow, startCol);
+template <int NRows, int NCols>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename ConstFixedBlockXpr<NRows, NCols>::Type block(
+    Index startRow, Index startCol) const {
+  return typename ConstFixedBlockXpr<NRows, NCols>::Type(derived(), startRow, startCol);
 }
 
 /// \returns an expression of a block of \c *this.
@@ -1068,21 +1046,18 @@
 ///
 /// \sa block(Index,Index,NRowsType,NColsType), class Block
 ///
-template<int NRows, int NCols>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename FixedBlockXpr<NRows,NCols>::Type block(Index startRow, Index startCol,
-                                                  Index blockRows, Index blockCols)
-{
-  return typename FixedBlockXpr<NRows,NCols>::Type(derived(), startRow, startCol, blockRows, blockCols);
+template <int NRows, int NCols>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename FixedBlockXpr<NRows, NCols>::Type block(Index startRow, Index startCol,
+                                                                                       Index blockRows,
+                                                                                       Index blockCols) {
+  return typename FixedBlockXpr<NRows, NCols>::Type(derived(), startRow, startCol, blockRows, blockCols);
 }
 
 /// This is the const version of block<>(Index, Index, Index, Index).
-template<int NRows, int NCols>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-const typename ConstFixedBlockXpr<NRows,NCols>::Type block(Index startRow, Index startCol,
-                                                              Index blockRows, Index blockCols) const
-{
-  return typename ConstFixedBlockXpr<NRows,NCols>::Type(derived(), startRow, startCol, blockRows, blockCols);
+template <int NRows, int NCols>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename ConstFixedBlockXpr<NRows, NCols>::Type block(
+    Index startRow, Index startCol, Index blockRows, Index blockCols) const {
+  return typename ConstFixedBlockXpr<NRows, NCols>::Type(derived(), startRow, startCol, blockRows, blockCols);
 }
 
 /// \returns an expression of the \a i-th column of \c *this. Note that the numbering starts at 0.
@@ -1090,42 +1065,26 @@
 /// Example: \include MatrixBase_col.cpp
 /// Output: \verbinclude MatrixBase_col.out
 ///
-EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(column-major)
+EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(column - major)
 /**
-  * \sa row(), class Block */
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-ColXpr col(Index i)
-{
-  return ColXpr(derived(), i);
-}
+ * \sa row(), class Block */
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ColXpr col(Index i) { return ColXpr(derived(), i); }
 
 /// This is the const version of col().
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-ConstColXpr col(Index i) const
-{
-  return ConstColXpr(derived(), i);
-}
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ConstColXpr col(Index i) const { return ConstColXpr(derived(), i); }
 
 /// \returns an expression of the \a i-th row of \c *this. Note that the numbering starts at 0.
 ///
 /// Example: \include MatrixBase_row.cpp
 /// Output: \verbinclude MatrixBase_row.out
 ///
-EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(row-major)
+EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(row - major)
 /**
-  * \sa col(), class Block */
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-RowXpr row(Index i)
-{
-  return RowXpr(derived(), i);
-}
+ * \sa col(), class Block */
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE RowXpr row(Index i) { return RowXpr(derived(), i); }
 
 /// This is the const version of row(). */
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-ConstRowXpr row(Index i) const
-{
-  return ConstRowXpr(derived(), i);
-}
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ConstRowXpr row(Index i) const { return ConstRowXpr(derived(), i); }
 
 /// \returns an expression of a segment (i.e. a vector block) in \c *this with either dynamic or fixed sizes.
 ///
@@ -1148,34 +1107,31 @@
 ///
 /// \sa block(Index,Index,NRowsType,NColsType), fix<N>, fix<N>(int), class Block
 ///
-template<typename NType>
+template <typename NType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-typename FixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
+    typename FixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
 #else
-typename FixedSegmentReturnType<...>::Type
+    typename FixedSegmentReturnType<...>::Type
 #endif
-segment(Index start, NType n)
-{
+    segment(Index start, NType n) {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
-  return typename FixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
-            (derived(), start, internal::get_runtime_value(n));
+  return typename FixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type(derived(), start,
+                                                                                        internal::get_runtime_value(n));
 }
 
-
 /// This is the const version of segment(Index,NType).
-template<typename NType>
+template <typename NType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-const typename ConstFixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
+    const typename ConstFixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
 #else
-const typename ConstFixedSegmentReturnType<...>::Type
+    const typename ConstFixedSegmentReturnType<...>::Type
 #endif
-segment(Index start, NType n) const
-{
+    segment(Index start, NType n) const {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
-  return typename ConstFixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
-            (derived(), start, internal::get_runtime_value(n));
+  return typename ConstFixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type(
+      derived(), start, internal::get_runtime_value(n));
 }
 
 /// \returns an expression of the first coefficients of \c *this with either dynamic or fixed sizes.
@@ -1198,33 +1154,31 @@
 ///
 /// \sa class Block, block(Index,Index)
 ///
-template<typename NType>
+template <typename NType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-typename FixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
+    typename FixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
 #else
-typename FixedSegmentReturnType<...>::Type
+    typename FixedSegmentReturnType<...>::Type
 #endif
-head(NType n)
-{
+    head(NType n) {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
-  return typename FixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
-              (derived(), 0, internal::get_runtime_value(n));
+  return typename FixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type(derived(), 0,
+                                                                                        internal::get_runtime_value(n));
 }
 
 /// This is the const version of head(NType).
-template<typename NType>
+template <typename NType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-const typename ConstFixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
+    const typename ConstFixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
 #else
-const typename ConstFixedSegmentReturnType<...>::Type
+    const typename ConstFixedSegmentReturnType<...>::Type
 #endif
-head(NType n) const
-{
+    head(NType n) const {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
-  return typename ConstFixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
-            (derived(), 0, internal::get_runtime_value(n));
+  return typename ConstFixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type(
+      derived(), 0, internal::get_runtime_value(n));
 }
 
 /// \returns an expression of a last coefficients of \c *this with either dynamic or fixed sizes.
@@ -1247,33 +1201,31 @@
 ///
 /// \sa class Block, block(Index,Index)
 ///
-template<typename NType>
+template <typename NType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-typename FixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
+    typename FixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
 #else
-typename FixedSegmentReturnType<...>::Type
+    typename FixedSegmentReturnType<...>::Type
 #endif
-tail(NType n)
-{
+    tail(NType n) {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
-  return typename FixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
-            (derived(), this->size() - internal::get_runtime_value(n), internal::get_runtime_value(n));
+  return typename FixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type(
+      derived(), this->size() - internal::get_runtime_value(n), internal::get_runtime_value(n));
 }
 
 /// This is the const version of tail(Index).
-template<typename NType>
+template <typename NType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-const typename ConstFixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
+    const typename ConstFixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
 #else
-const typename ConstFixedSegmentReturnType<...>::Type
+    const typename ConstFixedSegmentReturnType<...>::Type
 #endif
-tail(NType n) const
-{
+    tail(NType n) const {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
-  return typename ConstFixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type
-            (derived(), this->size() - internal::get_runtime_value(n), internal::get_runtime_value(n));
+  return typename ConstFixedSegmentReturnType<internal::get_fixed_value<NType>::value>::Type(
+      derived(), this->size() - internal::get_runtime_value(n), internal::get_runtime_value(n));
 }
 
 /// \returns a fixed-size expression of a segment (i.e. a vector block) in \c *this
@@ -1292,19 +1244,16 @@
 ///
 /// \sa segment(Index,NType), class Block
 ///
-template<int N>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename FixedSegmentReturnType<N>::Type segment(Index start, Index n = N)
-{
+template <int N>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename FixedSegmentReturnType<N>::Type segment(Index start, Index n = N) {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
   return typename FixedSegmentReturnType<N>::Type(derived(), start, n);
 }
 
 /// This is the const version of segment<int>(Index).
-template<int N>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename ConstFixedSegmentReturnType<N>::Type segment(Index start, Index n = N) const
-{
+template <int N>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename ConstFixedSegmentReturnType<N>::Type segment(Index start,
+                                                                                            Index n = N) const {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
   return typename ConstFixedSegmentReturnType<N>::Type(derived(), start, n);
 }
@@ -1324,19 +1273,15 @@
 ///
 /// \sa head(NType), class Block
 ///
-template<int N>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename FixedSegmentReturnType<N>::Type head(Index n = N)
-{
+template <int N>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename FixedSegmentReturnType<N>::Type head(Index n = N) {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
   return typename FixedSegmentReturnType<N>::Type(derived(), 0, n);
 }
 
 /// This is the const version of head<int>().
-template<int N>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename ConstFixedSegmentReturnType<N>::Type head(Index n = N) const
-{
+template <int N>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename ConstFixedSegmentReturnType<N>::Type head(Index n = N) const {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
   return typename ConstFixedSegmentReturnType<N>::Type(derived(), 0, n);
 }
@@ -1356,19 +1301,15 @@
 ///
 /// \sa tail(NType), class Block
 ///
-template<int N>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename FixedSegmentReturnType<N>::Type tail(Index n = N)
-{
+template <int N>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename FixedSegmentReturnType<N>::Type tail(Index n = N) {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
   return typename FixedSegmentReturnType<N>::Type(derived(), size() - n);
 }
 
 /// This is the const version of tail<int>.
-template<int N>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-typename ConstFixedSegmentReturnType<N>::Type tail(Index n = N) const
-{
+template <int N>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename ConstFixedSegmentReturnType<N>::Type tail(Index n = N) const {
   EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
   return typename ConstFixedSegmentReturnType<N>::Type(derived(), size() - n);
 }
@@ -1376,67 +1317,54 @@
 /// \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
 /// is col-major (resp. row-major).
 ///
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-InnerVectorReturnType innerVector(Index outer)
-{ return InnerVectorReturnType(derived(), outer); }
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE InnerVectorReturnType innerVector(Index outer) {
+  return InnerVectorReturnType(derived(), outer);
+}
 
 /// \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
 /// is col-major (resp. row-major). Read-only.
 ///
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-const ConstInnerVectorReturnType innerVector(Index outer) const
-{ return ConstInnerVectorReturnType(derived(), outer); }
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const ConstInnerVectorReturnType innerVector(Index outer) const {
+  return ConstInnerVectorReturnType(derived(), outer);
+}
 
 /// \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
 /// is col-major (resp. row-major).
 ///
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-InnerVectorsReturnType
-innerVectors(Index outerStart, Index outerSize)
-{
-  return Block<Derived,Dynamic,Dynamic,true>(derived(),
-                                             IsRowMajor ? outerStart : 0, IsRowMajor ? 0 : outerStart,
-                                             IsRowMajor ? outerSize : rows(), IsRowMajor ? cols() : outerSize);
-
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE InnerVectorsReturnType innerVectors(Index outerStart, Index outerSize) {
+  return Block<Derived, Dynamic, Dynamic, true>(derived(), IsRowMajor ? outerStart : 0, IsRowMajor ? 0 : outerStart,
+                                                IsRowMajor ? outerSize : rows(), IsRowMajor ? cols() : outerSize);
 }
 
 /// \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
 /// is col-major (resp. row-major). Read-only.
 ///
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-const ConstInnerVectorsReturnType
-innerVectors(Index outerStart, Index outerSize) const
-{
-  return Block<const Derived,Dynamic,Dynamic,true>(derived(),
-                                                  IsRowMajor ? outerStart : 0, IsRowMajor ? 0 : outerStart,
-                                                  IsRowMajor ? outerSize : rows(), IsRowMajor ? cols() : outerSize);
-
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const ConstInnerVectorsReturnType innerVectors(Index outerStart,
+                                                                                     Index outerSize) const {
+  return Block<const Derived, Dynamic, Dynamic, true>(derived(), IsRowMajor ? outerStart : 0,
+                                                      IsRowMajor ? 0 : outerStart, IsRowMajor ? outerSize : rows(),
+                                                      IsRowMajor ? cols() : outerSize);
 }
 
 /** \returns the i-th subvector (column or vector) according to the \c Direction
-  * \sa subVectors()
-  */
-template<DirectionType Direction>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-std::conditional_t<Direction==Vertical,ColXpr,RowXpr>
-subVector(Index i)
-{
-  return std::conditional_t<Direction==Vertical,ColXpr,RowXpr>(derived(),i);
+ * \sa subVectors()
+ */
+template <DirectionType Direction>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::conditional_t<Direction == Vertical, ColXpr, RowXpr> subVector(Index i) {
+  return std::conditional_t<Direction == Vertical, ColXpr, RowXpr>(derived(), i);
 }
 
 /** This is the const version of subVector(Index) */
-template<DirectionType Direction>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-std::conditional_t<Direction==Vertical,ConstColXpr,ConstRowXpr>
-subVector(Index i) const
-{
-  return std::conditional_t<Direction==Vertical,ConstColXpr,ConstRowXpr>(derived(),i);
+template <DirectionType Direction>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::conditional_t<Direction == Vertical, ConstColXpr, ConstRowXpr> subVector(
+    Index i) const {
+  return std::conditional_t<Direction == Vertical, ConstColXpr, ConstRowXpr>(derived(), i);
 }
 
 /** \returns the number of subvectors (rows or columns) in the direction \c Direction
-  * \sa subVector(Index)
-  */
-template<DirectionType Direction>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR
-Index subVectors() const
-{ return (Direction==Vertical)?cols():rows(); }
+ * \sa subVector(Index)
+ */
+template <DirectionType Direction>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index subVectors() const {
+  return (Direction == Vertical) ? cols() : rows();
+}
diff --git a/Eigen/src/plugins/CommonCwiseBinaryOps.inc b/Eigen/src/plugins/CommonCwiseBinaryOps.inc
index 964913b..95f338a 100644
--- a/Eigen/src/plugins/CommonCwiseBinaryOps.inc
+++ b/Eigen/src/plugins/CommonCwiseBinaryOps.inc
@@ -11,69 +11,65 @@
 // This file is a base class plugin containing common coefficient wise functions.
 
 /** \returns an expression of the difference of \c *this and \a other
-  *
-  * \note If you want to subtract a given scalar from all coefficients, see Cwise::operator-().
-  *
-  * \sa class CwiseBinaryOp, operator-=()
-  */
-EIGEN_MAKE_CWISE_BINARY_OP(operator-,difference)
+ *
+ * \note If you want to subtract a given scalar from all coefficients, see Cwise::operator-().
+ *
+ * \sa class CwiseBinaryOp, operator-=()
+ */
+EIGEN_MAKE_CWISE_BINARY_OP(operator-, difference)
 
 /** \returns an expression of the sum of \c *this and \a other
-  *
-  * \note If you want to add a given scalar to all coefficients, see Cwise::operator+().
-  *
-  * \sa class CwiseBinaryOp, operator+=()
-  */
-EIGEN_MAKE_CWISE_BINARY_OP(operator+,sum)
+ *
+ * \note If you want to add a given scalar to all coefficients, see Cwise::operator+().
+ *
+ * \sa class CwiseBinaryOp, operator+=()
+ */
+EIGEN_MAKE_CWISE_BINARY_OP(operator+, sum)
 
 /** \returns an expression of a custom coefficient-wise operator \a func of *this and \a other
-  *
-  * The template parameter \a CustomBinaryOp is the type of the functor
-  * of the custom operator (see class CwiseBinaryOp for an example)
-  *
-  * Here is an example illustrating the use of custom functors:
-  * \include class_CwiseBinaryOp.cpp
-  * Output: \verbinclude class_CwiseBinaryOp.out
-  *
-  * \sa class CwiseBinaryOp, operator+(), operator-(), cwiseProduct()
-  */
-template<typename CustomBinaryOp, typename OtherDerived>
-EIGEN_DEVICE_FUNC
-EIGEN_STRONG_INLINE const CwiseBinaryOp<CustomBinaryOp, const Derived, const OtherDerived>
-binaryExpr(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other, const CustomBinaryOp& func = CustomBinaryOp()) const
-{
+ *
+ * The template parameter \a CustomBinaryOp is the type of the functor
+ * of the custom operator (see class CwiseBinaryOp for an example)
+ *
+ * Here is an example illustrating the use of custom functors:
+ * \include class_CwiseBinaryOp.cpp
+ * Output: \verbinclude class_CwiseBinaryOp.out
+ *
+ * \sa class CwiseBinaryOp, operator+(), operator-(), cwiseProduct()
+ */
+template <typename CustomBinaryOp, typename OtherDerived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseBinaryOp<CustomBinaryOp, const Derived, const OtherDerived> binaryExpr(
+    const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived>& other, const CustomBinaryOp& func = CustomBinaryOp()) const {
   return CwiseBinaryOp<CustomBinaryOp, const Derived, const OtherDerived>(derived(), other.derived(), func);
 }
 
-
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-EIGEN_MAKE_SCALAR_BINARY_OP(operator*,product)
+EIGEN_MAKE_SCALAR_BINARY_OP(operator*, product)
 #else
 /** \returns an expression of \c *this scaled by the scalar factor \a scalar
-  *
-  * \tparam T is the scalar type of \a scalar. It must be compatible with the scalar type of the given expression.
-  */
-template<typename T>
-const CwiseBinaryOp<internal::scalar_product_op<Scalar,T>,Derived,Constant<T> > operator*(const T& scalar) const;
+ *
+ * \tparam T is the scalar type of \a scalar. It must be compatible with the scalar type of the given expression.
+ */
+template <typename T>
+const CwiseBinaryOp<internal::scalar_product_op<Scalar, T>, Derived, Constant<T> > operator*(const T& scalar) const;
 /** \returns an expression of \a expr scaled by the scalar factor \a scalar
-  *
-  * \tparam T is the scalar type of \a scalar. It must be compatible with the scalar type of the given expression.
-  */
-template<typename T> friend
-const CwiseBinaryOp<internal::scalar_product_op<T,Scalar>,Constant<T>,Derived> operator*(const T& scalar, const StorageBaseType& expr);
+ *
+ * \tparam T is the scalar type of \a scalar. It must be compatible with the scalar type of the given expression.
+ */
+template <typename T>
+friend const CwiseBinaryOp<internal::scalar_product_op<T, Scalar>, Constant<T>, Derived> operator*(
+    const T& scalar, const StorageBaseType& expr);
 #endif
 
-
-
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-EIGEN_MAKE_SCALAR_BINARY_OP_ONTHERIGHT(operator/,quotient)
+EIGEN_MAKE_SCALAR_BINARY_OP_ONTHERIGHT(operator/, quotient)
 #else
 /** \returns an expression of \c *this divided by the scalar value \a scalar
-  *
-  * \tparam T is the scalar type of \a scalar. It must be compatible with the scalar type of the given expression.
-  */
-template<typename T>
-const CwiseBinaryOp<internal::scalar_quotient_op<Scalar,T>,Derived,Constant<T> > operator/(const T& scalar) const;
+ *
+ * \tparam T is the scalar type of \a scalar. It must be compatible with the scalar type of the given expression.
+ */
+template <typename T>
+const CwiseBinaryOp<internal::scalar_quotient_op<Scalar, T>, Derived, Constant<T> > operator/(const T& scalar) const;
 #endif
 
 /** \returns an expression of the coefficient-wise boolean \b and operator of \c *this and \a other
diff --git a/Eigen/src/plugins/CommonCwiseUnaryOps.inc b/Eigen/src/plugins/CommonCwiseUnaryOps.inc
index 1c6b284..f20f2f8 100644
--- a/Eigen/src/plugins/CommonCwiseUnaryOps.inc
+++ b/Eigen/src/plugins/CommonCwiseUnaryOps.inc
@@ -14,19 +14,16 @@
 
 /** \internal the return type of conjugate() */
 typedef std::conditional_t<NumTraits<Scalar>::IsComplex,
-            const CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>, const Derived>,
-            const Derived&
-          > ConjugateReturnType;
+                           const CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>, const Derived>, const Derived&>
+    ConjugateReturnType;
 /** \internal the return type of real() const */
 typedef std::conditional_t<NumTraits<Scalar>::IsComplex,
-            const CwiseUnaryOp<internal::scalar_real_op<Scalar>, const Derived>,
-            const Derived&
-          > RealReturnType;
+                           const CwiseUnaryOp<internal::scalar_real_op<Scalar>, const Derived>, const Derived&>
+    RealReturnType;
 /** \internal the return type of real() */
-typedef std::conditional_t<NumTraits<Scalar>::IsComplex,
-            CwiseUnaryView<internal::scalar_real_ref_op<Scalar>, Derived>,
-            Derived&
-          > NonConstRealReturnType;
+typedef std::conditional_t<NumTraits<Scalar>::IsComplex, CwiseUnaryView<internal::scalar_real_ref_op<Scalar>, Derived>,
+                           Derived&>
+    NonConstRealReturnType;
 /** \internal the return type of imag() const */
 typedef CwiseUnaryOp<internal::scalar_imag_op<Scalar>, const Derived> ImagReturnType;
 /** \internal the return type of imag() */
@@ -34,79 +31,65 @@
 
 typedef CwiseUnaryOp<internal::scalar_opposite_op<Scalar>, const Derived> NegativeReturnType;
 
-#endif // not EIGEN_PARSED_BY_DOXYGEN
+#endif  // not EIGEN_PARSED_BY_DOXYGEN
 
 /// \returns an expression of the opposite of \c *this
 ///
-EIGEN_DOC_UNARY_ADDONS(operator-,opposite)
+EIGEN_DOC_UNARY_ADDONS(operator-, opposite)
 ///
-EIGEN_DEVICE_FUNC
-inline const NegativeReturnType
-operator-() const { return NegativeReturnType(derived()); }
+EIGEN_DEVICE_FUNC inline const NegativeReturnType operator-() const { return NegativeReturnType(derived()); }
 
-
-template<class NewType> struct CastXpr { typedef typename internal::cast_return_type<Derived,const CwiseUnaryOp<internal::core_cast_op<Scalar, NewType>, const Derived> >::type Type; };
+template <class NewType>
+struct CastXpr {
+  typedef typename internal::cast_return_type<
+      Derived, const CwiseUnaryOp<internal::core_cast_op<Scalar, NewType>, const Derived> >::type Type;
+};
 
 /// \returns an expression of \c *this with the \a Scalar type casted to
 /// \a NewScalar.
 ///
 /// The template parameter \a NewScalar is the type we are casting the scalars to.
 ///
-EIGEN_DOC_UNARY_ADDONS(cast,conversion function)
+EIGEN_DOC_UNARY_ADDONS(cast, conversion function)
 ///
 /// \sa class CwiseUnaryOp
 ///
-template<typename NewType>
-EIGEN_DEVICE_FUNC
-typename CastXpr<NewType>::Type
-cast() const
-{
+template <typename NewType>
+EIGEN_DEVICE_FUNC typename CastXpr<NewType>::Type cast() const {
   return typename CastXpr<NewType>::Type(derived());
 }
 
 /// \returns an expression of the complex conjugate of \c *this.
 ///
-EIGEN_DOC_UNARY_ADDONS(conjugate,complex conjugate)
+EIGEN_DOC_UNARY_ADDONS(conjugate, complex conjugate)
 ///
 /// \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_conj">Math functions</a>, MatrixBase::adjoint()
-EIGEN_DEVICE_FUNC
-inline ConjugateReturnType
-conjugate() const
-{
-  return ConjugateReturnType(derived());
-}
+EIGEN_DEVICE_FUNC inline ConjugateReturnType conjugate() const { return ConjugateReturnType(derived()); }
 
 /// \returns an expression of the complex conjugate of \c *this if Cond==true, returns derived() otherwise.
 ///
-EIGEN_DOC_UNARY_ADDONS(conjugate,complex conjugate)
+EIGEN_DOC_UNARY_ADDONS(conjugate, complex conjugate)
 ///
 /// \sa conjugate()
-template<bool Cond>
-EIGEN_DEVICE_FUNC
-inline std::conditional_t<Cond,ConjugateReturnType,const Derived&>
-conjugateIf() const
-{
-  typedef std::conditional_t<Cond,ConjugateReturnType,const Derived&> ReturnType;
+template <bool Cond>
+EIGEN_DEVICE_FUNC inline std::conditional_t<Cond, ConjugateReturnType, const Derived&> conjugateIf() const {
+  typedef std::conditional_t<Cond, ConjugateReturnType, const Derived&> ReturnType;
   return ReturnType(derived());
 }
 
 /// \returns a read-only expression of the real part of \c *this.
 ///
-EIGEN_DOC_UNARY_ADDONS(real,real part function)
+EIGEN_DOC_UNARY_ADDONS(real, real part function)
 ///
 /// \sa imag()
-EIGEN_DEVICE_FUNC
-inline RealReturnType
-real() const { return RealReturnType(derived()); }
+EIGEN_DEVICE_FUNC inline RealReturnType real() const { return RealReturnType(derived()); }
 
 /// \returns an read-only expression of the imaginary part of \c *this.
 ///
-EIGEN_DOC_UNARY_ADDONS(imag,imaginary part function)
+EIGEN_DOC_UNARY_ADDONS(imag, imaginary part function)
 ///
 /// \sa real()
-EIGEN_DEVICE_FUNC
-inline const ImagReturnType
-imag() const { return ImagReturnType(derived()); }
+EIGEN_DEVICE_FUNC inline const ImagReturnType imag() const { return ImagReturnType(derived()); }
 
 /// \brief Apply a unary operator coefficient-wise
 /// \param[in]  func  Functor implementing the unary operator
@@ -125,15 +108,13 @@
 /// \include class_CwiseUnaryOp.cpp
 /// Output: \verbinclude class_CwiseUnaryOp.out
 ///
-EIGEN_DOC_UNARY_ADDONS(unaryExpr,unary function)
+EIGEN_DOC_UNARY_ADDONS(unaryExpr, unary function)
 ///
 /// \sa unaryViewExpr, binaryExpr, class CwiseUnaryOp
 ///
-template<typename CustomUnaryOp>
-EIGEN_DEVICE_FUNC
-inline const CwiseUnaryOp<CustomUnaryOp, const Derived>
-unaryExpr(const CustomUnaryOp& func = CustomUnaryOp()) const
-{
+template <typename CustomUnaryOp>
+EIGEN_DEVICE_FUNC inline const CwiseUnaryOp<CustomUnaryOp, const Derived> unaryExpr(
+    const CustomUnaryOp& func = CustomUnaryOp()) const {
   return CwiseUnaryOp<CustomUnaryOp, const Derived>(derived(), func);
 }
 
@@ -146,32 +127,26 @@
 /// \include class_CwiseUnaryOp.cpp
 /// Output: \verbinclude class_CwiseUnaryOp.out
 ///
-EIGEN_DOC_UNARY_ADDONS(unaryViewExpr,unary function)
+EIGEN_DOC_UNARY_ADDONS(unaryViewExpr, unary function)
 ///
 /// \sa unaryExpr, binaryExpr class CwiseUnaryOp
 ///
-template<typename CustomViewOp>
-EIGEN_DEVICE_FUNC
-inline const CwiseUnaryView<CustomViewOp, const Derived>
-unaryViewExpr(const CustomViewOp& func = CustomViewOp()) const
-{
+template <typename CustomViewOp>
+EIGEN_DEVICE_FUNC inline const CwiseUnaryView<CustomViewOp, const Derived> unaryViewExpr(
+    const CustomViewOp& func = CustomViewOp()) const {
   return CwiseUnaryView<CustomViewOp, const Derived>(derived(), func);
 }
 
 /// \returns a non const expression of the real part of \c *this.
 ///
-EIGEN_DOC_UNARY_ADDONS(real,real part function)
+EIGEN_DOC_UNARY_ADDONS(real, real part function)
 ///
 /// \sa imag()
-EIGEN_DEVICE_FUNC
-inline NonConstRealReturnType
-real() { return NonConstRealReturnType(derived()); }
+EIGEN_DEVICE_FUNC inline NonConstRealReturnType real() { return NonConstRealReturnType(derived()); }
 
 /// \returns a non const expression of the imaginary part of \c *this.
 ///
-EIGEN_DOC_UNARY_ADDONS(imag,imaginary part function)
+EIGEN_DOC_UNARY_ADDONS(imag, imaginary part function)
 ///
 /// \sa real()
-EIGEN_DEVICE_FUNC
-inline NonConstImagReturnType
-imag() { return NonConstImagReturnType(derived()); }
+EIGEN_DEVICE_FUNC inline NonConstImagReturnType imag() { return NonConstImagReturnType(derived()); }
diff --git a/Eigen/src/plugins/IndexedViewMethods.inc b/Eigen/src/plugins/IndexedViewMethods.inc
index e5432ea..26e7b5f 100644
--- a/Eigen/src/plugins/IndexedViewMethods.inc
+++ b/Eigen/src/plugins/IndexedViewMethods.inc
@@ -7,7 +7,6 @@
 // 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/.
 
-
 #if !defined(EIGEN_PARSED_BY_DOXYGEN)
 
 protected:
@@ -44,9 +43,12 @@
 
 // this helper class assumes internal::valid_indexed_view_overload<RowIndices, ColIndices>::value == true
 template <typename RowIndices, typename ColIndices,
-          bool UseSymbolic = internal::traits<IndexedView<Derived, IvcRowType<RowIndices>, IvcColType<ColIndices>>>::ReturnAsScalar,
-          bool UseBlock = internal::traits<IndexedView<Derived, IvcRowType<RowIndices>, IvcColType<ColIndices>>>::ReturnAsBlock,
-          bool UseGeneric = internal::traits<IndexedView<Derived, IvcRowType<RowIndices>, IvcColType<ColIndices>>>::ReturnAsIndexedView>
+          bool UseSymbolic =
+              internal::traits<IndexedView<Derived, IvcRowType<RowIndices>, IvcColType<ColIndices>>>::ReturnAsScalar,
+          bool UseBlock =
+              internal::traits<IndexedView<Derived, IvcRowType<RowIndices>, IvcColType<ColIndices>>>::ReturnAsBlock,
+          bool UseGeneric = internal::traits<
+              IndexedView<Derived, IvcRowType<RowIndices>, IvcColType<ColIndices>>>::ReturnAsIndexedView>
 struct IndexedViewSelector;
 
 // Generic
@@ -105,8 +107,7 @@
 };
 
 // this helper class assumes internal::is_valid_index_type<Indices>::value == false
-template <typename Indices, 
-          bool UseSymbolic = symbolic::is_symbolic<Indices>::value,
+template <typename Indices, bool UseSymbolic = symbolic::is_symbolic<Indices>::value,
           bool UseBlock = !UseSymbolic && internal::get_compile_time_incr<IvcType<Indices>>::value == 1,
           bool UseGeneric = !UseSymbolic && !UseBlock>
 struct VectorIndexedViewSelector;
@@ -114,7 +115,6 @@
 // Generic
 template <typename Indices>
 struct VectorIndexedViewSelector<Indices, false, false, true> {
-
   static constexpr bool IsRowMajor = DenseBase<Derived>::IsRowMajor;
 
   using RowMajorReturnType = IndexedView<Derived, IvcIndex, IvcType<Indices>>;
@@ -148,7 +148,6 @@
 // Block
 template <typename Indices>
 struct VectorIndexedViewSelector<Indices, false, true, false> {
-
   using ReturnType = VectorBlock<Derived, internal::array_size<Indices>::value>;
   using ConstReturnType = VectorBlock<const Derived, internal::array_size<Indices>::value>;
 
@@ -165,7 +164,6 @@
 // Symbolic
 template <typename Indices>
 struct VectorIndexedViewSelector<Indices, true, false, false> {
-
   using ReturnType = typename DenseBase<Derived>::Scalar&;
   using ConstReturnType = typename DenseBase<Derived>::CoeffReturnType;
 
@@ -195,7 +193,6 @@
 using EnableConstVectorOverload = std::enable_if_t<!internal::is_valid_index_type<Indices>::value, bool>;
 
 public:
-
 // Public API for 2D matrices/arrays
 
 // non-const versions
@@ -299,52 +296,56 @@
   return VectorIndexedViewSelector<Indices>::run(derived(), Indices{indices});
 }
 
-#else // EIGEN_PARSED_BY_DOXYGEN
+#else  // EIGEN_PARSED_BY_DOXYGEN
 
 /**
-  * \returns a generic submatrix view defined by the rows and columns indexed \a rowIndices and \a colIndices respectively.
-  *
-  * Each parameter must either be:
-  *  - An integer indexing a single row or column
-  *  - Eigen::placeholders::all indexing the full set of respective rows or columns in increasing order
-  *  - An ArithmeticSequence as returned by the Eigen::seq and Eigen::seqN functions
-  *  - Any %Eigen's vector/array of integers or expressions
-  *  - Plain C arrays: \c int[N]
-  *  - And more generally any type exposing the following two member functions:
-  * \code
-  * <integral type> operator[](<integral type>) const;
-  * <integral type> size() const;
-  * \endcode
-  * where \c <integral \c type>  stands for any integer type compatible with Eigen::Index (i.e. \c std::ptrdiff_t).
-  *
-  * The last statement implies compatibility with \c std::vector, \c std::valarray, \c std::array, many of the Range-v3's ranges, etc.
-  *
-  * If the submatrix can be represented using a starting position \c (i,j) and positive sizes \c (rows,columns), then this
-  * method will returns a Block object after extraction of the relevant information from the passed arguments. This is the case
-  * when all arguments are either:
-  *  - An integer
-  *  - Eigen::placeholders::all
-  *  - An ArithmeticSequence with compile-time increment strictly equal to 1, as returned by Eigen::seq(a,b), and Eigen::seqN(a,N).
-  *
-  * Otherwise a more general IndexedView<Derived,RowIndices',ColIndices'> object will be returned, after conversion of the inputs
-  * to more suitable types \c RowIndices' and \c ColIndices'.
-  *
-  * For 1D vectors and arrays, you better use the operator()(const Indices&) overload, which behave the same way but taking a single parameter.
-  *
-  * See also this <a href="https://stackoverflow.com/questions/46110917/eigen-replicate-items-along-one-dimension-without-useless-allocations">question</a> and its answer for an example of how to duplicate coefficients.
-  *
-  * \sa operator()(const Indices&), class Block, class IndexedView, DenseBase::block(Index,Index,Index,Index)
-  */
-template<typename RowIndices, typename ColIndices>
-IndexedView_or_Block
-operator()(const RowIndices& rowIndices, const ColIndices& colIndices);
+ * \returns a generic submatrix view defined by the rows and columns indexed \a rowIndices and \a colIndices
+ * respectively.
+ *
+ * Each parameter must either be:
+ *  - An integer indexing a single row or column
+ *  - Eigen::placeholders::all indexing the full set of respective rows or columns in increasing order
+ *  - An ArithmeticSequence as returned by the Eigen::seq and Eigen::seqN functions
+ *  - Any %Eigen's vector/array of integers or expressions
+ *  - Plain C arrays: \c int[N]
+ *  - And more generally any type exposing the following two member functions:
+ * \code
+ * <integral type> operator[](<integral type>) const;
+ * <integral type> size() const;
+ * \endcode
+ * where \c <integral \c type>  stands for any integer type compatible with Eigen::Index (i.e. \c std::ptrdiff_t).
+ *
+ * The last statement implies compatibility with \c std::vector, \c std::valarray, \c std::array, many of the Range-v3's
+ * ranges, etc.
+ *
+ * If the submatrix can be represented using a starting position \c (i,j) and positive sizes \c (rows,columns), then
+ * this method will returns a Block object after extraction of the relevant information from the passed arguments. This
+ * is the case when all arguments are either:
+ *  - An integer
+ *  - Eigen::placeholders::all
+ *  - An ArithmeticSequence with compile-time increment strictly equal to 1, as returned by Eigen::seq(a,b), and
+ * Eigen::seqN(a,N).
+ *
+ * Otherwise a more general IndexedView<Derived,RowIndices',ColIndices'> object will be returned, after conversion of
+ * the inputs to more suitable types \c RowIndices' and \c ColIndices'.
+ *
+ * For 1D vectors and arrays, you better use the operator()(const Indices&) overload, which behave the same way but
+ * taking a single parameter.
+ *
+ * See also this <a
+ * href="https://stackoverflow.com/questions/46110917/eigen-replicate-items-along-one-dimension-without-useless-allocations">question</a>
+ * and its answer for an example of how to duplicate coefficients.
+ *
+ * \sa operator()(const Indices&), class Block, class IndexedView, DenseBase::block(Index,Index,Index,Index)
+ */
+template <typename RowIndices, typename ColIndices>
+IndexedView_or_Block operator()(const RowIndices& rowIndices, const ColIndices& colIndices);
 
 /** This is an overload of operator()(const RowIndices&, const ColIndices&) for 1D vectors or arrays
-  *
-  * \only_for_vectors
-  */
-template<typename Indices>
-IndexedView_or_VectorBlock
-operator()(const Indices& indices);
+ *
+ * \only_for_vectors
+ */
+template <typename Indices>
+IndexedView_or_VectorBlock operator()(const Indices& indices);
 
 #endif  // EIGEN_PARSED_BY_DOXYGEN
diff --git a/Eigen/src/plugins/MatrixCwiseBinaryOps.inc b/Eigen/src/plugins/MatrixCwiseBinaryOps.inc
index fd59414..fae92d8 100644
--- a/Eigen/src/plugins/MatrixCwiseBinaryOps.inc
+++ b/Eigen/src/plugins/MatrixCwiseBinaryOps.inc
@@ -11,297 +11,321 @@
 // This file is a base class plugin containing matrix specifics coefficient wise functions.
 
 /** \returns an expression of the Schur product (coefficient wise product) of *this and \a other
-  *
-  * Example: \include MatrixBase_cwiseProduct.cpp
-  * Output: \verbinclude MatrixBase_cwiseProduct.out
-  *
-  * \sa class CwiseBinaryOp, cwiseAbs2
-  */
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC
-EIGEN_STRONG_INLINE const EIGEN_CWISE_BINARY_RETURN_TYPE(Derived,OtherDerived,product)
-cwiseProduct(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const
-{
-  return EIGEN_CWISE_BINARY_RETURN_TYPE(Derived,OtherDerived,product)(derived(), other.derived());
+ *
+ * Example: \include MatrixBase_cwiseProduct.cpp
+ * Output: \verbinclude MatrixBase_cwiseProduct.out
+ *
+ * \sa class CwiseBinaryOp, cwiseAbs2
+ */
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const EIGEN_CWISE_BINARY_RETURN_TYPE(Derived, OtherDerived, product)
+    cwiseProduct(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived>& other) const {
+  return EIGEN_CWISE_BINARY_RETURN_TYPE(Derived, OtherDerived, product)(derived(), other.derived());
 }
 
-template<typename OtherDerived> using CwiseBinaryEqualReturnType = CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_EQ>, const Derived, const OtherDerived>;
-template<typename OtherDerived> using CwiseBinaryNotEqualReturnType = CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_NEQ>, const Derived, const OtherDerived>;
-template<typename OtherDerived> using CwiseBinaryLessReturnType = CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_LT>, const Derived, const OtherDerived>;
-template<typename OtherDerived> using CwiseBinaryGreaterReturnType = CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_GT>, const Derived, const OtherDerived>;
-template<typename OtherDerived> using CwiseBinaryLessOrEqualReturnType = CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_LE>, const Derived, const OtherDerived>;
-template<typename OtherDerived> using CwiseBinaryGreaterOrEqualReturnType = CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_GE>, const Derived, const OtherDerived>;
+template <typename OtherDerived>
+using CwiseBinaryEqualReturnType =
+    CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_EQ>, const Derived, const OtherDerived>;
+template <typename OtherDerived>
+using CwiseBinaryNotEqualReturnType =
+    CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_NEQ>, const Derived, const OtherDerived>;
+template <typename OtherDerived>
+using CwiseBinaryLessReturnType =
+    CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_LT>, const Derived, const OtherDerived>;
+template <typename OtherDerived>
+using CwiseBinaryGreaterReturnType =
+    CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_GT>, const Derived, const OtherDerived>;
+template <typename OtherDerived>
+using CwiseBinaryLessOrEqualReturnType =
+    CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_LE>, const Derived, const OtherDerived>;
+template <typename OtherDerived>
+using CwiseBinaryGreaterOrEqualReturnType =
+    CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_GE>, const Derived, const OtherDerived>;
 
 /** \returns an expression of the coefficient-wise == operator of *this and \a other
-  *
-  * \warning this performs an exact comparison, which is generally a bad idea with floating-point types.
-  * In order to check for equality between two vectors or matrices with floating-point coefficients, it is
-  * generally a far better idea to use a fuzzy comparison as provided by isApprox() and
-  * isMuchSmallerThan().
-  *
-  * Example: \include MatrixBase_cwiseEqual.cpp
-  * Output: \verbinclude MatrixBase_cwiseEqual.out
-  *
-  * \sa cwiseNotEqual(), isApprox(), isMuchSmallerThan()
-  */
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC
-inline const CwiseBinaryEqualReturnType<OtherDerived>
-cwiseEqual(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const
-{
+ *
+ * \warning this performs an exact comparison, which is generally a bad idea with floating-point types.
+ * In order to check for equality between two vectors or matrices with floating-point coefficients, it is
+ * generally a far better idea to use a fuzzy comparison as provided by isApprox() and
+ * isMuchSmallerThan().
+ *
+ * Example: \include MatrixBase_cwiseEqual.cpp
+ * Output: \verbinclude MatrixBase_cwiseEqual.out
+ *
+ * \sa cwiseNotEqual(), isApprox(), isMuchSmallerThan()
+ */
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC inline const CwiseBinaryEqualReturnType<OtherDerived> cwiseEqual(
+    const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived>& other) const {
   return CwiseBinaryEqualReturnType<OtherDerived>(derived(), other.derived());
 }
 
 /** \returns an expression of the coefficient-wise != operator of *this and \a other
-  *
-  * \warning this performs an exact comparison, which is generally a bad idea with floating-point types.
-  * In order to check for equality between two vectors or matrices with floating-point coefficients, it is
-  * generally a far better idea to use a fuzzy comparison as provided by isApprox() and
-  * isMuchSmallerThan().
-  *
-  * Example: \include MatrixBase_cwiseNotEqual.cpp
-  * Output: \verbinclude MatrixBase_cwiseNotEqual.out
-  *
-  * \sa cwiseEqual(), isApprox(), isMuchSmallerThan()
-  */
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC
-inline const CwiseBinaryNotEqualReturnType<OtherDerived>
-cwiseNotEqual(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const
-{
+ *
+ * \warning this performs an exact comparison, which is generally a bad idea with floating-point types.
+ * In order to check for equality between two vectors or matrices with floating-point coefficients, it is
+ * generally a far better idea to use a fuzzy comparison as provided by isApprox() and
+ * isMuchSmallerThan().
+ *
+ * Example: \include MatrixBase_cwiseNotEqual.cpp
+ * Output: \verbinclude MatrixBase_cwiseNotEqual.out
+ *
+ * \sa cwiseEqual(), isApprox(), isMuchSmallerThan()
+ */
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC inline const CwiseBinaryNotEqualReturnType<OtherDerived> cwiseNotEqual(
+    const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived>& other) const {
   return CwiseBinaryNotEqualReturnType<OtherDerived>(derived(), other.derived());
 }
 
 /** \returns an expression of the coefficient-wise < operator of *this and \a other */
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC
-inline const CwiseBinaryLessReturnType<OtherDerived>
-cwiseLess(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived>& other) const
-{
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC inline const CwiseBinaryLessReturnType<OtherDerived> cwiseLess(
+    const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived>& other) const {
   return CwiseBinaryLessReturnType<OtherDerived>(derived(), other.derived());
 }
 
 /** \returns an expression of the coefficient-wise > operator of *this and \a other */
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC
-inline const CwiseBinaryGreaterReturnType<OtherDerived>
-cwiseGreater(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived>& other) const
-{
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC inline const CwiseBinaryGreaterReturnType<OtherDerived> cwiseGreater(
+    const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived>& other) const {
   return CwiseBinaryGreaterReturnType<OtherDerived>(derived(), other.derived());
 }
 
 /** \returns an expression of the coefficient-wise <= operator of *this and \a other */
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC
-inline const CwiseBinaryLessOrEqualReturnType<OtherDerived>
-cwiseLessOrEqual(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived>& other) const
-{
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC inline const CwiseBinaryLessOrEqualReturnType<OtherDerived> cwiseLessOrEqual(
+    const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived>& other) const {
   return CwiseBinaryLessOrEqualReturnType<OtherDerived>(derived(), other.derived());
 }
 
 /** \returns an expression of the coefficient-wise >= operator of *this and \a other */
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC
-inline const CwiseBinaryGreaterOrEqualReturnType<OtherDerived>
-cwiseGreaterOrEqual(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived>& other) const
-{
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC inline const CwiseBinaryGreaterOrEqualReturnType<OtherDerived> cwiseGreaterOrEqual(
+    const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived>& other) const {
   return CwiseBinaryGreaterOrEqualReturnType<OtherDerived>(derived(), other.derived());
 }
 
 /** \returns an expression of the coefficient-wise min of *this and \a other
-  *
-  * Example: \include MatrixBase_cwiseMin.cpp
-  * Output: \verbinclude MatrixBase_cwiseMin.out
-  *
-  * \sa class CwiseBinaryOp, max()
-  */
-template<int NaNPropagation=PropagateFast, typename OtherDerived>
-EIGEN_DEVICE_FUNC
-EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_min_op<Scalar,Scalar,NaNPropagation>, const Derived, const OtherDerived>
-cwiseMin(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const
-{
-  return CwiseBinaryOp<internal::scalar_min_op<Scalar,Scalar,NaNPropagation>, const Derived, const OtherDerived>(derived(), other.derived());
+ *
+ * Example: \include MatrixBase_cwiseMin.cpp
+ * Output: \verbinclude MatrixBase_cwiseMin.out
+ *
+ * \sa class CwiseBinaryOp, max()
+ */
+template <int NaNPropagation = PropagateFast, typename OtherDerived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const
+    CwiseBinaryOp<internal::scalar_min_op<Scalar, Scalar, NaNPropagation>, const Derived, const OtherDerived>
+    cwiseMin(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived>& other) const {
+  return CwiseBinaryOp<internal::scalar_min_op<Scalar, Scalar, NaNPropagation>, const Derived, const OtherDerived>(
+      derived(), other.derived());
 }
 
 /** \returns an expression of the coefficient-wise min of *this and scalar \a other
-  *
-  * \sa class CwiseBinaryOp, min()
-  */
-template<int NaNPropagation=PropagateFast>
-EIGEN_DEVICE_FUNC
-EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_min_op<Scalar,Scalar,NaNPropagation>, const Derived, const ConstantReturnType>
-cwiseMin(const Scalar &other) const
-{
+ *
+ * \sa class CwiseBinaryOp, min()
+ */
+template <int NaNPropagation = PropagateFast>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const
+    CwiseBinaryOp<internal::scalar_min_op<Scalar, Scalar, NaNPropagation>, const Derived, const ConstantReturnType>
+    cwiseMin(const Scalar& other) const {
   return cwiseMin<NaNPropagation>(Derived::Constant(rows(), cols(), other));
 }
 
 /** \returns an expression of the coefficient-wise max of *this and \a other
-  *
-  * Example: \include MatrixBase_cwiseMax.cpp
-  * Output: \verbinclude MatrixBase_cwiseMax.out
-  *
-  * \sa class CwiseBinaryOp, min()
-  */
-template<int NaNPropagation=PropagateFast, typename OtherDerived>
-EIGEN_DEVICE_FUNC
-EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_max_op<Scalar,Scalar,NaNPropagation>, const Derived, const OtherDerived>
-cwiseMax(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const
-{
-  return CwiseBinaryOp<internal::scalar_max_op<Scalar,Scalar,NaNPropagation>, const Derived, const OtherDerived>(derived(), other.derived());
+ *
+ * Example: \include MatrixBase_cwiseMax.cpp
+ * Output: \verbinclude MatrixBase_cwiseMax.out
+ *
+ * \sa class CwiseBinaryOp, min()
+ */
+template <int NaNPropagation = PropagateFast, typename OtherDerived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const
+    CwiseBinaryOp<internal::scalar_max_op<Scalar, Scalar, NaNPropagation>, const Derived, const OtherDerived>
+    cwiseMax(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived>& other) const {
+  return CwiseBinaryOp<internal::scalar_max_op<Scalar, Scalar, NaNPropagation>, const Derived, const OtherDerived>(
+      derived(), other.derived());
 }
 
 /** \returns an expression of the coefficient-wise max of *this and scalar \a other
-  *
-  * \sa class CwiseBinaryOp, min()
-  */
-template<int NaNPropagation=PropagateFast>
-EIGEN_DEVICE_FUNC
-EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_max_op<Scalar,Scalar,NaNPropagation>, const Derived, const ConstantReturnType>
-cwiseMax(const Scalar &other) const
-{
+ *
+ * \sa class CwiseBinaryOp, min()
+ */
+template <int NaNPropagation = PropagateFast>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const
+    CwiseBinaryOp<internal::scalar_max_op<Scalar, Scalar, NaNPropagation>, const Derived, const ConstantReturnType>
+    cwiseMax(const Scalar& other) const {
   return cwiseMax<NaNPropagation>(Derived::Constant(rows(), cols(), other));
 }
 
-
 /** \returns an expression of the coefficient-wise quotient of *this and \a other
-  *
-  * Example: \include MatrixBase_cwiseQuotient.cpp
-  * Output: \verbinclude MatrixBase_cwiseQuotient.out
-  *
-  * \sa class CwiseBinaryOp, cwiseProduct(), cwiseInverse()
-  */
-template<typename OtherDerived>
-EIGEN_DEVICE_FUNC
-EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_quotient_op<Scalar>, const Derived, const OtherDerived>
-cwiseQuotient(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const
-{
-  return CwiseBinaryOp<internal::scalar_quotient_op<Scalar>, const Derived, const OtherDerived>(derived(), other.derived());
+ *
+ * Example: \include MatrixBase_cwiseQuotient.cpp
+ * Output: \verbinclude MatrixBase_cwiseQuotient.out
+ *
+ * \sa class CwiseBinaryOp, cwiseProduct(), cwiseInverse()
+ */
+template <typename OtherDerived>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const
+    CwiseBinaryOp<internal::scalar_quotient_op<Scalar>, const Derived, const OtherDerived>
+    cwiseQuotient(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived>& other) const {
+  return CwiseBinaryOp<internal::scalar_quotient_op<Scalar>, const Derived, const OtherDerived>(derived(),
+                                                                                                other.derived());
 }
 
-using CwiseScalarEqualReturnType = CwiseBinaryOp<internal::scalar_cmp_op<Scalar,Scalar,internal::cmp_EQ>, const Derived, const ConstantReturnType>;
-using CwiseScalarNotEqualReturnType = CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_NEQ>, const Derived, const ConstantReturnType>;
-using CwiseScalarLessReturnType = CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_LT>, const Derived, const ConstantReturnType>;
-using CwiseScalarGreaterReturnType = CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_GT>, const Derived, const ConstantReturnType>;
-using CwiseScalarLessOrEqualReturnType = CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_LE>, const Derived, const ConstantReturnType>;
-using CwiseScalarGreaterOrEqualReturnType = CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_GE>, const Derived, const ConstantReturnType>;
+using CwiseScalarEqualReturnType =
+    CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_EQ>, const Derived, const ConstantReturnType>;
+using CwiseScalarNotEqualReturnType =
+    CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_NEQ>, const Derived, const ConstantReturnType>;
+using CwiseScalarLessReturnType =
+    CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_LT>, const Derived, const ConstantReturnType>;
+using CwiseScalarGreaterReturnType =
+    CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_GT>, const Derived, const ConstantReturnType>;
+using CwiseScalarLessOrEqualReturnType =
+    CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_LE>, const Derived, const ConstantReturnType>;
+using CwiseScalarGreaterOrEqualReturnType =
+    CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_GE>, const Derived, const ConstantReturnType>;
 
 /** \returns an expression of the coefficient-wise == operator of \c *this and a scalar \a s
-  *
-  * \warning this performs an exact comparison, which is generally a bad idea with floating-point types.
-  * In order to check for equality between two vectors or matrices with floating-point coefficients, it is
-  * generally a far better idea to use a fuzzy comparison as provided by isApprox() and
-  * isMuchSmallerThan().
-  *
-  * \sa cwiseEqual(const MatrixBase<OtherDerived> &) const
-  */
-EIGEN_DEVICE_FUNC
-inline const CwiseScalarEqualReturnType
-cwiseEqual(const Scalar& s) const
-{
+ *
+ * \warning this performs an exact comparison, which is generally a bad idea with floating-point types.
+ * In order to check for equality between two vectors or matrices with floating-point coefficients, it is
+ * generally a far better idea to use a fuzzy comparison as provided by isApprox() and
+ * isMuchSmallerThan().
+ *
+ * \sa cwiseEqual(const MatrixBase<OtherDerived> &) const
+ */
+EIGEN_DEVICE_FUNC inline const CwiseScalarEqualReturnType cwiseEqual(const Scalar& s) const {
   return CwiseScalarEqualReturnType(derived(), Derived::Constant(rows(), cols(), s));
 }
 
-
 /** \returns an expression of the coefficient-wise == operator of \c *this and a scalar \a s
-  *
-  * \warning this performs an exact comparison, which is generally a bad idea with floating-point types.
-  * In order to check for equality between two vectors or matrices with floating-point coefficients, it is
-  * generally a far better idea to use a fuzzy comparison as provided by isApprox() and
-  * isMuchSmallerThan().
-  *
-  * \sa cwiseEqual(const MatrixBase<OtherDerived> &) const
-  */
-EIGEN_DEVICE_FUNC
-inline const CwiseScalarNotEqualReturnType
-cwiseNotEqual(const Scalar& s) const
-{
+ *
+ * \warning this performs an exact comparison, which is generally a bad idea with floating-point types.
+ * In order to check for equality between two vectors or matrices with floating-point coefficients, it is
+ * generally a far better idea to use a fuzzy comparison as provided by isApprox() and
+ * isMuchSmallerThan().
+ *
+ * \sa cwiseEqual(const MatrixBase<OtherDerived> &) const
+ */
+EIGEN_DEVICE_FUNC inline const CwiseScalarNotEqualReturnType cwiseNotEqual(const Scalar& s) const {
   return CwiseScalarNotEqualReturnType(derived(), Derived::Constant(rows(), cols(), s));
 }
 
 /** \returns an expression of the coefficient-wise < operator of \c *this and a scalar \a s */
-EIGEN_DEVICE_FUNC
-inline const CwiseScalarLessReturnType
-cwiseLess(const Scalar& s) const
-{
+EIGEN_DEVICE_FUNC inline const CwiseScalarLessReturnType cwiseLess(const Scalar& s) const {
   return CwiseScalarLessReturnType(derived(), Derived::Constant(rows(), cols(), s));
 }
 
 /** \returns an expression of the coefficient-wise > operator of \c *this and a scalar \a s */
-EIGEN_DEVICE_FUNC
-inline const CwiseScalarGreaterReturnType
-cwiseGreater(const Scalar& s) const
-{
+EIGEN_DEVICE_FUNC inline const CwiseScalarGreaterReturnType cwiseGreater(const Scalar& s) const {
   return CwiseScalarGreaterReturnType(derived(), Derived::Constant(rows(), cols(), s));
 }
 
 /** \returns an expression of the coefficient-wise <= operator of \c *this and a scalar \a s */
-EIGEN_DEVICE_FUNC
-inline const CwiseScalarLessOrEqualReturnType
-cwiseLessOrEqual(const Scalar& s) const
-{
+EIGEN_DEVICE_FUNC inline const CwiseScalarLessOrEqualReturnType cwiseLessOrEqual(const Scalar& s) const {
   return CwiseScalarLessOrEqualReturnType(derived(), Derived::Constant(rows(), cols(), s));
 }
 
 /** \returns an expression of the coefficient-wise >= operator of \c *this and a scalar \a s */
-EIGEN_DEVICE_FUNC
-inline const CwiseScalarGreaterOrEqualReturnType
-cwiseGreaterOrEqual(const Scalar& s) const
-{
+EIGEN_DEVICE_FUNC inline const CwiseScalarGreaterOrEqualReturnType cwiseGreaterOrEqual(const Scalar& s) const {
   return CwiseScalarGreaterOrEqualReturnType(derived(), Derived::Constant(rows(), cols(), s));
 }
 
-template<typename OtherDerived> using CwiseBinaryTypedEqualReturnType = CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_EQ, true>, const Derived, const OtherDerived>;
-template<typename OtherDerived> using CwiseBinaryTypedNotEqualReturnType = CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_NEQ, true>, const Derived, const OtherDerived>;
-template<typename OtherDerived> using CwiseBinaryTypedLessReturnType = CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_LT, true>, const Derived, const OtherDerived>;
-template<typename OtherDerived> using CwiseBinaryTypedGreaterReturnType = CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_GT, true>, const Derived, const OtherDerived>;
-template<typename OtherDerived> using CwiseBinaryTypedLessOrEqualReturnType = CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_LE, true>, const Derived, const OtherDerived>;
-template<typename OtherDerived> using CwiseBinaryTypedGreaterOrEqualReturnType = CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_GE, true>, const Derived, const OtherDerived>;
+template <typename OtherDerived>
+using CwiseBinaryTypedEqualReturnType =
+    CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_EQ, true>, const Derived, const OtherDerived>;
+template <typename OtherDerived>
+using CwiseBinaryTypedNotEqualReturnType =
+    CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_NEQ, true>, const Derived, const OtherDerived>;
+template <typename OtherDerived>
+using CwiseBinaryTypedLessReturnType =
+    CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_LT, true>, const Derived, const OtherDerived>;
+template <typename OtherDerived>
+using CwiseBinaryTypedGreaterReturnType =
+    CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_GT, true>, const Derived, const OtherDerived>;
+template <typename OtherDerived>
+using CwiseBinaryTypedLessOrEqualReturnType =
+    CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_LE, true>, const Derived, const OtherDerived>;
+template <typename OtherDerived>
+using CwiseBinaryTypedGreaterOrEqualReturnType =
+    CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_GE, true>, const Derived, const OtherDerived>;
 
 template <typename OtherDerived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseBinaryTypedEqualReturnType<OtherDerived>
-cwiseTypedEqual(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived>& other) const { return CwiseBinaryTypedEqualReturnType<OtherDerived>(derived(), other.derived()); }
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseBinaryTypedEqualReturnType<OtherDerived> cwiseTypedEqual(
+    const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived>& other) const {
+  return CwiseBinaryTypedEqualReturnType<OtherDerived>(derived(), other.derived());
+}
 
 template <typename OtherDerived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseBinaryTypedNotEqualReturnType<OtherDerived>
-cwiseTypedNotEqual(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived>& other) const { return CwiseBinaryTypedNotEqualReturnType<OtherDerived>(derived(), other.derived()); }
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseBinaryTypedNotEqualReturnType<OtherDerived> cwiseTypedNotEqual(
+    const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived>& other) const {
+  return CwiseBinaryTypedNotEqualReturnType<OtherDerived>(derived(), other.derived());
+}
 
 template <typename OtherDerived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseBinaryTypedLessReturnType<OtherDerived>
-cwiseTypedLess(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived>& other) const { return CwiseBinaryTypedLessReturnType<OtherDerived>(derived(), other.derived()); }
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseBinaryTypedLessReturnType<OtherDerived> cwiseTypedLess(
+    const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived>& other) const {
+  return CwiseBinaryTypedLessReturnType<OtherDerived>(derived(), other.derived());
+}
 
 template <typename OtherDerived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseBinaryTypedGreaterReturnType<OtherDerived>
-cwiseTypedGreater(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived>& other) const { return CwiseBinaryTypedGreaterReturnType<OtherDerived>(derived(), other.derived()); }
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseBinaryTypedGreaterReturnType<OtherDerived> cwiseTypedGreater(
+    const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived>& other) const {
+  return CwiseBinaryTypedGreaterReturnType<OtherDerived>(derived(), other.derived());
+}
 
 template <typename OtherDerived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseBinaryTypedLessOrEqualReturnType<OtherDerived>
-cwiseTypedLessOrEqual(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived>& other) const { return CwiseBinaryTypedLessOrEqualReturnType<OtherDerived>(derived(), other.derived()); }
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseBinaryTypedLessOrEqualReturnType<OtherDerived> cwiseTypedLessOrEqual(
+    const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived>& other) const {
+  return CwiseBinaryTypedLessOrEqualReturnType<OtherDerived>(derived(), other.derived());
+}
 
 template <typename OtherDerived>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseBinaryTypedGreaterOrEqualReturnType<OtherDerived>
-cwiseTypedGreaterOrEqual(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived>& other) const { return CwiseBinaryTypedGreaterOrEqualReturnType<OtherDerived>(derived(), other.derived()); }
+cwiseTypedGreaterOrEqual(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived>& other) const {
+  return CwiseBinaryTypedGreaterOrEqualReturnType<OtherDerived>(derived(), other.derived());
+}
 
-using CwiseScalarTypedEqualReturnType = CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_EQ, true>, const Derived, const ConstantReturnType>;
-using CwiseScalarTypedNotEqualReturnType = CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_NEQ, true>, const Derived, const ConstantReturnType>;
-using CwiseScalarTypedLessReturnType = CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_LT, true>, const Derived, const ConstantReturnType>;
-using CwiseScalarTypedGreaterReturnType = CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_GT, true>, const Derived, const ConstantReturnType>;
-using CwiseScalarTypedLessOrEqualReturnType = CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_LE, true>, const Derived, const ConstantReturnType>;
-using CwiseScalarTypedGreaterOrEqualReturnType = CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_GE, true>, const Derived, const ConstantReturnType>;
+using CwiseScalarTypedEqualReturnType = CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_EQ, true>,
+                                                      const Derived, const ConstantReturnType>;
+using CwiseScalarTypedNotEqualReturnType =
+    CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_NEQ, true>, const Derived,
+                  const ConstantReturnType>;
+using CwiseScalarTypedLessReturnType = CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_LT, true>,
+                                                     const Derived, const ConstantReturnType>;
+using CwiseScalarTypedGreaterReturnType = CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_GT, true>,
+                                                        const Derived, const ConstantReturnType>;
+using CwiseScalarTypedLessOrEqualReturnType =
+    CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_LE, true>, const Derived,
+                  const ConstantReturnType>;
+using CwiseScalarTypedGreaterOrEqualReturnType =
+    CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_GE, true>, const Derived,
+                  const ConstantReturnType>;
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseScalarTypedEqualReturnType
-cwiseTypedEqual(const Scalar& s) const { return CwiseScalarTypedEqualReturnType(derived(), ConstantReturnType(rows(), cols(), s)); }
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseScalarTypedEqualReturnType cwiseTypedEqual(const Scalar& s) const {
+  return CwiseScalarTypedEqualReturnType(derived(), ConstantReturnType(rows(), cols(), s));
+}
 
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseScalarTypedNotEqualReturnType
-cwiseTypedNotEqual(const Scalar& s) const { return CwiseScalarTypedNotEqualReturnType(derived(), ConstantReturnType(rows(), cols(), s)); }
+cwiseTypedNotEqual(const Scalar& s) const {
+  return CwiseScalarTypedNotEqualReturnType(derived(), ConstantReturnType(rows(), cols(), s));
+}
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseScalarTypedLessReturnType
-cwiseTypedLess(const Scalar& s) const { return CwiseScalarTypedLessReturnType(derived(), ConstantReturnType(rows(), cols(), s)); }
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseScalarTypedLessReturnType cwiseTypedLess(const Scalar& s) const {
+  return CwiseScalarTypedLessReturnType(derived(), ConstantReturnType(rows(), cols(), s));
+}
 
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseScalarTypedGreaterReturnType
-cwiseTypedGreater(const Scalar& s) const { return CwiseScalarTypedGreaterReturnType(derived(), ConstantReturnType(rows(), cols(), s)); }
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseScalarTypedGreaterReturnType cwiseTypedGreater(const Scalar& s) const {
+  return CwiseScalarTypedGreaterReturnType(derived(), ConstantReturnType(rows(), cols(), s));
+}
 
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseScalarTypedLessOrEqualReturnType
-cwiseTypedLessOrEqual(const Scalar& s) const { return CwiseScalarTypedLessOrEqualReturnType(derived(), ConstantReturnType(rows(), cols(), s)); }
+cwiseTypedLessOrEqual(const Scalar& s) const {
+  return CwiseScalarTypedLessOrEqualReturnType(derived(), ConstantReturnType(rows(), cols(), s));
+}
 
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseScalarTypedGreaterOrEqualReturnType
-cwiseTypedGreaterOrEqual(const Scalar& s) const { return CwiseScalarTypedGreaterOrEqualReturnType(derived(), ConstantReturnType(rows(), cols(), s)); }
+cwiseTypedGreaterOrEqual(const Scalar& s) const {
+  return CwiseScalarTypedGreaterOrEqualReturnType(derived(), ConstantReturnType(rows(), cols(), s));
+}
diff --git a/Eigen/src/plugins/MatrixCwiseUnaryOps.inc b/Eigen/src/plugins/MatrixCwiseUnaryOps.inc
index cb65e17..b23f4a5 100644
--- a/Eigen/src/plugins/MatrixCwiseUnaryOps.inc
+++ b/Eigen/src/plugins/MatrixCwiseUnaryOps.inc
@@ -11,7 +11,6 @@
 // This file is included into the body of the base classes supporting matrix specific coefficient-wise functions.
 // This include MatrixBase and SparseMatrixBase.
 
-
 typedef CwiseUnaryOp<internal::scalar_abs_op<Scalar>, const Derived> CwiseAbsReturnType;
 typedef CwiseUnaryOp<internal::scalar_abs2_op<Scalar>, const Derived> CwiseAbs2ReturnType;
 typedef CwiseUnaryOp<internal::scalar_arg_op<Scalar>, const Derived> CwiseArgReturnType;
@@ -26,92 +25,81 @@
 /// Example: \include MatrixBase_cwiseAbs.cpp
 /// Output: \verbinclude MatrixBase_cwiseAbs.out
 ///
-EIGEN_DOC_UNARY_ADDONS(cwiseAbs,absolute value)
+EIGEN_DOC_UNARY_ADDONS(cwiseAbs, absolute value)
 ///
 /// \sa cwiseAbs2()
 ///
-EIGEN_DEVICE_FUNC
-EIGEN_STRONG_INLINE const CwiseAbsReturnType
-cwiseAbs() const { return CwiseAbsReturnType(derived()); }
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseAbsReturnType cwiseAbs() const {
+  return CwiseAbsReturnType(derived());
+}
 
 /// \returns an expression of the coefficient-wise squared absolute value of \c *this
 ///
 /// Example: \include MatrixBase_cwiseAbs2.cpp
 /// Output: \verbinclude MatrixBase_cwiseAbs2.out
 ///
-EIGEN_DOC_UNARY_ADDONS(cwiseAbs2,squared absolute value)
+EIGEN_DOC_UNARY_ADDONS(cwiseAbs2, squared absolute value)
 ///
 /// \sa cwiseAbs()
 ///
-EIGEN_DEVICE_FUNC
-EIGEN_STRONG_INLINE const CwiseAbs2ReturnType
-cwiseAbs2() const { return CwiseAbs2ReturnType(derived()); }
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseAbs2ReturnType cwiseAbs2() const {
+  return CwiseAbs2ReturnType(derived());
+}
 
 /// \returns an expression of the coefficient-wise square root of *this.
 ///
 /// Example: \include MatrixBase_cwiseSqrt.cpp
 /// Output: \verbinclude MatrixBase_cwiseSqrt.out
 ///
-EIGEN_DOC_UNARY_ADDONS(cwiseSqrt,square-root)
+EIGEN_DOC_UNARY_ADDONS(cwiseSqrt, square - root)
 ///
 /// \sa cwisePow(), cwiseSquare(), cwiseCbrt()
 ///
-EIGEN_DEVICE_FUNC
-inline const CwiseSqrtReturnType
-cwiseSqrt() const { return CwiseSqrtReturnType(derived()); }
+EIGEN_DEVICE_FUNC inline const CwiseSqrtReturnType cwiseSqrt() const { return CwiseSqrtReturnType(derived()); }
 
 /// \returns an expression of the coefficient-wise cube root of *this.
 ///
 /// Example: \include MatrixBase_cwiseCbrt.cpp
 /// Output: \verbinclude MatrixBase_cwiseCbrt.out
 ///
-EIGEN_DOC_UNARY_ADDONS(cwiseCbrt,cube-root)
+EIGEN_DOC_UNARY_ADDONS(cwiseCbrt, cube - root)
 ///
 /// \sa cwiseSqrt(), cwiseSquare(), cwisePow()
 ///
-EIGEN_DEVICE_FUNC
-inline const CwiseCbrtReturnType
-cwiseCbrt() const { return CwiseSCbrtReturnType(derived()); }
+EIGEN_DEVICE_FUNC inline const CwiseCbrtReturnType cwiseCbrt() const { return CwiseSCbrtReturnType(derived()); }
 
 /// \returns an expression of the coefficient-wise signum of *this.
 ///
 /// Example: \include MatrixBase_cwiseSign.cpp
 /// Output: \verbinclude MatrixBase_cwiseSign.out
 ///
-EIGEN_DOC_UNARY_ADDONS(cwiseSign,sign function)
+EIGEN_DOC_UNARY_ADDONS(cwiseSign, sign function)
 ///
-EIGEN_DEVICE_FUNC
-inline const CwiseSignReturnType
-cwiseSign() const { return CwiseSignReturnType(derived()); }
-
+EIGEN_DEVICE_FUNC inline const CwiseSignReturnType cwiseSign() const { return CwiseSignReturnType(derived()); }
 
 /// \returns an expression of the coefficient-wise inverse of *this.
 ///
 /// Example: \include MatrixBase_cwiseInverse.cpp
 /// Output: \verbinclude MatrixBase_cwiseInverse.out
 ///
-EIGEN_DOC_UNARY_ADDONS(cwiseInverse,inverse)
+EIGEN_DOC_UNARY_ADDONS(cwiseInverse, inverse)
 ///
 /// \sa cwiseProduct()
 ///
-EIGEN_DEVICE_FUNC
-inline const CwiseInverseReturnType
-cwiseInverse() const { return CwiseInverseReturnType(derived()); }
+EIGEN_DEVICE_FUNC inline const CwiseInverseReturnType cwiseInverse() const { return CwiseInverseReturnType(derived()); }
 
 /// \returns an expression of the coefficient-wise phase angle of \c *this
 ///
 /// Example: \include MatrixBase_cwiseArg.cpp
 /// Output: \verbinclude MatrixBase_cwiseArg.out
 ///
-EIGEN_DOC_UNARY_ADDONS(cwiseArg,arg)
+EIGEN_DOC_UNARY_ADDONS(cwiseArg, arg)
 
-EIGEN_DEVICE_FUNC
-inline const CwiseArgReturnType
-cwiseArg() const { return CwiseArgReturnType(derived()); }
+EIGEN_DEVICE_FUNC inline const CwiseArgReturnType cwiseArg() const { return CwiseArgReturnType(derived()); }
 
-EIGEN_DEVICE_FUNC
-EIGEN_STRONG_INLINE const CwiseCArgReturnType
-cwiseCArg() const { return CwiseCArgReturnType(derived()); }
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseCArgReturnType cwiseCArg() const {
+  return CwiseCArgReturnType(derived());
+}
 
 template <typename ScalarExponent>
 using CwisePowReturnType =
diff --git a/Eigen/src/plugins/ReshapedMethods.inc b/Eigen/src/plugins/ReshapedMethods.inc
index db2b395..c1f90e7 100644
--- a/Eigen/src/plugins/ReshapedMethods.inc
+++ b/Eigen/src/plugins/ReshapedMethods.inc
@@ -3,9 +3,10 @@
 
 /// \returns an expression of \c *this with reshaped sizes.
 ///
-/// \param nRows the number of rows in the reshaped expression, specified at either run-time or compile-time, or AutoSize
-/// \param nCols the number of columns in the reshaped expression, specified at either run-time or compile-time, or AutoSize
-/// \tparam Order specifies whether the coefficients should be processed in column-major-order (ColMajor), in row-major-order (RowMajor),
+/// \param nRows the number of rows in the reshaped expression, specified at either run-time or compile-time, or
+/// AutoSize \param nCols the number of columns in the reshaped expression, specified at either run-time or
+/// compile-time, or AutoSize \tparam Order specifies whether the coefficients should be processed in column-major-order
+/// (ColMajor), in row-major-order (RowMajor),
 ///               or follows the \em natural order of the nested expression (AutoOrder). The default is ColMajor.
 /// \tparam NRowsType the type of the value handling the number of rows, typically Index.
 /// \tparam NColsType the type of the value handling the number of columns, typically Index.
@@ -14,40 +15,36 @@
 /// Output: \verbinclude MatrixBase_reshaped_int_int.out
 ///
 /// The number of rows \a nRows and columns \a nCols can also be specified at compile-time by passing Eigen::fix<N>,
-/// or Eigen::fix<N>(n) as arguments. In the later case, \c n plays the role of a runtime fallback value in case \c N equals Eigen::Dynamic.
-/// Here is an example with a fixed number of rows and columns:
-/// \include MatrixBase_reshaped_fixed.cpp
-/// Output: \verbinclude MatrixBase_reshaped_fixed.out
+/// or Eigen::fix<N>(n) as arguments. In the later case, \c n plays the role of a runtime fallback value in case \c N
+/// equals Eigen::Dynamic. Here is an example with a fixed number of rows and columns: \include
+/// MatrixBase_reshaped_fixed.cpp Output: \verbinclude MatrixBase_reshaped_fixed.out
 ///
-/// Finally, one of the sizes parameter can be automatically deduced from the other one by passing AutoSize as in the following example:
-/// \include MatrixBase_reshaped_auto.cpp
-/// Output: \verbinclude MatrixBase_reshaped_auto.out
-/// AutoSize does preserve compile-time sizes when possible, i.e., when the sizes of the input are known at compile time \b and
+/// Finally, one of the sizes parameter can be automatically deduced from the other one by passing AutoSize as in the
+/// following example: \include MatrixBase_reshaped_auto.cpp Output: \verbinclude MatrixBase_reshaped_auto.out AutoSize
+/// does preserve compile-time sizes when possible, i.e., when the sizes of the input are known at compile time \b and
 /// that the other size is passed at compile-time using Eigen::fix<N> as above.
 ///
 /// \sa class Reshaped, fix, fix<N>(int)
 ///
-template<int Order = ColMajor, typename NRowsType, typename NColsType>
-EIGEN_DEVICE_FUNC
-inline Reshaped<Derived,...>
-reshaped(NRowsType nRows, NColsType nCols);
+template <int Order = ColMajor, typename NRowsType, typename NColsType>
+EIGEN_DEVICE_FUNC inline Reshaped<Derived, ...> reshaped(NRowsType nRows, NColsType nCols);
 
 /// This is the const version of reshaped(NRowsType,NColsType).
-template<int Order = ColMajor, typename NRowsType, typename NColsType>
-EIGEN_DEVICE_FUNC
-inline const Reshaped<const Derived,...>
-reshaped(NRowsType nRows, NColsType nCols) const;
+template <int Order = ColMajor, typename NRowsType, typename NColsType>
+EIGEN_DEVICE_FUNC inline const Reshaped<const Derived, ...> reshaped(NRowsType nRows, NColsType nCols) const;
 
 /// \returns an expression of \c *this with columns (or rows) stacked to a linear column vector
 ///
-/// \tparam Order specifies whether the coefficients should be processed in column-major-order (ColMajor), in row-major-order (RowMajor),
+/// \tparam Order specifies whether the coefficients should be processed in column-major-order (ColMajor), in
+/// row-major-order (RowMajor),
 ///               or follows the \em natural order of the nested expression (AutoOrder). The default is ColMajor.
 ///
 /// This overloads is essentially a shortcut for `A.reshaped<Order>(AutoSize,fix<1>)`.
 ///
 /// - If `Order==ColMajor` (the default), then it returns a column-vector from the stacked columns of \c *this.
 /// - If `Order==RowMajor`, then it returns a column-vector from the stacked rows of \c *this.
-/// - If `Order==AutoOrder`, then it returns a column-vector with elements stacked following the storage order of \c *this.
+/// - If `Order==AutoOrder`, then it returns a column-vector with elements stacked following the storage order of \c
+/// *this.
 ///   This mode is the recommended one when the particular ordering of the element is not relevant.
 ///
 /// Example:
@@ -58,16 +55,12 @@
 ///
 /// \sa reshaped(NRowsType,NColsType), class Reshaped
 ///
-template<int Order = ColMajor>
-EIGEN_DEVICE_FUNC
-inline Reshaped<Derived,...>
-reshaped();
+template <int Order = ColMajor>
+EIGEN_DEVICE_FUNC inline Reshaped<Derived, ...> reshaped();
 
 /// This is the const version of reshaped().
-template<int Order = ColMajor>
-EIGEN_DEVICE_FUNC
-inline const Reshaped<const Derived,...>
-reshaped() const;
+template <int Order = ColMajor>
+EIGEN_DEVICE_FUNC inline const Reshaped<const Derived, ...> reshaped() const;
 
 #else
 
@@ -85,57 +78,48 @@
 
 #endif
 
-template<typename NRowsType, typename NColsType>
-EIGEN_DEVICE_FUNC
-inline Reshaped<EIGEN_RESHAPED_METHOD_CONST Derived,
-                internal::get_compiletime_reshape_size<NRowsType,NColsType,SizeAtCompileTime>::value,
-                internal::get_compiletime_reshape_size<NColsType,NRowsType,SizeAtCompileTime>::value>
-reshaped(NRowsType nRows, NColsType nCols) EIGEN_RESHAPED_METHOD_CONST
-{
+template <typename NRowsType, typename NColsType>
+EIGEN_DEVICE_FUNC inline Reshaped<
+    EIGEN_RESHAPED_METHOD_CONST Derived,
+    internal::get_compiletime_reshape_size<NRowsType, NColsType, SizeAtCompileTime>::value,
+    internal::get_compiletime_reshape_size<NColsType, NRowsType, SizeAtCompileTime>::value>
+reshaped(NRowsType nRows, NColsType nCols) EIGEN_RESHAPED_METHOD_CONST {
   return Reshaped<EIGEN_RESHAPED_METHOD_CONST Derived,
-                  internal::get_compiletime_reshape_size<NRowsType,NColsType,SizeAtCompileTime>::value,
-                  internal::get_compiletime_reshape_size<NColsType,NRowsType,SizeAtCompileTime>::value>
-                (derived(),
-                 internal::get_runtime_reshape_size(nRows,internal::get_runtime_value(nCols),size()),
-                 internal::get_runtime_reshape_size(nCols,internal::get_runtime_value(nRows),size()));
+                  internal::get_compiletime_reshape_size<NRowsType, NColsType, SizeAtCompileTime>::value,
+                  internal::get_compiletime_reshape_size<NColsType, NRowsType, SizeAtCompileTime>::value>(
+      derived(), internal::get_runtime_reshape_size(nRows, internal::get_runtime_value(nCols), size()),
+      internal::get_runtime_reshape_size(nCols, internal::get_runtime_value(nRows), size()));
 }
 
-template<int Order, typename NRowsType, typename NColsType>
-EIGEN_DEVICE_FUNC
-inline Reshaped<EIGEN_RESHAPED_METHOD_CONST Derived,
-                internal::get_compiletime_reshape_size<NRowsType,NColsType,SizeAtCompileTime>::value,
-                internal::get_compiletime_reshape_size<NColsType,NRowsType,SizeAtCompileTime>::value,
-                internal::get_compiletime_reshape_order(Flags, Order)>
-reshaped(NRowsType nRows, NColsType nCols) EIGEN_RESHAPED_METHOD_CONST
-{
+template <int Order, typename NRowsType, typename NColsType>
+EIGEN_DEVICE_FUNC inline Reshaped<
+    EIGEN_RESHAPED_METHOD_CONST Derived,
+    internal::get_compiletime_reshape_size<NRowsType, NColsType, SizeAtCompileTime>::value,
+    internal::get_compiletime_reshape_size<NColsType, NRowsType, SizeAtCompileTime>::value,
+    internal::get_compiletime_reshape_order(Flags, Order)>
+reshaped(NRowsType nRows, NColsType nCols) EIGEN_RESHAPED_METHOD_CONST {
   return Reshaped<EIGEN_RESHAPED_METHOD_CONST Derived,
-                  internal::get_compiletime_reshape_size<NRowsType,NColsType,SizeAtCompileTime>::value,
-                  internal::get_compiletime_reshape_size<NColsType,NRowsType,SizeAtCompileTime>::value,
-                  internal::get_compiletime_reshape_order(Flags, Order)>
-                (derived(),
-                 internal::get_runtime_reshape_size(nRows,internal::get_runtime_value(nCols),size()),
-                 internal::get_runtime_reshape_size(nCols,internal::get_runtime_value(nRows),size()));
+                  internal::get_compiletime_reshape_size<NRowsType, NColsType, SizeAtCompileTime>::value,
+                  internal::get_compiletime_reshape_size<NColsType, NRowsType, SizeAtCompileTime>::value,
+                  internal::get_compiletime_reshape_order(Flags, Order)>(
+      derived(), internal::get_runtime_reshape_size(nRows, internal::get_runtime_value(nCols), size()),
+      internal::get_runtime_reshape_size(nCols, internal::get_runtime_value(nRows), size()));
 }
 
 // Views as linear vectors
 
-EIGEN_DEVICE_FUNC
-inline Reshaped<EIGEN_RESHAPED_METHOD_CONST Derived,SizeAtCompileTime,1>
-reshaped() EIGEN_RESHAPED_METHOD_CONST
-{
-  return Reshaped<EIGEN_RESHAPED_METHOD_CONST Derived,SizeAtCompileTime,1>(derived(),size(),1);
+EIGEN_DEVICE_FUNC inline Reshaped<EIGEN_RESHAPED_METHOD_CONST Derived, SizeAtCompileTime, 1> reshaped()
+    EIGEN_RESHAPED_METHOD_CONST {
+  return Reshaped<EIGEN_RESHAPED_METHOD_CONST Derived, SizeAtCompileTime, 1>(derived(), size(), 1);
 }
 
-template<int Order>
-EIGEN_DEVICE_FUNC
-inline Reshaped<EIGEN_RESHAPED_METHOD_CONST Derived, SizeAtCompileTime, 1,
-                internal::get_compiletime_reshape_order(Flags, Order)>
-reshaped() EIGEN_RESHAPED_METHOD_CONST
-{
-  EIGEN_STATIC_ASSERT(Order==RowMajor || Order==ColMajor || Order==AutoOrder, INVALID_TEMPLATE_PARAMETER);
+template <int Order>
+EIGEN_DEVICE_FUNC inline Reshaped<EIGEN_RESHAPED_METHOD_CONST Derived, SizeAtCompileTime, 1,
+                                  internal::get_compiletime_reshape_order(Flags, Order)>
+reshaped() EIGEN_RESHAPED_METHOD_CONST {
+  EIGEN_STATIC_ASSERT(Order == RowMajor || Order == ColMajor || Order == AutoOrder, INVALID_TEMPLATE_PARAMETER);
   return Reshaped<EIGEN_RESHAPED_METHOD_CONST Derived, SizeAtCompileTime, 1,
-                  internal::get_compiletime_reshape_order(Flags, Order)>
-                (derived(), size(), 1);
+                  internal::get_compiletime_reshape_order(Flags, Order)>(derived(), size(), 1);
 }
 
 #undef EIGEN_RESHAPED_METHOD_CONST
@@ -146,4 +130,4 @@
 #undef EIGEN_RESHAPED_METHOD_2ND_PASS
 #endif
 
-#endif // EIGEN_PARSED_BY_DOXYGEN
+#endif  // EIGEN_PARSED_BY_DOXYGEN
diff --git a/unsupported/Eigen/AdolcForward b/unsupported/Eigen/AdolcForward
index ad05504..7da9997 100644
--- a/unsupported/Eigen/AdolcForward
+++ b/unsupported/Eigen/AdolcForward
@@ -23,21 +23,21 @@
 
 #define ADOLC_TAPELESS
 #ifndef NUMBER_DIRECTIONS
-# define NUMBER_DIRECTIONS 2
+#define NUMBER_DIRECTIONS 2
 #endif
 #include <adolc/adtl.h>
 
 // adolc defines some very stupid macros:
 #if defined(malloc)
-# undef malloc
+#undef malloc
 #endif
 
 #if defined(calloc)
-# undef calloc
+#undef calloc
 #endif
 
 #if defined(realloc)
-# undef realloc
+#undef realloc
 #endif
 
 #include "../../Eigen/Core"
@@ -45,45 +45,44 @@
 namespace Eigen {
 
 /**
-  * \defgroup AdolcForward_Module Adolc forward module
-  * This module provides support for adolc's adouble type in forward mode.
-  * ADOL-C is a C++ automatic differentiation library,
-  * see https://projects.coin-or.org/ADOL-C for more information.
-  * It mainly consists in:
-  *  - a struct Eigen::NumTraits<adtl::adouble> specialization
-  *  - overloads of internal::* math function for adtl::adouble type.
-  *
-  * Note that the maximal number of directions is controlled by
-  * the preprocessor token NUMBER_DIRECTIONS. The default is 2.
-  *
-  * \code
-  * #include <unsupported/Eigen/AdolcSupport>
-  * \endcode
-  */
-  //@{
+ * \defgroup AdolcForward_Module Adolc forward module
+ * This module provides support for adolc's adouble type in forward mode.
+ * ADOL-C is a C++ automatic differentiation library,
+ * see https://projects.coin-or.org/ADOL-C for more information.
+ * It mainly consists in:
+ *  - a struct Eigen::NumTraits<adtl::adouble> specialization
+ *  - overloads of internal::* math function for adtl::adouble type.
+ *
+ * Note that the maximal number of directions is controlled by
+ * the preprocessor token NUMBER_DIRECTIONS. The default is 2.
+ *
+ * \code
+ * #include <unsupported/Eigen/AdolcSupport>
+ * \endcode
+ */
+//@{
 
-} // namespace Eigen
+}  // namespace Eigen
 
 // Eigen's require a few additional functions which must be defined in the same namespace
 // than the custom scalar type own namespace
 namespace adtl {
 
-inline const adouble& conj(const adouble& x)  { return x; }
-inline const adouble& real(const adouble& x)  { return x; }
-inline adouble imag(const adouble&)    { return 0.; }
-inline adouble abs(const adouble&  x)  { return fabs(x); }
-inline adouble abs2(const adouble& x)  { return x*x; }
+inline const adouble& conj(const adouble& x) { return x; }
+inline const adouble& real(const adouble& x) { return x; }
+inline adouble imag(const adouble&) { return 0.; }
+inline adouble abs(const adouble& x) { return fabs(x); }
+inline adouble abs2(const adouble& x) { return x * x; }
 
-inline bool (isinf)(const adouble& x) { return (Eigen::numext::isinf)(x.getValue()); }
-inline bool (isnan)(const adouble& x) { return (Eigen::numext::isnan)(x.getValue()); }
+inline bool(isinf)(const adouble& x) { return (Eigen::numext::isinf)(x.getValue()); }
+inline bool(isnan)(const adouble& x) { return (Eigen::numext::isnan)(x.getValue()); }
 
-}
+}  // namespace adtl
 
 namespace Eigen {
 
-template<> struct NumTraits<adtl::adouble>
-    : NumTraits<double>
-{
+template <>
+struct NumTraits<adtl::adouble> : NumTraits<double> {
   typedef adtl::adouble Real;
   typedef adtl::adouble NonInteger;
   typedef adtl::adouble Nested;
@@ -98,20 +97,20 @@
   };
 };
 
-template<typename Functor> class AdolcForwardJacobian : public Functor
-{
+template <typename Functor>
+class AdolcForwardJacobian : public Functor {
   typedef adtl::adouble ActiveScalar;
-public:
 
+ public:
   AdolcForwardJacobian() : Functor() {}
   AdolcForwardJacobian(const Functor& f) : Functor(f) {}
 
   // forward constructors
-  template<typename T0>
+  template <typename T0>
   AdolcForwardJacobian(const T0& a0) : Functor(a0) {}
-  template<typename T0, typename T1>
+  template <typename T0, typename T1>
   AdolcForwardJacobian(const T0& a0, const T1& a1) : Functor(a0, a1) {}
-  template<typename T0, typename T1, typename T2>
+  template <typename T0, typename T1, typename T2>
   AdolcForwardJacobian(const T0& a0, const T1& a1, const T1& a2) : Functor(a0, a1, a2) {}
 
   typedef typename Functor::InputType InputType;
@@ -121,11 +120,9 @@
   typedef Matrix<ActiveScalar, InputType::SizeAtCompileTime, 1> ActiveInput;
   typedef Matrix<ActiveScalar, ValueType::SizeAtCompileTime, 1> ActiveValue;
 
-  void operator() (const InputType& x, ValueType* v, JacobianType* _jac) const
-  {
-    eigen_assert(v!=0);
-    if (!_jac)
-    {
+  void operator()(const InputType& x, ValueType* v, JacobianType* _jac) const {
+    eigen_assert(v != 0);
+    if (!_jac) {
       Functor::operator()(x, v);
       return;
     }
@@ -135,25 +132,22 @@
     ActiveInput ax = x.template cast<ActiveScalar>();
     ActiveValue av(jac.rows());
 
-    for (int j=0; j<jac.cols(); j++)
-      for (int i=0; i<jac.cols(); i++)
-        ax[i].setADValue(j, i==j ? 1 : 0);
+    for (int j = 0; j < jac.cols(); j++)
+      for (int i = 0; i < jac.cols(); i++) ax[i].setADValue(j, i == j ? 1 : 0);
 
     Functor::operator()(ax, &av);
 
-    for (int i=0; i<jac.rows(); i++)
-    {
+    for (int i = 0; i < jac.rows(); i++) {
       (*v)[i] = av[i].getValue();
-      for (int j=0; j<jac.cols(); j++)
-        jac.coeffRef(i,j) = av[i].getADValue(j);
+      for (int j = 0; j < jac.cols(); j++) jac.coeffRef(i, j) = av[i].getADValue(j);
     }
   }
-protected:
 
+ protected:
 };
 
 //@}
 
-}
+}  // namespace Eigen
 
-#endif // EIGEN_ADLOC_FORWARD_MODULE_H
+#endif  // EIGEN_ADLOC_FORWARD_MODULE_H
diff --git a/unsupported/Eigen/AlignedVector3 b/unsupported/Eigen/AlignedVector3
index cf2b9f6..8301ef0 100644
--- a/unsupported/Eigen/AlignedVector3
+++ b/unsupported/Eigen/AlignedVector3
@@ -17,218 +17,195 @@
 namespace Eigen {
 
 /**
-  * \defgroup AlignedVector3_Module Aligned vector3 module
-  *
-  * \code
-  * #include <unsupported/Eigen/AlignedVector3>
-  * \endcode
-  */
-  //@{
-
+ * \defgroup AlignedVector3_Module Aligned vector3 module
+ *
+ * \code
+ * #include <unsupported/Eigen/AlignedVector3>
+ * \endcode
+ */
+//@{
 
 /** \class AlignedVector3
-  *
-  * \brief A vectorization friendly 3D vector
-  *
-  * This class represents a 3D vector internally using a 4D vector
-  * such that vectorization can be seamlessly enabled. Of course,
-  * the same result can be achieved by directly using a 4D vector.
-  * This class makes this process simpler.
-  *
-  */
+ *
+ * \brief A vectorization friendly 3D vector
+ *
+ * This class represents a 3D vector internally using a 4D vector
+ * such that vectorization can be seamlessly enabled. Of course,
+ * the same result can be achieved by directly using a 4D vector.
+ * This class makes this process simpler.
+ *
+ */
 // TODO specialize Cwise
-template<typename Scalar_> class AlignedVector3;
+template <typename Scalar_>
+class AlignedVector3;
 
 namespace internal {
-template<typename Scalar_> struct traits<AlignedVector3<Scalar_> >
-  : traits<Matrix<Scalar_,3,1,0,4,1> >
-{
-};
-}
+template <typename Scalar_>
+struct traits<AlignedVector3<Scalar_> > : traits<Matrix<Scalar_, 3, 1, 0, 4, 1> > {};
+}  // namespace internal
 
-template<typename Scalar_> class AlignedVector3
-  : public MatrixBase<AlignedVector3<Scalar_> >
-{
-    typedef Matrix<Scalar_,4,1> CoeffType;
-    CoeffType m_coeffs;
-  public:
+template <typename Scalar_>
+class AlignedVector3 : public MatrixBase<AlignedVector3<Scalar_> > {
+  typedef Matrix<Scalar_, 4, 1> CoeffType;
+  CoeffType m_coeffs;
 
-    typedef MatrixBase<AlignedVector3<Scalar_> > Base;
-    EIGEN_DENSE_PUBLIC_INTERFACE(AlignedVector3)
-    using Base::operator*;
+ public:
+  typedef MatrixBase<AlignedVector3<Scalar_> > Base;
+  EIGEN_DENSE_PUBLIC_INTERFACE(AlignedVector3)
+  using Base::operator*;
 
-    inline Index rows() const { return 3; }
-    inline Index cols() const { return 1; }
-    
-    Scalar* data() { return m_coeffs.data(); }
-    const Scalar* data() const { return m_coeffs.data(); }
-    Index innerStride() const { return 1; }
-    Index outerStride() const { return 3; }
+  inline Index rows() const { return 3; }
+  inline Index cols() const { return 1; }
 
-    inline const Scalar& coeff(Index row, Index col) const
-    { return m_coeffs.coeff(row, col); }
+  Scalar* data() { return m_coeffs.data(); }
+  const Scalar* data() const { return m_coeffs.data(); }
+  Index innerStride() const { return 1; }
+  Index outerStride() const { return 3; }
 
-    inline Scalar& coeffRef(Index row, Index col)
-    { return m_coeffs.coeffRef(row, col); }
+  inline const Scalar& coeff(Index row, Index col) const { return m_coeffs.coeff(row, col); }
 
-    inline const Scalar& coeff(Index index) const
-    { return m_coeffs.coeff(index); }
+  inline Scalar& coeffRef(Index row, Index col) { return m_coeffs.coeffRef(row, col); }
 
-    inline Scalar& coeffRef(Index index)
-    { return m_coeffs.coeffRef(index);}
+  inline const Scalar& coeff(Index index) const { return m_coeffs.coeff(index); }
 
+  inline Scalar& coeffRef(Index index) { return m_coeffs.coeffRef(index); }
 
-    inline AlignedVector3()
-    {}
+  inline AlignedVector3() {}
 
-    inline AlignedVector3(const Scalar& x, const Scalar& y, const Scalar& z)
-      : m_coeffs(x, y, z, Scalar(0))
-    {}
+  inline AlignedVector3(const Scalar& x, const Scalar& y, const Scalar& z) : m_coeffs(x, y, z, Scalar(0)) {}
 
-    inline AlignedVector3(const AlignedVector3& other)
-      : Base(), m_coeffs(other.m_coeffs)
-    {}
+  inline AlignedVector3(const AlignedVector3& other) : Base(), m_coeffs(other.m_coeffs) {}
 
-    template<typename XprType, int Size=XprType::SizeAtCompileTime>
-    struct generic_assign_selector {};
+  template <typename XprType, int Size = XprType::SizeAtCompileTime>
+  struct generic_assign_selector {};
 
-    template<typename XprType> struct generic_assign_selector<XprType,4>
-    {
-      inline static void run(AlignedVector3& dest, const XprType& src)
-      {
-        dest.m_coeffs = src;
-      }
-    };
+  template <typename XprType>
+  struct generic_assign_selector<XprType, 4> {
+    inline static void run(AlignedVector3& dest, const XprType& src) { dest.m_coeffs = src; }
+  };
 
-    template<typename XprType> struct generic_assign_selector<XprType,3>
-    {
-      inline static void run(AlignedVector3& dest, const XprType& src)
-      {
-        dest.m_coeffs.template head<3>() = src;
-        dest.m_coeffs.w() = Scalar(0);
-      }
-    };
-
-    template<typename Derived>
-    inline AlignedVector3(const MatrixBase<Derived>& other)
-    {
-      generic_assign_selector<Derived>::run(*this,other.derived());
+  template <typename XprType>
+  struct generic_assign_selector<XprType, 3> {
+    inline static void run(AlignedVector3& dest, const XprType& src) {
+      dest.m_coeffs.template head<3>() = src;
+      dest.m_coeffs.w() = Scalar(0);
     }
+  };
 
-    inline AlignedVector3& operator=(const AlignedVector3& other)
-    { m_coeffs = other.m_coeffs; return *this; }
+  template <typename Derived>
+  inline AlignedVector3(const MatrixBase<Derived>& other) {
+    generic_assign_selector<Derived>::run(*this, other.derived());
+  }
 
-    template <typename Derived>
-    inline AlignedVector3& operator=(const MatrixBase<Derived>& other)
-    {
-      generic_assign_selector<Derived>::run(*this,other.derived());
-      return *this;
-    }
+  inline AlignedVector3& operator=(const AlignedVector3& other) {
+    m_coeffs = other.m_coeffs;
+    return *this;
+  }
 
-    inline AlignedVector3 operator+(const AlignedVector3& other) const
-    { return AlignedVector3(m_coeffs + other.m_coeffs); }
+  template <typename Derived>
+  inline AlignedVector3& operator=(const MatrixBase<Derived>& other) {
+    generic_assign_selector<Derived>::run(*this, other.derived());
+    return *this;
+  }
 
-    inline AlignedVector3& operator+=(const AlignedVector3& other)
-    { m_coeffs += other.m_coeffs; return *this; }
+  inline AlignedVector3 operator+(const AlignedVector3& other) const {
+    return AlignedVector3(m_coeffs + other.m_coeffs);
+  }
 
-    inline AlignedVector3 operator-(const AlignedVector3& other) const
-    { return AlignedVector3(m_coeffs - other.m_coeffs); }
+  inline AlignedVector3& operator+=(const AlignedVector3& other) {
+    m_coeffs += other.m_coeffs;
+    return *this;
+  }
 
-    inline AlignedVector3 operator-() const
-    { return AlignedVector3(-m_coeffs); }
+  inline AlignedVector3 operator-(const AlignedVector3& other) const {
+    return AlignedVector3(m_coeffs - other.m_coeffs);
+  }
 
-    inline AlignedVector3 operator-=(const AlignedVector3& other)
-    { m_coeffs -= other.m_coeffs; return *this; }
+  inline AlignedVector3 operator-() const { return AlignedVector3(-m_coeffs); }
 
-    inline AlignedVector3 operator*(const Scalar& s) const
-    { return AlignedVector3(m_coeffs * s); }
+  inline AlignedVector3 operator-=(const AlignedVector3& other) {
+    m_coeffs -= other.m_coeffs;
+    return *this;
+  }
 
-    inline friend AlignedVector3 operator*(const Scalar& s,const AlignedVector3& vec)
-    { return AlignedVector3(s * vec.m_coeffs); }
+  inline AlignedVector3 operator*(const Scalar& s) const { return AlignedVector3(m_coeffs * s); }
 
-    inline AlignedVector3& operator*=(const Scalar& s)
-    { m_coeffs *= s; return *this; }
+  inline friend AlignedVector3 operator*(const Scalar& s, const AlignedVector3& vec) {
+    return AlignedVector3(s * vec.m_coeffs);
+  }
 
-    inline AlignedVector3 operator/(const Scalar& s) const
-    { return AlignedVector3(m_coeffs / s); }
+  inline AlignedVector3& operator*=(const Scalar& s) {
+    m_coeffs *= s;
+    return *this;
+  }
 
-    inline AlignedVector3& operator/=(const Scalar& s)
-    { m_coeffs /= s; return *this; }
+  inline AlignedVector3 operator/(const Scalar& s) const { return AlignedVector3(m_coeffs / s); }
 
-    inline Scalar dot(const AlignedVector3& other) const
-    {
-      eigen_assert(m_coeffs.w()==Scalar(0));
-      eigen_assert(other.m_coeffs.w()==Scalar(0));
-      return m_coeffs.dot(other.m_coeffs);
-    }
+  inline AlignedVector3& operator/=(const Scalar& s) {
+    m_coeffs /= s;
+    return *this;
+  }
 
-    inline void normalize()
-    {
-      m_coeffs /= norm();
-    }
+  inline Scalar dot(const AlignedVector3& other) const {
+    eigen_assert(m_coeffs.w() == Scalar(0));
+    eigen_assert(other.m_coeffs.w() == Scalar(0));
+    return m_coeffs.dot(other.m_coeffs);
+  }
 
-    inline AlignedVector3 normalized() const
-    {
-      return AlignedVector3(m_coeffs / norm());
-    }
+  inline void normalize() { m_coeffs /= norm(); }
 
-    inline Scalar sum() const
-    {
-      eigen_assert(m_coeffs.w()==Scalar(0));
-      return m_coeffs.sum();
-    }
+  inline AlignedVector3 normalized() const { return AlignedVector3(m_coeffs / norm()); }
 
-    inline Scalar squaredNorm() const
-    {
-      eigen_assert(m_coeffs.w()==Scalar(0));
-      return m_coeffs.squaredNorm();
-    }
+  inline Scalar sum() const {
+    eigen_assert(m_coeffs.w() == Scalar(0));
+    return m_coeffs.sum();
+  }
 
-    inline Scalar norm() const
-    {
-      using std::sqrt;
-      return sqrt(squaredNorm());
-    }
+  inline Scalar squaredNorm() const {
+    eigen_assert(m_coeffs.w() == Scalar(0));
+    return m_coeffs.squaredNorm();
+  }
 
-    inline AlignedVector3 cross(const AlignedVector3& other) const
-    {
-      return AlignedVector3(m_coeffs.cross3(other.m_coeffs));
-    }
+  inline Scalar norm() const {
+    using std::sqrt;
+    return sqrt(squaredNorm());
+  }
 
-    template<typename Derived>
-    inline bool isApprox(const MatrixBase<Derived>& other, const RealScalar& eps=NumTraits<Scalar>::dummy_precision()) const
-    {
-      return m_coeffs.template head<3>().isApprox(other,eps);
-    }
-    
-    CoeffType& coeffs() { return m_coeffs; }
-    const CoeffType& coeffs() const { return m_coeffs; }
+  inline AlignedVector3 cross(const AlignedVector3& other) const {
+    return AlignedVector3(m_coeffs.cross3(other.m_coeffs));
+  }
+
+  template <typename Derived>
+  inline bool isApprox(const MatrixBase<Derived>& other,
+                       const RealScalar& eps = NumTraits<Scalar>::dummy_precision()) const {
+    return m_coeffs.template head<3>().isApprox(other, eps);
+  }
+
+  CoeffType& coeffs() { return m_coeffs; }
+  const CoeffType& coeffs() const { return m_coeffs; }
 };
 
 namespace internal {
 
-template<typename Scalar_>
-struct eval<AlignedVector3<Scalar_>, Dense>
-{
- typedef const AlignedVector3<Scalar_>& type;
+template <typename Scalar_>
+struct eval<AlignedVector3<Scalar_>, Dense> {
+  typedef const AlignedVector3<Scalar_>& type;
 };
 
-template<typename Scalar>
-struct evaluator<AlignedVector3<Scalar> >
-  : evaluator<Matrix<Scalar,4,1> >
-{
+template <typename Scalar>
+struct evaluator<AlignedVector3<Scalar> > : evaluator<Matrix<Scalar, 4, 1> > {
   typedef AlignedVector3<Scalar> XprType;
-  typedef evaluator<Matrix<Scalar,4,1> > Base;
-  
-  evaluator(const XprType &m) : Base(m.coeffs()) {}  
+  typedef evaluator<Matrix<Scalar, 4, 1> > Base;
+
+  evaluator(const XprType& m) : Base(m.coeffs()) {}
 };
 
-}
+}  // namespace internal
 
 //@}
 
-}
+}  // namespace Eigen
 
 #include "../../Eigen/src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_ALIGNED_VECTOR3_MODULE_H
+#endif  // EIGEN_ALIGNED_VECTOR3_MODULE_H
diff --git a/unsupported/Eigen/ArpackSupport b/unsupported/Eigen/ArpackSupport
index b89d8e9..3987f7c 100644
--- a/unsupported/Eigen/ArpackSupport
+++ b/unsupported/Eigen/ArpackSupport
@@ -12,13 +12,13 @@
 #include "../../Eigen/Core"
 
 /** \defgroup ArpackSupport_Module Arpack support module
-  *
-  * This module provides a wrapper to Arpack, a library for sparse eigenvalue decomposition.
-  *
-  * \code
-  * #include <Eigen/ArpackSupport>
-  * \endcode
-  */
+ *
+ * This module provides a wrapper to Arpack, a library for sparse eigenvalue decomposition.
+ *
+ * \code
+ * #include <Eigen/ArpackSupport>
+ * \endcode
+ */
 
 #include "../../Eigen/SparseCholesky"
 
@@ -30,4 +30,4 @@
 
 #include "../../Eigen/src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_ARPACKSUPPORT_MODULE_H
+#endif  // EIGEN_ARPACKSUPPORT_MODULE_H
diff --git a/unsupported/Eigen/AutoDiff b/unsupported/Eigen/AutoDiff
index 6372e8f..45078bc 100644
--- a/unsupported/Eigen/AutoDiff
+++ b/unsupported/Eigen/AutoDiff
@@ -15,21 +15,21 @@
 namespace Eigen {
 
 /**
-  * \defgroup AutoDiff_Module Auto Diff module
-  *
-  * This module features forward automatic differentation via a simple
-  * templated scalar type wrapper AutoDiffScalar.
-  *
-  * Warning : this should NOT be confused with numerical differentiation, which
-  * is a different method and has its own module in Eigen : \ref NumericalDiff_Module.
-  *
-  * \code
-  * #include <unsupported/Eigen/AutoDiff>
-  * \endcode
-  */
+ * \defgroup AutoDiff_Module Auto Diff module
+ *
+ * This module features forward automatic differentation via a simple
+ * templated scalar type wrapper AutoDiffScalar.
+ *
+ * Warning : this should NOT be confused with numerical differentiation, which
+ * is a different method and has its own module in Eigen : \ref NumericalDiff_Module.
+ *
+ * \code
+ * #include <unsupported/Eigen/AutoDiff>
+ * \endcode
+ */
 //@{
 
-}
+}  // namespace Eigen
 #include "../../Eigen/src/Core/util/DisableStupidWarnings.h"
 
 // IWYU pragma: begin_exports
@@ -40,10 +40,8 @@
 
 #include "../../Eigen/src/Core/util/ReenableStupidWarnings.h"
 
-
-
 namespace Eigen {
 //@}
 }
 
-#endif // EIGEN_AUTODIFF_MODULE_H
+#endif  // EIGEN_AUTODIFF_MODULE_H
diff --git a/unsupported/Eigen/BVH b/unsupported/Eigen/BVH
index 136ec4d..58fb72f 100644
--- a/unsupported/Eigen/BVH
+++ b/unsupported/Eigen/BVH
@@ -28,47 +28,57 @@
   * #include <unsupported/Eigen/BVH>
   * \endcode
   *
-  * A bounding volume hierarchy (BVH) can accelerate many geometric queries.  This module provides a generic implementation
-  * of the two basic algorithms over a BVH: intersection of a query object against all objects in the hierarchy and minimization
-  * of a function over the objects in the hierarchy.  It also provides intersection and minimization over a cartesian product of
-  * two BVH's.  A BVH accelerates intersection by using the fact that if a query object does not intersect a volume, then it cannot
-  * intersect any object contained in that volume.  Similarly, a BVH accelerates minimization because the minimum of a function
+  * A bounding volume hierarchy (BVH) can accelerate many geometric queries.  This module provides a generic
+  implementation
+  * of the two basic algorithms over a BVH: intersection of a query object against all objects in the hierarchy and
+  minimization
+  * of a function over the objects in the hierarchy.  It also provides intersection and minimization over a cartesian
+  product of
+  * two BVH's.  A BVH accelerates intersection by using the fact that if a query object does not intersect a volume,
+  then it cannot
+  * intersect any object contained in that volume.  Similarly, a BVH accelerates minimization because the minimum of a
+  function
   * over a volume is no greater than the minimum of a function over any object contained in it.
   *
   * Some sample queries that can be written in terms of intersection are:
   *   - Determine all points where a ray intersects a triangle mesh
   *   - Given a set of points, determine which are contained in a query sphere
   *   - Given a set of spheres, determine which contain the query point
-  *   - Given a set of disks, determine if any is completely contained in a query rectangle (represent each 2D disk as a point \f$(x,y,r)\f$
-  *     in 3D and represent the rectangle as a pyramid based on the original rectangle and shrinking in the \f$r\f$ direction)
-  *   - Given a set of points, count how many pairs are \f$d\pm\epsilon\f$ apart (done by looking at the cartesian product of the set
+  *   - Given a set of disks, determine if any is completely contained in a query rectangle (represent each 2D disk as a
+  point \f$(x,y,r)\f$
+  *     in 3D and represent the rectangle as a pyramid based on the original rectangle and shrinking in the \f$r\f$
+  direction)
+  *   - Given a set of points, count how many pairs are \f$d\pm\epsilon\f$ apart (done by looking at the cartesian
+  product of the set
   *     of points with itself)
   *
   * Some sample queries that can be written in terms of function minimization over a set of objects are:
-  *   - Find the intersection between a ray and a triangle mesh closest to the ray origin (function is infinite off the ray)
+  *   - Find the intersection between a ray and a triangle mesh closest to the ray origin (function is infinite off the
+  ray)
   *   - Given a polyline and a query point, determine the closest point on the polyline to the query
-  *   - Find the diameter of a point cloud (done by looking at the cartesian product and using negative distance as the function)
+  *   - Find the diameter of a point cloud (done by looking at the cartesian product and using negative distance as the
+  function)
   *   - Determine how far two meshes are from colliding (this is also a cartesian product query)
   *
-  * This implementation decouples the basic algorithms both from the type of hierarchy (and the types of the bounding volumes) and
-  * from the particulars of the query.  To enable abstraction from the BVH, the BVH is required to implement a generic mechanism
+  * This implementation decouples the basic algorithms both from the type of hierarchy (and the types of the bounding
+  volumes) and
+  * from the particulars of the query.  To enable abstraction from the BVH, the BVH is required to implement a generic
+  mechanism
   * for traversal.  To abstract from the query, the query is responsible for keeping track of results.
   *
-  * To be used in the algorithms, a hierarchy must implement the following traversal mechanism (see KdBVH for a sample implementation): \code
-      typedef Volume  //the type of bounding volume
-      typedef Object  //the type of object in the hierarchy
-      typedef Index   //a reference to a node in the hierarchy--typically an int or a pointer
-      typedef VolumeIterator //an iterator type over node children--returns Index
-      typedef ObjectIterator //an iterator over object (leaf) children--returns const Object &
-      Index getRootIndex() const //returns the index of the hierarchy root
-      const Volume &getVolume(Index index) const //returns the bounding volume of the node at given index
-      void getChildren(Index index, VolumeIterator &outVBegin, VolumeIterator &outVEnd,
-                      ObjectIterator &outOBegin, ObjectIterator &outOEnd) const
+  * To be used in the algorithms, a hierarchy must implement the following traversal mechanism (see KdBVH for a sample
+  implementation): \code typedef Volume  //the type of bounding volume typedef Object  //the type of object in the
+  hierarchy typedef Index   //a reference to a node in the hierarchy--typically an int or a pointer typedef
+  VolumeIterator //an iterator type over node children--returns Index typedef ObjectIterator //an iterator over object
+  (leaf) children--returns const Object & Index getRootIndex() const //returns the index of the hierarchy root const
+  Volume &getVolume(Index index) const //returns the bounding volume of the node at given index void getChildren(Index
+  index, VolumeIterator &outVBegin, VolumeIterator &outVEnd, ObjectIterator &outOBegin, ObjectIterator &outOEnd) const
       //getChildren takes a node index and makes [outVBegin, outVEnd) range over its node children
       //and [outOBegin, outOEnd) range over its object children
     \endcode
   *
-  * To use the hierarchy, call BVIntersect or BVMinimize, passing it a BVH (or two, for cartesian product) and a minimizer or intersector.
+  * To use the hierarchy, call BVIntersect or BVMinimize, passing it a BVH (or two, for cartesian product) and a
+  minimizer or intersector.
   * For an intersection query on a single BVH, the intersector encapsulates the query and must provide two functions:
   * \code
       bool intersectVolume(const Volume &volume) //returns true if the query intersects the volume
@@ -79,7 +89,8 @@
   * responsibility of the intersectObject function to keep track of the results in whatever manner is appropriate.
   * The cartesian product intersection and the BVMinimize queries are similar--see their individual documentation.
   *
-  * The following is a simple but complete example for how to use the BVH to accelerate the search for a closest red-blue point pair:
+  * The following is a simple but complete example for how to use the BVH to accelerate the search for a closest
+  red-blue point pair:
   * \include BVH_Example.cpp
   * Output: \verbinclude BVH_Example.out
   */
@@ -94,4 +105,4 @@
 
 //@}
 
-#endif // EIGEN_BVH_MODULE_H
+#endif  // EIGEN_BVH_MODULE_H
diff --git a/unsupported/Eigen/CXX11/Tensor b/unsupported/Eigen/CXX11/Tensor
index f2636ec..1b6cc7e 100644
--- a/unsupported/Eigen/CXX11/Tensor
+++ b/unsupported/Eigen/CXX11/Tensor
@@ -8,7 +8,7 @@
 // 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_CXX11_TENSOR_MODULE_H
+// #ifndef EIGEN_CXX11_TENSOR_MODULE_H
 #define EIGEN_CXX11_TENSOR_MODULE_H
 
 #include "../../../Eigen/Core"
@@ -23,16 +23,16 @@
 // IWYU pragma: end_exports
 
 /** \defgroup CXX11_Tensor_Module Tensor Module
-  *
-  * This module provides a Tensor class for storing arbitrarily indexed
-  * objects.
-  *
-  * \code
-  * #include <Eigen/CXX11/Tensor>
-  * \endcode
-  *
-  * Much of the documentation can be found \ref eigen_tensors "here".
-  */
+ *
+ * This module provides a Tensor class for storing arbitrarily indexed
+ * objects.
+ *
+ * \code
+ * #include <Eigen/CXX11/Tensor>
+ * \endcode
+ *
+ * Much of the documentation can be found \ref eigen_tensors "here".
+ */
 
 #include <atomic>
 #include <chrono>
@@ -49,12 +49,12 @@
 #endif
 
 #ifdef EIGEN_USE_GPU
-  #include <iostream>
-  #if defined(EIGEN_USE_HIP)
-    #include <hip/hip_runtime.h>
-  #else
-    #include <cuda_runtime.h>
-  #endif
+#include <iostream>
+#if defined(EIGEN_USE_HIP)
+#include <hip/hip_runtime.h>
+#else
+#include <cuda_runtime.h>
+#endif
 #endif
 
 // IWYU pragma: begin_exports
@@ -138,4 +138,4 @@
 
 #include "../../../Eigen/src/Core/util/ReenableStupidWarnings.h"
 
-//#endif // EIGEN_CXX11_TENSOR_MODULE_H
+// #endif // EIGEN_CXX11_TENSOR_MODULE_H
diff --git a/unsupported/Eigen/CXX11/TensorSymmetry b/unsupported/Eigen/CXX11/TensorSymmetry
index f559c26..44ee6a8 100644
--- a/unsupported/Eigen/CXX11/TensorSymmetry
+++ b/unsupported/Eigen/CXX11/TensorSymmetry
@@ -17,16 +17,16 @@
 #include "src/util/CXX11Meta.h"
 
 /** \defgroup CXX11_TensorSymmetry_Module Tensor Symmetry Module
-  *
-  * This module provides a classes that allow for the definition of
-  * symmetries w.r.t. tensor indices.
-  *
-  * Including this module will implicitly include the Tensor module.
-  *
-  * \code
-  * #include <Eigen/TensorSymmetry>
-  * \endcode
-  */
+ *
+ * This module provides a classes that allow for the definition of
+ * symmetries w.r.t. tensor indices.
+ *
+ * Including this module will implicitly include the Tensor module.
+ *
+ * \code
+ * #include <Eigen/TensorSymmetry>
+ * \endcode
+ */
 
 // IWYU pragma: begin_exports
 #include "src/TensorSymmetry/util/TemplateGroupTheory.h"
@@ -37,4 +37,4 @@
 
 #include "../../../Eigen/src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_CXX11_TENSORSYMMETRY_MODULE_H
+#endif  // EIGEN_CXX11_TENSORSYMMETRY_MODULE_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/README.md b/unsupported/Eigen/CXX11/src/Tensor/README.md
index e4b5e2e..7f16fde 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/README.md
+++ b/unsupported/Eigen/CXX11/src/Tensor/README.md
@@ -1,4 +1,4 @@
-# Eigen Tensors {#eigen_tensors}
+#Eigen Tensors{#eigen_tensors }
 
 Tensors are multidimensional arrays of elements. Elements are typically scalars,
 but more complex types such as strings are also supported.
@@ -29,8 +29,8 @@
     // memory to hold 24 floating point values (24 = 2 x 3 x 4).
     Tensor<float, 3> t_3d(2, 3, 4);
 
-    // Resize t_3d by assigning a tensor of different sizes, but same rank.
-    t_3d = Tensor<float, 3>(3, 4, 3);
+// Resize t_3d by assigning a tensor of different sizes, but same rank.
+t_3d = Tensor<float, 3>(3, 4, 3);
 
 #### Constructor Tensor<data_type, rank>(size_array)
 
@@ -42,7 +42,6 @@
     // Create a tensor of strings of rank 2 with sizes 5, 7.
     Tensor<string, 2> t_2d({5, 7});
 
-
 ### Class TensorFixedSize<data_type, Sizes<size0, size1, ...>>
 
 Class to use for tensors of fixed size, where the size is known at compile
@@ -73,100 +72,101 @@
 
     // Map a tensor of ints on top of stack-allocated storage.
     int storage[128];  // 2 x 4 x 2 x 8 = 128
-    TensorMap<Tensor<int, 4>> t_4d(storage, 2, 4, 2, 8);
+TensorMap<Tensor<int, 4>> t_4d(storage, 2, 4, 2, 8);
 
-    // The same storage can be viewed as a different tensor.
-    // You can also pass the sizes as an array.
-    TensorMap<Tensor<int, 2>> t_2d(storage, 16, 8);
+// The same storage can be viewed as a different tensor.
+// You can also pass the sizes as an array.
+TensorMap<Tensor<int, 2>> t_2d(storage, 16, 8);
 
-    // You can also map fixed-size tensors.  Here we get a 1d view of
-    // the 2d fixed-size tensor.
-    TensorFixedSize<float, Sizes<4, 3>> t_4x3;
-    TensorMap<Tensor<float, 1>> t_12(t_4x3.data(), 12);
+// You can also map fixed-size tensors.  Here we get a 1d view of
+// the 2d fixed-size tensor.
+TensorFixedSize<float, Sizes<4, 3>> t_4x3;
+TensorMap<Tensor<float, 1>> t_12(t_4x3.data(), 12);
 
+####Class TensorRef
 
-#### Class TensorRef
+        See Assigning to a TensorRef below
+            .
 
-See Assigning to a TensorRef below.
+    ##Accessing Tensor Elements
 
-## Accessing Tensor Elements
+    ####<data_type>
+    tensor(index0, index1...)
 
-#### <data_type> tensor(index0, index1...)
+        Return the element at position `(index0, index1...)` in tensor
+`tensor`.You must pass as many parameters as the rank of `tensor`.The expression can be used as an l
+    - value to set the value of the element at the specified position
+          .The value returned is of the datatype of the tensor.
 
-Return the element at position `(index0, index1...)` in tensor
-`tensor`.  You must pass as many parameters as the rank of `tensor`.
-The expression can be used as an l-value to set the value of the element at the
-specified position.  The value returned is of the datatype of the tensor.
+      // Set the value of the element at position (0, 1, 0);
+      Tensor<float, 3> t_3d(2, 3, 4);
+t_3d(0, 1, 0) = 12.0f;
 
-    // Set the value of the element at position (0, 1, 0);
-    Tensor<float, 3> t_3d(2, 3, 4);
-    t_3d(0, 1, 0) = 12.0f;
-
-    // Initialize all elements to random values.
-    for (int i = 0; i < 2; ++i) {
-      for (int j = 0; j < 3; ++j) {
-        for (int k = 0; k < 4; ++k) {
-          t_3d(i, j, k) = ...some random value...;
-        }
-      }
+// Initialize all elements to random values.
+for (int i = 0; i < 2; ++i) {
+  for (int j = 0; j < 3; ++j) {
+    for (int k = 0; k < 4; ++k) {
+      t_3d(i, j, k) = ... some random value...;
     }
+  }
+}
 
-    // Print elements of a tensor.
-    for (int i = 0; i < 2; ++i) {
-      LOG(INFO) << t_3d(i, 0, 0);
-    }
+// Print elements of a tensor.
+for (int i = 0; i < 2; ++i) {
+  LOG(INFO) << t_3d(i, 0, 0);
+}
 
+##TensorLayout
 
-## TensorLayout
+        The tensor library supports 2 layouts : `ColMajor` (the default) and
+`RowMajor`.
 
-The tensor library supports 2 layouts: `ColMajor` (the default) and
-`RowMajor`. 
+        The layout of a tensor is
+        optionally specified as part of its type.If not specified explicitly column major is assumed.
 
-The layout of a tensor is optionally specified as part of its type. If not
-specified explicitly column major is assumed.
+        Tensor<float, 3, ColMajor> col_major;  // equivalent to Tensor<float, 3>
+TensorMap<Tensor<float, 3, RowMajor>> row_major(data, ...);
 
-    Tensor<float, 3, ColMajor> col_major;  // equivalent to Tensor<float, 3>
-    TensorMap<Tensor<float, 3, RowMajor> > row_major(data, ...);
+All the arguments to an expression must use the same
+        layout.Attempting to mix different layouts will result in a compilation error.
 
-All the arguments to an expression must use the same layout. Attempting to mix
-different layouts will result in a compilation error.
-
-It is possible to change the layout of a tensor or an expression using the
-`swap_layout()` method.  Note that this will also reverse the order of the
-dimensions.
+    It is possible to change the layout of a tensor or
+    an expression using the
+`swap_layout()` method.Note that this will also reverse the order of the dimensions.
 
     Tensor<float, 2, ColMajor> col_major(2, 4);
-    Tensor<float, 2, RowMajor> row_major(2, 4);
+Tensor<float, 2, RowMajor> row_major(2, 4);
 
-    Tensor<float, 2> col_major_result = col_major;  // ok, layouts match
-    Tensor<float, 2> col_major_result = row_major;  // will not compile
+Tensor<float, 2> col_major_result = col_major;  // ok, layouts match
+Tensor<float, 2> col_major_result = row_major;  // will not compile
 
-    // Simple layout swap
-    col_major_result = row_major.swap_layout();
-    eigen_assert(col_major_result.dimension(0) == 4);
-    eigen_assert(col_major_result.dimension(1) == 2);
+// Simple layout swap
+col_major_result = row_major.swap_layout();
+eigen_assert(col_major_result.dimension(0) == 4);
+eigen_assert(col_major_result.dimension(1) == 2);
 
-    // Swap the layout and preserve the order of the dimensions
-    array<int, 2> shuffle(1, 0);
-    col_major_result = row_major.swap_layout().shuffle(shuffle);
-    eigen_assert(col_major_result.dimension(0) == 2);
-    eigen_assert(col_major_result.dimension(1) == 4);
+// Swap the layout and preserve the order of the dimensions
+array<int, 2> shuffle(1, 0);
+col_major_result = row_major.swap_layout().shuffle(shuffle);
+eigen_assert(col_major_result.dimension(0) == 2);
+eigen_assert(col_major_result.dimension(1) == 4);
 
+##Tensor Operations
 
-## Tensor Operations
+    The Eigen Tensor library provides a vast library of operations on Tensors
+    : numerical operations such as addition and multiplication,
+      geometry operations such as slicing and shuffling,
+      etc.These operations are available as methods of the Tensor classes,
+      and in some cases as operator overloads.For example the following code computes the elementwise addition of two
+              tensors :
 
-The Eigen Tensor library provides a vast library of operations on Tensors:
-numerical operations such as addition and multiplication, geometry operations
-such as slicing and shuffling, etc.  These operations are available as methods
-of the Tensor classes, and in some cases as operator overloads.  For example
-the following code computes the elementwise addition of two tensors:
-
-    Tensor<float, 3> t1(2, 3, 4);
-    ...set some values in t1...
-    Tensor<float, 3> t2(2, 3, 4);
-    ...set some values in t2...
+    Tensor<float, 3>
+        t1(2, 3, 4);
+... set some values in t1... Tensor<float, 3> t2(2, 3, 4);
+... set some values in t2...
     // Set t3 to the element wise sum of t1 and t2
-    Tensor<float, 3> t3 = t1 + t2;
+    Tensor<float, 3>
+        t3 = t1 + t2;
 
 While the code above looks easy enough, it is important to understand that the
 expression `t1 + t2` is not actually adding the values of the tensors.  The
@@ -192,19 +192,17 @@
 does not have its intuitive meaning.  Consider these 2 lines of code:
 
     Tensor<float, 3> t3 = t1 + t2;
-    auto t4 = t1 + t2;
+auto t4 = t1 + t2;
 
-In the first line we allocate the tensor `t3` and it will contain the
-result of the addition of `t1` and `t2`.  In the second line, `t4`
-is actually the tree of tensor operators that will compute the addition of
-`t1` and `t2`.  In fact, `t4` is *not* a tensor and you cannot get
-the values of its elements:
+In the first line we allocate the tensor `t3` and it will contain the result of the addition of `t1` and `t2`.In the second line, `t4` is actually the tree of tensor operators that will compute the addition of
+`t1` and `t2`.In fact, `t4` is * not *a tensor and you cannot get the values of its elements :
 
-    Tensor<float, 3> t3 = t1 + t2;
-    cout << t3(0, 0, 0);  // OK prints the value of t1(0, 0, 0) + t2(0, 0, 0)
+    Tensor<float, 3>
+        t3 = t1 + t2;
+cout << t3(0, 0, 0);  // OK prints the value of t1(0, 0, 0) + t2(0, 0, 0)
 
-    auto t4 = t1 + t2;
-    cout << t4(0, 0, 0);  // Compilation error!
+auto t4 = t1 + t2;
+cout << t4(0, 0, 0);  // Compilation error!
 
 When you use `auto` you do not get a Tensor as a result but instead a
 non-evaluated expression.  So only use `auto` to delay evaluation.
@@ -218,16 +216,16 @@
 either a normal Tensor, a fixed size Tensor, or a TensorMap on an existing
 piece of memory.  All the following will work:
 
-    auto t4 = t1 + t2;
+auto t4 = t1 + t2;
 
-    Tensor<float, 3> result = t4;  // Could also be: result(t4);
-    cout << result(0, 0, 0);
+Tensor<float, 3> result = t4;  // Could also be: result(t4);
+cout << result(0, 0, 0);
 
-    TensorMap<float, 4> result(<a float* with enough space>, <size0>, ...) = t4;
-    cout << result(0, 0, 0);
+TensorMap<float, 4> result(<a float * with enough space>, <size0>, ...) = t4;
+cout << result(0, 0, 0);
 
-    TensorFixedSize<float, Sizes<size0, ...>> result = t4;
-    cout << result(0, 0, 0);
+TensorFixedSize<float, Sizes<size0, ...>> result = t4;
+cout << result(0, 0, 0);
 
 Until you need the results, you can keep the operation around, and even reuse
 it for additional operations.  As long as you keep the expression as an
@@ -235,109 +233,108 @@
 
     // One way to compute exp((t1 + t2) * 0.2f);
     auto t3 = t1 + t2;
-    auto t4 = t3 * 0.2f;
-    auto t5 = t4.exp();
-    Tensor<float, 3> result = t5;
+auto t4 = t3 * 0.2f;
+auto t5 = t4.exp();
+Tensor<float, 3> result = t5;
 
-    // Another way, exactly as efficient as the previous one:
-    Tensor<float, 3> result = ((t1 + t2) * 0.2f).exp();
+// Another way, exactly as efficient as the previous one:
+Tensor<float, 3> result = ((t1 + t2) * 0.2f).exp();
 
-### Controlling When Expression are Evaluated
+## #Controlling When Expression are Evaluated
 
-There are several ways to control when expressions are evaluated:
+    There are several ways to control when expressions are evaluated :
 
-*   Assignment to a Tensor, TensorFixedSize, or TensorMap.
-*   Use of the eval() method.
-*   Assignment to a TensorRef.
+    *Assignment to a Tensor,
+    TensorFixedSize,
+    or TensorMap.*Use of the eval() method.*
+            Assignment to a TensorRef.
 
-#### Assigning to a Tensor, TensorFixedSize, or TensorMap.
+            ####Assigning to a Tensor,
+    TensorFixedSize,
+    or TensorMap
+            .
 
-The most common way to evaluate an expression is to assign it to a Tensor.  In
-the example below, the `auto` declarations make the intermediate values
-"Operations", not Tensors, and do not cause the expressions to be evaluated.
-The assignment to the Tensor `result` causes the evaluation of all the
-operations.
+        The most common way to evaluate an expression is to assign it to a Tensor.In the example below,
+    the `auto` declarations make the intermediate values "Operations",
+    not Tensors,
+    and do not cause the
+        expressions to be evaluated.The assignment to the Tensor `result` causes the evaluation of all the operations.
 
-    auto t3 = t1 + t2;             // t3 is an Operation.
-    auto t4 = t3 * 0.2f;           // t4 is an Operation.
-    auto t5 = t4.exp();            // t5 is an Operation.
-    Tensor<float, 3> result = t5;  // The operations are evaluated.
+        auto t3 = t1 + t2;     // t3 is an Operation.
+auto t4 = t3 * 0.2f;           // t4 is an Operation.
+auto t5 = t4.exp();            // t5 is an Operation.
+Tensor<float, 3> result = t5;  // The operations are evaluated.
 
-If you know the ranks and sizes of the Operation value you can assign the
-Operation to a TensorFixedSize instead of a Tensor, which is a bit more
-efficient.
+If you know the ranks and sizes of the Operation value you can assign the Operation to a TensorFixedSize instead of a
+    Tensor,
+    which is a bit more efficient.
 
     // We know that the result is a 4x4x2 tensor!
-    TensorFixedSize<float, Sizes<4, 4, 2>> result = t5;
+    TensorFixedSize<float, Sizes<4, 4, 2>>
+        result = t5;
 
-Simiarly, assigning an expression to a TensorMap causes its evaluation.  Like
-tensors of type TensorFixedSize, TensorMaps cannot be resized so they have to
-have the rank and sizes of the expression that are assigned to them.
+Simiarly, assigning an expression to a TensorMap causes its evaluation.Like tensors of type TensorFixedSize,
+    TensorMaps cannot be resized so they have to have the rank and sizes of the expression that are assigned to them
+        .
 
-#### Calling eval().
+    ####Calling
+    eval()
+        .
 
-When you compute large composite expressions, you sometimes want to tell Eigen
-that an intermediate value in the expression tree is worth evaluating ahead of
-time.  This is done by inserting a call to the `eval()` method of the
-expression Operation.
+    When you compute large composite expressions,
+    you sometimes want to tell Eigen that an intermediate value in the expression tree is worth
+    evaluating ahead of time.This is done by inserting a call to the `eval()` method of the expression Operation.
 
     // The previous example could have been written:
     Tensor<float, 3> result = ((t1 + t2) * 0.2f).exp();
 
-    // If you want to compute (t1 + t2) once ahead of time you can write:
-    Tensor<float, 3> result = ((t1 + t2).eval() * 0.2f).exp();
+// If you want to compute (t1 + t2) once ahead of time you can write:
+Tensor<float, 3> result = ((t1 + t2).eval() * 0.2f).exp();
 
-Semantically, calling `eval()` is equivalent to materializing the value of
-the expression in a temporary Tensor of the right size.  The code above in
-effect does:
+Semantically, calling `eval()` is equivalent to materializing the value of the
+              expression in a temporary Tensor of the right size.The code above in effect does :
 
     // .eval() knows the size!
     TensorFixedSize<float, Sizes<4, 4, 2>> tmp = t1 + t2;
-    Tensor<float, 3> result = (tmp * 0.2f).exp();
+Tensor<float, 3> result = (tmp * 0.2f).exp();
 
-Note that the return value of `eval()` is itself an Operation, so the
-following code does not do what you may think:
+Note that the return value of `eval()` is itself an Operation, so the following code does not do what you may think :
 
     // Here t3 is an evaluation Operation.  t3 has not been evaluated yet.
     auto t3 = (t1 + t2).eval();
 
-    // You can use t3 in another expression.  Still no evaluation.
-    auto t4 = (t3 * 0.2f).exp();
+// You can use t3 in another expression.  Still no evaluation.
+auto t4 = (t3 * 0.2f).exp();
 
-    // The value is evaluated when you assign the Operation to a Tensor, using
-    // an intermediate tensor to represent t3.x
-    Tensor<float, 3> result = t4;
+// The value is evaluated when you assign the Operation to a Tensor, using
+// an intermediate tensor to represent t3.x
+Tensor<float, 3> result = t4;
 
-While in the examples above calling `eval()` does not make a difference in
-performance, in other cases it can make a huge difference.  In the expression
-below the `broadcast()` expression causes the `X.maximum()` expression
-to be evaluated many times:
+While in the examples above calling `eval()` does not make a difference in performance,
+    in other cases it can make a huge difference.In the
+    expression below the `broadcast()` expression causes the `X.maximum()` expression to be evaluated many times :
 
-    Tensor<...> X ...;
-    Tensor<...> Y = ((X - X.maximum(depth_dim).reshape(dims2d).broadcast(bcast))
-                     * beta).exp();
+    Tensor<...> X...;
+Tensor<...> Y = ((X - X.maximum(depth_dim).reshape(dims2d).broadcast(bcast)) * beta).exp();
 
 Inserting a call to `eval()` between the `maximum()` and
-`reshape()` calls guarantees that maximum() is only computed once and
-greatly speeds-up execution:
+`reshape()` calls guarantees that maximum() is only computed once and greatly speeds - up execution :
 
-    Tensor<...> Y =
-      ((X - X.maximum(depth_dim).eval().reshape(dims2d).broadcast(bcast))
-        * beta).exp();
+    Tensor<...> Y = ((X - X.maximum(depth_dim).eval().reshape(dims2d).broadcast(bcast)) * beta).exp();
 
-In the other example below, the tensor `Y` is both used in the expression
-and its assignment.  This is an aliasing problem and if the evaluation is not
-done in the right order Y will be updated incrementally during the evaluation
-resulting in bogus results:
+In the other example below,
+    the tensor `Y` is both used in the expression and its assignment.This is an aliasing problem and if the evaluation
+        is not done in the right order Y will be updated incrementally during the evaluation resulting in bogus results
+    :
 
-     Tensor<...> Y ...;
-     Y = Y / (Y.sum(depth_dim).reshape(dims2d).broadcast(bcast));
+    Tensor<...>
+        Y...;
+Y = Y / (Y.sum(depth_dim).reshape(dims2d).broadcast(bcast));
 
-Inserting a call to `eval()` between the `sum()` and `reshape()`
-expressions ensures that the sum is computed before any updates to `Y` are
-done.
+Inserting a call to `eval()` between the `sum()` and `reshape()` expressions ensures that the sum is computed before any
+    updates to `Y` are done.
 
-     Y = Y / (Y.sum(depth_dim).eval().reshape(dims2d).broadcast(bcast));
+    Y = Y / (Y.sum(depth_dim).eval().reshape(dims2d).broadcast(bcast));
 
 Note that an eval around the full right hand side expression is not needed
 because the generated has to compute the i-th value of the right hand side
@@ -350,7 +347,6 @@
      Y.shuffle(...) =
         (Y / (Y.sum(depth_dim).eval().reshape(dims2d).broadcast(bcast))).eval();
 
-
 #### Assigning to a TensorRef.
 
 If you need to access only a few elements from the value of an expression you
@@ -365,10 +361,10 @@
     // evaluated yet.
     TensorRef<Tensor<float, 3> > ref = ((t1 + t2) * 0.2f).exp();
 
-    // Use "ref" to access individual elements.  The expression is evaluated
-    // on the fly.
-    float at_0 = ref(0, 0, 0);
-    cout << ref(0, 1, 0);
+// Use "ref" to access individual elements.  The expression is evaluated
+// on the fly.
+float at_0 = ref(0, 0, 0);
+cout << ref(0, 1, 0);
 
 Only use TensorRef when you need a subset of the values of the expression.
 TensorRef only computes the values you access.  However note that if you are
@@ -399,8 +395,8 @@
 single-threaded CPU implementation:
 
     Tensor<float, 2> a(30, 40);
-    Tensor<float, 2> b(30, 40);
-    Tensor<float, 2> c = a + b;
+Tensor<float, 2> b(30, 40);
+Tensor<float, 2> c = a + b;
 
 To choose a different implementation you have to insert a `device()` call
 before the assignment of the result.  For technical C++ reasons this requires
@@ -408,23 +404,25 @@
 have to know the size of the result.
 
     Eigen::Tensor<float, 2> c(30, 40);
-    c.device(...) = a + b;
+c.device(...) = a + b;
 
-The call to `device()` must be the last call on the left of the operator=.
+The call to `device()` must be the last call on the left of the operator=
+    .
 
-You must pass to the `device()` call an Eigen device object.  There are
-presently three devices you can use: DefaultDevice, ThreadPoolDevice and
-GpuDevice.
+    You must pass to the `device()` call an Eigen device object.There are presently three devices you can use
+    : DefaultDevice,
+                                                                ThreadPoolDevice and GpuDevice
+                                                                    .
 
+                                                                ####Evaluating With the DefaultDevice
 
-#### Evaluating With the DefaultDevice
+                                                                This is exactly the same as
+                                                                not inserting a `device()` call.
 
-This is exactly the same as not inserting a `device()` call.
+                                                                DefaultDevice my_device;
+c.device(my_device) = a + b;
 
-    DefaultDevice my_device;
-    c.device(my_device) = a + b;
-
-#### Evaluating with a Thread Pool
+####Evaluating with a Thread Pool
 
     // Create the Eigen ThreadPool
     Eigen::ThreadPool pool(8 /* number of threads in pool */)
@@ -432,10 +430,9 @@
     // Create the Eigen ThreadPoolDevice.
     Eigen::ThreadPoolDevice my_device(&pool, 4 /* number of threads to use */);
 
-    // Now just use the device when evaluating expressions.
-    Eigen::Tensor<float, 2> c(30, 50);
-    c.device(my_device) = a.contract(b, dot_product_dims);
-
+// Now just use the device when evaluating expressions.
+Eigen::Tensor<float, 2> c(30, 50);
+c.device(my_device) = a.contract(b, dot_product_dims);
 
 #### Evaluating On GPU
 
@@ -494,150 +491,151 @@
 known as the tensor "rank".
 
       Eigen::Tensor<float, 2> a(3, 4);
-      cout << "Dims " << a.NumDimensions;
-      => Dims 2
+cout << "Dims " << a.NumDimensions;
+= > Dims 2
 
-### Dimensions dimensions()
+        ## #Dimensions dimensions()
 
-Returns an array-like object representing the dimensions of the tensor.
-The actual type of the `dimensions()` result is `<Tensor-Type>::``Dimensions`.
+            Returns an array
+        - like object representing the
+          dimensions of the tensor.The actual type of the `dimensions()` result is `<Tensor - Type>::``Dimensions`.
+
+          Eigen::Tensor<float, 2> a(3, 4);
+const Eigen::Tensor<float, 2>::Dimensions& d = a.dimensions();
+cout << "Dim size: " << d.size << ", dim 0: " << d[0] << ", dim 1: " << d[1];
+= > Dim size : 2, dim 0 : 3,
+    dim 1 : 4
+
+    If you use a C++ 11 compiler,
+    you can use `auto` to simplify the code :
+
+    const auto &d = a.dimensions();
+cout << "Dim size: " << d.size << ", dim 0: " << d[0] << ", dim 1: " << d[1];
+= > Dim size : 2, dim 0 : 3,
+    dim 1 : 4
+
+        ## #Index dimension(Index n)
+
+            Returns the n
+        - th dimension of the tensor.The actual type of the
+`dimension()` result is `<Tensor - Type>::``Index`,
+    but you can always use it like an int.
 
     Eigen::Tensor<float, 2> a(3, 4);
-    const Eigen::Tensor<float, 2>::Dimensions& d = a.dimensions();
-    cout << "Dim size: " << d.size << ", dim 0: " << d[0]
-         << ", dim 1: " << d[1];
-    => Dim size: 2, dim 0: 3, dim 1: 4
+int dim1 = a.dimension(1);
+cout << "Dim 1: " << dim1;
+= > Dim 1 : 4
 
-If you use a C++11 compiler, you can use `auto` to simplify the code:
+    ## #Index size()
 
-    const auto& d = a.dimensions();
-    cout << "Dim size: " << d.size << ", dim 0: " << d[0]
-         << ", dim 1: " << d[1];
-    => Dim size: 2, dim 0: 3, dim 1: 4
-
-### Index dimension(Index n)
-
-Returns the n-th dimension of the tensor.  The actual type of the
-`dimension()` result is `<Tensor-Type>::``Index`, but you can
-always use it like an int.
-
-      Eigen::Tensor<float, 2> a(3, 4);
-      int dim1 = a.dimension(1);
-      cout << "Dim 1: " << dim1;
-      => Dim 1: 4
-
-### Index size()
-
-Returns the total number of elements in the tensor.  This is the product of all
-the tensor dimensions.  The actual type of the `size()` result is
-`<Tensor-Type>::``Index`, but you can always use it like an int.
+        Returns the total number of elements in the tensor.This is the product of all the tensor
+    dimensions.The actual type of the `size()` result is
+`<Tensor - Type>::``Index`,
+    but you can always use it like an int.
 
     Eigen::Tensor<float, 2> a(3, 4);
-    cout << "Size: " << a.size();
-    => Size: 12
+cout << "Size: " << a.size();
+= > Size : 12
 
+  ## #Getting Dimensions From An Operation
 
-### Getting Dimensions From An Operation
+      A few operations provide `dimensions()` directly,
+    e.g. `TensorReslicingOp`.Most operations defer calculating
+    dimensions until the operation is being evaluated.If you need access to the dimensions of a deferred operation,
+    you can wrap it in a TensorRef(see Assigning to a TensorRef above),
+    which provides `dimensions()` and `dimension()` as above.
 
-A few operations provide `dimensions()` directly,
-e.g. `TensorReslicingOp`.  Most operations defer calculating dimensions
-until the operation is being evaluated.  If you need access to the dimensions
-of a deferred operation, you can wrap it in a TensorRef (see Assigning to a
-TensorRef above), which provides `dimensions()` and `dimension()` as
-above.
+    TensorRef can also wrap the plain Tensor types,
+    so this is a useful idiom in templated contexts where the underlying object could be either a raw Tensor
+        or some deferred operation(e.g.a slice of a Tensor).In this case,
+    the template code can wrap the object in a TensorRef and reason about its dimensionality
+    while remaining agnostic to the underlying type
+        .
 
-TensorRef can also wrap the plain Tensor types, so this is a useful idiom in
-templated contexts where the underlying object could be either a raw Tensor
-or some deferred operation (e.g. a slice of a Tensor).  In this case, the
-template code can wrap the object in a TensorRef and reason about its
-dimensionality while remaining agnostic to the underlying type.
+    ##Constructors
 
+    ## #Tensor
 
-## Constructors
-
-### Tensor
-
-Creates a tensor of the specified size. The number of arguments must be equal
-to the rank of the tensor. The content of the tensor is not initialized.
+    Creates a tensor of the specified size.The number of arguments must be equal to the rank of the tensor
+        .The content of the tensor is not initialized.
 
     Eigen::Tensor<float, 2> a(3, 4);
-    cout << "NumRows: " << a.dimension(0) << " NumCols: " << a.dimension(1) << endl;
-    => NumRows: 3 NumCols: 4
+    cout << "NumRows: " << a.dimension(0) << " NumCols: " << a.dimension(1) << endl; = > NumRows:
+3 NumCols : 4
 
-### TensorFixedSize
+    ## #TensorFixedSize
 
-Creates a tensor of the specified size. The number of arguments in the Sizes<>
-template parameter determines the rank of the tensor. The content of the tensor
-is not initialized.
+    Creates a tensor of the specified
+        size.The number of arguments in the Sizes<> template parameter determines the rank of the
+            tensor.The content of the tensor is not initialized.
 
-    Eigen::TensorFixedSize<float, Sizes<3, 4>> a;
-    cout << "Rank: " << a.rank() << endl;
-    => Rank: 2
-    cout << "NumRows: " << a.dimension(0) << " NumCols: " << a.dimension(1) << endl;
-    => NumRows: 3 NumCols: 4
+    Eigen::TensorFixedSize<float, Sizes<3, 4>>
+        a;
+cout << "Rank: " << a.rank() << endl;
+= > Rank : 2 cout << "NumRows: " << a.dimension(0) << " NumCols: " << a.dimension(1) << endl;
+= > NumRows : 3 NumCols : 4
 
-### TensorMap
+    ## #TensorMap
 
-Creates a tensor mapping an existing array of data. The data must not be freed
-until the TensorMap is discarded, and the size of the data must be large enough
-to accommodate the coefficients of the tensor.
+    Creates a tensor mapping an existing array of data.The data must not be freed until the TensorMap is discarded,
+    and the size of the data must be large enough to accommodate the coefficients of the tensor.
 
-    float data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
-    Eigen::TensorMap<Tensor<float, 2>> a(data, 3, 4);
-    cout << "NumRows: " << a.dimension(0) << " NumCols: " << a.dimension(1) << endl;
-    => NumRows: 3 NumCols: 4
-    cout << "a(1, 2): " << a(1, 2) << endl;
-    => a(1, 2): 7
+        float data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
+Eigen::TensorMap<Tensor<float, 2>> a(data, 3, 4);
+cout << "NumRows: " << a.dimension(0) << " NumCols: " << a.dimension(1) << endl;
+= > NumRows : 3 NumCols : 4 cout << "a(1, 2): " << a(1, 2) << endl;
+= > a(1, 2) : 7
 
+      ##Contents Initialization
 
-## Contents Initialization
+      When a new Tensor
+  or a new TensorFixedSize are created,
+    memory is allocated to hold all the tensor elements, but the memory is not initialized.Similarly,
+    when a new TensorMap is created on top of non -
+        initialized memory the memory its contents are not initialized
+            .
 
-When a new Tensor or a new TensorFixedSize are created, memory is allocated to
-hold all the tensor elements, but the memory is not initialized.  Similarly,
-when a new TensorMap is created on top of non-initialized memory the memory its
-contents are not initialized.
+        You can use one of the methods below to initialize the tensor memory
+            .These have an immediate effect on the tensor and return the tensor itself as a result
+            .These are not tensor Operations which delay evaluation
+            .
 
-You can use one of the methods below to initialize the tensor memory.  These
-have an immediate effect on the tensor and return the tensor itself as a
-result.  These are not tensor Operations which delay evaluation.
+        ## #<Tensor - Type> setConstant(const Scalar& val)
 
-### <Tensor-Type> setConstant(const Scalar& val)
+            Sets all elements of the tensor to the constant value `val`
+            .  `Scalar` is the type of data stored in the tensor.You can pass any value that is convertible to that type
+            .
 
-Sets all elements of the tensor to the constant value `val`.  `Scalar`
-is the type of data stored in the tensor.  You can pass any value that is
-convertible to that type.
+        Returns the tensor itself in case you want to chain another call
+            .
 
-Returns the tensor itself in case you want to chain another call.
+        a.setConstant(12.3f);
+    cout << "Constant: " << endl
+         << a << endl
+         << endl;
+    = > Constant:
+12.3 12.3 12.3 12.3 12.3 12.3 12.3 12.3 12.3 12.3 12.3 12.3
 
-    a.setConstant(12.3f);
-    cout << "Constant: " << endl << a << endl << endl;
-    =>
-    Constant:
-    12.3 12.3 12.3 12.3
-    12.3 12.3 12.3 12.3
-    12.3 12.3 12.3 12.3
-
-Note that `setConstant()` can be used on any tensor where the element type
-has a copy constructor and an `operator=()`:
+    Note that `setConstant()` can be used on any tensor where the element type has a copy constructor and an `
+    operator=()`:
 
     Eigen::Tensor<string, 2> a(2, 3);
-    a.setConstant("yolo");
-    cout << "String tensor: " << endl << a << endl << endl;
-    =>
-    String tensor:
-    yolo yolo yolo
-    yolo yolo yolo
+a.setConstant("yolo");
+cout << "String tensor: " << endl << a << endl << endl;
+= > String tensor : yolo yolo yolo yolo yolo yolo
 
+                    ## #<Tensor - Type>
+                    setZero()
 
-### <Tensor-Type> setZero()
+                        Fills the tensor with zeros.Equivalent to `setConstant(Scalar(0))`
+                            .Returns the tensor itself in case you want to chain another call
+                            .
 
-Fills the tensor with zeros.  Equivalent to `setConstant(Scalar(0))`.
-Returns the tensor itself in case you want to chain another call.
-
-    a.setZero();
-    cout << "Zeros: " << endl << a << endl << endl;
-    =>
-    Zeros:
+                    a.setZero();
+    cout << "Zeros: " << endl
+         << a << endl
+         << endl;
+    = > Zeros:
     0 0 0 0
     0 0 0 0
     0 0 0 0
@@ -688,14 +686,12 @@
     cout << "Random: " << endl << a << endl << endl;
     =>
     Random:
-      0.680375    0.59688  -0.329554    0.10794
-     -0.211234   0.823295   0.536459 -0.0452059
-      0.566198  -0.604897  -0.444451   0.257742
+    0.680375 0.59688 - 0.329554 0.10794 - 0.211234 0.823295 0.536459 - 0.0452059 0.566198 - 0.604897 -
+        0.444451 0.257742
 
-You can customize `setRandom()` by providing your own random number
-generator as a template argument:
+        You can customize `setRandom()` by providing your own random number generator as a template argument :
 
-    a.setRandom<MyRandomGenerator>();
+        a.setRandom<MyRandomGenerator>();
 
 Here, `MyRandomGenerator` must be a struct with the following member
 functions, where Scalar and Index are the same as `<Tensor-Type>::``Scalar`
@@ -705,24 +701,23 @@
 
     // Custom number generator for use with setRandom().
     struct MyRandomGenerator {
-      // Default and copy constructors. Both are needed
-      MyRandomGenerator() { }
-      MyRandomGenerator(const MyRandomGenerator& ) { }
+  // Default and copy constructors. Both are needed
+  MyRandomGenerator() {}
+  MyRandomGenerator(const MyRandomGenerator&) {}
 
-      // Return a random value to be used.  "element_location" is the
-      // location of the entry to set in the tensor, it can typically
-      // be ignored.
-      Scalar operator()(Eigen::DenseIndex element_location,
-                        Eigen::DenseIndex /*unused*/ = 0) const {
-        return <randomly generated value of type T>;
-      }
+  // Return a random value to be used.  "element_location" is the
+  // location of the entry to set in the tensor, it can typically
+  // be ignored.
+  Scalar operator()(Eigen::DenseIndex element_location, Eigen::DenseIndex /*unused*/ = 0) const {
+    return <randomly generated value of type T>;
+  }
 
-      // Same as above but generates several numbers at a time.
-      typename internal::packet_traits<Scalar>::type packetOp(
-          Eigen::DenseIndex packet_location, Eigen::DenseIndex /*unused*/ = 0) const {
-        return <a packet of randomly generated values>;
-      }
-    };
+  // Same as above but generates several numbers at a time.
+  typename internal::packet_traits<Scalar>::type packetOp(Eigen::DenseIndex packet_location,
+                                                          Eigen::DenseIndex /*unused*/ = 0) const {
+    return <a packet of randomly generated values>;
+  }
+};
 
 You can also use one of the 2 random number generators that are part of the
 tensor library:
@@ -758,9 +753,9 @@
 Scalar is the type of data stored in the tensor.
 
     Eigen::Tensor<float, 2> a(3, 4);
-    float* a_data = a.data();
-    a_data[0] = 123.45f;
-    cout << "a(0, 0): " << a(0, 0);
+float* a_data = a.data();
+a_data[0] = 123.45f;
+cout << "a(0, 0): " << a(0, 0);
     => a(0, 0): 123.45
 
 
@@ -816,107 +811,108 @@
     Eigen::Tensor<float, 2> b = a + a.random();
     cout << "a" << endl << a << endl << endl;
     cout << "b" << endl << b << endl << endl;
-    =>
-    a
-    1 1 1
-    1 1 1
+    = > a 1 1 1 1 1 1
 
-    b
-    1.68038   1.5662  1.82329
-    0.788766  1.59688 0.395103
+          b 1.68038 1.5662 1.82329 0.788766 1.59688 0.395103
 
+          ##Unary Element Wise Operations
 
-## Unary Element Wise Operations
+              All these operations take a single input tensor as argument and return a tensor of the same type and
+      dimensions as the tensor to which they are
+          applied.The requested operations are applied to each element independently.
 
-All these operations take a single input tensor as argument and return a tensor
-of the same type and dimensions as the tensor to which they are applied.  The
-requested operations are applied to each element independently.
+      ## #<Operation>
+      operator-()
 
-### <Operation> operator-()
+          Returns a tensor of the same type and
+      dimensions as the original tensor containing the opposite values of the original tensor.
 
-Returns a tensor of the same type and dimensions as the original tensor
-containing the opposite values of the original tensor.
-
-    Eigen::Tensor<float, 2> a(2, 3);
+      Eigen::Tensor<float, 2>
+          a(2, 3);
     a.setConstant(1.0f);
     Eigen::Tensor<float, 2> b = -a;
     cout << "a" << endl << a << endl << endl;
     cout << "b" << endl << b << endl << endl;
-    =>
-    a
-    1 1 1
-    1 1 1
+    = > a 1 1 1 1 1 1
 
-    b
-    -1 -1 -1
-    -1 -1 -1
+            b -
+            1 - 1 - 1 - 1 - 1 -
+            1
 
-### <Operation> sqrt()
+            ## #<Operation>
+            sqrt()
 
-Returns a tensor of the same type and dimensions as the original tensor
-containing the square roots of the original tensor.
+                Returns a tensor of the same type and dimensions as the original tensor
+            containing the square roots of the original tensor
+                .
 
-### <Operation> rsqrt()
+            ## #<Operation> rsqrt()
 
-Returns a tensor of the same type and dimensions as the original tensor
-containing the inverse square roots of the original tensor.
+                Returns a tensor of the same type and dimensions as the original tensor
+            containing the inverse square roots of the original tensor
+                .
 
-### <Operation> square()
+            ## #<Operation> square()
 
-Returns a tensor of the same type and dimensions as the original tensor
-containing the squares of the original tensor values.
+                Returns a tensor of the same type and dimensions as the original tensor
+            containing the squares of the original tensor values
+                .
 
-### <Operation> inverse()
+            ## #<Operation> inverse()
 
-Returns a tensor of the same type and dimensions as the original tensor
-containing the inverse of the original tensor values.
+                Returns a tensor of the same type and dimensions as the original tensor
+            containing the inverse of the original tensor values
+                .
 
-### <Operation> exp()
+            ## #<Operation> exp()
 
-Returns a tensor of the same type and dimensions as the original tensor
-containing the exponential of the original tensor.
+                Returns a tensor of the same type and dimensions as the original tensor containing the
+            exponential of the original tensor
+                .
 
-### <Operation> log()
+            ## #<Operation> log()
 
-Returns a tensor of the same type and dimensions as the original tensor
-containing the natural logarithms of the original tensor.
+                Returns a tensor of the same type and dimensions as the original tensor containing the natural
+            logarithms of the original tensor
+                .
 
-### <Operation> abs()
+            ## #<Operation> abs()
 
-Returns a tensor of the same type and dimensions as the original tensor
-containing the absolute values of the original tensor.
+                Returns a tensor of the same type and dimensions as the original tensor
+            containing the absolute values of the original tensor
+                .
 
-### <Operation> arg()
+            ## #<Operation> arg()
 
-Returns a tensor with the same dimensions as the original tensor
-containing the complex argument (phase angle) of the values of the
-original tensor.
+                Returns a tensor with the same dimensions as the original tensor containing the complex
+            argument(phase angle) of the values of the original tensor
+                .
 
-### <Operation> real()
+            ## #<Operation> real()
 
-Returns a tensor with the same dimensions as the original tensor
-containing the real part of the complex values of the original tensor.
+                Returns a tensor with the same dimensions as the original tensor
+            containing the real part of the complex values of the original tensor
+                .
 
-### <Operation> imag()
+            ## #<Operation> imag()
 
-Returns a tensor with the same dimensions as the orginal tensor
-containing the imaginary part of the complex values of the original
-tensor.
+                Returns a tensor with the same dimensions as the orginal tensor
+            containing the imaginary part of the complex values of the original tensor
+                .
 
-### <Operation> pow(Scalar exponent)
+            ## #<Operation> pow(Scalar exponent)
 
-Returns a tensor of the same type and dimensions as the original tensor
-containing the coefficients of the original tensor to the power of the
-exponent.
+                Returns a tensor of the same type and dimensions as the original tensor containing the
+            coefficients of the original tensor to the power of the exponent.
 
-The type of the exponent, Scalar, is always the same as the type of the
-tensor coefficients.  For example, only integer exponents can be used in
-conjuntion with tensors of integer values.
+            The type of the exponent,
+        Scalar, is always the same as the type of the tensor coefficients.For example,
+        only integer exponents can be used in conjuntion with tensors of integer values
+            .
 
-You can use cast() to lift this restriction.  For example this computes
-cubic roots of an int Tensor:
+        You can use cast() to lift this restriction.For example this computes cubic roots of an int Tensor :
 
-    Eigen::Tensor<int, 2> a(2, 3);
+        Eigen::Tensor<int, 2> a(2, 3);
     a.setValues({{0, 1, 8}, {27, 64, 125}});
     Eigen::Tensor<double, 2> b = a.cast<double>().pow(1.0 / 3.0);
     cout << "a" << endl << a << endl << endl;
@@ -1305,19 +1301,17 @@
     output = input.convolve(kernel, dims);
 
     for (int i = 0; i < 3; ++i) {
-      for (int j = 0; j < 2; ++j) {
-        for (int k = 0; k < 6; ++k) {
-          for (int l = 0; l < 11; ++l) {
-            const float result = output(i,j,k,l);
-            const float expected = input(i,j+0,k+0,l) * kernel(0,0) +
-                                   input(i,j+1,k+0,l) * kernel(1,0) +
-                                   input(i,j+0,k+1,l) * kernel(0,1) +
-                                   input(i,j+1,k+1,l) * kernel(1,1);
-            VERIFY_IS_APPROX(result, expected);
-          }
-        }
+  for (int j = 0; j < 2; ++j) {
+    for (int k = 0; k < 6; ++k) {
+      for (int l = 0; l < 11; ++l) {
+        const float result = output(i, j, k, l);
+        const float expected = input(i, j + 0, k + 0, l) * kernel(0, 0) + input(i, j + 1, k + 0, l) * kernel(1, 0) +
+                               input(i, j + 0, k + 1, l) * kernel(0, 1) + input(i, j + 1, k + 1, l) * kernel(1, 1);
+        VERIFY_IS_APPROX(result, expected);
       }
     }
+  }
+    }
 
 
 ## Geometrical Operations
@@ -1663,18 +1657,18 @@
     patch_dims[1] = 2;
     patch = tensor.extract_patches(patch_dims);
     for (int k = 0; k < 6; ++k) {
-      cout << "patch index: " << k << endl;
-      for (int i = 0; i < 2; ++i) {
-    	for (int j = 0; j < 2; ++j) {
-    	  if (DataLayout == ColMajor) {
-    		cout << patch(i, j, k) << " ";
-    	  } else {
-    		cout << patch(k, i, j) << " ";
-    	  }
-    	}
-    	cout << endl;
+  cout << "patch index: " << k << endl;
+  for (int i = 0; i < 2; ++i) {
+    for (int j = 0; j < 2; ++j) {
+      if (DataLayout == ColMajor) {
+        cout << patch(i, j, k) << " ";
+      } else {
+        cout << patch(k, i, j) << " ";
       }
     }
+    cout << endl;
+  }
+    }
 
 This code results in the following output when the data layout is ColMajor:
 
@@ -1757,65 +1751,61 @@
 *) 2D patch: ColMajor (patch indexed by second-to-last dimension)
 
     Tensor<float, 5> twod_patch;
-    twod_patch = tensor.extract_image_patches<2, 2>();
-    // twod_patch.dimension(0) == 2
-    // twod_patch.dimension(1) == 2
-    // twod_patch.dimension(2) == 2
-    // twod_patch.dimension(3) == 3*5
-    // twod_patch.dimension(4) == 7
+twod_patch = tensor.extract_image_patches<2, 2>();
+// twod_patch.dimension(0) == 2
+// twod_patch.dimension(1) == 2
+// twod_patch.dimension(2) == 2
+// twod_patch.dimension(3) == 3*5
+// twod_patch.dimension(4) == 7
 
 *) 2D patch: RowMajor (patch indexed by the second dimension)
 
     Tensor<float, 5, RowMajor> twod_patch_row_major;
-    twod_patch_row_major = tensor_row_major.extract_image_patches<2, 2>();
-    // twod_patch_row_major.dimension(0) == 7
-    // twod_patch_row_major.dimension(1) == 3*5
-    // twod_patch_row_major.dimension(2) == 2
-    // twod_patch_row_major.dimension(3) == 2
-    // twod_patch_row_major.dimension(4) == 2
+twod_patch_row_major = tensor_row_major.extract_image_patches<2, 2>();
+// twod_patch_row_major.dimension(0) == 7
+// twod_patch_row_major.dimension(1) == 3*5
+// twod_patch_row_major.dimension(2) == 2
+// twod_patch_row_major.dimension(3) == 2
+// twod_patch_row_major.dimension(4) == 2
 
-## Special Operations
+##Special Operations
 
-### <Operation> cast<T>()
+    ## #<Operation>
+    cast<T>()
 
-Returns a tensor of type T with the same dimensions as the original tensor.
-The returned tensor contains the values of the original tensor converted to
-type T.
+        Returns a tensor of type T with the same dimensions as the original tensor
+            .The returned tensor contains the values of the original tensor converted to type T.
 
     Eigen::Tensor<float, 2> a(2, 3);
-    Eigen::Tensor<int, 2> b = a.cast<int>();
+Eigen::Tensor<int, 2> b = a.cast<int>();
 
 This can be useful for example if you need to do element-wise division of
 Tensors of integers.  This is not currently supported by the Tensor library
 but you can easily cast the tensors to floats to do the division:
 
     Eigen::Tensor<int, 2> a(2, 3);
-    a.setValues({{0, 1, 2}, {3, 4, 5}});
-    Eigen::Tensor<int, 2> b =
-        (a.cast<float>() / a.constant(2).cast<float>()).cast<int>();
-    cout << "a" << endl << a << endl << endl;
-    cout << "b" << endl << b << endl << endl;
-    =>
-    a
-    0 1 2
-    3 4 5
+a.setValues({{0, 1, 2}, {3, 4, 5}});
+Eigen::Tensor<int, 2> b = (a.cast<float>() / a.constant(2).cast<float>()).cast<int>();
+cout << "a" << endl << a << endl << endl;
+cout << "b" << endl << b << endl << endl;
+= > a 0 1 2 3 4 5
 
-    b
-    0 0 1
-    1 2 2
+    b 0 0 1 1 2 2
 
+    ## #<Operation>
+    eval()
 
-### <Operation>     eval()
+        TODO
 
-TODO
+    ##Tensor Printing Tensors can be printed into a stream object(e.g. `std::cout`) using different formatting options.
 
-## Tensor Printing
-Tensors can be printed into a stream object (e.g. `std::cout`) using different formatting options.
-
-	Eigen::Tensor<float, 3> tensor3d = {4, 3, 2};
-	tensor3d.setValues( {{{1, 2}, {3, 4}, {5, 6}}, {{7, 8}, {9, 10}, {11, 12}}, {{13, 14}, {15, 16}, {17, 18}}, {{19, 20}, {21, 22}, {23, 24}}} );
-	std::cout << tensor3d.format(Eigen::TensorIOFormat::Plain()) << std::endl;
-	==>
+    Eigen::Tensor<float, 3> tensor3d = {4, 3, 2};
+tensor3d.setValues({{{1, 2}, {3, 4}, {5, 6}},
+                    {{7, 8}, {9, 10}, {11, 12}},
+                    {{13, 14}, {15, 16}, {17, 18}},
+                    {{19, 20}, {21, 22}, {23, 24}}});
+std::cout << tensor3d.format(Eigen::TensorIOFormat::Plain()) << std::endl;
+        ==>
 	 1  2 
 	 3  4 
 	 5  6 
diff --git a/unsupported/Eigen/CXX11/src/Tensor/Tensor.h b/unsupported/Eigen/CXX11/src/Tensor/Tensor.h
index e596147..3b9eff7 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/Tensor.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/Tensor.h
@@ -17,270 +17,229 @@
 namespace Eigen {
 
 /** \class Tensor
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief The tensor class.
-  *
-  * The %Tensor class is the work-horse for all \em dense tensors within Eigen.
-  *
-  * The %Tensor class encompasses only dynamic-size objects so far.
-  *
-  * The first two template parameters are required:
-  * \tparam Scalar_  Numeric type, e.g. float, double, int or `std::complex<float>`.
-  *                 User defined scalar types are supported as well (see \ref user_defined_scalars "here").
-  * \tparam NumIndices_ Number of indices (i.e. rank of the tensor)
-  *
-  * The remaining template parameters are optional -- in most cases you don't have to worry about them.
-  * \tparam Options_  A combination of either \b #RowMajor or \b #ColMajor, and of either
-  *                 \b #AutoAlign or \b #DontAlign.
-  *                 The former controls \ref TopicStorageOrders "storage order", and defaults to column-major. The latter controls alignment, which is required
-  *                 for vectorization. It defaults to aligning tensors. Note that tensors currently do not support any operations that profit from vectorization.
-  *                 Support for such operations (i.e. adding two tensors etc.) is planned.
-  *
-  * You can access elements of tensors using normal subscripting:
-  *
-  * \code
-  * Eigen::Tensor<double, 4> t(10, 10, 10, 10);
-  * t(0, 1, 2, 3) = 42.0;
-  * \endcode
-  *
-  * This class can be extended with the help of the plugin mechanism described on the page
-  * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_TENSOR_PLUGIN,
-  * \c EIGEN_TENSORBASE_PLUGIN, and \c EIGEN_READONLY_TENSORBASE_PLUGIN.
-  *
-  * <i><b>Some notes:</b></i>
-  *
-  * <dl>
-  * <dt><b>Relation to other parts of Eigen:</b></dt>
-  * <dd>The midterm development goal for this class is to have a similar hierarchy as Eigen uses for matrices, so that
-  * taking blocks or using tensors in expressions is easily possible, including an interface with the vector/matrix code
-  * by providing .asMatrix() and .asVector() (or similar) methods for rank 2 and 1 tensors. However, currently, the %Tensor
-  * class does not provide any of these features and is only available as a stand-alone class that just allows for
-  * coefficient access. Also, when fixed-size tensors are implemented, the number of template arguments is likely to
-  * change dramatically.</dd>
-  * </dl>
-  *
-  * \ref TopicStorageOrders
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief The tensor class.
+ *
+ * The %Tensor class is the work-horse for all \em dense tensors within Eigen.
+ *
+ * The %Tensor class encompasses only dynamic-size objects so far.
+ *
+ * The first two template parameters are required:
+ * \tparam Scalar_  Numeric type, e.g. float, double, int or `std::complex<float>`.
+ *                 User defined scalar types are supported as well (see \ref user_defined_scalars "here").
+ * \tparam NumIndices_ Number of indices (i.e. rank of the tensor)
+ *
+ * The remaining template parameters are optional -- in most cases you don't have to worry about them.
+ * \tparam Options_  A combination of either \b #RowMajor or \b #ColMajor, and of either
+ *                 \b #AutoAlign or \b #DontAlign.
+ *                 The former controls \ref TopicStorageOrders "storage order", and defaults to column-major. The latter
+ * controls alignment, which is required for vectorization. It defaults to aligning tensors. Note that tensors currently
+ * do not support any operations that profit from vectorization. Support for such operations (i.e. adding two tensors
+ * etc.) is planned.
+ *
+ * You can access elements of tensors using normal subscripting:
+ *
+ * \code
+ * Eigen::Tensor<double, 4> t(10, 10, 10, 10);
+ * t(0, 1, 2, 3) = 42.0;
+ * \endcode
+ *
+ * This class can be extended with the help of the plugin mechanism described on the page
+ * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_TENSOR_PLUGIN,
+ * \c EIGEN_TENSORBASE_PLUGIN, and \c EIGEN_READONLY_TENSORBASE_PLUGIN.
+ *
+ * <i><b>Some notes:</b></i>
+ *
+ * <dl>
+ * <dt><b>Relation to other parts of Eigen:</b></dt>
+ * <dd>The midterm development goal for this class is to have a similar hierarchy as Eigen uses for matrices, so that
+ * taking blocks or using tensors in expressions is easily possible, including an interface with the vector/matrix code
+ * by providing .asMatrix() and .asVector() (or similar) methods for rank 2 and 1 tensors. However, currently, the
+ * %Tensor class does not provide any of these features and is only available as a stand-alone class that just allows
+ * for coefficient access. Also, when fixed-size tensors are implemented, the number of template arguments is likely to
+ * change dramatically.</dd>
+ * </dl>
+ *
+ * \ref TopicStorageOrders
+ */
 
-template<typename Scalar_, int NumIndices_, int Options_, typename IndexType_>
-class Tensor : public TensorBase<Tensor<Scalar_, NumIndices_, Options_, IndexType_> >
-{
-  public:
-    typedef Tensor<Scalar_, NumIndices_, Options_, IndexType_> Self;
-    typedef TensorBase<Tensor<Scalar_, NumIndices_, Options_, IndexType_> > Base;
-    typedef typename Eigen::internal::nested<Self>::type Nested;
-    typedef typename internal::traits<Self>::StorageKind StorageKind;
-    typedef typename internal::traits<Self>::Index Index;
-    typedef Scalar_ Scalar;
-    typedef typename NumTraits<Scalar>::Real RealScalar;
-    typedef typename Base::CoeffReturnType CoeffReturnType;
+template <typename Scalar_, int NumIndices_, int Options_, typename IndexType_>
+class Tensor : public TensorBase<Tensor<Scalar_, NumIndices_, Options_, IndexType_> > {
+ public:
+  typedef Tensor<Scalar_, NumIndices_, Options_, IndexType_> Self;
+  typedef TensorBase<Tensor<Scalar_, NumIndices_, Options_, IndexType_> > Base;
+  typedef typename Eigen::internal::nested<Self>::type Nested;
+  typedef typename internal::traits<Self>::StorageKind StorageKind;
+  typedef typename internal::traits<Self>::Index Index;
+  typedef Scalar_ Scalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef typename Base::CoeffReturnType CoeffReturnType;
 
-    enum {
-      IsAligned = (EIGEN_MAX_ALIGN_BYTES>0) && !(Options_&DontAlign),
-      CoordAccess = true,
-      RawAccess = true
-    };
+  enum { IsAligned = (EIGEN_MAX_ALIGN_BYTES > 0) && !(Options_ & DontAlign), CoordAccess = true, RawAccess = true };
 
-    static constexpr int Layout = Options_ & RowMajor ? RowMajor : ColMajor;
-    static constexpr int Options = Options_;
-    static constexpr int NumIndices = NumIndices_;
-    typedef DSizes<Index, NumIndices_> Dimensions;
+  static constexpr int Layout = Options_ & RowMajor ? RowMajor : ColMajor;
+  static constexpr int Options = Options_;
+  static constexpr int NumIndices = NumIndices_;
+  typedef DSizes<Index, NumIndices_> Dimensions;
 
-  protected:
-    TensorStorage<Scalar, Dimensions, Options> m_storage;
+ protected:
+  TensorStorage<Scalar, Dimensions, Options> m_storage;
 
-    template<typename CustomIndices>
-    struct isOfNormalIndex{
-      static const bool is_array = internal::is_base_of<array<Index, NumIndices>, CustomIndices>::value;
-      static const bool is_int = NumTraits<CustomIndices>::IsInteger;
-      static const bool value = is_array | is_int;
-    };
+  template <typename CustomIndices>
+  struct isOfNormalIndex {
+    static const bool is_array = internal::is_base_of<array<Index, NumIndices>, CustomIndices>::value;
+    static const bool is_int = NumTraits<CustomIndices>::IsInteger;
+    static const bool value = is_array | is_int;
+  };
 
-  public:
-    // Metadata
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index                         rank()                   const { return NumIndices; }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index                         dimension(std::size_t n) const { return m_storage.dimensions()[n]; }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions&             dimensions()             const { return m_storage.dimensions(); }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index                         size()                   const { return m_storage.size(); }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar                        *data()                        { return m_storage.data(); }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar                  *data()                  const { return m_storage.data(); }
+ public:
+  // Metadata
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index rank() const { return NumIndices; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index dimension(std::size_t n) const { return m_storage.dimensions()[n]; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_storage.dimensions(); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index size() const { return m_storage.size(); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar* data() { return m_storage.data(); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar* data() const { return m_storage.data(); }
 
-    // This makes EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
-    // work, because that uses base().coeffRef() - and we don't yet
-    // implement a similar class hierarchy
-    inline Self& base()             { return *this; }
-    inline const Self& base() const { return *this; }
+  // This makes EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
+  // work, because that uses base().coeffRef() - and we don't yet
+  // implement a similar class hierarchy
+  inline Self& base() { return *this; }
+  inline const Self& base() const { return *this; }
 
-    template<typename... IndexTypes>
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& coeff(Index firstIndex, Index secondIndex, IndexTypes... otherIndices) const
-    {
-      // The number of indices used to access a tensor coefficient must be equal to the rank of the tensor.
-      EIGEN_STATIC_ASSERT(sizeof...(otherIndices) + 2 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
-      return coeff(array<Index, NumIndices>{{firstIndex, secondIndex, otherIndices...}});
-    }
+  template <typename... IndexTypes>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& coeff(Index firstIndex, Index secondIndex,
+                                                            IndexTypes... otherIndices) const {
+    // The number of indices used to access a tensor coefficient must be equal to the rank of the tensor.
+    EIGEN_STATIC_ASSERT(sizeof...(otherIndices) + 2 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
+    return coeff(array<Index, NumIndices>{{firstIndex, secondIndex, otherIndices...}});
+  }
 
-    // normal indices
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& coeff(const array<Index, NumIndices>& indices) const
-    {
-      eigen_internal_assert(checkIndexRange(indices));
-      return m_storage.data()[linearizedIndex(indices)];
-    }
+  // normal indices
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& coeff(const array<Index, NumIndices>& indices) const {
+    eigen_internal_assert(checkIndexRange(indices));
+    return m_storage.data()[linearizedIndex(indices)];
+  }
 
-    // custom indices
-    template<typename CustomIndices,
-             EIGEN_SFINAE_ENABLE_IF( !(isOfNormalIndex<CustomIndices>::value) )
-    >
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& coeff(CustomIndices& indices) const
-    {
-        return coeff(internal::customIndices2Array<Index,NumIndices>(indices));
-    }
+  // custom indices
+  template <typename CustomIndices, EIGEN_SFINAE_ENABLE_IF(!(isOfNormalIndex<CustomIndices>::value))>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& coeff(CustomIndices& indices) const {
+    return coeff(internal::customIndices2Array<Index, NumIndices>(indices));
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& coeff() const
-    {
-      EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE);
-      return m_storage.data()[0];
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& coeff() const {
+    EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE);
+    return m_storage.data()[0];
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& coeff(Index index) const
-    {
-      eigen_internal_assert(index >= 0 && index < size());
-      return m_storage.data()[index];
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& coeff(Index index) const {
+    eigen_internal_assert(index >= 0 && index < size());
+    return m_storage.data()[index];
+  }
 
-    template<typename... IndexTypes>
-    inline Scalar& coeffRef(Index firstIndex, Index secondIndex, IndexTypes... otherIndices)
-    {
-      // The number of indices used to access a tensor coefficient must be equal to the rank of the tensor.
-      EIGEN_STATIC_ASSERT(sizeof...(otherIndices) + 2 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
-      return coeffRef(array<Index, NumIndices>{{firstIndex, secondIndex, otherIndices...}});
-    }
+  template <typename... IndexTypes>
+  inline Scalar& coeffRef(Index firstIndex, Index secondIndex, IndexTypes... otherIndices) {
+    // The number of indices used to access a tensor coefficient must be equal to the rank of the tensor.
+    EIGEN_STATIC_ASSERT(sizeof...(otherIndices) + 2 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
+    return coeffRef(array<Index, NumIndices>{{firstIndex, secondIndex, otherIndices...}});
+  }
 
-    // normal indices
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(const array<Index, NumIndices>& indices)
-    {
-      eigen_internal_assert(checkIndexRange(indices));
-      return m_storage.data()[linearizedIndex(indices)];
-    }
+  // normal indices
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(const array<Index, NumIndices>& indices) {
+    eigen_internal_assert(checkIndexRange(indices));
+    return m_storage.data()[linearizedIndex(indices)];
+  }
 
-    // custom indices
-    template<typename CustomIndices,
-             EIGEN_SFINAE_ENABLE_IF( !(isOfNormalIndex<CustomIndices>::value) )
-             >
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(CustomIndices& indices)
-    {
-        return coeffRef(internal::customIndices2Array<Index,NumIndices>(indices));
-    }
+  // custom indices
+  template <typename CustomIndices, EIGEN_SFINAE_ENABLE_IF(!(isOfNormalIndex<CustomIndices>::value))>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(CustomIndices& indices) {
+    return coeffRef(internal::customIndices2Array<Index, NumIndices>(indices));
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef()
-    {
-      EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE);
-      return m_storage.data()[0];
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef() {
+    EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE);
+    return m_storage.data()[0];
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index index)
-    {
-      eigen_internal_assert(index >= 0 && index < size());
-      return m_storage.data()[index];
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index index) {
+    eigen_internal_assert(index >= 0 && index < size());
+    return m_storage.data()[index];
+  }
 
-    template<typename... IndexTypes>
-    inline const Scalar& operator()(Index firstIndex, Index secondIndex, IndexTypes... otherIndices) const
-    {
-      // The number of indices used to access a tensor coefficient must be equal to the rank of the tensor.
-      EIGEN_STATIC_ASSERT(sizeof...(otherIndices) + 2 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
-      return this->operator()(array<Index, NumIndices>{{firstIndex, secondIndex, otherIndices...}});
-    }
+  template <typename... IndexTypes>
+  inline const Scalar& operator()(Index firstIndex, Index secondIndex, IndexTypes... otherIndices) const {
+    // The number of indices used to access a tensor coefficient must be equal to the rank of the tensor.
+    EIGEN_STATIC_ASSERT(sizeof...(otherIndices) + 2 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
+    return this->operator()(array<Index, NumIndices>{{firstIndex, secondIndex, otherIndices...}});
+  }
 
-    // custom indices
-    template<typename CustomIndices,
-             EIGEN_SFINAE_ENABLE_IF( !(isOfNormalIndex<CustomIndices>::value) )
-    >
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& operator()(CustomIndices& indices) const
-    {
-        return coeff(internal::customIndices2Array<Index,NumIndices>(indices));
-    }
+  // custom indices
+  template <typename CustomIndices, EIGEN_SFINAE_ENABLE_IF(!(isOfNormalIndex<CustomIndices>::value))>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& operator()(CustomIndices& indices) const {
+    return coeff(internal::customIndices2Array<Index, NumIndices>(indices));
+  }
 
-    // normal indices
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& operator()(const array<Index, NumIndices>& indices) const
-    {
-      return coeff(indices);
-    }
+  // normal indices
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& operator()(const array<Index, NumIndices>& indices) const {
+    return coeff(indices);
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& operator()(Index index) const
-    {
-      eigen_internal_assert(index >= 0 && index < size());
-      return coeff(index);
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& operator()(Index index) const {
+    eigen_internal_assert(index >= 0 && index < size());
+    return coeff(index);
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& operator()() const
-    {
-      EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE);
-      return coeff();
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& operator()() const {
+    EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE);
+    return coeff();
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& operator[](Index index) const
-    {
-      // The bracket operator is only for vectors, use the parenthesis operator instead.
-      EIGEN_STATIC_ASSERT(NumIndices == 1, YOU_MADE_A_PROGRAMMING_MISTAKE);
-      return coeff(index);
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& operator[](Index index) const {
+    // The bracket operator is only for vectors, use the parenthesis operator instead.
+    EIGEN_STATIC_ASSERT(NumIndices == 1, YOU_MADE_A_PROGRAMMING_MISTAKE);
+    return coeff(index);
+  }
 
-    template<typename... IndexTypes>
-    inline Scalar& operator()(Index firstIndex, Index secondIndex, IndexTypes... otherIndices)
-    {
-      // The number of indices used to access a tensor coefficient must be equal to the rank of the tensor.
-      EIGEN_STATIC_ASSERT(sizeof...(otherIndices) + 2 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
-      return operator()(array<Index, NumIndices>{{firstIndex, secondIndex, otherIndices...}});
-    }
+  template <typename... IndexTypes>
+  inline Scalar& operator()(Index firstIndex, Index secondIndex, IndexTypes... otherIndices) {
+    // The number of indices used to access a tensor coefficient must be equal to the rank of the tensor.
+    EIGEN_STATIC_ASSERT(sizeof...(otherIndices) + 2 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
+    return operator()(array<Index, NumIndices>{{firstIndex, secondIndex, otherIndices...}});
+  }
 
-    // normal indices
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator()(const array<Index, NumIndices>& indices)
-    {
-      return coeffRef(indices);
-    }
+  // normal indices
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator()(const array<Index, NumIndices>& indices) {
+    return coeffRef(indices);
+  }
 
-    // custom indices
-    template<typename CustomIndices,
-             EIGEN_SFINAE_ENABLE_IF( !(isOfNormalIndex<CustomIndices>::value) )
-    >
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator()(CustomIndices& indices)
-    {
-      return coeffRef(internal::customIndices2Array<Index,NumIndices>(indices));
-    }
+  // custom indices
+  template <typename CustomIndices, EIGEN_SFINAE_ENABLE_IF(!(isOfNormalIndex<CustomIndices>::value))>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator()(CustomIndices& indices) {
+    return coeffRef(internal::customIndices2Array<Index, NumIndices>(indices));
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator()(Index index)
-    {
-      eigen_assert(index >= 0 && index < size());
-      return coeffRef(index);
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator()(Index index) {
+    eigen_assert(index >= 0 && index < size());
+    return coeffRef(index);
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator()()
-    {
-      EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE);
-      return coeffRef();
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator()() {
+    EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE);
+    return coeffRef();
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator[](Index index)
-    {
-      // The bracket operator is only for vectors, use the parenthesis operator instead
-      EIGEN_STATIC_ASSERT(NumIndices == 1, YOU_MADE_A_PROGRAMMING_MISTAKE)
-      return coeffRef(index);
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator[](Index index) {
+    // The bracket operator is only for vectors, use the parenthesis operator instead
+    EIGEN_STATIC_ASSERT(NumIndices == 1, YOU_MADE_A_PROGRAMMING_MISTAKE)
+    return coeffRef(index);
+  }
 
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Tensor()
-      : m_storage()
-    {
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Tensor() : m_storage() {}
 
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Tensor(const Self& other)
-      : Base(other), m_storage(other.m_storage)
-    {
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Tensor(const Self& other) : Base(other), m_storage(other.m_storage) {}
 
-    template<typename... IndexTypes>
+  template<typename... IndexTypes>
     EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Tensor(Index firstDimension, IndexTypes... otherDimensions)
         : m_storage(firstDimension, otherDimensions...)
     {
@@ -292,177 +251,150 @@
     EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit Tensor(const array<Index, NumIndices>& dimensions)
         : m_storage(internal::array_prod(dimensions), dimensions)
     {
-      EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
-    }
+    EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
+  }
 
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Tensor(const TensorBase<OtherDerived, ReadOnlyAccessors>& other)
-    {
-      EIGEN_STATIC_ASSERT(OtherDerived::NumDimensions == Base::NumDimensions, Number_of_dimensions_must_match)
-      typedef TensorAssignOp<Tensor, const OtherDerived> Assign;
-      Assign assign(*this, other.derived());
-      resize(TensorEvaluator<const Assign, DefaultDevice>(assign, DefaultDevice()).dimensions());
-      internal::TensorExecutor<const Assign, DefaultDevice>::run(assign, DefaultDevice());
-    }
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Tensor(const TensorBase<OtherDerived, ReadOnlyAccessors>& other) {
+    EIGEN_STATIC_ASSERT(OtherDerived::NumDimensions == Base::NumDimensions, Number_of_dimensions_must_match)
+    typedef TensorAssignOp<Tensor, const OtherDerived> Assign;
+    Assign assign(*this, other.derived());
+    resize(TensorEvaluator<const Assign, DefaultDevice>(assign, DefaultDevice()).dimensions());
+    internal::TensorExecutor<const Assign, DefaultDevice>::run(assign, DefaultDevice());
+  }
 
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Tensor(const TensorBase<OtherDerived, WriteAccessors>& other)
-    {
-      EIGEN_STATIC_ASSERT(OtherDerived::NumDimensions == Base::NumDimensions, Number_of_dimensions_must_match)
-      typedef TensorAssignOp<Tensor, const OtherDerived> Assign;
-      Assign assign(*this, other.derived());
-      resize(TensorEvaluator<const Assign, DefaultDevice>(assign, DefaultDevice()).dimensions());
-      internal::TensorExecutor<const Assign, DefaultDevice>::run(assign, DefaultDevice());
-    }
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Tensor(const TensorBase<OtherDerived, WriteAccessors>& other) {
+    EIGEN_STATIC_ASSERT(OtherDerived::NumDimensions == Base::NumDimensions, Number_of_dimensions_must_match)
+    typedef TensorAssignOp<Tensor, const OtherDerived> Assign;
+    Assign assign(*this, other.derived());
+    resize(TensorEvaluator<const Assign, DefaultDevice>(assign, DefaultDevice()).dimensions());
+    internal::TensorExecutor<const Assign, DefaultDevice>::run(assign, DefaultDevice());
+  }
 
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Tensor(Self&& other)
-      : m_storage(std::move(other.m_storage))
-    {
-    }
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Tensor& operator=(Self&& other)
-    {
-      m_storage = std::move(other.m_storage);
-      return *this;
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Tensor(Self&& other) : m_storage(std::move(other.m_storage)) {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Tensor& operator=(Self&& other) {
+    m_storage = std::move(other.m_storage);
+    return *this;
+  }
 
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Tensor& operator=(const Tensor& other)
-    {
-      typedef TensorAssignOp<Tensor, const Tensor> Assign;
-      Assign assign(*this, other);
-      resize(TensorEvaluator<const Assign, DefaultDevice>(assign, DefaultDevice()).dimensions());
-      internal::TensorExecutor<const Assign, DefaultDevice>::run(assign, DefaultDevice());
-      return *this;
-    }
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Tensor& operator=(const OtherDerived& other)
-    {
-      typedef TensorAssignOp<Tensor, const OtherDerived> Assign;
-      Assign assign(*this, other);
-      resize(TensorEvaluator<const Assign, DefaultDevice>(assign, DefaultDevice()).dimensions());
-      internal::TensorExecutor<const Assign, DefaultDevice>::run(assign, DefaultDevice());
-      return *this;
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Tensor& operator=(const Tensor& other) {
+    typedef TensorAssignOp<Tensor, const Tensor> Assign;
+    Assign assign(*this, other);
+    resize(TensorEvaluator<const Assign, DefaultDevice>(assign, DefaultDevice()).dimensions());
+    internal::TensorExecutor<const Assign, DefaultDevice>::run(assign, DefaultDevice());
+    return *this;
+  }
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Tensor& operator=(const OtherDerived& other) {
+    typedef TensorAssignOp<Tensor, const OtherDerived> Assign;
+    Assign assign(*this, other);
+    resize(TensorEvaluator<const Assign, DefaultDevice>(assign, DefaultDevice()).dimensions());
+    internal::TensorExecutor<const Assign, DefaultDevice>::run(assign, DefaultDevice());
+    return *this;
+  }
 
-    template<typename... IndexTypes> EIGEN_DEVICE_FUNC
-    void resize(Index firstDimension, IndexTypes... otherDimensions)
-    {
-      // The number of dimensions used to resize a tensor must be equal to the rank of the tensor.
-      EIGEN_STATIC_ASSERT(sizeof...(otherDimensions) + 1 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
-      resize(array<Index, NumIndices>{{firstDimension, otherDimensions...}});
-    }
+  template <typename... IndexTypes>
+  EIGEN_DEVICE_FUNC void resize(Index firstDimension, IndexTypes... otherDimensions) {
+    // The number of dimensions used to resize a tensor must be equal to the rank of the tensor.
+    EIGEN_STATIC_ASSERT(sizeof...(otherDimensions) + 1 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
+    resize(array<Index, NumIndices>{{firstDimension, otherDimensions...}});
+  }
 
-    /** Normal Dimension */
-    EIGEN_DEVICE_FUNC void resize(const array<Index, NumIndices>& dimensions)
-    {
-      int i;
-      Index size = Index(1);
-      for (i = 0; i < NumIndices; i++) {
-        internal::check_rows_cols_for_overflow<Dynamic, Dynamic, Dynamic>::run(size, dimensions[i]);
-        size *= dimensions[i];
-      }
-      #ifdef EIGEN_INITIALIZE_COEFFS
-        bool size_changed = size != this->size();
-        m_storage.resize(size, dimensions);
-        if(size_changed) EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
-      #else
-        m_storage.resize(size, dimensions);
-      #endif
+  /** Normal Dimension */
+  EIGEN_DEVICE_FUNC void resize(const array<Index, NumIndices>& dimensions) {
+    int i;
+    Index size = Index(1);
+    for (i = 0; i < NumIndices; i++) {
+      internal::check_rows_cols_for_overflow<Dynamic, Dynamic, Dynamic>::run(size, dimensions[i]);
+      size *= dimensions[i];
     }
+#ifdef EIGEN_INITIALIZE_COEFFS
+    bool size_changed = size != this->size();
+    m_storage.resize(size, dimensions);
+    if (size_changed) EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
+#else
+    m_storage.resize(size, dimensions);
+#endif
+  }
 
-    // Why this overload, DSizes is derived from array ??? //
-    EIGEN_DEVICE_FUNC void resize(const DSizes<Index, NumIndices>& dimensions) {
-      array<Index, NumIndices> dims;
-      for (int i = 0; i < NumIndices; ++i) {
-        dims[i] = dimensions[i];
-      }
-      resize(dims);
+  // Why this overload, DSizes is derived from array ??? //
+  EIGEN_DEVICE_FUNC void resize(const DSizes<Index, NumIndices>& dimensions) {
+    array<Index, NumIndices> dims;
+    for (int i = 0; i < NumIndices; ++i) {
+      dims[i] = dimensions[i];
     }
+    resize(dims);
+  }
 
-    EIGEN_DEVICE_FUNC
-    void resize()
-    {
-      EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE);
-      // Nothing to do: rank 0 tensors have fixed size
-    }
+  EIGEN_DEVICE_FUNC void resize() {
+    EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE);
+    // Nothing to do: rank 0 tensors have fixed size
+  }
 
-    template <typename FirstType, typename... OtherTypes>
-    EIGEN_DEVICE_FUNC
-    void resize(const Eigen::IndexList<FirstType, OtherTypes...>& dimensions) {
-      array<Index, NumIndices> dims;
-      for (int i = 0; i < NumIndices; ++i) {
-        dims[i] = static_cast<Index>(dimensions[i]);
-      }
-      resize(dims);
+  template <typename FirstType, typename... OtherTypes>
+  EIGEN_DEVICE_FUNC void resize(const Eigen::IndexList<FirstType, OtherTypes...>& dimensions) {
+    array<Index, NumIndices> dims;
+    for (int i = 0; i < NumIndices; ++i) {
+      dims[i] = static_cast<Index>(dimensions[i]);
     }
+    resize(dims);
+  }
 
-    /** Custom Dimension */
-    template<typename CustomDimension,
-             EIGEN_SFINAE_ENABLE_IF( !(isOfNormalIndex<CustomDimension>::value) )
-    >
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void resize(CustomDimension& dimensions)
-    {
-      resize(internal::customIndices2Array<Index,NumIndices>(dimensions));
-    }
+  /** Custom Dimension */
+  template <typename CustomDimension, EIGEN_SFINAE_ENABLE_IF(!(isOfNormalIndex<CustomDimension>::value))>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void resize(CustomDimension& dimensions) {
+    resize(internal::customIndices2Array<Index, NumIndices>(dimensions));
+  }
 
 #ifndef EIGEN_EMULATE_CXX11_META_H
-    template <typename std::ptrdiff_t... Indices>
-    EIGEN_DEVICE_FUNC
-    void resize(const Sizes<Indices...>& dimensions) {
-      array<Index, NumIndices> dims;
-      for (int i = 0; i < NumIndices; ++i) {
-        dims[i] = static_cast<Index>(dimensions[i]);
-      }
-      resize(dims);
+  template <typename std::ptrdiff_t... Indices>
+  EIGEN_DEVICE_FUNC void resize(const Sizes<Indices...>& dimensions) {
+    array<Index, NumIndices> dims;
+    for (int i = 0; i < NumIndices; ++i) {
+      dims[i] = static_cast<Index>(dimensions[i]);
     }
+    resize(dims);
+  }
 #else
-    template <std::size_t V1, std::size_t V2, std::size_t V3, std::size_t V4, std::size_t V5>
-    EIGEN_DEVICE_FUNC
-    void resize(const Sizes<V1, V2, V3, V4, V5>& dimensions) {
-      array<Index, NumIndices> dims;
-      for (int i = 0; i < NumIndices; ++i) {
-        dims[i] = static_cast<Index>(dimensions[i]);
-      }
-      resize(dims);
+  template <std::size_t V1, std::size_t V2, std::size_t V3, std::size_t V4, std::size_t V5>
+  EIGEN_DEVICE_FUNC void resize(const Sizes<V1, V2, V3, V4, V5>& dimensions) {
+    array<Index, NumIndices> dims;
+    for (int i = 0; i < NumIndices; ++i) {
+      dims[i] = static_cast<Index>(dimensions[i]);
     }
+    resize(dims);
+  }
 #endif
 
-    #ifdef EIGEN_TENSOR_PLUGIN
-    #include EIGEN_TENSOR_PLUGIN
-    #endif
+#ifdef EIGEN_TENSOR_PLUGIN
+#include EIGEN_TENSOR_PLUGIN
+#endif
 
-  protected:
+ protected:
+  bool checkIndexRange(const array<Index, NumIndices>& indices) const {
+    using internal::array_apply_and_reduce;
+    using internal::array_zip_and_reduce;
+    using internal::greater_equal_zero_op;
+    using internal::lesser_op;
+    using internal::logical_and_op;
 
-    bool checkIndexRange(const array<Index, NumIndices>& indices) const
-    {
-      using internal::array_apply_and_reduce;
-      using internal::array_zip_and_reduce;
-      using internal::greater_equal_zero_op;
-      using internal::logical_and_op;
-      using internal::lesser_op;
-
-      return
+    return
         // check whether the indices are all >= 0
         array_apply_and_reduce<logical_and_op, greater_equal_zero_op>(indices) &&
         // check whether the indices fit in the dimensions
         array_zip_and_reduce<logical_and_op, lesser_op>(indices, m_storage.dimensions());
-    }
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index linearizedIndex(const array<Index, NumIndices>& indices) const
-    {
-      if (Options&RowMajor) {
-        return m_storage.dimensions().IndexOfRowMajor(indices);
-      } else {
-        return m_storage.dimensions().IndexOfColMajor(indices);
-      }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index linearizedIndex(const array<Index, NumIndices>& indices) const {
+    if (Options & RowMajor) {
+      return m_storage.dimensions().IndexOfRowMajor(indices);
+    } else {
+      return m_storage.dimensions().IndexOfColMajor(indices);
     }
+  }
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_CXX11_TENSOR_TENSOR_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorArgMax.h b/unsupported/Eigen/CXX11/src/Tensor/TensorArgMax.h
index c6655ee..f272354 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorArgMax.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorArgMax.h
@@ -18,15 +18,14 @@
 namespace internal {
 
 /** \class TensorIndexPair
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Tensor + Index Pair class.
-  *
-  *
-  */
-template<typename XprType>
-struct traits<TensorIndexPairOp<XprType> > : public traits<XprType>
-{
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Tensor + Index Pair class.
+ *
+ *
+ */
+template <typename XprType>
+struct traits<TensorIndexPairOp<XprType>> : public traits<XprType> {
   typedef traits<XprType> XprTraits;
   typedef typename XprTraits::StorageKind StorageKind;
   typedef typename XprTraits::Index Index;
@@ -37,25 +36,21 @@
   static constexpr int Layout = XprTraits::Layout;
 };
 
-template<typename XprType>
-struct eval<TensorIndexPairOp<XprType>, Eigen::Dense>
-{
-  typedef const TensorIndexPairOp<XprType>EIGEN_DEVICE_REF type;
+template <typename XprType>
+struct eval<TensorIndexPairOp<XprType>, Eigen::Dense> {
+  typedef const TensorIndexPairOp<XprType> EIGEN_DEVICE_REF type;
 };
 
-template<typename XprType>
-struct nested<TensorIndexPairOp<XprType>, 1,
-              typename eval<TensorIndexPairOp<XprType> >::type>
-{
+template <typename XprType>
+struct nested<TensorIndexPairOp<XprType>, 1, typename eval<TensorIndexPairOp<XprType>>::type> {
   typedef TensorIndexPairOp<XprType> type;
 };
 
 }  // end namespace internal
 
-template<typename XprType>
-class TensorIndexPairOp : public TensorBase<TensorIndexPairOp<XprType>, ReadOnlyAccessors>
-{
-  public:
+template <typename XprType>
+class TensorIndexPairOp : public TensorBase<TensorIndexPairOp<XprType>, ReadOnlyAccessors> {
+ public:
   typedef typename Eigen::internal::traits<TensorIndexPairOp>::Scalar Scalar;
   typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
   typedef typename Eigen::internal::nested<TensorIndexPairOp>::type Nested;
@@ -63,21 +58,17 @@
   typedef typename Eigen::internal::traits<TensorIndexPairOp>::Index Index;
   typedef Pair<Index, typename XprType::CoeffReturnType> CoeffReturnType;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorIndexPairOp(const XprType& expr)
-      : m_xpr(expr) {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorIndexPairOp(const XprType& expr) : m_xpr(expr) {}
 
-  EIGEN_DEVICE_FUNC
-  const internal::remove_all_t<typename XprType::Nested>&
-  expression() const { return m_xpr; }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename XprType::Nested>& expression() const { return m_xpr; }
 
-  protected:
-    typename XprType::Nested m_xpr;
+ protected:
+  typename XprType::Nested m_xpr;
 };
 
 // Eval as rvalue
-template<typename ArgType, typename Device>
-struct TensorEvaluator<const TensorIndexPairOp<ArgType>, Device>
-{
+template <typename ArgType, typename Device>
+struct TensorEvaluator<const TensorIndexPairOp<ArgType>, Device> {
   typedef TensorIndexPairOp<ArgType> XprType;
   typedef typename XprType::Index Index;
   typedef typename XprType::Scalar Scalar;
@@ -102,28 +93,21 @@
   typedef internal::TensorBlockNotImplemented TensorBlock;
   //===--------------------------------------------------------------------===//
 
-  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
-      : m_impl(op.expression(), device) { }
+  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) : m_impl(op.expression(), device) {}
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const {
-    return m_impl.dimensions();
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_impl.dimensions(); }
 
   EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType /*data*/) {
     m_impl.evalSubExprsIfNeeded(NULL);
     return true;
   }
-  EIGEN_STRONG_INLINE void cleanup() {
-    m_impl.cleanup();
-  }
+  EIGEN_STRONG_INLINE void cleanup() { m_impl.cleanup(); }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
     return CoeffReturnType(index, m_impl.coeff(index));
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost
-  costPerCoeff(bool vectorized) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const {
     return m_impl.costPerCoeff(vectorized) + TensorOpCost(0, 0, 1);
   }
 
@@ -136,14 +120,13 @@
 namespace internal {
 
 /** \class TensorPairIndex
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Converts to Tensor<Pair<Index, Scalar> > and reduces to Tensor<Index>.
-  *
-  */
-template<typename ReduceOp, typename Dims, typename XprType>
-struct traits<TensorPairReducerOp<ReduceOp, Dims, XprType> > : public traits<XprType>
-{
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Converts to Tensor<Pair<Index, Scalar> > and reduces to Tensor<Index>.
+ *
+ */
+template <typename ReduceOp, typename Dims, typename XprType>
+struct traits<TensorPairReducerOp<ReduceOp, Dims, XprType>> : public traits<XprType> {
   typedef traits<XprType> XprTraits;
   typedef typename XprTraits::StorageKind StorageKind;
   typedef typename XprTraits::Index Index;
@@ -154,25 +137,22 @@
   static constexpr int Layout = XprTraits::Layout;
 };
 
-template<typename ReduceOp, typename Dims, typename XprType>
-struct eval<TensorPairReducerOp<ReduceOp, Dims, XprType>, Eigen::Dense>
-{
-  typedef const TensorPairReducerOp<ReduceOp, Dims, XprType>EIGEN_DEVICE_REF type;
+template <typename ReduceOp, typename Dims, typename XprType>
+struct eval<TensorPairReducerOp<ReduceOp, Dims, XprType>, Eigen::Dense> {
+  typedef const TensorPairReducerOp<ReduceOp, Dims, XprType> EIGEN_DEVICE_REF type;
 };
 
-template<typename ReduceOp, typename Dims, typename XprType>
+template <typename ReduceOp, typename Dims, typename XprType>
 struct nested<TensorPairReducerOp<ReduceOp, Dims, XprType>, 1,
-              typename eval<TensorPairReducerOp<ReduceOp, Dims, XprType> >::type>
-{
+              typename eval<TensorPairReducerOp<ReduceOp, Dims, XprType>>::type> {
   typedef TensorPairReducerOp<ReduceOp, Dims, XprType> type;
 };
 
 }  // end namespace internal
 
-template<typename ReduceOp, typename Dims, typename XprType>
-class TensorPairReducerOp : public TensorBase<TensorPairReducerOp<ReduceOp, Dims, XprType>, ReadOnlyAccessors>
-{
-  public:
+template <typename ReduceOp, typename Dims, typename XprType>
+class TensorPairReducerOp : public TensorBase<TensorPairReducerOp<ReduceOp, Dims, XprType>, ReadOnlyAccessors> {
+ public:
   typedef typename Eigen::internal::traits<TensorPairReducerOp>::Scalar Scalar;
   typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
   typedef typename Eigen::internal::nested<TensorPairReducerOp>::type Nested;
@@ -180,43 +160,36 @@
   typedef typename Eigen::internal::traits<TensorPairReducerOp>::Index Index;
   typedef Index CoeffReturnType;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorPairReducerOp(const XprType& expr,
-                                                          const ReduceOp& reduce_op,
-                                                          const Index return_dim,
-                                                          const Dims& reduce_dims)
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorPairReducerOp(const XprType& expr, const ReduceOp& reduce_op,
+                                                            const Index return_dim, const Dims& reduce_dims)
       : m_xpr(expr), m_reduce_op(reduce_op), m_return_dim(return_dim), m_reduce_dims(reduce_dims) {}
 
-  EIGEN_DEVICE_FUNC
-  const internal::remove_all_t<typename XprType::Nested>&
-  expression() const { return m_xpr; }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename XprType::Nested>& expression() const { return m_xpr; }
 
-  EIGEN_DEVICE_FUNC
-  const ReduceOp& reduce_op() const { return m_reduce_op; }
+  EIGEN_DEVICE_FUNC const ReduceOp& reduce_op() const { return m_reduce_op; }
 
-  EIGEN_DEVICE_FUNC
-  const Dims& reduce_dims() const { return m_reduce_dims; }
+  EIGEN_DEVICE_FUNC const Dims& reduce_dims() const { return m_reduce_dims; }
 
-  EIGEN_DEVICE_FUNC
-  Index return_dim() const { return m_return_dim; }
+  EIGEN_DEVICE_FUNC Index return_dim() const { return m_return_dim; }
 
-  protected:
-    typename XprType::Nested m_xpr;
-    const ReduceOp m_reduce_op;
-    const Index m_return_dim;
-    const Dims m_reduce_dims;
+ protected:
+  typename XprType::Nested m_xpr;
+  const ReduceOp m_reduce_op;
+  const Index m_return_dim;
+  const Dims m_reduce_dims;
 };
 
 // Eval as rvalue
-template<typename ReduceOp, typename Dims, typename ArgType, typename Device>
-struct TensorEvaluator<const TensorPairReducerOp<ReduceOp, Dims, ArgType>, Device>
-{
+template <typename ReduceOp, typename Dims, typename ArgType, typename Device>
+struct TensorEvaluator<const TensorPairReducerOp<ReduceOp, Dims, ArgType>, Device> {
   typedef TensorPairReducerOp<ReduceOp, Dims, ArgType> XprType;
   typedef typename XprType::Index Index;
   typedef typename XprType::Scalar Scalar;
   typedef typename XprType::CoeffReturnType CoeffReturnType;
   typedef typename TensorIndexPairOp<ArgType>::CoeffReturnType PairType;
-  typedef typename TensorEvaluator<const TensorReductionOp<ReduceOp, Dims, const TensorIndexPairOp<ArgType> >, Device>::Dimensions Dimensions;
-  typedef typename TensorEvaluator<const TensorIndexPairOp<ArgType> , Device>::Dimensions InputDimensions;
+  typedef typename TensorEvaluator<const TensorReductionOp<ReduceOp, Dims, const TensorIndexPairOp<ArgType>>,
+                                   Device>::Dimensions Dimensions;
+  typedef typename TensorEvaluator<const TensorIndexPairOp<ArgType>, Device>::Dimensions InputDimensions;
   static constexpr int NumDims = internal::array_size<InputDimensions>::value;
   typedef array<Index, NumDims> StrideDims;
   typedef StorageMemory<CoeffReturnType, Device> Storage;
@@ -224,14 +197,15 @@
   typedef StorageMemory<PairType, Device> PairStorageMem;
 
   enum {
-    IsAligned         = /*TensorEvaluator<ArgType, Device>::IsAligned*/ false,
-    PacketAccess      = /*TensorEvaluator<ArgType, Device>::PacketAccess*/ false,
-    BlockAccess       = false,
+    IsAligned = /*TensorEvaluator<ArgType, Device>::IsAligned*/ false,
+    PacketAccess = /*TensorEvaluator<ArgType, Device>::PacketAccess*/ false,
+    BlockAccess = false,
     PreferBlockAccess = TensorEvaluator<ArgType, Device>::PreferBlockAccess,
-    CoordAccess       = false,  // to be implemented
-    RawAccess         = false
+    CoordAccess = false,  // to be implemented
+    RawAccess = false
   };
-  static constexpr int Layout = TensorEvaluator<const TensorReductionOp<ReduceOp, Dims, const TensorIndexPairOp<ArgType>>, Device>::Layout;
+  static constexpr int Layout =
+      TensorEvaluator<const TensorReductionOp<ReduceOp, Dims, const TensorIndexPairOp<ArgType>>, Device>::Layout;
   //===- Tensor block evaluation strategy (see TensorBlock.h) -------------===//
   typedef internal::TensorBlockNotImplemented TensorBlock;
   //===--------------------------------------------------------------------===//
@@ -239,8 +213,7 @@
   EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
       : m_orig_impl(op.expression(), device),
         m_impl(op.expression().index_pairs().reduce(op.reduce_dims(), op.reduce_op()), device),
-        m_return_dim(op.return_dim())
-  {
+        m_return_dim(op.return_dim()) {
     gen_strides(m_orig_impl.dimensions(), m_strides);
     if (Layout == static_cast<int>(ColMajor)) {
       const Index total_size = internal::array_prod(m_orig_impl.dimensions());
@@ -248,24 +221,19 @@
     } else {
       const Index total_size = internal::array_prod(m_orig_impl.dimensions());
       m_stride_mod = (m_return_dim > 0) ? m_strides[m_return_dim - 1] : total_size;
-    }    
+    }
     // If m_return_dim is not a valid index, returns 1 or this can crash on Windows.
-    m_stride_div = ((m_return_dim >= 0) &&
-                    (m_return_dim < static_cast<Index>(m_strides.size())))
-                   ? m_strides[m_return_dim] : 1;
+    m_stride_div =
+        ((m_return_dim >= 0) && (m_return_dim < static_cast<Index>(m_strides.size()))) ? m_strides[m_return_dim] : 1;
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const {
-    return m_impl.dimensions();
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_impl.dimensions(); }
 
   EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType /*data*/) {
     m_impl.evalSubExprsIfNeeded(NULL);
     return true;
   }
-  EIGEN_STRONG_INLINE void cleanup() {
-    m_impl.cleanup();
-  }
+  EIGEN_STRONG_INLINE void cleanup() { m_impl.cleanup(); }
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
     const PairType v = m_impl.coeff(index);
@@ -274,12 +242,10 @@
 
   EIGEN_DEVICE_FUNC EvaluatorPointerType data() const { return NULL; }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost
-  costPerCoeff(bool vectorized) const {
-    const double compute_cost = 1.0 +
-        (m_return_dim < 0 ? 0.0 : (TensorOpCost::ModCost<Index>() + TensorOpCost::DivCost<Index>()));
-    return m_orig_impl.costPerCoeff(vectorized) +
-           m_impl.costPerCoeff(vectorized) + TensorOpCost(0, 0, compute_cost);
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const {
+    const double compute_cost =
+        1.0 + (m_return_dim < 0 ? 0.0 : (TensorOpCost::ModCost<Index>() + TensorOpCost::DivCost<Index>()));
+    return m_orig_impl.costPerCoeff(vectorized) + m_impl.costPerCoeff(vectorized) + TensorOpCost(0, 0, compute_cost);
   }
 
  private:
@@ -287,33 +253,32 @@
     if (m_return_dim < 0) {
       return;  // Won't be using the strides.
     }
-    eigen_assert(m_return_dim < NumDims &&
-                 "Asking to convert index to a dimension outside of the rank");
+    eigen_assert(m_return_dim < NumDims && "Asking to convert index to a dimension outside of the rank");
 
     // Calculate m_stride_div and m_stride_mod, which are used to
     // calculate the value of an index w.r.t. the m_return_dim.
     if (Layout == static_cast<int>(ColMajor)) {
       strides[0] = 1;
       for (int i = 1; i < NumDims; ++i) {
-        strides[i] = strides[i-1] * dims[i-1];
+        strides[i] = strides[i - 1] * dims[i - 1];
       }
     } else {
-      strides[NumDims-1] = 1;
+      strides[NumDims - 1] = 1;
       for (int i = NumDims - 2; i >= 0; --i) {
-        strides[i] = strides[i+1] * dims[i+1];
+        strides[i] = strides[i + 1] * dims[i + 1];
       }
     }
   }
 
  protected:
   TensorEvaluator<const TensorIndexPairOp<ArgType>, Device> m_orig_impl;
-  TensorEvaluator<const TensorReductionOp<ReduceOp, Dims, const TensorIndexPairOp<ArgType> >, Device> m_impl;
+  TensorEvaluator<const TensorReductionOp<ReduceOp, Dims, const TensorIndexPairOp<ArgType>>, Device> m_impl;
   const Index m_return_dim;
   StrideDims m_strides;
   Index m_stride_mod;
   Index m_stride_div;
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_CXX11_TENSOR_TENSOR_ARG_MAX_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_ARG_MAX_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorAssign.h b/unsupported/Eigen/CXX11/src/Tensor/TensorAssign.h
index 4cc0593..8a57576 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorAssign.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorAssign.h
@@ -16,21 +16,20 @@
 namespace Eigen {
 
 /** \class TensorAssign
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief The tensor assignment class.
-  *
-  * This class is represents the assignment of the values resulting from the evaluation of
-  * the rhs expression to the memory locations denoted by the lhs expression.
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief The tensor assignment class.
+ *
+ * This class is represents the assignment of the values resulting from the evaluation of
+ * the rhs expression to the memory locations denoted by the lhs expression.
+ */
 namespace internal {
-template<typename LhsXprType, typename RhsXprType>
-struct traits<TensorAssignOp<LhsXprType, RhsXprType> >
-{
+template <typename LhsXprType, typename RhsXprType>
+struct traits<TensorAssignOp<LhsXprType, RhsXprType> > {
   typedef typename LhsXprType::Scalar Scalar;
   typedef typename traits<LhsXprType>::StorageKind StorageKind;
-  typedef typename promote_index_type<typename traits<LhsXprType>::Index,
-                                      typename traits<RhsXprType>::Index>::type Index;
+  typedef
+      typename promote_index_type<typename traits<LhsXprType>::Index, typename traits<RhsXprType>::Index>::type Index;
   typedef typename LhsXprType::Nested LhsNested;
   typedef typename RhsXprType::Nested RhsNested;
   typedef std::remove_reference_t<LhsNested> LhsNested_;
@@ -39,31 +38,24 @@
   static constexpr int Layout = internal::traits<LhsXprType>::Layout;
   typedef typename traits<LhsXprType>::PointerType PointerType;
 
-  enum {
-    Flags = 0
-  };
+  enum { Flags = 0 };
 };
 
-template<typename LhsXprType, typename RhsXprType>
-struct eval<TensorAssignOp<LhsXprType, RhsXprType>, Eigen::Dense>
-{
+template <typename LhsXprType, typename RhsXprType>
+struct eval<TensorAssignOp<LhsXprType, RhsXprType>, Eigen::Dense> {
   typedef const TensorAssignOp<LhsXprType, RhsXprType>& type;
 };
 
-template<typename LhsXprType, typename RhsXprType>
-struct nested<TensorAssignOp<LhsXprType, RhsXprType>, 1, typename eval<TensorAssignOp<LhsXprType, RhsXprType> >::type>
-{
+template <typename LhsXprType, typename RhsXprType>
+struct nested<TensorAssignOp<LhsXprType, RhsXprType>, 1, typename eval<TensorAssignOp<LhsXprType, RhsXprType> >::type> {
   typedef TensorAssignOp<LhsXprType, RhsXprType> type;
 };
 
 }  // end namespace internal
 
-
-
-template<typename LhsXprType, typename RhsXprType>
-class TensorAssignOp : public TensorBase<TensorAssignOp<LhsXprType, RhsXprType> >
-{
-  public:
+template <typename LhsXprType, typename RhsXprType>
+class TensorAssignOp : public TensorBase<TensorAssignOp<LhsXprType, RhsXprType> > {
+ public:
   typedef typename Eigen::internal::traits<TensorAssignOp>::Scalar Scalar;
   typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
   typedef typename LhsXprType::CoeffReturnType CoeffReturnType;
@@ -76,24 +68,22 @@
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorAssignOp(LhsXprType& lhs, const RhsXprType& rhs)
       : m_lhs_xpr(lhs), m_rhs_xpr(rhs) {}
 
-    /** \returns the nested expressions */
-    EIGEN_DEVICE_FUNC
-    internal::remove_all_t<typename LhsXprType::Nested>&
-    lhsExpression() const { return *((internal::remove_all_t<typename LhsXprType::Nested>*)&m_lhs_xpr); }
+  /** \returns the nested expressions */
+  EIGEN_DEVICE_FUNC internal::remove_all_t<typename LhsXprType::Nested>& lhsExpression() const {
+    return *((internal::remove_all_t<typename LhsXprType::Nested>*)&m_lhs_xpr);
+  }
 
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<typename RhsXprType::Nested>&
-    rhsExpression() const { return m_rhs_xpr; }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename RhsXprType::Nested>& rhsExpression() const {
+    return m_rhs_xpr;
+  }
 
-  protected:
-    internal::remove_all_t<typename LhsXprType::Nested>& m_lhs_xpr;
-    const internal::remove_all_t<typename RhsXprType::Nested>& m_rhs_xpr;
+ protected:
+  internal::remove_all_t<typename LhsXprType::Nested>& m_lhs_xpr;
+  const internal::remove_all_t<typename RhsXprType::Nested>& m_rhs_xpr;
 };
 
-
-template<typename LeftArgType, typename RightArgType, typename Device>
-struct TensorEvaluator<const TensorAssignOp<LeftArgType, RightArgType>, Device>
-{
+template <typename LeftArgType, typename RightArgType, typename Device>
+struct TensorEvaluator<const TensorAssignOp<LeftArgType, RightArgType>, Device> {
   typedef TensorAssignOp<LeftArgType, RightArgType> XprType;
   typedef typename XprType::Index Index;
   typedef typename XprType::Scalar Scalar;
@@ -108,37 +98,32 @@
   static constexpr int Layout = TensorEvaluator<LeftArgType, Device>::Layout;
 
   enum {
-    IsAligned         = int(TensorEvaluator<LeftArgType, Device>::IsAligned) &
-                        int(TensorEvaluator<RightArgType, Device>::IsAligned),
-    PacketAccess      = int(TensorEvaluator<LeftArgType, Device>::PacketAccess) &
-                        int(TensorEvaluator<RightArgType, Device>::PacketAccess),
-    BlockAccess       = int(TensorEvaluator<LeftArgType, Device>::BlockAccess) &
-                        int(TensorEvaluator<RightArgType, Device>::BlockAccess),
+    IsAligned =
+        int(TensorEvaluator<LeftArgType, Device>::IsAligned) & int(TensorEvaluator<RightArgType, Device>::IsAligned),
+    PacketAccess = int(TensorEvaluator<LeftArgType, Device>::PacketAccess) &
+                   int(TensorEvaluator<RightArgType, Device>::PacketAccess),
+    BlockAccess = int(TensorEvaluator<LeftArgType, Device>::BlockAccess) &
+                  int(TensorEvaluator<RightArgType, Device>::BlockAccess),
     PreferBlockAccess = int(TensorEvaluator<LeftArgType, Device>::PreferBlockAccess) |
                         int(TensorEvaluator<RightArgType, Device>::PreferBlockAccess),
-    RawAccess         = TensorEvaluator<LeftArgType, Device>::RawAccess
+    RawAccess = TensorEvaluator<LeftArgType, Device>::RawAccess
   };
 
   //===- Tensor block evaluation strategy (see TensorBlock.h) -------------===//
   typedef internal::TensorBlockDescriptor<NumDims, Index> TensorBlockDesc;
   typedef internal::TensorBlockScratchAllocator<Device> TensorBlockScratch;
 
-  typedef typename TensorEvaluator<const RightArgType, Device>::TensorBlock
-      RightTensorBlock;
+  typedef typename TensorEvaluator<const RightArgType, Device>::TensorBlock RightTensorBlock;
   //===--------------------------------------------------------------------===//
 
-  TensorEvaluator(const XprType& op, const Device& device) :
-      m_leftImpl(op.lhsExpression(), device),
-      m_rightImpl(op.rhsExpression(), device)
-  {
-    EIGEN_STATIC_ASSERT(
-        (static_cast<int>(TensorEvaluator<LeftArgType, Device>::Layout) ==
-         static_cast<int>(TensorEvaluator<RightArgType, Device>::Layout)),
-        YOU_MADE_A_PROGRAMMING_MISTAKE);
+  TensorEvaluator(const XprType& op, const Device& device)
+      : m_leftImpl(op.lhsExpression(), device), m_rightImpl(op.rhsExpression(), device) {
+    EIGEN_STATIC_ASSERT((static_cast<int>(TensorEvaluator<LeftArgType, Device>::Layout) ==
+                         static_cast<int>(TensorEvaluator<RightArgType, Device>::Layout)),
+                        YOU_MADE_A_PROGRAMMING_MISTAKE);
   }
 
-  EIGEN_DEVICE_FUNC const Dimensions& dimensions() const
-  {
+  EIGEN_DEVICE_FUNC const Dimensions& dimensions() const {
     // The dimensions of the lhs and the rhs tensors should be equal to prevent
     // overflows and ensure the result is fully initialized.
     // TODO: use left impl instead if right impl dimensions are known at compile time.
@@ -157,11 +142,9 @@
 
 #ifdef EIGEN_USE_THREADS
   template <typename EvalSubExprsCallback>
-  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(
-      EvaluatorPointerType, EvalSubExprsCallback done) {
+  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(EvaluatorPointerType, EvalSubExprsCallback done) {
     m_leftImpl.evalSubExprsIfNeededAsync(nullptr, [this, done](bool) {
-      m_rightImpl.evalSubExprsIfNeededAsync(
-          m_leftImpl.data(), [done](bool need_assign) { done(need_assign); });
+      m_rightImpl.evalSubExprsIfNeededAsync(m_leftImpl.data(), [done](bool need_assign) { done(need_assign); });
     });
   }
 #endif  // EIGEN_USE_THREADS
@@ -175,45 +158,34 @@
     m_leftImpl.coeffRef(i) = m_rightImpl.coeff(i);
   }
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalPacket(Index i) const {
-
     const int LhsStoreMode = TensorEvaluator<LeftArgType, Device>::IsAligned ? Aligned : Unaligned;
     const int RhsLoadMode = TensorEvaluator<RightArgType, Device>::IsAligned ? Aligned : Unaligned;
     m_leftImpl.template writePacket<LhsStoreMode>(i, m_rightImpl.template packet<RhsLoadMode>(i));
   }
-  EIGEN_DEVICE_FUNC CoeffReturnType coeff(Index index) const
-  {
-    return m_leftImpl.coeff(index);
-  }
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC PacketReturnType packet(Index index) const
-  {
+  EIGEN_DEVICE_FUNC CoeffReturnType coeff(Index index) const { return m_leftImpl.coeff(index); }
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC PacketReturnType packet(Index index) const {
     return m_leftImpl.template packet<LoadMode>(index);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost
-  costPerCoeff(bool vectorized) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const {
     // We assume that evalPacket or evalScalar is called to perform the
     // assignment and account for the cost of the write here, but reduce left
     // cost by one load because we are using m_leftImpl.coeffRef.
     TensorOpCost left = m_leftImpl.costPerCoeff(vectorized);
     return m_rightImpl.costPerCoeff(vectorized) +
-           TensorOpCost(
-               numext::maxi(0.0, left.bytes_loaded() - sizeof(CoeffReturnType)),
-               left.bytes_stored(), left.compute_cycles()) +
+           TensorOpCost(numext::maxi(0.0, left.bytes_loaded() - sizeof(CoeffReturnType)), left.bytes_stored(),
+                        left.compute_cycles()) +
            TensorOpCost(0, sizeof(CoeffReturnType), 0, vectorized, PacketSize);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  internal::TensorBlockResourceRequirements getResourceRequirements() const {
-    return internal::TensorBlockResourceRequirements::merge(
-        m_leftImpl.getResourceRequirements(),
-        m_rightImpl.getResourceRequirements());
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE internal::TensorBlockResourceRequirements getResourceRequirements() const {
+    return internal::TensorBlockResourceRequirements::merge(m_leftImpl.getResourceRequirements(),
+                                                            m_rightImpl.getResourceRequirements());
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalBlock(
-      TensorBlockDesc& desc, TensorBlockScratch& scratch) {
-    if (TensorEvaluator<LeftArgType, Device>::RawAccess &&
-        m_leftImpl.data() != NULL) {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalBlock(TensorBlockDesc& desc, TensorBlockScratch& scratch) {
+    if (TensorEvaluator<LeftArgType, Device>::RawAccess && m_leftImpl.data() != NULL) {
       // If destination has raw data access, we pass it as a potential
       // destination for a block descriptor evaluation.
       desc.template AddDestinationBuffer<Layout>(
@@ -236,7 +208,6 @@
   TensorEvaluator<RightArgType, Device> m_rightImpl;
 };
 
-}
+}  // namespace Eigen
 
-
-#endif // EIGEN_CXX11_TENSOR_TENSOR_ASSIGN_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_ASSIGN_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorBlock.h b/unsupported/Eigen/CXX11/src/Tensor/TensorBlock.h
index 4087a8b..0b068a7 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorBlock.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorBlock.h
@@ -26,8 +26,7 @@
 // TODO(ezhulenev): We compute strides 1000 times in different evaluators, use
 // this function instead everywhere.
 template <int Layout, typename IndexType, int NumDims>
-EIGEN_ALWAYS_INLINE DSizes<IndexType, NumDims> strides(
-    const DSizes<IndexType, NumDims>& dimensions) {
+EIGEN_ALWAYS_INLINE DSizes<IndexType, NumDims> strides(const DSizes<IndexType, NumDims>& dimensions) {
   DSizes<IndexType, NumDims> strides;
   if (NumDims == 0) return strides;
 
@@ -49,14 +48,12 @@
 }
 
 template <int Layout, typename IndexType, size_t NumDims>
-EIGEN_ALWAYS_INLINE DSizes<IndexType, NumDims> strides(
-    const Eigen::array<IndexType, NumDims>& dimensions) {
+EIGEN_ALWAYS_INLINE DSizes<IndexType, NumDims> strides(const Eigen::array<IndexType, NumDims>& dimensions) {
   return strides<Layout>(DSizes<IndexType, NumDims>(dimensions));
 }
 
 template <int Layout, std::ptrdiff_t... Indices>
-EIGEN_STRONG_INLINE DSizes<std::ptrdiff_t, sizeof...(Indices)> strides(
-    const Sizes<Indices...>& sizes) {
+EIGEN_STRONG_INLINE DSizes<std::ptrdiff_t, sizeof...(Indices)> strides(const Sizes<Indices...>& sizes) {
   return strides<Layout>(DSizes<std::ptrdiff_t, sizeof...(Indices)>(sizes));
 }
 
@@ -84,24 +81,20 @@
   // For HIPCC, we need to explicitly declare as a "device fun", the constructor
   // which is implicitly invoked in the "merge" / "any" routines. else HIPCC
   // errors out complaining about the lack of a matching constructor
-  EIGEN_DEVICE_FUNC
-  TensorBlockResourceRequirements(TensorBlockShapeType shape_type_, size_t size_,
-				  TensorOpCost cost_)
-    : shape_type(shape_type_), size(size_), cost_per_coeff(cost_)
-  {}
+  EIGEN_DEVICE_FUNC TensorBlockResourceRequirements(TensorBlockShapeType shape_type_, size_t size_, TensorOpCost cost_)
+      : shape_type(shape_type_), size(size_), cost_per_coeff(cost_) {}
 #endif
 
   template <typename Scalar>
-  EIGEN_DEVICE_FUNC static TensorBlockResourceRequirements withShapeAndSize(
-      TensorBlockShapeType shape_type, size_t size_in_bytes,
-      TensorOpCost cost) {
+  EIGEN_DEVICE_FUNC static TensorBlockResourceRequirements withShapeAndSize(TensorBlockShapeType shape_type,
+                                                                            size_t size_in_bytes, TensorOpCost cost) {
     const size_t size = numext::maxi(size_t(1), size_in_bytes / sizeof(Scalar));
     return {shape_type, size, cost};
   }
 
   template <typename Scalar>
-  EIGEN_DEVICE_FUNC static TensorBlockResourceRequirements withShapeAndSize(
-      TensorBlockShapeType shape_type, size_t size_in_bytes) {
+  EIGEN_DEVICE_FUNC static TensorBlockResourceRequirements withShapeAndSize(TensorBlockShapeType shape_type,
+                                                                            size_t size_in_bytes) {
     // This default cost per coefficient is valid for most materialized tensor
     // block evaluation implementations, because they typically just read
     // coefficients from the underlying tensor storage, and write to the tensor
@@ -123,30 +116,23 @@
   }
 
   template <typename Scalar>
-  EIGEN_DEVICE_FUNC static TensorBlockResourceRequirements skewed(
-      size_t size_in_bytes) {
-    return withShapeAndSize<Scalar>(TensorBlockShapeType::kSkewedInnerDims,
-                                    size_in_bytes);
+  EIGEN_DEVICE_FUNC static TensorBlockResourceRequirements skewed(size_t size_in_bytes) {
+    return withShapeAndSize<Scalar>(TensorBlockShapeType::kSkewedInnerDims, size_in_bytes);
   }
 
   template <typename Scalar>
-  EIGEN_DEVICE_FUNC static TensorBlockResourceRequirements uniform(
-      size_t size_in_bytes) {
-    return withShapeAndSize<Scalar>(TensorBlockShapeType::kUniformAllDims,
-                                    size_in_bytes);
+  EIGEN_DEVICE_FUNC static TensorBlockResourceRequirements uniform(size_t size_in_bytes) {
+    return withShapeAndSize<Scalar>(TensorBlockShapeType::kUniformAllDims, size_in_bytes);
   }
 
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE TensorBlockResourceRequirements
-  merge(const TensorBlockResourceRequirements& lhs,
-        const TensorBlockResourceRequirements& rhs) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE TensorBlockResourceRequirements
+  merge(const TensorBlockResourceRequirements& lhs, const TensorBlockResourceRequirements& rhs) {
     return {merge(lhs.shape_type, rhs.shape_type),           // shape_type
             merge(lhs.size, rhs.size),                       // size
             merge(lhs.cost_per_coeff, rhs.cost_per_coeff)};  // cost_per_coeff
   }
 
-  EIGEN_DEVICE_FUNC TensorBlockResourceRequirements& addCostPerCoeff(
-      TensorOpCost cost) {
+  EIGEN_DEVICE_FUNC TensorBlockResourceRequirements& addCostPerCoeff(TensorOpCost cost) {
     cost_per_coeff += cost;
     return *this;
   }
@@ -154,31 +140,25 @@
   // This is a resource requirement that should be returned from expressions
   // that do not have any block evaluation preference (e.g. default tensor
   // expression with raw buffer access).
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE TensorBlockResourceRequirements any() {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE TensorBlockResourceRequirements any() {
     return {TensorBlockShapeType::kUniformAllDims, 1, {0, 0, 0}};
   }
 
  private:
   using Requirements = TensorBlockResourceRequirements;
 
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE size_t merge(size_t lhs_size, size_t rhs_size) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE size_t merge(size_t lhs_size, size_t rhs_size) {
     return numext::maxi(lhs_size, rhs_size);
   }
 
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE TensorBlockShapeType
-  merge(TensorBlockShapeType lhs, TensorBlockShapeType rhs) {
-    return (lhs == TensorBlockShapeType::kSkewedInnerDims ||
-            rhs == TensorBlockShapeType::kSkewedInnerDims)
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE TensorBlockShapeType merge(TensorBlockShapeType lhs,
+                                                                          TensorBlockShapeType rhs) {
+    return (lhs == TensorBlockShapeType::kSkewedInnerDims || rhs == TensorBlockShapeType::kSkewedInnerDims)
                ? TensorBlockShapeType::kSkewedInnerDims
                : TensorBlockShapeType::kUniformAllDims;
   }
 
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE TensorOpCost merge(TensorOpCost lhs_cost,
-                                                TensorOpCost rhs_cost) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE TensorOpCost merge(TensorOpCost lhs_cost, TensorOpCost rhs_cost) {
     return lhs_cost + rhs_cost;
   }
 };
@@ -250,22 +230,16 @@
     DestinationBuffer() : m_data(NULL), m_data_type_size(0), m_kind(kEmpty) {}
 
     template <typename Scalar>
-    DestinationBuffer(Scalar* data, const Dimensions& strides,
-                      DestinationBufferKind kind)
-        : m_data(static_cast<void*>(data)),
-          m_data_type_size(sizeof(Scalar)),
-          m_strides(strides),
-          m_kind(kind) {}
+    DestinationBuffer(Scalar* data, const Dimensions& strides, DestinationBufferKind kind)
+        : m_data(static_cast<void*>(data)), m_data_type_size(sizeof(Scalar)), m_strides(strides), m_kind(kind) {}
 
     template <int Layout, typename Scalar>
-    static DestinationBuffer make(const TensorBlockDescriptor& desc,
-                                  Scalar* data, const Dimensions& strides) {
+    static DestinationBuffer make(const TensorBlockDescriptor& desc, Scalar* data, const Dimensions& strides) {
       return DestinationBuffer(data, strides, kind<Layout>(desc, strides));
     }
 
     template <int Layout>
-    static DestinationBufferKind kind(const TensorBlockDescriptor& desc,
-                                      const Dimensions& strides) {
+    static DestinationBufferKind kind(const TensorBlockDescriptor& desc, const Dimensions& strides) {
       const Dimensions& desc_dims = desc.dimensions();
       const Dimensions& desc_strides = internal::strides<Layout>(desc_dims);
       for (int i = 0; i < NumDims; ++i) {
@@ -287,16 +261,11 @@
     DestinationBufferKind m_kind;
   };
 
-  TensorBlockDescriptor(const IndexType offset, const Dimensions& dimensions,
-                        const DestinationBuffer& destination)
-      : m_offset(offset),
-        m_dimensions(dimensions),
-        m_destination(destination) {}
+  TensorBlockDescriptor(const IndexType offset, const Dimensions& dimensions, const DestinationBuffer& destination)
+      : m_offset(offset), m_dimensions(dimensions), m_destination(destination) {}
 
   TensorBlockDescriptor(const IndexType offset, const Dimensions& dimensions)
-      : m_offset(offset),
-        m_dimensions(dimensions),
-        m_destination(DestinationBuffer()) {}
+      : m_offset(offset), m_dimensions(dimensions), m_destination(DestinationBuffer()) {}
 
   IndexType offset() const { return m_offset; }
   const Dimensions& dimensions() const { return m_dimensions; }
@@ -308,14 +277,11 @@
   template <int Layout, typename Scalar>
   void AddDestinationBuffer(Scalar* dst_base, const Dimensions& dst_strides) {
     eigen_assert(dst_base != NULL);
-    m_destination =
-        DestinationBuffer::template make<Layout>(*this, dst_base, dst_strides);
+    m_destination = DestinationBuffer::template make<Layout>(*this, dst_base, dst_strides);
   }
 
   template <int Layout, typename Scalar, typename DstStridesIndexType>
-  void AddDestinationBuffer(
-      Scalar* dst_base,
-      const DSizes<DstStridesIndexType, NumDims>& dst_strides) {
+  void AddDestinationBuffer(Scalar* dst_base, const DSizes<DstStridesIndexType, NumDims>& dst_strides) {
     // DSizes constructor will do index type promotion if it's safe.
     AddDestinationBuffer<Layout>(dst_base, Dimensions(dst_strides));
   }
@@ -326,9 +292,7 @@
     return *this;
   }
 
-  bool HasDestinationBuffer() const {
-    return m_destination.kind() != DestinationBuffer::kEmpty;
-  }
+  bool HasDestinationBuffer() const { return m_destination.kind() != DestinationBuffer::kEmpty; }
 
   // Returns a copy of `*this` with updated offset.
   TensorBlockDescriptor WithOffset(IndexType offset) const {
@@ -354,28 +318,21 @@
   typedef DSizes<IndexType, NumDims> Dimensions;
 
   TensorBlockMapper() = default;
-  TensorBlockMapper(const DSizes<IndexType, NumDims>& dimensions,
-                    const TensorBlockResourceRequirements& requirements)
+  TensorBlockMapper(const DSizes<IndexType, NumDims>& dimensions, const TensorBlockResourceRequirements& requirements)
       : m_tensor_dimensions(dimensions), m_requirements(requirements) {
     // Compute block dimensions and the total number of blocks.
     InitializeBlockDimensions();
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE IndexType blockCount() const {
-    return m_total_block_count;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE IndexType blockCount() const { return m_total_block_count; }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE IndexType blockTotalSize() const {
-    return m_block_dimensions.TotalSize();
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE IndexType blockTotalSize() const { return m_block_dimensions.TotalSize(); }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const DSizes<IndexType, NumDims>&
-  blockDimensions() const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const DSizes<IndexType, NumDims>& blockDimensions() const {
     return m_block_dimensions;
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE BlockDescriptor
-  blockDescriptor(IndexType block_index) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE BlockDescriptor blockDescriptor(IndexType block_index) const {
     static const bool isColMajor = Layout == static_cast<int>(ColMajor);
 
     IndexType offset = 0;
@@ -391,8 +348,7 @@
       block_index -= idx * m_block_strides[dim];
 
       const IndexType coord = idx * m_block_dimensions[dim];
-      dimensions[dim] = numext::mini(m_tensor_dimensions[dim] - coord,
-                                     m_block_dimensions[dim]);
+      dimensions[dim] = numext::mini(m_tensor_dimensions[dim] - coord, m_block_dimensions[dim]);
       offset += coord * m_tensor_strides[dim];
     }
 
@@ -403,8 +359,7 @@
   void InitializeBlockDimensions() {
     // Requested block shape and size.
     const TensorBlockShapeType shape_type = m_requirements.shape_type;
-    IndexType target_block_size =
-        numext::maxi<IndexType>(1, static_cast<IndexType>(m_requirements.size));
+    IndexType target_block_size = numext::maxi<IndexType>(1, static_cast<IndexType>(m_requirements.size));
 
     IndexType tensor_size = m_tensor_dimensions.TotalSize();
 
@@ -441,11 +396,9 @@
 
       for (int i = 0; i < NumDims; ++i) {
         const int dim = isColMajor ? i : NumDims - i - 1;
-        m_block_dimensions[dim] =
-            numext::mini(coeff_to_allocate, m_tensor_dimensions[dim]);
-        coeff_to_allocate = numext::div_ceil(
-            coeff_to_allocate,
-            numext::maxi(static_cast<IndexType>(1), m_block_dimensions[dim]));
+        m_block_dimensions[dim] = numext::mini(coeff_to_allocate, m_tensor_dimensions[dim]);
+        coeff_to_allocate =
+            numext::div_ceil(coeff_to_allocate, numext::maxi(static_cast<IndexType>(1), m_block_dimensions[dim]));
       }
       eigen_assert(coeff_to_allocate == 1);
 
@@ -453,16 +406,14 @@
       // Tensor will not fit within 'target_block_size' budget: calculate tensor
       // block dimension sizes based on "square" dimension size target.
       const IndexType dim_size_target = convert_index<IndexType>(
-          std::pow(static_cast<float>(target_block_size),
-                   1.0f / static_cast<float>(m_block_dimensions.rank())));
+          std::pow(static_cast<float>(target_block_size), 1.0f / static_cast<float>(m_block_dimensions.rank())));
 
       for (int i = 0; i < NumDims; ++i) {
         // TODO(andydavis) Adjust the inner most 'block_dim_size' to make it
         // a multiple of the packet size. Note that reducing
         // 'block_dim_size' in this manner can increase the number of
         // blocks, and so will amplify any per-block overhead.
-        m_block_dimensions[i] =
-            numext::mini(dim_size_target, m_tensor_dimensions[i]);
+        m_block_dimensions[i] = numext::mini(dim_size_target, m_tensor_dimensions[i]);
       }
 
       // Add any un-allocated coefficients to inner dimension(s).
@@ -471,16 +422,13 @@
         const int dim = isColMajor ? i : NumDims - i - 1;
 
         if (m_block_dimensions[dim] < m_tensor_dimensions[dim]) {
-          const IndexType total_size_other_dims =
-              total_size / m_block_dimensions[dim];
-          const IndexType alloc_avail =
-              numext::div_ceil<IndexType>(target_block_size, total_size_other_dims);
+          const IndexType total_size_other_dims = total_size / m_block_dimensions[dim];
+          const IndexType alloc_avail = numext::div_ceil<IndexType>(target_block_size, total_size_other_dims);
           if (alloc_avail == m_block_dimensions[dim]) {
             // Insufficient excess coefficients to allocate.
             break;
           }
-          m_block_dimensions[dim] =
-              numext::mini(m_tensor_dimensions[dim], alloc_avail);
+          m_block_dimensions[dim] = numext::mini(m_tensor_dimensions[dim], alloc_avail);
           total_size = total_size_other_dims * m_block_dimensions[dim];
         }
       }
@@ -490,8 +438,7 @@
     }
 
     eigen_assert(m_block_dimensions.TotalSize() >=
-                 numext::mini<IndexType>(target_block_size,
-                                         m_tensor_dimensions.TotalSize()));
+                 numext::mini<IndexType>(target_block_size, m_tensor_dimensions.TotalSize()));
 
     // Calculate block counts by dimension and total block count.
     DSizes<IndexType, NumDims> block_count;
@@ -527,8 +474,7 @@
 template <typename Device>
 class TensorBlockScratchAllocator {
  public:
-  explicit TensorBlockScratchAllocator(const Device& device)
-      : m_device(device), m_allocation_index(0) {}
+  explicit TensorBlockScratchAllocator(const Device& device) : m_device(device), m_allocation_index(0) {}
 
   ~TensorBlockScratchAllocator() {
     for (size_t i = 0; i < m_allocations.size(); ++i) {
@@ -654,20 +600,15 @@
 // be invalid, and should never be used in block assignment or any other tensor
 // expression.
 
-template <typename Scalar, int NumDims, int Layout,
-          typename IndexType = Eigen::Index>
+template <typename Scalar, int NumDims, int Layout, typename IndexType = Eigen::Index>
 class TensorMaterializedBlock {
  public:
   typedef DSizes<IndexType, NumDims> Dimensions;
   typedef TensorMap<const Tensor<Scalar, NumDims, Layout> > XprType;
 
-  TensorMaterializedBlock(TensorBlockKind kind, const Scalar* data,
-                          const Dimensions& dimensions, bool valid_expr = true)
-      : m_kind(kind),
-        m_data(data),
-        m_dimensions(dimensions),
-        m_expr(m_data, m_dimensions),
-        m_valid_expr(valid_expr) {
+  TensorMaterializedBlock(TensorBlockKind kind, const Scalar* data, const Dimensions& dimensions,
+                          bool valid_expr = true)
+      : m_kind(kind), m_data(data), m_dimensions(dimensions), m_expr(m_data, m_dimensions), m_valid_expr(valid_expr) {
     eigen_assert(m_kind == internal::TensorBlockKind::kView ||
                  m_kind == internal::TensorBlockKind::kMaterializedInScratch ||
                  m_kind == internal::TensorBlockKind::kMaterializedInOutput);
@@ -701,18 +642,15 @@
     const Dimensions& strides() const { return m_strides; }
 
     TensorMaterializedBlock AsTensorMaterializedBlock() const {
-      return TensorMaterializedBlock(
-          m_materialized_in_output
-              ? internal::TensorBlockKind::kMaterializedInOutput
-              : internal::TensorBlockKind::kMaterializedInScratch,
-          m_data, m_dimensions, !m_strided_storage);
+      return TensorMaterializedBlock(m_materialized_in_output ? internal::TensorBlockKind::kMaterializedInOutput
+                                                              : internal::TensorBlockKind::kMaterializedInScratch,
+                                     m_data, m_dimensions, !m_strided_storage);
     }
 
    private:
     friend class TensorMaterializedBlock<Scalar, NumDims, Layout, IndexType>;
 
-    Storage(Scalar* data, const Dimensions& dimensions,
-            const Dimensions& strides, bool materialized_in_output,
+    Storage(Scalar* data, const Dimensions& dimensions, const Dimensions& strides, bool materialized_in_output,
             bool strided_storage)
         : m_data(data),
           m_dimensions(dimensions),
@@ -730,22 +668,19 @@
   // Creates a storage for materialized block either from the block descriptor
   // destination buffer, or allocates a new buffer with scratch allocator.
   template <typename TensorBlockScratch>
-  EIGEN_STRONG_INLINE static Storage prepareStorage(
-      TensorBlockDesc& desc, TensorBlockScratch& scratch,
-      bool allow_strided_storage = false) {
+  EIGEN_STRONG_INLINE static Storage prepareStorage(TensorBlockDesc& desc, TensorBlockScratch& scratch,
+                                                    bool allow_strided_storage = false) {
     // Try to reuse destination as an output block buffer.
     typedef typename TensorBlockDesc::DestinationBuffer DestinationBuffer;
 
     if (desc.destination().kind() == DestinationBuffer::kContiguous) {
       Scalar* buffer = desc.destination().template data<Scalar>();
       desc.DropDestinationBuffer();
-      return Storage(buffer, desc.dimensions(),
-                     internal::strides<Layout>(desc.dimensions()),
+      return Storage(buffer, desc.dimensions(), internal::strides<Layout>(desc.dimensions()),
                      /*materialized_in_output=*/true,
                      /*strided_storage=*/false);
 
-    } else if (desc.destination().kind() == DestinationBuffer::kStrided &&
-               allow_strided_storage) {
+    } else if (desc.destination().kind() == DestinationBuffer::kStrided && allow_strided_storage) {
       Scalar* buffer = desc.destination().template data<Scalar>();
       desc.DropDestinationBuffer();
       return Storage(buffer, desc.dimensions(), desc.destination().strides(),
@@ -753,8 +688,7 @@
 
     } else {
       void* mem = scratch.allocate(desc.size() * sizeof(Scalar));
-      return Storage(static_cast<Scalar*>(mem), desc.dimensions(),
-                     internal::strides<Layout>(desc.dimensions()),
+      return Storage(static_cast<Scalar*>(mem), desc.dimensions(), internal::strides<Layout>(desc.dimensions()),
                      /*materialized_in_output=*/false,
                      /*strided_storage=*/false);
     }
@@ -762,9 +696,8 @@
 
   // Creates a materialized block for the given descriptor from a memory buffer.
   template <typename DataDimensions, typename TensorBlockScratch>
-  EIGEN_STRONG_INLINE static TensorMaterializedBlock materialize(
-      const Scalar* data, const DataDimensions& data_dims,
-      TensorBlockDesc& desc, TensorBlockScratch& scratch) {
+  EIGEN_STRONG_INLINE static TensorMaterializedBlock materialize(const Scalar* data, const DataDimensions& data_dims,
+                                                                 TensorBlockDesc& desc, TensorBlockScratch& scratch) {
     eigen_assert(array_size<DataDimensions>::value == desc.dimensions().size());
 
     // If a tensor block dimensions covers a contiguous block of the underlying
@@ -800,22 +733,18 @@
 
     if (can_use_direct_access) {
       const Scalar* block_start = data + desc.offset();
-      return TensorMaterializedBlock(internal::TensorBlockKind::kView,
-                                     block_start, desc.dimensions());
+      return TensorMaterializedBlock(internal::TensorBlockKind::kView, block_start, desc.dimensions());
 
     } else {
       // Reuse destination buffer or allocate new buffer with scratch allocator.
       const Storage storage = prepareStorage(desc, scratch);
 
-      typedef internal::TensorBlockIO<Scalar, IndexType, NumDims, Layout>
-          TensorBlockIO;
+      typedef internal::TensorBlockIO<Scalar, IndexType, NumDims, Layout> TensorBlockIO;
       typedef typename TensorBlockIO::Dst TensorBlockIODst;
       typedef typename TensorBlockIO::Src TensorBlockIOSrc;
 
-      TensorBlockIOSrc src(internal::strides<Layout>(Dimensions(data_dims)),
-                           data, desc.offset());
-      TensorBlockIODst dst(storage.dimensions(), storage.strides(),
-                           storage.data());
+      TensorBlockIOSrc src(internal::strides<Layout>(Dimensions(data_dims)), data, desc.offset());
+      TensorBlockIODst dst(storage.dimensions(), storage.strides(), storage.data());
 
       TensorBlockIO::Copy(dst, src);
       return storage.AsTensorMaterializedBlock();
@@ -836,13 +765,11 @@
 
 template <typename UnaryOp, typename ArgTensorBlock>
 class TensorCwiseUnaryBlock {
-  static constexpr bool NoArgBlockAccess =
-      internal::is_void<typename ArgTensorBlock::XprType>::value;
+  static constexpr bool NoArgBlockAccess = internal::is_void<typename ArgTensorBlock::XprType>::value;
 
  public:
-  typedef std::conditional_t<
-      NoArgBlockAccess, void,
-      TensorCwiseUnaryOp<UnaryOp, const typename ArgTensorBlock::XprType> >
+  typedef std::conditional_t<NoArgBlockAccess, void,
+                             TensorCwiseUnaryOp<UnaryOp, const typename ArgTensorBlock::XprType> >
       XprType;
 
   typedef typename XprScalar<XprType>::type Scalar;
@@ -867,31 +794,23 @@
 
 template <typename BinaryOp, typename LhsTensorBlock, typename RhsTensorBlock>
 class TensorCwiseBinaryBlock {
-  static constexpr bool NoArgBlockAccess =
-      internal::is_void<typename LhsTensorBlock::XprType>::value ||
-      internal::is_void<typename RhsTensorBlock::XprType>::value;
+  static constexpr bool NoArgBlockAccess = internal::is_void<typename LhsTensorBlock::XprType>::value ||
+                                           internal::is_void<typename RhsTensorBlock::XprType>::value;
 
  public:
   typedef std::conditional_t<
       NoArgBlockAccess, void,
-      TensorCwiseBinaryOp<BinaryOp, const typename LhsTensorBlock::XprType,
-                          const typename RhsTensorBlock::XprType> >
+      TensorCwiseBinaryOp<BinaryOp, const typename LhsTensorBlock::XprType, const typename RhsTensorBlock::XprType> >
       XprType;
 
   typedef typename XprScalar<XprType>::type Scalar;
 
-  TensorCwiseBinaryBlock(const LhsTensorBlock& left_block,
-                         const RhsTensorBlock& right_block,
-                         const BinaryOp& functor)
-      : m_left_block(left_block),
-        m_right_block(right_block),
-        m_functor(functor) {}
+  TensorCwiseBinaryBlock(const LhsTensorBlock& left_block, const RhsTensorBlock& right_block, const BinaryOp& functor)
+      : m_left_block(left_block), m_right_block(right_block), m_functor(functor) {}
 
   TensorBlockKind kind() const { return internal::TensorBlockKind::kExpr; }
 
-  XprType expr() const {
-    return XprType(m_left_block.expr(), m_right_block.expr(), m_functor);
-  }
+  XprType expr() const { return XprType(m_left_block.expr(), m_right_block.expr(), m_functor); }
 
   const Scalar* data() const { return NULL; }
 
@@ -917,14 +836,11 @@
   static constexpr bool NoArgBlockAccess = internal::is_void<ArgXprType>::value;
 
  public:
-  typedef std::conditional_t<
-      NoArgBlockAccess, void,
-      typename BlockFactory::template XprType<ArgXprType>::type> XprType;
+  typedef std::conditional_t<NoArgBlockAccess, void, typename BlockFactory::template XprType<ArgXprType>::type> XprType;
 
   typedef typename XprScalar<XprType>::type Scalar;
 
-  TensorUnaryExprBlock(const ArgTensorBlock& arg_block,
-                       const BlockFactory& factory)
+  TensorUnaryExprBlock(const ArgTensorBlock& arg_block, const BlockFactory& factory)
       : m_arg_block(arg_block), m_factory(factory) {}
 
   TensorBlockKind kind() const { return internal::TensorBlockKind::kExpr; }
@@ -941,8 +857,7 @@
 // TensorTernaryExprBlock is a lazy tensor expression block that can construct
 // an arbitrary tensor expression from three blocks of the underlying type.
 
-template <typename BlockFactory, typename Arg1TensorBlock,
-          typename Arg2TensorBlock, typename Arg3TensorBlock>
+template <typename BlockFactory, typename Arg1TensorBlock, typename Arg2TensorBlock, typename Arg3TensorBlock>
 class TensorTernaryExprBlock {
   typedef typename Arg1TensorBlock::XprType Arg1XprType;
   typedef typename Arg2TensorBlock::XprType Arg2XprType;
@@ -953,27 +868,18 @@
                                            internal::is_void<Arg3XprType>::value;
 
  public:
-  typedef std::conditional_t<
-      NoArgBlockAccess, void,
-      typename BlockFactory::template XprType<Arg1XprType, Arg2XprType,
-                                              Arg3XprType>::type> XprType;
+  typedef std::conditional_t<NoArgBlockAccess, void,
+                             typename BlockFactory::template XprType<Arg1XprType, Arg2XprType, Arg3XprType>::type>
+      XprType;
 
   typedef typename XprScalar<XprType>::type Scalar;
 
-  TensorTernaryExprBlock(const Arg1TensorBlock& arg1_block,
-                         const Arg2TensorBlock& arg2_block,
-                         const Arg3TensorBlock& arg3_block,
-                         const BlockFactory& factory)
-      : m_arg1_block(arg1_block),
-        m_arg2_block(arg2_block),
-        m_arg3_block(arg3_block),
-        m_factory(factory) {}
+  TensorTernaryExprBlock(const Arg1TensorBlock& arg1_block, const Arg2TensorBlock& arg2_block,
+                         const Arg3TensorBlock& arg3_block, const BlockFactory& factory)
+      : m_arg1_block(arg1_block), m_arg2_block(arg2_block), m_arg3_block(arg3_block), m_factory(factory) {}
 
   TensorBlockKind kind() const { return internal::TensorBlockKind::kExpr; }
-  XprType expr() const {
-    return m_factory.expr(m_arg1_block.expr(), m_arg2_block.expr(),
-                          m_arg3_block.expr());
-  }
+  XprType expr() const { return m_factory.expr(m_arg1_block.expr(), m_arg2_block.expr(), m_arg3_block.expr()); }
   const Scalar* data() const { return NULL; }
   void cleanup() {
     m_arg1_block.cleanup();
@@ -1023,8 +929,7 @@
   };
 
   struct Src {
-    Src(IndexType o, IndexType s, const Scalar* d)
-        : offset(o), stride(s), data(d) {}
+    Src(IndexType o, IndexType s, const Scalar* d) : offset(o), stride(s), data(d) {}
 
     IndexType offset;
     IndexType stride;
@@ -1032,20 +937,16 @@
   };
 
   template <typename StridedLinearBufferCopy::Kind kind>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void Run(const Dst& dst,
-                                                        const Src& src,
-                                                        const size_t count) {
-    Run<kind>(count, dst.offset, dst.stride, dst.data, src.offset, src.stride,
-              src.data);
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void Run(const Dst& dst, const Src& src, const size_t count) {
+    Run<kind>(count, dst.offset, dst.stride, dst.data, src.offset, src.stride, src.data);
   }
 
  private:
   template <typename StridedLinearBufferCopy::Kind kind>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void Run(
-      const IndexType count, const IndexType dst_offset,
-      const IndexType dst_stride, Scalar* EIGEN_RESTRICT dst_data,
-      const IndexType src_offset, const IndexType src_stride,
-      const Scalar* EIGEN_RESTRICT src_data) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void Run(const IndexType count, const IndexType dst_offset,
+                                                        const IndexType dst_stride, Scalar* EIGEN_RESTRICT dst_data,
+                                                        const IndexType src_offset, const IndexType src_stride,
+                                                        const Scalar* EIGEN_RESTRICT src_data) {
     const Scalar* src = &src_data[src_offset];
     Scalar* dst = &dst_data[dst_offset];
 
@@ -1055,7 +956,7 @@
       }
       return;
     }
-    
+
     const IndexType vectorized_size = PacketSize * (count / PacketSize);
     IndexType i = 0;
 
@@ -1162,8 +1063,7 @@
       if (HasHalfPacket) {
         const IndexType vectorized_half_size = HalfPacketSize * (count / HalfPacketSize);
         if (i < vectorized_half_size) {
-          HalfPacket p =
-              pgather<Scalar, HalfPacket>(src + i * src_stride, src_stride);
+          HalfPacket p = pgather<Scalar, HalfPacket>(src + i * src_stride, src_stride);
           pstoreu<Scalar, HalfPacket>(dst + i, p);
           i += HalfPacketSize;
         }
@@ -1200,8 +1100,7 @@
   typedef DSizes<int, NumDims> DimensionsMap;
 
   struct Dst {
-    Dst(const Dimensions& dst_dims, const Dimensions& dst_strides, Scalar* dst,
-        IndexType dst_offset = 0)
+    Dst(const Dimensions& dst_dims, const Dimensions& dst_strides, Scalar* dst, IndexType dst_offset = 0)
         : dims(dst_dims), strides(dst_strides), data(dst), offset(dst_offset) {}
 
     Dimensions dims;
@@ -1211,8 +1110,7 @@
   };
 
   struct Src {
-    Src(const Dimensions& src_strides, const Scalar* src,
-        IndexType src_offset = 0)
+    Src(const Dimensions& src_strides, const Scalar* src, IndexType src_offset = 0)
         : strides(src_strides), data(src), offset(src_offset) {}
 
     Dimensions strides;
@@ -1225,8 +1123,8 @@
   //   src_dimension_index = dst_to_src_dim_map[dst_dimension_index]
   //
   // Returns the number of copied elements.
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE IndexType Copy(
-      const Dst& dst, const Src& src, const DimensionsMap& dst_to_src_dim_map) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE IndexType Copy(const Dst& dst, const Src& src,
+                                                              const DimensionsMap& dst_to_src_dim_map) {
     // Copy single scalar value from `src` to `dst`.
     if (NumDims == 0) {
       *(dst.data + dst.offset) = *(src.data + src.offset);
@@ -1273,13 +1171,10 @@
     }
 
     // Outermost dimension in the dst with `stride == 1` (contiguous in memory).
-    const int dst_stride1_dim = IsColMajor
-                                    ? num_size_one_inner_dims
-                                    : NumDims - num_size_one_inner_dims - 1;
+    const int dst_stride1_dim = IsColMajor ? num_size_one_inner_dims : NumDims - num_size_one_inner_dims - 1;
 
     // Dimension in the src that corresponds to the dst innermost dimension.
-    const int src_dim_for_dst_stride1_dim =
-        NumDims == 0 ? 1 : dim_map[dst_stride1_dim];
+    const int src_dim_for_dst_stride1_dim = NumDims == 0 ? 1 : dim_map[dst_stride1_dim];
 
     // Size of the innermost dimension (length of contiguous blocks of memory).
     IndexType dst_inner_dim_size = NumDims == 0 ? 1 : dst.dims[dst_stride1_dim];
@@ -1301,8 +1196,7 @@
     // Setup strides to read data from `src` and write to `dst`.
     IndexType input_offset = src.offset;
     IndexType output_offset = dst.offset;
-    IndexType input_stride =
-        NumDims == 0 ? 1 : src.strides[src_dim_for_dst_stride1_dim];
+    IndexType input_stride = NumDims == 0 ? 1 : src.strides[src_dim_for_dst_stride1_dim];
     IndexType output_stride = NumDims == 0 ? 1 : dst.strides[dst_stride1_dim];
 
     const int at_least_1_dim = NumDims <= 1 ? 1 : NumDims - 1;
@@ -1327,26 +1221,23 @@
     // Iterate copying data from src to dst.
     const IndexType block_total_size = NumDims == 0 ? 1 : dst.dims.TotalSize();
 
-#define COPY_INNER_DIM(KIND)                                           \
-  IndexType num_copied = 0;                                            \
-  for (num_copied = 0; num_copied < block_total_size;                  \
-       num_copied += dst_inner_dim_size) {                             \
-    LinCopy::template Run<KIND>(                                       \
-        typename LinCopy::Dst(output_offset, output_stride, dst.data), \
-        typename LinCopy::Src(input_offset, input_stride, src.data),   \
-        dst_inner_dim_size);                                           \
-                                                                       \
-    for (int j = 0; j < idx; ++j) {                                    \
-      if (++it[j].count < it[j].size) {                                \
-        input_offset += it[j].input_stride;                            \
-        output_offset += it[j].output_stride;                          \
-        break;                                                         \
-      }                                                                \
-      it[j].count = 0;                                                 \
-      input_offset -= it[j].input_span;                                \
-      output_offset -= it[j].output_span;                              \
-    }                                                                  \
-  }                                                                    \
+#define COPY_INNER_DIM(KIND)                                                                                      \
+  IndexType num_copied = 0;                                                                                       \
+  for (num_copied = 0; num_copied < block_total_size; num_copied += dst_inner_dim_size) {                         \
+    LinCopy::template Run<KIND>(typename LinCopy::Dst(output_offset, output_stride, dst.data),                    \
+                                typename LinCopy::Src(input_offset, input_stride, src.data), dst_inner_dim_size); \
+                                                                                                                  \
+    for (int j = 0; j < idx; ++j) {                                                                               \
+      if (++it[j].count < it[j].size) {                                                                           \
+        input_offset += it[j].input_stride;                                                                       \
+        output_offset += it[j].output_stride;                                                                     \
+        break;                                                                                                    \
+      }                                                                                                           \
+      it[j].count = 0;                                                                                            \
+      input_offset -= it[j].input_span;                                                                           \
+      output_offset -= it[j].output_span;                                                                         \
+    }                                                                                                             \
+  }                                                                                                               \
   return num_copied;
 
     if (input_stride == 1 && output_stride == 1) {
@@ -1368,8 +1259,7 @@
 
   // Copy from `src` to `dst` with an identity src->dst dimension map. Returns
   // the number of copied elements.
-  static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE IndexType Copy(const Dst& dst,
-                                                              const Src& src) {
+  static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE IndexType Copy(const Dst& dst, const Src& src) {
     DimensionsMap dst_to_src_map;
     for (int i = 0; i < NumDims; ++i) dst_to_src_map[i] = i;
     return Copy(dst, src, dst_to_src_map);
@@ -1377,13 +1267,7 @@
 
  private:
   struct BlockIteratorState {
-    BlockIteratorState()
-        : size(0),
-          count(0),
-          input_stride(0),
-          output_stride(0),
-          input_span(0),
-          output_span(0) {}
+    BlockIteratorState() : size(0), count(0), input_stride(0), output_stride(0), input_span(0), output_span(0) {}
 
     IndexType size;
     IndexType count;
@@ -1426,25 +1310,18 @@
 // where `src` is a tensor expression. Explore if it is possible to rewrite IO
 // to use expressions instead of pointers, and after that TensorBlockAssignment
 // will become an alias to IO.
-template <typename Scalar, int NumDims, typename TensorBlockExpr,
-          typename IndexType = Eigen::Index>
+template <typename Scalar, int NumDims, typename TensorBlockExpr, typename IndexType = Eigen::Index>
 class TensorBlockAssignment {
   // We will use coeff/packet path to evaluate block expressions.
-  typedef TensorEvaluator<const TensorBlockExpr, DefaultDevice>
-      TensorBlockEvaluator;
+  typedef TensorEvaluator<const TensorBlockExpr, DefaultDevice> TensorBlockEvaluator;
 
   typedef DSizes<IndexType, NumDims> Dimensions;
 
-  enum {
-    Vectorizable = packet_traits<Scalar>::Vectorizable,
-    PacketSize = packet_traits<Scalar>::size
-  };
+  enum { Vectorizable = packet_traits<Scalar>::Vectorizable, PacketSize = packet_traits<Scalar>::size };
 
   template <bool Vectorizable, typename Evaluator>
   struct InnerDimAssign {
-    EIGEN_ALWAYS_INLINE static void Run(Scalar* target, IndexType count,
-                                        const Evaluator& eval,
-                                        IndexType eval_offset) {
+    EIGEN_ALWAYS_INLINE static void Run(Scalar* target, IndexType count, const Evaluator& eval, IndexType eval_offset) {
       for (IndexType i = 0; i < count; ++i) {
         target[i] = eval.coeff(eval_offset + i);
       }
@@ -1453,9 +1330,7 @@
 
   template <typename Evaluator>
   struct InnerDimAssign<true, Evaluator> {
-    EIGEN_ALWAYS_INLINE static void Run(Scalar* target, IndexType count,
-                                        const Evaluator& eval,
-                                        IndexType eval_offset) {
+    EIGEN_ALWAYS_INLINE static void Run(Scalar* target, IndexType count, const Evaluator& eval, IndexType eval_offset) {
       typedef typename packet_traits<Scalar>::type Packet;
 
       const IndexType unrolled_size = (4 * PacketSize) * (count / (4 * PacketSize));
@@ -1483,12 +1358,9 @@
 
  public:
   struct Target {
-    Target(const Dimensions& target_dims, const Dimensions& target_strides,
-           Scalar* target_data, IndexType target_offset = 0)
-        : dims(target_dims),
-          strides(target_strides),
-          data(target_data),
-          offset(target_offset) {}
+    Target(const Dimensions& target_dims, const Dimensions& target_strides, Scalar* target_data,
+           IndexType target_offset = 0)
+        : dims(target_dims), strides(target_strides), data(target_data), offset(target_offset) {}
 
     Dimensions dims;
     Dimensions strides;
@@ -1496,24 +1368,20 @@
     IndexType offset;
   };
 
-  static Target target(const Dimensions& target_dims,
-                       const Dimensions& target_strides, Scalar* target_data,
+  static Target target(const Dimensions& target_dims, const Dimensions& target_strides, Scalar* target_data,
                        IndexType target_offset = 0) {
     return Target(target_dims, target_strides, target_data, target_offset);
   }
 
   template <typename TargetDimsIndexType, typename TargetStridesIndexType>
-  static Target target(
-      const DSizes<TargetDimsIndexType, NumDims>& target_dims,
-      const DSizes<TargetStridesIndexType, NumDims>& target_strides,
-      Scalar* target_data, IndexType target_offset = 0) {
+  static Target target(const DSizes<TargetDimsIndexType, NumDims>& target_dims,
+                       const DSizes<TargetStridesIndexType, NumDims>& target_strides, Scalar* target_data,
+                       IndexType target_offset = 0) {
     // DSizes constructor will do index type promotion if it's safe.
-    return Target(Dimensions(target_dims), Dimensions(target_strides),
-                  target_data, target_offset);
+    return Target(Dimensions(target_dims), Dimensions(target_strides), target_data, target_offset);
   }
 
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void Run(
-      const Target& target, const TensorBlockExpr& expr) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void Run(const Target& target, const TensorBlockExpr& expr) {
     // Prepare evaluator for block expression.
     DefaultDevice default_device;
     TensorBlockEvaluator eval(expr, default_device);
@@ -1569,10 +1437,8 @@
     // Iterate copying data from `eval` to `target`.
     for (IndexType i = 0; i < output_size; i += output_inner_dim_size) {
       // Assign to `target` at current offset.
-      InnerDimAssign<Vectorizable && TensorBlockEvaluator::PacketAccess,
-                     TensorBlockEvaluator>::Run(target.data + output_offset,
-                                                output_inner_dim_size, eval,
-                                                input_offset);
+      InnerDimAssign<Vectorizable && TensorBlockEvaluator::PacketAccess, TensorBlockEvaluator>::Run(
+          target.data + output_offset, output_inner_dim_size, eval, input_offset);
 
       // Move input offset forward by the number of assigned coefficients.
       input_offset += output_inner_dim_size;
@@ -1591,8 +1457,7 @@
 
  private:
   struct BlockIteratorState {
-    BlockIteratorState()
-        : count(0), size(0), output_stride(0), output_span(0) {}
+    BlockIteratorState() : count(0), size(0), output_stride(0), output_span(0) {}
 
     IndexType count;
     IndexType size;
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorBroadcasting.h b/unsupported/Eigen/CXX11/src/Tensor/TensorBroadcasting.h
index 59e75e5..6c91d93 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorBroadcasting.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorBroadcasting.h
@@ -16,16 +16,15 @@
 namespace Eigen {
 
 /** \class TensorBroadcasting
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Tensor broadcasting class.
-  *
-  *
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Tensor broadcasting class.
+ *
+ *
+ */
 namespace internal {
-template<typename Broadcast, typename XprType>
-struct traits<TensorBroadcastingOp<Broadcast, XprType> > : public traits<XprType>
-{
+template <typename Broadcast, typename XprType>
+struct traits<TensorBroadcastingOp<Broadcast, XprType>> : public traits<XprType> {
   typedef typename XprType::Scalar Scalar;
   typedef traits<XprType> XprTraits;
   typedef typename XprTraits::StorageKind StorageKind;
@@ -37,15 +36,14 @@
   typedef typename XprTraits::PointerType PointerType;
 };
 
-template<typename Broadcast, typename XprType>
-struct eval<TensorBroadcastingOp<Broadcast, XprType>, Eigen::Dense>
-{
+template <typename Broadcast, typename XprType>
+struct eval<TensorBroadcastingOp<Broadcast, XprType>, Eigen::Dense> {
   typedef const TensorBroadcastingOp<Broadcast, XprType> EIGEN_DEVICE_REF type;
 };
 
-template<typename Broadcast, typename XprType>
-struct nested<TensorBroadcastingOp<Broadcast, XprType>, 1, typename eval<TensorBroadcastingOp<Broadcast, XprType> >::type>
-{
+template <typename Broadcast, typename XprType>
+struct nested<TensorBroadcastingOp<Broadcast, XprType>, 1,
+              typename eval<TensorBroadcastingOp<Broadcast, XprType>>::type> {
   typedef TensorBroadcastingOp<Broadcast, XprType> type;
 };
 
@@ -54,24 +52,21 @@
   static const bool value = false;
 };
 template <>
-struct is_input_scalar<Sizes<> > {
+struct is_input_scalar<Sizes<>> {
   static const bool value = true;
 };
 #ifndef EIGEN_EMULATE_CXX11_META_H
 template <typename std::ptrdiff_t... Indices>
-struct is_input_scalar<Sizes<Indices...> > {
+struct is_input_scalar<Sizes<Indices...>> {
   static const bool value = (Sizes<Indices...>::total_size == 1);
 };
 #endif
 
 }  // end namespace internal
 
-
-
-template<typename Broadcast, typename XprType>
-class TensorBroadcastingOp : public TensorBase<TensorBroadcastingOp<Broadcast, XprType>, ReadOnlyAccessors>
-{
-  public:
+template <typename Broadcast, typename XprType>
+class TensorBroadcastingOp : public TensorBase<TensorBroadcastingOp<Broadcast, XprType>, ReadOnlyAccessors> {
+ public:
   typedef typename Eigen::internal::traits<TensorBroadcastingOp>::Scalar Scalar;
   typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
   typedef typename XprType::CoeffReturnType CoeffReturnType;
@@ -82,23 +77,18 @@
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBroadcastingOp(const XprType& expr, const Broadcast& broadcast)
       : m_xpr(expr), m_broadcast(broadcast) {}
 
-    EIGEN_DEVICE_FUNC
-    const Broadcast& broadcast() const { return m_broadcast; }
+  EIGEN_DEVICE_FUNC const Broadcast& broadcast() const { return m_broadcast; }
 
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<typename XprType::Nested>&
-    expression() const { return m_xpr; }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename XprType::Nested>& expression() const { return m_xpr; }
 
-  protected:
-    typename XprType::Nested m_xpr;
-    const Broadcast m_broadcast;
+ protected:
+  typename XprType::Nested m_xpr;
+  const Broadcast m_broadcast;
 };
 
-
 // Eval as rvalue
-template<typename Broadcast, typename ArgType, typename Device>
-struct TensorEvaluator<const TensorBroadcastingOp<Broadcast, ArgType>, Device>
-{
+template <typename Broadcast, typename ArgType, typename Device>
+struct TensorEvaluator<const TensorBroadcastingOp<Broadcast, ArgType>, Device> {
   typedef TensorBroadcastingOp<Broadcast, ArgType> XprType;
   typedef typename XprType::Index Index;
   static constexpr int NumDims = internal::array_size<typename TensorEvaluator<ArgType, Device>::Dimensions>::value;
@@ -108,18 +98,21 @@
   typedef typename XprType::CoeffReturnType CoeffReturnType;
   typedef typename PacketType<CoeffReturnType, Device>::type PacketReturnType;
   static constexpr int PacketSize = PacketType<CoeffReturnType, Device>::size;
-  protected: //  all the non-static fields must have the same access control, otherwise the TensorEvaluator won't be standard layout;
+
+ protected:  //  all the non-static fields must have the same access control, otherwise the TensorEvaluator won't be
+             //  standard layout;
   bool isCopy, nByOne, oneByN;
-  public:
+
+ public:
   typedef StorageMemory<CoeffReturnType, Device> Storage;
   typedef typename Storage::Type EvaluatorPointerType;
 
   enum {
-    IsAligned         = TensorEvaluator<ArgType, Device>::IsAligned,
-    PacketAccess      = TensorEvaluator<ArgType, Device>::PacketAccess,
-    BlockAccess       = TensorEvaluator<ArgType, Device>::BlockAccess,
+    IsAligned = TensorEvaluator<ArgType, Device>::IsAligned,
+    PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
+    BlockAccess = TensorEvaluator<ArgType, Device>::BlockAccess,
     PreferBlockAccess = true,
-    RawAccess         = false
+    RawAccess = false
   };
   static constexpr int Layout = TensorEvaluator<ArgType, Device>::Layout;
 
@@ -133,19 +126,18 @@
   typedef internal::TensorBlockDescriptor<NumDims, Index> TensorBlockDesc;
   typedef internal::TensorBlockScratchAllocator<Device> TensorBlockScratch;
 
-  typedef typename TensorEvaluator<const ArgType, Device>::TensorBlock
-      ArgTensorBlock;
+  typedef typename TensorEvaluator<const ArgType, Device>::TensorBlock ArgTensorBlock;
 
-  typedef typename internal::TensorMaterializedBlock<ScalarNoConst, NumDims,
-                                                     Layout, Index>
-      TensorBlock;
+  typedef typename internal::TensorMaterializedBlock<ScalarNoConst, NumDims, Layout, Index> TensorBlock;
   //===--------------------------------------------------------------------===//
 
   EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
-      : isCopy(false), nByOne(false), oneByN(false),
-        m_device(device), m_broadcast(op.broadcast()), m_impl(op.expression(), device)
-  {
-
+      : isCopy(false),
+        nByOne(false),
+        oneByN(false),
+        m_device(device),
+        m_broadcast(op.broadcast()),
+        m_impl(op.expression(), device) {
     // The broadcasting op doesn't change the rank of the tensor. One can't broadcast a scalar
     // and store the result in a scalar. Instead one should reshape the scalar into a N-D
     // tensor with N >= 1 of 1 element first and then broadcast.
@@ -164,15 +156,15 @@
       m_inputStrides[0] = 1;
       m_outputStrides[0] = 1;
       for (int i = 1; i < NumDims; ++i) {
-        m_inputStrides[i] = m_inputStrides[i-1] * input_dims[i-1];
-        m_outputStrides[i] = m_outputStrides[i-1] * m_dimensions[i-1];
+        m_inputStrides[i] = m_inputStrides[i - 1] * input_dims[i - 1];
+        m_outputStrides[i] = m_outputStrides[i - 1] * m_dimensions[i - 1];
       }
     } else {
-      m_inputStrides[NumDims-1] = 1;
-      m_outputStrides[NumDims-1] = 1;
-      for (int i = NumDims-2; i >= 0; --i) {
-        m_inputStrides[i] = m_inputStrides[i+1] * input_dims[i+1];
-        m_outputStrides[i] = m_outputStrides[i+1] * m_dimensions[i+1];
+      m_inputStrides[NumDims - 1] = 1;
+      m_outputStrides[NumDims - 1] = 1;
+      for (int i = NumDims - 2; i >= 0; --i) {
+        m_inputStrides[i] = m_inputStrides[i + 1] * input_dims[i + 1];
+        m_outputStrides[i] = m_outputStrides[i + 1] * m_dimensions[i + 1];
       }
     }
 
@@ -184,9 +176,9 @@
           break;
         }
       }
-    } else if (input_dims[NumDims-1] == 1) {
+    } else if (input_dims[NumDims - 1] == 1) {
       nByOne = true;
-      for (int i = 0; i < NumDims-1; ++i) {
+      for (int i = 0; i < NumDims - 1; ++i) {
         if (m_broadcast[i] != 1) {
           nByOne = false;
           break;
@@ -197,10 +189,10 @@
     // Handle special format like NCHW, its input shape is '[1, N..., 1]' and
     // broadcast shape is '[N, 1..., N]'
     if (!oneByN && !nByOne) {
-      if (input_dims[0] == 1 && input_dims[NumDims-1] == 1 && NumDims > 2) {
+      if (input_dims[0] == 1 && input_dims[NumDims - 1] == 1 && NumDims > 2) {
         nByOne = true;
         oneByN = true;
-        for (int i = 1; i < NumDims-1; ++i) {
+        for (int i = 1; i < NumDims - 1; ++i) {
           if (m_broadcast[i] != 1) {
             nByOne = false;
             oneByN = false;
@@ -220,18 +212,14 @@
 
 #ifdef EIGEN_USE_THREADS
   template <typename EvalSubExprsCallback>
-  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(
-      EvaluatorPointerType, EvalSubExprsCallback done) {
+  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(EvaluatorPointerType, EvalSubExprsCallback done) {
     m_impl.evalSubExprsIfNeededAsync(nullptr, [done](bool) { done(true); });
   }
 #endif  // EIGEN_USE_THREADS
 
-  EIGEN_STRONG_INLINE void cleanup() {
-    m_impl.cleanup();
-  }
+  EIGEN_STRONG_INLINE void cleanup() { m_impl.cleanup(); }
 
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE CoeffReturnType coeff(Index index) const {
     if (internal::is_input_scalar<internal::remove_all_t<InputDimensions>>::value) {
       return m_impl.coeff(0);
     }
@@ -282,8 +270,7 @@
     return inputIndex;
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeffColMajor(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeffColMajor(Index index) const {
     return m_impl.coeff(indexColMajor(index));
   }
 
@@ -317,27 +304,25 @@
     return inputIndex;
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeffRowMajor(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeffRowMajor(Index index) const {
     return m_impl.coeff(indexRowMajor(index));
   }
 
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketReturnType packet(Index index) const
-  {
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketReturnType packet(Index index) const {
     if (internal::is_input_scalar<internal::remove_all_t<InputDimensions>>::value) {
       return internal::pset1<PacketReturnType>(m_impl.coeff(0));
     }
 
     if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
       if (isCopy) {
-        #ifdef EIGEN_GPU_COMPILE_PHASE
+#ifdef EIGEN_GPU_COMPILE_PHASE
         // See PR 437: on NVIDIA P100 and K20m we observed a x3-4 speed up by enforcing
         // unaligned loads here. The reason is unclear though.
         return m_impl.template packet<Unaligned>(index);
-        #else
+#else
         return m_impl.template packet<LoadMode>(index);
-        #endif
+#endif
       } else if (oneByN && !nByOne) {
         return packetNByOne<LoadMode>(index);
       } else if (!oneByN && nByOne) {
@@ -349,12 +334,12 @@
       }
     } else {
       if (isCopy) {
-        #ifdef EIGEN_GPU_COMPILE_PHASE
+#ifdef EIGEN_GPU_COMPILE_PHASE
         // See above.
         return m_impl.template packet<Unaligned>(index);
-        #else
+#else
         return m_impl.template packet<LoadMode>(index);
-        #endif
+#endif
       } else if (oneByN && !nByOne) {
         return packetOneByN<LoadMode>(index);
       } else if (!oneByN && nByOne) {
@@ -367,11 +352,9 @@
     }
   }
 
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packetOneByNByOne
-  (Index index) const
-  {
-    eigen_assert(index+PacketSize-1 < dimensions().TotalSize());
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packetOneByNByOne(Index index) const {
+    eigen_assert(index + PacketSize - 1 < dimensions().TotalSize());
 
     EIGEN_ALIGN_MAX std::remove_const_t<CoeffReturnType> values[PacketSize];
     Index startDim, endDim;
@@ -386,7 +369,7 @@
     }
 
     batchedIndex = index % m_outputStrides[startDim];
-    inputIndex   = batchedIndex / m_outputStrides[endDim];
+    inputIndex = batchedIndex / m_outputStrides[endDim];
     outputOffset = batchedIndex % m_outputStrides[endDim];
 
     if (outputOffset + PacketSize <= m_outputStrides[endDim]) {
@@ -409,18 +392,17 @@
     }
   }
 
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packetOneByN(Index index) const
-  {
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packetOneByN(Index index) const {
     // Consider the flattened tensor [v0, ..., vN],
     // Concatenates m_broadcast[dim] copies,
     //    [v0, ..., vN, v0, ..., vN, ... ]
     // with dim == NumDims - 1 for col-major, dim == 0 for row-major.
-    eigen_assert(index+PacketSize-1 < dimensions().TotalSize());
+    eigen_assert(index + PacketSize - 1 < dimensions().TotalSize());
 
     // Size of flattened tensor.
-    const Index M = (static_cast<int>(Layout) == static_cast<int>(ColMajor)) ?
-                      m_inputStrides[NumDims - 1] : m_inputStrides[0];
+    const Index M =
+        (static_cast<int>(Layout) == static_cast<int>(ColMajor)) ? m_inputStrides[NumDims - 1] : m_inputStrides[0];
     Index inputIndex = index % M;
     if (inputIndex + PacketSize <= M) {
       return m_impl.template packet<Unaligned>(inputIndex);
@@ -437,19 +419,18 @@
     }
   }
 
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packetNByOne(Index index) const
-  {
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packetNByOne(Index index) const {
     // Consider the flattened tensor [v0, ..., vN],
     // Interleaves m_broadcast[dim] copies,
     //    [v0, v0, ..., v1, v1, ..., vN, vN, ... ]
     // with dim == 0 for col-major, dim == NumDims - 1 for row-major.
-    eigen_assert(index + PacketSize-1 < dimensions().TotalSize());
+    eigen_assert(index + PacketSize - 1 < dimensions().TotalSize());
 
-    const Index M = (static_cast<int>(Layout) == static_cast<int>(ColMajor)) ?
-                      m_broadcast[0] : m_broadcast[NumDims - 1];
+    const Index M =
+        (static_cast<int>(Layout) == static_cast<int>(ColMajor)) ? m_broadcast[0] : m_broadcast[NumDims - 1];
 
-    Index inputIndex   = index / M;
+    Index inputIndex = index / M;
     Index outputOffset = index % M;
     if (outputOffset + PacketSize <= M) {
       return internal::pset1<PacketReturnType>(m_impl.coeff(inputIndex));
@@ -471,10 +452,9 @@
 
   // Ignore the LoadMode and always use unaligned loads since we can't guarantee
   // the alignment at compile time.
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packetColMajor(Index index) const
-  {
-    eigen_assert(index+PacketSize-1 < dimensions().TotalSize());
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packetColMajor(Index index) const {
+    eigen_assert(index + PacketSize - 1 < dimensions().TotalSize());
 
     const Index originalIndex = index;
 
@@ -518,9 +498,9 @@
       EIGEN_UNROLL_LOOP
       for (int i = 1; i < PacketSize; ++i) {
         if (innermostLoc + i < m_impl.dimensions()[0]) {
-          values[i] = m_impl.coeff(inputIndex+i);
+          values[i] = m_impl.coeff(inputIndex + i);
         } else {
-          values[i] = coeffColMajor(originalIndex+i);
+          values[i] = coeffColMajor(originalIndex + i);
         }
       }
       PacketReturnType rslt = internal::pload<PacketReturnType>(values);
@@ -528,10 +508,9 @@
     }
   }
 
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packetRowMajor(Index index) const
-  {
-    eigen_assert(index+PacketSize-1 < dimensions().TotalSize());
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packetRowMajor(Index index) const {
+    eigen_assert(index + PacketSize - 1 < dimensions().TotalSize());
 
     const Index originalIndex = index;
 
@@ -552,32 +531,32 @@
       index -= idx * m_outputStrides[i];
     }
     Index innermostLoc;
-    if (internal::index_statically_eq<Broadcast>(NumDims-1, 1)) {
-      eigen_assert(index < m_impl.dimensions()[NumDims-1]);
+    if (internal::index_statically_eq<Broadcast>(NumDims - 1, 1)) {
+      eigen_assert(index < m_impl.dimensions()[NumDims - 1]);
       innermostLoc = index;
     } else {
-      if (internal::index_statically_eq<InputDimensions>(NumDims-1, 1)) {
-        eigen_assert(index % m_impl.dimensions()[NumDims-1] == 0);
+      if (internal::index_statically_eq<InputDimensions>(NumDims - 1, 1)) {
+        eigen_assert(index % m_impl.dimensions()[NumDims - 1] == 0);
         innermostLoc = 0;
       } else {
-        innermostLoc = index % m_impl.dimensions()[NumDims-1];
+        innermostLoc = index % m_impl.dimensions()[NumDims - 1];
       }
     }
     inputIndex += innermostLoc;
 
     // Todo: this could be extended to the second dimension if we're not
     // broadcasting alongside the first dimension, and so on.
-    if (innermostLoc + PacketSize <= m_impl.dimensions()[NumDims-1]) {
+    if (innermostLoc + PacketSize <= m_impl.dimensions()[NumDims - 1]) {
       return m_impl.template packet<Unaligned>(inputIndex);
     } else {
       EIGEN_ALIGN_MAX std::remove_const_t<CoeffReturnType> values[PacketSize];
       values[0] = m_impl.coeff(inputIndex);
       EIGEN_UNROLL_LOOP
       for (int i = 1; i < PacketSize; ++i) {
-        if (innermostLoc + i < m_impl.dimensions()[NumDims-1]) {
-          values[i] = m_impl.coeff(inputIndex+i);
+        if (innermostLoc + i < m_impl.dimensions()[NumDims - 1]) {
+          values[i] = m_impl.coeff(inputIndex + i);
         } else {
-          values[i] = coeffRowMajor(originalIndex+i);
+          values[i] = coeffRowMajor(originalIndex + i);
         }
       }
       PacketReturnType rslt = internal::pload<PacketReturnType>(values);
@@ -585,44 +564,36 @@
     }
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost
-  costPerCoeff(bool vectorized) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const {
     double compute_cost = TensorOpCost::AddCost<Index>();
     if (!isCopy && NumDims > 0) {
       EIGEN_UNROLL_LOOP
       for (int i = NumDims - 1; i > 0; --i) {
         compute_cost += TensorOpCost::DivCost<Index>();
         if (internal::index_statically_eq<Broadcast>(i, 1)) {
-          compute_cost +=
-              TensorOpCost::MulCost<Index>() + TensorOpCost::AddCost<Index>();
+          compute_cost += TensorOpCost::MulCost<Index>() + TensorOpCost::AddCost<Index>();
         } else {
           if (!internal::index_statically_eq<InputDimensions>(i, 1)) {
-            compute_cost += TensorOpCost::MulCost<Index>() +
-                            TensorOpCost::ModCost<Index>() +
-                            TensorOpCost::AddCost<Index>();
+            compute_cost +=
+                TensorOpCost::MulCost<Index>() + TensorOpCost::ModCost<Index>() + TensorOpCost::AddCost<Index>();
           }
         }
-        compute_cost +=
-            TensorOpCost::MulCost<Index>() + TensorOpCost::AddCost<Index>();
+        compute_cost += TensorOpCost::MulCost<Index>() + TensorOpCost::AddCost<Index>();
       }
     }
-    return m_impl.costPerCoeff(vectorized) +
-           TensorOpCost(0, 0, compute_cost, vectorized, PacketSize);
+    return m_impl.costPerCoeff(vectorized) + TensorOpCost(0, 0, compute_cost, vectorized, PacketSize);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  internal::TensorBlockResourceRequirements getResourceRequirements() const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE internal::TensorBlockResourceRequirements getResourceRequirements() const {
     // TODO(wuke): Targeting L1 size is 30% faster than targeting L{-1} on large
     // tensors. But this might need further tuning.
     const size_t target_size = m_device.firstLevelCacheSize();
     return internal::TensorBlockResourceRequirements::merge(
-        m_impl.getResourceRequirements(),
-        internal::TensorBlockResourceRequirements::skewed<Scalar>(target_size));
+        m_impl.getResourceRequirements(), internal::TensorBlockResourceRequirements::skewed<Scalar>(target_size));
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock
-  block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
-          bool /*root_of_expr_ast*/ = false) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
+                                                          bool /*root_of_expr_ast*/ = false) const {
     BlockBroadcastingParams params = blockBroadcastingParams(desc);
 
     if (params.inner_dim_size == 0 || params.bcast_dim_size == 0) {
@@ -630,8 +601,7 @@
     }
 
     // Prepare storage for the materialized broadcasting result.
-    const typename TensorBlock::Storage block_storage =
-        TensorBlock::prepareStorage(desc, scratch);
+    const typename TensorBlock::Storage block_storage = TensorBlock::prepareStorage(desc, scratch);
     ScalarNoConst* materialized_output = block_storage.data();
 
     // We potentially will need to materialize input blocks.
@@ -665,9 +635,8 @@
       Index bcast_offset = desc.offset() + output_offset;
 
       // Broadcast along the bcast dimension.
-      num_output_coeffs += BroadcastBlockAlongBcastDim(
-          params, bcast_offset, scratch, bcast_output, &materialized_input,
-          &materialized_input_size);
+      num_output_coeffs += BroadcastBlockAlongBcastDim(params, bcast_offset, scratch, bcast_output, &materialized_input,
+                                                       &materialized_input_size);
 
       // Switch to the next outer dimension.
       for (int j = 0; j < idx; ++j) {
@@ -688,9 +657,9 @@
   const TensorEvaluator<ArgType, Device>& impl() const { return m_impl; }
 
   Broadcast functor() const { return m_broadcast; }
+
  private:
-  static constexpr bool IsColMajor =
-      static_cast<int>(Layout) == static_cast<int>(ColMajor);
+  static constexpr bool IsColMajor = static_cast<int>(Layout) == static_cast<int>(ColMajor);
 
   // We will build a general case block broadcasting on top of broadcasting
   // primitive that will do broadcasting only for the inner dimension(s) along
@@ -737,8 +706,7 @@
     Index output_span;
   };
 
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE BlockBroadcastingParams
-  blockBroadcastingParams(TensorBlockDesc& desc) const {
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE BlockBroadcastingParams blockBroadcastingParams(TensorBlockDesc& desc) const {
     BlockBroadcastingParams params;
 
     params.input_dims = Dimensions(m_impl.dimensions());
@@ -782,8 +750,7 @@
       const int dim = IsColMajor ? i : NumDims - i - 1;
       params.input_block_sizes[dim] = 1;
     }
-    params.input_block_strides =
-        internal::strides<Layout>(params.input_block_sizes);
+    params.input_block_strides = internal::strides<Layout>(params.input_block_sizes);
 
     // Broadcast with the 0-stride trick: Create 1 extra dim for each
     // broadcast, set the input stride to 0.
@@ -812,8 +779,7 @@
       params.bcast_block_sizes[copy_dim] = params.input_dims[dim];
       params.bcast_block_sizes[broadcast_dim] = m_broadcast[dim];
       params.bcast_block_strides[copy_dim] = params.output_strides[dim];
-      params.bcast_block_strides[broadcast_dim] =
-          params.output_strides[dim] * params.input_dims[dim];
+      params.bcast_block_strides[broadcast_dim] = params.output_strides[dim] * params.input_dims[dim];
       params.bcast_input_strides[copy_dim] = params.input_block_strides[dim];
       params.bcast_input_strides[broadcast_dim] = 0;
     }
@@ -835,34 +801,26 @@
   }
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index BroadcastBlockAlongBcastDim(
-      BlockBroadcastingParams params, Index bcast_offset,
-      TensorBlockScratch& scratch, ScalarNoConst* materialized_output,
-      ScalarNoConst** materialized_input,
-      size_t* materialized_input_size) const {
+      BlockBroadcastingParams params, Index bcast_offset, TensorBlockScratch& scratch,
+      ScalarNoConst* materialized_output, ScalarNoConst** materialized_input, size_t* materialized_input_size) const {
     if (params.bcast_dim_size == 1) {
       // We just need one block read using the ready-set values above.
-      return BroadcastBlock(
-          params.input_block_sizes, params.input_block_strides,
-          params.bcast_block_sizes, params.bcast_block_strides,
-          params.bcast_input_strides, bcast_offset, 0, scratch,
-          materialized_output, materialized_input, materialized_input_size);
+      return BroadcastBlock(params.input_block_sizes, params.input_block_strides, params.bcast_block_sizes,
+                            params.bcast_block_strides, params.bcast_input_strides, bcast_offset, 0, scratch,
+                            materialized_output, materialized_input, materialized_input_size);
 
     } else if (params.input_dims[params.bcast_dim] == 1) {
       // Broadcast bcast dimension (< NumDims) by bcast_dim_size.
       const int broadcast_bcast_dim =
-          IsColMajor ? 2 * params.inner_dim_count + 1
-                     : 2 * NumDims - 2 * params.inner_dim_count - 2;
+          IsColMajor ? 2 * params.inner_dim_count + 1 : 2 * NumDims - 2 * params.inner_dim_count - 2;
 
       params.bcast_block_sizes[broadcast_bcast_dim] = params.bcast_dim_size;
       params.bcast_input_strides[broadcast_bcast_dim] = 0;
-      params.bcast_block_strides[broadcast_bcast_dim] =
-          params.output_strides[params.bcast_dim];
+      params.bcast_block_strides[broadcast_bcast_dim] = params.output_strides[params.bcast_dim];
 
-      return BroadcastBlock(
-          params.input_block_sizes, params.input_block_strides,
-          params.bcast_block_sizes, params.bcast_block_strides,
-          params.bcast_input_strides, bcast_offset, 0, scratch,
-          materialized_output, materialized_input, materialized_input_size);
+      return BroadcastBlock(params.input_block_sizes, params.input_block_strides, params.bcast_block_sizes,
+                            params.bcast_block_strides, params.bcast_input_strides, bcast_offset, 0, scratch,
+                            materialized_output, materialized_input, materialized_input_size);
 
     } else {
       // Keep track of the total number of the coefficients written to the
@@ -889,8 +847,7 @@
       // together.
 
       // Find a.
-      const Index bcast_dim_left_index =
-          bcast_offset / m_outputStrides[params.bcast_dim];
+      const Index bcast_dim_left_index = bcast_offset / m_outputStrides[params.bcast_dim];
 
       // Find b and c.
       const Index input_bcast_dim_size = params.input_dims[params.bcast_dim];
@@ -898,103 +855,79 @@
       // First multiple after a. This is b when <= bcast_dim_left_index +
       // bcast_dim_size.
       const Index first_multiple =
-          numext::div_ceil<Index>(bcast_dim_left_index, input_bcast_dim_size) *
-          input_bcast_dim_size;
+          numext::div_ceil<Index>(bcast_dim_left_index, input_bcast_dim_size) * input_bcast_dim_size;
 
       if (first_multiple <= bcast_dim_left_index + params.bcast_dim_size) {
         // b exists, so does c. Find it.
         const Index last_multiple =
-            (bcast_dim_left_index + params.bcast_dim_size) /
-            input_bcast_dim_size * input_bcast_dim_size;
+            (bcast_dim_left_index + params.bcast_dim_size) / input_bcast_dim_size * input_bcast_dim_size;
         const int copy_bcast_dim =
-            IsColMajor ? 2 * params.inner_dim_count
-                       : 2 * NumDims - 2 * params.inner_dim_count - 1;
+            IsColMajor ? 2 * params.inner_dim_count : 2 * NumDims - 2 * params.inner_dim_count - 1;
         const int broadcast_bcast_dim =
-            IsColMajor ? 2 * params.inner_dim_count + 1
-                       : 2 * NumDims - 2 * params.inner_dim_count - 2;
+            IsColMajor ? 2 * params.inner_dim_count + 1 : 2 * NumDims - 2 * params.inner_dim_count - 2;
 
         if (first_multiple > bcast_dim_left_index) {
           const Index head_size = first_multiple - bcast_dim_left_index;
           params.input_block_sizes[params.bcast_dim] = head_size;
           params.bcast_block_sizes[copy_bcast_dim] = head_size;
-          params.bcast_input_strides[copy_bcast_dim] =
-              params.input_block_strides[params.bcast_dim];
-          params.bcast_block_strides[copy_bcast_dim] =
-              params.output_strides[params.bcast_dim];
+          params.bcast_input_strides[copy_bcast_dim] = params.input_block_strides[params.bcast_dim];
+          params.bcast_block_strides[copy_bcast_dim] = params.output_strides[params.bcast_dim];
           params.bcast_block_sizes[broadcast_bcast_dim] = 1;
           params.bcast_input_strides[broadcast_bcast_dim] = 0;
           params.bcast_block_strides[broadcast_bcast_dim] =
-              params.output_strides[params.bcast_dim] *
-              params.input_dims[params.bcast_dim];
+              params.output_strides[params.bcast_dim] * params.input_dims[params.bcast_dim];
 
-          num_output_coeffs += BroadcastBlock(
-              params.input_block_sizes, params.input_block_strides,
-              params.bcast_block_sizes, params.bcast_block_strides,
-              params.bcast_input_strides, bcast_offset, 0, scratch,
-              materialized_output, materialized_input, materialized_input_size);
+          num_output_coeffs +=
+              BroadcastBlock(params.input_block_sizes, params.input_block_strides, params.bcast_block_sizes,
+                             params.bcast_block_strides, params.bcast_input_strides, bcast_offset, 0, scratch,
+                             materialized_output, materialized_input, materialized_input_size);
         }
         if (first_multiple < last_multiple) {
           params.input_block_sizes[params.bcast_dim] = input_bcast_dim_size;
           params.bcast_block_sizes[copy_bcast_dim] = input_bcast_dim_size;
-          params.bcast_input_strides[copy_bcast_dim] =
-              params.input_block_strides[params.bcast_dim];
-          params.bcast_block_strides[copy_bcast_dim] =
-              params.output_strides[params.bcast_dim];
-          params.bcast_block_sizes[broadcast_bcast_dim] =
-              (last_multiple - first_multiple) / input_bcast_dim_size;
+          params.bcast_input_strides[copy_bcast_dim] = params.input_block_strides[params.bcast_dim];
+          params.bcast_block_strides[copy_bcast_dim] = params.output_strides[params.bcast_dim];
+          params.bcast_block_sizes[broadcast_bcast_dim] = (last_multiple - first_multiple) / input_bcast_dim_size;
           params.bcast_input_strides[broadcast_bcast_dim] = 0;
           params.bcast_block_strides[broadcast_bcast_dim] =
-              params.output_strides[params.bcast_dim] *
-              params.input_dims[params.bcast_dim];
-          const Index offset = (first_multiple - bcast_dim_left_index) *
-                               m_outputStrides[params.bcast_dim];
+              params.output_strides[params.bcast_dim] * params.input_dims[params.bcast_dim];
+          const Index offset = (first_multiple - bcast_dim_left_index) * m_outputStrides[params.bcast_dim];
 
-          num_output_coeffs += BroadcastBlock(
-              params.input_block_sizes, params.input_block_strides,
-              params.bcast_block_sizes, params.bcast_block_strides,
-              params.bcast_input_strides, bcast_offset, offset, scratch,
-              materialized_output, materialized_input, materialized_input_size);
+          num_output_coeffs +=
+              BroadcastBlock(params.input_block_sizes, params.input_block_strides, params.bcast_block_sizes,
+                             params.bcast_block_strides, params.bcast_input_strides, bcast_offset, offset, scratch,
+                             materialized_output, materialized_input, materialized_input_size);
         }
         if (last_multiple < bcast_dim_left_index + params.bcast_dim_size) {
-          const Index tail_size =
-              bcast_dim_left_index + params.bcast_dim_size - last_multiple;
+          const Index tail_size = bcast_dim_left_index + params.bcast_dim_size - last_multiple;
           params.input_block_sizes[params.bcast_dim] = tail_size;
           params.bcast_block_sizes[copy_bcast_dim] = tail_size;
-          params.bcast_input_strides[copy_bcast_dim] =
-              params.input_block_strides[params.bcast_dim];
-          params.bcast_block_strides[copy_bcast_dim] =
-              params.output_strides[params.bcast_dim];
+          params.bcast_input_strides[copy_bcast_dim] = params.input_block_strides[params.bcast_dim];
+          params.bcast_block_strides[copy_bcast_dim] = params.output_strides[params.bcast_dim];
           params.bcast_block_sizes[broadcast_bcast_dim] = 1;
           params.bcast_input_strides[broadcast_bcast_dim] = 0;
           params.bcast_block_strides[broadcast_bcast_dim] =
-              params.output_strides[params.bcast_dim] *
-              params.input_dims[params.bcast_dim];
-          const Index offset = (last_multiple - bcast_dim_left_index) *
-                               m_outputStrides[params.bcast_dim];
+              params.output_strides[params.bcast_dim] * params.input_dims[params.bcast_dim];
+          const Index offset = (last_multiple - bcast_dim_left_index) * m_outputStrides[params.bcast_dim];
 
-          num_output_coeffs += BroadcastBlock(
-              params.input_block_sizes, params.input_block_strides,
-              params.bcast_block_sizes, params.bcast_block_strides,
-              params.bcast_input_strides, bcast_offset, offset, scratch,
-              materialized_output, materialized_input, materialized_input_size);
+          num_output_coeffs +=
+              BroadcastBlock(params.input_block_sizes, params.input_block_strides, params.bcast_block_sizes,
+                             params.bcast_block_strides, params.bcast_input_strides, bcast_offset, offset, scratch,
+                             materialized_output, materialized_input, materialized_input_size);
         }
       } else {
         // b and c do not exist.
         const int copy_bcast_dim =
-            IsColMajor ? 2 * params.inner_dim_count
-                       : 2 * NumDims - 2 * params.inner_dim_count - 1;
+            IsColMajor ? 2 * params.inner_dim_count : 2 * NumDims - 2 * params.inner_dim_count - 1;
         params.input_block_sizes[params.bcast_dim] = params.bcast_dim_size;
         params.bcast_block_sizes[copy_bcast_dim] = params.bcast_dim_size;
-        params.bcast_input_strides[copy_bcast_dim] =
-            params.input_block_strides[params.bcast_dim];
-        params.bcast_block_strides[copy_bcast_dim] =
-            params.output_strides[params.bcast_dim];
+        params.bcast_input_strides[copy_bcast_dim] = params.input_block_strides[params.bcast_dim];
+        params.bcast_block_strides[copy_bcast_dim] = params.output_strides[params.bcast_dim];
 
-        num_output_coeffs += BroadcastBlock(
-            params.input_block_sizes, params.input_block_strides,
-            params.bcast_block_sizes, params.bcast_block_strides,
-            params.bcast_input_strides, bcast_offset, 0, scratch,
-            materialized_output, materialized_input, materialized_input_size);
+        num_output_coeffs +=
+            BroadcastBlock(params.input_block_sizes, params.input_block_strides, params.bcast_block_sizes,
+                           params.bcast_block_strides, params.bcast_input_strides, bcast_offset, 0, scratch,
+                           materialized_output, materialized_input, materialized_input_size);
       }
 
       return num_output_coeffs;
@@ -1002,20 +935,15 @@
   }
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index BroadcastBlock(
-      const Dimensions& input_block_sizes,
-      const Dimensions& input_block_strides,
-      const BroadcastDimensions& bcast_block_sizes,
-      const BroadcastDimensions& bcast_block_strides,
-      const BroadcastDimensions& bcast_input_strides, Index bcast_offset,
-      Index offset, TensorBlockScratch& scratch,
-      ScalarNoConst* materialized_output, ScalarNoConst** materialized_input,
-      size_t* materialized_input_size) const {
+      const Dimensions& input_block_sizes, const Dimensions& input_block_strides,
+      const BroadcastDimensions& bcast_block_sizes, const BroadcastDimensions& bcast_block_strides,
+      const BroadcastDimensions& bcast_input_strides, Index bcast_offset, Index offset, TensorBlockScratch& scratch,
+      ScalarNoConst* materialized_output, ScalarNoConst** materialized_input, size_t* materialized_input_size) const {
     // ---------------------------------------------------------------------- //
     // Tensor block descriptor for reading block from the input.
     const Index input_offset = bcast_offset + offset;
-    TensorBlockDesc input_desc(
-        IsColMajor ? indexColMajor(input_offset) : indexRowMajor(input_offset),
-        input_block_sizes);
+    TensorBlockDesc input_desc(IsColMajor ? indexColMajor(input_offset) : indexRowMajor(input_offset),
+                               input_block_sizes);
 
     ArgTensorBlock input_block = m_impl.block(input_desc, scratch);
 
@@ -1034,20 +962,17 @@
       // Maybe reuse previously allocated buffer, or allocate a new one with a
       // scratch allocator.
       const size_t input_total_size = input_block_sizes.TotalSize();
-      if (*materialized_input == NULL ||
-          *materialized_input_size < input_total_size) {
+      if (*materialized_input == NULL || *materialized_input_size < input_total_size) {
         *materialized_input_size = input_total_size;
         void* mem = scratch.allocate(*materialized_input_size * sizeof(Scalar));
         *materialized_input = static_cast<ScalarNoConst*>(mem);
       }
 
-      typedef internal::TensorBlockAssignment<
-          ScalarNoConst, NumDims, typename ArgTensorBlock::XprType, Index>
+      typedef internal::TensorBlockAssignment<ScalarNoConst, NumDims, typename ArgTensorBlock::XprType, Index>
           TensorBlockAssignment;
 
       TensorBlockAssignment::Run(
-          TensorBlockAssignment::target(input_block_sizes, input_block_strides,
-                                        *materialized_input),
+          TensorBlockAssignment::target(input_block_sizes, input_block_strides, *materialized_input),
           input_block.expr());
 
       input_buffer = *materialized_input;
@@ -1056,17 +981,15 @@
     // ---------------------------------------------------------------------- //
     // Copy data from materialized input block to the materialized output, using
     // given broadcast strides (strides with zeroes).
-    typedef internal::TensorBlockIO<ScalarNoConst, Index, 2 * NumDims, Layout>
-        TensorBlockIO;
+    typedef internal::TensorBlockIO<ScalarNoConst, Index, 2 * NumDims, Layout> TensorBlockIO;
 
     typename TensorBlockIO::Src src(bcast_input_strides, input_buffer);
-    typename TensorBlockIO::Dst dst(bcast_block_sizes, bcast_block_strides,
-                                      materialized_output + offset);
+    typename TensorBlockIO::Dst dst(bcast_block_sizes, bcast_block_strides, materialized_output + offset);
 
     return TensorBlockIO::Copy(dst, src);
   }
 
-protected:
+ protected:
   const Device EIGEN_DEVICE_REF m_device;
   const std::remove_reference_t<Broadcast> m_broadcast;
   Dimensions m_dimensions;
@@ -1075,7 +998,6 @@
   TensorEvaluator<ArgType, Device> m_impl;
 };
 
+}  // end namespace Eigen
 
-} // end namespace Eigen
-
-#endif // EIGEN_CXX11_TENSOR_TENSOR_BROADCASTING_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_BROADCASTING_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorChipping.h b/unsupported/Eigen/CXX11/src/Tensor/TensorChipping.h
index 6529d47..8a784af 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorChipping.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorChipping.h
@@ -16,17 +16,16 @@
 namespace Eigen {
 
 /** \class TensorKChippingReshaping
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief A chip is a thin slice, corresponding to a column or a row in a 2-d tensor.
-  *
-  *
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief A chip is a thin slice, corresponding to a column or a row in a 2-d tensor.
+ *
+ *
+ */
 
 namespace internal {
-template<DenseIndex DimId, typename XprType>
-struct traits<TensorChippingOp<DimId, XprType> > : public traits<XprType>
-{
+template <DenseIndex DimId, typename XprType>
+struct traits<TensorChippingOp<DimId, XprType> > : public traits<XprType> {
   typedef typename XprType::Scalar Scalar;
   typedef traits<XprType> XprTraits;
   typedef typename XprTraits::StorageKind StorageKind;
@@ -38,88 +37,69 @@
   typedef typename XprTraits::PointerType PointerType;
 };
 
-template<DenseIndex DimId, typename XprType>
-struct eval<TensorChippingOp<DimId, XprType>, Eigen::Dense>
-{
+template <DenseIndex DimId, typename XprType>
+struct eval<TensorChippingOp<DimId, XprType>, Eigen::Dense> {
   typedef const TensorChippingOp<DimId, XprType> EIGEN_DEVICE_REF type;
 };
 
-template<DenseIndex DimId, typename XprType>
-struct nested<TensorChippingOp<DimId, XprType>, 1, typename eval<TensorChippingOp<DimId, XprType> >::type>
-{
+template <DenseIndex DimId, typename XprType>
+struct nested<TensorChippingOp<DimId, XprType>, 1, typename eval<TensorChippingOp<DimId, XprType> >::type> {
   typedef TensorChippingOp<DimId, XprType> type;
 };
 
 template <DenseIndex DimId>
-struct DimensionId
-{
+struct DimensionId {
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DimensionId(DenseIndex dim) {
     EIGEN_UNUSED_VARIABLE(dim);
     eigen_assert(dim == DimId);
   }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DenseIndex actualDim() const {
-    return DimId;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DenseIndex actualDim() const { return DimId; }
 };
 template <>
-struct DimensionId<Dynamic>
-{
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DimensionId(DenseIndex dim) : actual_dim(dim) {
-    eigen_assert(dim >= 0);
-  }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DenseIndex actualDim() const {
-    return actual_dim;
-  }
+struct DimensionId<Dynamic> {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DimensionId(DenseIndex dim) : actual_dim(dim) { eigen_assert(dim >= 0); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DenseIndex actualDim() const { return actual_dim; }
+
  private:
   const DenseIndex actual_dim;
 };
 
-
 }  // end namespace internal
 
+template <DenseIndex DimId, typename XprType>
+class TensorChippingOp : public TensorBase<TensorChippingOp<DimId, XprType> > {
+ public:
+  typedef TensorBase<TensorChippingOp<DimId, XprType> > Base;
+  typedef typename Eigen::internal::traits<TensorChippingOp>::Scalar Scalar;
+  typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
+  typedef typename XprType::CoeffReturnType CoeffReturnType;
+  typedef typename Eigen::internal::nested<TensorChippingOp>::type Nested;
+  typedef typename Eigen::internal::traits<TensorChippingOp>::StorageKind StorageKind;
+  typedef typename Eigen::internal::traits<TensorChippingOp>::Index Index;
 
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorChippingOp(const XprType& expr, const Index offset, const Index dim)
+      : m_xpr(expr), m_offset(offset), m_dim(dim) {}
 
-template<DenseIndex DimId, typename XprType>
-class TensorChippingOp : public TensorBase<TensorChippingOp<DimId, XprType> >
-{
-  public:
-    typedef TensorBase<TensorChippingOp<DimId, XprType> > Base;
-    typedef typename Eigen::internal::traits<TensorChippingOp>::Scalar Scalar;
-    typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
-    typedef typename XprType::CoeffReturnType CoeffReturnType;
-    typedef typename Eigen::internal::nested<TensorChippingOp>::type Nested;
-    typedef typename Eigen::internal::traits<TensorChippingOp>::StorageKind StorageKind;
-    typedef typename Eigen::internal::traits<TensorChippingOp>::Index Index;
+  EIGEN_DEVICE_FUNC const Index offset() const { return m_offset; }
+  EIGEN_DEVICE_FUNC const Index dim() const { return m_dim.actualDim(); }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorChippingOp(const XprType& expr, const Index offset, const Index dim)
-        : m_xpr(expr), m_offset(offset), m_dim(dim) {
-    }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename XprType::Nested>& expression() const { return m_xpr; }
 
-    EIGEN_DEVICE_FUNC
-    const Index offset() const { return m_offset; }
-    EIGEN_DEVICE_FUNC
-    const Index dim() const { return m_dim.actualDim(); }
+  EIGEN_TENSOR_INHERIT_ASSIGNMENT_OPERATORS(TensorChippingOp)
 
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<typename XprType::Nested>&
-    expression() const { return m_xpr; }
-
-    EIGEN_TENSOR_INHERIT_ASSIGNMENT_OPERATORS(TensorChippingOp)
-
-  protected:
-    typename XprType::Nested m_xpr;
-    const Index m_offset;
-    const internal::DimensionId<DimId> m_dim;
+ protected:
+  typename XprType::Nested m_xpr;
+  const Index m_offset;
+  const internal::DimensionId<DimId> m_dim;
 };
 
-
 // Eval as rvalue
-template<DenseIndex DimId, typename ArgType, typename Device>
-struct TensorEvaluator<const TensorChippingOp<DimId, ArgType>, Device>
-{
+template <DenseIndex DimId, typename ArgType, typename Device>
+struct TensorEvaluator<const TensorChippingOp<DimId, ArgType>, Device> {
   typedef TensorChippingOp<DimId, ArgType> XprType;
-  static constexpr int NumInputDims = internal::array_size<typename TensorEvaluator<ArgType, Device>::Dimensions>::value;
-  static constexpr int NumDims = NumInputDims-1;
+  static constexpr int NumInputDims =
+      internal::array_size<typename TensorEvaluator<ArgType, Device>::Dimensions>::value;
+  static constexpr int NumDims = NumInputDims - 1;
   typedef typename XprType::Index Index;
   typedef DSizes<Index, NumDims> Dimensions;
   typedef typename XprType::Scalar Scalar;
@@ -133,22 +113,19 @@
   enum {
     // Alignment can't be guaranteed at compile time since it depends on the
     // slice offsets.
-    IsAligned         = false,
-    PacketAccess      = TensorEvaluator<ArgType, Device>::PacketAccess,
-    BlockAccess       = TensorEvaluator<ArgType, Device>::BlockAccess,
+    IsAligned = false,
+    PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
+    BlockAccess = TensorEvaluator<ArgType, Device>::BlockAccess,
     // Chipping of outer-most dimension is a trivial operation, because we can
     // read and write directly from the underlying tensor using single offset.
-    IsOuterChipping   = (Layout == ColMajor && DimId == NumInputDims - 1) ||
-                        (Layout == RowMajor && DimId == 0),
+    IsOuterChipping = (Layout == ColMajor && DimId == NumInputDims - 1) || (Layout == RowMajor && DimId == 0),
     // Chipping inner-most dimension.
-    IsInnerChipping   = (Layout == ColMajor && DimId == 0) ||
-                        (Layout == RowMajor && DimId == NumInputDims - 1),
+    IsInnerChipping = (Layout == ColMajor && DimId == 0) || (Layout == RowMajor && DimId == NumInputDims - 1),
     // Prefer block access if the underlying expression prefers it, otherwise
     // only if chipping is not trivial.
-    PreferBlockAccess = TensorEvaluator<ArgType, Device>::PreferBlockAccess ||
-                        !IsOuterChipping,
-    CoordAccess       = false,  // to be implemented
-    RawAccess         = false
+    PreferBlockAccess = TensorEvaluator<ArgType, Device>::PreferBlockAccess || !IsOuterChipping,
+    CoordAccess = false,  // to be implemented
+    RawAccess = false
   };
 
   typedef std::remove_const_t<Scalar> ScalarNoConst;
@@ -157,19 +134,14 @@
   typedef internal::TensorBlockDescriptor<NumDims, Index> TensorBlockDesc;
   typedef internal::TensorBlockScratchAllocator<Device> TensorBlockScratch;
 
-  typedef internal::TensorBlockDescriptor<NumInputDims, Index>
-      ArgTensorBlockDesc;
-  typedef typename TensorEvaluator<const ArgType, Device>::TensorBlock
-      ArgTensorBlock;
+  typedef internal::TensorBlockDescriptor<NumInputDims, Index> ArgTensorBlockDesc;
+  typedef typename TensorEvaluator<const ArgType, Device>::TensorBlock ArgTensorBlock;
 
-  typedef typename internal::TensorMaterializedBlock<ScalarNoConst, NumDims,
-                                                     Layout, Index>
-      TensorBlock;
+  typedef typename internal::TensorMaterializedBlock<ScalarNoConst, NumDims, Layout, Index> TensorBlock;
   //===--------------------------------------------------------------------===//
 
   EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
-      : m_impl(op.expression(), device), m_dim(op.dim()), m_device(device)
-  {
+      : m_impl(op.expression(), device), m_dim(op.dim()), m_device(device) {
     EIGEN_STATIC_ASSERT((NumInputDims >= 1), YOU_MADE_A_PROGRAMMING_MISTAKE);
     eigen_assert(NumInputDims > m_dim.actualDim());
 
@@ -192,7 +164,7 @@
         m_inputStride *= input_dims[i];
       }
     } else {
-      for (int i = NumInputDims-1; i > m_dim.actualDim(); --i) {
+      for (int i = NumInputDims - 1; i > m_dim.actualDim(); --i) {
         m_stride *= input_dims[i];
         m_inputStride *= input_dims[i];
       }
@@ -208,19 +180,15 @@
     return true;
   }
 
-  EIGEN_STRONG_INLINE void cleanup() {
-    m_impl.cleanup();
-  }
+  EIGEN_STRONG_INLINE void cleanup() { m_impl.cleanup(); }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
     return m_impl.coeff(srcCoeff(index));
   }
 
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const
-  {
-    eigen_assert(index+PacketSize-1 < dimensions().TotalSize());
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const {
+    eigen_assert(index + PacketSize - 1 < dimensions().TotalSize());
 
     if (isInnerChipping()) {
       // m_stride is equal to 1, so let's avoid the integer division.
@@ -247,7 +215,7 @@
       } else {
         // Cross the stride boundary. Fallback to slow path.
         EIGEN_ALIGN_MAX std::remove_const_t<CoeffReturnType> values[PacketSize];
-       EIGEN_UNROLL_LOOP
+        EIGEN_UNROLL_LOOP
         for (int i = 0; i < PacketSize; ++i) {
           values[i] = coeff(index);
           ++index;
@@ -258,47 +226,34 @@
     }
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost
-  costPerCoeff(bool vectorized) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const {
     double cost = 0;
-    if ((static_cast<int>(Layout) == static_cast<int>(ColMajor) &&
-         m_dim.actualDim() == 0) ||
-        (static_cast<int>(Layout) == static_cast<int>(RowMajor) &&
-         m_dim.actualDim() == NumInputDims - 1)) {
+    if ((static_cast<int>(Layout) == static_cast<int>(ColMajor) && m_dim.actualDim() == 0) ||
+        (static_cast<int>(Layout) == static_cast<int>(RowMajor) && m_dim.actualDim() == NumInputDims - 1)) {
       cost += TensorOpCost::MulCost<Index>() + TensorOpCost::AddCost<Index>();
-    } else if ((static_cast<int>(Layout) == static_cast<int>(ColMajor) &&
-                m_dim.actualDim() == NumInputDims - 1) ||
-               (static_cast<int>(Layout) == static_cast<int>(RowMajor) &&
-                m_dim.actualDim() == 0)) {
+    } else if ((static_cast<int>(Layout) == static_cast<int>(ColMajor) && m_dim.actualDim() == NumInputDims - 1) ||
+               (static_cast<int>(Layout) == static_cast<int>(RowMajor) && m_dim.actualDim() == 0)) {
       cost += TensorOpCost::AddCost<Index>();
     } else {
-      cost += 3 * TensorOpCost::MulCost<Index>() + TensorOpCost::DivCost<Index>() +
-              3 * TensorOpCost::AddCost<Index>();
+      cost += 3 * TensorOpCost::MulCost<Index>() + TensorOpCost::DivCost<Index>() + 3 * TensorOpCost::AddCost<Index>();
     }
 
-    return m_impl.costPerCoeff(vectorized) +
-           TensorOpCost(0, 0, cost, vectorized, PacketSize);
+    return m_impl.costPerCoeff(vectorized) + TensorOpCost(0, 0, cost, vectorized, PacketSize);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  internal::TensorBlockResourceRequirements getResourceRequirements() const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE internal::TensorBlockResourceRequirements getResourceRequirements() const {
     const size_t target_size = m_device.lastLevelCacheSize();
     return internal::TensorBlockResourceRequirements::merge(
-        internal::TensorBlockResourceRequirements::skewed<Scalar>(target_size),
-        m_impl.getResourceRequirements());
+        internal::TensorBlockResourceRequirements::skewed<Scalar>(target_size), m_impl.getResourceRequirements());
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock
-  block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
-          bool root_of_expr_ast = false) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
+                                                          bool root_of_expr_ast = false) const {
     const Index chip_dim = m_dim.actualDim();
 
     DSizes<Index, NumInputDims> input_block_dims;
     for (int i = 0; i < NumInputDims; ++i) {
-      input_block_dims[i]
-            = i < chip_dim ? desc.dimension(i)
-            : i > chip_dim ? desc.dimension(i - 1)
-            : 1;
+      input_block_dims[i] = i < chip_dim ? desc.dimension(i) : i > chip_dim ? desc.dimension(i - 1) : 1;
     }
 
     ArgTensorBlockDesc arg_desc(srcCoeff(desc.offset()), input_block_dims);
@@ -307,15 +262,13 @@
     if (desc.HasDestinationBuffer()) {
       DSizes<Index, NumInputDims> arg_destination_strides;
       for (int i = 0; i < NumInputDims; ++i) {
-      arg_destination_strides[i]
-            = i < chip_dim ? desc.destination().strides()[i]
-            : i > chip_dim ? desc.destination().strides()[i - 1]
-            : 0; // for dimensions of size `1` stride should never be used.
+        arg_destination_strides[i] = i < chip_dim   ? desc.destination().strides()[i]
+                                     : i > chip_dim ? desc.destination().strides()[i - 1]
+                                                    : 0;  // for dimensions of size `1` stride should never be used.
       }
 
-      arg_desc.template AddDestinationBuffer<Layout>(
-          desc.destination().template data<ScalarNoConst>(),
-          arg_destination_strides);
+      arg_desc.template AddDestinationBuffer<Layout>(desc.destination().template data<ScalarNoConst>(),
+                                                     arg_destination_strides);
     }
 
     ArgTensorBlock arg_block = m_impl.block(arg_desc, scratch, root_of_expr_ast);
@@ -323,25 +276,20 @@
 
     if (arg_block.data() != NULL) {
       // Forward argument block buffer if possible.
-      return TensorBlock(arg_block.kind(), arg_block.data(),
-                           desc.dimensions());
+      return TensorBlock(arg_block.kind(), arg_block.data(), desc.dimensions());
 
     } else {
       // Assign argument block expression to a buffer.
 
       // Prepare storage for the materialized chipping result.
-      const typename TensorBlock::Storage block_storage =
-          TensorBlock::prepareStorage(desc, scratch);
+      const typename TensorBlock::Storage block_storage = TensorBlock::prepareStorage(desc, scratch);
 
-      typedef internal::TensorBlockAssignment<
-          ScalarNoConst, NumInputDims, typename ArgTensorBlock::XprType, Index>
+      typedef internal::TensorBlockAssignment<ScalarNoConst, NumInputDims, typename ArgTensorBlock::XprType, Index>
           TensorBlockAssignment;
 
       TensorBlockAssignment::Run(
-          TensorBlockAssignment::target(
-              arg_desc.dimensions(),
-              internal::strides<Layout>(arg_desc.dimensions()),
-              block_storage.data()),
+          TensorBlockAssignment::target(arg_desc.dimensions(), internal::strides<Layout>(arg_desc.dimensions()),
+                                        block_storage.data()),
           arg_block.expr());
 
       return block_storage.AsTensorMaterializedBlock();
@@ -358,8 +306,7 @@
   }
 
  protected:
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index srcCoeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index srcCoeff(Index index) const {
     Index inputIndex;
     if (isInnerChipping()) {
       // m_stride is equal to 1, so let's avoid the integer division.
@@ -380,14 +327,12 @@
   }
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool isInnerChipping() const {
-    return IsInnerChipping ||
-           (static_cast<int>(Layout) == ColMajor && m_dim.actualDim() == 0) ||
+    return IsInnerChipping || (static_cast<int>(Layout) == ColMajor && m_dim.actualDim() == 0) ||
            (static_cast<int>(Layout) == RowMajor && m_dim.actualDim() == NumInputDims - 1);
   }
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool isOuterChipping() const {
-    return IsOuterChipping ||
-           (static_cast<int>(Layout) == ColMajor && m_dim.actualDim() == NumInputDims-1) ||
+    return IsOuterChipping || (static_cast<int>(Layout) == ColMajor && m_dim.actualDim() == NumInputDims - 1) ||
            (static_cast<int>(Layout) == RowMajor && m_dim.actualDim() == 0);
   }
 
@@ -400,16 +345,15 @@
   const Device EIGEN_DEVICE_REF m_device;
 };
 
-
 // Eval as lvalue
-template<DenseIndex DimId, typename ArgType, typename Device>
+template <DenseIndex DimId, typename ArgType, typename Device>
 struct TensorEvaluator<TensorChippingOp<DimId, ArgType>, Device>
-  : public TensorEvaluator<const TensorChippingOp<DimId, ArgType>, Device>
-{
+    : public TensorEvaluator<const TensorChippingOp<DimId, ArgType>, Device> {
   typedef TensorEvaluator<const TensorChippingOp<DimId, ArgType>, Device> Base;
   typedef TensorChippingOp<DimId, ArgType> XprType;
-  static constexpr int NumInputDims = internal::array_size<typename TensorEvaluator<ArgType, Device>::Dimensions>::value;
-  static constexpr int NumDims = NumInputDims-1;
+  static constexpr int NumInputDims =
+      internal::array_size<typename TensorEvaluator<ArgType, Device>::Dimensions>::value;
+  static constexpr int NumDims = NumInputDims - 1;
   typedef typename XprType::Index Index;
   typedef DSizes<Index, NumDims> Dimensions;
   typedef typename XprType::Scalar Scalar;
@@ -418,29 +362,25 @@
   static constexpr int PacketSize = PacketType<CoeffReturnType, Device>::size;
 
   enum {
-    IsAligned     = false,
-    PacketAccess  = TensorEvaluator<ArgType, Device>::PacketAccess,
-    BlockAccess   = TensorEvaluator<ArgType, Device>::RawAccess,
-    Layout        = TensorEvaluator<ArgType, Device>::Layout,
-    RawAccess     = false
+    IsAligned = false,
+    PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
+    BlockAccess = TensorEvaluator<ArgType, Device>::RawAccess,
+    Layout = TensorEvaluator<ArgType, Device>::Layout,
+    RawAccess = false
   };
 
   //===- Tensor block evaluation strategy (see TensorBlock.h) -------------===//
   typedef internal::TensorBlockDescriptor<NumDims, Index> TensorBlockDesc;
   //===--------------------------------------------------------------------===//
 
-  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
-    : Base(op, device)
-    { }
+  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) : Base(op, device) {}
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType& coeffRef(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType& coeffRef(Index index) const {
     return this->m_impl.coeffRef(this->srcCoeff(index));
   }
 
-  template <int StoreMode> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  void writePacket(Index index, const PacketReturnType& x) const
-  {
+  template <int StoreMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void writePacket(Index index, const PacketReturnType& x) const {
     if (this->isInnerChipping()) {
       // m_stride is equal to 1, so let's avoid the integer division.
       eigen_assert(this->m_stride == 1);
@@ -476,37 +416,27 @@
   }
 
   template <typename TensorBlock>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void writeBlock(
-      const TensorBlockDesc& desc, const TensorBlock& block) {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void writeBlock(const TensorBlockDesc& desc, const TensorBlock& block) {
     eigen_assert(this->m_impl.data() != NULL);
 
     const Index chip_dim = this->m_dim.actualDim();
 
     DSizes<Index, NumInputDims> input_block_dims;
     for (int i = 0; i < NumInputDims; ++i) {
-      input_block_dims[i] = i < chip_dim ? desc.dimension(i)
-                          : i > chip_dim ? desc.dimension(i - 1)
-                          : 1;
+      input_block_dims[i] = i < chip_dim ? desc.dimension(i) : i > chip_dim ? desc.dimension(i - 1) : 1;
     }
 
-    typedef TensorReshapingOp<const DSizes<Index, NumInputDims>,
-                              const typename TensorBlock::XprType>
-        TensorBlockExpr;
+    typedef TensorReshapingOp<const DSizes<Index, NumInputDims>, const typename TensorBlock::XprType> TensorBlockExpr;
 
-    typedef internal::TensorBlockAssignment<Scalar, NumInputDims,
-                                            TensorBlockExpr, Index>
-        TensorBlockAssign;
+    typedef internal::TensorBlockAssignment<Scalar, NumInputDims, TensorBlockExpr, Index> TensorBlockAssign;
 
     TensorBlockAssign::Run(
-        TensorBlockAssign::target(
-            input_block_dims,
-            internal::strides<Layout>(this->m_impl.dimensions()),
-            this->m_impl.data(), this->srcCoeff(desc.offset())),
+        TensorBlockAssign::target(input_block_dims, internal::strides<Layout>(this->m_impl.dimensions()),
+                                  this->m_impl.data(), this->srcCoeff(desc.offset())),
         block.expr().reshape(input_block_dims));
   }
 };
 
+}  // end namespace Eigen
 
-} // end namespace Eigen
-
-#endif // EIGEN_CXX11_TENSOR_TENSOR_CHIPPING_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_CHIPPING_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorConcatenation.h b/unsupported/Eigen/CXX11/src/Tensor/TensorConcatenation.h
index 9337e67..e9c130d 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorConcatenation.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorConcatenation.h
@@ -16,23 +16,21 @@
 namespace Eigen {
 
 /** \class TensorConcatenationOp
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Tensor concatenation class.
-  *
-  *
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Tensor concatenation class.
+ *
+ *
+ */
 namespace internal {
-template<typename Axis, typename LhsXprType, typename RhsXprType>
-struct traits<TensorConcatenationOp<Axis, LhsXprType, RhsXprType> >
-{
+template <typename Axis, typename LhsXprType, typename RhsXprType>
+struct traits<TensorConcatenationOp<Axis, LhsXprType, RhsXprType> > {
   // Type promotion to handle the case where the types of the lhs and the rhs are different.
-  typedef typename promote_storage_type<typename LhsXprType::Scalar,
-                                        typename RhsXprType::Scalar>::ret Scalar;
+  typedef typename promote_storage_type<typename LhsXprType::Scalar, typename RhsXprType::Scalar>::ret Scalar;
   typedef typename promote_storage_type<typename traits<LhsXprType>::StorageKind,
                                         typename traits<RhsXprType>::StorageKind>::ret StorageKind;
-  typedef typename promote_index_type<typename traits<LhsXprType>::Index,
-                                      typename traits<RhsXprType>::Index>::type Index;
+  typedef
+      typename promote_index_type<typename traits<LhsXprType>::Index, typename traits<RhsXprType>::Index>::type Index;
   typedef typename LhsXprType::Nested LhsNested;
   typedef typename RhsXprType::Nested RhsNested;
   typedef std::remove_reference_t<LhsNested> LhsNested_;
@@ -41,66 +39,63 @@
   static constexpr int Layout = traits<LhsXprType>::Layout;
   enum { Flags = 0 };
   typedef std::conditional_t<Pointer_type_promotion<typename LhsXprType::Scalar, Scalar>::val,
-                        typename traits<LhsXprType>::PointerType, typename traits<RhsXprType>::PointerType> PointerType;
+                             typename traits<LhsXprType>::PointerType, typename traits<RhsXprType>::PointerType>
+      PointerType;
 };
 
-template<typename Axis, typename LhsXprType, typename RhsXprType>
-struct eval<TensorConcatenationOp<Axis, LhsXprType, RhsXprType>, Eigen::Dense>
-{
+template <typename Axis, typename LhsXprType, typename RhsXprType>
+struct eval<TensorConcatenationOp<Axis, LhsXprType, RhsXprType>, Eigen::Dense> {
   typedef const TensorConcatenationOp<Axis, LhsXprType, RhsXprType>& type;
 };
 
-template<typename Axis, typename LhsXprType, typename RhsXprType>
-struct nested<TensorConcatenationOp<Axis, LhsXprType, RhsXprType>, 1, typename eval<TensorConcatenationOp<Axis, LhsXprType, RhsXprType> >::type>
-{
+template <typename Axis, typename LhsXprType, typename RhsXprType>
+struct nested<TensorConcatenationOp<Axis, LhsXprType, RhsXprType>, 1,
+              typename eval<TensorConcatenationOp<Axis, LhsXprType, RhsXprType> >::type> {
   typedef TensorConcatenationOp<Axis, LhsXprType, RhsXprType> type;
 };
 
 }  // end namespace internal
 
+template <typename Axis, typename LhsXprType, typename RhsXprType>
+class TensorConcatenationOp : public TensorBase<TensorConcatenationOp<Axis, LhsXprType, RhsXprType>, WriteAccessors> {
+ public:
+  typedef TensorBase<TensorConcatenationOp<Axis, LhsXprType, RhsXprType>, WriteAccessors> Base;
+  typedef typename internal::traits<TensorConcatenationOp>::Scalar Scalar;
+  typedef typename internal::traits<TensorConcatenationOp>::StorageKind StorageKind;
+  typedef typename internal::traits<TensorConcatenationOp>::Index Index;
+  typedef typename internal::nested<TensorConcatenationOp>::type Nested;
+  typedef typename internal::promote_storage_type<typename LhsXprType::CoeffReturnType,
+                                                  typename RhsXprType::CoeffReturnType>::ret CoeffReturnType;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
 
-template<typename Axis, typename LhsXprType, typename RhsXprType>
-class TensorConcatenationOp : public TensorBase<TensorConcatenationOp<Axis, LhsXprType, RhsXprType>, WriteAccessors>
-{
-  public:
-    typedef TensorBase<TensorConcatenationOp<Axis, LhsXprType, RhsXprType>, WriteAccessors> Base;
-    typedef typename internal::traits<TensorConcatenationOp>::Scalar Scalar;
-    typedef typename internal::traits<TensorConcatenationOp>::StorageKind StorageKind;
-    typedef typename internal::traits<TensorConcatenationOp>::Index Index;
-    typedef typename internal::nested<TensorConcatenationOp>::type Nested;
-    typedef typename internal::promote_storage_type<typename LhsXprType::CoeffReturnType,
-                                                    typename RhsXprType::CoeffReturnType>::ret CoeffReturnType;
-    typedef typename NumTraits<Scalar>::Real RealScalar;
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorConcatenationOp(const LhsXprType& lhs, const RhsXprType& rhs, Axis axis)
+      : m_lhs_xpr(lhs), m_rhs_xpr(rhs), m_axis(axis) {}
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorConcatenationOp(const LhsXprType& lhs, const RhsXprType& rhs, Axis axis)
-        : m_lhs_xpr(lhs), m_rhs_xpr(rhs), m_axis(axis) {}
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename LhsXprType::Nested>& lhsExpression() const {
+    return m_lhs_xpr;
+  }
 
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<typename LhsXprType::Nested>&
-    lhsExpression() const { return m_lhs_xpr; }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename RhsXprType::Nested>& rhsExpression() const {
+    return m_rhs_xpr;
+  }
 
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<typename RhsXprType::Nested>&
-    rhsExpression() const { return m_rhs_xpr; }
+  EIGEN_DEVICE_FUNC const Axis& axis() const { return m_axis; }
 
-    EIGEN_DEVICE_FUNC const Axis& axis() const { return m_axis; }
-
-    EIGEN_TENSOR_INHERIT_ASSIGNMENT_OPERATORS(TensorConcatenationOp)
-  protected:
-    typename LhsXprType::Nested m_lhs_xpr;
-    typename RhsXprType::Nested m_rhs_xpr;
-    const Axis m_axis;
+  EIGEN_TENSOR_INHERIT_ASSIGNMENT_OPERATORS(TensorConcatenationOp)
+ protected:
+  typename LhsXprType::Nested m_lhs_xpr;
+  typename RhsXprType::Nested m_rhs_xpr;
+  const Axis m_axis;
 };
 
-
 // Eval as rvalue
-template<typename Axis, typename LeftArgType, typename RightArgType, typename Device>
-struct TensorEvaluator<const TensorConcatenationOp<Axis, LeftArgType, RightArgType>, Device>
-{
+template <typename Axis, typename LeftArgType, typename RightArgType, typename Device>
+struct TensorEvaluator<const TensorConcatenationOp<Axis, LeftArgType, RightArgType>, Device> {
   typedef TensorConcatenationOp<Axis, LeftArgType, RightArgType> XprType;
   typedef typename XprType::Index Index;
   static constexpr int NumDims = internal::array_size<typename TensorEvaluator<LeftArgType, Device>::Dimensions>::value;
-  static constexpr int RightNumDims = internal::array_size<typename TensorEvaluator<RightArgType, Device>::Dimensions>::value;
+  static constexpr int RightNumDims =
+      internal::array_size<typename TensorEvaluator<RightArgType, Device>::Dimensions>::value;
   typedef DSizes<Index, NumDims> Dimensions;
   typedef typename XprType::Scalar Scalar;
   typedef typename XprType::CoeffReturnType CoeffReturnType;
@@ -109,13 +104,13 @@
   typedef typename Storage::Type EvaluatorPointerType;
   static constexpr int Layout = TensorEvaluator<LeftArgType, Device>::Layout;
   enum {
-    IsAligned         = false,
-    PacketAccess      = TensorEvaluator<LeftArgType, Device>::PacketAccess &&
-                        TensorEvaluator<RightArgType, Device>::PacketAccess,
-    BlockAccess       = false,
+    IsAligned = false,
+    PacketAccess =
+        TensorEvaluator<LeftArgType, Device>::PacketAccess && TensorEvaluator<RightArgType, Device>::PacketAccess,
+    BlockAccess = false,
     PreferBlockAccess = TensorEvaluator<LeftArgType, Device>::PreferBlockAccess ||
                         TensorEvaluator<RightArgType, Device>::PreferBlockAccess,
-    RawAccess         = false
+    RawAccess = false
   };
 
   //===- Tensor block evaluation strategy (see TensorBlock.h) -------------===//
@@ -123,9 +118,11 @@
   //===--------------------------------------------------------------------===//
 
   EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
-    : m_leftImpl(op.lhsExpression(), device), m_rightImpl(op.rhsExpression(), device), m_axis(op.axis())
-  {
-    EIGEN_STATIC_ASSERT((static_cast<int>(TensorEvaluator<LeftArgType, Device>::Layout) == static_cast<int>(TensorEvaluator<RightArgType, Device>::Layout) || NumDims == 1), YOU_MADE_A_PROGRAMMING_MISTAKE);
+      : m_leftImpl(op.lhsExpression(), device), m_rightImpl(op.rhsExpression(), device), m_axis(op.axis()) {
+    EIGEN_STATIC_ASSERT((static_cast<int>(TensorEvaluator<LeftArgType, Device>::Layout) ==
+                             static_cast<int>(TensorEvaluator<RightArgType, Device>::Layout) ||
+                         NumDims == 1),
+                        YOU_MADE_A_PROGRAMMING_MISTAKE);
     EIGEN_STATIC_ASSERT((NumDims == RightNumDims), YOU_MADE_A_PROGRAMMING_MISTAKE);
     EIGEN_STATIC_ASSERT((NumDims > 0), YOU_MADE_A_PROGRAMMING_MISTAKE);
 
@@ -155,9 +152,9 @@
       m_outputStrides[0] = 1;
 
       for (int j = 1; j < NumDims; ++j) {
-        m_leftStrides[j] = m_leftStrides[j-1] * lhs_dims[j-1];
-        m_rightStrides[j] = m_rightStrides[j-1] * rhs_dims[j-1];
-        m_outputStrides[j] = m_outputStrides[j-1] * m_dimensions[j-1];
+        m_leftStrides[j] = m_leftStrides[j - 1] * lhs_dims[j - 1];
+        m_rightStrides[j] = m_rightStrides[j - 1] * rhs_dims[j - 1];
+        m_outputStrides[j] = m_outputStrides[j - 1] * m_dimensions[j - 1];
       }
     } else {
       m_leftStrides[NumDims - 1] = 1;
@@ -165,9 +162,9 @@
       m_outputStrides[NumDims - 1] = 1;
 
       for (int j = NumDims - 2; j >= 0; --j) {
-        m_leftStrides[j] = m_leftStrides[j+1] * lhs_dims[j+1];
-        m_rightStrides[j] = m_rightStrides[j+1] * rhs_dims[j+1];
-        m_outputStrides[j] = m_outputStrides[j+1] * m_dimensions[j+1];
+        m_leftStrides[j] = m_leftStrides[j + 1] * lhs_dims[j + 1];
+        m_rightStrides[j] = m_rightStrides[j + 1] * rhs_dims[j + 1];
+        m_outputStrides[j] = m_outputStrides[j + 1] * m_dimensions[j + 1];
       }
     }
   }
@@ -175,23 +172,20 @@
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; }
 
   // TODO(phli): Add short-circuit memcpy evaluation if underlying data are linear?
-  EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType)
-  {
+  EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType) {
     m_leftImpl.evalSubExprsIfNeeded(NULL);
     m_rightImpl.evalSubExprsIfNeeded(NULL);
     return true;
   }
 
-  EIGEN_STRONG_INLINE void cleanup()
-  {
+  EIGEN_STRONG_INLINE void cleanup() {
     m_leftImpl.cleanup();
     m_rightImpl.cleanup();
   }
 
   // TODO(phli): attempt to speed this up. The integer divisions and modulo are slow.
   // See CL/76180724 comments for more ideas.
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
     // Collect dimension-wise indices (subs).
     array<Index, NumDims> subs;
     if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
@@ -247,9 +241,8 @@
   }
 
   // TODO(phli): Add a real vectorization.
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const
-  {
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const {
     const int packetSize = PacketType<CoeffReturnType, Device>::size;
     EIGEN_STATIC_ASSERT((packetSize > 1), YOU_MADE_A_PROGRAMMING_MISTAKE)
     eigen_assert(index + packetSize - 1 < dimensions().TotalSize());
@@ -257,65 +250,56 @@
     EIGEN_ALIGN_MAX CoeffReturnType values[packetSize];
     EIGEN_UNROLL_LOOP
     for (int i = 0; i < packetSize; ++i) {
-      values[i] = coeff(index+i);
+      values[i] = coeff(index + i);
     }
     PacketReturnType rslt = internal::pload<PacketReturnType>(values);
     return rslt;
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost
-  costPerCoeff(bool vectorized) const {
-    const double compute_cost = NumDims * (2 * TensorOpCost::AddCost<Index>() +
-                                           2 * TensorOpCost::MulCost<Index>() +
-                                           TensorOpCost::DivCost<Index>() +
-                                           TensorOpCost::ModCost<Index>());
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const {
+    const double compute_cost = NumDims * (2 * TensorOpCost::AddCost<Index>() + 2 * TensorOpCost::MulCost<Index>() +
+                                           TensorOpCost::DivCost<Index>() + TensorOpCost::ModCost<Index>());
     const double lhs_size = m_leftImpl.dimensions().TotalSize();
     const double rhs_size = m_rightImpl.dimensions().TotalSize();
-    return (lhs_size / (lhs_size + rhs_size)) *
-               m_leftImpl.costPerCoeff(vectorized) +
-           (rhs_size / (lhs_size + rhs_size)) *
-               m_rightImpl.costPerCoeff(vectorized) +
-           TensorOpCost(0, 0, compute_cost);
+    return (lhs_size / (lhs_size + rhs_size)) * m_leftImpl.costPerCoeff(vectorized) +
+           (rhs_size / (lhs_size + rhs_size)) * m_rightImpl.costPerCoeff(vectorized) + TensorOpCost(0, 0, compute_cost);
   }
 
   EIGEN_DEVICE_FUNC EvaluatorPointerType data() const { return NULL; }
 
-  protected:
-    Dimensions m_dimensions;
-    array<Index, NumDims> m_outputStrides;
-    array<Index, NumDims> m_leftStrides;
-    array<Index, NumDims> m_rightStrides;
-    TensorEvaluator<LeftArgType, Device> m_leftImpl;
-    TensorEvaluator<RightArgType, Device> m_rightImpl;
-    const Axis m_axis;
+ protected:
+  Dimensions m_dimensions;
+  array<Index, NumDims> m_outputStrides;
+  array<Index, NumDims> m_leftStrides;
+  array<Index, NumDims> m_rightStrides;
+  TensorEvaluator<LeftArgType, Device> m_leftImpl;
+  TensorEvaluator<RightArgType, Device> m_rightImpl;
+  const Axis m_axis;
 };
 
 // Eval as lvalue
-template<typename Axis, typename LeftArgType, typename RightArgType, typename Device>
-  struct TensorEvaluator<TensorConcatenationOp<Axis, LeftArgType, RightArgType>, Device>
-  : public TensorEvaluator<const TensorConcatenationOp<Axis, LeftArgType, RightArgType>, Device>
-{
+template <typename Axis, typename LeftArgType, typename RightArgType, typename Device>
+struct TensorEvaluator<TensorConcatenationOp<Axis, LeftArgType, RightArgType>, Device>
+    : public TensorEvaluator<const TensorConcatenationOp<Axis, LeftArgType, RightArgType>, Device> {
   typedef TensorEvaluator<const TensorConcatenationOp<Axis, LeftArgType, RightArgType>, Device> Base;
   typedef TensorConcatenationOp<Axis, LeftArgType, RightArgType> XprType;
   typedef typename Base::Dimensions Dimensions;
   static constexpr int Layout = TensorEvaluator<LeftArgType, Device>::Layout;
   enum {
-    IsAligned         = false,
-    PacketAccess      = TensorEvaluator<LeftArgType, Device>::PacketAccess &&
-                        TensorEvaluator<RightArgType, Device>::PacketAccess,
-    BlockAccess       = false,
+    IsAligned = false,
+    PacketAccess =
+        TensorEvaluator<LeftArgType, Device>::PacketAccess && TensorEvaluator<RightArgType, Device>::PacketAccess,
+    BlockAccess = false,
     PreferBlockAccess = TensorEvaluator<LeftArgType, Device>::PreferBlockAccess ||
                         TensorEvaluator<RightArgType, Device>::PreferBlockAccess,
-    RawAccess         = false
+    RawAccess = false
   };
 
   //===- Tensor block evaluation strategy (see TensorBlock.h) -------------===//
   typedef internal::TensorBlockNotImplemented TensorBlock;
   //===--------------------------------------------------------------------===//
 
-  EIGEN_STRONG_INLINE TensorEvaluator(XprType& op, const Device& device)
-    : Base(op, device)
-  {
+  EIGEN_STRONG_INLINE TensorEvaluator(XprType& op, const Device& device) : Base(op, device) {
     EIGEN_STATIC_ASSERT((static_cast<int>(Layout) == static_cast<int>(ColMajor)), YOU_MADE_A_PROGRAMMING_MISTAKE);
   }
 
@@ -324,8 +308,7 @@
   typedef typename XprType::CoeffReturnType CoeffReturnType;
   typedef typename PacketType<CoeffReturnType, Device>::type PacketReturnType;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType& coeffRef(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType& coeffRef(Index index) const {
     // Collect dimension-wise indices (subs).
     array<Index, Base::NumDims> subs;
     for (int i = Base::NumDims - 1; i > 0; --i) {
@@ -352,9 +335,8 @@
     }
   }
 
-  template <int StoreMode> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  void writePacket(Index index, const PacketReturnType& x) const
-  {
+  template <int StoreMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void writePacket(Index index, const PacketReturnType& x) const {
     const int packetSize = PacketType<CoeffReturnType, Device>::size;
     EIGEN_STATIC_ASSERT((packetSize > 1), YOU_MADE_A_PROGRAMMING_MISTAKE)
     eigen_assert(index + packetSize - 1 < this->dimensions().TotalSize());
@@ -362,11 +344,11 @@
     EIGEN_ALIGN_MAX CoeffReturnType values[packetSize];
     internal::pstore<CoeffReturnType, PacketReturnType>(values, x);
     for (int i = 0; i < packetSize; ++i) {
-      coeffRef(index+i) = values[i];
+      coeffRef(index + i) = values[i];
     }
   }
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_CXX11_TENSOR_TENSOR_CONCATENATION_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_CONCATENATION_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorContraction.h b/unsupported/Eigen/CXX11/src/Tensor/TensorContraction.h
index ec34885..6f1c974 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorContraction.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorContraction.h
@@ -16,57 +16,55 @@
 namespace Eigen {
 
 /** \class TensorContraction
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Tensor contraction class.
-  *
-  *
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Tensor contraction class.
+ *
+ *
+ */
 namespace internal {
 
-template<typename Dimensions, typename LhsXprType, typename RhsXprType, typename OutputKernelType>
-struct traits<TensorContractionOp<Dimensions, LhsXprType, RhsXprType, OutputKernelType> >
-{
+template <typename Dimensions, typename LhsXprType, typename RhsXprType, typename OutputKernelType>
+struct traits<TensorContractionOp<Dimensions, LhsXprType, RhsXprType, OutputKernelType>> {
   // Type promotion to handle the case where the types of the lhs and the rhs are different.
   typedef typename gebp_traits<std::remove_const_t<typename LhsXprType::Scalar>,
                                std::remove_const_t<typename RhsXprType::Scalar>>::ResScalar Scalar;
 
   typedef typename promote_storage_type<typename traits<LhsXprType>::StorageKind,
                                         typename traits<RhsXprType>::StorageKind>::ret StorageKind;
-  typedef typename promote_index_type<typename traits<LhsXprType>::Index,
-                                      typename traits<RhsXprType>::Index>::type Index;
+  typedef
+      typename promote_index_type<typename traits<LhsXprType>::Index, typename traits<RhsXprType>::Index>::type Index;
   typedef typename LhsXprType::Nested LhsNested;
   typedef typename RhsXprType::Nested RhsNested;
   typedef std::remove_reference_t<LhsNested> LhsNested_;
   typedef std::remove_reference_t<RhsNested> RhsNested_;
 
   // From NumDims below.
-  static constexpr int NumDimensions = traits<LhsXprType>::NumDimensions + traits<RhsXprType>::NumDimensions - 2 * array_size<Dimensions>::value;
+  static constexpr int NumDimensions =
+      traits<LhsXprType>::NumDimensions + traits<RhsXprType>::NumDimensions - 2 * array_size<Dimensions>::value;
   static constexpr int Layout = traits<LhsXprType>::Layout;
   typedef std::conditional_t<Pointer_type_promotion<typename LhsXprType::Scalar, Scalar>::val,
-                        typename traits<LhsXprType>::PointerType,
-                        typename traits<RhsXprType>::PointerType>
+                             typename traits<LhsXprType>::PointerType, typename traits<RhsXprType>::PointerType>
       PointerType;
 
-  enum {
-    Flags = 0
-  };
+  enum { Flags = 0 };
 };
 
-template<typename Dimensions, typename LhsXprType, typename RhsXprType, typename OutputKernelType>
-struct eval<TensorContractionOp<Dimensions, LhsXprType, RhsXprType, OutputKernelType>, Eigen::Dense>
-{
+template <typename Dimensions, typename LhsXprType, typename RhsXprType, typename OutputKernelType>
+struct eval<TensorContractionOp<Dimensions, LhsXprType, RhsXprType, OutputKernelType>, Eigen::Dense> {
   typedef const TensorContractionOp<Dimensions, LhsXprType, RhsXprType, OutputKernelType>& type;
 };
 
-template<typename Dimensions, typename LhsXprType, typename RhsXprType, typename OutputKernelType>
-struct nested<TensorContractionOp<Dimensions, LhsXprType, RhsXprType, OutputKernelType>, 1, typename eval<TensorContractionOp<Dimensions, LhsXprType, RhsXprType, OutputKernelType> >::type>
-{
+template <typename Dimensions, typename LhsXprType, typename RhsXprType, typename OutputKernelType>
+struct nested<TensorContractionOp<Dimensions, LhsXprType, RhsXprType, OutputKernelType>, 1,
+              typename eval<TensorContractionOp<Dimensions, LhsXprType, RhsXprType, OutputKernelType>>::type> {
   typedef TensorContractionOp<Dimensions, LhsXprType, RhsXprType, OutputKernelType> type;
 };
 
-template<typename Indices_, typename LeftArgType_, typename RightArgType_, typename OutputKernelType_, typename Device_>
-struct traits<TensorEvaluator<const TensorContractionOp<Indices_, LeftArgType_, RightArgType_, OutputKernelType_>, Device_> > {
+template <typename Indices_, typename LeftArgType_, typename RightArgType_, typename OutputKernelType_,
+          typename Device_>
+struct traits<
+    TensorEvaluator<const TensorContractionOp<Indices_, LeftArgType_, RightArgType_, OutputKernelType_>, Device_>> {
   typedef Indices_ Indices;
   typedef LeftArgType_ LeftArgType;
   typedef RightArgType_ RightArgType;
@@ -74,7 +72,8 @@
   typedef Device_ Device;
 
   // From NumDims below.
-  static constexpr int NumDimensions = traits<LeftArgType_>::NumDimensions + traits<RightArgType_>::NumDimensions - 2 * array_size<Indices_>::value;
+  static constexpr int NumDimensions =
+      traits<LeftArgType_>::NumDimensions + traits<RightArgType_>::NumDimensions - 2 * array_size<Indices_>::value;
 };
 
 // Helper class to allocate and deallocate temporary memory for packed buffers.
@@ -83,11 +82,8 @@
   typedef void* BlockMemHandle;
 
   template <typename Device>
-  EIGEN_DEVICE_FUNC static BlockMemHandle allocate(Device& d, const Index bm,
-                                                   const Index bk,
-                                                   const Index bn,
-                                                   LhsScalar** lhs_block,
-                                                   RhsScalar** rhs_block) {
+  EIGEN_DEVICE_FUNC static BlockMemHandle allocate(Device& d, const Index bm, const Index bk, const Index bn,
+                                                   LhsScalar** lhs_block, RhsScalar** rhs_block) {
     eigen_assert(lhs_block);
     eigen_assert(rhs_block);
     BlockSizes sz = ComputeLhsRhsBlockSizes(bm, bk, bn);
@@ -98,18 +94,16 @@
   }
 
   template <typename Device>
-  EIGEN_DEVICE_FUNC static BlockMemHandle allocateSlices(
-      Device& d, const Index bm, const Index bk, const Index bn,
-      const Index num_lhs, const Index num_rhs, const Index num_slices,
-      std::vector<LhsScalar*>* lhs_blocks,
-      std::vector<RhsScalar*>* rhs_blocks) {
+  EIGEN_DEVICE_FUNC static BlockMemHandle allocateSlices(Device& d, const Index bm, const Index bk, const Index bn,
+                                                         const Index num_lhs, const Index num_rhs,
+                                                         const Index num_slices, std::vector<LhsScalar*>* lhs_blocks,
+                                                         std::vector<RhsScalar*>* rhs_blocks) {
     eigen_assert(num_slices > 0);
     eigen_assert(num_lhs >= 0 && num_rhs >= 0);
     eigen_assert(num_lhs == 0 || lhs_blocks);
     eigen_assert(num_rhs == 0 || rhs_blocks);
     BlockSizes sz = ComputeLhsRhsBlockSizes(bm, bk, bn);
-    void* block_mem = d.allocate(
-        (num_lhs * sz.lhs_size + num_rhs * sz.rhs_size) * num_slices);
+    void* block_mem = d.allocate((num_lhs * sz.lhs_size + num_rhs * sz.rhs_size) * num_slices);
     eigen_assert(block_mem);
     char* mem = static_cast<char*>(block_mem);
 
@@ -139,9 +133,7 @@
     Index lhs_size;
     Index rhs_size;
   };
-  EIGEN_DEVICE_FUNC static BlockSizes ComputeLhsRhsBlockSizes(const Index bm,
-                                                              const Index bk,
-                                                              const Index bn) {
+  EIGEN_DEVICE_FUNC static BlockSizes ComputeLhsRhsBlockSizes(const Index bm, const Index bk, const Index bn) {
     Index align = numext::maxi(EIGEN_MAX_ALIGN_BYTES, 1);
     BlockSizes sz;
     sz.lhs_size = numext::div_ceil<Index>(bm * bk * sizeof(LhsScalar), align) * align;
@@ -178,17 +170,15 @@
 //   TensorContractionInputMapper, or some specialization of it based on the
 //   type of tensor expression (e.g. TensorImagePatchOp has optimized input
 //   mapper).
-template <typename ResScalar, typename LhsScalar, typename RhsScalar,
-    typename StorageIndex, typename OutputMapper, typename LhsMapper,
-    typename RhsMapper>
+template <typename ResScalar, typename LhsScalar, typename RhsScalar, typename StorageIndex, typename OutputMapper,
+          typename LhsMapper, typename RhsMapper>
 struct TensorContractionKernel {
   // True if `invoke()` supports `beta` in `C <- alpha * A * B + beta * C`
   // (otherwise beta should be always equal to 1).
   enum { HasBeta = false };
 
-  EIGEN_DEVICE_FUNC
-  TensorContractionKernel(StorageIndex m_, StorageIndex k_, StorageIndex n_,
-                          StorageIndex bm_, StorageIndex bk_, StorageIndex bn_)
+  EIGEN_DEVICE_FUNC TensorContractionKernel(StorageIndex m_, StorageIndex k_, StorageIndex n_, StorageIndex bm_,
+                                            StorageIndex bk_, StorageIndex bn_)
       : m(m_), k(k_), n(n_), bm(bm_), bk(bk_), bn(bn_) {}
 
   // Pack blocks of Lhs and Rhs into contiguous blocks in memory.
@@ -196,40 +186,32 @@
   typedef RhsScalar* RhsBlock;
 
   // Packed Lhs/Rhs block memory allocator.
-  typedef TensorContractionBlockMemAllocator<LhsScalar, RhsScalar>
-      BlockMemAllocator;
+  typedef TensorContractionBlockMemAllocator<LhsScalar, RhsScalar> BlockMemAllocator;
   typedef typename BlockMemAllocator::BlockMemHandle BlockMemHandle;
 
   typedef typename internal::gebp_traits<LhsScalar, RhsScalar> Traits;
 
-  typedef internal::gemm_pack_lhs<
-      LhsScalar, StorageIndex, typename LhsMapper::SubMapper, Traits::mr,
-      Traits::LhsProgress, typename Traits::LhsPacket4Packing, ColMajor>
+  typedef internal::gemm_pack_lhs<LhsScalar, StorageIndex, typename LhsMapper::SubMapper, Traits::mr,
+                                  Traits::LhsProgress, typename Traits::LhsPacket4Packing, ColMajor>
       LhsPacker;
 
-  typedef internal::gemm_pack_rhs<RhsScalar, StorageIndex,
-                                  typename RhsMapper::SubMapper, Traits::nr,
-                                  ColMajor>
+  typedef internal::gemm_pack_rhs<RhsScalar, StorageIndex, typename RhsMapper::SubMapper, Traits::nr, ColMajor>
       RhsPacker;
 
-  typedef internal::gebp_kernel<LhsScalar, RhsScalar, StorageIndex,
-                                OutputMapper, Traits::mr, Traits::nr,
-      /*ConjugateLhs*/ false, /*ConjugateRhs*/ false>
+  typedef internal::gebp_kernel<LhsScalar, RhsScalar, StorageIndex, OutputMapper, Traits::mr, Traits::nr,
+                                /*ConjugateLhs*/ false, /*ConjugateRhs*/ false>
       GebpKernel;
 
   template <typename Device>
-  EIGEN_DEVICE_FUNC BlockMemHandle allocate(Device& d, LhsBlock* lhs_block,
-                                            RhsBlock* rhs_block) {
+  EIGEN_DEVICE_FUNC BlockMemHandle allocate(Device& d, LhsBlock* lhs_block, RhsBlock* rhs_block) {
     return BlockMemAllocator::allocate(d, bm, bk, bn, lhs_block, rhs_block);
   }
 
   template <typename Device>
-  EIGEN_DEVICE_FUNC BlockMemHandle allocateSlices(
-      Device& d, const StorageIndex num_lhs, const StorageIndex num_rhs,
-      const StorageIndex num_slices, std::vector<LhsBlock>* lhs_blocks,
-      std::vector<RhsBlock>* rhs_blocks) {
-    return BlockMemAllocator::allocateSlices(
-        d, bm, bk, bn, num_lhs, num_rhs, num_slices, lhs_blocks, rhs_blocks);
+  EIGEN_DEVICE_FUNC BlockMemHandle allocateSlices(Device& d, const StorageIndex num_lhs, const StorageIndex num_rhs,
+                                                  const StorageIndex num_slices, std::vector<LhsBlock>* lhs_blocks,
+                                                  std::vector<RhsBlock>* rhs_blocks) {
+    return BlockMemAllocator::allocateSlices(d, bm, bk, bn, num_lhs, num_rhs, num_slices, lhs_blocks, rhs_blocks);
   }
 
   template <typename Device>
@@ -237,31 +219,28 @@
     BlockMemAllocator::deallocate(d, handle);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE void packLhs(
-      LhsBlock* lhsBlock, const typename LhsMapper::SubMapper& data_mapper,
-      const StorageIndex depth, const StorageIndex rows) {
+  EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE void packLhs(LhsBlock* lhsBlock, const typename LhsMapper::SubMapper& data_mapper,
+                                                   const StorageIndex depth, const StorageIndex rows) {
     LhsPacker()(*lhsBlock, data_mapper, depth, rows, /*stride*/ 0,
-        /*offset*/ 0);
+                /*offset*/ 0);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE void packRhs(
-      RhsBlock* rhsBlock, const typename RhsMapper::SubMapper& data_mapper,
-      const StorageIndex depth, const StorageIndex cols) {
+  EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE void packRhs(RhsBlock* rhsBlock, const typename RhsMapper::SubMapper& data_mapper,
+                                                   const StorageIndex depth, const StorageIndex cols) {
     RhsPacker()(*rhsBlock, data_mapper, depth, cols);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE void invoke(
-      const OutputMapper& output_mapper, const LhsBlock& lhsBlock,
-      const RhsBlock& rhsBlock, const StorageIndex rows,
-      const StorageIndex depth, const StorageIndex cols,
-      const ResScalar alpha, const ResScalar beta) {
+  EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE void invoke(const OutputMapper& output_mapper, const LhsBlock& lhsBlock,
+                                                  const RhsBlock& rhsBlock, const StorageIndex rows,
+                                                  const StorageIndex depth, const StorageIndex cols,
+                                                  const ResScalar alpha, const ResScalar beta) {
     // Default GEBP kernel does not support beta.
     eigen_assert(beta == ResScalar(1));
     static const int kComputeStrideFromBlockDimensions = -1;
     GebpKernel()(output_mapper, lhsBlock, rhsBlock, rows, depth, cols, alpha,
-        /*strideA*/ kComputeStrideFromBlockDimensions,
-        /*strideB*/ kComputeStrideFromBlockDimensions,
-        /*offsetA*/ 0, /*offsetB*/ 0);
+                 /*strideA*/ kComputeStrideFromBlockDimensions,
+                 /*strideB*/ kComputeStrideFromBlockDimensions,
+                 /*offsetA*/ 0, /*offsetB*/ 0);
   }
 
  private:
@@ -310,10 +289,9 @@
    * \param[in] num_cols Number of available columns
    */
   template <typename Index, typename Scalar>
-  EIGEN_ALWAYS_INLINE void operator()(
-      const internal::blas_data_mapper<Scalar, Index, ColMajor>& output_mapper,
-      const TensorContractionParams& params, Index i,
-      Index j, Index num_rows, Index num_cols) const {
+  EIGEN_ALWAYS_INLINE void operator()(const internal::blas_data_mapper<Scalar, Index, ColMajor>& output_mapper,
+                                      const TensorContractionParams& params, Index i, Index j, Index num_rows,
+                                      Index num_cols) const {
     EIGEN_UNUSED_VARIABLE(output_mapper);
     EIGEN_UNUSED_VARIABLE(params);
     EIGEN_UNUSED_VARIABLE(i);
@@ -323,10 +301,11 @@
   }
 };
 
-template<typename Indices, typename LhsXprType, typename RhsXprType, typename OutputKernelType = const NoOpOutputKernel>
-class TensorContractionOp : public TensorBase<TensorContractionOp<Indices, LhsXprType, RhsXprType, OutputKernelType>, ReadOnlyAccessors>
-{
-  public:
+template <typename Indices, typename LhsXprType, typename RhsXprType,
+          typename OutputKernelType = const NoOpOutputKernel>
+class TensorContractionOp
+    : public TensorBase<TensorContractionOp<Indices, LhsXprType, RhsXprType, OutputKernelType>, ReadOnlyAccessors> {
+ public:
   typedef typename Eigen::internal::traits<TensorContractionOp>::Scalar Scalar;
   typedef typename internal::gebp_traits<typename LhsXprType::CoeffReturnType,
                                          typename RhsXprType::CoeffReturnType>::ResScalar CoeffReturnType;
@@ -334,35 +313,32 @@
   typedef typename Eigen::internal::traits<TensorContractionOp>::StorageKind StorageKind;
   typedef typename Eigen::internal::traits<TensorContractionOp>::Index Index;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorContractionOp(
-      const LhsXprType& lhs, const RhsXprType& rhs, const Indices& dims,
-      const OutputKernelType& output_kernel = OutputKernelType())
-      : m_lhs_xpr(lhs), m_rhs_xpr(rhs), m_indices(dims),
-        m_output_kernel(output_kernel) {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorContractionOp(const LhsXprType& lhs, const RhsXprType& rhs,
+                                                            const Indices& dims,
+                                                            const OutputKernelType& output_kernel = OutputKernelType())
+      : m_lhs_xpr(lhs), m_rhs_xpr(rhs), m_indices(dims), m_output_kernel(output_kernel) {}
 
-  EIGEN_DEVICE_FUNC
-  const Indices& indices() const { return m_indices; }
+  EIGEN_DEVICE_FUNC const Indices& indices() const { return m_indices; }
 
   /** \returns the nested expressions */
-  EIGEN_DEVICE_FUNC
-  const internal::remove_all_t<typename LhsXprType::Nested>&
-  lhsExpression() const { return m_lhs_xpr; }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename LhsXprType::Nested>& lhsExpression() const {
+    return m_lhs_xpr;
+  }
 
-  EIGEN_DEVICE_FUNC
-  const internal::remove_all_t<typename RhsXprType::Nested>&
-  rhsExpression() const { return m_rhs_xpr; }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename RhsXprType::Nested>& rhsExpression() const {
+    return m_rhs_xpr;
+  }
 
-  EIGEN_DEVICE_FUNC
-  const OutputKernelType& outputKernel() const { return m_output_kernel; }
+  EIGEN_DEVICE_FUNC const OutputKernelType& outputKernel() const { return m_output_kernel; }
 
-  protected:
-    typename LhsXprType::Nested m_lhs_xpr;
-    typename RhsXprType::Nested m_rhs_xpr;
-    const Indices m_indices;
-    const OutputKernelType m_output_kernel;
+ protected:
+  typename LhsXprType::Nested m_lhs_xpr;
+  typename RhsXprType::Nested m_rhs_xpr;
+  const Indices m_indices;
+  const OutputKernelType m_output_kernel;
 };
 
-template<typename Derived>
+template <typename Derived>
 struct TensorContractionEvaluatorBase {
   typedef typename internal::traits<Derived>::Indices Indices;
   typedef typename internal::traits<Derived>::LeftArgType LeftArgType;
@@ -380,12 +356,12 @@
 
   static constexpr int Layout = TensorEvaluator<LeftArgType, Device>::Layout;
   enum {
-    IsAligned         = true,
-    PacketAccess      = (PacketType<CoeffReturnType, Device>::size > 1),
-    BlockAccess       = false,
+    IsAligned = true,
+    PacketAccess = (PacketType<CoeffReturnType, Device>::size > 1),
+    BlockAccess = false,
     PreferBlockAccess = false,
-    CoordAccess       = false,  // to be implemented
-    RawAccess         = true
+    CoordAccess = false,  // to be implemented
+    RawAccess = true
   };
 
   //===- Tensor block evaluation strategy (see TensorBlock.h) -------------===//
@@ -396,10 +372,10 @@
   // inputs are RowMajor, we will "cheat" by swapping the LHS and RHS:
   // If we want to compute A * B = C, where A is LHS and B is RHS, the code
   // will pretend B is LHS and A is RHS.
-  typedef std::conditional_t<
-    static_cast<int>(Layout) == static_cast<int>(ColMajor), LeftArgType, RightArgType> EvalLeftArgType;
-  typedef std::conditional_t<
-    static_cast<int>(Layout) == static_cast<int>(ColMajor), RightArgType, LeftArgType> EvalRightArgType;
+  typedef std::conditional_t<static_cast<int>(Layout) == static_cast<int>(ColMajor), LeftArgType, RightArgType>
+      EvalLeftArgType;
+  typedef std::conditional_t<static_cast<int>(Layout) == static_cast<int>(ColMajor), RightArgType, LeftArgType>
+      EvalRightArgType;
 
   typedef TensorEvaluator<EvalLeftArgType, Device> LeftEvaluatorType;
   typedef TensorEvaluator<EvalRightArgType, Device> RightEvaluatorType;
@@ -417,20 +393,20 @@
 
   typedef DSizes<Index, NumDims> Dimensions;
 
-  EIGEN_STRONG_INLINE
-  TensorContractionEvaluatorBase(const XprType& op, const Device& device)
-      : m_leftImpl(choose(Cond<static_cast<int>(Layout) == static_cast<int>(ColMajor)>(),
-                          op.lhsExpression(), op.rhsExpression()), device),
-        m_rightImpl(choose(Cond<static_cast<int>(Layout) == static_cast<int>(ColMajor)>(),
-                           op.rhsExpression(), op.lhsExpression()), device),
+  EIGEN_STRONG_INLINE TensorContractionEvaluatorBase(const XprType& op, const Device& device)
+      : m_leftImpl(choose(Cond<static_cast<int>(Layout) == static_cast<int>(ColMajor)>(), op.lhsExpression(),
+                          op.rhsExpression()),
+                   device),
+        m_rightImpl(choose(Cond<static_cast<int>(Layout) == static_cast<int>(ColMajor)>(), op.rhsExpression(),
+                           op.lhsExpression()),
+                    device),
         m_device(device),
         m_output_kernel(op.outputKernel()),
         m_result(NULL) {
     EIGEN_STATIC_ASSERT((static_cast<int>(TensorEvaluator<LeftArgType, Device>::Layout) ==
-         static_cast<int>(TensorEvaluator<RightArgType, Device>::Layout)),
+                         static_cast<int>(TensorEvaluator<RightArgType, Device>::Layout)),
                         YOU_MADE_A_PROGRAMMING_MISTAKE);
 
-
     DSizes<Index, LDims> eval_left_dims;
     DSizes<Index, RDims> eval_right_dims;
     array<IndexPair<Index>, ContractDims> eval_op_indices;
@@ -468,8 +444,7 @@
     for (int i = 0; i < ContractDims; i++) {
       for (int j = i + 1; j < ContractDims; j++) {
         eigen_assert(eval_op_indices[j].first != eval_op_indices[i].first &&
-                     eval_op_indices[j].second != eval_op_indices[i].second &&
-                     "contraction axes should be unique");
+                     eval_op_indices[j].second != eval_op_indices[i].second && "contraction axes should be unique");
         if (eval_op_indices[j].first < eval_op_indices[i].first) {
           numext::swap(eval_op_indices[j], eval_op_indices[i]);
         }
@@ -478,14 +453,14 @@
 
     array<Index, LDims> lhs_strides;
     lhs_strides[0] = 1;
-    for (int i = 0; i < LDims-1; ++i) {
-      lhs_strides[i+1] = lhs_strides[i] * eval_left_dims[i];
+    for (int i = 0; i < LDims - 1; ++i) {
+      lhs_strides[i + 1] = lhs_strides[i] * eval_left_dims[i];
     }
 
     array<Index, RDims> rhs_strides;
     rhs_strides[0] = 1;
-    for (int i = 0; i < RDims-1; ++i) {
-      rhs_strides[i+1] = rhs_strides[i] * eval_right_dims[i];
+    for (int i = 0; i < RDims - 1; ++i) {
+      rhs_strides[i + 1] = rhs_strides[i] * eval_right_dims[i];
     }
 
     if (m_i_strides.size() > 0) m_i_strides[0] = 1;
@@ -520,9 +495,8 @@
         if (dim_idx != i) {
           m_lhs_inner_dim_contiguous = false;
         }
-        if (nocontract_idx+1 < internal::array_size<left_nocontract_t>::value) {
-          m_i_strides[nocontract_idx+1] =
-              m_i_strides[nocontract_idx] * eval_left_dims[i];
+        if (nocontract_idx + 1 < internal::array_size<left_nocontract_t>::value) {
+          m_i_strides[nocontract_idx + 1] = m_i_strides[nocontract_idx] * eval_left_dims[i];
         } else {
           m_i_size = m_i_strides[nocontract_idx] * eval_left_dims[i];
         }
@@ -543,9 +517,8 @@
       }
       if (!contracting) {
         m_dimensions[dim_idx] = eval_right_dims[i];
-        if (nocontract_idx+1 < internal::array_size<right_nocontract_t>::value) {
-          m_j_strides[nocontract_idx+1] =
-              m_j_strides[nocontract_idx] * eval_right_dims[i];
+        if (nocontract_idx + 1 < internal::array_size<right_nocontract_t>::value) {
+          m_j_strides[nocontract_idx + 1] = m_j_strides[nocontract_idx] * eval_right_dims[i];
         } else {
           m_j_size = m_j_strides[nocontract_idx] * eval_right_dims[i];
         }
@@ -567,18 +540,17 @@
       Index right = eval_op_indices[i].second;
 
       Index size = eval_left_dims[left];
-      eigen_assert(size == eval_right_dims[right] &&
-                   "Contraction axes must be same size");
+      eigen_assert(size == eval_right_dims[right] && "Contraction axes must be same size");
 
-      if (i+1 < static_cast<int>(internal::array_size<contract_t>::value)) {
-        m_k_strides[i+1] = m_k_strides[i] * size;
+      if (i + 1 < static_cast<int>(internal::array_size<contract_t>::value)) {
+        m_k_strides[i + 1] = m_k_strides[i] * size;
       } else {
         m_k_size = m_k_strides[i] * size;
       }
       m_left_contracting_strides[i] = lhs_strides[left];
       m_right_contracting_strides[i] = rhs_strides[right];
 
-      if (i > 0 && right < eval_op_indices[i-1].second) {
+      if (i > 0 && right < eval_op_indices[i - 1].second) {
         m_rhs_inner_dim_reordered = true;
       }
       if (right != i) {
@@ -617,15 +589,13 @@
 
 #ifdef EIGEN_USE_THREADS
   template <typename EvalSubExprsCallback>
-  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(
-      EvaluatorPointerType dest, EvalSubExprsCallback done) {
+  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(EvaluatorPointerType dest, EvalSubExprsCallback done) {
     m_leftImpl.evalSubExprsIfNeededAsync(nullptr, [this, done, dest](bool) {
       m_rightImpl.evalSubExprsIfNeededAsync(nullptr, [this, done, dest](bool) {
         if (dest) {
           evalToAsync(dest, [done]() { done(false); });
         } else {
-          m_result = static_cast<EvaluatorPointerType>(
-              m_device.allocate(dimensions().TotalSize() * sizeof(Scalar)));
+          m_result = static_cast<EvaluatorPointerType>(m_device.allocate(dimensions().TotalSize() * sizeof(Scalar)));
           evalToAsync(m_result, [done]() { done(true); });
         }
       });
@@ -700,36 +670,33 @@
 #endif
 
   EIGEN_DEVICE_FUNC void evalTo(Scalar* buffer) const {
-   static_cast<const Derived*>(this)->template evalProduct<Unaligned>(buffer);
+    static_cast<const Derived*>(this)->template evalProduct<Unaligned>(buffer);
   }
 
 #ifdef EIGEN_USE_THREADS
   template <typename EvalToCallback>
   void evalToAsync(Scalar* buffer, EvalToCallback done) const {
-    static_cast<const Derived*>(this)
-        ->template evalProductAsync<EvalToCallback, Unaligned>(buffer,
-                                                               std::move(done));
+    static_cast<const Derived*>(this)->template evalProductAsync<EvalToCallback, Unaligned>(buffer, std::move(done));
   }
 #endif  // EIGEN_USE_THREADS
 
-  template <bool lhs_inner_dim_contiguous, bool rhs_inner_dim_contiguous,
-            bool rhs_inner_dim_reordered, int Alignment>
+  template <bool lhs_inner_dim_contiguous, bool rhs_inner_dim_contiguous, bool rhs_inner_dim_reordered, int Alignment>
   void evalProductSequential(Scalar* buffer) const {
     if (this->m_j_size == 1) {
-      this->template evalGemv<lhs_inner_dim_contiguous,
-                              rhs_inner_dim_contiguous, rhs_inner_dim_reordered,
-                              Alignment>(buffer);
+      this->template evalGemv<lhs_inner_dim_contiguous, rhs_inner_dim_contiguous, rhs_inner_dim_reordered, Alignment>(
+          buffer);
     } else {
-      this->template evalGemm<lhs_inner_dim_contiguous, rhs_inner_dim_contiguous,
-                              rhs_inner_dim_reordered, Alignment>(buffer);
+      this->template evalGemm<lhs_inner_dim_contiguous, rhs_inner_dim_contiguous, rhs_inner_dim_reordered, Alignment>(
+          buffer);
     }
   }
 
   template <bool lhs_inner_dim_contiguous, bool rhs_inner_dim_contiguous, bool rhs_inner_dim_reordered, int Alignment>
-  #if !defined(EIGEN_HIPCC)
+#if !defined(EIGEN_HIPCC)
   EIGEN_DEVICE_FUNC
-  #endif
-  void evalGemv(Scalar* buffer) const {
+#endif
+      void
+      evalGemv(Scalar* buffer) const {
     const Index rows = m_i_size;
     const Index cols = m_k_size;
 
@@ -741,22 +708,18 @@
     const Index rhs_packet_size = internal::unpacket_traits<typename RightEvaluator::PacketReturnType>::size;
     const int lhs_alignment = LeftEvaluator::IsAligned ? Aligned : Unaligned;
     const int rhs_alignment = RightEvaluator::IsAligned ? Aligned : Unaligned;
-    typedef internal::TensorContractionInputMapper<LhsScalar, Index, internal::Lhs,
-                                                   LeftEvaluator, left_nocontract_t,
-                                                   contract_t, lhs_packet_size,
-                                                   lhs_inner_dim_contiguous,
-                                                   false, lhs_alignment> LhsMapper;
+    typedef internal::TensorContractionInputMapper<LhsScalar, Index, internal::Lhs, LeftEvaluator, left_nocontract_t,
+                                                   contract_t, lhs_packet_size, lhs_inner_dim_contiguous, false,
+                                                   lhs_alignment>
+        LhsMapper;
 
-    typedef internal::TensorContractionInputMapper<RhsScalar, Index, internal::Rhs,
-                                                   RightEvaluator, right_nocontract_t,
-                                                   contract_t, rhs_packet_size,
-                                                   rhs_inner_dim_contiguous,
-                                                   rhs_inner_dim_reordered, rhs_alignment> RhsMapper;
+    typedef internal::TensorContractionInputMapper<RhsScalar, Index, internal::Rhs, RightEvaluator, right_nocontract_t,
+                                                   contract_t, rhs_packet_size, rhs_inner_dim_contiguous,
+                                                   rhs_inner_dim_reordered, rhs_alignment>
+        RhsMapper;
 
-    LhsMapper lhs(m_leftImpl, m_left_nocontract_strides, m_i_strides,
-                  m_left_contracting_strides, m_k_strides);
-    RhsMapper rhs(m_rightImpl, m_right_nocontract_strides, m_j_strides,
-                  m_right_contracting_strides, m_k_strides);
+    LhsMapper lhs(m_leftImpl, m_left_nocontract_strides, m_i_strides, m_left_contracting_strides, m_k_strides);
+    RhsMapper rhs(m_rightImpl, m_right_nocontract_strides, m_j_strides, m_right_contracting_strides, m_k_strides);
 
     const Scalar alpha(1);
     const Index resIncr(1);
@@ -764,40 +727,35 @@
     // zero out the result buffer (which must be of size at least rows * sizeof(Scalar)
     m_device.fill(buffer, buffer + rows, Scalar(0));
 
-    internal::general_matrix_vector_product<Index,LhsScalar,LhsMapper,ColMajor,false,RhsScalar,RhsMapper,false>::run(
-        rows, cols, lhs, rhs,
-        buffer, resIncr, alpha);
+    internal::general_matrix_vector_product<Index, LhsScalar, LhsMapper, ColMajor, false, RhsScalar, RhsMapper,
+                                            false>::run(rows, cols, lhs, rhs, buffer, resIncr, alpha);
 
     typedef internal::blas_data_mapper<Scalar, Index, ColMajor> OutputMapper;
-    m_output_kernel(OutputMapper(buffer, rows), m_tensor_contraction_params,
-                    static_cast<Index>(0), static_cast<Index>(0), rows,
-                    static_cast<Index>(1));
+    m_output_kernel(OutputMapper(buffer, rows), m_tensor_contraction_params, static_cast<Index>(0),
+                    static_cast<Index>(0), rows, static_cast<Index>(1));
   }
 
   template <bool lhs_inner_dim_contiguous, bool rhs_inner_dim_contiguous, bool rhs_inner_dim_reordered, int Alignment>
-  #if !defined(EIGEN_HIPCC)
+#if !defined(EIGEN_HIPCC)
   EIGEN_DEVICE_FUNC
-  #endif
-  void evalGemm(Scalar* buffer) const {
+#endif
+      void
+      evalGemm(Scalar* buffer) const {
     // columns in left side, rows in right side
     const Index k = this->m_k_size;
-    this->template evalGemmPartial<lhs_inner_dim_contiguous,
-                                   rhs_inner_dim_contiguous,
-                                   rhs_inner_dim_reordered,
+    this->template evalGemmPartial<lhs_inner_dim_contiguous, rhs_inner_dim_contiguous, rhs_inner_dim_reordered,
                                    Alignment, true>(buffer, 0, k, 1);
   }
 
-  template <bool lhs_inner_dim_contiguous, bool rhs_inner_dim_contiguous,
-      bool rhs_inner_dim_reordered, int Alignment>
-  EIGEN_DEVICE_FUNC void evalGemmPartialWithoutOutputKernel(
-      Scalar* buffer, Index k_start, Index k_end, int num_threads) const {
-    evalGemmPartial<lhs_inner_dim_contiguous, rhs_inner_dim_contiguous,
-                    rhs_inner_dim_reordered, Alignment,
-        /*use_output_kernel*/ false>(buffer, k_start, k_end,
-                                     num_threads);
+  template <bool lhs_inner_dim_contiguous, bool rhs_inner_dim_contiguous, bool rhs_inner_dim_reordered, int Alignment>
+  EIGEN_DEVICE_FUNC void evalGemmPartialWithoutOutputKernel(Scalar* buffer, Index k_start, Index k_end,
+                                                            int num_threads) const {
+    evalGemmPartial<lhs_inner_dim_contiguous, rhs_inner_dim_contiguous, rhs_inner_dim_reordered, Alignment,
+                    /*use_output_kernel*/ false>(buffer, k_start, k_end, num_threads);
   }
 
-  template <bool lhs_inner_dim_contiguous, bool rhs_inner_dim_contiguous, bool rhs_inner_dim_reordered, int Alignment, bool use_output_kernel>
+  template <bool lhs_inner_dim_contiguous, bool rhs_inner_dim_contiguous, bool rhs_inner_dim_reordered, int Alignment,
+            bool use_output_kernel>
   EIGEN_DEVICE_FUNC void evalGemmPartial(Scalar* buffer, Index k_start, Index k_end, int num_threads) const {
     eigen_assert(k_end >= k_start && k_start >= 0 && k_end <= this->m_k_size);
     // columns in slice on left side, rows on right side
@@ -819,22 +777,19 @@
     const Index lhs_packet_size = internal::unpacket_traits<typename LeftEvaluator::PacketReturnType>::size;
     const Index rhs_packet_size = internal::unpacket_traits<typename RightEvaluator::PacketReturnType>::size;
 
-    typedef internal::TensorContractionInputMapper<LhsScalar, Index, internal::Lhs,
-                                                   LeftEvaluator, left_nocontract_t,
-                                                   contract_t, lhs_packet_size,
-                                                   lhs_inner_dim_contiguous,
-                                                   false, Unaligned> LhsMapper;
+    typedef internal::TensorContractionInputMapper<LhsScalar, Index, internal::Lhs, LeftEvaluator, left_nocontract_t,
+                                                   contract_t, lhs_packet_size, lhs_inner_dim_contiguous, false,
+                                                   Unaligned>
+        LhsMapper;
 
-    typedef internal::TensorContractionInputMapper<RhsScalar, Index, internal::Rhs,
-                                                   RightEvaluator, right_nocontract_t,
-                                                   contract_t, rhs_packet_size,
-                                                   rhs_inner_dim_contiguous,
-                                                   rhs_inner_dim_reordered, Unaligned> RhsMapper;
+    typedef internal::TensorContractionInputMapper<RhsScalar, Index, internal::Rhs, RightEvaluator, right_nocontract_t,
+                                                   contract_t, rhs_packet_size, rhs_inner_dim_contiguous,
+                                                   rhs_inner_dim_reordered, Unaligned>
+        RhsMapper;
 
     typedef internal::blas_data_mapper<Scalar, Index, ColMajor> OutputMapper;
 
-    typedef internal::TensorContractionKernel<
-        Scalar, LhsScalar, RhsScalar, Index, OutputMapper, LhsMapper, RhsMapper>
+    typedef internal::TensorContractionKernel<Scalar, LhsScalar, RhsScalar, Index, OutputMapper, LhsMapper, RhsMapper>
         TensorContractionKernel;
 
     // initialize data mappers
@@ -847,9 +802,8 @@
     OutputMapper output(buffer, m);
 
     // Sizes of the blocks to load in cache. See the Goto paper for details.
-    internal::TensorContractionBlocking<Scalar, LhsScalar, RhsScalar,
-                                        Index, internal::ShardByCol>
-        blocking(k_slice, m, n, num_threads);
+    internal::TensorContractionBlocking<Scalar, LhsScalar, RhsScalar, Index, internal::ShardByCol> blocking(
+        k_slice, m, n, num_threads);
     const Index kc = blocking.kc();
     const Index mc = numext::mini(m, blocking.mc());
     const Index nc = numext::mini(n, blocking.nc());
@@ -863,8 +817,7 @@
     TensorContractionKernel kernel(m, k_slice, n, mc, kc, nc);
 
     typedef typename TensorContractionKernel::BlockMemHandle BlockMemHandle;
-    const BlockMemHandle packed_mem =
-        kernel.allocate(this->m_device, &blockA, &blockB);
+    const BlockMemHandle packed_mem = kernel.allocate(this->m_device, &blockA, &blockB);
 
     // If a contraction kernel does not support beta, explicitly initialize
     // output buffer with zeroes.
@@ -872,9 +825,8 @@
       this->m_device.fill(buffer, buffer + m * n, Scalar(0));
     }
 
-    for(Index i2=0; i2<m; i2+=mc)
-    {
-      const Index actual_mc = numext::mini(i2+mc,m)-i2;
+    for (Index i2 = 0; i2 < m; i2 += mc) {
+      const Index actual_mc = numext::mini(i2 + mc, m) - i2;
       for (Index k2 = k_start; k2 < k_end; k2 += kc) {
         // make sure we don't overshoot right edge of left matrix, then pack vertical panel
         const Index actual_kc = numext::mini(k2 + kc, k_end) - k2;
@@ -883,27 +835,22 @@
         // If kernel supports beta, there is no need to initialize output
         // buffer with zeroes.
         const Scalar alpha = Scalar(1);
-        const Scalar beta = (TensorContractionKernel::HasBeta && k2 == k_start)
-                                ? Scalar(0)
-                                : Scalar(1);
+        const Scalar beta = (TensorContractionKernel::HasBeta && k2 == k_start) ? Scalar(0) : Scalar(1);
 
         // series of horizontal blocks
         for (Index j2 = 0; j2 < n; j2 += nc) {
           // make sure we don't overshoot right edge of right matrix, then pack block
           const Index actual_nc = numext::mini(j2 + nc, n) - j2;
-          kernel.packRhs(&blockB, rhs.getSubMapper(k2, j2), actual_kc,
-                         actual_nc);
+          kernel.packRhs(&blockB, rhs.getSubMapper(k2, j2), actual_kc, actual_nc);
 
           // call gebp (matrix kernel)
           // The parameters here are copied from Eigen's GEMM implementation
           const OutputMapper output_mapper = output.getSubMapper(i2, j2);
-          kernel.invoke(output_mapper, blockA, blockB, actual_mc, actual_kc,
-                        actual_nc, alpha, beta);
+          kernel.invoke(output_mapper, blockA, blockB, actual_mc, actual_kc, actual_nc, alpha, beta);
 
           // We are done with this [i2, j2] output block.
           if (use_output_kernel && k2 + kc >= k_end) {
-            m_output_kernel(output_mapper, m_tensor_contraction_params, i2, j2,
-                            actual_mc, actual_nc);
+            m_output_kernel(output_mapper, m_tensor_contraction_params, i2, j2, actual_mc, actual_nc);
           }
         }
       }
@@ -922,22 +869,20 @@
     }
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
-    return m_result[index];
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const { return m_result[index]; }
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool) const {
     return TensorOpCost(sizeof(CoeffReturnType), 0, 0);
   }
 
-  template<int LoadMode>
+  template <int LoadMode>
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const {
     return internal::ploadt<PacketReturnType, LoadMode>(m_result + index);
   }
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EvaluatorPointerType data() const { return m_result; }
 
-protected:
+ protected:
   Dimensions m_dimensions;
 
   contract_t m_k_strides;
@@ -966,12 +911,11 @@
   EvaluatorPointerType m_result;
 };
 
-
 // evaluator for default device
-template<typename Indices, typename LeftArgType, typename RightArgType, typename OutputKernelType, typename Device>
-struct TensorEvaluator<const TensorContractionOp<Indices, LeftArgType, RightArgType, OutputKernelType>, Device> :
-    public TensorContractionEvaluatorBase<
-      TensorEvaluator<const TensorContractionOp<Indices, LeftArgType, RightArgType, OutputKernelType>, Device> > {
+template <typename Indices, typename LeftArgType, typename RightArgType, typename OutputKernelType, typename Device>
+struct TensorEvaluator<const TensorContractionOp<Indices, LeftArgType, RightArgType, OutputKernelType>, Device>
+    : public TensorContractionEvaluatorBase<
+          TensorEvaluator<const TensorContractionOp<Indices, LeftArgType, RightArgType, OutputKernelType>, Device>> {
   typedef TensorEvaluator<const TensorContractionOp<Indices, LeftArgType, RightArgType, OutputKernelType>, Device> Self;
   typedef TensorContractionEvaluatorBase<Self> Base;
 
@@ -1005,8 +949,7 @@
   // Could we use NumDimensions here?
   typedef DSizes<Index, NumDims> Dimensions;
 
-  TensorEvaluator(const XprType& op, const Device& device) :
-      Base(op, device) { }
+  TensorEvaluator(const XprType& op, const Device& device) : Base(op, device) {}
 
   template <int Alignment>
   void evalProduct(Scalar* buffer) const {
@@ -1014,6 +957,6 @@
   }
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorContractionBlocking.h b/unsupported/Eigen/CXX11/src/Tensor/TensorContractionBlocking.h
index ce1bf62..7fbe30a 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorContractionBlocking.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorContractionBlocking.h
@@ -10,54 +10,47 @@
 #ifndef EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_BLOCKING_H
 #define EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_BLOCKING_H
 
-
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
 namespace Eigen {
 namespace internal {
 
-enum {
-  ShardByRow = 0,
-  ShardByCol = 1
-};
-
+enum { ShardByRow = 0, ShardByCol = 1 };
 
 // Default Blocking Strategy
-template<typename ResScalar, typename LhsScalar, typename RhsScalar, typename StorageIndex, int ShardingType = ShardByCol>
+template <typename ResScalar, typename LhsScalar, typename RhsScalar, typename StorageIndex,
+          int ShardingType = ShardByCol>
 class TensorContractionBlocking {
  public:
+  /*
+    adding EIGEN_DEVICE_FUNC unconditionally to 'TensorContractionBlocking' constructor in `TensorContractionBlocking.h`
+      requires adding EIGEN_DEVICE_FUNC to `computeProductBlockingSizes` in `GeneralBlockPanelKernel.h`
+      which in turn, requires adding EIGEN_DEVICE_FUNC to `evaluateProductBlockingSizesHeuristic` in
+    `GeneralBlockPanelKernel.h` which in turn, requires adding EIGEN_DEVICE_FUNC to `manage_caching_sizes` in
+    `GeneralBlockPanelKernel.h` (else HIPCC will error out)
 
- /*
-   adding EIGEN_DEVICE_FUNC unconditionally to 'TensorContractionBlocking' constructor in `TensorContractionBlocking.h`
-     requires adding EIGEN_DEVICE_FUNC to `computeProductBlockingSizes` in `GeneralBlockPanelKernel.h`
-     which in turn, requires adding EIGEN_DEVICE_FUNC to `evaluateProductBlockingSizesHeuristic` in `GeneralBlockPanelKernel.h`
-     which in turn, requires adding EIGEN_DEVICE_FUNC to `manage_caching_sizes` in `GeneralBlockPanelKernel.h`
-     (else HIPCC will error out)
+    However adding EIGEN_DEVICE_FUNC to `manage_caching_sizes` in `GeneralBlockPanelKernel.h`
+    results in NVCC erroring out with the following error
 
-   However adding EIGEN_DEVICE_FUNC to `manage_caching_sizes` in `GeneralBlockPanelKernel.h`
-   results in NVCC erroring out with the following error
+    ../Eigen/src/Core/products/GeneralBlockPanelKernel.h(57): error #2901:
+       dynamic initialization is not supported for function-scope static variables within a __device__/__global__
+    function
+  */
 
-   ../Eigen/src/Core/products/GeneralBlockPanelKernel.h(57): error #2901:
-      dynamic initialization is not supported for function-scope static variables within a __device__/__global__ function
- */
-
-  #if !defined(EIGEN_HIPCC)
+#if !defined(EIGEN_HIPCC)
   EIGEN_DEVICE_FUNC
-  #endif
- TensorContractionBlocking(StorageIndex k, StorageIndex m, StorageIndex n, StorageIndex num_threads = 1) :
-      kc_(k), mc_(m), nc_(n)
-  {
+#endif
+  TensorContractionBlocking(StorageIndex k, StorageIndex m, StorageIndex n, StorageIndex num_threads = 1)
+      : kc_(k), mc_(m), nc_(n) {
     if (ShardingType == ShardByCol) {
       computeProductBlockingSizes<LhsScalar, RhsScalar, 1>(kc_, mc_, nc_, num_threads);
-    }
-    else {
+    } else {
       computeProductBlockingSizes<LhsScalar, RhsScalar, 1>(kc_, nc_, mc_, num_threads);
     }
 
     const int rhs_packet_size = internal::packet_traits<RhsScalar>::size;
-    kc_ = (rhs_packet_size <= 8 || kc_ <= rhs_packet_size) ?
-      kc_ : (kc_ / rhs_packet_size) * rhs_packet_size;
+    kc_ = (rhs_packet_size <= 8 || kc_ <= rhs_packet_size) ? kc_ : (kc_ / rhs_packet_size) * rhs_packet_size;
   }
 
   EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE StorageIndex kc() const { return kc_; }
@@ -70,7 +63,7 @@
   StorageIndex nc_;
 };
 
-} // end namespace internal
-} // end namespace Eigen
+}  // end namespace internal
+}  // end namespace Eigen
 
-#endif // EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_BLOCKING_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_BLOCKING_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorContractionCuda.h b/unsupported/Eigen/CXX11/src/Tensor/TensorContractionCuda.h
index 3f315fe..dbea8aa 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorContractionCuda.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorContractionCuda.h
@@ -1,6 +1,7 @@
 
 #if defined(__clang__) || defined(__GNUC__)
-#warning "Deprecated header file, please either include the main Eigen/CXX11/Tensor header or the respective TensorContractionGpu.h file"
+#warning \
+    "Deprecated header file, please either include the main Eigen/CXX11/Tensor header or the respective TensorContractionGpu.h file"
 #endif
 
 #include "TensorContractionGpu.h"
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorContractionGpu.h b/unsupported/Eigen/CXX11/src/Tensor/TensorContractionGpu.h
index f0233fb..ea34035 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorContractionGpu.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorContractionGpu.h
@@ -19,13 +19,12 @@
 
 namespace Eigen {
 
-template<typename Scalar, typename Index, typename LhsMapper,
-         typename RhsMapper, typename OutputMapper, bool needs_edge_check>
-__device__ EIGEN_STRONG_INLINE void
-EigenContractionKernelInternal(const LhsMapper lhs, const RhsMapper rhs,
-                               const OutputMapper output, Scalar* lhs_shmem, Scalar* rhs_shmem,
-                       const Index m_size, const Index n_size, const Index k_size) {
-
+template <typename Scalar, typename Index, typename LhsMapper, typename RhsMapper, typename OutputMapper,
+          bool needs_edge_check>
+__device__ EIGEN_STRONG_INLINE void EigenContractionKernelInternal(const LhsMapper lhs, const RhsMapper rhs,
+                                                                   const OutputMapper output, Scalar* lhs_shmem,
+                                                                   Scalar* rhs_shmem, const Index m_size,
+                                                                   const Index n_size, const Index k_size) {
   const Index m_block_idx = blockIdx.x;
   const Index n_block_idx = blockIdx.y;
 
@@ -100,178 +99,178 @@
   const Index load_idx_vert = threadIdx.x + 8 * threadIdx.y;
   const Index lhs_vert = base_m + load_idx_vert;
 
-#define prefetchIntoRegisters(base_k)                           \
-  {                                                             \
-    lhs_pf0 = conv(0);                                          \
-    lhs_pf1 = conv(0);                                          \
-    lhs_pf2 = conv(0);                                          \
-    lhs_pf3 = conv(0);                                          \
-    lhs_pf4 = conv(0);                                          \
-    lhs_pf5 = conv(0);                                          \
-    lhs_pf6 = conv(0);                                          \
-    lhs_pf7 = conv(0);                                          \
-                                                                \
-    rhs_pf0 = conv(0);                                          \
-    rhs_pf1 = conv(0);                                          \
-    rhs_pf2 = conv(0);                                          \
-    rhs_pf3 = conv(0);                                          \
-    rhs_pf4 = conv(0);                                          \
-    rhs_pf5 = conv(0);                                          \
-    rhs_pf6 = conv(0);                                          \
-    rhs_pf7 = conv(0);                                          \
-                                                                \
-    if (!needs_edge_check || lhs_vert < m_size) {               \
-      const Index lhs_horiz_0 = base_k + threadIdx.z + 0 * 8;   \
-      const Index lhs_horiz_1 = base_k + threadIdx.z + 1 * 8;   \
-      const Index lhs_horiz_2 = base_k + threadIdx.z + 2 * 8;   \
-      const Index lhs_horiz_3 = base_k + threadIdx.z + 3 * 8;   \
-      const Index lhs_horiz_4 = base_k + threadIdx.z + 4 * 8;   \
-      const Index lhs_horiz_5 = base_k + threadIdx.z + 5 * 8;   \
-      const Index lhs_horiz_6 = base_k + threadIdx.z + 6 * 8;   \
-      const Index lhs_horiz_7 = base_k + threadIdx.z + 7 * 8;   \
-                                                                \
-      if (!needs_edge_check || lhs_horiz_7 < k_size) {          \
-        lhs_pf0 = lhs(lhs_vert, lhs_horiz_0);                   \
-        lhs_pf1 = lhs(lhs_vert, lhs_horiz_1);                   \
-        lhs_pf2 = lhs(lhs_vert, lhs_horiz_2);                   \
-        lhs_pf3 = lhs(lhs_vert, lhs_horiz_3);                   \
-        lhs_pf4 = lhs(lhs_vert, lhs_horiz_4);                   \
-        lhs_pf5 = lhs(lhs_vert, lhs_horiz_5);                   \
-        lhs_pf6 = lhs(lhs_vert, lhs_horiz_6);                   \
-        lhs_pf7 = lhs(lhs_vert, lhs_horiz_7);                   \
-      } else if (lhs_horiz_6 < k_size) {                        \
-        lhs_pf0 = lhs(lhs_vert, lhs_horiz_0);                   \
-        lhs_pf1 = lhs(lhs_vert, lhs_horiz_1);                   \
-        lhs_pf2 = lhs(lhs_vert, lhs_horiz_2);                   \
-        lhs_pf3 = lhs(lhs_vert, lhs_horiz_3);                   \
-        lhs_pf4 = lhs(lhs_vert, lhs_horiz_4);                   \
-        lhs_pf5 = lhs(lhs_vert, lhs_horiz_5);                   \
-        lhs_pf6 = lhs(lhs_vert, lhs_horiz_6);                   \
-      } else if (lhs_horiz_5 < k_size) {                        \
-        lhs_pf0 = lhs(lhs_vert, lhs_horiz_0);                   \
-        lhs_pf1 = lhs(lhs_vert, lhs_horiz_1);                   \
-        lhs_pf2 = lhs(lhs_vert, lhs_horiz_2);                   \
-        lhs_pf3 = lhs(lhs_vert, lhs_horiz_3);                   \
-        lhs_pf4 = lhs(lhs_vert, lhs_horiz_4);                   \
-        lhs_pf5 = lhs(lhs_vert, lhs_horiz_5);                   \
-      } else if (lhs_horiz_4 < k_size) {                        \
-        lhs_pf0 = lhs(lhs_vert, lhs_horiz_0);                   \
-        lhs_pf1 = lhs(lhs_vert, lhs_horiz_1);                   \
-        lhs_pf2 = lhs(lhs_vert, lhs_horiz_2);                   \
-        lhs_pf3 = lhs(lhs_vert, lhs_horiz_3);                   \
-        lhs_pf4 = lhs(lhs_vert, lhs_horiz_4);                   \
-      } else if (lhs_horiz_3 < k_size) {                        \
-        lhs_pf0 = lhs(lhs_vert, lhs_horiz_0);                   \
-        lhs_pf1 = lhs(lhs_vert, lhs_horiz_1);                   \
-        lhs_pf2 = lhs(lhs_vert, lhs_horiz_2);                   \
-        lhs_pf3 = lhs(lhs_vert, lhs_horiz_3);                   \
-      } else if (lhs_horiz_2 < k_size) {                        \
-        lhs_pf0 = lhs(lhs_vert, lhs_horiz_0);                   \
-        lhs_pf1 = lhs(lhs_vert, lhs_horiz_1);                   \
-        lhs_pf2 = lhs(lhs_vert, lhs_horiz_2);                   \
-      } else if (lhs_horiz_1 < k_size) {                        \
-        lhs_pf0 = lhs(lhs_vert, lhs_horiz_0);                   \
-        lhs_pf1 = lhs(lhs_vert, lhs_horiz_1);                   \
-      } else if (lhs_horiz_0 < k_size) {                        \
-        lhs_pf0 = lhs(lhs_vert, lhs_horiz_0);                   \
-      }                                                         \
-    }                                                           \
-                                                                \
-    const Index rhs_vert = base_k + load_idx_vert;              \
-    if (!needs_edge_check || rhs_vert < k_size) {               \
-      const Index rhs_horiz_0 = base_n + threadIdx.z + 0 * 8;   \
-      const Index rhs_horiz_1 = base_n + threadIdx.z + 1 * 8;   \
-      const Index rhs_horiz_2 = base_n + threadIdx.z + 2 * 8;   \
-      const Index rhs_horiz_3 = base_n + threadIdx.z + 3 * 8;   \
-      const Index rhs_horiz_4 = base_n + threadIdx.z + 4 * 8;   \
-      const Index rhs_horiz_5 = base_n + threadIdx.z + 5 * 8;   \
-      const Index rhs_horiz_6 = base_n + threadIdx.z + 6 * 8;   \
-      const Index rhs_horiz_7 = base_n + threadIdx.z + 7 * 8;   \
-                                                                \
-      if (rhs_horiz_7 < n_size) {                               \
-        rhs_pf0 = rhs(rhs_vert, rhs_horiz_0);                   \
-        rhs_pf1 = rhs(rhs_vert, rhs_horiz_1);                   \
-        rhs_pf2 = rhs(rhs_vert, rhs_horiz_2);                   \
-        rhs_pf3 = rhs(rhs_vert, rhs_horiz_3);                   \
-        rhs_pf4 = rhs(rhs_vert, rhs_horiz_4);                   \
-        rhs_pf5 = rhs(rhs_vert, rhs_horiz_5);                   \
-        rhs_pf6 = rhs(rhs_vert, rhs_horiz_6);                   \
-        rhs_pf7 = rhs(rhs_vert, rhs_horiz_7);                   \
-      } else if (rhs_horiz_6 < n_size) {                        \
-        rhs_pf0 = rhs(rhs_vert, rhs_horiz_0);                   \
-        rhs_pf1 = rhs(rhs_vert, rhs_horiz_1);                   \
-        rhs_pf2 = rhs(rhs_vert, rhs_horiz_2);                   \
-        rhs_pf3 = rhs(rhs_vert, rhs_horiz_3);                   \
-        rhs_pf4 = rhs(rhs_vert, rhs_horiz_4);                   \
-        rhs_pf5 = rhs(rhs_vert, rhs_horiz_5);                   \
-        rhs_pf6 = rhs(rhs_vert, rhs_horiz_6);                   \
-      } else if (rhs_horiz_5 < n_size) {                        \
-        rhs_pf0 = rhs(rhs_vert, rhs_horiz_0);                   \
-        rhs_pf1 = rhs(rhs_vert, rhs_horiz_1);                   \
-        rhs_pf2 = rhs(rhs_vert, rhs_horiz_2);                   \
-        rhs_pf3 = rhs(rhs_vert, rhs_horiz_3);                   \
-        rhs_pf4 = rhs(rhs_vert, rhs_horiz_4);                   \
-        rhs_pf5 = rhs(rhs_vert, rhs_horiz_5);                   \
-      } else if (rhs_horiz_4 < n_size) {                        \
-        rhs_pf0 = rhs(rhs_vert, rhs_horiz_0);                   \
-        rhs_pf1 = rhs(rhs_vert, rhs_horiz_1);                   \
-        rhs_pf2 = rhs(rhs_vert, rhs_horiz_2);                   \
-        rhs_pf3 = rhs(rhs_vert, rhs_horiz_3);                   \
-        rhs_pf4 = rhs(rhs_vert, rhs_horiz_4);                   \
-      } else if (rhs_horiz_3 < n_size) {                        \
-        rhs_pf0 = rhs(rhs_vert, rhs_horiz_0);                   \
-        rhs_pf1 = rhs(rhs_vert, rhs_horiz_1);                   \
-        rhs_pf2 = rhs(rhs_vert, rhs_horiz_2);                   \
-        rhs_pf3 = rhs(rhs_vert, rhs_horiz_3);                   \
-      } else if (rhs_horiz_2 < n_size) {                        \
-        rhs_pf0 = rhs(rhs_vert, rhs_horiz_0);                   \
-        rhs_pf1 = rhs(rhs_vert, rhs_horiz_1);                   \
-        rhs_pf2 = rhs(rhs_vert, rhs_horiz_2);                   \
-      } else if (rhs_horiz_1 < n_size) {                        \
-        rhs_pf0 = rhs(rhs_vert, rhs_horiz_0);                   \
-        rhs_pf1 = rhs(rhs_vert, rhs_horiz_1);                   \
-      } else if (rhs_horiz_0 < n_size) {                        \
-        rhs_pf0 = rhs(rhs_vert, rhs_horiz_0);                   \
-      }                                                         \
-    }                                                           \
-  }                                                             \
+#define prefetchIntoRegisters(base_k)                         \
+  {                                                           \
+    lhs_pf0 = conv(0);                                        \
+    lhs_pf1 = conv(0);                                        \
+    lhs_pf2 = conv(0);                                        \
+    lhs_pf3 = conv(0);                                        \
+    lhs_pf4 = conv(0);                                        \
+    lhs_pf5 = conv(0);                                        \
+    lhs_pf6 = conv(0);                                        \
+    lhs_pf7 = conv(0);                                        \
+                                                              \
+    rhs_pf0 = conv(0);                                        \
+    rhs_pf1 = conv(0);                                        \
+    rhs_pf2 = conv(0);                                        \
+    rhs_pf3 = conv(0);                                        \
+    rhs_pf4 = conv(0);                                        \
+    rhs_pf5 = conv(0);                                        \
+    rhs_pf6 = conv(0);                                        \
+    rhs_pf7 = conv(0);                                        \
+                                                              \
+    if (!needs_edge_check || lhs_vert < m_size) {             \
+      const Index lhs_horiz_0 = base_k + threadIdx.z + 0 * 8; \
+      const Index lhs_horiz_1 = base_k + threadIdx.z + 1 * 8; \
+      const Index lhs_horiz_2 = base_k + threadIdx.z + 2 * 8; \
+      const Index lhs_horiz_3 = base_k + threadIdx.z + 3 * 8; \
+      const Index lhs_horiz_4 = base_k + threadIdx.z + 4 * 8; \
+      const Index lhs_horiz_5 = base_k + threadIdx.z + 5 * 8; \
+      const Index lhs_horiz_6 = base_k + threadIdx.z + 6 * 8; \
+      const Index lhs_horiz_7 = base_k + threadIdx.z + 7 * 8; \
+                                                              \
+      if (!needs_edge_check || lhs_horiz_7 < k_size) {        \
+        lhs_pf0 = lhs(lhs_vert, lhs_horiz_0);                 \
+        lhs_pf1 = lhs(lhs_vert, lhs_horiz_1);                 \
+        lhs_pf2 = lhs(lhs_vert, lhs_horiz_2);                 \
+        lhs_pf3 = lhs(lhs_vert, lhs_horiz_3);                 \
+        lhs_pf4 = lhs(lhs_vert, lhs_horiz_4);                 \
+        lhs_pf5 = lhs(lhs_vert, lhs_horiz_5);                 \
+        lhs_pf6 = lhs(lhs_vert, lhs_horiz_6);                 \
+        lhs_pf7 = lhs(lhs_vert, lhs_horiz_7);                 \
+      } else if (lhs_horiz_6 < k_size) {                      \
+        lhs_pf0 = lhs(lhs_vert, lhs_horiz_0);                 \
+        lhs_pf1 = lhs(lhs_vert, lhs_horiz_1);                 \
+        lhs_pf2 = lhs(lhs_vert, lhs_horiz_2);                 \
+        lhs_pf3 = lhs(lhs_vert, lhs_horiz_3);                 \
+        lhs_pf4 = lhs(lhs_vert, lhs_horiz_4);                 \
+        lhs_pf5 = lhs(lhs_vert, lhs_horiz_5);                 \
+        lhs_pf6 = lhs(lhs_vert, lhs_horiz_6);                 \
+      } else if (lhs_horiz_5 < k_size) {                      \
+        lhs_pf0 = lhs(lhs_vert, lhs_horiz_0);                 \
+        lhs_pf1 = lhs(lhs_vert, lhs_horiz_1);                 \
+        lhs_pf2 = lhs(lhs_vert, lhs_horiz_2);                 \
+        lhs_pf3 = lhs(lhs_vert, lhs_horiz_3);                 \
+        lhs_pf4 = lhs(lhs_vert, lhs_horiz_4);                 \
+        lhs_pf5 = lhs(lhs_vert, lhs_horiz_5);                 \
+      } else if (lhs_horiz_4 < k_size) {                      \
+        lhs_pf0 = lhs(lhs_vert, lhs_horiz_0);                 \
+        lhs_pf1 = lhs(lhs_vert, lhs_horiz_1);                 \
+        lhs_pf2 = lhs(lhs_vert, lhs_horiz_2);                 \
+        lhs_pf3 = lhs(lhs_vert, lhs_horiz_3);                 \
+        lhs_pf4 = lhs(lhs_vert, lhs_horiz_4);                 \
+      } else if (lhs_horiz_3 < k_size) {                      \
+        lhs_pf0 = lhs(lhs_vert, lhs_horiz_0);                 \
+        lhs_pf1 = lhs(lhs_vert, lhs_horiz_1);                 \
+        lhs_pf2 = lhs(lhs_vert, lhs_horiz_2);                 \
+        lhs_pf3 = lhs(lhs_vert, lhs_horiz_3);                 \
+      } else if (lhs_horiz_2 < k_size) {                      \
+        lhs_pf0 = lhs(lhs_vert, lhs_horiz_0);                 \
+        lhs_pf1 = lhs(lhs_vert, lhs_horiz_1);                 \
+        lhs_pf2 = lhs(lhs_vert, lhs_horiz_2);                 \
+      } else if (lhs_horiz_1 < k_size) {                      \
+        lhs_pf0 = lhs(lhs_vert, lhs_horiz_0);                 \
+        lhs_pf1 = lhs(lhs_vert, lhs_horiz_1);                 \
+      } else if (lhs_horiz_0 < k_size) {                      \
+        lhs_pf0 = lhs(lhs_vert, lhs_horiz_0);                 \
+      }                                                       \
+    }                                                         \
+                                                              \
+    const Index rhs_vert = base_k + load_idx_vert;            \
+    if (!needs_edge_check || rhs_vert < k_size) {             \
+      const Index rhs_horiz_0 = base_n + threadIdx.z + 0 * 8; \
+      const Index rhs_horiz_1 = base_n + threadIdx.z + 1 * 8; \
+      const Index rhs_horiz_2 = base_n + threadIdx.z + 2 * 8; \
+      const Index rhs_horiz_3 = base_n + threadIdx.z + 3 * 8; \
+      const Index rhs_horiz_4 = base_n + threadIdx.z + 4 * 8; \
+      const Index rhs_horiz_5 = base_n + threadIdx.z + 5 * 8; \
+      const Index rhs_horiz_6 = base_n + threadIdx.z + 6 * 8; \
+      const Index rhs_horiz_7 = base_n + threadIdx.z + 7 * 8; \
+                                                              \
+      if (rhs_horiz_7 < n_size) {                             \
+        rhs_pf0 = rhs(rhs_vert, rhs_horiz_0);                 \
+        rhs_pf1 = rhs(rhs_vert, rhs_horiz_1);                 \
+        rhs_pf2 = rhs(rhs_vert, rhs_horiz_2);                 \
+        rhs_pf3 = rhs(rhs_vert, rhs_horiz_3);                 \
+        rhs_pf4 = rhs(rhs_vert, rhs_horiz_4);                 \
+        rhs_pf5 = rhs(rhs_vert, rhs_horiz_5);                 \
+        rhs_pf6 = rhs(rhs_vert, rhs_horiz_6);                 \
+        rhs_pf7 = rhs(rhs_vert, rhs_horiz_7);                 \
+      } else if (rhs_horiz_6 < n_size) {                      \
+        rhs_pf0 = rhs(rhs_vert, rhs_horiz_0);                 \
+        rhs_pf1 = rhs(rhs_vert, rhs_horiz_1);                 \
+        rhs_pf2 = rhs(rhs_vert, rhs_horiz_2);                 \
+        rhs_pf3 = rhs(rhs_vert, rhs_horiz_3);                 \
+        rhs_pf4 = rhs(rhs_vert, rhs_horiz_4);                 \
+        rhs_pf5 = rhs(rhs_vert, rhs_horiz_5);                 \
+        rhs_pf6 = rhs(rhs_vert, rhs_horiz_6);                 \
+      } else if (rhs_horiz_5 < n_size) {                      \
+        rhs_pf0 = rhs(rhs_vert, rhs_horiz_0);                 \
+        rhs_pf1 = rhs(rhs_vert, rhs_horiz_1);                 \
+        rhs_pf2 = rhs(rhs_vert, rhs_horiz_2);                 \
+        rhs_pf3 = rhs(rhs_vert, rhs_horiz_3);                 \
+        rhs_pf4 = rhs(rhs_vert, rhs_horiz_4);                 \
+        rhs_pf5 = rhs(rhs_vert, rhs_horiz_5);                 \
+      } else if (rhs_horiz_4 < n_size) {                      \
+        rhs_pf0 = rhs(rhs_vert, rhs_horiz_0);                 \
+        rhs_pf1 = rhs(rhs_vert, rhs_horiz_1);                 \
+        rhs_pf2 = rhs(rhs_vert, rhs_horiz_2);                 \
+        rhs_pf3 = rhs(rhs_vert, rhs_horiz_3);                 \
+        rhs_pf4 = rhs(rhs_vert, rhs_horiz_4);                 \
+      } else if (rhs_horiz_3 < n_size) {                      \
+        rhs_pf0 = rhs(rhs_vert, rhs_horiz_0);                 \
+        rhs_pf1 = rhs(rhs_vert, rhs_horiz_1);                 \
+        rhs_pf2 = rhs(rhs_vert, rhs_horiz_2);                 \
+        rhs_pf3 = rhs(rhs_vert, rhs_horiz_3);                 \
+      } else if (rhs_horiz_2 < n_size) {                      \
+        rhs_pf0 = rhs(rhs_vert, rhs_horiz_0);                 \
+        rhs_pf1 = rhs(rhs_vert, rhs_horiz_1);                 \
+        rhs_pf2 = rhs(rhs_vert, rhs_horiz_2);                 \
+      } else if (rhs_horiz_1 < n_size) {                      \
+        rhs_pf0 = rhs(rhs_vert, rhs_horiz_0);                 \
+        rhs_pf1 = rhs(rhs_vert, rhs_horiz_1);                 \
+      } else if (rhs_horiz_0 < n_size) {                      \
+        rhs_pf0 = rhs(rhs_vert, rhs_horiz_0);                 \
+      }                                                       \
+    }                                                         \
+  }
 
-#define writeRegToShmem()                       \
-  lhs_shmem[lhs_store_idx_0] = lhs_pf0;         \
-  rhs_shmem[rhs_store_idx_0] = rhs_pf0;         \
-                                                \
-  lhs_shmem[lhs_store_idx_1] = lhs_pf1;         \
-  rhs_shmem[rhs_store_idx_1] = rhs_pf1;         \
-                                                \
-  lhs_shmem[lhs_store_idx_2] = lhs_pf2;         \
-  rhs_shmem[rhs_store_idx_2] = rhs_pf2;         \
-                                                \
-  lhs_shmem[lhs_store_idx_3] = lhs_pf3;         \
-  rhs_shmem[rhs_store_idx_3] = rhs_pf3;         \
-                                                \
-  lhs_shmem[lhs_store_idx_4] = lhs_pf4;         \
-  rhs_shmem[rhs_store_idx_4] = rhs_pf4;         \
-                                                \
-  lhs_shmem[lhs_store_idx_5] = lhs_pf5;         \
-  rhs_shmem[rhs_store_idx_5] = rhs_pf5;         \
-                                                \
-  lhs_shmem[lhs_store_idx_6] = lhs_pf6;         \
-  rhs_shmem[rhs_store_idx_6] = rhs_pf6;         \
-                                                \
-  lhs_shmem[lhs_store_idx_7] = lhs_pf7;         \
-  rhs_shmem[rhs_store_idx_7] = rhs_pf7;         \
+#define writeRegToShmem()               \
+  lhs_shmem[lhs_store_idx_0] = lhs_pf0; \
+  rhs_shmem[rhs_store_idx_0] = rhs_pf0; \
+                                        \
+  lhs_shmem[lhs_store_idx_1] = lhs_pf1; \
+  rhs_shmem[rhs_store_idx_1] = rhs_pf1; \
+                                        \
+  lhs_shmem[lhs_store_idx_2] = lhs_pf2; \
+  rhs_shmem[rhs_store_idx_2] = rhs_pf2; \
+                                        \
+  lhs_shmem[lhs_store_idx_3] = lhs_pf3; \
+  rhs_shmem[rhs_store_idx_3] = rhs_pf3; \
+                                        \
+  lhs_shmem[lhs_store_idx_4] = lhs_pf4; \
+  rhs_shmem[rhs_store_idx_4] = rhs_pf4; \
+                                        \
+  lhs_shmem[lhs_store_idx_5] = lhs_pf5; \
+  rhs_shmem[rhs_store_idx_5] = rhs_pf5; \
+                                        \
+  lhs_shmem[lhs_store_idx_6] = lhs_pf6; \
+  rhs_shmem[rhs_store_idx_6] = rhs_pf6; \
+                                        \
+  lhs_shmem[lhs_store_idx_7] = lhs_pf7; \
+  rhs_shmem[rhs_store_idx_7] = rhs_pf7;
 
   // declare and initialize result array
 #define res(i, j) _res_##i##j
-#define initResultRow(i)                        \
-  Scalar res(i, 0) = conv(0);                   \
-  Scalar res(i, 1) = conv(0);                   \
-  Scalar res(i, 2) = conv(0);                   \
-  Scalar res(i, 3) = conv(0);                   \
-  Scalar res(i, 4) = conv(0);                   \
-  Scalar res(i, 5) = conv(0);                   \
-  Scalar res(i, 6) = conv(0);                   \
-  Scalar res(i, 7) = conv(0);                   \
+#define initResultRow(i)      \
+  Scalar res(i, 0) = conv(0); \
+  Scalar res(i, 1) = conv(0); \
+  Scalar res(i, 2) = conv(0); \
+  Scalar res(i, 3) = conv(0); \
+  Scalar res(i, 4) = conv(0); \
+  Scalar res(i, 5) = conv(0); \
+  Scalar res(i, 6) = conv(0); \
+  Scalar res(i, 7) = conv(0);
 
   internal::scalar_cast_op<int, Scalar> conv;
   initResultRow(0);
@@ -292,8 +291,8 @@
     prefetchIntoRegisters(base_k);
     writeRegToShmem();
 
-    #undef prefetchIntoRegisters
-    #undef writeRegToShmem
+#undef prefetchIntoRegisters
+#undef writeRegToShmem
 
     // wait for shared mem packing to be done before starting computation
     __syncthreads();
@@ -328,45 +327,45 @@
 #define lhs_element(i, j) lhs_block[72 * ((i) + 8 * (j))]
 #define rhs_element(i, j) rhs_block[72 * ((i) + 8 * (j))]
 
-#define loadData(i, j)                          \
-    lcol(0) = lhs_element(0, j);               \
-    rrow(0) = rhs_element(i, 0);               \
-    lcol(1) = lhs_element(1, j);               \
-    rrow(1) = rhs_element(i, 1);               \
-    lcol(2) = lhs_element(2, j);               \
-    rrow(2) = rhs_element(i, 2);               \
-    lcol(3) = lhs_element(3, j);               \
-    rrow(3) = rhs_element(i, 3);               \
-    lcol(4) = lhs_element(4, j);               \
-    rrow(4) = rhs_element(i, 4);               \
-    lcol(5) = lhs_element(5, j);               \
-    rrow(5) = rhs_element(i, 5);               \
-    lcol(6) = lhs_element(6, j);               \
-    rrow(6) = rhs_element(i, 6);               \
-    lcol(7) = lhs_element(7, j);               \
-    rrow(7) = rhs_element(i, 7);               \
+#define loadData(i, j)         \
+  lcol(0) = lhs_element(0, j); \
+  rrow(0) = rhs_element(i, 0); \
+  lcol(1) = lhs_element(1, j); \
+  rrow(1) = rhs_element(i, 1); \
+  lcol(2) = lhs_element(2, j); \
+  rrow(2) = rhs_element(i, 2); \
+  lcol(3) = lhs_element(3, j); \
+  rrow(3) = rhs_element(i, 3); \
+  lcol(4) = lhs_element(4, j); \
+  rrow(4) = rhs_element(i, 4); \
+  lcol(5) = lhs_element(5, j); \
+  rrow(5) = rhs_element(i, 5); \
+  lcol(6) = lhs_element(6, j); \
+  rrow(6) = rhs_element(i, 6); \
+  lcol(7) = lhs_element(7, j); \
+  rrow(7) = rhs_element(i, 7);
 
-#define computeCol(j)                           \
-    res(0, j) += lcol(0) * rrow(j);             \
-    res(1, j) += lcol(1) * rrow(j);             \
-    res(2, j) += lcol(2) * rrow(j);             \
-    res(3, j) += lcol(3) * rrow(j);             \
-    res(4, j) += lcol(4) * rrow(j);             \
-    res(5, j) += lcol(5) * rrow(j);             \
-    res(6, j) += lcol(6) * rrow(j);             \
-    res(7, j) += lcol(7) * rrow(j);             \
+#define computeCol(j)             \
+  res(0, j) += lcol(0) * rrow(j); \
+  res(1, j) += lcol(1) * rrow(j); \
+  res(2, j) += lcol(2) * rrow(j); \
+  res(3, j) += lcol(3) * rrow(j); \
+  res(4, j) += lcol(4) * rrow(j); \
+  res(5, j) += lcol(5) * rrow(j); \
+  res(6, j) += lcol(6) * rrow(j); \
+  res(7, j) += lcol(7) * rrow(j);
 
-#define computePass(i)                          \
-    loadData(i, i);                             \
-                                                \
-    computeCol(0);                              \
-    computeCol(1);                              \
-    computeCol(2);                              \
-    computeCol(3);                              \
-    computeCol(4);                              \
-    computeCol(5);                              \
-    computeCol(6);                              \
-    computeCol(7);                              \
+#define computePass(i) \
+  loadData(i, i);      \
+                       \
+  computeCol(0);       \
+  computeCol(1);       \
+  computeCol(2);       \
+  computeCol(3);       \
+  computeCol(4);       \
+  computeCol(5);       \
+  computeCol(6);       \
+  computeCol(7);
 
     computePass(0);
     computePass(1);
@@ -384,7 +383,7 @@
 #undef loadData
 #undef computeCol
 #undef computePass
-  } // end loop over k
+  }  // end loop over k
 
   // we've now iterated over all of the large (ie width 64) k blocks and
   // accumulated results in registers. At this point thread (x, y, z) contains
@@ -397,25 +396,25 @@
 #define shuffleInc(i, j, mask) res(i, j) += __shfl_xor_sync(0xFFFFFFFF, res(i, j), mask)
 #endif
 
-#define reduceRow(i, mask)                      \
-  shuffleInc(i, 0, mask);                       \
-  shuffleInc(i, 1, mask);                       \
-  shuffleInc(i, 2, mask);                       \
-  shuffleInc(i, 3, mask);                       \
-  shuffleInc(i, 4, mask);                       \
-  shuffleInc(i, 5, mask);                       \
-  shuffleInc(i, 6, mask);                       \
-  shuffleInc(i, 7, mask);                       \
+#define reduceRow(i, mask) \
+  shuffleInc(i, 0, mask);  \
+  shuffleInc(i, 1, mask);  \
+  shuffleInc(i, 2, mask);  \
+  shuffleInc(i, 3, mask);  \
+  shuffleInc(i, 4, mask);  \
+  shuffleInc(i, 5, mask);  \
+  shuffleInc(i, 6, mask);  \
+  shuffleInc(i, 7, mask);
 
-#define reduceMatrix(mask)                      \
-  reduceRow(0, mask);                           \
-  reduceRow(1, mask);                           \
-  reduceRow(2, mask);                           \
-  reduceRow(3, mask);                           \
-  reduceRow(4, mask);                           \
-  reduceRow(5, mask);                           \
-  reduceRow(6, mask);                           \
-  reduceRow(7, mask);                           \
+#define reduceMatrix(mask) \
+  reduceRow(0, mask);      \
+  reduceRow(1, mask);      \
+  reduceRow(2, mask);      \
+  reduceRow(3, mask);      \
+  reduceRow(4, mask);      \
+  reduceRow(5, mask);      \
+  reduceRow(6, mask);      \
+  reduceRow(7, mask);
 
   // actually perform the reduction, now each thread of index (_, y, z)
   // contains the correct values in its registers that belong in the output
@@ -442,18 +441,17 @@
   // wait for shared mem to be out of use
   __syncthreads();
 
-#define writeResultShmem(i, j)                                          \
-  lhs_shmem[i + 8 * threadIdx.y + 64 * threadIdx.z + 512 * j] = res(i, j); \
+#define writeResultShmem(i, j) lhs_shmem[i + 8 * threadIdx.y + 64 * threadIdx.z + 512 * j] = res(i, j);
 
-#define writeRow(i)                             \
-  writeResultShmem(i, 0);                       \
-  writeResultShmem(i, 1);                       \
-  writeResultShmem(i, 2);                       \
-  writeResultShmem(i, 3);                       \
-  writeResultShmem(i, 4);                       \
-  writeResultShmem(i, 5);                       \
-  writeResultShmem(i, 6);                       \
-  writeResultShmem(i, 7);                       \
+#define writeRow(i)       \
+  writeResultShmem(i, 0); \
+  writeResultShmem(i, 1); \
+  writeResultShmem(i, 2); \
+  writeResultShmem(i, 3); \
+  writeResultShmem(i, 4); \
+  writeResultShmem(i, 5); \
+  writeResultShmem(i, 6); \
+  writeResultShmem(i, 7);
 
   if (threadIdx.x == 0) {
     writeRow(0);
@@ -502,18 +500,15 @@
 #undef res
 }
 
-
-template<typename Scalar, typename Index, typename LhsMapper,
-         typename RhsMapper, typename OutputMapper>
+template <typename Scalar, typename Index, typename LhsMapper, typename RhsMapper, typename OutputMapper>
 __global__ void
 #if defined(EIGEN_HIPCC)
 __launch_bounds__(512, 1)
 #else
 __launch_bounds__(512)
 #endif
-EigenContractionKernel(const LhsMapper lhs, const RhsMapper rhs,
-                       const OutputMapper output,
-                       const Index m_size, const Index n_size, const Index k_size) {
+    EigenContractionKernel(const LhsMapper lhs, const RhsMapper rhs, const OutputMapper output, const Index m_size,
+                           const Index n_size, const Index k_size) {
   __shared__ Scalar lhs_shmem[72 * 64];
   __shared__ Scalar rhs_shmem[72 * 64];
 
@@ -524,70 +519,68 @@
   const Index base_n = 64 * n_block_idx;
 
   if (base_m + 63 < m_size && base_n + 63 < n_size) {
-    EigenContractionKernelInternal<Scalar, Index, LhsMapper, RhsMapper, OutputMapper, false>(lhs, rhs, output, lhs_shmem, rhs_shmem, m_size, n_size, k_size);
+    EigenContractionKernelInternal<Scalar, Index, LhsMapper, RhsMapper, OutputMapper, false>(
+        lhs, rhs, output, lhs_shmem, rhs_shmem, m_size, n_size, k_size);
   } else {
-    EigenContractionKernelInternal<Scalar, Index, LhsMapper, RhsMapper, OutputMapper, true>(lhs, rhs, output, lhs_shmem, rhs_shmem, m_size, n_size, k_size);
+    EigenContractionKernelInternal<Scalar, Index, LhsMapper, RhsMapper, OutputMapper, true>(
+        lhs, rhs, output, lhs_shmem, rhs_shmem, m_size, n_size, k_size);
   }
 }
 
-
-template<typename Index, typename LhsMapper,
-         typename RhsMapper, typename OutputMapper, bool CHECK_LHS_BOUNDARY,
-         bool CHECK_RHS_BOUNDARY>
-__device__ __forceinline__ void
-EigenFloatContractionKernelInternal16x16(const LhsMapper lhs, const RhsMapper rhs,
-                       const OutputMapper output, float2 lhs_shmem2[][16],
-                       float2 rhs_shmem2[][8], const Index m_size,
-                       const Index n_size, const Index k_size,
-                       const Index base_m, const Index base_n) {
-
+template <typename Index, typename LhsMapper, typename RhsMapper, typename OutputMapper, bool CHECK_LHS_BOUNDARY,
+          bool CHECK_RHS_BOUNDARY>
+__device__ __forceinline__ void EigenFloatContractionKernelInternal16x16(const LhsMapper lhs, const RhsMapper rhs,
+                                                                         const OutputMapper output,
+                                                                         float2 lhs_shmem2[][16],
+                                                                         float2 rhs_shmem2[][8], const Index m_size,
+                                                                         const Index n_size, const Index k_size,
+                                                                         const Index base_m, const Index base_n) {
   // prefetch registers
   float4 lhs_pf0, rhs_pf0;
 
   float4 results[4];
-  for (int i=0; i < 4; i++) {
+  for (int i = 0; i < 4; i++) {
     results[i].x = results[i].y = results[i].z = results[i].w = 0;
   }
 
-#define prefetch_lhs(reg, row, col)                            \
-    if (!CHECK_LHS_BOUNDARY) {                                 \
-      if (col < k_size) {                                      \
-        reg =lhs.template loadPacket<float4,Unaligned>(row, col);     \
-      }                                                        \
-    } else {                                                   \
-      if (col < k_size) {                                      \
-        if (row + 3 < m_size) {                                \
-          reg =lhs.template loadPacket<float4,Unaligned>(row, col);   \
-        } else if (row + 2 < m_size) {                         \
-          reg.x =lhs(row + 0, col);                            \
-          reg.y =lhs(row + 1, col);                            \
-          reg.z =lhs(row + 2, col);                            \
-        } else if (row + 1 < m_size) {                         \
-          reg.x =lhs(row + 0, col);                            \
-          reg.y =lhs(row + 1, col);                            \
-        } else if (row  < m_size) {                            \
-          reg.x =lhs(row + 0, col);                            \
-        }                                                      \
-      }                                                        \
-    }							       \
+#define prefetch_lhs(reg, row, col)                                 \
+  if (!CHECK_LHS_BOUNDARY) {                                        \
+    if (col < k_size) {                                             \
+      reg = lhs.template loadPacket<float4, Unaligned>(row, col);   \
+    }                                                               \
+  } else {                                                          \
+    if (col < k_size) {                                             \
+      if (row + 3 < m_size) {                                       \
+        reg = lhs.template loadPacket<float4, Unaligned>(row, col); \
+      } else if (row + 2 < m_size) {                                \
+        reg.x = lhs(row + 0, col);                                  \
+        reg.y = lhs(row + 1, col);                                  \
+        reg.z = lhs(row + 2, col);                                  \
+      } else if (row + 1 < m_size) {                                \
+        reg.x = lhs(row + 0, col);                                  \
+        reg.y = lhs(row + 1, col);                                  \
+      } else if (row < m_size) {                                    \
+        reg.x = lhs(row + 0, col);                                  \
+      }                                                             \
+    }                                                               \
+  }
 
-  Index lhs_vert = base_m+threadIdx.x*4;
+  Index lhs_vert = base_m + threadIdx.x * 4;
 
   for (Index k = 0; k < k_size; k += 16) {
-
     lhs_pf0 = internal::pset1<float4>(0);
     rhs_pf0 = internal::pset1<float4>(0);
 
-    Index lhs_horiz = threadIdx.y+k;
+    Index lhs_horiz = threadIdx.y + k;
     prefetch_lhs(lhs_pf0, lhs_vert, lhs_horiz)
 
-    Index rhs_vert = k+(threadIdx.x%4)*4;
-    Index rhs_horiz0 = (threadIdx.x>>2)+threadIdx.y*4+base_n;
+        Index rhs_vert = k + (threadIdx.x % 4) * 4;
+    Index rhs_horiz0 = (threadIdx.x >> 2) + threadIdx.y * 4 + base_n;
 
     if (!CHECK_RHS_BOUNDARY) {
       if ((rhs_vert + 3) < k_size) {
         // just CHECK_RHS_BOUNDARY
-        rhs_pf0 = rhs.template loadPacket<float4,Unaligned>(rhs_vert, rhs_horiz0);
+        rhs_pf0 = rhs.template loadPacket<float4, Unaligned>(rhs_vert, rhs_horiz0);
       } else if (rhs_vert + 2 < k_size) {
         // just CHECK_RHS_BOUNDARY
         rhs_pf0.x = rhs(rhs_vert, rhs_horiz0);
@@ -596,13 +589,13 @@
       } else if (rhs_vert + 1 < k_size) {
         rhs_pf0.x = rhs(rhs_vert, rhs_horiz0);
         rhs_pf0.y = rhs(rhs_vert + 1, rhs_horiz0);
-      } else if (rhs_vert  < k_size) {
+      } else if (rhs_vert < k_size) {
         rhs_pf0.x = rhs(rhs_vert, rhs_horiz0);
       }
     } else {
       if (rhs_horiz0 < n_size) {
         if ((rhs_vert + 3) < k_size) {
-          rhs_pf0 = rhs.template loadPacket<float4,Unaligned>(rhs_vert, rhs_horiz0);
+          rhs_pf0 = rhs.template loadPacket<float4, Unaligned>(rhs_vert, rhs_horiz0);
         } else if ((rhs_vert + 2) < k_size) {
           rhs_pf0.x = rhs(rhs_vert, rhs_horiz0);
           rhs_pf0.y = rhs(rhs_vert + 1, rhs_horiz0);
@@ -610,28 +603,28 @@
         } else if ((rhs_vert + 1) < k_size) {
           rhs_pf0.x = rhs(rhs_vert, rhs_horiz0);
           rhs_pf0.y = rhs(rhs_vert + 1, rhs_horiz0);
-        } else if (rhs_vert  < k_size) {
+        } else if (rhs_vert < k_size) {
           rhs_pf0.x = rhs(rhs_vert, rhs_horiz0);
         }
       }
     }
-    float x1, x2 ;
+    float x1, x2;
     // the following can be a bitwise operation..... some day.
-    if((threadIdx.x%8) < 4) {
+    if ((threadIdx.x % 8) < 4) {
       x1 = rhs_pf0.y;
       x2 = rhs_pf0.w;
     } else {
       x1 = rhs_pf0.x;
       x2 = rhs_pf0.z;
     }
-    #if defined(EIGEN_HIPCC) || (defined(EIGEN_CUDA_SDK_VER) && EIGEN_CUDA_SDK_VER < 90000)
+#if defined(EIGEN_HIPCC) || (defined(EIGEN_CUDA_SDK_VER) && EIGEN_CUDA_SDK_VER < 90000)
     x1 = __shfl_xor(x1, 4);
     x2 = __shfl_xor(x2, 4);
-    #else
+#else
     x1 = __shfl_xor_sync(0xFFFFFFFF, x1, 4);
     x2 = __shfl_xor_sync(0xFFFFFFFF, x2, 4);
-    #endif
-    if((threadIdx.x%8) < 4) {
+#endif
+    if ((threadIdx.x % 8) < 4) {
       rhs_pf0.y = x1;
       rhs_pf0.w = x2;
     } else {
@@ -646,8 +639,8 @@
     // Row 31 -> times (0, 4, 8, 12, 1, 5, 9, 13) for features 62, 63
     // Row 32 -> times (2, 6, 10, 14, 3, 7, 11, 15) for features 0, 1
     // ...
-    rhs_shmem2[(threadIdx.x>>3)+ threadIdx.y*2][threadIdx.x%8] = make_float2(rhs_pf0.x, rhs_pf0.y);
-    rhs_shmem2[(threadIdx.x>>3)+ threadIdx.y*2+32][threadIdx.x%8] = make_float2(rhs_pf0.z, rhs_pf0.w);
+    rhs_shmem2[(threadIdx.x >> 3) + threadIdx.y * 2][threadIdx.x % 8] = make_float2(rhs_pf0.x, rhs_pf0.y);
+    rhs_shmem2[(threadIdx.x >> 3) + threadIdx.y * 2 + 32][threadIdx.x % 8] = make_float2(rhs_pf0.z, rhs_pf0.w);
 
     // Row 0 (time 0) -> features (0, 1), (4, 5), .. (28, 29), (32, 33), ..  (60, 61)
     // Row 1 (time 1) -> features (0, 1), (4, 5), .. (28, 29), (32, 33), ..  (60, 61)
@@ -657,42 +650,41 @@
     // ...
 
     lhs_shmem2[threadIdx.y][threadIdx.x] = make_float2(lhs_pf0.x, lhs_pf0.y);
-    lhs_shmem2[threadIdx.y+16][threadIdx.x] = make_float2(lhs_pf0.z, lhs_pf0.w);
+    lhs_shmem2[threadIdx.y + 16][threadIdx.x] = make_float2(lhs_pf0.z, lhs_pf0.w);
 
-
-#define add_vals(fl1, fl2, fr1, fr2)\
-    results[0].x += fl1.x * fr1.x;\
-    results[0].y += fl1.y * fr1.x;\
-    results[0].z += fl2.x * fr1.x;\
-    results[0].w += fl2.y * fr1.x;\
-\
-    results[1].x += fl1.x * fr1.y;\
-    results[1].y += fl1.y * fr1.y;\
-    results[1].z += fl2.x * fr1.y;\
-    results[1].w += fl2.y * fr1.y;\
-\
-    results[2].x += fl1.x * fr2.x;\
-    results[2].y += fl1.y * fr2.x;\
-    results[2].z += fl2.x * fr2.x;\
-    results[2].w += fl2.y * fr2.x;\
-\
-    results[3].x += fl1.x * fr2.y;\
-    results[3].y += fl1.y * fr2.y;\
-    results[3].z += fl2.x * fr2.y;\
-    results[3].w += fl2.y * fr2.y;\
+#define add_vals(fl1, fl2, fr1, fr2) \
+  results[0].x += fl1.x * fr1.x;     \
+  results[0].y += fl1.y * fr1.x;     \
+  results[0].z += fl2.x * fr1.x;     \
+  results[0].w += fl2.y * fr1.x;     \
+                                     \
+  results[1].x += fl1.x * fr1.y;     \
+  results[1].y += fl1.y * fr1.y;     \
+  results[1].z += fl2.x * fr1.y;     \
+  results[1].w += fl2.y * fr1.y;     \
+                                     \
+  results[2].x += fl1.x * fr2.x;     \
+  results[2].y += fl1.y * fr2.x;     \
+  results[2].z += fl2.x * fr2.x;     \
+  results[2].w += fl2.y * fr2.x;     \
+                                     \
+  results[3].x += fl1.x * fr2.y;     \
+  results[3].y += fl1.y * fr2.y;     \
+  results[3].z += fl2.x * fr2.y;     \
+  results[3].w += fl2.y * fr2.y;
 
     __syncthreads();
 
-    // Do the multiplies.
-    #pragma unroll
-    for (int koff = 0; koff < 16; koff ++) {
+// Do the multiplies.
+#pragma unroll
+    for (int koff = 0; koff < 16; koff++) {
       // 32 x threads.
       float2 fl1 = lhs_shmem2[koff][threadIdx.x];
       float2 fl2 = lhs_shmem2[koff + 16][threadIdx.x];
 
       int start_feature = threadIdx.y * 4;
-      float2 fr1 = rhs_shmem2[(start_feature>>1) + 32*((koff%4)/2)][koff/4 + (koff%2)*4];
-      float2 fr2 = rhs_shmem2[(start_feature>>1) + 1 + 32*((koff%4)/2)][koff/4 + (koff%2)*4];
+      float2 fr1 = rhs_shmem2[(start_feature >> 1) + 32 * ((koff % 4) / 2)][koff / 4 + (koff % 2) * 4];
+      float2 fr2 = rhs_shmem2[(start_feature >> 1) + 1 + 32 * ((koff % 4) / 2)][koff / 4 + (koff % 2) * 4];
 
       add_vals(fl1, fl2, fr1, fr2)
     }
@@ -702,7 +694,7 @@
 #undef prefetch_lhs
 #undef add_vals
 
-  Index horiz_base = threadIdx.y*4+base_n;
+  Index horiz_base = threadIdx.y * 4 + base_n;
   if (!CHECK_LHS_BOUNDARY && !CHECK_RHS_BOUNDARY) {
     for (int i = 0; i < 4; i++) {
       output(lhs_vert, horiz_base + i) = results[i].x;
@@ -730,7 +722,7 @@
         output(lhs_vert, horiz_base + i) = results[i].x;
         output(lhs_vert + 1, horiz_base + i) = results[i].y;
       }
-    } else if (lhs_vert  < m_size) {
+    } else if (lhs_vert < m_size) {
       for (int i = 0; i < 4; i++) {
         output(lhs_vert, horiz_base + i) = results[i].x;
       }
@@ -746,51 +738,43 @@
       output(lhs_vert + 3, horiz_base + i) = results[i].w;
     }*/
     for (int i = 0; i < 4; i++) {
-      if (horiz_base+i < n_size) {
+      if (horiz_base + i < n_size) {
         output(lhs_vert, horiz_base + i) = results[i].x;
         output(lhs_vert + 1, horiz_base + i) = results[i].y;
         output(lhs_vert + 2, horiz_base + i) = results[i].z;
         output(lhs_vert + 3, horiz_base + i) = results[i].w;
-       }
+      }
     }
   } else {
     // CHECK both boundaries.
     for (int i = 0; i < 4; i++) {
-      if (horiz_base+i < n_size) {
-        if (lhs_vert < m_size)
-          output(lhs_vert, horiz_base + i) = results[i].x;
-        if (lhs_vert + 1 < m_size)
-          output(lhs_vert + 1, horiz_base + i) = results[i].y;
-        if (lhs_vert + 2 < m_size)
-          output(lhs_vert + 2, horiz_base + i) = results[i].z;
-        if (lhs_vert + 3 < m_size)
-          output(lhs_vert + 3, horiz_base + i) = results[i].w;
+      if (horiz_base + i < n_size) {
+        if (lhs_vert < m_size) output(lhs_vert, horiz_base + i) = results[i].x;
+        if (lhs_vert + 1 < m_size) output(lhs_vert + 1, horiz_base + i) = results[i].y;
+        if (lhs_vert + 2 < m_size) output(lhs_vert + 2, horiz_base + i) = results[i].z;
+        if (lhs_vert + 3 < m_size) output(lhs_vert + 3, horiz_base + i) = results[i].w;
       }
     }
   }
 }
 
-
-template<typename Index, typename LhsMapper,
-         typename RhsMapper, typename OutputMapper, bool CHECK_LHS_BOUNDARY,
-         bool CHECK_RHS_BOUNDARY>
-__device__ __forceinline__ void
-EigenFloatContractionKernelInternal(const LhsMapper lhs, const RhsMapper rhs,
-                       const OutputMapper output, float2 lhs_shmem2[][32],
-                       float2 rhs_shmem2[][8], const Index m_size,
-                       const Index n_size, const Index k_size,
-                       const Index base_m, const Index base_n) {
-
+template <typename Index, typename LhsMapper, typename RhsMapper, typename OutputMapper, bool CHECK_LHS_BOUNDARY,
+          bool CHECK_RHS_BOUNDARY>
+__device__ __forceinline__ void EigenFloatContractionKernelInternal(const LhsMapper lhs, const RhsMapper rhs,
+                                                                    const OutputMapper output, float2 lhs_shmem2[][32],
+                                                                    float2 rhs_shmem2[][8], const Index m_size,
+                                                                    const Index n_size, const Index k_size,
+                                                                    const Index base_m, const Index base_n) {
   // prefetch registers
   float4 lhs_pf0, lhs_pf1, lhs_pf2, lhs_pf3;
   float4 rhs_pf0, rhs_pf1;
 
   float4 results[8];
-  for (int i=0; i < 8; i++) {
+  for (int i = 0; i < 8; i++) {
     results[i].x = results[i].y = results[i].z = results[i].w = 0;
   }
 
-  Index lhs_vert = base_m+threadIdx.x*4+(threadIdx.y%4)*32;
+  Index lhs_vert = base_m + threadIdx.x * 4 + (threadIdx.y % 4) * 32;
   for (Index k = 0; k < k_size; k += 32) {
     lhs_pf0 = internal::pset1<float4>(0);
     lhs_pf1 = internal::pset1<float4>(0);
@@ -800,129 +784,129 @@
     rhs_pf0 = internal::pset1<float4>(0);
     rhs_pf1 = internal::pset1<float4>(0);
 
-     if (!CHECK_LHS_BOUNDARY) {
-      if ((threadIdx.y/4+k+24) < k_size) {
-        lhs_pf0 =lhs.template loadPacket<float4,Unaligned>(lhs_vert, (threadIdx.y/4+k));
-        lhs_pf1 =lhs.template loadPacket<float4,Unaligned>(lhs_vert, (threadIdx.y/4+k+8));
-        lhs_pf2 =lhs.template loadPacket<float4,Unaligned>(lhs_vert, (threadIdx.y/4+k+16));
-        lhs_pf3 =lhs.template loadPacket<float4,Unaligned>(lhs_vert, (threadIdx.y/4+k+24));
-      } else if ((threadIdx.y/4+k+16) < k_size) {
-        lhs_pf0 =lhs.template loadPacket<float4,Unaligned>(lhs_vert, (threadIdx.y/4+k));
-        lhs_pf1 =lhs.template loadPacket<float4,Unaligned>(lhs_vert, (threadIdx.y/4+k+8));
-        lhs_pf2 =lhs.template loadPacket<float4,Unaligned>(lhs_vert, (threadIdx.y/4+k+16));
-      } else if ((threadIdx.y/4+k+8) < k_size) {
-        lhs_pf0 =lhs.template loadPacket<float4,Unaligned>(lhs_vert, (threadIdx.y/4+k));
-        lhs_pf1 =lhs.template loadPacket<float4,Unaligned>(lhs_vert, (threadIdx.y/4+k+8));
-      } else if ((threadIdx.y/4+k) < k_size) {
-        lhs_pf0 =lhs.template loadPacket<float4,Unaligned>(lhs_vert, (threadIdx.y/4+k));
+    if (!CHECK_LHS_BOUNDARY) {
+      if ((threadIdx.y / 4 + k + 24) < k_size) {
+        lhs_pf0 = lhs.template loadPacket<float4, Unaligned>(lhs_vert, (threadIdx.y / 4 + k));
+        lhs_pf1 = lhs.template loadPacket<float4, Unaligned>(lhs_vert, (threadIdx.y / 4 + k + 8));
+        lhs_pf2 = lhs.template loadPacket<float4, Unaligned>(lhs_vert, (threadIdx.y / 4 + k + 16));
+        lhs_pf3 = lhs.template loadPacket<float4, Unaligned>(lhs_vert, (threadIdx.y / 4 + k + 24));
+      } else if ((threadIdx.y / 4 + k + 16) < k_size) {
+        lhs_pf0 = lhs.template loadPacket<float4, Unaligned>(lhs_vert, (threadIdx.y / 4 + k));
+        lhs_pf1 = lhs.template loadPacket<float4, Unaligned>(lhs_vert, (threadIdx.y / 4 + k + 8));
+        lhs_pf2 = lhs.template loadPacket<float4, Unaligned>(lhs_vert, (threadIdx.y / 4 + k + 16));
+      } else if ((threadIdx.y / 4 + k + 8) < k_size) {
+        lhs_pf0 = lhs.template loadPacket<float4, Unaligned>(lhs_vert, (threadIdx.y / 4 + k));
+        lhs_pf1 = lhs.template loadPacket<float4, Unaligned>(lhs_vert, (threadIdx.y / 4 + k + 8));
+      } else if ((threadIdx.y / 4 + k) < k_size) {
+        lhs_pf0 = lhs.template loadPacket<float4, Unaligned>(lhs_vert, (threadIdx.y / 4 + k));
       }
     } else {
       // just CHECK_LHS_BOUNDARY
       if (lhs_vert + 3 < m_size) {
-        if ((threadIdx.y/4+k+24) < k_size) {
-          lhs_pf0 =lhs.template loadPacket<float4,Unaligned>(lhs_vert, (threadIdx.y/4+k));
-          lhs_pf1 =lhs.template loadPacket<float4,Unaligned>(lhs_vert, (threadIdx.y/4+k+8));
-          lhs_pf2 =lhs.template loadPacket<float4,Unaligned>(lhs_vert, (threadIdx.y/4+k+16));
-          lhs_pf3 =lhs.template loadPacket<float4,Unaligned>(lhs_vert, (threadIdx.y/4+k+24));
-        } else if ((threadIdx.y/4+k+16) < k_size) {
-          lhs_pf0 =lhs.template loadPacket<float4,Unaligned>(lhs_vert, (threadIdx.y/4+k));
-          lhs_pf1 =lhs.template loadPacket<float4,Unaligned>(lhs_vert, (threadIdx.y/4+k+8));
-          lhs_pf2 =lhs.template loadPacket<float4,Unaligned>(lhs_vert, (threadIdx.y/4+k+16));
-        } else if ((threadIdx.y/4+k+8) < k_size) {
-          lhs_pf0 =lhs.template loadPacket<float4,Unaligned>(lhs_vert, (threadIdx.y/4+k));
-          lhs_pf1 =lhs.template loadPacket<float4,Unaligned>(lhs_vert, (threadIdx.y/4+k+8));
-        } else if ((threadIdx.y/4+k) < k_size) {
-          lhs_pf0 =lhs.template loadPacket<float4,Unaligned>(lhs_vert, (threadIdx.y/4+k));
+        if ((threadIdx.y / 4 + k + 24) < k_size) {
+          lhs_pf0 = lhs.template loadPacket<float4, Unaligned>(lhs_vert, (threadIdx.y / 4 + k));
+          lhs_pf1 = lhs.template loadPacket<float4, Unaligned>(lhs_vert, (threadIdx.y / 4 + k + 8));
+          lhs_pf2 = lhs.template loadPacket<float4, Unaligned>(lhs_vert, (threadIdx.y / 4 + k + 16));
+          lhs_pf3 = lhs.template loadPacket<float4, Unaligned>(lhs_vert, (threadIdx.y / 4 + k + 24));
+        } else if ((threadIdx.y / 4 + k + 16) < k_size) {
+          lhs_pf0 = lhs.template loadPacket<float4, Unaligned>(lhs_vert, (threadIdx.y / 4 + k));
+          lhs_pf1 = lhs.template loadPacket<float4, Unaligned>(lhs_vert, (threadIdx.y / 4 + k + 8));
+          lhs_pf2 = lhs.template loadPacket<float4, Unaligned>(lhs_vert, (threadIdx.y / 4 + k + 16));
+        } else if ((threadIdx.y / 4 + k + 8) < k_size) {
+          lhs_pf0 = lhs.template loadPacket<float4, Unaligned>(lhs_vert, (threadIdx.y / 4 + k));
+          lhs_pf1 = lhs.template loadPacket<float4, Unaligned>(lhs_vert, (threadIdx.y / 4 + k + 8));
+        } else if ((threadIdx.y / 4 + k) < k_size) {
+          lhs_pf0 = lhs.template loadPacket<float4, Unaligned>(lhs_vert, (threadIdx.y / 4 + k));
         }
       } else if (lhs_vert + 2 < m_size) {
-        if ((threadIdx.y/4+k+24) < k_size) {
-          lhs_pf0.x =lhs(lhs_vert + 0, (threadIdx.y/4+k));
-          lhs_pf0.y =lhs(lhs_vert + 1, (threadIdx.y/4+k));
-          lhs_pf0.z =lhs(lhs_vert + 2, (threadIdx.y/4+k));
-          lhs_pf1.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+8));
-          lhs_pf1.y =lhs(lhs_vert + 1, (threadIdx.y/4+k+8));
-          lhs_pf1.z =lhs(lhs_vert + 2, (threadIdx.y/4+k+8));
-          lhs_pf2.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+16));
-          lhs_pf2.y =lhs(lhs_vert + 1, (threadIdx.y/4+k+16));
-          lhs_pf2.z =lhs(lhs_vert + 2, (threadIdx.y/4+k+16));
-          lhs_pf3.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+24));
-          lhs_pf3.y =lhs(lhs_vert + 1, (threadIdx.y/4+k+24));
-          lhs_pf3.z =lhs(lhs_vert + 2, (threadIdx.y/4+k+24));
-        } else if ((threadIdx.y/4+k+16) < k_size) {
-          lhs_pf0.x =lhs(lhs_vert + 0, (threadIdx.y/4+k));
-          lhs_pf0.y =lhs(lhs_vert + 1, (threadIdx.y/4+k));
-          lhs_pf0.z =lhs(lhs_vert + 2, (threadIdx.y/4+k));
-          lhs_pf1.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+8));
-          lhs_pf1.y =lhs(lhs_vert + 1, (threadIdx.y/4+k+8));
-          lhs_pf1.z =lhs(lhs_vert + 2, (threadIdx.y/4+k+8));
-          lhs_pf2.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+16));
-          lhs_pf2.y =lhs(lhs_vert + 1, (threadIdx.y/4+k+16));
-          lhs_pf2.z =lhs(lhs_vert + 2, (threadIdx.y/4+k+16));
-        } else if ((threadIdx.y/4+k+8) < k_size) {
-          lhs_pf0.x =lhs(lhs_vert + 0, (threadIdx.y/4+k));
-          lhs_pf0.y =lhs(lhs_vert + 1, (threadIdx.y/4+k));
-          lhs_pf0.z =lhs(lhs_vert + 2, (threadIdx.y/4+k));
-          lhs_pf1.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+8));
-          lhs_pf1.y =lhs(lhs_vert + 1, (threadIdx.y/4+k+8));
-          lhs_pf1.z =lhs(lhs_vert + 2, (threadIdx.y/4+k+8));
-        } else if ((threadIdx.y/4+k) < k_size) {
-          lhs_pf0.x =lhs(lhs_vert + 0, (threadIdx.y/4+k));
-          lhs_pf0.y =lhs(lhs_vert + 1, (threadIdx.y/4+k));
-          lhs_pf0.z =lhs(lhs_vert + 2, (threadIdx.y/4+k));
+        if ((threadIdx.y / 4 + k + 24) < k_size) {
+          lhs_pf0.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k));
+          lhs_pf0.y = lhs(lhs_vert + 1, (threadIdx.y / 4 + k));
+          lhs_pf0.z = lhs(lhs_vert + 2, (threadIdx.y / 4 + k));
+          lhs_pf1.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k + 8));
+          lhs_pf1.y = lhs(lhs_vert + 1, (threadIdx.y / 4 + k + 8));
+          lhs_pf1.z = lhs(lhs_vert + 2, (threadIdx.y / 4 + k + 8));
+          lhs_pf2.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k + 16));
+          lhs_pf2.y = lhs(lhs_vert + 1, (threadIdx.y / 4 + k + 16));
+          lhs_pf2.z = lhs(lhs_vert + 2, (threadIdx.y / 4 + k + 16));
+          lhs_pf3.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k + 24));
+          lhs_pf3.y = lhs(lhs_vert + 1, (threadIdx.y / 4 + k + 24));
+          lhs_pf3.z = lhs(lhs_vert + 2, (threadIdx.y / 4 + k + 24));
+        } else if ((threadIdx.y / 4 + k + 16) < k_size) {
+          lhs_pf0.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k));
+          lhs_pf0.y = lhs(lhs_vert + 1, (threadIdx.y / 4 + k));
+          lhs_pf0.z = lhs(lhs_vert + 2, (threadIdx.y / 4 + k));
+          lhs_pf1.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k + 8));
+          lhs_pf1.y = lhs(lhs_vert + 1, (threadIdx.y / 4 + k + 8));
+          lhs_pf1.z = lhs(lhs_vert + 2, (threadIdx.y / 4 + k + 8));
+          lhs_pf2.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k + 16));
+          lhs_pf2.y = lhs(lhs_vert + 1, (threadIdx.y / 4 + k + 16));
+          lhs_pf2.z = lhs(lhs_vert + 2, (threadIdx.y / 4 + k + 16));
+        } else if ((threadIdx.y / 4 + k + 8) < k_size) {
+          lhs_pf0.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k));
+          lhs_pf0.y = lhs(lhs_vert + 1, (threadIdx.y / 4 + k));
+          lhs_pf0.z = lhs(lhs_vert + 2, (threadIdx.y / 4 + k));
+          lhs_pf1.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k + 8));
+          lhs_pf1.y = lhs(lhs_vert + 1, (threadIdx.y / 4 + k + 8));
+          lhs_pf1.z = lhs(lhs_vert + 2, (threadIdx.y / 4 + k + 8));
+        } else if ((threadIdx.y / 4 + k) < k_size) {
+          lhs_pf0.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k));
+          lhs_pf0.y = lhs(lhs_vert + 1, (threadIdx.y / 4 + k));
+          lhs_pf0.z = lhs(lhs_vert + 2, (threadIdx.y / 4 + k));
         }
       } else if (lhs_vert + 1 < m_size) {
-        if ((threadIdx.y/4+k+24) < k_size) {
-          lhs_pf0.x =lhs(lhs_vert + 0, (threadIdx.y/4+k));
-          lhs_pf0.y =lhs(lhs_vert + 1, (threadIdx.y/4+k));
-          lhs_pf1.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+8));
-          lhs_pf1.y =lhs(lhs_vert + 1, (threadIdx.y/4+k+8));
-          lhs_pf2.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+16));
-          lhs_pf2.y =lhs(lhs_vert + 1, (threadIdx.y/4+k+16));
-          lhs_pf3.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+24));
-          lhs_pf3.y =lhs(lhs_vert + 1, (threadIdx.y/4+k+24));
-        } else if ((threadIdx.y/4+k+16) < k_size) {
-          lhs_pf0.x =lhs(lhs_vert + 0, (threadIdx.y/4+k));
-          lhs_pf0.y =lhs(lhs_vert + 1, (threadIdx.y/4+k));
-          lhs_pf1.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+8));
-          lhs_pf1.y =lhs(lhs_vert + 1, (threadIdx.y/4+k+8));
-          lhs_pf2.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+16));
-          lhs_pf2.y =lhs(lhs_vert + 1, (threadIdx.y/4+k+16));
-        } else if ((threadIdx.y/4+k+8) < k_size) {
-          lhs_pf0.x =lhs(lhs_vert + 0, (threadIdx.y/4+k));
-          lhs_pf0.y =lhs(lhs_vert + 1, (threadIdx.y/4+k));
-          lhs_pf1.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+8));
-          lhs_pf1.y =lhs(lhs_vert + 1, (threadIdx.y/4+k+8));
-        } else if ((threadIdx.y/4+k) < k_size) {
-          lhs_pf0.x =lhs(lhs_vert + 0, (threadIdx.y/4+k));
-          lhs_pf0.y =lhs(lhs_vert + 1, (threadIdx.y/4+k));
+        if ((threadIdx.y / 4 + k + 24) < k_size) {
+          lhs_pf0.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k));
+          lhs_pf0.y = lhs(lhs_vert + 1, (threadIdx.y / 4 + k));
+          lhs_pf1.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k + 8));
+          lhs_pf1.y = lhs(lhs_vert + 1, (threadIdx.y / 4 + k + 8));
+          lhs_pf2.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k + 16));
+          lhs_pf2.y = lhs(lhs_vert + 1, (threadIdx.y / 4 + k + 16));
+          lhs_pf3.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k + 24));
+          lhs_pf3.y = lhs(lhs_vert + 1, (threadIdx.y / 4 + k + 24));
+        } else if ((threadIdx.y / 4 + k + 16) < k_size) {
+          lhs_pf0.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k));
+          lhs_pf0.y = lhs(lhs_vert + 1, (threadIdx.y / 4 + k));
+          lhs_pf1.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k + 8));
+          lhs_pf1.y = lhs(lhs_vert + 1, (threadIdx.y / 4 + k + 8));
+          lhs_pf2.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k + 16));
+          lhs_pf2.y = lhs(lhs_vert + 1, (threadIdx.y / 4 + k + 16));
+        } else if ((threadIdx.y / 4 + k + 8) < k_size) {
+          lhs_pf0.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k));
+          lhs_pf0.y = lhs(lhs_vert + 1, (threadIdx.y / 4 + k));
+          lhs_pf1.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k + 8));
+          lhs_pf1.y = lhs(lhs_vert + 1, (threadIdx.y / 4 + k + 8));
+        } else if ((threadIdx.y / 4 + k) < k_size) {
+          lhs_pf0.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k));
+          lhs_pf0.y = lhs(lhs_vert + 1, (threadIdx.y / 4 + k));
         }
       } else if (lhs_vert < m_size) {
-        if ((threadIdx.y/4+k+24) < k_size) {
-          lhs_pf0.x =lhs(lhs_vert + 0, (threadIdx.y/4+k));
-          lhs_pf1.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+8));
-          lhs_pf2.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+16));
-          lhs_pf3.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+24));
-        } else if ((threadIdx.y/4+k+16) < k_size) {
-          lhs_pf0.x =lhs(lhs_vert + 0, (threadIdx.y/4+k));
-          lhs_pf1.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+8));
-          lhs_pf2.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+16));
-        } else if ((threadIdx.y/4+k+8) < k_size) {
-          lhs_pf0.x =lhs(lhs_vert + 0, (threadIdx.y/4+k));
-          lhs_pf1.x =lhs(lhs_vert + 0, (threadIdx.y/4+k+8));
-        } else if ((threadIdx.y/4+k) < k_size) {
-          lhs_pf0.x =lhs(lhs_vert + 0, (threadIdx.y/4+k));
+        if ((threadIdx.y / 4 + k + 24) < k_size) {
+          lhs_pf0.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k));
+          lhs_pf1.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k + 8));
+          lhs_pf2.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k + 16));
+          lhs_pf3.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k + 24));
+        } else if ((threadIdx.y / 4 + k + 16) < k_size) {
+          lhs_pf0.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k));
+          lhs_pf1.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k + 8));
+          lhs_pf2.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k + 16));
+        } else if ((threadIdx.y / 4 + k + 8) < k_size) {
+          lhs_pf0.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k));
+          lhs_pf1.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k + 8));
+        } else if ((threadIdx.y / 4 + k) < k_size) {
+          lhs_pf0.x = lhs(lhs_vert + 0, (threadIdx.y / 4 + k));
         }
       }
     }
     __syncthreads();
-    Index rhs_vert = k+threadIdx.x*4;
-    Index rhs_horiz0 = threadIdx.y*2+base_n;
-    Index rhs_horiz1 = threadIdx.y*2+1+base_n;
+    Index rhs_vert = k + threadIdx.x * 4;
+    Index rhs_horiz0 = threadIdx.y * 2 + base_n;
+    Index rhs_horiz1 = threadIdx.y * 2 + 1 + base_n;
     if (!CHECK_RHS_BOUNDARY) {
       if ((rhs_vert + 3) < k_size) {
         // just CHECK_RHS_BOUNDARY
-        rhs_pf0 = rhs.template loadPacket<float4,Unaligned>(rhs_vert, rhs_horiz0);
-        rhs_pf1 = rhs.template loadPacket<float4,Unaligned>(rhs_vert, rhs_horiz1);
+        rhs_pf0 = rhs.template loadPacket<float4, Unaligned>(rhs_vert, rhs_horiz0);
+        rhs_pf1 = rhs.template loadPacket<float4, Unaligned>(rhs_vert, rhs_horiz1);
       } else if (rhs_vert + 2 < k_size) {
         // just CHECK_RHS_BOUNDARY
         rhs_pf0.x = rhs(rhs_vert, rhs_horiz0);
@@ -936,7 +920,7 @@
         rhs_pf0.y = rhs(rhs_vert + 1, rhs_horiz0);
         rhs_pf1.x = rhs(rhs_vert, rhs_horiz1);
         rhs_pf1.y = rhs(rhs_vert + 1, rhs_horiz1);
-      } else if (rhs_vert  < k_size) {
+      } else if (rhs_vert < k_size) {
         rhs_pf0.x = rhs(rhs_vert, rhs_horiz0);
         rhs_pf1.x = rhs(rhs_vert, rhs_horiz1);
       }
@@ -944,8 +928,8 @@
       if (rhs_horiz1 < n_size) {
         if ((rhs_vert + 3) < k_size) {
           // just CHECK_RHS_BOUNDARY
-          rhs_pf0 = rhs.template loadPacket<float4,Unaligned>(rhs_vert, rhs_horiz0);
-          rhs_pf1 = rhs.template loadPacket<float4,Unaligned>(rhs_vert, rhs_horiz1);
+          rhs_pf0 = rhs.template loadPacket<float4, Unaligned>(rhs_vert, rhs_horiz0);
+          rhs_pf1 = rhs.template loadPacket<float4, Unaligned>(rhs_vert, rhs_horiz1);
         } else if (rhs_vert + 2 < k_size) {
           // just CHECK_RHS_BOUNDARY
           rhs_pf0.x = rhs(rhs_vert, rhs_horiz0);
@@ -954,19 +938,19 @@
           rhs_pf1.x = rhs(rhs_vert, rhs_horiz1);
           rhs_pf1.y = rhs(rhs_vert + 1, rhs_horiz1);
           rhs_pf1.z = rhs(rhs_vert + 2, rhs_horiz1);
-        } else if (k+threadIdx.x*4 + 1 < k_size) {
+        } else if (k + threadIdx.x * 4 + 1 < k_size) {
           rhs_pf0.x = rhs(rhs_vert, rhs_horiz0);
           rhs_pf0.y = rhs(rhs_vert + 1, rhs_horiz0);
           rhs_pf1.x = rhs(rhs_vert, rhs_horiz1);
           rhs_pf1.y = rhs(rhs_vert + 1, rhs_horiz1);
-        } else if (k+threadIdx.x*4  < k_size) {
+        } else if (k + threadIdx.x * 4 < k_size) {
           rhs_pf0.x = rhs(rhs_vert, rhs_horiz0);
           rhs_pf1.x = rhs(rhs_vert, rhs_horiz1);
         }
       } else if (rhs_horiz0 < n_size) {
         if ((rhs_vert + 3) < k_size) {
           // just CHECK_RHS_BOUNDARY
-          rhs_pf0 = rhs.template loadPacket<float4,Unaligned>(rhs_vert, rhs_horiz0);
+          rhs_pf0 = rhs.template loadPacket<float4, Unaligned>(rhs_vert, rhs_horiz0);
         } else if ((rhs_vert + 2) < k_size) {
           // just CHECK_RHS_BOUNDARY
           rhs_pf0.x = rhs(rhs_vert, rhs_horiz0);
@@ -975,7 +959,7 @@
         } else if ((rhs_vert + 1) < k_size) {
           rhs_pf0.x = rhs(rhs_vert, rhs_horiz0);
           rhs_pf0.y = rhs(rhs_vert + 1, rhs_horiz0);
-        } else if (rhs_vert  < k_size) {
+        } else if (rhs_vert < k_size) {
           rhs_pf0.x = rhs(rhs_vert, rhs_horiz0);
         }
       }
@@ -990,13 +974,13 @@
     // Row 32 -> times (1, 5, 9, .. 29) for features 0, 1.
     // Row 33 -> times (1, 5, 9, .. 29) for features 2, 3.
     // ..
-    rhs_shmem2[threadIdx.y+32][threadIdx.x] = make_float2(rhs_pf0.y, rhs_pf1.y);
+    rhs_shmem2[threadIdx.y + 32][threadIdx.x] = make_float2(rhs_pf0.y, rhs_pf1.y);
     // Row 64 -> times (2, 6, 10, .. 30) for features 0, 1.
     // Row 65 -> times (2, 6, 10, .. 30) for features 2, 3.
-    rhs_shmem2[threadIdx.y+64][threadIdx.x] = make_float2(rhs_pf0.z, rhs_pf1.z);
+    rhs_shmem2[threadIdx.y + 64][threadIdx.x] = make_float2(rhs_pf0.z, rhs_pf1.z);
     // Row 96 -> times (3, 7, 11, .. 31) for features 0, 1.
     // Row 97 -> times (3, 7, 11, .. 31) for features 2, 3.
-    rhs_shmem2[threadIdx.y+96][threadIdx.x] = make_float2(rhs_pf0.w, rhs_pf1.w);
+    rhs_shmem2[threadIdx.y + 96][threadIdx.x] = make_float2(rhs_pf0.w, rhs_pf1.w);
 
     // LHS.
     // Row 0 (time 0) -> features (0, 1), (4, 5), .. (28, 29), (32, 33), ..  (60, 61) .. (124, 125)
@@ -1005,77 +989,76 @@
     // Row 8 (time 0) -> features (2, 3), (6, 7), .. (30, 31), (34, 35), ..  (62, 63) .. (126, 127)
     // Row 15 (time 7) -> features (2, 3), (6, 7), .. (30, 31), (34, 35), ..  (62, 63) .. (126, 127)
 
+#define add_vals(a_feat1, a_feat2, f1, f2, f3, f4) \
+  results[0].x += a_feat1.x * f1.x;                \
+  results[1].x += a_feat1.x * f1.y;                \
+  results[2].x += a_feat1.x * f2.x;                \
+  results[3].x += a_feat1.x * f2.y;                \
+  results[4].x += a_feat1.x * f3.x;                \
+  results[5].x += a_feat1.x * f3.y;                \
+  results[6].x += a_feat1.x * f4.x;                \
+  results[7].x += a_feat1.x * f4.y;                \
+                                                   \
+  results[0].y += a_feat1.y * f1.x;                \
+  results[1].y += a_feat1.y * f1.y;                \
+  results[2].y += a_feat1.y * f2.x;                \
+  results[3].y += a_feat1.y * f2.y;                \
+  results[4].y += a_feat1.y * f3.x;                \
+  results[5].y += a_feat1.y * f3.y;                \
+  results[6].y += a_feat1.y * f4.x;                \
+  results[7].y += a_feat1.y * f4.y;                \
+                                                   \
+  results[0].z += a_feat2.x * f1.x;                \
+  results[1].z += a_feat2.x * f1.y;                \
+  results[2].z += a_feat2.x * f2.x;                \
+  results[3].z += a_feat2.x * f2.y;                \
+  results[4].z += a_feat2.x * f3.x;                \
+  results[5].z += a_feat2.x * f3.y;                \
+  results[6].z += a_feat2.x * f4.x;                \
+  results[7].z += a_feat2.x * f4.y;                \
+                                                   \
+  results[0].w += a_feat2.y * f1.x;                \
+  results[1].w += a_feat2.y * f1.y;                \
+  results[2].w += a_feat2.y * f2.x;                \
+  results[3].w += a_feat2.y * f2.y;                \
+  results[4].w += a_feat2.y * f3.x;                \
+  results[5].w += a_feat2.y * f3.y;                \
+  results[6].w += a_feat2.y * f4.x;                \
+  results[7].w += a_feat2.y * f4.y;
 
-#define add_vals(a_feat1, a_feat2, f1, f2, f3, f4)\
-      results[0].x += a_feat1.x * f1.x;\
-      results[1].x += a_feat1.x * f1.y;\
-      results[2].x += a_feat1.x * f2.x;\
-      results[3].x += a_feat1.x * f2.y;\
-      results[4].x += a_feat1.x * f3.x;\
-      results[5].x += a_feat1.x * f3.y;\
-      results[6].x += a_feat1.x * f4.x;\
-      results[7].x += a_feat1.x * f4.y;\
-\
-      results[0].y += a_feat1.y * f1.x;\
-      results[1].y += a_feat1.y * f1.y;\
-      results[2].y += a_feat1.y * f2.x;\
-      results[3].y += a_feat1.y * f2.y;\
-      results[4].y += a_feat1.y * f3.x;\
-      results[5].y += a_feat1.y * f3.y;\
-      results[6].y += a_feat1.y * f4.x;\
-      results[7].y += a_feat1.y * f4.y;\
-\
-      results[0].z += a_feat2.x * f1.x;\
-      results[1].z += a_feat2.x * f1.y;\
-      results[2].z += a_feat2.x * f2.x;\
-      results[3].z += a_feat2.x * f2.y;\
-      results[4].z += a_feat2.x * f3.x;\
-      results[5].z += a_feat2.x * f3.y;\
-      results[6].z += a_feat2.x * f4.x;\
-      results[7].z += a_feat2.x * f4.y;\
-\
-      results[0].w += a_feat2.y * f1.x;\
-      results[1].w += a_feat2.y * f1.y;\
-      results[2].w += a_feat2.y * f2.x;\
-      results[3].w += a_feat2.y * f2.y;\
-      results[4].w += a_feat2.y * f3.x;\
-      results[5].w += a_feat2.y * f3.y;\
-      results[6].w += a_feat2.y * f4.x;\
-      results[7].w += a_feat2.y * f4.y;\
+    lhs_shmem2[threadIdx.y / 4][threadIdx.x + (threadIdx.y % 4) * 8] = make_float2(lhs_pf0.x, lhs_pf0.y);
+    lhs_shmem2[threadIdx.y / 4 + 8][threadIdx.x + (threadIdx.y % 4) * 8] = make_float2(lhs_pf1.x, lhs_pf1.y);
+    lhs_shmem2[threadIdx.y / 4 + 16][threadIdx.x + (threadIdx.y % 4) * 8] = make_float2(lhs_pf2.x, lhs_pf2.y);
+    lhs_shmem2[threadIdx.y / 4 + 24][threadIdx.x + (threadIdx.y % 4) * 8] = make_float2(lhs_pf3.x, lhs_pf3.y);
 
-    lhs_shmem2[threadIdx.y/4][threadIdx.x+(threadIdx.y%4)*8] = make_float2(lhs_pf0.x, lhs_pf0.y);
-    lhs_shmem2[threadIdx.y/4+8][threadIdx.x+(threadIdx.y%4)*8] = make_float2(lhs_pf1.x, lhs_pf1.y);
-    lhs_shmem2[threadIdx.y/4+16][threadIdx.x+(threadIdx.y%4)*8] = make_float2(lhs_pf2.x, lhs_pf2.y);
-    lhs_shmem2[threadIdx.y/4+24][threadIdx.x+(threadIdx.y%4)*8] = make_float2(lhs_pf3.x, lhs_pf3.y);
-
-    lhs_shmem2[threadIdx.y/4 + 32][threadIdx.x+(threadIdx.y%4)*8] = make_float2(lhs_pf0.z, lhs_pf0.w);
-    lhs_shmem2[threadIdx.y/4 + 40][threadIdx.x+(threadIdx.y%4)*8] = make_float2(lhs_pf1.z, lhs_pf1.w);
-    lhs_shmem2[threadIdx.y/4 + 48][threadIdx.x+(threadIdx.y%4)*8] = make_float2(lhs_pf2.z, lhs_pf2.w);
-    lhs_shmem2[threadIdx.y/4 + 56][threadIdx.x+(threadIdx.y%4)*8] = make_float2(lhs_pf3.z, lhs_pf3.w);
+    lhs_shmem2[threadIdx.y / 4 + 32][threadIdx.x + (threadIdx.y % 4) * 8] = make_float2(lhs_pf0.z, lhs_pf0.w);
+    lhs_shmem2[threadIdx.y / 4 + 40][threadIdx.x + (threadIdx.y % 4) * 8] = make_float2(lhs_pf1.z, lhs_pf1.w);
+    lhs_shmem2[threadIdx.y / 4 + 48][threadIdx.x + (threadIdx.y % 4) * 8] = make_float2(lhs_pf2.z, lhs_pf2.w);
+    lhs_shmem2[threadIdx.y / 4 + 56][threadIdx.x + (threadIdx.y % 4) * 8] = make_float2(lhs_pf3.z, lhs_pf3.w);
 
     __syncthreads();
 
-    // Do the multiplies.
-    #pragma unroll
-    for (int koff = 0; koff < 32; koff ++) {
+// Do the multiplies.
+#pragma unroll
+    for (int koff = 0; koff < 32; koff++) {
       float2 a3 = lhs_shmem2[koff][threadIdx.x + (threadIdx.y % 4) * 8];
       float2 a4 = lhs_shmem2[koff + 32][threadIdx.x + (threadIdx.y % 4) * 8];
 
       // first feature is at (threadIdx.y/4) * 8 last is at start + 8.
       int start_feature = (threadIdx.y / 4) * 8;
 
-      float2 br1 = rhs_shmem2[start_feature/2 +     (koff % 4) * 32][koff/4];
-      float2 br2 = rhs_shmem2[start_feature/2 + 1 + (koff % 4) * 32][koff/4];
-      float2 br3 = rhs_shmem2[start_feature/2 + 2 + (koff % 4) * 32][koff/4];
-      float2 br4 = rhs_shmem2[start_feature/2 + 3 + (koff % 4) * 32][koff/4];
+      float2 br1 = rhs_shmem2[start_feature / 2 + (koff % 4) * 32][koff / 4];
+      float2 br2 = rhs_shmem2[start_feature / 2 + 1 + (koff % 4) * 32][koff / 4];
+      float2 br3 = rhs_shmem2[start_feature / 2 + 2 + (koff % 4) * 32][koff / 4];
+      float2 br4 = rhs_shmem2[start_feature / 2 + 3 + (koff % 4) * 32][koff / 4];
 
       add_vals(a3, a4, br1, br2, br3, br4)
     }
     __syncthreads();
-  } // end loop over k
+  }  // end loop over k
 
   __syncthreads();
-  Index horiz_base = (threadIdx.y/4)*8+base_n;
+  Index horiz_base = (threadIdx.y / 4) * 8 + base_n;
   if (!CHECK_LHS_BOUNDARY && !CHECK_RHS_BOUNDARY) {
     for (int i = 0; i < 8; i++) {
       output(lhs_vert, horiz_base + i) = results[i].x;
@@ -1102,7 +1085,7 @@
         output(lhs_vert, horiz_base + i) = results[i].x;
         output(lhs_vert + 1, horiz_base + i) = results[i].y;
       }
-    } else if (lhs_vert  < m_size) {
+    } else if (lhs_vert < m_size) {
       for (int i = 0; i < 8; i++) {
         output(lhs_vert, horiz_base + i) = results[i].x;
       }
@@ -1121,33 +1104,26 @@
     // CHECK both boundaries.
     for (int i = 0; i < 8; i++) {
       if (horiz_base + i < n_size) {
-        if (lhs_vert < m_size)
-          output(lhs_vert, horiz_base + i) = results[i].x;
-        if (lhs_vert + 1 < m_size)
-          output(lhs_vert + 1, horiz_base + i) = results[i].y;
-        if (lhs_vert + 2 < m_size)
-          output(lhs_vert + 2, horiz_base + i) = results[i].z;
-        if (lhs_vert + 3 < m_size)
-          output(lhs_vert + 3, horiz_base + i) = results[i].w;
+        if (lhs_vert < m_size) output(lhs_vert, horiz_base + i) = results[i].x;
+        if (lhs_vert + 1 < m_size) output(lhs_vert + 1, horiz_base + i) = results[i].y;
+        if (lhs_vert + 2 < m_size) output(lhs_vert + 2, horiz_base + i) = results[i].z;
+        if (lhs_vert + 3 < m_size) output(lhs_vert + 3, horiz_base + i) = results[i].w;
       }
     }
   }
 }
 
-
-template<typename Index, typename LhsMapper,
-         typename RhsMapper, typename OutputMapper>
+template <typename Index, typename LhsMapper, typename RhsMapper, typename OutputMapper>
 __global__ void
 #if defined(EIGEN_HIPCC)
 __launch_bounds__(256, 1)
 #else
 __launch_bounds__(256)
 #endif
-EigenFloatContractionKernel(const LhsMapper lhs, const RhsMapper rhs,
-                       const OutputMapper output,
-                       const Index m_size, const Index n_size, const Index k_size) {
-  __shared__ float2 lhs_shmem[64*32];
-  __shared__ float2 rhs_shmem[128*8];
+    EigenFloatContractionKernel(const LhsMapper lhs, const RhsMapper rhs, const OutputMapper output, const Index m_size,
+                                const Index n_size, const Index k_size) {
+  __shared__ float2 lhs_shmem[64 * 32];
+  __shared__ float2 rhs_shmem[128 * 8];
 
   typedef float2 LHS_MEM[64][32];
   typedef float2 RHS_MEM[128][8];
@@ -1165,34 +1141,32 @@
     if (!check_lhs128) {
       // >= 128 rows left
       EigenFloatContractionKernelInternal<Index, LhsMapper, RhsMapper, OutputMapper, false, false>(
-                     lhs, rhs, output, *((LHS_MEM *) lhs_shmem), *((RHS_MEM *) rhs_shmem), m_size, n_size, k_size, base_m, base_n);
+          lhs, rhs, output, *((LHS_MEM*)lhs_shmem), *((RHS_MEM*)rhs_shmem), m_size, n_size, k_size, base_m, base_n);
     } else {
       EigenFloatContractionKernelInternal<Index, LhsMapper, RhsMapper, OutputMapper, true, false>(
-                     lhs, rhs, output, *((LHS_MEM *) lhs_shmem), *((RHS_MEM *) rhs_shmem), m_size, n_size, k_size, base_m, base_n);
+          lhs, rhs, output, *((LHS_MEM*)lhs_shmem), *((RHS_MEM*)rhs_shmem), m_size, n_size, k_size, base_m, base_n);
     }
   } else {
     if (!check_lhs128) {
       // >= 128 rows left
       EigenFloatContractionKernelInternal<Index, LhsMapper, RhsMapper, OutputMapper, false, true>(
-                     lhs, rhs, output, *((LHS_MEM *) lhs_shmem), *((RHS_MEM *) rhs_shmem), m_size, n_size, k_size, base_m, base_n);
+          lhs, rhs, output, *((LHS_MEM*)lhs_shmem), *((RHS_MEM*)rhs_shmem), m_size, n_size, k_size, base_m, base_n);
     } else {
       EigenFloatContractionKernelInternal<Index, LhsMapper, RhsMapper, OutputMapper, true, true>(
-                     lhs, rhs, output, *((LHS_MEM *) lhs_shmem), *((RHS_MEM *) rhs_shmem), m_size, n_size, k_size, base_m, base_n);
+          lhs, rhs, output, *((LHS_MEM*)lhs_shmem), *((RHS_MEM*)rhs_shmem), m_size, n_size, k_size, base_m, base_n);
     }
   }
 }
 
-template<typename Index, typename LhsMapper,
-         typename RhsMapper, typename OutputMapper>
+template <typename Index, typename LhsMapper, typename RhsMapper, typename OutputMapper>
 __global__ void
 #if defined(EIGEN_HIPCC)
 __launch_bounds__(256, 1)
 #else
 __launch_bounds__(256)
 #endif
-EigenFloatContractionKernel16x16(const LhsMapper lhs, const RhsMapper rhs,
-                       const OutputMapper output,
-                       const Index m_size, const Index n_size, const Index k_size) {
+    EigenFloatContractionKernel16x16(const LhsMapper lhs, const RhsMapper rhs, const OutputMapper output,
+                                     const Index m_size, const Index n_size, const Index k_size) {
   __shared__ float2 lhs_shmem[32][16];
   __shared__ float2 rhs_shmem[64][8];
 
@@ -1204,24 +1178,27 @@
 
   if (base_m + 63 < m_size) {
     if (base_n + 63 < n_size) {
-      EigenFloatContractionKernelInternal16x16<Index, LhsMapper, RhsMapper, OutputMapper, false, false>(lhs, rhs, output, lhs_shmem, rhs_shmem, m_size, n_size, k_size, base_m, base_n);
+      EigenFloatContractionKernelInternal16x16<Index, LhsMapper, RhsMapper, OutputMapper, false, false>(
+          lhs, rhs, output, lhs_shmem, rhs_shmem, m_size, n_size, k_size, base_m, base_n);
     } else {
-      EigenFloatContractionKernelInternal16x16<Index, LhsMapper, RhsMapper, OutputMapper, false, true>(lhs, rhs, output, lhs_shmem, rhs_shmem, m_size, n_size, k_size, base_m, base_n);
+      EigenFloatContractionKernelInternal16x16<Index, LhsMapper, RhsMapper, OutputMapper, false, true>(
+          lhs, rhs, output, lhs_shmem, rhs_shmem, m_size, n_size, k_size, base_m, base_n);
     }
   } else {
     if (base_n + 63 < n_size) {
-      EigenFloatContractionKernelInternal16x16<Index, LhsMapper, RhsMapper, OutputMapper, true, false>(lhs, rhs, output, lhs_shmem, rhs_shmem, m_size, n_size, k_size, base_m, base_n);
+      EigenFloatContractionKernelInternal16x16<Index, LhsMapper, RhsMapper, OutputMapper, true, false>(
+          lhs, rhs, output, lhs_shmem, rhs_shmem, m_size, n_size, k_size, base_m, base_n);
     } else {
-      EigenFloatContractionKernelInternal16x16<Index, LhsMapper, RhsMapper, OutputMapper, true, true>(lhs, rhs, output, lhs_shmem, rhs_shmem, m_size, n_size, k_size, base_m, base_n);
+      EigenFloatContractionKernelInternal16x16<Index, LhsMapper, RhsMapper, OutputMapper, true, true>(
+          lhs, rhs, output, lhs_shmem, rhs_shmem, m_size, n_size, k_size, base_m, base_n);
     }
   }
 }
 
-
-template<typename Indices, typename LeftArgType, typename RightArgType, typename OutputKernelType>
-struct TensorEvaluator<const TensorContractionOp<Indices, LeftArgType, RightArgType, OutputKernelType>, GpuDevice> :
-    public TensorContractionEvaluatorBase<TensorEvaluator<const TensorContractionOp<Indices, LeftArgType, RightArgType, OutputKernelType>, GpuDevice> > {
-
+template <typename Indices, typename LeftArgType, typename RightArgType, typename OutputKernelType>
+struct TensorEvaluator<const TensorContractionOp<Indices, LeftArgType, RightArgType, OutputKernelType>, GpuDevice>
+    : public TensorContractionEvaluatorBase<TensorEvaluator<
+          const TensorContractionOp<Indices, LeftArgType, RightArgType, OutputKernelType>, GpuDevice> > {
   typedef GpuDevice Device;
 
   typedef TensorEvaluator<const TensorContractionOp<Indices, LeftArgType, RightArgType, OutputKernelType>, Device> Self;
@@ -1269,11 +1246,9 @@
   typedef typename LeftEvaluator::Dimensions LeftDimensions;
   typedef typename RightEvaluator::Dimensions RightDimensions;
 
-  TensorEvaluator(const XprType& op, const Device& device) :
-      Base(op, device)
-  {
-    EIGEN_STATIC_ASSERT( (internal::is_same<OutputKernelType, const NoOpOutputKernel>::value),
-                          GPU_TENSOR_CONTRACTION_DOES_NOT_SUPPORT_OUTPUT_KERNELS);
+  TensorEvaluator(const XprType& op, const Device& device) : Base(op, device) {
+    EIGEN_STATIC_ASSERT((internal::is_same<OutputKernelType, const NoOpOutputKernel>::value),
+                        GPU_TENSOR_CONTRACTION_DOES_NOT_SUPPORT_OUTPUT_KERNELS);
   }
 
   // We need to redefine this method to make nvcc happy
@@ -1284,7 +1259,7 @@
       evalTo(data);
       return false;
     } else {
-      this->m_result = static_cast<Scalar *>(this->m_device.allocate(this->dimensions().TotalSize() * sizeof(Scalar)));
+      this->m_result = static_cast<Scalar*>(this->m_device.allocate(this->dimensions().TotalSize() * sizeof(Scalar)));
       evalTo(this->m_result);
       return true;
     }
@@ -1295,64 +1270,65 @@
       if (this->m_rhs_inner_dim_contiguous) {
         if (this->m_rhs_inner_dim_reordered) {
           evalTyped<true, true, true, Unaligned>(buffer);
-        }
-        else {
+        } else {
           evalTyped<true, true, false, Unaligned>(buffer);
         }
-      }
-      else {
-       if (this->m_rhs_inner_dim_reordered) {
+      } else {
+        if (this->m_rhs_inner_dim_reordered) {
           evalTyped<true, false, true, Unaligned>(buffer);
-        }
-        else {
+        } else {
           evalTyped<true, false, false, Unaligned>(buffer);
         }
       }
-    }
-    else {
+    } else {
       if (this->m_rhs_inner_dim_contiguous) {
         if (this->m_rhs_inner_dim_reordered) {
           evalTyped<false, true, true, Unaligned>(buffer);
-        }
-        else {
+        } else {
           evalTyped<false, true, false, Unaligned>(buffer);
         }
-      }
-      else {
-       if (this->m_rhs_inner_dim_reordered) {
+      } else {
+        if (this->m_rhs_inner_dim_reordered) {
           evalTyped<false, false, true, Unaligned>(buffer);
-        }
-        else {
+        } else {
           evalTyped<false, false, false, Unaligned>(buffer);
         }
       }
     }
   }
 
-  template <typename LhsScalar, typename RhsScalar, typename Index, typename LhsMapper, typename RhsMapper, typename OutputMapper> struct LaunchKernels {
-    static void Run(const LhsMapper& lhs, const RhsMapper& rhs, const OutputMapper& output, Index m, Index n, Index k, const GpuDevice& device) {
-    const Index m_blocks = (m + 63) / 64;
-    const Index n_blocks = (n + 63) / 64;
-    const dim3 num_blocks(m_blocks, n_blocks, 1);
-    const dim3 block_size(8, 8, 8);
-    LAUNCH_GPU_KERNEL((EigenContractionKernel<Scalar, Index, LhsMapper, RhsMapper, OutputMapper>), num_blocks, block_size, 0, device, lhs, rhs, output, m, n, k);
+  template <typename LhsScalar, typename RhsScalar, typename Index, typename LhsMapper, typename RhsMapper,
+            typename OutputMapper>
+  struct LaunchKernels {
+    static void Run(const LhsMapper& lhs, const RhsMapper& rhs, const OutputMapper& output, Index m, Index n, Index k,
+                    const GpuDevice& device) {
+      const Index m_blocks = (m + 63) / 64;
+      const Index n_blocks = (n + 63) / 64;
+      const dim3 num_blocks(m_blocks, n_blocks, 1);
+      const dim3 block_size(8, 8, 8);
+      LAUNCH_GPU_KERNEL((EigenContractionKernel<Scalar, Index, LhsMapper, RhsMapper, OutputMapper>), num_blocks,
+                        block_size, 0, device, lhs, rhs, output, m, n, k);
     }
   };
 
-  template <typename Index, typename LhsMapper, typename RhsMapper, typename OutputMapper> struct LaunchKernels<float, float, Index, LhsMapper, RhsMapper, OutputMapper> {
-    static void Run(const LhsMapper& lhs, const RhsMapper& rhs, const OutputMapper& output, Index m, Index n, Index k, const GpuDevice& device) {
+  template <typename Index, typename LhsMapper, typename RhsMapper, typename OutputMapper>
+  struct LaunchKernels<float, float, Index, LhsMapper, RhsMapper, OutputMapper> {
+    static void Run(const LhsMapper& lhs, const RhsMapper& rhs, const OutputMapper& output, Index m, Index n, Index k,
+                    const GpuDevice& device) {
       if (m < 768 || n < 768) {
         const Index m_blocks = (m + 63) / 64;
         const Index n_blocks = (n + 63) / 64;
         const dim3 num_blocks(m_blocks, n_blocks, 1);
         const dim3 block_size(16, 16, 1);
-        LAUNCH_GPU_KERNEL((EigenFloatContractionKernel16x16<Index, LhsMapper, RhsMapper, OutputMapper>), num_blocks, block_size, 0, device, lhs, rhs, output, m, n, k);
+        LAUNCH_GPU_KERNEL((EigenFloatContractionKernel16x16<Index, LhsMapper, RhsMapper, OutputMapper>), num_blocks,
+                          block_size, 0, device, lhs, rhs, output, m, n, k);
       } else {
         const Index m_blocks = (m + 127) / 128;
         const Index n_blocks = (n + 63) / 64;
         const dim3 num_blocks(m_blocks, n_blocks, 1);
         const dim3 block_size(8, 32, 1);
-        LAUNCH_GPU_KERNEL((EigenFloatContractionKernel<Index, LhsMapper, RhsMapper, OutputMapper>), num_blocks, block_size, 0, device, lhs, rhs, output, m, n, k);
+        LAUNCH_GPU_KERNEL((EigenFloatContractionKernel<Index, LhsMapper, RhsMapper, OutputMapper>), num_blocks,
+                          block_size, 0, device, lhs, rhs, output, m, n, k);
       }
     }
   };
@@ -1372,21 +1348,17 @@
     // zero out the result buffer (which must be of size at least m * n * sizeof(Scalar))
     this->m_device.fill(buffer, buffer + m * n, Scalar(0));
 
-    typedef internal::TensorContractionInputMapper<LhsScalar, Index, internal::Lhs,
-                                                   LeftEvaluator, left_nocontract_t,
-                                                   contract_t, 4,
-                                                   lhs_inner_dim_contiguous,
-                                                   false, Unaligned> LhsMapper;
+    typedef internal::TensorContractionInputMapper<LhsScalar, Index, internal::Lhs, LeftEvaluator, left_nocontract_t,
+                                                   contract_t, 4, lhs_inner_dim_contiguous, false, Unaligned>
+        LhsMapper;
 
-    typedef internal::TensorContractionInputMapper<RhsScalar, Index, internal::Rhs,
-                                                   RightEvaluator, right_nocontract_t,
-                                                   contract_t, 4,
-                                                   rhs_inner_dim_contiguous,
-                                                   rhs_inner_dim_reordered, Unaligned> RhsMapper;
+    typedef internal::TensorContractionInputMapper<RhsScalar, Index, internal::Rhs, RightEvaluator, right_nocontract_t,
+                                                   contract_t, 4, rhs_inner_dim_contiguous, rhs_inner_dim_reordered,
+                                                   Unaligned>
+        RhsMapper;
 
     typedef internal::blas_data_mapper<Scalar, Index, ColMajor> OutputMapper;
 
-
     // initialize data mappers
     LhsMapper lhs(this->m_leftImpl, this->m_left_nocontract_strides, this->m_i_strides,
                   this->m_left_contracting_strides, this->m_k_strides);
@@ -1402,11 +1374,12 @@
     setGpuSharedMemConfig(cudaSharedMemBankSizeEightByte);
 #endif
 
-    LaunchKernels<LhsScalar, RhsScalar, Index, LhsMapper, RhsMapper, OutputMapper>::Run(lhs, rhs, output,  m, n, k, this->m_device);
+    LaunchKernels<LhsScalar, RhsScalar, Index, LhsMapper, RhsMapper, OutputMapper>::Run(lhs, rhs, output, m, n, k,
+                                                                                        this->m_device);
   }
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_USE_GPU and EIGEN_GPUCC
-#endif // EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_GPU_H
+#endif  // EIGEN_USE_GPU and EIGEN_GPUCC
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_GPU_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorContractionMapper.h b/unsupported/Eigen/CXX11/src/Tensor/TensorContractionMapper.h
index f626baa..6367db9 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorContractionMapper.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorContractionMapper.h
@@ -17,48 +17,42 @@
 
 namespace internal {
 
-enum {
-  Rhs = 0,
-  Lhs = 1
-};
+enum { Rhs = 0, Lhs = 1 };
 
 /*
  * Implementation of the Eigen blas_data_mapper class for tensors.
  */
-/// The make pointer class is used by sycl in order to build the mapper class on the device. For other platform the default make pointer is used which
-/// is scalar * for CoeffLoader.
+/// The make pointer class is used by sycl in order to build the mapper class on the device. For other platform the
+/// default make pointer is used which is scalar * for CoeffLoader.
 template <typename Tensor, bool HasRawAccess, template <class> class MakePointer_ = MakePointer>
 struct CoeffLoader;
 
-template <typename Scalar, typename Index, int side, typename Tensor,
-          typename nocontract_t, typename contract_t, int packet_size,
-          bool inner_dim_contiguous, bool inner_dim_reordered, int Alignment,
+template <typename Scalar, typename Index, int side, typename Tensor, typename nocontract_t, typename contract_t,
+          int packet_size, bool inner_dim_contiguous, bool inner_dim_reordered, int Alignment,
           template <class> class MakePointer_ = MakePointer>
 class BaseTensorContractionMapper;
 
 template <typename Tensor, bool HasRawAccess, template <class> class MakePointer_>
 struct CoeffLoader {
-  enum {
-    DirectOffsets = false
-  };
+  enum { DirectOffsets = false };
 
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE CoeffLoader(const Tensor& tensor) : m_tensor(tensor) { }
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE CoeffLoader(const Tensor& tensor) : m_tensor(tensor) {}
 
   EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void offsetBuffer(typename Tensor::Index) {
     eigen_assert(false && "unsupported");
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE const typename MakePointer_<const typename Tensor::Scalar>::Type
-  data() const {
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE const typename MakePointer_<const typename Tensor::Scalar>::Type data() const {
     eigen_assert(false && "unsupported");
     return NULL;
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE typename Tensor::Scalar coeff(typename Tensor::Index index) const { return m_tensor.coeff(index); }
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE typename Tensor::Scalar coeff(typename Tensor::Index index) const {
+    return m_tensor.coeff(index);
+  }
 
- template<int LoadMode> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
- typename Tensor::PacketReturnType packet(typename Tensor::Index index) const
-  {
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename Tensor::PacketReturnType packet(typename Tensor::Index index) const {
     return m_tensor.template packet<LoadMode>(index);
   }
 
@@ -68,26 +62,22 @@
 
 template <typename Tensor, template <class> class MakePointer_>
 struct CoeffLoader<Tensor, true, MakePointer_> {
-  enum {
-    DirectOffsets = true
-  };
+  enum { DirectOffsets = true };
 
   EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE CoeffLoader(const Tensor& tensor) : m_data(tensor.data()) {}
 
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void offsetBuffer(typename Tensor::Index offset) {
-    m_data += offset;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void offsetBuffer(typename Tensor::Index offset) { m_data += offset; }
 
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE const typename MakePointer_<const typename Tensor::Scalar>::Type
-  data() const {
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE const typename MakePointer_<const typename Tensor::Scalar>::Type data() const {
     return m_data;
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE typename Tensor::Scalar coeff(typename Tensor::Index index) const { return loadConstant(m_data+index); }
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE typename Tensor::Scalar coeff(typename Tensor::Index index) const {
+    return loadConstant(m_data + index);
+  }
 
- template<int LoadMode> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
- typename Tensor::PacketReturnType packet(typename Tensor::Index index) const
-  {
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename Tensor::PacketReturnType packet(typename Tensor::Index index) const {
     return internal::ploadt_ro<typename Tensor::PacketReturnType, LoadMode>(m_data + index);
   }
 
@@ -97,50 +87,39 @@
   typename MakePointer_<const Scalar>::Type m_data;
 };
 
-template<typename Scalar, typename Index, int side,
-         typename Tensor,
-         typename nocontract_t, typename contract_t,
-         int packet_size, bool inner_dim_contiguous, int Alignment, template <class> class MakePointer_ = MakePointer>
+template <typename Scalar, typename Index, int side, typename Tensor, typename nocontract_t, typename contract_t,
+          int packet_size, bool inner_dim_contiguous, int Alignment, template <class> class MakePointer_ = MakePointer>
 class SimpleTensorContractionMapper {
-  public:
-  EIGEN_DEVICE_FUNC
-  SimpleTensorContractionMapper(const Tensor& tensor,
-                                const nocontract_t& nocontract_strides,
-                                const nocontract_t& ij_strides,
-                                const contract_t& contract_strides,
-                                const contract_t& k_strides) :
-      m_tensor(tensor),
-      m_nocontract_strides(nocontract_strides),
-      m_ij_strides(ij_strides),
-      m_contract_strides(contract_strides),
-      m_k_strides(k_strides) { }
+ public:
+  EIGEN_DEVICE_FUNC SimpleTensorContractionMapper(const Tensor& tensor, const nocontract_t& nocontract_strides,
+                                                  const nocontract_t& ij_strides, const contract_t& contract_strides,
+                                                  const contract_t& k_strides)
+      : m_tensor(tensor),
+        m_nocontract_strides(nocontract_strides),
+        m_ij_strides(ij_strides),
+        m_contract_strides(contract_strides),
+        m_k_strides(k_strides) {}
 
-  enum {
-    DirectOffsets = CoeffLoader<Tensor, Tensor::RawAccess, MakePointer_>::DirectOffsets
-  };
+  enum { DirectOffsets = CoeffLoader<Tensor, Tensor::RawAccess, MakePointer_>::DirectOffsets };
 
   EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void offsetBuffer(typename Tensor::Index offset) {
     m_tensor.offsetBuffer(offset);
   }
 
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE void prefetch(Index /*i*/) { }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void prefetch(Index /*i*/) {}
 
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE Scalar operator()(Index row) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(Index row) const {
     // column major assumption
     return operator()(row, 0);
   }
 
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE Scalar operator()(Index row, Index col) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(Index row, Index col) const {
     return m_tensor.coeff(computeIndex(row, col));
   }
 
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE Index computeIndex(Index row, Index col) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index computeIndex(Index row, Index col) const {
     const bool left = (side == Lhs);
-    EIGEN_UNUSED_VARIABLE(left); // annoying bug in g++8.1: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85963
+    EIGEN_UNUSED_VARIABLE(left);  // annoying bug in g++8.1: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85963
     Index nocontract_val = left ? row : col;
     Index linidx = 0;
     EIGEN_UNROLL_LOOP
@@ -159,7 +138,7 @@
     }
 
     Index contract_val = left ? col : row;
-    if(array_size<contract_t>::value > 0) {
+    if (array_size<contract_t>::value > 0) {
       EIGEN_UNROLL_LOOP
       for (int i = static_cast<int>(array_size<contract_t>::value) - 1; i > 0; i--) {
         const Index idx = contract_val / m_k_strides[i];
@@ -178,10 +157,10 @@
     return linidx;
   }
 
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE IndexPair<Index> computeIndexPair(Index row, Index col, const Index distance) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE IndexPair<Index> computeIndexPair(Index row, Index col,
+                                                                          const Index distance) const {
     const bool left = (side == Lhs);
-    EIGEN_UNUSED_VARIABLE(left); // annoying bug in g++8.1: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85963
+    EIGEN_UNUSED_VARIABLE(left);  // annoying bug in g++8.1: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85963
     Index nocontract_val[2] = {left ? row : col, left ? row + distance : col};
     Index linidx[2] = {0, 0};
     if (array_size<typename Tensor::Dimensions>::value > array_size<contract_t>::value) {
@@ -205,7 +184,7 @@
     }
 
     Index contract_val[2] = {left ? col : row, left ? col : row + distance};
-    if (array_size<contract_t>::value> 0) {
+    if (array_size<contract_t>::value > 0) {
       EIGEN_UNROLL_LOOP
       for (int i = static_cast<int>(array_size<contract_t>::value) - 1; i > 0; i--) {
         const Index idx0 = contract_val[0] / m_k_strides[i];
@@ -238,13 +217,9 @@
     return ((side == Lhs) && inner_dim_contiguous && array_size<contract_t>::value > 0) ? m_contract_strides[0] : 1;
   }
 
-  const CoeffLoader<Tensor, Tensor::RawAccess, MakePointer_>& tensor() const {
-    return m_tensor;
-  }
+  const CoeffLoader<Tensor, Tensor::RawAccess, MakePointer_>& tensor() const { return m_tensor; }
 
-  const nocontract_t& nocontract_strides() const {
-    return m_nocontract_strides;
-  }
+  const nocontract_t& nocontract_strides() const { return m_nocontract_strides; }
   const nocontract_t& ij_strides() const { return m_ij_strides; }
   const contract_t& contract_strides() const { return m_contract_strides; }
   const contract_t& k_strides() const { return m_k_strides; }
@@ -257,29 +232,26 @@
   const contract_t m_k_strides;
 };
 
-template<typename Scalar, typename Index, int side,
-         typename Tensor,
-         typename nocontract_t, typename contract_t,
-         int packet_size, bool inner_dim_contiguous,
-         bool inner_dim_reordered, int Alignment, template <class> class MakePointer_>
-class BaseTensorContractionMapper : public SimpleTensorContractionMapper<Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_>
-{
+template <typename Scalar, typename Index, int side, typename Tensor, typename nocontract_t, typename contract_t,
+          int packet_size, bool inner_dim_contiguous, bool inner_dim_reordered, int Alignment,
+          template <class> class MakePointer_>
+class BaseTensorContractionMapper
+    : public SimpleTensorContractionMapper<Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size,
+                                           inner_dim_contiguous, Alignment, MakePointer_> {
  public:
-  typedef SimpleTensorContractionMapper<Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, Alignment, MakePointer_> ParentMapper;
+  typedef SimpleTensorContractionMapper<Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size,
+                                        inner_dim_contiguous, Alignment, MakePointer_>
+      ParentMapper;
 
-  EIGEN_DEVICE_FUNC
-  BaseTensorContractionMapper(const Tensor& tensor,
-                              const nocontract_t& nocontract_strides,
-                              const nocontract_t& ij_strides,
-                              const contract_t& contract_strides,
-                              const contract_t& k_strides) :
-  ParentMapper(tensor, nocontract_strides, ij_strides, contract_strides, k_strides) { }
+  EIGEN_DEVICE_FUNC BaseTensorContractionMapper(const Tensor& tensor, const nocontract_t& nocontract_strides,
+                                                const nocontract_t& ij_strides, const contract_t& contract_strides,
+                                                const contract_t& k_strides)
+      : ParentMapper(tensor, nocontract_strides, ij_strides, contract_strides, k_strides) {}
 
-  template <typename PacketT,int AlignmentType>
+  template <typename PacketT, int AlignmentType>
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  std::enable_if_t<internal::unpacket_traits<PacketT>::size==packet_size,PacketT>
-  load(Index i, Index j) const
-  {
+      std::enable_if_t<internal::unpacket_traits<PacketT>::size == packet_size, PacketT>
+      load(Index i, Index j) const {
     // whole method makes column major assumption
 
     // don't need to add offsets for now (because operator handles that)
@@ -288,7 +260,7 @@
 
     if (Tensor::PacketAccess && inner_dim_contiguous && !inner_dim_reordered) {
       const Index index = this->computeIndex(i, j);
-      eigen_assert(this->computeIndex(i+packet_size-1, j) == index + packet_size-1);
+      eigen_assert(this->computeIndex(i + packet_size - 1, j) == index + packet_size - 1);
       return this->m_tensor.template packet<AlignmentType>(index);
     }
 
@@ -300,10 +272,8 @@
     // the vertical matrix dimension on the left hand side is never contracting.
     // On the right hand side we need to check if the contracting dimensions may have
     // been shuffled first.
-    if (Tensor::PacketAccess &&
-        (side == Lhs || internal::array_size<contract_t>::value <= 1 || !inner_dim_reordered) &&
+    if (Tensor::PacketAccess && (side == Lhs || internal::array_size<contract_t>::value <= 1 || !inner_dim_reordered) &&
         (lastIdx - first) == (packet_size - 1)) {
-
       return this->m_tensor.template packet<AlignmentType>(first);
     }
 
@@ -321,11 +291,10 @@
     return pload<PacketT>(data);
   }
 
-  template <typename PacketT,int AlignmentType>
+  template <typename PacketT, int AlignmentType>
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  std::enable_if_t<internal::unpacket_traits<PacketT>::size!=packet_size,PacketT>
-  load(Index i, Index j) const
-  {
+      std::enable_if_t<internal::unpacket_traits<PacketT>::size != packet_size, PacketT>
+      load(Index i, Index j) const {
     const Index requested_packet_size = internal::unpacket_traits<PacketT>::size;
     EIGEN_ALIGN_MAX Scalar data[requested_packet_size];
 
@@ -344,65 +313,61 @@
     return pload<PacketT>(data);
   }
 
-  template <typename PacketT,int AlignmentType>
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE PacketT loadPacket(Index i, Index j) const {
-    return this->load<PacketT,AlignmentType>(i,j);
+  template <typename PacketT, int AlignmentType>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketT loadPacket(Index i, Index j) const {
+    return this->load<PacketT, AlignmentType>(i, j);
   }
 };
 
-
-template<typename Scalar, typename Index, int side,
-         typename Tensor,
-         typename nocontract_t, typename contract_t,
-         bool inner_dim_contiguous,
-         bool inner_dim_reordered, int Alignment, template <class> class MakePointer_>
-class BaseTensorContractionMapper<Scalar, Index, side, Tensor, nocontract_t, contract_t, 1, inner_dim_contiguous, inner_dim_reordered, Alignment, MakePointer_>
-  : public SimpleTensorContractionMapper<Scalar, Index, side, Tensor, nocontract_t, contract_t, 1, inner_dim_contiguous, Alignment, MakePointer_>
-{
+template <typename Scalar, typename Index, int side, typename Tensor, typename nocontract_t, typename contract_t,
+          bool inner_dim_contiguous, bool inner_dim_reordered, int Alignment, template <class> class MakePointer_>
+class BaseTensorContractionMapper<Scalar, Index, side, Tensor, nocontract_t, contract_t, 1, inner_dim_contiguous,
+                                  inner_dim_reordered, Alignment, MakePointer_>
+    : public SimpleTensorContractionMapper<Scalar, Index, side, Tensor, nocontract_t, contract_t, 1,
+                                           inner_dim_contiguous, Alignment, MakePointer_> {
  public:
-  typedef SimpleTensorContractionMapper<Scalar, Index, side, Tensor, nocontract_t, contract_t, 1, inner_dim_contiguous, Alignment, MakePointer_> ParentMapper;
+  typedef SimpleTensorContractionMapper<Scalar, Index, side, Tensor, nocontract_t, contract_t, 1, inner_dim_contiguous,
+                                        Alignment, MakePointer_>
+      ParentMapper;
 
-  EIGEN_DEVICE_FUNC
-  BaseTensorContractionMapper(const Tensor& tensor,
-                              const nocontract_t& nocontract_strides,
-                              const nocontract_t& ij_strides,
-                              const contract_t& contract_strides,
-                              const contract_t& k_strides) :
-  ParentMapper(tensor, nocontract_strides, ij_strides, contract_strides, k_strides) { }
+  EIGEN_DEVICE_FUNC BaseTensorContractionMapper(const Tensor& tensor, const nocontract_t& nocontract_strides,
+                                                const nocontract_t& ij_strides, const contract_t& contract_strides,
+                                                const contract_t& k_strides)
+      : ParentMapper(tensor, nocontract_strides, ij_strides, contract_strides, k_strides) {}
 
-  template <typename PacketT,int> EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE PacketT loadPacket(Index i, Index j) const {
+  template <typename PacketT, int>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketT loadPacket(Index i, Index j) const {
     EIGEN_ALIGN_MAX Scalar data[1];
     data[0] = this->m_tensor.coeff(this->computeIndex(i, j));
     return pload<PacketT>(data);
   }
-  template <typename PacketT,int> EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE PacketT load(Index i, Index j) const {
+  template <typename PacketT, int>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketT load(Index i, Index j) const {
     EIGEN_ALIGN_MAX Scalar data[1];
     data[0] = this->m_tensor.coeff(this->computeIndex(i, j));
     return pload<PacketT>(data);
   }
 };
 
-
-template<typename Scalar, typename Index, int side,
-         typename Tensor,
-         typename nocontract_t, typename contract_t,
-         int packet_size,
-         bool inner_dim_contiguous, bool inner_dim_reordered, int Alignment, template <class> class MakePointer_=MakePointer>
+template <typename Scalar, typename Index, int side, typename Tensor, typename nocontract_t, typename contract_t,
+          int packet_size, bool inner_dim_contiguous, bool inner_dim_reordered, int Alignment,
+          template <class> class MakePointer_ = MakePointer>
 class TensorContractionSubMapper {
  public:
-
-  typedef BaseTensorContractionMapper<Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, inner_dim_reordered, Alignment, MakePointer_> ParentMapper;
-  typedef TensorContractionSubMapper<Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, inner_dim_reordered, Alignment, MakePointer_> Self;
+  typedef BaseTensorContractionMapper<Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size,
+                                      inner_dim_contiguous, inner_dim_reordered, Alignment, MakePointer_>
+      ParentMapper;
+  typedef TensorContractionSubMapper<Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size,
+                                     inner_dim_contiguous, inner_dim_reordered, Alignment, MakePointer_>
+      Self;
   typedef Self LinearMapper;
   typedef Self SubMapper;
 
   enum {
     // We can use direct offsets iff the parent mapper supports then and we can compute the strides.
     // TODO: we should also enable direct offsets for the Rhs case.
-    UseDirectOffsets = ParentMapper::DirectOffsets && (side == Lhs) && inner_dim_contiguous && (array_size<contract_t>::value > 0)
+    UseDirectOffsets =
+        ParentMapper::DirectOffsets && (side == Lhs) && inner_dim_contiguous && (array_size<contract_t>::value > 0)
   };
 
   EIGEN_DEVICE_FUNC TensorContractionSubMapper(const ParentMapper& base_mapper, Index vert_offset, Index horiz_offset)
@@ -431,33 +396,33 @@
   template <typename PacketT>
   EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketT loadPacket(Index i) const {
     if (UseDirectOffsets) {
-      return m_base_mapper.template loadPacket<PacketT,Alignment>(i, 0);
+      return m_base_mapper.template loadPacket<PacketT, Alignment>(i, 0);
     }
-    return m_base_mapper.template loadPacket<PacketT,Alignment>(i + m_vert_offset, m_horiz_offset);
+    return m_base_mapper.template loadPacket<PacketT, Alignment>(i + m_vert_offset, m_horiz_offset);
   }
 
   template <typename PacketT>
   EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketT loadPacket(Index i, Index j) const {
     if (UseDirectOffsets) {
-      return m_base_mapper.template loadPacket<PacketT,Alignment>(i, j);
+      return m_base_mapper.template loadPacket<PacketT, Alignment>(i, j);
     }
-    return m_base_mapper.template loadPacket<PacketT,Alignment>(i + m_vert_offset, j + m_horiz_offset);
+    return m_base_mapper.template loadPacket<PacketT, Alignment>(i + m_vert_offset, j + m_horiz_offset);
   }
 
   template <typename PacketT>
   EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketT loadPacketPartial(Index i, Index j, Index, Index = 0) const {
     if (UseDirectOffsets) {
-      return m_base_mapper.template loadPacket<PacketT,Alignment>(i, j);
+      return m_base_mapper.template loadPacket<PacketT, Alignment>(i, j);
     }
-    return m_base_mapper.template loadPacket<PacketT,Alignment>(i + m_vert_offset, j + m_horiz_offset);
+    return m_base_mapper.template loadPacket<PacketT, Alignment>(i + m_vert_offset, j + m_horiz_offset);
   }
 
   template <typename PacketT, int AlignmentType>
   EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketT loadPacket(Index i, Index j) const {
     if (UseDirectOffsets) {
-      return m_base_mapper.template load<PacketT,AlignmentType>(i, j);
+      return m_base_mapper.template load<PacketT, AlignmentType>(i, j);
     }
-    return m_base_mapper.template loadPacket<PacketT,AlignmentType>(i + m_vert_offset, j + m_horiz_offset);
+    return m_base_mapper.template loadPacket<PacketT, AlignmentType>(i + m_vert_offset, j + m_horiz_offset);
   }
 
   template <typename PacketT>
@@ -489,9 +454,9 @@
     EIGEN_STATIC_ASSERT((internal::is_same<PacketT, PacketT>::value), YOU_MADE_A_PROGRAMMING_MISTAKE);
     const int ActualAlignment = (AlignmentType == Aligned) && (Alignment == Aligned) ? Aligned : Unaligned;
     if (UseDirectOffsets) {
-     return m_base_mapper.template loadPacket<PacketT,ActualAlignment>(i, 0);
+      return m_base_mapper.template loadPacket<PacketT, ActualAlignment>(i, 0);
     }
-    return m_base_mapper.template loadPacket<PacketT,ActualAlignment>(i + m_vert_offset, m_horiz_offset);
+    return m_base_mapper.template loadPacket<PacketT, ActualAlignment>(i + m_vert_offset, m_horiz_offset);
   }
 
   template <typename PacketT>
@@ -509,31 +474,29 @@
   const Index m_horiz_offset;
 };
 
-
-template<typename Scalar_, typename Index, int side,
-         typename Tensor,
-         typename nocontract_t, typename contract_t,
-         int packet_size,
-         bool inner_dim_contiguous, bool inner_dim_reordered, int Alignment,  template <class> class MakePointer_=MakePointer>
+template <typename Scalar_, typename Index, int side, typename Tensor, typename nocontract_t, typename contract_t,
+          int packet_size, bool inner_dim_contiguous, bool inner_dim_reordered, int Alignment,
+          template <class> class MakePointer_ = MakePointer>
 class TensorContractionInputMapper
-  : public BaseTensorContractionMapper<Scalar_, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, inner_dim_reordered, Alignment, MakePointer_> {
-
+    : public BaseTensorContractionMapper<Scalar_, Index, side, Tensor, nocontract_t, contract_t, packet_size,
+                                         inner_dim_contiguous, inner_dim_reordered, Alignment, MakePointer_> {
  public:
   typedef Scalar_ Scalar;
-  typedef BaseTensorContractionMapper<Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, inner_dim_reordered, Alignment, MakePointer_> Base;
-  typedef TensorContractionSubMapper<Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size, inner_dim_contiguous, inner_dim_reordered, Alignment, MakePointer_> SubMapper;
+  typedef BaseTensorContractionMapper<Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size,
+                                      inner_dim_contiguous, inner_dim_reordered, Alignment, MakePointer_>
+      Base;
+  typedef TensorContractionSubMapper<Scalar, Index, side, Tensor, nocontract_t, contract_t, packet_size,
+                                     inner_dim_contiguous, inner_dim_reordered, Alignment, MakePointer_>
+      SubMapper;
   typedef SubMapper VectorMapper;
   typedef SubMapper LinearMapper;
 
-  EIGEN_DEVICE_FUNC TensorContractionInputMapper(const Tensor& tensor,
-                               const nocontract_t& nocontract_strides,
-                               const nocontract_t& ij_strides,
-                               const contract_t& contract_strides,
-                               const contract_t& k_strides)
-      : Base(tensor, nocontract_strides, ij_strides, contract_strides, k_strides) { }
+  EIGEN_DEVICE_FUNC TensorContractionInputMapper(const Tensor& tensor, const nocontract_t& nocontract_strides,
+                                                 const nocontract_t& ij_strides, const contract_t& contract_strides,
+                                                 const contract_t& k_strides)
+      : Base(tensor, nocontract_strides, ij_strides, contract_strides, k_strides) {}
 
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE SubMapper getSubMapper(Index i, Index j) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE SubMapper getSubMapper(Index i, Index j) const {
     return SubMapper(*this, i, j);
   }
 
@@ -544,31 +507,27 @@
   EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE VectorMapper getVectorMapper(Index i, Index j) const {
     return VectorMapper(*this, i, j);
   }
-  
+
   EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE const CoeffLoader<Tensor, Tensor::RawAccess, MakePointer_>& get_tensor() const {
     return Base::m_tensor;
   }
 };
 
+template <typename T>
+struct TensorContractionInputMapperTrait;
 
-template <typename T> struct TensorContractionInputMapperTrait;
-
-template<typename Scalar_, typename Index_, int side_,
-         typename Tensor_,
-         typename nocontract_t_, typename contract_t_,
-         int packet_size_,
-         bool inner_dim_contiguous_, bool inner_dim_reordered_, int Alignment_,  template <class> class MakePointer_>
-struct TensorContractionInputMapperTrait<TensorContractionInputMapper<Scalar_, Index_, side_, Tensor_, 
-                                                    nocontract_t_, contract_t_, packet_size_, inner_dim_contiguous_, 
-                                                    inner_dim_reordered_, Alignment_, MakePointer_> > {
-
-      typedef Tensor_ XprType;
-      static const bool  inner_dim_contiguous = inner_dim_contiguous_;
-      static const bool  inner_dim_reordered = inner_dim_reordered_;
-  };  
-
+template <typename Scalar_, typename Index_, int side_, typename Tensor_, typename nocontract_t_, typename contract_t_,
+          int packet_size_, bool inner_dim_contiguous_, bool inner_dim_reordered_, int Alignment_,
+          template <class> class MakePointer_>
+struct TensorContractionInputMapperTrait<
+    TensorContractionInputMapper<Scalar_, Index_, side_, Tensor_, nocontract_t_, contract_t_, packet_size_,
+                                 inner_dim_contiguous_, inner_dim_reordered_, Alignment_, MakePointer_> > {
+  typedef Tensor_ XprType;
+  static const bool inner_dim_contiguous = inner_dim_contiguous_;
+  static const bool inner_dim_reordered = inner_dim_reordered_;
+};
 
 }  // end namespace internal
 }  // end namespace Eigen
 
-#endif // EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_MAPPER_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_MAPPER_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorContractionSycl.h b/unsupported/Eigen/CXX11/src/Tensor/TensorContractionSycl.h
index 480e3ac..2f84787 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorContractionSycl.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorContractionSycl.h
@@ -218,9 +218,8 @@
  */
 
 template <typename StorageIndex, StorageIndex ld, data_source dt, typename PacketType, typename DataScalar>
-static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    std::enable_if_t<dt != data_source::global_mem, void>
-    write(PacketType &packet_data, DataScalar ptr) {
+static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::enable_if_t<dt != data_source::global_mem, void> write(
+    PacketType &packet_data, DataScalar ptr) {
   EIGEN_CONSTEXPR int PacketSize = Eigen::internal::unpacket_traits<PacketType>::size;
   EIGEN_UNROLL_LOOP
   for (int i = 0; i < PacketSize; i++) {
@@ -245,9 +244,10 @@
  */
 
 template <data_source dt, typename PacketType, typename DataScalar>
-static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename std::enable_if_t<
-    Eigen::internal::unpacket_traits<PacketType>::size != 1 && dt == data_source::global_mem, void>
-write(PacketType &packet_data, DataScalar *ptr) {
+static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
+    typename std::enable_if_t<Eigen::internal::unpacket_traits<PacketType>::size != 1 && dt == data_source::global_mem,
+                              void>
+    write(PacketType &packet_data, DataScalar *ptr) {
   ::Eigen::internal::pstoreu<DataScalar, PacketType>(ptr, packet_data);
 }
 
@@ -265,9 +265,10 @@
  * \param ptr: a pointer to the local memory
  */
 template <data_source dt, typename PacketType, typename DataScalar>
-static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename std::enable_if_t<
-    Eigen::internal::unpacket_traits<PacketType>::size == 1 && dt == data_source::global_mem, void>
-write(PacketType &packet_data, DataScalar *ptr) {
+static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
+    typename std::enable_if_t<Eigen::internal::unpacket_traits<PacketType>::size == 1 && dt == data_source::global_mem,
+                              void>
+    write(PacketType &packet_data, DataScalar *ptr) {
   *ptr = packet_data;
 }
 
@@ -478,8 +479,7 @@
   typedef cl::sycl::accessor<OutScalar, 1, cl::sycl::access::mode::read_write, cl::sycl::access::target::local> Scratch;
   typedef cl::sycl::multi_ptr<OutScalar, cl::sycl::access::address_space::local_space> local_ptr;
   typedef OutScalar * /*cl::sycl::multi_ptr<OutScalar, cl::sycl::access::address_space::private_space>*/ private_ptr;
-  typedef std::conditional_t<contraction_tp == contraction_type::local, local_ptr, private_ptr>
-          tile_ptr;
+  typedef std::conditional_t<contraction_tp == contraction_type::local, local_ptr, private_ptr> tile_ptr;
   static EIGEN_CONSTEXPR StorageIndex LSDL = contraction_tp == contraction_type::local
                                                  ? Properties::TileSizeDimM + Properties::BC
                                                  : Properties::WorkLoadPerThreadM;
@@ -542,9 +542,8 @@
     const std::pair<StorageIndex, StorageIndex> lhs_extract_index;
     const std::pair<StorageIndex, StorageIndex> rhs_extract_index;
     template <contraction_type tp = contraction_tp>
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    TiledMemory(const ThreadProperties<StorageIndex> &, local_ptr,
-                std::enable_if_t<tp == contraction_type::no_local> * = 0)
+    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TiledMemory(const ThreadProperties<StorageIndex> &, local_ptr,
+                                                      std::enable_if_t<tp == contraction_type::no_local> * = 0)
         : lhs_scratch_extract{},
           rhs_scratch_extract{},
           lhs_scratch_ptr_compute(lhs_scratch_extract.ptr),
@@ -553,9 +552,9 @@
           rhs_extract_index(std::pair<StorageIndex, StorageIndex>(StorageIndex{0}, StorageIndex{0})) {}
 
     template <contraction_type tp = contraction_tp>
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    TiledMemory(const ThreadProperties<StorageIndex> &thread_properties, local_ptr block_start_ptr,
-                std::enable_if_t<tp == contraction_type::local> * = 0)
+    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TiledMemory(const ThreadProperties<StorageIndex> &thread_properties,
+                                                      local_ptr block_start_ptr,
+                                                      std::enable_if_t<tp == contraction_type::local> * = 0)
         : lhs_scratch_extract{block_start_ptr},
           rhs_scratch_extract{lhs_scratch_extract.ptr +
                               ((Properties::DoubleBuffer + 1) * LSDL * Properties::TileSizeDimK)},
@@ -711,10 +710,9 @@
   // when no local memory is used the following extract_block will be enabled
   template <typename InputBlockProperties, bool is_internal_block, typename Input, typename PrivateReg,
             contraction_type contract_tp = contraction_tp>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-      std::enable_if_t<contract_tp == contraction_type::no_local>
-      extract_block(const Input &inpt, PrivateReg private_ptr, const std::pair<StorageIndex, StorageIndex> &,
-                    const StorageIndex &ncOffset, const StorageIndex cOffset) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::enable_if_t<contract_tp == contraction_type::no_local> extract_block(
+      const Input &inpt, PrivateReg private_ptr, const std::pair<StorageIndex, StorageIndex> &,
+      const StorageIndex &ncOffset, const StorageIndex cOffset) const {
     EIGEN_CONSTEXPR StorageIndex LocalThreadSizeNC =
         InputBlockProperties::is_rhs ? Properties::LocalThreadSizeN : Properties::LocalThreadSizeM;
     EIGEN_CONSTEXPR StorageIndex WorkLoadPerThreadNC =
@@ -784,34 +782,30 @@
   }
 
   template <bool db = Properties::DoubleBuffer, contraction_type ctp = contraction_tp>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-      std::enable_if_t<db && ctp == contraction_type::local>
-      sync_mem(const cl::sycl::nd_item<1> &, bool &db_offset) noexcept {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::enable_if_t<db && ctp == contraction_type::local> sync_mem(
+      const cl::sycl::nd_item<1> &, bool &db_offset) noexcept {
     db_offset = !db_offset;
   }
 
   template <bool db = Properties::DoubleBuffer, contraction_type ctp = contraction_tp>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-      std::enable_if_t<!db && ctp == contraction_type::local>
-      sync_mem(const cl::sycl::nd_item<1> &itemID, bool &) noexcept {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::enable_if_t<!db && ctp == contraction_type::local> sync_mem(
+      const cl::sycl::nd_item<1> &itemID, bool &) noexcept {
     itemID.barrier(cl::sycl::access::fence_space::local_space);
   }
 
   template <contraction_type ctp = contraction_tp>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-      std::enable_if_t<ctp == contraction_type::no_local>
-      sync_mem(const cl::sycl::nd_item<1> &, bool &) noexcept {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::enable_if_t<ctp == contraction_type::no_local> sync_mem(
+      const cl::sycl::nd_item<1> &, bool &) noexcept {
     return;
   }
 
   template <bool need_sync, contraction_type ctp = contraction_tp>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-      std::enable_if_t<need_sync && ctp == contraction_type::no_local>
-      sync_thread(const cl::sycl::nd_item<1> &
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::enable_if_t<need_sync && ctp == contraction_type::no_local>
+  sync_thread(const cl::sycl::nd_item<1> &
 #ifdef EIGEN_SYCL_ARM_GPU_CACHE_OPTIMISATION
-                      itemID
+                  itemID
 #endif
-                  ) noexcept {
+              ) noexcept {
 #ifdef EIGEN_SYCL_ARM_GPU_CACHE_OPTIMISATION
     itemID.barrier(cl::sycl::access::fence_spacce::local_space);
 #else
@@ -819,14 +813,12 @@
 #endif
   }
   template <bool need_sync, contraction_type ctp = contraction_tp>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-      std::enable_if_t<need_sync && ctp == contraction_type::local>
-      sync_thread(const cl::sycl::nd_item<1> &itemID) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::enable_if_t<need_sync && ctp == contraction_type::local>
+  sync_thread(const cl::sycl::nd_item<1> &itemID) {
     itemID.barrier(cl::sycl::access::fence_space::local_space);
   }
   template <bool need_sync>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::enable_if_t<!need_sync> sync_thread(
-      const cl::sycl::nd_item<1> &) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::enable_if_t<!need_sync> sync_thread(const cl::sycl::nd_item<1> &) {
     return;
   }
 
@@ -834,8 +826,8 @@
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void compute_tile_per_panel(const cl::sycl::nd_item<1> &itemID,
                                                                     ThreadProperties<StorageIndex> &thread_properties,
                                                                     TiledMemory &tiled_input_block,
-                                                                    PacketReturnType *privateRes, bool &db_offset) const {
-
+                                                                    PacketReturnType *privateRes,
+                                                                    bool &db_offset) const {
     // Tiling the Rhs block from global to local memory
     extract_block<RHSBlockProperties, is_internal_block>(
         rhs, tiled_input_block.rhs_scratch_extract.ptr + (db_offset * Properties::TileSizeDimK * LSDR),
@@ -896,10 +888,9 @@
   // When local memory is available the following extract_block will be enabled
   template <typename InputBlockProperties, bool is_internal_block, typename Input, typename Local,
             contraction_type contract_tp = contraction_tp>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-      std::enable_if_t<contract_tp == contraction_type::local>
-      extract_block(const Input &inpt, Local local_ptr, const std::pair<StorageIndex, StorageIndex>& local_index,
-                    const StorageIndex &ncOffset, const StorageIndex cOffset) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::enable_if_t<contract_tp == contraction_type::local> extract_block(
+      const Input &inpt, Local local_ptr, const std::pair<StorageIndex, StorageIndex> &local_index,
+      const StorageIndex &ncOffset, const StorageIndex cOffset) const {
     EIGEN_CONSTEXPR StorageIndex TileSizeDimNC =
         InputBlockProperties::is_rhs ? Properties::TileSizeDimN : Properties::TileSizeDimM;
     EIGEN_CONSTEXPR StorageIndex LoadPerThread =
@@ -1249,15 +1240,13 @@
   OutAccessor out_res;
   const StorageIndex rng;
 
-  EIGEN_DEVICE_FUNC
-  GeneralScalarContraction(Scratch scratch_, const LhsMapper lhs_, const RhsMapper rhs_, OutAccessor out_res_,
-                           const StorageIndex rng_)
+  EIGEN_DEVICE_FUNC GeneralScalarContraction(Scratch scratch_, const LhsMapper lhs_, const RhsMapper rhs_,
+                                             OutAccessor out_res_, const StorageIndex rng_)
       : scratch(scratch_), lhs(lhs_), rhs(rhs_), out_res(out_res_), rng(rng_) {}
 
   EIGEN_DEVICE_FUNC void operator()(cl::sycl::nd_item<1> itemID) const {
-
     auto out_ptr = out_res;
-    OutScalar * scratch_ptr = scratch.get_pointer();
+    OutScalar *scratch_ptr = scratch.get_pointer();
 
     StorageIndex globalid = itemID.get_global_id(0);
     StorageIndex localid = itemID.get_local_id(0);
@@ -1506,8 +1495,10 @@
                                                             LhsMapper, RhsMapper, StorageIndex, Properties, TripleDim,
                                                             PacketAccess, input_mapper_properties, true, ct>
           ContractKernelName;
-       device().template binary_kernel_launcher<CoeffReturnType, ContractKernelName>(
-          lhs, rhs, buffer, thread_range, scratchSize, groupSizeM, groupSizeN, numTilesPerGroup, triple_dim).wait();
+      device()
+          .template binary_kernel_launcher<CoeffReturnType, ContractKernelName>(
+              lhs, rhs, buffer, thread_range, scratchSize, groupSizeM, groupSizeN, numTilesPerGroup, triple_dim)
+          .wait();
     } else {
       typedef TensorSycl::internal::TensorContractionKernel<CoeffReturnType, LhsScalar, RhsScalar, EvaluatorPointerType,
                                                             LhsMapper, RhsMapper, StorageIndex, Properties, TripleDim,
@@ -1517,9 +1508,11 @@
           device().allocate_temp(triple_dim.M * triple_dim.N * groupSizeK * sizeof(CoeffReturnType)));
       EvaluatorPointerType tmp_global_accessor = device().get(temp_pointer);
 
-      device().template binary_kernel_launcher<CoeffReturnType, ContractKernelName>(
-          lhs, rhs, tmp_global_accessor, thread_range, scratchSize, groupSizeM, groupSizeN, numTilesPerGroup,
-          triple_dim).wait();
+      device()
+          .template binary_kernel_launcher<CoeffReturnType, ContractKernelName>(
+              lhs, rhs, tmp_global_accessor, thread_range, scratchSize, groupSizeM, groupSizeN, numTilesPerGroup,
+              triple_dim)
+          .wait();
 
       typedef Eigen::internal::SumReducer<CoeffReturnType> Op;
       auto op = Op();
@@ -1527,12 +1520,14 @@
                                                                EvaluatorPointerType, Op>
           ReductionKernel;
 
-      device().template unary_kernel_launcher<CoeffReturnType, ReductionKernel>(
-          tmp_global_accessor, buffer,
-          cl::sycl::nd_range<1>(cl::sycl::range<1>(StorageIndex(
-                                    Eigen::TensorSycl::internal::roundUp(triple_dim.M * triple_dim.N, localRange))),
-                                cl::sycl::range<1>(localRange)),
-          StorageIndex(1), op, StorageIndex(triple_dim.M * triple_dim.N), groupSizeK).wait();
+      device()
+          .template unary_kernel_launcher<CoeffReturnType, ReductionKernel>(
+              tmp_global_accessor, buffer,
+              cl::sycl::nd_range<1>(cl::sycl::range<1>(StorageIndex(
+                                        Eigen::TensorSycl::internal::roundUp(triple_dim.M * triple_dim.N, localRange))),
+                                    cl::sycl::range<1>(localRange)),
+              StorageIndex(1), op, StorageIndex(triple_dim.M * triple_dim.N), groupSizeK)
+          .wait();
       device().deallocate_temp(temp_pointer);
     }
   }
@@ -1566,28 +1561,34 @@
           static_cast<CoeffReturnType *>(device().allocate_temp(nonContractDim * cNumGroups * sizeof(CoeffReturnType)));
       EvaluatorPointerType tmp_global_accessor = device().get(temp_pointer);
 
-     device().template binary_kernel_launcher<CoeffReturnType, ContractKernelName>(
-          vec, mat, tmp_global_accessor, thread_range, scratchSize, nCNumGroups, nonContractDim, C).wait();
+      device()
+          .template binary_kernel_launcher<CoeffReturnType, ContractKernelName>(
+              vec, mat, tmp_global_accessor, thread_range, scratchSize, nCNumGroups, nonContractDim, C)
+          .wait();
 
       typedef Eigen::internal::SumReducer<CoeffReturnType> Op;
       typedef TensorSycl::internal::SecondStepPartialReduction<CoeffReturnType, StorageIndex, EvaluatorPointerType,
                                                                EvaluatorPointerType, Op>
           ReductionKernel;
 
-     device().template unary_kernel_launcher<CoeffReturnType, ReductionKernel>(
-          tmp_global_accessor, buffer,
-          cl::sycl::nd_range<1>(cl::sycl::range<1>(Eigen::TensorSycl::internal::roundUp(nonContractDim, localRange)),
-                                cl::sycl::range<1>(localRange)),
-          StorageIndex(1), Op(), nonContractDim, cNumGroups).wait();   
+      device()
+          .template unary_kernel_launcher<CoeffReturnType, ReductionKernel>(
+              tmp_global_accessor, buffer,
+              cl::sycl::nd_range<1>(
+                  cl::sycl::range<1>(Eigen::TensorSycl::internal::roundUp(nonContractDim, localRange)),
+                  cl::sycl::range<1>(localRange)),
+              StorageIndex(1), Op(), nonContractDim, cNumGroups)
+          .wait();
       device().deallocate_temp(temp_pointer);
     } else {
       typedef Eigen::TensorSycl::internal::GeneralVectorTensor<CoeffReturnType, EvaluatorPointerType, VectorMapper,
                                                                TensorMapper, StorageIndex, Properties, CFactor, false,
                                                                is_lhs_vec, true>
           ContractKernelName;
-     device().template binary_kernel_launcher<CoeffReturnType, ContractKernelName>(
-          vec, mat, buffer, thread_range, scratchSize, nCNumGroups, nonContractDim, C).wait();
-   
+      device()
+          .template binary_kernel_launcher<CoeffReturnType, ContractKernelName>(
+              vec, mat, buffer, thread_range, scratchSize, nCNumGroups, nonContractDim, C)
+          .wait();
     }
   }
 #endif
@@ -1615,19 +1616,26 @@
       CoeffReturnType *temp_pointer =
           static_cast<CoeffReturnType *>(device().allocate_temp(num_work_group * sizeof(CoeffReturnType)));
       EvaluatorPointerType tmp_global_accessor = device().get(temp_pointer);
-      device().template binary_kernel_launcher<CoeffReturnType, ContractKernelName>(lhs, rhs, tmp_global_accessor,
-                                                                                    thread_range, local_range, K).wait();
+      device()
+          .template binary_kernel_launcher<CoeffReturnType, ContractKernelName>(lhs, rhs, tmp_global_accessor,
+                                                                                thread_range, local_range, K)
+          .wait();
       typedef Eigen::internal::SumReducer<CoeffReturnType> Op;
       typedef TensorSycl::internal::SecondStepFullReducer<CoeffReturnType, Op, EvaluatorPointerType,
                                                           EvaluatorPointerType, StorageIndex, local_range>
           GenericRKernel;
-      device().template unary_kernel_launcher<CoeffReturnType, GenericRKernel>(
-          tmp_global_accessor, buffer,
-          cl::sycl::nd_range<1>(cl::sycl::range<1>(local_range), cl::sycl::range<1>(local_range)), local_range, Op()).wait();
+      device()
+          .template unary_kernel_launcher<CoeffReturnType, GenericRKernel>(
+              tmp_global_accessor, buffer,
+              cl::sycl::nd_range<1>(cl::sycl::range<1>(local_range), cl::sycl::range<1>(local_range)), local_range,
+              Op())
+          .wait();
       device().deallocate_temp(temp_pointer);
     } else {
-      device().template binary_kernel_launcher<CoeffReturnType, ContractKernelName>(lhs, rhs, buffer, thread_range,
-                                                                                    local_range, K).wait();
+      device()
+          .template binary_kernel_launcher<CoeffReturnType, ContractKernelName>(lhs, rhs, buffer, thread_range,
+                                                                                local_range, K)
+          .wait();
     }
   }
 #endif
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorContractionThreadPool.h b/unsupported/Eigen/CXX11/src/Tensor/TensorContractionThreadPool.h
index 9567d3b..e55459d 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorContractionThreadPool.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorContractionThreadPool.h
@@ -18,10 +18,11 @@
 
 namespace Eigen {
 
-template<typename Indices, typename LeftArgType, typename RightArgType, typename OutputKernelType>
-struct TensorEvaluator<const TensorContractionOp<Indices, LeftArgType, RightArgType, OutputKernelType>, ThreadPoolDevice> :
-    public TensorContractionEvaluatorBase<TensorEvaluator<const TensorContractionOp<Indices, LeftArgType, RightArgType, OutputKernelType>, ThreadPoolDevice> > {
-
+template <typename Indices, typename LeftArgType, typename RightArgType, typename OutputKernelType>
+struct TensorEvaluator<const TensorContractionOp<Indices, LeftArgType, RightArgType, OutputKernelType>,
+                       ThreadPoolDevice>
+    : public TensorContractionEvaluatorBase<TensorEvaluator<
+          const TensorContractionOp<Indices, LeftArgType, RightArgType, OutputKernelType>, ThreadPoolDevice>> {
   typedef ThreadPoolDevice Device;
 
   typedef TensorEvaluator<const TensorContractionOp<Indices, LeftArgType, RightArgType, OutputKernelType>, Device> Self;
@@ -39,10 +40,10 @@
   // inputs are RowMajor, we will "cheat" by swapping the LHS and RHS:
   // If we want to compute A * B = C, where A is LHS and B is RHS, the code
   // will pretend B is LHS and A is RHS.
-  typedef std::conditional_t<
-    static_cast<int>(Layout) == static_cast<int>(ColMajor), LeftArgType, RightArgType> EvalLeftArgType;
-  typedef std::conditional_t<
-    static_cast<int>(Layout) == static_cast<int>(ColMajor), RightArgType, LeftArgType> EvalRightArgType;
+  typedef std::conditional_t<static_cast<int>(Layout) == static_cast<int>(ColMajor), LeftArgType, RightArgType>
+      EvalLeftArgType;
+  typedef std::conditional_t<static_cast<int>(Layout) == static_cast<int>(ColMajor), RightArgType, LeftArgType>
+      EvalRightArgType;
 
   static constexpr int LDims =
       internal::array_size<typename TensorEvaluator<EvalLeftArgType, Device>::Dimensions>::value;
@@ -69,8 +70,7 @@
   typedef TensorEvaluator<EvalLeftArgType, Device> LeftEvaluator;
   typedef TensorEvaluator<EvalRightArgType, Device> RightEvaluator;
 
-  TensorEvaluator(const XprType& op, const Device& device) :
-      Base(op, device) {}
+  TensorEvaluator(const XprType& op, const Device& device) : Base(op, device) {}
 
   template <int Alignment>
   void evalProduct(Scalar* buffer) const {
@@ -99,8 +99,7 @@
     // (*) EvalParallelContext & EvalShardedByInnerDimContext owns all the state
     // and temporary buffers, required for executing the tensor contraction.
     // They are responsible for cleaning it up after contraction is done.
-    static const bool IsEvalInSyncMode =
-        std::is_same<DoneCallback, NoCallback>::value;
+    static const bool IsEvalInSyncMode = std::is_same<DoneCallback, NoCallback>::value;
 
     const Index m = this->m_i_size;
     const Index n = this->m_j_size;
@@ -136,16 +135,14 @@
     // Again, we don't know number of threads yet, so we use 2.
     Index bm, bn, bk;
     if (shard_by_col) {
-      internal::TensorContractionBlocking<Scalar, LhsScalar, RhsScalar, Index,
-                                          internal::ShardByCol>
-          blocking(k, m, n, 2);
+      internal::TensorContractionBlocking<Scalar, LhsScalar, RhsScalar, Index, internal::ShardByCol> blocking(k, m, n,
+                                                                                                              2);
       bm = blocking.mc();
       bn = blocking.nc();
       bk = blocking.kc();
     } else {
-      internal::TensorContractionBlocking<Scalar, LhsScalar, RhsScalar, Index,
-                                          internal::ShardByRow>
-          blocking(k, m, n, 2);
+      internal::TensorContractionBlocking<Scalar, LhsScalar, RhsScalar, Index, internal::ShardByRow> blocking(k, m, n,
+                                                                                                              2);
       bm = blocking.mc();
       bn = blocking.nc();
       bk = blocking.kc();
@@ -155,21 +152,19 @@
     // Note: we use bk instead of k here because we are interested in amount of
     // _parallelizable_ computations, and computations are not parallelizable
     // across k dimension.
-    const TensorOpCost cost =
-        contractionCost(m, n, bm, bn, bk, shard_by_col, false);
-    int num_threads = TensorCostModel<ThreadPoolDevice>::numThreads(
-        static_cast<double>(n) * m, cost, this->m_device.numThreads());
+    const TensorOpCost cost = contractionCost(m, n, bm, bn, bk, shard_by_col, false);
+    int num_threads =
+        TensorCostModel<ThreadPoolDevice>::numThreads(static_cast<double>(n) * m, cost, this->m_device.numThreads());
     int num_threads_by_k = numThreadsInnerDim(m, n, k);
     if (shardByInnerDim(m, n, k, num_threads, num_threads_by_k)) {
       // We are in the scenario where it is more effective to shard by the
       // inner dimension.
       if (IsEvalInSyncMode) {
-        EvalShardedByInnerDimContext<DoneCallback> ctx(
-            this, num_threads_by_k, buffer, m, n, k, std::move(done));
+        EvalShardedByInnerDimContext<DoneCallback> ctx(this, num_threads_by_k, buffer, m, n, k, std::move(done));
         ctx.template run<Alignment>();
       } else {
-        auto* ctx = new EvalShardedByInnerDimContext<DoneCallback>(
-            this, num_threads_by_k, buffer, m, n, k, std::move(done));
+        auto* ctx =
+            new EvalShardedByInnerDimContext<DoneCallback>(this, num_threads_by_k, buffer, m, n, k, std::move(done));
         ctx->template runAsync<Alignment>();
       }
 
@@ -181,8 +176,7 @@
     if (n == 1) num_threads = 1;
 
     if (num_threads == 1) {
-      TENSOR_CONTRACTION_DISPATCH(this->template evalProductSequential,
-                                  Unaligned, (buffer));
+      TENSOR_CONTRACTION_DISPATCH(this->template evalProductSequential, Unaligned, (buffer));
       if (!IsEvalInSyncMode) done();
       return;
     }
@@ -190,16 +184,14 @@
     // Now that we know number of threads, recalculate sharding and blocking.
     shard_by_col = shardByCol(m, n, num_threads);
     if (shard_by_col) {
-      internal::TensorContractionBlocking<Scalar, LhsScalar, RhsScalar, Index,
-                                          internal::ShardByCol>
-          blocking(k, m, n, num_threads);
+      internal::TensorContractionBlocking<Scalar, LhsScalar, RhsScalar, Index, internal::ShardByCol> blocking(
+          k, m, n, num_threads);
       bm = blocking.mc();
       bn = blocking.nc();
       bk = blocking.kc();
     } else {
-      internal::TensorContractionBlocking<Scalar, LhsScalar, RhsScalar, Index,
-                                          internal::ShardByRow>
-          blocking(k, m, n, num_threads);
+      internal::TensorContractionBlocking<Scalar, LhsScalar, RhsScalar, Index, internal::ShardByRow> blocking(
+          k, m, n, num_threads);
       bm = blocking.mc();
       bn = blocking.nc();
       bk = blocking.kc();
@@ -239,15 +231,14 @@
     // With small number of threads we want to make sure that we do not reduce
     // parallelism too much. With large number of threads we trade maximum
     // parallelism for better memory locality.
-    const float oversharding_factor =
-        num_worker_threads <= 4  ? 8.0 :
-        num_worker_threads <= 8  ? 4.0 :
-        num_worker_threads <= 16 ? 2.0 :
-        num_worker_threads <= 32 ? 1.0 :
-        num_worker_threads <= 64 ? 0.8 : /* num_worker_threads > 64 */ 0.6;
+    const float oversharding_factor = num_worker_threads <= 4    ? 8.0
+                                      : num_worker_threads <= 8  ? 4.0
+                                      : num_worker_threads <= 16 ? 2.0
+                                      : num_worker_threads <= 32 ? 1.0
+                                      : num_worker_threads <= 64 ? 0.8
+                                                                 : /* num_worker_threads > 64 */ 0.6;
 
-    const bool parallelize_by_sharding_dim_only =
-        sharding_dim_tasks >= oversharding_factor * num_worker_threads;
+    const bool parallelize_by_sharding_dim_only = sharding_dim_tasks >= oversharding_factor * num_worker_threads;
 
     // Last by not least, decide whether we want to issue both lhs and rhs
     // packing in parallel; or issue lhs packing first, and then issue rhs
@@ -258,8 +249,7 @@
     // First, we are interested in parallel packing if there are few tasks.
     bool parallel_pack = num_threads >= nm * nn;
     // Also do parallel packing if all data fits into L2$.
-    if (m * bk * Index(sizeof(LhsScalar)) + n * bk * Index(sizeof(RhsScalar)) <=
-        l2CacheSize() * num_threads)
+    if (m * bk * Index(sizeof(LhsScalar)) + n * bk * Index(sizeof(RhsScalar)) <= l2CacheSize() * num_threads)
       parallel_pack = true;
     // But don't do it if we will use each rhs only once. Locality seems to be
     // more important in this case.
@@ -270,22 +260,18 @@
 
     // TODO(ezhulnev): With if contexpr we don't need SyncEvalParallelContext.
     if (IsEvalInSyncMode) {
-#define CONTEXT_ARGS                                                        \
-  (this, num_threads, buffer, m, n, k, bm, bn, bk, nm, nn, nk, gm, gn, nm0, \
-   nn0, shard_by_col, parallel_pack, parallelize_by_sharding_dim_only,      \
-   NoCallback())                                                            \
+#define CONTEXT_ARGS                                                                                          \
+  (this, num_threads, buffer, m, n, k, bm, bn, bk, nm, nn, nk, gm, gn, nm0, nn0, shard_by_col, parallel_pack, \
+   parallelize_by_sharding_dim_only, NoCallback())                                                            \
       .run()
-      TENSOR_CONTRACTION_DISPATCH(SyncEvalParallelContext, Alignment,
-                                  CONTEXT_ARGS);
+      TENSOR_CONTRACTION_DISPATCH(SyncEvalParallelContext, Alignment, CONTEXT_ARGS);
 #undef CONTEXT_ARGS
 
     } else {
-#define CONTEXT_ARGS                                                        \
-  (this, num_threads, buffer, m, n, k, bm, bn, bk, nm, nn, nk, gm, gn, nm0, \
-   nn0, shard_by_col, parallel_pack, parallelize_by_sharding_dim_only,      \
-   std::move(done))
-      TENSOR_CONTRACTION_ASYNC_DISPATCH(EvalParallelContext, DoneCallback,
-                                        Alignment, CONTEXT_ARGS, run());
+#define CONTEXT_ARGS                                                                                          \
+  (this, num_threads, buffer, m, n, k, bm, bn, bk, nm, nn, nk, gm, gn, nm0, nn0, shard_by_col, parallel_pack, \
+   parallelize_by_sharding_dim_only, std::move(done))
+      TENSOR_CONTRACTION_ASYNC_DISPATCH(EvalParallelContext, DoneCallback, Alignment, CONTEXT_ARGS, run());
 #undef CONTEXT_ARGS
     }
   }
@@ -295,9 +281,7 @@
   // Dummy struct to represent an empty DoneCallback.
 
   struct NoCallback {
-    void operator()() {
-      eigen_assert(false && "NoCallback should never be called");
-    }
+    void operator()() { eigen_assert(false && "NoCallback should never be called"); }
   };
 
   // ------------------------------------------------------------------------ //
@@ -312,6 +296,7 @@
     EvalParallelNotification(Context*, NoCallback) {}
     void Notify() { done_.Notify(); }
     void Wait() { done_.Wait(); }
+
    private:
     Eigen::Notification done_;
   };
@@ -320,8 +305,7 @@
   template <typename DoneCallback, typename Context>
   class EvalParallelNotification {
    public:
-    EvalParallelNotification(Context* ctx, DoneCallback done)
-        : ctx_(ctx), done_(std::move(done)) {}
+    EvalParallelNotification(Context* ctx, DoneCallback done) : ctx_(ctx), done_(std::move(done)) {}
 
     void Notify() {
       // Make a copy of done callback, because it will be destructed when we
@@ -347,48 +331,38 @@
   // executed in asynchronous mode, it owns all the shared state that might be
   // accessible by block packing and kernel tasks.
 
-  template <typename DoneCallback, bool lhs_inner_dim_contiguous,
-            bool rhs_inner_dim_contiguous, bool rhs_inner_dim_reordered,
-            int Alignment>
+  template <typename DoneCallback, bool lhs_inner_dim_contiguous, bool rhs_inner_dim_contiguous,
+            bool rhs_inner_dim_reordered, int Alignment>
   class EvalParallelContext {
    public:
-    typedef internal::TensorContractionInputMapper<
-        LhsScalar, Index, internal::Lhs, LeftEvaluator, left_nocontract_t,
-        contract_t, internal::packet_traits<LhsScalar>::size,
-        lhs_inner_dim_contiguous, false, Unaligned>
+    typedef internal::TensorContractionInputMapper<LhsScalar, Index, internal::Lhs, LeftEvaluator, left_nocontract_t,
+                                                   contract_t, internal::packet_traits<LhsScalar>::size,
+                                                   lhs_inner_dim_contiguous, false, Unaligned>
         LhsMapper;
-    typedef internal::TensorContractionInputMapper<
-        RhsScalar, Index, internal::Rhs, RightEvaluator, right_nocontract_t,
-        contract_t, internal::packet_traits<RhsScalar>::size,
-        rhs_inner_dim_contiguous, rhs_inner_dim_reordered, Unaligned>
+    typedef internal::TensorContractionInputMapper<RhsScalar, Index, internal::Rhs, RightEvaluator, right_nocontract_t,
+                                                   contract_t, internal::packet_traits<RhsScalar>::size,
+                                                   rhs_inner_dim_contiguous, rhs_inner_dim_reordered, Unaligned>
         RhsMapper;
 
     typedef internal::blas_data_mapper<Scalar, Index, ColMajor> OutputMapper;
 
-    typedef internal::TensorContractionKernel<
-        Scalar, LhsScalar, RhsScalar, Index, OutputMapper, LhsMapper, RhsMapper>
+    typedef internal::TensorContractionKernel<Scalar, LhsScalar, RhsScalar, Index, OutputMapper, LhsMapper, RhsMapper>
         TensorContractionKernel;
 
     typedef typename TensorContractionKernel::LhsBlock LhsBlock;
     typedef typename TensorContractionKernel::RhsBlock RhsBlock;
     typedef typename TensorContractionKernel::BlockMemHandle BlockMemHandle;
 
-    EvalParallelContext(const Self* self, int num_threads, Scalar* buffer,
-                        Index tm, Index tn, Index tk, Index bm, Index bn,
-                        Index bk, Index nm, Index nn, Index nk, Index gm,
-                        Index gn, Index nm0, Index nn0, bool shard_by_col,
-                        bool parallel_pack,
-                        bool parallelize_by_sharding_dim_only,
-                        DoneCallback done)
+    EvalParallelContext(const Self* self, int num_threads, Scalar* buffer, Index tm, Index tn, Index tk, Index bm,
+                        Index bn, Index bk, Index nm, Index nn, Index nk, Index gm, Index gn, Index nm0, Index nn0,
+                        bool shard_by_col, bool parallel_pack, bool parallelize_by_sharding_dim_only, DoneCallback done)
         : created_by_thread_id_(std::this_thread::get_id()),
           done_(this, std::move(done)),
           device_(self->m_device),
-          lhs_(self->m_leftImpl, self->m_left_nocontract_strides,
-               self->m_i_strides, self->m_left_contracting_strides,
+          lhs_(self->m_leftImpl, self->m_left_nocontract_strides, self->m_i_strides, self->m_left_contracting_strides,
                self->m_k_strides),
-          rhs_(self->m_rightImpl, self->m_right_nocontract_strides,
-               self->m_j_strides, self->m_right_contracting_strides,
-               self->m_k_strides),
+          rhs_(self->m_rightImpl, self->m_right_nocontract_strides, self->m_j_strides,
+               self->m_right_contracting_strides, self->m_k_strides),
           buffer_(buffer),
           output_(buffer, tm),
           output_kernel_(self->m_output_kernel),
@@ -415,15 +389,11 @@
           // We reserve 2X more capacity for a thread local values, than the
           // number of threads in the pool to efficiently handle task stealing
           // by threads that are not managed by the pool.
-          thread_local_capacity(2 * (parallelize_by_sharding_dim_only_
-                                         ? device_.numThreadsInPool()
-                                         : 0)),
+          thread_local_capacity(2 * (parallelize_by_sharding_dim_only_ ? device_.numThreadsInPool() : 0)),
           // We will use only one of the Lhs/Rhs thread local storage depending
           // on the shard_by_col value and we parallelize by sharding dim ONLY.
-          lhs_thread_local_blocks_(shard_by_col_ ? 0 : thread_local_capacity,
-                                   {*this}, {*this}),
-          rhs_thread_local_blocks_(shard_by_col_ ? thread_local_capacity : 0,
-                                   {*this}, {*this}) {
+          lhs_thread_local_blocks_(shard_by_col_ ? 0 : thread_local_capacity, {*this}, {*this}),
+          rhs_thread_local_blocks_(shard_by_col_ ? thread_local_capacity : 0, {*this}, {*this}) {
       // These two options are mutually exclusive.
       eigen_assert(!(parallel_pack && parallelize_by_sharding_dim_only));
 
@@ -433,12 +403,8 @@
         // nm_ + nn_ notifications, because they will not receive notifications
         // from preceding kernels.
         state_switch_[x] =
-            x == 0
-                ? 1
-                : (parallel_pack_ ? nn_ + nm_ : (shard_by_col_ ? nn_ : nm_)) +
-                      (x == P - 1 ? nm_ * nn_ : 0);
-        state_packing_ready_[x] =
-            parallel_pack_ ? 0 : (shard_by_col_ ? nm_ : nn_);
+            x == 0 ? 1 : (parallel_pack_ ? nn_ + nm_ : (shard_by_col_ ? nn_ : nm_)) + (x == P - 1 ? nm_ * nn_ : 0);
+        state_packing_ready_[x] = parallel_pack_ ? 0 : (shard_by_col_ ? nm_ : nn_);
         state_kernel_[x] = new std::atomic<uint8_t>*[nm_];
         for (Index m = 0; m < nm_; m++) {
           state_kernel_[x][m] = new std::atomic<uint8_t>[nn_];
@@ -446,9 +412,7 @@
           // packing), but the first slice won't get notifications from previous
           // kernels.
           for (Index n = 0; n < nn_; n++)
-            state_kernel_[x][m][n].store(
-                (x == 0 ? 0 : 1) + (parallel_pack_ ? 2 : 1),
-                std::memory_order_relaxed);
+            state_kernel_[x][m][n].store((x == 0 ? 0 : 1) + (parallel_pack_ ? 2 : 1), std::memory_order_relaxed);
         }
       }
 
@@ -465,9 +429,7 @@
 
         if (shard_by_col) {
           can_use_thread_local_packed_ = new std::atomic<bool>[nn_];
-          for (int i = 0; i < nn_; ++i)
-            can_use_thread_local_packed_[i].store(true,
-                                                  std::memory_order_relaxed);
+          for (int i = 0; i < nn_; ++i) can_use_thread_local_packed_[i].store(true, std::memory_order_relaxed);
 
           Index num_blocks = num_worker_threads * gn_;
           thread_local_pre_alocated_mem_ = kernel_.allocateSlices(  //
@@ -479,9 +441,7 @@
 
         } else {
           can_use_thread_local_packed_ = new std::atomic<bool>[nm_];
-          for (int i = 0; i < nm_; ++i)
-            can_use_thread_local_packed_[i].store(true,
-                                                  std::memory_order_relaxed);
+          for (int i = 0; i < nm_; ++i) can_use_thread_local_packed_[i].store(true, std::memory_order_relaxed);
 
           Index num_blocks = num_worker_threads * gm_;
           thread_local_pre_alocated_mem_ = kernel_.allocateSlices(  //
@@ -648,21 +608,15 @@
       ThreadLocalBlocks() = default;
 
       ThreadLocalBlocks(BlockType* base, size_t grain_size)
-          : is_pre_allocated_(true),
-            thread_local_pre_allocated_base_(base),
-            grain_size_(grain_size) {}
+          : is_pre_allocated_(true), thread_local_pre_allocated_base_(base), grain_size_(grain_size) {}
 
-      ThreadLocalBlocks(BlockMemHandle mem_handle,
-                        std::vector<BlockType> blocks)
-          : is_pre_allocated_(false),
-            mem_handle_(std::move(mem_handle)),
-            blocks_(std::move(blocks)) {}
+      ThreadLocalBlocks(BlockMemHandle mem_handle, std::vector<BlockType> blocks)
+          : is_pre_allocated_(false), mem_handle_(std::move(mem_handle)), blocks_(std::move(blocks)) {}
 
       BlockType& block(int grain_index) {
         eigen_assert(grain_index >= 0);
         eigen_assert(static_cast<size_t>(grain_index) < size());
-        return is_pre_allocated_ ? thread_local_pre_allocated_base_[grain_index]
-                                 : blocks_[grain_index];
+        return is_pre_allocated_ ? thread_local_pre_allocated_base_[grain_index] : blocks_[grain_index];
       }
 
       void Release(EvalParallelContext& ctx) const {
@@ -671,9 +625,7 @@
         }
       }
 
-      size_t size() const {
-        return is_pre_allocated_ ? grain_size_ : blocks_.size();
-      }
+      size_t size() const { return is_pre_allocated_ ? grain_size_ : blocks_.size(); }
 
      private:
       bool is_pre_allocated_;
@@ -695,22 +647,18 @@
     // for what side do we plan to do block allocation.
     template <typename BlockType, bool is_rhs>
     class ThreadLocalBlocksInitialize {
-      static constexpr bool kIsLhs =
-          !is_rhs && std::is_same<BlockType, LhsBlock>::value;
-      static const bool kIsRhs =
-          is_rhs && std::is_same<BlockType, RhsBlock>::value;
+      static constexpr bool kIsLhs = !is_rhs && std::is_same<BlockType, LhsBlock>::value;
+      static const bool kIsRhs = is_rhs && std::is_same<BlockType, RhsBlock>::value;
       static_assert(kIsLhs || kIsRhs, "Unknown block type");
 
       using Blocks = ThreadLocalBlocks<BlockType>;
 
      public:
       ThreadLocalBlocksInitialize(EvalParallelContext& ctx)
-          : ctx_(ctx),
-            num_worker_threads_(ctx_.device_.numThreadsInPool()) {}
+          : ctx_(ctx), num_worker_threads_(ctx_.device_.numThreadsInPool()) {}
 
       void operator()(Blocks& blocks) {
-        const int n = ctx_.num_thread_local_allocations_.fetch_add(
-            1, std::memory_order_relaxed);
+        const int n = ctx_.num_thread_local_allocations_.fetch_add(1, std::memory_order_relaxed);
 
         if (n >= num_worker_threads_) {
           ThreadLocalBlocksAllocator<is_rhs>::allocate(ctx_, blocks);
@@ -731,15 +679,13 @@
       struct ThreadLocalBlocksAllocator</*pack_rhs=*/true, EvalCtx> {
         static void allocate(EvalCtx& ctx, Blocks& blocks) {
           std::vector<RhsBlock> rhs_blocks;
-          BlockMemHandle mem_handle = ctx.kernel_.allocateSlices(
-              ctx.device_,
-              /*num_lhs=*/0,
-              /*num_rhs=*/ctx.gn_,
-              /*num_slices=*/1,
-              /*lhs_blocks=*/nullptr, /*rhs_blocks=*/&rhs_blocks);
+          BlockMemHandle mem_handle = ctx.kernel_.allocateSlices(ctx.device_,
+                                                                 /*num_lhs=*/0,
+                                                                 /*num_rhs=*/ctx.gn_,
+                                                                 /*num_slices=*/1,
+                                                                 /*lhs_blocks=*/nullptr, /*rhs_blocks=*/&rhs_blocks);
 
-          blocks = ThreadLocalBlocks<RhsBlock>(std::move(mem_handle),
-                                               std::move(rhs_blocks));
+          blocks = ThreadLocalBlocks<RhsBlock>(std::move(mem_handle), std::move(rhs_blocks));
         }
 
         static void reuse(EvalCtx& ctx, int index, Blocks& blocks) {
@@ -752,15 +698,13 @@
       struct ThreadLocalBlocksAllocator</*pack_rhs=*/false, EvalCtx> {
         static void allocate(EvalCtx& ctx, Blocks& blocks) {
           std::vector<LhsBlock> lhs_blocks;
-          BlockMemHandle mem_handle = ctx.kernel_.allocateSlices(
-              ctx.device_,
-              /*num_lhs=*/ctx.gm_,
-              /*num_rhs=*/0,
-              /*num_slices=*/1,
-              /*lhs_blocks=*/&lhs_blocks, /*rhs_blocks=*/nullptr);
+          BlockMemHandle mem_handle = ctx.kernel_.allocateSlices(ctx.device_,
+                                                                 /*num_lhs=*/ctx.gm_,
+                                                                 /*num_rhs=*/0,
+                                                                 /*num_slices=*/1,
+                                                                 /*lhs_blocks=*/&lhs_blocks, /*rhs_blocks=*/nullptr);
 
-          blocks = ThreadLocalBlocks<LhsBlock>(std::move(mem_handle),
-                                               std::move(lhs_blocks));
+          blocks = ThreadLocalBlocks<LhsBlock>(std::move(mem_handle), std::move(lhs_blocks));
         }
 
         static void reuse(EvalCtx& ctx, int index, Blocks& blocks) {
@@ -785,10 +729,8 @@
     };
 
     // ThreadLocalBlocks initialization callables.
-    using ThreadLocalLhsInit =
-        ThreadLocalBlocksInitialize<LhsBlock, /*is_rhs=*/false>;
-    using ThreadLocalRhsInit =
-        ThreadLocalBlocksInitialize<RhsBlock, /*is_rhs=*/true>;
+    using ThreadLocalLhsInit = ThreadLocalBlocksInitialize<LhsBlock, /*is_rhs=*/false>;
+    using ThreadLocalRhsInit = ThreadLocalBlocksInitialize<RhsBlock, /*is_rhs=*/true>;
 
     // ThreadLocalBlocks release callables.
     using ThreadLocalLhsRelease = ThreadLocalBlocksRelease<LhsBlock>;
@@ -796,12 +738,8 @@
 
     // Thread local containers for Lhs/Rhs block packs. In practice only one of
     // them will be used, depending on the shard_by_col value.
-    Eigen::ThreadLocal<ThreadLocalBlocks<LhsBlock>, ThreadLocalLhsInit,
-                       ThreadLocalLhsRelease>
-        lhs_thread_local_blocks_;
-    Eigen::ThreadLocal<ThreadLocalBlocks<RhsBlock>, ThreadLocalRhsInit,
-                       ThreadLocalRhsRelease>
-        rhs_thread_local_blocks_;
+    Eigen::ThreadLocal<ThreadLocalBlocks<LhsBlock>, ThreadLocalLhsInit, ThreadLocalLhsRelease> lhs_thread_local_blocks_;
+    Eigen::ThreadLocal<ThreadLocalBlocks<RhsBlock>, ThreadLocalRhsInit, ThreadLocalRhsRelease> rhs_thread_local_blocks_;
 
     // After a particular shard for Kth slice missed thread local execution
     // opportunity (K-1 slice didn't complete kernels execution), we can no
@@ -824,7 +762,8 @@
         ThreadLocalBlocks<LhsBlock>& blocks = lhs_thread_local_blocks_.local();
 
         Index grain_index = m1 - m * gm_;
-        return blocks.block(internal::convert_index<int>(grain_index)); // FIXME better make ThreadLocalBlocks use Eigen::Index?
+        return blocks.block(
+            internal::convert_index<int>(grain_index));  // FIXME better make ThreadLocalBlocks use Eigen::Index?
       } else {
         return packed_lhs_[k % (P - 1)][m1];
       }
@@ -836,7 +775,8 @@
         ThreadLocalBlocks<RhsBlock>& blocks = rhs_thread_local_blocks_.local();
 
         Index grain_index = n1 - n * gn_;
-        return blocks.block(internal::convert_index<int>(grain_index)); // FIXME better make ThreadLocalBlocks use Eigen::Index?
+        return blocks.block(
+            internal::convert_index<int>(grain_index));  // FIXME better make ThreadLocalBlocks use Eigen::Index?
       } else {
         return packed_rhs_[k % (P - 1)][n1];
       }
@@ -864,15 +804,13 @@
           // executed sequentially in current thread, it's no longer safe to use
           // thread local memory in following slices along the k dimensions.
           eigen_assert(k > 0);
-          can_use_thread_local_packed_[m].store(false,
-                                                std::memory_order_relaxed);
+          can_use_thread_local_packed_[m].store(false, std::memory_order_relaxed);
         }
       }
 
       const Index mend = m * gm_ + gm(m);
       for (Index m1 = m * gm_; m1 < mend; m1++)
-        kernel_.packLhs(&packed_lhs(m, k, m1, use_thread_local),
-                        lhs_.getSubMapper(m1 * bm_, k * bk_), bk(k), bm(m1));
+        kernel_.packLhs(&packed_lhs(m, k, m1, use_thread_local), lhs_.getSubMapper(m1 * bm_, k * bk_), bk(k), bm(m1));
 
       if (!parallel_pack_ && shard_by_col_) {
         eigen_assert(!use_thread_local);
@@ -898,8 +836,7 @@
           // executed sequentially in current thread, it's no longer safe to use
           // thread local memory in following slices along the k dimensions.
           eigen_assert(k > 0);
-          can_use_thread_local_packed_[n].store(false,
-                                                std::memory_order_relaxed);
+          can_use_thread_local_packed_[n].store(false, std::memory_order_relaxed);
         }
       }
 
@@ -917,8 +854,7 @@
           // worker thread, which can lead to underutilization and deadlocks.
           std::fill_n(buffer_ + n1 * bn_ * m_, bn(n1) * m_, Scalar(0));
         }
-        kernel_.packRhs(&packed_rhs(n, k, n1, use_thread_local),
-                        rhs_.getSubMapper(k * bk_, n1 * bn_), bk(k), bn(n1));
+        kernel_.packRhs(&packed_rhs(n, k, n1, use_thread_local), rhs_.getSubMapper(k * bk_, n1 * bn_), bk(k), bn(n1));
       }
 
       if (parallel_pack_ || shard_by_col_) {
@@ -942,23 +878,18 @@
 
       // NOTE: output = alpha * LHS * RHS + beta * output.
       const Scalar alpha = Scalar(1);
-      const Scalar beta =
-          (TensorContractionKernel::HasBeta && k == 0) ? Scalar(0) : Scalar(1);
+      const Scalar beta = (TensorContractionKernel::HasBeta && k == 0) ? Scalar(0) : Scalar(1);
 
       if (shard_by_col_) {
         for (Index n1 = n * gn_; n1 < nend; n1++) {
           for (Index m1 = m * gm_; m1 < mend; m1++) {
             const auto output_mapper = output_.getSubMapper(m1 * bm_, n1 * bn_);
-            kernel_.invoke(
-                output_mapper,
-                packed_lhs(m, k, m1, !shard_by_col_ && use_thread_local),
-                packed_rhs(n, k, n1, shard_by_col_ && use_thread_local), bm(m1),
-                bk(k), bn(n1), alpha, beta);
+            kernel_.invoke(output_mapper, packed_lhs(m, k, m1, !shard_by_col_ && use_thread_local),
+                           packed_rhs(n, k, n1, shard_by_col_ && use_thread_local), bm(m1), bk(k), bn(n1), alpha, beta);
 
             // We are done with the last task for the [m1, n1] block.
             if (k + 1 == nk_) {
-              output_kernel_(output_mapper, tensor_contraction_params_,
-                             m1 * bm_, n1 * bn_, bm(m1), bn(n1));
+              output_kernel_(output_mapper, tensor_contraction_params_, m1 * bm_, n1 * bn_, bm(m1), bn(n1));
             }
           }
         }
@@ -966,16 +897,12 @@
         for (Index m1 = m * gm_; m1 < mend; m1++)
           for (Index n1 = n * gn_; n1 < nend; n1++) {
             const auto output_mapper = output_.getSubMapper(m1 * bm_, n1 * bn_);
-            kernel_.invoke(
-                output_mapper,
-                packed_lhs(m, k, m1, !shard_by_col_ && use_thread_local),
-                packed_rhs(n, k, n1, shard_by_col_ && use_thread_local), bm(m1),
-                bk(k), bn(n1), alpha, beta);
+            kernel_.invoke(output_mapper, packed_lhs(m, k, m1, !shard_by_col_ && use_thread_local),
+                           packed_rhs(n, k, n1, shard_by_col_ && use_thread_local), bm(m1), bk(k), bn(n1), alpha, beta);
 
             // We are done with the last task for the [m1, n1] block.
             if (k + 1 == nk_) {
-              output_kernel_(output_mapper, tensor_contraction_params_,
-                             m1 * bm_, n1 * bn_, bm(m1), bn(n1));
+              output_kernel_(output_mapper, tensor_contraction_params_, m1 * bm_, n1 * bn_, bm(m1), bn(n1));
             }
           }
       }
@@ -992,8 +919,7 @@
       enqueue_packing(k, shard_by_col_);
     }
 
-    void signal_kernel(Index m, Index n, Index k, bool sync,
-                       bool use_thread_local) {
+    void signal_kernel(Index m, Index n, Index k, bool sync, bool use_thread_local) {
       std::atomic<uint8_t>* state = &state_kernel_[k % P][m][n];
       Index s = state->load();
       eigen_assert(s > 0);
@@ -1006,8 +932,7 @@
         kernel(m, n, k, use_thread_local);
       } else {
         eigen_assert(!use_thread_local);
-        device_.enqueueNoNotification(
-            [=]() { kernel(m, n, k, use_thread_local); });
+        device_.enqueueNoNotification([=]() { kernel(m, n, k, use_thread_local); });
       }
     }
 
@@ -1018,9 +943,7 @@
 
       // Ready to switch to the next k slice.
       // Reset counter for the next iteration.
-      state_switch_[k % P] =
-          (parallel_pack_ ? nm_ + nn_ : (shard_by_col_ ? nn_ : nm_)) +
-          nm_ * nn_;
+      state_switch_[k % P] = (parallel_pack_ ? nm_ + nn_ : (shard_by_col_ ? nn_ : nm_)) + nm_ * nn_;
       if (k < nk_) {
         // Issue lhs/rhs packing. Their completion will in turn kick off
         // kernels.
@@ -1039,17 +962,14 @@
         // pretend that all nk + 1 packing tasks just finish instantly; so that
         // nk + 2 switch only waits for completion of nk kernels.
       } else if (k == nk_) {
-        signal_switch(k + 1,
-                      parallel_pack_ ? nm_ + nn_ : (shard_by_col_ ? nn_ : nm_));
+        signal_switch(k + 1, parallel_pack_ ? nm_ + nn_ : (shard_by_col_ ? nn_ : nm_));
       } else {
         done_.Notify();
       }
     }
 
     // Enqueue all rhs/lhs packing for k-th slice.
-    void enqueue_packing(Index k, bool rhs) {
-      enqueue_packing_helper(0, rhs ? nn_ : nm_, k, rhs);
-    }
+    void enqueue_packing(Index k, bool rhs) { enqueue_packing_helper(0, rhs ? nn_ : nm_, k, rhs); }
 
     void enqueue_packing_helper(Index start, Index end, Index k, bool rhs) {
       if (end - start == 1) {
@@ -1060,8 +980,7 @@
       } else {
         while (end - start > 1) {
           Index mid = (start + end) / 2;
-          device_.enqueueNoNotification(
-              [=]() { enqueue_packing_helper(mid, end, k, rhs); });
+          device_.enqueueNoNotification([=]() { enqueue_packing_helper(mid, end, k, rhs); });
           end = mid;
         }
 
@@ -1073,14 +992,11 @@
         //     completing a call to the last kernel of the k slice.
         // (2) all pack tasks for sharded dim must be executed in a thread
         //     pool to get pre-allocated thead local buffers.
-        bool pack_async =
-          (start == 0) &&
-          (parallelize_by_sharding_dim_only_&& shard_by_col_ == rhs) &&
-          (k > 0 || std::this_thread::get_id() == created_by_thread_id_);
+        bool pack_async = (start == 0) && (parallelize_by_sharding_dim_only_ && shard_by_col_ == rhs) &&
+                          (k > 0 || std::this_thread::get_id() == created_by_thread_id_);
 
         if (pack_async) {
-          device_.enqueueNoNotification(
-              [=]() { enqueue_packing_helper(start, end, k, rhs); });
+          device_.enqueueNoNotification([=]() { enqueue_packing_helper(start, end, k, rhs); });
         } else {
           enqueue_packing_helper(start, end, k, rhs);
         }
@@ -1099,12 +1015,9 @@
     void operator=(const EvalParallelContext&) = delete;
   };
 
-  template <bool lhs_inner_dim_contiguous, bool rhs_inner_dim_contiguous,
-            bool rhs_inner_dim_reordered, int Alignment>
-  using SyncEvalParallelContext =
-      EvalParallelContext<NoCallback, lhs_inner_dim_contiguous,
-                          rhs_inner_dim_contiguous, rhs_inner_dim_reordered,
-                          Alignment>;
+  template <bool lhs_inner_dim_contiguous, bool rhs_inner_dim_contiguous, bool rhs_inner_dim_reordered, int Alignment>
+  using SyncEvalParallelContext = EvalParallelContext<NoCallback, lhs_inner_dim_contiguous, rhs_inner_dim_contiguous,
+                                                      rhs_inner_dim_reordered, Alignment>;
 
   // ------------------------------------------------------------------------ //
 
@@ -1115,10 +1028,8 @@
 
   template <typename DoneCallback>
   struct EvalShardedByInnerDimContext {
-    EvalShardedByInnerDimContext(const Self* self, int num_threads,
-                                 Scalar* result_buffer,
-                                 Index m_size, Index n_size, Index k_size,
-                                 DoneCallback done_callback)
+    EvalShardedByInnerDimContext(const Self* self, int num_threads, Scalar* result_buffer, Index m_size, Index n_size,
+                                 Index k_size, DoneCallback done_callback)
         : evaluator(self),
           m_lhs_inner_dim_contiguous(evaluator->m_lhs_inner_dim_contiguous),
           m_rhs_inner_dim_contiguous(evaluator->m_rhs_inner_dim_contiguous),
@@ -1143,10 +1054,7 @@
 
       // Allocate temporary buffers for each block.
       for (Index block_idx = 0; block_idx < num_blocks; ++block_idx) {
-        Scalar* buf = block_idx == 0
-                          ? result
-                          : static_cast<Scalar*>(evaluator->m_device.allocate(
-                                buffer_size_bytes));
+        Scalar* buf = block_idx == 0 ? result : static_cast<Scalar*>(evaluator->m_device.allocate(buffer_size_bytes));
         block_buffers.emplace_back(buf);
       }
     }
@@ -1236,10 +1144,9 @@
     void processBlock(Index block_idx, Index begin, Index end) {
       Scalar* buf = block_buffers[block_idx];
 
-      TENSOR_CONTRACTION_DISPATCH(
-          evaluator->template evalGemmPartialWithoutOutputKernel, Alignment,
-          (buf, begin, end,
-           /*num_threads=*/internal::convert_index<int>(num_blocks)));
+      TENSOR_CONTRACTION_DISPATCH(evaluator->template evalGemmPartialWithoutOutputKernel, Alignment,
+                                  (buf, begin, end,
+                                   /*num_threads=*/internal::convert_index<int>(num_blocks)));
 
       // Check if it was the last task in l0 range.
       const Index l0_index = block_idx / l0_size;
@@ -1253,12 +1160,11 @@
         const Index dst_block_idx = l0_index * l0_size;
 
         if (rng_size == l0_size) {
-          addAllToBuffer<Alignment>(
-              m * n,
-              /*src_buf0=*/block_buffers[dst_block_idx + 1],
-              /*src_buf1=*/block_buffers[dst_block_idx + 2],
-              /*src_buf2=*/block_buffers[dst_block_idx + 3],
-              /*dst_buf= */ block_buffers[dst_block_idx]);
+          addAllToBuffer<Alignment>(m * n,
+                                    /*src_buf0=*/block_buffers[dst_block_idx + 1],
+                                    /*src_buf1=*/block_buffers[dst_block_idx + 2],
+                                    /*src_buf2=*/block_buffers[dst_block_idx + 3],
+                                    /*dst_buf= */ block_buffers[dst_block_idx]);
         } else {
           // Aggregate blocks of potentially incomplete last range.
           for (int i = 1; i < rng_size; ++i) {
@@ -1276,58 +1182,45 @@
       Index l0_index = 1;
 
       for (; l0_index + 2 < l0_ranges; l0_index += 3) {
-        addAllToBuffer<Alignment>(
-            m * n,
-            /*src_buf0=*/block_buffers[(l0_index + 0) * l0_size],
-            /*src_buf1=*/block_buffers[(l0_index + 1) * l0_size],
-            /*src_buf2=*/block_buffers[(l0_index + 2) * l0_size],
-            /*dst_buf= */ block_buffers[0]);
+        addAllToBuffer<Alignment>(m * n,
+                                  /*src_buf0=*/block_buffers[(l0_index + 0) * l0_size],
+                                  /*src_buf1=*/block_buffers[(l0_index + 1) * l0_size],
+                                  /*src_buf2=*/block_buffers[(l0_index + 2) * l0_size],
+                                  /*dst_buf= */ block_buffers[0]);
       }
 
       for (; l0_index < l0_ranges; ++l0_index) {
-        addToBuffer<Alignment>(m * n, block_buffers[l0_index * l0_size],
-                               block_buffers[0]);
+        addToBuffer<Alignment>(m * n, block_buffers[l0_index * l0_size], block_buffers[0]);
       }
     }
 
     void applyOutputKernel() const {
       typedef internal::blas_data_mapper<Scalar, Index, ColMajor> OutputMapper;
-      evaluator->m_output_kernel(
-          OutputMapper(result, m), evaluator->m_tensor_contraction_params,
-          static_cast<Eigen::Index>(0), static_cast<Eigen::Index>(0), m, n);
+      evaluator->m_output_kernel(OutputMapper(result, m), evaluator->m_tensor_contraction_params,
+                                 static_cast<Eigen::Index>(0), static_cast<Eigen::Index>(0), m, n);
     }
 
     // Compute block size with accounting for potentially incomplete last block.
     Index actualBlockSize(Index block_idx) const {
-      return block_idx + 1 < num_blocks
-                 ? block_size
-                 : k + block_size - block_size * num_blocks;
+      return block_idx + 1 < num_blocks ? block_size : k + block_size - block_size * num_blocks;
     };
 
     // Compute range size with accounting for potentially incomplete last range.
-    Index actualRangeSize(Index num_ranges, Index range_size,
-                          Index range_idx) const {
+    Index actualRangeSize(Index num_ranges, Index range_size, Index range_idx) const {
       eigen_assert(range_idx < num_ranges);
-      return range_idx + 1 < num_ranges
-                 ? range_size
-                 : num_blocks + range_size - range_size * num_ranges;
+      return range_idx + 1 < num_ranges ? range_size : num_blocks + range_size - range_size * num_ranges;
     };
 
     template <int Alignment>
-    EIGEN_STRONG_INLINE static void addToBuffer(size_t n, const Scalar* src_buf,
-                                                Scalar* tgt_buf) {
-      const int output_packet_size =
-          internal::unpacket_traits<PacketReturnType>::size;
+    EIGEN_STRONG_INLINE static void addToBuffer(size_t n, const Scalar* src_buf, Scalar* tgt_buf) {
+      const int output_packet_size = internal::unpacket_traits<PacketReturnType>::size;
       size_t i = 0;
       const size_t num_packets = n / output_packet_size;
       for (; i < output_packet_size * num_packets; i += output_packet_size) {
-        const PacketReturnType src_val =
-            internal::pload<PacketReturnType>(src_buf + i);
-        const PacketReturnType tgt_val =
-            internal::ploadt<PacketReturnType, Alignment>(tgt_buf + i);
+        const PacketReturnType src_val = internal::pload<PacketReturnType>(src_buf + i);
+        const PacketReturnType tgt_val = internal::ploadt<PacketReturnType, Alignment>(tgt_buf + i);
         const PacketReturnType sum = internal::padd(src_val, tgt_val);
-        internal::pstoret<Scalar, PacketReturnType, Alignment>(tgt_buf + i,
-                                                               sum);
+        internal::pstoret<Scalar, PacketReturnType, Alignment>(tgt_buf + i, sum);
       }
       for (; i < n; ++i) {
         tgt_buf[i] += src_buf[i];
@@ -1335,18 +1228,14 @@
     }
 
     template <int Alignment>
-    EIGEN_STRONG_INLINE static void addAllToBuffer(size_t n,
-                                                   const Scalar* src_buf0,
-                                                   const Scalar* src_buf1,
-                                                   const Scalar* src_buf2,
-                                                   Scalar* dst_buf) {
+    EIGEN_STRONG_INLINE static void addAllToBuffer(size_t n, const Scalar* src_buf0, const Scalar* src_buf1,
+                                                   const Scalar* src_buf2, Scalar* dst_buf) {
       using ::Eigen::internal::padd;
       using ::Eigen::internal::pload;
       using ::Eigen::internal::ploadt;
       using ::Eigen::internal::pstoret;
 
-      const int output_packet_size =
-          internal::unpacket_traits<PacketReturnType>::size;
+      const int output_packet_size = internal::unpacket_traits<PacketReturnType>::size;
 
       size_t i = 0;
       const size_t num_packets = n / output_packet_size;
@@ -1356,8 +1245,7 @@
         const auto src_val2 = pload<PacketReturnType>(src_buf2 + i);
 
         const auto dst_val = ploadt<PacketReturnType, Alignment>(dst_buf + i);
-        const auto sum =
-            padd(padd(dst_val, src_val0), padd(src_val1, src_val2));
+        const auto sum = padd(padd(dst_val, src_val0), padd(src_val1, src_val2));
 
         pstoret<Scalar, PacketReturnType, Alignment>(dst_buf + i, sum);
       }
@@ -1370,10 +1258,9 @@
     void eval(Barrier& barrier, Index start_block_idx, Index end_block_idx) {
       while (end_block_idx - start_block_idx > 1) {
         Index mid_block_idx = (start_block_idx + end_block_idx) / 2;
-        evaluator->m_device.enqueueNoNotification(
-            [this, &barrier, mid_block_idx, end_block_idx]() {
-              eval<Alignment>(barrier, mid_block_idx, end_block_idx);
-            });
+        evaluator->m_device.enqueueNoNotification([this, &barrier, mid_block_idx, end_block_idx]() {
+          eval<Alignment>(barrier, mid_block_idx, end_block_idx);
+        });
         end_block_idx = mid_block_idx;
       }
 
@@ -1390,9 +1277,7 @@
       while (end_block_idx - start_block_idx > 1) {
         Index mid_block_idx = (start_block_idx + end_block_idx) / 2;
         evaluator->m_device.enqueueNoNotification(
-            [this, mid_block_idx, end_block_idx]() {
-              evalAsync<Alignment>(mid_block_idx, end_block_idx);
-            });
+            [this, mid_block_idx, end_block_idx]() { evalAsync<Alignment>(mid_block_idx, end_block_idx); });
         end_block_idx = mid_block_idx;
       }
 
@@ -1440,8 +1325,7 @@
       const Index target_block_size = round_up(numext::div_ceil<Index>(k, num_threads));
       const Index desired_min_block_size = 12 * packet_size;
 
-      return numext::mini<Index>(
-          k, numext::maxi<Index>(desired_min_block_size, target_block_size));
+      return numext::mini<Index>(k, numext::maxi<Index>(desired_min_block_size, target_block_size));
     }
 
     EvalShardedByInnerDimContext(const EvalShardedByInnerDimContext&) = delete;
@@ -1466,8 +1350,7 @@
         (n / num_threads < Traits::nr ||
          // ... or barely enough data for vectorization over columns,
          // but it is not evenly dividable across threads
-         (n / num_threads < 4 * Traits::nr &&
-          (n % (num_threads * Traits::nr)) != 0 &&
+         (n / num_threads < 4 * Traits::nr && (n % (num_threads * Traits::nr)) != 0 &&
           // ... and it is evenly dividable across threads for rows
           ((m % (num_threads * Traits::nr)) == 0 ||
            // .. or it is not evenly dividable for both dimensions but
@@ -1481,8 +1364,7 @@
     return true;
   }
 
-  Index coarsenM(Index m, Index n, Index bm, Index bn, Index bk, Index gn,
-                 int num_threads, bool shard_by_col) const {
+  Index coarsenM(Index m, Index n, Index bm, Index bn, Index bk, Index gn, int num_threads, bool shard_by_col) const {
     Index gm = 1;
     Index gm1 = 1;
     Index nm0 = numext::div_ceil(m, bm);
@@ -1494,8 +1376,7 @@
       while (gm1 <= nm0 && nm1 == numext::div_ceil(nm0, gm1)) gm1++;
       if (gm1 > nm0) break;
       // Check the candidate.
-      int res = checkGrain(m, n, bm, bn, bk, gm1, gn, gm, gn, num_threads,
-                           shard_by_col);
+      int res = checkGrain(m, n, bm, bn, bk, gm1, gn, gm, gn, num_threads, shard_by_col);
       if (res < 0) break;
       nm1 = numext::div_ceil(nm0, gm1);
       if (res == 0) continue;
@@ -1505,8 +1386,7 @@
     return gm;
   }
 
-  Index coarsenN(Index m, Index n, Index bm, Index bn, Index bk, Index gm,
-                 int num_threads, bool shard_by_col) const {
+  Index coarsenN(Index m, Index n, Index bm, Index bn, Index bk, Index gm, int num_threads, bool shard_by_col) const {
     Index gn = 1;
     Index gn1 = 1;
     Index nn0 = numext::div_ceil(n, bn);
@@ -1514,8 +1394,7 @@
     for (;;) {
       while (gn1 <= nn0 && nn1 == numext::div_ceil(nn0, gn1)) gn1++;
       if (gn1 > nn0) break;
-      int res = checkGrain(m, n, bm, bn, bk, gm, gn1, gm, gn, num_threads,
-                           shard_by_col);
+      int res = checkGrain(m, n, bm, bn, bk, gm, gn1, gm, gn, num_threads, shard_by_col);
       if (res < 0) break;
       nn1 = numext::div_ceil(nn0, gn1);
       if (res == 0) continue;
@@ -1526,13 +1405,10 @@
 
   // checkGrain checks whether grain (gm, gn) is suitable and is better than
   // (oldgm, oldgn).
-  int checkGrain(Index m, Index n, Index bm, Index bn, Index bk, Index gm,
-                 Index gn, Index oldgm, Index oldgn, int num_threads,
-                 bool shard_by_col) const {
-    const TensorOpCost cost =
-        contractionCost(bm * gm, bn * gn, bm, bn, bk, shard_by_col, true);
-    double taskSize = TensorCostModel<ThreadPoolDevice>::taskSize(
-        static_cast<double>(bm) * gm * bn * gn, cost);
+  int checkGrain(Index m, Index n, Index bm, Index bn, Index bk, Index gm, Index gn, Index oldgm, Index oldgn,
+                 int num_threads, bool shard_by_col) const {
+    const TensorOpCost cost = contractionCost(bm * gm, bn * gn, bm, bn, bk, shard_by_col, true);
+    double taskSize = TensorCostModel<ThreadPoolDevice>::taskSize(static_cast<double>(bm) * gm * bn * gn, cost);
     // If the task is too small, then we agree on it regardless of anything
     // else. Otherwise synchronization overheads will dominate.
     if (taskSize < 1) return 1;
@@ -1547,19 +1423,18 @@
     Index nm0 = numext::div_ceil(m, bm);
     Index nn0 = numext::div_ceil(n, bn);
     Index new_tasks = numext::div_ceil(nm0, gm) * numext::div_ceil(nn0, gn);
-    double new_parallelism = static_cast<double>(new_tasks) /
-                             (numext::div_ceil<Index>(new_tasks, num_threads) * num_threads);
+    double new_parallelism =
+        static_cast<double>(new_tasks) / (numext::div_ceil<Index>(new_tasks, num_threads) * num_threads);
     Index old_tasks = numext::div_ceil(nm0, oldgm) * numext::div_ceil(nn0, oldgn);
-    double old_parallelism = static_cast<double>(old_tasks) /
-                             (numext::div_ceil<Index>(old_tasks, num_threads) * num_threads);
+    double old_parallelism =
+        static_cast<double>(old_tasks) / (numext::div_ceil<Index>(old_tasks, num_threads) * num_threads);
     if (new_parallelism > old_parallelism || new_parallelism == 1) return 1;
     return 0;
   }
 
-  TensorOpCost contractionCost(Index m, Index n, Index bm, Index bn, Index bk,
-                               bool shard_by_col, bool prepacked) const {
-    const int packed_size = std::min<int>(PacketType<LhsScalar, Device>::size,
-                                          PacketType<RhsScalar, Device>::size);
+  TensorOpCost contractionCost(Index m, Index n, Index bm, Index bn, Index bk, bool shard_by_col,
+                               bool prepacked) const {
+    const int packed_size = std::min<int>(PacketType<LhsScalar, Device>::size, PacketType<RhsScalar, Device>::size);
     const int output_packet_size = internal::unpacket_traits<PacketReturnType>::size;
     const double kd = static_cast<double>(bk);
     double compute_bandwidth = computeBandwidth(false, bm, bn, bk);
@@ -1587,26 +1462,22 @@
 
   // Decide whether we want to shard m x k x n contraction over the inner
   // (contraction) dimension (k).
-  static bool shardByInnerDim(Index m, Index n, Index k, int num_threads,
-                              int num_threads_by_k) {
+  static bool shardByInnerDim(Index m, Index n, Index k, int num_threads, int num_threads_by_k) {
     std::ptrdiff_t bufsize = m * n * sizeof(Scalar);
     bool shard_by_k = false;
-    if (n == 1 ||                // If mat*vec or...
-        num_threads_by_k < 2 ||  // running single threaded or...
-        num_threads_by_k <
-            num_threads ||  // sharding by k gives less parallelism or...
+    if (n == 1 ||                                      // If mat*vec or...
+        num_threads_by_k < 2 ||                        // running single threaded or...
+        num_threads_by_k < num_threads ||              // sharding by k gives less parallelism or...
         bufsize > l3CacheSize() / num_threads_by_k ||  // need more buffer space
         // than L3 cache or...
         k / num_threads_by_k < 2 * Traits::nr) {  // k per thread is tiny.
       shard_by_k = false;
-    } else if (numext::maxi(m, n) / num_threads <
-                   Traits::nr ||  // both other dimensions are tiny or...
-               // k per thread is not small and...
+    } else if (numext::maxi(m, n) / num_threads < Traits::nr ||  // both other dimensions are tiny or...
+                                                                 // k per thread is not small and...
                (k / num_threads_by_k > 8 * Traits::nr &&
                 // one of the outer dimensions is tiny or sharding by k offers
                 // more parallelism.
-                (numext::mini(m, n) < 2 * Traits::nr ||
-                 num_threads_by_k > num_threads))) {
+                (numext::mini(m, n) < 2 * Traits::nr || num_threads_by_k > num_threads))) {
       shard_by_k = true;
     }
     return shard_by_k;
@@ -1629,19 +1500,17 @@
   int numThreadsInnerDim(Index m, Index n, Index k) const {
     const int output_packet_size = internal::unpacket_traits<PacketReturnType>::size;
     TensorOpCost cost = contractionCostPerInnerDim(m, n, k);
-    double total_parallel_cost =
-        TensorCostModel<ThreadPoolDevice>::totalCost(k, cost);
+    double total_parallel_cost = TensorCostModel<ThreadPoolDevice>::totalCost(k, cost);
     // Cost of reduction step accumulating the m*n per-thread buffers into the
     // result.
-    double reduction_cost = TensorCostModel<ThreadPoolDevice>::totalCost(
-        m * n, TensorOpCost(2, 1, 1, true, output_packet_size));
+    double reduction_cost =
+        TensorCostModel<ThreadPoolDevice>::totalCost(m * n, TensorOpCost(2, 1, 1, true, output_packet_size));
     int num_threads = 1;
     double min_cost = total_parallel_cost;
     double kPerThreadOverHead = 3000;
     double kFixedOverHead = 100000;
     for (int nt = 2; nt <= this->m_device.numThreads(); nt += 2) {
-      double sequential_cost =
-          kFixedOverHead + nt * (reduction_cost + kPerThreadOverHead);
+      double sequential_cost = kFixedOverHead + nt * (reduction_cost + kPerThreadOverHead);
       double parallel_cost = total_parallel_cost / nt + sequential_cost;
       if (parallel_cost < min_cost) {
         num_threads = nt;
@@ -1651,17 +1520,13 @@
     return num_threads;
   }
 
-  double computeBandwidth(bool shard_by_col, Index bm, Index bn,
-                          Index bk) const {
+  double computeBandwidth(bool shard_by_col, Index bm, Index bn, Index bk) const {
     // Peak VFMA bandwidth is 0.5. However if we have not enough data for
     // vectorization bandwidth drops. The 4.0 and 2.0 bandwidth is determined
     // experimentally.
-    double computeBandwidth =
-        bk == 1 ? 4.0
-                : (shard_by_col ? bn : bm) < Traits::nr ||
-                          (shard_by_col ? bm : bn) < Traits::mr
-                      ? 2.0
-                      : 0.5;
+    double computeBandwidth = bk == 1                                                                          ? 4.0
+                              : (shard_by_col ? bn : bm) < Traits::nr || (shard_by_col ? bm : bn) < Traits::mr ? 2.0
+                                                                                                               : 0.5;
 #ifndef EIGEN_VECTORIZE_FMA
     // Bandwidth of all of VFMA/MULPS/ADDPS is 0.5 on latest Intel processors.
     // However for MULPS/ADDPS we have dependent sequence of 2 such
@@ -1671,10 +1536,9 @@
 #endif
     return computeBandwidth;
   }
-
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
 #endif  // EIGEN_USE_THREADS
-#endif // EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_THREAD_POOL_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_CONTRACTION_THREAD_POOL_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorConversion.h b/unsupported/Eigen/CXX11/src/Tensor/TensorConversion.h
index a82e83b..5e4a586 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorConversion.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorConversion.h
@@ -16,16 +16,15 @@
 namespace Eigen {
 
 /** \class TensorConversionOp
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Tensor conversion class. This class makes it possible to vectorize
-  * type casting operations when the number of scalars per packet in the source
-  * and the destination type differ
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Tensor conversion class. This class makes it possible to vectorize
+ * type casting operations when the number of scalars per packet in the source
+ * and the destination type differ
+ */
 namespace internal {
-template<typename TargetType, typename XprType>
-struct traits<TensorConversionOp<TargetType, XprType> >
-{
+template <typename TargetType, typename XprType>
+struct traits<TensorConversionOp<TargetType, XprType> > {
   // Type promotion to handle the case where the types of the lhs and the rhs are different.
   typedef TargetType Scalar;
   typedef typename traits<XprType>::StorageKind StorageKind;
@@ -38,31 +37,27 @@
   typedef typename TypeConversion<Scalar, typename traits<XprType>::PointerType>::type PointerType;
 };
 
-template<typename TargetType, typename XprType>
-struct eval<TensorConversionOp<TargetType, XprType>, Eigen::Dense>
-{
+template <typename TargetType, typename XprType>
+struct eval<TensorConversionOp<TargetType, XprType>, Eigen::Dense> {
   typedef const TensorConversionOp<TargetType, XprType>& type;
 };
 
-template<typename TargetType, typename XprType>
-struct nested<TensorConversionOp<TargetType, XprType>, 1, typename eval<TensorConversionOp<TargetType, XprType> >::type>
-{
+template <typename TargetType, typename XprType>
+struct nested<TensorConversionOp<TargetType, XprType>, 1,
+              typename eval<TensorConversionOp<TargetType, XprType> >::type> {
   typedef TensorConversionOp<TargetType, XprType> type;
 };
 
 }  // end namespace internal
 
-
 template <typename TensorEvaluator, typename SrcPacket, typename TgtPacket, int SrcCoeffRatio, int TgtCoeffRatio>
 struct PacketConverter;
 
 template <typename TensorEvaluator, typename SrcPacket, typename TgtPacket>
 struct PacketConverter<TensorEvaluator, SrcPacket, TgtPacket, 1, 1> {
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  PacketConverter(const TensorEvaluator& impl)
-      : m_impl(impl) {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketConverter(const TensorEvaluator& impl) : m_impl(impl) {}
 
-  template<int LoadMode, typename Index>
+  template <int LoadMode, typename Index>
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TgtPacket packet(Index index) const {
     return internal::pcast<SrcPacket, TgtPacket>(m_impl.template packet<LoadMode>(index));
   }
@@ -71,14 +66,11 @@
   const TensorEvaluator& m_impl;
 };
 
-
 template <typename TensorEvaluator, typename SrcPacket, typename TgtPacket>
 struct PacketConverter<TensorEvaluator, SrcPacket, TgtPacket, 2, 1> {
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  PacketConverter(const TensorEvaluator& impl)
-      : m_impl(impl) {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketConverter(const TensorEvaluator& impl) : m_impl(impl) {}
 
-  template<int LoadMode, typename Index>
+  template <int LoadMode, typename Index>
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TgtPacket packet(Index index) const {
     const int SrcPacketSize = internal::unpacket_traits<SrcPacket>::size;
 
@@ -94,11 +86,9 @@
 
 template <typename TensorEvaluator, typename SrcPacket, typename TgtPacket>
 struct PacketConverter<TensorEvaluator, SrcPacket, TgtPacket, 4, 1> {
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  PacketConverter(const TensorEvaluator& impl)
-      : m_impl(impl) {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketConverter(const TensorEvaluator& impl) : m_impl(impl) {}
 
-  template<int LoadMode, typename Index>
+  template <int LoadMode, typename Index>
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TgtPacket packet(Index index) const {
     const int SrcPacketSize = internal::unpacket_traits<SrcPacket>::size;
 
@@ -116,11 +106,9 @@
 
 template <typename TensorEvaluator, typename SrcPacket, typename TgtPacket>
 struct PacketConverter<TensorEvaluator, SrcPacket, TgtPacket, 8, 1> {
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  PacketConverter(const TensorEvaluator& impl)
-      : m_impl(impl) {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketConverter(const TensorEvaluator& impl) : m_impl(impl) {}
 
-  template<int LoadMode, typename Index>
+  template <int LoadMode, typename Index>
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TgtPacket packet(Index index) const {
     const int SrcPacketSize = internal::unpacket_traits<SrcPacket>::size;
 
@@ -142,11 +130,10 @@
 
 template <typename TensorEvaluator, typename SrcPacket, typename TgtPacket, int TgtCoeffRatio>
 struct PacketConverter<TensorEvaluator, SrcPacket, TgtPacket, 1, TgtCoeffRatio> {
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  PacketConverter(const TensorEvaluator& impl)
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketConverter(const TensorEvaluator& impl)
       : m_impl(impl), m_maxIndex(impl.dimensions().TotalSize()) {}
 
-  template<int LoadMode, typename Index>
+  template <int LoadMode, typename Index>
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TgtPacket packet(Index index) const {
     const int SrcPacketSize = internal::unpacket_traits<SrcPacket>::size;
     // Only call m_impl.packet() when we have direct access to the underlying data. This
@@ -163,7 +150,7 @@
       EIGEN_ALIGN_MAX typename internal::unpacket_traits<TgtPacket>::type values[TgtPacketSize];
       EIGEN_UNROLL_LOOP
       for (int i = 0; i < TgtPacketSize; ++i) {
-        values[i] = converter(m_impl.coeff(index+i));
+        values[i] = converter(m_impl.coeff(index + i));
       }
       TgtPacket rslt = internal::pload<TgtPacket>(values);
       return rslt;
@@ -175,54 +162,47 @@
   const typename TensorEvaluator::Index m_maxIndex;
 };
 
-template<typename TargetType, typename XprType>
-class TensorConversionOp : public TensorBase<TensorConversionOp<TargetType, XprType>, ReadOnlyAccessors>
-{
-  public:
-    typedef typename internal::traits<TensorConversionOp>::Scalar Scalar;
-    typedef typename internal::traits<TensorConversionOp>::StorageKind StorageKind;
-    typedef typename internal::traits<TensorConversionOp>::Index Index;
-    typedef typename internal::nested<TensorConversionOp>::type Nested;
-    typedef Scalar CoeffReturnType;
-    typedef typename NumTraits<Scalar>::Real RealScalar;
+template <typename TargetType, typename XprType>
+class TensorConversionOp : public TensorBase<TensorConversionOp<TargetType, XprType>, ReadOnlyAccessors> {
+ public:
+  typedef typename internal::traits<TensorConversionOp>::Scalar Scalar;
+  typedef typename internal::traits<TensorConversionOp>::StorageKind StorageKind;
+  typedef typename internal::traits<TensorConversionOp>::Index Index;
+  typedef typename internal::nested<TensorConversionOp>::type Nested;
+  typedef Scalar CoeffReturnType;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorConversionOp(const XprType& xpr)
-        : m_xpr(xpr) {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorConversionOp(const XprType& xpr) : m_xpr(xpr) {}
 
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<typename XprType::Nested>&
-    expression() const { return m_xpr; }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename XprType::Nested>& expression() const { return m_xpr; }
 
-  protected:
-    typename XprType::Nested m_xpr;
+ protected:
+  typename XprType::Nested m_xpr;
 };
 
-template <bool SameType, typename Eval, typename EvalPointerType> struct ConversionSubExprEval {
+template <bool SameType, typename Eval, typename EvalPointerType>
+struct ConversionSubExprEval {
   static EIGEN_STRONG_INLINE bool run(Eval& impl, EvalPointerType) {
     impl.evalSubExprsIfNeeded(NULL);
     return true;
   }
 };
 
-template <typename Eval, typename EvalPointerType> struct ConversionSubExprEval<true, Eval, EvalPointerType> {
-  static EIGEN_STRONG_INLINE bool run(Eval& impl, EvalPointerType data) {
-    return impl.evalSubExprsIfNeeded(data);
-  }
+template <typename Eval, typename EvalPointerType>
+struct ConversionSubExprEval<true, Eval, EvalPointerType> {
+  static EIGEN_STRONG_INLINE bool run(Eval& impl, EvalPointerType data) { return impl.evalSubExprsIfNeeded(data); }
 };
 
 #ifdef EIGEN_USE_THREADS
-template <bool SameType, typename Eval, typename EvalPointerType,
-          typename EvalSubExprsCallback>
+template <bool SameType, typename Eval, typename EvalPointerType, typename EvalSubExprsCallback>
 struct ConversionSubExprEvalAsync {
   static EIGEN_STRONG_INLINE void run(Eval& impl, EvalPointerType, EvalSubExprsCallback done) {
     impl.evalSubExprsIfNeededAsync(nullptr, std::move(done));
   }
 };
 
-template <typename Eval, typename EvalPointerType,
-          typename EvalSubExprsCallback>
-struct ConversionSubExprEvalAsync<true, Eval, EvalPointerType,
-                                  EvalSubExprsCallback> {
+template <typename Eval, typename EvalPointerType, typename EvalSubExprsCallback>
+struct ConversionSubExprEvalAsync<true, Eval, EvalPointerType, EvalSubExprsCallback> {
   static EIGEN_STRONG_INLINE void run(Eval& impl, EvalPointerType data, EvalSubExprsCallback done) {
     impl.evalSubExprsIfNeededAsync(data, std::move(done));
   }
@@ -234,7 +214,8 @@
 template <typename SrcType, typename TargetType, bool IsSameT>
 struct CoeffConv {
   template <typename ArgType, typename Device>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TargetType run(const TensorEvaluator<ArgType, Device>& impl, Index index) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TargetType run(const TensorEvaluator<ArgType, Device>& impl,
+                                                              Index index) {
     internal::scalar_cast_op<SrcType, TargetType> converter;
     return converter(impl.coeff(index));
   }
@@ -243,7 +224,8 @@
 template <typename SrcType, typename TargetType>
 struct CoeffConv<SrcType, TargetType, true> {
   template <typename ArgType, typename Device>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TargetType run(const TensorEvaluator<ArgType, Device>& impl, Index index) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TargetType run(const TensorEvaluator<ArgType, Device>& impl,
+                                                              Index index) {
     return impl.coeff(index);
   }
 };
@@ -256,12 +238,13 @@
   static constexpr int PacketSize = internal::unpacket_traits<TargetPacket>::size;
 
   template <typename ArgType, typename Device>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TargetPacket run(const TensorEvaluator<ArgType, Device>& impl, Index index) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TargetPacket run(const TensorEvaluator<ArgType, Device>& impl,
+                                                                Index index) {
     internal::scalar_cast_op<SrcType, TargetType> converter;
     EIGEN_ALIGN_MAX std::remove_const_t<TargetType> values[PacketSize];
     EIGEN_UNROLL_LOOP
     for (int i = 0; i < PacketSize; ++i) {
-      values[i] = converter(impl.coeff(index+i));
+      values[i] = converter(impl.coeff(index + i));
     }
     TargetPacket rslt = internal::pload<TargetPacket>(values);
     return rslt;
@@ -274,11 +257,12 @@
   typedef typename internal::unpacket_traits<TargetPacket>::type TargetType;
 
   template <typename ArgType, typename Device>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TargetPacket run(const TensorEvaluator<ArgType, Device>& impl, Index index) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TargetPacket run(const TensorEvaluator<ArgType, Device>& impl,
+                                                                Index index) {
     const int SrcCoeffRatio = internal::type_casting_traits<SrcType, TargetType>::SrcCoeffRatio;
     const int TgtCoeffRatio = internal::type_casting_traits<SrcType, TargetType>::TgtCoeffRatio;
-    PacketConverter<TensorEvaluator<ArgType, Device>, SrcPacket, TargetPacket,
-                    SrcCoeffRatio, TgtCoeffRatio> converter(impl);
+    PacketConverter<TensorEvaluator<ArgType, Device>, SrcPacket, TargetPacket, SrcCoeffRatio, TgtCoeffRatio> converter(
+        impl);
     return converter.template packet<LoadMode>(index);
   }
 };
@@ -289,9 +273,10 @@
   static constexpr int PacketSize = internal::unpacket_traits<TargetPacket>::size;
 
   template <typename ArgType, typename Device>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TargetPacket run(const TensorEvaluator<ArgType, Device>& impl, Index index) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TargetPacket run(const TensorEvaluator<ArgType, Device>& impl,
+                                                                Index index) {
     EIGEN_ALIGN_MAX std::remove_const_t<TargetType> values[PacketSize];
-    for (int i = 0; i < PacketSize; ++i) values[i] = impl.coeff(index+i);
+    for (int i = 0; i < PacketSize; ++i) values[i] = impl.coeff(index + i);
     return internal::pload<TargetPacket>(values);
   }
 };
@@ -299,7 +284,8 @@
 template <typename SrcPacket, typename TargetPacket, int LoadMode>
 struct PacketConv<SrcPacket, TargetPacket, LoadMode, /*ActuallyVectorize=*/true, /*IsSameT=*/true> {
   template <typename ArgType, typename Device>
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TargetPacket run(const TensorEvaluator<ArgType, Device>& impl, Index index) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TargetPacket run(const TensorEvaluator<ArgType, Device>& impl,
+                                                                Index index) {
     return impl.template packet<LoadMode>(index);
   }
 };
@@ -307,9 +293,8 @@
 }  // namespace internal
 
 // Eval as rvalue
-template<typename TargetType, typename ArgType, typename Device>
-struct TensorEvaluator<const TensorConversionOp<TargetType, ArgType>, Device>
-{
+template <typename TargetType, typename ArgType, typename Device>
+struct TensorEvaluator<const TensorConversionOp<TargetType, ArgType>, Device> {
   typedef TensorConversionOp<TargetType, ArgType> XprType;
   typedef typename XprType::Index Index;
   typedef typename TensorEvaluator<ArgType, Device>::Dimensions Dimensions;
@@ -324,17 +309,17 @@
   typedef typename Storage::Type EvaluatorPointerType;
 
   enum {
-    IsAligned         = false,
-    PacketAccess      =
-    #ifndef EIGEN_USE_SYCL
-                        true,
-    #else
-                        TensorEvaluator<ArgType, Device>::PacketAccess &
-                        internal::type_casting_traits<SrcType, TargetType>::VectorizedCast,
-    #endif
-    BlockAccess       = TensorEvaluator<ArgType, Device>::BlockAccess,
+    IsAligned = false,
+    PacketAccess =
+#ifndef EIGEN_USE_SYCL
+        true,
+#else
+        TensorEvaluator<ArgType, Device>::PacketAccess &
+        internal::type_casting_traits<SrcType, TargetType>::VectorizedCast,
+#endif
+    BlockAccess = TensorEvaluator<ArgType, Device>::BlockAccess,
     PreferBlockAccess = TensorEvaluator<ArgType, Device>::PreferBlockAccess,
-    RawAccess         = false
+    RawAccess = false
   };
 
   static constexpr int Layout = TensorEvaluator<ArgType, Device>::Layout;
@@ -344,8 +329,7 @@
   typedef internal::TensorBlockDescriptor<NumDims, Index> TensorBlockDesc;
   typedef internal::TensorBlockScratchAllocator<Device> TensorBlockScratch;
 
-  typedef typename TensorEvaluator<const ArgType, Device>::TensorBlock
-      ArgTensorBlock;
+  typedef typename TensorEvaluator<const ArgType, Device>::TensorBlock ArgTensorBlock;
 
   struct TensorConversionOpBlockFactory {
     template <typename ArgXprType>
@@ -359,84 +343,63 @@
     }
   };
 
-  typedef internal::TensorUnaryExprBlock<TensorConversionOpBlockFactory,
-                                         ArgTensorBlock>
-      TensorBlock;
+  typedef internal::TensorUnaryExprBlock<TensorConversionOpBlockFactory, ArgTensorBlock> TensorBlock;
   //===--------------------------------------------------------------------===//
 
-  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
-    : m_impl(op.expression(), device)
-  {
-  }
+  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) : m_impl(op.expression(), device) {}
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_impl.dimensions(); }
 
-  EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType data)
-  {
+  EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType data) {
     return ConversionSubExprEval<IsSameType, TensorEvaluator<ArgType, Device>, EvaluatorPointerType>::run(m_impl, data);
   }
 
 #ifdef EIGEN_USE_THREADS
   template <typename EvalSubExprsCallback>
-  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(
-      EvaluatorPointerType data, EvalSubExprsCallback done) {
-    ConversionSubExprEvalAsync<IsSameType, TensorEvaluator<ArgType, Device>,
-                               EvaluatorPointerType,
-        EvalSubExprsCallback>::run(m_impl, data, std::move(done));
+  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(EvaluatorPointerType data, EvalSubExprsCallback done) {
+    ConversionSubExprEvalAsync<IsSameType, TensorEvaluator<ArgType, Device>, EvaluatorPointerType,
+                               EvalSubExprsCallback>::run(m_impl, data, std::move(done));
   }
 #endif
 
-  EIGEN_STRONG_INLINE void cleanup()
-  {
-    m_impl.cleanup();
+  EIGEN_STRONG_INLINE void cleanup() { m_impl.cleanup(); }
+
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
+    return internal::CoeffConv<SrcType, TargetType, IsSameType>::run(m_impl, index);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
-  {
-    return internal::CoeffConv<SrcType, TargetType, IsSameType>::run(m_impl,index);
-  }
-
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType
-  packet(Index index) const {
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const {
     // If we are not going to do the cast, we just need to check that base
     // TensorEvaluator has packet access. Otherwise we also need to make sure,
     // that we have an implementation of vectorized cast.
-    const bool Vectorizable =
-        IsSameType
-        ? TensorEvaluator<ArgType, Device>::PacketAccess
-        : int(TensorEvaluator<ArgType, Device>::PacketAccess) &
-          int(internal::type_casting_traits<SrcType, TargetType>::VectorizedCast);
+    const bool Vectorizable = IsSameType ? TensorEvaluator<ArgType, Device>::PacketAccess
+                                         : int(TensorEvaluator<ArgType, Device>::PacketAccess) &
+                                               int(internal::type_casting_traits<SrcType, TargetType>::VectorizedCast);
 
-    return internal::PacketConv<PacketSourceType, PacketReturnType, LoadMode,
-                                Vectorizable, IsSameType>::run(m_impl, index);
+    return internal::PacketConv<PacketSourceType, PacketReturnType, LoadMode, Vectorizable, IsSameType>::run(m_impl,
+                                                                                                             index);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost
-  costPerCoeff(bool vectorized) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const {
     const double cast_cost = TensorOpCost::CastCost<SrcType, TargetType>();
     if (vectorized) {
-      const double SrcCoeffRatio =
-          internal::type_casting_traits<SrcType, TargetType>::SrcCoeffRatio;
-      const double TgtCoeffRatio =
-          internal::type_casting_traits<SrcType, TargetType>::TgtCoeffRatio;
+      const double SrcCoeffRatio = internal::type_casting_traits<SrcType, TargetType>::SrcCoeffRatio;
+      const double TgtCoeffRatio = internal::type_casting_traits<SrcType, TargetType>::TgtCoeffRatio;
       return m_impl.costPerCoeff(vectorized) * (SrcCoeffRatio / PacketSize) +
-          TensorOpCost(0, 0, TgtCoeffRatio * (cast_cost / PacketSize));
+             TensorOpCost(0, 0, TgtCoeffRatio * (cast_cost / PacketSize));
     } else {
       return m_impl.costPerCoeff(vectorized) + TensorOpCost(0, 0, cast_cost);
     }
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  internal::TensorBlockResourceRequirements getResourceRequirements() const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE internal::TensorBlockResourceRequirements getResourceRequirements() const {
     return m_impl.getResourceRequirements();
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock
-  block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
-          bool /*root_of_expr_ast*/ = false) const {
-    return TensorBlock(m_impl.block(desc, scratch),
-                         TensorConversionOpBlockFactory());
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
+                                                          bool /*root_of_expr_ast*/ = false) const {
+    return TensorBlock(m_impl.block(desc, scratch), TensorConversionOpBlockFactory());
   }
 
   EIGEN_DEVICE_FUNC EvaluatorPointerType data() const { return NULL; }
@@ -448,6 +411,6 @@
   TensorEvaluator<ArgType, Device> m_impl;
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_CXX11_TENSOR_TENSOR_CONVERSION_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_CONVERSION_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorConvolution.h b/unsupported/Eigen/CXX11/src/Tensor/TensorConvolution.h
index 15a267e..0493fe9 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorConvolution.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorConvolution.h
@@ -16,12 +16,12 @@
 namespace Eigen {
 
 /** \class TensorConvolution
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Tensor convolution class.
-  *
-  *
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Tensor convolution class.
+ *
+ *
+ */
 namespace internal {
 
 template <typename Index, typename InputDims, int NumKernelDims, int Layout>
@@ -29,7 +29,6 @@
  public:
   IndexMapper(const InputDims& input_dims, const array<Index, NumKernelDims>& kernel_dims,
               const array<Index, NumKernelDims>& indices) {
-
     array<Index, NumDims> dimensions = input_dims;
     for (int i = 0; i < NumKernelDims; ++i) {
       const Index index = indices[i];
@@ -45,8 +44,8 @@
       inputStrides[0] = 1;
       outputStrides[0] = 1;
       for (int i = 1; i < NumDims; ++i) {
-        inputStrides[i] = inputStrides[i-1] * input_dims[i-1];
-        outputStrides[i] = outputStrides[i-1] * dimensions[i-1];
+        inputStrides[i] = inputStrides[i - 1] * input_dims[i - 1];
+        outputStrides[i] = outputStrides[i - 1] * dimensions[i - 1];
       }
     } else {
       inputStrides[NumDims - 1] = 1;
@@ -61,9 +60,7 @@
     array<Index, NumDims> gpuOutputDimensions;
     array<Index, NumDims> tmp = dimensions;
     array<Index, NumDims> ordering;
-    const size_t offset = static_cast<int>(Layout) == static_cast<int>(ColMajor)
-                              ? 0
-                              : NumDims - NumKernelDims;
+    const size_t offset = static_cast<int>(Layout) == static_cast<int>(ColMajor) ? 0 : NumDims - NumKernelDims;
     for (int i = 0; i < NumKernelDims; ++i) {
       const Index index = i + offset;
       ordering[index] = indices[i];
@@ -72,9 +69,7 @@
       gpuOutputDimensions[index] = dimensions[indices[i]];
     }
 
-    int written = static_cast<int>(Layout) == static_cast<int>(ColMajor)
-                      ? NumKernelDims
-                      : 0;
+    int written = static_cast<int>(Layout) == static_cast<int>(ColMajor) ? NumKernelDims : 0;
     for (int i = 0; i < NumDims; ++i) {
       if (tmp[i] >= 0) {
         ordering[written] = i;
@@ -92,10 +87,8 @@
     if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
       for (int i = 0; i < NumDims; ++i) {
         if (i > NumKernelDims) {
-          m_gpuInputStrides[i] =
-              m_gpuInputStrides[i - 1] * gpuInputDimensions[i - 1];
-          m_gpuOutputStrides[i] =
-              m_gpuOutputStrides[i - 1] * gpuOutputDimensions[i - 1];
+          m_gpuInputStrides[i] = m_gpuInputStrides[i - 1] * gpuInputDimensions[i - 1];
+          m_gpuOutputStrides[i] = m_gpuOutputStrides[i - 1] * gpuOutputDimensions[i - 1];
         } else {
           m_gpuInputStrides[i] = 1;
           m_gpuOutputStrides[i] = 1;
@@ -104,10 +97,8 @@
     } else {
       for (int i = NumDims - 1; i >= 0; --i) {
         if (static_cast<size_t>(i + 1) < offset) {
-          m_gpuInputStrides[i] =
-              m_gpuInputStrides[i + 1] * gpuInputDimensions[i + 1];
-          m_gpuOutputStrides[i] =
-              m_gpuOutputStrides[i + 1] * gpuOutputDimensions[i + 1];
+          m_gpuInputStrides[i] = m_gpuInputStrides[i + 1] * gpuInputDimensions[i + 1];
+          m_gpuOutputStrides[i] = m_gpuOutputStrides[i + 1] * gpuOutputDimensions[i + 1];
         } else {
           m_gpuInputStrides[i] = 1;
           m_gpuOutputStrides[i] = 1;
@@ -169,47 +160,33 @@
   }
 
   EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Index mapGpuInputKernelToTensorInputOffset(Index i) const {
-    const size_t offset = static_cast<int>(Layout) == static_cast<int>(ColMajor)
-                              ? 0
-                              : NumDims - NumKernelDims;
+    const size_t offset = static_cast<int>(Layout) == static_cast<int>(ColMajor) ? 0 : NumDims - NumKernelDims;
     return i * m_inputStrides[offset];
   }
 
   EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Index mapGpuOutputKernelToTensorOutputOffset(Index i) const {
-    const size_t offset = static_cast<int>(Layout) == static_cast<int>(ColMajor)
-                              ? 0
-                              : NumDims - NumKernelDims;
+    const size_t offset = static_cast<int>(Layout) == static_cast<int>(ColMajor) ? 0 : NumDims - NumKernelDims;
     return i * m_outputStrides[offset];
   }
 
   EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Index mapGpuInputKernelToTensorInputOffset(Index i, Index j) const {
-    const size_t offset = static_cast<int>(Layout) == static_cast<int>(ColMajor)
-                              ? 0
-                              : NumDims - NumKernelDims;
+    const size_t offset = static_cast<int>(Layout) == static_cast<int>(ColMajor) ? 0 : NumDims - NumKernelDims;
     return i * m_inputStrides[offset] + j * m_inputStrides[offset + 1];
   }
 
   EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Index mapGpuOutputKernelToTensorOutputOffset(Index i, Index j) const {
-    const size_t offset = static_cast<int>(Layout) == static_cast<int>(ColMajor)
-                              ? 0
-                              : NumDims - NumKernelDims;
+    const size_t offset = static_cast<int>(Layout) == static_cast<int>(ColMajor) ? 0 : NumDims - NumKernelDims;
     return i * m_outputStrides[offset] + j * m_outputStrides[offset + 1];
   }
 
   EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Index mapGpuInputKernelToTensorInputOffset(Index i, Index j, Index k) const {
-    const size_t offset = static_cast<int>(Layout) == static_cast<int>(ColMajor)
-                              ? 0
-                              : NumDims - NumKernelDims;
-    return i * m_inputStrides[offset] + j * m_inputStrides[offset + 1] +
-           k * m_inputStrides[offset + 2];
+    const size_t offset = static_cast<int>(Layout) == static_cast<int>(ColMajor) ? 0 : NumDims - NumKernelDims;
+    return i * m_inputStrides[offset] + j * m_inputStrides[offset + 1] + k * m_inputStrides[offset + 2];
   }
 
   EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Index mapGpuOutputKernelToTensorOutputOffset(Index i, Index j, Index k) const {
-    const size_t offset = static_cast<int>(Layout) == static_cast<int>(ColMajor)
-                              ? 0
-                              : NumDims - NumKernelDims;
-    return i * m_outputStrides[offset] + j * m_outputStrides[offset + 1] +
-           k * m_outputStrides[offset + 2];
+    const size_t offset = static_cast<int>(Layout) == static_cast<int>(ColMajor) ? 0 : NumDims - NumKernelDims;
+    return i * m_outputStrides[offset] + j * m_outputStrides[offset + 1] + k * m_outputStrides[offset + 2];
   }
 
  private:
@@ -220,18 +197,14 @@
   array<Index, NumDims> m_gpuOutputStrides;
 };
 
-
-
-template<typename Dimensions, typename InputXprType, typename KernelXprType>
-struct traits<TensorConvolutionOp<Dimensions, InputXprType, KernelXprType> >
-{
+template <typename Dimensions, typename InputXprType, typename KernelXprType>
+struct traits<TensorConvolutionOp<Dimensions, InputXprType, KernelXprType> > {
   // Type promotion to handle the case where the types of the lhs and the rhs are different.
-  typedef typename promote_storage_type<typename InputXprType::Scalar,
-                                        typename KernelXprType::Scalar>::ret Scalar;
+  typedef typename promote_storage_type<typename InputXprType::Scalar, typename KernelXprType::Scalar>::ret Scalar;
   typedef typename promote_storage_type<typename traits<InputXprType>::StorageKind,
                                         typename traits<KernelXprType>::StorageKind>::ret StorageKind;
-  typedef typename promote_index_type<typename traits<InputXprType>::Index,
-                                      typename traits<KernelXprType>::Index>::type Index;
+  typedef typename promote_index_type<typename traits<InputXprType>::Index, typename traits<KernelXprType>::Index>::type
+      Index;
   typedef typename InputXprType::Nested LhsNested;
   typedef typename KernelXprType::Nested RhsNested;
   typedef std::remove_reference_t<LhsNested> LhsNested_;
@@ -239,33 +212,29 @@
   static constexpr int NumDimensions = traits<InputXprType>::NumDimensions;
   static constexpr int Layout = traits<InputXprType>::Layout;
   typedef std::conditional_t<Pointer_type_promotion<typename InputXprType::Scalar, Scalar>::val,
-  typename traits<InputXprType>::PointerType, typename traits<KernelXprType>::PointerType> PointerType;
+                             typename traits<InputXprType>::PointerType, typename traits<KernelXprType>::PointerType>
+      PointerType;
 
-  enum {
-    Flags = 0
-  };
+  enum { Flags = 0 };
 };
 
-template<typename Dimensions, typename InputXprType, typename KernelXprType>
-struct eval<TensorConvolutionOp<Dimensions, InputXprType, KernelXprType>, Eigen::Dense>
-{
+template <typename Dimensions, typename InputXprType, typename KernelXprType>
+struct eval<TensorConvolutionOp<Dimensions, InputXprType, KernelXprType>, Eigen::Dense> {
   typedef const TensorConvolutionOp<Dimensions, InputXprType, KernelXprType>& type;
 };
 
-template<typename Dimensions, typename InputXprType, typename KernelXprType>
-struct nested<TensorConvolutionOp<Dimensions, InputXprType, KernelXprType>, 1, typename eval<TensorConvolutionOp<Dimensions, InputXprType, KernelXprType> >::type>
-{
+template <typename Dimensions, typename InputXprType, typename KernelXprType>
+struct nested<TensorConvolutionOp<Dimensions, InputXprType, KernelXprType>, 1,
+              typename eval<TensorConvolutionOp<Dimensions, InputXprType, KernelXprType> >::type> {
   typedef TensorConvolutionOp<Dimensions, InputXprType, KernelXprType> type;
 };
 
 }  // end namespace internal
 
-
-
-template<typename Indices, typename InputXprType, typename KernelXprType>
-class TensorConvolutionOp : public TensorBase<TensorConvolutionOp<Indices, InputXprType, KernelXprType>, ReadOnlyAccessors>
-{
-  public:
+template <typename Indices, typename InputXprType, typename KernelXprType>
+class TensorConvolutionOp
+    : public TensorBase<TensorConvolutionOp<Indices, InputXprType, KernelXprType>, ReadOnlyAccessors> {
+ public:
   typedef typename Eigen::internal::traits<TensorConvolutionOp>::Scalar Scalar;
   typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
   typedef typename internal::promote_storage_type<typename InputXprType::CoeffReturnType,
@@ -274,34 +243,35 @@
   typedef typename Eigen::internal::traits<TensorConvolutionOp>::StorageKind StorageKind;
   typedef typename Eigen::internal::traits<TensorConvolutionOp>::Index Index;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorConvolutionOp(const InputXprType& input, const KernelXprType& kernel, const Indices& dims)
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorConvolutionOp(const InputXprType& input, const KernelXprType& kernel,
+                                                            const Indices& dims)
       : m_input_xpr(input), m_kernel_xpr(kernel), m_indices(dims) {}
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    const Indices& indices() const { return m_indices; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Indices& indices() const { return m_indices; }
 
-    /** \returns the nested expressions */
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    const internal::remove_all_t<typename InputXprType::Nested>&
-    inputExpression() const { return m_input_xpr; }
+  /** \returns the nested expressions */
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const internal::remove_all_t<typename InputXprType::Nested>& inputExpression()
+      const {
+    return m_input_xpr;
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    const internal::remove_all_t<typename KernelXprType::Nested>&
-    kernelExpression() const { return m_kernel_xpr; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const internal::remove_all_t<typename KernelXprType::Nested>& kernelExpression()
+      const {
+    return m_kernel_xpr;
+  }
 
-  protected:
-    typename InputXprType::Nested m_input_xpr;
-    typename KernelXprType::Nested m_kernel_xpr;
-    const Indices m_indices;
+ protected:
+  typename InputXprType::Nested m_input_xpr;
+  typename KernelXprType::Nested m_kernel_xpr;
+  const Indices m_indices;
 };
 
-
-template<typename Indices, typename InputArgType, typename KernelArgType, typename Device>
-struct TensorEvaluator<const TensorConvolutionOp<Indices, InputArgType, KernelArgType>, Device>
-{
+template <typename Indices, typename InputArgType, typename KernelArgType, typename Device>
+struct TensorEvaluator<const TensorConvolutionOp<Indices, InputArgType, KernelArgType>, Device> {
   typedef TensorConvolutionOp<Indices, InputArgType, KernelArgType> XprType;
 
-  static constexpr int NumDims = internal::array_size<typename TensorEvaluator<InputArgType, Device>::Dimensions>::value;
+  static constexpr int NumDims =
+      internal::array_size<typename TensorEvaluator<InputArgType, Device>::Dimensions>::value;
   static constexpr int NumKernelDims = internal::array_size<Indices>::value;
   typedef typename XprType::Index Index;
   typedef DSizes<Index, NumDims> Dimensions;
@@ -315,8 +285,10 @@
 
   static constexpr int Layout = TensorEvaluator<InputArgType, Device>::Layout;
   enum {
-    IsAligned = int(TensorEvaluator<InputArgType, Device>::IsAligned) & int(TensorEvaluator<KernelArgType, Device>::IsAligned),
-    PacketAccess = int(TensorEvaluator<InputArgType, Device>::PacketAccess) & int(TensorEvaluator<KernelArgType, Device>::PacketAccess),
+    IsAligned =
+        int(TensorEvaluator<InputArgType, Device>::IsAligned) & int(TensorEvaluator<KernelArgType, Device>::IsAligned),
+    PacketAccess = int(TensorEvaluator<InputArgType, Device>::PacketAccess) &
+                   int(TensorEvaluator<KernelArgType, Device>::PacketAccess),
     BlockAccess = false,
     PreferBlockAccess = false,
     CoordAccess = false,  // to be implemented
@@ -328,9 +300,15 @@
   //===--------------------------------------------------------------------===//
 
   EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
-      : m_inputImpl(op.inputExpression(), device), m_kernelImpl(op.kernelExpression(), device), m_kernelArg(op.kernelExpression()), m_kernel(NULL), m_local_kernel(false), m_device(device)
-  {
-    EIGEN_STATIC_ASSERT((static_cast<int>(TensorEvaluator<InputArgType, Device>::Layout) == static_cast<int>(TensorEvaluator<KernelArgType, Device>::Layout)), YOU_MADE_A_PROGRAMMING_MISTAKE);
+      : m_inputImpl(op.inputExpression(), device),
+        m_kernelImpl(op.kernelExpression(), device),
+        m_kernelArg(op.kernelExpression()),
+        m_kernel(NULL),
+        m_local_kernel(false),
+        m_device(device) {
+    EIGEN_STATIC_ASSERT((static_cast<int>(TensorEvaluator<InputArgType, Device>::Layout) ==
+                         static_cast<int>(TensorEvaluator<KernelArgType, Device>::Layout)),
+                        YOU_MADE_A_PROGRAMMING_MISTAKE);
 
     const typename TensorEvaluator<InputArgType, Device>::Dimensions& input_dims = m_inputImpl.dimensions();
     const typename TensorEvaluator<KernelArgType, Device>::Dimensions& kernel_dims = m_kernelImpl.dimensions();
@@ -413,17 +391,15 @@
     cleanup();
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
     CoeffReturnType result = CoeffReturnType(0);
-    convolve(firstInput(index), 0, NumKernelDims-1, result);
+    convolve(firstInput(index), 0, NumKernelDims - 1, result);
     return result;
   }
 
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC PacketReturnType packet(const Index index) const
-  {
-    Index indices[2] = {index, index+PacketSize-1};
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC PacketReturnType packet(const Index index) const {
+    Index indices[2] = {index, index + PacketSize - 1};
     Index startInputs[2] = {0, 0};
     if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
       for (int i = NumDims - 1; i > 0; --i) {
@@ -447,39 +423,34 @@
     startInputs[0] += indices[0];
     startInputs[1] += indices[1];
 
-    if (startInputs[1]-startInputs[0] == PacketSize-1) {
+    if (startInputs[1] - startInputs[0] == PacketSize - 1) {
       PacketReturnType result = internal::pset1<PacketReturnType>(0);
-      convolvePacket(startInputs[0], 0, NumKernelDims-1, result);
+      convolvePacket(startInputs[0], 0, NumKernelDims - 1, result);
       return result;
     } else {
       EIGEN_ALIGN_MAX Scalar data[PacketSize];
       data[0] = Scalar(0);
-      convolve(startInputs[0], 0, NumKernelDims-1, data[0]);
-      for (int i = 1; i < PacketSize-1; ++i) {
+      convolve(startInputs[0], 0, NumKernelDims - 1, data[0]);
+      for (int i = 1; i < PacketSize - 1; ++i) {
         data[i] = Scalar(0);
-        convolve(firstInput(index+i), 0, NumKernelDims-1, data[i]);
+        convolve(firstInput(index + i), 0, NumKernelDims - 1, data[i]);
       }
-      data[PacketSize-1] = Scalar(0);
-      convolve(startInputs[1], 0, NumKernelDims-1, data[PacketSize-1]);
+      data[PacketSize - 1] = Scalar(0);
+      convolve(startInputs[1], 0, NumKernelDims - 1, data[PacketSize - 1]);
       return internal::pload<PacketReturnType>(data);
     }
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost
-  costPerCoeff(bool vectorized) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const {
     const double kernel_size = m_kernelImpl.dimensions().TotalSize();
     // We ignore the use of fused multiply-add.
-    const double convolve_compute_cost =
-        TensorOpCost::AddCost<Scalar>() + TensorOpCost::MulCost<Scalar>();
+    const double convolve_compute_cost = TensorOpCost::AddCost<Scalar>() + TensorOpCost::MulCost<Scalar>();
     const double firstIndex_compute_cost =
         NumDims *
-        (2 * TensorOpCost::AddCost<Index>() + 2 * TensorOpCost::MulCost<Index>() +
-         TensorOpCost::DivCost<Index>());
+        (2 * TensorOpCost::AddCost<Index>() + 2 * TensorOpCost::MulCost<Index>() + TensorOpCost::DivCost<Index>());
     return TensorOpCost(0, 0, firstIndex_compute_cost, vectorized, PacketSize) +
-           kernel_size * (m_inputImpl.costPerCoeff(vectorized) +
-                          m_kernelImpl.costPerCoeff(vectorized) +
-                          TensorOpCost(0, 0, convolve_compute_cost, vectorized,
-                                       PacketSize));
+           kernel_size * (m_inputImpl.costPerCoeff(vectorized) + m_kernelImpl.costPerCoeff(vectorized) +
+                          TensorOpCost(0, 0, convolve_compute_cost, vectorized, PacketSize));
   }
 
   EIGEN_DEVICE_FUNC EvaluatorPointerType data() const { return NULL; }
@@ -509,7 +480,7 @@
       const Index input = firstIndex + j * m_indexStride[DimIndex];
       const Index kernel = firstKernel + j * m_kernelStride[DimIndex];
       if (DimIndex > 0) {
-        convolve(input, kernel, DimIndex-1, accum);
+        convolve(input, kernel, DimIndex - 1, accum);
       } else {
         accum += m_inputImpl.coeff(input) * m_kernel[kernel];
       }
@@ -522,9 +493,10 @@
       const Index input = firstIndex + j * m_indexStride[DimIndex];
       const Index kernel = firstKernel + j * m_kernelStride[DimIndex];
       if (DimIndex > 0) {
-        convolvePacket(input, kernel, DimIndex-1, accum);
+        convolvePacket(input, kernel, DimIndex - 1, accum);
       } else {
-        accum = internal::pmadd<Packet>(m_inputImpl.template packet<Unaligned>(input), internal::pset1<Packet>(m_kernel[kernel]), accum);
+        accum = internal::pmadd<Packet>(m_inputImpl.template packet<Unaligned>(input),
+                                        internal::pset1<Packet>(m_kernel[kernel]), accum);
       }
     }
   }
@@ -564,33 +536,23 @@
   const Device EIGEN_DEVICE_REF m_device;
 };
 
-
-
-
 // Use an optimized implementation of the evaluation code for GPUs whenever possible.
 #if defined(EIGEN_USE_GPU) && defined(EIGEN_GPUCC)
 
 template <int StaticKernelSize>
 struct GetKernelSize {
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE int operator() (const int /*kernelSize*/) const {
-    return StaticKernelSize;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE int operator()(const int /*kernelSize*/) const { return StaticKernelSize; }
 };
 template <>
 struct GetKernelSize<Dynamic> {
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE int operator() (const int kernelSize) const {
-    return kernelSize;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE int operator()(const int kernelSize) const { return kernelSize; }
 };
 
-template <typename InputEvaluator, typename Index, typename InputDims,
-          int StaticKernelSize>
+template <typename InputEvaluator, typename Index, typename InputDims, int StaticKernelSize>
 __global__ EIGEN_HIP_LAUNCH_BOUNDS_1024 void EigenConvolutionKernel1D(
-    InputEvaluator eval,
-    const internal::IndexMapper<Index, InputDims, 1, InputEvaluator::Layout>
-        indexMapper,
-    const float* __restrict kernel, const int numPlanes, const int numX,
-    const int maxX, const int kernelSize, float* buffer) {
+    InputEvaluator eval, const internal::IndexMapper<Index, InputDims, 1, InputEvaluator::Layout> indexMapper,
+    const float* __restrict kernel, const int numPlanes, const int numX, const int maxX, const int kernelSize,
+    float* buffer) {
 #if defined(EIGEN_HIPCC)
   HIP_DYNAMIC_SHARED(float, s)
 #else
@@ -609,9 +571,9 @@
     // Load inputs to shared memory
     const int plane_input_offset = indexMapper.mapGpuInputPlaneToTensorInputOffset(p);
     const int plane_kernel_offset = threadIdx.y * num_x_input;
-    #pragma unroll
+#pragma unroll
     for (int i = threadIdx.x; i < num_x_input; i += blockDim.x) {
-      const int tensor_index = plane_input_offset + indexMapper.mapGpuInputKernelToTensorInputOffset(i+first_x);
+      const int tensor_index = plane_input_offset + indexMapper.mapGpuInputKernelToTensorInputOffset(i + first_x);
       s[i + plane_kernel_offset] = eval.coeff(tensor_index);
     }
 
@@ -620,30 +582,26 @@
     // Compute the convolution
     const int plane_output_offset = indexMapper.mapGpuOutputPlaneToTensorOutputOffset(p);
 
-    #pragma unroll
+#pragma unroll
     for (int i = threadIdx.x; i < num_x_output; i += blockDim.x) {
       const int kernel_offset = plane_kernel_offset + i;
       float result = 0.0f;
-      #pragma unroll
+#pragma unroll
       for (int k = 0; k < GetKernelSize<StaticKernelSize>()(kernelSize); ++k) {
         result += s[k + kernel_offset] * kernel[k];
       }
-      const int tensor_index = plane_output_offset + indexMapper.mapGpuOutputKernelToTensorOutputOffset(i+first_x);
+      const int tensor_index = plane_output_offset + indexMapper.mapGpuOutputKernelToTensorOutputOffset(i + first_x);
       buffer[tensor_index] = result;
     }
     __syncthreads();
   }
 };
 
-template <typename InputEvaluator, typename Index, typename InputDims,
-          int StaticKernelSizeX, int StaticKernelSizeY>
+template <typename InputEvaluator, typename Index, typename InputDims, int StaticKernelSizeX, int StaticKernelSizeY>
 __global__ EIGEN_HIP_LAUNCH_BOUNDS_1024 void EigenConvolutionKernel2D(
-    InputEvaluator eval,
-    const internal::IndexMapper<Index, InputDims, 2, InputEvaluator::Layout>
-        indexMapper,
-    const float* __restrict kernel, const int numPlanes, const int numX,
-    const int maxX, const int numY, const int maxY, const int kernelSizeX,
-    const int kernelSizeY, float* buffer) {
+    InputEvaluator eval, const internal::IndexMapper<Index, InputDims, 2, InputEvaluator::Layout> indexMapper,
+    const float* __restrict kernel, const int numPlanes, const int numX, const int maxX, const int numY, const int maxY,
+    const int kernelSizeX, const int kernelSizeY, float* buffer) {
 #if defined(EIGEN_HIPCC)
   HIP_DYNAMIC_SHARED(float, s)
 #else
@@ -664,17 +622,17 @@
   const int plane_stride = blockDim.z * gridDim.z;
 
   for (int p = first_plane + threadIdx.z; p < numPlanes; p += plane_stride) {
-
     const int plane_input_offset = indexMapper.mapGpuInputPlaneToTensorInputOffset(p);
     const int plane_kernel_offset = threadIdx.z * num_y_input;
 
-    // Load inputs to shared memory
-    #pragma unroll
+// Load inputs to shared memory
+#pragma unroll
     for (int j = threadIdx.y; j < num_y_input; j += blockDim.y) {
       const int input_offset = num_x_input * (j + plane_kernel_offset);
-      #pragma unroll
+#pragma unroll
       for (int i = threadIdx.x; i < num_x_input; i += blockDim.x) {
-        const int tensor_index = plane_input_offset + indexMapper.mapGpuInputKernelToTensorInputOffset(i+first_x, j+first_y);
+        const int tensor_index =
+            plane_input_offset + indexMapper.mapGpuInputKernelToTensorInputOffset(i + first_x, j + first_y);
         s[i + input_offset] = eval.coeff(tensor_index);
       }
     }
@@ -684,21 +642,22 @@
     // Convolution
     const int plane_output_offset = indexMapper.mapGpuOutputPlaneToTensorOutputOffset(p);
 
-    #pragma unroll
+#pragma unroll
     for (int j = threadIdx.y; j < num_y_output; j += blockDim.y) {
-      #pragma unroll
+#pragma unroll
       for (int i = threadIdx.x; i < num_x_output; i += blockDim.x) {
         float result = 0.0f;
-        #pragma unroll
+#pragma unroll
         for (int l = 0; l < GetKernelSize<StaticKernelSizeY>()(kernelSizeY); ++l) {
           const int kernel_offset = kernelSizeX * l;
           const int input_offset = i + num_x_input * (j + l + plane_kernel_offset);
-          #pragma unroll
+#pragma unroll
           for (int k = 0; k < GetKernelSize<StaticKernelSizeX>()(kernelSizeX); ++k) {
             result += s[k + input_offset] * kernel[k + kernel_offset];
           }
         }
-        const int tensor_index = plane_output_offset + indexMapper.mapGpuOutputKernelToTensorOutputOffset(i+first_x, j+first_y);
+        const int tensor_index =
+            plane_output_offset + indexMapper.mapGpuOutputKernelToTensorOutputOffset(i + first_x, j + first_y);
         buffer[tensor_index] = result;
       }
     }
@@ -709,12 +668,9 @@
 
 template <typename InputEvaluator, typename Index, typename InputDims>
 __global__ EIGEN_HIP_LAUNCH_BOUNDS_1024 void EigenConvolutionKernel3D(
-    InputEvaluator eval,
-    const internal::IndexMapper<Index, InputDims, 3, InputEvaluator::Layout>
-        indexMapper,
-    const float* __restrict kernel, const size_t numPlanes, const size_t numX,
-    const size_t maxX, const size_t numY, const size_t maxY, const size_t numZ,
-    const size_t maxZ, const size_t kernelSizeX, const size_t kernelSizeY,
+    InputEvaluator eval, const internal::IndexMapper<Index, InputDims, 3, InputEvaluator::Layout> indexMapper,
+    const float* __restrict kernel, const size_t numPlanes, const size_t numX, const size_t maxX, const size_t numY,
+    const size_t maxY, const size_t numZ, const size_t maxZ, const size_t kernelSizeX, const size_t kernelSizeY,
     const size_t kernelSizeZ, float* buffer) {
 #if defined(EIGEN_HIPCC)
   HIP_DYNAMIC_SHARED(float, s)
@@ -736,14 +692,14 @@
   const int num_z_input = last_z - first_z + kernelSizeZ;
 
   for (int p = 0; p < numPlanes; ++p) {
-
     const int plane_input_offset = indexMapper.mapGpuInputPlaneToTensorInputOffset(p);
     const int plane_kernel_offset = 0;
 
     for (int k = threadIdx.z; k < num_z_input; k += blockDim.z) {
       for (int j = threadIdx.y; j < num_y_input; j += blockDim.y) {
         for (int i = threadIdx.x; i < num_x_input; i += blockDim.x) {
-          const int tensor_index = plane_input_offset + indexMapper.mapGpuInputKernelToTensorInputOffset(i+first_x, j+first_y, k+first_z);
+          const int tensor_index = plane_input_offset + indexMapper.mapGpuInputKernelToTensorInputOffset(
+                                                            i + first_x, j + first_y, k + first_z);
           s[i + num_x_input * (j + num_y_input * (k + plane_kernel_offset))] = eval.coeff(tensor_index);
         }
       }
@@ -764,11 +720,13 @@
           for (int n = 0; n < kernelSizeZ; ++n) {
             for (int m = 0; m < kernelSizeY; ++m) {
               for (int l = 0; l < kernelSizeX; ++l) {
-                result += s[i + l + num_x_input * (j + m + num_y_input * (k + n + plane_kernel_offset))] * kernel[l + kernelSizeX * (m + kernelSizeY * n)];
+                result += s[i + l + num_x_input * (j + m + num_y_input * (k + n + plane_kernel_offset))] *
+                          kernel[l + kernelSizeX * (m + kernelSizeY * n)];
               }
             }
           }
-          const int tensor_index = plane_output_offset + indexMapper.mapGpuOutputKernelToTensorOutputOffset(i+first_x, j+first_y, k+first_z);
+          const int tensor_index = plane_output_offset + indexMapper.mapGpuOutputKernelToTensorOutputOffset(
+                                                             i + first_x, j + first_y, k + first_z);
           buffer[tensor_index] = result;
         }
       }
@@ -777,14 +735,12 @@
   }
 };
 
-
-
-template<typename Indices, typename InputArgType, typename KernelArgType>
-struct TensorEvaluator<const TensorConvolutionOp<Indices, InputArgType, KernelArgType>, GpuDevice>
-{
+template <typename Indices, typename InputArgType, typename KernelArgType>
+struct TensorEvaluator<const TensorConvolutionOp<Indices, InputArgType, KernelArgType>, GpuDevice> {
   typedef TensorConvolutionOp<Indices, InputArgType, KernelArgType> XprType;
 
-  static constexpr int NumDims =  internal::array_size<typename TensorEvaluator<InputArgType, GpuDevice>::Dimensions>::value;
+  static constexpr int NumDims =
+      internal::array_size<typename TensorEvaluator<InputArgType, GpuDevice>::Dimensions>::value;
   static constexpr int NumKernelDims = internal::array_size<Indices>::value;
   typedef typename XprType::Index Index;
   typedef DSizes<Index, NumDims> Dimensions;
@@ -792,7 +748,8 @@
 
   static constexpr int Layout = TensorEvaluator<InputArgType, GpuDevice>::Layout;
   enum {
-    IsAligned = TensorEvaluator<InputArgType, GpuDevice>::IsAligned & TensorEvaluator<KernelArgType, GpuDevice>::IsAligned,
+    IsAligned =
+        TensorEvaluator<InputArgType, GpuDevice>::IsAligned & TensorEvaluator<KernelArgType, GpuDevice>::IsAligned,
     PacketAccess = false,
     BlockAccess = false,
     PreferBlockAccess = false,
@@ -805,9 +762,17 @@
   //===--------------------------------------------------------------------===//
 
   TensorEvaluator(const XprType& op, const GpuDevice& device)
-      : m_inputImpl(op.inputExpression(), device), m_kernelImpl(op.kernelExpression(), device), m_kernelArg(op.kernelExpression()), m_indices(op.indices()), m_buf(NULL), m_kernel(NULL), m_local_kernel(false), m_device(device)
-  {
-    EIGEN_STATIC_ASSERT((static_cast<int>(TensorEvaluator<InputArgType, GpuDevice>::Layout) == static_cast<int>(TensorEvaluator<KernelArgType, GpuDevice>::Layout)), YOU_MADE_A_PROGRAMMING_MISTAKE);
+      : m_inputImpl(op.inputExpression(), device),
+        m_kernelImpl(op.kernelExpression(), device),
+        m_kernelArg(op.kernelExpression()),
+        m_indices(op.indices()),
+        m_buf(NULL),
+        m_kernel(NULL),
+        m_local_kernel(false),
+        m_device(device) {
+    EIGEN_STATIC_ASSERT((static_cast<int>(TensorEvaluator<InputArgType, GpuDevice>::Layout) ==
+                         static_cast<int>(TensorEvaluator<KernelArgType, GpuDevice>::Layout)),
+                        YOU_MADE_A_PROGRAMMING_MISTAKE);
 
     const typename TensorEvaluator<InputArgType, GpuDevice>::Dimensions& input_dims = m_inputImpl.dimensions();
     const typename TensorEvaluator<KernelArgType, GpuDevice>::Dimensions& kernel_dims = m_kernelImpl.dimensions();
@@ -902,9 +867,7 @@
         dim3 block_size;
 
         const int single_stride_dim =
-            static_cast<int>(Layout) == static_cast<int>(ColMajor)
-                ? 0
-                : m_inputImpl.dimensions().rank() - 1;
+            static_cast<int>(Layout) == static_cast<int>(ColMajor) ? 0 : m_inputImpl.dimensions().rank() - 1;
         if (m_indices[0] == single_stride_dim) {
           // Maximum the reuse
           const int inner_dim = ((maxSharedMem / (sizeof(Scalar)) - kernel_size + 1 + 31) / 32) * 32;
@@ -912,15 +875,14 @@
           const int maxP = numext::mini<int>(maxSharedMem / ((kernel_size - 1 + maxX) * sizeof(Scalar)), numP);
           block_size.x = numext::mini(maxThreadsPerBlock, maxX);
           block_size.y = numext::mini<int>(maxThreadsPerBlock / block_size.x, maxP);
-        }
-        else {
+        } else {
           // Read as much as possible alongside the inner most dimension, that is the plane
           const int inner_dim = maxSharedMem / ((warpSize + kernel_size) * sizeof(Scalar));
           const int maxP = numext::mini<int>(inner_dim, numP);
           maxX = numext::mini<int>(maxSharedMem / (inner_dim * sizeof(Scalar)) - kernel_size + 1, numX);
 
           block_size.x = numext::mini(warpSize, maxX);
-          block_size.y = numext::mini<int>(maxThreadsPerBlock/block_size.x, maxP);
+          block_size.y = numext::mini<int>(maxThreadsPerBlock / block_size.x, maxP);
         }
 
         const int shared_mem = block_size.y * (maxX + kernel_size - 1) * sizeof(Scalar);
@@ -932,53 +894,61 @@
 
         dim3 num_blocks(num_x_blocks, numext::mini<int>(num_y_blocks, ceil(numP, block_size.y)));
 
-
-        //cout << "launching 1D kernel with block_size.x: " << block_size.x << " block_size.y: " << block_size.y << " num_blocks.x: " << num_blocks.x << " num_blocks.y: " << num_blocks.y << " maxX: " << maxX << " shared_mem: " << shared_mem << " in stream " << m_device.stream() << endl;
+        // cout << "launching 1D kernel with block_size.x: " << block_size.x << " block_size.y: " << block_size.y << "
+        // num_blocks.x: " << num_blocks.x << " num_blocks.y: " << num_blocks.y << " maxX: " << maxX << " shared_mem: "
+        // << shared_mem << " in stream " << m_device.stream() << endl;
 
         const array<Index, 1> indices(m_indices[0]);
         const array<Index, 1> kernel_dims(m_kernelImpl.dimensions()[0]);
-        internal::IndexMapper<Index, InputDims, 1, Layout> indexMapper(
-            m_inputImpl.dimensions(), kernel_dims, indices);
-        switch(kernel_size) {
+        internal::IndexMapper<Index, InputDims, 1, Layout> indexMapper(m_inputImpl.dimensions(), kernel_dims, indices);
+        switch (kernel_size) {
           case 4: {
-            LAUNCH_GPU_KERNEL((EigenConvolutionKernel1D<TensorEvaluator<InputArgType, GpuDevice>, Index, InputDims, 4>), num_blocks, block_size, shared_mem, m_device, m_inputImpl, indexMapper, m_kernel, numP, numX, maxX, 4, data);
+            LAUNCH_GPU_KERNEL((EigenConvolutionKernel1D<TensorEvaluator<InputArgType, GpuDevice>, Index, InputDims, 4>),
+                              num_blocks, block_size, shared_mem, m_device, m_inputImpl, indexMapper, m_kernel, numP,
+                              numX, maxX, 4, data);
             break;
           }
           case 7: {
-            LAUNCH_GPU_KERNEL((EigenConvolutionKernel1D<TensorEvaluator<InputArgType, GpuDevice>, Index, InputDims, 7>), num_blocks, block_size, shared_mem, m_device, m_inputImpl, indexMapper, m_kernel, numP, numX, maxX, 7, data);
+            LAUNCH_GPU_KERNEL((EigenConvolutionKernel1D<TensorEvaluator<InputArgType, GpuDevice>, Index, InputDims, 7>),
+                              num_blocks, block_size, shared_mem, m_device, m_inputImpl, indexMapper, m_kernel, numP,
+                              numX, maxX, 7, data);
             break;
           }
           default: {
-            LAUNCH_GPU_KERNEL((EigenConvolutionKernel1D<TensorEvaluator<InputArgType, GpuDevice>, Index, InputDims, Dynamic>), num_blocks, block_size, shared_mem, m_device, m_inputImpl, indexMapper, m_kernel, numP, numX, maxX, kernel_size, data);
+            LAUNCH_GPU_KERNEL(
+                (EigenConvolutionKernel1D<TensorEvaluator<InputArgType, GpuDevice>, Index, InputDims, Dynamic>),
+                num_blocks, block_size, shared_mem, m_device, m_inputImpl, indexMapper, m_kernel, numP, numX, maxX,
+                kernel_size, data);
           }
         }
         break;
       }
 
       case 2: {
-        const int idxX =
-            static_cast<int>(Layout) == static_cast<int>(ColMajor) ? 0 : 1;
-        const int idxY =
-            static_cast<int>(Layout) == static_cast<int>(ColMajor) ? 1 : 0;
+        const int idxX = static_cast<int>(Layout) == static_cast<int>(ColMajor) ? 0 : 1;
+        const int idxY = static_cast<int>(Layout) == static_cast<int>(ColMajor) ? 1 : 0;
         const int kernel_size_x = m_kernelImpl.dimensions()[idxX];
         const int kernel_size_y = m_kernelImpl.dimensions()[idxY];
 
         const int numX = dimensions()[m_indices[idxX]];
         const int numY = dimensions()[m_indices[idxY]];
-        const int numP = dimensions().TotalSize() / (numX*numY);
+        const int numP = dimensions().TotalSize() / (numX * numY);
 
-        const float scaling_factor = sqrtf(static_cast<float>(maxSharedMem) / (sizeof(Scalar) * kernel_size_y * kernel_size_x));
+        const float scaling_factor =
+            sqrtf(static_cast<float>(maxSharedMem) / (sizeof(Scalar) * kernel_size_y * kernel_size_x));
 
         // Snap maxX to warp size
         int inner_dim = ((static_cast<int>(scaling_factor * kernel_size_x) - kernel_size_x + 1 + 32) / 32) * 32;
         const int maxX = numext::mini<int>(inner_dim, numX);
-        const int maxY = numext::mini<int>(maxSharedMem / (sizeof(Scalar) * (maxX + kernel_size_x - 1)) - kernel_size_y + 1, numY);
-        const int maxP = numext::mini<int>(maxSharedMem / ((kernel_size_x - 1 + maxX) * (kernel_size_y - 1 + maxY) * sizeof(Scalar)), numP);
+        const int maxY =
+            numext::mini<int>(maxSharedMem / (sizeof(Scalar) * (maxX + kernel_size_x - 1)) - kernel_size_y + 1, numY);
+        const int maxP = numext::mini<int>(
+            maxSharedMem / ((kernel_size_x - 1 + maxX) * (kernel_size_y - 1 + maxY) * sizeof(Scalar)), numP);
 
         dim3 block_size;
         block_size.x = numext::mini(1024, maxX);
-        block_size.y = numext::mini<int>(1024/block_size.x, maxY);
-        block_size.z = numext::mini<int>(1024/(block_size.x*block_size.y), maxP);
+        block_size.y = numext::mini<int>(1024 / block_size.x, maxY);
+        block_size.z = numext::mini<int>(1024 / (block_size.x * block_size.y), maxP);
 
         const int shared_mem = block_size.z * (maxX + kernel_size_x - 1) * (maxY + kernel_size_y - 1) * sizeof(Scalar);
         gpu_assert(shared_mem <= maxSharedMem);
@@ -990,23 +960,29 @@
 
         dim3 num_blocks(num_x_blocks, num_y_blocks, numext::mini<int>(num_z_blocks, ceil(numP, block_size.z)));
 
-
-        //cout << "launching 2D kernel with block_size.x: " << block_size.x << " block_size.y: " << block_size.y  << " block_size.z: " << block_size.z << " num_blocks.x: " << num_blocks.x << " num_blocks.y: " << num_blocks.y << " num_blocks.z: " << num_blocks.z << " maxX: " << maxX << " maxY: " << maxY << " maxP: " << maxP << " shared_mem: " << shared_mem << " in stream " << m_device.stream() << endl;
+        // cout << "launching 2D kernel with block_size.x: " << block_size.x << " block_size.y: " << block_size.y  << "
+        // block_size.z: " << block_size.z << " num_blocks.x: " << num_blocks.x << " num_blocks.y: " << num_blocks.y <<
+        // " num_blocks.z: " << num_blocks.z << " maxX: " << maxX << " maxY: " << maxY << " maxP: " << maxP << "
+        // shared_mem: " << shared_mem << " in stream " << m_device.stream() << endl;
 
         const array<Index, 2> indices(m_indices[idxX], m_indices[idxY]);
-        const array<Index, 2> kernel_dims(m_kernelImpl.dimensions()[idxX],
-                                          m_kernelImpl.dimensions()[idxY]);
-        internal::IndexMapper<Index, InputDims, 2, Layout> indexMapper(
-            m_inputImpl.dimensions(), kernel_dims, indices);
+        const array<Index, 2> kernel_dims(m_kernelImpl.dimensions()[idxX], m_kernelImpl.dimensions()[idxY]);
+        internal::IndexMapper<Index, InputDims, 2, Layout> indexMapper(m_inputImpl.dimensions(), kernel_dims, indices);
         switch (kernel_size_x) {
           case 4: {
             switch (kernel_size_y) {
               case 7: {
-                LAUNCH_GPU_KERNEL((EigenConvolutionKernel2D<TensorEvaluator<InputArgType, GpuDevice>, Index, InputDims, 4, 7>), num_blocks, block_size, shared_mem, m_device, m_inputImpl, indexMapper, m_kernel, numP, numX, maxX, numY, maxY, 4, 7, data);
+                LAUNCH_GPU_KERNEL(
+                    (EigenConvolutionKernel2D<TensorEvaluator<InputArgType, GpuDevice>, Index, InputDims, 4, 7>),
+                    num_blocks, block_size, shared_mem, m_device, m_inputImpl, indexMapper, m_kernel, numP, numX, maxX,
+                    numY, maxY, 4, 7, data);
                 break;
               }
               default: {
-                LAUNCH_GPU_KERNEL((EigenConvolutionKernel2D<TensorEvaluator<InputArgType, GpuDevice>, Index, InputDims, 4, Dynamic>), num_blocks, block_size, shared_mem, m_device, m_inputImpl, indexMapper, m_kernel, numP, numX, maxX, numY, maxY, 4, kernel_size_y, data);
+                LAUNCH_GPU_KERNEL(
+                    (EigenConvolutionKernel2D<TensorEvaluator<InputArgType, GpuDevice>, Index, InputDims, 4, Dynamic>),
+                    num_blocks, block_size, shared_mem, m_device, m_inputImpl, indexMapper, m_kernel, numP, numX, maxX,
+                    numY, maxY, 4, kernel_size_y, data);
                 break;
               }
             }
@@ -1015,18 +991,27 @@
           case 7: {
             switch (kernel_size_y) {
               case 4: {
-                LAUNCH_GPU_KERNEL((EigenConvolutionKernel2D<TensorEvaluator<InputArgType, GpuDevice>, Index, InputDims, 7, 4>), num_blocks, block_size, shared_mem, m_device, m_inputImpl, indexMapper, m_kernel, numP, numX, maxX, numY, maxY, 7, 4, data);
+                LAUNCH_GPU_KERNEL(
+                    (EigenConvolutionKernel2D<TensorEvaluator<InputArgType, GpuDevice>, Index, InputDims, 7, 4>),
+                    num_blocks, block_size, shared_mem, m_device, m_inputImpl, indexMapper, m_kernel, numP, numX, maxX,
+                    numY, maxY, 7, 4, data);
                 break;
               }
               default: {
-                LAUNCH_GPU_KERNEL((EigenConvolutionKernel2D<TensorEvaluator<InputArgType, GpuDevice>, Index, InputDims, 7, Dynamic>), num_blocks, block_size, shared_mem, m_device, m_inputImpl, indexMapper, m_kernel, numP, numX, maxX, numY, maxY, 7, kernel_size_y, data);
+                LAUNCH_GPU_KERNEL(
+                    (EigenConvolutionKernel2D<TensorEvaluator<InputArgType, GpuDevice>, Index, InputDims, 7, Dynamic>),
+                    num_blocks, block_size, shared_mem, m_device, m_inputImpl, indexMapper, m_kernel, numP, numX, maxX,
+                    numY, maxY, 7, kernel_size_y, data);
                 break;
               }
             }
             break;
           }
           default: {
-            LAUNCH_GPU_KERNEL((EigenConvolutionKernel2D<TensorEvaluator<InputArgType, GpuDevice>, Index, InputDims, Dynamic, Dynamic>), num_blocks, block_size, shared_mem, m_device, m_inputImpl, indexMapper, m_kernel, numP, numX, maxX, numY, maxY, kernel_size_x, kernel_size_y, data);
+            LAUNCH_GPU_KERNEL((EigenConvolutionKernel2D<TensorEvaluator<InputArgType, GpuDevice>, Index, InputDims,
+                                                        Dynamic, Dynamic>),
+                              num_blocks, block_size, shared_mem, m_device, m_inputImpl, indexMapper, m_kernel, numP,
+                              numX, maxX, numY, maxY, kernel_size_x, kernel_size_y, data);
             break;
           }
         }
@@ -1034,12 +1019,9 @@
       }
 
       case 3: {
-        const int idxX =
-            static_cast<int>(Layout) == static_cast<int>(ColMajor) ? 0 : 2;
-        const int idxY =
-            static_cast<int>(Layout) == static_cast<int>(ColMajor) ? 1 : 1;
-        const int idxZ =
-            static_cast<int>(Layout) == static_cast<int>(ColMajor) ? 2 : 0;
+        const int idxX = static_cast<int>(Layout) == static_cast<int>(ColMajor) ? 0 : 2;
+        const int idxY = static_cast<int>(Layout) == static_cast<int>(ColMajor) ? 1 : 1;
+        const int idxZ = static_cast<int>(Layout) == static_cast<int>(ColMajor) ? 2 : 0;
 
         const int kernel_size_x = m_kernelImpl.dimensions()[idxX];
         const int kernel_size_y = m_kernelImpl.dimensions()[idxY];
@@ -1048,72 +1030,78 @@
         const int numX = dimensions()[m_indices[idxX]];
         const int numY = dimensions()[m_indices[idxY]];
         const int numZ = dimensions()[m_indices[idxZ]];
-        const int numP = dimensions().TotalSize() / (numX*numY*numZ);
+        const int numP = dimensions().TotalSize() / (numX * numY * numZ);
 
-        const int maxX = numext::mini<int>(128, numext::mini<int>(maxSharedMem / (sizeof(Scalar) * kernel_size_y * kernel_size_z) - kernel_size_x + 1, numX));
-        const int maxY = numext::mini<int>(128, numext::mini<int>(maxSharedMem / (sizeof(Scalar) * (maxX + kernel_size_x - 1) * kernel_size_z) - kernel_size_y + 1, numY));
-        const int maxZ = numext::mini<int>(128, numext::mini<int>(maxSharedMem / (sizeof(Scalar) * (maxX + kernel_size_x - 1) * (maxY + kernel_size_y - 1)) - kernel_size_z + 1, numZ));
+        const int maxX = numext::mini<int>(
+            128, numext::mini<int>(maxSharedMem / (sizeof(Scalar) * kernel_size_y * kernel_size_z) - kernel_size_x + 1,
+                                   numX));
+        const int maxY = numext::mini<int>(
+            128, numext::mini<int>(
+                     maxSharedMem / (sizeof(Scalar) * (maxX + kernel_size_x - 1) * kernel_size_z) - kernel_size_y + 1,
+                     numY));
+        const int maxZ = numext::mini<int>(
+            128, numext::mini<int>(
+                     maxSharedMem / (sizeof(Scalar) * (maxX + kernel_size_x - 1) * (maxY + kernel_size_y - 1)) -
+                         kernel_size_z + 1,
+                     numZ));
 
         dim3 block_size;
         block_size.x = numext::mini(32, maxX);
         block_size.y = numext::mini(32, maxY);
-        block_size.z = numext::mini<int>(1024/(block_size.x*block_size.y), maxZ);
+        block_size.z = numext::mini<int>(1024 / (block_size.x * block_size.y), maxZ);
         dim3 num_blocks(ceil(numX, maxX), ceil(numY, maxY), ceil(numZ, maxZ));
 
-        const int shared_mem = (maxX + kernel_size_x - 1) * (maxY + kernel_size_y - 1) * (maxZ + kernel_size_z - 1) * sizeof(Scalar);
+        const int shared_mem =
+            (maxX + kernel_size_x - 1) * (maxY + kernel_size_y - 1) * (maxZ + kernel_size_z - 1) * sizeof(Scalar);
         gpu_assert(shared_mem <= maxSharedMem);
 
-        //cout << "launching 3D kernel with block_size.x: " << block_size.x << " block_size.y: " << block_size.y  << " block_size.z: " << block_size.z << " num_blocks.x: " << num_blocks.x << " num_blocks.y: " << num_blocks.y << " num_blocks.z: " << num_blocks.z  << " shared_mem: " << shared_mem << " in stream " << m_device.stream() << endl;
-        const array<Index, 3> indices(m_indices[idxX], m_indices[idxY],
-                                      m_indices[idxZ]);
-        const array<Index, 3> kernel_dims(m_kernelImpl.dimensions()[idxX],
-                                          m_kernelImpl.dimensions()[idxY],
+        // cout << "launching 3D kernel with block_size.x: " << block_size.x << " block_size.y: " << block_size.y  << "
+        // block_size.z: " << block_size.z << " num_blocks.x: " << num_blocks.x << " num_blocks.y: " << num_blocks.y <<
+        // " num_blocks.z: " << num_blocks.z  << " shared_mem: " << shared_mem << " in stream " << m_device.stream() <<
+        // endl;
+        const array<Index, 3> indices(m_indices[idxX], m_indices[idxY], m_indices[idxZ]);
+        const array<Index, 3> kernel_dims(m_kernelImpl.dimensions()[idxX], m_kernelImpl.dimensions()[idxY],
                                           m_kernelImpl.dimensions()[idxZ]);
-        internal::IndexMapper<Index, InputDims, 3, Layout> indexMapper(
-            m_inputImpl.dimensions(), kernel_dims, indices);
+        internal::IndexMapper<Index, InputDims, 3, Layout> indexMapper(m_inputImpl.dimensions(), kernel_dims, indices);
 
-        LAUNCH_GPU_KERNEL((EigenConvolutionKernel3D<TensorEvaluator<InputArgType, GpuDevice>, Index, InputDims>), num_blocks, block_size, shared_mem, m_device, m_inputImpl, indexMapper, m_kernel, numP, numX, maxX, numY, maxY, numZ, maxZ, kernel_size_x, kernel_size_y, kernel_size_z, data);
+        LAUNCH_GPU_KERNEL((EigenConvolutionKernel3D<TensorEvaluator<InputArgType, GpuDevice>, Index, InputDims>),
+                          num_blocks, block_size, shared_mem, m_device, m_inputImpl, indexMapper, m_kernel, numP, numX,
+                          maxX, numY, maxY, numZ, maxZ, kernel_size_x, kernel_size_y, kernel_size_z, data);
         break;
       }
 
       default: {
-        EIGEN_STATIC_ASSERT((NumKernelDims >= 1 && NumKernelDims <= 3), THIS_METHOD_IS_ONLY_FOR_OBJECTS_OF_A_SPECIFIC_SIZE);
+        EIGEN_STATIC_ASSERT((NumKernelDims >= 1 && NumKernelDims <= 3),
+                            THIS_METHOD_IS_ONLY_FOR_OBJECTS_OF_A_SPECIFIC_SIZE);
       }
     }
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
     eigen_assert(m_buf);
     eigen_assert(index < m_dimensions.TotalSize());
     return m_buf[index];
   }
 
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(const Index index) const
-  {
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(const Index index) const {
     eigen_assert(m_buf);
     eigen_assert(index < m_dimensions.TotalSize());
-    return internal::ploadt<PacketReturnType, LoadMode>(m_buf+index);
+    return internal::ploadt<PacketReturnType, LoadMode>(m_buf + index);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost
-  costPerCoeff(bool vectorized) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const {
     // TODO(rmlarsen): FIXME: For now, this is just a copy of the CPU cost
     // model.
     const double kernel_size = m_kernelImpl.dimensions().TotalSize();
     // We ignore the use of fused multiply-add.
-    const double convolve_compute_cost =
-        TensorOpCost::AddCost<Scalar>() + TensorOpCost::MulCost<Scalar>();
+    const double convolve_compute_cost = TensorOpCost::AddCost<Scalar>() + TensorOpCost::MulCost<Scalar>();
     const double firstIndex_compute_cost =
         NumDims *
-        (2 * TensorOpCost::AddCost<Index>() + 2 * TensorOpCost::MulCost<Index>() +
-         TensorOpCost::DivCost<Index>());
+        (2 * TensorOpCost::AddCost<Index>() + 2 * TensorOpCost::MulCost<Index>() + TensorOpCost::DivCost<Index>());
     return TensorOpCost(0, 0, firstIndex_compute_cost, vectorized, PacketSize) +
-           kernel_size * (m_inputImpl.costPerCoeff(vectorized) +
-                          m_kernelImpl.costPerCoeff(vectorized) +
-                          TensorOpCost(0, 0, convolve_compute_cost, vectorized,
-                                       PacketSize));
+           kernel_size * (m_inputImpl.costPerCoeff(vectorized) + m_kernelImpl.costPerCoeff(vectorized) +
+                          TensorOpCost(0, 0, convolve_compute_cost, vectorized, PacketSize));
   }
 
  private:
@@ -1130,7 +1118,6 @@
 };
 #endif
 
+}  // end namespace Eigen
 
-} // end namespace Eigen
-
-#endif // EIGEN_CXX11_TENSOR_TENSOR_CONVOLUTION_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_CONVOLUTION_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorConvolutionSycl.h b/unsupported/Eigen/CXX11/src/Tensor/TensorConvolutionSycl.h
index a35a24f..88ae9f4 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorConvolutionSycl.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorConvolutionSycl.h
@@ -61,7 +61,7 @@
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool boundary_check(const BooleanDim2 boolean_check) const {
     return (boolean_check[0] && boolean_check[1]);
   }
-  void operator()(cl::sycl::nd_item<2> itemID)  const {
+  void operator()(cl::sycl::nd_item<2> itemID) const {
     auto buffer_ptr = buffer_acc;
     auto kernel_ptr = kernel_filter;
     // the required row to be calculated for the for each plane in shered memory
@@ -140,20 +140,20 @@
 
     const auto input_offset = cl::sycl::range<2>{itemID.get_group(0) * itemID.get_local_range()[0],
                                                  itemID.get_group(1) * itemID.get_local_range()[1]};
-      
+
     // fill the local memory
     bool in_range_dim2 = itemID.get_global_id(2) < input_range[2];
     for (size_t j = itemID.get_local_id(1); j < num_input[1]; j += itemID.get_local_range()[1]) {
       const size_t local_input_offset = num_input[0] * (j + plane_kernel_offset);
-      bool in_range_dim1 = ((j + input_offset[1]) < (input_range[1] + kernel_size[1] - 1)); 
+      bool in_range_dim1 = ((j + input_offset[1]) < (input_range[1] + kernel_size[1] - 1));
       for (size_t i = itemID.get_local_id(0); i < num_input[0]; i += itemID.get_local_range()[0]) {
         const size_t local_index = i + local_input_offset;
         const size_t tensor_index = plane_input_offset + indexMapper.mapGpuInputKernelToTensorInputOffset(
                                                              i + input_offset[0], j + input_offset[1]);
-        local_acc[local_index] = (((i + input_offset[0]) < (input_range[0] + kernel_size[0] - 1)) &&
-                                  in_range_dim1 && in_range_dim2)
-                                     ? device_evaluator.coeff(tensor_index)
-                                     : CoeffReturnType(0);
+        local_acc[local_index] =
+            (((i + input_offset[0]) < (input_range[0] + kernel_size[0] - 1)) && in_range_dim1 && in_range_dim2)
+                ? device_evaluator.coeff(tensor_index)
+                : CoeffReturnType(0);
       }
     }
 
@@ -224,7 +224,7 @@
     const auto input_offset = cl::sycl::range<3>{itemID.get_group().get_id() * itemID.get_local_range()};
 
     const auto output_offset =
-          cl::sycl::range<3>{itemID.get_group().get_id() * itemID.get_local_range() + itemID.get_local_id()};
+        cl::sycl::range<3>{itemID.get_group().get_id() * itemID.get_local_range() + itemID.get_local_id()};
 
     for (size_t p = 0; p < numP; p++) {
       /// fill the shared memory
@@ -234,7 +234,7 @@
         bool cond_k_dim = (k + input_offset[2] < (input_range[2] + kernel_size[2] - 1));
         for (size_t j = itemID.get_local_id(1); j < num_input[1]; j += itemID.get_local_range()[1]) {
           bool cond_j_dim = cond_k_dim && (j + input_offset[1] < (input_range[1] + kernel_size[1] - 1));
-          size_t local_index_dim1 = (num_input[0] * j)  + local_index_dim2;
+          size_t local_index_dim1 = (num_input[0] * j) + local_index_dim2;
           for (size_t i = itemID.get_local_id(0); i < num_input[0]; i += itemID.get_local_range()[0]) {
             bool conds = cond_j_dim && (i + input_offset[0] < (input_range[0] + kernel_size[0] - 1));
             const size_t local_index = local_index_dim1 + i;
@@ -410,9 +410,11 @@
                                        typename KernelStorage::Type, EvaluatorPointerType, convolution_type::CONV1D>
             ConvKernel;
 
-        m_device.template binary_kernel_launcher<CoeffReturnType, ConvKernel>(
-            m_inputImpl, m_kernel, data, cl::sycl::nd_range<2>(global_range, local_range), local_memory_size,
-            indexMapper, kernel_size, cl::sycl::range<2>(input_dim[0], input_dim[1])).wait();
+        m_device
+            .template binary_kernel_launcher<CoeffReturnType, ConvKernel>(
+                m_inputImpl, m_kernel, data, cl::sycl::nd_range<2>(global_range, local_range), local_memory_size,
+                indexMapper, kernel_size, cl::sycl::range<2>(input_dim[0], input_dim[1]))
+            .wait();
         break;
       }
 
@@ -441,9 +443,11 @@
         typedef EigenConvolutionKernel<InputEvaluator, CoeffReturnType, Scalar, Index, InputDims,
                                        typename KernelStorage::Type, EvaluatorPointerType, convolution_type::CONV2D>
             ConvKernel;
-        m_device.template binary_kernel_launcher<CoeffReturnType, ConvKernel>(
-            m_inputImpl, m_kernel, data, cl::sycl::nd_range<3>(global_range, local_range), local_memory_size,
-            indexMapper, kernel_size, cl::sycl::range<3>{input_dim[0], input_dim[1], input_dim[2]}).wait();
+        m_device
+            .template binary_kernel_launcher<CoeffReturnType, ConvKernel>(
+                m_inputImpl, m_kernel, data, cl::sycl::nd_range<3>(global_range, local_range), local_memory_size,
+                indexMapper, kernel_size, cl::sycl::range<3>{input_dim[0], input_dim[1], input_dim[2]})
+            .wait();
         break;
       }
 
@@ -481,9 +485,11 @@
         typedef EigenConvolutionKernel<InputEvaluator, CoeffReturnType, Scalar, Index, InputDims,
                                        typename KernelStorage::Type, EvaluatorPointerType, convolution_type::CONV3D>
             ConvKernel;
-        m_device.template binary_kernel_launcher<CoeffReturnType, ConvKernel>(
-            m_inputImpl, m_kernel, data, cl::sycl::nd_range<3>(global_range, local_range), local_memory_size,
-            indexMapper, kernel_size, cl::sycl::range<3>(input_dim[0], input_dim[1], input_dim[2]), numP).wait();
+        m_device
+            .template binary_kernel_launcher<CoeffReturnType, ConvKernel>(
+                m_inputImpl, m_kernel, data, cl::sycl::nd_range<3>(global_range, local_range), local_memory_size,
+                indexMapper, kernel_size, cl::sycl::range<3>(input_dim[0], input_dim[1], input_dim[2]), numP)
+            .wait();
         break;
       }
 
@@ -521,7 +527,6 @@
                           TensorOpCost(0, 0, convolve_compute_cost, vectorized, PacketSize));
   }
 
-
  private:
   // No assignment (copies are needed by the kernels)
   TensorEvaluator &operator=(const TensorEvaluator &);
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorCostModel.h b/unsupported/Eigen/CXX11/src/Tensor/TensorCostModel.h
index 595b3ae..c0f1333 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorCostModel.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorCostModel.h
@@ -16,12 +16,12 @@
 namespace Eigen {
 
 /** \class TensorEvaluator
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief A cost model used to limit the number of threads used for evaluating
-  * tensor expression.
-  *
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief A cost model used to limit the number of threads used for evaluating
+ * tensor expression.
+ *
+ */
 
 // Class storing the cost of evaluating a tensor expression in terms of the
 // estimated number of operand bytes loads, bytes stored, and compute cycles.
@@ -32,8 +32,7 @@
   // Agner Fog's tables would be better than what is there now.
   template <typename ArgType>
   static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE int MulCost() {
-    return internal::functor_traits<
-        internal::scalar_product_op<ArgType, ArgType> >::Cost;
+    return internal::functor_traits<internal::scalar_product_op<ArgType, ArgType> >::Cost;
   }
   template <typename ArgType>
   static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE int AddCost() {
@@ -41,8 +40,7 @@
   }
   template <typename ArgType>
   static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE int DivCost() {
-    return internal::functor_traits<
-        internal::scalar_quotient_op<ArgType, ArgType> >::Cost;
+    return internal::functor_traits<internal::scalar_quotient_op<ArgType, ArgType> >::Cost;
   }
   template <typename ArgType>
   static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE int ModCost() {
@@ -50,43 +48,29 @@
   }
   template <typename SrcType, typename TargetType>
   static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE int CastCost() {
-    return internal::functor_traits<
-        internal::scalar_cast_op<SrcType, TargetType> >::Cost;
+    return internal::functor_traits<internal::scalar_cast_op<SrcType, TargetType> >::Cost;
   }
 
-  EIGEN_DEVICE_FUNC
-  TensorOpCost() : bytes_loaded_(0), bytes_stored_(0), compute_cycles_(0) {}
-  EIGEN_DEVICE_FUNC
-  TensorOpCost(double bytes_loaded, double bytes_stored, double compute_cycles)
-      : bytes_loaded_(bytes_loaded),
-        bytes_stored_(bytes_stored),
-        compute_cycles_(compute_cycles) {}
+  EIGEN_DEVICE_FUNC TensorOpCost() : bytes_loaded_(0), bytes_stored_(0), compute_cycles_(0) {}
+  EIGEN_DEVICE_FUNC TensorOpCost(double bytes_loaded, double bytes_stored, double compute_cycles)
+      : bytes_loaded_(bytes_loaded), bytes_stored_(bytes_stored), compute_cycles_(compute_cycles) {}
 
-  EIGEN_DEVICE_FUNC
-  TensorOpCost(double bytes_loaded, double bytes_stored, double compute_cycles,
-               bool vectorized, double packet_size)
+  EIGEN_DEVICE_FUNC TensorOpCost(double bytes_loaded, double bytes_stored, double compute_cycles, bool vectorized,
+                                 double packet_size)
       : bytes_loaded_(bytes_loaded),
         bytes_stored_(bytes_stored),
-        compute_cycles_(vectorized ? compute_cycles / packet_size
-                                   : compute_cycles) {
+        compute_cycles_(vectorized ? compute_cycles / packet_size : compute_cycles) {
     eigen_assert(bytes_loaded >= 0 && (numext::isfinite)(bytes_loaded));
     eigen_assert(bytes_stored >= 0 && (numext::isfinite)(bytes_stored));
     eigen_assert(compute_cycles >= 0 && (numext::isfinite)(compute_cycles));
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double bytes_loaded() const {
-    return bytes_loaded_;
-  }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double bytes_stored() const {
-    return bytes_stored_;
-  }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double compute_cycles() const {
-    return compute_cycles_;
-  }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double total_cost(
-      double load_cost, double store_cost, double compute_cost) const {
-    return load_cost * bytes_loaded_ + store_cost * bytes_stored_ +
-           compute_cost * compute_cycles_;
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double bytes_loaded() const { return bytes_loaded_; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double bytes_stored() const { return bytes_stored_; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double compute_cycles() const { return compute_cycles_; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double total_cost(double load_cost, double store_cost,
+                                                          double compute_cost) const {
+    return load_cost * bytes_loaded_ + store_cost * bytes_stored_ + compute_cost * compute_cycles_;
   }
 
   // Drop memory access component. Intended for cases when memory accesses are
@@ -97,8 +81,7 @@
   }
 
   // TODO(rmlarsen): Define min in terms of total cost, not elementwise.
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost cwiseMin(
-      const TensorOpCost& rhs) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost cwiseMin(const TensorOpCost& rhs) const {
     double bytes_loaded = numext::mini(bytes_loaded_, rhs.bytes_loaded());
     double bytes_stored = numext::mini(bytes_stored_, rhs.bytes_stored());
     double compute_cycles = numext::mini(compute_cycles_, rhs.compute_cycles());
@@ -106,16 +89,14 @@
   }
 
   // TODO(rmlarsen): Define max in terms of total cost, not elementwise.
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost cwiseMax(
-      const TensorOpCost& rhs) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost cwiseMax(const TensorOpCost& rhs) const {
     double bytes_loaded = numext::maxi(bytes_loaded_, rhs.bytes_loaded());
     double bytes_stored = numext::maxi(bytes_stored_, rhs.bytes_stored());
     double compute_cycles = numext::maxi(compute_cycles_, rhs.compute_cycles());
     return TensorOpCost(bytes_loaded, bytes_stored, compute_cycles);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost& operator+=(
-      const TensorOpCost& rhs) {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost& operator+=(const TensorOpCost& rhs) {
     bytes_loaded_ += rhs.bytes_loaded();
     bytes_stored_ += rhs.bytes_stored();
     compute_cycles_ += rhs.compute_cycles();
@@ -129,25 +110,21 @@
     return *this;
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE friend TensorOpCost operator+(
-      TensorOpCost lhs, const TensorOpCost& rhs) {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE friend TensorOpCost operator+(TensorOpCost lhs, const TensorOpCost& rhs) {
     lhs += rhs;
     return lhs;
   }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE friend TensorOpCost operator*(
-      TensorOpCost lhs, double rhs) {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE friend TensorOpCost operator*(TensorOpCost lhs, double rhs) {
     lhs *= rhs;
     return lhs;
   }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE friend TensorOpCost operator*(
-      double lhs, TensorOpCost rhs) {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE friend TensorOpCost operator*(double lhs, TensorOpCost rhs) {
     rhs *= lhs;
     return rhs;
   }
 
   friend std::ostream& operator<<(std::ostream& os, const TensorOpCost& tc) {
-    return os << "[bytes_loaded = " << tc.bytes_loaded()
-              << ", bytes_stored = " << tc.bytes_stored()
+    return os << "[bytes_loaded = " << tc.bytes_loaded() << ", bytes_stored = " << tc.bytes_stored()
               << ", compute_cycles = " << tc.compute_cycles() << "]";
   }
 
@@ -166,7 +143,7 @@
   // Scaling from Eigen compute cost to device cycles.
   static const int kDeviceCyclesPerComputeCycle = 1;
 
- // Costs in device cycles.
+  // Costs in device cycles.
   static const int kStartupCycles = 100000;
   static const int kPerThreadCycles = 100000;
   static const int kTaskSize = 40000;
@@ -174,26 +151,24 @@
   // Returns the number of threads in [1:max_threads] to use for
   // evaluating an expression with the given output size and cost per
   // coefficient.
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE int numThreads(
-      double output_size, const TensorOpCost& cost_per_coeff, int max_threads) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE int numThreads(double output_size, const TensorOpCost& cost_per_coeff,
+                                                              int max_threads) {
     double cost = totalCost(output_size, cost_per_coeff);
     double threads = (cost - kStartupCycles) / kPerThreadCycles + 0.9;
     // Make sure we don't invoke undefined behavior when we convert to an int.
     threads = numext::mini<double>(threads, GenericNumTraits<int>::highest());
-    return numext::mini(max_threads,
-                        numext::maxi<int>(1, static_cast<int>(threads)));
+    return numext::mini(max_threads, numext::maxi<int>(1, static_cast<int>(threads)));
   }
 
   // taskSize assesses parallel task size.
   // Value of 1.0 means ideal parallel task size. Values < 1.0 mean that task
   // granularity needs to be increased to mitigate parallelization overheads.
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double taskSize(
-      double output_size, const TensorOpCost& cost_per_coeff) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double taskSize(double output_size, const TensorOpCost& cost_per_coeff) {
     return totalCost(output_size, cost_per_coeff) / kTaskSize;
   }
 
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double totalCost(
-      double output_size, const TensorOpCost& cost_per_coeff) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double totalCost(double output_size,
+                                                                const TensorOpCost& cost_per_coeff) {
     // Cost of memory fetches from L2 cache. 64 is typical cache line size.
     // 11 is L2 cache latency on Haswell.
     // We don't know whether data is in L1, L2 or L3. But we are most interested
@@ -206,9 +181,7 @@
     const double kLoadCycles = 1.0 / 64 * 11;
     const double kStoreCycles = 1.0 / 64 * 11;
     // Scaling from Eigen compute cost to device cycles.
-    return output_size *
-        cost_per_coeff.total_cost(kLoadCycles, kStoreCycles,
-                                  kDeviceCyclesPerComputeCycle);
+    return output_size * cost_per_coeff.total_cost(kLoadCycles, kStoreCycles, kDeviceCyclesPerComputeCycle);
   }
 };
 
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorCustomOp.h b/unsupported/Eigen/CXX11/src/Tensor/TensorCustomOp.h
index 82254e8..c8e1df7 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorCustomOp.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorCustomOp.h
@@ -16,16 +16,15 @@
 namespace Eigen {
 
 /** \class TensorCustomUnaryOp
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Tensor custom class.
-  *
-  *
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Tensor custom class.
+ *
+ *
+ */
 namespace internal {
-template<typename CustomUnaryFunc, typename XprType>
-struct traits<TensorCustomUnaryOp<CustomUnaryFunc, XprType> >
-{
+template <typename CustomUnaryFunc, typename XprType>
+struct traits<TensorCustomUnaryOp<CustomUnaryFunc, XprType> > {
   typedef typename XprType::Scalar Scalar;
   typedef typename XprType::StorageKind StorageKind;
   typedef typename XprType::Index Index;
@@ -36,26 +35,21 @@
   typedef typename traits<XprType>::PointerType PointerType;
 };
 
-template<typename CustomUnaryFunc, typename XprType>
-struct eval<TensorCustomUnaryOp<CustomUnaryFunc, XprType>, Eigen::Dense>
-{
-  typedef const TensorCustomUnaryOp<CustomUnaryFunc, XprType>EIGEN_DEVICE_REF type;
+template <typename CustomUnaryFunc, typename XprType>
+struct eval<TensorCustomUnaryOp<CustomUnaryFunc, XprType>, Eigen::Dense> {
+  typedef const TensorCustomUnaryOp<CustomUnaryFunc, XprType> EIGEN_DEVICE_REF type;
 };
 
-template<typename CustomUnaryFunc, typename XprType>
-struct nested<TensorCustomUnaryOp<CustomUnaryFunc, XprType> >
-{
+template <typename CustomUnaryFunc, typename XprType>
+struct nested<TensorCustomUnaryOp<CustomUnaryFunc, XprType> > {
   typedef TensorCustomUnaryOp<CustomUnaryFunc, XprType> type;
 };
 
 }  // end namespace internal
 
-
-
-template<typename CustomUnaryFunc, typename XprType>
-class TensorCustomUnaryOp : public TensorBase<TensorCustomUnaryOp<CustomUnaryFunc, XprType>, ReadOnlyAccessors>
-{
-  public:
+template <typename CustomUnaryFunc, typename XprType>
+class TensorCustomUnaryOp : public TensorBase<TensorCustomUnaryOp<CustomUnaryFunc, XprType>, ReadOnlyAccessors> {
+ public:
   typedef typename internal::traits<TensorCustomUnaryOp>::Scalar Scalar;
   typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
   typedef typename XprType::CoeffReturnType CoeffReturnType;
@@ -66,23 +60,18 @@
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCustomUnaryOp(const XprType& expr, const CustomUnaryFunc& func)
       : m_expr(expr), m_func(func) {}
 
-  EIGEN_DEVICE_FUNC
-  const CustomUnaryFunc& func() const { return m_func; }
+  EIGEN_DEVICE_FUNC const CustomUnaryFunc& func() const { return m_func; }
 
-  EIGEN_DEVICE_FUNC
-  const internal::remove_all_t<typename XprType::Nested>&
-  expression() const { return m_expr; }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename XprType::Nested>& expression() const { return m_expr; }
 
-  protected:
-    typename XprType::Nested m_expr;
-    const CustomUnaryFunc m_func;
+ protected:
+  typename XprType::Nested m_expr;
+  const CustomUnaryFunc m_func;
 };
 
-
 // Eval as rvalue
-template<typename CustomUnaryFunc, typename XprType, typename Device>
-struct TensorEvaluator<const TensorCustomUnaryOp<CustomUnaryFunc, XprType>, Device>
-{
+template <typename CustomUnaryFunc, typename XprType, typename Device>
+struct TensorEvaluator<const TensorCustomUnaryOp<CustomUnaryFunc, XprType>, Device> {
   typedef TensorCustomUnaryOp<CustomUnaryFunc, XprType> ArgType;
   typedef typename internal::traits<ArgType>::Index Index;
   static constexpr int NumDims = internal::traits<ArgType>::NumDimensions;
@@ -110,8 +99,7 @@
   //===--------------------------------------------------------------------===//
 
   EIGEN_STRONG_INLINE TensorEvaluator(const ArgType& op, const Device& device)
-      : m_op(op), m_device(device), m_result(NULL)
-  {
+      : m_op(op), m_device(device), m_result(NULL) {
     m_dimensions = op.func().dimensions(op.expression());
   }
 
@@ -122,8 +110,8 @@
       evalTo(data);
       return false;
     } else {
-      m_result = static_cast<EvaluatorPointerType>(m_device.get( (CoeffReturnType*)
-          m_device.allocate_temp(dimensions().TotalSize() * sizeof(Scalar))));
+      m_result = static_cast<EvaluatorPointerType>(
+          m_device.get((CoeffReturnType*)m_device.allocate_temp(dimensions().TotalSize() * sizeof(Scalar))));
       evalTo(m_result);
       return true;
     }
@@ -136,11 +124,9 @@
     }
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
-    return m_result[index];
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const { return m_result[index]; }
 
-  template<int LoadMode>
+  template <int LoadMode>
   EIGEN_DEVICE_FUNC PacketReturnType packet(Index index) const {
     return internal::ploadt<PacketReturnType, LoadMode>(m_result + index);
   }
@@ -164,27 +150,23 @@
   EvaluatorPointerType m_result;
 };
 
-
-
 /** \class TensorCustomBinaryOp
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Tensor custom class.
-  *
-  *
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Tensor custom class.
+ *
+ *
+ */
 namespace internal {
-template<typename CustomBinaryFunc, typename LhsXprType, typename RhsXprType>
-struct traits<TensorCustomBinaryOp<CustomBinaryFunc, LhsXprType, RhsXprType> >
-{
-  typedef typename internal::promote_storage_type<typename LhsXprType::Scalar,
-                                                  typename RhsXprType::Scalar>::ret Scalar;
+template <typename CustomBinaryFunc, typename LhsXprType, typename RhsXprType>
+struct traits<TensorCustomBinaryOp<CustomBinaryFunc, LhsXprType, RhsXprType> > {
+  typedef typename internal::promote_storage_type<typename LhsXprType::Scalar, typename RhsXprType::Scalar>::ret Scalar;
   typedef typename internal::promote_storage_type<typename LhsXprType::CoeffReturnType,
                                                   typename RhsXprType::CoeffReturnType>::ret CoeffReturnType;
   typedef typename promote_storage_type<typename traits<LhsXprType>::StorageKind,
                                         typename traits<RhsXprType>::StorageKind>::ret StorageKind;
-  typedef typename promote_index_type<typename traits<LhsXprType>::Index,
-                                      typename traits<RhsXprType>::Index>::type Index;
+  typedef
+      typename promote_index_type<typename traits<LhsXprType>::Index, typename traits<RhsXprType>::Index>::type Index;
   typedef typename LhsXprType::Nested LhsNested;
   typedef typename RhsXprType::Nested RhsNested;
   typedef std::remove_reference_t<LhsNested> LhsNested_;
@@ -192,29 +174,26 @@
   static constexpr int NumDimensions = traits<LhsXprType>::NumDimensions;
   static constexpr int Layout = traits<LhsXprType>::Layout;
   typedef std::conditional_t<Pointer_type_promotion<typename LhsXprType::Scalar, Scalar>::val,
-                        typename traits<LhsXprType>::PointerType, typename traits<RhsXprType>::PointerType> PointerType;
+                             typename traits<LhsXprType>::PointerType, typename traits<RhsXprType>::PointerType>
+      PointerType;
 };
 
-template<typename CustomBinaryFunc, typename LhsXprType, typename RhsXprType>
-struct eval<TensorCustomBinaryOp<CustomBinaryFunc, LhsXprType, RhsXprType>, Eigen::Dense>
-{
+template <typename CustomBinaryFunc, typename LhsXprType, typename RhsXprType>
+struct eval<TensorCustomBinaryOp<CustomBinaryFunc, LhsXprType, RhsXprType>, Eigen::Dense> {
   typedef const TensorCustomBinaryOp<CustomBinaryFunc, LhsXprType, RhsXprType>& type;
 };
 
-template<typename CustomBinaryFunc, typename LhsXprType, typename RhsXprType>
-struct nested<TensorCustomBinaryOp<CustomBinaryFunc, LhsXprType, RhsXprType> >
-{
+template <typename CustomBinaryFunc, typename LhsXprType, typename RhsXprType>
+struct nested<TensorCustomBinaryOp<CustomBinaryFunc, LhsXprType, RhsXprType> > {
   typedef TensorCustomBinaryOp<CustomBinaryFunc, LhsXprType, RhsXprType> type;
 };
 
 }  // end namespace internal
 
-
-
-template<typename CustomBinaryFunc, typename LhsXprType, typename RhsXprType>
-class TensorCustomBinaryOp : public TensorBase<TensorCustomBinaryOp<CustomBinaryFunc, LhsXprType, RhsXprType>, ReadOnlyAccessors>
-{
-  public:
+template <typename CustomBinaryFunc, typename LhsXprType, typename RhsXprType>
+class TensorCustomBinaryOp
+    : public TensorBase<TensorCustomBinaryOp<CustomBinaryFunc, LhsXprType, RhsXprType>, ReadOnlyAccessors> {
+ public:
   typedef typename internal::traits<TensorCustomBinaryOp>::Scalar Scalar;
   typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
   typedef typename internal::traits<TensorCustomBinaryOp>::CoeffReturnType CoeffReturnType;
@@ -222,32 +201,30 @@
   typedef typename internal::traits<TensorCustomBinaryOp>::StorageKind StorageKind;
   typedef typename internal::traits<TensorCustomBinaryOp>::Index Index;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCustomBinaryOp(const LhsXprType& lhs, const RhsXprType& rhs, const CustomBinaryFunc& func)
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCustomBinaryOp(const LhsXprType& lhs, const RhsXprType& rhs,
+                                                             const CustomBinaryFunc& func)
 
       : m_lhs_xpr(lhs), m_rhs_xpr(rhs), m_func(func) {}
 
-  EIGEN_DEVICE_FUNC
-  const CustomBinaryFunc& func() const { return m_func; }
+  EIGEN_DEVICE_FUNC const CustomBinaryFunc& func() const { return m_func; }
 
-  EIGEN_DEVICE_FUNC
-  const internal::remove_all_t<typename LhsXprType::Nested>&
-  lhsExpression() const { return m_lhs_xpr; }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename LhsXprType::Nested>& lhsExpression() const {
+    return m_lhs_xpr;
+  }
 
-  EIGEN_DEVICE_FUNC
-  const internal::remove_all_t<typename RhsXprType::Nested>&
-  rhsExpression() const { return m_rhs_xpr; }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename RhsXprType::Nested>& rhsExpression() const {
+    return m_rhs_xpr;
+  }
 
-  protected:
-    typename LhsXprType::Nested m_lhs_xpr;
-    typename RhsXprType::Nested m_rhs_xpr;
-    const CustomBinaryFunc m_func;
+ protected:
+  typename LhsXprType::Nested m_lhs_xpr;
+  typename RhsXprType::Nested m_rhs_xpr;
+  const CustomBinaryFunc m_func;
 };
 
-
 // Eval as rvalue
-template<typename CustomBinaryFunc, typename LhsXprType, typename RhsXprType, typename Device>
-struct TensorEvaluator<const TensorCustomBinaryOp<CustomBinaryFunc, LhsXprType, RhsXprType>, Device>
-{
+template <typename CustomBinaryFunc, typename LhsXprType, typename RhsXprType, typename Device>
+struct TensorEvaluator<const TensorCustomBinaryOp<CustomBinaryFunc, LhsXprType, RhsXprType>, Device> {
   typedef TensorCustomBinaryOp<CustomBinaryFunc, LhsXprType, RhsXprType> XprType;
   typedef typename internal::traits<XprType>::Index Index;
   static constexpr int NumDims = internal::traits<XprType>::NumDimensions;
@@ -276,8 +253,7 @@
   //===--------------------------------------------------------------------===//
 
   EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
-      : m_op(op), m_device(device), m_result(NULL)
-  {
+      : m_op(op), m_device(device), m_result(NULL) {
     m_dimensions = op.func().dimensions(op.lhsExpression(), op.rhsExpression());
   }
 
@@ -288,8 +264,8 @@
       evalTo(data);
       return false;
     } else {
-      m_result = static_cast<EvaluatorPointerType>(m_device.get( (CoeffReturnType*)
-        m_device.allocate_temp(dimensions().TotalSize() * sizeof(CoeffReturnType))));
+      m_result = static_cast<EvaluatorPointerType>(
+          m_device.get((CoeffReturnType*)m_device.allocate_temp(dimensions().TotalSize() * sizeof(CoeffReturnType))));
       evalTo(m_result);
       return true;
     }
@@ -302,11 +278,9 @@
     }
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
-    return m_result[index];
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const { return m_result[index]; }
 
-  template<int LoadMode>
+  template <int LoadMode>
   EIGEN_DEVICE_FUNC PacketReturnType packet(Index index) const {
     return internal::ploadt<PacketReturnType, LoadMode>(m_result + index);
   }
@@ -318,7 +292,6 @@
 
   EIGEN_DEVICE_FUNC EvaluatorPointerType data() const { return m_result; }
 
-
  protected:
   void evalTo(EvaluatorPointerType data) {
     TensorMap<Tensor<CoeffReturnType, NumDims, Layout> > result(m_device.get(data), m_dimensions);
@@ -331,7 +304,6 @@
   EvaluatorPointerType m_result;
 };
 
+}  // end namespace Eigen
 
-} // end namespace Eigen
-
-#endif // EIGEN_CXX11_TENSOR_TENSOR_CUSTOM_OP_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_CUSTOM_OP_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorDevice.h b/unsupported/Eigen/CXX11/src/Tensor/TensorDevice.h
index b21cd44..9898fdc 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorDevice.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorDevice.h
@@ -16,56 +16,58 @@
 namespace Eigen {
 
 /** \class TensorDevice
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Pseudo expression providing an operator = that will evaluate its argument
-  * on the specified computing 'device' (GPU, thread pool, ...)
-  *
-  * Example:
-  *    C.device(EIGEN_GPU) = A + B;
-  *
-  * Todo: operator *= and /=.
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Pseudo expression providing an operator = that will evaluate its argument
+ * on the specified computing 'device' (GPU, thread pool, ...)
+ *
+ * Example:
+ *    C.device(EIGEN_GPU) = A + B;
+ *
+ * Todo: operator *= and /=.
+ */
 
-template <typename ExpressionType, typename DeviceType> class TensorDevice {
-  public:
-    TensorDevice(const DeviceType& device, ExpressionType& expression) : m_device(device), m_expression(expression) {}
+template <typename ExpressionType, typename DeviceType>
+class TensorDevice {
+ public:
+  TensorDevice(const DeviceType& device, ExpressionType& expression) : m_device(device), m_expression(expression) {}
 
-    EIGEN_DEFAULT_COPY_CONSTRUCTOR(TensorDevice)
+  EIGEN_DEFAULT_COPY_CONSTRUCTOR(TensorDevice)
 
-    template<typename OtherDerived>
-    EIGEN_STRONG_INLINE TensorDevice& operator=(const OtherDerived& other) {
-      typedef TensorAssignOp<ExpressionType, const OtherDerived> Assign;
-      Assign assign(m_expression, other);
-      internal::TensorExecutor<const Assign, DeviceType>::run(assign, m_device);
-      return *this;
-    }
+  template <typename OtherDerived>
+  EIGEN_STRONG_INLINE TensorDevice& operator=(const OtherDerived& other) {
+    typedef TensorAssignOp<ExpressionType, const OtherDerived> Assign;
+    Assign assign(m_expression, other);
+    internal::TensorExecutor<const Assign, DeviceType>::run(assign, m_device);
+    return *this;
+  }
 
-    template<typename OtherDerived>
-    EIGEN_STRONG_INLINE TensorDevice& operator+=(const OtherDerived& other) {
-      typedef typename OtherDerived::Scalar Scalar;
-      typedef TensorCwiseBinaryOp<internal::scalar_sum_op<Scalar>, const ExpressionType, const OtherDerived> Sum;
-      Sum sum(m_expression, other);
-      typedef TensorAssignOp<ExpressionType, const Sum> Assign;
-      Assign assign(m_expression, sum);
-      internal::TensorExecutor<const Assign, DeviceType>::run(assign, m_device);
-      return *this;
-    }
+  template <typename OtherDerived>
+  EIGEN_STRONG_INLINE TensorDevice& operator+=(const OtherDerived& other) {
+    typedef typename OtherDerived::Scalar Scalar;
+    typedef TensorCwiseBinaryOp<internal::scalar_sum_op<Scalar>, const ExpressionType, const OtherDerived> Sum;
+    Sum sum(m_expression, other);
+    typedef TensorAssignOp<ExpressionType, const Sum> Assign;
+    Assign assign(m_expression, sum);
+    internal::TensorExecutor<const Assign, DeviceType>::run(assign, m_device);
+    return *this;
+  }
 
-    template<typename OtherDerived>
-    EIGEN_STRONG_INLINE TensorDevice& operator-=(const OtherDerived& other) {
-      typedef typename OtherDerived::Scalar Scalar;
-      typedef TensorCwiseBinaryOp<internal::scalar_difference_op<Scalar>, const ExpressionType, const OtherDerived> Difference;
-      Difference difference(m_expression, other);
-      typedef TensorAssignOp<ExpressionType, const Difference> Assign;
-      Assign assign(m_expression, difference);
-      internal::TensorExecutor<const Assign, DeviceType>::run(assign, m_device);
-      return *this;
-    }
+  template <typename OtherDerived>
+  EIGEN_STRONG_INLINE TensorDevice& operator-=(const OtherDerived& other) {
+    typedef typename OtherDerived::Scalar Scalar;
+    typedef TensorCwiseBinaryOp<internal::scalar_difference_op<Scalar>, const ExpressionType, const OtherDerived>
+        Difference;
+    Difference difference(m_expression, other);
+    typedef TensorAssignOp<ExpressionType, const Difference> Assign;
+    Assign assign(m_expression, difference);
+    internal::TensorExecutor<const Assign, DeviceType>::run(assign, m_device);
+    return *this;
+  }
 
-  protected:
-    const DeviceType& m_device;
-    ExpressionType& m_expression;
+ protected:
+  const DeviceType& m_device;
+  ExpressionType& m_expression;
 };
 
 /** \class TensorAsyncDevice
@@ -85,8 +87,7 @@
 template <typename ExpressionType, typename DeviceType, typename DoneCallback>
 class TensorAsyncDevice {
  public:
-  TensorAsyncDevice(const DeviceType& device, ExpressionType& expression,
-                    DoneCallback done)
+  TensorAsyncDevice(const DeviceType& device, ExpressionType& expression, DoneCallback done)
       : m_device(device), m_expression(expression), m_done(std::move(done)) {}
 
   template <typename OtherDerived>
@@ -107,13 +108,11 @@
   DoneCallback m_done;
 };
 
-
 #ifdef EIGEN_USE_THREADS
 template <typename ExpressionType, typename DoneCallback>
 class TensorAsyncDevice<ExpressionType, ThreadPoolDevice, DoneCallback> {
  public:
-  TensorAsyncDevice(const ThreadPoolDevice& device, ExpressionType& expression,
-                    DoneCallback done)
+  TensorAsyncDevice(const ThreadPoolDevice& device, ExpressionType& expression, DoneCallback done)
       : m_device(device), m_expression(expression), m_done(std::move(done)) {}
 
   template <typename OtherDerived>
@@ -135,6 +134,6 @@
 };
 #endif
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_CXX11_TENSOR_TENSOR_DEVICE_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_DEVICE_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceCuda.h b/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceCuda.h
index f779239..c2c8ed0 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceCuda.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceCuda.h
@@ -1,6 +1,7 @@
 
 #if defined(__clang__) || defined(__GNUC__)
-#warning "Deprecated header file, please either include the main Eigen/CXX11/Tensor header or the respective TensorDeviceGpu.h file"
+#warning \
+    "Deprecated header file, please either include the main Eigen/CXX11/Tensor header or the respective TensorDeviceGpu.h file"
 #endif
 
 #include "TensorDeviceGpu.h"
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceDefault.h b/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceDefault.h
index f028912..eaaf332 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceDefault.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceDefault.h
@@ -10,7 +10,6 @@
 #ifndef EIGEN_CXX11_TENSOR_TENSOR_DEVICE_DEFAULT_H
 #define EIGEN_CXX11_TENSOR_TENSOR_DEVICE_DEFAULT_H
 
-
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
@@ -21,15 +20,9 @@
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void* allocate(size_t num_bytes) const {
     return internal::aligned_malloc(num_bytes);
   }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void deallocate(void* buffer) const {
-    internal::aligned_free(buffer);
-  }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void* allocate_temp(size_t num_bytes) const {
-    return allocate(num_bytes);
-  }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void deallocate_temp(void* buffer) const {
-    deallocate(buffer);
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void deallocate(void* buffer) const { internal::aligned_free(buffer); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void* allocate_temp(size_t num_bytes) const { return allocate(num_bytes); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void deallocate_temp(void* buffer) const { deallocate(buffer); }
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void memcpy(void* dst, const void* src, size_t n) const {
     ::memcpy(dst, src, n);
   }
@@ -39,10 +32,8 @@
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void memcpyDeviceToHost(void* dst, const void* src, size_t n) const {
     memcpy(dst, src, n);
   }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void memset(void* buffer, int c, size_t n) const {
-    ::memset(buffer, c, n);
-  }
-  template<typename T>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void memset(void* buffer, int c, size_t n) const { ::memset(buffer, c, n); }
+  template <typename T>
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void fill(T* begin, T* end, const T& value) const {
 #ifdef EIGEN_GPU_COMPILE_PHASE
     // std::fill is not a device function, so resort to simple loop.
@@ -53,8 +44,8 @@
     std::fill(begin, end, value);
 #endif
   }
-  template<typename Type>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Type get(Type data) const { 
+  template <typename Type>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Type get(Type data) const {
     return data;
   }
 
@@ -77,10 +68,10 @@
     return l1CacheSize();
 #elif defined(EIGEN_HIP_DEVICE_COMPILE)
     // Running on a HIP device
-    return 48*1024; // FIXME : update this number for HIP
+    return 48 * 1024;  // FIXME : update this number for HIP
 #else
     // Running on a CUDA device, return the amount of shared memory available.
-    return 48*1024;
+    return 48 * 1024;
 #endif
   }
 
@@ -90,13 +81,13 @@
     return l3CacheSize();
 #elif defined(EIGEN_HIP_DEVICE_COMPILE)
     // Running on a HIP device
-    return firstLevelCacheSize(); // FIXME : update this number for HIP
+    return firstLevelCacheSize();  // FIXME : update this number for HIP
 #else
     // Running on a CUDA device
     return firstLevelCacheSize();
 #endif
   }
-  
+
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void synchronize() const {
     // Nothing.  Default device operations are synchronous.
   }
@@ -119,4 +110,4 @@
 
 }  // namespace Eigen
 
-#endif // EIGEN_CXX11_TENSOR_TENSOR_DEVICE_DEFAULT_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_DEVICE_DEFAULT_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceGpu.h b/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceGpu.h
index 950fe39..4c24bc1 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceGpu.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceGpu.h
@@ -12,7 +12,7 @@
 
 // This header file container defines fo gpu* macros which will resolve to
 // their equivalent hip* or cuda* versions depending on the compiler in use
-// A separate header (included at the end of this file) will undefine all 
+// A separate header (included at the end of this file) will undefine all
 #include "TensorGpuHipCudaDefines.h"
 
 // IWYU pragma: private
@@ -47,22 +47,17 @@
 
 class GpuDeviceProperties {
  public:
-  GpuDeviceProperties() : 
-      initialized_(false), first_(true), device_properties_(nullptr) {}
- 
+  GpuDeviceProperties() : initialized_(false), first_(true), device_properties_(nullptr) {}
+
   ~GpuDeviceProperties() {
     if (device_properties_) {
       delete[] device_properties_;
     }
   }
-  
-  EIGEN_STRONG_INLINE const gpuDeviceProp_t& get(int device) const {
-    return device_properties_[device];
-  }
 
-  EIGEN_STRONG_INLINE bool isInitialized() const {
-    return initialized_;
-  }
+  EIGEN_STRONG_INLINE const gpuDeviceProp_t& get(int device) const { return device_properties_[device]; }
+
+  EIGEN_STRONG_INLINE bool isInitialized() const { return initialized_; }
 
   void initialize() {
     if (!initialized_) {
@@ -77,20 +72,14 @@
         int num_devices;
         gpuError_t status = gpuGetDeviceCount(&num_devices);
         if (status != gpuSuccess) {
-          std::cerr << "Failed to get the number of GPU devices: "
-                    << gpuGetErrorString(status)
-                    << std::endl;
+          std::cerr << "Failed to get the number of GPU devices: " << gpuGetErrorString(status) << std::endl;
           gpu_assert(status == gpuSuccess);
         }
         device_properties_ = new gpuDeviceProp_t[num_devices];
         for (int i = 0; i < num_devices; ++i) {
           status = gpuGetDeviceProperties(&device_properties_[i], i);
           if (status != gpuSuccess) {
-            std::cerr << "Failed to initialize GPU device #"
-                      << i
-                      << ": "
-                      << gpuGetErrorString(status)
-                      << std::endl;
+            std::cerr << "Failed to initialize GPU device #" << i << ": " << gpuGetErrorString(status) << std::endl;
             gpu_assert(status == gpuSuccess);
           }
         }
@@ -133,9 +122,7 @@
   GpuStreamDevice() : stream_(&default_stream), scratch_(NULL), semaphore_(NULL) {
     gpuError_t status = gpuGetDevice(&device_);
     if (status != gpuSuccess) {
-      std::cerr << "Failed to get the GPU devices "
-                << gpuGetErrorString(status)
-                << std::endl;
+      std::cerr << "Failed to get the GPU devices " << gpuGetErrorString(status) << std::endl;
       gpu_assert(status == gpuSuccess);
     }
   }
@@ -150,9 +137,7 @@
     if (device < 0) {
       gpuError_t status = gpuGetDevice(&device_);
       if (status != gpuSuccess) {
-        std::cerr << "Failed to get the GPU devices "
-                  << gpuGetErrorString(status)
-                  << std::endl;
+        std::cerr << "Failed to get the GPU devices " << gpuGetErrorString(status) << std::endl;
         gpu_assert(status == gpuSuccess);
       }
     } else {
@@ -172,9 +157,7 @@
   }
 
   const gpuStream_t& stream() const { return *stream_; }
-  const gpuDeviceProp_t& deviceProperties() const {
-    return GetGpuDeviceProperties(device_);
-  }
+  const gpuDeviceProp_t& deviceProperties() const { return GetGpuDeviceProperties(device_); }
   virtual void* allocate(size_t num_bytes) const {
     gpuError_t err = gpuSetDevice(device_);
     EIGEN_UNUSED_VARIABLE(err)
@@ -222,50 +205,33 @@
 struct GpuDevice {
   // The StreamInterface is not owned: the caller is
   // responsible for its initialization and eventual destruction.
-  explicit GpuDevice(const StreamInterface* stream) : stream_(stream), max_blocks_(INT_MAX) {
-    eigen_assert(stream);
-  }
+  explicit GpuDevice(const StreamInterface* stream) : stream_(stream), max_blocks_(INT_MAX) { eigen_assert(stream); }
   explicit GpuDevice(const StreamInterface* stream, int num_blocks) : stream_(stream), max_blocks_(num_blocks) {
     eigen_assert(stream);
   }
   // TODO(bsteiner): This is an internal API, we should not expose it.
-  EIGEN_STRONG_INLINE const gpuStream_t& stream() const {
-    return stream_->stream();
-  }
+  EIGEN_STRONG_INLINE const gpuStream_t& stream() const { return stream_->stream(); }
 
-  EIGEN_STRONG_INLINE void* allocate(size_t num_bytes) const {
-    return stream_->allocate(num_bytes);
-  }
+  EIGEN_STRONG_INLINE void* allocate(size_t num_bytes) const { return stream_->allocate(num_bytes); }
 
-  EIGEN_STRONG_INLINE void deallocate(void* buffer) const {
-    stream_->deallocate(buffer);
-  }
+  EIGEN_STRONG_INLINE void deallocate(void* buffer) const { stream_->deallocate(buffer); }
 
-  EIGEN_STRONG_INLINE void* allocate_temp(size_t num_bytes) const {
-    return stream_->allocate(num_bytes);
-  }
+  EIGEN_STRONG_INLINE void* allocate_temp(size_t num_bytes) const { return stream_->allocate(num_bytes); }
 
-  EIGEN_STRONG_INLINE void deallocate_temp(void* buffer) const {
-    stream_->deallocate(buffer);
-  }
+  EIGEN_STRONG_INLINE void deallocate_temp(void* buffer) const { stream_->deallocate(buffer); }
 
-  template<typename Type>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Type get(Type data) const { 
+  template <typename Type>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Type get(Type data) const {
     return data;
   }
 
-  EIGEN_STRONG_INLINE void* scratchpad() const {
-    return stream_->scratchpad();
-  }
+  EIGEN_STRONG_INLINE void* scratchpad() const { return stream_->scratchpad(); }
 
-  EIGEN_STRONG_INLINE unsigned int* semaphore() const {
-    return stream_->semaphore();
-  }
+  EIGEN_STRONG_INLINE unsigned int* semaphore() const { return stream_->semaphore(); }
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void memcpy(void* dst, const void* src, size_t n) const {
 #ifndef EIGEN_GPU_COMPILE_PHASE
-    gpuError_t err = gpuMemcpyAsync(dst, src, n, gpuMemcpyDeviceToDevice,
-                                      stream_->stream());
+    gpuError_t err = gpuMemcpyAsync(dst, src, n, gpuMemcpyDeviceToDevice, stream_->stream());
     EIGEN_UNUSED_VARIABLE(err)
     gpu_assert(err == gpuSuccess);
 #else
@@ -277,15 +243,13 @@
   }
 
   EIGEN_STRONG_INLINE void memcpyHostToDevice(void* dst, const void* src, size_t n) const {
-    gpuError_t err =
-        gpuMemcpyAsync(dst, src, n, gpuMemcpyHostToDevice, stream_->stream());
+    gpuError_t err = gpuMemcpyAsync(dst, src, n, gpuMemcpyHostToDevice, stream_->stream());
     EIGEN_UNUSED_VARIABLE(err)
     gpu_assert(err == gpuSuccess);
   }
 
   EIGEN_STRONG_INLINE void memcpyDeviceToHost(void* dst, const void* src, size_t n) const {
-    gpuError_t err =
-        gpuMemcpyAsync(dst, src, n, gpuMemcpyDeviceToHost, stream_->stream());
+    gpuError_t err = gpuMemcpyAsync(dst, src, n, gpuMemcpyDeviceToHost, stream_->stream());
     EIGEN_UNUSED_VARIABLE(err)
     gpu_assert(err == gpuSuccess);
   }
@@ -296,14 +260,14 @@
     EIGEN_UNUSED_VARIABLE(err)
     gpu_assert(err == gpuSuccess);
 #else
-  EIGEN_UNUSED_VARIABLE(buffer)
-  EIGEN_UNUSED_VARIABLE(c)
-  EIGEN_UNUSED_VARIABLE(n)
-  eigen_assert(false && "The default device should be used instead to generate kernel code");
+    EIGEN_UNUSED_VARIABLE(buffer)
+    EIGEN_UNUSED_VARIABLE(c)
+    EIGEN_UNUSED_VARIABLE(n)
+    eigen_assert(false && "The default device should be used instead to generate kernel code");
 #endif
   }
 
-  template<typename T>
+  template <typename T>
   EIGEN_STRONG_INLINE void fill(T* begin, T* end, const T& value) const {
 #ifndef EIGEN_GPU_COMPILE_PHASE
     const size_t count = end - begin;
@@ -313,21 +277,21 @@
     char* value_bytes = (char*)(&value);
     gpuError_t err;
     EIGEN_UNUSED_VARIABLE(err)
-    
+
     // If all value bytes are equal, then a single memset can be much faster.
     bool use_single_memset = true;
-    for (int i=1; i<value_size; ++i) {
+    for (int i = 1; i < value_size; ++i) {
       if (value_bytes[i] != value_bytes[0]) {
         use_single_memset = false;
-      } 
+      }
     }
-    
+
     if (use_single_memset) {
       err = gpuMemsetAsync(buffer, value_bytes[0], count * sizeof(T), stream_->stream());
       gpu_assert(err == gpuSuccess);
     } else {
-      for (int b=0; b<value_size; ++b) {
-        err = gpuMemset2DAsync(buffer+b, value_size, value_bytes[b], 1, count, stream_->stream());
+      for (int b = 0; b < value_size; ++b) {
+        err = gpuMemset2DAsync(buffer + b, value_size, value_bytes[b], 1, count, stream_->stream());
         gpu_assert(err == gpuSuccess);
       }
     }
@@ -346,7 +310,7 @@
 
   EIGEN_STRONG_INLINE size_t firstLevelCacheSize() const {
     // FIXME
-    return 48*1024;
+    return 48 * 1024;
   }
 
   EIGEN_STRONG_INLINE size_t lastLevelCacheSize() const {
@@ -359,9 +323,7 @@
 #ifndef EIGEN_GPU_COMPILE_PHASE
     gpuError_t err = gpuStreamSynchronize(stream_->stream());
     if (err != gpuSuccess) {
-      std::cerr << "Error detected in GPU stream: "
-                << gpuGetErrorString(err)
-                << std::endl;
+      std::cerr << "Error detected in GPU stream: " << gpuGetErrorString(err) << std::endl;
       gpu_assert(err == gpuSuccess);
     }
 #else
@@ -369,28 +331,18 @@
 #endif
   }
 
-  EIGEN_STRONG_INLINE int getNumGpuMultiProcessors() const {
-    return stream_->deviceProperties().multiProcessorCount;
-  }
-  EIGEN_STRONG_INLINE int maxGpuThreadsPerBlock() const {
-    return stream_->deviceProperties().maxThreadsPerBlock;
-  }
+  EIGEN_STRONG_INLINE int getNumGpuMultiProcessors() const { return stream_->deviceProperties().multiProcessorCount; }
+  EIGEN_STRONG_INLINE int maxGpuThreadsPerBlock() const { return stream_->deviceProperties().maxThreadsPerBlock; }
   EIGEN_STRONG_INLINE int maxGpuThreadsPerMultiProcessor() const {
     return stream_->deviceProperties().maxThreadsPerMultiProcessor;
   }
   EIGEN_STRONG_INLINE int sharedMemPerBlock() const {
     return static_cast<int>(stream_->deviceProperties().sharedMemPerBlock);
   }
-  EIGEN_STRONG_INLINE int majorDeviceVersion() const {
-    return stream_->deviceProperties().major;
-  }
-  EIGEN_STRONG_INLINE int minorDeviceVersion() const {
-    return stream_->deviceProperties().minor;
-  }
+  EIGEN_STRONG_INLINE int majorDeviceVersion() const { return stream_->deviceProperties().major; }
+  EIGEN_STRONG_INLINE int minorDeviceVersion() const { return stream_->deviceProperties().minor; }
 
-  EIGEN_STRONG_INLINE int maxBlocks() const {
-    return max_blocks_;
-  }
+  EIGEN_STRONG_INLINE int maxBlocks() const { return max_blocks_; }
 
   // This function checks if the GPU runtime recorded an error for the
   // underlying stream device.
@@ -410,18 +362,18 @@
 
 #if defined(EIGEN_HIPCC)
 
-#define LAUNCH_GPU_KERNEL(kernel, gridsize, blocksize, sharedmem, device, ...)             \
+#define LAUNCH_GPU_KERNEL(kernel, gridsize, blocksize, sharedmem, device, ...)                              \
   hipLaunchKernelGGL(kernel, dim3(gridsize), dim3(blocksize), (sharedmem), (device).stream(), __VA_ARGS__); \
   gpu_assert(hipGetLastError() == hipSuccess);
 
 #else
- 
-#define LAUNCH_GPU_KERNEL(kernel, gridsize, blocksize, sharedmem, device, ...)             \
-  (kernel) <<< (gridsize), (blocksize), (sharedmem), (device).stream() >>> (__VA_ARGS__);   \
+
+#define LAUNCH_GPU_KERNEL(kernel, gridsize, blocksize, sharedmem, device, ...)        \
+  (kernel)<<<(gridsize), (blocksize), (sharedmem), (device).stream()>>>(__VA_ARGS__); \
   gpu_assert(cudaGetLastError() == cudaSuccess);
 
 #endif
- 
+
 // FIXME: Should be device and kernel specific.
 #ifdef EIGEN_GPUCC
 static EIGEN_DEVICE_FUNC inline void setGpuSharedMemConfig(gpuSharedMemConfig config) {
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceSycl.h b/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceSycl.h
index ddfd93b..b291fed 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceSycl.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceSycl.h
@@ -27,35 +27,15 @@
 /// Cache all the device information needed
 struct SyclDeviceInfo {
   SyclDeviceInfo(cl::sycl::queue queue)
-      : local_mem_type(
-            queue.get_device()
-                .template get_info<cl::sycl::info::device::local_mem_type>()),
-        max_work_item_sizes(
-            queue.get_device()
-                .template get_info<
-                    cl::sycl::info::device::max_work_item_sizes<3>>()),
-        max_mem_alloc_size(
-            queue.get_device()
-                .template get_info<
-                    cl::sycl::info::device::max_mem_alloc_size>()),
-        max_compute_units(queue.get_device()
-                              .template get_info<
-                                  cl::sycl::info::device::max_compute_units>()),
-        max_work_group_size(
-            queue.get_device()
-                .template get_info<
-                    cl::sycl::info::device::max_work_group_size>()),
-        local_mem_size(
-            queue.get_device()
-                .template get_info<cl::sycl::info::device::local_mem_size>()),
-        platform_name(queue.get_device()
-                          .get_platform()
-                          .template get_info<cl::sycl::info::platform::name>()),
-        device_name(queue.get_device()
-                        .template get_info<cl::sycl::info::device::name>()),
-        device_vendor(
-            queue.get_device()
-                .template get_info<cl::sycl::info::device::vendor>()) {}
+      : local_mem_type(queue.get_device().template get_info<cl::sycl::info::device::local_mem_type>()),
+        max_work_item_sizes(queue.get_device().template get_info<cl::sycl::info::device::max_work_item_sizes<3>>()),
+        max_mem_alloc_size(queue.get_device().template get_info<cl::sycl::info::device::max_mem_alloc_size>()),
+        max_compute_units(queue.get_device().template get_info<cl::sycl::info::device::max_compute_units>()),
+        max_work_group_size(queue.get_device().template get_info<cl::sycl::info::device::max_work_group_size>()),
+        local_mem_size(queue.get_device().template get_info<cl::sycl::info::device::local_mem_size>()),
+        platform_name(queue.get_device().get_platform().template get_info<cl::sycl::info::platform::name>()),
+        device_name(queue.get_device().template get_info<cl::sycl::info::device::name>()),
+        device_vendor(queue.get_device().template get_info<cl::sycl::info::device::vendor>()) {}
 
   cl::sycl::info::local_mem_type local_mem_type;
   cl::sycl::id<3> max_work_item_sizes;
@@ -74,8 +54,7 @@
 // All devices (even AMD CPU with intel OpenCL runtime) that support OpenCL and
 // can consume SPIR or SPIRV can use the Eigen SYCL backend and consequently
 // TensorFlow via the Eigen SYCL Backend.
-EIGEN_STRONG_INLINE auto get_sycl_supported_devices()
-    -> decltype(cl::sycl::device::get_devices()) {
+EIGEN_STRONG_INLINE auto get_sycl_supported_devices() -> decltype(cl::sycl::device::get_devices()) {
 #ifdef EIGEN_SYCL_USE_DEFAULT_SELECTOR
   return {cl::sycl::device(cl::sycl::default_selector())};
 #else
@@ -83,18 +62,14 @@
   auto platform_list = cl::sycl::platform::get_platforms();
   for (const auto &platform : platform_list) {
     auto device_list = platform.get_devices();
-    auto platform_name =
-        platform.template get_info<cl::sycl::info::platform::name>();
-    std::transform(platform_name.begin(), platform_name.end(),
-                   platform_name.begin(), ::tolower);
+    auto platform_name = platform.template get_info<cl::sycl::info::platform::name>();
+    std::transform(platform_name.begin(), platform_name.end(), platform_name.begin(), ::tolower);
     for (const auto &device : device_list) {
       auto vendor = device.template get_info<cl::sycl::info::device::vendor>();
       std::transform(vendor.begin(), vendor.end(), vendor.begin(), ::tolower);
-      bool unsupported_condition =
-          (device.is_cpu() && platform_name.find("amd") != std::string::npos &&
-           vendor.find("apu") == std::string::npos) ||
-          (platform_name.find("experimental") != std::string::npos) ||
-          device.is_host();
+      bool unsupported_condition = (device.is_cpu() && platform_name.find("amd") != std::string::npos &&
+                                    vendor.find("apu") == std::string::npos) ||
+                                   (platform_name.find("experimental") != std::string::npos) || device.is_host();
       if (!unsupported_condition) {
         supported_devices.push_back(device);
       }
@@ -108,33 +83,25 @@
  public:
   /// Creating device by using cl::sycl::selector or cl::sycl::device.
   template <typename DeviceOrSelector>
-  explicit QueueInterface(
-      const DeviceOrSelector &dev_or_sel, cl::sycl::async_handler handler,
-      unsigned num_threads = std::thread::hardware_concurrency())
+  explicit QueueInterface(const DeviceOrSelector &dev_or_sel, cl::sycl::async_handler handler,
+                          unsigned num_threads = std::thread::hardware_concurrency())
       : m_queue{dev_or_sel, handler, {sycl::property::queue::in_order()}},
         m_thread_pool(num_threads),
         m_device_info(m_queue) {}
 
   template <typename DeviceOrSelector>
-  explicit QueueInterface(
-      const DeviceOrSelector &dev_or_sel,
-      unsigned num_threads = std::thread::hardware_concurrency())
+  explicit QueueInterface(const DeviceOrSelector &dev_or_sel,
+                          unsigned num_threads = std::thread::hardware_concurrency())
       : QueueInterface(
-            dev_or_sel,
-            [this](cl::sycl::exception_list l) {
-              this->exception_caught_ = this->sycl_async_handler(l);
-            },
+            dev_or_sel, [this](cl::sycl::exception_list l) { this->exception_caught_ = this->sycl_async_handler(l); },
             num_threads) {}
 
-  explicit QueueInterface(
-      const cl::sycl::queue &q,
-      unsigned num_threads = std::thread::hardware_concurrency())
+  explicit QueueInterface(const cl::sycl::queue &q, unsigned num_threads = std::thread::hardware_concurrency())
       : m_queue(q), m_thread_pool(num_threads), m_device_info(m_queue) {}
 
   EIGEN_STRONG_INLINE void *allocate(size_t num_bytes) const {
 #if EIGEN_MAX_ALIGN_BYTES > 0
-    return (void *)cl::sycl::aligned_alloc_device(EIGEN_MAX_ALIGN_BYTES,
-                                                  num_bytes, m_queue);
+    return (void *)cl::sycl::aligned_alloc_device(EIGEN_MAX_ALIGN_BYTES, num_bytes, m_queue);
 #else
     return (void *)cl::sycl::malloc_device(num_bytes, m_queue);
 #endif
@@ -151,21 +118,16 @@
 
   EIGEN_STRONG_INLINE void deallocate_temp(void *p) const { deallocate(p); }
 
-  EIGEN_STRONG_INLINE void deallocate_temp(const void *p) const {
-    deallocate_temp(const_cast<void *>(p));
-  }
+  EIGEN_STRONG_INLINE void deallocate_temp(const void *p) const { deallocate_temp(const_cast<void *>(p)); }
 
-  EIGEN_STRONG_INLINE void deallocate(void *p) const {
-    cl::sycl::free(p, m_queue);
-  }
+  EIGEN_STRONG_INLINE void deallocate(void *p) const { cl::sycl::free(p, m_queue); }
 
   /// The memcpyHostToDevice is used to copy the data from host to device
   /// The destination pointer could be deleted before the copy happened which is
   /// why a callback function is needed. By default if none is provided, the
   /// function is blocking.
-  EIGEN_STRONG_INLINE void memcpyHostToDevice(
-      void *dst, const void *src, size_t n,
-      std::function<void()> callback) const {
+  EIGEN_STRONG_INLINE void memcpyHostToDevice(void *dst, const void *src, size_t n,
+                                              std::function<void()> callback) const {
     auto e = m_queue.memcpy(dst, src, n);
     synchronize_and_callback(e, callback);
   }
@@ -174,9 +136,8 @@
   /// The source pointer could be deleted before the copy happened which is
   /// why a callback function is needed. By default if none is provided, the
   /// function is blocking.
-  EIGEN_STRONG_INLINE void memcpyDeviceToHost(
-      void *dst, const void *src, size_t n,
-      std::function<void()> callback) const {
+  EIGEN_STRONG_INLINE void memcpyDeviceToHost(void *dst, const void *src, size_t n,
+                                              std::function<void()> callback) const {
     if (n == 0) {
       if (callback) callback();
       return;
@@ -214,55 +175,40 @@
     m_queue.fill(begin, value, count).wait();
   }
 
-  template <typename OutScalar, typename sycl_kernel, typename Lhs,
-            typename Rhs, typename OutPtr, typename Range, typename Index,
+  template <typename OutScalar, typename sycl_kernel, typename Lhs, typename Rhs, typename OutPtr, typename Range,
+            typename Index, typename... T>
+  EIGEN_ALWAYS_INLINE cl::sycl::event binary_kernel_launcher(const Lhs &lhs, const Rhs &rhs, OutPtr outptr,
+                                                             Range thread_range, Index scratchSize, T... var) const {
+    auto kernel_functor = [=](cl::sycl::handler &cgh) {
+      typedef cl::sycl::accessor<OutScalar, 1, cl::sycl::access::mode::read_write, cl::sycl::access::target::local>
+          LocalAccessor;
+
+      LocalAccessor scratch(cl::sycl::range<1>(scratchSize), cgh);
+      cgh.parallel_for(thread_range, sycl_kernel(scratch, lhs, rhs, outptr, var...));
+    };
+
+    return m_queue.submit(kernel_functor);
+  }
+
+  template <typename OutScalar, typename sycl_kernel, typename InPtr, typename OutPtr, typename Range, typename Index,
             typename... T>
-  EIGEN_ALWAYS_INLINE cl::sycl::event binary_kernel_launcher(
-      const Lhs &lhs, const Rhs &rhs, OutPtr outptr, Range thread_range,
-      Index scratchSize, T... var) const {
+  EIGEN_ALWAYS_INLINE cl::sycl::event unary_kernel_launcher(const InPtr &inptr, OutPtr &outptr, Range thread_range,
+                                                            Index scratchSize, T... var) const {
     auto kernel_functor = [=](cl::sycl::handler &cgh) {
-      typedef cl::sycl::accessor<OutScalar, 1,
-                                 cl::sycl::access::mode::read_write,
-                                 cl::sycl::access::target::local>
+      typedef cl::sycl::accessor<OutScalar, 1, cl::sycl::access::mode::read_write, cl::sycl::access::target::local>
           LocalAccessor;
 
       LocalAccessor scratch(cl::sycl::range<1>(scratchSize), cgh);
-      cgh.parallel_for(thread_range,
-                       sycl_kernel(scratch, lhs, rhs, outptr, var...));
-    };
-
-    return m_queue.submit(kernel_functor);
-  }
-
-  template <typename OutScalar, typename sycl_kernel, typename InPtr,
-            typename OutPtr, typename Range, typename Index, typename... T>
-  EIGEN_ALWAYS_INLINE cl::sycl::event unary_kernel_launcher(const InPtr &inptr,
-                                                            OutPtr &outptr,
-                                                            Range thread_range,
-                                                            Index scratchSize,
-                                                            T... var) const {
-    auto kernel_functor = [=](cl::sycl::handler &cgh) {
-      typedef cl::sycl::accessor<OutScalar, 1,
-                                 cl::sycl::access::mode::read_write,
-                                 cl::sycl::access::target::local>
-          LocalAccessor;
-
-      LocalAccessor scratch(cl::sycl::range<1>(scratchSize), cgh);
-      cgh.parallel_for(thread_range,
-                       sycl_kernel(scratch, inptr, outptr, var...));
+      cgh.parallel_for(thread_range, sycl_kernel(scratch, inptr, outptr, var...));
     };
     return m_queue.submit(kernel_functor);
   }
 
-  template <typename OutScalar, typename sycl_kernel, typename InPtr,
-            typename Range, typename Index, typename... T>
-  EIGEN_ALWAYS_INLINE cl::sycl::event nullary_kernel_launcher(
-      const InPtr &inptr, Range thread_range, Index scratchSize,
-      T... var) const {
+  template <typename OutScalar, typename sycl_kernel, typename InPtr, typename Range, typename Index, typename... T>
+  EIGEN_ALWAYS_INLINE cl::sycl::event nullary_kernel_launcher(const InPtr &inptr, Range thread_range, Index scratchSize,
+                                                              T... var) const {
     auto kernel_functor = [=](cl::sycl::handler &cgh) {
-      typedef cl::sycl::accessor<OutScalar, 1,
-                                 cl::sycl::access::mode::read_write,
-                                 cl::sycl::access::target::local>
+      typedef cl::sycl::accessor<OutScalar, 1, cl::sycl::access::mode::read_write, cl::sycl::access::target::local>
           LocalAccessor;
 
       LocalAccessor scratch(cl::sycl::range<1>(scratchSize), cgh);
@@ -281,11 +227,9 @@
   }
 
   template <typename Index>
-  EIGEN_STRONG_INLINE void parallel_for_setup(Index n, Index &tileSize,
-                                              Index &rng, Index &GRange) const {
+  EIGEN_STRONG_INLINE void parallel_for_setup(Index n, Index &tileSize, Index &rng, Index &GRange) const {
     tileSize = static_cast<Index>(getNearestPowerOfTwoWorkGroupSize());
-    tileSize = std::min(static_cast<Index>(EIGEN_SYCL_LOCAL_THREAD_DIM0 *
-                                           EIGEN_SYCL_LOCAL_THREAD_DIM1),
+    tileSize = std::min(static_cast<Index>(EIGEN_SYCL_LOCAL_THREAD_DIM0 * EIGEN_SYCL_LOCAL_THREAD_DIM1),
                         static_cast<Index>(tileSize));
     rng = n;
     if (rng == 0) rng = static_cast<Index>(1);
@@ -301,19 +245,14 @@
   /// This is used to prepare the number of threads and also the number of
   /// threads per block for sycl kernels
   template <typename Index>
-  EIGEN_STRONG_INLINE void parallel_for_setup(
-      const std::array<Index, 2> &input_dim, cl::sycl::range<2> &global_range,
-      cl::sycl::range<2> &local_range) const {
+  EIGEN_STRONG_INLINE void parallel_for_setup(const std::array<Index, 2> &input_dim, cl::sycl::range<2> &global_range,
+                                              cl::sycl::range<2> &local_range) const {
     std::array<Index, 2> input_range = input_dim;
-    Index max_workgroup_Size =
-        static_cast<Index>(getNearestPowerOfTwoWorkGroupSize());
-    max_workgroup_Size =
-        std::min(static_cast<Index>(EIGEN_SYCL_LOCAL_THREAD_DIM0 *
-                                    EIGEN_SYCL_LOCAL_THREAD_DIM1),
-                 static_cast<Index>(max_workgroup_Size));
+    Index max_workgroup_Size = static_cast<Index>(getNearestPowerOfTwoWorkGroupSize());
+    max_workgroup_Size = std::min(static_cast<Index>(EIGEN_SYCL_LOCAL_THREAD_DIM0 * EIGEN_SYCL_LOCAL_THREAD_DIM1),
+                                  static_cast<Index>(max_workgroup_Size));
     Index pow_of_2 = static_cast<Index>(std::log2(max_workgroup_Size));
-    local_range[1] =
-        static_cast<Index>(std::pow(2, static_cast<Index>(pow_of_2 / 2)));
+    local_range[1] = static_cast<Index>(std::pow(2, static_cast<Index>(pow_of_2 / 2)));
     input_range[1] = input_dim[1];
     if (input_range[1] == 0) input_range[1] = static_cast<Index>(1);
     global_range[1] = input_range[1];
@@ -321,8 +260,7 @@
       local_range[1] = global_range[1];
     else if (global_range[1] > local_range[1]) {
       Index xMode = static_cast<Index>(global_range[1] % local_range[1]);
-      if (xMode != 0)
-        global_range[1] += static_cast<Index>(local_range[1] - xMode);
+      if (xMode != 0) global_range[1] += static_cast<Index>(local_range[1] - xMode);
     }
     local_range[0] = static_cast<Index>(max_workgroup_Size / local_range[1]);
     input_range[0] = input_dim[0];
@@ -332,27 +270,21 @@
       local_range[0] = global_range[0];
     else if (global_range[0] > local_range[0]) {
       Index xMode = static_cast<Index>(global_range[0] % local_range[0]);
-      if (xMode != 0)
-        global_range[0] += static_cast<Index>(local_range[0] - xMode);
+      if (xMode != 0) global_range[0] += static_cast<Index>(local_range[0] - xMode);
     }
   }
 
   /// This is used to prepare the number of threads and also the number of
   /// threads per block for sycl kernels
   template <typename Index>
-  EIGEN_STRONG_INLINE void parallel_for_setup(
-      const std::array<Index, 3> &input_dim, cl::sycl::range<3> &global_range,
-      cl::sycl::range<3> &local_range) const {
+  EIGEN_STRONG_INLINE void parallel_for_setup(const std::array<Index, 3> &input_dim, cl::sycl::range<3> &global_range,
+                                              cl::sycl::range<3> &local_range) const {
     std::array<Index, 3> input_range = input_dim;
-    Index max_workgroup_Size =
-        static_cast<Index>(getNearestPowerOfTwoWorkGroupSize());
-    max_workgroup_Size =
-        std::min(static_cast<Index>(EIGEN_SYCL_LOCAL_THREAD_DIM0 *
-                                    EIGEN_SYCL_LOCAL_THREAD_DIM1),
-                 static_cast<Index>(max_workgroup_Size));
+    Index max_workgroup_Size = static_cast<Index>(getNearestPowerOfTwoWorkGroupSize());
+    max_workgroup_Size = std::min(static_cast<Index>(EIGEN_SYCL_LOCAL_THREAD_DIM0 * EIGEN_SYCL_LOCAL_THREAD_DIM1),
+                                  static_cast<Index>(max_workgroup_Size));
     Index pow_of_2 = static_cast<Index>(std::log2(max_workgroup_Size));
-    local_range[2] =
-        static_cast<Index>(std::pow(2, static_cast<Index>(pow_of_2 / 3)));
+    local_range[2] = static_cast<Index>(std::pow(2, static_cast<Index>(pow_of_2 / 3)));
     input_range[2] = input_dim[2];
     if (input_range[2] == 0) input_range[1] = static_cast<Index>(1);
     global_range[2] = input_range[2];
@@ -360,13 +292,10 @@
       local_range[2] = global_range[2];
     else if (global_range[2] > local_range[2]) {
       Index xMode = static_cast<Index>(global_range[2] % local_range[2]);
-      if (xMode != 0)
-        global_range[2] += static_cast<Index>(local_range[2] - xMode);
+      if (xMode != 0) global_range[2] += static_cast<Index>(local_range[2] - xMode);
     }
-    pow_of_2 = static_cast<Index>(
-        std::log2(static_cast<Index>(max_workgroup_Size / local_range[2])));
-    local_range[1] =
-        static_cast<Index>(std::pow(2, static_cast<Index>(pow_of_2 / 2)));
+    pow_of_2 = static_cast<Index>(std::log2(static_cast<Index>(max_workgroup_Size / local_range[2])));
+    local_range[1] = static_cast<Index>(std::pow(2, static_cast<Index>(pow_of_2 / 2)));
     input_range[1] = input_dim[1];
     if (input_range[1] == 0) input_range[1] = static_cast<Index>(1);
     global_range[1] = input_range[1];
@@ -374,11 +303,9 @@
       local_range[1] = global_range[1];
     else if (global_range[1] > local_range[1]) {
       Index xMode = static_cast<Index>(global_range[1] % local_range[1]);
-      if (xMode != 0)
-        global_range[1] += static_cast<Index>(local_range[1] - xMode);
+      if (xMode != 0) global_range[1] += static_cast<Index>(local_range[1] - xMode);
     }
-    local_range[0] = static_cast<Index>(max_workgroup_Size /
-                                        (local_range[1] * local_range[2]));
+    local_range[0] = static_cast<Index>(max_workgroup_Size / (local_range[1] * local_range[2]));
     input_range[0] = input_dim[0];
     if (input_range[0] == 0) input_range[0] = static_cast<Index>(1);
     global_range[0] = input_range[0];
@@ -386,8 +313,7 @@
       local_range[0] = global_range[0];
     else if (global_range[0] > local_range[0]) {
       Index xMode = static_cast<Index>(global_range[0] % local_range[0]);
-      if (xMode != 0)
-        global_range[0] += static_cast<Index>(local_range[0] - xMode);
+      if (xMode != 0) global_range[0] += static_cast<Index>(local_range[0] - xMode);
     }
   }
 
@@ -397,26 +323,17 @@
 #elif defined(EIGEN_SYCL_LOCAL_MEM) && !defined(EIGEN_SYCL_NO_LOCAL_MEM)
     return true;
 #else
-    return m_device_info.local_mem_type ==
-           cl::sycl::info::local_mem_type::local;
+    return m_device_info.local_mem_type == cl::sycl::info::local_mem_type::local;
 #endif
   }
 
-  EIGEN_STRONG_INLINE unsigned long max_buffer_size() const {
-    return m_device_info.max_mem_alloc_size;
-  }
+  EIGEN_STRONG_INLINE unsigned long max_buffer_size() const { return m_device_info.max_mem_alloc_size; }
 
-  EIGEN_STRONG_INLINE unsigned long getNumSyclMultiProcessors() const {
-    return m_device_info.max_compute_units;
-  }
+  EIGEN_STRONG_INLINE unsigned long getNumSyclMultiProcessors() const { return m_device_info.max_compute_units; }
 
-  EIGEN_STRONG_INLINE unsigned long maxSyclThreadsPerBlock() const {
-    return m_device_info.max_work_group_size;
-  }
+  EIGEN_STRONG_INLINE unsigned long maxSyclThreadsPerBlock() const { return m_device_info.max_work_group_size; }
 
-  EIGEN_STRONG_INLINE cl::sycl::id<3> maxWorkItemSizes() const {
-    return m_device_info.max_work_item_sizes;
-  }
+  EIGEN_STRONG_INLINE cl::sycl::id<3> maxWorkItemSizes() const { return m_device_info.max_work_item_sizes; }
 
   /// No need for sycl it should act the same as CPU version
   EIGEN_STRONG_INLINE int majorDeviceVersion() const { return 1; }
@@ -426,9 +343,7 @@
     return 2;
   }
 
-  EIGEN_STRONG_INLINE size_t sharedMemPerBlock() const {
-    return m_device_info.local_mem_size;
-  }
+  EIGEN_STRONG_INLINE size_t sharedMemPerBlock() const { return m_device_info.local_mem_size; }
 
   // This function returns the nearest power of 2 Work-group size which is <=
   // maximum device workgroup size.
@@ -436,17 +351,11 @@
     return getPowerOfTwo(m_device_info.max_work_group_size, false);
   }
 
-  EIGEN_STRONG_INLINE std::string getPlatformName() const {
-    return m_device_info.platform_name;
-  }
+  EIGEN_STRONG_INLINE std::string getPlatformName() const { return m_device_info.platform_name; }
 
-  EIGEN_STRONG_INLINE std::string getDeviceName() const {
-    return m_device_info.device_name;
-  }
+  EIGEN_STRONG_INLINE std::string getDeviceName() const { return m_device_info.device_name; }
 
-  EIGEN_STRONG_INLINE std::string getDeviceVendor() const {
-    return m_device_info.device_vendor;
-  }
+  EIGEN_STRONG_INLINE std::string getDeviceVendor() const { return m_device_info.device_vendor; }
 
   // This function returns the nearest power of 2
   // if roundup is true returns result>=wgsize
@@ -476,8 +385,7 @@
   }
 
  protected:
-  void synchronize_and_callback(cl::sycl::event e,
-                                const std::function<void()> &callback) const {
+  void synchronize_and_callback(cl::sycl::event e, const std::function<void()> &callback) const {
     if (callback) {
       auto callback_ = [=]() {
 #ifdef EIGEN_EXCEPTIONS
@@ -523,66 +431,49 @@
   /// QueueInterface is not owned. it is the caller's responsibility to destroy
   /// it
   const QueueInterface *m_queue_stream;
-  explicit SyclDeviceBase(const QueueInterface *queue_stream)
-      : m_queue_stream(queue_stream) {}
-  EIGEN_STRONG_INLINE const QueueInterface *queue_stream() const {
-    return m_queue_stream;
-  }
+  explicit SyclDeviceBase(const QueueInterface *queue_stream) : m_queue_stream(queue_stream) {}
+  EIGEN_STRONG_INLINE const QueueInterface *queue_stream() const { return m_queue_stream; }
 };
 
 // Here is a sycl device struct which accept the sycl queue interface
 // as an input
 struct SyclDevice : public SyclDeviceBase {
-  explicit SyclDevice(const QueueInterface *queue_stream)
-      : SyclDeviceBase(queue_stream) {}
+  explicit SyclDevice(const QueueInterface *queue_stream) : SyclDeviceBase(queue_stream) {}
 
   /// This is used to prepare the number of threads and also the number of
   /// threads per block for sycl kernels
   template <typename Index>
-  EIGEN_STRONG_INLINE void parallel_for_setup(Index n, Index &tileSize,
-                                              Index &rng, Index &GRange) const {
+  EIGEN_STRONG_INLINE void parallel_for_setup(Index n, Index &tileSize, Index &rng, Index &GRange) const {
     queue_stream()->parallel_for_setup(n, tileSize, rng, GRange);
   }
 
   /// This is used to prepare the number of threads and also the number of
   /// threads per block for sycl kernels
   template <typename Index>
-  EIGEN_STRONG_INLINE void parallel_for_setup(
-      const std::array<Index, 2> &input_dim, cl::sycl::range<2> &global_range,
-      cl::sycl::range<2> &local_range) const {
+  EIGEN_STRONG_INLINE void parallel_for_setup(const std::array<Index, 2> &input_dim, cl::sycl::range<2> &global_range,
+                                              cl::sycl::range<2> &local_range) const {
     queue_stream()->parallel_for_setup(input_dim, global_range, local_range);
   }
 
   /// This is used to prepare the number of threads and also the number of
   /// threads per block for sycl kernels
   template <typename Index>
-  EIGEN_STRONG_INLINE void parallel_for_setup(
-      const std::array<Index, 3> &input_dim, cl::sycl::range<3> &global_range,
-      cl::sycl::range<3> &local_range) const {
+  EIGEN_STRONG_INLINE void parallel_for_setup(const std::array<Index, 3> &input_dim, cl::sycl::range<3> &global_range,
+                                              cl::sycl::range<3> &local_range) const {
     queue_stream()->parallel_for_setup(input_dim, global_range, local_range);
   }
 
   /// allocate device memory
-  EIGEN_STRONG_INLINE void *allocate(size_t num_bytes) const {
-    return queue_stream()->allocate(num_bytes);
-  }
+  EIGEN_STRONG_INLINE void *allocate(size_t num_bytes) const { return queue_stream()->allocate(num_bytes); }
 
-  EIGEN_STRONG_INLINE void *allocate_temp(size_t num_bytes) const {
-    return queue_stream()->allocate_temp(num_bytes);
-  }
+  EIGEN_STRONG_INLINE void *allocate_temp(size_t num_bytes) const { return queue_stream()->allocate_temp(num_bytes); }
 
   /// deallocate device memory
-  EIGEN_STRONG_INLINE void deallocate(void *p) const {
-    queue_stream()->deallocate(p);
-  }
+  EIGEN_STRONG_INLINE void deallocate(void *p) const { queue_stream()->deallocate(p); }
 
-  EIGEN_STRONG_INLINE void deallocate_temp(void *buffer) const {
-    queue_stream()->deallocate_temp(buffer);
-  }
+  EIGEN_STRONG_INLINE void deallocate_temp(void *buffer) const { queue_stream()->deallocate_temp(buffer); }
 
-  EIGEN_STRONG_INLINE void deallocate_temp(const void *buffer) const {
-    queue_stream()->deallocate_temp(buffer);
-  }
+  EIGEN_STRONG_INLINE void deallocate_temp(const void *buffer) const { queue_stream()->deallocate_temp(buffer); }
 
   template <typename data_t>
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE data_t *get(data_t *data) const {
@@ -594,16 +485,14 @@
 
   /// memcpyHostToDevice
   template <typename Index>
-  EIGEN_STRONG_INLINE void memcpyHostToDevice(
-      Index *dst, const Index *src, size_t n,
-      std::function<void()> callback = {}) const {
+  EIGEN_STRONG_INLINE void memcpyHostToDevice(Index *dst, const Index *src, size_t n,
+                                              std::function<void()> callback = {}) const {
     queue_stream()->memcpyHostToDevice(dst, src, n, callback);
   }
   /// memcpyDeviceToHost
   template <typename Index>
-  EIGEN_STRONG_INLINE void memcpyDeviceToHost(
-      void *dst, const Index *src, size_t n,
-      std::function<void()> callback = {}) const {
+  EIGEN_STRONG_INLINE void memcpyDeviceToHost(void *dst, const Index *src, size_t n,
+                                              std::function<void()> callback = {}) const {
     queue_stream()->memcpyDeviceToHost(dst, src, n, callback);
   }
   /// the memcpy function
@@ -612,18 +501,14 @@
     queue_stream()->memcpy(dst, src, n);
   }
   /// the memset function
-  EIGEN_STRONG_INLINE void memset(void *data, int c, size_t n) const {
-    queue_stream()->memset(data, c, n);
-  }
+  EIGEN_STRONG_INLINE void memset(void *data, int c, size_t n) const { queue_stream()->memset(data, c, n); }
   /// the fill function
   template <typename T>
   EIGEN_STRONG_INLINE void fill(T *begin, T *end, const T &value) const {
     queue_stream()->fill(begin, end, value);
   }
   /// returning the sycl queue
-  EIGEN_STRONG_INLINE cl::sycl::queue &sycl_queue() const {
-    return queue_stream()->sycl_queue();
-  }
+  EIGEN_STRONG_INLINE cl::sycl::queue &sycl_queue() const { return queue_stream()->sycl_queue(); }
 
   EIGEN_STRONG_INLINE size_t firstLevelCacheSize() const { return 48 * 1024; }
 
@@ -635,19 +520,13 @@
   EIGEN_STRONG_INLINE unsigned long getNumSyclMultiProcessors() const {
     return queue_stream()->getNumSyclMultiProcessors();
   }
-  EIGEN_STRONG_INLINE unsigned long maxSyclThreadsPerBlock() const {
-    return queue_stream()->maxSyclThreadsPerBlock();
-  }
-  EIGEN_STRONG_INLINE cl::sycl::id<3> maxWorkItemSizes() const {
-    return queue_stream()->maxWorkItemSizes();
-  }
+  EIGEN_STRONG_INLINE unsigned long maxSyclThreadsPerBlock() const { return queue_stream()->maxSyclThreadsPerBlock(); }
+  EIGEN_STRONG_INLINE cl::sycl::id<3> maxWorkItemSizes() const { return queue_stream()->maxWorkItemSizes(); }
   EIGEN_STRONG_INLINE unsigned long maxSyclThreadsPerMultiProcessor() const {
     // OpenCL does not have such a concept
     return queue_stream()->maxSyclThreadsPerMultiProcessor();
   }
-  EIGEN_STRONG_INLINE size_t sharedMemPerBlock() const {
-    return queue_stream()->sharedMemPerBlock();
-  }
+  EIGEN_STRONG_INLINE size_t sharedMemPerBlock() const { return queue_stream()->sharedMemPerBlock(); }
   EIGEN_STRONG_INLINE size_t getNearestPowerOfTwoWorkGroupSize() const {
     return queue_stream()->getNearestPowerOfTwoWorkGroupSize();
   }
@@ -656,48 +535,31 @@
     return queue_stream()->getPowerOfTwo(val, roundUp);
   }
   /// No need for sycl it should act the same as CPU version
-  EIGEN_STRONG_INLINE int majorDeviceVersion() const {
-    return queue_stream()->majorDeviceVersion();
-  }
+  EIGEN_STRONG_INLINE int majorDeviceVersion() const { return queue_stream()->majorDeviceVersion(); }
 
-  EIGEN_STRONG_INLINE void synchronize() const {
-    queue_stream()->synchronize();
-  }
+  EIGEN_STRONG_INLINE void synchronize() const { queue_stream()->synchronize(); }
 
   // This function checks if the runtime recorded an error for the
   // underlying stream device.
   EIGEN_STRONG_INLINE bool ok() const { return queue_stream()->ok(); }
 
-  EIGEN_STRONG_INLINE bool has_local_memory() const {
-    return queue_stream()->has_local_memory();
-  }
-  EIGEN_STRONG_INLINE long max_buffer_size() const {
-    return queue_stream()->max_buffer_size();
-  }
-  EIGEN_STRONG_INLINE std::string getPlatformName() const {
-    return queue_stream()->getPlatformName();
-  }
-  EIGEN_STRONG_INLINE std::string getDeviceName() const {
-    return queue_stream()->getDeviceName();
-  }
-  EIGEN_STRONG_INLINE std::string getDeviceVendor() const {
-    return queue_stream()->getDeviceVendor();
-  }
+  EIGEN_STRONG_INLINE bool has_local_memory() const { return queue_stream()->has_local_memory(); }
+  EIGEN_STRONG_INLINE long max_buffer_size() const { return queue_stream()->max_buffer_size(); }
+  EIGEN_STRONG_INLINE std::string getPlatformName() const { return queue_stream()->getPlatformName(); }
+  EIGEN_STRONG_INLINE std::string getDeviceName() const { return queue_stream()->getDeviceName(); }
+  EIGEN_STRONG_INLINE std::string getDeviceVendor() const { return queue_stream()->getDeviceVendor(); }
   template <typename OutScalar, typename KernelType, typename... T>
   EIGEN_ALWAYS_INLINE cl::sycl::event binary_kernel_launcher(T... var) const {
-    return queue_stream()
-        ->template binary_kernel_launcher<OutScalar, KernelType>(var...);
+    return queue_stream()->template binary_kernel_launcher<OutScalar, KernelType>(var...);
   }
   template <typename OutScalar, typename KernelType, typename... T>
   EIGEN_ALWAYS_INLINE cl::sycl::event unary_kernel_launcher(T... var) const {
-    return queue_stream()
-        ->template unary_kernel_launcher<OutScalar, KernelType>(var...);
+    return queue_stream()->template unary_kernel_launcher<OutScalar, KernelType>(var...);
   }
 
   template <typename OutScalar, typename KernelType, typename... T>
   EIGEN_ALWAYS_INLINE cl::sycl::event nullary_kernel_launcher(T... var) const {
-    return queue_stream()
-        ->template nullary_kernel_launcher<OutScalar, KernelType>(var...);
+    return queue_stream()->template nullary_kernel_launcher<OutScalar, KernelType>(var...);
   }
 };
 }  // end namespace Eigen
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceThreadPool.h b/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceThreadPool.h
index abf6834..ca1fe6a 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceThreadPool.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceThreadPool.h
@@ -17,8 +17,8 @@
 
 // Runs an arbitrary function and then calls Notify() on the passed in
 // Notification.
-template <typename Function, typename... Args> struct FunctionWrapperWithNotification
-{
+template <typename Function, typename... Args>
+struct FunctionWrapperWithNotification {
   static void run(Notification* n, Function f, Args... args) {
     f(args...);
     if (n) {
@@ -27,8 +27,8 @@
   }
 };
 
-template <typename Function, typename... Args> struct FunctionWrapperWithBarrier
-{
+template <typename Function, typename... Args>
+struct FunctionWrapperWithBarrier {
   static void run(Barrier* b, Function f, Args... args) {
     f(args...);
     if (b) {
@@ -56,11 +56,10 @@
 struct ThreadPoolDevice {
   // The ownership of the thread pool remains with the caller.
   ThreadPoolDevice(ThreadPoolInterface* pool, int num_cores, Allocator* allocator = nullptr)
-      : pool_(pool), num_threads_(num_cores), allocator_(allocator) { }
+      : pool_(pool), num_threads_(num_cores), allocator_(allocator) {}
 
   EIGEN_STRONG_INLINE void* allocate(size_t num_bytes) const {
-    return allocator_ ? allocator_->allocate(num_bytes)
-        : internal::aligned_malloc(num_bytes);
+    return allocator_ ? allocator_->allocate(num_bytes) : internal::aligned_malloc(num_bytes);
   }
 
   EIGEN_STRONG_INLINE void deallocate(void* buffer) const {
@@ -71,15 +70,11 @@
     }
   }
 
-    EIGEN_STRONG_INLINE void* allocate_temp(size_t num_bytes) const {
-    return allocate(num_bytes);
-  }
+  EIGEN_STRONG_INLINE void* allocate_temp(size_t num_bytes) const { return allocate(num_bytes); }
 
-  EIGEN_STRONG_INLINE void deallocate_temp(void* buffer) const {
-    deallocate(buffer);
-  }
+  EIGEN_STRONG_INLINE void deallocate_temp(void* buffer) const { deallocate(buffer); }
 
-  template<typename Type>
+  template <typename Type>
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Type get(Type data) const {
     return data;
   }
@@ -104,8 +99,7 @@
       // Launch the last 3 blocks on worker threads.
       for (size_t i = 1; i < num_threads; ++i) {
         enqueue_with_barrier(&barrier, [n, i, src_ptr, dst_ptr, blocksize] {
-          ::memcpy(dst_ptr + i * blocksize, src_ptr + i * blocksize,
-                   numext::mini(blocksize, n - (i * blocksize)));
+          ::memcpy(dst_ptr + i * blocksize, src_ptr + i * blocksize, numext::mini(blocksize, n - (i * blocksize)));
         });
       }
       // Launch the first block on the main thread.
@@ -114,41 +108,29 @@
     }
 #endif
   }
-  EIGEN_STRONG_INLINE void memcpyHostToDevice(void* dst, const void* src, size_t n) const {
-    memcpy(dst, src, n);
-  }
-  EIGEN_STRONG_INLINE void memcpyDeviceToHost(void* dst, const void* src, size_t n) const {
-    memcpy(dst, src, n);
-  }
+  EIGEN_STRONG_INLINE void memcpyHostToDevice(void* dst, const void* src, size_t n) const { memcpy(dst, src, n); }
+  EIGEN_STRONG_INLINE void memcpyDeviceToHost(void* dst, const void* src, size_t n) const { memcpy(dst, src, n); }
 
-  EIGEN_STRONG_INLINE void memset(void* buffer, int c, size_t n) const {
-    ::memset(buffer, c, n);
-  }
+  EIGEN_STRONG_INLINE void memset(void* buffer, int c, size_t n) const { ::memset(buffer, c, n); }
 
-  template<typename T>
+  template <typename T>
   EIGEN_STRONG_INLINE void fill(T* begin, T* end, const T& value) const {
     std::fill(begin, end, value);
   }
 
-  EIGEN_STRONG_INLINE int numThreads() const {
-    return num_threads_;
-  }
+  EIGEN_STRONG_INLINE int numThreads() const { return num_threads_; }
 
   // Number of theads available in the underlying thread pool. This number can
   // be different from the value returned by numThreads().
-  EIGEN_STRONG_INLINE int numThreadsInPool() const {
-    return pool_->NumThreads();
-  }
+  EIGEN_STRONG_INLINE int numThreadsInPool() const { return pool_->NumThreads(); }
 
-  EIGEN_STRONG_INLINE size_t firstLevelCacheSize() const {
-    return l1CacheSize();
-  }
+  EIGEN_STRONG_INLINE size_t firstLevelCacheSize() const { return l1CacheSize(); }
 
   EIGEN_STRONG_INLINE size_t lastLevelCacheSize() const {
     // The l3 cache size is shared between all the cores.
     return l3CacheSize() / num_threads_;
   }
-  
+
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void synchronize() const {
     // Nothing.  Threadpool device operations are synchronous.
   }
@@ -159,26 +141,21 @@
   }
 
   template <class Function, class... Args>
-  EIGEN_STRONG_INLINE Notification* enqueue(Function&& f,
-                                            Args&&... args) const {
+  EIGEN_STRONG_INLINE Notification* enqueue(Function&& f, Args&&... args) const {
     Notification* n = new Notification();
     pool_->Schedule(
-        std::bind(&FunctionWrapperWithNotification<Function, Args...>::run, n,
-                  std::forward<Function>(f), args...));
+        std::bind(&FunctionWrapperWithNotification<Function, Args...>::run, n, std::forward<Function>(f), args...));
     return n;
   }
 
   template <class Function, class... Args>
-  EIGEN_STRONG_INLINE void enqueue_with_barrier(Barrier* b, Function&& f,
-                                                Args&&... args) const {
+  EIGEN_STRONG_INLINE void enqueue_with_barrier(Barrier* b, Function&& f, Args&&... args) const {
     pool_->Schedule(
-        std::bind(&FunctionWrapperWithBarrier<Function, Args...>::run, b,
-                  std::forward<Function>(f), args...));
+        std::bind(&FunctionWrapperWithBarrier<Function, Args...>::run, b, std::forward<Function>(f), args...));
   }
 
   template <class Function, class... Args>
-  EIGEN_STRONG_INLINE void enqueueNoNotification(Function&& f,
-                                                 Args&&... args) const {
+  EIGEN_STRONG_INLINE void enqueueNoNotification(Function&& f, Args&&... args) const {
     if (sizeof...(args) > 0) {
       pool_->Schedule(std::bind(std::forward<Function>(f), args...));
     } else {
@@ -188,9 +165,7 @@
 
   // Returns a logical thread index between 0 and pool_->NumThreads() - 1 if
   // called from one of the threads in pool_. Returns -1 otherwise.
-  EIGEN_STRONG_INLINE int currentThreadId() const {
-    return pool_->CurrentThreadId();
-  }
+  EIGEN_STRONG_INLINE int currentThreadId() const { return pool_->CurrentThreadId(); }
 
   // WARNING: This function is synchronous and will block the calling thread.
   //
@@ -199,14 +174,12 @@
   // size is chosen based on the iteration cost and resulting parallel
   // efficiency. If block_align is not nullptr, it is called to round up the
   // block size.
-  void parallelFor(Index n, const TensorOpCost& cost,
-                   std::function<Index(Index)> block_align,
+  void parallelFor(Index n, const TensorOpCost& cost, std::function<Index(Index)> block_align,
                    std::function<void(Index, Index)> f) const {
-    if (EIGEN_PREDICT_FALSE(n <= 0)){
+    if (EIGEN_PREDICT_FALSE(n <= 0)) {
       return;
-    // Compute small problems directly in the caller thread.
-    } else if (n == 1 || numThreads() == 1 ||
-               CostModel::numThreads(n, cost, static_cast<int>(numThreads())) == 1) {
+      // Compute small problems directly in the caller thread.
+    } else if (n == 1 || numThreads() == 1 || CostModel::numThreads(n, cost, static_cast<int>(numThreads())) == 1) {
       f(0, n);
       return;
     }
@@ -219,8 +192,7 @@
     // block_count leaves that do actual computations.
     Barrier barrier(static_cast<unsigned int>(block.count));
     std::function<void(Index, Index)> handleRange;
-    handleRange = [=, &handleRange, &barrier, &f](Index firstIdx,
-                                                  Index lastIdx) {
+    handleRange = [=, &handleRange, &barrier, &f](Index firstIdx, Index lastIdx) {
       while (lastIdx - firstIdx > block.size) {
         // Split into halves and schedule the second half on a different thread.
         const Index midIdx = firstIdx + numext::div_ceil((lastIdx - firstIdx) / 2, block.size) * block.size;
@@ -246,8 +218,7 @@
   }
 
   // Convenience wrapper for parallelFor that does not align blocks.
-  void parallelFor(Index n, const TensorOpCost& cost,
-                   std::function<void(Index, Index)> f) const {
+  void parallelFor(Index n, const TensorOpCost& cost, std::function<void(Index, Index)> f) const {
     parallelFor(n, cost, nullptr, std::move(f));
   }
 
@@ -258,13 +229,10 @@
   // 'done' callback. F accepts a half-open interval [first, last). Block size
   // is chosen based on the iteration cost and resulting parallel efficiency. If
   // block_align is not nullptr, it is called to round up the block size.
-  void parallelForAsync(Index n, const TensorOpCost& cost,
-                        std::function<Index(Index)> block_align,
-                        std::function<void(Index, Index)> f,
-                        std::function<void()> done) const {
+  void parallelForAsync(Index n, const TensorOpCost& cost, std::function<Index(Index)> block_align,
+                        std::function<void(Index, Index)> f, std::function<void()> done) const {
     // Compute small problems directly in the caller thread.
-    if (n <= 1 || numThreads() == 1 ||
-        CostModel::numThreads(n, cost, static_cast<int>(numThreads())) == 1) {
+    if (n <= 1 || numThreads() == 1 || CostModel::numThreads(n, cost, static_cast<int>(numThreads())) == 1) {
       f(0, n);
       done();
       return;
@@ -273,8 +241,7 @@
     // Compute block size and total count of blocks.
     ParallelForBlock block = CalculateParallelForBlock(n, cost, block_align);
 
-    ParallelForAsyncContext* const ctx =
-        new ParallelForAsyncContext(block.count, std::move(f), std::move(done));
+    ParallelForAsyncContext* const ctx = new ParallelForAsyncContext(block.count, std::move(f), std::move(done));
 
     // Recursively divide size into halves until we reach block_size.
     // Division code rounds mid to block_size, so we are guaranteed to get
@@ -283,8 +250,7 @@
       while (lastIdx - firstIdx > block.size) {
         // Split into halves and schedule the second half on a different thread.
         const Index midIdx = firstIdx + numext::div_ceil((lastIdx - firstIdx) / 2, block.size) * block.size;
-        pool_->Schedule(
-            [ctx, midIdx, lastIdx]() { ctx->handle_range(midIdx, lastIdx); });
+        pool_->Schedule([ctx, midIdx, lastIdx]() { ctx->handle_range(midIdx, lastIdx); });
         lastIdx = midIdx;
       }
 
@@ -307,8 +273,7 @@
   }
 
   // Convenience wrapper for parallelForAsync that does not align blocks.
-  void parallelForAsync(Index n, const TensorOpCost& cost,
-                        std::function<void(Index, Index)> f,
+  void parallelForAsync(Index n, const TensorOpCost& cost, std::function<void(Index, Index)> f,
                         std::function<void()> done) const {
     parallelForAsync(n, cost, nullptr, std::move(f), std::move(done));
   }
@@ -325,12 +290,9 @@
   // For parallelForAsync we must keep passed in closures on the heap, and
   // delete them only after `done` callback finished.
   struct ParallelForAsyncContext {
-    ParallelForAsyncContext(Index block_count,
-                            std::function<void(Index, Index)> block_f,
+    ParallelForAsyncContext(Index block_count, std::function<void(Index, Index)> block_f,
                             std::function<void()> done_callback)
-        : count(block_count),
-          f(std::move(block_f)),
-          done(std::move(done_callback)) {}
+        : count(block_count), f(std::move(block_f)), done(std::move(done_callback)) {}
     ~ParallelForAsyncContext() { done(); }
 
     std::atomic<Index> count;
@@ -350,15 +312,12 @@
   // overheads; not too large to mitigate tail effect and potential load
   // imbalance and we also want number of blocks to be evenly dividable across
   // threads.
-  ParallelForBlock CalculateParallelForBlock(
-      const Index n, const TensorOpCost& cost,
-      std::function<Index(Index)> block_align) const {
+  ParallelForBlock CalculateParallelForBlock(const Index n, const TensorOpCost& cost,
+                                             std::function<Index(Index)> block_align) const {
     const double block_size_f = 1.0 / CostModel::taskSize(1, cost);
     const Index max_oversharding_factor = 4;
     Index block_size = numext::mini(
-        n, numext::maxi<Index>(
-               numext::div_ceil<Index>(n, max_oversharding_factor * numThreads()),
-               block_size_f));
+        n, numext::maxi<Index>(numext::div_ceil<Index>(n, max_oversharding_factor * numThreads()), block_size_f));
     const Index max_block_size = numext::mini(n, 2 * block_size);
 
     if (block_align) {
@@ -372,13 +331,11 @@
     // Calculate parallel efficiency as fraction of total CPU time used for
     // computations:
     double max_efficiency =
-        static_cast<double>(block_count) /
-        (numext::div_ceil<Index>(block_count, numThreads()) * numThreads());
+        static_cast<double>(block_count) / (numext::div_ceil<Index>(block_count, numThreads()) * numThreads());
 
     // Now try to increase block size up to max_block_size as long as it
     // doesn't decrease parallel efficiency.
-    for (Index prev_block_count = block_count;
-         max_efficiency < 1.0 && prev_block_count > 1;) {
+    for (Index prev_block_count = block_count; max_efficiency < 1.0 && prev_block_count > 1;) {
       // This is the next block size that divides size into a smaller number
       // of blocks than the current block_size.
       Index coarser_block_size = numext::div_ceil(n, prev_block_count - 1);
@@ -394,9 +351,8 @@
       const Index coarser_block_count = numext::div_ceil(n, coarser_block_size);
       eigen_assert(coarser_block_count < prev_block_count);
       prev_block_count = coarser_block_count;
-      const double coarser_efficiency =
-          static_cast<double>(coarser_block_count) /
-          (numext::div_ceil<Index>(coarser_block_count, numThreads()) * numThreads());
+      const double coarser_efficiency = static_cast<double>(coarser_block_count) /
+                                        (numext::div_ceil<Index>(coarser_block_count, numThreads()) * numThreads());
       if (coarser_efficiency + 0.01 >= max_efficiency) {
         // Taking it.
         block_size = coarser_block_size;
@@ -415,7 +371,6 @@
   Allocator* allocator_;
 };
 
-
 }  // end namespace Eigen
 
-#endif // EIGEN_CXX11_TENSOR_TENSOR_DEVICE_THREAD_POOL_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_DEVICE_THREAD_POOL_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorDimensionList.h b/unsupported/Eigen/CXX11/src/Tensor/TensorDimensionList.h
index b15afb7..315b556 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorDimensionList.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorDimensionList.h
@@ -16,129 +16,104 @@
 namespace Eigen {
 
 /** \internal
-  *
-  * \class TensorDimensionList
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Special case of tensor index list used to list all the dimensions of a tensor of rank n.
-  *
-  * \sa Tensor
-  */
+ *
+ * \class TensorDimensionList
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Special case of tensor index list used to list all the dimensions of a tensor of rank n.
+ *
+ * \sa Tensor
+ */
 
-template <typename Index, std::size_t Rank> struct DimensionList {
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-  const Index operator[] (const Index i) const { return i; }
+template <typename Index, std::size_t Rank>
+struct DimensionList {
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE const Index operator[](const Index i) const { return i; }
 };
 
 namespace internal {
 
-template<typename Index, std::size_t Rank> struct array_size<DimensionList<Index, Rank> > {
+template <typename Index, std::size_t Rank>
+struct array_size<DimensionList<Index, Rank> > {
   static const size_t value = Rank;
 };
-template<typename Index, std::size_t Rank> struct array_size<const DimensionList<Index, Rank> > {
+template <typename Index, std::size_t Rank>
+struct array_size<const DimensionList<Index, Rank> > {
   static const size_t value = Rank;
 };
 
-template<DenseIndex n, typename Index, std::size_t Rank> const Index array_get(DimensionList<Index, Rank>&) {
+template <DenseIndex n, typename Index, std::size_t Rank>
+const Index array_get(DimensionList<Index, Rank>&) {
   return n;
 }
-template<DenseIndex n, typename Index, std::size_t Rank> const Index array_get(const DimensionList<Index, Rank>&) {
+template <DenseIndex n, typename Index, std::size_t Rank>
+const Index array_get(const DimensionList<Index, Rank>&) {
   return n;
 }
 
 template <typename Index, std::size_t Rank>
 struct index_known_statically_impl<DimensionList<Index, Rank> > {
-  EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex) {
-    return true;
-  }
+  EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex) { return true; }
 };
 template <typename Index, std::size_t Rank>
 struct index_known_statically_impl<const DimensionList<Index, Rank> > {
-  EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex) {
-    return true;
-  }
+  EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex) { return true; }
 };
 
 template <typename Index, std::size_t Rank>
 struct all_indices_known_statically_impl<DimensionList<Index, Rank> > {
-  EIGEN_DEVICE_FUNC static constexpr bool run() {
-    return true;
-  }
+  EIGEN_DEVICE_FUNC static constexpr bool run() { return true; }
 };
 template <typename Index, std::size_t Rank>
 struct all_indices_known_statically_impl<const DimensionList<Index, Rank> > {
-  EIGEN_DEVICE_FUNC static constexpr bool run() {
-    return true;
-  }
+  EIGEN_DEVICE_FUNC static constexpr bool run() { return true; }
 };
 
 template <typename Index, std::size_t Rank>
 struct indices_statically_known_to_increase_impl<DimensionList<Index, Rank> > {
-  EIGEN_DEVICE_FUNC static constexpr bool run() {
-    return true;
-  }
+  EIGEN_DEVICE_FUNC static constexpr bool run() { return true; }
 };
 template <typename Index, std::size_t Rank>
 struct indices_statically_known_to_increase_impl<const DimensionList<Index, Rank> > {
-  EIGEN_DEVICE_FUNC static constexpr bool run() {
-    return true;
-  }
+  EIGEN_DEVICE_FUNC static constexpr bool run() { return true; }
 };
 
 template <typename Index, std::size_t Rank>
 struct index_statically_eq_impl<DimensionList<Index, Rank> > {
-  static constexpr bool run(const DenseIndex i, const DenseIndex value) {
-    return i == value;
-  }
+  static constexpr bool run(const DenseIndex i, const DenseIndex value) { return i == value; }
 };
 template <typename Index, std::size_t Rank>
 struct index_statically_eq_impl<const DimensionList<Index, Rank> > {
-  EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) {
-    return i == value;
-  }
+  EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { return i == value; }
 };
 
 template <typename Index, std::size_t Rank>
 struct index_statically_ne_impl<DimensionList<Index, Rank> > {
-  EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) {
-    return i != value;
-  }
+  EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { return i != value; }
 };
 template <typename Index, std::size_t Rank>
 struct index_statically_ne_impl<const DimensionList<Index, Rank> > {
-  static constexpr bool run(const DenseIndex i, const DenseIndex value) {
-    return i != value;
-  }
+  static constexpr bool run(const DenseIndex i, const DenseIndex value) { return i != value; }
 };
 
 template <typename Index, std::size_t Rank>
 struct index_statically_gt_impl<DimensionList<Index, Rank> > {
-  EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) {
-    return i > value;
-  }
+  EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { return i > value; }
 };
 template <typename Index, std::size_t Rank>
 struct index_statically_gt_impl<const DimensionList<Index, Rank> > {
-  EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) {
-    return i > value;
-  }
+  EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { return i > value; }
 };
 
 template <typename Index, std::size_t Rank>
 struct index_statically_lt_impl<DimensionList<Index, Rank> > {
-  EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) {
-    return i < value;
-  }
+  EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { return i < value; }
 };
 template <typename Index, std::size_t Rank>
 struct index_statically_lt_impl<const DimensionList<Index, Rank> > {
-  EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) {
-    return i < value;
-  }
+  EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) { return i < value; }
 };
 
 }  // end namespace internal
 }  // end namespace Eigen
 
-
-#endif // EIGEN_CXX11_TENSOR_TENSOR_DIMENSION_LIST_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_DIMENSION_LIST_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorDimensions.h b/unsupported/Eigen/CXX11/src/Tensor/TensorDimensions.h
index 7b81172..4043e5e 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorDimensions.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorDimensions.h
@@ -10,86 +10,76 @@
 #ifndef EIGEN_CXX11_TENSOR_TENSOR_DIMENSIONS_H
 #define EIGEN_CXX11_TENSOR_TENSOR_DIMENSIONS_H
 
-
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
 namespace Eigen {
 
 /** \internal
-  *
-  * \class TensorDimensions
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Set of classes used to encode and store the dimensions of a Tensor.
-  *
-  * The Sizes class encodes as part of the type the number of dimensions and the
-  * sizes corresponding to each dimension. It uses no storage space since it is
-  * entirely known at compile time.
-  * The DSizes class is its dynamic sibling: the number of dimensions is known
-  * at compile time but the sizes are set during execution.
-  *
-  * \sa Tensor
-  */
+ *
+ * \class TensorDimensions
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Set of classes used to encode and store the dimensions of a Tensor.
+ *
+ * The Sizes class encodes as part of the type the number of dimensions and the
+ * sizes corresponding to each dimension. It uses no storage space since it is
+ * entirely known at compile time.
+ * The DSizes class is its dynamic sibling: the number of dimensions is known
+ * at compile time but the sizes are set during execution.
+ *
+ * \sa Tensor
+ */
 
 // Boilerplate code
 namespace internal {
 
-template<std::ptrdiff_t n, typename Dimension> struct dget {
+template <std::ptrdiff_t n, typename Dimension>
+struct dget {
   static const std::ptrdiff_t value = get<n, Dimension>::value;
 };
 
-
-template<typename Index, std::ptrdiff_t NumIndices, std::ptrdiff_t n, bool RowMajor>
-struct fixed_size_tensor_index_linearization_helper
-{
-  template <typename Dimensions> EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE Index run(array<Index, NumIndices> const& indices,
-                          const Dimensions& dimensions)
-  {
-    return array_get<RowMajor ? n - 1 : (NumIndices - n)>(indices) +
-        dget<RowMajor ? n - 1 : (NumIndices - n), Dimensions>::value *
-        fixed_size_tensor_index_linearization_helper<Index, NumIndices, n - 1, RowMajor>::run(indices, dimensions);
+template <typename Index, std::ptrdiff_t NumIndices, std::ptrdiff_t n, bool RowMajor>
+struct fixed_size_tensor_index_linearization_helper {
+  template <typename Dimensions>
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Index run(array<Index, NumIndices> const& indices,
+                                                         const Dimensions& dimensions) {
+    return array_get < RowMajor                             ? n - 1
+           : (NumIndices - n) > (indices) + dget < RowMajor ? n - 1
+                                                            : (NumIndices - n),
+           Dimensions > ::value * fixed_size_tensor_index_linearization_helper<Index, NumIndices, n - 1, RowMajor>::run(
+                                      indices, dimensions);
   }
 };
 
-template<typename Index, std::ptrdiff_t NumIndices, bool RowMajor>
-struct fixed_size_tensor_index_linearization_helper<Index, NumIndices, 0, RowMajor>
-{
-  template <typename Dimensions> EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE Index run(array<Index, NumIndices> const&, const Dimensions&)
-  {
+template <typename Index, std::ptrdiff_t NumIndices, bool RowMajor>
+struct fixed_size_tensor_index_linearization_helper<Index, NumIndices, 0, RowMajor> {
+  template <typename Dimensions>
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Index run(array<Index, NumIndices> const&, const Dimensions&) {
     return 0;
   }
 };
 
-template<typename Index, std::ptrdiff_t n>
-struct fixed_size_tensor_index_extraction_helper
-{
-  template <typename Dimensions> EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE Index run(const Index index,
-                          const Dimensions& dimensions)
-  {
-    const Index mult = (index == n-1) ? 1 : 0;
-    return array_get<n-1>(dimensions) * mult +
-        fixed_size_tensor_index_extraction_helper<Index, n - 1>::run(index, dimensions);
+template <typename Index, std::ptrdiff_t n>
+struct fixed_size_tensor_index_extraction_helper {
+  template <typename Dimensions>
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Index run(const Index index, const Dimensions& dimensions) {
+    const Index mult = (index == n - 1) ? 1 : 0;
+    return array_get<n - 1>(dimensions) * mult +
+           fixed_size_tensor_index_extraction_helper<Index, n - 1>::run(index, dimensions);
   }
 };
 
-template<typename Index>
-struct fixed_size_tensor_index_extraction_helper<Index, 0>
-{
-  template <typename Dimensions> EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE Index run(const Index,
-                          const Dimensions&)
-  {
+template <typename Index>
+struct fixed_size_tensor_index_extraction_helper<Index, 0> {
+  template <typename Dimensions>
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Index run(const Index, const Dimensions&) {
     return 0;
   }
-  };
+};
 
 }  // end namespace internal
 
-
 // Fixed size
 #ifndef EIGEN_EMULATE_CXX11_META_H
 template <typename std::ptrdiff_t... Indices>
@@ -99,40 +89,40 @@
   static const std::ptrdiff_t total_size = internal::arg_prod(Indices...);
   static const ptrdiff_t count = Base::count;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::ptrdiff_t rank() const {
-    return Base::count;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::ptrdiff_t rank() const { return Base::count; }
 
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::ptrdiff_t TotalSize() {
-    return internal::arg_prod(Indices...);
-  }
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::ptrdiff_t TotalSize() { return internal::arg_prod(Indices...); }
 
-  EIGEN_DEVICE_FUNC Sizes() { }
+  EIGEN_DEVICE_FUNC Sizes() {}
   template <typename DenseIndex>
   explicit EIGEN_DEVICE_FUNC Sizes(const array<DenseIndex, Base::count>& /*indices*/) {
     // todo: add assertion
   }
-  template <typename... DenseIndex> EIGEN_DEVICE_FUNC Sizes(DenseIndex...) { }
+  template <typename... DenseIndex>
+  EIGEN_DEVICE_FUNC Sizes(DenseIndex...) {}
   explicit EIGEN_DEVICE_FUNC Sizes(std::initializer_list<std::ptrdiff_t> /*l*/) {
     // todo: add assertion
   }
 
-  template <typename T> Sizes& operator = (const T& /*other*/) {
+  template <typename T>
+  Sizes& operator=(const T& /*other*/) {
     // add assertion failure if the size of other is different
     return *this;
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::ptrdiff_t operator[] (const std::ptrdiff_t index) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::ptrdiff_t operator[](const std::ptrdiff_t index) const {
     return internal::fixed_size_tensor_index_extraction_helper<std::ptrdiff_t, Base::count>::run(index, t);
   }
 
-  template <typename DenseIndex> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  ptrdiff_t IndexOfColMajor(const array<DenseIndex, Base::count>& indices) const {
-    return internal::fixed_size_tensor_index_linearization_helper<DenseIndex, Base::count, Base::count, false>::run(indices, t);
+  template <typename DenseIndex>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ptrdiff_t IndexOfColMajor(const array<DenseIndex, Base::count>& indices) const {
+    return internal::fixed_size_tensor_index_linearization_helper<DenseIndex, Base::count, Base::count, false>::run(
+        indices, t);
   }
-  template <typename DenseIndex> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  ptrdiff_t IndexOfRowMajor(const array<DenseIndex, Base::count>& indices) const {
-    return internal::fixed_size_tensor_index_linearization_helper<DenseIndex, Base::count, Base::count, true>::run(indices, t);
+  template <typename DenseIndex>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ptrdiff_t IndexOfRowMajor(const array<DenseIndex, Base::count>& indices) const {
+    return internal::fixed_size_tensor_index_linearization_helper<DenseIndex, Base::count, Base::count, true>::run(
+        indices, t);
   }
 };
 
@@ -141,7 +131,7 @@
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::ptrdiff_t array_prod(const Sizes<Indices...>&) {
   return Sizes<Indices...>::total_size;
 }
-}
+}  // namespace internal
 
 #else
 
@@ -154,36 +144,38 @@
   typedef internal::null_type type;
 };
 
-template <std::ptrdiff_t V1=0, std::ptrdiff_t V2=0, std::ptrdiff_t V3=0, std::ptrdiff_t V4=0, std::ptrdiff_t V5=0> struct Sizes {
-  typedef typename internal::make_type_list<typename non_zero_size<V1>::type, typename non_zero_size<V2>::type, typename non_zero_size<V3>::type, typename non_zero_size<V4>::type, typename non_zero_size<V5>::type >::type Base;
+template <std::ptrdiff_t V1 = 0, std::ptrdiff_t V2 = 0, std::ptrdiff_t V3 = 0, std::ptrdiff_t V4 = 0,
+          std::ptrdiff_t V5 = 0>
+struct Sizes {
+  typedef typename internal::make_type_list<typename non_zero_size<V1>::type, typename non_zero_size<V2>::type,
+                                            typename non_zero_size<V3>::type, typename non_zero_size<V4>::type,
+                                            typename non_zero_size<V5>::type>::type Base;
   static const std::ptrdiff_t count = Base::count;
   static const std::ptrdiff_t total_size = internal::arg_prod<Base>::value;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ptrdiff_t rank() const {
-    return count;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ptrdiff_t rank() const { return count; }
 
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ptrdiff_t TotalSize() {
-    return internal::arg_prod<Base>::value;
-  }
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ptrdiff_t TotalSize() { return internal::arg_prod<Base>::value; }
 
-  Sizes() { }
+  Sizes() {}
   template <typename DenseIndex>
   explicit Sizes(const array<DenseIndex, Base::count>& /*indices*/) {
     // todo: add assertion
   }
 
-  template <typename T> Sizes& operator = (const T& /*other*/) {
+  template <typename T>
+  Sizes& operator=(const T& /*other*/) {
     // add assertion failure if the size of other is different
     return *this;
   }
 
-  template <typename... DenseIndex> Sizes(DenseIndex... /*indices*/) { }
+  template <typename... DenseIndex>
+  Sizes(DenseIndex... /*indices*/) {}
   explicit Sizes(std::initializer_list<std::ptrdiff_t>) {
     // todo: add assertion
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index operator[] (const Index index) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index operator[](const Index index) const {
     switch (index) {
       case 0:
         return internal::get<0, Base>::value;
@@ -201,13 +193,15 @@
     }
   }
 
-  template <typename DenseIndex> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  ptrdiff_t IndexOfColMajor(const array<DenseIndex, Base::count>& indices) const {
-    return internal::fixed_size_tensor_index_linearization_helper<DenseIndex, Base::count, Base::count, false>::run(indices, *reinterpret_cast<const Base*>(this));
+  template <typename DenseIndex>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ptrdiff_t IndexOfColMajor(const array<DenseIndex, Base::count>& indices) const {
+    return internal::fixed_size_tensor_index_linearization_helper<DenseIndex, Base::count, Base::count, false>::run(
+        indices, *reinterpret_cast<const Base*>(this));
   }
-  template <typename DenseIndex> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  ptrdiff_t IndexOfRowMajor(const array<DenseIndex, Base::count>& indices) const {
-    return internal::fixed_size_tensor_index_linearization_helper<DenseIndex, Base::count, Base::count, true>::run(indices, *reinterpret_cast<const Base*>(this));
+  template <typename DenseIndex>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ptrdiff_t IndexOfRowMajor(const array<DenseIndex, Base::count>& indices) const {
+    return internal::fixed_size_tensor_index_linearization_helper<DenseIndex, Base::count, Base::count, true>::run(
+        indices, *reinterpret_cast<const Base*>(this));
   }
 };
 
@@ -216,57 +210,52 @@
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::ptrdiff_t array_prod(const Sizes<V1, V2, V3, V4, V5>&) {
   return Sizes<V1, V2, V3, V4, V5>::total_size;
 }
-}
+}  // namespace internal
 
 #endif
 
 // Boilerplate
 namespace internal {
-template<typename Index, std::ptrdiff_t NumIndices, std::ptrdiff_t n, bool RowMajor>
-struct tensor_index_linearization_helper
-{
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Index run(array<Index, NumIndices> const& indices, array<Index, NumIndices> const& dimensions)
-  {
-    return array_get<RowMajor ? n : (NumIndices - n - 1)>(indices) +
-      array_get<RowMajor ? n : (NumIndices - n - 1)>(dimensions) *
-        tensor_index_linearization_helper<Index, NumIndices, n - 1, RowMajor>::run(indices, dimensions);
+template <typename Index, std::ptrdiff_t NumIndices, std::ptrdiff_t n, bool RowMajor>
+struct tensor_index_linearization_helper {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index run(array<Index, NumIndices> const& indices,
+                                                         array<Index, NumIndices> const& dimensions) {
+    return array_get < RowMajor ? n
+           : (NumIndices - n - 1) > (indices) + array_get < RowMajor
+               ? n
+               : (NumIndices - n - 1) >
+                     (dimensions)*tensor_index_linearization_helper<Index, NumIndices, n - 1, RowMajor>::run(
+                         indices, dimensions);
   }
 };
 
-template<typename Index, std::ptrdiff_t NumIndices, bool RowMajor>
-struct tensor_index_linearization_helper<Index, NumIndices, 0, RowMajor>
-{
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Index run(array<Index, NumIndices> const& indices, array<Index, NumIndices> const&)
-  {
-    return array_get<RowMajor ? 0 : NumIndices - 1>(indices);
+template <typename Index, std::ptrdiff_t NumIndices, bool RowMajor>
+struct tensor_index_linearization_helper<Index, NumIndices, 0, RowMajor> {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index run(array<Index, NumIndices> const& indices,
+                                                         array<Index, NumIndices> const&) {
+    return array_get < RowMajor ? 0 : NumIndices - 1 > (indices);
   }
 };
 }  // end namespace internal
 
-
-
 // Dynamic size
 template <typename DenseIndex, int NumDims>
 struct DSizes : array<DenseIndex, NumDims> {
   typedef array<DenseIndex, NumDims> Base;
   static const int count = NumDims;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index rank() const {
-    return NumDims;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index rank() const { return NumDims; }
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DenseIndex TotalSize() const {
     return (NumDims == 0) ? 1 : internal::array_prod(*static_cast<const Base*>(this));
   }
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DSizes() {
-    for (int i = 0 ; i < NumDims; ++i) {
+    for (int i = 0; i < NumDims; ++i) {
       (*this)[i] = 0;
     }
   }
-  EIGEN_DEVICE_FUNC explicit DSizes(const array<DenseIndex, NumDims>& a) : Base(a) { }
+  EIGEN_DEVICE_FUNC explicit DSizes(const array<DenseIndex, NumDims>& a) : Base(a) {}
 
   EIGEN_DEVICE_FUNC explicit DSizes(const DenseIndex i0) {
     eigen_assert(NumDims == 1);
@@ -274,33 +263,27 @@
   }
 
   EIGEN_DEVICE_FUNC DSizes(const DimensionList<DenseIndex, NumDims>& a) {
-    for (int i = 0 ; i < NumDims; ++i) {
+    for (int i = 0; i < NumDims; ++i) {
       (*this)[i] = a[i];
     }
   }
 
   // Enable DSizes index type promotion only if we are promoting to the
   // larger type, e.g. allow to promote dimensions of type int to long.
-  template<typename OtherIndex>
-  EIGEN_DEVICE_FUNC
-  explicit DSizes(const array<OtherIndex, NumDims>& other,
-                  // Default template parameters require c++11.
-                  std::enable_if_t<
-                     internal::is_same<
-                         DenseIndex,
-                         typename internal::promote_index_type<
-                             DenseIndex,
-                             OtherIndex
-                         >::type
-                     >::value, void*> = 0) {
+  template <typename OtherIndex>
+  EIGEN_DEVICE_FUNC explicit DSizes(
+      const array<OtherIndex, NumDims>& other,
+      // Default template parameters require c++11.
+      std::enable_if_t<
+          internal::is_same<DenseIndex, typename internal::promote_index_type<DenseIndex, OtherIndex>::type>::value,
+          void*> = 0) {
     for (int i = 0; i < NumDims; ++i) {
       (*this)[i] = static_cast<DenseIndex>(other[i]);
     }
   }
 
   template <typename FirstType, typename... OtherTypes>
-  EIGEN_DEVICE_FUNC
-  explicit DSizes(const Eigen::IndexList<FirstType, OtherTypes...>& dimensions) {
+  EIGEN_DEVICE_FUNC explicit DSizes(const Eigen::IndexList<FirstType, OtherTypes...>& dimensions) {
     for (int i = 0; i < dimensions.count; ++i) {
       (*this)[i] = dimensions[i];
     }
@@ -309,41 +292,45 @@
 #ifndef EIGEN_EMULATE_CXX11_META_H
   template <typename std::ptrdiff_t... Indices>
   EIGEN_DEVICE_FUNC DSizes(const Sizes<Indices...>& a) {
-    for (int i = 0 ; i < NumDims; ++i) {
+    for (int i = 0; i < NumDims; ++i) {
       (*this)[i] = a[i];
     }
   }
 #else
   template <std::ptrdiff_t V1, std::ptrdiff_t V2, std::ptrdiff_t V3, std::ptrdiff_t V4, std::ptrdiff_t V5>
   EIGEN_DEVICE_FUNC DSizes(const Sizes<V1, V2, V3, V4, V5>& a) {
-    for (int i = 0 ; i < NumDims; ++i) {
+    for (int i = 0; i < NumDims; ++i) {
       (*this)[i] = a[i];
     }
   }
 #endif
 
-  template<typename... IndexTypes> EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE explicit DSizes(DenseIndex firstDimension, DenseIndex secondDimension, IndexTypes... otherDimensions) : Base({{firstDimension, secondDimension, otherDimensions...}}) {
-    EIGEN_STATIC_ASSERT(sizeof...(otherDimensions) + 2 == NumDims, YOU_MADE_A_PROGRAMMING_MISTAKE)
-  }
+  template <typename... IndexTypes>
+      EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit DSizes(DenseIndex firstDimension, DenseIndex secondDimension,
+                                                            IndexTypes... otherDimensions)
+      : Base({{firstDimension, secondDimension, otherDimensions...}}){EIGEN_STATIC_ASSERT(
+            sizeof...(otherDimensions) + 2 == NumDims, YOU_MADE_A_PROGRAMMING_MISTAKE)}
 
-  EIGEN_DEVICE_FUNC DSizes& operator = (const array<DenseIndex, NumDims>& other) {
+        EIGEN_DEVICE_FUNC DSizes
+        &
+        operator=(const array<DenseIndex, NumDims>& other) {
     *static_cast<Base*>(this) = other;
     return *this;
   }
 
   // A constexpr would be so much better here
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DenseIndex IndexOfColMajor(const array<DenseIndex, NumDims>& indices) const {
-    return internal::tensor_index_linearization_helper<DenseIndex, NumDims, NumDims - 1, false>::run(indices, *static_cast<const Base*>(this));
+    return internal::tensor_index_linearization_helper<DenseIndex, NumDims, NumDims - 1, false>::run(
+        indices, *static_cast<const Base*>(this));
   }
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DenseIndex IndexOfRowMajor(const array<DenseIndex, NumDims>& indices) const {
-    return internal::tensor_index_linearization_helper<DenseIndex, NumDims, NumDims - 1, true>::run(indices, *static_cast<const Base*>(this));
+    return internal::tensor_index_linearization_helper<DenseIndex, NumDims, NumDims - 1, true>::run(
+        indices, *static_cast<const Base*>(this));
   }
 };
 
 template <typename IndexType, int NumDims>
-std::ostream& operator<<(std::ostream& os,
-                         const DSizes<IndexType, NumDims>& dims) {
+std::ostream& operator<<(std::ostream& os, const DSizes<IndexType, NumDims>& dims) {
   os << "[";
   for (int i = 0; i < NumDims; ++i) {
     if (i > 0) os << ", ";
@@ -355,94 +342,97 @@
 
 // Boilerplate
 namespace internal {
-template<typename Index, std::ptrdiff_t NumIndices, std::ptrdiff_t n, bool RowMajor>
-struct tensor_vsize_index_linearization_helper
-{
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Index run(array<Index, NumIndices> const& indices, std::vector<DenseIndex> const& dimensions)
-  {
-    return array_get<RowMajor ? n : (NumIndices - n - 1)>(indices) +
-      array_get<RowMajor ? n : (NumIndices - n - 1)>(dimensions) *
-        tensor_vsize_index_linearization_helper<Index, NumIndices, n - 1, RowMajor>::run(indices, dimensions);
+template <typename Index, std::ptrdiff_t NumIndices, std::ptrdiff_t n, bool RowMajor>
+struct tensor_vsize_index_linearization_helper {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index run(array<Index, NumIndices> const& indices,
+                                                         std::vector<DenseIndex> const& dimensions) {
+    return array_get < RowMajor ? n
+           : (NumIndices - n - 1) > (indices) + array_get < RowMajor
+               ? n
+               : (NumIndices - n - 1) >
+                     (dimensions)*tensor_vsize_index_linearization_helper<Index, NumIndices, n - 1, RowMajor>::run(
+                         indices, dimensions);
   }
 };
 
-template<typename Index, std::ptrdiff_t NumIndices, bool RowMajor>
-struct tensor_vsize_index_linearization_helper<Index, NumIndices, 0, RowMajor>
-{
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Index run(array<Index, NumIndices> const& indices, std::vector<DenseIndex> const&)
-  {
-    return array_get<RowMajor ? 0 : NumIndices - 1>(indices);
+template <typename Index, std::ptrdiff_t NumIndices, bool RowMajor>
+struct tensor_vsize_index_linearization_helper<Index, NumIndices, 0, RowMajor> {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index run(array<Index, NumIndices> const& indices,
+                                                         std::vector<DenseIndex> const&) {
+    return array_get < RowMajor ? 0 : NumIndices - 1 > (indices);
   }
 };
 }  // end namespace internal
 
-
 namespace internal {
 
-template <typename DenseIndex, int NumDims> struct array_size<const DSizes<DenseIndex, NumDims> > {
+template <typename DenseIndex, int NumDims>
+struct array_size<const DSizes<DenseIndex, NumDims> > {
   static const ptrdiff_t value = NumDims;
 };
-template <typename DenseIndex, int NumDims> struct array_size<DSizes<DenseIndex, NumDims> > {
+template <typename DenseIndex, int NumDims>
+struct array_size<DSizes<DenseIndex, NumDims> > {
   static const ptrdiff_t value = NumDims;
 };
 #ifndef EIGEN_EMULATE_CXX11_META_H
-template <typename std::ptrdiff_t... Indices> struct array_size<const Sizes<Indices...> > {
-static const std::ptrdiff_t value = Sizes<Indices...>::count;
+template <typename std::ptrdiff_t... Indices>
+struct array_size<const Sizes<Indices...> > {
+  static const std::ptrdiff_t value = Sizes<Indices...>::count;
 };
-template <typename std::ptrdiff_t... Indices> struct array_size<Sizes<Indices...> > {
-static const std::ptrdiff_t value = Sizes<Indices...>::count;
+template <typename std::ptrdiff_t... Indices>
+struct array_size<Sizes<Indices...> > {
+  static const std::ptrdiff_t value = Sizes<Indices...>::count;
 };
-template <std::ptrdiff_t n, typename std::ptrdiff_t... Indices> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::ptrdiff_t array_get(const Sizes<Indices...>&) {
+template <std::ptrdiff_t n, typename std::ptrdiff_t... Indices>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::ptrdiff_t array_get(const Sizes<Indices...>&) {
   return get<n, internal::numeric_list<std::ptrdiff_t, Indices...> >::value;
 }
-template <std::ptrdiff_t n> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::ptrdiff_t array_get(const Sizes<>&) {
+template <std::ptrdiff_t n>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::ptrdiff_t array_get(const Sizes<>&) {
   eigen_assert(false && "should never be called");
   return -1;
 }
 #else
-template <std::ptrdiff_t V1, std::ptrdiff_t V2, std::ptrdiff_t V3, std::ptrdiff_t V4, std::ptrdiff_t V5> struct array_size<const Sizes<V1,V2,V3,V4,V5> > {
-  static const ptrdiff_t value = Sizes<V1,V2,V3,V4,V5>::count;
+template <std::ptrdiff_t V1, std::ptrdiff_t V2, std::ptrdiff_t V3, std::ptrdiff_t V4, std::ptrdiff_t V5>
+struct array_size<const Sizes<V1, V2, V3, V4, V5> > {
+  static const ptrdiff_t value = Sizes<V1, V2, V3, V4, V5>::count;
 };
-template <std::ptrdiff_t V1, std::ptrdiff_t V2, std::ptrdiff_t V3, std::ptrdiff_t V4, std::ptrdiff_t V5> struct array_size<Sizes<V1,V2,V3,V4,V5> > {
-  static const ptrdiff_t value = Sizes<V1,V2,V3,V4,V5>::count;
+template <std::ptrdiff_t V1, std::ptrdiff_t V2, std::ptrdiff_t V3, std::ptrdiff_t V4, std::ptrdiff_t V5>
+struct array_size<Sizes<V1, V2, V3, V4, V5> > {
+  static const ptrdiff_t value = Sizes<V1, V2, V3, V4, V5>::count;
 };
-template <std::ptrdiff_t n, std::ptrdiff_t V1, std::ptrdiff_t V2, std::ptrdiff_t V3, std::ptrdiff_t V4, std::ptrdiff_t V5> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::ptrdiff_t array_get(const Sizes<V1,V2,V3,V4,V5>&) {
-  return get<n, typename Sizes<V1,V2,V3,V4,V5>::Base>::value;
+template <std::ptrdiff_t n, std::ptrdiff_t V1, std::ptrdiff_t V2, std::ptrdiff_t V3, std::ptrdiff_t V4,
+          std::ptrdiff_t V5>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::ptrdiff_t array_get(const Sizes<V1, V2, V3, V4, V5>&) {
+  return get<n, typename Sizes<V1, V2, V3, V4, V5>::Base>::value;
 }
 
 #endif
 
-
 template <typename Dims1, typename Dims2, ptrdiff_t n, ptrdiff_t m>
 struct sizes_match_below_dim {
-  static EIGEN_DEVICE_FUNC  EIGEN_STRONG_INLINE bool run(Dims1&, Dims2&) {
-    return false;
-  }
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool run(Dims1&, Dims2&) { return false; }
 };
 template <typename Dims1, typename Dims2, ptrdiff_t n>
 struct sizes_match_below_dim<Dims1, Dims2, n, n> {
-  static EIGEN_DEVICE_FUNC  EIGEN_STRONG_INLINE bool run(Dims1& dims1, Dims2& dims2) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool run(Dims1& dims1, Dims2& dims2) {
     return numext::equal_strict(array_get<n - 1>(dims1), array_get<n - 1>(dims2)) &&
-        sizes_match_below_dim<Dims1, Dims2, n-1, n-1>::run(dims1, dims2);
+           sizes_match_below_dim<Dims1, Dims2, n - 1, n - 1>::run(dims1, dims2);
   }
 };
 template <typename Dims1, typename Dims2>
 struct sizes_match_below_dim<Dims1, Dims2, 0, 0> {
-  static EIGEN_DEVICE_FUNC  EIGEN_STRONG_INLINE bool run(Dims1&, Dims2&) {
-    return true;
-  }
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool run(Dims1&, Dims2&) { return true; }
 };
 
-} // end namespace internal
-
+}  // end namespace internal
 
 template <typename Dims1, typename Dims2>
 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool dimensions_match(Dims1 dims1, Dims2 dims2) {
-  return internal::sizes_match_below_dim<Dims1, Dims2, internal::array_size<Dims1>::value, internal::array_size<Dims2>::value>::run(dims1, dims2);
+  return internal::sizes_match_below_dim<Dims1, Dims2, internal::array_size<Dims1>::value,
+                                         internal::array_size<Dims2>::value>::run(dims1, dims2);
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_CXX11_TENSOR_TENSOR_DIMENSIONS_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_DIMENSIONS_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorEvalTo.h b/unsupported/Eigen/CXX11/src/Tensor/TensorEvalTo.h
index caa6dbd..8f1e4c4 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorEvalTo.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorEvalTo.h
@@ -16,16 +16,15 @@
 namespace Eigen {
 
 /** \class TensorForcedEval
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Tensor reshaping class.
-  *
-  *
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Tensor reshaping class.
+ *
+ *
+ */
 namespace internal {
-template<typename XprType, template <class> class MakePointer_>
-struct traits<TensorEvalToOp<XprType, MakePointer_> >
-{
+template <typename XprType, template <class> class MakePointer_>
+struct traits<TensorEvalToOp<XprType, MakePointer_> > {
   // Type promotion to handle the case where the types of the lhs and the rhs are different.
   typedef typename XprType::Scalar Scalar;
   typedef traits<XprType> XprTraits;
@@ -37,40 +36,30 @@
   static constexpr int Layout = XprTraits::Layout;
   typedef typename MakePointer_<Scalar>::Type PointerType;
 
-  enum {
-    Flags = 0
-  };
+  enum { Flags = 0 };
   template <class T>
   struct MakePointer {
     // Intermediate typedef to workaround MSVC issue.
     typedef MakePointer_<T> MakePointerT;
     typedef typename MakePointerT::Type Type;
-
-
   };
 };
 
-template<typename XprType, template <class> class MakePointer_>
-struct eval<TensorEvalToOp<XprType, MakePointer_>, Eigen::Dense>
-{
+template <typename XprType, template <class> class MakePointer_>
+struct eval<TensorEvalToOp<XprType, MakePointer_>, Eigen::Dense> {
   typedef const TensorEvalToOp<XprType, MakePointer_>& type;
 };
 
-template<typename XprType, template <class> class MakePointer_>
-struct nested<TensorEvalToOp<XprType, MakePointer_>, 1, typename eval<TensorEvalToOp<XprType, MakePointer_> >::type>
-{
+template <typename XprType, template <class> class MakePointer_>
+struct nested<TensorEvalToOp<XprType, MakePointer_>, 1, typename eval<TensorEvalToOp<XprType, MakePointer_> >::type> {
   typedef TensorEvalToOp<XprType, MakePointer_> type;
 };
 
 }  // end namespace internal
 
-
-
-
-template<typename XprType, template <class> class MakePointer_>
-class TensorEvalToOp : public TensorBase<TensorEvalToOp<XprType, MakePointer_>, ReadOnlyAccessors>
-{
-  public:
+template <typename XprType, template <class> class MakePointer_>
+class TensorEvalToOp : public TensorBase<TensorEvalToOp<XprType, MakePointer_>, ReadOnlyAccessors> {
+ public:
   typedef typename Eigen::internal::traits<TensorEvalToOp>::Scalar Scalar;
   typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
   typedef std::remove_const_t<typename XprType::CoeffReturnType> CoeffReturnType;
@@ -84,22 +73,17 @@
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvalToOp(PointerType buffer, const XprType& expr)
       : m_xpr(expr), m_buffer(buffer) {}
 
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<typename XprType::Nested>&
-    expression() const { return m_xpr; }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename XprType::Nested>& expression() const { return m_xpr; }
 
-    EIGEN_DEVICE_FUNC PointerType buffer() const { return m_buffer; }
+  EIGEN_DEVICE_FUNC PointerType buffer() const { return m_buffer; }
 
-  protected:
-    typename XprType::Nested m_xpr;
-    PointerType m_buffer;
+ protected:
+  typename XprType::Nested m_xpr;
+  PointerType m_buffer;
 };
 
-
-
-template<typename ArgType, typename Device, template <class> class MakePointer_>
-struct TensorEvaluator<const TensorEvalToOp<ArgType, MakePointer_>, Device>
-{
+template <typename ArgType, typename Device, template <class> class MakePointer_>
+struct TensorEvaluator<const TensorEvalToOp<ArgType, MakePointer_>, Device> {
   typedef TensorEvalToOp<ArgType, MakePointer_> XprType;
   typedef typename ArgType::Scalar Scalar;
   typedef typename TensorEvaluator<ArgType, Device>::Dimensions Dimensions;
@@ -111,12 +95,12 @@
   typedef StorageMemory<CoeffReturnType, Device> Storage;
   typedef typename Storage::Type EvaluatorPointerType;
   enum {
-    IsAligned         = TensorEvaluator<ArgType, Device>::IsAligned,
-    PacketAccess      = TensorEvaluator<ArgType, Device>::PacketAccess,
-    BlockAccess       = true,
+    IsAligned = TensorEvaluator<ArgType, Device>::IsAligned,
+    PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
+    BlockAccess = true,
     PreferBlockAccess = false,
-    CoordAccess       = false,  // to be implemented
-    RawAccess         = true
+    CoordAccess = false,  // to be implemented
+    RawAccess = true
   };
 
   static constexpr int Layout = TensorEvaluator<ArgType, Device>::Layout;
@@ -126,21 +110,16 @@
   typedef internal::TensorBlockDescriptor<NumDims, Index> TensorBlockDesc;
   typedef internal::TensorBlockScratchAllocator<Device> TensorBlockScratch;
 
-  typedef typename TensorEvaluator<const ArgType, Device>::TensorBlock
-      ArgTensorBlock;
+  typedef typename TensorEvaluator<const ArgType, Device>::TensorBlock ArgTensorBlock;
 
-  typedef internal::TensorBlockAssignment<
-      CoeffReturnType, NumDims, typename ArgTensorBlock::XprType, Index>
+  typedef internal::TensorBlockAssignment<CoeffReturnType, NumDims, typename ArgTensorBlock::XprType, Index>
       TensorBlockAssignment;
   //===--------------------------------------------------------------------===//
 
   EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
-      : m_impl(op.expression(), device), m_buffer(device.get(op.buffer())), m_expression(op.expression()){}
+      : m_impl(op.expression(), device), m_buffer(device.get(op.buffer())), m_expression(op.expression()) {}
 
-
-  EIGEN_STRONG_INLINE ~TensorEvaluator() {
-  }
-
+  EIGEN_STRONG_INLINE ~TensorEvaluator() {}
 
   EIGEN_DEVICE_FUNC const Dimensions& dimensions() const { return m_impl.dimensions(); }
 
@@ -152,75 +131,59 @@
 
 #ifdef EIGEN_USE_THREADS
   template <typename EvalSubExprsCallback>
-  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(
-      EvaluatorPointerType scalar, EvalSubExprsCallback done) {
+  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(EvaluatorPointerType scalar, EvalSubExprsCallback done) {
     EIGEN_UNUSED_VARIABLE(scalar);
     eigen_assert(scalar == NULL);
     m_impl.evalSubExprsIfNeededAsync(m_buffer, std::move(done));
   }
 #endif
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalScalar(Index i) const {
-    m_buffer[i] = m_impl.coeff(i);
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalScalar(Index i) const { m_buffer[i] = m_impl.coeff(i); }
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalPacket(Index i) const {
-    internal::pstoret<CoeffReturnType, PacketReturnType, Aligned>(m_buffer + i, m_impl.template packet<TensorEvaluator<ArgType, Device>::IsAligned ? Aligned : Unaligned>(i));
+    internal::pstoret<CoeffReturnType, PacketReturnType, Aligned>(
+        m_buffer + i, m_impl.template packet < TensorEvaluator<ArgType, Device>::IsAligned ? Aligned : Unaligned > (i));
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  internal::TensorBlockResourceRequirements getResourceRequirements() const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE internal::TensorBlockResourceRequirements getResourceRequirements() const {
     return m_impl.getResourceRequirements();
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalBlock(
-      TensorBlockDesc& desc, TensorBlockScratch& scratch) {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalBlock(TensorBlockDesc& desc, TensorBlockScratch& scratch) {
     // Add `m_buffer` as destination buffer to the block descriptor.
     desc.template AddDestinationBuffer<Layout>(
         /*dst_base=*/m_buffer + desc.offset(),
         /*dst_strides=*/internal::strides<Layout>(m_impl.dimensions()));
 
-    ArgTensorBlock block =
-        m_impl.block(desc, scratch, /*root_of_expr_ast=*/true);
+    ArgTensorBlock block = m_impl.block(desc, scratch, /*root_of_expr_ast=*/true);
 
     // If block was evaluated into a destination buffer, there is no need to do
     // an assignment.
     if (block.kind() != internal::TensorBlockKind::kMaterializedInOutput) {
       TensorBlockAssignment::Run(
-          TensorBlockAssignment::target(
-              desc.dimensions(), internal::strides<Layout>(m_impl.dimensions()),
-              m_buffer, desc.offset()),
+          TensorBlockAssignment::target(desc.dimensions(), internal::strides<Layout>(m_impl.dimensions()), m_buffer,
+                                        desc.offset()),
           block.expr());
     }
     block.cleanup();
   }
 
-  EIGEN_STRONG_INLINE void cleanup() {
-    m_impl.cleanup();
-  }
+  EIGEN_STRONG_INLINE void cleanup() { m_impl.cleanup(); }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
-  {
-    return m_buffer[index];
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const { return m_buffer[index]; }
 
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const
-  {
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const {
     return internal::ploadt<PacketReturnType, LoadMode>(m_buffer + index);
   }
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const {
     // We assume that evalPacket or evalScalar is called to perform the
     // assignment and account for the cost of the write here.
-    return m_impl.costPerCoeff(vectorized) +
-        TensorOpCost(0, sizeof(CoeffReturnType), 0, vectorized, PacketSize);
+    return m_impl.costPerCoeff(vectorized) + TensorOpCost(0, sizeof(CoeffReturnType), 0, vectorized, PacketSize);
   }
 
   EIGEN_DEVICE_FUNC EvaluatorPointerType data() const { return m_buffer; }
   ArgType expression() const { return m_expression; }
-  
-
-
 
  private:
   TensorEvaluator<ArgType, Device> m_impl;
@@ -228,7 +191,6 @@
   const ArgType m_expression;
 };
 
+}  // end namespace Eigen
 
-} // end namespace Eigen
-
-#endif // EIGEN_CXX11_TENSOR_TENSOR_EVAL_TO_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_EVAL_TO_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorEvaluator.h b/unsupported/Eigen/CXX11/src/Tensor/TensorEvaluator.h
index 501cacb..d864fb4 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorEvaluator.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorEvaluator.h
@@ -16,43 +16,42 @@
 namespace Eigen {
 
 /** \class TensorEvaluator
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief The tensor evaluator classes.
-  *
-  * These classes are responsible for the evaluation of the tensor expression.
-  *
-  * TODO: add support for more types of expressions, in particular expressions
-  * leading to lvalues (slicing, reshaping, etc...)
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief The tensor evaluator classes.
+ *
+ * These classes are responsible for the evaluation of the tensor expression.
+ *
+ * TODO: add support for more types of expressions, in particular expressions
+ * leading to lvalues (slicing, reshaping, etc...)
+ */
 
 // Generic evaluator
-template<typename Derived, typename Device>
-struct TensorEvaluator
-{
+template <typename Derived, typename Device>
+struct TensorEvaluator {
   typedef typename Derived::Index Index;
   typedef typename Derived::Scalar Scalar;
   typedef typename Derived::Scalar CoeffReturnType;
   typedef typename PacketType<CoeffReturnType, Device>::type PacketReturnType;
   typedef typename Derived::Dimensions Dimensions;
   typedef Derived XprType;
-  static constexpr int PacketSize =  PacketType<CoeffReturnType, Device>::size;
+  static constexpr int PacketSize = PacketType<CoeffReturnType, Device>::size;
   typedef typename internal::traits<Derived>::template MakePointer<Scalar>::Type TensorPointerType;
   typedef StorageMemory<Scalar, Device> Storage;
   typedef typename Storage::Type EvaluatorPointerType;
 
   // NumDimensions is -1 for variable dim tensors
-  static constexpr int NumCoords = internal::traits<Derived>::NumDimensions > 0 ?
-                                   internal::traits<Derived>::NumDimensions : 0;
+  static constexpr int NumCoords =
+      internal::traits<Derived>::NumDimensions > 0 ? internal::traits<Derived>::NumDimensions : 0;
   static constexpr int Layout = Derived::Layout;
 
   enum {
-    IsAligned          = Derived::IsAligned,
-    PacketAccess       = (PacketType<CoeffReturnType, Device>::size > 1),
-    BlockAccess        = internal::is_arithmetic<std::remove_const_t<Scalar>>::value,
-    PreferBlockAccess  = false,
-    CoordAccess        = NumCoords > 0,
-    RawAccess          = true
+    IsAligned = Derived::IsAligned,
+    PacketAccess = (PacketType<CoeffReturnType, Device>::size > 1),
+    BlockAccess = internal::is_arithmetic<std::remove_const_t<Scalar>>::value,
+    PreferBlockAccess = false,
+    CoordAccess = NumCoords > 0,
+    RawAccess = true
   };
 
   typedef std::remove_const_t<Scalar> ScalarNoConst;
@@ -61,18 +60,11 @@
   typedef internal::TensorBlockDescriptor<NumCoords, Index> TensorBlockDesc;
   typedef internal::TensorBlockScratchAllocator<Device> TensorBlockScratch;
 
-  typedef typename internal::TensorMaterializedBlock<ScalarNoConst, NumCoords,
-                                                     Layout, Index>
-      TensorBlock;
+  typedef typename internal::TensorMaterializedBlock<ScalarNoConst, NumCoords, Layout, Index> TensorBlock;
   //===--------------------------------------------------------------------===//
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  TensorEvaluator(const Derived& m, const Device& device)
-      : m_data(device.get((const_cast<TensorPointerType>(m.data())))),
-        m_dims(m.dimensions()),
-        m_device(device)
-  { }
-
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const Derived& m, const Device& device)
+      : m_data(device.get((const_cast<TensorPointerType>(m.data())))), m_dims(m.dimensions()), m_device(device) {}
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dims; }
 
@@ -86,8 +78,7 @@
 
 #ifdef EIGEN_USE_THREADS
   template <typename EvalSubExprsCallback>
-  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(
-      EvaluatorPointerType dest, EvalSubExprsCallback done) {
+  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(EvaluatorPointerType dest, EvalSubExprsCallback done) {
     // TODO(ezhulenev): ThreadPoolDevice memcpy is blockign operation.
     done(evalSubExprsIfNeeded(dest));
   }
@@ -100,14 +91,13 @@
     return m_data[index];
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType& coeffRef(Index index) const{
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType& coeffRef(Index index) const {
     eigen_assert(m_data != NULL);
     return m_data[index];
   }
 
-  template<int LoadMode> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  PacketReturnType packet(Index index) const
-  {
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const {
     return internal::ploadt<PacketReturnType, LoadMode>(m_data + index);
   }
 
@@ -116,16 +106,15 @@
   // Packet16f, `umask` is of type uint16_t and if a bit is 1, corresponding
   // float element will be loaded, otherwise 0 will be loaded.
   // Function has been templatized to enable Sfinae.
-  template <typename PacketReturnTypeT> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  std::enable_if_t<internal::unpacket_traits<PacketReturnTypeT>::masked_load_available, PacketReturnTypeT>
-  partialPacket(Index index, typename internal::unpacket_traits<PacketReturnTypeT>::mask_t umask) const
-  {
+  template <typename PacketReturnTypeT>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
+      std::enable_if_t<internal::unpacket_traits<PacketReturnTypeT>::masked_load_available, PacketReturnTypeT>
+      partialPacket(Index index, typename internal::unpacket_traits<PacketReturnTypeT>::mask_t umask) const {
     return internal::ploadu<PacketReturnTypeT>(m_data + index, umask);
   }
 
-  template <int StoreMode> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  void writePacket(Index index, const PacketReturnType& x) const
-  {
+  template <int StoreMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void writePacket(Index index, const PacketReturnType& x) const {
     return internal::pstoret<Scalar, PacketReturnType, StoreMode>(m_data + index, x);
   }
 
@@ -138,8 +127,7 @@
     }
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType&
-  coeffRef(const array<DenseIndex, NumCoords>& coords) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType& coeffRef(const array<DenseIndex, NumCoords>& coords) const {
     eigen_assert(m_data != NULL);
     if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
       return m_data[m_dims.IndexOfColMajor(coords)];
@@ -149,36 +137,28 @@
   }
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const {
-    return TensorOpCost(sizeof(CoeffReturnType), 0, 0, vectorized,
-                        PacketType<CoeffReturnType, Device>::size);
+    return TensorOpCost(sizeof(CoeffReturnType), 0, 0, vectorized, PacketType<CoeffReturnType, Device>::size);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  internal::TensorBlockResourceRequirements getResourceRequirements() const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE internal::TensorBlockResourceRequirements getResourceRequirements() const {
     return internal::TensorBlockResourceRequirements::any();
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock
-  block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
-          bool /*root_of_expr_ast*/ = false) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
+                                                          bool /*root_of_expr_ast*/ = false) const {
     eigen_assert(m_data != NULL);
     return TensorBlock::materialize(m_data, m_dims, desc, scratch);
   }
 
-  template<typename TensorBlock>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void writeBlock(
-      const TensorBlockDesc& desc, const TensorBlock& block) {
+  template <typename TensorBlock>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void writeBlock(const TensorBlockDesc& desc, const TensorBlock& block) {
     eigen_assert(m_data != NULL);
 
     typedef typename TensorBlock::XprType TensorBlockExpr;
-    typedef internal::TensorBlockAssignment<Scalar, NumCoords, TensorBlockExpr,
-                                            Index>
-        TensorBlockAssign;
+    typedef internal::TensorBlockAssignment<Scalar, NumCoords, TensorBlockExpr, Index> TensorBlockAssign;
 
     TensorBlockAssign::Run(
-        TensorBlockAssign::target(desc.dimensions(),
-                                  internal::strides<Layout>(m_dims), m_data,
-                                  desc.offset()),
+        TensorBlockAssign::target(desc.dimensions(), internal::strides<Layout>(m_dims), m_data, desc.offset()),
         block.expr());
   }
 
@@ -191,22 +171,22 @@
 };
 
 namespace internal {
-template <typename T> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-T loadConstant(const T* address) {
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T loadConstant(const T* address) {
   return *address;
 }
 // Use the texture cache on CUDA devices whenever possible
 #if defined(EIGEN_CUDA_ARCH) && EIGEN_CUDA_ARCH >= 350
-template <> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-float loadConstant(const float* address) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE float loadConstant(const float* address) {
   return __ldg(address);
 }
-template <> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-double loadConstant(const double* address) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE double loadConstant(const double* address) {
   return __ldg(address);
 }
-template <> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-Eigen::half loadConstant(const Eigen::half* address) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Eigen::half loadConstant(const Eigen::half* address) {
   return Eigen::half(half_impl::raw_uint16_to_half(__ldg(&address->x)));
 }
 #endif
@@ -214,9 +194,8 @@
 }  // namespace internal
 
 // Default evaluator for rvalues
-template<typename Derived, typename Device>
-struct TensorEvaluator<const Derived, Device>
-{
+template <typename Derived, typename Device>
+struct TensorEvaluator<const Derived, Device> {
   typedef typename Derived::Index Index;
   typedef typename Derived::Scalar Scalar;
   typedef typename Derived::Scalar CoeffReturnType;
@@ -230,39 +209,35 @@
   typedef std::remove_const_t<Scalar> ScalarNoConst;
 
   // NumDimensions is -1 for variable dim tensors
-  static constexpr int NumCoords = internal::traits<Derived>::NumDimensions > 0 ?
-                                   internal::traits<Derived>::NumDimensions : 0;
+  static constexpr int NumCoords =
+      internal::traits<Derived>::NumDimensions > 0 ? internal::traits<Derived>::NumDimensions : 0;
   static constexpr int PacketSize = PacketType<CoeffReturnType, Device>::size;
   static constexpr int Layout = Derived::Layout;
 
   enum {
-    IsAligned         = Derived::IsAligned,
-    PacketAccess      = (PacketType<CoeffReturnType, Device>::size > 1),
-    BlockAccess       = internal::is_arithmetic<ScalarNoConst>::value,
+    IsAligned = Derived::IsAligned,
+    PacketAccess = (PacketType<CoeffReturnType, Device>::size > 1),
+    BlockAccess = internal::is_arithmetic<ScalarNoConst>::value,
     PreferBlockAccess = false,
-    CoordAccess       = NumCoords > 0,
-    RawAccess         = true
+    CoordAccess = NumCoords > 0,
+    RawAccess = true
   };
 
   //===- Tensor block evaluation strategy (see TensorBlock.h) -------------===//
   typedef internal::TensorBlockDescriptor<NumCoords, Index> TensorBlockDesc;
   typedef internal::TensorBlockScratchAllocator<Device> TensorBlockScratch;
 
-  typedef typename internal::TensorMaterializedBlock<ScalarNoConst, NumCoords,
-                                                     Layout, Index>
-      TensorBlock;
+  typedef typename internal::TensorMaterializedBlock<ScalarNoConst, NumCoords, Layout, Index> TensorBlock;
   //===--------------------------------------------------------------------===//
 
-  EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
-  TensorEvaluator(const Derived& m, const Device& device)
-      : m_data(device.get(m.data())), m_dims(m.dimensions()), m_device(device)
-  { }
+  EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC TensorEvaluator(const Derived& m, const Device& device)
+      : m_data(device.get(m.data())), m_dims(m.dimensions()), m_device(device) {}
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dims; }
 
   EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType data) {
     if (!NumTraits<std::remove_const_t<Scalar>>::RequireInitialization && data) {
-      m_device.memcpy((void*)(m_device.get(data)),m_device.get(m_data), m_dims.TotalSize() * sizeof(Scalar));
+      m_device.memcpy((void*)(m_device.get(data)), m_device.get(m_data), m_dims.TotalSize() * sizeof(Scalar));
       return false;
     }
     return true;
@@ -270,23 +245,21 @@
 
 #ifdef EIGEN_USE_THREADS
   template <typename EvalSubExprsCallback>
-  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(
-      EvaluatorPointerType dest, EvalSubExprsCallback done) {
+  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(EvaluatorPointerType dest, EvalSubExprsCallback done) {
     // TODO(ezhulenev): ThreadPoolDevice memcpy is a blockign operation.
     done(evalSubExprsIfNeeded(dest));
   }
 #endif  // EIGEN_USE_THREADS
 
-  EIGEN_STRONG_INLINE void cleanup() { }
+  EIGEN_STRONG_INLINE void cleanup() {}
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
     eigen_assert(m_data != NULL);
-    return internal::loadConstant(m_data+index);
+    return internal::loadConstant(m_data + index);
   }
 
-  template<int LoadMode> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  PacketReturnType packet(Index index) const
-  {
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const {
     return internal::ploadt_ro<PacketReturnType, LoadMode>(m_data + index);
   }
 
@@ -295,33 +268,30 @@
   // Packet16f, `umask` is of type uint16_t and if a bit is 1, corresponding
   // float element will be loaded, otherwise 0 will be loaded.
   // Function has been templatized to enable Sfinae.
-  template <typename PacketReturnTypeT> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  std::enable_if_t<internal::unpacket_traits<PacketReturnTypeT>::masked_load_available, PacketReturnTypeT>
-  partialPacket(Index index, typename internal::unpacket_traits<PacketReturnTypeT>::mask_t umask) const
-  {
+  template <typename PacketReturnTypeT>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
+      std::enable_if_t<internal::unpacket_traits<PacketReturnTypeT>::masked_load_available, PacketReturnTypeT>
+      partialPacket(Index index, typename internal::unpacket_traits<PacketReturnTypeT>::mask_t umask) const {
     return internal::ploadu<PacketReturnTypeT>(m_data + index, umask);
   }
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(const array<DenseIndex, NumCoords>& coords) const {
     eigen_assert(m_data != NULL);
     const Index index = (static_cast<int>(Layout) == static_cast<int>(ColMajor)) ? m_dims.IndexOfColMajor(coords)
-                        : m_dims.IndexOfRowMajor(coords);
-    return internal::loadConstant(m_data+index);
+                                                                                 : m_dims.IndexOfRowMajor(coords);
+    return internal::loadConstant(m_data + index);
   }
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const {
-    return TensorOpCost(sizeof(CoeffReturnType), 0, 0, vectorized,
-                        PacketType<CoeffReturnType, Device>::size);
+    return TensorOpCost(sizeof(CoeffReturnType), 0, 0, vectorized, PacketType<CoeffReturnType, Device>::size);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  internal::TensorBlockResourceRequirements getResourceRequirements() const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE internal::TensorBlockResourceRequirements getResourceRequirements() const {
     return internal::TensorBlockResourceRequirements::any();
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock
-  block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
-          bool /*root_of_expr_ast*/ = false) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
+                                                          bool /*root_of_expr_ast*/ = false) const {
     eigen_assert(m_data != NULL);
     return TensorBlock::materialize(m_data, m_dims, desc, scratch);
   }
@@ -334,20 +304,14 @@
   const Device EIGEN_DEVICE_REF m_device;
 };
 
-
-
-
 // -------------------- CwiseNullaryOp --------------------
 
-template<typename NullaryOp, typename ArgType, typename Device>
-struct TensorEvaluator<const TensorCwiseNullaryOp<NullaryOp, ArgType>, Device>
-{
+template <typename NullaryOp, typename ArgType, typename Device>
+struct TensorEvaluator<const TensorCwiseNullaryOp<NullaryOp, ArgType>, Device> {
   typedef TensorCwiseNullaryOp<NullaryOp, ArgType> XprType;
 
-  EIGEN_DEVICE_FUNC
-  TensorEvaluator(const XprType& op, const Device& device)
-      : m_functor(op.functor()), m_argImpl(op.nestedExpression(), device), m_wrapper()
-  { }
+  EIGEN_DEVICE_FUNC TensorEvaluator(const XprType& op, const Device& device)
+      : m_functor(op.functor()), m_argImpl(op.nestedExpression(), device), m_wrapper() {}
 
   typedef typename XprType::Index Index;
   typedef typename XprType::Scalar Scalar;
@@ -362,10 +326,10 @@
   enum {
     IsAligned = true,
     PacketAccess = internal::functor_traits<NullaryOp>::PacketAccess
-    #ifdef EIGEN_USE_SYCL
-    &&  (PacketType<CoeffReturnType, Device>::size >1)
-    #endif
-    ,
+#ifdef EIGEN_USE_SYCL
+                   && (PacketType<CoeffReturnType, Device>::size > 1)
+#endif
+        ,
     BlockAccess = false,
     PreferBlockAccess = false,
     CoordAccess = false,  // to be implemented
@@ -382,65 +346,51 @@
 
 #ifdef EIGEN_USE_THREADS
   template <typename EvalSubExprsCallback>
-  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(
-      EvaluatorPointerType, EvalSubExprsCallback done) {
+  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(EvaluatorPointerType, EvalSubExprsCallback done) {
     done(true);
   }
 #endif  // EIGEN_USE_THREADS
 
-  EIGEN_STRONG_INLINE void cleanup() { }
+  EIGEN_STRONG_INLINE void cleanup() {}
 
-  EIGEN_DEVICE_FUNC CoeffReturnType coeff(Index index) const
-  {
-    return m_wrapper(m_functor, index);
-  }
+  EIGEN_DEVICE_FUNC CoeffReturnType coeff(Index index) const { return m_wrapper(m_functor, index); }
 
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const
-  {
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const {
     return m_wrapper.template packetOp<PacketReturnType, Index>(m_functor, index);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost
-  costPerCoeff(bool vectorized) const {
-    return TensorOpCost(sizeof(CoeffReturnType), 0, 0, vectorized,
-                        PacketType<CoeffReturnType, Device>::size);
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const {
+    return TensorOpCost(sizeof(CoeffReturnType), 0, 0, vectorized, PacketType<CoeffReturnType, Device>::size);
   }
 
-  EIGEN_DEVICE_FUNC  EvaluatorPointerType data() const { return NULL; }
+  EIGEN_DEVICE_FUNC EvaluatorPointerType data() const { return NULL; }
 
  private:
   const NullaryOp m_functor;
   TensorEvaluator<ArgType, Device> m_argImpl;
-  const internal::nullary_wrapper<CoeffReturnType,NullaryOp> m_wrapper;
+  const internal::nullary_wrapper<CoeffReturnType, NullaryOp> m_wrapper;
 };
 
-
-
 // -------------------- CwiseUnaryOp --------------------
 
-template<typename UnaryOp, typename ArgType, typename Device>
-struct TensorEvaluator<const TensorCwiseUnaryOp<UnaryOp, ArgType>, Device>
-{
+template <typename UnaryOp, typename ArgType, typename Device>
+struct TensorEvaluator<const TensorCwiseUnaryOp<UnaryOp, ArgType>, Device> {
   typedef TensorCwiseUnaryOp<UnaryOp, ArgType> XprType;
 
   static constexpr int Layout = TensorEvaluator<ArgType, Device>::Layout;
   enum {
-    IsAligned          = TensorEvaluator<ArgType, Device>::IsAligned,
-    PacketAccess       = int(TensorEvaluator<ArgType, Device>::PacketAccess) &
-                         int(internal::functor_traits<UnaryOp>::PacketAccess),
-    BlockAccess        = TensorEvaluator<ArgType, Device>::BlockAccess,
-    PreferBlockAccess  = TensorEvaluator<ArgType, Device>::PreferBlockAccess,
-    CoordAccess        = false,  // to be implemented
-    RawAccess          = false
+    IsAligned = TensorEvaluator<ArgType, Device>::IsAligned,
+    PacketAccess =
+        int(TensorEvaluator<ArgType, Device>::PacketAccess) & int(internal::functor_traits<UnaryOp>::PacketAccess),
+    BlockAccess = TensorEvaluator<ArgType, Device>::BlockAccess,
+    PreferBlockAccess = TensorEvaluator<ArgType, Device>::PreferBlockAccess,
+    CoordAccess = false,  // to be implemented
+    RawAccess = false
   };
 
-  EIGEN_DEVICE_FUNC
-  TensorEvaluator(const XprType& op, const Device& device)
-    : m_device(device),
-      m_functor(op.functor()),
-      m_argImpl(op.nestedExpression(), device)
-  { }
+  EIGEN_DEVICE_FUNC TensorEvaluator(const XprType& op, const Device& device)
+      : m_device(device), m_functor(op.functor()), m_argImpl(op.nestedExpression(), device) {}
 
   typedef typename XprType::Index Index;
   typedef typename XprType::Scalar Scalar;
@@ -457,11 +407,9 @@
   typedef internal::TensorBlockDescriptor<NumDims, Index> TensorBlockDesc;
   typedef internal::TensorBlockScratchAllocator<Device> TensorBlockScratch;
 
-  typedef typename TensorEvaluator<const ArgType, Device>::TensorBlock
-      ArgTensorBlock;
+  typedef typename TensorEvaluator<const ArgType, Device>::TensorBlock ArgTensorBlock;
 
-  typedef internal::TensorCwiseUnaryBlock<UnaryOp, ArgTensorBlock>
-      TensorBlock;
+  typedef internal::TensorCwiseUnaryBlock<UnaryOp, ArgTensorBlock> TensorBlock;
   //===--------------------------------------------------------------------===//
 
   EIGEN_DEVICE_FUNC const Dimensions& dimensions() const { return m_argImpl.dimensions(); }
@@ -473,43 +421,32 @@
 
 #ifdef EIGEN_USE_THREADS
   template <typename EvalSubExprsCallback>
-  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(
-      EvaluatorPointerType, EvalSubExprsCallback done) {
+  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(EvaluatorPointerType, EvalSubExprsCallback done) {
     m_argImpl.evalSubExprsIfNeededAsync(nullptr, [done](bool) { done(true); });
   }
 #endif  // EIGEN_USE_THREADS
 
-  EIGEN_STRONG_INLINE void cleanup() {
-    m_argImpl.cleanup();
-  }
+  EIGEN_STRONG_INLINE void cleanup() { m_argImpl.cleanup(); }
 
-  EIGEN_DEVICE_FUNC CoeffReturnType coeff(Index index) const
-  {
-    return m_functor(m_argImpl.coeff(index));
-  }
+  EIGEN_DEVICE_FUNC CoeffReturnType coeff(Index index) const { return m_functor(m_argImpl.coeff(index)); }
 
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const
-  {
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const {
     return m_functor.packetOp(m_argImpl.template packet<LoadMode>(index));
   }
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const {
     const double functor_cost = internal::functor_traits<UnaryOp>::Cost;
-    return m_argImpl.costPerCoeff(vectorized) +
-        TensorOpCost(0, 0, functor_cost, vectorized, PacketSize);
+    return m_argImpl.costPerCoeff(vectorized) + TensorOpCost(0, 0, functor_cost, vectorized, PacketSize);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  internal::TensorBlockResourceRequirements getResourceRequirements() const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE internal::TensorBlockResourceRequirements getResourceRequirements() const {
     static const double functor_cost = internal::functor_traits<UnaryOp>::Cost;
-    return m_argImpl.getResourceRequirements().addCostPerCoeff(
-        {0, 0, functor_cost / PacketSize});
+    return m_argImpl.getResourceRequirements().addCostPerCoeff({0, 0, functor_cost / PacketSize});
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock
-  block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
-          bool /*root_of_expr_ast*/ = false) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
+                                                          bool /*root_of_expr_ast*/ = false) const {
     return TensorBlock(m_argImpl.block(desc, scratch), m_functor);
   }
 
@@ -521,37 +458,36 @@
   TensorEvaluator<ArgType, Device> m_argImpl;
 };
 
-
 // -------------------- CwiseBinaryOp --------------------
 
-template<typename BinaryOp, typename LeftArgType, typename RightArgType, typename Device>
-struct TensorEvaluator<const TensorCwiseBinaryOp<BinaryOp, LeftArgType, RightArgType>, Device>
-{
+template <typename BinaryOp, typename LeftArgType, typename RightArgType, typename Device>
+struct TensorEvaluator<const TensorCwiseBinaryOp<BinaryOp, LeftArgType, RightArgType>, Device> {
   typedef TensorCwiseBinaryOp<BinaryOp, LeftArgType, RightArgType> XprType;
 
   static constexpr int Layout = TensorEvaluator<LeftArgType, Device>::Layout;
   enum {
-    IsAligned         = int(TensorEvaluator<LeftArgType, Device>::IsAligned) &
-                        int(TensorEvaluator<RightArgType, Device>::IsAligned),
-    PacketAccess      = int(TensorEvaluator<LeftArgType, Device>::PacketAccess) &
-                        int(TensorEvaluator<RightArgType, Device>::PacketAccess) &
-                        int(internal::functor_traits<BinaryOp>::PacketAccess),
-    BlockAccess       = int(TensorEvaluator<LeftArgType, Device>::BlockAccess) &
-                        int(TensorEvaluator<RightArgType, Device>::BlockAccess),
+    IsAligned =
+        int(TensorEvaluator<LeftArgType, Device>::IsAligned) & int(TensorEvaluator<RightArgType, Device>::IsAligned),
+    PacketAccess = int(TensorEvaluator<LeftArgType, Device>::PacketAccess) &
+                   int(TensorEvaluator<RightArgType, Device>::PacketAccess) &
+                   int(internal::functor_traits<BinaryOp>::PacketAccess),
+    BlockAccess = int(TensorEvaluator<LeftArgType, Device>::BlockAccess) &
+                  int(TensorEvaluator<RightArgType, Device>::BlockAccess),
     PreferBlockAccess = int(TensorEvaluator<LeftArgType, Device>::PreferBlockAccess) |
                         int(TensorEvaluator<RightArgType, Device>::PreferBlockAccess),
-    CoordAccess       = false,  // to be implemented
-    RawAccess         = false
+    CoordAccess = false,  // to be implemented
+    RawAccess = false
   };
 
-  EIGEN_DEVICE_FUNC
-  TensorEvaluator(const XprType& op, const Device& device)
-    : m_device(device),
-      m_functor(op.functor()),
-      m_leftImpl(op.lhsExpression(), device),
-      m_rightImpl(op.rhsExpression(), device)
-  {
-    EIGEN_STATIC_ASSERT((static_cast<int>(TensorEvaluator<LeftArgType, Device>::Layout) == static_cast<int>(TensorEvaluator<RightArgType, Device>::Layout) || internal::traits<XprType>::NumDimensions <= 1), YOU_MADE_A_PROGRAMMING_MISTAKE);
+  EIGEN_DEVICE_FUNC TensorEvaluator(const XprType& op, const Device& device)
+      : m_device(device),
+        m_functor(op.functor()),
+        m_leftImpl(op.lhsExpression(), device),
+        m_rightImpl(op.rhsExpression(), device) {
+    EIGEN_STATIC_ASSERT((static_cast<int>(TensorEvaluator<LeftArgType, Device>::Layout) ==
+                             static_cast<int>(TensorEvaluator<RightArgType, Device>::Layout) ||
+                         internal::traits<XprType>::NumDimensions <= 1),
+                        YOU_MADE_A_PROGRAMMING_MISTAKE);
     eigen_assert(dimensions_match(m_leftImpl.dimensions(), m_rightImpl.dimensions()));
   }
 
@@ -564,25 +500,19 @@
   typedef StorageMemory<CoeffReturnType, Device> Storage;
   typedef typename Storage::Type EvaluatorPointerType;
 
-  static constexpr int NumDims = internal::array_size<
-      typename TensorEvaluator<LeftArgType, Device>::Dimensions>::value;
+  static constexpr int NumDims = internal::array_size<typename TensorEvaluator<LeftArgType, Device>::Dimensions>::value;
 
   //===- Tensor block evaluation strategy (see TensorBlock.h) -------------===//
   typedef internal::TensorBlockDescriptor<NumDims, Index> TensorBlockDesc;
   typedef internal::TensorBlockScratchAllocator<Device> TensorBlockScratch;
 
-  typedef typename TensorEvaluator<const LeftArgType, Device>::TensorBlock
-      LeftTensorBlock;
-  typedef typename TensorEvaluator<const RightArgType, Device>::TensorBlock
-      RightTensorBlock;
+  typedef typename TensorEvaluator<const LeftArgType, Device>::TensorBlock LeftTensorBlock;
+  typedef typename TensorEvaluator<const RightArgType, Device>::TensorBlock RightTensorBlock;
 
-  typedef internal::TensorCwiseBinaryBlock<BinaryOp, LeftTensorBlock,
-                                           RightTensorBlock>
-      TensorBlock;
+  typedef internal::TensorCwiseBinaryBlock<BinaryOp, LeftTensorBlock, RightTensorBlock> TensorBlock;
   //===--------------------------------------------------------------------===//
 
-  EIGEN_DEVICE_FUNC const Dimensions& dimensions() const
-  {
+  EIGEN_DEVICE_FUNC const Dimensions& dimensions() const {
     // TODO: use right impl instead if right impl dimensions are known at compile time.
     return m_leftImpl.dimensions();
   }
@@ -595,13 +525,10 @@
 
 #ifdef EIGEN_USE_THREADS
   template <typename EvalSubExprsCallback>
-  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(
-      EvaluatorPointerType, EvalSubExprsCallback done) {
+  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(EvaluatorPointerType, EvalSubExprsCallback done) {
     // TODO(ezhulenev): Evaluate two expression in parallel?
-    m_leftImpl.evalSubExprsIfNeededAsync(nullptr, [this, done](bool) {
-      m_rightImpl.evalSubExprsIfNeededAsync(nullptr,
-                                            [done](bool) { done(true); });
-    });
+    m_leftImpl.evalSubExprsIfNeededAsync(
+        nullptr, [this, done](bool) { m_rightImpl.evalSubExprsIfNeededAsync(nullptr, [done](bool) { done(true); }); });
   }
 #endif  // EIGEN_USE_THREADS
 
@@ -610,39 +537,32 @@
     m_rightImpl.cleanup();
   }
 
-  EIGEN_DEVICE_FUNC CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC CoeffReturnType coeff(Index index) const {
     return m_functor(m_leftImpl.coeff(index), m_rightImpl.coeff(index));
   }
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const
-  {
-    return m_functor.packetOp(m_leftImpl.template packet<LoadMode>(index), m_rightImpl.template packet<LoadMode>(index));
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const {
+    return m_functor.packetOp(m_leftImpl.template packet<LoadMode>(index),
+                              m_rightImpl.template packet<LoadMode>(index));
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost
-  costPerCoeff(bool vectorized) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const {
     const double functor_cost = internal::functor_traits<BinaryOp>::Cost;
-    return m_leftImpl.costPerCoeff(vectorized) +
-           m_rightImpl.costPerCoeff(vectorized) +
+    return m_leftImpl.costPerCoeff(vectorized) + m_rightImpl.costPerCoeff(vectorized) +
            TensorOpCost(0, 0, functor_cost, vectorized, PacketSize);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  internal::TensorBlockResourceRequirements getResourceRequirements() const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE internal::TensorBlockResourceRequirements getResourceRequirements() const {
     static const double functor_cost = internal::functor_traits<BinaryOp>::Cost;
-    return internal::TensorBlockResourceRequirements::merge(
-               m_leftImpl.getResourceRequirements(),
-               m_rightImpl.getResourceRequirements())
+    return internal::TensorBlockResourceRequirements::merge(m_leftImpl.getResourceRequirements(),
+                                                            m_rightImpl.getResourceRequirements())
         .addCostPerCoeff({0, 0, functor_cost / PacketSize});
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock
-  block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
-          bool /*root_of_expr_ast*/ = false) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
+                                                          bool /*root_of_expr_ast*/ = false) const {
     desc.DropDestinationBuffer();
-    return TensorBlock(m_leftImpl.block(desc, scratch),
-                         m_rightImpl.block(desc, scratch), m_functor);
+    return TensorBlock(m_leftImpl.block(desc, scratch), m_rightImpl.block(desc, scratch), m_functor);
   }
 
   EIGEN_DEVICE_FUNC EvaluatorPointerType data() const { return NULL; }
@@ -656,49 +576,49 @@
 
 // -------------------- CwiseTernaryOp --------------------
 
-template<typename TernaryOp, typename Arg1Type, typename Arg2Type, typename Arg3Type, typename Device>
-struct TensorEvaluator<const TensorCwiseTernaryOp<TernaryOp, Arg1Type, Arg2Type, Arg3Type>, Device>
-{
+template <typename TernaryOp, typename Arg1Type, typename Arg2Type, typename Arg3Type, typename Device>
+struct TensorEvaluator<const TensorCwiseTernaryOp<TernaryOp, Arg1Type, Arg2Type, Arg3Type>, Device> {
   typedef TensorCwiseTernaryOp<TernaryOp, Arg1Type, Arg2Type, Arg3Type> XprType;
 
   static constexpr int Layout = TensorEvaluator<Arg1Type, Device>::Layout;
   enum {
-    IsAligned = TensorEvaluator<Arg1Type, Device>::IsAligned & TensorEvaluator<Arg2Type, Device>::IsAligned & TensorEvaluator<Arg3Type, Device>::IsAligned,
-    PacketAccess      = TensorEvaluator<Arg1Type, Device>::PacketAccess &&
-                        TensorEvaluator<Arg2Type, Device>::PacketAccess &&
-                        TensorEvaluator<Arg3Type, Device>::PacketAccess &&
-                        internal::functor_traits<TernaryOp>::PacketAccess,
-    BlockAccess       = false,
+    IsAligned = TensorEvaluator<Arg1Type, Device>::IsAligned & TensorEvaluator<Arg2Type, Device>::IsAligned &
+                TensorEvaluator<Arg3Type, Device>::IsAligned,
+    PacketAccess = TensorEvaluator<Arg1Type, Device>::PacketAccess && TensorEvaluator<Arg2Type, Device>::PacketAccess &&
+                   TensorEvaluator<Arg3Type, Device>::PacketAccess && internal::functor_traits<TernaryOp>::PacketAccess,
+    BlockAccess = false,
     PreferBlockAccess = TensorEvaluator<Arg1Type, Device>::PreferBlockAccess ||
                         TensorEvaluator<Arg2Type, Device>::PreferBlockAccess ||
                         TensorEvaluator<Arg3Type, Device>::PreferBlockAccess,
-    CoordAccess       = false,  // to be implemented
-    RawAccess         = false
+    CoordAccess = false,  // to be implemented
+    RawAccess = false
   };
 
-  EIGEN_DEVICE_FUNC
-  TensorEvaluator(const XprType& op, const Device& device)
-    : m_functor(op.functor()),
-      m_arg1Impl(op.arg1Expression(), device),
-      m_arg2Impl(op.arg2Expression(), device),
-      m_arg3Impl(op.arg3Expression(), device)
-  {
-    EIGEN_STATIC_ASSERT((static_cast<int>(TensorEvaluator<Arg1Type, Device>::Layout) == static_cast<int>(TensorEvaluator<Arg3Type, Device>::Layout) || internal::traits<XprType>::NumDimensions <= 1), YOU_MADE_A_PROGRAMMING_MISTAKE);
+  EIGEN_DEVICE_FUNC TensorEvaluator(const XprType& op, const Device& device)
+      : m_functor(op.functor()),
+        m_arg1Impl(op.arg1Expression(), device),
+        m_arg2Impl(op.arg2Expression(), device),
+        m_arg3Impl(op.arg3Expression(), device) {
+    EIGEN_STATIC_ASSERT((static_cast<int>(TensorEvaluator<Arg1Type, Device>::Layout) ==
+                             static_cast<int>(TensorEvaluator<Arg3Type, Device>::Layout) ||
+                         internal::traits<XprType>::NumDimensions <= 1),
+                        YOU_MADE_A_PROGRAMMING_MISTAKE);
 
     EIGEN_STATIC_ASSERT((internal::is_same<typename internal::traits<Arg1Type>::StorageKind,
-                         typename internal::traits<Arg2Type>::StorageKind>::value),
+                                           typename internal::traits<Arg2Type>::StorageKind>::value),
                         STORAGE_KIND_MUST_MATCH)
     EIGEN_STATIC_ASSERT((internal::is_same<typename internal::traits<Arg1Type>::StorageKind,
-                         typename internal::traits<Arg3Type>::StorageKind>::value),
+                                           typename internal::traits<Arg3Type>::StorageKind>::value),
                         STORAGE_KIND_MUST_MATCH)
     EIGEN_STATIC_ASSERT((internal::is_same<typename internal::traits<Arg1Type>::Index,
-                         typename internal::traits<Arg2Type>::Index>::value),
+                                           typename internal::traits<Arg2Type>::Index>::value),
                         STORAGE_INDEX_MUST_MATCH)
     EIGEN_STATIC_ASSERT((internal::is_same<typename internal::traits<Arg1Type>::Index,
-                         typename internal::traits<Arg3Type>::Index>::value),
+                                           typename internal::traits<Arg3Type>::Index>::value),
                         STORAGE_INDEX_MUST_MATCH)
 
-    eigen_assert(dimensions_match(m_arg1Impl.dimensions(), m_arg2Impl.dimensions()) && dimensions_match(m_arg1Impl.dimensions(), m_arg3Impl.dimensions()));
+    eigen_assert(dimensions_match(m_arg1Impl.dimensions(), m_arg2Impl.dimensions()) &&
+                 dimensions_match(m_arg1Impl.dimensions(), m_arg3Impl.dimensions()));
   }
 
   typedef typename XprType::Index Index;
@@ -714,8 +634,7 @@
   typedef internal::TensorBlockNotImplemented TensorBlock;
   //===--------------------------------------------------------------------===//
 
-  EIGEN_DEVICE_FUNC const Dimensions& dimensions() const
-  {
+  EIGEN_DEVICE_FUNC const Dimensions& dimensions() const {
     // TODO: use arg2 or arg3 dimensions if they are known at compile time.
     return m_arg1Impl.dimensions();
   }
@@ -732,25 +651,19 @@
     m_arg3Impl.cleanup();
   }
 
-  EIGEN_DEVICE_FUNC CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC CoeffReturnType coeff(Index index) const {
     return m_functor(m_arg1Impl.coeff(index), m_arg2Impl.coeff(index), m_arg3Impl.coeff(index));
   }
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const
-  {
-    return m_functor.packetOp(m_arg1Impl.template packet<LoadMode>(index),
-                              m_arg2Impl.template packet<LoadMode>(index),
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const {
+    return m_functor.packetOp(m_arg1Impl.template packet<LoadMode>(index), m_arg2Impl.template packet<LoadMode>(index),
                               m_arg3Impl.template packet<LoadMode>(index));
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost
-  costPerCoeff(bool vectorized) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const {
     const double functor_cost = internal::functor_traits<TernaryOp>::Cost;
-    return m_arg1Impl.costPerCoeff(vectorized) +
-           m_arg2Impl.costPerCoeff(vectorized) +
-           m_arg3Impl.costPerCoeff(vectorized) +
-           TensorOpCost(0, 0, functor_cost, vectorized, PacketSize);
+    return m_arg1Impl.costPerCoeff(vectorized) + m_arg2Impl.costPerCoeff(vectorized) +
+           m_arg3Impl.costPerCoeff(vectorized) + TensorOpCost(0, 0, functor_cost, vectorized, PacketSize);
   }
 
   EIGEN_DEVICE_FUNC EvaluatorPointerType data() const { return NULL; }
@@ -762,15 +675,13 @@
   TensorEvaluator<Arg3Type, Device> m_arg3Impl;
 };
 
-
 // -------------------- SelectOp --------------------
 
-template<typename IfArgType, typename ThenArgType, typename ElseArgType, typename Device>
-struct TensorEvaluator<const TensorSelectOp<IfArgType, ThenArgType, ElseArgType>, Device>
-{
+template <typename IfArgType, typename ThenArgType, typename ElseArgType, typename Device>
+struct TensorEvaluator<const TensorSelectOp<IfArgType, ThenArgType, ElseArgType>, Device> {
   typedef TensorSelectOp<IfArgType, ThenArgType, ElseArgType> XprType;
   typedef typename XprType::Scalar Scalar;
-  
+
   using TernarySelectOp = internal::scalar_boolean_select_op<typename internal::traits<ThenArgType>::Scalar,
                                                              typename internal::traits<ElseArgType>::Scalar,
                                                              typename internal::traits<IfArgType>::Scalar>;
@@ -778,31 +689,32 @@
       TensorEvaluator<ThenArgType, Device>::PacketAccess && TensorEvaluator<ElseArgType, Device>::PacketAccess &&
       TensorEvaluator<IfArgType, Device>::PacketAccess && internal::functor_traits<TernarySelectOp>::PacketAccess;
 
-    static constexpr int Layout = TensorEvaluator<IfArgType, Device>::Layout;
+  static constexpr int Layout = TensorEvaluator<IfArgType, Device>::Layout;
   enum {
-    IsAligned         = TensorEvaluator<ThenArgType, Device>::IsAligned &
-                        TensorEvaluator<ElseArgType, Device>::IsAligned,
-    PacketAccess      = (TensorEvaluator<ThenArgType, Device>::PacketAccess &&
-                        TensorEvaluator<ElseArgType, Device>::PacketAccess &&
-                        PacketType<Scalar, Device>::HasBlend) || TernaryPacketAccess,
-    BlockAccess       = TensorEvaluator<IfArgType, Device>::BlockAccess &&
-                        TensorEvaluator<ThenArgType, Device>::BlockAccess &&
-                        TensorEvaluator<ElseArgType, Device>::BlockAccess,
+    IsAligned = TensorEvaluator<ThenArgType, Device>::IsAligned & TensorEvaluator<ElseArgType, Device>::IsAligned,
+    PacketAccess = (TensorEvaluator<ThenArgType, Device>::PacketAccess &&
+                    TensorEvaluator<ElseArgType, Device>::PacketAccess && PacketType<Scalar, Device>::HasBlend) ||
+                   TernaryPacketAccess,
+    BlockAccess = TensorEvaluator<IfArgType, Device>::BlockAccess &&
+                  TensorEvaluator<ThenArgType, Device>::BlockAccess &&
+                  TensorEvaluator<ElseArgType, Device>::BlockAccess,
     PreferBlockAccess = TensorEvaluator<IfArgType, Device>::PreferBlockAccess ||
                         TensorEvaluator<ThenArgType, Device>::PreferBlockAccess ||
                         TensorEvaluator<ElseArgType, Device>::PreferBlockAccess,
-    CoordAccess       = false,  // to be implemented
-    RawAccess         = false
+    CoordAccess = false,  // to be implemented
+    RawAccess = false
   };
 
-  EIGEN_DEVICE_FUNC
-  TensorEvaluator(const XprType& op, const Device& device)
-    : m_condImpl(op.ifExpression(), device),
-      m_thenImpl(op.thenExpression(), device),
-      m_elseImpl(op.elseExpression(), device)
-  {
-    EIGEN_STATIC_ASSERT((static_cast<int>(TensorEvaluator<IfArgType, Device>::Layout) == static_cast<int>(TensorEvaluator<ThenArgType, Device>::Layout)), YOU_MADE_A_PROGRAMMING_MISTAKE);
-    EIGEN_STATIC_ASSERT((static_cast<int>(TensorEvaluator<IfArgType, Device>::Layout) == static_cast<int>(TensorEvaluator<ElseArgType, Device>::Layout)), YOU_MADE_A_PROGRAMMING_MISTAKE);
+  EIGEN_DEVICE_FUNC TensorEvaluator(const XprType& op, const Device& device)
+      : m_condImpl(op.ifExpression(), device),
+        m_thenImpl(op.thenExpression(), device),
+        m_elseImpl(op.elseExpression(), device) {
+    EIGEN_STATIC_ASSERT((static_cast<int>(TensorEvaluator<IfArgType, Device>::Layout) ==
+                         static_cast<int>(TensorEvaluator<ThenArgType, Device>::Layout)),
+                        YOU_MADE_A_PROGRAMMING_MISTAKE);
+    EIGEN_STATIC_ASSERT((static_cast<int>(TensorEvaluator<IfArgType, Device>::Layout) ==
+                         static_cast<int>(TensorEvaluator<ElseArgType, Device>::Layout)),
+                        YOU_MADE_A_PROGRAMMING_MISTAKE);
     eigen_assert(dimensions_match(m_condImpl.dimensions(), m_thenImpl.dimensions()));
     eigen_assert(dimensions_match(m_thenImpl.dimensions(), m_elseImpl.dimensions()));
   }
@@ -818,15 +730,12 @@
   static constexpr int NumDims = internal::array_size<Dimensions>::value;
 
   //===- Tensor block evaluation strategy (see TensorBlock.h) -------------===//
-    typedef internal::TensorBlockDescriptor<NumDims, Index> TensorBlockDesc;
+  typedef internal::TensorBlockDescriptor<NumDims, Index> TensorBlockDesc;
   typedef internal::TensorBlockScratchAllocator<Device> TensorBlockScratch;
 
-  typedef typename TensorEvaluator<const IfArgType, Device>::TensorBlock
-      IfArgTensorBlock;
-  typedef typename TensorEvaluator<const ThenArgType, Device>::TensorBlock
-      ThenArgTensorBlock;
-  typedef typename TensorEvaluator<const ElseArgType, Device>::TensorBlock
-      ElseArgTensorBlock;
+  typedef typename TensorEvaluator<const IfArgType, Device>::TensorBlock IfArgTensorBlock;
+  typedef typename TensorEvaluator<const ThenArgType, Device>::TensorBlock ThenArgTensorBlock;
+  typedef typename TensorEvaluator<const ElseArgType, Device>::TensorBlock ElseArgTensorBlock;
 
   struct TensorSelectOpBlockFactory {
     template <typename IfArgXprType, typename ThenArgXprType, typename ElseArgXprType>
@@ -835,20 +744,19 @@
     };
 
     template <typename IfArgXprType, typename ThenArgXprType, typename ElseArgXprType>
-    typename XprType<IfArgXprType, ThenArgXprType, ElseArgXprType>::type expr(
-        const IfArgXprType& if_expr, const ThenArgXprType& then_expr, const ElseArgXprType& else_expr) const {
+    typename XprType<IfArgXprType, ThenArgXprType, ElseArgXprType>::type expr(const IfArgXprType& if_expr,
+                                                                              const ThenArgXprType& then_expr,
+                                                                              const ElseArgXprType& else_expr) const {
       return typename XprType<IfArgXprType, ThenArgXprType, ElseArgXprType>::type(if_expr, then_expr, else_expr);
     }
   };
 
-  typedef internal::TensorTernaryExprBlock<TensorSelectOpBlockFactory,
-                                           IfArgTensorBlock, ThenArgTensorBlock,
+  typedef internal::TensorTernaryExprBlock<TensorSelectOpBlockFactory, IfArgTensorBlock, ThenArgTensorBlock,
                                            ElseArgTensorBlock>
       TensorBlock;
   //===--------------------------------------------------------------------===//
 
-  EIGEN_DEVICE_FUNC const Dimensions& dimensions() const
-  {
+  EIGEN_DEVICE_FUNC const Dimensions& dimensions() const {
     // TODO: use then or else impl instead if they happen to be known at compile time.
     return m_condImpl.dimensions();
   }
@@ -862,12 +770,10 @@
 
 #ifdef EIGEN_USE_THREADS
   template <typename EvalSubExprsCallback>
-  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(
-      EvaluatorPointerType, EvalSubExprsCallback done) {
+  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(EvaluatorPointerType, EvalSubExprsCallback done) {
     m_condImpl.evalSubExprsIfNeeded(nullptr, [this, done](bool) {
-      m_thenImpl.evalSubExprsIfNeeded(nullptr, [this, done](bool) {
-        m_elseImpl.evalSubExprsIfNeeded(nullptr, [done](bool) { done(true); });
-      });
+      m_thenImpl.evalSubExprsIfNeeded(
+          nullptr, [this, done](bool) { m_elseImpl.evalSubExprsIfNeeded(nullptr, [done](bool) { done(true); }); });
     });
   }
 #endif  // EIGEN_USE_THREADS
@@ -878,72 +784,58 @@
     m_elseImpl.cleanup();
   }
 
-  EIGEN_DEVICE_FUNC CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC CoeffReturnType coeff(Index index) const {
     return m_condImpl.coeff(index) ? m_thenImpl.coeff(index) : m_elseImpl.coeff(index);
   }
 
-  template<int LoadMode, bool UseTernary = TernaryPacketAccess,
-           std::enable_if_t<!UseTernary, bool> = true>
-  EIGEN_DEVICE_FUNC PacketReturnType packet(Index index) const
-  {
-     internal::Selector<PacketSize> select;
-     EIGEN_UNROLL_LOOP
-     for (Index i = 0; i < PacketSize; ++i) {
-       select.select[i] = m_condImpl.coeff(index+i);
-     }
-     return internal::pblend(select,
-                             m_thenImpl.template packet<LoadMode>(index),
-                             m_elseImpl.template packet<LoadMode>(index));
-
+  template <int LoadMode, bool UseTernary = TernaryPacketAccess, std::enable_if_t<!UseTernary, bool> = true>
+  EIGEN_DEVICE_FUNC PacketReturnType packet(Index index) const {
+    internal::Selector<PacketSize> select;
+    EIGEN_UNROLL_LOOP
+    for (Index i = 0; i < PacketSize; ++i) {
+      select.select[i] = m_condImpl.coeff(index + i);
+    }
+    return internal::pblend(select, m_thenImpl.template packet<LoadMode>(index),
+                            m_elseImpl.template packet<LoadMode>(index));
   }
 
-  template <int LoadMode, bool UseTernary = TernaryPacketAccess,
-            std::enable_if_t<UseTernary, bool> = true>
+  template <int LoadMode, bool UseTernary = TernaryPacketAccess, std::enable_if_t<UseTernary, bool> = true>
   EIGEN_DEVICE_FUNC PacketReturnType packet(Index index) const {
     return TernarySelectOp().template packetOp<PacketReturnType>(m_thenImpl.template packet<LoadMode>(index),
                                                                  m_elseImpl.template packet<LoadMode>(index),
                                                                  m_condImpl.template packet<LoadMode>(index));
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost
-  costPerCoeff(bool vectorized) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const {
     return m_condImpl.costPerCoeff(vectorized) +
-           m_thenImpl.costPerCoeff(vectorized)
-        .cwiseMax(m_elseImpl.costPerCoeff(vectorized));
+           m_thenImpl.costPerCoeff(vectorized).cwiseMax(m_elseImpl.costPerCoeff(vectorized));
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  internal::TensorBlockResourceRequirements getResourceRequirements() const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE internal::TensorBlockResourceRequirements getResourceRequirements() const {
     auto then_req = m_thenImpl.getResourceRequirements();
     auto else_req = m_elseImpl.getResourceRequirements();
 
-    auto merged_req =
-        internal::TensorBlockResourceRequirements::merge(then_req, else_req);
-    merged_req.cost_per_coeff =
-        then_req.cost_per_coeff.cwiseMax(else_req.cost_per_coeff);
+    auto merged_req = internal::TensorBlockResourceRequirements::merge(then_req, else_req);
+    merged_req.cost_per_coeff = then_req.cost_per_coeff.cwiseMax(else_req.cost_per_coeff);
 
-    return internal::TensorBlockResourceRequirements::merge(
-        m_condImpl.getResourceRequirements(), merged_req);
+    return internal::TensorBlockResourceRequirements::merge(m_condImpl.getResourceRequirements(), merged_req);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock
-  block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
-          bool /*root_of_expr_ast*/ = false) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
+                                                          bool /*root_of_expr_ast*/ = false) const {
     // It's unsafe to pass destination buffer to underlying expressions, because
     // output might be aliased with one of the inputs.
     desc.DropDestinationBuffer();
 
-    return TensorBlock(
-        m_condImpl.block(desc, scratch), m_thenImpl.block(desc, scratch),
-        m_elseImpl.block(desc, scratch), TensorSelectOpBlockFactory());
+    return TensorBlock(m_condImpl.block(desc, scratch), m_thenImpl.block(desc, scratch),
+                       m_elseImpl.block(desc, scratch), TensorSelectOpBlockFactory());
   }
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EvaluatorPointerType data() const { return NULL; }
 
 #ifdef EIGEN_USE_SYCL
- // binding placeholder accessors to a command group handler for SYCL
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void bind(cl::sycl::handler &cgh) const {
+  // binding placeholder accessors to a command group handler for SYCL
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void bind(cl::sycl::handler& cgh) const {
     m_condImpl.bind(cgh);
     m_thenImpl.bind(cgh);
     m_elseImpl.bind(cgh);
@@ -955,14 +847,13 @@
   TensorEvaluator<ElseArgType, Device> m_elseImpl;
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
 #if defined(EIGEN_USE_SYCL) && defined(SYCL_COMPILER_IS_DPCPP)
 template <typename Derived, typename Device>
 struct cl::sycl::is_device_copyable<
     Eigen::TensorEvaluator<Derived, Device>,
-    std::enable_if_t<!std::is_trivially_copyable<
-        Eigen::TensorEvaluator<Derived, Device>>::value>> : std::true_type {};
+    std::enable_if_t<!std::is_trivially_copyable<Eigen::TensorEvaluator<Derived, Device>>::value>> : std::true_type {};
 #endif
 
-#endif // EIGEN_CXX11_TENSOR_TENSOR_EVALUATOR_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_EVALUATOR_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorExecutor.h b/unsupported/Eigen/CXX11/src/Tensor/TensorExecutor.h
index e8fb85d..fe4b38c 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorExecutor.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorExecutor.h
@@ -41,35 +41,30 @@
 
 // TODO(ezhulenev): Add specializations for all other types of Tensor ops.
 
-template<typename Expression>
+template <typename Expression>
 struct ExpressionHasTensorBroadcastingOp {
   enum { value = false };
 };
 
-template<typename LhsXprType, typename RhsXprType>
-struct ExpressionHasTensorBroadcastingOp<
-    const TensorAssignOp<LhsXprType, RhsXprType> > {
+template <typename LhsXprType, typename RhsXprType>
+struct ExpressionHasTensorBroadcastingOp<const TensorAssignOp<LhsXprType, RhsXprType> > {
   enum { value = ExpressionHasTensorBroadcastingOp<RhsXprType>::value };
 };
 
-template<typename UnaryOp, typename XprType>
-struct ExpressionHasTensorBroadcastingOp<
-    const TensorCwiseUnaryOp<UnaryOp, XprType> > {
+template <typename UnaryOp, typename XprType>
+struct ExpressionHasTensorBroadcastingOp<const TensorCwiseUnaryOp<UnaryOp, XprType> > {
   enum { value = ExpressionHasTensorBroadcastingOp<XprType>::value };
 };
 
-template<typename BinaryOp, typename LhsXprType, typename RhsXprType>
-struct ExpressionHasTensorBroadcastingOp<
-    const TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType> > {
+template <typename BinaryOp, typename LhsXprType, typename RhsXprType>
+struct ExpressionHasTensorBroadcastingOp<const TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType> > {
   enum {
-    value = ExpressionHasTensorBroadcastingOp<LhsXprType>::value ||
-        ExpressionHasTensorBroadcastingOp<RhsXprType>::value
+    value = ExpressionHasTensorBroadcastingOp<LhsXprType>::value || ExpressionHasTensorBroadcastingOp<RhsXprType>::value
   };
 };
 
-template<typename Broadcast, typename XprType>
-struct ExpressionHasTensorBroadcastingOp<
-    const TensorBroadcastingOp<Broadcast, XprType> > {
+template <typename Broadcast, typename XprType>
+struct ExpressionHasTensorBroadcastingOp<const TensorBroadcastingOp<Broadcast, XprType> > {
   enum { value = true };
 };
 
@@ -79,8 +74,7 @@
  * Default strategy: the expression is evaluated sequentially with a single cpu
  * thread, without vectorization and block evaluation.
  */
-template <typename Expression, typename Device, bool Vectorizable,
-          TiledEvaluation Tiling>
+template <typename Expression, typename Device, bool Vectorizable, TiledEvaluation Tiling>
 class TensorExecutor {
  public:
   typedef typename Expression::Index StorageIndex;
@@ -95,8 +89,7 @@
                 "You must #define EIGEN_USE_THREADS, EIGEN_USE_GPU or "
                 "EIGEN_USE_SYCL before including Eigen headers.");
 
-  static EIGEN_STRONG_INLINE void run(const Expression& expr,
-                                      const Device& device = DefaultDevice()) {
+  static EIGEN_STRONG_INLINE void run(const Expression& expr, const Device& device = DefaultDevice()) {
     TensorEvaluator<Expression, Device> evaluator(expr, device);
     const bool needs_assign = evaluator.evalSubExprsIfNeeded(NULL);
     if (needs_assign) {
@@ -113,8 +106,7 @@
  * Default async execution strategy is not implemented. Currently it's only
  * available for ThreadPoolDevice (see definition below).
  */
-template <typename Expression, typename Device, typename DoneCallback,
-          bool Vectorizable, TiledEvaluation Tiling>
+template <typename Expression, typename Device, typename DoneCallback, bool Vectorizable, TiledEvaluation Tiling>
 class TensorAsyncExecutor {};
 
 /**
@@ -126,20 +118,18 @@
  public:
   typedef typename Expression::Index StorageIndex;
 
-  static EIGEN_STRONG_INLINE void run(
-      const Expression& expr, const DefaultDevice& device = DefaultDevice()) {
+  static EIGEN_STRONG_INLINE void run(const Expression& expr, const DefaultDevice& device = DefaultDevice()) {
     TensorEvaluator<Expression, DefaultDevice> evaluator(expr, device);
     const bool needs_assign = evaluator.evalSubExprsIfNeeded(NULL);
     if (needs_assign) {
       const StorageIndex size = array_prod(evaluator.dimensions());
-      const int PacketSize = unpacket_traits<typename TensorEvaluator<
-          Expression, DefaultDevice>::PacketReturnType>::size;
+      const int PacketSize =
+          unpacket_traits<typename TensorEvaluator<Expression, DefaultDevice>::PacketReturnType>::size;
 
       // Give compiler a strong possibility to unroll the loop. But don't insist
       // on unrolling, because if the function is expensive compiler should not
       // unroll the loop at the expense of inlining.
-      const StorageIndex UnrolledSize =
-          (size / (4 * PacketSize)) * 4 * PacketSize;
+      const StorageIndex UnrolledSize = (size / (4 * PacketSize)) * 4 * PacketSize;
       for (StorageIndex i = 0; i < UnrolledSize; i += 4 * PacketSize) {
         for (StorageIndex j = 0; j < 4; j++) {
           evaluator.evalPacket(i + j * PacketSize);
@@ -173,16 +163,12 @@
 
   static constexpr int NumDims = traits<Expression>::NumDimensions;
 
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE void run(const Expression& expr,
-                         const DefaultDevice& device = DefaultDevice()) {
-    typedef TensorBlockMapper<NumDims, Evaluator::Layout, StorageIndex>
-        TensorBlockMapper;
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(const Expression& expr,
+                                                        const DefaultDevice& device = DefaultDevice()) {
+    typedef TensorBlockMapper<NumDims, Evaluator::Layout, StorageIndex> TensorBlockMapper;
 
-    typedef internal::TensorBlockDescriptor<NumDims, StorageIndex>
-        TensorBlockDesc;
-    typedef internal::TensorBlockScratchAllocator<DefaultDevice>
-        TensorBlockScratch;
+    typedef internal::TensorBlockDescriptor<NumDims, StorageIndex> TensorBlockDesc;
+    typedef internal::TensorBlockScratchAllocator<DefaultDevice> TensorBlockScratch;
 
     Evaluator evaluator(expr, device);
 
@@ -191,12 +177,9 @@
 
     if (needs_assign) {
       // Query expression tree for desired block size/shape.
-      const TensorBlockResourceRequirements requirements =
-          evaluator.getResourceRequirements();
+      const TensorBlockResourceRequirements requirements = evaluator.getResourceRequirements();
 
-      const TensorBlockMapper block_mapper(
-          typename TensorBlockDesc::Dimensions(evaluator.dimensions()),
-          requirements);
+      const TensorBlockMapper block_mapper(typename TensorBlockDesc::Dimensions(evaluator.dimensions()), requirements);
 
       // Share scratch memory allocator between all blocks.
       TensorBlockScratch scratch(device);
@@ -228,11 +211,8 @@
 template <typename TensorBlockMapper>
 struct TensorExecutorTilingContext {
   TensorExecutorTilingContext() = default;
-  TensorExecutorTilingContext(const TensorBlockMapper& b_mapper,
-                              const TensorOpCost& b_cost, size_t b_aligned_size)
-      : block_mapper(b_mapper),
-        cost(b_cost),
-        aligned_blocksize(b_aligned_size) {}
+  TensorExecutorTilingContext(const TensorBlockMapper& b_mapper, const TensorOpCost& b_cost, size_t b_aligned_size)
+      : block_mapper(b_mapper), cost(b_cost), aligned_blocksize(b_aligned_size) {}
 
   TensorBlockMapper block_mapper;  // navigate through blocks
   TensorOpCost cost;               // cost of computing a single block
@@ -242,35 +222,27 @@
 // Computes a block evaluation parameters, and allocates temporary memory buffer
 // for blocks. See TensorExecutor/TensorAsyncExecutor (Tiling=On) below.
 template <typename Evaluator, typename TensorBlockMapper, bool Vectorizable>
-TensorExecutorTilingContext<TensorBlockMapper> GetTensorExecutorTilingContext(
-    const Evaluator& evaluator) {
+TensorExecutorTilingContext<TensorBlockMapper> GetTensorExecutorTilingContext(const Evaluator& evaluator) {
   // Query expression tree for desired block size/shape.
-  TensorBlockResourceRequirements requirements =
-      evaluator.getResourceRequirements();
+  TensorBlockResourceRequirements requirements = evaluator.getResourceRequirements();
 
   // Update target block size based on cost model.
-  double taskSize = TensorCostModel<ThreadPoolDevice>::taskSize(
-      1, requirements.cost_per_coeff);
+  double taskSize = TensorCostModel<ThreadPoolDevice>::taskSize(1, requirements.cost_per_coeff);
   requirements.size = static_cast<size_t>(1.0 / taskSize);
 
-  TensorBlockMapper block_mapper(
-      typename TensorBlockMapper::Dimensions(evaluator.dimensions()),
-      requirements);
+  TensorBlockMapper block_mapper(typename TensorBlockMapper::Dimensions(evaluator.dimensions()), requirements);
 
   size_t block_size = block_mapper.blockTotalSize();
   const size_t align = numext::maxi(EIGEN_MAX_ALIGN_BYTES, 1);
   const size_t aligned_blocksize =
-      align *
-      numext::div_ceil<size_t>(block_size * sizeof(typename Evaluator::Scalar), align);
+      align * numext::div_ceil<size_t>(block_size * sizeof(typename Evaluator::Scalar), align);
 
-  return {block_mapper, requirements.cost_per_coeff * block_size,
-          aligned_blocksize};
+  return {block_mapper, requirements.cost_per_coeff * block_size, aligned_blocksize};
 }
 
 template <typename Evaluator, typename StorageIndex, bool Vectorizable>
 struct EvalRange {
-  static void run(Evaluator* evaluator_in, const StorageIndex firstIdx,
-                  const StorageIndex lastIdx) {
+  static void run(Evaluator* evaluator_in, const StorageIndex firstIdx, const StorageIndex lastIdx) {
     Evaluator evaluator = *evaluator_in;
     eigen_assert(lastIdx >= firstIdx);
     for (StorageIndex i = firstIdx; i < lastIdx; ++i) {
@@ -283,11 +255,9 @@
 
 template <typename Evaluator, typename StorageIndex>
 struct EvalRange<Evaluator, StorageIndex, /*Vectorizable*/ true> {
-  static constexpr int PacketSize =
-      unpacket_traits<typename Evaluator::PacketReturnType>::size;
+  static constexpr int PacketSize = unpacket_traits<typename Evaluator::PacketReturnType>::size;
 
-  static void run(Evaluator* evaluator_in, const StorageIndex firstIdx,
-                  const StorageIndex lastIdx) {
+  static void run(Evaluator* evaluator_in, const StorageIndex firstIdx, const StorageIndex lastIdx) {
     Evaluator evaluator = *evaluator_in;
     eigen_assert(lastIdx >= firstIdx);
     StorageIndex i = firstIdx;
@@ -327,8 +297,7 @@
  public:
   typedef typename Expression::Index StorageIndex;
 
-  static EIGEN_STRONG_INLINE void run(const Expression& expr,
-                         const ThreadPoolDevice& device) {
+  static EIGEN_STRONG_INLINE void run(const Expression& expr, const ThreadPoolDevice& device) {
     typedef TensorEvaluator<Expression, ThreadPoolDevice> Evaluator;
     typedef EvalRange<Evaluator, StorageIndex, Vectorizable> EvalRange;
 
@@ -336,11 +305,9 @@
     const bool needs_assign = evaluator.evalSubExprsIfNeeded(nullptr);
     if (needs_assign) {
       const StorageIndex size = array_prod(evaluator.dimensions());
-      device.parallelFor(size, evaluator.costPerCoeff(Vectorizable),
-                         EvalRange::alignBlockSize,
-                         [&evaluator](StorageIndex firstIdx, StorageIndex lastIdx) {
-                           EvalRange::run(&evaluator, firstIdx, lastIdx);
-                         });
+      device.parallelFor(
+          size, evaluator.costPerCoeff(Vectorizable), EvalRange::alignBlockSize,
+          [&evaluator](StorageIndex firstIdx, StorageIndex lastIdx) { EvalRange::run(&evaluator, firstIdx, lastIdx); });
     }
     evaluator.cleanup();
   }
@@ -360,27 +327,21 @@
   typedef TensorBlockMapper<NumDims, Evaluator::Layout, IndexType> BlockMapper;
   typedef TensorExecutorTilingContext<BlockMapper> TilingContext;
 
-  typedef internal::TensorBlockDescriptor<NumDims, IndexType>
-      TensorBlockDesc;
-  typedef internal::TensorBlockScratchAllocator<ThreadPoolDevice>
-      TensorBlockScratch;
+  typedef internal::TensorBlockDescriptor<NumDims, IndexType> TensorBlockDesc;
+  typedef internal::TensorBlockScratchAllocator<ThreadPoolDevice> TensorBlockScratch;
 
-  static EIGEN_STRONG_INLINE void run(const Expression& expr,
-                                      const ThreadPoolDevice& device) {
+  static EIGEN_STRONG_INLINE void run(const Expression& expr, const ThreadPoolDevice& device) {
     Evaluator evaluator(expr, device);
 
     const bool needs_assign = evaluator.evalSubExprsIfNeeded(nullptr);
     if (needs_assign) {
       const TilingContext tiling =
-          internal::GetTensorExecutorTilingContext<Evaluator, BlockMapper,
-                                                   Vectorizable>(evaluator);
+          internal::GetTensorExecutorTilingContext<Evaluator, BlockMapper, Vectorizable>(evaluator);
 
-      auto eval_block = [&device, &evaluator, &tiling](IndexType firstBlockIdx,
-                                                       IndexType lastBlockIdx) {
+      auto eval_block = [&device, &evaluator, &tiling](IndexType firstBlockIdx, IndexType lastBlockIdx) {
         TensorBlockScratch scratch(device);
 
-        for (IndexType block_idx = firstBlockIdx; block_idx < lastBlockIdx;
-             ++block_idx) {
+        for (IndexType block_idx = firstBlockIdx; block_idx < lastBlockIdx; ++block_idx) {
           TensorBlockDesc desc = tiling.block_mapper.blockDescriptor(block_idx);
           evaluator.evalBlock(desc, scratch);
           scratch.reset();
@@ -393,27 +354,21 @@
         TensorBlockDesc desc(0, tiling.block_mapper.blockDimensions());
         evaluator.evalBlock(desc, scratch);
       } else {
-        device.parallelFor(tiling.block_mapper.blockCount(), tiling.cost,
-                           eval_block);
+        device.parallelFor(tiling.block_mapper.blockCount(), tiling.cost, eval_block);
       }
     }
     evaluator.cleanup();
   }
 };
 
-template <typename Expression, typename DoneCallback, bool Vectorizable,
-          TiledEvaluation Tiling>
-class TensorAsyncExecutor<Expression, ThreadPoolDevice, DoneCallback,
-                          Vectorizable, Tiling> {
+template <typename Expression, typename DoneCallback, bool Vectorizable, TiledEvaluation Tiling>
+class TensorAsyncExecutor<Expression, ThreadPoolDevice, DoneCallback, Vectorizable, Tiling> {
  public:
   typedef typename Expression::Index StorageIndex;
   typedef TensorEvaluator<Expression, ThreadPoolDevice> Evaluator;
 
-  static EIGEN_STRONG_INLINE void runAsync(const Expression& expr,
-                                           const ThreadPoolDevice& device,
-                                           DoneCallback done) {
-    TensorAsyncExecutorContext* const ctx =
-        new TensorAsyncExecutorContext(expr, device, std::move(done));
+  static EIGEN_STRONG_INLINE void runAsync(const Expression& expr, const ThreadPoolDevice& device, DoneCallback done) {
+    TensorAsyncExecutorContext* const ctx = new TensorAsyncExecutorContext(expr, device, std::move(done));
 
     const auto on_eval_subexprs = [ctx, &device](bool need_assign) -> void {
       if (!need_assign) {
@@ -424,11 +379,8 @@
       typedef EvalRange<Evaluator, StorageIndex, Vectorizable> EvalRange;
       const StorageIndex size = array_prod(ctx->evaluator.dimensions());
       device.parallelForAsync(
-          size, ctx->evaluator.costPerCoeff(Vectorizable),
-          EvalRange::alignBlockSize,
-          [ctx](StorageIndex firstIdx, StorageIndex lastIdx) {
-            EvalRange::run(&ctx->evaluator, firstIdx, lastIdx);
-          },
+          size, ctx->evaluator.costPerCoeff(Vectorizable), EvalRange::alignBlockSize,
+          [ctx](StorageIndex firstIdx, StorageIndex lastIdx) { EvalRange::run(&ctx->evaluator, firstIdx, lastIdx); },
           [ctx]() { delete ctx; });
     };
 
@@ -437,9 +389,7 @@
 
  private:
   struct TensorAsyncExecutorContext {
-    TensorAsyncExecutorContext(const Expression& expr,
-                               const ThreadPoolDevice& thread_pool,
-                               DoneCallback done)
+    TensorAsyncExecutorContext(const Expression& expr, const ThreadPoolDevice& thread_pool, DoneCallback done)
         : evaluator(expr, thread_pool), on_done(std::move(done)) {}
 
     ~TensorAsyncExecutorContext() {
@@ -455,8 +405,7 @@
 };
 
 template <typename Expression, typename DoneCallback, bool Vectorizable>
-class TensorAsyncExecutor<Expression, ThreadPoolDevice, DoneCallback,
-                          Vectorizable, /*Tileable*/ TiledEvaluation::On> {
+class TensorAsyncExecutor<Expression, ThreadPoolDevice, DoneCallback, Vectorizable, /*Tileable*/ TiledEvaluation::On> {
  public:
   typedef typename traits<Expression>::Index IndexType;
   typedef typename traits<Expression>::Scalar Scalar;
@@ -469,15 +418,10 @@
   typedef TensorExecutorTilingContext<BlockMapper> TilingContext;
 
   typedef internal::TensorBlockDescriptor<NumDims, IndexType> TensorBlockDesc;
-  typedef internal::TensorBlockScratchAllocator<ThreadPoolDevice>
-      TensorBlockScratch;
+  typedef internal::TensorBlockScratchAllocator<ThreadPoolDevice> TensorBlockScratch;
 
-  static EIGEN_STRONG_INLINE void runAsync(const Expression& expr,
-                                           const ThreadPoolDevice& device,
-                                           DoneCallback done) {
-
-    TensorAsyncExecutorContext* const ctx =
-        new TensorAsyncExecutorContext(expr, device, std::move(done));
+  static EIGEN_STRONG_INLINE void runAsync(const Expression& expr, const ThreadPoolDevice& device, DoneCallback done) {
+    TensorAsyncExecutorContext* const ctx = new TensorAsyncExecutorContext(expr, device, std::move(done));
 
     const auto on_eval_subexprs = [ctx](bool need_assign) -> void {
       if (!need_assign) {
@@ -485,16 +429,13 @@
         return;
       }
 
-      ctx->tiling = internal::GetTensorExecutorTilingContext<
-          Evaluator, BlockMapper, Vectorizable>(ctx->evaluator);
+      ctx->tiling = internal::GetTensorExecutorTilingContext<Evaluator, BlockMapper, Vectorizable>(ctx->evaluator);
 
       auto eval_block = [ctx](IndexType firstBlockIdx, IndexType lastBlockIdx) {
         TensorBlockScratch scratch(ctx->device);
 
-        for (IndexType block_idx = firstBlockIdx; block_idx < lastBlockIdx;
-             ++block_idx) {
-          TensorBlockDesc desc =
-              ctx->tiling.block_mapper.blockDescriptor(block_idx);
+        for (IndexType block_idx = firstBlockIdx; block_idx < lastBlockIdx; ++block_idx) {
+          TensorBlockDesc desc = ctx->tiling.block_mapper.blockDescriptor(block_idx);
           ctx->evaluator.evalBlock(desc, scratch);
           scratch.reset();
         }
@@ -507,8 +448,7 @@
         ctx->evaluator.evalBlock(desc, scratch);
         delete ctx;
       } else {
-        ctx->device.parallelForAsync(ctx->tiling.block_mapper.blockCount(),
-                                     ctx->tiling.cost, eval_block,
+        ctx->device.parallelForAsync(ctx->tiling.block_mapper.blockCount(), ctx->tiling.cost, eval_block,
                                      [ctx]() { delete ctx; });
       }
     };
@@ -518,12 +458,8 @@
 
  private:
   struct TensorAsyncExecutorContext {
-    TensorAsyncExecutorContext(const Expression& expr,
-                               const ThreadPoolDevice& thread_pool,
-                               DoneCallback done)
-        : device(thread_pool),
-          evaluator(expr, thread_pool),
-          on_done(std::move(done)) {}
+    TensorAsyncExecutorContext(const Expression& expr, const ThreadPoolDevice& thread_pool, DoneCallback done)
+        : device(thread_pool), evaluator(expr, thread_pool), on_done(std::move(done)) {}
 
     ~TensorAsyncExecutorContext() {
       evaluator.cleanup();
@@ -554,8 +490,7 @@
 #if defined(EIGEN_GPUCC)
 // Returns 1 if lhs + rhs would overflow, -1 if it would underflow, otherwise 0.
 template <typename Index>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE int sum_will_overflow(Index lhs,
-                                                            Index rhs) {
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE int sum_will_overflow(Index lhs, Index rhs) {
   const Index highest = NumTraits<Index>::highest();
   const Index lowest = NumTraits<Index>::lowest();
   if (lhs > 0 && rhs > 0) {
@@ -586,8 +521,7 @@
   // step_size is the value that will be added to the given index when the
   // functor is called.
   EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE SafeStep(Index lastIdx, Index step_size)
-      : can_overflow_(sum_will_overflow(lastIdx, step_size)),
-        step_size_(step_size) {}
+      : can_overflow_(sum_will_overflow(lastIdx, step_size)), step_size_(step_size) {}
 
   // Adds step_size to index, saturating on overflow (if overflow is possible).
   EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Index operator()(Index index) const {
@@ -601,8 +535,8 @@
 
 template <typename Evaluator, typename StorageIndex, bool Vectorizable>
 struct EigenMetaKernelEval {
-  static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-  void run(Evaluator& eval, StorageIndex firstIdx, StorageIndex lastIdx, StorageIndex step_size) {
+  static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void run(Evaluator& eval, StorageIndex firstIdx, StorageIndex lastIdx,
+                                                        StorageIndex step_size) {
     SafeStep<StorageIndex> safe_step(lastIdx, step_size);
     for (StorageIndex i = firstIdx; i < lastIdx; i = safe_step(i)) {
       eval.evalScalar(i);
@@ -612,32 +546,26 @@
 
 template <typename Evaluator, typename StorageIndex>
 struct EigenMetaKernelEval<Evaluator, StorageIndex, true> {
-  static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-  void run(Evaluator& eval, StorageIndex firstIdx, StorageIndex lastIdx, StorageIndex step_size) {
+  static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void run(Evaluator& eval, StorageIndex firstIdx, StorageIndex lastIdx,
+                                                        StorageIndex step_size) {
     const StorageIndex PacketSize = unpacket_traits<typename Evaluator::PacketReturnType>::size;
     const StorageIndex vectorized_size = (lastIdx / PacketSize) * PacketSize;
     const StorageIndex vectorized_step_size = step_size * PacketSize;
 
-    SafeStep<StorageIndex> safe_vectorized_step(vectorized_size,
-                                                vectorized_step_size);
+    SafeStep<StorageIndex> safe_vectorized_step(vectorized_size, vectorized_step_size);
     // Use the vector path
-    for (StorageIndex i = firstIdx * PacketSize; i < vectorized_size;
-         i = safe_vectorized_step(i)) {
+    for (StorageIndex i = firstIdx * PacketSize; i < vectorized_size; i = safe_vectorized_step(i)) {
       eval.evalPacket(i);
     }
     SafeStep<StorageIndex> safe_step(lastIdx, step_size);
-    for (StorageIndex i = saturate_add(vectorized_size, firstIdx); i < lastIdx;
-         i = safe_step(i)) {
+    for (StorageIndex i = saturate_add(vectorized_size, firstIdx); i < lastIdx; i = safe_step(i)) {
       eval.evalScalar(i);
     }
   }
 };
 
 template <typename Evaluator, typename StorageIndex>
-__global__ void
-__launch_bounds__(1024)
-EigenMetaKernel(Evaluator eval, StorageIndex size) {
-
+__global__ void __launch_bounds__(1024) EigenMetaKernel(Evaluator eval, StorageIndex size) {
   const StorageIndex first_index = blockIdx.x * blockDim.x + threadIdx.x;
   const StorageIndex step_size = blockDim.x * gridDim.x;
 
@@ -647,23 +575,23 @@
 
 /*static*/
 template <typename Expression, bool Vectorizable, TiledEvaluation Tiling>
-EIGEN_STRONG_INLINE void TensorExecutor<Expression, GpuDevice, Vectorizable, Tiling>::run(
-    const Expression& expr, const GpuDevice& device) {
+EIGEN_STRONG_INLINE void TensorExecutor<Expression, GpuDevice, Vectorizable, Tiling>::run(const Expression& expr,
+                                                                                          const GpuDevice& device) {
   TensorEvaluator<Expression, GpuDevice> evaluator(expr, device);
   const bool needs_assign = evaluator.evalSubExprsIfNeeded(nullptr);
   if (needs_assign) {
-
     const int block_size = device.maxGpuThreadsPerBlock();
-    const int max_blocks =
-        static_cast<int>(numext::mini<int64_t>(device.getNumGpuMultiProcessors() * device.maxGpuThreadsPerMultiProcessor(),
-                                               NumTraits<StorageIndex>::highest()) / block_size);
+    const int max_blocks = static_cast<int>(
+        numext::mini<int64_t>(device.getNumGpuMultiProcessors() * device.maxGpuThreadsPerMultiProcessor(),
+                              NumTraits<StorageIndex>::highest()) /
+        block_size);
     const StorageIndex size = array_prod(evaluator.dimensions());
     // Create a least one block to ensure we won't crash when tensorflow calls with tensors of size 0.
-    const int num_blocks = numext::maxi<int>(numext::mini<int>(max_blocks, static_cast<int>(numext::div_ceil<StorageIndex>(size, block_size))), 1);
+    const int num_blocks = numext::maxi<int>(
+        numext::mini<int>(max_blocks, static_cast<int>(numext::div_ceil<StorageIndex>(size, block_size))), 1);
 
-    LAUNCH_GPU_KERNEL(
-        (EigenMetaKernel<TensorEvaluator<Expression, GpuDevice>, StorageIndex>),
-        num_blocks, block_size, 0, device, evaluator, size);
+    LAUNCH_GPU_KERNEL((EigenMetaKernel<TensorEvaluator<Expression, GpuDevice>, StorageIndex>), num_blocks, block_size,
+                      0, device, evaluator, size);
   }
   evaluator.cleanup();
 }
@@ -680,17 +608,12 @@
   Evaluator evaluator;
   const Index range;
   template <typename Scratch>
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE ExecExprFunctorKernel(
-      const Scratch, Evaluator evaluator_, const Index range_)
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE ExecExprFunctorKernel(const Scratch, Evaluator evaluator_, const Index range_)
       : evaluator(evaluator_), range(range_) {}
 
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void operator()(
-      cl::sycl::nd_item<1> itemID) const {
-    compute(itemID);
-  }
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void operator()(cl::sycl::nd_item<1> itemID) const { compute(itemID); }
   template <bool is_vec = Evaluator::PacketAccess>
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE std::enable_if_t<!is_vec>
-  compute(const cl::sycl::nd_item<1>& itemID) const {
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE std::enable_if_t<!is_vec> compute(const cl::sycl::nd_item<1>& itemID) const {
     Index gId = static_cast<Index>(itemID.get_global_linear_id());
     Index total_threads = itemID.get_global_range(0);
 
@@ -699,10 +622,8 @@
     }
   }
   template <bool is_vec = Evaluator::PacketAccess>
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE std::enable_if_t<is_vec>
-  compute(const cl::sycl::nd_item<1>& itemID) const {
-    const Index vectorizedRange =
-        (range / Evaluator::PacketSize) * Evaluator::PacketSize;
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE std::enable_if_t<is_vec> compute(const cl::sycl::nd_item<1>& itemID) const {
+    const Index vectorizedRange = (range / Evaluator::PacketSize) * Evaluator::PacketSize;
     Index gId = static_cast<Index>(itemID.get_global_linear_id());
     const Index step = Evaluator::PacketSize * itemID.get_global_range(0);
     const Index start = Evaluator::PacketSize * gId;
@@ -720,8 +641,7 @@
 class TensorExecutor<Expression, Eigen::SyclDevice, Vectorizable, Tiling> {
  public:
   typedef typename Expression::Index Index;
-  static EIGEN_STRONG_INLINE void run(const Expression& expr,
-                                      const Eigen::SyclDevice& dev) {
+  static EIGEN_STRONG_INLINE void run(const Expression& expr, const Eigen::SyclDevice& dev) {
     typedef Eigen::TensorEvaluator<Expression, Eigen::SyclDevice> Evaluator;
     Evaluator evaluator(expr, dev);
     const bool needs_assign = evaluator.evalSubExprsIfNeeded(NULL);
@@ -729,20 +649,15 @@
       Index range, GRange, tileSize;
       Index total_size = ::Eigen::internal::array_prod(evaluator.dimensions());
       total_size = (total_size == 0) ? 1 : total_size;
-      const int PacketSize =
-          Eigen::PacketType<typename Evaluator::CoeffReturnType,
-                            Eigen::SyclDevice>::size;
+      const int PacketSize = Eigen::PacketType<typename Evaluator::CoeffReturnType, Eigen::SyclDevice>::size;
       Index vectorizable_threads = static_cast<Index>(total_size / PacketSize);
       dev.parallel_for_setup(vectorizable_threads, tileSize, range, GRange);
       range = total_size;
 
-      dev.template nullary_kernel_launcher<
-          typename Evaluator::CoeffReturnType,
-          ExecExprFunctorKernel<Evaluator> >(
-          evaluator,
-          cl::sycl::nd_range<1>(cl::sycl::range<1>(GRange),
-                                cl::sycl::range<1>(tileSize)),
-          Index(1), range).wait();
+      dev.template nullary_kernel_launcher<typename Evaluator::CoeffReturnType, ExecExprFunctorKernel<Evaluator> >(
+             evaluator, cl::sycl::nd_range<1>(cl::sycl::range<1>(GRange), cl::sycl::range<1>(tileSize)), Index(1),
+             range)
+          .wait();
     }
     evaluator.cleanup();
   }
@@ -750,8 +665,8 @@
 
 #endif
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_CXX11_TENSOR_TENSOR_EXECUTOR_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_EXECUTOR_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorExpr.h b/unsupported/Eigen/CXX11/src/Tensor/TensorExpr.h
index a5c8611..5f4c723 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorExpr.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorExpr.h
@@ -16,25 +16,23 @@
 namespace Eigen {
 
 /** \class TensorExpr
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Tensor expression classes.
-  *
-  * The TensorCwiseNullaryOp class applies a nullary operators to an expression.
-  * This is typically used to generate constants.
-  *
-  * The TensorCwiseUnaryOp class represents an expression where a unary operator
-  * (e.g. cwiseSqrt) is applied to an expression.
-  *
-  * The TensorCwiseBinaryOp class represents an expression where a binary
-  * operator (e.g. addition) is applied to a lhs and a rhs expression.
-  *
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Tensor expression classes.
+ *
+ * The TensorCwiseNullaryOp class applies a nullary operators to an expression.
+ * This is typically used to generate constants.
+ *
+ * The TensorCwiseUnaryOp class represents an expression where a unary operator
+ * (e.g. cwiseSqrt) is applied to an expression.
+ *
+ * The TensorCwiseBinaryOp class represents an expression where a binary
+ * operator (e.g. addition) is applied to a lhs and a rhs expression.
+ *
+ */
 namespace internal {
-template<typename NullaryOp, typename XprType>
-struct traits<TensorCwiseNullaryOp<NullaryOp, XprType> >
-    : traits<XprType>
-{
+template <typename NullaryOp, typename XprType>
+struct traits<TensorCwiseNullaryOp<NullaryOp, XprType> > : traits<XprType> {
   typedef traits<XprType> XprTraits;
   typedef typename XprType::Scalar Scalar;
   typedef typename XprType::Nested XprTypeNested;
@@ -42,48 +40,36 @@
   static constexpr int NumDimensions = XprTraits::NumDimensions;
   static constexpr int Layout = XprTraits::Layout;
   typedef typename XprTraits::PointerType PointerType;
-  enum {
-    Flags = 0
-  };
+  enum { Flags = 0 };
 };
 
 }  // end namespace internal
 
+template <typename NullaryOp, typename XprType>
+class TensorCwiseNullaryOp : public TensorBase<TensorCwiseNullaryOp<NullaryOp, XprType>, ReadOnlyAccessors> {
+ public:
+  typedef typename Eigen::internal::traits<TensorCwiseNullaryOp>::Scalar Scalar;
+  typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
+  typedef typename XprType::CoeffReturnType CoeffReturnType;
+  typedef TensorCwiseNullaryOp<NullaryOp, XprType> Nested;
+  typedef typename Eigen::internal::traits<TensorCwiseNullaryOp>::StorageKind StorageKind;
+  typedef typename Eigen::internal::traits<TensorCwiseNullaryOp>::Index Index;
 
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseNullaryOp(const XprType& xpr, const NullaryOp& func = NullaryOp())
+      : m_xpr(xpr), m_functor(func) {}
 
-template<typename NullaryOp, typename XprType>
-class TensorCwiseNullaryOp : public TensorBase<TensorCwiseNullaryOp<NullaryOp, XprType>, ReadOnlyAccessors>
-{
-  public:
-    typedef typename Eigen::internal::traits<TensorCwiseNullaryOp>::Scalar Scalar;
-    typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
-    typedef typename XprType::CoeffReturnType CoeffReturnType;
-    typedef TensorCwiseNullaryOp<NullaryOp, XprType> Nested;
-    typedef typename Eigen::internal::traits<TensorCwiseNullaryOp>::StorageKind StorageKind;
-    typedef typename Eigen::internal::traits<TensorCwiseNullaryOp>::Index Index;
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename XprType::Nested>& nestedExpression() const { return m_xpr; }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseNullaryOp(const XprType& xpr, const NullaryOp& func = NullaryOp())
-        : m_xpr(xpr), m_functor(func) {}
+  EIGEN_DEVICE_FUNC const NullaryOp& functor() const { return m_functor; }
 
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<typename XprType::Nested>&
-    nestedExpression() const { return m_xpr; }
-
-    EIGEN_DEVICE_FUNC
-    const NullaryOp& functor() const { return m_functor; }
-
-  protected:
-    typename XprType::Nested m_xpr;
-    const NullaryOp m_functor;
+ protected:
+  typename XprType::Nested m_xpr;
+  const NullaryOp m_functor;
 };
 
-
-
 namespace internal {
-template<typename UnaryOp, typename XprType>
-struct traits<TensorCwiseUnaryOp<UnaryOp, XprType> >
-    : traits<XprType>
-{
+template <typename UnaryOp, typename XprType>
+struct traits<TensorCwiseUnaryOp<UnaryOp, XprType> > : traits<XprType> {
   // TODO(phli): Add InputScalar, InputPacket.  Check references to
   // current Scalar/Packet to see if the intent is Input or Output.
   typedef typename result_of<UnaryOp(typename XprType::Scalar)>::type Scalar;
@@ -92,76 +78,59 @@
   typedef std::remove_reference_t<XprTypeNested> XprTypeNested_;
   static constexpr int NumDimensions = XprTraits::NumDimensions;
   static constexpr int Layout = XprTraits::Layout;
-  typedef typename TypeConversion<Scalar, 
-                                  typename XprTraits::PointerType
-                                  >::type 
-                                  PointerType;
+  typedef typename TypeConversion<Scalar, typename XprTraits::PointerType>::type PointerType;
 };
 
-template<typename UnaryOp, typename XprType>
-struct eval<TensorCwiseUnaryOp<UnaryOp, XprType>, Eigen::Dense>
-{
+template <typename UnaryOp, typename XprType>
+struct eval<TensorCwiseUnaryOp<UnaryOp, XprType>, Eigen::Dense> {
   typedef const TensorCwiseUnaryOp<UnaryOp, XprType>& type;
 };
 
-template<typename UnaryOp, typename XprType>
-struct nested<TensorCwiseUnaryOp<UnaryOp, XprType>, 1, typename eval<TensorCwiseUnaryOp<UnaryOp, XprType> >::type>
-{
+template <typename UnaryOp, typename XprType>
+struct nested<TensorCwiseUnaryOp<UnaryOp, XprType>, 1, typename eval<TensorCwiseUnaryOp<UnaryOp, XprType> >::type> {
   typedef TensorCwiseUnaryOp<UnaryOp, XprType> type;
 };
 
 }  // end namespace internal
 
+template <typename UnaryOp, typename XprType>
+class TensorCwiseUnaryOp : public TensorBase<TensorCwiseUnaryOp<UnaryOp, XprType>, ReadOnlyAccessors> {
+ public:
+  // TODO(phli): Add InputScalar, InputPacket.  Check references to
+  // current Scalar/Packet to see if the intent is Input or Output.
+  typedef typename Eigen::internal::traits<TensorCwiseUnaryOp>::Scalar Scalar;
+  typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
+  typedef Scalar CoeffReturnType;
+  typedef typename Eigen::internal::nested<TensorCwiseUnaryOp>::type Nested;
+  typedef typename Eigen::internal::traits<TensorCwiseUnaryOp>::StorageKind StorageKind;
+  typedef typename Eigen::internal::traits<TensorCwiseUnaryOp>::Index Index;
 
-
-template<typename UnaryOp, typename XprType>
-class TensorCwiseUnaryOp : public TensorBase<TensorCwiseUnaryOp<UnaryOp, XprType>, ReadOnlyAccessors>
-{
-  public:
-    // TODO(phli): Add InputScalar, InputPacket.  Check references to
-    // current Scalar/Packet to see if the intent is Input or Output.
-    typedef typename Eigen::internal::traits<TensorCwiseUnaryOp>::Scalar Scalar;
-    typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
-    typedef Scalar CoeffReturnType;
-    typedef typename Eigen::internal::nested<TensorCwiseUnaryOp>::type Nested;
-    typedef typename Eigen::internal::traits<TensorCwiseUnaryOp>::StorageKind StorageKind;
-    typedef typename Eigen::internal::traits<TensorCwiseUnaryOp>::Index Index;
-
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseUnaryOp(const XprType& xpr, const UnaryOp& func = UnaryOp())
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseUnaryOp(const XprType& xpr, const UnaryOp& func = UnaryOp())
       : m_xpr(xpr), m_functor(func) {}
 
-    EIGEN_DEVICE_FUNC
-    const UnaryOp& functor() const { return m_functor; }
+  EIGEN_DEVICE_FUNC const UnaryOp& functor() const { return m_functor; }
 
-    /** \returns the nested expression */
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<typename XprType::Nested>&
-    nestedExpression() const { return m_xpr; }
+  /** \returns the nested expression */
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename XprType::Nested>& nestedExpression() const { return m_xpr; }
 
-  protected:
-    typename XprType::Nested m_xpr;
-    const UnaryOp m_functor;
+ protected:
+  typename XprType::Nested m_xpr;
+  const UnaryOp m_functor;
 };
 
-
 namespace internal {
-template<typename BinaryOp, typename LhsXprType, typename RhsXprType>
-struct traits<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType> >
-{
+template <typename BinaryOp, typename LhsXprType, typename RhsXprType>
+struct traits<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType> > {
   // Type promotion to handle the case where the types of the lhs and the rhs
   // are different.
   // TODO(phli): Add Lhs/RhsScalar, Lhs/RhsPacket.  Check references to
   // current Scalar/Packet to see if the intent is Inputs or Output.
-  typedef typename result_of<
-      BinaryOp(typename LhsXprType::Scalar,
-               typename RhsXprType::Scalar)>::type Scalar;
+  typedef typename result_of<BinaryOp(typename LhsXprType::Scalar, typename RhsXprType::Scalar)>::type Scalar;
   typedef traits<LhsXprType> XprTraits;
-  typedef typename promote_storage_type<
-      typename traits<LhsXprType>::StorageKind,
-      typename traits<RhsXprType>::StorageKind>::ret StorageKind;
-  typedef typename promote_index_type<
-      typename traits<LhsXprType>::Index,
-      typename traits<RhsXprType>::Index>::type Index;
+  typedef typename promote_storage_type<typename traits<LhsXprType>::StorageKind,
+                                        typename traits<RhsXprType>::StorageKind>::ret StorageKind;
+  typedef
+      typename promote_index_type<typename traits<LhsXprType>::Index, typename traits<RhsXprType>::Index>::type Index;
   typedef typename LhsXprType::Nested LhsNested;
   typedef typename RhsXprType::Nested RhsNested;
   typedef std::remove_reference_t<LhsNested> LhsNested_;
@@ -170,75 +139,64 @@
   static constexpr int Layout = XprTraits::Layout;
   typedef typename TypeConversion<Scalar,
                                   std::conditional_t<Pointer_type_promotion<typename LhsXprType::Scalar, Scalar>::val,
-                                                      typename traits<LhsXprType>::PointerType,
-                                                      typename traits<RhsXprType>::PointerType>
-                                  >::type 
-                                  PointerType;
-  enum {
-    Flags = 0
-  };
+                                                     typename traits<LhsXprType>::PointerType,
+                                                     typename traits<RhsXprType>::PointerType> >::type PointerType;
+  enum { Flags = 0 };
 };
 
-template<typename BinaryOp, typename LhsXprType, typename RhsXprType>
-struct eval<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>, Eigen::Dense>
-{
+template <typename BinaryOp, typename LhsXprType, typename RhsXprType>
+struct eval<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>, Eigen::Dense> {
   typedef const TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>& type;
 };
 
-template<typename BinaryOp, typename LhsXprType, typename RhsXprType>
-struct nested<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>, 1, typename eval<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType> >::type>
-{
+template <typename BinaryOp, typename LhsXprType, typename RhsXprType>
+struct nested<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>, 1,
+              typename eval<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType> >::type> {
   typedef TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType> type;
 };
 
 }  // end namespace internal
 
+template <typename BinaryOp, typename LhsXprType, typename RhsXprType>
+class TensorCwiseBinaryOp
+    : public TensorBase<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>, ReadOnlyAccessors> {
+ public:
+  // TODO(phli): Add Lhs/RhsScalar, Lhs/RhsPacket.  Check references to
+  // current Scalar/Packet to see if the intent is Inputs or Output.
+  typedef typename Eigen::internal::traits<TensorCwiseBinaryOp>::Scalar Scalar;
+  typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
+  typedef Scalar CoeffReturnType;
+  typedef typename Eigen::internal::nested<TensorCwiseBinaryOp>::type Nested;
+  typedef typename Eigen::internal::traits<TensorCwiseBinaryOp>::StorageKind StorageKind;
+  typedef typename Eigen::internal::traits<TensorCwiseBinaryOp>::Index Index;
 
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseBinaryOp(const LhsXprType& lhs, const RhsXprType& rhs,
+                                                            const BinaryOp& func = BinaryOp())
+      : m_lhs_xpr(lhs), m_rhs_xpr(rhs), m_functor(func) {}
 
-template<typename BinaryOp, typename LhsXprType, typename RhsXprType>
-class TensorCwiseBinaryOp : public TensorBase<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>, ReadOnlyAccessors>
-{
-  public:
-    // TODO(phli): Add Lhs/RhsScalar, Lhs/RhsPacket.  Check references to
-    // current Scalar/Packet to see if the intent is Inputs or Output.
-    typedef typename Eigen::internal::traits<TensorCwiseBinaryOp>::Scalar Scalar;
-    typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
-    typedef Scalar CoeffReturnType;
-    typedef typename Eigen::internal::nested<TensorCwiseBinaryOp>::type Nested;
-    typedef typename Eigen::internal::traits<TensorCwiseBinaryOp>::StorageKind StorageKind;
-    typedef typename Eigen::internal::traits<TensorCwiseBinaryOp>::Index Index;
+  EIGEN_DEVICE_FUNC const BinaryOp& functor() const { return m_functor; }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseBinaryOp(const LhsXprType& lhs, const RhsXprType& rhs, const BinaryOp& func = BinaryOp())
-        : m_lhs_xpr(lhs), m_rhs_xpr(rhs), m_functor(func) {}
+  /** \returns the nested expressions */
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename LhsXprType::Nested>& lhsExpression() const {
+    return m_lhs_xpr;
+  }
 
-    EIGEN_DEVICE_FUNC
-    const BinaryOp& functor() const { return m_functor; }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename RhsXprType::Nested>& rhsExpression() const {
+    return m_rhs_xpr;
+  }
 
-    /** \returns the nested expressions */
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<typename LhsXprType::Nested>&
-    lhsExpression() const { return m_lhs_xpr; }
-
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<typename RhsXprType::Nested>&
-    rhsExpression() const { return m_rhs_xpr; }
-
-  protected:
-    typename LhsXprType::Nested m_lhs_xpr;
-    typename RhsXprType::Nested m_rhs_xpr;
-    const BinaryOp m_functor;
+ protected:
+  typename LhsXprType::Nested m_lhs_xpr;
+  typename RhsXprType::Nested m_rhs_xpr;
+  const BinaryOp m_functor;
 };
 
-
 namespace internal {
-template<typename TernaryOp, typename Arg1XprType, typename Arg2XprType, typename Arg3XprType>
-struct traits<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType> >
-{
+template <typename TernaryOp, typename Arg1XprType, typename Arg2XprType, typename Arg3XprType>
+struct traits<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType> > {
   // Type promotion to handle the case where the types of the args are different.
-  typedef typename result_of<
-      TernaryOp(typename Arg1XprType::Scalar,
-                typename Arg2XprType::Scalar,
-                typename Arg3XprType::Scalar)>::type Scalar;
+  typedef typename result_of<TernaryOp(typename Arg1XprType::Scalar, typename Arg2XprType::Scalar,
+                                       typename Arg3XprType::Scalar)>::type Scalar;
   typedef traits<Arg1XprType> XprTraits;
   typedef typename traits<Arg1XprType>::StorageKind StorageKind;
   typedef typename traits<Arg1XprType>::Index Index;
@@ -252,140 +210,120 @@
   static constexpr int Layout = XprTraits::Layout;
   typedef typename TypeConversion<Scalar,
                                   std::conditional_t<Pointer_type_promotion<typename Arg2XprType::Scalar, Scalar>::val,
-                                                      typename traits<Arg2XprType>::PointerType,
-                                                      typename traits<Arg3XprType>::PointerType>
-                                  >::type 
-                                  PointerType;
-  enum {
-    Flags = 0
-  };
+                                                     typename traits<Arg2XprType>::PointerType,
+                                                     typename traits<Arg3XprType>::PointerType> >::type PointerType;
+  enum { Flags = 0 };
 };
 
-template<typename TernaryOp, typename Arg1XprType, typename Arg2XprType, typename Arg3XprType>
-struct eval<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>, Eigen::Dense>
-{
+template <typename TernaryOp, typename Arg1XprType, typename Arg2XprType, typename Arg3XprType>
+struct eval<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>, Eigen::Dense> {
   typedef const TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>& type;
 };
 
-template<typename TernaryOp, typename Arg1XprType, typename Arg2XprType, typename Arg3XprType>
-struct nested<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>, 1, typename eval<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType> >::type>
-{
+template <typename TernaryOp, typename Arg1XprType, typename Arg2XprType, typename Arg3XprType>
+struct nested<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>, 1,
+              typename eval<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType> >::type> {
   typedef TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType> type;
 };
 
 }  // end namespace internal
 
+template <typename TernaryOp, typename Arg1XprType, typename Arg2XprType, typename Arg3XprType>
+class TensorCwiseTernaryOp
+    : public TensorBase<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>, ReadOnlyAccessors> {
+ public:
+  typedef typename Eigen::internal::traits<TensorCwiseTernaryOp>::Scalar Scalar;
+  typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
+  typedef Scalar CoeffReturnType;
+  typedef typename Eigen::internal::nested<TensorCwiseTernaryOp>::type Nested;
+  typedef typename Eigen::internal::traits<TensorCwiseTernaryOp>::StorageKind StorageKind;
+  typedef typename Eigen::internal::traits<TensorCwiseTernaryOp>::Index Index;
 
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseTernaryOp(const Arg1XprType& arg1, const Arg2XprType& arg2,
+                                                             const Arg3XprType& arg3,
+                                                             const TernaryOp& func = TernaryOp())
+      : m_arg1_xpr(arg1), m_arg2_xpr(arg2), m_arg3_xpr(arg3), m_functor(func) {}
 
-template<typename TernaryOp, typename Arg1XprType, typename Arg2XprType, typename Arg3XprType>
-class TensorCwiseTernaryOp : public TensorBase<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>, ReadOnlyAccessors>
-{
-  public:
-    typedef typename Eigen::internal::traits<TensorCwiseTernaryOp>::Scalar Scalar;
-    typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
-    typedef Scalar CoeffReturnType;
-    typedef typename Eigen::internal::nested<TensorCwiseTernaryOp>::type Nested;
-    typedef typename Eigen::internal::traits<TensorCwiseTernaryOp>::StorageKind StorageKind;
-    typedef typename Eigen::internal::traits<TensorCwiseTernaryOp>::Index Index;
+  EIGEN_DEVICE_FUNC const TernaryOp& functor() const { return m_functor; }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseTernaryOp(const Arg1XprType& arg1, const Arg2XprType& arg2, const Arg3XprType& arg3, const TernaryOp& func = TernaryOp())
-        : m_arg1_xpr(arg1), m_arg2_xpr(arg2), m_arg3_xpr(arg3), m_functor(func) {}
+  /** \returns the nested expressions */
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename Arg1XprType::Nested>& arg1Expression() const {
+    return m_arg1_xpr;
+  }
 
-    EIGEN_DEVICE_FUNC
-    const TernaryOp& functor() const { return m_functor; }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename Arg2XprType::Nested>& arg2Expression() const {
+    return m_arg2_xpr;
+  }
 
-    /** \returns the nested expressions */
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<typename Arg1XprType::Nested>&
-    arg1Expression() const { return m_arg1_xpr; }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename Arg3XprType::Nested>& arg3Expression() const {
+    return m_arg3_xpr;
+  }
 
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<typename Arg2XprType::Nested>&
-    arg2Expression() const { return m_arg2_xpr; }
-
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<typename Arg3XprType::Nested>&
-    arg3Expression() const { return m_arg3_xpr; }
-
-  protected:
-    typename Arg1XprType::Nested m_arg1_xpr;
-    typename Arg2XprType::Nested m_arg2_xpr;
-    typename Arg3XprType::Nested m_arg3_xpr;
-    const TernaryOp m_functor;
+ protected:
+  typename Arg1XprType::Nested m_arg1_xpr;
+  typename Arg2XprType::Nested m_arg2_xpr;
+  typename Arg3XprType::Nested m_arg3_xpr;
+  const TernaryOp m_functor;
 };
 
-
 namespace internal {
-template<typename IfXprType, typename ThenXprType, typename ElseXprType>
-struct traits<TensorSelectOp<IfXprType, ThenXprType, ElseXprType> >
-    : traits<ThenXprType>
-{
+template <typename IfXprType, typename ThenXprType, typename ElseXprType>
+struct traits<TensorSelectOp<IfXprType, ThenXprType, ElseXprType> > : traits<ThenXprType> {
   typedef typename traits<ThenXprType>::Scalar Scalar;
   typedef traits<ThenXprType> XprTraits;
   typedef typename promote_storage_type<typename traits<ThenXprType>::StorageKind,
                                         typename traits<ElseXprType>::StorageKind>::ret StorageKind;
-  typedef typename promote_index_type<typename traits<ElseXprType>::Index,
-                                      typename traits<ThenXprType>::Index>::type Index;
+  typedef
+      typename promote_index_type<typename traits<ElseXprType>::Index, typename traits<ThenXprType>::Index>::type Index;
   typedef typename IfXprType::Nested IfNested;
   typedef typename ThenXprType::Nested ThenNested;
   typedef typename ElseXprType::Nested ElseNested;
   static constexpr int NumDimensions = XprTraits::NumDimensions;
   static constexpr int Layout = XprTraits::Layout;
   typedef std::conditional_t<Pointer_type_promotion<typename ThenXprType::Scalar, Scalar>::val,
-                               typename traits<ThenXprType>::PointerType,
-                               typename traits<ElseXprType>::PointerType> PointerType;
+                             typename traits<ThenXprType>::PointerType, typename traits<ElseXprType>::PointerType>
+      PointerType;
 };
 
-template<typename IfXprType, typename ThenXprType, typename ElseXprType>
-struct eval<TensorSelectOp<IfXprType, ThenXprType, ElseXprType>, Eigen::Dense>
-{
+template <typename IfXprType, typename ThenXprType, typename ElseXprType>
+struct eval<TensorSelectOp<IfXprType, ThenXprType, ElseXprType>, Eigen::Dense> {
   typedef const TensorSelectOp<IfXprType, ThenXprType, ElseXprType>& type;
 };
 
-template<typename IfXprType, typename ThenXprType, typename ElseXprType>
-struct nested<TensorSelectOp<IfXprType, ThenXprType, ElseXprType>, 1, typename eval<TensorSelectOp<IfXprType, ThenXprType, ElseXprType> >::type>
-{
+template <typename IfXprType, typename ThenXprType, typename ElseXprType>
+struct nested<TensorSelectOp<IfXprType, ThenXprType, ElseXprType>, 1,
+              typename eval<TensorSelectOp<IfXprType, ThenXprType, ElseXprType> >::type> {
   typedef TensorSelectOp<IfXprType, ThenXprType, ElseXprType> type;
 };
 
 }  // end namespace internal
 
+template <typename IfXprType, typename ThenXprType, typename ElseXprType>
+class TensorSelectOp : public TensorBase<TensorSelectOp<IfXprType, ThenXprType, ElseXprType>, ReadOnlyAccessors> {
+ public:
+  typedef typename Eigen::internal::traits<TensorSelectOp>::Scalar Scalar;
+  typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
+  typedef typename internal::promote_storage_type<typename ThenXprType::CoeffReturnType,
+                                                  typename ElseXprType::CoeffReturnType>::ret CoeffReturnType;
+  typedef typename Eigen::internal::nested<TensorSelectOp>::type Nested;
+  typedef typename Eigen::internal::traits<TensorSelectOp>::StorageKind StorageKind;
+  typedef typename Eigen::internal::traits<TensorSelectOp>::Index Index;
 
-template<typename IfXprType, typename ThenXprType, typename ElseXprType>
-class TensorSelectOp : public TensorBase<TensorSelectOp<IfXprType, ThenXprType, ElseXprType>, ReadOnlyAccessors>
-{
-  public:
-    typedef typename Eigen::internal::traits<TensorSelectOp>::Scalar Scalar;
-    typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
-    typedef typename internal::promote_storage_type<typename ThenXprType::CoeffReturnType,
-                                                    typename ElseXprType::CoeffReturnType>::ret CoeffReturnType;
-    typedef typename Eigen::internal::nested<TensorSelectOp>::type Nested;
-    typedef typename Eigen::internal::traits<TensorSelectOp>::StorageKind StorageKind;
-    typedef typename Eigen::internal::traits<TensorSelectOp>::Index Index;
+  EIGEN_DEVICE_FUNC TensorSelectOp(const IfXprType& a_condition, const ThenXprType& a_then, const ElseXprType& a_else)
+      : m_condition(a_condition), m_then(a_then), m_else(a_else) {}
 
-    EIGEN_DEVICE_FUNC
-    TensorSelectOp(const IfXprType& a_condition,
-                   const ThenXprType& a_then,
-                   const ElseXprType& a_else)
-      : m_condition(a_condition), m_then(a_then), m_else(a_else)
-    { }
+  EIGEN_DEVICE_FUNC const IfXprType& ifExpression() const { return m_condition; }
 
-    EIGEN_DEVICE_FUNC
-    const IfXprType& ifExpression() const { return m_condition; }
+  EIGEN_DEVICE_FUNC const ThenXprType& thenExpression() const { return m_then; }
 
-    EIGEN_DEVICE_FUNC
-    const ThenXprType& thenExpression() const { return m_then; }
+  EIGEN_DEVICE_FUNC const ElseXprType& elseExpression() const { return m_else; }
 
-    EIGEN_DEVICE_FUNC
-    const ElseXprType& elseExpression() const { return m_else; }
-
-  protected:
-    typename IfXprType::Nested m_condition;
-    typename ThenXprType::Nested m_then;
-    typename ElseXprType::Nested m_else;
+ protected:
+  typename IfXprType::Nested m_condition;
+  typename ThenXprType::Nested m_then;
+  typename ElseXprType::Nested m_else;
 };
 
+}  // end namespace Eigen
 
-} // end namespace Eigen
-
-#endif // EIGEN_CXX11_TENSOR_TENSOR_EXPR_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_EXPR_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorFFT.h b/unsupported/Eigen/CXX11/src/Tensor/TensorFFT.h
index eeb3a94..f5d1b2d 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorFFT.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorFFT.h
@@ -16,44 +16,62 @@
 namespace Eigen {
 
 /** \class TensorFFT
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Tensor FFT class.
-  *
-  * TODO:
-  * Vectorize the Cooley Tukey and the Bluestein algorithm
-  * Add support for multithreaded evaluation
-  * Improve the performance on GPU
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Tensor FFT class.
+ *
+ * TODO:
+ * Vectorize the Cooley Tukey and the Bluestein algorithm
+ * Add support for multithreaded evaluation
+ * Improve the performance on GPU
+ */
 
-template <bool NeedUprade> struct MakeComplex {
+template <bool NeedUprade>
+struct MakeComplex {
   template <typename T>
-  EIGEN_DEVICE_FUNC
-  T operator() (const T& val) const { return val; }
+  EIGEN_DEVICE_FUNC T operator()(const T& val) const {
+    return val;
+  }
 };
 
-template <> struct MakeComplex<true> {
+template <>
+struct MakeComplex<true> {
   template <typename T>
-  EIGEN_DEVICE_FUNC
-  std::complex<T> operator() (const T& val) const { return std::complex<T>(val, 0); }
+  EIGEN_DEVICE_FUNC std::complex<T> operator()(const T& val) const {
+    return std::complex<T>(val, 0);
+  }
 };
 
-template <> struct MakeComplex<false> {
+template <>
+struct MakeComplex<false> {
   template <typename T>
-  EIGEN_DEVICE_FUNC
-  std::complex<T> operator() (const std::complex<T>& val) const { return val; }
+  EIGEN_DEVICE_FUNC std::complex<T> operator()(const std::complex<T>& val) const {
+    return val;
+  }
 };
 
-template <int ResultType> struct PartOf {
-  template <typename T> T operator() (const T& val) const { return val; }
+template <int ResultType>
+struct PartOf {
+  template <typename T>
+  T operator()(const T& val) const {
+    return val;
+  }
 };
 
-template <> struct PartOf<RealPart> {
-  template <typename T> T operator() (const std::complex<T>& val) const { return val.real(); }
+template <>
+struct PartOf<RealPart> {
+  template <typename T>
+  T operator()(const std::complex<T>& val) const {
+    return val.real();
+  }
 };
 
-template <> struct PartOf<ImagPart> {
-  template <typename T> T operator() (const std::complex<T>& val) const { return val.imag(); }
+template <>
+struct PartOf<ImagPart> {
+  template <typename T>
+  T operator()(const std::complex<T>& val) const {
+    return val.imag();
+  }
 };
 
 namespace internal {
@@ -63,7 +81,8 @@
   typedef typename NumTraits<typename XprTraits::Scalar>::Real RealScalar;
   typedef typename std::complex<RealScalar> ComplexScalar;
   typedef typename XprTraits::Scalar InputScalar;
-  typedef std::conditional_t<FFTResultType == RealPart || FFTResultType == ImagPart, RealScalar, ComplexScalar> OutputScalar;
+  typedef std::conditional_t<FFTResultType == RealPart || FFTResultType == ImagPart, RealScalar, ComplexScalar>
+      OutputScalar;
   typedef typename XprTraits::StorageKind StorageKind;
   typedef typename XprTraits::Index Index;
   typedef typename XprType::Nested Nested;
@@ -79,7 +98,8 @@
 };
 
 template <typename FFT, typename XprType, int FFTResultType, int FFTDirection>
-struct nested<TensorFFTOp<FFT, XprType, FFTResultType, FFTDirection>, 1, typename eval<TensorFFTOp<FFT, XprType, FFTResultType, FFTDirection> >::type> {
+struct nested<TensorFFTOp<FFT, XprType, FFTResultType, FFTDirection>, 1,
+              typename eval<TensorFFTOp<FFT, XprType, FFTResultType, FFTDirection> >::type> {
   typedef TensorFFTOp<FFT, XprType, FFTResultType, FFTDirection> type;
 };
 
@@ -91,22 +111,18 @@
   typedef typename Eigen::internal::traits<TensorFFTOp>::Scalar Scalar;
   typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
   typedef typename std::complex<RealScalar> ComplexScalar;
-  typedef std::conditional_t<FFTResultType == RealPart || FFTResultType == ImagPart, RealScalar, ComplexScalar> OutputScalar;
+  typedef std::conditional_t<FFTResultType == RealPart || FFTResultType == ImagPart, RealScalar, ComplexScalar>
+      OutputScalar;
   typedef OutputScalar CoeffReturnType;
   typedef typename Eigen::internal::nested<TensorFFTOp>::type Nested;
   typedef typename Eigen::internal::traits<TensorFFTOp>::StorageKind StorageKind;
   typedef typename Eigen::internal::traits<TensorFFTOp>::Index Index;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorFFTOp(const XprType& expr, const FFT& fft)
-      : m_xpr(expr), m_fft(fft) {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorFFTOp(const XprType& expr, const FFT& fft) : m_xpr(expr), m_fft(fft) {}
 
-  EIGEN_DEVICE_FUNC
-  const FFT& fft() const { return m_fft; }
+  EIGEN_DEVICE_FUNC const FFT& fft() const { return m_fft; }
 
-  EIGEN_DEVICE_FUNC
-  const internal::remove_all_t<typename XprType::Nested>& expression() const {
-    return m_xpr;
-  }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename XprType::Nested>& expression() const { return m_xpr; }
 
  protected:
   typename XprType::Nested m_xpr;
@@ -126,7 +142,8 @@
   typedef typename TensorEvaluator<ArgType, Device>::Dimensions InputDimensions;
   typedef internal::traits<XprType> XprTraits;
   typedef typename XprTraits::Scalar InputScalar;
-  typedef std::conditional_t<FFTResultType == RealPart || FFTResultType == ImagPart, RealScalar, ComplexScalar> OutputScalar;
+  typedef std::conditional_t<FFTResultType == RealPart || FFTResultType == ImagPart, RealScalar, ComplexScalar>
+      OutputScalar;
   typedef OutputScalar CoeffReturnType;
   typedef typename PacketType<OutputScalar, Device>::type PacketReturnType;
   static constexpr int PacketSize = internal::unpacket_traits<PacketReturnType>::size;
@@ -147,7 +164,8 @@
   typedef internal::TensorBlockNotImplemented TensorBlock;
   //===--------------------------------------------------------------------===//
 
-  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) : m_fft(op.fft()), m_impl(op.expression(), device), m_data(NULL), m_device(device) {
+  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
+      : m_fft(op.fft()), m_impl(op.expression(), device), m_data(NULL), m_device(device) {
     const typename TensorEvaluator<ArgType, Device>::Dimensions& input_dims = m_impl.dimensions();
     for (int i = 0; i < NumDims; ++i) {
       eigen_assert(input_dims[i] > 0);
@@ -168,9 +186,7 @@
     m_size = m_dimensions.TotalSize();
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const {
-    return m_dimensions;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; }
 
   EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType data) {
     m_impl.evalSubExprsIfNeeded(NULL);
@@ -178,7 +194,8 @@
       evalToBuf(data);
       return false;
     } else {
-      m_data = (EvaluatorPointerType)m_device.get((CoeffReturnType*)(m_device.allocate_temp(sizeof(CoeffReturnType) * m_size)));
+      m_data = (EvaluatorPointerType)m_device.get(
+          (CoeffReturnType*)(m_device.allocate_temp(sizeof(CoeffReturnType) * m_size)));
       evalToBuf(m_data);
       return true;
     }
@@ -192,18 +209,14 @@
     m_impl.cleanup();
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE CoeffReturnType coeff(Index index) const {
-    return m_data[index];
-  }
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE CoeffReturnType coeff(Index index) const { return m_data[index]; }
 
   template <int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketReturnType
-  packet(Index index) const {
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketReturnType packet(Index index) const {
     return internal::ploadt<PacketReturnType, LoadMode>(m_data + index);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost
-  costPerCoeff(bool vectorized) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const {
     return TensorOpCost(sizeof(CoeffReturnType), 0, 0, vectorized, PacketSize);
   }
 
@@ -212,7 +225,8 @@
  private:
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalToBuf(EvaluatorPointerType data) {
     const bool write_to_out = internal::is_same<OutputScalar, ComplexScalar>::value;
-    ComplexScalar* buf = write_to_out ? (ComplexScalar*)data : (ComplexScalar*)m_device.allocate(sizeof(ComplexScalar) * m_size);
+    ComplexScalar* buf =
+        write_to_out ? (ComplexScalar*)data : (ComplexScalar*)m_device.allocate(sizeof(ComplexScalar) * m_size);
 
     for (Index i = 0; i < m_size; ++i) {
       buf[i] = MakeComplex<internal::is_same<InputScalar, RealScalar>::value>()(m_impl.coeff(i));
@@ -228,9 +242,12 @@
       const Index good_composite = is_power_of_two ? 0 : findGoodComposite(line_len);
       const Index log_len = is_power_of_two ? getLog2(line_len) : getLog2(good_composite);
 
-      ComplexScalar* a = is_power_of_two ? NULL : (ComplexScalar*)m_device.allocate(sizeof(ComplexScalar) * good_composite);
-      ComplexScalar* b = is_power_of_two ? NULL : (ComplexScalar*)m_device.allocate(sizeof(ComplexScalar) * good_composite);
-      ComplexScalar* pos_j_base_powered = is_power_of_two ? NULL : (ComplexScalar*)m_device.allocate(sizeof(ComplexScalar) * (line_len + 1));
+      ComplexScalar* a =
+          is_power_of_two ? NULL : (ComplexScalar*)m_device.allocate(sizeof(ComplexScalar) * good_composite);
+      ComplexScalar* b =
+          is_power_of_two ? NULL : (ComplexScalar*)m_device.allocate(sizeof(ComplexScalar) * good_composite);
+      ComplexScalar* pos_j_base_powered =
+          is_power_of_two ? NULL : (ComplexScalar*)m_device.allocate(sizeof(ComplexScalar) * (line_len + 1));
       if (!is_power_of_two) {
         // Compute twiddle factors
         //   t_n = exp(sqrt(-1) * pi * n^2 / line_len)
@@ -271,7 +288,7 @@
         // get data into line_buf
         const Index stride = m_strides[dim];
         if (stride == 1) {
-          m_device.memcpy(line_buf, &buf[base_offset], line_len*sizeof(ComplexScalar));
+          m_device.memcpy(line_buf, &buf[base_offset], line_len * sizeof(ComplexScalar));
         } else {
           Index offset = base_offset;
           for (int j = 0; j < line_len; ++j, offset += stride) {
@@ -282,19 +299,18 @@
         // process the line
         if (is_power_of_two) {
           processDataLineCooleyTukey(line_buf, line_len, log_len);
-        }
-        else {
+        } else {
           processDataLineBluestein(line_buf, line_len, good_composite, log_len, a, b, pos_j_base_powered);
         }
 
         // write back
         if (FFTDir == FFT_FORWARD && stride == 1) {
-          m_device.memcpy(&buf[base_offset], line_buf, line_len*sizeof(ComplexScalar));
+          m_device.memcpy(&buf[base_offset], line_buf, line_len * sizeof(ComplexScalar));
         } else {
           Index offset = base_offset;
-          const ComplexScalar div_factor =  ComplexScalar(1.0 / line_len, 0);
+          const ComplexScalar div_factor = ComplexScalar(1.0 / line_len, 0);
           for (int j = 0; j < line_len; ++j, offset += stride) {
-             buf[offset] = (FFTDir == FFT_FORWARD) ? line_buf[j] : line_buf[j] * div_factor;
+            buf[offset] = (FFTDir == FFT_FORWARD) ? line_buf[j] : line_buf[j] * div_factor;
           }
         }
       }
@@ -306,7 +322,7 @@
       }
     }
 
-    if(!write_to_out) {
+    if (!write_to_out) {
       for (Index i = 0; i < m_size; ++i) {
         data[i] = PartOf<FFTResultType>()(buf[i]);
       }
@@ -333,23 +349,26 @@
   }
 
   // Call Cooley Tukey algorithm directly, data length must be power of 2
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void processDataLineCooleyTukey(ComplexScalar* line_buf, Index line_len, Index log_len) {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void processDataLineCooleyTukey(ComplexScalar* line_buf, Index line_len,
+                                                                        Index log_len) {
     eigen_assert(isPowerOfTwo(line_len));
     scramble_FFT(line_buf, line_len);
     compute_1D_Butterfly<FFTDir>(line_buf, line_len, log_len);
   }
 
   // Call Bluestein's FFT algorithm, m is a good composite number greater than (2 * n - 1), used as the padding length
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void processDataLineBluestein(ComplexScalar* line_buf, Index line_len, Index good_composite, Index log_len, ComplexScalar* a, ComplexScalar* b, const ComplexScalar* pos_j_base_powered) {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void processDataLineBluestein(ComplexScalar* line_buf, Index line_len,
+                                                                      Index good_composite, Index log_len,
+                                                                      ComplexScalar* a, ComplexScalar* b,
+                                                                      const ComplexScalar* pos_j_base_powered) {
     Index n = line_len;
     Index m = good_composite;
     ComplexScalar* data = line_buf;
 
     for (Index i = 0; i < n; ++i) {
-      if(FFTDir == FFT_FORWARD) {
+      if (FFTDir == FFT_FORWARD) {
         a[i] = data[i] * numext::conj(pos_j_base_powered[i]);
-      }
-      else {
+      } else {
         a[i] = data[i] * pos_j_base_powered[i];
       }
     }
@@ -358,10 +377,9 @@
     }
 
     for (Index i = 0; i < n; ++i) {
-      if(FFTDir == FFT_FORWARD) {
+      if (FFTDir == FFT_FORWARD) {
         b[i] = pos_j_base_powered[i];
-      }
-      else {
+      } else {
         b[i] = numext::conj(pos_j_base_powered[i]);
       }
     }
@@ -369,11 +387,10 @@
       b[i] = ComplexScalar(0, 0);
     }
     for (Index i = m - n; i < m; ++i) {
-      if(FFTDir == FFT_FORWARD) {
-        b[i] = pos_j_base_powered[m-i];
-      }
-      else {
-        b[i] = numext::conj(pos_j_base_powered[m-i]);
+      if (FFTDir == FFT_FORWARD) {
+        b[i] = pos_j_base_powered[m - i];
+      } else {
+        b[i] = numext::conj(pos_j_base_powered[m - i]);
       }
     }
 
@@ -390,16 +407,15 @@
     scramble_FFT(a, m);
     compute_1D_Butterfly<FFT_REVERSE>(a, m, log_len);
 
-    //Do the scaling after ifft
+    // Do the scaling after ifft
     for (Index i = 0; i < m; ++i) {
       a[i] /= m;
     }
 
     for (Index i = 0; i < n; ++i) {
-      if(FFTDir == FFT_FORWARD) {
+      if (FFTDir == FFT_FORWARD) {
         data[i] = a[i] * numext::conj(pos_j_base_powered[i]);
-      }
-      else {
+      } else {
         data[i] = a[i] * pos_j_base_powered[i];
       }
     }
@@ -408,9 +424,9 @@
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE static void scramble_FFT(ComplexScalar* data, Index n) {
     eigen_assert(isPowerOfTwo(n));
     Index j = 1;
-    for (Index i = 1; i < n; ++i){
+    for (Index i = 1; i < n; ++i) {
       if (j > i) {
-        std::swap(data[j-1], data[i-1]);
+        std::swap(data[j - 1], data[i - 1]);
       }
       Index m = n >> 1;
       while (m >= 2 && j > m) {
@@ -493,15 +509,13 @@
   }
 
   template <int Dir>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void butterfly_1D_merge(
-      ComplexScalar* data, Index n, Index n_power_of_2) {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void butterfly_1D_merge(ComplexScalar* data, Index n, Index n_power_of_2) {
     // Original code:
     // RealScalar wtemp = std::sin(M_PI/n);
     // RealScalar wpi =  -std::sin(2 * M_PI/n);
     const RealScalar wtemp = m_sin_PI_div_n_LUT[n_power_of_2];
-    const RealScalar wpi = (Dir == FFT_FORWARD)
-                               ? m_minus_sin_2_PI_div_n_LUT[n_power_of_2]
-                               : -m_minus_sin_2_PI_div_n_LUT[n_power_of_2];
+    const RealScalar wpi =
+        (Dir == FFT_FORWARD) ? m_minus_sin_2_PI_div_n_LUT[n_power_of_2] : -m_minus_sin_2_PI_div_n_LUT[n_power_of_2];
 
     const ComplexScalar wp(wtemp, wpi);
     const ComplexScalar wp_one = wp + ComplexScalar(1, 0);
@@ -511,29 +525,28 @@
     const Index n2 = n / 2;
     ComplexScalar w(1.0, 0.0);
     for (Index i = 0; i < n2; i += 4) {
-       ComplexScalar temp0(data[i + n2] * w);
-       ComplexScalar temp1(data[i + 1 + n2] * w * wp_one);
-       ComplexScalar temp2(data[i + 2 + n2] * w * wp_one_2);
-       ComplexScalar temp3(data[i + 3 + n2] * w * wp_one_3);
-       w = w * wp_one_4;
+      ComplexScalar temp0(data[i + n2] * w);
+      ComplexScalar temp1(data[i + 1 + n2] * w * wp_one);
+      ComplexScalar temp2(data[i + 2 + n2] * w * wp_one_2);
+      ComplexScalar temp3(data[i + 3 + n2] * w * wp_one_3);
+      w = w * wp_one_4;
 
-       data[i + n2] = data[i] - temp0;
-       data[i] += temp0;
+      data[i + n2] = data[i] - temp0;
+      data[i] += temp0;
 
-       data[i + 1 + n2] = data[i + 1] - temp1;
-       data[i + 1] += temp1;
+      data[i + 1 + n2] = data[i + 1] - temp1;
+      data[i + 1] += temp1;
 
-       data[i + 2 + n2] = data[i + 2] - temp2;
-       data[i + 2] += temp2;
+      data[i + 2 + n2] = data[i + 2] - temp2;
+      data[i + 2] += temp2;
 
-       data[i + 3 + n2] = data[i + 3] - temp3;
-       data[i + 3] += temp3;
+      data[i + 3 + n2] = data[i + 3] - temp3;
+      data[i + 3] += temp3;
     }
   }
 
- template <int Dir>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void compute_1D_Butterfly(
-      ComplexScalar* data, Index n, Index n_power_of_2) {
+  template <int Dir>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void compute_1D_Butterfly(ComplexScalar* data, Index n, Index n_power_of_2) {
     eigen_assert(isPowerOfTwo(n));
     if (n > 8) {
       compute_1D_Butterfly<Dir>(data, n / 2, n_power_of_2 - 1);
@@ -559,8 +572,7 @@
         result += idx * m_strides[i];
       }
       result += index;
-    }
-    else {
+    } else {
       for (Index i = 0; i < omitted_dim; ++i) {
         const Index partial_m_stride = m_strides[i] / m_dimensions[omitted_dim];
         const Index idx = index / partial_m_stride;
@@ -574,7 +586,7 @@
   }
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index getIndexFromOffset(Index base, Index omitted_dim, Index offset) const {
-    Index result = base + offset * m_strides[omitted_dim] ;
+    Index result = base + offset * m_strides[omitted_dim];
     return result;
   }
 
@@ -589,76 +601,72 @@
 
   // This will support a maximum FFT size of 2^32 for each dimension
   // m_sin_PI_div_n_LUT[i] = (-2) * std::sin(M_PI / std::pow(2,i)) ^ 2;
-  const RealScalar m_sin_PI_div_n_LUT[32] = {
-    RealScalar(0.0),
-    RealScalar(-2),
-    RealScalar(-0.999999999999999),
-    RealScalar(-0.292893218813453),
-    RealScalar(-0.0761204674887130),
-    RealScalar(-0.0192147195967696),
-    RealScalar(-0.00481527332780311),
-    RealScalar(-0.00120454379482761),
-    RealScalar(-3.01181303795779e-04),
-    RealScalar(-7.52981608554592e-05),
-    RealScalar(-1.88247173988574e-05),
-    RealScalar(-4.70619042382852e-06),
-    RealScalar(-1.17654829809007e-06),
-    RealScalar(-2.94137117780840e-07),
-    RealScalar(-7.35342821488550e-08),
-    RealScalar(-1.83835707061916e-08),
-    RealScalar(-4.59589268710903e-09),
-    RealScalar(-1.14897317243732e-09),
-    RealScalar(-2.87243293150586e-10),
-    RealScalar( -7.18108232902250e-11),
-    RealScalar(-1.79527058227174e-11),
-    RealScalar(-4.48817645568941e-12),
-    RealScalar(-1.12204411392298e-12),
-    RealScalar(-2.80511028480785e-13),
-    RealScalar(-7.01277571201985e-14),
-    RealScalar(-1.75319392800498e-14),
-    RealScalar(-4.38298482001247e-15),
-    RealScalar(-1.09574620500312e-15),
-    RealScalar(-2.73936551250781e-16),
-    RealScalar(-6.84841378126949e-17),
-    RealScalar(-1.71210344531737e-17),
-    RealScalar(-4.28025861329343e-18)
-  };
+  const RealScalar m_sin_PI_div_n_LUT[32] = {RealScalar(0.0),
+                                             RealScalar(-2),
+                                             RealScalar(-0.999999999999999),
+                                             RealScalar(-0.292893218813453),
+                                             RealScalar(-0.0761204674887130),
+                                             RealScalar(-0.0192147195967696),
+                                             RealScalar(-0.00481527332780311),
+                                             RealScalar(-0.00120454379482761),
+                                             RealScalar(-3.01181303795779e-04),
+                                             RealScalar(-7.52981608554592e-05),
+                                             RealScalar(-1.88247173988574e-05),
+                                             RealScalar(-4.70619042382852e-06),
+                                             RealScalar(-1.17654829809007e-06),
+                                             RealScalar(-2.94137117780840e-07),
+                                             RealScalar(-7.35342821488550e-08),
+                                             RealScalar(-1.83835707061916e-08),
+                                             RealScalar(-4.59589268710903e-09),
+                                             RealScalar(-1.14897317243732e-09),
+                                             RealScalar(-2.87243293150586e-10),
+                                             RealScalar(-7.18108232902250e-11),
+                                             RealScalar(-1.79527058227174e-11),
+                                             RealScalar(-4.48817645568941e-12),
+                                             RealScalar(-1.12204411392298e-12),
+                                             RealScalar(-2.80511028480785e-13),
+                                             RealScalar(-7.01277571201985e-14),
+                                             RealScalar(-1.75319392800498e-14),
+                                             RealScalar(-4.38298482001247e-15),
+                                             RealScalar(-1.09574620500312e-15),
+                                             RealScalar(-2.73936551250781e-16),
+                                             RealScalar(-6.84841378126949e-17),
+                                             RealScalar(-1.71210344531737e-17),
+                                             RealScalar(-4.28025861329343e-18)};
 
   // m_minus_sin_2_PI_div_n_LUT[i] = -std::sin(2 * M_PI / std::pow(2,i));
-  const RealScalar m_minus_sin_2_PI_div_n_LUT[32] = {
-    RealScalar(0.0),
-    RealScalar(0.0),
-    RealScalar(-1.00000000000000e+00),
-    RealScalar(-7.07106781186547e-01),
-    RealScalar(-3.82683432365090e-01),
-    RealScalar(-1.95090322016128e-01),
-    RealScalar(-9.80171403295606e-02),
-    RealScalar(-4.90676743274180e-02),
-    RealScalar(-2.45412285229123e-02),
-    RealScalar(-1.22715382857199e-02),
-    RealScalar(-6.13588464915448e-03),
-    RealScalar(-3.06795676296598e-03),
-    RealScalar(-1.53398018628477e-03),
-    RealScalar(-7.66990318742704e-04),
-    RealScalar(-3.83495187571396e-04),
-    RealScalar(-1.91747597310703e-04),
-    RealScalar(-9.58737990959773e-05),
-    RealScalar(-4.79368996030669e-05),
-    RealScalar(-2.39684498084182e-05),
-    RealScalar(-1.19842249050697e-05),
-    RealScalar(-5.99211245264243e-06),
-    RealScalar(-2.99605622633466e-06),
-    RealScalar(-1.49802811316901e-06),
-    RealScalar(-7.49014056584716e-07),
-    RealScalar(-3.74507028292384e-07),
-    RealScalar(-1.87253514146195e-07),
-    RealScalar(-9.36267570730981e-08),
-    RealScalar(-4.68133785365491e-08),
-    RealScalar(-2.34066892682746e-08),
-    RealScalar(-1.17033446341373e-08),
-    RealScalar(-5.85167231706864e-09),
-    RealScalar(-2.92583615853432e-09)
-  };
+  const RealScalar m_minus_sin_2_PI_div_n_LUT[32] = {RealScalar(0.0),
+                                                     RealScalar(0.0),
+                                                     RealScalar(-1.00000000000000e+00),
+                                                     RealScalar(-7.07106781186547e-01),
+                                                     RealScalar(-3.82683432365090e-01),
+                                                     RealScalar(-1.95090322016128e-01),
+                                                     RealScalar(-9.80171403295606e-02),
+                                                     RealScalar(-4.90676743274180e-02),
+                                                     RealScalar(-2.45412285229123e-02),
+                                                     RealScalar(-1.22715382857199e-02),
+                                                     RealScalar(-6.13588464915448e-03),
+                                                     RealScalar(-3.06795676296598e-03),
+                                                     RealScalar(-1.53398018628477e-03),
+                                                     RealScalar(-7.66990318742704e-04),
+                                                     RealScalar(-3.83495187571396e-04),
+                                                     RealScalar(-1.91747597310703e-04),
+                                                     RealScalar(-9.58737990959773e-05),
+                                                     RealScalar(-4.79368996030669e-05),
+                                                     RealScalar(-2.39684498084182e-05),
+                                                     RealScalar(-1.19842249050697e-05),
+                                                     RealScalar(-5.99211245264243e-06),
+                                                     RealScalar(-2.99605622633466e-06),
+                                                     RealScalar(-1.49802811316901e-06),
+                                                     RealScalar(-7.49014056584716e-07),
+                                                     RealScalar(-3.74507028292384e-07),
+                                                     RealScalar(-1.87253514146195e-07),
+                                                     RealScalar(-9.36267570730981e-08),
+                                                     RealScalar(-4.68133785365491e-08),
+                                                     RealScalar(-2.34066892682746e-08),
+                                                     RealScalar(-1.17033446341373e-08),
+                                                     RealScalar(-5.85167231706864e-09),
+                                                     RealScalar(-2.92583615853432e-09)};
 };
 
 }  // end namespace Eigen
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorFixedSize.h b/unsupported/Eigen/CXX11/src/Tensor/TensorFixedSize.h
index 0273a44..7f229cb 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorFixedSize.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorFixedSize.h
@@ -16,40 +16,39 @@
 namespace Eigen {
 
 /** \class TensorFixedSize
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief The fixed sized version of the tensor class.
-  *
-  * The fixed sized equivalent of
-  * Eigen::Tensor<float, 3> t(3, 5, 7);
-  * is
-  * Eigen::TensorFixedSize<float, Sizes<3,5,7>> t;
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief The fixed sized version of the tensor class.
+ *
+ * The fixed sized equivalent of
+ * Eigen::Tensor<float, 3> t(3, 5, 7);
+ * is
+ * Eigen::TensorFixedSize<float, Sizes<3,5,7>> t;
+ */
 
-template<typename Scalar_, typename Dimensions_, int Options_, typename IndexType>
-class TensorFixedSize : public TensorBase<TensorFixedSize<Scalar_, Dimensions_, Options_, IndexType> >
-{
-  public:
-    typedef TensorFixedSize<Scalar_, Dimensions_, Options_, IndexType> Self;
-    typedef TensorBase<TensorFixedSize<Scalar_, Dimensions_, Options_, IndexType> > Base;
-    typedef typename Eigen::internal::nested<Self>::type Nested;
-    typedef typename internal::traits<Self>::StorageKind StorageKind;
-    typedef typename internal::traits<Self>::Index Index;
-    typedef Scalar_ Scalar;
-    typedef typename NumTraits<Scalar>::Real RealScalar;
-    typedef typename Base::CoeffReturnType CoeffReturnType;
+template <typename Scalar_, typename Dimensions_, int Options_, typename IndexType>
+class TensorFixedSize : public TensorBase<TensorFixedSize<Scalar_, Dimensions_, Options_, IndexType> > {
+ public:
+  typedef TensorFixedSize<Scalar_, Dimensions_, Options_, IndexType> Self;
+  typedef TensorBase<TensorFixedSize<Scalar_, Dimensions_, Options_, IndexType> > Base;
+  typedef typename Eigen::internal::nested<Self>::type Nested;
+  typedef typename internal::traits<Self>::StorageKind StorageKind;
+  typedef typename internal::traits<Self>::Index Index;
+  typedef Scalar_ Scalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef typename Base::CoeffReturnType CoeffReturnType;
 
-    static constexpr int Options = Options_;
-    static constexpr int Layout = Options_ & RowMajor ? RowMajor : ColMajor;
+  static constexpr int Options = Options_;
+  static constexpr int Layout = Options_ & RowMajor ? RowMajor : ColMajor;
 
-    enum {
-      IsAligned = bool(EIGEN_MAX_ALIGN_BYTES>0),
-      PacketAccess = (internal::packet_traits<Scalar>::size > 1),
-      BlockAccess = false,
-      PreferBlockAccess = false,
-      CoordAccess = true,
-      RawAccess = true
-    };
+  enum {
+    IsAligned = bool(EIGEN_MAX_ALIGN_BYTES > 0),
+    PacketAccess = (internal::packet_traits<Scalar>::size > 1),
+    BlockAccess = false,
+    PreferBlockAccess = false,
+    CoordAccess = true,
+    RawAccess = true
+  };
 
   //===- Tensor block evaluation strategy (see TensorBlock.h) -------------===//
   typedef internal::TensorBlockNotImplemented TensorBlock;
@@ -58,224 +57,170 @@
   typedef Dimensions_ Dimensions;
   static constexpr std::size_t NumIndices = Dimensions::count;
 
-  protected:
+ protected:
   TensorStorage<Scalar, Dimensions, Options> m_storage;
 
-  public:
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index                    rank()                   const { return NumIndices; }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index                    dimension(std::size_t n) const { return m_storage.dimensions()[n]; }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions         dimensions()             const { return m_storage.dimensions(); }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index                    size()                   const { return m_storage.size(); }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar                   *data()                        { return m_storage.data(); }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar             *data()                  const { return m_storage.data(); }
+ public:
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index rank() const { return NumIndices; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index dimension(std::size_t n) const { return m_storage.dimensions()[n]; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions dimensions() const { return m_storage.dimensions(); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index size() const { return m_storage.size(); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar* data() { return m_storage.data(); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar* data() const { return m_storage.data(); }
 
-    // This makes EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
-    // work, because that uses base().coeffRef() - and we don't yet
-    // implement a similar class hierarchy
-    inline Self& base()             { return *this; }
-    inline const Self& base() const { return *this; }
+  // This makes EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
+  // work, because that uses base().coeffRef() - and we don't yet
+  // implement a similar class hierarchy
+  inline Self& base() { return *this; }
+  inline const Self& base() const { return *this; }
 
-    template<typename... IndexTypes>
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& coeff(Index firstIndex, IndexTypes... otherIndices) const
-    {
-      // The number of indices used to access a tensor coefficient must be equal to the rank of the tensor.
-      EIGEN_STATIC_ASSERT(sizeof...(otherIndices) + 1 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
-      return coeff(array<Index, NumIndices>{{firstIndex, otherIndices...}});
+  template <typename... IndexTypes>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& coeff(Index firstIndex, IndexTypes... otherIndices) const {
+    // The number of indices used to access a tensor coefficient must be equal to the rank of the tensor.
+    EIGEN_STATIC_ASSERT(sizeof...(otherIndices) + 1 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
+    return coeff(array<Index, NumIndices>{{firstIndex, otherIndices...}});
+  }
+
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& coeff(const array<Index, NumIndices>& indices) const {
+    eigen_internal_assert(checkIndexRange(indices));
+    return m_storage.data()[linearizedIndex(indices)];
+  }
+
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& coeff(Index index) const {
+    eigen_internal_assert(index >= 0 && index < size());
+    return m_storage.data()[index];
+  }
+
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& coeff() const {
+    EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE);
+    return m_storage.data()[0];
+  }
+
+  template <typename... IndexTypes>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index firstIndex, IndexTypes... otherIndices) {
+    // The number of indices used to access a tensor coefficient must be equal to the rank of the tensor.
+    EIGEN_STATIC_ASSERT(sizeof...(otherIndices) + 1 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
+    return coeffRef(array<Index, NumIndices>{{firstIndex, otherIndices...}});
+  }
+
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(const array<Index, NumIndices>& indices) {
+    eigen_internal_assert(checkIndexRange(indices));
+    return m_storage.data()[linearizedIndex(indices)];
+  }
+
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index index) {
+    eigen_internal_assert(index >= 0 && index < size());
+    return m_storage.data()[index];
+  }
+
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef() {
+    EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE);
+    return m_storage.data()[0];
+  }
+
+  template <typename... IndexTypes>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& operator()(Index firstIndex, IndexTypes... otherIndices) const {
+    // The number of indices used to access a tensor coefficient must be equal to the rank of the tensor.
+    EIGEN_STATIC_ASSERT(sizeof...(otherIndices) + 1 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
+    return this->operator()(array<Index, NumIndices>{{firstIndex, otherIndices...}});
+  }
+
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& operator()(const array<Index, NumIndices>& indices) const {
+    eigen_assert(checkIndexRange(indices));
+    return coeff(indices);
+  }
+
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& operator()(Index index) const {
+    eigen_internal_assert(index >= 0 && index < size());
+    return coeff(index);
+  }
+
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& operator()() const {
+    EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE);
+    return coeff();
+  }
+
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& operator[](Index index) const {
+    // The bracket operator is only for vectors, use the parenthesis operator instead.
+    EIGEN_STATIC_ASSERT(NumIndices == 1, YOU_MADE_A_PROGRAMMING_MISTAKE);
+    return coeff(index);
+  }
+
+  template <typename... IndexTypes>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator()(Index firstIndex, IndexTypes... otherIndices) {
+    // The number of indices used to access a tensor coefficient must be equal to the rank of the tensor.
+    EIGEN_STATIC_ASSERT(sizeof...(otherIndices) + 1 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
+    return operator()(array<Index, NumIndices>{{firstIndex, otherIndices...}});
+  }
+
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator()(const array<Index, NumIndices>& indices) {
+    eigen_assert(checkIndexRange(indices));
+    return coeffRef(indices);
+  }
+
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator()(Index index) {
+    eigen_assert(index >= 0 && index < size());
+    return coeffRef(index);
+  }
+
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator()() {
+    EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE);
+    return coeffRef();
+  }
+
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator[](Index index) {
+    // The bracket operator is only for vectors, use the parenthesis operator instead
+    EIGEN_STATIC_ASSERT(NumIndices == 1, YOU_MADE_A_PROGRAMMING_MISTAKE)
+    return coeffRef(index);
+  }
+
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorFixedSize() : m_storage() {}
+
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorFixedSize(const Self& other) : Base(other), m_storage(other.m_storage) {}
+
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorFixedSize(Self&& other) : m_storage(other.m_storage) {}
+
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorFixedSize(const TensorBase<OtherDerived, ReadOnlyAccessors>& other) {
+    typedef TensorAssignOp<TensorFixedSize, const OtherDerived> Assign;
+    Assign assign(*this, other.derived());
+    internal::TensorExecutor<const Assign, DefaultDevice>::run(assign, DefaultDevice());
+  }
+  template <typename OtherDerived>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorFixedSize(const TensorBase<OtherDerived, WriteAccessors>& other) {
+    typedef TensorAssignOp<TensorFixedSize, const OtherDerived> Assign;
+    Assign assign(*this, other.derived());
+    internal::TensorExecutor<const Assign, DefaultDevice>::run(assign, DefaultDevice());
+  }
+
+  // FIXME: check that the dimensions of other match the dimensions of *this.
+  // Unfortunately this isn't possible yet when the rhs is an expression.
+  EIGEN_TENSOR_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(TensorFixedSize)
+
+ protected:
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool checkIndexRange(const array<Index, NumIndices>& /*indices*/) const {
+    using internal::array_apply_and_reduce;
+    using internal::array_zip_and_reduce;
+    using internal::greater_equal_zero_op;
+    using internal::lesser_op;
+    using internal::logical_and_op;
+
+    return true;
+    // check whether the indices are all >= 0
+    /*       array_apply_and_reduce<logical_and_op, greater_equal_zero_op>(indices) &&
+  // check whether the indices fit in the dimensions
+  array_zip_and_reduce<logical_and_op, lesser_op>(indices, m_storage.dimensions());*/
+  }
+
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index linearizedIndex(const array<Index, NumIndices>& indices) const {
+    if (Options & RowMajor) {
+      return m_storage.dimensions().IndexOfRowMajor(indices);
+    } else {
+      return m_storage.dimensions().IndexOfColMajor(indices);
     }
-
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE const Scalar& coeff(const array<Index, NumIndices>& indices) const
-    {
-      eigen_internal_assert(checkIndexRange(indices));
-      return m_storage.data()[linearizedIndex(indices)];
-    }
-
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE const Scalar& coeff(Index index) const
-    {
-      eigen_internal_assert(index >= 0 && index < size());
-      return m_storage.data()[index];
-    }
-
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE const Scalar& coeff() const
-    {
-      EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE);
-      return m_storage.data()[0];
-    }
-
-
-    template<typename... IndexTypes>
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index firstIndex, IndexTypes... otherIndices)
-    {
-      // The number of indices used to access a tensor coefficient must be equal to the rank of the tensor.
-      EIGEN_STATIC_ASSERT(sizeof...(otherIndices) + 1 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
-      return coeffRef(array<Index, NumIndices>{{firstIndex, otherIndices...}});
-    }
-
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Scalar& coeffRef(const array<Index, NumIndices>& indices)
-    {
-      eigen_internal_assert(checkIndexRange(indices));
-      return m_storage.data()[linearizedIndex(indices)];
-    }
-
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Scalar& coeffRef(Index index)
-    {
-      eigen_internal_assert(index >= 0 && index < size());
-      return m_storage.data()[index];
-    }
-
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Scalar& coeffRef()
-    {
-      EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE);
-      return m_storage.data()[0];
-    }
-
-    template<typename... IndexTypes>
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar& operator()(Index firstIndex, IndexTypes... otherIndices) const
-    {
-      // The number of indices used to access a tensor coefficient must be equal to the rank of the tensor.
-      EIGEN_STATIC_ASSERT(sizeof...(otherIndices) + 1 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
-      return this->operator()(array<Index, NumIndices>{{firstIndex, otherIndices...}});
-    }
-
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE const Scalar& operator()(const array<Index, NumIndices>& indices) const
-    {
-      eigen_assert(checkIndexRange(indices));
-      return coeff(indices);
-    }
-
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE const Scalar& operator()(Index index) const
-    {
-      eigen_internal_assert(index >= 0 && index < size());
-      return coeff(index);
-    }
-
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE const Scalar& operator()() const
-    {
-      EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE);
-      return coeff();
-    }
-
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE const Scalar& operator[](Index index) const
-    {
-      // The bracket operator is only for vectors, use the parenthesis operator instead.
-      EIGEN_STATIC_ASSERT(NumIndices == 1, YOU_MADE_A_PROGRAMMING_MISTAKE);
-      return coeff(index);
-    }
-
-    template<typename... IndexTypes>
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& operator()(Index firstIndex, IndexTypes... otherIndices)
-    {
-      // The number of indices used to access a tensor coefficient must be equal to the rank of the tensor.
-      EIGEN_STATIC_ASSERT(sizeof...(otherIndices) + 1 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
-      return operator()(array<Index, NumIndices>{{firstIndex, otherIndices...}});
-    }
-
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Scalar& operator()(const array<Index, NumIndices>& indices)
-    {
-      eigen_assert(checkIndexRange(indices));
-      return coeffRef(indices);
-    }
-
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Scalar& operator()(Index index)
-    {
-      eigen_assert(index >= 0 && index < size());
-      return coeffRef(index);
-    }
-
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Scalar& operator()()
-    {
-      EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE);
-      return coeffRef();
-    }
-
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Scalar& operator[](Index index)
-    {
-      // The bracket operator is only for vectors, use the parenthesis operator instead
-      EIGEN_STATIC_ASSERT(NumIndices == 1, YOU_MADE_A_PROGRAMMING_MISTAKE)
-      return coeffRef(index);
-    }
-
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE TensorFixedSize()
-      : m_storage()
-    {
-    }
-
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE TensorFixedSize(const Self& other)
-      : Base(other), m_storage(other.m_storage)
-    {
-    }
-
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorFixedSize(Self&& other)
-      : m_storage(other.m_storage)
-    {
-    }
-
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE TensorFixedSize(const TensorBase<OtherDerived, ReadOnlyAccessors>& other)
-    {
-      typedef TensorAssignOp<TensorFixedSize, const OtherDerived> Assign;
-      Assign assign(*this, other.derived());
-      internal::TensorExecutor<const Assign, DefaultDevice>::run(assign, DefaultDevice());
-    }
-    template<typename OtherDerived>
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE TensorFixedSize(const TensorBase<OtherDerived, WriteAccessors>& other)
-    {
-      typedef TensorAssignOp<TensorFixedSize, const OtherDerived> Assign;
-      Assign assign(*this, other.derived());
-      internal::TensorExecutor<const Assign, DefaultDevice>::run(assign, DefaultDevice());
-    }
-
-    // FIXME: check that the dimensions of other match the dimensions of *this.
-    // Unfortunately this isn't possible yet when the rhs is an expression.
-    EIGEN_TENSOR_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(TensorFixedSize)
-
-
-  protected:
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE bool checkIndexRange(const array<Index, NumIndices>& /*indices*/) const
-    {
-      using internal::array_apply_and_reduce;
-      using internal::array_zip_and_reduce;
-      using internal::greater_equal_zero_op;
-      using internal::logical_and_op;
-      using internal::lesser_op;
-
-      return true;
-        // check whether the indices are all >= 0
-          /*       array_apply_and_reduce<logical_and_op, greater_equal_zero_op>(indices) &&
-        // check whether the indices fit in the dimensions
-        array_zip_and_reduce<logical_and_op, lesser_op>(indices, m_storage.dimensions());*/
-    }
-
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Index linearizedIndex(const array<Index, NumIndices>& indices) const
-    {
-      if (Options&RowMajor) {
-        return m_storage.dimensions().IndexOfRowMajor(indices);
-      } else {
-        return m_storage.dimensions().IndexOfColMajor(indices);
-      }
-    }
+  }
 };
 
+}  // end namespace Eigen
 
-} // end namespace Eigen
-
-#endif // EIGEN_CXX11_TENSOR_TENSOR_FIXED_SIZE_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_FIXED_SIZE_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorForcedEval.h b/unsupported/Eigen/CXX11/src/Tensor/TensorForcedEval.h
index e6a9141..c3a7ef4 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorForcedEval.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorForcedEval.h
@@ -16,16 +16,15 @@
 namespace Eigen {
 
 /** \class TensorForcedEval
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Tensor reshaping class.
-  *
-  *
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Tensor reshaping class.
+ *
+ *
+ */
 namespace internal {
-template<typename XprType>
-struct traits<TensorForcedEvalOp<XprType> >
-{
+template <typename XprType>
+struct traits<TensorForcedEvalOp<XprType>> {
   // Type promotion to handle the case where the types of the lhs and the rhs are different.
   typedef typename XprType::Scalar Scalar;
   typedef traits<XprType> XprTraits;
@@ -37,31 +36,24 @@
   static constexpr int Layout = XprTraits::Layout;
   typedef typename XprTraits::PointerType PointerType;
 
-  enum {
-    Flags = 0
-  };
+  enum { Flags = 0 };
 };
 
-template<typename XprType>
-struct eval<TensorForcedEvalOp<XprType>, Eigen::Dense>
-{
+template <typename XprType>
+struct eval<TensorForcedEvalOp<XprType>, Eigen::Dense> {
   typedef const TensorForcedEvalOp<XprType>& type;
 };
 
-template<typename XprType>
-struct nested<TensorForcedEvalOp<XprType>, 1, typename eval<TensorForcedEvalOp<XprType> >::type>
-{
+template <typename XprType>
+struct nested<TensorForcedEvalOp<XprType>, 1, typename eval<TensorForcedEvalOp<XprType>>::type> {
   typedef TensorForcedEvalOp<XprType> type;
 };
 
 }  // end namespace internal
 
-
-
-template<typename XprType>
-class TensorForcedEvalOp : public TensorBase<TensorForcedEvalOp<XprType>, ReadOnlyAccessors>
-{
-  public:
+template <typename XprType>
+class TensorForcedEvalOp : public TensorBase<TensorForcedEvalOp<XprType>, ReadOnlyAccessors> {
+ public:
   typedef typename Eigen::internal::traits<TensorForcedEvalOp>::Scalar Scalar;
   typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
   typedef std::remove_const_t<typename XprType::CoeffReturnType> CoeffReturnType;
@@ -69,43 +61,38 @@
   typedef typename Eigen::internal::traits<TensorForcedEvalOp>::StorageKind StorageKind;
   typedef typename Eigen::internal::traits<TensorForcedEvalOp>::Index Index;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorForcedEvalOp(const XprType& expr)
-      : m_xpr(expr) {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorForcedEvalOp(const XprType& expr) : m_xpr(expr) {}
 
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<typename XprType::Nested>&
-    expression() const { return m_xpr; }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename XprType::Nested>& expression() const { return m_xpr; }
 
-  protected:
-    typename XprType::Nested m_xpr;
+ protected:
+  typename XprType::Nested m_xpr;
 };
 
 namespace internal {
 template <typename Device, typename CoeffReturnType>
-struct non_integral_type_placement_new{
+struct non_integral_type_placement_new {
   template <typename StorageType>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void operator()(Index numValues, StorageType m_buffer) {
-   // Initialize non-trivially constructible types.
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void operator()(Index numValues, StorageType m_buffer) {
+    // Initialize non-trivially constructible types.
     if (!internal::is_arithmetic<CoeffReturnType>::value) {
       for (Index i = 0; i < numValues; ++i) new (m_buffer + i) CoeffReturnType();
     }
-}
+  }
 };
 
-// SYCL does not support non-integral types 
-// having new (m_buffer + i) CoeffReturnType() causes the following compiler error for SYCL Devices 
+// SYCL does not support non-integral types
+// having new (m_buffer + i) CoeffReturnType() causes the following compiler error for SYCL Devices
 // no matching function for call to 'operator new'
 template <typename CoeffReturnType>
 struct non_integral_type_placement_new<Eigen::SyclDevice, CoeffReturnType> {
   template <typename StorageType>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void operator()(Index, StorageType) {
-}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void operator()(Index, StorageType) {}
 };
-} // end namespace internal
+}  // end namespace internal
 
-template<typename ArgType_, typename Device>
-struct TensorEvaluator<const TensorForcedEvalOp<ArgType_>, Device>
-{
+template <typename ArgType_, typename Device>
+struct TensorEvaluator<const TensorForcedEvalOp<ArgType_>, Device> {
   typedef const internal::remove_all_t<ArgType_> ArgType;
   typedef TensorForcedEvalOp<ArgType> XprType;
   typedef typename ArgType::Scalar Scalar;
@@ -119,11 +106,11 @@
   typedef typename Storage::Type EvaluatorPointerType;
 
   enum {
-    IsAligned         = true,
-    PacketAccess      = (PacketType<CoeffReturnType, Device>::size > 1),
-    BlockAccess       = internal::is_arithmetic<CoeffReturnType>::value,
+    IsAligned = true,
+    PacketAccess = (PacketType<CoeffReturnType, Device>::size > 1),
+    BlockAccess = internal::is_arithmetic<CoeffReturnType>::value,
     PreferBlockAccess = false,
-    RawAccess         = true
+    RawAccess = true
   };
 
   static constexpr int Layout = TensorEvaluator<ArgType, Device>::Layout;
@@ -133,55 +120,44 @@
   typedef internal::TensorBlockDescriptor<NumDims, Index> TensorBlockDesc;
   typedef internal::TensorBlockScratchAllocator<Device> TensorBlockScratch;
 
-  typedef typename internal::TensorMaterializedBlock<CoeffReturnType, NumDims,
-                                                     Layout, Index>
-      TensorBlock;
+  typedef typename internal::TensorMaterializedBlock<CoeffReturnType, NumDims, Layout, Index> TensorBlock;
   //===--------------------------------------------------------------------===//
 
   TensorEvaluator(const XprType& op, const Device& device)
-      : m_impl(op.expression(), device), m_op(op.expression()),
-      m_device(device), m_buffer(NULL)
-  { }
+      : m_impl(op.expression(), device), m_op(op.expression()), m_device(device), m_buffer(NULL) {}
 
   EIGEN_DEVICE_FUNC const Dimensions& dimensions() const { return m_impl.dimensions(); }
 
   EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType) {
-    const Index numValues =  internal::array_prod(m_impl.dimensions());
+    const Index numValues = internal::array_prod(m_impl.dimensions());
     m_buffer = m_device.get((CoeffReturnType*)m_device.allocate_temp(numValues * sizeof(CoeffReturnType)));
 
-   internal::non_integral_type_placement_new<Device, CoeffReturnType>()(numValues, m_buffer);
+    internal::non_integral_type_placement_new<Device, CoeffReturnType>()(numValues, m_buffer);
 
-    typedef TensorEvalToOp< const std::remove_const_t<ArgType> > EvalTo;
+    typedef TensorEvalToOp<const std::remove_const_t<ArgType>> EvalTo;
     EvalTo evalToTmp(m_device.get(m_buffer), m_op);
 
-    internal::TensorExecutor<
-        const EvalTo, std::remove_const_t<Device>,
-        /*Vectorizable=*/internal::IsVectorizable<Device, const ArgType>::value,
-        /*Tiling=*/internal::IsTileable<Device, const ArgType>::value>::
-        run(evalToTmp, m_device);
+    internal::TensorExecutor<const EvalTo, std::remove_const_t<Device>,
+                             /*Vectorizable=*/internal::IsVectorizable<Device, const ArgType>::value,
+                             /*Tiling=*/internal::IsTileable<Device, const ArgType>::value>::run(evalToTmp, m_device);
 
     return true;
   }
 
 #ifdef EIGEN_USE_THREADS
   template <typename EvalSubExprsCallback>
-  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(
-      EvaluatorPointerType, EvalSubExprsCallback done) {
+  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(EvaluatorPointerType, EvalSubExprsCallback done) {
     const Index numValues = internal::array_prod(m_impl.dimensions());
-    m_buffer = m_device.get((CoeffReturnType*)m_device.allocate_temp(
-        numValues * sizeof(CoeffReturnType)));
-    typedef TensorEvalToOp<const std::remove_const_t<ArgType>>
-        EvalTo;
+    m_buffer = m_device.get((CoeffReturnType*)m_device.allocate_temp(numValues * sizeof(CoeffReturnType)));
+    typedef TensorEvalToOp<const std::remove_const_t<ArgType>> EvalTo;
     EvalTo evalToTmp(m_device.get(m_buffer), m_op);
 
-    auto on_done = std::bind([](EvalSubExprsCallback done_) { done_(true); },
-                             std::move(done));
+    auto on_done = std::bind([](EvalSubExprsCallback done_) { done_(true); }, std::move(done));
     internal::TensorAsyncExecutor<
-        const EvalTo, std::remove_const_t<Device>,
-        decltype(on_done),
+        const EvalTo, std::remove_const_t<Device>, decltype(on_done),
         /*Vectorizable=*/internal::IsVectorizable<Device, const ArgType>::value,
-        /*Tiling=*/internal::IsTileable<Device, const ArgType>::value>::
-        runAsync(evalToTmp, m_device, std::move(on_done));
+        /*Tiling=*/internal::IsTileable<Device, const ArgType>::value>::runAsync(evalToTmp, m_device,
+                                                                                 std::move(on_done));
   }
 #endif
 
@@ -190,25 +166,19 @@
     m_buffer = NULL;
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
-  {
-    return m_buffer[index];
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const { return m_buffer[index]; }
 
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const
-  {
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const {
     return internal::ploadt<PacketReturnType, LoadMode>(m_buffer + index);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  internal::TensorBlockResourceRequirements getResourceRequirements() const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE internal::TensorBlockResourceRequirements getResourceRequirements() const {
     return internal::TensorBlockResourceRequirements::any();
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock
-  block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
-          bool /*root_of_expr_ast*/ = false) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
+                                                          bool /*root_of_expr_ast*/ = false) const {
     eigen_assert(m_buffer != NULL);
     return TensorBlock::materialize(m_buffer, m_impl.dimensions(), desc, scratch);
   }
@@ -217,8 +187,7 @@
     return TensorOpCost(sizeof(CoeffReturnType), 0, 0, vectorized, PacketSize);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  EvaluatorPointerType data() const { return m_buffer; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EvaluatorPointerType data() const { return m_buffer; }
 
  private:
   TensorEvaluator<ArgType, Device> m_impl;
@@ -227,7 +196,6 @@
   EvaluatorPointerType m_buffer;
 };
 
+}  // end namespace Eigen
 
-} // end namespace Eigen
-
-#endif // EIGEN_CXX11_TENSOR_TENSOR_FORCED_EVAL_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_FORCED_EVAL_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorForwardDeclarations.h b/unsupported/Eigen/CXX11/src/Tensor/TensorForwardDeclarations.h
index 0980987..efb7f02 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorForwardDeclarations.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorForwardDeclarations.h
@@ -21,7 +21,8 @@
 // T* m_data on the host. It is always called on the device.
 // Specialisation of MakePointer class for creating the sycl buffer with
 // map_allocator.
-template<typename T> struct MakePointer {
+template <typename T>
+struct MakePointer {
   typedef T* Type;
   typedef const T* ConstType;
 };
@@ -37,68 +38,114 @@
 // the TensorEvaluator class can be specialized for a device, hence it is possible
 // to construct different types of temproray storage memory in TensorEvaluator
 // for different devices by specializing the following StorageMemory class.
-template<typename T, typename device> struct StorageMemory: MakePointer <T> {};
+template <typename T, typename device>
+struct StorageMemory : MakePointer<T> {};
 
-namespace internal{
-template<typename A, typename B> struct Pointer_type_promotion {
-  static const bool val=false;
+namespace internal {
+template <typename A, typename B>
+struct Pointer_type_promotion {
+  static const bool val = false;
 };
-template<typename A> struct Pointer_type_promotion<A, A> {
+template <typename A>
+struct Pointer_type_promotion<A, A> {
   static const bool val = true;
 };
-template<typename A, typename B> struct TypeConversion {
+template <typename A, typename B>
+struct TypeConversion {
   typedef A* type;
 };
-}
+}  // namespace internal
 
+template <typename PlainObjectType, int Options_ = Unaligned, template <class> class MakePointer_ = MakePointer>
+class TensorMap;
+template <typename Scalar_, int NumIndices_, int Options_ = 0, typename IndexType = DenseIndex>
+class Tensor;
+template <typename Scalar_, typename Dimensions, int Options_ = 0, typename IndexType = DenseIndex>
+class TensorFixedSize;
+template <typename PlainObjectType>
+class TensorRef;
+template <typename Derived, int AccessLevel>
+class TensorBase;
 
-template<typename PlainObjectType, int Options_ = Unaligned, template <class> class MakePointer_ = MakePointer> class TensorMap;
-template<typename Scalar_, int NumIndices_, int Options_ = 0, typename IndexType = DenseIndex> class Tensor;
-template<typename Scalar_, typename Dimensions, int Options_ = 0, typename IndexType = DenseIndex> class TensorFixedSize;
-template<typename PlainObjectType> class TensorRef;
-template<typename Derived, int AccessLevel> class TensorBase;
+template <typename NullaryOp, typename PlainObjectType>
+class TensorCwiseNullaryOp;
+template <typename UnaryOp, typename XprType>
+class TensorCwiseUnaryOp;
+template <typename BinaryOp, typename LeftXprType, typename RightXprType>
+class TensorCwiseBinaryOp;
+template <typename TernaryOp, typename Arg1XprType, typename Arg2XprType, typename Arg3XprType>
+class TensorCwiseTernaryOp;
+template <typename IfXprType, typename ThenXprType, typename ElseXprType>
+class TensorSelectOp;
+template <typename Op, typename Dims, typename XprType, template <class> class MakePointer_ = MakePointer>
+class TensorReductionOp;
+template <typename XprType>
+class TensorIndexPairOp;
+template <typename ReduceOp, typename Dims, typename XprType>
+class TensorPairReducerOp;
+template <typename Axis, typename LeftXprType, typename RightXprType>
+class TensorConcatenationOp;
+template <typename Dimensions, typename LeftXprType, typename RightXprType, typename OutputKernelType>
+class TensorContractionOp;
+template <typename TargetType, typename XprType>
+class TensorConversionOp;
+template <typename Dimensions, typename InputXprType, typename KernelXprType>
+class TensorConvolutionOp;
+template <typename FFT, typename XprType, int FFTDataType, int FFTDirection>
+class TensorFFTOp;
+template <typename PatchDim, typename XprType>
+class TensorPatchOp;
+template <DenseIndex Rows, DenseIndex Cols, typename XprType>
+class TensorImagePatchOp;
+template <DenseIndex Planes, DenseIndex Rows, DenseIndex Cols, typename XprType>
+class TensorVolumePatchOp;
+template <typename Broadcast, typename XprType>
+class TensorBroadcastingOp;
+template <DenseIndex DimId, typename XprType>
+class TensorChippingOp;
+template <typename NewDimensions, typename XprType>
+class TensorReshapingOp;
+template <typename XprType>
+class TensorLayoutSwapOp;
+template <typename StartIndices, typename Sizes, typename XprType>
+class TensorSlicingOp;
+template <typename ReverseDimensions, typename XprType>
+class TensorReverseOp;
+template <typename PaddingDimensions, typename XprType>
+class TensorPaddingOp;
+template <typename Shuffle, typename XprType>
+class TensorShufflingOp;
+template <typename Strides, typename XprType>
+class TensorStridingOp;
+template <typename StartIndices, typename StopIndices, typename Strides, typename XprType>
+class TensorStridingSlicingOp;
+template <typename Strides, typename XprType>
+class TensorInflationOp;
+template <typename Generator, typename XprType>
+class TensorGeneratorOp;
+template <typename LeftXprType, typename RightXprType>
+class TensorAssignOp;
+template <typename Op, typename XprType>
+class TensorScanOp;
+template <typename Dims, typename XprType>
+class TensorTraceOp;
 
-template<typename NullaryOp, typename PlainObjectType> class TensorCwiseNullaryOp;
-template<typename UnaryOp, typename XprType> class TensorCwiseUnaryOp;
-template<typename BinaryOp, typename LeftXprType, typename RightXprType> class TensorCwiseBinaryOp;
-template<typename TernaryOp, typename Arg1XprType, typename Arg2XprType, typename Arg3XprType> class TensorCwiseTernaryOp;
-template<typename IfXprType, typename ThenXprType, typename ElseXprType> class TensorSelectOp;
-template<typename Op, typename Dims, typename XprType, template <class> class MakePointer_ = MakePointer > class TensorReductionOp;
-template<typename XprType> class TensorIndexPairOp;
-template<typename ReduceOp, typename Dims, typename XprType> class TensorPairReducerOp;
-template<typename Axis, typename LeftXprType, typename RightXprType> class TensorConcatenationOp;
-template<typename Dimensions, typename LeftXprType, typename RightXprType, typename OutputKernelType> class TensorContractionOp;
-template<typename TargetType, typename XprType> class TensorConversionOp;
-template<typename Dimensions, typename InputXprType, typename KernelXprType> class TensorConvolutionOp;
-template<typename FFT, typename XprType, int FFTDataType, int FFTDirection> class TensorFFTOp;
-template<typename PatchDim, typename XprType> class TensorPatchOp;
-template<DenseIndex Rows, DenseIndex Cols, typename XprType> class TensorImagePatchOp;
-template<DenseIndex Planes, DenseIndex Rows, DenseIndex Cols, typename XprType> class TensorVolumePatchOp;
-template<typename Broadcast, typename XprType> class TensorBroadcastingOp;
-template<DenseIndex DimId, typename XprType> class TensorChippingOp;
-template<typename NewDimensions, typename XprType> class TensorReshapingOp;
-template<typename XprType> class TensorLayoutSwapOp;
-template<typename StartIndices, typename Sizes, typename XprType> class TensorSlicingOp;
-template<typename ReverseDimensions, typename XprType> class TensorReverseOp;
-template<typename PaddingDimensions, typename XprType> class TensorPaddingOp;
-template<typename Shuffle, typename XprType> class TensorShufflingOp;
-template<typename Strides, typename XprType> class TensorStridingOp;
-template<typename StartIndices, typename StopIndices, typename Strides, typename XprType> class TensorStridingSlicingOp;
-template<typename Strides, typename XprType> class TensorInflationOp;
-template<typename Generator, typename XprType> class TensorGeneratorOp;
-template<typename LeftXprType, typename RightXprType> class TensorAssignOp;
-template<typename Op, typename XprType> class TensorScanOp;
-template<typename Dims, typename XprType> class TensorTraceOp;
+template <typename CustomUnaryFunc, typename XprType>
+class TensorCustomUnaryOp;
+template <typename CustomBinaryFunc, typename LhsXprType, typename RhsXprType>
+class TensorCustomBinaryOp;
 
-template<typename CustomUnaryFunc, typename XprType> class TensorCustomUnaryOp;
-template<typename CustomBinaryFunc, typename LhsXprType, typename RhsXprType> class TensorCustomBinaryOp;
+template <typename XprType, template <class> class MakePointer_ = MakePointer>
+class TensorEvalToOp;
+template <typename XprType>
+class TensorForcedEvalOp;
 
-template<typename XprType, template <class> class MakePointer_ = MakePointer> class TensorEvalToOp;
-template<typename XprType> class TensorForcedEvalOp;
-
-template<typename ExpressionType, typename DeviceType> class TensorDevice;
-template<typename ExpressionType, typename DeviceType, typename DoneCallback> class TensorAsyncDevice;
-template<typename Derived, typename Device> struct TensorEvaluator;
+template <typename ExpressionType, typename DeviceType>
+class TensorDevice;
+template <typename ExpressionType, typename DeviceType, typename DoneCallback>
+class TensorAsyncDevice;
+template <typename Derived, typename Device>
+struct TensorEvaluator;
 
 struct NoOpOutputKernel;
 
@@ -109,24 +156,16 @@
 
 #ifdef EIGEN_USE_SYCL
 namespace TensorSycl {
-namespace internal{
-template <typename Evaluator, typename Op> class GenericNondeterministicReducer;
+namespace internal {
+template <typename Evaluator, typename Op>
+class GenericNondeterministicReducer;
 }
-}
+}  // namespace TensorSycl
 #endif
 
+enum FFTResultType { RealPart = 0, ImagPart = 1, BothParts = 2 };
 
-enum FFTResultType {
-  RealPart = 0,
-  ImagPart = 1,
-  BothParts = 2
-};
-
-enum FFTDirection {
-    FFT_FORWARD = 0,
-    FFT_REVERSE = 1
-};
-
+enum FFTDirection { FFT_FORWARD = 0, FFT_REVERSE = 1 };
 
 namespace internal {
 
@@ -137,14 +176,14 @@
 
 template <typename Expression>
 struct IsVectorizable<GpuDevice, Expression> {
-  static const bool value = TensorEvaluator<Expression, GpuDevice>::PacketAccess &&
-                            TensorEvaluator<Expression, GpuDevice>::IsAligned;
+  static const bool value =
+      TensorEvaluator<Expression, GpuDevice>::PacketAccess && TensorEvaluator<Expression, GpuDevice>::IsAligned;
 };
 
 // Tiled evaluation strategy.
 enum TiledEvaluation {
-  Off = 0,    // tiled evaluation is not supported
-  On = 1,     // still work in progress (see TensorBlock.h)
+  Off = 0,  // tiled evaluation is not supported
+  On = 1,   // still work in progress (see TensorBlock.h)
 };
 
 template <typename Device, typename Expression>
@@ -153,15 +192,12 @@
   // least one sub-expression has much faster block evaluation, e.g.
   // broadcasting).
   static constexpr bool BlockAccess =
-      TensorEvaluator<Expression, Device>::BlockAccess &&
-      TensorEvaluator<Expression, Device>::PreferBlockAccess;
+      TensorEvaluator<Expression, Device>::BlockAccess && TensorEvaluator<Expression, Device>::PreferBlockAccess;
 
-  static const TiledEvaluation value =
-      BlockAccess ? TiledEvaluation::On : TiledEvaluation::Off;
+  static const TiledEvaluation value = BlockAccess ? TiledEvaluation::On : TiledEvaluation::Off;
 };
 
-template <typename Expression, typename Device,
-          bool Vectorizable      = IsVectorizable<Device, Expression>::value,
+template <typename Expression, typename Device, bool Vectorizable = IsVectorizable<Device, Expression>::value,
           TiledEvaluation Tiling = IsTileable<Device, Expression>::value>
 class TensorExecutor;
 
@@ -170,9 +206,8 @@
           TiledEvaluation Tiling = IsTileable<Device, Expression>::value>
 class TensorAsyncExecutor;
 
-
 }  // end namespace internal
 
 }  // end namespace Eigen
 
-#endif // EIGEN_CXX11_TENSOR_TENSOR_FORWARD_DECLARATIONS_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_FORWARD_DECLARATIONS_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorFunctors.h b/unsupported/Eigen/CXX11/src/Tensor/TensorFunctors.h
index a819e7d..7a87594 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorFunctors.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorFunctors.h
@@ -16,58 +16,54 @@
 namespace Eigen {
 namespace internal {
 
-
 /** \internal
  * \brief Template functor to compute the modulo between an array and a scalar.
  */
 template <typename Scalar>
 struct scalar_mod_op {
   EIGEN_DEVICE_FUNC scalar_mod_op(const Scalar& divisor) : m_divisor(divisor) {}
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator() (const Scalar& a) const { return a % m_divisor; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a) const { return a % m_divisor; }
   const Scalar m_divisor;
 };
 template <typename Scalar>
-struct functor_traits<scalar_mod_op<Scalar> >
-{ enum { Cost = scalar_div_cost<Scalar,false>::value, PacketAccess = false }; };
-
+struct functor_traits<scalar_mod_op<Scalar> > {
+  enum { Cost = scalar_div_cost<Scalar, false>::value, PacketAccess = false };
+};
 
 /** \internal
  * \brief Template functor to compute the modulo between 2 arrays.
  */
 template <typename Scalar>
 struct scalar_mod2_op {
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator() (const Scalar& a, const Scalar& b) const { return a % b; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a, const Scalar& b) const { return a % b; }
 };
 template <typename Scalar>
-struct functor_traits<scalar_mod2_op<Scalar> >
-{ enum { Cost = scalar_div_cost<Scalar,false>::value, PacketAccess = false }; };
+struct functor_traits<scalar_mod2_op<Scalar> > {
+  enum { Cost = scalar_div_cost<Scalar, false>::value, PacketAccess = false };
+};
 
 template <typename Scalar>
 struct scalar_fmod_op {
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar
-  operator()(const Scalar& a, const Scalar& b) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a, const Scalar& b) const {
     return numext::fmod(a, b);
   }
 };
 template <typename Scalar>
 struct functor_traits<scalar_fmod_op<Scalar> > {
-  enum { Cost = 13,  // Reciprocal throughput of FPREM on Haswell.
-         PacketAccess = false };
-};
-
-template<typename Reducer, typename Device>
-struct reducer_traits {
   enum {
-    Cost = 1,
-    PacketAccess = false,
-    IsStateful = false,
-    IsExactlyAssociative = true
+    Cost = 13,  // Reciprocal throughput of FPREM on Haswell.
+    PacketAccess = false
   };
 };
 
+template <typename Reducer, typename Device>
+struct reducer_traits {
+  enum { Cost = 1, PacketAccess = false, IsStateful = false, IsExactlyAssociative = true };
+};
+
 // Standard reduction functors
-template <typename T> struct SumReducer
-{
+template <typename T>
+struct SumReducer {
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T* accum) const {
     internal::scalar_sum_op<T> sum_op;
     *accum = sum_op(*accum, t);
@@ -85,9 +81,7 @@
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet initializePacket() const {
     return pset1<Packet>(initialize());
   }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T accum) const {
-    return accum;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T accum) const { return accum; }
   template <typename Packet>
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet finalizePacket(const Packet& vaccum) const {
     return vaccum;
@@ -109,10 +103,9 @@
   };
 };
 
-template <typename T> struct MeanReducer
-{
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  MeanReducer() : scalarCount_(0), packetCount_(0) { }
+template <typename T>
+struct MeanReducer {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE MeanReducer() : scalarCount_(0), packetCount_(0) {}
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T* accum) {
     internal::scalar_sum_op<T> sum_op;
@@ -145,56 +138,43 @@
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalizeBoth(const T saccum, const Packet& vaccum) const {
     internal::scalar_sum_op<T> sum_op;
     internal::scalar_quotient_op<T> quotient_op;
-    return quotient_op(
-        sum_op(saccum, predux(vaccum)),
-        T(scalarCount_ + packetCount_ * unpacket_traits<Packet>::size));
+    return quotient_op(sum_op(saccum, predux(vaccum)), T(scalarCount_ + packetCount_ * unpacket_traits<Packet>::size));
   }
 
-  protected:
-    DenseIndex scalarCount_;
-    DenseIndex packetCount_;
+ protected:
+  DenseIndex scalarCount_;
+  DenseIndex packetCount_;
 };
 
 template <typename T, typename Device>
 struct reducer_traits<MeanReducer<T>, Device> {
   enum {
     Cost = NumTraits<T>::AddCost,
-    PacketAccess = PacketType<T, Device>::HasAdd &&
-                   PacketType<T, Device>::HasDiv && !NumTraits<T>::IsInteger,
+    PacketAccess = PacketType<T, Device>::HasAdd && PacketType<T, Device>::HasDiv && !NumTraits<T>::IsInteger,
     IsStateful = true,
     IsExactlyAssociative = NumTraits<T>::IsInteger
   };
 };
 
-
 template <typename T, bool IsMax = true, bool IsInteger = true>
 struct MinMaxBottomValue {
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T bottom_value() {
-    return Eigen::NumTraits<T>::lowest();
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T bottom_value() { return Eigen::NumTraits<T>::lowest(); }
 };
 template <typename T>
 struct MinMaxBottomValue<T, true, false> {
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T bottom_value() {
-    return -Eigen::NumTraits<T>::infinity();
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T bottom_value() { return -Eigen::NumTraits<T>::infinity(); }
 };
 template <typename T>
 struct MinMaxBottomValue<T, false, true> {
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T bottom_value() {
-    return Eigen::NumTraits<T>::highest();
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T bottom_value() { return Eigen::NumTraits<T>::highest(); }
 };
 template <typename T>
 struct MinMaxBottomValue<T, false, false> {
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T bottom_value() {
-    return Eigen::NumTraits<T>::infinity();
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T bottom_value() { return Eigen::NumTraits<T>::infinity(); }
 };
 
-
-template <typename T, int NaNPropagation=PropagateFast> struct MaxReducer
-{
+template <typename T, int NaNPropagation = PropagateFast>
+struct MaxReducer {
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T* accum) const {
     scalar_max_op<T, T, NaNPropagation> op;
     *accum = op(t, *accum);
@@ -211,9 +191,7 @@
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet initializePacket() const {
     return pset1<Packet>(initialize());
   }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T accum) const {
-    return accum;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T accum) const { return accum; }
   template <typename Packet>
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet finalizePacket(const Packet& vaccum) const {
     return vaccum;
@@ -226,17 +204,17 @@
 };
 
 template <typename T, typename Device, int NaNPropagation>
-    struct reducer_traits<MaxReducer<T, NaNPropagation>, Device> {
+struct reducer_traits<MaxReducer<T, NaNPropagation>, Device> {
   enum {
     Cost = NumTraits<T>::AddCost,
     PacketAccess = PacketType<T, Device>::HasMax,
     IsStateful = false,
-    IsExactlyAssociative = (NaNPropagation!=PropagateFast)
+    IsExactlyAssociative = (NaNPropagation != PropagateFast)
   };
 };
 
-template <typename T, int NaNPropagation=PropagateFast> struct MinReducer
-{
+template <typename T, int NaNPropagation = PropagateFast>
+struct MinReducer {
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T* accum) const {
     scalar_min_op<T, T, NaNPropagation> op;
     *accum = op(t, *accum);
@@ -253,9 +231,7 @@
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet initializePacket() const {
     return pset1<Packet>(initialize());
   }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T accum) const {
-    return accum;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T accum) const { return accum; }
   template <typename Packet>
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet finalizePacket(const Packet& vaccum) const {
     return vaccum;
@@ -268,17 +244,17 @@
 };
 
 template <typename T, typename Device, int NaNPropagation>
-    struct reducer_traits<MinReducer<T, NaNPropagation>, Device> {
+struct reducer_traits<MinReducer<T, NaNPropagation>, Device> {
   enum {
     Cost = NumTraits<T>::AddCost,
     PacketAccess = PacketType<T, Device>::HasMin,
     IsStateful = false,
-    IsExactlyAssociative = (NaNPropagation!=PropagateFast)
+    IsExactlyAssociative = (NaNPropagation != PropagateFast)
   };
 };
 
-template <typename T> struct ProdReducer
-{
+template <typename T>
+struct ProdReducer {
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T* accum) const {
     internal::scalar_product_op<T> prod_op;
     (*accum) = prod_op(*accum, t);
@@ -295,9 +271,7 @@
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet initializePacket() const {
     return pset1<Packet>(initialize());
   }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T accum) const {
-    return accum;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T accum) const { return accum; }
   template <typename Packet>
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet finalizePacket(const Packet& vaccum) const {
     return vaccum;
@@ -319,85 +293,52 @@
   };
 };
 
-
-struct AndReducer
-{
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(bool t, bool* accum) const {
-    *accum = *accum && t;
-  }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool initialize() const {
-    return true;
-  }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool finalize(bool accum) const {
-    return accum;
-  }
+struct AndReducer {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(bool t, bool* accum) const { *accum = *accum && t; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool initialize() const { return true; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool finalize(bool accum) const { return accum; }
 };
 
 template <typename Device>
 struct reducer_traits<AndReducer, Device> {
-  enum {
-    Cost = 1,
-    PacketAccess = false,
-    IsStateful = false,
-    IsExactlyAssociative = true
-  };
+  enum { Cost = 1, PacketAccess = false, IsStateful = false, IsExactlyAssociative = true };
 };
 
-
 struct OrReducer {
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(bool t, bool* accum) const {
-    *accum = *accum || t;
-  }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool initialize() const {
-    return false;
-  }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool finalize(bool accum) const {
-    return accum;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(bool t, bool* accum) const { *accum = *accum || t; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool initialize() const { return false; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool finalize(bool accum) const { return accum; }
 };
 
 template <typename Device>
 struct reducer_traits<OrReducer, Device> {
-  enum {
-    Cost = 1,
-    PacketAccess = false,
-    IsStateful = false,
-    IsExactlyAssociative = true
-  };
+  enum { Cost = 1, PacketAccess = false, IsStateful = false, IsExactlyAssociative = true };
 };
 
 // Argmin/Argmax reducers.  Returns the first occurrence if multiple locations
 // contain the same min/max value.
-template <typename T> struct ArgMaxPairReducer
-{
+template <typename T>
+struct ArgMaxPairReducer {
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T* accum) const {
     if (t.second < accum->second) {
       return;
-    } else if (t.second > accum->second || accum->first > t.first ) {
+    } else if (t.second > accum->second || accum->first > t.first) {
       *accum = t;
     }
   }
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T initialize() const {
     return T(0, NumTraits<typename T::second_type>::lowest());
   }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T& accum) const {
-    return accum;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T& accum) const { return accum; }
 };
 
 template <typename T, typename Device>
 struct reducer_traits<ArgMaxPairReducer<T>, Device> {
-  enum {
-    Cost = NumTraits<T>::AddCost,
-    PacketAccess = false,
-    IsStateful = false,
-    IsExactlyAssociative = true
-  };
+  enum { Cost = NumTraits<T>::AddCost, PacketAccess = false, IsStateful = false, IsExactlyAssociative = true };
 };
 
-
-template <typename T> struct ArgMinPairReducer
-{
+template <typename T>
+struct ArgMinPairReducer {
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T& t, T* accum) const {
     if (t.second > accum->second) {
       return;
@@ -408,31 +349,21 @@
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T initialize() const {
     return T(0, NumTraits<typename T::second_type>::highest());
   }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T& accum) const {
-    return accum;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T finalize(const T& accum) const { return accum; }
 };
 
 template <typename T, typename Device>
 struct reducer_traits<ArgMinPairReducer<T>, Device> {
-  enum {
-    Cost = NumTraits<T>::AddCost,
-    PacketAccess = false,
-    IsStateful = false,
-    IsExactlyAssociative = true
-  };
+  enum { Cost = NumTraits<T>::AddCost, PacketAccess = false, IsStateful = false, IsExactlyAssociative = true };
 };
 
-
 template <typename T, typename Index, size_t NumDims>
 class GaussianGenerator {
  public:
   static constexpr bool PacketAccess = false;
 
-  EIGEN_DEVICE_FUNC GaussianGenerator(const array<T, NumDims>& means,
-                                      const array<T, NumDims>& std_devs)
-      : m_means(means)
-  {
+  EIGEN_DEVICE_FUNC GaussianGenerator(const array<T, NumDims>& means, const array<T, NumDims>& std_devs)
+      : m_means(means) {
     EIGEN_UNROLL_LOOP
     for (size_t i = 0; i < NumDims; ++i) {
       m_two_sigmas[i] = std_devs[i] * std_devs[i] * 2;
@@ -457,8 +388,8 @@
 template <typename T, typename Index, size_t NumDims>
 struct functor_traits<GaussianGenerator<T, Index, NumDims> > {
   enum {
-    Cost = NumDims * (2 * NumTraits<T>::AddCost + NumTraits<T>::MulCost +
-                      functor_traits<scalar_quotient_op<T, T> >::Cost) +
+    Cost = NumDims *
+               (2 * NumTraits<T>::AddCost + NumTraits<T>::MulCost + functor_traits<scalar_quotient_op<T, T> >::Cost) +
            functor_traits<scalar_exp_op<T> >::Cost,
     PacketAccess = GaussianGenerator<T, Index, NumDims>::PacketAccess
   };
@@ -467,23 +398,25 @@
 template <typename Scalar>
 struct scalar_clamp_op {
   EIGEN_DEVICE_FUNC inline scalar_clamp_op(const Scalar& _min, const Scalar& _max) : m_min(_min), m_max(_max) {}
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar
-  operator()(const Scalar& x) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& x) const {
     return numext::mini(numext::maxi(x, m_min), m_max);
   }
   template <typename Packet>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet
-  packetOp(const Packet& x) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& x) const {
     return internal::pmin(internal::pmax(x, pset1<Packet>(m_min)), pset1<Packet>(m_max));
   }
   const Scalar m_min;
   const Scalar m_max;
 };
-template<typename Scalar>
-struct functor_traits<scalar_clamp_op<Scalar> >
-{ enum { Cost = 2 * NumTraits<Scalar>::AddCost, PacketAccess = (packet_traits<Scalar>::HasMin && packet_traits<Scalar>::HasMax)}; };
+template <typename Scalar>
+struct functor_traits<scalar_clamp_op<Scalar> > {
+  enum {
+    Cost = 2 * NumTraits<Scalar>::AddCost,
+    PacketAccess = (packet_traits<Scalar>::HasMin && packet_traits<Scalar>::HasMax)
+  };
+};
 
-} // end namespace internal
-} // end namespace Eigen
+}  // end namespace internal
+}  // end namespace Eigen
 
-#endif // EIGEN_CXX11_TENSOR_TENSOR_FUNCTORS_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_FUNCTORS_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorGenerator.h b/unsupported/Eigen/CXX11/src/Tensor/TensorGenerator.h
index d0689d7..b038eaf 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorGenerator.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorGenerator.h
@@ -16,16 +16,15 @@
 namespace Eigen {
 
 /** \class TensorGeneratorOp
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Tensor generator class.
-  *
-  *
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Tensor generator class.
+ *
+ *
+ */
 namespace internal {
-template<typename Generator, typename XprType>
-struct traits<TensorGeneratorOp<Generator, XprType> > : public traits<XprType>
-{
+template <typename Generator, typename XprType>
+struct traits<TensorGeneratorOp<Generator, XprType> > : public traits<XprType> {
   typedef typename XprType::Scalar Scalar;
   typedef traits<XprType> XprTraits;
   typedef typename XprTraits::StorageKind StorageKind;
@@ -37,26 +36,21 @@
   typedef typename XprTraits::PointerType PointerType;
 };
 
-template<typename Generator, typename XprType>
-struct eval<TensorGeneratorOp<Generator, XprType>, Eigen::Dense>
-{
+template <typename Generator, typename XprType>
+struct eval<TensorGeneratorOp<Generator, XprType>, Eigen::Dense> {
   typedef const TensorGeneratorOp<Generator, XprType>& type;
 };
 
-template<typename Generator, typename XprType>
-struct nested<TensorGeneratorOp<Generator, XprType>, 1, typename eval<TensorGeneratorOp<Generator, XprType> >::type>
-{
+template <typename Generator, typename XprType>
+struct nested<TensorGeneratorOp<Generator, XprType>, 1, typename eval<TensorGeneratorOp<Generator, XprType> >::type> {
   typedef TensorGeneratorOp<Generator, XprType> type;
 };
 
 }  // end namespace internal
 
-
-
-template<typename Generator, typename XprType>
-class TensorGeneratorOp : public TensorBase<TensorGeneratorOp<Generator, XprType>, ReadOnlyAccessors>
-{
-  public:
+template <typename Generator, typename XprType>
+class TensorGeneratorOp : public TensorBase<TensorGeneratorOp<Generator, XprType>, ReadOnlyAccessors> {
+ public:
   typedef typename Eigen::internal::traits<TensorGeneratorOp>::Scalar Scalar;
   typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
   typedef typename XprType::CoeffReturnType CoeffReturnType;
@@ -67,23 +61,18 @@
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorGeneratorOp(const XprType& expr, const Generator& generator)
       : m_xpr(expr), m_generator(generator) {}
 
-    EIGEN_DEVICE_FUNC
-    const Generator& generator() const { return m_generator; }
+  EIGEN_DEVICE_FUNC const Generator& generator() const { return m_generator; }
 
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<typename XprType::Nested>&
-    expression() const { return m_xpr; }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename XprType::Nested>& expression() const { return m_xpr; }
 
-  protected:
-    typename XprType::Nested m_xpr;
-    const Generator m_generator;
+ protected:
+  typename XprType::Nested m_xpr;
+  const Generator m_generator;
 };
 
-
 // Eval as rvalue
-template<typename Generator, typename ArgType, typename Device>
-struct TensorEvaluator<const TensorGeneratorOp<Generator, ArgType>, Device>
-{
+template <typename Generator, typename ArgType, typename Device>
+struct TensorEvaluator<const TensorGeneratorOp<Generator, ArgType>, Device> {
   typedef TensorGeneratorOp<Generator, ArgType> XprType;
   typedef typename XprType::Index Index;
   typedef typename TensorEvaluator<ArgType, Device>::Dimensions Dimensions;
@@ -95,12 +84,12 @@
   typedef typename Storage::Type EvaluatorPointerType;
   static constexpr int Layout = TensorEvaluator<ArgType, Device>::Layout;
   enum {
-    IsAligned         = false,
-    PacketAccess      = (PacketType<CoeffReturnType, Device>::size > 1),
-    BlockAccess       = true,
+    IsAligned = false,
+    PacketAccess = (PacketType<CoeffReturnType, Device>::size > 1),
+    BlockAccess = true,
     PreferBlockAccess = true,
-    CoordAccess       = false,  // to be implemented
-    RawAccess         = false
+    CoordAccess = false,  // to be implemented
+    RawAccess = false
   };
 
   typedef internal::TensorIntDivisor<Index> IndexDivisor;
@@ -109,14 +98,11 @@
   typedef internal::TensorBlockDescriptor<NumDims, Index> TensorBlockDesc;
   typedef internal::TensorBlockScratchAllocator<Device> TensorBlockScratch;
 
-  typedef typename internal::TensorMaterializedBlock<CoeffReturnType, NumDims,
-                                                     Layout, Index>
-      TensorBlock;
+  typedef typename internal::TensorMaterializedBlock<CoeffReturnType, NumDims, Layout, Index> TensorBlock;
   //===--------------------------------------------------------------------===//
 
   EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
-      :  m_device(device), m_generator(op.generator())
-  {
+      : m_device(device), m_generator(op.generator()) {
     TensorEvaluator<ArgType, Device> argImpl(op.expression(), device);
     m_dimensions = argImpl.dimensions();
 
@@ -139,39 +125,32 @@
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; }
 
-  EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType /*data*/) {
-    return true;
-  }
-  EIGEN_STRONG_INLINE void cleanup() {
-  }
+  EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType /*data*/) { return true; }
+  EIGEN_STRONG_INLINE void cleanup() {}
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
     array<Index, NumDims> coords;
     extract_coordinates(index, coords);
     return m_generator(coords);
   }
 
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const
-  {
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const {
     const int packetSize = PacketType<CoeffReturnType, Device>::size;
-    eigen_assert(index+packetSize-1 < dimensions().TotalSize());
+    eigen_assert(index + packetSize - 1 < dimensions().TotalSize());
 
     EIGEN_ALIGN_MAX std::remove_const_t<CoeffReturnType> values[packetSize];
     for (int i = 0; i < packetSize; ++i) {
-      values[i] = coeff(index+i);
+      values[i] = coeff(index + i);
     }
     PacketReturnType rslt = internal::pload<PacketReturnType>(values);
     return rslt;
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  internal::TensorBlockResourceRequirements getResourceRequirements() const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE internal::TensorBlockResourceRequirements getResourceRequirements() const {
     const size_t target_size = m_device.firstLevelCacheSize();
     // TODO(ezhulenev): Generator should have a cost.
-    return internal::TensorBlockResourceRequirements::skewed<Scalar>(
-        target_size);
+    return internal::TensorBlockResourceRequirements::skewed<Scalar>(target_size);
   }
 
   struct BlockIteratorState {
@@ -181,11 +160,9 @@
     Index count;
   };
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock
-  block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
-          bool /*root_of_expr_ast*/ = false) const {
-    static const bool is_col_major =
-        static_cast<int>(Layout) == static_cast<int>(ColMajor);
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
+                                                          bool /*root_of_expr_ast*/ = false) const {
+    static const bool is_col_major = static_cast<int>(Layout) == static_cast<int>(ColMajor);
 
     // Compute spatial coordinates for the first block element.
     array<Index, NumDims> coords;
@@ -208,8 +185,7 @@
     eigen_assert(it[0].stride == 1);
 
     // Prepare storage for the materialized generator result.
-    const typename TensorBlock::Storage block_storage =
-        TensorBlock::prepareStorage(desc, scratch);
+    const typename TensorBlock::Storage block_storage = TensorBlock::prepareStorage(desc, scratch);
 
     CoeffReturnType* block_buffer = block_storage.data();
 
@@ -248,8 +224,7 @@
           break;
         }
         if (i != NumDims - 1) it[i].count = 0;
-        coords[is_col_major ? i : NumDims - 1 - i] =
-            initial_coords[is_col_major ? i : NumDims - 1 - i];
+        coords[is_col_major ? i : NumDims - 1 - i] = initial_coords[is_col_major ? i : NumDims - 1 - i];
         offset -= it[i].span;
       }
     }
@@ -257,19 +232,16 @@
     return block_storage.AsTensorMaterializedBlock();
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost
-  costPerCoeff(bool) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool) const {
     // TODO(rmlarsen): This is just a placeholder. Define interface to make
     // generators return their cost.
-    return TensorOpCost(0, 0, TensorOpCost::AddCost<Scalar>() +
-                                  TensorOpCost::MulCost<Scalar>());
+    return TensorOpCost(0, 0, TensorOpCost::AddCost<Scalar>() + TensorOpCost::MulCost<Scalar>());
   }
 
-  EIGEN_DEVICE_FUNC EvaluatorPointerType  data() const { return NULL; }
+  EIGEN_DEVICE_FUNC EvaluatorPointerType data() const { return NULL; }
 
  protected:
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  void extract_coordinates(Index index, array<Index, NumDims>& coords) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void extract_coordinates(Index index, array<Index, NumDims>& coords) const {
     if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
       for (int i = NumDims - 1; i > 0; --i) {
         const Index idx = index / m_fast_strides[i];
@@ -283,7 +255,7 @@
         index -= idx * m_strides[i];
         coords[i] = idx;
       }
-      coords[NumDims-1] = index;
+      coords[NumDims - 1] = index;
     }
   }
 
@@ -294,6 +266,6 @@
   Generator m_generator;
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_CXX11_TENSOR_TENSOR_GENERATOR_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_GENERATOR_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorGlobalFunctions.h b/unsupported/Eigen/CXX11/src/Tensor/TensorGlobalFunctions.h
index a4697a8..8d330b5 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorGlobalFunctions.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorGlobalFunctions.h
@@ -21,16 +21,13 @@
  *
  */
 template <typename ADerived, typename BDerived, typename XDerived>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const
-    TensorCwiseTernaryOp<internal::scalar_betainc_op<typename XDerived::Scalar>,
-                         const ADerived, const BDerived, const XDerived>
-    betainc(const ADerived& a, const BDerived& b, const XDerived& x) {
-  return TensorCwiseTernaryOp<
-      internal::scalar_betainc_op<typename XDerived::Scalar>, const ADerived,
-      const BDerived, const XDerived>(
-      a, b, x, internal::scalar_betainc_op<typename XDerived::Scalar>());
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const TensorCwiseTernaryOp<internal::scalar_betainc_op<typename XDerived::Scalar>,
+                                                                 const ADerived, const BDerived, const XDerived>
+betainc(const ADerived& a, const BDerived& b, const XDerived& x) {
+  return TensorCwiseTernaryOp<internal::scalar_betainc_op<typename XDerived::Scalar>, const ADerived, const BDerived,
+                              const XDerived>(a, b, x, internal::scalar_betainc_op<typename XDerived::Scalar>());
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_CXX11_TENSOR_TENSOR_GLOBAL_FUNCTIONS_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_GLOBAL_FUNCTIONS_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorGpuHipCudaDefines.h b/unsupported/Eigen/CXX11/src/Tensor/TensorGpuHipCudaDefines.h
index ae79a1d..3073272 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorGpuHipCudaDefines.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorGpuHipCudaDefines.h
@@ -14,11 +14,11 @@
 // Note that we are using EIGEN_USE_HIP here instead of EIGEN_HIPCC...this is by design
 // There is code in the Tensorflow codebase that will define EIGEN_USE_GPU,  but
 // for some reason gets sent to the gcc/host compiler instead of the gpu/nvcc/hipcc compiler
-// When compiling such files, gcc will end up trying to pick up the CUDA headers by 
+// When compiling such files, gcc will end up trying to pick up the CUDA headers by
 // default (see the code within "unsupported/Eigen/CXX11/Tensor" that is guarded by EIGEN_USE_GPU)
 // This will obviously not work when trying to compile tensorflow on a system with no CUDA
 // To work around this issue for HIP systems (and leave the default behaviour intact), the
-// HIP tensorflow build defines EIGEN_USE_HIP when compiling all source files, and 
+// HIP tensorflow build defines EIGEN_USE_HIP when compiling all source files, and
 // "unsupported/Eigen/CXX11/Tensor" has been updated to use HIP header when EIGEN_USE_HIP is
 // defined. In continuation of that requirement, the guard here needs to be EIGEN_USE_HIP as well
 
@@ -96,6 +96,6 @@
 #define gpu_assert(COND) eigen_assert(COND)
 #endif
 
-#endif // gpu_assert
+#endif  // gpu_assert
 
 #endif  // EIGEN_CXX11_TENSOR_GPU_HIP_CUDA_DEFINES_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorGpuHipCudaUndefines.h b/unsupported/Eigen/CXX11/src/Tensor/TensorGpuHipCudaUndefines.h
index e4d4bd5..509bcee 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorGpuHipCudaUndefines.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorGpuHipCudaUndefines.h
@@ -13,7 +13,7 @@
 #ifndef EIGEN_PERMANENTLY_ENABLE_GPU_HIP_CUDA_DEFINES
 
 #undef gpuStream_t
-#undef gpuDeviceProp_t 
+#undef gpuDeviceProp_t
 #undef gpuError_t
 #undef gpuSuccess
 #undef gpuErrorNotReady
@@ -38,8 +38,8 @@
 #undef gpuDeviceSynchronize
 #undef gpuMemcpy
 
-#endif // EIGEN_PERMANENTLY_ENABLE_GPU_HIP_CUDA_DEFINES
+#endif  // EIGEN_PERMANENTLY_ENABLE_GPU_HIP_CUDA_DEFINES
 
 #undef EIGEN_CXX11_TENSOR_GPU_HIP_CUDA_DEFINES_H
 
-#endif // EIGEN_CXX11_TENSOR_GPU_HIP_CUDA_DEFINES_H
+#endif  // EIGEN_CXX11_TENSOR_GPU_HIP_CUDA_DEFINES_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorIO.h b/unsupported/Eigen/CXX11/src/Tensor/TensorIO.h
index 298401f..985e003 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorIO.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorIO.h
@@ -196,8 +196,7 @@
       const IndexType total_size = internal::array_prod(_t.dimensions());
       if (total_size > 0) {
         const IndexType first_dim = Eigen::internal::array_get<0>(_t.dimensions());
-        Map<const Array<Scalar, Dynamic, Dynamic, layout> > matrix(_t.data(), first_dim,
-                                                                   total_size / first_dim);
+        Map<const Array<Scalar, Dynamic, Dynamic, layout>> matrix(_t.data(), first_dim, total_size / first_dim);
         s << matrix;
         return;
       }
@@ -205,13 +204,14 @@
 
     eigen_assert(layout == RowMajor);
     typedef std::conditional_t<is_same<Scalar, char>::value || is_same<Scalar, unsigned char>::value ||
-                             is_same<Scalar, numext::int8_t>::value || is_same<Scalar, numext::uint8_t>::value,
-                          int,
-                          std::conditional_t<is_same<Scalar, std::complex<char> >::value ||
-                                                is_same<Scalar, std::complex<unsigned char> >::value ||
-                                                is_same<Scalar, std::complex<numext::int8_t> >::value ||
-                                                is_same<Scalar, std::complex<numext::uint8_t> >::value,
-                                        std::complex<int>, const Scalar&>> PrintType;
+                                   is_same<Scalar, numext::int8_t>::value || is_same<Scalar, numext::uint8_t>::value,
+                               int,
+                               std::conditional_t<is_same<Scalar, std::complex<char>>::value ||
+                                                      is_same<Scalar, std::complex<unsigned char>>::value ||
+                                                      is_same<Scalar, std::complex<numext::int8_t>>::value ||
+                                                      is_same<Scalar, std::complex<numext::uint8_t>>::value,
+                                                  std::complex<int>, const Scalar&>>
+        PrintType;
 
     const IndexType total_size = array_prod(_t.dimensions());
 
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorImagePatch.h b/unsupported/Eigen/CXX11/src/Tensor/TensorImagePatch.h
index 17f6c26..291301a 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorImagePatch.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorImagePatch.h
@@ -16,24 +16,23 @@
 namespace Eigen {
 
 /** \class TensorImagePatch
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Patch extraction specialized for image processing.
-  * This assumes that the input has a least 3 dimensions ordered as follow:
-  *  1st dimension: channels (of size d)
-  *  2nd dimension: rows (of size r)
-  *  3rd dimension: columns (of size c)
-  *  There can be additional dimensions such as time (for video) or batch (for
-  * bulk processing after the first 3.
-  * Calling the image patch code with patch_rows and patch_cols is equivalent
-  * to calling the regular patch extraction code with parameters d, patch_rows,
-  * patch_cols, and 1 for all the additional dimensions.
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Patch extraction specialized for image processing.
+ * This assumes that the input has a least 3 dimensions ordered as follow:
+ *  1st dimension: channels (of size d)
+ *  2nd dimension: rows (of size r)
+ *  3rd dimension: columns (of size c)
+ *  There can be additional dimensions such as time (for video) or batch (for
+ * bulk processing after the first 3.
+ * Calling the image patch code with patch_rows and patch_cols is equivalent
+ * to calling the regular patch extraction code with parameters d, patch_rows,
+ * patch_cols, and 1 for all the additional dimensions.
+ */
 namespace internal {
 
-template<DenseIndex Rows, DenseIndex Cols, typename XprType>
-struct traits<TensorImagePatchOp<Rows, Cols, XprType> > : public traits<XprType>
-{
+template <DenseIndex Rows, DenseIndex Cols, typename XprType>
+struct traits<TensorImagePatchOp<Rows, Cols, XprType> > : public traits<XprType> {
   typedef std::remove_const_t<typename XprType::Scalar> Scalar;
   typedef traits<XprType> XprTraits;
   typedef typename XprTraits::StorageKind StorageKind;
@@ -45,15 +44,14 @@
   typedef typename XprTraits::PointerType PointerType;
 };
 
-template<DenseIndex Rows, DenseIndex Cols, typename XprType>
-struct eval<TensorImagePatchOp<Rows, Cols, XprType>, Eigen::Dense>
-{
+template <DenseIndex Rows, DenseIndex Cols, typename XprType>
+struct eval<TensorImagePatchOp<Rows, Cols, XprType>, Eigen::Dense> {
   typedef const TensorImagePatchOp<Rows, Cols, XprType>& type;
 };
 
-template<DenseIndex Rows, DenseIndex Cols, typename XprType>
-struct nested<TensorImagePatchOp<Rows, Cols, XprType>, 1, typename eval<TensorImagePatchOp<Rows, Cols, XprType> >::type>
-{
+template <DenseIndex Rows, DenseIndex Cols, typename XprType>
+struct nested<TensorImagePatchOp<Rows, Cols, XprType>, 1,
+              typename eval<TensorImagePatchOp<Rows, Cols, XprType> >::type> {
   typedef TensorImagePatchOp<Rows, Cols, XprType> type;
 };
 
@@ -62,9 +60,9 @@
   typedef typename Self::Index Index;
   typedef typename Self::Scalar Scalar;
   typedef typename Self::Impl Impl;
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void Run(
-      const Self& self, const Index num_coeff_to_copy, const Index dst_index,
-      Scalar* dst_data, const Index src_index) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void Run(const Self& self, const Index num_coeff_to_copy,
+                                                        const Index dst_index, Scalar* dst_data,
+                                                        const Index src_index) {
     const Impl& impl = self.impl();
     for (Index i = 0; i < num_coeff_to_copy; ++i) {
       dst_data[dst_index + i] = impl.coeff(src_index + i);
@@ -78,13 +76,12 @@
   typedef typename Self::Scalar Scalar;
   typedef typename Self::Impl Impl;
   typedef typename packet_traits<Scalar>::type Packet;
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void Run(
-      const Self& self, const Index num_coeff_to_copy, const Index dst_index,
-      Scalar* dst_data, const Index src_index) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void Run(const Self& self, const Index num_coeff_to_copy,
+                                                        const Index dst_index, Scalar* dst_data,
+                                                        const Index src_index) {
     const Impl& impl = self.impl();
     const Index packet_size = internal::unpacket_traits<Packet>::size;
-    const Index vectorized_size =
-        (num_coeff_to_copy / packet_size) * packet_size;
+    const Index vectorized_size = (num_coeff_to_copy / packet_size) * packet_size;
     for (Index i = 0; i < vectorized_size; i += packet_size) {
       Packet p = impl.template packet<Unaligned>(src_index + i);
       internal::pstoret<Scalar, Packet, Unaligned>(dst_data + dst_index + i, p);
@@ -100,16 +97,13 @@
   typedef typename Self::Index Index;
   typedef typename Self::Scalar Scalar;
   typedef typename packet_traits<Scalar>::type Packet;
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void Run(
-      const Index num_coeff_to_pad, const Scalar padding_value,
-      const Index dst_index, Scalar* dst_data) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void Run(const Index num_coeff_to_pad, const Scalar padding_value,
+                                                        const Index dst_index, Scalar* dst_data) {
     const Index packet_size = internal::unpacket_traits<Packet>::size;
     const Packet padded_packet = internal::pset1<Packet>(padding_value);
-    const Index vectorized_size =
-        (num_coeff_to_pad / packet_size) * packet_size;
+    const Index vectorized_size = (num_coeff_to_pad / packet_size) * packet_size;
     for (Index i = 0; i < vectorized_size; i += packet_size) {
-      internal::pstoret<Scalar, Packet, Unaligned>(dst_data + dst_index + i,
-                                                   padded_packet);
+      internal::pstoret<Scalar, Packet, Unaligned>(dst_data + dst_index + i, padded_packet);
     }
     for (Index i = vectorized_size; i < num_coeff_to_pad; ++i) {
       dst_data[dst_index + i] = padding_value;
@@ -119,10 +113,9 @@
 
 }  // end namespace internal
 
-template<DenseIndex Rows, DenseIndex Cols, typename XprType>
-class TensorImagePatchOp : public TensorBase<TensorImagePatchOp<Rows, Cols, XprType>, ReadOnlyAccessors>
-{
-  public:
+template <DenseIndex Rows, DenseIndex Cols, typename XprType>
+class TensorImagePatchOp : public TensorBase<TensorImagePatchOp<Rows, Cols, XprType>, ReadOnlyAccessors> {
+ public:
   typedef typename Eigen::internal::traits<TensorImagePatchOp>::Scalar Scalar;
   typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
   typedef typename XprType::CoeffReturnType CoeffReturnType;
@@ -130,100 +123,101 @@
   typedef typename Eigen::internal::traits<TensorImagePatchOp>::StorageKind StorageKind;
   typedef typename Eigen::internal::traits<TensorImagePatchOp>::Index Index;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorImagePatchOp(const XprType& expr, DenseIndex patch_rows, DenseIndex patch_cols,
-                                                           DenseIndex row_strides, DenseIndex col_strides,
-                                                           DenseIndex in_row_strides, DenseIndex in_col_strides,
-                                                           DenseIndex row_inflate_strides, DenseIndex col_inflate_strides,
-                                                           PaddingType padding_type, Scalar padding_value)
-                                                           : m_xpr(expr), m_patch_rows(patch_rows), m_patch_cols(patch_cols),
-                                                           m_row_strides(row_strides), m_col_strides(col_strides),
-                                                           m_in_row_strides(in_row_strides), m_in_col_strides(in_col_strides),
-                                                           m_row_inflate_strides(row_inflate_strides), m_col_inflate_strides(col_inflate_strides),
-                                                           m_padding_explicit(false), m_padding_top(0), m_padding_bottom(0), m_padding_left(0), m_padding_right(0),
-                                                           m_padding_type(padding_type), m_padding_value(padding_value) {}
-
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorImagePatchOp(const XprType& expr, DenseIndex patch_rows, DenseIndex patch_cols,
-                                                           DenseIndex row_strides, DenseIndex col_strides,
-                                                           DenseIndex in_row_strides, DenseIndex in_col_strides,
-                                                           DenseIndex row_inflate_strides, DenseIndex col_inflate_strides,
-                                                           DenseIndex padding_top, DenseIndex padding_bottom,
-                                                           DenseIndex padding_left, DenseIndex padding_right,
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorImagePatchOp(const XprType& expr, DenseIndex patch_rows,
+                                                           DenseIndex patch_cols, DenseIndex row_strides,
+                                                           DenseIndex col_strides, DenseIndex in_row_strides,
+                                                           DenseIndex in_col_strides, DenseIndex row_inflate_strides,
+                                                           DenseIndex col_inflate_strides, PaddingType padding_type,
                                                            Scalar padding_value)
-                                                           : m_xpr(expr), m_patch_rows(patch_rows), m_patch_cols(patch_cols),
-                                                           m_row_strides(row_strides), m_col_strides(col_strides),
-                                                           m_in_row_strides(in_row_strides), m_in_col_strides(in_col_strides),
-                                                           m_row_inflate_strides(row_inflate_strides), m_col_inflate_strides(col_inflate_strides),
-                                                           m_padding_explicit(true), m_padding_top(padding_top), m_padding_bottom(padding_bottom),
-                                                           m_padding_left(padding_left), m_padding_right(padding_right),
-                                                           m_padding_type(PADDING_VALID), m_padding_value(padding_value) {}
+      : m_xpr(expr),
+        m_patch_rows(patch_rows),
+        m_patch_cols(patch_cols),
+        m_row_strides(row_strides),
+        m_col_strides(col_strides),
+        m_in_row_strides(in_row_strides),
+        m_in_col_strides(in_col_strides),
+        m_row_inflate_strides(row_inflate_strides),
+        m_col_inflate_strides(col_inflate_strides),
+        m_padding_explicit(false),
+        m_padding_top(0),
+        m_padding_bottom(0),
+        m_padding_left(0),
+        m_padding_right(0),
+        m_padding_type(padding_type),
+        m_padding_value(padding_value) {}
 
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorImagePatchOp(const XprType& expr, DenseIndex patch_rows,
+                                                           DenseIndex patch_cols, DenseIndex row_strides,
+                                                           DenseIndex col_strides, DenseIndex in_row_strides,
+                                                           DenseIndex in_col_strides, DenseIndex row_inflate_strides,
+                                                           DenseIndex col_inflate_strides, DenseIndex padding_top,
+                                                           DenseIndex padding_bottom, DenseIndex padding_left,
+                                                           DenseIndex padding_right, Scalar padding_value)
+      : m_xpr(expr),
+        m_patch_rows(patch_rows),
+        m_patch_cols(patch_cols),
+        m_row_strides(row_strides),
+        m_col_strides(col_strides),
+        m_in_row_strides(in_row_strides),
+        m_in_col_strides(in_col_strides),
+        m_row_inflate_strides(row_inflate_strides),
+        m_col_inflate_strides(col_inflate_strides),
+        m_padding_explicit(true),
+        m_padding_top(padding_top),
+        m_padding_bottom(padding_bottom),
+        m_padding_left(padding_left),
+        m_padding_right(padding_right),
+        m_padding_type(PADDING_VALID),
+        m_padding_value(padding_value) {}
 
-    EIGEN_DEVICE_FUNC
-    DenseIndex patch_rows() const { return m_patch_rows; }
-    EIGEN_DEVICE_FUNC
-    DenseIndex patch_cols() const { return m_patch_cols; }
-    EIGEN_DEVICE_FUNC
-    DenseIndex row_strides() const { return m_row_strides; }
-    EIGEN_DEVICE_FUNC
-    DenseIndex col_strides() const { return m_col_strides; }
-    EIGEN_DEVICE_FUNC
-    DenseIndex in_row_strides() const { return m_in_row_strides; }
-    EIGEN_DEVICE_FUNC
-    DenseIndex in_col_strides() const { return m_in_col_strides; }
-    EIGEN_DEVICE_FUNC
-    DenseIndex row_inflate_strides() const { return m_row_inflate_strides; }
-    EIGEN_DEVICE_FUNC
-    DenseIndex col_inflate_strides() const { return m_col_inflate_strides; }
-    EIGEN_DEVICE_FUNC
-    bool padding_explicit() const { return m_padding_explicit; }
-    EIGEN_DEVICE_FUNC
-    DenseIndex padding_top() const { return m_padding_top; }
-    EIGEN_DEVICE_FUNC
-    DenseIndex padding_bottom() const { return m_padding_bottom; }
-    EIGEN_DEVICE_FUNC
-    DenseIndex padding_left() const { return m_padding_left; }
-    EIGEN_DEVICE_FUNC
-    DenseIndex padding_right() const { return m_padding_right; }
-    EIGEN_DEVICE_FUNC
-    PaddingType padding_type() const { return m_padding_type; }
-    EIGEN_DEVICE_FUNC
-    Scalar padding_value() const { return m_padding_value; }
+  EIGEN_DEVICE_FUNC DenseIndex patch_rows() const { return m_patch_rows; }
+  EIGEN_DEVICE_FUNC DenseIndex patch_cols() const { return m_patch_cols; }
+  EIGEN_DEVICE_FUNC DenseIndex row_strides() const { return m_row_strides; }
+  EIGEN_DEVICE_FUNC DenseIndex col_strides() const { return m_col_strides; }
+  EIGEN_DEVICE_FUNC DenseIndex in_row_strides() const { return m_in_row_strides; }
+  EIGEN_DEVICE_FUNC DenseIndex in_col_strides() const { return m_in_col_strides; }
+  EIGEN_DEVICE_FUNC DenseIndex row_inflate_strides() const { return m_row_inflate_strides; }
+  EIGEN_DEVICE_FUNC DenseIndex col_inflate_strides() const { return m_col_inflate_strides; }
+  EIGEN_DEVICE_FUNC bool padding_explicit() const { return m_padding_explicit; }
+  EIGEN_DEVICE_FUNC DenseIndex padding_top() const { return m_padding_top; }
+  EIGEN_DEVICE_FUNC DenseIndex padding_bottom() const { return m_padding_bottom; }
+  EIGEN_DEVICE_FUNC DenseIndex padding_left() const { return m_padding_left; }
+  EIGEN_DEVICE_FUNC DenseIndex padding_right() const { return m_padding_right; }
+  EIGEN_DEVICE_FUNC PaddingType padding_type() const { return m_padding_type; }
+  EIGEN_DEVICE_FUNC Scalar padding_value() const { return m_padding_value; }
 
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<typename XprType::Nested>&
-    expression() const { return m_xpr; }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename XprType::Nested>& expression() const { return m_xpr; }
 
-  protected:
-    typename XprType::Nested m_xpr;
-    const DenseIndex m_patch_rows;
-    const DenseIndex m_patch_cols;
-    const DenseIndex m_row_strides;
-    const DenseIndex m_col_strides;
-    const DenseIndex m_in_row_strides;
-    const DenseIndex m_in_col_strides;
-    const DenseIndex m_row_inflate_strides;
-    const DenseIndex m_col_inflate_strides;
-    const bool m_padding_explicit;
-    const DenseIndex m_padding_top;
-    const DenseIndex m_padding_bottom;
-    const DenseIndex m_padding_left;
-    const DenseIndex m_padding_right;
-    const PaddingType m_padding_type;
-    const Scalar m_padding_value;
+ protected:
+  typename XprType::Nested m_xpr;
+  const DenseIndex m_patch_rows;
+  const DenseIndex m_patch_cols;
+  const DenseIndex m_row_strides;
+  const DenseIndex m_col_strides;
+  const DenseIndex m_in_row_strides;
+  const DenseIndex m_in_col_strides;
+  const DenseIndex m_row_inflate_strides;
+  const DenseIndex m_col_inflate_strides;
+  const bool m_padding_explicit;
+  const DenseIndex m_padding_top;
+  const DenseIndex m_padding_bottom;
+  const DenseIndex m_padding_left;
+  const DenseIndex m_padding_right;
+  const PaddingType m_padding_type;
+  const Scalar m_padding_value;
 };
 
 // Eval as rvalue
-template<DenseIndex Rows, DenseIndex Cols, typename ArgType, typename Device>
-struct TensorEvaluator<const TensorImagePatchOp<Rows, Cols, ArgType>, Device>
-{
+template <DenseIndex Rows, DenseIndex Cols, typename ArgType, typename Device>
+struct TensorEvaluator<const TensorImagePatchOp<Rows, Cols, ArgType>, Device> {
   typedef TensorImagePatchOp<Rows, Cols, ArgType> XprType;
   typedef typename XprType::Index Index;
-  static constexpr int NumInputDims = internal::array_size<typename TensorEvaluator<ArgType, Device>::Dimensions>::value;
+  static constexpr int NumInputDims =
+      internal::array_size<typename TensorEvaluator<ArgType, Device>::Dimensions>::value;
   static constexpr int NumDims = NumInputDims + 1;
   typedef DSizes<Index, NumDims> Dimensions;
   typedef std::remove_const_t<typename XprType::Scalar> Scalar;
-  typedef TensorEvaluator<const TensorImagePatchOp<Rows, Cols, ArgType>,
-                          Device> Self;
+  typedef TensorEvaluator<const TensorImagePatchOp<Rows, Cols, ArgType>, Device> Self;
   typedef TensorEvaluator<ArgType, Device> Impl;
   typedef typename XprType::CoeffReturnType CoeffReturnType;
   typedef typename PacketType<CoeffReturnType, Device>::type PacketReturnType;
@@ -233,21 +227,20 @@
 
   static constexpr int Layout = TensorEvaluator<ArgType, Device>::Layout;
   enum {
-    IsAligned         = false,
-    PacketAccess      = TensorEvaluator<ArgType, Device>::PacketAccess,
-    BlockAccess       = false,
+    IsAligned = false,
+    PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
+    BlockAccess = false,
     PreferBlockAccess = true,
-    CoordAccess       = false,
-    RawAccess         = false
+    CoordAccess = false,
+    RawAccess = false
   };
 
   //===- Tensor block evaluation strategy (see TensorBlock.h) -------------===//
   typedef internal::TensorBlockNotImplemented TensorBlock;
   //===--------------------------------------------------------------------===//
 
-  EIGEN_STRONG_INLINE TensorEvaluator( const XprType& op, const Device& device)
-      : m_device(device), m_impl(op.expression(), device)
-  {
+  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
+      : m_device(device), m_impl(op.expression(), device) {
     EIGEN_STATIC_ASSERT((NumDims >= 4), YOU_MADE_A_PROGRAMMING_MISTAKE);
 
     m_paddingValue = op.padding_value();
@@ -260,9 +253,9 @@
       m_inputRows = input_dims[1];
       m_inputCols = input_dims[2];
     } else {
-      m_inputDepth = input_dims[NumInputDims-1];
-      m_inputRows = input_dims[NumInputDims-2];
-      m_inputCols = input_dims[NumInputDims-3];
+      m_inputDepth = input_dims[NumInputDims - 1];
+      m_inputRows = input_dims[NumInputDims - 2];
+      m_inputCols = input_dims[NumInputDims - 3];
     }
 
     m_row_strides = op.row_strides();
@@ -292,8 +285,10 @@
     m_patch_cols_eff = op.patch_cols() + (op.patch_cols() - 1) * (m_in_col_strides - 1);
 
     if (op.padding_explicit()) {
-      m_outputRows = numext::ceil((m_input_rows_eff + op.padding_top() + op.padding_bottom() - m_patch_rows_eff + 1.f) / static_cast<float>(m_row_strides));
-      m_outputCols = numext::ceil((m_input_cols_eff + op.padding_left() + op.padding_right() - m_patch_cols_eff + 1.f) / static_cast<float>(m_col_strides));
+      m_outputRows = numext::ceil((m_input_rows_eff + op.padding_top() + op.padding_bottom() - m_patch_rows_eff + 1.f) /
+                                  static_cast<float>(m_row_strides));
+      m_outputCols = numext::ceil((m_input_cols_eff + op.padding_left() + op.padding_right() - m_patch_cols_eff + 1.f) /
+                                  static_cast<float>(m_col_strides));
       m_rowPaddingTop = op.padding_top();
       m_colPaddingLeft = op.padding_left();
     } else {
@@ -303,8 +298,10 @@
           m_outputRows = numext::ceil((m_input_rows_eff - m_patch_rows_eff + 1.f) / static_cast<float>(m_row_strides));
           m_outputCols = numext::ceil((m_input_cols_eff - m_patch_cols_eff + 1.f) / static_cast<float>(m_col_strides));
           // Calculate the padding
-          m_rowPaddingTop = numext::maxi<Index>(0, ((m_outputRows - 1) * m_row_strides + m_patch_rows_eff - m_input_rows_eff) / 2);
-          m_colPaddingLeft = numext::maxi<Index>(0, ((m_outputCols - 1) * m_col_strides + m_patch_cols_eff - m_input_cols_eff) / 2);
+          m_rowPaddingTop =
+              numext::maxi<Index>(0, ((m_outputRows - 1) * m_row_strides + m_patch_rows_eff - m_input_rows_eff) / 2);
+          m_colPaddingLeft =
+              numext::maxi<Index>(0, ((m_outputCols - 1) * m_col_strides + m_patch_cols_eff - m_input_cols_eff) / 2);
           break;
         case PADDING_SAME:
           m_outputRows = numext::ceil(m_input_rows_eff / static_cast<float>(m_row_strides));
@@ -319,8 +316,8 @@
           break;
         default:
           eigen_assert(false && "unexpected padding");
-          m_outputCols=0; // silence the uninitialised warning;
-          m_outputRows=0; //// silence the uninitialised warning;
+          m_outputCols = 0;  // silence the uninitialised warning;
+          m_outputRows = 0;  //// silence the uninitialised warning;
       }
     }
     eigen_assert(m_outputRows > 0);
@@ -339,7 +336,7 @@
       m_dimensions[2] = op.patch_cols();
       m_dimensions[3] = m_outputRows * m_outputCols;
       for (int i = 4; i < NumDims; ++i) {
-        m_dimensions[i] = input_dims[i-1];
+        m_dimensions[i] = input_dims[i - 1];
       }
     } else {
       // RowMajor
@@ -348,11 +345,11 @@
       // NumDims-3: patch_cols
       // NumDims-4: number of patches
       // NumDims-5 and beyond: anything else (such as batch).
-      m_dimensions[NumDims-1] = input_dims[NumInputDims-1];
-      m_dimensions[NumDims-2] = op.patch_rows();
-      m_dimensions[NumDims-3] = op.patch_cols();
-      m_dimensions[NumDims-4] = m_outputRows * m_outputCols;
-      for (int i = NumDims-5; i >= 0; --i) {
+      m_dimensions[NumDims - 1] = input_dims[NumInputDims - 1];
+      m_dimensions[NumDims - 2] = op.patch_rows();
+      m_dimensions[NumDims - 3] = op.patch_cols();
+      m_dimensions[NumDims - 4] = m_outputRows * m_outputCols;
+      for (int i = NumDims - 5; i >= 0; --i) {
         m_dimensions[i] = input_dims[i];
       }
     }
@@ -363,9 +360,9 @@
       m_patchStride = m_colStride * m_dimensions[2] * m_dimensions[0];
       m_otherStride = m_patchStride * m_dimensions[3];
     } else {
-      m_colStride = m_dimensions[NumDims-2];
-      m_patchStride = m_colStride * m_dimensions[NumDims-3] * m_dimensions[NumDims-1];
-      m_otherStride = m_patchStride * m_dimensions[NumDims-4];
+      m_colStride = m_dimensions[NumDims - 2];
+      m_patchStride = m_colStride * m_dimensions[NumDims - 3] * m_dimensions[NumDims - 1];
+      m_otherStride = m_patchStride * m_dimensions[NumDims - 4];
     }
 
     // Strides for navigating through the input tensor.
@@ -386,7 +383,7 @@
     if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
       m_fastOutputDepth = internal::TensorIntDivisor<Index>(m_dimensions[0]);
     } else {
-      m_fastOutputDepth = internal::TensorIntDivisor<Index>(m_dimensions[NumDims-1]);
+      m_fastOutputDepth = internal::TensorIntDivisor<Index>(m_dimensions[NumDims - 1]);
     }
   }
 
@@ -399,18 +396,14 @@
 
 #ifdef EIGEN_USE_THREADS
   template <typename EvalSubExprsCallback>
-  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(
-      EvaluatorPointerType, EvalSubExprsCallback done) {
+  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(EvaluatorPointerType, EvalSubExprsCallback done) {
     m_impl.evalSubExprsIfNeededAsync(nullptr, [done](bool) { done(true); });
   }
 #endif  // EIGEN_USE_THREADS
 
-  EIGEN_STRONG_INLINE void cleanup() {
-    m_impl.cleanup();
-  }
+  EIGEN_STRONG_INLINE void cleanup() { m_impl.cleanup(); }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
     // Patch index corresponding to the passed in index.
     const Index patchIndex = index / m_fastPatchStride;
     // Find the offset of the element wrt the location of the first element.
@@ -424,7 +417,8 @@
     const Index colIndex = patch2DIndex / m_fastOutputRows;
     const Index colOffset = patchOffset / m_fastColStride;
     const Index inputCol = colIndex * m_col_strides + colOffset * m_in_col_strides - m_colPaddingLeft;
-    const Index origInputCol = (m_col_inflate_strides == 1) ? inputCol : ((inputCol >= 0) ? (inputCol / m_fastInflateColStride) : 0);
+    const Index origInputCol =
+        (m_col_inflate_strides == 1) ? inputCol : ((inputCol >= 0) ? (inputCol / m_fastInflateColStride) : 0);
     if (inputCol < 0 || inputCol >= m_input_cols_eff ||
         ((m_col_inflate_strides != 1) && (inputCol != origInputCol * m_col_inflate_strides))) {
       return Scalar(m_paddingValue);
@@ -434,7 +428,8 @@
     const Index rowIndex = patch2DIndex - colIndex * m_outputRows;
     const Index rowOffset = patchOffset - colOffset * m_colStride;
     const Index inputRow = rowIndex * m_row_strides + rowOffset * m_in_row_strides - m_rowPaddingTop;
-    const Index origInputRow = (m_row_inflate_strides == 1) ? inputRow : ((inputRow >= 0) ? (inputRow / m_fastInflateRowStride) : 0);
+    const Index origInputRow =
+        (m_row_inflate_strides == 1) ? inputRow : ((inputRow >= 0) ? (inputRow / m_fastInflateRowStride) : 0);
     if (inputRow < 0 || inputRow >= m_input_rows_eff ||
         ((m_row_inflate_strides != 1) && (inputRow != origInputRow * m_row_inflate_strides))) {
       return Scalar(m_paddingValue);
@@ -443,14 +438,14 @@
     const int depth_index = static_cast<int>(Layout) == static_cast<int>(ColMajor) ? 0 : NumDims - 1;
     const Index depth = index - (index / m_fastOutputDepth) * m_dimensions[depth_index];
 
-    const Index inputIndex = depth + origInputRow * m_rowInputStride + origInputCol * m_colInputStride + otherIndex * m_patchInputStride;
+    const Index inputIndex =
+        depth + origInputRow * m_rowInputStride + origInputCol * m_colInputStride + otherIndex * m_patchInputStride;
     return m_impl.coeff(inputIndex);
   }
 
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const
-  {
-    eigen_assert(index+PacketSize-1 < dimensions().TotalSize());
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const {
+    eigen_assert(index + PacketSize - 1 < dimensions().TotalSize());
 
     if (m_in_row_strides != 1 || m_in_col_strides != 1 || m_row_inflate_strides != 1 || m_col_inflate_strides != 1) {
       return packetWithPossibleZero(index);
@@ -468,26 +463,28 @@
     const Index patchOffsets[2] = {(indices[0] - patchIndex * m_patchStride) / m_fastOutputDepth,
                                    (indices[1] - patchIndex * m_patchStride) / m_fastOutputDepth};
 
-    const Index patch2DIndex = (NumDims == 4) ? patchIndex : (indices[0] - otherIndex * m_otherStride) / m_fastPatchStride;
+    const Index patch2DIndex =
+        (NumDims == 4) ? patchIndex : (indices[0] - otherIndex * m_otherStride) / m_fastPatchStride;
     eigen_assert(patch2DIndex == (indices[1] - otherIndex * m_otherStride) / m_fastPatchStride);
 
     const Index colIndex = patch2DIndex / m_fastOutputRows;
     const Index colOffsets[2] = {patchOffsets[0] / m_fastColStride, patchOffsets[1] / m_fastColStride};
 
     // Calculate col indices in the original input tensor.
-    const Index inputCols[2] = {colIndex * m_col_strides + colOffsets[0] -
-      m_colPaddingLeft, colIndex * m_col_strides + colOffsets[1] - m_colPaddingLeft};
+    const Index inputCols[2] = {colIndex * m_col_strides + colOffsets[0] - m_colPaddingLeft,
+                                colIndex * m_col_strides + colOffsets[1] - m_colPaddingLeft};
     if (inputCols[1] < 0 || inputCols[0] >= m_inputCols) {
       return internal::pset1<PacketReturnType>(Scalar(m_paddingValue));
     }
 
     if (inputCols[0] == inputCols[1]) {
       const Index rowIndex = patch2DIndex - colIndex * m_outputRows;
-      const Index rowOffsets[2] = {patchOffsets[0] - colOffsets[0]*m_colStride, patchOffsets[1] - colOffsets[1]*m_colStride};
+      const Index rowOffsets[2] = {patchOffsets[0] - colOffsets[0] * m_colStride,
+                                   patchOffsets[1] - colOffsets[1] * m_colStride};
       eigen_assert(rowOffsets[0] <= rowOffsets[1]);
       // Calculate col indices in the original input tensor.
-      const Index inputRows[2] = {rowIndex * m_row_strides + rowOffsets[0] -
-        m_rowPaddingTop, rowIndex * m_row_strides + rowOffsets[1] - m_rowPaddingTop};
+      const Index inputRows[2] = {rowIndex * m_row_strides + rowOffsets[0] - m_rowPaddingTop,
+                                  rowIndex * m_row_strides + rowOffsets[1] - m_rowPaddingTop};
 
       if (inputRows[1] < 0 || inputRows[0] >= m_inputRows) {
         return internal::pset1<PacketReturnType>(Scalar(m_paddingValue));
@@ -497,7 +494,8 @@
         // no padding
         const int depth_index = static_cast<int>(Layout) == static_cast<int>(ColMajor) ? 0 : NumDims - 1;
         const Index depth = index - (index / m_fastOutputDepth) * m_dimensions[depth_index];
-        const Index inputIndex = depth + inputRows[0] * m_rowInputStride + inputCols[0] * m_colInputStride + otherIndex * m_patchInputStride;
+        const Index inputIndex =
+            depth + inputRows[0] * m_rowInputStride + inputCols[0] * m_colInputStride + otherIndex * m_patchInputStride;
         return m_impl.template packet<Unaligned>(inputIndex);
       }
     }
@@ -519,25 +517,21 @@
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index rowInflateStride() const { return m_row_inflate_strides; }
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index colInflateStride() const { return m_col_inflate_strides; }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost
-  costPerCoeff(bool vectorized) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const {
     // We conservatively estimate the cost for the code path where the computed
     // index is inside the original image and
     // TensorEvaluator<ArgType, Device>::CoordAccess is false.
-    const double compute_cost = 3 * TensorOpCost::DivCost<Index>() +
-                                6 * TensorOpCost::MulCost<Index>() +
-                                8 * TensorOpCost::MulCost<Index>();
-    return m_impl.costPerCoeff(vectorized) +
-           TensorOpCost(0, 0, compute_cost, vectorized, PacketSize);
+    const double compute_cost =
+        3 * TensorOpCost::DivCost<Index>() + 6 * TensorOpCost::MulCost<Index>() + 8 * TensorOpCost::MulCost<Index>();
+    return m_impl.costPerCoeff(vectorized) + TensorOpCost(0, 0, compute_cost, vectorized, PacketSize);
   }
 
  protected:
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packetWithPossibleZero(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packetWithPossibleZero(Index index) const {
     EIGEN_ALIGN_MAX std::remove_const_t<CoeffReturnType> values[PacketSize];
     EIGEN_UNROLL_LOOP
     for (int i = 0; i < PacketSize; ++i) {
-      values[i] = coeff(index+i);
+      values[i] = coeff(index + i);
     }
     PacketReturnType rslt = internal::pload<PacketReturnType>(values);
     return rslt;
@@ -591,7 +585,6 @@
   TensorEvaluator<ArgType, Device> m_impl;
 };
 
+}  // end namespace Eigen
 
-} // end namespace Eigen
-
-#endif // EIGEN_CXX11_TENSOR_TENSOR_IMAGE_PATCH_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_IMAGE_PATCH_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorIndexList.h b/unsupported/Eigen/CXX11/src/Tensor/TensorIndexList.h
index b910059..fe83b26 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorIndexList.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorIndexList.h
@@ -16,32 +16,30 @@
 namespace Eigen {
 
 /** \internal
-  *
-  * \class TensorIndexList
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Set of classes used to encode a set of Tensor dimensions/indices.
-  *
-  * The indices in the list can be known at compile time or at runtime. A mix
-  * of static and dynamic indices can also be provided if needed. The tensor
-  * code will attempt to take advantage of the indices that are known at
-  * compile time to optimize the code it generates.
-  *
-  * This functionality requires a c++11 compliant compiler. If your compiler
-  * is older you need to use arrays of indices instead.
-  *
-  * Several examples are provided in the cxx11_tensor_index_list.cpp file.
-  *
-  * \sa Tensor
-  */
+ *
+ * \class TensorIndexList
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Set of classes used to encode a set of Tensor dimensions/indices.
+ *
+ * The indices in the list can be known at compile time or at runtime. A mix
+ * of static and dynamic indices can also be provided if needed. The tensor
+ * code will attempt to take advantage of the indices that are known at
+ * compile time to optimize the code it generates.
+ *
+ * This functionality requires a c++11 compliant compiler. If your compiler
+ * is older you need to use arrays of indices instead.
+ *
+ * Several examples are provided in the cxx11_tensor_index_list.cpp file.
+ *
+ * \sa Tensor
+ */
 
 template <Index n>
 struct type2index {
   static const Index value = n;
   EIGEN_DEVICE_FUNC constexpr operator Index() const { return n; }
-  EIGEN_DEVICE_FUNC void set(Index val) {
-    eigen_assert(val == n);
-  }
+  EIGEN_DEVICE_FUNC void set(Index val) { eigen_assert(val == n); }
 };
 
 // This can be used with IndexPairList to get compile-time constant pairs,
@@ -51,9 +49,7 @@
   static const Index first = f;
   static const Index second = s;
 
-  constexpr EIGEN_DEVICE_FUNC operator IndexPair<Index>() const {
-    return IndexPair<Index>(f, s);
-  }
+  constexpr EIGEN_DEVICE_FUNC operator IndexPair<Index>() const { return IndexPair<Index>(f, s); }
 
   EIGEN_DEVICE_FUNC void set(const IndexPair<Index>& val) {
     eigen_assert(val.first == f);
@@ -61,17 +57,10 @@
   }
 };
 
-
-template<Index n> struct NumTraits<type2index<n> >
-{
+template <Index n>
+struct NumTraits<type2index<n>> {
   typedef Index Real;
-  enum {
-    IsComplex = 0,
-    RequireInitialization = false,
-    ReadCost = 1,
-    AddCost = 1,
-    MulCost = 1
-  };
+  enum { IsComplex = 0, RequireInitialization = false, ReadCost = 1, AddCost = 1, MulCost = 1 };
 
   EIGEN_DEVICE_FUNC static EIGEN_CONSTEXPR EIGEN_STRONG_INLINE Real epsilon() { return 0; }
   EIGEN_DEVICE_FUNC static EIGEN_CONSTEXPR EIGEN_STRONG_INLINE Real dummy_precision() { return 0; }
@@ -98,54 +87,52 @@
   val.set(new_val);
 }
 
-
 template <typename T>
 struct is_compile_time_constant {
   static constexpr bool value = false;
 };
 
 template <Index idx>
-struct is_compile_time_constant<type2index<idx> > {
+struct is_compile_time_constant<type2index<idx>> {
   static constexpr bool value = true;
 };
 template <Index idx>
-struct is_compile_time_constant<const type2index<idx> > {
+struct is_compile_time_constant<const type2index<idx>> {
   static constexpr bool value = true;
 };
 template <Index idx>
-struct is_compile_time_constant<type2index<idx>& > {
+struct is_compile_time_constant<type2index<idx>&> {
   static constexpr bool value = true;
 };
 template <Index idx>
-struct is_compile_time_constant<const type2index<idx>& > {
+struct is_compile_time_constant<const type2index<idx>&> {
   static constexpr bool value = true;
 };
 
 template <Index f, Index s>
-struct is_compile_time_constant<type2indexpair<f, s> > {
+struct is_compile_time_constant<type2indexpair<f, s>> {
   static constexpr bool value = true;
 };
 template <Index f, Index s>
-struct is_compile_time_constant<const type2indexpair<f, s> > {
+struct is_compile_time_constant<const type2indexpair<f, s>> {
   static constexpr bool value = true;
 };
 template <Index f, Index s>
-struct is_compile_time_constant<type2indexpair<f, s>& > {
+struct is_compile_time_constant<type2indexpair<f, s>&> {
   static constexpr bool value = true;
 };
 template <Index f, Index s>
-struct is_compile_time_constant<const type2indexpair<f, s>& > {
+struct is_compile_time_constant<const type2indexpair<f, s>&> {
   static constexpr bool value = true;
 };
 
-
-template<typename... T>
+template <typename... T>
 struct IndexTuple;
 
-template<typename T, typename... O>
+template <typename T, typename... O>
 struct IndexTuple<T, O...> {
-  EIGEN_DEVICE_FUNC constexpr IndexTuple() : head(), others() { }
-  EIGEN_DEVICE_FUNC constexpr IndexTuple(const T& v, const O... o) : head(v), others(o...) { }
+  EIGEN_DEVICE_FUNC constexpr IndexTuple() : head(), others() {}
+  EIGEN_DEVICE_FUNC constexpr IndexTuple(const T& v, const O... o) : head(v), others(o...) {}
 
   constexpr static int count = 1 + sizeof...(O);
   T head;
@@ -154,112 +141,100 @@
   typedef IndexTuple<O...> Other;
 };
 
-template<typename T>
-  struct IndexTuple<T> {
-  EIGEN_DEVICE_FUNC constexpr IndexTuple() : head() { }
-  EIGEN_DEVICE_FUNC constexpr IndexTuple(const T& v) : head(v) { }
+template <typename T>
+struct IndexTuple<T> {
+  EIGEN_DEVICE_FUNC constexpr IndexTuple() : head() {}
+  EIGEN_DEVICE_FUNC constexpr IndexTuple(const T& v) : head(v) {}
 
   constexpr static int count = 1;
   T head;
   typedef T Head;
 };
 
-
-template<int N, typename... T>
+template <int N, typename... T>
 struct IndexTupleExtractor;
 
-template<int N, typename T, typename... O>
+template <int N, typename T, typename... O>
 struct IndexTupleExtractor<N, T, O...> {
-
-  typedef typename IndexTupleExtractor<N-1, O...>::ValType ValType;
+  typedef typename IndexTupleExtractor<N - 1, O...>::ValType ValType;
 
   EIGEN_DEVICE_FUNC static constexpr ValType& get_val(IndexTuple<T, O...>& val) {
-    return IndexTupleExtractor<N-1, O...>::get_val(val.others);
+    return IndexTupleExtractor<N - 1, O...>::get_val(val.others);
   }
 
   EIGEN_DEVICE_FUNC static constexpr const ValType& get_val(const IndexTuple<T, O...>& val) {
-    return IndexTupleExtractor<N-1, O...>::get_val(val.others);
+    return IndexTupleExtractor<N - 1, O...>::get_val(val.others);
   }
   template <typename V>
   EIGEN_DEVICE_FUNC static void set_val(IndexTuple<T, O...>& val, V& new_val) {
-    IndexTupleExtractor<N-1, O...>::set_val(val.others, new_val);
+    IndexTupleExtractor<N - 1, O...>::set_val(val.others, new_val);
   }
-
 };
 
-template<typename T, typename... O>
-  struct IndexTupleExtractor<0, T, O...> {
-
+template <typename T, typename... O>
+struct IndexTupleExtractor<0, T, O...> {
   typedef T ValType;
 
-  EIGEN_DEVICE_FUNC static constexpr ValType& get_val(IndexTuple<T, O...>& val) {
-    return val.head;
-  }
-  EIGEN_DEVICE_FUNC static constexpr const ValType& get_val(const IndexTuple<T, O...>& val) {
-    return val.head;
-  }
+  EIGEN_DEVICE_FUNC static constexpr ValType& get_val(IndexTuple<T, O...>& val) { return val.head; }
+  EIGEN_DEVICE_FUNC static constexpr const ValType& get_val(const IndexTuple<T, O...>& val) { return val.head; }
   template <typename V>
   EIGEN_DEVICE_FUNC static void set_val(IndexTuple<T, O...>& val, V& new_val) {
     val.head = new_val;
   }
 };
 
-
-
 template <int N, typename T, typename... O>
 EIGEN_DEVICE_FUNC constexpr typename IndexTupleExtractor<N, T, O...>::ValType& array_get(IndexTuple<T, O...>& tuple) {
   return IndexTupleExtractor<N, T, O...>::get_val(tuple);
 }
 template <int N, typename T, typename... O>
-EIGEN_DEVICE_FUNC constexpr const typename IndexTupleExtractor<N, T, O...>::ValType& array_get(const IndexTuple<T, O...>& tuple) {
+EIGEN_DEVICE_FUNC constexpr const typename IndexTupleExtractor<N, T, O...>::ValType& array_get(
+    const IndexTuple<T, O...>& tuple) {
   return IndexTupleExtractor<N, T, O...>::get_val(tuple);
 }
 template <typename T, typename... O>
-  struct array_size<IndexTuple<T, O...> > {
+struct array_size<IndexTuple<T, O...>> {
   static const size_t value = IndexTuple<T, O...>::count;
 };
 template <typename T, typename... O>
-  struct array_size<const IndexTuple<T, O...> > {
+struct array_size<const IndexTuple<T, O...>> {
   static const size_t value = IndexTuple<T, O...>::count;
 };
 
-
-
-
 template <Index Idx, typename ValueT>
 struct tuple_coeff {
   template <typename... T>
   EIGEN_DEVICE_FUNC static constexpr ValueT get(const Index i, const IndexTuple<T...>& t) {
     //    return array_get<Idx>(t) * (i == Idx) + tuple_coeff<Idx-1>::get(i, t) * (i != Idx);
-    return (i == Idx ? array_get<Idx>(t) : tuple_coeff<Idx-1, ValueT>::get(i, t));
+    return (i == Idx ? array_get<Idx>(t) : tuple_coeff<Idx - 1, ValueT>::get(i, t));
   }
   template <typename... T>
   EIGEN_DEVICE_FUNC static void set(const Index i, IndexTuple<T...>& t, const ValueT& value) {
     if (i == Idx) {
       update_value(array_get<Idx>(t), value);
     } else {
-      tuple_coeff<Idx-1, ValueT>::set(i, t, value);
+      tuple_coeff<Idx - 1, ValueT>::set(i, t, value);
     }
   }
 
   template <typename... T>
   EIGEN_DEVICE_FUNC static constexpr bool value_known_statically(const Index i, const IndexTuple<T...>& t) {
     return ((i == Idx) && is_compile_time_constant<typename IndexTupleExtractor<Idx, T...>::ValType>::value) ||
-        tuple_coeff<Idx-1, ValueT>::value_known_statically(i, t);
+           tuple_coeff<Idx - 1, ValueT>::value_known_statically(i, t);
   }
 
   template <typename... T>
   EIGEN_DEVICE_FUNC static constexpr bool values_up_to_known_statically(const IndexTuple<T...>& t) {
     return is_compile_time_constant<typename IndexTupleExtractor<Idx, T...>::ValType>::value &&
-        tuple_coeff<Idx-1, ValueT>::values_up_to_known_statically(t);
+           tuple_coeff<Idx - 1, ValueT>::values_up_to_known_statically(t);
   }
 
   template <typename... T>
   EIGEN_DEVICE_FUNC static constexpr bool values_up_to_statically_known_to_increase(const IndexTuple<T...>& t) {
     return is_compile_time_constant<typename IndexTupleExtractor<Idx, T...>::ValType>::value &&
            is_compile_time_constant<typename IndexTupleExtractor<Idx, T...>::ValType>::value &&
-           array_get<Idx>(t) > array_get<Idx-1>(t) &&
-           tuple_coeff<Idx-1, ValueT>::values_up_to_statically_known_to_increase(t);
+           array_get<Idx>(t) > array_get<Idx - 1>(t) &&
+           tuple_coeff<Idx - 1, ValueT>::values_up_to_statically_known_to_increase(t);
   }
 };
 
@@ -268,11 +243,11 @@
   template <typename... T>
   EIGEN_DEVICE_FUNC static constexpr ValueT get(const Index /*i*/, const IndexTuple<T...>& t) {
     //  eigen_assert (i == 0);  // gcc fails to compile assertions in constexpr
-    return array_get<0>(t)/* * (i == 0)*/;
+    return array_get<0>(t) /* * (i == 0)*/;
   }
   template <typename... T>
   EIGEN_DEVICE_FUNC static void set(const Index i, IndexTuple<T...>& t, const ValueT value) {
-    eigen_assert (i == 0);
+    eigen_assert(i == 0);
     update_value(array_get<0>(t), value);
   }
   template <typename... T>
@@ -292,44 +267,46 @@
 };
 }  // namespace internal
 
-
-
-template<typename FirstType, typename... OtherTypes>
+template <typename FirstType, typename... OtherTypes>
 struct IndexList : internal::IndexTuple<FirstType, OtherTypes...> {
-  EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC constexpr Index operator[] (const Index i) const {
-    return internal::tuple_coeff<internal::array_size<internal::IndexTuple<FirstType, OtherTypes...> >::value-1, Index>::get(i, *this);
+  EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC constexpr Index operator[](const Index i) const {
+    return internal::tuple_coeff<internal::array_size<internal::IndexTuple<FirstType, OtherTypes...>>::value - 1,
+                                 Index>::get(i, *this);
   }
   EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC constexpr Index get(const Index i) const {
-    return internal::tuple_coeff<internal::array_size<internal::IndexTuple<FirstType, OtherTypes...> >::value-1, Index>::get(i, *this);
+    return internal::tuple_coeff<internal::array_size<internal::IndexTuple<FirstType, OtherTypes...>>::value - 1,
+                                 Index>::get(i, *this);
   }
   EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC void set(const Index i, const Index value) {
-    return internal::tuple_coeff<internal::array_size<internal::IndexTuple<FirstType, OtherTypes...> >::value-1, Index>::set(i, *this, value);
+    return internal::tuple_coeff<internal::array_size<internal::IndexTuple<FirstType, OtherTypes...>>::value - 1,
+                                 Index>::set(i, *this, value);
   }
 
-  EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC constexpr std::size_t size() const {
-    return 1 + sizeof...(OtherTypes);
-  };
+  EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC constexpr std::size_t size() const { return 1 + sizeof...(OtherTypes); };
 
-
-  EIGEN_DEVICE_FUNC constexpr IndexList(const internal::IndexTuple<FirstType, OtherTypes...>& other) : internal::IndexTuple<FirstType, OtherTypes...>(other) { }
-  EIGEN_DEVICE_FUNC constexpr IndexList(FirstType& first, OtherTypes... other) : internal::IndexTuple<FirstType, OtherTypes...>(first, other...) { }
-  EIGEN_DEVICE_FUNC constexpr IndexList() : internal::IndexTuple<FirstType, OtherTypes...>() { }
+  EIGEN_DEVICE_FUNC constexpr IndexList(const internal::IndexTuple<FirstType, OtherTypes...>& other)
+      : internal::IndexTuple<FirstType, OtherTypes...>(other) {}
+  EIGEN_DEVICE_FUNC constexpr IndexList(FirstType& first, OtherTypes... other)
+      : internal::IndexTuple<FirstType, OtherTypes...>(first, other...) {}
+  EIGEN_DEVICE_FUNC constexpr IndexList() : internal::IndexTuple<FirstType, OtherTypes...>() {}
 
   EIGEN_DEVICE_FUNC constexpr bool value_known_statically(const Index i) const {
-    return internal::tuple_coeff<internal::array_size<internal::IndexTuple<FirstType, OtherTypes...> >::value-1, Index>::value_known_statically(i, *this);
+    return internal::tuple_coeff<internal::array_size<internal::IndexTuple<FirstType, OtherTypes...>>::value - 1,
+                                 Index>::value_known_statically(i, *this);
   }
   EIGEN_DEVICE_FUNC constexpr bool all_values_known_statically() const {
-    return internal::tuple_coeff<internal::array_size<internal::IndexTuple<FirstType, OtherTypes...> >::value-1, Index>::values_up_to_known_statically(*this);
+    return internal::tuple_coeff<internal::array_size<internal::IndexTuple<FirstType, OtherTypes...>>::value - 1,
+                                 Index>::values_up_to_known_statically(*this);
   }
 
   EIGEN_DEVICE_FUNC constexpr bool values_statically_known_to_increase() const {
-    return internal::tuple_coeff<internal::array_size<internal::IndexTuple<FirstType, OtherTypes...> >::value-1, Index>::values_up_to_statically_known_to_increase(*this);
+    return internal::tuple_coeff<internal::array_size<internal::IndexTuple<FirstType, OtherTypes...>>::value - 1,
+                                 Index>::values_up_to_statically_known_to_increase(*this);
   }
 };
 
 template <typename FirstType, typename... OtherTypes>
-std::ostream& operator<<(std::ostream& os,
-                         const IndexList<FirstType, OtherTypes...>& dims) {
+std::ostream& operator<<(std::ostream& os, const IndexList<FirstType, OtherTypes...>& dims) {
   os << "[";
   for (size_t i = 0; i < 1 + sizeof...(OtherTypes); ++i) {
     if (i > 0) os << ", ";
@@ -339,279 +316,257 @@
   return os;
 }
 
-template<typename FirstType, typename... OtherTypes>
+template <typename FirstType, typename... OtherTypes>
 constexpr IndexList<FirstType, OtherTypes...> make_index_list(FirstType val1, OtherTypes... other_vals) {
   return IndexList<FirstType, OtherTypes...>(val1, other_vals...);
 }
 
-
-template<typename FirstType, typename... OtherTypes>
+template <typename FirstType, typename... OtherTypes>
 struct IndexPairList : internal::IndexTuple<FirstType, OtherTypes...> {
-  EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC constexpr IndexPair<Index> operator[] (const Index i) const {
-    return internal::tuple_coeff<internal::array_size<internal::IndexTuple<FirstType, OtherTypes...> >::value-1, IndexPair<Index>>::get(i, *this);
+  EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC constexpr IndexPair<Index> operator[](const Index i) const {
+    return internal::tuple_coeff<internal::array_size<internal::IndexTuple<FirstType, OtherTypes...>>::value - 1,
+                                 IndexPair<Index>>::get(i, *this);
   }
   EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC void set(const Index i, const IndexPair<Index> value) {
-    return internal::tuple_coeff<internal::array_size<internal::IndexTuple<FirstType, OtherTypes...>>::value-1, IndexPair<Index> >::set(i, *this, value);
+    return internal::tuple_coeff<internal::array_size<internal::IndexTuple<FirstType, OtherTypes...>>::value - 1,
+                                 IndexPair<Index>>::set(i, *this, value);
   }
 
-  EIGEN_DEVICE_FUNC  constexpr IndexPairList(const internal::IndexTuple<FirstType, OtherTypes...>& other) : internal::IndexTuple<FirstType, OtherTypes...>(other) { }
-  EIGEN_DEVICE_FUNC  constexpr IndexPairList() : internal::IndexTuple<FirstType, OtherTypes...>() { }
+  EIGEN_DEVICE_FUNC constexpr IndexPairList(const internal::IndexTuple<FirstType, OtherTypes...>& other)
+      : internal::IndexTuple<FirstType, OtherTypes...>(other) {}
+  EIGEN_DEVICE_FUNC constexpr IndexPairList() : internal::IndexTuple<FirstType, OtherTypes...>() {}
 
   EIGEN_DEVICE_FUNC constexpr bool value_known_statically(const Index i) const {
-    return internal::tuple_coeff<internal::array_size<internal::IndexTuple<FirstType, OtherTypes...> >::value-1, Index>::value_known_statically(i, *this);
+    return internal::tuple_coeff<internal::array_size<internal::IndexTuple<FirstType, OtherTypes...>>::value - 1,
+                                 Index>::value_known_statically(i, *this);
   }
 };
 
 namespace internal {
 
-template<typename FirstType, typename... OtherTypes>
+template <typename FirstType, typename... OtherTypes>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index array_prod(const IndexList<FirstType, OtherTypes...>& sizes) {
   Index result = 1;
   EIGEN_UNROLL_LOOP
-  for (size_t i = 0; i < array_size<IndexList<FirstType, OtherTypes...> >::value; ++i) {
+  for (size_t i = 0; i < array_size<IndexList<FirstType, OtherTypes...>>::value; ++i) {
     result *= sizes[i];
   }
   return result;
 }
 
-template<typename FirstType, typename... OtherTypes> struct array_size<IndexList<FirstType, OtherTypes...> > {
-  static const size_t value = array_size<IndexTuple<FirstType, OtherTypes...> >::value;
+template <typename FirstType, typename... OtherTypes>
+struct array_size<IndexList<FirstType, OtherTypes...>> {
+  static const size_t value = array_size<IndexTuple<FirstType, OtherTypes...>>::value;
 };
-template<typename FirstType, typename... OtherTypes> struct array_size<const IndexList<FirstType, OtherTypes...> > {
-  static const size_t value = array_size<IndexTuple<FirstType, OtherTypes...> >::value;
+template <typename FirstType, typename... OtherTypes>
+struct array_size<const IndexList<FirstType, OtherTypes...>> {
+  static const size_t value = array_size<IndexTuple<FirstType, OtherTypes...>>::value;
 };
 
-template<typename FirstType, typename... OtherTypes> struct array_size<IndexPairList<FirstType, OtherTypes...> > {
+template <typename FirstType, typename... OtherTypes>
+struct array_size<IndexPairList<FirstType, OtherTypes...>> {
   static const size_t value = 1 + sizeof...(OtherTypes);
 };
-template<typename FirstType, typename... OtherTypes> struct array_size<const IndexPairList<FirstType, OtherTypes...> > {
+template <typename FirstType, typename... OtherTypes>
+struct array_size<const IndexPairList<FirstType, OtherTypes...>> {
   static const size_t value = 1 + sizeof...(OtherTypes);
 };
 
-template<Index N, typename FirstType, typename... OtherTypes> EIGEN_DEVICE_FUNC constexpr Index array_get(IndexList<FirstType, OtherTypes...>& a) {
+template <Index N, typename FirstType, typename... OtherTypes>
+EIGEN_DEVICE_FUNC constexpr Index array_get(IndexList<FirstType, OtherTypes...>& a) {
   return IndexTupleExtractor<N, FirstType, OtherTypes...>::get_val(a);
 }
-template<Index N, typename FirstType, typename... OtherTypes> EIGEN_DEVICE_FUNC constexpr Index array_get(const IndexList<FirstType, OtherTypes...>& a) {
+template <Index N, typename FirstType, typename... OtherTypes>
+EIGEN_DEVICE_FUNC constexpr Index array_get(const IndexList<FirstType, OtherTypes...>& a) {
   return IndexTupleExtractor<N, FirstType, OtherTypes...>::get_val(a);
 }
 
 template <typename T>
 struct index_known_statically_impl {
-  EIGEN_DEVICE_FUNC static constexpr bool run(const Index) {
-    return false;
-  }
+  EIGEN_DEVICE_FUNC static constexpr bool run(const Index) { return false; }
 };
 
 template <typename FirstType, typename... OtherTypes>
-struct index_known_statically_impl<IndexList<FirstType, OtherTypes...> > {
+struct index_known_statically_impl<IndexList<FirstType, OtherTypes...>> {
   EIGEN_DEVICE_FUNC static constexpr bool run(const Index i) {
     return IndexList<FirstType, OtherTypes...>().value_known_statically(i);
   }
 };
 
 template <typename FirstType, typename... OtherTypes>
-struct index_known_statically_impl<const IndexList<FirstType, OtherTypes...> > {
+struct index_known_statically_impl<const IndexList<FirstType, OtherTypes...>> {
   EIGEN_DEVICE_FUNC static constexpr bool run(const Index i) {
     return IndexList<FirstType, OtherTypes...>().value_known_statically(i);
   }
 };
 
-
 template <typename T>
 struct all_indices_known_statically_impl {
-  static constexpr bool run() {
-    return false;
-  }
+  static constexpr bool run() { return false; }
 };
 
 template <typename FirstType, typename... OtherTypes>
-struct all_indices_known_statically_impl<IndexList<FirstType, OtherTypes...> > {
+struct all_indices_known_statically_impl<IndexList<FirstType, OtherTypes...>> {
   EIGEN_DEVICE_FUNC static constexpr bool run() {
     return IndexList<FirstType, OtherTypes...>().all_values_known_statically();
   }
 };
 
 template <typename FirstType, typename... OtherTypes>
-struct all_indices_known_statically_impl<const IndexList<FirstType, OtherTypes...> > {
+struct all_indices_known_statically_impl<const IndexList<FirstType, OtherTypes...>> {
   EIGEN_DEVICE_FUNC static constexpr bool run() {
     return IndexList<FirstType, OtherTypes...>().all_values_known_statically();
   }
 };
 
-
 template <typename T>
 struct indices_statically_known_to_increase_impl {
-  EIGEN_DEVICE_FUNC static constexpr bool run() {
-    return false;
-  }
+  EIGEN_DEVICE_FUNC static constexpr bool run() { return false; }
 };
 
 template <typename FirstType, typename... OtherTypes>
-  struct indices_statically_known_to_increase_impl<IndexList<FirstType, OtherTypes...> > {
+struct indices_statically_known_to_increase_impl<IndexList<FirstType, OtherTypes...>> {
   EIGEN_DEVICE_FUNC static constexpr bool run() {
     return Eigen::IndexList<FirstType, OtherTypes...>().values_statically_known_to_increase();
   }
 };
 
 template <typename FirstType, typename... OtherTypes>
-  struct indices_statically_known_to_increase_impl<const IndexList<FirstType, OtherTypes...> > {
+struct indices_statically_known_to_increase_impl<const IndexList<FirstType, OtherTypes...>> {
   EIGEN_DEVICE_FUNC static constexpr bool run() {
     return Eigen::IndexList<FirstType, OtherTypes...>().values_statically_known_to_increase();
   }
 };
 
-
 template <typename Tx>
 struct index_statically_eq_impl {
-  EIGEN_DEVICE_FUNC static constexpr bool run(Index, Index) {
-    return false;
+  EIGEN_DEVICE_FUNC static constexpr bool run(Index, Index) { return false; }
+};
+
+template <typename FirstType, typename... OtherTypes>
+struct index_statically_eq_impl<IndexList<FirstType, OtherTypes...>> {
+  EIGEN_DEVICE_FUNC static constexpr bool run(const Index i, const Index value) {
+    return IndexList<FirstType, OtherTypes...>().value_known_statically(i) &&
+           (IndexList<FirstType, OtherTypes...>().get(i) == value);
   }
 };
 
 template <typename FirstType, typename... OtherTypes>
-struct index_statically_eq_impl<IndexList<FirstType, OtherTypes...> > {
+struct index_statically_eq_impl<const IndexList<FirstType, OtherTypes...>> {
   EIGEN_DEVICE_FUNC static constexpr bool run(const Index i, const Index value) {
     return IndexList<FirstType, OtherTypes...>().value_known_statically(i) &&
-        (IndexList<FirstType, OtherTypes...>().get(i) == value);
+           (IndexList<FirstType, OtherTypes...>().get(i) == value);
   }
 };
 
-template <typename FirstType, typename... OtherTypes>
-struct index_statically_eq_impl<const IndexList<FirstType, OtherTypes...> > {
-  EIGEN_DEVICE_FUNC static constexpr bool run(const Index i, const Index value) {
-    return IndexList<FirstType, OtherTypes...>().value_known_statically(i) &&
-        (IndexList<FirstType, OtherTypes...>().get(i) == value);
-  }
-};
-
-
 template <typename T>
 struct index_statically_ne_impl {
-  EIGEN_DEVICE_FUNC static constexpr bool run(Index, Index) {
-    return false;
+  EIGEN_DEVICE_FUNC static constexpr bool run(Index, Index) { return false; }
+};
+
+template <typename FirstType, typename... OtherTypes>
+struct index_statically_ne_impl<IndexList<FirstType, OtherTypes...>> {
+  EIGEN_DEVICE_FUNC static constexpr bool run(const Index i, const Index value) {
+    return IndexList<FirstType, OtherTypes...>().value_known_statically(i) &&
+           (IndexList<FirstType, OtherTypes...>().get(i) != value);
   }
 };
 
 template <typename FirstType, typename... OtherTypes>
-struct index_statically_ne_impl<IndexList<FirstType, OtherTypes...> > {
+struct index_statically_ne_impl<const IndexList<FirstType, OtherTypes...>> {
   EIGEN_DEVICE_FUNC static constexpr bool run(const Index i, const Index value) {
     return IndexList<FirstType, OtherTypes...>().value_known_statically(i) &&
-        (IndexList<FirstType, OtherTypes...>().get(i) != value);
+           (IndexList<FirstType, OtherTypes...>().get(i) != value);
   }
 };
 
-template <typename FirstType, typename... OtherTypes>
-struct index_statically_ne_impl<const IndexList<FirstType, OtherTypes...> > {
-  EIGEN_DEVICE_FUNC static constexpr bool run(const Index i, const Index value) {
-    return IndexList<FirstType, OtherTypes...>().value_known_statically(i) &&
-        (IndexList<FirstType, OtherTypes...>().get(i) != value);
-  }
-};
-
-
 template <typename T>
 struct index_statically_gt_impl {
-  EIGEN_DEVICE_FUNC static constexpr bool run(Index, Index) {
-    return false;
+  EIGEN_DEVICE_FUNC static constexpr bool run(Index, Index) { return false; }
+};
+
+template <typename FirstType, typename... OtherTypes>
+struct index_statically_gt_impl<IndexList<FirstType, OtherTypes...>> {
+  EIGEN_DEVICE_FUNC static constexpr bool run(const Index i, const Index value) {
+    return IndexList<FirstType, OtherTypes...>().value_known_statically(i) &&
+           (IndexList<FirstType, OtherTypes...>().get(i) > value);
   }
 };
 
 template <typename FirstType, typename... OtherTypes>
-struct index_statically_gt_impl<IndexList<FirstType, OtherTypes...> > {
+struct index_statically_gt_impl<const IndexList<FirstType, OtherTypes...>> {
   EIGEN_DEVICE_FUNC static constexpr bool run(const Index i, const Index value) {
     return IndexList<FirstType, OtherTypes...>().value_known_statically(i) &&
-        (IndexList<FirstType, OtherTypes...>().get(i) > value);
+           (IndexList<FirstType, OtherTypes...>().get(i) > value);
   }
 };
 
-template <typename FirstType, typename... OtherTypes>
-struct index_statically_gt_impl<const IndexList<FirstType, OtherTypes...> > {
-  EIGEN_DEVICE_FUNC static constexpr bool run(const Index i, const Index value) {
-    return IndexList<FirstType, OtherTypes...>().value_known_statically(i) &&
-        (IndexList<FirstType, OtherTypes...>().get(i) > value);
-  }
-};
-
-
-
 template <typename T>
 struct index_statically_lt_impl {
-  EIGEN_DEVICE_FUNC static constexpr bool run(Index, Index) {
-    return false;
+  EIGEN_DEVICE_FUNC static constexpr bool run(Index, Index) { return false; }
+};
+
+template <typename FirstType, typename... OtherTypes>
+struct index_statically_lt_impl<IndexList<FirstType, OtherTypes...>> {
+  EIGEN_DEVICE_FUNC static constexpr bool run(const Index i, const Index value) {
+    return IndexList<FirstType, OtherTypes...>().value_known_statically(i) &&
+           (IndexList<FirstType, OtherTypes...>().get(i) < value);
   }
 };
 
 template <typename FirstType, typename... OtherTypes>
-struct index_statically_lt_impl<IndexList<FirstType, OtherTypes...> > {
+struct index_statically_lt_impl<const IndexList<FirstType, OtherTypes...>> {
   EIGEN_DEVICE_FUNC static constexpr bool run(const Index i, const Index value) {
     return IndexList<FirstType, OtherTypes...>().value_known_statically(i) &&
-        (IndexList<FirstType, OtherTypes...>().get(i) < value);
+           (IndexList<FirstType, OtherTypes...>().get(i) < value);
   }
 };
 
-template <typename FirstType, typename... OtherTypes>
-struct index_statically_lt_impl<const IndexList<FirstType, OtherTypes...> > {
-  EIGEN_DEVICE_FUNC static constexpr bool run(const Index i, const Index value) {
-    return IndexList<FirstType, OtherTypes...>().value_known_statically(i) &&
-        (IndexList<FirstType, OtherTypes...>().get(i) < value);
-  }
-};
-
-
-
 template <typename Tx>
 struct index_pair_first_statically_eq_impl {
-  EIGEN_DEVICE_FUNC static constexpr bool run(Index, Index) {
-    return false;
+  EIGEN_DEVICE_FUNC static constexpr bool run(Index, Index) { return false; }
+};
+
+template <typename FirstType, typename... OtherTypes>
+struct index_pair_first_statically_eq_impl<IndexPairList<FirstType, OtherTypes...>> {
+  EIGEN_DEVICE_FUNC static constexpr bool run(const Index i, const Index value) {
+    return IndexPairList<FirstType, OtherTypes...>().value_known_statically(i) &&
+           (IndexPairList<FirstType, OtherTypes...>().operator[](i).first == value);
   }
 };
 
 template <typename FirstType, typename... OtherTypes>
-struct index_pair_first_statically_eq_impl<IndexPairList<FirstType, OtherTypes...> > {
+struct index_pair_first_statically_eq_impl<const IndexPairList<FirstType, OtherTypes...>> {
   EIGEN_DEVICE_FUNC static constexpr bool run(const Index i, const Index value) {
     return IndexPairList<FirstType, OtherTypes...>().value_known_statically(i) &&
-        (IndexPairList<FirstType, OtherTypes...>().operator[](i).first == value);
+           (IndexPairList<FirstType, OtherTypes...>().operator[](i).first == value);
   }
 };
 
-template <typename FirstType, typename... OtherTypes>
-struct index_pair_first_statically_eq_impl<const IndexPairList<FirstType, OtherTypes...> > {
-  EIGEN_DEVICE_FUNC static constexpr bool run(const Index i, const Index value) {
-    return IndexPairList<FirstType, OtherTypes...>().value_known_statically(i) &&
-        (IndexPairList<FirstType, OtherTypes...>().operator[](i).first == value);
-  }
-};
-
-
-
 template <typename Tx>
 struct index_pair_second_statically_eq_impl {
-  EIGEN_DEVICE_FUNC static constexpr bool run(Index, Index) {
-    return false;
+  EIGEN_DEVICE_FUNC static constexpr bool run(Index, Index) { return false; }
+};
+
+template <typename FirstType, typename... OtherTypes>
+struct index_pair_second_statically_eq_impl<IndexPairList<FirstType, OtherTypes...>> {
+  EIGEN_DEVICE_FUNC static constexpr bool run(const Index i, const Index value) {
+    return IndexPairList<FirstType, OtherTypes...>().value_known_statically(i) &&
+           (IndexPairList<FirstType, OtherTypes...>().operator[](i).second == value);
   }
 };
 
 template <typename FirstType, typename... OtherTypes>
-struct index_pair_second_statically_eq_impl<IndexPairList<FirstType, OtherTypes...> > {
+struct index_pair_second_statically_eq_impl<const IndexPairList<FirstType, OtherTypes...>> {
   EIGEN_DEVICE_FUNC static constexpr bool run(const Index i, const Index value) {
     return IndexPairList<FirstType, OtherTypes...>().value_known_statically(i) &&
-        (IndexPairList<FirstType, OtherTypes...>().operator[](i).second == value);
+           (IndexPairList<FirstType, OtherTypes...>().operator[](i).second == value);
   }
 };
 
-template <typename FirstType, typename... OtherTypes>
-struct index_pair_second_statically_eq_impl<const IndexPairList<FirstType, OtherTypes...> > {
-  EIGEN_DEVICE_FUNC static constexpr bool run(const Index i, const Index value) {
-    return IndexPairList<FirstType, OtherTypes...>().value_known_statically(i) &&
-        (IndexPairList<FirstType, OtherTypes...>().operator[](i).second == value);
-  }
-};
-
-
 }  // end namespace internal
 }  // end namespace Eigen
 
-
 namespace Eigen {
 namespace internal {
 template <typename T>
@@ -662,5 +617,4 @@
 }  // end namespace internal
 }  // end namespace Eigen
 
-
-#endif // EIGEN_CXX11_TENSOR_TENSOR_INDEX_LIST_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_INDEX_LIST_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorInflation.h b/unsupported/Eigen/CXX11/src/Tensor/TensorInflation.h
index 2c9dba9..5b0fca8 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorInflation.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorInflation.h
@@ -16,16 +16,15 @@
 namespace Eigen {
 
 /** \class TensorInflation
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Tensor inflation class.
-  *
-  *
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Tensor inflation class.
+ *
+ *
+ */
 namespace internal {
-template<typename Strides, typename XprType>
-struct traits<TensorInflationOp<Strides, XprType> > : public traits<XprType>
-{
+template <typename Strides, typename XprType>
+struct traits<TensorInflationOp<Strides, XprType> > : public traits<XprType> {
   typedef typename XprType::Scalar Scalar;
   typedef traits<XprType> XprTraits;
   typedef typename XprTraits::StorageKind StorageKind;
@@ -37,24 +36,21 @@
   typedef typename XprTraits::PointerType PointerType;
 };
 
-template<typename Strides, typename XprType>
-struct eval<TensorInflationOp<Strides, XprType>, Eigen::Dense>
-{
+template <typename Strides, typename XprType>
+struct eval<TensorInflationOp<Strides, XprType>, Eigen::Dense> {
   typedef const TensorInflationOp<Strides, XprType>& type;
 };
 
-template<typename Strides, typename XprType>
-struct nested<TensorInflationOp<Strides, XprType>, 1, typename eval<TensorInflationOp<Strides, XprType> >::type>
-{
+template <typename Strides, typename XprType>
+struct nested<TensorInflationOp<Strides, XprType>, 1, typename eval<TensorInflationOp<Strides, XprType> >::type> {
   typedef TensorInflationOp<Strides, XprType> type;
 };
 
 }  // end namespace internal
 
-template<typename Strides, typename XprType>
-class TensorInflationOp : public TensorBase<TensorInflationOp<Strides, XprType>, ReadOnlyAccessors>
-{
-  public:
+template <typename Strides, typename XprType>
+class TensorInflationOp : public TensorBase<TensorInflationOp<Strides, XprType>, ReadOnlyAccessors> {
+ public:
   typedef typename Eigen::internal::traits<TensorInflationOp>::Scalar Scalar;
   typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
   typedef typename XprType::CoeffReturnType CoeffReturnType;
@@ -65,22 +61,18 @@
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorInflationOp(const XprType& expr, const Strides& strides)
       : m_xpr(expr), m_strides(strides) {}
 
-    EIGEN_DEVICE_FUNC
-    const Strides& strides() const { return m_strides; }
+  EIGEN_DEVICE_FUNC const Strides& strides() const { return m_strides; }
 
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<typename XprType::Nested>&
-    expression() const { return m_xpr; }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename XprType::Nested>& expression() const { return m_xpr; }
 
-  protected:
-    typename XprType::Nested m_xpr;
-    const Strides m_strides;
+ protected:
+  typename XprType::Nested m_xpr;
+  const Strides m_strides;
 };
 
 // Eval as rvalue
-template<typename Strides, typename ArgType, typename Device>
-struct TensorEvaluator<const TensorInflationOp<Strides, ArgType>, Device>
-{
+template <typename Strides, typename ArgType, typename Device>
+struct TensorEvaluator<const TensorInflationOp<Strides, ArgType>, Device> {
   typedef TensorInflationOp<Strides, ArgType> XprType;
   typedef typename XprType::Index Index;
   static constexpr int NumDims = internal::array_size<typename TensorEvaluator<ArgType, Device>::Dimensions>::value;
@@ -107,8 +99,7 @@
   //===--------------------------------------------------------------------===//
 
   EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
-      : m_impl(op.expression(), device), m_strides(op.strides())
-  {
+      : m_impl(op.expression(), device), m_strides(op.strides()) {
     m_dimensions = m_impl.dimensions();
     // Expand each dimension to the inflated dimension.
     for (int i = 0; i < NumDims; ++i) {
@@ -125,15 +116,15 @@
       m_outputStrides[0] = 1;
       m_inputStrides[0] = 1;
       for (int i = 1; i < NumDims; ++i) {
-        m_outputStrides[i] = m_outputStrides[i-1] * m_dimensions[i-1];
-        m_inputStrides[i] = m_inputStrides[i-1] * input_dims[i-1];
+        m_outputStrides[i] = m_outputStrides[i - 1] * m_dimensions[i - 1];
+        m_inputStrides[i] = m_inputStrides[i - 1] * input_dims[i - 1];
       }
     } else {  // RowMajor
-      m_outputStrides[NumDims-1] = 1;
-      m_inputStrides[NumDims-1] = 1;
+      m_outputStrides[NumDims - 1] = 1;
+      m_inputStrides[NumDims - 1] = 1;
       for (int i = NumDims - 2; i >= 0; --i) {
-        m_outputStrides[i] = m_outputStrides[i+1] * m_dimensions[i+1];
-        m_inputStrides[i] = m_inputStrides[i+1] * input_dims[i+1];
+        m_outputStrides[i] = m_outputStrides[i + 1] * m_dimensions[i + 1];
+        m_inputStrides[i] = m_inputStrides[i + 1] * input_dims[i + 1];
       }
     }
   }
@@ -144,14 +135,11 @@
     m_impl.evalSubExprsIfNeeded(NULL);
     return true;
   }
-  EIGEN_STRONG_INLINE void cleanup() {
-    m_impl.cleanup();
-  }
+  EIGEN_STRONG_INLINE void cleanup() { m_impl.cleanup(); }
 
   // Computes the input index given the output index. Returns true if the output
   // index doesn't fall into a hole.
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool getInputIndex(Index index, Index* inputIndex) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool getInputIndex(Index index, Index* inputIndex) const {
     eigen_assert(index < dimensions().TotalSize());
     *inputIndex = 0;
     if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
@@ -179,7 +167,7 @@
         *inputIndex += idx / m_strides[i] * m_inputStrides[i];
         index -= idx * m_outputStrides[i];
       }
-      if (index != index / m_fastStrides[NumDims-1] * m_strides[NumDims-1]) {
+      if (index != index / m_fastStrides[NumDims - 1] * m_strides[NumDims - 1]) {
         return false;
       }
       *inputIndex += index / m_strides[NumDims - 1];
@@ -187,44 +175,39 @@
     return true;
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
     Index inputIndex = 0;
     if (getInputIndex(index, &inputIndex)) {
-     return m_impl.coeff(inputIndex);
+      return m_impl.coeff(inputIndex);
     } else {
-     return Scalar(0);
+      return Scalar(0);
     }
   }
 
   // TODO(yangke): optimize this function so that we can detect and produce
   // all-zero packets
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const
-  {
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const {
     EIGEN_STATIC_ASSERT((PacketSize > 1), YOU_MADE_A_PROGRAMMING_MISTAKE)
-    eigen_assert(index+PacketSize-1 < dimensions().TotalSize());
+    eigen_assert(index + PacketSize - 1 < dimensions().TotalSize());
 
     EIGEN_ALIGN_MAX std::remove_const_t<CoeffReturnType> values[PacketSize];
     EIGEN_UNROLL_LOOP
     for (int i = 0; i < PacketSize; ++i) {
-      values[i] = coeff(index+i);
+      values[i] = coeff(index + i);
     }
     PacketReturnType rslt = internal::pload<PacketReturnType>(values);
     return rslt;
   }
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const {
-    const double compute_cost = NumDims * (3 * TensorOpCost::DivCost<Index>() +
-                                           3 * TensorOpCost::MulCost<Index>() +
+    const double compute_cost = NumDims * (3 * TensorOpCost::DivCost<Index>() + 3 * TensorOpCost::MulCost<Index>() +
                                            2 * TensorOpCost::AddCost<Index>());
     const double input_size = m_impl.dimensions().TotalSize();
     const double output_size = m_dimensions.TotalSize();
-    if (output_size == 0)
-      return TensorOpCost();
+    if (output_size == 0) return TensorOpCost();
     return m_impl.costPerCoeff(vectorized) +
-           TensorOpCost(sizeof(CoeffReturnType) * input_size / output_size, 0,
-                        compute_cost, vectorized, PacketSize);
+           TensorOpCost(sizeof(CoeffReturnType) * input_size / output_size, 0, compute_cost, vectorized, PacketSize);
   }
 
   EIGEN_DEVICE_FUNC EvaluatorPointerType data() const { return NULL; }
@@ -238,6 +221,6 @@
   array<internal::TensorIntDivisor<Index>, NumDims> m_fastStrides;
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_CXX11_TENSOR_TENSOR_INFLATION_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_INFLATION_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorInitializer.h b/unsupported/Eigen/CXX11/src/Tensor/TensorInitializer.h
index 72610be..85cf492 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorInitializer.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorInitializer.h
@@ -18,16 +18,15 @@
 namespace Eigen {
 
 /** \class TensorInitializer
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Helper template to initialize Tensors from std::initializer_lists.
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Helper template to initialize Tensors from std::initializer_lists.
+ */
 namespace internal {
 
 template <typename Derived, int N>
 struct Initializer {
-  typedef std::initializer_list<
-    typename Initializer<Derived, N - 1>::InitList> InitList;
+  typedef std::initializer_list<typename Initializer<Derived, N - 1>::InitList> InitList;
 
   static void run(TensorEvaluator<Derived, DefaultDevice>& tensor,
                   Eigen::array<typename traits<Derived>::Index, traits<Derived>::NumDimensions>* indices,
@@ -61,13 +60,11 @@
   typedef typename traits<Derived>::Scalar InitList;
 
   static void run(TensorEvaluator<Derived, DefaultDevice>& tensor,
-                  Eigen::array<typename traits<Derived>::Index, traits<Derived>::NumDimensions>*,
-                  const InitList& v) {
+                  Eigen::array<typename traits<Derived>::Index, traits<Derived>::NumDimensions>*, const InitList& v) {
     tensor.coeffRef(0) = v;
   }
 };
 
-
 template <typename Derived, int N>
 void initialize_tensor(TensorEvaluator<Derived, DefaultDevice>& tensor,
                        const typename Initializer<Derived, traits<Derived>::NumDimensions>::InitList& vals) {
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorIntDiv.h b/unsupported/Eigen/CXX11/src/Tensor/TensorIntDiv.h
index 6af37f6..fdb9759 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorIntDiv.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorIntDiv.h
@@ -10,132 +10,129 @@
 #ifndef EIGEN_CXX11_TENSOR_TENSOR_INTDIV_H
 #define EIGEN_CXX11_TENSOR_TENSOR_INTDIV_H
 
-
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
 namespace Eigen {
 
 /** \internal
-  *
-  * \class TensorIntDiv
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Fast integer division by a constant.
-  *
-  * See the paper from Granlund and Montgomery for explanation.
-  *   (at https://doi.org/10.1145/773473.178249)
-  *
-  * \sa Tensor
-  */
+ *
+ * \class TensorIntDiv
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Fast integer division by a constant.
+ *
+ * See the paper from Granlund and Montgomery for explanation.
+ *   (at https://doi.org/10.1145/773473.178249)
+ *
+ * \sa Tensor
+ */
 
 namespace internal {
 
-  // Note: result is undefined if val == 0
-  template <typename T>
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-  std::enable_if_t<sizeof(T)==4,int> count_leading_zeros(const T val)
-  {
+// Note: result is undefined if val == 0
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE std::enable_if_t<sizeof(T) == 4, int> count_leading_zeros(const T val) {
 #ifdef EIGEN_GPU_COMPILE_PHASE
-    return __clz(val);
+  return __clz(val);
 #elif defined(SYCL_DEVICE_ONLY)
-    return cl::sycl::clz(val);
+  return cl::sycl::clz(val);
 #elif EIGEN_COMP_MSVC
-    unsigned long index;
-    _BitScanReverse(&index, val);
-    return 31 - index;
+  unsigned long index;
+  _BitScanReverse(&index, val);
+  return 31 - index;
 #else
-    EIGEN_STATIC_ASSERT(sizeof(unsigned long long) == 8, YOU_MADE_A_PROGRAMMING_MISTAKE);
-    return __builtin_clz(static_cast<uint32_t>(val));
+  EIGEN_STATIC_ASSERT(sizeof(unsigned long long) == 8, YOU_MADE_A_PROGRAMMING_MISTAKE);
+  return __builtin_clz(static_cast<uint32_t>(val));
 #endif
-  }
+}
 
-  template <typename T>
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-  std::enable_if_t<sizeof(T)==8,int> count_leading_zeros(const T val)
-  {
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE std::enable_if_t<sizeof(T) == 8, int> count_leading_zeros(const T val) {
 #ifdef EIGEN_GPU_COMPILE_PHASE
-    return __clzll(val);
+  return __clzll(val);
 #elif defined(SYCL_DEVICE_ONLY)
-    return static_cast<int>(cl::sycl::clz(val));
+  return static_cast<int>(cl::sycl::clz(val));
 #elif EIGEN_COMP_MSVC && EIGEN_ARCH_x86_64
-    unsigned long index;
-    _BitScanReverse64(&index, val);
-    return 63 - index;
+  unsigned long index;
+  _BitScanReverse64(&index, val);
+  return 63 - index;
 #elif EIGEN_COMP_MSVC
-    // MSVC's _BitScanReverse64 is not available for 32bits builds.
-    unsigned int lo = (unsigned int)(val&0xffffffff);
-    unsigned int hi = (unsigned int)((val>>32)&0xffffffff);
-    int n;
-    if(hi==0)
-      n = 32 + count_leading_zeros<unsigned int>(lo);
-    else
-      n = count_leading_zeros<unsigned int>(hi);
-    return n;
+  // MSVC's _BitScanReverse64 is not available for 32bits builds.
+  unsigned int lo = (unsigned int)(val & 0xffffffff);
+  unsigned int hi = (unsigned int)((val >> 32) & 0xffffffff);
+  int n;
+  if (hi == 0)
+    n = 32 + count_leading_zeros<unsigned int>(lo);
+  else
+    n = count_leading_zeros<unsigned int>(hi);
+  return n;
 #else
-    EIGEN_STATIC_ASSERT(sizeof(unsigned long long) == 8, YOU_MADE_A_PROGRAMMING_MISTAKE);
-    return __builtin_clzll(static_cast<uint64_t>(val));
+  EIGEN_STATIC_ASSERT(sizeof(unsigned long long) == 8, YOU_MADE_A_PROGRAMMING_MISTAKE);
+  return __builtin_clzll(static_cast<uint64_t>(val));
 #endif
-  }
+}
 
-  template <typename T>
-  struct UnsignedTraits {
-    typedef std::conditional_t<sizeof(T) == 8, uint64_t, uint32_t> type;
-  };
+template <typename T>
+struct UnsignedTraits {
+  typedef std::conditional_t<sizeof(T) == 8, uint64_t, uint32_t> type;
+};
 
-  template <typename T>
-  struct DividerTraits {
-    typedef typename UnsignedTraits<T>::type type;
-    static constexpr int N = sizeof(T) * 8;
-  };
+template <typename T>
+struct DividerTraits {
+  typedef typename UnsignedTraits<T>::type type;
+  static constexpr int N = sizeof(T) * 8;
+};
 
-  template <typename T>
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE uint32_t muluh(const uint32_t a, const T b) {
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE uint32_t muluh(const uint32_t a, const T b) {
 #if defined(EIGEN_GPU_COMPILE_PHASE)
-    return __umulhi(a, b);
+  return __umulhi(a, b);
 #elif defined(SYCL_DEVICE_ONLY)
-    return cl::sycl::mul_hi(a, static_cast<uint32_t>(b));
+  return cl::sycl::mul_hi(a, static_cast<uint32_t>(b));
 #else
-    return (static_cast<uint64_t>(a) * b) >> 32;
+  return (static_cast<uint64_t>(a) * b) >> 32;
 #endif
-  }
+}
 
-  template <typename T>
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE uint64_t muluh(const uint64_t a, const T b) {
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE uint64_t muluh(const uint64_t a, const T b) {
 #if defined(EIGEN_GPU_COMPILE_PHASE)
-    return __umul64hi(a, b);
+  return __umul64hi(a, b);
 #elif defined(SYCL_DEVICE_ONLY)
-    return cl::sycl::mul_hi(a, static_cast<uint64_t>(b));
+  return cl::sycl::mul_hi(a, static_cast<uint64_t>(b));
 #elif EIGEN_HAS_BUILTIN_INT128
-    __uint128_t v = static_cast<__uint128_t>(a) * static_cast<__uint128_t>(b);
-    return static_cast<uint64_t>(v >> 64);
+  __uint128_t v = static_cast<__uint128_t>(a) * static_cast<__uint128_t>(b);
+  return static_cast<uint64_t>(v >> 64);
 #else
-    return (TensorUInt128<static_val<0>, uint64_t>(a) * TensorUInt128<static_val<0>, uint64_t>(b)).upper();
+  return (TensorUInt128<static_val<0>, uint64_t>(a) * TensorUInt128<static_val<0>, uint64_t>(b)).upper();
+#endif
+}
+
+template <int N, typename T>
+struct DividerHelper {
+  static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE uint32_t computeMultiplier(const int log_div, const T divider) {
+    EIGEN_STATIC_ASSERT(N == 32, YOU_MADE_A_PROGRAMMING_MISTAKE);
+    return static_cast<uint32_t>((static_cast<uint64_t>(1) << (N + log_div)) / divider -
+                                 (static_cast<uint64_t>(1) << N) + 1);
+  }
+};
+
+template <typename T>
+struct DividerHelper<64, T> {
+  static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE uint64_t computeMultiplier(const int log_div, const T divider) {
+#if EIGEN_HAS_BUILTIN_INT128 && !defined(EIGEN_GPU_COMPILE_PHASE) && !defined(SYCL_DEVICE_ONLY)
+    return static_cast<uint64_t>((static_cast<__uint128_t>(1) << (64 + log_div)) / static_cast<__uint128_t>(divider) -
+                                 (static_cast<__uint128_t>(1) << 64) + 1);
+#else
+    const uint64_t shift = 1ULL << log_div;
+    TensorUInt128<uint64_t, uint64_t> result =
+        TensorUInt128<uint64_t, static_val<0> >(shift, 0) / TensorUInt128<static_val<0>, uint64_t>(divider) -
+        TensorUInt128<static_val<1>, static_val<0> >(1, 0) + TensorUInt128<static_val<0>, static_val<1> >(1);
+    return static_cast<uint64_t>(result);
 #endif
   }
-
-  template <int N, typename T>
-  struct DividerHelper {
-    static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE uint32_t computeMultiplier(const int log_div, const T divider) {
-      EIGEN_STATIC_ASSERT(N == 32, YOU_MADE_A_PROGRAMMING_MISTAKE);
-      return static_cast<uint32_t>((static_cast<uint64_t>(1) << (N+log_div)) / divider - (static_cast<uint64_t>(1) << N) + 1);
-    }
-  };
-
-  template <typename T>
-  struct DividerHelper<64, T> {
-    static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE uint64_t computeMultiplier(const int log_div, const T divider) {
-#if EIGEN_HAS_BUILTIN_INT128 && !defined(EIGEN_GPU_COMPILE_PHASE) && !defined(SYCL_DEVICE_ONLY)
-      return static_cast<uint64_t>((static_cast<__uint128_t>(1) << (64+log_div)) / static_cast<__uint128_t>(divider) - (static_cast<__uint128_t>(1) << 64) + 1);
-#else
-      const uint64_t shift = 1ULL << log_div;
-      TensorUInt128<uint64_t, uint64_t> result = TensorUInt128<uint64_t, static_val<0> >(shift, 0) / TensorUInt128<static_val<0>, uint64_t>(divider)
-                                               - TensorUInt128<static_val<1>, static_val<0> >(1, 0)
-                                               + TensorUInt128<static_val<0>, static_val<1> >(1);
-      return static_cast<uint64_t>(result);
-#endif
-    }
-  };
+};
 
 template <typename T, bool div_gt_one = false>
 struct TensorIntDivisor {
@@ -151,26 +148,27 @@
   // the __uint128_t type.
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorIntDivisor(const T divider) {
     const int N = DividerTraits<T>::N;
-    eigen_assert(static_cast<typename UnsignedTraits<T>::type>(divider) < NumTraits<UnsignedType>::highest()/2);
+    eigen_assert(static_cast<typename UnsignedTraits<T>::type>(divider) < NumTraits<UnsignedType>::highest() / 2);
     eigen_assert(divider > 0);
 
     // fast ln2
     const int leading_zeros = count_leading_zeros(static_cast<UnsignedType>(divider));
     int log_div = N - leading_zeros;
     // if divider is a power of two then log_div is 1 more than it should be.
-    if ((static_cast<typename UnsignedTraits<T>::type>(1) << (log_div-1)) == static_cast<typename UnsignedTraits<T>::type>(divider))
+    if ((static_cast<typename UnsignedTraits<T>::type>(1) << (log_div - 1)) ==
+        static_cast<typename UnsignedTraits<T>::type>(divider))
       log_div--;
 
     multiplier = DividerHelper<N, T>::computeMultiplier(log_div, divider);
     shift1 = log_div > 1 ? 1 : log_div;
-    shift2 = log_div > 1 ? log_div-1 : 0;
+    shift2 = log_div > 1 ? log_div - 1 : 0;
   }
 
   // Must have 0 <= numerator. On platforms that don't support the __uint128_t
   // type numerator should also be less than 2^32-1.
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T divide(const T numerator) const {
-    eigen_assert(static_cast<typename UnsignedTraits<T>::type>(numerator) < NumTraits<UnsignedType>::highest()/2);
-    //eigen_assert(numerator >= 0); // this is implicitly asserted by the line above
+    eigen_assert(static_cast<typename UnsignedTraits<T>::type>(numerator) < NumTraits<UnsignedType>::highest() / 2);
+    // eigen_assert(numerator >= 0); // this is implicitly asserted by the line above
 
     UnsignedType t1 = muluh(multiplier, numerator);
     UnsignedType t = (static_cast<UnsignedType>(numerator) - t1) >> shift1;
@@ -184,7 +182,6 @@
   int32_t shift2;
 };
 
-
 // Optimized version for signed 32 bit integers.
 // Derived from Hacker's Delight.
 // Only works for divisors strictly greater than one
@@ -196,7 +193,7 @@
     shift = 0;
   }
   // Must have 2 <= divider
-  EIGEN_DEVICE_FUNC TensorIntDivisor(int32_t divider)  {
+  EIGEN_DEVICE_FUNC TensorIntDivisor(int32_t divider) {
     eigen_assert(divider >= 2);
     calcMagic(divider);
   }
@@ -212,51 +209,51 @@
 #endif
   }
 
-private:
+ private:
   // Compute the magic numbers. See Hacker's Delight section 10 for an in
   // depth explanation.
   EIGEN_DEVICE_FUNC void calcMagic(int32_t d) {
-   const unsigned two31 = 0x80000000;     // 2**31.
-   unsigned ad = d;
-   unsigned t = two31 + (ad >> 31);
-   unsigned anc = t - 1 - t%ad;     // Absolute value of nc.
-   int p = 31;                      // Init. p.
-   unsigned q1 = two31/anc;         // Init. q1 = 2**p/|nc|.
-   unsigned r1 = two31 - q1*anc;    // Init. r1 = rem(2**p, |nc|).
-   unsigned q2 = two31/ad;          // Init. q2 = 2**p/|d|.
-   unsigned r2 = two31 - q2*ad;     // Init. r2 = rem(2**p, |d|).
-   unsigned delta = 0;
-   do {
+    const unsigned two31 = 0x80000000;  // 2**31.
+    unsigned ad = d;
+    unsigned t = two31 + (ad >> 31);
+    unsigned anc = t - 1 - t % ad;   // Absolute value of nc.
+    int p = 31;                      // Init. p.
+    unsigned q1 = two31 / anc;       // Init. q1 = 2**p/|nc|.
+    unsigned r1 = two31 - q1 * anc;  // Init. r1 = rem(2**p, |nc|).
+    unsigned q2 = two31 / ad;        // Init. q2 = 2**p/|d|.
+    unsigned r2 = two31 - q2 * ad;   // Init. r2 = rem(2**p, |d|).
+    unsigned delta = 0;
+    do {
       p = p + 1;
-      q1 = 2*q1;           // Update q1 = 2**p/|nc|.
-      r1 = 2*r1;           // Update r1 = rem(2**p, |nc|).
-      if (r1 >= anc) {     // (Must be an unsigned
-         q1 = q1 + 1;      // comparison here).
-         r1 = r1 - anc;}
-      q2 = 2*q2;           // Update q2 = 2**p/|d|.
-      r2 = 2*r2;           // Update r2 = rem(2**p, |d|).
-      if (r2 >= ad) {      // (Must be an unsigned
-         q2 = q2 + 1;      // comparison here).
-         r2 = r2 - ad;}
+      q1 = 2 * q1;      // Update q1 = 2**p/|nc|.
+      r1 = 2 * r1;      // Update r1 = rem(2**p, |nc|).
+      if (r1 >= anc) {  // (Must be an unsigned
+        q1 = q1 + 1;    // comparison here).
+        r1 = r1 - anc;
+      }
+      q2 = 2 * q2;     // Update q2 = 2**p/|d|.
+      r2 = 2 * r2;     // Update r2 = rem(2**p, |d|).
+      if (r2 >= ad) {  // (Must be an unsigned
+        q2 = q2 + 1;   // comparison here).
+        r2 = r2 - ad;
+      }
       delta = ad - r2;
-   } while (q1 < delta || (q1 == delta && r1 == 0));
+    } while (q1 < delta || (q1 == delta && r1 == 0));
 
-   magic = (unsigned)(q2 + 1);
-   shift = p - 32;
+    magic = (unsigned)(q2 + 1);
+    shift = p - 32;
   }
 
   uint32_t magic;
   int32_t shift;
 };
 
-
 template <typename T, bool div_gt_one>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T operator / (const T& numerator, const TensorIntDivisor<T, div_gt_one>& divisor) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T operator/(const T& numerator, const TensorIntDivisor<T, div_gt_one>& divisor) {
   return divisor.divide(numerator);
 }
 
+}  // end namespace internal
+}  // end namespace Eigen
 
-} // end namespace internal
-} // end namespace Eigen
-
-#endif // EIGEN_CXX11_TENSOR_TENSOR_INTDIV_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_INTDIV_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorLayoutSwap.h b/unsupported/Eigen/CXX11/src/Tensor/TensorLayoutSwap.h
index ef2768d..43f4bcb 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorLayoutSwap.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorLayoutSwap.h
@@ -16,31 +16,30 @@
 namespace Eigen {
 
 /** \class TensorLayoutSwap
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Swap the layout from col-major to row-major, or row-major
-  * to col-major, and invert the order of the dimensions.
-  *
-  * Beware: the dimensions are reversed by this operation. If you want to
-  * preserve the ordering of the dimensions, you need to combine this
-  * operation with a shuffle.
-  *
-  * \example:
-  * Tensor<float, 2, ColMajor> input(2, 4);
-  * Tensor<float, 2, RowMajor> output = input.swap_layout();
-  * eigen_assert(output.dimension(0) == 4);
-  * eigen_assert(output.dimension(1) == 2);
-  *
-  * array<int, 2> shuffle(1, 0);
-  * output = input.swap_layout().shuffle(shuffle);
-  * eigen_assert(output.dimension(0) == 2);
-  * eigen_assert(output.dimension(1) == 4);
-  *
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Swap the layout from col-major to row-major, or row-major
+ * to col-major, and invert the order of the dimensions.
+ *
+ * Beware: the dimensions are reversed by this operation. If you want to
+ * preserve the ordering of the dimensions, you need to combine this
+ * operation with a shuffle.
+ *
+ * \example:
+ * Tensor<float, 2, ColMajor> input(2, 4);
+ * Tensor<float, 2, RowMajor> output = input.swap_layout();
+ * eigen_assert(output.dimension(0) == 4);
+ * eigen_assert(output.dimension(1) == 2);
+ *
+ * array<int, 2> shuffle(1, 0);
+ * output = input.swap_layout().shuffle(shuffle);
+ * eigen_assert(output.dimension(0) == 2);
+ * eigen_assert(output.dimension(1) == 4);
+ *
+ */
 namespace internal {
-template<typename XprType>
-struct traits<TensorLayoutSwapOp<XprType> > : public traits<XprType>
-{
+template <typename XprType>
+struct traits<TensorLayoutSwapOp<XprType> > : public traits<XprType> {
   typedef typename XprType::Scalar Scalar;
   typedef traits<XprType> XprTraits;
   typedef typename XprTraits::StorageKind StorageKind;
@@ -52,57 +51,48 @@
   typedef typename XprTraits::PointerType PointerType;
 };
 
-template<typename XprType>
-struct eval<TensorLayoutSwapOp<XprType>, Eigen::Dense>
-{
+template <typename XprType>
+struct eval<TensorLayoutSwapOp<XprType>, Eigen::Dense> {
   typedef const TensorLayoutSwapOp<XprType>& type;
 };
 
-template<typename XprType>
-struct nested<TensorLayoutSwapOp<XprType>, 1, typename eval<TensorLayoutSwapOp<XprType> >::type>
-{
+template <typename XprType>
+struct nested<TensorLayoutSwapOp<XprType>, 1, typename eval<TensorLayoutSwapOp<XprType> >::type> {
   typedef TensorLayoutSwapOp<XprType> type;
 };
 
 }  // end namespace internal
 
+template <typename XprType>
+class TensorLayoutSwapOp : public TensorBase<TensorLayoutSwapOp<XprType>, WriteAccessors> {
+ public:
+  typedef TensorBase<TensorLayoutSwapOp<XprType>, WriteAccessors> Base;
+  typedef typename Eigen::internal::traits<TensorLayoutSwapOp>::Scalar Scalar;
+  typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
+  typedef std::remove_const_t<typename XprType::CoeffReturnType> CoeffReturnType;
+  typedef typename Eigen::internal::nested<TensorLayoutSwapOp>::type Nested;
+  typedef typename Eigen::internal::traits<TensorLayoutSwapOp>::StorageKind StorageKind;
+  typedef typename Eigen::internal::traits<TensorLayoutSwapOp>::Index Index;
 
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorLayoutSwapOp(const XprType& expr) : m_xpr(expr) {}
 
-template<typename XprType>
-class TensorLayoutSwapOp : public TensorBase<TensorLayoutSwapOp<XprType>, WriteAccessors>
-{
-  public:
-    typedef TensorBase<TensorLayoutSwapOp<XprType>, WriteAccessors> Base;
-    typedef typename Eigen::internal::traits<TensorLayoutSwapOp>::Scalar Scalar;
-    typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
-    typedef std::remove_const_t<typename XprType::CoeffReturnType> CoeffReturnType;
-    typedef typename Eigen::internal::nested<TensorLayoutSwapOp>::type Nested;
-    typedef typename Eigen::internal::traits<TensorLayoutSwapOp>::StorageKind StorageKind;
-    typedef typename Eigen::internal::traits<TensorLayoutSwapOp>::Index Index;
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename XprType::Nested>& expression() const { return m_xpr; }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorLayoutSwapOp(const XprType& expr)
-        : m_xpr(expr) {}
-
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<typename XprType::Nested>&
-    expression() const { return m_xpr; }
-
-    EIGEN_TENSOR_INHERIT_ASSIGNMENT_OPERATORS(TensorLayoutSwapOp)
-  protected:
-    typename XprType::Nested m_xpr;
+  EIGEN_TENSOR_INHERIT_ASSIGNMENT_OPERATORS(TensorLayoutSwapOp)
+ protected:
+  typename XprType::Nested m_xpr;
 };
 
-
 // Eval as rvalue
-template<typename ArgType, typename Device>
-struct TensorEvaluator<const TensorLayoutSwapOp<ArgType>, Device>
-{
+template <typename ArgType, typename Device>
+struct TensorEvaluator<const TensorLayoutSwapOp<ArgType>, Device> {
   typedef TensorLayoutSwapOp<ArgType> XprType;
   typedef typename XprType::Index Index;
   static constexpr int NumDims = internal::array_size<typename TensorEvaluator<ArgType, Device>::Dimensions>::value;
   typedef DSizes<Index, NumDims> Dimensions;
 
-  static constexpr int Layout = (TensorEvaluator<ArgType, Device>::Layout == static_cast<int>(ColMajor)) ? RowMajor : ColMajor;
+  static constexpr int Layout =
+      (TensorEvaluator<ArgType, Device>::Layout == static_cast<int>(ColMajor)) ? RowMajor : ColMajor;
   enum {
     IsAligned = TensorEvaluator<ArgType, Device>::IsAligned,
     PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
@@ -116,11 +106,9 @@
   typedef internal::TensorBlockNotImplemented TensorBlock;
   //===--------------------------------------------------------------------===//
 
-  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
-      : m_impl(op.expression(), device)
-  {
-    for(int i = 0; i < NumDims; ++i) {
-      m_dimensions[i] = m_impl.dimensions()[NumDims-1-i];
+  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) : m_impl(op.expression(), device) {
+    for (int i = 0; i < NumDims; ++i) {
+      m_dimensions[i] = m_impl.dimensions()[NumDims - 1 - i];
     }
   }
 
@@ -132,21 +120,13 @@
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; }
 
-  EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType data) {
-    return m_impl.evalSubExprsIfNeeded(data);
-  }
-  EIGEN_STRONG_INLINE void cleanup() {
-    m_impl.cleanup();
-  }
+  EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType data) { return m_impl.evalSubExprsIfNeeded(data); }
+  EIGEN_STRONG_INLINE void cleanup() { m_impl.cleanup(); }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
-  {
-    return m_impl.coeff(index);
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const { return m_impl.coeff(index); }
 
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const
-  {
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const {
     return m_impl.template packet<LoadMode>(index);
   }
 
@@ -154,9 +134,7 @@
     return m_impl.costPerCoeff(vectorized);
   }
 
-  EIGEN_DEVICE_FUNC typename Storage::Type data() const {
-    return constCast(m_impl.data());
-  }
+  EIGEN_DEVICE_FUNC typename Storage::Type data() const { return constCast(m_impl.data()); }
 
   const TensorEvaluator<ArgType, Device>& impl() const { return m_impl; }
 
@@ -165,16 +143,15 @@
   Dimensions m_dimensions;
 };
 
-
 // Eval as lvalue
-template<typename ArgType, typename Device>
-  struct TensorEvaluator<TensorLayoutSwapOp<ArgType>, Device>
-  : public TensorEvaluator<const TensorLayoutSwapOp<ArgType>, Device>
-{
+template <typename ArgType, typename Device>
+struct TensorEvaluator<TensorLayoutSwapOp<ArgType>, Device>
+    : public TensorEvaluator<const TensorLayoutSwapOp<ArgType>, Device> {
   typedef TensorEvaluator<const TensorLayoutSwapOp<ArgType>, Device> Base;
   typedef TensorLayoutSwapOp<ArgType> XprType;
 
-  static constexpr int Layout = (TensorEvaluator<ArgType, Device>::Layout == static_cast<int>(ColMajor)) ? RowMajor : ColMajor;
+  static constexpr int Layout =
+      (TensorEvaluator<ArgType, Device>::Layout == static_cast<int>(ColMajor)) ? RowMajor : ColMajor;
   enum {
     IsAligned = TensorEvaluator<ArgType, Device>::IsAligned,
     PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
@@ -187,26 +164,22 @@
   typedef internal::TensorBlockNotImplemented TensorBlock;
   //===--------------------------------------------------------------------===//
 
-  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
-    : Base(op, device)
-  { }
+  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) : Base(op, device) {}
 
   typedef typename XprType::Index Index;
   typedef typename XprType::Scalar Scalar;
   typedef typename XprType::CoeffReturnType CoeffReturnType;
   typedef typename PacketType<CoeffReturnType, Device>::type PacketReturnType;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType& coeffRef(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType& coeffRef(Index index) const {
     return this->m_impl.coeffRef(index);
   }
-  template <int StoreMode> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  void writePacket(Index index, const PacketReturnType& x) const
-  {
+  template <int StoreMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void writePacket(Index index, const PacketReturnType& x) const {
     this->m_impl.template writePacket<StoreMode>(index, x);
   }
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_CXX11_TENSOR_TENSOR_LAYOUT_SWAP_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_LAYOUT_SWAP_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorMacros.h b/unsupported/Eigen/CXX11/src/Tensor/TensorMacros.h
index 7d8814a..f8bbcfe 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorMacros.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorMacros.h
@@ -10,7 +10,6 @@
 #ifndef EIGEN_CXX11_TENSOR_TENSOR_META_MACROS_H
 #define EIGEN_CXX11_TENSOR_TENSOR_META_MACROS_H
 
-
 /** use this macro in sfinae selection in templated functions
  *
  *   template<typename T,
@@ -26,59 +25,61 @@
  *   void foo(){}
  */
 
-#define EIGEN_SFINAE_ENABLE_IF( __condition__ ) \
-    std::enable_if_t< ( __condition__ ) , int > = 0
+#define EIGEN_SFINAE_ENABLE_IF(__condition__) std::enable_if_t<(__condition__), int> = 0
 
 // Define a macro to use a reference on the host but a value on the device
 #if defined(SYCL_DEVICE_ONLY)
-  #define EIGEN_DEVICE_REF
+#define EIGEN_DEVICE_REF
 #else
-  #define EIGEN_DEVICE_REF &
+#define EIGEN_DEVICE_REF &
 #endif
 
 // Define a macro for catching SYCL exceptions if exceptions are enabled
-#define EIGEN_SYCL_TRY_CATCH(X) \
-  do { \
-    EIGEN_TRY {X;} \
-    EIGEN_CATCH(const cl::sycl::exception& e) { \
-      EIGEN_THROW_X(std::runtime_error("SYCL exception at " + \
-                                       std::string(__FILE__) + ":" + \
-                                       std::to_string(__LINE__) + "\n" + \
-                                       e.what())); \
-    } \
+#define EIGEN_SYCL_TRY_CATCH(X)                                                                                        \
+  do {                                                                                                                 \
+    EIGEN_TRY { X; }                                                                                                   \
+    EIGEN_CATCH(const cl::sycl::exception& e) {                                                                        \
+      EIGEN_THROW_X(std::runtime_error("SYCL exception at " + std::string(__FILE__) + ":" + std::to_string(__LINE__) + \
+                                       "\n" + e.what()));                                                              \
+    }                                                                                                                  \
   } while (false)
 
 // Define a macro if local memory flags are unset or one of them is set
 // Setting both flags is the same as unsetting them
 #if (!defined(EIGEN_SYCL_LOCAL_MEM) && !defined(EIGEN_SYCL_NO_LOCAL_MEM)) || \
-     (defined(EIGEN_SYCL_LOCAL_MEM) &&  defined(EIGEN_SYCL_NO_LOCAL_MEM))
-  #define EIGEN_SYCL_LOCAL_MEM_UNSET_OR_ON 1
-  #define EIGEN_SYCL_LOCAL_MEM_UNSET_OR_OFF 1
+    (defined(EIGEN_SYCL_LOCAL_MEM) && defined(EIGEN_SYCL_NO_LOCAL_MEM))
+#define EIGEN_SYCL_LOCAL_MEM_UNSET_OR_ON 1
+#define EIGEN_SYCL_LOCAL_MEM_UNSET_OR_OFF 1
 #elif defined(EIGEN_SYCL_LOCAL_MEM) && !defined(EIGEN_SYCL_NO_LOCAL_MEM)
-  #define EIGEN_SYCL_LOCAL_MEM_UNSET_OR_ON 1
+#define EIGEN_SYCL_LOCAL_MEM_UNSET_OR_ON 1
 #elif !defined(EIGEN_SYCL_LOCAL_MEM) && defined(EIGEN_SYCL_NO_LOCAL_MEM)
-  #define EIGEN_SYCL_LOCAL_MEM_UNSET_OR_OFF 1
+#define EIGEN_SYCL_LOCAL_MEM_UNSET_OR_OFF 1
 #endif
 
-#if EIGEN_COMP_CLANG // workaround clang bug (see http://forum.kde.org/viewtopic.php?f=74&t=102653)
-  #define EIGEN_TENSOR_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived) \
-    using Base::operator =; \
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator=(const Derived& other) { Base::operator=(other); return *this; } \
-    template <typename OtherDerived> \
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator=(const OtherDerived& other) { Base::operator=(other); return *this; }
+#if EIGEN_COMP_CLANG  // workaround clang bug (see http://forum.kde.org/viewtopic.php?f=74&t=102653)
+#define EIGEN_TENSOR_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived)                         \
+  using Base::operator=;                                                                \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator=(const Derived& other) {      \
+    Base::operator=(other);                                                             \
+    return *this;                                                                       \
+  }                                                                                     \
+  template <typename OtherDerived>                                                      \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator=(const OtherDerived& other) { \
+    Base::operator=(other);                                                             \
+    return *this;                                                                       \
+  }
 #else
-  #define EIGEN_TENSOR_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived) \
-    EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived)
+#define EIGEN_TENSOR_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived) EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived)
 #endif
 
 /** \internal
  * \brief Macro to manually inherit assignment operators.
- * This is necessary, because the implicitly defined assignment operator gets deleted when a custom operator= is defined.
- * This also inherits template<OtherDerived> operator=(const OtherDerived&) assignments.
- * With C++11 or later this also default-implements the copy-constructor
+ * This is necessary, because the implicitly defined assignment operator gets deleted when a custom operator= is
+ * defined. This also inherits template<OtherDerived> operator=(const OtherDerived&) assignments. With C++11 or later
+ * this also default-implements the copy-constructor
  */
-#define EIGEN_TENSOR_INHERIT_ASSIGNMENT_OPERATORS(Derived)  \
-    EIGEN_TENSOR_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived) \
-    EIGEN_DEFAULT_COPY_CONSTRUCTOR(Derived)
+#define EIGEN_TENSOR_INHERIT_ASSIGNMENT_OPERATORS(Derived) \
+  EIGEN_TENSOR_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived)  \
+  EIGEN_DEFAULT_COPY_CONSTRUCTOR(Derived)
 
 #endif
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorMap.h b/unsupported/Eigen/CXX11/src/Tensor/TensorMap.h
index b690417..c201707 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorMap.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorMap.h
@@ -18,195 +18,174 @@
 // FIXME use proper doxygen documentation (e.g. \tparam MakePointer_)
 
 /** \class TensorMap
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief A tensor expression mapping an existing array of data.
-  *
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief A tensor expression mapping an existing array of data.
+ *
+ */
 /// `template <class> class MakePointer_` is added to convert the host pointer to the device pointer.
 /// It is added due to the fact that for our device compiler `T*` is not allowed.
 /// If we wanted to use the same Evaluator functions we have to convert that type to our pointer `T`.
 /// This is done through our `MakePointer_` class. By default the Type in the `MakePointer_<T>` is `T*` .
 /// Therefore, by adding the default value, we managed to convert the type and it does not break any
 /// existing code as its default value is `T*`.
-template<typename PlainObjectType, int Options_, template <class> class MakePointer_> class TensorMap : public TensorBase<TensorMap<PlainObjectType, Options_, MakePointer_> >
-{
-  public:
-    typedef TensorMap<PlainObjectType, Options_, MakePointer_> Self;
-    typedef TensorBase<TensorMap<PlainObjectType, Options_, MakePointer_> > Base;
-  #ifdef EIGEN_USE_SYCL
-    typedef  std::remove_reference_t<typename Eigen::internal::nested<Self>::type> Nested;
-  #else
-     typedef typename Eigen::internal::nested<Self>::type Nested;
-  #endif
-   typedef typename internal::traits<PlainObjectType>::StorageKind StorageKind;
-    typedef typename internal::traits<PlainObjectType>::Index Index;
-    typedef typename internal::traits<PlainObjectType>::Scalar Scalar;
-    typedef typename NumTraits<Scalar>::Real RealScalar;
-    typedef typename PlainObjectType::Base::CoeffReturnType CoeffReturnType;
+template <typename PlainObjectType, int Options_, template <class> class MakePointer_>
+class TensorMap : public TensorBase<TensorMap<PlainObjectType, Options_, MakePointer_> > {
+ public:
+  typedef TensorMap<PlainObjectType, Options_, MakePointer_> Self;
+  typedef TensorBase<TensorMap<PlainObjectType, Options_, MakePointer_> > Base;
+#ifdef EIGEN_USE_SYCL
+  typedef std::remove_reference_t<typename Eigen::internal::nested<Self>::type> Nested;
+#else
+  typedef typename Eigen::internal::nested<Self>::type Nested;
+#endif
+  typedef typename internal::traits<PlainObjectType>::StorageKind StorageKind;
+  typedef typename internal::traits<PlainObjectType>::Index Index;
+  typedef typename internal::traits<PlainObjectType>::Scalar Scalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef typename PlainObjectType::Base::CoeffReturnType CoeffReturnType;
 
-    typedef typename MakePointer_<Scalar>::Type PointerType;
-    typedef typename MakePointer_<Scalar>::ConstType PointerConstType;
+  typedef typename MakePointer_<Scalar>::Type PointerType;
+  typedef typename MakePointer_<Scalar>::ConstType PointerConstType;
 
-    // WARN: PointerType still can be a pointer to const (const Scalar*), for
-    // example in TensorMap<Tensor<const Scalar, ...>> expression. This type of
-    // expression should be illegal, but adding this restriction is not possible
-    // in practice (see https://bitbucket.org/eigen/eigen/pull-requests/488).
-    typedef std::conditional_t<
-        bool(internal::is_lvalue<PlainObjectType>::value),
-        PointerType,      // use simple pointer in lvalue expressions
-        PointerConstType  // use const pointer in rvalue expressions
-        > StoragePointerType;
+  // WARN: PointerType still can be a pointer to const (const Scalar*), for
+  // example in TensorMap<Tensor<const Scalar, ...>> expression. This type of
+  // expression should be illegal, but adding this restriction is not possible
+  // in practice (see https://bitbucket.org/eigen/eigen/pull-requests/488).
+  typedef std::conditional_t<bool(internal::is_lvalue<PlainObjectType>::value),
+                             PointerType,      // use simple pointer in lvalue expressions
+                             PointerConstType  // use const pointer in rvalue expressions
+                             >
+      StoragePointerType;
 
-    // If TensorMap was constructed over rvalue expression (e.g. const Tensor),
-    // we should return a reference to const from operator() (and others), even
-    // if TensorMap itself is not const.
-    typedef std::conditional_t<
-        bool(internal::is_lvalue<PlainObjectType>::value),
-        Scalar&,
-        const Scalar&
-        > StorageRefType;
+  // If TensorMap was constructed over rvalue expression (e.g. const Tensor),
+  // we should return a reference to const from operator() (and others), even
+  // if TensorMap itself is not const.
+  typedef std::conditional_t<bool(internal::is_lvalue<PlainObjectType>::value), Scalar&, const Scalar&> StorageRefType;
 
-    static constexpr int Options = Options_;
+  static constexpr int Options = Options_;
 
-    static constexpr Index NumIndices = PlainObjectType::NumIndices;
-    typedef typename PlainObjectType::Dimensions Dimensions;
+  static constexpr Index NumIndices = PlainObjectType::NumIndices;
+  typedef typename PlainObjectType::Dimensions Dimensions;
 
-    static constexpr int Layout = PlainObjectType::Layout;
-    enum {
-      IsAligned = ((int(Options_)&Aligned)==Aligned),
-      CoordAccess = true,
-      RawAccess = true
-    };
+  static constexpr int Layout = PlainObjectType::Layout;
+  enum { IsAligned = ((int(Options_) & Aligned) == Aligned), CoordAccess = true, RawAccess = true };
 
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE TensorMap(StoragePointerType dataPtr) : m_data(dataPtr), m_dimensions() {
-      // The number of dimensions used to construct a tensor must be equal to the rank of the tensor.
-      EIGEN_STATIC_ASSERT((0 == NumIndices || NumIndices == Dynamic), YOU_MADE_A_PROGRAMMING_MISTAKE)
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorMap(StoragePointerType dataPtr) : m_data(dataPtr), m_dimensions() {
+    // The number of dimensions used to construct a tensor must be equal to the rank of the tensor.
+    EIGEN_STATIC_ASSERT((0 == NumIndices || NumIndices == Dynamic), YOU_MADE_A_PROGRAMMING_MISTAKE)
+  }
 
-    template<typename... IndexTypes> EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE TensorMap(StoragePointerType dataPtr, Index firstDimension, IndexTypes... otherDimensions) : m_data(dataPtr), m_dimensions(firstDimension, otherDimensions...) {
-      // The number of dimensions used to construct a tensor must be equal to the rank of the tensor.
-      EIGEN_STATIC_ASSERT((sizeof...(otherDimensions) + 1 == NumIndices || NumIndices == Dynamic), YOU_MADE_A_PROGRAMMING_MISTAKE)
-    }
+  template <typename... IndexTypes>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorMap(StoragePointerType dataPtr, Index firstDimension,
+                                                  IndexTypes... otherDimensions)
+      : m_data(dataPtr),
+        m_dimensions(firstDimension, otherDimensions...){
+            // The number of dimensions used to construct a tensor must be equal to the rank of the tensor.
+            EIGEN_STATIC_ASSERT((sizeof...(otherDimensions) + 1 == NumIndices || NumIndices == Dynamic),
+                                YOU_MADE_A_PROGRAMMING_MISTAKE)}
 
-   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorMap(StoragePointerType dataPtr, const array<Index, NumIndices>& dimensions)
-      : m_data(dataPtr), m_dimensions(dimensions)
-    { }
+        EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorMap(StoragePointerType dataPtr,
+                                                        const array<Index, NumIndices>& dimensions)
+      : m_data(dataPtr), m_dimensions(dimensions) {}
 
-    template <typename Dimensions>
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorMap(StoragePointerType dataPtr, const Dimensions& dimensions)
-      : m_data(dataPtr), m_dimensions(dimensions)
-    { }
+  template <typename Dimensions>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorMap(StoragePointerType dataPtr, const Dimensions& dimensions)
+      : m_data(dataPtr), m_dimensions(dimensions) {}
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorMap(PlainObjectType& tensor)
-      : m_data(tensor.data()), m_dimensions(tensor.dimensions())
-    { }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorMap(PlainObjectType& tensor)
+      : m_data(tensor.data()), m_dimensions(tensor.dimensions()) {}
 
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Index rank() const { return m_dimensions.rank(); }
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Index dimension(Index n) const { return m_dimensions[n]; }
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; }
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Index size() const { return m_dimensions.TotalSize(); }
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE StoragePointerType data() { return m_data; }
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE StoragePointerType data() const { return m_data; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index rank() const { return m_dimensions.rank(); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index dimension(Index n) const { return m_dimensions[n]; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index size() const { return m_dimensions.TotalSize(); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE StoragePointerType data() { return m_data; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE StoragePointerType data() const { return m_data; }
 
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE StorageRefType operator()(const array<Index, NumIndices>& indices) const
-    {
-      //      eigen_assert(checkIndexRange(indices));
-      if (PlainObjectType::Options&RowMajor) {
-        const Index index = m_dimensions.IndexOfRowMajor(indices);
-        return m_data[index];
-      } else {
-        const Index index = m_dimensions.IndexOfColMajor(indices);
-        return m_data[index];
-      }
-    }
-
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE StorageRefType operator()() const
-    {
-      EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE)
-      return m_data[0];
-    }
-
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE StorageRefType operator()(Index index) const
-    {
-      eigen_internal_assert(index >= 0 && index < size());
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE StorageRefType operator()(const array<Index, NumIndices>& indices) const {
+    //      eigen_assert(checkIndexRange(indices));
+    if (PlainObjectType::Options & RowMajor) {
+      const Index index = m_dimensions.IndexOfRowMajor(indices);
+      return m_data[index];
+    } else {
+      const Index index = m_dimensions.IndexOfColMajor(indices);
       return m_data[index];
     }
+  }
 
-    template<typename... IndexTypes> EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE StorageRefType operator()(Index firstIndex, Index secondIndex, IndexTypes... otherIndices) const
-    {
-      EIGEN_STATIC_ASSERT(sizeof...(otherIndices) + 2 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
-      eigen_assert(internal::all((Eigen::NumTraits<Index>::highest() >= otherIndices)...));
-      if (PlainObjectType::Options&RowMajor) {
-        const Index index = m_dimensions.IndexOfRowMajor(array<Index, NumIndices>{{firstIndex, secondIndex, otherIndices...}});
-        return m_data[index];
-      } else {
-        const Index index = m_dimensions.IndexOfColMajor(array<Index, NumIndices>{{firstIndex, secondIndex, otherIndices...}});
-        return m_data[index];
-      }
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE StorageRefType operator()() const {
+    EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE)
+    return m_data[0];
+  }
 
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE StorageRefType operator()(const array<Index, NumIndices>& indices)
-    {
-      //      eigen_assert(checkIndexRange(indices));
-      if (PlainObjectType::Options&RowMajor) {
-        const Index index = m_dimensions.IndexOfRowMajor(indices);
-        return m_data[index];
-      } else {
-        const Index index = m_dimensions.IndexOfColMajor(indices);
-        return m_data[index];
-      }
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE StorageRefType operator()(Index index) const {
+    eigen_internal_assert(index >= 0 && index < size());
+    return m_data[index];
+  }
 
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE StorageRefType operator()()
-    {
-      EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE)
-      return m_data[0];
-    }
-
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE StorageRefType operator()(Index index)
-    {
-      eigen_internal_assert(index >= 0 && index < size());
+  template <typename... IndexTypes>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE StorageRefType operator()(Index firstIndex, Index secondIndex,
+                                                                  IndexTypes... otherIndices) const {
+    EIGEN_STATIC_ASSERT(sizeof...(otherIndices) + 2 == NumIndices, YOU_MADE_A_PROGRAMMING_MISTAKE)
+    eigen_assert(internal::all((Eigen::NumTraits<Index>::highest() >= otherIndices)...));
+    if (PlainObjectType::Options & RowMajor) {
+      const Index index =
+          m_dimensions.IndexOfRowMajor(array<Index, NumIndices>{{firstIndex, secondIndex, otherIndices...}});
+      return m_data[index];
+    } else {
+      const Index index =
+          m_dimensions.IndexOfColMajor(array<Index, NumIndices>{{firstIndex, secondIndex, otherIndices...}});
       return m_data[index];
     }
+  }
 
-    template<typename... IndexTypes> EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE StorageRefType operator()(Index firstIndex, Index secondIndex, IndexTypes... otherIndices)
-    {
-      static_assert(sizeof...(otherIndices) + 2 == NumIndices || NumIndices == Dynamic, "Number of indices used to access a tensor coefficient must be equal to the rank of the tensor.");
-       eigen_assert(internal::all((Eigen::NumTraits<Index>::highest() >= otherIndices)...));
-      const std::size_t NumDims = sizeof...(otherIndices) + 2;
-      if (PlainObjectType::Options&RowMajor) {
-        const Index index = m_dimensions.IndexOfRowMajor(array<Index, NumDims>{{firstIndex, secondIndex, otherIndices...}});
-        return m_data[index];
-      } else {
-        const Index index = m_dimensions.IndexOfColMajor(array<Index, NumDims>{{firstIndex, secondIndex, otherIndices...}});
-        return m_data[index];
-      }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE StorageRefType operator()(const array<Index, NumIndices>& indices) {
+    //      eigen_assert(checkIndexRange(indices));
+    if (PlainObjectType::Options & RowMajor) {
+      const Index index = m_dimensions.IndexOfRowMajor(indices);
+      return m_data[index];
+    } else {
+      const Index index = m_dimensions.IndexOfColMajor(indices);
+      return m_data[index];
     }
+  }
 
-    EIGEN_TENSOR_INHERIT_ASSIGNMENT_OPERATORS(TensorMap)
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE StorageRefType operator()() {
+    EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE)
+    return m_data[0];
+  }
 
-  private:
-    StoragePointerType m_data;
-    Dimensions m_dimensions;
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE StorageRefType operator()(Index index) {
+    eigen_internal_assert(index >= 0 && index < size());
+    return m_data[index];
+  }
+
+  template <typename... IndexTypes>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE StorageRefType operator()(Index firstIndex, Index secondIndex,
+                                                                  IndexTypes... otherIndices) {
+    static_assert(sizeof...(otherIndices) + 2 == NumIndices || NumIndices == Dynamic,
+                  "Number of indices used to access a tensor coefficient must be equal to the rank of the tensor.");
+    eigen_assert(internal::all((Eigen::NumTraits<Index>::highest() >= otherIndices)...));
+    const std::size_t NumDims = sizeof...(otherIndices) + 2;
+    if (PlainObjectType::Options & RowMajor) {
+      const Index index =
+          m_dimensions.IndexOfRowMajor(array<Index, NumDims>{{firstIndex, secondIndex, otherIndices...}});
+      return m_data[index];
+    } else {
+      const Index index =
+          m_dimensions.IndexOfColMajor(array<Index, NumDims>{{firstIndex, secondIndex, otherIndices...}});
+      return m_data[index];
+    }
+  }
+
+  EIGEN_TENSOR_INHERIT_ASSIGNMENT_OPERATORS(TensorMap)
+
+ private:
+  StoragePointerType m_data;
+  Dimensions m_dimensions;
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_CXX11_TENSOR_TENSOR_MAP_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_MAP_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorMeta.h b/unsupported/Eigen/CXX11/src/Tensor/TensorMeta.h
index 524432e..8c2bb2e 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorMeta.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorMeta.h
@@ -15,28 +15,30 @@
 
 namespace Eigen {
 
-template<bool cond> struct Cond {};
+template <bool cond>
+struct Cond {};
 
-template<typename T1, typename T2> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-const T1& choose(Cond<true>, const T1& first, const T2&) {
+template <typename T1, typename T2>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE const T1& choose(Cond<true>, const T1& first, const T2&) {
   return first;
 }
 
-template<typename T1, typename T2> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-const T2& choose(Cond<false>, const T1&, const T2& second) {
+template <typename T1, typename T2>
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE const T2& choose(Cond<false>, const T1&, const T2& second) {
   return second;
 }
 
-template <size_t n> struct max_n_1 {
+template <size_t n>
+struct max_n_1 {
   static const size_t size = n;
 };
-template <> struct max_n_1<0> {
+template <>
+struct max_n_1<0> {
   static const size_t size = 1;
 };
 
 template <typename T>
-EIGEN_DEPRECATED EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-constexpr T divup(const T x, const T y) {
+EIGEN_DEPRECATED EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE constexpr T divup(const T x, const T y) {
   return Eigen::numext::div_ceil(x, y);
 }
 
@@ -50,33 +52,33 @@
 #if defined(EIGEN_USE_GPU) && defined(EIGEN_HAS_GPU_FP16) && defined(EIGEN_GPU_COMPILE_PHASE)
 
 typedef ulonglong2 Packet4h2;
-template<>
+template <>
 struct PacketType<half, GpuDevice> {
   typedef Packet4h2 type;
   static const int size = 8;
   enum {
-    HasAdd    = 1,
-    HasSub    = 1,
-    HasMul    = 1,
+    HasAdd = 1,
+    HasSub = 1,
+    HasMul = 1,
     HasNegate = 1,
-    HasAbs    = 1,
-    HasArg    = 0,
-    HasAbs2   = 0,
-    HasMin    = 1,
-    HasMax    = 1,
-    HasConj   = 0,
+    HasAbs = 1,
+    HasArg = 0,
+    HasAbs2 = 0,
+    HasMin = 1,
+    HasMax = 1,
+    HasConj = 0,
     HasSetLinear = 0,
-    HasBlend  = 0,
+    HasBlend = 0,
 
-    HasDiv    = 1,
-    HasSqrt   = 1,
-    HasRsqrt  = 1,
-    HasExp    = 1,
-    HasExpm1  = 0,
-    HasLog    = 1,
-    HasLog1p  = 0,
-    HasLog10  = 0,
-    HasPow    = 1,
+    HasDiv = 1,
+    HasSqrt = 1,
+    HasRsqrt = 1,
+    HasExp = 1,
+    HasExpm1 = 0,
+    HasLog = 1,
+    HasLog1p = 0,
+    HasLog10 = 0,
+    HasPow = 1,
   };
 };
 #endif
@@ -86,26 +88,25 @@
 namespace TensorSycl {
 namespace internal {
 
-template <typename Index, Index A, Index B> struct PlusOp {
+template <typename Index, Index A, Index B>
+struct PlusOp {
   static constexpr Index Value = A + B;
 };
 
-template <typename Index, Index A, Index B> struct DivOp {
+template <typename Index, Index A, Index B>
+struct DivOp {
   static constexpr Index Value = A / B;
 };
 
-template <typename Index, Index start, Index end, Index step,
-          template <class Indx, Indx...> class StepOp>
+template <typename Index, Index start, Index end, Index step, template <class Indx, Indx...> class StepOp>
 struct static_for {
   template <typename UnaryOperator>
   static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void loop(UnaryOperator op) {
     op(start);
-    static_for<Index, StepOp<Index, start, step>::Value, end, step,
-               StepOp>::loop(op);
+    static_for<Index, StepOp<Index, start, step>::Value, end, step, StepOp>::loop(op);
   }
 };
-template <typename Index, Index end, Index step,
-          template <class Indx, Indx...> class StepOp>
+template <typename Index, Index end, Index step, template <class Indx, Indx...> class StepOp>
 struct static_for<Index, end, end, step, StepOp> {
   template <typename UnaryOperator>
   static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void loop(UnaryOperator) {}
@@ -123,30 +124,28 @@
   typedef typename Eigen::PacketType<OutScalar, Device>::type PacketReturnType;
 };
 
-static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Index roundUp(Index x, Index y) {
-  return ((((x) + (y)-1) / (y)) * (y));
-}
+static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Index roundUp(Index x, Index y) { return ((((x) + (y)-1) / (y)) * (y)); }
 
-} // namespace internal
-} // namespace TensorSycl
+}  // namespace internal
+}  // namespace TensorSycl
 
 template <>
-  struct PacketType<half, SyclDevice> {
+struct PacketType<half, SyclDevice> {
   typedef half type;
   static const int size = 1;
   enum {
-    HasAdd    = 0,
-    HasSub    = 0,
-    HasMul    = 0,
+    HasAdd = 0,
+    HasSub = 0,
+    HasMul = 0,
     HasNegate = 0,
-    HasAbs    = 0,
-    HasArg    = 0,
-    HasAbs2   = 0,
-    HasMin    = 0,
-    HasMax    = 0,
-    HasConj   = 0,
+    HasAbs = 0,
+    HasArg = 0,
+    HasAbs2 = 0,
+    HasMin = 0,
+    HasMax = 0,
+    HasConj = 0,
     HasSetLinear = 0,
-    HasBlend  = 0
+    HasBlend = 0
   };
 };
 template <typename Scalar>
@@ -159,31 +158,29 @@
     AlignedOnScalar = 0,
   };
   enum {
-    HasAdd    = 0,
-    HasSub    = 0,
-    HasMul    = 0,
+    HasAdd = 0,
+    HasSub = 0,
+    HasMul = 0,
     HasNegate = 0,
-    HasAbs    = 0,
-    HasAbs2   = 0,
-    HasMin    = 0,
-    HasMax    = 0,
-    HasConj   = 0,
+    HasAbs = 0,
+    HasAbs2 = 0,
+    HasMin = 0,
+    HasMax = 0,
+    HasConj = 0,
     HasSetLinear = 0
   };
-
 };
 
 template <typename Scalar>
-struct PacketType<Scalar, const SyclDevice> : PacketType<Scalar, SyclDevice>{};
+struct PacketType<Scalar, const SyclDevice> : PacketType<Scalar, SyclDevice> {};
 
 #ifndef EIGEN_DONT_VECTORIZE_SYCL
-#define PACKET_TYPE(CVQual, Type, val, lengths, DEV)\
-template<> struct PacketType<CVQual Type, DEV> : internal::sycl_packet_traits<val, lengths> \
-{\
-  typedef typename internal::packet_traits<Type>::type type;\
-  typedef typename internal::packet_traits<Type>::half half;\
-};
-
+#define PACKET_TYPE(CVQual, Type, val, lengths, DEV)                                 \
+  template <>                                                                        \
+  struct PacketType<CVQual Type, DEV> : internal::sycl_packet_traits<val, lengths> { \
+    typedef typename internal::packet_traits<Type>::type type;                       \
+    typedef typename internal::packet_traits<Type>::half half;                       \
+  };
 
 PACKET_TYPE(const, float, 1, 4, SyclDevice)
 PACKET_TYPE(, float, 1, 4, SyclDevice)
@@ -196,13 +193,16 @@
 PACKET_TYPE(, double, 0, 2, const SyclDevice)
 #undef PACKET_TYPE
 
-template<> struct PacketType<half, const SyclDevice>: PacketType<half, SyclDevice>{};
-template<> struct PacketType<const half, const SyclDevice>: PacketType<half, SyclDevice>{};
+template <>
+struct PacketType<half, const SyclDevice> : PacketType<half, SyclDevice> {};
+template <>
+struct PacketType<const half, const SyclDevice> : PacketType<half, SyclDevice> {};
 #endif
 #endif
 
 // Pair mimics std::pair but works on e.g. nvcc.
-template <typename U, typename V> struct Pair {
+template <typename U, typename V>
+struct Pair {
  public:
   EIGEN_MAKE_ALIGNED_OPERATOR_NEW
 
@@ -212,14 +212,11 @@
   typedef U first_type;
   typedef V second_type;
 
-  EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Pair() : first(), second() {}
+  EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Pair() : first(), second() {}
 
-  EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Pair(const U& f, const V& s) : first(f), second(s) {}
+  EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Pair(const U& f, const V& s) : first(f), second(s) {}
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  void swap(Pair& rhs) {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void swap(Pair& rhs) {
     using numext::swap;
     swap(first, rhs.first);
     swap(second, rhs.second);
@@ -227,20 +224,18 @@
 };
 
 template <typename U, typename V>
-EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-bool operator==(const Pair<U, V>& x, const Pair<U, V>& y) {
+EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator==(const Pair<U, V>& x, const Pair<U, V>& y) {
   return (x.first == y.first && x.second == y.second);
 }
 
 template <typename U, typename V>
-EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-bool operator!=(const Pair<U, V>& x, const Pair<U, V>& y) {
+EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator!=(const Pair<U, V>& x, const Pair<U, V>& y) {
   return !(x == y);
 }
 
-
 // Can't use std::pairs on cuda devices
-template <typename Idx> struct IndexPair {
+template <typename Idx>
+struct IndexPair {
   EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE IndexPair() : first(0), second(0) {}
   EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE IndexPair(Idx f, Idx s) : first(f), second(s) {}
 
@@ -253,50 +248,44 @@
   Idx second;
 };
 
-
 namespace internal {
 
-  template<typename IndexType, typename Index, Index First, Index... Is>
-  EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  array<Index, 1 + sizeof...(Is)> customIndices2Array(IndexType& idx, numeric_list<Index, First, Is...>) {
-    return { static_cast<Index>(idx[First]), static_cast<Index>(idx[Is])... };
-  }
-  template<typename IndexType, typename Index>
-  EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  array<Index, 0> customIndices2Array(IndexType&, numeric_list<Index>) {
-    return array<Index, 0>();
-  }
+template <typename IndexType, typename Index, Index First, Index... Is>
+EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array<Index, 1 + sizeof...(Is)> customIndices2Array(
+    IndexType& idx, numeric_list<Index, First, Is...>) {
+  return {static_cast<Index>(idx[First]), static_cast<Index>(idx[Is])...};
+}
+template <typename IndexType, typename Index>
+EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array<Index, 0> customIndices2Array(IndexType&,
+                                                                                          numeric_list<Index>) {
+  return array<Index, 0>();
+}
 
-  /** Make an array (for index/dimensions) out of a custom index */
-  template<typename Index, std::size_t NumIndices, typename IndexType>
-  EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  array<Index, NumIndices> customIndices2Array(IndexType& idx) {
-    return customIndices2Array(idx, typename gen_numeric_list<Index, NumIndices>::type{});
-  }
+/** Make an array (for index/dimensions) out of a custom index */
+template <typename Index, std::size_t NumIndices, typename IndexType>
+EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array<Index, NumIndices> customIndices2Array(IndexType& idx) {
+  return customIndices2Array(idx, typename gen_numeric_list<Index, NumIndices>::type{});
+}
 
+template <typename B, typename D>
+struct is_base_of {
+  typedef char (&yes)[1];
+  typedef char (&no)[2];
 
-  template <typename B, typename D>
-  struct is_base_of
-  {
-
-    typedef char (&yes)[1];
-    typedef char (&no)[2];
-
-    template <typename BB, typename DD>
-    struct Host
-    {
-      operator BB*() const;
-      operator DD*();
-    };
-
-    template<typename T>
-    static yes check(D*, T);
-    static no check(B*, int);
-
-    static const bool value = sizeof(check(Host<B,D>(), int())) == sizeof(yes);
+  template <typename BB, typename DD>
+  struct Host {
+    operator BB*() const;
+    operator DD*();
   };
 
-}
+  template <typename T>
+  static yes check(D*, T);
+  static no check(B*, int);
+
+  static const bool value = sizeof(check(Host<B, D>(), int())) == sizeof(yes);
+};
+
+}  // namespace internal
 
 }  // namespace Eigen
 
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorMorphing.h b/unsupported/Eigen/CXX11/src/Tensor/TensorMorphing.h
index a437ce1..d790f35 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorMorphing.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorMorphing.h
@@ -16,16 +16,15 @@
 namespace Eigen {
 
 /** \class TensorReshaping
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Tensor reshaping class.
-  *
-  *
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Tensor reshaping class.
+ *
+ *
+ */
 namespace internal {
-template<typename NewDimensions, typename XprType>
-struct traits<TensorReshapingOp<NewDimensions, XprType> > : public traits<XprType>
-{
+template <typename NewDimensions, typename XprType>
+struct traits<TensorReshapingOp<NewDimensions, XprType>> : public traits<XprType> {
   typedef typename XprType::Scalar Scalar;
   typedef traits<XprType> XprTraits;
   typedef typename XprTraits::StorageKind StorageKind;
@@ -37,26 +36,22 @@
   typedef typename XprTraits::PointerType PointerType;
 };
 
-template<typename NewDimensions, typename XprType>
-struct eval<TensorReshapingOp<NewDimensions, XprType>, Eigen::Dense>
-{
-  typedef const TensorReshapingOp<NewDimensions, XprType>EIGEN_DEVICE_REF type;
+template <typename NewDimensions, typename XprType>
+struct eval<TensorReshapingOp<NewDimensions, XprType>, Eigen::Dense> {
+  typedef const TensorReshapingOp<NewDimensions, XprType> EIGEN_DEVICE_REF type;
 };
 
-template<typename NewDimensions, typename XprType>
-struct nested<TensorReshapingOp<NewDimensions, XprType>, 1, typename eval<TensorReshapingOp<NewDimensions, XprType> >::type>
-{
+template <typename NewDimensions, typename XprType>
+struct nested<TensorReshapingOp<NewDimensions, XprType>, 1,
+              typename eval<TensorReshapingOp<NewDimensions, XprType>>::type> {
   typedef TensorReshapingOp<NewDimensions, XprType> type;
 };
 
 }  // end namespace internal
 
-
-
-template<typename NewDimensions, typename XprType>
-class TensorReshapingOp : public TensorBase<TensorReshapingOp<NewDimensions, XprType>, WriteAccessors>
-{
-  public:
+template <typename NewDimensions, typename XprType>
+class TensorReshapingOp : public TensorBase<TensorReshapingOp<NewDimensions, XprType>, WriteAccessors> {
+ public:
   typedef TensorBase<TensorReshapingOp<NewDimensions, XprType>, WriteAccessors> Base;
   typedef typename Eigen::internal::traits<TensorReshapingOp>::Scalar Scalar;
   typedef std::remove_const_t<typename XprType::CoeffReturnType> CoeffReturnType;
@@ -67,25 +62,20 @@
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorReshapingOp(const XprType& expr, const NewDimensions& dims)
       : m_xpr(expr), m_dims(dims) {}
 
-    EIGEN_DEVICE_FUNC
-    const NewDimensions& dimensions() const { return m_dims; }
+  EIGEN_DEVICE_FUNC const NewDimensions& dimensions() const { return m_dims; }
 
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<typename XprType::Nested>&
-    expression() const { return m_xpr; }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename XprType::Nested>& expression() const { return m_xpr; }
 
-    EIGEN_TENSOR_INHERIT_ASSIGNMENT_OPERATORS(TensorReshapingOp)
+  EIGEN_TENSOR_INHERIT_ASSIGNMENT_OPERATORS(TensorReshapingOp)
 
-  protected:
-    typename XprType::Nested m_xpr;
-    const NewDimensions m_dims;
+ protected:
+  typename XprType::Nested m_xpr;
+  const NewDimensions m_dims;
 };
 
-
 // Eval as rvalue
-template<typename NewDimensions, typename ArgType, typename Device>
-struct TensorEvaluator<const TensorReshapingOp<NewDimensions, ArgType>, Device>
-{
+template <typename NewDimensions, typename ArgType, typename Device>
+struct TensorEvaluator<const TensorReshapingOp<NewDimensions, ArgType>, Device> {
   typedef TensorReshapingOp<NewDimensions, ArgType> XprType;
   typedef NewDimensions Dimensions;
 
@@ -98,7 +88,8 @@
   typedef StorageMemory<std::remove_const_t<CoeffReturnType>, Device> ConstCastStorage;
 
   static constexpr int NumOutputDims = internal::array_size<Dimensions>::value;
-  static constexpr int NumInputDims  = internal::array_size<typename TensorEvaluator<ArgType, Device>::Dimensions>::value;
+  static constexpr int NumInputDims =
+      internal::array_size<typename TensorEvaluator<ArgType, Device>::Dimensions>::value;
 
   enum ReshapingKind {
     // We do not use layout information to determine reshaping kind.
@@ -117,16 +108,15 @@
 
   static constexpr int Layout = TensorEvaluator<ArgType, Device>::Layout;
   enum {
-    IsAligned         = TensorEvaluator<ArgType, Device>::IsAligned,
-    PacketAccess      = TensorEvaluator<ArgType, Device>::PacketAccess,
+    IsAligned = TensorEvaluator<ArgType, Device>::IsAligned,
+    PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
     // For trivial reshapes with raw access to underlying data we will provide
     // zero overhead block access.
     // TODO(ezhulenev): Consider adding block access without raw access?
-    BlockAccess       = TensorEvaluator<ArgType, Device>::RawAccess &&
-                        NumInputDims > 0 && NumOutputDims > 0,
+    BlockAccess = TensorEvaluator<ArgType, Device>::RawAccess && NumInputDims > 0 && NumOutputDims > 0,
     PreferBlockAccess = false,
-    CoordAccess       = false,  // to be implemented
-    RawAccess         = TensorEvaluator<ArgType, Device>::RawAccess
+    CoordAccess = false,  // to be implemented
+    RawAccess = TensorEvaluator<ArgType, Device>::RawAccess
   };
 
   typedef std::remove_const_t<Scalar> ScalarNoConst;
@@ -135,15 +125,11 @@
   typedef internal::TensorBlockDescriptor<NumOutputDims, Index> TensorBlockDesc;
   typedef internal::TensorBlockScratchAllocator<Device> TensorBlockScratch;
 
-  typedef
-      typename internal::TensorMaterializedBlock<ScalarNoConst, NumOutputDims,
-                                                 Layout, Index>
-          TensorBlock;
+  typedef typename internal::TensorMaterializedBlock<ScalarNoConst, NumOutputDims, Layout, Index> TensorBlock;
   //===--------------------------------------------------------------------===//
 
   EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
-      : m_impl(op.expression(), device), m_dimensions(op.dimensions())
-  {
+      : m_impl(op.expression(), device), m_dimensions(op.dimensions()) {
     // The total size of the reshaped tensor must be equal to the total size
     // of the input tensor.
     eigen_assert(internal::array_prod(m_impl.dimensions()) == internal::array_prod(op.dimensions()));
@@ -153,27 +139,18 @@
 
 #ifdef EIGEN_USE_THREADS
   template <typename EvalSubExprsCallback>
-  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(
-      EvaluatorPointerType data, EvalSubExprsCallback done) {
+  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(EvaluatorPointerType data, EvalSubExprsCallback done) {
     m_impl.evalSubExprsIfNeededAsync(data, std::move(done));
   }
 #endif
 
-  EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType data) {
-    return m_impl.evalSubExprsIfNeeded(data);
-  }
-  EIGEN_STRONG_INLINE void cleanup() {
-    m_impl.cleanup();
-  }
+  EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType data) { return m_impl.evalSubExprsIfNeeded(data); }
+  EIGEN_STRONG_INLINE void cleanup() { m_impl.cleanup(); }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
-  {
-    return m_impl.coeff(index);
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const { return m_impl.coeff(index); }
 
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const
-  {
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const {
     return m_impl.template packet<LoadMode>(index);
   }
 
@@ -181,8 +158,7 @@
     return m_impl.costPerCoeff(vectorized);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  internal::TensorBlockResourceRequirements getResourceRequirements() const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE internal::TensorBlockResourceRequirements getResourceRequirements() const {
     return internal::TensorBlockResourceRequirements::any();
   }
 
@@ -195,30 +171,24 @@
     Index count;
   };
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock
-  block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
-          bool /*root_of_expr_ast*/ = false) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
+                                                          bool /*root_of_expr_ast*/ = false) const {
     eigen_assert(m_impl.data() != NULL);
-    eigen_assert((kind == Runtime) ||
-                 (kind == OneByN && desc.dimensions()[0] == 1) ||
+    eigen_assert((kind == Runtime) || (kind == OneByN && desc.dimensions()[0] == 1) ||
                  (kind == NByOne && desc.dimensions()[1] == 1));
 
     if (kind == OneByN || kind == NByOne) {
       // We can guarantee at compile time that block is just a contiguous slice
       // of the underlying expression memory buffer.
-      return TensorBlock(internal::TensorBlockKind::kView,
-                           m_impl.data() + desc.offset(), desc.dimensions());
+      return TensorBlock(internal::TensorBlockKind::kView, m_impl.data() + desc.offset(), desc.dimensions());
     } else {
       // This will do additional runtime checks, and in the end it might be also
       // a view, or it might be a block materialized in the temporary buffer.
-      return TensorBlock::materialize(m_impl.data(), m_dimensions, desc,
-                                        scratch);
+      return TensorBlock::materialize(m_impl.data(), m_dimensions, desc, scratch);
     }
   }
 
-  EIGEN_DEVICE_FUNC typename Storage::Type data() const {
-    return constCast(m_impl.data());
-  }
+  EIGEN_DEVICE_FUNC typename Storage::Type data() const { return constCast(m_impl.data()); }
 
   EIGEN_DEVICE_FUNC const TensorEvaluator<ArgType, Device>& impl() const { return m_impl; }
 
@@ -227,11 +197,10 @@
   NewDimensions m_dimensions;
 };
 
-
 // Eval as lvalue
-template<typename NewDimensions, typename ArgType, typename Device>
-  struct TensorEvaluator<TensorReshapingOp<NewDimensions, ArgType>, Device>
-  : public TensorEvaluator<const TensorReshapingOp<NewDimensions, ArgType>, Device>
+template <typename NewDimensions, typename ArgType, typename Device>
+struct TensorEvaluator<TensorReshapingOp<NewDimensions, ArgType>, Device>
+    : public TensorEvaluator<const TensorReshapingOp<NewDimensions, ArgType>, Device>
 
 {
   typedef TensorEvaluator<const TensorReshapingOp<NewDimensions, ArgType>, Device> Base;
@@ -240,17 +209,15 @@
 
   static constexpr int Layout = TensorEvaluator<ArgType, Device>::Layout;
   enum {
-    IsAligned         = TensorEvaluator<ArgType, Device>::IsAligned,
-    PacketAccess      = TensorEvaluator<ArgType, Device>::PacketAccess,
-    BlockAccess       = TensorEvaluator<ArgType, Device>::RawAccess,
+    IsAligned = TensorEvaluator<ArgType, Device>::IsAligned,
+    PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
+    BlockAccess = TensorEvaluator<ArgType, Device>::RawAccess,
     PreferBlockAccess = false,
-    CoordAccess       = false,  // to be implemented
-    RawAccess         = TensorEvaluator<ArgType, Device>::RawAccess
+    CoordAccess = false,  // to be implemented
+    RawAccess = TensorEvaluator<ArgType, Device>::RawAccess
   };
 
-  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
-    : Base(op, device)
-  { }
+  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) : Base(op, device) {}
 
   typedef typename XprType::Index Index;
   typedef typename XprType::Scalar Scalar;
@@ -258,51 +225,42 @@
   typedef typename PacketType<CoeffReturnType, Device>::type PacketReturnType;
 
   //===- Tensor block evaluation strategy (see TensorBlock.h) -------------===//
-  typedef internal::TensorBlockDescriptor<TensorEvaluator::NumOutputDims, Index>
-      TensorBlockDesc;
+  typedef internal::TensorBlockDescriptor<TensorEvaluator::NumOutputDims, Index> TensorBlockDesc;
   //===--------------------------------------------------------------------===//
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType& coeffRef(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType& coeffRef(Index index) const {
     return this->m_impl.coeffRef(index);
   }
 
-  template <int StoreMode> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  void writePacket(Index index, const PacketReturnType& x) const
-  {
+  template <int StoreMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void writePacket(Index index, const PacketReturnType& x) const {
     this->m_impl.template writePacket<StoreMode>(index, x);
   }
 
   template <typename TensorBlock>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void writeBlock(
-      const TensorBlockDesc& desc, const TensorBlock& block) {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void writeBlock(const TensorBlockDesc& desc, const TensorBlock& block) {
     eigen_assert(this->m_impl.data() != NULL);
 
     typedef typename TensorBlock::XprType TensorBlockExpr;
-    typedef internal::TensorBlockAssignment<
-        Scalar, TensorEvaluator::NumOutputDims, TensorBlockExpr, Index>
+    typedef internal::TensorBlockAssignment<Scalar, TensorEvaluator::NumOutputDims, TensorBlockExpr, Index>
         TensorBlockAssign;
 
-    TensorBlockAssign::Run(
-        TensorBlockAssign::target(desc.dimensions(),
-                                  internal::strides<Layout>(this->dimensions()),
-                                  this->m_impl.data(), desc.offset()),
-        block.expr());
+    TensorBlockAssign::Run(TensorBlockAssign::target(desc.dimensions(), internal::strides<Layout>(this->dimensions()),
+                                                     this->m_impl.data(), desc.offset()),
+                           block.expr());
   }
 };
 
-
 /** \class TensorSlicing
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Tensor slicing class.
-  *
-  *
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Tensor slicing class.
+ *
+ *
+ */
 namespace internal {
-template<typename StartIndices, typename Sizes, typename XprType>
-struct traits<TensorSlicingOp<StartIndices, Sizes, XprType> > : public traits<XprType>
-{
+template <typename StartIndices, typename Sizes, typename XprType>
+struct traits<TensorSlicingOp<StartIndices, Sizes, XprType>> : public traits<XprType> {
   typedef typename XprType::Scalar Scalar;
   typedef traits<XprType> XprTraits;
   typedef typename XprTraits::StorageKind StorageKind;
@@ -314,61 +272,54 @@
   typedef typename XprTraits::PointerType PointerType;
 };
 
-template<typename StartIndices, typename Sizes, typename XprType>
-struct eval<TensorSlicingOp<StartIndices, Sizes, XprType>, Eigen::Dense>
-{
-  typedef const TensorSlicingOp<StartIndices, Sizes, XprType>EIGEN_DEVICE_REF type;
+template <typename StartIndices, typename Sizes, typename XprType>
+struct eval<TensorSlicingOp<StartIndices, Sizes, XprType>, Eigen::Dense> {
+  typedef const TensorSlicingOp<StartIndices, Sizes, XprType> EIGEN_DEVICE_REF type;
 };
 
-template<typename StartIndices, typename Sizes, typename XprType>
-struct nested<TensorSlicingOp<StartIndices, Sizes, XprType>, 1, typename eval<TensorSlicingOp<StartIndices, Sizes, XprType> >::type>
-{
+template <typename StartIndices, typename Sizes, typename XprType>
+struct nested<TensorSlicingOp<StartIndices, Sizes, XprType>, 1,
+              typename eval<TensorSlicingOp<StartIndices, Sizes, XprType>>::type> {
   typedef TensorSlicingOp<StartIndices, Sizes, XprType> type;
 };
 
 }  // end namespace internal
 
-
-
-template<typename StartIndices, typename Sizes, typename XprType>
-class TensorSlicingOp : public TensorBase<TensorSlicingOp<StartIndices, Sizes, XprType> >
-{
-  public:
-  typedef TensorBase<TensorSlicingOp<StartIndices, Sizes, XprType> > Base;
+template <typename StartIndices, typename Sizes, typename XprType>
+class TensorSlicingOp : public TensorBase<TensorSlicingOp<StartIndices, Sizes, XprType>> {
+ public:
+  typedef TensorBase<TensorSlicingOp<StartIndices, Sizes, XprType>> Base;
   typedef typename Eigen::internal::traits<TensorSlicingOp>::Scalar Scalar;
   typedef typename XprType::CoeffReturnType CoeffReturnType;
   typedef typename Eigen::internal::nested<TensorSlicingOp>::type Nested;
   typedef typename Eigen::internal::traits<TensorSlicingOp>::StorageKind StorageKind;
   typedef typename Eigen::internal::traits<TensorSlicingOp>::Index Index;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorSlicingOp(const XprType& expr, const StartIndices& indices, const Sizes& sizes)
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorSlicingOp(const XprType& expr, const StartIndices& indices,
+                                                        const Sizes& sizes)
       : m_xpr(expr), m_indices(indices), m_sizes(sizes) {}
 
-    EIGEN_DEVICE_FUNC
-    const StartIndices& startIndices() const { return m_indices; }
-    EIGEN_DEVICE_FUNC
-    const Sizes& sizes() const { return m_sizes; }
+  EIGEN_DEVICE_FUNC const StartIndices& startIndices() const { return m_indices; }
+  EIGEN_DEVICE_FUNC const Sizes& sizes() const { return m_sizes; }
 
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<typename XprType::Nested>&
-    expression() const { return m_xpr; }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename XprType::Nested>& expression() const { return m_xpr; }
 
-    EIGEN_TENSOR_INHERIT_ASSIGNMENT_OPERATORS(TensorSlicingOp)
+  EIGEN_TENSOR_INHERIT_ASSIGNMENT_OPERATORS(TensorSlicingOp)
 
-  protected:
-    typename XprType::Nested m_xpr;
-    const StartIndices m_indices;
-    const Sizes m_sizes;
+ protected:
+  typename XprType::Nested m_xpr;
+  const StartIndices m_indices;
+  const Sizes m_sizes;
 };
 
-
 namespace internal {
 
 // Fixme: figure out the exact threshold
-template <typename Index, typename Device, bool BlockAccess> struct MemcpyTriggerForSlicing {
-  EIGEN_DEVICE_FUNC MemcpyTriggerForSlicing(const Device& device) : threshold_(2 * device.numThreads()) { }
-  EIGEN_DEVICE_FUNC bool operator ()(Index total, Index contiguous) const {
-    const bool prefer_block_evaluation = BlockAccess && total > 32*1024;
+template <typename Index, typename Device, bool BlockAccess>
+struct MemcpyTriggerForSlicing {
+  EIGEN_DEVICE_FUNC MemcpyTriggerForSlicing(const Device& device) : threshold_(2 * device.numThreads()) {}
+  EIGEN_DEVICE_FUNC bool operator()(Index total, Index contiguous) const {
+    const bool prefer_block_evaluation = BlockAccess && total > 32 * 1024;
     return !prefer_block_evaluation && contiguous > threshold_;
   }
 
@@ -379,27 +330,28 @@
 // It is very expensive to start the memcpy kernel on GPU: we therefore only
 // use it for large copies.
 #ifdef EIGEN_USE_GPU
-template <typename Index, bool BlockAccess> struct MemcpyTriggerForSlicing<Index, GpuDevice, BlockAccess>  {
-  EIGEN_DEVICE_FUNC MemcpyTriggerForSlicing(const GpuDevice&) { }
-  EIGEN_DEVICE_FUNC bool operator ()(Index, Index contiguous) const { return contiguous > 4*1024*1024; }
+template <typename Index, bool BlockAccess>
+struct MemcpyTriggerForSlicing<Index, GpuDevice, BlockAccess> {
+  EIGEN_DEVICE_FUNC MemcpyTriggerForSlicing(const GpuDevice&) {}
+  EIGEN_DEVICE_FUNC bool operator()(Index, Index contiguous) const { return contiguous > 4 * 1024 * 1024; }
 };
 #endif
 
 // It is very expensive to start the memcpy kernel on GPU: we therefore only
 // use it for large copies.
 #ifdef EIGEN_USE_SYCL
-template <typename Index, bool BlockAccess> struct MemcpyTriggerForSlicing<Index, Eigen::SyclDevice, BlockAccess>  {
-  EIGEN_DEVICE_FUNC MemcpyTriggerForSlicing(const SyclDevice&) { }
-  EIGEN_DEVICE_FUNC bool operator ()(Index, Index contiguous) const { return contiguous > 4*1024*1024; }
+template <typename Index, bool BlockAccess>
+struct MemcpyTriggerForSlicing<Index, Eigen::SyclDevice, BlockAccess> {
+  EIGEN_DEVICE_FUNC MemcpyTriggerForSlicing(const SyclDevice&) {}
+  EIGEN_DEVICE_FUNC bool operator()(Index, Index contiguous) const { return contiguous > 4 * 1024 * 1024; }
 };
 #endif
 
 }  // namespace internal
 
 // Eval as rvalue
-template<typename StartIndices, typename Sizes, typename ArgType, typename Device>
-struct TensorEvaluator<const TensorSlicingOp<StartIndices, Sizes, ArgType>, Device>
-{
+template <typename StartIndices, typename Sizes, typename ArgType, typename Device>
+struct TensorEvaluator<const TensorSlicingOp<StartIndices, Sizes, ArgType>, Device> {
   typedef TensorSlicingOp<StartIndices, Sizes, ArgType> XprType;
   static constexpr int NumDims = internal::array_size<Sizes>::value;
 
@@ -416,14 +368,14 @@
   enum {
     // Alignment can't be guaranteed at compile time since it depends on the
     // slice offsets and sizes.
-    IsAligned         = false,
-    PacketAccess      = TensorEvaluator<ArgType, Device>::PacketAccess,
-    BlockAccess       = TensorEvaluator<ArgType, Device>::BlockAccess &&
-                        // FIXME: Temporary workaround for bug in slicing of bool tensors.
-                        !internal::is_same<std::remove_const_t<Scalar>, bool>::value,
+    IsAligned = false,
+    PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
+    BlockAccess = TensorEvaluator<ArgType, Device>::BlockAccess &&
+                  // FIXME: Temporary workaround for bug in slicing of bool tensors.
+                  !internal::is_same<std::remove_const_t<Scalar>, bool>::value,
     PreferBlockAccess = true,
-    CoordAccess       = false,
-    RawAccess         = false
+    CoordAccess = false,
+    RawAccess = false
   };
 
   typedef std::remove_const_t<Scalar> ScalarNoConst;
@@ -433,19 +385,15 @@
   typedef internal::TensorBlockScratchAllocator<Device> TensorBlockScratch;
 
   // Tensor slicing does not change the block type.
-  typedef typename TensorEvaluator<const ArgType, Device>::TensorBlock
-      TensorBlock;
+  typedef typename TensorEvaluator<const ArgType, Device>::TensorBlock TensorBlock;
   //===--------------------------------------------------------------------===//
 
   EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
-      : m_impl(op.expression(), device), m_device(device), m_dimensions(op.sizes()), m_offsets(op.startIndices())
-  {
+      : m_impl(op.expression(), device), m_device(device), m_dimensions(op.sizes()), m_offsets(op.startIndices()) {
     m_is_identity = true;
     for (int i = 0; i < internal::array_size<Dimensions>::value; ++i) {
-      eigen_assert(m_impl.dimensions()[i] >=
-                   op.sizes()[i] + op.startIndices()[i]);
-      if (m_impl.dimensions()[i] != op.sizes()[i] ||
-          op.startIndices()[i] != 0) {
+      eigen_assert(m_impl.dimensions()[i] >= op.sizes()[i] + op.startIndices()[i]);
+      if (m_impl.dimensions()[i] != op.sizes()[i] || op.startIndices()[i] != 0) {
         m_is_identity = false;
       }
     }
@@ -458,25 +406,25 @@
     if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
       m_inputStrides[0] = 1;
       for (int i = 1; i < NumDims; ++i) {
-        m_inputStrides[i] = m_inputStrides[i-1] * input_dims[i-1];
+        m_inputStrides[i] = m_inputStrides[i - 1] * input_dims[i - 1];
       }
 
-     // Don't initialize m_fastOutputStrides[0] since it won't ever be accessed.
+      // Don't initialize m_fastOutputStrides[0] since it won't ever be accessed.
       m_outputStrides[0] = 1;
       for (int i = 1; i < NumDims; ++i) {
-        m_outputStrides[i] = m_outputStrides[i-1] * output_dims[i-1];
+        m_outputStrides[i] = m_outputStrides[i - 1] * output_dims[i - 1];
         m_fastOutputStrides[i] = internal::TensorIntDivisor<Index>(m_outputStrides[i] > 0 ? m_outputStrides[i] : 1);
       }
     } else {
-      m_inputStrides[NumDims-1] = 1;
+      m_inputStrides[NumDims - 1] = 1;
       for (int i = NumDims - 2; i >= 0; --i) {
-        m_inputStrides[i] = m_inputStrides[i+1] * input_dims[i+1];
+        m_inputStrides[i] = m_inputStrides[i + 1] * input_dims[i + 1];
       }
 
-     // Don't initialize m_fastOutputStrides[NumDims-1] since it won't ever be accessed.
-      m_outputStrides[NumDims-1] = 1;
+      // Don't initialize m_fastOutputStrides[NumDims-1] since it won't ever be accessed.
+      m_outputStrides[NumDims - 1] = 1;
       for (int i = NumDims - 2; i >= 0; --i) {
-        m_outputStrides[i] = m_outputStrides[i+1] * output_dims[i+1];
+        m_outputStrides[i] = m_outputStrides[i + 1] * output_dims[i + 1];
         m_fastOutputStrides[i] = internal::TensorIntDivisor<Index>(m_outputStrides[i] > 0 ? m_outputStrides[i] : 1);
       }
     }
@@ -486,8 +434,7 @@
 
   EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType data) {
     m_impl.evalSubExprsIfNeeded(NULL);
-    if (!NumTraits<std::remove_const_t<Scalar>>::RequireInitialization
-        && data && m_impl.data()) {
+    if (!NumTraits<std::remove_const_t<Scalar>>::RequireInitialization && data && m_impl.data()) {
       Index contiguous_values = 1;
       if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
         for (int i = 0; i < NumDims; ++i) {
@@ -497,7 +444,7 @@
           }
         }
       } else {
-        for (int i = NumDims-1; i >= 0; --i) {
+        for (int i = NumDims - 1; i >= 0; --i) {
           contiguous_values *= dimensions()[i];
           if (dimensions()[i] != m_impl.dimensions()[i]) {
             break;
@@ -510,7 +457,8 @@
         EvaluatorPointerType src = (EvaluatorPointerType)m_impl.data();
         for (Index i = 0; i < internal::array_prod(dimensions()); i += contiguous_values) {
           Index offset = srcCoeff(i);
-          m_device.memcpy((void*)(m_device.get(data + i)), m_device.get(src+offset), contiguous_values * sizeof(Scalar));
+          m_device.memcpy((void*)(m_device.get(data + i)), m_device.get(src + offset),
+                          contiguous_values * sizeof(Scalar));
         }
         return false;
       }
@@ -520,18 +468,14 @@
 
 #ifdef EIGEN_USE_THREADS
   template <typename EvalSubExprsCallback>
-  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(
-      EvaluatorPointerType /*data*/, EvalSubExprsCallback done) {
+  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(EvaluatorPointerType /*data*/, EvalSubExprsCallback done) {
     m_impl.evalSubExprsIfNeededAsync(nullptr, [done](bool) { done(true); });
   }
 #endif  // EIGEN_USE_THREADS
 
-  EIGEN_STRONG_INLINE void cleanup() {
-    m_impl.cleanup();
-  }
+  EIGEN_STRONG_INLINE void cleanup() { m_impl.cleanup(); }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
     if (m_is_identity) {
       return m_impl.coeff(index);
     } else {
@@ -539,12 +483,11 @@
     }
   }
 
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const
-  {
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const {
     const int packetSize = PacketType<CoeffReturnType, Device>::size;
     EIGEN_STATIC_ASSERT((packetSize > 1), YOU_MADE_A_PROGRAMMING_MISTAKE)
-    eigen_assert(index+packetSize-1 < internal::array_prod(dimensions()));
+    eigen_assert(index + packetSize - 1 < internal::array_prod(dimensions()));
 
     if (m_is_identity) {
       return m_impl.template packet<LoadMode>(index);
@@ -574,20 +517,19 @@
         indices[0] -= idx0 * m_outputStrides[i];
         indices[1] -= idx1 * m_outputStrides[i];
       }
-      inputIndices[0] += (indices[0] + m_offsets[NumDims-1]);
-      inputIndices[1] += (indices[1] + m_offsets[NumDims-1]);
+      inputIndices[0] += (indices[0] + m_offsets[NumDims - 1]);
+      inputIndices[1] += (indices[1] + m_offsets[NumDims - 1]);
     }
     if (inputIndices[1] - inputIndices[0] == packetSize - 1) {
       PacketReturnType rslt = m_impl.template packet<Unaligned>(inputIndices[0]);
       return rslt;
-    }
-    else {
+    } else {
       EIGEN_ALIGN_MAX std::remove_const_t<CoeffReturnType> values[packetSize];
       values[0] = m_impl.coeff(inputIndices[0]);
-      values[packetSize-1] = m_impl.coeff(inputIndices[1]);
+      values[packetSize - 1] = m_impl.coeff(inputIndices[1]);
       EIGEN_UNROLL_LOOP
-      for (int i = 1; i < packetSize-1; ++i) {
-        values[i] = coeff(index+i);
+      for (int i = 1; i < packetSize - 1; ++i) {
+        values[i] = coeff(index + i);
       }
       PacketReturnType rslt = internal::pload<PacketReturnType>(values);
       return rslt;
@@ -598,17 +540,14 @@
     return m_impl.costPerCoeff(vectorized) + TensorOpCost(0, 0, m_is_identity ? 1 : NumDims);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  internal::TensorBlockResourceRequirements getResourceRequirements() const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE internal::TensorBlockResourceRequirements getResourceRequirements() const {
     const size_t target_size = m_device.lastLevelCacheSize();
     return internal::TensorBlockResourceRequirements::merge(
-        internal::TensorBlockResourceRequirements::skewed<Scalar>(target_size),
-        m_impl.getResourceRequirements());
+        internal::TensorBlockResourceRequirements::skewed<Scalar>(target_size), m_impl.getResourceRequirements());
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock
-  block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
-          bool /*root_of_expr_ast*/ = false) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
+                                                          bool /*root_of_expr_ast*/ = false) const {
     TensorBlockDesc arg_desc = desc.WithOffset(srcCoeff(desc.offset()));
     TensorBlock block = m_impl.block(arg_desc, scratch);
     if (!arg_desc.HasDestinationBuffer()) desc.DropDestinationBuffer();
@@ -623,7 +562,7 @@
         for (int i = 0; i < NumDims; ++i) {
           if (m_dimensions[i] != m_impl.dimensions()[i]) {
             offset += m_offsets[i] * m_inputStrides[i];
-            for (int j = i+1; j < NumDims; ++j) {
+            for (int j = i + 1; j < NumDims; ++j) {
               if (m_dimensions[j] > 1) {
                 return NULL;
               }
@@ -636,7 +575,7 @@
         for (int i = NumDims - 1; i >= 0; --i) {
           if (m_dimensions[i] != m_impl.dimensions()[i]) {
             offset += m_offsets[i] * m_inputStrides[i];
-            for (int j = i-1; j >= 0; --j) {
+            for (int j = i - 1; j >= 0; --j) {
               if (m_dimensions[j] > 1) {
                 return NULL;
               }
@@ -652,8 +591,7 @@
   }
 
  protected:
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index srcCoeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index srcCoeff(Index index) const {
     Index inputIndex = 0;
     if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
       EIGEN_UNROLL_LOOP
@@ -670,7 +608,7 @@
         inputIndex += (idx + m_offsets[i]) * m_inputStrides[i];
         index -= idx * m_outputStrides[i];
       }
-      inputIndex += (index + m_offsets[NumDims-1]);
+      inputIndex += (index + m_offsets[NumDims - 1]);
     }
     return inputIndex;
   }
@@ -685,12 +623,10 @@
   const StartIndices m_offsets;
 };
 
-
 // Eval as lvalue
-template<typename StartIndices, typename Sizes, typename ArgType, typename Device>
+template <typename StartIndices, typename Sizes, typename ArgType, typename Device>
 struct TensorEvaluator<TensorSlicingOp<StartIndices, Sizes, ArgType>, Device>
-  : public TensorEvaluator<const TensorSlicingOp<StartIndices, Sizes, ArgType>, Device>
-{
+    : public TensorEvaluator<const TensorSlicingOp<StartIndices, Sizes, ArgType>, Device> {
   typedef TensorEvaluator<const TensorSlicingOp<StartIndices, Sizes, ArgType>, Device> Base;
   typedef TensorSlicingOp<StartIndices, Sizes, ArgType> XprType;
   static constexpr int NumDims = internal::array_size<Sizes>::value;
@@ -703,12 +639,12 @@
 
   static constexpr int Layout = TensorEvaluator<ArgType, Device>::Layout;
   enum {
-    IsAligned         = false,
-    PacketAccess      = TensorEvaluator<ArgType, Device>::PacketAccess,
-    BlockAccess       = TensorEvaluator<ArgType, Device>::BlockAccess,
+    IsAligned = false,
+    PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
+    BlockAccess = TensorEvaluator<ArgType, Device>::BlockAccess,
     PreferBlockAccess = true,
-    CoordAccess       = false,
-    RawAccess         = (NumDims == 1) & TensorEvaluator<ArgType, Device>::RawAccess
+    CoordAccess = false,
+    RawAccess = (NumDims == 1) & TensorEvaluator<ArgType, Device>::RawAccess
   };
 
   typedef std::remove_const_t<Scalar> ScalarNoConst;
@@ -718,12 +654,9 @@
   typedef internal::TensorBlockScratchAllocator<Device> TensorBlockScratch;
   //===--------------------------------------------------------------------===//
 
-  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
-    : Base(op, device)
-    { }
+  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) : Base(op, device) {}
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType& coeffRef(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType& coeffRef(Index index) const {
     if (this->m_is_identity) {
       return this->m_impl.coeffRef(index);
     } else {
@@ -731,9 +664,8 @@
     }
   }
 
-  template <int StoreMode> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  void writePacket(Index index, const PacketReturnType& x) const
-  {
+  template <int StoreMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void writePacket(Index index, const PacketReturnType& x) const {
     if (this->m_is_identity) {
       this->m_impl.template writePacket<StoreMode>(index, x);
       return;
@@ -764,36 +696,33 @@
         indices[0] -= idx0 * this->m_outputStrides[i];
         indices[1] -= idx1 * this->m_outputStrides[i];
       }
-      inputIndices[0] += (indices[0] + this->m_offsets[NumDims-1]);
-      inputIndices[1] += (indices[1] + this->m_offsets[NumDims-1]);
+      inputIndices[0] += (indices[0] + this->m_offsets[NumDims - 1]);
+      inputIndices[1] += (indices[1] + this->m_offsets[NumDims - 1]);
     }
     if (inputIndices[1] - inputIndices[0] == packetSize - 1) {
       this->m_impl.template writePacket<StoreMode>(inputIndices[0], x);
-    }
-    else {
+    } else {
       EIGEN_ALIGN_MAX CoeffReturnType values[packetSize];
       internal::pstore<CoeffReturnType, PacketReturnType>(values, x);
       this->m_impl.coeffRef(inputIndices[0]) = values[0];
-      this->m_impl.coeffRef(inputIndices[1]) = values[packetSize-1];
+      this->m_impl.coeffRef(inputIndices[1]) = values[packetSize - 1];
       EIGEN_UNROLL_LOOP
-      for (int i = 1; i < packetSize-1; ++i) {
-        this->coeffRef(index+i) = values[i];
+      for (int i = 1; i < packetSize - 1; ++i) {
+        this->coeffRef(index + i) = values[i];
       }
     }
   }
 
-  template<typename TensorBlock>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void writeBlock(
-      const TensorBlockDesc& desc, const TensorBlock& block) {
+  template <typename TensorBlock>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void writeBlock(const TensorBlockDesc& desc, const TensorBlock& block) {
     TensorBlockDesc arg_desc = desc.WithOffset(this->srcCoeff(desc.offset()));
     this->m_impl.writeBlock(arg_desc, block);
   }
 };
 
 namespace internal {
-template<typename StartIndices, typename StopIndices, typename Strides, typename XprType>
-struct traits<TensorStridingSlicingOp<StartIndices, StopIndices, Strides, XprType> > : public traits<XprType>
-{
+template <typename StartIndices, typename StopIndices, typename Strides, typename XprType>
+struct traits<TensorStridingSlicingOp<StartIndices, StopIndices, Strides, XprType>> : public traits<XprType> {
   typedef typename XprType::Scalar Scalar;
   typedef traits<XprType> XprTraits;
   typedef typename XprTraits::StorageKind StorageKind;
@@ -805,62 +734,52 @@
   typedef typename XprTraits::PointerType PointerType;
 };
 
-template<typename StartIndices, typename StopIndices, typename Strides, typename XprType>
-struct eval<TensorStridingSlicingOp<StartIndices, StopIndices, Strides, XprType>, Eigen::Dense>
-{
-  typedef const TensorStridingSlicingOp<StartIndices, StopIndices, Strides, XprType>EIGEN_DEVICE_REF type;
+template <typename StartIndices, typename StopIndices, typename Strides, typename XprType>
+struct eval<TensorStridingSlicingOp<StartIndices, StopIndices, Strides, XprType>, Eigen::Dense> {
+  typedef const TensorStridingSlicingOp<StartIndices, StopIndices, Strides, XprType> EIGEN_DEVICE_REF type;
 };
 
-template<typename StartIndices, typename StopIndices, typename Strides, typename XprType>
-struct nested<TensorStridingSlicingOp<StartIndices, StopIndices, Strides, XprType>, 1, typename eval<TensorStridingSlicingOp<StartIndices, StopIndices, Strides, XprType> >::type>
-{
+template <typename StartIndices, typename StopIndices, typename Strides, typename XprType>
+struct nested<TensorStridingSlicingOp<StartIndices, StopIndices, Strides, XprType>, 1,
+              typename eval<TensorStridingSlicingOp<StartIndices, StopIndices, Strides, XprType>>::type> {
   typedef TensorStridingSlicingOp<StartIndices, StopIndices, Strides, XprType> type;
 };
 
 }  // end namespace internal
 
-
-template<typename StartIndices, typename StopIndices, typename Strides, typename XprType>
-class TensorStridingSlicingOp : public TensorBase<TensorStridingSlicingOp<StartIndices, StopIndices, Strides, XprType> >
-{
-  public:
-  typedef TensorBase<TensorStridingSlicingOp<StartIndices, StopIndices, Strides, XprType> > Base;
+template <typename StartIndices, typename StopIndices, typename Strides, typename XprType>
+class TensorStridingSlicingOp
+    : public TensorBase<TensorStridingSlicingOp<StartIndices, StopIndices, Strides, XprType>> {
+ public:
+  typedef TensorBase<TensorStridingSlicingOp<StartIndices, StopIndices, Strides, XprType>> Base;
   typedef typename internal::traits<TensorStridingSlicingOp>::Scalar Scalar;
   typedef typename XprType::CoeffReturnType CoeffReturnType;
   typedef typename internal::nested<TensorStridingSlicingOp>::type Nested;
   typedef typename internal::traits<TensorStridingSlicingOp>::StorageKind StorageKind;
   typedef typename internal::traits<TensorStridingSlicingOp>::Index Index;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorStridingSlicingOp(
-    const XprType& expr, const StartIndices& startIndices,
-    const StopIndices& stopIndices, const Strides& strides)
-      : m_xpr(expr), m_startIndices(startIndices), m_stopIndices(stopIndices),
-        m_strides(strides) {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorStridingSlicingOp(const XprType& expr, const StartIndices& startIndices,
+                                                                const StopIndices& stopIndices, const Strides& strides)
+      : m_xpr(expr), m_startIndices(startIndices), m_stopIndices(stopIndices), m_strides(strides) {}
 
-    EIGEN_DEVICE_FUNC
-    const StartIndices& startIndices() const { return m_startIndices; }
-    EIGEN_DEVICE_FUNC
-    const StartIndices& stopIndices() const { return m_stopIndices; }
-    EIGEN_DEVICE_FUNC
-    const StartIndices& strides() const { return m_strides; }
+  EIGEN_DEVICE_FUNC const StartIndices& startIndices() const { return m_startIndices; }
+  EIGEN_DEVICE_FUNC const StartIndices& stopIndices() const { return m_stopIndices; }
+  EIGEN_DEVICE_FUNC const StartIndices& strides() const { return m_strides; }
 
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<typename XprType::Nested>&
-    expression() const { return m_xpr; }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename XprType::Nested>& expression() const { return m_xpr; }
 
-    EIGEN_TENSOR_INHERIT_ASSIGNMENT_OPERATORS(TensorStridingSlicingOp)
+  EIGEN_TENSOR_INHERIT_ASSIGNMENT_OPERATORS(TensorStridingSlicingOp)
 
-  protected:
-    typename XprType::Nested m_xpr;
-    const StartIndices m_startIndices;
-    const StopIndices m_stopIndices;
-    const Strides m_strides;
+ protected:
+  typename XprType::Nested m_xpr;
+  const StartIndices m_startIndices;
+  const StopIndices m_stopIndices;
+  const Strides m_strides;
 };
 
 // Eval as rvalue
-template<typename StartIndices, typename StopIndices, typename Strides, typename ArgType, typename Device>
-struct TensorEvaluator<const TensorStridingSlicingOp<StartIndices, StopIndices, Strides, ArgType>, Device>
-{
+template <typename StartIndices, typename StopIndices, typename Strides, typename ArgType, typename Device>
+struct TensorEvaluator<const TensorStridingSlicingOp<StartIndices, StopIndices, Strides, ArgType>, Device> {
   typedef TensorStridingSlicingOp<StartIndices, StopIndices, Strides, ArgType> XprType;
   static constexpr int NumDims = internal::array_size<Strides>::value;
   typedef typename XprType::Index Index;
@@ -887,25 +806,18 @@
   //===--------------------------------------------------------------------===//
 
   EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
-      : m_impl(op.expression(), device),
-        m_device(device),
-        m_strides(op.strides())
-  {
+      : m_impl(op.expression(), device), m_device(device), m_strides(op.strides()) {
     // Handle degenerate intervals by gracefully clamping and allowing m_dimensions to be zero
     DSizes<Index, NumDims> startIndicesClamped, stopIndicesClamped;
     for (ptrdiff_t i = 0; i < internal::array_size<Dimensions>::value; ++i) {
       eigen_assert(m_strides[i] != 0 && "0 stride is invalid");
       if (m_strides[i] > 0) {
-        startIndicesClamped[i] =
-            clamp(op.startIndices()[i], 0, m_impl.dimensions()[i]);
-        stopIndicesClamped[i] =
-            clamp(op.stopIndices()[i], 0, m_impl.dimensions()[i]);
+        startIndicesClamped[i] = clamp(op.startIndices()[i], 0, m_impl.dimensions()[i]);
+        stopIndicesClamped[i] = clamp(op.stopIndices()[i], 0, m_impl.dimensions()[i]);
       } else {
         /* implies m_strides[i] < 0 by assert */
-        startIndicesClamped[i] =
-            clamp(op.startIndices()[i], -1, m_impl.dimensions()[i] - 1);
-        stopIndicesClamped[i] =
-            clamp(op.stopIndices()[i], -1, m_impl.dimensions()[i] - 1);
+        startIndicesClamped[i] = clamp(op.startIndices()[i], -1, m_impl.dimensions()[i] - 1);
+        stopIndicesClamped[i] = clamp(op.stopIndices()[i], -1, m_impl.dimensions()[i] - 1);
       }
       m_startIndices[i] = startIndicesClamped[i];
     }
@@ -920,8 +832,7 @@
       if (interval == 0 || ((interval < 0) != (m_strides[i] < 0))) {
         m_dimensions[i] = 0;
       } else {
-        m_dimensions[i] =
-            (interval / m_strides[i]) + (interval % m_strides[i] != 0 ? 1 : 0);
+        m_dimensions[i] = (interval / m_strides[i]) + (interval % m_strides[i] != 0 ? 1 : 0);
         eigen_assert(m_dimensions[i] >= 0);
       }
       if (m_strides[i] != 1 || interval != m_impl.dimensions()[i]) {
@@ -936,7 +847,7 @@
       m_offsets[0] = startIndicesClamped[0];
       Index previousDimProduct = 1;
       for (int i = 1; i < NumDims; ++i) {
-        previousDimProduct *= input_dims[i-1];
+        previousDimProduct *= input_dims[i - 1];
         m_inputStrides[i] = previousDimProduct * m_strides[i];
         m_offsets[i] = startIndicesClamped[i] * previousDimProduct;
       }
@@ -944,22 +855,22 @@
       // Don't initialize m_fastOutputStrides[0] since it won't ever be accessed.
       m_outputStrides[0] = 1;
       for (int i = 1; i < NumDims; ++i) {
-        m_outputStrides[i] = m_outputStrides[i-1] * output_dims[i-1];
+        m_outputStrides[i] = m_outputStrides[i - 1] * output_dims[i - 1];
         m_fastOutputStrides[i] = internal::TensorIntDivisor<Index>(m_outputStrides[i] > 0 ? m_outputStrides[i] : 1);
       }
     } else {
-      m_inputStrides[NumDims-1] = m_strides[NumDims-1];
-      m_offsets[NumDims-1] = startIndicesClamped[NumDims-1];
+      m_inputStrides[NumDims - 1] = m_strides[NumDims - 1];
+      m_offsets[NumDims - 1] = startIndicesClamped[NumDims - 1];
       Index previousDimProduct = 1;
       for (int i = NumDims - 2; i >= 0; --i) {
-        previousDimProduct *= input_dims[i+1];
+        previousDimProduct *= input_dims[i + 1];
         m_inputStrides[i] = previousDimProduct * m_strides[i];
         m_offsets[i] = startIndicesClamped[i] * previousDimProduct;
       }
 
-      m_outputStrides[NumDims-1] = 1;
+      m_outputStrides[NumDims - 1] = 1;
       for (int i = NumDims - 2; i >= 0; --i) {
-        m_outputStrides[i] = m_outputStrides[i+1] * output_dims[i+1];
+        m_outputStrides[i] = m_outputStrides[i + 1] * output_dims[i + 1];
         m_fastOutputStrides[i] = internal::TensorIntDivisor<Index>(m_outputStrides[i] > 0 ? m_outputStrides[i] : 1);
       }
     }
@@ -967,18 +878,14 @@
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; }
 
-
   EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType) {
     m_impl.evalSubExprsIfNeeded(NULL);
     return true;
   }
 
-  EIGEN_STRONG_INLINE void cleanup() {
-    m_impl.cleanup();
-  }
+  EIGEN_STRONG_INLINE void cleanup() { m_impl.cleanup(); }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
     if (m_is_identity) {
       return m_impl.coeff(index);
     } else {
@@ -990,13 +897,10 @@
     return m_impl.costPerCoeff(vectorized) + TensorOpCost(0, 0, m_is_identity ? 1 : NumDims);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename Storage::Type data() const {
-    return NULL;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename Storage::Type data() const { return NULL; }
 
  protected:
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index srcCoeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index srcCoeff(Index index) const {
     Index inputIndex = 0;
     if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
       EIGEN_UNROLL_LOOP
@@ -1018,7 +922,7 @@
 
   static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index clamp(Index value, Index min, Index max) {
 #ifndef SYCL_DEVICE_ONLY
-    return numext::maxi(min, numext::mini(max,value));
+    return numext::maxi(min, numext::mini(max, value));
 #else
     return cl::sycl::clamp(value, min, max);
 #endif
@@ -1030,17 +934,16 @@
   bool m_is_identity;
   TensorEvaluator<ArgType, Device> m_impl;
   const Device EIGEN_DEVICE_REF m_device;
-  DSizes<Index, NumDims> m_startIndices; // clamped startIndices
+  DSizes<Index, NumDims> m_startIndices;  // clamped startIndices
   DSizes<Index, NumDims> m_dimensions;
-  DSizes<Index, NumDims> m_offsets; // offset in a flattened shape
+  DSizes<Index, NumDims> m_offsets;  // offset in a flattened shape
   const Strides m_strides;
 };
 
 // Eval as lvalue
-template<typename StartIndices, typename StopIndices, typename Strides, typename ArgType, typename Device>
+template <typename StartIndices, typename StopIndices, typename Strides, typename ArgType, typename Device>
 struct TensorEvaluator<TensorStridingSlicingOp<StartIndices, StopIndices, Strides, ArgType>, Device>
-  : public TensorEvaluator<const TensorStridingSlicingOp<StartIndices, StopIndices, Strides, ArgType>, Device>
-{
+    : public TensorEvaluator<const TensorStridingSlicingOp<StartIndices, StopIndices, Strides, ArgType>, Device> {
   typedef TensorEvaluator<const TensorStridingSlicingOp<StartIndices, StopIndices, Strides, ArgType>, Device> Base;
   typedef TensorStridingSlicingOp<StartIndices, StopIndices, Strides, ArgType> XprType;
   static constexpr int NumDims = internal::array_size<Strides>::value;
@@ -1059,9 +962,7 @@
   typedef internal::TensorBlockNotImplemented TensorBlock;
   //===--------------------------------------------------------------------===//
 
-  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
-    : Base(op, device)
-    { }
+  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) : Base(op, device) {}
 
   typedef typename XprType::Index Index;
   typedef typename XprType::Scalar Scalar;
@@ -1069,8 +970,7 @@
   typedef typename PacketType<CoeffReturnType, Device>::type PacketReturnType;
   typedef Strides Dimensions;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType& coeffRef(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType& coeffRef(Index index) const {
     if (this->m_is_identity) {
       return this->m_impl.coeffRef(index);
     } else {
@@ -1079,7 +979,6 @@
   }
 };
 
+}  // end namespace Eigen
 
-} // end namespace Eigen
-
-#endif // EIGEN_CXX11_TENSOR_TENSOR_MORPHING_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_MORPHING_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorPadding.h b/unsupported/Eigen/CXX11/src/Tensor/TensorPadding.h
index 8e2de59..0e8f54a 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorPadding.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorPadding.h
@@ -16,16 +16,15 @@
 namespace Eigen {
 
 /** \class TensorPadding
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Tensor padding class.
-  * At the moment only padding with a constant value is supported.
-  *
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Tensor padding class.
+ * At the moment only padding with a constant value is supported.
+ *
+ */
 namespace internal {
-template<typename PaddingDimensions, typename XprType>
-struct traits<TensorPaddingOp<PaddingDimensions, XprType> > : public traits<XprType>
-{
+template <typename PaddingDimensions, typename XprType>
+struct traits<TensorPaddingOp<PaddingDimensions, XprType> > : public traits<XprType> {
   typedef typename XprType::Scalar Scalar;
   typedef traits<XprType> XprTraits;
   typedef typename XprTraits::StorageKind StorageKind;
@@ -37,26 +36,22 @@
   typedef typename XprTraits::PointerType PointerType;
 };
 
-template<typename PaddingDimensions, typename XprType>
-struct eval<TensorPaddingOp<PaddingDimensions, XprType>, Eigen::Dense>
-{
+template <typename PaddingDimensions, typename XprType>
+struct eval<TensorPaddingOp<PaddingDimensions, XprType>, Eigen::Dense> {
   typedef const TensorPaddingOp<PaddingDimensions, XprType>& type;
 };
 
-template<typename PaddingDimensions, typename XprType>
-struct nested<TensorPaddingOp<PaddingDimensions, XprType>, 1, typename eval<TensorPaddingOp<PaddingDimensions, XprType> >::type>
-{
+template <typename PaddingDimensions, typename XprType>
+struct nested<TensorPaddingOp<PaddingDimensions, XprType>, 1,
+              typename eval<TensorPaddingOp<PaddingDimensions, XprType> >::type> {
   typedef TensorPaddingOp<PaddingDimensions, XprType> type;
 };
 
 }  // end namespace internal
 
-
-
-template<typename PaddingDimensions, typename XprType>
-class TensorPaddingOp : public TensorBase<TensorPaddingOp<PaddingDimensions, XprType>, ReadOnlyAccessors>
-{
-  public:
+template <typename PaddingDimensions, typename XprType>
+class TensorPaddingOp : public TensorBase<TensorPaddingOp<PaddingDimensions, XprType>, ReadOnlyAccessors> {
+ public:
   typedef typename Eigen::internal::traits<TensorPaddingOp>::Scalar Scalar;
   typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
   typedef typename XprType::CoeffReturnType CoeffReturnType;
@@ -64,29 +59,24 @@
   typedef typename Eigen::internal::traits<TensorPaddingOp>::StorageKind StorageKind;
   typedef typename Eigen::internal::traits<TensorPaddingOp>::Index Index;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorPaddingOp(const XprType& expr, const PaddingDimensions& padding_dims, const Scalar padding_value)
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorPaddingOp(const XprType& expr, const PaddingDimensions& padding_dims,
+                                                        const Scalar padding_value)
       : m_xpr(expr), m_padding_dims(padding_dims), m_padding_value(padding_value) {}
 
-    EIGEN_DEVICE_FUNC
-    const PaddingDimensions& padding() const { return m_padding_dims; }
-    EIGEN_DEVICE_FUNC
-    Scalar padding_value() const { return m_padding_value; }
+  EIGEN_DEVICE_FUNC const PaddingDimensions& padding() const { return m_padding_dims; }
+  EIGEN_DEVICE_FUNC Scalar padding_value() const { return m_padding_value; }
 
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<typename XprType::Nested>&
-    expression() const { return m_xpr; }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename XprType::Nested>& expression() const { return m_xpr; }
 
-  protected:
-    typename XprType::Nested m_xpr;
-    const PaddingDimensions m_padding_dims;
-    const Scalar m_padding_value;
+ protected:
+  typename XprType::Nested m_xpr;
+  const PaddingDimensions m_padding_dims;
+  const Scalar m_padding_value;
 };
 
-
 // Eval as rvalue
-template<typename PaddingDimensions, typename ArgType, typename Device>
-struct TensorEvaluator<const TensorPaddingOp<PaddingDimensions, ArgType>, Device>
-{
+template <typename PaddingDimensions, typename ArgType, typename Device>
+struct TensorEvaluator<const TensorPaddingOp<PaddingDimensions, ArgType>, Device> {
   typedef TensorPaddingOp<PaddingDimensions, ArgType> XprType;
   typedef typename XprType::Index Index;
   static constexpr int NumDims = internal::array_size<PaddingDimensions>::value;
@@ -100,12 +90,12 @@
 
   static constexpr int Layout = TensorEvaluator<ArgType, Device>::Layout;
   enum {
-    IsAligned         = true,
-    PacketAccess      = TensorEvaluator<ArgType, Device>::PacketAccess,
-    BlockAccess       = TensorEvaluator<ArgType, Device>::RawAccess,
+    IsAligned = true,
+    PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
+    BlockAccess = TensorEvaluator<ArgType, Device>::RawAccess,
     PreferBlockAccess = true,
-    CoordAccess       = true,
-    RawAccess         = false
+    CoordAccess = true,
+    RawAccess = false
   };
 
   typedef std::remove_const_t<Scalar> ScalarNoConst;
@@ -114,14 +104,11 @@
   typedef internal::TensorBlockDescriptor<NumDims, Index> TensorBlockDesc;
   typedef internal::TensorBlockScratchAllocator<Device> TensorBlockScratch;
 
-  typedef typename internal::TensorMaterializedBlock<ScalarNoConst, NumDims,
-                                                     Layout, Index>
-      TensorBlock;
+  typedef typename internal::TensorMaterializedBlock<ScalarNoConst, NumDims, Layout, Index> TensorBlock;
   //===--------------------------------------------------------------------===//
 
   EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
-      : m_impl(op.expression(), device), m_padding(op.padding()), m_paddingValue(op.padding_value()), m_device(device)
-  {
+      : m_impl(op.expression(), device), m_padding(op.padding()), m_paddingValue(op.padding_value()), m_device(device) {
     // The padding op doesn't change the rank of the tensor. Directly padding a scalar would lead
     // to a vector, which doesn't make sense. Instead one should reshape the scalar into a vector
     // of 1 element first and then pad.
@@ -137,16 +124,16 @@
       m_inputStrides[0] = 1;
       m_outputStrides[0] = 1;
       for (int i = 1; i < NumDims; ++i) {
-        m_inputStrides[i] = m_inputStrides[i-1] * input_dims[i-1];
-        m_outputStrides[i] = m_outputStrides[i-1] * m_dimensions[i-1];
+        m_inputStrides[i] = m_inputStrides[i - 1] * input_dims[i - 1];
+        m_outputStrides[i] = m_outputStrides[i - 1] * m_dimensions[i - 1];
       }
-      m_outputStrides[NumDims] = m_outputStrides[NumDims-1] * m_dimensions[NumDims-1];
+      m_outputStrides[NumDims] = m_outputStrides[NumDims - 1] * m_dimensions[NumDims - 1];
     } else {
       m_inputStrides[NumDims - 1] = 1;
       m_outputStrides[NumDims] = 1;
       for (int i = NumDims - 2; i >= 0; --i) {
-        m_inputStrides[i] = m_inputStrides[i+1] * input_dims[i+1];
-        m_outputStrides[i+1] = m_outputStrides[i+2] * m_dimensions[i+1];
+        m_inputStrides[i] = m_inputStrides[i + 1] * input_dims[i + 1];
+        m_outputStrides[i + 1] = m_outputStrides[i + 2] * m_dimensions[i + 1];
       }
       m_outputStrides[0] = m_outputStrides[1] * m_dimensions[0];
     }
@@ -161,18 +148,14 @@
 
 #ifdef EIGEN_USE_THREADS
   template <typename EvalSubExprsCallback>
-  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(
-      EvaluatorPointerType, EvalSubExprsCallback done) {
+  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(EvaluatorPointerType, EvalSubExprsCallback done) {
     m_impl.evalSubExprsIfNeededAsync(nullptr, [done](bool) { done(true); });
   }
 #endif  // EIGEN_USE_THREADS
 
-  EIGEN_STRONG_INLINE void cleanup() {
-    m_impl.cleanup();
-  }
+  EIGEN_STRONG_INLINE void cleanup() { m_impl.cleanup(); }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
     eigen_assert(index < dimensions().TotalSize());
     Index inputIndex = 0;
     if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
@@ -192,24 +175,23 @@
     } else {
       EIGEN_UNROLL_LOOP
       for (int i = 0; i < NumDims - 1; ++i) {
-        const Index idx = index / m_outputStrides[i+1];
+        const Index idx = index / m_outputStrides[i + 1];
         if (isPaddingAtIndexForDim(idx, i)) {
           return m_paddingValue;
         }
         inputIndex += (idx - m_padding[i].first) * m_inputStrides[i];
-        index -= idx * m_outputStrides[i+1];
+        index -= idx * m_outputStrides[i + 1];
       }
-      if (isPaddingAtIndexForDim(index, NumDims-1)) {
+      if (isPaddingAtIndexForDim(index, NumDims - 1)) {
         return m_paddingValue;
       }
-      inputIndex += (index - m_padding[NumDims-1].first);
+      inputIndex += (index - m_padding[NumDims - 1].first);
     }
     return m_impl.coeff(inputIndex);
   }
 
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const
-  {
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const {
     if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
       return packetColMajor(index);
     }
@@ -220,31 +202,25 @@
     TensorOpCost cost = m_impl.costPerCoeff(vectorized);
     if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
       EIGEN_UNROLL_LOOP
-      for (int i = 0; i < NumDims; ++i)
-        updateCostPerDimension(cost, i, i == 0);
+      for (int i = 0; i < NumDims; ++i) updateCostPerDimension(cost, i, i == 0);
     } else {
       EIGEN_UNROLL_LOOP
-      for (int i = NumDims - 1; i >= 0; --i)
-        updateCostPerDimension(cost, i, i == NumDims - 1);
+      for (int i = NumDims - 1; i >= 0; --i) updateCostPerDimension(cost, i, i == NumDims - 1);
     }
     return cost;
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  internal::TensorBlockResourceRequirements getResourceRequirements() const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE internal::TensorBlockResourceRequirements getResourceRequirements() const {
     const size_t target_size = m_device.lastLevelCacheSize();
     return internal::TensorBlockResourceRequirements::merge(
-        internal::TensorBlockResourceRequirements::skewed<Scalar>(target_size),
-        m_impl.getResourceRequirements());
+        internal::TensorBlockResourceRequirements::skewed<Scalar>(target_size), m_impl.getResourceRequirements());
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock
-  block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
-          bool /*root_of_expr_ast*/ = false) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
+                                                          bool /*root_of_expr_ast*/ = false) const {
     // If one of the dimensions is zero, return empty block view.
     if (desc.size() == 0) {
-      return TensorBlock(internal::TensorBlockKind::kView, NULL,
-                           desc.dimensions());
+      return TensorBlock(internal::TensorBlockKind::kView, NULL, desc.dimensions());
     }
 
     static const bool IsColMajor = Layout == static_cast<int>(ColMajor);
@@ -282,8 +258,7 @@
     // same dimensions as the requested block (for destination buffer this
     // property is guaranteed by `desc.destination()`).
     Index output_offset = 0;
-    const DSizes<Index, NumDims> output_strides =
-        internal::strides<Layout>(desc.dimensions());
+    const DSizes<Index, NumDims> output_strides = internal::strides<Layout>(desc.dimensions());
 
     // NOTE(ezhulenev): We initialize bock iteration state for `NumDims - 1`
     // dimensions, skipping innermost dimension. In theory it should be possible
@@ -306,8 +281,7 @@
       it[i].output_span = it[i].output_stride * (it[i].size - 1);
     }
 
-    const Index input_inner_dim_size =
-        static_cast<Index>(m_impl.dimensions()[inner_dim_idx]);
+    const Index input_inner_dim_size = static_cast<Index>(m_impl.dimensions()[inner_dim_idx]);
 
     // Total output size.
     const Index output_size = desc.size();
@@ -321,8 +295,7 @@
     // dimension.
     const Index output_inner_pad_before_size =
         input_offsets[inner_dim_idx] < 0
-            ? numext::mini(numext::abs(input_offsets[inner_dim_idx]),
-                           output_inner_dim_size)
+            ? numext::mini(numext::abs(input_offsets[inner_dim_idx]), output_inner_dim_size)
             : 0;
 
     // How many values we can actually copy from the input inner dimension.
@@ -330,22 +303,18 @@
         // Want to copy from input.
         (output_inner_dim_size - output_inner_pad_before_size),
         // Can copy from input.
-        numext::maxi(input_inner_dim_size - (input_offsets[inner_dim_idx] +
-                                             output_inner_pad_before_size),
-                     Index(0)));
+        numext::maxi(input_inner_dim_size - (input_offsets[inner_dim_idx] + output_inner_pad_before_size), Index(0)));
 
     eigen_assert(output_inner_copy_size >= 0);
 
     // How many values to fill with padding AFTER reading from the input inner
     // dimension.
     const Index output_inner_pad_after_size =
-        (output_inner_dim_size - output_inner_copy_size -
-         output_inner_pad_before_size);
+        (output_inner_dim_size - output_inner_copy_size - output_inner_pad_before_size);
 
     // Sanity check, sum of all sizes must be equal to the output size.
     eigen_assert(output_inner_dim_size ==
-                 (output_inner_pad_before_size + output_inner_copy_size +
-                  output_inner_pad_after_size));
+                 (output_inner_pad_before_size + output_inner_copy_size + output_inner_pad_after_size));
 
     // Keep track of current coordinates and padding in the output.
     DSizes<Index, NumDims> output_coord = output_offsets;
@@ -358,8 +327,7 @@
     typedef internal::StridedLinearBufferCopy<ScalarNoConst, Index> LinCopy;
 
     // Prepare storage for the materialized padding result.
-    const typename TensorBlock::Storage block_storage =
-        TensorBlock::prepareStorage(desc, scratch);
+    const typename TensorBlock::Storage block_storage = TensorBlock::prepareStorage(desc, scratch);
 
     // TODO(ezhulenev): Squeeze multiple non-padded inner dimensions into a
     // single logical inner dimension.
@@ -367,12 +335,11 @@
     // When possible we squeeze writes for the innermost (only if non-padded)
     // dimension with the first padded dimension. This allows to reduce the
     // number of calls to LinCopy and better utilize vector instructions.
-    const bool squeeze_writes =
-        NumDims > 1 &&
-        // inner dimension is not padded
-        (input_inner_dim_size == m_dimensions[inner_dim_idx]) &&
-        // and equal to the block inner dimension
-        (input_inner_dim_size == output_inner_dim_size);
+    const bool squeeze_writes = NumDims > 1 &&
+                                // inner dimension is not padded
+                                (input_inner_dim_size == m_dimensions[inner_dim_idx]) &&
+                                // and equal to the block inner dimension
+                                (input_inner_dim_size == output_inner_dim_size);
 
     const int squeeze_dim = IsColMajor ? inner_dim_idx + 1 : inner_dim_idx - 1;
 
@@ -380,11 +347,9 @@
     const Index squeeze_max_coord =
         squeeze_writes ? numext::mini(
                              // max non-padded element in the input
-                             static_cast<Index>(m_dimensions[squeeze_dim] -
-                                                m_padding[squeeze_dim].second),
+                             static_cast<Index>(m_dimensions[squeeze_dim] - m_padding[squeeze_dim].second),
                              // max element in the output buffer
-                             static_cast<Index>(output_offsets[squeeze_dim] +
-                                                desc.dimension(squeeze_dim)))
+                             static_cast<Index>(output_offsets[squeeze_dim] + desc.dimension(squeeze_dim)))
                        : static_cast<Index>(0);
 
     // Iterate copying data from `m_impl.data()` to the output buffer.
@@ -401,11 +366,9 @@
         // Fill single innermost dimension with padding value.
         size += output_inner_dim_size;
 
-        LinCopy::template Run<LinCopy::Kind::FillLinear>(
-            typename LinCopy::Dst(output_offset, 1, block_storage.data()),
-            typename LinCopy::Src(0, 0, &m_paddingValue),
-            output_inner_dim_size);
-
+        LinCopy::template Run<LinCopy::Kind::FillLinear>(typename LinCopy::Dst(output_offset, 1, block_storage.data()),
+                                                         typename LinCopy::Src(0, 0, &m_paddingValue),
+                                                         output_inner_dim_size);
 
       } else if (squeeze_writes) {
         // Squeeze multiple reads from innermost dimensions.
@@ -413,10 +376,9 @@
         size += output_inner_dim_size * squeeze_num;
 
         // Copy `squeeze_num` inner dimensions from input to output.
-        LinCopy::template Run<LinCopy::Kind::Linear>(
-            typename LinCopy::Dst(output_offset, 1, block_storage.data()),
-            typename LinCopy::Src(input_offset, 1, m_impl.data()),
-            output_inner_dim_size * squeeze_num);
+        LinCopy::template Run<LinCopy::Kind::Linear>(typename LinCopy::Dst(output_offset, 1, block_storage.data()),
+                                                     typename LinCopy::Src(input_offset, 1, m_impl.data()),
+                                                     output_inner_dim_size * squeeze_num);
 
         // Update iteration state for only `squeeze_num - 1` processed inner
         // dimensions, because we have another iteration state update at the end
@@ -434,10 +396,9 @@
         {  // Fill with padding before copying from input inner dimension.
           const Index out = output_offset;
 
-          LinCopy::template Run<LinCopy::Kind::FillLinear>(
-              typename LinCopy::Dst(out, 1, block_storage.data()),
-              typename LinCopy::Src(0, 0, &m_paddingValue),
-              output_inner_pad_before_size);
+          LinCopy::template Run<LinCopy::Kind::FillLinear>(typename LinCopy::Dst(out, 1, block_storage.data()),
+                                                           typename LinCopy::Src(0, 0, &m_paddingValue),
+                                                           output_inner_pad_before_size);
         }
 
         {  // Copy data from input inner dimension.
@@ -446,20 +407,17 @@
 
           eigen_assert(output_inner_copy_size == 0 || m_impl.data() != NULL);
 
-          LinCopy::template Run<LinCopy::Kind::Linear>(
-              typename LinCopy::Dst(out, 1, block_storage.data()),
-              typename LinCopy::Src(in, 1, m_impl.data()),
-              output_inner_copy_size);
+          LinCopy::template Run<LinCopy::Kind::Linear>(typename LinCopy::Dst(out, 1, block_storage.data()),
+                                                       typename LinCopy::Src(in, 1, m_impl.data()),
+                                                       output_inner_copy_size);
         }
 
         {  // Fill with padding after copying from input inner dimension.
-          const Index out = output_offset + output_inner_pad_before_size +
-                            output_inner_copy_size;
+          const Index out = output_offset + output_inner_pad_before_size + output_inner_copy_size;
 
-          LinCopy::template Run<LinCopy::Kind::FillLinear>(
-              typename LinCopy::Dst(out, 1, block_storage.data()),
-              typename LinCopy::Src(0, 0, &m_paddingValue),
-              output_inner_pad_after_size);
+          LinCopy::template Run<LinCopy::Kind::FillLinear>(typename LinCopy::Dst(out, 1, block_storage.data()),
+                                                           typename LinCopy::Src(0, 0, &m_paddingValue),
+                                                           output_inner_pad_after_size);
         }
       }
 
@@ -488,13 +446,7 @@
 
  private:
   struct BlockIteratorState {
-    BlockIteratorState()
-        : count(0),
-          size(0),
-          input_stride(0),
-          input_span(0),
-          output_stride(0),
-          output_span(0) {}
+    BlockIteratorState() : count(0), size(0), input_stride(0), input_span(0), output_stride(0), output_span(0) {}
 
     Index count;
     Index size;
@@ -504,48 +456,39 @@
     Index output_span;
   };
 
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool isPaddingAtIndexForDim(
-      Index index, int dim_index) const {
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool isPaddingAtIndexForDim(Index index, int dim_index) const {
     return (!internal::index_pair_first_statically_eq<PaddingDimensions>(dim_index, 0) &&
             index < m_padding[dim_index].first) ||
-        (!internal::index_pair_second_statically_eq<PaddingDimensions>(dim_index, 0) &&
-         index >= m_dimensions[dim_index] - m_padding[dim_index].second);
+           (!internal::index_pair_second_statically_eq<PaddingDimensions>(dim_index, 0) &&
+            index >= m_dimensions[dim_index] - m_padding[dim_index].second);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool isLeftPaddingCompileTimeZero(
-      int dim_index) const {
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool isLeftPaddingCompileTimeZero(int dim_index) const {
     return internal::index_pair_first_statically_eq<PaddingDimensions>(dim_index, 0);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool isRightPaddingCompileTimeZero(
-      int dim_index) const {
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool isRightPaddingCompileTimeZero(int dim_index) const {
     return internal::index_pair_second_statically_eq<PaddingDimensions>(dim_index, 0);
   }
 
-
   void updateCostPerDimension(TensorOpCost& cost, int i, bool first) const {
     const double in = static_cast<double>(m_impl.dimensions()[i]);
     const double out = in + m_padding[i].first + m_padding[i].second;
-    if (out == 0)
-      return;
+    if (out == 0) return;
     const double reduction = in / out;
     cost *= reduction;
     if (first) {
-      cost += TensorOpCost(0, 0, 2 * TensorOpCost::AddCost<Index>() +
-                    reduction * (1 * TensorOpCost::AddCost<Index>()));
+      cost += TensorOpCost(0, 0, 2 * TensorOpCost::AddCost<Index>() + reduction * (1 * TensorOpCost::AddCost<Index>()));
     } else {
-      cost += TensorOpCost(0, 0, 2 * TensorOpCost::AddCost<Index>() +
-                                 2 * TensorOpCost::MulCost<Index>() +
-                    reduction * (2 * TensorOpCost::MulCost<Index>() +
-                                 1 * TensorOpCost::DivCost<Index>()));
+      cost += TensorOpCost(0, 0,
+                           2 * TensorOpCost::AddCost<Index>() + 2 * TensorOpCost::MulCost<Index>() +
+                               reduction * (2 * TensorOpCost::MulCost<Index>() + 1 * TensorOpCost::DivCost<Index>()));
     }
   }
 
  protected:
-
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packetColMajor(Index index) const
-  {
-    eigen_assert(index+PacketSize-1 < dimensions().TotalSize());
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packetColMajor(Index index) const {
+    eigen_assert(index + PacketSize - 1 < dimensions().TotalSize());
 
     const Index initialIndex = index;
     Index inputIndex = 0;
@@ -555,23 +498,21 @@
       const Index lastIdx = index + PacketSize - 1;
       const Index lastPaddedLeft = m_padding[i].first * m_outputStrides[i];
       const Index firstPaddedRight = (m_dimensions[i] - m_padding[i].second) * m_outputStrides[i];
-      const Index lastPaddedRight = m_outputStrides[i+1];
+      const Index lastPaddedRight = m_outputStrides[i + 1];
 
       if (!isLeftPaddingCompileTimeZero(i) && lastIdx < lastPaddedLeft) {
         // all the coefficient are in the padding zone.
         return internal::pset1<PacketReturnType>(m_paddingValue);
-      }
-      else if (!isRightPaddingCompileTimeZero(i) && firstIdx >= firstPaddedRight && lastIdx < lastPaddedRight) {
+      } else if (!isRightPaddingCompileTimeZero(i) && firstIdx >= firstPaddedRight && lastIdx < lastPaddedRight) {
         // all the coefficient are in the padding zone.
         return internal::pset1<PacketReturnType>(m_paddingValue);
-      }
-      else if ((isLeftPaddingCompileTimeZero(i) && isRightPaddingCompileTimeZero(i)) || (firstIdx >= lastPaddedLeft && lastIdx < firstPaddedRight)) {
+      } else if ((isLeftPaddingCompileTimeZero(i) && isRightPaddingCompileTimeZero(i)) ||
+                 (firstIdx >= lastPaddedLeft && lastIdx < firstPaddedRight)) {
         // all the coefficient are between the 2 padding zones.
         const Index idx = index / m_outputStrides[i];
         inputIndex += (idx - m_padding[i].first) * m_inputStrides[i];
         index -= idx * m_outputStrides[i];
-      }
-      else {
+      } else {
         // Every other case
         return packetWithPossibleZero(initialIndex);
       }
@@ -586,12 +527,11 @@
     if (!isLeftPaddingCompileTimeZero(0) && lastIdx < lastPaddedLeft) {
       // all the coefficient are in the padding zone.
       return internal::pset1<PacketReturnType>(m_paddingValue);
-    }
-    else if (!isRightPaddingCompileTimeZero(0) && firstIdx >= firstPaddedRight && lastIdx < lastPaddedRight) {
+    } else if (!isRightPaddingCompileTimeZero(0) && firstIdx >= firstPaddedRight && lastIdx < lastPaddedRight) {
       // all the coefficient are in the padding zone.
       return internal::pset1<PacketReturnType>(m_paddingValue);
-    }
-    else if ((isLeftPaddingCompileTimeZero(0) && isRightPaddingCompileTimeZero(0)) || (firstIdx >= lastPaddedLeft && lastIdx < firstPaddedRight)) {
+    } else if ((isLeftPaddingCompileTimeZero(0) && isRightPaddingCompileTimeZero(0)) ||
+               (firstIdx >= lastPaddedLeft && lastIdx < firstPaddedRight)) {
       // all the coefficient are between the 2 padding zones.
       inputIndex += (index - m_padding[0].first);
       return m_impl.template packet<Unaligned>(inputIndex);
@@ -600,9 +540,8 @@
     return packetWithPossibleZero(initialIndex);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packetRowMajor(Index index) const
-  {
-    eigen_assert(index+PacketSize-1 < dimensions().TotalSize());
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packetRowMajor(Index index) const {
+    eigen_assert(index + PacketSize - 1 < dimensions().TotalSize());
 
     const Index initialIndex = index;
     Index inputIndex = 0;
@@ -610,25 +549,23 @@
     for (int i = 0; i < NumDims - 1; ++i) {
       const Index firstIdx = index;
       const Index lastIdx = index + PacketSize - 1;
-      const Index lastPaddedLeft = m_padding[i].first * m_outputStrides[i+1];
-      const Index firstPaddedRight = (m_dimensions[i] - m_padding[i].second) * m_outputStrides[i+1];
+      const Index lastPaddedLeft = m_padding[i].first * m_outputStrides[i + 1];
+      const Index firstPaddedRight = (m_dimensions[i] - m_padding[i].second) * m_outputStrides[i + 1];
       const Index lastPaddedRight = m_outputStrides[i];
 
       if (!isLeftPaddingCompileTimeZero(i) && lastIdx < lastPaddedLeft) {
         // all the coefficient are in the padding zone.
         return internal::pset1<PacketReturnType>(m_paddingValue);
-      }
-      else if (!isRightPaddingCompileTimeZero(i) && firstIdx >= firstPaddedRight && lastIdx < lastPaddedRight) {
+      } else if (!isRightPaddingCompileTimeZero(i) && firstIdx >= firstPaddedRight && lastIdx < lastPaddedRight) {
         // all the coefficient are in the padding zone.
         return internal::pset1<PacketReturnType>(m_paddingValue);
-      }
-      else if ((isLeftPaddingCompileTimeZero(i) && isRightPaddingCompileTimeZero(i)) || (firstIdx >= lastPaddedLeft && lastIdx < firstPaddedRight)) {
+      } else if ((isLeftPaddingCompileTimeZero(i) && isRightPaddingCompileTimeZero(i)) ||
+                 (firstIdx >= lastPaddedLeft && lastIdx < firstPaddedRight)) {
         // all the coefficient are between the 2 padding zones.
-        const Index idx = index / m_outputStrides[i+1];
+        const Index idx = index / m_outputStrides[i + 1];
         inputIndex += (idx - m_padding[i].first) * m_inputStrides[i];
-        index -= idx * m_outputStrides[i+1];
-      }
-      else {
+        index -= idx * m_outputStrides[i + 1];
+      } else {
         // Every other case
         return packetWithPossibleZero(initialIndex);
       }
@@ -636,40 +573,39 @@
 
     const Index lastIdx = index + PacketSize - 1;
     const Index firstIdx = index;
-    const Index lastPaddedLeft = m_padding[NumDims-1].first;
-    const Index firstPaddedRight = (m_dimensions[NumDims-1] - m_padding[NumDims-1].second);
-    const Index lastPaddedRight = m_outputStrides[NumDims-1];
+    const Index lastPaddedLeft = m_padding[NumDims - 1].first;
+    const Index firstPaddedRight = (m_dimensions[NumDims - 1] - m_padding[NumDims - 1].second);
+    const Index lastPaddedRight = m_outputStrides[NumDims - 1];
 
-    if (!isLeftPaddingCompileTimeZero(NumDims-1) && lastIdx < lastPaddedLeft) {
+    if (!isLeftPaddingCompileTimeZero(NumDims - 1) && lastIdx < lastPaddedLeft) {
       // all the coefficient are in the padding zone.
       return internal::pset1<PacketReturnType>(m_paddingValue);
-    }
-    else if (!isRightPaddingCompileTimeZero(NumDims-1) && firstIdx >= firstPaddedRight && lastIdx < lastPaddedRight) {
+    } else if (!isRightPaddingCompileTimeZero(NumDims - 1) && firstIdx >= firstPaddedRight &&
+               lastIdx < lastPaddedRight) {
       // all the coefficient are in the padding zone.
       return internal::pset1<PacketReturnType>(m_paddingValue);
-    }
-    else if ((isLeftPaddingCompileTimeZero(NumDims-1) && isRightPaddingCompileTimeZero(NumDims-1)) || (firstIdx >= lastPaddedLeft && lastIdx < firstPaddedRight)) {
+    } else if ((isLeftPaddingCompileTimeZero(NumDims - 1) && isRightPaddingCompileTimeZero(NumDims - 1)) ||
+               (firstIdx >= lastPaddedLeft && lastIdx < firstPaddedRight)) {
       // all the coefficient are between the 2 padding zones.
-      inputIndex += (index - m_padding[NumDims-1].first);
+      inputIndex += (index - m_padding[NumDims - 1].first);
       return m_impl.template packet<Unaligned>(inputIndex);
     }
     // Every other case
     return packetWithPossibleZero(initialIndex);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packetWithPossibleZero(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packetWithPossibleZero(Index index) const {
     EIGEN_ALIGN_MAX std::remove_const_t<CoeffReturnType> values[PacketSize];
     EIGEN_UNROLL_LOOP
     for (int i = 0; i < PacketSize; ++i) {
-      values[i] = coeff(index+i);
+      values[i] = coeff(index + i);
     }
     PacketReturnType rslt = internal::pload<PacketReturnType>(values);
     return rslt;
   }
 
   Dimensions m_dimensions;
-  array<Index, NumDims+1> m_outputStrides;
+  array<Index, NumDims + 1> m_outputStrides;
   array<Index, NumDims> m_inputStrides;
   TensorEvaluator<ArgType, Device> m_impl;
   PaddingDimensions m_padding;
@@ -679,9 +615,6 @@
   const Device EIGEN_DEVICE_REF m_device;
 };
 
+}  // end namespace Eigen
 
-
-
-} // end namespace Eigen
-
-#endif // EIGEN_CXX11_TENSOR_TENSOR_PADDING_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_PADDING_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorPatch.h b/unsupported/Eigen/CXX11/src/Tensor/TensorPatch.h
index 149de12..7b33f1f 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorPatch.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorPatch.h
@@ -16,16 +16,15 @@
 namespace Eigen {
 
 /** \class TensorPatch
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Tensor patch class.
-  *
-  *
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Tensor patch class.
+ *
+ *
+ */
 namespace internal {
-template<typename PatchDim, typename XprType>
-struct traits<TensorPatchOp<PatchDim, XprType> > : public traits<XprType>
-{
+template <typename PatchDim, typename XprType>
+struct traits<TensorPatchOp<PatchDim, XprType> > : public traits<XprType> {
   typedef typename XprType::Scalar Scalar;
   typedef traits<XprType> XprTraits;
   typedef typename XprTraits::StorageKind StorageKind;
@@ -37,26 +36,21 @@
   typedef typename XprTraits::PointerType PointerType;
 };
 
-template<typename PatchDim, typename XprType>
-struct eval<TensorPatchOp<PatchDim, XprType>, Eigen::Dense>
-{
+template <typename PatchDim, typename XprType>
+struct eval<TensorPatchOp<PatchDim, XprType>, Eigen::Dense> {
   typedef const TensorPatchOp<PatchDim, XprType>& type;
 };
 
-template<typename PatchDim, typename XprType>
-struct nested<TensorPatchOp<PatchDim, XprType>, 1, typename eval<TensorPatchOp<PatchDim, XprType> >::type>
-{
+template <typename PatchDim, typename XprType>
+struct nested<TensorPatchOp<PatchDim, XprType>, 1, typename eval<TensorPatchOp<PatchDim, XprType> >::type> {
   typedef TensorPatchOp<PatchDim, XprType> type;
 };
 
 }  // end namespace internal
 
-
-
-template<typename PatchDim, typename XprType>
-class TensorPatchOp : public TensorBase<TensorPatchOp<PatchDim, XprType>, ReadOnlyAccessors>
-{
-  public:
+template <typename PatchDim, typename XprType>
+class TensorPatchOp : public TensorBase<TensorPatchOp<PatchDim, XprType>, ReadOnlyAccessors> {
+ public:
   typedef typename Eigen::internal::traits<TensorPatchOp>::Scalar Scalar;
   typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
   typedef typename XprType::CoeffReturnType CoeffReturnType;
@@ -67,23 +61,18 @@
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorPatchOp(const XprType& expr, const PatchDim& patch_dims)
       : m_xpr(expr), m_patch_dims(patch_dims) {}
 
-    EIGEN_DEVICE_FUNC
-    const PatchDim& patch_dims() const { return m_patch_dims; }
+  EIGEN_DEVICE_FUNC const PatchDim& patch_dims() const { return m_patch_dims; }
 
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<typename XprType::Nested>&
-    expression() const { return m_xpr; }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename XprType::Nested>& expression() const { return m_xpr; }
 
-  protected:
-    typename XprType::Nested m_xpr;
-    const PatchDim m_patch_dims;
+ protected:
+  typename XprType::Nested m_xpr;
+  const PatchDim m_patch_dims;
 };
 
-
 // Eval as rvalue
-template<typename PatchDim, typename ArgType, typename Device>
-struct TensorEvaluator<const TensorPatchOp<PatchDim, ArgType>, Device>
-{
+template <typename PatchDim, typename ArgType, typename Device>
+struct TensorEvaluator<const TensorPatchOp<PatchDim, ArgType>, Device> {
   typedef TensorPatchOp<PatchDim, ArgType> XprType;
   typedef typename XprType::Index Index;
   static constexpr int NumDims = internal::array_size<typename TensorEvaluator<ArgType, Device>::Dimensions>::value + 1;
@@ -103,51 +92,49 @@
     PreferBlockAccess = TensorEvaluator<ArgType, Device>::PreferBlockAccess,
     CoordAccess = false,
     RawAccess = false
- };
+  };
 
   //===- Tensor block evaluation strategy (see TensorBlock.h) -------------===//
   typedef internal::TensorBlockNotImplemented TensorBlock;
   //===--------------------------------------------------------------------===//
 
-  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
-      : m_impl(op.expression(), device)
-  {
+  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) : m_impl(op.expression(), device) {
     Index num_patches = 1;
     const typename TensorEvaluator<ArgType, Device>::Dimensions& input_dims = m_impl.dimensions();
     const PatchDim& patch_dims = op.patch_dims();
     if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
-      for (int i = 0; i < NumDims-1; ++i) {
+      for (int i = 0; i < NumDims - 1; ++i) {
         m_dimensions[i] = patch_dims[i];
         num_patches *= (input_dims[i] - patch_dims[i] + 1);
       }
-      m_dimensions[NumDims-1] = num_patches;
+      m_dimensions[NumDims - 1] = num_patches;
 
       m_inputStrides[0] = 1;
       m_patchStrides[0] = 1;
-      for (int i = 1; i < NumDims-1; ++i) {
-        m_inputStrides[i] = m_inputStrides[i-1] * input_dims[i-1];
-        m_patchStrides[i] = m_patchStrides[i-1] * (input_dims[i-1] - patch_dims[i-1] + 1);
+      for (int i = 1; i < NumDims - 1; ++i) {
+        m_inputStrides[i] = m_inputStrides[i - 1] * input_dims[i - 1];
+        m_patchStrides[i] = m_patchStrides[i - 1] * (input_dims[i - 1] - patch_dims[i - 1] + 1);
       }
       m_outputStrides[0] = 1;
       for (int i = 1; i < NumDims; ++i) {
-        m_outputStrides[i] = m_outputStrides[i-1] * m_dimensions[i-1];
+        m_outputStrides[i] = m_outputStrides[i - 1] * m_dimensions[i - 1];
       }
     } else {
-      for (int i = 0; i < NumDims-1; ++i) {
-        m_dimensions[i+1] = patch_dims[i];
+      for (int i = 0; i < NumDims - 1; ++i) {
+        m_dimensions[i + 1] = patch_dims[i];
         num_patches *= (input_dims[i] - patch_dims[i] + 1);
       }
       m_dimensions[0] = num_patches;
 
-      m_inputStrides[NumDims-2] = 1;
-      m_patchStrides[NumDims-2] = 1;
-      for (int i = NumDims-3; i >= 0; --i) {
-        m_inputStrides[i] = m_inputStrides[i+1] * input_dims[i+1];
-        m_patchStrides[i] = m_patchStrides[i+1] * (input_dims[i+1] - patch_dims[i+1] + 1);
+      m_inputStrides[NumDims - 2] = 1;
+      m_patchStrides[NumDims - 2] = 1;
+      for (int i = NumDims - 3; i >= 0; --i) {
+        m_inputStrides[i] = m_inputStrides[i + 1] * input_dims[i + 1];
+        m_patchStrides[i] = m_patchStrides[i + 1] * (input_dims[i + 1] - patch_dims[i + 1] + 1);
       }
-      m_outputStrides[NumDims-1] = 1;
-      for (int i = NumDims-2; i >= 0; --i) {
-        m_outputStrides[i] = m_outputStrides[i+1] * m_dimensions[i+1];
+      m_outputStrides[NumDims - 1] = 1;
+      for (int i = NumDims - 2; i >= 0; --i) {
+        m_outputStrides[i] = m_outputStrides[i + 1] * m_dimensions[i + 1];
       }
     }
   }
@@ -159,12 +146,9 @@
     return true;
   }
 
-  EIGEN_STRONG_INLINE void cleanup() {
-    m_impl.cleanup();
-  }
+  EIGEN_STRONG_INLINE void cleanup() { m_impl.cleanup(); }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
     Index output_stride_index = (static_cast<int>(Layout) == static_cast<int>(ColMajor)) ? NumDims - 1 : 0;
     // Find the location of the first element of the patch.
     Index patchIndex = index / m_outputStrides[output_stride_index];
@@ -185,8 +169,8 @@
       for (int i = 0; i < NumDims - 2; ++i) {
         const Index patchIdx = patchIndex / m_patchStrides[i];
         patchIndex -= patchIdx * m_patchStrides[i];
-        const Index offsetIdx = patchOffset / m_outputStrides[i+1];
-        patchOffset -= offsetIdx * m_outputStrides[i+1];
+        const Index offsetIdx = patchOffset / m_outputStrides[i + 1];
+        patchOffset -= offsetIdx * m_outputStrides[i + 1];
         inputIndex += (patchIdx + offsetIdx) * m_inputStrides[i];
       }
     }
@@ -194,10 +178,9 @@
     return m_impl.coeff(inputIndex);
   }
 
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const
-  {
-    eigen_assert(index+PacketSize-1 < dimensions().TotalSize());
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const {
+    eigen_assert(index + PacketSize - 1 < dimensions().TotalSize());
 
     Index output_stride_index = (static_cast<int>(Layout) == static_cast<int>(ColMajor)) ? NumDims - 1 : 0;
     Index indices[2] = {index, index + PacketSize - 1};
@@ -210,13 +193,11 @@
     if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
       EIGEN_UNROLL_LOOP
       for (int i = NumDims - 2; i > 0; --i) {
-        const Index patchIdx[2] = {patchIndices[0] / m_patchStrides[i],
-                                   patchIndices[1] / m_patchStrides[i]};
+        const Index patchIdx[2] = {patchIndices[0] / m_patchStrides[i], patchIndices[1] / m_patchStrides[i]};
         patchIndices[0] -= patchIdx[0] * m_patchStrides[i];
         patchIndices[1] -= patchIdx[1] * m_patchStrides[i];
 
-        const Index offsetIdx[2] = {patchOffsets[0] / m_outputStrides[i],
-                                    patchOffsets[1] / m_outputStrides[i]};
+        const Index offsetIdx[2] = {patchOffsets[0] / m_outputStrides[i], patchOffsets[1] / m_outputStrides[i]};
         patchOffsets[0] -= offsetIdx[0] * m_outputStrides[i];
         patchOffsets[1] -= offsetIdx[1] * m_outputStrides[i];
 
@@ -226,15 +207,13 @@
     } else {
       EIGEN_UNROLL_LOOP
       for (int i = 0; i < NumDims - 2; ++i) {
-        const Index patchIdx[2] = {patchIndices[0] / m_patchStrides[i],
-                                   patchIndices[1] / m_patchStrides[i]};
+        const Index patchIdx[2] = {patchIndices[0] / m_patchStrides[i], patchIndices[1] / m_patchStrides[i]};
         patchIndices[0] -= patchIdx[0] * m_patchStrides[i];
         patchIndices[1] -= patchIdx[1] * m_patchStrides[i];
 
-        const Index offsetIdx[2] = {patchOffsets[0] / m_outputStrides[i+1],
-                                    patchOffsets[1] / m_outputStrides[i+1]};
-        patchOffsets[0] -= offsetIdx[0] * m_outputStrides[i+1];
-        patchOffsets[1] -= offsetIdx[1] * m_outputStrides[i+1];
+        const Index offsetIdx[2] = {patchOffsets[0] / m_outputStrides[i + 1], patchOffsets[1] / m_outputStrides[i + 1]};
+        patchOffsets[0] -= offsetIdx[0] * m_outputStrides[i + 1];
+        patchOffsets[1] -= offsetIdx[1] * m_outputStrides[i + 1];
 
         inputIndices[0] += (patchIdx[0] + offsetIdx[0]) * m_inputStrides[i];
         inputIndices[1] += (patchIdx[1] + offsetIdx[1]) * m_inputStrides[i];
@@ -246,14 +225,13 @@
     if (inputIndices[1] - inputIndices[0] == PacketSize - 1) {
       PacketReturnType rslt = m_impl.template packet<Unaligned>(inputIndices[0]);
       return rslt;
-    }
-    else {
+    } else {
       EIGEN_ALIGN_MAX CoeffReturnType values[PacketSize];
       values[0] = m_impl.coeff(inputIndices[0]);
-      values[PacketSize-1] = m_impl.coeff(inputIndices[1]);
+      values[PacketSize - 1] = m_impl.coeff(inputIndices[1]);
       EIGEN_UNROLL_LOOP
-      for (int i = 1; i < PacketSize-1; ++i) {
-        values[i] = coeff(index+i);
+      for (int i = 1; i < PacketSize - 1; ++i) {
+        values[i] = coeff(index + i);
       }
       PacketReturnType rslt = internal::pload<PacketReturnType>(values);
       return rslt;
@@ -261,11 +239,9 @@
   }
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const {
-    const double compute_cost = NumDims * (TensorOpCost::DivCost<Index>() +
-                                           TensorOpCost::MulCost<Index>() +
+    const double compute_cost = NumDims * (TensorOpCost::DivCost<Index>() + TensorOpCost::MulCost<Index>() +
                                            2 * TensorOpCost::AddCost<Index>());
-    return m_impl.costPerCoeff(vectorized) +
-           TensorOpCost(0, 0, compute_cost, vectorized, PacketSize);
+    return m_impl.costPerCoeff(vectorized) + TensorOpCost(0, 0, compute_cost, vectorized, PacketSize);
   }
 
   EIGEN_DEVICE_FUNC EvaluatorPointerType data() const { return NULL; }
@@ -273,13 +249,12 @@
  protected:
   Dimensions m_dimensions;
   array<Index, NumDims> m_outputStrides;
-  array<Index, NumDims-1> m_inputStrides;
-  array<Index, NumDims-1> m_patchStrides;
+  array<Index, NumDims - 1> m_inputStrides;
+  array<Index, NumDims - 1> m_patchStrides;
 
   TensorEvaluator<ArgType, Device> m_impl;
-
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_CXX11_TENSOR_TENSOR_PATCH_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_PATCH_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorRandom.h b/unsupported/Eigen/CXX11/src/Tensor/TensorRandom.h
index cb3a95d..19404fe 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorRandom.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorRandom.h
@@ -22,8 +22,7 @@
   // We don't support 3d kernels since we currently only use 1 and
   // 2d kernels.
   gpu_assert(threadIdx.z == 0);
-  return blockIdx.x * blockDim.x + threadIdx.x 
-         + gridDim.x * blockDim.x * (blockIdx.y * blockDim.y + threadIdx.y);
+  return blockIdx.x * blockDim.x + threadIdx.x + gridDim.x * blockDim.x * (blockIdx.y * blockDim.y + threadIdx.y);
 #else
   // Rely on Eigen's random implementation.
   return random<uint64_t>();
@@ -44,15 +43,14 @@
   return seed * 6364136223846793005ULL + 0xda3e39cb94b95bdbULL;
 }
 
-template <typename T> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-T RandomToTypeUniform(uint64_t* state, uint64_t stream) {
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T RandomToTypeUniform(uint64_t* state, uint64_t stream) {
   unsigned rnd = PCG_XSH_RS_generator(state, stream);
   return static_cast<T>(rnd);
 }
 
-
-template <> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-Eigen::half RandomToTypeUniform<Eigen::half>(uint64_t* state, uint64_t stream) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Eigen::half RandomToTypeUniform<Eigen::half>(uint64_t* state, uint64_t stream) {
   // Generate 10 random bits for the mantissa, merge with exponent.
   unsigned rnd = PCG_XSH_RS_generator(state, stream);
   const uint16_t half_bits = static_cast<uint16_t>(rnd & 0x3ffu) | (static_cast<uint16_t>(15) << 10);
@@ -61,9 +59,9 @@
   return result - Eigen::half(1.0f);
 }
 
-template <> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-Eigen::bfloat16 RandomToTypeUniform<Eigen::bfloat16>(uint64_t* state, uint64_t stream) {
-
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Eigen::bfloat16 RandomToTypeUniform<Eigen::bfloat16>(uint64_t* state,
+                                                                                           uint64_t stream) {
   // Generate 7 random bits for the mantissa, merge with exponent.
   unsigned rnd = PCG_XSH_RS_generator(state, stream);
   const uint16_t half_bits = static_cast<uint16_t>(rnd & 0x7fu) | (static_cast<uint16_t>(127) << 7);
@@ -72,8 +70,8 @@
   return result - Eigen::bfloat16(1.0f);
 }
 
-template <> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-float RandomToTypeUniform<float>(uint64_t* state, uint64_t stream) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float RandomToTypeUniform<float>(uint64_t* state, uint64_t stream) {
   typedef union {
     uint32_t raw;
     float fp;
@@ -88,8 +86,8 @@
   return result.fp - 1.0f;
 }
 
-template <> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-double RandomToTypeUniform<double>(uint64_t* state, uint64_t stream) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double RandomToTypeUniform<double>(uint64_t* state, uint64_t stream) {
   typedef union {
     uint64_t raw;
     double dp;
@@ -108,75 +106,74 @@
   return result.dp - 1.0;
 }
 
-template <> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-std::complex<float> RandomToTypeUniform<std::complex<float> >(uint64_t* state, uint64_t stream) {
-  return std::complex<float>(RandomToTypeUniform<float>(state, stream),
-                             RandomToTypeUniform<float>(state, stream));
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<float> RandomToTypeUniform<std::complex<float> >(uint64_t* state,
+                                                                                                    uint64_t stream) {
+  return std::complex<float>(RandomToTypeUniform<float>(state, stream), RandomToTypeUniform<float>(state, stream));
 }
-template <> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-std::complex<double> RandomToTypeUniform<std::complex<double> >(uint64_t* state, uint64_t stream) {
-  return std::complex<double>(RandomToTypeUniform<double>(state, stream),
-                              RandomToTypeUniform<double>(state, stream));
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<double> RandomToTypeUniform<std::complex<double> >(uint64_t* state,
+                                                                                                      uint64_t stream) {
+  return std::complex<double>(RandomToTypeUniform<double>(state, stream), RandomToTypeUniform<double>(state, stream));
 }
 
-template <typename T> class UniformRandomGenerator {
+template <typename T>
+class UniformRandomGenerator {
  public:
   static constexpr bool PacketAccess = true;
 
   // Uses the given "seed" if non-zero, otherwise uses a random seed.
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE UniformRandomGenerator(
-      uint64_t seed = 0) {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE UniformRandomGenerator(uint64_t seed = 0) {
     m_state = PCG_XSH_RS_state(seed);
-    #ifdef EIGEN_USE_SYCL
+#ifdef EIGEN_USE_SYCL
     // In SYCL it is not possible to build PCG_XSH_RS_state in one step.
     // Therefore, we need two steps to initializate the m_state.
     // IN SYCL, the constructor of the functor is s called on the CPU
     // and we get the clock seed here from the CPU. However, This seed is
-    //the same for all the thread. As unlike CUDA, the thread.ID, BlockID, etc is not a global function.
+    // the same for all the thread. As unlike CUDA, the thread.ID, BlockID, etc is not a global function.
     // and only  available on the Operator() function (which is called on the GPU).
-    // Thus for CUDA (((CLOCK  + global_thread_id)* 6364136223846793005ULL) + 0xda3e39cb94b95bdbULL) is passed to each thread
-    // but for SYCL ((CLOCK * 6364136223846793005ULL) + 0xda3e39cb94b95bdbULL) is passed to each thread and each thread adds
-    // the  (global_thread_id* 6364136223846793005ULL) for itself only once, in order to complete the construction
-    // similar to CUDA Therefore, the thread Id injection is not available at this stage.
-    //However when the operator() is called the thread ID will be available. So inside the opeator,
+    // Thus for CUDA (((CLOCK  + global_thread_id)* 6364136223846793005ULL) + 0xda3e39cb94b95bdbULL) is passed to each
+    // thread but for SYCL ((CLOCK * 6364136223846793005ULL) + 0xda3e39cb94b95bdbULL) is passed to each thread and each
+    // thread adds the  (global_thread_id* 6364136223846793005ULL) for itself only once, in order to complete the
+    // construction similar to CUDA Therefore, the thread Id injection is not available at this stage.
+    // However when the operator() is called the thread ID will be available. So inside the opeator,
     // we add the thrreadID, BlockId,... (which is equivalent of i)
-    //to the seed and construct the unique m_state per thead similar to cuda.
-    m_exec_once =false;
-   #endif
+    // to the seed and construct the unique m_state per thead similar to cuda.
+    m_exec_once = false;
+#endif
   }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE UniformRandomGenerator(
-      const UniformRandomGenerator& other) {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE UniformRandomGenerator(const UniformRandomGenerator& other) {
     m_state = other.m_state;
-    #ifdef EIGEN_USE_SYCL
-     m_exec_once =other.m_exec_once;
-    #endif
+#ifdef EIGEN_USE_SYCL
+    m_exec_once = other.m_exec_once;
+#endif
   }
 
-  template<typename Index> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  T operator()(Index i) const {
-    #ifdef EIGEN_USE_SYCL
-      if(!m_exec_once) {
+  template <typename Index>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T operator()(Index i) const {
+#ifdef EIGEN_USE_SYCL
+    if (!m_exec_once) {
       // This is the second stage of adding thread Id to the CPU clock seed and build unique seed per thread
       // The (i * 6364136223846793005ULL) is the remaining part of the PCG_XSH_RS_state on the GPU side
-       m_state += (i * 6364136223846793005ULL);
-       m_exec_once =true;
-      }
-    #endif
+      m_state += (i * 6364136223846793005ULL);
+      m_exec_once = true;
+    }
+#endif
     T result = RandomToTypeUniform<T>(&m_state, i);
     return result;
   }
 
-  template<typename Packet, typename Index> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Packet packetOp(Index i) const {
+  template <typename Packet, typename Index>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(Index i) const {
     const int packetSize = internal::unpacket_traits<Packet>::size;
     EIGEN_ALIGN_MAX T values[packetSize];
-      #ifdef EIGEN_USE_SYCL
-      if(!m_exec_once) {
+#ifdef EIGEN_USE_SYCL
+    if (!m_exec_once) {
       // This is the second stage of adding thread Id to the CPU clock seed and build unique seed per thread
-       m_state += (i * 6364136223846793005ULL);
-       m_exec_once =true;
-      }
-    #endif
+      m_state += (i * 6364136223846793005ULL);
+      m_exec_once = true;
+    }
+#endif
     EIGEN_UNROLL_LOOP
     for (int j = 0; j < packetSize; ++j) {
       values[j] = RandomToTypeUniform<T>(&m_state, i);
@@ -186,25 +183,22 @@
 
  private:
   mutable uint64_t m_state;
-  #ifdef EIGEN_USE_SYCL
+#ifdef EIGEN_USE_SYCL
   mutable bool m_exec_once;
-  #endif
+#endif
 };
 
 template <typename Scalar>
 struct functor_traits<UniformRandomGenerator<Scalar> > {
   enum {
     // Rough estimate for floating point, multiplied by ceil(sizeof(T) / sizeof(float)).
-    Cost = 12 * NumTraits<Scalar>::AddCost *
-           ((sizeof(Scalar) + sizeof(float) - 1) / sizeof(float)),
+    Cost = 12 * NumTraits<Scalar>::AddCost * ((sizeof(Scalar) + sizeof(float) - 1) / sizeof(float)),
     PacketAccess = UniformRandomGenerator<Scalar>::PacketAccess
   };
 };
 
-
-
-template <typename T> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-T RandomToTypeNormal(uint64_t* state, uint64_t stream) {
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T RandomToTypeNormal(uint64_t* state, uint64_t stream) {
   // Use the ratio of uniform method to generate numbers following a normal
   // distribution. See for example Numerical Recipes chapter 7.3.9 for the
   // details.
@@ -214,78 +208,76 @@
     v = T(1.7156) * (RandomToTypeUniform<T>(state, stream) - T(0.5));
     const T x = u - T(0.449871);
     const T y = numext::abs(v) + T(0.386595);
-    q = x*x + y * (T(0.196)*y - T(0.25472)*x);
-  } while (q > T(0.27597) &&
-           (q > T(0.27846) || v*v > T(-4) * numext::log(u) * u*u));
+    q = x * x + y * (T(0.196) * y - T(0.25472) * x);
+  } while (q > T(0.27597) && (q > T(0.27846) || v * v > T(-4) * numext::log(u) * u * u));
 
-  return v/u;
+  return v / u;
 }
 
-template <> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-std::complex<float> RandomToTypeNormal<std::complex<float> >(uint64_t* state, uint64_t stream) {
-  return std::complex<float>(RandomToTypeNormal<float>(state, stream),
-                             RandomToTypeNormal<float>(state, stream));
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<float> RandomToTypeNormal<std::complex<float> >(uint64_t* state,
+                                                                                                   uint64_t stream) {
+  return std::complex<float>(RandomToTypeNormal<float>(state, stream), RandomToTypeNormal<float>(state, stream));
 }
-template <> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-std::complex<double> RandomToTypeNormal<std::complex<double> >(uint64_t* state, uint64_t stream) {
-  return std::complex<double>(RandomToTypeNormal<double>(state, stream),
-                              RandomToTypeNormal<double>(state, stream));
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::complex<double> RandomToTypeNormal<std::complex<double> >(uint64_t* state,
+                                                                                                     uint64_t stream) {
+  return std::complex<double>(RandomToTypeNormal<double>(state, stream), RandomToTypeNormal<double>(state, stream));
 }
 
-
-template <typename T> class NormalRandomGenerator {
+template <typename T>
+class NormalRandomGenerator {
  public:
   static constexpr bool PacketAccess = true;
 
   // Uses the given "seed" if non-zero, otherwise uses a random seed.
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE NormalRandomGenerator(uint64_t seed = 0) {
     m_state = PCG_XSH_RS_state(seed);
-    #ifdef EIGEN_USE_SYCL
+#ifdef EIGEN_USE_SYCL
     // In SYCL it is not possible to build PCG_XSH_RS_state in one step.
     // Therefore, we need two steps to initializate the m_state.
     // IN SYCL, the constructor of the functor is s called on the CPU
     // and we get the clock seed here from the CPU. However, This seed is
-    //the same for all the thread. As unlike CUDA, the thread.ID, BlockID, etc is not a global function.
+    // the same for all the thread. As unlike CUDA, the thread.ID, BlockID, etc is not a global function.
     // and only  available on the Operator() function (which is called on the GPU).
     // Therefore, the thread Id injection is not available at this stage. However when the operator()
-    //is called the thread ID will be available. So inside the operator,
+    // is called the thread ID will be available. So inside the operator,
     // we add the thrreadID, BlockId,... (which is equivalent of i)
-    //to the seed and construct the unique m_state per thead similar to cuda.
-    m_exec_once =false;
-   #endif
+    // to the seed and construct the unique m_state per thead similar to cuda.
+    m_exec_once = false;
+#endif
   }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE NormalRandomGenerator(
-      const NormalRandomGenerator& other) {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE NormalRandomGenerator(const NormalRandomGenerator& other) {
     m_state = other.m_state;
 #ifdef EIGEN_USE_SYCL
-    m_exec_once=other.m_exec_once;
+    m_exec_once = other.m_exec_once;
 #endif
   }
 
- template<typename Index> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  T operator()(Index i) const {
-    #ifdef EIGEN_USE_SYCL
-    if(!m_exec_once) {
+  template <typename Index>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T operator()(Index i) const {
+#ifdef EIGEN_USE_SYCL
+    if (!m_exec_once) {
       // This is the second stage of adding thread Id to the CPU clock seed and build unique seed per thread
       m_state += (i * 6364136223846793005ULL);
-      m_exec_once =true;
+      m_exec_once = true;
     }
-    #endif
+#endif
     T result = RandomToTypeNormal<T>(&m_state, i);
     return result;
   }
 
-  template<typename Packet, typename Index> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  Packet packetOp(Index i) const {
+  template <typename Packet, typename Index>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(Index i) const {
     const int packetSize = internal::unpacket_traits<Packet>::size;
     EIGEN_ALIGN_MAX T values[packetSize];
-    #ifdef EIGEN_USE_SYCL
-    if(!m_exec_once) {
+#ifdef EIGEN_USE_SYCL
+    if (!m_exec_once) {
       // This is the second stage of adding thread Id to the CPU clock seed and build unique seed per thread
       m_state += (i * 6364136223846793005ULL);
-      m_exec_once =true;
+      m_exec_once = true;
     }
-    #endif
+#endif
     EIGEN_UNROLL_LOOP
     for (int j = 0; j < packetSize; ++j) {
       values[j] = RandomToTypeNormal<T>(&m_state, i);
@@ -295,26 +287,23 @@
 
  private:
   mutable uint64_t m_state;
-   #ifdef EIGEN_USE_SYCL
+#ifdef EIGEN_USE_SYCL
   mutable bool m_exec_once;
-  #endif
+#endif
 };
 
-
 template <typename Scalar>
 struct functor_traits<NormalRandomGenerator<Scalar> > {
   enum {
     // On average, we need to generate about 3 random numbers
     // 15 mul, 8 add, 1.5 logs
-    Cost = 3 * functor_traits<UniformRandomGenerator<Scalar> >::Cost +
-           15 * NumTraits<Scalar>::AddCost + 8 * NumTraits<Scalar>::AddCost +
-           3 * functor_traits<scalar_log_op<Scalar> >::Cost / 2,
+    Cost = 3 * functor_traits<UniformRandomGenerator<Scalar> >::Cost + 15 * NumTraits<Scalar>::AddCost +
+           8 * NumTraits<Scalar>::AddCost + 3 * functor_traits<scalar_log_op<Scalar> >::Cost / 2,
     PacketAccess = NormalRandomGenerator<Scalar>::PacketAccess
   };
 };
 
+}  // end namespace internal
+}  // end namespace Eigen
 
-} // end namespace internal
-} // end namespace Eigen
-
-#endif // EIGEN_CXX11_TENSOR_TENSOR_RANDOM_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_RANDOM_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorReduction.h b/unsupported/Eigen/CXX11/src/Tensor/TensorReduction.h
index 062a56b..86c6bf3 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorReduction.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorReduction.h
@@ -26,19 +26,16 @@
 
 namespace Eigen {
 
-
 /** \class TensorReduction
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Tensor reduction class.
-  *
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Tensor reduction class.
+ *
+ */
 
 namespace internal {
-  template<typename Op, typename Dims, typename XprType,template <class> class MakePointer_ >
-  struct traits<TensorReductionOp<Op, Dims, XprType, MakePointer_> >
- : traits<XprType>
-{
+template <typename Op, typename Dims, typename XprType, template <class> class MakePointer_>
+struct traits<TensorReductionOp<Op, Dims, XprType, MakePointer_> > : traits<XprType> {
   typedef traits<XprType> XprTraits;
   typedef typename XprTraits::Scalar Scalar;
   typedef typename XprTraits::StorageKind StorageKind;
@@ -48,31 +45,31 @@
   static constexpr int Layout = XprTraits::Layout;
   typedef typename XprTraits::PointerType PointerType;
 
-  template <class T> struct MakePointer {
+  template <class T>
+  struct MakePointer {
     // Intermediate typedef to workaround MSVC issue.
     typedef MakePointer_<T> MakePointerT;
     typedef typename MakePointerT::Type Type;
   };
 };
 
-template<typename Op, typename Dims, typename XprType, template <class> class MakePointer_>
-struct eval<TensorReductionOp<Op, Dims, XprType, MakePointer_>, Eigen::Dense>
-{
+template <typename Op, typename Dims, typename XprType, template <class> class MakePointer_>
+struct eval<TensorReductionOp<Op, Dims, XprType, MakePointer_>, Eigen::Dense> {
   typedef const TensorReductionOp<Op, Dims, XprType, MakePointer_>& type;
 };
 
-template<typename Op, typename Dims, typename XprType, template <class> class MakePointer_>
-struct nested<TensorReductionOp<Op, Dims, XprType, MakePointer_>, 1, typename eval<TensorReductionOp<Op, Dims, XprType, MakePointer_> >::type>
-{
+template <typename Op, typename Dims, typename XprType, template <class> class MakePointer_>
+struct nested<TensorReductionOp<Op, Dims, XprType, MakePointer_>, 1,
+              typename eval<TensorReductionOp<Op, Dims, XprType, MakePointer_> >::type> {
   typedef TensorReductionOp<Op, Dims, XprType, MakePointer_> type;
 };
 
-
-template <typename OutputDims> struct DimInitializer {
-  template <typename InputDims, typename ReducedDims> EIGEN_DEVICE_FUNC
-  static void run(const InputDims& input_dims,
-                  const array<bool, internal::array_size<InputDims>::value>& reduced,
-                  OutputDims* output_dims, ReducedDims* reduced_dims) {
+template <typename OutputDims>
+struct DimInitializer {
+  template <typename InputDims, typename ReducedDims>
+  EIGEN_DEVICE_FUNC static void run(const InputDims& input_dims,
+                                    const array<bool, internal::array_size<InputDims>::value>& reduced,
+                                    OutputDims* output_dims, ReducedDims* reduced_dims) {
     const int NumInputDims = internal::array_size<InputDims>::value;
     int outputIndex = 0;
     int reduceIndex = 0;
@@ -88,10 +85,11 @@
   }
 };
 
-template <> struct DimInitializer<Sizes<> > {
-  template <typename InputDims, typename Index, size_t Rank> EIGEN_DEVICE_FUNC
-  static void run(const InputDims& input_dims, const array<bool, Rank>&,
-                  Sizes<>*, array<Index, Rank>* reduced_dims) {
+template <>
+struct DimInitializer<Sizes<> > {
+  template <typename InputDims, typename Index, size_t Rank>
+  EIGEN_DEVICE_FUNC static void run(const InputDims& input_dims, const array<bool, Rank>&, Sizes<>*,
+                                    array<Index, Rank>* reduced_dims) {
     const int NumInputDims = internal::array_size<InputDims>::value;
     for (int i = 0; i < NumInputDims; ++i) {
       (*reduced_dims)[i] = input_dims[i];
@@ -99,7 +97,6 @@
   }
 };
 
-
 template <typename ReducedDims, int NumTensorDims, int Layout>
 struct are_inner_most_dims {
   static const bool value = false;
@@ -110,48 +107,48 @@
 };
 
 template <typename ReducedDims, int NumTensorDims>
-struct are_inner_most_dims<ReducedDims, NumTensorDims, ColMajor>{
+struct are_inner_most_dims<ReducedDims, NumTensorDims, ColMajor> {
   static const bool tmp1 = indices_statically_known_to_increase<ReducedDims>();
   static const bool tmp2 = index_statically_eq<ReducedDims>(0, 0);
-  static const bool tmp3 = index_statically_eq<ReducedDims>(array_size<ReducedDims>::value-1, array_size<ReducedDims>::value-1);
+  static const bool tmp3 =
+      index_statically_eq<ReducedDims>(array_size<ReducedDims>::value - 1, array_size<ReducedDims>::value - 1);
   static const bool value = tmp1 & tmp2 & tmp3;
 };
 template <typename ReducedDims, int NumTensorDims>
-struct are_inner_most_dims<ReducedDims, NumTensorDims, RowMajor>{
+struct are_inner_most_dims<ReducedDims, NumTensorDims, RowMajor> {
   static const bool tmp1 = indices_statically_known_to_increase<ReducedDims>();
   static const bool tmp2 = index_statically_eq<ReducedDims>(0, NumTensorDims - array_size<ReducedDims>::value);
   static const bool tmp3 = index_statically_eq<ReducedDims>(array_size<ReducedDims>::value - 1, NumTensorDims - 1);
   static const bool value = tmp1 & tmp2 & tmp3;
-
 };
 template <typename ReducedDims, int NumTensorDims>
-struct preserve_inner_most_dims<ReducedDims, NumTensorDims, ColMajor>{
+struct preserve_inner_most_dims<ReducedDims, NumTensorDims, ColMajor> {
   static const bool tmp1 = indices_statically_known_to_increase<ReducedDims>();
   static const bool tmp2 = index_statically_gt<ReducedDims>(0, 0);
   static const bool value = tmp1 & tmp2;
-
 };
 template <typename ReducedDims, int NumTensorDims>
-struct preserve_inner_most_dims<ReducedDims, NumTensorDims, RowMajor>{
+struct preserve_inner_most_dims<ReducedDims, NumTensorDims, RowMajor> {
   static const bool tmp1 = indices_statically_known_to_increase<ReducedDims>();
   static const bool tmp2 = index_statically_lt<ReducedDims>(array_size<ReducedDims>::value - 1, NumTensorDims - 1);
   static const bool value = tmp1 & tmp2;
 };
 
-
 template <int DimIndex, typename Self, typename Op>
 struct GenericDimReducer {
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const Self& self, typename Self::Index firstIndex, Op& reducer, typename Self::CoeffReturnType* accum) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const Self& self, typename Self::Index firstIndex,
+                                                           Op& reducer, typename Self::CoeffReturnType* accum) {
     EIGEN_STATIC_ASSERT((DimIndex > 0), YOU_MADE_A_PROGRAMMING_MISTAKE);
     for (int j = 0; j < self.m_reducedDims[DimIndex]; ++j) {
       const typename Self::Index input = firstIndex + j * self.m_reducedStrides[DimIndex];
-      GenericDimReducer<DimIndex-1, Self, Op>::reduce(self, input, reducer, accum);
+      GenericDimReducer<DimIndex - 1, Self, Op>::reduce(self, input, reducer, accum);
     }
   }
 };
 template <typename Self, typename Op>
 struct GenericDimReducer<0, Self, Op> {
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const Self& self, typename Self::Index firstIndex, Op& reducer, typename Self::CoeffReturnType* accum) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const Self& self, typename Self::Index firstIndex,
+                                                           Op& reducer, typename Self::CoeffReturnType* accum) {
     for (int j = 0; j < self.m_reducedDims[0]; ++j) {
       const typename Self::Index input = firstIndex + j * self.m_reducedStrides[0];
       reducer.reduce(self.m_impl.coeff(input), accum);
@@ -160,20 +157,21 @@
 };
 template <typename Self, typename Op>
 struct GenericDimReducer<-1, Self, Op> {
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const Self& self, typename Self::Index index, Op& reducer, typename Self::CoeffReturnType* accum) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const Self& self, typename Self::Index index, Op& reducer,
+                                                           typename Self::CoeffReturnType* accum) {
     reducer.reduce(self.m_impl.coeff(index), accum);
   }
 };
 
-template <typename Self, typename Op, bool Vectorizable = (Self::InputPacketAccess && Self::ReducerTraits::PacketAccess),
-    bool UseTreeReduction = (!Self::ReducerTraits::IsStateful &&
-                             !Self::ReducerTraits::IsExactlyAssociative &&
-                             // GPU threads can quickly run out of stack space
-                             // for moderately sized inputs.
-                             !Self::RunningOnGPU
-                             )>
+template <typename Self, typename Op,
+          bool Vectorizable = (Self::InputPacketAccess && Self::ReducerTraits::PacketAccess),
+          bool UseTreeReduction = (!Self::ReducerTraits::IsStateful && !Self::ReducerTraits::IsExactlyAssociative &&
+                                   // GPU threads can quickly run out of stack space
+                                   // for moderately sized inputs.
+                                   !Self::RunningOnGPU)>
 struct InnerMostDimReducer {
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename Self::CoeffReturnType reduce(const Self& self, typename Self::Index firstIndex, typename Self::Index numValuesToReduce, Op& reducer) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename Self::CoeffReturnType reduce(
+      const Self& self, typename Self::Index firstIndex, typename Self::Index numValuesToReduce, Op& reducer) {
     typename Self::CoeffReturnType accum = reducer.initialize();
     for (typename Self::Index j = 0; j < numValuesToReduce; ++j) {
       reducer.reduce(self.m_impl.coeff(firstIndex + j), &accum);
@@ -184,21 +182,22 @@
 
 template <typename Self, typename Op>
 struct InnerMostDimReducer<Self, Op, true, false> {
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename Self::CoeffReturnType reduce(const Self& self, typename Self::Index firstIndex, typename Self::Index numValuesToReduce, Op& reducer0) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename Self::CoeffReturnType reduce(
+      const Self& self, typename Self::Index firstIndex, typename Self::Index numValuesToReduce, Op& reducer0) {
     using Index = typename Self::Index;
     constexpr Index packetSize = internal::unpacket_traits<typename Self::PacketReturnType>::size;
     Index start = 0;
     typename Self::PacketReturnType paccum0 = reducer0.template initializePacket<typename Self::PacketReturnType>();
-    if (!Self::ReducerTraits::IsStateful && numValuesToReduce >= 4*packetSize) {
-      const Index VectorizedSize4 = (numValuesToReduce / (4*packetSize)) * (4*packetSize);
+    if (!Self::ReducerTraits::IsStateful && numValuesToReduce >= 4 * packetSize) {
+      const Index VectorizedSize4 = (numValuesToReduce / (4 * packetSize)) * (4 * packetSize);
       typename Self::PacketReturnType paccum1 = reducer0.template initializePacket<typename Self::PacketReturnType>();
       typename Self::PacketReturnType paccum2 = reducer0.template initializePacket<typename Self::PacketReturnType>();
       typename Self::PacketReturnType paccum3 = reducer0.template initializePacket<typename Self::PacketReturnType>();
       const Index offset0 = firstIndex;
       const Index offset1 = firstIndex + packetSize;
-      const Index offset2 = firstIndex + 2*packetSize;
-      const Index offset3 = firstIndex + 3*packetSize;
-      for (Index j = 0; j < VectorizedSize4; j += 4*packetSize) {
+      const Index offset2 = firstIndex + 2 * packetSize;
+      const Index offset3 = firstIndex + 3 * packetSize;
+      for (Index j = 0; j < VectorizedSize4; j += 4 * packetSize) {
         reducer0.reducePacket(self.m_impl.template packet<Unaligned>(offset0 + j), &paccum0);
         reducer0.reducePacket(self.m_impl.template packet<Unaligned>(offset1 + j), &paccum1);
         reducer0.reducePacket(self.m_impl.template packet<Unaligned>(offset2 + j), &paccum2);
@@ -224,33 +223,35 @@
   }
 };
 
-
 #if !defined(EIGEN_HIPCC)
 
 // The following implements tree-based reduction, which improves the accuracy
 // of sum and mean reductions, since each of the n inputs only participates in
 // O(log n) additions.
 template <typename T>
-EIGEN_DEVICE_FUNC inline Index LeafSize() { return 1024; }
+EIGEN_DEVICE_FUNC inline Index LeafSize() {
+  return 1024;
+}
 template <>
-EIGEN_DEVICE_FUNC inline Index LeafSize<half>() { return 200; }
+EIGEN_DEVICE_FUNC inline Index LeafSize<half>() {
+  return 200;
+}
 template <>
-EIGEN_DEVICE_FUNC inline Index LeafSize<bfloat16>() { return 128; }
+EIGEN_DEVICE_FUNC inline Index LeafSize<bfloat16>() {
+  return 128;
+}
 
 template <typename Self, typename Op>
 struct InnerMostDimReducer<Self, Op, false, true> {
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename Self::CoeffReturnType
-  reduce(const Self& self, typename Self::Index firstIndex,
-         typename Self::Index numValuesToReduce, Op& reducer) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename Self::CoeffReturnType reduce(
+      const Self& self, typename Self::Index firstIndex, typename Self::Index numValuesToReduce, Op& reducer) {
     const Index kLeafSize = LeafSize<typename Self::CoeffReturnType>();
     typename Self::CoeffReturnType accum = reducer.initialize();
     if (numValuesToReduce > kLeafSize) {
       const typename Self::Index half = numValuesToReduce / 2;
       // Recursively reduce the two halves.
       reducer.reduce(reduce(self, firstIndex, half, reducer), &accum);
-      reducer.reduce(
-          reduce(self, firstIndex + half, numValuesToReduce - half, reducer),
-          &accum);
+      reducer.reduce(reduce(self, firstIndex + half, numValuesToReduce - half, reducer), &accum);
       return reducer.finalize(accum);
     } else {
       return InnerMostDimReducer<Self, Op, false, false>::reduce(self, firstIndex, numValuesToReduce, reducer);
@@ -260,25 +261,20 @@
 
 template <typename Self, typename Op>
 struct InnerMostDimReducer<Self, Op, true, true> {
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename Self::CoeffReturnType
-  reduce(const Self& self, typename Self::Index firstIndex,
-         typename Self::Index numValuesToReduce, Op& reducer) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename Self::CoeffReturnType reduce(
+      const Self& self, typename Self::Index firstIndex, typename Self::Index numValuesToReduce, Op& reducer) {
     const Index kLeafSize = LeafSize<typename Self::CoeffReturnType>();
-    const typename Self::Index packetSize =
-        internal::unpacket_traits<typename Self::PacketReturnType>::size;
+    const typename Self::Index packetSize = internal::unpacket_traits<typename Self::PacketReturnType>::size;
     typename Self::CoeffReturnType accum = reducer.initialize();
     if (numValuesToReduce > packetSize * kLeafSize) {
       // Make sure the split point is aligned on a packet boundary.
       const typename Self::Index split =
           packetSize *
-          numext::div_ceil(firstIndex + numext::div_ceil(numValuesToReduce, typename Self::Index(2)),
-                packetSize);
-      const typename Self::Index num_left =
-          numext::mini(split - firstIndex, numValuesToReduce);
+          numext::div_ceil(firstIndex + numext::div_ceil(numValuesToReduce, typename Self::Index(2)), packetSize);
+      const typename Self::Index num_left = numext::mini(split - firstIndex, numValuesToReduce);
       reducer.reduce(reduce(self, firstIndex, num_left, reducer), &accum);
       if (num_left < numValuesToReduce) {
-        reducer.reduce(
-            reduce(self, split, numValuesToReduce - num_left, reducer), &accum);
+        reducer.reduce(reduce(self, split, numValuesToReduce - num_left, reducer), &accum);
       }
       return reducer.finalize(accum);
     } else {
@@ -288,27 +284,31 @@
 };
 #endif
 
-template <int DimIndex, typename Self, typename Op, bool vectorizable = (Self::InputPacketAccess && Self::ReducerTraits::PacketAccess)>
+template <int DimIndex, typename Self, typename Op,
+          bool vectorizable = (Self::InputPacketAccess && Self::ReducerTraits::PacketAccess)>
 struct InnerMostDimPreserver {
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const Self&, typename Self::Index, Op&, typename Self::PacketReturnType*) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const Self&, typename Self::Index, Op&,
+                                                           typename Self::PacketReturnType*) {
     eigen_assert(false && "should never be called");
   }
 };
 
 template <int DimIndex, typename Self, typename Op>
 struct InnerMostDimPreserver<DimIndex, Self, Op, true> {
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const Self& self, typename Self::Index firstIndex, Op& reducer, typename Self::PacketReturnType* accum) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const Self& self, typename Self::Index firstIndex,
+                                                           Op& reducer, typename Self::PacketReturnType* accum) {
     EIGEN_STATIC_ASSERT((DimIndex > 0), YOU_MADE_A_PROGRAMMING_MISTAKE);
     for (typename Self::Index j = 0; j < self.m_reducedDims[DimIndex]; ++j) {
       const typename Self::Index input = firstIndex + j * self.m_reducedStrides[DimIndex];
-      InnerMostDimPreserver<DimIndex-1, Self, Op>::reduce(self, input, reducer, accum);
+      InnerMostDimPreserver<DimIndex - 1, Self, Op>::reduce(self, input, reducer, accum);
     }
   }
 };
 
 template <typename Self, typename Op>
 struct InnerMostDimPreserver<0, Self, Op, true> {
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const Self& self, typename Self::Index firstIndex, Op& reducer0, typename Self::PacketReturnType* accum0) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const Self& self, typename Self::Index firstIndex,
+                                                           Op& reducer0, typename Self::PacketReturnType* accum0) {
     using Index = typename Self::Index;
     const Index stride = self.m_reducedStrides[0];
     const Index size = self.m_reducedDims[0];
@@ -320,11 +320,11 @@
       for (Index j = 0; j < unrolled_size4; j += 4) {
         const Index input0 = firstIndex + j * stride;
         reducer0.reducePacket(self.m_impl.template packet<Unaligned>(input0), accum0);
-        const Index input1 = firstIndex + (j+1) * stride;
+        const Index input1 = firstIndex + (j + 1) * stride;
         reducer0.reducePacket(self.m_impl.template packet<Unaligned>(input1), &accum1);
-        const Index input2 = firstIndex + (j+2) * stride;
+        const Index input2 = firstIndex + (j + 2) * stride;
         reducer0.reducePacket(self.m_impl.template packet<Unaligned>(input2), &accum2);
-        const Index input3 = firstIndex + (j+3) * stride;
+        const Index input3 = firstIndex + (j + 3) * stride;
         reducer0.reducePacket(self.m_impl.template packet<Unaligned>(input3), &accum3);
       }
       reducer0.reducePacket(accum1, accum0);
@@ -344,33 +344,34 @@
 };
 template <typename Self, typename Op>
 struct InnerMostDimPreserver<-1, Self, Op, true> {
-  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const Self&, typename Self::Index, Op&, typename Self::PacketReturnType*) {
+  static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const Self&, typename Self::Index, Op&,
+                                                           typename Self::PacketReturnType*) {
     eigen_assert(false && "should never be called");
   }
 };
 
 // Default full reducer
-template <typename Self, typename Op, typename Device, bool Vectorizable = (Self::InputPacketAccess && Self::ReducerTraits::PacketAccess)>
+template <typename Self, typename Op, typename Device,
+          bool Vectorizable = (Self::InputPacketAccess && Self::ReducerTraits::PacketAccess)>
 struct FullReducer {
   static constexpr bool HasOptimizedImplementation = false;
 
-  static EIGEN_DEVICE_FUNC void run(const Self& self, Op& reducer, const Device&, typename Self::EvaluatorPointerType output) {
+  static EIGEN_DEVICE_FUNC void run(const Self& self, Op& reducer, const Device&,
+                                    typename Self::EvaluatorPointerType output) {
     const typename Self::Index num_coeffs = array_prod(self.m_impl.dimensions());
     *output = InnerMostDimReducer<Self, Op, Vectorizable>::reduce(self, 0, num_coeffs, reducer);
   }
 };
 
-
 #ifdef EIGEN_USE_THREADS
 // Multithreaded full reducers
 template <typename Self, typename Op,
           bool Vectorizable = (Self::InputPacketAccess && Self::ReducerTraits::PacketAccess)>
 struct FullReducerShard {
   static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Self& self, typename Self::Index firstIndex,
-                  typename Self::Index numValuesToReduce, Op& reducer,
-                  typename Self::CoeffReturnType* output) {
-    *output = InnerMostDimReducer<Self, Op, Vectorizable>::reduce(
-        self, firstIndex, numValuesToReduce, reducer);
+                                                        typename Self::Index numValuesToReduce, Op& reducer,
+                                                        typename Self::CoeffReturnType* output) {
+    *output = InnerMostDimReducer<Self, Op, Vectorizable>::reduce(self, firstIndex, numValuesToReduce, reducer);
   }
 };
 
@@ -378,8 +379,7 @@
 template <typename Self, typename Op, bool Vectorizable>
 struct FullReducer<Self, Op, ThreadPoolDevice, Vectorizable> {
   static constexpr bool HasOptimizedImplementation = !Self::ReducerTraits::IsStateful;
-  static constexpr Index PacketSize =
-      unpacket_traits<typename Self::PacketReturnType>::size;
+  static constexpr Index PacketSize = unpacket_traits<typename Self::PacketReturnType>::size;
 
   // launch one reducer per thread and accumulate the result.
   static void run(const Self& self, Op& reducer, const ThreadPoolDevice& device,
@@ -390,15 +390,11 @@
       *output = reducer.finalize(reducer.initialize());
       return;
     }
-    const TensorOpCost cost =
-        self.m_impl.costPerCoeff(Vectorizable) +
-        TensorOpCost(0, 0, internal::functor_traits<Op>::Cost, Vectorizable,
-                     PacketSize);
-    const Index num_threads = TensorCostModel<ThreadPoolDevice>::numThreads(
-        num_coeffs, cost, device.numThreads());
+    const TensorOpCost cost = self.m_impl.costPerCoeff(Vectorizable) +
+                              TensorOpCost(0, 0, internal::functor_traits<Op>::Cost, Vectorizable, PacketSize);
+    const Index num_threads = TensorCostModel<ThreadPoolDevice>::numThreads(num_coeffs, cost, device.numThreads());
     if (num_threads == 1) {
-      *output =
-          InnerMostDimReducer<Self, Op, Vectorizable>::reduce(self, 0, num_coeffs, reducer);
+      *output = InnerMostDimReducer<Self, Op, Vectorizable>::reduce(self, 0, num_coeffs, reducer);
       return;
     }
     const Index blocksize = num_coeffs / num_threads;
@@ -408,15 +404,13 @@
     Barrier barrier(internal::convert_index<unsigned int>(numblocks));
     MaxSizeVector<typename Self::CoeffReturnType> shards(numblocks, reducer.initialize());
     for (Index i = 0; i < numblocks; ++i) {
-      device.enqueue_with_barrier(&barrier, &FullReducerShard<Self, Op, Vectorizable>::run,
-                                  self, i * blocksize, blocksize, reducer,
-                                  &shards[i]);
+      device.enqueue_with_barrier(&barrier, &FullReducerShard<Self, Op, Vectorizable>::run, self, i * blocksize,
+                                  blocksize, reducer, &shards[i]);
     }
     typename Self::CoeffReturnType finalShard;
     if (numblocks * blocksize < num_coeffs) {
-      finalShard = InnerMostDimReducer<Self, Op, Vectorizable>::reduce(
-          self, numblocks * blocksize, num_coeffs - numblocks * blocksize,
-          reducer);
+      finalShard = InnerMostDimReducer<Self, Op, Vectorizable>::reduce(self, numblocks * blocksize,
+                                                                       num_coeffs - numblocks * blocksize, reducer);
     } else {
       finalShard = reducer.initialize();
     }
@@ -431,13 +425,13 @@
 
 #endif
 
-
 // Default inner reducer
 template <typename Self, typename Op, typename Device>
 struct InnerReducer {
   static constexpr bool HasOptimizedImplementation = false;
 
-  EIGEN_DEVICE_FUNC static bool run(const Self&, Op&, const Device&, typename Self::CoeffReturnType*, typename Self::Index, typename Self::Index) {
+  EIGEN_DEVICE_FUNC static bool run(const Self&, Op&, const Device&, typename Self::CoeffReturnType*,
+                                    typename Self::Index, typename Self::Index) {
     eigen_assert(false && "Not implemented");
     return true;
   }
@@ -448,7 +442,8 @@
 struct OuterReducer {
   static constexpr bool HasOptimizedImplementation = false;
 
-  EIGEN_DEVICE_FUNC static bool run(const Self&, Op&, const Device&, typename Self::CoeffReturnType*, typename Self::Index, typename Self::Index) {
+  EIGEN_DEVICE_FUNC static bool run(const Self&, Op&, const Device&, typename Self::CoeffReturnType*,
+                                    typename Self::Index, typename Self::Index) {
     eigen_assert(false && "Not implemented");
     return true;
   }
@@ -460,7 +455,8 @@
 struct GenericReducer {
   static constexpr bool HasOptimizedImplementation = false;
 
-  EIGEN_DEVICE_FUNC static bool run(const Self&, Op&, const Device&, typename Self::CoeffReturnType*, typename Self::Index, typename Self::Index) {
+  EIGEN_DEVICE_FUNC static bool run(const Self&, Op&, const Device&, typename Self::CoeffReturnType*,
+                                    typename Self::Index, typename Self::Index) {
     eigen_assert(false && "Not implemented");
     return true;
   }
@@ -469,14 +465,16 @@
 
 #if defined(EIGEN_USE_GPU) && (defined(EIGEN_GPUCC))
 template <int B, int N, typename S, typename R, typename I_>
-__global__ EIGEN_HIP_LAUNCH_BOUNDS_1024 void FullReductionKernel(R, const S, I_, typename S::CoeffReturnType*, unsigned int*);
-
+__global__ EIGEN_HIP_LAUNCH_BOUNDS_1024 void FullReductionKernel(R, const S, I_, typename S::CoeffReturnType*,
+                                                                 unsigned int*);
 
 #if defined(EIGEN_HAS_GPU_FP16)
 template <typename S, typename R, typename I_>
-__global__ EIGEN_HIP_LAUNCH_BOUNDS_1024 void ReductionInitFullReduxKernelHalfFloat(R, const S, I_, internal::packet_traits<half>::type*);
+__global__ EIGEN_HIP_LAUNCH_BOUNDS_1024 void ReductionInitFullReduxKernelHalfFloat(
+    R, const S, I_, internal::packet_traits<half>::type*);
 template <int B, int N, typename S, typename R, typename I_>
-__global__ EIGEN_HIP_LAUNCH_BOUNDS_1024 void FullReductionKernelHalfFloat(R, const S, I_, half*, internal::packet_traits<half>::type*);
+__global__ EIGEN_HIP_LAUNCH_BOUNDS_1024 void FullReductionKernelHalfFloat(R, const S, I_, half*,
+                                                                          internal::packet_traits<half>::type*);
 template <int NPT, typename S, typename R, typename I_>
 __global__ EIGEN_HIP_LAUNCH_BOUNDS_1024 void InnerReductionKernelHalfFloat(R, const S, I_, I_, half*);
 
@@ -508,44 +506,37 @@
 
 }  // end namespace internal
 
-
-template <typename Op, typename Dims, typename XprType,  template <class> class MakePointer_>
+template <typename Op, typename Dims, typename XprType, template <class> class MakePointer_>
 class TensorReductionOp : public TensorBase<TensorReductionOp<Op, Dims, XprType, MakePointer_>, ReadOnlyAccessors> {
-  public:
-    typedef typename Eigen::internal::traits<TensorReductionOp>::Scalar Scalar;
-    typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
-    typedef std::remove_const_t<typename XprType::CoeffReturnType> CoeffReturnType;
-    typedef typename Eigen::internal::nested<TensorReductionOp>::type Nested;
-    typedef typename Eigen::internal::traits<TensorReductionOp>::StorageKind StorageKind;
-    typedef typename Eigen::internal::traits<TensorReductionOp>::Index Index;
+ public:
+  typedef typename Eigen::internal::traits<TensorReductionOp>::Scalar Scalar;
+  typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
+  typedef std::remove_const_t<typename XprType::CoeffReturnType> CoeffReturnType;
+  typedef typename Eigen::internal::nested<TensorReductionOp>::type Nested;
+  typedef typename Eigen::internal::traits<TensorReductionOp>::StorageKind StorageKind;
+  typedef typename Eigen::internal::traits<TensorReductionOp>::Index Index;
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    TensorReductionOp(const XprType& expr, const Dims& dims) : m_expr(expr), m_dims(dims)
-    { }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    TensorReductionOp(const XprType& expr, const Dims& dims, const Op& reducer) : m_expr(expr), m_dims(dims), m_reducer(reducer)
-    { }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorReductionOp(const XprType& expr, const Dims& dims)
+      : m_expr(expr), m_dims(dims) {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorReductionOp(const XprType& expr, const Dims& dims, const Op& reducer)
+      : m_expr(expr), m_dims(dims), m_reducer(reducer) {}
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    const XprType& expression() const { return m_expr; }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    const Dims& dims() const { return m_dims; }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    const Op& reducer() const { return m_reducer; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const XprType& expression() const { return m_expr; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dims& dims() const { return m_dims; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Op& reducer() const { return m_reducer; }
 
-  protected:
-    typename XprType::Nested m_expr;
-    const Dims m_dims;
-    const Op m_reducer;
+ protected:
+  typename XprType::Nested m_expr;
+  const Dims m_dims;
+  const Op m_reducer;
 };
 
-template<typename ArgType, typename Device>
+template <typename ArgType, typename Device>
 struct TensorReductionEvaluatorBase;
 
 // Eval as rvalue
-template<typename Op, typename Dims, typename ArgType, template <class> class MakePointer_, typename Device>
-struct TensorReductionEvaluatorBase<const TensorReductionOp<Op, Dims, ArgType, MakePointer_>, Device>
-{
+template <typename Op, typename Dims, typename ArgType, template <class> class MakePointer_, typename Device>
+struct TensorReductionEvaluatorBase<const TensorReductionOp<Op, Dims, ArgType, MakePointer_>, Device> {
   typedef internal::reducer_traits<Op, Device> ReducerTraits;
   typedef Dims ReducedDims;
   typedef TensorReductionOp<Op, Dims, ArgType, MakePointer_> XprType;
@@ -555,7 +546,7 @@
   static constexpr int NumInputDims = internal::array_size<InputDimensions>::value;
   static constexpr int NumReducedDims = internal::array_size<Dims>::value;
   static constexpr int NumOutputDims = NumInputDims - NumReducedDims;
-  typedef std::conditional_t<NumOutputDims==0, Sizes<>, DSizes<Index, NumOutputDims> > Dimensions;
+  typedef std::conditional_t<NumOutputDims == 0, Sizes<>, DSizes<Index, NumOutputDims> > Dimensions;
   typedef typename XprType::Scalar Scalar;
   typedef TensorReductionEvaluatorBase<const TensorReductionOp<Op, Dims, ArgType, MakePointer_>, Device> Self;
   static constexpr bool InputPacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess;
@@ -570,14 +561,14 @@
   // Subset of strides of the input tensor for the non-reduced dimensions.
   // Indexed by output dimensions.
   static constexpr int NumPreservedStrides = max_n_1<NumOutputDims>::size;
-  
+
   // For full reductions
 #if defined(EIGEN_USE_GPU) && (defined(EIGEN_GPUCC))
   static constexpr bool RunningOnGPU = internal::is_same<Device, Eigen::GpuDevice>::value;
   static constexpr bool RunningOnSycl = false;
 #elif defined(EIGEN_USE_SYCL)
-static constexpr bool RunningOnSycl = internal::is_same<internal::remove_all_t<Device>, Eigen::SyclDevice>::value;
-static constexpr bool RunningOnGPU = false;
+  static constexpr bool RunningOnSycl = internal::is_same<internal::remove_all_t<Device>, Eigen::SyclDevice>::value;
+  static constexpr bool RunningOnGPU = false;
 #else
   static constexpr bool RunningOnGPU = false;
   static constexpr bool RunningOnSycl = false;
@@ -601,13 +592,10 @@
 
   static constexpr bool ReducingInnerMostDims = internal::are_inner_most_dims<Dims, NumInputDims, Layout>::value;
   static constexpr bool PreservingInnerMostDims = internal::preserve_inner_most_dims<Dims, NumInputDims, Layout>::value;
-  static constexpr bool RunningFullReduction = (NumOutputDims==0);
+  static constexpr bool RunningFullReduction = (NumOutputDims == 0);
 
   EIGEN_STRONG_INLINE TensorReductionEvaluatorBase(const XprType& op, const Device& device)
-      : m_impl(op.expression(), device),
-        m_reducer(op.reducer()),
-        m_result(NULL),
-        m_device(device) {
+      : m_impl(op.expression(), device), m_reducer(op.reducer()), m_result(NULL), m_device(device) {
     EIGEN_STATIC_ASSERT((NumInputDims >= NumReducedDims), YOU_MADE_A_PROGRAMMING_MISTAKE);
     EIGEN_STATIC_ASSERT((!ReducingInnerMostDims | !PreservingInnerMostDims | (NumReducedDims == NumInputDims)),
                         YOU_MADE_A_PROGRAMMING_MISTAKE);
@@ -648,7 +636,7 @@
       if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
         input_strides[0] = 1;
         for (int i = 1; i < NumInputDims; ++i) {
-          input_strides[i] = input_strides[i-1] * input_dims[i-1];
+          input_strides[i] = input_strides[i - 1] * input_dims[i - 1];
         }
       } else {
         input_strides.back() = 1;
@@ -676,26 +664,23 @@
       m_preservedStrides[0] = internal::array_prod(input_dims);
     }
 
-    m_numValuesToReduce =
-        NumOutputDims == 0
-            ? internal::array_prod(input_dims)
-            : (static_cast<int>(Layout) == static_cast<int>(ColMajor))
-                  ? m_preservedStrides[0]
-                  : m_preservedStrides[static_cast<size_t>(NumOutputDims - 1)];
+    m_numValuesToReduce = NumOutputDims == 0 ? internal::array_prod(input_dims)
+                          : (static_cast<int>(Layout) == static_cast<int>(ColMajor))
+                              ? m_preservedStrides[0]
+                              : m_preservedStrides[static_cast<size_t>(NumOutputDims - 1)];
   }
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; }
 
-  EIGEN_STRONG_INLINE
-  bool evalSubExprsIfNeededCommon(EvaluatorPointerType data) {
+  EIGEN_STRONG_INLINE bool evalSubExprsIfNeededCommon(EvaluatorPointerType data) {
     // Use the FullReducer if possible.
-    if ((RunningFullReduction && RunningOnSycl) ||(RunningFullReduction &&
-        internal::FullReducer<Self, Op, Device>::HasOptimizedImplementation &&
-        ((RunningOnGPU && (m_device.majorDeviceVersion() >= 3)) ||
-         !RunningOnGPU))) {
+    if ((RunningFullReduction && RunningOnSycl) ||
+        (RunningFullReduction && internal::FullReducer<Self, Op, Device>::HasOptimizedImplementation &&
+         ((RunningOnGPU && (m_device.majorDeviceVersion() >= 3)) || !RunningOnGPU))) {
       bool need_assign = false;
       if (!data) {
-        m_result = static_cast<EvaluatorPointerType>(m_device.get((CoeffReturnType*)m_device.allocate_temp(sizeof(CoeffReturnType))));
+        m_result = static_cast<EvaluatorPointerType>(
+            m_device.get((CoeffReturnType*)m_device.allocate_temp(sizeof(CoeffReturnType))));
         data = m_result;
         need_assign = true;
       }
@@ -719,17 +704,20 @@
         const Index num_values_to_reduce = internal::array_prod(m_reducedDims);
         const Index num_coeffs_to_preserve = internal::array_prod(m_dimensions);
         if (!data) {
-          if ((num_coeffs_to_preserve < 1024 && num_values_to_reduce > num_coeffs_to_preserve && num_values_to_reduce > 128) || (RunningOnSycl)) {
-            data = static_cast<EvaluatorPointerType>(m_device.get((CoeffReturnType*)m_device.allocate_temp(sizeof(CoeffReturnType) * num_coeffs_to_preserve)));
+          if ((num_coeffs_to_preserve < 1024 && num_values_to_reduce > num_coeffs_to_preserve &&
+               num_values_to_reduce > 128) ||
+              (RunningOnSycl)) {
+            data = static_cast<EvaluatorPointerType>(m_device.get(
+                (CoeffReturnType*)m_device.allocate_temp(sizeof(CoeffReturnType) * num_coeffs_to_preserve)));
             m_result = data;
-          }
-          else {
+          } else {
             return true;
           }
         }
         Op reducer(m_reducer);
         // For SYCL this if always return false
-        if (internal::InnerReducer<Self, Op, Device>::run(*this, reducer, m_device, data, num_values_to_reduce, num_coeffs_to_preserve)) {
+        if (internal::InnerReducer<Self, Op, Device>::run(*this, reducer, m_device, data, num_values_to_reduce,
+                                                          num_coeffs_to_preserve)) {
           if (m_result) {
             m_device.deallocate_temp(m_result);
             m_result = NULL;
@@ -748,22 +736,24 @@
           preserving_inner_dims &= m_reduced[i];
         }
       }
-      if (internal::OuterReducer<Self, Op, Device>::HasOptimizedImplementation &&
-          preserving_inner_dims) {
+      if (internal::OuterReducer<Self, Op, Device>::HasOptimizedImplementation && preserving_inner_dims) {
         const Index num_values_to_reduce = internal::array_prod(m_reducedDims);
         const Index num_coeffs_to_preserve = internal::array_prod(m_dimensions);
         if (!data) {
-          if ((num_coeffs_to_preserve < 1024 && num_values_to_reduce > num_coeffs_to_preserve && num_values_to_reduce > 32) || (RunningOnSycl)) {
-            data = static_cast<EvaluatorPointerType>(m_device.get((CoeffReturnType*)m_device.allocate_temp(sizeof(CoeffReturnType) * num_coeffs_to_preserve)));
+          if ((num_coeffs_to_preserve < 1024 && num_values_to_reduce > num_coeffs_to_preserve &&
+               num_values_to_reduce > 32) ||
+              (RunningOnSycl)) {
+            data = static_cast<EvaluatorPointerType>(m_device.get(
+                (CoeffReturnType*)m_device.allocate_temp(sizeof(CoeffReturnType) * num_coeffs_to_preserve)));
             m_result = data;
-          }
-          else {
+          } else {
             return true;
           }
         }
         Op reducer(m_reducer);
         // For SYCL this if always return false
-        if (internal::OuterReducer<Self, Op, Device>::run(*this, reducer, m_device, data, num_values_to_reduce, num_coeffs_to_preserve)) {
+        if (internal::OuterReducer<Self, Op, Device>::run(*this, reducer, m_device, data, num_values_to_reduce,
+                                                          num_coeffs_to_preserve)) {
           if (m_result) {
             m_device.deallocate_temp(m_result);
             m_result = NULL;
@@ -773,39 +763,35 @@
           return (m_result != NULL);
         }
       }
-      #if defined(EIGEN_USE_SYCL)
-      // If there is no Optimised version for SYCL, the reduction expression 
+#if defined(EIGEN_USE_SYCL)
+      // If there is no Optimised version for SYCL, the reduction expression
       // must break into two subexpression and use the SYCL generic Reducer on the device.
-      if(RunningOnSycl) {
-         const Index num_values_to_reduce = internal::array_prod(m_reducedDims);
-         const Index num_coeffs_to_preserve = internal::array_prod(m_dimensions);
-         if (!data) {
-           data = static_cast<EvaluatorPointerType>(m_device.get((CoeffReturnType*)m_device.allocate_temp(sizeof(CoeffReturnType) * num_coeffs_to_preserve)));
-           m_result = data;
-         }
-         Op reducer(m_reducer);
-         internal::GenericReducer<Self, Op, Device>::run(*this, reducer, m_device, data, num_values_to_reduce, num_coeffs_to_preserve);
-         return (m_result != NULL);
-       }
-      #endif
+      if (RunningOnSycl) {
+        const Index num_values_to_reduce = internal::array_prod(m_reducedDims);
+        const Index num_coeffs_to_preserve = internal::array_prod(m_dimensions);
+        if (!data) {
+          data = static_cast<EvaluatorPointerType>(
+              m_device.get((CoeffReturnType*)m_device.allocate_temp(sizeof(CoeffReturnType) * num_coeffs_to_preserve)));
+          m_result = data;
+        }
+        Op reducer(m_reducer);
+        internal::GenericReducer<Self, Op, Device>::run(*this, reducer, m_device, data, num_values_to_reduce,
+                                                        num_coeffs_to_preserve);
+        return (m_result != NULL);
+      }
+#endif
     }
     return true;
   }
 
 #ifdef EIGEN_USE_THREADS
   template <typename EvalSubExprsCallback>
-  EIGEN_STRONG_INLINE
-      void
-      evalSubExprsIfNeededAsync(EvaluatorPointerType data,
-                                EvalSubExprsCallback done) {
-    m_impl.evalSubExprsIfNeededAsync(NULL, [this, data, done](bool) {
-      done(evalSubExprsIfNeededCommon(data));
-    });
+  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(EvaluatorPointerType data, EvalSubExprsCallback done) {
+    m_impl.evalSubExprsIfNeededAsync(NULL, [this, data, done](bool) { done(evalSubExprsIfNeededCommon(data)); });
   }
 #endif
 
-  EIGEN_STRONG_INLINE
-  bool evalSubExprsIfNeeded(EvaluatorPointerType data) {
+  EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType data) {
     m_impl.evalSubExprsIfNeeded(NULL);
     return evalSubExprsIfNeededCommon(data);
   }
@@ -818,28 +804,26 @@
     }
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
-  {
-    if (( RunningFullReduction || RunningOnGPU) && m_result ) {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
+    if ((RunningFullReduction || RunningOnGPU) && m_result) {
       return *(m_result + index);
     }
     Op reducer(m_reducer);
     if (ReducingInnerMostDims || RunningFullReduction) {
-      const Index num_values_to_reduce =
-        (static_cast<int>(Layout) == static_cast<int>(ColMajor)) ? m_preservedStrides[0] : m_preservedStrides[NumPreservedStrides - 1];
-      return internal::InnerMostDimReducer<Self, Op>::reduce(*this, firstInput(index),
-                                                             num_values_to_reduce, reducer);
+      const Index num_values_to_reduce = (static_cast<int>(Layout) == static_cast<int>(ColMajor))
+                                             ? m_preservedStrides[0]
+                                             : m_preservedStrides[NumPreservedStrides - 1];
+      return internal::InnerMostDimReducer<Self, Op>::reduce(*this, firstInput(index), num_values_to_reduce, reducer);
     } else {
       typename Self::CoeffReturnType accum = reducer.initialize();
-      internal::GenericDimReducer<NumReducedDims-1, Self, Op>::reduce(*this, firstInput(index), reducer, &accum);
+      internal::GenericDimReducer<NumReducedDims - 1, Self, Op>::reduce(*this, firstInput(index), reducer, &accum);
       return reducer.finalize(accum);
     }
   }
 
   // TODO(bsteiner): provide a more efficient implementation.
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const
-  {
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const {
     eigen_assert(index + PacketSize - 1 < Index(internal::array_prod(dimensions())));
 
     if (RunningOnGPU && m_result) {
@@ -848,8 +832,9 @@
 
     EIGEN_ALIGN_MAX std::remove_const_t<CoeffReturnType> values[PacketSize];
     if (ReducingInnerMostDims) {
-      const Index num_values_to_reduce =
-        (static_cast<int>(Layout) == static_cast<int>(ColMajor)) ? m_preservedStrides[0] : m_preservedStrides[NumPreservedStrides - 1];
+      const Index num_values_to_reduce = (static_cast<int>(Layout) == static_cast<int>(ColMajor))
+                                             ? m_preservedStrides[0]
+                                             : m_preservedStrides[NumPreservedStrides - 1];
       const Index firstIndex = firstInput(index);
       for (Index i = 0; i < PacketSize; ++i) {
         Op reducer(m_reducer);
@@ -863,7 +848,7 @@
       if (((firstIndex % m_dimensions[innermost_dim]) + PacketSize - 1) < m_dimensions[innermost_dim]) {
         Op reducer(m_reducer);
         typename Self::PacketReturnType accum = reducer.template initializePacket<typename Self::PacketReturnType>();
-        internal::InnerMostDimPreserver<NumReducedDims-1, Self, Op>::reduce(*this, firstIndex, reducer, &accum);
+        internal::InnerMostDimPreserver<NumReducedDims - 1, Self, Op>::reduce(*this, firstIndex, reducer, &accum);
         return reducer.finalizePacket(accum);
       } else {
         for (int i = 0; i < PacketSize; ++i) {
@@ -887,7 +872,7 @@
       const Index num_values_to_reduce = internal::array_prod(m_reducedDims);
       const double compute_cost = num_values_to_reduce * internal::functor_traits<Op>::Cost;
       return m_impl.costPerCoeff(vectorized) * num_values_to_reduce +
-          TensorOpCost(0, 0, compute_cost, vectorized, PacketSize);
+             TensorOpCost(0, 0, compute_cost, vectorized, PacketSize);
     }
   }
 
@@ -895,34 +880,49 @@
   EIGEN_DEVICE_FUNC const TensorEvaluator<ArgType, Device>& impl() const { return m_impl; }
   EIGEN_DEVICE_FUNC const Device& device() const { return m_device; }
 
-  private:
-  template <int, typename, typename> friend struct internal::GenericDimReducer;
-  template <typename, typename, bool, bool> friend struct internal::InnerMostDimReducer;
-  template <int, typename, typename, bool> friend struct internal::InnerMostDimPreserver;
-  template <typename S, typename O, typename D, bool V> friend struct internal::FullReducer;
+ private:
+  template <int, typename, typename>
+  friend struct internal::GenericDimReducer;
+  template <typename, typename, bool, bool>
+  friend struct internal::InnerMostDimReducer;
+  template <int, typename, typename, bool>
+  friend struct internal::InnerMostDimPreserver;
+  template <typename S, typename O, typename D, bool V>
+  friend struct internal::FullReducer;
 #ifdef EIGEN_USE_THREADS
-  template <typename S, typename O, bool V> friend struct internal::FullReducerShard;
+  template <typename S, typename O, bool V>
+  friend struct internal::FullReducerShard;
 #endif
 #if defined(EIGEN_USE_GPU) && (defined(EIGEN_GPUCC))
-  template <int B, int N, typename S, typename R, typename I_> KERNEL_FRIEND void internal::FullReductionKernel(R, const S, I_, typename S::CoeffReturnType*, unsigned int*);
+  template <int B, int N, typename S, typename R, typename I_>
+  KERNEL_FRIEND void internal::FullReductionKernel(R, const S, I_, typename S::CoeffReturnType*, unsigned int*);
 #if defined(EIGEN_HAS_GPU_FP16)
-  template <typename S, typename R, typename I_> KERNEL_FRIEND void internal::ReductionInitFullReduxKernelHalfFloat(R, const S, I_, internal::packet_traits<Eigen::half>::type*);
-  template <int B, int N, typename S, typename R, typename I_> KERNEL_FRIEND void internal::FullReductionKernelHalfFloat(R, const S, I_, half*, internal::packet_traits<Eigen::half>::type*);
-  template <int NPT, typename S, typename R, typename I_> KERNEL_FRIEND void internal::InnerReductionKernelHalfFloat(R, const S, I_, I_, half*);
+  template <typename S, typename R, typename I_>
+  KERNEL_FRIEND void internal::ReductionInitFullReduxKernelHalfFloat(R, const S, I_,
+                                                                     internal::packet_traits<Eigen::half>::type*);
+  template <int B, int N, typename S, typename R, typename I_>
+  KERNEL_FRIEND void internal::FullReductionKernelHalfFloat(R, const S, I_, half*,
+                                                            internal::packet_traits<Eigen::half>::type*);
+  template <int NPT, typename S, typename R, typename I_>
+  KERNEL_FRIEND void internal::InnerReductionKernelHalfFloat(R, const S, I_, I_, half*);
 #endif
-  template <int NPT, typename S, typename R, typename I_> KERNEL_FRIEND void internal::InnerReductionKernel(R, const S, I_, I_, typename S::CoeffReturnType*);
+  template <int NPT, typename S, typename R, typename I_>
+  KERNEL_FRIEND void internal::InnerReductionKernel(R, const S, I_, I_, typename S::CoeffReturnType*);
 
-  template <int NPT, typename S, typename R, typename I_> KERNEL_FRIEND void internal::OuterReductionKernel(R, const S, I_, I_, typename S::CoeffReturnType*);
+  template <int NPT, typename S, typename R, typename I_>
+  KERNEL_FRIEND void internal::OuterReductionKernel(R, const S, I_, I_, typename S::CoeffReturnType*);
 #endif
 
 #if defined(EIGEN_USE_SYCL)
- template < typename Evaluator_, typename Op__> friend class TensorSycl::internal::GenericNondeterministicReducer;
- // SYCL need the Generic reducer for the case the recution algorithm is neither inner, outer, and full reducer
- template <typename, typename, typename> friend struct internal::GenericReducer;
+  template <typename Evaluator_, typename Op__>
+  friend class TensorSycl::internal::GenericNondeterministicReducer;
+  // SYCL need the Generic reducer for the case the recution algorithm is neither inner, outer, and full reducer
+  template <typename, typename, typename>
+  friend struct internal::GenericReducer;
 #endif
 
-
-  template <typename S, typename O, typename D> friend struct internal::InnerReducer;
+  template <typename S, typename O, typename D>
+  friend struct internal::InnerReducer;
 
   struct BlockIteratorState {
     Index input_dim;
@@ -1003,33 +1003,35 @@
   const Device EIGEN_DEVICE_REF m_device;
 };
 
-template<typename Op, typename Dims, typename ArgType, template <class> class MakePointer_, typename Device>
+template <typename Op, typename Dims, typename ArgType, template <class> class MakePointer_, typename Device>
 struct TensorEvaluator<const TensorReductionOp<Op, Dims, ArgType, MakePointer_>, Device>
-: public TensorReductionEvaluatorBase<const TensorReductionOp<Op, Dims, ArgType, MakePointer_>, Device> {
+    : public TensorReductionEvaluatorBase<const TensorReductionOp<Op, Dims, ArgType, MakePointer_>, Device> {
   typedef TensorReductionEvaluatorBase<const TensorReductionOp<Op, Dims, ArgType, MakePointer_>, Device> Base;
-  EIGEN_STRONG_INLINE TensorEvaluator(const typename Base::XprType& op, const Device& device) : Base(op, device){}
+  EIGEN_STRONG_INLINE TensorEvaluator(const typename Base::XprType& op, const Device& device) : Base(op, device) {}
 };
 
-
-template<typename Op, typename Dims, typename ArgType, template <class> class MakePointer_>
+template <typename Op, typename Dims, typename ArgType, template <class> class MakePointer_>
 struct TensorEvaluator<const TensorReductionOp<Op, Dims, ArgType, MakePointer_>, Eigen::SyclDevice>
-: public TensorReductionEvaluatorBase<const TensorReductionOp<Op, Dims, ArgType, MakePointer_>, Eigen::SyclDevice> {
-
-  typedef TensorReductionEvaluatorBase<const TensorReductionOp<Op, Dims, ArgType, MakePointer_>, Eigen::SyclDevice> Base;
-  EIGEN_STRONG_INLINE TensorEvaluator(const typename Base::XprType& op, const Eigen::SyclDevice& device) : Base(op, device){}
-  // The coeff function in the base the recursive method which is not an standard layout and cannot be used in the SYCL kernel
-  //Therefore the coeff function should be overridden by for SYCL kernel
+    : public TensorReductionEvaluatorBase<const TensorReductionOp<Op, Dims, ArgType, MakePointer_>, Eigen::SyclDevice> {
+  typedef TensorReductionEvaluatorBase<const TensorReductionOp<Op, Dims, ArgType, MakePointer_>, Eigen::SyclDevice>
+      Base;
+  EIGEN_STRONG_INLINE TensorEvaluator(const typename Base::XprType& op, const Eigen::SyclDevice& device)
+      : Base(op, device) {}
+  // The coeff function in the base the recursive method which is not an standard layout and cannot be used in the SYCL
+  // kernel
+  // Therefore the coeff function should be overridden by for SYCL kernel
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename Base::CoeffReturnType coeff(typename Base::Index index) const {
     return *(this->data() + index);
   }
-  // The packet function in the base the recursive method which is not an standard layout and cannot be used in the SYCL kernel
-  //Therefore the packet function should be overridden by for SYCL kernel
-  template<int LoadMode>
+  // The packet function in the base the recursive method which is not an standard layout and cannot be used in the SYCL
+  // kernel
+  // Therefore the packet function should be overridden by for SYCL kernel
+  template <int LoadMode>
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename Base::PacketReturnType packet(typename Base::Index index) const {
     return internal::pload<typename Base::PacketReturnType>(this->data() + index);
   }
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_CXX11_TENSOR_TENSOR_REDUCTION_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_REDUCTION_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorReductionGpu.h b/unsupported/Eigen/CXX11/src/Tensor/TensorReductionGpu.h
index 7348a71..c5273e9 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorReductionGpu.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorReductionGpu.h
@@ -16,7 +16,6 @@
 namespace Eigen {
 namespace internal {
 
-
 #if defined(EIGEN_USE_GPU) && defined(EIGEN_GPUCC)
 // Full reducers for GPU, don't vectorize for now
 
@@ -27,8 +26,7 @@
 template <typename T, typename R>
 __device__ EIGEN_ALWAYS_INLINE void atomicReduce(T* output, T accum, R& reducer) {
 #if (defined(EIGEN_HIP_DEVICE_COMPILE) && defined(__HIP_ARCH_HAS_WARP_SHUFFLE__)) || (EIGEN_CUDA_ARCH >= 300)
-  if (sizeof(T) == 4)
-  {
+  if (sizeof(T) == 4) {
     unsigned int oldval = *reinterpret_cast<unsigned int*>(output);
     unsigned int newval = oldval;
     reducer.reduce(accum, reinterpret_cast<T*>(&newval));
@@ -44,8 +42,7 @@
         return;
       }
     }
-  }
-  else if (sizeof(T) == 8) {
+  } else if (sizeof(T) == 8) {
     unsigned long long oldval = *reinterpret_cast<unsigned long long*>(output);
     unsigned long long newval = oldval;
     reducer.reduce(accum, reinterpret_cast<T*>(&newval));
@@ -61,16 +58,15 @@
         return;
       }
     }
-  }
-  else {
+  } else {
     gpu_assert(0 && "Wordsize not supported");
   }
-#else // EIGEN_CUDA_ARCH >= 300
+#else   // EIGEN_CUDA_ARCH >= 300
   EIGEN_UNUSED_VARIABLE(output);
   EIGEN_UNUSED_VARIABLE(accum);
   EIGEN_UNUSED_VARIABLE(reducer);
   gpu_assert(0 && "Shouldn't be called on unsupported device");
-#endif // EIGEN_CUDA_ARCH >= 300
+#endif  // EIGEN_CUDA_ARCH >= 300
 }
 
 // We extend atomicExch to support extra data types
@@ -108,10 +104,10 @@
 // reduction should be associative since reduction is not atomic in wide vector but atomic in half2 operations
 template <typename R>
 __device__ inline void atomicReduce(Packet4h2* output, Packet4h2 accum, R& reducer) {
-  half2* houtput=reinterpret_cast<half2*>(output);
-  half2* haccum=reinterpret_cast<half2*>(&accum);
-  for(int i=0;i<4;++i){
-    atomicReduce(houtput+i,*(haccum+i),reducer);
+  half2* houtput = reinterpret_cast<half2*>(output);
+  half2* haccum = reinterpret_cast<half2*>(&accum);
+  for (int i = 0; i < 4; ++i) {
+    atomicReduce(houtput + i, *(haccum + i), reducer);
   }
 }
 #endif  // EIGEN_GPU_COMPILE_PHASE
@@ -121,16 +117,16 @@
 __device__ inline void atomicReduce(float* output, float accum, SumReducer<float>&) {
 #if (defined(EIGEN_HIP_DEVICE_COMPILE) && defined(__HIP_ARCH_HAS_WARP_SHUFFLE__)) || (EIGEN_CUDA_ARCH >= 300)
   atomicAdd(output, accum);
-#else // EIGEN_CUDA_ARCH >= 300
+#else   // EIGEN_CUDA_ARCH >= 300
   EIGEN_UNUSED_VARIABLE(output);
   EIGEN_UNUSED_VARIABLE(accum);
   gpu_assert(0 && "Shouldn't be called on unsupported device");
-#endif // EIGEN_CUDA_ARCH >= 300
+#endif  // EIGEN_CUDA_ARCH >= 300
 }
 
-
 template <typename CoeffType, typename Index>
-__global__ EIGEN_HIP_LAUNCH_BOUNDS_1024 void ReductionInitKernel(const CoeffType val, Index num_preserved_coeffs, CoeffType* output) {
+__global__ EIGEN_HIP_LAUNCH_BOUNDS_1024 void ReductionInitKernel(const CoeffType val, Index num_preserved_coeffs,
+                                                                 CoeffType* output) {
   const Index thread_id = blockIdx.x * blockDim.x + threadIdx.x;
   const Index num_threads = blockDim.x * gridDim.x;
   for (Index i = thread_id; i < num_preserved_coeffs; i += num_threads) {
@@ -138,11 +134,10 @@
   }
 }
 
-
-template <int BlockSize, int NumPerThread, typename Self,
-          typename Reducer, typename Index>
+template <int BlockSize, int NumPerThread, typename Self, typename Reducer, typename Index>
 __global__ EIGEN_HIP_LAUNCH_BOUNDS_1024 void FullReductionKernel(Reducer reducer, const Self input, Index num_coeffs,
-                                    typename Self::CoeffReturnType* output, unsigned int* semaphore) {
+                                                                 typename Self::CoeffReturnType* output,
+                                                                 unsigned int* semaphore) {
 #if (defined(EIGEN_HIP_DEVICE_COMPILE) && defined(__HIP_ARCH_HAS_WARP_SHUFFLE__)) || (EIGEN_CUDA_ARCH >= 300)
   // Initialize the output value
   const Index first_index = blockIdx.x * BlockSize * NumPerThread + threadIdx.x;
@@ -150,8 +145,7 @@
     if (first_index == 0) {
       *output = reducer.initialize();
     }
-  }
-  else {
+  } else {
     if (threadIdx.x == 0) {
       unsigned int block = atomicCAS(semaphore, 0u, 1u);
       if (block == 0) {
@@ -159,15 +153,13 @@
         atomicExchCustom(output, reducer.initialize());
         __threadfence();
         atomicExch(semaphore, 2u);
-      }
-      else {
+      } else {
         // Wait for the first block to initialize the output value.
         // Use atomicCAS here to ensure that the reads aren't cached
         unsigned int val;
         do {
           val = atomicCAS(semaphore, 2u, 2u);
-        }
-        while (val < 2u);
+        } while (val < 2u);
       }
     }
   }
@@ -177,8 +169,8 @@
   eigen_assert(gridDim.x == 1 || *semaphore >= 2u);
 
   typename Self::CoeffReturnType accum = reducer.initialize();
-  Index max_iter = numext::mini<Index>(num_coeffs - first_index, NumPerThread*BlockSize);
-  for (Index i = 0; i < max_iter; i+=BlockSize) {
+  Index max_iter = numext::mini<Index>(num_coeffs - first_index, NumPerThread * BlockSize);
+  for (Index i = 0; i < max_iter; i += BlockSize) {
     const Index index = first_index + i;
     eigen_assert(index < num_coeffs);
     typename Self::CoeffReturnType val = input.m_impl.coeff(index);
@@ -186,21 +178,21 @@
   }
 
 #pragma unroll
-  for (int offset = warpSize/2; offset > 0; offset /= 2) {
-  #if defined(EIGEN_HIPCC)
-    // use std::is_floating_point to determine the type of reduced_val 
-    // This is needed because when Type == double, hipcc will give a "call to __shfl_down is ambguous" error 
-    // and list the float and int versions of __shfl_down as the candidate functions. 
+  for (int offset = warpSize / 2; offset > 0; offset /= 2) {
+#if defined(EIGEN_HIPCC)
+    // use std::is_floating_point to determine the type of reduced_val
+    // This is needed because when Type == double, hipcc will give a "call to __shfl_down is ambguous" error
+    // and list the float and int versions of __shfl_down as the candidate functions.
     if (std::is_floating_point<typename Self::CoeffReturnType>::value) {
       reducer.reduce(__shfl_down(static_cast<float>(accum), offset, warpSize), &accum);
     } else {
       reducer.reduce(__shfl_down(static_cast<int>(accum), offset, warpSize), &accum);
     }
-  #elif defined(EIGEN_CUDA_SDK_VER) && EIGEN_CUDA_SDK_VER < 90000
+#elif defined(EIGEN_CUDA_SDK_VER) && EIGEN_CUDA_SDK_VER < 90000
     reducer.reduce(__shfl_down(accum, offset, warpSize), &accum);
-  #else
+#else
     reducer.reduce(__shfl_down_sync(0xFFFFFFFF, accum, offset, warpSize), &accum);
-  #endif
+#endif
   }
 
   if ((threadIdx.x & (warpSize - 1)) == 0) {
@@ -214,32 +206,28 @@
     __threadfence_system();
 #endif
   }
-#else // EIGEN_CUDA_ARCH >= 300
+#else   // EIGEN_CUDA_ARCH >= 300
   EIGEN_UNUSED_VARIABLE(reducer);
   EIGEN_UNUSED_VARIABLE(input);
   EIGEN_UNUSED_VARIABLE(num_coeffs);
   EIGEN_UNUSED_VARIABLE(output);
   EIGEN_UNUSED_VARIABLE(semaphore);
   gpu_assert(0 && "Shouldn't be called on unsupported device");
-#endif // EIGEN_CUDA_ARCH >= 300
+#endif  // EIGEN_CUDA_ARCH >= 300
 }
 
-
 #ifdef EIGEN_HAS_GPU_FP16
-template <typename Self,
-          typename Reducer, typename Index>
-__global__ EIGEN_HIP_LAUNCH_BOUNDS_1024 void ReductionInitFullReduxKernelHalfFloat(
-    Reducer reducer, const Self input, Index num_coeffs, half* scratch) {
+template <typename Self, typename Reducer, typename Index>
+__global__ EIGEN_HIP_LAUNCH_BOUNDS_1024 void ReductionInitFullReduxKernelHalfFloat(Reducer reducer, const Self input,
+                                                                                   Index num_coeffs, half* scratch) {
   eigen_assert(blockDim.x == 1);
   eigen_assert(gridDim.x == 1);
   typedef packet_traits<Eigen::half>::type packet_type;
-  Index packet_remainder =
-      num_coeffs % Index(unpacket_traits<packet_type>::size);
+  Index packet_remainder = num_coeffs % Index(unpacket_traits<packet_type>::size);
   if (packet_remainder != 0) {
     half2* h2scratch = reinterpret_cast<half2*>(scratch);
     for (Index i = num_coeffs - packet_remainder; i + 2 <= num_coeffs; i += 2) {
-      *h2scratch =
-          __halves2half2(input.coeff(i), input.coeff(i + 1));
+      *h2scratch = __halves2half2(input.coeff(i), input.coeff(i + 1));
       h2scratch++;
     }
     if ((num_coeffs & 1) != 0) {
@@ -252,36 +240,32 @@
   }
 }
 
-template <typename Self,
-          typename Reducer, typename Index>
-__global__ EIGEN_HIP_LAUNCH_BOUNDS_1024 void ReductionInitKernelHalfFloat(Reducer reducer, const Self /*input*/, Index num_coeffs, half* output) {
+template <typename Self, typename Reducer, typename Index>
+__global__ EIGEN_HIP_LAUNCH_BOUNDS_1024 void ReductionInitKernelHalfFloat(Reducer reducer, const Self /*input*/,
+                                                                          Index num_coeffs, half* output) {
   const Index thread_id = blockIdx.x * blockDim.x + threadIdx.x;
   const Index num_threads = blockDim.x * gridDim.x;
   typedef typename packet_traits<Eigen::half>::type PacketType;
 
-  const Index num_packets =
-      num_coeffs / Index(unpacket_traits<PacketType>::size);
+  const Index num_packets = num_coeffs / Index(unpacket_traits<PacketType>::size);
   PacketType* p_output = reinterpret_cast<PacketType*>(output);
   for (Index i = thread_id; i < num_packets; i += num_threads) {
     p_output[i] = reducer.template initializePacket<PacketType>();
   }
-  Index packet_remainder =
-      num_coeffs % Index(unpacket_traits<PacketType>::size);
+  Index packet_remainder = num_coeffs % Index(unpacket_traits<PacketType>::size);
   if (thread_id < packet_remainder) {
     output[num_coeffs - packet_remainder + thread_id] = reducer.initialize();
   }
 }
 
-template <int BlockSize, int NumPerThread, typename Self,
-          typename Reducer, typename Index>
-__global__ EIGEN_HIP_LAUNCH_BOUNDS_1024 void FullReductionKernelHalfFloat(
-    Reducer reducer, const Self input, Index num_coeffs,
-    half* output, half* scratch) {
+template <int BlockSize, int NumPerThread, typename Self, typename Reducer, typename Index>
+__global__ EIGEN_HIP_LAUNCH_BOUNDS_1024 void FullReductionKernelHalfFloat(Reducer reducer, const Self input,
+                                                                          Index num_coeffs, half* output,
+                                                                          half* scratch) {
   typedef typename packet_traits<Eigen::half>::type PacketType;
   const int packet_width = unpacket_traits<PacketType>::size;
   eigen_assert(NumPerThread % packet_width == 0);
-  const Index first_index =
-      blockIdx.x * BlockSize * NumPerThread + packet_width * threadIdx.x;
+  const Index first_index = blockIdx.x * BlockSize * NumPerThread + packet_width * threadIdx.x;
 
   // Initialize the output value if it wasn't initialized by the ReductionInitKernel
 
@@ -292,9 +276,8 @@
         half2* p_scratch = reinterpret_cast<half2*>(scratch);
         pstoreu(scratch, reducer.template initializePacket<PacketType>());
         for (int i = 0; i < rem / 2; i++) {
-          *p_scratch = __halves2half2(
-              input.coeff(num_coeffs - packet_width + 2 * i),
-              input.coeff(num_coeffs - packet_width + 2 * i + 1));
+          *p_scratch = __halves2half2(input.coeff(num_coeffs - packet_width + 2 * i),
+                                      input.coeff(num_coeffs - packet_width + 2 * i + 1));
           p_scratch++;
         }
         if ((num_coeffs & 1) != 0) {
@@ -311,8 +294,7 @@
 
   PacketType accum = reducer.template initializePacket<PacketType>();
   const Index max_iter =
-      numext::mini<Index>((num_coeffs - first_index) / packet_width,
-                          NumPerThread * BlockSize / packet_width);
+      numext::mini<Index>((num_coeffs - first_index) / packet_width, NumPerThread * BlockSize / packet_width);
   for (Index i = 0; i < max_iter; i += BlockSize) {
     const Index index = first_index + packet_width * i;
     eigen_assert(index + packet_width < num_coeffs);
@@ -321,20 +303,23 @@
   }
 
 #pragma unroll
-  for (int offset = warpSize/2; offset > 0; offset /= 2) {
-  #if defined(EIGEN_HIPCC)
+  for (int offset = warpSize / 2; offset > 0; offset /= 2) {
+#if defined(EIGEN_HIPCC)
     PacketType r1;
     half2* hr = reinterpret_cast<half2*>(&r1);
     half2* hacc = reinterpret_cast<half2*>(&accum);
     for (int i = 0; i < packet_width / 2; i++) {
       // FIXME : remove this workaround once we have native half/half2 support for __shfl_down
-      union { int i; half2 h; } wka_in, wka_out;
+      union {
+        int i;
+        half2 h;
+      } wka_in, wka_out;
       wka_in.h = hacc[i];
       wka_out.i = __shfl_down(wka_in.i, offset, warpSize);
       hr[i] = wka_out.h;
     }
     reducer.reducePacket(r1, &accum);
-  #elif defined(EIGEN_CUDA_SDK_VER) && EIGEN_CUDA_SDK_VER < 90000
+#elif defined(EIGEN_CUDA_SDK_VER) && EIGEN_CUDA_SDK_VER < 90000
     PacketType r1;
     half2* hr = reinterpret_cast<half2*>(&r1);
     half2* hacc = reinterpret_cast<half2*>(&accum);
@@ -342,7 +327,7 @@
       hr[i] = __shfl_down(hacc[i], offset, warpSize);
     }
     reducer.reducePacket(r1, &accum);
-  #else
+#else
     PacketType r1;
     half2* hr = reinterpret_cast<half2*>(&r1);
     half2* hacc = reinterpret_cast<half2*>(&accum);
@@ -351,7 +336,7 @@
     }
     reducer.reducePacket(r1, &accum);
 
-  #endif
+#endif
   }
 
   if ((threadIdx.x & (warpSize - 1)) == 0) {
@@ -392,7 +377,7 @@
   }
 }
 
-#endif // EIGEN_HAS_GPU_FP16
+#endif  // EIGEN_HAS_GPU_FP16
 
 template <typename Self, typename Op, typename OutputType, bool PacketAccess, typename Enabled = void>
 struct FullReductionLauncher {
@@ -405,12 +390,10 @@
 template <typename Self, typename Op, typename OutputType, bool PacketAccess>
 struct FullReductionLauncher<
     Self, Op, OutputType, PacketAccess,
-    std::enable_if_t<
-      internal::is_same<float, OutputType>::value ||
-      internal::is_same<double, OutputType>::value,
-    void>> {
-  static void run(const Self& self, Op& reducer, const GpuDevice& device, OutputType* output, typename Self::Index num_coeffs) {
-
+    std::enable_if_t<internal::is_same<float, OutputType>::value || internal::is_same<double, OutputType>::value,
+                     void>> {
+  static void run(const Self& self, Op& reducer, const GpuDevice& device, OutputType* output,
+                  typename Self::Index num_coeffs) {
     typedef typename Self::Index Index;
     const int block_size = 256;
     const int num_per_thread = 128;
@@ -421,8 +404,8 @@
       semaphore = device.semaphore();
     }
 
-    LAUNCH_GPU_KERNEL((FullReductionKernel<block_size, num_per_thread, Self, Op, Index>),
-                       num_blocks, block_size, 0, device, reducer, self, num_coeffs, output, semaphore);
+    LAUNCH_GPU_KERNEL((FullReductionKernel<block_size, num_per_thread, Self, Op, Index>), num_blocks, block_size, 0,
+                      device, reducer, self, num_coeffs, output, semaphore);
   }
 };
 
@@ -436,7 +419,8 @@
 
 template <typename Self, typename Op>
 struct FullReductionLauncher<Self, Op, Eigen::half, true> {
-  static void run(const Self& self, Op& reducer, const GpuDevice& device, half* output, typename Self::Index num_coeffs) {
+  static void run(const Self& self, Op& reducer, const GpuDevice& device, half* output,
+                  typename Self::Index num_coeffs) {
     typedef typename Self::Index Index;
 
     const int block_size = 256;
@@ -447,21 +431,19 @@
     if (num_blocks > 1) {
       // We initialize the output and the scrathpad outside the reduction kernel when we can't be sure that there
       // won't be a race conditions between multiple thread blocks.
-      LAUNCH_GPU_KERNEL((ReductionInitFullReduxKernelHalfFloat<Self, Op, Index>),
-                         1, 1, 0, device, reducer, self, num_coeffs, scratch);
+      LAUNCH_GPU_KERNEL((ReductionInitFullReduxKernelHalfFloat<Self, Op, Index>), 1, 1, 0, device, reducer, self,
+                        num_coeffs, scratch);
     }
 
-    LAUNCH_GPU_KERNEL((FullReductionKernelHalfFloat<block_size, num_per_thread, Self, Op, Index>),
-                       num_blocks, block_size, 0, device, reducer, self, num_coeffs, output, scratch);
+    LAUNCH_GPU_KERNEL((FullReductionKernelHalfFloat<block_size, num_per_thread, Self, Op, Index>), num_blocks,
+                      block_size, 0, device, reducer, self, num_coeffs, output, scratch);
 
     if (num_blocks > 1) {
-      LAUNCH_GPU_KERNEL((ReductionCleanupKernelHalfFloat<Op>),
-                         1, 1, 0, device, reducer, output, scratch);
+      LAUNCH_GPU_KERNEL((ReductionCleanupKernelHalfFloat<Op>), 1, 1, 0, device, reducer, output, scratch);
     }
   }
 };
-#endif // EIGEN_HAS_GPU_FP16
-
+#endif  // EIGEN_HAS_GPU_FP16
 
 template <typename Self, typename Op, bool Vectorizable>
 struct FullReducer<Self, Op, GpuDevice, Vectorizable> {
@@ -469,15 +451,16 @@
   // so reduce the scope of the optimized version of the code to the simple cases
   // of doubles, floats and half floats
 #ifdef EIGEN_HAS_GPU_FP16
-  static constexpr bool HasOptimizedImplementation = !Self::ReducerTraits::IsStateful &&
-      (internal::is_same<typename Self::CoeffReturnType, float>::value ||
-       internal::is_same<typename Self::CoeffReturnType, double>::value ||
-       (internal::is_same<typename Self::CoeffReturnType, Eigen::half>::value && reducer_traits<Op, GpuDevice>::PacketAccess));
-#else // EIGEN_HAS_GPU_FP16
-  static constexpr bool HasOptimizedImplementation = !Self::ReducerTraits::IsStateful &&
-                                                (internal::is_same<typename Self::CoeffReturnType, float>::value ||
-                                                 internal::is_same<typename Self::CoeffReturnType, double>::value);
-#endif // EIGEN_HAS_GPU_FP16
+  static constexpr bool HasOptimizedImplementation =
+      !Self::ReducerTraits::IsStateful && (internal::is_same<typename Self::CoeffReturnType, float>::value ||
+                                           internal::is_same<typename Self::CoeffReturnType, double>::value ||
+                                           (internal::is_same<typename Self::CoeffReturnType, Eigen::half>::value &&
+                                            reducer_traits<Op, GpuDevice>::PacketAccess));
+#else   // EIGEN_HAS_GPU_FP16
+  static constexpr bool HasOptimizedImplementation =
+      !Self::ReducerTraits::IsStateful && (internal::is_same<typename Self::CoeffReturnType, float>::value ||
+                                           internal::is_same<typename Self::CoeffReturnType, double>::value);
+#endif  // EIGEN_HAS_GPU_FP16
 
   template <typename OutputType>
   static void run(const Self& self, Op& reducer, const GpuDevice& device, OutputType* output) {
@@ -488,15 +471,16 @@
       return;
     }
 
-    FullReductionLauncher<Self, Op, OutputType, reducer_traits<Op, GpuDevice>::PacketAccess>::run(self, reducer, device, output, num_coeffs);
+    FullReductionLauncher<Self, Op, OutputType, reducer_traits<Op, GpuDevice>::PacketAccess>::run(self, reducer, device,
+                                                                                                  output, num_coeffs);
   }
 };
 
-
-template <int NumPerThread, typename Self,
-          typename Reducer, typename Index>
-__global__ EIGEN_HIP_LAUNCH_BOUNDS_1024 void InnerReductionKernel(Reducer reducer, const Self input, Index num_coeffs_to_reduce, Index num_preserved_coeffs,
-                                         typename Self::CoeffReturnType* output) {
+template <int NumPerThread, typename Self, typename Reducer, typename Index>
+__global__ EIGEN_HIP_LAUNCH_BOUNDS_1024 void InnerReductionKernel(Reducer reducer, const Self input,
+                                                                  Index num_coeffs_to_reduce,
+                                                                  Index num_preserved_coeffs,
+                                                                  typename Self::CoeffReturnType* output) {
 #if (defined(EIGEN_HIP_DEVICE_COMPILE) && defined(__HIP_ARCH_HAS_WARP_SHUFFLE__)) || (EIGEN_CUDA_ARCH >= 300)
   typedef typename Self::CoeffReturnType Type;
   eigen_assert(blockDim.y == 1);
@@ -549,21 +533,21 @@
       }
 
 #pragma unroll
-      for (int offset = warpSize/2; offset > 0; offset /= 2) {
-      #if defined(EIGEN_HIPCC)
-        // use std::is_floating_point to determine the type of reduced_val 
-       // This is needed because when Type == double, hipcc will give a "call to __shfl_down is ambguous" error 
-       // and list the float and int versions of __shfl_down as the candidate functions. 
+      for (int offset = warpSize / 2; offset > 0; offset /= 2) {
+#if defined(EIGEN_HIPCC)
+        // use std::is_floating_point to determine the type of reduced_val
+        // This is needed because when Type == double, hipcc will give a "call to __shfl_down is ambguous" error
+        // and list the float and int versions of __shfl_down as the candidate functions.
         if (std::is_floating_point<Type>::value) {
           reducer.reduce(__shfl_down(static_cast<float>(reduced_val), offset), &reduced_val);
         } else {
           reducer.reduce(__shfl_down(static_cast<int>(reduced_val), offset), &reduced_val);
         }
-      #elif defined(EIGEN_CUDA_SDK_VER) && EIGEN_CUDA_SDK_VER < 90000
+#elif defined(EIGEN_CUDA_SDK_VER) && EIGEN_CUDA_SDK_VER < 90000
         reducer.reduce(__shfl_down(reduced_val, offset), &reduced_val);
-      #else
+#else
         reducer.reduce(__shfl_down_sync(0xFFFFFFFF, reduced_val, offset), &reduced_val);
-      #endif
+#endif
       }
 
       if ((threadIdx.x & (warpSize - 1)) == 0) {
@@ -571,17 +555,17 @@
       }
     }
   }
-#else // EIGEN_CUDA_ARCH >= 300
+#else   // EIGEN_CUDA_ARCH >= 300
   gpu_assert(0 && "Shouldn't be called on unsupported device");
-#endif // EIGEN_CUDA_ARCH >= 300
+#endif  // EIGEN_CUDA_ARCH >= 300
 }
 
 #ifdef EIGEN_HAS_GPU_FP16
 
-template <int NumPerThread, typename Self,
-          typename Reducer, typename Index>
-__global__ EIGEN_HIP_LAUNCH_BOUNDS_1024 void InnerReductionKernelHalfFloat(Reducer reducer, const Self input, Index num_coeffs_to_reduce, Index num_preserved_coeffs,
-                                              half* output) {
+template <int NumPerThread, typename Self, typename Reducer, typename Index>
+__global__ EIGEN_HIP_LAUNCH_BOUNDS_1024 void InnerReductionKernelHalfFloat(Reducer reducer, const Self input,
+                                                                           Index num_coeffs_to_reduce,
+                                                                           Index num_preserved_coeffs, half* output) {
   eigen_assert(blockDim.y == 1);
   eigen_assert(blockDim.z == 1);
   eigen_assert(gridDim.y == 1);
@@ -602,8 +586,7 @@
   // Initialize the output values if they weren't initialized by the ReductionInitKernel
   if (gridDim.x == 1) {
     Index i = packet_width * thread_id;
-    for (; i + packet_width <= num_preserved_coeffs;
-         i += packet_width * num_threads) {
+    for (; i + packet_width <= num_preserved_coeffs; i += packet_width * num_threads) {
       PacketType* poutput = reinterpret_cast<PacketType*>(output + i);
       *poutput = reducer.template initializePacket<PacketType>();
     }
@@ -618,24 +601,19 @@
 
     if (row + 1 < num_preserved_coeffs) {
       const Index col_block = i % input_col_blocks;
-      const Index col_begin =
-          packet_width * (col_block * blockDim.x * NumPerThread + threadIdx.x);
+      const Index col_begin = packet_width * (col_block * blockDim.x * NumPerThread + threadIdx.x);
 
       PacketType reduced_val1 = reducer.template initializePacket<PacketType>();
       PacketType reduced_val2 = reducer.template initializePacket<PacketType>();
 
       for (Index j = 0; j < NumPerThread; j += unroll_times) {
-        const Index last_col =
-            col_begin + blockDim.x * (j + unroll_times - 1) * packet_width;
+        const Index last_col = col_begin + blockDim.x * (j + unroll_times - 1) * packet_width;
         if (last_col >= num_coeffs_to_reduce) {
           Index col = col_begin + blockDim.x * j;
-          for (; col + packet_width <= num_coeffs_to_reduce;
-               col += blockDim.x) {
-            const PacketType val1 = input.m_impl.template packet<Unaligned>(
-                row * num_coeffs_to_reduce + col);
+          for (; col + packet_width <= num_coeffs_to_reduce; col += blockDim.x) {
+            const PacketType val1 = input.m_impl.template packet<Unaligned>(row * num_coeffs_to_reduce + col);
             reducer.reducePacket(val1, &reduced_val1);
-            const PacketType val2 = input.m_impl.template packet<Unaligned>(
-                (row + 1) * num_coeffs_to_reduce + col);
+            const PacketType val2 = input.m_impl.template packet<Unaligned>((row + 1) * num_coeffs_to_reduce + col);
             reducer.reducePacket(val2, &reduced_val2);
           }
           if (col < num_coeffs_to_reduce) {
@@ -644,24 +622,19 @@
             half2* hr1 = reinterpret_cast<half2*>(&r1);
             half2* hr2 = reinterpret_cast<half2*>(&r2);
             while (col + 1 < num_coeffs_to_reduce) {
-              *hr1 = __halves2half2(
-                  input.m_impl.coeff(row * num_coeffs_to_reduce + col),
-                  input.m_impl.coeff(row * num_coeffs_to_reduce + col + 1));
-              *hr2 = __halves2half2(
-                  input.m_impl.coeff((row + 1) * num_coeffs_to_reduce + col),
-                  input.m_impl.coeff((row + 1) * num_coeffs_to_reduce + col +
-                                     1));
+              *hr1 = __halves2half2(input.m_impl.coeff(row * num_coeffs_to_reduce + col),
+                                    input.m_impl.coeff(row * num_coeffs_to_reduce + col + 1));
+              *hr2 = __halves2half2(input.m_impl.coeff((row + 1) * num_coeffs_to_reduce + col),
+                                    input.m_impl.coeff((row + 1) * num_coeffs_to_reduce + col + 1));
               hr1++;
               hr2++;
               col += 2;
             }
             if (col < num_coeffs_to_reduce) {
               // Peel;
-              const half last1 =
-                  input.m_impl.coeff(row * num_coeffs_to_reduce + col);
+              const half last1 = input.m_impl.coeff(row * num_coeffs_to_reduce + col);
               *hr1 = __halves2half2(last1, reducer.initialize());
-              const half last2 =
-                  input.m_impl.coeff((row + 1) * num_coeffs_to_reduce + col);
+              const half last2 = input.m_impl.coeff((row + 1) * num_coeffs_to_reduce + col);
               *hr2 = __halves2half2(last2, reducer.initialize());
             }
             reducer.reducePacket(r1, &reduced_val1);
@@ -673,19 +646,17 @@
 #pragma unroll
           for (int k = 0; k < unroll_times; ++k) {
             const Index col = col_begin + blockDim.x * (j + k) * packet_width;
-            reducer.reducePacket(input.m_impl.template packet<Unaligned>(
-                                     row * num_coeffs_to_reduce + col),
+            reducer.reducePacket(input.m_impl.template packet<Unaligned>(row * num_coeffs_to_reduce + col),
                                  &reduced_val1);
-            reducer.reducePacket(input.m_impl.template packet<Unaligned>(
-                                     (row + 1) * num_coeffs_to_reduce + col),
+            reducer.reducePacket(input.m_impl.template packet<Unaligned>((row + 1) * num_coeffs_to_reduce + col),
                                  &reduced_val2);
           }
         }
       }
 
 #pragma unroll
-      for (int offset = warpSize/2; offset > 0; offset /= 2) {
-      #if defined(EIGEN_HIPCC)
+      for (int offset = warpSize / 2; offset > 0; offset /= 2) {
+#if defined(EIGEN_HIPCC)
         PacketType r1;
         PacketType r2;
         half2* hr1 = reinterpret_cast<half2*>(&r1);
@@ -693,20 +664,26 @@
         half2* rv1 = reinterpret_cast<half2*>(&reduced_val1);
         half2* rv2 = reinterpret_cast<half2*>(&reduced_val2);
         for (int i = 0; i < packet_width / 2; i++) {
-	  // FIXME : remove this workaround once we have native half/half2 support for __shfl_down
-	  union { int i; half2 h; } wka_in1, wka_out1;
-	  wka_in1.h = rv1[i];
-	  wka_out1.i = __shfl_down(wka_in1.i, offset, warpSize);
-	  hr1[i] = wka_out1.h;
+          // FIXME : remove this workaround once we have native half/half2 support for __shfl_down
+          union {
+            int i;
+            half2 h;
+          } wka_in1, wka_out1;
+          wka_in1.h = rv1[i];
+          wka_out1.i = __shfl_down(wka_in1.i, offset, warpSize);
+          hr1[i] = wka_out1.h;
 
-	  union { int i; half2 h; } wka_in2, wka_out2;
-	  wka_in2.h = rv2[i];
-	  wka_out2.i = __shfl_down(wka_in2.i, offset, warpSize);
-	  hr2[i] = wka_out2.h;
+          union {
+            int i;
+            half2 h;
+          } wka_in2, wka_out2;
+          wka_in2.h = rv2[i];
+          wka_out2.i = __shfl_down(wka_in2.i, offset, warpSize);
+          hr2[i] = wka_out2.h;
         }
         reducer.reducePacket(r1, &reduced_val1);
         reducer.reducePacket(r2, &reduced_val2);
-      #elif defined(EIGEN_CUDA_SDK_VER) && EIGEN_CUDA_SDK_VER < 90000
+#elif defined(EIGEN_CUDA_SDK_VER) && EIGEN_CUDA_SDK_VER < 90000
         PacketType r1;
         PacketType r2;
         half2* hr1 = reinterpret_cast<half2*>(&r1);
@@ -719,7 +696,7 @@
         }
         reducer.reducePacket(r1, &reduced_val1);
         reducer.reducePacket(r2, &reduced_val2);
-      #else
+#else
         PacketType r1;
         PacketType r2;
         half2* hr1 = reinterpret_cast<half2*>(&r1);
@@ -727,15 +704,13 @@
         half2* rr1 = reinterpret_cast<half2*>(&reduced_val1);
         half2* rr2 = reinterpret_cast<half2*>(&reduced_val2);
         for (int j = 0; j < packet_width / 2; j++) {
-          hr1[j] =
-              __shfl_down_sync(0xFFFFFFFF, rr1[j], (unsigned)offset, warpSize);
-          hr2[j] =
-              __shfl_down_sync(0xFFFFFFFF, rr2[j], (unsigned)offset, warpSize);
+          hr1[j] = __shfl_down_sync(0xFFFFFFFF, rr1[j], (unsigned)offset, warpSize);
+          hr2[j] = __shfl_down_sync(0xFFFFFFFF, rr2[j], (unsigned)offset, warpSize);
         }
         reducer.reducePacket(r1, &reduced_val1);
         reducer.reducePacket(r2, &reduced_val2);
 
-      #endif
+#endif
       }
       half2* rv1 = reinterpret_cast<half2*>(&reduced_val1);
       half2* rv2 = reinterpret_cast<half2*>(&reduced_val2);
@@ -761,11 +736,12 @@
   }
 }
 
-#endif // EIGEN_HAS_GPU_FP16
+#endif  // EIGEN_HAS_GPU_FP16
 
 template <typename Self, typename Op, typename OutputType, bool PacketAccess, typename Enabled = void>
 struct InnerReductionLauncher {
-  static EIGEN_DEVICE_FUNC bool run(const Self&, Op&, const GpuDevice&, OutputType*, typename Self::Index, typename Self::Index) {
+  static EIGEN_DEVICE_FUNC bool run(const Self&, Op&, const GpuDevice&, OutputType*, typename Self::Index,
+                                    typename Self::Index) {
     gpu_assert(false && "Should only be called to reduce doubles, floats and half floats on a gpu device");
     return true;
   }
@@ -774,36 +750,32 @@
 // Specialization for float and double
 template <typename Self, typename Op, typename OutputType, bool PacketAccess>
 struct InnerReductionLauncher<
-  Self, Op, OutputType, PacketAccess,
-  std::enable_if_t<
-    internal::is_same<float, OutputType>::value ||
-    internal::is_same<double, OutputType>::value,
-  void>> {
-  static bool run(const Self& self, Op& reducer, const GpuDevice& device, OutputType* output, typename Self::Index num_coeffs_to_reduce, typename Self::Index num_preserved_vals) {
+    Self, Op, OutputType, PacketAccess,
+    std::enable_if_t<internal::is_same<float, OutputType>::value || internal::is_same<double, OutputType>::value,
+                     void>> {
+  static bool run(const Self& self, Op& reducer, const GpuDevice& device, OutputType* output,
+                  typename Self::Index num_coeffs_to_reduce, typename Self::Index num_preserved_vals) {
     typedef typename Self::Index Index;
 
     const Index num_coeffs = num_coeffs_to_reduce * num_preserved_vals;
     const int block_size = 256;
     const int num_per_thread = 128;
     const int dyn_blocks = numext::div_ceil<int>(num_coeffs, block_size * num_per_thread);
-    const int max_blocks = device.getNumGpuMultiProcessors() *
-                           device.maxGpuThreadsPerMultiProcessor() / block_size;
+    const int max_blocks = device.getNumGpuMultiProcessors() * device.maxGpuThreadsPerMultiProcessor() / block_size;
     const int num_blocks = numext::mini<int>(max_blocks, dyn_blocks);
 
     if (num_blocks > 1) {
       // We initialize the outputs outside the reduction kernel when we can't be sure that there
       // won't be a race conditions between multiple thread blocks.
       const int dyn_blocks2 = numext::div_ceil<int>(num_preserved_vals, 1024);
-      const int max_blocks2 = device.getNumGpuMultiProcessors() *
-                           device.maxGpuThreadsPerMultiProcessor() / 1024;
+      const int max_blocks2 = device.getNumGpuMultiProcessors() * device.maxGpuThreadsPerMultiProcessor() / 1024;
       const int num_blocks2 = numext::mini<int>(max_blocks2, dyn_blocks2);
-      LAUNCH_GPU_KERNEL((ReductionInitKernel<OutputType, Index>),
-                         num_blocks2, 1024, 0, device, reducer.initialize(),
-                         num_preserved_vals, output);
+      LAUNCH_GPU_KERNEL((ReductionInitKernel<OutputType, Index>), num_blocks2, 1024, 0, device, reducer.initialize(),
+                        num_preserved_vals, output);
     }
 
-    LAUNCH_GPU_KERNEL((InnerReductionKernel<num_per_thread, Self, Op, Index>),
-                       num_blocks, block_size, 0, device, reducer, self, num_coeffs_to_reduce, num_preserved_vals, output);
+    LAUNCH_GPU_KERNEL((InnerReductionKernel<num_per_thread, Self, Op, Index>), num_blocks, block_size, 0, device,
+                      reducer, self, num_coeffs_to_reduce, num_preserved_vals, output);
 
     return false;
   }
@@ -820,7 +792,8 @@
 
 template <typename Self, typename Op>
 struct InnerReductionLauncher<Self, Op, Eigen::half, true> {
-  static bool run(const Self& self, Op& reducer, const GpuDevice& device, half* output, typename Self::Index num_coeffs_to_reduce, typename Self::Index num_preserved_vals) {
+  static bool run(const Self& self, Op& reducer, const GpuDevice& device, half* output,
+                  typename Self::Index num_coeffs_to_reduce, typename Self::Index num_preserved_vals) {
     typedef typename Self::Index Index;
 
     if (num_preserved_vals % 2 != 0) {
@@ -829,28 +802,26 @@
     }
 
     const Index num_coeffs = num_coeffs_to_reduce * num_preserved_vals;
-    const int block_size = /*256*/128;
-    const int num_per_thread = /*128*/64;
+    const int block_size = /*256*/ 128;
+    const int num_per_thread = /*128*/ 64;
     const int dyn_blocks = numext::div_ceil<int>(num_coeffs, block_size * num_per_thread);
-    const int max_blocks = device.getNumGpuMultiProcessors() *
-                           device.maxGpuThreadsPerMultiProcessor() / block_size;
+    const int max_blocks = device.getNumGpuMultiProcessors() * device.maxGpuThreadsPerMultiProcessor() / block_size;
     const int num_blocks = numext::mini<int>(max_blocks, dyn_blocks);
 
     if (num_blocks > 1) {
       // We initialize the outputs outside the reduction kernel when we can't be sure that there
       // won't be a race conditions between multiple thread blocks.
-      LAUNCH_GPU_KERNEL((ReductionInitKernelHalfFloat<Self, Op, Index>),
-                         1, 1, 0, device, reducer, self, num_preserved_vals, output);
+      LAUNCH_GPU_KERNEL((ReductionInitKernelHalfFloat<Self, Op, Index>), 1, 1, 0, device, reducer, self,
+                        num_preserved_vals, output);
     }
 
-    LAUNCH_GPU_KERNEL((InnerReductionKernelHalfFloat<num_per_thread, Self, Op, Index>),
-                       num_blocks, block_size, 0, device, reducer, self, num_coeffs_to_reduce, num_preserved_vals, output);
+    LAUNCH_GPU_KERNEL((InnerReductionKernelHalfFloat<num_per_thread, Self, Op, Index>), num_blocks, block_size, 0,
+                      device, reducer, self, num_coeffs_to_reduce, num_preserved_vals, output);
 
     return false;
   }
 };
-#endif // EIGEN_HAS_GPU_FP16
-
+#endif  // EIGEN_HAS_GPU_FP16
 
 template <typename Self, typename Op>
 struct InnerReducer<Self, Op, GpuDevice> {
@@ -858,18 +829,20 @@
   // so reduce the scope of the optimized version of the code to the simple case
   // of floats and half floats.
 #ifdef EIGEN_HAS_GPU_FP16
-  static constexpr bool HasOptimizedImplementation = !Self::ReducerTraits::IsStateful &&
-      (internal::is_same<typename Self::CoeffReturnType, float>::value ||
-       internal::is_same<typename Self::CoeffReturnType, double>::value ||
-       (internal::is_same<typename Self::CoeffReturnType, Eigen::half>::value && reducer_traits<Op, GpuDevice>::PacketAccess));
-#else // EIGEN_HAS_GPU_FP16
-  static constexpr bool HasOptimizedImplementation = !Self::ReducerTraits::IsStateful &&
-                                                 (internal::is_same<typename Self::CoeffReturnType, float>::value ||
-                                                  internal::is_same<typename Self::CoeffReturnType, double>::value);
-#endif // EIGEN_HAS_GPU_FP16
+  static constexpr bool HasOptimizedImplementation =
+      !Self::ReducerTraits::IsStateful && (internal::is_same<typename Self::CoeffReturnType, float>::value ||
+                                           internal::is_same<typename Self::CoeffReturnType, double>::value ||
+                                           (internal::is_same<typename Self::CoeffReturnType, Eigen::half>::value &&
+                                            reducer_traits<Op, GpuDevice>::PacketAccess));
+#else   // EIGEN_HAS_GPU_FP16
+  static constexpr bool HasOptimizedImplementation =
+      !Self::ReducerTraits::IsStateful && (internal::is_same<typename Self::CoeffReturnType, float>::value ||
+                                           internal::is_same<typename Self::CoeffReturnType, double>::value);
+#endif  // EIGEN_HAS_GPU_FP16
 
   template <typename OutputType>
-  static bool run(const Self& self, Op& reducer, const GpuDevice& device, OutputType* output, typename Self::Index num_coeffs_to_reduce, typename Self::Index num_preserved_vals) {
+  static bool run(const Self& self, Op& reducer, const GpuDevice& device, OutputType* output,
+                  typename Self::Index num_coeffs_to_reduce, typename Self::Index num_preserved_vals) {
     gpu_assert(HasOptimizedImplementation && "Should only be called on doubles, floats or half floats");
     const Index num_coeffs = array_prod(self.m_impl.dimensions());
     // Don't crash when we're called with an input tensor of size 0.
@@ -881,14 +854,16 @@
       return true;
     }
 
-    return InnerReductionLauncher<Self, Op, OutputType, reducer_traits<Op, GpuDevice>::PacketAccess>::run(self, reducer, device, output, num_coeffs_to_reduce, num_preserved_vals);
+    return InnerReductionLauncher<Self, Op, OutputType, reducer_traits<Op, GpuDevice>::PacketAccess>::run(
+        self, reducer, device, output, num_coeffs_to_reduce, num_preserved_vals);
   }
 };
 
-template <int NumPerThread, typename Self,
-          typename Reducer, typename Index>
-__global__ EIGEN_HIP_LAUNCH_BOUNDS_1024 void OuterReductionKernel(Reducer reducer, const Self input, Index num_coeffs_to_reduce, Index num_preserved_coeffs,
-                                     typename Self::CoeffReturnType* output) {
+template <int NumPerThread, typename Self, typename Reducer, typename Index>
+__global__ EIGEN_HIP_LAUNCH_BOUNDS_1024 void OuterReductionKernel(Reducer reducer, const Self input,
+                                                                  Index num_coeffs_to_reduce,
+                                                                  Index num_preserved_coeffs,
+                                                                  typename Self::CoeffReturnType* output) {
   const Index num_threads = blockDim.x * gridDim.x;
   const Index thread_id = blockIdx.x * blockDim.x + threadIdx.x;
   // Initialize the output values if they weren't initialized by the ReductionInitKernel
@@ -914,35 +889,36 @@
   }
 }
 
-
 template <typename Self, typename Op>
 struct OuterReducer<Self, Op, GpuDevice> {
   // Unfortunately nvidia doesn't support well exotic types such as complex,
   // so reduce the scope of the optimized version of the code to the simple case
   // of floats.
-  static constexpr bool HasOptimizedImplementation = !Self::ReducerTraits::IsStateful &&
-                                                 (internal::is_same<typename Self::CoeffReturnType, float>::value ||
-                                                  internal::is_same<typename Self::CoeffReturnType, double>::value);
+  static constexpr bool HasOptimizedImplementation =
+      !Self::ReducerTraits::IsStateful && (internal::is_same<typename Self::CoeffReturnType, float>::value ||
+                                           internal::is_same<typename Self::CoeffReturnType, double>::value);
   template <typename Device, typename OutputType>
   static
-    #if !defined(EIGEN_HIPCC)
-    // FIXME :  leaving this EIGEN_DEVICE_FUNC in, results in the following runtime error
-    //          (in the cxx11_tensor_reduction_gpu test)
-    //
-    // terminate called after throwing an instance of 'std::runtime_error'
-    //   what():  No device code available for function: _ZN5Eigen8internal20OuterReductionKernelIL...
-    //
-    // don't know why this happens (and why is it a runtime error instead of a compile time error)
-    //
-    // this will be fixed by HIP PR#457
-    EIGEN_DEVICE_FUNC
-    #endif
-    bool run(const Self&, Op&, const Device&, OutputType*, typename Self::Index, typename Self::Index) {
+#if !defined(EIGEN_HIPCC)
+      // FIXME :  leaving this EIGEN_DEVICE_FUNC in, results in the following runtime error
+      //          (in the cxx11_tensor_reduction_gpu test)
+      //
+      // terminate called after throwing an instance of 'std::runtime_error'
+      //   what():  No device code available for function: _ZN5Eigen8internal20OuterReductionKernelIL...
+      //
+      // don't know why this happens (and why is it a runtime error instead of a compile time error)
+      //
+      // this will be fixed by HIP PR#457
+      EIGEN_DEVICE_FUNC
+#endif
+      bool
+      run(const Self&, Op&, const Device&, OutputType*, typename Self::Index, typename Self::Index) {
     gpu_assert(false && "Should only be called to reduce doubles or floats on a gpu device");
     return true;
   }
 
-  static bool run(const Self& self, Op& reducer, const GpuDevice& device, float* output, typename Self::Index num_coeffs_to_reduce, typename Self::Index num_preserved_vals) {
+  static bool run(const Self& self, Op& reducer, const GpuDevice& device, float* output,
+                  typename Self::Index num_coeffs_to_reduce, typename Self::Index num_preserved_vals) {
     typedef typename Self::Index Index;
 
     // It's faster to use the usual code.
@@ -954,33 +930,29 @@
     const int block_size = 256;
     const int num_per_thread = 16;
     const int dyn_blocks = numext::div_ceil<int>(num_coeffs, block_size * num_per_thread);
-    const int max_blocks = device.getNumGpuMultiProcessors() *
-                           device.maxGpuThreadsPerMultiProcessor() / block_size;
+    const int max_blocks = device.getNumGpuMultiProcessors() * device.maxGpuThreadsPerMultiProcessor() / block_size;
     const int num_blocks = numext::mini<int>(max_blocks, dyn_blocks);
 
     if (num_blocks > 1) {
       // We initialize the outputs in the reduction kernel itself when we don't have to worry
       // about race conditions between multiple thread blocks.
       const int dyn_blocks2 = numext::div_ceil<int>(num_preserved_vals, 1024);
-      const int max_blocks2 = device.getNumGpuMultiProcessors() *
-                             device.maxGpuThreadsPerMultiProcessor() / 1024;
+      const int max_blocks2 = device.getNumGpuMultiProcessors() * device.maxGpuThreadsPerMultiProcessor() / 1024;
       const int num_blocks2 = numext::mini<int>(max_blocks2, dyn_blocks2);
-      LAUNCH_GPU_KERNEL((ReductionInitKernel<float, Index>),
-                         num_blocks2, 1024, 0, device, reducer.initialize(),
-                         num_preserved_vals, output);
+      LAUNCH_GPU_KERNEL((ReductionInitKernel<float, Index>), num_blocks2, 1024, 0, device, reducer.initialize(),
+                        num_preserved_vals, output);
     }
 
-    LAUNCH_GPU_KERNEL((OuterReductionKernel<num_per_thread, Self, Op, Index>),
-                       num_blocks, block_size, 0, device, reducer, self, num_coeffs_to_reduce, num_preserved_vals, output);
+    LAUNCH_GPU_KERNEL((OuterReductionKernel<num_per_thread, Self, Op, Index>), num_blocks, block_size, 0, device,
+                      reducer, self, num_coeffs_to_reduce, num_preserved_vals, output);
 
     return false;
   }
 };
 
-#endif // defined(EIGEN_USE_GPU) && defined(EIGEN_GPUCC)
+#endif  // defined(EIGEN_USE_GPU) && defined(EIGEN_GPUCC)
 
+}  // end namespace internal
+}  // end namespace Eigen
 
-} // end namespace internal
-} // end namespace Eigen
-
-#endif // EIGEN_CXX11_TENSOR_TENSOR_REDUCTION_GPU_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_REDUCTION_GPU_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorReductionSycl.h b/unsupported/Eigen/CXX11/src/Tensor/TensorReductionSycl.h
index 9e3f397..fe0b849 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorReductionSycl.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorReductionSycl.h
@@ -14,12 +14,12 @@
  * TensorReductionSycl.h
  *
  * \brief:
- *  This is the specialization of the reduction operation. Two phase reduction approach 
- * is used since the GPU does not have Global Synchronization for global memory among 
- * different work-group/thread block. To solve the problem, we need to create two kernels 
- * to reduce the data, where the first kernel reduce the data locally and each local 
+ *  This is the specialization of the reduction operation. Two phase reduction approach
+ * is used since the GPU does not have Global Synchronization for global memory among
+ * different work-group/thread block. To solve the problem, we need to create two kernels
+ * to reduce the data, where the first kernel reduce the data locally and each local
  * workgroup/thread-block save the input data into global memory. In the second phase (global reduction)
- * one work-group uses one work-group/thread-block to reduces the intermediate data into one single element. 
+ * one work-group uses one work-group/thread-block to reduces the intermediate data into one single element.
  * Here is an NVIDIA presentation explaining the optimized two phase reduction algorithm on GPU:
  * https://developer.download.nvidia.com/assets/cuda/files/reduction.pdf
  *
@@ -114,8 +114,8 @@
   }
 };
 
-// Full reduction first phase. In this version the vectorization is true and the reduction accept 
-// any generic reducerOp  e.g( max, min, sum, mean, iamax, iamin, etc ). 
+// Full reduction first phase. In this version the vectorization is true and the reduction accept
+// any generic reducerOp  e.g( max, min, sum, mean, iamax, iamin, etc ).
 template <typename Evaluator, typename OpType, typename Evaluator::Index local_range>
 class FullReductionKernelFunctor {
  public:
@@ -128,8 +128,9 @@
   typedef typename OpDef::type Op;
   typedef typename Evaluator::EvaluatorPointerType EvaluatorPointerType;
   typedef typename Evaluator::PacketReturnType PacketReturnType;
-  typedef std::conditional_t<(Evaluator::ReducerTraits::PacketAccess & Evaluator::InputPacketAccess),
-                                              PacketReturnType, CoeffReturnType> OutType;
+  typedef std::conditional_t<(Evaluator::ReducerTraits::PacketAccess & Evaluator::InputPacketAccess), PacketReturnType,
+                             CoeffReturnType>
+      OutType;
   typedef cl::sycl::accessor<OutType, 1, cl::sycl::access::mode::read_write, cl::sycl::access::target::local>
       LocalAccessor;
   LocalAccessor scratch;
@@ -222,7 +223,7 @@
   typedef typename OpDef::type Op;
   template <typename Scratch>
   GenericNondeterministicReducer(Scratch, Evaluator evaluator_, EvaluatorPointerType output_accessor_, OpType functor_,
-                       Index range_, Index num_values_to_reduce_)
+                                 Index range_, Index num_values_to_reduce_)
       : evaluator(evaluator_),
         output_accessor(output_accessor_),
         functor(OpDef::get_op(functor_)),
@@ -230,9 +231,9 @@
         num_values_to_reduce(num_values_to_reduce_) {}
 
   void operator()(cl::sycl::nd_item<1> itemID) const {
-    //This is to bypass the statefull condition in Eigen meanReducer
+    // This is to bypass the statefull condition in Eigen meanReducer
     Op non_const_functor;
-    std::memcpy(&non_const_functor, &functor, sizeof (Op));
+    std::memcpy(&non_const_functor, &functor, sizeof(Op));
     auto output_accessor_ptr = output_accessor;
     Index globalid = static_cast<Index>(itemID.get_global_linear_id());
     if (globalid < range) {
@@ -314,9 +315,8 @@
 
     Index globalPId = pGroupId * PannelParameters::LocalThreadSizeP + pLocalThreadId;
     const Index globalRId = rGroupId * PannelParameters::LocalThreadSizeR + rLocalThreadId;
-    CoeffReturnType*  scratchPtr = scratch.get_pointer();
-    auto outPtr =
-        output_accessor + (reduce_elements_num_groups > 1 ? rGroupId * num_coeffs_to_preserve : 0);
+    CoeffReturnType *scratchPtr = scratch.get_pointer();
+    auto outPtr = output_accessor + (reduce_elements_num_groups > 1 ? rGroupId * num_coeffs_to_preserve : 0);
     CoeffReturnType accumulator = op.initialize();
 
     element_wise_reduce(globalRId, globalPId, accumulator);
@@ -391,7 +391,7 @@
     auto in_ptr = input_accessor + globalId;
 
     OutScalar accumulator = op.initialize();
-// num_coeffs_to_reduce is not bigger that 256
+    // num_coeffs_to_reduce is not bigger that 256
     for (Index i = 0; i < num_coeffs_to_reduce; i++) {
       op.reduce(*in_ptr, &accumulator);
       in_ptr += num_coeffs_to_preserve;
@@ -453,19 +453,22 @@
           dev.allocate_temp(num_coeffs_to_preserve * rNumGroups * sizeof(CoeffReturnType)));
       EvaluatorPointerType temp_accessor = dev.get(temp_pointer);
       dev.template unary_kernel_launcher<CoeffReturnType, SyclReducerKerneType>(
-          self, temp_accessor, thread_range, scratchSize, reducer, pNumGroups, rNumGroups, num_coeffs_to_preserve,
-          num_coeffs_to_reduce).wait();
+             self, temp_accessor, thread_range, scratchSize, reducer, pNumGroups, rNumGroups, num_coeffs_to_preserve,
+             num_coeffs_to_reduce)
+          .wait();
       typedef SecondStepPartialReduction<CoeffReturnType, Index, EvaluatorPointerType, EvaluatorPointerType, Op>
           SecondStepPartialReductionKernel;
       dev.template unary_kernel_launcher<CoeffReturnType, SecondStepPartialReductionKernel>(
-          temp_accessor, output,
-          cl::sycl::nd_range<1>(cl::sycl::range<1>(pNumGroups * localRange), cl::sycl::range<1>(localRange)), Index(1),
-          reducer, num_coeffs_to_preserve, rNumGroups).wait();
+             temp_accessor, output,
+             cl::sycl::nd_range<1>(cl::sycl::range<1>(pNumGroups * localRange), cl::sycl::range<1>(localRange)),
+             Index(1), reducer, num_coeffs_to_preserve, rNumGroups)
+          .wait();
       self.device().deallocate_temp(temp_pointer);
     } else {
       dev.template unary_kernel_launcher<CoeffReturnType, SyclReducerKerneType>(
-          self, output, thread_range, scratchSize, reducer, pNumGroups, rNumGroups, num_coeffs_to_preserve,
-          num_coeffs_to_reduce).wait();
+             self, output, thread_range, scratchSize, reducer, pNumGroups, rNumGroups, num_coeffs_to_preserve,
+             num_coeffs_to_reduce)
+          .wait();
     }
     return false;
   }
@@ -510,19 +513,21 @@
           static_cast<CoeffReturnType *>(dev.allocate_temp(num_work_group * sizeof(CoeffReturnType)));
       typename Self::EvaluatorPointerType tmp_global_accessor = dev.get(temp_pointer);
       dev.template unary_kernel_launcher<OutType, reduction_kernel_t>(self, tmp_global_accessor, thread_range,
-                                                                      local_range, inputSize, reducer).wait();
+                                                                      local_range, inputSize, reducer)
+          .wait();
       typedef TensorSycl::internal::SecondStepFullReducer<CoeffReturnType, Op, EvaluatorPointerType,
                                                           EvaluatorPointerType, Index, local_range>
           GenericRKernel;
       dev.template unary_kernel_launcher<CoeffReturnType, GenericRKernel>(
-          tmp_global_accessor, data,
-          cl::sycl::nd_range<1>(cl::sycl::range<1>(num_work_group), cl::sycl::range<1>(num_work_group)), num_work_group,
-          reducer).wait();    
+             tmp_global_accessor, data,
+             cl::sycl::nd_range<1>(cl::sycl::range<1>(num_work_group), cl::sycl::range<1>(num_work_group)),
+             num_work_group, reducer)
+          .wait();
       dev.deallocate_temp(temp_pointer);
     } else {
       dev.template unary_kernel_launcher<OutType, reduction_kernel_t>(self, data, thread_range, local_range, inputSize,
-                                                                      reducer).wait();
-
+                                                                      reducer)
+          .wait();
     }
   }
 };
@@ -570,8 +575,9 @@
 
     dev.template unary_kernel_launcher<typename Self::CoeffReturnType,
                                        TensorSycl::internal::GenericNondeterministicReducer<Self, Op>>(
-        self, output, cl::sycl::nd_range<1>(cl::sycl::range<1>(GRange), cl::sycl::range<1>(tileSize)), Index(1),
-        reducer, range, (num_values_to_reduce != 0) ? num_values_to_reduce : static_cast<Index>(1)).wait();
+           self, output, cl::sycl::nd_range<1>(cl::sycl::range<1>(GRange), cl::sycl::range<1>(tileSize)), Index(1),
+           reducer, range, (num_values_to_reduce != 0) ? num_values_to_reduce : static_cast<Index>(1))
+        .wait();
     return false;
   }
 };
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorRef.h b/unsupported/Eigen/CXX11/src/Tensor/TensorRef.h
index 996f47d..7061f51 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorRef.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorRef.h
@@ -20,8 +20,8 @@
 template <typename Dimensions, typename Scalar>
 class TensorLazyBaseEvaluator {
  public:
-  TensorLazyBaseEvaluator() : m_refcount(0) { }
-  virtual ~TensorLazyBaseEvaluator() { }
+  TensorLazyBaseEvaluator() : m_refcount(0) {}
+  virtual ~TensorLazyBaseEvaluator() {}
 
   EIGEN_DEVICE_FUNC virtual const Dimensions& dimensions() const = 0;
   EIGEN_DEVICE_FUNC virtual const Scalar* data() const = 0;
@@ -36,39 +36,31 @@
  private:
   // No copy, no assignment;
   TensorLazyBaseEvaluator(const TensorLazyBaseEvaluator& other);
-  TensorLazyBaseEvaluator& operator = (const TensorLazyBaseEvaluator& other);
+  TensorLazyBaseEvaluator& operator=(const TensorLazyBaseEvaluator& other);
 
   int m_refcount;
 };
 
-
 template <typename Dimensions, typename Expr, typename Device>
-class TensorLazyEvaluatorReadOnly : public TensorLazyBaseEvaluator<Dimensions, typename TensorEvaluator<Expr, Device>::Scalar> {
+class TensorLazyEvaluatorReadOnly
+    : public TensorLazyBaseEvaluator<Dimensions, typename TensorEvaluator<Expr, Device>::Scalar> {
  public:
   //  typedef typename TensorEvaluator<Expr, Device>::Dimensions Dimensions;
   typedef typename TensorEvaluator<Expr, Device>::Scalar Scalar;
   typedef StorageMemory<Scalar, Device> Storage;
   typedef typename Storage::Type EvaluatorPointerType;
-  typedef  TensorEvaluator<Expr, Device> EvalType;
+  typedef TensorEvaluator<Expr, Device> EvalType;
 
   TensorLazyEvaluatorReadOnly(const Expr& expr, const Device& device) : m_impl(expr, device), m_dummy(Scalar(0)) {
     m_dims = m_impl.dimensions();
     m_impl.evalSubExprsIfNeeded(NULL);
   }
-  virtual ~TensorLazyEvaluatorReadOnly() {
-    m_impl.cleanup();
-  }
+  virtual ~TensorLazyEvaluatorReadOnly() { m_impl.cleanup(); }
 
-  EIGEN_DEVICE_FUNC virtual const Dimensions& dimensions() const {
-    return m_dims;
-  }
-  EIGEN_DEVICE_FUNC virtual const Scalar* data() const {
-    return m_impl.data();
-  }
+  EIGEN_DEVICE_FUNC virtual const Dimensions& dimensions() const { return m_dims; }
+  EIGEN_DEVICE_FUNC virtual const Scalar* data() const { return m_impl.data(); }
 
-  EIGEN_DEVICE_FUNC virtual const Scalar coeff(DenseIndex index) const {
-    return m_impl.coeff(index);
-  }
+  EIGEN_DEVICE_FUNC virtual const Scalar coeff(DenseIndex index) const { return m_impl.coeff(index); }
   EIGEN_DEVICE_FUNC virtual Scalar& coeffRef(DenseIndex /*index*/) {
     eigen_assert(false && "can't reference the coefficient of a rvalue");
     return m_dummy;
@@ -88,207 +80,176 @@
   typedef StorageMemory<Scalar, Device> Storage;
   typedef typename Storage::Type EvaluatorPointerType;
 
-  TensorLazyEvaluatorWritable(const Expr& expr, const Device& device) : Base(expr, device) {
-  }
-  virtual ~TensorLazyEvaluatorWritable() {
-  }
+  TensorLazyEvaluatorWritable(const Expr& expr, const Device& device) : Base(expr, device) {}
+  virtual ~TensorLazyEvaluatorWritable() {}
 
-  EIGEN_DEVICE_FUNC virtual Scalar& coeffRef(DenseIndex index) {
-    return this->m_impl.coeffRef(index);
-  }
+  EIGEN_DEVICE_FUNC virtual Scalar& coeffRef(DenseIndex index) { return this->m_impl.coeffRef(index); }
 };
 
 template <typename Dimensions, typename Expr, typename Device>
 class TensorLazyEvaluator : public std::conditional_t<bool(internal::is_lvalue<Expr>::value),
-                            TensorLazyEvaluatorWritable<Dimensions, Expr, Device>,
-                            TensorLazyEvaluatorReadOnly<Dimensions, const Expr, Device> > {
+                                                      TensorLazyEvaluatorWritable<Dimensions, Expr, Device>,
+                                                      TensorLazyEvaluatorReadOnly<Dimensions, const Expr, Device> > {
  public:
   typedef std::conditional_t<bool(internal::is_lvalue<Expr>::value),
-                                  TensorLazyEvaluatorWritable<Dimensions, Expr, Device>,
-                                  TensorLazyEvaluatorReadOnly<Dimensions, const Expr, Device> > Base;
+                             TensorLazyEvaluatorWritable<Dimensions, Expr, Device>,
+                             TensorLazyEvaluatorReadOnly<Dimensions, const Expr, Device> >
+      Base;
   typedef typename Base::Scalar Scalar;
 
-  TensorLazyEvaluator(const Expr& expr, const Device& device) : Base(expr, device) {
-  }
-  virtual ~TensorLazyEvaluator() {
-  }
+  TensorLazyEvaluator(const Expr& expr, const Device& device) : Base(expr, device) {}
+  virtual ~TensorLazyEvaluator() {}
 };
 
 }  // namespace internal
 
-
 /** \class TensorRef
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief A reference to a tensor expression
-  * The expression will be evaluated lazily (as much as possible).
-  *
-  */
-template<typename PlainObjectType> class TensorRef : public TensorBase<TensorRef<PlainObjectType> >
-{
-  public:
-    typedef TensorRef<PlainObjectType> Self;
-    typedef typename PlainObjectType::Base Base;
-    typedef typename Eigen::internal::nested<Self>::type Nested;
-    typedef typename internal::traits<PlainObjectType>::StorageKind StorageKind;
-    typedef typename internal::traits<PlainObjectType>::Index Index;
-    typedef typename internal::traits<PlainObjectType>::Scalar Scalar;
-    typedef typename NumTraits<Scalar>::Real RealScalar;
-    typedef typename Base::CoeffReturnType CoeffReturnType;
-    typedef Scalar* PointerType;
-    typedef PointerType PointerArgType;
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief A reference to a tensor expression
+ * The expression will be evaluated lazily (as much as possible).
+ *
+ */
+template <typename PlainObjectType>
+class TensorRef : public TensorBase<TensorRef<PlainObjectType> > {
+ public:
+  typedef TensorRef<PlainObjectType> Self;
+  typedef typename PlainObjectType::Base Base;
+  typedef typename Eigen::internal::nested<Self>::type Nested;
+  typedef typename internal::traits<PlainObjectType>::StorageKind StorageKind;
+  typedef typename internal::traits<PlainObjectType>::Index Index;
+  typedef typename internal::traits<PlainObjectType>::Scalar Scalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef typename Base::CoeffReturnType CoeffReturnType;
+  typedef Scalar* PointerType;
+  typedef PointerType PointerArgType;
 
-    static constexpr Index NumIndices = PlainObjectType::NumIndices;
-    typedef typename PlainObjectType::Dimensions Dimensions;
+  static constexpr Index NumIndices = PlainObjectType::NumIndices;
+  typedef typename PlainObjectType::Dimensions Dimensions;
 
-    static constexpr int Layout = PlainObjectType::Layout;
-    enum {
-      IsAligned = false,
-      PacketAccess = false,
-      BlockAccess = false,
-      PreferBlockAccess = false,
-      CoordAccess = false,  // to be implemented
-      RawAccess = false
-    };
+  static constexpr int Layout = PlainObjectType::Layout;
+  enum {
+    IsAligned = false,
+    PacketAccess = false,
+    BlockAccess = false,
+    PreferBlockAccess = false,
+    CoordAccess = false,  // to be implemented
+    RawAccess = false
+  };
 
-    //===- Tensor block evaluation strategy (see TensorBlock.h) -----------===//
-    typedef internal::TensorBlockNotImplemented TensorBlock;
-    //===------------------------------------------------------------------===//
+  //===- Tensor block evaluation strategy (see TensorBlock.h) -----------===//
+  typedef internal::TensorBlockNotImplemented TensorBlock;
+  //===------------------------------------------------------------------===//
 
-    EIGEN_STRONG_INLINE TensorRef() : m_evaluator(NULL) {
-    }
+  EIGEN_STRONG_INLINE TensorRef() : m_evaluator(NULL) {}
 
-    template <typename Expression>
-    EIGEN_STRONG_INLINE TensorRef(const Expression& expr) : m_evaluator(new internal::TensorLazyEvaluator<Dimensions, Expression, DefaultDevice>(expr, DefaultDevice())) {
-      m_evaluator->incrRefCount();
-    }
+  template <typename Expression>
+  EIGEN_STRONG_INLINE TensorRef(const Expression& expr)
+      : m_evaluator(new internal::TensorLazyEvaluator<Dimensions, Expression, DefaultDevice>(expr, DefaultDevice())) {
+    m_evaluator->incrRefCount();
+  }
 
-    template <typename Expression>
-    EIGEN_STRONG_INLINE TensorRef& operator = (const Expression& expr) {
+  template <typename Expression>
+  EIGEN_STRONG_INLINE TensorRef& operator=(const Expression& expr) {
+    unrefEvaluator();
+    m_evaluator = new internal::TensorLazyEvaluator<Dimensions, Expression, DefaultDevice>(expr, DefaultDevice());
+    m_evaluator->incrRefCount();
+    return *this;
+  }
+
+  ~TensorRef() { unrefEvaluator(); }
+
+  TensorRef(const TensorRef& other) : TensorBase<TensorRef<PlainObjectType> >(other), m_evaluator(other.m_evaluator) {
+    eigen_assert(m_evaluator->refCount() > 0);
+    m_evaluator->incrRefCount();
+  }
+
+  TensorRef& operator=(const TensorRef& other) {
+    if (this != &other) {
       unrefEvaluator();
-      m_evaluator = new internal::TensorLazyEvaluator<Dimensions, Expression, DefaultDevice>(expr, DefaultDevice());
-      m_evaluator->incrRefCount();
-      return *this;
-    }
-
-    ~TensorRef() {
-      unrefEvaluator();
-    }
-
-    TensorRef(const TensorRef& other) : TensorBase<TensorRef<PlainObjectType> >(other), m_evaluator(other.m_evaluator) {
+      m_evaluator = other.m_evaluator;
       eigen_assert(m_evaluator->refCount() > 0);
       m_evaluator->incrRefCount();
     }
+    return *this;
+  }
 
-    TensorRef& operator = (const TensorRef& other) {
-      if (this != &other) {
-        unrefEvaluator();
-        m_evaluator = other.m_evaluator;
-        eigen_assert(m_evaluator->refCount() > 0);
-        m_evaluator->incrRefCount();
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index rank() const { return m_evaluator->dimensions().size(); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index dimension(Index n) const { return m_evaluator->dimensions()[n]; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_evaluator->dimensions(); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index size() const { return m_evaluator->dimensions().TotalSize(); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar* data() const { return m_evaluator->data(); }
+
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(Index index) const { return m_evaluator->coeff(index); }
+
+  template <typename... IndexTypes>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(Index firstIndex, IndexTypes... otherIndices) const {
+    const std::size_t num_indices = (sizeof...(otherIndices) + 1);
+    const array<Index, num_indices> indices{{firstIndex, otherIndices...}};
+    return coeff(indices);
+  }
+  template <typename... IndexTypes>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index firstIndex, IndexTypes... otherIndices) {
+    const std::size_t num_indices = (sizeof...(otherIndices) + 1);
+    const array<Index, num_indices> indices{{firstIndex, otherIndices...}};
+    return coeffRef(indices);
+  }
+
+  template <std::size_t NumIndices>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar coeff(const array<Index, NumIndices>& indices) const {
+    const Dimensions& dims = this->dimensions();
+    Index index = 0;
+    if (PlainObjectType::Options & RowMajor) {
+      index += indices[0];
+      for (size_t i = 1; i < NumIndices; ++i) {
+        index = index * dims[i] + indices[i];
       }
-      return *this;
-    }
-
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Index rank() const { return m_evaluator->dimensions().size(); }
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Index dimension(Index n) const { return m_evaluator->dimensions()[n]; }
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_evaluator->dimensions(); }
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Index size() const { return m_evaluator->dimensions().TotalSize(); }
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE const Scalar* data() const { return m_evaluator->data(); }
-
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE const Scalar operator()(Index index) const
-    {
-      return m_evaluator->coeff(index);
-    }
-
-    template<typename... IndexTypes> EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE const Scalar operator()(Index firstIndex, IndexTypes... otherIndices) const
-    {
-      const std::size_t num_indices = (sizeof...(otherIndices) + 1);
-      const array<Index, num_indices> indices{{firstIndex, otherIndices...}};
-      return coeff(indices);
-    }
-    template<typename... IndexTypes> EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Scalar& coeffRef(Index firstIndex, IndexTypes... otherIndices)
-    {
-      const std::size_t num_indices = (sizeof...(otherIndices) + 1);
-      const array<Index, num_indices> indices{{firstIndex, otherIndices...}};
-      return coeffRef(indices);
-    }
-
-    template <std::size_t NumIndices> EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE const Scalar coeff(const array<Index, NumIndices>& indices) const
-    {
-      const Dimensions& dims = this->dimensions();
-      Index index = 0;
-      if (PlainObjectType::Options & RowMajor) {
-        index += indices[0];
-        for (size_t i = 1; i < NumIndices; ++i) {
-          index = index * dims[i] + indices[i];
-        }
-      } else {
-        index += indices[NumIndices-1];
-        for (int i = NumIndices-2; i >= 0; --i) {
-          index = index * dims[i] + indices[i];
-        }
-      }
-      return m_evaluator->coeff(index);
-    }
-    template <std::size_t NumIndices> EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Scalar& coeffRef(const array<Index, NumIndices>& indices)
-    {
-      const Dimensions& dims = this->dimensions();
-      Index index = 0;
-      if (PlainObjectType::Options & RowMajor) {
-        index += indices[0];
-        for (size_t i = 1; i < NumIndices; ++i) {
-          index = index * dims[i] + indices[i];
-        }
-      } else {
-        index += indices[NumIndices-1];
-        for (int i = NumIndices-2; i >= 0; --i) {
-          index = index * dims[i] + indices[i];
-        }
-      }
-      return m_evaluator->coeffRef(index);
-    }
-
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE const Scalar coeff(Index index) const
-    {
-      return m_evaluator->coeff(index);
-    }
-
-    EIGEN_DEVICE_FUNC
-    EIGEN_STRONG_INLINE Scalar& coeffRef(Index index)
-    {
-      return m_evaluator->coeffRef(index);
-    }
-
-  private:
-    EIGEN_STRONG_INLINE void unrefEvaluator() {
-      if (m_evaluator) {
-        m_evaluator->decrRefCount();
-        if (m_evaluator->refCount() == 0) {
-          delete m_evaluator;
-        }
+    } else {
+      index += indices[NumIndices - 1];
+      for (int i = NumIndices - 2; i >= 0; --i) {
+        index = index * dims[i] + indices[i];
       }
     }
+    return m_evaluator->coeff(index);
+  }
+  template <std::size_t NumIndices>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(const array<Index, NumIndices>& indices) {
+    const Dimensions& dims = this->dimensions();
+    Index index = 0;
+    if (PlainObjectType::Options & RowMajor) {
+      index += indices[0];
+      for (size_t i = 1; i < NumIndices; ++i) {
+        index = index * dims[i] + indices[i];
+      }
+    } else {
+      index += indices[NumIndices - 1];
+      for (int i = NumIndices - 2; i >= 0; --i) {
+        index = index * dims[i] + indices[i];
+      }
+    }
+    return m_evaluator->coeffRef(index);
+  }
+
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar coeff(Index index) const { return m_evaluator->coeff(index); }
+
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index index) { return m_evaluator->coeffRef(index); }
+
+ private:
+  EIGEN_STRONG_INLINE void unrefEvaluator() {
+    if (m_evaluator) {
+      m_evaluator->decrRefCount();
+      if (m_evaluator->refCount() == 0) {
+        delete m_evaluator;
+      }
+    }
+  }
 
   internal::TensorLazyBaseEvaluator<Dimensions, Scalar>* m_evaluator;
 };
 
-
 // evaluator for rvalues
-template<typename Derived, typename Device>
-struct TensorEvaluator<const TensorRef<Derived>, Device>
-{
+template <typename Derived, typename Device>
+struct TensorEvaluator<const TensorRef<Derived>, Device> {
   typedef typename Derived::Index Index;
   typedef typename Derived::Scalar Scalar;
   typedef typename Derived::Scalar CoeffReturnType;
@@ -311,25 +272,17 @@
   typedef internal::TensorBlockNotImplemented TensorBlock;
   //===--------------------------------------------------------------------===//
 
-  EIGEN_STRONG_INLINE TensorEvaluator(const TensorRef<Derived>& m, const Device&)
-      : m_ref(m)
-  { }
+  EIGEN_STRONG_INLINE TensorEvaluator(const TensorRef<Derived>& m, const Device&) : m_ref(m) {}
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_ref.dimensions(); }
 
-  EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType) {
-    return true;
-  }
+  EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType) { return true; }
 
-  EIGEN_STRONG_INLINE void cleanup() { }
+  EIGEN_STRONG_INLINE void cleanup() {}
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
-    return m_ref.coeff(index);
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const { return m_ref.coeff(index); }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index index) {
-    return m_ref.coeffRef(index);
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index index) { return m_ref.coeffRef(index); }
 
   EIGEN_DEVICE_FUNC const Scalar* data() const { return m_ref.data(); }
 
@@ -337,11 +290,9 @@
   TensorRef<Derived> m_ref;
 };
 
-
 // evaluator for lvalues
-template<typename Derived, typename Device>
-struct TensorEvaluator<TensorRef<Derived>, Device> : public TensorEvaluator<const TensorRef<Derived>, Device>
-{
+template <typename Derived, typename Device>
+struct TensorEvaluator<TensorRef<Derived>, Device> : public TensorEvaluator<const TensorRef<Derived>, Device> {
   typedef typename Derived::Index Index;
   typedef typename Derived::Scalar Scalar;
   typedef typename Derived::Scalar CoeffReturnType;
@@ -350,28 +301,17 @@
 
   typedef TensorEvaluator<const TensorRef<Derived>, Device> Base;
 
-  enum {
-    IsAligned = false,
-    PacketAccess = false,
-    BlockAccess = false,
-    PreferBlockAccess = false,
-    RawAccess = false
-  };
+  enum { IsAligned = false, PacketAccess = false, BlockAccess = false, PreferBlockAccess = false, RawAccess = false };
 
   //===- Tensor block evaluation strategy (see TensorBlock.h) -------------===//
   typedef internal::TensorBlockNotImplemented TensorBlock;
   //===--------------------------------------------------------------------===//
 
-  EIGEN_STRONG_INLINE TensorEvaluator(TensorRef<Derived>& m, const Device& d) : Base(m, d)
-  { }
+  EIGEN_STRONG_INLINE TensorEvaluator(TensorRef<Derived>& m, const Device& d) : Base(m, d) {}
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index index) {
-    return this->m_ref.coeffRef(index);
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index index) { return this->m_ref.coeffRef(index); }
 };
 
+}  // end namespace Eigen
 
-
-} // end namespace Eigen
-
-#endif // EIGEN_CXX11_TENSOR_TENSOR_REF_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_REF_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorReverse.h b/unsupported/Eigen/CXX11/src/Tensor/TensorReverse.h
index 7515fd5..a81a2ba 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorReverse.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorReverse.h
@@ -16,16 +16,14 @@
 namespace Eigen {
 
 /** \class TensorReverse
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Tensor reverse elements class.
-  *
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Tensor reverse elements class.
+ *
+ */
 namespace internal {
-template<typename ReverseDimensions, typename XprType>
-struct traits<TensorReverseOp<ReverseDimensions,
-                              XprType> > : public traits<XprType>
-{
+template <typename ReverseDimensions, typename XprType>
+struct traits<TensorReverseOp<ReverseDimensions, XprType> > : public traits<XprType> {
   typedef typename XprType::Scalar Scalar;
   typedef traits<XprType> XprTraits;
   typedef typename XprTraits::StorageKind StorageKind;
@@ -37,58 +35,47 @@
   typedef typename XprTraits::PointerType PointerType;
 };
 
-template<typename ReverseDimensions, typename XprType>
-struct eval<TensorReverseOp<ReverseDimensions, XprType>, Eigen::Dense>
-{
+template <typename ReverseDimensions, typename XprType>
+struct eval<TensorReverseOp<ReverseDimensions, XprType>, Eigen::Dense> {
   typedef const TensorReverseOp<ReverseDimensions, XprType>& type;
 };
 
-template<typename ReverseDimensions, typename XprType>
+template <typename ReverseDimensions, typename XprType>
 struct nested<TensorReverseOp<ReverseDimensions, XprType>, 1,
-            typename eval<TensorReverseOp<ReverseDimensions, XprType> >::type>
-{
+              typename eval<TensorReverseOp<ReverseDimensions, XprType> >::type> {
   typedef TensorReverseOp<ReverseDimensions, XprType> type;
 };
 
 }  // end namespace internal
 
-template<typename ReverseDimensions, typename XprType>
-class TensorReverseOp : public TensorBase<TensorReverseOp<ReverseDimensions,
-                                          XprType>, WriteAccessors>
-{
-  public:
-    typedef TensorBase<TensorReverseOp<ReverseDimensions, XprType>, WriteAccessors>Base;
-    typedef typename Eigen::internal::traits<TensorReverseOp>::Scalar Scalar;
-    typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
-    typedef typename XprType::CoeffReturnType CoeffReturnType;
-    typedef typename Eigen::internal::nested<TensorReverseOp>::type Nested;
-    typedef typename Eigen::internal::traits<TensorReverseOp>::StorageKind
-                                                                      StorageKind;
-    typedef typename Eigen::internal::traits<TensorReverseOp>::Index Index;
+template <typename ReverseDimensions, typename XprType>
+class TensorReverseOp : public TensorBase<TensorReverseOp<ReverseDimensions, XprType>, WriteAccessors> {
+ public:
+  typedef TensorBase<TensorReverseOp<ReverseDimensions, XprType>, WriteAccessors> Base;
+  typedef typename Eigen::internal::traits<TensorReverseOp>::Scalar Scalar;
+  typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
+  typedef typename XprType::CoeffReturnType CoeffReturnType;
+  typedef typename Eigen::internal::nested<TensorReverseOp>::type Nested;
+  typedef typename Eigen::internal::traits<TensorReverseOp>::StorageKind StorageKind;
+  typedef typename Eigen::internal::traits<TensorReverseOp>::Index Index;
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorReverseOp(
-      const XprType& expr, const ReverseDimensions& reverse_dims)
-      : m_xpr(expr), m_reverse_dims(reverse_dims) { }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorReverseOp(const XprType& expr, const ReverseDimensions& reverse_dims)
+      : m_xpr(expr), m_reverse_dims(reverse_dims) {}
 
-    EIGEN_DEVICE_FUNC
-    const ReverseDimensions& reverse() const { return m_reverse_dims; }
+  EIGEN_DEVICE_FUNC const ReverseDimensions& reverse() const { return m_reverse_dims; }
 
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<typename XprType::Nested>&
-    expression() const { return m_xpr; }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename XprType::Nested>& expression() const { return m_xpr; }
 
-    EIGEN_TENSOR_INHERIT_ASSIGNMENT_OPERATORS(TensorReverseOp)
+  EIGEN_TENSOR_INHERIT_ASSIGNMENT_OPERATORS(TensorReverseOp)
 
-
-  protected:
-    typename XprType::Nested m_xpr;
-    const ReverseDimensions m_reverse_dims;
+ protected:
+  typename XprType::Nested m_xpr;
+  const ReverseDimensions m_reverse_dims;
 };
 
 // Eval as rvalue
-template<typename ReverseDimensions, typename ArgType, typename Device>
-struct TensorEvaluator<const TensorReverseOp<ReverseDimensions, ArgType>, Device>
-{
+template <typename ReverseDimensions, typename ArgType, typename Device>
+struct TensorEvaluator<const TensorReverseOp<ReverseDimensions, ArgType>, Device> {
   typedef TensorReverseOp<ReverseDimensions, ArgType> XprType;
   typedef typename XprType::Index Index;
   static constexpr int NumDims = internal::array_size<ReverseDimensions>::value;
@@ -102,12 +89,12 @@
 
   static constexpr int Layout = TensorEvaluator<ArgType, Device>::Layout;
   enum {
-    IsAligned         = false,
-    PacketAccess      = TensorEvaluator<ArgType, Device>::PacketAccess,
-    BlockAccess       = NumDims > 0,
+    IsAligned = false,
+    PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
+    BlockAccess = NumDims > 0,
     PreferBlockAccess = true,
-    CoordAccess       = false,  // to be implemented
-    RawAccess         = false
+    CoordAccess = false,  // to be implemented
+    RawAccess = false
   };
 
   typedef internal::TensorIntDivisor<Index> IndexDivisor;
@@ -116,19 +103,13 @@
   typedef internal::TensorBlockDescriptor<NumDims, Index> TensorBlockDesc;
   typedef internal::TensorBlockScratchAllocator<Device> TensorBlockScratch;
 
-  typedef typename TensorEvaluator<const ArgType, Device>::TensorBlock
-      ArgTensorBlock;
+  typedef typename TensorEvaluator<const ArgType, Device>::TensorBlock ArgTensorBlock;
 
-  typedef typename internal::TensorMaterializedBlock<CoeffReturnType, NumDims,
-                                                     Layout, Index>
-      TensorBlock;
+  typedef typename internal::TensorMaterializedBlock<CoeffReturnType, NumDims, Layout, Index> TensorBlock;
   //===--------------------------------------------------------------------===//
 
   EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
-      : m_impl(op.expression(), device),
-        m_reverse(op.reverse()),
-        m_device(device)
-  {
+      : m_impl(op.expression(), device), m_reverse(op.reverse()), m_device(device) {
     // Reversing a scalar isn't supported yet. It would be a no-op anyway.
     EIGEN_STATIC_ASSERT((NumDims > 0), YOU_MADE_A_PROGRAMMING_MISTAKE);
 
@@ -137,20 +118,19 @@
     if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
       m_strides[0] = 1;
       for (int i = 1; i < NumDims; ++i) {
-        m_strides[i] = m_strides[i-1] * m_dimensions[i-1];
+        m_strides[i] = m_strides[i - 1] * m_dimensions[i - 1];
         if (m_strides[i] > 0) m_fastStrides[i] = IndexDivisor(m_strides[i]);
       }
     } else {
-      m_strides[NumDims-1] = 1;
+      m_strides[NumDims - 1] = 1;
       for (int i = NumDims - 2; i >= 0; --i) {
-        m_strides[i] = m_strides[i+1] * m_dimensions[i+1];
+        m_strides[i] = m_strides[i + 1] * m_dimensions[i + 1];
         if (m_strides[i] > 0) m_fastStrides[i] = IndexDivisor(m_strides[i]);
       }
     }
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  const Dimensions& dimensions() const { return m_dimensions; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; }
 
   EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType) {
     m_impl.evalSubExprsIfNeeded(NULL);
@@ -159,18 +139,14 @@
 
 #ifdef EIGEN_USE_THREADS
   template <typename EvalSubExprsCallback>
-  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(
-      EvaluatorPointerType, EvalSubExprsCallback done) {
+  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(EvaluatorPointerType, EvalSubExprsCallback done) {
     m_impl.evalSubExprsIfNeededAsync(nullptr, [done](bool) { done(true); });
   }
 #endif  // EIGEN_USE_THREADS
 
-  EIGEN_STRONG_INLINE void cleanup() {
-    m_impl.cleanup();
-  }
+  EIGEN_STRONG_INLINE void cleanup() { m_impl.cleanup(); }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index reverseIndex(
-      Index index) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index reverseIndex(Index index) const {
     eigen_assert(index < dimensions().TotalSize());
     Index inputIndex = 0;
     if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
@@ -181,7 +157,7 @@
         if (m_reverse[i]) {
           idx = m_dimensions[i] - idx - 1;
         }
-        inputIndex += idx * m_strides[i] ;
+        inputIndex += idx * m_strides[i];
       }
       if (m_reverse[0]) {
         inputIndex += (m_dimensions[0] - index - 1);
@@ -196,10 +172,10 @@
         if (m_reverse[i]) {
           idx = m_dimensions[i] - idx - 1;
         }
-        inputIndex += idx * m_strides[i] ;
+        inputIndex += idx * m_strides[i];
       }
-      if (m_reverse[NumDims-1]) {
-        inputIndex += (m_dimensions[NumDims-1] - index - 1);
+      if (m_reverse[NumDims - 1]) {
+        inputIndex += (m_dimensions[NumDims - 1] - index - 1);
       } else {
         inputIndex += index;
       }
@@ -207,42 +183,34 @@
     return inputIndex;
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(
-      Index index) const  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
     return m_impl.coeff(reverseIndex(index));
   }
 
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  PacketReturnType packet(Index index) const
-  {
-    eigen_assert(index+PacketSize-1 < dimensions().TotalSize());
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const {
+    eigen_assert(index + PacketSize - 1 < dimensions().TotalSize());
 
     // TODO(ndjaitly): write a better packing routine that uses
     // local structure.
-    EIGEN_ALIGN_MAX std::remove_const_t<CoeffReturnType>
-                                                            values[PacketSize];
+    EIGEN_ALIGN_MAX std::remove_const_t<CoeffReturnType> values[PacketSize];
     EIGEN_UNROLL_LOOP
     for (int i = 0; i < PacketSize; ++i) {
-      values[i] = coeff(index+i);
+      values[i] = coeff(index + i);
     }
     PacketReturnType rslt = internal::pload<PacketReturnType>(values);
     return rslt;
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  internal::TensorBlockResourceRequirements getResourceRequirements() const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE internal::TensorBlockResourceRequirements getResourceRequirements() const {
     const size_t target_size = m_device.lastLevelCacheSize();
     // Block evaluation reads underlying memory in reverse order, and default
     // cost model does not properly catch this in bytes stored/loaded.
-    return internal::TensorBlockResourceRequirements::skewed<Scalar>(
-               target_size)
-        .addCostPerCoeff({0, 0, 24});
+    return internal::TensorBlockResourceRequirements::skewed<Scalar>(target_size).addCostPerCoeff({0, 0, 24});
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock
-  block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
-          bool /*root_of_expr_ast*/ = false) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
+                                                          bool /*root_of_expr_ast*/ = false) const {
     // TODO(ezhulenev): If underlying tensor expression supports and prefers
     // block evaluation we must use it. Currently we use coeff and packet
     // access into the underlying tensor expression.
@@ -250,8 +218,7 @@
     //     TensorEvaluator<ArgType, Device>::BlockAccess &&
     //     TensorEvaluator<ArgType, Device>::PreferBlockAccess;
 
-    static const bool isColMajor =
-        static_cast<int>(Layout) == static_cast<int>(ColMajor);
+    static const bool isColMajor = static_cast<int>(Layout) == static_cast<int>(ColMajor);
 
     static const Index inner_dim_idx = isColMajor ? 0 : NumDims - 1;
     const bool inner_dim_reversed = m_reverse[inner_dim_idx];
@@ -271,8 +238,7 @@
       it[i].count = 0;
       it[i].reverse = m_reverse[dim];
 
-      it[i].block_stride =
-          i == 0 ? 1 : (it[i - 1].size * it[i - 1].block_stride);
+      it[i].block_stride = i == 0 ? 1 : (it[i - 1].size * it[i - 1].block_stride);
       it[i].block_span = it[i].block_stride * (it[i].size - 1);
 
       it[i].input_stride = m_strides[dim];
@@ -304,14 +270,12 @@
     }
 
     eigen_assert(it[effective_inner_dim].block_stride == 1);
-    eigen_assert(it[effective_inner_dim].input_stride ==
-                 (inner_dim_reversed ? -1 : 1));
+    eigen_assert(it[effective_inner_dim].input_stride == (inner_dim_reversed ? -1 : 1));
 
     const Index inner_dim_size = it[effective_inner_dim].size;
 
     // Prepare storage for the materialized reverse result.
-    const typename TensorBlock::Storage block_storage =
-        TensorBlock::prepareStorage(desc, scratch);
+    const typename TensorBlock::Storage block_storage = TensorBlock::prepareStorage(desc, scratch);
     CoeffReturnType* block_buffer = block_storage.data();
 
     while (it[NumDims - 1].count < it[NumDims - 1].size) {
@@ -355,16 +319,14 @@
   }
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const {
-    double compute_cost = NumDims * (2 * TensorOpCost::AddCost<Index>() +
-                                     2 * TensorOpCost::MulCost<Index>() +
+    double compute_cost = NumDims * (2 * TensorOpCost::AddCost<Index>() + 2 * TensorOpCost::MulCost<Index>() +
                                      TensorOpCost::DivCost<Index>());
     for (int i = 0; i < NumDims; ++i) {
       if (m_reverse[i]) {
         compute_cost += 2 * TensorOpCost::AddCost<Index>();
       }
     }
-    return m_impl.costPerCoeff(vectorized) +
-           TensorOpCost(0, 0, compute_cost, false /* vectorized */, PacketSize);
+    return m_impl.costPerCoeff(vectorized) + TensorOpCost(0, 0, compute_cost, false /* vectorized */, PacketSize);
   }
 
   EIGEN_DEVICE_FUNC typename Storage::Type data() const { return NULL; }
@@ -380,13 +342,7 @@
  private:
   struct BlockIteratorState {
     BlockIteratorState()
-        : size(0),
-          count(0),
-          reverse(false),
-          block_stride(0),
-          block_span(0),
-          input_stride(0),
-          input_span(0) {}
+        : size(0), count(0), reverse(false), block_stride(0), block_span(0), input_stride(0), input_span(0) {}
 
     Index size;
     Index count;
@@ -402,10 +358,8 @@
 
 template <typename ReverseDimensions, typename ArgType, typename Device>
 struct TensorEvaluator<TensorReverseOp<ReverseDimensions, ArgType>, Device>
-    : public TensorEvaluator<const TensorReverseOp<ReverseDimensions, ArgType>,
-                             Device> {
-  typedef TensorEvaluator<const TensorReverseOp<ReverseDimensions, ArgType>,
-                          Device> Base;
+    : public TensorEvaluator<const TensorReverseOp<ReverseDimensions, ArgType>, Device> {
+  typedef TensorEvaluator<const TensorReverseOp<ReverseDimensions, ArgType>, Device> Base;
   typedef TensorReverseOp<ReverseDimensions, ArgType> XprType;
   typedef typename XprType::Index Index;
   static constexpr int NumDims = internal::array_size<ReverseDimensions>::value;
@@ -420,8 +374,7 @@
     CoordAccess = false,  // to be implemented
     RawAccess = false
   };
-  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
-      : Base(op, device) {}
+  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) : Base(op, device) {}
 
   typedef typename XprType::Scalar Scalar;
   typedef typename XprType::CoeffReturnType CoeffReturnType;
@@ -432,28 +385,26 @@
   typedef internal::TensorBlockNotImplemented TensorBlock;
   //===--------------------------------------------------------------------===//
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  const Dimensions& dimensions() const { return this->m_dimensions; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return this->m_dimensions; }
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index index) const {
     return this->m_impl.coeffRef(this->reverseIndex(index));
   }
 
-  template <int StoreMode> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  void writePacket(Index index, const PacketReturnType& x) const {
-    eigen_assert(index+PacketSize-1 < dimensions().TotalSize());
+  template <int StoreMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void writePacket(Index index, const PacketReturnType& x) const {
+    eigen_assert(index + PacketSize - 1 < dimensions().TotalSize());
 
     // This code is pilfered from TensorMorphing.h
     EIGEN_ALIGN_MAX CoeffReturnType values[PacketSize];
     internal::pstore<CoeffReturnType, PacketReturnType>(values, x);
     EIGEN_UNROLL_LOOP
     for (int i = 0; i < PacketSize; ++i) {
-      this->coeffRef(index+i) = values[i];
+      this->coeffRef(index + i) = values[i];
     }
   }
 };
 
-
 }  // end namespace Eigen
 
-#endif // EIGEN_CXX11_TENSOR_TENSOR_REVERSE_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_REVERSE_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorScan.h b/unsupported/Eigen/CXX11/src/Tensor/TensorScan.h
index 4f4a93e..d16d149 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorScan.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorScan.h
@@ -18,8 +18,7 @@
 namespace internal {
 
 template <typename Op, typename XprType>
-struct traits<TensorScanOp<Op, XprType> >
-    : public traits<XprType> {
+struct traits<TensorScanOp<Op, XprType> > : public traits<XprType> {
   typedef typename XprType::Scalar Scalar;
   typedef traits<XprType> XprTraits;
   typedef typename XprTraits::StorageKind StorageKind;
@@ -30,29 +29,25 @@
   typedef typename XprTraits::PointerType PointerType;
 };
 
-template<typename Op, typename XprType>
-struct eval<TensorScanOp<Op, XprType>, Eigen::Dense>
-{
+template <typename Op, typename XprType>
+struct eval<TensorScanOp<Op, XprType>, Eigen::Dense> {
   typedef const TensorScanOp<Op, XprType>& type;
 };
 
-template<typename Op, typename XprType>
-struct nested<TensorScanOp<Op, XprType>, 1,
-            typename eval<TensorScanOp<Op, XprType> >::type>
-{
+template <typename Op, typename XprType>
+struct nested<TensorScanOp<Op, XprType>, 1, typename eval<TensorScanOp<Op, XprType> >::type> {
   typedef TensorScanOp<Op, XprType> type;
 };
-} // end namespace internal
+}  // end namespace internal
 
 /** \class TensorScan
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Tensor scan class.
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Tensor scan class.
+ */
 template <typename Op, typename XprType>
-class TensorScanOp
-    : public TensorBase<TensorScanOp<Op, XprType>, ReadOnlyAccessors> {
-public:
+class TensorScanOp : public TensorBase<TensorScanOp<Op, XprType>, ReadOnlyAccessors> {
+ public:
   typedef typename Eigen::internal::traits<TensorScanOp>::Scalar Scalar;
   typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
   typedef typename XprType::CoeffReturnType CoeffReturnType;
@@ -60,32 +55,26 @@
   typedef typename Eigen::internal::traits<TensorScanOp>::StorageKind StorageKind;
   typedef typename Eigen::internal::traits<TensorScanOp>::Index Index;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorScanOp(
-      const XprType& expr, const Index& axis, bool exclusive = false, const Op& op = Op())
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorScanOp(const XprType& expr, const Index& axis, bool exclusive = false,
+                                                     const Op& op = Op())
       : m_expr(expr), m_axis(axis), m_accumulator(op), m_exclusive(exclusive) {}
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  const Index axis() const { return m_axis; }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  const XprType& expression() const { return m_expr; }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  const Op accumulator() const { return m_accumulator; }
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  bool exclusive() const { return m_exclusive; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Index axis() const { return m_axis; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const XprType& expression() const { return m_expr; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Op accumulator() const { return m_accumulator; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool exclusive() const { return m_exclusive; }
 
-protected:
+ protected:
   typename XprType::Nested m_expr;
   const Index m_axis;
   const Op m_accumulator;
   const bool m_exclusive;
 };
 
-
 namespace internal {
 
 template <typename Self>
-EIGEN_STRONG_INLINE void ReduceScalar(Self& self, Index offset,
-                                      typename Self::CoeffReturnType* data) {
+EIGEN_STRONG_INLINE void ReduceScalar(Self& self, Index offset, typename Self::CoeffReturnType* data) {
   // Compute the scan along the axis, starting at the given offset
   typename Self::CoeffReturnType accum = self.accumulator().initialize();
   if (self.stride() == 1) {
@@ -118,8 +107,7 @@
 }
 
 template <typename Self>
-EIGEN_STRONG_INLINE void ReducePacket(Self& self, Index offset,
-                                      typename Self::CoeffReturnType* data) {
+EIGEN_STRONG_INLINE void ReducePacket(Self& self, Index offset, typename Self::CoeffReturnType* data) {
   using Scalar = typename Self::CoeffReturnType;
   using Packet = typename Self::PacketReturnType;
   // Compute the scan along the axis, starting at the calculated offset
@@ -155,8 +143,7 @@
 
 template <typename Self, bool Vectorize, bool Parallel>
 struct ReduceBlock {
-  EIGEN_STRONG_INLINE void operator()(Self& self, Index idx1,
-                                      typename Self::CoeffReturnType* data) {
+  EIGEN_STRONG_INLINE void operator()(Self& self, Index idx1, typename Self::CoeffReturnType* data) {
     for (Index idx2 = 0; idx2 < self.stride(); idx2++) {
       // Calculate the starting offset for the scan
       Index offset = idx1 + idx2;
@@ -168,8 +155,7 @@
 // Specialization for vectorized reduction.
 template <typename Self>
 struct ReduceBlock<Self, /*Vectorize=*/true, /*Parallel=*/false> {
-  EIGEN_STRONG_INLINE void operator()(Self& self, Index idx1,
-                                      typename Self::CoeffReturnType* data) {
+  EIGEN_STRONG_INLINE void operator()(Self& self, Index idx1, typename Self::CoeffReturnType* data) {
     using Packet = typename Self::PacketReturnType;
     const int PacketSize = internal::unpacket_traits<Packet>::size;
     Index idx2 = 0;
@@ -188,9 +174,8 @@
 
 // Single-threaded CPU implementation of scan
 template <typename Self, typename Reducer, typename Device,
-          bool Vectorize =
-              (TensorEvaluator<typename Self::ChildTypeNoConst, Device>::PacketAccess &&
-               internal::reducer_traits<Reducer, Device>::PacketAccess)>
+          bool Vectorize = (TensorEvaluator<typename Self::ChildTypeNoConst, Device>::PacketAccess &&
+                            internal::reducer_traits<Reducer, Device>::PacketAccess)>
 struct ScanLauncher {
   void operator()(Self& self, typename Self::CoeffReturnType* data) const {
     Index total_size = internal::array_prod(self.dimensions());
@@ -213,15 +198,13 @@
 // processors.
 EIGEN_STRONG_INLINE Index AdjustBlockSize(Index item_size, Index block_size) {
   EIGEN_CONSTEXPR Index kBlockAlignment = 128;
-  const Index items_per_cacheline =
-      numext::maxi<Index>(1, kBlockAlignment / item_size);
+  const Index items_per_cacheline = numext::maxi<Index>(1, kBlockAlignment / item_size);
   return items_per_cacheline * numext::div_ceil(block_size, items_per_cacheline);
 }
 
 template <typename Self>
 struct ReduceBlock<Self, /*Vectorize=*/true, /*Parallel=*/true> {
-  EIGEN_STRONG_INLINE void operator()(Self& self, Index idx1,
-                                      typename Self::CoeffReturnType* data) {
+  EIGEN_STRONG_INLINE void operator()(Self& self, Index idx1, typename Self::CoeffReturnType* data) {
     using Scalar = typename Self::CoeffReturnType;
     using Packet = typename Self::PacketReturnType;
     const int PacketSize = internal::unpacket_traits<Packet>::size;
@@ -231,28 +214,24 @@
       num_packets = self.stride() / PacketSize;
       self.device().parallelFor(
           num_packets,
-        TensorOpCost(PacketSize * self.size(), PacketSize * self.size(),
-                     16 * PacketSize * self.size(), true, PacketSize),
-        // Make the shard size large enough that two neighboring threads
-        // won't write to the same cacheline of `data`.
-        [=](Index blk_size) {
-          return AdjustBlockSize(PacketSize * sizeof(Scalar), blk_size);
-        },
-        [&](Index first, Index last) {
-          for (Index packet = first; packet < last; ++packet) {
-            const Index idx2 = packet * PacketSize;
-            ReducePacket(self, idx1 + idx2, data);
-          }
-        });
+          TensorOpCost(PacketSize * self.size(), PacketSize * self.size(), 16 * PacketSize * self.size(), true,
+                       PacketSize),
+          // Make the shard size large enough that two neighboring threads
+          // won't write to the same cacheline of `data`.
+          [=](Index blk_size) { return AdjustBlockSize(PacketSize * sizeof(Scalar), blk_size); },
+          [&](Index first, Index last) {
+            for (Index packet = first; packet < last; ++packet) {
+              const Index idx2 = packet * PacketSize;
+              ReducePacket(self, idx1 + idx2, data);
+            }
+          });
       num_scalars -= num_packets * PacketSize;
     }
     self.device().parallelFor(
         num_scalars, TensorOpCost(self.size(), self.size(), 16 * self.size()),
         // Make the shard size large enough that two neighboring threads
         // won't write to the same cacheline of `data`.
-        [=](Index blk_size) {
-          return AdjustBlockSize(sizeof(Scalar), blk_size);
-        },
+        [=](Index blk_size) { return AdjustBlockSize(sizeof(Scalar), blk_size); },
         [&](Index first, Index last) {
           for (Index scalar = first; scalar < last; ++scalar) {
             const Index idx2 = num_packets * PacketSize + scalar;
@@ -264,16 +243,13 @@
 
 template <typename Self>
 struct ReduceBlock<Self, /*Vectorize=*/false, /*Parallel=*/true> {
-  EIGEN_STRONG_INLINE void operator()(Self& self, Index idx1,
-                                      typename Self::CoeffReturnType* data) {
+  EIGEN_STRONG_INLINE void operator()(Self& self, Index idx1, typename Self::CoeffReturnType* data) {
     using Scalar = typename Self::CoeffReturnType;
     self.device().parallelFor(
         self.stride(), TensorOpCost(self.size(), self.size(), 16 * self.size()),
         // Make the shard size large enough that two neighboring threads
         // won't write to the same cacheline of `data`.
-        [=](Index blk_size) {
-          return AdjustBlockSize(sizeof(Scalar), blk_size);
-        },
+        [=](Index blk_size) { return AdjustBlockSize(sizeof(Scalar), blk_size); },
         [&](Index first, Index last) {
           for (Index idx2 = first; idx2 < last; ++idx2) {
             ReduceScalar(self, idx1 + idx2, data);
@@ -305,12 +281,8 @@
       const Index num_outer_blocks = total_size / inner_block_size;
       self.device().parallelFor(
           num_outer_blocks,
-          TensorOpCost(inner_block_size, inner_block_size,
-                       16 * PacketSize * inner_block_size, Vectorize,
-                       PacketSize),
-          [=](Index blk_size) {
-            return AdjustBlockSize(inner_block_size * sizeof(Scalar), blk_size);
-          },
+          TensorOpCost(inner_block_size, inner_block_size, 16 * PacketSize * inner_block_size, Vectorize, PacketSize),
+          [=](Index blk_size) { return AdjustBlockSize(inner_block_size * sizeof(Scalar), blk_size); },
           [&](Index first, Index last) {
             for (Index idx1 = first; idx1 < last; ++idx1) {
               ReduceBlock<Self, Vectorize, /*Parallelize=*/false> block_reducer;
@@ -321,8 +293,7 @@
       // Parallelize over inner packets/scalars dimensions when the reduction
       // axis is not an inner dimension.
       ReduceBlock<Self, Vectorize, /*Parallelize=*/true> block_reducer;
-      for (Index idx1 = 0; idx1 < total_size;
-           idx1 += self.stride() * self.size()) {
+      for (Index idx1 = 0; idx1 < total_size; idx1 += self.stride() * self.size()) {
         block_reducer(self, idx1, data);
       }
     }
@@ -337,7 +308,8 @@
 // parallel, but it would be better to use a parallel scan algorithm and
 // optimize memory access.
 template <typename Self, typename Reducer>
-__global__ EIGEN_HIP_LAUNCH_BOUNDS_1024 void ScanKernel(Self self, Index total_size, typename Self::CoeffReturnType* data) {
+__global__ EIGEN_HIP_LAUNCH_BOUNDS_1024 void ScanKernel(Self self, Index total_size,
+                                                        typename Self::CoeffReturnType* data) {
   // Compute offset as in the CPU version
   Index val = threadIdx.x + blockIdx.x * blockDim.x;
   Index offset = (val / self.stride()) * self.stride() * self.size() + val % self.stride();
@@ -357,17 +329,16 @@
     }
   }
   __syncthreads();
-
 }
 
 template <typename Self, typename Reducer, bool Vectorize>
 struct ScanLauncher<Self, Reducer, GpuDevice, Vectorize> {
   void operator()(const Self& self, typename Self::CoeffReturnType* data) {
-     Index total_size = internal::array_prod(self.dimensions());
-     Index num_blocks = (total_size / self.size() + 63) / 64;
-     Index block_size = 64;
+    Index total_size = internal::array_prod(self.dimensions());
+    Index num_blocks = (total_size / self.size() + 63) / 64;
+    Index block_size = 64;
 
-     LAUNCH_GPU_KERNEL((ScanKernel<Self, Reducer>), num_blocks, block_size, 0, self.device(), self, total_size, data);
+    LAUNCH_GPU_KERNEL((ScanKernel<Self, Reducer>), num_blocks, block_size, 0, self.device(), self, total_size, data);
   }
 };
 #endif  // EIGEN_USE_GPU && (EIGEN_GPUCC)
@@ -377,7 +348,6 @@
 // Eval as rvalue
 template <typename Op, typename ArgType, typename Device>
 struct TensorEvaluator<const TensorScanOp<Op, ArgType>, Device> {
-
   typedef TensorScanOp<Op, ArgType> XprType;
   typedef typename XprType::Index Index;
   typedef const ArgType ChildTypeNoConst;
@@ -411,9 +381,9 @@
         m_exclusive(op.exclusive()),
         m_accumulator(op.accumulator()),
         m_size(m_impl.dimensions()[op.axis()]),
-        m_stride(1), m_consume_dim(op.axis()),
+        m_stride(1),
+        m_consume_dim(op.axis()),
         m_output(NULL) {
-
     // Accumulating a scalar isn't supported.
     EIGEN_STATIC_ASSERT((NumDims > 0), YOU_MADE_A_PROGRAMMING_MISTAKE);
     eigen_assert(op.axis() >= 0 && op.axis() < NumDims);
@@ -427,7 +397,8 @@
     } else {
       // dims can only be indexed through unsigned integers,
       // so let's use an unsigned type to let the compiler knows.
-      // This prevents stupid warnings: ""'*((void*)(& evaluator)+64)[18446744073709551615]' may be used uninitialized in this function"
+      // This prevents stupid warnings: ""'*((void*)(& evaluator)+64)[18446744073709551615]' may be used uninitialized
+      // in this function"
       unsigned int axis = internal::convert_index<unsigned int>(op.axis());
       for (unsigned int i = NumDims - 1; i > axis; --i) {
         m_stride = m_stride * dims[i];
@@ -435,37 +406,21 @@
     }
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const {
-    return m_impl.dimensions();
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_impl.dimensions(); }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Index& stride() const {
-    return m_stride;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Index& stride() const { return m_stride; }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Index& consume_dim() const {
-    return m_consume_dim;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Index& consume_dim() const { return m_consume_dim; }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Index& size() const {
-    return m_size;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Index& size() const { return m_size; }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Op& accumulator() const {
-    return m_accumulator;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Op& accumulator() const { return m_accumulator; }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool exclusive() const {
-    return m_exclusive;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool exclusive() const { return m_exclusive; }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const TensorEvaluator<ArgType, Device>& inner() const {
-    return m_impl;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const TensorEvaluator<ArgType, Device>& inner() const { return m_impl; }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Device& device() const {
-    return m_device;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Device& device() const { return m_device; }
 
   EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType data) {
     m_impl.evalSubExprsIfNeeded(NULL);
@@ -476,25 +431,20 @@
     }
 
     const Index total_size = internal::array_prod(dimensions());
-    m_output = static_cast<EvaluatorPointerType>(m_device.get((Scalar*) m_device.allocate_temp(total_size * sizeof(Scalar))));
+    m_output =
+        static_cast<EvaluatorPointerType>(m_device.get((Scalar*)m_device.allocate_temp(total_size * sizeof(Scalar))));
     launcher(*this, m_output);
     return true;
   }
 
-  template<int LoadMode>
+  template <int LoadMode>
   EIGEN_DEVICE_FUNC PacketReturnType packet(Index index) const {
     return internal::ploadt<PacketReturnType, LoadMode>(m_output + index);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EvaluatorPointerType data() const
-  {
-    return m_output;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EvaluatorPointerType data() const { return m_output; }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
-  {
-    return m_output[index];
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const { return m_output[index]; }
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool) const {
     return TensorOpCost(sizeof(CoeffReturnType), 0, 0);
@@ -508,7 +458,7 @@
     m_impl.cleanup();
   }
 
-protected:
+ protected:
   TensorEvaluator<ArgType, Device> m_impl;
   const Device EIGEN_DEVICE_REF m_device;
   const bool m_exclusive;
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorScanSycl.h b/unsupported/Eigen/CXX11/src/Tensor/TensorScanSycl.h
index e108015..30fde91 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorScanSycl.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorScanSycl.h
@@ -108,32 +108,28 @@
         inclusive(inclusive_) {}
 
   template <scan_step sst = stp, typename Input>
-  std::enable_if_t<sst == scan_step::first, CoeffReturnType> EIGEN_DEVICE_FUNC
-      EIGEN_STRONG_INLINE
-      read(const Input &inpt, Index global_id) const {
+  std::enable_if_t<sst == scan_step::first, CoeffReturnType> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE read(
+      const Input &inpt, Index global_id) const {
     return inpt.coeff(global_id);
   }
 
   template <scan_step sst = stp, typename Input>
-  std::enable_if_t<sst != scan_step::first, CoeffReturnType> EIGEN_DEVICE_FUNC
-      EIGEN_STRONG_INLINE
-      read(const Input &inpt, Index global_id) const {
+  std::enable_if_t<sst != scan_step::first, CoeffReturnType> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE read(
+      const Input &inpt, Index global_id) const {
     return inpt[global_id];
   }
 
   template <scan_step sst = stp, typename InclusiveOp>
-  std::enable_if_t<sst == scan_step::first> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  first_step_inclusive_Operation(InclusiveOp inclusive_op) const {
+  std::enable_if_t<sst == scan_step::first> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE first_step_inclusive_Operation(
+      InclusiveOp inclusive_op) const {
     inclusive_op();
   }
 
   template <scan_step sst = stp, typename InclusiveOp>
-  std::enable_if_t<sst != scan_step::first> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  first_step_inclusive_Operation(InclusiveOp) const {}
+  std::enable_if_t<sst != scan_step::first> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE first_step_inclusive_Operation(
+      InclusiveOp) const {}
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void operator()(cl::sycl::nd_item<1> itemID) const {
-
-
     for (Index loop_offset = 0; loop_offset < scanParameters.loop_range; loop_offset++) {
       Index data_offset = (itemID.get_global_id(0) + (itemID.get_global_range(0) * loop_offset));
       Index tmp = data_offset % scanParameters.panel_threads;
@@ -301,13 +297,9 @@
                                                                     OutAccessor out_accessor_,
                                                                     const ScanParameters<Index> scanParameters_,
                                                                     Op accumulator_)
-      : in_ptr(in_accessor_),
-        out_ptr(out_accessor_),
-        scanParameters(scanParameters_),
-        accumulator(accumulator_) {}
+      : in_ptr(in_accessor_), out_ptr(out_accessor_), scanParameters(scanParameters_), accumulator(accumulator_) {}
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void operator()(cl::sycl::nd_item<1> itemID) const {
-
     for (Index loop_offset = 0; loop_offset < scanParameters.loop_range; loop_offset++) {
       Index data_offset = (itemID.get_global_id(0) + (itemID.get_global_range(0) * loop_offset));
       Index tmp = data_offset % scanParameters.panel_threads;
@@ -423,7 +415,8 @@
         AdjustFuctor;
     dev.template unary_kernel_launcher<CoeffReturnType, AdjustFuctor>(in_ptr, out_ptr, scan_info.get_thread_range(),
                                                                       scan_info.max_elements_per_block,
-                                                                      scan_info.get_scan_parameter(), accumulator).wait();
+                                                                      scan_info.get_scan_parameter(), accumulator)
+        .wait();
   }
 };
 
@@ -445,8 +438,9 @@
 
     typedef ScanKernelFunctor<Input, CoeffReturnType, EvaluatorPointerType, Reducer, Index, stp> ScanFunctor;
     dev.template binary_kernel_launcher<CoeffReturnType, ScanFunctor>(
-        in_ptr, out_ptr, tmp_global_accessor, scan_info.get_thread_range(), scratch_size,
-        scan_info.get_scan_parameter(), accumulator, inclusive).wait();
+           in_ptr, out_ptr, tmp_global_accessor, scan_info.get_thread_range(), scratch_size,
+           scan_info.get_scan_parameter(), accumulator, inclusive)
+        .wait();
 
     if (scan_info.block_size > 1) {
       ScanLauncher_impl<CoeffReturnType, scan_step::second>::scan_block(
@@ -506,7 +500,7 @@
         inclusive, dev);
   }
 };
-} // namespace internal
+}  // namespace internal
 }  // namespace Eigen
 
 #endif  // UNSUPPORTED_EIGEN_CXX11_SRC_TENSOR_TENSOR_SYCL_SYCL_HPP
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorShuffling.h b/unsupported/Eigen/CXX11/src/Tensor/TensorShuffling.h
index 12bcdca..11ce0fb 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorShuffling.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorShuffling.h
@@ -16,16 +16,15 @@
 namespace Eigen {
 
 /** \class TensorShuffling
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Tensor shuffling class.
-  *
-  *
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Tensor shuffling class.
+ *
+ *
+ */
 namespace internal {
-template<typename Shuffle, typename XprType>
-struct traits<TensorShufflingOp<Shuffle, XprType> > : public traits<XprType>
-{
+template <typename Shuffle, typename XprType>
+struct traits<TensorShufflingOp<Shuffle, XprType> > : public traits<XprType> {
   typedef typename XprType::Scalar Scalar;
   typedef traits<XprType> XprTraits;
   typedef typename XprTraits::StorageKind StorageKind;
@@ -37,57 +36,46 @@
   typedef typename XprTraits::PointerType PointerType;
 };
 
-template<typename Shuffle, typename XprType>
-struct eval<TensorShufflingOp<Shuffle, XprType>, Eigen::Dense>
-{
+template <typename Shuffle, typename XprType>
+struct eval<TensorShufflingOp<Shuffle, XprType>, Eigen::Dense> {
   typedef const TensorShufflingOp<Shuffle, XprType>& type;
 };
 
-template<typename Shuffle, typename XprType>
-struct nested<TensorShufflingOp<Shuffle, XprType>, 1, typename eval<TensorShufflingOp<Shuffle, XprType> >::type>
-{
+template <typename Shuffle, typename XprType>
+struct nested<TensorShufflingOp<Shuffle, XprType>, 1, typename eval<TensorShufflingOp<Shuffle, XprType> >::type> {
   typedef TensorShufflingOp<Shuffle, XprType> type;
 };
 
 }  // end namespace internal
 
+template <typename Shuffle, typename XprType>
+class TensorShufflingOp : public TensorBase<TensorShufflingOp<Shuffle, XprType> > {
+ public:
+  typedef TensorBase<TensorShufflingOp<Shuffle, XprType> > Base;
+  typedef typename Eigen::internal::traits<TensorShufflingOp>::Scalar Scalar;
+  typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
+  typedef typename XprType::CoeffReturnType CoeffReturnType;
+  typedef typename Eigen::internal::nested<TensorShufflingOp>::type Nested;
+  typedef typename Eigen::internal::traits<TensorShufflingOp>::StorageKind StorageKind;
+  typedef typename Eigen::internal::traits<TensorShufflingOp>::Index Index;
 
-
-template<typename Shuffle, typename XprType>
-class TensorShufflingOp : public TensorBase<TensorShufflingOp<Shuffle, XprType> >
-{
-  public:
-    typedef TensorBase<TensorShufflingOp<Shuffle, XprType> > Base;
-    typedef typename Eigen::internal::traits<TensorShufflingOp>::Scalar Scalar;
-    typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
-    typedef typename XprType::CoeffReturnType CoeffReturnType;
-    typedef typename Eigen::internal::nested<TensorShufflingOp>::type Nested;
-    typedef typename Eigen::internal::traits<TensorShufflingOp>::StorageKind StorageKind;
-    typedef typename Eigen::internal::traits<TensorShufflingOp>::Index Index;
-
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorShufflingOp(const XprType& expr, const Shuffle& shfl)
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorShufflingOp(const XprType& expr, const Shuffle& shfl)
       : m_xpr(expr), m_shuffle(shfl) {}
 
-    EIGEN_DEVICE_FUNC
-    const Shuffle& shufflePermutation() const { return m_shuffle; }
+  EIGEN_DEVICE_FUNC const Shuffle& shufflePermutation() const { return m_shuffle; }
 
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<typename XprType::Nested>&
-    expression() const { return m_xpr; }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename XprType::Nested>& expression() const { return m_xpr; }
 
-    EIGEN_TENSOR_INHERIT_ASSIGNMENT_OPERATORS(TensorShufflingOp)
+  EIGEN_TENSOR_INHERIT_ASSIGNMENT_OPERATORS(TensorShufflingOp)
 
-
-  protected:
-    typename XprType::Nested m_xpr;
-    const Shuffle m_shuffle;
+ protected:
+  typename XprType::Nested m_xpr;
+  const Shuffle m_shuffle;
 };
 
-
 // Eval as rvalue
-template<typename Shuffle, typename ArgType, typename Device>
-struct TensorEvaluator<const TensorShufflingOp<Shuffle, ArgType>, Device>
-{
+template <typename Shuffle, typename ArgType, typename Device>
+struct TensorEvaluator<const TensorShufflingOp<Shuffle, ArgType>, Device> {
   typedef TensorEvaluator<const TensorShufflingOp<Shuffle, ArgType>, Device> Self;
   typedef TensorShufflingOp<Shuffle, ArgType> XprType;
   typedef typename XprType::Index Index;
@@ -102,12 +90,12 @@
 
   static constexpr int Layout = TensorEvaluator<ArgType, Device>::Layout;
   enum {
-    IsAligned         = false,
-    PacketAccess      = (PacketType<CoeffReturnType, Device>::size > 1),
-    BlockAccess       = TensorEvaluator<ArgType, Device>::RawAccess,
+    IsAligned = false,
+    PacketAccess = (PacketType<CoeffReturnType, Device>::size > 1),
+    BlockAccess = TensorEvaluator<ArgType, Device>::RawAccess,
     PreferBlockAccess = true,
-    CoordAccess       = false,  // to be implemented
-    RawAccess         = false
+    CoordAccess = false,  // to be implemented
+    RawAccess = false
   };
 
   typedef std::remove_const_t<Scalar> ScalarNoConst;
@@ -116,15 +104,11 @@
   typedef internal::TensorBlockDescriptor<NumDims, Index> TensorBlockDesc;
   typedef internal::TensorBlockScratchAllocator<Device> TensorBlockScratch;
 
-  typedef typename internal::TensorMaterializedBlock<ScalarNoConst, NumDims,
-                                                     Layout, Index>
-      TensorBlock;
+  typedef typename internal::TensorMaterializedBlock<ScalarNoConst, NumDims, Layout, Index> TensorBlock;
   //===--------------------------------------------------------------------===//
 
   EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
-      : m_device(device),
-        m_impl(op.expression(), device)
-  {
+      : m_device(device), m_impl(op.expression(), device) {
     const typename TensorEvaluator<ArgType, Device>::Dimensions& input_dims = m_impl.dimensions();
     const Shuffle& shuffle = op.shufflePermutation();
     m_is_identity = true;
@@ -142,21 +126,19 @@
       m_outputStrides[0] = 1;
 
       for (int i = 1; i < NumDims; ++i) {
-        m_unshuffledInputStrides[i] =
-            m_unshuffledInputStrides[i - 1] * input_dims[i - 1];
+        m_unshuffledInputStrides[i] = m_unshuffledInputStrides[i - 1] * input_dims[i - 1];
         m_outputStrides[i] = m_outputStrides[i - 1] * m_dimensions[i - 1];
-        m_fastOutputStrides[i] = internal::TensorIntDivisor<Index>(
-                  m_outputStrides[i] > 0 ? m_outputStrides[i] : Index(1));
+        m_fastOutputStrides[i] =
+            internal::TensorIntDivisor<Index>(m_outputStrides[i] > 0 ? m_outputStrides[i] : Index(1));
       }
     } else {
       m_unshuffledInputStrides[NumDims - 1] = 1;
       m_outputStrides[NumDims - 1] = 1;
       for (int i = NumDims - 2; i >= 0; --i) {
-        m_unshuffledInputStrides[i] =
-            m_unshuffledInputStrides[i + 1] * input_dims[i + 1];
+        m_unshuffledInputStrides[i] = m_unshuffledInputStrides[i + 1] * input_dims[i + 1];
         m_outputStrides[i] = m_outputStrides[i + 1] * m_dimensions[i + 1];
-        m_fastOutputStrides[i] = internal::TensorIntDivisor<Index>(
-                  m_outputStrides[i] > 0 ? m_outputStrides[i] : Index(1));
+        m_fastOutputStrides[i] =
+            internal::TensorIntDivisor<Index>(m_outputStrides[i] > 0 ? m_outputStrides[i] : Index(1));
       }
     }
 
@@ -174,18 +156,14 @@
 
 #ifdef EIGEN_USE_THREADS
   template <typename EvalSubExprsCallback>
-  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(
-      EvaluatorPointerType, EvalSubExprsCallback done) {
+  EIGEN_STRONG_INLINE void evalSubExprsIfNeededAsync(EvaluatorPointerType, EvalSubExprsCallback done) {
     m_impl.evalSubExprsIfNeededAsync(nullptr, [done](bool) { done(true); });
   }
 #endif  // EIGEN_USE_THREADS
 
-  EIGEN_STRONG_INLINE void cleanup() {
-    m_impl.cleanup();
-  }
+  EIGEN_STRONG_INLINE void cleanup() { m_impl.cleanup(); }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
     if (m_is_identity) {
       return m_impl.coeff(index);
     } else {
@@ -195,8 +173,7 @@
 
   template <int LoadMode, typename Self, bool ImplPacketAccess>
   struct PacketLoader {
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    static PacketReturnType Run(const Self& self, Index index) {
+    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE static PacketReturnType Run(const Self& self, Index index) {
       EIGEN_ALIGN_MAX std::remove_const_t<CoeffReturnType> values[PacketSize];
       EIGEN_UNROLL_LOOP
       for (int i = 0; i < PacketSize; ++i) {
@@ -207,10 +184,9 @@
     }
   };
 
-  template<int LoadMode, typename Self>
+  template <int LoadMode, typename Self>
   struct PacketLoader<LoadMode, Self, true> {
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    static PacketReturnType Run(const Self& self, Index index) {
+    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE static PacketReturnType Run(const Self& self, Index index) {
       if (self.m_is_identity) {
         return self.m_impl.template packet<LoadMode>(index);
       } else {
@@ -225,17 +201,14 @@
     }
   };
 
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const
-  {
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const {
     eigen_assert(index + PacketSize - 1 < dimensions().TotalSize());
     return PacketLoader<LoadMode, Self, TensorEvaluator<ArgType, Device>::PacketAccess>::Run(*this, index);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  internal::TensorBlockResourceRequirements getResourceRequirements() const {
-    static const int inner_dim =
-        Layout == static_cast<int>(ColMajor) ? 0 : NumDims - 1;
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE internal::TensorBlockResourceRequirements getResourceRequirements() const {
+    static const int inner_dim = Layout == static_cast<int>(ColMajor) ? 0 : NumDims - 1;
 
     const size_t target_size = m_device.firstLevelCacheSize();
     const bool inner_dim_shuffled = m_shuffle[inner_dim] != inner_dim;
@@ -247,32 +220,27 @@
     // benchmarks, add benchmarks that are representative of real workloads.
     using BlockRequirements = internal::TensorBlockResourceRequirements;
     if (inner_dim_shuffled) {
-      return BlockRequirements::uniform<Scalar>(target_size)
-          .addCostPerCoeff({0, 0, NumDims * 28});
+      return BlockRequirements::uniform<Scalar>(target_size).addCostPerCoeff({0, 0, NumDims * 28});
     } else {
       return BlockRequirements::skewed<Scalar>(target_size);
     }
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock
-  block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
-          bool root_of_expr_ast = false) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorBlock block(TensorBlockDesc& desc, TensorBlockScratch& scratch,
+                                                          bool root_of_expr_ast = false) const {
     eigen_assert(m_impl.data() != NULL);
 
-    typedef internal::TensorBlockIO<ScalarNoConst, Index, NumDims, Layout>
-        TensorBlockIO;
+    typedef internal::TensorBlockIO<ScalarNoConst, Index, NumDims, Layout> TensorBlockIO;
     typedef typename TensorBlockIO::Dst TensorBlockIODst;
     typedef typename TensorBlockIO::Src TensorBlockIOSrc;
 
     const typename TensorBlock::Storage block_storage =
-        TensorBlock::prepareStorage(
-            desc, scratch, /*allow_strided_storage=*/root_of_expr_ast);
+        TensorBlock::prepareStorage(desc, scratch, /*allow_strided_storage=*/root_of_expr_ast);
 
     typename TensorBlockIO::Dimensions input_strides(m_unshuffledInputStrides);
     TensorBlockIOSrc src(input_strides, m_impl.data(), srcCoeff(desc.offset()));
 
-    TensorBlockIODst dst(block_storage.dimensions(), block_storage.strides(),
-                         block_storage.data());
+    TensorBlockIODst dst(block_storage.dimensions(), block_storage.strides(), block_storage.data());
 
     typename TensorBlockIO::DimensionsMap dst_to_src_dim_map(m_shuffle);
     TensorBlockIO::Copy(dst, src, dst_to_src_dim_map);
@@ -281,10 +249,10 @@
   }
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const {
-    const double compute_cost = m_is_identity ? TensorOpCost::AddCost<Index>() :
-                                NumDims * (2 * TensorOpCost::AddCost<Index>() +
-                                           2 * TensorOpCost::MulCost<Index>() +
-                                           TensorOpCost::DivCost<Index>());
+    const double compute_cost = m_is_identity
+                                    ? TensorOpCost::AddCost<Index>()
+                                    : NumDims * (2 * TensorOpCost::AddCost<Index>() +
+                                                 2 * TensorOpCost::MulCost<Index>() + TensorOpCost::DivCost<Index>());
     return m_impl.costPerCoeff(vectorized) +
            TensorOpCost(0, 0, compute_cost, m_is_identity /* vectorized */, PacketSize);
   }
@@ -292,11 +260,10 @@
   EIGEN_DEVICE_FUNC typename Storage::Type data() const { return NULL; }
 
  protected:
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index GetBlockOutputIndex(
-      Index input_index,
-      const DSizes<Index, NumDims>& input_block_strides,
-      const DSizes<Index, NumDims>& output_block_strides,
-      const DSizes<internal::TensorIntDivisor<Index>, NumDims>& fast_input_block_strides) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index
+  GetBlockOutputIndex(Index input_index, const DSizes<Index, NumDims>& input_block_strides,
+                      const DSizes<Index, NumDims>& output_block_strides,
+                      const DSizes<internal::TensorIntDivisor<Index>, NumDims>& fast_input_block_strides) const {
     Index output_index = 0;
     if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
       for (int i = NumDims - 1; i > 0; --i) {
@@ -304,16 +271,14 @@
         output_index += idx * output_block_strides[m_inverseShuffle[i]];
         input_index -= idx * input_block_strides[i];
       }
-      return output_index + input_index *
-          output_block_strides[m_inverseShuffle[0]];
+      return output_index + input_index * output_block_strides[m_inverseShuffle[0]];
     } else {
       for (int i = 0; i < NumDims - 1; ++i) {
         const Index idx = input_index / fast_input_block_strides[i];
         output_index += idx * output_block_strides[m_inverseShuffle[i]];
         input_index -= idx * input_block_strides[i];
       }
-      return output_index + input_index *
-          output_block_strides[m_inverseShuffle[NumDims - 1]];
+      return output_index + input_index * output_block_strides[m_inverseShuffle[NumDims - 1]];
     }
   }
 
@@ -349,12 +314,10 @@
   TensorEvaluator<ArgType, Device> m_impl;
 };
 
-
 // Eval as lvalue
-template<typename Shuffle, typename ArgType, typename Device>
+template <typename Shuffle, typename ArgType, typename Device>
 struct TensorEvaluator<TensorShufflingOp<Shuffle, ArgType>, Device>
-    : public TensorEvaluator<const TensorShufflingOp<Shuffle, ArgType>, Device>
-{
+    : public TensorEvaluator<const TensorShufflingOp<Shuffle, ArgType>, Device> {
   typedef TensorEvaluator<const TensorShufflingOp<Shuffle, ArgType>, Device> Base;
 
   typedef TensorShufflingOp<Shuffle, ArgType> XprType;
@@ -368,11 +331,11 @@
   static constexpr int Layout = TensorEvaluator<ArgType, Device>::Layout;
 
   enum {
-    IsAligned         = false,
-    PacketAccess      = (PacketType<CoeffReturnType, Device>::size > 1),
-    BlockAccess       = TensorEvaluator<ArgType, Device>::RawAccess,
+    IsAligned = false,
+    PacketAccess = (PacketType<CoeffReturnType, Device>::size > 1),
+    BlockAccess = TensorEvaluator<ArgType, Device>::RawAccess,
     PreferBlockAccess = true,
-    RawAccess         = false
+    RawAccess = false
   };
 
   typedef std::remove_const_t<Scalar> ScalarNoConst;
@@ -381,33 +344,27 @@
   typedef internal::TensorBlockDescriptor<NumDims, Index> TensorBlockDesc;
   //===--------------------------------------------------------------------===//
 
-  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
-      : Base(op, device)
-  { }
+  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) : Base(op, device) {}
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType& coeffRef(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType& coeffRef(Index index) const {
     return this->m_impl.coeffRef(this->srcCoeff(index));
   }
 
-  template <int StoreMode> EIGEN_STRONG_INLINE
-  void writePacket(Index index, const PacketReturnType& x) const
-  {
+  template <int StoreMode>
+  EIGEN_STRONG_INLINE void writePacket(Index index, const PacketReturnType& x) const {
     EIGEN_ALIGN_MAX std::remove_const_t<CoeffReturnType> values[PacketSize];
     internal::pstore<CoeffReturnType, PacketReturnType>(values, x);
     EIGEN_UNROLL_LOOP
     for (int i = 0; i < PacketSize; ++i) {
-      this->coeffRef(index+i) = values[i];
+      this->coeffRef(index + i) = values[i];
     }
   }
 
   template <typename TensorBlock>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void writeBlock(
-      const TensorBlockDesc& desc, const TensorBlock& block) {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void writeBlock(const TensorBlockDesc& desc, const TensorBlock& block) {
     eigen_assert(this->m_impl.data() != NULL);
 
-    typedef internal::TensorBlockIO<ScalarNoConst, Index, NumDims, Layout>
-        TensorBlockIO;
+    typedef internal::TensorBlockIO<ScalarNoConst, Index, NumDims, Layout> TensorBlockIO;
     typedef typename TensorBlockIO::Dst TensorBlockIODst;
     typedef typename TensorBlockIO::Src TensorBlockIOSrc;
 
@@ -420,32 +377,26 @@
       mem = this->m_device.allocate(desc.size() * sizeof(Scalar));
       ScalarNoConst* buf = static_cast<ScalarNoConst*>(mem);
 
-      typedef internal::TensorBlockAssignment<
-          ScalarNoConst, NumDims, typename TensorBlock::XprType, Index>
+      typedef internal::TensorBlockAssignment<ScalarNoConst, NumDims, typename TensorBlock::XprType, Index>
           TensorBlockAssignment;
 
       TensorBlockAssignment::Run(
-          TensorBlockAssignment::target(
-              desc.dimensions(), internal::strides<Layout>(desc.dimensions()),
-              buf),
+          TensorBlockAssignment::target(desc.dimensions(), internal::strides<Layout>(desc.dimensions()), buf),
           block.expr());
 
       block_buffer = buf;
     }
 
     // Read from block.
-    TensorBlockIOSrc src(internal::strides<Layout>(desc.dimensions()),
-                         block_buffer);
+    TensorBlockIOSrc src(internal::strides<Layout>(desc.dimensions()), block_buffer);
 
     // Write to the output buffer.
-    typename TensorBlockIO::Dimensions output_strides(
-        this->m_unshuffledInputStrides);
+    typename TensorBlockIO::Dimensions output_strides(this->m_unshuffledInputStrides);
     typename TensorBlockIO::Dimensions output_dimensions;
     for (int i = 0; i < NumDims; ++i) {
       output_dimensions[this->m_shuffle[i]] = desc.dimension(i);
     }
-    TensorBlockIODst dst(output_dimensions, output_strides, this->m_impl.data(),
-                         this->srcCoeff(desc.offset()));
+    TensorBlockIODst dst(output_dimensions, output_strides, this->m_impl.data(), this->srcCoeff(desc.offset()));
 
     // Reorder dimensions according to the shuffle.
     typename TensorBlockIO::DimensionsMap dst_to_src_dim_map;
@@ -459,7 +410,6 @@
   }
 };
 
+}  // end namespace Eigen
 
-} // end namespace Eigen
-
-#endif // EIGEN_CXX11_TENSOR_TENSOR_SHUFFLING_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_SHUFFLING_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorStorage.h b/unsupported/Eigen/CXX11/src/Tensor/TensorStorage.h
index da4954f..fde1b82 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorStorage.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorStorage.h
@@ -12,9 +12,9 @@
 #define EIGEN_CXX11_TENSOR_TENSORSTORAGE_H
 
 #ifdef EIGEN_TENSOR_STORAGE_CTOR_PLUGIN
-  #define EIGEN_INTERNAL_TENSOR_STORAGE_CTOR_PLUGIN EIGEN_TENSOR_STORAGE_CTOR_PLUGIN;
+#define EIGEN_INTERNAL_TENSOR_STORAGE_CTOR_PLUGIN EIGEN_TENSOR_STORAGE_CTOR_PLUGIN;
 #else
-  #define EIGEN_INTERNAL_TENSOR_STORAGE_CTOR_PLUGIN
+#define EIGEN_INTERNAL_TENSOR_STORAGE_CTOR_PLUGIN
 #endif
 
 // IWYU pragma: private
@@ -23,24 +23,23 @@
 namespace Eigen {
 
 /** \internal
-  *
-  * \class TensorStorage
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Stores the data of a tensor
-  *
-  * This class stores the data of fixed-size, dynamic-size or mixed tensors
-  * in a way as compact as possible.
-  *
-  * \sa Tensor
-  */
-template<typename T, typename Dimensions, int Options> class TensorStorage;
-
+ *
+ * \class TensorStorage
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Stores the data of a tensor
+ *
+ * This class stores the data of fixed-size, dynamic-size or mixed tensors
+ * in a way as compact as possible.
+ *
+ * \sa Tensor
+ */
+template <typename T, typename Dimensions, int Options>
+class TensorStorage;
 
 // Pure fixed-size storage
-template<typename T, typename FixedDimensions, int Options_>
-class TensorStorage
-{
+template <typename T, typename FixedDimensions, int Options_>
+class TensorStorage {
  private:
   static constexpr std::size_t Size = FixedDimensions::total_size;
 
@@ -49,109 +48,99 @@
   EIGEN_ALIGN_MAX T m_data[MinSize];
 
  public:
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE TensorStorage() {
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorStorage() {}
 
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE T *data() { return m_data; }
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE const T *data() const { return m_data; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T* data() { return m_data; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T* data() const { return m_data; }
 
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE const FixedDimensions dimensions() const { return FixedDimensions(); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const FixedDimensions dimensions() const { return FixedDimensions(); }
 
-  EIGEN_DEVICE_FUNC
-  EIGEN_STRONG_INLINE DenseIndex size() const { return Size; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DenseIndex size() const { return Size; }
 };
 
-
 // pure dynamic
-template<typename T, typename IndexType, int NumIndices_, int Options_>
-class TensorStorage<T, DSizes<IndexType, NumIndices_>, Options_>
-{
-  public:
-    typedef IndexType Index;
-    typedef DSizes<IndexType, NumIndices_> Dimensions;
-    typedef TensorStorage<T, DSizes<IndexType, NumIndices_>, Options_> Self;
+template <typename T, typename IndexType, int NumIndices_, int Options_>
+class TensorStorage<T, DSizes<IndexType, NumIndices_>, Options_> {
+ public:
+  typedef IndexType Index;
+  typedef DSizes<IndexType, NumIndices_> Dimensions;
+  typedef TensorStorage<T, DSizes<IndexType, NumIndices_>, Options_> Self;
 
-    EIGEN_DEVICE_FUNC TensorStorage() : m_data(0), m_dimensions() {
-      if (NumIndices_ == 0) {
-	m_data = internal::conditional_aligned_new_auto<T,(Options_&DontAlign)==0>(1);
-      }
+  EIGEN_DEVICE_FUNC TensorStorage() : m_data(0), m_dimensions() {
+    if (NumIndices_ == 0) {
+      m_data = internal::conditional_aligned_new_auto<T, (Options_ & DontAlign) == 0>(1);
     }
-    EIGEN_DEVICE_FUNC TensorStorage(internal::constructor_without_unaligned_array_assert)
+  }
+  EIGEN_DEVICE_FUNC TensorStorage(internal::constructor_without_unaligned_array_assert)
       : m_data(0), m_dimensions(internal::template repeat<NumIndices_, Index>(0)) {}
-    EIGEN_DEVICE_FUNC TensorStorage(Index size, const array<Index, NumIndices_>& dimensions)
-        : m_data(internal::conditional_aligned_new_auto<T,(Options_&DontAlign)==0>(size)), m_dimensions(dimensions)
-      { EIGEN_INTERNAL_TENSOR_STORAGE_CTOR_PLUGIN }
+  EIGEN_DEVICE_FUNC TensorStorage(Index size, const array<Index, NumIndices_>& dimensions)
+      : m_data(internal::conditional_aligned_new_auto<T, (Options_ & DontAlign) == 0>(size)), m_dimensions(dimensions) {
+    EIGEN_INTERNAL_TENSOR_STORAGE_CTOR_PLUGIN
+  }
 
-    template <typename... DenseIndex>
-    EIGEN_DEVICE_FUNC TensorStorage(DenseIndex... indices) : m_dimensions(indices...) {
-      m_data = internal::conditional_aligned_new_auto<T,(Options_&DontAlign)==0>(internal::array_prod(m_dimensions));
+  template <typename... DenseIndex>
+  EIGEN_DEVICE_FUNC TensorStorage(DenseIndex... indices) : m_dimensions(indices...) {
+    m_data = internal::conditional_aligned_new_auto<T, (Options_ & DontAlign) == 0>(internal::array_prod(m_dimensions));
+  }
+
+  EIGEN_DEVICE_FUNC TensorStorage(const Self& other)
+      : m_data(internal::conditional_aligned_new_auto<T, (Options_ & DontAlign) == 0>(
+            internal::array_prod(other.m_dimensions))),
+        m_dimensions(other.m_dimensions) {
+    internal::smart_copy(other.m_data, other.m_data + internal::array_prod(other.m_dimensions), m_data);
+  }
+  EIGEN_DEVICE_FUNC Self& operator=(const Self& other) {
+    if (this != &other) {
+      Self tmp(other);
+      this->swap(tmp);
     }
+    return *this;
+  }
 
-    EIGEN_DEVICE_FUNC TensorStorage(const Self& other)
-      : m_data(internal::conditional_aligned_new_auto<T,(Options_&DontAlign)==0>(internal::array_prod(other.m_dimensions)))
-      , m_dimensions(other.m_dimensions)
-    {
-      internal::smart_copy(other.m_data, other.m_data+internal::array_prod(other.m_dimensions), m_data);
+  EIGEN_DEVICE_FUNC TensorStorage(Self&& other) : TensorStorage() { *this = std::move(other); }
+
+  EIGEN_DEVICE_FUNC Self& operator=(Self&& other) {
+    numext::swap(m_data, other.m_data);
+    numext::swap(m_dimensions, other.m_dimensions);
+    return *this;
+  }
+
+  EIGEN_DEVICE_FUNC ~TensorStorage() {
+    internal::conditional_aligned_delete_auto<T, (Options_ & DontAlign) == 0>(m_data,
+                                                                              internal::array_prod(m_dimensions));
+  }
+  EIGEN_DEVICE_FUNC void swap(Self& other) {
+    numext::swap(m_data, other.m_data);
+    numext::swap(m_dimensions, other.m_dimensions);
+  }
+
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; }
+
+  EIGEN_DEVICE_FUNC void resize(Index size, const array<Index, NumIndices_>& nbDimensions) {
+    const Index currentSz = internal::array_prod(m_dimensions);
+    if (size != currentSz) {
+      internal::conditional_aligned_delete_auto<T, (Options_ & DontAlign) == 0>(m_data, currentSz);
+      if (size)
+        m_data = internal::conditional_aligned_new_auto<T, (Options_ & DontAlign) == 0>(size);
+      else if (NumIndices_ == 0) {
+        m_data = internal::conditional_aligned_new_auto<T, (Options_ & DontAlign) == 0>(1);
+      } else
+        m_data = 0;
+      EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({})
     }
-    EIGEN_DEVICE_FUNC Self& operator=(const Self& other)
-    {
-      if (this != &other) {
-        Self tmp(other);
-        this->swap(tmp);
-      }
-      return *this;
-    }
+    m_dimensions = nbDimensions;
+  }
 
-    EIGEN_DEVICE_FUNC TensorStorage(Self&& other) : TensorStorage()
-    {
-      *this = std::move(other);
-    }
-    
-    EIGEN_DEVICE_FUNC Self& operator=(Self&& other)
-    {
-      numext::swap(m_data, other.m_data);
-      numext::swap(m_dimensions, other.m_dimensions);
-      return *this;
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T* data() { return m_data; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T* data() const { return m_data; }
 
-    EIGEN_DEVICE_FUNC  ~TensorStorage() { internal::conditional_aligned_delete_auto<T,(Options_&DontAlign)==0>(m_data, internal::array_prod(m_dimensions)); }
-    EIGEN_DEVICE_FUNC  void swap(Self& other)
-    { numext::swap(m_data,other.m_data); numext::swap(m_dimensions,other.m_dimensions); }
-
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const {return m_dimensions;}
-
-    EIGEN_DEVICE_FUNC void resize(Index size, const array<Index, NumIndices_>& nbDimensions)
-    {
-      const Index currentSz = internal::array_prod(m_dimensions);
-      if(size != currentSz)
-      {
-        internal::conditional_aligned_delete_auto<T,(Options_&DontAlign)==0>(m_data, currentSz);
-        if (size)
-          m_data = internal::conditional_aligned_new_auto<T,(Options_&DontAlign)==0>(size);
-        else if (NumIndices_ == 0) {
-	  m_data = internal::conditional_aligned_new_auto<T,(Options_&DontAlign)==0>(1);
-	}
-	else 
-          m_data = 0;
-        EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({})
-      }
-      m_dimensions = nbDimensions;
-    }
-
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T *data() { return m_data; }
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T *data() const { return m_data; }
-
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index size() const { return m_dimensions.TotalSize(); }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index size() const { return m_dimensions.TotalSize(); }
 
  private:
-  T *m_data;
+  T* m_data;
   Dimensions m_dimensions;
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_CXX11_TENSOR_TENSORSTORAGE_H
+#endif  // EIGEN_CXX11_TENSOR_TENSORSTORAGE_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorStriding.h b/unsupported/Eigen/CXX11/src/Tensor/TensorStriding.h
index cd98f8c..2924abb 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorStriding.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorStriding.h
@@ -16,16 +16,15 @@
 namespace Eigen {
 
 /** \class TensorStriding
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Tensor striding class.
-  *
-  *
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Tensor striding class.
+ *
+ *
+ */
 namespace internal {
-template<typename Strides, typename XprType>
-struct traits<TensorStridingOp<Strides, XprType> > : public traits<XprType>
-{
+template <typename Strides, typename XprType>
+struct traits<TensorStridingOp<Strides, XprType> > : public traits<XprType> {
   typedef typename XprType::Scalar Scalar;
   typedef traits<XprType> XprTraits;
   typedef typename XprTraits::StorageKind StorageKind;
@@ -37,56 +36,46 @@
   typedef typename XprTraits::PointerType PointerType;
 };
 
-template<typename Strides, typename XprType>
-struct eval<TensorStridingOp<Strides, XprType>, Eigen::Dense>
-{
-  typedef const TensorStridingOp<Strides, XprType>EIGEN_DEVICE_REF type;
+template <typename Strides, typename XprType>
+struct eval<TensorStridingOp<Strides, XprType>, Eigen::Dense> {
+  typedef const TensorStridingOp<Strides, XprType> EIGEN_DEVICE_REF type;
 };
 
-template<typename Strides, typename XprType>
-struct nested<TensorStridingOp<Strides, XprType>, 1, typename eval<TensorStridingOp<Strides, XprType> >::type>
-{
+template <typename Strides, typename XprType>
+struct nested<TensorStridingOp<Strides, XprType>, 1, typename eval<TensorStridingOp<Strides, XprType> >::type> {
   typedef TensorStridingOp<Strides, XprType> type;
 };
 
 }  // end namespace internal
 
+template <typename Strides, typename XprType>
+class TensorStridingOp : public TensorBase<TensorStridingOp<Strides, XprType> > {
+ public:
+  typedef TensorBase<TensorStridingOp<Strides, XprType> > Base;
+  typedef typename Eigen::internal::traits<TensorStridingOp>::Scalar Scalar;
+  typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
+  typedef typename XprType::CoeffReturnType CoeffReturnType;
+  typedef typename Eigen::internal::nested<TensorStridingOp>::type Nested;
+  typedef typename Eigen::internal::traits<TensorStridingOp>::StorageKind StorageKind;
+  typedef typename Eigen::internal::traits<TensorStridingOp>::Index Index;
 
-
-template<typename Strides, typename XprType>
-class TensorStridingOp : public TensorBase<TensorStridingOp<Strides, XprType> >
-{
-  public:
-    typedef TensorBase<TensorStridingOp<Strides, XprType> > Base;
-    typedef typename Eigen::internal::traits<TensorStridingOp>::Scalar Scalar;
-    typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
-    typedef typename XprType::CoeffReturnType CoeffReturnType;
-    typedef typename Eigen::internal::nested<TensorStridingOp>::type Nested;
-    typedef typename Eigen::internal::traits<TensorStridingOp>::StorageKind StorageKind;
-    typedef typename Eigen::internal::traits<TensorStridingOp>::Index Index;
-
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorStridingOp(const XprType& expr, const Strides& dims)
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorStridingOp(const XprType& expr, const Strides& dims)
       : m_xpr(expr), m_dims(dims) {}
 
-    EIGEN_DEVICE_FUNC
-    const Strides& strides() const { return m_dims; }
+  EIGEN_DEVICE_FUNC const Strides& strides() const { return m_dims; }
 
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<typename XprType::Nested>&
-    expression() const { return m_xpr; }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename XprType::Nested>& expression() const { return m_xpr; }
 
-    EIGEN_TENSOR_INHERIT_ASSIGNMENT_OPERATORS(TensorStridingOp)
+  EIGEN_TENSOR_INHERIT_ASSIGNMENT_OPERATORS(TensorStridingOp)
 
-  protected:
-    typename XprType::Nested m_xpr;
-    const Strides m_dims;
+ protected:
+  typename XprType::Nested m_xpr;
+  const Strides m_dims;
 };
 
-
 // Eval as rvalue
-template<typename Strides, typename ArgType, typename Device>
-struct TensorEvaluator<const TensorStridingOp<Strides, ArgType>, Device>
-{
+template <typename Strides, typename ArgType, typename Device>
+struct TensorEvaluator<const TensorStridingOp<Strides, ArgType>, Device> {
   typedef TensorStridingOp<Strides, ArgType> XprType;
   typedef typename XprType::Index Index;
   static constexpr int NumDims = internal::array_size<typename TensorEvaluator<ArgType, Device>::Dimensions>::value;
@@ -100,7 +89,7 @@
 
   static constexpr int Layout = TensorEvaluator<ArgType, Device>::Layout;
   enum {
-    IsAligned = /*TensorEvaluator<ArgType, Device>::IsAligned*/false,
+    IsAligned = /*TensorEvaluator<ArgType, Device>::IsAligned*/ false,
     PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
     BlockAccess = false,
     PreferBlockAccess = TensorEvaluator<ArgType, Device>::PreferBlockAccess,
@@ -112,12 +101,10 @@
   typedef internal::TensorBlockNotImplemented TensorBlock;
   //===--------------------------------------------------------------------===//
 
-  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
-      : m_impl(op.expression(), device)
-  {
+  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) : m_impl(op.expression(), device) {
     m_dimensions = m_impl.dimensions();
     for (int i = 0; i < NumDims; ++i) {
-      m_dimensions[i] =Eigen::numext::ceil(static_cast<float>(m_dimensions[i]) / op.strides()[i]);
+      m_dimensions[i] = Eigen::numext::ceil(static_cast<float>(m_dimensions[i]) / op.strides()[i]);
     }
 
     const typename TensorEvaluator<ArgType, Device>::Dimensions& input_dims = m_impl.dimensions();
@@ -125,44 +112,39 @@
       m_outputStrides[0] = 1;
       m_inputStrides[0] = 1;
       for (int i = 1; i < NumDims; ++i) {
-        m_outputStrides[i] = m_outputStrides[i-1] * m_dimensions[i-1];
-        m_inputStrides[i] = m_inputStrides[i-1] * input_dims[i-1];
-        m_inputStrides[i-1] *= op.strides()[i-1];
+        m_outputStrides[i] = m_outputStrides[i - 1] * m_dimensions[i - 1];
+        m_inputStrides[i] = m_inputStrides[i - 1] * input_dims[i - 1];
+        m_inputStrides[i - 1] *= op.strides()[i - 1];
       }
-      m_inputStrides[NumDims-1] *= op.strides()[NumDims-1];
+      m_inputStrides[NumDims - 1] *= op.strides()[NumDims - 1];
     } else {  // RowMajor
-      m_outputStrides[NumDims-1] = 1;
-      m_inputStrides[NumDims-1] = 1;
+      m_outputStrides[NumDims - 1] = 1;
+      m_inputStrides[NumDims - 1] = 1;
       for (int i = NumDims - 2; i >= 0; --i) {
-        m_outputStrides[i] = m_outputStrides[i+1] * m_dimensions[i+1];
-        m_inputStrides[i] = m_inputStrides[i+1] * input_dims[i+1];
-        m_inputStrides[i+1] *= op.strides()[i+1];
+        m_outputStrides[i] = m_outputStrides[i + 1] * m_dimensions[i + 1];
+        m_inputStrides[i] = m_inputStrides[i + 1] * input_dims[i + 1];
+        m_inputStrides[i + 1] *= op.strides()[i + 1];
       }
       m_inputStrides[0] *= op.strides()[0];
     }
   }
 
-
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; }
 
-  EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType/*data*/) {
+  EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType /*data*/) {
     m_impl.evalSubExprsIfNeeded(NULL);
     return true;
   }
-  EIGEN_STRONG_INLINE void cleanup() {
-    m_impl.cleanup();
-  }
+  EIGEN_STRONG_INLINE void cleanup() { m_impl.cleanup(); }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
     return m_impl.coeff(srcCoeff(index));
   }
 
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const
-  {
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const {
     EIGEN_STATIC_ASSERT((PacketSize > 1), YOU_MADE_A_PROGRAMMING_MISTAKE)
-    eigen_assert(index+PacketSize-1 < dimensions().TotalSize());
+    eigen_assert(index + PacketSize - 1 < dimensions().TotalSize());
 
     Index inputIndices[] = {0, 0};
     Index indices[] = {index, index + PacketSize - 1};
@@ -188,20 +170,19 @@
         indices[0] -= idx0 * m_outputStrides[i];
         indices[1] -= idx1 * m_outputStrides[i];
       }
-      inputIndices[0] += indices[0] * m_inputStrides[NumDims-1];
-      inputIndices[1] += indices[1] * m_inputStrides[NumDims-1];
+      inputIndices[0] += indices[0] * m_inputStrides[NumDims - 1];
+      inputIndices[1] += indices[1] * m_inputStrides[NumDims - 1];
     }
     if (inputIndices[1] - inputIndices[0] == PacketSize - 1) {
       PacketReturnType rslt = m_impl.template packet<Unaligned>(inputIndices[0]);
       return rslt;
-    }
-    else {
+    } else {
       EIGEN_ALIGN_MAX std::remove_const_t<CoeffReturnType> values[PacketSize];
       values[0] = m_impl.coeff(inputIndices[0]);
-      values[PacketSize-1] = m_impl.coeff(inputIndices[1]);
+      values[PacketSize - 1] = m_impl.coeff(inputIndices[1]);
       EIGEN_UNROLL_LOOP
-      for (int i = 1; i < PacketSize-1; ++i) {
-        values[i] = coeff(index+i);
+      for (int i = 1; i < PacketSize - 1; ++i) {
+        values[i] = coeff(index + i);
       }
       PacketReturnType rslt = internal::pload<PacketReturnType>(values);
       return rslt;
@@ -209,24 +190,22 @@
   }
 
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const {
-    double compute_cost = (NumDims - 1) * (TensorOpCost::AddCost<Index>() +
-                                           TensorOpCost::MulCost<Index>() +
+    double compute_cost = (NumDims - 1) * (TensorOpCost::AddCost<Index>() + TensorOpCost::MulCost<Index>() +
                                            TensorOpCost::DivCost<Index>()) +
-        TensorOpCost::MulCost<Index>();
+                          TensorOpCost::MulCost<Index>();
     if (vectorized) {
       compute_cost *= 2;  // packet() computes two indices
     }
     const int innerDim = (static_cast<int>(Layout) == static_cast<int>(ColMajor)) ? 0 : (NumDims - 1);
     return m_impl.costPerCoeff(vectorized && m_inputStrides[innerDim] == 1) +
-        // Computation is not vectorized per se, but it is done once per packet.
-        TensorOpCost(0, 0, compute_cost, vectorized, PacketSize);
+           // Computation is not vectorized per se, but it is done once per packet.
+           TensorOpCost(0, 0, compute_cost, vectorized, PacketSize);
   }
 
   EIGEN_DEVICE_FUNC typename Storage::Type data() const { return NULL; }
 
  protected:
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index srcCoeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index srcCoeff(Index index) const {
     Index inputIndex = 0;
     if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
       EIGEN_UNROLL_LOOP
@@ -243,7 +222,7 @@
         inputIndex += idx * m_inputStrides[i];
         index -= idx * m_outputStrides[i];
       }
-      inputIndex += index * m_inputStrides[NumDims-1];
+      inputIndex += index * m_inputStrides[NumDims - 1];
     }
     return inputIndex;
   }
@@ -255,10 +234,9 @@
 };
 
 // Eval as lvalue
-template<typename Strides, typename ArgType, typename Device>
+template <typename Strides, typename ArgType, typename Device>
 struct TensorEvaluator<TensorStridingOp<Strides, ArgType>, Device>
-    : public TensorEvaluator<const TensorStridingOp<Strides, ArgType>, Device>
-{
+    : public TensorEvaluator<const TensorStridingOp<Strides, ArgType>, Device> {
   typedef TensorStridingOp<Strides, ArgType> XprType;
   typedef TensorEvaluator<const XprType, Device> Base;
   //  typedef typename XprType::Index Index;
@@ -267,15 +245,14 @@
 
   static constexpr int Layout = TensorEvaluator<ArgType, Device>::Layout;
   enum {
-    IsAligned = /*TensorEvaluator<ArgType, Device>::IsAligned*/false,
+    IsAligned = /*TensorEvaluator<ArgType, Device>::IsAligned*/ false,
     PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
     PreferBlockAccess = false,
     CoordAccess = false,  // to be implemented
     RawAccess = false
   };
 
-  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
-      : Base(op, device) { }
+  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) : Base(op, device) {}
 
   typedef typename XprType::Index Index;
   typedef typename XprType::Scalar Scalar;
@@ -283,16 +260,14 @@
   typedef typename PacketType<CoeffReturnType, Device>::type PacketReturnType;
   static constexpr int PacketSize = PacketType<CoeffReturnType, Device>::size;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index index) const {
     return this->m_impl.coeffRef(this->srcCoeff(index));
   }
 
-  template <int StoreMode> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-  void writePacket(Index index, const PacketReturnType& x) const
-  {
+  template <int StoreMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void writePacket(Index index, const PacketReturnType& x) const {
     EIGEN_STATIC_ASSERT((PacketSize > 1), YOU_MADE_A_PROGRAMMING_MISTAKE)
-    eigen_assert(index+PacketSize-1 < this->dimensions().TotalSize());
+    eigen_assert(index + PacketSize - 1 < this->dimensions().TotalSize());
 
     Index inputIndices[] = {0, 0};
     Index indices[] = {index, index + PacketSize - 1};
@@ -318,26 +293,24 @@
         indices[0] -= idx0 * this->m_outputStrides[i];
         indices[1] -= idx1 * this->m_outputStrides[i];
       }
-      inputIndices[0] += indices[0] * this->m_inputStrides[NumDims-1];
-      inputIndices[1] += indices[1] * this->m_inputStrides[NumDims-1];
+      inputIndices[0] += indices[0] * this->m_inputStrides[NumDims - 1];
+      inputIndices[1] += indices[1] * this->m_inputStrides[NumDims - 1];
     }
     if (inputIndices[1] - inputIndices[0] == PacketSize - 1) {
       this->m_impl.template writePacket<Unaligned>(inputIndices[0], x);
-    }
-    else {
+    } else {
       EIGEN_ALIGN_MAX Scalar values[PacketSize];
       internal::pstore<Scalar, PacketReturnType>(values, x);
       this->m_impl.coeffRef(inputIndices[0]) = values[0];
-      this->m_impl.coeffRef(inputIndices[1]) = values[PacketSize-1];
+      this->m_impl.coeffRef(inputIndices[1]) = values[PacketSize - 1];
       EIGEN_UNROLL_LOOP
-      for (int i = 1; i < PacketSize-1; ++i) {
-        this->coeffRef(index+i) = values[i];
+      for (int i = 1; i < PacketSize - 1; ++i) {
+        this->coeffRef(index + i) = values[i];
       }
     }
   }
 };
 
+}  // end namespace Eigen
 
-} // end namespace Eigen
-
-#endif // EIGEN_CXX11_TENSOR_TENSOR_STRIDING_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_STRIDING_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorTrace.h b/unsupported/Eigen/CXX11/src/Tensor/TensorTrace.h
index 5e831b5..035d94e 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorTrace.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorTrace.h
@@ -17,17 +17,16 @@
 namespace Eigen {
 
 /** \class TensorTrace
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Tensor Trace class.
-  *
-  *
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Tensor Trace class.
+ *
+ *
+ */
 
 namespace internal {
-template<typename Dims, typename XprType>
-struct traits<TensorTraceOp<Dims, XprType> > : public traits<XprType>
-{
+template <typename Dims, typename XprType>
+struct traits<TensorTraceOp<Dims, XprType> > : public traits<XprType> {
   typedef typename XprType::Scalar Scalar;
   typedef traits<XprType> XprTraits;
   typedef typename XprTraits::StorageKind StorageKind;
@@ -38,54 +37,48 @@
   static constexpr int Layout = XprTraits::Layout;
 };
 
-template<typename Dims, typename XprType>
-struct eval<TensorTraceOp<Dims, XprType>, Eigen::Dense>
-{
+template <typename Dims, typename XprType>
+struct eval<TensorTraceOp<Dims, XprType>, Eigen::Dense> {
   typedef const TensorTraceOp<Dims, XprType>& type;
 };
 
-template<typename Dims, typename XprType>
-struct nested<TensorTraceOp<Dims, XprType>, 1, typename eval<TensorTraceOp<Dims, XprType> >::type>
-{
+template <typename Dims, typename XprType>
+struct nested<TensorTraceOp<Dims, XprType>, 1, typename eval<TensorTraceOp<Dims, XprType> >::type> {
   typedef TensorTraceOp<Dims, XprType> type;
 };
 
-} // end namespace internal
+}  // end namespace internal
 
+template <typename Dims, typename XprType>
+class TensorTraceOp : public TensorBase<TensorTraceOp<Dims, XprType> > {
+ public:
+  typedef typename Eigen::internal::traits<TensorTraceOp>::Scalar Scalar;
+  typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
+  typedef typename XprType::CoeffReturnType CoeffReturnType;
+  typedef typename Eigen::internal::nested<TensorTraceOp>::type Nested;
+  typedef typename Eigen::internal::traits<TensorTraceOp>::StorageKind StorageKind;
+  typedef typename Eigen::internal::traits<TensorTraceOp>::Index Index;
 
-template<typename Dims, typename XprType>
-class TensorTraceOp : public TensorBase<TensorTraceOp<Dims, XprType> >
-{
-  public:
-    typedef typename Eigen::internal::traits<TensorTraceOp>::Scalar Scalar;
-    typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
-    typedef typename XprType::CoeffReturnType CoeffReturnType;
-    typedef typename Eigen::internal::nested<TensorTraceOp>::type Nested;
-    typedef typename Eigen::internal::traits<TensorTraceOp>::StorageKind StorageKind;
-    typedef typename Eigen::internal::traits<TensorTraceOp>::Index Index;
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorTraceOp(const XprType& expr, const Dims& dims)
+      : m_xpr(expr), m_dims(dims) {}
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorTraceOp(const XprType& expr, const Dims& dims)
-      : m_xpr(expr), m_dims(dims) {
-    }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dims& dims() const { return m_dims; }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    const Dims& dims() const { return m_dims; }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const internal::remove_all_t<typename XprType::Nested>& expression() const {
+    return m_xpr;
+  }
 
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-    const internal::remove_all_t<typename XprType::Nested>& expression() const { return m_xpr; }
-
-  protected:
-    typename XprType::Nested m_xpr;
-    const Dims m_dims;
+ protected:
+  typename XprType::Nested m_xpr;
+  const Dims m_dims;
 };
 
-
 // Eval as rvalue
-template<typename Dims, typename ArgType, typename Device>
-struct TensorEvaluator<const TensorTraceOp<Dims, ArgType>, Device>
-{
+template <typename Dims, typename ArgType, typename Device>
+struct TensorEvaluator<const TensorTraceOp<Dims, ArgType>, Device> {
   typedef TensorTraceOp<Dims, ArgType> XprType;
-  static constexpr int NumInputDims = internal::array_size<typename TensorEvaluator<ArgType, Device>::Dimensions>::value;
+  static constexpr int NumInputDims =
+      internal::array_size<typename TensorEvaluator<ArgType, Device>::Dimensions>::value;
   static constexpr int NumReducedDims = internal::array_size<Dims>::value;
   static constexpr int NumOutputDims = NumInputDims - NumReducedDims;
   typedef typename XprType::Index Index;
@@ -112,11 +105,10 @@
   //===--------------------------------------------------------------------===//
 
   EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
-    : m_impl(op.expression(), device), m_traceDim(1), m_device(device)
-  {
-
+      : m_impl(op.expression(), device), m_traceDim(1), m_device(device) {
     EIGEN_STATIC_ASSERT((NumOutputDims >= 0), YOU_MADE_A_PROGRAMMING_MISTAKE);
-    EIGEN_STATIC_ASSERT((NumReducedDims >= 2) || ((NumReducedDims == 0) && (NumInputDims == 0)), YOU_MADE_A_PROGRAMMING_MISTAKE);
+    EIGEN_STATIC_ASSERT((NumReducedDims >= 2) || ((NumReducedDims == 0) && (NumInputDims == 0)),
+                        YOU_MADE_A_PROGRAMMING_MISTAKE);
 
     for (int i = 0; i < NumInputDims; ++i) {
       m_reduced[i] = false;
@@ -153,8 +145,7 @@
           eigen_assert(m_reducedDims[0] == m_reducedDims[reduced_index]);
         }
         ++reduced_index;
-      }
-      else {
+      } else {
         m_dimensions[output_index] = input_dims[i];
         ++output_index;
       }
@@ -171,8 +162,7 @@
         for (int i = 1; i < NumOutputDims; ++i) {
           m_outputStrides[i] = m_outputStrides[i - 1] * m_dimensions[i - 1];
         }
-      }
-      else {
+      } else {
         m_outputStrides.back() = 1;
         for (int i = NumOutputDims - 2; i >= 0; --i) {
           m_outputStrides[i] = m_outputStrides[i + 1] * m_dimensions[i + 1];
@@ -188,8 +178,7 @@
         for (int i = 1; i < NumInputDims; ++i) {
           input_strides[i] = input_strides[i - 1] * input_dims[i - 1];
         }
-      }
-      else {
+      } else {
         input_strides.back() = 1;
         for (int i = NumInputDims - 2; i >= 0; --i) {
           input_strides[i] = input_strides[i + 1] * input_dims[i + 1];
@@ -199,11 +188,10 @@
       output_index = 0;
       reduced_index = 0;
       for (int i = 0; i < NumInputDims; ++i) {
-        if(m_reduced[i]) {
+        if (m_reduced[i]) {
           m_reducedStrides[reduced_index] = input_strides[i];
           ++reduced_index;
-        }
-        else {
+        } else {
           m_preservedStrides[output_index] = input_strides[i];
           ++output_index;
         }
@@ -211,21 +199,16 @@
     }
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const {
-    return m_dimensions;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const { return m_dimensions; }
 
   EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType /*data*/) {
     m_impl.evalSubExprsIfNeeded(NULL);
     return true;
   }
 
-  EIGEN_STRONG_INLINE void cleanup() {
-    m_impl.cleanup();
-  }
+  EIGEN_STRONG_INLINE void cleanup() { m_impl.cleanup(); }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
     // Initialize the result
     CoeffReturnType result = internal::cast<int, CoeffReturnType>(0);
     Index index_stride = 0;
@@ -235,23 +218,22 @@
 
     // If trace is requested along all dimensions, starting index would be 0
     Index cur_index = 0;
-    if (NumOutputDims != 0)
-      cur_index = firstInput(index);
+    if (NumOutputDims != 0) cur_index = firstInput(index);
     for (Index i = 0; i < m_traceDim; ++i) {
-        result += m_impl.coeff(cur_index);
-        cur_index += index_stride;
+      result += m_impl.coeff(cur_index);
+      cur_index += index_stride;
     }
 
     return result;
   }
 
-  template<int LoadMode>
+  template <int LoadMode>
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const {
     eigen_assert(index + PacketSize - 1 < dimensions().TotalSize());
 
     EIGEN_ALIGN_MAX std::remove_const_t<CoeffReturnType> values[PacketSize];
     for (int i = 0; i < PacketSize; ++i) {
-        values[i] = coeff(index + i);
+      values[i] = coeff(index + i);
     }
     PacketReturnType result = internal::ploadt<PacketReturnType, LoadMode>(values);
     return result;
@@ -268,8 +250,7 @@
         index -= idx * m_outputStrides[i];
       }
       startInput += index * m_preservedStrides[0];
-    }
-    else {
+    } else {
       for (int i = 0; i < NumOutputDims - 1; ++i) {
         const Index idx = index / m_outputStrides[i];
         startInput += idx * m_preservedStrides[i];
@@ -292,7 +273,6 @@
   array<Index, NumOutputDims> m_preservedStrides;
 };
 
+}  // End namespace Eigen
 
-} // End namespace Eigen
-
-#endif // EIGEN_CXX11_TENSOR_TENSOR_TRACE_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_TRACE_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorTraits.h b/unsupported/Eigen/CXX11/src/Tensor/TensorTraits.h
index d327b49..017b4ff 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorTraits.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorTraits.h
@@ -16,40 +16,33 @@
 namespace Eigen {
 namespace internal {
 
-
-template<typename Scalar, int Options>
-class compute_tensor_flags
-{
+template <typename Scalar, int Options>
+class compute_tensor_flags {
   enum {
     is_dynamic_size_storage = 1,
 
-    is_aligned =
-    (
-        ((Options&DontAlign)==0) && (
-#if EIGEN_MAX_STATIC_ALIGN_BYTES>0
-            (!is_dynamic_size_storage)
+    is_aligned = (((Options & DontAlign) == 0) && (
+#if EIGEN_MAX_STATIC_ALIGN_BYTES > 0
+                                                      (!is_dynamic_size_storage)
 #else
-            0
+                                                      0
 #endif
-            |
-#if EIGEN_MAX_ALIGN_BYTES>0
-            is_dynamic_size_storage
+                                                      |
+#if EIGEN_MAX_ALIGN_BYTES > 0
+                                                      is_dynamic_size_storage
 #else
-            0
+                                                      0
 #endif
-      )
-     ),
+                                                      )),
     packet_access_bit = packet_traits<Scalar>::Vectorizable && is_aligned ? PacketAccessBit : 0
   };
 
-  public:
-    enum { ret = packet_access_bit };
+ public:
+  enum { ret = packet_access_bit };
 };
 
-
-template<typename Scalar_, int NumIndices_, int Options_, typename IndexType_>
-struct traits<Tensor<Scalar_, NumIndices_, Options_, IndexType_> >
-{
+template <typename Scalar_, int NumIndices_, int Options_, typename IndexType_>
+struct traits<Tensor<Scalar_, NumIndices_, Options_, IndexType_> > {
   typedef Scalar_ Scalar;
   typedef Dense StorageKind;
   typedef IndexType_ Index;
@@ -59,16 +52,15 @@
     Options = Options_,
     Flags = compute_tensor_flags<Scalar_, Options_>::ret | (is_const<Scalar_>::value ? 0 : LvalueBit)
   };
-  template <typename T> struct MakePointer {
+  template <typename T>
+  struct MakePointer {
     typedef T* Type;
   };
   typedef typename MakePointer<Scalar>::Type PointerType;
 };
 
-
-template<typename Scalar_, typename Dimensions, int Options_, typename IndexType_>
-struct traits<TensorFixedSize<Scalar_, Dimensions, Options_, IndexType_> >
-{
+template <typename Scalar_, typename Dimensions, int Options_, typename IndexType_>
+struct traits<TensorFixedSize<Scalar_, Dimensions, Options_, IndexType_> > {
   typedef Scalar_ Scalar;
   typedef Dense StorageKind;
   typedef IndexType_ Index;
@@ -76,30 +68,26 @@
   static constexpr int Layout = Options_ & RowMajor ? RowMajor : ColMajor;
   enum {
     Options = Options_,
-    Flags = compute_tensor_flags<Scalar_, Options_>::ret | (is_const<Scalar_>::value ? 0: LvalueBit)
+    Flags = compute_tensor_flags<Scalar_, Options_>::ret | (is_const<Scalar_>::value ? 0 : LvalueBit)
   };
-  template <typename T> struct MakePointer {
+  template <typename T>
+  struct MakePointer {
     typedef T* Type;
   };
   typedef typename MakePointer<Scalar>::Type PointerType;
 };
 
-
-template<typename PlainObjectType, int Options_, template <class> class MakePointer_>
-struct traits<TensorMap<PlainObjectType, Options_, MakePointer_> >
-  : public traits<PlainObjectType>
-{
+template <typename PlainObjectType, int Options_, template <class> class MakePointer_>
+struct traits<TensorMap<PlainObjectType, Options_, MakePointer_> > : public traits<PlainObjectType> {
   typedef traits<PlainObjectType> BaseTraits;
   typedef typename BaseTraits::Scalar Scalar;
   typedef typename BaseTraits::StorageKind StorageKind;
   typedef typename BaseTraits::Index Index;
   static constexpr int NumDimensions = BaseTraits::NumDimensions;
   static constexpr int Layout = BaseTraits::Layout;
-  enum {
-    Options = Options_,
-    Flags = BaseTraits::Flags
-  };
-  template <class T> struct MakePointer {
+  enum { Options = Options_, Flags = BaseTraits::Flags };
+  template <class T>
+  struct MakePointer {
     // Intermediate typedef to workaround MSVC issue.
     typedef MakePointer_<T> MakePointerT;
     typedef typename MakePointerT::Type Type;
@@ -107,113 +95,92 @@
   typedef typename MakePointer<Scalar>::Type PointerType;
 };
 
-template<typename PlainObjectType>
-struct traits<TensorRef<PlainObjectType> >
-  : public traits<PlainObjectType>
-{
+template <typename PlainObjectType>
+struct traits<TensorRef<PlainObjectType> > : public traits<PlainObjectType> {
   typedef traits<PlainObjectType> BaseTraits;
   typedef typename BaseTraits::Scalar Scalar;
   typedef typename BaseTraits::StorageKind StorageKind;
   typedef typename BaseTraits::Index Index;
   static constexpr int NumDimensions = BaseTraits::NumDimensions;
   static constexpr int Layout = BaseTraits::Layout;
-  enum {
-    Options = BaseTraits::Options,
-    Flags = BaseTraits::Flags
-  };
+  enum { Options = BaseTraits::Options, Flags = BaseTraits::Flags };
   typedef typename BaseTraits::PointerType PointerType;
 };
 
-
-template<typename Scalar_, int NumIndices_, int Options, typename IndexType_>
-struct eval<Tensor<Scalar_, NumIndices_, Options, IndexType_>, Eigen::Dense>
-{
-  typedef const Tensor<Scalar_, NumIndices_, Options, IndexType_>EIGEN_DEVICE_REF type;
+template <typename Scalar_, int NumIndices_, int Options, typename IndexType_>
+struct eval<Tensor<Scalar_, NumIndices_, Options, IndexType_>, Eigen::Dense> {
+  typedef const Tensor<Scalar_, NumIndices_, Options, IndexType_> EIGEN_DEVICE_REF type;
 };
 
-template<typename Scalar_, int NumIndices_, int Options, typename IndexType_>
-struct eval<const Tensor<Scalar_, NumIndices_, Options, IndexType_>, Eigen::Dense>
-{
-  typedef const Tensor<Scalar_, NumIndices_, Options, IndexType_>EIGEN_DEVICE_REF type;
+template <typename Scalar_, int NumIndices_, int Options, typename IndexType_>
+struct eval<const Tensor<Scalar_, NumIndices_, Options, IndexType_>, Eigen::Dense> {
+  typedef const Tensor<Scalar_, NumIndices_, Options, IndexType_> EIGEN_DEVICE_REF type;
 };
 
-template<typename Scalar_, typename Dimensions, int Options, typename IndexType_>
-struct eval<TensorFixedSize<Scalar_, Dimensions, Options, IndexType_>, Eigen::Dense>
-{
-  typedef const TensorFixedSize<Scalar_, Dimensions, Options, IndexType_>EIGEN_DEVICE_REF type;
+template <typename Scalar_, typename Dimensions, int Options, typename IndexType_>
+struct eval<TensorFixedSize<Scalar_, Dimensions, Options, IndexType_>, Eigen::Dense> {
+  typedef const TensorFixedSize<Scalar_, Dimensions, Options, IndexType_> EIGEN_DEVICE_REF type;
 };
 
-template<typename Scalar_, typename Dimensions, int Options, typename IndexType_>
-struct eval<const TensorFixedSize<Scalar_, Dimensions, Options, IndexType_>, Eigen::Dense>
-{
-  typedef const TensorFixedSize<Scalar_, Dimensions, Options, IndexType_>EIGEN_DEVICE_REF type;
+template <typename Scalar_, typename Dimensions, int Options, typename IndexType_>
+struct eval<const TensorFixedSize<Scalar_, Dimensions, Options, IndexType_>, Eigen::Dense> {
+  typedef const TensorFixedSize<Scalar_, Dimensions, Options, IndexType_> EIGEN_DEVICE_REF type;
 };
 
-template<typename PlainObjectType, int Options, template <class> class MakePointer>
-struct eval<TensorMap<PlainObjectType, Options, MakePointer>, Eigen::Dense>
-{
-  typedef const TensorMap<PlainObjectType, Options, MakePointer>EIGEN_DEVICE_REF type;
+template <typename PlainObjectType, int Options, template <class> class MakePointer>
+struct eval<TensorMap<PlainObjectType, Options, MakePointer>, Eigen::Dense> {
+  typedef const TensorMap<PlainObjectType, Options, MakePointer> EIGEN_DEVICE_REF type;
 };
 
-template<typename PlainObjectType, int Options, template <class> class MakePointer>
-struct eval<const TensorMap<PlainObjectType, Options, MakePointer>, Eigen::Dense>
-{
-  typedef const TensorMap<PlainObjectType, Options, MakePointer>EIGEN_DEVICE_REF type;
+template <typename PlainObjectType, int Options, template <class> class MakePointer>
+struct eval<const TensorMap<PlainObjectType, Options, MakePointer>, Eigen::Dense> {
+  typedef const TensorMap<PlainObjectType, Options, MakePointer> EIGEN_DEVICE_REF type;
 };
 
-template<typename PlainObjectType>
-struct eval<TensorRef<PlainObjectType>, Eigen::Dense>
-{
-  typedef const TensorRef<PlainObjectType>EIGEN_DEVICE_REF type;
+template <typename PlainObjectType>
+struct eval<TensorRef<PlainObjectType>, Eigen::Dense> {
+  typedef const TensorRef<PlainObjectType> EIGEN_DEVICE_REF type;
 };
 
-template<typename PlainObjectType>
-struct eval<const TensorRef<PlainObjectType>, Eigen::Dense>
-{
-  typedef const TensorRef<PlainObjectType>EIGEN_DEVICE_REF type;
+template <typename PlainObjectType>
+struct eval<const TensorRef<PlainObjectType>, Eigen::Dense> {
+  typedef const TensorRef<PlainObjectType> EIGEN_DEVICE_REF type;
 };
 
 // TODO nested<> does not exist anymore in Eigen/Core, and it thus has to be removed in favor of ref_selector.
-template<typename T, int n=1, typename PlainObject = void> struct nested
-{
+template <typename T, int n = 1, typename PlainObject = void>
+struct nested {
   typedef typename ref_selector<T>::type type;
 };
 
 template <typename Scalar_, int NumIndices_, int Options_, typename IndexType_>
-struct nested<Tensor<Scalar_, NumIndices_, Options_, IndexType_> >
-{
-  typedef const Tensor<Scalar_, NumIndices_, Options_, IndexType_>EIGEN_DEVICE_REF type;
+struct nested<Tensor<Scalar_, NumIndices_, Options_, IndexType_> > {
+  typedef const Tensor<Scalar_, NumIndices_, Options_, IndexType_> EIGEN_DEVICE_REF type;
 };
 
 template <typename Scalar_, int NumIndices_, int Options_, typename IndexType_>
-struct nested<const Tensor<Scalar_, NumIndices_, Options_, IndexType_> >
-{
-  typedef const Tensor<Scalar_, NumIndices_, Options_, IndexType_>EIGEN_DEVICE_REF type;
+struct nested<const Tensor<Scalar_, NumIndices_, Options_, IndexType_> > {
+  typedef const Tensor<Scalar_, NumIndices_, Options_, IndexType_> EIGEN_DEVICE_REF type;
 };
 
 template <typename Scalar_, typename Dimensions, int Options, typename IndexType_>
-struct nested<TensorFixedSize<Scalar_, Dimensions, Options, IndexType_> >
-{
-  typedef const TensorFixedSize<Scalar_, Dimensions, Options, IndexType_>EIGEN_DEVICE_REF type;
+struct nested<TensorFixedSize<Scalar_, Dimensions, Options, IndexType_> > {
+  typedef const TensorFixedSize<Scalar_, Dimensions, Options, IndexType_> EIGEN_DEVICE_REF type;
 };
 
 template <typename Scalar_, typename Dimensions, int Options, typename IndexType_>
-struct nested<const TensorFixedSize<Scalar_, Dimensions, Options, IndexType_> >
-{
-  typedef const TensorFixedSize<Scalar_, Dimensions, Options, IndexType_>EIGEN_DEVICE_REF type;
-};
-
-
-template <typename PlainObjectType>
-struct nested<TensorRef<PlainObjectType> >
-{
-  typedef const TensorRef<PlainObjectType>EIGEN_DEVICE_REF type;
+struct nested<const TensorFixedSize<Scalar_, Dimensions, Options, IndexType_> > {
+  typedef const TensorFixedSize<Scalar_, Dimensions, Options, IndexType_> EIGEN_DEVICE_REF type;
 };
 
 template <typename PlainObjectType>
-struct nested<const TensorRef<PlainObjectType> >
-{
-  typedef const TensorRef<PlainObjectType>EIGEN_DEVICE_REF type;
+struct nested<TensorRef<PlainObjectType> > {
+  typedef const TensorRef<PlainObjectType> EIGEN_DEVICE_REF type;
+};
+
+template <typename PlainObjectType>
+struct nested<const TensorRef<PlainObjectType> > {
+  typedef const TensorRef<PlainObjectType> EIGEN_DEVICE_REF type;
 };
 
 }  // end namespace internal
@@ -257,11 +224,8 @@
 // the SAME case.
 // When the stride is 1, we have the simplified case R'=R-K+1, C'=C-K+1, Pr=0,
 // Pc=0.
-enum PaddingType {
-  PADDING_VALID = 1,
-  PADDING_SAME = 2
-};
+enum PaddingType { PADDING_VALID = 1, PADDING_SAME = 2 };
 
 }  // end namespace Eigen
 
-#endif // EIGEN_CXX11_TENSOR_TENSOR_TRAITS_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_TRAITS_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorUInt128.h b/unsupported/Eigen/CXX11/src/Tensor/TensorUInt128.h
index 1232032..99e51c5 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorUInt128.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorUInt128.h
@@ -16,13 +16,12 @@
 namespace Eigen {
 namespace internal {
 
-
 template <uint64_t n>
 struct static_val {
   static const uint64_t value = n;
   EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE operator uint64_t() const { return n; }
 
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static_val() { }
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static_val() {}
 
   template <typename T>
   EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static_val(const T& v) {
@@ -31,23 +30,20 @@
   }
 };
 
-
 template <typename HIGH = uint64_t, typename LOW = uint64_t>
-struct TensorUInt128
-{
+struct TensorUInt128 {
   HIGH high;
   LOW low;
 
-  template<typename OTHER_HIGH, typename OTHER_LOW>
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-  TensorUInt128(const TensorUInt128<OTHER_HIGH, OTHER_LOW>& other) : high(other.high), low(other.low) {
+  template <typename OTHER_HIGH, typename OTHER_LOW>
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE TensorUInt128(const TensorUInt128<OTHER_HIGH, OTHER_LOW>& other)
+      : high(other.high), low(other.low) {
     EIGEN_STATIC_ASSERT(sizeof(OTHER_HIGH) <= sizeof(HIGH), YOU_MADE_A_PROGRAMMING_MISTAKE);
     EIGEN_STATIC_ASSERT(sizeof(OTHER_LOW) <= sizeof(LOW), YOU_MADE_A_PROGRAMMING_MISTAKE);
   }
 
-  template<typename OTHER_HIGH, typename OTHER_LOW>
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-  TensorUInt128& operator = (const TensorUInt128<OTHER_HIGH, OTHER_LOW>& other) {
+  template <typename OTHER_HIGH, typename OTHER_LOW>
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE TensorUInt128& operator=(const TensorUInt128<OTHER_HIGH, OTHER_LOW>& other) {
     EIGEN_STATIC_ASSERT(sizeof(OTHER_HIGH) <= sizeof(HIGH), YOU_MADE_A_PROGRAMMING_MISTAKE);
     EIGEN_STATIC_ASSERT(sizeof(OTHER_LOW) <= sizeof(LOW), YOU_MADE_A_PROGRAMMING_MISTAKE);
     high = other.high;
@@ -55,46 +51,35 @@
     return *this;
   }
 
-  template<typename T>
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-  explicit TensorUInt128(const T& x) : high(0), low(x) {
-    eigen_assert((static_cast<std::conditional_t<sizeof(T) == 8, uint64_t, uint32_t>>(x) <= NumTraits<uint64_t>::highest()));
+  template <typename T>
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE explicit TensorUInt128(const T& x) : high(0), low(x) {
+    eigen_assert(
+        (static_cast<std::conditional_t<sizeof(T) == 8, uint64_t, uint32_t>>(x) <= NumTraits<uint64_t>::highest()));
     eigen_assert(x >= 0);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-  TensorUInt128(HIGH y, LOW x) : high(y), low(x) { }
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE TensorUInt128(HIGH y, LOW x) : high(y), low(x) {}
 
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE operator LOW() const {
-    return low;
-  }
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE LOW lower() const {
-    return low;
-  }
-  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE HIGH upper() const {
-    return high;
-  }
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE operator LOW() const { return low; }
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE LOW lower() const { return low; }
+  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE HIGH upper() const { return high; }
 };
 
-
 template <typename HL, typename LL, typename HR, typename LR>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-bool operator == (const TensorUInt128<HL, LL>& lhs, const TensorUInt128<HR, LR>& rhs)
-{
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool operator==(const TensorUInt128<HL, LL>& lhs,
+                                                      const TensorUInt128<HR, LR>& rhs) {
   return (lhs.high == rhs.high) && (lhs.low == rhs.low);
 }
 
 template <typename HL, typename LL, typename HR, typename LR>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-bool operator != (const TensorUInt128<HL, LL>& lhs, const TensorUInt128<HR, LR>& rhs)
-{
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool operator!=(const TensorUInt128<HL, LL>& lhs,
+                                                      const TensorUInt128<HR, LR>& rhs) {
   return (lhs.high != rhs.high) || (lhs.low != rhs.low);
 }
 
 template <typename HL, typename LL, typename HR, typename LR>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-bool operator >= (const TensorUInt128<HL, LL>& lhs, const TensorUInt128<HR, LR>& rhs)
-{
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool operator>=(const TensorUInt128<HL, LL>& lhs,
+                                                      const TensorUInt128<HR, LR>& rhs) {
   if (lhs.high != rhs.high) {
     return lhs.high > rhs.high;
   }
@@ -102,9 +87,8 @@
 }
 
 template <typename HL, typename LL, typename HR, typename LR>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-bool operator < (const TensorUInt128<HL, LL>& lhs, const TensorUInt128<HR, LR>& rhs)
-{
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool operator<(const TensorUInt128<HL, LL>& lhs,
+                                                     const TensorUInt128<HR, LR>& rhs) {
   if (lhs.high != rhs.high) {
     return lhs.high < rhs.high;
   }
@@ -112,9 +96,8 @@
 }
 
 template <typename HL, typename LL, typename HR, typename LR>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-TensorUInt128<uint64_t, uint64_t> operator + (const TensorUInt128<HL, LL>& lhs, const TensorUInt128<HR, LR>& rhs)
-{
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE TensorUInt128<uint64_t, uint64_t> operator+(const TensorUInt128<HL, LL>& lhs,
+                                                                                  const TensorUInt128<HR, LR>& rhs) {
   TensorUInt128<uint64_t, uint64_t> result(lhs.high + rhs.high, lhs.low + rhs.low);
   if (result.low < rhs.low) {
     result.high += 1;
@@ -123,9 +106,8 @@
 }
 
 template <typename HL, typename LL, typename HR, typename LR>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-TensorUInt128<uint64_t, uint64_t> operator - (const TensorUInt128<HL, LL>& lhs, const TensorUInt128<HR, LR>& rhs)
-{
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE TensorUInt128<uint64_t, uint64_t> operator-(const TensorUInt128<HL, LL>& lhs,
+                                                                                  const TensorUInt128<HR, LR>& rhs) {
   TensorUInt128<uint64_t, uint64_t> result(lhs.high - rhs.high, lhs.low - rhs.low);
   if (result.low > lhs.low) {
     result.high -= 1;
@@ -133,11 +115,9 @@
   return result;
 }
 
-
 template <typename HL, typename LL, typename HR, typename LR>
-static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-TensorUInt128<uint64_t, uint64_t> operator * (const TensorUInt128<HL, LL>& lhs, const TensorUInt128<HR, LR>& rhs)
-{
+static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorUInt128<uint64_t, uint64_t> operator*(
+    const TensorUInt128<HL, LL>& lhs, const TensorUInt128<HR, LR>& rhs) {
   // Split each 128-bit integer into 4 32-bit integers, and then do the
   // multiplications by hand as follow:
   //   lhs      a  b  c  d
@@ -210,10 +190,9 @@
 }
 
 template <typename HL, typename LL, typename HR, typename LR>
-static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-TensorUInt128<uint64_t, uint64_t> operator / (const TensorUInt128<HL, LL>& lhs, const TensorUInt128<HR, LR>& rhs)
-{
-  if (rhs == TensorUInt128<static_val<0>, static_val<1> >(1)) {
+static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorUInt128<uint64_t, uint64_t> operator/(
+    const TensorUInt128<HL, LL>& lhs, const TensorUInt128<HR, LR>& rhs) {
+  if (rhs == TensorUInt128<static_val<0>, static_val<1>>(1)) {
     return TensorUInt128<uint64_t, uint64_t>(lhs.high, lhs.low);
   } else if (lhs < rhs) {
     return TensorUInt128<uint64_t, uint64_t>(0);
@@ -230,7 +209,7 @@
 
     tmp = TensorUInt128<uint64_t, uint64_t>(lhs.high, lhs.low);
     TensorUInt128<uint64_t, uint64_t> result(0);
-    while (power2 != TensorUInt128<static_val<0>, static_val<0> >(0)) {
+    while (power2 != TensorUInt128<static_val<0>, static_val<0>>(0)) {
       if (tmp >= d) {
         tmp = tmp - d;
         result = result + power2;
@@ -244,9 +223,7 @@
   }
 }
 
-
 }  // namespace internal
 }  // namespace Eigen
 
-
 #endif  // EIGEN_CXX11_TENSOR_TENSOR_UINT128_H
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorVolumePatch.h b/unsupported/Eigen/CXX11/src/Tensor/TensorVolumePatch.h
index cb49bef..75063f5 100644
--- a/unsupported/Eigen/CXX11/src/Tensor/TensorVolumePatch.h
+++ b/unsupported/Eigen/CXX11/src/Tensor/TensorVolumePatch.h
@@ -10,25 +10,24 @@
 namespace Eigen {
 
 /** \class TensorVolumePatch
-  * \ingroup CXX11_Tensor_Module
-  *
-  * \brief Patch extraction specialized for processing of volumetric data.
-  * This assumes that the input has a least 4 dimensions ordered as follows:
-  *  - channels
-  *  - planes
-  *  - rows
-  *  - columns
-  *  - (optional) additional dimensions such as time or batch size.
-  * Calling the volume patch code with patch_planes, patch_rows, and patch_cols
-  * is equivalent to calling the regular patch extraction code with parameters
-  * d, patch_planes, patch_rows, patch_cols, and 1 for all the additional
-  * dimensions.
-  */
+ * \ingroup CXX11_Tensor_Module
+ *
+ * \brief Patch extraction specialized for processing of volumetric data.
+ * This assumes that the input has a least 4 dimensions ordered as follows:
+ *  - channels
+ *  - planes
+ *  - rows
+ *  - columns
+ *  - (optional) additional dimensions such as time or batch size.
+ * Calling the volume patch code with patch_planes, patch_rows, and patch_cols
+ * is equivalent to calling the regular patch extraction code with parameters
+ * d, patch_planes, patch_rows, patch_cols, and 1 for all the additional
+ * dimensions.
+ */
 namespace internal {
 
-template<DenseIndex Planes, DenseIndex Rows, DenseIndex Cols, typename XprType>
-struct traits<TensorVolumePatchOp<Planes, Rows, Cols, XprType> > : public traits<XprType>
-{
+template <DenseIndex Planes, DenseIndex Rows, DenseIndex Cols, typename XprType>
+struct traits<TensorVolumePatchOp<Planes, Rows, Cols, XprType> > : public traits<XprType> {
   typedef std::remove_const_t<typename XprType::Scalar> Scalar;
   typedef traits<XprType> XprTraits;
   typedef typename XprTraits::StorageKind StorageKind;
@@ -38,27 +37,24 @@
   static constexpr int NumDimensions = XprTraits::NumDimensions + 1;
   static constexpr int Layout = XprTraits::Layout;
   typedef typename XprTraits::PointerType PointerType;
-
 };
 
-template<DenseIndex Planes, DenseIndex Rows, DenseIndex Cols, typename XprType>
-struct eval<TensorVolumePatchOp<Planes, Rows, Cols, XprType>, Eigen::Dense>
-{
+template <DenseIndex Planes, DenseIndex Rows, DenseIndex Cols, typename XprType>
+struct eval<TensorVolumePatchOp<Planes, Rows, Cols, XprType>, Eigen::Dense> {
   typedef const TensorVolumePatchOp<Planes, Rows, Cols, XprType>& type;
 };
 
-template<DenseIndex Planes, DenseIndex Rows, DenseIndex Cols, typename XprType>
-struct nested<TensorVolumePatchOp<Planes, Rows, Cols, XprType>, 1, typename eval<TensorVolumePatchOp<Planes, Rows, Cols, XprType> >::type>
-{
+template <DenseIndex Planes, DenseIndex Rows, DenseIndex Cols, typename XprType>
+struct nested<TensorVolumePatchOp<Planes, Rows, Cols, XprType>, 1,
+              typename eval<TensorVolumePatchOp<Planes, Rows, Cols, XprType> >::type> {
   typedef TensorVolumePatchOp<Planes, Rows, Cols, XprType> type;
 };
 
 }  // end namespace internal
 
-template<DenseIndex Planes, DenseIndex Rows, DenseIndex Cols, typename XprType>
-class TensorVolumePatchOp : public TensorBase<TensorVolumePatchOp<Planes, Rows, Cols, XprType>, ReadOnlyAccessors>
-{
-  public:
+template <DenseIndex Planes, DenseIndex Rows, DenseIndex Cols, typename XprType>
+class TensorVolumePatchOp : public TensorBase<TensorVolumePatchOp<Planes, Rows, Cols, XprType>, ReadOnlyAccessors> {
+ public:
   typedef typename Eigen::internal::traits<TensorVolumePatchOp>::Scalar Scalar;
   typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
   typedef typename XprType::CoeffReturnType CoeffReturnType;
@@ -66,114 +62,120 @@
   typedef typename Eigen::internal::traits<TensorVolumePatchOp>::StorageKind StorageKind;
   typedef typename Eigen::internal::traits<TensorVolumePatchOp>::Index Index;
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorVolumePatchOp(const XprType& expr, DenseIndex patch_planes, DenseIndex patch_rows, DenseIndex patch_cols,
-                                                            DenseIndex plane_strides, DenseIndex row_strides, DenseIndex col_strides,
-                                                            DenseIndex in_plane_strides, DenseIndex in_row_strides, DenseIndex in_col_strides,
-                                                            DenseIndex plane_inflate_strides, DenseIndex row_inflate_strides, DenseIndex col_inflate_strides,
-                                                            PaddingType padding_type, Scalar padding_value)
-                                                            : m_xpr(expr), m_patch_planes(patch_planes), m_patch_rows(patch_rows), m_patch_cols(patch_cols),
-                                                            m_plane_strides(plane_strides), m_row_strides(row_strides), m_col_strides(col_strides),
-                                                            m_in_plane_strides(in_plane_strides), m_in_row_strides(in_row_strides), m_in_col_strides(in_col_strides),
-                                                            m_plane_inflate_strides(plane_inflate_strides), m_row_inflate_strides(row_inflate_strides), m_col_inflate_strides(col_inflate_strides),
-                                                            m_padding_explicit(false), m_padding_top_z(0), m_padding_bottom_z(0), m_padding_top(0), m_padding_bottom(0), m_padding_left(0), m_padding_right(0),
-                                                            m_padding_type(padding_type), m_padding_value(padding_value) {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorVolumePatchOp(
+      const XprType& expr, DenseIndex patch_planes, DenseIndex patch_rows, DenseIndex patch_cols,
+      DenseIndex plane_strides, DenseIndex row_strides, DenseIndex col_strides, DenseIndex in_plane_strides,
+      DenseIndex in_row_strides, DenseIndex in_col_strides, DenseIndex plane_inflate_strides,
+      DenseIndex row_inflate_strides, DenseIndex col_inflate_strides, PaddingType padding_type, Scalar padding_value)
+      : m_xpr(expr),
+        m_patch_planes(patch_planes),
+        m_patch_rows(patch_rows),
+        m_patch_cols(patch_cols),
+        m_plane_strides(plane_strides),
+        m_row_strides(row_strides),
+        m_col_strides(col_strides),
+        m_in_plane_strides(in_plane_strides),
+        m_in_row_strides(in_row_strides),
+        m_in_col_strides(in_col_strides),
+        m_plane_inflate_strides(plane_inflate_strides),
+        m_row_inflate_strides(row_inflate_strides),
+        m_col_inflate_strides(col_inflate_strides),
+        m_padding_explicit(false),
+        m_padding_top_z(0),
+        m_padding_bottom_z(0),
+        m_padding_top(0),
+        m_padding_bottom(0),
+        m_padding_left(0),
+        m_padding_right(0),
+        m_padding_type(padding_type),
+        m_padding_value(padding_value) {}
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorVolumePatchOp(const XprType& expr, DenseIndex patch_planes, DenseIndex patch_rows, DenseIndex patch_cols,
-                                                           DenseIndex plane_strides, DenseIndex row_strides, DenseIndex col_strides,
-                                                           DenseIndex in_plane_strides, DenseIndex in_row_strides, DenseIndex in_col_strides,
-                                                           DenseIndex plane_inflate_strides, DenseIndex row_inflate_strides, DenseIndex col_inflate_strides,
-                                                           DenseIndex padding_top_z, DenseIndex padding_bottom_z,
-                                                           DenseIndex padding_top, DenseIndex padding_bottom,
-                                                           DenseIndex padding_left, DenseIndex padding_right,
-                                                           Scalar padding_value)
-                                                           : m_xpr(expr), m_patch_planes(patch_planes), m_patch_rows(patch_rows), m_patch_cols(patch_cols),
-                                                           m_plane_strides(plane_strides), m_row_strides(row_strides), m_col_strides(col_strides),
-                                                           m_in_plane_strides(in_plane_strides), m_in_row_strides(in_row_strides), m_in_col_strides(in_col_strides),
-                                                           m_plane_inflate_strides(plane_inflate_strides), m_row_inflate_strides(row_inflate_strides), m_col_inflate_strides(col_inflate_strides),
-                                                           m_padding_explicit(true), m_padding_top_z(padding_top_z), m_padding_bottom_z(padding_bottom_z), m_padding_top(padding_top), m_padding_bottom(padding_bottom),
-                                                           m_padding_left(padding_left), m_padding_right(padding_right),
-                                                           m_padding_type(PADDING_VALID), m_padding_value(padding_value) {}
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorVolumePatchOp(
+      const XprType& expr, DenseIndex patch_planes, DenseIndex patch_rows, DenseIndex patch_cols,
+      DenseIndex plane_strides, DenseIndex row_strides, DenseIndex col_strides, DenseIndex in_plane_strides,
+      DenseIndex in_row_strides, DenseIndex in_col_strides, DenseIndex plane_inflate_strides,
+      DenseIndex row_inflate_strides, DenseIndex col_inflate_strides, DenseIndex padding_top_z,
+      DenseIndex padding_bottom_z, DenseIndex padding_top, DenseIndex padding_bottom, DenseIndex padding_left,
+      DenseIndex padding_right, Scalar padding_value)
+      : m_xpr(expr),
+        m_patch_planes(patch_planes),
+        m_patch_rows(patch_rows),
+        m_patch_cols(patch_cols),
+        m_plane_strides(plane_strides),
+        m_row_strides(row_strides),
+        m_col_strides(col_strides),
+        m_in_plane_strides(in_plane_strides),
+        m_in_row_strides(in_row_strides),
+        m_in_col_strides(in_col_strides),
+        m_plane_inflate_strides(plane_inflate_strides),
+        m_row_inflate_strides(row_inflate_strides),
+        m_col_inflate_strides(col_inflate_strides),
+        m_padding_explicit(true),
+        m_padding_top_z(padding_top_z),
+        m_padding_bottom_z(padding_bottom_z),
+        m_padding_top(padding_top),
+        m_padding_bottom(padding_bottom),
+        m_padding_left(padding_left),
+        m_padding_right(padding_right),
+        m_padding_type(PADDING_VALID),
+        m_padding_value(padding_value) {}
 
-    EIGEN_DEVICE_FUNC
-    DenseIndex patch_planes() const { return m_patch_planes; }
-    EIGEN_DEVICE_FUNC
-    DenseIndex patch_rows() const { return m_patch_rows; }
-    EIGEN_DEVICE_FUNC
-    DenseIndex patch_cols() const { return m_patch_cols; }
-    EIGEN_DEVICE_FUNC
-    DenseIndex plane_strides() const { return m_plane_strides; }
-    EIGEN_DEVICE_FUNC
-    DenseIndex row_strides() const { return m_row_strides; }
-    EIGEN_DEVICE_FUNC
-    DenseIndex col_strides() const { return m_col_strides; }
-    EIGEN_DEVICE_FUNC
-    DenseIndex in_plane_strides() const { return m_in_plane_strides; }
-    EIGEN_DEVICE_FUNC
-    DenseIndex in_row_strides() const { return m_in_row_strides; }
-    EIGEN_DEVICE_FUNC
-    DenseIndex in_col_strides() const { return m_in_col_strides; }
-    EIGEN_DEVICE_FUNC
-    DenseIndex plane_inflate_strides() const { return m_plane_inflate_strides; }
-    EIGEN_DEVICE_FUNC
-    DenseIndex row_inflate_strides() const { return m_row_inflate_strides; }
-    EIGEN_DEVICE_FUNC
-    DenseIndex col_inflate_strides() const { return m_col_inflate_strides; }
-    EIGEN_DEVICE_FUNC
-    bool padding_explicit() const { return m_padding_explicit; }
-    EIGEN_DEVICE_FUNC
-    DenseIndex padding_top_z() const { return m_padding_top_z; }
-    EIGEN_DEVICE_FUNC
-    DenseIndex padding_bottom_z() const { return m_padding_bottom_z; }
-    EIGEN_DEVICE_FUNC
-    DenseIndex padding_top() const { return m_padding_top; }
-    EIGEN_DEVICE_FUNC
-    DenseIndex padding_bottom() const { return m_padding_bottom; }
-    EIGEN_DEVICE_FUNC
-    DenseIndex padding_left() const { return m_padding_left; }
-    EIGEN_DEVICE_FUNC
-    DenseIndex padding_right() const { return m_padding_right; }
-    EIGEN_DEVICE_FUNC
-    PaddingType padding_type() const { return m_padding_type; }
-    EIGEN_DEVICE_FUNC
-    Scalar padding_value() const { return m_padding_value; }
+  EIGEN_DEVICE_FUNC DenseIndex patch_planes() const { return m_patch_planes; }
+  EIGEN_DEVICE_FUNC DenseIndex patch_rows() const { return m_patch_rows; }
+  EIGEN_DEVICE_FUNC DenseIndex patch_cols() const { return m_patch_cols; }
+  EIGEN_DEVICE_FUNC DenseIndex plane_strides() const { return m_plane_strides; }
+  EIGEN_DEVICE_FUNC DenseIndex row_strides() const { return m_row_strides; }
+  EIGEN_DEVICE_FUNC DenseIndex col_strides() const { return m_col_strides; }
+  EIGEN_DEVICE_FUNC DenseIndex in_plane_strides() const { return m_in_plane_strides; }
+  EIGEN_DEVICE_FUNC DenseIndex in_row_strides() const { return m_in_row_strides; }
+  EIGEN_DEVICE_FUNC DenseIndex in_col_strides() const { return m_in_col_strides; }
+  EIGEN_DEVICE_FUNC DenseIndex plane_inflate_strides() const { return m_plane_inflate_strides; }
+  EIGEN_DEVICE_FUNC DenseIndex row_inflate_strides() const { return m_row_inflate_strides; }
+  EIGEN_DEVICE_FUNC DenseIndex col_inflate_strides() const { return m_col_inflate_strides; }
+  EIGEN_DEVICE_FUNC bool padding_explicit() const { return m_padding_explicit; }
+  EIGEN_DEVICE_FUNC DenseIndex padding_top_z() const { return m_padding_top_z; }
+  EIGEN_DEVICE_FUNC DenseIndex padding_bottom_z() const { return m_padding_bottom_z; }
+  EIGEN_DEVICE_FUNC DenseIndex padding_top() const { return m_padding_top; }
+  EIGEN_DEVICE_FUNC DenseIndex padding_bottom() const { return m_padding_bottom; }
+  EIGEN_DEVICE_FUNC DenseIndex padding_left() const { return m_padding_left; }
+  EIGEN_DEVICE_FUNC DenseIndex padding_right() const { return m_padding_right; }
+  EIGEN_DEVICE_FUNC PaddingType padding_type() const { return m_padding_type; }
+  EIGEN_DEVICE_FUNC Scalar padding_value() const { return m_padding_value; }
 
-    EIGEN_DEVICE_FUNC
-    const internal::remove_all_t<typename XprType::Nested>&
-    expression() const { return m_xpr; }
+  EIGEN_DEVICE_FUNC const internal::remove_all_t<typename XprType::Nested>& expression() const { return m_xpr; }
 
-  protected:
-    typename XprType::Nested m_xpr;
-    const DenseIndex m_patch_planes;
-    const DenseIndex m_patch_rows;
-    const DenseIndex m_patch_cols;
-    const DenseIndex m_plane_strides;
-    const DenseIndex m_row_strides;
-    const DenseIndex m_col_strides;
-    const DenseIndex m_in_plane_strides;
-    const DenseIndex m_in_row_strides;
-    const DenseIndex m_in_col_strides;
-    const DenseIndex m_plane_inflate_strides;
-    const DenseIndex m_row_inflate_strides;
-    const DenseIndex m_col_inflate_strides;
-    const bool m_padding_explicit;
-    const DenseIndex m_padding_top_z;
-    const DenseIndex m_padding_bottom_z;
-    const DenseIndex m_padding_top;
-    const DenseIndex m_padding_bottom;
-    const DenseIndex m_padding_left;
-    const DenseIndex m_padding_right;
-    const PaddingType m_padding_type;
-    const Scalar m_padding_value;
+ protected:
+  typename XprType::Nested m_xpr;
+  const DenseIndex m_patch_planes;
+  const DenseIndex m_patch_rows;
+  const DenseIndex m_patch_cols;
+  const DenseIndex m_plane_strides;
+  const DenseIndex m_row_strides;
+  const DenseIndex m_col_strides;
+  const DenseIndex m_in_plane_strides;
+  const DenseIndex m_in_row_strides;
+  const DenseIndex m_in_col_strides;
+  const DenseIndex m_plane_inflate_strides;
+  const DenseIndex m_row_inflate_strides;
+  const DenseIndex m_col_inflate_strides;
+  const bool m_padding_explicit;
+  const DenseIndex m_padding_top_z;
+  const DenseIndex m_padding_bottom_z;
+  const DenseIndex m_padding_top;
+  const DenseIndex m_padding_bottom;
+  const DenseIndex m_padding_left;
+  const DenseIndex m_padding_right;
+  const PaddingType m_padding_type;
+  const Scalar m_padding_value;
 };
 
-
 // Eval as rvalue
-template<DenseIndex Planes, DenseIndex Rows, DenseIndex Cols, typename ArgType, typename Device>
-struct TensorEvaluator<const TensorVolumePatchOp<Planes, Rows, Cols, ArgType>, Device>
-{
+template <DenseIndex Planes, DenseIndex Rows, DenseIndex Cols, typename ArgType, typename Device>
+struct TensorEvaluator<const TensorVolumePatchOp<Planes, Rows, Cols, ArgType>, Device> {
   typedef TensorVolumePatchOp<Planes, Rows, Cols, ArgType> XprType;
   typedef typename XprType::Index Index;
-  static constexpr int NumInputDims = internal::array_size<typename TensorEvaluator<ArgType, Device>::Dimensions>::value;
+  static constexpr int NumInputDims =
+      internal::array_size<typename TensorEvaluator<ArgType, Device>::Dimensions>::value;
   static constexpr int NumDims = NumInputDims + 1;
   typedef DSizes<Index, NumDims> Dimensions;
   typedef std::remove_const_t<typename XprType::Scalar> Scalar;
@@ -197,9 +199,7 @@
   typedef internal::TensorBlockNotImplemented TensorBlock;
   //===--------------------------------------------------------------------===//
 
-  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) :
- m_impl(op.expression(), device)
-  {
+  EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) : m_impl(op.expression(), device) {
     EIGEN_STATIC_ASSERT((NumDims >= 5), YOU_MADE_A_PROGRAMMING_MISTAKE);
 
     m_paddingValue = op.padding_value();
@@ -213,10 +213,10 @@
       m_inputRows = input_dims[2];
       m_inputCols = input_dims[3];
     } else {
-      m_inputDepth = input_dims[NumInputDims-1];
-      m_inputPlanes = input_dims[NumInputDims-2];
-      m_inputRows = input_dims[NumInputDims-3];
-      m_inputCols = input_dims[NumInputDims-4];
+      m_inputDepth = input_dims[NumInputDims - 1];
+      m_inputPlanes = input_dims[NumInputDims - 2];
+      m_inputRows = input_dims[NumInputDims - 3];
+      m_inputCols = input_dims[NumInputDims - 4];
     }
 
     m_plane_strides = op.plane_strides();
@@ -240,9 +240,13 @@
     m_patch_cols_eff = op.patch_cols() + (op.patch_cols() - 1) * (m_in_col_strides - 1);
 
     if (op.padding_explicit()) {
-      m_outputPlanes = numext::ceil((m_input_planes_eff + op.padding_top_z() + op.padding_bottom_z() - m_patch_planes_eff + 1.f) / static_cast<float>(m_plane_strides));
-      m_outputRows = numext::ceil((m_input_rows_eff + op.padding_top() + op.padding_bottom() - m_patch_rows_eff + 1.f) / static_cast<float>(m_row_strides));
-      m_outputCols = numext::ceil((m_input_cols_eff + op.padding_left() + op.padding_right() - m_patch_cols_eff + 1.f) / static_cast<float>(m_col_strides));
+      m_outputPlanes =
+          numext::ceil((m_input_planes_eff + op.padding_top_z() + op.padding_bottom_z() - m_patch_planes_eff + 1.f) /
+                       static_cast<float>(m_plane_strides));
+      m_outputRows = numext::ceil((m_input_rows_eff + op.padding_top() + op.padding_bottom() - m_patch_rows_eff + 1.f) /
+                                  static_cast<float>(m_row_strides));
+      m_outputCols = numext::ceil((m_input_cols_eff + op.padding_left() + op.padding_right() - m_patch_cols_eff + 1.f) /
+                                  static_cast<float>(m_col_strides));
       m_planePaddingTop = op.padding_top_z();
       m_rowPaddingTop = op.padding_top();
       m_colPaddingLeft = op.padding_left();
@@ -250,7 +254,8 @@
       // Computing padding from the type
       switch (op.padding_type()) {
         case PADDING_VALID:
-          m_outputPlanes = numext::ceil((m_input_planes_eff - m_patch_planes_eff + 1.f) / static_cast<float>(m_plane_strides));
+          m_outputPlanes =
+              numext::ceil((m_input_planes_eff - m_patch_planes_eff + 1.f) / static_cast<float>(m_plane_strides));
           m_outputRows = numext::ceil((m_input_rows_eff - m_patch_rows_eff + 1.f) / static_cast<float>(m_row_strides));
           m_outputCols = numext::ceil((m_input_cols_eff - m_patch_cols_eff + 1.f) / static_cast<float>(m_col_strides));
           m_planePaddingTop = 0;
@@ -292,7 +297,7 @@
       m_dimensions[3] = op.patch_cols();
       m_dimensions[4] = m_outputPlanes * m_outputRows * m_outputCols;
       for (int i = 5; i < NumDims; ++i) {
-        m_dimensions[i] = input_dims[i-1];
+        m_dimensions[i] = input_dims[i - 1];
       }
     } else {
       // RowMajor
@@ -302,12 +307,12 @@
       // NumDims-4: patch_cols
       // NumDims-5: number of patches
       // NumDims-6 and beyond: anything else (such as batch).
-      m_dimensions[NumDims-1] = input_dims[NumInputDims-1];
-      m_dimensions[NumDims-2] = op.patch_planes();
-      m_dimensions[NumDims-3] = op.patch_rows();
-      m_dimensions[NumDims-4] = op.patch_cols();
-      m_dimensions[NumDims-5] = m_outputPlanes * m_outputRows * m_outputCols;
-      for (int i = NumDims-6; i >= 0; --i) {
+      m_dimensions[NumDims - 1] = input_dims[NumInputDims - 1];
+      m_dimensions[NumDims - 2] = op.patch_planes();
+      m_dimensions[NumDims - 3] = op.patch_rows();
+      m_dimensions[NumDims - 4] = op.patch_cols();
+      m_dimensions[NumDims - 5] = m_outputPlanes * m_outputRows * m_outputCols;
+      for (int i = NumDims - 6; i >= 0; --i) {
         m_dimensions[i] = input_dims[i];
       }
     }
@@ -319,10 +324,10 @@
       m_patchStride = m_colStride * m_dimensions[3] * m_dimensions[0];
       m_otherStride = m_patchStride * m_dimensions[4];
     } else {
-      m_rowStride = m_dimensions[NumDims-2];
-      m_colStride = m_dimensions[NumDims-3] * m_rowStride;
-      m_patchStride = m_colStride * m_dimensions[NumDims-4] * m_dimensions[NumDims-1];
-      m_otherStride = m_patchStride * m_dimensions[NumDims-5];
+      m_rowStride = m_dimensions[NumDims - 2];
+      m_colStride = m_dimensions[NumDims - 3] * m_rowStride;
+      m_patchStride = m_colStride * m_dimensions[NumDims - 4] * m_dimensions[NumDims - 1];
+      m_otherStride = m_patchStride * m_dimensions[NumDims - 5];
     }
 
     // Strides for navigating through the input tensor.
@@ -349,7 +354,7 @@
     if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
       m_fastOutputDepth = internal::TensorIntDivisor<Index>(m_dimensions[0]);
     } else {
-      m_fastOutputDepth = internal::TensorIntDivisor<Index>(m_dimensions[NumDims-1]);
+      m_fastOutputDepth = internal::TensorIntDivisor<Index>(m_dimensions[NumDims - 1]);
     }
   }
 
@@ -360,12 +365,9 @@
     return true;
   }
 
-  EIGEN_STRONG_INLINE void cleanup() {
-    m_impl.cleanup();
-  }
+  EIGEN_STRONG_INLINE void cleanup() { m_impl.cleanup(); }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const {
     // Patch index corresponding to the passed in index.
     const Index patchIndex = index / m_fastPatchStride;
 
@@ -381,7 +383,8 @@
     const Index colIndex = patch3DIndex / m_fastOutputPlanesRows;
     const Index colOffset = patchOffset / m_fastColStride;
     const Index inputCol = colIndex * m_col_strides + colOffset * m_in_col_strides - m_colPaddingLeft;
-    const Index origInputCol = (m_col_inflate_strides == 1) ? inputCol : ((inputCol >= 0) ? (inputCol / m_fastInputColStride) : 0);
+    const Index origInputCol =
+        (m_col_inflate_strides == 1) ? inputCol : ((inputCol >= 0) ? (inputCol / m_fastInputColStride) : 0);
     if (inputCol < 0 || inputCol >= m_input_cols_eff ||
         ((m_col_inflate_strides != 1) && (inputCol != origInputCol * m_col_inflate_strides))) {
       return Scalar(m_paddingValue);
@@ -391,7 +394,8 @@
     const Index rowIndex = (patch3DIndex - colIndex * m_outputPlanesRows) / m_fastOutputPlanes;
     const Index rowOffset = (patchOffset - colOffset * m_colStride) / m_fastRowStride;
     const Index inputRow = rowIndex * m_row_strides + rowOffset * m_in_row_strides - m_rowPaddingTop;
-    const Index origInputRow = (m_row_inflate_strides == 1) ? inputRow : ((inputRow >= 0) ? (inputRow / m_fastInputRowStride) : 0);
+    const Index origInputRow =
+        (m_row_inflate_strides == 1) ? inputRow : ((inputRow >= 0) ? (inputRow / m_fastInputRowStride) : 0);
     if (inputRow < 0 || inputRow >= m_input_rows_eff ||
         ((m_row_inflate_strides != 1) && (inputRow != origInputRow * m_row_inflate_strides))) {
       return Scalar(m_paddingValue);
@@ -401,7 +405,8 @@
     const Index planeIndex = (patch3DIndex - m_outputPlanes * (colIndex * m_outputRows + rowIndex));
     const Index planeOffset = patchOffset - colOffset * m_colStride - rowOffset * m_rowStride;
     const Index inputPlane = planeIndex * m_plane_strides + planeOffset * m_in_plane_strides - m_planePaddingTop;
-    const Index origInputPlane = (m_plane_inflate_strides == 1) ? inputPlane : ((inputPlane >= 0) ? (inputPlane / m_fastInputPlaneStride) : 0);
+    const Index origInputPlane =
+        (m_plane_inflate_strides == 1) ? inputPlane : ((inputPlane >= 0) ? (inputPlane / m_fastInputPlaneStride) : 0);
     if (inputPlane < 0 || inputPlane >= m_input_planes_eff ||
         ((m_plane_inflate_strides != 1) && (inputPlane != origInputPlane * m_plane_inflate_strides))) {
       return Scalar(m_paddingValue);
@@ -410,19 +415,15 @@
     const int depth_index = static_cast<int>(Layout) == static_cast<int>(ColMajor) ? 0 : NumDims - 1;
     const Index depth = index - (index / m_fastOutputDepth) * m_dimensions[depth_index];
 
-    const Index inputIndex = depth +
-        origInputRow * m_rowInputStride +
-        origInputCol * m_colInputStride +
-        origInputPlane * m_planeInputStride +
-        otherIndex * m_otherInputStride;
+    const Index inputIndex = depth + origInputRow * m_rowInputStride + origInputCol * m_colInputStride +
+                             origInputPlane * m_planeInputStride + otherIndex * m_otherInputStride;
 
     return m_impl.coeff(inputIndex);
   }
 
-  template<int LoadMode>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const
-  {
-    eigen_assert(index+PacketSize-1 < dimensions().TotalSize());
+  template <int LoadMode>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const {
+    eigen_assert(index + PacketSize - 1 < dimensions().TotalSize());
 
     if (m_in_row_strides != 1 || m_in_col_strides != 1 || m_row_inflate_strides != 1 || m_col_inflate_strides != 1 ||
         m_in_plane_strides != 1 || m_plane_inflate_strides != 1) {
@@ -441,18 +442,16 @@
     const Index patchOffsets[2] = {(indices[0] - patchIndex * m_patchStride) / m_fastOutputDepth,
                                    (indices[1] - patchIndex * m_patchStride) / m_fastOutputDepth};
 
-    const Index patch3DIndex = (NumDims == 5) ? patchIndex : (indices[0] - otherIndex * m_otherStride) / m_fastPatchStride;
+    const Index patch3DIndex =
+        (NumDims == 5) ? patchIndex : (indices[0] - otherIndex * m_otherStride) / m_fastPatchStride;
     eigen_assert(patch3DIndex == (indices[1] - otherIndex * m_otherStride) / m_fastPatchStride);
 
     const Index colIndex = patch3DIndex / m_fastOutputPlanesRows;
-    const Index colOffsets[2] = {
-      patchOffsets[0] / m_fastColStride,
-      patchOffsets[1] / m_fastColStride};
+    const Index colOffsets[2] = {patchOffsets[0] / m_fastColStride, patchOffsets[1] / m_fastColStride};
 
     // Calculate col indices in the original input tensor.
-    const Index inputCols[2] = {
-      colIndex * m_col_strides + colOffsets[0] - m_colPaddingLeft,
-      colIndex * m_col_strides + colOffsets[1] - m_colPaddingLeft};
+    const Index inputCols[2] = {colIndex * m_col_strides + colOffsets[0] - m_colPaddingLeft,
+                                colIndex * m_col_strides + colOffsets[1] - m_colPaddingLeft};
     if (inputCols[1] < 0 || inputCols[0] >= m_inputCols) {
       return internal::pset1<PacketReturnType>(Scalar(m_paddingValue));
     }
@@ -462,14 +461,12 @@
     }
 
     const Index rowIndex = (patch3DIndex - colIndex * m_outputPlanesRows) / m_fastOutputPlanes;
-    const Index rowOffsets[2] = {
-      (patchOffsets[0] - colOffsets[0] * m_colStride) / m_fastRowStride,
-      (patchOffsets[1] - colOffsets[1] * m_colStride) / m_fastRowStride};
+    const Index rowOffsets[2] = {(patchOffsets[0] - colOffsets[0] * m_colStride) / m_fastRowStride,
+                                 (patchOffsets[1] - colOffsets[1] * m_colStride) / m_fastRowStride};
     eigen_assert(rowOffsets[0] <= rowOffsets[1]);
     // Calculate col indices in the original input tensor.
-    const Index inputRows[2] = {
-      rowIndex * m_row_strides + rowOffsets[0] - m_rowPaddingTop,
-      rowIndex * m_row_strides + rowOffsets[1] - m_rowPaddingTop};
+    const Index inputRows[2] = {rowIndex * m_row_strides + rowOffsets[0] - m_rowPaddingTop,
+                                rowIndex * m_row_strides + rowOffsets[1] - m_rowPaddingTop};
 
     if (inputRows[1] < 0 || inputRows[0] >= m_inputRows) {
       return internal::pset1<PacketReturnType>(Scalar(m_paddingValue));
@@ -480,13 +477,11 @@
     }
 
     const Index planeIndex = (patch3DIndex - m_outputPlanes * (colIndex * m_outputRows + rowIndex));
-    const Index planeOffsets[2] = {
-      patchOffsets[0] - colOffsets[0] * m_colStride - rowOffsets[0] * m_rowStride,
-      patchOffsets[1] - colOffsets[1] * m_colStride - rowOffsets[1] * m_rowStride};
+    const Index planeOffsets[2] = {patchOffsets[0] - colOffsets[0] * m_colStride - rowOffsets[0] * m_rowStride,
+                                   patchOffsets[1] - colOffsets[1] * m_colStride - rowOffsets[1] * m_rowStride};
     eigen_assert(planeOffsets[0] <= planeOffsets[1]);
-    const Index inputPlanes[2] = {
-      planeIndex * m_plane_strides + planeOffsets[0] - m_planePaddingTop,
-      planeIndex * m_plane_strides + planeOffsets[1] - m_planePaddingTop};
+    const Index inputPlanes[2] = {planeIndex * m_plane_strides + planeOffsets[0] - m_planePaddingTop,
+                                  planeIndex * m_plane_strides + planeOffsets[1] - m_planePaddingTop};
 
     if (inputPlanes[1] < 0 || inputPlanes[0] >= m_inputPlanes) {
       return internal::pset1<PacketReturnType>(Scalar(m_paddingValue));
@@ -496,22 +491,17 @@
       // no padding
       const int depth_index = static_cast<int>(Layout) == static_cast<int>(ColMajor) ? 0 : NumDims - 1;
       const Index depth = index - (index / m_fastOutputDepth) * m_dimensions[depth_index];
-      const Index inputIndex = depth +
-          inputRows[0] * m_rowInputStride +
-          inputCols[0] * m_colInputStride +
-          m_planeInputStride * inputPlanes[0] +
-          otherIndex * m_otherInputStride;
+      const Index inputIndex = depth + inputRows[0] * m_rowInputStride + inputCols[0] * m_colInputStride +
+                               m_planeInputStride * inputPlanes[0] + otherIndex * m_otherInputStride;
       return m_impl.template packet<Unaligned>(inputIndex);
     }
 
     return packetWithPossibleZero(index);
   }
 
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost
-  costPerCoeff(bool vectorized) const {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const {
     const double compute_cost =
-        10 * TensorOpCost::DivCost<Index>() + 21 * TensorOpCost::MulCost<Index>() +
-        8 * TensorOpCost::AddCost<Index>();
+        10 * TensorOpCost::DivCost<Index>() + 21 * TensorOpCost::MulCost<Index>() + 8 * TensorOpCost::AddCost<Index>();
     return TensorOpCost(0, 0, compute_cost, vectorized, PacketSize);
   }
 
@@ -519,7 +509,6 @@
 
   const TensorEvaluator<ArgType, Device>& impl() const { return m_impl; }
 
-
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index planePaddingTop() const { return m_planePaddingTop; }
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index rowPaddingTop() const { return m_rowPaddingTop; }
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index colPaddingLeft() const { return m_colPaddingLeft; }
@@ -537,12 +526,11 @@
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index colInflateStride() const { return m_col_inflate_strides; }
 
  protected:
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packetWithPossibleZero(Index index) const
-  {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packetWithPossibleZero(Index index) const {
     EIGEN_ALIGN_MAX std::remove_const_t<CoeffReturnType> values[PacketSize];
     EIGEN_UNROLL_LOOP
     for (int i = 0; i < PacketSize; ++i) {
-      values[i] = coeff(index+i);
+      values[i] = coeff(index + i);
     }
     PacketReturnType rslt = internal::pload<PacketReturnType>(values);
     return rslt;
@@ -615,11 +603,8 @@
   Scalar m_paddingValue;
 
   TensorEvaluator<ArgType, Device> m_impl;
-
-
 };
 
+}  // end namespace Eigen
 
-} // end namespace Eigen
-
-#endif // EIGEN_CXX11_TENSOR_TENSOR_VOLUME_PATCH_H
+#endif  // EIGEN_CXX11_TENSOR_TENSOR_VOLUME_PATCH_H
diff --git a/unsupported/Eigen/CXX11/src/TensorSymmetry/DynamicSymmetry.h b/unsupported/Eigen/CXX11/src/TensorSymmetry/DynamicSymmetry.h
index 6f07e1c..51c0ad6 100644
--- a/unsupported/Eigen/CXX11/src/TensorSymmetry/DynamicSymmetry.h
+++ b/unsupported/Eigen/CXX11/src/TensorSymmetry/DynamicSymmetry.h
@@ -15,172 +15,179 @@
 
 namespace Eigen {
 
-class DynamicSGroup
-{
-  public:
-    inline explicit DynamicSGroup() : m_numIndices(1), m_elements(), m_generators(), m_globalFlags(0) { m_elements.push_back(ge(Generator(0, 0, 0))); }
-    inline DynamicSGroup(const DynamicSGroup& o) : m_numIndices(o.m_numIndices), m_elements(o.m_elements), m_generators(o.m_generators), m_globalFlags(o.m_globalFlags) { }
-    inline DynamicSGroup(DynamicSGroup&& o) : m_numIndices(o.m_numIndices), m_elements(), m_generators(o.m_generators), m_globalFlags(o.m_globalFlags) { std::swap(m_elements, o.m_elements); }
-    inline DynamicSGroup& operator=(const DynamicSGroup& o) { m_numIndices = o.m_numIndices; m_elements = o.m_elements; m_generators = o.m_generators; m_globalFlags = o.m_globalFlags; return *this; }
-    inline DynamicSGroup& operator=(DynamicSGroup&& o) { m_numIndices = o.m_numIndices; std::swap(m_elements, o.m_elements); m_generators = o.m_generators; m_globalFlags = o.m_globalFlags; return *this; }
+class DynamicSGroup {
+ public:
+  inline explicit DynamicSGroup() : m_numIndices(1), m_elements(), m_generators(), m_globalFlags(0) {
+    m_elements.push_back(ge(Generator(0, 0, 0)));
+  }
+  inline DynamicSGroup(const DynamicSGroup& o)
+      : m_numIndices(o.m_numIndices),
+        m_elements(o.m_elements),
+        m_generators(o.m_generators),
+        m_globalFlags(o.m_globalFlags) {}
+  inline DynamicSGroup(DynamicSGroup&& o)
+      : m_numIndices(o.m_numIndices), m_elements(), m_generators(o.m_generators), m_globalFlags(o.m_globalFlags) {
+    std::swap(m_elements, o.m_elements);
+  }
+  inline DynamicSGroup& operator=(const DynamicSGroup& o) {
+    m_numIndices = o.m_numIndices;
+    m_elements = o.m_elements;
+    m_generators = o.m_generators;
+    m_globalFlags = o.m_globalFlags;
+    return *this;
+  }
+  inline DynamicSGroup& operator=(DynamicSGroup&& o) {
+    m_numIndices = o.m_numIndices;
+    std::swap(m_elements, o.m_elements);
+    m_generators = o.m_generators;
+    m_globalFlags = o.m_globalFlags;
+    return *this;
+  }
 
-    void add(int one, int two, int flags = 0);
+  void add(int one, int two, int flags = 0);
 
-    template<typename Gen_>
-    inline void add(Gen_) { add(Gen_::One, Gen_::Two, Gen_::Flags); }
-    inline void addSymmetry(int one, int two) { add(one, two, 0); }
-    inline void addAntiSymmetry(int one, int two) { add(one, two, NegationFlag); }
-    inline void addHermiticity(int one, int two) { add(one, two, ConjugationFlag); }
-    inline void addAntiHermiticity(int one, int two) { add(one, two, NegationFlag | ConjugationFlag); }
+  template <typename Gen_>
+  inline void add(Gen_) {
+    add(Gen_::One, Gen_::Two, Gen_::Flags);
+  }
+  inline void addSymmetry(int one, int two) { add(one, two, 0); }
+  inline void addAntiSymmetry(int one, int two) { add(one, two, NegationFlag); }
+  inline void addHermiticity(int one, int two) { add(one, two, ConjugationFlag); }
+  inline void addAntiHermiticity(int one, int two) { add(one, two, NegationFlag | ConjugationFlag); }
 
-    template<typename Op, typename RV, typename Index, std::size_t N, typename... Args>
-    inline RV apply(const std::array<Index, N>& idx, RV initial, Args&&... args) const
-    {
-      eigen_assert(N >= m_numIndices && "Can only apply symmetry group to objects that have at least the required amount of indices.");
-      for (std::size_t i = 0; i < size(); i++)
-        initial = Op::run(h_permute(i, idx, typename internal::gen_numeric_list<int, N>::type()), m_elements[i].flags, initial, std::forward<Args>(args)...);
-      return initial;
+  template <typename Op, typename RV, typename Index, std::size_t N, typename... Args>
+  inline RV apply(const std::array<Index, N>& idx, RV initial, Args&&... args) const {
+    eigen_assert(N >= m_numIndices &&
+                 "Can only apply symmetry group to objects that have at least the required amount of indices.");
+    for (std::size_t i = 0; i < size(); i++)
+      initial = Op::run(h_permute(i, idx, typename internal::gen_numeric_list<int, N>::type()), m_elements[i].flags,
+                        initial, std::forward<Args>(args)...);
+    return initial;
+  }
+
+  template <typename Op, typename RV, typename Index, typename... Args>
+  inline RV apply(const std::vector<Index>& idx, RV initial, Args&&... args) const {
+    eigen_assert(idx.size() >= m_numIndices &&
+                 "Can only apply symmetry group to objects that have at least the required amount of indices.");
+    for (std::size_t i = 0; i < size(); i++)
+      initial = Op::run(h_permute(i, idx), m_elements[i].flags, initial, std::forward<Args>(args)...);
+    return initial;
+  }
+
+  inline int globalFlags() const { return m_globalFlags; }
+  inline std::size_t size() const { return m_elements.size(); }
+
+  template <typename Tensor_, typename... IndexTypes>
+  inline internal::tensor_symmetry_value_setter<Tensor_, DynamicSGroup> operator()(Tensor_& tensor,
+                                                                                   typename Tensor_::Index firstIndex,
+                                                                                   IndexTypes... otherIndices) const {
+    static_assert(sizeof...(otherIndices) + 1 == Tensor_::NumIndices,
+                  "Number of indices used to access a tensor coefficient must be equal to the rank of the tensor.");
+    return operator()(tensor, std::array<typename Tensor_::Index, Tensor_::NumIndices>{{firstIndex, otherIndices...}});
+  }
+
+  template <typename Tensor_>
+  inline internal::tensor_symmetry_value_setter<Tensor_, DynamicSGroup> operator()(
+      Tensor_& tensor, std::array<typename Tensor_::Index, Tensor_::NumIndices> const& indices) const {
+    return internal::tensor_symmetry_value_setter<Tensor_, DynamicSGroup>(tensor, *this, indices);
+  }
+
+ private:
+  struct GroupElement {
+    std::vector<int> representation;
+    int flags;
+    bool isId() const {
+      for (std::size_t i = 0; i < representation.size(); i++)
+        if (i != (size_t)representation[i]) return false;
+      return true;
     }
+  };
+  struct Generator {
+    int one;
+    int two;
+    int flags;
+    constexpr inline Generator(int one_, int two_, int flags_) : one(one_), two(two_), flags(flags_) {}
+  };
 
-    template<typename Op, typename RV, typename Index, typename... Args>
-    inline RV apply(const std::vector<Index>& idx, RV initial, Args&&... args) const
-    {
-      eigen_assert(idx.size() >= m_numIndices && "Can only apply symmetry group to objects that have at least the required amount of indices.");
-      for (std::size_t i = 0; i < size(); i++)
-        initial = Op::run(h_permute(i, idx), m_elements[i].flags, initial, std::forward<Args>(args)...);
-      return initial;
+  std::size_t m_numIndices;
+  std::vector<GroupElement> m_elements;
+  std::vector<Generator> m_generators;
+  int m_globalFlags;
+
+  template <typename Index, std::size_t N, int... n>
+  inline std::array<Index, N> h_permute(std::size_t which, const std::array<Index, N>& idx,
+                                        internal::numeric_list<int, n...>) const {
+    return std::array<Index, N>{{idx[n >= m_numIndices ? n : m_elements[which].representation[n]]...}};
+  }
+
+  template <typename Index>
+  inline std::vector<Index> h_permute(std::size_t which, std::vector<Index> idx) const {
+    std::vector<Index> result;
+    result.reserve(idx.size());
+    for (auto k : m_elements[which].representation) result.push_back(idx[k]);
+    for (std::size_t i = m_numIndices; i < idx.size(); i++) result.push_back(idx[i]);
+    return result;
+  }
+
+  inline GroupElement ge(Generator const& g) const {
+    GroupElement result;
+    result.representation.reserve(m_numIndices);
+    result.flags = g.flags;
+    for (std::size_t k = 0; k < m_numIndices; k++) {
+      if (k == (std::size_t)g.one)
+        result.representation.push_back(g.two);
+      else if (k == (std::size_t)g.two)
+        result.representation.push_back(g.one);
+      else
+        result.representation.push_back(int(k));
     }
+    return result;
+  }
 
-    inline int globalFlags() const { return m_globalFlags; }
-    inline std::size_t size() const { return m_elements.size(); }
+  GroupElement mul(GroupElement, GroupElement) const;
+  inline GroupElement mul(Generator g1, GroupElement g2) const { return mul(ge(g1), g2); }
 
-    template<typename Tensor_, typename... IndexTypes>
-    inline internal::tensor_symmetry_value_setter<Tensor_, DynamicSGroup> operator()(Tensor_& tensor, typename Tensor_::Index firstIndex, IndexTypes... otherIndices) const
-    {
-      static_assert(sizeof...(otherIndices) + 1 == Tensor_::NumIndices, "Number of indices used to access a tensor coefficient must be equal to the rank of the tensor.");
-      return operator()(tensor, std::array<typename Tensor_::Index, Tensor_::NumIndices>{{firstIndex, otherIndices...}});
+  inline GroupElement mul(GroupElement g1, Generator g2) const { return mul(g1, ge(g2)); }
+
+  inline GroupElement mul(Generator g1, Generator g2) const { return mul(ge(g1), ge(g2)); }
+
+  inline int findElement(GroupElement e) const {
+    for (auto ee : m_elements) {
+      if (ee.representation == e.representation) return ee.flags ^ e.flags;
     }
+    return -1;
+  }
 
-    template<typename Tensor_>
-    inline internal::tensor_symmetry_value_setter<Tensor_, DynamicSGroup> operator()(Tensor_& tensor, std::array<typename Tensor_::Index, Tensor_::NumIndices> const& indices) const
-    {
-      return internal::tensor_symmetry_value_setter<Tensor_, DynamicSGroup>(tensor, *this, indices);
-    }
-  private:
-    struct GroupElement {
-      std::vector<int> representation;
-      int flags;
-      bool isId() const
-      {
-        for (std::size_t i = 0; i < representation.size(); i++)
-          if (i != (size_t)representation[i])
-            return false;
-        return true;
-      }
-    };
-    struct Generator {
-      int one;
-      int two;
-      int flags;
-      constexpr inline Generator(int one_, int two_, int flags_) : one(one_), two(two_), flags(flags_) {}
-    };
-
-    std::size_t m_numIndices;
-    std::vector<GroupElement> m_elements;
-    std::vector<Generator> m_generators;
-    int m_globalFlags;
-
-    template<typename Index, std::size_t N, int... n>
-    inline std::array<Index, N> h_permute(std::size_t which, const std::array<Index, N>& idx, internal::numeric_list<int, n...>) const
-    {
-      return std::array<Index, N>{{ idx[n >= m_numIndices ? n : m_elements[which].representation[n]]... }};
-    }
-
-    template<typename Index>
-    inline std::vector<Index> h_permute(std::size_t which, std::vector<Index> idx) const
-    {
-      std::vector<Index> result;
-      result.reserve(idx.size());
-      for (auto k : m_elements[which].representation)
-        result.push_back(idx[k]);
-      for (std::size_t i = m_numIndices; i < idx.size(); i++)
-        result.push_back(idx[i]);
-      return result;
-    }
-
-    inline GroupElement ge(Generator const& g) const
-    {
-      GroupElement result;
-      result.representation.reserve(m_numIndices);
-      result.flags = g.flags;
-      for (std::size_t k = 0; k < m_numIndices; k++) {
-        if (k == (std::size_t)g.one)
-          result.representation.push_back(g.two);
-        else if (k == (std::size_t)g.two)
-          result.representation.push_back(g.one);
-        else
-          result.representation.push_back(int(k));
-      }
-      return result;
-    }
-
-    GroupElement mul(GroupElement, GroupElement) const;
-    inline GroupElement mul(Generator g1, GroupElement g2) const
-    {
-      return mul(ge(g1), g2);
-    }
-
-    inline GroupElement mul(GroupElement g1, Generator g2) const
-    {
-      return mul(g1, ge(g2));
-    }
-
-    inline GroupElement mul(Generator g1, Generator g2) const
-    {
-      return mul(ge(g1), ge(g2));
-    }
-
-    inline int findElement(GroupElement e) const
-    {
-      for (auto ee : m_elements) {
-        if (ee.representation == e.representation)
-          return ee.flags ^ e.flags;
-      }
-      return -1;
-    }
-
-    void updateGlobalFlags(int flagDiffOfSameGenerator);
+  void updateGlobalFlags(int flagDiffOfSameGenerator);
 };
 
 // dynamic symmetry group that auto-adds the template parameters in the constructor
-template<typename... Gen>
-class DynamicSGroupFromTemplateArgs : public DynamicSGroup
-{
-  public:
-    inline DynamicSGroupFromTemplateArgs() : DynamicSGroup()
-    {
-      add_all(internal::type_list<Gen...>());
-    }
-    inline DynamicSGroupFromTemplateArgs(DynamicSGroupFromTemplateArgs const& other) : DynamicSGroup(other) { }
-    inline DynamicSGroupFromTemplateArgs(DynamicSGroupFromTemplateArgs&& other) : DynamicSGroup(other) { }
-    inline DynamicSGroupFromTemplateArgs<Gen...>& operator=(const DynamicSGroupFromTemplateArgs<Gen...>& o) { DynamicSGroup::operator=(o); return *this; }
-    inline DynamicSGroupFromTemplateArgs<Gen...>& operator=(DynamicSGroupFromTemplateArgs<Gen...>&& o) { DynamicSGroup::operator=(o); return *this; }
-  
-  private:
-    template<typename Gen1, typename... GenNext>
-    inline void add_all(internal::type_list<Gen1, GenNext...>)
-    {
-      add(Gen1());
-      add_all(internal::type_list<GenNext...>());
-    }
+template <typename... Gen>
+class DynamicSGroupFromTemplateArgs : public DynamicSGroup {
+ public:
+  inline DynamicSGroupFromTemplateArgs() : DynamicSGroup() { add_all(internal::type_list<Gen...>()); }
+  inline DynamicSGroupFromTemplateArgs(DynamicSGroupFromTemplateArgs const& other) : DynamicSGroup(other) {}
+  inline DynamicSGroupFromTemplateArgs(DynamicSGroupFromTemplateArgs&& other) : DynamicSGroup(other) {}
+  inline DynamicSGroupFromTemplateArgs<Gen...>& operator=(const DynamicSGroupFromTemplateArgs<Gen...>& o) {
+    DynamicSGroup::operator=(o);
+    return *this;
+  }
+  inline DynamicSGroupFromTemplateArgs<Gen...>& operator=(DynamicSGroupFromTemplateArgs<Gen...>&& o) {
+    DynamicSGroup::operator=(o);
+    return *this;
+  }
 
-    inline void add_all(internal::type_list<>)
-    {
-    }
+ private:
+  template <typename Gen1, typename... GenNext>
+  inline void add_all(internal::type_list<Gen1, GenNext...>) {
+    add(Gen1());
+    add_all(internal::type_list<GenNext...>());
+  }
+
+  inline void add_all(internal::type_list<>) {}
 };
 
-inline DynamicSGroup::GroupElement DynamicSGroup::mul(GroupElement g1, GroupElement g2) const
-{
+inline DynamicSGroup::GroupElement DynamicSGroup::mul(GroupElement g1, GroupElement g2) const {
   eigen_internal_assert(g1.representation.size() == m_numIndices);
   eigen_internal_assert(g2.representation.size() == m_numIndices);
 
@@ -195,8 +202,7 @@
   return result;
 }
 
-inline void DynamicSGroup::add(int one, int two, int flags)
-{
+inline void DynamicSGroup::add(int one, int two, int flags) {
   eigen_assert(one >= 0);
   eigen_assert(two >= 0);
   eigen_assert(one != two);
@@ -205,8 +211,7 @@
     std::size_t newNumIndices = (one > two) ? one : two + 1;
     for (auto& gelem : m_elements) {
       gelem.representation.reserve(newNumIndices);
-      for (std::size_t i = m_numIndices; i < newNumIndices; i++)
-        gelem.representation.push_back(i);
+      for (std::size_t i = m_numIndices; i < newNumIndices; i++) gelem.representation.push_back(i);
     }
     m_numIndices = newNumIndices;
   }
@@ -221,12 +226,10 @@
       e = mul(e, g);
     }
 
-    if (e.flags > 0)
-      updateGlobalFlags(e.flags);
+    if (e.flags > 0) updateGlobalFlags(e.flags);
 
     // only add in case we didn't have identity
-    if (m_elements.size() > 1)
-      m_generators.push_back(g);
+    if (m_elements.size() > 1) m_generators.push_back(g);
     return;
   }
 
@@ -238,8 +241,7 @@
 
   std::size_t coset_order = m_elements.size();
   m_elements.push_back(e);
-  for (std::size_t i = 1; i < coset_order; i++)
-    m_elements.push_back(mul(m_elements[i], e));
+  for (std::size_t i = 1; i < coset_order; i++) m_elements.push_back(mul(m_elements[i], e));
   m_generators.push_back(g);
 
   std::size_t coset_rep = coset_order;
@@ -250,8 +252,7 @@
       if (p < 0) {
         // element not yet in group
         m_elements.push_back(e);
-        for (std::size_t i = 1; i < coset_order; i++)
-          m_elements.push_back(mul(m_elements[i], e));
+        for (std::size_t i = 1; i < coset_order; i++) m_elements.push_back(mul(m_elements[i], e));
       } else if (p > 0) {
         updateGlobalFlags(p);
       }
@@ -260,36 +261,35 @@
   } while (coset_rep < m_elements.size());
 }
 
-inline void DynamicSGroup::updateGlobalFlags(int flagDiffOfSameGenerator)
-{
-    switch (flagDiffOfSameGenerator) {
-      case 0:
-      default:
-        // nothing happened
-        break;
-      case NegationFlag:
-        // every element is it's own negative => whole tensor is zero
-        m_globalFlags |= GlobalZeroFlag;
-        break;
-      case ConjugationFlag:
-        // every element is it's own conjugate => whole tensor is real
-        m_globalFlags |= GlobalRealFlag;
-        break;
-      case (NegationFlag | ConjugationFlag):
-        // every element is it's own negative conjugate => whole tensor is imaginary
-        m_globalFlags |= GlobalImagFlag;
-        break;
+inline void DynamicSGroup::updateGlobalFlags(int flagDiffOfSameGenerator) {
+  switch (flagDiffOfSameGenerator) {
+    case 0:
+    default:
+      // nothing happened
+      break;
+    case NegationFlag:
+      // every element is it's own negative => whole tensor is zero
+      m_globalFlags |= GlobalZeroFlag;
+      break;
+    case ConjugationFlag:
+      // every element is it's own conjugate => whole tensor is real
+      m_globalFlags |= GlobalRealFlag;
+      break;
+    case (NegationFlag | ConjugationFlag):
+      // every element is it's own negative conjugate => whole tensor is imaginary
+      m_globalFlags |= GlobalImagFlag;
+      break;
       /* NOTE:
        *   since GlobalZeroFlag == GlobalRealFlag | GlobalImagFlag, if one generator
        *   causes the tensor to be real and the next one to be imaginary, this will
        *   trivially give the correct result
        */
-    }
+  }
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_CXX11_TENSORSYMMETRY_DYNAMICSYMMETRY_H
+#endif  // EIGEN_CXX11_TENSORSYMMETRY_DYNAMICSYMMETRY_H
 
 /*
  * kate: space-indent on; indent-width 2; mixedindent off; indent-mode cstyle;
diff --git a/unsupported/Eigen/CXX11/src/TensorSymmetry/InternalHeaderCheck.h b/unsupported/Eigen/CXX11/src/TensorSymmetry/InternalHeaderCheck.h
index b0affe6..b1b2e14 100644
--- a/unsupported/Eigen/CXX11/src/TensorSymmetry/InternalHeaderCheck.h
+++ b/unsupported/Eigen/CXX11/src/TensorSymmetry/InternalHeaderCheck.h
@@ -1,3 +1,4 @@
 #ifndef EIGEN_CXX11_TENSORSYMMETRY_MODULE_H
-#error "Please include unsupported/Eigen/CXX11/TensorSymmetry instead of including headers inside the src directory directly."
+#error \
+    "Please include unsupported/Eigen/CXX11/TensorSymmetry instead of including headers inside the src directory directly."
 #endif
diff --git a/unsupported/Eigen/CXX11/src/TensorSymmetry/StaticSymmetry.h b/unsupported/Eigen/CXX11/src/TensorSymmetry/StaticSymmetry.h
index b06b700..3f9bb51 100644
--- a/unsupported/Eigen/CXX11/src/TensorSymmetry/StaticSymmetry.h
+++ b/unsupported/Eigen/CXX11/src/TensorSymmetry/StaticSymmetry.h
@@ -17,222 +17,206 @@
 
 namespace internal {
 
-template<typename list> struct tensor_static_symgroup_permutate;
+template <typename list>
+struct tensor_static_symgroup_permutate;
 
-template<int... nn>
-struct tensor_static_symgroup_permutate<numeric_list<int, nn...>>
-{
+template <int... nn>
+struct tensor_static_symgroup_permutate<numeric_list<int, nn...>> {
   constexpr static std::size_t N = sizeof...(nn);
 
-  template<typename T>
-  constexpr static inline std::array<T, N> run(const std::array<T, N>& indices)
-  {
+  template <typename T>
+  constexpr static inline std::array<T, N> run(const std::array<T, N>& indices) {
     return {{indices[nn]...}};
   }
 };
 
-template<typename indices_, int flags_>
-struct tensor_static_symgroup_element
-{
+template <typename indices_, int flags_>
+struct tensor_static_symgroup_element {
   typedef indices_ indices;
   constexpr static int flags = flags_;
 };
 
-template<typename Gen, int N>
-struct tensor_static_symgroup_element_ctor
-{
-  typedef tensor_static_symgroup_element<
-    typename gen_numeric_list_swapped_pair<int, N, Gen::One, Gen::Two>::type,
-    Gen::Flags
-  > type;
+template <typename Gen, int N>
+struct tensor_static_symgroup_element_ctor {
+  typedef tensor_static_symgroup_element<typename gen_numeric_list_swapped_pair<int, N, Gen::One, Gen::Two>::type,
+                                         Gen::Flags>
+      type;
 };
 
-template<int N>
-struct tensor_static_symgroup_identity_ctor
-{
-  typedef tensor_static_symgroup_element<
-    typename gen_numeric_list<int, N>::type,
-    0
-  > type;
+template <int N>
+struct tensor_static_symgroup_identity_ctor {
+  typedef tensor_static_symgroup_element<typename gen_numeric_list<int, N>::type, 0> type;
 };
 
-template<typename iib>
-struct tensor_static_symgroup_multiply_helper
-{
-  template<int... iia>
+template <typename iib>
+struct tensor_static_symgroup_multiply_helper {
+  template <int... iia>
   constexpr static inline numeric_list<int, get<iia, iib>::value...> helper(numeric_list<int, iia...>) {
     return numeric_list<int, get<iia, iib>::value...>();
   }
 };
 
-template<typename A, typename B>
-struct tensor_static_symgroup_multiply
-{
-  private:
-    typedef typename A::indices iia;
-    typedef typename B::indices iib;
-    constexpr static int ffa = A::flags;
-    constexpr static int ffb = B::flags;
-  
-  public:
-    static_assert(iia::count == iib::count, "Cannot multiply symmetry elements with different number of indices.");
+template <typename A, typename B>
+struct tensor_static_symgroup_multiply {
+ private:
+  typedef typename A::indices iia;
+  typedef typename B::indices iib;
+  constexpr static int ffa = A::flags;
+  constexpr static int ffb = B::flags;
 
-    typedef tensor_static_symgroup_element<
-      decltype(tensor_static_symgroup_multiply_helper<iib>::helper(iia())),
-      ffa ^ ffb
-    > type;
+ public:
+  static_assert(iia::count == iib::count, "Cannot multiply symmetry elements with different number of indices.");
+
+  typedef tensor_static_symgroup_element<decltype(tensor_static_symgroup_multiply_helper<iib>::helper(iia())),
+                                         ffa ^ ffb>
+      type;
 };
 
-template<typename A, typename B>
-struct tensor_static_symgroup_equality
-{
-    typedef typename A::indices iia;
-    typedef typename B::indices iib;
-    constexpr static int ffa = A::flags;
-    constexpr static int ffb = B::flags;
-    static_assert(iia::count == iib::count, "Cannot compare symmetry elements with different number of indices.");
+template <typename A, typename B>
+struct tensor_static_symgroup_equality {
+  typedef typename A::indices iia;
+  typedef typename B::indices iib;
+  constexpr static int ffa = A::flags;
+  constexpr static int ffb = B::flags;
+  static_assert(iia::count == iib::count, "Cannot compare symmetry elements with different number of indices.");
 
-    constexpr static bool value = is_same<iia, iib>::value;
+  constexpr static bool value = is_same<iia, iib>::value;
 
-  private:
-    /* this should be zero if they are identical, or else the tensor
-     * will be forced to be pure real, pure imaginary or even pure zero
-     */
-    constexpr static int flags_cmp_ = ffa ^ ffb;
+ private:
+  /* this should be zero if they are identical, or else the tensor
+   * will be forced to be pure real, pure imaginary or even pure zero
+   */
+  constexpr static int flags_cmp_ = ffa ^ ffb;
 
-    /* either they are not equal, then we don't care whether the flags
-     * match, or they are equal, and then we have to check
-     */
-    constexpr static bool is_zero      = value && flags_cmp_ == NegationFlag;
-    constexpr static bool is_real      = value && flags_cmp_ == ConjugationFlag;
-    constexpr static bool is_imag      = value && flags_cmp_ == (NegationFlag | ConjugationFlag);
+  /* either they are not equal, then we don't care whether the flags
+   * match, or they are equal, and then we have to check
+   */
+  constexpr static bool is_zero = value && flags_cmp_ == NegationFlag;
+  constexpr static bool is_real = value && flags_cmp_ == ConjugationFlag;
+  constexpr static bool is_imag = value && flags_cmp_ == (NegationFlag | ConjugationFlag);
 
-  public:
-    constexpr static int global_flags = 
-      (is_real ? GlobalRealFlag : 0) |
-      (is_imag ? GlobalImagFlag : 0) |
-      (is_zero ? GlobalZeroFlag : 0);
+ public:
+  constexpr static int global_flags =
+      (is_real ? GlobalRealFlag : 0) | (is_imag ? GlobalImagFlag : 0) | (is_zero ? GlobalZeroFlag : 0);
 };
 
-template<std::size_t NumIndices, typename... Gen>
-struct tensor_static_symgroup
-{
+template <std::size_t NumIndices, typename... Gen>
+struct tensor_static_symgroup {
   typedef StaticSGroup<Gen...> type;
   constexpr static std::size_t size = type::static_size;
 };
 
-template<typename Index, std::size_t N, int... ii, int... jj>
-constexpr static inline std::array<Index, N> tensor_static_symgroup_index_permute(std::array<Index, N> idx, internal::numeric_list<int, ii...>, internal::numeric_list<int, jj...>)
-{
-  return {{ idx[ii]..., idx[jj]... }};
+template <typename Index, std::size_t N, int... ii, int... jj>
+constexpr static inline std::array<Index, N> tensor_static_symgroup_index_permute(std::array<Index, N> idx,
+                                                                                  internal::numeric_list<int, ii...>,
+                                                                                  internal::numeric_list<int, jj...>) {
+  return {{idx[ii]..., idx[jj]...}};
 }
 
-template<typename Index, int... ii>
-static inline std::vector<Index> tensor_static_symgroup_index_permute(std::vector<Index> idx, internal::numeric_list<int, ii...>)
-{
-  std::vector<Index> result{{ idx[ii]... }};
+template <typename Index, int... ii>
+static inline std::vector<Index> tensor_static_symgroup_index_permute(std::vector<Index> idx,
+                                                                      internal::numeric_list<int, ii...>) {
+  std::vector<Index> result{{idx[ii]...}};
   std::size_t target_size = idx.size();
-  for (std::size_t i = result.size(); i < target_size; i++)
-    result.push_back(idx[i]);
+  for (std::size_t i = result.size(); i < target_size; i++) result.push_back(idx[i]);
   return result;
 }
 
-template<typename T> struct tensor_static_symgroup_do_apply;
+template <typename T>
+struct tensor_static_symgroup_do_apply;
 
-template<typename first, typename... next>
-struct tensor_static_symgroup_do_apply<internal::type_list<first, next...>>
-{
-  template<typename Op, typename RV, std::size_t SGNumIndices, typename Index, std::size_t NumIndices, typename... Args>
-  static inline RV run(const std::array<Index, NumIndices>& idx, RV initial, Args&&... args)
-  {
-    static_assert(NumIndices >= SGNumIndices, "Can only apply symmetry group to objects that have at least the required amount of indices.");
+template <typename first, typename... next>
+struct tensor_static_symgroup_do_apply<internal::type_list<first, next...>> {
+  template <typename Op, typename RV, std::size_t SGNumIndices, typename Index, std::size_t NumIndices,
+            typename... Args>
+  static inline RV run(const std::array<Index, NumIndices>& idx, RV initial, Args&&... args) {
+    static_assert(NumIndices >= SGNumIndices,
+                  "Can only apply symmetry group to objects that have at least the required amount of indices.");
     typedef typename internal::gen_numeric_list<int, NumIndices - SGNumIndices, SGNumIndices>::type remaining_indices;
-    initial = Op::run(tensor_static_symgroup_index_permute(idx, typename first::indices(), remaining_indices()), first::flags, initial, std::forward<Args>(args)...);
-    return tensor_static_symgroup_do_apply<internal::type_list<next...>>::template run<Op, RV, SGNumIndices>(idx, initial, args...);
+    initial = Op::run(tensor_static_symgroup_index_permute(idx, typename first::indices(), remaining_indices()),
+                      first::flags, initial, std::forward<Args>(args)...);
+    return tensor_static_symgroup_do_apply<internal::type_list<next...>>::template run<Op, RV, SGNumIndices>(
+        idx, initial, args...);
   }
 
-  template<typename Op, typename RV, std::size_t SGNumIndices, typename Index, typename... Args>
-  static inline RV run(const std::vector<Index>& idx, RV initial, Args&&... args)
-  {
-    eigen_assert(idx.size() >= SGNumIndices && "Can only apply symmetry group to objects that have at least the required amount of indices.");
-    initial = Op::run(tensor_static_symgroup_index_permute(idx, typename first::indices()), first::flags, initial, std::forward<Args>(args)...);
-    return tensor_static_symgroup_do_apply<internal::type_list<next...>>::template run<Op, RV, SGNumIndices>(idx, initial, args...);
+  template <typename Op, typename RV, std::size_t SGNumIndices, typename Index, typename... Args>
+  static inline RV run(const std::vector<Index>& idx, RV initial, Args&&... args) {
+    eigen_assert(idx.size() >= SGNumIndices &&
+                 "Can only apply symmetry group to objects that have at least the required amount of indices.");
+    initial = Op::run(tensor_static_symgroup_index_permute(idx, typename first::indices()), first::flags, initial,
+                      std::forward<Args>(args)...);
+    return tensor_static_symgroup_do_apply<internal::type_list<next...>>::template run<Op, RV, SGNumIndices>(
+        idx, initial, args...);
   }
 };
 
-template<EIGEN_TPL_PP_SPEC_HACK_DEF(typename, empty)>
-struct tensor_static_symgroup_do_apply<internal::type_list<EIGEN_TPL_PP_SPEC_HACK_USE(empty)>>
-{
-  template<typename Op, typename RV, std::size_t SGNumIndices, typename Index, std::size_t NumIndices, typename... Args>
-  static inline RV run(const std::array<Index, NumIndices>&, RV initial, Args&&...)
-  {
+template <EIGEN_TPL_PP_SPEC_HACK_DEF(typename, empty)>
+struct tensor_static_symgroup_do_apply<internal::type_list<EIGEN_TPL_PP_SPEC_HACK_USE(empty)>> {
+  template <typename Op, typename RV, std::size_t SGNumIndices, typename Index, std::size_t NumIndices,
+            typename... Args>
+  static inline RV run(const std::array<Index, NumIndices>&, RV initial, Args&&...) {
     // do nothing
     return initial;
   }
 
-  template<typename Op, typename RV, std::size_t SGNumIndices, typename Index, typename... Args>
-  static inline RV run(const std::vector<Index>&, RV initial, Args&&...)
-  {
+  template <typename Op, typename RV, std::size_t SGNumIndices, typename Index, typename... Args>
+  static inline RV run(const std::vector<Index>&, RV initial, Args&&...) {
     // do nothing
     return initial;
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-template<typename... Gen>
-class StaticSGroup
-{
-    constexpr static std::size_t NumIndices = internal::tensor_symmetry_num_indices<Gen...>::value;
-    typedef internal::group_theory::enumerate_group_elements<
-      internal::tensor_static_symgroup_multiply,
-      internal::tensor_static_symgroup_equality,
+template <typename... Gen>
+class StaticSGroup {
+  constexpr static std::size_t NumIndices = internal::tensor_symmetry_num_indices<Gen...>::value;
+  typedef internal::group_theory::enumerate_group_elements<
+      internal::tensor_static_symgroup_multiply, internal::tensor_static_symgroup_equality,
       typename internal::tensor_static_symgroup_identity_ctor<NumIndices>::type,
-      internal::type_list<typename internal::tensor_static_symgroup_element_ctor<Gen, NumIndices>::type...>
-    > group_elements;
-    typedef typename group_elements::type ge;
-  public:
-    constexpr inline StaticSGroup() {}
-    constexpr inline StaticSGroup(const StaticSGroup<Gen...>&) {}
-    constexpr inline StaticSGroup(StaticSGroup<Gen...>&&) {}
+      internal::type_list<typename internal::tensor_static_symgroup_element_ctor<Gen, NumIndices>::type...>>
+      group_elements;
+  typedef typename group_elements::type ge;
 
-    template<typename Op, typename RV, typename Index, std::size_t N, typename... Args>
-    static inline RV apply(const std::array<Index, N>& idx, RV initial, Args&&... args)
-    {
-      return internal::tensor_static_symgroup_do_apply<ge>::template run<Op, RV, NumIndices>(idx, initial, args...);
-    }
+ public:
+  constexpr inline StaticSGroup() {}
+  constexpr inline StaticSGroup(const StaticSGroup<Gen...>&) {}
+  constexpr inline StaticSGroup(StaticSGroup<Gen...>&&) {}
 
-    template<typename Op, typename RV, typename Index, typename... Args>
-    static inline RV apply(const std::vector<Index>& idx, RV initial, Args&&... args)
-    {
-      eigen_assert(idx.size() == NumIndices);
-      return internal::tensor_static_symgroup_do_apply<ge>::template run<Op, RV, NumIndices>(idx, initial, args...);
-    }
+  template <typename Op, typename RV, typename Index, std::size_t N, typename... Args>
+  static inline RV apply(const std::array<Index, N>& idx, RV initial, Args&&... args) {
+    return internal::tensor_static_symgroup_do_apply<ge>::template run<Op, RV, NumIndices>(idx, initial, args...);
+  }
 
-    constexpr static std::size_t static_size = ge::count;
+  template <typename Op, typename RV, typename Index, typename... Args>
+  static inline RV apply(const std::vector<Index>& idx, RV initial, Args&&... args) {
+    eigen_assert(idx.size() == NumIndices);
+    return internal::tensor_static_symgroup_do_apply<ge>::template run<Op, RV, NumIndices>(idx, initial, args...);
+  }
 
-    constexpr static inline std::size_t size() {
-      return ge::count;
-    }
-    constexpr static inline int globalFlags() { return group_elements::global_flags; }
+  constexpr static std::size_t static_size = ge::count;
 
-    template<typename Tensor_, typename... IndexTypes>
-    inline internal::tensor_symmetry_value_setter<Tensor_, StaticSGroup<Gen...>> operator()(Tensor_& tensor, typename Tensor_::Index firstIndex, IndexTypes... otherIndices) const
-    {
-      static_assert(sizeof...(otherIndices) + 1 == Tensor_::NumIndices, "Number of indices used to access a tensor coefficient must be equal to the rank of the tensor.");
-      return operator()(tensor, std::array<typename Tensor_::Index, Tensor_::NumIndices>{{firstIndex, otherIndices...}});
-    }
+  constexpr static inline std::size_t size() { return ge::count; }
+  constexpr static inline int globalFlags() { return group_elements::global_flags; }
 
-    template<typename Tensor_>
-    inline internal::tensor_symmetry_value_setter<Tensor_, StaticSGroup<Gen...>> operator()(Tensor_& tensor, std::array<typename Tensor_::Index, Tensor_::NumIndices> const& indices) const
-    {
-      return internal::tensor_symmetry_value_setter<Tensor_, StaticSGroup<Gen...>>(tensor, *this, indices);
-    }
+  template <typename Tensor_, typename... IndexTypes>
+  inline internal::tensor_symmetry_value_setter<Tensor_, StaticSGroup<Gen...>> operator()(
+      Tensor_& tensor, typename Tensor_::Index firstIndex, IndexTypes... otherIndices) const {
+    static_assert(sizeof...(otherIndices) + 1 == Tensor_::NumIndices,
+                  "Number of indices used to access a tensor coefficient must be equal to the rank of the tensor.");
+    return operator()(tensor, std::array<typename Tensor_::Index, Tensor_::NumIndices>{{firstIndex, otherIndices...}});
+  }
+
+  template <typename Tensor_>
+  inline internal::tensor_symmetry_value_setter<Tensor_, StaticSGroup<Gen...>> operator()(
+      Tensor_& tensor, std::array<typename Tensor_::Index, Tensor_::NumIndices> const& indices) const {
+    return internal::tensor_symmetry_value_setter<Tensor_, StaticSGroup<Gen...>>(tensor, *this, indices);
+  }
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_CXX11_TENSORSYMMETRY_STATICSYMMETRY_H
+#endif  // EIGEN_CXX11_TENSORSYMMETRY_STATICSYMMETRY_H
 
 /*
  * kate: space-indent on; indent-width 2; mixedindent off; indent-mode cstyle;
diff --git a/unsupported/Eigen/CXX11/src/TensorSymmetry/Symmetry.h b/unsupported/Eigen/CXX11/src/TensorSymmetry/Symmetry.h
index b06101f..2d3ff46 100644
--- a/unsupported/Eigen/CXX11/src/TensorSymmetry/Symmetry.h
+++ b/unsupported/Eigen/CXX11/src/TensorSymmetry/Symmetry.h
@@ -15,58 +15,53 @@
 
 namespace Eigen {
 
-enum {
-  NegationFlag           = 0x01,
-  ConjugationFlag        = 0x02
-};
+enum { NegationFlag = 0x01, ConjugationFlag = 0x02 };
 
-enum {
-  GlobalRealFlag         = 0x01,
-  GlobalImagFlag         = 0x02,
-  GlobalZeroFlag         = 0x03
-};
+enum { GlobalRealFlag = 0x01, GlobalImagFlag = 0x02, GlobalZeroFlag = 0x03 };
 
 namespace internal {
 
-template<std::size_t NumIndices, typename... Sym>                   struct tensor_symmetry_pre_analysis;
-template<std::size_t NumIndices, typename... Sym>                   struct tensor_static_symgroup;
-template<bool instantiate, std::size_t NumIndices, typename... Sym> struct tensor_static_symgroup_if;
-template<typename Tensor_> struct tensor_symmetry_calculate_flags;
-template<typename Tensor_> struct tensor_symmetry_assign_value;
-template<typename... Sym> struct tensor_symmetry_num_indices;
+template <std::size_t NumIndices, typename... Sym>
+struct tensor_symmetry_pre_analysis;
+template <std::size_t NumIndices, typename... Sym>
+struct tensor_static_symgroup;
+template <bool instantiate, std::size_t NumIndices, typename... Sym>
+struct tensor_static_symgroup_if;
+template <typename Tensor_>
+struct tensor_symmetry_calculate_flags;
+template <typename Tensor_>
+struct tensor_symmetry_assign_value;
+template <typename... Sym>
+struct tensor_symmetry_num_indices;
 
-} // end namespace internal
+}  // end namespace internal
 
-template<int One_, int Two_>
-struct Symmetry
-{
+template <int One_, int Two_>
+struct Symmetry {
   static_assert(One_ != Two_, "Symmetries must cover distinct indices.");
   constexpr static int One = One_;
   constexpr static int Two = Two_;
   constexpr static int Flags = 0;
 };
 
-template<int One_, int Two_>
-struct AntiSymmetry
-{
+template <int One_, int Two_>
+struct AntiSymmetry {
   static_assert(One_ != Two_, "Symmetries must cover distinct indices.");
   constexpr static int One = One_;
   constexpr static int Two = Two_;
   constexpr static int Flags = NegationFlag;
 };
 
-template<int One_, int Two_>
-struct Hermiticity
-{
+template <int One_, int Two_>
+struct Hermiticity {
   static_assert(One_ != Two_, "Symmetries must cover distinct indices.");
   constexpr static int One = One_;
   constexpr static int Two = Two_;
   constexpr static int Flags = ConjugationFlag;
 };
 
-template<int One_, int Two_>
-struct AntiHermiticity
-{
+template <int One_, int Two_>
+struct AntiHermiticity {
   static_assert(One_ != Two_, "Symmetries must cover distinct indices.");
   constexpr static int One = One_;
   constexpr static int Two = Two_;
@@ -74,267 +69,266 @@
 };
 
 /** \class DynamicSGroup
-  * \ingroup TensorSymmetry_Module
-  *
-  * \brief Dynamic symmetry group
-  *
-  * The %DynamicSGroup class represents a symmetry group that need not be known at
-  * compile time. It is useful if one wants to support arbitrary run-time defineable
-  * symmetries for tensors, but it is also instantiated if a symmetry group is defined
-  * at compile time that would be either too large for the compiler to reasonably
-  * generate (using templates to calculate this at compile time is very inefficient)
-  * or that the compiler could generate the group but that it wouldn't make sense to
-  * unroll the loop for setting coefficients anymore.
-  */
+ * \ingroup TensorSymmetry_Module
+ *
+ * \brief Dynamic symmetry group
+ *
+ * The %DynamicSGroup class represents a symmetry group that need not be known at
+ * compile time. It is useful if one wants to support arbitrary run-time defineable
+ * symmetries for tensors, but it is also instantiated if a symmetry group is defined
+ * at compile time that would be either too large for the compiler to reasonably
+ * generate (using templates to calculate this at compile time is very inefficient)
+ * or that the compiler could generate the group but that it wouldn't make sense to
+ * unroll the loop for setting coefficients anymore.
+ */
 class DynamicSGroup;
 
 /** \internal
-  *
-  * \class DynamicSGroupFromTemplateArgs
-  * \ingroup TensorSymmetry_Module
-  *
-  * \brief Dynamic symmetry group, initialized from template arguments
-  *
-  * This class is a child class of DynamicSGroup. It uses the template arguments
-  * specified to initialize itself.
-  */
-template<typename... Gen>
+ *
+ * \class DynamicSGroupFromTemplateArgs
+ * \ingroup TensorSymmetry_Module
+ *
+ * \brief Dynamic symmetry group, initialized from template arguments
+ *
+ * This class is a child class of DynamicSGroup. It uses the template arguments
+ * specified to initialize itself.
+ */
+template <typename... Gen>
 class DynamicSGroupFromTemplateArgs;
 
 /** \class StaticSGroup
-  * \ingroup TensorSymmetry_Module
-  *
-  * \brief Static symmetry group
-  *
-  * This class represents a symmetry group that is known and resolved completely
-  * at compile time. Ideally, no run-time penalty is incurred compared to the
-  * manual unrolling of the symmetry.
-  *
-  * <b><i>CAUTION:</i></b>
-  *
-  * Do not use this class directly for large symmetry groups. The compiler
-  * may run into a limit, or segfault or in the very least will take a very,
-  * very, very long time to compile the code. Use the SGroup class instead
-  * if you want a static group. That class contains logic that will
-  * automatically select the DynamicSGroup class instead if the symmetry
-  * group becomes too large. (In that case, unrolling may not even be
-  * beneficial.)
-  */
-template<typename... Gen>
+ * \ingroup TensorSymmetry_Module
+ *
+ * \brief Static symmetry group
+ *
+ * This class represents a symmetry group that is known and resolved completely
+ * at compile time. Ideally, no run-time penalty is incurred compared to the
+ * manual unrolling of the symmetry.
+ *
+ * <b><i>CAUTION:</i></b>
+ *
+ * Do not use this class directly for large symmetry groups. The compiler
+ * may run into a limit, or segfault or in the very least will take a very,
+ * very, very long time to compile the code. Use the SGroup class instead
+ * if you want a static group. That class contains logic that will
+ * automatically select the DynamicSGroup class instead if the symmetry
+ * group becomes too large. (In that case, unrolling may not even be
+ * beneficial.)
+ */
+template <typename... Gen>
 class StaticSGroup;
 
 /** \class SGroup
-  * \ingroup TensorSymmetry_Module
-  *
-  * \brief Symmetry group, initialized from template arguments
-  *
-  * This class represents a symmetry group whose generators are already
-  * known at compile time. It may or may not be resolved at compile time,
-  * depending on the estimated size of the group.
-  *
-  * \sa StaticSGroup
-  * \sa DynamicSGroup
-  */
-template<typename... Gen>
-class SGroup : public internal::tensor_symmetry_pre_analysis<internal::tensor_symmetry_num_indices<Gen...>::value, Gen...>::root_type
-{
-  public:
-    constexpr static std::size_t NumIndices = internal::tensor_symmetry_num_indices<Gen...>::value;
-    typedef typename internal::tensor_symmetry_pre_analysis<NumIndices, Gen...>::root_type Base;
+ * \ingroup TensorSymmetry_Module
+ *
+ * \brief Symmetry group, initialized from template arguments
+ *
+ * This class represents a symmetry group whose generators are already
+ * known at compile time. It may or may not be resolved at compile time,
+ * depending on the estimated size of the group.
+ *
+ * \sa StaticSGroup
+ * \sa DynamicSGroup
+ */
+template <typename... Gen>
+class SGroup : public internal::tensor_symmetry_pre_analysis<internal::tensor_symmetry_num_indices<Gen...>::value,
+                                                             Gen...>::root_type {
+ public:
+  constexpr static std::size_t NumIndices = internal::tensor_symmetry_num_indices<Gen...>::value;
+  typedef typename internal::tensor_symmetry_pre_analysis<NumIndices, Gen...>::root_type Base;
 
-    // make standard constructors + assignment operators public
-    inline SGroup() : Base() { }
-    inline SGroup(const SGroup<Gen...>& other) : Base(other) { }
-    inline SGroup(SGroup<Gen...>&& other) : Base(other) { }
-    inline SGroup<Gen...>& operator=(const SGroup<Gen...>& other) { Base::operator=(other); return *this; }
-    inline SGroup<Gen...>& operator=(SGroup<Gen...>&& other) { Base::operator=(other); return *this; }
+  // make standard constructors + assignment operators public
+  inline SGroup() : Base() {}
+  inline SGroup(const SGroup<Gen...>& other) : Base(other) {}
+  inline SGroup(SGroup<Gen...>&& other) : Base(other) {}
+  inline SGroup<Gen...>& operator=(const SGroup<Gen...>& other) {
+    Base::operator=(other);
+    return *this;
+  }
+  inline SGroup<Gen...>& operator=(SGroup<Gen...>&& other) {
+    Base::operator=(other);
+    return *this;
+  }
 
-    // all else is defined in the base class
+  // all else is defined in the base class
 };
 
 namespace internal {
 
-template<typename... Sym> struct tensor_symmetry_num_indices
-{
+template <typename... Sym>
+struct tensor_symmetry_num_indices {
   constexpr static std::size_t value = 1;
 };
 
-template<int One_, int Two_, typename... Sym> struct tensor_symmetry_num_indices<Symmetry<One_, Two_>, Sym...>
-{
-private:
+template <int One_, int Two_, typename... Sym>
+struct tensor_symmetry_num_indices<Symmetry<One_, Two_>, Sym...> {
+ private:
   constexpr static std::size_t One = static_cast<std::size_t>(One_);
   constexpr static std::size_t Two = static_cast<std::size_t>(Two_);
   constexpr static std::size_t Three = tensor_symmetry_num_indices<Sym...>::value;
 
   // don't use std::max, since it's not constexpr until C++14...
   constexpr static std::size_t maxOneTwoPlusOne = ((One > Two) ? One : Two) + 1;
-public:
+
+ public:
   constexpr static std::size_t value = (maxOneTwoPlusOne > Three) ? maxOneTwoPlusOne : Three;
 };
 
-template<int One_, int Two_, typename... Sym> struct tensor_symmetry_num_indices<AntiSymmetry<One_, Two_>, Sym...>
-  : public tensor_symmetry_num_indices<Symmetry<One_, Two_>, Sym...> {};
-template<int One_, int Two_, typename... Sym> struct tensor_symmetry_num_indices<Hermiticity<One_, Two_>, Sym...>
-  : public tensor_symmetry_num_indices<Symmetry<One_, Two_>, Sym...> {};
-template<int One_, int Two_, typename... Sym> struct tensor_symmetry_num_indices<AntiHermiticity<One_, Two_>, Sym...>
-  : public tensor_symmetry_num_indices<Symmetry<One_, Two_>, Sym...> {};
+template <int One_, int Two_, typename... Sym>
+struct tensor_symmetry_num_indices<AntiSymmetry<One_, Two_>, Sym...>
+    : public tensor_symmetry_num_indices<Symmetry<One_, Two_>, Sym...> {};
+template <int One_, int Two_, typename... Sym>
+struct tensor_symmetry_num_indices<Hermiticity<One_, Two_>, Sym...>
+    : public tensor_symmetry_num_indices<Symmetry<One_, Two_>, Sym...> {};
+template <int One_, int Two_, typename... Sym>
+struct tensor_symmetry_num_indices<AntiHermiticity<One_, Two_>, Sym...>
+    : public tensor_symmetry_num_indices<Symmetry<One_, Two_>, Sym...> {};
 
 /** \internal
-  *
-  * \class tensor_symmetry_pre_analysis
-  * \ingroup TensorSymmetry_Module
-  *
-  * \brief Pre-select whether to use a static or dynamic symmetry group
-  *
-  * When a symmetry group could in principle be determined at compile time,
-  * this template implements the logic whether to actually do that or whether
-  * to rather defer that to runtime.
-  *
-  * The logic is as follows:
-  * <dl>
-  * <dt><b>No generators (trivial symmetry):</b></dt>
-  * <dd>Use a trivial static group. Ideally, this has no performance impact
-  *     compared to not using symmetry at all. In practice, this might not
-  *     be the case.</dd>
-  * <dt><b>More than 4 generators:</b></dt>
-  * <dd>Calculate the group at run time, it is likely far too large for the
-  *     compiler to be able to properly generate it in a realistic time.</dd>
-  * <dt><b>Up to and including 4 generators:</b></dt>
-  * <dd>Actually enumerate all group elements, but then check how many there
-  *     are. If there are more than 16, it is unlikely that unrolling the
-  *     loop (as is done in the static compile-time case) is sensible, so
-  *     use a dynamic group instead. If there are at most 16 elements, actually
-  *     use that static group. Note that the largest group with 4 generators
-  *     still compiles with reasonable resources.</dd>
-  * </dl>
-  *
-  * Note: Example compile time performance with g++-4.6 on an Intenl Core i5-3470
-  *       with 16 GiB RAM (all generators non-redundant and the subgroups don't
-  *       factorize):
-  *
-  *          # Generators          -O0 -ggdb               -O2
-  *          -------------------------------------------------------------------
-  *          1                 0.5 s  /   250 MiB     0.45s /   230 MiB
-  *          2                 0.5 s  /   260 MiB     0.5 s /   250 MiB
-  *          3                 0.65s  /   310 MiB     0.62s /   310 MiB
-  *          4                 2.2 s  /   860 MiB     1.7 s /   770 MiB
-  *          5               130   s  / 13000 MiB   120   s / 11000 MiB
-  *
-  * It is clear that everything is still very efficient up to 4 generators, then
-  * the memory and CPU requirements become unreasonable. Thus we only instantiate
-  * the template group theory logic if the number of generators supplied is 4 or
-  * lower, otherwise this will be forced to be done during runtime, where the
-  * algorithm is reasonably fast.
-  */
-template<std::size_t NumIndices>
-struct tensor_symmetry_pre_analysis<NumIndices>
-{
+ *
+ * \class tensor_symmetry_pre_analysis
+ * \ingroup TensorSymmetry_Module
+ *
+ * \brief Pre-select whether to use a static or dynamic symmetry group
+ *
+ * When a symmetry group could in principle be determined at compile time,
+ * this template implements the logic whether to actually do that or whether
+ * to rather defer that to runtime.
+ *
+ * The logic is as follows:
+ * <dl>
+ * <dt><b>No generators (trivial symmetry):</b></dt>
+ * <dd>Use a trivial static group. Ideally, this has no performance impact
+ *     compared to not using symmetry at all. In practice, this might not
+ *     be the case.</dd>
+ * <dt><b>More than 4 generators:</b></dt>
+ * <dd>Calculate the group at run time, it is likely far too large for the
+ *     compiler to be able to properly generate it in a realistic time.</dd>
+ * <dt><b>Up to and including 4 generators:</b></dt>
+ * <dd>Actually enumerate all group elements, but then check how many there
+ *     are. If there are more than 16, it is unlikely that unrolling the
+ *     loop (as is done in the static compile-time case) is sensible, so
+ *     use a dynamic group instead. If there are at most 16 elements, actually
+ *     use that static group. Note that the largest group with 4 generators
+ *     still compiles with reasonable resources.</dd>
+ * </dl>
+ *
+ * Note: Example compile time performance with g++-4.6 on an Intenl Core i5-3470
+ *       with 16 GiB RAM (all generators non-redundant and the subgroups don't
+ *       factorize):
+ *
+ *          # Generators          -O0 -ggdb               -O2
+ *          -------------------------------------------------------------------
+ *          1                 0.5 s  /   250 MiB     0.45s /   230 MiB
+ *          2                 0.5 s  /   260 MiB     0.5 s /   250 MiB
+ *          3                 0.65s  /   310 MiB     0.62s /   310 MiB
+ *          4                 2.2 s  /   860 MiB     1.7 s /   770 MiB
+ *          5               130   s  / 13000 MiB   120   s / 11000 MiB
+ *
+ * It is clear that everything is still very efficient up to 4 generators, then
+ * the memory and CPU requirements become unreasonable. Thus we only instantiate
+ * the template group theory logic if the number of generators supplied is 4 or
+ * lower, otherwise this will be forced to be done during runtime, where the
+ * algorithm is reasonably fast.
+ */
+template <std::size_t NumIndices>
+struct tensor_symmetry_pre_analysis<NumIndices> {
   typedef StaticSGroup<> root_type;
 };
 
-template<std::size_t NumIndices, typename Gen_, typename... Gens_>
-struct tensor_symmetry_pre_analysis<NumIndices, Gen_, Gens_...>
-{
+template <std::size_t NumIndices, typename Gen_, typename... Gens_>
+struct tensor_symmetry_pre_analysis<NumIndices, Gen_, Gens_...> {
   constexpr static std::size_t max_static_generators = 4;
   constexpr static std::size_t max_static_elements = 16;
   typedef tensor_static_symgroup_if<(sizeof...(Gens_) + 1 <= max_static_generators), NumIndices, Gen_, Gens_...> helper;
   constexpr static std::size_t possible_size = helper::size;
 
-  typedef std::conditional_t<
-    possible_size == 0 || possible_size >= max_static_elements,
-    DynamicSGroupFromTemplateArgs<Gen_, Gens_...>,
-    typename helper::type
-  > root_type;
+  typedef std::conditional_t<possible_size == 0 || possible_size >= max_static_elements,
+                             DynamicSGroupFromTemplateArgs<Gen_, Gens_...>, typename helper::type>
+      root_type;
 };
 
-template<bool instantiate, std::size_t NumIndices, typename... Gens>
-struct tensor_static_symgroup_if
-{
+template <bool instantiate, std::size_t NumIndices, typename... Gens>
+struct tensor_static_symgroup_if {
   constexpr static std::size_t size = 0;
   typedef void type;
 };
 
-template<std::size_t NumIndices, typename... Gens>
+template <std::size_t NumIndices, typename... Gens>
 struct tensor_static_symgroup_if<true, NumIndices, Gens...> : tensor_static_symgroup<NumIndices, Gens...> {};
 
-template<typename Tensor_>
-struct tensor_symmetry_assign_value
-{
+template <typename Tensor_>
+struct tensor_symmetry_assign_value {
   typedef typename Tensor_::Index Index;
   typedef typename Tensor_::Scalar Scalar;
   constexpr static std::size_t NumIndices = Tensor_::NumIndices;
 
-  static inline int run(const std::array<Index, NumIndices>& transformed_indices, int transformation_flags, int dummy, Tensor_& tensor, const Scalar& value_)
-  {
+  static inline int run(const std::array<Index, NumIndices>& transformed_indices, int transformation_flags, int dummy,
+                        Tensor_& tensor, const Scalar& value_) {
     Scalar value(value_);
-    if (transformation_flags & ConjugationFlag)
-      value = numext::conj(value);
-    if (transformation_flags & NegationFlag)
-      value = -value;
+    if (transformation_flags & ConjugationFlag) value = numext::conj(value);
+    if (transformation_flags & NegationFlag) value = -value;
     tensor.coeffRef(transformed_indices) = value;
     return dummy;
   }
 };
 
-template<typename Tensor_>
-struct tensor_symmetry_calculate_flags
-{
+template <typename Tensor_>
+struct tensor_symmetry_calculate_flags {
   typedef typename Tensor_::Index Index;
   constexpr static std::size_t NumIndices = Tensor_::NumIndices;
 
-  static inline int run(const std::array<Index, NumIndices>& transformed_indices, int transform_flags, int current_flags, const std::array<Index, NumIndices>& orig_indices)
-  {
+  static inline int run(const std::array<Index, NumIndices>& transformed_indices, int transform_flags,
+                        int current_flags, const std::array<Index, NumIndices>& orig_indices) {
     if (transformed_indices == orig_indices) {
       if (transform_flags & (ConjugationFlag | NegationFlag))
-        return current_flags | GlobalImagFlag; // anti-hermitian diagonal
+        return current_flags | GlobalImagFlag;  // anti-hermitian diagonal
       else if (transform_flags & ConjugationFlag)
-        return current_flags | GlobalRealFlag; // hermitian diagonal
+        return current_flags | GlobalRealFlag;  // hermitian diagonal
       else if (transform_flags & NegationFlag)
-        return current_flags | GlobalZeroFlag; // anti-symmetric diagonal
+        return current_flags | GlobalZeroFlag;  // anti-symmetric diagonal
     }
     return current_flags;
   }
 };
 
-template<typename Tensor_, typename Symmetry_, int Flags = 0>
-class tensor_symmetry_value_setter
-{
-  public:
-    typedef typename Tensor_::Index Index;
-    typedef typename Tensor_::Scalar Scalar;
-    constexpr static std::size_t NumIndices = Tensor_::NumIndices;
+template <typename Tensor_, typename Symmetry_, int Flags = 0>
+class tensor_symmetry_value_setter {
+ public:
+  typedef typename Tensor_::Index Index;
+  typedef typename Tensor_::Scalar Scalar;
+  constexpr static std::size_t NumIndices = Tensor_::NumIndices;
 
-    inline tensor_symmetry_value_setter(Tensor_& tensor, Symmetry_ const& symmetry, std::array<Index, NumIndices> const& indices)
-      : m_tensor(tensor), m_symmetry(symmetry), m_indices(indices) { }
+  inline tensor_symmetry_value_setter(Tensor_& tensor, Symmetry_ const& symmetry,
+                                      std::array<Index, NumIndices> const& indices)
+      : m_tensor(tensor), m_symmetry(symmetry), m_indices(indices) {}
 
-    inline tensor_symmetry_value_setter<Tensor_, Symmetry_, Flags>& operator=(Scalar const& value)
-    {
-      doAssign(value);
-      return *this;
-    }
-  private:
-    Tensor_& m_tensor;
-    Symmetry_ m_symmetry;
-    std::array<Index, NumIndices> m_indices;
+  inline tensor_symmetry_value_setter<Tensor_, Symmetry_, Flags>& operator=(Scalar const& value) {
+    doAssign(value);
+    return *this;
+  }
 
-    inline void doAssign(Scalar const& value)
-    {
-      #ifdef EIGEN_TENSOR_SYMMETRY_CHECK_VALUES
-        int value_flags = m_symmetry.template apply<internal::tensor_symmetry_calculate_flags<Tensor_>, int>(m_indices, m_symmetry.globalFlags(), m_indices);
-        if (value_flags & GlobalRealFlag)
-          eigen_assert(numext::imag(value) == 0);
-        if (value_flags & GlobalImagFlag)
-          eigen_assert(numext::real(value) == 0);
-      #endif
-      m_symmetry.template apply<internal::tensor_symmetry_assign_value<Tensor_>, int>(m_indices, 0, m_tensor, value);
-    }
+ private:
+  Tensor_& m_tensor;
+  Symmetry_ m_symmetry;
+  std::array<Index, NumIndices> m_indices;
+
+  inline void doAssign(Scalar const& value) {
+#ifdef EIGEN_TENSOR_SYMMETRY_CHECK_VALUES
+    int value_flags = m_symmetry.template apply<internal::tensor_symmetry_calculate_flags<Tensor_>, int>(
+        m_indices, m_symmetry.globalFlags(), m_indices);
+    if (value_flags & GlobalRealFlag) eigen_assert(numext::imag(value) == 0);
+    if (value_flags & GlobalImagFlag) eigen_assert(numext::real(value) == 0);
+#endif
+    m_symmetry.template apply<internal::tensor_symmetry_assign_value<Tensor_>, int>(m_indices, 0, m_tensor, value);
+  }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_CXX11_TENSORSYMMETRY_SYMMETRY_H
+#endif  // EIGEN_CXX11_TENSORSYMMETRY_SYMMETRY_H
 
 /*
  * kate: space-indent on; indent-width 2; mixedindent off; indent-mode cstyle;
diff --git a/unsupported/Eigen/CXX11/src/TensorSymmetry/util/TemplateGroupTheory.h b/unsupported/Eigen/CXX11/src/TensorSymmetry/util/TemplateGroupTheory.h
index 5fa33f1..aa16f3c 100644
--- a/unsupported/Eigen/CXX11/src/TensorSymmetry/util/TemplateGroupTheory.h
+++ b/unsupported/Eigen/CXX11/src/TensorSymmetry/util/TemplateGroupTheory.h
@@ -20,16 +20,16 @@
 namespace group_theory {
 
 /** \internal
-  * \file CXX11/src/TensorSymmetry/util/TemplateGroupTheory.h
-  * This file contains C++ templates that implement group theory algorithms.
-  *
-  * The algorithms allow for a compile-time analysis of finite groups.
-  *
-  * Currently only Dimino's algorithm is implemented, which returns a list
-  * of all elements in a group given a set of (possibly redundant) generators.
-  * (One could also do that with the so-called orbital algorithm, but that
-  * is much more expensive and usually has no advantages.)
-  */
+ * \file CXX11/src/TensorSymmetry/util/TemplateGroupTheory.h
+ * This file contains C++ templates that implement group theory algorithms.
+ *
+ * The algorithms allow for a compile-time analysis of finite groups.
+ *
+ * Currently only Dimino's algorithm is implemented, which returns a list
+ * of all elements in a group given a set of (possibly redundant) generators.
+ * (One could also do that with the so-called orbital algorithm, but that
+ * is much more expensive and usually has no advantages.)
+ */
 
 /**********************************************************************
  *                "Ok kid, here is where it gets complicated."
@@ -94,7 +94,7 @@
  * Note that this flag mechanism is quite generic and may have other
  * uses beyond tensor properties.
  *
- * IMPORTANT: 
+ * IMPORTANT:
  *     This algorithm assumes the group to be finite. If you try to
  *     run it with a group that's infinite, the algorithm will only
  *     terminate once you hit a compiler limit (max template depth).
@@ -107,236 +107,164 @@
  */
 
 /** \internal
-  *
-  * \class strip_identities
-  * \ingroup CXX11_TensorSymmetry_Module
-  *
-  * \brief Cleanse a list of group elements of the identity element
-  *
-  * This template is used to make a first pass through all initial
-  * generators of Dimino's algorithm and remove the identity
-  * elements.
-  *
-  * \sa enumerate_group_elements
-  */
-template<template<typename, typename> class Equality, typename id, typename L> struct strip_identities;
+ *
+ * \class strip_identities
+ * \ingroup CXX11_TensorSymmetry_Module
+ *
+ * \brief Cleanse a list of group elements of the identity element
+ *
+ * This template is used to make a first pass through all initial
+ * generators of Dimino's algorithm and remove the identity
+ * elements.
+ *
+ * \sa enumerate_group_elements
+ */
+template <template <typename, typename> class Equality, typename id, typename L>
+struct strip_identities;
 
-template<
-  template<typename, typename> class Equality,
-  typename id,
-  typename t,
-  typename... ts
->
-struct strip_identities<Equality, id, type_list<t, ts...>>
-{
+template <template <typename, typename> class Equality, typename id, typename t, typename... ts>
+struct strip_identities<Equality, id, type_list<t, ts...>> {
   typedef std::conditional_t<
-    Equality<id, t>::value,
-    typename strip_identities<Equality, id, type_list<ts...>>::type,
-    typename concat<type_list<t>, typename strip_identities<Equality, id, type_list<ts...>>::type>::type
-  > type;
-  constexpr static int global_flags = Equality<id, t>::global_flags | strip_identities<Equality, id, type_list<ts...>>::global_flags;
+      Equality<id, t>::value, typename strip_identities<Equality, id, type_list<ts...>>::type,
+      typename concat<type_list<t>, typename strip_identities<Equality, id, type_list<ts...>>::type>::type>
+      type;
+  constexpr static int global_flags =
+      Equality<id, t>::global_flags | strip_identities<Equality, id, type_list<ts...>>::global_flags;
 };
 
-template<
-  template<typename, typename> class Equality,
-  typename id
-  EIGEN_TPL_PP_SPEC_HACK_DEFC(typename, ts)
->
-struct strip_identities<Equality, id, type_list<EIGEN_TPL_PP_SPEC_HACK_USE(ts)>>
-{
+template <template <typename, typename> class Equality, typename id EIGEN_TPL_PP_SPEC_HACK_DEFC(typename, ts)>
+struct strip_identities<Equality, id, type_list<EIGEN_TPL_PP_SPEC_HACK_USE(ts)>> {
   typedef type_list<> type;
   constexpr static int global_flags = 0;
 };
 
 /** \internal
-  *
-  * \class dimino_first_step_elements_helper 
-  * \ingroup CXX11_TensorSymmetry_Module
-  *
-  * \brief Recursive template that adds powers of the first generator to the list of group elements
-  *
-  * This template calls itself recursively to add powers of the first
-  * generator to the list of group elements. It stops if it reaches
-  * the identity element again.
-  *
-  * \sa enumerate_group_elements, dimino_first_step_elements
-  */
-template<
-  template<typename, typename> class Multiply,
-  template<typename, typename> class Equality,
-  typename id,
-  typename g,
-  typename current_element,
-  typename elements,
-  bool dont_add_current_element   // = false
->
+ *
+ * \class dimino_first_step_elements_helper
+ * \ingroup CXX11_TensorSymmetry_Module
+ *
+ * \brief Recursive template that adds powers of the first generator to the list of group elements
+ *
+ * This template calls itself recursively to add powers of the first
+ * generator to the list of group elements. It stops if it reaches
+ * the identity element again.
+ *
+ * \sa enumerate_group_elements, dimino_first_step_elements
+ */
+template <template <typename, typename> class Multiply, template <typename, typename> class Equality, typename id,
+          typename g, typename current_element, typename elements,
+          bool dont_add_current_element  // = false
+          >
 struct dimino_first_step_elements_helper
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-  : // recursive inheritance is too difficult for Doxygen
-  public dimino_first_step_elements_helper<
-    Multiply,
-    Equality,
-    id,
-    g,
-    typename Multiply<current_element, g>::type,
-    typename concat<elements, type_list<current_element>>::type,
-    Equality<typename Multiply<current_element, g>::type, id>::value
-  > {};
+    :  // recursive inheritance is too difficult for Doxygen
+       public dimino_first_step_elements_helper<Multiply, Equality, id, g, typename Multiply<current_element, g>::type,
+                                                typename concat<elements, type_list<current_element>>::type,
+                                                Equality<typename Multiply<current_element, g>::type, id>::value> {
+};
 
-template<
-  template<typename, typename> class Multiply,
-  template<typename, typename> class Equality,
-  typename id,
-  typename g,
-  typename current_element,
-  typename elements
->
+template <template <typename, typename> class Multiply, template <typename, typename> class Equality, typename id,
+          typename g, typename current_element, typename elements>
 struct dimino_first_step_elements_helper<Multiply, Equality, id, g, current_element, elements, true>
-#endif // EIGEN_PARSED_BY_DOXYGEN
+#endif  // EIGEN_PARSED_BY_DOXYGEN
 {
   typedef elements type;
   constexpr static int global_flags = Equality<current_element, id>::global_flags;
 };
 
 /** \internal
-  *
-  * \class dimino_first_step_elements
-  * \ingroup CXX11_TensorSymmetry_Module
-  *
-  * \brief Add all powers of the first generator to the list of group elements
-  *
-  * This template takes the first non-identity generator and generates the initial
-  * list of elements which consists of all powers of that generator. For a group
-  * with just one generated, it would be enumerated after this.
-  *
-  * \sa enumerate_group_elements
-  */
-template<
-  template<typename, typename> class Multiply,
-  template<typename, typename> class Equality,
-  typename id,
-  typename generators
->
-struct dimino_first_step_elements
-{
+ *
+ * \class dimino_first_step_elements
+ * \ingroup CXX11_TensorSymmetry_Module
+ *
+ * \brief Add all powers of the first generator to the list of group elements
+ *
+ * This template takes the first non-identity generator and generates the initial
+ * list of elements which consists of all powers of that generator. For a group
+ * with just one generated, it would be enumerated after this.
+ *
+ * \sa enumerate_group_elements
+ */
+template <template <typename, typename> class Multiply, template <typename, typename> class Equality, typename id,
+          typename generators>
+struct dimino_first_step_elements {
   typedef typename get<0, generators>::type first_generator;
   typedef typename skip<1, generators>::type next_generators;
   typedef type_list<first_generator> generators_done;
 
-  typedef dimino_first_step_elements_helper<
-    Multiply,
-    Equality,
-    id,
-    first_generator,
-    first_generator,
-    type_list<id>,
-    false
-  > helper;
+  typedef dimino_first_step_elements_helper<Multiply, Equality, id, first_generator, first_generator, type_list<id>,
+                                            false>
+      helper;
   typedef typename helper::type type;
   constexpr static int global_flags = helper::global_flags;
 };
 
 /** \internal
-  *
-  * \class dimino_get_coset_elements
-  * \ingroup CXX11_TensorSymmetry_Module
-  *
-  * \brief Generate all elements of a specific coset
-  *
-  * This template generates all the elements of a specific coset by
-  * multiplying all elements in the given subgroup with the new
-  * coset representative. Note that the first element of the
-  * subgroup is always the identity element, so the first element of
-  * the result of this template is going to be the coset
-  * representative itself.
-  *
-  * Note that this template accepts an additional boolean parameter
-  * that specifies whether to actually generate the coset (true) or
-  * just return an empty list (false).
-  *
-  * \sa enumerate_group_elements, dimino_add_cosets_for_rep
-  */
-template<
-  template<typename, typename> class Multiply,
-  typename sub_group_elements,
-  typename new_coset_rep,
-  bool generate_coset      // = true
->
-struct dimino_get_coset_elements
-{
+ *
+ * \class dimino_get_coset_elements
+ * \ingroup CXX11_TensorSymmetry_Module
+ *
+ * \brief Generate all elements of a specific coset
+ *
+ * This template generates all the elements of a specific coset by
+ * multiplying all elements in the given subgroup with the new
+ * coset representative. Note that the first element of the
+ * subgroup is always the identity element, so the first element of
+ * the result of this template is going to be the coset
+ * representative itself.
+ *
+ * Note that this template accepts an additional boolean parameter
+ * that specifies whether to actually generate the coset (true) or
+ * just return an empty list (false).
+ *
+ * \sa enumerate_group_elements, dimino_add_cosets_for_rep
+ */
+template <template <typename, typename> class Multiply, typename sub_group_elements, typename new_coset_rep,
+          bool generate_coset  // = true
+          >
+struct dimino_get_coset_elements {
   typedef typename apply_op_from_right<Multiply, new_coset_rep, sub_group_elements>::type type;
 };
 
-template<
-  template<typename, typename> class Multiply,
-  typename sub_group_elements,
-  typename new_coset_rep
->
-struct dimino_get_coset_elements<Multiply, sub_group_elements, new_coset_rep, false>
-{
+template <template <typename, typename> class Multiply, typename sub_group_elements, typename new_coset_rep>
+struct dimino_get_coset_elements<Multiply, sub_group_elements, new_coset_rep, false> {
   typedef type_list<> type;
 };
 
 /** \internal
-  *
-  * \class dimino_add_cosets_for_rep
-  * \ingroup CXX11_TensorSymmetry_Module
-  *
-  * \brief Recursive template for adding coset spaces
-  *
-  * This template multiplies the coset representative with a generator
-  * from the list of previous generators. If the new element is not in
-  * the group already, it adds the corresponding coset. Finally it
-  * proceeds to call itself with the next generator from the list.
-  *
-  * \sa enumerate_group_elements, dimino_add_all_coset_spaces
-  */
-template<
-  template<typename, typename> class Multiply,
-  template<typename, typename> class Equality,
-  typename id,
-  typename sub_group_elements,
-  typename elements,
-  typename generators,
-  typename rep_element,
-  int sub_group_size
->
+ *
+ * \class dimino_add_cosets_for_rep
+ * \ingroup CXX11_TensorSymmetry_Module
+ *
+ * \brief Recursive template for adding coset spaces
+ *
+ * This template multiplies the coset representative with a generator
+ * from the list of previous generators. If the new element is not in
+ * the group already, it adds the corresponding coset. Finally it
+ * proceeds to call itself with the next generator from the list.
+ *
+ * \sa enumerate_group_elements, dimino_add_all_coset_spaces
+ */
+template <template <typename, typename> class Multiply, template <typename, typename> class Equality, typename id,
+          typename sub_group_elements, typename elements, typename generators, typename rep_element, int sub_group_size>
 struct dimino_add_cosets_for_rep;
 
-template<
-  template<typename, typename> class Multiply,
-  template<typename, typename> class Equality,
-  typename id,
-  typename sub_group_elements,
-  typename elements,
-  typename g,
-  typename... gs,
-  typename rep_element,
-  int sub_group_size
->
-struct dimino_add_cosets_for_rep<Multiply, Equality, id, sub_group_elements, elements, type_list<g, gs...>, rep_element, sub_group_size>
-{
+template <template <typename, typename> class Multiply, template <typename, typename> class Equality, typename id,
+          typename sub_group_elements, typename elements, typename g, typename... gs, typename rep_element,
+          int sub_group_size>
+struct dimino_add_cosets_for_rep<Multiply, Equality, id, sub_group_elements, elements, type_list<g, gs...>, rep_element,
+                                 sub_group_size> {
   typedef typename Multiply<rep_element, g>::type new_coset_rep;
   typedef contained_in_list_gf<Equality, new_coset_rep, elements> _cil;
   constexpr static bool add_coset = !_cil::value;
 
-  typedef typename dimino_get_coset_elements<
-    Multiply,
-    sub_group_elements,
-    new_coset_rep,
-    add_coset
-  >::type coset_elements;
+  typedef
+      typename dimino_get_coset_elements<Multiply, sub_group_elements, new_coset_rep, add_coset>::type coset_elements;
 
-  typedef dimino_add_cosets_for_rep<
-    Multiply,
-    Equality,
-    id,
-    sub_group_elements,
-    typename concat<elements, coset_elements>::type,
-    type_list<gs...>,
-    rep_element,
-    sub_group_size
-  > _helper;
+  typedef dimino_add_cosets_for_rep<Multiply, Equality, id, sub_group_elements,
+                                    typename concat<elements, coset_elements>::type, type_list<gs...>, rep_element,
+                                    sub_group_size>
+      _helper;
 
   typedef typename _helper::type type;
   constexpr static int global_flags = _cil::global_flags | _helper::global_flags;
@@ -349,120 +277,76 @@
    */
 };
 
-template<
-  template<typename, typename> class Multiply,
-  template<typename, typename> class Equality,
-  typename id,
-  typename sub_group_elements,
-  typename elements
-  EIGEN_TPL_PP_SPEC_HACK_DEFC(typename, empty),
-  typename rep_element,
-  int sub_group_size
->
-struct dimino_add_cosets_for_rep<Multiply, Equality, id, sub_group_elements, elements, type_list<EIGEN_TPL_PP_SPEC_HACK_USE(empty)>, rep_element, sub_group_size>
-{
+template <template <typename, typename> class Multiply, template <typename, typename> class Equality, typename id,
+          typename sub_group_elements, typename elements EIGEN_TPL_PP_SPEC_HACK_DEFC(typename, empty),
+          typename rep_element, int sub_group_size>
+struct dimino_add_cosets_for_rep<Multiply, Equality, id, sub_group_elements, elements,
+                                 type_list<EIGEN_TPL_PP_SPEC_HACK_USE(empty)>, rep_element, sub_group_size> {
   typedef elements type;
   constexpr static int global_flags = 0;
 };
 
 /** \internal
-  *
-  * \class dimino_add_all_coset_spaces
-  * \ingroup CXX11_TensorSymmetry_Module
-  *
-  * \brief Recursive template for adding all coset spaces for a new generator
-  *
-  * This template tries to go through the list of generators (with
-  * the help of the dimino_add_cosets_for_rep template) as long as
-  * it still finds elements that are not part of the group and add
-  * the corresponding cosets.
-  *
-  * \sa enumerate_group_elements, dimino_add_cosets_for_rep
-  */
-template<
-  template<typename, typename> class Multiply,
-  template<typename, typename> class Equality,
-  typename id,
-  typename sub_group_elements,
-  typename elements,
-  typename generators,
-  int sub_group_size,
-  int rep_pos,
-  bool stop_condition        // = false
->
-struct dimino_add_all_coset_spaces
-{
+ *
+ * \class dimino_add_all_coset_spaces
+ * \ingroup CXX11_TensorSymmetry_Module
+ *
+ * \brief Recursive template for adding all coset spaces for a new generator
+ *
+ * This template tries to go through the list of generators (with
+ * the help of the dimino_add_cosets_for_rep template) as long as
+ * it still finds elements that are not part of the group and add
+ * the corresponding cosets.
+ *
+ * \sa enumerate_group_elements, dimino_add_cosets_for_rep
+ */
+template <template <typename, typename> class Multiply, template <typename, typename> class Equality, typename id,
+          typename sub_group_elements, typename elements, typename generators, int sub_group_size, int rep_pos,
+          bool stop_condition  // = false
+          >
+struct dimino_add_all_coset_spaces {
   typedef typename get<rep_pos, elements>::type rep_element;
-  typedef dimino_add_cosets_for_rep<
-    Multiply,
-    Equality,
-    id,
-    sub_group_elements,
-    elements,
-    generators,
-    rep_element,
-    sub_group_elements::count
-  > _ac4r;
+  typedef dimino_add_cosets_for_rep<Multiply, Equality, id, sub_group_elements, elements, generators, rep_element,
+                                    sub_group_elements::count>
+      _ac4r;
   typedef typename _ac4r::type new_elements;
-  
+
   constexpr static int new_rep_pos = rep_pos + sub_group_elements::count;
   constexpr static bool new_stop_condition = new_rep_pos >= new_elements::count;
 
-  typedef dimino_add_all_coset_spaces<
-    Multiply,
-    Equality,
-    id,
-    sub_group_elements,
-    new_elements,
-    generators,
-    sub_group_size,
-    new_rep_pos,
-    new_stop_condition
-  > _helper;
+  typedef dimino_add_all_coset_spaces<Multiply, Equality, id, sub_group_elements, new_elements, generators,
+                                      sub_group_size, new_rep_pos, new_stop_condition>
+      _helper;
 
   typedef typename _helper::type type;
   constexpr static int global_flags = _helper::global_flags | _ac4r::global_flags;
 };
 
-template<
-  template<typename, typename> class Multiply,
-  template<typename, typename> class Equality,
-  typename id,
-  typename sub_group_elements,
-  typename elements,
-  typename generators,
-  int sub_group_size,
-  int rep_pos
->
-struct dimino_add_all_coset_spaces<Multiply, Equality, id, sub_group_elements, elements, generators, sub_group_size, rep_pos, true>
-{
+template <template <typename, typename> class Multiply, template <typename, typename> class Equality, typename id,
+          typename sub_group_elements, typename elements, typename generators, int sub_group_size, int rep_pos>
+struct dimino_add_all_coset_spaces<Multiply, Equality, id, sub_group_elements, elements, generators, sub_group_size,
+                                   rep_pos, true> {
   typedef elements type;
   constexpr static int global_flags = 0;
 };
 
 /** \internal
-  *
-  * \class dimino_add_generator
-  * \ingroup CXX11_TensorSymmetry_Module
-  *
-  * \brief Enlarge the group by adding a new generator.
-  *
-  * It accepts a boolean parameter that determines if the generator is redundant,
-  * i.e. was already seen in the group. In that case, it reduces to a no-op.
-  *
-  * \sa enumerate_group_elements, dimino_add_all_coset_spaces
-  */
-template<
-  template<typename, typename> class Multiply,
-  template<typename, typename> class Equality,
-  typename id,
-  typename elements,
-  typename generators_done,
-  typename current_generator,
-  bool redundant          // = false
->
-struct dimino_add_generator
-{
+ *
+ * \class dimino_add_generator
+ * \ingroup CXX11_TensorSymmetry_Module
+ *
+ * \brief Enlarge the group by adding a new generator.
+ *
+ * It accepts a boolean parameter that determines if the generator is redundant,
+ * i.e. was already seen in the group. In that case, it reduces to a no-op.
+ *
+ * \sa enumerate_group_elements, dimino_add_all_coset_spaces
+ */
+template <template <typename, typename> class Multiply, template <typename, typename> class Equality, typename id,
+          typename elements, typename generators_done, typename current_generator,
+          bool redundant  // = false
+          >
+struct dimino_add_generator {
   /* this template is only called if the generator is not redundant
    * => all elements of the group multiplied with the new generator
    *    are going to be new elements of the most trivial coset space
@@ -473,199 +357,135 @@
   constexpr static int rep_pos = elements::count;
 
   typedef dimino_add_all_coset_spaces<
-    Multiply,
-    Equality,
-    id,
-    elements, // elements of previous subgroup
-    new_elements,
-    typename concat<generators_done, type_list<current_generator>>::type,
-    elements::count, // size of previous subgroup
-    rep_pos,
-    false // don't stop (because rep_pos >= new_elements::count is always false at this point)
-  > _helper;
+      Multiply, Equality, id,
+      elements,  // elements of previous subgroup
+      new_elements, typename concat<generators_done, type_list<current_generator>>::type,
+      elements::count,  // size of previous subgroup
+      rep_pos,
+      false  // don't stop (because rep_pos >= new_elements::count is always false at this point)
+      >
+      _helper;
   typedef typename _helper::type type;
   constexpr static int global_flags = _helper::global_flags;
 };
 
-template<
-  template<typename, typename> class Multiply,
-  template<typename, typename> class Equality,
-  typename id,
-  typename elements,
-  typename generators_done,
-  typename current_generator
->
-struct dimino_add_generator<Multiply, Equality, id, elements, generators_done, current_generator, true>
-{
+template <template <typename, typename> class Multiply, template <typename, typename> class Equality, typename id,
+          typename elements, typename generators_done, typename current_generator>
+struct dimino_add_generator<Multiply, Equality, id, elements, generators_done, current_generator, true> {
   // redundant case
   typedef elements type;
   constexpr static int global_flags = 0;
 };
 
 /** \internal
-  *
-  * \class dimino_add_remaining_generators
-  * \ingroup CXX11_TensorSymmetry_Module
-  *
-  * \brief Recursive template that adds all remaining generators to a group
-  *
-  * Loop through the list of generators that remain and successively
-  * add them to the group.
-  *
-  * \sa enumerate_group_elements, dimino_add_generator
-  */
-template<
-  template<typename, typename> class Multiply,
-  template<typename, typename> class Equality,
-  typename id,
-  typename generators_done,
-  typename remaining_generators,
-  typename elements
->
-struct dimino_add_remaining_generators
-{
+ *
+ * \class dimino_add_remaining_generators
+ * \ingroup CXX11_TensorSymmetry_Module
+ *
+ * \brief Recursive template that adds all remaining generators to a group
+ *
+ * Loop through the list of generators that remain and successively
+ * add them to the group.
+ *
+ * \sa enumerate_group_elements, dimino_add_generator
+ */
+template <template <typename, typename> class Multiply, template <typename, typename> class Equality, typename id,
+          typename generators_done, typename remaining_generators, typename elements>
+struct dimino_add_remaining_generators {
   typedef typename get<0, remaining_generators>::type first_generator;
   typedef typename skip<1, remaining_generators>::type next_generators;
 
   typedef contained_in_list_gf<Equality, first_generator, elements> _cil;
 
-  typedef dimino_add_generator<
-    Multiply,
-    Equality,
-    id,
-    elements,
-    generators_done,
-    first_generator,
-    _cil::value
-  > _helper;
+  typedef dimino_add_generator<Multiply, Equality, id, elements, generators_done, first_generator, _cil::value> _helper;
 
   typedef typename _helper::type new_elements;
 
-  typedef dimino_add_remaining_generators<
-    Multiply,
-    Equality,
-    id,
-    typename concat<generators_done, type_list<first_generator>>::type,
-    next_generators,
-    new_elements
-  > _next_iter;
+  typedef dimino_add_remaining_generators<Multiply, Equality, id,
+                                          typename concat<generators_done, type_list<first_generator>>::type,
+                                          next_generators, new_elements>
+      _next_iter;
 
   typedef typename _next_iter::type type;
-  constexpr static int global_flags =
-    _cil::global_flags |
-    _helper::global_flags |
-    _next_iter::global_flags;
+  constexpr static int global_flags = _cil::global_flags | _helper::global_flags | _next_iter::global_flags;
 };
 
-template<
-  template<typename, typename> class Multiply,
-  template<typename, typename> class Equality,
-  typename id,
-  typename generators_done,
-  typename elements
->
-struct dimino_add_remaining_generators<Multiply, Equality, id, generators_done, type_list<>, elements>
-{
+template <template <typename, typename> class Multiply, template <typename, typename> class Equality, typename id,
+          typename generators_done, typename elements>
+struct dimino_add_remaining_generators<Multiply, Equality, id, generators_done, type_list<>, elements> {
   typedef elements type;
   constexpr static int global_flags = 0;
 };
 
 /** \internal
-  *
-  * \class enumerate_group_elements_noid
-  * \ingroup CXX11_TensorSymmetry_Module
-  *
-  * \brief Helper template that implements group element enumeration
-  *
-  * This is a helper template that implements the actual enumeration
-  * of group elements. This has been split so that the list of
-  * generators can be cleansed of the identity element before
-  * performing the actual operation.
-  *
-  * \sa enumerate_group_elements
-  */
-template<
-  template<typename, typename> class Multiply,
-  template<typename, typename> class Equality,
-  typename id,
-  typename generators,
-  int initial_global_flags = 0
->
-struct enumerate_group_elements_noid
-{
+ *
+ * \class enumerate_group_elements_noid
+ * \ingroup CXX11_TensorSymmetry_Module
+ *
+ * \brief Helper template that implements group element enumeration
+ *
+ * This is a helper template that implements the actual enumeration
+ * of group elements. This has been split so that the list of
+ * generators can be cleansed of the identity element before
+ * performing the actual operation.
+ *
+ * \sa enumerate_group_elements
+ */
+template <template <typename, typename> class Multiply, template <typename, typename> class Equality, typename id,
+          typename generators, int initial_global_flags = 0>
+struct enumerate_group_elements_noid {
   typedef dimino_first_step_elements<Multiply, Equality, id, generators> first_step;
   typedef typename first_step::type first_step_elements;
 
-  typedef dimino_add_remaining_generators<
-    Multiply,
-    Equality,
-    id,
-    typename first_step::generators_done,
-    typename first_step::next_generators, // remaining_generators
-    typename first_step::type // first_step elements
-  > _helper;
+  typedef dimino_add_remaining_generators<Multiply, Equality, id, typename first_step::generators_done,
+                                          typename first_step::next_generators,  // remaining_generators
+                                          typename first_step::type              // first_step elements
+                                          >
+      _helper;
 
   typedef typename _helper::type type;
-  constexpr static int global_flags =
-    initial_global_flags |
-    first_step::global_flags |
-    _helper::global_flags;
+  constexpr static int global_flags = initial_global_flags | first_step::global_flags | _helper::global_flags;
 };
 
 // in case when no generators are specified
-template<
-  template<typename, typename> class Multiply,
-  template<typename, typename> class Equality,
-  typename id,
-  int initial_global_flags
->
-struct enumerate_group_elements_noid<Multiply, Equality, id, type_list<>, initial_global_flags>
-{
+template <template <typename, typename> class Multiply, template <typename, typename> class Equality, typename id,
+          int initial_global_flags>
+struct enumerate_group_elements_noid<Multiply, Equality, id, type_list<>, initial_global_flags> {
   typedef type_list<id> type;
   constexpr static int global_flags = initial_global_flags;
 };
 
 /** \internal
-  *
-  * \class enumerate_group_elements
-  * \ingroup CXX11_TensorSymmetry_Module
-  *
-  * \brief Enumerate all elements in a finite group
-  *
-  * This template enumerates all elements in a finite group. It accepts
-  * the following template parameters:
-  *
-  * \tparam Multiply      The multiplication operation that multiplies two group elements
-  *                       with each other.
-  * \tparam Equality      The equality check operation that checks if two group elements
-  *                       are equal to another.
-  * \tparam id            The identity element
-  * \tparam Generators_   A list of (possibly redundant) generators of the group
-  */
-template<
-  template<typename, typename> class Multiply,
-  template<typename, typename> class Equality,
-  typename id,
-  typename Generators_
->
+ *
+ * \class enumerate_group_elements
+ * \ingroup CXX11_TensorSymmetry_Module
+ *
+ * \brief Enumerate all elements in a finite group
+ *
+ * This template enumerates all elements in a finite group. It accepts
+ * the following template parameters:
+ *
+ * \tparam Multiply      The multiplication operation that multiplies two group elements
+ *                       with each other.
+ * \tparam Equality      The equality check operation that checks if two group elements
+ *                       are equal to another.
+ * \tparam id            The identity element
+ * \tparam Generators_   A list of (possibly redundant) generators of the group
+ */
+template <template <typename, typename> class Multiply, template <typename, typename> class Equality, typename id,
+          typename Generators_>
 struct enumerate_group_elements
-  : public enumerate_group_elements_noid<
-      Multiply,
-      Equality,
-      id,
-      typename strip_identities<Equality, id, Generators_>::type,
-      strip_identities<Equality, id, Generators_>::global_flags
-    >
-{
-};
+    : public enumerate_group_elements_noid<Multiply, Equality, id,
+                                           typename strip_identities<Equality, id, Generators_>::type,
+                                           strip_identities<Equality, id, Generators_>::global_flags> {};
 
-} // end namespace group_theory
+}  // end namespace group_theory
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_CXX11_TENSORSYMMETRY_TEMPLATEGROUPTHEORY_H
+#endif  // EIGEN_CXX11_TENSORSYMMETRY_TEMPLATEGROUPTHEORY_H
 
 /*
  * kate: space-indent on; indent-width 2; mixedindent off; indent-mode cstyle;
diff --git a/unsupported/Eigen/CXX11/src/util/CXX11Meta.h b/unsupported/Eigen/CXX11/src/util/CXX11Meta.h
index 5eb646a..74b47ce 100644
--- a/unsupported/Eigen/CXX11/src/util/CXX11Meta.h
+++ b/unsupported/Eigen/CXX11/src/util/CXX11Meta.h
@@ -15,4 +15,4 @@
 
 #include "CXX11Workarounds.h"
 
-#endif // EIGEN_CXX11META_H
+#endif  // EIGEN_CXX11META_H
diff --git a/unsupported/Eigen/CXX11/src/util/CXX11Workarounds.h b/unsupported/Eigen/CXX11/src/util/CXX11Workarounds.h
index 386e390..e3be69d 100644
--- a/unsupported/Eigen/CXX11/src/util/CXX11Workarounds.h
+++ b/unsupported/Eigen/CXX11/src/util/CXX11Workarounds.h
@@ -17,7 +17,8 @@
 #error Intel Compiler only supports required C++ features since version 13.1.
 // note that most stuff in principle works with 13.0 but when combining
 // some features, at some point 13.0 will just fail with an internal assertion
-#elif defined(__GNUC__) && !defined(__clang__) && !defined(__INTEL_COMPILER) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 6))
+#elif defined(__GNUC__) && !defined(__clang__) && !defined(__INTEL_COMPILER) && \
+    (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 6))
 // G++ < 4.6 by default will continue processing the source files - even if we use #error to make
 // it error out. For this reason, we use the pragma to make sure G++ aborts at the first error
 // it sees. Unfortunately, that is still not our #error directive, but at least the output is
@@ -34,10 +35,18 @@
 /* std::get is only constexpr in C++14, not yet in C++11
  */
 
-
-template<std::size_t I_, class T> constexpr inline T&       array_get(std::vector<T>&       a) { return a[I_]; }
-template<std::size_t I_, class T> constexpr inline T&&      array_get(std::vector<T>&&      a) { return a[I_]; }
-template<std::size_t I_, class T> constexpr inline T const& array_get(std::vector<T> const& a) { return a[I_]; }
+template <std::size_t I_, class T>
+constexpr inline T& array_get(std::vector<T>& a) {
+  return a[I_];
+}
+template <std::size_t I_, class T>
+constexpr inline T&& array_get(std::vector<T>&& a) {
+  return a[I_];
+}
+template <std::size_t I_, class T>
+constexpr inline T const& array_get(std::vector<T> const& a) {
+  return a[I_];
+}
 
 /* Suppose you have a template of the form
  * template<typename T> struct X;
@@ -54,10 +63,10 @@
  * so we have to create a workaround for this.
  */
 #if defined(__GNUC__) && !defined(__INTEL_COMPILER)
-#define EIGEN_TPL_PP_SPEC_HACK_DEF(mt, n)    mt... n
-#define EIGEN_TPL_PP_SPEC_HACK_DEFC(mt, n)   , EIGEN_TPL_PP_SPEC_HACK_DEF(mt, n)
-#define EIGEN_TPL_PP_SPEC_HACK_USE(n)        n...
-#define EIGEN_TPL_PP_SPEC_HACK_USEC(n)       , n...
+#define EIGEN_TPL_PP_SPEC_HACK_DEF(mt, n) mt... n
+#define EIGEN_TPL_PP_SPEC_HACK_DEFC(mt, n) , EIGEN_TPL_PP_SPEC_HACK_DEF(mt, n)
+#define EIGEN_TPL_PP_SPEC_HACK_USE(n) n...
+#define EIGEN_TPL_PP_SPEC_HACK_USEC(n) , n...
 #else
 #define EIGEN_TPL_PP_SPEC_HACK_DEF(mt, n)
 #define EIGEN_TPL_PP_SPEC_HACK_DEFC(mt, n)
@@ -65,11 +74,11 @@
 #define EIGEN_TPL_PP_SPEC_HACK_USEC(n)
 #endif
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_CXX11WORKAROUNDS_H
+#endif  // EIGEN_CXX11WORKAROUNDS_H
 
 /*
  * kate: space-indent on; indent-width 2; mixedindent off; indent-mode cstyle;
diff --git a/unsupported/Eigen/EulerAngles b/unsupported/Eigen/EulerAngles
index 3e4c74b..e95dd81 100644
--- a/unsupported/Eigen/EulerAngles
+++ b/unsupported/Eigen/EulerAngles
@@ -10,7 +10,6 @@
 #ifndef EIGEN_EULERANGLES_MODULE_H
 #define EIGEN_EULERANGLES_MODULE_H
 
-
 #include "../../Eigen/Core"
 #include "../../Eigen/Geometry"
 
@@ -19,19 +18,19 @@
 namespace Eigen {
 
 /**
-  * \defgroup EulerAngles_Module EulerAngles module
-  * \brief This module provides generic euler angles rotation.
-  *
-  * Euler angles are a way to represent 3D rotation.
-  *
-  * In order to use this module in your code, include this header:
-  * \code
-  * #include <unsupported/Eigen/EulerAngles>
-  * \endcode
-  *
-  * See \ref EulerAngles for more information.
-  *
-  */
+ * \defgroup EulerAngles_Module EulerAngles module
+ * \brief This module provides generic euler angles rotation.
+ *
+ * Euler angles are a way to represent 3D rotation.
+ *
+ * In order to use this module in your code, include this header:
+ * \code
+ * #include <unsupported/Eigen/EulerAngles>
+ * \endcode
+ *
+ * See \ref EulerAngles for more information.
+ *
+ */
 
 }
 
@@ -42,4 +41,4 @@
 
 #include "../../Eigen/src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_EULERANGLES_MODULE_H
+#endif  // EIGEN_EULERANGLES_MODULE_H
diff --git a/unsupported/Eigen/FFT b/unsupported/Eigen/FFT
index 0b4ce1a..630be1e 100644
--- a/unsupported/Eigen/FFT
+++ b/unsupported/Eigen/FFT
@@ -1,5 +1,5 @@
 // This file is part of Eigen, a lightweight C++ template library
-// for linear algebra. 
+// for linear algebra.
 //
 // Copyright (C) 2009 Mark Borgerding mark a borgerding net
 //
@@ -15,67 +15,68 @@
 #include <map>
 #include "../../Eigen/Core"
 
-
 /**
-  * \defgroup FFT_Module Fast Fourier Transform module
-  *
-  * \code
-  * #include <unsupported/Eigen/FFT>
-  * \endcode
-  *
-  * This module provides Fast Fourier transformation, with a configurable backend
-  * implementation.
-  *
-  * The default implementation is based on kissfft. It is a small, free, and
-  * reasonably efficient default.
-  *
-  * There are currently four implementation backend:
-  *
-  * - kissfft(https://github.com/mborgerding/kissfft) : Simple and not so fast, BSD-3-Clause.
-  *   It is a mixed-radix Fast Fourier Transform based up on the principle, "Keep It Simple, Stupid."
-  *   Notice that:kissfft fails to handle "atypically-sized" inputs(i.e., sizes with large factors),a workaround is using fftw or pocketfft.
-  * - fftw (http://www.fftw.org) : faster, GPL -- incompatible with Eigen in LGPL form, bigger code size.
-  * - MKL (https://www.intel.com/content/www/us/en/developer/tools/oneapi/onemkl-download.html) : fastest, free -- may be incompatible with Eigen in GPL form.
-  * - pocketfft (https://gitlab.mpcdf.mpg.de/mtr/pocketfft) : faster than kissfft, BSD 3-clause.
-  *   It is a heavily modified implementation of FFTPack, with the following advantages:
-  *   1.strictly C++11 compliant
-  *   2.more accurate twiddle factor computation
-  *   3.very fast plan generation
-  *   4.worst case complexity for transform sizes with large prime factors is N*log(N), because Bluestein's algorithm is used for these cases
-  *
-  * \section FFTDesign Design
-  *
-  * The following design decisions were made concerning scaling and
-  * half-spectrum for real FFT.
-  *
-  * The intent is to facilitate generic programming and ease migrating code
-  * from  Matlab/octave.
-  * We think the default behavior of Eigen/FFT should favor correctness and
-  * generality over speed. Of course, the caller should be able to "opt-out" from this
-  * behavior and get the speed increase if they want it.
-  *
-  * 1) %Scaling:
-  * Other libraries (FFTW,IMKL,KISSFFT)  do not perform scaling, so there
-  * is a constant gain incurred after the forward&inverse transforms , so 
-  * IFFT(FFT(x)) = Kx;  this is done to avoid a vector-by-value multiply.  
-  * The downside is that algorithms that worked correctly in Matlab/octave 
-  * don't behave the same way once implemented in C++.
-  *
-  * How Eigen/FFT differs: invertible scaling is performed so IFFT( FFT(x) ) = x. 
-  *
-  * 2) Real FFT half-spectrum
-  * Other libraries use only half the frequency spectrum (plus one extra 
-  * sample for the Nyquist bin) for a real FFT, the other half is the 
-  * conjugate-symmetric of the first half.  This saves them a copy and some 
-  * memory.  The downside is the caller needs to have special logic for the 
-  * number of bins in complex vs real.
-  *
-  * How Eigen/FFT differs: The full spectrum is returned from the forward 
-  * transform.  This facilitates generic template programming by obviating 
-  * separate specializations for real vs complex.  On the inverse
-  * transform, only half the spectrum is actually used if the output type is real.
-  */
- 
+ * \defgroup FFT_Module Fast Fourier Transform module
+ *
+ * \code
+ * #include <unsupported/Eigen/FFT>
+ * \endcode
+ *
+ * This module provides Fast Fourier transformation, with a configurable backend
+ * implementation.
+ *
+ * The default implementation is based on kissfft. It is a small, free, and
+ * reasonably efficient default.
+ *
+ * There are currently four implementation backend:
+ *
+ * - kissfft(https://github.com/mborgerding/kissfft) : Simple and not so fast, BSD-3-Clause.
+ *   It is a mixed-radix Fast Fourier Transform based up on the principle, "Keep It Simple, Stupid."
+ *   Notice that:kissfft fails to handle "atypically-sized" inputs(i.e., sizes with large factors),a workaround is using
+ * fftw or pocketfft.
+ * - fftw (http://www.fftw.org) : faster, GPL -- incompatible with Eigen in LGPL form, bigger code size.
+ * - MKL (https://www.intel.com/content/www/us/en/developer/tools/oneapi/onemkl-download.html) : fastest, free -- may be
+ * incompatible with Eigen in GPL form.
+ * - pocketfft (https://gitlab.mpcdf.mpg.de/mtr/pocketfft) : faster than kissfft, BSD 3-clause.
+ *   It is a heavily modified implementation of FFTPack, with the following advantages:
+ *   1.strictly C++11 compliant
+ *   2.more accurate twiddle factor computation
+ *   3.very fast plan generation
+ *   4.worst case complexity for transform sizes with large prime factors is N*log(N), because Bluestein's algorithm is
+ * used for these cases
+ *
+ * \section FFTDesign Design
+ *
+ * The following design decisions were made concerning scaling and
+ * half-spectrum for real FFT.
+ *
+ * The intent is to facilitate generic programming and ease migrating code
+ * from  Matlab/octave.
+ * We think the default behavior of Eigen/FFT should favor correctness and
+ * generality over speed. Of course, the caller should be able to "opt-out" from this
+ * behavior and get the speed increase if they want it.
+ *
+ * 1) %Scaling:
+ * Other libraries (FFTW,IMKL,KISSFFT)  do not perform scaling, so there
+ * is a constant gain incurred after the forward&inverse transforms , so
+ * IFFT(FFT(x)) = Kx;  this is done to avoid a vector-by-value multiply.
+ * The downside is that algorithms that worked correctly in Matlab/octave
+ * don't behave the same way once implemented in C++.
+ *
+ * How Eigen/FFT differs: invertible scaling is performed so IFFT( FFT(x) ) = x.
+ *
+ * 2) Real FFT half-spectrum
+ * Other libraries use only half the frequency spectrum (plus one extra
+ * sample for the Nyquist bin) for a real FFT, the other half is the
+ * conjugate-symmetric of the first half.  This saves them a copy and some
+ * memory.  The downside is the caller needs to have special logic for the
+ * number of bins in complex vs real.
+ *
+ * How Eigen/FFT differs: The full spectrum is returned from the forward
+ * transform.  This facilitates generic template programming by obviating
+ * separate specializations for real vs complex.  On the inverse
+ * transform, only half the spectrum is actually used if the output type is real.
+ */
 
 #include "../../Eigen/src/Core/util/DisableStupidWarnings.h"
 
@@ -83,356 +84,308 @@
 
 #ifdef EIGEN_FFTW_DEFAULT
 // FFTW: faster, GPL -- incompatible with Eigen in LGPL form, bigger code size
-#  include <fftw3.h>
-#  include "src/FFT/ei_fftw_impl.h"
-   namespace Eigen {
-     //template <typename T> typedef struct internal::fftw_impl  default_fft_impl; this does not work
-     template <typename T> struct default_fft_impl : public internal::fftw_impl<T> {};
-   }
+#include <fftw3.h>
+#include "src/FFT/ei_fftw_impl.h"
+namespace Eigen {
+// template <typename T> typedef struct internal::fftw_impl  default_fft_impl; this does not work
+template <typename T>
+struct default_fft_impl : public internal::fftw_impl<T> {};
+}  // namespace Eigen
 #elif defined EIGEN_MKL_DEFAULT
 // intel Math Kernel Library: fastest, free -- may be incompatible with Eigen in GPL form
-#  include "src/FFT/ei_imklfft_impl.h"
-   namespace Eigen {
-     template <typename T> struct default_fft_impl : public internal::imklfft::imklfft_impl<T> {};
-   }
+#include "src/FFT/ei_imklfft_impl.h"
+namespace Eigen {
+template <typename T>
+struct default_fft_impl : public internal::imklfft::imklfft_impl<T> {};
+}  // namespace Eigen
 #elif defined EIGEN_POCKETFFT_DEFAULT
 // internal::pocketfft_impl: a heavily modified implementation of FFTPack, with many advantages.
-# include<pocketfft_hdronly.h>
-# include"src/FFT/ei_pocketfft_impl.h"
-  namespace Eigen {
-     template <typename T>
-      struct default_fft_impl : public internal::pocketfft_impl<T> {};
-  }
-#else 
+#include <pocketfft_hdronly.h>
+#include "src/FFT/ei_pocketfft_impl.h"
+namespace Eigen {
+template <typename T>
+struct default_fft_impl : public internal::pocketfft_impl<T> {};
+}  // namespace Eigen
+#else
 // internal::kissfft_impl:  small, free, reasonably efficient default, derived from kissfft
-# include "src/FFT/ei_kissfft_impl.h"
-  namespace Eigen {
-     template <typename T> 
-       struct default_fft_impl : public internal::kissfft_impl<T> {};
-  }
+#include "src/FFT/ei_kissfft_impl.h"
+namespace Eigen {
+template <typename T>
+struct default_fft_impl : public internal::kissfft_impl<T> {};
+}  // namespace Eigen
 #endif
 
 // IWYU pragma: end_exports
 
 namespace Eigen {
 
- 
-// 
-template<typename T_SrcMat,typename T_FftIfc> struct fft_fwd_proxy;
-template<typename T_SrcMat,typename T_FftIfc> struct fft_inv_proxy;
+//
+template <typename T_SrcMat, typename T_FftIfc>
+struct fft_fwd_proxy;
+template <typename T_SrcMat, typename T_FftIfc>
+struct fft_inv_proxy;
 
 namespace internal {
-template<typename T_SrcMat,typename T_FftIfc>
-struct traits< fft_fwd_proxy<T_SrcMat,T_FftIfc> >
-{
+template <typename T_SrcMat, typename T_FftIfc>
+struct traits<fft_fwd_proxy<T_SrcMat, T_FftIfc> > {
   typedef typename T_SrcMat::PlainObject ReturnType;
 };
-template<typename T_SrcMat,typename T_FftIfc>
-struct traits< fft_inv_proxy<T_SrcMat,T_FftIfc> >
-{
+template <typename T_SrcMat, typename T_FftIfc>
+struct traits<fft_inv_proxy<T_SrcMat, T_FftIfc> > {
   typedef typename T_SrcMat::PlainObject ReturnType;
 };
-}
+}  // namespace internal
 
-template<typename T_SrcMat,typename T_FftIfc> 
-struct fft_fwd_proxy
- : public ReturnByValue<fft_fwd_proxy<T_SrcMat,T_FftIfc> >
-{
+template <typename T_SrcMat, typename T_FftIfc>
+struct fft_fwd_proxy : public ReturnByValue<fft_fwd_proxy<T_SrcMat, T_FftIfc> > {
   typedef DenseIndex Index;
 
-  fft_fwd_proxy(const T_SrcMat& src,T_FftIfc & fft, Index nfft) : m_src(src),m_ifc(fft), m_nfft(nfft) {}
+  fft_fwd_proxy(const T_SrcMat& src, T_FftIfc& fft, Index nfft) : m_src(src), m_ifc(fft), m_nfft(nfft) {}
 
-  template<typename T_DestMat> void evalTo(T_DestMat& dst) const;
+  template <typename T_DestMat>
+  void evalTo(T_DestMat& dst) const;
 
   Index rows() const { return m_src.rows(); }
   Index cols() const { return m_src.cols(); }
-protected:
-  const T_SrcMat & m_src;
-  T_FftIfc & m_ifc;
+
+ protected:
+  const T_SrcMat& m_src;
+  T_FftIfc& m_ifc;
   Index m_nfft;
 };
 
-template<typename T_SrcMat,typename T_FftIfc> 
-struct fft_inv_proxy
- : public ReturnByValue<fft_inv_proxy<T_SrcMat,T_FftIfc> >
-{
+template <typename T_SrcMat, typename T_FftIfc>
+struct fft_inv_proxy : public ReturnByValue<fft_inv_proxy<T_SrcMat, T_FftIfc> > {
   typedef DenseIndex Index;
 
-  fft_inv_proxy(const T_SrcMat& src,T_FftIfc & fft, Index nfft) : m_src(src),m_ifc(fft), m_nfft(nfft) {}
+  fft_inv_proxy(const T_SrcMat& src, T_FftIfc& fft, Index nfft) : m_src(src), m_ifc(fft), m_nfft(nfft) {}
 
-  template<typename T_DestMat> void evalTo(T_DestMat& dst) const;
+  template <typename T_DestMat>
+  void evalTo(T_DestMat& dst) const;
 
   Index rows() const { return m_src.rows(); }
   Index cols() const { return m_src.cols(); }
-protected:
-  const T_SrcMat & m_src;
-  T_FftIfc & m_ifc;
+
+ protected:
+  const T_SrcMat& m_src;
+  T_FftIfc& m_ifc;
   Index m_nfft;
 };
 
+template <typename T_Scalar, typename T_Impl = default_fft_impl<T_Scalar> >
+class FFT {
+ public:
+  typedef T_Impl impl_type;
+  typedef DenseIndex Index;
+  typedef typename impl_type::Scalar Scalar;
+  typedef typename impl_type::Complex Complex;
 
-template <typename T_Scalar,
-         typename T_Impl=default_fft_impl<T_Scalar> >
-class FFT
-{
-  public:
-    typedef T_Impl impl_type;
-    typedef DenseIndex Index;
-    typedef typename impl_type::Scalar Scalar;
-    typedef typename impl_type::Complex Complex;
+  using Flag = int;
+  static constexpr Flag Default = 0;
+  static constexpr Flag Unscaled = 1;
+  static constexpr Flag HalfSpectrum = 2;
+  static constexpr Flag Speedy = 32767;
 
-    using Flag = int;
-    static constexpr Flag Default = 0;
-    static constexpr Flag Unscaled = 1;
-    static constexpr Flag HalfSpectrum = 2;
-    static constexpr Flag Speedy = 32767;
+  FFT(const impl_type& impl = impl_type(), Flag flags = Default) : m_impl(impl), m_flag(flags) {
+    eigen_assert((flags == Default || flags == Unscaled || flags == HalfSpectrum || flags == Speedy) &&
+                 "invalid flags argument");
+  }
 
-    FFT( const impl_type & impl=impl_type() , Flag flags=Default ) :m_impl(impl),m_flag(flags) 
-    {
-        eigen_assert((flags == Default || flags == Unscaled || flags == HalfSpectrum || flags == Speedy) && "invalid flags argument");
-    }
+  inline bool HasFlag(Flag f) const { return (m_flag & (int)f) == f; }
 
-    inline
-    bool HasFlag(Flag f) const { return (m_flag & (int)f) == f;}
+  inline void SetFlag(Flag f) { m_flag |= (int)f; }
 
-    inline
-    void SetFlag(Flag f) { m_flag |= (int)f;}
+  inline void ClearFlag(Flag f) { m_flag &= (~(int)f); }
 
-    inline
-    void ClearFlag(Flag f) { m_flag &= (~(int)f);}
+  inline void fwd(Complex* dst, const Scalar* src, Index nfft) {
+    m_impl.fwd(dst, src, static_cast<int>(nfft));
+    if (HasFlag(HalfSpectrum) == false) ReflectSpectrum(dst, nfft);
+  }
 
-    inline
-    void fwd( Complex * dst, const Scalar * src, Index nfft)
-    {
-        m_impl.fwd(dst,src,static_cast<int>(nfft));
-        if ( HasFlag(HalfSpectrum) == false)
-          ReflectSpectrum(dst,nfft);
-    }
-
-    inline
-    void fwd( Complex * dst, const Complex * src, Index nfft)
-    {
-        m_impl.fwd(dst,src,static_cast<int>(nfft));
-    }
+  inline void fwd(Complex* dst, const Complex* src, Index nfft) { m_impl.fwd(dst, src, static_cast<int>(nfft)); }
 
 #if defined EIGEN_FFTW_DEFAULT || defined EIGEN_POCKETFFT_DEFAULT || defined EIGEN_MKL_DEFAULT
-    inline 
-    void fwd2(Complex * dst, const Complex * src, int n0,int n1)
-    {
-      m_impl.fwd2(dst,src,n0,n1);
-    }
+  inline void fwd2(Complex* dst, const Complex* src, int n0, int n1) { m_impl.fwd2(dst, src, n0, n1); }
 #endif
 
-    template <typename Input_>
-    inline
-    void fwd( std::vector<Complex> & dst, const std::vector<Input_> & src)
-    {
-      if ( NumTraits<Input_>::IsComplex == 0 && HasFlag(HalfSpectrum) )
-        dst.resize( (src.size()>>1)+1); // half the bins + Nyquist bin
-      else
-        dst.resize(src.size());
-      fwd(&dst[0],&src[0],src.size());
+  template <typename Input_>
+  inline void fwd(std::vector<Complex>& dst, const std::vector<Input_>& src) {
+    if (NumTraits<Input_>::IsComplex == 0 && HasFlag(HalfSpectrum))
+      dst.resize((src.size() >> 1) + 1);  // half the bins + Nyquist bin
+    else
+      dst.resize(src.size());
+    fwd(&dst[0], &src[0], src.size());
+  }
+
+  template <typename InputDerived, typename ComplexDerived>
+  inline void fwd(MatrixBase<ComplexDerived>& dst, const MatrixBase<InputDerived>& src, Index nfft = -1) {
+    typedef typename ComplexDerived::Scalar dst_type;
+    typedef typename InputDerived::Scalar src_type;
+    EIGEN_STATIC_ASSERT_VECTOR_ONLY(InputDerived)
+    EIGEN_STATIC_ASSERT_VECTOR_ONLY(ComplexDerived)
+    EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ComplexDerived, InputDerived)  // size at compile-time
+    EIGEN_STATIC_ASSERT(
+        (internal::is_same<dst_type, Complex>::value),
+        YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
+    EIGEN_STATIC_ASSERT(int(InputDerived::Flags) & int(ComplexDerived::Flags) & DirectAccessBit,
+                        THIS_METHOD_IS_ONLY_FOR_EXPRESSIONS_WITH_DIRECT_MEMORY_ACCESS_SUCH_AS_MAP_OR_PLAIN_MATRICES)
+
+    if (nfft < 1) nfft = src.size();
+
+    if (NumTraits<src_type>::IsComplex == 0 && HasFlag(HalfSpectrum))
+      dst.derived().resize((nfft >> 1) + 1);
+    else
+      dst.derived().resize(nfft);
+
+    if (src.innerStride() != 1 || src.size() < nfft) {
+      Matrix<src_type, 1, Dynamic> tmp;
+      if (src.size() < nfft) {
+        tmp.setZero(nfft);
+        tmp.block(0, 0, src.size(), 1) = src;
+      } else {
+        tmp = src;
+      }
+      fwd(&dst[0], &tmp[0], nfft);
+    } else {
+      fwd(&dst[0], &src[0], nfft);
     }
+  }
 
-    template<typename InputDerived, typename ComplexDerived>
-    inline
-    void fwd( MatrixBase<ComplexDerived> & dst, const MatrixBase<InputDerived> & src, Index nfft=-1)
-    {
-      typedef typename ComplexDerived::Scalar dst_type;
-      typedef typename InputDerived::Scalar src_type;
-      EIGEN_STATIC_ASSERT_VECTOR_ONLY(InputDerived)
-      EIGEN_STATIC_ASSERT_VECTOR_ONLY(ComplexDerived)
-      EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ComplexDerived,InputDerived) // size at compile-time
-      EIGEN_STATIC_ASSERT((internal::is_same<dst_type, Complex>::value),
-            YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
-      EIGEN_STATIC_ASSERT(int(InputDerived::Flags)&int(ComplexDerived::Flags)&DirectAccessBit,
-            THIS_METHOD_IS_ONLY_FOR_EXPRESSIONS_WITH_DIRECT_MEMORY_ACCESS_SUCH_AS_MAP_OR_PLAIN_MATRICES)
+  template <typename InputDerived>
+  inline fft_fwd_proxy<MatrixBase<InputDerived>, FFT<T_Scalar, T_Impl> > fwd(const MatrixBase<InputDerived>& src,
+                                                                             Index nfft = -1) {
+    return fft_fwd_proxy<MatrixBase<InputDerived>, FFT<T_Scalar, T_Impl> >(src, *this, nfft);
+  }
 
-      if (nfft<1)
+  template <typename InputDerived>
+  inline fft_inv_proxy<MatrixBase<InputDerived>, FFT<T_Scalar, T_Impl> > inv(const MatrixBase<InputDerived>& src,
+                                                                             Index nfft = -1) {
+    return fft_inv_proxy<MatrixBase<InputDerived>, FFT<T_Scalar, T_Impl> >(src, *this, nfft);
+  }
+
+  inline void inv(Complex* dst, const Complex* src, Index nfft) {
+    m_impl.inv(dst, src, static_cast<int>(nfft));
+    if (HasFlag(Unscaled) == false) scale(dst, Scalar(1. / nfft), nfft);  // scale the time series
+  }
+
+  inline void inv(Scalar* dst, const Complex* src, Index nfft) {
+    m_impl.inv(dst, src, static_cast<int>(nfft));
+    if (HasFlag(Unscaled) == false) scale(dst, Scalar(1. / nfft), nfft);  // scale the time series
+  }
+
+  template <typename OutputDerived, typename ComplexDerived>
+  inline void inv(MatrixBase<OutputDerived>& dst, const MatrixBase<ComplexDerived>& src, Index nfft = -1) {
+    typedef typename ComplexDerived::Scalar src_type;
+    typedef typename ComplexDerived::RealScalar real_type;
+    typedef typename OutputDerived::Scalar dst_type;
+    const bool realfft = (NumTraits<dst_type>::IsComplex == 0);
+    EIGEN_STATIC_ASSERT_VECTOR_ONLY(OutputDerived)
+    EIGEN_STATIC_ASSERT_VECTOR_ONLY(ComplexDerived)
+    EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ComplexDerived, OutputDerived)  // size at compile-time
+    EIGEN_STATIC_ASSERT(
+        (internal::is_same<src_type, Complex>::value),
+        YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
+    EIGEN_STATIC_ASSERT(int(OutputDerived::Flags) & int(ComplexDerived::Flags) & DirectAccessBit,
+                        THIS_METHOD_IS_ONLY_FOR_EXPRESSIONS_WITH_DIRECT_MEMORY_ACCESS_SUCH_AS_MAP_OR_PLAIN_MATRICES)
+
+    if (nfft < 1) {  // automatic FFT size determination
+      if (realfft && HasFlag(HalfSpectrum))
+        nfft = 2 * (src.size() - 1);  // assume even fft size
+      else
         nfft = src.size();
-
-      if ( NumTraits< src_type >::IsComplex == 0 && HasFlag(HalfSpectrum) )
-        dst.derived().resize( (nfft>>1)+1);
-      else
-        dst.derived().resize(nfft);
-
-      if ( src.innerStride() != 1 || src.size() < nfft ) {
-        Matrix<src_type,1,Dynamic> tmp;
-        if (src.size()<nfft) {
-          tmp.setZero(nfft);
-          tmp.block(0,0,src.size(),1 ) = src;
-        }else{
-          tmp = src;
-        }
-        fwd( &dst[0],&tmp[0],nfft );
-      }else{
-        fwd( &dst[0],&src[0],nfft );
-      }
     }
- 
-    template<typename InputDerived>
-    inline
-    fft_fwd_proxy< MatrixBase<InputDerived>, FFT<T_Scalar,T_Impl> >
-    fwd( const MatrixBase<InputDerived> & src, Index nfft=-1)
-    {
-      return fft_fwd_proxy< MatrixBase<InputDerived> ,FFT<T_Scalar,T_Impl> >( src, *this,nfft );
-    }
+    dst.derived().resize(nfft);
 
-    template<typename InputDerived>
-    inline
-    fft_inv_proxy< MatrixBase<InputDerived>, FFT<T_Scalar,T_Impl> >
-    inv( const MatrixBase<InputDerived> & src, Index nfft=-1)
-    {
-      return  fft_inv_proxy< MatrixBase<InputDerived> ,FFT<T_Scalar,T_Impl> >( src, *this,nfft );
-    }
+    // check for nfft that does not fit the input data size
+    Index resize_input = (realfft && HasFlag(HalfSpectrum)) ? ((nfft / 2 + 1) - src.size()) : (nfft - src.size());
 
-    inline
-    void inv( Complex * dst, const Complex * src, Index nfft)
-    {
-      m_impl.inv( dst,src,static_cast<int>(nfft) );
-      if ( HasFlag( Unscaled ) == false)
-        scale(dst,Scalar(1./nfft),nfft); // scale the time series
-    }
-
-    inline
-    void inv( Scalar * dst, const Complex * src, Index nfft)
-    {
-      m_impl.inv( dst,src,static_cast<int>(nfft) );
-      if ( HasFlag( Unscaled ) == false)
-        scale(dst,Scalar(1./nfft),nfft); // scale the time series
-    }
-
-    template<typename OutputDerived, typename ComplexDerived>
-    inline
-    void inv( MatrixBase<OutputDerived> & dst, const MatrixBase<ComplexDerived> & src, Index nfft=-1)
-    {
-      typedef typename ComplexDerived::Scalar src_type;
-      typedef typename ComplexDerived::RealScalar real_type;
-      typedef typename OutputDerived::Scalar dst_type;
-      const bool realfft= (NumTraits<dst_type>::IsComplex == 0);
-      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OutputDerived)
-      EIGEN_STATIC_ASSERT_VECTOR_ONLY(ComplexDerived)
-      EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ComplexDerived,OutputDerived) // size at compile-time
-      EIGEN_STATIC_ASSERT((internal::is_same<src_type, Complex>::value),
-            YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
-      EIGEN_STATIC_ASSERT(int(OutputDerived::Flags)&int(ComplexDerived::Flags)&DirectAccessBit,
-            THIS_METHOD_IS_ONLY_FOR_EXPRESSIONS_WITH_DIRECT_MEMORY_ACCESS_SUCH_AS_MAP_OR_PLAIN_MATRICES)
-
-      if (nfft<1) { //automatic FFT size determination
-        if ( realfft && HasFlag(HalfSpectrum) ) 
-          nfft = 2*(src.size()-1); //assume even fft size
-        else
-          nfft = src.size();
-      }
-      dst.derived().resize( nfft );
-
-      // check for nfft that does not fit the input data size
-      Index resize_input= ( realfft && HasFlag(HalfSpectrum) )
-        ? ( (nfft/2+1) - src.size() )
-        : ( nfft - src.size() );
-
-      if ( src.innerStride() != 1 || resize_input ) {
-        // if the vector is strided, then we need to copy it to a packed temporary
-        Matrix<src_type,1,Dynamic> tmp;
-        if ( resize_input ) {
-          size_t ncopy = (std::min)(src.size(),src.size() + resize_input);
-          tmp.setZero(src.size() + resize_input);
-          if ( realfft && HasFlag(HalfSpectrum) ) {
-            // pad at the Nyquist bin
-            tmp.head(ncopy) = src.head(ncopy);
-            tmp(ncopy-1) = real(tmp(ncopy-1)); // enforce real-only Nyquist bin
-          }else{
-            size_t nhead,ntail;
-            nhead = 1+ncopy/2-1; // range  [0:pi)
-            ntail = ncopy/2-1;   // range (-pi:0)
-            tmp.head(nhead) = src.head(nhead);
-            tmp.tail(ntail) = src.tail(ntail);
-            if (resize_input<0) { //shrinking -- create the Nyquist bin as the average of the two bins that fold into it
-              tmp(nhead) = ( src(nfft/2) + src( src.size() - nfft/2 ) )*real_type(.5);
-            }else{ // expanding -- split the old Nyquist bin into two halves
-              tmp(nhead) = src(nhead) * real_type(.5);
-              tmp(tmp.size()-nhead) = tmp(nhead);
-            }
+    if (src.innerStride() != 1 || resize_input) {
+      // if the vector is strided, then we need to copy it to a packed temporary
+      Matrix<src_type, 1, Dynamic> tmp;
+      if (resize_input) {
+        size_t ncopy = (std::min)(src.size(), src.size() + resize_input);
+        tmp.setZero(src.size() + resize_input);
+        if (realfft && HasFlag(HalfSpectrum)) {
+          // pad at the Nyquist bin
+          tmp.head(ncopy) = src.head(ncopy);
+          tmp(ncopy - 1) = real(tmp(ncopy - 1));  // enforce real-only Nyquist bin
+        } else {
+          size_t nhead, ntail;
+          nhead = 1 + ncopy / 2 - 1;  // range  [0:pi)
+          ntail = ncopy / 2 - 1;      // range (-pi:0)
+          tmp.head(nhead) = src.head(nhead);
+          tmp.tail(ntail) = src.tail(ntail);
+          if (resize_input <
+              0) {  // shrinking -- create the Nyquist bin as the average of the two bins that fold into it
+            tmp(nhead) = (src(nfft / 2) + src(src.size() - nfft / 2)) * real_type(.5);
+          } else {  // expanding -- split the old Nyquist bin into two halves
+            tmp(nhead) = src(nhead) * real_type(.5);
+            tmp(tmp.size() - nhead) = tmp(nhead);
           }
-        }else{
-          tmp = src;
         }
-        inv( &dst[0],&tmp[0], nfft);
-      }else{
-        inv( &dst[0],&src[0], nfft);
+      } else {
+        tmp = src;
       }
+      inv(&dst[0], &tmp[0], nfft);
+    } else {
+      inv(&dst[0], &src[0], nfft);
     }
+  }
 
-    template <typename Output_>
-    inline
-    void inv( std::vector<Output_> & dst, const std::vector<Complex> & src,Index nfft=-1)
-    {
-      if (nfft<1)
-        nfft = ( NumTraits<Output_>::IsComplex == 0 && HasFlag(HalfSpectrum) ) ? 2*(src.size()-1) : src.size();
-      dst.resize( nfft );
-      inv( &dst[0],&src[0],nfft);
-    }
-
+  template <typename Output_>
+  inline void inv(std::vector<Output_>& dst, const std::vector<Complex>& src, Index nfft = -1) {
+    if (nfft < 1)
+      nfft = (NumTraits<Output_>::IsComplex == 0 && HasFlag(HalfSpectrum)) ? 2 * (src.size() - 1) : src.size();
+    dst.resize(nfft);
+    inv(&dst[0], &src[0], nfft);
+  }
 
 #if defined EIGEN_FFTW_DEFAULT || defined EIGEN_POCKETFFT_DEFAULT || defined EIGEN_MKL_DEFAULT
-    inline 
-    void inv2(Complex * dst, const Complex * src, int n0,int n1)
-    {
-      m_impl.inv2(dst,src,n0,n1);
-      if ( HasFlag( Unscaled ) == false)
-          scale(dst,1./(n0*n1),n0*n1);
-    }
+  inline void inv2(Complex* dst, const Complex* src, int n0, int n1) {
+    m_impl.inv2(dst, src, n0, n1);
+    if (HasFlag(Unscaled) == false) scale(dst, 1. / (n0 * n1), n0 * n1);
+  }
 #endif
 
+  inline impl_type& impl() { return m_impl; }
 
-    inline
-    impl_type & impl() {return m_impl;}
-  private:
-
-    template <typename T_Data>
-    inline
-    void scale(T_Data * x,Scalar s,Index nx)
-    {
+ private:
+  template <typename T_Data>
+  inline void scale(T_Data* x, Scalar s, Index nx) {
 #if 1
-      for (int k=0;k<nx;++k)
-        *x++ *= s;
+    for (int k = 0; k < nx; ++k) *x++ *= s;
 #else
-      if ( ((ptrdiff_t)x) & 15 )
-        Matrix<T_Data, Dynamic, 1>::Map(x,nx) *= s;
-      else
-        Matrix<T_Data, Dynamic, 1>::MapAligned(x,nx) *= s;
-         //Matrix<T_Data, Dynamic, Dynamic>::Map(x,nx) * s;
-#endif  
-    }
+    if (((ptrdiff_t)x) & 15)
+      Matrix<T_Data, Dynamic, 1>::Map(x, nx) *= s;
+    else
+      Matrix<T_Data, Dynamic, 1>::MapAligned(x, nx) *= s;
+      // Matrix<T_Data, Dynamic, Dynamic>::Map(x,nx) * s;
+#endif
+  }
 
-    inline
-    void ReflectSpectrum(Complex * freq, Index nfft)
-    {
-      // create the implicit right-half spectrum (conjugate-mirror of the left-half)
-      Index nhbins=(nfft>>1)+1;
-      for (Index k=nhbins;k < nfft; ++k )
-        freq[k] = conj(freq[nfft-k]);
-    }
+  inline void ReflectSpectrum(Complex* freq, Index nfft) {
+    // create the implicit right-half spectrum (conjugate-mirror of the left-half)
+    Index nhbins = (nfft >> 1) + 1;
+    for (Index k = nhbins; k < nfft; ++k) freq[k] = conj(freq[nfft - k]);
+  }
 
-    impl_type m_impl;
-    int m_flag;
+  impl_type m_impl;
+  int m_flag;
 };
 
-template<typename T_SrcMat,typename T_FftIfc> 
-template<typename T_DestMat> inline 
-void fft_fwd_proxy<T_SrcMat,T_FftIfc>::evalTo(T_DestMat& dst) const
-{
-    m_ifc.fwd( dst, m_src, m_nfft);
+template <typename T_SrcMat, typename T_FftIfc>
+template <typename T_DestMat>
+inline void fft_fwd_proxy<T_SrcMat, T_FftIfc>::evalTo(T_DestMat& dst) const {
+  m_ifc.fwd(dst, m_src, m_nfft);
 }
 
-template<typename T_SrcMat,typename T_FftIfc> 
-template<typename T_DestMat> inline 
-void fft_inv_proxy<T_SrcMat,T_FftIfc>::evalTo(T_DestMat& dst) const
-{
-    m_ifc.inv( dst, m_src, m_nfft);
+template <typename T_SrcMat, typename T_FftIfc>
+template <typename T_DestMat>
+inline void fft_inv_proxy<T_SrcMat, T_FftIfc>::evalTo(T_DestMat& dst) const {
+  m_ifc.inv(dst, m_src, m_nfft);
 }
 
-}
+}  // namespace Eigen
 
 #include "../../Eigen/src/Core/util/ReenableStupidWarnings.h"
 
diff --git a/unsupported/Eigen/IterativeSolvers b/unsupported/Eigen/IterativeSolvers
index 5800e09..7efb299 100644
--- a/unsupported/Eigen/IterativeSolvers
+++ b/unsupported/Eigen/IterativeSolvers
@@ -14,67 +14,58 @@
 #include "../../Eigen/Jacobi"
 #include "../../Eigen/Householder"
 
-
 /**
-  * \defgroup IterativeLinearSolvers_Module Iterative Solvers module
-  * This module aims to provide various iterative linear and non linear solver algorithms.
-  * It currently provides:
-  *  - a Householder GMRES implementation
-  *  - an IDR(s) implementation
-  *  - a BiCGSTAB(L) implementation
-  *  - a DGMRES implementation
-  *  - a MINRES implementation
-  *  - a IDRSTABL implementation
-  *
-  * Choosing the best solver for solving \c A \c x = \c b depends a lot on the preconditioner chosen as well as the properties of \c A. The following flowchart might help you.
-  * \dot width=50%
-  * digraph g {
-* node [ fontname=Arial, fontsize=11];
-* edge [ fontname=Helvetica, fontsize=10 ];
-*	A1[label="hermitian",shape="box"];
-* A2[label="positive definite",shape="box"];
-* CG[shape="plaintext"];
-* A3[label="ill conditioned",shape="box"];
-* A4[label="good preconditioner",shape="box"];
-* A5[label="flexible preconditioner",shape="box"];
-* A6[label="strongly indefinite",shape="box"];
-* A8[label="large imaginary eigenvalue",shape="box"];
-* A7[label="large imaginary eigenvalue",shape="box"];
-*
-* SYMMLQ[shape="plaintext"];
-* MINRES[shape="plaintext"];
-* GCR[shape="plaintext"];
-* GMRES[shape="plaintext"];
-* IDRSTABL[shape="plaintext"];
-* IDRS[shape="plaintext"];
-* BICGSTABL[shape="plaintext"];
-* BICGSTAB[shape="plaintext"];
-*	
-*	A1 -> A2 [label="yes"];
-*	A2 -> CG [label="yes"];
-*	A2 -> A3 [label="no"];
-*	A3 -> SYMMLQ [label="yes"];
-*	A3 -> MINRES [label="no"];
-*
-*	A1 -> A4 [label="no"];
-*	A4 -> A5 [label="yes"];
-*	A5 -> GCR [label="yes"];
-*	A5 -> GMRES [label="no"];
-*
-*	A4 -> A6 [label="no"];
-*	A6 -> A8 [label="yes"];
-*	A6 -> A7 [label="no"];
-*	A7 -> BICGSTABL [label="yes"];
-*	A7 -> BICGSTAB [label="no"];
-*	A8 -> IDRSTABL [label="yes"];
-*	A8 -> IDRS [label="no"];
-* }
-  * \enddot
-  * \code
-  * #include <unsupported/Eigen/IterativeSolvers>
-  * \endcode
-  */
-
+ * \defgroup IterativeLinearSolvers_Module Iterative Solvers module
+ * This module aims to provide various iterative linear and non linear solver algorithms.
+ * It currently provides:
+ *  - a Householder GMRES implementation
+ *  - an IDR(s) implementation
+ *  - a BiCGSTAB(L) implementation
+ *  - a DGMRES implementation
+ *  - a MINRES implementation
+ *  - a IDRSTABL implementation
+ *
+ * Choosing the best solver for solving \c A \c x = \c b depends a lot on the preconditioner chosen as well as the
+ *properties of \c A. The following flowchart might help you. \dot width=50% digraph g { node [ fontname=Arial,
+ *fontsize=11]; edge [ fontname=Helvetica, fontsize=10 ]; A1[label="hermitian",shape="box"]; A2[label="positive
+ *definite",shape="box"]; CG[shape="plaintext"]; A3[label="ill conditioned",shape="box"]; A4[label="good
+ *preconditioner",shape="box"]; A5[label="flexible preconditioner",shape="box"]; A6[label="strongly
+ *indefinite",shape="box"]; A8[label="large imaginary eigenvalue",shape="box"]; A7[label="large imaginary
+ *eigenvalue",shape="box"];
+ *
+ * SYMMLQ[shape="plaintext"];
+ * MINRES[shape="plaintext"];
+ * GCR[shape="plaintext"];
+ * GMRES[shape="plaintext"];
+ * IDRSTABL[shape="plaintext"];
+ * IDRS[shape="plaintext"];
+ * BICGSTABL[shape="plaintext"];
+ * BICGSTAB[shape="plaintext"];
+ *
+ *	A1 -> A2 [label="yes"];
+ *	A2 -> CG [label="yes"];
+ *	A2 -> A3 [label="no"];
+ *	A3 -> SYMMLQ [label="yes"];
+ *	A3 -> MINRES [label="no"];
+ *
+ *	A1 -> A4 [label="no"];
+ *	A4 -> A5 [label="yes"];
+ *	A5 -> GCR [label="yes"];
+ *	A5 -> GMRES [label="no"];
+ *
+ *	A4 -> A6 [label="no"];
+ *	A6 -> A8 [label="yes"];
+ *	A6 -> A7 [label="no"];
+ *	A7 -> BICGSTABL [label="yes"];
+ *	A7 -> BICGSTAB [label="no"];
+ *	A8 -> IDRSTABL [label="yes"];
+ *	A8 -> IDRS [label="no"];
+ * }
+ * \enddot
+ * \code
+ * #include <unsupported/Eigen/IterativeSolvers>
+ * \endcode
+ */
 
 #include "../../Eigen/src/Core/util/DisableStupidWarnings.h"
 
@@ -90,5 +81,4 @@
 
 #include "../../Eigen/src/Core/util/ReenableStupidWarnings.h"
 
-
-#endif // EIGEN_ITERATIVE_SOLVERS_MODULE_H
+#endif  // EIGEN_ITERATIVE_SOLVERS_MODULE_H
diff --git a/unsupported/Eigen/KroneckerProduct b/unsupported/Eigen/KroneckerProduct
index 0dcb995..80432ea 100644
--- a/unsupported/Eigen/KroneckerProduct
+++ b/unsupported/Eigen/KroneckerProduct
@@ -15,16 +15,16 @@
 namespace Eigen {
 
 /**
-  * \defgroup KroneckerProduct_Module KroneckerProduct module
-  *
-  * This module contains an experimental Kronecker product implementation.
-  *
-  * \code
-  * #include <Eigen/KroneckerProduct>
-  * \endcode
-  */
+ * \defgroup KroneckerProduct_Module KroneckerProduct module
+ *
+ * This module contains an experimental Kronecker product implementation.
+ *
+ * \code
+ * #include <Eigen/KroneckerProduct>
+ * \endcode
+ */
 
-} // namespace Eigen
+}  // namespace Eigen
 
 // IWYU pragma: begin_exports
 #include "src/KroneckerProduct/KroneckerTensorProduct.h"
@@ -32,4 +32,4 @@
 
 #include "../../Eigen/src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_KRONECKER_PRODUCT_MODULE_H
+#endif  // EIGEN_KRONECKER_PRODUCT_MODULE_H
diff --git a/unsupported/Eigen/LevenbergMarquardt b/unsupported/Eigen/LevenbergMarquardt
index 96d1e67..72c6da2 100644
--- a/unsupported/Eigen/LevenbergMarquardt
+++ b/unsupported/Eigen/LevenbergMarquardt
@@ -20,14 +20,14 @@
 #include "../../Eigen/SparseQR"
 
 /**
-  * \defgroup LevenbergMarquardt_Module Levenberg-Marquardt module
-  *
-  * \code
-  * #include </Eigen/LevenbergMarquardt>
-  * \endcode
-  *
-  * 
-  */
+ * \defgroup LevenbergMarquardt_Module Levenberg-Marquardt module
+ *
+ * \code
+ * #include </Eigen/LevenbergMarquardt>
+ * \endcode
+ *
+ *
+ */
 
 #include "../../Eigen/SparseCore"
 
@@ -46,4 +46,4 @@
 
 #include "../../Eigen/src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_LEVENBERGMARQUARDT_MODULE_H
+#endif  // EIGEN_LEVENBERGMARQUARDT_MODULE_H
diff --git a/unsupported/Eigen/MPRealSupport b/unsupported/Eigen/MPRealSupport
index c4ea4ec..ba9d7c9 100644
--- a/unsupported/Eigen/MPRealSupport
+++ b/unsupported/Eigen/MPRealSupport
@@ -16,7 +16,7 @@
 #include <mpreal.h>
 
 namespace Eigen {
-  
+
 /**
   * \defgroup MPRealSupport_Module MPFRC++ Support module
   * \code
@@ -58,156 +58,153 @@
 \endcode
   *
   */
-	
-  template<> struct NumTraits<mpfr::mpreal>
-    : GenericNumTraits<mpfr::mpreal>
-  {
-    enum {
-      IsInteger = 0,
-      IsSigned = 1,
-      IsComplex = 0,
-      RequireInitialization = 1,
-      ReadCost = HugeCost,
-      AddCost  = HugeCost,
-      MulCost  = HugeCost
-    };
 
-    typedef mpfr::mpreal Real;
-    typedef mpfr::mpreal NonInteger;
-    
-    static inline Real highest  (long Precision = mpfr::mpreal::get_default_prec()) { return  mpfr::maxval(Precision); }
-    static inline Real lowest   (long Precision = mpfr::mpreal::get_default_prec()) { return -mpfr::maxval(Precision); }
-
-    // Constants
-    static inline Real Pi      (long Precision = mpfr::mpreal::get_default_prec())  { return mpfr::const_pi(Precision);        }
-    static inline Real Euler   (long Precision = mpfr::mpreal::get_default_prec())  { return mpfr::const_euler(Precision);     }
-    static inline Real Log2    (long Precision = mpfr::mpreal::get_default_prec())  { return mpfr::const_log2(Precision);      }
-    static inline Real Catalan (long Precision = mpfr::mpreal::get_default_prec())  { return mpfr::const_catalan(Precision);   }
-
-    static inline Real epsilon (long Precision = mpfr::mpreal::get_default_prec())  { return mpfr::machine_epsilon(Precision); }
-    static inline Real epsilon (const Real& x)                                      { return mpfr::machine_epsilon(x); }
-
-#ifdef MPREAL_HAVE_DYNAMIC_STD_NUMERIC_LIMITS
-    static inline int digits10 (long Precision = mpfr::mpreal::get_default_prec())  { return std::numeric_limits<Real>::digits10(Precision); }
-    static inline int digits10 (const Real& x)                                      { return std::numeric_limits<Real>::digits10(x); }
-    
-    static inline int digits ()               { return std::numeric_limits<Real>::digits(); }
-    static inline int digits (const Real& x)  { return std::numeric_limits<Real>::digits(x); }
-#endif
-
-    static inline Real dummy_precision()
-    {
-      mpfr_prec_t weak_prec = ((mpfr::mpreal::get_default_prec()-1) * 90) / 100;
-      return mpfr::machine_epsilon(weak_prec);
-    }
+template <>
+struct NumTraits<mpfr::mpreal> : GenericNumTraits<mpfr::mpreal> {
+  enum {
+    IsInteger = 0,
+    IsSigned = 1,
+    IsComplex = 0,
+    RequireInitialization = 1,
+    ReadCost = HugeCost,
+    AddCost = HugeCost,
+    MulCost = HugeCost
   };
 
-  namespace internal {
+  typedef mpfr::mpreal Real;
+  typedef mpfr::mpreal NonInteger;
 
-  template<> inline mpfr::mpreal random<mpfr::mpreal>()
-  {
-    return mpfr::random();
+  static inline Real highest(long Precision = mpfr::mpreal::get_default_prec()) { return mpfr::maxval(Precision); }
+  static inline Real lowest(long Precision = mpfr::mpreal::get_default_prec()) { return -mpfr::maxval(Precision); }
+
+  // Constants
+  static inline Real Pi(long Precision = mpfr::mpreal::get_default_prec()) { return mpfr::const_pi(Precision); }
+  static inline Real Euler(long Precision = mpfr::mpreal::get_default_prec()) { return mpfr::const_euler(Precision); }
+  static inline Real Log2(long Precision = mpfr::mpreal::get_default_prec()) { return mpfr::const_log2(Precision); }
+  static inline Real Catalan(long Precision = mpfr::mpreal::get_default_prec()) {
+    return mpfr::const_catalan(Precision);
   }
 
-  template<> inline mpfr::mpreal random<mpfr::mpreal>(const mpfr::mpreal& a, const mpfr::mpreal& b)
-  {
-    return a + (b-a) * random<mpfr::mpreal>();
+  static inline Real epsilon(long Precision = mpfr::mpreal::get_default_prec()) {
+    return mpfr::machine_epsilon(Precision);
   }
+  static inline Real epsilon(const Real& x) { return mpfr::machine_epsilon(x); }
 
-  inline bool isMuchSmallerThan(const mpfr::mpreal& a, const mpfr::mpreal& b, const mpfr::mpreal& eps)
-  {
-    return mpfr::abs(a) <= mpfr::abs(b) * eps;
+#ifdef MPREAL_HAVE_DYNAMIC_STD_NUMERIC_LIMITS
+  static inline int digits10(long Precision = mpfr::mpreal::get_default_prec()) {
+    return std::numeric_limits<Real>::digits10(Precision);
   }
+  static inline int digits10(const Real& x) { return std::numeric_limits<Real>::digits10(x); }
 
-  inline bool isApprox(const mpfr::mpreal& a, const mpfr::mpreal& b, const mpfr::mpreal& eps)
-  {
-    return mpfr::isEqualFuzzy(a,b,eps);
+  static inline int digits() { return std::numeric_limits<Real>::digits(); }
+  static inline int digits(const Real& x) { return std::numeric_limits<Real>::digits(x); }
+#endif
+
+  static inline Real dummy_precision() {
+    mpfr_prec_t weak_prec = ((mpfr::mpreal::get_default_prec() - 1) * 90) / 100;
+    return mpfr::machine_epsilon(weak_prec);
   }
+};
 
-  inline bool isApproxOrLessThan(const mpfr::mpreal& a, const mpfr::mpreal& b, const mpfr::mpreal& eps)
-  {
-    return a <= b || mpfr::isEqualFuzzy(a,b,eps);
-  }
+namespace internal {
 
-  template<> inline long double cast<mpfr::mpreal,long double>(const mpfr::mpreal& x)
-  { return x.toLDouble(); }
-
-  template<> inline double cast<mpfr::mpreal,double>(const mpfr::mpreal& x)
-  { return x.toDouble(); }
-
-  template<> inline long cast<mpfr::mpreal,long>(const mpfr::mpreal& x)
-  { return x.toLong(); }
-
-  template<> inline int cast<mpfr::mpreal,int>(const mpfr::mpreal& x)
-  { return int(x.toLong()); }
-
-  // Specialize GEBP kernel and traits for mpreal (no need for peeling, nor complicated stuff)
-  // This also permits to directly call mpfr's routines and avoid many temporaries produced by mpreal
-    template<>
-    class gebp_traits<mpfr::mpreal, mpfr::mpreal, false, false>
-    {
-    public:
-      typedef mpfr::mpreal ResScalar;
-      enum {
-        Vectorizable = false,
-        LhsPacketSize = 1,
-        RhsPacketSize = 1,
-        ResPacketSize = 1,
-        NumberOfRegisters = 1,
-        nr = 1,
-        mr = 1,
-        LhsProgress = 1,
-        RhsProgress = 1
-      };
-      typedef ResScalar LhsPacket;
-      typedef ResScalar RhsPacket;
-      typedef ResScalar ResPacket;
-      typedef LhsPacket LhsPacket4Packing;
-      
-    };
-
-
-
-    template<typename Index, typename DataMapper, bool ConjugateLhs, bool ConjugateRhs>
-    struct gebp_kernel<mpfr::mpreal,mpfr::mpreal,Index,DataMapper,1,1,ConjugateLhs,ConjugateRhs>
-    {
-      typedef mpfr::mpreal mpreal;
-
-      EIGEN_DONT_INLINE
-      void operator()(const DataMapper& res, const mpreal* blockA, const mpreal* blockB, 
-                      Index rows, Index depth, Index cols, const mpreal& alpha,
-                      Index strideA=-1, Index strideB=-1, Index offsetA=0, Index offsetB=0)
-      {
-        if(rows==0 || cols==0 || depth==0)
-          return;
-
-        mpreal  acc1(0,mpfr_get_prec(blockA[0].mpfr_srcptr())),
-                tmp (0,mpfr_get_prec(blockA[0].mpfr_srcptr()));
-
-        if(strideA==-1) strideA = depth;
-        if(strideB==-1) strideB = depth;
-
-        for(Index i=0; i<rows; ++i)
-        {
-          for(Index j=0; j<cols; ++j)
-          {
-            const mpreal *A = blockA + i*strideA + offsetA;
-            const mpreal *B = blockB + j*strideB + offsetB;
-            
-            acc1 = 0;
-            for(Index k=0; k<depth; k++)
-            {
-              mpfr_mul(tmp.mpfr_ptr(), A[k].mpfr_srcptr(), B[k].mpfr_srcptr(), mpreal::get_default_rnd());
-              mpfr_add(acc1.mpfr_ptr(), acc1.mpfr_ptr(), tmp.mpfr_ptr(),  mpreal::get_default_rnd());
-            }
-            
-            mpfr_mul(acc1.mpfr_ptr(), acc1.mpfr_srcptr(), alpha.mpfr_srcptr(), mpreal::get_default_rnd());
-            mpfr_add(res(i,j).mpfr_ptr(), res(i,j).mpfr_srcptr(), acc1.mpfr_srcptr(),  mpreal::get_default_rnd());
-          }
-        }
-      }
-    };
-  } // end namespace internal
+template <>
+inline mpfr::mpreal random<mpfr::mpreal>() {
+  return mpfr::random();
 }
 
-#endif // EIGEN_MPREALSUPPORT_MODULE_H
+template <>
+inline mpfr::mpreal random<mpfr::mpreal>(const mpfr::mpreal& a, const mpfr::mpreal& b) {
+  return a + (b - a) * random<mpfr::mpreal>();
+}
+
+inline bool isMuchSmallerThan(const mpfr::mpreal& a, const mpfr::mpreal& b, const mpfr::mpreal& eps) {
+  return mpfr::abs(a) <= mpfr::abs(b) * eps;
+}
+
+inline bool isApprox(const mpfr::mpreal& a, const mpfr::mpreal& b, const mpfr::mpreal& eps) {
+  return mpfr::isEqualFuzzy(a, b, eps);
+}
+
+inline bool isApproxOrLessThan(const mpfr::mpreal& a, const mpfr::mpreal& b, const mpfr::mpreal& eps) {
+  return a <= b || mpfr::isEqualFuzzy(a, b, eps);
+}
+
+template <>
+inline long double cast<mpfr::mpreal, long double>(const mpfr::mpreal& x) {
+  return x.toLDouble();
+}
+
+template <>
+inline double cast<mpfr::mpreal, double>(const mpfr::mpreal& x) {
+  return x.toDouble();
+}
+
+template <>
+inline long cast<mpfr::mpreal, long>(const mpfr::mpreal& x) {
+  return x.toLong();
+}
+
+template <>
+inline int cast<mpfr::mpreal, int>(const mpfr::mpreal& x) {
+  return int(x.toLong());
+}
+
+// Specialize GEBP kernel and traits for mpreal (no need for peeling, nor complicated stuff)
+// This also permits to directly call mpfr's routines and avoid many temporaries produced by mpreal
+template <>
+class gebp_traits<mpfr::mpreal, mpfr::mpreal, false, false> {
+ public:
+  typedef mpfr::mpreal ResScalar;
+  enum {
+    Vectorizable = false,
+    LhsPacketSize = 1,
+    RhsPacketSize = 1,
+    ResPacketSize = 1,
+    NumberOfRegisters = 1,
+    nr = 1,
+    mr = 1,
+    LhsProgress = 1,
+    RhsProgress = 1
+  };
+  typedef ResScalar LhsPacket;
+  typedef ResScalar RhsPacket;
+  typedef ResScalar ResPacket;
+  typedef LhsPacket LhsPacket4Packing;
+};
+
+template <typename Index, typename DataMapper, bool ConjugateLhs, bool ConjugateRhs>
+struct gebp_kernel<mpfr::mpreal, mpfr::mpreal, Index, DataMapper, 1, 1, ConjugateLhs, ConjugateRhs> {
+  typedef mpfr::mpreal mpreal;
+
+  EIGEN_DONT_INLINE void operator()(const DataMapper& res, const mpreal* blockA, const mpreal* blockB, Index rows,
+                                    Index depth, Index cols, const mpreal& alpha, Index strideA = -1,
+                                    Index strideB = -1, Index offsetA = 0, Index offsetB = 0) {
+    if (rows == 0 || cols == 0 || depth == 0) return;
+
+    mpreal acc1(0, mpfr_get_prec(blockA[0].mpfr_srcptr())), tmp(0, mpfr_get_prec(blockA[0].mpfr_srcptr()));
+
+    if (strideA == -1) strideA = depth;
+    if (strideB == -1) strideB = depth;
+
+    for (Index i = 0; i < rows; ++i) {
+      for (Index j = 0; j < cols; ++j) {
+        const mpreal* A = blockA + i * strideA + offsetA;
+        const mpreal* B = blockB + j * strideB + offsetB;
+
+        acc1 = 0;
+        for (Index k = 0; k < depth; k++) {
+          mpfr_mul(tmp.mpfr_ptr(), A[k].mpfr_srcptr(), B[k].mpfr_srcptr(), mpreal::get_default_rnd());
+          mpfr_add(acc1.mpfr_ptr(), acc1.mpfr_ptr(), tmp.mpfr_ptr(), mpreal::get_default_rnd());
+        }
+
+        mpfr_mul(acc1.mpfr_ptr(), acc1.mpfr_srcptr(), alpha.mpfr_srcptr(), mpreal::get_default_rnd());
+        mpfr_add(res(i, j).mpfr_ptr(), res(i, j).mpfr_srcptr(), acc1.mpfr_srcptr(), mpreal::get_default_rnd());
+      }
+    }
+  }
+};
+}  // end namespace internal
+}  // namespace Eigen
+
+#endif  // EIGEN_MPREALSUPPORT_MODULE_H
diff --git a/unsupported/Eigen/MatrixFunctions b/unsupported/Eigen/MatrixFunctions
index f46df5d..845ee0b 100644
--- a/unsupported/Eigen/MatrixFunctions
+++ b/unsupported/Eigen/MatrixFunctions
@@ -19,39 +19,39 @@
 #include "../../Eigen/Eigenvalues"
 
 /**
-  * \defgroup MatrixFunctions_Module Matrix functions module
-  * \brief This module aims to provide various methods for the computation of
-  * matrix functions. 
-  *
-  * To use this module, add 
-  * \code
-  * #include <unsupported/Eigen/MatrixFunctions>
-  * \endcode
-  * at the start of your source file.
-  *
-  * This module defines the following MatrixBase methods.
-  *  - \ref matrixbase_cos "MatrixBase::cos()", for computing the matrix cosine
-  *  - \ref matrixbase_cosh "MatrixBase::cosh()", for computing the matrix hyperbolic cosine
-  *  - \ref matrixbase_exp "MatrixBase::exp()", for computing the matrix exponential
-  *  - \ref matrixbase_log "MatrixBase::log()", for computing the matrix logarithm
-  *  - \ref matrixbase_pow "MatrixBase::pow()", for computing the matrix power
-  *  - \ref matrixbase_matrixfunction "MatrixBase::matrixFunction()", for computing general matrix functions
-  *  - \ref matrixbase_sin "MatrixBase::sin()", for computing the matrix sine
-  *  - \ref matrixbase_sinh "MatrixBase::sinh()", for computing the matrix hyperbolic sine
-  *  - \ref matrixbase_sqrt "MatrixBase::sqrt()", for computing the matrix square root
-  *
-  * These methods are the main entry points to this module. 
-  *
-  * %Matrix functions are defined as follows.  Suppose that \f$ f \f$
-  * is an entire function (that is, a function on the complex plane
-  * that is everywhere complex differentiable).  Then its Taylor
-  * series
-  * \f[ f(0) + f'(0) x + \frac{f''(0)}{2} x^2 + \frac{f'''(0)}{3!} x^3 + \cdots \f]
-  * converges to \f$ f(x) \f$. In this case, we can define the matrix
-  * function by the same series:
-  * \f[ f(M) = f(0) + f'(0) M + \frac{f''(0)}{2} M^2 + \frac{f'''(0)}{3!} M^3 + \cdots \f]
-  *
-  */
+ * \defgroup MatrixFunctions_Module Matrix functions module
+ * \brief This module aims to provide various methods for the computation of
+ * matrix functions.
+ *
+ * To use this module, add
+ * \code
+ * #include <unsupported/Eigen/MatrixFunctions>
+ * \endcode
+ * at the start of your source file.
+ *
+ * This module defines the following MatrixBase methods.
+ *  - \ref matrixbase_cos "MatrixBase::cos()", for computing the matrix cosine
+ *  - \ref matrixbase_cosh "MatrixBase::cosh()", for computing the matrix hyperbolic cosine
+ *  - \ref matrixbase_exp "MatrixBase::exp()", for computing the matrix exponential
+ *  - \ref matrixbase_log "MatrixBase::log()", for computing the matrix logarithm
+ *  - \ref matrixbase_pow "MatrixBase::pow()", for computing the matrix power
+ *  - \ref matrixbase_matrixfunction "MatrixBase::matrixFunction()", for computing general matrix functions
+ *  - \ref matrixbase_sin "MatrixBase::sin()", for computing the matrix sine
+ *  - \ref matrixbase_sinh "MatrixBase::sinh()", for computing the matrix hyperbolic sine
+ *  - \ref matrixbase_sqrt "MatrixBase::sqrt()", for computing the matrix square root
+ *
+ * These methods are the main entry points to this module.
+ *
+ * %Matrix functions are defined as follows.  Suppose that \f$ f \f$
+ * is an entire function (that is, a function on the complex plane
+ * that is everywhere complex differentiable).  Then its Taylor
+ * series
+ * \f[ f(0) + f'(0) x + \frac{f''(0)}{2} x^2 + \frac{f'''(0)}{3!} x^3 + \cdots \f]
+ * converges to \f$ f(x) \f$. In this case, we can define the matrix
+ * function by the same series:
+ * \f[ f(M) = f(0) + f'(0) M + \frac{f''(0)}{2} M^2 + \frac{f'''(0)}{3!} M^3 + \cdots \f]
+ *
+ */
 
 #include "../../Eigen/src/Core/util/DisableStupidWarnings.h"
 
@@ -65,8 +65,7 @@
 
 #include "../../Eigen/src/Core/util/ReenableStupidWarnings.h"
 
-
-/** 
+/**
 \page matrixbaseextra_page
 \ingroup MatrixFunctions_Module
 
@@ -182,7 +181,7 @@
 \param[in]  M  invertible matrix whose logarithm is to be computed.
 \returns    expression representing the matrix logarithm root of \p M.
 
-The matrix logarithm of \f$ M \f$ is a matrix \f$ X \f$ such that 
+The matrix logarithm of \f$ M \f$ is a matrix \f$ X \f$ such that
 \f$ \exp(X) = M \f$ where exp denotes the matrix exponential. As for
 the scalar logarithm, the equation \f$ \exp(X) = M \f$ may have
 multiple solutions; this function returns a matrix whose eigenvalues
@@ -209,14 +208,14 @@
 SIAM 2008. ISBN 978-0-898716-46-7.
 
 Example: The following program checks that
-\f[ \log \left[ \begin{array}{ccc} 
+\f[ \log \left[ \begin{array}{ccc}
       \frac12\sqrt2 & -\frac12\sqrt2 & 0 \\
       \frac12\sqrt2 & \frac12\sqrt2 & 0 \\
       0 & 0 & 1
     \end{array} \right] = \left[ \begin{array}{ccc}
-      0 & \frac14\pi & 0 \\ 
+      0 & \frac14\pi & 0 \\
       -\frac14\pi & 0 & 0 \\
-      0 & 0 & 0 
+      0 & 0 & 0
     \end{array} \right]. \f]
 This corresponds to a rotation of \f$ \frac14\pi \f$ radians around
 the z-axis. This is the inverse of the example used in the
@@ -228,7 +227,7 @@
 \note \p M has to be a matrix of \c float, \c double, `long
 double`, \c complex<float>, \c complex<double>, or `complex<long double>`.
 
-\sa MatrixBase::exp(), MatrixBase::matrixFunction(), 
+\sa MatrixBase::exp(), MatrixBase::matrixFunction(),
     class MatrixLogarithmAtomic, MatrixBase::sqrt().
 
 
@@ -290,7 +289,7 @@
        0, 0, 6, 7,
        0, 0, 8, 9;
   std::cout << A.pow(0.37) << std::endl;
-  
+
   // The 1 makes eigenvalue 0 non-semisimple.
   A.coeffRef(0, 1) = 1;
 
@@ -343,18 +342,18 @@
 Compute a matrix function.
 
 \code
-const MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::matrixFunction(typename internal::stem_function<typename internal::traits<Derived>::Scalar>::type f) const
-\endcode
+const MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::matrixFunction(typename internal::stem_function<typename
+internal::traits<Derived>::Scalar>::type f) const \endcode
 
 \param[in]  M  argument of matrix function, should be a square matrix.
 \param[in]  f  an entire function; \c f(x,n) should compute the n-th
 derivative of f at x.
 \returns  expression representing \p f applied to \p M.
 
-Suppose that \p M is a matrix whose entries have type \c Scalar. 
+Suppose that \p M is a matrix whose entries have type \c Scalar.
 Then, the second argument, \p f, should be a function with prototype
-\code 
-ComplexScalar f(ComplexScalar, int) 
+\code
+ComplexScalar f(ComplexScalar, int)
 \endcode
 where \c ComplexScalar = \c std::complex<Scalar> if \c Scalar is
 real (e.g., \c float or \c double) and \c ComplexScalar =
@@ -362,17 +361,17 @@
 should be \f$ f^{(n)}(x) \f$, the n-th derivative of f at x.
 
 This routine uses the algorithm described in:
-Philip Davies and Nicholas J. Higham, 
-"A Schur-Parlett algorithm for computing matrix functions", 
+Philip Davies and Nicholas J. Higham,
+"A Schur-Parlett algorithm for computing matrix functions",
 <em>SIAM J. %Matrix Anal. Applic.</em>, <b>25</b>:464&ndash;485, 2003.
 
 The actual work is done by the MatrixFunction class.
 
 Example: The following program checks that
-\f[ \exp \left[ \begin{array}{ccc} 
-      0 & \frac14\pi & 0 \\ 
+\f[ \exp \left[ \begin{array}{ccc}
+      0 & \frac14\pi & 0 \\
       -\frac14\pi & 0 & 0 \\
-      0 & 0 & 0 
+      0 & 0 & 0
     \end{array} \right] = \left[ \begin{array}{ccc}
       \frac12\sqrt2 & -\frac12\sqrt2 & 0 \\
       \frac12\sqrt2 & \frac12\sqrt2 & 0 \\
@@ -385,7 +384,7 @@
 \include MatrixFunction.cpp
 Output: \verbinclude MatrixFunction.out
 
-Note that the function \c expfn is defined for complex numbers 
+Note that the function \c expfn is defined for complex numbers
 \c x, even though the matrix \c A is over the reals. Instead of
 \c expfn, we could also have used StdStemFunctions::exp:
 \code
@@ -452,7 +451,7 @@
 it should have no eigenvalues which are real and negative (pairs of
 complex conjugate eigenvalues are allowed). In that case, the matrix
 has a square root which is also real, and this is the square root
-computed by this function. 
+computed by this function.
 
 The matrix square root is computed by first reducing the matrix to
 quasi-triangular form with the real Schur decomposition. The square
@@ -484,12 +483,12 @@
 52/53:127&ndash;140, 1983.
 
 Example: The following program checks that the square root of
-\f[ \left[ \begin{array}{cc} 
+\f[ \left[ \begin{array}{cc}
               \cos(\frac13\pi) & -\sin(\frac13\pi) \\
               \sin(\frac13\pi) & \cos(\frac13\pi)
     \end{array} \right], \f]
 corresponding to a rotation over 60 degrees, is a rotation over 30 degrees:
-\f[ \left[ \begin{array}{cc} 
+\f[ \left[ \begin{array}{cc}
               \cos(\frac16\pi) & -\sin(\frac16\pi) \\
               \sin(\frac16\pi) & \cos(\frac16\pi)
     \end{array} \right]. \f]
@@ -502,4 +501,4 @@
 
 */
 
-#endif // EIGEN_MATRIX_FUNCTIONS_MODULE_H
+#endif  // EIGEN_MATRIX_FUNCTIONS_MODULE_H
diff --git a/unsupported/Eigen/MoreVectorization b/unsupported/Eigen/MoreVectorization
index ea86fac..1d5cbbf 100644
--- a/unsupported/Eigen/MoreVectorization
+++ b/unsupported/Eigen/MoreVectorization
@@ -14,8 +14,8 @@
 namespace Eigen {
 
 /**
-  * \defgroup MoreVectorization More vectorization module
-  */
+ * \defgroup MoreVectorization More vectorization module
+ */
 
 }
 
@@ -23,4 +23,4 @@
 #include "src/MoreVectorization/MathFunctions.h"
 // IWYU pragma: end_exports
 
-#endif // EIGEN_MOREVECTORIZATION_MODULE_H
+#endif  // EIGEN_MOREVECTORIZATION_MODULE_H
diff --git a/unsupported/Eigen/NonLinearOptimization b/unsupported/Eigen/NonLinearOptimization
index 929c503..486dd4a 100644
--- a/unsupported/Eigen/NonLinearOptimization
+++ b/unsupported/Eigen/NonLinearOptimization
@@ -18,105 +18,105 @@
 #include "NumericalDiff"
 
 /**
-  * \defgroup NonLinearOptimization_Module Non linear optimization module
-  *
-  * \code
-  * #include <unsupported/Eigen/NonLinearOptimization>
-  * \endcode
-  *
-  * This module provides implementation of two important algorithms in non linear
-  * optimization. In both cases, we consider a system of non linear functions. Of
-  * course, this should work, and even work very well if those functions are
-  * actually linear. But if this is so, you should probably better use other
-  * methods more fitted to this special case.
-  *
-  * One algorithm allows to find a least-squares solution of such a system
-  * (Levenberg-Marquardt algorithm) and the second one is used to find 
-  * a zero for the system (Powell hybrid "dogleg" method).
-  *
-  * This code is a port of minpack (http://en.wikipedia.org/wiki/MINPACK).
-  * Minpack is a very famous, old, robust and well renowned package, written in
-  * fortran. Those implementations have been carefully tuned, tested, and used
-  * for several decades.
-  *
-  * The original fortran code was automatically translated using f2c (http://en.wikipedia.org/wiki/F2c) in C,
-  * then c++, and then cleaned by several different authors.
-  * The last one of those cleanings being our starting point : 
-  * http://devernay.free.fr/hacks/cminpack.html
-  * 
-  * Finally, we ported this code to Eigen, creating classes and API
-  * coherent with Eigen. When possible, we switched to Eigen
-  * implementation, such as most linear algebra (vectors, matrices, stable norms).
-  *
-  * Doing so, we were very careful to check the tests we setup at the very
-  * beginning, which ensure that the same results are found.
-  *
-  * \section Tests Tests
-  * 
-  * The tests are placed in the file unsupported/test/NonLinear.cpp.
-  * 
-  * There are two kinds of tests : those that come from examples bundled with cminpack.
-  * They guaranty we get the same results as the original algorithms (value for 'x',
-  * for the number of evaluations of the function, and for the number of evaluations
-  * of the Jacobian if ever).
-  * 
-  * Other tests were added by myself at the very beginning of the 
-  * process and check the results for Levenberg-Marquardt using the reference data 
-  * on http://www.itl.nist.gov/div898/strd/nls/nls_main.shtml. Since then i've 
-  * carefully checked that the same results were obtained when modifying the
-  * code. Please note that we do not always get the exact same decimals as they do,
-  * but this is ok : they use 128bits float, and we do the tests using the C type 'double',
-  * which is 64 bits on most platforms (x86 and amd64, at least).
-  * I've performed those tests on several other implementations of Levenberg-Marquardt, and
-  * (c)minpack performs VERY well compared to those, both in accuracy and speed.
-  * 
-  * The documentation for running the tests is on the wiki
-  * http://eigen.tuxfamily.org/index.php?title=Tests
-  * 
-  * \section API API: overview of methods
-  * 
-  * Both algorithms needs a functor computing the Jacobian. It can be computed by
-  * hand, using auto-differentiation (see \ref AutoDiff_Module), or using numerical
-  * differences (see \ref NumericalDiff_Module). For instance:
-  *\code
-  * MyFunc func;
-  * NumericalDiff<MyFunc> func_with_num_diff(func);
-  * LevenbergMarquardt<NumericalDiff<MyFunc> > lm(func_with_num_diff);
-  * \endcode
-  * For HybridNonLinearSolver, the method solveNumericalDiff() does the above wrapping for
-  * you.
-  * 
-  * The methods LevenbergMarquardt.lmder1()/lmdif1()/lmstr1() and 
-  * HybridNonLinearSolver.hybrj1()/hybrd1() are specific methods from the original 
-  * minpack package that you probably should NOT use until you are porting a code that
-  * was previously using minpack. They just define a 'simple' API with default values 
-  * for some parameters.
-  * 
-  * All algorithms are provided using two APIs :
-  *     - one where the user inits the algorithm, and uses '*OneStep()' as much as he wants : 
-  * this way the caller have control over the steps
-  *     - one where the user just calls a method (optimize() or solve()) which will 
-  * handle the loop: init + loop until a stop condition is met. Those are provided for
-  *  convenience.
-  * 
-  * As an example, the method LevenbergMarquardt::minimize() is 
-  * implemented as follow: 
-  * \code
-  * Status LevenbergMarquardt<FunctorType,Scalar>::minimize(FVectorType  &x, const int mode)
-  * {
-  *     Status status = minimizeInit(x, mode);
-  *     do {
-  *         status = minimizeOneStep(x, mode);
-  *     } while (status==Running);
-  *     return status;
-  * }
-  * \endcode
-  * 
-  * \section examples Examples
-  * 
-  * The easiest way to understand how to use this module is by looking at the many examples in the file
-  * unsupported/test/NonLinearOptimization.cpp.
-  */
+ * \defgroup NonLinearOptimization_Module Non linear optimization module
+ *
+ * \code
+ * #include <unsupported/Eigen/NonLinearOptimization>
+ * \endcode
+ *
+ * This module provides implementation of two important algorithms in non linear
+ * optimization. In both cases, we consider a system of non linear functions. Of
+ * course, this should work, and even work very well if those functions are
+ * actually linear. But if this is so, you should probably better use other
+ * methods more fitted to this special case.
+ *
+ * One algorithm allows to find a least-squares solution of such a system
+ * (Levenberg-Marquardt algorithm) and the second one is used to find
+ * a zero for the system (Powell hybrid "dogleg" method).
+ *
+ * This code is a port of minpack (http://en.wikipedia.org/wiki/MINPACK).
+ * Minpack is a very famous, old, robust and well renowned package, written in
+ * fortran. Those implementations have been carefully tuned, tested, and used
+ * for several decades.
+ *
+ * The original fortran code was automatically translated using f2c (http://en.wikipedia.org/wiki/F2c) in C,
+ * then c++, and then cleaned by several different authors.
+ * The last one of those cleanings being our starting point :
+ * http://devernay.free.fr/hacks/cminpack.html
+ *
+ * Finally, we ported this code to Eigen, creating classes and API
+ * coherent with Eigen. When possible, we switched to Eigen
+ * implementation, such as most linear algebra (vectors, matrices, stable norms).
+ *
+ * Doing so, we were very careful to check the tests we setup at the very
+ * beginning, which ensure that the same results are found.
+ *
+ * \section Tests Tests
+ *
+ * The tests are placed in the file unsupported/test/NonLinear.cpp.
+ *
+ * There are two kinds of tests : those that come from examples bundled with cminpack.
+ * They guaranty we get the same results as the original algorithms (value for 'x',
+ * for the number of evaluations of the function, and for the number of evaluations
+ * of the Jacobian if ever).
+ *
+ * Other tests were added by myself at the very beginning of the
+ * process and check the results for Levenberg-Marquardt using the reference data
+ * on http://www.itl.nist.gov/div898/strd/nls/nls_main.shtml. Since then i've
+ * carefully checked that the same results were obtained when modifying the
+ * code. Please note that we do not always get the exact same decimals as they do,
+ * but this is ok : they use 128bits float, and we do the tests using the C type 'double',
+ * which is 64 bits on most platforms (x86 and amd64, at least).
+ * I've performed those tests on several other implementations of Levenberg-Marquardt, and
+ * (c)minpack performs VERY well compared to those, both in accuracy and speed.
+ *
+ * The documentation for running the tests is on the wiki
+ * http://eigen.tuxfamily.org/index.php?title=Tests
+ *
+ * \section API API: overview of methods
+ *
+ * Both algorithms needs a functor computing the Jacobian. It can be computed by
+ * hand, using auto-differentiation (see \ref AutoDiff_Module), or using numerical
+ * differences (see \ref NumericalDiff_Module). For instance:
+ *\code
+ * MyFunc func;
+ * NumericalDiff<MyFunc> func_with_num_diff(func);
+ * LevenbergMarquardt<NumericalDiff<MyFunc> > lm(func_with_num_diff);
+ * \endcode
+ * For HybridNonLinearSolver, the method solveNumericalDiff() does the above wrapping for
+ * you.
+ *
+ * The methods LevenbergMarquardt.lmder1()/lmdif1()/lmstr1() and
+ * HybridNonLinearSolver.hybrj1()/hybrd1() are specific methods from the original
+ * minpack package that you probably should NOT use until you are porting a code that
+ * was previously using minpack. They just define a 'simple' API with default values
+ * for some parameters.
+ *
+ * All algorithms are provided using two APIs :
+ *     - one where the user inits the algorithm, and uses '*OneStep()' as much as he wants :
+ * this way the caller have control over the steps
+ *     - one where the user just calls a method (optimize() or solve()) which will
+ * handle the loop: init + loop until a stop condition is met. Those are provided for
+ *  convenience.
+ *
+ * As an example, the method LevenbergMarquardt::minimize() is
+ * implemented as follow:
+ * \code
+ * Status LevenbergMarquardt<FunctorType,Scalar>::minimize(FVectorType  &x, const int mode)
+ * {
+ *     Status status = minimizeInit(x, mode);
+ *     do {
+ *         status = minimizeOneStep(x, mode);
+ *     } while (status==Running);
+ *     return status;
+ * }
+ * \endcode
+ *
+ * \section examples Examples
+ *
+ * The easiest way to understand how to use this module is by looking at the many examples in the file
+ * unsupported/test/NonLinearOptimization.cpp.
+ */
 
 // IWYU pragma: begin_exports
 #ifndef EIGEN_PARSED_BY_DOXYGEN
@@ -138,4 +138,4 @@
 #include "src/NonLinearOptimization/LevenbergMarquardt.h"
 // IWYU pragma: end_exports
 
-#endif // EIGEN_NONLINEAROPTIMIZATION_MODULE_H
+#endif  // EIGEN_NONLINEAROPTIMIZATION_MODULE_H
diff --git a/unsupported/Eigen/NumericalDiff b/unsupported/Eigen/NumericalDiff
index 542e51a..ed236c8 100644
--- a/unsupported/Eigen/NumericalDiff
+++ b/unsupported/Eigen/NumericalDiff
@@ -15,35 +15,35 @@
 namespace Eigen {
 
 /**
-  * \defgroup NumericalDiff_Module Numerical differentiation module
-  *
-  * \code
-  * #include <unsupported/Eigen/NumericalDiff>
-  * \endcode
-  *
-  * See http://en.wikipedia.org/wiki/Numerical_differentiation
-  *
-  * Warning : this should NOT be confused with automatic differentiation, which
-  * is a different method and has its own module in Eigen : \ref
-  * AutoDiff_Module.
-  *
-  * Currently only "Forward" and "Central" schemes are implemented. Those
-  * are basic methods, and there exist some more elaborated way of
-  * computing such approximates. They are implemented using both
-  * proprietary and free software, and usually requires linking to an
-  * external library. It is very easy for you to write a functor
-  * using such software, and the purpose is quite orthogonal to what we
-  * want to achieve with Eigen.
-  *
-  * This is why we will not provide wrappers for every great numerical
-  * differentiation software that exist, but should rather stick with those
-  * basic ones, that still are useful for testing.
-  *
-  * Also, the \ref NonLinearOptimization_Module needs this in order to
-  * provide full features compatibility with the original (c)minpack
-  * package.
-  *
-  */
+ * \defgroup NumericalDiff_Module Numerical differentiation module
+ *
+ * \code
+ * #include <unsupported/Eigen/NumericalDiff>
+ * \endcode
+ *
+ * See http://en.wikipedia.org/wiki/Numerical_differentiation
+ *
+ * Warning : this should NOT be confused with automatic differentiation, which
+ * is a different method and has its own module in Eigen : \ref
+ * AutoDiff_Module.
+ *
+ * Currently only "Forward" and "Central" schemes are implemented. Those
+ * are basic methods, and there exist some more elaborated way of
+ * computing such approximates. They are implemented using both
+ * proprietary and free software, and usually requires linking to an
+ * external library. It is very easy for you to write a functor
+ * using such software, and the purpose is quite orthogonal to what we
+ * want to achieve with Eigen.
+ *
+ * This is why we will not provide wrappers for every great numerical
+ * differentiation software that exist, but should rather stick with those
+ * basic ones, that still are useful for testing.
+ *
+ * Also, the \ref NonLinearOptimization_Module needs this in order to
+ * provide full features compatibility with the original (c)minpack
+ * package.
+ *
+ */
 }
 
 //@{
@@ -54,5 +54,4 @@
 
 //@}
 
-
-#endif // EIGEN_NUMERICALDIFF_MODULE_H
+#endif  // EIGEN_NUMERICALDIFF_MODULE_H
diff --git a/unsupported/Eigen/OpenGLSupport b/unsupported/Eigen/OpenGLSupport
index 2468333..f22ae56 100644
--- a/unsupported/Eigen/OpenGLSupport
+++ b/unsupported/Eigen/OpenGLSupport
@@ -13,310 +13,338 @@
 #include "../../Eigen/Geometry"
 
 #if defined(__APPLE_CC__)
-  #include <OpenGL/gl.h>
+#include <OpenGL/gl.h>
 #else
-  #include <GL/gl.h>
+#include <GL/gl.h>
 #endif
 
 namespace Eigen {
 
 /**
-  * \defgroup OpenGLSUpport_Module OpenGL Support module
-  *
-  * This module provides wrapper functions for a couple of OpenGL functions
-  * which simplify the way to pass Eigen's object to openGL.
-  * Here is an example:
-  * 
-  * \code
-  * // You need to add path_to_eigen/unsupported to your include path.
-  * #include <Eigen/OpenGLSupport>
-  * // ...
-  * Vector3f x, y;
-  * Matrix3f rot;
-  * 
-  * glVertex(y + x * rot);
-  * 
-  * Quaternion q;
-  * glRotate(q);
-  * 
-  * // ...
-  * \endcode
-  *
-  */
+ * \defgroup OpenGLSUpport_Module OpenGL Support module
+ *
+ * This module provides wrapper functions for a couple of OpenGL functions
+ * which simplify the way to pass Eigen's object to openGL.
+ * Here is an example:
+ *
+ * \code
+ * // You need to add path_to_eigen/unsupported to your include path.
+ * #include <Eigen/OpenGLSupport>
+ * // ...
+ * Vector3f x, y;
+ * Matrix3f rot;
+ *
+ * glVertex(y + x * rot);
+ *
+ * Quaternion q;
+ * glRotate(q);
+ *
+ * // ...
+ * \endcode
+ *
+ */
 //@{
 
-#define EIGEN_GL_FUNC_DECLARATION(FUNC)                                                                             \
-namespace internal {                                                                                                \
-  template< typename XprType,                                                                                       \
-            typename Scalar = typename XprType::Scalar,                                                             \
-            int Rows = XprType::RowsAtCompileTime,                                                                  \
-            int Cols = XprType::ColsAtCompileTime,                                                                  \
-            bool IsGLCompatible = bool(internal::evaluator<XprType>::Flags&LinearAccessBit)                         \
-                              && bool(XprType::Flags&DirectAccessBit)                                               \
-                              && (XprType::IsVectorAtCompileTime || (XprType::Flags&RowMajorBit)==0)>               \
-  struct EIGEN_CAT(EIGEN_CAT(gl_,FUNC),_impl);                                                                      \
-                                                                                                                    \
-  template<typename XprType, typename Scalar, int Rows, int Cols>                                                   \
-  struct EIGEN_CAT(EIGEN_CAT(gl_,FUNC),_impl)<XprType,Scalar,Rows,Cols,false> {                                     \
-    inline static void run(const XprType& p) {                                                                      \
-      EIGEN_CAT(EIGEN_CAT(gl_,FUNC),_impl)<typename plain_matrix_type_column_major<XprType>::type>::run(p); }       \
-  };                                                                                                                \
-}                                                                                                                   \
-                                                                                                                    \
-template<typename Derived> inline void FUNC(const Eigen::DenseBase<Derived>& p) {                                   \
-  EIGEN_CAT(EIGEN_CAT(internal::gl_,FUNC),_impl)<Derived>::run(p.derived());                                        \
-}
+#define EIGEN_GL_FUNC_DECLARATION(FUNC)                                                                          \
+  namespace internal {                                                                                           \
+  template <typename XprType, typename Scalar = typename XprType::Scalar, int Rows = XprType::RowsAtCompileTime, \
+            int Cols = XprType::ColsAtCompileTime,                                                               \
+            bool IsGLCompatible = bool(internal::evaluator<XprType>::Flags & LinearAccessBit) &&                 \
+                                  bool(XprType::Flags & DirectAccessBit) &&                                      \
+                                  (XprType::IsVectorAtCompileTime || (XprType::Flags & RowMajorBit) == 0)>       \
+  struct EIGEN_CAT(EIGEN_CAT(gl_, FUNC), _impl);                                                                 \
+                                                                                                                 \
+  template <typename XprType, typename Scalar, int Rows, int Cols>                                               \
+  struct EIGEN_CAT(EIGEN_CAT(gl_, FUNC), _impl)<XprType, Scalar, Rows, Cols, false> {                            \
+    inline static void run(const XprType& p) {                                                                   \
+      EIGEN_CAT(EIGEN_CAT(gl_, FUNC), _impl)<typename plain_matrix_type_column_major<XprType>::type>::run(p);    \
+    }                                                                                                            \
+  };                                                                                                             \
+  }                                                                                                              \
+                                                                                                                 \
+  template <typename Derived>                                                                                    \
+  inline void FUNC(const Eigen::DenseBase<Derived>& p) {                                                         \
+    EIGEN_CAT(EIGEN_CAT(internal::gl_, FUNC), _impl)<Derived>::run(p.derived());                                 \
+  }
 
+#define EIGEN_GL_FUNC_SPECIALIZATION_MAT(FUNC, SCALAR, ROWS, COLS, SUFFIX)           \
+  namespace internal {                                                               \
+  template <typename XprType>                                                        \
+  struct EIGEN_CAT(EIGEN_CAT(gl_, FUNC), _impl)<XprType, SCALAR, ROWS, COLS, true> { \
+    inline static void run(const XprType& p) { FUNC##SUFFIX(p.data()); }             \
+  };                                                                                 \
+  }
 
-#define EIGEN_GL_FUNC_SPECIALIZATION_MAT(FUNC,SCALAR,ROWS,COLS,SUFFIX)                                              \
-namespace internal {                                                                                                \
-  template< typename XprType> struct EIGEN_CAT(EIGEN_CAT(gl_,FUNC),_impl)<XprType, SCALAR, ROWS, COLS, true> {      \
-    inline static void run(const XprType& p) { FUNC##SUFFIX(p.data()); }                                            \
-  };                                                                                                                \
-}
+#define EIGEN_GL_FUNC_SPECIALIZATION_VEC(FUNC, SCALAR, SIZE, SUFFIX)              \
+  namespace internal {                                                            \
+  template <typename XprType>                                                     \
+  struct EIGEN_CAT(EIGEN_CAT(gl_, FUNC), _impl)<XprType, SCALAR, SIZE, 1, true> { \
+    inline static void run(const XprType& p) { FUNC##SUFFIX(p.data()); }          \
+  };                                                                              \
+  template <typename XprType>                                                     \
+  struct EIGEN_CAT(EIGEN_CAT(gl_, FUNC), _impl)<XprType, SCALAR, 1, SIZE, true> { \
+    inline static void run(const XprType& p) { FUNC##SUFFIX(p.data()); }          \
+  };                                                                              \
+  }
 
-  
-#define EIGEN_GL_FUNC_SPECIALIZATION_VEC(FUNC,SCALAR,SIZE,SUFFIX)                                                   \
-namespace internal {                                                                                                \
-  template< typename XprType> struct EIGEN_CAT(EIGEN_CAT(gl_,FUNC),_impl)<XprType, SCALAR, SIZE, 1, true> {         \
-    inline static void run(const XprType& p) { FUNC##SUFFIX(p.data()); }                                            \
-  };                                                                                                                \
-  template< typename XprType> struct EIGEN_CAT(EIGEN_CAT(gl_,FUNC),_impl)<XprType, SCALAR, 1, SIZE, true> {         \
-    inline static void run(const XprType& p) { FUNC##SUFFIX(p.data()); }                                            \
-  };                                                                                                                \
-}
+EIGEN_GL_FUNC_DECLARATION(glVertex)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex, int, 2, 2iv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex, short, 2, 2sv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex, float, 2, 2fv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex, double, 2, 2dv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex, int, 3, 3iv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex, short, 3, 3sv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex, float, 3, 3fv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex, double, 3, 3dv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex, int, 4, 4iv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex, short, 4, 4sv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex, float, 4, 4fv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex, double, 4, 4dv)
 
-  
-EIGEN_GL_FUNC_DECLARATION       (glVertex)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex,int,    2,2iv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex,short,  2,2sv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex,float,  2,2fv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex,double, 2,2dv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex,int,    3,3iv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex,short,  3,3sv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex,float,  3,3fv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex,double, 3,3dv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex,int,    4,4iv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex,short,  4,4sv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex,float,  4,4fv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glVertex,double, 4,4dv)
+EIGEN_GL_FUNC_DECLARATION(glTexCoord)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord, int, 2, 2iv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord, short, 2, 2sv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord, float, 2, 2fv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord, double, 2, 2dv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord, int, 3, 3iv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord, short, 3, 3sv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord, float, 3, 3fv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord, double, 3, 3dv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord, int, 4, 4iv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord, short, 4, 4sv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord, float, 4, 4fv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord, double, 4, 4dv)
 
-EIGEN_GL_FUNC_DECLARATION       (glTexCoord)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord,int,    2,2iv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord,short,  2,2sv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord,float,  2,2fv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord,double, 2,2dv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord,int,    3,3iv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord,short,  3,3sv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord,float,  3,3fv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord,double, 3,3dv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord,int,    4,4iv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord,short,  4,4sv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord,float,  4,4fv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTexCoord,double, 4,4dv)
+EIGEN_GL_FUNC_DECLARATION(glColor)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor, int, 2, 2iv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor, short, 2, 2sv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor, float, 2, 2fv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor, double, 2, 2dv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor, int, 3, 3iv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor, short, 3, 3sv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor, float, 3, 3fv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor, double, 3, 3dv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor, int, 4, 4iv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor, short, 4, 4sv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor, float, 4, 4fv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor, double, 4, 4dv)
 
-EIGEN_GL_FUNC_DECLARATION       (glColor)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor,int,    2,2iv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor,short,  2,2sv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor,float,  2,2fv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor,double, 2,2dv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor,int,    3,3iv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor,short,  3,3sv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor,float,  3,3fv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor,double, 3,3dv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor,int,    4,4iv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor,short,  4,4sv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor,float,  4,4fv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glColor,double, 4,4dv)
+EIGEN_GL_FUNC_DECLARATION(glNormal)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glNormal, int, 3, 3iv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glNormal, short, 3, 3sv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glNormal, float, 3, 3fv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glNormal, double, 3, 3dv)
 
-EIGEN_GL_FUNC_DECLARATION       (glNormal)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glNormal,int,    3,3iv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glNormal,short,  3,3sv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glNormal,float,  3,3fv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glNormal,double, 3,3dv)
-
-inline void glScale2fv(const float*  v) { glScalef(v[0], v[1], 1.f);  }
-inline void glScale2dv(const double* v) { glScaled(v[0], v[1], 1.0);  }
-inline void glScale3fv(const float*  v) { glScalef(v[0], v[1], v[2]); }
+inline void glScale2fv(const float* v) { glScalef(v[0], v[1], 1.f); }
+inline void glScale2dv(const double* v) { glScaled(v[0], v[1], 1.0); }
+inline void glScale3fv(const float* v) { glScalef(v[0], v[1], v[2]); }
 inline void glScale3dv(const double* v) { glScaled(v[0], v[1], v[2]); }
 
-EIGEN_GL_FUNC_DECLARATION       (glScale)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glScale,float,  2,2fv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glScale,double, 2,2dv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glScale,float,  3,3fv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glScale,double, 3,3dv)
+EIGEN_GL_FUNC_DECLARATION(glScale)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glScale, float, 2, 2fv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glScale, double, 2, 2dv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glScale, float, 3, 3fv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glScale, double, 3, 3dv)
 
-template<typename Scalar> void glScale(const UniformScaling<Scalar>& s)  { glScale(Matrix<Scalar,3,1>::Constant(s.factor())); }
+template <typename Scalar>
+void glScale(const UniformScaling<Scalar>& s) {
+  glScale(Matrix<Scalar, 3, 1>::Constant(s.factor()));
+}
 
-inline void glTranslate2fv(const float*  v) { glTranslatef(v[0], v[1], 0.f);  }
-inline void glTranslate2dv(const double* v) { glTranslated(v[0], v[1], 0.0);  }
-inline void glTranslate3fv(const float*  v) { glTranslatef(v[0], v[1], v[2]); }
+inline void glTranslate2fv(const float* v) { glTranslatef(v[0], v[1], 0.f); }
+inline void glTranslate2dv(const double* v) { glTranslated(v[0], v[1], 0.0); }
+inline void glTranslate3fv(const float* v) { glTranslatef(v[0], v[1], v[2]); }
 inline void glTranslate3dv(const double* v) { glTranslated(v[0], v[1], v[2]); }
 
-EIGEN_GL_FUNC_DECLARATION       (glTranslate)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTranslate,float,  2,2fv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTranslate,double, 2,2dv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTranslate,float,  3,3fv)
-EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTranslate,double, 3,3dv)
+EIGEN_GL_FUNC_DECLARATION(glTranslate)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTranslate, float, 2, 2fv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTranslate, double, 2, 2dv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTranslate, float, 3, 3fv)
+EIGEN_GL_FUNC_SPECIALIZATION_VEC(glTranslate, double, 3, 3dv)
 
-template<typename Scalar> void glTranslate(const Translation<Scalar,2>& t)  { glTranslate(t.vector()); }
-template<typename Scalar> void glTranslate(const Translation<Scalar,3>& t)  { glTranslate(t.vector()); }
-
-EIGEN_GL_FUNC_DECLARATION       (glMultMatrix)
-EIGEN_GL_FUNC_SPECIALIZATION_MAT(glMultMatrix,float,  4,4,f)
-EIGEN_GL_FUNC_SPECIALIZATION_MAT(glMultMatrix,double, 4,4,d)
-
-template<typename Scalar> void glMultMatrix(const Transform<Scalar,3,Affine>& t)        { glMultMatrix(t.matrix()); }
-template<typename Scalar> void glMultMatrix(const Transform<Scalar,3,Projective>& t)    { glMultMatrix(t.matrix()); }
-template<typename Scalar> void glMultMatrix(const Transform<Scalar,3,AffineCompact>& t) { glMultMatrix(Transform<Scalar,3,Affine>(t).matrix()); }
-
-EIGEN_GL_FUNC_DECLARATION       (glLoadMatrix)
-EIGEN_GL_FUNC_SPECIALIZATION_MAT(glLoadMatrix,float,  4,4,f)
-EIGEN_GL_FUNC_SPECIALIZATION_MAT(glLoadMatrix,double, 4,4,d)
-
-template<typename Scalar> void glLoadMatrix(const Transform<Scalar,3,Affine>& t)        { glLoadMatrix(t.matrix()); }
-template<typename Scalar> void glLoadMatrix(const Transform<Scalar,3,Projective>& t)    { glLoadMatrix(t.matrix()); }
-template<typename Scalar> void glLoadMatrix(const Transform<Scalar,3,AffineCompact>& t) { glLoadMatrix(Transform<Scalar,3,Affine>(t).matrix()); }
-
-inline void glRotate(const Rotation2D<float>& rot)
-{
-  glRotatef(rot.angle()*180.f/float(EIGEN_PI), 0.f, 0.f, 1.f);
+template <typename Scalar>
+void glTranslate(const Translation<Scalar, 2>& t) {
+  glTranslate(t.vector());
 }
-inline void glRotate(const Rotation2D<double>& rot)
-{
-  glRotated(rot.angle()*180.0/double(EIGEN_PI), 0.0, 0.0, 1.0);
+template <typename Scalar>
+void glTranslate(const Translation<Scalar, 3>& t) {
+  glTranslate(t.vector());
 }
 
-template<typename Derived> void glRotate(const RotationBase<Derived,3>& rot)
-{  
-  Transform<typename Derived::Scalar,3,Projective> tr(rot);
+EIGEN_GL_FUNC_DECLARATION(glMultMatrix)
+EIGEN_GL_FUNC_SPECIALIZATION_MAT(glMultMatrix, float, 4, 4, f)
+EIGEN_GL_FUNC_SPECIALIZATION_MAT(glMultMatrix, double, 4, 4, d)
+
+template <typename Scalar>
+void glMultMatrix(const Transform<Scalar, 3, Affine>& t) {
+  glMultMatrix(t.matrix());
+}
+template <typename Scalar>
+void glMultMatrix(const Transform<Scalar, 3, Projective>& t) {
+  glMultMatrix(t.matrix());
+}
+template <typename Scalar>
+void glMultMatrix(const Transform<Scalar, 3, AffineCompact>& t) {
+  glMultMatrix(Transform<Scalar, 3, Affine>(t).matrix());
+}
+
+EIGEN_GL_FUNC_DECLARATION(glLoadMatrix)
+EIGEN_GL_FUNC_SPECIALIZATION_MAT(glLoadMatrix, float, 4, 4, f)
+EIGEN_GL_FUNC_SPECIALIZATION_MAT(glLoadMatrix, double, 4, 4, d)
+
+template <typename Scalar>
+void glLoadMatrix(const Transform<Scalar, 3, Affine>& t) {
+  glLoadMatrix(t.matrix());
+}
+template <typename Scalar>
+void glLoadMatrix(const Transform<Scalar, 3, Projective>& t) {
+  glLoadMatrix(t.matrix());
+}
+template <typename Scalar>
+void glLoadMatrix(const Transform<Scalar, 3, AffineCompact>& t) {
+  glLoadMatrix(Transform<Scalar, 3, Affine>(t).matrix());
+}
+
+inline void glRotate(const Rotation2D<float>& rot) { glRotatef(rot.angle() * 180.f / float(EIGEN_PI), 0.f, 0.f, 1.f); }
+inline void glRotate(const Rotation2D<double>& rot) {
+  glRotated(rot.angle() * 180.0 / double(EIGEN_PI), 0.0, 0.0, 1.0);
+}
+
+template <typename Derived>
+void glRotate(const RotationBase<Derived, 3>& rot) {
+  Transform<typename Derived::Scalar, 3, Projective> tr(rot);
   glMultMatrix(tr.matrix());
 }
 
 #define EIGEN_GL_MAKE_CONST_const const
-#define EIGEN_GL_MAKE_CONST__ 
+#define EIGEN_GL_MAKE_CONST__
 #define EIGEN_GL_EVAL(X) X
 
-#define EIGEN_GL_FUNC1_DECLARATION(FUNC,ARG1,CONST)                                                                             \
-namespace internal {                                                                                                            \
-  template< typename XprType,                                                                                                   \
-            typename Scalar = typename XprType::Scalar,                                                                         \
-            int Rows = XprType::RowsAtCompileTime,                                                                              \
-            int Cols = XprType::ColsAtCompileTime,                                                                              \
-            bool IsGLCompatible = bool(internal::evaluator<XprType>::Flags&LinearAccessBit)                                     \
-                              && bool(XprType::Flags&DirectAccessBit)                                                           \
-                              && (XprType::IsVectorAtCompileTime || (XprType::Flags&RowMajorBit)==0)>                           \
-  struct EIGEN_CAT(EIGEN_CAT(gl_,FUNC),_impl);                                                                                  \
-                                                                                                                                \
-  template<typename XprType, typename Scalar, int Rows, int Cols>                                                               \
-  struct EIGEN_CAT(EIGEN_CAT(gl_,FUNC),_impl)<XprType,Scalar,Rows,Cols,false> {                                                 \
-    inline static void run(ARG1 a,EIGEN_GL_EVAL(EIGEN_GL_MAKE_CONST_##CONST) XprType& p) {                                      \
-      EIGEN_CAT(EIGEN_CAT(gl_,FUNC),_impl)<typename plain_matrix_type_column_major<XprType>::type>::run(a,p); }                 \
-  };                                                                                                                            \
-}                                                                                                                               \
-                                                                                                                                \
-template<typename Derived> inline void FUNC(ARG1 a,EIGEN_GL_EVAL(EIGEN_GL_MAKE_CONST_##CONST) Eigen::DenseBase<Derived>& p) {   \
-  EIGEN_CAT(EIGEN_CAT(internal::gl_,FUNC),_impl)<Derived>::run(a,p.derived());                                                  \
-}
+#define EIGEN_GL_FUNC1_DECLARATION(FUNC, ARG1, CONST)                                                            \
+  namespace internal {                                                                                           \
+  template <typename XprType, typename Scalar = typename XprType::Scalar, int Rows = XprType::RowsAtCompileTime, \
+            int Cols = XprType::ColsAtCompileTime,                                                               \
+            bool IsGLCompatible = bool(internal::evaluator<XprType>::Flags & LinearAccessBit) &&                 \
+                                  bool(XprType::Flags & DirectAccessBit) &&                                      \
+                                  (XprType::IsVectorAtCompileTime || (XprType::Flags & RowMajorBit) == 0)>       \
+  struct EIGEN_CAT(EIGEN_CAT(gl_, FUNC), _impl);                                                                 \
+                                                                                                                 \
+  template <typename XprType, typename Scalar, int Rows, int Cols>                                               \
+  struct EIGEN_CAT(EIGEN_CAT(gl_, FUNC), _impl)<XprType, Scalar, Rows, Cols, false> {                            \
+    inline static void run(ARG1 a, EIGEN_GL_EVAL(EIGEN_GL_MAKE_CONST_##CONST) XprType& p) {                      \
+      EIGEN_CAT(EIGEN_CAT(gl_, FUNC), _impl)<typename plain_matrix_type_column_major<XprType>::type>::run(a, p); \
+    }                                                                                                            \
+  };                                                                                                             \
+  }                                                                                                              \
+                                                                                                                 \
+  template <typename Derived>                                                                                    \
+  inline void FUNC(ARG1 a, EIGEN_GL_EVAL(EIGEN_GL_MAKE_CONST_##CONST) Eigen::DenseBase<Derived>& p) {            \
+    EIGEN_CAT(EIGEN_CAT(internal::gl_, FUNC), _impl)<Derived>::run(a, p.derived());                              \
+  }
 
+#define EIGEN_GL_FUNC1_SPECIALIZATION_MAT(FUNC, ARG1, CONST, SCALAR, ROWS, COLS, SUFFIX)    \
+  namespace internal {                                                                      \
+  template <typename XprType>                                                               \
+  struct EIGEN_CAT(EIGEN_CAT(gl_, FUNC), _impl)<XprType, SCALAR, ROWS, COLS, true> {        \
+    inline static void run(ARG1 a, EIGEN_GL_EVAL(EIGEN_GL_MAKE_CONST_##CONST) XprType& p) { \
+      FUNC##SUFFIX(a, p.data());                                                            \
+    }                                                                                       \
+  };                                                                                        \
+  }
 
-#define EIGEN_GL_FUNC1_SPECIALIZATION_MAT(FUNC,ARG1,CONST,SCALAR,ROWS,COLS,SUFFIX)                                              \
-namespace internal {                                                                                                            \
-  template< typename XprType> struct EIGEN_CAT(EIGEN_CAT(gl_,FUNC),_impl)<XprType, SCALAR, ROWS, COLS, true> {                  \
-    inline static void run(ARG1 a, EIGEN_GL_EVAL(EIGEN_GL_MAKE_CONST_##CONST) XprType& p) { FUNC##SUFFIX(a,p.data()); }         \
-  }; \
-}
+#define EIGEN_GL_FUNC1_SPECIALIZATION_VEC(FUNC, ARG1, CONST, SCALAR, SIZE, SUFFIX)          \
+  namespace internal {                                                                      \
+  template <typename XprType>                                                               \
+  struct EIGEN_CAT(EIGEN_CAT(gl_, FUNC), _impl)<XprType, SCALAR, SIZE, 1, true> {           \
+    inline static void run(ARG1 a, EIGEN_GL_EVAL(EIGEN_GL_MAKE_CONST_##CONST) XprType& p) { \
+      FUNC##SUFFIX(a, p.data());                                                            \
+    }                                                                                       \
+  };                                                                                        \
+  template <typename XprType>                                                               \
+  struct EIGEN_CAT(EIGEN_CAT(gl_, FUNC), _impl)<XprType, SCALAR, 1, SIZE, true> {           \
+    inline static void run(ARG1 a, EIGEN_GL_EVAL(EIGEN_GL_MAKE_CONST_##CONST) XprType& p) { \
+      FUNC##SUFFIX(a, p.data());                                                            \
+    }                                                                                       \
+  };                                                                                        \
+  }
 
-  
-#define EIGEN_GL_FUNC1_SPECIALIZATION_VEC(FUNC,ARG1,CONST,SCALAR,SIZE,SUFFIX)                                                   \
-namespace internal {                                                                                                            \
-  template< typename XprType> struct EIGEN_CAT(EIGEN_CAT(gl_,FUNC),_impl)<XprType, SCALAR, SIZE, 1, true> {                     \
-    inline static void run(ARG1 a, EIGEN_GL_EVAL(EIGEN_GL_MAKE_CONST_##CONST) XprType& p) { FUNC##SUFFIX(a,p.data()); }         \
-  };                                                                                                                            \
-  template< typename XprType> struct EIGEN_CAT(EIGEN_CAT(gl_,FUNC),_impl)<XprType, SCALAR, 1, SIZE, true> {                     \
-    inline static void run(ARG1 a, EIGEN_GL_EVAL(EIGEN_GL_MAKE_CONST_##CONST) XprType& p) { FUNC##SUFFIX(a,p.data()); }         \
-  };                                                                                                                            \
-}
-
-EIGEN_GL_FUNC1_DECLARATION       (glGet,GLenum,_)
-EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glGet,GLenum,_,float,  4,4,Floatv)
-EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glGet,GLenum,_,double, 4,4,Doublev)
+EIGEN_GL_FUNC1_DECLARATION(glGet, GLenum, _)
+EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glGet, GLenum, _, float, 4, 4, Floatv)
+EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glGet, GLenum, _, double, 4, 4, Doublev)
 
 // glUniform API
 
 #ifdef GL_VERSION_2_0
 
-inline void glUniform2fv_ei  (GLint loc, const float* v)         { glUniform2fv(loc,1,v); }
-inline void glUniform2iv_ei  (GLint loc, const int* v)           { glUniform2iv(loc,1,v); }
+inline void glUniform2fv_ei(GLint loc, const float* v) { glUniform2fv(loc, 1, v); }
+inline void glUniform2iv_ei(GLint loc, const int* v) { glUniform2iv(loc, 1, v); }
 
-inline void glUniform3fv_ei  (GLint loc, const float* v)         { glUniform3fv(loc,1,v); }
-inline void glUniform3iv_ei  (GLint loc, const int* v)           { glUniform3iv(loc,1,v); }
+inline void glUniform3fv_ei(GLint loc, const float* v) { glUniform3fv(loc, 1, v); }
+inline void glUniform3iv_ei(GLint loc, const int* v) { glUniform3iv(loc, 1, v); }
 
-inline void glUniform4fv_ei  (GLint loc, const float* v)         { glUniform4fv(loc,1,v); }
-inline void glUniform4iv_ei  (GLint loc, const int* v)           { glUniform4iv(loc,1,v); }
+inline void glUniform4fv_ei(GLint loc, const float* v) { glUniform4fv(loc, 1, v); }
+inline void glUniform4iv_ei(GLint loc, const int* v) { glUniform4iv(loc, 1, v); }
 
-inline void glUniformMatrix2fv_ei  (GLint loc, const float* v)         { glUniformMatrix2fv(loc,1,false,v); }
-inline void glUniformMatrix3fv_ei  (GLint loc, const float* v)         { glUniformMatrix3fv(loc,1,false,v); }
-inline void glUniformMatrix4fv_ei  (GLint loc, const float* v)         { glUniformMatrix4fv(loc,1,false,v); }
+inline void glUniformMatrix2fv_ei(GLint loc, const float* v) { glUniformMatrix2fv(loc, 1, false, v); }
+inline void glUniformMatrix3fv_ei(GLint loc, const float* v) { glUniformMatrix3fv(loc, 1, false, v); }
+inline void glUniformMatrix4fv_ei(GLint loc, const float* v) { glUniformMatrix4fv(loc, 1, false, v); }
 
+EIGEN_GL_FUNC1_DECLARATION(glUniform, GLint, const)
+EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform, GLint, const, float, 2, 2fv_ei)
+EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform, GLint, const, int, 2, 2iv_ei)
+EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform, GLint, const, float, 3, 3fv_ei)
+EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform, GLint, const, int, 3, 3iv_ei)
+EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform, GLint, const, float, 4, 4fv_ei)
+EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform, GLint, const, int, 4, 4iv_ei)
 
-EIGEN_GL_FUNC1_DECLARATION       (glUniform,GLint,const)
-EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform,GLint,const,float,        2,2fv_ei)
-EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform,GLint,const,int,          2,2iv_ei)
-EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform,GLint,const,float,        3,3fv_ei)
-EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform,GLint,const,int,          3,3iv_ei)
-EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform,GLint,const,float,        4,4fv_ei)
-EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform,GLint,const,int,          4,4iv_ei)
-
-EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform,GLint,const,float,        2,2,Matrix2fv_ei)
-EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform,GLint,const,float,        3,3,Matrix3fv_ei)
-EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform,GLint,const,float,        4,4,Matrix4fv_ei)
+EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform, GLint, const, float, 2, 2, Matrix2fv_ei)
+EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform, GLint, const, float, 3, 3, Matrix3fv_ei)
+EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform, GLint, const, float, 4, 4, Matrix4fv_ei)
 
 #endif
 
 #ifdef GL_VERSION_2_1
 
-inline void glUniformMatrix2x3fv_ei(GLint loc, const float* v)         { glUniformMatrix2x3fv(loc,1,false,v); }
-inline void glUniformMatrix3x2fv_ei(GLint loc, const float* v)         { glUniformMatrix3x2fv(loc,1,false,v); }
-inline void glUniformMatrix2x4fv_ei(GLint loc, const float* v)         { glUniformMatrix2x4fv(loc,1,false,v); }
-inline void glUniformMatrix4x2fv_ei(GLint loc, const float* v)         { glUniformMatrix4x2fv(loc,1,false,v); }
-inline void glUniformMatrix3x4fv_ei(GLint loc, const float* v)         { glUniformMatrix3x4fv(loc,1,false,v); }
-inline void glUniformMatrix4x3fv_ei(GLint loc, const float* v)         { glUniformMatrix4x3fv(loc,1,false,v); }
+inline void glUniformMatrix2x3fv_ei(GLint loc, const float* v) { glUniformMatrix2x3fv(loc, 1, false, v); }
+inline void glUniformMatrix3x2fv_ei(GLint loc, const float* v) { glUniformMatrix3x2fv(loc, 1, false, v); }
+inline void glUniformMatrix2x4fv_ei(GLint loc, const float* v) { glUniformMatrix2x4fv(loc, 1, false, v); }
+inline void glUniformMatrix4x2fv_ei(GLint loc, const float* v) { glUniformMatrix4x2fv(loc, 1, false, v); }
+inline void glUniformMatrix3x4fv_ei(GLint loc, const float* v) { glUniformMatrix3x4fv(loc, 1, false, v); }
+inline void glUniformMatrix4x3fv_ei(GLint loc, const float* v) { glUniformMatrix4x3fv(loc, 1, false, v); }
 
-EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform,GLint,const,float,        2,3,Matrix2x3fv_ei)
-EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform,GLint,const,float,        3,2,Matrix3x2fv_ei)
-EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform,GLint,const,float,        2,4,Matrix2x4fv_ei)
-EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform,GLint,const,float,        4,2,Matrix4x2fv_ei)
-EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform,GLint,const,float,        3,4,Matrix3x4fv_ei)
-EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform,GLint,const,float,        4,3,Matrix4x3fv_ei)
+EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform, GLint, const, float, 2, 3, Matrix2x3fv_ei)
+EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform, GLint, const, float, 3, 2, Matrix3x2fv_ei)
+EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform, GLint, const, float, 2, 4, Matrix2x4fv_ei)
+EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform, GLint, const, float, 4, 2, Matrix4x2fv_ei)
+EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform, GLint, const, float, 3, 4, Matrix3x4fv_ei)
+EIGEN_GL_FUNC1_SPECIALIZATION_MAT(glUniform, GLint, const, float, 4, 3, Matrix4x3fv_ei)
 
 #endif
 
 #ifdef GL_VERSION_3_0
 
-inline void glUniform2uiv_ei (GLint loc, const unsigned int* v)  { glUniform2uiv(loc,1,v); }
-inline void glUniform3uiv_ei (GLint loc, const unsigned int* v)  { glUniform3uiv(loc,1,v); }
-inline void glUniform4uiv_ei (GLint loc, const unsigned int* v)  { glUniform4uiv(loc,1,v); }
+inline void glUniform2uiv_ei(GLint loc, const unsigned int* v) { glUniform2uiv(loc, 1, v); }
+inline void glUniform3uiv_ei(GLint loc, const unsigned int* v) { glUniform3uiv(loc, 1, v); }
+inline void glUniform4uiv_ei(GLint loc, const unsigned int* v) { glUniform4uiv(loc, 1, v); }
 
-EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform,GLint,const,unsigned int, 2,2uiv_ei)
-EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform,GLint,const,unsigned int, 3,3uiv_ei)
-EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform,GLint,const,unsigned int, 4,4uiv_ei)
+EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform, GLint, const, unsigned int, 2, 2uiv_ei)
+EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform, GLint, const, unsigned int, 3, 3uiv_ei)
+EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform, GLint, const, unsigned int, 4, 4uiv_ei)
 
 #endif
 
 #ifdef GL_ARB_gpu_shader_fp64
-inline void glUniform2dv_ei  (GLint loc, const double* v)        { glUniform2dv(loc,1,v); }
-inline void glUniform3dv_ei  (GLint loc, const double* v)        { glUniform3dv(loc,1,v); }
-inline void glUniform4dv_ei  (GLint loc, const double* v)        { glUniform4dv(loc,1,v); }
+inline void glUniform2dv_ei(GLint loc, const double* v) { glUniform2dv(loc, 1, v); }
+inline void glUniform3dv_ei(GLint loc, const double* v) { glUniform3dv(loc, 1, v); }
+inline void glUniform4dv_ei(GLint loc, const double* v) { glUniform4dv(loc, 1, v); }
 
-EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform,GLint,const,double,       2,2dv_ei)
-EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform,GLint,const,double,       3,3dv_ei)
-EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform,GLint,const,double,       4,4dv_ei)
+EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform, GLint, const, double, 2, 2dv_ei)
+EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform, GLint, const, double, 3, 3dv_ei)
+EIGEN_GL_FUNC1_SPECIALIZATION_VEC(glUniform, GLint, const, double, 4, 4dv_ei)
 #endif
 
-
 //@}
 
-}
+}  // namespace Eigen
 
-#endif // EIGEN_OPENGL_MODULE_H
+#endif  // EIGEN_OPENGL_MODULE_H
diff --git a/unsupported/Eigen/Polynomials b/unsupported/Eigen/Polynomials
index 0df6fa1..aa9aa8e 100644
--- a/unsupported/Eigen/Polynomials
+++ b/unsupported/Eigen/Polynomials
@@ -16,24 +16,24 @@
 #include "../../Eigen/src/Core/util/DisableStupidWarnings.h"
 
 // Note that EIGEN_HIDE_HEAVY_CODE has to be defined per module
-#if (defined EIGEN_EXTERN_INSTANTIATIONS) && (EIGEN_EXTERN_INSTANTIATIONS>=2)
-  #ifndef EIGEN_HIDE_HEAVY_CODE
-  #define EIGEN_HIDE_HEAVY_CODE
-  #endif
+#if (defined EIGEN_EXTERN_INSTANTIATIONS) && (EIGEN_EXTERN_INSTANTIATIONS >= 2)
+#ifndef EIGEN_HIDE_HEAVY_CODE
+#define EIGEN_HIDE_HEAVY_CODE
+#endif
 #elif defined EIGEN_HIDE_HEAVY_CODE
-  #undef EIGEN_HIDE_HEAVY_CODE
+#undef EIGEN_HIDE_HEAVY_CODE
 #endif
 
 /**
-  * \defgroup Polynomials_Module Polynomials module
-  * \brief This module provides a QR based polynomial solver.
-	*
-  * To use this module, add
-  * \code
-  * #include <unsupported/Eigen/Polynomials>
-  * \endcode
-	* at the start of your source file.
-  */
+ * \defgroup Polynomials_Module Polynomials module
+ * \brief This module provides a QR based polynomial solver.
+ *
+ * To use this module, add
+ * \code
+ * #include <unsupported/Eigen/Polynomials>
+ * \endcode
+ * at the start of your source file.
+ */
 
 // IWYU pragma: begin_exports
 #include "src/Polynomials/PolynomialUtils.h"
@@ -42,98 +42,99 @@
 // IWYU pragma: end_exports
 
 /**
-	\page polynomials Polynomials defines functions for dealing with polynomials
-	and a QR based polynomial solver.
-	\ingroup Polynomials_Module
+        \page polynomials Polynomials defines functions for dealing with polynomials
+        and a QR based polynomial solver.
+        \ingroup Polynomials_Module
 
-	The remainder of the page documents first the functions for evaluating, computing
-	polynomials, computing estimates about polynomials and next the QR based polynomial
-	solver.
+        The remainder of the page documents first the functions for evaluating, computing
+        polynomials, computing estimates about polynomials and next the QR based polynomial
+        solver.
 
-	\section polynomialUtils convenient functions to deal with polynomials
-	\subsection roots_to_monicPolynomial
-	The function
-	\code
-	void roots_to_monicPolynomial( const RootVector& rv, Polynomial& poly )
-	\endcode
-	computes the coefficients \f$ a_i \f$ of
+        \section polynomialUtils convenient functions to deal with polynomials
+        \subsection roots_to_monicPolynomial
+        The function
+        \code
+        void roots_to_monicPolynomial( const RootVector& rv, Polynomial& poly )
+        \endcode
+        computes the coefficients \f$ a_i \f$ of
 
-	\f$ p(x) = a_0 + a_{1}x + ... + a_{n-1}x^{n-1} + x^n \f$
+        \f$ p(x) = a_0 + a_{1}x + ... + a_{n-1}x^{n-1} + x^n \f$
 
-	where \f$ p \f$ is known through its roots i.e. \f$ p(x) = (x-r_1)(x-r_2)...(x-r_n) \f$.
+        where \f$ p \f$ is known through its roots i.e. \f$ p(x) = (x-r_1)(x-r_2)...(x-r_n) \f$.
 
-	\subsection poly_eval
-	The function
-	\code
-	T poly_eval( const Polynomials& poly, const T& x )
-	\endcode
-	evaluates a polynomial at a given point using stabilized H&ouml;rner method.
+        \subsection poly_eval
+        The function
+        \code
+        T poly_eval( const Polynomials& poly, const T& x )
+        \endcode
+        evaluates a polynomial at a given point using stabilized H&ouml;rner method.
 
-	The following code: first computes the coefficients in the monomial basis of the monic polynomial that has the provided roots;
-	then, it evaluates the computed polynomial, using a stabilized H&ouml;rner method.
+        The following code: first computes the coefficients in the monomial basis of the monic polynomial that has the
+  provided roots; then, it evaluates the computed polynomial, using a stabilized H&ouml;rner method.
 
-	\include PolynomialUtils1.cpp
+        \include PolynomialUtils1.cpp
   Output: \verbinclude PolynomialUtils1.out
 
-	\subsection Cauchy bounds
-	The function
-	\code
-	Real cauchy_max_bound( const Polynomial& poly )
-	\endcode
-	provides a maximum bound (the Cauchy one: \f$C(p)\f$) for the absolute value of a root of the given polynomial i.e.
-	\f$ \forall r_i \f$ root of \f$ p(x) = \sum_{k=0}^d a_k x^k \f$,
-	\f$ |r_i| \le C(p) = \sum_{k=0}^{d} \left | \frac{a_k}{a_d} \right | \f$
-	The leading coefficient \f$ p \f$: should be non zero \f$a_d \neq 0\f$.
+        \subsection Cauchy bounds
+        The function
+        \code
+        Real cauchy_max_bound( const Polynomial& poly )
+        \endcode
+        provides a maximum bound (the Cauchy one: \f$C(p)\f$) for the absolute value of a root of the given polynomial
+  i.e. \f$ \forall r_i \f$ root of \f$ p(x) = \sum_{k=0}^d a_k x^k \f$, \f$ |r_i| \le C(p) = \sum_{k=0}^{d} \left |
+  \frac{a_k}{a_d} \right | \f$ The leading coefficient \f$ p \f$: should be non zero \f$a_d \neq 0\f$.
 
 
-	The function
-	\code
-	Real cauchy_min_bound( const Polynomial& poly )
-	\endcode
-	provides a minimum bound (the Cauchy one: \f$c(p)\f$) for the absolute value of a non zero root of the given polynomial i.e.
-	\f$ \forall r_i \neq 0 \f$ root of \f$ p(x) = \sum_{k=0}^d a_k x^k \f$,
-	\f$ |r_i| \ge c(p) = \left( \sum_{k=0}^{d} \left | \frac{a_k}{a_0} \right | \right)^{-1} \f$
+        The function
+        \code
+        Real cauchy_min_bound( const Polynomial& poly )
+        \endcode
+        provides a minimum bound (the Cauchy one: \f$c(p)\f$) for the absolute value of a non zero root of the given
+  polynomial i.e. \f$ \forall r_i \neq 0 \f$ root of \f$ p(x) = \sum_{k=0}^d a_k x^k \f$, \f$ |r_i| \ge c(p) = \left(
+  \sum_{k=0}^{d} \left | \frac{a_k}{a_0} \right | \right)^{-1} \f$
 
 
 
 
-	\section QR polynomial solver class
-	Computes the complex roots of a polynomial by computing the eigenvalues of the associated companion matrix with the QR algorithm.
-	
-	The roots of \f$ p(x) = a_0 + a_1 x + a_2 x^2 + a_{3} x^3 + x^4 \f$ are the eigenvalues of
-	\f$
-	\left [
-	\begin{array}{cccc}
-	0 & 0 &  0 & a_0 \\
-	1 & 0 &  0 & a_1 \\
-	0 & 1 &  0 & a_2 \\
-	0 & 0 &  1 & a_3
-	\end{array} \right ]
-	\f$
+        \section QR polynomial solver class
+        Computes the complex roots of a polynomial by computing the eigenvalues of the associated companion matrix with
+  the QR algorithm.
 
-	However, the QR algorithm is not guaranteed to converge when there are several eigenvalues with same modulus.
+        The roots of \f$ p(x) = a_0 + a_1 x + a_2 x^2 + a_{3} x^3 + x^4 \f$ are the eigenvalues of
+        \f$
+        \left [
+        \begin{array}{cccc}
+        0 & 0 &  0 & a_0 \\
+        1 & 0 &  0 & a_1 \\
+        0 & 1 &  0 & a_2 \\
+        0 & 0 &  1 & a_3
+        \end{array} \right ]
+        \f$
 
-	Therefore the current polynomial solver is guaranteed to provide a correct result only when the complex roots \f$r_1,r_2,...,r_d\f$ have distinct moduli i.e.
-	
-	\f$ \forall i,j \in [1;d],~ \| r_i \| \neq \| r_j \| \f$.
+        However, the QR algorithm is not guaranteed to converge when there are several eigenvalues with same modulus.
 
-	With 32bit (float) floating types this problem shows up frequently.
+        Therefore the current polynomial solver is guaranteed to provide a correct result only when the complex roots
+  \f$r_1,r_2,...,r_d\f$ have distinct moduli i.e.
+
+        \f$ \forall i,j \in [1;d],~ \| r_i \| \neq \| r_j \| \f$.
+
+        With 32bit (float) floating types this problem shows up frequently.
   However, almost always, correct accuracy is reached even in these cases for 64bit
   (double) floating types and small polynomial degree (<20).
 
-	\include PolynomialSolver1.cpp
-	
-	In the above example:
-	
-	-# a simple use of the polynomial solver is shown;
-	-# the accuracy problem with the QR algorithm is presented: a polynomial with almost conjugate roots is provided to the solver.
-	Those roots have almost same module therefore the QR algorithm failed to converge: the accuracy
-	of the last root is bad;
-	-# a simple way to circumvent the problem is shown: use doubles instead of floats.
+        \include PolynomialSolver1.cpp
+
+        In the above example:
+
+        -# a simple use of the polynomial solver is shown;
+        -# the accuracy problem with the QR algorithm is presented: a polynomial with almost conjugate roots is provided
+  to the solver. Those roots have almost same module therefore the QR algorithm failed to converge: the accuracy of the
+  last root is bad;
+        -# a simple way to circumvent the problem is shown: use doubles instead of floats.
 
   Output: \verbinclude PolynomialSolver1.out
 */
 
 #include "../../Eigen/src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_POLYNOMIALS_MODULE_H
+#endif  // EIGEN_POLYNOMIALS_MODULE_H
diff --git a/unsupported/Eigen/Skyline b/unsupported/Eigen/Skyline
index 7a9f0ca..ebd7c38 100644
--- a/unsupported/Eigen/Skyline
+++ b/unsupported/Eigen/Skyline
@@ -9,7 +9,6 @@
 #ifndef EIGEN_SKYLINE_MODULE_H
 #define EIGEN_SKYLINE_MODULE_H
 
-
 #include "../../Eigen/Core"
 
 #include "../../Eigen/src/Core/util/DisableStupidWarnings.h"
@@ -38,4 +37,4 @@
 
 #include "../../Eigen/src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_SKYLINE_MODULE_H
+#endif  // EIGEN_SKYLINE_MODULE_H
diff --git a/unsupported/Eigen/SparseExtra b/unsupported/Eigen/SparseExtra
index 88a639e..00a87c5 100644
--- a/unsupported/Eigen/SparseExtra
+++ b/unsupported/Eigen/SparseExtra
@@ -24,22 +24,24 @@
 #include <sstream>
 
 #ifdef EIGEN_GOOGLEHASH_SUPPORT
-  #include <google/dense_hash_map>
-  #include <google/sparse_hash_map>
+#include <google/dense_hash_map>
+#include <google/sparse_hash_map>
 #endif
 
 /**
-  * \defgroup SparseExtra_Module SparseExtra module
-  *
-  * This module contains some experimental features extending the sparse module:
-  * - A RandomSetter which is a wrapper object allowing to set/update a sparse matrix with random access.
-  * - A SparseInverse which calculates a sparse subset of the inverse of a sparse matrix corresponding to nonzeros of the input
-  * - MatrixMarket format(https://math.nist.gov/MatrixMarket/formats.html) readers and writers for sparse and dense matrices.
-  *
-  * \code
-  * #include <unsupported/Eigen/SparseExtra>
-  * \endcode
-  */
+ * \defgroup SparseExtra_Module SparseExtra module
+ *
+ * This module contains some experimental features extending the sparse module:
+ * - A RandomSetter which is a wrapper object allowing to set/update a sparse matrix with random access.
+ * - A SparseInverse which calculates a sparse subset of the inverse of a sparse matrix corresponding to nonzeros of the
+ * input
+ * - MatrixMarket format(https://math.nist.gov/MatrixMarket/formats.html) readers and writers for sparse and dense
+ * matrices.
+ *
+ * \code
+ * #include <unsupported/Eigen/SparseExtra>
+ * \endcode
+ */
 
 // IWYU pragma: begin_exports
 #include "src/SparseExtra/RandomSetter.h"
@@ -55,4 +57,4 @@
 
 #include "../../Eigen/src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_SPARSE_EXTRA_MODULE_H
+#endif  // EIGEN_SPARSE_EXTRA_MODULE_H
diff --git a/unsupported/Eigen/SpecialFunctions b/unsupported/Eigen/SpecialFunctions
index fb03db7..4f7e599 100644
--- a/unsupported/Eigen/SpecialFunctions
+++ b/unsupported/Eigen/SpecialFunctions
@@ -19,46 +19,46 @@
 namespace Eigen {
 
 /**
-  * \defgroup SpecialFunctions_Module Special math functions module
-  *
-  * This module features additional coefficient-wise math functions available
-  * within the numext:: namespace for the scalar version, and as method and/or free
-  * functions of Array. Those include:
-  *
-  * - erf
-  * - erfc
-  * - lgamma
-  * - igamma
-  * - igamma_der_a
-  * - gamma_sample_der_alpha
-  * - igammac
-  * - digamma
-  * - ndtri
-  * - polygamma
-  * - zeta
-  * - betainc
-  *
-  * Bessel Functions
-  * - bessel_i0
-  * - bessel_i0e
-  * - bessel_i1
-  * - bessel_i1e
-  * - bessel_j0
-  * - bessel_j1
-  * - bessel_k0
-  * - bessel_k0e
-  * - bessel_k1
-  * - bessel_k1e
-  * - bessel_y0
-  * - bessel_y1
-  *
-  * \code
-  * #include <unsupported/Eigen/SpecialFunctions>
-  * \endcode
-  */
+ * \defgroup SpecialFunctions_Module Special math functions module
+ *
+ * This module features additional coefficient-wise math functions available
+ * within the numext:: namespace for the scalar version, and as method and/or free
+ * functions of Array. Those include:
+ *
+ * - erf
+ * - erfc
+ * - lgamma
+ * - igamma
+ * - igamma_der_a
+ * - gamma_sample_der_alpha
+ * - igammac
+ * - digamma
+ * - ndtri
+ * - polygamma
+ * - zeta
+ * - betainc
+ *
+ * Bessel Functions
+ * - bessel_i0
+ * - bessel_i0e
+ * - bessel_i1
+ * - bessel_i1e
+ * - bessel_j0
+ * - bessel_j1
+ * - bessel_k0
+ * - bessel_k0e
+ * - bessel_k1
+ * - bessel_k1e
+ * - bessel_y0
+ * - bessel_y1
+ *
+ * \code
+ * #include <unsupported/Eigen/SpecialFunctions>
+ * \endcode
+ */
 //@{
 
-}
+}  // namespace Eigen
 
 // IWYU pragma: begin_exports
 #include "src/SpecialFunctions/BesselFunctionsImpl.h"
@@ -78,20 +78,20 @@
 #include "src/SpecialFunctions/SpecialFunctionsArrayAPI.h"
 
 #if defined EIGEN_VECTORIZE_AVX512
-  #include "src/SpecialFunctions/arch/AVX/BesselFunctions.h"
-  #include "src/SpecialFunctions/arch/AVX/SpecialFunctions.h"
-  #include "src/SpecialFunctions/arch/AVX512/BesselFunctions.h"
-  #include "src/SpecialFunctions/arch/AVX512/SpecialFunctions.h"
+#include "src/SpecialFunctions/arch/AVX/BesselFunctions.h"
+#include "src/SpecialFunctions/arch/AVX/SpecialFunctions.h"
+#include "src/SpecialFunctions/arch/AVX512/BesselFunctions.h"
+#include "src/SpecialFunctions/arch/AVX512/SpecialFunctions.h"
 #elif defined EIGEN_VECTORIZE_AVX
-  #include "src/SpecialFunctions/arch/AVX/BesselFunctions.h"
-  #include "src/SpecialFunctions/arch/AVX/SpecialFunctions.h"
+#include "src/SpecialFunctions/arch/AVX/BesselFunctions.h"
+#include "src/SpecialFunctions/arch/AVX/SpecialFunctions.h"
 #elif defined EIGEN_VECTORIZE_NEON
-  #include "src/SpecialFunctions/arch/NEON/BesselFunctions.h"
-  #include "src/SpecialFunctions/arch/NEON/SpecialFunctions.h"
+#include "src/SpecialFunctions/arch/NEON/BesselFunctions.h"
+#include "src/SpecialFunctions/arch/NEON/SpecialFunctions.h"
 #endif
 
 #if defined EIGEN_VECTORIZE_GPU
-  #include "src/SpecialFunctions/arch/GPU/SpecialFunctions.h"
+#include "src/SpecialFunctions/arch/GPU/SpecialFunctions.h"
 #endif
 // IWYU pragma: end_exports
 
@@ -99,7 +99,6 @@
 //@}
 }
 
-
 #include "../../Eigen/src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_SPECIALFUNCTIONS_MODULE_H
+#endif  // EIGEN_SPECIALFUNCTIONS_MODULE_H
diff --git a/unsupported/Eigen/Splines b/unsupported/Eigen/Splines
index b4fc81e..632095d 100644
--- a/unsupported/Eigen/Splines
+++ b/unsupported/Eigen/Splines
@@ -10,18 +10,17 @@
 #ifndef EIGEN_SPLINES_MODULE_H
 #define EIGEN_SPLINES_MODULE_H
 
-namespace Eigen 
-{
+namespace Eigen {
 /**
-  * \defgroup Splines_Module Spline and spline fitting module
-  *
-  * This module provides a simple multi-dimensional spline class while
-  * offering most basic functionality to fit a spline to point sets.
-  *
-  * \code
-  * #include <unsupported/Eigen/Splines>
-  * \endcode
-  */
+ * \defgroup Splines_Module Spline and spline fitting module
+ *
+ * This module provides a simple multi-dimensional spline class while
+ * offering most basic functionality to fit a spline to point sets.
+ *
+ * \code
+ * #include <unsupported/Eigen/Splines>
+ * \endcode
+ */
 }
 
 #include "../../Eigen/src/Core/util/DisableStupidWarnings.h"
@@ -34,4 +33,4 @@
 
 #include "../../Eigen/src/Core/util/ReenableStupidWarnings.h"
 
-#endif // EIGEN_SPLINES_MODULE_H
+#endif  // EIGEN_SPLINES_MODULE_H
diff --git a/unsupported/Eigen/src/AutoDiff/AutoDiffJacobian.h b/unsupported/Eigen/src/AutoDiff/AutoDiffJacobian.h
index 7066f62..a83bdc3 100644
--- a/unsupported/Eigen/src/AutoDiff/AutoDiffJacobian.h
+++ b/unsupported/Eigen/src/AutoDiff/AutoDiffJacobian.h
@@ -13,27 +13,23 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen
-{
+namespace Eigen {
 
-template<typename Functor> class AutoDiffJacobian : public Functor
-{
-public:
+template <typename Functor>
+class AutoDiffJacobian : public Functor {
+ public:
   AutoDiffJacobian() : Functor() {}
   AutoDiffJacobian(const Functor& f) : Functor(f) {}
 
   // forward constructors
-  template<typename... T>
-  AutoDiffJacobian(const T& ...Values) : Functor(Values...) {}
+  template <typename... T>
+  AutoDiffJacobian(const T&... Values) : Functor(Values...) {}
 
   typedef typename Functor::InputType InputType;
   typedef typename Functor::ValueType ValueType;
   typedef typename ValueType::Scalar Scalar;
 
-  enum {
-    InputsAtCompileTime = InputType::RowsAtCompileTime,
-    ValuesAtCompileTime = ValueType::RowsAtCompileTime
-  };
+  enum { InputsAtCompileTime = InputType::RowsAtCompileTime, ValuesAtCompileTime = ValueType::RowsAtCompileTime };
 
   typedef Matrix<Scalar, ValuesAtCompileTime, InputsAtCompileTime> JacobianType;
   typedef typename JacobianType::Index Index;
@@ -46,19 +42,12 @@
 
   // Some compilers don't accept variadic parameters after a default parameter,
   // i.e., we can't just write _jac=0 but we need to overload operator():
-  EIGEN_STRONG_INLINE
-  void operator() (const InputType& x, ValueType* v) const
-  {
-      this->operator()(x, v, 0);
-  }
-  template<typename... ParamsType>
-  void operator() (const InputType& x, ValueType* v, JacobianType* _jac,
-                   const ParamsType&... Params) const
-  {
-    eigen_assert(v!=0);
+  EIGEN_STRONG_INLINE void operator()(const InputType& x, ValueType* v) const { this->operator()(x, v, 0); }
+  template <typename... ParamsType>
+  void operator()(const InputType& x, ValueType* v, JacobianType* _jac, const ParamsType&... Params) const {
+    eigen_assert(v != 0);
 
-    if (!_jac)
-    {
+    if (!_jac) {
       Functor::operator()(x, v, Params...);
       return;
     }
@@ -68,23 +57,20 @@
     ActiveInput ax = x.template cast<ActiveScalar>();
     ActiveValue av(jac.rows());
 
-    if(InputsAtCompileTime==Dynamic)
-      for (Index j=0; j<jac.rows(); j++)
-        av[j].derivatives().resize(x.rows());
+    if (InputsAtCompileTime == Dynamic)
+      for (Index j = 0; j < jac.rows(); j++) av[j].derivatives().resize(x.rows());
 
-    for (Index i=0; i<jac.cols(); i++)
-      ax[i].derivatives() = DerivativeType::Unit(x.rows(),i);
+    for (Index i = 0; i < jac.cols(); i++) ax[i].derivatives() = DerivativeType::Unit(x.rows(), i);
 
     Functor::operator()(ax, &av, Params...);
 
-    for (Index i=0; i<jac.rows(); i++)
-    {
+    for (Index i = 0; i < jac.rows(); i++) {
       (*v)[i] = av[i].value();
       jac.row(i) = av[i].derivatives();
     }
   }
 };
 
-}
+}  // namespace Eigen
 
-#endif // EIGEN_AUTODIFF_JACOBIAN_H
+#endif  // EIGEN_AUTODIFF_JACOBIAN_H
diff --git a/unsupported/Eigen/src/AutoDiff/AutoDiffScalar.h b/unsupported/Eigen/src/AutoDiff/AutoDiffScalar.h
index 7e80cc5..70e74c2 100644
--- a/unsupported/Eigen/src/AutoDiff/AutoDiffScalar.h
+++ b/unsupported/Eigen/src/AutoDiff/AutoDiffScalar.h
@@ -17,375 +17,358 @@
 
 namespace internal {
 
-template<typename A, typename B>
+template <typename A, typename B>
 struct make_coherent_impl {
   static void run(A&, B&) {}
 };
 
 // resize a to match b is a.size()==0, and conversely.
-template<typename A, typename B>
-void make_coherent(const A& a, const B&b)
-{
-  make_coherent_impl<A,B>::run(a.const_cast_derived(), b.const_cast_derived());
+template <typename A, typename B>
+void make_coherent(const A& a, const B& b) {
+  make_coherent_impl<A, B>::run(a.const_cast_derived(), b.const_cast_derived());
 }
 
-template<typename DerivativeType, bool Enable> struct auto_diff_special_op;
+template <typename DerivativeType, bool Enable>
+struct auto_diff_special_op;
 
-} // end namespace internal
+}  // end namespace internal
 
-template<typename DerivativeType> class AutoDiffScalar;
+template <typename DerivativeType>
+class AutoDiffScalar;
 
-template<typename NewDerType>
-inline AutoDiffScalar<NewDerType> MakeAutoDiffScalar(const typename NewDerType::Scalar& value, const NewDerType &der) {
-  return AutoDiffScalar<NewDerType>(value,der);
+template <typename NewDerType>
+inline AutoDiffScalar<NewDerType> MakeAutoDiffScalar(const typename NewDerType::Scalar& value, const NewDerType& der) {
+  return AutoDiffScalar<NewDerType>(value, der);
 }
 
 /** \class AutoDiffScalar
-  * \brief A scalar type replacement with automatic differentiation capability
-  *
-  * \param DerivativeType the vector type used to store/represent the derivatives. The base scalar type
-  *                 as well as the number of derivatives to compute are determined from this type.
-  *                 Typical choices include, e.g., \c Vector4f for 4 derivatives, or \c VectorXf
-  *                 if the number of derivatives is not known at compile time, and/or, the number
-  *                 of derivatives is large.
-  *                 Note that DerivativeType can also be a reference (e.g., \c VectorXf&) to wrap a
-  *                 existing vector into an AutoDiffScalar.
-  *                 Finally, DerivativeType can also be any Eigen compatible expression.
-  *
-  * This class represents a scalar value while tracking its respective derivatives using Eigen's expression
-  * template mechanism.
-  *
-  * It supports the following list of global math function:
-  *  - std::abs, std::sqrt, std::pow, std::exp, std::log, std::sin, std::cos,
-  *  - internal::abs, internal::sqrt, numext::pow, internal::exp, internal::log, internal::sin, internal::cos,
-  *  - internal::conj, internal::real, internal::imag, numext::abs2.
-  *
-  * AutoDiffScalar can be used as the scalar type of an Eigen::Matrix object. However,
-  * in that case, the expression template mechanism only occurs at the top Matrix level,
-  * while derivatives are computed right away.
-  *
-  */
+ * \brief A scalar type replacement with automatic differentiation capability
+ *
+ * \param DerivativeType the vector type used to store/represent the derivatives. The base scalar type
+ *                 as well as the number of derivatives to compute are determined from this type.
+ *                 Typical choices include, e.g., \c Vector4f for 4 derivatives, or \c VectorXf
+ *                 if the number of derivatives is not known at compile time, and/or, the number
+ *                 of derivatives is large.
+ *                 Note that DerivativeType can also be a reference (e.g., \c VectorXf&) to wrap a
+ *                 existing vector into an AutoDiffScalar.
+ *                 Finally, DerivativeType can also be any Eigen compatible expression.
+ *
+ * This class represents a scalar value while tracking its respective derivatives using Eigen's expression
+ * template mechanism.
+ *
+ * It supports the following list of global math function:
+ *  - std::abs, std::sqrt, std::pow, std::exp, std::log, std::sin, std::cos,
+ *  - internal::abs, internal::sqrt, numext::pow, internal::exp, internal::log, internal::sin, internal::cos,
+ *  - internal::conj, internal::real, internal::imag, numext::abs2.
+ *
+ * AutoDiffScalar can be used as the scalar type of an Eigen::Matrix object. However,
+ * in that case, the expression template mechanism only occurs at the top Matrix level,
+ * while derivatives are computed right away.
+ *
+ */
 
-template<typename DerivativeType>
+template <typename DerivativeType>
 class AutoDiffScalar
-  : public internal::auto_diff_special_op
-            <DerivativeType, !internal::is_same<typename internal::traits<internal::remove_all_t<DerivativeType>>::Scalar,
-                                          typename NumTraits<typename internal::traits<internal::remove_all_t<DerivativeType>>::Scalar>::Real>::value>
-{
-  public:
-    typedef internal::auto_diff_special_op
-            <DerivativeType, !internal::is_same<typename internal::traits<internal::remove_all_t<DerivativeType>>::Scalar,
-                       typename NumTraits<typename internal::traits<internal::remove_all_t<DerivativeType>>::Scalar>::Real>::value> Base;
-    typedef internal::remove_all_t<DerivativeType> DerType;
-    typedef typename internal::traits<DerType>::Scalar Scalar;
-    typedef typename NumTraits<Scalar>::Real Real;
+    : public internal::auto_diff_special_op<
+          DerivativeType, !internal::is_same<typename internal::traits<internal::remove_all_t<DerivativeType>>::Scalar,
+                                             typename NumTraits<typename internal::traits<
+                                                 internal::remove_all_t<DerivativeType>>::Scalar>::Real>::value> {
+ public:
+  typedef internal::auto_diff_special_op<
+      DerivativeType,
+      !internal::is_same<
+          typename internal::traits<internal::remove_all_t<DerivativeType>>::Scalar,
+          typename NumTraits<typename internal::traits<internal::remove_all_t<DerivativeType>>::Scalar>::Real>::value>
+      Base;
+  typedef internal::remove_all_t<DerivativeType> DerType;
+  typedef typename internal::traits<DerType>::Scalar Scalar;
+  typedef typename NumTraits<Scalar>::Real Real;
 
-    using Base::operator+;
-    using Base::operator*;
+  using Base::operator+;
+  using Base::operator*;
 
-    /** Default constructor without any initialization. */
-    AutoDiffScalar() {}
+  /** Default constructor without any initialization. */
+  AutoDiffScalar() {}
 
-    /** Constructs an active scalar from its \a value,
-        and initializes the \a nbDer derivatives such that it corresponds to the \a derNumber -th variable */
-    AutoDiffScalar(const Scalar& value, int nbDer, int derNumber)
-      : m_value(value), m_derivatives(DerType::Zero(nbDer))
-    {
-      m_derivatives.coeffRef(derNumber) = Scalar(1);
-    }
+  /** Constructs an active scalar from its \a value,
+      and initializes the \a nbDer derivatives such that it corresponds to the \a derNumber -th variable */
+  AutoDiffScalar(const Scalar& value, int nbDer, int derNumber) : m_value(value), m_derivatives(DerType::Zero(nbDer)) {
+    m_derivatives.coeffRef(derNumber) = Scalar(1);
+  }
 
-    /** Conversion from a scalar constant to an active scalar.
-      * The derivatives are set to zero. */
-    /*explicit*/ AutoDiffScalar(const Real& value)
-      : m_value(value)
-    {
-      if(m_derivatives.size()>0)
-        m_derivatives.setZero();
-    }
+  /** Conversion from a scalar constant to an active scalar.
+   * The derivatives are set to zero. */
+  /*explicit*/ AutoDiffScalar(const Real& value) : m_value(value) {
+    if (m_derivatives.size() > 0) m_derivatives.setZero();
+  }
 
-    /** Constructs an active scalar from its \a value and derivatives \a der */
-    AutoDiffScalar(const Scalar& value, const DerType& der)
-      : m_value(value), m_derivatives(der)
-    {}
+  /** Constructs an active scalar from its \a value and derivatives \a der */
+  AutoDiffScalar(const Scalar& value, const DerType& der) : m_value(value), m_derivatives(der) {}
 
-    template<typename OtherDerType>
-    AutoDiffScalar(const AutoDiffScalar<OtherDerType>& other
+  template <typename OtherDerType>
+  AutoDiffScalar(
+      const AutoDiffScalar<OtherDerType>& other
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-    , std::enable_if_t<
-            internal::is_same<Scalar, typename internal::traits<internal::remove_all_t<OtherDerType>>::Scalar>::value
-        &&  internal::is_convertible<OtherDerType,DerType>::value , void*> = 0
+      ,
+      std::enable_if_t<
+          internal::is_same<Scalar, typename internal::traits<internal::remove_all_t<OtherDerType>>::Scalar>::value &&
+              internal::is_convertible<OtherDerType, DerType>::value,
+          void*> = 0
 #endif
-    )
-      : m_value(other.value()), m_derivatives(other.derivatives())
-    {}
+      )
+      : m_value(other.value()), m_derivatives(other.derivatives()) {
+  }
 
-    friend  std::ostream & operator << (std::ostream & s, const AutoDiffScalar& a)
-    {
-      return s << a.value();
-    }
+  friend std::ostream& operator<<(std::ostream& s, const AutoDiffScalar& a) { return s << a.value(); }
 
-    AutoDiffScalar(const AutoDiffScalar& other)
-      : m_value(other.value()), m_derivatives(other.derivatives())
-    {}
+  AutoDiffScalar(const AutoDiffScalar& other) : m_value(other.value()), m_derivatives(other.derivatives()) {}
 
-    template<typename OtherDerType>
-    inline AutoDiffScalar& operator=(const AutoDiffScalar<OtherDerType>& other)
-    {
-      m_value = other.value();
-      m_derivatives = other.derivatives();
-      return *this;
-    }
+  template <typename OtherDerType>
+  inline AutoDiffScalar& operator=(const AutoDiffScalar<OtherDerType>& other) {
+    m_value = other.value();
+    m_derivatives = other.derivatives();
+    return *this;
+  }
 
-    inline AutoDiffScalar& operator=(const AutoDiffScalar& other)
-    {
-      m_value = other.value();
-      m_derivatives = other.derivatives();
-      return *this;
-    }
+  inline AutoDiffScalar& operator=(const AutoDiffScalar& other) {
+    m_value = other.value();
+    m_derivatives = other.derivatives();
+    return *this;
+  }
 
-    inline AutoDiffScalar& operator=(const Scalar& other)
-    {
-      m_value = other;
-      if(m_derivatives.size()>0)
-        m_derivatives.setZero();
-      return *this;
-    }
+  inline AutoDiffScalar& operator=(const Scalar& other) {
+    m_value = other;
+    if (m_derivatives.size() > 0) m_derivatives.setZero();
+    return *this;
+  }
 
-//     inline operator const Scalar& () const { return m_value; }
-//     inline operator Scalar& () { return m_value; }
+  //     inline operator const Scalar& () const { return m_value; }
+  //     inline operator Scalar& () { return m_value; }
 
-    inline const Scalar& value() const { return m_value; }
-    inline Scalar& value() { return m_value; }
+  inline const Scalar& value() const { return m_value; }
+  inline Scalar& value() { return m_value; }
 
-    inline const DerType& derivatives() const { return m_derivatives; }
-    inline DerType& derivatives() { return m_derivatives; }
+  inline const DerType& derivatives() const { return m_derivatives; }
+  inline DerType& derivatives() { return m_derivatives; }
 
-    inline bool operator< (const Scalar& other) const  { return m_value <  other; }
-    inline bool operator<=(const Scalar& other) const  { return m_value <= other; }
-    inline bool operator> (const Scalar& other) const  { return m_value >  other; }
-    inline bool operator>=(const Scalar& other) const  { return m_value >= other; }
-    inline bool operator==(const Scalar& other) const  { return m_value == other; }
-    inline bool operator!=(const Scalar& other) const  { return m_value != other; }
+  inline bool operator<(const Scalar& other) const { return m_value < other; }
+  inline bool operator<=(const Scalar& other) const { return m_value <= other; }
+  inline bool operator>(const Scalar& other) const { return m_value > other; }
+  inline bool operator>=(const Scalar& other) const { return m_value >= other; }
+  inline bool operator==(const Scalar& other) const { return m_value == other; }
+  inline bool operator!=(const Scalar& other) const { return m_value != other; }
 
-    friend inline bool operator< (const Scalar& a, const AutoDiffScalar& b) { return a <  b.value(); }
-    friend inline bool operator<=(const Scalar& a, const AutoDiffScalar& b) { return a <= b.value(); }
-    friend inline bool operator> (const Scalar& a, const AutoDiffScalar& b) { return a >  b.value(); }
-    friend inline bool operator>=(const Scalar& a, const AutoDiffScalar& b) { return a >= b.value(); }
-    friend inline bool operator==(const Scalar& a, const AutoDiffScalar& b) { return a == b.value(); }
-    friend inline bool operator!=(const Scalar& a, const AutoDiffScalar& b) { return a != b.value(); }
+  friend inline bool operator<(const Scalar& a, const AutoDiffScalar& b) { return a < b.value(); }
+  friend inline bool operator<=(const Scalar& a, const AutoDiffScalar& b) { return a <= b.value(); }
+  friend inline bool operator>(const Scalar& a, const AutoDiffScalar& b) { return a > b.value(); }
+  friend inline bool operator>=(const Scalar& a, const AutoDiffScalar& b) { return a >= b.value(); }
+  friend inline bool operator==(const Scalar& a, const AutoDiffScalar& b) { return a == b.value(); }
+  friend inline bool operator!=(const Scalar& a, const AutoDiffScalar& b) { return a != b.value(); }
 
-    template<typename OtherDerType> inline bool operator< (const AutoDiffScalar<OtherDerType>& b) const  { return m_value <  b.value(); }
-    template<typename OtherDerType> inline bool operator<=(const AutoDiffScalar<OtherDerType>& b) const  { return m_value <= b.value(); }
-    template<typename OtherDerType> inline bool operator> (const AutoDiffScalar<OtherDerType>& b) const  { return m_value >  b.value(); }
-    template<typename OtherDerType> inline bool operator>=(const AutoDiffScalar<OtherDerType>& b) const  { return m_value >= b.value(); }
-    template<typename OtherDerType> inline bool operator==(const AutoDiffScalar<OtherDerType>& b) const  { return m_value == b.value(); }
-    template<typename OtherDerType> inline bool operator!=(const AutoDiffScalar<OtherDerType>& b) const  { return m_value != b.value(); }
+  template <typename OtherDerType>
+  inline bool operator<(const AutoDiffScalar<OtherDerType>& b) const {
+    return m_value < b.value();
+  }
+  template <typename OtherDerType>
+  inline bool operator<=(const AutoDiffScalar<OtherDerType>& b) const {
+    return m_value <= b.value();
+  }
+  template <typename OtherDerType>
+  inline bool operator>(const AutoDiffScalar<OtherDerType>& b) const {
+    return m_value > b.value();
+  }
+  template <typename OtherDerType>
+  inline bool operator>=(const AutoDiffScalar<OtherDerType>& b) const {
+    return m_value >= b.value();
+  }
+  template <typename OtherDerType>
+  inline bool operator==(const AutoDiffScalar<OtherDerType>& b) const {
+    return m_value == b.value();
+  }
+  template <typename OtherDerType>
+  inline bool operator!=(const AutoDiffScalar<OtherDerType>& b) const {
+    return m_value != b.value();
+  }
 
-    inline AutoDiffScalar<DerType&> operator+(const Scalar& other) const
-    {
-      return AutoDiffScalar<DerType&>(m_value + other, m_derivatives);
-    }
+  inline AutoDiffScalar<DerType&> operator+(const Scalar& other) const {
+    return AutoDiffScalar<DerType&>(m_value + other, m_derivatives);
+  }
 
-    friend inline AutoDiffScalar<DerType&> operator+(const Scalar& a, const AutoDiffScalar& b)
-    {
-      return AutoDiffScalar<DerType&>(a + b.value(), b.derivatives());
-    }
+  friend inline AutoDiffScalar<DerType&> operator+(const Scalar& a, const AutoDiffScalar& b) {
+    return AutoDiffScalar<DerType&>(a + b.value(), b.derivatives());
+  }
 
-//     inline const AutoDiffScalar<DerType&> operator+(const Real& other) const
-//     {
-//       return AutoDiffScalar<DerType&>(m_value + other, m_derivatives);
-//     }
+  //     inline const AutoDiffScalar<DerType&> operator+(const Real& other) const
+  //     {
+  //       return AutoDiffScalar<DerType&>(m_value + other, m_derivatives);
+  //     }
 
-//     friend inline const AutoDiffScalar<DerType&> operator+(const Real& a, const AutoDiffScalar& b)
-//     {
-//       return AutoDiffScalar<DerType&>(a + b.value(), b.derivatives());
-//     }
+  //     friend inline const AutoDiffScalar<DerType&> operator+(const Real& a, const AutoDiffScalar& b)
+  //     {
+  //       return AutoDiffScalar<DerType&>(a + b.value(), b.derivatives());
+  //     }
 
-    inline AutoDiffScalar& operator+=(const Scalar& other)
-    {
-      value() += other;
-      return *this;
-    }
+  inline AutoDiffScalar& operator+=(const Scalar& other) {
+    value() += other;
+    return *this;
+  }
 
-    template<typename OtherDerType>
-    inline AutoDiffScalar<CwiseBinaryOp<internal::scalar_sum_op<Scalar>,const DerType,const internal::remove_all_t<OtherDerType>> >
-    operator+(const AutoDiffScalar<OtherDerType>& other) const
-    {
-      internal::make_coherent(m_derivatives, other.derivatives());
-      return AutoDiffScalar<CwiseBinaryOp<internal::scalar_sum_op<Scalar>,const DerType,const internal::remove_all_t<OtherDerType>> >(
-        m_value + other.value(),
-        m_derivatives + other.derivatives());
-    }
+  template <typename OtherDerType>
+  inline AutoDiffScalar<
+      CwiseBinaryOp<internal::scalar_sum_op<Scalar>, const DerType, const internal::remove_all_t<OtherDerType>>>
+  operator+(const AutoDiffScalar<OtherDerType>& other) const {
+    internal::make_coherent(m_derivatives, other.derivatives());
+    return AutoDiffScalar<
+        CwiseBinaryOp<internal::scalar_sum_op<Scalar>, const DerType, const internal::remove_all_t<OtherDerType>>>(
+        m_value + other.value(), m_derivatives + other.derivatives());
+  }
 
-    template<typename OtherDerType>
-    inline AutoDiffScalar&
-    operator+=(const AutoDiffScalar<OtherDerType>& other)
-    {
-      (*this) = (*this) + other;
-      return *this;
-    }
+  template <typename OtherDerType>
+  inline AutoDiffScalar& operator+=(const AutoDiffScalar<OtherDerType>& other) {
+    (*this) = (*this) + other;
+    return *this;
+  }
 
-    inline AutoDiffScalar<DerType&> operator-(const Scalar& b) const
-    {
-      return AutoDiffScalar<DerType&>(m_value - b, m_derivatives);
-    }
+  inline AutoDiffScalar<DerType&> operator-(const Scalar& b) const {
+    return AutoDiffScalar<DerType&>(m_value - b, m_derivatives);
+  }
 
-    friend inline AutoDiffScalar<CwiseUnaryOp<internal::scalar_opposite_op<Scalar>, const DerType> >
-    operator-(const Scalar& a, const AutoDiffScalar& b)
-    {
-      return AutoDiffScalar<CwiseUnaryOp<internal::scalar_opposite_op<Scalar>, const DerType> >
-            (a - b.value(), -b.derivatives());
-    }
+  friend inline AutoDiffScalar<CwiseUnaryOp<internal::scalar_opposite_op<Scalar>, const DerType>> operator-(
+      const Scalar& a, const AutoDiffScalar& b) {
+    return AutoDiffScalar<CwiseUnaryOp<internal::scalar_opposite_op<Scalar>, const DerType>>(a - b.value(),
+                                                                                             -b.derivatives());
+  }
 
-    inline AutoDiffScalar& operator-=(const Scalar& other)
-    {
-      value() -= other;
-      return *this;
-    }
+  inline AutoDiffScalar& operator-=(const Scalar& other) {
+    value() -= other;
+    return *this;
+  }
 
-    template<typename OtherDerType>
-    inline AutoDiffScalar<CwiseBinaryOp<internal::scalar_difference_op<Scalar>, const DerType,const internal::remove_all_t<OtherDerType>> >
-    operator-(const AutoDiffScalar<OtherDerType>& other) const
-    {
-      internal::make_coherent(m_derivatives, other.derivatives());
-      return AutoDiffScalar<CwiseBinaryOp<internal::scalar_difference_op<Scalar>, const DerType,const internal::remove_all_t<OtherDerType>> >(
-        m_value - other.value(),
-        m_derivatives - other.derivatives());
-    }
+  template <typename OtherDerType>
+  inline AutoDiffScalar<
+      CwiseBinaryOp<internal::scalar_difference_op<Scalar>, const DerType, const internal::remove_all_t<OtherDerType>>>
+  operator-(const AutoDiffScalar<OtherDerType>& other) const {
+    internal::make_coherent(m_derivatives, other.derivatives());
+    return AutoDiffScalar<CwiseBinaryOp<internal::scalar_difference_op<Scalar>, const DerType,
+                                        const internal::remove_all_t<OtherDerType>>>(
+        m_value - other.value(), m_derivatives - other.derivatives());
+  }
 
-    template<typename OtherDerType>
-    inline AutoDiffScalar&
-    operator-=(const AutoDiffScalar<OtherDerType>& other)
-    {
-      *this = *this - other;
-      return *this;
-    }
+  template <typename OtherDerType>
+  inline AutoDiffScalar& operator-=(const AutoDiffScalar<OtherDerType>& other) {
+    *this = *this - other;
+    return *this;
+  }
 
-    inline AutoDiffScalar<CwiseUnaryOp<internal::scalar_opposite_op<Scalar>, const DerType> >
-    operator-() const
-    {
-      return AutoDiffScalar<CwiseUnaryOp<internal::scalar_opposite_op<Scalar>, const DerType> >(
-        -m_value,
-        -m_derivatives);
-    }
+  inline AutoDiffScalar<CwiseUnaryOp<internal::scalar_opposite_op<Scalar>, const DerType>> operator-() const {
+    return AutoDiffScalar<CwiseUnaryOp<internal::scalar_opposite_op<Scalar>, const DerType>>(-m_value, -m_derivatives);
+  }
 
-    inline AutoDiffScalar<EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(DerType,Scalar,product) >
-    operator*(const Scalar& other) const
-    {
-      return MakeAutoDiffScalar(m_value * other, m_derivatives * other);
-    }
+  inline AutoDiffScalar<EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(DerType, Scalar, product)> operator*(
+      const Scalar& other) const {
+    return MakeAutoDiffScalar(m_value * other, m_derivatives * other);
+  }
 
-    friend inline AutoDiffScalar<EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(DerType,Scalar,product) >
-    operator*(const Scalar& other, const AutoDiffScalar& a)
-    {
-      return MakeAutoDiffScalar(a.value() * other, a.derivatives() * other);
-    }
+  friend inline AutoDiffScalar<EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(DerType, Scalar, product)> operator*(
+      const Scalar& other, const AutoDiffScalar& a) {
+    return MakeAutoDiffScalar(a.value() * other, a.derivatives() * other);
+  }
 
-//     inline const AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type >
-//     operator*(const Real& other) const
-//     {
-//       return AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type >(
-//         m_value * other,
-//         (m_derivatives * other));
-//     }
-//
-//     friend inline const AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type >
-//     operator*(const Real& other, const AutoDiffScalar& a)
-//     {
-//       return AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type >(
-//         a.value() * other,
-//         a.derivatives() * other);
-//     }
+  //     inline const AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type >
+  //     operator*(const Real& other) const
+  //     {
+  //       return AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type >(
+  //         m_value * other,
+  //         (m_derivatives * other));
+  //     }
+  //
+  //     friend inline const AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type >
+  //     operator*(const Real& other, const AutoDiffScalar& a)
+  //     {
+  //       return AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type >(
+  //         a.value() * other,
+  //         a.derivatives() * other);
+  //     }
 
-    inline AutoDiffScalar<EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(DerType,Scalar,product) >
-    operator/(const Scalar& other) const
-    {
-      return MakeAutoDiffScalar(m_value / other, (m_derivatives * (Scalar(1)/other)));
-    }
+  inline AutoDiffScalar<EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(DerType, Scalar, product)> operator/(
+      const Scalar& other) const {
+    return MakeAutoDiffScalar(m_value / other, (m_derivatives * (Scalar(1) / other)));
+  }
 
-    friend inline AutoDiffScalar<EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(DerType,Scalar,product) >
-    operator/(const Scalar& other, const AutoDiffScalar& a)
-    {
-      return MakeAutoDiffScalar(other / a.value(), a.derivatives() * (Scalar(-other) / (a.value()*a.value())));
-    }
+  friend inline AutoDiffScalar<EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(DerType, Scalar, product)> operator/(
+      const Scalar& other, const AutoDiffScalar& a) {
+    return MakeAutoDiffScalar(other / a.value(), a.derivatives() * (Scalar(-other) / (a.value() * a.value())));
+  }
 
-//     inline const AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type >
-//     operator/(const Real& other) const
-//     {
-//       return AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type >(
-//         m_value / other,
-//         (m_derivatives * (Real(1)/other)));
-//     }
-//
-//     friend inline const AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type >
-//     operator/(const Real& other, const AutoDiffScalar& a)
-//     {
-//       return AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type >(
-//         other / a.value(),
-//         a.derivatives() * (-Real(1)/other));
-//     }
+  //     inline const AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type >
+  //     operator/(const Real& other) const
+  //     {
+  //       return AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type >(
+  //         m_value / other,
+  //         (m_derivatives * (Real(1)/other)));
+  //     }
+  //
+  //     friend inline const AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type >
+  //     operator/(const Real& other, const AutoDiffScalar& a)
+  //     {
+  //       return AutoDiffScalar<typename CwiseUnaryOp<internal::scalar_multiple_op<Real>, DerType>::Type >(
+  //         other / a.value(),
+  //         a.derivatives() * (-Real(1)/other));
+  //     }
 
-    template<typename OtherDerType>
-    inline AutoDiffScalar<EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(
-        CwiseBinaryOp<internal::scalar_difference_op<Scalar> EIGEN_COMMA
-          const EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(DerType,Scalar,product) EIGEN_COMMA
-          const EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(internal::remove_all_t<OtherDerType>,Scalar,product) >,Scalar,product) >
-    operator/(const AutoDiffScalar<OtherDerType>& other) const
-    {
-      internal::make_coherent(m_derivatives, other.derivatives());
-      return MakeAutoDiffScalar(
-        m_value / other.value(),
-          ((m_derivatives * other.value()) - (other.derivatives() * m_value))
-        * (Scalar(1)/(other.value()*other.value())));
-    }
+  template <typename OtherDerType>
+  inline AutoDiffScalar<EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(
+      CwiseBinaryOp<internal::scalar_difference_op<Scalar> EIGEN_COMMA const EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(
+          DerType, Scalar, product) EIGEN_COMMA const
+                        EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(internal::remove_all_t<OtherDerType>, Scalar, product)>,
+      Scalar, product)>
+  operator/(const AutoDiffScalar<OtherDerType>& other) const {
+    internal::make_coherent(m_derivatives, other.derivatives());
+    return MakeAutoDiffScalar(m_value / other.value(),
+                              ((m_derivatives * other.value()) - (other.derivatives() * m_value)) *
+                                  (Scalar(1) / (other.value() * other.value())));
+  }
 
-    template<typename OtherDerType>
-    inline AutoDiffScalar<CwiseBinaryOp<internal::scalar_sum_op<Scalar>,
-        const EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(DerType,Scalar,product),
-        const EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(internal::remove_all_t<OtherDerType>,Scalar,product) > >
-    operator*(const AutoDiffScalar<OtherDerType>& other) const
-    {
-      internal::make_coherent(m_derivatives, other.derivatives());
-      return MakeAutoDiffScalar(
-        m_value * other.value(),
-        (m_derivatives * other.value()) + (other.derivatives() * m_value));
-    }
+  template <typename OtherDerType>
+  inline AutoDiffScalar<CwiseBinaryOp<
+      internal::scalar_sum_op<Scalar>, const EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(DerType, Scalar, product),
+      const EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(internal::remove_all_t<OtherDerType>, Scalar, product)>>
+  operator*(const AutoDiffScalar<OtherDerType>& other) const {
+    internal::make_coherent(m_derivatives, other.derivatives());
+    return MakeAutoDiffScalar(m_value * other.value(),
+                              (m_derivatives * other.value()) + (other.derivatives() * m_value));
+  }
 
-    inline AutoDiffScalar& operator*=(const Scalar& other)
-    {
-      *this = *this * other;
-      return *this;
-    }
+  inline AutoDiffScalar& operator*=(const Scalar& other) {
+    *this = *this * other;
+    return *this;
+  }
 
-    template<typename OtherDerType>
-    inline AutoDiffScalar& operator*=(const AutoDiffScalar<OtherDerType>& other)
-    {
-      *this = *this * other;
-      return *this;
-    }
+  template <typename OtherDerType>
+  inline AutoDiffScalar& operator*=(const AutoDiffScalar<OtherDerType>& other) {
+    *this = *this * other;
+    return *this;
+  }
 
-    inline AutoDiffScalar& operator/=(const Scalar& other)
-    {
-      *this = *this / other;
-      return *this;
-    }
+  inline AutoDiffScalar& operator/=(const Scalar& other) {
+    *this = *this / other;
+    return *this;
+  }
 
-    template<typename OtherDerType>
-    inline AutoDiffScalar& operator/=(const AutoDiffScalar<OtherDerType>& other)
-    {
-      *this = *this / other;
-      return *this;
-    }
+  template <typename OtherDerType>
+  inline AutoDiffScalar& operator/=(const AutoDiffScalar<OtherDerType>& other) {
+    *this = *this / other;
+    return *this;
+  }
 
-  protected:
-    Scalar m_value;
-    DerType m_derivatives;
-
+ protected:
+  Scalar m_value;
+  DerType m_derivatives;
 };
 
 namespace internal {
 
-template<typename DerivativeType>
+template <typename DerivativeType>
 struct auto_diff_special_op<DerivativeType, true>
 //   : auto_diff_scalar_op<DerivativeType, typename NumTraits<Scalar>::Real,
 //                            is_same<Scalar,typename NumTraits<Scalar>::Real>::value>
@@ -394,153 +377,129 @@
   typedef typename traits<DerType>::Scalar Scalar;
   typedef typename NumTraits<Scalar>::Real Real;
 
-//   typedef auto_diff_scalar_op<DerivativeType, typename NumTraits<Scalar>::Real,
-//                            is_same<Scalar,typename NumTraits<Scalar>::Real>::value> Base;
+  //   typedef auto_diff_scalar_op<DerivativeType, typename NumTraits<Scalar>::Real,
+  //                            is_same<Scalar,typename NumTraits<Scalar>::Real>::value> Base;
 
-//   using Base::operator+;
-//   using Base::operator+=;
-//   using Base::operator-;
-//   using Base::operator-=;
-//   using Base::operator*;
-//   using Base::operator*=;
+  //   using Base::operator+;
+  //   using Base::operator+=;
+  //   using Base::operator-;
+  //   using Base::operator-=;
+  //   using Base::operator*;
+  //   using Base::operator*=;
 
-  const AutoDiffScalar<DerivativeType>& derived() const { return *static_cast<const AutoDiffScalar<DerivativeType>*>(this); }
+  const AutoDiffScalar<DerivativeType>& derived() const {
+    return *static_cast<const AutoDiffScalar<DerivativeType>*>(this);
+  }
   AutoDiffScalar<DerivativeType>& derived() { return *static_cast<AutoDiffScalar<DerivativeType>*>(this); }
 
-
-  inline AutoDiffScalar<DerType&> operator+(const Real& other) const
-  {
+  inline AutoDiffScalar<DerType&> operator+(const Real& other) const {
     return AutoDiffScalar<DerType&>(derived().value() + other, derived().derivatives());
   }
 
-  friend inline AutoDiffScalar<DerType&> operator+(const Real& a, const AutoDiffScalar<DerivativeType>& b)
-  {
+  friend inline AutoDiffScalar<DerType&> operator+(const Real& a, const AutoDiffScalar<DerivativeType>& b) {
     return AutoDiffScalar<DerType&>(a + b.value(), b.derivatives());
   }
 
-  inline AutoDiffScalar<DerivativeType>& operator+=(const Real& other)
-  {
+  inline AutoDiffScalar<DerivativeType>& operator+=(const Real& other) {
     derived().value() += other;
     return derived();
   }
 
-
-  inline AutoDiffScalar<typename CwiseUnaryOp<bind2nd_op<scalar_product_op<Scalar,Real> >, DerType>::Type >
-  operator*(const Real& other) const
-  {
-    return AutoDiffScalar<typename CwiseUnaryOp<bind2nd_op<scalar_product_op<Scalar,Real> >, DerType>::Type >(
-      derived().value() * other,
-      derived().derivatives() * other);
+  inline AutoDiffScalar<typename CwiseUnaryOp<bind2nd_op<scalar_product_op<Scalar, Real>>, DerType>::Type> operator*(
+      const Real& other) const {
+    return AutoDiffScalar<typename CwiseUnaryOp<bind2nd_op<scalar_product_op<Scalar, Real>>, DerType>::Type>(
+        derived().value() * other, derived().derivatives() * other);
   }
 
-  friend inline AutoDiffScalar<typename CwiseUnaryOp<bind1st_op<scalar_product_op<Real,Scalar> >, DerType>::Type >
-  operator*(const Real& other, const AutoDiffScalar<DerivativeType>& a)
-  {
-    return AutoDiffScalar<typename CwiseUnaryOp<bind1st_op<scalar_product_op<Real,Scalar> >, DerType>::Type >(
-      a.value() * other,
-      a.derivatives() * other);
+  friend inline AutoDiffScalar<typename CwiseUnaryOp<bind1st_op<scalar_product_op<Real, Scalar>>, DerType>::Type>
+  operator*(const Real& other, const AutoDiffScalar<DerivativeType>& a) {
+    return AutoDiffScalar<typename CwiseUnaryOp<bind1st_op<scalar_product_op<Real, Scalar>>, DerType>::Type>(
+        a.value() * other, a.derivatives() * other);
   }
 
-  inline AutoDiffScalar<DerivativeType>& operator*=(const Scalar& other)
-  {
+  inline AutoDiffScalar<DerivativeType>& operator*=(const Scalar& other) {
     *this = *this * other;
     return derived();
   }
 };
 
-template<typename DerivativeType>
-struct auto_diff_special_op<DerivativeType, false>
-{
+template <typename DerivativeType>
+struct auto_diff_special_op<DerivativeType, false> {
   void operator*() const;
   void operator-() const;
   void operator+() const;
 };
 
-template<typename BinOp, typename A, typename B, typename RefType>
-void make_coherent_expression(CwiseBinaryOp<BinOp,A,B> xpr, const RefType &ref)
-{
+template <typename BinOp, typename A, typename B, typename RefType>
+void make_coherent_expression(CwiseBinaryOp<BinOp, A, B> xpr, const RefType& ref) {
   make_coherent(xpr.const_cast_derived().lhs(), ref);
   make_coherent(xpr.const_cast_derived().rhs(), ref);
 }
 
-template<typename UnaryOp, typename A, typename RefType>
-void make_coherent_expression(const CwiseUnaryOp<UnaryOp,A> &xpr, const RefType &ref)
-{
+template <typename UnaryOp, typename A, typename RefType>
+void make_coherent_expression(const CwiseUnaryOp<UnaryOp, A>& xpr, const RefType& ref) {
   make_coherent(xpr.nestedExpression().const_cast_derived(), ref);
 }
 
 // needed for compilation only
-template<typename UnaryOp, typename A, typename RefType>
-void make_coherent_expression(const CwiseNullaryOp<UnaryOp,A> &, const RefType &)
-{}
+template <typename UnaryOp, typename A, typename RefType>
+void make_coherent_expression(const CwiseNullaryOp<UnaryOp, A>&, const RefType&) {}
 
-template<typename A_Scalar, int A_Rows, int A_Cols, int A_Options, int A_MaxRows, int A_MaxCols, typename B>
+template <typename A_Scalar, int A_Rows, int A_Cols, int A_Options, int A_MaxRows, int A_MaxCols, typename B>
 struct make_coherent_impl<Matrix<A_Scalar, A_Rows, A_Cols, A_Options, A_MaxRows, A_MaxCols>, B> {
   typedef Matrix<A_Scalar, A_Rows, A_Cols, A_Options, A_MaxRows, A_MaxCols> A;
   static void run(A& a, B& b) {
-    if((A_Rows==Dynamic || A_Cols==Dynamic) && (a.size()==0))
-    {
+    if ((A_Rows == Dynamic || A_Cols == Dynamic) && (a.size() == 0)) {
       a.resize(b.size());
       a.setZero();
-    }
-    else if (B::SizeAtCompileTime==Dynamic && a.size()!=0 && b.size()==0)
-    {
-      make_coherent_expression(b,a);
+    } else if (B::SizeAtCompileTime == Dynamic && a.size() != 0 && b.size() == 0) {
+      make_coherent_expression(b, a);
     }
   }
 };
 
-template<typename A, typename B_Scalar, int B_Rows, int B_Cols, int B_Options, int B_MaxRows, int B_MaxCols>
-struct make_coherent_impl<A, Matrix<B_Scalar, B_Rows, B_Cols, B_Options, B_MaxRows, B_MaxCols> > {
+template <typename A, typename B_Scalar, int B_Rows, int B_Cols, int B_Options, int B_MaxRows, int B_MaxCols>
+struct make_coherent_impl<A, Matrix<B_Scalar, B_Rows, B_Cols, B_Options, B_MaxRows, B_MaxCols>> {
   typedef Matrix<B_Scalar, B_Rows, B_Cols, B_Options, B_MaxRows, B_MaxCols> B;
   static void run(A& a, B& b) {
-    if((B_Rows==Dynamic || B_Cols==Dynamic) && (b.size()==0))
-    {
+    if ((B_Rows == Dynamic || B_Cols == Dynamic) && (b.size() == 0)) {
       b.resize(a.size());
       b.setZero();
-    }
-    else if (A::SizeAtCompileTime==Dynamic && b.size()!=0 && a.size()==0)
-    {
-      make_coherent_expression(a,b);
+    } else if (A::SizeAtCompileTime == Dynamic && b.size() != 0 && a.size() == 0) {
+      make_coherent_expression(a, b);
     }
   }
 };
 
-template<typename A_Scalar, int A_Rows, int A_Cols, int A_Options, int A_MaxRows, int A_MaxCols,
-         typename B_Scalar, int B_Rows, int B_Cols, int B_Options, int B_MaxRows, int B_MaxCols>
+template <typename A_Scalar, int A_Rows, int A_Cols, int A_Options, int A_MaxRows, int A_MaxCols, typename B_Scalar,
+          int B_Rows, int B_Cols, int B_Options, int B_MaxRows, int B_MaxCols>
 struct make_coherent_impl<Matrix<A_Scalar, A_Rows, A_Cols, A_Options, A_MaxRows, A_MaxCols>,
-                          Matrix<B_Scalar, B_Rows, B_Cols, B_Options, B_MaxRows, B_MaxCols> > {
+                          Matrix<B_Scalar, B_Rows, B_Cols, B_Options, B_MaxRows, B_MaxCols>> {
   typedef Matrix<A_Scalar, A_Rows, A_Cols, A_Options, A_MaxRows, A_MaxCols> A;
   typedef Matrix<B_Scalar, B_Rows, B_Cols, B_Options, B_MaxRows, B_MaxCols> B;
   static void run(A& a, B& b) {
-    if((A_Rows==Dynamic || A_Cols==Dynamic) && (a.size()==0))
-    {
+    if ((A_Rows == Dynamic || A_Cols == Dynamic) && (a.size() == 0)) {
       a.resize(b.size());
       a.setZero();
-    }
-    else if((B_Rows==Dynamic || B_Cols==Dynamic) && (b.size()==0))
-    {
+    } else if ((B_Rows == Dynamic || B_Cols == Dynamic) && (b.size() == 0)) {
       b.resize(a.size());
       b.setZero();
     }
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-template<typename DerType, typename BinOp>
-struct ScalarBinaryOpTraits<AutoDiffScalar<DerType>,typename DerType::Scalar,BinOp>
-{
+template <typename DerType, typename BinOp>
+struct ScalarBinaryOpTraits<AutoDiffScalar<DerType>, typename DerType::Scalar, BinOp> {
   typedef AutoDiffScalar<DerType> ReturnType;
 };
 
-template<typename DerType, typename BinOp>
-struct ScalarBinaryOpTraits<typename DerType::Scalar,AutoDiffScalar<DerType>, BinOp>
-{
+template <typename DerType, typename BinOp>
+struct ScalarBinaryOpTraits<typename DerType::Scalar, AutoDiffScalar<DerType>, BinOp> {
   typedef AutoDiffScalar<DerType> ReturnType;
 };
 
-
 // The following is an attempt to let Eigen's known about expression template, but that's more tricky!
 
 // template<typename DerType, typename BinOp>
@@ -557,194 +516,181 @@
 //   typedef AutoDiffScalar<typename DerType1::PlainObject> ReturnType;
 // };
 
-#define EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(FUNC,CODE) \
-  template<typename DerType> \
-  inline Eigen::AutoDiffScalar< \
-  EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(Eigen::internal::remove_all_t<DerType>, typename Eigen::internal::traits<Eigen::internal::remove_all_t<DerType>>::Scalar, product) > \
-  FUNC(const Eigen::AutoDiffScalar<DerType>& x) { \
-    using namespace Eigen; \
+#define EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(FUNC, CODE)                                              \
+  template <typename DerType>                                                                        \
+  inline Eigen::AutoDiffScalar<EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(                               \
+      Eigen::internal::remove_all_t<DerType>,                                                        \
+      typename Eigen::internal::traits<Eigen::internal::remove_all_t<DerType>>::Scalar, product)>    \
+  FUNC(const Eigen::AutoDiffScalar<DerType>& x) {                                                    \
+    using namespace Eigen;                                                                           \
     typedef typename Eigen::internal::traits<Eigen::internal::remove_all_t<DerType>>::Scalar Scalar; \
-    EIGEN_UNUSED_VARIABLE(sizeof(Scalar)); \
-    CODE; \
+    EIGEN_UNUSED_VARIABLE(sizeof(Scalar));                                                           \
+    CODE;                                                                                            \
   }
 
-template<typename DerType>
+template <typename DerType>
 struct CleanedUpDerType {
   typedef AutoDiffScalar<typename Eigen::internal::remove_all_t<DerType>::PlainObject> type;
 };
 
-template<typename DerType>
-inline const AutoDiffScalar<DerType>& conj(const AutoDiffScalar<DerType>& x)  { return x; }
-template<typename DerType>
-inline const AutoDiffScalar<DerType>& real(const AutoDiffScalar<DerType>& x)  { return x; }
-template<typename DerType>
-inline typename DerType::Scalar imag(const AutoDiffScalar<DerType>&)    { return 0.; }
-template<typename DerType, typename T>
-inline typename CleanedUpDerType<DerType>::type (min)(const AutoDiffScalar<DerType>& x, const T& y) {
+template <typename DerType>
+inline const AutoDiffScalar<DerType>& conj(const AutoDiffScalar<DerType>& x) {
+  return x;
+}
+template <typename DerType>
+inline const AutoDiffScalar<DerType>& real(const AutoDiffScalar<DerType>& x) {
+  return x;
+}
+template <typename DerType>
+inline typename DerType::Scalar imag(const AutoDiffScalar<DerType>&) {
+  return 0.;
+}
+template <typename DerType, typename T>
+inline typename CleanedUpDerType<DerType>::type(min)(const AutoDiffScalar<DerType>& x, const T& y) {
   typedef typename CleanedUpDerType<DerType>::type ADS;
   return (x <= y ? ADS(x) : ADS(y));
 }
-template<typename DerType, typename T>
-inline typename CleanedUpDerType<DerType>::type (max)(const AutoDiffScalar<DerType>& x, const T& y) {
+template <typename DerType, typename T>
+inline typename CleanedUpDerType<DerType>::type(max)(const AutoDiffScalar<DerType>& x, const T& y) {
   typedef typename CleanedUpDerType<DerType>::type ADS;
   return (x >= y ? ADS(x) : ADS(y));
 }
-template<typename DerType, typename T>
-inline typename CleanedUpDerType<DerType>::type (min)(const T& x, const AutoDiffScalar<DerType>& y) {
+template <typename DerType, typename T>
+inline typename CleanedUpDerType<DerType>::type(min)(const T& x, const AutoDiffScalar<DerType>& y) {
   typedef typename CleanedUpDerType<DerType>::type ADS;
   return (x < y ? ADS(x) : ADS(y));
 }
-template<typename DerType, typename T>
-inline typename CleanedUpDerType<DerType>::type (max)(const T& x, const AutoDiffScalar<DerType>& y) {
+template <typename DerType, typename T>
+inline typename CleanedUpDerType<DerType>::type(max)(const T& x, const AutoDiffScalar<DerType>& y) {
   typedef typename CleanedUpDerType<DerType>::type ADS;
   return (x > y ? ADS(x) : ADS(y));
 }
-template<typename DerType>
-inline typename CleanedUpDerType<DerType>::type (min)(const AutoDiffScalar<DerType>& x, const AutoDiffScalar<DerType>& y) {
+template <typename DerType>
+inline
+    typename CleanedUpDerType<DerType>::type(min)(const AutoDiffScalar<DerType>& x, const AutoDiffScalar<DerType>& y) {
   return (x.value() < y.value() ? x : y);
 }
-template<typename DerType>
-inline typename CleanedUpDerType<DerType>::type (max)(const AutoDiffScalar<DerType>& x, const AutoDiffScalar<DerType>& y) {
+template <typename DerType>
+inline
+    typename CleanedUpDerType<DerType>::type(max)(const AutoDiffScalar<DerType>& x, const AutoDiffScalar<DerType>& y) {
   return (x.value() >= y.value() ? x : y);
 }
 
+EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(abs, using std::abs;
+                                    return Eigen::MakeAutoDiffScalar(abs(x.value()),
+                                                                     x.derivatives() * (x.value() < 0 ? -1 : 1));)
 
-EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(abs,
-  using std::abs;
-  return Eigen::MakeAutoDiffScalar(abs(x.value()), x.derivatives() * (x.value()<0 ? -1 : 1) );)
+EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(abs2, using numext::abs2;
+                                    return Eigen::MakeAutoDiffScalar(abs2(x.value()),
+                                                                     x.derivatives() * (Scalar(2) * x.value()));)
 
-EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(abs2,
-  using numext::abs2;
-  return Eigen::MakeAutoDiffScalar(abs2(x.value()), x.derivatives() * (Scalar(2)*x.value()));)
+EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(sqrt, using std::sqrt; Scalar sqrtx = sqrt(x.value());
+                                    return Eigen::MakeAutoDiffScalar(sqrtx, x.derivatives() * (Scalar(0.5) / sqrtx));)
 
-EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(sqrt,
-  using std::sqrt;
-  Scalar sqrtx = sqrt(x.value());
-  return Eigen::MakeAutoDiffScalar(sqrtx,x.derivatives() * (Scalar(0.5) / sqrtx));)
+EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(cos, using std::cos; using std::sin;
+                                    return Eigen::MakeAutoDiffScalar(cos(x.value()),
+                                                                     x.derivatives() * (-sin(x.value())));)
 
-EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(cos,
-  using std::cos;
-  using std::sin;
-  return Eigen::MakeAutoDiffScalar(cos(x.value()), x.derivatives() * (-sin(x.value())));)
+EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(sin, using std::sin; using std::cos;
+                                    return Eigen::MakeAutoDiffScalar(sin(x.value()), x.derivatives() * cos(x.value()));)
 
-EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(sin,
-  using std::sin;
-  using std::cos;
-  return Eigen::MakeAutoDiffScalar(sin(x.value()),x.derivatives() * cos(x.value()));)
+EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(exp, using std::exp; Scalar expx = exp(x.value());
+                                    return Eigen::MakeAutoDiffScalar(expx, x.derivatives() * expx);)
 
-EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(exp,
-  using std::exp;
-  Scalar expx = exp(x.value());
-  return Eigen::MakeAutoDiffScalar(expx,x.derivatives() * expx);)
+EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(log, using std::log;
+                                    return Eigen::MakeAutoDiffScalar(log(x.value()),
+                                                                     x.derivatives() * (Scalar(1) / x.value()));)
 
-EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(log,
-  using std::log;
-  return Eigen::MakeAutoDiffScalar(log(x.value()),x.derivatives() * (Scalar(1)/x.value()));)
-
-template<typename DerType>
-inline Eigen::AutoDiffScalar<
-EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(internal::remove_all_t<DerType>, typename internal::traits<internal::remove_all_t<DerType>>::Scalar,product) >
-pow(const Eigen::AutoDiffScalar<DerType> &x, const typename internal::traits<internal::remove_all_t<DerType>>::Scalar &y)
-{
+template <typename DerType>
+inline Eigen::AutoDiffScalar<EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(
+    internal::remove_all_t<DerType>, typename internal::traits<internal::remove_all_t<DerType>>::Scalar, product)>
+pow(const Eigen::AutoDiffScalar<DerType>& x,
+    const typename internal::traits<internal::remove_all_t<DerType>>::Scalar& y) {
   using namespace Eigen;
   using std::pow;
-  return Eigen::MakeAutoDiffScalar(pow(x.value(),y), x.derivatives() * (y * pow(x.value(),y-1)));
+  return Eigen::MakeAutoDiffScalar(pow(x.value(), y), x.derivatives() * (y * pow(x.value(), y - 1)));
 }
 
-
-template<typename DerTypeA,typename DerTypeB>
-inline AutoDiffScalar<Matrix<typename internal::traits<internal::remove_all_t<DerTypeA>>::Scalar,Dynamic,1> >
-atan2(const AutoDiffScalar<DerTypeA>& a, const AutoDiffScalar<DerTypeB>& b)
-{
+template <typename DerTypeA, typename DerTypeB>
+inline AutoDiffScalar<Matrix<typename internal::traits<internal::remove_all_t<DerTypeA>>::Scalar, Dynamic, 1>> atan2(
+    const AutoDiffScalar<DerTypeA>& a, const AutoDiffScalar<DerTypeB>& b) {
   using std::atan2;
   typedef typename internal::traits<internal::remove_all_t<DerTypeA>>::Scalar Scalar;
-  typedef AutoDiffScalar<Matrix<Scalar,Dynamic,1> > PlainADS;
+  typedef AutoDiffScalar<Matrix<Scalar, Dynamic, 1>> PlainADS;
   PlainADS ret;
   ret.value() = atan2(a.value(), b.value());
-  
+
   Scalar squared_hypot = a.value() * a.value() + b.value() * b.value();
-  
+
   // if (squared_hypot==0) the derivation is undefined and the following results in a NaN:
   ret.derivatives() = (a.derivatives() * b.value() - a.value() * b.derivatives()) / squared_hypot;
 
   return ret;
 }
 
-EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(tan,
-  using std::tan;
-  using std::cos;
-  return Eigen::MakeAutoDiffScalar(tan(x.value()),x.derivatives() * (Scalar(1)/numext::abs2(cos(x.value()))));)
+EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(tan, using std::tan; using std::cos; return Eigen::MakeAutoDiffScalar(
+                                        tan(x.value()), x.derivatives() * (Scalar(1) / numext::abs2(cos(x.value()))));)
 
-EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(asin,
-  using std::sqrt;
-  using std::asin;
-  return Eigen::MakeAutoDiffScalar(asin(x.value()),x.derivatives() * (Scalar(1)/sqrt(1-numext::abs2(x.value()))));)
-  
-EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(acos,
-  using std::sqrt;
-  using std::acos;
-  return Eigen::MakeAutoDiffScalar(acos(x.value()),x.derivatives() * (Scalar(-1)/sqrt(1-numext::abs2(x.value()))));)
+EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(asin, using std::sqrt; using std::asin; return Eigen::MakeAutoDiffScalar(
+                                        asin(x.value()),
+                                        x.derivatives() * (Scalar(1) / sqrt(1 - numext::abs2(x.value()))));)
 
-EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(tanh,
-  using std::cosh;
-  using std::tanh;
-  return Eigen::MakeAutoDiffScalar(tanh(x.value()),x.derivatives() * (Scalar(1)/numext::abs2(cosh(x.value()))));)
+EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(acos, using std::sqrt; using std::acos; return Eigen::MakeAutoDiffScalar(
+                                        acos(x.value()),
+                                        x.derivatives() * (Scalar(-1) / sqrt(1 - numext::abs2(x.value()))));)
 
-EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(sinh,
-  using std::sinh;
-  using std::cosh;
-  return Eigen::MakeAutoDiffScalar(sinh(x.value()),x.derivatives() * cosh(x.value()));)
+EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(
+    tanh, using std::cosh; using std::tanh;
+    return Eigen::MakeAutoDiffScalar(tanh(x.value()), x.derivatives() * (Scalar(1) / numext::abs2(cosh(x.value()))));)
 
-EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(cosh,
-  using std::sinh;
-  using std::cosh;
-  return Eigen::MakeAutoDiffScalar(cosh(x.value()),x.derivatives() * sinh(x.value()));)
+EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(sinh, using std::sinh; using std::cosh;
+                                    return Eigen::MakeAutoDiffScalar(sinh(x.value()),
+                                                                     x.derivatives() * cosh(x.value()));)
+
+EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY(cosh, using std::sinh; using std::cosh;
+                                    return Eigen::MakeAutoDiffScalar(cosh(x.value()),
+                                                                     x.derivatives() * sinh(x.value()));)
 
 #undef EIGEN_AUTODIFF_DECLARE_GLOBAL_UNARY
 
-template<typename DerType> struct NumTraits<AutoDiffScalar<DerType> >
-  : NumTraits< typename NumTraits<typename internal::remove_all_t<DerType>::Scalar>::Real >
-{
+template <typename DerType>
+struct NumTraits<AutoDiffScalar<DerType>>
+    : NumTraits<typename NumTraits<typename internal::remove_all_t<DerType>::Scalar>::Real> {
   typedef internal::remove_all_t<DerType> DerTypeCleaned;
-  typedef AutoDiffScalar<Matrix<typename NumTraits<typename DerTypeCleaned::Scalar>::Real,DerTypeCleaned::RowsAtCompileTime,DerTypeCleaned::ColsAtCompileTime,
-                                0, DerTypeCleaned::MaxRowsAtCompileTime, DerTypeCleaned::MaxColsAtCompileTime> > Real;
+  typedef AutoDiffScalar<Matrix<typename NumTraits<typename DerTypeCleaned::Scalar>::Real,
+                                DerTypeCleaned::RowsAtCompileTime, DerTypeCleaned::ColsAtCompileTime, 0,
+                                DerTypeCleaned::MaxRowsAtCompileTime, DerTypeCleaned::MaxColsAtCompileTime>>
+      Real;
   typedef AutoDiffScalar<DerType> NonInteger;
   typedef AutoDiffScalar<DerType> Nested;
   typedef typename NumTraits<typename DerTypeCleaned::Scalar>::Literal Literal;
-  enum{
-    RequireInitialization = 1
-  };
+  enum { RequireInitialization = 1 };
 };
 
 namespace internal {
-template<typename DerivativeType>
+template <typename DerivativeType>
 struct is_identically_zero_impl<AutoDiffScalar<DerivativeType>> {
-  static inline bool run(const AutoDiffScalar<DerivativeType>& s)
-  {
+  static inline bool run(const AutoDiffScalar<DerivativeType>& s) {
     const DerivativeType& derivatives = s.derivatives();
-    for(int i=0; i<derivatives.size(); ++i)
-    {
-      if(!numext::is_exactly_zero(derivatives[i]))
-      {
+    for (int i = 0; i < derivatives.size(); ++i) {
+      if (!numext::is_exactly_zero(derivatives[i])) {
         return false;
       }
     }
     return numext::is_exactly_zero(s.value());
   }
 };
-}
-}
+}  // namespace internal
+}  // namespace Eigen
 
 namespace std {
 
 template <typename T>
-class numeric_limits<Eigen::AutoDiffScalar<T> >
-  : public numeric_limits<typename T::Scalar> {};
+class numeric_limits<Eigen::AutoDiffScalar<T>> : public numeric_limits<typename T::Scalar> {};
 
 template <typename T>
-class numeric_limits<Eigen::AutoDiffScalar<T&> >
-  : public numeric_limits<typename T::Scalar> {};
+class numeric_limits<Eigen::AutoDiffScalar<T&>> : public numeric_limits<typename T::Scalar> {};
 
 }  // namespace std
 
-#endif // EIGEN_AUTODIFF_SCALAR_H
+#endif  // EIGEN_AUTODIFF_SCALAR_H
diff --git a/unsupported/Eigen/src/AutoDiff/AutoDiffVector.h b/unsupported/Eigen/src/AutoDiff/AutoDiffVector.h
index c1ed7ea..6231456 100644
--- a/unsupported/Eigen/src/AutoDiff/AutoDiffVector.h
+++ b/unsupported/Eigen/src/AutoDiff/AutoDiffVector.h
@@ -16,208 +16,174 @@
 namespace Eigen {
 
 /* \class AutoDiffScalar
-  * \brief A scalar type replacement with automatic differentation capability
-  *
-  * \param DerType the vector type used to store/represent the derivatives (e.g. Vector3f)
-  *
-  * This class represents a scalar value while tracking its respective derivatives.
-  *
-  * It supports the following list of global math function:
-  *  - std::abs, std::sqrt, std::pow, std::exp, std::log, std::sin, std::cos,
-  *  - internal::abs, internal::sqrt, numext::pow, internal::exp, internal::log, internal::sin, internal::cos,
-  *  - internal::conj, internal::real, internal::imag, numext::abs2.
-  *
-  * AutoDiffScalar can be used as the scalar type of an Eigen::Matrix object. However,
-  * in that case, the expression template mechanism only occurs at the top Matrix level,
-  * while derivatives are computed right away.
-  *
-  */
-template<typename ValueType, typename JacobianType>
-class AutoDiffVector
-{
-  public:
-    //typedef typename internal::traits<ValueType>::Scalar Scalar;
-    typedef typename internal::traits<ValueType>::Scalar BaseScalar;
-    typedef AutoDiffScalar<Matrix<BaseScalar,JacobianType::RowsAtCompileTime,1> > ActiveScalar;
-    typedef ActiveScalar Scalar;
-    typedef AutoDiffScalar<typename JacobianType::ColXpr> CoeffType;
-    typedef typename JacobianType::Index Index;
+ * \brief A scalar type replacement with automatic differentation capability
+ *
+ * \param DerType the vector type used to store/represent the derivatives (e.g. Vector3f)
+ *
+ * This class represents a scalar value while tracking its respective derivatives.
+ *
+ * It supports the following list of global math function:
+ *  - std::abs, std::sqrt, std::pow, std::exp, std::log, std::sin, std::cos,
+ *  - internal::abs, internal::sqrt, numext::pow, internal::exp, internal::log, internal::sin, internal::cos,
+ *  - internal::conj, internal::real, internal::imag, numext::abs2.
+ *
+ * AutoDiffScalar can be used as the scalar type of an Eigen::Matrix object. However,
+ * in that case, the expression template mechanism only occurs at the top Matrix level,
+ * while derivatives are computed right away.
+ *
+ */
+template <typename ValueType, typename JacobianType>
+class AutoDiffVector {
+ public:
+  // typedef typename internal::traits<ValueType>::Scalar Scalar;
+  typedef typename internal::traits<ValueType>::Scalar BaseScalar;
+  typedef AutoDiffScalar<Matrix<BaseScalar, JacobianType::RowsAtCompileTime, 1> > ActiveScalar;
+  typedef ActiveScalar Scalar;
+  typedef AutoDiffScalar<typename JacobianType::ColXpr> CoeffType;
+  typedef typename JacobianType::Index Index;
 
-    inline AutoDiffVector() {}
+  inline AutoDiffVector() {}
 
-    inline AutoDiffVector(const ValueType& values)
-      : m_values(values)
-    {
-      m_jacobian.setZero();
-    }
+  inline AutoDiffVector(const ValueType& values) : m_values(values) { m_jacobian.setZero(); }
 
+  CoeffType operator[](Index i) { return CoeffType(m_values[i], m_jacobian.col(i)); }
+  const CoeffType operator[](Index i) const { return CoeffType(m_values[i], m_jacobian.col(i)); }
 
-    CoeffType operator[] (Index i) { return CoeffType(m_values[i], m_jacobian.col(i)); }
-    const CoeffType operator[] (Index i) const { return CoeffType(m_values[i], m_jacobian.col(i)); }
+  CoeffType operator()(Index i) { return CoeffType(m_values[i], m_jacobian.col(i)); }
+  const CoeffType operator()(Index i) const { return CoeffType(m_values[i], m_jacobian.col(i)); }
 
-    CoeffType operator() (Index i) { return CoeffType(m_values[i], m_jacobian.col(i)); }
-    const CoeffType operator() (Index i) const { return CoeffType(m_values[i], m_jacobian.col(i)); }
+  CoeffType coeffRef(Index i) { return CoeffType(m_values[i], m_jacobian.col(i)); }
+  const CoeffType coeffRef(Index i) const { return CoeffType(m_values[i], m_jacobian.col(i)); }
 
-    CoeffType coeffRef(Index i) { return CoeffType(m_values[i], m_jacobian.col(i)); }
-    const CoeffType coeffRef(Index i) const { return CoeffType(m_values[i], m_jacobian.col(i)); }
+  Index size() const { return m_values.size(); }
 
-    Index size() const { return m_values.size(); }
+  // FIXME here we could return an expression of the sum
+  Scalar sum() const { /*std::cerr << "sum \n\n";*/ /*std::cerr << m_jacobian.rowwise().sum() << "\n\n";*/
+    return Scalar(m_values.sum(), m_jacobian.rowwise().sum());
+  }
 
-    // FIXME here we could return an expression of the sum
-    Scalar sum() const { /*std::cerr << "sum \n\n";*/ /*std::cerr << m_jacobian.rowwise().sum() << "\n\n";*/ return Scalar(m_values.sum(), m_jacobian.rowwise().sum()); }
+  inline AutoDiffVector(const ValueType& values, const JacobianType& jac) : m_values(values), m_jacobian(jac) {}
 
+  template <typename OtherValueType, typename OtherJacobianType>
+  inline AutoDiffVector(const AutoDiffVector<OtherValueType, OtherJacobianType>& other)
+      : m_values(other.values()), m_jacobian(other.jacobian()) {}
 
-    inline AutoDiffVector(const ValueType& values, const JacobianType& jac)
-      : m_values(values), m_jacobian(jac)
-    {}
+  inline AutoDiffVector(const AutoDiffVector& other) : m_values(other.values()), m_jacobian(other.jacobian()) {}
 
-    template<typename OtherValueType, typename OtherJacobianType>
-    inline AutoDiffVector(const AutoDiffVector<OtherValueType, OtherJacobianType>& other)
-      : m_values(other.values()), m_jacobian(other.jacobian())
-    {}
+  template <typename OtherValueType, typename OtherJacobianType>
+  inline AutoDiffVector& operator=(const AutoDiffVector<OtherValueType, OtherJacobianType>& other) {
+    m_values = other.values();
+    m_jacobian = other.jacobian();
+    return *this;
+  }
 
-    inline AutoDiffVector(const AutoDiffVector& other)
-      : m_values(other.values()), m_jacobian(other.jacobian())
-    {}
+  inline AutoDiffVector& operator=(const AutoDiffVector& other) {
+    m_values = other.values();
+    m_jacobian = other.jacobian();
+    return *this;
+  }
 
-    template<typename OtherValueType, typename OtherJacobianType>
-    inline AutoDiffVector& operator=(const AutoDiffVector<OtherValueType, OtherJacobianType>& other)
-    {
-      m_values = other.values();
-      m_jacobian = other.jacobian();
-      return *this;
-    }
+  inline const ValueType& values() const { return m_values; }
+  inline ValueType& values() { return m_values; }
 
-    inline AutoDiffVector& operator=(const AutoDiffVector& other)
-    {
-      m_values = other.values();
-      m_jacobian = other.jacobian();
-      return *this;
-    }
+  inline const JacobianType& jacobian() const { return m_jacobian; }
+  inline JacobianType& jacobian() { return m_jacobian; }
 
-    inline const ValueType& values() const { return m_values; }
-    inline ValueType& values() { return m_values; }
+  template <typename OtherValueType, typename OtherJacobianType>
+  inline const AutoDiffVector<
+      typename MakeCwiseBinaryOp<internal::scalar_sum_op<BaseScalar>, ValueType, OtherValueType>::Type,
+      typename MakeCwiseBinaryOp<internal::scalar_sum_op<BaseScalar>, JacobianType, OtherJacobianType>::Type>
+  operator+(const AutoDiffVector<OtherValueType, OtherJacobianType>& other) const {
+    return AutoDiffVector<
+        typename MakeCwiseBinaryOp<internal::scalar_sum_op<BaseScalar>, ValueType, OtherValueType>::Type,
+        typename MakeCwiseBinaryOp<internal::scalar_sum_op<BaseScalar>, JacobianType, OtherJacobianType>::Type>(
+        m_values + other.values(), m_jacobian + other.jacobian());
+  }
 
-    inline const JacobianType& jacobian() const { return m_jacobian; }
-    inline JacobianType& jacobian() { return m_jacobian; }
+  template <typename OtherValueType, typename OtherJacobianType>
+  inline AutoDiffVector& operator+=(const AutoDiffVector<OtherValueType, OtherJacobianType>& other) {
+    m_values += other.values();
+    m_jacobian += other.jacobian();
+    return *this;
+  }
 
-    template<typename OtherValueType,typename OtherJacobianType>
-    inline const AutoDiffVector<
-      typename MakeCwiseBinaryOp<internal::scalar_sum_op<BaseScalar>,ValueType,OtherValueType>::Type,
-      typename MakeCwiseBinaryOp<internal::scalar_sum_op<BaseScalar>,JacobianType,OtherJacobianType>::Type >
-    operator+(const AutoDiffVector<OtherValueType,OtherJacobianType>& other) const
-    {
-      return AutoDiffVector<
-      typename MakeCwiseBinaryOp<internal::scalar_sum_op<BaseScalar>,ValueType,OtherValueType>::Type,
-      typename MakeCwiseBinaryOp<internal::scalar_sum_op<BaseScalar>,JacobianType,OtherJacobianType>::Type >(
-        m_values + other.values(),
-        m_jacobian + other.jacobian());
-    }
+  template <typename OtherValueType, typename OtherJacobianType>
+  inline const AutoDiffVector<
+      typename MakeCwiseBinaryOp<internal::scalar_difference_op<Scalar>, ValueType, OtherValueType>::Type,
+      typename MakeCwiseBinaryOp<internal::scalar_difference_op<Scalar>, JacobianType, OtherJacobianType>::Type>
+  operator-(const AutoDiffVector<OtherValueType, OtherJacobianType>& other) const {
+    return AutoDiffVector<
+        typename MakeCwiseBinaryOp<internal::scalar_difference_op<Scalar>, ValueType, OtherValueType>::Type,
+        typename MakeCwiseBinaryOp<internal::scalar_difference_op<Scalar>, JacobianType, OtherJacobianType>::Type>(
+        m_values - other.values(), m_jacobian - other.jacobian());
+  }
 
-    template<typename OtherValueType, typename OtherJacobianType>
-    inline AutoDiffVector&
-    operator+=(const AutoDiffVector<OtherValueType,OtherJacobianType>& other)
-    {
-      m_values += other.values();
-      m_jacobian += other.jacobian();
-      return *this;
-    }
+  template <typename OtherValueType, typename OtherJacobianType>
+  inline AutoDiffVector& operator-=(const AutoDiffVector<OtherValueType, OtherJacobianType>& other) {
+    m_values -= other.values();
+    m_jacobian -= other.jacobian();
+    return *this;
+  }
 
-    template<typename OtherValueType,typename OtherJacobianType>
-    inline const AutoDiffVector<
-      typename MakeCwiseBinaryOp<internal::scalar_difference_op<Scalar>,ValueType,OtherValueType>::Type,
-      typename MakeCwiseBinaryOp<internal::scalar_difference_op<Scalar>,JacobianType,OtherJacobianType>::Type >
-    operator-(const AutoDiffVector<OtherValueType,OtherJacobianType>& other) const
-    {
-      return AutoDiffVector<
-        typename MakeCwiseBinaryOp<internal::scalar_difference_op<Scalar>,ValueType,OtherValueType>::Type,
-        typename MakeCwiseBinaryOp<internal::scalar_difference_op<Scalar>,JacobianType,OtherJacobianType>::Type >(
-          m_values - other.values(),
-          m_jacobian - other.jacobian());
-    }
+  inline const AutoDiffVector<typename MakeCwiseUnaryOp<internal::scalar_opposite_op<Scalar>, ValueType>::Type,
+                              typename MakeCwiseUnaryOp<internal::scalar_opposite_op<Scalar>, JacobianType>::Type>
+  operator-() const {
+    return AutoDiffVector<typename MakeCwiseUnaryOp<internal::scalar_opposite_op<Scalar>, ValueType>::Type,
+                          typename MakeCwiseUnaryOp<internal::scalar_opposite_op<Scalar>, JacobianType>::Type>(
+        -m_values, -m_jacobian);
+  }
 
-    template<typename OtherValueType, typename OtherJacobianType>
-    inline AutoDiffVector&
-    operator-=(const AutoDiffVector<OtherValueType,OtherJacobianType>& other)
-    {
-      m_values -= other.values();
-      m_jacobian -= other.jacobian();
-      return *this;
-    }
+  inline const AutoDiffVector<typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, ValueType>::Type,
+                              typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, JacobianType>::Type>
+  operator*(const BaseScalar& other) const {
+    return AutoDiffVector<typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, ValueType>::Type,
+                          typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, JacobianType>::Type>(
+        m_values * other, m_jacobian * other);
+  }
 
-    inline const AutoDiffVector<
-      typename MakeCwiseUnaryOp<internal::scalar_opposite_op<Scalar>, ValueType>::Type,
-      typename MakeCwiseUnaryOp<internal::scalar_opposite_op<Scalar>, JacobianType>::Type >
-    operator-() const
-    {
-      return AutoDiffVector<
-        typename MakeCwiseUnaryOp<internal::scalar_opposite_op<Scalar>, ValueType>::Type,
-        typename MakeCwiseUnaryOp<internal::scalar_opposite_op<Scalar>, JacobianType>::Type >(
-          -m_values,
-          -m_jacobian);
-    }
-
-    inline const AutoDiffVector<
+  friend inline const AutoDiffVector<
       typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, ValueType>::Type,
       typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, JacobianType>::Type>
-    operator*(const BaseScalar& other) const
-    {
-      return AutoDiffVector<
-        typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, ValueType>::Type,
-        typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, JacobianType>::Type >(
-          m_values * other,
-          m_jacobian * other);
-    }
+  operator*(const Scalar& other, const AutoDiffVector& v) {
+    return AutoDiffVector<typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, ValueType>::Type,
+                          typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, JacobianType>::Type>(
+        v.values() * other, v.jacobian() * other);
+  }
 
-    friend inline const AutoDiffVector<
-      typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, ValueType>::Type,
-      typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, JacobianType>::Type >
-    operator*(const Scalar& other, const AutoDiffVector& v)
-    {
-      return AutoDiffVector<
-        typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, ValueType>::Type,
-        typename MakeCwiseUnaryOp<internal::scalar_multiple_op<Scalar>, JacobianType>::Type >(
-          v.values() * other,
-          v.jacobian() * other);
-    }
+  //     template<typename OtherValueType,typename OtherJacobianType>
+  //     inline const AutoDiffVector<
+  //       CwiseBinaryOp<internal::scalar_multiple_op<Scalar>, ValueType, OtherValueType>
+  //       CwiseBinaryOp<internal::scalar_sum_op<Scalar>,
+  //         CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, JacobianType>,
+  //         CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, OtherJacobianType> > >
+  //     operator*(const AutoDiffVector<OtherValueType,OtherJacobianType>& other) const
+  //     {
+  //       return AutoDiffVector<
+  //         CwiseBinaryOp<internal::scalar_multiple_op<Scalar>, ValueType, OtherValueType>
+  //         CwiseBinaryOp<internal::scalar_sum_op<Scalar>,
+  //           CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, JacobianType>,
+  //           CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, OtherJacobianType> > >(
+  //             m_values.cwise() * other.values(),
+  //             (m_jacobian * other.values()) + (m_values * other.jacobian()));
+  //     }
 
-//     template<typename OtherValueType,typename OtherJacobianType>
-//     inline const AutoDiffVector<
-//       CwiseBinaryOp<internal::scalar_multiple_op<Scalar>, ValueType, OtherValueType>
-//       CwiseBinaryOp<internal::scalar_sum_op<Scalar>,
-//         CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, JacobianType>,
-//         CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, OtherJacobianType> > >
-//     operator*(const AutoDiffVector<OtherValueType,OtherJacobianType>& other) const
-//     {
-//       return AutoDiffVector<
-//         CwiseBinaryOp<internal::scalar_multiple_op<Scalar>, ValueType, OtherValueType>
-//         CwiseBinaryOp<internal::scalar_sum_op<Scalar>,
-//           CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, JacobianType>,
-//           CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, OtherJacobianType> > >(
-//             m_values.cwise() * other.values(),
-//             (m_jacobian * other.values()) + (m_values * other.jacobian()));
-//     }
+  inline AutoDiffVector& operator*=(const Scalar& other) {
+    m_values *= other;
+    m_jacobian *= other;
+    return *this;
+  }
 
-    inline AutoDiffVector& operator*=(const Scalar& other)
-    {
-      m_values *= other;
-      m_jacobian *= other;
-      return *this;
-    }
+  template <typename OtherValueType, typename OtherJacobianType>
+  inline AutoDiffVector& operator*=(const AutoDiffVector<OtherValueType, OtherJacobianType>& other) {
+    *this = *this * other;
+    return *this;
+  }
 
-    template<typename OtherValueType,typename OtherJacobianType>
-    inline AutoDiffVector& operator*=(const AutoDiffVector<OtherValueType,OtherJacobianType>& other)
-    {
-      *this = *this * other;
-      return *this;
-    }
-
-  protected:
-    ValueType m_values;
-    JacobianType m_jacobian;
-
+ protected:
+  ValueType m_values;
+  JacobianType m_jacobian;
 };
 
-}
+}  // namespace Eigen
 
-#endif // EIGEN_AUTODIFF_VECTOR_H
+#endif  // EIGEN_AUTODIFF_VECTOR_H
diff --git a/unsupported/Eigen/src/BVH/BVAlgorithms.h b/unsupported/Eigen/src/BVH/BVAlgorithms.h
index 11cd5ac..d9e41da 100644
--- a/unsupported/Eigen/src/BVH/BVAlgorithms.h
+++ b/unsupported/Eigen/src/BVH/BVAlgorithms.h
@@ -13,14 +13,13 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-template<typename BVH, typename Intersector>
-bool intersect_helper(const BVH &tree, Intersector &intersector, typename BVH::Index root)
-{
+template <typename BVH, typename Intersector>
+bool intersect_helper(const BVH &tree, Intersector &intersector, typename BVH::Index root) {
   typedef typename BVH::Index Index;
   typedef typename BVH::VolumeIterator VolIter;
   typedef typename BVH::ObjectIterator ObjIter;
@@ -30,47 +29,45 @@
 
   std::vector<Index> todo(1, root);
 
-  while(!todo.empty()) {
+  while (!todo.empty()) {
     tree.getChildren(todo.back(), vBegin, vEnd, oBegin, oEnd);
     todo.pop_back();
 
-    for(; vBegin != vEnd; ++vBegin) //go through child volumes
-      if(intersector.intersectVolume(tree.getVolume(*vBegin)))
-        todo.push_back(*vBegin);
+    for (; vBegin != vEnd; ++vBegin)  // go through child volumes
+      if (intersector.intersectVolume(tree.getVolume(*vBegin))) todo.push_back(*vBegin);
 
-    for(; oBegin != oEnd; ++oBegin) //go through child objects
-      if(intersector.intersectObject(*oBegin))
-        return true; //intersector said to stop query
+    for (; oBegin != oEnd; ++oBegin)                          // go through child objects
+      if (intersector.intersectObject(*oBegin)) return true;  // intersector said to stop query
   }
   return false;
 }
-#endif //not EIGEN_PARSED_BY_DOXYGEN
+#endif  // not EIGEN_PARSED_BY_DOXYGEN
 
-template<typename Volume1, typename Object1, typename Object2, typename Intersector>
-struct intersector_helper1
-{
+template <typename Volume1, typename Object1, typename Object2, typename Intersector>
+struct intersector_helper1 {
   intersector_helper1(const Object2 &inStored, Intersector &in) : stored(inStored), intersector(in) {}
   bool intersectVolume(const Volume1 &vol) { return intersector.intersectVolumeObject(vol, stored); }
   bool intersectObject(const Object1 &obj) { return intersector.intersectObjectObject(obj, stored); }
   Object2 stored;
   Intersector &intersector;
-private:
-  intersector_helper1& operator=(const intersector_helper1&);
+
+ private:
+  intersector_helper1 &operator=(const intersector_helper1 &);
 };
 
-template<typename Volume2, typename Object2, typename Object1, typename Intersector>
-struct intersector_helper2
-{
+template <typename Volume2, typename Object2, typename Object1, typename Intersector>
+struct intersector_helper2 {
   intersector_helper2(const Object1 &inStored, Intersector &in) : stored(inStored), intersector(in) {}
   bool intersectVolume(const Volume2 &vol) { return intersector.intersectObjectVolume(stored, vol); }
   bool intersectObject(const Object2 &obj) { return intersector.intersectObjectObject(stored, obj); }
   Object1 stored;
   Intersector &intersector;
-private:
-  intersector_helper2& operator=(const intersector_helper2&);
+
+ private:
+  intersector_helper2 &operator=(const intersector_helper2 &);
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /**  Given a BVH, runs the query encapsulated by \a intersector.
   *  The Intersector type must provide the following members: \code
@@ -78,27 +75,31 @@
      bool intersectObject(const BVH::Object &object) //returns true if the search should terminate immediately
   \endcode
   */
-template<typename BVH, typename Intersector>
-void BVIntersect(const BVH &tree, Intersector &intersector)
-{
+template <typename BVH, typename Intersector>
+void BVIntersect(const BVH &tree, Intersector &intersector) {
   internal::intersect_helper(tree, intersector, tree.getRootIndex());
 }
 
 /**  Given two BVH's, runs the query on their Cartesian product encapsulated by \a intersector.
   *  The Intersector type must provide the following members: \code
-     bool intersectVolumeVolume(const BVH1::Volume &v1, const BVH2::Volume &v2) //returns true if product of volumes intersects the query
-     bool intersectVolumeObject(const BVH1::Volume &v1, const BVH2::Object &o2) //returns true if the volume-object product intersects the query
-     bool intersectObjectVolume(const BVH1::Object &o1, const BVH2::Volume &v2) //returns true if the volume-object product intersects the query
-     bool intersectObjectObject(const BVH1::Object &o1, const BVH2::Object &o2) //returns true if the search should terminate immediately
-  \endcode
+     bool intersectVolumeVolume(const BVH1::Volume &v1, const BVH2::Volume &v2) //returns true if product of volumes
+  intersects the query bool intersectVolumeObject(const BVH1::Volume &v1, const BVH2::Object &o2) //returns true if the
+  volume-object product intersects the query bool intersectObjectVolume(const BVH1::Object &o1, const BVH2::Volume &v2)
+  //returns true if the volume-object product intersects the query bool intersectObjectObject(const BVH1::Object &o1,
+  const BVH2::Object &o2) //returns true if the search should terminate immediately \endcode
   */
-template<typename BVH1, typename BVH2, typename Intersector>
-void BVIntersect(const BVH1 &tree1, const BVH2 &tree2, Intersector &intersector) //TODO: tandem descent when it makes sense
+template <typename BVH1, typename BVH2, typename Intersector>
+void BVIntersect(const BVH1 &tree1, const BVH2 &tree2,
+                 Intersector &intersector)  // TODO: tandem descent when it makes sense
 {
   typedef typename BVH1::Index Index1;
   typedef typename BVH2::Index Index2;
-  typedef internal::intersector_helper1<typename BVH1::Volume, typename BVH1::Object, typename BVH2::Object, Intersector> Helper1;
-  typedef internal::intersector_helper2<typename BVH2::Volume, typename BVH2::Object, typename BVH1::Object, Intersector> Helper2;
+  typedef internal::intersector_helper1<typename BVH1::Volume, typename BVH1::Object, typename BVH2::Object,
+                                        Intersector>
+      Helper1;
+  typedef internal::intersector_helper2<typename BVH2::Volume, typename BVH2::Object, typename BVH1::Object,
+                                        Intersector>
+      Helper2;
   typedef typename BVH1::VolumeIterator VolIter1;
   typedef typename BVH1::ObjectIterator ObjIter1;
   typedef typename BVH2::VolumeIterator VolIter2;
@@ -111,35 +112,32 @@
 
   std::vector<std::pair<Index1, Index2> > todo(1, std::make_pair(tree1.getRootIndex(), tree2.getRootIndex()));
 
-  while(!todo.empty()) {
+  while (!todo.empty()) {
     tree1.getChildren(todo.back().first, vBegin1, vEnd1, oBegin1, oEnd1);
     tree2.getChildren(todo.back().second, vBegin2, vEnd2, oBegin2, oEnd2);
     todo.pop_back();
 
-    for(; vBegin1 != vEnd1; ++vBegin1) { //go through child volumes of first tree
+    for (; vBegin1 != vEnd1; ++vBegin1) {  // go through child volumes of first tree
       const typename BVH1::Volume &vol1 = tree1.getVolume(*vBegin1);
-      for(vCur2 = vBegin2; vCur2 != vEnd2; ++vCur2) { //go through child volumes of second tree
-        if(intersector.intersectVolumeVolume(vol1, tree2.getVolume(*vCur2)))
+      for (vCur2 = vBegin2; vCur2 != vEnd2; ++vCur2) {  // go through child volumes of second tree
+        if (intersector.intersectVolumeVolume(vol1, tree2.getVolume(*vCur2)))
           todo.push_back(std::make_pair(*vBegin1, *vCur2));
       }
 
-      for(oCur2 = oBegin2; oCur2 != oEnd2; ++oCur2) {//go through child objects of second tree
+      for (oCur2 = oBegin2; oCur2 != oEnd2; ++oCur2) {  // go through child objects of second tree
         Helper1 helper(*oCur2, intersector);
-        if(internal::intersect_helper(tree1, helper, *vBegin1))
-          return; //intersector said to stop query
+        if (internal::intersect_helper(tree1, helper, *vBegin1)) return;  // intersector said to stop query
       }
     }
 
-    for(; oBegin1 != oEnd1; ++oBegin1) { //go through child objects of first tree
-      for(vCur2 = vBegin2; vCur2 != vEnd2; ++vCur2) { //go through child volumes of second tree
+    for (; oBegin1 != oEnd1; ++oBegin1) {               // go through child objects of first tree
+      for (vCur2 = vBegin2; vCur2 != vEnd2; ++vCur2) {  // go through child volumes of second tree
         Helper2 helper(*oBegin1, intersector);
-        if(internal::intersect_helper(tree2, helper, *vCur2))
-          return; //intersector said to stop query
+        if (internal::intersect_helper(tree2, helper, *vCur2)) return;  // intersector said to stop query
       }
 
-      for(oCur2 = oBegin2; oCur2 != oEnd2; ++oCur2) {//go through child objects of second tree
-        if(intersector.intersectObjectObject(*oBegin1, *oCur2))
-          return; //intersector said to stop query
+      for (oCur2 = oBegin2; oCur2 != oEnd2; ++oCur2) {                    // go through child objects of second tree
+        if (intersector.intersectObjectObject(*oBegin1, *oCur2)) return;  // intersector said to stop query
       }
     }
   }
@@ -148,101 +146,98 @@
 namespace internal {
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-template<typename BVH, typename Minimizer>
-typename Minimizer::Scalar minimize_helper(const BVH &tree, Minimizer &minimizer, typename BVH::Index root, typename Minimizer::Scalar minimum)
-{
+template <typename BVH, typename Minimizer>
+typename Minimizer::Scalar minimize_helper(const BVH &tree, Minimizer &minimizer, typename BVH::Index root,
+                                           typename Minimizer::Scalar minimum) {
   typedef typename Minimizer::Scalar Scalar;
   typedef typename BVH::Index Index;
-  typedef std::pair<Scalar, Index> QueueElement; //first element is priority
+  typedef std::pair<Scalar, Index> QueueElement;  // first element is priority
   typedef typename BVH::VolumeIterator VolIter;
   typedef typename BVH::ObjectIterator ObjIter;
 
   VolIter vBegin = VolIter(), vEnd = VolIter();
   ObjIter oBegin = ObjIter(), oEnd = ObjIter();
-  std::priority_queue<QueueElement, std::vector<QueueElement>, std::greater<QueueElement> > todo; //smallest is at the top
+  std::priority_queue<QueueElement, std::vector<QueueElement>, std::greater<QueueElement> >
+      todo;  // smallest is at the top
 
   todo.push(std::make_pair(Scalar(), root));
 
-  while(!todo.empty()) {
+  while (!todo.empty()) {
     tree.getChildren(todo.top().second, vBegin, vEnd, oBegin, oEnd);
     todo.pop();
 
-    for(; oBegin != oEnd; ++oBegin) //go through child objects
+    for (; oBegin != oEnd; ++oBegin)  // go through child objects
       minimum = (std::min)(minimum, minimizer.minimumOnObject(*oBegin));
 
-    for(; vBegin != vEnd; ++vBegin) { //go through child volumes
+    for (; vBegin != vEnd; ++vBegin) {  // go through child volumes
       Scalar val = minimizer.minimumOnVolume(tree.getVolume(*vBegin));
-      if(val < minimum)
-        todo.push(std::make_pair(val, *vBegin));
+      if (val < minimum) todo.push(std::make_pair(val, *vBegin));
     }
   }
 
   return minimum;
 }
-#endif //not EIGEN_PARSED_BY_DOXYGEN
+#endif  // not EIGEN_PARSED_BY_DOXYGEN
 
-
-template<typename Volume1, typename Object1, typename Object2, typename Minimizer>
-struct minimizer_helper1
-{
+template <typename Volume1, typename Object1, typename Object2, typename Minimizer>
+struct minimizer_helper1 {
   typedef typename Minimizer::Scalar Scalar;
   minimizer_helper1(const Object2 &inStored, Minimizer &m) : stored(inStored), minimizer(m) {}
   Scalar minimumOnVolume(const Volume1 &vol) { return minimizer.minimumOnVolumeObject(vol, stored); }
   Scalar minimumOnObject(const Object1 &obj) { return minimizer.minimumOnObjectObject(obj, stored); }
   Object2 stored;
   Minimizer &minimizer;
-private:
-  minimizer_helper1& operator=(const minimizer_helper1&);
+
+ private:
+  minimizer_helper1 &operator=(const minimizer_helper1 &);
 };
 
-template<typename Volume2, typename Object2, typename Object1, typename Minimizer>
-struct minimizer_helper2
-{
+template <typename Volume2, typename Object2, typename Object1, typename Minimizer>
+struct minimizer_helper2 {
   typedef typename Minimizer::Scalar Scalar;
   minimizer_helper2(const Object1 &inStored, Minimizer &m) : stored(inStored), minimizer(m) {}
   Scalar minimumOnVolume(const Volume2 &vol) { return minimizer.minimumOnObjectVolume(stored, vol); }
   Scalar minimumOnObject(const Object2 &obj) { return minimizer.minimumOnObjectObject(stored, obj); }
   Object1 stored;
   Minimizer &minimizer;
-private:
-  minimizer_helper2& operator=(const minimizer_helper2&);
+
+ private:
+  minimizer_helper2 &operator=(const minimizer_helper2 &);
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /**  Given a BVH, runs the query encapsulated by \a minimizer.
   *  \returns the minimum value.
   *  The Minimizer type must provide the following members: \code
-     typedef Scalar //the numeric type of what is being minimized--not necessarily the Scalar type of the BVH (if it has one)
-     Scalar minimumOnVolume(const BVH::Volume &volume)
-     Scalar minimumOnObject(const BVH::Object &object)
-  \endcode
+     typedef Scalar //the numeric type of what is being minimized--not necessarily the Scalar type of the BVH (if it has
+  one) Scalar minimumOnVolume(const BVH::Volume &volume) Scalar minimumOnObject(const BVH::Object &object) \endcode
   */
-template<typename BVH, typename Minimizer>
-typename Minimizer::Scalar BVMinimize(const BVH &tree, Minimizer &minimizer)
-{
-  return internal::minimize_helper(tree, minimizer, tree.getRootIndex(), (std::numeric_limits<typename Minimizer::Scalar>::max)());
+template <typename BVH, typename Minimizer>
+typename Minimizer::Scalar BVMinimize(const BVH &tree, Minimizer &minimizer) {
+  return internal::minimize_helper(tree, minimizer, tree.getRootIndex(),
+                                   (std::numeric_limits<typename Minimizer::Scalar>::max)());
 }
 
 /**  Given two BVH's, runs the query on their cartesian product encapsulated by \a minimizer.
   *  \returns the minimum value.
   *  The Minimizer type must provide the following members: \code
-     typedef Scalar //the numeric type of what is being minimized--not necessarily the Scalar type of the BVH (if it has one)
-     Scalar minimumOnVolumeVolume(const BVH1::Volume &v1, const BVH2::Volume &v2)
-     Scalar minimumOnVolumeObject(const BVH1::Volume &v1, const BVH2::Object &o2)
-     Scalar minimumOnObjectVolume(const BVH1::Object &o1, const BVH2::Volume &v2)
+     typedef Scalar //the numeric type of what is being minimized--not necessarily the Scalar type of the BVH (if it has
+  one) Scalar minimumOnVolumeVolume(const BVH1::Volume &v1, const BVH2::Volume &v2) Scalar minimumOnVolumeObject(const
+  BVH1::Volume &v1, const BVH2::Object &o2) Scalar minimumOnObjectVolume(const BVH1::Object &o1, const BVH2::Volume &v2)
      Scalar minimumOnObjectObject(const BVH1::Object &o1, const BVH2::Object &o2)
   \endcode
   */
-template<typename BVH1, typename BVH2, typename Minimizer>
-typename Minimizer::Scalar BVMinimize(const BVH1 &tree1, const BVH2 &tree2, Minimizer &minimizer)
-{
+template <typename BVH1, typename BVH2, typename Minimizer>
+typename Minimizer::Scalar BVMinimize(const BVH1 &tree1, const BVH2 &tree2, Minimizer &minimizer) {
   typedef typename Minimizer::Scalar Scalar;
   typedef typename BVH1::Index Index1;
   typedef typename BVH2::Index Index2;
-  typedef internal::minimizer_helper1<typename BVH1::Volume, typename BVH1::Object, typename BVH2::Object, Minimizer> Helper1;
-  typedef internal::minimizer_helper2<typename BVH2::Volume, typename BVH2::Object, typename BVH1::Object, Minimizer> Helper2;
-  typedef std::pair<Scalar, std::pair<Index1, Index2> > QueueElement; //first element is priority
+  typedef internal::minimizer_helper1<typename BVH1::Volume, typename BVH1::Object, typename BVH2::Object, Minimizer>
+      Helper1;
+  typedef internal::minimizer_helper2<typename BVH2::Volume, typename BVH2::Object, typename BVH1::Object, Minimizer>
+      Helper2;
+  typedef std::pair<Scalar, std::pair<Index1, Index2> > QueueElement;  // first element is priority
   typedef typename BVH1::VolumeIterator VolIter1;
   typedef typename BVH1::ObjectIterator ObjIter1;
   typedef typename BVH2::VolumeIterator VolIter2;
@@ -252,45 +247,45 @@
   ObjIter1 oBegin1 = ObjIter1(), oEnd1 = ObjIter1();
   VolIter2 vBegin2 = VolIter2(), vEnd2 = VolIter2(), vCur2 = VolIter2();
   ObjIter2 oBegin2 = ObjIter2(), oEnd2 = ObjIter2(), oCur2 = ObjIter2();
-  std::priority_queue<QueueElement, std::vector<QueueElement>, std::greater<QueueElement> > todo; //smallest is at the top
+  std::priority_queue<QueueElement, std::vector<QueueElement>, std::greater<QueueElement> >
+      todo;  // smallest is at the top
 
   Scalar minimum = (std::numeric_limits<Scalar>::max)();
   todo.push(std::make_pair(Scalar(), std::make_pair(tree1.getRootIndex(), tree2.getRootIndex())));
 
-  while(!todo.empty()) {
+  while (!todo.empty()) {
     tree1.getChildren(todo.top().second.first, vBegin1, vEnd1, oBegin1, oEnd1);
     tree2.getChildren(todo.top().second.second, vBegin2, vEnd2, oBegin2, oEnd2);
     todo.pop();
 
-    for(; oBegin1 != oEnd1; ++oBegin1) { //go through child objects of first tree
-      for(oCur2 = oBegin2; oCur2 != oEnd2; ++oCur2) {//go through child objects of second tree
+    for (; oBegin1 != oEnd1; ++oBegin1) {               // go through child objects of first tree
+      for (oCur2 = oBegin2; oCur2 != oEnd2; ++oCur2) {  // go through child objects of second tree
         minimum = (std::min)(minimum, minimizer.minimumOnObjectObject(*oBegin1, *oCur2));
       }
 
-      for(vCur2 = vBegin2; vCur2 != vEnd2; ++vCur2) { //go through child volumes of second tree
+      for (vCur2 = vBegin2; vCur2 != vEnd2; ++vCur2) {  // go through child volumes of second tree
         Helper2 helper(*oBegin1, minimizer);
         minimum = (std::min)(minimum, internal::minimize_helper(tree2, helper, *vCur2, minimum));
       }
     }
 
-    for(; vBegin1 != vEnd1; ++vBegin1) { //go through child volumes of first tree
+    for (; vBegin1 != vEnd1; ++vBegin1) {  // go through child volumes of first tree
       const typename BVH1::Volume &vol1 = tree1.getVolume(*vBegin1);
 
-      for(oCur2 = oBegin2; oCur2 != oEnd2; ++oCur2) {//go through child objects of second tree
+      for (oCur2 = oBegin2; oCur2 != oEnd2; ++oCur2) {  // go through child objects of second tree
         Helper1 helper(*oCur2, minimizer);
         minimum = (std::min)(minimum, internal::minimize_helper(tree1, helper, *vBegin1, minimum));
       }
 
-      for(vCur2 = vBegin2; vCur2 != vEnd2; ++vCur2) { //go through child volumes of second tree
+      for (vCur2 = vBegin2; vCur2 != vEnd2; ++vCur2) {  // go through child volumes of second tree
         Scalar val = minimizer.minimumOnVolumeVolume(vol1, tree2.getVolume(*vCur2));
-        if(val < minimum)
-          todo.push(std::make_pair(val, std::make_pair(*vBegin1, *vCur2)));
+        if (val < minimum) todo.push(std::make_pair(val, std::make_pair(*vBegin1, *vCur2)));
       }
     }
   }
   return minimum;
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_BVALGORITHMS_H
+#endif  // EIGEN_BVALGORITHMS_H
diff --git a/unsupported/Eigen/src/BVH/KdBVH.h b/unsupported/Eigen/src/BVH/KdBVH.h
index 99c4751..d556783 100644
--- a/unsupported/Eigen/src/BVH/KdBVH.h
+++ b/unsupported/Eigen/src/BVH/KdBVH.h
@@ -13,15 +13,14 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
-//internal pair class for the BVH--used instead of std::pair because of alignment
-template<typename Scalar, int Dim>
-struct vector_int_pair
-{
-EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar, Dim)
+// internal pair class for the BVH--used instead of std::pair because of alignment
+template <typename Scalar, int Dim>
+struct vector_int_pair {
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar, Dim)
   typedef Matrix<Scalar, Dim, 1> VectorType;
 
   vector_int_pair(const VectorType &v, int i) : first(v), second(i) {}
@@ -30,47 +29,44 @@
   int second;
 };
 
-//these templates help the tree initializer get the bounding boxes either from a provided
-//iterator range or using bounding_box in a unified way
-template<typename ObjectList, typename VolumeList, typename BoxIter>
+// these templates help the tree initializer get the bounding boxes either from a provided
+// iterator range or using bounding_box in a unified way
+template <typename ObjectList, typename VolumeList, typename BoxIter>
 struct get_boxes_helper {
-  void operator()(const ObjectList &objects, BoxIter boxBegin, BoxIter boxEnd, VolumeList &outBoxes)
-  {
+  void operator()(const ObjectList &objects, BoxIter boxBegin, BoxIter boxEnd, VolumeList &outBoxes) {
     outBoxes.insert(outBoxes.end(), boxBegin, boxEnd);
     eigen_assert(outBoxes.size() == objects.size());
     EIGEN_ONLY_USED_FOR_DEBUG(objects);
   }
 };
 
-template<typename ObjectList, typename VolumeList>
+template <typename ObjectList, typename VolumeList>
 struct get_boxes_helper<ObjectList, VolumeList, int> {
-  void operator()(const ObjectList &objects, int, int, VolumeList &outBoxes)
-  {
+  void operator()(const ObjectList &objects, int, int, VolumeList &outBoxes) {
     outBoxes.reserve(objects.size());
-    for(int i = 0; i < (int)objects.size(); ++i)
-      outBoxes.push_back(bounding_box(objects[i]));
+    for (int i = 0; i < (int)objects.size(); ++i) outBoxes.push_back(bounding_box(objects[i]));
   }
 };
 
-} // end namespace internal
-
+}  // end namespace internal
 
 /** \class KdBVH
  *  \brief A simple bounding volume hierarchy based on AlignedBox
  *
  *  \param Scalar_ The underlying scalar type of the bounding boxes
  *  \param Dim_ The dimension of the space in which the hierarchy lives
- *  \param _Object The object type that lives in the hierarchy.  It must have value semantics.  Either bounding_box(_Object) must
- *                 be defined and return an AlignedBox<Scalar_, Dim_> or bounding boxes must be provided to the tree initializer.
+ *  \param _Object The object type that lives in the hierarchy.  It must have value semantics.  Either
+ * bounding_box(_Object) must be defined and return an AlignedBox<Scalar_, Dim_> or bounding boxes must be provided to
+ * the tree initializer.
  *
- *  This class provides a simple (as opposed to optimized) implementation of a bounding volume hierarchy analogous to a Kd-tree.
- *  Given a sequence of objects, it computes their bounding boxes, constructs a Kd-tree of their centers
- *  and builds a BVH with the structure of that Kd-tree.  When the elements of the tree are too expensive to be copied around,
- *  it is useful for _Object to be a pointer.
+ *  This class provides a simple (as opposed to optimized) implementation of a bounding volume hierarchy analogous to a
+ * Kd-tree. Given a sequence of objects, it computes their bounding boxes, constructs a Kd-tree of their centers and
+ * builds a BVH with the structure of that Kd-tree.  When the elements of the tree are too expensive to be copied
+ * around, it is useful for _Object to be a pointer.
  */
-template<typename Scalar_, int Dim_, typename _Object> class KdBVH
-{
-public:
+template <typename Scalar_, int Dim_, typename _Object>
+class KdBVH {
+ public:
   enum { Dim = Dim_ };
   typedef _Object Object;
   typedef std::vector<Object, aligned_allocator<Object> > ObjectList;
@@ -78,25 +74,36 @@
   typedef AlignedBox<Scalar, Dim> Volume;
   typedef std::vector<Volume, aligned_allocator<Volume> > VolumeList;
   typedef int Index;
-  typedef const int *VolumeIterator; //the iterators are just pointers into the tree's vectors
+  typedef const int *VolumeIterator;  // the iterators are just pointers into the tree's vectors
   typedef const Object *ObjectIterator;
 
   KdBVH() {}
 
-  /** Given an iterator range over \a Object references, constructs the BVH.  Requires that bounding_box(Object) return a Volume. */
-  template<typename Iter> KdBVH(Iter begin, Iter end) { init(begin, end, 0, 0); } //int is recognized by init as not being an iterator type
+  /** Given an iterator range over \a Object references, constructs the BVH.  Requires that bounding_box(Object) return
+   * a Volume. */
+  template <typename Iter>
+  KdBVH(Iter begin, Iter end) {
+    init(begin, end, 0, 0);
+  }  // int is recognized by init as not being an iterator type
 
-  /** Given an iterator range over \a Object references and an iterator range over their bounding boxes, constructs the BVH */
-  template<typename OIter, typename BIter> KdBVH(OIter begin, OIter end, BIter boxBegin, BIter boxEnd) { init(begin, end, boxBegin, boxEnd); }
+  /** Given an iterator range over \a Object references and an iterator range over their bounding boxes, constructs the
+   * BVH */
+  template <typename OIter, typename BIter>
+  KdBVH(OIter begin, OIter end, BIter boxBegin, BIter boxEnd) {
+    init(begin, end, boxBegin, boxEnd);
+  }
 
   /** Given an iterator range over \a Object references, constructs the BVH, overwriting whatever is in there currently.
-    * Requires that bounding_box(Object) return a Volume. */
-  template<typename Iter> void init(Iter begin, Iter end) { init(begin, end, 0, 0); }
+   * Requires that bounding_box(Object) return a Volume. */
+  template <typename Iter>
+  void init(Iter begin, Iter end) {
+    init(begin, end, 0, 0);
+  }
 
   /** Given an iterator range over \a Object references and an iterator range over their bounding boxes,
-    * constructs the BVH, overwriting whatever is in there currently. */
-  template<typename OIter, typename BIter> void init(OIter begin, OIter end, BIter boxBegin, BIter boxEnd)
-  {
+   * constructs the BVH, overwriting whatever is in there currently. */
+  template <typename OIter, typename BIter>
+  void init(OIter begin, OIter end, BIter boxBegin, BIter boxEnd) {
     objects.clear();
     boxes.clear();
     children.clear();
@@ -104,59 +111,54 @@
     objects.insert(objects.end(), begin, end);
     int n = static_cast<int>(objects.size());
 
-    if(n < 2)
-      return; //if we have at most one object, we don't need any internal nodes
+    if (n < 2) return;  // if we have at most one object, we don't need any internal nodes
 
     VolumeList objBoxes;
     VIPairList objCenters;
 
-    //compute the bounding boxes depending on BIter type
+    // compute the bounding boxes depending on BIter type
     internal::get_boxes_helper<ObjectList, VolumeList, BIter>()(objects, boxBegin, boxEnd, objBoxes);
 
     objCenters.reserve(n);
     boxes.reserve(n - 1);
     children.reserve(2 * n - 2);
 
-    for(int i = 0; i < n; ++i)
-      objCenters.push_back(VIPair(objBoxes[i].center(), i));
+    for (int i = 0; i < n; ++i) objCenters.push_back(VIPair(objBoxes[i].center(), i));
 
-    build(objCenters, 0, n, objBoxes, 0); //the recursive part of the algorithm
+    build(objCenters, 0, n, objBoxes, 0);  // the recursive part of the algorithm
 
     ObjectList tmp(n);
     tmp.swap(objects);
-    for(int i = 0; i < n; ++i)
-      objects[i] = tmp[objCenters[i].second];
+    for (int i = 0; i < n; ++i) objects[i] = tmp[objCenters[i].second];
   }
 
   /** \returns the index of the root of the hierarchy */
   inline Index getRootIndex() const { return (int)boxes.size() - 1; }
 
-  /** Given an \a index of a node, on exit, \a outVBegin and \a outVEnd range over the indices of the volume children of the node
-    * and \a outOBegin and \a outOEnd range over the object children of the node */
+  /** Given an \a index of a node, on exit, \a outVBegin and \a outVEnd range over the indices of the volume children of
+   * the node and \a outOBegin and \a outOEnd range over the object children of the node */
   EIGEN_STRONG_INLINE void getChildren(Index index, VolumeIterator &outVBegin, VolumeIterator &outVEnd,
-                                       ObjectIterator &outOBegin, ObjectIterator &outOEnd) const
-  { //inlining this function should open lots of optimization opportunities to the compiler
-    if(index < 0) {
+                                       ObjectIterator &outOBegin, ObjectIterator &outOEnd)
+      const {  // inlining this function should open lots of optimization opportunities to the compiler
+    if (index < 0) {
       outVBegin = outVEnd;
-      if(!objects.empty())
-        outOBegin = &(objects[0]);
-      outOEnd = outOBegin + objects.size(); //output all objects--necessary when the tree has only one object
+      if (!objects.empty()) outOBegin = &(objects[0]);
+      outOEnd = outOBegin + objects.size();  // output all objects--necessary when the tree has only one object
       return;
     }
 
     int numBoxes = static_cast<int>(boxes.size());
 
     int idx = index * 2;
-    if(children[idx + 1] < numBoxes) { //second index is always bigger
+    if (children[idx + 1] < numBoxes) {  // second index is always bigger
       outVBegin = &(children[idx]);
       outVEnd = outVBegin + 2;
       outOBegin = outOEnd;
-    }
-    else if(children[idx] >= numBoxes) { //if both children are objects
+    } else if (children[idx] >= numBoxes) {  // if both children are objects
       outVBegin = outVEnd;
       outOBegin = &(objects[children[idx] - numBoxes]);
       outOEnd = outOBegin + 2;
-    } else { //if the first child is a volume and the second is an object
+    } else {  // if the first child is a volume and the second is an object
       outVBegin = &(children[idx]);
       outVEnd = outVBegin + 1;
       outOBegin = &(objects[children[idx + 1] - numBoxes]);
@@ -165,47 +167,41 @@
   }
 
   /** \returns the bounding box of the node at \a index */
-  inline const Volume &getVolume(Index index) const
-  {
-    return boxes[index];
-  }
+  inline const Volume &getVolume(Index index) const { return boxes[index]; }
 
-private:
+ private:
   typedef internal::vector_int_pair<Scalar, Dim> VIPair;
   typedef std::vector<VIPair, aligned_allocator<VIPair> > VIPairList;
   typedef Matrix<Scalar, Dim, 1> VectorType;
-  struct VectorComparator //compares vectors, or more specifically, VIPairs along a particular dimension
+  struct VectorComparator  // compares vectors, or more specifically, VIPairs along a particular dimension
   {
     VectorComparator(int inDim) : dim(inDim) {}
     inline bool operator()(const VIPair &v1, const VIPair &v2) const { return v1.first[dim] < v2.first[dim]; }
     int dim;
   };
 
-  //Build the part of the tree between objects[from] and objects[to] (not including objects[to]).
-  //This routine partitions the objCenters in [from, to) along the dimension dim, recursively constructs
-  //the two halves, and adds their parent node.  TODO: a cache-friendlier layout
-  void build(VIPairList &objCenters, int from, int to, const VolumeList &objBoxes, int dim)
-  {
+  // Build the part of the tree between objects[from] and objects[to] (not including objects[to]).
+  // This routine partitions the objCenters in [from, to) along the dimension dim, recursively constructs
+  // the two halves, and adds their parent node.  TODO: a cache-friendlier layout
+  void build(VIPairList &objCenters, int from, int to, const VolumeList &objBoxes, int dim) {
     eigen_assert(to - from > 1);
-    if(to - from == 2) {
+    if (to - from == 2) {
       boxes.push_back(objBoxes[objCenters[from].second].merged(objBoxes[objCenters[from + 1].second]));
-      children.push_back(from + (int)objects.size() - 1); //there are objects.size() - 1 tree nodes
+      children.push_back(from + (int)objects.size() - 1);  // there are objects.size() - 1 tree nodes
       children.push_back(from + (int)objects.size());
-    }
-    else if(to - from == 3) {
+    } else if (to - from == 3) {
       int mid = from + 2;
-      std::nth_element(objCenters.begin() + from, objCenters.begin() + mid,
-                        objCenters.begin() + to, VectorComparator(dim)); //partition
+      std::nth_element(objCenters.begin() + from, objCenters.begin() + mid, objCenters.begin() + to,
+                       VectorComparator(dim));  // partition
       build(objCenters, from, mid, objBoxes, (dim + 1) % Dim);
       int idx1 = (int)boxes.size() - 1;
       boxes.push_back(boxes[idx1].merged(objBoxes[objCenters[mid].second]));
       children.push_back(idx1);
       children.push_back(mid + (int)objects.size() - 1);
-    }
-    else {
+    } else {
       int mid = from + (to - from) / 2;
-      nth_element(objCenters.begin() + from, objCenters.begin() + mid,
-                  objCenters.begin() + to, VectorComparator(dim)); //partition
+      nth_element(objCenters.begin() + from, objCenters.begin() + mid, objCenters.begin() + to,
+                  VectorComparator(dim));  // partition
       build(objCenters, from, mid, objBoxes, (dim + 1) % Dim);
       int idx1 = (int)boxes.size() - 1;
       build(objCenters, mid, to, objBoxes, (dim + 1) % Dim);
@@ -216,11 +212,12 @@
     }
   }
 
-  std::vector<int> children; //children of x are children[2x] and children[2x+1], indices bigger than boxes.size() index into objects.
+  std::vector<int> children;  // children of x are children[2x] and children[2x+1], indices bigger than boxes.size()
+                              // index into objects.
   VolumeList boxes;
   ObjectList objects;
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif //KDBVH_H_INCLUDED
+#endif  // KDBVH_H_INCLUDED
diff --git a/unsupported/Eigen/src/Eigenvalues/ArpackSelfAdjointEigenSolver.h b/unsupported/Eigen/src/Eigenvalues/ArpackSelfAdjointEigenSolver.h
index 43192b2..54db9bf 100644
--- a/unsupported/Eigen/src/Eigenvalues/ArpackSelfAdjointEigenSolver.h
+++ b/unsupported/Eigen/src/Eigenvalues/ArpackSelfAdjointEigenSolver.h
@@ -15,20 +15,19 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
-  template<typename Scalar, typename RealScalar> struct arpack_wrapper;
-  template<typename MatrixSolver, typename MatrixType, typename Scalar, bool BisSPD> struct OP;
-}
+template <typename Scalar, typename RealScalar>
+struct arpack_wrapper;
+template <typename MatrixSolver, typename MatrixType, typename Scalar, bool BisSPD>
+struct OP;
+}  // namespace internal
 
-
-
-template<typename MatrixType, typename MatrixSolver=SimplicialLLT<MatrixType>, bool BisSPD=false>
-class ArpackGeneralizedSelfAdjointEigenSolver
-{
-public:
-  //typedef typename MatrixSolver::MatrixType MatrixType;
+template <typename MatrixType, typename MatrixSolver = SimplicialLLT<MatrixType>, bool BisSPD = false>
+class ArpackGeneralizedSelfAdjointEigenSolver {
+ public:
+  // typedef typename MatrixSolver::MatrixType MatrixType;
 
   /** \brief Scalar type for matrices of type \p MatrixType. */
   typedef typename MatrixType::Scalar Scalar;
@@ -56,13 +55,12 @@
    *
    */
   ArpackGeneralizedSelfAdjointEigenSolver()
-   : m_eivec(),
-     m_eivalues(),
-     m_isInitialized(false),
-     m_eigenvectorsOk(false),
-     m_nbrConverged(0),
-     m_nbrIterations(0)
-  { }
+      : m_eivec(),
+        m_eivalues(),
+        m_isInitialized(false),
+        m_eigenvectorsOk(false),
+        m_nbrConverged(0),
+        m_nbrIterations(0) {}
 
   /** \brief Constructor; computes generalized eigenvalues of given matrix with respect to another matrix.
    *
@@ -86,16 +84,15 @@
    * \p options equals #ComputeEigenvectors.
    *
    */
-  ArpackGeneralizedSelfAdjointEigenSolver(const MatrixType& A, const MatrixType& B,
-                                          Index nbrEigenvalues, std::string eigs_sigma="LM",
-                               int options=ComputeEigenvectors, RealScalar tol=0.0)
-    : m_eivec(),
-      m_eivalues(),
-      m_isInitialized(false),
-      m_eigenvectorsOk(false),
-      m_nbrConverged(0),
-      m_nbrIterations(0)
-  {
+  ArpackGeneralizedSelfAdjointEigenSolver(const MatrixType &A, const MatrixType &B, Index nbrEigenvalues,
+                                          std::string eigs_sigma = "LM", int options = ComputeEigenvectors,
+                                          RealScalar tol = 0.0)
+      : m_eivec(),
+        m_eivalues(),
+        m_isInitialized(false),
+        m_eigenvectorsOk(false),
+        m_nbrConverged(0),
+        m_nbrIterations(0) {
     compute(A, B, nbrEigenvalues, eigs_sigma, options, tol);
   }
 
@@ -121,20 +118,17 @@
    *
    */
 
-  ArpackGeneralizedSelfAdjointEigenSolver(const MatrixType& A,
-                                          Index nbrEigenvalues, std::string eigs_sigma="LM",
-                               int options=ComputeEigenvectors, RealScalar tol=0.0)
-    : m_eivec(),
-      m_eivalues(),
-      m_isInitialized(false),
-      m_eigenvectorsOk(false),
-      m_nbrConverged(0),
-      m_nbrIterations(0)
-  {
+  ArpackGeneralizedSelfAdjointEigenSolver(const MatrixType &A, Index nbrEigenvalues, std::string eigs_sigma = "LM",
+                                          int options = ComputeEigenvectors, RealScalar tol = 0.0)
+      : m_eivec(),
+        m_eivalues(),
+        m_isInitialized(false),
+        m_eigenvectorsOk(false),
+        m_nbrConverged(0),
+        m_nbrIterations(0) {
     compute(A, nbrEigenvalues, eigs_sigma, options, tol);
   }
 
-
   /** \brief Computes generalized eigenvalues / eigenvectors of given matrix using the external ARPACK library.
    *
    * \param[in]  A  Selfadjoint matrix whose eigendecomposition is to be computed.
@@ -158,10 +152,10 @@
    * calling eigenvectors().
    *
    */
-  ArpackGeneralizedSelfAdjointEigenSolver& compute(const MatrixType& A, const MatrixType& B,
-                                                   Index nbrEigenvalues, std::string eigs_sigma="LM",
-                                        int options=ComputeEigenvectors, RealScalar tol=0.0);
-  
+  ArpackGeneralizedSelfAdjointEigenSolver &compute(const MatrixType &A, const MatrixType &B, Index nbrEigenvalues,
+                                                   std::string eigs_sigma = "LM", int options = ComputeEigenvectors,
+                                                   RealScalar tol = 0.0);
+
   /** \brief Computes eigenvalues / eigenvectors of given matrix using the external ARPACK library.
    *
    * \param[in]  A  Selfadjoint matrix whose eigendecomposition is to be computed.
@@ -184,10 +178,9 @@
    * calling eigenvectors().
    *
    */
-  ArpackGeneralizedSelfAdjointEigenSolver& compute(const MatrixType& A,
-                                                   Index nbrEigenvalues, std::string eigs_sigma="LM",
-                                        int options=ComputeEigenvectors, RealScalar tol=0.0);
-
+  ArpackGeneralizedSelfAdjointEigenSolver &compute(const MatrixType &A, Index nbrEigenvalues,
+                                                   std::string eigs_sigma = "LM", int options = ComputeEigenvectors,
+                                                   RealScalar tol = 0.0);
 
   /** \brief Returns the eigenvectors of given matrix.
    *
@@ -208,8 +201,7 @@
    *
    * \sa eigenvalues()
    */
-  const Matrix<Scalar, Dynamic, Dynamic>& eigenvectors() const
-  {
+  const Matrix<Scalar, Dynamic, Dynamic> &eigenvectors() const {
     eigen_assert(m_isInitialized && "ArpackGeneralizedSelfAdjointEigenSolver is not initialized.");
     eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
     return m_eivec;
@@ -230,8 +222,7 @@
    *
    * \sa eigenvectors(), MatrixBase::eigenvalues()
    */
-  const Matrix<Scalar, Dynamic, 1>& eigenvalues() const
-  {
+  const Matrix<Scalar, Dynamic, 1> &eigenvalues() const {
     eigen_assert(m_isInitialized && "ArpackGeneralizedSelfAdjointEigenSolver is not initialized.");
     return m_eivalues;
   }
@@ -254,8 +245,7 @@
    * \sa operatorInverseSqrt(),
    *     \ref MatrixFunctions_Module "MatrixFunctions Module"
    */
-  Matrix<Scalar, Dynamic, Dynamic> operatorSqrt() const
-  {
+  Matrix<Scalar, Dynamic, Dynamic> operatorSqrt() const {
     eigen_assert(m_isInitialized && "SelfAdjointEigenSolver is not initialized.");
     eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
     return m_eivec * m_eivalues.cwiseSqrt().asDiagonal() * m_eivec.adjoint();
@@ -279,8 +269,7 @@
    * \sa operatorSqrt(), MatrixBase::inverse(),
    *     \ref MatrixFunctions_Module "MatrixFunctions Module"
    */
-  Matrix<Scalar, Dynamic, Dynamic> operatorInverseSqrt() const
-  {
+  Matrix<Scalar, Dynamic, Dynamic> operatorInverseSqrt() const {
     eigen_assert(m_isInitialized && "SelfAdjointEigenSolver is not initialized.");
     eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
     return m_eivec * m_eivalues.cwiseInverse().cwiseSqrt().asDiagonal() * m_eivec.adjoint();
@@ -290,19 +279,16 @@
    *
    * \returns \c Success if computation was successful, \c NoConvergence otherwise.
    */
-  ComputationInfo info() const
-  {
+  ComputationInfo info() const {
     eigen_assert(m_isInitialized && "ArpackGeneralizedSelfAdjointEigenSolver is not initialized.");
     return m_info;
   }
 
-  size_t getNbrConvergedEigenValues() const
-  { return m_nbrConverged; }
+  size_t getNbrConvergedEigenValues() const { return m_nbrConverged; }
 
-  size_t getNbrIterations() const
-  { return m_nbrIterations; }
+  size_t getNbrIterations() const { return m_nbrIterations; }
 
-protected:
+ protected:
   Matrix<Scalar, Dynamic, Dynamic> m_eivec;
   Matrix<Scalar, Dynamic, 1> m_eivalues;
   ComputationInfo m_info;
@@ -313,35 +299,30 @@
   size_t m_nbrIterations;
 };
 
+template <typename MatrixType, typename MatrixSolver, bool BisSPD>
+ArpackGeneralizedSelfAdjointEigenSolver<MatrixType, MatrixSolver, BisSPD> &
+ArpackGeneralizedSelfAdjointEigenSolver<MatrixType, MatrixSolver, BisSPD>::compute(const MatrixType &A,
+                                                                                   Index nbrEigenvalues,
+                                                                                   std::string eigs_sigma, int options,
+                                                                                   RealScalar tol) {
+  MatrixType B(0, 0);
+  compute(A, B, nbrEigenvalues, eigs_sigma, options, tol);
 
-
-
-
-template<typename MatrixType, typename MatrixSolver, bool BisSPD>
-ArpackGeneralizedSelfAdjointEigenSolver<MatrixType, MatrixSolver, BisSPD>&
-    ArpackGeneralizedSelfAdjointEigenSolver<MatrixType, MatrixSolver, BisSPD>
-::compute(const MatrixType& A, Index nbrEigenvalues,
-          std::string eigs_sigma, int options, RealScalar tol)
-{
-    MatrixType B(0,0);
-    compute(A, B, nbrEigenvalues, eigs_sigma, options, tol);
-    
-    return *this;
+  return *this;
 }
 
-
-template<typename MatrixType, typename MatrixSolver, bool BisSPD>
-ArpackGeneralizedSelfAdjointEigenSolver<MatrixType, MatrixSolver, BisSPD>&
-    ArpackGeneralizedSelfAdjointEigenSolver<MatrixType, MatrixSolver, BisSPD>
-::compute(const MatrixType& A, const MatrixType& B, Index nbrEigenvalues,
-          std::string eigs_sigma, int options, RealScalar tol)
-{
+template <typename MatrixType, typename MatrixSolver, bool BisSPD>
+ArpackGeneralizedSelfAdjointEigenSolver<MatrixType, MatrixSolver, BisSPD> &
+ArpackGeneralizedSelfAdjointEigenSolver<MatrixType, MatrixSolver, BisSPD>::compute(const MatrixType &A,
+                                                                                   const MatrixType &B,
+                                                                                   Index nbrEigenvalues,
+                                                                                   std::string eigs_sigma, int options,
+                                                                                   RealScalar tol) {
   eigen_assert(A.cols() == A.rows());
   eigen_assert(B.cols() == B.rows());
   eigen_assert(B.rows() == 0 || A.cols() == B.rows());
-  eigen_assert((options &~ (EigVecMask | GenEigMask)) == 0
-            && (options & EigVecMask) != EigVecMask
-            && "invalid option parameter");
+  eigen_assert((options & ~(EigVecMask | GenEigMask)) == 0 && (options & EigVecMask) != EigVecMask &&
+               "invalid option parameter");
 
   bool isBempty = (B.rows() == 0) || (B.cols() == 0);
 
@@ -356,54 +337,49 @@
   // User options: "LA", "SA", "SM", "LM", "BE"
   //
   char whch[3] = "LM";
-    
+
   // Specifies the shift if iparam[6] = { 3, 4, 5 }, not used if iparam[6] = { 1, 2 }
   //
   RealScalar sigma = 0.0;
 
-  if (eigs_sigma.length() >= 2 && isalpha(eigs_sigma[0]) && isalpha(eigs_sigma[1]))
-  {
-      eigs_sigma[0] = toupper(eigs_sigma[0]);
-      eigs_sigma[1] = toupper(eigs_sigma[1]);
+  if (eigs_sigma.length() >= 2 && isalpha(eigs_sigma[0]) && isalpha(eigs_sigma[1])) {
+    eigs_sigma[0] = toupper(eigs_sigma[0]);
+    eigs_sigma[1] = toupper(eigs_sigma[1]);
 
-      // In the following special case we're going to invert the problem, since solving
-      // for larger magnitude is much much faster
-      // i.e., if 'SM' is specified, we're going to really use 'LM', the default
-      //
-      if (eigs_sigma.substr(0,2) != "SM")
-      {
-          whch[0] = eigs_sigma[0];
-          whch[1] = eigs_sigma[1];
-      }
-  }
-  else
-  {
-      eigen_assert(false && "Specifying clustered eigenvalues is not yet supported!");
+    // In the following special case we're going to invert the problem, since solving
+    // for larger magnitude is much much faster
+    // i.e., if 'SM' is specified, we're going to really use 'LM', the default
+    //
+    if (eigs_sigma.substr(0, 2) != "SM") {
+      whch[0] = eigs_sigma[0];
+      whch[1] = eigs_sigma[1];
+    }
+  } else {
+    eigen_assert(false && "Specifying clustered eigenvalues is not yet supported!");
 
-      // If it's not scalar values, then the user may be explicitly
-      // specifying the sigma value to cluster the evs around
-      //
-      sigma = atof(eigs_sigma.c_str());
+    // If it's not scalar values, then the user may be explicitly
+    // specifying the sigma value to cluster the evs around
+    //
+    sigma = atof(eigs_sigma.c_str());
 
-      // If atof fails, it returns 0.0, which is a fine default
-      //
+    // If atof fails, it returns 0.0, which is a fine default
+    //
   }
 
   // "I" means normal eigenvalue problem, "G" means generalized
   //
   char bmat[2] = "I";
-  if (eigs_sigma.substr(0,2) == "SM" || !(isalpha(eigs_sigma[0]) && isalpha(eigs_sigma[1])) || (!isBempty && !BisSPD))
-      bmat[0] = 'G';
+  if (eigs_sigma.substr(0, 2) == "SM" || !(isalpha(eigs_sigma[0]) && isalpha(eigs_sigma[1])) || (!isBempty && !BisSPD))
+    bmat[0] = 'G';
 
   // Now we determine the mode to use
   //
   int mode = (bmat[0] == 'G') + 1;
-  if (eigs_sigma.substr(0,2) == "SM" || !(isalpha(eigs_sigma[0]) && isalpha(eigs_sigma[1])))
-  {
-      // We're going to use shift-and-invert mode, and basically find
-      // the largest eigenvalues of the inverse operator
-      //
-      mode = 3;
+  if (eigs_sigma.substr(0, 2) == "SM" || !(isalpha(eigs_sigma[0]) && isalpha(eigs_sigma[1]))) {
+    // We're going to use shift-and-invert mode, and basically find
+    // the largest eigenvalues of the inverse operator
+    //
+    mode = 3;
   }
 
   // The user-specified number of eigenvalues/vectors to compute
@@ -418,27 +394,27 @@
   // Note that this indicates that nev != n, and we cannot compute
   // all eigenvalues of a mtrix
   //
-  int ncv = std::min(std::max(2*nev, 20), n);
+  int ncv = std::min(std::max(2 * nev, 20), n);
 
   // The working n x ncv matrix, also store the final eigenvectors (if computed)
   //
-  Scalar *v = new Scalar[n*ncv];
+  Scalar *v = new Scalar[n * ncv];
   int ldv = n;
 
   // Working space
   //
-  Scalar *workd = new Scalar[3*n];
-  int lworkl = ncv*ncv+8*ncv; // Must be at least this length
+  Scalar *workd = new Scalar[3 * n];
+  int lworkl = ncv * ncv + 8 * ncv;  // Must be at least this length
   Scalar *workl = new Scalar[lworkl];
 
-  int *iparam= new int[11];
-  iparam[0] = 1; // 1 means we let ARPACK perform the shifts, 0 means we'd have to do it
-  iparam[2] = std::max(300, (int)std::ceil(2*n/std::max(ncv,1)));
-  iparam[6] = mode; // The mode, 1 is standard ev problem, 2 for generalized ev, 3 for shift-and-invert
+  int *iparam = new int[11];
+  iparam[0] = 1;  // 1 means we let ARPACK perform the shifts, 0 means we'd have to do it
+  iparam[2] = std::max(300, (int)std::ceil(2 * n / std::max(ncv, 1)));
+  iparam[6] = mode;  // The mode, 1 is standard ev problem, 2 for generalized ev, 3 for shift-and-invert
 
   // Used during reverse communicate to notify where arrays start
   //
-  int *ipntr = new int[11]; 
+  int *ipntr = new int[11];
 
   // Error codes are returned in here, initial value of 0 indicates a random initial
   // residual vector is used, any other values means resid contains the initial residual
@@ -447,99 +423,75 @@
   int info = 0;
 
   Scalar scale = 1.0;
-  //if (!isBempty)
+  // if (!isBempty)
   //{
-  //Scalar scale = B.norm() / std::sqrt(n);
-  //scale = std::pow(2, std::floor(std::log(scale+1)));
+  // Scalar scale = B.norm() / std::sqrt(n);
+  // scale = std::pow(2, std::floor(std::log(scale+1)));
   ////M /= scale;
-  //for (size_t i=0; i<(size_t)B.outerSize(); i++)
-  //    for (typename MatrixType::InnerIterator it(B, i); it; ++it)
-  //        it.valueRef() /= scale;
-  //}
+  // for (size_t i=0; i<(size_t)B.outerSize(); i++)
+  //     for (typename MatrixType::InnerIterator it(B, i); it; ++it)
+  //         it.valueRef() /= scale;
+  // }
 
   MatrixSolver OP;
-  if (mode == 1 || mode == 2)
-  {
-      if (!isBempty)
-          OP.compute(B);
-  }
-  else if (mode == 3)
-  {
-      if (sigma == 0.0)
-      {
-          OP.compute(A);
+  if (mode == 1 || mode == 2) {
+    if (!isBempty) OP.compute(B);
+  } else if (mode == 3) {
+    if (sigma == 0.0) {
+      OP.compute(A);
+    } else {
+      // Note: We will never enter here because sigma must be 0.0
+      //
+      if (isBempty) {
+        MatrixType AminusSigmaB(A);
+        for (Index i = 0; i < A.rows(); ++i) AminusSigmaB.coeffRef(i, i) -= sigma;
+
+        OP.compute(AminusSigmaB);
+      } else {
+        MatrixType AminusSigmaB = A - sigma * B;
+        OP.compute(AminusSigmaB);
       }
-      else
-      {
-          // Note: We will never enter here because sigma must be 0.0
-          //
-          if (isBempty)
-          {
-            MatrixType AminusSigmaB(A);
-            for (Index i=0; i<A.rows(); ++i)
-                AminusSigmaB.coeffRef(i,i) -= sigma;
-            
-            OP.compute(AminusSigmaB);
-          }
-          else
-          {
-              MatrixType AminusSigmaB = A - sigma * B;
-              OP.compute(AminusSigmaB);
-          }
-      }
+    }
   }
- 
+
   if (!(mode == 1 && isBempty) && !(mode == 2 && isBempty) && OP.info() != Success)
-      std::cout << "Error factoring matrix" << std::endl;
+    std::cout << "Error factoring matrix" << std::endl;
 
-  do
-  {
-    internal::arpack_wrapper<Scalar, RealScalar>::saupd(&ido, bmat, &n, whch, &nev, &tol, resid, 
-                                                        &ncv, v, &ldv, iparam, ipntr, workd, workl,
-                                                        &lworkl, &info);
+  do {
+    internal::arpack_wrapper<Scalar, RealScalar>::saupd(&ido, bmat, &n, whch, &nev, &tol, resid, &ncv, v, &ldv, iparam,
+                                                        ipntr, workd, workl, &lworkl, &info);
 
-    if (ido == -1 || ido == 1)
-    {
-      Scalar *in  = workd + ipntr[0] - 1;
+    if (ido == -1 || ido == 1) {
+      Scalar *in = workd + ipntr[0] - 1;
       Scalar *out = workd + ipntr[1] - 1;
 
-      if (ido == 1 && mode != 2)
-      {
-          Scalar *out2 = workd + ipntr[2] - 1;
-          if (isBempty || mode == 1)
-            Matrix<Scalar, Dynamic, 1>::Map(out2, n) = Matrix<Scalar, Dynamic, 1>::Map(in, n);
-          else
-            Matrix<Scalar, Dynamic, 1>::Map(out2, n) = B * Matrix<Scalar, Dynamic, 1>::Map(in, n);
-          
-          in = workd + ipntr[2] - 1;
+      if (ido == 1 && mode != 2) {
+        Scalar *out2 = workd + ipntr[2] - 1;
+        if (isBempty || mode == 1)
+          Matrix<Scalar, Dynamic, 1>::Map(out2, n) = Matrix<Scalar, Dynamic, 1>::Map(in, n);
+        else
+          Matrix<Scalar, Dynamic, 1>::Map(out2, n) = B * Matrix<Scalar, Dynamic, 1>::Map(in, n);
+
+        in = workd + ipntr[2] - 1;
       }
 
-      if (mode == 1)
-      {
-        if (isBempty)
-        {
+      if (mode == 1) {
+        if (isBempty) {
           // OP = A
           //
           Matrix<Scalar, Dynamic, 1>::Map(out, n) = A * Matrix<Scalar, Dynamic, 1>::Map(in, n);
-        }
-        else
-        {
+        } else {
           // OP = L^{-1}AL^{-T}
           //
           internal::OP<MatrixSolver, MatrixType, Scalar, BisSPD>::applyOP(OP, A, n, in, out);
         }
-      }
-      else if (mode == 2)
-      {
-        if (ido == 1)
-          Matrix<Scalar, Dynamic, 1>::Map(in, n)  = A * Matrix<Scalar, Dynamic, 1>::Map(in, n);
-        
+      } else if (mode == 2) {
+        if (ido == 1) Matrix<Scalar, Dynamic, 1>::Map(in, n) = A * Matrix<Scalar, Dynamic, 1>::Map(in, n);
+
         // OP = B^{-1} A
         //
         Matrix<Scalar, Dynamic, 1>::Map(out, n) = OP.solve(Matrix<Scalar, Dynamic, 1>::Map(in, n));
-      }
-      else if (mode == 3)
-      {
+      } else if (mode == 3) {
         // OP = (A-\sigmaB)B (\sigma could be 0, and B could be I)
         // The B * in is already computed and stored at in if ido == 1
         //
@@ -548,10 +500,8 @@
         else
           Matrix<Scalar, Dynamic, 1>::Map(out, n) = OP.solve(B * Matrix<Scalar, Dynamic, 1>::Map(in, n));
       }
-    }
-    else if (ido == 2)
-    {
-      Scalar *in  = workd + ipntr[0] - 1;
+    } else if (ido == 2) {
+      Scalar *in = workd + ipntr[0] - 1;
       Scalar *out = workd + ipntr[1] - 1;
 
       if (isBempty || mode == 1)
@@ -569,15 +519,14 @@
     m_info = InvalidInput;
   else if (info != 0)
     eigen_assert(false && "Unknown ARPACK return value!");
-  else
-  {
+  else {
     // Do we compute eigenvectors or not?
     //
     int rvec = (options & ComputeEigenvectors) == ComputeEigenvectors;
 
     // "A" means "All", use "S" to choose specific eigenvalues (not yet supported in ARPACK))
     //
-    char howmny[2] = "A"; 
+    char howmny[2] = "A";
 
     // if howmny == "S", specifies the eigenvalues to compute (not implemented in ARPACK)
     //
@@ -587,23 +536,20 @@
     //
     m_eivalues.resize(nev, 1);
 
-    internal::arpack_wrapper<Scalar, RealScalar>::seupd(&rvec, howmny, select, m_eivalues.data(), v, &ldv,
-                                                        &sigma, bmat, &n, whch, &nev, &tol, resid, &ncv,
-                                                        v, &ldv, iparam, ipntr, workd, workl, &lworkl, &info);
+    internal::arpack_wrapper<Scalar, RealScalar>::seupd(&rvec, howmny, select, m_eivalues.data(), v, &ldv, &sigma, bmat,
+                                                        &n, whch, &nev, &tol, resid, &ncv, v, &ldv, iparam, ipntr,
+                                                        workd, workl, &lworkl, &info);
 
     if (info == -14)
       m_info = NoConvergence;
     else if (info != 0)
       m_info = InvalidInput;
-    else
-    {
-      if (rvec)
-      {
+    else {
+      if (rvec) {
         m_eivec.resize(A.rows(), nev);
-        for (int i=0; i<nev; i++)
-          for (int j=0; j<n; j++)
-            m_eivec(j,i) = v[i*n+j] / scale;
-      
+        for (int i = 0; i < nev; i++)
+          for (int j = 0; j < n; j++) m_eivec(j, i) = v[i * n + j] / scale;
+
         if (mode == 1 && !isBempty && BisSPD)
           internal::OP<MatrixSolver, MatrixType, Scalar, BisSPD>::project(OP, n, nev, m_eivec.data());
 
@@ -611,7 +557,7 @@
       }
 
       m_nbrIterations = iparam[2];
-      m_nbrConverged  = iparam[4];
+      m_nbrConverged = iparam[4];
 
       m_info = Success;
     }
@@ -631,118 +577,85 @@
   return *this;
 }
 
-
 // Single precision
 //
-extern "C" void ssaupd_(int *ido, char *bmat, int *n, char *which,
-    int *nev, float *tol, float *resid, int *ncv,
-    float *v, int *ldv, int *iparam, int *ipntr,
-    float *workd, float *workl, int *lworkl,
-    int *info);
+extern "C" void ssaupd_(int *ido, char *bmat, int *n, char *which, int *nev, float *tol, float *resid, int *ncv,
+                        float *v, int *ldv, int *iparam, int *ipntr, float *workd, float *workl, int *lworkl,
+                        int *info);
 
-extern "C" void sseupd_(int *rvec, char *All, int *select, float *d,
-    float *z, int *ldz, float *sigma, 
-    char *bmat, int *n, char *which, int *nev,
-    float *tol, float *resid, int *ncv, float *v,
-    int *ldv, int *iparam, int *ipntr, float *workd,
-    float *workl, int *lworkl, int *ierr);
+extern "C" void sseupd_(int *rvec, char *All, int *select, float *d, float *z, int *ldz, float *sigma, char *bmat,
+                        int *n, char *which, int *nev, float *tol, float *resid, int *ncv, float *v, int *ldv,
+                        int *iparam, int *ipntr, float *workd, float *workl, int *lworkl, int *ierr);
 
 // Double precision
 //
-extern "C" void dsaupd_(int *ido, char *bmat, int *n, char *which,
-    int *nev, double *tol, double *resid, int *ncv,
-    double *v, int *ldv, int *iparam, int *ipntr,
-    double *workd, double *workl, int *lworkl,
-    int *info);
+extern "C" void dsaupd_(int *ido, char *bmat, int *n, char *which, int *nev, double *tol, double *resid, int *ncv,
+                        double *v, int *ldv, int *iparam, int *ipntr, double *workd, double *workl, int *lworkl,
+                        int *info);
 
-extern "C" void dseupd_(int *rvec, char *All, int *select, double *d,
-    double *z, int *ldz, double *sigma, 
-    char *bmat, int *n, char *which, int *nev,
-    double *tol, double *resid, int *ncv, double *v,
-    int *ldv, int *iparam, int *ipntr, double *workd,
-    double *workl, int *lworkl, int *ierr);
-
+extern "C" void dseupd_(int *rvec, char *All, int *select, double *d, double *z, int *ldz, double *sigma, char *bmat,
+                        int *n, char *which, int *nev, double *tol, double *resid, int *ncv, double *v, int *ldv,
+                        int *iparam, int *ipntr, double *workd, double *workl, int *lworkl, int *ierr);
 
 namespace internal {
 
-template<typename Scalar, typename RealScalar> struct arpack_wrapper
-{
-  static inline void saupd(int *ido, char *bmat, int *n, char *which,
-      int *nev, RealScalar *tol, Scalar *resid, int *ncv,
-      Scalar *v, int *ldv, int *iparam, int *ipntr,
-      Scalar *workd, Scalar *workl, int *lworkl, int *info)
-  { 
+template <typename Scalar, typename RealScalar>
+struct arpack_wrapper {
+  static inline void saupd(int *ido, char *bmat, int *n, char *which, int *nev, RealScalar *tol, Scalar *resid,
+                           int *ncv, Scalar *v, int *ldv, int *iparam, int *ipntr, Scalar *workd, Scalar *workl,
+                           int *lworkl, int *info) {
     EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::IsComplex, NUMERIC_TYPE_MUST_BE_REAL)
   }
 
-  static inline void seupd(int *rvec, char *All, int *select, Scalar *d,
-      Scalar *z, int *ldz, RealScalar *sigma,
-      char *bmat, int *n, char *which, int *nev,
-      RealScalar *tol, Scalar *resid, int *ncv, Scalar *v,
-      int *ldv, int *iparam, int *ipntr, Scalar *workd,
-      Scalar *workl, int *lworkl, int *ierr)
-  {
+  static inline void seupd(int *rvec, char *All, int *select, Scalar *d, Scalar *z, int *ldz, RealScalar *sigma,
+                           char *bmat, int *n, char *which, int *nev, RealScalar *tol, Scalar *resid, int *ncv,
+                           Scalar *v, int *ldv, int *iparam, int *ipntr, Scalar *workd, Scalar *workl, int *lworkl,
+                           int *ierr) {
     EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::IsComplex, NUMERIC_TYPE_MUST_BE_REAL)
   }
 };
 
-template <> struct arpack_wrapper<float, float>
-{
-  static inline void saupd(int *ido, char *bmat, int *n, char *which,
-      int *nev, float *tol, float *resid, int *ncv,
-      float *v, int *ldv, int *iparam, int *ipntr,
-      float *workd, float *workl, int *lworkl, int *info)
-  {
+template <>
+struct arpack_wrapper<float, float> {
+  static inline void saupd(int *ido, char *bmat, int *n, char *which, int *nev, float *tol, float *resid, int *ncv,
+                           float *v, int *ldv, int *iparam, int *ipntr, float *workd, float *workl, int *lworkl,
+                           int *info) {
     ssaupd_(ido, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, ipntr, workd, workl, lworkl, info);
   }
 
-  static inline void seupd(int *rvec, char *All, int *select, float *d,
-      float *z, int *ldz, float *sigma,
-      char *bmat, int *n, char *which, int *nev,
-      float *tol, float *resid, int *ncv, float *v,
-      int *ldv, int *iparam, int *ipntr, float *workd,
-      float *workl, int *lworkl, int *ierr)
-  {
-    sseupd_(rvec, All, select, d, z, ldz, sigma, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, ipntr,
-        workd, workl, lworkl, ierr);
+  static inline void seupd(int *rvec, char *All, int *select, float *d, float *z, int *ldz, float *sigma, char *bmat,
+                           int *n, char *which, int *nev, float *tol, float *resid, int *ncv, float *v, int *ldv,
+                           int *iparam, int *ipntr, float *workd, float *workl, int *lworkl, int *ierr) {
+    sseupd_(rvec, All, select, d, z, ldz, sigma, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, ipntr, workd,
+            workl, lworkl, ierr);
   }
 };
 
-template <> struct arpack_wrapper<double, double>
-{
-  static inline void saupd(int *ido, char *bmat, int *n, char *which,
-      int *nev, double *tol, double *resid, int *ncv,
-      double *v, int *ldv, int *iparam, int *ipntr,
-      double *workd, double *workl, int *lworkl, int *info)
-  {
+template <>
+struct arpack_wrapper<double, double> {
+  static inline void saupd(int *ido, char *bmat, int *n, char *which, int *nev, double *tol, double *resid, int *ncv,
+                           double *v, int *ldv, int *iparam, int *ipntr, double *workd, double *workl, int *lworkl,
+                           int *info) {
     dsaupd_(ido, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, ipntr, workd, workl, lworkl, info);
   }
 
-  static inline void seupd(int *rvec, char *All, int *select, double *d,
-      double *z, int *ldz, double *sigma,
-      char *bmat, int *n, char *which, int *nev,
-      double *tol, double *resid, int *ncv, double *v,
-      int *ldv, int *iparam, int *ipntr, double *workd,
-      double *workl, int *lworkl, int *ierr)
-  {
-    dseupd_(rvec, All, select, d, v, ldv, sigma, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, ipntr,
-        workd, workl, lworkl, ierr);
+  static inline void seupd(int *rvec, char *All, int *select, double *d, double *z, int *ldz, double *sigma, char *bmat,
+                           int *n, char *which, int *nev, double *tol, double *resid, int *ncv, double *v, int *ldv,
+                           int *iparam, int *ipntr, double *workd, double *workl, int *lworkl, int *ierr) {
+    dseupd_(rvec, All, select, d, v, ldv, sigma, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, ipntr, workd,
+            workl, lworkl, ierr);
   }
 };
 
-
-template<typename MatrixSolver, typename MatrixType, typename Scalar, bool BisSPD>
-struct OP
-{
-    static inline void applyOP(MatrixSolver &OP, const MatrixType &A, int n, Scalar *in, Scalar *out);
-    static inline void project(MatrixSolver &OP, int n, int k, Scalar *vecs);
+template <typename MatrixSolver, typename MatrixType, typename Scalar, bool BisSPD>
+struct OP {
+  static inline void applyOP(MatrixSolver &OP, const MatrixType &A, int n, Scalar *in, Scalar *out);
+  static inline void project(MatrixSolver &OP, int n, int k, Scalar *vecs);
 };
 
-template<typename MatrixSolver, typename MatrixType, typename Scalar>
-struct OP<MatrixSolver, MatrixType, Scalar, true>
-{
-  static inline void applyOP(MatrixSolver &OP, const MatrixType &A, int n, Scalar *in, Scalar *out)
-{
+template <typename MatrixSolver, typename MatrixType, typename Scalar>
+struct OP<MatrixSolver, MatrixType, Scalar, true> {
+  static inline void applyOP(MatrixSolver &OP, const MatrixType &A, int n, Scalar *in, Scalar *out) {
     // OP = L^{-1} A L^{-T}  (B = LL^T)
     //
     // First solve L^T out = in
@@ -758,36 +671,31 @@
     //
     Matrix<Scalar, Dynamic, 1>::Map(out, n) = OP.permutationP() * Matrix<Scalar, Dynamic, 1>::Map(out, n);
     Matrix<Scalar, Dynamic, 1>::Map(out, n) = OP.matrixL().solve(Matrix<Scalar, Dynamic, 1>::Map(out, n));
-}
+  }
 
-  static inline void project(MatrixSolver &OP, int n, int k, Scalar *vecs)
-{
+  static inline void project(MatrixSolver &OP, int n, int k, Scalar *vecs) {
     // Solve L^T out = in
     //
-    Matrix<Scalar, Dynamic, Dynamic>::Map(vecs, n, k) = OP.matrixU().solve(Matrix<Scalar, Dynamic, Dynamic>::Map(vecs, n, k));
-    Matrix<Scalar, Dynamic, Dynamic>::Map(vecs, n, k) = OP.permutationPinv() * Matrix<Scalar, Dynamic, Dynamic>::Map(vecs, n, k);
-}
-
+    Matrix<Scalar, Dynamic, Dynamic>::Map(vecs, n, k) =
+        OP.matrixU().solve(Matrix<Scalar, Dynamic, Dynamic>::Map(vecs, n, k));
+    Matrix<Scalar, Dynamic, Dynamic>::Map(vecs, n, k) =
+        OP.permutationPinv() * Matrix<Scalar, Dynamic, Dynamic>::Map(vecs, n, k);
+  }
 };
 
-template<typename MatrixSolver, typename MatrixType, typename Scalar>
-struct OP<MatrixSolver, MatrixType, Scalar, false>
-{
-  static inline void applyOP(MatrixSolver &OP, const MatrixType &A, int n, Scalar *in, Scalar *out)
-{
+template <typename MatrixSolver, typename MatrixType, typename Scalar>
+struct OP<MatrixSolver, MatrixType, Scalar, false> {
+  static inline void applyOP(MatrixSolver &OP, const MatrixType &A, int n, Scalar *in, Scalar *out) {
     eigen_assert(false && "Should never be in here...");
-}
+  }
 
-  static inline void project(MatrixSolver &OP, int n, int k, Scalar *vecs)
-{
+  static inline void project(MatrixSolver &OP, int n, int k, Scalar *vecs) {
     eigen_assert(false && "Should never be in here...");
-}
-
+  }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_ARPACKSELFADJOINTEIGENSOLVER_H
-
+#endif  // EIGEN_ARPACKSELFADJOINTEIGENSOLVER_H
diff --git a/unsupported/Eigen/src/EulerAngles/EulerAngles.h b/unsupported/Eigen/src/EulerAngles/EulerAngles.h
index 740769e..14ecd04 100644
--- a/unsupported/Eigen/src/EulerAngles/EulerAngles.h
+++ b/unsupported/Eigen/src/EulerAngles/EulerAngles.h
@@ -7,314 +7,306 @@
 // 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_EULERANGLESCLASS_H// TODO: Fix previous "EIGEN_EULERANGLES_H" definition?
+#ifndef EIGEN_EULERANGLESCLASS_H  // TODO: Fix previous "EIGEN_EULERANGLES_H" definition?
 #define EIGEN_EULERANGLESCLASS_H
 
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen
-{
-  /** \class EulerAngles
-    *
-    * \ingroup EulerAngles_Module
-    *
-    * \brief Represents a rotation in a 3 dimensional space as three Euler angles.
-    *
-    * Euler rotation is a set of three rotation of three angles over three fixed axes, defined by the EulerSystem given as a template parameter.
-    * 
-    * Here is how intrinsic Euler angles works:
-    *  - first, rotate the axes system over the alpha axis in angle alpha
-    *  - then, rotate the axes system over the beta axis(which was rotated in the first stage) in angle beta
-    *  - then, rotate the axes system over the gamma axis(which was rotated in the two stages above) in angle gamma
-    *
-    * \note This class support only intrinsic Euler angles for simplicity,
-    *  see EulerSystem how to easily overcome this for extrinsic systems.
-    *
-    * ### Rotation representation and conversions ###
-    *
-    * It has been proved(see Wikipedia link below) that every rotation can be represented
-    *  by Euler angles, but there is no single representation (e.g. unlike rotation matrices).
-    * Therefore, you can convert from Eigen rotation and to them
-    *  (including rotation matrices, which is not called "rotations" by Eigen design).
-    *
-    * Euler angles usually used for:
-    *  - convenient human representation of rotation, especially in interactive GUI.
-    *  - gimbal systems and robotics
-    *  - efficient encoding(i.e. 3 floats only) of rotation for network protocols.
-    *
-    * However, Euler angles are slow comparing to quaternion or matrices,
-    *  because their unnatural math definition, although it's simple for human.
-    * To overcome this, this class provide easy movement from the math friendly representation
-    *  to the human friendly representation, and vise-versa.
-    *
-    * All the user need to do is a safe simple C++ type conversion,
-    *  and this class take care for the math.
-    * Additionally, some axes related computation is done in compile time.
-    *
-    * #### Euler angles ranges in conversions ####
-    * Rotations representation as EulerAngles are not single (unlike matrices),
-    *  and even have infinite EulerAngles representations.<BR>
-    * For example, add or subtract 2*PI from either angle of EulerAngles
-    *  and you'll get the same rotation.
-    * This is the general reason for infinite representation,
-    *  but it's not the only general reason for not having a single representation.
-    *
-    * When converting rotation to EulerAngles, this class convert it to specific ranges
-    * When converting some rotation to EulerAngles, the rules for ranges are as follow:
-    * - If the rotation we converting from is an EulerAngles
-    *  (even when it represented as RotationBase explicitly), angles ranges are __undefined__.
-    * - otherwise, alpha and gamma angles will be in the range [-PI, PI].<BR>
-    *   As for Beta angle:
-    *    - If the system is Tait-Bryan, the beta angle will be in the range [-PI/2, PI/2].
-    *    - otherwise:
-    *      - If the beta axis is positive, the beta angle will be in the range [0, PI]
-    *      - If the beta axis is negative, the beta angle will be in the range [-PI, 0]
-    *
-    * \sa EulerAngles(const MatrixBase<Derived>&)
-    * \sa EulerAngles(const RotationBase<Derived, 3>&)
-    *
-    * ### Convenient user typedefs ###
-    *
-    * Convenient typedefs for EulerAngles exist for float and double scalar,
-    *  in a form of EulerAngles{A}{B}{C}{scalar},
-    *  e.g. \ref EulerAnglesXYZd, \ref EulerAnglesZYZf.
-    *
-    * Only for positive axes{+x,+y,+z} Euler systems are have convenient typedef.
-    * If you need negative axes{-x,-y,-z}, it is recommended to create you own typedef with
-    *  a word that represent what you need.
-    *
-    * ### Example ###
-    *
-    * \include EulerAngles.cpp
-    * Output: \verbinclude EulerAngles.out
-    *
-    * ### Additional reading ###
-    *
-    * If you're want to get more idea about how Euler system work in Eigen see EulerSystem.
-    *
-    * More information about Euler angles: https://en.wikipedia.org/wiki/Euler_angles
-    *
-    * \tparam Scalar_ the scalar type, i.e. the type of the angles.
-    *
-    * \tparam _System the EulerSystem to use, which represents the axes of rotation.
-    */
-  template <typename Scalar_, class _System>
-  class EulerAngles : public RotationBase<EulerAngles<Scalar_, _System>, 3>
+namespace Eigen {
+/** \class EulerAngles
+ *
+ * \ingroup EulerAngles_Module
+ *
+ * \brief Represents a rotation in a 3 dimensional space as three Euler angles.
+ *
+ * Euler rotation is a set of three rotation of three angles over three fixed axes, defined by the EulerSystem given as
+ * a template parameter.
+ *
+ * Here is how intrinsic Euler angles works:
+ *  - first, rotate the axes system over the alpha axis in angle alpha
+ *  - then, rotate the axes system over the beta axis(which was rotated in the first stage) in angle beta
+ *  - then, rotate the axes system over the gamma axis(which was rotated in the two stages above) in angle gamma
+ *
+ * \note This class support only intrinsic Euler angles for simplicity,
+ *  see EulerSystem how to easily overcome this for extrinsic systems.
+ *
+ * ### Rotation representation and conversions ###
+ *
+ * It has been proved(see Wikipedia link below) that every rotation can be represented
+ *  by Euler angles, but there is no single representation (e.g. unlike rotation matrices).
+ * Therefore, you can convert from Eigen rotation and to them
+ *  (including rotation matrices, which is not called "rotations" by Eigen design).
+ *
+ * Euler angles usually used for:
+ *  - convenient human representation of rotation, especially in interactive GUI.
+ *  - gimbal systems and robotics
+ *  - efficient encoding(i.e. 3 floats only) of rotation for network protocols.
+ *
+ * However, Euler angles are slow comparing to quaternion or matrices,
+ *  because their unnatural math definition, although it's simple for human.
+ * To overcome this, this class provide easy movement from the math friendly representation
+ *  to the human friendly representation, and vise-versa.
+ *
+ * All the user need to do is a safe simple C++ type conversion,
+ *  and this class take care for the math.
+ * Additionally, some axes related computation is done in compile time.
+ *
+ * #### Euler angles ranges in conversions ####
+ * Rotations representation as EulerAngles are not single (unlike matrices),
+ *  and even have infinite EulerAngles representations.<BR>
+ * For example, add or subtract 2*PI from either angle of EulerAngles
+ *  and you'll get the same rotation.
+ * This is the general reason for infinite representation,
+ *  but it's not the only general reason for not having a single representation.
+ *
+ * When converting rotation to EulerAngles, this class convert it to specific ranges
+ * When converting some rotation to EulerAngles, the rules for ranges are as follow:
+ * - If the rotation we converting from is an EulerAngles
+ *  (even when it represented as RotationBase explicitly), angles ranges are __undefined__.
+ * - otherwise, alpha and gamma angles will be in the range [-PI, PI].<BR>
+ *   As for Beta angle:
+ *    - If the system is Tait-Bryan, the beta angle will be in the range [-PI/2, PI/2].
+ *    - otherwise:
+ *      - If the beta axis is positive, the beta angle will be in the range [0, PI]
+ *      - If the beta axis is negative, the beta angle will be in the range [-PI, 0]
+ *
+ * \sa EulerAngles(const MatrixBase<Derived>&)
+ * \sa EulerAngles(const RotationBase<Derived, 3>&)
+ *
+ * ### Convenient user typedefs ###
+ *
+ * Convenient typedefs for EulerAngles exist for float and double scalar,
+ *  in a form of EulerAngles{A}{B}{C}{scalar},
+ *  e.g. \ref EulerAnglesXYZd, \ref EulerAnglesZYZf.
+ *
+ * Only for positive axes{+x,+y,+z} Euler systems are have convenient typedef.
+ * If you need negative axes{-x,-y,-z}, it is recommended to create you own typedef with
+ *  a word that represent what you need.
+ *
+ * ### Example ###
+ *
+ * \include EulerAngles.cpp
+ * Output: \verbinclude EulerAngles.out
+ *
+ * ### Additional reading ###
+ *
+ * If you're want to get more idea about how Euler system work in Eigen see EulerSystem.
+ *
+ * More information about Euler angles: https://en.wikipedia.org/wiki/Euler_angles
+ *
+ * \tparam Scalar_ the scalar type, i.e. the type of the angles.
+ *
+ * \tparam _System the EulerSystem to use, which represents the axes of rotation.
+ */
+template <typename Scalar_, class _System>
+class EulerAngles : public RotationBase<EulerAngles<Scalar_, _System>, 3> {
+ public:
+  typedef RotationBase<EulerAngles<Scalar_, _System>, 3> Base;
+
+  /** the scalar type of the angles */
+  typedef Scalar_ Scalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+
+  /** the EulerSystem to use, which represents the axes of rotation. */
+  typedef _System System;
+
+  typedef Matrix<Scalar, 3, 3> Matrix3;      /*!< the equivalent rotation matrix type */
+  typedef Matrix<Scalar, 3, 1> Vector3;      /*!< the equivalent 3 dimension vector type */
+  typedef Quaternion<Scalar> QuaternionType; /*!< the equivalent quaternion type */
+  typedef AngleAxis<Scalar> AngleAxisType;   /*!< the equivalent angle-axis type */
+
+  /** \returns the axis vector of the first (alpha) rotation */
+  static Vector3 AlphaAxisVector() {
+    const Vector3& u = Vector3::Unit(System::AlphaAxisAbs - 1);
+    return System::IsAlphaOpposite ? -u : u;
+  }
+
+  /** \returns the axis vector of the second (beta) rotation */
+  static Vector3 BetaAxisVector() {
+    const Vector3& u = Vector3::Unit(System::BetaAxisAbs - 1);
+    return System::IsBetaOpposite ? -u : u;
+  }
+
+  /** \returns the axis vector of the third (gamma) rotation */
+  static Vector3 GammaAxisVector() {
+    const Vector3& u = Vector3::Unit(System::GammaAxisAbs - 1);
+    return System::IsGammaOpposite ? -u : u;
+  }
+
+ private:
+  Vector3 m_angles;
+
+ public:
+  /** Default constructor without initialization. */
+  EulerAngles() {}
+  /** Constructs and initialize an EulerAngles (\p alpha, \p beta, \p gamma). */
+  EulerAngles(const Scalar& alpha, const Scalar& beta, const Scalar& gamma) : m_angles(alpha, beta, gamma) {}
+
+  // TODO: Test this constructor
+  /** Constructs and initialize an EulerAngles from the array data {alpha, beta, gamma} */
+  explicit EulerAngles(const Scalar* data) : m_angles(data) {}
+
+  /** Constructs and initializes an EulerAngles from either:
+   *  - a 3x3 rotation matrix expression(i.e. pure orthogonal matrix with determinant of +1),
+   *  - a 3D vector expression representing Euler angles.
+   *
+   * \note If \p other is a 3x3 rotation matrix, the angles range rules will be as follow:<BR>
+   *  Alpha and gamma angles will be in the range [-PI, PI].<BR>
+   *  As for Beta angle:
+   *   - If the system is Tait-Bryan, the beta angle will be in the range [-PI/2, PI/2].
+   *   - otherwise:
+   *     - If the beta axis is positive, the beta angle will be in the range [0, PI]
+   *     - If the beta axis is negative, the beta angle will be in the range [-PI, 0]
+   */
+  template <typename Derived>
+  explicit EulerAngles(const MatrixBase<Derived>& other) {
+    *this = other;
+  }
+
+  /** Constructs and initialize Euler angles from a rotation \p rot.
+   *
+   * \note If \p rot is an EulerAngles (even when it represented as RotationBase explicitly),
+   *  angles ranges are __undefined__.
+   *  Otherwise, alpha and gamma angles will be in the range [-PI, PI].<BR>
+   *  As for Beta angle:
+   *   - If the system is Tait-Bryan, the beta angle will be in the range [-PI/2, PI/2].
+   *   - otherwise:
+   *     - If the beta axis is positive, the beta angle will be in the range [0, PI]
+   *     - If the beta axis is negative, the beta angle will be in the range [-PI, 0]
+   */
+  template <typename Derived>
+  EulerAngles(const RotationBase<Derived, 3>& rot) {
+    System::CalcEulerAngles(*this, rot.toRotationMatrix());
+  }
+
+  /*EulerAngles(const QuaternionType& q)
   {
-    public:
-      typedef RotationBase<EulerAngles<Scalar_, _System>, 3> Base;
-      
-      /** the scalar type of the angles */
-      typedef Scalar_ Scalar;
-      typedef typename NumTraits<Scalar>::Real RealScalar;
-      
-      /** the EulerSystem to use, which represents the axes of rotation. */
-      typedef _System System;
-    
-      typedef Matrix<Scalar,3,3> Matrix3; /*!< the equivalent rotation matrix type */
-      typedef Matrix<Scalar,3,1> Vector3; /*!< the equivalent 3 dimension vector type */
-      typedef Quaternion<Scalar> QuaternionType; /*!< the equivalent quaternion type */
-      typedef AngleAxis<Scalar> AngleAxisType; /*!< the equivalent angle-axis type */
-      
-      /** \returns the axis vector of the first (alpha) rotation */
-      static Vector3 AlphaAxisVector() {
-        const Vector3& u = Vector3::Unit(System::AlphaAxisAbs - 1);
-        return System::IsAlphaOpposite ? -u : u;
-      }
-      
-      /** \returns the axis vector of the second (beta) rotation */
-      static Vector3 BetaAxisVector() {
-        const Vector3& u = Vector3::Unit(System::BetaAxisAbs - 1);
-        return System::IsBetaOpposite ? -u : u;
-      }
-      
-      /** \returns the axis vector of the third (gamma) rotation */
-      static Vector3 GammaAxisVector() {
-        const Vector3& u = Vector3::Unit(System::GammaAxisAbs - 1);
-        return System::IsGammaOpposite ? -u : u;
-      }
+    // TODO: Implement it in a faster way for quaternions
+    // According to http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/
+    //  we can compute only the needed matrix cells and then convert to euler angles. (see ZYX example below)
+    // Currently we compute all matrix cells from quaternion.
 
-    private:
-      Vector3 m_angles;
+    // Special case only for ZYX
+    //Scalar y2 = q.y() * q.y();
+    //m_angles[0] = std::atan2(2*(q.w()*q.z() + q.x()*q.y()), (1 - 2*(y2 + q.z()*q.z())));
+    //m_angles[1] = std::asin( 2*(q.w()*q.y() - q.z()*q.x()));
+    //m_angles[2] = std::atan2(2*(q.w()*q.x() + q.y()*q.z()), (1 - 2*(q.x()*q.x() + y2)));
+  }*/
 
-    public:
-      /** Default constructor without initialization. */
-      EulerAngles() {}
-      /** Constructs and initialize an EulerAngles (\p alpha, \p beta, \p gamma). */
-      EulerAngles(const Scalar& alpha, const Scalar& beta, const Scalar& gamma) :
-        m_angles(alpha, beta, gamma) {}
-      
-      // TODO: Test this constructor
-      /** Constructs and initialize an EulerAngles from the array data {alpha, beta, gamma} */
-      explicit EulerAngles(const Scalar* data) : m_angles(data) {}
-      
-      /** Constructs and initializes an EulerAngles from either:
-        *  - a 3x3 rotation matrix expression(i.e. pure orthogonal matrix with determinant of +1),
-        *  - a 3D vector expression representing Euler angles.
-        *
-        * \note If \p other is a 3x3 rotation matrix, the angles range rules will be as follow:<BR>
-        *  Alpha and gamma angles will be in the range [-PI, PI].<BR>
-        *  As for Beta angle:
-        *   - If the system is Tait-Bryan, the beta angle will be in the range [-PI/2, PI/2].
-        *   - otherwise:
-        *     - If the beta axis is positive, the beta angle will be in the range [0, PI]
-        *     - If the beta axis is negative, the beta angle will be in the range [-PI, 0]
-       */
-      template<typename Derived>
-      explicit EulerAngles(const MatrixBase<Derived>& other) { *this = other; }
-      
-      /** Constructs and initialize Euler angles from a rotation \p rot.
-        *
-        * \note If \p rot is an EulerAngles (even when it represented as RotationBase explicitly),
-        *  angles ranges are __undefined__.
-        *  Otherwise, alpha and gamma angles will be in the range [-PI, PI].<BR>
-        *  As for Beta angle:
-        *   - If the system is Tait-Bryan, the beta angle will be in the range [-PI/2, PI/2].
-        *   - otherwise:
-        *     - If the beta axis is positive, the beta angle will be in the range [0, PI]
-        *     - If the beta axis is negative, the beta angle will be in the range [-PI, 0]
-      */
-      template<typename Derived>
-      EulerAngles(const RotationBase<Derived, 3>& rot) { System::CalcEulerAngles(*this, rot.toRotationMatrix()); }
-      
-      /*EulerAngles(const QuaternionType& q)
-      {
-        // TODO: Implement it in a faster way for quaternions
-        // According to http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/
-        //  we can compute only the needed matrix cells and then convert to euler angles. (see ZYX example below)
-        // Currently we compute all matrix cells from quaternion.
+  /** \returns The angle values stored in a vector (alpha, beta, gamma). */
+  const Vector3& angles() const { return m_angles; }
+  /** \returns A read-write reference to the angle values stored in a vector (alpha, beta, gamma). */
+  Vector3& angles() { return m_angles; }
 
-        // Special case only for ZYX
-        //Scalar y2 = q.y() * q.y();
-        //m_angles[0] = std::atan2(2*(q.w()*q.z() + q.x()*q.y()), (1 - 2*(y2 + q.z()*q.z())));
-        //m_angles[1] = std::asin( 2*(q.w()*q.y() - q.z()*q.x()));
-        //m_angles[2] = std::atan2(2*(q.w()*q.x() + q.y()*q.z()), (1 - 2*(q.x()*q.x() + y2)));
-      }*/
+  /** \returns The value of the first angle. */
+  Scalar alpha() const { return m_angles[0]; }
+  /** \returns A read-write reference to the angle of the first angle. */
+  Scalar& alpha() { return m_angles[0]; }
 
-      /** \returns The angle values stored in a vector (alpha, beta, gamma). */
-      const Vector3& angles() const { return m_angles; }
-      /** \returns A read-write reference to the angle values stored in a vector (alpha, beta, gamma). */
-      Vector3& angles() { return m_angles; }
+  /** \returns The value of the second angle. */
+  Scalar beta() const { return m_angles[1]; }
+  /** \returns A read-write reference to the angle of the second angle. */
+  Scalar& beta() { return m_angles[1]; }
 
-      /** \returns The value of the first angle. */
-      Scalar alpha() const { return m_angles[0]; }
-      /** \returns A read-write reference to the angle of the first angle. */
-      Scalar& alpha() { return m_angles[0]; }
+  /** \returns The value of the third angle. */
+  Scalar gamma() const { return m_angles[2]; }
+  /** \returns A read-write reference to the angle of the third angle. */
+  Scalar& gamma() { return m_angles[2]; }
 
-      /** \returns The value of the second angle. */
-      Scalar beta() const { return m_angles[1]; }
-      /** \returns A read-write reference to the angle of the second angle. */
-      Scalar& beta() { return m_angles[1]; }
+  /** \returns The Euler angles rotation inverse (which is as same as the negative),
+   *  (-alpha, -beta, -gamma).
+   */
+  EulerAngles inverse() const {
+    EulerAngles res;
+    res.m_angles = -m_angles;
+    return res;
+  }
 
-      /** \returns The value of the third angle. */
-      Scalar gamma() const { return m_angles[2]; }
-      /** \returns A read-write reference to the angle of the third angle. */
-      Scalar& gamma() { return m_angles[2]; }
+  /** \returns The Euler angles rotation negative (which is as same as the inverse),
+   *  (-alpha, -beta, -gamma).
+   */
+  EulerAngles operator-() const { return inverse(); }
 
-      /** \returns The Euler angles rotation inverse (which is as same as the negative),
-        *  (-alpha, -beta, -gamma).
-      */
-      EulerAngles inverse() const
-      {
-        EulerAngles res;
-        res.m_angles = -m_angles;
-        return res;
-      }
+  /** Set \c *this from either:
+   *  - a 3x3 rotation matrix expression(i.e. pure orthogonal matrix with determinant of +1),
+   *  - a 3D vector expression representing Euler angles.
+   *
+   * See EulerAngles(const MatrixBase<Derived, 3>&) for more information about
+   *  angles ranges output.
+   */
+  template <class Derived>
+  EulerAngles& operator=(const MatrixBase<Derived>& other) {
+    EIGEN_STATIC_ASSERT(
+        (internal::is_same<Scalar, typename Derived::Scalar>::value),
+        YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
 
-      /** \returns The Euler angles rotation negative (which is as same as the inverse),
-        *  (-alpha, -beta, -gamma).
-      */
-      EulerAngles operator -() const
-      {
-        return inverse();
-      }
-      
-      /** Set \c *this from either:
-        *  - a 3x3 rotation matrix expression(i.e. pure orthogonal matrix with determinant of +1),
-        *  - a 3D vector expression representing Euler angles.
-        *
-        * See EulerAngles(const MatrixBase<Derived, 3>&) for more information about
-        *  angles ranges output.
-      */
-      template<class Derived>
-      EulerAngles& operator=(const MatrixBase<Derived>& other)
-      {
-        EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename Derived::Scalar>::value),
-         YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
-        
-        internal::eulerangles_assign_impl<System, Derived>::run(*this, other.derived());
-        return *this;
-      }
+    internal::eulerangles_assign_impl<System, Derived>::run(*this, other.derived());
+    return *this;
+  }
 
-      // TODO: Assign and construct from another EulerAngles (with different system)
-      
-      /** Set \c *this from a rotation.
-        *
-        * See EulerAngles(const RotationBase<Derived, 3>&) for more information about
-        *  angles ranges output.
-      */
-      template<typename Derived>
-      EulerAngles& operator=(const RotationBase<Derived, 3>& rot) {
-        System::CalcEulerAngles(*this, rot.toRotationMatrix());
-        return *this;
-      }
-      
-      /** \returns \c true if \c *this is approximately equal to \a other, within the precision
-        * determined by \a prec.
-        *
-        * \sa MatrixBase::isApprox() */
-      bool isApprox(const EulerAngles& other,
-        const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const
-      { return angles().isApprox(other.angles(), prec); }
+  // TODO: Assign and construct from another EulerAngles (with different system)
 
-      /** \returns an equivalent 3x3 rotation matrix. */
-      Matrix3 toRotationMatrix() const
-      {
-        // TODO: Calc it faster
-        return static_cast<QuaternionType>(*this).toRotationMatrix();
-      }
+  /** Set \c *this from a rotation.
+   *
+   * See EulerAngles(const RotationBase<Derived, 3>&) for more information about
+   *  angles ranges output.
+   */
+  template <typename Derived>
+  EulerAngles& operator=(const RotationBase<Derived, 3>& rot) {
+    System::CalcEulerAngles(*this, rot.toRotationMatrix());
+    return *this;
+  }
 
-      /** Convert the Euler angles to quaternion. */
-      operator QuaternionType() const
-      {
-        return
-          AngleAxisType(alpha(), AlphaAxisVector()) *
-          AngleAxisType(beta(), BetaAxisVector())   *
-          AngleAxisType(gamma(), GammaAxisVector());
-      }
-      
-      friend std::ostream& operator<<(std::ostream& s, const EulerAngles<Scalar, System>& eulerAngles)
-      {
-        s << eulerAngles.angles().transpose();
-        return s;
-      }
-      
-      /** \returns \c *this with scalar type casted to \a NewScalarType */
-      template <typename NewScalarType>
-      EulerAngles<NewScalarType, System> cast() const
-      {
-        EulerAngles<NewScalarType, System> e;
-        e.angles() = angles().template cast<NewScalarType>();
-        return e;
-      }
-  };
+  /** \returns \c true if \c *this is approximately equal to \a other, within the precision
+   * determined by \a prec.
+   *
+   * \sa MatrixBase::isApprox() */
+  bool isApprox(const EulerAngles& other, const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const {
+    return angles().isApprox(other.angles(), prec);
+  }
+
+  /** \returns an equivalent 3x3 rotation matrix. */
+  Matrix3 toRotationMatrix() const {
+    // TODO: Calc it faster
+    return static_cast<QuaternionType>(*this).toRotationMatrix();
+  }
+
+  /** Convert the Euler angles to quaternion. */
+  operator QuaternionType() const {
+    return AngleAxisType(alpha(), AlphaAxisVector()) * AngleAxisType(beta(), BetaAxisVector()) *
+           AngleAxisType(gamma(), GammaAxisVector());
+  }
+
+  friend std::ostream& operator<<(std::ostream& s, const EulerAngles<Scalar, System>& eulerAngles) {
+    s << eulerAngles.angles().transpose();
+    return s;
+  }
+
+  /** \returns \c *this with scalar type casted to \a NewScalarType */
+  template <typename NewScalarType>
+  EulerAngles<NewScalarType, System> cast() const {
+    EulerAngles<NewScalarType, System> e;
+    e.angles() = angles().template cast<NewScalarType>();
+    return e;
+  }
+};
 
 #define EIGEN_EULER_ANGLES_SINGLE_TYPEDEF(AXES, SCALAR_TYPE, SCALAR_POSTFIX) \
-  /** \ingroup EulerAngles_Module */ \
+  /** \ingroup EulerAngles_Module */                                         \
   typedef EulerAngles<SCALAR_TYPE, EulerSystem##AXES> EulerAngles##AXES##SCALAR_POSTFIX;
 
-#define EIGEN_EULER_ANGLES_TYPEDEFS(SCALAR_TYPE, SCALAR_POSTFIX) \
+#define EIGEN_EULER_ANGLES_TYPEDEFS(SCALAR_TYPE, SCALAR_POSTFIX)      \
   EIGEN_EULER_ANGLES_SINGLE_TYPEDEF(XYZ, SCALAR_TYPE, SCALAR_POSTFIX) \
   EIGEN_EULER_ANGLES_SINGLE_TYPEDEF(XYX, SCALAR_TYPE, SCALAR_POSTFIX) \
   EIGEN_EULER_ANGLES_SINGLE_TYPEDEF(XZY, SCALAR_TYPE, SCALAR_POSTFIX) \
   EIGEN_EULER_ANGLES_SINGLE_TYPEDEF(XZX, SCALAR_TYPE, SCALAR_POSTFIX) \
- \
+                                                                      \
   EIGEN_EULER_ANGLES_SINGLE_TYPEDEF(YZX, SCALAR_TYPE, SCALAR_POSTFIX) \
   EIGEN_EULER_ANGLES_SINGLE_TYPEDEF(YZY, SCALAR_TYPE, SCALAR_POSTFIX) \
   EIGEN_EULER_ANGLES_SINGLE_TYPEDEF(YXZ, SCALAR_TYPE, SCALAR_POSTFIX) \
   EIGEN_EULER_ANGLES_SINGLE_TYPEDEF(YXY, SCALAR_TYPE, SCALAR_POSTFIX) \
- \
+                                                                      \
   EIGEN_EULER_ANGLES_SINGLE_TYPEDEF(ZXY, SCALAR_TYPE, SCALAR_POSTFIX) \
   EIGEN_EULER_ANGLES_SINGLE_TYPEDEF(ZXZ, SCALAR_TYPE, SCALAR_POSTFIX) \
   EIGEN_EULER_ANGLES_SINGLE_TYPEDEF(ZYX, SCALAR_TYPE, SCALAR_POSTFIX) \
@@ -323,36 +315,26 @@
 EIGEN_EULER_ANGLES_TYPEDEFS(float, f)
 EIGEN_EULER_ANGLES_TYPEDEFS(double, d)
 
-  namespace internal
-  {
-    template<typename Scalar_, class _System>
-    struct traits<EulerAngles<Scalar_, _System> >
-    {
-      typedef Scalar_ Scalar;
-    };
-    
-    // set from a rotation matrix
-    template<class System, class Other>
-    struct eulerangles_assign_impl<System,Other,3,3>
-    {
-      typedef typename Other::Scalar Scalar;
-      static void run(EulerAngles<Scalar, System>& e, const Other& m)
-      {
-        System::CalcEulerAngles(e, m);
-      }
-    };
-    
-    // set from a vector of Euler angles
-    template<class System, class Other>
-    struct eulerangles_assign_impl<System,Other,3,1>
-    {
-      typedef typename Other::Scalar Scalar;
-      static void run(EulerAngles<Scalar, System>& e, const Other& vec)
-      {
-        e.angles() = vec;
-      }
-    };
-  }
-}
+namespace internal {
+template <typename Scalar_, class _System>
+struct traits<EulerAngles<Scalar_, _System> > {
+  typedef Scalar_ Scalar;
+};
 
-#endif // EIGEN_EULERANGLESCLASS_H
+// set from a rotation matrix
+template <class System, class Other>
+struct eulerangles_assign_impl<System, Other, 3, 3> {
+  typedef typename Other::Scalar Scalar;
+  static void run(EulerAngles<Scalar, System>& e, const Other& m) { System::CalcEulerAngles(e, m); }
+};
+
+// set from a vector of Euler angles
+template <class System, class Other>
+struct eulerangles_assign_impl<System, Other, 3, 1> {
+  typedef typename Other::Scalar Scalar;
+  static void run(EulerAngles<Scalar, System>& e, const Other& vec) { e.angles() = vec; }
+};
+}  // namespace internal
+}  // namespace Eigen
+
+#endif  // EIGEN_EULERANGLESCLASS_H
diff --git a/unsupported/Eigen/src/EulerAngles/EulerSystem.h b/unsupported/Eigen/src/EulerAngles/EulerSystem.h
index c1e8d60..98f91ea 100644
--- a/unsupported/Eigen/src/EulerAngles/EulerSystem.h
+++ b/unsupported/Eigen/src/EulerAngles/EulerSystem.h
@@ -13,296 +13,271 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen
-{
-  // Forward declarations
-  template <typename Scalar_, class _System>
-  class EulerAngles;
-  
-  namespace internal
-  {
-    // TODO: Add this trait to the Eigen internal API?
-    template <int Num, bool IsPositive = (Num > 0)>
-    struct Abs
-    {
-      enum { value = Num };
-    };
-  
-    template <int Num>
-    struct Abs<Num, false>
-    {
-      enum { value = -Num };
-    };
+namespace Eigen {
+// Forward declarations
+template <typename Scalar_, class _System>
+class EulerAngles;
 
-    template <int Axis>
-    struct IsValidAxis
-    {
-      enum { value = Axis != 0 && Abs<Axis>::value <= 3 };
-    };
-    
-    template<typename System,
-            typename Other,
-            int OtherRows=Other::RowsAtCompileTime,
-            int OtherCols=Other::ColsAtCompileTime>
-    struct eulerangles_assign_impl;
-  }
-  
-  #define EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT(COND,MSG) typedef char static_assertion_##MSG[(COND)?1:-1]
-  
-  /** \brief Representation of a fixed signed rotation axis for EulerSystem.
-    *
-    * \ingroup EulerAngles_Module
-    *
-    * Values here represent:
-    *  - The axis of the rotation: X, Y or Z.
-    *  - The sign (i.e. direction of the rotation along the axis): positive(+) or negative(-)
-    *
-    * Therefore, this could express all the axes {+X,+Y,+Z,-X,-Y,-Z}
-    *
-    * For positive axis, use +EULER_{axis}, and for negative axis use -EULER_{axis}.
-    */
-  enum EulerAxis
-  {
-    EULER_X = 1, /*!< the X axis */
-    EULER_Y = 2, /*!< the Y axis */
-    EULER_Z = 3  /*!< the Z axis */
+namespace internal {
+// TODO: Add this trait to the Eigen internal API?
+template <int Num, bool IsPositive = (Num > 0)>
+struct Abs {
+  enum { value = Num };
+};
+
+template <int Num>
+struct Abs<Num, false> {
+  enum { value = -Num };
+};
+
+template <int Axis>
+struct IsValidAxis {
+  enum { value = Axis != 0 && Abs<Axis>::value <= 3 };
+};
+
+template <typename System, typename Other, int OtherRows = Other::RowsAtCompileTime,
+          int OtherCols = Other::ColsAtCompileTime>
+struct eulerangles_assign_impl;
+}  // namespace internal
+
+#define EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT(COND, MSG) typedef char static_assertion_##MSG[(COND) ? 1 : -1]
+
+/** \brief Representation of a fixed signed rotation axis for EulerSystem.
+ *
+ * \ingroup EulerAngles_Module
+ *
+ * Values here represent:
+ *  - The axis of the rotation: X, Y or Z.
+ *  - The sign (i.e. direction of the rotation along the axis): positive(+) or negative(-)
+ *
+ * Therefore, this could express all the axes {+X,+Y,+Z,-X,-Y,-Z}
+ *
+ * For positive axis, use +EULER_{axis}, and for negative axis use -EULER_{axis}.
+ */
+enum EulerAxis {
+  EULER_X = 1, /*!< the X axis */
+  EULER_Y = 2, /*!< the Y axis */
+  EULER_Z = 3  /*!< the Z axis */
+};
+
+/** \class EulerSystem
+ *
+ * \ingroup EulerAngles_Module
+ *
+ * \brief Represents a fixed Euler rotation system.
+ *
+ * This meta-class goal is to represent the Euler system in compilation time, for EulerAngles.
+ *
+ * You can use this class to get two things:
+ *  - Build an Euler system, and then pass it as a template parameter to EulerAngles.
+ *  - Query some compile time data about an Euler system. (e.g. Whether it's Tait-Bryan)
+ *
+ * Euler rotation is a set of three rotation on fixed axes. (see \ref EulerAngles)
+ * This meta-class store constantly those signed axes. (see \ref EulerAxis)
+ *
+ * ### Types of Euler systems ###
+ *
+ * All and only valid 3 dimension Euler rotation over standard
+ *  signed axes{+X,+Y,+Z,-X,-Y,-Z} are supported:
+ *  - all axes X, Y, Z in each valid order (see below what order is valid)
+ *  - rotation over the axis is supported both over the positive and negative directions.
+ *  - both Tait-Bryan and proper/classic Euler angles (i.e. the opposite).
+ *
+ * Since EulerSystem support both positive and negative directions,
+ *  you may call this rotation distinction in other names:
+ *  - _right handed_ or _left handed_
+ *  - _counterclockwise_ or _clockwise_
+ *
+ * Notice all axed combination are valid, and would trigger a static assertion.
+ * Same unsigned axes can't be neighbors, e.g. {X,X,Y} is invalid.
+ * This yield two and only two classes:
+ *  - _Tait-Bryan_ - all unsigned axes are distinct, e.g. {X,Y,Z}
+ *  - _proper/classic Euler angles_ - The first and the third unsigned axes is equal,
+ *     and the second is different, e.g. {X,Y,X}
+ *
+ * ### Intrinsic vs extrinsic Euler systems ###
+ *
+ * Only intrinsic Euler systems are supported for simplicity.
+ *  If you want to use extrinsic Euler systems,
+ *   just use the equal intrinsic opposite order for axes and angles.
+ *  I.e axes (A,B,C) becomes (C,B,A), and angles (a,b,c) becomes (c,b,a).
+ *
+ * ### Convenient user typedefs ###
+ *
+ * Convenient typedefs for EulerSystem exist (only for positive axes Euler systems),
+ *  in a form of EulerSystem{A}{B}{C}, e.g. \ref EulerSystemXYZ.
+ *
+ * ### Additional reading ###
+ *
+ * More information about Euler angles: https://en.wikipedia.org/wiki/Euler_angles
+ *
+ * \tparam _AlphaAxis the first fixed EulerAxis
+ *
+ * \tparam _BetaAxis the second fixed EulerAxis
+ *
+ * \tparam _GammaAxis the third fixed EulerAxis
+ */
+template <int _AlphaAxis, int _BetaAxis, int _GammaAxis>
+class EulerSystem {
+ public:
+  // It's defined this way and not as enum, because I think
+  //  that enum is not guerantee to support negative numbers
+
+  /** The first rotation axis */
+  static constexpr int AlphaAxis = _AlphaAxis;
+
+  /** The second rotation axis */
+  static constexpr int BetaAxis = _BetaAxis;
+
+  /** The third rotation axis */
+  static constexpr int GammaAxis = _GammaAxis;
+
+  enum {
+    AlphaAxisAbs = internal::Abs<AlphaAxis>::value, /*!< the first rotation axis unsigned */
+    BetaAxisAbs = internal::Abs<BetaAxis>::value,   /*!< the second rotation axis unsigned */
+    GammaAxisAbs = internal::Abs<GammaAxis>::value, /*!< the third rotation axis unsigned */
+
+    IsAlphaOpposite = (AlphaAxis < 0) ? 1 : 0, /*!< whether alpha axis is negative */
+    IsBetaOpposite = (BetaAxis < 0) ? 1 : 0,   /*!< whether beta axis is negative */
+    IsGammaOpposite = (GammaAxis < 0) ? 1 : 0, /*!< whether gamma axis is negative */
+
+    // Parity is even if alpha axis X is followed by beta axis Y, or Y is followed
+    // by Z, or Z is followed by X; otherwise it is odd.
+    IsOdd = ((AlphaAxisAbs) % 3 == (BetaAxisAbs - 1) % 3) ? 0 : 1, /*!< whether the Euler system is odd */
+    IsEven = IsOdd ? 0 : 1,                                        /*!< whether the Euler system is even */
+
+    IsTaitBryan =
+        ((unsigned)AlphaAxisAbs != (unsigned)GammaAxisAbs) ? 1 : 0 /*!< whether the Euler system is Tait-Bryan */
   };
-  
-  /** \class EulerSystem
-    *
-    * \ingroup EulerAngles_Module
-    *
-    * \brief Represents a fixed Euler rotation system.
-    *
-    * This meta-class goal is to represent the Euler system in compilation time, for EulerAngles.
-    *
-    * You can use this class to get two things:
-    *  - Build an Euler system, and then pass it as a template parameter to EulerAngles.
-    *  - Query some compile time data about an Euler system. (e.g. Whether it's Tait-Bryan)
-    *
-    * Euler rotation is a set of three rotation on fixed axes. (see \ref EulerAngles)
-    * This meta-class store constantly those signed axes. (see \ref EulerAxis)
-    *
-    * ### Types of Euler systems ###
-    *
-    * All and only valid 3 dimension Euler rotation over standard
-    *  signed axes{+X,+Y,+Z,-X,-Y,-Z} are supported:
-    *  - all axes X, Y, Z in each valid order (see below what order is valid)
-    *  - rotation over the axis is supported both over the positive and negative directions.
-    *  - both Tait-Bryan and proper/classic Euler angles (i.e. the opposite).
-    *
-    * Since EulerSystem support both positive and negative directions,
-    *  you may call this rotation distinction in other names:
-    *  - _right handed_ or _left handed_
-    *  - _counterclockwise_ or _clockwise_
-    *
-    * Notice all axed combination are valid, and would trigger a static assertion.
-    * Same unsigned axes can't be neighbors, e.g. {X,X,Y} is invalid.
-    * This yield two and only two classes:
-    *  - _Tait-Bryan_ - all unsigned axes are distinct, e.g. {X,Y,Z}
-    *  - _proper/classic Euler angles_ - The first and the third unsigned axes is equal,
-    *     and the second is different, e.g. {X,Y,X}
-    *
-    * ### Intrinsic vs extrinsic Euler systems ###
-    *
-    * Only intrinsic Euler systems are supported for simplicity.
-    *  If you want to use extrinsic Euler systems,
-    *   just use the equal intrinsic opposite order for axes and angles.
-    *  I.e axes (A,B,C) becomes (C,B,A), and angles (a,b,c) becomes (c,b,a).
-    *
-    * ### Convenient user typedefs ###
-    *
-    * Convenient typedefs for EulerSystem exist (only for positive axes Euler systems),
-    *  in a form of EulerSystem{A}{B}{C}, e.g. \ref EulerSystemXYZ.
-    *
-    * ### Additional reading ###
-    *
-    * More information about Euler angles: https://en.wikipedia.org/wiki/Euler_angles
-    *
-    * \tparam _AlphaAxis the first fixed EulerAxis
-    *
-    * \tparam _BetaAxis the second fixed EulerAxis
-    *
-    * \tparam _GammaAxis the third fixed EulerAxis
-    */
-  template <int _AlphaAxis, int _BetaAxis, int _GammaAxis>
-  class EulerSystem
-  {
-    public:
-    // It's defined this way and not as enum, because I think
-    //  that enum is not guerantee to support negative numbers
-    
-    /** The first rotation axis */
-    static constexpr int AlphaAxis = _AlphaAxis;
-    
-    /** The second rotation axis */
-    static constexpr int BetaAxis = _BetaAxis;
-    
-    /** The third rotation axis */
-    static constexpr int GammaAxis = _GammaAxis;
 
-    enum
-    {
-      AlphaAxisAbs = internal::Abs<AlphaAxis>::value, /*!< the first rotation axis unsigned */
-      BetaAxisAbs = internal::Abs<BetaAxis>::value, /*!< the second rotation axis unsigned */
-      GammaAxisAbs = internal::Abs<GammaAxis>::value, /*!< the third rotation axis unsigned */
-      
-      IsAlphaOpposite = (AlphaAxis < 0) ? 1 : 0, /*!< whether alpha axis is negative */
-      IsBetaOpposite = (BetaAxis < 0) ? 1 : 0, /*!< whether beta axis is negative */
-      IsGammaOpposite = (GammaAxis < 0) ? 1 : 0, /*!< whether gamma axis is negative */
+ private:
+  EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT(internal::IsValidAxis<AlphaAxis>::value, ALPHA_AXIS_IS_INVALID);
 
-      // Parity is even if alpha axis X is followed by beta axis Y, or Y is followed
-      // by Z, or Z is followed by X; otherwise it is odd.
-      IsOdd = ((AlphaAxisAbs)%3 == (BetaAxisAbs - 1)%3) ? 0 : 1, /*!< whether the Euler system is odd */
-      IsEven = IsOdd ? 0 : 1, /*!< whether the Euler system is even */
+  EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT(internal::IsValidAxis<BetaAxis>::value, BETA_AXIS_IS_INVALID);
 
-      IsTaitBryan = ((unsigned)AlphaAxisAbs != (unsigned)GammaAxisAbs) ? 1 : 0 /*!< whether the Euler system is Tait-Bryan */
-    };
-    
-    private:
-    
-    EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT(internal::IsValidAxis<AlphaAxis>::value,
-      ALPHA_AXIS_IS_INVALID);
-      
-    EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT(internal::IsValidAxis<BetaAxis>::value,
-      BETA_AXIS_IS_INVALID);
-      
-    EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT(internal::IsValidAxis<GammaAxis>::value,
-      GAMMA_AXIS_IS_INVALID);
-      
-    EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT((unsigned)AlphaAxisAbs != (unsigned)BetaAxisAbs,
-      ALPHA_AXIS_CANT_BE_EQUAL_TO_BETA_AXIS);
-      
-    EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT((unsigned)BetaAxisAbs != (unsigned)GammaAxisAbs,
-      BETA_AXIS_CANT_BE_EQUAL_TO_GAMMA_AXIS);
+  EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT(internal::IsValidAxis<GammaAxis>::value, GAMMA_AXIS_IS_INVALID);
 
-    static const int
-      // I, J, K are the pivot indexes permutation for the rotation matrix, that match this Euler system. 
+  EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT((unsigned)AlphaAxisAbs != (unsigned)BetaAxisAbs,
+                                         ALPHA_AXIS_CANT_BE_EQUAL_TO_BETA_AXIS);
+
+  EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT((unsigned)BetaAxisAbs != (unsigned)GammaAxisAbs,
+                                         BETA_AXIS_CANT_BE_EQUAL_TO_GAMMA_AXIS);
+
+  static const int
+      // I, J, K are the pivot indexes permutation for the rotation matrix, that match this Euler system.
       // They are used in this class converters.
       // They are always different from each other, and their possible values are: 0, 1, or 2.
       I_ = AlphaAxisAbs - 1,
-      J_ = (AlphaAxisAbs - 1 + 1 + IsOdd)%3,
-      K_ = (AlphaAxisAbs - 1 + 2 - IsOdd)%3
-    ;
-    
-    // TODO: Get @mat parameter in form that avoids double evaluation.
-    template <typename Derived>
-    static void CalcEulerAngles_imp(Matrix<typename MatrixBase<Derived>::Scalar, 3, 1>& res, const MatrixBase<Derived>& mat, internal::true_type /*isTaitBryan*/)
-    {
-      using std::atan2;
-      using std::sqrt;
-      
-      typedef typename Derived::Scalar Scalar;
+      J_ = (AlphaAxisAbs - 1 + 1 + IsOdd) % 3, K_ = (AlphaAxisAbs - 1 + 2 - IsOdd) % 3;
 
-      const Scalar plusMinus = IsEven? 1 : -1;
-      const Scalar minusPlus = IsOdd?  1 : -1;
+  // TODO: Get @mat parameter in form that avoids double evaluation.
+  template <typename Derived>
+  static void CalcEulerAngles_imp(Matrix<typename MatrixBase<Derived>::Scalar, 3, 1>& res,
+                                  const MatrixBase<Derived>& mat, internal::true_type /*isTaitBryan*/) {
+    using std::atan2;
+    using std::sqrt;
 
-      const Scalar Rsum = sqrt((mat(I_,I_) * mat(I_,I_) + mat(I_,J_) * mat(I_,J_) + mat(J_,K_) * mat(J_,K_) + mat(K_,K_) * mat(K_,K_))/2);
-      res[1] = atan2(plusMinus * mat(I_,K_), Rsum);
+    typedef typename Derived::Scalar Scalar;
 
-      // There is a singularity when cos(beta) == 0
-      if(Rsum > 4 * NumTraits<Scalar>::epsilon()) {// cos(beta) != 0
-        res[0] = atan2(minusPlus * mat(J_, K_), mat(K_, K_));
-        res[2] = atan2(minusPlus * mat(I_, J_), mat(I_, I_));
-      }
-      else if(plusMinus * mat(I_, K_) > 0) {// cos(beta) == 0 and sin(beta) == 1
-        Scalar spos = mat(J_, I_) + plusMinus * mat(K_, J_); // 2*sin(alpha + plusMinus * gamma
-        Scalar cpos = mat(J_, J_) + minusPlus * mat(K_, I_); // 2*cos(alpha + plusMinus * gamma)
-        Scalar alphaPlusMinusGamma = atan2(spos, cpos);
-        res[0] = alphaPlusMinusGamma;
-        res[2] = 0;
-      }
-      else {// cos(beta) == 0 and sin(beta) == -1
-        Scalar sneg = plusMinus * (mat(K_, J_) + minusPlus * mat(J_, I_)); // 2*sin(alpha + minusPlus*gamma)
-        Scalar cneg = mat(J_, J_) + plusMinus * mat(K_, I_);               // 2*cos(alpha + minusPlus*gamma)
-        Scalar alphaMinusPlusBeta = atan2(sneg, cneg);
-        res[0] = alphaMinusPlusBeta;
-        res[2] = 0;
-      }
+    const Scalar plusMinus = IsEven ? 1 : -1;
+    const Scalar minusPlus = IsOdd ? 1 : -1;
+
+    const Scalar Rsum = sqrt((mat(I_, I_) * mat(I_, I_) + mat(I_, J_) * mat(I_, J_) + mat(J_, K_) * mat(J_, K_) +
+                              mat(K_, K_) * mat(K_, K_)) /
+                             2);
+    res[1] = atan2(plusMinus * mat(I_, K_), Rsum);
+
+    // There is a singularity when cos(beta) == 0
+    if (Rsum > 4 * NumTraits<Scalar>::epsilon()) {  // cos(beta) != 0
+      res[0] = atan2(minusPlus * mat(J_, K_), mat(K_, K_));
+      res[2] = atan2(minusPlus * mat(I_, J_), mat(I_, I_));
+    } else if (plusMinus * mat(I_, K_) > 0) {               // cos(beta) == 0 and sin(beta) == 1
+      Scalar spos = mat(J_, I_) + plusMinus * mat(K_, J_);  // 2*sin(alpha + plusMinus * gamma
+      Scalar cpos = mat(J_, J_) + minusPlus * mat(K_, I_);  // 2*cos(alpha + plusMinus * gamma)
+      Scalar alphaPlusMinusGamma = atan2(spos, cpos);
+      res[0] = alphaPlusMinusGamma;
+      res[2] = 0;
+    } else {                                                              // cos(beta) == 0 and sin(beta) == -1
+      Scalar sneg = plusMinus * (mat(K_, J_) + minusPlus * mat(J_, I_));  // 2*sin(alpha + minusPlus*gamma)
+      Scalar cneg = mat(J_, J_) + plusMinus * mat(K_, I_);                // 2*cos(alpha + minusPlus*gamma)
+      Scalar alphaMinusPlusBeta = atan2(sneg, cneg);
+      res[0] = alphaMinusPlusBeta;
+      res[2] = 0;
     }
+  }
 
-    template <typename Derived>
-    static void CalcEulerAngles_imp(Matrix<typename MatrixBase<Derived>::Scalar,3,1>& res,
-                                    const MatrixBase<Derived>& mat, internal::false_type /*isTaitBryan*/)
-    {
-      using std::atan2;
-      using std::sqrt;
+  template <typename Derived>
+  static void CalcEulerAngles_imp(Matrix<typename MatrixBase<Derived>::Scalar, 3, 1>& res,
+                                  const MatrixBase<Derived>& mat, internal::false_type /*isTaitBryan*/) {
+    using std::atan2;
+    using std::sqrt;
 
-      typedef typename Derived::Scalar Scalar;
+    typedef typename Derived::Scalar Scalar;
 
-      const Scalar plusMinus = IsEven? 1 : -1;
-      const Scalar minusPlus = IsOdd?  1 : -1;
+    const Scalar plusMinus = IsEven ? 1 : -1;
+    const Scalar minusPlus = IsOdd ? 1 : -1;
 
-      const Scalar Rsum = sqrt((mat(I_, J_) * mat(I_, J_) + mat(I_, K_) * mat(I_, K_) + mat(J_, I_) * mat(J_, I_) + mat(K_, I_) * mat(K_, I_)) / 2);
+    const Scalar Rsum = sqrt((mat(I_, J_) * mat(I_, J_) + mat(I_, K_) * mat(I_, K_) + mat(J_, I_) * mat(J_, I_) +
+                              mat(K_, I_) * mat(K_, I_)) /
+                             2);
 
-      res[1] = atan2(Rsum, mat(I_, I_));
+    res[1] = atan2(Rsum, mat(I_, I_));
 
-      // There is a singularity when sin(beta) == 0
-      if(Rsum > 4 * NumTraits<Scalar>::epsilon()) {// sin(beta) != 0
-        res[0] = atan2(mat(J_, I_), minusPlus * mat(K_, I_));
-        res[2] = atan2(mat(I_, J_), plusMinus * mat(I_, K_));
-      }
-      else if(mat(I_, I_) > 0) {// sin(beta) == 0 and cos(beta) == 1
-        Scalar spos = plusMinus * mat(K_, J_) + minusPlus * mat(J_, K_); // 2*sin(alpha + gamma)
-        Scalar cpos = mat(J_, J_) + mat(K_, K_);                         // 2*cos(alpha + gamma)
-        res[0] = atan2(spos, cpos);
-        res[2] = 0;
-      }
-      else {// sin(beta) == 0 and cos(beta) == -1
-        Scalar sneg = plusMinus * mat(K_, J_) + plusMinus * mat(J_, K_); // 2*sin(alpha - gamma)
-        Scalar cneg = mat(J_, J_) - mat(K_, K_);                         // 2*cos(alpha - gamma)
-        res[0] = atan2(sneg, cneg);
-        res[2] = 0;
-      }
+    // There is a singularity when sin(beta) == 0
+    if (Rsum > 4 * NumTraits<Scalar>::epsilon()) {  // sin(beta) != 0
+      res[0] = atan2(mat(J_, I_), minusPlus * mat(K_, I_));
+      res[2] = atan2(mat(I_, J_), plusMinus * mat(I_, K_));
+    } else if (mat(I_, I_) > 0) {                                       // sin(beta) == 0 and cos(beta) == 1
+      Scalar spos = plusMinus * mat(K_, J_) + minusPlus * mat(J_, K_);  // 2*sin(alpha + gamma)
+      Scalar cpos = mat(J_, J_) + mat(K_, K_);                          // 2*cos(alpha + gamma)
+      res[0] = atan2(spos, cpos);
+      res[2] = 0;
+    } else {                                                            // sin(beta) == 0 and cos(beta) == -1
+      Scalar sneg = plusMinus * mat(K_, J_) + plusMinus * mat(J_, K_);  // 2*sin(alpha - gamma)
+      Scalar cneg = mat(J_, J_) - mat(K_, K_);                          // 2*cos(alpha - gamma)
+      res[0] = atan2(sneg, cneg);
+      res[2] = 0;
     }
-    
-    template<typename Scalar>
-    static void CalcEulerAngles(
-      EulerAngles<Scalar, EulerSystem>& res,
-      const typename EulerAngles<Scalar, EulerSystem>::Matrix3& mat)
-    {
-      CalcEulerAngles_imp(
-        res.angles(), mat,
-        std::conditional_t<IsTaitBryan, internal::true_type, internal::false_type>());
+  }
 
-      if (IsAlphaOpposite)
-        res.alpha() = -res.alpha();
-        
-      if (IsBetaOpposite)
-        res.beta() = -res.beta();
-        
-      if (IsGammaOpposite)
-        res.gamma() = -res.gamma();
-    }
-    
-    template <typename Scalar_, class _System>
-    friend class Eigen::EulerAngles;
-    
-    template<typename System,
-            typename Other,
-            int OtherRows,
-            int OtherCols>
-    friend struct internal::eulerangles_assign_impl;
-  };
+  template <typename Scalar>
+  static void CalcEulerAngles(EulerAngles<Scalar, EulerSystem>& res,
+                              const typename EulerAngles<Scalar, EulerSystem>::Matrix3& mat) {
+    CalcEulerAngles_imp(res.angles(), mat,
+                        std::conditional_t<IsTaitBryan, internal::true_type, internal::false_type>());
+
+    if (IsAlphaOpposite) res.alpha() = -res.alpha();
+
+    if (IsBetaOpposite) res.beta() = -res.beta();
+
+    if (IsGammaOpposite) res.gamma() = -res.gamma();
+  }
+
+  template <typename Scalar_, class _System>
+  friend class Eigen::EulerAngles;
+
+  template <typename System, typename Other, int OtherRows, int OtherCols>
+  friend struct internal::eulerangles_assign_impl;
+};
 
 #define EIGEN_EULER_SYSTEM_TYPEDEF(A, B, C) \
-  /** \ingroup EulerAngles_Module */ \
+  /** \ingroup EulerAngles_Module */        \
   typedef EulerSystem<EULER_##A, EULER_##B, EULER_##C> EulerSystem##A##B##C;
-  
-  EIGEN_EULER_SYSTEM_TYPEDEF(X,Y,Z)
-  EIGEN_EULER_SYSTEM_TYPEDEF(X,Y,X)
-  EIGEN_EULER_SYSTEM_TYPEDEF(X,Z,Y)
-  EIGEN_EULER_SYSTEM_TYPEDEF(X,Z,X)
-  
-  EIGEN_EULER_SYSTEM_TYPEDEF(Y,Z,X)
-  EIGEN_EULER_SYSTEM_TYPEDEF(Y,Z,Y)
-  EIGEN_EULER_SYSTEM_TYPEDEF(Y,X,Z)
-  EIGEN_EULER_SYSTEM_TYPEDEF(Y,X,Y)
-  
-  EIGEN_EULER_SYSTEM_TYPEDEF(Z,X,Y)
-  EIGEN_EULER_SYSTEM_TYPEDEF(Z,X,Z)
-  EIGEN_EULER_SYSTEM_TYPEDEF(Z,Y,X)
-  EIGEN_EULER_SYSTEM_TYPEDEF(Z,Y,Z)
-}
 
-#endif // EIGEN_EULERSYSTEM_H
+EIGEN_EULER_SYSTEM_TYPEDEF(X, Y, Z)
+EIGEN_EULER_SYSTEM_TYPEDEF(X, Y, X)
+EIGEN_EULER_SYSTEM_TYPEDEF(X, Z, Y)
+EIGEN_EULER_SYSTEM_TYPEDEF(X, Z, X)
+
+EIGEN_EULER_SYSTEM_TYPEDEF(Y, Z, X)
+EIGEN_EULER_SYSTEM_TYPEDEF(Y, Z, Y)
+EIGEN_EULER_SYSTEM_TYPEDEF(Y, X, Z)
+EIGEN_EULER_SYSTEM_TYPEDEF(Y, X, Y)
+
+EIGEN_EULER_SYSTEM_TYPEDEF(Z, X, Y)
+EIGEN_EULER_SYSTEM_TYPEDEF(Z, X, Z)
+EIGEN_EULER_SYSTEM_TYPEDEF(Z, Y, X)
+EIGEN_EULER_SYSTEM_TYPEDEF(Z, Y, Z)
+}  // namespace Eigen
+
+#endif  // EIGEN_EULERSYSTEM_H
diff --git a/unsupported/Eigen/src/FFT/ei_fftw_impl.h b/unsupported/Eigen/src/FFT/ei_fftw_impl.h
index cc5f726..0b9ad3d 100644
--- a/unsupported/Eigen/src/FFT/ei_fftw_impl.h
+++ b/unsupported/Eigen/src/FFT/ei_fftw_impl.h
@@ -1,5 +1,5 @@
 // This file is part of Eigen, a lightweight C++ template library
-// for linear algebra. 
+// for linear algebra.
 //
 // Copyright (C) 2009 Mark Borgerding mark a borgerding net
 //
@@ -12,255 +12,205 @@
 
 #include <memory>
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
-  // FFTW uses non-const arguments
-  // so we must use ugly const_cast calls for all the args it uses
-  //
-  // This should be safe as long as 
-  // 1. we use FFTW_ESTIMATE for all our planning
-  //       see the FFTW docs section 4.3.2 "Planner Flags"
-  // 2. fftw_complex is compatible with std::complex
-  //    This assumes std::complex<T> layout is array of size 2 with real,imag
-  template <typename T> 
-  inline 
-  T * fftw_cast(const T* p)
-  { 
-      return const_cast<T*>( p); 
+// FFTW uses non-const arguments
+// so we must use ugly const_cast calls for all the args it uses
+//
+// This should be safe as long as
+// 1. we use FFTW_ESTIMATE for all our planning
+//       see the FFTW docs section 4.3.2 "Planner Flags"
+// 2. fftw_complex is compatible with std::complex
+//    This assumes std::complex<T> layout is array of size 2 with real,imag
+template <typename T>
+inline T *fftw_cast(const T *p) {
+  return const_cast<T *>(p);
+}
+
+inline fftw_complex *fftw_cast(const std::complex<double> *p) {
+  return const_cast<fftw_complex *>(reinterpret_cast<const fftw_complex *>(p));
+}
+
+inline fftwf_complex *fftw_cast(const std::complex<float> *p) {
+  return const_cast<fftwf_complex *>(reinterpret_cast<const fftwf_complex *>(p));
+}
+
+inline fftwl_complex *fftw_cast(const std::complex<long double> *p) {
+  return const_cast<fftwl_complex *>(reinterpret_cast<const fftwl_complex *>(p));
+}
+
+template <typename T>
+struct fftw_plan {};
+
+template <>
+struct fftw_plan<float> {
+  typedef float scalar_type;
+  typedef fftwf_complex complex_type;
+  std::shared_ptr<fftwf_plan_s> m_plan;
+  fftw_plan() = default;
+
+  void set_plan(fftwf_plan p) { m_plan.reset(p, fftwf_destroy_plan); }
+  inline void fwd(complex_type *dst, complex_type *src, int nfft) {
+    if (m_plan == NULL) set_plan(fftwf_plan_dft_1d(nfft, src, dst, FFTW_FORWARD, FFTW_ESTIMATE | FFTW_PRESERVE_INPUT));
+    fftwf_execute_dft(m_plan.get(), src, dst);
+  }
+  inline void inv(complex_type *dst, complex_type *src, int nfft) {
+    if (m_plan == NULL) set_plan(fftwf_plan_dft_1d(nfft, src, dst, FFTW_BACKWARD, FFTW_ESTIMATE | FFTW_PRESERVE_INPUT));
+    fftwf_execute_dft(m_plan.get(), src, dst);
+  }
+  inline void fwd(complex_type *dst, scalar_type *src, int nfft) {
+    if (m_plan == NULL) set_plan(fftwf_plan_dft_r2c_1d(nfft, src, dst, FFTW_ESTIMATE | FFTW_PRESERVE_INPUT));
+    fftwf_execute_dft_r2c(m_plan.get(), src, dst);
+  }
+  inline void inv(scalar_type *dst, complex_type *src, int nfft) {
+    if (m_plan == NULL) set_plan(fftwf_plan_dft_c2r_1d(nfft, src, dst, FFTW_ESTIMATE | FFTW_PRESERVE_INPUT));
+    fftwf_execute_dft_c2r(m_plan.get(), src, dst);
   }
 
-  inline 
-  fftw_complex * fftw_cast( const std::complex<double> * p)
-  {
-      return const_cast<fftw_complex*>( reinterpret_cast<const fftw_complex*>(p) ); 
+  inline void fwd2(complex_type *dst, complex_type *src, int n0, int n1) {
+    if (m_plan == NULL)
+      set_plan(fftwf_plan_dft_2d(n0, n1, src, dst, FFTW_FORWARD, FFTW_ESTIMATE | FFTW_PRESERVE_INPUT));
+    fftwf_execute_dft(m_plan.get(), src, dst);
+  }
+  inline void inv2(complex_type *dst, complex_type *src, int n0, int n1) {
+    if (m_plan == NULL)
+      set_plan(fftwf_plan_dft_2d(n0, n1, src, dst, FFTW_BACKWARD, FFTW_ESTIMATE | FFTW_PRESERVE_INPUT));
+    fftwf_execute_dft(m_plan.get(), src, dst);
+  }
+};
+template <>
+struct fftw_plan<double> {
+  typedef double scalar_type;
+  typedef fftw_complex complex_type;
+  std::shared_ptr<fftw_plan_s> m_plan;
+  fftw_plan() = default;
+
+  void set_plan(::fftw_plan p) { m_plan.reset(p, fftw_destroy_plan); }
+  inline void fwd(complex_type *dst, complex_type *src, int nfft) {
+    if (m_plan == NULL) set_plan(fftw_plan_dft_1d(nfft, src, dst, FFTW_FORWARD, FFTW_ESTIMATE | FFTW_PRESERVE_INPUT));
+    fftw_execute_dft(m_plan.get(), src, dst);
+  }
+  inline void inv(complex_type *dst, complex_type *src, int nfft) {
+    if (m_plan == NULL) set_plan(fftw_plan_dft_1d(nfft, src, dst, FFTW_BACKWARD, FFTW_ESTIMATE | FFTW_PRESERVE_INPUT));
+    fftw_execute_dft(m_plan.get(), src, dst);
+  }
+  inline void fwd(complex_type *dst, scalar_type *src, int nfft) {
+    if (m_plan == NULL) set_plan(fftw_plan_dft_r2c_1d(nfft, src, dst, FFTW_ESTIMATE | FFTW_PRESERVE_INPUT));
+    fftw_execute_dft_r2c(m_plan.get(), src, dst);
+  }
+  inline void inv(scalar_type *dst, complex_type *src, int nfft) {
+    if (m_plan == NULL) set_plan(fftw_plan_dft_c2r_1d(nfft, src, dst, FFTW_ESTIMATE | FFTW_PRESERVE_INPUT));
+    fftw_execute_dft_c2r(m_plan.get(), src, dst);
+  }
+  inline void fwd2(complex_type *dst, complex_type *src, int n0, int n1) {
+    if (m_plan == NULL) set_plan(fftw_plan_dft_2d(n0, n1, src, dst, FFTW_FORWARD, FFTW_ESTIMATE | FFTW_PRESERVE_INPUT));
+    fftw_execute_dft(m_plan.get(), src, dst);
+  }
+  inline void inv2(complex_type *dst, complex_type *src, int n0, int n1) {
+    if (m_plan == NULL)
+      set_plan(fftw_plan_dft_2d(n0, n1, src, dst, FFTW_BACKWARD, FFTW_ESTIMATE | FFTW_PRESERVE_INPUT));
+    fftw_execute_dft(m_plan.get(), src, dst);
+  }
+};
+template <>
+struct fftw_plan<long double> {
+  typedef long double scalar_type;
+  typedef fftwl_complex complex_type;
+  std::shared_ptr<fftwl_plan_s> m_plan;
+  fftw_plan() = default;
+
+  void set_plan(fftwl_plan p) { m_plan.reset(p, fftwl_destroy_plan); }
+  inline void fwd(complex_type *dst, complex_type *src, int nfft) {
+    if (m_plan == NULL) set_plan(fftwl_plan_dft_1d(nfft, src, dst, FFTW_FORWARD, FFTW_ESTIMATE | FFTW_PRESERVE_INPUT));
+    fftwl_execute_dft(m_plan.get(), src, dst);
+  }
+  inline void inv(complex_type *dst, complex_type *src, int nfft) {
+    if (m_plan == NULL) set_plan(fftwl_plan_dft_1d(nfft, src, dst, FFTW_BACKWARD, FFTW_ESTIMATE | FFTW_PRESERVE_INPUT));
+    fftwl_execute_dft(m_plan.get(), src, dst);
+  }
+  inline void fwd(complex_type *dst, scalar_type *src, int nfft) {
+    if (m_plan == NULL) set_plan(fftwl_plan_dft_r2c_1d(nfft, src, dst, FFTW_ESTIMATE | FFTW_PRESERVE_INPUT));
+    fftwl_execute_dft_r2c(m_plan.get(), src, dst);
+  }
+  inline void inv(scalar_type *dst, complex_type *src, int nfft) {
+    if (m_plan == NULL) set_plan(fftwl_plan_dft_c2r_1d(nfft, src, dst, FFTW_ESTIMATE | FFTW_PRESERVE_INPUT));
+    fftwl_execute_dft_c2r(m_plan.get(), src, dst);
+  }
+  inline void fwd2(complex_type *dst, complex_type *src, int n0, int n1) {
+    if (m_plan == NULL)
+      set_plan(fftwl_plan_dft_2d(n0, n1, src, dst, FFTW_FORWARD, FFTW_ESTIMATE | FFTW_PRESERVE_INPUT));
+    fftwl_execute_dft(m_plan.get(), src, dst);
+  }
+  inline void inv2(complex_type *dst, complex_type *src, int n0, int n1) {
+    if (m_plan == NULL)
+      set_plan(fftwl_plan_dft_2d(n0, n1, src, dst, FFTW_BACKWARD, FFTW_ESTIMATE | FFTW_PRESERVE_INPUT));
+    fftwl_execute_dft(m_plan.get(), src, dst);
+  }
+};
+
+template <typename Scalar_>
+struct fftw_impl {
+  typedef Scalar_ Scalar;
+  typedef std::complex<Scalar> Complex;
+
+  inline void clear() { m_plans.clear(); }
+
+  // complex-to-complex forward FFT
+  inline void fwd(Complex *dst, const Complex *src, int nfft) {
+    get_plan(nfft, false, dst, src).fwd(fftw_cast(dst), fftw_cast(src), nfft);
   }
 
-  inline 
-  fftwf_complex * fftw_cast( const std::complex<float> * p)
-  { 
-      return const_cast<fftwf_complex*>( reinterpret_cast<const fftwf_complex*>(p) ); 
+  // real-to-complex forward FFT
+  inline void fwd(Complex *dst, const Scalar *src, int nfft) {
+    get_plan(nfft, false, dst, src).fwd(fftw_cast(dst), fftw_cast(src), nfft);
   }
 
-  inline 
-  fftwl_complex * fftw_cast( const std::complex<long double> * p)
-  { 
-      return const_cast<fftwl_complex*>( reinterpret_cast<const fftwl_complex*>(p) ); 
+  // 2-d complex-to-complex
+  inline void fwd2(Complex *dst, const Complex *src, int n0, int n1) {
+    get_plan(n0, n1, false, dst, src).fwd2(fftw_cast(dst), fftw_cast(src), n0, n1);
   }
 
-  template <typename T> 
-  struct fftw_plan {};
+  // inverse complex-to-complex
+  inline void inv(Complex *dst, const Complex *src, int nfft) {
+    get_plan(nfft, true, dst, src).inv(fftw_cast(dst), fftw_cast(src), nfft);
+  }
 
-  template <> 
-  struct fftw_plan<float>
-  {
-      typedef float scalar_type;
-      typedef fftwf_complex complex_type;
-      std::shared_ptr<fftwf_plan_s> m_plan;
-      fftw_plan() = default;
+  // half-complex to scalar
+  inline void inv(Scalar *dst, const Complex *src, int nfft) {
+    get_plan(nfft, true, dst, src).inv(fftw_cast(dst), fftw_cast(src), nfft);
+  }
 
-      void set_plan(fftwf_plan p) { m_plan.reset(p, fftwf_destroy_plan); }
-      inline
-      void fwd(complex_type * dst,complex_type * src,int nfft) {
-          if (m_plan==NULL) set_plan(fftwf_plan_dft_1d(nfft,src,dst, FFTW_FORWARD, FFTW_ESTIMATE|FFTW_PRESERVE_INPUT));
-          fftwf_execute_dft( m_plan.get(), src,dst);
-      }
-      inline
-      void inv(complex_type * dst,complex_type * src,int nfft) {
-          if (m_plan==NULL) set_plan(fftwf_plan_dft_1d(nfft,src,dst, FFTW_BACKWARD , FFTW_ESTIMATE|FFTW_PRESERVE_INPUT));
-          fftwf_execute_dft( m_plan.get(), src,dst);
-      }
-      inline
-      void fwd(complex_type * dst,scalar_type * src,int nfft) {
-          if (m_plan==NULL) set_plan(fftwf_plan_dft_r2c_1d(nfft,src,dst,FFTW_ESTIMATE|FFTW_PRESERVE_INPUT));
-          fftwf_execute_dft_r2c( m_plan.get(),src,dst);
-      }
-      inline
-      void inv(scalar_type * dst,complex_type * src,int nfft) {
-          if (m_plan==NULL)
-              set_plan(fftwf_plan_dft_c2r_1d(nfft,src,dst,FFTW_ESTIMATE|FFTW_PRESERVE_INPUT));
-          fftwf_execute_dft_c2r( m_plan.get(), src,dst);
-      }
+  // 2-d complex-to-complex
+  inline void inv2(Complex *dst, const Complex *src, int n0, int n1) {
+    get_plan(n0, n1, true, dst, src).inv2(fftw_cast(dst), fftw_cast(src), n0, n1);
+  }
 
-      inline 
-      void fwd2( complex_type * dst,complex_type * src,int n0,int n1) {
-          if (m_plan==NULL) set_plan(fftwf_plan_dft_2d(n0,n1,src,dst,FFTW_FORWARD,FFTW_ESTIMATE|FFTW_PRESERVE_INPUT));
-          fftwf_execute_dft( m_plan.get(), src,dst);
-      }
-      inline 
-      void inv2( complex_type * dst,complex_type * src,int n0,int n1) {
-          if (m_plan==NULL) set_plan(fftwf_plan_dft_2d(n0,n1,src,dst,FFTW_BACKWARD,FFTW_ESTIMATE|FFTW_PRESERVE_INPUT));
-          fftwf_execute_dft( m_plan.get(), src,dst);
-      }
+ protected:
+  typedef fftw_plan<Scalar> PlanData;
 
-  };
-  template <> 
-  struct fftw_plan<double>
-  {
-      typedef double scalar_type;
-      typedef fftw_complex complex_type;
-      std::shared_ptr<fftw_plan_s> m_plan;
-      fftw_plan() = default;
+  typedef Eigen::numext::int64_t int64_t;
 
-      void set_plan(::fftw_plan p) { m_plan.reset(p, fftw_destroy_plan); }
-      inline
-      void fwd(complex_type * dst,complex_type * src,int nfft) {
-          if (m_plan==NULL) set_plan(fftw_plan_dft_1d(nfft,src,dst, FFTW_FORWARD, FFTW_ESTIMATE|FFTW_PRESERVE_INPUT));
-          fftw_execute_dft( m_plan.get(), src,dst);
-      }
-      inline
-      void inv(complex_type * dst,complex_type * src,int nfft) {
-          if (m_plan==NULL) set_plan(fftw_plan_dft_1d(nfft,src,dst, FFTW_BACKWARD , FFTW_ESTIMATE|FFTW_PRESERVE_INPUT));
-          fftw_execute_dft( m_plan.get(), src,dst);
-      }
-      inline
-      void fwd(complex_type * dst,scalar_type * src,int nfft) {
-          if (m_plan==NULL) set_plan(fftw_plan_dft_r2c_1d(nfft,src,dst,FFTW_ESTIMATE|FFTW_PRESERVE_INPUT));
-          fftw_execute_dft_r2c( m_plan.get(),src,dst);
-      }
-      inline
-      void inv(scalar_type * dst,complex_type * src,int nfft) {
-          if (m_plan==NULL)
-              set_plan(fftw_plan_dft_c2r_1d(nfft,src,dst,FFTW_ESTIMATE|FFTW_PRESERVE_INPUT));
-          fftw_execute_dft_c2r( m_plan.get(), src,dst);
-      }
-      inline 
-      void fwd2( complex_type * dst,complex_type * src,int n0,int n1) {
-          if (m_plan==NULL) set_plan(fftw_plan_dft_2d(n0,n1,src,dst,FFTW_FORWARD,FFTW_ESTIMATE|FFTW_PRESERVE_INPUT));
-          fftw_execute_dft( m_plan.get(), src,dst);
-      }
-      inline 
-      void inv2( complex_type * dst,complex_type * src,int n0,int n1) {
-          if (m_plan==NULL) set_plan(fftw_plan_dft_2d(n0,n1,src,dst,FFTW_BACKWARD,FFTW_ESTIMATE|FFTW_PRESERVE_INPUT));
-          fftw_execute_dft( m_plan.get(), src,dst);
-      }
-  };
-  template <> 
-  struct fftw_plan<long double>
-  {
-      typedef long double scalar_type;
-      typedef fftwl_complex complex_type;
-      std::shared_ptr<fftwl_plan_s> m_plan;
-      fftw_plan() = default;
+  typedef std::map<int64_t, PlanData> PlanMap;
 
-      void set_plan(fftwl_plan p) { m_plan.reset(p, fftwl_destroy_plan); }
-      inline
-      void fwd(complex_type * dst,complex_type * src,int nfft) {
-          if (m_plan==NULL) set_plan(fftwl_plan_dft_1d(nfft,src,dst, FFTW_FORWARD, FFTW_ESTIMATE|FFTW_PRESERVE_INPUT));
-          fftwl_execute_dft( m_plan.get(), src,dst);
-      }
-      inline
-      void inv(complex_type * dst,complex_type * src,int nfft) {
-          if (m_plan==NULL) set_plan(fftwl_plan_dft_1d(nfft,src,dst, FFTW_BACKWARD , FFTW_ESTIMATE|FFTW_PRESERVE_INPUT));
-          fftwl_execute_dft( m_plan.get(), src,dst);
-      }
-      inline
-      void fwd(complex_type * dst,scalar_type * src,int nfft) {
-          if (m_plan==NULL) set_plan(fftwl_plan_dft_r2c_1d(nfft,src,dst,FFTW_ESTIMATE|FFTW_PRESERVE_INPUT));
-          fftwl_execute_dft_r2c( m_plan.get(),src,dst);
-      }
-      inline
-      void inv(scalar_type * dst,complex_type * src,int nfft) {
-          if (m_plan==NULL)
-              set_plan(fftwl_plan_dft_c2r_1d(nfft,src,dst,FFTW_ESTIMATE|FFTW_PRESERVE_INPUT));
-          fftwl_execute_dft_c2r( m_plan.get(), src,dst);
-      }
-      inline 
-      void fwd2( complex_type * dst,complex_type * src,int n0,int n1) {
-          if (m_plan==NULL) set_plan(fftwl_plan_dft_2d(n0,n1,src,dst,FFTW_FORWARD,FFTW_ESTIMATE|FFTW_PRESERVE_INPUT));
-          fftwl_execute_dft( m_plan.get(), src,dst);
-      }
-      inline 
-      void inv2( complex_type * dst,complex_type * src,int n0,int n1) {
-          if (m_plan==NULL) set_plan(fftwl_plan_dft_2d(n0,n1,src,dst,FFTW_BACKWARD,FFTW_ESTIMATE|FFTW_PRESERVE_INPUT));
-          fftwl_execute_dft( m_plan.get(), src,dst);
-      }
-  };
+  PlanMap m_plans;
 
-  template <typename Scalar_>
-  struct fftw_impl
-  {
-      typedef Scalar_ Scalar;
-      typedef std::complex<Scalar> Complex;
+  inline PlanData &get_plan(int nfft, bool inverse, void *dst, const void *src) {
+    bool inplace = (dst == src);
+    bool aligned = ((reinterpret_cast<size_t>(src) & 15) | (reinterpret_cast<size_t>(dst) & 15)) == 0;
+    int64_t key = ((nfft << 3) | (inverse << 2) | (inplace << 1) | aligned) << 1;
+    return m_plans[key];
+  }
 
-      inline
-      void clear() 
-      {
-        m_plans.clear();
-      }
+  inline PlanData &get_plan(int n0, int n1, bool inverse, void *dst, const void *src) {
+    bool inplace = (dst == src);
+    bool aligned = ((reinterpret_cast<size_t>(src) & 15) | (reinterpret_cast<size_t>(dst) & 15)) == 0;
+    int64_t key = (((((int64_t)n0) << 30) | (n1 << 3) | (inverse << 2) | (inplace << 1) | aligned) << 1) + 1;
+    return m_plans[key];
+  }
+};
 
-      // complex-to-complex forward FFT
-      inline
-      void fwd( Complex * dst,const Complex *src,int nfft)
-      {
-        get_plan(nfft,false,dst,src).fwd(fftw_cast(dst), fftw_cast(src),nfft );
-      }
+}  // end namespace internal
 
-      // real-to-complex forward FFT
-      inline
-      void fwd( Complex * dst,const Scalar * src,int nfft) 
-      {
-          get_plan(nfft,false,dst,src).fwd(fftw_cast(dst), fftw_cast(src) ,nfft);
-      }
-
-      // 2-d complex-to-complex
-      inline
-      void fwd2(Complex * dst, const Complex * src, int n0,int n1)
-      {
-          get_plan(n0,n1,false,dst,src).fwd2(fftw_cast(dst), fftw_cast(src) ,n0,n1);
-      }
-
-      // inverse complex-to-complex
-      inline
-      void inv(Complex * dst,const Complex  *src,int nfft)
-      {
-        get_plan(nfft,true,dst,src).inv(fftw_cast(dst), fftw_cast(src),nfft );
-      }
-
-      // half-complex to scalar
-      inline
-      void inv( Scalar * dst,const Complex * src,int nfft) 
-      {
-        get_plan(nfft,true,dst,src).inv(fftw_cast(dst), fftw_cast(src),nfft );
-      }
-
-      // 2-d complex-to-complex
-      inline
-      void inv2(Complex * dst, const Complex * src, int n0,int n1)
-      {
-        get_plan(n0,n1,true,dst,src).inv2(fftw_cast(dst), fftw_cast(src) ,n0,n1);
-      }
-
-
-  protected:
-      typedef fftw_plan<Scalar> PlanData;
-
-      typedef Eigen::numext::int64_t int64_t;
-
-      typedef std::map<int64_t,PlanData> PlanMap;
-
-      PlanMap m_plans;
-
-      inline
-      PlanData & get_plan(int nfft,bool inverse,void * dst,const void * src)
-      {
-          bool inplace = (dst==src);
-          bool aligned = ( (reinterpret_cast<size_t>(src)&15) | (reinterpret_cast<size_t>(dst)&15) ) == 0;
-          int64_t key = ( (nfft<<3 ) | (inverse<<2) | (inplace<<1) | aligned ) << 1;
-          return m_plans[key];
-      }
-
-      inline
-      PlanData & get_plan(int n0,int n1,bool inverse,void * dst,const void * src)
-      {
-          bool inplace = (dst==src);
-          bool aligned = ( (reinterpret_cast<size_t>(src)&15) | (reinterpret_cast<size_t>(dst)&15) ) == 0;
-          int64_t key = ( ( (((int64_t)n0) << 30)|(n1<<3 ) | (inverse<<2) | (inplace<<1) | aligned ) << 1 ) + 1;
-          return m_plans[key];
-      }
-  };
-
-} // end namespace internal
-
-} // end namespace Eigen
+}  // end namespace Eigen
diff --git a/unsupported/Eigen/src/FFT/ei_imklfft_impl.h b/unsupported/Eigen/src/FFT/ei_imklfft_impl.h
index 16af59d..0c5bb26 100644
--- a/unsupported/Eigen/src/FFT/ei_imklfft_impl.h
+++ b/unsupported/Eigen/src/FFT/ei_imklfft_impl.h
@@ -17,9 +17,9 @@
 namespace internal {
 namespace imklfft {
 
-#define RUN_OR_ASSERT(EXPR, ERROR_MSG)                   \
-  {                                                      \
-    MKL_LONG status = (EXPR);                            \
+#define RUN_OR_ASSERT(EXPR, ERROR_MSG)                    \
+  {                                                       \
+    MKL_LONG status = (EXPR);                             \
     eigen_assert(status == DFTI_NO_ERROR && (ERROR_MSG)); \
   };
 
@@ -40,35 +40,26 @@
  * Array of type MKL_LONG otherwise. Lengths of each dimension for a
  * multi-dimensional transform.
  */
-inline void configure_descriptor(std::shared_ptr<DFTI_DESCRIPTOR>& handl,
-                                 enum DFTI_CONFIG_VALUE precision,
-                                 enum DFTI_CONFIG_VALUE forward_domain,
-                                 MKL_LONG dimension, MKL_LONG* sizes) {
-  eigen_assert(dimension == 1 ||
-               dimension == 2 &&
-                   "Transformation dimension must be less than 3.");
+inline void configure_descriptor(std::shared_ptr<DFTI_DESCRIPTOR>& handl, enum DFTI_CONFIG_VALUE precision,
+                                 enum DFTI_CONFIG_VALUE forward_domain, MKL_LONG dimension, MKL_LONG* sizes) {
+  eigen_assert(dimension == 1 || dimension == 2 && "Transformation dimension must be less than 3.");
 
   DFTI_DESCRIPTOR_HANDLE res = nullptr;
   if (dimension == 1) {
-    RUN_OR_ASSERT(DftiCreateDescriptor(&res, precision, forward_domain,
-                                       dimension, *sizes),
+    RUN_OR_ASSERT(DftiCreateDescriptor(&res, precision, forward_domain, dimension, *sizes),
                   "DftiCreateDescriptor failed.")
     handl.reset(res, [](DFTI_DESCRIPTOR_HANDLE handle) { DftiFreeDescriptor(&handle); });
     if (forward_domain == DFTI_REAL) {
       // Set CCE storage
-      RUN_OR_ASSERT(DftiSetValue(handl.get(), DFTI_CONJUGATE_EVEN_STORAGE,
-                                 DFTI_COMPLEX_COMPLEX),
+      RUN_OR_ASSERT(DftiSetValue(handl.get(), DFTI_CONJUGATE_EVEN_STORAGE, DFTI_COMPLEX_COMPLEX),
                     "DftiSetValue failed.")
     }
   } else {
-    RUN_OR_ASSERT(
-        DftiCreateDescriptor(&res, precision, DFTI_COMPLEX, dimension, sizes),
-        "DftiCreateDescriptor failed.")
+    RUN_OR_ASSERT(DftiCreateDescriptor(&res, precision, DFTI_COMPLEX, dimension, sizes), "DftiCreateDescriptor failed.")
     handl.reset(res, [](DFTI_DESCRIPTOR_HANDLE handle) { DftiFreeDescriptor(&handle); });
   }
 
-  RUN_OR_ASSERT(DftiSetValue(handl.get(), DFTI_PLACEMENT, DFTI_NOT_INPLACE),
-                "DftiSetValue failed.")
+  RUN_OR_ASSERT(DftiSetValue(handl.get(), DFTI_PLACEMENT, DFTI_NOT_INPLACE), "DftiSetValue failed.")
   RUN_OR_ASSERT(DftiCommitDescriptor(handl.get()), "DftiCommitDescriptor failed.")
 }
 
@@ -90,32 +81,28 @@
     if (m_plan == 0) {
       configure_descriptor(m_plan, precision, DFTI_COMPLEX, 1, &nfft);
     }
-    RUN_OR_ASSERT(DftiComputeForward(m_plan.get(), src, dst),
-                  "DftiComputeForward failed.")
+    RUN_OR_ASSERT(DftiComputeForward(m_plan.get(), src, dst), "DftiComputeForward failed.")
   }
 
   inline void inverse(complex_type* dst, complex_type* src, MKL_LONG nfft) {
     if (m_plan == 0) {
       configure_descriptor(m_plan, precision, DFTI_COMPLEX, 1, &nfft);
     }
-    RUN_OR_ASSERT(DftiComputeBackward(m_plan.get(), src, dst),
-                  "DftiComputeBackward failed.")
+    RUN_OR_ASSERT(DftiComputeBackward(m_plan.get(), src, dst), "DftiComputeBackward failed.")
   }
 
   inline void forward(complex_type* dst, scalar_type* src, MKL_LONG nfft) {
     if (m_plan == 0) {
       configure_descriptor(m_plan, precision, DFTI_REAL, 1, &nfft);
     }
-    RUN_OR_ASSERT(DftiComputeForward(m_plan.get(), src, dst),
-                  "DftiComputeForward failed.")
+    RUN_OR_ASSERT(DftiComputeForward(m_plan.get(), src, dst), "DftiComputeForward failed.")
   }
 
   inline void inverse(scalar_type* dst, complex_type* src, MKL_LONG nfft) {
     if (m_plan == 0) {
       configure_descriptor(m_plan, precision, DFTI_REAL, 1, &nfft);
     }
-    RUN_OR_ASSERT(DftiComputeBackward(m_plan.get(), src, dst),
-                  "DftiComputeBackward failed.")
+    RUN_OR_ASSERT(DftiComputeBackward(m_plan.get(), src, dst), "DftiComputeBackward failed.")
   }
 
   inline void forward2(complex_type* dst, complex_type* src, int n0, int n1) {
@@ -123,8 +110,7 @@
       MKL_LONG sizes[2] = {n0, n1};
       configure_descriptor(m_plan, precision, DFTI_COMPLEX, 2, sizes);
     }
-    RUN_OR_ASSERT(DftiComputeForward(m_plan.get(), src, dst),
-                  "DftiComputeForward failed.")
+    RUN_OR_ASSERT(DftiComputeForward(m_plan.get(), src, dst), "DftiComputeForward failed.")
   }
 
   inline void inverse2(complex_type* dst, complex_type* src, int n0, int n1) {
@@ -132,8 +118,7 @@
       MKL_LONG sizes[2] = {n0, n1};
       configure_descriptor(m_plan, precision, DFTI_COMPLEX, 2, sizes);
     }
-    RUN_OR_ASSERT(DftiComputeBackward(m_plan.get(), src, dst),
-                  "DftiComputeBackward failed.")
+    RUN_OR_ASSERT(DftiComputeBackward(m_plan.get(), src, dst), "DftiComputeBackward failed.")
   }
 };
 
@@ -152,32 +137,28 @@
     if (m_plan == 0) {
       configure_descriptor(m_plan, precision, DFTI_COMPLEX, 1, &nfft);
     }
-    RUN_OR_ASSERT(DftiComputeForward(m_plan.get(), src, dst),
-                  "DftiComputeForward failed.")
+    RUN_OR_ASSERT(DftiComputeForward(m_plan.get(), src, dst), "DftiComputeForward failed.")
   }
 
   inline void inverse(complex_type* dst, complex_type* src, MKL_LONG nfft) {
     if (m_plan == 0) {
       configure_descriptor(m_plan, precision, DFTI_COMPLEX, 1, &nfft);
     }
-    RUN_OR_ASSERT(DftiComputeBackward(m_plan.get(), src, dst),
-                  "DftiComputeBackward failed.")
+    RUN_OR_ASSERT(DftiComputeBackward(m_plan.get(), src, dst), "DftiComputeBackward failed.")
   }
 
   inline void forward(complex_type* dst, scalar_type* src, MKL_LONG nfft) {
     if (m_plan == 0) {
       configure_descriptor(m_plan, precision, DFTI_REAL, 1, &nfft);
     }
-    RUN_OR_ASSERT(DftiComputeForward(m_plan.get(), src, dst),
-                  "DftiComputeForward failed.")
+    RUN_OR_ASSERT(DftiComputeForward(m_plan.get(), src, dst), "DftiComputeForward failed.")
   }
 
   inline void inverse(scalar_type* dst, complex_type* src, MKL_LONG nfft) {
     if (m_plan == 0) {
       configure_descriptor(m_plan, precision, DFTI_REAL, 1, &nfft);
     }
-    RUN_OR_ASSERT(DftiComputeBackward(m_plan.get(), src, dst),
-                  "DftiComputeBackward failed.")
+    RUN_OR_ASSERT(DftiComputeBackward(m_plan.get(), src, dst), "DftiComputeBackward failed.")
   }
 
   inline void forward2(complex_type* dst, complex_type* src, int n0, int n1) {
@@ -185,8 +166,7 @@
       MKL_LONG sizes[2] = {n0, n1};
       configure_descriptor(m_plan, precision, DFTI_COMPLEX, 2, sizes);
     }
-    RUN_OR_ASSERT(DftiComputeForward(m_plan.get(), src, dst),
-                  "DftiComputeForward failed.")
+    RUN_OR_ASSERT(DftiComputeForward(m_plan.get(), src, dst), "DftiComputeForward failed.")
   }
 
   inline void inverse2(complex_type* dst, complex_type* src, int n0, int n1) {
@@ -194,8 +174,7 @@
       MKL_LONG sizes[2] = {n0, n1};
       configure_descriptor(m_plan, precision, DFTI_COMPLEX, 2, sizes);
     }
-    RUN_OR_ASSERT(DftiComputeBackward(m_plan.get(), src, dst),
-                  "DftiComputeBackward failed.")
+    RUN_OR_ASSERT(DftiComputeBackward(m_plan.get(), src, dst), "DftiComputeBackward failed.")
   }
 };
 
@@ -209,71 +188,53 @@
   // complex-to-complex forward FFT
   inline void fwd(Complex* dst, const Complex* src, int nfft) {
     MKL_LONG size = nfft;
-    get_plan(nfft, dst, src)
-        .forward(complex_cast(dst), complex_cast(src), size);
+    get_plan(nfft, dst, src).forward(complex_cast(dst), complex_cast(src), size);
   }
 
   // real-to-complex forward FFT
   inline void fwd(Complex* dst, const Scalar* src, int nfft) {
     MKL_LONG size = nfft;
-    get_plan(nfft, dst, src)
-        .forward(complex_cast(dst), const_cast<Scalar*>(src), nfft);
+    get_plan(nfft, dst, src).forward(complex_cast(dst), const_cast<Scalar*>(src), nfft);
   }
 
   // 2-d complex-to-complex
   inline void fwd2(Complex* dst, const Complex* src, int n0, int n1) {
-    get_plan(n0, n1, dst, src)
-        .forward2(complex_cast(dst), complex_cast(src), n0, n1);
+    get_plan(n0, n1, dst, src).forward2(complex_cast(dst), complex_cast(src), n0, n1);
   }
 
   // inverse complex-to-complex
   inline void inv(Complex* dst, const Complex* src, int nfft) {
     MKL_LONG size = nfft;
-    get_plan(nfft, dst, src)
-        .inverse(complex_cast(dst), complex_cast(src), nfft);
+    get_plan(nfft, dst, src).inverse(complex_cast(dst), complex_cast(src), nfft);
   }
 
   // half-complex to scalar
   inline void inv(Scalar* dst, const Complex* src, int nfft) {
     MKL_LONG size = nfft;
-    get_plan(nfft, dst, src)
-        .inverse(const_cast<Scalar*>(dst), complex_cast(src), nfft);
+    get_plan(nfft, dst, src).inverse(const_cast<Scalar*>(dst), complex_cast(src), nfft);
   }
 
   // 2-d complex-to-complex
   inline void inv2(Complex* dst, const Complex* src, int n0, int n1) {
-    get_plan(n0, n1, dst, src)
-        .inverse2(complex_cast(dst), complex_cast(src), n0, n1);
+    get_plan(n0, n1, dst, src).inverse2(complex_cast(dst), complex_cast(src), n0, n1);
   }
 
  private:
   std::map<int64_t, plan<Scalar>> m_plans;
 
-  inline plan<Scalar>& get_plan(int nfft, void* dst,
-                                const void* src) {
+  inline plan<Scalar>& get_plan(int nfft, void* dst, const void* src) {
     int inplace = dst == src ? 1 : 0;
-    int aligned = ((reinterpret_cast<size_t>(src) & 15) |
-                   (reinterpret_cast<size_t>(dst) & 15)) == 0
-                      ? 1
-                      : 0;
-    int64_t key = ((nfft << 2) | (inplace << 1) | aligned)
-                  << 1;
+    int aligned = ((reinterpret_cast<size_t>(src) & 15) | (reinterpret_cast<size_t>(dst) & 15)) == 0 ? 1 : 0;
+    int64_t key = ((nfft << 2) | (inplace << 1) | aligned) << 1;
 
     // Create element if key does not exist.
     return m_plans[key];
   }
 
-  inline plan<Scalar>& get_plan(int n0, int n1, void* dst,
-                                const void* src) {
+  inline plan<Scalar>& get_plan(int n0, int n1, void* dst, const void* src) {
     int inplace = (dst == src) ? 1 : 0;
-    int aligned = ((reinterpret_cast<size_t>(src) & 15) |
-                   (reinterpret_cast<size_t>(dst) & 15)) == 0
-                      ? 1
-                      : 0;
-    int64_t key = (((((int64_t)n0) << 31) | (n1 << 2) |
-                    (inplace << 1) | aligned)
-                   << 1) +
-                  1;
+    int aligned = ((reinterpret_cast<size_t>(src) & 15) | (reinterpret_cast<size_t>(dst) & 15)) == 0 ? 1 : 0;
+    int64_t key = (((((int64_t)n0) << 31) | (n1 << 2) | (inplace << 1) | aligned) << 1) + 1;
 
     // Create element if key does not exist.
     return m_plans[key];
diff --git a/unsupported/Eigen/src/FFT/ei_kissfft_impl.h b/unsupported/Eigen/src/FFT/ei_kissfft_impl.h
index 80bbdb7..0d2b3cf 100644
--- a/unsupported/Eigen/src/FFT/ei_kissfft_impl.h
+++ b/unsupported/Eigen/src/FFT/ei_kissfft_impl.h
@@ -10,16 +10,15 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
-  // This FFT implementation was derived from kissfft http:sourceforge.net/projects/kissfft
-  // Copyright 2003-2009 Mark Borgerding
+// This FFT implementation was derived from kissfft http:sourceforge.net/projects/kissfft
+// Copyright 2003-2009 Mark Borgerding
 
 template <typename Scalar_>
-struct kiss_cpx_fft
-{
+struct kiss_cpx_fft {
   typedef Scalar_ Scalar;
   typedef std::complex<Scalar> Complex;
   std::vector<Complex> m_twiddles;
@@ -28,425 +27,384 @@
   std::vector<Complex> m_scratchBuf;
   bool m_inverse;
 
-  inline void make_twiddles(int nfft, bool inverse)
-  {
-    using numext::sin;
+  inline void make_twiddles(int nfft, bool inverse) {
     using numext::cos;
+    using numext::sin;
     m_inverse = inverse;
     m_twiddles.resize(nfft);
-    double phinc =  0.25 * double(EIGEN_PI) / nfft;
+    double phinc = 0.25 * double(EIGEN_PI) / nfft;
     Scalar flip = inverse ? Scalar(1) : Scalar(-1);
     m_twiddles[0] = Complex(Scalar(1), Scalar(0));
-    if ((nfft&1)==0)
-      m_twiddles[nfft/2] = Complex(Scalar(-1), Scalar(0));
-    int i=1;
-    for (;i*8<nfft;++i)
-    {
-      Scalar c = Scalar(cos(i*8*phinc));
-      Scalar s = Scalar(sin(i*8*phinc));
-      m_twiddles[i] = Complex(c, s*flip);
-      m_twiddles[nfft-i] = Complex(c, -s*flip);
+    if ((nfft & 1) == 0) m_twiddles[nfft / 2] = Complex(Scalar(-1), Scalar(0));
+    int i = 1;
+    for (; i * 8 < nfft; ++i) {
+      Scalar c = Scalar(cos(i * 8 * phinc));
+      Scalar s = Scalar(sin(i * 8 * phinc));
+      m_twiddles[i] = Complex(c, s * flip);
+      m_twiddles[nfft - i] = Complex(c, -s * flip);
     }
-    for (;i*4<nfft;++i)
-    {
-      Scalar c = Scalar(cos((2*nfft-8*i)*phinc));
-      Scalar s = Scalar(sin((2*nfft-8*i)*phinc));
-      m_twiddles[i] = Complex(s, c*flip);
-      m_twiddles[nfft-i] = Complex(s, -c*flip);
+    for (; i * 4 < nfft; ++i) {
+      Scalar c = Scalar(cos((2 * nfft - 8 * i) * phinc));
+      Scalar s = Scalar(sin((2 * nfft - 8 * i) * phinc));
+      m_twiddles[i] = Complex(s, c * flip);
+      m_twiddles[nfft - i] = Complex(s, -c * flip);
     }
-    for (;i*8<3*nfft;++i)
-    {
-      Scalar c = Scalar(cos((8*i-2*nfft)*phinc));
-      Scalar s = Scalar(sin((8*i-2*nfft)*phinc));
-      m_twiddles[i] = Complex(-s, c*flip);
-      m_twiddles[nfft-i] = Complex(-s, -c*flip);
+    for (; i * 8 < 3 * nfft; ++i) {
+      Scalar c = Scalar(cos((8 * i - 2 * nfft) * phinc));
+      Scalar s = Scalar(sin((8 * i - 2 * nfft) * phinc));
+      m_twiddles[i] = Complex(-s, c * flip);
+      m_twiddles[nfft - i] = Complex(-s, -c * flip);
     }
-    for (;i*2<nfft;++i)
-    {
-      Scalar c = Scalar(cos((4*nfft-8*i)*phinc));
-      Scalar s = Scalar(sin((4*nfft-8*i)*phinc));
-      m_twiddles[i] = Complex(-c, s*flip);
-      m_twiddles[nfft-i] = Complex(-c, -s*flip);
+    for (; i * 2 < nfft; ++i) {
+      Scalar c = Scalar(cos((4 * nfft - 8 * i) * phinc));
+      Scalar s = Scalar(sin((4 * nfft - 8 * i) * phinc));
+      m_twiddles[i] = Complex(-c, s * flip);
+      m_twiddles[nfft - i] = Complex(-c, -s * flip);
     }
   }
 
-  void factorize(int nfft)
-  {
-    //start factoring out 4's, then 2's, then 3,5,7,9,...
-    int n= nfft;
-    int p=4;
+  void factorize(int nfft) {
+    // start factoring out 4's, then 2's, then 3,5,7,9,...
+    int n = nfft;
+    int p = 4;
     do {
       while (n % p) {
         switch (p) {
-          case 4: p = 2; break;
-          case 2: p = 3; break;
-          default: p += 2; break;
+          case 4:
+            p = 2;
+            break;
+          case 2:
+            p = 3;
+            break;
+          default:
+            p += 2;
+            break;
         }
-        if (p*p>n)
-          p=n;// impossible to have a factor > sqrt(n)
+        if (p * p > n) p = n;  // impossible to have a factor > sqrt(n)
       }
       n /= p;
       m_stageRadix.push_back(p);
       m_stageRemainder.push_back(n);
-      if ( p > 5 )
-        m_scratchBuf.resize(p); // scratchbuf will be needed in bfly_generic
-    }while(n>1);
+      if (p > 5) m_scratchBuf.resize(p);  // scratchbuf will be needed in bfly_generic
+    } while (n > 1);
   }
 
   template <typename Src_>
-    inline
-    void work( int stage,Complex * xout, const Src_ * xin, size_t fstride,size_t in_stride)
-    {
-      int p = m_stageRadix[stage];
-      int m = m_stageRemainder[stage];
-      Complex * Fout_beg = xout;
-      Complex * Fout_end = xout + p*m;
+  inline void work(int stage, Complex *xout, const Src_ *xin, size_t fstride, size_t in_stride) {
+    int p = m_stageRadix[stage];
+    int m = m_stageRemainder[stage];
+    Complex *Fout_beg = xout;
+    Complex *Fout_end = xout + p * m;
 
-      if (m>1) {
-        do{
-          // recursive call:
-          // DFT of size m*p performed by doing
-          // p instances of smaller DFTs of size m, 
-          // each one takes a decimated version of the input
-          work(stage+1, xout , xin, fstride*p,in_stride);
-          xin += fstride*in_stride;
-        }while( (xout += m) != Fout_end );
-      }else{
-        do{
-          *xout = *xin;
-          xin += fstride*in_stride;
-        }while(++xout != Fout_end );
-      }
-      xout=Fout_beg;
-
-      // recombine the p smaller DFTs 
-      switch (p) {
-        case 2: bfly2(xout,fstride,m); break;
-        case 3: bfly3(xout,fstride,m); break;
-        case 4: bfly4(xout,fstride,m); break;
-        case 5: bfly5(xout,fstride,m); break;
-        default: bfly_generic(xout,fstride,m,p); break;
-      }
+    if (m > 1) {
+      do {
+        // recursive call:
+        // DFT of size m*p performed by doing
+        // p instances of smaller DFTs of size m,
+        // each one takes a decimated version of the input
+        work(stage + 1, xout, xin, fstride * p, in_stride);
+        xin += fstride * in_stride;
+      } while ((xout += m) != Fout_end);
+    } else {
+      do {
+        *xout = *xin;
+        xin += fstride * in_stride;
+      } while (++xout != Fout_end);
     }
+    xout = Fout_beg;
 
-  inline
-    void bfly2( Complex * Fout, const size_t fstride, int m)
-    {
-      for (int k=0;k<m;++k) {
-        Complex t = Fout[m+k] * m_twiddles[k*fstride];
-        Fout[m+k] = Fout[k] - t;
-        Fout[k] += t;
-      }
+    // recombine the p smaller DFTs
+    switch (p) {
+      case 2:
+        bfly2(xout, fstride, m);
+        break;
+      case 3:
+        bfly3(xout, fstride, m);
+        break;
+      case 4:
+        bfly4(xout, fstride, m);
+        break;
+      case 5:
+        bfly5(xout, fstride, m);
+        break;
+      default:
+        bfly_generic(xout, fstride, m, p);
+        break;
     }
+  }
 
-  inline
-    void bfly4( Complex * Fout, const size_t fstride, const size_t m)
-    {
-      Complex scratch[6];
-      int negative_if_inverse = m_inverse * -2 +1;
-      for (size_t k=0;k<m;++k) {
-        scratch[0] = Fout[k+m] * m_twiddles[k*fstride];
-        scratch[1] = Fout[k+2*m] * m_twiddles[k*fstride*2];
-        scratch[2] = Fout[k+3*m] * m_twiddles[k*fstride*3];
-        scratch[5] = Fout[k] - scratch[1];
-
-        Fout[k] += scratch[1];
-        scratch[3] = scratch[0] + scratch[2];
-        scratch[4] = scratch[0] - scratch[2];
-        scratch[4] = Complex( scratch[4].imag()*negative_if_inverse , -scratch[4].real()* negative_if_inverse );
-
-        Fout[k+2*m]  = Fout[k] - scratch[3];
-        Fout[k] += scratch[3];
-        Fout[k+m] = scratch[5] + scratch[4];
-        Fout[k+3*m] = scratch[5] - scratch[4];
-      }
+  inline void bfly2(Complex *Fout, const size_t fstride, int m) {
+    for (int k = 0; k < m; ++k) {
+      Complex t = Fout[m + k] * m_twiddles[k * fstride];
+      Fout[m + k] = Fout[k] - t;
+      Fout[k] += t;
     }
+  }
 
-  inline
-    void bfly3( Complex * Fout, const size_t fstride, const size_t m)
-    {
-      size_t k=m;
-      const size_t m2 = 2*m;
-      Complex *tw1,*tw2;
-      Complex scratch[5];
-      Complex epi3;
-      epi3 = m_twiddles[fstride*m];
+  inline void bfly4(Complex *Fout, const size_t fstride, const size_t m) {
+    Complex scratch[6];
+    int negative_if_inverse = m_inverse * -2 + 1;
+    for (size_t k = 0; k < m; ++k) {
+      scratch[0] = Fout[k + m] * m_twiddles[k * fstride];
+      scratch[1] = Fout[k + 2 * m] * m_twiddles[k * fstride * 2];
+      scratch[2] = Fout[k + 3 * m] * m_twiddles[k * fstride * 3];
+      scratch[5] = Fout[k] - scratch[1];
 
-      tw1=tw2=&m_twiddles[0];
+      Fout[k] += scratch[1];
+      scratch[3] = scratch[0] + scratch[2];
+      scratch[4] = scratch[0] - scratch[2];
+      scratch[4] = Complex(scratch[4].imag() * negative_if_inverse, -scratch[4].real() * negative_if_inverse);
 
-      do{
-        scratch[1]=Fout[m] * *tw1;
-        scratch[2]=Fout[m2] * *tw2;
-
-        scratch[3]=scratch[1]+scratch[2];
-        scratch[0]=scratch[1]-scratch[2];
-        tw1 += fstride;
-        tw2 += fstride*2;
-        Fout[m] = Complex( Fout->real() - Scalar(.5)*scratch[3].real() , Fout->imag() - Scalar(.5)*scratch[3].imag() );
-        scratch[0] *= epi3.imag();
-        *Fout += scratch[3];
-        Fout[m2] = Complex(  Fout[m].real() + scratch[0].imag() , Fout[m].imag() - scratch[0].real() );
-        Fout[m] += Complex( -scratch[0].imag(),scratch[0].real() );
-        ++Fout;
-      }while(--k);
+      Fout[k + 2 * m] = Fout[k] - scratch[3];
+      Fout[k] += scratch[3];
+      Fout[k + m] = scratch[5] + scratch[4];
+      Fout[k + 3 * m] = scratch[5] - scratch[4];
     }
+  }
 
-  inline
-    void bfly5( Complex * Fout, const size_t fstride, const size_t m)
-    {
-      Complex *Fout0,*Fout1,*Fout2,*Fout3,*Fout4;
-      size_t u;
-      Complex scratch[13];
-      Complex * twiddles = &m_twiddles[0];
-      Complex *tw;
-      Complex ya,yb;
-      ya = twiddles[fstride*m];
-      yb = twiddles[fstride*2*m];
+  inline void bfly3(Complex *Fout, const size_t fstride, const size_t m) {
+    size_t k = m;
+    const size_t m2 = 2 * m;
+    Complex *tw1, *tw2;
+    Complex scratch[5];
+    Complex epi3;
+    epi3 = m_twiddles[fstride * m];
 
-      Fout0=Fout;
-      Fout1=Fout0+m;
-      Fout2=Fout0+2*m;
-      Fout3=Fout0+3*m;
-      Fout4=Fout0+4*m;
+    tw1 = tw2 = &m_twiddles[0];
 
-      tw=twiddles;
-      for ( u=0; u<m; ++u ) {
-        scratch[0] = *Fout0;
+    do {
+      scratch[1] = Fout[m] * *tw1;
+      scratch[2] = Fout[m2] * *tw2;
 
-        scratch[1]  = *Fout1 * tw[u*fstride];
-        scratch[2]  = *Fout2 * tw[2*u*fstride];
-        scratch[3]  = *Fout3 * tw[3*u*fstride];
-        scratch[4]  = *Fout4 * tw[4*u*fstride];
+      scratch[3] = scratch[1] + scratch[2];
+      scratch[0] = scratch[1] - scratch[2];
+      tw1 += fstride;
+      tw2 += fstride * 2;
+      Fout[m] = Complex(Fout->real() - Scalar(.5) * scratch[3].real(), Fout->imag() - Scalar(.5) * scratch[3].imag());
+      scratch[0] *= epi3.imag();
+      *Fout += scratch[3];
+      Fout[m2] = Complex(Fout[m].real() + scratch[0].imag(), Fout[m].imag() - scratch[0].real());
+      Fout[m] += Complex(-scratch[0].imag(), scratch[0].real());
+      ++Fout;
+    } while (--k);
+  }
 
-        scratch[7] = scratch[1] + scratch[4];
-        scratch[10] = scratch[1] - scratch[4];
-        scratch[8] = scratch[2] + scratch[3];
-        scratch[9] = scratch[2] - scratch[3];
+  inline void bfly5(Complex *Fout, const size_t fstride, const size_t m) {
+    Complex *Fout0, *Fout1, *Fout2, *Fout3, *Fout4;
+    size_t u;
+    Complex scratch[13];
+    Complex *twiddles = &m_twiddles[0];
+    Complex *tw;
+    Complex ya, yb;
+    ya = twiddles[fstride * m];
+    yb = twiddles[fstride * 2 * m];
 
-        *Fout0 +=  scratch[7];
-        *Fout0 +=  scratch[8];
+    Fout0 = Fout;
+    Fout1 = Fout0 + m;
+    Fout2 = Fout0 + 2 * m;
+    Fout3 = Fout0 + 3 * m;
+    Fout4 = Fout0 + 4 * m;
 
-        scratch[5] = scratch[0] + Complex(
-            (scratch[7].real()*ya.real() ) + (scratch[8].real() *yb.real() ),
-            (scratch[7].imag()*ya.real()) + (scratch[8].imag()*yb.real())
-            );
+    tw = twiddles;
+    for (u = 0; u < m; ++u) {
+      scratch[0] = *Fout0;
 
-        scratch[6] = Complex(
-            (scratch[10].imag()*ya.imag()) + (scratch[9].imag()*yb.imag()),
-            -(scratch[10].real()*ya.imag()) - (scratch[9].real()*yb.imag())
-            );
+      scratch[1] = *Fout1 * tw[u * fstride];
+      scratch[2] = *Fout2 * tw[2 * u * fstride];
+      scratch[3] = *Fout3 * tw[3 * u * fstride];
+      scratch[4] = *Fout4 * tw[4 * u * fstride];
 
-        *Fout1 = scratch[5] - scratch[6];
-        *Fout4 = scratch[5] + scratch[6];
+      scratch[7] = scratch[1] + scratch[4];
+      scratch[10] = scratch[1] - scratch[4];
+      scratch[8] = scratch[2] + scratch[3];
+      scratch[9] = scratch[2] - scratch[3];
 
-        scratch[11] = scratch[0] +
-          Complex(
-              (scratch[7].real()*yb.real()) + (scratch[8].real()*ya.real()),
-              (scratch[7].imag()*yb.real()) + (scratch[8].imag()*ya.real())
-              );
+      *Fout0 += scratch[7];
+      *Fout0 += scratch[8];
 
-        scratch[12] = Complex(
-            -(scratch[10].imag()*yb.imag()) + (scratch[9].imag()*ya.imag()),
-            (scratch[10].real()*yb.imag()) - (scratch[9].real()*ya.imag())
-            );
+      scratch[5] = scratch[0] + Complex((scratch[7].real() * ya.real()) + (scratch[8].real() * yb.real()),
+                                        (scratch[7].imag() * ya.real()) + (scratch[8].imag() * yb.real()));
 
-        *Fout2=scratch[11]+scratch[12];
-        *Fout3=scratch[11]-scratch[12];
+      scratch[6] = Complex((scratch[10].imag() * ya.imag()) + (scratch[9].imag() * yb.imag()),
+                           -(scratch[10].real() * ya.imag()) - (scratch[9].real() * yb.imag()));
 
-        ++Fout0;++Fout1;++Fout2;++Fout3;++Fout4;
-      }
+      *Fout1 = scratch[5] - scratch[6];
+      *Fout4 = scratch[5] + scratch[6];
+
+      scratch[11] = scratch[0] + Complex((scratch[7].real() * yb.real()) + (scratch[8].real() * ya.real()),
+                                         (scratch[7].imag() * yb.real()) + (scratch[8].imag() * ya.real()));
+
+      scratch[12] = Complex(-(scratch[10].imag() * yb.imag()) + (scratch[9].imag() * ya.imag()),
+                            (scratch[10].real() * yb.imag()) - (scratch[9].real() * ya.imag()));
+
+      *Fout2 = scratch[11] + scratch[12];
+      *Fout3 = scratch[11] - scratch[12];
+
+      ++Fout0;
+      ++Fout1;
+      ++Fout2;
+      ++Fout3;
+      ++Fout4;
     }
+  }
 
   /* perform the butterfly for one stage of a mixed radix FFT */
-  inline
-    void bfly_generic(
-        Complex * Fout,
-        const size_t fstride,
-        int m,
-        int p
-        )
-    {
-      int u,k,q1,q;
-      Complex * twiddles = &m_twiddles[0];
-      Complex t;
-      int Norig = static_cast<int>(m_twiddles.size());
-      Complex * scratchbuf = &m_scratchBuf[0];
+  inline void bfly_generic(Complex *Fout, const size_t fstride, int m, int p) {
+    int u, k, q1, q;
+    Complex *twiddles = &m_twiddles[0];
+    Complex t;
+    int Norig = static_cast<int>(m_twiddles.size());
+    Complex *scratchbuf = &m_scratchBuf[0];
 
-      for ( u=0; u<m; ++u ) {
-        k=u;
-        for ( q1=0 ; q1<p ; ++q1 ) {
-          scratchbuf[q1] = Fout[ k  ];
-          k += m;
-        }
+    for (u = 0; u < m; ++u) {
+      k = u;
+      for (q1 = 0; q1 < p; ++q1) {
+        scratchbuf[q1] = Fout[k];
+        k += m;
+      }
 
-        k=u;
-        for ( q1=0 ; q1<p ; ++q1 ) {
-          int twidx=0;
-          Fout[ k ] = scratchbuf[0];
-          for (q=1;q<p;++q ) {
-            twidx += static_cast<int>(fstride) * k;
-            if (twidx>=Norig) twidx-=Norig;
-            t=scratchbuf[q] * twiddles[twidx];
-            Fout[ k ] += t;
-          }
-          k += m;
+      k = u;
+      for (q1 = 0; q1 < p; ++q1) {
+        int twidx = 0;
+        Fout[k] = scratchbuf[0];
+        for (q = 1; q < p; ++q) {
+          twidx += static_cast<int>(fstride) * k;
+          if (twidx >= Norig) twidx -= Norig;
+          t = scratchbuf[q] * twiddles[twidx];
+          Fout[k] += t;
         }
+        k += m;
       }
     }
+  }
 };
 
 template <typename Scalar_>
-struct kissfft_impl
-{
+struct kissfft_impl {
   typedef Scalar_ Scalar;
   typedef std::complex<Scalar> Complex;
 
-  void clear() 
-  {
+  void clear() {
     m_plans.clear();
     m_realTwiddles.clear();
   }
 
-  inline
-    void fwd( Complex * dst,const Complex *src,int nfft)
-    {
-      get_plan(nfft,false).work(0, dst, src, 1,1);
-    }
+  inline void fwd(Complex *dst, const Complex *src, int nfft) { get_plan(nfft, false).work(0, dst, src, 1, 1); }
 
-  inline
-    void fwd2( Complex * dst,const Complex *src,int n0,int n1)
-    {
-        EIGEN_UNUSED_VARIABLE(dst);
-        EIGEN_UNUSED_VARIABLE(src);
-        EIGEN_UNUSED_VARIABLE(n0);
-        EIGEN_UNUSED_VARIABLE(n1);
-    }
+  inline void fwd2(Complex *dst, const Complex *src, int n0, int n1) {
+    EIGEN_UNUSED_VARIABLE(dst);
+    EIGEN_UNUSED_VARIABLE(src);
+    EIGEN_UNUSED_VARIABLE(n0);
+    EIGEN_UNUSED_VARIABLE(n1);
+  }
 
-  inline
-    void inv2( Complex * dst,const Complex *src,int n0,int n1)
-    {
-        EIGEN_UNUSED_VARIABLE(dst);
-        EIGEN_UNUSED_VARIABLE(src);
-        EIGEN_UNUSED_VARIABLE(n0);
-        EIGEN_UNUSED_VARIABLE(n1);
-    }
+  inline void inv2(Complex *dst, const Complex *src, int n0, int n1) {
+    EIGEN_UNUSED_VARIABLE(dst);
+    EIGEN_UNUSED_VARIABLE(src);
+    EIGEN_UNUSED_VARIABLE(n0);
+    EIGEN_UNUSED_VARIABLE(n1);
+  }
 
   // real-to-complex forward FFT
   // perform two FFTs of src even and src odd
   // then twiddle to recombine them into the half-spectrum format
   // then fill in the conjugate symmetric half
-  inline
-    void fwd( Complex * dst,const Scalar * src,int nfft) 
-    {
-      if ( nfft&3  ) {
-        // use generic mode for odd
-        m_tmpBuf1.resize(nfft);
-        get_plan(nfft,false).work(0, &m_tmpBuf1[0], src, 1,1);
-        std::copy(m_tmpBuf1.begin(),m_tmpBuf1.begin()+(nfft>>1)+1,dst );
-      }else{
-        int ncfft = nfft>>1;
-        int ncfft2 = nfft>>2;
-        Complex * rtw = real_twiddles(ncfft2);
+  inline void fwd(Complex *dst, const Scalar *src, int nfft) {
+    if (nfft & 3) {
+      // use generic mode for odd
+      m_tmpBuf1.resize(nfft);
+      get_plan(nfft, false).work(0, &m_tmpBuf1[0], src, 1, 1);
+      std::copy(m_tmpBuf1.begin(), m_tmpBuf1.begin() + (nfft >> 1) + 1, dst);
+    } else {
+      int ncfft = nfft >> 1;
+      int ncfft2 = nfft >> 2;
+      Complex *rtw = real_twiddles(ncfft2);
 
-        // use optimized mode for even real
-        fwd( dst, reinterpret_cast<const Complex*> (src), ncfft);
-        Complex dc(dst[0].real() +  dst[0].imag());
-        Complex nyquist(dst[0].real() -  dst[0].imag());
-        int k;
-        for ( k=1;k <= ncfft2 ; ++k ) {
-          Complex fpk = dst[k];
-          Complex fpnk = conj(dst[ncfft-k]);
-          Complex f1k = fpk + fpnk;
-          Complex f2k = fpk - fpnk;
-          Complex tw= f2k * rtw[k-1];
-          dst[k] =  (f1k + tw) * Scalar(.5);
-          dst[ncfft-k] =  conj(f1k -tw)*Scalar(.5);
-        }
-        dst[0] = dc;
-        dst[ncfft] = nyquist;
+      // use optimized mode for even real
+      fwd(dst, reinterpret_cast<const Complex *>(src), ncfft);
+      Complex dc(dst[0].real() + dst[0].imag());
+      Complex nyquist(dst[0].real() - dst[0].imag());
+      int k;
+      for (k = 1; k <= ncfft2; ++k) {
+        Complex fpk = dst[k];
+        Complex fpnk = conj(dst[ncfft - k]);
+        Complex f1k = fpk + fpnk;
+        Complex f2k = fpk - fpnk;
+        Complex tw = f2k * rtw[k - 1];
+        dst[k] = (f1k + tw) * Scalar(.5);
+        dst[ncfft - k] = conj(f1k - tw) * Scalar(.5);
       }
+      dst[0] = dc;
+      dst[ncfft] = nyquist;
     }
+  }
 
   // inverse complex-to-complex
-  inline
-    void inv(Complex * dst,const Complex  *src,int nfft)
-    {
-      get_plan(nfft,true).work(0, dst, src, 1,1);
-    }
+  inline void inv(Complex *dst, const Complex *src, int nfft) { get_plan(nfft, true).work(0, dst, src, 1, 1); }
 
   // half-complex to scalar
-  inline
-    void inv( Scalar * dst,const Complex * src,int nfft) 
-    {
-      if (nfft&3) {
-        m_tmpBuf1.resize(nfft);
-        m_tmpBuf2.resize(nfft);
-        std::copy(src,src+(nfft>>1)+1,m_tmpBuf1.begin() );
-        for (int k=1;k<(nfft>>1)+1;++k)
-          m_tmpBuf1[nfft-k] = conj(m_tmpBuf1[k]);
-        inv(&m_tmpBuf2[0],&m_tmpBuf1[0],nfft);
-        for (int k=0;k<nfft;++k)
-          dst[k] = m_tmpBuf2[k].real();
-      }else{
-        // optimized version for multiple of 4
-        int ncfft = nfft>>1;
-        int ncfft2 = nfft>>2;
-        Complex * rtw = real_twiddles(ncfft2);
-        m_tmpBuf1.resize(ncfft);
-        m_tmpBuf1[0] = Complex( src[0].real() + src[ncfft].real(), src[0].real() - src[ncfft].real() );
-        for (int k = 1; k <= ncfft / 2; ++k) {
-          Complex fk = src[k];
-          Complex fnkc = conj(src[ncfft-k]);
-          Complex fek = fk + fnkc;
-          Complex tmp = fk - fnkc;
-          Complex fok = tmp * conj(rtw[k-1]);
-          m_tmpBuf1[k] = fek + fok;
-          m_tmpBuf1[ncfft-k] = conj(fek - fok);
-        }
-        get_plan(ncfft,true).work(0, reinterpret_cast<Complex*>(dst), &m_tmpBuf1[0], 1,1);
+  inline void inv(Scalar *dst, const Complex *src, int nfft) {
+    if (nfft & 3) {
+      m_tmpBuf1.resize(nfft);
+      m_tmpBuf2.resize(nfft);
+      std::copy(src, src + (nfft >> 1) + 1, m_tmpBuf1.begin());
+      for (int k = 1; k < (nfft >> 1) + 1; ++k) m_tmpBuf1[nfft - k] = conj(m_tmpBuf1[k]);
+      inv(&m_tmpBuf2[0], &m_tmpBuf1[0], nfft);
+      for (int k = 0; k < nfft; ++k) dst[k] = m_tmpBuf2[k].real();
+    } else {
+      // optimized version for multiple of 4
+      int ncfft = nfft >> 1;
+      int ncfft2 = nfft >> 2;
+      Complex *rtw = real_twiddles(ncfft2);
+      m_tmpBuf1.resize(ncfft);
+      m_tmpBuf1[0] = Complex(src[0].real() + src[ncfft].real(), src[0].real() - src[ncfft].real());
+      for (int k = 1; k <= ncfft / 2; ++k) {
+        Complex fk = src[k];
+        Complex fnkc = conj(src[ncfft - k]);
+        Complex fek = fk + fnkc;
+        Complex tmp = fk - fnkc;
+        Complex fok = tmp * conj(rtw[k - 1]);
+        m_tmpBuf1[k] = fek + fok;
+        m_tmpBuf1[ncfft - k] = conj(fek - fok);
       }
+      get_plan(ncfft, true).work(0, reinterpret_cast<Complex *>(dst), &m_tmpBuf1[0], 1, 1);
     }
+  }
 
-  protected:
+ protected:
   typedef kiss_cpx_fft<Scalar> PlanData;
-  typedef std::map<int,PlanData> PlanMap;
+  typedef std::map<int, PlanData> PlanMap;
 
   PlanMap m_plans;
   std::map<int, std::vector<Complex> > m_realTwiddles;
   std::vector<Complex> m_tmpBuf1;
   std::vector<Complex> m_tmpBuf2;
 
-  inline
-    int PlanKey(int nfft, bool isinverse) const { return (nfft<<1) | int(isinverse); }
+  inline int PlanKey(int nfft, bool isinverse) const { return (nfft << 1) | int(isinverse); }
 
-  inline
-    PlanData & get_plan(int nfft, bool inverse)
-    {
-      // TODO look for PlanKey(nfft, ! inverse) and conjugate the twiddles
-      PlanData & pd = m_plans[ PlanKey(nfft,inverse) ];
-      if ( pd.m_twiddles.size() == 0 ) {
-        pd.make_twiddles(nfft,inverse);
-        pd.factorize(nfft);
-      }
-      return pd;
+  inline PlanData &get_plan(int nfft, bool inverse) {
+    // TODO look for PlanKey(nfft, ! inverse) and conjugate the twiddles
+    PlanData &pd = m_plans[PlanKey(nfft, inverse)];
+    if (pd.m_twiddles.size() == 0) {
+      pd.make_twiddles(nfft, inverse);
+      pd.factorize(nfft);
     }
+    return pd;
+  }
 
-  inline
-    Complex * real_twiddles(int ncfft2)
-    {
-      using std::acos;
-      std::vector<Complex> & twidref = m_realTwiddles[ncfft2];// creates new if not there
-      if ( (int)twidref.size() != ncfft2 ) {
-        twidref.resize(ncfft2);
-        int ncfft= ncfft2<<1;
-        Scalar pi =  acos( Scalar(-1) );
-        for (int k=1;k<=ncfft2;++k) 
-          twidref[k-1] = exp( Complex(0,-pi * (Scalar(k) / ncfft + Scalar(.5)) ) );
-      }
-      return &twidref[0];
+  inline Complex *real_twiddles(int ncfft2) {
+    using std::acos;
+    std::vector<Complex> &twidref = m_realTwiddles[ncfft2];  // creates new if not there
+    if ((int)twidref.size() != ncfft2) {
+      twidref.resize(ncfft2);
+      int ncfft = ncfft2 << 1;
+      Scalar pi = acos(Scalar(-1));
+      for (int k = 1; k <= ncfft2; ++k) twidref[k - 1] = exp(Complex(0, -pi * (Scalar(k) / ncfft + Scalar(.5))));
     }
+    return &twidref[0];
+  }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
diff --git a/unsupported/Eigen/src/FFT/ei_pocketfft_impl.h b/unsupported/Eigen/src/FFT/ei_pocketfft_impl.h
index f2da890..918ceb0 100644
--- a/unsupported/Eigen/src/FFT/ei_pocketfft_impl.h
+++ b/unsupported/Eigen/src/FFT/ei_pocketfft_impl.h
@@ -1,5 +1,5 @@
 // This file is part of Eigen, a lightweight C++ template library
-// for linear algebra. 
+// 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
@@ -12,58 +12,57 @@
 
 namespace internal {
 
-template<typename _Scalar>
-struct pocketfft_impl
-{
+template <typename _Scalar>
+struct pocketfft_impl {
   typedef _Scalar Scalar;
   typedef std::complex<Scalar> Complex;
 
   inline void clear() {}
 
-  inline void fwd(Complex* dst, const Scalar* src, int nfft){
-    const shape_t  shape_{ static_cast<size_t>(nfft) };
-    const shape_t  axes_{ 0 };
-    const stride_t stride_in{ sizeof(Scalar) };
-    const stride_t stride_out{ sizeof(Complex) };
+  inline void fwd(Complex* dst, const Scalar* src, int nfft) {
+    const shape_t shape_{static_cast<size_t>(nfft)};
+    const shape_t axes_{0};
+    const stride_t stride_in{sizeof(Scalar)};
+    const stride_t stride_out{sizeof(Complex)};
     r2c(shape_, stride_in, stride_out, axes_, FORWARD, src, dst, static_cast<Scalar>(1));
   }
 
-  inline void fwd(Complex* dst, const Complex* src, int nfft){
-    const shape_t  shape_{ static_cast<size_t>(nfft) };
-    const shape_t  axes_{ 0 };
-    const stride_t stride_{ sizeof(Complex) };
+  inline void fwd(Complex* dst, const Complex* src, int nfft) {
+    const shape_t shape_{static_cast<size_t>(nfft)};
+    const shape_t axes_{0};
+    const stride_t stride_{sizeof(Complex)};
     c2c(shape_, stride_, stride_, axes_, FORWARD, src, dst, static_cast<Scalar>(1));
   }
 
-  inline void inv(Scalar* dst,  const Complex* src, int nfft){
-    const shape_t  shape_{ static_cast<size_t>(nfft) };
-    const shape_t  axes_{ 0 };
-    const stride_t stride_in{ sizeof(Complex) };
-    const stride_t stride_out{ sizeof(Scalar) };
+  inline void inv(Scalar* dst, const Complex* src, int nfft) {
+    const shape_t shape_{static_cast<size_t>(nfft)};
+    const shape_t axes_{0};
+    const stride_t stride_in{sizeof(Complex)};
+    const stride_t stride_out{sizeof(Scalar)};
     c2r(shape_, stride_in, stride_out, axes_, BACKWARD, src, dst, static_cast<Scalar>(1));
-  }  
+  }
 
-  inline void inv(Complex* dst, const Complex* src, int nfft){
-    const shape_t  shape_{ static_cast<size_t>(nfft) };
-    const shape_t  axes_{ 0 };
-    const stride_t stride_{ sizeof(Complex) };
+  inline void inv(Complex* dst, const Complex* src, int nfft) {
+    const shape_t shape_{static_cast<size_t>(nfft)};
+    const shape_t axes_{0};
+    const stride_t stride_{sizeof(Complex)};
     c2c(shape_, stride_, stride_, axes_, BACKWARD, src, dst, static_cast<Scalar>(1));
   }
 
-  inline void fwd2(Complex* dst, const Complex* src, int nfft0, int nfft1){
-    const shape_t  shape_{ static_cast<size_t>(nfft0), static_cast<size_t>(nfft1) };
-    const shape_t  axes_{ 0, 1 };
-    const stride_t stride_{ static_cast<ptrdiff_t>(sizeof(Complex)*nfft1), static_cast<ptrdiff_t>(sizeof(Complex)) };
+  inline void fwd2(Complex* dst, const Complex* src, int nfft0, int nfft1) {
+    const shape_t shape_{static_cast<size_t>(nfft0), static_cast<size_t>(nfft1)};
+    const shape_t axes_{0, 1};
+    const stride_t stride_{static_cast<ptrdiff_t>(sizeof(Complex) * nfft1), static_cast<ptrdiff_t>(sizeof(Complex))};
     c2c(shape_, stride_, stride_, axes_, FORWARD, src, dst, static_cast<Scalar>(1));
   }
 
-  inline void inv2(Complex* dst, const Complex* src, int nfft0, int nfft1){
-    const shape_t  shape_{ static_cast<size_t>(nfft0), static_cast<size_t>(nfft1) };
-    const shape_t  axes_{ 0, 1 };
-    const stride_t stride_{ static_cast<ptrdiff_t>(sizeof(Complex)*nfft1), static_cast<ptrdiff_t>(sizeof(Complex)) };
+  inline void inv2(Complex* dst, const Complex* src, int nfft0, int nfft1) {
+    const shape_t shape_{static_cast<size_t>(nfft0), static_cast<size_t>(nfft1)};
+    const shape_t axes_{0, 1};
+    const stride_t stride_{static_cast<ptrdiff_t>(sizeof(Complex) * nfft1), static_cast<ptrdiff_t>(sizeof(Complex))};
     c2c(shape_, stride_, stride_, axes_, BACKWARD, src, dst, static_cast<Scalar>(1));
   }
 };
 
-} // namespace internal
-} // namespace Eigen
+}  // namespace internal
+}  // namespace Eigen
diff --git a/unsupported/Eigen/src/IterativeSolvers/DGMRES.h b/unsupported/Eigen/src/IterativeSolvers/DGMRES.h
index 17af7b9..182bd2e 100644
--- a/unsupported/Eigen/src/IterativeSolvers/DGMRES.h
+++ b/unsupported/Eigen/src/IterativeSolvers/DGMRES.h
@@ -15,68 +15,62 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
-  
-template< typename MatrixType_,
-          typename Preconditioner_ = DiagonalPreconditioner<typename MatrixType_::Scalar> >
+namespace Eigen {
+
+template <typename MatrixType_, typename Preconditioner_ = DiagonalPreconditioner<typename MatrixType_::Scalar> >
 class DGMRES;
 
 namespace internal {
 
-template< typename MatrixType_, typename Preconditioner_>
-struct traits<DGMRES<MatrixType_,Preconditioner_> >
-{
+template <typename MatrixType_, typename Preconditioner_>
+struct traits<DGMRES<MatrixType_, Preconditioner_> > {
   typedef MatrixType_ MatrixType;
   typedef Preconditioner_ Preconditioner;
 };
 
 /** \brief Computes a permutation vector to have a sorted sequence
-  * \param vec The vector to reorder.
-  * \param perm gives the sorted sequence on output. Must be initialized with 0..n-1
-  * \param ncut Put  the ncut smallest elements at the end of the vector
-  * WARNING This is an expensive sort, so should be used only 
-  * for small size vectors
-  * TODO Use modified QuickSplit or std::nth_element to get the smallest values 
-  */
+ * \param vec The vector to reorder.
+ * \param perm gives the sorted sequence on output. Must be initialized with 0..n-1
+ * \param ncut Put  the ncut smallest elements at the end of the vector
+ * WARNING This is an expensive sort, so should be used only
+ * for small size vectors
+ * TODO Use modified QuickSplit or std::nth_element to get the smallest values
+ */
 template <typename VectorType, typename IndexType>
-void sortWithPermutation (VectorType& vec, IndexType& perm, typename IndexType::Scalar& ncut)
-{
+void sortWithPermutation(VectorType& vec, IndexType& perm, typename IndexType::Scalar& ncut) {
   eigen_assert(vec.size() == perm.size());
-  bool flag; 
-  for (Index k  = 0; k < ncut; k++)
-  {
+  bool flag;
+  for (Index k = 0; k < ncut; k++) {
     flag = false;
-    for (Index j = 0; j < vec.size()-1; j++)
-    {
-      if ( vec(perm(j)) < vec(perm(j+1)) )
-      {
-        std::swap(perm(j),perm(j+1)); 
+    for (Index j = 0; j < vec.size() - 1; j++) {
+      if (vec(perm(j)) < vec(perm(j + 1))) {
+        std::swap(perm(j), perm(j + 1));
         flag = true;
       }
-      if (!flag) break; // The vector is in sorted order
+      if (!flag) break;  // The vector is in sorted order
     }
   }
 }
 
-}
+}  // namespace internal
 /**
  * \ingroup IterativeLinearSolvers_Module
  * \brief A Restarted GMRES with deflation.
  * This class implements a modification of the GMRES solver for
- * sparse linear systems. The basis is built with modified 
+ * sparse linear systems. The basis is built with modified
  * Gram-Schmidt. At each restart, a few approximated eigenvectors
  * corresponding to the smallest eigenvalues are used to build a
- * preconditioner for the next cycle. This preconditioner 
- * for deflation can be combined with any other preconditioner, 
- * the IncompleteLUT for instance. The preconditioner is applied 
+ * preconditioner for the next cycle. This preconditioner
+ * for deflation can be combined with any other preconditioner,
+ * the IncompleteLUT for instance. The preconditioner is applied
  * at right of the matrix and the combination is multiplicative.
- * 
+ *
  * \tparam MatrixType_ the type of the sparse matrix A, can be a dense or a sparse matrix.
  * \tparam Preconditioner_ the type of the preconditioner. Default is DiagonalPreconditioner
  * Typical usage :
  * \code
  * SparseMatrix<double> A;
- * VectorXd x, b; 
+ * VectorXd x, b;
  * //Fill A and b ...
  * DGMRES<SparseMatrix<double> > solver;
  * solver.set_restart(30); // Set restarting value
@@ -84,195 +78,198 @@
  * solver.compute(A);
  * x = solver.solve(b);
  * \endcode
- * 
+ *
  * DGMRES can also be used in a matrix-free context, see the following \link MatrixfreeSolverExample example \endlink.
  *
  * References :
  * [1] D. NUENTSA WAKAM and F. PACULL, Memory Efficient Hybrid
  *  Algebraic Solvers for Linear Systems Arising from Compressible
  *  Flows, Computers and Fluids, In Press,
- *  https://doi.org/10.1016/j.compfluid.2012.03.023   
- * [2] K. Burrage and J. Erhel, On the performance of various 
+ *  https://doi.org/10.1016/j.compfluid.2012.03.023
+ * [2] K. Burrage and J. Erhel, On the performance of various
  * adaptive preconditioned GMRES strategies, 5(1998), 101-121.
- * [3] J. Erhel, K. Burrage and B. Pohl, Restarted GMRES 
+ * [3] J. Erhel, K. Burrage and B. Pohl, Restarted GMRES
  *  preconditioned by deflation,J. Computational and Applied
- *  Mathematics, 69(1996), 303-318. 
+ *  Mathematics, 69(1996), 303-318.
 
- * 
+ *
  */
-template< typename MatrixType_, typename Preconditioner_>
-class DGMRES : public IterativeSolverBase<DGMRES<MatrixType_,Preconditioner_> >
-{
-    typedef IterativeSolverBase<DGMRES> Base;
-    using Base::matrix;
-    using Base::m_error;
-    using Base::m_iterations;
-    using Base::m_info;
-    using Base::m_isInitialized;
-    using Base::m_tolerance; 
-  public:
-    using Base::_solve_impl;
-    using Base::_solve_with_guess_impl;
-    typedef MatrixType_ MatrixType;
-    typedef typename MatrixType::Scalar Scalar;
-    typedef typename MatrixType::StorageIndex StorageIndex;
-    typedef typename MatrixType::RealScalar RealScalar;
-    typedef Preconditioner_ Preconditioner;
-    typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix; 
-    typedef Matrix<RealScalar,Dynamic,Dynamic> DenseRealMatrix; 
-    typedef Matrix<Scalar,Dynamic,1> DenseVector;
-    typedef Matrix<RealScalar,Dynamic,1> DenseRealVector; 
-    typedef Matrix<std::complex<RealScalar>, Dynamic, 1> ComplexVector;
- 
-    
+template <typename MatrixType_, typename Preconditioner_>
+class DGMRES : public IterativeSolverBase<DGMRES<MatrixType_, Preconditioner_> > {
+  typedef IterativeSolverBase<DGMRES> Base;
+  using Base::m_error;
+  using Base::m_info;
+  using Base::m_isInitialized;
+  using Base::m_iterations;
+  using Base::m_tolerance;
+  using Base::matrix;
+
+ public:
+  using Base::_solve_impl;
+  using Base::_solve_with_guess_impl;
+  typedef MatrixType_ MatrixType;
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::StorageIndex StorageIndex;
+  typedef typename MatrixType::RealScalar RealScalar;
+  typedef Preconditioner_ Preconditioner;
+  typedef Matrix<Scalar, Dynamic, Dynamic> DenseMatrix;
+  typedef Matrix<RealScalar, Dynamic, Dynamic> DenseRealMatrix;
+  typedef Matrix<Scalar, Dynamic, 1> DenseVector;
+  typedef Matrix<RealScalar, Dynamic, 1> DenseRealVector;
+  typedef Matrix<std::complex<RealScalar>, Dynamic, 1> ComplexVector;
+
   /** Default constructor. */
-  DGMRES() : Base(),m_restart(30),m_neig(0),m_r(0),m_maxNeig(5),m_isDeflAllocated(false),m_isDeflInitialized(false) {}
+  DGMRES()
+      : Base(), m_restart(30), m_neig(0), m_r(0), m_maxNeig(5), m_isDeflAllocated(false), m_isDeflInitialized(false) {}
 
   /** Initialize the solver with matrix \a A for further \c Ax=b solving.
-    * 
-    * This constructor is a shortcut for the default constructor followed
-    * by a call to compute().
-    * 
-    * \warning this class stores a reference to the matrix A as well as some
-    * precomputed values that depend on it. Therefore, if \a A is changed
-    * this class becomes invalid. Call compute() to update it with the new
-    * matrix A, or modify a copy of A.
-    */
-  template<typename MatrixDerived>
-  explicit DGMRES(const EigenBase<MatrixDerived>& A) : Base(A.derived()), m_restart(30),m_neig(0),m_r(0),m_maxNeig(5),m_isDeflAllocated(false),m_isDeflInitialized(false) {}
+   *
+   * This constructor is a shortcut for the default constructor followed
+   * by a call to compute().
+   *
+   * \warning this class stores a reference to the matrix A as well as some
+   * precomputed values that depend on it. Therefore, if \a A is changed
+   * this class becomes invalid. Call compute() to update it with the new
+   * matrix A, or modify a copy of A.
+   */
+  template <typename MatrixDerived>
+  explicit DGMRES(const EigenBase<MatrixDerived>& A)
+      : Base(A.derived()),
+        m_restart(30),
+        m_neig(0),
+        m_r(0),
+        m_maxNeig(5),
+        m_isDeflAllocated(false),
+        m_isDeflInitialized(false) {}
 
   ~DGMRES() {}
-  
+
   /** \internal */
-  template<typename Rhs,typename Dest>
-  void _solve_vector_with_guess_impl(const Rhs& b, Dest& x) const
-  {
-    EIGEN_STATIC_ASSERT(Rhs::ColsAtCompileTime==1 || Dest::ColsAtCompileTime==1, YOU_TRIED_CALLING_A_VECTOR_METHOD_ON_A_MATRIX);
-    
+  template <typename Rhs, typename Dest>
+  void _solve_vector_with_guess_impl(const Rhs& b, Dest& x) const {
+    EIGEN_STATIC_ASSERT(Rhs::ColsAtCompileTime == 1 || Dest::ColsAtCompileTime == 1,
+                        YOU_TRIED_CALLING_A_VECTOR_METHOD_ON_A_MATRIX);
+
     m_iterations = Base::maxIterations();
     m_error = Base::m_tolerance;
-    
+
     dgmres(matrix(), b, x, Base::m_preconditioner);
   }
 
-  /** 
+  /**
    * Get the restart value
-    */
+   */
   Index restart() { return m_restart; }
-  
-  /** 
-   * Set the restart value (default is 30)  
+
+  /**
+   * Set the restart value (default is 30)
    */
-  void set_restart(const Index restart) { m_restart=restart; }
-  
-  /** 
-   * Set the number of eigenvalues to deflate at each restart 
+  void set_restart(const Index restart) { m_restart = restart; }
+
+  /**
+   * Set the number of eigenvalues to deflate at each restart
    */
-  void setEigenv(const Index neig) 
-  {
+  void setEigenv(const Index neig) {
     m_neig = neig;
-    if (neig+1 > m_maxNeig) m_maxNeig = neig+1; // To allow for complex conjugates
+    if (neig + 1 > m_maxNeig) m_maxNeig = neig + 1;  // To allow for complex conjugates
   }
-  
-  /** 
+
+  /**
    * Get the size of the deflation subspace size
-   */ 
-  Index deflSize() {return m_r; }
-  
+   */
+  Index deflSize() { return m_r; }
+
   /**
    * Set the maximum size of the deflation subspace
    */
   void setMaxEigenv(const Index maxNeig) { m_maxNeig = maxNeig; }
-  
-  protected:
-    // DGMRES algorithm 
-    template<typename Rhs, typename Dest>
-    void dgmres(const MatrixType& mat,const Rhs& rhs, Dest& x, const Preconditioner& precond) const;
-    // Perform one cycle of GMRES
-    template<typename Dest>
-    Index dgmresCycle(const MatrixType& mat, const Preconditioner& precond, Dest& x, DenseVector& r0, RealScalar& beta, const RealScalar& normRhs, Index& nbIts) const; 
-    // Compute data to use for deflation 
-    Index dgmresComputeDeflationData(const MatrixType& mat, const Preconditioner& precond, const Index& it, StorageIndex& neig) const;
-    // Apply deflation to a vector
-    template<typename RhsType, typename DestType>
-    Index dgmresApplyDeflation(const RhsType& In, DestType& Out) const; 
-    ComplexVector schurValues(const ComplexSchur<DenseMatrix>& schurofH) const;
-    ComplexVector schurValues(const RealSchur<DenseMatrix>& schurofH) const;
-    // Init data for deflation
-    void dgmresInitDeflation(Index& rows) const; 
-    mutable DenseMatrix m_V; // Krylov basis vectors
-    mutable DenseMatrix m_H; // Hessenberg matrix 
-    mutable DenseMatrix m_Hes; // Initial hessenberg matrix without Givens rotations applied
-    mutable Index m_restart; // Maximum size of the Krylov subspace
-    mutable DenseMatrix m_U; // Vectors that form the basis of the invariant subspace 
-    mutable DenseMatrix m_MU; // matrix operator applied to m_U (for next cycles)
-    mutable DenseMatrix m_T; /* T=U^T*M^{-1}*A*U */
-    mutable PartialPivLU<DenseMatrix> m_luT; // LU factorization of m_T
-    mutable StorageIndex m_neig; //Number of eigenvalues to extract at each restart
-    mutable Index m_r; // Current number of deflated eigenvalues, size of m_U
-    mutable Index m_maxNeig; // Maximum number of eigenvalues to deflate
-    mutable RealScalar m_lambdaN; //Modulus of the largest eigenvalue of A
-    mutable bool m_isDeflAllocated;
-    mutable bool m_isDeflInitialized;
-    
-    //Adaptive strategy 
-    mutable RealScalar m_smv; // Smaller multiple of the remaining number of steps allowed
-    mutable bool m_force; // Force the use of deflation at each restart
-    
-}; 
-/** 
- * \brief Perform several cycles of restarted GMRES with modified Gram Schmidt, 
- * 
+
+ protected:
+  // DGMRES algorithm
+  template <typename Rhs, typename Dest>
+  void dgmres(const MatrixType& mat, const Rhs& rhs, Dest& x, const Preconditioner& precond) const;
+  // Perform one cycle of GMRES
+  template <typename Dest>
+  Index dgmresCycle(const MatrixType& mat, const Preconditioner& precond, Dest& x, DenseVector& r0, RealScalar& beta,
+                    const RealScalar& normRhs, Index& nbIts) const;
+  // Compute data to use for deflation
+  Index dgmresComputeDeflationData(const MatrixType& mat, const Preconditioner& precond, const Index& it,
+                                   StorageIndex& neig) const;
+  // Apply deflation to a vector
+  template <typename RhsType, typename DestType>
+  Index dgmresApplyDeflation(const RhsType& In, DestType& Out) const;
+  ComplexVector schurValues(const ComplexSchur<DenseMatrix>& schurofH) const;
+  ComplexVector schurValues(const RealSchur<DenseMatrix>& schurofH) const;
+  // Init data for deflation
+  void dgmresInitDeflation(Index& rows) const;
+  mutable DenseMatrix m_V;                  // Krylov basis vectors
+  mutable DenseMatrix m_H;                  // Hessenberg matrix
+  mutable DenseMatrix m_Hes;                // Initial hessenberg matrix without Givens rotations applied
+  mutable Index m_restart;                  // Maximum size of the Krylov subspace
+  mutable DenseMatrix m_U;                  // Vectors that form the basis of the invariant subspace
+  mutable DenseMatrix m_MU;                 // matrix operator applied to m_U (for next cycles)
+  mutable DenseMatrix m_T;                  /* T=U^T*M^{-1}*A*U */
+  mutable PartialPivLU<DenseMatrix> m_luT;  // LU factorization of m_T
+  mutable StorageIndex m_neig;              // Number of eigenvalues to extract at each restart
+  mutable Index m_r;                        // Current number of deflated eigenvalues, size of m_U
+  mutable Index m_maxNeig;                  // Maximum number of eigenvalues to deflate
+  mutable RealScalar m_lambdaN;             // Modulus of the largest eigenvalue of A
+  mutable bool m_isDeflAllocated;
+  mutable bool m_isDeflInitialized;
+
+  // Adaptive strategy
+  mutable RealScalar m_smv;  // Smaller multiple of the remaining number of steps allowed
+  mutable bool m_force;      // Force the use of deflation at each restart
+};
+/**
+ * \brief Perform several cycles of restarted GMRES with modified Gram Schmidt,
+ *
  * A right preconditioner is used combined with deflation.
- * 
+ *
  */
-template< typename MatrixType_, typename Preconditioner_>
-template<typename Rhs, typename Dest>
-void DGMRES<MatrixType_, Preconditioner_>::dgmres(const MatrixType& mat,const Rhs& rhs, Dest& x,
-              const Preconditioner& precond) const
-{
+template <typename MatrixType_, typename Preconditioner_>
+template <typename Rhs, typename Dest>
+void DGMRES<MatrixType_, Preconditioner_>::dgmres(const MatrixType& mat, const Rhs& rhs, Dest& x,
+                                                  const Preconditioner& precond) const {
   const RealScalar considerAsZero = (std::numeric_limits<RealScalar>::min)();
 
   RealScalar normRhs = rhs.norm();
-  if(normRhs <= considerAsZero) 
-  {
+  if (normRhs <= considerAsZero) {
     x.setZero();
     m_error = 0;
     return;
   }
 
-  //Initialization
+  // Initialization
   m_isDeflInitialized = false;
-  Index n = mat.rows(); 
-  DenseVector r0(n); 
-  Index nbIts = 0; 
-  m_H.resize(m_restart+1, m_restart);
+  Index n = mat.rows();
+  DenseVector r0(n);
+  Index nbIts = 0;
+  m_H.resize(m_restart + 1, m_restart);
   m_Hes.resize(m_restart, m_restart);
-  m_V.resize(n,m_restart+1);
-  //Initial residual vector and initial norm
-  if(x.squaredNorm()==0) 
-    x = precond.solve(rhs);
-  r0 = rhs - mat * x; 
-  RealScalar beta = r0.norm(); 
-  
-  m_error = beta/normRhs; 
-  if(m_error < m_tolerance)
-    m_info = Success; 
+  m_V.resize(n, m_restart + 1);
+  // Initial residual vector and initial norm
+  if (x.squaredNorm() == 0) x = precond.solve(rhs);
+  r0 = rhs - mat * x;
+  RealScalar beta = r0.norm();
+
+  m_error = beta / normRhs;
+  if (m_error < m_tolerance)
+    m_info = Success;
   else
     m_info = NoConvergence;
-  
+
   // Iterative process
-  while (nbIts < m_iterations && m_info == NoConvergence)
-  {
-    dgmresCycle(mat, precond, x, r0, beta, normRhs, nbIts); 
-    
-    // Compute the new residual vector for the restart 
+  while (nbIts < m_iterations && m_info == NoConvergence) {
+    dgmresCycle(mat, precond, x, r0, beta, normRhs, nbIts);
+
+    // Compute the new residual vector for the restart
     if (nbIts < m_iterations && m_info == NoConvergence) {
       r0 = rhs - mat * x;
       beta = r0.norm();
     }
   }
-} 
+}
 
 /**
  * \brief Perform one restart cycle of DGMRES
@@ -284,231 +281,211 @@
  * \param normRhs The norm of the right hand side vector
  * \param nbIts The number of iterations
  */
-template< typename MatrixType_, typename Preconditioner_>
-template<typename Dest>
-Index DGMRES<MatrixType_, Preconditioner_>::dgmresCycle(const MatrixType& mat, const Preconditioner& precond, Dest& x, DenseVector& r0, RealScalar& beta, const RealScalar& normRhs, Index& nbIts) const
-{
-  //Initialization 
-  DenseVector g(m_restart+1); // Right hand side of the least square problem
-  g.setZero();  
-  g(0) = Scalar(beta); 
-  m_V.col(0) = r0/beta; 
-  m_info = NoConvergence; 
-  std::vector<JacobiRotation<Scalar> >gr(m_restart); // Givens rotations
-  Index it = 0; // Number of inner iterations 
+template <typename MatrixType_, typename Preconditioner_>
+template <typename Dest>
+Index DGMRES<MatrixType_, Preconditioner_>::dgmresCycle(const MatrixType& mat, const Preconditioner& precond, Dest& x,
+                                                        DenseVector& r0, RealScalar& beta, const RealScalar& normRhs,
+                                                        Index& nbIts) const {
+  // Initialization
+  DenseVector g(m_restart + 1);  // Right hand side of the least square problem
+  g.setZero();
+  g(0) = Scalar(beta);
+  m_V.col(0) = r0 / beta;
+  m_info = NoConvergence;
+  std::vector<JacobiRotation<Scalar> > gr(m_restart);  // Givens rotations
+  Index it = 0;                                        // Number of inner iterations
   Index n = mat.rows();
-  DenseVector tv1(n), tv2(n);  //Temporary vectors
-  while (m_info == NoConvergence && it < m_restart && nbIts < m_iterations)
-  {    
+  DenseVector tv1(n), tv2(n);  // Temporary vectors
+  while (m_info == NoConvergence && it < m_restart && nbIts < m_iterations) {
     // Apply preconditioner(s) at right
-    if (m_isDeflInitialized )
-    {
-      dgmresApplyDeflation(m_V.col(it), tv1); // Deflation
-      tv2 = precond.solve(tv1); 
+    if (m_isDeflInitialized) {
+      dgmresApplyDeflation(m_V.col(it), tv1);  // Deflation
+      tv2 = precond.solve(tv1);
+    } else {
+      tv2 = precond.solve(m_V.col(it));  // User's selected preconditioner
     }
-    else
-    {
-      tv2 = precond.solve(m_V.col(it)); // User's selected preconditioner
-    }
-    tv1 = mat * tv2; 
-   
+    tv1 = mat * tv2;
+
     // Orthogonalize it with the previous basis in the basis using modified Gram-Schmidt
-    Scalar coef; 
-    for (Index i = 0; i <= it; ++i)
-    { 
+    Scalar coef;
+    for (Index i = 0; i <= it; ++i) {
       coef = tv1.dot(m_V.col(i));
-      tv1 = tv1 - coef * m_V.col(i); 
-      m_H(i,it) = coef; 
-      m_Hes(i,it) = coef; 
+      tv1 = tv1 - coef * m_V.col(i);
+      m_H(i, it) = coef;
+      m_Hes(i, it) = coef;
     }
-    // Normalize the vector 
-    coef = tv1.norm(); 
-    m_V.col(it+1) = tv1/coef;
-    m_H(it+1, it) = coef;
-//     m_Hes(it+1,it) = coef; 
-    
-    // FIXME Check for happy breakdown 
-    
+    // Normalize the vector
+    coef = tv1.norm();
+    m_V.col(it + 1) = tv1 / coef;
+    m_H(it + 1, it) = coef;
+    //     m_Hes(it+1,it) = coef;
+
+    // FIXME Check for happy breakdown
+
     // Update Hessenberg matrix with Givens rotations
-    for (Index i = 1; i <= it; ++i) 
-    {
-      m_H.col(it).applyOnTheLeft(i-1,i,gr[i-1].adjoint());
+    for (Index i = 1; i <= it; ++i) {
+      m_H.col(it).applyOnTheLeft(i - 1, i, gr[i - 1].adjoint());
     }
-    // Compute the new plane rotation 
-    gr[it].makeGivens(m_H(it, it), m_H(it+1,it)); 
+    // Compute the new plane rotation
+    gr[it].makeGivens(m_H(it, it), m_H(it + 1, it));
     // Apply the new rotation
-    m_H.col(it).applyOnTheLeft(it,it+1,gr[it].adjoint());
-    g.applyOnTheLeft(it,it+1, gr[it].adjoint()); 
-    
-    beta = std::abs(g(it+1));
-    m_error = beta/normRhs; 
+    m_H.col(it).applyOnTheLeft(it, it + 1, gr[it].adjoint());
+    g.applyOnTheLeft(it, it + 1, gr[it].adjoint());
+
+    beta = std::abs(g(it + 1));
+    m_error = beta / normRhs;
     // std::cerr << nbIts << " Relative Residual Norm " << m_error << std::endl;
-    it++; nbIts++; 
-    
-    if (m_error < m_tolerance)
-    {
+    it++;
+    nbIts++;
+
+    if (m_error < m_tolerance) {
       // The method has converged
       m_info = Success;
       break;
     }
   }
-  
+
   // Compute the new coefficients by solving the least square problem
-//   it++;
-  //FIXME  Check first if the matrix is singular ... zero diagonal
-  DenseVector nrs(m_restart); 
-  nrs = m_H.topLeftCorner(it,it).template triangularView<Upper>().solve(g.head(it)); 
-  
+  //   it++;
+  // FIXME  Check first if the matrix is singular ... zero diagonal
+  DenseVector nrs(m_restart);
+  nrs = m_H.topLeftCorner(it, it).template triangularView<Upper>().solve(g.head(it));
+
   // Form the new solution
-  if (m_isDeflInitialized)
-  {
-    tv1 = m_V.leftCols(it) * nrs; 
-    dgmresApplyDeflation(tv1, tv2); 
+  if (m_isDeflInitialized) {
+    tv1 = m_V.leftCols(it) * nrs;
+    dgmresApplyDeflation(tv1, tv2);
     x = x + precond.solve(tv2);
-  }
-  else
-    x = x + precond.solve(m_V.leftCols(it) * nrs); 
-  
+  } else
+    x = x + precond.solve(m_V.leftCols(it) * nrs);
+
   // Go for a new cycle and compute data for deflation
-  if(nbIts < m_iterations && m_info == NoConvergence && m_neig > 0 && (m_r+m_neig) < m_maxNeig)
-    dgmresComputeDeflationData(mat, precond, it, m_neig); 
-  return 0; 
-  
+  if (nbIts < m_iterations && m_info == NoConvergence && m_neig > 0 && (m_r + m_neig) < m_maxNeig)
+    dgmresComputeDeflationData(mat, precond, it, m_neig);
+  return 0;
 }
 
-
-template< typename MatrixType_, typename Preconditioner_>
-void DGMRES<MatrixType_, Preconditioner_>::dgmresInitDeflation(Index& rows) const
-{
+template <typename MatrixType_, typename Preconditioner_>
+void DGMRES<MatrixType_, Preconditioner_>::dgmresInitDeflation(Index& rows) const {
   m_U.resize(rows, m_maxNeig);
-  m_MU.resize(rows, m_maxNeig); 
+  m_MU.resize(rows, m_maxNeig);
   m_T.resize(m_maxNeig, m_maxNeig);
-  m_lambdaN = 0.0; 
-  m_isDeflAllocated = true; 
+  m_lambdaN = 0.0;
+  m_isDeflAllocated = true;
 }
 
-template< typename MatrixType_, typename Preconditioner_>
-inline typename DGMRES<MatrixType_, Preconditioner_>::ComplexVector DGMRES<MatrixType_, Preconditioner_>::schurValues(const ComplexSchur<DenseMatrix>& schurofH) const
-{
+template <typename MatrixType_, typename Preconditioner_>
+inline typename DGMRES<MatrixType_, Preconditioner_>::ComplexVector DGMRES<MatrixType_, Preconditioner_>::schurValues(
+    const ComplexSchur<DenseMatrix>& schurofH) const {
   return schurofH.matrixT().diagonal();
 }
 
-template< typename MatrixType_, typename Preconditioner_>
-inline typename DGMRES<MatrixType_, Preconditioner_>::ComplexVector DGMRES<MatrixType_, Preconditioner_>::schurValues(const RealSchur<DenseMatrix>& schurofH) const
-{
+template <typename MatrixType_, typename Preconditioner_>
+inline typename DGMRES<MatrixType_, Preconditioner_>::ComplexVector DGMRES<MatrixType_, Preconditioner_>::schurValues(
+    const RealSchur<DenseMatrix>& schurofH) const {
   const DenseMatrix& T = schurofH.matrixT();
   Index it = T.rows();
   ComplexVector eig(it);
   Index j = 0;
-  while (j < it-1)
-  {
-    if (T(j+1,j) ==Scalar(0))
-    {
-      eig(j) = std::complex<RealScalar>(T(j,j),RealScalar(0)); 
-      j++; 
-    }
-    else
-    {
-      eig(j) = std::complex<RealScalar>(T(j,j),T(j+1,j)); 
-      eig(j+1) = std::complex<RealScalar>(T(j,j+1),T(j+1,j+1));
+  while (j < it - 1) {
+    if (T(j + 1, j) == Scalar(0)) {
+      eig(j) = std::complex<RealScalar>(T(j, j), RealScalar(0));
+      j++;
+    } else {
+      eig(j) = std::complex<RealScalar>(T(j, j), T(j + 1, j));
+      eig(j + 1) = std::complex<RealScalar>(T(j, j + 1), T(j + 1, j + 1));
       j++;
     }
   }
-  if (j < it-1) eig(j) = std::complex<RealScalar>(T(j,j),RealScalar(0));
+  if (j < it - 1) eig(j) = std::complex<RealScalar>(T(j, j), RealScalar(0));
   return eig;
 }
 
-template< typename MatrixType_, typename Preconditioner_>
-Index DGMRES<MatrixType_, Preconditioner_>::dgmresComputeDeflationData(const MatrixType& mat, const Preconditioner& precond, const Index& it, StorageIndex& neig) const
-{
+template <typename MatrixType_, typename Preconditioner_>
+Index DGMRES<MatrixType_, Preconditioner_>::dgmresComputeDeflationData(const MatrixType& mat,
+                                                                       const Preconditioner& precond, const Index& it,
+                                                                       StorageIndex& neig) const {
   // First, find the Schur form of the Hessenberg matrix H
   std::conditional_t<NumTraits<Scalar>::IsComplex, ComplexSchur<DenseMatrix>, RealSchur<DenseMatrix> > schurofH;
   bool computeU = true;
-  DenseMatrix matrixQ(it,it); 
+  DenseMatrix matrixQ(it, it);
   matrixQ.setIdentity();
-  schurofH.computeFromHessenberg(m_Hes.topLeftCorner(it,it), matrixQ, computeU); 
-  
+  schurofH.computeFromHessenberg(m_Hes.topLeftCorner(it, it), matrixQ, computeU);
+
   ComplexVector eig(it);
-  Matrix<StorageIndex,Dynamic,1>perm(it);
+  Matrix<StorageIndex, Dynamic, 1> perm(it);
   eig = this->schurValues(schurofH);
-  
+
   // Reorder the absolute values of Schur values
-  DenseRealVector modulEig(it); 
-  for (Index j=0; j<it; ++j) modulEig(j) = std::abs(eig(j)); 
-  perm.setLinSpaced(it,0,internal::convert_index<StorageIndex>(it-1));
+  DenseRealVector modulEig(it);
+  for (Index j = 0; j < it; ++j) modulEig(j) = std::abs(eig(j));
+  perm.setLinSpaced(it, 0, internal::convert_index<StorageIndex>(it - 1));
   internal::sortWithPermutation(modulEig, perm, neig);
-  
-  if (!m_lambdaN)
-  {
+
+  if (!m_lambdaN) {
     m_lambdaN = (std::max)(modulEig.maxCoeff(), m_lambdaN);
   }
-  //Count the real number of extracted eigenvalues (with complex conjugates)
-  Index nbrEig = 0; 
-  while (nbrEig < neig)
-  {
-    if(eig(perm(it-nbrEig-1)).imag() == RealScalar(0)) nbrEig++; 
-    else nbrEig += 2; 
+  // Count the real number of extracted eigenvalues (with complex conjugates)
+  Index nbrEig = 0;
+  while (nbrEig < neig) {
+    if (eig(perm(it - nbrEig - 1)).imag() == RealScalar(0))
+      nbrEig++;
+    else
+      nbrEig += 2;
   }
   // Extract the  Schur vectors corresponding to the smallest Ritz values
-  DenseMatrix Sr(it, nbrEig); 
+  DenseMatrix Sr(it, nbrEig);
   Sr.setZero();
-  for (Index j = 0; j < nbrEig; j++)
-  {
-    Sr.col(j) = schurofH.matrixU().col(perm(it-j-1));
+  for (Index j = 0; j < nbrEig; j++) {
+    Sr.col(j) = schurofH.matrixU().col(perm(it - j - 1));
   }
-  
+
   // Form the Schur vectors of the initial matrix using the Krylov basis
-  DenseMatrix X; 
+  DenseMatrix X;
   X = m_V.leftCols(it) * Sr;
-  if (m_r)
-  {
-   // Orthogonalize X against m_U using modified Gram-Schmidt
-   for (Index j = 0; j < nbrEig; j++)
-     for (Index k =0; k < m_r; k++)
-      X.col(j) = X.col(j) - (m_U.col(k).dot(X.col(j)))*m_U.col(k); 
+  if (m_r) {
+    // Orthogonalize X against m_U using modified Gram-Schmidt
+    for (Index j = 0; j < nbrEig; j++)
+      for (Index k = 0; k < m_r; k++) X.col(j) = X.col(j) - (m_U.col(k).dot(X.col(j))) * m_U.col(k);
   }
-  
+
   // Compute m_MX = A * M^-1 * X
   Index m = m_V.rows();
-  if (!m_isDeflAllocated) 
-    dgmresInitDeflation(m); 
+  if (!m_isDeflAllocated) dgmresInitDeflation(m);
   DenseMatrix MX(m, nbrEig);
   DenseVector tv1(m);
-  for (Index j = 0; j < nbrEig; j++)
-  {
+  for (Index j = 0; j < nbrEig; j++) {
     tv1 = mat * X.col(j);
     MX.col(j) = precond.solve(tv1);
   }
-  
-  //Update m_T = [U'MU U'MX; X'MU X'MX]
-  m_T.block(m_r, m_r, nbrEig, nbrEig) = X.transpose() * MX; 
-  if(m_r)
-  {
-    m_T.block(0, m_r, m_r, nbrEig) = m_U.leftCols(m_r).transpose() * MX; 
+
+  // Update m_T = [U'MU U'MX; X'MU X'MX]
+  m_T.block(m_r, m_r, nbrEig, nbrEig) = X.transpose() * MX;
+  if (m_r) {
+    m_T.block(0, m_r, m_r, nbrEig) = m_U.leftCols(m_r).transpose() * MX;
     m_T.block(m_r, 0, nbrEig, m_r) = X.transpose() * m_MU.leftCols(m_r);
   }
-  
+
   // Save X into m_U and m_MX in m_MU
-  for (Index j = 0; j < nbrEig; j++) m_U.col(m_r+j) = X.col(j);
-  for (Index j = 0; j < nbrEig; j++) m_MU.col(m_r+j) = MX.col(j);
+  for (Index j = 0; j < nbrEig; j++) m_U.col(m_r + j) = X.col(j);
+  for (Index j = 0; j < nbrEig; j++) m_MU.col(m_r + j) = MX.col(j);
   // Increase the size of the invariant subspace
-  m_r += nbrEig; 
-  
+  m_r += nbrEig;
+
   // Factorize m_T into m_luT
   m_luT.compute(m_T.topLeftCorner(m_r, m_r));
-  
-  //FIXME CHeck if the factorization was correctly done (nonsingular matrix)
+
+  // FIXME CHeck if the factorization was correctly done (nonsingular matrix)
   m_isDeflInitialized = true;
-  return 0; 
+  return 0;
 }
-template<typename MatrixType_, typename Preconditioner_>
-template<typename RhsType, typename DestType>
-Index DGMRES<MatrixType_, Preconditioner_>::dgmresApplyDeflation(const RhsType &x, DestType &y) const
-{
-  DenseVector x1 = m_U.leftCols(m_r).transpose() * x; 
-  y = x + m_U.leftCols(m_r) * ( m_lambdaN * m_luT.solve(x1) - x1);
-  return 0; 
+template <typename MatrixType_, typename Preconditioner_>
+template <typename RhsType, typename DestType>
+Index DGMRES<MatrixType_, Preconditioner_>::dgmresApplyDeflation(const RhsType& x, DestType& y) const {
+  DenseVector x1 = m_U.leftCols(m_r).transpose() * x;
+  y = x + m_U.leftCols(m_r) * (m_lambdaN * m_luT.solve(x1) - x1);
+  return 0;
 }
 
-} // end namespace Eigen
-#endif 
+}  // end namespace Eigen
+#endif
diff --git a/unsupported/Eigen/src/IterativeSolvers/GMRES.h b/unsupported/Eigen/src/IterativeSolvers/GMRES.h
index 0a4108f..238d0ec 100644
--- a/unsupported/Eigen/src/IterativeSolvers/GMRES.h
+++ b/unsupported/Eigen/src/IterativeSolvers/GMRES.h
@@ -19,58 +19,56 @@
 namespace internal {
 
 /**
-* Generalized Minimal Residual Algorithm based on the
-* Arnoldi algorithm implemented with Householder reflections.
-*
-* Parameters:
-*  \param mat       matrix of linear system of equations
-*  \param rhs       right hand side vector of linear system of equations
-*  \param x         on input: initial guess, on output: solution
-*  \param precond   preconditioner used
-*  \param iters     on input: maximum number of iterations to perform
-*                   on output: number of iterations performed
-*  \param restart   number of iterations for a restart
-*  \param tol_error on input: relative residual tolerance
-*                   on output: residuum achieved
-*
-* \sa IterativeMethods::bicgstab()
-*
-*
-* For references, please see:
-*
-* Saad, Y. and Schultz, M. H.
-* GMRES: A Generalized Minimal Residual Algorithm for Solving Nonsymmetric Linear Systems.
-* SIAM J.Sci.Stat.Comp. 7, 1986, pp. 856 - 869.
-*
-* Saad, Y.
-* Iterative Methods for Sparse Linear Systems.
-* Society for Industrial and Applied Mathematics, Philadelphia, 2003.
-*
-* Walker, H. F.
-* Implementations of the GMRES method.
-* Comput.Phys.Comm. 53, 1989, pp. 311 - 320.
-*
-* Walker, H. F.
-* Implementation of the GMRES Method using Householder Transformations.
-* SIAM J.Sci.Stat.Comp. 9, 1988, pp. 152 - 163.
-*
-*/
-template<typename MatrixType, typename Rhs, typename Dest, typename Preconditioner>
-bool gmres(const MatrixType & mat, const Rhs & rhs, Dest & x, const Preconditioner & precond,
-    Index &iters, const Index &restart, typename Dest::RealScalar & tol_error) {
-
-  using std::sqrt;
+ * Generalized Minimal Residual Algorithm based on the
+ * Arnoldi algorithm implemented with Householder reflections.
+ *
+ * Parameters:
+ *  \param mat       matrix of linear system of equations
+ *  \param rhs       right hand side vector of linear system of equations
+ *  \param x         on input: initial guess, on output: solution
+ *  \param precond   preconditioner used
+ *  \param iters     on input: maximum number of iterations to perform
+ *                   on output: number of iterations performed
+ *  \param restart   number of iterations for a restart
+ *  \param tol_error on input: relative residual tolerance
+ *                   on output: residuum achieved
+ *
+ * \sa IterativeMethods::bicgstab()
+ *
+ *
+ * For references, please see:
+ *
+ * Saad, Y. and Schultz, M. H.
+ * GMRES: A Generalized Minimal Residual Algorithm for Solving Nonsymmetric Linear Systems.
+ * SIAM J.Sci.Stat.Comp. 7, 1986, pp. 856 - 869.
+ *
+ * Saad, Y.
+ * Iterative Methods for Sparse Linear Systems.
+ * Society for Industrial and Applied Mathematics, Philadelphia, 2003.
+ *
+ * Walker, H. F.
+ * Implementations of the GMRES method.
+ * Comput.Phys.Comm. 53, 1989, pp. 311 - 320.
+ *
+ * Walker, H. F.
+ * Implementation of the GMRES Method using Householder Transformations.
+ * SIAM J.Sci.Stat.Comp. 9, 1988, pp. 152 - 163.
+ *
+ */
+template <typename MatrixType, typename Rhs, typename Dest, typename Preconditioner>
+bool gmres(const MatrixType& mat, const Rhs& rhs, Dest& x, const Preconditioner& precond, Index& iters,
+           const Index& restart, typename Dest::RealScalar& tol_error) {
   using std::abs;
+  using std::sqrt;
 
   typedef typename Dest::RealScalar RealScalar;
   typedef typename Dest::Scalar Scalar;
-  typedef Matrix < Scalar, Dynamic, 1 > VectorType;
-  typedef Matrix < Scalar, Dynamic, Dynamic, ColMajor> FMatrixType;
+  typedef Matrix<Scalar, Dynamic, 1> VectorType;
+  typedef Matrix<Scalar, Dynamic, Dynamic, ColMajor> FMatrixType;
 
   const RealScalar considerAsZero = (std::numeric_limits<RealScalar>::min)();
 
-  if(rhs.norm() <= considerAsZero) 
-  {
+  if (rhs.norm() <= considerAsZero) {
     x.setZero();
     tol_error = 0;
     return true;
@@ -83,26 +81,25 @@
   const Index m = mat.rows();
 
   // residual and preconditioned residual
-  VectorType p0 = rhs - mat*x;
+  VectorType p0 = rhs - mat * x;
   VectorType r0 = precond.solve(p0);
 
   const RealScalar r0Norm = r0.norm();
 
   // is initial guess already good enough?
-  if(r0Norm == 0)
-  {
+  if (r0Norm == 0) {
     tol_error = 0;
     return true;
   }
 
   // storage for Hessenberg matrix and Householder data
-  FMatrixType H   = FMatrixType::Zero(m, restart + 1);
-  VectorType w    = VectorType::Zero(restart + 1);
-  VectorType tau  = VectorType::Zero(restart + 1);
+  FMatrixType H = FMatrixType::Zero(m, restart + 1);
+  VectorType w = VectorType::Zero(restart + 1);
+  VectorType tau = VectorType::Zero(restart + 1);
 
   // storage for Jacobi rotations
-  std::vector < JacobiRotation < Scalar > > G(restart);
-  
+  std::vector<JacobiRotation<Scalar> > G(restart);
+
   // storage for temporaries
   VectorType t(m), v(m), workspace(m), x_new(m);
 
@@ -111,9 +108,8 @@
   RealScalar beta;
   r0.makeHouseholder(H0_tail, tau.coeffRef(0), beta);
   w(0) = Scalar(beta);
-  
-  for (Index k = 1; k <= restart; ++k)
-  {
+
+  for (Index k = 1; k <= restart; ++k) {
     ++iters;
 
     v = VectorType::Unit(m, k - 1);
@@ -134,10 +130,8 @@
       v.tail(m - i).applyHouseholderOnTheLeft(H.col(i).tail(m - i - 1), tau.coeffRef(i), workspace.data());
     }
 
-    if (v.tail(m - k).norm() != 0.0)
-    {
-      if (k <= restart)
-      {
+    if (v.tail(m - k).norm() != 0.0) {
+      if (k <= restart) {
         // generate new Householder vector
         Ref<VectorType> Hk_tail = H.col(k).tail(m - k - 1);
         v.tail(m - k).makeHouseholder(Hk_tail, tau.coeffRef(k), beta);
@@ -147,17 +141,14 @@
       }
     }
 
-    if (k > 1)
-    {
-      for (Index i = 0; i < k - 1; ++i)
-      {
+    if (k > 1) {
+      for (Index i = 0; i < k - 1; ++i) {
         // apply old Givens rotations to v
         v.applyOnTheLeft(i, i + 1, G[i].adjoint());
       }
     }
 
-    if (k<m && v(k) != (Scalar) 0)
-    {
+    if (k < m && v(k) != (Scalar)0) {
       // determine next Givens rotation
       G[k - 1].makeGivens(v(k - 1), v(k));
 
@@ -167,21 +158,19 @@
     }
 
     // insert coefficients into upper matrix triangle
-    H.col(k-1).head(k) = v.head(k);
+    H.col(k - 1).head(k) = v.head(k);
 
     tol_error = abs(w(k)) / r0Norm;
-    bool stop = (k==m || tol_error < tol || iters == maxIters);
+    bool stop = (k == m || tol_error < tol || iters == maxIters);
 
-    if (stop || k == restart)
-    {
+    if (stop || k == restart) {
       // solve upper triangular system
       Ref<VectorType> y = w.head(k);
-      H.topLeftCorner(k, k).template triangularView <Upper>().solveInPlace(y);
+      H.topLeftCorner(k, k).template triangularView<Upper>().solveInPlace(y);
 
       // use Horner-like scheme to calculate solution vector
       x_new.setZero();
-      for (Index i = k - 1; i >= 0; --i)
-      {
+      for (Index i = k - 1; i >= 0; --i) {
         x_new(i) += y(i);
         // apply Householder reflection H_{i} to x_new
         x_new.tail(m - i).applyHouseholderOnTheLeft(H.col(i).tail(m - i - 1), tau.coeffRef(i), workspace.data());
@@ -189,16 +178,13 @@
 
       x += x_new;
 
-      if(stop)
-      {
+      if (stop) {
         return true;
-      }
-      else
-      {
-        k=0;
+      } else {
+        k = 0;
 
         // reset data for restart
-        p0.noalias() = rhs - mat*x;
+        p0.noalias() = rhs - mat * x;
         r0 = precond.solve(p0);
 
         // clear Hessenberg matrix and Householder data
@@ -214,125 +200,116 @@
   }
 
   return false;
-
 }
 
-}
+}  // namespace internal
 
-template< typename MatrixType_,
-          typename Preconditioner_ = DiagonalPreconditioner<typename MatrixType_::Scalar> >
+template <typename MatrixType_, typename Preconditioner_ = DiagonalPreconditioner<typename MatrixType_::Scalar> >
 class GMRES;
 
 namespace internal {
 
-template< typename MatrixType_, typename Preconditioner_>
-struct traits<GMRES<MatrixType_,Preconditioner_> >
-{
+template <typename MatrixType_, typename Preconditioner_>
+struct traits<GMRES<MatrixType_, Preconditioner_> > {
   typedef MatrixType_ MatrixType;
   typedef Preconditioner_ Preconditioner;
 };
 
-}
+}  // namespace internal
 
 /** \ingroup IterativeLinearSolvers_Module
-  * \brief A GMRES solver for sparse square problems
-  *
-  * This class allows to solve for A.x = b sparse linear problems using a generalized minimal
-  * residual method. The vectors x and b can be either dense or sparse.
-  *
-  * \tparam MatrixType_ the type of the sparse matrix A, can be a dense or a sparse matrix.
-  * \tparam Preconditioner_ the type of the preconditioner. Default is DiagonalPreconditioner
-  *
-  * The maximal number of iterations and tolerance value can be controlled via the setMaxIterations()
-  * and setTolerance() methods. The defaults are the size of the problem for the maximal number of iterations
-  * and NumTraits<Scalar>::epsilon() for the tolerance.
-  *
-  * This class can be used as the direct solver classes. Here is a typical usage example:
-  * \code
-  * int n = 10000;
-  * VectorXd x(n), b(n);
-  * SparseMatrix<double> A(n,n);
-  * // fill A and b
-  * GMRES<SparseMatrix<double> > solver(A);
-  * x = solver.solve(b);
-  * std::cout << "#iterations:     " << solver.iterations() << std::endl;
-  * std::cout << "estimated error: " << solver.error()      << std::endl;
-  * // update b, and solve again
-  * x = solver.solve(b);
-  * \endcode
-  *
-  * By default the iterations start with x=0 as an initial guess of the solution.
-  * One can control the start using the solveWithGuess() method.
-  * 
-  * GMRES can also be used in a matrix-free context, see the following \link MatrixfreeSolverExample example \endlink.
-  *
-  * \sa class SimplicialCholesky, DiagonalPreconditioner, IdentityPreconditioner
-  */
-template< typename MatrixType_, typename Preconditioner_>
-class GMRES : public IterativeSolverBase<GMRES<MatrixType_,Preconditioner_> >
-{
+ * \brief A GMRES solver for sparse square problems
+ *
+ * This class allows to solve for A.x = b sparse linear problems using a generalized minimal
+ * residual method. The vectors x and b can be either dense or sparse.
+ *
+ * \tparam MatrixType_ the type of the sparse matrix A, can be a dense or a sparse matrix.
+ * \tparam Preconditioner_ the type of the preconditioner. Default is DiagonalPreconditioner
+ *
+ * The maximal number of iterations and tolerance value can be controlled via the setMaxIterations()
+ * and setTolerance() methods. The defaults are the size of the problem for the maximal number of iterations
+ * and NumTraits<Scalar>::epsilon() for the tolerance.
+ *
+ * This class can be used as the direct solver classes. Here is a typical usage example:
+ * \code
+ * int n = 10000;
+ * VectorXd x(n), b(n);
+ * SparseMatrix<double> A(n,n);
+ * // fill A and b
+ * GMRES<SparseMatrix<double> > solver(A);
+ * x = solver.solve(b);
+ * std::cout << "#iterations:     " << solver.iterations() << std::endl;
+ * std::cout << "estimated error: " << solver.error()      << std::endl;
+ * // update b, and solve again
+ * x = solver.solve(b);
+ * \endcode
+ *
+ * By default the iterations start with x=0 as an initial guess of the solution.
+ * One can control the start using the solveWithGuess() method.
+ *
+ * GMRES can also be used in a matrix-free context, see the following \link MatrixfreeSolverExample example \endlink.
+ *
+ * \sa class SimplicialCholesky, DiagonalPreconditioner, IdentityPreconditioner
+ */
+template <typename MatrixType_, typename Preconditioner_>
+class GMRES : public IterativeSolverBase<GMRES<MatrixType_, Preconditioner_> > {
   typedef IterativeSolverBase<GMRES> Base;
-  using Base::matrix;
   using Base::m_error;
-  using Base::m_iterations;
   using Base::m_info;
   using Base::m_isInitialized;
+  using Base::m_iterations;
+  using Base::matrix;
 
-private:
+ private:
   Index m_restart;
 
-public:
+ public:
   using Base::_solve_impl;
   typedef MatrixType_ MatrixType;
   typedef typename MatrixType::Scalar Scalar;
   typedef typename MatrixType::RealScalar RealScalar;
   typedef Preconditioner_ Preconditioner;
 
-public:
-
+ public:
   /** Default constructor. */
   GMRES() : Base(), m_restart(30) {}
 
   /** Initialize the solver with matrix \a A for further \c Ax=b solving.
-    *
-    * This constructor is a shortcut for the default constructor followed
-    * by a call to compute().
-    *
-    * \warning this class stores a reference to the matrix A as well as some
-    * precomputed values that depend on it. Therefore, if \a A is changed
-    * this class becomes invalid. Call compute() to update it with the new
-    * matrix A, or modify a copy of A.
-    */
-  template<typename MatrixDerived>
+   *
+   * This constructor is a shortcut for the default constructor followed
+   * by a call to compute().
+   *
+   * \warning this class stores a reference to the matrix A as well as some
+   * precomputed values that depend on it. Therefore, if \a A is changed
+   * this class becomes invalid. Call compute() to update it with the new
+   * matrix A, or modify a copy of A.
+   */
+  template <typename MatrixDerived>
   explicit GMRES(const EigenBase<MatrixDerived>& A) : Base(A.derived()), m_restart(30) {}
 
   ~GMRES() {}
 
   /** Get the number of iterations after that a restart is performed.
-    */
+   */
   Index get_restart() { return m_restart; }
 
   /** Set the number of iterations after that a restart is performed.
-    *  \param restart   number of iterations for a restarti, default is 30.
-    */
-  void set_restart(const Index restart) { m_restart=restart; }
+   *  \param restart   number of iterations for a restarti, default is 30.
+   */
+  void set_restart(const Index restart) { m_restart = restart; }
 
   /** \internal */
-  template<typename Rhs,typename Dest>
-  void _solve_vector_with_guess_impl(const Rhs& b, Dest& x) const
-  {
+  template <typename Rhs, typename Dest>
+  void _solve_vector_with_guess_impl(const Rhs& b, Dest& x) const {
     m_iterations = Base::maxIterations();
     m_error = Base::m_tolerance;
     bool ret = internal::gmres(matrix(), b, x, Base::m_preconditioner, m_iterations, m_restart, m_error);
-    m_info = (!ret) ? NumericalIssue
-          : m_error <= Base::m_tolerance ? Success
-          : NoConvergence;
+    m_info = (!ret) ? NumericalIssue : m_error <= Base::m_tolerance ? Success : NoConvergence;
   }
 
-protected:
-
+ protected:
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_GMRES_H
+#endif  // EIGEN_GMRES_H
diff --git a/unsupported/Eigen/src/IterativeSolvers/IncompleteLU.h b/unsupported/Eigen/src/IterativeSolvers/IncompleteLU.h
index 4059a0e..1a2edca 100644
--- a/unsupported/Eigen/src/IterativeSolvers/IncompleteLU.h
+++ b/unsupported/Eigen/src/IterativeSolvers/IncompleteLU.h
@@ -13,81 +13,76 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 template <typename Scalar_>
-class IncompleteLU : public SparseSolverBase<IncompleteLU<Scalar_> >
-{
-  protected:
-    typedef SparseSolverBase<IncompleteLU<Scalar_> > Base;
-    using Base::m_isInitialized;
-    
-    typedef Scalar_ Scalar;
-    typedef Matrix<Scalar,Dynamic,1> Vector;
-    typedef typename Vector::Index Index;
-    typedef SparseMatrix<Scalar,RowMajor> FactorType;
+class IncompleteLU : public SparseSolverBase<IncompleteLU<Scalar_> > {
+ protected:
+  typedef SparseSolverBase<IncompleteLU<Scalar_> > Base;
+  using Base::m_isInitialized;
 
-  public:
-    typedef Matrix<Scalar,Dynamic,Dynamic> MatrixType;
+  typedef Scalar_ Scalar;
+  typedef Matrix<Scalar, Dynamic, 1> Vector;
+  typedef typename Vector::Index Index;
+  typedef SparseMatrix<Scalar, RowMajor> FactorType;
 
-    IncompleteLU() {}
+ public:
+  typedef Matrix<Scalar, Dynamic, Dynamic> MatrixType;
 
-    template<typename MatrixType>
-    IncompleteLU(const MatrixType& mat)
-    {
-      compute(mat);
-    }
+  IncompleteLU() {}
 
-    Index rows() const { return m_lu.rows(); }
-    Index cols() const { return m_lu.cols(); }
+  template <typename MatrixType>
+  IncompleteLU(const MatrixType& mat) {
+    compute(mat);
+  }
 
-    template<typename MatrixType>
-    IncompleteLU& compute(const MatrixType& mat)
-    {
-      m_lu = mat;
-      int size = mat.cols();
-      Vector diag(size);
-      for(int i=0; i<size; ++i)
-      {
-        typename FactorType::InnerIterator k_it(m_lu,i);
-        for(; k_it && k_it.index()<i; ++k_it)
-        {
-          int k = k_it.index();
-          k_it.valueRef() /= diag(k);
+  Index rows() const { return m_lu.rows(); }
+  Index cols() const { return m_lu.cols(); }
 
-          typename FactorType::InnerIterator j_it(k_it);
-          typename FactorType::InnerIterator kj_it(m_lu, k);
-          while(kj_it && kj_it.index()<=k) ++kj_it;
-          for(++j_it; j_it; )
-          {
-            if(kj_it.index()==j_it.index())
-            {
-              j_it.valueRef() -= k_it.value() * kj_it.value();
-              ++j_it;
-              ++kj_it;
-            }
-            else if(kj_it.index()<j_it.index()) ++kj_it;
-            else                                ++j_it;
-          }
+  template <typename MatrixType>
+  IncompleteLU& compute(const MatrixType& mat) {
+    m_lu = mat;
+    int size = mat.cols();
+    Vector diag(size);
+    for (int i = 0; i < size; ++i) {
+      typename FactorType::InnerIterator k_it(m_lu, i);
+      for (; k_it && k_it.index() < i; ++k_it) {
+        int k = k_it.index();
+        k_it.valueRef() /= diag(k);
+
+        typename FactorType::InnerIterator j_it(k_it);
+        typename FactorType::InnerIterator kj_it(m_lu, k);
+        while (kj_it && kj_it.index() <= k) ++kj_it;
+        for (++j_it; j_it;) {
+          if (kj_it.index() == j_it.index()) {
+            j_it.valueRef() -= k_it.value() * kj_it.value();
+            ++j_it;
+            ++kj_it;
+          } else if (kj_it.index() < j_it.index())
+            ++kj_it;
+          else
+            ++j_it;
         }
-        if(k_it && k_it.index()==i) diag(i) = k_it.value();
-        else                        diag(i) = 1;
       }
-      m_isInitialized = true;
-      return *this;
+      if (k_it && k_it.index() == i)
+        diag(i) = k_it.value();
+      else
+        diag(i) = 1;
     }
+    m_isInitialized = true;
+    return *this;
+  }
 
-    template<typename Rhs, typename Dest>
-    void _solve_impl(const Rhs& b, Dest& x) const
-    {
-      x = m_lu.template triangularView<UnitLower>().solve(b);
-      x = m_lu.template triangularView<Upper>().solve(x);
-    }
+  template <typename Rhs, typename Dest>
+  void _solve_impl(const Rhs& b, Dest& x) const {
+    x = m_lu.template triangularView<UnitLower>().solve(b);
+    x = m_lu.template triangularView<Upper>().solve(x);
+  }
 
-  protected:
-    FactorType m_lu;
+ protected:
+  FactorType m_lu;
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_INCOMPLETE_LU_H
+#endif  // EIGEN_INCOMPLETE_LU_H
diff --git a/unsupported/Eigen/src/IterativeSolvers/InternalHeaderCheck.h b/unsupported/Eigen/src/IterativeSolvers/InternalHeaderCheck.h
index 679c7fa..3d6ee41 100644
--- a/unsupported/Eigen/src/IterativeSolvers/InternalHeaderCheck.h
+++ b/unsupported/Eigen/src/IterativeSolvers/InternalHeaderCheck.h
@@ -1,3 +1,4 @@
 #ifndef EIGEN_ITERATIVE_SOLVERS_MODULE_H
-#error "Please include unsupported/Eigen/IterativeSolvers instead of including headers inside the src directory directly."
+#error \
+    "Please include unsupported/Eigen/IterativeSolvers instead of including headers inside the src directory directly."
 #endif
diff --git a/unsupported/Eigen/src/IterativeSolvers/MINRES.h b/unsupported/Eigen/src/IterativeSolvers/MINRES.h
index f0b3cc4..9daf568 100644
--- a/unsupported/Eigen/src/IterativeSolvers/MINRES.h
+++ b/unsupported/Eigen/src/IterativeSolvers/MINRES.h
@@ -9,262 +9,246 @@
 // 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_MINRES_H
 #define EIGEN_MINRES_H
 
-
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
 namespace Eigen {
-    
-    namespace internal {
-        
-        /** \internal Low-level MINRES algorithm
-         * \param mat The matrix A
-         * \param rhs The right hand side vector b
-         * \param x On input and initial solution, on output the computed solution.
-         * \param precond A right preconditioner being able to efficiently solve for an
-         *                approximation of Ax=b (regardless of b)
-         * \param iters On input the max number of iteration, on output the number of performed iterations.
-         * \param tol_error On input the tolerance error, on output an estimation of the relative error.
-         */
-        template<typename MatrixType, typename Rhs, typename Dest, typename Preconditioner>
-        EIGEN_DONT_INLINE
-        void minres(const MatrixType& mat, const Rhs& rhs, Dest& x,
-                    const Preconditioner& precond, Index& iters,
-                    typename Dest::RealScalar& tol_error)
-        {
-            using std::sqrt;
-            typedef typename Dest::RealScalar RealScalar;
-            typedef typename Dest::Scalar Scalar;
-            typedef Matrix<Scalar,Dynamic,1> VectorType;
 
-            // Check for zero rhs
-            const RealScalar rhsNorm2(rhs.squaredNorm());
-            if(rhsNorm2 == 0)
-            {
-                x.setZero();
-                iters = 0;
-                tol_error = 0;
-                return;
-            }
-            
-            // initialize
-            const Index maxIters(iters);  // initialize maxIters to iters
-            const Index N(mat.cols());    // the size of the matrix
-            const RealScalar threshold2(tol_error*tol_error*rhsNorm2); // convergence threshold (compared to residualNorm2)
-            
-            // Initialize preconditioned Lanczos
-            VectorType v_old(N); // will be initialized inside loop
-            VectorType v( VectorType::Zero(N) ); //initialize v
-            VectorType v_new(rhs-mat*x); //initialize v_new
-            RealScalar residualNorm2(v_new.squaredNorm());
-            VectorType w(N); // will be initialized inside loop
-            VectorType w_new(precond.solve(v_new)); // initialize w_new
-//            RealScalar beta; // will be initialized inside loop
-            RealScalar beta_new2(v_new.dot(w_new));
-            eigen_assert(beta_new2 >= 0.0 && "PRECONDITIONER IS NOT POSITIVE DEFINITE");
-            RealScalar beta_new(sqrt(beta_new2));
-            const RealScalar beta_one(beta_new);
-            // Initialize other variables
-            RealScalar c(1.0); // the cosine of the Givens rotation
-            RealScalar c_old(1.0);
-            RealScalar s(0.0); // the sine of the Givens rotation
-            RealScalar s_old(0.0); // the sine of the Givens rotation
-            VectorType p_oold(N); // will be initialized in loop
-            VectorType p_old(VectorType::Zero(N)); // initialize p_old=0
-            VectorType p(p_old); // initialize p=0
-            RealScalar eta(1.0);
-                        
-            iters = 0; // reset iters
-            while ( iters < maxIters )
-            {
-                // Preconditioned Lanczos
-                /* Note that there are 4 variants on the Lanczos algorithm. These are
-                 * described in Paige, C. C. (1972). Computational variants of
-                 * the Lanczos method for the eigenproblem. IMA Journal of Applied
-                 * Mathematics, 10(3), 373-381. The current implementation corresponds 
-                 * to the case A(2,7) in the paper. It also corresponds to 
-                 * algorithm 6.14 in Y. Saad, Iterative Methods for Sparse Linear
-                 * Systems, 2003 p.173. For the preconditioned version see 
-                 * A. Greenbaum, Iterative Methods for Solving Linear Systems, SIAM (1987).
-                 */
-                const RealScalar beta(beta_new);
-                v_old = v; // update: at first time step, this makes v_old = 0 so value of beta doesn't matter
-                v_new /= beta_new; // overwrite v_new for next iteration
-                w_new /= beta_new; // overwrite w_new for next iteration
-                v = v_new; // update
-                w = w_new; // update
-                v_new.noalias() = mat*w - beta*v_old; // compute v_new
-                const RealScalar alpha = v_new.dot(w);
-                v_new -= alpha*v; // overwrite v_new
-                w_new = precond.solve(v_new); // overwrite w_new
-                beta_new2 = v_new.dot(w_new); // compute beta_new
-                eigen_assert(beta_new2 >= 0.0 && "PRECONDITIONER IS NOT POSITIVE DEFINITE");
-                beta_new = sqrt(beta_new2); // compute beta_new
-                
-                // Givens rotation
-                const RealScalar r2 =s*alpha+c*c_old*beta; // s, s_old, c and c_old are still from previous iteration
-                const RealScalar r3 =s_old*beta; // s, s_old, c and c_old are still from previous iteration
-                const RealScalar r1_hat=c*alpha-c_old*s*beta;
-                const RealScalar r1 =sqrt( std::pow(r1_hat,2) + std::pow(beta_new,2) );
-                c_old = c; // store for next iteration
-                s_old = s; // store for next iteration
-                c=r1_hat/r1; // new cosine
-                s=beta_new/r1; // new sine
-                
-                // Update solution
-                p_oold = p_old;
-                p_old = p;
-                p.noalias()=(w-r2*p_old-r3*p_oold) /r1; // IS NOALIAS REQUIRED?
-                x += beta_one*c*eta*p;
-                
-                /* Update the squared residual. Note that this is the estimated residual.
-                The real residual |Ax-b|^2 may be slightly larger */
-                residualNorm2 *= s*s;
-                
-                if ( residualNorm2 < threshold2)
-                {
-                    break;
-                }
-                
-                eta=-s*eta; // update eta
-                iters++; // increment iteration number (for output purposes)
-            }
-            
-            /* Compute error. Note that this is the estimated error. The real 
-             error |Ax-b|/|b| may be slightly larger */
-            tol_error = std::sqrt(residualNorm2 / rhsNorm2);
-        }
-        
-    }
-    
-    template< typename MatrixType_, int UpLo_=Lower,
-    typename Preconditioner_ = IdentityPreconditioner>
-    class MINRES;
-    
-    namespace internal {
-        
-        template< typename MatrixType_, int UpLo_, typename Preconditioner_>
-        struct traits<MINRES<MatrixType_,UpLo_,Preconditioner_> >
-        {
-            typedef MatrixType_ MatrixType;
-            typedef Preconditioner_ Preconditioner;
-        };
-        
-    }
-    
-    /** \ingroup IterativeLinearSolvers_Module
-     * \brief A minimal residual solver for sparse symmetric problems
-     *
-     * This class allows to solve for A.x = b sparse linear problems using the MINRES algorithm
-     * of Paige and Saunders (1975). The sparse matrix A must be symmetric (possibly indefinite).
-     * The vectors x and b can be either dense or sparse.
-     *
-     * \tparam MatrixType_ the type of the sparse matrix A, can be a dense or a sparse matrix.
-     * \tparam UpLo_ the triangular part that will be used for the computations. It can be Lower,
-     *               Upper, or Lower|Upper in which the full matrix entries will be considered. Default is Lower.
-     * \tparam Preconditioner_ the type of the preconditioner. Default is DiagonalPreconditioner
-     *
-     * The maximal number of iterations and tolerance value can be controlled via the setMaxIterations()
-     * and setTolerance() methods. The defaults are the size of the problem for the maximal number of iterations
-     * and NumTraits<Scalar>::epsilon() for the tolerance.
-     *
-     * This class can be used as the direct solver classes. Here is a typical usage example:
-     * \code
-     * int n = 10000;
-     * VectorXd x(n), b(n);
-     * SparseMatrix<double> A(n,n);
-     * // fill A and b
-     * MINRES<SparseMatrix<double> > mr;
-     * mr.compute(A);
-     * x = mr.solve(b);
-     * std::cout << "#iterations:     " << mr.iterations() << std::endl;
-     * std::cout << "estimated error: " << mr.error()      << std::endl;
-     * // update b, and solve again
-     * x = mr.solve(b);
-     * \endcode
-     *
-     * By default the iterations start with x=0 as an initial guess of the solution.
-     * One can control the start using the solveWithGuess() method.
-     *
-     * MINRES can also be used in a matrix-free context, see the following \link MatrixfreeSolverExample example \endlink.
-     *
-     * \sa class ConjugateGradient, BiCGSTAB, SimplicialCholesky, DiagonalPreconditioner, IdentityPreconditioner
+namespace internal {
+
+/** \internal Low-level MINRES algorithm
+ * \param mat The matrix A
+ * \param rhs The right hand side vector b
+ * \param x On input and initial solution, on output the computed solution.
+ * \param precond A right preconditioner being able to efficiently solve for an
+ *                approximation of Ax=b (regardless of b)
+ * \param iters On input the max number of iteration, on output the number of performed iterations.
+ * \param tol_error On input the tolerance error, on output an estimation of the relative error.
+ */
+template <typename MatrixType, typename Rhs, typename Dest, typename Preconditioner>
+EIGEN_DONT_INLINE void minres(const MatrixType& mat, const Rhs& rhs, Dest& x, const Preconditioner& precond,
+                              Index& iters, typename Dest::RealScalar& tol_error) {
+  using std::sqrt;
+  typedef typename Dest::RealScalar RealScalar;
+  typedef typename Dest::Scalar Scalar;
+  typedef Matrix<Scalar, Dynamic, 1> VectorType;
+
+  // Check for zero rhs
+  const RealScalar rhsNorm2(rhs.squaredNorm());
+  if (rhsNorm2 == 0) {
+    x.setZero();
+    iters = 0;
+    tol_error = 0;
+    return;
+  }
+
+  // initialize
+  const Index maxIters(iters);                                    // initialize maxIters to iters
+  const Index N(mat.cols());                                      // the size of the matrix
+  const RealScalar threshold2(tol_error * tol_error * rhsNorm2);  // convergence threshold (compared to residualNorm2)
+
+  // Initialize preconditioned Lanczos
+  VectorType v_old(N);                // will be initialized inside loop
+  VectorType v(VectorType::Zero(N));  // initialize v
+  VectorType v_new(rhs - mat * x);    // initialize v_new
+  RealScalar residualNorm2(v_new.squaredNorm());
+  VectorType w(N);                         // will be initialized inside loop
+  VectorType w_new(precond.solve(v_new));  // initialize w_new
+                                           //            RealScalar beta; // will be initialized inside loop
+  RealScalar beta_new2(v_new.dot(w_new));
+  eigen_assert(beta_new2 >= 0.0 && "PRECONDITIONER IS NOT POSITIVE DEFINITE");
+  RealScalar beta_new(sqrt(beta_new2));
+  const RealScalar beta_one(beta_new);
+  // Initialize other variables
+  RealScalar c(1.0);  // the cosine of the Givens rotation
+  RealScalar c_old(1.0);
+  RealScalar s(0.0);                      // the sine of the Givens rotation
+  RealScalar s_old(0.0);                  // the sine of the Givens rotation
+  VectorType p_oold(N);                   // will be initialized in loop
+  VectorType p_old(VectorType::Zero(N));  // initialize p_old=0
+  VectorType p(p_old);                    // initialize p=0
+  RealScalar eta(1.0);
+
+  iters = 0;  // reset iters
+  while (iters < maxIters) {
+    // Preconditioned Lanczos
+    /* Note that there are 4 variants on the Lanczos algorithm. These are
+     * described in Paige, C. C. (1972). Computational variants of
+     * the Lanczos method for the eigenproblem. IMA Journal of Applied
+     * Mathematics, 10(3), 373-381. The current implementation corresponds
+     * to the case A(2,7) in the paper. It also corresponds to
+     * algorithm 6.14 in Y. Saad, Iterative Methods for Sparse Linear
+     * Systems, 2003 p.173. For the preconditioned version see
+     * A. Greenbaum, Iterative Methods for Solving Linear Systems, SIAM (1987).
      */
-    template< typename MatrixType_, int UpLo_, typename Preconditioner_>
-    class MINRES : public IterativeSolverBase<MINRES<MatrixType_,UpLo_,Preconditioner_> >
-    {
-        
-        typedef IterativeSolverBase<MINRES> Base;
-        using Base::matrix;
-        using Base::m_error;
-        using Base::m_iterations;
-        using Base::m_info;
-        using Base::m_isInitialized;
-    public:
-        using Base::_solve_impl;
-        typedef MatrixType_ MatrixType;
-        typedef typename MatrixType::Scalar Scalar;
-        typedef typename MatrixType::RealScalar RealScalar;
-        typedef Preconditioner_ Preconditioner;
-        
-        enum {UpLo = UpLo_};
-        
-    public:
-        
-        /** Default constructor. */
-        MINRES() : Base() {}
-        
-        /** Initialize the solver with matrix \a A for further \c Ax=b solving.
-         *
-         * This constructor is a shortcut for the default constructor followed
-         * by a call to compute().
-         *
-         * \warning this class stores a reference to the matrix A as well as some
-         * precomputed values that depend on it. Therefore, if \a A is changed
-         * this class becomes invalid. Call compute() to update it with the new
-         * matrix A, or modify a copy of A.
-         */
-        template<typename MatrixDerived>
-        explicit MINRES(const EigenBase<MatrixDerived>& A) : Base(A.derived()) {}
-        
-        /** Destructor. */
-        ~MINRES(){}
+    const RealScalar beta(beta_new);
+    v_old = v;          // update: at first time step, this makes v_old = 0 so value of beta doesn't matter
+    v_new /= beta_new;  // overwrite v_new for next iteration
+    w_new /= beta_new;  // overwrite w_new for next iteration
+    v = v_new;          // update
+    w = w_new;          // update
+    v_new.noalias() = mat * w - beta * v_old;  // compute v_new
+    const RealScalar alpha = v_new.dot(w);
+    v_new -= alpha * v;            // overwrite v_new
+    w_new = precond.solve(v_new);  // overwrite w_new
+    beta_new2 = v_new.dot(w_new);  // compute beta_new
+    eigen_assert(beta_new2 >= 0.0 && "PRECONDITIONER IS NOT POSITIVE DEFINITE");
+    beta_new = sqrt(beta_new2);  // compute beta_new
 
-        /** \internal */
-        template<typename Rhs,typename Dest>
-        void _solve_vector_with_guess_impl(const Rhs& b, Dest& x) const
-        {
-            typedef typename Base::MatrixWrapper MatrixWrapper;
-            typedef typename Base::ActualMatrixType ActualMatrixType;
-            enum {
-              TransposeInput  =   (!MatrixWrapper::MatrixFree)
-                              &&  (UpLo==(Lower|Upper))
-                              &&  (!MatrixType::IsRowMajor)
-                              &&  (!NumTraits<Scalar>::IsComplex)
-            };
-            typedef std::conditional_t<TransposeInput,Transpose<const ActualMatrixType>, ActualMatrixType const&> RowMajorWrapper;
-            EIGEN_STATIC_ASSERT(internal::check_implication(MatrixWrapper::MatrixFree, UpLo==(Lower|Upper)),MATRIX_FREE_CONJUGATE_GRADIENT_IS_COMPATIBLE_WITH_UPPER_UNION_LOWER_MODE_ONLY);
-            typedef std::conditional_t<UpLo==(Lower|Upper),
-                                                  RowMajorWrapper,
-                                                  typename MatrixWrapper::template ConstSelfAdjointViewReturnType<UpLo>::Type
-                                            > SelfAdjointWrapper;
+    // Givens rotation
+    const RealScalar r2 = s * alpha + c * c_old * beta;  // s, s_old, c and c_old are still from previous iteration
+    const RealScalar r3 = s_old * beta;                  // s, s_old, c and c_old are still from previous iteration
+    const RealScalar r1_hat = c * alpha - c_old * s * beta;
+    const RealScalar r1 = sqrt(std::pow(r1_hat, 2) + std::pow(beta_new, 2));
+    c_old = c;          // store for next iteration
+    s_old = s;          // store for next iteration
+    c = r1_hat / r1;    // new cosine
+    s = beta_new / r1;  // new sine
 
-            m_iterations = Base::maxIterations();
-            m_error = Base::m_tolerance;
-            RowMajorWrapper row_mat(matrix());
-            internal::minres(SelfAdjointWrapper(row_mat), b, x,
-                             Base::m_preconditioner, m_iterations, m_error);
-            m_info = m_error <= Base::m_tolerance ? Success : NoConvergence;
-        }
-        
-    protected:
-        
+    // Update solution
+    p_oold = p_old;
+    p_old = p;
+    p.noalias() = (w - r2 * p_old - r3 * p_oold) / r1;  // IS NOALIAS REQUIRED?
+    x += beta_one * c * eta * p;
+
+    /* Update the squared residual. Note that this is the estimated residual.
+    The real residual |Ax-b|^2 may be slightly larger */
+    residualNorm2 *= s * s;
+
+    if (residualNorm2 < threshold2) {
+      break;
+    }
+
+    eta = -s * eta;  // update eta
+    iters++;         // increment iteration number (for output purposes)
+  }
+
+  /* Compute error. Note that this is the estimated error. The real
+   error |Ax-b|/|b| may be slightly larger */
+  tol_error = std::sqrt(residualNorm2 / rhsNorm2);
+}
+
+}  // namespace internal
+
+template <typename MatrixType_, int UpLo_ = Lower, typename Preconditioner_ = IdentityPreconditioner>
+class MINRES;
+
+namespace internal {
+
+template <typename MatrixType_, int UpLo_, typename Preconditioner_>
+struct traits<MINRES<MatrixType_, UpLo_, Preconditioner_> > {
+  typedef MatrixType_ MatrixType;
+  typedef Preconditioner_ Preconditioner;
+};
+
+}  // namespace internal
+
+/** \ingroup IterativeLinearSolvers_Module
+ * \brief A minimal residual solver for sparse symmetric problems
+ *
+ * This class allows to solve for A.x = b sparse linear problems using the MINRES algorithm
+ * of Paige and Saunders (1975). The sparse matrix A must be symmetric (possibly indefinite).
+ * The vectors x and b can be either dense or sparse.
+ *
+ * \tparam MatrixType_ the type of the sparse matrix A, can be a dense or a sparse matrix.
+ * \tparam UpLo_ the triangular part that will be used for the computations. It can be Lower,
+ *               Upper, or Lower|Upper in which the full matrix entries will be considered. Default is Lower.
+ * \tparam Preconditioner_ the type of the preconditioner. Default is DiagonalPreconditioner
+ *
+ * The maximal number of iterations and tolerance value can be controlled via the setMaxIterations()
+ * and setTolerance() methods. The defaults are the size of the problem for the maximal number of iterations
+ * and NumTraits<Scalar>::epsilon() for the tolerance.
+ *
+ * This class can be used as the direct solver classes. Here is a typical usage example:
+ * \code
+ * int n = 10000;
+ * VectorXd x(n), b(n);
+ * SparseMatrix<double> A(n,n);
+ * // fill A and b
+ * MINRES<SparseMatrix<double> > mr;
+ * mr.compute(A);
+ * x = mr.solve(b);
+ * std::cout << "#iterations:     " << mr.iterations() << std::endl;
+ * std::cout << "estimated error: " << mr.error()      << std::endl;
+ * // update b, and solve again
+ * x = mr.solve(b);
+ * \endcode
+ *
+ * By default the iterations start with x=0 as an initial guess of the solution.
+ * One can control the start using the solveWithGuess() method.
+ *
+ * MINRES can also be used in a matrix-free context, see the following \link MatrixfreeSolverExample example \endlink.
+ *
+ * \sa class ConjugateGradient, BiCGSTAB, SimplicialCholesky, DiagonalPreconditioner, IdentityPreconditioner
+ */
+template <typename MatrixType_, int UpLo_, typename Preconditioner_>
+class MINRES : public IterativeSolverBase<MINRES<MatrixType_, UpLo_, Preconditioner_> > {
+  typedef IterativeSolverBase<MINRES> Base;
+  using Base::m_error;
+  using Base::m_info;
+  using Base::m_isInitialized;
+  using Base::m_iterations;
+  using Base::matrix;
+
+ public:
+  using Base::_solve_impl;
+  typedef MatrixType_ MatrixType;
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::RealScalar RealScalar;
+  typedef Preconditioner_ Preconditioner;
+
+  enum { UpLo = UpLo_ };
+
+ public:
+  /** Default constructor. */
+  MINRES() : Base() {}
+
+  /** Initialize the solver with matrix \a A for further \c Ax=b solving.
+   *
+   * This constructor is a shortcut for the default constructor followed
+   * by a call to compute().
+   *
+   * \warning this class stores a reference to the matrix A as well as some
+   * precomputed values that depend on it. Therefore, if \a A is changed
+   * this class becomes invalid. Call compute() to update it with the new
+   * matrix A, or modify a copy of A.
+   */
+  template <typename MatrixDerived>
+  explicit MINRES(const EigenBase<MatrixDerived>& A) : Base(A.derived()) {}
+
+  /** Destructor. */
+  ~MINRES() {}
+
+  /** \internal */
+  template <typename Rhs, typename Dest>
+  void _solve_vector_with_guess_impl(const Rhs& b, Dest& x) const {
+    typedef typename Base::MatrixWrapper MatrixWrapper;
+    typedef typename Base::ActualMatrixType ActualMatrixType;
+    enum {
+      TransposeInput = (!MatrixWrapper::MatrixFree) && (UpLo == (Lower | Upper)) && (!MatrixType::IsRowMajor) &&
+                       (!NumTraits<Scalar>::IsComplex)
     };
+    typedef std::conditional_t<TransposeInput, Transpose<const ActualMatrixType>, ActualMatrixType const&>
+        RowMajorWrapper;
+    EIGEN_STATIC_ASSERT(internal::check_implication(MatrixWrapper::MatrixFree, UpLo == (Lower | Upper)),
+                        MATRIX_FREE_CONJUGATE_GRADIENT_IS_COMPATIBLE_WITH_UPPER_UNION_LOWER_MODE_ONLY);
+    typedef std::conditional_t<UpLo == (Lower | Upper), RowMajorWrapper,
+                               typename MatrixWrapper::template ConstSelfAdjointViewReturnType<UpLo>::Type>
+        SelfAdjointWrapper;
 
-} // end namespace Eigen
+    m_iterations = Base::maxIterations();
+    m_error = Base::m_tolerance;
+    RowMajorWrapper row_mat(matrix());
+    internal::minres(SelfAdjointWrapper(row_mat), b, x, Base::m_preconditioner, m_iterations, m_error);
+    m_info = m_error <= Base::m_tolerance ? Success : NoConvergence;
+  }
 
-#endif // EIGEN_MINRES_H
+ protected:
+};
+
+}  // end namespace Eigen
+
+#endif  // EIGEN_MINRES_H
diff --git a/unsupported/Eigen/src/IterativeSolvers/Scaling.h b/unsupported/Eigen/src/IterativeSolvers/Scaling.h
index eeed4e2..ee23e29 100644
--- a/unsupported/Eigen/src/IterativeSolvers/Scaling.h
+++ b/unsupported/Eigen/src/IterativeSolvers/Scaling.h
@@ -16,181 +16,157 @@
 namespace Eigen {
 
 /**
-  * \ingroup IterativeSolvers_Module
-  * \brief iterative scaling algorithm to equilibrate rows and column norms in matrices
-  * 
-  * This class can be used as a preprocessing tool to accelerate the convergence of iterative methods 
-  * 
-  * This feature is  useful to limit the pivoting amount during LU/ILU factorization
-  * The  scaling strategy as presented here preserves the symmetry of the problem
-  * NOTE It is assumed that the matrix does not have empty row or column, 
-  * 
-  * Example with key steps 
-  * \code
-  * VectorXd x(n), b(n);
-  * SparseMatrix<double> A;
-  * // fill A and b;
-  * IterScaling<SparseMatrix<double> > scal; 
-  * // Compute the left and right scaling vectors. The matrix is equilibrated at output
-  * scal.computeRef(A); 
-  * // Scale the right hand side
-  * b = scal.LeftScaling().cwiseProduct(b); 
-  * // Now, solve the equilibrated linear system with any available solver
-  * 
-  * // Scale back the computed solution
-  * x = scal.RightScaling().cwiseProduct(x); 
-  * \endcode
-  * 
-  * \tparam MatrixType_ the type of the matrix. It should be a real square sparsematrix
-  * 
-  * References : D. Ruiz and B. Ucar, A Symmetry Preserving Algorithm for Matrix Scaling, INRIA Research report RR-7552
-  * 
-  * \sa \ref IncompleteLUT 
-  */
-template<typename MatrixType_>
-class IterScaling
-{
-  public:
-    typedef MatrixType_ MatrixType;
-    typedef typename MatrixType::Scalar Scalar;
-    typedef typename MatrixType::Index Index;
-    
-  public:
-    IterScaling() { init(); }
-    
-    IterScaling(const MatrixType& matrix)
-    {
-      init();
-      compute(matrix);
-    }
-    
-    ~IterScaling() { }
-    
-    /** 
-     * Compute the left and right diagonal matrices to scale the input matrix @p mat
-     * 
-     * FIXME This algorithm will be modified such that the diagonal elements are permuted on the diagonal. 
-     * 
-     * \sa LeftScaling() RightScaling()
-     */
-    void compute (const MatrixType& mat)
-    {
-      using std::abs;
-      int m = mat.rows(); 
-      int n = mat.cols();
-      eigen_assert((m>0 && m == n) && "Please give a non - empty matrix");
-      m_left.resize(m); 
-      m_right.resize(n);
-      m_left.setOnes();
-      m_right.setOnes();
-      m_matrix = mat;
-      VectorXd Dr, Dc, DrRes, DcRes; // Temporary Left and right scaling vectors
-      Dr.resize(m); Dc.resize(n);
-      DrRes.resize(m); DcRes.resize(n);
-      double EpsRow = 1.0, EpsCol = 1.0;
-      int its = 0; 
-      do
-      { // Iterate until the infinite norm of each row and column is approximately 1
-        // Get the maximum value in each row and column
-        Dr.setZero(); Dc.setZero();
-        for (int k=0; k<m_matrix.outerSize(); ++k)
-        {
-          for (typename MatrixType::InnerIterator it(m_matrix, k); it; ++it)
-          {
-            if ( Dr(it.row()) < abs(it.value()) )
-              Dr(it.row()) = abs(it.value());
-            
-            if ( Dc(it.col()) < abs(it.value()) )
-              Dc(it.col()) = abs(it.value());
-          }
+ * \ingroup IterativeSolvers_Module
+ * \brief iterative scaling algorithm to equilibrate rows and column norms in matrices
+ *
+ * This class can be used as a preprocessing tool to accelerate the convergence of iterative methods
+ *
+ * This feature is  useful to limit the pivoting amount during LU/ILU factorization
+ * The  scaling strategy as presented here preserves the symmetry of the problem
+ * NOTE It is assumed that the matrix does not have empty row or column,
+ *
+ * Example with key steps
+ * \code
+ * VectorXd x(n), b(n);
+ * SparseMatrix<double> A;
+ * // fill A and b;
+ * IterScaling<SparseMatrix<double> > scal;
+ * // Compute the left and right scaling vectors. The matrix is equilibrated at output
+ * scal.computeRef(A);
+ * // Scale the right hand side
+ * b = scal.LeftScaling().cwiseProduct(b);
+ * // Now, solve the equilibrated linear system with any available solver
+ *
+ * // Scale back the computed solution
+ * x = scal.RightScaling().cwiseProduct(x);
+ * \endcode
+ *
+ * \tparam MatrixType_ the type of the matrix. It should be a real square sparsematrix
+ *
+ * References : D. Ruiz and B. Ucar, A Symmetry Preserving Algorithm for Matrix Scaling, INRIA Research report RR-7552
+ *
+ * \sa \ref IncompleteLUT
+ */
+template <typename MatrixType_>
+class IterScaling {
+ public:
+  typedef MatrixType_ MatrixType;
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::Index Index;
+
+ public:
+  IterScaling() { init(); }
+
+  IterScaling(const MatrixType& matrix) {
+    init();
+    compute(matrix);
+  }
+
+  ~IterScaling() {}
+
+  /**
+   * Compute the left and right diagonal matrices to scale the input matrix @p mat
+   *
+   * FIXME This algorithm will be modified such that the diagonal elements are permuted on the diagonal.
+   *
+   * \sa LeftScaling() RightScaling()
+   */
+  void compute(const MatrixType& mat) {
+    using std::abs;
+    int m = mat.rows();
+    int n = mat.cols();
+    eigen_assert((m > 0 && m == n) && "Please give a non - empty matrix");
+    m_left.resize(m);
+    m_right.resize(n);
+    m_left.setOnes();
+    m_right.setOnes();
+    m_matrix = mat;
+    VectorXd Dr, Dc, DrRes, DcRes;  // Temporary Left and right scaling vectors
+    Dr.resize(m);
+    Dc.resize(n);
+    DrRes.resize(m);
+    DcRes.resize(n);
+    double EpsRow = 1.0, EpsCol = 1.0;
+    int its = 0;
+    do {  // Iterate until the infinite norm of each row and column is approximately 1
+      // Get the maximum value in each row and column
+      Dr.setZero();
+      Dc.setZero();
+      for (int k = 0; k < m_matrix.outerSize(); ++k) {
+        for (typename MatrixType::InnerIterator it(m_matrix, k); it; ++it) {
+          if (Dr(it.row()) < abs(it.value())) Dr(it.row()) = abs(it.value());
+
+          if (Dc(it.col()) < abs(it.value())) Dc(it.col()) = abs(it.value());
         }
-        for (int i = 0; i < m; ++i) 
-        {
-          Dr(i) = std::sqrt(Dr(i));
+      }
+      for (int i = 0; i < m; ++i) {
+        Dr(i) = std::sqrt(Dr(i));
+      }
+      for (int i = 0; i < n; ++i) {
+        Dc(i) = std::sqrt(Dc(i));
+      }
+      // Save the scaling factors
+      for (int i = 0; i < m; ++i) {
+        m_left(i) /= Dr(i);
+      }
+      for (int i = 0; i < n; ++i) {
+        m_right(i) /= Dc(i);
+      }
+      // Scale the rows and the columns of the matrix
+      DrRes.setZero();
+      DcRes.setZero();
+      for (int k = 0; k < m_matrix.outerSize(); ++k) {
+        for (typename MatrixType::InnerIterator it(m_matrix, k); it; ++it) {
+          it.valueRef() = it.value() / (Dr(it.row()) * Dc(it.col()));
+          // Accumulate the norms of the row and column vectors
+          if (DrRes(it.row()) < abs(it.value())) DrRes(it.row()) = abs(it.value());
+
+          if (DcRes(it.col()) < abs(it.value())) DcRes(it.col()) = abs(it.value());
         }
-        for (int i = 0; i < n; ++i) 
-        {
-          Dc(i) = std::sqrt(Dc(i));
-        }
-        // Save the scaling factors 
-        for (int i = 0; i < m; ++i) 
-        {
-          m_left(i) /= Dr(i);
-        }
-        for (int i = 0; i < n; ++i) 
-        {
-          m_right(i) /= Dc(i);
-        }
-        // Scale the rows and the columns of the matrix
-        DrRes.setZero(); DcRes.setZero(); 
-        for (int k=0; k<m_matrix.outerSize(); ++k)
-        {
-          for (typename MatrixType::InnerIterator it(m_matrix, k); it; ++it)
-          {
-            it.valueRef() = it.value()/( Dr(it.row()) * Dc(it.col()) );
-            // Accumulate the norms of the row and column vectors   
-            if ( DrRes(it.row()) < abs(it.value()) )
-              DrRes(it.row()) = abs(it.value());
-            
-            if ( DcRes(it.col()) < abs(it.value()) )
-              DcRes(it.col()) = abs(it.value());
-          }
-        }  
-        DrRes.array() = (1-DrRes.array()).abs();
-        EpsRow = DrRes.maxCoeff();
-        DcRes.array() = (1-DcRes.array()).abs();
-        EpsCol = DcRes.maxCoeff();
-        its++;
-      }while ( (EpsRow >m_tol || EpsCol > m_tol) && (its < m_maxits) );
-      m_isInitialized = true;
-    }
-    /** Compute the left and right vectors to scale the vectors
-     * the input matrix is scaled with the computed vectors at output
-     * 
-     * \sa compute()
-     */
-    void computeRef (MatrixType& mat)
-    {
-      compute (mat);
-      mat = m_matrix;
-    }
-    /** Get the vector to scale the rows of the matrix 
-     */
-    VectorXd& LeftScaling()
-    {
-      return m_left;
-    }
-    
-    /** Get the vector to scale the columns of the matrix 
-     */
-    VectorXd& RightScaling()
-    {
-      return m_right;
-    }
-    
-    /** Set the tolerance for the convergence of the iterative scaling algorithm
-     */
-    void setTolerance(double tol)
-    {
-      m_tol = tol; 
-    }
-      
-  protected:
-    
-    void init()
-    {
-      m_tol = 1e-10;
-      m_maxits = 5;
-      m_isInitialized = false;
-    }
-    
-    MatrixType m_matrix;
-    mutable ComputationInfo m_info; 
-    bool m_isInitialized; 
-    VectorXd m_left; // Left scaling vector
-    VectorXd m_right; // m_right scaling vector
-    double m_tol; 
-    int m_maxits; // Maximum number of iterations allowed
+      }
+      DrRes.array() = (1 - DrRes.array()).abs();
+      EpsRow = DrRes.maxCoeff();
+      DcRes.array() = (1 - DcRes.array()).abs();
+      EpsCol = DcRes.maxCoeff();
+      its++;
+    } while ((EpsRow > m_tol || EpsCol > m_tol) && (its < m_maxits));
+    m_isInitialized = true;
+  }
+  /** Compute the left and right vectors to scale the vectors
+   * the input matrix is scaled with the computed vectors at output
+   *
+   * \sa compute()
+   */
+  void computeRef(MatrixType& mat) {
+    compute(mat);
+    mat = m_matrix;
+  }
+  /** Get the vector to scale the rows of the matrix
+   */
+  VectorXd& LeftScaling() { return m_left; }
+
+  /** Get the vector to scale the columns of the matrix
+   */
+  VectorXd& RightScaling() { return m_right; }
+
+  /** Set the tolerance for the convergence of the iterative scaling algorithm
+   */
+  void setTolerance(double tol) { m_tol = tol; }
+
+ protected:
+  void init() {
+    m_tol = 1e-10;
+    m_maxits = 5;
+    m_isInitialized = false;
+  }
+
+  MatrixType m_matrix;
+  mutable ComputationInfo m_info;
+  bool m_isInitialized;
+  VectorXd m_left;   // Left scaling vector
+  VectorXd m_right;  // m_right scaling vector
+  double m_tol;
+  int m_maxits;  // Maximum number of iterations allowed
 };
-}
+}  // namespace Eigen
 #endif
diff --git a/unsupported/Eigen/src/KroneckerProduct/InternalHeaderCheck.h b/unsupported/Eigen/src/KroneckerProduct/InternalHeaderCheck.h
index 3db2edc..3cf30d9 100644
--- a/unsupported/Eigen/src/KroneckerProduct/InternalHeaderCheck.h
+++ b/unsupported/Eigen/src/KroneckerProduct/InternalHeaderCheck.h
@@ -1,3 +1,4 @@
 #ifndef EIGEN_KRONECKER_PRODUCT_MODULE_H
-#error "Please include unsupported/Eigen/KroneckerProduct instead of including headers inside the src directory directly."
+#error \
+    "Please include unsupported/Eigen/KroneckerProduct instead of including headers inside the src directory directly."
 #endif
diff --git a/unsupported/Eigen/src/KroneckerProduct/KroneckerTensorProduct.h b/unsupported/Eigen/src/KroneckerProduct/KroneckerTensorProduct.h
index 2843a6d..1d29f2f 100644
--- a/unsupported/Eigen/src/KroneckerProduct/KroneckerTensorProduct.h
+++ b/unsupported/Eigen/src/KroneckerProduct/KroneckerTensorProduct.h
@@ -24,49 +24,43 @@
  *
  * \tparam Derived is the derived type.
  */
-template<typename Derived>
-class KroneckerProductBase : public ReturnByValue<Derived>
-{
-  private:
-    typedef typename internal::traits<Derived> Traits;
-    typedef typename Traits::Scalar Scalar;
+template <typename Derived>
+class KroneckerProductBase : public ReturnByValue<Derived> {
+ private:
+  typedef typename internal::traits<Derived> Traits;
+  typedef typename Traits::Scalar Scalar;
 
-  protected:
-    typedef typename Traits::Lhs Lhs;
-    typedef typename Traits::Rhs Rhs;
+ protected:
+  typedef typename Traits::Lhs Lhs;
+  typedef typename Traits::Rhs Rhs;
 
-  public:
-    /*! \brief Constructor. */
-    KroneckerProductBase(const Lhs& A, const Rhs& B)
-      : m_A(A), m_B(B)
-    {}
+ public:
+  /*! \brief Constructor. */
+  KroneckerProductBase(const Lhs& A, const Rhs& B) : m_A(A), m_B(B) {}
 
-    inline Index rows() const { return m_A.rows() * m_B.rows(); }
-    inline Index cols() const { return m_A.cols() * m_B.cols(); }
+  inline Index rows() const { return m_A.rows() * m_B.rows(); }
+  inline Index cols() const { return m_A.cols() * m_B.cols(); }
 
-    /*!
-     * This overrides ReturnByValue::coeff because this function is
-     * efficient enough.
-     */
-    Scalar coeff(Index row, Index col) const
-    {
-      return m_A.coeff(row / m_B.rows(), col / m_B.cols()) *
-             m_B.coeff(row % m_B.rows(), col % m_B.cols());
-    }
+  /*!
+   * This overrides ReturnByValue::coeff because this function is
+   * efficient enough.
+   */
+  Scalar coeff(Index row, Index col) const {
+    return m_A.coeff(row / m_B.rows(), col / m_B.cols()) * m_B.coeff(row % m_B.rows(), col % m_B.cols());
+  }
 
-    /*!
-     * This overrides ReturnByValue::coeff because this function is
-     * efficient enough.
-     */
-    Scalar coeff(Index i) const
-    {
-      EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
-      return m_A.coeff(i / m_A.size()) * m_B.coeff(i % m_A.size());
-    }
+  /*!
+   * This overrides ReturnByValue::coeff because this function is
+   * efficient enough.
+   */
+  Scalar coeff(Index i) const {
+    EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
+    return m_A.coeff(i / m_A.size()) * m_B.coeff(i % m_A.size());
+  }
 
-  protected:
-    typename Lhs::Nested m_A;
-    typename Rhs::Nested m_B;
+ protected:
+  typename Lhs::Nested m_A;
+  typename Rhs::Nested m_B;
 };
 
 /*!
@@ -81,22 +75,20 @@
  * \tparam Lhs  Type of the left-hand side, a matrix expression.
  * \tparam Rhs  Type of the rignt-hand side, a matrix expression.
  */
-template<typename Lhs, typename Rhs>
-class KroneckerProduct : public KroneckerProductBase<KroneckerProduct<Lhs,Rhs> >
-{
-  private:
-    typedef KroneckerProductBase<KroneckerProduct> Base;
-    using Base::m_A;
-    using Base::m_B;
+template <typename Lhs, typename Rhs>
+class KroneckerProduct : public KroneckerProductBase<KroneckerProduct<Lhs, Rhs> > {
+ private:
+  typedef KroneckerProductBase<KroneckerProduct> Base;
+  using Base::m_A;
+  using Base::m_B;
 
-  public:
-    /*! \brief Constructor. */
-    KroneckerProduct(const Lhs& A, const Rhs& B)
-      : Base(A, B)
-    {}
+ public:
+  /*! \brief Constructor. */
+  KroneckerProduct(const Lhs& A, const Rhs& B) : Base(A, B) {}
 
-    /*! \brief Evaluate the Kronecker tensor product. */
-    template<typename Dest> void evalTo(Dest& dst) const;
+  /*! \brief Evaluate the Kronecker tensor product. */
+  template <typename Dest>
+  void evalTo(Dest& dst) const;
 };
 
 /*!
@@ -114,85 +106,72 @@
  * \tparam Lhs  Type of the left-hand side, a matrix expression.
  * \tparam Rhs  Type of the rignt-hand side, a matrix expression.
  */
-template<typename Lhs, typename Rhs>
-class KroneckerProductSparse : public KroneckerProductBase<KroneckerProductSparse<Lhs,Rhs> >
-{
-  private:
-    typedef KroneckerProductBase<KroneckerProductSparse> Base;
-    using Base::m_A;
-    using Base::m_B;
+template <typename Lhs, typename Rhs>
+class KroneckerProductSparse : public KroneckerProductBase<KroneckerProductSparse<Lhs, Rhs> > {
+ private:
+  typedef KroneckerProductBase<KroneckerProductSparse> Base;
+  using Base::m_A;
+  using Base::m_B;
 
-  public:
-    /*! \brief Constructor. */
-    KroneckerProductSparse(const Lhs& A, const Rhs& B)
-      : Base(A, B)
-    {}
+ public:
+  /*! \brief Constructor. */
+  KroneckerProductSparse(const Lhs& A, const Rhs& B) : Base(A, B) {}
 
-    /*! \brief Evaluate the Kronecker tensor product. */
-    template<typename Dest> void evalTo(Dest& dst) const;
+  /*! \brief Evaluate the Kronecker tensor product. */
+  template <typename Dest>
+  void evalTo(Dest& dst) const;
 };
 
-template<typename Lhs, typename Rhs>
-template<typename Dest>
-void KroneckerProduct<Lhs,Rhs>::evalTo(Dest& dst) const
-{
-  const int BlockRows = Rhs::RowsAtCompileTime,
-            BlockCols = Rhs::ColsAtCompileTime;
-  const Index Br = m_B.rows(),
-              Bc = m_B.cols();
-  for (Index i=0; i < m_A.rows(); ++i)
-    for (Index j=0; j < m_A.cols(); ++j)
-      Block<Dest,BlockRows,BlockCols>(dst,i*Br,j*Bc,Br,Bc) = m_A.coeff(i,j) * m_B;
+template <typename Lhs, typename Rhs>
+template <typename Dest>
+void KroneckerProduct<Lhs, Rhs>::evalTo(Dest& dst) const {
+  const int BlockRows = Rhs::RowsAtCompileTime, BlockCols = Rhs::ColsAtCompileTime;
+  const Index Br = m_B.rows(), Bc = m_B.cols();
+  for (Index i = 0; i < m_A.rows(); ++i)
+    for (Index j = 0; j < m_A.cols(); ++j)
+      Block<Dest, BlockRows, BlockCols>(dst, i * Br, j * Bc, Br, Bc) = m_A.coeff(i, j) * m_B;
 }
 
-template<typename Lhs, typename Rhs>
-template<typename Dest>
-void KroneckerProductSparse<Lhs,Rhs>::evalTo(Dest& dst) const
-{
+template <typename Lhs, typename Rhs>
+template <typename Dest>
+void KroneckerProductSparse<Lhs, Rhs>::evalTo(Dest& dst) const {
   Index Br = m_B.rows(), Bc = m_B.cols();
   dst.resize(this->rows(), this->cols());
   dst.resizeNonZeros(0);
-  
+
   // 1 - evaluate the operands if needed:
-  typedef typename internal::nested_eval<Lhs,Dynamic>::type Lhs1;
+  typedef typename internal::nested_eval<Lhs, Dynamic>::type Lhs1;
   typedef internal::remove_all_t<Lhs1> Lhs1Cleaned;
   const Lhs1 lhs1(m_A);
-  typedef typename internal::nested_eval<Rhs,Dynamic>::type Rhs1;
+  typedef typename internal::nested_eval<Rhs, Dynamic>::type Rhs1;
   typedef internal::remove_all_t<Rhs1> Rhs1Cleaned;
   const Rhs1 rhs1(m_B);
-    
+
   // 2 - construct respective iterators
   typedef Eigen::InnerIterator<Lhs1Cleaned> LhsInnerIterator;
   typedef Eigen::InnerIterator<Rhs1Cleaned> RhsInnerIterator;
-  
+
   // compute number of non-zeros per innervectors of dst
   {
     // TODO VectorXi is not necessarily big enough!
     VectorXi nnzA = VectorXi::Zero(Dest::IsRowMajor ? m_A.rows() : m_A.cols());
-    for (Index kA=0; kA < m_A.outerSize(); ++kA)
-      for (LhsInnerIterator itA(lhs1,kA); itA; ++itA)
-        nnzA(Dest::IsRowMajor ? itA.row() : itA.col())++;
-      
+    for (Index kA = 0; kA < m_A.outerSize(); ++kA)
+      for (LhsInnerIterator itA(lhs1, kA); itA; ++itA) nnzA(Dest::IsRowMajor ? itA.row() : itA.col())++;
+
     VectorXi nnzB = VectorXi::Zero(Dest::IsRowMajor ? m_B.rows() : m_B.cols());
-    for (Index kB=0; kB < m_B.outerSize(); ++kB)
-      for (RhsInnerIterator itB(rhs1,kB); itB; ++itB)
-        nnzB(Dest::IsRowMajor ? itB.row() : itB.col())++;
-    
-    Matrix<int,Dynamic,Dynamic,ColMajor> nnzAB = nnzB * nnzA.transpose();
+    for (Index kB = 0; kB < m_B.outerSize(); ++kB)
+      for (RhsInnerIterator itB(rhs1, kB); itB; ++itB) nnzB(Dest::IsRowMajor ? itB.row() : itB.col())++;
+
+    Matrix<int, Dynamic, Dynamic, ColMajor> nnzAB = nnzB * nnzA.transpose();
     dst.reserve(VectorXi::Map(nnzAB.data(), nnzAB.size()));
   }
 
-  for (Index kA=0; kA < m_A.outerSize(); ++kA)
-  {
-    for (Index kB=0; kB < m_B.outerSize(); ++kB)
-    {
-      for (LhsInnerIterator itA(lhs1,kA); itA; ++itA)
-      {
-        for (RhsInnerIterator itB(rhs1,kB); itB; ++itB)
-        {
-          Index i = itA.row() * Br + itB.row(),
-                j = itA.col() * Bc + itB.col();
-          dst.insert(i,j) = itA.value() * itB.value();
+  for (Index kA = 0; kA < m_A.outerSize(); ++kA) {
+    for (Index kB = 0; kB < m_B.outerSize(); ++kB) {
+      for (LhsInnerIterator itA(lhs1, kA); itA; ++itA) {
+        for (RhsInnerIterator itB(rhs1, kB); itB; ++itB) {
+          Index i = itA.row() * Br + itB.row(), j = itA.col() * Bc + itB.col();
+          dst.insert(i, j) = itA.value() * itB.value();
         }
       }
     }
@@ -201,9 +180,8 @@
 
 namespace internal {
 
-template<typename Lhs_, typename Rhs_>
-struct traits<KroneckerProduct<Lhs_,Rhs_> >
-{
+template <typename Lhs_, typename Rhs_>
+struct traits<KroneckerProduct<Lhs_, Rhs_> > {
   typedef remove_all_t<Lhs_> Lhs;
   typedef remove_all_t<Rhs_> Rhs;
   typedef typename ScalarBinaryOpTraits<typename Lhs::Scalar, typename Rhs::Scalar>::ReturnType Scalar;
@@ -216,17 +194,18 @@
     MaxCols = size_at_compile_time(traits<Lhs>::MaxColsAtCompileTime, traits<Rhs>::MaxColsAtCompileTime)
   };
 
-  typedef Matrix<Scalar,Rows,Cols> ReturnType;
+  typedef Matrix<Scalar, Rows, Cols> ReturnType;
 };
 
-template<typename Lhs_, typename Rhs_>
-struct traits<KroneckerProductSparse<Lhs_,Rhs_> >
-{
+template <typename Lhs_, typename Rhs_>
+struct traits<KroneckerProductSparse<Lhs_, Rhs_> > {
   typedef MatrixXpr XprKind;
   typedef remove_all_t<Lhs_> Lhs;
   typedef remove_all_t<Rhs_> Rhs;
   typedef typename ScalarBinaryOpTraits<typename Lhs::Scalar, typename Rhs::Scalar>::ReturnType Scalar;
-  typedef typename cwise_promote_storage_type<typename traits<Lhs>::StorageKind, typename traits<Rhs>::StorageKind, scalar_product_op<typename Lhs::Scalar, typename Rhs::Scalar> >::ret StorageKind;
+  typedef typename cwise_promote_storage_type<typename traits<Lhs>::StorageKind, typename traits<Rhs>::StorageKind,
+                                              scalar_product_op<typename Lhs::Scalar, typename Rhs::Scalar> >::ret
+      StorageKind;
   typedef typename promote_index_type<typename Lhs::StorageIndex, typename Rhs::StorageIndex>::type StorageIndex;
 
   enum {
@@ -241,15 +220,14 @@
     EvalToRowMajor = (int(LhsFlags) & int(RhsFlags) & RowMajorBit),
     RemovedBits = ~(EvalToRowMajor ? 0 : RowMajorBit),
 
-    Flags = ((int(LhsFlags) | int(RhsFlags)) & HereditaryBits & RemovedBits)
-          | EvalBeforeNestingBit,
+    Flags = ((int(LhsFlags) | int(RhsFlags)) & HereditaryBits & RemovedBits) | EvalBeforeNestingBit,
     CoeffReadCost = HugeCost
   };
 
   typedef SparseMatrix<Scalar, 0, StorageIndex> ReturnType;
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /*!
  * \ingroup KroneckerProduct_Module
@@ -270,9 +248,8 @@
  * \param b  Dense matrix b
  * \return   Kronecker tensor product of a and b
  */
-template<typename A, typename B>
-KroneckerProduct<A,B> kroneckerProduct(const MatrixBase<A>& a, const MatrixBase<B>& b)
-{
+template <typename A, typename B>
+KroneckerProduct<A, B> kroneckerProduct(const MatrixBase<A>& a, const MatrixBase<B>& b) {
   return KroneckerProduct<A, B>(a.derived(), b.derived());
 }
 
@@ -297,12 +274,11 @@
  * \return   Kronecker tensor product of a and b, stored in a sparse
  *           matrix
  */
-template<typename A, typename B>
-KroneckerProductSparse<A,B> kroneckerProduct(const EigenBase<A>& a, const EigenBase<B>& b)
-{
-  return KroneckerProductSparse<A,B>(a.derived(), b.derived());
+template <typename A, typename B>
+KroneckerProductSparse<A, B> kroneckerProduct(const EigenBase<A>& a, const EigenBase<B>& b) {
+  return KroneckerProductSparse<A, B>(a.derived(), b.derived());
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // KRONECKER_TENSOR_PRODUCT_H
+#endif  // KRONECKER_TENSOR_PRODUCT_H
diff --git a/unsupported/Eigen/src/LevenbergMarquardt/InternalHeaderCheck.h b/unsupported/Eigen/src/LevenbergMarquardt/InternalHeaderCheck.h
index bc76f4e..a9a646f 100644
--- a/unsupported/Eigen/src/LevenbergMarquardt/InternalHeaderCheck.h
+++ b/unsupported/Eigen/src/LevenbergMarquardt/InternalHeaderCheck.h
@@ -1,3 +1,4 @@
 #ifndef EIGEN_LEVENBERGMARQUARDT_MODULE_H
-#error "Please include unsupported/Eigen/LevenbergMarquardt instead of including headers inside the src directory directly."
+#error \
+    "Please include unsupported/Eigen/LevenbergMarquardt instead of including headers inside the src directory directly."
 #endif
diff --git a/unsupported/Eigen/src/LevenbergMarquardt/LMcovar.h b/unsupported/Eigen/src/LevenbergMarquardt/LMcovar.h
index 20588ac..b81d5a3 100644
--- a/unsupported/Eigen/src/LevenbergMarquardt/LMcovar.h
+++ b/unsupported/Eigen/src/LevenbergMarquardt/LMcovar.h
@@ -15,73 +15,66 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
 template <typename Scalar>
-void covar(
-        Matrix< Scalar, Dynamic, Dynamic > &r,
-        const VectorXi& ipvt,
-        Scalar tol = std::sqrt(NumTraits<Scalar>::epsilon()) )
-{
-    using std::abs;
-    /* Local variables */
-    Index i, j, k, l, ii, jj;
-    bool sing;
-    Scalar temp;
+void covar(Matrix<Scalar, Dynamic, Dynamic>& r, const VectorXi& ipvt,
+           Scalar tol = std::sqrt(NumTraits<Scalar>::epsilon())) {
+  using std::abs;
+  /* Local variables */
+  Index i, j, k, l, ii, jj;
+  bool sing;
+  Scalar temp;
 
-    /* Function Body */
-    const Index n = r.cols();
-    const Scalar tolr = tol * abs(r(0,0));
-    Matrix< Scalar, Dynamic, 1 > wa(n);
-    eigen_assert(ipvt.size()==n);
+  /* Function Body */
+  const Index n = r.cols();
+  const Scalar tolr = tol * abs(r(0, 0));
+  Matrix<Scalar, Dynamic, 1> wa(n);
+  eigen_assert(ipvt.size() == n);
 
-    /* form the inverse of r in the full upper triangle of r. */
-    l = -1;
-    for (k = 0; k < n; ++k)
-        if (abs(r(k,k)) > tolr) {
-            r(k,k) = 1. / r(k,k);
-            for (j = 0; j <= k-1; ++j) {
-                temp = r(k,k) * r(j,k);
-                r(j,k) = 0.;
-                r.col(k).head(j+1) -= r.col(j).head(j+1) * temp;
-            }
-            l = k;
-        }
-
-    /* form the full upper triangle of the inverse of (r transpose)*r */
-    /* in the full upper triangle of r. */
-    for (k = 0; k <= l; ++k) {
-        for (j = 0; j <= k-1; ++j)
-            r.col(j).head(j+1) += r.col(k).head(j+1) * r(j,k);
-        r.col(k).head(k+1) *= r(k,k);
+  /* form the inverse of r in the full upper triangle of r. */
+  l = -1;
+  for (k = 0; k < n; ++k)
+    if (abs(r(k, k)) > tolr) {
+      r(k, k) = 1. / r(k, k);
+      for (j = 0; j <= k - 1; ++j) {
+        temp = r(k, k) * r(j, k);
+        r(j, k) = 0.;
+        r.col(k).head(j + 1) -= r.col(j).head(j + 1) * temp;
+      }
+      l = k;
     }
 
-    /* form the full lower triangle of the covariance matrix */
-    /* in the strict lower triangle of r and in wa. */
-    for (j = 0; j < n; ++j) {
-        jj = ipvt[j];
-        sing = j > l;
-        for (i = 0; i <= j; ++i) {
-            if (sing)
-                r(i,j) = 0.;
-            ii = ipvt[i];
-            if (ii > jj)
-                r(ii,jj) = r(i,j);
-            if (ii < jj)
-                r(jj,ii) = r(i,j);
-        }
-        wa[jj] = r(j,j);
-    }
+  /* form the full upper triangle of the inverse of (r transpose)*r */
+  /* in the full upper triangle of r. */
+  for (k = 0; k <= l; ++k) {
+    for (j = 0; j <= k - 1; ++j) r.col(j).head(j + 1) += r.col(k).head(j + 1) * r(j, k);
+    r.col(k).head(k + 1) *= r(k, k);
+  }
 
-    /* symmetrize the covariance matrix in r. */
-    r.topLeftCorner(n,n).template triangularView<StrictlyUpper>() = r.topLeftCorner(n,n).transpose();
-    r.diagonal() = wa;
+  /* form the full lower triangle of the covariance matrix */
+  /* in the strict lower triangle of r and in wa. */
+  for (j = 0; j < n; ++j) {
+    jj = ipvt[j];
+    sing = j > l;
+    for (i = 0; i <= j; ++i) {
+      if (sing) r(i, j) = 0.;
+      ii = ipvt[i];
+      if (ii > jj) r(ii, jj) = r(i, j);
+      if (ii < jj) r(jj, ii) = r(i, j);
+    }
+    wa[jj] = r(j, j);
+  }
+
+  /* symmetrize the covariance matrix in r. */
+  r.topLeftCorner(n, n).template triangularView<StrictlyUpper>() = r.topLeftCorner(n, n).transpose();
+  r.diagonal() = wa;
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_LMCOVAR_H
+#endif  // EIGEN_LMCOVAR_H
diff --git a/unsupported/Eigen/src/LevenbergMarquardt/LMonestep.h b/unsupported/Eigen/src/LevenbergMarquardt/LMonestep.h
index a188fb7..f0697ce 100644
--- a/unsupported/Eigen/src/LevenbergMarquardt/LMonestep.h
+++ b/unsupported/Eigen/src/LevenbergMarquardt/LMonestep.h
@@ -19,32 +19,30 @@
 
 namespace Eigen {
 
-template<typename FunctorType>
-LevenbergMarquardtSpace::Status
-LevenbergMarquardt<FunctorType>::minimizeOneStep(FVectorType  &x)
-{
+template <typename FunctorType>
+LevenbergMarquardtSpace::Status LevenbergMarquardt<FunctorType>::minimizeOneStep(FVectorType &x) {
   using std::abs;
   using std::sqrt;
-  RealScalar temp, temp1,temp2; 
-  RealScalar ratio; 
+  RealScalar temp, temp1, temp2;
+  RealScalar ratio;
   RealScalar pnorm, xnorm, fnorm1, actred, dirder, prered;
-  eigen_assert(x.size()==n); // check the caller is not cheating us
+  eigen_assert(x.size() == n);  // check the caller is not cheating us
 
-  temp = 0.0; xnorm = 0.0;
+  temp = 0.0;
+  xnorm = 0.0;
   /* calculate the jacobian matrix. */
   Index df_ret = m_functor.df(x, m_fjac);
-  if (df_ret<0)
-      return LevenbergMarquardtSpace::UserAsked;
-  if (df_ret>0)
-      // numerical diff, we evaluated the function df_ret times
-      m_nfev += df_ret;
-  else m_njev++;
+  if (df_ret < 0) return LevenbergMarquardtSpace::UserAsked;
+  if (df_ret > 0)
+    // numerical diff, we evaluated the function df_ret times
+    m_nfev += df_ret;
+  else
+    m_njev++;
 
   /* compute the qr factorization of the jacobian. */
-  for (int j = 0; j < x.size(); ++j)
-    m_wa2(j) = m_fjac.col(j).blueNorm();
+  for (int j = 0; j < x.size(); ++j) m_wa2(j) = m_fjac.col(j).blueNorm();
   QRSolver qrfac(m_fjac);
-  if(qrfac.info() != Success) {
+  if (qrfac.info() != Success) {
     m_info = NumericalIssue;
     return LevenbergMarquardtSpace::ImproperInputParameters;
   }
@@ -55,30 +53,29 @@
   /* on the first iteration and if external scaling is not used, scale according */
   /* to the norms of the columns of the initial jacobian. */
   if (m_iter == 1) {
-      if (!m_useExternalScaling)
-          for (Index j = 0; j < n; ++j)
-              m_diag[j] = (m_wa2[j]==0.)? 1. : m_wa2[j];
+    if (!m_useExternalScaling)
+      for (Index j = 0; j < n; ++j) m_diag[j] = (m_wa2[j] == 0.) ? 1. : m_wa2[j];
 
-      /* on the first iteration, calculate the norm of the scaled x */
-      /* and initialize the step bound m_delta. */
-      xnorm = m_diag.cwiseProduct(x).stableNorm();
-      m_delta = m_factor * xnorm;
-      if (m_delta == 0.)
-          m_delta = m_factor;
+    /* on the first iteration, calculate the norm of the scaled x */
+    /* and initialize the step bound m_delta. */
+    xnorm = m_diag.cwiseProduct(x).stableNorm();
+    m_delta = m_factor * xnorm;
+    if (m_delta == 0.) m_delta = m_factor;
   }
 
   /* form (q transpose)*m_fvec and store the first n components in */
   /* m_qtf. */
   m_wa4 = m_fvec;
-  m_wa4 = qrfac.matrixQ().adjoint() * m_fvec; 
+  m_wa4 = qrfac.matrixQ().adjoint() * m_fvec;
   m_qtf = m_wa4.head(n);
 
   /* compute the norm of the scaled gradient. */
   m_gnorm = 0.;
   if (m_fnorm != 0.)
-      for (Index j = 0; j < n; ++j)
-          if (m_wa2[m_permutation.indices()[j]] != 0.)
-              m_gnorm = (std::max)(m_gnorm, abs( m_rfactor.col(j).head(j+1).dot(m_qtf.head(j+1)/m_fnorm) / m_wa2[m_permutation.indices()[j]]));
+    for (Index j = 0; j < n; ++j)
+      if (m_wa2[m_permutation.indices()[j]] != 0.)
+        m_gnorm = (std::max)(m_gnorm, abs(m_rfactor.col(j).head(j + 1).dot(m_qtf.head(j + 1) / m_fnorm) /
+                                          m_wa2[m_permutation.indices()[j]]));
 
   /* test for convergence of the gradient norm. */
   if (m_gnorm <= m_gtol) {
@@ -87,8 +84,7 @@
   }
 
   /* rescale if necessary. */
-  if (!m_useExternalScaling)
-      m_diag = m_diag.cwiseMax(m_wa2);
+  if (!m_useExternalScaling) m_diag = m_diag.cwiseMax(m_wa2);
 
   do {
     /* determine the levenberg-marquardt parameter. */
@@ -100,23 +96,20 @@
     pnorm = m_diag.cwiseProduct(m_wa1).stableNorm();
 
     /* on the first iteration, adjust the initial step bound. */
-    if (m_iter == 1)
-        m_delta = (std::min)(m_delta,pnorm);
+    if (m_iter == 1) m_delta = (std::min)(m_delta, pnorm);
 
     /* evaluate the function at x + p and calculate its norm. */
-    if ( m_functor(m_wa2, m_wa4) < 0)
-        return LevenbergMarquardtSpace::UserAsked;
+    if (m_functor(m_wa2, m_wa4) < 0) return LevenbergMarquardtSpace::UserAsked;
     ++m_nfev;
     fnorm1 = m_wa4.stableNorm();
 
     /* compute the scaled actual reduction. */
     actred = -1.;
-    if (Scalar(.1) * fnorm1 < m_fnorm)
-        actred = 1. - numext::abs2(fnorm1 / m_fnorm);
+    if (Scalar(.1) * fnorm1 < m_fnorm) actred = 1. - numext::abs2(fnorm1 / m_fnorm);
 
     /* compute the scaled predicted reduction and */
     /* the scaled directional derivative. */
-    m_wa3 = m_rfactor.template triangularView<Upper>() * (m_permutation.inverse() *m_wa1);
+    m_wa3 = m_rfactor.template triangularView<Upper>() * (m_permutation.inverse() * m_wa1);
     temp1 = numext::abs2(m_wa3.stableNorm() / m_fnorm);
     temp2 = numext::abs2(sqrt(m_par) * pnorm / m_fnorm);
     prered = temp1 + temp2 / Scalar(.5);
@@ -125,71 +118,61 @@
     /* compute the ratio of the actual to the predicted */
     /* reduction. */
     ratio = 0.;
-    if (prered != 0.)
-        ratio = actred / prered;
+    if (prered != 0.) ratio = actred / prered;
 
     /* update the step bound. */
     if (ratio <= Scalar(.25)) {
-        if (actred >= 0.)
-            temp = RealScalar(.5);
-        if (actred < 0.)
-            temp = RealScalar(.5) * dirder / (dirder + RealScalar(.5) * actred);
-        if (RealScalar(.1) * fnorm1 >= m_fnorm || temp < RealScalar(.1))
-            temp = Scalar(.1);
-        /* Computing MIN */
-        m_delta = temp * (std::min)(m_delta, pnorm / RealScalar(.1));
-        m_par /= temp;
+      if (actred >= 0.) temp = RealScalar(.5);
+      if (actred < 0.) temp = RealScalar(.5) * dirder / (dirder + RealScalar(.5) * actred);
+      if (RealScalar(.1) * fnorm1 >= m_fnorm || temp < RealScalar(.1)) temp = Scalar(.1);
+      /* Computing MIN */
+      m_delta = temp * (std::min)(m_delta, pnorm / RealScalar(.1));
+      m_par /= temp;
     } else if (!(m_par != 0. && ratio < RealScalar(.75))) {
-        m_delta = pnorm / RealScalar(.5);
-        m_par = RealScalar(.5) * m_par;
+      m_delta = pnorm / RealScalar(.5);
+      m_par = RealScalar(.5) * m_par;
     }
 
     /* test for successful iteration. */
     if (ratio >= RealScalar(1e-4)) {
-        /* successful iteration. update x, m_fvec, and their norms. */
-        x = m_wa2;
-        m_wa2 = m_diag.cwiseProduct(x);
-        m_fvec = m_wa4;
-        xnorm = m_wa2.stableNorm();
-        m_fnorm = fnorm1;
-        ++m_iter;
+      /* successful iteration. update x, m_fvec, and their norms. */
+      x = m_wa2;
+      m_wa2 = m_diag.cwiseProduct(x);
+      m_fvec = m_wa4;
+      xnorm = m_wa2.stableNorm();
+      m_fnorm = fnorm1;
+      ++m_iter;
     }
 
     /* tests for convergence. */
-    if (abs(actred) <= m_ftol && prered <= m_ftol && Scalar(.5) * ratio <= 1. && m_delta <= m_xtol * xnorm)
-    {
-       m_info = Success;
+    if (abs(actred) <= m_ftol && prered <= m_ftol && Scalar(.5) * ratio <= 1. && m_delta <= m_xtol * xnorm) {
+      m_info = Success;
       return LevenbergMarquardtSpace::RelativeErrorAndReductionTooSmall;
     }
-    if (abs(actred) <= m_ftol && prered <= m_ftol && Scalar(.5) * ratio <= 1.) 
-    {
+    if (abs(actred) <= m_ftol && prered <= m_ftol && Scalar(.5) * ratio <= 1.) {
       m_info = Success;
       return LevenbergMarquardtSpace::RelativeReductionTooSmall;
     }
-    if (m_delta <= m_xtol * xnorm)
-    {
+    if (m_delta <= m_xtol * xnorm) {
       m_info = Success;
       return LevenbergMarquardtSpace::RelativeErrorTooSmall;
     }
 
     /* tests for termination and stringent tolerances. */
-    if (m_nfev >= m_maxfev) 
-    {
+    if (m_nfev >= m_maxfev) {
       m_info = NoConvergence;
       return LevenbergMarquardtSpace::TooManyFunctionEvaluation;
     }
-    if (abs(actred) <= NumTraits<Scalar>::epsilon() && prered <= NumTraits<Scalar>::epsilon() && Scalar(.5) * ratio <= 1.)
-    {
+    if (abs(actred) <= NumTraits<Scalar>::epsilon() && prered <= NumTraits<Scalar>::epsilon() &&
+        Scalar(.5) * ratio <= 1.) {
       m_info = Success;
       return LevenbergMarquardtSpace::FtolTooSmall;
     }
-    if (m_delta <= NumTraits<Scalar>::epsilon() * xnorm) 
-    {
+    if (m_delta <= NumTraits<Scalar>::epsilon() * xnorm) {
       m_info = Success;
       return LevenbergMarquardtSpace::XtolTooSmall;
     }
-    if (m_gnorm <= NumTraits<Scalar>::epsilon())
-    {
+    if (m_gnorm <= NumTraits<Scalar>::epsilon()) {
       m_info = Success;
       return LevenbergMarquardtSpace::GtolTooSmall;
     }
@@ -199,7 +182,6 @@
   return LevenbergMarquardtSpace::Running;
 }
 
-  
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_LMONESTEP_H
+#endif  // EIGEN_LMONESTEP_H
diff --git a/unsupported/Eigen/src/LevenbergMarquardt/LMpar.h b/unsupported/Eigen/src/LevenbergMarquardt/LMpar.h
index 7904c63..01fcfdc 100644
--- a/unsupported/Eigen/src/LevenbergMarquardt/LMpar.h
+++ b/unsupported/Eigen/src/LevenbergMarquardt/LMpar.h
@@ -18,146 +18,132 @@
 namespace Eigen {
 
 namespace internal {
-  
-  template <typename QRSolver, typename VectorType>
-    void lmpar2(
-    const QRSolver &qr,
-    const VectorType  &diag,
-    const VectorType  &qtb,
-    typename VectorType::Scalar m_delta,
-    typename VectorType::Scalar &par,
-    VectorType  &x)
 
-  {
-    using std::sqrt;
-    using std::abs;
-    typedef typename QRSolver::MatrixType MatrixType;
-    typedef typename QRSolver::Scalar Scalar;
-//    typedef typename QRSolver::StorageIndex StorageIndex;
+template <typename QRSolver, typename VectorType>
+void lmpar2(const QRSolver &qr, const VectorType &diag, const VectorType &qtb, typename VectorType::Scalar m_delta,
+            typename VectorType::Scalar &par, VectorType &x)
 
-    /* Local variables */
-    Index j;
-    Scalar fp;
-    Scalar parc, parl;
-    Index iter;
-    Scalar temp, paru;
-    Scalar gnorm;
-    Scalar dxnorm;
-    
-    // Make a copy of the triangular factor. 
-    // This copy is modified during call the qrsolv
-    MatrixType s;
-    s = qr.matrixR();
+{
+  using std::abs;
+  using std::sqrt;
+  typedef typename QRSolver::MatrixType MatrixType;
+  typedef typename QRSolver::Scalar Scalar;
+  //    typedef typename QRSolver::StorageIndex StorageIndex;
 
-    /* Function Body */
-    const Scalar dwarf = (std::numeric_limits<Scalar>::min)();
-    const Index n = qr.matrixR().cols();
-    eigen_assert(n==diag.size());
-    eigen_assert(n==qtb.size());
+  /* Local variables */
+  Index j;
+  Scalar fp;
+  Scalar parc, parl;
+  Index iter;
+  Scalar temp, paru;
+  Scalar gnorm;
+  Scalar dxnorm;
 
-    VectorType  wa1, wa2;
+  // Make a copy of the triangular factor.
+  // This copy is modified during call the qrsolv
+  MatrixType s;
+  s = qr.matrixR();
 
-    /* compute and store in x the gauss-newton direction. if the */
-    /* jacobian is rank-deficient, obtain a least squares solution. */
+  /* Function Body */
+  const Scalar dwarf = (std::numeric_limits<Scalar>::min)();
+  const Index n = qr.matrixR().cols();
+  eigen_assert(n == diag.size());
+  eigen_assert(n == qtb.size());
 
-    //    const Index rank = qr.nonzeroPivots(); // exactly double(0.)
-    const Index rank = qr.rank(); // use a threshold
-    wa1 = qtb;
-    wa1.tail(n-rank).setZero();
-    //FIXME There is no solve in place for sparse triangularView
-    wa1.head(rank) = s.topLeftCorner(rank,rank).template triangularView<Upper>().solve(qtb.head(rank));
+  VectorType wa1, wa2;
 
-    x = qr.colsPermutation()*wa1;
+  /* compute and store in x the gauss-newton direction. if the */
+  /* jacobian is rank-deficient, obtain a least squares solution. */
 
-    /* initialize the iteration counter. */
-    /* evaluate the function at the origin, and test */
-    /* for acceptance of the gauss-newton direction. */
-    iter = 0;
-    wa2 = diag.cwiseProduct(x);
-    dxnorm = wa2.blueNorm();
-    fp = dxnorm - m_delta;
-    if (fp <= Scalar(0.1) * m_delta) {
-      par = 0;
-      return;
-    }
+  //    const Index rank = qr.nonzeroPivots(); // exactly double(0.)
+  const Index rank = qr.rank();  // use a threshold
+  wa1 = qtb;
+  wa1.tail(n - rank).setZero();
+  // FIXME There is no solve in place for sparse triangularView
+  wa1.head(rank) = s.topLeftCorner(rank, rank).template triangularView<Upper>().solve(qtb.head(rank));
 
-    /* if the jacobian is not rank deficient, the newton */
-    /* step provides a lower bound, parl, for the zero of */
-    /* the function. otherwise set this bound to zero. */
-    parl = 0.;
-    if (rank==n) {
-      wa1 = qr.colsPermutation().inverse() *  diag.cwiseProduct(wa2)/dxnorm;
-      s.topLeftCorner(n,n).transpose().template triangularView<Lower>().solveInPlace(wa1);
-      temp = wa1.blueNorm();
-      parl = fp / m_delta / temp / temp;
-    }
+  x = qr.colsPermutation() * wa1;
 
-    /* calculate an upper bound, paru, for the zero of the function. */
-    for (j = 0; j < n; ++j)
-      wa1[j] = s.col(j).head(j+1).dot(qtb.head(j+1)) / diag[qr.colsPermutation().indices()(j)];
-
-    gnorm = wa1.stableNorm();
-    paru = gnorm / m_delta;
-    if (paru == 0.)
-      paru = dwarf / (std::min)(m_delta,Scalar(0.1));
-
-    /* if the input par lies outside of the interval (parl,paru), */
-    /* set par to the closer endpoint. */
-    par = (std::max)(par,parl);
-    par = (std::min)(par,paru);
-    if (par == 0.)
-      par = gnorm / dxnorm;
-
-    /* beginning of an iteration. */
-    while (true) {
-      ++iter;
-
-      /* evaluate the function at the current value of par. */
-      if (par == 0.)
-        par = (std::max)(dwarf,Scalar(.001) * paru); /* Computing MAX */
-      wa1 = sqrt(par)* diag;
-
-      VectorType sdiag(n);
-      lmqrsolv(s, qr.colsPermutation(), wa1, qtb, x, sdiag);
-
-      wa2 = diag.cwiseProduct(x);
-      dxnorm = wa2.blueNorm();
-      temp = fp;
-      fp = dxnorm - m_delta;
-
-      /* if the function is small enough, accept the current value */
-      /* of par. also test for the exceptional cases where parl */
-      /* is zero or the number of iterations has reached 10. */
-      if (abs(fp) <= Scalar(0.1) * m_delta || (parl == 0. && fp <= temp && temp < 0.) || iter == 10)
-        break;
-
-      /* compute the newton correction. */
-      wa1 = qr.colsPermutation().inverse() * diag.cwiseProduct(wa2/dxnorm);
-      // we could almost use this here, but the diagonal is outside qr, in sdiag[]
-      for (j = 0; j < n; ++j) {
-        wa1[j] /= sdiag[j];
-        temp = wa1[j];
-        for (Index i = j+1; i < n; ++i)
-          wa1[i] -= s.coeff(i,j) * temp;
-      }
-      temp = wa1.blueNorm();
-      parc = fp / m_delta / temp / temp;
-
-      /* depending on the sign of the function, update parl or paru. */
-      if (fp > 0.)
-        parl = (std::max)(parl,par);
-      if (fp < 0.)
-        paru = (std::min)(paru,par);
-
-      /* compute an improved estimate for par. */
-      par = (std::max)(parl,par+parc);
-    }
-    if (iter == 0)
-      par = 0.;
+  /* initialize the iteration counter. */
+  /* evaluate the function at the origin, and test */
+  /* for acceptance of the gauss-newton direction. */
+  iter = 0;
+  wa2 = diag.cwiseProduct(x);
+  dxnorm = wa2.blueNorm();
+  fp = dxnorm - m_delta;
+  if (fp <= Scalar(0.1) * m_delta) {
+    par = 0;
     return;
   }
-} // end namespace internal
 
-} // end namespace Eigen
+  /* if the jacobian is not rank deficient, the newton */
+  /* step provides a lower bound, parl, for the zero of */
+  /* the function. otherwise set this bound to zero. */
+  parl = 0.;
+  if (rank == n) {
+    wa1 = qr.colsPermutation().inverse() * diag.cwiseProduct(wa2) / dxnorm;
+    s.topLeftCorner(n, n).transpose().template triangularView<Lower>().solveInPlace(wa1);
+    temp = wa1.blueNorm();
+    parl = fp / m_delta / temp / temp;
+  }
 
-#endif // EIGEN_LMPAR_H
+  /* calculate an upper bound, paru, for the zero of the function. */
+  for (j = 0; j < n; ++j) wa1[j] = s.col(j).head(j + 1).dot(qtb.head(j + 1)) / diag[qr.colsPermutation().indices()(j)];
+
+  gnorm = wa1.stableNorm();
+  paru = gnorm / m_delta;
+  if (paru == 0.) paru = dwarf / (std::min)(m_delta, Scalar(0.1));
+
+  /* if the input par lies outside of the interval (parl,paru), */
+  /* set par to the closer endpoint. */
+  par = (std::max)(par, parl);
+  par = (std::min)(par, paru);
+  if (par == 0.) par = gnorm / dxnorm;
+
+  /* beginning of an iteration. */
+  while (true) {
+    ++iter;
+
+    /* evaluate the function at the current value of par. */
+    if (par == 0.) par = (std::max)(dwarf, Scalar(.001) * paru); /* Computing MAX */
+    wa1 = sqrt(par) * diag;
+
+    VectorType sdiag(n);
+    lmqrsolv(s, qr.colsPermutation(), wa1, qtb, x, sdiag);
+
+    wa2 = diag.cwiseProduct(x);
+    dxnorm = wa2.blueNorm();
+    temp = fp;
+    fp = dxnorm - m_delta;
+
+    /* if the function is small enough, accept the current value */
+    /* of par. also test for the exceptional cases where parl */
+    /* is zero or the number of iterations has reached 10. */
+    if (abs(fp) <= Scalar(0.1) * m_delta || (parl == 0. && fp <= temp && temp < 0.) || iter == 10) break;
+
+    /* compute the newton correction. */
+    wa1 = qr.colsPermutation().inverse() * diag.cwiseProduct(wa2 / dxnorm);
+    // we could almost use this here, but the diagonal is outside qr, in sdiag[]
+    for (j = 0; j < n; ++j) {
+      wa1[j] /= sdiag[j];
+      temp = wa1[j];
+      for (Index i = j + 1; i < n; ++i) wa1[i] -= s.coeff(i, j) * temp;
+    }
+    temp = wa1.blueNorm();
+    parc = fp / m_delta / temp / temp;
+
+    /* depending on the sign of the function, update parl or paru. */
+    if (fp > 0.) parl = (std::max)(parl, par);
+    if (fp < 0.) paru = (std::min)(paru, par);
+
+    /* compute an improved estimate for par. */
+    par = (std::max)(parl, par + parc);
+  }
+  if (iter == 0) par = 0.;
+  return;
+}
+}  // end namespace internal
+
+}  // end namespace Eigen
+
+#endif  // EIGEN_LMPAR_H
diff --git a/unsupported/Eigen/src/LevenbergMarquardt/LMqrsolv.h b/unsupported/Eigen/src/LevenbergMarquardt/LMqrsolv.h
index ba949c4..49bf6e1 100644
--- a/unsupported/Eigen/src/LevenbergMarquardt/LMqrsolv.h
+++ b/unsupported/Eigen/src/LevenbergMarquardt/LMqrsolv.h
@@ -18,174 +18,161 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
-template <typename Scalar,int Rows, int Cols, typename PermIndex>
-void lmqrsolv(
-  Matrix<Scalar,Rows,Cols> &s,
-  const PermutationMatrix<Dynamic,Dynamic,PermIndex> &iPerm,
-  const Matrix<Scalar,Dynamic,1> &diag,
-  const Matrix<Scalar,Dynamic,1> &qtb,
-  Matrix<Scalar,Dynamic,1> &x,
-  Matrix<Scalar,Dynamic,1> &sdiag)
-{
-    /* Local variables */
-    Index i, j, k;
-    Scalar temp;
-    Index n = s.cols();
-    Matrix<Scalar,Dynamic,1>  wa(n);
-    JacobiRotation<Scalar> givens;
+template <typename Scalar, int Rows, int Cols, typename PermIndex>
+void lmqrsolv(Matrix<Scalar, Rows, Cols> &s, const PermutationMatrix<Dynamic, Dynamic, PermIndex> &iPerm,
+              const Matrix<Scalar, Dynamic, 1> &diag, const Matrix<Scalar, Dynamic, 1> &qtb,
+              Matrix<Scalar, Dynamic, 1> &x, Matrix<Scalar, Dynamic, 1> &sdiag) {
+  /* Local variables */
+  Index i, j, k;
+  Scalar temp;
+  Index n = s.cols();
+  Matrix<Scalar, Dynamic, 1> wa(n);
+  JacobiRotation<Scalar> givens;
 
-    /* Function Body */
-    // the following will only change the lower triangular part of s, including
-    // the diagonal, though the diagonal is restored afterward
+  /* Function Body */
+  // the following will only change the lower triangular part of s, including
+  // the diagonal, though the diagonal is restored afterward
 
-    /*     copy r and (q transpose)*b to preserve input and initialize s. */
-    /*     in particular, save the diagonal elements of r in x. */
-    x = s.diagonal();
-    wa = qtb;
-    
-   
-    s.topLeftCorner(n,n).template triangularView<StrictlyLower>() = s.topLeftCorner(n,n).transpose();
-    /*     eliminate the diagonal matrix d using a givens rotation. */
-    for (j = 0; j < n; ++j) {
+  /*     copy r and (q transpose)*b to preserve input and initialize s. */
+  /*     in particular, save the diagonal elements of r in x. */
+  x = s.diagonal();
+  wa = qtb;
 
-        /*        prepare the row of d to be eliminated, locating the */
-        /*        diagonal element using p from the qr factorization. */
-        const PermIndex l = iPerm.indices()(j);
-        if (diag[l] == 0.)
-            break;
-        sdiag.tail(n-j).setZero();
-        sdiag[j] = diag[l];
+  s.topLeftCorner(n, n).template triangularView<StrictlyLower>() = s.topLeftCorner(n, n).transpose();
+  /*     eliminate the diagonal matrix d using a givens rotation. */
+  for (j = 0; j < n; ++j) {
+    /*        prepare the row of d to be eliminated, locating the */
+    /*        diagonal element using p from the qr factorization. */
+    const PermIndex l = iPerm.indices()(j);
+    if (diag[l] == 0.) break;
+    sdiag.tail(n - j).setZero();
+    sdiag[j] = diag[l];
 
-        /*        the transformations to eliminate the row of d */
-        /*        modify only a single element of (q transpose)*b */
-        /*        beyond the first n, which is initially zero. */
-        Scalar qtbpj = 0.;
-        for (k = j; k < n; ++k) {
-            /*           determine a givens rotation which eliminates the */
-            /*           appropriate element in the current row of d. */
-            givens.makeGivens(-s(k,k), sdiag[k]);
+    /*        the transformations to eliminate the row of d */
+    /*        modify only a single element of (q transpose)*b */
+    /*        beyond the first n, which is initially zero. */
+    Scalar qtbpj = 0.;
+    for (k = j; k < n; ++k) {
+      /*           determine a givens rotation which eliminates the */
+      /*           appropriate element in the current row of d. */
+      givens.makeGivens(-s(k, k), sdiag[k]);
 
-            /*           compute the modified diagonal element of r and */
-            /*           the modified element of ((q transpose)*b,0). */
-            s(k,k) = givens.c() * s(k,k) + givens.s() * sdiag[k];
-            temp = givens.c() * wa[k] + givens.s() * qtbpj;
-            qtbpj = -givens.s() * wa[k] + givens.c() * qtbpj;
-            wa[k] = temp;
+      /*           compute the modified diagonal element of r and */
+      /*           the modified element of ((q transpose)*b,0). */
+      s(k, k) = givens.c() * s(k, k) + givens.s() * sdiag[k];
+      temp = givens.c() * wa[k] + givens.s() * qtbpj;
+      qtbpj = -givens.s() * wa[k] + givens.c() * qtbpj;
+      wa[k] = temp;
 
-            /*           accumulate the transformation in the row of s. */
-            for (i = k+1; i<n; ++i) {
-                temp = givens.c() * s(i,k) + givens.s() * sdiag[i];
-                sdiag[i] = -givens.s() * s(i,k) + givens.c() * sdiag[i];
-                s(i,k) = temp;
-            }
-        }
+      /*           accumulate the transformation in the row of s. */
+      for (i = k + 1; i < n; ++i) {
+        temp = givens.c() * s(i, k) + givens.s() * sdiag[i];
+        sdiag[i] = -givens.s() * s(i, k) + givens.c() * sdiag[i];
+        s(i, k) = temp;
+      }
     }
-  
-    /*     solve the triangular system for z. if the system is */
-    /*     singular, then obtain a least squares solution. */
-    Index nsing;
-    for(nsing=0; nsing<n && sdiag[nsing]!=0; nsing++) {}
+  }
 
-    wa.tail(n-nsing).setZero();
-    s.topLeftCorner(nsing, nsing).transpose().template triangularView<Upper>().solveInPlace(wa.head(nsing));
-  
-    // restore
-    sdiag = s.diagonal();
-    s.diagonal() = x;
+  /*     solve the triangular system for z. if the system is */
+  /*     singular, then obtain a least squares solution. */
+  Index nsing;
+  for (nsing = 0; nsing < n && sdiag[nsing] != 0; nsing++) {
+  }
 
-    /* permute the components of z back to components of x. */
-    x = iPerm * wa; 
+  wa.tail(n - nsing).setZero();
+  s.topLeftCorner(nsing, nsing).transpose().template triangularView<Upper>().solveInPlace(wa.head(nsing));
+
+  // restore
+  sdiag = s.diagonal();
+  s.diagonal() = x;
+
+  /* permute the components of z back to components of x. */
+  x = iPerm * wa;
 }
 
 template <typename Scalar, int Options_, typename Index>
-void lmqrsolv(
-  SparseMatrix<Scalar,Options_,Index> &s,
-  const PermutationMatrix<Dynamic,Dynamic> &iPerm,
-  const Matrix<Scalar,Dynamic,1> &diag,
-  const Matrix<Scalar,Dynamic,1> &qtb,
-  Matrix<Scalar,Dynamic,1> &x,
-  Matrix<Scalar,Dynamic,1> &sdiag)
-{
+void lmqrsolv(SparseMatrix<Scalar, Options_, Index> &s, const PermutationMatrix<Dynamic, Dynamic> &iPerm,
+              const Matrix<Scalar, Dynamic, 1> &diag, const Matrix<Scalar, Dynamic, 1> &qtb,
+              Matrix<Scalar, Dynamic, 1> &x, Matrix<Scalar, Dynamic, 1> &sdiag) {
   /* Local variables */
-  typedef SparseMatrix<Scalar,RowMajor,Index> FactorType;
-    Index i, j, k, l;
-    Scalar temp;
-    Index n = s.cols();
-    Matrix<Scalar,Dynamic,1>  wa(n);
-    JacobiRotation<Scalar> givens;
+  typedef SparseMatrix<Scalar, RowMajor, Index> FactorType;
+  Index i, j, k, l;
+  Scalar temp;
+  Index n = s.cols();
+  Matrix<Scalar, Dynamic, 1> wa(n);
+  JacobiRotation<Scalar> givens;
 
-    /* Function Body */
-    // the following will only change the lower triangular part of s, including
-    // the diagonal, though the diagonal is restored afterward
+  /* Function Body */
+  // the following will only change the lower triangular part of s, including
+  // the diagonal, though the diagonal is restored afterward
 
-    /*     copy r and (q transpose)*b to preserve input and initialize R. */
-    wa = qtb;
-    FactorType R(s);
-    // Eliminate the diagonal matrix d using a givens rotation
-    for (j = 0; j < n; ++j)
-    {
-      // Prepare the row of d to be eliminated, locating the 
-      // diagonal element using p from the qr factorization
-      l = iPerm.indices()(j);
-      if (diag(l) == Scalar(0)) 
-        break; 
-      sdiag.tail(n-j).setZero();
-      sdiag[j] = diag[l];
-      // the transformations to eliminate the row of d
-      // modify only a single element of (q transpose)*b
-      // beyond the first n, which is initially zero. 
-      
-      Scalar qtbpj = 0; 
-      // Browse the nonzero elements of row j of the upper triangular s
-      for (k = j; k < n; ++k)
-      {
-        typename FactorType::InnerIterator itk(R,k);
-        for (; itk; ++itk){
-          if (itk.index() < k) continue;
-          else break;
-        }
-        //At this point, we have the diagonal element R(k,k)
-        // Determine a givens rotation which eliminates 
-        // the appropriate element in the current row of d
-        givens.makeGivens(-itk.value(), sdiag(k));
-        
-        // Compute the modified diagonal element of r and 
-        // the modified element of ((q transpose)*b,0).
-        itk.valueRef() = givens.c() * itk.value() + givens.s() * sdiag(k);
-        temp = givens.c() * wa(k) + givens.s() * qtbpj; 
-        qtbpj = -givens.s() * wa(k) + givens.c() * qtbpj;
-        wa(k) = temp;
-        
-        // Accumulate the transformation in the remaining k row/column of R
-        for (++itk; itk; ++itk)
-        {
-          i = itk.index();
-          temp = givens.c() *  itk.value() + givens.s() * sdiag(i);
-          sdiag(i) = -givens.s() * itk.value() + givens.c() * sdiag(i);
-          itk.valueRef() = temp;
-        }
+  /*     copy r and (q transpose)*b to preserve input and initialize R. */
+  wa = qtb;
+  FactorType R(s);
+  // Eliminate the diagonal matrix d using a givens rotation
+  for (j = 0; j < n; ++j) {
+    // Prepare the row of d to be eliminated, locating the
+    // diagonal element using p from the qr factorization
+    l = iPerm.indices()(j);
+    if (diag(l) == Scalar(0)) break;
+    sdiag.tail(n - j).setZero();
+    sdiag[j] = diag[l];
+    // the transformations to eliminate the row of d
+    // modify only a single element of (q transpose)*b
+    // beyond the first n, which is initially zero.
+
+    Scalar qtbpj = 0;
+    // Browse the nonzero elements of row j of the upper triangular s
+    for (k = j; k < n; ++k) {
+      typename FactorType::InnerIterator itk(R, k);
+      for (; itk; ++itk) {
+        if (itk.index() < k)
+          continue;
+        else
+          break;
+      }
+      // At this point, we have the diagonal element R(k,k)
+      //  Determine a givens rotation which eliminates
+      //  the appropriate element in the current row of d
+      givens.makeGivens(-itk.value(), sdiag(k));
+
+      // Compute the modified diagonal element of r and
+      // the modified element of ((q transpose)*b,0).
+      itk.valueRef() = givens.c() * itk.value() + givens.s() * sdiag(k);
+      temp = givens.c() * wa(k) + givens.s() * qtbpj;
+      qtbpj = -givens.s() * wa(k) + givens.c() * qtbpj;
+      wa(k) = temp;
+
+      // Accumulate the transformation in the remaining k row/column of R
+      for (++itk; itk; ++itk) {
+        i = itk.index();
+        temp = givens.c() * itk.value() + givens.s() * sdiag(i);
+        sdiag(i) = -givens.s() * itk.value() + givens.c() * sdiag(i);
+        itk.valueRef() = temp;
       }
     }
-    
-    // Solve the triangular system for z. If the system is 
-    // singular, then obtain a least squares solution
-    Index nsing;
-    for(nsing = 0; nsing<n && sdiag(nsing) !=0; nsing++) {}
-    
-    wa.tail(n-nsing).setZero();
-//     x = wa; 
-    wa.head(nsing) = R.topLeftCorner(nsing,nsing).template triangularView<Upper>().solve/*InPlace*/(wa.head(nsing));
-    
-    sdiag = R.diagonal();
-    // Permute the components of z back to components of x
-    x = iPerm * wa; 
+  }
+
+  // Solve the triangular system for z. If the system is
+  // singular, then obtain a least squares solution
+  Index nsing;
+  for (nsing = 0; nsing < n && sdiag(nsing) != 0; nsing++) {
+  }
+
+  wa.tail(n - nsing).setZero();
+  //     x = wa;
+  wa.head(nsing) = R.topLeftCorner(nsing, nsing).template triangularView<Upper>().solve /*InPlace*/ (wa.head(nsing));
+
+  sdiag = R.diagonal();
+  // Permute the components of z back to components of x
+  x = iPerm * wa;
 }
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_LMQRSOLV_H
+#endif  // EIGEN_LMQRSOLV_H
diff --git a/unsupported/Eigen/src/LevenbergMarquardt/LevenbergMarquardt.h b/unsupported/Eigen/src/LevenbergMarquardt/LevenbergMarquardt.h
index 4744801..b8a6dda 100644
--- a/unsupported/Eigen/src/LevenbergMarquardt/LevenbergMarquardt.h
+++ b/unsupported/Eigen/src/LevenbergMarquardt/LevenbergMarquardt.h
@@ -19,39 +19,34 @@
 #ifndef EIGEN_LEVENBERGMARQUARDT_H
 #define EIGEN_LEVENBERGMARQUARDT_H
 
-
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
 namespace Eigen {
 namespace LevenbergMarquardtSpace {
-    enum Status {
-        NotStarted = -2,
-        Running = -1,
-        ImproperInputParameters = 0,
-        RelativeReductionTooSmall = 1,
-        RelativeErrorTooSmall = 2,
-        RelativeErrorAndReductionTooSmall = 3,
-        CosinusTooSmall = 4,
-        TooManyFunctionEvaluation = 5,
-        FtolTooSmall = 6,
-        XtolTooSmall = 7,
-        GtolTooSmall = 8,
-        UserAsked = 9
-    };
+enum Status {
+  NotStarted = -2,
+  Running = -1,
+  ImproperInputParameters = 0,
+  RelativeReductionTooSmall = 1,
+  RelativeErrorTooSmall = 2,
+  RelativeErrorAndReductionTooSmall = 3,
+  CosinusTooSmall = 4,
+  TooManyFunctionEvaluation = 5,
+  FtolTooSmall = 6,
+  XtolTooSmall = 7,
+  GtolTooSmall = 8,
+  UserAsked = 9
+};
 }
 
-template <typename Scalar_, int NX=Dynamic, int NY=Dynamic>
-struct DenseFunctor
-{
+template <typename Scalar_, int NX = Dynamic, int NY = Dynamic>
+struct DenseFunctor {
   typedef Scalar_ Scalar;
-  enum {
-    InputsAtCompileTime = NX,
-    ValuesAtCompileTime = NY
-  };
-  typedef Matrix<Scalar,InputsAtCompileTime,1> InputType;
-  typedef Matrix<Scalar,ValuesAtCompileTime,1> ValueType;
-  typedef Matrix<Scalar,ValuesAtCompileTime,InputsAtCompileTime> JacobianType;
+  enum { InputsAtCompileTime = NX, ValuesAtCompileTime = NY };
+  typedef Matrix<Scalar, InputsAtCompileTime, 1> InputType;
+  typedef Matrix<Scalar, ValuesAtCompileTime, 1> ValueType;
+  typedef Matrix<Scalar, ValuesAtCompileTime, InputsAtCompileTime> JacobianType;
   typedef ColPivHouseholderQR<JacobianType> QRSolver;
   const int m_inputs, m_values;
 
@@ -61,339 +56,307 @@
   int inputs() const { return m_inputs; }
   int values() const { return m_values; }
 
-  //int operator()(const InputType &x, ValueType& fvec) { }
-  // should be defined in derived classes
-  
-  //int df(const InputType &x, JacobianType& fjac) { }
-  // should be defined in derived classes
+  // int operator()(const InputType &x, ValueType& fvec) { }
+  //  should be defined in derived classes
+
+  // int df(const InputType &x, JacobianType& fjac) { }
+  //  should be defined in derived classes
 };
 
 template <typename Scalar_, typename Index_>
-struct SparseFunctor
-{
+struct SparseFunctor {
   typedef Scalar_ Scalar;
   typedef Index_ Index;
-  typedef Matrix<Scalar,Dynamic,1> InputType;
-  typedef Matrix<Scalar,Dynamic,1> ValueType;
+  typedef Matrix<Scalar, Dynamic, 1> InputType;
+  typedef Matrix<Scalar, Dynamic, 1> ValueType;
   typedef SparseMatrix<Scalar, ColMajor, Index> JacobianType;
   typedef SparseQR<JacobianType, COLAMDOrdering<int> > QRSolver;
-  enum {
-    InputsAtCompileTime = Dynamic,
-    ValuesAtCompileTime = Dynamic
-  };
-  
+  enum { InputsAtCompileTime = Dynamic, ValuesAtCompileTime = Dynamic };
+
   SparseFunctor(int inputs, int values) : m_inputs(inputs), m_values(values) {}
 
   int inputs() const { return m_inputs; }
   int values() const { return m_values; }
-  
+
   const int m_inputs, m_values;
-  //int operator()(const InputType &x, ValueType& fvec) { }
-  // to be defined in the functor
-  
-  //int df(const InputType &x, JacobianType& fjac) { }
-  // to be defined in the functor if no automatic differentiation
-  
+  // int operator()(const InputType &x, ValueType& fvec) { }
+  //  to be defined in the functor
+
+  // int df(const InputType &x, JacobianType& fjac) { }
+  //  to be defined in the functor if no automatic differentiation
 };
 namespace internal {
 template <typename QRSolver, typename VectorType>
-void lmpar2(const QRSolver &qr, const VectorType  &diag, const VectorType  &qtb,
-	    typename VectorType::Scalar m_delta, typename VectorType::Scalar &par,
-	    VectorType  &x);
-    }
+void lmpar2(const QRSolver &qr, const VectorType &diag, const VectorType &qtb, typename VectorType::Scalar m_delta,
+            typename VectorType::Scalar &par, VectorType &x);
+}
 /**
-  * \ingroup NonLinearOptimization_Module
-  * \brief Performs non linear optimization over a non-linear function,
-  * using a variant of the Levenberg Marquardt algorithm.
-  *
-  * Check wikipedia for more information.
-  * http://en.wikipedia.org/wiki/Levenberg%E2%80%93Marquardt_algorithm
-  */
-template<typename FunctorType_>
-class LevenbergMarquardt : internal::no_assignment_operator
-{
-  public:
-    typedef FunctorType_ FunctorType;
-    typedef typename FunctorType::QRSolver QRSolver;
-    typedef typename FunctorType::JacobianType JacobianType;
-    typedef typename JacobianType::Scalar Scalar;
-    typedef typename JacobianType::RealScalar RealScalar; 
-    typedef typename QRSolver::StorageIndex PermIndex;
-    typedef Matrix<Scalar,Dynamic,1> FVectorType;
-    typedef PermutationMatrix<Dynamic,Dynamic,int> PermutationType;
-  public:
-    LevenbergMarquardt(FunctorType& functor) 
-    : m_functor(functor),m_nfev(0),m_njev(0),m_fnorm(0.0),m_gnorm(0),
-      m_isInitialized(false),m_info(InvalidInput)
-    {
-      resetParameters();
-      m_useExternalScaling=false; 
-    }
-    
-    LevenbergMarquardtSpace::Status minimize(FVectorType &x);
-    LevenbergMarquardtSpace::Status minimizeInit(FVectorType &x);
-    LevenbergMarquardtSpace::Status minimizeOneStep(FVectorType &x);
-    LevenbergMarquardtSpace::Status lmder1(
-      FVectorType  &x, 
-      const Scalar tol = std::sqrt(NumTraits<Scalar>::epsilon())
-    );
-    static LevenbergMarquardtSpace::Status lmdif1(
-            FunctorType &functor,
-            FVectorType  &x,
-            Index *nfev,
-            const Scalar tol = std::sqrt(NumTraits<Scalar>::epsilon())
-            );
-    
-    /** Sets the default parameters */
-    void resetParameters() 
-    {
-      using std::sqrt;        
+ * \ingroup NonLinearOptimization_Module
+ * \brief Performs non linear optimization over a non-linear function,
+ * using a variant of the Levenberg Marquardt algorithm.
+ *
+ * Check wikipedia for more information.
+ * http://en.wikipedia.org/wiki/Levenberg%E2%80%93Marquardt_algorithm
+ */
+template <typename FunctorType_>
+class LevenbergMarquardt : internal::no_assignment_operator {
+ public:
+  typedef FunctorType_ FunctorType;
+  typedef typename FunctorType::QRSolver QRSolver;
+  typedef typename FunctorType::JacobianType JacobianType;
+  typedef typename JacobianType::Scalar Scalar;
+  typedef typename JacobianType::RealScalar RealScalar;
+  typedef typename QRSolver::StorageIndex PermIndex;
+  typedef Matrix<Scalar, Dynamic, 1> FVectorType;
+  typedef PermutationMatrix<Dynamic, Dynamic, int> PermutationType;
 
-      m_factor = 100.; 
-      m_maxfev = 400; 
-      m_ftol = sqrt(NumTraits<RealScalar>::epsilon());
-      m_xtol = sqrt(NumTraits<RealScalar>::epsilon());
-      m_gtol = 0. ; 
-      m_epsfcn = 0. ;
-    }
-    
-    /** Sets the tolerance for the norm of the solution vector*/
-    void setXtol(RealScalar xtol) { m_xtol = xtol; }
-    
-    /** Sets the tolerance for the norm of the vector function*/
-    void setFtol(RealScalar ftol) { m_ftol = ftol; }
-    
-    /** Sets the tolerance for the norm of the gradient of the error vector*/
-    void setGtol(RealScalar gtol) { m_gtol = gtol; }
-    
-    /** Sets the step bound for the diagonal shift */
-    void setFactor(RealScalar factor) { m_factor = factor; }    
-    
-    /** Sets the error precision  */
-    void setEpsilon (RealScalar epsfcn) { m_epsfcn = epsfcn; }
-    
-    /** Sets the maximum number of function evaluation */
-    void setMaxfev(Index maxfev) {m_maxfev = maxfev; }
-    
-    /** Use an external Scaling. If set to true, pass a nonzero diagonal to diag() */
-    void setExternalScaling(bool value) {m_useExternalScaling  = value; }
-    
-    /** \returns the tolerance for the norm of the solution vector */
-    RealScalar xtol() const {return m_xtol; }
-    
-    /** \returns the tolerance for the norm of the vector function */
-    RealScalar ftol() const {return m_ftol; }
-    
-    /** \returns the tolerance for the norm of the gradient of the error vector */
-    RealScalar gtol() const {return m_gtol; }
-    
-    /** \returns the step bound for the diagonal shift */
-    RealScalar factor() const {return m_factor; }
-    
-    /** \returns the error precision */
-    RealScalar epsilon() const {return m_epsfcn; }
-    
-    /** \returns the maximum number of function evaluation */
-    Index maxfev() const {return m_maxfev; }
-    
-    /** \returns a reference to the diagonal of the jacobian */
-    FVectorType& diag() {return m_diag; }
-    
-    /** \returns the number of iterations performed */
-    Index iterations() { return m_iter; }
-    
-    /** \returns the number of functions evaluation */
-    Index nfev() { return m_nfev; }
-    
-    /** \returns the number of jacobian evaluation */
-    Index njev() { return m_njev; }
-    
-    /** \returns the norm of current vector function */
-    RealScalar fnorm() {return m_fnorm; }
-    
-    /** \returns the norm of the gradient of the error */
-    RealScalar gnorm() {return m_gnorm; }
-    
-    /** \returns the LevenbergMarquardt parameter */
-    RealScalar lm_param(void) { return m_par; }
-    
-    /** \returns a reference to the  current vector function 
-     */
-    FVectorType& fvec() {return m_fvec; }
-    
-    /** \returns a reference to the matrix where the current Jacobian matrix is stored
-     */
-    JacobianType& jacobian() {return m_fjac; }
-    
-    /** \returns a reference to the triangular matrix R from the QR of the jacobian matrix.
-     * \sa jacobian()
-     */
-    JacobianType& matrixR() {return m_rfactor; }
-    
-    /** the permutation used in the QR factorization
-     */
-    PermutationType permutation() {return m_permutation; }
-    
-    /** 
-     * \brief Reports whether the minimization was successful
-     * \returns \c Success if the minimization was successful,
-     *         \c NumericalIssue if a numerical problem arises during the 
-     *          minimization process, for example during the QR factorization
-     *         \c NoConvergence if the minimization did not converge after 
-     *          the maximum number of function evaluation allowed
-     *          \c InvalidInput if the input matrix is invalid
-     */
-    ComputationInfo info() const
-    {
-      
-      return m_info;
-    }
-  private:
-    JacobianType m_fjac; 
-    JacobianType m_rfactor; // The triangular matrix R from the QR of the jacobian matrix m_fjac
-    FunctorType &m_functor;
-    FVectorType m_fvec, m_qtf, m_diag; 
-    Index n;
-    Index m; 
-    Index m_nfev;
-    Index m_njev; 
-    RealScalar m_fnorm; // Norm of the current vector function
-    RealScalar m_gnorm; //Norm of the gradient of the error 
-    RealScalar m_factor; //
-    Index m_maxfev; // Maximum number of function evaluation
-    RealScalar m_ftol; //Tolerance in the norm of the vector function
-    RealScalar m_xtol; // 
-    RealScalar m_gtol; //tolerance of the norm of the error gradient
-    RealScalar m_epsfcn; //
-    Index m_iter; // Number of iterations performed
-    RealScalar m_delta;
-    bool m_useExternalScaling;
-    PermutationType m_permutation;
-    FVectorType m_wa1, m_wa2, m_wa3, m_wa4; //Temporary vectors
-    RealScalar m_par;
-    bool m_isInitialized; // Check whether the minimization step has been called
-    ComputationInfo m_info; 
+ public:
+  LevenbergMarquardt(FunctorType &functor)
+      : m_functor(functor),
+        m_nfev(0),
+        m_njev(0),
+        m_fnorm(0.0),
+        m_gnorm(0),
+        m_isInitialized(false),
+        m_info(InvalidInput) {
+    resetParameters();
+    m_useExternalScaling = false;
+  }
+
+  LevenbergMarquardtSpace::Status minimize(FVectorType &x);
+  LevenbergMarquardtSpace::Status minimizeInit(FVectorType &x);
+  LevenbergMarquardtSpace::Status minimizeOneStep(FVectorType &x);
+  LevenbergMarquardtSpace::Status lmder1(FVectorType &x, const Scalar tol = std::sqrt(NumTraits<Scalar>::epsilon()));
+  static LevenbergMarquardtSpace::Status lmdif1(FunctorType &functor, FVectorType &x, Index *nfev,
+                                                const Scalar tol = std::sqrt(NumTraits<Scalar>::epsilon()));
+
+  /** Sets the default parameters */
+  void resetParameters() {
+    using std::sqrt;
+
+    m_factor = 100.;
+    m_maxfev = 400;
+    m_ftol = sqrt(NumTraits<RealScalar>::epsilon());
+    m_xtol = sqrt(NumTraits<RealScalar>::epsilon());
+    m_gtol = 0.;
+    m_epsfcn = 0.;
+  }
+
+  /** Sets the tolerance for the norm of the solution vector*/
+  void setXtol(RealScalar xtol) { m_xtol = xtol; }
+
+  /** Sets the tolerance for the norm of the vector function*/
+  void setFtol(RealScalar ftol) { m_ftol = ftol; }
+
+  /** Sets the tolerance for the norm of the gradient of the error vector*/
+  void setGtol(RealScalar gtol) { m_gtol = gtol; }
+
+  /** Sets the step bound for the diagonal shift */
+  void setFactor(RealScalar factor) { m_factor = factor; }
+
+  /** Sets the error precision  */
+  void setEpsilon(RealScalar epsfcn) { m_epsfcn = epsfcn; }
+
+  /** Sets the maximum number of function evaluation */
+  void setMaxfev(Index maxfev) { m_maxfev = maxfev; }
+
+  /** Use an external Scaling. If set to true, pass a nonzero diagonal to diag() */
+  void setExternalScaling(bool value) { m_useExternalScaling = value; }
+
+  /** \returns the tolerance for the norm of the solution vector */
+  RealScalar xtol() const { return m_xtol; }
+
+  /** \returns the tolerance for the norm of the vector function */
+  RealScalar ftol() const { return m_ftol; }
+
+  /** \returns the tolerance for the norm of the gradient of the error vector */
+  RealScalar gtol() const { return m_gtol; }
+
+  /** \returns the step bound for the diagonal shift */
+  RealScalar factor() const { return m_factor; }
+
+  /** \returns the error precision */
+  RealScalar epsilon() const { return m_epsfcn; }
+
+  /** \returns the maximum number of function evaluation */
+  Index maxfev() const { return m_maxfev; }
+
+  /** \returns a reference to the diagonal of the jacobian */
+  FVectorType &diag() { return m_diag; }
+
+  /** \returns the number of iterations performed */
+  Index iterations() { return m_iter; }
+
+  /** \returns the number of functions evaluation */
+  Index nfev() { return m_nfev; }
+
+  /** \returns the number of jacobian evaluation */
+  Index njev() { return m_njev; }
+
+  /** \returns the norm of current vector function */
+  RealScalar fnorm() { return m_fnorm; }
+
+  /** \returns the norm of the gradient of the error */
+  RealScalar gnorm() { return m_gnorm; }
+
+  /** \returns the LevenbergMarquardt parameter */
+  RealScalar lm_param(void) { return m_par; }
+
+  /** \returns a reference to the  current vector function
+   */
+  FVectorType &fvec() { return m_fvec; }
+
+  /** \returns a reference to the matrix where the current Jacobian matrix is stored
+   */
+  JacobianType &jacobian() { return m_fjac; }
+
+  /** \returns a reference to the triangular matrix R from the QR of the jacobian matrix.
+   * \sa jacobian()
+   */
+  JacobianType &matrixR() { return m_rfactor; }
+
+  /** the permutation used in the QR factorization
+   */
+  PermutationType permutation() { return m_permutation; }
+
+  /**
+   * \brief Reports whether the minimization was successful
+   * \returns \c Success if the minimization was successful,
+   *         \c NumericalIssue if a numerical problem arises during the
+   *          minimization process, for example during the QR factorization
+   *         \c NoConvergence if the minimization did not converge after
+   *          the maximum number of function evaluation allowed
+   *          \c InvalidInput if the input matrix is invalid
+   */
+  ComputationInfo info() const { return m_info; }
+
+ private:
+  JacobianType m_fjac;
+  JacobianType m_rfactor;  // The triangular matrix R from the QR of the jacobian matrix m_fjac
+  FunctorType &m_functor;
+  FVectorType m_fvec, m_qtf, m_diag;
+  Index n;
+  Index m;
+  Index m_nfev;
+  Index m_njev;
+  RealScalar m_fnorm;   // Norm of the current vector function
+  RealScalar m_gnorm;   // Norm of the gradient of the error
+  RealScalar m_factor;  //
+  Index m_maxfev;       // Maximum number of function evaluation
+  RealScalar m_ftol;    // Tolerance in the norm of the vector function
+  RealScalar m_xtol;    //
+  RealScalar m_gtol;    // tolerance of the norm of the error gradient
+  RealScalar m_epsfcn;  //
+  Index m_iter;         // Number of iterations performed
+  RealScalar m_delta;
+  bool m_useExternalScaling;
+  PermutationType m_permutation;
+  FVectorType m_wa1, m_wa2, m_wa3, m_wa4;  // Temporary vectors
+  RealScalar m_par;
+  bool m_isInitialized;  // Check whether the minimization step has been called
+  ComputationInfo m_info;
 };
 
-template<typename FunctorType>
-LevenbergMarquardtSpace::Status
-LevenbergMarquardt<FunctorType>::minimize(FVectorType  &x)
-{
-    LevenbergMarquardtSpace::Status status = minimizeInit(x);
-    if (status==LevenbergMarquardtSpace::ImproperInputParameters) {
-      m_isInitialized = true;
-      return status;
-    }
-    do {
-//       std::cout << " uv " << x.transpose() << "\n";
-        status = minimizeOneStep(x);
-    } while (status==LevenbergMarquardtSpace::Running);
-     m_isInitialized = true;
-     return status;
+template <typename FunctorType>
+LevenbergMarquardtSpace::Status LevenbergMarquardt<FunctorType>::minimize(FVectorType &x) {
+  LevenbergMarquardtSpace::Status status = minimizeInit(x);
+  if (status == LevenbergMarquardtSpace::ImproperInputParameters) {
+    m_isInitialized = true;
+    return status;
+  }
+  do {
+    //       std::cout << " uv " << x.transpose() << "\n";
+    status = minimizeOneStep(x);
+  } while (status == LevenbergMarquardtSpace::Running);
+  m_isInitialized = true;
+  return status;
 }
 
-template<typename FunctorType>
-LevenbergMarquardtSpace::Status
-LevenbergMarquardt<FunctorType>::minimizeInit(FVectorType  &x)
-{
-    n = x.size();
-    m = m_functor.values();
+template <typename FunctorType>
+LevenbergMarquardtSpace::Status LevenbergMarquardt<FunctorType>::minimizeInit(FVectorType &x) {
+  n = x.size();
+  m = m_functor.values();
 
-    m_wa1.resize(n); m_wa2.resize(n); m_wa3.resize(n);
-    m_wa4.resize(m);
-    m_fvec.resize(m);
-    //FIXME Sparse Case : Allocate space for the jacobian
-    m_fjac.resize(m, n);
-//     m_fjac.reserve(VectorXi::Constant(n,5)); // FIXME Find a better alternative
-    if (!m_useExternalScaling)
-        m_diag.resize(n);
-    eigen_assert( (!m_useExternalScaling || m_diag.size()==n) && "When m_useExternalScaling is set, the caller must provide a valid 'm_diag'");
-    m_qtf.resize(n);
+  m_wa1.resize(n);
+  m_wa2.resize(n);
+  m_wa3.resize(n);
+  m_wa4.resize(m);
+  m_fvec.resize(m);
+  // FIXME Sparse Case : Allocate space for the jacobian
+  m_fjac.resize(m, n);
+  //     m_fjac.reserve(VectorXi::Constant(n,5)); // FIXME Find a better alternative
+  if (!m_useExternalScaling) m_diag.resize(n);
+  eigen_assert((!m_useExternalScaling || m_diag.size() == n) &&
+               "When m_useExternalScaling is set, the caller must provide a valid 'm_diag'");
+  m_qtf.resize(n);
 
-    /* Function Body */
-    m_nfev = 0;
-    m_njev = 0;
+  /* Function Body */
+  m_nfev = 0;
+  m_njev = 0;
 
-    /*     check the input parameters for errors. */
-    if (n <= 0 || m < n || m_ftol < 0. || m_xtol < 0. || m_gtol < 0. || m_maxfev <= 0 || m_factor <= 0.){
-      m_info = InvalidInput;
-      return LevenbergMarquardtSpace::ImproperInputParameters;
-    }
+  /*     check the input parameters for errors. */
+  if (n <= 0 || m < n || m_ftol < 0. || m_xtol < 0. || m_gtol < 0. || m_maxfev <= 0 || m_factor <= 0.) {
+    m_info = InvalidInput;
+    return LevenbergMarquardtSpace::ImproperInputParameters;
+  }
 
-    if (m_useExternalScaling)
-        for (Index j = 0; j < n; ++j)
-            if (m_diag[j] <= 0.) 
-            {
-              m_info = InvalidInput;
-              return LevenbergMarquardtSpace::ImproperInputParameters;
-            }
-
-    /*     evaluate the function at the starting point */
-    /*     and calculate its norm. */
-    m_nfev = 1;
-    if ( m_functor(x, m_fvec) < 0)
-        return LevenbergMarquardtSpace::UserAsked;
-    m_fnorm = m_fvec.stableNorm();
-
-    /*     initialize levenberg-marquardt parameter and iteration counter. */
-    m_par = 0.;
-    m_iter = 1;
-
-    return LevenbergMarquardtSpace::NotStarted;
-}
-
-template<typename FunctorType>
-LevenbergMarquardtSpace::Status
-LevenbergMarquardt<FunctorType>::lmder1(
-        FVectorType  &x,
-        const Scalar tol
-        )
-{
-    n = x.size();
-    m = m_functor.values();
-
-    /* check the input parameters for errors. */
-    if (n <= 0 || m < n || tol < 0.)
+  if (m_useExternalScaling)
+    for (Index j = 0; j < n; ++j)
+      if (m_diag[j] <= 0.) {
+        m_info = InvalidInput;
         return LevenbergMarquardtSpace::ImproperInputParameters;
+      }
 
-    resetParameters();
-    m_ftol = tol;
-    m_xtol = tol;
-    m_maxfev = 100*(n+1);
+  /*     evaluate the function at the starting point */
+  /*     and calculate its norm. */
+  m_nfev = 1;
+  if (m_functor(x, m_fvec) < 0) return LevenbergMarquardtSpace::UserAsked;
+  m_fnorm = m_fvec.stableNorm();
 
-    return minimize(x);
+  /*     initialize levenberg-marquardt parameter and iteration counter. */
+  m_par = 0.;
+  m_iter = 1;
+
+  return LevenbergMarquardtSpace::NotStarted;
 }
 
+template <typename FunctorType>
+LevenbergMarquardtSpace::Status LevenbergMarquardt<FunctorType>::lmder1(FVectorType &x, const Scalar tol) {
+  n = x.size();
+  m = m_functor.values();
 
-template<typename FunctorType>
-LevenbergMarquardtSpace::Status
-LevenbergMarquardt<FunctorType>::lmdif1(
-        FunctorType &functor,
-        FVectorType  &x,
-        Index *nfev,
-        const Scalar tol
-        )
-{
-    Index n = x.size();
-    Index m = functor.values();
+  /* check the input parameters for errors. */
+  if (n <= 0 || m < n || tol < 0.) return LevenbergMarquardtSpace::ImproperInputParameters;
 
-    /* check the input parameters for errors. */
-    if (n <= 0 || m < n || tol < 0.)
-        return LevenbergMarquardtSpace::ImproperInputParameters;
+  resetParameters();
+  m_ftol = tol;
+  m_xtol = tol;
+  m_maxfev = 100 * (n + 1);
 
-    NumericalDiff<FunctorType> numDiff(functor);
-    // embedded LevenbergMarquardt
-    LevenbergMarquardt<NumericalDiff<FunctorType> > lm(numDiff);
-    lm.setFtol(tol);
-    lm.setXtol(tol);
-    lm.setMaxfev(200*(n+1));
-
-    LevenbergMarquardtSpace::Status info = LevenbergMarquardtSpace::Status(lm.minimize(x));
-    if (nfev)
-        * nfev = lm.nfev();
-    return info;
+  return minimize(x);
 }
 
-} // end namespace Eigen
+template <typename FunctorType>
+LevenbergMarquardtSpace::Status LevenbergMarquardt<FunctorType>::lmdif1(FunctorType &functor, FVectorType &x,
+                                                                        Index *nfev, const Scalar tol) {
+  Index n = x.size();
+  Index m = functor.values();
 
-#endif // EIGEN_LEVENBERGMARQUARDT_H
+  /* check the input parameters for errors. */
+  if (n <= 0 || m < n || tol < 0.) return LevenbergMarquardtSpace::ImproperInputParameters;
+
+  NumericalDiff<FunctorType> numDiff(functor);
+  // embedded LevenbergMarquardt
+  LevenbergMarquardt<NumericalDiff<FunctorType> > lm(numDiff);
+  lm.setFtol(tol);
+  lm.setXtol(tol);
+  lm.setMaxfev(200 * (n + 1));
+
+  LevenbergMarquardtSpace::Status info = LevenbergMarquardtSpace::Status(lm.minimize(x));
+  if (nfev) *nfev = lm.nfev();
+  return info;
+}
+
+}  // end namespace Eigen
+
+#endif  // EIGEN_LEVENBERGMARQUARDT_H
diff --git a/unsupported/Eigen/src/MatrixFunctions/InternalHeaderCheck.h b/unsupported/Eigen/src/MatrixFunctions/InternalHeaderCheck.h
index b737f3c..4fc840e 100644
--- a/unsupported/Eigen/src/MatrixFunctions/InternalHeaderCheck.h
+++ b/unsupported/Eigen/src/MatrixFunctions/InternalHeaderCheck.h
@@ -1,3 +1,4 @@
 #ifndef EIGEN_MATRIX_FUNCTIONS_MODULE_H
-#error "Please include unsupported/Eigen/MatrixFunctions instead of including headers inside the src directory directly."
+#error \
+    "Please include unsupported/Eigen/MatrixFunctions instead of including headers inside the src directory directly."
 #endif
diff --git a/unsupported/Eigen/src/MatrixFunctions/MatrixExponential.h b/unsupported/Eigen/src/MatrixFunctions/MatrixExponential.h
index 8061c34..ff955e1 100644
--- a/unsupported/Eigen/src/MatrixFunctions/MatrixExponential.h
+++ b/unsupported/Eigen/src/MatrixFunctions/MatrixExponential.h
@@ -24,21 +24,18 @@
  * This struct is used by CwiseUnaryOp to scale a matrix by \f$ 2^{-s} \f$.
  */
 template <typename RealScalar>
-struct MatrixExponentialScalingOp
-{
+struct MatrixExponentialScalingOp {
   /** \brief Constructor.
    *
    * \param[in] squarings  The integer \f$ s \f$ in this document.
    */
-  MatrixExponentialScalingOp(int squarings) : m_squarings(squarings) { }
-
+  MatrixExponentialScalingOp(int squarings) : m_squarings(squarings) {}
 
   /** \brief Scale a matrix coefficient.
    *
    * \param[in,out] x  The scalar to be scaled, becoming \f$ 2^{-s} x \f$.
    */
-  inline const RealScalar operator() (const RealScalar& x) const
-  {
+  inline const RealScalar operator()(const RealScalar& x) const {
     using std::ldexp;
     return ldexp(x, -m_squarings);
   }
@@ -49,14 +46,13 @@
    *
    * \param[in,out] x  The scalar to be scaled, becoming \f$ 2^{-s} x \f$.
    */
-  inline const ComplexScalar operator() (const ComplexScalar& x) const
-  {
+  inline const ComplexScalar operator()(const ComplexScalar& x) const {
     using std::ldexp;
     return ComplexScalar(ldexp(x.real(), -m_squarings), ldexp(x.imag(), -m_squarings));
   }
 
-  private:
-    int m_squarings;
+ private:
+  int m_squarings;
 };
 
 /** \brief Compute the (3,3)-Pad&eacute; approximant to the exponential.
@@ -65,8 +61,7 @@
  *  approximant of \f$ \exp(A) \f$ around \f$ A = 0 \f$.
  */
 template <typename MatA, typename MatU, typename MatV>
-void matrix_exp_pade3(const MatA& A, MatU& U, MatV& V)
-{
+void matrix_exp_pade3(const MatA& A, MatU& U, MatV& V) {
   typedef typename MatA::PlainObject MatrixType;
   typedef typename NumTraits<typename traits<MatA>::Scalar>::Real RealScalar;
   const RealScalar b[] = {120.L, 60.L, 12.L, 1.L};
@@ -82,8 +77,7 @@
  *  approximant of \f$ \exp(A) \f$ around \f$ A = 0 \f$.
  */
 template <typename MatA, typename MatU, typename MatV>
-void matrix_exp_pade5(const MatA& A, MatU& U, MatV& V)
-{
+void matrix_exp_pade5(const MatA& A, MatU& U, MatV& V) {
   typedef typename MatA::PlainObject MatrixType;
   typedef typename NumTraits<typename traits<MatrixType>::Scalar>::Real RealScalar;
   const RealScalar b[] = {30240.L, 15120.L, 3360.L, 420.L, 30.L, 1.L};
@@ -100,19 +94,16 @@
  *  approximant of \f$ \exp(A) \f$ around \f$ A = 0 \f$.
  */
 template <typename MatA, typename MatU, typename MatV>
-void matrix_exp_pade7(const MatA& A, MatU& U, MatV& V)
-{
+void matrix_exp_pade7(const MatA& A, MatU& U, MatV& V) {
   typedef typename MatA::PlainObject MatrixType;
   typedef typename NumTraits<typename traits<MatrixType>::Scalar>::Real RealScalar;
   const RealScalar b[] = {17297280.L, 8648640.L, 1995840.L, 277200.L, 25200.L, 1512.L, 56.L, 1.L};
   const MatrixType A2 = A * A;
   const MatrixType A4 = A2 * A2;
   const MatrixType A6 = A4 * A2;
-  const MatrixType tmp = b[7] * A6 + b[5] * A4 + b[3] * A2 
-    + b[1] * MatrixType::Identity(A.rows(), A.cols());
+  const MatrixType tmp = b[7] * A6 + b[5] * A4 + b[3] * A2 + b[1] * MatrixType::Identity(A.rows(), A.cols());
   U.noalias() = A * tmp;
   V = b[6] * A6 + b[4] * A4 + b[2] * A2 + b[0] * MatrixType::Identity(A.rows(), A.cols());
-
 }
 
 /** \brief Compute the (9,9)-Pad&eacute; approximant to the exponential.
@@ -121,18 +112,17 @@
  *  approximant of \f$ \exp(A) \f$ around \f$ A = 0 \f$.
  */
 template <typename MatA, typename MatU, typename MatV>
-void matrix_exp_pade9(const MatA& A, MatU& U, MatV& V)
-{
+void matrix_exp_pade9(const MatA& A, MatU& U, MatV& V) {
   typedef typename MatA::PlainObject MatrixType;
   typedef typename NumTraits<typename traits<MatrixType>::Scalar>::Real RealScalar;
   const RealScalar b[] = {17643225600.L, 8821612800.L, 2075673600.L, 302702400.L, 30270240.L,
-                          2162160.L, 110880.L, 3960.L, 90.L, 1.L};
+                          2162160.L,     110880.L,     3960.L,       90.L,        1.L};
   const MatrixType A2 = A * A;
   const MatrixType A4 = A2 * A2;
   const MatrixType A6 = A4 * A2;
   const MatrixType A8 = A6 * A2;
-  const MatrixType tmp = b[9] * A8 + b[7] * A6 + b[5] * A4 + b[3] * A2 
-    + b[1] * MatrixType::Identity(A.rows(), A.cols());
+  const MatrixType tmp =
+      b[9] * A8 + b[7] * A6 + b[5] * A4 + b[3] * A2 + b[1] * MatrixType::Identity(A.rows(), A.cols());
   U.noalias() = A * tmp;
   V = b[8] * A8 + b[6] * A6 + b[4] * A4 + b[2] * A2 + b[0] * MatrixType::Identity(A.rows(), A.cols());
 }
@@ -143,17 +133,27 @@
  *  approximant of \f$ \exp(A) \f$ around \f$ A = 0 \f$.
  */
 template <typename MatA, typename MatU, typename MatV>
-void matrix_exp_pade13(const MatA& A, MatU& U, MatV& V)
-{
+void matrix_exp_pade13(const MatA& A, MatU& U, MatV& V) {
   typedef typename MatA::PlainObject MatrixType;
   typedef typename NumTraits<typename traits<MatrixType>::Scalar>::Real RealScalar;
-  const RealScalar b[] = {64764752532480000.L, 32382376266240000.L, 7771770303897600.L,
-                          1187353796428800.L, 129060195264000.L, 10559470521600.L, 670442572800.L,
-                          33522128640.L, 1323241920.L, 40840800.L, 960960.L, 16380.L, 182.L, 1.L};
+  const RealScalar b[] = {64764752532480000.L,
+                          32382376266240000.L,
+                          7771770303897600.L,
+                          1187353796428800.L,
+                          129060195264000.L,
+                          10559470521600.L,
+                          670442572800.L,
+                          33522128640.L,
+                          1323241920.L,
+                          40840800.L,
+                          960960.L,
+                          16380.L,
+                          182.L,
+                          1.L};
   const MatrixType A2 = A * A;
   const MatrixType A4 = A2 * A2;
   const MatrixType A6 = A4 * A2;
-  V = b[13] * A6 + b[11] * A4 + b[9] * A2; // used for temporary storage
+  V = b[13] * A6 + b[11] * A4 + b[9] * A2;  // used for temporary storage
   MatrixType tmp = A6 * V;
   tmp += b[7] * A6 + b[5] * A4 + b[3] * A2 + b[1] * MatrixType::Identity(A.rows(), A.cols());
   U.noalias() = A * tmp;
@@ -171,51 +171,57 @@
  */
 #if LDBL_MANT_DIG > 64
 template <typename MatA, typename MatU, typename MatV>
-void matrix_exp_pade17(const MatA& A, MatU& U, MatV& V)
-{
+void matrix_exp_pade17(const MatA& A, MatU& U, MatV& V) {
   typedef typename MatA::PlainObject MatrixType;
   typedef typename NumTraits<typename traits<MatrixType>::Scalar>::Real RealScalar;
-  const RealScalar b[] = {830034394580628357120000.L, 415017197290314178560000.L,
-                          100610229646136770560000.L, 15720348382208870400000.L,
-                          1774878043152614400000.L, 153822763739893248000.L, 10608466464820224000.L,
-                          595373117923584000.L, 27563570274240000.L, 1060137318240000.L,
-                          33924394183680.L, 899510451840.L, 19554575040.L, 341863200.L, 4651200.L,
-                          46512.L, 306.L, 1.L};
+  const RealScalar b[] = {830034394580628357120000.L,
+                          415017197290314178560000.L,
+                          100610229646136770560000.L,
+                          15720348382208870400000.L,
+                          1774878043152614400000.L,
+                          153822763739893248000.L,
+                          10608466464820224000.L,
+                          595373117923584000.L,
+                          27563570274240000.L,
+                          1060137318240000.L,
+                          33924394183680.L,
+                          899510451840.L,
+                          19554575040.L,
+                          341863200.L,
+                          4651200.L,
+                          46512.L,
+                          306.L,
+                          1.L};
   const MatrixType A2 = A * A;
   const MatrixType A4 = A2 * A2;
   const MatrixType A6 = A4 * A2;
   const MatrixType A8 = A4 * A4;
-  V = b[17] * A8 + b[15] * A6 + b[13] * A4 + b[11] * A2; // used for temporary storage
+  V = b[17] * A8 + b[15] * A6 + b[13] * A4 + b[11] * A2;  // used for temporary storage
   MatrixType tmp = A8 * V;
-  tmp += b[9] * A8 + b[7] * A6 + b[5] * A4 + b[3] * A2 
-    + b[1] * MatrixType::Identity(A.rows(), A.cols());
+  tmp += b[9] * A8 + b[7] * A6 + b[5] * A4 + b[3] * A2 + b[1] * MatrixType::Identity(A.rows(), A.cols());
   U.noalias() = A * tmp;
   tmp = b[16] * A8 + b[14] * A6 + b[12] * A4 + b[10] * A2;
   V.noalias() = tmp * A8;
-  V += b[8] * A8 + b[6] * A6 + b[4] * A4 + b[2] * A2 
-    + b[0] * MatrixType::Identity(A.rows(), A.cols());
+  V += b[8] * A8 + b[6] * A6 + b[4] * A4 + b[2] * A2 + b[0] * MatrixType::Identity(A.rows(), A.cols());
 }
 #endif
 
 template <typename MatrixType, typename RealScalar = typename NumTraits<typename traits<MatrixType>::Scalar>::Real>
-struct matrix_exp_computeUV
-{
+struct matrix_exp_computeUV {
   /** \brief Compute Pad&eacute; approximant to the exponential.
-    *
-    * Computes \c U, \c V and \c squarings such that \f$ (V+U)(V-U)^{-1} \f$ is a Pad&eacute;
-    * approximant of \f$ \exp(2^{-\mbox{squarings}}M) \f$ around \f$ M = 0 \f$, where \f$ M \f$
-    * denotes the matrix \c arg. The degree of the Pad&eacute; approximant and the value of squarings
-    * are chosen such that the approximation error is no more than the round-off error.
-    */
+   *
+   * Computes \c U, \c V and \c squarings such that \f$ (V+U)(V-U)^{-1} \f$ is a Pad&eacute;
+   * approximant of \f$ \exp(2^{-\mbox{squarings}}M) \f$ around \f$ M = 0 \f$, where \f$ M \f$
+   * denotes the matrix \c arg. The degree of the Pad&eacute; approximant and the value of squarings
+   * are chosen such that the approximation error is no more than the round-off error.
+   */
   static void run(const MatrixType& arg, MatrixType& U, MatrixType& V, int& squarings);
 };
 
 template <typename MatrixType>
-struct matrix_exp_computeUV<MatrixType, float>
-{
+struct matrix_exp_computeUV<MatrixType, float> {
   template <typename ArgType>
-  static void run(const ArgType& arg, MatrixType& U, MatrixType& V, int& squarings)
-  {
+  static void run(const ArgType& arg, MatrixType& U, MatrixType& V, int& squarings) {
     using std::frexp;
     using std::pow;
     const float l1norm = arg.cwiseAbs().colwise().sum().maxCoeff();
@@ -235,12 +241,10 @@
 };
 
 template <typename MatrixType>
-struct matrix_exp_computeUV<MatrixType, double>
-{
+struct matrix_exp_computeUV<MatrixType, double> {
   typedef typename NumTraits<typename traits<MatrixType>::Scalar>::Real RealScalar;
   template <typename ArgType>
-  static void run(const ArgType& arg, MatrixType& U, MatrixType& V, int& squarings)
-  {
+  static void run(const ArgType& arg, MatrixType& U, MatrixType& V, int& squarings) {
     using std::frexp;
     using std::pow;
     const RealScalar l1norm = arg.cwiseAbs().colwise().sum().maxCoeff();
@@ -262,25 +266,23 @@
     }
   }
 };
-  
+
 template <typename MatrixType>
-struct matrix_exp_computeUV<MatrixType, long double>
-{
+struct matrix_exp_computeUV<MatrixType, long double> {
   template <typename ArgType>
-  static void run(const ArgType& arg, MatrixType& U, MatrixType& V, int& squarings)
-  {
-#if   LDBL_MANT_DIG == 53   // double precision
+  static void run(const ArgType& arg, MatrixType& U, MatrixType& V, int& squarings) {
+#if LDBL_MANT_DIG == 53  // double precision
     matrix_exp_computeUV<MatrixType, double>::run(arg, U, V, squarings);
-  
+
 #else
-  
+
     using std::frexp;
     using std::pow;
     const long double l1norm = arg.cwiseAbs().colwise().sum().maxCoeff();
     squarings = 0;
-  
-#if LDBL_MANT_DIG <= 64   // extended precision
-  
+
+#if LDBL_MANT_DIG <= 64  // extended precision
+
     if (l1norm < 4.1968497232266989671e-003L) {
       matrix_exp_pade3(arg, U, V);
     } else if (l1norm < 1.1848116734693823091e-001L) {
@@ -296,9 +298,9 @@
       MatrixType A = arg.unaryExpr(MatrixExponentialScalingOp<long double>(squarings));
       matrix_exp_pade13(A, U, V);
     }
-  
+
 #elif LDBL_MANT_DIG <= 106  // double-double
-  
+
     if (l1norm < 3.2787892205607026992947488108213e-005L) {
       matrix_exp_pade3(arg, U, V);
     } else if (l1norm < 6.4467025060072760084130906076332e-003L) {
@@ -316,9 +318,9 @@
       MatrixType A = arg.unaryExpr(MatrixExponentialScalingOp<long double>(squarings));
       matrix_exp_pade17(A, U, V);
     }
-  
+
 #elif LDBL_MANT_DIG <= 113  // quadruple precision
-  
+
     if (l1norm < 1.639394610288918690547467954466970e-005L) {
       matrix_exp_pade3(arg, U, V);
     } else if (l1norm < 4.253237712165275566025884344433009e-003L) {
@@ -336,46 +338,48 @@
       MatrixType A = arg.unaryExpr(MatrixExponentialScalingOp<long double>(squarings));
       matrix_exp_pade17(A, U, V);
     }
-  
+
 #else
-  
+
     // this case should be handled in compute()
-    eigen_assert(false && "Bug in MatrixExponential"); 
-  
+    eigen_assert(false && "Bug in MatrixExponential");
+
 #endif
 #endif  // LDBL_MANT_DIG
   }
 };
 
-template<typename T> struct is_exp_known_type : false_type {};
-template<> struct is_exp_known_type<float> : true_type {};
-template<> struct is_exp_known_type<double> : true_type {};
+template <typename T>
+struct is_exp_known_type : false_type {};
+template <>
+struct is_exp_known_type<float> : true_type {};
+template <>
+struct is_exp_known_type<double> : true_type {};
 #if LDBL_MANT_DIG <= 113
-template<> struct is_exp_known_type<long double> : true_type {};
+template <>
+struct is_exp_known_type<long double> : true_type {};
 #endif
 
 template <typename ArgType, typename ResultType>
-void matrix_exp_compute(const ArgType& arg, ResultType &result, true_type) // natively supported scalar type
+void matrix_exp_compute(const ArgType& arg, ResultType& result, true_type)  // natively supported scalar type
 {
   typedef typename ArgType::PlainObject MatrixType;
   MatrixType U, V;
   int squarings;
-  matrix_exp_computeUV<MatrixType>::run(arg, U, V, squarings); // Pade approximant is (U+V) / (-U+V)
+  matrix_exp_computeUV<MatrixType>::run(arg, U, V, squarings);  // Pade approximant is (U+V) / (-U+V)
   MatrixType numer = U + V;
   MatrixType denom = -U + V;
   result = denom.partialPivLu().solve(numer);
-  for (int i=0; i<squarings; i++)
-    result *= result;   // undo scaling by repeated squaring
+  for (int i = 0; i < squarings; i++) result *= result;  // undo scaling by repeated squaring
 }
 
-
 /* Computes the matrix exponential
  *
  * \param arg    argument of matrix exponential (should be plain object)
  * \param result variable in which result will be stored
  */
 template <typename ArgType, typename ResultType>
-void matrix_exp_compute(const ArgType& arg, ResultType &result, false_type) // default
+void matrix_exp_compute(const ArgType& arg, ResultType& result, false_type)  // default
 {
   typedef typename ArgType::PlainObject MatrixType;
   typedef typename traits<MatrixType>::Scalar Scalar;
@@ -384,61 +388,57 @@
   result = arg.matrixFunction(internal::stem_function_exp<ComplexScalar>);
 }
 
-} // end namespace Eigen::internal
+}  // namespace internal
 
 /** \ingroup MatrixFunctions_Module
-  *
-  * \brief Proxy for the matrix exponential of some matrix (expression).
-  *
-  * \tparam Derived  Type of the argument to the matrix exponential.
-  *
-  * This class holds the argument to the matrix exponential until it is assigned or evaluated for
-  * some other reason (so the argument should not be changed in the meantime). It is the return type
-  * of MatrixBase::exp() and most of the time this is the only way it is used.
-  */
-template<typename Derived> struct MatrixExponentialReturnValue
-: public ReturnByValue<MatrixExponentialReturnValue<Derived> >
-{
-  public:
-    /** \brief Constructor.
-      *
-      * \param src %Matrix (expression) forming the argument of the matrix exponential.
-      */
-    MatrixExponentialReturnValue(const Derived& src) : m_src(src) { }
+ *
+ * \brief Proxy for the matrix exponential of some matrix (expression).
+ *
+ * \tparam Derived  Type of the argument to the matrix exponential.
+ *
+ * This class holds the argument to the matrix exponential until it is assigned or evaluated for
+ * some other reason (so the argument should not be changed in the meantime). It is the return type
+ * of MatrixBase::exp() and most of the time this is the only way it is used.
+ */
+template <typename Derived>
+struct MatrixExponentialReturnValue : public ReturnByValue<MatrixExponentialReturnValue<Derived> > {
+ public:
+  /** \brief Constructor.
+   *
+   * \param src %Matrix (expression) forming the argument of the matrix exponential.
+   */
+  MatrixExponentialReturnValue(const Derived& src) : m_src(src) {}
 
-    /** \brief Compute the matrix exponential.
-      *
-      * \param result the matrix exponential of \p src in the constructor.
-      */
-    template <typename ResultType>
-    inline void evalTo(ResultType& result) const
-    {
-      const typename internal::nested_eval<Derived, 10>::type tmp(m_src);
-      internal::matrix_exp_compute(tmp, result, internal::is_exp_known_type<typename Derived::RealScalar>());
-    }
+  /** \brief Compute the matrix exponential.
+   *
+   * \param result the matrix exponential of \p src in the constructor.
+   */
+  template <typename ResultType>
+  inline void evalTo(ResultType& result) const {
+    const typename internal::nested_eval<Derived, 10>::type tmp(m_src);
+    internal::matrix_exp_compute(tmp, result, internal::is_exp_known_type<typename Derived::RealScalar>());
+  }
 
-    Index rows() const { return m_src.rows(); }
-    Index cols() const { return m_src.cols(); }
+  Index rows() const { return m_src.rows(); }
+  Index cols() const { return m_src.cols(); }
 
-  protected:
-    const typename internal::ref_selector<Derived>::type m_src;
+ protected:
+  const typename internal::ref_selector<Derived>::type m_src;
 };
 
 namespace internal {
-template<typename Derived>
-struct traits<MatrixExponentialReturnValue<Derived> >
-{
+template <typename Derived>
+struct traits<MatrixExponentialReturnValue<Derived> > {
   typedef typename Derived::PlainObject ReturnType;
 };
-}
+}  // namespace internal
 
 template <typename Derived>
-const MatrixExponentialReturnValue<Derived> MatrixBase<Derived>::exp() const
-{
+const MatrixExponentialReturnValue<Derived> MatrixBase<Derived>::exp() const {
   eigen_assert(rows() == cols());
   return MatrixExponentialReturnValue<Derived>(derived());
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_MATRIX_EXPONENTIAL
+#endif  // EIGEN_MATRIX_EXPONENTIAL
diff --git a/unsupported/Eigen/src/MatrixFunctions/MatrixFunction.h b/unsupported/Eigen/src/MatrixFunctions/MatrixFunction.h
index ce7af5e..68336a5 100644
--- a/unsupported/Eigen/src/MatrixFunctions/MatrixFunction.h
+++ b/unsupported/Eigen/src/MatrixFunctions/MatrixFunction.h
@@ -12,11 +12,10 @@
 
 #include "StemFunction.h"
 
-
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
@@ -24,37 +23,34 @@
 static const float matrix_function_separation = 0.1f;
 
 /** \ingroup MatrixFunctions_Module
-  * \class MatrixFunctionAtomic
-  * \brief Helper class for computing matrix functions of atomic matrices.
-  *
-  * Here, an atomic matrix is a triangular matrix whose diagonal entries are close to each other.
-  */
+ * \class MatrixFunctionAtomic
+ * \brief Helper class for computing matrix functions of atomic matrices.
+ *
+ * Here, an atomic matrix is a triangular matrix whose diagonal entries are close to each other.
+ */
 template <typename MatrixType>
-class MatrixFunctionAtomic 
-{
-  public:
+class MatrixFunctionAtomic {
+ public:
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename stem_function<Scalar>::type StemFunction;
 
-    typedef typename MatrixType::Scalar Scalar;
-    typedef typename stem_function<Scalar>::type StemFunction;
+  /** \brief Constructor
+   * \param[in]  f  matrix function to compute.
+   */
+  MatrixFunctionAtomic(StemFunction f) : m_f(f) {}
 
-    /** \brief Constructor
-      * \param[in]  f  matrix function to compute.
-      */
-    MatrixFunctionAtomic(StemFunction f) : m_f(f) { }
+  /** \brief Compute matrix function of atomic matrix
+   * \param[in]  A  argument of matrix function, should be upper triangular and atomic
+   * \returns  f(A), the matrix function evaluated at the given matrix
+   */
+  MatrixType compute(const MatrixType& A);
 
-    /** \brief Compute matrix function of atomic matrix
-      * \param[in]  A  argument of matrix function, should be upper triangular and atomic
-      * \returns  f(A), the matrix function evaluated at the given matrix
-      */
-    MatrixType compute(const MatrixType& A);
-
-  private:
-    StemFunction* m_f;
+ private:
+  StemFunction* m_f;
 };
 
 template <typename MatrixType>
-typename NumTraits<typename MatrixType::Scalar>::Real matrix_function_compute_mu(const MatrixType& A)
-{
+typename NumTraits<typename MatrixType::Scalar>::Real matrix_function_compute_mu(const MatrixType& A) {
   typedef typename plain_col_type<MatrixType>::type VectorType;
   Index rows = A.rows();
   const MatrixType N = MatrixType::Identity(rows, rows) - A;
@@ -64,8 +60,7 @@
 }
 
 template <typename MatrixType>
-MatrixType MatrixFunctionAtomic<MatrixType>::compute(const MatrixType& A)
-{
+MatrixType MatrixFunctionAtomic<MatrixType>::compute(const MatrixType& A) {
   // TODO: Use that A is upper triangular
   typedef typename NumTraits<Scalar>::Real RealScalar;
   Index rows = A.rows();
@@ -75,10 +70,10 @@
   MatrixType F = m_f(avgEival, 0) * MatrixType::Identity(rows, rows);
   MatrixType P = Ashifted;
   MatrixType Fincr;
-  for (Index s = 1; double(s) < 1.1 * double(rows) + 10.0; s++) { // upper limit is fairly arbitrary
+  for (Index s = 1; double(s) < 1.1 * double(rows) + 10.0; s++) {  // upper limit is fairly arbitrary
     Fincr = m_f(avgEival, static_cast<int>(s)) * P;
     F += Fincr;
-    P = Scalar(RealScalar(1)/RealScalar(s + 1)) * P * Ashifted;
+    P = Scalar(RealScalar(1) / RealScalar(s + 1)) * P * Ashifted;
 
     // test whether Taylor series converged
     const RealScalar F_norm = F.cwiseAbs().rowwise().sum().maxCoeff();
@@ -89,52 +84,48 @@
       for (Index r = 0; r < rows; r++) {
         RealScalar mx = 0;
         for (Index i = 0; i < rows; i++)
-          mx = (std::max)(mx, std::abs(m_f(Ashifted(i, i) + avgEival, static_cast<int>(s+r))));
-        if (r != 0)
-          rfactorial *= RealScalar(r);
+          mx = (std::max)(mx, std::abs(m_f(Ashifted(i, i) + avgEival, static_cast<int>(s + r))));
+        if (r != 0) rfactorial *= RealScalar(r);
         delta = (std::max)(delta, mx / rfactorial);
       }
       const RealScalar P_norm = P.cwiseAbs().rowwise().sum().maxCoeff();
-      if (mu * delta * P_norm < NumTraits<Scalar>::epsilon() * F_norm) // series converged
+      if (mu * delta * P_norm < NumTraits<Scalar>::epsilon() * F_norm)  // series converged
         break;
     }
   }
   return F;
 }
 
-/** \brief Find cluster in \p clusters containing some value 
-  * \param[in] key Value to find
-  * \returns Iterator to cluster containing \p key, or \c clusters.end() if no cluster in \p m_clusters
-  * contains \p key.
-  */
+/** \brief Find cluster in \p clusters containing some value
+ * \param[in] key Value to find
+ * \returns Iterator to cluster containing \p key, or \c clusters.end() if no cluster in \p m_clusters
+ * contains \p key.
+ */
 template <typename Index, typename ListOfClusters>
-typename ListOfClusters::iterator matrix_function_find_cluster(Index key, ListOfClusters& clusters)
-{
+typename ListOfClusters::iterator matrix_function_find_cluster(Index key, ListOfClusters& clusters) {
   typename std::list<Index>::iterator j;
   for (typename ListOfClusters::iterator i = clusters.begin(); i != clusters.end(); ++i) {
     j = std::find(i->begin(), i->end(), key);
-    if (j != i->end())
-      return i;
+    if (j != i->end()) return i;
   }
   return clusters.end();
 }
 
 /** \brief Partition eigenvalues in clusters of ei'vals close to each other
-  * 
-  * \param[in]  eivals    Eigenvalues
-  * \param[out] clusters  Resulting partition of eigenvalues
-  *
-  * The partition satisfies the following two properties:
-  * # Any eigenvalue in a certain cluster is at most matrix_function_separation() away from another eigenvalue
-  *   in the same cluster.
-  * # The distance between two eigenvalues in different clusters is more than matrix_function_separation().  
-  * The implementation follows Algorithm 4.1 in the paper of Davies and Higham.
-  */
+ *
+ * \param[in]  eivals    Eigenvalues
+ * \param[out] clusters  Resulting partition of eigenvalues
+ *
+ * The partition satisfies the following two properties:
+ * # Any eigenvalue in a certain cluster is at most matrix_function_separation() away from another eigenvalue
+ *   in the same cluster.
+ * # The distance between two eigenvalues in different clusters is more than matrix_function_separation().
+ * The implementation follows Algorithm 4.1 in the paper of Davies and Higham.
+ */
 template <typename EivalsType, typename Cluster>
-void matrix_function_partition_eigenvalues(const EivalsType& eivals, std::list<Cluster>& clusters)
-{
+void matrix_function_partition_eigenvalues(const EivalsType& eivals, std::list<Cluster>& clusters) {
   typedef typename EivalsType::RealScalar RealScalar;
-  for (Index i=0; i<eivals.rows(); ++i) {
+  for (Index i = 0; i < eivals.rows(); ++i) {
     // Find cluster containing i-th ei'val, adding a new cluster if necessary
     typename std::list<Cluster>::iterator qi = matrix_function_find_cluster(i, clusters);
     if (qi == clusters.end()) {
@@ -146,9 +137,9 @@
     }
 
     // Look for other element to add to the set
-    for (Index j=i+1; j<eivals.rows(); ++j) {
-      if (abs(eivals(j) - eivals(i)) <= RealScalar(matrix_function_separation)
-          && std::find(qi->begin(), qi->end(), j) == qi->end()) {
+    for (Index j = i + 1; j < eivals.rows(); ++j) {
+      if (abs(eivals(j) - eivals(i)) <= RealScalar(matrix_function_separation) &&
+          std::find(qi->begin(), qi->end(), j) == qi->end()) {
         typename std::list<Cluster>::iterator qj = matrix_function_find_cluster(j, clusters);
         if (qj == clusters.end()) {
           qi->push_back(j);
@@ -163,8 +154,7 @@
 
 /** \brief Compute size of each cluster given a partitioning */
 template <typename ListOfClusters, typename Index>
-void matrix_function_compute_cluster_size(const ListOfClusters& clusters, Matrix<Index, Dynamic, 1>& clusterSize)
-{
+void matrix_function_compute_cluster_size(const ListOfClusters& clusters, Matrix<Index, Dynamic, 1>& clusterSize) {
   const Index numClusters = static_cast<Index>(clusters.size());
   clusterSize.setZero(numClusters);
   Index clusterIndex = 0;
@@ -176,19 +166,17 @@
 
 /** \brief Compute start of each block using clusterSize */
 template <typename VectorType>
-void matrix_function_compute_block_start(const VectorType& clusterSize, VectorType& blockStart)
-{
+void matrix_function_compute_block_start(const VectorType& clusterSize, VectorType& blockStart) {
   blockStart.resize(clusterSize.rows());
   blockStart(0) = 0;
   for (Index i = 1; i < clusterSize.rows(); i++) {
-    blockStart(i) = blockStart(i-1) + clusterSize(i-1);
+    blockStart(i) = blockStart(i - 1) + clusterSize(i - 1);
   }
 }
 
 /** \brief Compute mapping of eigenvalue indices to cluster indices */
 template <typename EivalsType, typename ListOfClusters, typename VectorType>
-void matrix_function_compute_map(const EivalsType& eivals, const ListOfClusters& clusters, VectorType& eivalToCluster)
-{
+void matrix_function_compute_map(const EivalsType& eivals, const ListOfClusters& clusters, VectorType& eivalToCluster) {
   eivalToCluster.resize(eivals.rows());
   Index clusterIndex = 0;
   for (typename ListOfClusters::const_iterator cluster = clusters.begin(); cluster != clusters.end(); ++cluster) {
@@ -203,8 +191,8 @@
 
 /** \brief Compute permutation which groups ei'vals in same cluster together */
 template <typename DynVectorType, typename VectorType>
-void matrix_function_compute_permutation(const DynVectorType& blockStart, const DynVectorType& eivalToCluster, VectorType& permutation)
-{
+void matrix_function_compute_permutation(const DynVectorType& blockStart, const DynVectorType& eivalToCluster,
+                                         VectorType& permutation) {
   DynVectorType indexNextEntry = blockStart;
   permutation.resize(eivalToCluster.rows());
   for (Index i = 0; i < eivalToCluster.rows(); i++) {
@@ -212,70 +200,68 @@
     permutation[i] = indexNextEntry[cluster];
     ++indexNextEntry[cluster];
   }
-}  
+}
 
 /** \brief Permute Schur decomposition in U and T according to permutation */
 template <typename VectorType, typename MatrixType>
-void matrix_function_permute_schur(VectorType& permutation, MatrixType& U, MatrixType& T)
-{
+void matrix_function_permute_schur(VectorType& permutation, MatrixType& U, MatrixType& T) {
   for (Index i = 0; i < permutation.rows() - 1; i++) {
     Index j;
     for (j = i; j < permutation.rows(); j++) {
       if (permutation(j) == i) break;
     }
     eigen_assert(permutation(j) == i);
-    for (Index k = j-1; k >= i; k--) {
+    for (Index k = j - 1; k >= i; k--) {
       JacobiRotation<typename MatrixType::Scalar> rotation;
-      rotation.makeGivens(T(k, k+1), T(k+1, k+1) - T(k, k));
-      T.applyOnTheLeft(k, k+1, rotation.adjoint());
-      T.applyOnTheRight(k, k+1, rotation);
-      U.applyOnTheRight(k, k+1, rotation);
-      std::swap(permutation.coeffRef(k), permutation.coeffRef(k+1));
+      rotation.makeGivens(T(k, k + 1), T(k + 1, k + 1) - T(k, k));
+      T.applyOnTheLeft(k, k + 1, rotation.adjoint());
+      T.applyOnTheRight(k, k + 1, rotation);
+      U.applyOnTheRight(k, k + 1, rotation);
+      std::swap(permutation.coeffRef(k), permutation.coeffRef(k + 1));
     }
   }
 }
 
 /** \brief Compute block diagonal part of matrix function.
-  *
-  * This routine computes the matrix function applied to the block diagonal part of \p T (which should be
-  * upper triangular), with the blocking given by \p blockStart and \p clusterSize. The matrix function of
-  * each diagonal block is computed by \p atomic. The off-diagonal parts of \p fT are set to zero.
-  */
+ *
+ * This routine computes the matrix function applied to the block diagonal part of \p T (which should be
+ * upper triangular), with the blocking given by \p blockStart and \p clusterSize. The matrix function of
+ * each diagonal block is computed by \p atomic. The off-diagonal parts of \p fT are set to zero.
+ */
 template <typename MatrixType, typename AtomicType, typename VectorType>
-void matrix_function_compute_block_atomic(const MatrixType& T, AtomicType& atomic, const VectorType& blockStart, const VectorType& clusterSize, MatrixType& fT)
-{ 
+void matrix_function_compute_block_atomic(const MatrixType& T, AtomicType& atomic, const VectorType& blockStart,
+                                          const VectorType& clusterSize, MatrixType& fT) {
   fT.setZero(T.rows(), T.cols());
   for (Index i = 0; i < clusterSize.rows(); ++i) {
-    fT.block(blockStart(i), blockStart(i), clusterSize(i), clusterSize(i))
-      = atomic.compute(T.block(blockStart(i), blockStart(i), clusterSize(i), clusterSize(i)));
+    fT.block(blockStart(i), blockStart(i), clusterSize(i), clusterSize(i)) =
+        atomic.compute(T.block(blockStart(i), blockStart(i), clusterSize(i), clusterSize(i)));
   }
 }
 
-/** \brief Solve a triangular Sylvester equation AX + XB = C 
-  *
-  * \param[in]  A  the matrix A; should be square and upper triangular
-  * \param[in]  B  the matrix B; should be square and upper triangular
-  * \param[in]  C  the matrix C; should have correct size.
-  *
-  * \returns the solution X.
-  *
-  * If A is m-by-m and B is n-by-n, then both C and X are m-by-n.  The (i,j)-th component of the Sylvester
-  * equation is
-  * \f[ 
-  *     \sum_{k=i}^m A_{ik} X_{kj} + \sum_{k=1}^j X_{ik} B_{kj} = C_{ij}. 
-  * \f]
-  * This can be re-arranged to yield:
-  * \f[ 
-  *     X_{ij} = \frac{1}{A_{ii} + B_{jj}} \Bigl( C_{ij}
-  *     - \sum_{k=i+1}^m A_{ik} X_{kj} - \sum_{k=1}^{j-1} X_{ik} B_{kj} \Bigr).
-  * \f]
-  * It is assumed that A and B are such that the numerator is never zero (otherwise the Sylvester equation
-  * does not have a unique solution). In that case, these equations can be evaluated in the order 
-  * \f$ i=m,\ldots,1 \f$ and \f$ j=1,\ldots,n \f$.
-  */
+/** \brief Solve a triangular Sylvester equation AX + XB = C
+ *
+ * \param[in]  A  the matrix A; should be square and upper triangular
+ * \param[in]  B  the matrix B; should be square and upper triangular
+ * \param[in]  C  the matrix C; should have correct size.
+ *
+ * \returns the solution X.
+ *
+ * If A is m-by-m and B is n-by-n, then both C and X are m-by-n.  The (i,j)-th component of the Sylvester
+ * equation is
+ * \f[
+ *     \sum_{k=i}^m A_{ik} X_{kj} + \sum_{k=1}^j X_{ik} B_{kj} = C_{ij}.
+ * \f]
+ * This can be re-arranged to yield:
+ * \f[
+ *     X_{ij} = \frac{1}{A_{ii} + B_{jj}} \Bigl( C_{ij}
+ *     - \sum_{k=i+1}^m A_{ik} X_{kj} - \sum_{k=1}^{j-1} X_{ik} B_{kj} \Bigr).
+ * \f]
+ * It is assumed that A and B are such that the numerator is never zero (otherwise the Sylvester equation
+ * does not have a unique solution). In that case, these equations can be evaluated in the order
+ * \f$ i=m,\ldots,1 \f$ and \f$ j=1,\ldots,n \f$.
+ */
 template <typename MatrixType>
-MatrixType matrix_function_solve_triangular_sylvester(const MatrixType& A, const MatrixType& B, const MatrixType& C)
-{
+MatrixType matrix_function_solve_triangular_sylvester(const MatrixType& A, const MatrixType& B, const MatrixType& C) {
   eigen_assert(A.rows() == A.cols());
   eigen_assert(A.isUpperTriangular());
   eigen_assert(B.rows() == B.cols());
@@ -291,40 +277,39 @@
 
   for (Index i = m - 1; i >= 0; --i) {
     for (Index j = 0; j < n; ++j) {
-
       // Compute AX = \sum_{k=i+1}^m A_{ik} X_{kj}
       Scalar AX;
       if (i == m - 1) {
-	AX = 0; 
+        AX = 0;
       } else {
-	Matrix<Scalar,1,1> AXmatrix = A.row(i).tail(m-1-i) * X.col(j).tail(m-1-i);
-	AX = AXmatrix(0,0);
+        Matrix<Scalar, 1, 1> AXmatrix = A.row(i).tail(m - 1 - i) * X.col(j).tail(m - 1 - i);
+        AX = AXmatrix(0, 0);
       }
 
       // Compute XB = \sum_{k=1}^{j-1} X_{ik} B_{kj}
       Scalar XB;
       if (j == 0) {
-	XB = 0; 
+        XB = 0;
       } else {
-	Matrix<Scalar,1,1> XBmatrix = X.row(i).head(j) * B.col(j).head(j);
-	XB = XBmatrix(0,0);
+        Matrix<Scalar, 1, 1> XBmatrix = X.row(i).head(j) * B.col(j).head(j);
+        XB = XBmatrix(0, 0);
       }
 
-      X(i,j) = (C(i,j) - AX - XB) / (A(i,i) + B(j,j));
+      X(i, j) = (C(i, j) - AX - XB) / (A(i, i) + B(j, j));
     }
   }
   return X;
 }
 
 /** \brief Compute part of matrix function above block diagonal.
-  *
-  * This routine completes the computation of \p fT, denoting a matrix function applied to the triangular
-  * matrix \p T. It assumes that the block diagonal part of \p fT has already been computed. The part below
-  * the diagonal is zero, because \p T is upper triangular.
-  */
+ *
+ * This routine completes the computation of \p fT, denoting a matrix function applied to the triangular
+ * matrix \p T. It assumes that the block diagonal part of \p fT has already been computed. The part below
+ * the diagonal is zero, because \p T is upper triangular.
+ */
 template <typename MatrixType, typename VectorType>
-void matrix_function_compute_above_diagonal(const MatrixType& T, const VectorType& blockStart, const VectorType& clusterSize, MatrixType& fT)
-{ 
+void matrix_function_compute_above_diagonal(const MatrixType& T, const VectorType& blockStart,
+                                            const VectorType& clusterSize, MatrixType& fT) {
   typedef internal::traits<MatrixType> Traits;
   typedef typename MatrixType::Scalar Scalar;
   static const int Options = MatrixType::Options;
@@ -334,67 +319,64 @@
     for (Index i = 0; i < clusterSize.rows() - k; i++) {
       // compute (i, i+k) block
       DynMatrixType A = T.block(blockStart(i), blockStart(i), clusterSize(i), clusterSize(i));
-      DynMatrixType B = -T.block(blockStart(i+k), blockStart(i+k), clusterSize(i+k), clusterSize(i+k));
-      DynMatrixType C = fT.block(blockStart(i), blockStart(i), clusterSize(i), clusterSize(i))
-        * T.block(blockStart(i), blockStart(i+k), clusterSize(i), clusterSize(i+k));
-      C -= T.block(blockStart(i), blockStart(i+k), clusterSize(i), clusterSize(i+k))
-        * fT.block(blockStart(i+k), blockStart(i+k), clusterSize(i+k), clusterSize(i+k));
+      DynMatrixType B = -T.block(blockStart(i + k), blockStart(i + k), clusterSize(i + k), clusterSize(i + k));
+      DynMatrixType C = fT.block(blockStart(i), blockStart(i), clusterSize(i), clusterSize(i)) *
+                        T.block(blockStart(i), blockStart(i + k), clusterSize(i), clusterSize(i + k));
+      C -= T.block(blockStart(i), blockStart(i + k), clusterSize(i), clusterSize(i + k)) *
+           fT.block(blockStart(i + k), blockStart(i + k), clusterSize(i + k), clusterSize(i + k));
       for (Index m = i + 1; m < i + k; m++) {
-        C += fT.block(blockStart(i), blockStart(m), clusterSize(i), clusterSize(m))
-          * T.block(blockStart(m), blockStart(i+k), clusterSize(m), clusterSize(i+k));
-        C -= T.block(blockStart(i), blockStart(m), clusterSize(i), clusterSize(m))
-          * fT.block(blockStart(m), blockStart(i+k), clusterSize(m), clusterSize(i+k));
+        C += fT.block(blockStart(i), blockStart(m), clusterSize(i), clusterSize(m)) *
+             T.block(blockStart(m), blockStart(i + k), clusterSize(m), clusterSize(i + k));
+        C -= T.block(blockStart(i), blockStart(m), clusterSize(i), clusterSize(m)) *
+             fT.block(blockStart(m), blockStart(i + k), clusterSize(m), clusterSize(i + k));
       }
-      fT.block(blockStart(i), blockStart(i+k), clusterSize(i), clusterSize(i+k))
-        = matrix_function_solve_triangular_sylvester(A, B, C);
+      fT.block(blockStart(i), blockStart(i + k), clusterSize(i), clusterSize(i + k)) =
+          matrix_function_solve_triangular_sylvester(A, B, C);
     }
   }
 }
 
 /** \ingroup MatrixFunctions_Module
-  * \brief Class for computing matrix functions.
-  * \tparam  MatrixType  type of the argument of the matrix function,
-  *                      expected to be an instantiation of the Matrix class template.
-  * \tparam  AtomicType  type for computing matrix function of atomic blocks.
-  * \tparam  IsComplex   used internally to select correct specialization.
-  *
-  * This class implements the Schur-Parlett algorithm for computing matrix functions. The spectrum of the
-  * matrix is divided in clustered of eigenvalues that lies close together. This class delegates the
-  * computation of the matrix function on every block corresponding to these clusters to an object of type
-  * \p AtomicType and uses these results to compute the matrix function of the whole matrix. The class
-  * \p AtomicType should have a \p compute() member function for computing the matrix function of a block.
-  *
-  * \sa class MatrixFunctionAtomic, class MatrixLogarithmAtomic
-  */
+ * \brief Class for computing matrix functions.
+ * \tparam  MatrixType  type of the argument of the matrix function,
+ *                      expected to be an instantiation of the Matrix class template.
+ * \tparam  AtomicType  type for computing matrix function of atomic blocks.
+ * \tparam  IsComplex   used internally to select correct specialization.
+ *
+ * This class implements the Schur-Parlett algorithm for computing matrix functions. The spectrum of the
+ * matrix is divided in clustered of eigenvalues that lies close together. This class delegates the
+ * computation of the matrix function on every block corresponding to these clusters to an object of type
+ * \p AtomicType and uses these results to compute the matrix function of the whole matrix. The class
+ * \p AtomicType should have a \p compute() member function for computing the matrix function of a block.
+ *
+ * \sa class MatrixFunctionAtomic, class MatrixLogarithmAtomic
+ */
 template <typename MatrixType, int IsComplex = NumTraits<typename internal::traits<MatrixType>::Scalar>::IsComplex>
-struct matrix_function_compute
-{  
-    /** \brief Compute the matrix function.
-      *
-      * \param[in]  A       argument of matrix function, should be a square matrix.
-      * \param[in]  atomic  class for computing matrix function of atomic blocks.
-      * \param[out] result  the function \p f applied to \p A, as
-      * specified in the constructor.
-      *
-      * See MatrixBase::matrixFunction() for details on how this computation
-      * is implemented.
-      */
-    template <typename AtomicType, typename ResultType> 
-    static void run(const MatrixType& A, AtomicType& atomic, ResultType &result);    
+struct matrix_function_compute {
+  /** \brief Compute the matrix function.
+   *
+   * \param[in]  A       argument of matrix function, should be a square matrix.
+   * \param[in]  atomic  class for computing matrix function of atomic blocks.
+   * \param[out] result  the function \p f applied to \p A, as
+   * specified in the constructor.
+   *
+   * See MatrixBase::matrixFunction() for details on how this computation
+   * is implemented.
+   */
+  template <typename AtomicType, typename ResultType>
+  static void run(const MatrixType& A, AtomicType& atomic, ResultType& result);
 };
 
-/** \internal \ingroup MatrixFunctions_Module 
-  * \brief Partial specialization of MatrixFunction for real matrices
-  *
-  * This converts the real matrix to a complex matrix, compute the matrix function of that matrix, and then
-  * converts the result back to a real matrix.
-  */
+/** \internal \ingroup MatrixFunctions_Module
+ * \brief Partial specialization of MatrixFunction for real matrices
+ *
+ * This converts the real matrix to a complex matrix, compute the matrix function of that matrix, and then
+ * converts the result back to a real matrix.
+ */
 template <typename MatrixType>
-struct matrix_function_compute<MatrixType, 0>
-{  
+struct matrix_function_compute<MatrixType, 0> {
   template <typename MatA, typename AtomicType, typename ResultType>
-  static void run(const MatA& A, AtomicType& atomic, ResultType &result)
-  {
+  static void run(const MatA& A, AtomicType& atomic, ResultType& result) {
     typedef internal::traits<MatrixType> Traits;
     typedef typename Traits::Scalar Scalar;
     static const int Rows = Traits::RowsAtCompileTime, Cols = Traits::ColsAtCompileTime;
@@ -410,40 +392,38 @@
   }
 };
 
-/** \internal \ingroup MatrixFunctions_Module 
-  * \brief Partial specialization of MatrixFunction for complex matrices
-  */
+/** \internal \ingroup MatrixFunctions_Module
+ * \brief Partial specialization of MatrixFunction for complex matrices
+ */
 template <typename MatrixType>
-struct matrix_function_compute<MatrixType, 1>
-{
+struct matrix_function_compute<MatrixType, 1> {
   template <typename MatA, typename AtomicType, typename ResultType>
-  static void run(const MatA& A, AtomicType& atomic, ResultType &result)
-  {
+  static void run(const MatA& A, AtomicType& atomic, ResultType& result) {
     typedef internal::traits<MatrixType> Traits;
-    
+
     // compute Schur decomposition of A
     const ComplexSchur<MatrixType> schurOfA(A);
-    eigen_assert(schurOfA.info()==Success);
+    eigen_assert(schurOfA.info() == Success);
     MatrixType T = schurOfA.matrixT();
     MatrixType U = schurOfA.matrixU();
 
     // partition eigenvalues into clusters of ei'vals "close" to each other
-    std::list<std::list<Index> > clusters; 
+    std::list<std::list<Index> > clusters;
     matrix_function_partition_eigenvalues(T.diagonal(), clusters);
 
     // compute size of each cluster
     Matrix<Index, Dynamic, 1> clusterSize;
     matrix_function_compute_cluster_size(clusters, clusterSize);
 
-    // blockStart[i] is row index at which block corresponding to i-th cluster starts 
-    Matrix<Index, Dynamic, 1> blockStart; 
+    // blockStart[i] is row index at which block corresponding to i-th cluster starts
+    Matrix<Index, Dynamic, 1> blockStart;
     matrix_function_compute_block_start(clusterSize, blockStart);
 
-    // compute map so that eivalToCluster[i] = j means that i-th ei'val is in j-th cluster 
+    // compute map so that eivalToCluster[i] = j means that i-th ei'val is in j-th cluster
     Matrix<Index, Dynamic, 1> eivalToCluster;
     matrix_function_compute_map(T.diagonal(), clusters, eivalToCluster);
 
-    // compute permutation which groups ei'vals in same cluster together 
+    // compute permutation which groups ei'vals in same cluster together
     Matrix<Index, Traits::RowsAtCompileTime, 1> permutation;
     matrix_function_compute_permutation(blockStart, eivalToCluster, permutation);
 
@@ -451,122 +431,113 @@
     matrix_function_permute_schur(permutation, U, T);
 
     // compute result
-    MatrixType fT; // matrix function applied to T
+    MatrixType fT;  // matrix function applied to T
     matrix_function_compute_block_atomic(T, atomic, blockStart, clusterSize, fT);
     matrix_function_compute_above_diagonal(T, blockStart, clusterSize, fT);
     result = U * (fT.template triangularView<Upper>() * U.adjoint());
   }
 };
 
-} // end of namespace internal
+}  // end of namespace internal
 
 /** \ingroup MatrixFunctions_Module
-  *
-  * \brief Proxy for the matrix function of some matrix (expression).
-  *
-  * \tparam Derived  Type of the argument to the matrix function.
-  *
-  * This class holds the argument to the matrix function until it is assigned or evaluated for some other
-  * reason (so the argument should not be changed in the meantime). It is the return type of
-  * matrixBase::matrixFunction() and related functions and most of the time this is the only way it is used.
-  */
-template<typename Derived> class MatrixFunctionReturnValue
-: public ReturnByValue<MatrixFunctionReturnValue<Derived> >
-{
-  public:
-    typedef typename Derived::Scalar Scalar;
-    typedef typename internal::stem_function<Scalar>::type StemFunction;
+ *
+ * \brief Proxy for the matrix function of some matrix (expression).
+ *
+ * \tparam Derived  Type of the argument to the matrix function.
+ *
+ * This class holds the argument to the matrix function until it is assigned or evaluated for some other
+ * reason (so the argument should not be changed in the meantime). It is the return type of
+ * matrixBase::matrixFunction() and related functions and most of the time this is the only way it is used.
+ */
+template <typename Derived>
+class MatrixFunctionReturnValue : public ReturnByValue<MatrixFunctionReturnValue<Derived> > {
+ public:
+  typedef typename Derived::Scalar Scalar;
+  typedef typename internal::stem_function<Scalar>::type StemFunction;
 
-  protected:
-    typedef typename internal::ref_selector<Derived>::type DerivedNested;
+ protected:
+  typedef typename internal::ref_selector<Derived>::type DerivedNested;
 
-  public:
+ public:
+  /** \brief Constructor.
+   *
+   * \param[in] A  %Matrix (expression) forming the argument of the matrix function.
+   * \param[in] f  Stem function for matrix function under consideration.
+   */
+  MatrixFunctionReturnValue(const Derived& A, StemFunction f) : m_A(A), m_f(f) {}
 
-    /** \brief Constructor.
-      *
-      * \param[in] A  %Matrix (expression) forming the argument of the matrix function.
-      * \param[in] f  Stem function for matrix function under consideration.
-      */
-    MatrixFunctionReturnValue(const Derived& A, StemFunction f) : m_A(A), m_f(f) { }
+  /** \brief Compute the matrix function.
+   *
+   * \param[out] result \p f applied to \p A, where \p f and \p A are as in the constructor.
+   */
+  template <typename ResultType>
+  inline void evalTo(ResultType& result) const {
+    typedef typename internal::nested_eval<Derived, 10>::type NestedEvalType;
+    typedef internal::remove_all_t<NestedEvalType> NestedEvalTypeClean;
+    typedef internal::traits<NestedEvalTypeClean> Traits;
+    typedef std::complex<typename NumTraits<Scalar>::Real> ComplexScalar;
+    typedef Matrix<ComplexScalar, Dynamic, Dynamic, 0, Traits::RowsAtCompileTime, Traits::ColsAtCompileTime>
+        DynMatrixType;
 
-    /** \brief Compute the matrix function.
-      *
-      * \param[out] result \p f applied to \p A, where \p f and \p A are as in the constructor.
-      */
-    template <typename ResultType>
-    inline void evalTo(ResultType& result) const
-    {
-      typedef typename internal::nested_eval<Derived, 10>::type NestedEvalType;
-      typedef internal::remove_all_t<NestedEvalType> NestedEvalTypeClean;
-      typedef internal::traits<NestedEvalTypeClean> Traits;
-      typedef std::complex<typename NumTraits<Scalar>::Real> ComplexScalar;
-      typedef Matrix<ComplexScalar, Dynamic, Dynamic, 0, Traits::RowsAtCompileTime, Traits::ColsAtCompileTime> DynMatrixType;
+    typedef internal::MatrixFunctionAtomic<DynMatrixType> AtomicType;
+    AtomicType atomic(m_f);
 
-      typedef internal::MatrixFunctionAtomic<DynMatrixType> AtomicType;
-      AtomicType atomic(m_f);
+    internal::matrix_function_compute<typename NestedEvalTypeClean::PlainObject>::run(m_A, atomic, result);
+  }
 
-      internal::matrix_function_compute<typename NestedEvalTypeClean::PlainObject>::run(m_A, atomic, result);
-    }
+  Index rows() const { return m_A.rows(); }
+  Index cols() const { return m_A.cols(); }
 
-    Index rows() const { return m_A.rows(); }
-    Index cols() const { return m_A.cols(); }
-
-  private:
-    const DerivedNested m_A;
-    StemFunction *m_f;
+ private:
+  const DerivedNested m_A;
+  StemFunction* m_f;
 };
 
 namespace internal {
-template<typename Derived>
-struct traits<MatrixFunctionReturnValue<Derived> >
-{
+template <typename Derived>
+struct traits<MatrixFunctionReturnValue<Derived> > {
   typedef typename Derived::PlainObject ReturnType;
 };
-}
-
+}  // namespace internal
 
 /********** MatrixBase methods **********/
 
-
 template <typename Derived>
-const MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::matrixFunction(typename internal::stem_function<typename internal::traits<Derived>::Scalar>::type f) const
-{
+const MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::matrixFunction(
+    typename internal::stem_function<typename internal::traits<Derived>::Scalar>::type f) const {
   eigen_assert(rows() == cols());
   return MatrixFunctionReturnValue<Derived>(derived(), f);
 }
 
 template <typename Derived>
-const MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::sin() const
-{
+const MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::sin() const {
   eigen_assert(rows() == cols());
   typedef typename internal::stem_function<Scalar>::ComplexScalar ComplexScalar;
   return MatrixFunctionReturnValue<Derived>(derived(), internal::stem_function_sin<ComplexScalar>);
 }
 
 template <typename Derived>
-const MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::cos() const
-{
+const MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::cos() const {
   eigen_assert(rows() == cols());
   typedef typename internal::stem_function<Scalar>::ComplexScalar ComplexScalar;
   return MatrixFunctionReturnValue<Derived>(derived(), internal::stem_function_cos<ComplexScalar>);
 }
 
 template <typename Derived>
-const MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::sinh() const
-{
+const MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::sinh() const {
   eigen_assert(rows() == cols());
   typedef typename internal::stem_function<Scalar>::ComplexScalar ComplexScalar;
   return MatrixFunctionReturnValue<Derived>(derived(), internal::stem_function_sinh<ComplexScalar>);
 }
 
 template <typename Derived>
-const MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::cosh() const
-{
+const MatrixFunctionReturnValue<Derived> MatrixBase<Derived>::cosh() const {
   eigen_assert(rows() == cols());
   typedef typename internal::stem_function<Scalar>::ComplexScalar ComplexScalar;
   return MatrixFunctionReturnValue<Derived>(derived(), internal::stem_function_cosh<ComplexScalar>);
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_MATRIX_FUNCTION_H
+#endif  // EIGEN_MATRIX_FUNCTION_H
diff --git a/unsupported/Eigen/src/MatrixFunctions/MatrixLogarithm.h b/unsupported/Eigen/src/MatrixFunctions/MatrixLogarithm.h
index 9234ae2..4228166 100644
--- a/unsupported/Eigen/src/MatrixFunctions/MatrixLogarithm.h
+++ b/unsupported/Eigen/src/MatrixFunctions/MatrixLogarithm.h
@@ -14,31 +14,31 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
-namespace internal { 
+namespace internal {
 
 template <typename Scalar>
-struct matrix_log_min_pade_degree 
-{
+struct matrix_log_min_pade_degree {
   static const int value = 3;
 };
 
 template <typename Scalar>
-struct matrix_log_max_pade_degree 
-{
+struct matrix_log_max_pade_degree {
   typedef typename NumTraits<Scalar>::Real RealScalar;
-  static const int value = std::numeric_limits<RealScalar>::digits<= 24?  5:  // single precision
-                           std::numeric_limits<RealScalar>::digits<= 53?  7:  // double precision
-                           std::numeric_limits<RealScalar>::digits<= 64?  8:  // extended precision
-                           std::numeric_limits<RealScalar>::digits<=106? 10:  // double-double
-                                                                         11;  // quadruple precision
+  static const int value = std::numeric_limits<RealScalar>::digits <= 24 ? 5 :  // single precision
+                               std::numeric_limits<RealScalar>::digits <= 53 ? 7
+                                                                             :  // double precision
+                               std::numeric_limits<RealScalar>::digits <= 64 ? 8
+                                                                             :  // extended precision
+                               std::numeric_limits<RealScalar>::digits <= 106 ? 10
+                                                                              :  // double-double
+                               11;                                               // quadruple precision
 };
 
 /** \brief Compute logarithm of 2x2 triangular matrix. */
 template <typename MatrixType>
-void matrix_log_compute_2x2(const MatrixType& A, MatrixType& result)
-{
+void matrix_log_compute_2x2(const MatrixType& A, MatrixType& result) {
   typedef typename MatrixType::Scalar Scalar;
   typedef typename MatrixType::RealScalar RealScalar;
   using std::abs;
@@ -46,187 +46,184 @@
   using std::imag;
   using std::log;
 
-  Scalar logA00 = log(A(0,0));
-  Scalar logA11 = log(A(1,1));
+  Scalar logA00 = log(A(0, 0));
+  Scalar logA11 = log(A(1, 1));
 
-  result(0,0) = logA00;
-  result(1,0) = Scalar(0);
-  result(1,1) = logA11;
+  result(0, 0) = logA00;
+  result(1, 0) = Scalar(0);
+  result(1, 1) = logA11;
 
-  Scalar y = A(1,1) - A(0,0);
-  if (y==Scalar(0))
-  {
-    result(0,1) = A(0,1) / A(0,0);
-  }
-  else if ((abs(A(0,0)) < RealScalar(0.5)*abs(A(1,1))) || (abs(A(0,0)) > 2*abs(A(1,1))))
-  {
-    result(0,1) = A(0,1) * (logA11 - logA00) / y;
-  }
-  else
-  {
+  Scalar y = A(1, 1) - A(0, 0);
+  if (y == Scalar(0)) {
+    result(0, 1) = A(0, 1) / A(0, 0);
+  } else if ((abs(A(0, 0)) < RealScalar(0.5) * abs(A(1, 1))) || (abs(A(0, 0)) > 2 * abs(A(1, 1)))) {
+    result(0, 1) = A(0, 1) * (logA11 - logA00) / y;
+  } else {
     // computation in previous branch is inaccurate if A(1,1) \approx A(0,0)
-    RealScalar unwindingNumber = ceil((imag(logA11 - logA00) - RealScalar(EIGEN_PI)) / RealScalar(2*EIGEN_PI));
-    result(0,1) = A(0,1) * (numext::log1p(y/A(0,0)) + Scalar(0,RealScalar(2*EIGEN_PI)*unwindingNumber)) / y;
+    RealScalar unwindingNumber = ceil((imag(logA11 - logA00) - RealScalar(EIGEN_PI)) / RealScalar(2 * EIGEN_PI));
+    result(0, 1) = A(0, 1) * (numext::log1p(y / A(0, 0)) + Scalar(0, RealScalar(2 * EIGEN_PI) * unwindingNumber)) / y;
   }
 }
 
 /* \brief Get suitable degree for Pade approximation. (specialized for RealScalar = float) */
-inline int matrix_log_get_pade_degree(float normTminusI)
-{
-  const float maxNormForPade[] = { 2.5111573934555054e-1 /* degree = 3 */ , 4.0535837411880493e-1,
-            5.3149729967117310e-1 };
+inline int matrix_log_get_pade_degree(float normTminusI) {
+  const float maxNormForPade[] = {2.5111573934555054e-1 /* degree = 3 */, 4.0535837411880493e-1, 5.3149729967117310e-1};
   const int minPadeDegree = matrix_log_min_pade_degree<float>::value;
   const int maxPadeDegree = matrix_log_max_pade_degree<float>::value;
   int degree = minPadeDegree;
-  for (; degree <= maxPadeDegree; ++degree) 
-    if (normTminusI <= maxNormForPade[degree - minPadeDegree])
-      break;
+  for (; degree <= maxPadeDegree; ++degree)
+    if (normTminusI <= maxNormForPade[degree - minPadeDegree]) break;
   return degree;
 }
 
 /* \brief Get suitable degree for Pade approximation. (specialized for RealScalar = double) */
-inline int matrix_log_get_pade_degree(double normTminusI)
-{
-  const double maxNormForPade[] = { 1.6206284795015624e-2 /* degree = 3 */ , 5.3873532631381171e-2,
-            1.1352802267628681e-1, 1.8662860613541288e-1, 2.642960831111435e-1 };
+inline int matrix_log_get_pade_degree(double normTminusI) {
+  const double maxNormForPade[] = {1.6206284795015624e-2 /* degree = 3 */, 5.3873532631381171e-2, 1.1352802267628681e-1,
+                                   1.8662860613541288e-1, 2.642960831111435e-1};
   const int minPadeDegree = matrix_log_min_pade_degree<double>::value;
   const int maxPadeDegree = matrix_log_max_pade_degree<double>::value;
   int degree = minPadeDegree;
   for (; degree <= maxPadeDegree; ++degree)
-    if (normTminusI <= maxNormForPade[degree - minPadeDegree])
-      break;
+    if (normTminusI <= maxNormForPade[degree - minPadeDegree]) break;
   return degree;
 }
 
 /* \brief Get suitable degree for Pade approximation. (specialized for RealScalar = long double) */
-inline int matrix_log_get_pade_degree(long double normTminusI)
-{
-#if   LDBL_MANT_DIG == 53         // double precision
-  const long double maxNormForPade[] = { 1.6206284795015624e-2L /* degree = 3 */ , 5.3873532631381171e-2L,
-            1.1352802267628681e-1L, 1.8662860613541288e-1L, 2.642960831111435e-1L };
-#elif LDBL_MANT_DIG <= 64         // extended precision
-  const long double maxNormForPade[] = { 5.48256690357782863103e-3L /* degree = 3 */, 2.34559162387971167321e-2L,
-            5.84603923897347449857e-2L, 1.08486423756725170223e-1L, 1.68385767881294446649e-1L,
-            2.32777776523703892094e-1L };
-#elif LDBL_MANT_DIG <= 106        // double-double
-  const long double maxNormForPade[] = { 8.58970550342939562202529664318890e-5L /* degree = 3 */,
-            9.34074328446359654039446552677759e-4L, 4.26117194647672175773064114582860e-3L,
-            1.21546224740281848743149666560464e-2L, 2.61100544998339436713088248557444e-2L,
-            4.66170074627052749243018566390567e-2L, 7.32585144444135027565872014932387e-2L,
-            1.05026503471351080481093652651105e-1L };
-#else                             // quadruple precision
-  const long double maxNormForPade[] = { 4.7419931187193005048501568167858103e-5L /* degree = 3 */,
-            5.8853168473544560470387769480192666e-4L, 2.9216120366601315391789493628113520e-3L,
-            8.8415758124319434347116734705174308e-3L, 1.9850836029449446668518049562565291e-2L,
-            3.6688019729653446926585242192447447e-2L, 5.9290962294020186998954055264528393e-2L,
-            8.6998436081634343903250580992127677e-2L, 1.1880960220216759245467951592883642e-1L };
+inline int matrix_log_get_pade_degree(long double normTminusI) {
+#if LDBL_MANT_DIG == 53  // double precision
+  const long double maxNormForPade[] = {1.6206284795015624e-2L /* degree = 3 */, 5.3873532631381171e-2L,
+                                        1.1352802267628681e-1L, 1.8662860613541288e-1L, 2.642960831111435e-1L};
+#elif LDBL_MANT_DIG <= 64   // extended precision
+  const long double maxNormForPade[] = {5.48256690357782863103e-3L /* degree = 3 */,
+                                        2.34559162387971167321e-2L,
+                                        5.84603923897347449857e-2L,
+                                        1.08486423756725170223e-1L,
+                                        1.68385767881294446649e-1L,
+                                        2.32777776523703892094e-1L};
+#elif LDBL_MANT_DIG <= 106  // double-double
+  const long double maxNormForPade[] = {8.58970550342939562202529664318890e-5L /* degree = 3 */,
+                                        9.34074328446359654039446552677759e-4L,
+                                        4.26117194647672175773064114582860e-3L,
+                                        1.21546224740281848743149666560464e-2L,
+                                        2.61100544998339436713088248557444e-2L,
+                                        4.66170074627052749243018566390567e-2L,
+                                        7.32585144444135027565872014932387e-2L,
+                                        1.05026503471351080481093652651105e-1L};
+#else                       // quadruple precision
+  const long double maxNormForPade[] = {4.7419931187193005048501568167858103e-5L /* degree = 3 */,
+                                        5.8853168473544560470387769480192666e-4L,
+                                        2.9216120366601315391789493628113520e-3L,
+                                        8.8415758124319434347116734705174308e-3L,
+                                        1.9850836029449446668518049562565291e-2L,
+                                        3.6688019729653446926585242192447447e-2L,
+                                        5.9290962294020186998954055264528393e-2L,
+                                        8.6998436081634343903250580992127677e-2L,
+                                        1.1880960220216759245467951592883642e-1L};
 #endif
   const int minPadeDegree = matrix_log_min_pade_degree<long double>::value;
   const int maxPadeDegree = matrix_log_max_pade_degree<long double>::value;
   int degree = minPadeDegree;
   for (; degree <= maxPadeDegree; ++degree)
-    if (normTminusI <= maxNormForPade[degree - minPadeDegree])
-      break;
+    if (normTminusI <= maxNormForPade[degree - minPadeDegree]) break;
   return degree;
 }
 
 /* \brief Compute Pade approximation to matrix logarithm */
 template <typename MatrixType>
-void matrix_log_compute_pade(MatrixType& result, const MatrixType& T, int degree)
-{
+void matrix_log_compute_pade(MatrixType& result, const MatrixType& T, int degree) {
   typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;
   const int minPadeDegree = 3;
   const int maxPadeDegree = 11;
   eigen_assert(degree >= minPadeDegree && degree <= maxPadeDegree);
   // FIXME this creates float-conversion-warnings if these are enabled.
   // Either manually convert each value, or disable the warning locally
-  const RealScalar nodes[][maxPadeDegree] = { 
-    { 0.1127016653792583114820734600217600L, 0.5000000000000000000000000000000000L,  // degree 3
-      0.8872983346207416885179265399782400L }, 
-    { 0.0694318442029737123880267555535953L, 0.3300094782075718675986671204483777L,  // degree 4
-      0.6699905217924281324013328795516223L, 0.9305681557970262876119732444464048L },
-    { 0.0469100770306680036011865608503035L, 0.2307653449471584544818427896498956L,  // degree 5
-      0.5000000000000000000000000000000000L, 0.7692346550528415455181572103501044L,
-      0.9530899229693319963988134391496965L },
-    { 0.0337652428984239860938492227530027L, 0.1693953067668677431693002024900473L,  // degree 6
-      0.3806904069584015456847491391596440L, 0.6193095930415984543152508608403560L,
-      0.8306046932331322568306997975099527L, 0.9662347571015760139061507772469973L },
-    { 0.0254460438286207377369051579760744L, 0.1292344072003027800680676133596058L,  // degree 7
-      0.2970774243113014165466967939615193L, 0.5000000000000000000000000000000000L,
-      0.7029225756886985834533032060384807L, 0.8707655927996972199319323866403942L,
-      0.9745539561713792622630948420239256L },
-    { 0.0198550717512318841582195657152635L, 0.1016667612931866302042230317620848L,  // degree 8
-      0.2372337950418355070911304754053768L, 0.4082826787521750975302619288199080L,
-      0.5917173212478249024697380711800920L, 0.7627662049581644929088695245946232L,
-      0.8983332387068133697957769682379152L, 0.9801449282487681158417804342847365L },
-    { 0.0159198802461869550822118985481636L, 0.0819844463366821028502851059651326L,  // degree 9
-      0.1933142836497048013456489803292629L, 0.3378732882980955354807309926783317L,
-      0.5000000000000000000000000000000000L, 0.6621267117019044645192690073216683L,
-      0.8066857163502951986543510196707371L, 0.9180155536633178971497148940348674L,
-      0.9840801197538130449177881014518364L },
-    { 0.0130467357414141399610179939577740L, 0.0674683166555077446339516557882535L,  // degree 10
-      0.1602952158504877968828363174425632L, 0.2833023029353764046003670284171079L,
-      0.4255628305091843945575869994351400L, 0.5744371694908156054424130005648600L,
-      0.7166976970646235953996329715828921L, 0.8397047841495122031171636825574368L,
-      0.9325316833444922553660483442117465L, 0.9869532642585858600389820060422260L },
-    { 0.0108856709269715035980309994385713L, 0.0564687001159523504624211153480364L,  // degree 11
-      0.1349239972129753379532918739844233L, 0.2404519353965940920371371652706952L,
-      0.3652284220238275138342340072995692L, 0.5000000000000000000000000000000000L,
-      0.6347715779761724861657659927004308L, 0.7595480646034059079628628347293048L,
-      0.8650760027870246620467081260155767L, 0.9435312998840476495375788846519636L,
-      0.9891143290730284964019690005614287L } };
+  const RealScalar nodes[][maxPadeDegree] = {
+      {0.1127016653792583114820734600217600L, 0.5000000000000000000000000000000000L,  // degree 3
+       0.8872983346207416885179265399782400L},
+      {0.0694318442029737123880267555535953L, 0.3300094782075718675986671204483777L,  // degree 4
+       0.6699905217924281324013328795516223L, 0.9305681557970262876119732444464048L},
+      {0.0469100770306680036011865608503035L, 0.2307653449471584544818427896498956L,  // degree 5
+       0.5000000000000000000000000000000000L, 0.7692346550528415455181572103501044L,
+       0.9530899229693319963988134391496965L},
+      {0.0337652428984239860938492227530027L, 0.1693953067668677431693002024900473L,  // degree 6
+       0.3806904069584015456847491391596440L, 0.6193095930415984543152508608403560L,
+       0.8306046932331322568306997975099527L, 0.9662347571015760139061507772469973L},
+      {0.0254460438286207377369051579760744L, 0.1292344072003027800680676133596058L,  // degree 7
+       0.2970774243113014165466967939615193L, 0.5000000000000000000000000000000000L,
+       0.7029225756886985834533032060384807L, 0.8707655927996972199319323866403942L,
+       0.9745539561713792622630948420239256L},
+      {0.0198550717512318841582195657152635L, 0.1016667612931866302042230317620848L,  // degree 8
+       0.2372337950418355070911304754053768L, 0.4082826787521750975302619288199080L,
+       0.5917173212478249024697380711800920L, 0.7627662049581644929088695245946232L,
+       0.8983332387068133697957769682379152L, 0.9801449282487681158417804342847365L},
+      {0.0159198802461869550822118985481636L, 0.0819844463366821028502851059651326L,  // degree 9
+       0.1933142836497048013456489803292629L, 0.3378732882980955354807309926783317L,
+       0.5000000000000000000000000000000000L, 0.6621267117019044645192690073216683L,
+       0.8066857163502951986543510196707371L, 0.9180155536633178971497148940348674L,
+       0.9840801197538130449177881014518364L},
+      {0.0130467357414141399610179939577740L, 0.0674683166555077446339516557882535L,  // degree 10
+       0.1602952158504877968828363174425632L, 0.2833023029353764046003670284171079L,
+       0.4255628305091843945575869994351400L, 0.5744371694908156054424130005648600L,
+       0.7166976970646235953996329715828921L, 0.8397047841495122031171636825574368L,
+       0.9325316833444922553660483442117465L, 0.9869532642585858600389820060422260L},
+      {0.0108856709269715035980309994385713L, 0.0564687001159523504624211153480364L,  // degree 11
+       0.1349239972129753379532918739844233L, 0.2404519353965940920371371652706952L,
+       0.3652284220238275138342340072995692L, 0.5000000000000000000000000000000000L,
+       0.6347715779761724861657659927004308L, 0.7595480646034059079628628347293048L,
+       0.8650760027870246620467081260155767L, 0.9435312998840476495375788846519636L,
+       0.9891143290730284964019690005614287L}};
 
-  const RealScalar weights[][maxPadeDegree] = { 
-    { 0.2777777777777777777777777777777778L, 0.4444444444444444444444444444444444L,  // degree 3
-      0.2777777777777777777777777777777778L },
-    { 0.1739274225687269286865319746109997L, 0.3260725774312730713134680253890003L,  // degree 4
-      0.3260725774312730713134680253890003L, 0.1739274225687269286865319746109997L },
-    { 0.1184634425280945437571320203599587L, 0.2393143352496832340206457574178191L,  // degree 5
-      0.2844444444444444444444444444444444L, 0.2393143352496832340206457574178191L,
-      0.1184634425280945437571320203599587L },
-    { 0.0856622461895851725201480710863665L, 0.1803807865240693037849167569188581L,  // degree 6
-      0.2339569672863455236949351719947755L, 0.2339569672863455236949351719947755L,
-      0.1803807865240693037849167569188581L, 0.0856622461895851725201480710863665L },
-    { 0.0647424830844348466353057163395410L, 0.1398526957446383339507338857118898L,  // degree 7
-      0.1909150252525594724751848877444876L, 0.2089795918367346938775510204081633L,
-      0.1909150252525594724751848877444876L, 0.1398526957446383339507338857118898L,
-      0.0647424830844348466353057163395410L },
-    { 0.0506142681451881295762656771549811L, 0.1111905172266872352721779972131204L,  // degree 8
-      0.1568533229389436436689811009933007L, 0.1813418916891809914825752246385978L,
-      0.1813418916891809914825752246385978L, 0.1568533229389436436689811009933007L,
-      0.1111905172266872352721779972131204L, 0.0506142681451881295762656771549811L },
-    { 0.0406371941807872059859460790552618L, 0.0903240803474287020292360156214564L,  // degree 9
-      0.1303053482014677311593714347093164L, 0.1561735385200014200343152032922218L,
-      0.1651196775006298815822625346434870L, 0.1561735385200014200343152032922218L,
-      0.1303053482014677311593714347093164L, 0.0903240803474287020292360156214564L,
-      0.0406371941807872059859460790552618L },
-    { 0.0333356721543440687967844049466659L, 0.0747256745752902965728881698288487L,  // degree 10
-      0.1095431812579910219977674671140816L, 0.1346333596549981775456134607847347L,
-      0.1477621123573764350869464973256692L, 0.1477621123573764350869464973256692L,
-      0.1346333596549981775456134607847347L, 0.1095431812579910219977674671140816L,
-      0.0747256745752902965728881698288487L, 0.0333356721543440687967844049466659L },
-    { 0.0278342835580868332413768602212743L, 0.0627901847324523123173471496119701L,  // degree 11
-      0.0931451054638671257130488207158280L, 0.1165968822959952399592618524215876L,
-      0.1314022722551233310903444349452546L, 0.1364625433889503153572417641681711L,
-      0.1314022722551233310903444349452546L, 0.1165968822959952399592618524215876L,
-      0.0931451054638671257130488207158280L, 0.0627901847324523123173471496119701L,
-      0.0278342835580868332413768602212743L } };
+  const RealScalar weights[][maxPadeDegree] = {
+      {0.2777777777777777777777777777777778L, 0.4444444444444444444444444444444444L,  // degree 3
+       0.2777777777777777777777777777777778L},
+      {0.1739274225687269286865319746109997L, 0.3260725774312730713134680253890003L,  // degree 4
+       0.3260725774312730713134680253890003L, 0.1739274225687269286865319746109997L},
+      {0.1184634425280945437571320203599587L, 0.2393143352496832340206457574178191L,  // degree 5
+       0.2844444444444444444444444444444444L, 0.2393143352496832340206457574178191L,
+       0.1184634425280945437571320203599587L},
+      {0.0856622461895851725201480710863665L, 0.1803807865240693037849167569188581L,  // degree 6
+       0.2339569672863455236949351719947755L, 0.2339569672863455236949351719947755L,
+       0.1803807865240693037849167569188581L, 0.0856622461895851725201480710863665L},
+      {0.0647424830844348466353057163395410L, 0.1398526957446383339507338857118898L,  // degree 7
+       0.1909150252525594724751848877444876L, 0.2089795918367346938775510204081633L,
+       0.1909150252525594724751848877444876L, 0.1398526957446383339507338857118898L,
+       0.0647424830844348466353057163395410L},
+      {0.0506142681451881295762656771549811L, 0.1111905172266872352721779972131204L,  // degree 8
+       0.1568533229389436436689811009933007L, 0.1813418916891809914825752246385978L,
+       0.1813418916891809914825752246385978L, 0.1568533229389436436689811009933007L,
+       0.1111905172266872352721779972131204L, 0.0506142681451881295762656771549811L},
+      {0.0406371941807872059859460790552618L, 0.0903240803474287020292360156214564L,  // degree 9
+       0.1303053482014677311593714347093164L, 0.1561735385200014200343152032922218L,
+       0.1651196775006298815822625346434870L, 0.1561735385200014200343152032922218L,
+       0.1303053482014677311593714347093164L, 0.0903240803474287020292360156214564L,
+       0.0406371941807872059859460790552618L},
+      {0.0333356721543440687967844049466659L, 0.0747256745752902965728881698288487L,  // degree 10
+       0.1095431812579910219977674671140816L, 0.1346333596549981775456134607847347L,
+       0.1477621123573764350869464973256692L, 0.1477621123573764350869464973256692L,
+       0.1346333596549981775456134607847347L, 0.1095431812579910219977674671140816L,
+       0.0747256745752902965728881698288487L, 0.0333356721543440687967844049466659L},
+      {0.0278342835580868332413768602212743L, 0.0627901847324523123173471496119701L,  // degree 11
+       0.0931451054638671257130488207158280L, 0.1165968822959952399592618524215876L,
+       0.1314022722551233310903444349452546L, 0.1364625433889503153572417641681711L,
+       0.1314022722551233310903444349452546L, 0.1165968822959952399592618524215876L,
+       0.0931451054638671257130488207158280L, 0.0627901847324523123173471496119701L,
+       0.0278342835580868332413768602212743L}};
 
   MatrixType TminusI = T - MatrixType::Identity(T.rows(), T.rows());
   result.setZero(T.rows(), T.rows());
   for (int k = 0; k < degree; ++k) {
-    RealScalar weight = weights[degree-minPadeDegree][k];
-    RealScalar node = nodes[degree-minPadeDegree][k];
-    result += weight * (MatrixType::Identity(T.rows(), T.rows()) + node * TminusI)
-                       .template triangularView<Upper>().solve(TminusI);
+    RealScalar weight = weights[degree - minPadeDegree][k];
+    RealScalar node = nodes[degree - minPadeDegree][k];
+    result +=
+        weight *
+        (MatrixType::Identity(T.rows(), T.rows()) + node * TminusI).template triangularView<Upper>().solve(TminusI);
   }
-} 
+}
 
-/** \brief Compute logarithm of triangular matrices with size > 2. 
-  * \details This uses a inverse scale-and-square algorithm. */
+/** \brief Compute logarithm of triangular matrices with size > 2.
+ * \details This uses a inverse scale-and-square algorithm. */
 template <typename MatrixType>
-void matrix_log_compute_big(const MatrixType& A, MatrixType& result)
-{
+void matrix_log_compute_big(const MatrixType& A, MatrixType& result) {
   typedef typename MatrixType::Scalar Scalar;
   typedef typename NumTraits<Scalar>::Real RealScalar;
   using std::pow;
@@ -237,20 +234,21 @@
   MatrixType T = A, sqrtT;
 
   const int maxPadeDegree = matrix_log_max_pade_degree<Scalar>::value;
-  const RealScalar maxNormForPade = RealScalar(
-                                    maxPadeDegree<= 5? 5.3149729967117310e-1L:                    // single precision
-                                    maxPadeDegree<= 7? 2.6429608311114350e-1L:                    // double precision
-                                    maxPadeDegree<= 8? 2.32777776523703892094e-1L:                // extended precision
-                                    maxPadeDegree<=10? 1.05026503471351080481093652651105e-1L:    // double-double
-                                                       1.1880960220216759245467951592883642e-1L); // quadruple precision
+  const RealScalar maxNormForPade = RealScalar(maxPadeDegree <= 5 ? 5.3149729967117310e-1L :  // single precision
+                                                   maxPadeDegree <= 7 ? 2.6429608311114350e-1L
+                                                                      :  // double precision
+                                                   maxPadeDegree <= 8 ? 2.32777776523703892094e-1L
+                                                                      :  // extended precision
+                                                   maxPadeDegree <= 10 ? 1.05026503471351080481093652651105e-1L
+                                                                       :                       // double-double
+                                                   1.1880960220216759245467951592883642e-1L);  // quadruple precision
 
   while (true) {
     RealScalar normTminusI = (T - MatrixType::Identity(T.rows(), T.rows())).cwiseAbs().colwise().sum().maxCoeff();
     if (normTminusI < maxNormForPade) {
       degree = matrix_log_get_pade_degree(normTminusI);
       int degree2 = matrix_log_get_pade_degree(normTminusI / RealScalar(2));
-      if ((degree - degree2 <= 1) || (numberOfExtraSquareRoots == 1)) 
-        break;
+      if ((degree - degree2 <= 1) || (numberOfExtraSquareRoots == 1)) break;
       ++numberOfExtraSquareRoots;
     }
     matrix_sqrt_triangular(T, sqrtT);
@@ -259,35 +257,33 @@
   }
 
   matrix_log_compute_pade(result, T, degree);
-  result *= pow(RealScalar(2), RealScalar(numberOfSquareRoots)); // TODO replace by bitshift if possible
+  result *= pow(RealScalar(2), RealScalar(numberOfSquareRoots));  // TODO replace by bitshift if possible
 }
 
 /** \ingroup MatrixFunctions_Module
-  * \class MatrixLogarithmAtomic
-  * \brief Helper class for computing matrix logarithm of atomic matrices.
-  *
-  * Here, an atomic matrix is a triangular matrix whose diagonal entries are close to each other.
-  *
-  * \sa class MatrixFunctionAtomic, MatrixBase::log()
-  */
+ * \class MatrixLogarithmAtomic
+ * \brief Helper class for computing matrix logarithm of atomic matrices.
+ *
+ * Here, an atomic matrix is a triangular matrix whose diagonal entries are close to each other.
+ *
+ * \sa class MatrixFunctionAtomic, MatrixBase::log()
+ */
 template <typename MatrixType>
-class MatrixLogarithmAtomic
-{
-public:
+class MatrixLogarithmAtomic {
+ public:
   /** \brief Compute matrix logarithm of atomic matrix
-    * \param[in]  A  argument of matrix logarithm, should be upper triangular and atomic
-    * \returns  The logarithm of \p A.
-    */
+   * \param[in]  A  argument of matrix logarithm, should be upper triangular and atomic
+   * \returns  The logarithm of \p A.
+   */
   MatrixType compute(const MatrixType& A);
 };
 
 template <typename MatrixType>
-MatrixType MatrixLogarithmAtomic<MatrixType>::compute(const MatrixType& A)
-{
+MatrixType MatrixLogarithmAtomic<MatrixType>::compute(const MatrixType& A) {
   using std::log;
   MatrixType result(A.rows(), A.rows());
   if (A.rows() == 1)
-    result(0,0) = log(A(0,0));
+    result(0, 0) = log(A(0, 0));
   else if (A.rows() == 2)
     matrix_log_compute_2x2(A, result);
   else
@@ -295,82 +291,76 @@
   return result;
 }
 
-} // end of namespace internal
+}  // end of namespace internal
 
 /** \ingroup MatrixFunctions_Module
-  *
-  * \brief Proxy for the matrix logarithm of some matrix (expression).
-  *
-  * \tparam Derived  Type of the argument to the matrix function.
-  *
-  * This class holds the argument to the matrix function until it is
-  * assigned or evaluated for some other reason (so the argument
-  * should not be changed in the meantime). It is the return type of
-  * MatrixBase::log() and most of the time this is the only way it
-  * is used.
-  */
-template<typename Derived> class MatrixLogarithmReturnValue
-: public ReturnByValue<MatrixLogarithmReturnValue<Derived> >
-{
-public:
+ *
+ * \brief Proxy for the matrix logarithm of some matrix (expression).
+ *
+ * \tparam Derived  Type of the argument to the matrix function.
+ *
+ * This class holds the argument to the matrix function until it is
+ * assigned or evaluated for some other reason (so the argument
+ * should not be changed in the meantime). It is the return type of
+ * MatrixBase::log() and most of the time this is the only way it
+ * is used.
+ */
+template <typename Derived>
+class MatrixLogarithmReturnValue : public ReturnByValue<MatrixLogarithmReturnValue<Derived> > {
+ public:
   typedef typename Derived::Scalar Scalar;
   typedef typename Derived::Index Index;
 
-protected:
+ protected:
   typedef typename internal::ref_selector<Derived>::type DerivedNested;
 
-public:
-
+ public:
   /** \brief Constructor.
-    *
-    * \param[in]  A  %Matrix (expression) forming the argument of the matrix logarithm.
-    */
-  explicit MatrixLogarithmReturnValue(const Derived& A) : m_A(A) { }
-  
+   *
+   * \param[in]  A  %Matrix (expression) forming the argument of the matrix logarithm.
+   */
+  explicit MatrixLogarithmReturnValue(const Derived& A) : m_A(A) {}
+
   /** \brief Compute the matrix logarithm.
-    *
-    * \param[out]  result  Logarithm of \c A, where \c A is as specified in the constructor.
-    */
+   *
+   * \param[out]  result  Logarithm of \c A, where \c A is as specified in the constructor.
+   */
   template <typename ResultType>
-  inline void evalTo(ResultType& result) const
-  {
+  inline void evalTo(ResultType& result) const {
     typedef typename internal::nested_eval<Derived, 10>::type DerivedEvalType;
     typedef internal::remove_all_t<DerivedEvalType> DerivedEvalTypeClean;
     typedef internal::traits<DerivedEvalTypeClean> Traits;
     typedef std::complex<typename NumTraits<Scalar>::Real> ComplexScalar;
-    typedef Matrix<ComplexScalar, Dynamic, Dynamic, 0, Traits::RowsAtCompileTime, Traits::ColsAtCompileTime> DynMatrixType;
+    typedef Matrix<ComplexScalar, Dynamic, Dynamic, 0, Traits::RowsAtCompileTime, Traits::ColsAtCompileTime>
+        DynMatrixType;
     typedef internal::MatrixLogarithmAtomic<DynMatrixType> AtomicType;
     AtomicType atomic;
-    
+
     internal::matrix_function_compute<typename DerivedEvalTypeClean::PlainObject>::run(m_A, atomic, result);
   }
 
   Index rows() const { return m_A.rows(); }
   Index cols() const { return m_A.cols(); }
-  
-private:
+
+ private:
   const DerivedNested m_A;
 };
 
 namespace internal {
-  template<typename Derived>
-  struct traits<MatrixLogarithmReturnValue<Derived> >
-  {
-    typedef typename Derived::PlainObject ReturnType;
-  };
-}
-
+template <typename Derived>
+struct traits<MatrixLogarithmReturnValue<Derived> > {
+  typedef typename Derived::PlainObject ReturnType;
+};
+}  // namespace internal
 
 /********** MatrixBase method **********/
 
-
 template <typename Derived>
-const MatrixLogarithmReturnValue<Derived> MatrixBase<Derived>::log() const
-{
+const MatrixLogarithmReturnValue<Derived> MatrixBase<Derived>::log() const {
   eigen_assert(rows() == cols());
   return MatrixLogarithmReturnValue<Derived>(derived());
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_MATRIX_LOGARITHM
+#endif  // EIGEN_MATRIX_LOGARITHM
diff --git a/unsupported/Eigen/src/MatrixFunctions/MatrixPower.h b/unsupported/Eigen/src/MatrixFunctions/MatrixPower.h
index 869f8a6..bff619a 100644
--- a/unsupported/Eigen/src/MatrixFunctions/MatrixPower.h
+++ b/unsupported/Eigen/src/MatrixFunctions/MatrixPower.h
@@ -15,7 +15,8 @@
 
 namespace Eigen {
 
-template<typename MatrixType> class MatrixPower;
+template <typename MatrixType>
+class MatrixPower;
 
 /**
  * \ingroup MatrixFunctions_Module
@@ -38,36 +39,35 @@
  * template<typename MatrixType>
  * struct traits<MatrixPower<MatrixType>::ReturnValue>;
  */
-template<typename MatrixType>
-class MatrixPowerParenthesesReturnValue : public ReturnByValue< MatrixPowerParenthesesReturnValue<MatrixType> >
-{
-  public:
-    typedef typename MatrixType::RealScalar RealScalar;
+template <typename MatrixType>
+class MatrixPowerParenthesesReturnValue : public ReturnByValue<MatrixPowerParenthesesReturnValue<MatrixType> > {
+ public:
+  typedef typename MatrixType::RealScalar RealScalar;
 
-    /**
-     * \brief Constructor.
-     *
-     * \param[in] pow  %MatrixPower storing the base.
-     * \param[in] p    scalar, the exponent of the matrix power.
-     */
-    MatrixPowerParenthesesReturnValue(MatrixPower<MatrixType>& pow, RealScalar p) : m_pow(pow), m_p(p)
-    { }
+  /**
+   * \brief Constructor.
+   *
+   * \param[in] pow  %MatrixPower storing the base.
+   * \param[in] p    scalar, the exponent of the matrix power.
+   */
+  MatrixPowerParenthesesReturnValue(MatrixPower<MatrixType>& pow, RealScalar p) : m_pow(pow), m_p(p) {}
 
-    /**
-     * \brief Compute the matrix power.
-     *
-     * \param[out] result
-     */
-    template<typename ResultType>
-    inline void evalTo(ResultType& result) const
-    { m_pow.compute(result, m_p); }
+  /**
+   * \brief Compute the matrix power.
+   *
+   * \param[out] result
+   */
+  template <typename ResultType>
+  inline void evalTo(ResultType& result) const {
+    m_pow.compute(result, m_p);
+  }
 
-    Index rows() const { return m_pow.rows(); }
-    Index cols() const { return m_pow.cols(); }
+  Index rows() const { return m_pow.rows(); }
+  Index cols() const { return m_pow.cols(); }
 
-  private:
-    MatrixPower<MatrixType>& m_pow;
-    const RealScalar m_p;
+ private:
+  MatrixPower<MatrixType>& m_pow;
+  const RealScalar m_p;
 };
 
 /**
@@ -85,71 +85,64 @@
  * insist that this be nested into MatrixPower. This class is here to
  * facilitate future development of triangular matrix functions.
  */
-template<typename MatrixType>
-class MatrixPowerAtomic : internal::noncopyable
-{
-  private:
-    enum {
-      RowsAtCompileTime = MatrixType::RowsAtCompileTime,
-      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime
-    };
-    typedef typename MatrixType::Scalar Scalar;
-    typedef typename MatrixType::RealScalar RealScalar;
-    typedef std::complex<RealScalar> ComplexScalar;
-    typedef Block<MatrixType,Dynamic,Dynamic> ResultType;
+template <typename MatrixType>
+class MatrixPowerAtomic : internal::noncopyable {
+ private:
+  enum { RowsAtCompileTime = MatrixType::RowsAtCompileTime, MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime };
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::RealScalar RealScalar;
+  typedef std::complex<RealScalar> ComplexScalar;
+  typedef Block<MatrixType, Dynamic, Dynamic> ResultType;
 
-    const MatrixType& m_A;
-    RealScalar m_p;
+  const MatrixType& m_A;
+  RealScalar m_p;
 
-    void computePade(int degree, const MatrixType& IminusT, ResultType& res) const;
-    void compute2x2(ResultType& res, RealScalar p) const;
-    void computeBig(ResultType& res) const;
-    static int getPadeDegree(float normIminusT);
-    static int getPadeDegree(double normIminusT);
-    static int getPadeDegree(long double normIminusT);
-    static ComplexScalar computeSuperDiag(const ComplexScalar&, const ComplexScalar&, RealScalar p);
-    static RealScalar computeSuperDiag(RealScalar, RealScalar, RealScalar p);
+  void computePade(int degree, const MatrixType& IminusT, ResultType& res) const;
+  void compute2x2(ResultType& res, RealScalar p) const;
+  void computeBig(ResultType& res) const;
+  static int getPadeDegree(float normIminusT);
+  static int getPadeDegree(double normIminusT);
+  static int getPadeDegree(long double normIminusT);
+  static ComplexScalar computeSuperDiag(const ComplexScalar&, const ComplexScalar&, RealScalar p);
+  static RealScalar computeSuperDiag(RealScalar, RealScalar, RealScalar p);
 
-  public:
-    /**
-     * \brief Constructor.
-     *
-     * \param[in] T  the base of the matrix power.
-     * \param[in] p  the exponent of the matrix power, should be in
-     * \f$ (-1, 1) \f$.
-     *
-     * The class stores a reference to T, so it should not be changed
-     * (or destroyed) before evaluation. Only the upper triangular
-     * part of T is read.
-     */
-    MatrixPowerAtomic(const MatrixType& T, RealScalar p);
-    
-    /**
-     * \brief Compute the matrix power.
-     *
-     * \param[out] res  \f$ A^p \f$ where A and p are specified in the
-     * constructor.
-     */
-    void compute(ResultType& res) const;
+ public:
+  /**
+   * \brief Constructor.
+   *
+   * \param[in] T  the base of the matrix power.
+   * \param[in] p  the exponent of the matrix power, should be in
+   * \f$ (-1, 1) \f$.
+   *
+   * The class stores a reference to T, so it should not be changed
+   * (or destroyed) before evaluation. Only the upper triangular
+   * part of T is read.
+   */
+  MatrixPowerAtomic(const MatrixType& T, RealScalar p);
+
+  /**
+   * \brief Compute the matrix power.
+   *
+   * \param[out] res  \f$ A^p \f$ where A and p are specified in the
+   * constructor.
+   */
+  void compute(ResultType& res) const;
 };
 
-template<typename MatrixType>
-MatrixPowerAtomic<MatrixType>::MatrixPowerAtomic(const MatrixType& T, RealScalar p) :
-  m_A(T), m_p(p)
-{
+template <typename MatrixType>
+MatrixPowerAtomic<MatrixType>::MatrixPowerAtomic(const MatrixType& T, RealScalar p) : m_A(T), m_p(p) {
   eigen_assert(T.rows() == T.cols());
   eigen_assert(p > -1 && p < 1);
 }
 
-template<typename MatrixType>
-void MatrixPowerAtomic<MatrixType>::compute(ResultType& res) const
-{
+template <typename MatrixType>
+void MatrixPowerAtomic<MatrixType>::compute(ResultType& res) const {
   using std::pow;
   switch (m_A.rows()) {
     case 0:
       break;
     case 1:
-      res(0,0) = pow(m_A(0,0), m_p);
+      res(0, 0) = pow(m_A(0, 0), m_p);
       break;
     case 2:
       compute2x2(res, m_p);
@@ -159,66 +152,68 @@
   }
 }
 
-template<typename MatrixType>
-void MatrixPowerAtomic<MatrixType>::computePade(int degree, const MatrixType& IminusT, ResultType& res) const
-{
-  int i = 2*degree;
-  res = (m_p-RealScalar(degree)) / RealScalar(2*i-2) * IminusT;
+template <typename MatrixType>
+void MatrixPowerAtomic<MatrixType>::computePade(int degree, const MatrixType& IminusT, ResultType& res) const {
+  int i = 2 * degree;
+  res = (m_p - RealScalar(degree)) / RealScalar(2 * i - 2) * IminusT;
 
   for (--i; i; --i) {
-    res = (MatrixType::Identity(IminusT.rows(), IminusT.cols()) + res).template triangularView<Upper>()
-	.solve((i==1 ? -m_p : i&1 ? (-m_p-RealScalar(i/2))/RealScalar(2*i) : (m_p-RealScalar(i/2))/RealScalar(2*i-2)) * IminusT).eval();
+    res = (MatrixType::Identity(IminusT.rows(), IminusT.cols()) + res)
+              .template triangularView<Upper>()
+              .solve((i == 1  ? -m_p
+                      : i & 1 ? (-m_p - RealScalar(i / 2)) / RealScalar(2 * i)
+                              : (m_p - RealScalar(i / 2)) / RealScalar(2 * i - 2)) *
+                     IminusT)
+              .eval();
   }
   res += MatrixType::Identity(IminusT.rows(), IminusT.cols());
 }
 
 // This function assumes that res has the correct size (see bug 614)
-template<typename MatrixType>
-void MatrixPowerAtomic<MatrixType>::compute2x2(ResultType& res, RealScalar p) const
-{
+template <typename MatrixType>
+void MatrixPowerAtomic<MatrixType>::compute2x2(ResultType& res, RealScalar p) const {
   using std::abs;
   using std::pow;
-  res.coeffRef(0,0) = pow(m_A.coeff(0,0), p);
+  res.coeffRef(0, 0) = pow(m_A.coeff(0, 0), p);
 
-  for (Index i=1; i < m_A.cols(); ++i) {
-    res.coeffRef(i,i) = pow(m_A.coeff(i,i), p);
-    if (m_A.coeff(i-1,i-1) == m_A.coeff(i,i))
-      res.coeffRef(i-1,i) = p * pow(m_A.coeff(i,i), p-1);
-    else if (2*abs(m_A.coeff(i-1,i-1)) < abs(m_A.coeff(i,i)) || 2*abs(m_A.coeff(i,i)) < abs(m_A.coeff(i-1,i-1)))
-      res.coeffRef(i-1,i) = (res.coeff(i,i)-res.coeff(i-1,i-1)) / (m_A.coeff(i,i)-m_A.coeff(i-1,i-1));
+  for (Index i = 1; i < m_A.cols(); ++i) {
+    res.coeffRef(i, i) = pow(m_A.coeff(i, i), p);
+    if (m_A.coeff(i - 1, i - 1) == m_A.coeff(i, i))
+      res.coeffRef(i - 1, i) = p * pow(m_A.coeff(i, i), p - 1);
+    else if (2 * abs(m_A.coeff(i - 1, i - 1)) < abs(m_A.coeff(i, i)) ||
+             2 * abs(m_A.coeff(i, i)) < abs(m_A.coeff(i - 1, i - 1)))
+      res.coeffRef(i - 1, i) =
+          (res.coeff(i, i) - res.coeff(i - 1, i - 1)) / (m_A.coeff(i, i) - m_A.coeff(i - 1, i - 1));
     else
-      res.coeffRef(i-1,i) = computeSuperDiag(m_A.coeff(i,i), m_A.coeff(i-1,i-1), p);
-    res.coeffRef(i-1,i) *= m_A.coeff(i-1,i);
+      res.coeffRef(i - 1, i) = computeSuperDiag(m_A.coeff(i, i), m_A.coeff(i - 1, i - 1), p);
+    res.coeffRef(i - 1, i) *= m_A.coeff(i - 1, i);
   }
 }
 
-template<typename MatrixType>
-void MatrixPowerAtomic<MatrixType>::computeBig(ResultType& res) const
-{
+template <typename MatrixType>
+void MatrixPowerAtomic<MatrixType>::computeBig(ResultType& res) const {
   using std::ldexp;
   const int digits = std::numeric_limits<RealScalar>::digits;
-  const RealScalar maxNormForPade = RealScalar(
-                                    digits <=  24? 4.3386528e-1L                            // single precision
-                                  : digits <=  53? 2.789358995219730e-1L                    // double precision
-                                  : digits <=  64? 2.4471944416607995472e-1L                // extended precision
-                                  : digits <= 106? 1.1016843812851143391275867258512e-1L    // double-double
-                                  :                9.134603732914548552537150753385375e-2L); // quadruple precision
+  const RealScalar maxNormForPade =
+      RealScalar(digits <= 24    ? 4.3386528e-1L                              // single precision
+                 : digits <= 53  ? 2.789358995219730e-1L                      // double precision
+                 : digits <= 64  ? 2.4471944416607995472e-1L                  // extended precision
+                 : digits <= 106 ? 1.1016843812851143391275867258512e-1L      // double-double
+                                 : 9.134603732914548552537150753385375e-2L);  // quadruple precision
   MatrixType IminusT, sqrtT, T = m_A.template triangularView<Upper>();
   RealScalar normIminusT;
   int degree, degree2, numberOfSquareRoots = 0;
   bool hasExtraSquareRoot = false;
 
-  for (Index i=0; i < m_A.cols(); ++i)
-    eigen_assert(m_A(i,i) != RealScalar(0));
+  for (Index i = 0; i < m_A.cols(); ++i) eigen_assert(m_A(i, i) != RealScalar(0));
 
   while (true) {
     IminusT = MatrixType::Identity(m_A.rows(), m_A.cols()) - T;
     normIminusT = IminusT.cwiseAbs().colwise().sum().maxCoeff();
     if (normIminusT < maxNormForPade) {
       degree = getPadeDegree(normIminusT);
-      degree2 = getPadeDegree(normIminusT/2);
-      if (degree - degree2 <= 1 || hasExtraSquareRoot)
-	break;
+      degree2 = getPadeDegree(normIminusT / 2);
+      if (degree - degree2 <= 1 || hasExtraSquareRoot) break;
       hasExtraSquareRoot = true;
     }
     matrix_sqrt_triangular(T, sqrtT);
@@ -233,66 +228,70 @@
   }
   compute2x2(res, m_p);
 }
-  
-template<typename MatrixType>
-inline int MatrixPowerAtomic<MatrixType>::getPadeDegree(float normIminusT)
-{
-  const float maxNormForPade[] = { 2.8064004e-1f /* degree = 3 */ , 4.3386528e-1f };
+
+template <typename MatrixType>
+inline int MatrixPowerAtomic<MatrixType>::getPadeDegree(float normIminusT) {
+  const float maxNormForPade[] = {2.8064004e-1f /* degree = 3 */, 4.3386528e-1f};
   int degree = 3;
   for (; degree <= 4; ++degree)
-    if (normIminusT <= maxNormForPade[degree - 3])
-      break;
+    if (normIminusT <= maxNormForPade[degree - 3]) break;
   return degree;
 }
 
-template<typename MatrixType>
-inline int MatrixPowerAtomic<MatrixType>::getPadeDegree(double normIminusT)
-{
-  const double maxNormForPade[] = { 1.884160592658218e-2 /* degree = 3 */ , 6.038881904059573e-2, 1.239917516308172e-1,
-      1.999045567181744e-1, 2.789358995219730e-1 };
+template <typename MatrixType>
+inline int MatrixPowerAtomic<MatrixType>::getPadeDegree(double normIminusT) {
+  const double maxNormForPade[] = {1.884160592658218e-2 /* degree = 3 */, 6.038881904059573e-2, 1.239917516308172e-1,
+                                   1.999045567181744e-1, 2.789358995219730e-1};
   int degree = 3;
   for (; degree <= 7; ++degree)
-    if (normIminusT <= maxNormForPade[degree - 3])
-      break;
+    if (normIminusT <= maxNormForPade[degree - 3]) break;
   return degree;
 }
 
-template<typename MatrixType>
-inline int MatrixPowerAtomic<MatrixType>::getPadeDegree(long double normIminusT)
-{
-#if   LDBL_MANT_DIG == 53
+template <typename MatrixType>
+inline int MatrixPowerAtomic<MatrixType>::getPadeDegree(long double normIminusT) {
+#if LDBL_MANT_DIG == 53
   const int maxPadeDegree = 7;
-  const double maxNormForPade[] = { 1.884160592658218e-2L /* degree = 3 */ , 6.038881904059573e-2L, 1.239917516308172e-1L,
-      1.999045567181744e-1L, 2.789358995219730e-1L };
+  const double maxNormForPade[] = {1.884160592658218e-2L /* degree = 3 */, 6.038881904059573e-2L, 1.239917516308172e-1L,
+                                   1.999045567181744e-1L, 2.789358995219730e-1L};
 #elif LDBL_MANT_DIG <= 64
   const int maxPadeDegree = 8;
-  const long double maxNormForPade[] = { 6.3854693117491799460e-3L /* degree = 3 */ , 2.6394893435456973676e-2L,
-      6.4216043030404063729e-2L, 1.1701165502926694307e-1L, 1.7904284231268670284e-1L, 2.4471944416607995472e-1L };
+  const long double maxNormForPade[] = {6.3854693117491799460e-3L /* degree = 3 */,
+                                        2.6394893435456973676e-2L,
+                                        6.4216043030404063729e-2L,
+                                        1.1701165502926694307e-1L,
+                                        1.7904284231268670284e-1L,
+                                        2.4471944416607995472e-1L};
 #elif LDBL_MANT_DIG <= 106
   const int maxPadeDegree = 10;
-  const double maxNormForPade[] = { 1.0007161601787493236741409687186e-4L /* degree = 3 */ ,
-      1.0007161601787493236741409687186e-3L, 4.7069769360887572939882574746264e-3L, 1.3220386624169159689406653101695e-2L,
-      2.8063482381631737920612944054906e-2L, 4.9625993951953473052385361085058e-2L, 7.7367040706027886224557538328171e-2L,
-      1.1016843812851143391275867258512e-1L };
+  const double maxNormForPade[] = {1.0007161601787493236741409687186e-4L /* degree = 3 */,
+                                   1.0007161601787493236741409687186e-3L,
+                                   4.7069769360887572939882574746264e-3L,
+                                   1.3220386624169159689406653101695e-2L,
+                                   2.8063482381631737920612944054906e-2L,
+                                   4.9625993951953473052385361085058e-2L,
+                                   7.7367040706027886224557538328171e-2L,
+                                   1.1016843812851143391275867258512e-1L};
 #else
   const int maxPadeDegree = 10;
-  const double maxNormForPade[] = { 5.524506147036624377378713555116378e-5L /* degree = 3 */ ,
-      6.640600568157479679823602193345995e-4L, 3.227716520106894279249709728084626e-3L,
-      9.619593944683432960546978734646284e-3L, 2.134595382433742403911124458161147e-2L,
-      3.908166513900489428442993794761185e-2L, 6.266780814639442865832535460550138e-2L,
-      9.134603732914548552537150753385375e-2L };
+  const double maxNormForPade[] = {5.524506147036624377378713555116378e-5L /* degree = 3 */,
+                                   6.640600568157479679823602193345995e-4L,
+                                   3.227716520106894279249709728084626e-3L,
+                                   9.619593944683432960546978734646284e-3L,
+                                   2.134595382433742403911124458161147e-2L,
+                                   3.908166513900489428442993794761185e-2L,
+                                   6.266780814639442865832535460550138e-2L,
+                                   9.134603732914548552537150753385375e-2L};
 #endif
   int degree = 3;
   for (; degree <= maxPadeDegree; ++degree)
-    if (normIminusT <= static_cast<long double>(maxNormForPade[degree - 3]))
-      break;
+    if (normIminusT <= static_cast<long double>(maxNormForPade[degree - 3])) break;
   return degree;
 }
 
-template<typename MatrixType>
-inline typename MatrixPowerAtomic<MatrixType>::ComplexScalar
-MatrixPowerAtomic<MatrixType>::computeSuperDiag(const ComplexScalar& curr, const ComplexScalar& prev, RealScalar p)
-{
+template <typename MatrixType>
+inline typename MatrixPowerAtomic<MatrixType>::ComplexScalar MatrixPowerAtomic<MatrixType>::computeSuperDiag(
+    const ComplexScalar& curr, const ComplexScalar& prev, RealScalar p) {
   using std::ceil;
   using std::exp;
   using std::log;
@@ -300,20 +299,21 @@
 
   ComplexScalar logCurr = log(curr);
   ComplexScalar logPrev = log(prev);
-  RealScalar unwindingNumber = ceil((numext::imag(logCurr - logPrev) - RealScalar(EIGEN_PI)) / RealScalar(2*EIGEN_PI));
-  ComplexScalar w = numext::log1p((curr-prev)/prev)/RealScalar(2) + ComplexScalar(0, RealScalar(EIGEN_PI)*unwindingNumber);
+  RealScalar unwindingNumber =
+      ceil((numext::imag(logCurr - logPrev) - RealScalar(EIGEN_PI)) / RealScalar(2 * EIGEN_PI));
+  ComplexScalar w =
+      numext::log1p((curr - prev) / prev) / RealScalar(2) + ComplexScalar(0, RealScalar(EIGEN_PI) * unwindingNumber);
   return RealScalar(2) * exp(RealScalar(0.5) * p * (logCurr + logPrev)) * sinh(p * w) / (curr - prev);
 }
 
-template<typename MatrixType>
-inline typename MatrixPowerAtomic<MatrixType>::RealScalar
-MatrixPowerAtomic<MatrixType>::computeSuperDiag(RealScalar curr, RealScalar prev, RealScalar p)
-{
+template <typename MatrixType>
+inline typename MatrixPowerAtomic<MatrixType>::RealScalar MatrixPowerAtomic<MatrixType>::computeSuperDiag(
+    RealScalar curr, RealScalar prev, RealScalar p) {
   using std::exp;
   using std::log;
   using std::sinh;
 
-  RealScalar w = numext::log1p((curr-prev)/prev)/RealScalar(2);
+  RealScalar w = numext::log1p((curr - prev) / prev) / RealScalar(2);
   return 2 * exp(p * (log(curr) + log(prev)) / 2) * sinh(p * w) / (curr - prev);
 }
 
@@ -336,126 +336,118 @@
  * \include MatrixPower_optimal.cpp
  * Output: \verbinclude MatrixPower_optimal.out
  */
-template<typename MatrixType>
-class MatrixPower : internal::noncopyable
-{
-  private:
-    typedef typename MatrixType::Scalar Scalar;
-    typedef typename MatrixType::RealScalar RealScalar;
+template <typename MatrixType>
+class MatrixPower : internal::noncopyable {
+ private:
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::RealScalar RealScalar;
 
-  public:
-    /**
-     * \brief Constructor.
-     *
-     * \param[in] A  the base of the matrix power.
-     *
-     * The class stores a reference to A, so it should not be changed
-     * (or destroyed) before evaluation.
-     */
-    explicit MatrixPower(const MatrixType& A) :
-      m_A(A),
-      m_conditionNumber(0),
-      m_rank(A.cols()),
-      m_nulls(0)
-    { eigen_assert(A.rows() == A.cols()); }
+ public:
+  /**
+   * \brief Constructor.
+   *
+   * \param[in] A  the base of the matrix power.
+   *
+   * The class stores a reference to A, so it should not be changed
+   * (or destroyed) before evaluation.
+   */
+  explicit MatrixPower(const MatrixType& A) : m_A(A), m_conditionNumber(0), m_rank(A.cols()), m_nulls(0) {
+    eigen_assert(A.rows() == A.cols());
+  }
 
-    /**
-     * \brief Returns the matrix power.
-     *
-     * \param[in] p  exponent, a real scalar.
-     * \return The expression \f$ A^p \f$, where A is specified in the
-     * constructor.
-     */
-    const MatrixPowerParenthesesReturnValue<MatrixType> operator()(RealScalar p)
-    { return MatrixPowerParenthesesReturnValue<MatrixType>(*this, p); }
+  /**
+   * \brief Returns the matrix power.
+   *
+   * \param[in] p  exponent, a real scalar.
+   * \return The expression \f$ A^p \f$, where A is specified in the
+   * constructor.
+   */
+  const MatrixPowerParenthesesReturnValue<MatrixType> operator()(RealScalar p) {
+    return MatrixPowerParenthesesReturnValue<MatrixType>(*this, p);
+  }
 
-    /**
-     * \brief Compute the matrix power.
-     *
-     * \param[in]  p    exponent, a real scalar.
-     * \param[out] res  \f$ A^p \f$ where A is specified in the
-     * constructor.
-     */
-    template<typename ResultType>
-    void compute(ResultType& res, RealScalar p);
-    
-    Index rows() const { return m_A.rows(); }
-    Index cols() const { return m_A.cols(); }
+  /**
+   * \brief Compute the matrix power.
+   *
+   * \param[in]  p    exponent, a real scalar.
+   * \param[out] res  \f$ A^p \f$ where A is specified in the
+   * constructor.
+   */
+  template <typename ResultType>
+  void compute(ResultType& res, RealScalar p);
 
-  private:
-    typedef std::complex<RealScalar> ComplexScalar;
-    typedef Matrix<ComplexScalar, Dynamic, Dynamic, 0,
-              MatrixType::RowsAtCompileTime, MatrixType::ColsAtCompileTime> ComplexMatrix;
+  Index rows() const { return m_A.rows(); }
+  Index cols() const { return m_A.cols(); }
 
-    /** \brief Reference to the base of matrix power. */
-    typename MatrixType::Nested m_A;
+ private:
+  typedef std::complex<RealScalar> ComplexScalar;
+  typedef Matrix<ComplexScalar, Dynamic, Dynamic, 0, MatrixType::RowsAtCompileTime, MatrixType::ColsAtCompileTime>
+      ComplexMatrix;
 
-    /** \brief Temporary storage. */
-    MatrixType m_tmp;
+  /** \brief Reference to the base of matrix power. */
+  typename MatrixType::Nested m_A;
 
-    /** \brief Store the result of Schur decomposition. */
-    ComplexMatrix m_T, m_U;
-    
-    /** \brief Store fractional power of m_T. */
-    ComplexMatrix m_fT;
+  /** \brief Temporary storage. */
+  MatrixType m_tmp;
 
-    /**
-     * \brief Condition number of m_A.
-     *
-     * It is initialized as 0 to avoid performing unnecessary Schur
-     * decomposition, which is the bottleneck.
-     */
-    RealScalar m_conditionNumber;
+  /** \brief Store the result of Schur decomposition. */
+  ComplexMatrix m_T, m_U;
 
-    /** \brief Rank of m_A. */
-    Index m_rank;
-    
-    /** \brief Rank deficiency of m_A. */
-    Index m_nulls;
+  /** \brief Store fractional power of m_T. */
+  ComplexMatrix m_fT;
 
-    /**
-     * \brief Split p into integral part and fractional part.
-     *
-     * \param[in]  p        The exponent.
-     * \param[out] p        The fractional part ranging in \f$ (-1, 1) \f$.
-     * \param[out] intpart  The integral part.
-     *
-     * Only if the fractional part is nonzero, it calls initialize().
-     */
-    void split(RealScalar& p, RealScalar& intpart);
+  /**
+   * \brief Condition number of m_A.
+   *
+   * It is initialized as 0 to avoid performing unnecessary Schur
+   * decomposition, which is the bottleneck.
+   */
+  RealScalar m_conditionNumber;
 
-    /** \brief Perform Schur decomposition for fractional power. */
-    void initialize();
+  /** \brief Rank of m_A. */
+  Index m_rank;
 
-    template<typename ResultType>
-    void computeIntPower(ResultType& res, RealScalar p);
+  /** \brief Rank deficiency of m_A. */
+  Index m_nulls;
 
-    template<typename ResultType>
-    void computeFracPower(ResultType& res, RealScalar p);
+  /**
+   * \brief Split p into integral part and fractional part.
+   *
+   * \param[in]  p        The exponent.
+   * \param[out] p        The fractional part ranging in \f$ (-1, 1) \f$.
+   * \param[out] intpart  The integral part.
+   *
+   * Only if the fractional part is nonzero, it calls initialize().
+   */
+  void split(RealScalar& p, RealScalar& intpart);
 
-    template<int Rows, int Cols, int Options, int MaxRows, int MaxCols>
-    static void revertSchur(
-        Matrix<ComplexScalar, Rows, Cols, Options, MaxRows, MaxCols>& res,
-        const ComplexMatrix& T,
-        const ComplexMatrix& U);
+  /** \brief Perform Schur decomposition for fractional power. */
+  void initialize();
 
-    template<int Rows, int Cols, int Options, int MaxRows, int MaxCols>
-    static void revertSchur(
-        Matrix<RealScalar, Rows, Cols, Options, MaxRows, MaxCols>& res,
-        const ComplexMatrix& T,
-        const ComplexMatrix& U);
+  template <typename ResultType>
+  void computeIntPower(ResultType& res, RealScalar p);
+
+  template <typename ResultType>
+  void computeFracPower(ResultType& res, RealScalar p);
+
+  template <int Rows, int Cols, int Options, int MaxRows, int MaxCols>
+  static void revertSchur(Matrix<ComplexScalar, Rows, Cols, Options, MaxRows, MaxCols>& res, const ComplexMatrix& T,
+                          const ComplexMatrix& U);
+
+  template <int Rows, int Cols, int Options, int MaxRows, int MaxCols>
+  static void revertSchur(Matrix<RealScalar, Rows, Cols, Options, MaxRows, MaxCols>& res, const ComplexMatrix& T,
+                          const ComplexMatrix& U);
 };
 
-template<typename MatrixType>
-template<typename ResultType>
-void MatrixPower<MatrixType>::compute(ResultType& res, RealScalar p)
-{
+template <typename MatrixType>
+template <typename ResultType>
+void MatrixPower<MatrixType>::compute(ResultType& res, RealScalar p) {
   using std::pow;
   switch (cols()) {
     case 0:
       break;
     case 1:
-      res(0,0) = pow(m_A.coeff(0,0), p);
+      res(0, 0) = pow(m_A.coeff(0, 0), p);
       break;
     default:
       RealScalar intpart;
@@ -467,9 +459,8 @@
   }
 }
 
-template<typename MatrixType>
-void MatrixPower<MatrixType>::split(RealScalar& p, RealScalar& intpart)
-{
+template <typename MatrixType>
+void MatrixPower<MatrixType>::split(RealScalar& p, RealScalar& intpart) {
   using std::floor;
   using std::pow;
 
@@ -478,19 +469,17 @@
 
   // Perform Schur decomposition if it is not yet performed and the power is
   // not an integer.
-  if (!m_conditionNumber && p)
-    initialize();
+  if (!m_conditionNumber && p) initialize();
 
   // Choose the more stable of intpart = floor(p) and intpart = ceil(p).
-  if (p > RealScalar(0.5) && p > (1-p) * pow(m_conditionNumber, p)) {
+  if (p > RealScalar(0.5) && p > (1 - p) * pow(m_conditionNumber, p)) {
     --p;
     ++intpart;
   }
 }
 
-template<typename MatrixType>
-void MatrixPower<MatrixType>::initialize()
-{
+template <typename MatrixType>
+void MatrixPower<MatrixType>::initialize() {
   const ComplexSchur<MatrixType> schurOfA(m_A);
   JacobiRotation<ComplexScalar> rot;
   ComplexScalar eigenvalue;
@@ -501,18 +490,17 @@
   m_conditionNumber = m_T.diagonal().array().abs().maxCoeff() / m_T.diagonal().array().abs().minCoeff();
 
   // Move zero eigenvalues to the bottom right corner.
-  for (Index i = cols()-1; i>=0; --i) {
-    if (m_rank <= 2)
-      return;
-    if (m_T.coeff(i,i) == RealScalar(0)) {
-      for (Index j=i+1; j < m_rank; ++j) {
-        eigenvalue = m_T.coeff(j,j);
-        rot.makeGivens(m_T.coeff(j-1,j), eigenvalue);
-        m_T.applyOnTheRight(j-1, j, rot);
-        m_T.applyOnTheLeft(j-1, j, rot.adjoint());
-        m_T.coeffRef(j-1,j-1) = eigenvalue;
-        m_T.coeffRef(j,j) = RealScalar(0);
-        m_U.applyOnTheRight(j-1, j, rot);
+  for (Index i = cols() - 1; i >= 0; --i) {
+    if (m_rank <= 2) return;
+    if (m_T.coeff(i, i) == RealScalar(0)) {
+      for (Index j = i + 1; j < m_rank; ++j) {
+        eigenvalue = m_T.coeff(j, j);
+        rot.makeGivens(m_T.coeff(j - 1, j), eigenvalue);
+        m_T.applyOnTheRight(j - 1, j, rot);
+        m_T.applyOnTheLeft(j - 1, j, rot.adjoint());
+        m_T.coeffRef(j - 1, j - 1) = eigenvalue;
+        m_T.coeffRef(j, j) = RealScalar(0);
+        m_U.applyOnTheRight(j - 1, j, rot);
       }
       --m_rank;
     }
@@ -520,67 +508,62 @@
 
   m_nulls = rows() - m_rank;
   if (m_nulls) {
-    eigen_assert(m_T.bottomRightCorner(m_nulls, m_nulls).isZero()
-        && "Base of matrix power should be invertible or with a semisimple zero eigenvalue.");
+    eigen_assert(m_T.bottomRightCorner(m_nulls, m_nulls).isZero() &&
+                 "Base of matrix power should be invertible or with a semisimple zero eigenvalue.");
     m_fT.bottomRows(m_nulls).fill(RealScalar(0));
   }
 }
 
-template<typename MatrixType>
-template<typename ResultType>
-void MatrixPower<MatrixType>::computeIntPower(ResultType& res, RealScalar p)
-{
+template <typename MatrixType>
+template <typename ResultType>
+void MatrixPower<MatrixType>::computeIntPower(ResultType& res, RealScalar p) {
   using std::abs;
   using std::fmod;
   RealScalar pp = abs(p);
 
-  if (p<0) 
+  if (p < 0)
     m_tmp = m_A.inverse();
-  else     
+  else
     m_tmp = m_A;
 
   while (true) {
-    if (fmod(pp, 2) >= 1)
-      res = m_tmp * res;
+    if (fmod(pp, 2) >= 1) res = m_tmp * res;
     pp /= 2;
-    if (pp < 1)
-      break;
+    if (pp < 1) break;
     m_tmp *= m_tmp;
   }
 }
 
-template<typename MatrixType>
-template<typename ResultType>
-void MatrixPower<MatrixType>::computeFracPower(ResultType& res, RealScalar p)
-{
-  Block<ComplexMatrix,Dynamic,Dynamic> blockTp(m_fT, 0, 0, m_rank, m_rank);
+template <typename MatrixType>
+template <typename ResultType>
+void MatrixPower<MatrixType>::computeFracPower(ResultType& res, RealScalar p) {
+  Block<ComplexMatrix, Dynamic, Dynamic> blockTp(m_fT, 0, 0, m_rank, m_rank);
   eigen_assert(m_conditionNumber);
   eigen_assert(m_rank + m_nulls == rows());
 
   MatrixPowerAtomic<ComplexMatrix>(m_T.topLeftCorner(m_rank, m_rank), p).compute(blockTp);
   if (m_nulls) {
-    m_fT.topRightCorner(m_rank, m_nulls) = m_T.topLeftCorner(m_rank, m_rank).template triangularView<Upper>()
-        .solve(blockTp * m_T.topRightCorner(m_rank, m_nulls));
+    m_fT.topRightCorner(m_rank, m_nulls) = m_T.topLeftCorner(m_rank, m_rank)
+                                               .template triangularView<Upper>()
+                                               .solve(blockTp * m_T.topRightCorner(m_rank, m_nulls));
   }
   revertSchur(m_tmp, m_fT, m_U);
   res = m_tmp * res;
 }
 
-template<typename MatrixType>
-template<int Rows, int Cols, int Options, int MaxRows, int MaxCols>
-inline void MatrixPower<MatrixType>::revertSchur(
-    Matrix<ComplexScalar, Rows, Cols, Options, MaxRows, MaxCols>& res,
-    const ComplexMatrix& T,
-    const ComplexMatrix& U)
-{ res.noalias() = U * (T.template triangularView<Upper>() * U.adjoint()); }
+template <typename MatrixType>
+template <int Rows, int Cols, int Options, int MaxRows, int MaxCols>
+inline void MatrixPower<MatrixType>::revertSchur(Matrix<ComplexScalar, Rows, Cols, Options, MaxRows, MaxCols>& res,
+                                                 const ComplexMatrix& T, const ComplexMatrix& U) {
+  res.noalias() = U * (T.template triangularView<Upper>() * U.adjoint());
+}
 
-template<typename MatrixType>
-template<int Rows, int Cols, int Options, int MaxRows, int MaxCols>
-inline void MatrixPower<MatrixType>::revertSchur(
-    Matrix<RealScalar, Rows, Cols, Options, MaxRows, MaxCols>& res,
-    const ComplexMatrix& T,
-    const ComplexMatrix& U)
-{ res.noalias() = (U * (T.template triangularView<Upper>() * U.adjoint())).real(); }
+template <typename MatrixType>
+template <int Rows, int Cols, int Options, int MaxRows, int MaxCols>
+inline void MatrixPower<MatrixType>::revertSchur(Matrix<RealScalar, Rows, Cols, Options, MaxRows, MaxCols>& res,
+                                                 const ComplexMatrix& T, const ComplexMatrix& U) {
+  res.noalias() = (U * (T.template triangularView<Upper>() * U.adjoint())).real();
+}
 
 /**
  * \ingroup MatrixFunctions_Module
@@ -595,38 +578,37 @@
  * MatrixBase::pow() and related functions and most of the
  * time this is the only way it is used.
  */
-template<typename Derived>
-class MatrixPowerReturnValue : public ReturnByValue< MatrixPowerReturnValue<Derived> >
-{
-  public:
-    typedef typename Derived::PlainObject PlainObject;
-    typedef typename Derived::RealScalar RealScalar;
+template <typename Derived>
+class MatrixPowerReturnValue : public ReturnByValue<MatrixPowerReturnValue<Derived> > {
+ public:
+  typedef typename Derived::PlainObject PlainObject;
+  typedef typename Derived::RealScalar RealScalar;
 
-    /**
-     * \brief Constructor.
-     *
-     * \param[in] A  %Matrix (expression), the base of the matrix power.
-     * \param[in] p  real scalar, the exponent of the matrix power.
-     */
-    MatrixPowerReturnValue(const Derived& A, RealScalar p) : m_A(A), m_p(p)
-    { }
+  /**
+   * \brief Constructor.
+   *
+   * \param[in] A  %Matrix (expression), the base of the matrix power.
+   * \param[in] p  real scalar, the exponent of the matrix power.
+   */
+  MatrixPowerReturnValue(const Derived& A, RealScalar p) : m_A(A), m_p(p) {}
 
-    /**
-     * \brief Compute the matrix power.
-     *
-     * \param[out] result  \f$ A^p \f$ where \p A and \p p are as in the
-     * constructor.
-     */
-    template<typename ResultType>
-    inline void evalTo(ResultType& result) const
-    { MatrixPower<PlainObject>(m_A.eval()).compute(result, m_p); }
+  /**
+   * \brief Compute the matrix power.
+   *
+   * \param[out] result  \f$ A^p \f$ where \p A and \p p are as in the
+   * constructor.
+   */
+  template <typename ResultType>
+  inline void evalTo(ResultType& result) const {
+    MatrixPower<PlainObject>(m_A.eval()).compute(result, m_p);
+  }
 
-    Index rows() const { return m_A.rows(); }
-    Index cols() const { return m_A.cols(); }
+  Index rows() const { return m_A.rows(); }
+  Index cols() const { return m_A.cols(); }
 
-  private:
-    const Derived& m_A;
-    const RealScalar m_p;
+ private:
+  const Derived& m_A;
+  const RealScalar m_p;
 };
 
 /**
@@ -642,67 +624,71 @@
  * MatrixBase::pow() and related functions and most of the
  * time this is the only way it is used.
  */
-template<typename Derived>
-class MatrixComplexPowerReturnValue : public ReturnByValue< MatrixComplexPowerReturnValue<Derived> >
-{
-  public:
-    typedef typename Derived::PlainObject PlainObject;
-    typedef typename std::complex<typename Derived::RealScalar> ComplexScalar;
+template <typename Derived>
+class MatrixComplexPowerReturnValue : public ReturnByValue<MatrixComplexPowerReturnValue<Derived> > {
+ public:
+  typedef typename Derived::PlainObject PlainObject;
+  typedef typename std::complex<typename Derived::RealScalar> ComplexScalar;
 
-    /**
-     * \brief Constructor.
-     *
-     * \param[in] A  %Matrix (expression), the base of the matrix power.
-     * \param[in] p  complex scalar, the exponent of the matrix power.
-     */
-    MatrixComplexPowerReturnValue(const Derived& A, const ComplexScalar& p) : m_A(A), m_p(p)
-    { }
+  /**
+   * \brief Constructor.
+   *
+   * \param[in] A  %Matrix (expression), the base of the matrix power.
+   * \param[in] p  complex scalar, the exponent of the matrix power.
+   */
+  MatrixComplexPowerReturnValue(const Derived& A, const ComplexScalar& p) : m_A(A), m_p(p) {}
 
-    /**
-     * \brief Compute the matrix power.
-     *
-     * Because \p p is complex, \f$ A^p \f$ is simply evaluated as \f$
-     * \exp(p \log(A)) \f$.
-     *
-     * \param[out] result  \f$ A^p \f$ where \p A and \p p are as in the
-     * constructor.
-     */
-    template<typename ResultType>
-    inline void evalTo(ResultType& result) const
-    { result = (m_p * m_A.log()).exp(); }
+  /**
+   * \brief Compute the matrix power.
+   *
+   * Because \p p is complex, \f$ A^p \f$ is simply evaluated as \f$
+   * \exp(p \log(A)) \f$.
+   *
+   * \param[out] result  \f$ A^p \f$ where \p A and \p p are as in the
+   * constructor.
+   */
+  template <typename ResultType>
+  inline void evalTo(ResultType& result) const {
+    result = (m_p * m_A.log()).exp();
+  }
 
-    Index rows() const { return m_A.rows(); }
-    Index cols() const { return m_A.cols(); }
+  Index rows() const { return m_A.rows(); }
+  Index cols() const { return m_A.cols(); }
 
-  private:
-    const Derived& m_A;
-    const ComplexScalar m_p;
+ private:
+  const Derived& m_A;
+  const ComplexScalar m_p;
 };
 
 namespace internal {
 
-template<typename MatrixPowerType>
-struct traits< MatrixPowerParenthesesReturnValue<MatrixPowerType> >
-{ typedef typename MatrixPowerType::PlainObject ReturnType; };
+template <typename MatrixPowerType>
+struct traits<MatrixPowerParenthesesReturnValue<MatrixPowerType> > {
+  typedef typename MatrixPowerType::PlainObject ReturnType;
+};
 
-template<typename Derived>
-struct traits< MatrixPowerReturnValue<Derived> >
-{ typedef typename Derived::PlainObject ReturnType; };
+template <typename Derived>
+struct traits<MatrixPowerReturnValue<Derived> > {
+  typedef typename Derived::PlainObject ReturnType;
+};
 
-template<typename Derived>
-struct traits< MatrixComplexPowerReturnValue<Derived> >
-{ typedef typename Derived::PlainObject ReturnType; };
+template <typename Derived>
+struct traits<MatrixComplexPowerReturnValue<Derived> > {
+  typedef typename Derived::PlainObject ReturnType;
+};
 
+}  // namespace internal
+
+template <typename Derived>
+const MatrixPowerReturnValue<Derived> MatrixBase<Derived>::pow(const RealScalar& p) const {
+  return MatrixPowerReturnValue<Derived>(derived(), p);
 }
 
-template<typename Derived>
-const MatrixPowerReturnValue<Derived> MatrixBase<Derived>::pow(const RealScalar& p) const
-{ return MatrixPowerReturnValue<Derived>(derived(), p); }
+template <typename Derived>
+const MatrixComplexPowerReturnValue<Derived> MatrixBase<Derived>::pow(const std::complex<RealScalar>& p) const {
+  return MatrixComplexPowerReturnValue<Derived>(derived(), p);
+}
 
-template<typename Derived>
-const MatrixComplexPowerReturnValue<Derived> MatrixBase<Derived>::pow(const std::complex<RealScalar>& p) const
-{ return MatrixComplexPowerReturnValue<Derived>(derived(), p); }
+}  // namespace Eigen
 
-} // namespace Eigen
-
-#endif // EIGEN_MATRIX_POWER
+#endif  // EIGEN_MATRIX_POWER
diff --git a/unsupported/Eigen/src/MatrixFunctions/MatrixSquareRoot.h b/unsupported/Eigen/src/MatrixFunctions/MatrixSquareRoot.h
index 99b76d0..b11eb74 100644
--- a/unsupported/Eigen/src/MatrixFunctions/MatrixSquareRoot.h
+++ b/unsupported/Eigen/src/MatrixFunctions/MatrixSquareRoot.h
@@ -13,123 +13,113 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
 // pre:  T.block(i,i,2,2) has complex conjugate eigenvalues
 // post: sqrtT.block(i,i,2,2) is square root of T.block(i,i,2,2)
 template <typename MatrixType, typename ResultType>
-void matrix_sqrt_quasi_triangular_2x2_diagonal_block(const MatrixType& T, Index i, ResultType& sqrtT)
-{
+void matrix_sqrt_quasi_triangular_2x2_diagonal_block(const MatrixType& T, Index i, ResultType& sqrtT) {
   // TODO: This case (2-by-2 blocks with complex conjugate eigenvalues) is probably hidden somewhere
   //       in EigenSolver. If we expose it, we could call it directly from here.
   typedef typename traits<MatrixType>::Scalar Scalar;
-  Matrix<Scalar,2,2> block = T.template block<2,2>(i,i);
-  EigenSolver<Matrix<Scalar,2,2> > es(block);
-  sqrtT.template block<2,2>(i,i)
-    = (es.eigenvectors() * es.eigenvalues().cwiseSqrt().asDiagonal() * es.eigenvectors().inverse()).real();
+  Matrix<Scalar, 2, 2> block = T.template block<2, 2>(i, i);
+  EigenSolver<Matrix<Scalar, 2, 2> > es(block);
+  sqrtT.template block<2, 2>(i, i) =
+      (es.eigenvectors() * es.eigenvalues().cwiseSqrt().asDiagonal() * es.eigenvectors().inverse()).real();
 }
 
 // pre:  block structure of T is such that (i,j) is a 1x1 block,
 //       all blocks of sqrtT to left of and below (i,j) are correct
 // post: sqrtT(i,j) has the correct value
 template <typename MatrixType, typename ResultType>
-void matrix_sqrt_quasi_triangular_1x1_off_diagonal_block(const MatrixType& T, Index i, Index j, ResultType& sqrtT)
-{
+void matrix_sqrt_quasi_triangular_1x1_off_diagonal_block(const MatrixType& T, Index i, Index j, ResultType& sqrtT) {
   typedef typename traits<MatrixType>::Scalar Scalar;
-  Scalar tmp = (sqrtT.row(i).segment(i+1,j-i-1) * sqrtT.col(j).segment(i+1,j-i-1)).value();
-  sqrtT.coeffRef(i,j) = (T.coeff(i,j) - tmp) / (sqrtT.coeff(i,i) + sqrtT.coeff(j,j));
+  Scalar tmp = (sqrtT.row(i).segment(i + 1, j - i - 1) * sqrtT.col(j).segment(i + 1, j - i - 1)).value();
+  sqrtT.coeffRef(i, j) = (T.coeff(i, j) - tmp) / (sqrtT.coeff(i, i) + sqrtT.coeff(j, j));
 }
 
 // similar to compute1x1offDiagonalBlock()
 template <typename MatrixType, typename ResultType>
-void matrix_sqrt_quasi_triangular_1x2_off_diagonal_block(const MatrixType& T, Index i, Index j, ResultType& sqrtT)
-{
+void matrix_sqrt_quasi_triangular_1x2_off_diagonal_block(const MatrixType& T, Index i, Index j, ResultType& sqrtT) {
   typedef typename traits<MatrixType>::Scalar Scalar;
-  Matrix<Scalar,1,2> rhs = T.template block<1,2>(i,j);
-  if (j-i > 1)
-    rhs -= sqrtT.block(i, i+1, 1, j-i-1) * sqrtT.block(i+1, j, j-i-1, 2);
-  Matrix<Scalar,2,2> A = sqrtT.coeff(i,i) * Matrix<Scalar,2,2>::Identity();
-  A += sqrtT.template block<2,2>(j,j).transpose();
-  sqrtT.template block<1,2>(i,j).transpose() = A.fullPivLu().solve(rhs.transpose());
+  Matrix<Scalar, 1, 2> rhs = T.template block<1, 2>(i, j);
+  if (j - i > 1) rhs -= sqrtT.block(i, i + 1, 1, j - i - 1) * sqrtT.block(i + 1, j, j - i - 1, 2);
+  Matrix<Scalar, 2, 2> A = sqrtT.coeff(i, i) * Matrix<Scalar, 2, 2>::Identity();
+  A += sqrtT.template block<2, 2>(j, j).transpose();
+  sqrtT.template block<1, 2>(i, j).transpose() = A.fullPivLu().solve(rhs.transpose());
 }
 
 // similar to compute1x1offDiagonalBlock()
 template <typename MatrixType, typename ResultType>
-void matrix_sqrt_quasi_triangular_2x1_off_diagonal_block(const MatrixType& T, Index i, Index j, ResultType& sqrtT)
-{
+void matrix_sqrt_quasi_triangular_2x1_off_diagonal_block(const MatrixType& T, Index i, Index j, ResultType& sqrtT) {
   typedef typename traits<MatrixType>::Scalar Scalar;
-  Matrix<Scalar,2,1> rhs = T.template block<2,1>(i,j);
-  if (j-i > 2)
-    rhs -= sqrtT.block(i, i+2, 2, j-i-2) * sqrtT.block(i+2, j, j-i-2, 1);
-  Matrix<Scalar,2,2> A = sqrtT.coeff(j,j) * Matrix<Scalar,2,2>::Identity();
-  A += sqrtT.template block<2,2>(i,i);
-  sqrtT.template block<2,1>(i,j) = A.fullPivLu().solve(rhs);
+  Matrix<Scalar, 2, 1> rhs = T.template block<2, 1>(i, j);
+  if (j - i > 2) rhs -= sqrtT.block(i, i + 2, 2, j - i - 2) * sqrtT.block(i + 2, j, j - i - 2, 1);
+  Matrix<Scalar, 2, 2> A = sqrtT.coeff(j, j) * Matrix<Scalar, 2, 2>::Identity();
+  A += sqrtT.template block<2, 2>(i, i);
+  sqrtT.template block<2, 1>(i, j) = A.fullPivLu().solve(rhs);
 }
 
 // solves the equation A X + X B = C where all matrices are 2-by-2
 template <typename MatrixType>
-void matrix_sqrt_quasi_triangular_solve_auxiliary_equation(MatrixType& X, const MatrixType& A, const MatrixType& B, const MatrixType& C)
-{
+void matrix_sqrt_quasi_triangular_solve_auxiliary_equation(MatrixType& X, const MatrixType& A, const MatrixType& B,
+                                                           const MatrixType& C) {
   typedef typename traits<MatrixType>::Scalar Scalar;
-  Matrix<Scalar,4,4> coeffMatrix = Matrix<Scalar,4,4>::Zero();
-  coeffMatrix.coeffRef(0,0) = A.coeff(0,0) + B.coeff(0,0);
-  coeffMatrix.coeffRef(1,1) = A.coeff(0,0) + B.coeff(1,1);
-  coeffMatrix.coeffRef(2,2) = A.coeff(1,1) + B.coeff(0,0);
-  coeffMatrix.coeffRef(3,3) = A.coeff(1,1) + B.coeff(1,1);
-  coeffMatrix.coeffRef(0,1) = B.coeff(1,0);
-  coeffMatrix.coeffRef(0,2) = A.coeff(0,1);
-  coeffMatrix.coeffRef(1,0) = B.coeff(0,1);
-  coeffMatrix.coeffRef(1,3) = A.coeff(0,1);
-  coeffMatrix.coeffRef(2,0) = A.coeff(1,0);
-  coeffMatrix.coeffRef(2,3) = B.coeff(1,0);
-  coeffMatrix.coeffRef(3,1) = A.coeff(1,0);
-  coeffMatrix.coeffRef(3,2) = B.coeff(0,1);
+  Matrix<Scalar, 4, 4> coeffMatrix = Matrix<Scalar, 4, 4>::Zero();
+  coeffMatrix.coeffRef(0, 0) = A.coeff(0, 0) + B.coeff(0, 0);
+  coeffMatrix.coeffRef(1, 1) = A.coeff(0, 0) + B.coeff(1, 1);
+  coeffMatrix.coeffRef(2, 2) = A.coeff(1, 1) + B.coeff(0, 0);
+  coeffMatrix.coeffRef(3, 3) = A.coeff(1, 1) + B.coeff(1, 1);
+  coeffMatrix.coeffRef(0, 1) = B.coeff(1, 0);
+  coeffMatrix.coeffRef(0, 2) = A.coeff(0, 1);
+  coeffMatrix.coeffRef(1, 0) = B.coeff(0, 1);
+  coeffMatrix.coeffRef(1, 3) = A.coeff(0, 1);
+  coeffMatrix.coeffRef(2, 0) = A.coeff(1, 0);
+  coeffMatrix.coeffRef(2, 3) = B.coeff(1, 0);
+  coeffMatrix.coeffRef(3, 1) = A.coeff(1, 0);
+  coeffMatrix.coeffRef(3, 2) = B.coeff(0, 1);
 
-  Matrix<Scalar,4,1> rhs;
-  rhs.coeffRef(0) = C.coeff(0,0);
-  rhs.coeffRef(1) = C.coeff(0,1);
-  rhs.coeffRef(2) = C.coeff(1,0);
-  rhs.coeffRef(3) = C.coeff(1,1);
+  Matrix<Scalar, 4, 1> rhs;
+  rhs.coeffRef(0) = C.coeff(0, 0);
+  rhs.coeffRef(1) = C.coeff(0, 1);
+  rhs.coeffRef(2) = C.coeff(1, 0);
+  rhs.coeffRef(3) = C.coeff(1, 1);
 
-  Matrix<Scalar,4,1> result;
+  Matrix<Scalar, 4, 1> result;
   result = coeffMatrix.fullPivLu().solve(rhs);
 
-  X.coeffRef(0,0) = result.coeff(0);
-  X.coeffRef(0,1) = result.coeff(1);
-  X.coeffRef(1,0) = result.coeff(2);
-  X.coeffRef(1,1) = result.coeff(3);
+  X.coeffRef(0, 0) = result.coeff(0);
+  X.coeffRef(0, 1) = result.coeff(1);
+  X.coeffRef(1, 0) = result.coeff(2);
+  X.coeffRef(1, 1) = result.coeff(3);
 }
 
 // similar to compute1x1offDiagonalBlock()
 template <typename MatrixType, typename ResultType>
-void matrix_sqrt_quasi_triangular_2x2_off_diagonal_block(const MatrixType& T, Index i, Index j, ResultType& sqrtT)
-{
+void matrix_sqrt_quasi_triangular_2x2_off_diagonal_block(const MatrixType& T, Index i, Index j, ResultType& sqrtT) {
   typedef typename traits<MatrixType>::Scalar Scalar;
-  Matrix<Scalar,2,2> A = sqrtT.template block<2,2>(i,i);
-  Matrix<Scalar,2,2> B = sqrtT.template block<2,2>(j,j);
-  Matrix<Scalar,2,2> C = T.template block<2,2>(i,j);
-  if (j-i > 2)
-    C -= sqrtT.block(i, i+2, 2, j-i-2) * sqrtT.block(i+2, j, j-i-2, 2);
-  Matrix<Scalar,2,2> X;
+  Matrix<Scalar, 2, 2> A = sqrtT.template block<2, 2>(i, i);
+  Matrix<Scalar, 2, 2> B = sqrtT.template block<2, 2>(j, j);
+  Matrix<Scalar, 2, 2> C = T.template block<2, 2>(i, j);
+  if (j - i > 2) C -= sqrtT.block(i, i + 2, 2, j - i - 2) * sqrtT.block(i + 2, j, j - i - 2, 2);
+  Matrix<Scalar, 2, 2> X;
   matrix_sqrt_quasi_triangular_solve_auxiliary_equation(X, A, B, C);
-  sqrtT.template block<2,2>(i,j) = X;
+  sqrtT.template block<2, 2>(i, j) = X;
 }
 
 // pre:  T is quasi-upper-triangular and sqrtT is a zero matrix of the same size
 // post: the diagonal blocks of sqrtT are the square roots of the diagonal blocks of T
 template <typename MatrixType, typename ResultType>
-void matrix_sqrt_quasi_triangular_diagonal(const MatrixType& T, ResultType& sqrtT)
-{
+void matrix_sqrt_quasi_triangular_diagonal(const MatrixType& T, ResultType& sqrtT) {
   using std::sqrt;
   const Index size = T.rows();
   for (Index i = 0; i < size; i++) {
-    if (i == size - 1 || T.coeff(i+1, i) == 0) {
-      eigen_assert(T(i,i) >= 0);
-      sqrtT.coeffRef(i,i) = sqrt(T.coeff(i,i));
-    }
-    else {
+    if (i == size - 1 || T.coeff(i + 1, i) == 0) {
+      eigen_assert(T(i, i) >= 0);
+      sqrtT.coeffRef(i, i) = sqrt(T.coeff(i, i));
+    } else {
       matrix_sqrt_quasi_triangular_2x2_diagonal_block(T, i, sqrtT);
       ++i;
     }
@@ -139,73 +129,69 @@
 // pre:  T is quasi-upper-triangular and diagonal blocks of sqrtT are square root of diagonal blocks of T.
 // post: sqrtT is the square root of T.
 template <typename MatrixType, typename ResultType>
-void matrix_sqrt_quasi_triangular_off_diagonal(const MatrixType& T, ResultType& sqrtT)
-{
+void matrix_sqrt_quasi_triangular_off_diagonal(const MatrixType& T, ResultType& sqrtT) {
   const Index size = T.rows();
   for (Index j = 1; j < size; j++) {
-      if (T.coeff(j, j-1) != 0)  // if T(j-1:j, j-1:j) is a 2-by-2 block
-	continue;
-    for (Index i = j-1; i >= 0; i--) {
-      if (i > 0 && T.coeff(i, i-1) != 0)  // if T(i-1:i, i-1:i) is a 2-by-2 block
-	continue;
-      bool iBlockIs2x2 = (i < size - 1) && (T.coeff(i+1, i) != 0);
-      bool jBlockIs2x2 = (j < size - 1) && (T.coeff(j+1, j) != 0);
-      if (iBlockIs2x2 && jBlockIs2x2) 
+    if (T.coeff(j, j - 1) != 0)  // if T(j-1:j, j-1:j) is a 2-by-2 block
+      continue;
+    for (Index i = j - 1; i >= 0; i--) {
+      if (i > 0 && T.coeff(i, i - 1) != 0)  // if T(i-1:i, i-1:i) is a 2-by-2 block
+        continue;
+      bool iBlockIs2x2 = (i < size - 1) && (T.coeff(i + 1, i) != 0);
+      bool jBlockIs2x2 = (j < size - 1) && (T.coeff(j + 1, j) != 0);
+      if (iBlockIs2x2 && jBlockIs2x2)
         matrix_sqrt_quasi_triangular_2x2_off_diagonal_block(T, i, j, sqrtT);
-      else if (iBlockIs2x2 && !jBlockIs2x2) 
+      else if (iBlockIs2x2 && !jBlockIs2x2)
         matrix_sqrt_quasi_triangular_2x1_off_diagonal_block(T, i, j, sqrtT);
-      else if (!iBlockIs2x2 && jBlockIs2x2) 
+      else if (!iBlockIs2x2 && jBlockIs2x2)
         matrix_sqrt_quasi_triangular_1x2_off_diagonal_block(T, i, j, sqrtT);
-      else if (!iBlockIs2x2 && !jBlockIs2x2) 
+      else if (!iBlockIs2x2 && !jBlockIs2x2)
         matrix_sqrt_quasi_triangular_1x1_off_diagonal_block(T, i, j, sqrtT);
     }
   }
 }
 
-} // end of namespace internal
+}  // end of namespace internal
 
 /** \ingroup MatrixFunctions_Module
-  * \brief Compute matrix square root of quasi-triangular matrix.
-  *
-  * \tparam  MatrixType  type of \p arg, the argument of matrix square root,
-  *                      expected to be an instantiation of the Matrix class template.
-  * \tparam  ResultType  type of \p result, where result is to be stored.
-  * \param[in]  arg      argument of matrix square root.
-  * \param[out] result   matrix square root of upper Hessenberg part of \p arg.
-  *
-  * This function computes the square root of the upper quasi-triangular matrix stored in the upper
-  * Hessenberg part of \p arg.  Only the upper Hessenberg part of \p result is updated, the rest is
-  * not touched.  See MatrixBase::sqrt() for details on how this computation is implemented.
-  *
-  * \sa MatrixSquareRoot, MatrixSquareRootQuasiTriangular
-  */
-template <typename MatrixType, typename ResultType> 
-void matrix_sqrt_quasi_triangular(const MatrixType &arg, ResultType &result)
-{
+ * \brief Compute matrix square root of quasi-triangular matrix.
+ *
+ * \tparam  MatrixType  type of \p arg, the argument of matrix square root,
+ *                      expected to be an instantiation of the Matrix class template.
+ * \tparam  ResultType  type of \p result, where result is to be stored.
+ * \param[in]  arg      argument of matrix square root.
+ * \param[out] result   matrix square root of upper Hessenberg part of \p arg.
+ *
+ * This function computes the square root of the upper quasi-triangular matrix stored in the upper
+ * Hessenberg part of \p arg.  Only the upper Hessenberg part of \p result is updated, the rest is
+ * not touched.  See MatrixBase::sqrt() for details on how this computation is implemented.
+ *
+ * \sa MatrixSquareRoot, MatrixSquareRootQuasiTriangular
+ */
+template <typename MatrixType, typename ResultType>
+void matrix_sqrt_quasi_triangular(const MatrixType& arg, ResultType& result) {
   eigen_assert(arg.rows() == arg.cols());
   result.resize(arg.rows(), arg.cols());
   internal::matrix_sqrt_quasi_triangular_diagonal(arg, result);
   internal::matrix_sqrt_quasi_triangular_off_diagonal(arg, result);
 }
 
-
 /** \ingroup MatrixFunctions_Module
-  * \brief Compute matrix square root of triangular matrix.
-  *
-  * \tparam  MatrixType  type of \p arg, the argument of matrix square root,
-  *                      expected to be an instantiation of the Matrix class template.
-  * \tparam  ResultType  type of \p result, where result is to be stored.
-  * \param[in]  arg      argument of matrix square root.
-  * \param[out] result   matrix square root of upper triangular part of \p arg.
-  *
-  * Only the upper triangular part (including the diagonal) of \p result is updated, the rest is not
-  * touched.  See MatrixBase::sqrt() for details on how this computation is implemented.
-  *
-  * \sa MatrixSquareRoot, MatrixSquareRootQuasiTriangular
-  */
-template <typename MatrixType, typename ResultType> 
-void matrix_sqrt_triangular(const MatrixType &arg, ResultType &result)
-{
+ * \brief Compute matrix square root of triangular matrix.
+ *
+ * \tparam  MatrixType  type of \p arg, the argument of matrix square root,
+ *                      expected to be an instantiation of the Matrix class template.
+ * \tparam  ResultType  type of \p result, where result is to be stored.
+ * \param[in]  arg      argument of matrix square root.
+ * \param[out] result   matrix square root of upper triangular part of \p arg.
+ *
+ * Only the upper triangular part (including the diagonal) of \p result is updated, the rest is not
+ * touched.  See MatrixBase::sqrt() for details on how this computation is implemented.
+ *
+ * \sa MatrixSquareRoot, MatrixSquareRootQuasiTriangular
+ */
+template <typename MatrixType, typename ResultType>
+void matrix_sqrt_triangular(const MatrixType& arg, ResultType& result) {
   using std::sqrt;
   typedef typename MatrixType::Scalar Scalar;
 
@@ -215,157 +201,146 @@
   // This uses that the square root of triangular matrices can be computed directly.
   result.resize(arg.rows(), arg.cols());
   for (Index i = 0; i < arg.rows(); i++) {
-    result.coeffRef(i,i) = sqrt(arg.coeff(i,i));
+    result.coeffRef(i, i) = sqrt(arg.coeff(i, i));
   }
   for (Index j = 1; j < arg.cols(); j++) {
-    for (Index i = j-1; i >= 0; i--) {
+    for (Index i = j - 1; i >= 0; i--) {
       // if i = j-1, then segment has length 0 so tmp = 0
-      Scalar tmp = (result.row(i).segment(i+1,j-i-1) * result.col(j).segment(i+1,j-i-1)).value();
+      Scalar tmp = (result.row(i).segment(i + 1, j - i - 1) * result.col(j).segment(i + 1, j - i - 1)).value();
       // denominator may be zero if original matrix is singular
-      result.coeffRef(i,j) = (arg.coeff(i,j) - tmp) / (result.coeff(i,i) + result.coeff(j,j));
+      result.coeffRef(i, j) = (arg.coeff(i, j) - tmp) / (result.coeff(i, i) + result.coeff(j, j));
     }
   }
 }
 
-
 namespace internal {
 
 /** \ingroup MatrixFunctions_Module
-  * \brief Helper struct for computing matrix square roots of general matrices.
-  * \tparam  MatrixType  type of the argument of the matrix square root,
-  *                      expected to be an instantiation of the Matrix class template.
-  *
-  * \sa MatrixSquareRootTriangular, MatrixSquareRootQuasiTriangular, MatrixBase::sqrt()
-  */
+ * \brief Helper struct for computing matrix square roots of general matrices.
+ * \tparam  MatrixType  type of the argument of the matrix square root,
+ *                      expected to be an instantiation of the Matrix class template.
+ *
+ * \sa MatrixSquareRootTriangular, MatrixSquareRootQuasiTriangular, MatrixBase::sqrt()
+ */
 template <typename MatrixType, int IsComplex = NumTraits<typename internal::traits<MatrixType>::Scalar>::IsComplex>
-struct matrix_sqrt_compute
-{
+struct matrix_sqrt_compute {
   /** \brief Compute the matrix square root
-    *
-    * \param[in]  arg     matrix whose square root is to be computed.
-    * \param[out] result  square root of \p arg.
-    *
-    * See MatrixBase::sqrt() for details on how this computation is implemented.
-    */
-  template <typename ResultType> static void run(const MatrixType &arg, ResultType &result);    
+   *
+   * \param[in]  arg     matrix whose square root is to be computed.
+   * \param[out] result  square root of \p arg.
+   *
+   * See MatrixBase::sqrt() for details on how this computation is implemented.
+   */
+  template <typename ResultType>
+  static void run(const MatrixType& arg, ResultType& result);
 };
 
-
 // ********** Partial specialization for real matrices **********
 
 template <typename MatrixType>
-struct matrix_sqrt_compute<MatrixType, 0>
-{
+struct matrix_sqrt_compute<MatrixType, 0> {
   typedef typename MatrixType::PlainObject PlainType;
   template <typename ResultType>
-  static void run(const MatrixType &arg, ResultType &result)
-  {
+  static void run(const MatrixType& arg, ResultType& result) {
     eigen_assert(arg.rows() == arg.cols());
 
     // Compute Schur decomposition of arg
     const RealSchur<PlainType> schurOfA(arg);
     const PlainType& T = schurOfA.matrixT();
     const PlainType& U = schurOfA.matrixU();
-    
+
     // Compute square root of T
     PlainType sqrtT = PlainType::Zero(arg.rows(), arg.cols());
     matrix_sqrt_quasi_triangular(T, sqrtT);
-    
+
     // Compute square root of arg
     result = U * sqrtT * U.adjoint();
   }
 };
 
-
 // ********** Partial specialization for complex matrices **********
 
 template <typename MatrixType>
-struct matrix_sqrt_compute<MatrixType, 1>
-{
+struct matrix_sqrt_compute<MatrixType, 1> {
   typedef typename MatrixType::PlainObject PlainType;
   template <typename ResultType>
-  static void run(const MatrixType &arg, ResultType &result)
-  {
+  static void run(const MatrixType& arg, ResultType& result) {
     eigen_assert(arg.rows() == arg.cols());
 
     // Compute Schur decomposition of arg
     const ComplexSchur<PlainType> schurOfA(arg);
     const PlainType& T = schurOfA.matrixT();
     const PlainType& U = schurOfA.matrixU();
-    
+
     // Compute square root of T
     PlainType sqrtT;
     matrix_sqrt_triangular(T, sqrtT);
-    
+
     // Compute square root of arg
     result = U * (sqrtT.template triangularView<Upper>() * U.adjoint());
   }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 /** \ingroup MatrixFunctions_Module
-  *
-  * \brief Proxy for the matrix square root of some matrix (expression).
-  *
-  * \tparam Derived  Type of the argument to the matrix square root.
-  *
-  * This class holds the argument to the matrix square root until it
-  * is assigned or evaluated for some other reason (so the argument
-  * should not be changed in the meantime). It is the return type of
-  * MatrixBase::sqrt() and most of the time this is the only way it is
-  * used.
-  */
-template<typename Derived> class MatrixSquareRootReturnValue
-: public ReturnByValue<MatrixSquareRootReturnValue<Derived> >
-{
-  protected:
-    typedef typename internal::ref_selector<Derived>::type DerivedNested;
+ *
+ * \brief Proxy for the matrix square root of some matrix (expression).
+ *
+ * \tparam Derived  Type of the argument to the matrix square root.
+ *
+ * This class holds the argument to the matrix square root until it
+ * is assigned or evaluated for some other reason (so the argument
+ * should not be changed in the meantime). It is the return type of
+ * MatrixBase::sqrt() and most of the time this is the only way it is
+ * used.
+ */
+template <typename Derived>
+class MatrixSquareRootReturnValue : public ReturnByValue<MatrixSquareRootReturnValue<Derived> > {
+ protected:
+  typedef typename internal::ref_selector<Derived>::type DerivedNested;
 
-  public:
-    /** \brief Constructor.
-      *
-      * \param[in]  src  %Matrix (expression) forming the argument of the
-      * matrix square root.
-      */
-    explicit MatrixSquareRootReturnValue(const Derived& src) : m_src(src) { }
+ public:
+  /** \brief Constructor.
+   *
+   * \param[in]  src  %Matrix (expression) forming the argument of the
+   * matrix square root.
+   */
+  explicit MatrixSquareRootReturnValue(const Derived& src) : m_src(src) {}
 
-    /** \brief Compute the matrix square root.
-      *
-      * \param[out]  result  the matrix square root of \p src in the
-      * constructor.
-      */
-    template <typename ResultType>
-    inline void evalTo(ResultType& result) const
-    {
-      typedef typename internal::nested_eval<Derived, 10>::type DerivedEvalType;
-      typedef internal::remove_all_t<DerivedEvalType> DerivedEvalTypeClean;
-      DerivedEvalType tmp(m_src);
-      internal::matrix_sqrt_compute<DerivedEvalTypeClean>::run(tmp, result);
-    }
+  /** \brief Compute the matrix square root.
+   *
+   * \param[out]  result  the matrix square root of \p src in the
+   * constructor.
+   */
+  template <typename ResultType>
+  inline void evalTo(ResultType& result) const {
+    typedef typename internal::nested_eval<Derived, 10>::type DerivedEvalType;
+    typedef internal::remove_all_t<DerivedEvalType> DerivedEvalTypeClean;
+    DerivedEvalType tmp(m_src);
+    internal::matrix_sqrt_compute<DerivedEvalTypeClean>::run(tmp, result);
+  }
 
-    Index rows() const { return m_src.rows(); }
-    Index cols() const { return m_src.cols(); }
+  Index rows() const { return m_src.rows(); }
+  Index cols() const { return m_src.cols(); }
 
-  protected:
-    const DerivedNested m_src;
+ protected:
+  const DerivedNested m_src;
 };
 
 namespace internal {
-template<typename Derived>
-struct traits<MatrixSquareRootReturnValue<Derived> >
-{
+template <typename Derived>
+struct traits<MatrixSquareRootReturnValue<Derived> > {
   typedef typename Derived::PlainObject ReturnType;
 };
-}
+}  // namespace internal
 
 template <typename Derived>
-const MatrixSquareRootReturnValue<Derived> MatrixBase<Derived>::sqrt() const
-{
+const MatrixSquareRootReturnValue<Derived> MatrixBase<Derived>::sqrt() const {
   eigen_assert(rows() == cols());
   return MatrixSquareRootReturnValue<Derived>(derived());
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_MATRIX_FUNCTION
+#endif  // EIGEN_MATRIX_FUNCTION
diff --git a/unsupported/Eigen/src/MatrixFunctions/StemFunction.h b/unsupported/Eigen/src/MatrixFunctions/StemFunction.h
index afe1a33..8050c37 100644
--- a/unsupported/Eigen/src/MatrixFunctions/StemFunction.h
+++ b/unsupported/Eigen/src/MatrixFunctions/StemFunction.h
@@ -13,108 +13,103 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
 /** \brief The exponential function (and its derivatives). */
 template <typename Scalar>
-Scalar stem_function_exp(Scalar x, int)
-{
+Scalar stem_function_exp(Scalar x, int) {
   using std::exp;
   return exp(x);
 }
 
 /** \brief Cosine (and its derivatives). */
 template <typename Scalar>
-Scalar stem_function_cos(Scalar x, int n)
-{
+Scalar stem_function_cos(Scalar x, int n) {
   using std::cos;
   using std::sin;
   Scalar res;
 
   switch (n % 4) {
-  case 0: 
-    res = std::cos(x);
-    break;
-  case 1:
-    res = -std::sin(x);
-    break;
-  case 2:
-    res = -std::cos(x);
-    break;
-  case 3:
-    res = std::sin(x);
-    break;
+    case 0:
+      res = std::cos(x);
+      break;
+    case 1:
+      res = -std::sin(x);
+      break;
+    case 2:
+      res = -std::cos(x);
+      break;
+    case 3:
+      res = std::sin(x);
+      break;
   }
   return res;
 }
 
 /** \brief Sine (and its derivatives). */
 template <typename Scalar>
-Scalar stem_function_sin(Scalar x, int n)
-{
+Scalar stem_function_sin(Scalar x, int n) {
   using std::cos;
   using std::sin;
   Scalar res;
 
   switch (n % 4) {
-  case 0:
-    res = std::sin(x);
-    break;
-  case 1:
-    res = std::cos(x);
-    break;
-  case 2:
-    res = -std::sin(x);
-    break;
-  case 3:
-    res = -std::cos(x);
-    break;
+    case 0:
+      res = std::sin(x);
+      break;
+    case 1:
+      res = std::cos(x);
+      break;
+    case 2:
+      res = -std::sin(x);
+      break;
+    case 3:
+      res = -std::cos(x);
+      break;
   }
   return res;
 }
 
 /** \brief Hyperbolic cosine (and its derivatives). */
 template <typename Scalar>
-Scalar stem_function_cosh(Scalar x, int n)
-{
+Scalar stem_function_cosh(Scalar x, int n) {
   using std::cosh;
   using std::sinh;
   Scalar res;
-  
+
   switch (n % 2) {
-  case 0:
-    res = std::cosh(x);
-    break;
-  case 1:
-    res = std::sinh(x);
-    break;
+    case 0:
+      res = std::cosh(x);
+      break;
+    case 1:
+      res = std::sinh(x);
+      break;
   }
   return res;
 }
-	
+
 /** \brief Hyperbolic sine (and its derivatives). */
 template <typename Scalar>
-Scalar stem_function_sinh(Scalar x, int n)
-{
+Scalar stem_function_sinh(Scalar x, int n) {
   using std::cosh;
   using std::sinh;
   Scalar res;
-  
+
   switch (n % 2) {
-  case 0:
-    res = std::sinh(x);
-    break;
-  case 1:
-    res = std::cosh(x);
-    break;
+    case 0:
+      res = std::sinh(x);
+      break;
+    case 1:
+      res = std::cosh(x);
+      break;
   }
   return res;
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_STEM_FUNCTION
+#endif  // EIGEN_STEM_FUNCTION
diff --git a/unsupported/Eigen/src/MoreVectorization/InternalHeaderCheck.h b/unsupported/Eigen/src/MoreVectorization/InternalHeaderCheck.h
index 3c294b3..ad44142 100644
--- a/unsupported/Eigen/src/MoreVectorization/InternalHeaderCheck.h
+++ b/unsupported/Eigen/src/MoreVectorization/InternalHeaderCheck.h
@@ -1,3 +1,4 @@
 #ifndef EIGEN_MOREVECTORIZATION_MODULE_H
-#error "Please include unsupported/Eigen/MoreVectorization instead of including headers inside the src directory directly."
+#error \
+    "Please include unsupported/Eigen/MoreVectorization instead of including headers inside the src directory directly."
 #endif
diff --git a/unsupported/Eigen/src/MoreVectorization/MathFunctions.h b/unsupported/Eigen/src/MoreVectorization/MathFunctions.h
index 4db1705..74c904f 100644
--- a/unsupported/Eigen/src/MoreVectorization/MathFunctions.h
+++ b/unsupported/Eigen/src/MoreVectorization/MathFunctions.h
@@ -14,17 +14,20 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
 /** \internal \returns the arcsin of \a a (coeff-wise) */
-template<typename Packet> inline static Packet pasin(Packet a) { return std::asin(a); }
+template <typename Packet>
+inline static Packet pasin(Packet a) {
+  return std::asin(a);
+}
 
 #ifdef EIGEN_VECTORIZE_SSE
 
-template<> EIGEN_DONT_INLINE Packet4f pasin(Packet4f x)
-{
+template <>
+EIGEN_DONT_INLINE Packet4f pasin(Packet4f x) {
   EIGEN_DECLARE_CONST_Packet4f(half, 0.5);
   EIGEN_DECLARE_CONST_Packet4f(minus_half, -0.5);
   EIGEN_DECLARE_CONST_Packet4f(3half, 1.5);
@@ -32,7 +35,7 @@
   EIGEN_DECLARE_CONST_Packet4f_FROM_INT(sign_mask, 0x80000000);
 
   EIGEN_DECLARE_CONST_Packet4f(pi, 3.141592654);
-  EIGEN_DECLARE_CONST_Packet4f(pi_over_2, 3.141592654*0.5);
+  EIGEN_DECLARE_CONST_Packet4f(pi_over_2, 3.141592654 * 0.5);
 
   EIGEN_DECLARE_CONST_Packet4f(asin1, 4.2163199048E-2);
   EIGEN_DECLARE_CONST_Packet4f(asin2, 2.4181311049E-2);
@@ -40,59 +43,58 @@
   EIGEN_DECLARE_CONST_Packet4f(asin4, 7.4953002686E-2);
   EIGEN_DECLARE_CONST_Packet4f(asin5, 1.6666752422E-1);
 
-  Packet4f a = pabs(x);//got the absolute value
+  Packet4f a = pabs(x);  // got the absolute value
 
-  Packet4f sign_bit= _mm_and_ps(x, p4f_sign_mask);//extracted the sign bit
+  Packet4f sign_bit = _mm_and_ps(x, p4f_sign_mask);  // extracted the sign bit
 
-  Packet4f z1,z2;//will need them during computation    
+  Packet4f z1, z2;  // will need them during computation
 
+  // will compute the two branches for asin
+  // so first compare with half
 
-//will compute the two branches for asin
-//so first compare with half
+  Packet4f branch_mask = _mm_cmpgt_ps(a, p4f_half);  // this is to select which branch to take
+  // both will be taken, and finally results will be merged
+  // the branch for values >0.5
 
-  Packet4f branch_mask= _mm_cmpgt_ps(a, p4f_half);//this is to select which branch to take
-//both will be taken, and finally results will be merged
-//the branch for values >0.5
+  {
+    // the core series expansion
+    z1 = pmadd(p4f_minus_half, a, p4f_half);
+    Packet4f x1 = psqrt(z1);
+    Packet4f s1 = pmadd(p4f_asin1, z1, p4f_asin2);
+    Packet4f s2 = pmadd(s1, z1, p4f_asin3);
+    Packet4f s3 = pmadd(s2, z1, p4f_asin4);
+    Packet4f s4 = pmadd(s3, z1, p4f_asin5);
+    Packet4f temp = pmul(s4, z1);  // not really a madd but a mul by z so that the next term can be a madd
+    z1 = pmadd(temp, x1, x1);
+    z1 = padd(z1, z1);
+    z1 = psub(p4f_pi_over_2, z1);
+  }
 
-    {
-//the core series expansion 
-    z1=pmadd(p4f_minus_half,a,p4f_half);
-    Packet4f x1=psqrt(z1);
-    Packet4f s1=pmadd(p4f_asin1, z1, p4f_asin2);
-    Packet4f s2=pmadd(s1, z1, p4f_asin3);
-    Packet4f s3=pmadd(s2,z1, p4f_asin4);
-    Packet4f s4=pmadd(s3,z1, p4f_asin5);
-    Packet4f temp=pmul(s4,z1);//not really a madd but a mul by z so that the next term can be a madd
-    z1=pmadd(temp,x1,x1);
-    z1=padd(z1,z1);
-    z1=psub(p4f_pi_over_2,z1);
-    }
+  {
+    // the core series expansion
+    Packet4f x2 = a;
+    z2 = pmul(x2, x2);
+    Packet4f s1 = pmadd(p4f_asin1, z2, p4f_asin2);
+    Packet4f s2 = pmadd(s1, z2, p4f_asin3);
+    Packet4f s3 = pmadd(s2, z2, p4f_asin4);
+    Packet4f s4 = pmadd(s3, z2, p4f_asin5);
+    Packet4f temp = pmul(s4, z2);  // not really a madd but a mul by z so that the next term can be a madd
+    z2 = pmadd(temp, x2, x2);
+  }
 
-    {
-//the core series expansion 
-    Packet4f x2=a;
-    z2=pmul(x2,x2);
-    Packet4f s1=pmadd(p4f_asin1, z2, p4f_asin2);
-    Packet4f s2=pmadd(s1, z2, p4f_asin3);
-    Packet4f s3=pmadd(s2,z2, p4f_asin4);
-    Packet4f s4=pmadd(s3,z2, p4f_asin5);
-    Packet4f temp=pmul(s4,z2);//not really a madd but a mul by z so that the next term can be a madd
-    z2=pmadd(temp,x2,x2);
-    }
+  /* select the correct result from the two branch evaluations */
+  z1 = _mm_and_ps(branch_mask, z1);
+  z2 = _mm_andnot_ps(branch_mask, z2);
+  Packet4f z = _mm_or_ps(z1, z2);
 
-/* select the correct result from the two branch evaluations */
-  z1  = _mm_and_ps(branch_mask, z1);
-  z2  = _mm_andnot_ps(branch_mask, z2);
-  Packet4f z  = _mm_or_ps(z1,z2);
-
-/* update the sign */
+  /* update the sign */
   return _mm_xor_ps(z, sign_bit);
 }
 
-#endif // EIGEN_VECTORIZE_SSE
+#endif  // EIGEN_VECTORIZE_SSE
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_MOREVECTORIZATION_MATHFUNCTIONS_H
+#endif  // EIGEN_MOREVECTORIZATION_MATHFUNCTIONS_H
diff --git a/unsupported/Eigen/src/NonLinearOptimization/HybridNonLinearSolver.h b/unsupported/Eigen/src/NonLinearOptimization/HybridNonLinearSolver.h
index 1e076ab..079772e 100644
--- a/unsupported/Eigen/src/NonLinearOptimization/HybridNonLinearSolver.h
+++ b/unsupported/Eigen/src/NonLinearOptimization/HybridNonLinearSolver.h
@@ -16,589 +16,530 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
-namespace HybridNonLinearSolverSpace { 
-    enum Status {
-        Running = -1,
-        ImproperInputParameters = 0,
-        RelativeErrorTooSmall = 1,
-        TooManyFunctionEvaluation = 2,
-        TolTooSmall = 3,
-        NotMakingProgressJacobian = 4,
-        NotMakingProgressIterations = 5,
-        UserAsked = 6
-    };
+namespace HybridNonLinearSolverSpace {
+enum Status {
+  Running = -1,
+  ImproperInputParameters = 0,
+  RelativeErrorTooSmall = 1,
+  TooManyFunctionEvaluation = 2,
+  TolTooSmall = 3,
+  NotMakingProgressJacobian = 4,
+  NotMakingProgressIterations = 5,
+  UserAsked = 6
+};
 }
 
 /**
-  * \ingroup NonLinearOptimization_Module
-  * \brief Finds a zero of a system of n
-  * nonlinear functions in n variables by a modification of the Powell
-  * hybrid method ("dogleg").
-  *
-  * The user must provide a subroutine which calculates the
-  * functions. The Jacobian is either provided by the user, or approximated
-  * using a forward-difference method.
-  *
-  */
-template<typename FunctorType, typename Scalar=double>
-class HybridNonLinearSolver
-{
-public:
-    typedef DenseIndex Index;
+ * \ingroup NonLinearOptimization_Module
+ * \brief Finds a zero of a system of n
+ * nonlinear functions in n variables by a modification of the Powell
+ * hybrid method ("dogleg").
+ *
+ * The user must provide a subroutine which calculates the
+ * functions. The Jacobian is either provided by the user, or approximated
+ * using a forward-difference method.
+ *
+ */
+template <typename FunctorType, typename Scalar = double>
+class HybridNonLinearSolver {
+ public:
+  typedef DenseIndex Index;
 
-    HybridNonLinearSolver(FunctorType &_functor)
-        : functor(_functor) { nfev=njev=iter = 0;  fnorm= 0.; useExternalScaling=false;}
+  HybridNonLinearSolver(FunctorType &_functor) : functor(_functor) {
+    nfev = njev = iter = 0;
+    fnorm = 0.;
+    useExternalScaling = false;
+  }
 
-    struct Parameters {
-        Parameters()
-            : factor(Scalar(100.))
-            , maxfev(1000)
-            , xtol(numext::sqrt(NumTraits<Scalar>::epsilon()))
-            , nb_of_subdiagonals(-1)
-            , nb_of_superdiagonals(-1)
-            , epsfcn(Scalar(0.)) {}
-        Scalar factor;
-        Index maxfev;   // maximum number of function evaluation
-        Scalar xtol;
-        Index nb_of_subdiagonals;
-        Index nb_of_superdiagonals;
-        Scalar epsfcn;
-    };
-    typedef Matrix< Scalar, Dynamic, 1 > FVectorType;
-    typedef Matrix< Scalar, Dynamic, Dynamic > JacobianType;
-    /* TODO: if eigen provides a triangular storage, use it here */
-    typedef Matrix< Scalar, Dynamic, Dynamic > UpperTriangularType;
+  struct Parameters {
+    Parameters()
+        : factor(Scalar(100.)),
+          maxfev(1000),
+          xtol(numext::sqrt(NumTraits<Scalar>::epsilon())),
+          nb_of_subdiagonals(-1),
+          nb_of_superdiagonals(-1),
+          epsfcn(Scalar(0.)) {}
+    Scalar factor;
+    Index maxfev;  // maximum number of function evaluation
+    Scalar xtol;
+    Index nb_of_subdiagonals;
+    Index nb_of_superdiagonals;
+    Scalar epsfcn;
+  };
+  typedef Matrix<Scalar, Dynamic, 1> FVectorType;
+  typedef Matrix<Scalar, Dynamic, Dynamic> JacobianType;
+  /* TODO: if eigen provides a triangular storage, use it here */
+  typedef Matrix<Scalar, Dynamic, Dynamic> UpperTriangularType;
 
-    HybridNonLinearSolverSpace::Status hybrj1(
-            FVectorType  &x,
-            const Scalar tol = numext::sqrt(NumTraits<Scalar>::epsilon())
-            );
+  HybridNonLinearSolverSpace::Status hybrj1(FVectorType &x,
+                                            const Scalar tol = numext::sqrt(NumTraits<Scalar>::epsilon()));
 
-    HybridNonLinearSolverSpace::Status solveInit(FVectorType  &x);
-    HybridNonLinearSolverSpace::Status solveOneStep(FVectorType  &x);
-    HybridNonLinearSolverSpace::Status solve(FVectorType  &x);
+  HybridNonLinearSolverSpace::Status solveInit(FVectorType &x);
+  HybridNonLinearSolverSpace::Status solveOneStep(FVectorType &x);
+  HybridNonLinearSolverSpace::Status solve(FVectorType &x);
 
-    HybridNonLinearSolverSpace::Status hybrd1(
-            FVectorType  &x,
-            const Scalar tol = numext::sqrt(NumTraits<Scalar>::epsilon())
-            );
+  HybridNonLinearSolverSpace::Status hybrd1(FVectorType &x,
+                                            const Scalar tol = numext::sqrt(NumTraits<Scalar>::epsilon()));
 
-    HybridNonLinearSolverSpace::Status solveNumericalDiffInit(FVectorType  &x);
-    HybridNonLinearSolverSpace::Status solveNumericalDiffOneStep(FVectorType  &x);
-    HybridNonLinearSolverSpace::Status solveNumericalDiff(FVectorType  &x);
+  HybridNonLinearSolverSpace::Status solveNumericalDiffInit(FVectorType &x);
+  HybridNonLinearSolverSpace::Status solveNumericalDiffOneStep(FVectorType &x);
+  HybridNonLinearSolverSpace::Status solveNumericalDiff(FVectorType &x);
 
-    void resetParameters(void) { parameters = Parameters(); }
-    Parameters parameters;
-    FVectorType  fvec, qtf, diag;
-    JacobianType fjac;
-    UpperTriangularType R;
-    Index nfev;
-    Index njev;
-    Index iter;
-    Scalar fnorm;
-    bool useExternalScaling; 
-private:
-    FunctorType &functor;
-    Index n;
-    Scalar sum;
-    bool sing;
-    Scalar temp;
-    Scalar delta;
-    bool jeval;
-    Index ncsuc;
-    Scalar ratio;
-    Scalar pnorm, xnorm, fnorm1;
-    Index nslow1, nslow2;
-    Index ncfail;
-    Scalar actred, prered;
-    FVectorType wa1, wa2, wa3, wa4;
+  void resetParameters(void) { parameters = Parameters(); }
+  Parameters parameters;
+  FVectorType fvec, qtf, diag;
+  JacobianType fjac;
+  UpperTriangularType R;
+  Index nfev;
+  Index njev;
+  Index iter;
+  Scalar fnorm;
+  bool useExternalScaling;
 
-    HybridNonLinearSolver& operator=(const HybridNonLinearSolver&);
+ private:
+  FunctorType &functor;
+  Index n;
+  Scalar sum;
+  bool sing;
+  Scalar temp;
+  Scalar delta;
+  bool jeval;
+  Index ncsuc;
+  Scalar ratio;
+  Scalar pnorm, xnorm, fnorm1;
+  Index nslow1, nslow2;
+  Index ncfail;
+  Scalar actred, prered;
+  FVectorType wa1, wa2, wa3, wa4;
+
+  HybridNonLinearSolver &operator=(const HybridNonLinearSolver &);
 };
 
+template <typename FunctorType, typename Scalar>
+HybridNonLinearSolverSpace::Status HybridNonLinearSolver<FunctorType, Scalar>::hybrj1(FVectorType &x,
+                                                                                      const Scalar tol) {
+  n = x.size();
 
+  /* check the input parameters for errors. */
+  if (n <= 0 || tol < 0.) return HybridNonLinearSolverSpace::ImproperInputParameters;
 
-template<typename FunctorType, typename Scalar>
-HybridNonLinearSolverSpace::Status
-HybridNonLinearSolver<FunctorType,Scalar>::hybrj1(
-        FVectorType  &x,
-        const Scalar tol
-        )
-{
-    n = x.size();
-
-    /* check the input parameters for errors. */
-    if (n <= 0 || tol < 0.)
-        return HybridNonLinearSolverSpace::ImproperInputParameters;
-
-    resetParameters();
-    parameters.maxfev = 100*(n+1);
-    parameters.xtol = tol;
-    diag.setConstant(n, 1.);
-    useExternalScaling = true;
-    return solve(x);
+  resetParameters();
+  parameters.maxfev = 100 * (n + 1);
+  parameters.xtol = tol;
+  diag.setConstant(n, 1.);
+  useExternalScaling = true;
+  return solve(x);
 }
 
-template<typename FunctorType, typename Scalar>
-HybridNonLinearSolverSpace::Status
-HybridNonLinearSolver<FunctorType,Scalar>::solveInit(FVectorType  &x)
-{
-    n = x.size();
+template <typename FunctorType, typename Scalar>
+HybridNonLinearSolverSpace::Status HybridNonLinearSolver<FunctorType, Scalar>::solveInit(FVectorType &x) {
+  n = x.size();
 
-    wa1.resize(n); wa2.resize(n); wa3.resize(n); wa4.resize(n);
-    fvec.resize(n);
-    qtf.resize(n);
-    fjac.resize(n, n);
+  wa1.resize(n);
+  wa2.resize(n);
+  wa3.resize(n);
+  wa4.resize(n);
+  fvec.resize(n);
+  qtf.resize(n);
+  fjac.resize(n, n);
+  if (!useExternalScaling) diag.resize(n);
+  eigen_assert((!useExternalScaling || diag.size() == n) &&
+               "When useExternalScaling is set, the caller must provide a valid 'diag'");
+
+  /* Function Body */
+  nfev = 0;
+  njev = 0;
+
+  /*     check the input parameters for errors. */
+  if (n <= 0 || parameters.xtol < 0. || parameters.maxfev <= 0 || parameters.factor <= 0.)
+    return HybridNonLinearSolverSpace::ImproperInputParameters;
+  if (useExternalScaling)
+    for (Index j = 0; j < n; ++j)
+      if (diag[j] <= 0.) return HybridNonLinearSolverSpace::ImproperInputParameters;
+
+  /*     evaluate the function at the starting point */
+  /*     and calculate its norm. */
+  nfev = 1;
+  if (functor(x, fvec) < 0) return HybridNonLinearSolverSpace::UserAsked;
+  fnorm = fvec.stableNorm();
+
+  /*     initialize iteration counter and monitors. */
+  iter = 1;
+  ncsuc = 0;
+  ncfail = 0;
+  nslow1 = 0;
+  nslow2 = 0;
+
+  return HybridNonLinearSolverSpace::Running;
+}
+
+template <typename FunctorType, typename Scalar>
+HybridNonLinearSolverSpace::Status HybridNonLinearSolver<FunctorType, Scalar>::solveOneStep(FVectorType &x) {
+  using std::abs;
+
+  eigen_assert(x.size() == n);  // check the caller is not cheating us
+
+  Index j;
+  std::vector<JacobiRotation<Scalar> > v_givens(n), w_givens(n);
+
+  jeval = true;
+
+  /* calculate the jacobian matrix. */
+  if (functor.df(x, fjac) < 0) return HybridNonLinearSolverSpace::UserAsked;
+  ++njev;
+
+  wa2 = fjac.colwise().blueNorm();
+
+  /* on the first iteration and if external scaling is not used, scale according */
+  /* to the norms of the columns of the initial jacobian. */
+  if (iter == 1) {
     if (!useExternalScaling)
-        diag.resize(n);
-    eigen_assert( (!useExternalScaling || diag.size()==n) && "When useExternalScaling is set, the caller must provide a valid 'diag'");
+      for (j = 0; j < n; ++j) diag[j] = (wa2[j] == 0.) ? 1. : wa2[j];
 
-    /* Function Body */
-    nfev = 0;
-    njev = 0;
+    /* on the first iteration, calculate the norm of the scaled x */
+    /* and initialize the step bound delta. */
+    xnorm = diag.cwiseProduct(x).stableNorm();
+    delta = parameters.factor * xnorm;
+    if (delta == 0.) delta = parameters.factor;
+  }
 
-    /*     check the input parameters for errors. */
-    if (n <= 0 || parameters.xtol < 0. || parameters.maxfev <= 0 || parameters.factor <= 0. )
-        return HybridNonLinearSolverSpace::ImproperInputParameters;
-    if (useExternalScaling)
-        for (Index j = 0; j < n; ++j)
-            if (diag[j] <= 0.)
-                return HybridNonLinearSolverSpace::ImproperInputParameters;
+  /* compute the qr factorization of the jacobian. */
+  HouseholderQR<JacobianType> qrfac(fjac);  // no pivoting:
 
-    /*     evaluate the function at the starting point */
-    /*     and calculate its norm. */
-    nfev = 1;
-    if ( functor(x, fvec) < 0)
-        return HybridNonLinearSolverSpace::UserAsked;
-    fnorm = fvec.stableNorm();
+  /* copy the triangular factor of the qr factorization into r. */
+  R = qrfac.matrixQR();
 
-    /*     initialize iteration counter and monitors. */
-    iter = 1;
-    ncsuc = 0;
-    ncfail = 0;
-    nslow1 = 0;
-    nslow2 = 0;
+  /* accumulate the orthogonal factor in fjac. */
+  fjac = qrfac.householderQ();
 
-    return HybridNonLinearSolverSpace::Running;
-}
+  /* form (q transpose)*fvec and store in qtf. */
+  qtf = fjac.transpose() * fvec;
 
-template<typename FunctorType, typename Scalar>
-HybridNonLinearSolverSpace::Status
-HybridNonLinearSolver<FunctorType,Scalar>::solveOneStep(FVectorType  &x)
-{
-    using std::abs;
-    
-    eigen_assert(x.size()==n); // check the caller is not cheating us
+  /* rescale if necessary. */
+  if (!useExternalScaling) diag = diag.cwiseMax(wa2);
 
-    Index j;
-    std::vector<JacobiRotation<Scalar> > v_givens(n), w_givens(n);
+  while (true) {
+    /* determine the direction p. */
+    internal::dogleg<Scalar>(R, diag, qtf, delta, wa1);
 
-    jeval = true;
+    /* store the direction p and x + p. calculate the norm of p. */
+    wa1 = -wa1;
+    wa2 = x + wa1;
+    pnorm = diag.cwiseProduct(wa1).stableNorm();
 
-    /* calculate the jacobian matrix. */
-    if ( functor.df(x, fjac) < 0)
-        return HybridNonLinearSolverSpace::UserAsked;
-    ++njev;
+    /* on the first iteration, adjust the initial step bound. */
+    if (iter == 1) delta = (std::min)(delta, pnorm);
 
-    wa2 = fjac.colwise().blueNorm();
+    /* evaluate the function at x + p and calculate its norm. */
+    if (functor(wa2, wa4) < 0) return HybridNonLinearSolverSpace::UserAsked;
+    ++nfev;
+    fnorm1 = wa4.stableNorm();
 
-    /* on the first iteration and if external scaling is not used, scale according */
-    /* to the norms of the columns of the initial jacobian. */
-    if (iter == 1) {
-        if (!useExternalScaling)
-            for (j = 0; j < n; ++j)
-                diag[j] = (wa2[j]==0.) ? 1. : wa2[j];
+    /* compute the scaled actual reduction. */
+    actred = -1.;
+    if (fnorm1 < fnorm) /* Computing 2nd power */
+      actred = 1. - numext::abs2(fnorm1 / fnorm);
 
-        /* on the first iteration, calculate the norm of the scaled x */
-        /* and initialize the step bound delta. */
-        xnorm = diag.cwiseProduct(x).stableNorm();
-        delta = parameters.factor * xnorm;
-        if (delta == 0.)
-            delta = parameters.factor;
+    /* compute the scaled predicted reduction. */
+    wa3 = R.template triangularView<Upper>() * wa1 + qtf;
+    temp = wa3.stableNorm();
+    prered = 0.;
+    if (temp < fnorm) /* Computing 2nd power */
+      prered = 1. - numext::abs2(temp / fnorm);
+
+    /* compute the ratio of the actual to the predicted reduction. */
+    ratio = 0.;
+    if (prered > 0.) ratio = actred / prered;
+
+    /* update the step bound. */
+    if (ratio < Scalar(.1)) {
+      ncsuc = 0;
+      ++ncfail;
+      delta = Scalar(.5) * delta;
+    } else {
+      ncfail = 0;
+      ++ncsuc;
+      if (ratio >= Scalar(.5) || ncsuc > 1) delta = (std::max)(delta, pnorm / Scalar(.5));
+      if (abs(ratio - 1.) <= Scalar(.1)) {
+        delta = pnorm / Scalar(.5);
+      }
     }
 
-    /* compute the qr factorization of the jacobian. */
-    HouseholderQR<JacobianType> qrfac(fjac); // no pivoting:
-
-    /* copy the triangular factor of the qr factorization into r. */
-    R = qrfac.matrixQR();
-
-    /* accumulate the orthogonal factor in fjac. */
-    fjac = qrfac.householderQ();
-
-    /* form (q transpose)*fvec and store in qtf. */
-    qtf = fjac.transpose() * fvec;
-
-    /* rescale if necessary. */
-    if (!useExternalScaling)
-        diag = diag.cwiseMax(wa2);
-
-    while (true) {
-        /* determine the direction p. */
-        internal::dogleg<Scalar>(R, diag, qtf, delta, wa1);
-
-        /* store the direction p and x + p. calculate the norm of p. */
-        wa1 = -wa1;
-        wa2 = x + wa1;
-        pnorm = diag.cwiseProduct(wa1).stableNorm();
-
-        /* on the first iteration, adjust the initial step bound. */
-        if (iter == 1)
-            delta = (std::min)(delta,pnorm);
-
-        /* evaluate the function at x + p and calculate its norm. */
-        if ( functor(wa2, wa4) < 0)
-            return HybridNonLinearSolverSpace::UserAsked;
-        ++nfev;
-        fnorm1 = wa4.stableNorm();
-
-        /* compute the scaled actual reduction. */
-        actred = -1.;
-        if (fnorm1 < fnorm) /* Computing 2nd power */
-            actred = 1. - numext::abs2(fnorm1 / fnorm);
-
-        /* compute the scaled predicted reduction. */
-        wa3 = R.template triangularView<Upper>()*wa1 + qtf;
-        temp = wa3.stableNorm();
-        prered = 0.;
-        if (temp < fnorm) /* Computing 2nd power */
-            prered = 1. - numext::abs2(temp / fnorm);
-
-        /* compute the ratio of the actual to the predicted reduction. */
-        ratio = 0.;
-        if (prered > 0.)
-            ratio = actred / prered;
-
-        /* update the step bound. */
-        if (ratio < Scalar(.1)) {
-            ncsuc = 0;
-            ++ncfail;
-            delta = Scalar(.5) * delta;
-        } else {
-            ncfail = 0;
-            ++ncsuc;
-            if (ratio >= Scalar(.5) || ncsuc > 1)
-                delta = (std::max)(delta, pnorm / Scalar(.5));
-            if (abs(ratio - 1.) <= Scalar(.1)) {
-                delta = pnorm / Scalar(.5);
-            }
-        }
-
-        /* test for successful iteration. */
-        if (ratio >= Scalar(1e-4)) {
-            /* successful iteration. update x, fvec, and their norms. */
-            x = wa2;
-            wa2 = diag.cwiseProduct(x);
-            fvec = wa4;
-            xnorm = wa2.stableNorm();
-            fnorm = fnorm1;
-            ++iter;
-        }
-
-        /* determine the progress of the iteration. */
-        ++nslow1;
-        if (actred >= Scalar(.001))
-            nslow1 = 0;
-        if (jeval)
-            ++nslow2;
-        if (actred >= Scalar(.1))
-            nslow2 = 0;
-
-        /* test for convergence. */
-        if (delta <= parameters.xtol * xnorm || fnorm == 0.)
-            return HybridNonLinearSolverSpace::RelativeErrorTooSmall;
-
-        /* tests for termination and stringent tolerances. */
-        if (nfev >= parameters.maxfev)
-            return HybridNonLinearSolverSpace::TooManyFunctionEvaluation;
-        if (Scalar(.1) * (std::max)(Scalar(.1) * delta, pnorm) <= NumTraits<Scalar>::epsilon() * xnorm)
-            return HybridNonLinearSolverSpace::TolTooSmall;
-        if (nslow2 == 5)
-            return HybridNonLinearSolverSpace::NotMakingProgressJacobian;
-        if (nslow1 == 10)
-            return HybridNonLinearSolverSpace::NotMakingProgressIterations;
-
-        /* criterion for recalculating jacobian. */
-        if (ncfail == 2)
-            break; // leave inner loop and go for the next outer loop iteration
-
-        /* calculate the rank one modification to the jacobian */
-        /* and update qtf if necessary. */
-        wa1 = diag.cwiseProduct( diag.cwiseProduct(wa1)/pnorm );
-        wa2 = fjac.transpose() * wa4;
-        if (ratio >= Scalar(1e-4))
-            qtf = wa2;
-        wa2 = (wa2-wa3)/pnorm;
-
-        /* compute the qr factorization of the updated jacobian. */
-        internal::r1updt<Scalar>(R, wa1, v_givens, w_givens, wa2, wa3, &sing);
-        internal::r1mpyq<Scalar>(n, n, fjac.data(), v_givens, w_givens);
-        internal::r1mpyq<Scalar>(1, n, qtf.data(), v_givens, w_givens);
-
-        jeval = false;
-    }
-    return HybridNonLinearSolverSpace::Running;
-}
-
-template<typename FunctorType, typename Scalar>
-HybridNonLinearSolverSpace::Status
-HybridNonLinearSolver<FunctorType,Scalar>::solve(FVectorType  &x)
-{
-    HybridNonLinearSolverSpace::Status status = solveInit(x);
-    if (status==HybridNonLinearSolverSpace::ImproperInputParameters)
-        return status;
-    while (status==HybridNonLinearSolverSpace::Running)
-        status = solveOneStep(x);
-    return status;
-}
-
-
-
-template<typename FunctorType, typename Scalar>
-HybridNonLinearSolverSpace::Status
-HybridNonLinearSolver<FunctorType,Scalar>::hybrd1(
-        FVectorType  &x,
-        const Scalar tol
-        )
-{
-    n = x.size();
-
-    /* check the input parameters for errors. */
-    if (n <= 0 || tol < 0.)
-        return HybridNonLinearSolverSpace::ImproperInputParameters;
-
-    resetParameters();
-    parameters.maxfev = 200*(n+1);
-    parameters.xtol = tol;
-
-    diag.setConstant(n, 1.);
-    useExternalScaling = true;
-    return solveNumericalDiff(x);
-}
-
-template<typename FunctorType, typename Scalar>
-HybridNonLinearSolverSpace::Status
-HybridNonLinearSolver<FunctorType,Scalar>::solveNumericalDiffInit(FVectorType  &x)
-{
-    n = x.size();
-
-    if (parameters.nb_of_subdiagonals<0) parameters.nb_of_subdiagonals= n-1;
-    if (parameters.nb_of_superdiagonals<0) parameters.nb_of_superdiagonals= n-1;
-
-    wa1.resize(n); wa2.resize(n); wa3.resize(n); wa4.resize(n);
-    qtf.resize(n);
-    fjac.resize(n, n);
-    fvec.resize(n);
-    if (!useExternalScaling)
-        diag.resize(n);
-    eigen_assert( (!useExternalScaling || diag.size()==n) && "When useExternalScaling is set, the caller must provide a valid 'diag'");
-
-    /* Function Body */
-    nfev = 0;
-    njev = 0;
-
-    /*     check the input parameters for errors. */
-    if (n <= 0 || parameters.xtol < 0. || parameters.maxfev <= 0 || parameters.nb_of_subdiagonals< 0 || parameters.nb_of_superdiagonals< 0 || parameters.factor <= 0. )
-        return HybridNonLinearSolverSpace::ImproperInputParameters;
-    if (useExternalScaling)
-        for (Index j = 0; j < n; ++j)
-            if (diag[j] <= 0.)
-                return HybridNonLinearSolverSpace::ImproperInputParameters;
-
-    /*     evaluate the function at the starting point */
-    /*     and calculate its norm. */
-    nfev = 1;
-    if ( functor(x, fvec) < 0)
-        return HybridNonLinearSolverSpace::UserAsked;
-    fnorm = fvec.stableNorm();
-
-    /*     initialize iteration counter and monitors. */
-    iter = 1;
-    ncsuc = 0;
-    ncfail = 0;
-    nslow1 = 0;
-    nslow2 = 0;
-
-    return HybridNonLinearSolverSpace::Running;
-}
-
-template<typename FunctorType, typename Scalar>
-HybridNonLinearSolverSpace::Status
-HybridNonLinearSolver<FunctorType,Scalar>::solveNumericalDiffOneStep(FVectorType  &x)
-{
-    using std::sqrt;
-    using std::abs;
-    
-    eigen_assert(x.size()==n); // check the caller is not cheating us
-
-    Index j;
-    std::vector<JacobiRotation<Scalar> > v_givens(n), w_givens(n);
-
-    jeval = true;
-    if (parameters.nb_of_subdiagonals<0) parameters.nb_of_subdiagonals= n-1;
-    if (parameters.nb_of_superdiagonals<0) parameters.nb_of_superdiagonals= n-1;
-
-    /* calculate the jacobian matrix. */
-    if (internal::fdjac1(functor, x, fvec, fjac, parameters.nb_of_subdiagonals, parameters.nb_of_superdiagonals, parameters.epsfcn) <0)
-        return HybridNonLinearSolverSpace::UserAsked;
-    nfev += (std::min)(parameters.nb_of_subdiagonals+parameters.nb_of_superdiagonals+ 1, n);
-
-    wa2 = fjac.colwise().blueNorm();
-
-    /* on the first iteration and if external scaling is not used, scale according */
-    /* to the norms of the columns of the initial jacobian. */
-    if (iter == 1) {
-        if (!useExternalScaling)
-            for (j = 0; j < n; ++j)
-                diag[j] = (wa2[j]==0.) ? 1. : wa2[j];
-
-        /* on the first iteration, calculate the norm of the scaled x */
-        /* and initialize the step bound delta. */
-        xnorm = diag.cwiseProduct(x).stableNorm();
-        delta = parameters.factor * xnorm;
-        if (delta == 0.)
-            delta = parameters.factor;
+    /* test for successful iteration. */
+    if (ratio >= Scalar(1e-4)) {
+      /* successful iteration. update x, fvec, and their norms. */
+      x = wa2;
+      wa2 = diag.cwiseProduct(x);
+      fvec = wa4;
+      xnorm = wa2.stableNorm();
+      fnorm = fnorm1;
+      ++iter;
     }
 
-    /* compute the qr factorization of the jacobian. */
-    HouseholderQR<JacobianType> qrfac(fjac); // no pivoting:
+    /* determine the progress of the iteration. */
+    ++nslow1;
+    if (actred >= Scalar(.001)) nslow1 = 0;
+    if (jeval) ++nslow2;
+    if (actred >= Scalar(.1)) nslow2 = 0;
 
-    /* copy the triangular factor of the qr factorization into r. */
-    R = qrfac.matrixQR();
+    /* test for convergence. */
+    if (delta <= parameters.xtol * xnorm || fnorm == 0.) return HybridNonLinearSolverSpace::RelativeErrorTooSmall;
 
-    /* accumulate the orthogonal factor in fjac. */
-    fjac = qrfac.householderQ();
+    /* tests for termination and stringent tolerances. */
+    if (nfev >= parameters.maxfev) return HybridNonLinearSolverSpace::TooManyFunctionEvaluation;
+    if (Scalar(.1) * (std::max)(Scalar(.1) * delta, pnorm) <= NumTraits<Scalar>::epsilon() * xnorm)
+      return HybridNonLinearSolverSpace::TolTooSmall;
+    if (nslow2 == 5) return HybridNonLinearSolverSpace::NotMakingProgressJacobian;
+    if (nslow1 == 10) return HybridNonLinearSolverSpace::NotMakingProgressIterations;
 
-    /* form (q transpose)*fvec and store in qtf. */
-    qtf = fjac.transpose() * fvec;
+    /* criterion for recalculating jacobian. */
+    if (ncfail == 2) break;  // leave inner loop and go for the next outer loop iteration
 
-    /* rescale if necessary. */
+    /* calculate the rank one modification to the jacobian */
+    /* and update qtf if necessary. */
+    wa1 = diag.cwiseProduct(diag.cwiseProduct(wa1) / pnorm);
+    wa2 = fjac.transpose() * wa4;
+    if (ratio >= Scalar(1e-4)) qtf = wa2;
+    wa2 = (wa2 - wa3) / pnorm;
+
+    /* compute the qr factorization of the updated jacobian. */
+    internal::r1updt<Scalar>(R, wa1, v_givens, w_givens, wa2, wa3, &sing);
+    internal::r1mpyq<Scalar>(n, n, fjac.data(), v_givens, w_givens);
+    internal::r1mpyq<Scalar>(1, n, qtf.data(), v_givens, w_givens);
+
+    jeval = false;
+  }
+  return HybridNonLinearSolverSpace::Running;
+}
+
+template <typename FunctorType, typename Scalar>
+HybridNonLinearSolverSpace::Status HybridNonLinearSolver<FunctorType, Scalar>::solve(FVectorType &x) {
+  HybridNonLinearSolverSpace::Status status = solveInit(x);
+  if (status == HybridNonLinearSolverSpace::ImproperInputParameters) return status;
+  while (status == HybridNonLinearSolverSpace::Running) status = solveOneStep(x);
+  return status;
+}
+
+template <typename FunctorType, typename Scalar>
+HybridNonLinearSolverSpace::Status HybridNonLinearSolver<FunctorType, Scalar>::hybrd1(FVectorType &x,
+                                                                                      const Scalar tol) {
+  n = x.size();
+
+  /* check the input parameters for errors. */
+  if (n <= 0 || tol < 0.) return HybridNonLinearSolverSpace::ImproperInputParameters;
+
+  resetParameters();
+  parameters.maxfev = 200 * (n + 1);
+  parameters.xtol = tol;
+
+  diag.setConstant(n, 1.);
+  useExternalScaling = true;
+  return solveNumericalDiff(x);
+}
+
+template <typename FunctorType, typename Scalar>
+HybridNonLinearSolverSpace::Status HybridNonLinearSolver<FunctorType, Scalar>::solveNumericalDiffInit(FVectorType &x) {
+  n = x.size();
+
+  if (parameters.nb_of_subdiagonals < 0) parameters.nb_of_subdiagonals = n - 1;
+  if (parameters.nb_of_superdiagonals < 0) parameters.nb_of_superdiagonals = n - 1;
+
+  wa1.resize(n);
+  wa2.resize(n);
+  wa3.resize(n);
+  wa4.resize(n);
+  qtf.resize(n);
+  fjac.resize(n, n);
+  fvec.resize(n);
+  if (!useExternalScaling) diag.resize(n);
+  eigen_assert((!useExternalScaling || diag.size() == n) &&
+               "When useExternalScaling is set, the caller must provide a valid 'diag'");
+
+  /* Function Body */
+  nfev = 0;
+  njev = 0;
+
+  /*     check the input parameters for errors. */
+  if (n <= 0 || parameters.xtol < 0. || parameters.maxfev <= 0 || parameters.nb_of_subdiagonals < 0 ||
+      parameters.nb_of_superdiagonals < 0 || parameters.factor <= 0.)
+    return HybridNonLinearSolverSpace::ImproperInputParameters;
+  if (useExternalScaling)
+    for (Index j = 0; j < n; ++j)
+      if (diag[j] <= 0.) return HybridNonLinearSolverSpace::ImproperInputParameters;
+
+  /*     evaluate the function at the starting point */
+  /*     and calculate its norm. */
+  nfev = 1;
+  if (functor(x, fvec) < 0) return HybridNonLinearSolverSpace::UserAsked;
+  fnorm = fvec.stableNorm();
+
+  /*     initialize iteration counter and monitors. */
+  iter = 1;
+  ncsuc = 0;
+  ncfail = 0;
+  nslow1 = 0;
+  nslow2 = 0;
+
+  return HybridNonLinearSolverSpace::Running;
+}
+
+template <typename FunctorType, typename Scalar>
+HybridNonLinearSolverSpace::Status HybridNonLinearSolver<FunctorType, Scalar>::solveNumericalDiffOneStep(
+    FVectorType &x) {
+  using std::abs;
+  using std::sqrt;
+
+  eigen_assert(x.size() == n);  // check the caller is not cheating us
+
+  Index j;
+  std::vector<JacobiRotation<Scalar> > v_givens(n), w_givens(n);
+
+  jeval = true;
+  if (parameters.nb_of_subdiagonals < 0) parameters.nb_of_subdiagonals = n - 1;
+  if (parameters.nb_of_superdiagonals < 0) parameters.nb_of_superdiagonals = n - 1;
+
+  /* calculate the jacobian matrix. */
+  if (internal::fdjac1(functor, x, fvec, fjac, parameters.nb_of_subdiagonals, parameters.nb_of_superdiagonals,
+                       parameters.epsfcn) < 0)
+    return HybridNonLinearSolverSpace::UserAsked;
+  nfev += (std::min)(parameters.nb_of_subdiagonals + parameters.nb_of_superdiagonals + 1, n);
+
+  wa2 = fjac.colwise().blueNorm();
+
+  /* on the first iteration and if external scaling is not used, scale according */
+  /* to the norms of the columns of the initial jacobian. */
+  if (iter == 1) {
     if (!useExternalScaling)
-        diag = diag.cwiseMax(wa2);
+      for (j = 0; j < n; ++j) diag[j] = (wa2[j] == 0.) ? 1. : wa2[j];
 
-    while (true) {
-        /* determine the direction p. */
-        internal::dogleg<Scalar>(R, diag, qtf, delta, wa1);
+    /* on the first iteration, calculate the norm of the scaled x */
+    /* and initialize the step bound delta. */
+    xnorm = diag.cwiseProduct(x).stableNorm();
+    delta = parameters.factor * xnorm;
+    if (delta == 0.) delta = parameters.factor;
+  }
 
-        /* store the direction p and x + p. calculate the norm of p. */
-        wa1 = -wa1;
-        wa2 = x + wa1;
-        pnorm = diag.cwiseProduct(wa1).stableNorm();
+  /* compute the qr factorization of the jacobian. */
+  HouseholderQR<JacobianType> qrfac(fjac);  // no pivoting:
 
-        /* on the first iteration, adjust the initial step bound. */
-        if (iter == 1)
-            delta = (std::min)(delta,pnorm);
+  /* copy the triangular factor of the qr factorization into r. */
+  R = qrfac.matrixQR();
 
-        /* evaluate the function at x + p and calculate its norm. */
-        if ( functor(wa2, wa4) < 0)
-            return HybridNonLinearSolverSpace::UserAsked;
-        ++nfev;
-        fnorm1 = wa4.stableNorm();
+  /* accumulate the orthogonal factor in fjac. */
+  fjac = qrfac.householderQ();
 
-        /* compute the scaled actual reduction. */
-        actred = -1.;
-        if (fnorm1 < fnorm) /* Computing 2nd power */
-            actred = 1. - numext::abs2(fnorm1 / fnorm);
+  /* form (q transpose)*fvec and store in qtf. */
+  qtf = fjac.transpose() * fvec;
 
-        /* compute the scaled predicted reduction. */
-        wa3 = R.template triangularView<Upper>()*wa1 + qtf;
-        temp = wa3.stableNorm();
-        prered = 0.;
-        if (temp < fnorm) /* Computing 2nd power */
-            prered = 1. - numext::abs2(temp / fnorm);
+  /* rescale if necessary. */
+  if (!useExternalScaling) diag = diag.cwiseMax(wa2);
 
-        /* compute the ratio of the actual to the predicted reduction. */
-        ratio = 0.;
-        if (prered > 0.)
-            ratio = actred / prered;
+  while (true) {
+    /* determine the direction p. */
+    internal::dogleg<Scalar>(R, diag, qtf, delta, wa1);
 
-        /* update the step bound. */
-        if (ratio < Scalar(.1)) {
-            ncsuc = 0;
-            ++ncfail;
-            delta = Scalar(.5) * delta;
-        } else {
-            ncfail = 0;
-            ++ncsuc;
-            if (ratio >= Scalar(.5) || ncsuc > 1)
-                delta = (std::max)(delta, pnorm / Scalar(.5));
-            if (abs(ratio - 1.) <= Scalar(.1)) {
-                delta = pnorm / Scalar(.5);
-            }
-        }
+    /* store the direction p and x + p. calculate the norm of p. */
+    wa1 = -wa1;
+    wa2 = x + wa1;
+    pnorm = diag.cwiseProduct(wa1).stableNorm();
 
-        /* test for successful iteration. */
-        if (ratio >= Scalar(1e-4)) {
-            /* successful iteration. update x, fvec, and their norms. */
-            x = wa2;
-            wa2 = diag.cwiseProduct(x);
-            fvec = wa4;
-            xnorm = wa2.stableNorm();
-            fnorm = fnorm1;
-            ++iter;
-        }
+    /* on the first iteration, adjust the initial step bound. */
+    if (iter == 1) delta = (std::min)(delta, pnorm);
 
-        /* determine the progress of the iteration. */
-        ++nslow1;
-        if (actred >= Scalar(.001))
-            nslow1 = 0;
-        if (jeval)
-            ++nslow2;
-        if (actred >= Scalar(.1))
-            nslow2 = 0;
+    /* evaluate the function at x + p and calculate its norm. */
+    if (functor(wa2, wa4) < 0) return HybridNonLinearSolverSpace::UserAsked;
+    ++nfev;
+    fnorm1 = wa4.stableNorm();
 
-        /* test for convergence. */
-        if (delta <= parameters.xtol * xnorm || fnorm == 0.)
-            return HybridNonLinearSolverSpace::RelativeErrorTooSmall;
+    /* compute the scaled actual reduction. */
+    actred = -1.;
+    if (fnorm1 < fnorm) /* Computing 2nd power */
+      actred = 1. - numext::abs2(fnorm1 / fnorm);
 
-        /* tests for termination and stringent tolerances. */
-        if (nfev >= parameters.maxfev)
-            return HybridNonLinearSolverSpace::TooManyFunctionEvaluation;
-        if (Scalar(.1) * (std::max)(Scalar(.1) * delta, pnorm) <= NumTraits<Scalar>::epsilon() * xnorm)
-            return HybridNonLinearSolverSpace::TolTooSmall;
-        if (nslow2 == 5)
-            return HybridNonLinearSolverSpace::NotMakingProgressJacobian;
-        if (nslow1 == 10)
-            return HybridNonLinearSolverSpace::NotMakingProgressIterations;
+    /* compute the scaled predicted reduction. */
+    wa3 = R.template triangularView<Upper>() * wa1 + qtf;
+    temp = wa3.stableNorm();
+    prered = 0.;
+    if (temp < fnorm) /* Computing 2nd power */
+      prered = 1. - numext::abs2(temp / fnorm);
 
-        /* criterion for recalculating jacobian. */
-        if (ncfail == 2)
-            break; // leave inner loop and go for the next outer loop iteration
+    /* compute the ratio of the actual to the predicted reduction. */
+    ratio = 0.;
+    if (prered > 0.) ratio = actred / prered;
 
-        /* calculate the rank one modification to the jacobian */
-        /* and update qtf if necessary. */
-        wa1 = diag.cwiseProduct( diag.cwiseProduct(wa1)/pnorm );
-        wa2 = fjac.transpose() * wa4;
-        if (ratio >= Scalar(1e-4))
-            qtf = wa2;
-        wa2 = (wa2-wa3)/pnorm;
-
-        /* compute the qr factorization of the updated jacobian. */
-        internal::r1updt<Scalar>(R, wa1, v_givens, w_givens, wa2, wa3, &sing);
-        internal::r1mpyq<Scalar>(n, n, fjac.data(), v_givens, w_givens);
-        internal::r1mpyq<Scalar>(1, n, qtf.data(), v_givens, w_givens);
-
-        jeval = false;
+    /* update the step bound. */
+    if (ratio < Scalar(.1)) {
+      ncsuc = 0;
+      ++ncfail;
+      delta = Scalar(.5) * delta;
+    } else {
+      ncfail = 0;
+      ++ncsuc;
+      if (ratio >= Scalar(.5) || ncsuc > 1) delta = (std::max)(delta, pnorm / Scalar(.5));
+      if (abs(ratio - 1.) <= Scalar(.1)) {
+        delta = pnorm / Scalar(.5);
+      }
     }
-    return HybridNonLinearSolverSpace::Running;
+
+    /* test for successful iteration. */
+    if (ratio >= Scalar(1e-4)) {
+      /* successful iteration. update x, fvec, and their norms. */
+      x = wa2;
+      wa2 = diag.cwiseProduct(x);
+      fvec = wa4;
+      xnorm = wa2.stableNorm();
+      fnorm = fnorm1;
+      ++iter;
+    }
+
+    /* determine the progress of the iteration. */
+    ++nslow1;
+    if (actred >= Scalar(.001)) nslow1 = 0;
+    if (jeval) ++nslow2;
+    if (actred >= Scalar(.1)) nslow2 = 0;
+
+    /* test for convergence. */
+    if (delta <= parameters.xtol * xnorm || fnorm == 0.) return HybridNonLinearSolverSpace::RelativeErrorTooSmall;
+
+    /* tests for termination and stringent tolerances. */
+    if (nfev >= parameters.maxfev) return HybridNonLinearSolverSpace::TooManyFunctionEvaluation;
+    if (Scalar(.1) * (std::max)(Scalar(.1) * delta, pnorm) <= NumTraits<Scalar>::epsilon() * xnorm)
+      return HybridNonLinearSolverSpace::TolTooSmall;
+    if (nslow2 == 5) return HybridNonLinearSolverSpace::NotMakingProgressJacobian;
+    if (nslow1 == 10) return HybridNonLinearSolverSpace::NotMakingProgressIterations;
+
+    /* criterion for recalculating jacobian. */
+    if (ncfail == 2) break;  // leave inner loop and go for the next outer loop iteration
+
+    /* calculate the rank one modification to the jacobian */
+    /* and update qtf if necessary. */
+    wa1 = diag.cwiseProduct(diag.cwiseProduct(wa1) / pnorm);
+    wa2 = fjac.transpose() * wa4;
+    if (ratio >= Scalar(1e-4)) qtf = wa2;
+    wa2 = (wa2 - wa3) / pnorm;
+
+    /* compute the qr factorization of the updated jacobian. */
+    internal::r1updt<Scalar>(R, wa1, v_givens, w_givens, wa2, wa3, &sing);
+    internal::r1mpyq<Scalar>(n, n, fjac.data(), v_givens, w_givens);
+    internal::r1mpyq<Scalar>(1, n, qtf.data(), v_givens, w_givens);
+
+    jeval = false;
+  }
+  return HybridNonLinearSolverSpace::Running;
 }
 
-template<typename FunctorType, typename Scalar>
-HybridNonLinearSolverSpace::Status
-HybridNonLinearSolver<FunctorType,Scalar>::solveNumericalDiff(FVectorType  &x)
-{
-    HybridNonLinearSolverSpace::Status status = solveNumericalDiffInit(x);
-    if (status==HybridNonLinearSolverSpace::ImproperInputParameters)
-        return status;
-    while (status==HybridNonLinearSolverSpace::Running)
-        status = solveNumericalDiffOneStep(x);
-    return status;
+template <typename FunctorType, typename Scalar>
+HybridNonLinearSolverSpace::Status HybridNonLinearSolver<FunctorType, Scalar>::solveNumericalDiff(FVectorType &x) {
+  HybridNonLinearSolverSpace::Status status = solveNumericalDiffInit(x);
+  if (status == HybridNonLinearSolverSpace::ImproperInputParameters) return status;
+  while (status == HybridNonLinearSolverSpace::Running) status = solveNumericalDiffOneStep(x);
+  return status;
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_HYBRIDNONLINEARSOLVER_H
+#endif  // EIGEN_HYBRIDNONLINEARSOLVER_H
 
-//vim: ai ts=4 sts=4 et sw=4
+// vim: ai ts=4 sts=4 et sw=4
diff --git a/unsupported/Eigen/src/NonLinearOptimization/InternalHeaderCheck.h b/unsupported/Eigen/src/NonLinearOptimization/InternalHeaderCheck.h
index 5b2276c..d06970f 100644
--- a/unsupported/Eigen/src/NonLinearOptimization/InternalHeaderCheck.h
+++ b/unsupported/Eigen/src/NonLinearOptimization/InternalHeaderCheck.h
@@ -1,3 +1,4 @@
 #ifndef EIGEN_NONLINEAROPTIMIZATION_MODULE_H
-#error "Please include unsupported/Eigen/NonLinearOptimization instead of including headers inside the src directory directly."
+#error \
+    "Please include unsupported/Eigen/NonLinearOptimization instead of including headers inside the src directory directly."
 #endif
diff --git a/unsupported/Eigen/src/NonLinearOptimization/LevenbergMarquardt.h b/unsupported/Eigen/src/NonLinearOptimization/LevenbergMarquardt.h
index bdf8370..808fd7d 100644
--- a/unsupported/Eigen/src/NonLinearOptimization/LevenbergMarquardt.h
+++ b/unsupported/Eigen/src/NonLinearOptimization/LevenbergMarquardt.h
@@ -16,645 +16,572 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace LevenbergMarquardtSpace {
-    enum Status {
-        NotStarted = -2,
-        Running = -1,
-        ImproperInputParameters = 0,
-        RelativeReductionTooSmall = 1,
-        RelativeErrorTooSmall = 2,
-        RelativeErrorAndReductionTooSmall = 3,
-        CosinusTooSmall = 4,
-        TooManyFunctionEvaluation = 5,
-        FtolTooSmall = 6,
-        XtolTooSmall = 7,
-        GtolTooSmall = 8,
-        UserAsked = 9
-    };
+enum Status {
+  NotStarted = -2,
+  Running = -1,
+  ImproperInputParameters = 0,
+  RelativeReductionTooSmall = 1,
+  RelativeErrorTooSmall = 2,
+  RelativeErrorAndReductionTooSmall = 3,
+  CosinusTooSmall = 4,
+  TooManyFunctionEvaluation = 5,
+  FtolTooSmall = 6,
+  XtolTooSmall = 7,
+  GtolTooSmall = 8,
+  UserAsked = 9
+};
 }
 
-
-
 /**
-  * \ingroup NonLinearOptimization_Module
-  * \brief Performs non linear optimization over a non-linear function,
-  * using a variant of the Levenberg Marquardt algorithm.
-  *
-  * Check wikipedia for more information.
-  * http://en.wikipedia.org/wiki/Levenberg%E2%80%93Marquardt_algorithm
-  */
-template<typename FunctorType, typename Scalar=double>
-class LevenbergMarquardt
-{
-    static Scalar sqrt_epsilon()
-    {
-      using std::sqrt;
-      return sqrt(NumTraits<Scalar>::epsilon());
-    }
-    
-public:
-    LevenbergMarquardt(FunctorType &_functor)
-        : functor(_functor) { nfev = njev = iter = 0;  fnorm = gnorm = 0.; useExternalScaling=false; }
+ * \ingroup NonLinearOptimization_Module
+ * \brief Performs non linear optimization over a non-linear function,
+ * using a variant of the Levenberg Marquardt algorithm.
+ *
+ * Check wikipedia for more information.
+ * http://en.wikipedia.org/wiki/Levenberg%E2%80%93Marquardt_algorithm
+ */
+template <typename FunctorType, typename Scalar = double>
+class LevenbergMarquardt {
+  static Scalar sqrt_epsilon() {
+    using std::sqrt;
+    return sqrt(NumTraits<Scalar>::epsilon());
+  }
 
-    typedef DenseIndex Index;
-    
-    struct Parameters {
-        Parameters()
-            : factor(Scalar(100.))
-            , maxfev(400)
-            , ftol(sqrt_epsilon())
-            , xtol(sqrt_epsilon())
-            , gtol(Scalar(0.))
-            , epsfcn(Scalar(0.)) {}
-        Scalar factor;
-        Index maxfev;   // maximum number of function evaluation
-        Scalar ftol;
-        Scalar xtol;
-        Scalar gtol;
-        Scalar epsfcn;
-    };
+ public:
+  LevenbergMarquardt(FunctorType &_functor) : functor(_functor) {
+    nfev = njev = iter = 0;
+    fnorm = gnorm = 0.;
+    useExternalScaling = false;
+  }
 
-    typedef Matrix< Scalar, Dynamic, 1 > FVectorType;
-    typedef Matrix< Scalar, Dynamic, Dynamic > JacobianType;
+  typedef DenseIndex Index;
 
-    LevenbergMarquardtSpace::Status lmder1(
-            FVectorType &x,
-            const Scalar tol = sqrt_epsilon()
-            );
+  struct Parameters {
+    Parameters()
+        : factor(Scalar(100.)),
+          maxfev(400),
+          ftol(sqrt_epsilon()),
+          xtol(sqrt_epsilon()),
+          gtol(Scalar(0.)),
+          epsfcn(Scalar(0.)) {}
+    Scalar factor;
+    Index maxfev;  // maximum number of function evaluation
+    Scalar ftol;
+    Scalar xtol;
+    Scalar gtol;
+    Scalar epsfcn;
+  };
 
-    LevenbergMarquardtSpace::Status minimize(FVectorType &x);
-    LevenbergMarquardtSpace::Status minimizeInit(FVectorType &x);
-    LevenbergMarquardtSpace::Status minimizeOneStep(FVectorType &x);
+  typedef Matrix<Scalar, Dynamic, 1> FVectorType;
+  typedef Matrix<Scalar, Dynamic, Dynamic> JacobianType;
 
-    static LevenbergMarquardtSpace::Status lmdif1(
-            FunctorType &functor,
-            FVectorType &x,
-            Index *nfev,
-            const Scalar tol = sqrt_epsilon()
-            );
+  LevenbergMarquardtSpace::Status lmder1(FVectorType &x, const Scalar tol = sqrt_epsilon());
 
-    LevenbergMarquardtSpace::Status lmstr1(
-            FVectorType  &x,
-            const Scalar tol = sqrt_epsilon()
-            );
+  LevenbergMarquardtSpace::Status minimize(FVectorType &x);
+  LevenbergMarquardtSpace::Status minimizeInit(FVectorType &x);
+  LevenbergMarquardtSpace::Status minimizeOneStep(FVectorType &x);
 
-    LevenbergMarquardtSpace::Status minimizeOptimumStorage(FVectorType  &x);
-    LevenbergMarquardtSpace::Status minimizeOptimumStorageInit(FVectorType  &x);
-    LevenbergMarquardtSpace::Status minimizeOptimumStorageOneStep(FVectorType  &x);
+  static LevenbergMarquardtSpace::Status lmdif1(FunctorType &functor, FVectorType &x, Index *nfev,
+                                                const Scalar tol = sqrt_epsilon());
 
-    void resetParameters(void) { parameters = Parameters(); }
+  LevenbergMarquardtSpace::Status lmstr1(FVectorType &x, const Scalar tol = sqrt_epsilon());
 
-    Parameters parameters;
-    FVectorType  fvec, qtf, diag;
-    JacobianType fjac;
-    PermutationMatrix<Dynamic,Dynamic> permutation;
-    Index nfev;
-    Index njev;
-    Index iter;
-    Scalar fnorm, gnorm;
-    bool useExternalScaling; 
+  LevenbergMarquardtSpace::Status minimizeOptimumStorage(FVectorType &x);
+  LevenbergMarquardtSpace::Status minimizeOptimumStorageInit(FVectorType &x);
+  LevenbergMarquardtSpace::Status minimizeOptimumStorageOneStep(FVectorType &x);
 
-    Scalar lm_param(void) { return par; }
-private:
-    
-    FunctorType &functor;
-    Index n;
-    Index m;
-    FVectorType wa1, wa2, wa3, wa4;
+  void resetParameters(void) { parameters = Parameters(); }
 
-    Scalar par, sum;
-    Scalar temp, temp1, temp2;
-    Scalar delta;
-    Scalar ratio;
-    Scalar pnorm, xnorm, fnorm1, actred, dirder, prered;
+  Parameters parameters;
+  FVectorType fvec, qtf, diag;
+  JacobianType fjac;
+  PermutationMatrix<Dynamic, Dynamic> permutation;
+  Index nfev;
+  Index njev;
+  Index iter;
+  Scalar fnorm, gnorm;
+  bool useExternalScaling;
 
-    LevenbergMarquardt& operator=(const LevenbergMarquardt&);
+  Scalar lm_param(void) { return par; }
+
+ private:
+  FunctorType &functor;
+  Index n;
+  Index m;
+  FVectorType wa1, wa2, wa3, wa4;
+
+  Scalar par, sum;
+  Scalar temp, temp1, temp2;
+  Scalar delta;
+  Scalar ratio;
+  Scalar pnorm, xnorm, fnorm1, actred, dirder, prered;
+
+  LevenbergMarquardt &operator=(const LevenbergMarquardt &);
 };
 
-template<typename FunctorType, typename Scalar>
-LevenbergMarquardtSpace::Status
-LevenbergMarquardt<FunctorType,Scalar>::lmder1(
-        FVectorType  &x,
-        const Scalar tol
-        )
-{
-    n = x.size();
-    m = functor.values();
+template <typename FunctorType, typename Scalar>
+LevenbergMarquardtSpace::Status LevenbergMarquardt<FunctorType, Scalar>::lmder1(FVectorType &x, const Scalar tol) {
+  n = x.size();
+  m = functor.values();
 
-    /* check the input parameters for errors. */
-    if (n <= 0 || m < n || tol < 0.)
-        return LevenbergMarquardtSpace::ImproperInputParameters;
+  /* check the input parameters for errors. */
+  if (n <= 0 || m < n || tol < 0.) return LevenbergMarquardtSpace::ImproperInputParameters;
 
-    resetParameters();
-    parameters.ftol = tol;
-    parameters.xtol = tol;
-    parameters.maxfev = 100*(n+1);
+  resetParameters();
+  parameters.ftol = tol;
+  parameters.xtol = tol;
+  parameters.maxfev = 100 * (n + 1);
 
-    return minimize(x);
+  return minimize(x);
 }
 
-
-template<typename FunctorType, typename Scalar>
-LevenbergMarquardtSpace::Status
-LevenbergMarquardt<FunctorType,Scalar>::minimize(FVectorType  &x)
-{
-    LevenbergMarquardtSpace::Status status = minimizeInit(x);
-    if (status==LevenbergMarquardtSpace::ImproperInputParameters)
-        return status;
-    do {
-        status = minimizeOneStep(x);
-    } while (status==LevenbergMarquardtSpace::Running);
-    return status;
+template <typename FunctorType, typename Scalar>
+LevenbergMarquardtSpace::Status LevenbergMarquardt<FunctorType, Scalar>::minimize(FVectorType &x) {
+  LevenbergMarquardtSpace::Status status = minimizeInit(x);
+  if (status == LevenbergMarquardtSpace::ImproperInputParameters) return status;
+  do {
+    status = minimizeOneStep(x);
+  } while (status == LevenbergMarquardtSpace::Running);
+  return status;
 }
 
-template<typename FunctorType, typename Scalar>
-LevenbergMarquardtSpace::Status
-LevenbergMarquardt<FunctorType,Scalar>::minimizeInit(FVectorType  &x)
-{
-    n = x.size();
-    m = functor.values();
+template <typename FunctorType, typename Scalar>
+LevenbergMarquardtSpace::Status LevenbergMarquardt<FunctorType, Scalar>::minimizeInit(FVectorType &x) {
+  n = x.size();
+  m = functor.values();
 
-    wa1.resize(n); wa2.resize(n); wa3.resize(n);
-    wa4.resize(m);
-    fvec.resize(m);
-    fjac.resize(m, n);
+  wa1.resize(n);
+  wa2.resize(n);
+  wa3.resize(n);
+  wa4.resize(m);
+  fvec.resize(m);
+  fjac.resize(m, n);
+  if (!useExternalScaling) diag.resize(n);
+  eigen_assert((!useExternalScaling || diag.size() == n) &&
+               "When useExternalScaling is set, the caller must provide a valid 'diag'");
+  qtf.resize(n);
+
+  /* Function Body */
+  nfev = 0;
+  njev = 0;
+
+  /*     check the input parameters for errors. */
+  if (n <= 0 || m < n || parameters.ftol < 0. || parameters.xtol < 0. || parameters.gtol < 0. ||
+      parameters.maxfev <= 0 || parameters.factor <= 0.)
+    return LevenbergMarquardtSpace::ImproperInputParameters;
+
+  if (useExternalScaling)
+    for (Index j = 0; j < n; ++j)
+      if (diag[j] <= 0.) return LevenbergMarquardtSpace::ImproperInputParameters;
+
+  /*     evaluate the function at the starting point */
+  /*     and calculate its norm. */
+  nfev = 1;
+  if (functor(x, fvec) < 0) return LevenbergMarquardtSpace::UserAsked;
+  fnorm = fvec.stableNorm();
+
+  /*     initialize levenberg-marquardt parameter and iteration counter. */
+  par = 0.;
+  iter = 1;
+
+  return LevenbergMarquardtSpace::NotStarted;
+}
+
+template <typename FunctorType, typename Scalar>
+LevenbergMarquardtSpace::Status LevenbergMarquardt<FunctorType, Scalar>::minimizeOneStep(FVectorType &x) {
+  using std::abs;
+  using std::sqrt;
+
+  eigen_assert(x.size() == n);  // check the caller is not cheating us
+
+  /* calculate the jacobian matrix. */
+  Index df_ret = functor.df(x, fjac);
+  if (df_ret < 0) return LevenbergMarquardtSpace::UserAsked;
+  if (df_ret > 0)
+    // numerical diff, we evaluated the function df_ret times
+    nfev += df_ret;
+  else
+    njev++;
+
+  /* compute the qr factorization of the jacobian. */
+  wa2 = fjac.colwise().blueNorm();
+  ColPivHouseholderQR<JacobianType> qrfac(fjac);
+  fjac = qrfac.matrixQR();
+  permutation = qrfac.colsPermutation();
+
+  /* on the first iteration and if external scaling is not used, scale according */
+  /* to the norms of the columns of the initial jacobian. */
+  if (iter == 1) {
     if (!useExternalScaling)
-        diag.resize(n);
-    eigen_assert( (!useExternalScaling || diag.size()==n) && "When useExternalScaling is set, the caller must provide a valid 'diag'");
-    qtf.resize(n);
+      for (Index j = 0; j < n; ++j) diag[j] = (wa2[j] == 0.) ? 1. : wa2[j];
 
-    /* Function Body */
-    nfev = 0;
-    njev = 0;
+    /* on the first iteration, calculate the norm of the scaled x */
+    /* and initialize the step bound delta. */
+    xnorm = diag.cwiseProduct(x).stableNorm();
+    delta = parameters.factor * xnorm;
+    if (delta == 0.) delta = parameters.factor;
+  }
 
-    /*     check the input parameters for errors. */
-    if (n <= 0 || m < n || parameters.ftol < 0. || parameters.xtol < 0. || parameters.gtol < 0. || parameters.maxfev <= 0 || parameters.factor <= 0.)
-        return LevenbergMarquardtSpace::ImproperInputParameters;
+  /* form (q transpose)*fvec and store the first n components in */
+  /* qtf. */
+  wa4 = fvec;
+  wa4.applyOnTheLeft(qrfac.householderQ().adjoint());
+  qtf = wa4.head(n);
 
-    if (useExternalScaling)
-        for (Index j = 0; j < n; ++j)
-            if (diag[j] <= 0.)
-                return LevenbergMarquardtSpace::ImproperInputParameters;
+  /* compute the norm of the scaled gradient. */
+  gnorm = 0.;
+  if (fnorm != 0.)
+    for (Index j = 0; j < n; ++j)
+      if (wa2[permutation.indices()[j]] != 0.)
+        gnorm = (std::max)(gnorm,
+                           abs(fjac.col(j).head(j + 1).dot(qtf.head(j + 1) / fnorm) / wa2[permutation.indices()[j]]));
 
-    /*     evaluate the function at the starting point */
-    /*     and calculate its norm. */
-    nfev = 1;
-    if ( functor(x, fvec) < 0)
-        return LevenbergMarquardtSpace::UserAsked;
-    fnorm = fvec.stableNorm();
+  /* test for convergence of the gradient norm. */
+  if (gnorm <= parameters.gtol) return LevenbergMarquardtSpace::CosinusTooSmall;
 
-    /*     initialize levenberg-marquardt parameter and iteration counter. */
-    par = 0.;
-    iter = 1;
+  /* rescale if necessary. */
+  if (!useExternalScaling) diag = diag.cwiseMax(wa2);
 
-    return LevenbergMarquardtSpace::NotStarted;
+  do {
+    /* determine the levenberg-marquardt parameter. */
+    internal::lmpar2<Scalar>(qrfac, diag, qtf, delta, par, wa1);
+
+    /* store the direction p and x + p. calculate the norm of p. */
+    wa1 = -wa1;
+    wa2 = x + wa1;
+    pnorm = diag.cwiseProduct(wa1).stableNorm();
+
+    /* on the first iteration, adjust the initial step bound. */
+    if (iter == 1) delta = (std::min)(delta, pnorm);
+
+    /* evaluate the function at x + p and calculate its norm. */
+    if (functor(wa2, wa4) < 0) return LevenbergMarquardtSpace::UserAsked;
+    ++nfev;
+    fnorm1 = wa4.stableNorm();
+
+    /* compute the scaled actual reduction. */
+    actred = -1.;
+    if (Scalar(.1) * fnorm1 < fnorm) actred = 1. - numext::abs2(fnorm1 / fnorm);
+
+    /* compute the scaled predicted reduction and */
+    /* the scaled directional derivative. */
+    wa3 = fjac.template triangularView<Upper>() * (qrfac.colsPermutation().inverse() * wa1);
+    temp1 = numext::abs2(wa3.stableNorm() / fnorm);
+    temp2 = numext::abs2(sqrt(par) * pnorm / fnorm);
+    prered = temp1 + temp2 / Scalar(.5);
+    dirder = -(temp1 + temp2);
+
+    /* compute the ratio of the actual to the predicted */
+    /* reduction. */
+    ratio = 0.;
+    if (prered != 0.) ratio = actred / prered;
+
+    /* update the step bound. */
+    if (ratio <= Scalar(.25)) {
+      if (actred >= 0.) temp = Scalar(.5);
+      if (actred < 0.) temp = Scalar(.5) * dirder / (dirder + Scalar(.5) * actred);
+      if (Scalar(.1) * fnorm1 >= fnorm || temp < Scalar(.1)) temp = Scalar(.1);
+      /* Computing MIN */
+      delta = temp * (std::min)(delta, pnorm / Scalar(.1));
+      par /= temp;
+    } else if (!(par != 0. && ratio < Scalar(.75))) {
+      delta = pnorm / Scalar(.5);
+      par = Scalar(.5) * par;
+    }
+
+    /* test for successful iteration. */
+    if (ratio >= Scalar(1e-4)) {
+      /* successful iteration. update x, fvec, and their norms. */
+      x = wa2;
+      wa2 = diag.cwiseProduct(x);
+      fvec = wa4;
+      xnorm = wa2.stableNorm();
+      fnorm = fnorm1;
+      ++iter;
+    }
+
+    /* tests for convergence. */
+    if (abs(actred) <= parameters.ftol && prered <= parameters.ftol && Scalar(.5) * ratio <= 1. &&
+        delta <= parameters.xtol * xnorm)
+      return LevenbergMarquardtSpace::RelativeErrorAndReductionTooSmall;
+    if (abs(actred) <= parameters.ftol && prered <= parameters.ftol && Scalar(.5) * ratio <= 1.)
+      return LevenbergMarquardtSpace::RelativeReductionTooSmall;
+    if (delta <= parameters.xtol * xnorm) return LevenbergMarquardtSpace::RelativeErrorTooSmall;
+
+    /* tests for termination and stringent tolerances. */
+    if (nfev >= parameters.maxfev) return LevenbergMarquardtSpace::TooManyFunctionEvaluation;
+    if (abs(actred) <= NumTraits<Scalar>::epsilon() && prered <= NumTraits<Scalar>::epsilon() &&
+        Scalar(.5) * ratio <= 1.)
+      return LevenbergMarquardtSpace::FtolTooSmall;
+    if (delta <= NumTraits<Scalar>::epsilon() * xnorm) return LevenbergMarquardtSpace::XtolTooSmall;
+    if (gnorm <= NumTraits<Scalar>::epsilon()) return LevenbergMarquardtSpace::GtolTooSmall;
+
+  } while (ratio < Scalar(1e-4));
+
+  return LevenbergMarquardtSpace::Running;
 }
 
-template<typename FunctorType, typename Scalar>
-LevenbergMarquardtSpace::Status
-LevenbergMarquardt<FunctorType,Scalar>::minimizeOneStep(FVectorType  &x)
-{
-    using std::abs;
-    using std::sqrt;
+template <typename FunctorType, typename Scalar>
+LevenbergMarquardtSpace::Status LevenbergMarquardt<FunctorType, Scalar>::lmstr1(FVectorType &x, const Scalar tol) {
+  n = x.size();
+  m = functor.values();
 
-    eigen_assert(x.size()==n); // check the caller is not cheating us
+  /* check the input parameters for errors. */
+  if (n <= 0 || m < n || tol < 0.) return LevenbergMarquardtSpace::ImproperInputParameters;
 
-    /* calculate the jacobian matrix. */
-    Index df_ret = functor.df(x, fjac);
-    if (df_ret<0)
-        return LevenbergMarquardtSpace::UserAsked;
-    if (df_ret>0)
-        // numerical diff, we evaluated the function df_ret times
-        nfev += df_ret;
-    else njev++;
+  resetParameters();
+  parameters.ftol = tol;
+  parameters.xtol = tol;
+  parameters.maxfev = 100 * (n + 1);
 
-    /* compute the qr factorization of the jacobian. */
+  return minimizeOptimumStorage(x);
+}
+
+template <typename FunctorType, typename Scalar>
+LevenbergMarquardtSpace::Status LevenbergMarquardt<FunctorType, Scalar>::minimizeOptimumStorageInit(FVectorType &x) {
+  n = x.size();
+  m = functor.values();
+
+  wa1.resize(n);
+  wa2.resize(n);
+  wa3.resize(n);
+  wa4.resize(m);
+  fvec.resize(m);
+  // Only R is stored in fjac. Q is only used to compute 'qtf', which is
+  // Q.transpose()*rhs. qtf will be updated using givens rotation,
+  // instead of storing them in Q.
+  // The purpose it to only use a nxn matrix, instead of mxn here, so
+  // that we can handle cases where m>>n :
+  fjac.resize(n, n);
+  if (!useExternalScaling) diag.resize(n);
+  eigen_assert((!useExternalScaling || diag.size() == n) &&
+               "When useExternalScaling is set, the caller must provide a valid 'diag'");
+  qtf.resize(n);
+
+  /* Function Body */
+  nfev = 0;
+  njev = 0;
+
+  /*     check the input parameters for errors. */
+  if (n <= 0 || m < n || parameters.ftol < 0. || parameters.xtol < 0. || parameters.gtol < 0. ||
+      parameters.maxfev <= 0 || parameters.factor <= 0.)
+    return LevenbergMarquardtSpace::ImproperInputParameters;
+
+  if (useExternalScaling)
+    for (Index j = 0; j < n; ++j)
+      if (diag[j] <= 0.) return LevenbergMarquardtSpace::ImproperInputParameters;
+
+  /*     evaluate the function at the starting point */
+  /*     and calculate its norm. */
+  nfev = 1;
+  if (functor(x, fvec) < 0) return LevenbergMarquardtSpace::UserAsked;
+  fnorm = fvec.stableNorm();
+
+  /*     initialize levenberg-marquardt parameter and iteration counter. */
+  par = 0.;
+  iter = 1;
+
+  return LevenbergMarquardtSpace::NotStarted;
+}
+
+template <typename FunctorType, typename Scalar>
+LevenbergMarquardtSpace::Status LevenbergMarquardt<FunctorType, Scalar>::minimizeOptimumStorageOneStep(FVectorType &x) {
+  using std::abs;
+  using std::sqrt;
+
+  eigen_assert(x.size() == n);  // check the caller is not cheating us
+
+  Index i, j;
+  bool sing;
+
+  /* compute the qr factorization of the jacobian matrix */
+  /* calculated one row at a time, while simultaneously */
+  /* forming (q transpose)*fvec and storing the first */
+  /* n components in qtf. */
+  qtf.fill(0.);
+  fjac.fill(0.);
+  Index rownb = 2;
+  for (i = 0; i < m; ++i) {
+    if (functor.df(x, wa3, rownb) < 0) return LevenbergMarquardtSpace::UserAsked;
+    internal::rwupdt<Scalar>(fjac, wa3, qtf, fvec[i]);
+    ++rownb;
+  }
+  ++njev;
+
+  /* if the jacobian is rank deficient, call qrfac to */
+  /* reorder its columns and update the components of qtf. */
+  sing = false;
+  for (j = 0; j < n; ++j) {
+    if (fjac(j, j) == 0.) sing = true;
+    wa2[j] = fjac.col(j).head(j).stableNorm();
+  }
+  permutation.setIdentity(n);
+  if (sing) {
     wa2 = fjac.colwise().blueNorm();
+    // TODO We have no unit test covering this code path, do not modify
+    // until it is carefully tested
     ColPivHouseholderQR<JacobianType> qrfac(fjac);
     fjac = qrfac.matrixQR();
+    wa1 = fjac.diagonal();
+    fjac.diagonal() = qrfac.hCoeffs();
     permutation = qrfac.colsPermutation();
+    // TODO : avoid this:
+    for (Index ii = 0; ii < fjac.cols(); ii++)
+      fjac.col(ii).segment(ii + 1, fjac.rows() - ii - 1) *= fjac(ii, ii);  // rescale vectors
 
-    /* on the first iteration and if external scaling is not used, scale according */
-    /* to the norms of the columns of the initial jacobian. */
-    if (iter == 1) {
-        if (!useExternalScaling)
-            for (Index j = 0; j < n; ++j)
-                diag[j] = (wa2[j]==0.)? 1. : wa2[j];
-
-        /* on the first iteration, calculate the norm of the scaled x */
-        /* and initialize the step bound delta. */
-        xnorm = diag.cwiseProduct(x).stableNorm();
-        delta = parameters.factor * xnorm;
-        if (delta == 0.)
-            delta = parameters.factor;
-    }
-
-    /* form (q transpose)*fvec and store the first n components in */
-    /* qtf. */
-    wa4 = fvec;
-    wa4.applyOnTheLeft(qrfac.householderQ().adjoint());
-    qtf = wa4.head(n);
-
-    /* compute the norm of the scaled gradient. */
-    gnorm = 0.;
-    if (fnorm != 0.)
-        for (Index j = 0; j < n; ++j)
-            if (wa2[permutation.indices()[j]] != 0.)
-                gnorm = (std::max)(gnorm, abs( fjac.col(j).head(j+1).dot(qtf.head(j+1)/fnorm) / wa2[permutation.indices()[j]]));
-
-    /* test for convergence of the gradient norm. */
-    if (gnorm <= parameters.gtol)
-        return LevenbergMarquardtSpace::CosinusTooSmall;
-
-    /* rescale if necessary. */
-    if (!useExternalScaling)
-        diag = diag.cwiseMax(wa2);
-
-    do {
-
-        /* determine the levenberg-marquardt parameter. */
-        internal::lmpar2<Scalar>(qrfac, diag, qtf, delta, par, wa1);
-
-        /* store the direction p and x + p. calculate the norm of p. */
-        wa1 = -wa1;
-        wa2 = x + wa1;
-        pnorm = diag.cwiseProduct(wa1).stableNorm();
-
-        /* on the first iteration, adjust the initial step bound. */
-        if (iter == 1)
-            delta = (std::min)(delta,pnorm);
-
-        /* evaluate the function at x + p and calculate its norm. */
-        if ( functor(wa2, wa4) < 0)
-            return LevenbergMarquardtSpace::UserAsked;
-        ++nfev;
-        fnorm1 = wa4.stableNorm();
-
-        /* compute the scaled actual reduction. */
-        actred = -1.;
-        if (Scalar(.1) * fnorm1 < fnorm)
-            actred = 1. - numext::abs2(fnorm1 / fnorm);
-
-        /* compute the scaled predicted reduction and */
-        /* the scaled directional derivative. */
-        wa3 = fjac.template triangularView<Upper>() * (qrfac.colsPermutation().inverse() *wa1);
-        temp1 = numext::abs2(wa3.stableNorm() / fnorm);
-        temp2 = numext::abs2(sqrt(par) * pnorm / fnorm);
-        prered = temp1 + temp2 / Scalar(.5);
-        dirder = -(temp1 + temp2);
-
-        /* compute the ratio of the actual to the predicted */
-        /* reduction. */
-        ratio = 0.;
-        if (prered != 0.)
-            ratio = actred / prered;
-
-        /* update the step bound. */
-        if (ratio <= Scalar(.25)) {
-            if (actred >= 0.)
-                temp = Scalar(.5);
-            if (actred < 0.)
-                temp = Scalar(.5) * dirder / (dirder + Scalar(.5) * actred);
-            if (Scalar(.1) * fnorm1 >= fnorm || temp < Scalar(.1))
-                temp = Scalar(.1);
-            /* Computing MIN */
-            delta = temp * (std::min)(delta, pnorm / Scalar(.1));
-            par /= temp;
-        } else if (!(par != 0. && ratio < Scalar(.75))) {
-            delta = pnorm / Scalar(.5);
-            par = Scalar(.5) * par;
-        }
-
-        /* test for successful iteration. */
-        if (ratio >= Scalar(1e-4)) {
-            /* successful iteration. update x, fvec, and their norms. */
-            x = wa2;
-            wa2 = diag.cwiseProduct(x);
-            fvec = wa4;
-            xnorm = wa2.stableNorm();
-            fnorm = fnorm1;
-            ++iter;
-        }
-
-        /* tests for convergence. */
-        if (abs(actred) <= parameters.ftol && prered <= parameters.ftol && Scalar(.5) * ratio <= 1. && delta <= parameters.xtol * xnorm)
-            return LevenbergMarquardtSpace::RelativeErrorAndReductionTooSmall;
-        if (abs(actred) <= parameters.ftol && prered <= parameters.ftol && Scalar(.5) * ratio <= 1.)
-            return LevenbergMarquardtSpace::RelativeReductionTooSmall;
-        if (delta <= parameters.xtol * xnorm)
-            return LevenbergMarquardtSpace::RelativeErrorTooSmall;
-
-        /* tests for termination and stringent tolerances. */
-        if (nfev >= parameters.maxfev)
-            return LevenbergMarquardtSpace::TooManyFunctionEvaluation;
-        if (abs(actred) <= NumTraits<Scalar>::epsilon() && prered <= NumTraits<Scalar>::epsilon() && Scalar(.5) * ratio <= 1.)
-            return LevenbergMarquardtSpace::FtolTooSmall;
-        if (delta <= NumTraits<Scalar>::epsilon() * xnorm)
-            return LevenbergMarquardtSpace::XtolTooSmall;
-        if (gnorm <= NumTraits<Scalar>::epsilon())
-            return LevenbergMarquardtSpace::GtolTooSmall;
-
-    } while (ratio < Scalar(1e-4));
-
-    return LevenbergMarquardtSpace::Running;
-}
-
-template<typename FunctorType, typename Scalar>
-LevenbergMarquardtSpace::Status
-LevenbergMarquardt<FunctorType,Scalar>::lmstr1(
-        FVectorType  &x,
-        const Scalar tol
-        )
-{
-    n = x.size();
-    m = functor.values();
-
-    /* check the input parameters for errors. */
-    if (n <= 0 || m < n || tol < 0.)
-        return LevenbergMarquardtSpace::ImproperInputParameters;
-
-    resetParameters();
-    parameters.ftol = tol;
-    parameters.xtol = tol;
-    parameters.maxfev = 100*(n+1);
-
-    return minimizeOptimumStorage(x);
-}
-
-template<typename FunctorType, typename Scalar>
-LevenbergMarquardtSpace::Status
-LevenbergMarquardt<FunctorType,Scalar>::minimizeOptimumStorageInit(FVectorType  &x)
-{
-    n = x.size();
-    m = functor.values();
-
-    wa1.resize(n); wa2.resize(n); wa3.resize(n);
-    wa4.resize(m);
-    fvec.resize(m);
-    // Only R is stored in fjac. Q is only used to compute 'qtf', which is
-    // Q.transpose()*rhs. qtf will be updated using givens rotation,
-    // instead of storing them in Q.
-    // The purpose it to only use a nxn matrix, instead of mxn here, so
-    // that we can handle cases where m>>n :
-    fjac.resize(n, n);
-    if (!useExternalScaling)
-        diag.resize(n);
-    eigen_assert( (!useExternalScaling || diag.size()==n) && "When useExternalScaling is set, the caller must provide a valid 'diag'");
-    qtf.resize(n);
-
-    /* Function Body */
-    nfev = 0;
-    njev = 0;
-
-    /*     check the input parameters for errors. */
-    if (n <= 0 || m < n || parameters.ftol < 0. || parameters.xtol < 0. || parameters.gtol < 0. || parameters.maxfev <= 0 || parameters.factor <= 0.)
-        return LevenbergMarquardtSpace::ImproperInputParameters;
-
-    if (useExternalScaling)
-        for (Index j = 0; j < n; ++j)
-            if (diag[j] <= 0.)
-                return LevenbergMarquardtSpace::ImproperInputParameters;
-
-    /*     evaluate the function at the starting point */
-    /*     and calculate its norm. */
-    nfev = 1;
-    if ( functor(x, fvec) < 0)
-        return LevenbergMarquardtSpace::UserAsked;
-    fnorm = fvec.stableNorm();
-
-    /*     initialize levenberg-marquardt parameter and iteration counter. */
-    par = 0.;
-    iter = 1;
-
-    return LevenbergMarquardtSpace::NotStarted;
-}
-
-
-template<typename FunctorType, typename Scalar>
-LevenbergMarquardtSpace::Status
-LevenbergMarquardt<FunctorType,Scalar>::minimizeOptimumStorageOneStep(FVectorType  &x)
-{
-    using std::abs;
-    using std::sqrt;
-    
-    eigen_assert(x.size()==n); // check the caller is not cheating us
-
-    Index i, j;
-    bool sing;
-
-    /* compute the qr factorization of the jacobian matrix */
-    /* calculated one row at a time, while simultaneously */
-    /* forming (q transpose)*fvec and storing the first */
-    /* n components in qtf. */
-    qtf.fill(0.);
-    fjac.fill(0.);
-    Index rownb = 2;
-    for (i = 0; i < m; ++i) {
-        if (functor.df(x, wa3, rownb) < 0) return LevenbergMarquardtSpace::UserAsked;
-        internal::rwupdt<Scalar>(fjac, wa3, qtf, fvec[i]);
-        ++rownb;
-    }
-    ++njev;
-
-    /* if the jacobian is rank deficient, call qrfac to */
-    /* reorder its columns and update the components of qtf. */
-    sing = false;
     for (j = 0; j < n; ++j) {
-        if (fjac(j,j) == 0.)
-            sing = true;
-        wa2[j] = fjac.col(j).head(j).stableNorm();
+      if (fjac(j, j) != 0.) {
+        sum = 0.;
+        for (i = j; i < n; ++i) sum += fjac(i, j) * qtf[i];
+        temp = -sum / fjac(j, j);
+        for (i = j; i < n; ++i) qtf[i] += fjac(i, j) * temp;
+      }
+      fjac(j, j) = wa1[j];
     }
-    permutation.setIdentity(n);
-    if (sing) {
-        wa2 = fjac.colwise().blueNorm();
-        // TODO We have no unit test covering this code path, do not modify
-        // until it is carefully tested
-        ColPivHouseholderQR<JacobianType> qrfac(fjac);
-        fjac = qrfac.matrixQR();
-        wa1 = fjac.diagonal();
-        fjac.diagonal() = qrfac.hCoeffs();
-        permutation = qrfac.colsPermutation();
-        // TODO : avoid this:
-        for(Index ii=0; ii< fjac.cols(); ii++) fjac.col(ii).segment(ii+1, fjac.rows()-ii-1) *= fjac(ii,ii); // rescale vectors
+  }
 
-        for (j = 0; j < n; ++j) {
-            if (fjac(j,j) != 0.) {
-                sum = 0.;
-                for (i = j; i < n; ++i)
-                    sum += fjac(i,j) * qtf[i];
-                temp = -sum / fjac(j,j);
-                for (i = j; i < n; ++i)
-                    qtf[i] += fjac(i,j) * temp;
-            }
-            fjac(j,j) = wa1[j];
-        }
-    }
-
-    /* on the first iteration and if external scaling is not used, scale according */
-    /* to the norms of the columns of the initial jacobian. */
-    if (iter == 1) {
-        if (!useExternalScaling)
-            for (j = 0; j < n; ++j)
-                diag[j] = (wa2[j]==0.)? 1. : wa2[j];
-
-        /* on the first iteration, calculate the norm of the scaled x */
-        /* and initialize the step bound delta. */
-        xnorm = diag.cwiseProduct(x).stableNorm();
-        delta = parameters.factor * xnorm;
-        if (delta == 0.)
-            delta = parameters.factor;
-    }
-
-    /* compute the norm of the scaled gradient. */
-    gnorm = 0.;
-    if (fnorm != 0.)
-        for (j = 0; j < n; ++j)
-            if (wa2[permutation.indices()[j]] != 0.)
-                gnorm = (std::max)(gnorm, abs( fjac.col(j).head(j+1).dot(qtf.head(j+1)/fnorm) / wa2[permutation.indices()[j]]));
-
-    /* test for convergence of the gradient norm. */
-    if (gnorm <= parameters.gtol)
-        return LevenbergMarquardtSpace::CosinusTooSmall;
-
-    /* rescale if necessary. */
+  /* on the first iteration and if external scaling is not used, scale according */
+  /* to the norms of the columns of the initial jacobian. */
+  if (iter == 1) {
     if (!useExternalScaling)
-        diag = diag.cwiseMax(wa2);
+      for (j = 0; j < n; ++j) diag[j] = (wa2[j] == 0.) ? 1. : wa2[j];
 
-    do {
+    /* on the first iteration, calculate the norm of the scaled x */
+    /* and initialize the step bound delta. */
+    xnorm = diag.cwiseProduct(x).stableNorm();
+    delta = parameters.factor * xnorm;
+    if (delta == 0.) delta = parameters.factor;
+  }
 
-        /* determine the levenberg-marquardt parameter. */
-        internal::lmpar<Scalar>(fjac, permutation.indices(), diag, qtf, delta, par, wa1);
+  /* compute the norm of the scaled gradient. */
+  gnorm = 0.;
+  if (fnorm != 0.)
+    for (j = 0; j < n; ++j)
+      if (wa2[permutation.indices()[j]] != 0.)
+        gnorm = (std::max)(gnorm,
+                           abs(fjac.col(j).head(j + 1).dot(qtf.head(j + 1) / fnorm) / wa2[permutation.indices()[j]]));
 
-        /* store the direction p and x + p. calculate the norm of p. */
-        wa1 = -wa1;
-        wa2 = x + wa1;
-        pnorm = diag.cwiseProduct(wa1).stableNorm();
+  /* test for convergence of the gradient norm. */
+  if (gnorm <= parameters.gtol) return LevenbergMarquardtSpace::CosinusTooSmall;
 
-        /* on the first iteration, adjust the initial step bound. */
-        if (iter == 1)
-            delta = (std::min)(delta,pnorm);
+  /* rescale if necessary. */
+  if (!useExternalScaling) diag = diag.cwiseMax(wa2);
 
-        /* evaluate the function at x + p and calculate its norm. */
-        if ( functor(wa2, wa4) < 0)
-            return LevenbergMarquardtSpace::UserAsked;
-        ++nfev;
-        fnorm1 = wa4.stableNorm();
+  do {
+    /* determine the levenberg-marquardt parameter. */
+    internal::lmpar<Scalar>(fjac, permutation.indices(), diag, qtf, delta, par, wa1);
 
-        /* compute the scaled actual reduction. */
-        actred = -1.;
-        if (Scalar(.1) * fnorm1 < fnorm)
-            actred = 1. - numext::abs2(fnorm1 / fnorm);
+    /* store the direction p and x + p. calculate the norm of p. */
+    wa1 = -wa1;
+    wa2 = x + wa1;
+    pnorm = diag.cwiseProduct(wa1).stableNorm();
 
-        /* compute the scaled predicted reduction and */
-        /* the scaled directional derivative. */
-        wa3 = fjac.topLeftCorner(n,n).template triangularView<Upper>() * (permutation.inverse() * wa1);
-        temp1 = numext::abs2(wa3.stableNorm() / fnorm);
-        temp2 = numext::abs2(sqrt(par) * pnorm / fnorm);
-        prered = temp1 + temp2 / Scalar(.5);
-        dirder = -(temp1 + temp2);
+    /* on the first iteration, adjust the initial step bound. */
+    if (iter == 1) delta = (std::min)(delta, pnorm);
 
-        /* compute the ratio of the actual to the predicted */
-        /* reduction. */
-        ratio = 0.;
-        if (prered != 0.)
-            ratio = actred / prered;
+    /* evaluate the function at x + p and calculate its norm. */
+    if (functor(wa2, wa4) < 0) return LevenbergMarquardtSpace::UserAsked;
+    ++nfev;
+    fnorm1 = wa4.stableNorm();
 
-        /* update the step bound. */
-        if (ratio <= Scalar(.25)) {
-            if (actred >= 0.)
-                temp = Scalar(.5);
-            if (actred < 0.)
-                temp = Scalar(.5) * dirder / (dirder + Scalar(.5) * actred);
-            if (Scalar(.1) * fnorm1 >= fnorm || temp < Scalar(.1))
-                temp = Scalar(.1);
-            /* Computing MIN */
-            delta = temp * (std::min)(delta, pnorm / Scalar(.1));
-            par /= temp;
-        } else if (!(par != 0. && ratio < Scalar(.75))) {
-            delta = pnorm / Scalar(.5);
-            par = Scalar(.5) * par;
-        }
+    /* compute the scaled actual reduction. */
+    actred = -1.;
+    if (Scalar(.1) * fnorm1 < fnorm) actred = 1. - numext::abs2(fnorm1 / fnorm);
 
-        /* test for successful iteration. */
-        if (ratio >= Scalar(1e-4)) {
-            /* successful iteration. update x, fvec, and their norms. */
-            x = wa2;
-            wa2 = diag.cwiseProduct(x);
-            fvec = wa4;
-            xnorm = wa2.stableNorm();
-            fnorm = fnorm1;
-            ++iter;
-        }
+    /* compute the scaled predicted reduction and */
+    /* the scaled directional derivative. */
+    wa3 = fjac.topLeftCorner(n, n).template triangularView<Upper>() * (permutation.inverse() * wa1);
+    temp1 = numext::abs2(wa3.stableNorm() / fnorm);
+    temp2 = numext::abs2(sqrt(par) * pnorm / fnorm);
+    prered = temp1 + temp2 / Scalar(.5);
+    dirder = -(temp1 + temp2);
 
-        /* tests for convergence. */
-        if (abs(actred) <= parameters.ftol && prered <= parameters.ftol && Scalar(.5) * ratio <= 1. && delta <= parameters.xtol * xnorm)
-            return LevenbergMarquardtSpace::RelativeErrorAndReductionTooSmall;
-        if (abs(actred) <= parameters.ftol && prered <= parameters.ftol && Scalar(.5) * ratio <= 1.)
-            return LevenbergMarquardtSpace::RelativeReductionTooSmall;
-        if (delta <= parameters.xtol * xnorm)
-            return LevenbergMarquardtSpace::RelativeErrorTooSmall;
+    /* compute the ratio of the actual to the predicted */
+    /* reduction. */
+    ratio = 0.;
+    if (prered != 0.) ratio = actred / prered;
 
-        /* tests for termination and stringent tolerances. */
-        if (nfev >= parameters.maxfev)
-            return LevenbergMarquardtSpace::TooManyFunctionEvaluation;
-        if (abs(actred) <= NumTraits<Scalar>::epsilon() && prered <= NumTraits<Scalar>::epsilon() && Scalar(.5) * ratio <= 1.)
-            return LevenbergMarquardtSpace::FtolTooSmall;
-        if (delta <= NumTraits<Scalar>::epsilon() * xnorm)
-            return LevenbergMarquardtSpace::XtolTooSmall;
-        if (gnorm <= NumTraits<Scalar>::epsilon())
-            return LevenbergMarquardtSpace::GtolTooSmall;
+    /* update the step bound. */
+    if (ratio <= Scalar(.25)) {
+      if (actred >= 0.) temp = Scalar(.5);
+      if (actred < 0.) temp = Scalar(.5) * dirder / (dirder + Scalar(.5) * actred);
+      if (Scalar(.1) * fnorm1 >= fnorm || temp < Scalar(.1)) temp = Scalar(.1);
+      /* Computing MIN */
+      delta = temp * (std::min)(delta, pnorm / Scalar(.1));
+      par /= temp;
+    } else if (!(par != 0. && ratio < Scalar(.75))) {
+      delta = pnorm / Scalar(.5);
+      par = Scalar(.5) * par;
+    }
 
-    } while (ratio < Scalar(1e-4));
+    /* test for successful iteration. */
+    if (ratio >= Scalar(1e-4)) {
+      /* successful iteration. update x, fvec, and their norms. */
+      x = wa2;
+      wa2 = diag.cwiseProduct(x);
+      fvec = wa4;
+      xnorm = wa2.stableNorm();
+      fnorm = fnorm1;
+      ++iter;
+    }
 
-    return LevenbergMarquardtSpace::Running;
+    /* tests for convergence. */
+    if (abs(actred) <= parameters.ftol && prered <= parameters.ftol && Scalar(.5) * ratio <= 1. &&
+        delta <= parameters.xtol * xnorm)
+      return LevenbergMarquardtSpace::RelativeErrorAndReductionTooSmall;
+    if (abs(actred) <= parameters.ftol && prered <= parameters.ftol && Scalar(.5) * ratio <= 1.)
+      return LevenbergMarquardtSpace::RelativeReductionTooSmall;
+    if (delta <= parameters.xtol * xnorm) return LevenbergMarquardtSpace::RelativeErrorTooSmall;
+
+    /* tests for termination and stringent tolerances. */
+    if (nfev >= parameters.maxfev) return LevenbergMarquardtSpace::TooManyFunctionEvaluation;
+    if (abs(actred) <= NumTraits<Scalar>::epsilon() && prered <= NumTraits<Scalar>::epsilon() &&
+        Scalar(.5) * ratio <= 1.)
+      return LevenbergMarquardtSpace::FtolTooSmall;
+    if (delta <= NumTraits<Scalar>::epsilon() * xnorm) return LevenbergMarquardtSpace::XtolTooSmall;
+    if (gnorm <= NumTraits<Scalar>::epsilon()) return LevenbergMarquardtSpace::GtolTooSmall;
+
+  } while (ratio < Scalar(1e-4));
+
+  return LevenbergMarquardtSpace::Running;
 }
 
-template<typename FunctorType, typename Scalar>
-LevenbergMarquardtSpace::Status
-LevenbergMarquardt<FunctorType,Scalar>::minimizeOptimumStorage(FVectorType  &x)
-{
-    LevenbergMarquardtSpace::Status status = minimizeOptimumStorageInit(x);
-    if (status==LevenbergMarquardtSpace::ImproperInputParameters)
-        return status;
-    do {
-        status = minimizeOptimumStorageOneStep(x);
-    } while (status==LevenbergMarquardtSpace::Running);
-    return status;
+template <typename FunctorType, typename Scalar>
+LevenbergMarquardtSpace::Status LevenbergMarquardt<FunctorType, Scalar>::minimizeOptimumStorage(FVectorType &x) {
+  LevenbergMarquardtSpace::Status status = minimizeOptimumStorageInit(x);
+  if (status == LevenbergMarquardtSpace::ImproperInputParameters) return status;
+  do {
+    status = minimizeOptimumStorageOneStep(x);
+  } while (status == LevenbergMarquardtSpace::Running);
+  return status;
 }
 
-template<typename FunctorType, typename Scalar>
-LevenbergMarquardtSpace::Status
-LevenbergMarquardt<FunctorType,Scalar>::lmdif1(
-        FunctorType &functor,
-        FVectorType  &x,
-        Index *nfev,
-        const Scalar tol
-        )
-{
-    Index n = x.size();
-    Index m = functor.values();
+template <typename FunctorType, typename Scalar>
+LevenbergMarquardtSpace::Status LevenbergMarquardt<FunctorType, Scalar>::lmdif1(FunctorType &functor, FVectorType &x,
+                                                                                Index *nfev, const Scalar tol) {
+  Index n = x.size();
+  Index m = functor.values();
 
-    /* check the input parameters for errors. */
-    if (n <= 0 || m < n || tol < 0.)
-        return LevenbergMarquardtSpace::ImproperInputParameters;
+  /* check the input parameters for errors. */
+  if (n <= 0 || m < n || tol < 0.) return LevenbergMarquardtSpace::ImproperInputParameters;
 
-    NumericalDiff<FunctorType> numDiff(functor);
-    // embedded LevenbergMarquardt
-    LevenbergMarquardt<NumericalDiff<FunctorType>, Scalar > lm(numDiff);
-    lm.parameters.ftol = tol;
-    lm.parameters.xtol = tol;
-    lm.parameters.maxfev = 200*(n+1);
+  NumericalDiff<FunctorType> numDiff(functor);
+  // embedded LevenbergMarquardt
+  LevenbergMarquardt<NumericalDiff<FunctorType>, Scalar> lm(numDiff);
+  lm.parameters.ftol = tol;
+  lm.parameters.xtol = tol;
+  lm.parameters.maxfev = 200 * (n + 1);
 
-    LevenbergMarquardtSpace::Status info = LevenbergMarquardtSpace::Status(lm.minimize(x));
-    if (nfev)
-        * nfev = lm.nfev;
-    return info;
+  LevenbergMarquardtSpace::Status info = LevenbergMarquardtSpace::Status(lm.minimize(x));
+  if (nfev) *nfev = lm.nfev;
+  return info;
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_LEVENBERGMARQUARDT__H
+#endif  // EIGEN_LEVENBERGMARQUARDT__H
 
-//vim: ai ts=4 sts=4 et sw=4
+// vim: ai ts=4 sts=4 et sw=4
diff --git a/unsupported/Eigen/src/NonLinearOptimization/chkder.h b/unsupported/Eigen/src/NonLinearOptimization/chkder.h
index 8d8f80c..a9311ff 100644
--- a/unsupported/Eigen/src/NonLinearOptimization/chkder.h
+++ b/unsupported/Eigen/src/NonLinearOptimization/chkder.h
@@ -4,66 +4,54 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
-template<typename Scalar>
-void chkder(
-        const Matrix< Scalar, Dynamic, 1 >  &x,
-        const Matrix< Scalar, Dynamic, 1 >  &fvec,
-        const Matrix< Scalar, Dynamic, Dynamic > &fjac,
-        Matrix< Scalar, Dynamic, 1 >  &xp,
-        const Matrix< Scalar, Dynamic, 1 >  &fvecp,
-        int mode,
-        Matrix< Scalar, Dynamic, 1 >  &err
-        )
-{
-    using std::sqrt;
-    using std::abs;
-    using std::log;
-    
-    typedef DenseIndex Index;
+template <typename Scalar>
+void chkder(const Matrix<Scalar, Dynamic, 1> &x, const Matrix<Scalar, Dynamic, 1> &fvec,
+            const Matrix<Scalar, Dynamic, Dynamic> &fjac, Matrix<Scalar, Dynamic, 1> &xp,
+            const Matrix<Scalar, Dynamic, 1> &fvecp, int mode, Matrix<Scalar, Dynamic, 1> &err) {
+  using std::abs;
+  using std::log;
+  using std::sqrt;
 
-    const Scalar eps = sqrt(NumTraits<Scalar>::epsilon());
-    const Scalar epsf = chkder_factor * NumTraits<Scalar>::epsilon();
-    const Scalar epslog = chkder_log10e * log(eps);
-    Scalar temp;
+  typedef DenseIndex Index;
 
-    const Index m = fvec.size(), n = x.size();
+  const Scalar eps = sqrt(NumTraits<Scalar>::epsilon());
+  const Scalar epsf = chkder_factor * NumTraits<Scalar>::epsilon();
+  const Scalar epslog = chkder_log10e * log(eps);
+  Scalar temp;
 
-    if (mode != 2) {
-        /* mode = 1. */
-        xp.resize(n);
-        for (Index j = 0; j < n; ++j) {
-            temp = eps * abs(x[j]);
-            if (temp == 0.)
-                temp = eps;
-            xp[j] = x[j] + temp;
-        }
+  const Index m = fvec.size(), n = x.size();
+
+  if (mode != 2) {
+    /* mode = 1. */
+    xp.resize(n);
+    for (Index j = 0; j < n; ++j) {
+      temp = eps * abs(x[j]);
+      if (temp == 0.) temp = eps;
+      xp[j] = x[j] + temp;
     }
-    else {
-        /* mode = 2. */
-        err.setZero(m); 
-        for (Index j = 0; j < n; ++j) {
-            temp = abs(x[j]);
-            if (temp == 0.)
-                temp = 1.;
-            err += temp * fjac.col(j);
-        }
-        for (Index i = 0; i < m; ++i) {
-            temp = 1.;
-            if (fvec[i] != 0. && fvecp[i] != 0. && abs(fvecp[i] - fvec[i]) >= epsf * abs(fvec[i]))
-                temp = eps * abs((fvecp[i] - fvec[i]) / eps - err[i]) / (abs(fvec[i]) + abs(fvecp[i]));
-            err[i] = 1.;
-            if (temp > NumTraits<Scalar>::epsilon() && temp < eps)
-                err[i] = (chkder_log10e * log(temp) - epslog) / epslog;
-            if (temp >= eps)
-                err[i] = 0.;
-        }
+  } else {
+    /* mode = 2. */
+    err.setZero(m);
+    for (Index j = 0; j < n; ++j) {
+      temp = abs(x[j]);
+      if (temp == 0.) temp = 1.;
+      err += temp * fjac.col(j);
     }
+    for (Index i = 0; i < m; ++i) {
+      temp = 1.;
+      if (fvec[i] != 0. && fvecp[i] != 0. && abs(fvecp[i] - fvec[i]) >= epsf * abs(fvec[i]))
+        temp = eps * abs((fvecp[i] - fvec[i]) / eps - err[i]) / (abs(fvec[i]) + abs(fvecp[i]));
+      err[i] = 1.;
+      if (temp > NumTraits<Scalar>::epsilon() && temp < eps) err[i] = (chkder_log10e * log(temp) - epslog) / epslog;
+      if (temp >= eps) err[i] = 0.;
+    }
+  }
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
diff --git a/unsupported/Eigen/src/NonLinearOptimization/covar.h b/unsupported/Eigen/src/NonLinearOptimization/covar.h
index 6f51fee..311d998 100644
--- a/unsupported/Eigen/src/NonLinearOptimization/covar.h
+++ b/unsupported/Eigen/src/NonLinearOptimization/covar.h
@@ -1,73 +1,66 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
 template <typename Scalar>
-void covar(
-        Matrix< Scalar, Dynamic, Dynamic > &r,
-        const VectorXi &ipvt,
-        Scalar tol = std::sqrt(NumTraits<Scalar>::epsilon()) )
-{
-    using std::abs;
-    typedef DenseIndex Index;
+void covar(Matrix<Scalar, Dynamic, Dynamic> &r, const VectorXi &ipvt,
+           Scalar tol = std::sqrt(NumTraits<Scalar>::epsilon())) {
+  using std::abs;
+  typedef DenseIndex Index;
 
-    /* Local variables */
-    Index i, j, k, l, ii, jj;
-    bool sing;
-    Scalar temp;
+  /* Local variables */
+  Index i, j, k, l, ii, jj;
+  bool sing;
+  Scalar temp;
 
-    /* Function Body */
-    const Index n = r.cols();
-    const Scalar tolr = tol * abs(r(0,0));
-    Matrix< Scalar, Dynamic, 1 > wa(n);
-    eigen_assert(ipvt.size()==n);
+  /* Function Body */
+  const Index n = r.cols();
+  const Scalar tolr = tol * abs(r(0, 0));
+  Matrix<Scalar, Dynamic, 1> wa(n);
+  eigen_assert(ipvt.size() == n);
 
-    /* form the inverse of r in the full upper triangle of r. */
-    l = -1;
-    for (k = 0; k < n; ++k)
-        if (abs(r(k,k)) > tolr) {
-            r(k,k) = 1. / r(k,k);
-            for (j = 0; j <= k-1; ++j) {
-                temp = r(k,k) * r(j,k);
-                r(j,k) = 0.;
-                r.col(k).head(j+1) -= r.col(j).head(j+1) * temp;
-            }
-            l = k;
-        }
-
-    /* form the full upper triangle of the inverse of (r transpose)*r */
-    /* in the full upper triangle of r. */
-    for (k = 0; k <= l; ++k) {
-        for (j = 0; j <= k-1; ++j)
-            r.col(j).head(j+1) += r.col(k).head(j+1) * r(j,k);
-        r.col(k).head(k+1) *= r(k,k);
+  /* form the inverse of r in the full upper triangle of r. */
+  l = -1;
+  for (k = 0; k < n; ++k)
+    if (abs(r(k, k)) > tolr) {
+      r(k, k) = 1. / r(k, k);
+      for (j = 0; j <= k - 1; ++j) {
+        temp = r(k, k) * r(j, k);
+        r(j, k) = 0.;
+        r.col(k).head(j + 1) -= r.col(j).head(j + 1) * temp;
+      }
+      l = k;
     }
 
-    /* form the full lower triangle of the covariance matrix */
-    /* in the strict lower triangle of r and in wa. */
-    for (j = 0; j < n; ++j) {
-        jj = ipvt[j];
-        sing = j > l;
-        for (i = 0; i <= j; ++i) {
-            if (sing)
-                r(i,j) = 0.;
-            ii = ipvt[i];
-            if (ii > jj)
-                r(ii,jj) = r(i,j);
-            if (ii < jj)
-                r(jj,ii) = r(i,j);
-        }
-        wa[jj] = r(j,j);
-    }
+  /* form the full upper triangle of the inverse of (r transpose)*r */
+  /* in the full upper triangle of r. */
+  for (k = 0; k <= l; ++k) {
+    for (j = 0; j <= k - 1; ++j) r.col(j).head(j + 1) += r.col(k).head(j + 1) * r(j, k);
+    r.col(k).head(k + 1) *= r(k, k);
+  }
 
-    /* symmetrize the covariance matrix in r. */
-    r.topLeftCorner(n,n).template triangularView<StrictlyUpper>() = r.topLeftCorner(n,n).transpose();
-    r.diagonal() = wa;
+  /* form the full lower triangle of the covariance matrix */
+  /* in the strict lower triangle of r and in wa. */
+  for (j = 0; j < n; ++j) {
+    jj = ipvt[j];
+    sing = j > l;
+    for (i = 0; i <= j; ++i) {
+      if (sing) r(i, j) = 0.;
+      ii = ipvt[i];
+      if (ii > jj) r(ii, jj) = r(i, j);
+      if (ii < jj) r(jj, ii) = r(i, j);
+    }
+    wa[jj] = r(j, j);
+  }
+
+  /* symmetrize the covariance matrix in r. */
+  r.topLeftCorner(n, n).template triangularView<StrictlyUpper>() = r.topLeftCorner(n, n).transpose();
+  r.diagonal() = wa;
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
diff --git a/unsupported/Eigen/src/NonLinearOptimization/dogleg.h b/unsupported/Eigen/src/NonLinearOptimization/dogleg.h
index 0842ceb..d1abb9e 100644
--- a/unsupported/Eigen/src/NonLinearOptimization/dogleg.h
+++ b/unsupported/Eigen/src/NonLinearOptimization/dogleg.h
@@ -1,110 +1,103 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
 template <typename Scalar>
-void dogleg(
-        const Matrix< Scalar, Dynamic, Dynamic >  &qrfac,
-        const Matrix< Scalar, Dynamic, 1 >  &diag,
-        const Matrix< Scalar, Dynamic, 1 >  &qtb,
-        Scalar delta,
-        Matrix< Scalar, Dynamic, 1 >  &x)
-{
-    using std::abs;
-    using std::sqrt;
-    
-    typedef DenseIndex Index;
+void dogleg(const Matrix<Scalar, Dynamic, Dynamic> &qrfac, const Matrix<Scalar, Dynamic, 1> &diag,
+            const Matrix<Scalar, Dynamic, 1> &qtb, Scalar delta, Matrix<Scalar, Dynamic, 1> &x) {
+  using std::abs;
+  using std::sqrt;
 
-    /* Local variables */
-    Index i, j;
-    Scalar sum, temp, alpha, bnorm;
-    Scalar gnorm, qnorm;
-    Scalar sgnorm;
+  typedef DenseIndex Index;
 
-    /* Function Body */
-    const Scalar epsmch = NumTraits<Scalar>::epsilon();
-    const Index n = qrfac.cols();
-    eigen_assert(n==qtb.size());
-    eigen_assert(n==x.size());
-    eigen_assert(n==diag.size());
-    Matrix< Scalar, Dynamic, 1 >  wa1(n), wa2(n);
+  /* Local variables */
+  Index i, j;
+  Scalar sum, temp, alpha, bnorm;
+  Scalar gnorm, qnorm;
+  Scalar sgnorm;
 
-    /* first, calculate the gauss-newton direction. */
-    for (j = n-1; j >=0; --j) {
-        temp = qrfac(j,j);
-        if (temp == 0.) {
-            temp = epsmch * qrfac.col(j).head(j+1).maxCoeff();
-            if (temp == 0.)
-                temp = epsmch;
-        }
-        if (j==n-1)
-            x[j] = qtb[j] / temp;
-        else
-            x[j] = (qtb[j] - qrfac.row(j).tail(n-j-1).dot(x.tail(n-j-1))) / temp;
+  /* Function Body */
+  const Scalar epsmch = NumTraits<Scalar>::epsilon();
+  const Index n = qrfac.cols();
+  eigen_assert(n == qtb.size());
+  eigen_assert(n == x.size());
+  eigen_assert(n == diag.size());
+  Matrix<Scalar, Dynamic, 1> wa1(n), wa2(n);
+
+  /* first, calculate the gauss-newton direction. */
+  for (j = n - 1; j >= 0; --j) {
+    temp = qrfac(j, j);
+    if (temp == 0.) {
+      temp = epsmch * qrfac.col(j).head(j + 1).maxCoeff();
+      if (temp == 0.) temp = epsmch;
     }
+    if (j == n - 1)
+      x[j] = qtb[j] / temp;
+    else
+      x[j] = (qtb[j] - qrfac.row(j).tail(n - j - 1).dot(x.tail(n - j - 1))) / temp;
+  }
 
-    /* test whether the gauss-newton direction is acceptable. */
-    qnorm = diag.cwiseProduct(x).stableNorm();
-    if (qnorm <= delta)
-        return;
+  /* test whether the gauss-newton direction is acceptable. */
+  qnorm = diag.cwiseProduct(x).stableNorm();
+  if (qnorm <= delta) return;
 
-    // TODO : this path is not tested by Eigen unit tests
+  // TODO : this path is not tested by Eigen unit tests
 
-    /* the gauss-newton direction is not acceptable. */
-    /* next, calculate the scaled gradient direction. */
+  /* the gauss-newton direction is not acceptable. */
+  /* next, calculate the scaled gradient direction. */
 
-    wa1.fill(0.);
-    for (j = 0; j < n; ++j) {
-        wa1.tail(n-j) += qrfac.row(j).tail(n-j) * qtb[j];
-        wa1[j] /= diag[j];
+  wa1.fill(0.);
+  for (j = 0; j < n; ++j) {
+    wa1.tail(n - j) += qrfac.row(j).tail(n - j) * qtb[j];
+    wa1[j] /= diag[j];
+  }
+
+  /* calculate the norm of the scaled gradient and test for */
+  /* the special case in which the scaled gradient is zero. */
+  gnorm = wa1.stableNorm();
+  sgnorm = 0.;
+  alpha = delta / qnorm;
+  if (gnorm == 0.) goto algo_end;
+
+  /* calculate the point along the scaled gradient */
+  /* at which the quadratic is minimized. */
+  wa1.array() /= (diag * gnorm).array();
+  // TODO : once unit tests cover this part,:
+  // wa2 = qrfac.template triangularView<Upper>() * wa1;
+  for (j = 0; j < n; ++j) {
+    sum = 0.;
+    for (i = j; i < n; ++i) {
+      sum += qrfac(j, i) * wa1[i];
     }
+    wa2[j] = sum;
+  }
+  temp = wa2.stableNorm();
+  sgnorm = gnorm / temp / temp;
 
-    /* calculate the norm of the scaled gradient and test for */
-    /* the special case in which the scaled gradient is zero. */
-    gnorm = wa1.stableNorm();
-    sgnorm = 0.;
-    alpha = delta / qnorm;
-    if (gnorm == 0.)
-        goto algo_end;
+  /* test whether the scaled gradient direction is acceptable. */
+  alpha = 0.;
+  if (sgnorm >= delta) goto algo_end;
 
-    /* calculate the point along the scaled gradient */
-    /* at which the quadratic is minimized. */
-    wa1.array() /= (diag*gnorm).array();
-    // TODO : once unit tests cover this part,:
-    // wa2 = qrfac.template triangularView<Upper>() * wa1;
-    for (j = 0; j < n; ++j) {
-        sum = 0.;
-        for (i = j; i < n; ++i) {
-            sum += qrfac(j,i) * wa1[i];
-        }
-        wa2[j] = sum;
-    }
-    temp = wa2.stableNorm();
-    sgnorm = gnorm / temp / temp;
-
-    /* test whether the scaled gradient direction is acceptable. */
-    alpha = 0.;
-    if (sgnorm >= delta)
-        goto algo_end;
-
-    /* the scaled gradient direction is not acceptable. */
-    /* finally, calculate the point along the dogleg */
-    /* at which the quadratic is minimized. */
-    bnorm = qtb.stableNorm();
-    temp = bnorm / gnorm * (bnorm / qnorm) * (sgnorm / delta);
-    temp = temp - delta / qnorm * numext::abs2(sgnorm / delta) + sqrt(numext::abs2(temp - delta / qnorm) + (1.-numext::abs2(delta / qnorm)) * (1.-numext::abs2(sgnorm / delta)));
-    alpha = delta / qnorm * (1. - numext::abs2(sgnorm / delta)) / temp;
+  /* the scaled gradient direction is not acceptable. */
+  /* finally, calculate the point along the dogleg */
+  /* at which the quadratic is minimized. */
+  bnorm = qtb.stableNorm();
+  temp = bnorm / gnorm * (bnorm / qnorm) * (sgnorm / delta);
+  temp = temp - delta / qnorm * numext::abs2(sgnorm / delta) +
+         sqrt(numext::abs2(temp - delta / qnorm) +
+              (1. - numext::abs2(delta / qnorm)) * (1. - numext::abs2(sgnorm / delta)));
+  alpha = delta / qnorm * (1. - numext::abs2(sgnorm / delta)) / temp;
 algo_end:
 
-    /* form appropriate convex combination of the gauss-newton */
-    /* direction and the scaled gradient direction. */
-    temp = (1.-alpha) * (std::min)(sgnorm,delta);
-    x = temp * wa1 + alpha * x;
+  /* form appropriate convex combination of the gauss-newton */
+  /* direction and the scaled gradient direction. */
+  temp = (1. - alpha) * (std::min)(sgnorm, delta);
+  x = temp * wa1 + alpha * x;
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
diff --git a/unsupported/Eigen/src/NonLinearOptimization/fdjac1.h b/unsupported/Eigen/src/NonLinearOptimization/fdjac1.h
index 46bf088..70da3f9 100644
--- a/unsupported/Eigen/src/NonLinearOptimization/fdjac1.h
+++ b/unsupported/Eigen/src/NonLinearOptimization/fdjac1.h
@@ -1,82 +1,73 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
-template<typename FunctorType, typename Scalar>
-DenseIndex fdjac1(
-        const FunctorType &Functor,
-        Matrix< Scalar, Dynamic, 1 >  &x,
-        Matrix< Scalar, Dynamic, 1 >  &fvec,
-        Matrix< Scalar, Dynamic, Dynamic > &fjac,
-        DenseIndex ml, DenseIndex mu,
-        Scalar epsfcn)
-{
-    using std::sqrt;
-    using std::abs;
-    
-    typedef DenseIndex Index;
+template <typename FunctorType, typename Scalar>
+DenseIndex fdjac1(const FunctorType &Functor, Matrix<Scalar, Dynamic, 1> &x, Matrix<Scalar, Dynamic, 1> &fvec,
+                  Matrix<Scalar, Dynamic, Dynamic> &fjac, DenseIndex ml, DenseIndex mu, Scalar epsfcn) {
+  using std::abs;
+  using std::sqrt;
 
-    /* Local variables */
-    Scalar h;
-    Index j, k;
-    Scalar eps, temp;
-    Index msum;
-    int iflag;
-    Index start, length;
+  typedef DenseIndex Index;
 
-    /* Function Body */
-    const Scalar epsmch = NumTraits<Scalar>::epsilon();
-    const Index n = x.size();
-    eigen_assert(fvec.size()==n);
-    Matrix< Scalar, Dynamic, 1 >  wa1(n);
-    Matrix< Scalar, Dynamic, 1 >  wa2(n);
+  /* Local variables */
+  Scalar h;
+  Index j, k;
+  Scalar eps, temp;
+  Index msum;
+  int iflag;
+  Index start, length;
 
-    eps = sqrt((std::max)(epsfcn,epsmch));
-    msum = ml + mu + 1;
-    if (msum >= n) {
-        /* computation of dense approximate jacobian. */
-        for (j = 0; j < n; ++j) {
-            temp = x[j];
-            h = eps * abs(temp);
-            if (h == 0.)
-                h = eps;
-            x[j] = temp + h;
-            iflag = Functor(x, wa1);
-            if (iflag < 0)
-                return iflag;
-            x[j] = temp;
-            fjac.col(j) = (wa1-fvec)/h;
-        }
+  /* Function Body */
+  const Scalar epsmch = NumTraits<Scalar>::epsilon();
+  const Index n = x.size();
+  eigen_assert(fvec.size() == n);
+  Matrix<Scalar, Dynamic, 1> wa1(n);
+  Matrix<Scalar, Dynamic, 1> wa2(n);
 
-    }else {
-        /* computation of banded approximate jacobian. */
-        for (k = 0; k < msum; ++k) {
-            for (j = k; (msum<0) ? (j>n): (j<n); j += msum) {
-                wa2[j] = x[j];
-                h = eps * abs(wa2[j]);
-                if (h == 0.) h = eps;
-                x[j] = wa2[j] + h;
-            }
-            iflag = Functor(x, wa1);
-            if (iflag < 0)
-                return iflag;
-            for (j = k; (msum<0) ? (j>n): (j<n); j += msum) {
-                x[j] = wa2[j];
-                h = eps * abs(wa2[j]);
-                if (h == 0.) h = eps;
-                fjac.col(j).setZero();
-                start = std::max<Index>(0,j-mu);
-                length = (std::min)(n-1, j+ml) - start + 1;
-                fjac.col(j).segment(start, length) = ( wa1.segment(start, length)-fvec.segment(start, length))/h;
-            }
-        }
+  eps = sqrt((std::max)(epsfcn, epsmch));
+  msum = ml + mu + 1;
+  if (msum >= n) {
+    /* computation of dense approximate jacobian. */
+    for (j = 0; j < n; ++j) {
+      temp = x[j];
+      h = eps * abs(temp);
+      if (h == 0.) h = eps;
+      x[j] = temp + h;
+      iflag = Functor(x, wa1);
+      if (iflag < 0) return iflag;
+      x[j] = temp;
+      fjac.col(j) = (wa1 - fvec) / h;
     }
-    return 0;
+
+  } else {
+    /* computation of banded approximate jacobian. */
+    for (k = 0; k < msum; ++k) {
+      for (j = k; (msum < 0) ? (j > n) : (j < n); j += msum) {
+        wa2[j] = x[j];
+        h = eps * abs(wa2[j]);
+        if (h == 0.) h = eps;
+        x[j] = wa2[j] + h;
+      }
+      iflag = Functor(x, wa1);
+      if (iflag < 0) return iflag;
+      for (j = k; (msum < 0) ? (j > n) : (j < n); j += msum) {
+        x[j] = wa2[j];
+        h = eps * abs(wa2[j]);
+        if (h == 0.) h = eps;
+        fjac.col(j).setZero();
+        start = std::max<Index>(0, j - mu);
+        length = (std::min)(n - 1, j + ml) - start + 1;
+        fjac.col(j).segment(start, length) = (wa1.segment(start, length) - fvec.segment(start, length)) / h;
+      }
+    }
+  }
+  return 0;
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
diff --git a/unsupported/Eigen/src/NonLinearOptimization/lmpar.h b/unsupported/Eigen/src/NonLinearOptimization/lmpar.h
index 4b8e034..1420201 100644
--- a/unsupported/Eigen/src/NonLinearOptimization/lmpar.h
+++ b/unsupported/Eigen/src/NonLinearOptimization/lmpar.h
@@ -1,301 +1,265 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
 template <typename Scalar>
-void lmpar(
-        Matrix< Scalar, Dynamic, Dynamic > &r,
-        const VectorXi &ipvt,
-        const Matrix< Scalar, Dynamic, 1 >  &diag,
-        const Matrix< Scalar, Dynamic, 1 >  &qtb,
-        Scalar delta,
-        Scalar &par,
-        Matrix< Scalar, Dynamic, 1 >  &x)
-{
-    using std::abs;
-    using std::sqrt;
-    typedef DenseIndex Index;
+void lmpar(Matrix<Scalar, Dynamic, Dynamic> &r, const VectorXi &ipvt, const Matrix<Scalar, Dynamic, 1> &diag,
+           const Matrix<Scalar, Dynamic, 1> &qtb, Scalar delta, Scalar &par, Matrix<Scalar, Dynamic, 1> &x) {
+  using std::abs;
+  using std::sqrt;
+  typedef DenseIndex Index;
 
-    /* Local variables */
-    Index i, j, l;
-    Scalar fp;
-    Scalar parc, parl;
-    Index iter;
-    Scalar temp, paru;
-    Scalar gnorm;
-    Scalar dxnorm;
+  /* Local variables */
+  Index i, j, l;
+  Scalar fp;
+  Scalar parc, parl;
+  Index iter;
+  Scalar temp, paru;
+  Scalar gnorm;
+  Scalar dxnorm;
 
+  /* Function Body */
+  const Scalar dwarf = (std::numeric_limits<Scalar>::min)();
+  const Index n = r.cols();
+  eigen_assert(n == diag.size());
+  eigen_assert(n == qtb.size());
+  eigen_assert(n == x.size());
 
-    /* Function Body */
-    const Scalar dwarf = (std::numeric_limits<Scalar>::min)();
-    const Index n = r.cols();
-    eigen_assert(n==diag.size());
-    eigen_assert(n==qtb.size());
-    eigen_assert(n==x.size());
+  Matrix<Scalar, Dynamic, 1> wa1, wa2;
 
-    Matrix< Scalar, Dynamic, 1 >  wa1, wa2;
+  /* compute and store in x the gauss-newton direction. if the */
+  /* jacobian is rank-deficient, obtain a least squares solution. */
+  Index nsing = n - 1;
+  wa1 = qtb;
+  for (j = 0; j < n; ++j) {
+    if (r(j, j) == 0. && nsing == n - 1) nsing = j - 1;
+    if (nsing < n - 1) wa1[j] = 0.;
+  }
+  for (j = nsing; j >= 0; --j) {
+    wa1[j] /= r(j, j);
+    temp = wa1[j];
+    for (i = 0; i < j; ++i) wa1[i] -= r(i, j) * temp;
+  }
 
-    /* compute and store in x the gauss-newton direction. if the */
-    /* jacobian is rank-deficient, obtain a least squares solution. */
-    Index nsing = n-1;
-    wa1 = qtb;
+  for (j = 0; j < n; ++j) x[ipvt[j]] = wa1[j];
+
+  /* initialize the iteration counter. */
+  /* evaluate the function at the origin, and test */
+  /* for acceptance of the gauss-newton direction. */
+  iter = 0;
+  wa2 = diag.cwiseProduct(x);
+  dxnorm = wa2.blueNorm();
+  fp = dxnorm - delta;
+  if (fp <= Scalar(0.1) * delta) {
+    par = 0;
+    return;
+  }
+
+  /* if the jacobian is not rank deficient, the newton */
+  /* step provides a lower bound, parl, for the zero of */
+  /* the function. otherwise set this bound to zero. */
+  parl = 0.;
+  if (nsing >= n - 1) {
     for (j = 0; j < n; ++j) {
-        if (r(j,j) == 0. && nsing == n-1)
-            nsing = j - 1;
-        if (nsing < n-1)
-            wa1[j] = 0.;
+      l = ipvt[j];
+      wa1[j] = diag[l] * (wa2[l] / dxnorm);
     }
-    for (j = nsing; j>=0; --j) {
-        wa1[j] /= r(j,j);
-        temp = wa1[j];
-        for (i = 0; i < j ; ++i)
-            wa1[i] -= r(i,j) * temp;
+    // it's actually a triangularView.solveInplace(), though in a weird
+    // way:
+    for (j = 0; j < n; ++j) {
+      Scalar sum = 0.;
+      for (i = 0; i < j; ++i) sum += r(i, j) * wa1[i];
+      wa1[j] = (wa1[j] - sum) / r(j, j);
     }
+    temp = wa1.blueNorm();
+    parl = fp / delta / temp / temp;
+  }
 
-    for (j = 0; j < n; ++j)
-        x[ipvt[j]] = wa1[j];
+  /* calculate an upper bound, paru, for the zero of the function. */
+  for (j = 0; j < n; ++j) wa1[j] = r.col(j).head(j + 1).dot(qtb.head(j + 1)) / diag[ipvt[j]];
 
-    /* initialize the iteration counter. */
-    /* evaluate the function at the origin, and test */
-    /* for acceptance of the gauss-newton direction. */
-    iter = 0;
+  gnorm = wa1.stableNorm();
+  paru = gnorm / delta;
+  if (paru == 0.) paru = dwarf / (std::min)(delta, Scalar(0.1));
+
+  /* if the input par lies outside of the interval (parl,paru), */
+  /* set par to the closer endpoint. */
+  par = (std::max)(par, parl);
+  par = (std::min)(par, paru);
+  if (par == 0.) par = gnorm / dxnorm;
+
+  /* beginning of an iteration. */
+  while (true) {
+    ++iter;
+
+    /* evaluate the function at the current value of par. */
+    if (par == 0.) par = (std::max)(dwarf, Scalar(.001) * paru); /* Computing MAX */
+    wa1 = sqrt(par) * diag;
+
+    Matrix<Scalar, Dynamic, 1> sdiag(n);
+    qrsolv<Scalar>(r, ipvt, wa1, qtb, x, sdiag);
+
     wa2 = diag.cwiseProduct(x);
     dxnorm = wa2.blueNorm();
+    temp = fp;
     fp = dxnorm - delta;
-    if (fp <= Scalar(0.1) * delta) {
-        par = 0;
-        return;
+
+    /* if the function is small enough, accept the current value */
+    /* of par. also test for the exceptional cases where parl */
+    /* is zero or the number of iterations has reached 10. */
+    if (abs(fp) <= Scalar(0.1) * delta || (parl == 0. && fp <= temp && temp < 0.) || iter == 10) break;
+
+    /* compute the newton correction. */
+    for (j = 0; j < n; ++j) {
+      l = ipvt[j];
+      wa1[j] = diag[l] * (wa2[l] / dxnorm);
     }
-
-    /* if the jacobian is not rank deficient, the newton */
-    /* step provides a lower bound, parl, for the zero of */
-    /* the function. otherwise set this bound to zero. */
-    parl = 0.;
-    if (nsing >= n-1) {
-        for (j = 0; j < n; ++j) {
-            l = ipvt[j];
-            wa1[j] = diag[l] * (wa2[l] / dxnorm);
-        }
-        // it's actually a triangularView.solveInplace(), though in a weird
-        // way:
-        for (j = 0; j < n; ++j) {
-            Scalar sum = 0.;
-            for (i = 0; i < j; ++i)
-                sum += r(i,j) * wa1[i];
-            wa1[j] = (wa1[j] - sum) / r(j,j);
-        }
-        temp = wa1.blueNorm();
-        parl = fp / delta / temp / temp;
+    for (j = 0; j < n; ++j) {
+      wa1[j] /= sdiag[j];
+      temp = wa1[j];
+      for (i = j + 1; i < n; ++i) wa1[i] -= r(i, j) * temp;
     }
+    temp = wa1.blueNorm();
+    parc = fp / delta / temp / temp;
 
-    /* calculate an upper bound, paru, for the zero of the function. */
-    for (j = 0; j < n; ++j)
-        wa1[j] = r.col(j).head(j+1).dot(qtb.head(j+1)) / diag[ipvt[j]];
+    /* depending on the sign of the function, update parl or paru. */
+    if (fp > 0.) parl = (std::max)(parl, par);
+    if (fp < 0.) paru = (std::min)(paru, par);
 
-    gnorm = wa1.stableNorm();
-    paru = gnorm / delta;
-    if (paru == 0.)
-        paru = dwarf / (std::min)(delta,Scalar(0.1));
+    /* compute an improved estimate for par. */
+    /* Computing MAX */
+    par = (std::max)(parl, par + parc);
 
-    /* if the input par lies outside of the interval (parl,paru), */
-    /* set par to the closer endpoint. */
-    par = (std::max)(par,parl);
-    par = (std::min)(par,paru);
-    if (par == 0.)
-        par = gnorm / dxnorm;
+    /* end of an iteration. */
+  }
 
-    /* beginning of an iteration. */
-    while (true) {
-        ++iter;
-
-        /* evaluate the function at the current value of par. */
-        if (par == 0.)
-            par = (std::max)(dwarf,Scalar(.001) * paru); /* Computing MAX */
-        wa1 = sqrt(par)* diag;
-
-        Matrix< Scalar, Dynamic, 1 > sdiag(n);
-        qrsolv<Scalar>(r, ipvt, wa1, qtb, x, sdiag);
-
-        wa2 = diag.cwiseProduct(x);
-        dxnorm = wa2.blueNorm();
-        temp = fp;
-        fp = dxnorm - delta;
-
-        /* if the function is small enough, accept the current value */
-        /* of par. also test for the exceptional cases where parl */
-        /* is zero or the number of iterations has reached 10. */
-        if (abs(fp) <= Scalar(0.1) * delta || (parl == 0. && fp <= temp && temp < 0.) || iter == 10)
-            break;
-
-        /* compute the newton correction. */
-        for (j = 0; j < n; ++j) {
-            l = ipvt[j];
-            wa1[j] = diag[l] * (wa2[l] / dxnorm);
-        }
-        for (j = 0; j < n; ++j) {
-            wa1[j] /= sdiag[j];
-            temp = wa1[j];
-            for (i = j+1; i < n; ++i)
-                wa1[i] -= r(i,j) * temp;
-        }
-        temp = wa1.blueNorm();
-        parc = fp / delta / temp / temp;
-
-        /* depending on the sign of the function, update parl or paru. */
-        if (fp > 0.)
-            parl = (std::max)(parl,par);
-        if (fp < 0.)
-            paru = (std::min)(paru,par);
-
-        /* compute an improved estimate for par. */
-        /* Computing MAX */
-        par = (std::max)(parl,par+parc);
-
-        /* end of an iteration. */
-    }
-
-    /* termination. */
-    if (iter == 0)
-        par = 0.;
-    return;
+  /* termination. */
+  if (iter == 0) par = 0.;
+  return;
 }
 
 template <typename Scalar>
-void lmpar2(
-        const ColPivHouseholderQR<Matrix< Scalar, Dynamic, Dynamic> > &qr,
-        const Matrix< Scalar, Dynamic, 1 >  &diag,
-        const Matrix< Scalar, Dynamic, 1 >  &qtb,
-        Scalar delta,
-        Scalar &par,
-        Matrix< Scalar, Dynamic, 1 >  &x)
+void lmpar2(const ColPivHouseholderQR<Matrix<Scalar, Dynamic, Dynamic> > &qr, const Matrix<Scalar, Dynamic, 1> &diag,
+            const Matrix<Scalar, Dynamic, 1> &qtb, Scalar delta, Scalar &par, Matrix<Scalar, Dynamic, 1> &x)
 
 {
-    using std::sqrt;
-    using std::abs;
-    typedef DenseIndex Index;
+  using std::abs;
+  using std::sqrt;
+  typedef DenseIndex Index;
 
-    /* Local variables */
-    Index j;
-    Scalar fp;
-    Scalar parc, parl;
-    Index iter;
-    Scalar temp, paru;
-    Scalar gnorm;
-    Scalar dxnorm;
+  /* Local variables */
+  Index j;
+  Scalar fp;
+  Scalar parc, parl;
+  Index iter;
+  Scalar temp, paru;
+  Scalar gnorm;
+  Scalar dxnorm;
 
+  /* Function Body */
+  const Scalar dwarf = (std::numeric_limits<Scalar>::min)();
+  const Index n = qr.matrixQR().cols();
+  eigen_assert(n == diag.size());
+  eigen_assert(n == qtb.size());
 
-    /* Function Body */
-    const Scalar dwarf = (std::numeric_limits<Scalar>::min)();
-    const Index n = qr.matrixQR().cols();
-    eigen_assert(n==diag.size());
-    eigen_assert(n==qtb.size());
+  Matrix<Scalar, Dynamic, 1> wa1, wa2;
 
-    Matrix< Scalar, Dynamic, 1 >  wa1, wa2;
+  /* compute and store in x the gauss-newton direction. if the */
+  /* jacobian is rank-deficient, obtain a least squares solution. */
 
-    /* compute and store in x the gauss-newton direction. if the */
-    /* jacobian is rank-deficient, obtain a least squares solution. */
+  //    const Index rank = qr.nonzeroPivots(); // exactly double(0.)
+  const Index rank = qr.rank();  // use a threshold
+  wa1 = qtb;
+  wa1.tail(n - rank).setZero();
+  qr.matrixQR().topLeftCorner(rank, rank).template triangularView<Upper>().solveInPlace(wa1.head(rank));
 
-//    const Index rank = qr.nonzeroPivots(); // exactly double(0.)
-    const Index rank = qr.rank(); // use a threshold
-    wa1 = qtb;
-    wa1.tail(n-rank).setZero();
-    qr.matrixQR().topLeftCorner(rank, rank).template triangularView<Upper>().solveInPlace(wa1.head(rank));
+  x = qr.colsPermutation() * wa1;
 
-    x = qr.colsPermutation()*wa1;
+  /* initialize the iteration counter. */
+  /* evaluate the function at the origin, and test */
+  /* for acceptance of the gauss-newton direction. */
+  iter = 0;
+  wa2 = diag.cwiseProduct(x);
+  dxnorm = wa2.blueNorm();
+  fp = dxnorm - delta;
+  if (fp <= Scalar(0.1) * delta) {
+    par = 0;
+    return;
+  }
 
-    /* initialize the iteration counter. */
-    /* evaluate the function at the origin, and test */
-    /* for acceptance of the gauss-newton direction. */
-    iter = 0;
+  /* if the jacobian is not rank deficient, the newton */
+  /* step provides a lower bound, parl, for the zero of */
+  /* the function. otherwise set this bound to zero. */
+  parl = 0.;
+  if (rank == n) {
+    wa1 = qr.colsPermutation().inverse() * diag.cwiseProduct(wa2) / dxnorm;
+    qr.matrixQR().topLeftCorner(n, n).transpose().template triangularView<Lower>().solveInPlace(wa1);
+    temp = wa1.blueNorm();
+    parl = fp / delta / temp / temp;
+  }
+
+  /* calculate an upper bound, paru, for the zero of the function. */
+  for (j = 0; j < n; ++j)
+    wa1[j] = qr.matrixQR().col(j).head(j + 1).dot(qtb.head(j + 1)) / diag[qr.colsPermutation().indices()(j)];
+
+  gnorm = wa1.stableNorm();
+  paru = gnorm / delta;
+  if (paru == 0.) paru = dwarf / (std::min)(delta, Scalar(0.1));
+
+  /* if the input par lies outside of the interval (parl,paru), */
+  /* set par to the closer endpoint. */
+  par = (std::max)(par, parl);
+  par = (std::min)(par, paru);
+  if (par == 0.) par = gnorm / dxnorm;
+
+  /* beginning of an iteration. */
+  Matrix<Scalar, Dynamic, Dynamic> s = qr.matrixQR();
+  while (true) {
+    ++iter;
+
+    /* evaluate the function at the current value of par. */
+    if (par == 0.) par = (std::max)(dwarf, Scalar(.001) * paru); /* Computing MAX */
+    wa1 = sqrt(par) * diag;
+
+    Matrix<Scalar, Dynamic, 1> sdiag(n);
+    qrsolv<Scalar>(s, qr.colsPermutation().indices(), wa1, qtb, x, sdiag);
+
     wa2 = diag.cwiseProduct(x);
     dxnorm = wa2.blueNorm();
+    temp = fp;
     fp = dxnorm - delta;
-    if (fp <= Scalar(0.1) * delta) {
-        par = 0;
-        return;
+
+    /* if the function is small enough, accept the current value */
+    /* of par. also test for the exceptional cases where parl */
+    /* is zero or the number of iterations has reached 10. */
+    if (abs(fp) <= Scalar(0.1) * delta || (parl == 0. && fp <= temp && temp < 0.) || iter == 10) break;
+
+    /* compute the newton correction. */
+    wa1 = qr.colsPermutation().inverse() * diag.cwiseProduct(wa2 / dxnorm);
+    // we could almost use this here, but the diagonal is outside qr, in sdiag[]
+    // qr.matrixQR().topLeftCorner(n, n).transpose().template triangularView<Lower>().solveInPlace(wa1);
+    for (j = 0; j < n; ++j) {
+      wa1[j] /= sdiag[j];
+      temp = wa1[j];
+      for (Index i = j + 1; i < n; ++i) wa1[i] -= s(i, j) * temp;
     }
+    temp = wa1.blueNorm();
+    parc = fp / delta / temp / temp;
 
-    /* if the jacobian is not rank deficient, the newton */
-    /* step provides a lower bound, parl, for the zero of */
-    /* the function. otherwise set this bound to zero. */
-    parl = 0.;
-    if (rank==n) {
-        wa1 = qr.colsPermutation().inverse() *  diag.cwiseProduct(wa2)/dxnorm;
-        qr.matrixQR().topLeftCorner(n, n).transpose().template triangularView<Lower>().solveInPlace(wa1);
-        temp = wa1.blueNorm();
-        parl = fp / delta / temp / temp;
-    }
+    /* depending on the sign of the function, update parl or paru. */
+    if (fp > 0.) parl = (std::max)(parl, par);
+    if (fp < 0.) paru = (std::min)(paru, par);
 
-    /* calculate an upper bound, paru, for the zero of the function. */
-    for (j = 0; j < n; ++j)
-        wa1[j] = qr.matrixQR().col(j).head(j+1).dot(qtb.head(j+1)) / diag[qr.colsPermutation().indices()(j)];
-
-    gnorm = wa1.stableNorm();
-    paru = gnorm / delta;
-    if (paru == 0.)
-        paru = dwarf / (std::min)(delta,Scalar(0.1));
-
-    /* if the input par lies outside of the interval (parl,paru), */
-    /* set par to the closer endpoint. */
-    par = (std::max)(par,parl);
-    par = (std::min)(par,paru);
-    if (par == 0.)
-        par = gnorm / dxnorm;
-
-    /* beginning of an iteration. */
-    Matrix< Scalar, Dynamic, Dynamic > s = qr.matrixQR();
-    while (true) {
-        ++iter;
-
-        /* evaluate the function at the current value of par. */
-        if (par == 0.)
-            par = (std::max)(dwarf,Scalar(.001) * paru); /* Computing MAX */
-        wa1 = sqrt(par)* diag;
-
-        Matrix< Scalar, Dynamic, 1 > sdiag(n);
-        qrsolv<Scalar>(s, qr.colsPermutation().indices(), wa1, qtb, x, sdiag);
-
-        wa2 = diag.cwiseProduct(x);
-        dxnorm = wa2.blueNorm();
-        temp = fp;
-        fp = dxnorm - delta;
-
-        /* if the function is small enough, accept the current value */
-        /* of par. also test for the exceptional cases where parl */
-        /* is zero or the number of iterations has reached 10. */
-        if (abs(fp) <= Scalar(0.1) * delta || (parl == 0. && fp <= temp && temp < 0.) || iter == 10)
-            break;
-
-        /* compute the newton correction. */
-        wa1 = qr.colsPermutation().inverse() * diag.cwiseProduct(wa2/dxnorm);
-        // we could almost use this here, but the diagonal is outside qr, in sdiag[]
-        // qr.matrixQR().topLeftCorner(n, n).transpose().template triangularView<Lower>().solveInPlace(wa1);
-        for (j = 0; j < n; ++j) {
-            wa1[j] /= sdiag[j];
-            temp = wa1[j];
-            for (Index i = j+1; i < n; ++i)
-                wa1[i] -= s(i,j) * temp;
-        }
-        temp = wa1.blueNorm();
-        parc = fp / delta / temp / temp;
-
-        /* depending on the sign of the function, update parl or paru. */
-        if (fp > 0.)
-            parl = (std::max)(parl,par);
-        if (fp < 0.)
-            paru = (std::min)(paru,par);
-
-        /* compute an improved estimate for par. */
-        par = (std::max)(parl,par+parc);
-    }
-    if (iter == 0)
-        par = 0.;
-    return;
+    /* compute an improved estimate for par. */
+    par = (std::max)(parl, par + parc);
+  }
+  if (iter == 0) par = 0.;
+  return;
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
diff --git a/unsupported/Eigen/src/NonLinearOptimization/qrsolv.h b/unsupported/Eigen/src/NonLinearOptimization/qrsolv.h
index 2b1ce0b..2e4d036 100644
--- a/unsupported/Eigen/src/NonLinearOptimization/qrsolv.h
+++ b/unsupported/Eigen/src/NonLinearOptimization/qrsolv.h
@@ -1,94 +1,89 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
 // TODO : once qrsolv2 is removed, use ColPivHouseholderQR or PermutationMatrix instead of ipvt
 template <typename Scalar>
-void qrsolv(
-        Matrix< Scalar, Dynamic, Dynamic > &s,
-        // TODO : use a PermutationMatrix once lmpar is no more:
-        const VectorXi &ipvt,
-        const Matrix< Scalar, Dynamic, 1 >  &diag,
-        const Matrix< Scalar, Dynamic, 1 >  &qtb,
-        Matrix< Scalar, Dynamic, 1 >  &x,
-        Matrix< Scalar, Dynamic, 1 >  &sdiag)
+void qrsolv(Matrix<Scalar, Dynamic, Dynamic> &s,
+            // TODO : use a PermutationMatrix once lmpar is no more:
+            const VectorXi &ipvt, const Matrix<Scalar, Dynamic, 1> &diag, const Matrix<Scalar, Dynamic, 1> &qtb,
+            Matrix<Scalar, Dynamic, 1> &x, Matrix<Scalar, Dynamic, 1> &sdiag)
 
 {
-    typedef DenseIndex Index;
+  typedef DenseIndex Index;
 
-    /* Local variables */
-    Index i, j, k, l;
-    Scalar temp;
-    Index n = s.cols();
-    Matrix< Scalar, Dynamic, 1 >  wa(n);
-    JacobiRotation<Scalar> givens;
+  /* Local variables */
+  Index i, j, k, l;
+  Scalar temp;
+  Index n = s.cols();
+  Matrix<Scalar, Dynamic, 1> wa(n);
+  JacobiRotation<Scalar> givens;
 
-    /* Function Body */
-    // the following will only change the lower triangular part of s, including
-    // the diagonal, though the diagonal is restored afterward
+  /* Function Body */
+  // the following will only change the lower triangular part of s, including
+  // the diagonal, though the diagonal is restored afterward
 
-    /*     copy r and (q transpose)*b to preserve input and initialize s. */
-    /*     in particular, save the diagonal elements of r in x. */
-    x = s.diagonal();
-    wa = qtb;
+  /*     copy r and (q transpose)*b to preserve input and initialize s. */
+  /*     in particular, save the diagonal elements of r in x. */
+  x = s.diagonal();
+  wa = qtb;
 
-    s.topLeftCorner(n,n).template triangularView<StrictlyLower>() = s.topLeftCorner(n,n).transpose();
+  s.topLeftCorner(n, n).template triangularView<StrictlyLower>() = s.topLeftCorner(n, n).transpose();
 
-    /*     eliminate the diagonal matrix d using a givens rotation. */
-    for (j = 0; j < n; ++j) {
+  /*     eliminate the diagonal matrix d using a givens rotation. */
+  for (j = 0; j < n; ++j) {
+    /*        prepare the row of d to be eliminated, locating the */
+    /*        diagonal element using p from the qr factorization. */
+    l = ipvt[j];
+    if (diag[l] == 0.) break;
+    sdiag.tail(n - j).setZero();
+    sdiag[j] = diag[l];
 
-        /*        prepare the row of d to be eliminated, locating the */
-        /*        diagonal element using p from the qr factorization. */
-        l = ipvt[j];
-        if (diag[l] == 0.)
-            break;
-        sdiag.tail(n-j).setZero();
-        sdiag[j] = diag[l];
+    /*        the transformations to eliminate the row of d */
+    /*        modify only a single element of (q transpose)*b */
+    /*        beyond the first n, which is initially zero. */
+    Scalar qtbpj = 0.;
+    for (k = j; k < n; ++k) {
+      /*           determine a givens rotation which eliminates the */
+      /*           appropriate element in the current row of d. */
+      givens.makeGivens(-s(k, k), sdiag[k]);
 
-        /*        the transformations to eliminate the row of d */
-        /*        modify only a single element of (q transpose)*b */
-        /*        beyond the first n, which is initially zero. */
-        Scalar qtbpj = 0.;
-        for (k = j; k < n; ++k) {
-            /*           determine a givens rotation which eliminates the */
-            /*           appropriate element in the current row of d. */
-            givens.makeGivens(-s(k,k), sdiag[k]);
+      /*           compute the modified diagonal element of r and */
+      /*           the modified element of ((q transpose)*b,0). */
+      s(k, k) = givens.c() * s(k, k) + givens.s() * sdiag[k];
+      temp = givens.c() * wa[k] + givens.s() * qtbpj;
+      qtbpj = -givens.s() * wa[k] + givens.c() * qtbpj;
+      wa[k] = temp;
 
-            /*           compute the modified diagonal element of r and */
-            /*           the modified element of ((q transpose)*b,0). */
-            s(k,k) = givens.c() * s(k,k) + givens.s() * sdiag[k];
-            temp = givens.c() * wa[k] + givens.s() * qtbpj;
-            qtbpj = -givens.s() * wa[k] + givens.c() * qtbpj;
-            wa[k] = temp;
-
-            /*           accumulate the transformation in the row of s. */
-            for (i = k+1; i<n; ++i) {
-                temp = givens.c() * s(i,k) + givens.s() * sdiag[i];
-                sdiag[i] = -givens.s() * s(i,k) + givens.c() * sdiag[i];
-                s(i,k) = temp;
-            }
-        }
+      /*           accumulate the transformation in the row of s. */
+      for (i = k + 1; i < n; ++i) {
+        temp = givens.c() * s(i, k) + givens.s() * sdiag[i];
+        sdiag[i] = -givens.s() * s(i, k) + givens.c() * sdiag[i];
+        s(i, k) = temp;
+      }
     }
+  }
 
-    /*     solve the triangular system for z. if the system is */
-    /*     singular, then obtain a least squares solution. */
-    Index nsing;
-    for(nsing=0; nsing<n && sdiag[nsing]!=0; nsing++) {}
+  /*     solve the triangular system for z. if the system is */
+  /*     singular, then obtain a least squares solution. */
+  Index nsing;
+  for (nsing = 0; nsing < n && sdiag[nsing] != 0; nsing++) {
+  }
 
-    wa.tail(n-nsing).setZero();
-    s.topLeftCorner(nsing, nsing).transpose().template triangularView<Upper>().solveInPlace(wa.head(nsing));
+  wa.tail(n - nsing).setZero();
+  s.topLeftCorner(nsing, nsing).transpose().template triangularView<Upper>().solveInPlace(wa.head(nsing));
 
-    // restore
-    sdiag = s.diagonal();
-    s.diagonal() = x;
+  // restore
+  sdiag = s.diagonal();
+  s.diagonal() = x;
 
-    /*     permute the components of z back to components of x. */
-    for (j = 0; j < n; ++j) x[ipvt[j]] = wa[j];
+  /*     permute the components of z back to components of x. */
+  for (j = 0; j < n; ++j) x[ipvt[j]] = wa[j];
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
diff --git a/unsupported/Eigen/src/NonLinearOptimization/r1mpyq.h b/unsupported/Eigen/src/NonLinearOptimization/r1mpyq.h
index 9ea149f..ea41315 100644
--- a/unsupported/Eigen/src/NonLinearOptimization/r1mpyq.h
+++ b/unsupported/Eigen/src/NonLinearOptimization/r1mpyq.h
@@ -1,33 +1,33 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
 // TODO : move this to GivensQR once there's such a thing in Eigen
 
 template <typename Scalar>
-void r1mpyq(DenseIndex m, DenseIndex n, Scalar *a, const std::vector<JacobiRotation<Scalar> > &v_givens, const std::vector<JacobiRotation<Scalar> > &w_givens)
-{
-    typedef DenseIndex Index;
+void r1mpyq(DenseIndex m, DenseIndex n, Scalar *a, const std::vector<JacobiRotation<Scalar> > &v_givens,
+            const std::vector<JacobiRotation<Scalar> > &w_givens) {
+  typedef DenseIndex Index;
 
-    /*     apply the first set of givens rotations to a. */
-    for (Index j = n-2; j>=0; --j)
-        for (Index i = 0; i<m; ++i) {
-            Scalar temp = v_givens[j].c() * a[i+m*j] - v_givens[j].s() * a[i+m*(n-1)];
-            a[i+m*(n-1)] = v_givens[j].s() * a[i+m*j] + v_givens[j].c() * a[i+m*(n-1)];
-            a[i+m*j] = temp;
-        }
-    /*     apply the second set of givens rotations to a. */
-    for (Index j = 0; j<n-1; ++j)
-        for (Index i = 0; i<m; ++i) {
-            Scalar temp = w_givens[j].c() * a[i+m*j] + w_givens[j].s() * a[i+m*(n-1)];
-            a[i+m*(n-1)] = -w_givens[j].s() * a[i+m*j] + w_givens[j].c() * a[i+m*(n-1)];
-            a[i+m*j] = temp;
-        }
+  /*     apply the first set of givens rotations to a. */
+  for (Index j = n - 2; j >= 0; --j)
+    for (Index i = 0; i < m; ++i) {
+      Scalar temp = v_givens[j].c() * a[i + m * j] - v_givens[j].s() * a[i + m * (n - 1)];
+      a[i + m * (n - 1)] = v_givens[j].s() * a[i + m * j] + v_givens[j].c() * a[i + m * (n - 1)];
+      a[i + m * j] = temp;
+    }
+  /*     apply the second set of givens rotations to a. */
+  for (Index j = 0; j < n - 1; ++j)
+    for (Index i = 0; i < m; ++i) {
+      Scalar temp = w_givens[j].c() * a[i + m * j] + w_givens[j].s() * a[i + m * (n - 1)];
+      a[i + m * (n - 1)] = -w_givens[j].s() * a[i + m * j] + w_givens[j].c() * a[i + m * (n - 1)];
+      a[i + m * j] = temp;
+    }
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
diff --git a/unsupported/Eigen/src/NonLinearOptimization/r1updt.h b/unsupported/Eigen/src/NonLinearOptimization/r1updt.h
index ee0b87a..4bf7ee5 100644
--- a/unsupported/Eigen/src/NonLinearOptimization/r1updt.h
+++ b/unsupported/Eigen/src/NonLinearOptimization/r1updt.h
@@ -1,102 +1,96 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
 template <typename Scalar>
-void r1updt(
-        Matrix< Scalar, Dynamic, Dynamic > &s,
-        const Matrix< Scalar, Dynamic, 1> &u,
-        std::vector<JacobiRotation<Scalar> > &v_givens,
-        std::vector<JacobiRotation<Scalar> > &w_givens,
-        Matrix< Scalar, Dynamic, 1> &v,
-        Matrix< Scalar, Dynamic, 1> &w,
-        bool *sing)
-{
-    typedef DenseIndex Index;
-    const JacobiRotation<Scalar> IdentityRotation = JacobiRotation<Scalar>(1,0);
+void r1updt(Matrix<Scalar, Dynamic, Dynamic> &s, const Matrix<Scalar, Dynamic, 1> &u,
+            std::vector<JacobiRotation<Scalar> > &v_givens, std::vector<JacobiRotation<Scalar> > &w_givens,
+            Matrix<Scalar, Dynamic, 1> &v, Matrix<Scalar, Dynamic, 1> &w, bool *sing) {
+  typedef DenseIndex Index;
+  const JacobiRotation<Scalar> IdentityRotation = JacobiRotation<Scalar>(1, 0);
 
-    /* Local variables */
-    const Index m = s.rows();
-    const Index n = s.cols();
-    Index i, j=1;
-    Scalar temp;
-    JacobiRotation<Scalar> givens;
+  /* Local variables */
+  const Index m = s.rows();
+  const Index n = s.cols();
+  Index i, j = 1;
+  Scalar temp;
+  JacobiRotation<Scalar> givens;
 
-    // r1updt had a broader usecase, but we don't use it here. And, more
-    // importantly, we can not test it.
-    eigen_assert(m==n);
-    eigen_assert(u.size()==m);
-    eigen_assert(v.size()==n);
-    eigen_assert(w.size()==n);
+  // r1updt had a broader usecase, but we don't use it here. And, more
+  // importantly, we can not test it.
+  eigen_assert(m == n);
+  eigen_assert(u.size() == m);
+  eigen_assert(v.size() == n);
+  eigen_assert(w.size() == n);
 
-    /* move the nontrivial part of the last column of s into w. */
-    w[n-1] = s(n-1,n-1);
+  /* move the nontrivial part of the last column of s into w. */
+  w[n - 1] = s(n - 1, n - 1);
 
-    /* rotate the vector v into a multiple of the n-th unit vector */
-    /* in such a way that a spike is introduced into w. */
-    for (j=n-2; j>=0; --j) {
-        w[j] = 0.;
-        if (v[j] != 0.) {
-            /* determine a givens rotation which eliminates the */
-            /* j-th element of v. */
-            givens.makeGivens(-v[n-1], v[j]);
+  /* rotate the vector v into a multiple of the n-th unit vector */
+  /* in such a way that a spike is introduced into w. */
+  for (j = n - 2; j >= 0; --j) {
+    w[j] = 0.;
+    if (v[j] != 0.) {
+      /* determine a givens rotation which eliminates the */
+      /* j-th element of v. */
+      givens.makeGivens(-v[n - 1], v[j]);
 
-            /* apply the transformation to v and store the information */
-            /* necessary to recover the givens rotation. */
-            v[n-1] = givens.s() * v[j] + givens.c() * v[n-1];
-            v_givens[j] = givens;
+      /* apply the transformation to v and store the information */
+      /* necessary to recover the givens rotation. */
+      v[n - 1] = givens.s() * v[j] + givens.c() * v[n - 1];
+      v_givens[j] = givens;
 
-            /* apply the transformation to s and extend the spike in w. */
-            for (i = j; i < m; ++i) {
-                temp = givens.c() * s(j,i) - givens.s() * w[i];
-                w[i] = givens.s() * s(j,i) + givens.c() * w[i];
-                s(j,i) = temp;
-            }
-        } else
-            v_givens[j] = IdentityRotation;
+      /* apply the transformation to s and extend the spike in w. */
+      for (i = j; i < m; ++i) {
+        temp = givens.c() * s(j, i) - givens.s() * w[i];
+        w[i] = givens.s() * s(j, i) + givens.c() * w[i];
+        s(j, i) = temp;
+      }
+    } else
+      v_givens[j] = IdentityRotation;
+  }
+
+  /* add the spike from the rank 1 update to w. */
+  w += v[n - 1] * u;
+
+  /* eliminate the spike. */
+  *sing = false;
+  for (j = 0; j < n - 1; ++j) {
+    if (w[j] != 0.) {
+      /* determine a givens rotation which eliminates the */
+      /* j-th element of the spike. */
+      givens.makeGivens(-s(j, j), w[j]);
+
+      /* apply the transformation to s and reduce the spike in w. */
+      for (i = j; i < m; ++i) {
+        temp = givens.c() * s(j, i) + givens.s() * w[i];
+        w[i] = -givens.s() * s(j, i) + givens.c() * w[i];
+        s(j, i) = temp;
+      }
+
+      /* store the information necessary to recover the */
+      /* givens rotation. */
+      w_givens[j] = givens;
+    } else
+      v_givens[j] = IdentityRotation;
+
+    /* test for zero diagonal elements in the output s. */
+    if (s(j, j) == 0.) {
+      *sing = true;
     }
+  }
+  /* move w back into the last column of the output s. */
+  s(n - 1, n - 1) = w[n - 1];
 
-    /* add the spike from the rank 1 update to w. */
-    w += v[n-1] * u;
-
-    /* eliminate the spike. */
-    *sing = false;
-    for (j = 0; j < n-1; ++j) {
-        if (w[j] != 0.) {
-            /* determine a givens rotation which eliminates the */
-            /* j-th element of the spike. */
-            givens.makeGivens(-s(j,j), w[j]);
-
-            /* apply the transformation to s and reduce the spike in w. */
-            for (i = j; i < m; ++i) {
-                temp = givens.c() * s(j,i) + givens.s() * w[i];
-                w[i] = -givens.s() * s(j,i) + givens.c() * w[i];
-                s(j,i) = temp;
-            }
-
-            /* store the information necessary to recover the */
-            /* givens rotation. */
-            w_givens[j] = givens;
-        } else
-            v_givens[j] = IdentityRotation;
-
-        /* test for zero diagonal elements in the output s. */
-        if (s(j,j) == 0.) {
-            *sing = true;
-        }
-    }
-    /* move w back into the last column of the output s. */
-    s(n-1,n-1) = w[n-1];
-
-    if (s(j,j) == 0.) {
-        *sing = true;
-    }
-    return;
+  if (s(j, j) == 0.) {
+    *sing = true;
+  }
+  return;
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
diff --git a/unsupported/Eigen/src/NonLinearOptimization/rwupdt.h b/unsupported/Eigen/src/NonLinearOptimization/rwupdt.h
index 88011fc..8ae5848 100644
--- a/unsupported/Eigen/src/NonLinearOptimization/rwupdt.h
+++ b/unsupported/Eigen/src/NonLinearOptimization/rwupdt.h
@@ -1,52 +1,47 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
 template <typename Scalar>
-void rwupdt(
-        Matrix< Scalar, Dynamic, Dynamic >  &r,
-        const Matrix< Scalar, Dynamic, 1>  &w,
-        Matrix< Scalar, Dynamic, 1>  &b,
-        Scalar alpha)
-{
-    typedef DenseIndex Index;
+void rwupdt(Matrix<Scalar, Dynamic, Dynamic> &r, const Matrix<Scalar, Dynamic, 1> &w, Matrix<Scalar, Dynamic, 1> &b,
+            Scalar alpha) {
+  typedef DenseIndex Index;
 
-    const Index n = r.cols();
-    eigen_assert(r.rows()>=n);
-    std::vector<JacobiRotation<Scalar> > givens(n);
+  const Index n = r.cols();
+  eigen_assert(r.rows() >= n);
+  std::vector<JacobiRotation<Scalar> > givens(n);
 
-    /* Local variables */
-    Scalar temp, rowj;
+  /* Local variables */
+  Scalar temp, rowj;
 
-    /* Function Body */
-    for (Index j = 0; j < n; ++j) {
-        rowj = w[j];
+  /* Function Body */
+  for (Index j = 0; j < n; ++j) {
+    rowj = w[j];
 
-        /* apply the previous transformations to */
-        /* r(i,j), i=0,1,...,j-1, and to w(j). */
-        for (Index i = 0; i < j; ++i) {
-            temp = givens[i].c() * r(i,j) + givens[i].s() * rowj;
-            rowj = -givens[i].s() * r(i,j) + givens[i].c() * rowj;
-            r(i,j) = temp;
-        }
-
-        /* determine a givens rotation which eliminates w(j). */
-        givens[j].makeGivens(-r(j,j), rowj);
-
-        if (rowj == 0.)
-            continue; // givens[j] is identity
-
-        /* apply the current transformation to r(j,j), b(j), and alpha. */
-        r(j,j) = givens[j].c() * r(j,j) + givens[j].s() * rowj;
-        temp = givens[j].c() * b[j] + givens[j].s() * alpha;
-        alpha = -givens[j].s() * b[j] + givens[j].c() * alpha;
-        b[j] = temp;
+    /* apply the previous transformations to */
+    /* r(i,j), i=0,1,...,j-1, and to w(j). */
+    for (Index i = 0; i < j; ++i) {
+      temp = givens[i].c() * r(i, j) + givens[i].s() * rowj;
+      rowj = -givens[i].s() * r(i, j) + givens[i].c() * rowj;
+      r(i, j) = temp;
     }
+
+    /* determine a givens rotation which eliminates w(j). */
+    givens[j].makeGivens(-r(j, j), rowj);
+
+    if (rowj == 0.) continue;  // givens[j] is identity
+
+    /* apply the current transformation to r(j,j), b(j), and alpha. */
+    r(j, j) = givens[j].c() * r(j, j) + givens[j].s() * rowj;
+    temp = givens[j].c() * b[j] + givens[j].s() * alpha;
+    alpha = -givens[j].s() * b[j] + givens[j].c() * alpha;
+    b[j] = temp;
+  }
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
diff --git a/unsupported/Eigen/src/NumericalDiff/NumericalDiff.h b/unsupported/Eigen/src/NumericalDiff/NumericalDiff.h
index 85acaa2..1f55263 100644
--- a/unsupported/Eigen/src/NumericalDiff/NumericalDiff.h
+++ b/unsupported/Eigen/src/NumericalDiff/NumericalDiff.h
@@ -16,118 +16,112 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
-enum NumericalDiffMode {
-    Forward,
-    Central
-};
-
+enum NumericalDiffMode { Forward, Central };
 
 /**
-  * This class allows you to add a method df() to your functor, which will 
-  * use numerical differentiation to compute an approximate of the
-  * derivative for the functor. Of course, if you have an analytical form
-  * for the derivative, you should rather implement df() by yourself.
-  *
-  * More information on
-  * http://en.wikipedia.org/wiki/Numerical_differentiation
-  *
-  * Currently only "Forward" and "Central" scheme are implemented.
-  */
-template<typename Functor_, NumericalDiffMode mode=Forward>
-class NumericalDiff : public Functor_
-{
-public:
-    typedef Functor_ Functor;
-    typedef typename Functor::Scalar Scalar;
-    typedef typename Functor::InputType InputType;
-    typedef typename Functor::ValueType ValueType;
-    typedef typename Functor::JacobianType JacobianType;
+ * This class allows you to add a method df() to your functor, which will
+ * use numerical differentiation to compute an approximate of the
+ * derivative for the functor. Of course, if you have an analytical form
+ * for the derivative, you should rather implement df() by yourself.
+ *
+ * More information on
+ * http://en.wikipedia.org/wiki/Numerical_differentiation
+ *
+ * Currently only "Forward" and "Central" scheme are implemented.
+ */
+template <typename Functor_, NumericalDiffMode mode = Forward>
+class NumericalDiff : public Functor_ {
+ public:
+  typedef Functor_ Functor;
+  typedef typename Functor::Scalar Scalar;
+  typedef typename Functor::InputType InputType;
+  typedef typename Functor::ValueType ValueType;
+  typedef typename Functor::JacobianType JacobianType;
 
-    NumericalDiff(Scalar _epsfcn=0.) : Functor(), epsfcn(_epsfcn) {}
-    NumericalDiff(const Functor& f, Scalar _epsfcn=0.) : Functor(f), epsfcn(_epsfcn) {}
+  NumericalDiff(Scalar _epsfcn = 0.) : Functor(), epsfcn(_epsfcn) {}
+  NumericalDiff(const Functor& f, Scalar _epsfcn = 0.) : Functor(f), epsfcn(_epsfcn) {}
 
-    // forward constructors
-    template<typename T0>
-        NumericalDiff(const T0& a0) : Functor(a0), epsfcn(0) {}
-    template<typename T0, typename T1>
-        NumericalDiff(const T0& a0, const T1& a1) : Functor(a0, a1), epsfcn(0) {}
-    template<typename T0, typename T1, typename T2>
-        NumericalDiff(const T0& a0, const T1& a1, const T2& a2) : Functor(a0, a1, a2), epsfcn(0) {}
+  // forward constructors
+  template <typename T0>
+  NumericalDiff(const T0& a0) : Functor(a0), epsfcn(0) {}
+  template <typename T0, typename T1>
+  NumericalDiff(const T0& a0, const T1& a1) : Functor(a0, a1), epsfcn(0) {}
+  template <typename T0, typename T1, typename T2>
+  NumericalDiff(const T0& a0, const T1& a1, const T2& a2) : Functor(a0, a1, a2), epsfcn(0) {}
 
-    enum {
-        InputsAtCompileTime = Functor::InputsAtCompileTime,
-        ValuesAtCompileTime = Functor::ValuesAtCompileTime
+  enum { InputsAtCompileTime = Functor::InputsAtCompileTime, ValuesAtCompileTime = Functor::ValuesAtCompileTime };
+
+  /**
+   * return the number of evaluation of functor
+   */
+  int df(const InputType& _x, JacobianType& jac) const {
+    using std::abs;
+    using std::sqrt;
+    /* Local variables */
+    Scalar h;
+    int nfev = 0;
+    const typename InputType::Index n = _x.size();
+    const Scalar eps = sqrt(((std::max)(epsfcn, NumTraits<Scalar>::epsilon())));
+    ValueType val1, val2;
+    InputType x = _x;
+    // TODO : we should do this only if the size is not already known
+    val1.resize(Functor::values());
+    val2.resize(Functor::values());
+
+    // initialization
+    switch (mode) {
+      case Forward:
+        // compute f(x)
+        Functor::operator()(x, val1);
+        nfev++;
+        break;
+      case Central:
+        // do nothing
+        break;
+      default:
+        eigen_assert(false);
     };
 
-    /**
-      * return the number of evaluation of functor
-     */
-    int df(const InputType& _x, JacobianType &jac) const
-    {
-        using std::sqrt;
-        using std::abs;
-        /* Local variables */
-        Scalar h;
-        int nfev=0;
-        const typename InputType::Index n = _x.size();
-        const Scalar eps = sqrt(((std::max)(epsfcn,NumTraits<Scalar>::epsilon() )));
-        ValueType val1, val2;
-        InputType x = _x;
-        // TODO : we should do this only if the size is not already known
-        val1.resize(Functor::values());
-        val2.resize(Functor::values());
-
-        // initialization
-        switch(mode) {
-            case Forward:
-                // compute f(x)
-                Functor::operator()(x, val1); nfev++;
-                break;
-            case Central:
-                // do nothing
-                break;
-            default:
-                eigen_assert(false);
-        };
-
-        // Function Body
-        for (int j = 0; j < n; ++j) {
-            h = eps * abs(x[j]);
-            if (h == 0.) {
-                h = eps;
-            }
-            switch(mode) {
-                case Forward:
-                    x[j] += h;
-                    Functor::operator()(x, val2);
-                    nfev++;
-                    x[j] = _x[j];
-                    jac.col(j) = (val2-val1)/h;
-                    break;
-                case Central:
-                    x[j] += h;
-                    Functor::operator()(x, val2); nfev++;
-                    x[j] -= 2*h;
-                    Functor::operator()(x, val1); nfev++;
-                    x[j] = _x[j];
-                    jac.col(j) = (val2-val1)/(2*h);
-                    break;
-                default:
-                    eigen_assert(false);
-            };
-        }
-        return nfev;
+    // Function Body
+    for (int j = 0; j < n; ++j) {
+      h = eps * abs(x[j]);
+      if (h == 0.) {
+        h = eps;
+      }
+      switch (mode) {
+        case Forward:
+          x[j] += h;
+          Functor::operator()(x, val2);
+          nfev++;
+          x[j] = _x[j];
+          jac.col(j) = (val2 - val1) / h;
+          break;
+        case Central:
+          x[j] += h;
+          Functor::operator()(x, val2);
+          nfev++;
+          x[j] -= 2 * h;
+          Functor::operator()(x, val1);
+          nfev++;
+          x[j] = _x[j];
+          jac.col(j) = (val2 - val1) / (2 * h);
+          break;
+        default:
+          eigen_assert(false);
+      };
     }
-private:
-    Scalar epsfcn;
+    return nfev;
+  }
 
-    NumericalDiff& operator=(const NumericalDiff&);
+ private:
+  Scalar epsfcn;
+
+  NumericalDiff& operator=(const NumericalDiff&);
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-//vim: ai ts=4 sts=4 et sw=4
-#endif // EIGEN_NUMERICAL_DIFF_H
-
+// vim: ai ts=4 sts=4 et sw=4
+#endif  // EIGEN_NUMERICAL_DIFF_H
diff --git a/unsupported/Eigen/src/Polynomials/Companion.h b/unsupported/Eigen/src/Polynomials/Companion.h
index 9ce480e..f080996 100644
--- a/unsupported/Eigen/src/Polynomials/Companion.h
+++ b/unsupported/Eigen/src/Polynomials/Companion.h
@@ -17,267 +17,236 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 namespace internal {
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
 
-template<int Size>
-struct decrement_if_fixed_size
-{
-  enum {
-    ret = (Size == Dynamic) ? Dynamic : Size-1 };
+template <int Size>
+struct decrement_if_fixed_size {
+  enum { ret = (Size == Dynamic) ? Dynamic : Size - 1 };
 };
 
 #endif
 
-template< typename Scalar_, int Deg_ >
-class companion
-{
-  public:
-    EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar_,Deg_==Dynamic ? Dynamic : Deg_)
+template <typename Scalar_, int Deg_>
+class companion {
+ public:
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar_, Deg_ == Dynamic ? Dynamic : Deg_)
 
-    enum {
-      Deg = Deg_,
-      Deg_1=decrement_if_fixed_size<Deg>::ret
-    };
+  enum { Deg = Deg_, Deg_1 = decrement_if_fixed_size<Deg>::ret };
 
-    typedef Scalar_                                Scalar;
-    typedef typename NumTraits<Scalar>::Real       RealScalar;
-    typedef Matrix<Scalar, Deg, 1>                 RightColumn;
-    //typedef DiagonalMatrix< Scalar, Deg_1, Deg_1 > BottomLeftDiagonal;
-    typedef Matrix<Scalar, Deg_1, 1>               BottomLeftDiagonal;
+  typedef Scalar_ Scalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef Matrix<Scalar, Deg, 1> RightColumn;
+  // typedef DiagonalMatrix< Scalar, Deg_1, Deg_1 > BottomLeftDiagonal;
+  typedef Matrix<Scalar, Deg_1, 1> BottomLeftDiagonal;
 
-    typedef Matrix<Scalar, Deg, Deg>               DenseCompanionMatrixType;
-    typedef Matrix< Scalar, Deg_, Deg_1 >          LeftBlock;
-    typedef Matrix< Scalar, Deg_1, Deg_1 >         BottomLeftBlock;
-    typedef Matrix< Scalar, 1, Deg_1 >             LeftBlockFirstRow;
+  typedef Matrix<Scalar, Deg, Deg> DenseCompanionMatrixType;
+  typedef Matrix<Scalar, Deg_, Deg_1> LeftBlock;
+  typedef Matrix<Scalar, Deg_1, Deg_1> BottomLeftBlock;
+  typedef Matrix<Scalar, 1, Deg_1> LeftBlockFirstRow;
 
-    typedef DenseIndex Index;
+  typedef DenseIndex Index;
 
-  public:
-    EIGEN_STRONG_INLINE const Scalar_ operator()(Index row, Index col ) const
-    {
-      if( m_bl_diag.rows() > col )
-      {
-        if( 0 < row ){ return m_bl_diag[col]; }
-        else{ return 0; }
+ public:
+  EIGEN_STRONG_INLINE const Scalar_ operator()(Index row, Index col) const {
+    if (m_bl_diag.rows() > col) {
+      if (0 < row) {
+        return m_bl_diag[col];
+      } else {
+        return 0;
       }
-      else{ return m_monic[row]; }
+    } else {
+      return m_monic[row];
     }
+  }
 
-  public:
-    template<typename VectorType>
-    void setPolynomial( const VectorType& poly )
-    {
-      const Index deg = poly.size()-1;
-      m_monic = -poly.head(deg)/poly[deg];
-      m_bl_diag.setOnes(deg-1);
-    }
+ public:
+  template <typename VectorType>
+  void setPolynomial(const VectorType& poly) {
+    const Index deg = poly.size() - 1;
+    m_monic = -poly.head(deg) / poly[deg];
+    m_bl_diag.setOnes(deg - 1);
+  }
 
-    template<typename VectorType>
-    companion( const VectorType& poly ){
-      setPolynomial( poly ); }
+  template <typename VectorType>
+  companion(const VectorType& poly) {
+    setPolynomial(poly);
+  }
 
-  public:
-    DenseCompanionMatrixType denseMatrix() const
-    {
-      const Index deg   = m_monic.size();
-      const Index deg_1 = deg-1;
-      DenseCompanionMatrixType companMat(deg,deg);
-      companMat <<
-        ( LeftBlock(deg,deg_1)
-          << LeftBlockFirstRow::Zero(1,deg_1),
-          BottomLeftBlock::Identity(deg-1,deg-1)*m_bl_diag.asDiagonal() ).finished()
-        , m_monic;
-      return companMat;
-    }
+ public:
+  DenseCompanionMatrixType denseMatrix() const {
+    const Index deg = m_monic.size();
+    const Index deg_1 = deg - 1;
+    DenseCompanionMatrixType companMat(deg, deg);
+    companMat << (LeftBlock(deg, deg_1) << LeftBlockFirstRow::Zero(1, deg_1),
+                  BottomLeftBlock::Identity(deg - 1, deg - 1) * m_bl_diag.asDiagonal())
+                     .finished(),
+        m_monic;
+    return companMat;
+  }
 
+ protected:
+  /** Helper function for the balancing algorithm.
+   * \returns true if the row and the column, having colNorm and rowNorm
+   * as norms, are balanced, false otherwise.
+   * colB and rowB are respectively the multipliers for
+   * the column and the row in order to balance them.
+   * */
+  bool balanced(RealScalar colNorm, RealScalar rowNorm, bool& isBalanced, RealScalar& colB, RealScalar& rowB);
 
+  /** Helper function for the balancing algorithm.
+   * \returns true if the row and the column, having colNorm and rowNorm
+   * as norms, are balanced, false otherwise.
+   * colB and rowB are respectively the multipliers for
+   * the column and the row in order to balance them.
+   * */
+  bool balancedR(RealScalar colNorm, RealScalar rowNorm, bool& isBalanced, RealScalar& colB, RealScalar& rowB);
 
-  protected:
-    /** Helper function for the balancing algorithm.
-     * \returns true if the row and the column, having colNorm and rowNorm
-     * as norms, are balanced, false otherwise.
-     * colB and rowB are respectively the multipliers for
-     * the column and the row in order to balance them.
-     * */
-    bool balanced( RealScalar colNorm, RealScalar rowNorm,
-        bool& isBalanced, RealScalar& colB, RealScalar& rowB );
+ public:
+  /**
+   * Balancing algorithm from B. N. PARLETT and C. REINSCH (1969)
+   * "Balancing a matrix for calculation of eigenvalues and eigenvectors"
+   * adapted to the case of companion matrices.
+   * A matrix with non zero row and non zero column is balanced
+   * for a certain norm if the i-th row and the i-th column
+   * have same norm for all i.
+   */
+  void balance();
 
-    /** Helper function for the balancing algorithm.
-     * \returns true if the row and the column, having colNorm and rowNorm
-     * as norms, are balanced, false otherwise.
-     * colB and rowB are respectively the multipliers for
-     * the column and the row in order to balance them.
-     * */
-    bool balancedR( RealScalar colNorm, RealScalar rowNorm,
-        bool& isBalanced, RealScalar& colB, RealScalar& rowB );
-
-  public:
-    /**
-     * Balancing algorithm from B. N. PARLETT and C. REINSCH (1969)
-     * "Balancing a matrix for calculation of eigenvalues and eigenvectors"
-     * adapted to the case of companion matrices.
-     * A matrix with non zero row and non zero column is balanced
-     * for a certain norm if the i-th row and the i-th column
-     * have same norm for all i.
-     */
-    void balance();
-
-  protected:
-      RightColumn                m_monic;
-      BottomLeftDiagonal         m_bl_diag;
+ protected:
+  RightColumn m_monic;
+  BottomLeftDiagonal m_bl_diag;
 };
 
-
-
-template< typename Scalar_, int Deg_ >
-inline
-bool companion<Scalar_,Deg_>::balanced( RealScalar colNorm, RealScalar rowNorm,
-    bool& isBalanced, RealScalar& colB, RealScalar& rowB )
-{
-  if( RealScalar(0) == colNorm || RealScalar(0) == rowNorm 
-      || !(numext::isfinite)(colNorm) || !(numext::isfinite)(rowNorm)){
+template <typename Scalar_, int Deg_>
+inline bool companion<Scalar_, Deg_>::balanced(RealScalar colNorm, RealScalar rowNorm, bool& isBalanced,
+                                               RealScalar& colB, RealScalar& rowB) {
+  if (RealScalar(0) == colNorm || RealScalar(0) == rowNorm || !(numext::isfinite)(colNorm) ||
+      !(numext::isfinite)(rowNorm)) {
     return true;
-  }
-  else
-  {
-    //To find the balancing coefficients, if the radix is 2,
-    //one finds \f$ \sigma \f$ such that
-    // \f$ 2^{2\sigma-1} < rowNorm / colNorm \le 2^{2\sigma+1} \f$
-    // then the balancing coefficient for the row is \f$ 1/2^{\sigma} \f$
-    // and the balancing coefficient for the column is \f$ 2^{\sigma} \f$
+  } else {
+    // To find the balancing coefficients, if the radix is 2,
+    // one finds \f$ \sigma \f$ such that
+    //  \f$ 2^{2\sigma-1} < rowNorm / colNorm \le 2^{2\sigma+1} \f$
+    //  then the balancing coefficient for the row is \f$ 1/2^{\sigma} \f$
+    //  and the balancing coefficient for the column is \f$ 2^{\sigma} \f$
     const RealScalar radix = RealScalar(2);
     const RealScalar radix2 = RealScalar(4);
-    
+
     rowB = rowNorm / radix;
     colB = RealScalar(1);
     const RealScalar s = colNorm + rowNorm;
 
     // Find sigma s.t. rowNorm / 2 <= 2^(2*sigma) * colNorm
     RealScalar scout = colNorm;
-    while (scout < rowB)
-    {
+    while (scout < rowB) {
       colB *= radix;
       scout *= radix2;
     }
-    
+
     // We now have an upper-bound for sigma, try to lower it.
     // Find sigma s.t. 2^(2*sigma) * colNorm / 2 < rowNorm
     scout = colNorm * (colB / radix) * colB;  // Avoid overflow.
-    while (scout >= rowNorm)
-    {
+    while (scout >= rowNorm) {
       colB /= radix;
       scout /= radix2;
     }
 
     // This line is used to avoid insubstantial balancing.
-    if ((rowNorm + radix * scout) < RealScalar(0.95) * s * colB)
-    {
+    if ((rowNorm + radix * scout) < RealScalar(0.95) * s * colB) {
       isBalanced = false;
       rowB = RealScalar(1) / colB;
       return false;
-    }
-    else
-    {
+    } else {
       return true;
     }
   }
 }
 
-template< typename Scalar_, int Deg_ >
-inline
-bool companion<Scalar_,Deg_>::balancedR( RealScalar colNorm, RealScalar rowNorm,
-    bool& isBalanced, RealScalar& colB, RealScalar& rowB )
-{
-  if( RealScalar(0) == colNorm || RealScalar(0) == rowNorm ){ return true; }
-  else
-  {
+template <typename Scalar_, int Deg_>
+inline bool companion<Scalar_, Deg_>::balancedR(RealScalar colNorm, RealScalar rowNorm, bool& isBalanced,
+                                                RealScalar& colB, RealScalar& rowB) {
+  if (RealScalar(0) == colNorm || RealScalar(0) == rowNorm) {
+    return true;
+  } else {
     /**
      * Set the norm of the column and the row to the geometric mean
      * of the row and column norm
      */
-    const RealScalar q = colNorm/rowNorm;
-    if( !isApprox( q, Scalar_(1) ) )
-    {
-      rowB = sqrt( colNorm/rowNorm );
-      colB = RealScalar(1)/rowB;
+    const RealScalar q = colNorm / rowNorm;
+    if (!isApprox(q, Scalar_(1))) {
+      rowB = sqrt(colNorm / rowNorm);
+      colB = RealScalar(1) / rowB;
 
       isBalanced = false;
       return false;
+    } else {
+      return true;
     }
-    else{
-      return true; }
   }
 }
 
-
-template< typename Scalar_, int Deg_ >
-void companion<Scalar_,Deg_>::balance()
-{
+template <typename Scalar_, int Deg_>
+void companion<Scalar_, Deg_>::balance() {
   using std::abs;
-  EIGEN_STATIC_ASSERT( Deg == Dynamic || 1 < Deg, YOU_MADE_A_PROGRAMMING_MISTAKE );
-  const Index deg   = m_monic.size();
-  const Index deg_1 = deg-1;
+  EIGEN_STATIC_ASSERT(Deg == Dynamic || 1 < Deg, YOU_MADE_A_PROGRAMMING_MISTAKE);
+  const Index deg = m_monic.size();
+  const Index deg_1 = deg - 1;
 
-  bool hasConverged=false;
-  while( !hasConverged )
-  {
+  bool hasConverged = false;
+  while (!hasConverged) {
     hasConverged = true;
-    RealScalar colNorm,rowNorm;
-    RealScalar colB,rowB;
+    RealScalar colNorm, rowNorm;
+    RealScalar colB, rowB;
 
-    //First row, first column excluding the diagonal
+    // First row, first column excluding the diagonal
     //==============================================
     colNorm = abs(m_bl_diag[0]);
     rowNorm = abs(m_monic[0]);
 
-    //Compute balancing of the row and the column
-    if( !balanced( colNorm, rowNorm, hasConverged, colB, rowB ) )
-    {
+    // Compute balancing of the row and the column
+    if (!balanced(colNorm, rowNorm, hasConverged, colB, rowB)) {
       m_bl_diag[0] *= colB;
       m_monic[0] *= rowB;
     }
 
-    //Middle rows and columns excluding the diagonal
+    // Middle rows and columns excluding the diagonal
     //==============================================
-    for( Index i=1; i<deg_1; ++i )
-    {
+    for (Index i = 1; i < deg_1; ++i) {
       // column norm, excluding the diagonal
       colNorm = abs(m_bl_diag[i]);
 
       // row norm, excluding the diagonal
-      rowNorm = abs(m_bl_diag[i-1]) + abs(m_monic[i]);
+      rowNorm = abs(m_bl_diag[i - 1]) + abs(m_monic[i]);
 
-      //Compute balancing of the row and the column
-      if( !balanced( colNorm, rowNorm, hasConverged, colB, rowB ) )
-      {
-        m_bl_diag[i]   *= colB;
-        m_bl_diag[i-1] *= rowB;
-        m_monic[i]     *= rowB;
+      // Compute balancing of the row and the column
+      if (!balanced(colNorm, rowNorm, hasConverged, colB, rowB)) {
+        m_bl_diag[i] *= colB;
+        m_bl_diag[i - 1] *= rowB;
+        m_monic[i] *= rowB;
       }
     }
 
-    //Last row, last column excluding the diagonal
+    // Last row, last column excluding the diagonal
     //============================================
-    const Index ebl = m_bl_diag.size()-1;
-    VectorBlock<RightColumn,Deg_1> headMonic( m_monic, 0, deg_1 );
+    const Index ebl = m_bl_diag.size() - 1;
+    VectorBlock<RightColumn, Deg_1> headMonic(m_monic, 0, deg_1);
     colNorm = headMonic.array().abs().sum();
-    rowNorm = abs( m_bl_diag[ebl] );
+    rowNorm = abs(m_bl_diag[ebl]);
 
-    //Compute balancing of the row and the column
-    if( !balanced( colNorm, rowNorm, hasConverged, colB, rowB ) )
-    {
-      headMonic      *= colB;
+    // Compute balancing of the row and the column
+    if (!balanced(colNorm, rowNorm, hasConverged, colB, rowB)) {
+      headMonic *= colB;
       m_bl_diag[ebl] *= rowB;
     }
   }
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_COMPANION_H
+#endif  // EIGEN_COMPANION_H
diff --git a/unsupported/Eigen/src/Polynomials/PolynomialSolver.h b/unsupported/Eigen/src/Polynomials/PolynomialSolver.h
index 9e25ec0..ec5bc54 100644
--- a/unsupported/Eigen/src/Polynomials/PolynomialSolver.h
+++ b/unsupported/Eigen/src/Polynomials/PolynomialSolver.h
@@ -13,7 +13,7 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 /** \ingroup Polynomials_Module
  *  \class PolynomialSolverBase.
@@ -28,404 +28,359 @@
  * It stores the set of roots as a vector of complexes.
  *
  */
-template< typename Scalar_, int Deg_ >
-class PolynomialSolverBase
-{
-  public:
-    EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar_,Deg_==Dynamic ? Dynamic : Deg_)
+template <typename Scalar_, int Deg_>
+class PolynomialSolverBase {
+ public:
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar_, Deg_ == Dynamic ? Dynamic : Deg_)
 
-    typedef Scalar_                             Scalar;
-    typedef typename NumTraits<Scalar>::Real    RealScalar;
-    typedef std::complex<RealScalar>            RootType;
-    typedef Matrix<RootType,Deg_,1>             RootsType;
+  typedef Scalar_ Scalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef std::complex<RealScalar> RootType;
+  typedef Matrix<RootType, Deg_, 1> RootsType;
 
-    typedef DenseIndex Index;
+  typedef DenseIndex Index;
 
-  protected:
-    template< typename OtherPolynomial >
-    inline void setPolynomial( const OtherPolynomial& poly ){
-      m_roots.resize(poly.size()-1); }
+ protected:
+  template <typename OtherPolynomial>
+  inline void setPolynomial(const OtherPolynomial& poly) {
+    m_roots.resize(poly.size() - 1);
+  }
 
-  public:
-    template< typename OtherPolynomial >
-    inline PolynomialSolverBase( const OtherPolynomial& poly ){
-      setPolynomial( poly() ); }
+ public:
+  template <typename OtherPolynomial>
+  inline PolynomialSolverBase(const OtherPolynomial& poly) {
+    setPolynomial(poly());
+  }
 
-    inline PolynomialSolverBase(){}
+  inline PolynomialSolverBase() {}
 
-  public:
-    /** \returns the complex roots of the polynomial */
-    inline const RootsType& roots() const { return m_roots; }
+ public:
+  /** \returns the complex roots of the polynomial */
+  inline const RootsType& roots() const { return m_roots; }
 
-  public:
-    /** Clear and fills the back insertion sequence with the real roots of the polynomial
-     * i.e. the real part of the complex roots that have an imaginary part which
-     * absolute value is smaller than absImaginaryThreshold.
-     * absImaginaryThreshold takes the dummy_precision associated
-     * with the Scalar_ template parameter of the PolynomialSolver class as the default value.
-     *
-     * \param[out] bi_seq : the back insertion sequence (stl concept)
-     * \param[in]  absImaginaryThreshold : the maximum bound of the imaginary part of a complex
-     *  number that is considered as real.
-     * */
-    template<typename Stl_back_insertion_sequence>
-    inline void realRoots( Stl_back_insertion_sequence& bi_seq,
-        const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const
-    {
-      using std::abs;
-      bi_seq.clear();
-      for(Index i=0; i<m_roots.size(); ++i )
-      {
-        if( abs( m_roots[i].imag() ) < absImaginaryThreshold ){
-          bi_seq.push_back( m_roots[i].real() ); }
+ public:
+  /** Clear and fills the back insertion sequence with the real roots of the polynomial
+   * i.e. the real part of the complex roots that have an imaginary part which
+   * absolute value is smaller than absImaginaryThreshold.
+   * absImaginaryThreshold takes the dummy_precision associated
+   * with the Scalar_ template parameter of the PolynomialSolver class as the default value.
+   *
+   * \param[out] bi_seq : the back insertion sequence (stl concept)
+   * \param[in]  absImaginaryThreshold : the maximum bound of the imaginary part of a complex
+   *  number that is considered as real.
+   * */
+  template <typename Stl_back_insertion_sequence>
+  inline void realRoots(Stl_back_insertion_sequence& bi_seq,
+                        const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision()) const {
+    using std::abs;
+    bi_seq.clear();
+    for (Index i = 0; i < m_roots.size(); ++i) {
+      if (abs(m_roots[i].imag()) < absImaginaryThreshold) {
+        bi_seq.push_back(m_roots[i].real());
       }
     }
+  }
 
-  protected:
-    template<typename squaredNormBinaryPredicate>
-    inline const RootType& selectComplexRoot_withRespectToNorm( squaredNormBinaryPredicate& pred ) const
-    {
-      Index res=0;
-      RealScalar norm2 = numext::abs2( m_roots[0] );
-      for( Index i=1; i<m_roots.size(); ++i )
-      {
-        const RealScalar currNorm2 = numext::abs2( m_roots[i] );
-        if( pred( currNorm2, norm2 ) ){
-          res=i; norm2=currNorm2; }
+ protected:
+  template <typename squaredNormBinaryPredicate>
+  inline const RootType& selectComplexRoot_withRespectToNorm(squaredNormBinaryPredicate& pred) const {
+    Index res = 0;
+    RealScalar norm2 = numext::abs2(m_roots[0]);
+    for (Index i = 1; i < m_roots.size(); ++i) {
+      const RealScalar currNorm2 = numext::abs2(m_roots[i]);
+      if (pred(currNorm2, norm2)) {
+        res = i;
+        norm2 = currNorm2;
       }
-      return m_roots[res];
     }
+    return m_roots[res];
+  }
 
-  public:
-    /**
-     * \returns the complex root with greatest norm.
-     */
-    inline const RootType& greatestRoot() const
-    {
-      std::greater<RealScalar> greater;
-      return selectComplexRoot_withRespectToNorm( greater );
-    }
+ public:
+  /**
+   * \returns the complex root with greatest norm.
+   */
+  inline const RootType& greatestRoot() const {
+    std::greater<RealScalar> greater;
+    return selectComplexRoot_withRespectToNorm(greater);
+  }
 
-    /**
-     * \returns the complex root with smallest norm.
-     */
-    inline const RootType& smallestRoot() const
-    {
-      std::less<RealScalar> less;
-      return selectComplexRoot_withRespectToNorm( less );
-    }
+  /**
+   * \returns the complex root with smallest norm.
+   */
+  inline const RootType& smallestRoot() const {
+    std::less<RealScalar> less;
+    return selectComplexRoot_withRespectToNorm(less);
+  }
 
-  protected:
-    template<typename squaredRealPartBinaryPredicate>
-    inline const RealScalar& selectRealRoot_withRespectToAbsRealPart(
-        squaredRealPartBinaryPredicate& pred,
-        bool& hasArealRoot,
-        const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const
-    {
-      using std::abs;
-      hasArealRoot = false;
-      Index res=0;
-      RealScalar abs2(0);
+ protected:
+  template <typename squaredRealPartBinaryPredicate>
+  inline const RealScalar& selectRealRoot_withRespectToAbsRealPart(
+      squaredRealPartBinaryPredicate& pred, bool& hasArealRoot,
+      const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision()) const {
+    using std::abs;
+    hasArealRoot = false;
+    Index res = 0;
+    RealScalar abs2(0);
 
-      for( Index i=0; i<m_roots.size(); ++i )
-      {
-        if( abs( m_roots[i].imag() ) <= absImaginaryThreshold )
-        {
-          if( !hasArealRoot )
-          {
-            hasArealRoot = true;
+    for (Index i = 0; i < m_roots.size(); ++i) {
+      if (abs(m_roots[i].imag()) <= absImaginaryThreshold) {
+        if (!hasArealRoot) {
+          hasArealRoot = true;
+          res = i;
+          abs2 = m_roots[i].real() * m_roots[i].real();
+        } else {
+          const RealScalar currAbs2 = m_roots[i].real() * m_roots[i].real();
+          if (pred(currAbs2, abs2)) {
+            abs2 = currAbs2;
             res = i;
-            abs2 = m_roots[i].real() * m_roots[i].real();
-          }
-          else
-          {
-            const RealScalar currAbs2 = m_roots[i].real() * m_roots[i].real();
-            if( pred( currAbs2, abs2 ) )
-            {
-              abs2 = currAbs2;
-              res = i;
-            }
           }
         }
-        else if(!hasArealRoot)
-        {
-          if( abs( m_roots[i].imag() ) < abs( m_roots[res].imag() ) ){
-            res = i;}
+      } else if (!hasArealRoot) {
+        if (abs(m_roots[i].imag()) < abs(m_roots[res].imag())) {
+          res = i;
         }
       }
-      return numext::real_ref(m_roots[res]);
     }
+    return numext::real_ref(m_roots[res]);
+  }
 
+  template <typename RealPartBinaryPredicate>
+  inline const RealScalar& selectRealRoot_withRespectToRealPart(
+      RealPartBinaryPredicate& pred, bool& hasArealRoot,
+      const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision()) const {
+    using std::abs;
+    hasArealRoot = false;
+    Index res = 0;
+    RealScalar val(0);
 
-    template<typename RealPartBinaryPredicate>
-    inline const RealScalar& selectRealRoot_withRespectToRealPart(
-        RealPartBinaryPredicate& pred,
-        bool& hasArealRoot,
-        const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const
-    {
-      using std::abs;
-      hasArealRoot = false;
-      Index res=0;
-      RealScalar val(0);
-
-      for( Index i=0; i<m_roots.size(); ++i )
-      {
-        if( abs( m_roots[i].imag() ) <= absImaginaryThreshold )
-        {
-          if( !hasArealRoot )
-          {
-            hasArealRoot = true;
+    for (Index i = 0; i < m_roots.size(); ++i) {
+      if (abs(m_roots[i].imag()) <= absImaginaryThreshold) {
+        if (!hasArealRoot) {
+          hasArealRoot = true;
+          res = i;
+          val = m_roots[i].real();
+        } else {
+          const RealScalar curr = m_roots[i].real();
+          if (pred(curr, val)) {
+            val = curr;
             res = i;
-            val = m_roots[i].real();
-          }
-          else
-          {
-            const RealScalar curr = m_roots[i].real();
-            if( pred( curr, val ) )
-            {
-              val = curr;
-              res = i;
-            }
           }
         }
-        else
-        {
-          if( abs( m_roots[i].imag() ) < abs( m_roots[res].imag() ) ){
-            res = i; }
+      } else {
+        if (abs(m_roots[i].imag()) < abs(m_roots[res].imag())) {
+          res = i;
         }
       }
-      return numext::real_ref(m_roots[res]);
     }
+    return numext::real_ref(m_roots[res]);
+  }
 
-  public:
-    /**
-     * \returns a real root with greatest absolute magnitude.
-     * A real root is defined as the real part of a complex root with absolute imaginary
-     * part smallest than absImaginaryThreshold.
-     * absImaginaryThreshold takes the dummy_precision associated
-     * with the Scalar_ template parameter of the PolynomialSolver class as the default value.
-     * If no real root is found the boolean hasArealRoot is set to false and the real part of
-     * the root with smallest absolute imaginary part is returned instead.
-     *
-     * \param[out] hasArealRoot : boolean true if a real root is found according to the
-     *  absImaginaryThreshold criterion, false otherwise.
-     * \param[in] absImaginaryThreshold : threshold on the absolute imaginary part to decide
-     *  whether or not a root is real.
-     */
-    inline const RealScalar& absGreatestRealRoot(
-        bool& hasArealRoot,
-        const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const
-    {
-      std::greater<RealScalar> greater;
-      return selectRealRoot_withRespectToAbsRealPart( greater, hasArealRoot, absImaginaryThreshold );
-    }
+ public:
+  /**
+   * \returns a real root with greatest absolute magnitude.
+   * A real root is defined as the real part of a complex root with absolute imaginary
+   * part smallest than absImaginaryThreshold.
+   * absImaginaryThreshold takes the dummy_precision associated
+   * with the Scalar_ template parameter of the PolynomialSolver class as the default value.
+   * If no real root is found the boolean hasArealRoot is set to false and the real part of
+   * the root with smallest absolute imaginary part is returned instead.
+   *
+   * \param[out] hasArealRoot : boolean true if a real root is found according to the
+   *  absImaginaryThreshold criterion, false otherwise.
+   * \param[in] absImaginaryThreshold : threshold on the absolute imaginary part to decide
+   *  whether or not a root is real.
+   */
+  inline const RealScalar& absGreatestRealRoot(
+      bool& hasArealRoot, const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision()) const {
+    std::greater<RealScalar> greater;
+    return selectRealRoot_withRespectToAbsRealPart(greater, hasArealRoot, absImaginaryThreshold);
+  }
 
+  /**
+   * \returns a real root with smallest absolute magnitude.
+   * A real root is defined as the real part of a complex root with absolute imaginary
+   * part smallest than absImaginaryThreshold.
+   * absImaginaryThreshold takes the dummy_precision associated
+   * with the Scalar_ template parameter of the PolynomialSolver class as the default value.
+   * If no real root is found the boolean hasArealRoot is set to false and the real part of
+   * the root with smallest absolute imaginary part is returned instead.
+   *
+   * \param[out] hasArealRoot : boolean true if a real root is found according to the
+   *  absImaginaryThreshold criterion, false otherwise.
+   * \param[in] absImaginaryThreshold : threshold on the absolute imaginary part to decide
+   *  whether or not a root is real.
+   */
+  inline const RealScalar& absSmallestRealRoot(
+      bool& hasArealRoot, const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision()) const {
+    std::less<RealScalar> less;
+    return selectRealRoot_withRespectToAbsRealPart(less, hasArealRoot, absImaginaryThreshold);
+  }
 
-    /**
-     * \returns a real root with smallest absolute magnitude.
-     * A real root is defined as the real part of a complex root with absolute imaginary
-     * part smallest than absImaginaryThreshold.
-     * absImaginaryThreshold takes the dummy_precision associated
-     * with the Scalar_ template parameter of the PolynomialSolver class as the default value.
-     * If no real root is found the boolean hasArealRoot is set to false and the real part of
-     * the root with smallest absolute imaginary part is returned instead.
-     *
-     * \param[out] hasArealRoot : boolean true if a real root is found according to the
-     *  absImaginaryThreshold criterion, false otherwise.
-     * \param[in] absImaginaryThreshold : threshold on the absolute imaginary part to decide
-     *  whether or not a root is real.
-     */
-    inline const RealScalar& absSmallestRealRoot(
-        bool& hasArealRoot,
-        const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const
-    {
-      std::less<RealScalar> less;
-      return selectRealRoot_withRespectToAbsRealPart( less, hasArealRoot, absImaginaryThreshold );
-    }
+  /**
+   * \returns the real root with greatest value.
+   * A real root is defined as the real part of a complex root with absolute imaginary
+   * part smallest than absImaginaryThreshold.
+   * absImaginaryThreshold takes the dummy_precision associated
+   * with the Scalar_ template parameter of the PolynomialSolver class as the default value.
+   * If no real root is found the boolean hasArealRoot is set to false and the real part of
+   * the root with smallest absolute imaginary part is returned instead.
+   *
+   * \param[out] hasArealRoot : boolean true if a real root is found according to the
+   *  absImaginaryThreshold criterion, false otherwise.
+   * \param[in] absImaginaryThreshold : threshold on the absolute imaginary part to decide
+   *  whether or not a root is real.
+   */
+  inline const RealScalar& greatestRealRoot(
+      bool& hasArealRoot, const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision()) const {
+    std::greater<RealScalar> greater;
+    return selectRealRoot_withRespectToRealPart(greater, hasArealRoot, absImaginaryThreshold);
+  }
 
+  /**
+   * \returns the real root with smallest value.
+   * A real root is defined as the real part of a complex root with absolute imaginary
+   * part smallest than absImaginaryThreshold.
+   * absImaginaryThreshold takes the dummy_precision associated
+   * with the Scalar_ template parameter of the PolynomialSolver class as the default value.
+   * If no real root is found the boolean hasArealRoot is set to false and the real part of
+   * the root with smallest absolute imaginary part is returned instead.
+   *
+   * \param[out] hasArealRoot : boolean true if a real root is found according to the
+   *  absImaginaryThreshold criterion, false otherwise.
+   * \param[in] absImaginaryThreshold : threshold on the absolute imaginary part to decide
+   *  whether or not a root is real.
+   */
+  inline const RealScalar& smallestRealRoot(
+      bool& hasArealRoot, const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision()) const {
+    std::less<RealScalar> less;
+    return selectRealRoot_withRespectToRealPart(less, hasArealRoot, absImaginaryThreshold);
+  }
 
-    /**
-     * \returns the real root with greatest value.
-     * A real root is defined as the real part of a complex root with absolute imaginary
-     * part smallest than absImaginaryThreshold.
-     * absImaginaryThreshold takes the dummy_precision associated
-     * with the Scalar_ template parameter of the PolynomialSolver class as the default value.
-     * If no real root is found the boolean hasArealRoot is set to false and the real part of
-     * the root with smallest absolute imaginary part is returned instead.
-     *
-     * \param[out] hasArealRoot : boolean true if a real root is found according to the
-     *  absImaginaryThreshold criterion, false otherwise.
-     * \param[in] absImaginaryThreshold : threshold on the absolute imaginary part to decide
-     *  whether or not a root is real.
-     */
-    inline const RealScalar& greatestRealRoot(
-        bool& hasArealRoot,
-        const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const
-    {
-      std::greater<RealScalar> greater;
-      return selectRealRoot_withRespectToRealPart( greater, hasArealRoot, absImaginaryThreshold );
-    }
-
-
-    /**
-     * \returns the real root with smallest value.
-     * A real root is defined as the real part of a complex root with absolute imaginary
-     * part smallest than absImaginaryThreshold.
-     * absImaginaryThreshold takes the dummy_precision associated
-     * with the Scalar_ template parameter of the PolynomialSolver class as the default value.
-     * If no real root is found the boolean hasArealRoot is set to false and the real part of
-     * the root with smallest absolute imaginary part is returned instead.
-     *
-     * \param[out] hasArealRoot : boolean true if a real root is found according to the
-     *  absImaginaryThreshold criterion, false otherwise.
-     * \param[in] absImaginaryThreshold : threshold on the absolute imaginary part to decide
-     *  whether or not a root is real.
-     */
-    inline const RealScalar& smallestRealRoot(
-        bool& hasArealRoot,
-        const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const
-    {
-      std::less<RealScalar> less;
-      return selectRealRoot_withRespectToRealPart( less, hasArealRoot, absImaginaryThreshold );
-    }
-
-  protected:
-    RootsType               m_roots;
+ protected:
+  RootsType m_roots;
 };
 
-#define EIGEN_POLYNOMIAL_SOLVER_BASE_INHERITED_TYPES( BASE )  \
-  typedef typename BASE::Scalar                 Scalar;       \
-  typedef typename BASE::RealScalar             RealScalar;   \
-  typedef typename BASE::RootType               RootType;     \
-  typedef typename BASE::RootsType              RootsType;
-
-
+#define EIGEN_POLYNOMIAL_SOLVER_BASE_INHERITED_TYPES(BASE) \
+  typedef typename BASE::Scalar Scalar;                    \
+  typedef typename BASE::RealScalar RealScalar;            \
+  typedef typename BASE::RootType RootType;                \
+  typedef typename BASE::RootsType RootsType;
 
 /** \ingroup Polynomials_Module
-  *
-  * \class PolynomialSolver
-  *
-  * \brief A polynomial solver
-  *
-  * Computes the complex roots of a real polynomial.
-  *
-  * \param Scalar_ the scalar type, i.e., the type of the polynomial coefficients
-  * \param Deg_ the degree of the polynomial, can be a compile time value or Dynamic.
-  *             Notice that the number of polynomial coefficients is Deg_+1.
-  *
-  * This class implements a polynomial solver and provides convenient methods such as
-  * - real roots,
-  * - greatest, smallest complex roots,
-  * - real roots with greatest, smallest absolute real value.
-  * - greatest, smallest real roots.
-  *
-  * WARNING: this polynomial solver is experimental, part of the unsupported Eigen modules.
-  *
-  *
-  * Currently a QR algorithm is used to compute the eigenvalues of the companion matrix of
-  * the polynomial to compute its roots.
-  * This supposes that the complex moduli of the roots are all distinct: e.g. there should
-  * be no multiple roots or conjugate roots for instance.
-  * With 32bit (float) floating types this problem shows up frequently.
-  * However, almost always, correct accuracy is reached even in these cases for 64bit
-  * (double) floating types and small polynomial degree (<20).
-  */
-template<typename Scalar_, int Deg_>
-class PolynomialSolver : public PolynomialSolverBase<Scalar_,Deg_>
-{
-  public:
-    EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar_,Deg_==Dynamic ? Dynamic : Deg_)
+ *
+ * \class PolynomialSolver
+ *
+ * \brief A polynomial solver
+ *
+ * Computes the complex roots of a real polynomial.
+ *
+ * \param Scalar_ the scalar type, i.e., the type of the polynomial coefficients
+ * \param Deg_ the degree of the polynomial, can be a compile time value or Dynamic.
+ *             Notice that the number of polynomial coefficients is Deg_+1.
+ *
+ * This class implements a polynomial solver and provides convenient methods such as
+ * - real roots,
+ * - greatest, smallest complex roots,
+ * - real roots with greatest, smallest absolute real value.
+ * - greatest, smallest real roots.
+ *
+ * WARNING: this polynomial solver is experimental, part of the unsupported Eigen modules.
+ *
+ *
+ * Currently a QR algorithm is used to compute the eigenvalues of the companion matrix of
+ * the polynomial to compute its roots.
+ * This supposes that the complex moduli of the roots are all distinct: e.g. there should
+ * be no multiple roots or conjugate roots for instance.
+ * With 32bit (float) floating types this problem shows up frequently.
+ * However, almost always, correct accuracy is reached even in these cases for 64bit
+ * (double) floating types and small polynomial degree (<20).
+ */
+template <typename Scalar_, int Deg_>
+class PolynomialSolver : public PolynomialSolverBase<Scalar_, Deg_> {
+ public:
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar_, Deg_ == Dynamic ? Dynamic : Deg_)
 
-    typedef PolynomialSolverBase<Scalar_,Deg_>    PS_Base;
-    EIGEN_POLYNOMIAL_SOLVER_BASE_INHERITED_TYPES( PS_Base )
+  typedef PolynomialSolverBase<Scalar_, Deg_> PS_Base;
+  EIGEN_POLYNOMIAL_SOLVER_BASE_INHERITED_TYPES(PS_Base)
 
-    typedef Matrix<Scalar,Deg_,Deg_>                 CompanionMatrixType;
-    typedef std::conditional_t<NumTraits<Scalar>::IsComplex,
-                                    ComplexEigenSolver<CompanionMatrixType>,
-                                    EigenSolver<CompanionMatrixType> > EigenSolverType;
-    typedef std::conditional_t<NumTraits<Scalar>::IsComplex, Scalar, std::complex<Scalar> > ComplexScalar;
+  typedef Matrix<Scalar, Deg_, Deg_> CompanionMatrixType;
+  typedef std::conditional_t<NumTraits<Scalar>::IsComplex, ComplexEigenSolver<CompanionMatrixType>,
+                             EigenSolver<CompanionMatrixType> >
+      EigenSolverType;
+  typedef std::conditional_t<NumTraits<Scalar>::IsComplex, Scalar, std::complex<Scalar> > ComplexScalar;
 
-  public:
-    /** Computes the complex roots of a new polynomial. */
-    template< typename OtherPolynomial >
-    void compute( const OtherPolynomial& poly )
-    {
-      eigen_assert( Scalar(0) != poly[poly.size()-1] );
-      eigen_assert( poly.size() > 1 );
-      if(poly.size() >  2 )
-      {
-        internal::companion<Scalar,Deg_> companion( poly );
-        companion.balance();
-        m_eigenSolver.compute( companion.denseMatrix() );
-        m_roots = m_eigenSolver.eigenvalues();
-        // cleanup noise in imaginary part of real roots:
-        // if the imaginary part is rather small compared to the real part
-        // and that cancelling the imaginary part yield a smaller evaluation,
-        // then it's safe to keep the real part only.
-        RealScalar coarse_prec = RealScalar(std::pow(4,poly.size()+1))*NumTraits<RealScalar>::epsilon();
-        for(Index i = 0; i<m_roots.size(); ++i)
-        {
-          if( internal::isMuchSmallerThan(numext::abs(numext::imag(m_roots[i])),
-                                          numext::abs(numext::real(m_roots[i])),
-                                          coarse_prec) )
-          {
-            ComplexScalar as_real_root = ComplexScalar(numext::real(m_roots[i]));
-            if(    numext::abs(poly_eval(poly, as_real_root))
-                <= numext::abs(poly_eval(poly, m_roots[i])))
-            {
-              m_roots[i] = as_real_root;
-            }
+ public:
+  /** Computes the complex roots of a new polynomial. */
+  template <typename OtherPolynomial>
+  void compute(const OtherPolynomial& poly) {
+    eigen_assert(Scalar(0) != poly[poly.size() - 1]);
+    eigen_assert(poly.size() > 1);
+    if (poly.size() > 2) {
+      internal::companion<Scalar, Deg_> companion(poly);
+      companion.balance();
+      m_eigenSolver.compute(companion.denseMatrix());
+      m_roots = m_eigenSolver.eigenvalues();
+      // cleanup noise in imaginary part of real roots:
+      // if the imaginary part is rather small compared to the real part
+      // and that cancelling the imaginary part yield a smaller evaluation,
+      // then it's safe to keep the real part only.
+      RealScalar coarse_prec = RealScalar(std::pow(4, poly.size() + 1)) * NumTraits<RealScalar>::epsilon();
+      for (Index i = 0; i < m_roots.size(); ++i) {
+        if (internal::isMuchSmallerThan(numext::abs(numext::imag(m_roots[i])), numext::abs(numext::real(m_roots[i])),
+                                        coarse_prec)) {
+          ComplexScalar as_real_root = ComplexScalar(numext::real(m_roots[i]));
+          if (numext::abs(poly_eval(poly, as_real_root)) <= numext::abs(poly_eval(poly, m_roots[i]))) {
+            m_roots[i] = as_real_root;
           }
         }
       }
-      else if(poly.size () == 2)
-      {
-        m_roots.resize(1);
-        m_roots[0] = -poly[0]/poly[1];
-      }
+    } else if (poly.size() == 2) {
+      m_roots.resize(1);
+      m_roots[0] = -poly[0] / poly[1];
     }
+  }
 
-  public:
-    template< typename OtherPolynomial >
-    inline PolynomialSolver( const OtherPolynomial& poly ){
-      compute( poly ); }
+ public:
+  template <typename OtherPolynomial>
+  inline PolynomialSolver(const OtherPolynomial& poly) {
+    compute(poly);
+  }
 
-    inline PolynomialSolver(){}
+  inline PolynomialSolver() {}
 
-  protected:
-    using                   PS_Base::m_roots;
-    EigenSolverType         m_eigenSolver;
+ protected:
+  using PS_Base::m_roots;
+  EigenSolverType m_eigenSolver;
 };
 
+template <typename Scalar_>
+class PolynomialSolver<Scalar_, 1> : public PolynomialSolverBase<Scalar_, 1> {
+ public:
+  typedef PolynomialSolverBase<Scalar_, 1> PS_Base;
+  EIGEN_POLYNOMIAL_SOLVER_BASE_INHERITED_TYPES(PS_Base)
 
-template< typename Scalar_ >
-class PolynomialSolver<Scalar_,1> : public PolynomialSolverBase<Scalar_,1>
-{
-  public:
-    typedef PolynomialSolverBase<Scalar_,1>    PS_Base;
-    EIGEN_POLYNOMIAL_SOLVER_BASE_INHERITED_TYPES( PS_Base )
+ public:
+  /** Computes the complex roots of a new polynomial. */
+  template <typename OtherPolynomial>
+  void compute(const OtherPolynomial& poly) {
+    eigen_assert(poly.size() == 2);
+    eigen_assert(Scalar(0) != poly[1]);
+    m_roots[0] = -poly[0] / poly[1];
+  }
 
-  public:
-    /** Computes the complex roots of a new polynomial. */
-    template< typename OtherPolynomial >
-    void compute( const OtherPolynomial& poly )
-    {
-      eigen_assert( poly.size() == 2 );
-      eigen_assert( Scalar(0) != poly[1] );
-      m_roots[0] = -poly[0]/poly[1];
-    }
+ public:
+  template <typename OtherPolynomial>
+  inline PolynomialSolver(const OtherPolynomial& poly) {
+    compute(poly);
+  }
 
-  public:
-    template< typename OtherPolynomial >
-    inline PolynomialSolver( const OtherPolynomial& poly ){
-      compute( poly ); }
+  inline PolynomialSolver() {}
 
-    inline PolynomialSolver(){}
-
-  protected:
-    using                   PS_Base::m_roots;
+ protected:
+  using PS_Base::m_roots;
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_POLYNOMIAL_SOLVER_H
+#endif  // EIGEN_POLYNOMIAL_SOLVER_H
diff --git a/unsupported/Eigen/src/Polynomials/PolynomialUtils.h b/unsupported/Eigen/src/Polynomials/PolynomialUtils.h
index 99c49aa..342ca9a 100644
--- a/unsupported/Eigen/src/Polynomials/PolynomialUtils.h
+++ b/unsupported/Eigen/src/Polynomials/PolynomialUtils.h
@@ -13,7 +13,7 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 /** \ingroup Polynomials_Module
  * \returns the evaluation of the polynomial at x using Horner algorithm.
@@ -27,12 +27,11 @@
  *   \f$ |x| \le 1 \f$
  */
 template <typename Polynomials, typename T>
-inline
-T poly_eval_horner( const Polynomials& poly, const T& x )
-{
-  T val=poly[poly.size()-1];
-  for(DenseIndex i=poly.size()-2; i>=0; --i ){
-    val = val*x + poly[i]; }
+inline T poly_eval_horner(const Polynomials& poly, const T& x) {
+  T val = poly[poly.size() - 1];
+  for (DenseIndex i = poly.size() - 2; i >= 0; --i) {
+    val = val * x + poly[i];
+  }
   return val;
 }
 
@@ -45,21 +44,19 @@
  * \param[in] x : the value to evaluate the polynomial at.
  */
 template <typename Polynomials, typename T>
-inline
-T poly_eval( const Polynomials& poly, const T& x )
-{
+inline T poly_eval(const Polynomials& poly, const T& x) {
   typedef typename NumTraits<T>::Real Real;
 
-  if( numext::abs2( x ) <= Real(1) ){
-    return poly_eval_horner( poly, x ); }
-  else
-  {
-    T val=poly[0];
-    T inv_x = T(1)/x;
-    for( DenseIndex i=1; i<poly.size(); ++i ){
-      val = val*inv_x + poly[i]; }
+  if (numext::abs2(x) <= Real(1)) {
+    return poly_eval_horner(poly, x);
+  } else {
+    T val = poly[0];
+    T inv_x = T(1) / x;
+    for (DenseIndex i = 1; i < poly.size(); ++i) {
+      val = val * inv_x + poly[i];
+    }
 
-    return numext::pow(x,(T)(poly.size()-1)) * val;
+    return numext::pow(x, (T)(poly.size() - 1)) * val;
   }
 }
 
@@ -74,19 +71,18 @@
  *   the leading coefficient of the input polynomial poly must be non zero
  */
 template <typename Polynomial>
-inline
-typename NumTraits<typename Polynomial::Scalar>::Real cauchy_max_bound( const Polynomial& poly )
-{
+inline typename NumTraits<typename Polynomial::Scalar>::Real cauchy_max_bound(const Polynomial& poly) {
   using std::abs;
   typedef typename Polynomial::Scalar Scalar;
   typedef typename NumTraits<Scalar>::Real Real;
 
-  eigen_assert( Scalar(0) != poly[poly.size()-1] );
-  const Scalar inv_leading_coeff = Scalar(1)/poly[poly.size()-1];
+  eigen_assert(Scalar(0) != poly[poly.size() - 1]);
+  const Scalar inv_leading_coeff = Scalar(1) / poly[poly.size() - 1];
   Real cb(0);
 
-  for( DenseIndex i=0; i<poly.size()-1; ++i ){
-    cb += abs(poly[i]*inv_leading_coeff); }
+  for (DenseIndex i = 0; i < poly.size() - 1; ++i) {
+    cb += abs(poly[i] * inv_leading_coeff);
+  }
   return cb + Real(1);
 }
 
@@ -97,23 +93,25 @@
  *  e.g. \f$ 1 + 3x^2 \f$ is stored as a vector \f$ [ 1, 0, 3 ] \f$.
  */
 template <typename Polynomial>
-inline
-typename NumTraits<typename Polynomial::Scalar>::Real cauchy_min_bound( const Polynomial& poly )
-{
+inline typename NumTraits<typename Polynomial::Scalar>::Real cauchy_min_bound(const Polynomial& poly) {
   using std::abs;
   typedef typename Polynomial::Scalar Scalar;
   typedef typename NumTraits<Scalar>::Real Real;
 
-  DenseIndex i=0;
-  while( i<poly.size()-1 && Scalar(0) == poly(i) ){ ++i; }
-  if( poly.size()-1 == i ){
-    return Real(1); }
+  DenseIndex i = 0;
+  while (i < poly.size() - 1 && Scalar(0) == poly(i)) {
+    ++i;
+  }
+  if (poly.size() - 1 == i) {
+    return Real(1);
+  }
 
-  const Scalar inv_min_coeff = Scalar(1)/poly[i];
+  const Scalar inv_min_coeff = Scalar(1) / poly[i];
   Real cb(1);
-  for( DenseIndex j=i+1; j<poly.size(); ++j ){
-    cb += abs(poly[j]*inv_min_coeff); }
-  return Real(1)/cb;
+  for (DenseIndex j = i + 1; j < poly.size(); ++j) {
+    cb += abs(poly[j] * inv_min_coeff);
+  }
+  return Real(1) / cb;
 }
 
 /** \ingroup Polynomials_Module
@@ -127,20 +125,20 @@
  *  e.g. \f$ 3 + x^2 \f$ is stored as a vector \f$ [ 3, 0, 1 ] \f$.
  */
 template <typename RootVector, typename Polynomial>
-void roots_to_monicPolynomial( const RootVector& rv, Polynomial& poly )
-{
-
+void roots_to_monicPolynomial(const RootVector& rv, Polynomial& poly) {
   typedef typename Polynomial::Scalar Scalar;
 
-  poly.setZero( rv.size()+1 );
-  poly[0] = -rv[0]; poly[1] = Scalar(1);
-  for( DenseIndex i=1; i< rv.size(); ++i )
-  {
-    for( DenseIndex j=i+1; j>0; --j ){ poly[j] = poly[j-1] - rv[i]*poly[j]; }
-    poly[0] = -rv[i]*poly[0];
+  poly.setZero(rv.size() + 1);
+  poly[0] = -rv[0];
+  poly[1] = Scalar(1);
+  for (DenseIndex i = 1; i < rv.size(); ++i) {
+    for (DenseIndex j = i + 1; j > 0; --j) {
+      poly[j] = poly[j - 1] - rv[i] * poly[j];
+    }
+    poly[0] = -rv[i] * poly[0];
   }
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_POLYNOMIAL_UTILS_H
+#endif  // EIGEN_POLYNOMIAL_UTILS_H
diff --git a/unsupported/Eigen/src/Skyline/SkylineInplaceLU.h b/unsupported/Eigen/src/Skyline/SkylineInplaceLU.h
index ba49cd9..50ac882 100644
--- a/unsupported/Eigen/src/Skyline/SkylineInplaceLU.h
+++ b/unsupported/Eigen/src/Skyline/SkylineInplaceLU.h
@@ -13,7 +13,7 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 /** \ingroup Skyline_Module
  *
@@ -24,277 +24,253 @@
  * \param MatrixType the type of the matrix of which we are computing the LU factorization
  *
  */
-template<typename MatrixType>
+template <typename MatrixType>
 class SkylineInplaceLU {
-protected:
-    typedef typename MatrixType::Scalar Scalar;
-    typedef typename MatrixType::Index Index;
-    
-    typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;
+ protected:
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::Index Index;
 
-public:
+  typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;
 
-    /** Creates a LU object and compute the respective factorization of \a matrix using
-     * flags \a flags. */
-    SkylineInplaceLU(MatrixType& matrix, int flags = 0)
-    : /*m_matrix(matrix.rows(), matrix.cols()),*/ m_flags(flags), m_status(0), m_lu(matrix) {
-        m_precision = RealScalar(0.1) * Eigen::dummy_precision<RealScalar > ();
-        m_lu.IsRowMajor ? computeRowMajor() : compute();
-    }
+ public:
+  /** Creates a LU object and compute the respective factorization of \a matrix using
+   * flags \a flags. */
+  SkylineInplaceLU(MatrixType& matrix, int flags = 0)
+      : /*m_matrix(matrix.rows(), matrix.cols()),*/ m_flags(flags), m_status(0), m_lu(matrix) {
+    m_precision = RealScalar(0.1) * Eigen::dummy_precision<RealScalar>();
+    m_lu.IsRowMajor ? computeRowMajor() : compute();
+  }
 
-    /** Sets the relative threshold value used to prune zero coefficients during the decomposition.
-     *
-     * Setting a value greater than zero speeds up computation, and yields to an incomplete
-     * factorization with fewer non zero coefficients. Such approximate factors are especially
-     * useful to initialize an iterative solver.
-     *
-     * Note that the exact meaning of this parameter might depends on the actual
-     * backend. Moreover, not all backends support this feature.
-     *
-     * \sa precision() */
-    void setPrecision(RealScalar v) {
-        m_precision = v;
-    }
+  /** Sets the relative threshold value used to prune zero coefficients during the decomposition.
+   *
+   * Setting a value greater than zero speeds up computation, and yields to an incomplete
+   * factorization with fewer non zero coefficients. Such approximate factors are especially
+   * useful to initialize an iterative solver.
+   *
+   * Note that the exact meaning of this parameter might depends on the actual
+   * backend. Moreover, not all backends support this feature.
+   *
+   * \sa precision() */
+  void setPrecision(RealScalar v) { m_precision = v; }
 
-    /** \returns the current precision.
-     *
-     * \sa setPrecision() */
-    RealScalar precision() const {
-        return m_precision;
-    }
+  /** \returns the current precision.
+   *
+   * \sa setPrecision() */
+  RealScalar precision() const { return m_precision; }
 
-    /** Sets the flags. Possible values are:
-     *  - CompleteFactorization
-     *  - IncompleteFactorization
-     *  - MemoryEfficient
-     *  - one of the ordering methods
-     *  - etc...
-     *
-     * \sa flags() */
-    void setFlags(int f) {
-        m_flags = f;
-    }
+  /** Sets the flags. Possible values are:
+   *  - CompleteFactorization
+   *  - IncompleteFactorization
+   *  - MemoryEfficient
+   *  - one of the ordering methods
+   *  - etc...
+   *
+   * \sa flags() */
+  void setFlags(int f) { m_flags = f; }
 
-    /** \returns the current flags */
-    int flags() const {
-        return m_flags;
-    }
+  /** \returns the current flags */
+  int flags() const { return m_flags; }
 
-    void setOrderingMethod(int m) {
-        m_flags = m;
-    }
+  void setOrderingMethod(int m) { m_flags = m; }
 
-    int orderingMethod() const {
-        return m_flags;
-    }
+  int orderingMethod() const { return m_flags; }
 
-    /** Computes/re-computes the LU factorization */
-    void compute();
-    void computeRowMajor();
+  /** Computes/re-computes the LU factorization */
+  void compute();
+  void computeRowMajor();
 
-    /** \returns the lower triangular matrix L */
-    //inline const MatrixType& matrixL() const { return m_matrixL; }
+  /** \returns the lower triangular matrix L */
+  // inline const MatrixType& matrixL() const { return m_matrixL; }
 
-    /** \returns the upper triangular matrix U */
-    //inline const MatrixType& matrixU() const { return m_matrixU; }
+  /** \returns the upper triangular matrix U */
+  // inline const MatrixType& matrixU() const { return m_matrixU; }
 
-    template<typename BDerived, typename XDerived>
-    bool solve(const MatrixBase<BDerived> &b, MatrixBase<XDerived>* x,
-            const int transposed = 0) const;
+  template <typename BDerived, typename XDerived>
+  bool solve(const MatrixBase<BDerived>& b, MatrixBase<XDerived>* x, const int transposed = 0) const;
 
-    /** \returns true if the factorization succeeded */
-    inline bool succeeded(void) const {
-        return m_succeeded;
-    }
+  /** \returns true if the factorization succeeded */
+  inline bool succeeded(void) const { return m_succeeded; }
 
-protected:
-    RealScalar m_precision;
-    int m_flags;
-    mutable int m_status;
-    bool m_succeeded;
-    MatrixType& m_lu;
+ protected:
+  RealScalar m_precision;
+  int m_flags;
+  mutable int m_status;
+  bool m_succeeded;
+  MatrixType& m_lu;
 };
 
 /** Computes / recomputes the in place LU decomposition of the SkylineInplaceLU.
  * using the default algorithm.
  */
-template<typename MatrixType>
-//template<typename Scalar_>
+template <typename MatrixType>
+// template<typename Scalar_>
 void SkylineInplaceLU<MatrixType>::compute() {
-    const size_t rows = m_lu.rows();
-    const size_t cols = m_lu.cols();
+  const size_t rows = m_lu.rows();
+  const size_t cols = m_lu.cols();
 
-    eigen_assert(rows == cols && "We do not (yet) support rectangular LU.");
-    eigen_assert(!m_lu.IsRowMajor && "LU decomposition does not work with rowMajor Storage");
+  eigen_assert(rows == cols && "We do not (yet) support rectangular LU.");
+  eigen_assert(!m_lu.IsRowMajor && "LU decomposition does not work with rowMajor Storage");
 
-    for (Index row = 0; row < rows; row++) {
-        const double pivot = m_lu.coeffDiag(row);
+  for (Index row = 0; row < rows; row++) {
+    const double pivot = m_lu.coeffDiag(row);
 
-        //Lower matrix Columns update
-        const Index& col = row;
-        for (typename MatrixType::InnerLowerIterator lIt(m_lu, col); lIt; ++lIt) {
-            lIt.valueRef() /= pivot;
-        }
-
-        //Upper matrix update -> contiguous memory access
-        typename MatrixType::InnerLowerIterator lIt(m_lu, col);
-        for (Index rrow = row + 1; rrow < m_lu.rows(); rrow++) {
-            typename MatrixType::InnerUpperIterator uItPivot(m_lu, row);
-            typename MatrixType::InnerUpperIterator uIt(m_lu, rrow);
-            const double coef = lIt.value();
-
-            uItPivot += (rrow - row - 1);
-
-            //update upper part  -> contiguous memory access
-            for (++uItPivot; uIt && uItPivot;) {
-                uIt.valueRef() -= uItPivot.value() * coef;
-
-                ++uIt;
-                ++uItPivot;
-            }
-            ++lIt;
-        }
-
-        //Upper matrix update -> non contiguous memory access
-        typename MatrixType::InnerLowerIterator lIt3(m_lu, col);
-        for (Index rrow = row + 1; rrow < m_lu.rows(); rrow++) {
-            typename MatrixType::InnerUpperIterator uItPivot(m_lu, row);
-            const double coef = lIt3.value();
-
-            //update lower part ->  non contiguous memory access
-            for (Index i = 0; i < rrow - row - 1; i++) {
-                m_lu.coeffRefLower(rrow, row + i + 1) -= uItPivot.value() * coef;
-                ++uItPivot;
-            }
-            ++lIt3;
-        }
-        //update diag -> contiguous
-        typename MatrixType::InnerLowerIterator lIt2(m_lu, col);
-        for (Index rrow = row + 1; rrow < m_lu.rows(); rrow++) {
-
-            typename MatrixType::InnerUpperIterator uItPivot(m_lu, row);
-            typename MatrixType::InnerUpperIterator uIt(m_lu, rrow);
-            const double coef = lIt2.value();
-
-            uItPivot += (rrow - row - 1);
-            m_lu.coeffRefDiag(rrow) -= uItPivot.value() * coef;
-            ++lIt2;
-        }
+    // Lower matrix Columns update
+    const Index& col = row;
+    for (typename MatrixType::InnerLowerIterator lIt(m_lu, col); lIt; ++lIt) {
+      lIt.valueRef() /= pivot;
     }
+
+    // Upper matrix update -> contiguous memory access
+    typename MatrixType::InnerLowerIterator lIt(m_lu, col);
+    for (Index rrow = row + 1; rrow < m_lu.rows(); rrow++) {
+      typename MatrixType::InnerUpperIterator uItPivot(m_lu, row);
+      typename MatrixType::InnerUpperIterator uIt(m_lu, rrow);
+      const double coef = lIt.value();
+
+      uItPivot += (rrow - row - 1);
+
+      // update upper part  -> contiguous memory access
+      for (++uItPivot; uIt && uItPivot;) {
+        uIt.valueRef() -= uItPivot.value() * coef;
+
+        ++uIt;
+        ++uItPivot;
+      }
+      ++lIt;
+    }
+
+    // Upper matrix update -> non contiguous memory access
+    typename MatrixType::InnerLowerIterator lIt3(m_lu, col);
+    for (Index rrow = row + 1; rrow < m_lu.rows(); rrow++) {
+      typename MatrixType::InnerUpperIterator uItPivot(m_lu, row);
+      const double coef = lIt3.value();
+
+      // update lower part ->  non contiguous memory access
+      for (Index i = 0; i < rrow - row - 1; i++) {
+        m_lu.coeffRefLower(rrow, row + i + 1) -= uItPivot.value() * coef;
+        ++uItPivot;
+      }
+      ++lIt3;
+    }
+    // update diag -> contiguous
+    typename MatrixType::InnerLowerIterator lIt2(m_lu, col);
+    for (Index rrow = row + 1; rrow < m_lu.rows(); rrow++) {
+      typename MatrixType::InnerUpperIterator uItPivot(m_lu, row);
+      typename MatrixType::InnerUpperIterator uIt(m_lu, rrow);
+      const double coef = lIt2.value();
+
+      uItPivot += (rrow - row - 1);
+      m_lu.coeffRefDiag(rrow) -= uItPivot.value() * coef;
+      ++lIt2;
+    }
+  }
 }
 
-template<typename MatrixType>
+template <typename MatrixType>
 void SkylineInplaceLU<MatrixType>::computeRowMajor() {
-    const size_t rows = m_lu.rows();
-    const size_t cols = m_lu.cols();
+  const size_t rows = m_lu.rows();
+  const size_t cols = m_lu.cols();
 
-    eigen_assert(rows == cols && "We do not (yet) support rectangular LU.");
-    eigen_assert(m_lu.IsRowMajor && "You're trying to apply rowMajor decomposition on a ColMajor matrix !");
+  eigen_assert(rows == cols && "We do not (yet) support rectangular LU.");
+  eigen_assert(m_lu.IsRowMajor && "You're trying to apply rowMajor decomposition on a ColMajor matrix !");
 
-    for (Index row = 0; row < rows; row++) {
-        typename MatrixType::InnerLowerIterator llIt(m_lu, row);
+  for (Index row = 0; row < rows; row++) {
+    typename MatrixType::InnerLowerIterator llIt(m_lu, row);
 
+    for (Index col = llIt.col(); col < row; col++) {
+      if (m_lu.coeffExistLower(row, col)) {
+        const double diag = m_lu.coeffDiag(col);
 
-        for (Index col = llIt.col(); col < row; col++) {
-            if (m_lu.coeffExistLower(row, col)) {
-                const double diag = m_lu.coeffDiag(col);
-
-                typename MatrixType::InnerLowerIterator lIt(m_lu, row);
-                typename MatrixType::InnerUpperIterator uIt(m_lu, col);
-
-
-                const Index offset = lIt.col() - uIt.row();
-
-
-                Index stop = offset > 0 ? col - lIt.col() : col - uIt.row();
-
-                //#define VECTORIZE
-#ifdef VECTORIZE
-                Map<VectorXd > rowVal(lIt.valuePtr() + (offset > 0 ? 0 : -offset), stop);
-                Map<VectorXd > colVal(uIt.valuePtr() + (offset > 0 ? offset : 0), stop);
-
-
-                Scalar newCoeff = m_lu.coeffLower(row, col) - rowVal.dot(colVal);
-#else
-                if (offset > 0) //Skip zero value of lIt
-                    uIt += offset;
-                else //Skip zero values of uIt
-                    lIt += -offset;
-                Scalar newCoeff = m_lu.coeffLower(row, col);
-
-                for (Index k = 0; k < stop; ++k) {
-                    const Scalar tmp = newCoeff;
-                    newCoeff = tmp - lIt.value() * uIt.value();
-                    ++lIt;
-                    ++uIt;
-                }
-#endif
-
-                m_lu.coeffRefLower(row, col) = newCoeff / diag;
-            }
-        }
-
-        //Upper matrix update
-        const Index col = row;
-        typename MatrixType::InnerUpperIterator uuIt(m_lu, col);
-        for (Index rrow = uuIt.row(); rrow < col; rrow++) {
-
-            typename MatrixType::InnerLowerIterator lIt(m_lu, rrow);
-            typename MatrixType::InnerUpperIterator uIt(m_lu, col);
-            const Index offset = lIt.col() - uIt.row();
-
-            Index stop = offset > 0 ? rrow - lIt.col() : rrow - uIt.row();
-
-#ifdef VECTORIZE
-            Map<VectorXd > rowVal(lIt.valuePtr() + (offset > 0 ? 0 : -offset), stop);
-            Map<VectorXd > colVal(uIt.valuePtr() + (offset > 0 ? offset : 0), stop);
-
-            Scalar newCoeff = m_lu.coeffUpper(rrow, col) - rowVal.dot(colVal);
-#else
-            if (offset > 0) //Skip zero value of lIt
-                uIt += offset;
-            else //Skip zero values of uIt
-                lIt += -offset;
-            Scalar newCoeff = m_lu.coeffUpper(rrow, col);
-            for (Index k = 0; k < stop; ++k) {
-                const Scalar tmp = newCoeff;
-                newCoeff = tmp - lIt.value() * uIt.value();
-
-                ++lIt;
-                ++uIt;
-            }
-#endif
-            m_lu.coeffRefUpper(rrow, col) = newCoeff;
-        }
-
-
-        //Diag matrix update
         typename MatrixType::InnerLowerIterator lIt(m_lu, row);
-        typename MatrixType::InnerUpperIterator uIt(m_lu, row);
+        typename MatrixType::InnerUpperIterator uIt(m_lu, col);
 
         const Index offset = lIt.col() - uIt.row();
 
+        Index stop = offset > 0 ? col - lIt.col() : col - uIt.row();
 
-        Index stop = offset > 0 ? lIt.size() : uIt.size();
+        // #define VECTORIZE
 #ifdef VECTORIZE
-        Map<VectorXd > rowVal(lIt.valuePtr() + (offset > 0 ? 0 : -offset), stop);
-        Map<VectorXd > colVal(uIt.valuePtr() + (offset > 0 ? offset : 0), stop);
-        Scalar newCoeff = m_lu.coeffDiag(row) - rowVal.dot(colVal);
+        Map<VectorXd> rowVal(lIt.valuePtr() + (offset > 0 ? 0 : -offset), stop);
+        Map<VectorXd> colVal(uIt.valuePtr() + (offset > 0 ? offset : 0), stop);
+
+        Scalar newCoeff = m_lu.coeffLower(row, col) - rowVal.dot(colVal);
 #else
-        if (offset > 0) //Skip zero value of lIt
-            uIt += offset;
-        else //Skip zero values of uIt
-            lIt += -offset;
-        Scalar newCoeff = m_lu.coeffDiag(row);
+        if (offset > 0)  // Skip zero value of lIt
+          uIt += offset;
+        else  // Skip zero values of uIt
+          lIt += -offset;
+        Scalar newCoeff = m_lu.coeffLower(row, col);
+
         for (Index k = 0; k < stop; ++k) {
-            const Scalar tmp = newCoeff;
-            newCoeff = tmp - lIt.value() * uIt.value();
-            ++lIt;
-            ++uIt;
+          const Scalar tmp = newCoeff;
+          newCoeff = tmp - lIt.value() * uIt.value();
+          ++lIt;
+          ++uIt;
         }
 #endif
-        m_lu.coeffRefDiag(row) = newCoeff;
+
+        m_lu.coeffRefLower(row, col) = newCoeff / diag;
+      }
     }
+
+    // Upper matrix update
+    const Index col = row;
+    typename MatrixType::InnerUpperIterator uuIt(m_lu, col);
+    for (Index rrow = uuIt.row(); rrow < col; rrow++) {
+      typename MatrixType::InnerLowerIterator lIt(m_lu, rrow);
+      typename MatrixType::InnerUpperIterator uIt(m_lu, col);
+      const Index offset = lIt.col() - uIt.row();
+
+      Index stop = offset > 0 ? rrow - lIt.col() : rrow - uIt.row();
+
+#ifdef VECTORIZE
+      Map<VectorXd> rowVal(lIt.valuePtr() + (offset > 0 ? 0 : -offset), stop);
+      Map<VectorXd> colVal(uIt.valuePtr() + (offset > 0 ? offset : 0), stop);
+
+      Scalar newCoeff = m_lu.coeffUpper(rrow, col) - rowVal.dot(colVal);
+#else
+      if (offset > 0)  // Skip zero value of lIt
+        uIt += offset;
+      else  // Skip zero values of uIt
+        lIt += -offset;
+      Scalar newCoeff = m_lu.coeffUpper(rrow, col);
+      for (Index k = 0; k < stop; ++k) {
+        const Scalar tmp = newCoeff;
+        newCoeff = tmp - lIt.value() * uIt.value();
+
+        ++lIt;
+        ++uIt;
+      }
+#endif
+      m_lu.coeffRefUpper(rrow, col) = newCoeff;
+    }
+
+    // Diag matrix update
+    typename MatrixType::InnerLowerIterator lIt(m_lu, row);
+    typename MatrixType::InnerUpperIterator uIt(m_lu, row);
+
+    const Index offset = lIt.col() - uIt.row();
+
+    Index stop = offset > 0 ? lIt.size() : uIt.size();
+#ifdef VECTORIZE
+    Map<VectorXd> rowVal(lIt.valuePtr() + (offset > 0 ? 0 : -offset), stop);
+    Map<VectorXd> colVal(uIt.valuePtr() + (offset > 0 ? offset : 0), stop);
+    Scalar newCoeff = m_lu.coeffDiag(row) - rowVal.dot(colVal);
+#else
+    if (offset > 0)  // Skip zero value of lIt
+      uIt += offset;
+    else  // Skip zero values of uIt
+      lIt += -offset;
+    Scalar newCoeff = m_lu.coeffDiag(row);
+    for (Index k = 0; k < stop; ++k) {
+      const Scalar tmp = newCoeff;
+      newCoeff = tmp - lIt.value() * uIt.value();
+      ++lIt;
+      ++uIt;
+    }
+#endif
+    m_lu.coeffRefDiag(row) = newCoeff;
+  }
 }
 
 /** Computes *x = U^-1 L^-1 b
@@ -305,51 +281,46 @@
  * Not all backends implement the solution of the transposed or
  * adjoint system.
  */
-template<typename MatrixType>
-template<typename BDerived, typename XDerived>
-bool SkylineInplaceLU<MatrixType>::solve(const MatrixBase<BDerived> &b, MatrixBase<XDerived>* x, const int transposed) const {
-    const size_t rows = m_lu.rows();
-    const size_t cols = m_lu.cols();
+template <typename MatrixType>
+template <typename BDerived, typename XDerived>
+bool SkylineInplaceLU<MatrixType>::solve(const MatrixBase<BDerived>& b, MatrixBase<XDerived>* x,
+                                         const int transposed) const {
+  const size_t rows = m_lu.rows();
+  const size_t cols = m_lu.cols();
 
+  for (Index row = 0; row < rows; row++) {
+    x->coeffRef(row) = b.coeff(row);
+    Scalar newVal = x->coeff(row);
+    typename MatrixType::InnerLowerIterator lIt(m_lu, row);
 
-    for (Index row = 0; row < rows; row++) {
-        x->coeffRef(row) = b.coeff(row);
-        Scalar newVal = x->coeff(row);
-        typename MatrixType::InnerLowerIterator lIt(m_lu, row);
-
-        Index col = lIt.col();
-        while (lIt.col() < row) {
-
-            newVal -= x->coeff(col++) * lIt.value();
-            ++lIt;
-        }
-
-        x->coeffRef(row) = newVal;
+    Index col = lIt.col();
+    while (lIt.col() < row) {
+      newVal -= x->coeff(col++) * lIt.value();
+      ++lIt;
     }
 
+    x->coeffRef(row) = newVal;
+  }
 
-    for (Index col = rows - 1; col > 0; col--) {
-        x->coeffRef(col) = x->coeff(col) / m_lu.coeffDiag(col);
+  for (Index col = rows - 1; col > 0; col--) {
+    x->coeffRef(col) = x->coeff(col) / m_lu.coeffDiag(col);
 
-        const Scalar x_col = x->coeff(col);
+    const Scalar x_col = x->coeff(col);
 
-        typename MatrixType::InnerUpperIterator uIt(m_lu, col);
-        uIt += uIt.size()-1;
+    typename MatrixType::InnerUpperIterator uIt(m_lu, col);
+    uIt += uIt.size() - 1;
 
-
-        while (uIt) {
-            x->coeffRef(uIt.row()) -= x_col * uIt.value();
-            //TODO : introduce --operator
-            uIt += -1;
-        }
-
-
+    while (uIt) {
+      x->coeffRef(uIt.row()) -= x_col * uIt.value();
+      // TODO : introduce --operator
+      uIt += -1;
     }
-    x->coeffRef(0) = x->coeff(0) / m_lu.coeffDiag(0);
+  }
+  x->coeffRef(0) = x->coeff(0) / m_lu.coeffDiag(0);
 
-    return true;
+  return true;
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SKYLINEINPLACELU_H
+#endif  // EIGEN_SKYLINEINPLACELU_H
diff --git a/unsupported/Eigen/src/Skyline/SkylineMatrix.h b/unsupported/Eigen/src/Skyline/SkylineMatrix.h
index 4b2c852..6615cc7 100644
--- a/unsupported/Eigen/src/Skyline/SkylineMatrix.h
+++ b/unsupported/Eigen/src/Skyline/SkylineMatrix.h
@@ -16,7 +16,7 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 /** \ingroup Skyline_Module
  *
@@ -34,832 +34,730 @@
  *
  */
 namespace internal {
-template<typename Scalar_, int Options_>
+template <typename Scalar_, int Options_>
 struct traits<SkylineMatrix<Scalar_, Options_> > {
-    typedef Scalar_ Scalar;
-    typedef Sparse StorageKind;
+  typedef Scalar_ Scalar;
+  typedef Sparse StorageKind;
 
-    enum {
-        RowsAtCompileTime = Dynamic,
-        ColsAtCompileTime = Dynamic,
-        MaxRowsAtCompileTime = Dynamic,
-        MaxColsAtCompileTime = Dynamic,
-        Flags = SkylineBit | Options_,
-        CoeffReadCost = NumTraits<Scalar>::ReadCost,
-    };
+  enum {
+    RowsAtCompileTime = Dynamic,
+    ColsAtCompileTime = Dynamic,
+    MaxRowsAtCompileTime = Dynamic,
+    MaxColsAtCompileTime = Dynamic,
+    Flags = SkylineBit | Options_,
+    CoeffReadCost = NumTraits<Scalar>::ReadCost,
+  };
 };
-}
+}  // namespace internal
 
-template<typename Scalar_, int Options_>
-class SkylineMatrix
-: public SkylineMatrixBase<SkylineMatrix<Scalar_, Options_> > {
-public:
-    EIGEN_SKYLINE_GENERIC_PUBLIC_INTERFACE(SkylineMatrix)
-    EIGEN_SKYLINE_INHERIT_ASSIGNMENT_OPERATOR(SkylineMatrix, +=)
-    EIGEN_SKYLINE_INHERIT_ASSIGNMENT_OPERATOR(SkylineMatrix, -=)
+template <typename Scalar_, int Options_>
+class SkylineMatrix : public SkylineMatrixBase<SkylineMatrix<Scalar_, Options_> > {
+ public:
+  EIGEN_SKYLINE_GENERIC_PUBLIC_INTERFACE(SkylineMatrix)
+  EIGEN_SKYLINE_INHERIT_ASSIGNMENT_OPERATOR(SkylineMatrix, +=)
+  EIGEN_SKYLINE_INHERIT_ASSIGNMENT_OPERATOR(SkylineMatrix, -=)
 
-    using Base::IsRowMajor;
+  using Base::IsRowMajor;
 
-protected:
+ protected:
+  typedef SkylineMatrix<Scalar, (Flags & ~RowMajorBit) | (IsRowMajor ? RowMajorBit : 0)> TransposedSkylineMatrix;
 
-    typedef SkylineMatrix<Scalar, (Flags&~RowMajorBit) | (IsRowMajor ? RowMajorBit : 0) > TransposedSkylineMatrix;
+  Index m_outerSize;
+  Index m_innerSize;
 
-    Index m_outerSize;
-    Index m_innerSize;
+ public:
+  Index* m_colStartIndex;
+  Index* m_rowStartIndex;
+  SkylineStorage<Scalar> m_data;
 
-public:
-    Index* m_colStartIndex;
-    Index* m_rowStartIndex;
-    SkylineStorage<Scalar> m_data;
+ public:
+  inline Index rows() const { return IsRowMajor ? m_outerSize : m_innerSize; }
 
-public:
+  inline Index cols() const { return IsRowMajor ? m_innerSize : m_outerSize; }
 
-    inline Index rows() const {
-        return IsRowMajor ? m_outerSize : m_innerSize;
+  inline Index innerSize() const { return m_innerSize; }
+
+  inline Index outerSize() const { return m_outerSize; }
+
+  inline Index upperNonZeros() const { return m_data.upperSize(); }
+
+  inline Index lowerNonZeros() const { return m_data.lowerSize(); }
+
+  inline Index upperNonZeros(Index j) const { return m_colStartIndex[j + 1] - m_colStartIndex[j]; }
+
+  inline Index lowerNonZeros(Index j) const { return m_rowStartIndex[j + 1] - m_rowStartIndex[j]; }
+
+  inline const Scalar* _diagPtr() const { return &m_data.diag(0); }
+
+  inline Scalar* _diagPtr() { return &m_data.diag(0); }
+
+  inline const Scalar* _upperPtr() const { return &m_data.upper(0); }
+
+  inline Scalar* _upperPtr() { return &m_data.upper(0); }
+
+  inline const Scalar* _lowerPtr() const { return &m_data.lower(0); }
+
+  inline Scalar* _lowerPtr() { return &m_data.lower(0); }
+
+  inline const Index* _upperProfilePtr() const { return &m_data.upperProfile(0); }
+
+  inline Index* _upperProfilePtr() { return &m_data.upperProfile(0); }
+
+  inline const Index* _lowerProfilePtr() const { return &m_data.lowerProfile(0); }
+
+  inline Index* _lowerProfilePtr() { return &m_data.lowerProfile(0); }
+
+  inline Scalar coeff(Index row, Index col) const {
+    const Index outer = IsRowMajor ? row : col;
+    const Index inner = IsRowMajor ? col : row;
+
+    eigen_assert(outer < outerSize());
+    eigen_assert(inner < innerSize());
+
+    if (outer == inner) return this->m_data.diag(outer);
+
+    if (IsRowMajor) {
+      if (inner > outer)  // upper matrix
+      {
+        const Index minOuterIndex = inner - m_data.upperProfile(inner);
+        if (outer >= minOuterIndex)
+          return this->m_data.upper(m_colStartIndex[inner] + outer - (inner - m_data.upperProfile(inner)));
+        else
+          return Scalar(0);
+      }
+      if (inner < outer)  // lower matrix
+      {
+        const Index minInnerIndex = outer - m_data.lowerProfile(outer);
+        if (inner >= minInnerIndex)
+          return this->m_data.lower(m_rowStartIndex[outer] + inner - (outer - m_data.lowerProfile(outer)));
+        else
+          return Scalar(0);
+      }
+      return m_data.upper(m_colStartIndex[inner] + outer - inner);
+    } else {
+      if (outer > inner)  // upper matrix
+      {
+        const Index maxOuterIndex = inner + m_data.upperProfile(inner);
+        if (outer <= maxOuterIndex)
+          return this->m_data.upper(m_colStartIndex[inner] + (outer - inner));
+        else
+          return Scalar(0);
+      }
+      if (outer < inner)  // lower matrix
+      {
+        const Index maxInnerIndex = outer + m_data.lowerProfile(outer);
+
+        if (inner <= maxInnerIndex)
+          return this->m_data.lower(m_rowStartIndex[outer] + (inner - outer));
+        else
+          return Scalar(0);
+      }
     }
+  }
 
-    inline Index cols() const {
-        return IsRowMajor ? m_innerSize : m_outerSize;
+  inline Scalar& coeffRef(Index row, Index col) {
+    const Index outer = IsRowMajor ? row : col;
+    const Index inner = IsRowMajor ? col : row;
+
+    eigen_assert(outer < outerSize());
+    eigen_assert(inner < innerSize());
+
+    if (outer == inner) return this->m_data.diag(outer);
+
+    if (IsRowMajor) {
+      if (col > row)  // upper matrix
+      {
+        const Index minOuterIndex = inner - m_data.upperProfile(inner);
+        eigen_assert(outer >= minOuterIndex && "You tried to access a coeff that does not exist in the storage");
+        return this->m_data.upper(m_colStartIndex[inner] + outer - (inner - m_data.upperProfile(inner)));
+      }
+      if (col < row)  // lower matrix
+      {
+        const Index minInnerIndex = outer - m_data.lowerProfile(outer);
+        eigen_assert(inner >= minInnerIndex && "You tried to access a coeff that does not exist in the storage");
+        return this->m_data.lower(m_rowStartIndex[outer] + inner - (outer - m_data.lowerProfile(outer)));
+      }
+    } else {
+      if (outer > inner)  // upper matrix
+      {
+        const Index maxOuterIndex = inner + m_data.upperProfile(inner);
+        eigen_assert(outer <= maxOuterIndex && "You tried to access a coeff that does not exist in the storage");
+        return this->m_data.upper(m_colStartIndex[inner] + (outer - inner));
+      }
+      if (outer < inner)  // lower matrix
+      {
+        const Index maxInnerIndex = outer + m_data.lowerProfile(outer);
+        eigen_assert(inner <= maxInnerIndex && "You tried to access a coeff that does not exist in the storage");
+        return this->m_data.lower(m_rowStartIndex[outer] + (inner - outer));
+      }
     }
+  }
 
-    inline Index innerSize() const {
-        return m_innerSize;
+  inline Scalar coeffDiag(Index idx) const {
+    eigen_assert(idx < outerSize());
+    eigen_assert(idx < innerSize());
+    return this->m_data.diag(idx);
+  }
+
+  inline Scalar coeffLower(Index row, Index col) const {
+    const Index outer = IsRowMajor ? row : col;
+    const Index inner = IsRowMajor ? col : row;
+
+    eigen_assert(outer < outerSize());
+    eigen_assert(inner < innerSize());
+    eigen_assert(inner != outer);
+
+    if (IsRowMajor) {
+      const Index minInnerIndex = outer - m_data.lowerProfile(outer);
+      if (inner >= minInnerIndex)
+        return this->m_data.lower(m_rowStartIndex[outer] + inner - (outer - m_data.lowerProfile(outer)));
+      else
+        return Scalar(0);
+
+    } else {
+      const Index maxInnerIndex = outer + m_data.lowerProfile(outer);
+      if (inner <= maxInnerIndex)
+        return this->m_data.lower(m_rowStartIndex[outer] + (inner - outer));
+      else
+        return Scalar(0);
     }
+  }
 
-    inline Index outerSize() const {
-        return m_outerSize;
+  inline Scalar coeffUpper(Index row, Index col) const {
+    const Index outer = IsRowMajor ? row : col;
+    const Index inner = IsRowMajor ? col : row;
+
+    eigen_assert(outer < outerSize());
+    eigen_assert(inner < innerSize());
+    eigen_assert(inner != outer);
+
+    if (IsRowMajor) {
+      const Index minOuterIndex = inner - m_data.upperProfile(inner);
+      if (outer >= minOuterIndex)
+        return this->m_data.upper(m_colStartIndex[inner] + outer - (inner - m_data.upperProfile(inner)));
+      else
+        return Scalar(0);
+    } else {
+      const Index maxOuterIndex = inner + m_data.upperProfile(inner);
+      if (outer <= maxOuterIndex)
+        return this->m_data.upper(m_colStartIndex[inner] + (outer - inner));
+      else
+        return Scalar(0);
     }
+  }
 
-    inline Index upperNonZeros() const {
-        return m_data.upperSize();
+  inline Scalar& coeffRefDiag(Index idx) {
+    eigen_assert(idx < outerSize());
+    eigen_assert(idx < innerSize());
+    return this->m_data.diag(idx);
+  }
+
+  inline Scalar& coeffRefLower(Index row, Index col) {
+    const Index outer = IsRowMajor ? row : col;
+    const Index inner = IsRowMajor ? col : row;
+
+    eigen_assert(outer < outerSize());
+    eigen_assert(inner < innerSize());
+    eigen_assert(inner != outer);
+
+    if (IsRowMajor) {
+      const Index minInnerIndex = outer - m_data.lowerProfile(outer);
+      eigen_assert(inner >= minInnerIndex && "You tried to access a coeff that does not exist in the storage");
+      return this->m_data.lower(m_rowStartIndex[outer] + inner - (outer - m_data.lowerProfile(outer)));
+    } else {
+      const Index maxInnerIndex = outer + m_data.lowerProfile(outer);
+      eigen_assert(inner <= maxInnerIndex && "You tried to access a coeff that does not exist in the storage");
+      return this->m_data.lower(m_rowStartIndex[outer] + (inner - outer));
     }
+  }
 
-    inline Index lowerNonZeros() const {
-        return m_data.lowerSize();
+  inline bool coeffExistLower(Index row, Index col) {
+    const Index outer = IsRowMajor ? row : col;
+    const Index inner = IsRowMajor ? col : row;
+
+    eigen_assert(outer < outerSize());
+    eigen_assert(inner < innerSize());
+    eigen_assert(inner != outer);
+
+    if (IsRowMajor) {
+      const Index minInnerIndex = outer - m_data.lowerProfile(outer);
+      return inner >= minInnerIndex;
+    } else {
+      const Index maxInnerIndex = outer + m_data.lowerProfile(outer);
+      return inner <= maxInnerIndex;
     }
+  }
 
-    inline Index upperNonZeros(Index j) const {
-        return m_colStartIndex[j + 1] - m_colStartIndex[j];
+  inline Scalar& coeffRefUpper(Index row, Index col) {
+    const Index outer = IsRowMajor ? row : col;
+    const Index inner = IsRowMajor ? col : row;
+
+    eigen_assert(outer < outerSize());
+    eigen_assert(inner < innerSize());
+    eigen_assert(inner != outer);
+
+    if (IsRowMajor) {
+      const Index minOuterIndex = inner - m_data.upperProfile(inner);
+      eigen_assert(outer >= minOuterIndex && "You tried to access a coeff that does not exist in the storage");
+      return this->m_data.upper(m_colStartIndex[inner] + outer - (inner - m_data.upperProfile(inner)));
+    } else {
+      const Index maxOuterIndex = inner + m_data.upperProfile(inner);
+      eigen_assert(outer <= maxOuterIndex && "You tried to access a coeff that does not exist in the storage");
+      return this->m_data.upper(m_colStartIndex[inner] + (outer - inner));
     }
+  }
 
-    inline Index lowerNonZeros(Index j) const {
-        return m_rowStartIndex[j + 1] - m_rowStartIndex[j];
+  inline bool coeffExistUpper(Index row, Index col) {
+    const Index outer = IsRowMajor ? row : col;
+    const Index inner = IsRowMajor ? col : row;
+
+    eigen_assert(outer < outerSize());
+    eigen_assert(inner < innerSize());
+    eigen_assert(inner != outer);
+
+    if (IsRowMajor) {
+      const Index minOuterIndex = inner - m_data.upperProfile(inner);
+      return outer >= minOuterIndex;
+    } else {
+      const Index maxOuterIndex = inner + m_data.upperProfile(inner);
+      return outer <= maxOuterIndex;
     }
+  }
 
-    inline const Scalar* _diagPtr() const {
-        return &m_data.diag(0);
-    }
+ protected:
+ public:
+  class InnerUpperIterator;
+  class InnerLowerIterator;
 
-    inline Scalar* _diagPtr() {
-        return &m_data.diag(0);
-    }
+  class OuterUpperIterator;
+  class OuterLowerIterator;
 
-    inline const Scalar* _upperPtr() const {
-        return &m_data.upper(0);
-    }
+  /** Removes all non zeros */
+  inline void setZero() {
+    m_data.clear();
+    std::fill_n(m_colStartIndex, m_outerSize + 1, Index(0));
+    std::fill_n(m_rowStartIndex, m_outerSize + 1, Index(0));
+  }
 
-    inline Scalar* _upperPtr() {
-        return &m_data.upper(0);
-    }
+  /** \returns the number of non zero coefficients */
+  inline Index nonZeros() const { return m_data.diagSize() + m_data.upperSize() + m_data.lowerSize(); }
 
-    inline const Scalar* _lowerPtr() const {
-        return &m_data.lower(0);
-    }
+  /** Preallocates \a reserveSize non zeros */
+  inline void reserve(Index reserveSize, Index reserveUpperSize, Index reserveLowerSize) {
+    m_data.reserve(reserveSize, reserveUpperSize, reserveLowerSize);
+  }
 
-    inline Scalar* _lowerPtr() {
-        return &m_data.lower(0);
-    }
+  /** \returns a reference to a novel non zero coefficient with coordinates \a row x \a col.
 
-    inline const Index* _upperProfilePtr() const {
-        return &m_data.upperProfile(0);
-    }
+   *
+   * \warning This function can be extremely slow if the non zero coefficients
+   * are not inserted in a coherent order.
+   *
+   * After an insertion session, you should call the finalize() function.
+   */
+  EIGEN_DONT_INLINE Scalar& insert(Index row, Index col) {
+    const Index outer = IsRowMajor ? row : col;
+    const Index inner = IsRowMajor ? col : row;
 
-    inline Index* _upperProfilePtr() {
-        return &m_data.upperProfile(0);
-    }
+    eigen_assert(outer < outerSize());
+    eigen_assert(inner < innerSize());
 
-    inline const Index* _lowerProfilePtr() const {
-        return &m_data.lowerProfile(0);
-    }
+    if (outer == inner) return m_data.diag(col);
 
-    inline Index* _lowerProfilePtr() {
-        return &m_data.lowerProfile(0);
-    }
+    if (IsRowMajor) {
+      if (outer < inner)  // upper matrix
+      {
+        Index minOuterIndex = 0;
+        minOuterIndex = inner - m_data.upperProfile(inner);
 
-    inline Scalar coeff(Index row, Index col) const {
-        const Index outer = IsRowMajor ? row : col;
-        const Index inner = IsRowMajor ? col : row;
-
-        eigen_assert(outer < outerSize());
-        eigen_assert(inner < innerSize());
-
-        if (outer == inner)
-            return this->m_data.diag(outer);
-
-        if (IsRowMajor) {
-            if (inner > outer) //upper matrix
-            {
-                const Index minOuterIndex = inner - m_data.upperProfile(inner);
-                if (outer >= minOuterIndex)
-                    return this->m_data.upper(m_colStartIndex[inner] + outer - (inner - m_data.upperProfile(inner)));
-                else
-                    return Scalar(0);
-            }
-            if (inner < outer) //lower matrix
-            {
-                const Index minInnerIndex = outer - m_data.lowerProfile(outer);
-                if (inner >= minInnerIndex)
-                    return this->m_data.lower(m_rowStartIndex[outer] + inner - (outer - m_data.lowerProfile(outer)));
-                else
-                    return Scalar(0);
-            }
-            return m_data.upper(m_colStartIndex[inner] + outer - inner);
-        } else {
-            if (outer > inner) //upper matrix
-            {
-                const Index maxOuterIndex = inner + m_data.upperProfile(inner);
-                if (outer <= maxOuterIndex)
-                    return this->m_data.upper(m_colStartIndex[inner] + (outer - inner));
-                else
-                    return Scalar(0);
-            }
-            if (outer < inner) //lower matrix
-            {
-                const Index maxInnerIndex = outer + m_data.lowerProfile(outer);
-
-                if (inner <= maxInnerIndex)
-                    return this->m_data.lower(m_rowStartIndex[outer] + (inner - outer));
-                else
-                    return Scalar(0);
-            }
-        }
-    }
-
-    inline Scalar& coeffRef(Index row, Index col) {
-        const Index outer = IsRowMajor ? row : col;
-        const Index inner = IsRowMajor ? col : row;
-
-        eigen_assert(outer < outerSize());
-        eigen_assert(inner < innerSize());
-
-        if (outer == inner)
-            return this->m_data.diag(outer);
-
-        if (IsRowMajor) {
-            if (col > row) //upper matrix
-            {
-                const Index minOuterIndex = inner - m_data.upperProfile(inner);
-                eigen_assert(outer >= minOuterIndex && "You tried to access a coeff that does not exist in the storage");
-                return this->m_data.upper(m_colStartIndex[inner] + outer - (inner - m_data.upperProfile(inner)));
-            }
-            if (col < row) //lower matrix
-            {
-                const Index minInnerIndex = outer - m_data.lowerProfile(outer);
-                eigen_assert(inner >= minInnerIndex && "You tried to access a coeff that does not exist in the storage");
-                return this->m_data.lower(m_rowStartIndex[outer] + inner - (outer - m_data.lowerProfile(outer)));
-            }
-        } else {
-            if (outer > inner) //upper matrix
-            {
-                const Index maxOuterIndex = inner + m_data.upperProfile(inner);
-                eigen_assert(outer <= maxOuterIndex && "You tried to access a coeff that does not exist in the storage");
-                return this->m_data.upper(m_colStartIndex[inner] + (outer - inner));
-            }
-            if (outer < inner) //lower matrix
-            {
-                const Index maxInnerIndex = outer + m_data.lowerProfile(outer);
-                eigen_assert(inner <= maxInnerIndex && "You tried to access a coeff that does not exist in the storage");
-                return this->m_data.lower(m_rowStartIndex[outer] + (inner - outer));
-            }
-        }
-    }
-
-    inline Scalar coeffDiag(Index idx) const {
-        eigen_assert(idx < outerSize());
-        eigen_assert(idx < innerSize());
-        return this->m_data.diag(idx);
-    }
-
-    inline Scalar coeffLower(Index row, Index col) const {
-        const Index outer = IsRowMajor ? row : col;
-        const Index inner = IsRowMajor ? col : row;
-
-        eigen_assert(outer < outerSize());
-        eigen_assert(inner < innerSize());
-        eigen_assert(inner != outer);
-
-        if (IsRowMajor) {
-            const Index minInnerIndex = outer - m_data.lowerProfile(outer);
-            if (inner >= minInnerIndex)
-                return this->m_data.lower(m_rowStartIndex[outer] + inner - (outer - m_data.lowerProfile(outer)));
-            else
-                return Scalar(0);
-
-        } else {
-            const Index maxInnerIndex = outer + m_data.lowerProfile(outer);
-            if (inner <= maxInnerIndex)
-                return this->m_data.lower(m_rowStartIndex[outer] + (inner - outer));
-            else
-                return Scalar(0);
-        }
-    }
-
-    inline Scalar coeffUpper(Index row, Index col) const {
-        const Index outer = IsRowMajor ? row : col;
-        const Index inner = IsRowMajor ? col : row;
-
-        eigen_assert(outer < outerSize());
-        eigen_assert(inner < innerSize());
-        eigen_assert(inner != outer);
-
-        if (IsRowMajor) {
-            const Index minOuterIndex = inner - m_data.upperProfile(inner);
-            if (outer >= minOuterIndex)
-                return this->m_data.upper(m_colStartIndex[inner] + outer - (inner - m_data.upperProfile(inner)));
-            else
-                return Scalar(0);
-        } else {
-            const Index maxOuterIndex = inner + m_data.upperProfile(inner);
-            if (outer <= maxOuterIndex)
-                return this->m_data.upper(m_colStartIndex[inner] + (outer - inner));
-            else
-                return Scalar(0);
-        }
-    }
-
-    inline Scalar& coeffRefDiag(Index idx) {
-        eigen_assert(idx < outerSize());
-        eigen_assert(idx < innerSize());
-        return this->m_data.diag(idx);
-    }
-
-    inline Scalar& coeffRefLower(Index row, Index col) {
-        const Index outer = IsRowMajor ? row : col;
-        const Index inner = IsRowMajor ? col : row;
-
-        eigen_assert(outer < outerSize());
-        eigen_assert(inner < innerSize());
-        eigen_assert(inner != outer);
-
-        if (IsRowMajor) {
-            const Index minInnerIndex = outer - m_data.lowerProfile(outer);
-            eigen_assert(inner >= minInnerIndex && "You tried to access a coeff that does not exist in the storage");
-            return this->m_data.lower(m_rowStartIndex[outer] + inner - (outer - m_data.lowerProfile(outer)));
-        } else {
-            const Index maxInnerIndex = outer + m_data.lowerProfile(outer);
-            eigen_assert(inner <= maxInnerIndex && "You tried to access a coeff that does not exist in the storage");
-            return this->m_data.lower(m_rowStartIndex[outer] + (inner - outer));
-        }
-    }
-
-    inline bool coeffExistLower(Index row, Index col) {
-        const Index outer = IsRowMajor ? row : col;
-        const Index inner = IsRowMajor ? col : row;
-
-        eigen_assert(outer < outerSize());
-        eigen_assert(inner < innerSize());
-        eigen_assert(inner != outer);
-
-        if (IsRowMajor) {
-            const Index minInnerIndex = outer - m_data.lowerProfile(outer);
-            return inner >= minInnerIndex;
-        } else {
-            const Index maxInnerIndex = outer + m_data.lowerProfile(outer);
-            return inner <= maxInnerIndex;
-        }
-    }
-
-    inline Scalar& coeffRefUpper(Index row, Index col) {
-        const Index outer = IsRowMajor ? row : col;
-        const Index inner = IsRowMajor ? col : row;
-
-        eigen_assert(outer < outerSize());
-        eigen_assert(inner < innerSize());
-        eigen_assert(inner != outer);
-
-        if (IsRowMajor) {
-            const Index minOuterIndex = inner - m_data.upperProfile(inner);
-            eigen_assert(outer >= minOuterIndex && "You tried to access a coeff that does not exist in the storage");
-            return this->m_data.upper(m_colStartIndex[inner] + outer - (inner - m_data.upperProfile(inner)));
-        } else {
-            const Index maxOuterIndex = inner + m_data.upperProfile(inner);
-            eigen_assert(outer <= maxOuterIndex && "You tried to access a coeff that does not exist in the storage");
-            return this->m_data.upper(m_colStartIndex[inner] + (outer - inner));
-        }
-    }
-
-    inline bool coeffExistUpper(Index row, Index col) {
-        const Index outer = IsRowMajor ? row : col;
-        const Index inner = IsRowMajor ? col : row;
-
-        eigen_assert(outer < outerSize());
-        eigen_assert(inner < innerSize());
-        eigen_assert(inner != outer);
-
-        if (IsRowMajor) {
-            const Index minOuterIndex = inner - m_data.upperProfile(inner);
-            return outer >= minOuterIndex;
-        } else {
-            const Index maxOuterIndex = inner + m_data.upperProfile(inner);
-            return outer <= maxOuterIndex;
-        }
-    }
-
-
-protected:
-
-public:
-    class InnerUpperIterator;
-    class InnerLowerIterator;
-
-    class OuterUpperIterator;
-    class OuterLowerIterator;
-
-    /** Removes all non zeros */
-    inline void setZero() {
-        m_data.clear();
-        std::fill_n(m_colStartIndex, m_outerSize + 1, Index(0));
-        std::fill_n(m_rowStartIndex, m_outerSize + 1, Index(0));
-    }
-
-    /** \returns the number of non zero coefficients */
-    inline Index nonZeros() const {
-        return m_data.diagSize() + m_data.upperSize() + m_data.lowerSize();
-    }
-
-    /** Preallocates \a reserveSize non zeros */
-    inline void reserve(Index reserveSize, Index reserveUpperSize, Index reserveLowerSize) {
-        m_data.reserve(reserveSize, reserveUpperSize, reserveLowerSize);
-    }
-
-    /** \returns a reference to a novel non zero coefficient with coordinates \a row x \a col.
-
-     *
-     * \warning This function can be extremely slow if the non zero coefficients
-     * are not inserted in a coherent order.
-     *
-     * After an insertion session, you should call the finalize() function.
-     */
-    EIGEN_DONT_INLINE Scalar & insert(Index row, Index col) {
-        const Index outer = IsRowMajor ? row : col;
-        const Index inner = IsRowMajor ? col : row;
-
-        eigen_assert(outer < outerSize());
-        eigen_assert(inner < innerSize());
-
-        if (outer == inner)
-            return m_data.diag(col);
-
-        if (IsRowMajor) {
-            if (outer < inner) //upper matrix
-            {
-                Index minOuterIndex = 0;
-                minOuterIndex = inner - m_data.upperProfile(inner);
-
-                if (outer < minOuterIndex) //The value does not yet exist
-                {
-                    const Index previousProfile = m_data.upperProfile(inner);
-
-                    m_data.upperProfile(inner) = inner - outer;
-
-
-                    const Index bandIncrement = m_data.upperProfile(inner) - previousProfile;
-                    //shift data stored after this new one
-                    const Index stop = m_colStartIndex[cols()];
-                    const Index start = m_colStartIndex[inner];
-
-
-                    for (Index innerIdx = stop; innerIdx >= start; innerIdx--) {
-                        m_data.upper(innerIdx + bandIncrement) = m_data.upper(innerIdx);
-                    }
-
-                    for (Index innerIdx = cols(); innerIdx > inner; innerIdx--) {
-                        m_colStartIndex[innerIdx] += bandIncrement;
-                    }
-
-                    //zeros new data
-                    std::fill_n(this->_upperPtr() + start, bandIncrement - 1, Scalar(0));
-
-                    return m_data.upper(m_colStartIndex[inner]);
-                } else {
-                    return m_data.upper(m_colStartIndex[inner] + outer - (inner - m_data.upperProfile(inner)));
-                }
-            }
-
-            if (outer > inner) //lower matrix
-            {
-                const Index minInnerIndex = outer - m_data.lowerProfile(outer);
-                if (inner < minInnerIndex) //The value does not yet exist
-                {
-                    const Index previousProfile = m_data.lowerProfile(outer);
-                    m_data.lowerProfile(outer) = outer - inner;
-
-                    const Index bandIncrement = m_data.lowerProfile(outer) - previousProfile;
-                    //shift data stored after this new one
-                    const Index stop = m_rowStartIndex[rows()];
-                    const Index start = m_rowStartIndex[outer];
-
-
-                    for (Index innerIdx = stop; innerIdx >= start; innerIdx--) {
-                        m_data.lower(innerIdx + bandIncrement) = m_data.lower(innerIdx);
-                    }
-
-                    for (Index innerIdx = rows(); innerIdx > outer; innerIdx--) {
-                        m_rowStartIndex[innerIdx] += bandIncrement;
-                    }
-
-                    //zeros new data
-                    std::fill_n(this->_lowerPtr() + start, bandIncrement - 1, Scalar(0));
-                    return m_data.lower(m_rowStartIndex[outer]);
-                } else {
-                    return m_data.lower(m_rowStartIndex[outer] + inner - (outer - m_data.lowerProfile(outer)));
-                }
-            }
-        } else {
-            if (outer > inner) //upper matrix
-            {
-                const Index maxOuterIndex = inner + m_data.upperProfile(inner);
-                if (outer > maxOuterIndex) //The value does not yet exist
-                {
-                    const Index previousProfile = m_data.upperProfile(inner);
-                    m_data.upperProfile(inner) = outer - inner;
-
-                    const Index bandIncrement = m_data.upperProfile(inner) - previousProfile;
-                    //shift data stored after this new one
-                    const Index stop = m_rowStartIndex[rows()];
-                    const Index start = m_rowStartIndex[inner + 1];
-
-                    for (Index innerIdx = stop; innerIdx >= start; innerIdx--) {
-                        m_data.upper(innerIdx + bandIncrement) = m_data.upper(innerIdx);
-                    }
-
-                    for (Index innerIdx = inner + 1; innerIdx < outerSize() + 1; innerIdx++) {
-                        m_rowStartIndex[innerIdx] += bandIncrement;
-                    }
-                    std::fill_n(this->_upperPtr() + m_rowStartIndex[inner] + previousProfile + 1, bandIncrement - 1, Scalar(0));
-                    return m_data.upper(m_rowStartIndex[inner] + m_data.upperProfile(inner));
-                } else {
-                    return m_data.upper(m_rowStartIndex[inner] + (outer - inner));
-                }
-            }
-
-            if (outer < inner) //lower matrix
-            {
-                const Index maxInnerIndex = outer + m_data.lowerProfile(outer);
-                if (inner > maxInnerIndex) //The value does not yet exist
-                {
-                    const Index previousProfile = m_data.lowerProfile(outer);
-                    m_data.lowerProfile(outer) = inner - outer;
-
-                    const Index bandIncrement = m_data.lowerProfile(outer) - previousProfile;
-                    //shift data stored after this new one
-                    const Index stop = m_colStartIndex[cols()];
-                    const Index start = m_colStartIndex[outer + 1];
-
-                    for (Index innerIdx = stop; innerIdx >= start; innerIdx--) {
-                        m_data.lower(innerIdx + bandIncrement) = m_data.lower(innerIdx);
-                    }
-
-                    for (Index innerIdx = outer + 1; innerIdx < outerSize() + 1; innerIdx++) {
-                        m_colStartIndex[innerIdx] += bandIncrement;
-                    }
-                    std::fill_n(this->_lowerPtr() + m_colStartIndex[outer] + previousProfile + 1, bandIncrement - 1, Scalar(0));
-                    return m_data.lower(m_colStartIndex[outer] + m_data.lowerProfile(outer));
-                } else {
-                    return m_data.lower(m_colStartIndex[outer] + (inner - outer));
-                }
-            }
-        }
-    }
-
-    /** Must be called after inserting a set of non zero entries.
-     */
-    inline void finalize() {
-        if (IsRowMajor) {
-            if (rows() > cols())
-                m_data.resize(cols(), cols(), rows(), m_colStartIndex[cols()] + 1, m_rowStartIndex[rows()] + 1);
-            else
-                m_data.resize(rows(), cols(), rows(), m_colStartIndex[cols()] + 1, m_rowStartIndex[rows()] + 1);
-
-            //            eigen_assert(rows() == cols() && "memory reorganisatrion only works with suare matrix");
-            //
-            //            Scalar* newArray = new Scalar[m_colStartIndex[cols()] + 1 + m_rowStartIndex[rows()] + 1];
-            //            Index dataIdx = 0;
-            //            for (Index row = 0; row < rows(); row++) {
-            //
-            //                const Index nbLowerElts = m_rowStartIndex[row + 1] - m_rowStartIndex[row];
-            //                //                std::cout << "nbLowerElts" << nbLowerElts << std::endl;
-            //                memcpy(newArray + dataIdx, m_data.m_lower + m_rowStartIndex[row], nbLowerElts * sizeof (Scalar));
-            //                m_rowStartIndex[row] = dataIdx;
-            //                dataIdx += nbLowerElts;
-            //
-            //                const Index nbUpperElts = m_colStartIndex[row + 1] - m_colStartIndex[row];
-            //                memcpy(newArray + dataIdx, m_data.m_upper + m_colStartIndex[row], nbUpperElts * sizeof (Scalar));
-            //                m_colStartIndex[row] = dataIdx;
-            //                dataIdx += nbUpperElts;
-            //
-            //
-            //            }
-            //            //todo : don't access m_data profile directly : add an accessor from SkylineMatrix
-            //            m_rowStartIndex[rows()] = m_rowStartIndex[rows()-1] + m_data.lowerProfile(rows()-1);
-            //            m_colStartIndex[cols()] = m_colStartIndex[cols()-1] + m_data.upperProfile(cols()-1);
-            //
-            //            delete[] m_data.m_lower;
-            //            delete[] m_data.m_upper;
-            //
-            //            m_data.m_lower = newArray;
-            //            m_data.m_upper = newArray;
-        } else {
-            if (rows() > cols())
-                m_data.resize(cols(), rows(), cols(), m_rowStartIndex[cols()] + 1, m_colStartIndex[cols()] + 1);
-            else
-                m_data.resize(rows(), rows(), cols(), m_rowStartIndex[rows()] + 1, m_colStartIndex[rows()] + 1);
-        }
-    }
-
-    inline void squeeze() {
-        finalize();
-        m_data.squeeze();
-    }
-
-    void prune(Scalar reference, RealScalar epsilon = dummy_precision<RealScalar > ()) {
-        //TODO
-    }
-
-    /** Resizes the matrix to a \a rows x \a cols matrix and initializes it to zero
-     * \sa resizeNonZeros(Index), reserve(), setZero()
-     */
-    void resize(size_t rows, size_t cols) {
-        const Index diagSize = rows > cols ? cols : rows;
-        m_innerSize = IsRowMajor ? cols : rows;
-
-        eigen_assert(rows == cols && "Skyline matrix must be square matrix");
-
-        if (diagSize % 2) { // diagSize is odd
-            const Index k = (diagSize - 1) / 2;
-
-            m_data.resize(diagSize, IsRowMajor ? cols : rows, IsRowMajor ? rows : cols,
-                    2 * k * k + k + 1,
-                    2 * k * k + k + 1);
-
-        } else // diagSize is even
+        if (outer < minOuterIndex)  // The value does not yet exist
         {
-            const Index k = diagSize / 2;
-            m_data.resize(diagSize, IsRowMajor ? cols : rows, IsRowMajor ? rows : cols,
-                    2 * k * k - k + 1,
-                    2 * k * k - k + 1);
-        }
+          const Index previousProfile = m_data.upperProfile(inner);
 
-        if (m_colStartIndex && m_rowStartIndex) {
-            delete[] m_colStartIndex;
-            delete[] m_rowStartIndex;
-        }
-        m_colStartIndex = new Index [cols + 1];
-        m_rowStartIndex = new Index [rows + 1];
-        m_outerSize = diagSize;
+          m_data.upperProfile(inner) = inner - outer;
 
-        m_data.reset();
-        m_data.clear();
+          const Index bandIncrement = m_data.upperProfile(inner) - previousProfile;
+          // shift data stored after this new one
+          const Index stop = m_colStartIndex[cols()];
+          const Index start = m_colStartIndex[inner];
 
-        m_outerSize = diagSize;
-        std::fill_n(m_colStartIndex, cols + 1, Index(0));
-        std::fill_n(m_rowStartIndex, rows + 1, Index(0));
-    }
+          for (Index innerIdx = stop; innerIdx >= start; innerIdx--) {
+            m_data.upper(innerIdx + bandIncrement) = m_data.upper(innerIdx);
+          }
 
-    void resizeNonZeros(Index size) {
-        m_data.resize(size);
-    }
+          for (Index innerIdx = cols(); innerIdx > inner; innerIdx--) {
+            m_colStartIndex[innerIdx] += bandIncrement;
+          }
 
-    inline SkylineMatrix()
-    : m_outerSize(-1), m_innerSize(0), m_colStartIndex(0), m_rowStartIndex(0) {
-        resize(0, 0);
-    }
+          // zeros new data
+          std::fill_n(this->_upperPtr() + start, bandIncrement - 1, Scalar(0));
 
-    inline SkylineMatrix(size_t rows, size_t cols)
-    : m_outerSize(0), m_innerSize(0), m_colStartIndex(0), m_rowStartIndex(0) {
-        resize(rows, cols);
-    }
-
-    template<typename OtherDerived>
-    inline SkylineMatrix(const SkylineMatrixBase<OtherDerived>& other)
-    : m_outerSize(0), m_innerSize(0), m_colStartIndex(0), m_rowStartIndex(0) {
-        *this = other.derived();
-    }
-
-    inline SkylineMatrix(const SkylineMatrix & other)
-    : Base(), m_outerSize(0), m_innerSize(0), m_colStartIndex(0), m_rowStartIndex(0) {
-        *this = other.derived();
-    }
-
-    inline void swap(SkylineMatrix & other) {
-        //EIGEN_DBG_SKYLINE(std::cout << "SkylineMatrix:: swap\n");
-        std::swap(m_colStartIndex, other.m_colStartIndex);
-        std::swap(m_rowStartIndex, other.m_rowStartIndex);
-        std::swap(m_innerSize, other.m_innerSize);
-        std::swap(m_outerSize, other.m_outerSize);
-        m_data.swap(other.m_data);
-    }
-
-    inline SkylineMatrix & operator=(const SkylineMatrix & other) {
-        std::cout << "SkylineMatrix& operator=(const SkylineMatrix& other)\n";
-        if (other.isRValue()) {
-            swap(other.const_cast_derived());
+          return m_data.upper(m_colStartIndex[inner]);
         } else {
-            resize(other.rows(), other.cols());
-            memcpy(m_colStartIndex, other.m_colStartIndex, (m_outerSize + 1) * sizeof (Index));
-            memcpy(m_rowStartIndex, other.m_rowStartIndex, (m_outerSize + 1) * sizeof (Index));
-            m_data = other.m_data;
+          return m_data.upper(m_colStartIndex[inner] + outer - (inner - m_data.upperProfile(inner)));
         }
-        return *this;
-    }
+      }
 
-    template<typename OtherDerived>
-            inline SkylineMatrix & operator=(const SkylineMatrixBase<OtherDerived>& other) {
-        const bool needToTranspose = (Flags & RowMajorBit) != (OtherDerived::Flags & RowMajorBit);
-        if (needToTranspose) {
-            //         TODO
-            //            return *this;
+      if (outer > inner)  // lower matrix
+      {
+        const Index minInnerIndex = outer - m_data.lowerProfile(outer);
+        if (inner < minInnerIndex)  // The value does not yet exist
+        {
+          const Index previousProfile = m_data.lowerProfile(outer);
+          m_data.lowerProfile(outer) = outer - inner;
+
+          const Index bandIncrement = m_data.lowerProfile(outer) - previousProfile;
+          // shift data stored after this new one
+          const Index stop = m_rowStartIndex[rows()];
+          const Index start = m_rowStartIndex[outer];
+
+          for (Index innerIdx = stop; innerIdx >= start; innerIdx--) {
+            m_data.lower(innerIdx + bandIncrement) = m_data.lower(innerIdx);
+          }
+
+          for (Index innerIdx = rows(); innerIdx > outer; innerIdx--) {
+            m_rowStartIndex[innerIdx] += bandIncrement;
+          }
+
+          // zeros new data
+          std::fill_n(this->_lowerPtr() + start, bandIncrement - 1, Scalar(0));
+          return m_data.lower(m_rowStartIndex[outer]);
         } else {
-            // there is no special optimization
-            return SkylineMatrixBase<SkylineMatrix>::operator=(other.derived());
+          return m_data.lower(m_rowStartIndex[outer] + inner - (outer - m_data.lowerProfile(outer)));
         }
+      }
+    } else {
+      if (outer > inner)  // upper matrix
+      {
+        const Index maxOuterIndex = inner + m_data.upperProfile(inner);
+        if (outer > maxOuterIndex)  // The value does not yet exist
+        {
+          const Index previousProfile = m_data.upperProfile(inner);
+          m_data.upperProfile(inner) = outer - inner;
+
+          const Index bandIncrement = m_data.upperProfile(inner) - previousProfile;
+          // shift data stored after this new one
+          const Index stop = m_rowStartIndex[rows()];
+          const Index start = m_rowStartIndex[inner + 1];
+
+          for (Index innerIdx = stop; innerIdx >= start; innerIdx--) {
+            m_data.upper(innerIdx + bandIncrement) = m_data.upper(innerIdx);
+          }
+
+          for (Index innerIdx = inner + 1; innerIdx < outerSize() + 1; innerIdx++) {
+            m_rowStartIndex[innerIdx] += bandIncrement;
+          }
+          std::fill_n(this->_upperPtr() + m_rowStartIndex[inner] + previousProfile + 1, bandIncrement - 1, Scalar(0));
+          return m_data.upper(m_rowStartIndex[inner] + m_data.upperProfile(inner));
+        } else {
+          return m_data.upper(m_rowStartIndex[inner] + (outer - inner));
+        }
+      }
+
+      if (outer < inner)  // lower matrix
+      {
+        const Index maxInnerIndex = outer + m_data.lowerProfile(outer);
+        if (inner > maxInnerIndex)  // The value does not yet exist
+        {
+          const Index previousProfile = m_data.lowerProfile(outer);
+          m_data.lowerProfile(outer) = inner - outer;
+
+          const Index bandIncrement = m_data.lowerProfile(outer) - previousProfile;
+          // shift data stored after this new one
+          const Index stop = m_colStartIndex[cols()];
+          const Index start = m_colStartIndex[outer + 1];
+
+          for (Index innerIdx = stop; innerIdx >= start; innerIdx--) {
+            m_data.lower(innerIdx + bandIncrement) = m_data.lower(innerIdx);
+          }
+
+          for (Index innerIdx = outer + 1; innerIdx < outerSize() + 1; innerIdx++) {
+            m_colStartIndex[innerIdx] += bandIncrement;
+          }
+          std::fill_n(this->_lowerPtr() + m_colStartIndex[outer] + previousProfile + 1, bandIncrement - 1, Scalar(0));
+          return m_data.lower(m_colStartIndex[outer] + m_data.lowerProfile(outer));
+        } else {
+          return m_data.lower(m_colStartIndex[outer] + (inner - outer));
+        }
+      }
+    }
+  }
+
+  /** Must be called after inserting a set of non zero entries.
+   */
+  inline void finalize() {
+    if (IsRowMajor) {
+      if (rows() > cols())
+        m_data.resize(cols(), cols(), rows(), m_colStartIndex[cols()] + 1, m_rowStartIndex[rows()] + 1);
+      else
+        m_data.resize(rows(), cols(), rows(), m_colStartIndex[cols()] + 1, m_rowStartIndex[rows()] + 1);
+
+      //            eigen_assert(rows() == cols() && "memory reorganisatrion only works with suare matrix");
+      //
+      //            Scalar* newArray = new Scalar[m_colStartIndex[cols()] + 1 + m_rowStartIndex[rows()] + 1];
+      //            Index dataIdx = 0;
+      //            for (Index row = 0; row < rows(); row++) {
+      //
+      //                const Index nbLowerElts = m_rowStartIndex[row + 1] - m_rowStartIndex[row];
+      //                //                std::cout << "nbLowerElts" << nbLowerElts << std::endl;
+      //                memcpy(newArray + dataIdx, m_data.m_lower + m_rowStartIndex[row], nbLowerElts * sizeof
+      //                (Scalar)); m_rowStartIndex[row] = dataIdx; dataIdx += nbLowerElts;
+      //
+      //                const Index nbUpperElts = m_colStartIndex[row + 1] - m_colStartIndex[row];
+      //                memcpy(newArray + dataIdx, m_data.m_upper + m_colStartIndex[row], nbUpperElts * sizeof
+      //                (Scalar)); m_colStartIndex[row] = dataIdx; dataIdx += nbUpperElts;
+      //
+      //
+      //            }
+      //            //todo : don't access m_data profile directly : add an accessor from SkylineMatrix
+      //            m_rowStartIndex[rows()] = m_rowStartIndex[rows()-1] + m_data.lowerProfile(rows()-1);
+      //            m_colStartIndex[cols()] = m_colStartIndex[cols()-1] + m_data.upperProfile(cols()-1);
+      //
+      //            delete[] m_data.m_lower;
+      //            delete[] m_data.m_upper;
+      //
+      //            m_data.m_lower = newArray;
+      //            m_data.m_upper = newArray;
+    } else {
+      if (rows() > cols())
+        m_data.resize(cols(), rows(), cols(), m_rowStartIndex[cols()] + 1, m_colStartIndex[cols()] + 1);
+      else
+        m_data.resize(rows(), rows(), cols(), m_rowStartIndex[rows()] + 1, m_colStartIndex[rows()] + 1);
+    }
+  }
+
+  inline void squeeze() {
+    finalize();
+    m_data.squeeze();
+  }
+
+  void prune(Scalar reference, RealScalar epsilon = dummy_precision<RealScalar>()) {
+    // TODO
+  }
+
+  /** Resizes the matrix to a \a rows x \a cols matrix and initializes it to zero
+   * \sa resizeNonZeros(Index), reserve(), setZero()
+   */
+  void resize(size_t rows, size_t cols) {
+    const Index diagSize = rows > cols ? cols : rows;
+    m_innerSize = IsRowMajor ? cols : rows;
+
+    eigen_assert(rows == cols && "Skyline matrix must be square matrix");
+
+    if (diagSize % 2) {  // diagSize is odd
+      const Index k = (diagSize - 1) / 2;
+
+      m_data.resize(diagSize, IsRowMajor ? cols : rows, IsRowMajor ? rows : cols, 2 * k * k + k + 1, 2 * k * k + k + 1);
+
+    } else  // diagSize is even
+    {
+      const Index k = diagSize / 2;
+      m_data.resize(diagSize, IsRowMajor ? cols : rows, IsRowMajor ? rows : cols, 2 * k * k - k + 1, 2 * k * k - k + 1);
     }
 
-    friend std::ostream & operator <<(std::ostream & s, const SkylineMatrix & m) {
+    if (m_colStartIndex && m_rowStartIndex) {
+      delete[] m_colStartIndex;
+      delete[] m_rowStartIndex;
+    }
+    m_colStartIndex = new Index[cols + 1];
+    m_rowStartIndex = new Index[rows + 1];
+    m_outerSize = diagSize;
 
-        EIGEN_DBG_SKYLINE(
+    m_data.reset();
+    m_data.clear();
+
+    m_outerSize = diagSize;
+    std::fill_n(m_colStartIndex, cols + 1, Index(0));
+    std::fill_n(m_rowStartIndex, rows + 1, Index(0));
+  }
+
+  void resizeNonZeros(Index size) { m_data.resize(size); }
+
+  inline SkylineMatrix() : m_outerSize(-1), m_innerSize(0), m_colStartIndex(0), m_rowStartIndex(0) { resize(0, 0); }
+
+  inline SkylineMatrix(size_t rows, size_t cols)
+      : m_outerSize(0), m_innerSize(0), m_colStartIndex(0), m_rowStartIndex(0) {
+    resize(rows, cols);
+  }
+
+  template <typename OtherDerived>
+  inline SkylineMatrix(const SkylineMatrixBase<OtherDerived>& other)
+      : m_outerSize(0), m_innerSize(0), m_colStartIndex(0), m_rowStartIndex(0) {
+    *this = other.derived();
+  }
+
+  inline SkylineMatrix(const SkylineMatrix& other)
+      : Base(), m_outerSize(0), m_innerSize(0), m_colStartIndex(0), m_rowStartIndex(0) {
+    *this = other.derived();
+  }
+
+  inline void swap(SkylineMatrix& other) {
+    // EIGEN_DBG_SKYLINE(std::cout << "SkylineMatrix:: swap\n");
+    std::swap(m_colStartIndex, other.m_colStartIndex);
+    std::swap(m_rowStartIndex, other.m_rowStartIndex);
+    std::swap(m_innerSize, other.m_innerSize);
+    std::swap(m_outerSize, other.m_outerSize);
+    m_data.swap(other.m_data);
+  }
+
+  inline SkylineMatrix& operator=(const SkylineMatrix& other) {
+    std::cout << "SkylineMatrix& operator=(const SkylineMatrix& other)\n";
+    if (other.isRValue()) {
+      swap(other.const_cast_derived());
+    } else {
+      resize(other.rows(), other.cols());
+      memcpy(m_colStartIndex, other.m_colStartIndex, (m_outerSize + 1) * sizeof(Index));
+      memcpy(m_rowStartIndex, other.m_rowStartIndex, (m_outerSize + 1) * sizeof(Index));
+      m_data = other.m_data;
+    }
+    return *this;
+  }
+
+  template <typename OtherDerived>
+  inline SkylineMatrix& operator=(const SkylineMatrixBase<OtherDerived>& other) {
+    const bool needToTranspose = (Flags & RowMajorBit) != (OtherDerived::Flags & RowMajorBit);
+    if (needToTranspose) {
+      //         TODO
+      //            return *this;
+    } else {
+      // there is no special optimization
+      return SkylineMatrixBase<SkylineMatrix>::operator=(other.derived());
+    }
+  }
+
+  friend std::ostream& operator<<(std::ostream& s, const SkylineMatrix& m) {
+    EIGEN_DBG_SKYLINE(
         std::cout << "upper elements : " << std::endl;
-        for (Index i = 0; i < m.m_data.upperSize(); i++)
-            std::cout << m.m_data.upper(i) << "\t";
-        std::cout << std::endl;
+        for (Index i = 0; i < m.m_data.upperSize(); i++) std::cout << m.m_data.upper(i) << "\t"; std::cout << std::endl;
         std::cout << "upper profile : " << std::endl;
-        for (Index i = 0; i < m.m_data.upperProfileSize(); i++)
-            std::cout << m.m_data.upperProfile(i) << "\t";
+        for (Index i = 0; i < m.m_data.upperProfileSize(); i++) std::cout << m.m_data.upperProfile(i) << "\t";
+        std::cout << std::endl; std::cout << "lower startIdx : " << std::endl;
+        for (Index i = 0; i < m.m_data.upperProfileSize(); i++) std::cout
+        << (IsRowMajor ? m.m_colStartIndex[i] : m.m_rowStartIndex[i]) << "\t";
         std::cout << std::endl;
-        std::cout << "lower startIdx : " << std::endl;
-        for (Index i = 0; i < m.m_data.upperProfileSize(); i++)
-            std::cout << (IsRowMajor ? m.m_colStartIndex[i] : m.m_rowStartIndex[i]) << "\t";
-        std::cout << std::endl;
-
 
         std::cout << "lower elements : " << std::endl;
-        for (Index i = 0; i < m.m_data.lowerSize(); i++)
-            std::cout << m.m_data.lower(i) << "\t";
-        std::cout << std::endl;
+        for (Index i = 0; i < m.m_data.lowerSize(); i++) std::cout << m.m_data.lower(i) << "\t"; std::cout << std::endl;
         std::cout << "lower profile : " << std::endl;
-        for (Index i = 0; i < m.m_data.lowerProfileSize(); i++)
-            std::cout << m.m_data.lowerProfile(i) << "\t";
-        std::cout << std::endl;
-        std::cout << "lower startIdx : " << std::endl;
-        for (Index i = 0; i < m.m_data.lowerProfileSize(); i++)
-            std::cout << (IsRowMajor ? m.m_rowStartIndex[i] : m.m_colStartIndex[i]) << "\t";
-        std::cout << std::endl;
-        );
-        for (Index rowIdx = 0; rowIdx < m.rows(); rowIdx++) {
-            for (Index colIdx = 0; colIdx < m.cols(); colIdx++) {
-                s << m.coeff(rowIdx, colIdx) << "\t";
-            }
-            s << std::endl;
-        }
-        return s;
+        for (Index i = 0; i < m.m_data.lowerProfileSize(); i++) std::cout << m.m_data.lowerProfile(i) << "\t";
+        std::cout << std::endl; std::cout << "lower startIdx : " << std::endl;
+        for (Index i = 0; i < m.m_data.lowerProfileSize(); i++) std::cout
+        << (IsRowMajor ? m.m_rowStartIndex[i] : m.m_colStartIndex[i]) << "\t";
+        std::cout << std::endl;);
+    for (Index rowIdx = 0; rowIdx < m.rows(); rowIdx++) {
+      for (Index colIdx = 0; colIdx < m.cols(); colIdx++) {
+        s << m.coeff(rowIdx, colIdx) << "\t";
+      }
+      s << std::endl;
     }
+    return s;
+  }
 
-    /** Destructor */
-    inline ~SkylineMatrix() {
-        delete[] m_colStartIndex;
-        delete[] m_rowStartIndex;
-    }
+  /** Destructor */
+  inline ~SkylineMatrix() {
+    delete[] m_colStartIndex;
+    delete[] m_rowStartIndex;
+  }
 
-    /** Overloaded for performance */
-    Scalar sum() const;
+  /** Overloaded for performance */
+  Scalar sum() const;
 };
 
-template<typename Scalar, int Options_>
+template <typename Scalar, int Options_>
 class SkylineMatrix<Scalar, Options_>::InnerUpperIterator {
-public:
+ public:
+  InnerUpperIterator(const SkylineMatrix& mat, Index outer)
+      : m_matrix(mat),
+        m_outer(outer),
+        m_id(Options_ == RowMajor ? mat.m_colStartIndex[outer] : mat.m_rowStartIndex[outer] + 1),
+        m_start(m_id),
+        m_end(Options_ == RowMajor ? mat.m_colStartIndex[outer + 1] : mat.m_rowStartIndex[outer + 1] + 1) {}
 
-    InnerUpperIterator(const SkylineMatrix& mat, Index outer)
-    : m_matrix(mat), m_outer(outer),
-    m_id(Options_ == RowMajor ? mat.m_colStartIndex[outer] : mat.m_rowStartIndex[outer] + 1),
-    m_start(m_id),
-    m_end(Options_ == RowMajor ? mat.m_colStartIndex[outer + 1] : mat.m_rowStartIndex[outer + 1] + 1) {
-    }
+  inline InnerUpperIterator& operator++() {
+    m_id++;
+    return *this;
+  }
 
-    inline InnerUpperIterator & operator++() {
-        m_id++;
-        return *this;
-    }
+  inline InnerUpperIterator& operator+=(Index shift) {
+    m_id += shift;
+    return *this;
+  }
 
-    inline InnerUpperIterator & operator+=(Index shift) {
-        m_id += shift;
-        return *this;
-    }
+  inline Scalar value() const { return m_matrix.m_data.upper(m_id); }
 
-    inline Scalar value() const {
-        return m_matrix.m_data.upper(m_id);
-    }
+  inline Scalar* valuePtr() { return const_cast<Scalar*>(&(m_matrix.m_data.upper(m_id))); }
 
-    inline Scalar* valuePtr() {
-        return const_cast<Scalar*> (&(m_matrix.m_data.upper(m_id)));
-    }
+  inline Scalar& valueRef() { return const_cast<Scalar&>(m_matrix.m_data.upper(m_id)); }
 
-    inline Scalar& valueRef() {
-        return const_cast<Scalar&> (m_matrix.m_data.upper(m_id));
-    }
+  inline Index index() const {
+    return IsRowMajor ? m_outer - m_matrix.m_data.upperProfile(m_outer) + (m_id - m_start)
+                      : m_outer + (m_id - m_start) + 1;
+  }
 
-    inline Index index() const {
-        return IsRowMajor ? m_outer - m_matrix.m_data.upperProfile(m_outer) + (m_id - m_start) :
-                m_outer + (m_id - m_start) + 1;
-    }
+  inline Index row() const { return IsRowMajor ? index() : m_outer; }
 
-    inline Index row() const {
-        return IsRowMajor ? index() : m_outer;
-    }
+  inline Index col() const { return IsRowMajor ? m_outer : index(); }
 
-    inline Index col() const {
-        return IsRowMajor ? m_outer : index();
-    }
+  inline size_t size() const { return m_matrix.m_data.upperProfile(m_outer); }
 
-    inline size_t size() const {
-        return m_matrix.m_data.upperProfile(m_outer);
-    }
+  inline operator bool() const { return (m_id < m_end) && (m_id >= m_start); }
 
-    inline operator bool() const {
-        return (m_id < m_end) && (m_id >= m_start);
-    }
-
-protected:
-    const SkylineMatrix& m_matrix;
-    const Index m_outer;
-    Index m_id;
-    const Index m_start;
-    const Index m_end;
+ protected:
+  const SkylineMatrix& m_matrix;
+  const Index m_outer;
+  Index m_id;
+  const Index m_start;
+  const Index m_end;
 };
 
-template<typename Scalar, int Options_>
+template <typename Scalar, int Options_>
 class SkylineMatrix<Scalar, Options_>::InnerLowerIterator {
-public:
+ public:
+  InnerLowerIterator(const SkylineMatrix& mat, Index outer)
+      : m_matrix(mat),
+        m_outer(outer),
+        m_id(Options_ == RowMajor ? mat.m_rowStartIndex[outer] : mat.m_colStartIndex[outer] + 1),
+        m_start(m_id),
+        m_end(Options_ == RowMajor ? mat.m_rowStartIndex[outer + 1] : mat.m_colStartIndex[outer + 1] + 1) {}
 
-    InnerLowerIterator(const SkylineMatrix& mat, Index outer)
-    : m_matrix(mat),
-    m_outer(outer),
-    m_id(Options_ == RowMajor ? mat.m_rowStartIndex[outer] : mat.m_colStartIndex[outer] + 1),
-    m_start(m_id),
-    m_end(Options_ == RowMajor ? mat.m_rowStartIndex[outer + 1] : mat.m_colStartIndex[outer + 1] + 1) {
-    }
+  inline InnerLowerIterator& operator++() {
+    m_id++;
+    return *this;
+  }
 
-    inline InnerLowerIterator & operator++() {
-        m_id++;
-        return *this;
-    }
+  inline InnerLowerIterator& operator+=(Index shift) {
+    m_id += shift;
+    return *this;
+  }
 
-    inline InnerLowerIterator & operator+=(Index shift) {
-        m_id += shift;
-        return *this;
-    }
+  inline Scalar value() const { return m_matrix.m_data.lower(m_id); }
 
-    inline Scalar value() const {
-        return m_matrix.m_data.lower(m_id);
-    }
+  inline Scalar* valuePtr() { return const_cast<Scalar*>(&(m_matrix.m_data.lower(m_id))); }
 
-    inline Scalar* valuePtr() {
-        return const_cast<Scalar*> (&(m_matrix.m_data.lower(m_id)));
-    }
+  inline Scalar& valueRef() { return const_cast<Scalar&>(m_matrix.m_data.lower(m_id)); }
 
-    inline Scalar& valueRef() {
-        return const_cast<Scalar&> (m_matrix.m_data.lower(m_id));
-    }
+  inline Index index() const {
+    return IsRowMajor ? m_outer - m_matrix.m_data.lowerProfile(m_outer) + (m_id - m_start)
+                      : m_outer + (m_id - m_start) + 1;
+    ;
+  }
 
-    inline Index index() const {
-        return IsRowMajor ? m_outer - m_matrix.m_data.lowerProfile(m_outer) + (m_id - m_start) :
-                m_outer + (m_id - m_start) + 1;
-        ;
-    }
+  inline Index row() const { return IsRowMajor ? m_outer : index(); }
 
-    inline Index row() const {
-        return IsRowMajor ? m_outer : index();
-    }
+  inline Index col() const { return IsRowMajor ? index() : m_outer; }
 
-    inline Index col() const {
-        return IsRowMajor ? index() : m_outer;
-    }
+  inline size_t size() const { return m_matrix.m_data.lowerProfile(m_outer); }
 
-    inline size_t size() const {
-        return m_matrix.m_data.lowerProfile(m_outer);
-    }
+  inline operator bool() const { return (m_id < m_end) && (m_id >= m_start); }
 
-    inline operator bool() const {
-        return (m_id < m_end) && (m_id >= m_start);
-    }
-
-protected:
-    const SkylineMatrix& m_matrix;
-    const Index m_outer;
-    Index m_id;
-    const Index m_start;
-    const Index m_end;
+ protected:
+  const SkylineMatrix& m_matrix;
+  const Index m_outer;
+  Index m_id;
+  const Index m_start;
+  const Index m_end;
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SKYLINEMATRIX_H
+#endif  // EIGEN_SKYLINEMATRIX_H
diff --git a/unsupported/Eigen/src/Skyline/SkylineMatrixBase.h b/unsupported/Eigen/src/Skyline/SkylineMatrixBase.h
index 6a74609..1927458 100644
--- a/unsupported/Eigen/src/Skyline/SkylineMatrixBase.h
+++ b/unsupported/Eigen/src/Skyline/SkylineMatrixBase.h
@@ -26,189 +26,163 @@
  * \param Derived
  *
  */
-template<typename Derived> class SkylineMatrixBase : public EigenBase<Derived> {
-public:
+template <typename Derived>
+class SkylineMatrixBase : public EigenBase<Derived> {
+ public:
+  typedef typename internal::traits<Derived>::Scalar Scalar;
+  typedef typename internal::traits<Derived>::StorageKind StorageKind;
+  typedef typename internal::index<StorageKind>::type Index;
 
-    typedef typename internal::traits<Derived>::Scalar Scalar;
-    typedef typename internal::traits<Derived>::StorageKind StorageKind;
-    typedef typename internal::index<StorageKind>::type Index;
+  enum {
+    RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
+    /**< The number of rows at compile-time. This is just a copy of the value provided
+     * by the \a Derived type. If a value is not known at compile-time,
+     * it is set to the \a Dynamic constant.
+     * \sa MatrixBase::rows(), MatrixBase::cols(), ColsAtCompileTime, SizeAtCompileTime */
 
-    enum {
-        RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
-        /**< The number of rows at compile-time. This is just a copy of the value provided
-         * by the \a Derived type. If a value is not known at compile-time,
-         * it is set to the \a Dynamic constant.
-         * \sa MatrixBase::rows(), MatrixBase::cols(), ColsAtCompileTime, SizeAtCompileTime */
+    ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
+    /**< The number of columns at compile-time. This is just a copy of the value provided
+     * by the \a Derived type. If a value is not known at compile-time,
+     * it is set to the \a Dynamic constant.
+     * \sa MatrixBase::rows(), MatrixBase::cols(), RowsAtCompileTime, SizeAtCompileTime */
 
-        ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
-        /**< The number of columns at compile-time. This is just a copy of the value provided
-         * by the \a Derived type. If a value is not known at compile-time,
-         * it is set to the \a Dynamic constant.
-         * \sa MatrixBase::rows(), MatrixBase::cols(), RowsAtCompileTime, SizeAtCompileTime */
+    SizeAtCompileTime = (internal::size_of_xpr_at_compile_time<Derived>::ret),
+    /**< This is equal to the number of coefficients, i.e. the number of
+     * rows times the number of columns, or to \a Dynamic if this is not
+     * known at compile-time. \sa RowsAtCompileTime, ColsAtCompileTime */
 
+    MaxRowsAtCompileTime = RowsAtCompileTime,
+    MaxColsAtCompileTime = ColsAtCompileTime,
 
-        SizeAtCompileTime = (internal::size_of_xpr_at_compile_time<Derived>::ret),
-        /**< This is equal to the number of coefficients, i.e. the number of
-         * rows times the number of columns, or to \a Dynamic if this is not
-         * known at compile-time. \sa RowsAtCompileTime, ColsAtCompileTime */
+    MaxSizeAtCompileTime = (internal::size_at_compile_time(MaxRowsAtCompileTime, MaxColsAtCompileTime)),
 
-        MaxRowsAtCompileTime = RowsAtCompileTime,
-        MaxColsAtCompileTime = ColsAtCompileTime,
+    IsVectorAtCompileTime = RowsAtCompileTime == 1 || ColsAtCompileTime == 1,
+    /**< This is set to true if either the number of rows or the number of
+     * columns is known at compile-time to be equal to 1. Indeed, in that case,
+     * we are dealing with a column-vector (if there is only one column) or with
+     * a row-vector (if there is only one row). */
 
-        MaxSizeAtCompileTime = (internal::size_at_compile_time(MaxRowsAtCompileTime,
-        MaxColsAtCompileTime)),
+    Flags = internal::traits<Derived>::Flags,
+    /**< This stores expression \ref flags flags which may or may not be inherited by new expressions
+     * constructed from this one. See the \ref flags "list of flags".
+     */
 
-        IsVectorAtCompileTime = RowsAtCompileTime == 1 || ColsAtCompileTime == 1,
-        /**< This is set to true if either the number of rows or the number of
-         * columns is known at compile-time to be equal to 1. Indeed, in that case,
-         * we are dealing with a column-vector (if there is only one column) or with
-         * a row-vector (if there is only one row). */
+    CoeffReadCost = internal::traits<Derived>::CoeffReadCost,
+    /**< This is a rough measure of how expensive it is to read one coefficient from
+     * this expression.
+     */
 
-        Flags = internal::traits<Derived>::Flags,
-        /**< This stores expression \ref flags flags which may or may not be inherited by new expressions
-         * constructed from this one. See the \ref flags "list of flags".
-         */
-
-        CoeffReadCost = internal::traits<Derived>::CoeffReadCost,
-        /**< This is a rough measure of how expensive it is to read one coefficient from
-         * this expression.
-         */
-
-        IsRowMajor = Flags & RowMajorBit ? 1 : 0
-    };
+    IsRowMajor = Flags & RowMajorBit ? 1 : 0
+  };
 
 #ifndef EIGEN_PARSED_BY_DOXYGEN
-    /** This is the "real scalar" type; if the \a Scalar type is already real numbers
-     * (e.g. int, float or double) then \a RealScalar is just the same as \a Scalar. If
-     * \a Scalar is \a std::complex<T> then RealScalar is \a T.
-     *
-     * \sa class NumTraits
-     */
-    typedef typename NumTraits<Scalar>::Real RealScalar;
+  /** This is the "real scalar" type; if the \a Scalar type is already real numbers
+   * (e.g. int, float or double) then \a RealScalar is just the same as \a Scalar. If
+   * \a Scalar is \a std::complex<T> then RealScalar is \a T.
+   *
+   * \sa class NumTraits
+   */
+  typedef typename NumTraits<Scalar>::Real RealScalar;
 
-    /** type of the equivalent square matrix */
-    typedef Matrix<Scalar, internal::max_size_prefer_dynamic(RowsAtCompileTime, ColsAtCompileTime),
-                           internal::max_size_prefer_dynamic(RowsAtCompileTime, ColsAtCompileTime) > SquareMatrixType;
+  /** type of the equivalent square matrix */
+  typedef Matrix<Scalar, internal::max_size_prefer_dynamic(RowsAtCompileTime, ColsAtCompileTime),
+                 internal::max_size_prefer_dynamic(RowsAtCompileTime, ColsAtCompileTime)>
+      SquareMatrixType;
 
-    inline const Derived& derived() const {
-        return *static_cast<const Derived*> (this);
-    }
+  inline const Derived& derived() const { return *static_cast<const Derived*>(this); }
 
-    inline Derived& derived() {
-        return *static_cast<Derived*> (this);
-    }
+  inline Derived& derived() { return *static_cast<Derived*>(this); }
 
-    inline Derived& const_cast_derived() const {
-        return *static_cast<Derived*> (const_cast<SkylineMatrixBase*> (this));
-    }
-#endif // not EIGEN_PARSED_BY_DOXYGEN
+  inline Derived& const_cast_derived() const { return *static_cast<Derived*>(const_cast<SkylineMatrixBase*>(this)); }
+#endif  // not EIGEN_PARSED_BY_DOXYGEN
 
-    /** \returns the number of rows. \sa cols(), RowsAtCompileTime */
-    inline EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT {
-        return derived().rows();
-    }
+  /** \returns the number of rows. \sa cols(), RowsAtCompileTime */
+  inline EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return derived().rows(); }
 
-    /** \returns the number of columns. \sa rows(), ColsAtCompileTime*/
-    inline EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT {
-        return derived().cols();
-    }
+  /** \returns the number of columns. \sa rows(), ColsAtCompileTime*/
+  inline EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return derived().cols(); }
 
-    /** \returns the number of coefficients, which is \a rows()*cols().
-     * \sa rows(), cols(), SizeAtCompileTime. */
-    inline EIGEN_CONSTEXPR Index size() const EIGEN_NOEXCEPT {
-        return rows() * cols();
-    }
+  /** \returns the number of coefficients, which is \a rows()*cols().
+   * \sa rows(), cols(), SizeAtCompileTime. */
+  inline EIGEN_CONSTEXPR Index size() const EIGEN_NOEXCEPT { return rows() * cols(); }
 
-    /** \returns the number of nonzero coefficients which is in practice the number
-     * of stored coefficients. */
-    inline Index nonZeros() const {
-        return derived().nonZeros();
-    }
+  /** \returns the number of nonzero coefficients which is in practice the number
+   * of stored coefficients. */
+  inline Index nonZeros() const { return derived().nonZeros(); }
 
-    /** \returns the size of the storage major dimension,
-     * i.e., the number of columns for a columns major matrix, and the number of rows otherwise */
-    Index outerSize() const {
-        return (int(Flags) & RowMajorBit) ? this->rows() : this->cols();
-    }
+  /** \returns the size of the storage major dimension,
+   * i.e., the number of columns for a columns major matrix, and the number of rows otherwise */
+  Index outerSize() const { return (int(Flags) & RowMajorBit) ? this->rows() : this->cols(); }
 
-    /** \returns the size of the inner dimension according to the storage order,
-     * i.e., the number of rows for a columns major matrix, and the number of cols otherwise */
-    Index innerSize() const {
-        return (int(Flags) & RowMajorBit) ? this->cols() : this->rows();
-    }
+  /** \returns the size of the inner dimension according to the storage order,
+   * i.e., the number of rows for a columns major matrix, and the number of cols otherwise */
+  Index innerSize() const { return (int(Flags) & RowMajorBit) ? this->cols() : this->rows(); }
 
-    bool isRValue() const {
-        return m_isRValue;
-    }
+  bool isRValue() const { return m_isRValue; }
 
-    Derived& markAsRValue() {
-        m_isRValue = true;
-        return derived();
-    }
+  Derived& markAsRValue() {
+    m_isRValue = true;
+    return derived();
+  }
 
-    SkylineMatrixBase() : m_isRValue(false) {
-        /* TODO check flags */
-    }
+  SkylineMatrixBase() : m_isRValue(false) { /* TODO check flags */
+  }
 
-    inline Derived & operator=(const Derived& other) {
-        this->operator=<Derived > (other);
-        return derived();
-    }
+  inline Derived& operator=(const Derived& other) {
+    this->operator= <Derived>(other);
+    return derived();
+  }
 
-    template<typename OtherDerived>
-    inline void assignGeneric(const OtherDerived& other) {
-        derived().resize(other.rows(), other.cols());
-        for (Index row = 0; row < rows(); row++)
-            for (Index col = 0; col < cols(); col++) {
-                if (other.coeff(row, col) != Scalar(0))
-                    derived().insert(row, col) = other.coeff(row, col);
-            }
-        derived().finalize();
-    }
+  template <typename OtherDerived>
+  inline void assignGeneric(const OtherDerived& other) {
+    derived().resize(other.rows(), other.cols());
+    for (Index row = 0; row < rows(); row++)
+      for (Index col = 0; col < cols(); col++) {
+        if (other.coeff(row, col) != Scalar(0)) derived().insert(row, col) = other.coeff(row, col);
+      }
+    derived().finalize();
+  }
 
-    template<typename OtherDerived>
-            inline Derived & operator=(const SkylineMatrixBase<OtherDerived>& other) {
-        //TODO
-    }
+  template <typename OtherDerived>
+  inline Derived& operator=(const SkylineMatrixBase<OtherDerived>& other) {
+    // TODO
+  }
 
-    template<typename Lhs, typename Rhs>
-            inline Derived & operator=(const SkylineProduct<Lhs, Rhs, SkylineTimeSkylineProduct>& product);
+  template <typename Lhs, typename Rhs>
+  inline Derived& operator=(const SkylineProduct<Lhs, Rhs, SkylineTimeSkylineProduct>& product);
 
-    friend std::ostream & operator <<(std::ostream & s, const SkylineMatrixBase& m) {
-        s << m.derived();
-        return s;
-    }
+  friend std::ostream& operator<<(std::ostream& s, const SkylineMatrixBase& m) {
+    s << m.derived();
+    return s;
+  }
 
-    template<typename OtherDerived>
-    const typename SkylineProductReturnType<Derived, OtherDerived>::Type
-    operator*(const MatrixBase<OtherDerived> &other) const;
+  template <typename OtherDerived>
+  const typename SkylineProductReturnType<Derived, OtherDerived>::Type operator*(
+      const MatrixBase<OtherDerived>& other) const;
 
-    /** \internal use operator= */
-    template<typename DenseDerived>
-    void evalTo(MatrixBase<DenseDerived>& dst) const {
-        dst.setZero();
-        for (Index i = 0; i < rows(); i++)
-            for (Index j = 0; j < rows(); j++)
-                dst(i, j) = derived().coeff(i, j);
-    }
+  /** \internal use operator= */
+  template <typename DenseDerived>
+  void evalTo(MatrixBase<DenseDerived>& dst) const {
+    dst.setZero();
+    for (Index i = 0; i < rows(); i++)
+      for (Index j = 0; j < rows(); j++) dst(i, j) = derived().coeff(i, j);
+  }
 
-    Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime> toDense() const {
-        return derived();
-    }
+  Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime> toDense() const { return derived(); }
 
-    /** \returns the matrix or vector obtained by evaluating this expression.
-     *
-     * Notice that in the case of a plain matrix or vector (not an expression) this function just returns
-     * a const reference, in order to avoid a useless copy.
-     */
-    EIGEN_STRONG_INLINE const typename internal::eval<Derived, IsSkyline>::type eval() const {
-        return typename internal::eval<Derived>::type(derived());
-    }
+  /** \returns the matrix or vector obtained by evaluating this expression.
+   *
+   * Notice that in the case of a plain matrix or vector (not an expression) this function just returns
+   * a const reference, in order to avoid a useless copy.
+   */
+  EIGEN_STRONG_INLINE const typename internal::eval<Derived, IsSkyline>::type eval() const {
+    return typename internal::eval<Derived>::type(derived());
+  }
 
-protected:
-    bool m_isRValue;
+ protected:
+  bool m_isRValue;
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SKYLINEMATRIXBASE_H
+#endif  // EIGEN_SKYLINEMATRIXBASE_H
diff --git a/unsupported/Eigen/src/Skyline/SkylineProduct.h b/unsupported/Eigen/src/Skyline/SkylineProduct.h
index 9defb14..50be597 100644
--- a/unsupported/Eigen/src/Skyline/SkylineProduct.h
+++ b/unsupported/Eigen/src/Skyline/SkylineProduct.h
@@ -13,264 +13,229 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
-template<typename Lhs, typename Rhs, int ProductMode>
+template <typename Lhs, typename Rhs, int ProductMode>
 struct SkylineProductReturnType {
-    typedef const typename internal::nested_eval<Lhs, Rhs::RowsAtCompileTime>::type LhsNested;
-    typedef const typename internal::nested_eval<Rhs, Lhs::RowsAtCompileTime>::type RhsNested;
+  typedef const typename internal::nested_eval<Lhs, Rhs::RowsAtCompileTime>::type LhsNested;
+  typedef const typename internal::nested_eval<Rhs, Lhs::RowsAtCompileTime>::type RhsNested;
 
-    typedef SkylineProduct<LhsNested, RhsNested, ProductMode> Type;
+  typedef SkylineProduct<LhsNested, RhsNested, ProductMode> Type;
 };
 
-template<typename LhsNested, typename RhsNested, int ProductMode>
-struct internal::traits<SkylineProduct<LhsNested, RhsNested, ProductMode> > {
-    // clean the nested types:
-    typedef internal::remove_all_t<LhsNested> LhsNested_;
-    typedef internal::remove_all_t<RhsNested> RhsNested_;
-    typedef typename LhsNested_::Scalar Scalar;
+template <typename LhsNested, typename RhsNested, int ProductMode>
+struct internal::traits<SkylineProduct<LhsNested, RhsNested, ProductMode>> {
+  // clean the nested types:
+  typedef internal::remove_all_t<LhsNested> LhsNested_;
+  typedef internal::remove_all_t<RhsNested> RhsNested_;
+  typedef typename LhsNested_::Scalar Scalar;
 
-    enum {
-        LhsCoeffReadCost = LhsNested_::CoeffReadCost,
-        RhsCoeffReadCost = RhsNested_::CoeffReadCost,
-        LhsFlags = LhsNested_::Flags,
-        RhsFlags = RhsNested_::Flags,
+  enum {
+    LhsCoeffReadCost = LhsNested_::CoeffReadCost,
+    RhsCoeffReadCost = RhsNested_::CoeffReadCost,
+    LhsFlags = LhsNested_::Flags,
+    RhsFlags = RhsNested_::Flags,
 
-        RowsAtCompileTime = LhsNested_::RowsAtCompileTime,
-        ColsAtCompileTime = RhsNested_::ColsAtCompileTime,
-        InnerSize = internal::min_size_prefer_fixed(LhsNested_::ColsAtCompileTime, RhsNested_::RowsAtCompileTime),
+    RowsAtCompileTime = LhsNested_::RowsAtCompileTime,
+    ColsAtCompileTime = RhsNested_::ColsAtCompileTime,
+    InnerSize = internal::min_size_prefer_fixed(LhsNested_::ColsAtCompileTime, RhsNested_::RowsAtCompileTime),
 
-        MaxRowsAtCompileTime = LhsNested_::MaxRowsAtCompileTime,
-        MaxColsAtCompileTime = RhsNested_::MaxColsAtCompileTime,
+    MaxRowsAtCompileTime = LhsNested_::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = RhsNested_::MaxColsAtCompileTime,
 
-        EvalToRowMajor = (RhsFlags & LhsFlags & RowMajorBit),
-        ResultIsSkyline = ProductMode == SkylineTimeSkylineProduct,
+    EvalToRowMajor = (RhsFlags & LhsFlags & RowMajorBit),
+    ResultIsSkyline = ProductMode == SkylineTimeSkylineProduct,
 
-        RemovedBits = ~((EvalToRowMajor ? 0 : RowMajorBit) | (ResultIsSkyline ? 0 : SkylineBit)),
+    RemovedBits = ~((EvalToRowMajor ? 0 : RowMajorBit) | (ResultIsSkyline ? 0 : SkylineBit)),
 
-        Flags = (int(LhsFlags | RhsFlags) & HereditaryBits & RemovedBits)
-        | EvalBeforeAssigningBit
-        | EvalBeforeNestingBit,
+    Flags = (int(LhsFlags | RhsFlags) & HereditaryBits & RemovedBits) | EvalBeforeAssigningBit | EvalBeforeNestingBit,
 
-        CoeffReadCost = HugeCost
-    };
+    CoeffReadCost = HugeCost
+  };
 
-    typedef std::conditional_t<ResultIsSkyline,
-            SkylineMatrixBase<SkylineProduct<LhsNested, RhsNested, ProductMode> >,
-            MatrixBase<SkylineProduct<LhsNested, RhsNested, ProductMode> > > Base;
+  typedef std::conditional_t<ResultIsSkyline, SkylineMatrixBase<SkylineProduct<LhsNested, RhsNested, ProductMode>>,
+                             MatrixBase<SkylineProduct<LhsNested, RhsNested, ProductMode>>>
+      Base;
 };
 
 namespace internal {
-template<typename LhsNested, typename RhsNested, int ProductMode>
-class SkylineProduct : no_assignment_operator,
-public traits<SkylineProduct<LhsNested, RhsNested, ProductMode> >::Base {
-public:
+template <typename LhsNested, typename RhsNested, int ProductMode>
+class SkylineProduct : no_assignment_operator, public traits<SkylineProduct<LhsNested, RhsNested, ProductMode>>::Base {
+ public:
+  EIGEN_GENERIC_PUBLIC_INTERFACE(SkylineProduct)
 
-    EIGEN_GENERIC_PUBLIC_INTERFACE(SkylineProduct)
+ private:
+  typedef typename traits<SkylineProduct>::LhsNested_ LhsNested_;
+  typedef typename traits<SkylineProduct>::RhsNested_ RhsNested_;
 
-private:
+ public:
+  template <typename Lhs, typename Rhs>
+  EIGEN_STRONG_INLINE SkylineProduct(const Lhs& lhs, const Rhs& rhs) : m_lhs(lhs), m_rhs(rhs) {
+    eigen_assert(lhs.cols() == rhs.rows());
 
-    typedef typename traits<SkylineProduct>::LhsNested_ LhsNested_;
-    typedef typename traits<SkylineProduct>::RhsNested_ RhsNested_;
+    enum {
+      ProductIsValid = LhsNested_::ColsAtCompileTime == Dynamic || RhsNested_::RowsAtCompileTime == Dynamic ||
+                       int(LhsNested_::ColsAtCompileTime) == int(RhsNested_::RowsAtCompileTime),
+      AreVectors = LhsNested_::IsVectorAtCompileTime && RhsNested_::IsVectorAtCompileTime,
+      SameSizes = EIGEN_PREDICATE_SAME_MATRIX_SIZE(LhsNested_, RhsNested_)
+    };
+    // note to the lost user:
+    //    * for a dot product use: v1.dot(v2)
+    //    * for a coeff-wise product use: v1.cwise()*v2
+    EIGEN_STATIC_ASSERT(
+        ProductIsValid || !(AreVectors && SameSizes),
+        INVALID_VECTOR_VECTOR_PRODUCT__IF_YOU_WANTED_A_DOT_OR_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTIONS)
+    EIGEN_STATIC_ASSERT(ProductIsValid || !(SameSizes && !AreVectors),
+                        INVALID_MATRIX_PRODUCT__IF_YOU_WANTED_A_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTION)
+    EIGEN_STATIC_ASSERT(ProductIsValid || SameSizes, INVALID_MATRIX_PRODUCT)
+  }
 
-public:
+  EIGEN_STRONG_INLINE Index rows() const { return m_lhs.rows(); }
 
-    template<typename Lhs, typename Rhs>
-    EIGEN_STRONG_INLINE SkylineProduct(const Lhs& lhs, const Rhs& rhs)
-    : m_lhs(lhs), m_rhs(rhs) {
-        eigen_assert(lhs.cols() == rhs.rows());
+  EIGEN_STRONG_INLINE Index cols() const { return m_rhs.cols(); }
 
-        enum {
-            ProductIsValid = LhsNested_::ColsAtCompileTime == Dynamic
-            || RhsNested_::RowsAtCompileTime == Dynamic
-            || int(LhsNested_::ColsAtCompileTime) == int(RhsNested_::RowsAtCompileTime),
-            AreVectors = LhsNested_::IsVectorAtCompileTime && RhsNested_::IsVectorAtCompileTime,
-            SameSizes = EIGEN_PREDICATE_SAME_MATRIX_SIZE(LhsNested_, RhsNested_)
-        };
-        // note to the lost user:
-        //    * for a dot product use: v1.dot(v2)
-        //    * for a coeff-wise product use: v1.cwise()*v2
-        EIGEN_STATIC_ASSERT(ProductIsValid || !(AreVectors && SameSizes),
-                INVALID_VECTOR_VECTOR_PRODUCT__IF_YOU_WANTED_A_DOT_OR_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTIONS)
-                EIGEN_STATIC_ASSERT(ProductIsValid || !(SameSizes && !AreVectors),
-                INVALID_MATRIX_PRODUCT__IF_YOU_WANTED_A_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTION)
-                EIGEN_STATIC_ASSERT(ProductIsValid || SameSizes, INVALID_MATRIX_PRODUCT)
-    }
+  EIGEN_STRONG_INLINE const LhsNested_& lhs() const { return m_lhs; }
 
-    EIGEN_STRONG_INLINE Index rows() const {
-        return m_lhs.rows();
-    }
+  EIGEN_STRONG_INLINE const RhsNested_& rhs() const { return m_rhs; }
 
-    EIGEN_STRONG_INLINE Index cols() const {
-        return m_rhs.cols();
-    }
-
-    EIGEN_STRONG_INLINE const LhsNested_& lhs() const {
-        return m_lhs;
-    }
-
-    EIGEN_STRONG_INLINE const RhsNested_& rhs() const {
-        return m_rhs;
-    }
-
-protected:
-    LhsNested m_lhs;
-    RhsNested m_rhs;
+ protected:
+  LhsNested m_lhs;
+  RhsNested m_rhs;
 };
 
 // dense = skyline * dense
 // Note that here we force no inlining and separate the setZero() because GCC messes up otherwise
 
-template<typename Lhs, typename Rhs, typename Dest>
+template <typename Lhs, typename Rhs, typename Dest>
 EIGEN_DONT_INLINE void skyline_row_major_time_dense_product(const Lhs& lhs, const Rhs& rhs, Dest& dst) {
-    typedef remove_all_t<Lhs> Lhs_;
-    typedef remove_all_t<Rhs> Rhs_;
-    typedef typename traits<Lhs>::Scalar Scalar;
+  typedef remove_all_t<Lhs> Lhs_;
+  typedef remove_all_t<Rhs> Rhs_;
+  typedef typename traits<Lhs>::Scalar Scalar;
 
-    enum {
-        LhsIsRowMajor = (Lhs_::Flags & RowMajorBit) == RowMajorBit,
-        LhsIsSelfAdjoint = (Lhs_::Flags & SelfAdjointBit) == SelfAdjointBit,
-        ProcessFirstHalf = LhsIsSelfAdjoint
-        && (((Lhs_::Flags & (UpperTriangularBit | LowerTriangularBit)) == 0)
-        || ((Lhs_::Flags & UpperTriangularBit) && !LhsIsRowMajor)
-        || ((Lhs_::Flags & LowerTriangularBit) && LhsIsRowMajor)),
-        ProcessSecondHalf = LhsIsSelfAdjoint && (!ProcessFirstHalf)
-    };
+  enum {
+    LhsIsRowMajor = (Lhs_::Flags & RowMajorBit) == RowMajorBit,
+    LhsIsSelfAdjoint = (Lhs_::Flags & SelfAdjointBit) == SelfAdjointBit,
+    ProcessFirstHalf = LhsIsSelfAdjoint && (((Lhs_::Flags & (UpperTriangularBit | LowerTriangularBit)) == 0) ||
+                                            ((Lhs_::Flags & UpperTriangularBit) && !LhsIsRowMajor) ||
+                                            ((Lhs_::Flags & LowerTriangularBit) && LhsIsRowMajor)),
+    ProcessSecondHalf = LhsIsSelfAdjoint && (!ProcessFirstHalf)
+  };
 
-    //Use matrix diagonal part <- Improvement : use inner iterator on dense matrix.
-    for (Index col = 0; col < rhs.cols(); col++) {
-        for (Index row = 0; row < lhs.rows(); row++) {
-            dst(row, col) = lhs.coeffDiag(row) * rhs(row, col);
-        }
-    }
-    //Use matrix lower triangular part
+  // Use matrix diagonal part <- Improvement : use inner iterator on dense matrix.
+  for (Index col = 0; col < rhs.cols(); col++) {
     for (Index row = 0; row < lhs.rows(); row++) {
-        typename Lhs_::InnerLowerIterator lIt(lhs, row);
-        const Index stop = lIt.col() + lIt.size();
-        for (Index col = 0; col < rhs.cols(); col++) {
-
-            Index k = lIt.col();
-            Scalar tmp = 0;
-            while (k < stop) {
-                tmp +=
-                        lIt.value() *
-                        rhs(k++, col);
-                ++lIt;
-            }
-            dst(row, col) += tmp;
-            lIt += -lIt.size();
-        }
-
+      dst(row, col) = lhs.coeffDiag(row) * rhs(row, col);
     }
-
-    //Use matrix upper triangular part
-    for (Index lhscol = 0; lhscol < lhs.cols(); lhscol++) {
-        typename Lhs_::InnerUpperIterator uIt(lhs, lhscol);
-        const Index stop = uIt.size() + uIt.row();
-        for (Index rhscol = 0; rhscol < rhs.cols(); rhscol++) {
-
-
-            const Scalar rhsCoeff = rhs.coeff(lhscol, rhscol);
-            Index k = uIt.row();
-            while (k < stop) {
-                dst(k++, rhscol) +=
-                        uIt.value() *
-                        rhsCoeff;
-                ++uIt;
-            }
-            uIt += -uIt.size();
-        }
+  }
+  // Use matrix lower triangular part
+  for (Index row = 0; row < lhs.rows(); row++) {
+    typename Lhs_::InnerLowerIterator lIt(lhs, row);
+    const Index stop = lIt.col() + lIt.size();
+    for (Index col = 0; col < rhs.cols(); col++) {
+      Index k = lIt.col();
+      Scalar tmp = 0;
+      while (k < stop) {
+        tmp += lIt.value() * rhs(k++, col);
+        ++lIt;
+      }
+      dst(row, col) += tmp;
+      lIt += -lIt.size();
     }
+  }
 
+  // Use matrix upper triangular part
+  for (Index lhscol = 0; lhscol < lhs.cols(); lhscol++) {
+    typename Lhs_::InnerUpperIterator uIt(lhs, lhscol);
+    const Index stop = uIt.size() + uIt.row();
+    for (Index rhscol = 0; rhscol < rhs.cols(); rhscol++) {
+      const Scalar rhsCoeff = rhs.coeff(lhscol, rhscol);
+      Index k = uIt.row();
+      while (k < stop) {
+        dst(k++, rhscol) += uIt.value() * rhsCoeff;
+        ++uIt;
+      }
+      uIt += -uIt.size();
+    }
+  }
 }
 
-template<typename Lhs, typename Rhs, typename Dest>
+template <typename Lhs, typename Rhs, typename Dest>
 EIGEN_DONT_INLINE void skyline_col_major_time_dense_product(const Lhs& lhs, const Rhs& rhs, Dest& dst) {
-    typedef remove_all_t<Lhs> Lhs_;
-    typedef remove_all_t<Rhs> Rhs_;
-    typedef typename traits<Lhs>::Scalar Scalar;
+  typedef remove_all_t<Lhs> Lhs_;
+  typedef remove_all_t<Rhs> Rhs_;
+  typedef typename traits<Lhs>::Scalar Scalar;
 
-    enum {
-        LhsIsRowMajor = (Lhs_::Flags & RowMajorBit) == RowMajorBit,
-        LhsIsSelfAdjoint = (Lhs_::Flags & SelfAdjointBit) == SelfAdjointBit,
-        ProcessFirstHalf = LhsIsSelfAdjoint
-        && (((Lhs_::Flags & (UpperTriangularBit | LowerTriangularBit)) == 0)
-        || ((Lhs_::Flags & UpperTriangularBit) && !LhsIsRowMajor)
-        || ((Lhs_::Flags & LowerTriangularBit) && LhsIsRowMajor)),
-        ProcessSecondHalf = LhsIsSelfAdjoint && (!ProcessFirstHalf)
-    };
+  enum {
+    LhsIsRowMajor = (Lhs_::Flags & RowMajorBit) == RowMajorBit,
+    LhsIsSelfAdjoint = (Lhs_::Flags & SelfAdjointBit) == SelfAdjointBit,
+    ProcessFirstHalf = LhsIsSelfAdjoint && (((Lhs_::Flags & (UpperTriangularBit | LowerTriangularBit)) == 0) ||
+                                            ((Lhs_::Flags & UpperTriangularBit) && !LhsIsRowMajor) ||
+                                            ((Lhs_::Flags & LowerTriangularBit) && LhsIsRowMajor)),
+    ProcessSecondHalf = LhsIsSelfAdjoint && (!ProcessFirstHalf)
+  };
 
-    //Use matrix diagonal part <- Improvement : use inner iterator on dense matrix.
-    for (Index col = 0; col < rhs.cols(); col++) {
-        for (Index row = 0; row < lhs.rows(); row++) {
-            dst(row, col) = lhs.coeffDiag(row) * rhs(row, col);
-        }
-    }
-
-    //Use matrix upper triangular part
+  // Use matrix diagonal part <- Improvement : use inner iterator on dense matrix.
+  for (Index col = 0; col < rhs.cols(); col++) {
     for (Index row = 0; row < lhs.rows(); row++) {
-        typename Lhs_::InnerUpperIterator uIt(lhs, row);
-        const Index stop = uIt.col() + uIt.size();
-        for (Index col = 0; col < rhs.cols(); col++) {
-
-            Index k = uIt.col();
-            Scalar tmp = 0;
-            while (k < stop) {
-                tmp +=
-                        uIt.value() *
-                        rhs(k++, col);
-                ++uIt;
-            }
-
-
-            dst(row, col) += tmp;
-            uIt += -uIt.size();
-        }
+      dst(row, col) = lhs.coeffDiag(row) * rhs(row, col);
     }
+  }
 
-    //Use matrix lower triangular part
-    for (Index lhscol = 0; lhscol < lhs.cols(); lhscol++) {
-        typename Lhs_::InnerLowerIterator lIt(lhs, lhscol);
-        const Index stop = lIt.size() + lIt.row();
-        for (Index rhscol = 0; rhscol < rhs.cols(); rhscol++) {
+  // Use matrix upper triangular part
+  for (Index row = 0; row < lhs.rows(); row++) {
+    typename Lhs_::InnerUpperIterator uIt(lhs, row);
+    const Index stop = uIt.col() + uIt.size();
+    for (Index col = 0; col < rhs.cols(); col++) {
+      Index k = uIt.col();
+      Scalar tmp = 0;
+      while (k < stop) {
+        tmp += uIt.value() * rhs(k++, col);
+        ++uIt;
+      }
 
-            const Scalar rhsCoeff = rhs.coeff(lhscol, rhscol);
-            Index k = lIt.row();
-            while (k < stop) {
-                dst(k++, rhscol) +=
-                        lIt.value() *
-                        rhsCoeff;
-                ++lIt;
-            }
-            lIt += -lIt.size();
-        }
+      dst(row, col) += tmp;
+      uIt += -uIt.size();
     }
+  }
 
+  // Use matrix lower triangular part
+  for (Index lhscol = 0; lhscol < lhs.cols(); lhscol++) {
+    typename Lhs_::InnerLowerIterator lIt(lhs, lhscol);
+    const Index stop = lIt.size() + lIt.row();
+    for (Index rhscol = 0; rhscol < rhs.cols(); rhscol++) {
+      const Scalar rhsCoeff = rhs.coeff(lhscol, rhscol);
+      Index k = lIt.row();
+      while (k < stop) {
+        dst(k++, rhscol) += lIt.value() * rhsCoeff;
+        ++lIt;
+      }
+      lIt += -lIt.size();
+    }
+  }
 }
 
-template<typename Lhs, typename Rhs, typename ResultType,
-        int LhsStorageOrder = traits<Lhs>::Flags&RowMajorBit>
-        struct skyline_product_selector;
+template <typename Lhs, typename Rhs, typename ResultType, int LhsStorageOrder = traits<Lhs>::Flags & RowMajorBit>
+struct skyline_product_selector;
 
-template<typename Lhs, typename Rhs, typename ResultType>
+template <typename Lhs, typename Rhs, typename ResultType>
 struct skyline_product_selector<Lhs, Rhs, ResultType, RowMajor> {
-    typedef typename traits<remove_all_t<Lhs>>::Scalar Scalar;
+  typedef typename traits<remove_all_t<Lhs>>::Scalar Scalar;
 
-    static void run(const Lhs& lhs, const Rhs& rhs, ResultType & res) {
-        skyline_row_major_time_dense_product<Lhs, Rhs, ResultType > (lhs, rhs, res);
-    }
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res) {
+    skyline_row_major_time_dense_product<Lhs, Rhs, ResultType>(lhs, rhs, res);
+  }
 };
 
-template<typename Lhs, typename Rhs, typename ResultType>
+template <typename Lhs, typename Rhs, typename ResultType>
 struct skyline_product_selector<Lhs, Rhs, ResultType, ColMajor> {
-    typedef typename traits<remove_all_t<Lhs>>::Scalar Scalar;
+  typedef typename traits<remove_all_t<Lhs>>::Scalar Scalar;
 
-    static void run(const Lhs& lhs, const Rhs& rhs, ResultType & res) {
-        skyline_col_major_time_dense_product<Lhs, Rhs, ResultType > (lhs, rhs, res);
-    }
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res) {
+    skyline_col_major_time_dense_product<Lhs, Rhs, ResultType>(lhs, rhs, res);
+  }
 };
 
-} // end namespace internal
+}  // end namespace internal
 
 // template<typename Derived>
 // template<typename Lhs, typename Rhs >
@@ -279,20 +244,19 @@
 //     internal::skyline_product_selector<internal::remove_all_t<Lhs>,
 //             internal::remove_all_t<Rhs>,
 //             Derived>::run(product.lhs(), product.rhs(), derived());
-// 
+//
 //     return derived();
 // }
 
 // skyline * dense
 
-template<typename Derived>
-template<typename OtherDerived >
+template <typename Derived>
+template <typename OtherDerived>
 EIGEN_STRONG_INLINE const typename SkylineProductReturnType<Derived, OtherDerived>::Type
-SkylineMatrixBase<Derived>::operator*(const MatrixBase<OtherDerived> &other) const {
-
-    return typename SkylineProductReturnType<Derived, OtherDerived>::Type(derived(), other.derived());
+SkylineMatrixBase<Derived>::operator*(const MatrixBase<OtherDerived>& other) const {
+  return typename SkylineProductReturnType<Derived, OtherDerived>::Type(derived(), other.derived());
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SKYLINEPRODUCT_H
+#endif  // EIGEN_SKYLINEPRODUCT_H
diff --git a/unsupported/Eigen/src/Skyline/SkylineStorage.h b/unsupported/Eigen/src/Skyline/SkylineStorage.h
index 2b7ab21..893fb4f 100644
--- a/unsupported/Eigen/src/Skyline/SkylineStorage.h
+++ b/unsupported/Eigen/src/Skyline/SkylineStorage.h
@@ -13,7 +13,7 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 /** Stores a skyline set of values in three structures :
  * The diagonal elements
@@ -21,242 +21,204 @@
  * The lower elements
  *
  */
-template<typename Scalar>
+template <typename Scalar>
 class SkylineStorage {
-    typedef typename NumTraits<Scalar>::Real RealScalar;
-    typedef SparseIndex Index;
-public:
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef SparseIndex Index;
 
-    SkylineStorage()
-    : m_diag(0),
-    m_lower(0),
-    m_upper(0),
-    m_lowerProfile(0),
-    m_upperProfile(0),
-    m_diagSize(0),
-    m_upperSize(0),
-    m_lowerSize(0),
-    m_upperProfileSize(0),
-    m_lowerProfileSize(0),
-    m_allocatedSize(0) {
-    }
+ public:
+  SkylineStorage()
+      : m_diag(0),
+        m_lower(0),
+        m_upper(0),
+        m_lowerProfile(0),
+        m_upperProfile(0),
+        m_diagSize(0),
+        m_upperSize(0),
+        m_lowerSize(0),
+        m_upperProfileSize(0),
+        m_lowerProfileSize(0),
+        m_allocatedSize(0) {}
 
-    SkylineStorage(const SkylineStorage& other)
-    : m_diag(0),
-    m_lower(0),
-    m_upper(0),
-    m_lowerProfile(0),
-    m_upperProfile(0),
-    m_diagSize(0),
-    m_upperSize(0),
-    m_lowerSize(0),
-    m_upperProfileSize(0),
-    m_lowerProfileSize(0),
-    m_allocatedSize(0) {
-        *this = other;
-    }
+  SkylineStorage(const SkylineStorage& other)
+      : m_diag(0),
+        m_lower(0),
+        m_upper(0),
+        m_lowerProfile(0),
+        m_upperProfile(0),
+        m_diagSize(0),
+        m_upperSize(0),
+        m_lowerSize(0),
+        m_upperProfileSize(0),
+        m_lowerProfileSize(0),
+        m_allocatedSize(0) {
+    *this = other;
+  }
 
-    SkylineStorage & operator=(const SkylineStorage& other) {
-        resize(other.diagSize(), other.m_upperProfileSize, other.m_lowerProfileSize, other.upperSize(), other.lowerSize());
-        memcpy(m_diag, other.m_diag, m_diagSize * sizeof (Scalar));
-        memcpy(m_upper, other.m_upper, other.upperSize() * sizeof (Scalar));
-        memcpy(m_lower, other.m_lower, other.lowerSize() * sizeof (Scalar));
-        memcpy(m_upperProfile, other.m_upperProfile, m_upperProfileSize * sizeof (Index));
-        memcpy(m_lowerProfile, other.m_lowerProfile, m_lowerProfileSize * sizeof (Index));
-        return *this;
-    }
+  SkylineStorage& operator=(const SkylineStorage& other) {
+    resize(other.diagSize(), other.m_upperProfileSize, other.m_lowerProfileSize, other.upperSize(), other.lowerSize());
+    memcpy(m_diag, other.m_diag, m_diagSize * sizeof(Scalar));
+    memcpy(m_upper, other.m_upper, other.upperSize() * sizeof(Scalar));
+    memcpy(m_lower, other.m_lower, other.lowerSize() * sizeof(Scalar));
+    memcpy(m_upperProfile, other.m_upperProfile, m_upperProfileSize * sizeof(Index));
+    memcpy(m_lowerProfile, other.m_lowerProfile, m_lowerProfileSize * sizeof(Index));
+    return *this;
+  }
 
-    void swap(SkylineStorage& other) {
-        std::swap(m_diag, other.m_diag);
-        std::swap(m_upper, other.m_upper);
-        std::swap(m_lower, other.m_lower);
-        std::swap(m_upperProfile, other.m_upperProfile);
-        std::swap(m_lowerProfile, other.m_lowerProfile);
-        std::swap(m_diagSize, other.m_diagSize);
-        std::swap(m_upperSize, other.m_upperSize);
-        std::swap(m_lowerSize, other.m_lowerSize);
-        std::swap(m_allocatedSize, other.m_allocatedSize);
-    }
+  void swap(SkylineStorage& other) {
+    std::swap(m_diag, other.m_diag);
+    std::swap(m_upper, other.m_upper);
+    std::swap(m_lower, other.m_lower);
+    std::swap(m_upperProfile, other.m_upperProfile);
+    std::swap(m_lowerProfile, other.m_lowerProfile);
+    std::swap(m_diagSize, other.m_diagSize);
+    std::swap(m_upperSize, other.m_upperSize);
+    std::swap(m_lowerSize, other.m_lowerSize);
+    std::swap(m_allocatedSize, other.m_allocatedSize);
+  }
 
-    ~SkylineStorage() {
-        delete[] m_diag;
-        delete[] m_upper;
-        if (m_upper != m_lower)
-            delete[] m_lower;
-        delete[] m_upperProfile;
-        delete[] m_lowerProfile;
-    }
+  ~SkylineStorage() {
+    delete[] m_diag;
+    delete[] m_upper;
+    if (m_upper != m_lower) delete[] m_lower;
+    delete[] m_upperProfile;
+    delete[] m_lowerProfile;
+  }
 
-    void reserve(Index size, Index upperProfileSize, Index lowerProfileSize, Index upperSize, Index lowerSize) {
-        Index newAllocatedSize = size + upperSize + lowerSize;
-        if (newAllocatedSize > m_allocatedSize)
-            reallocate(size, upperProfileSize, lowerProfileSize, upperSize, lowerSize);
-    }
+  void reserve(Index size, Index upperProfileSize, Index lowerProfileSize, Index upperSize, Index lowerSize) {
+    Index newAllocatedSize = size + upperSize + lowerSize;
+    if (newAllocatedSize > m_allocatedSize) reallocate(size, upperProfileSize, lowerProfileSize, upperSize, lowerSize);
+  }
 
-    void squeeze() {
-        if (m_allocatedSize > m_diagSize + m_upperSize + m_lowerSize)
-            reallocate(m_diagSize, m_upperProfileSize, m_lowerProfileSize, m_upperSize, m_lowerSize);
-    }
+  void squeeze() {
+    if (m_allocatedSize > m_diagSize + m_upperSize + m_lowerSize)
+      reallocate(m_diagSize, m_upperProfileSize, m_lowerProfileSize, m_upperSize, m_lowerSize);
+  }
 
-    void resize(Index diagSize, Index upperProfileSize, Index lowerProfileSize, Index upperSize, Index lowerSize, float reserveSizeFactor = 0) {
-        if (m_allocatedSize < diagSize + upperSize + lowerSize)
-            reallocate(diagSize, upperProfileSize, lowerProfileSize, upperSize + Index(reserveSizeFactor * upperSize), lowerSize + Index(reserveSizeFactor * lowerSize));
-        m_diagSize = diagSize;
-        m_upperSize = upperSize;
-        m_lowerSize = lowerSize;
-        m_upperProfileSize = upperProfileSize;
-        m_lowerProfileSize = lowerProfileSize;
-    }
+  void resize(Index diagSize, Index upperProfileSize, Index lowerProfileSize, Index upperSize, Index lowerSize,
+              float reserveSizeFactor = 0) {
+    if (m_allocatedSize < diagSize + upperSize + lowerSize)
+      reallocate(diagSize, upperProfileSize, lowerProfileSize, upperSize + Index(reserveSizeFactor * upperSize),
+                 lowerSize + Index(reserveSizeFactor * lowerSize));
+    m_diagSize = diagSize;
+    m_upperSize = upperSize;
+    m_lowerSize = lowerSize;
+    m_upperProfileSize = upperProfileSize;
+    m_lowerProfileSize = lowerProfileSize;
+  }
 
-    inline Index diagSize() const {
-        return m_diagSize;
-    }
+  inline Index diagSize() const { return m_diagSize; }
 
-    inline Index upperSize() const {
-        return m_upperSize;
-    }
+  inline Index upperSize() const { return m_upperSize; }
 
-    inline Index lowerSize() const {
-        return m_lowerSize;
-    }
+  inline Index lowerSize() const { return m_lowerSize; }
 
-    inline Index upperProfileSize() const {
-        return m_upperProfileSize;
-    }
+  inline Index upperProfileSize() const { return m_upperProfileSize; }
 
-    inline Index lowerProfileSize() const {
-        return m_lowerProfileSize;
-    }
+  inline Index lowerProfileSize() const { return m_lowerProfileSize; }
 
-    inline Index allocatedSize() const {
-        return m_allocatedSize;
-    }
+  inline Index allocatedSize() const { return m_allocatedSize; }
 
-    inline void clear() {
-        m_diagSize = 0;
-    }
+  inline void clear() { m_diagSize = 0; }
 
-    inline Scalar& diag(Index i) {
-        return m_diag[i];
-    }
+  inline Scalar& diag(Index i) { return m_diag[i]; }
 
-    inline const Scalar& diag(Index i) const {
-        return m_diag[i];
-    }
+  inline const Scalar& diag(Index i) const { return m_diag[i]; }
 
-    inline Scalar& upper(Index i) {
-        return m_upper[i];
-    }
+  inline Scalar& upper(Index i) { return m_upper[i]; }
 
-    inline const Scalar& upper(Index i) const {
-        return m_upper[i];
-    }
+  inline const Scalar& upper(Index i) const { return m_upper[i]; }
 
-    inline Scalar& lower(Index i) {
-        return m_lower[i];
-    }
+  inline Scalar& lower(Index i) { return m_lower[i]; }
 
-    inline const Scalar& lower(Index i) const {
-        return m_lower[i];
-    }
+  inline const Scalar& lower(Index i) const { return m_lower[i]; }
 
-    inline Index& upperProfile(Index i) {
-        return m_upperProfile[i];
-    }
+  inline Index& upperProfile(Index i) { return m_upperProfile[i]; }
 
-    inline const Index& upperProfile(Index i) const {
-        return m_upperProfile[i];
-    }
+  inline const Index& upperProfile(Index i) const { return m_upperProfile[i]; }
 
-    inline Index& lowerProfile(Index i) {
-        return m_lowerProfile[i];
-    }
+  inline Index& lowerProfile(Index i) { return m_lowerProfile[i]; }
 
-    inline const Index& lowerProfile(Index i) const {
-        return m_lowerProfile[i];
-    }
+  inline const Index& lowerProfile(Index i) const { return m_lowerProfile[i]; }
 
-    static SkylineStorage Map(Index* upperProfile, Index* lowerProfile, Scalar* diag, Scalar* upper, Scalar* lower, Index size, Index upperSize, Index lowerSize) {
-        SkylineStorage res;
-        res.m_upperProfile = upperProfile;
-        res.m_lowerProfile = lowerProfile;
-        res.m_diag = diag;
-        res.m_upper = upper;
-        res.m_lower = lower;
-        res.m_allocatedSize = res.m_diagSize = size;
-        res.m_upperSize = upperSize;
-        res.m_lowerSize = lowerSize;
-        return res;
-    }
+  static SkylineStorage Map(Index* upperProfile, Index* lowerProfile, Scalar* diag, Scalar* upper, Scalar* lower,
+                            Index size, Index upperSize, Index lowerSize) {
+    SkylineStorage res;
+    res.m_upperProfile = upperProfile;
+    res.m_lowerProfile = lowerProfile;
+    res.m_diag = diag;
+    res.m_upper = upper;
+    res.m_lower = lower;
+    res.m_allocatedSize = res.m_diagSize = size;
+    res.m_upperSize = upperSize;
+    res.m_lowerSize = lowerSize;
+    return res;
+  }
 
-    inline void reset() {
-        std::fill_n(m_diag, m_diagSize, Scalar(0));
-        std::fill_n(m_upper, m_upperSize, Scalar(0));
-        std::fill_n(m_lower, m_lowerSize, Scalar(0));
-        std::fill_n(m_upperProfile, m_diagSize, Index(0));
-        std::fill_n(m_lowerProfile, m_diagSize, Index(0));
-    }
+  inline void reset() {
+    std::fill_n(m_diag, m_diagSize, Scalar(0));
+    std::fill_n(m_upper, m_upperSize, Scalar(0));
+    std::fill_n(m_lower, m_lowerSize, Scalar(0));
+    std::fill_n(m_upperProfile, m_diagSize, Index(0));
+    std::fill_n(m_lowerProfile, m_diagSize, Index(0));
+  }
 
-    void prune(Scalar reference, RealScalar epsilon = dummy_precision<RealScalar>()) {
-        //TODO
-    }
+  void prune(Scalar reference, RealScalar epsilon = dummy_precision<RealScalar>()) {
+    // TODO
+  }
 
-protected:
+ protected:
+  inline void reallocate(Index diagSize, Index upperProfileSize, Index lowerProfileSize, Index upperSize,
+                         Index lowerSize) {
+    Scalar* diag = new Scalar[diagSize];
+    Scalar* upper = new Scalar[upperSize];
+    Scalar* lower = new Scalar[lowerSize];
+    Index* upperProfile = new Index[upperProfileSize];
+    Index* lowerProfile = new Index[lowerProfileSize];
 
-    inline void reallocate(Index diagSize, Index upperProfileSize, Index lowerProfileSize, Index upperSize, Index lowerSize) {
+    Index copyDiagSize = (std::min)(diagSize, m_diagSize);
+    Index copyUpperSize = (std::min)(upperSize, m_upperSize);
+    Index copyLowerSize = (std::min)(lowerSize, m_lowerSize);
+    Index copyUpperProfileSize = (std::min)(upperProfileSize, m_upperProfileSize);
+    Index copyLowerProfileSize = (std::min)(lowerProfileSize, m_lowerProfileSize);
 
-        Scalar* diag = new Scalar[diagSize];
-        Scalar* upper = new Scalar[upperSize];
-        Scalar* lower = new Scalar[lowerSize];
-        Index* upperProfile = new Index[upperProfileSize];
-        Index* lowerProfile = new Index[lowerProfileSize];
+    // copy
+    memcpy(diag, m_diag, copyDiagSize * sizeof(Scalar));
+    memcpy(upper, m_upper, copyUpperSize * sizeof(Scalar));
+    memcpy(lower, m_lower, copyLowerSize * sizeof(Scalar));
+    memcpy(upperProfile, m_upperProfile, copyUpperProfileSize * sizeof(Index));
+    memcpy(lowerProfile, m_lowerProfile, copyLowerProfileSize * sizeof(Index));
 
-        Index copyDiagSize = (std::min)(diagSize, m_diagSize);
-        Index copyUpperSize = (std::min)(upperSize, m_upperSize);
-        Index copyLowerSize = (std::min)(lowerSize, m_lowerSize);
-        Index copyUpperProfileSize = (std::min)(upperProfileSize, m_upperProfileSize);
-        Index copyLowerProfileSize = (std::min)(lowerProfileSize, m_lowerProfileSize);
+    // delete old stuff
+    delete[] m_diag;
+    delete[] m_upper;
+    delete[] m_lower;
+    delete[] m_upperProfile;
+    delete[] m_lowerProfile;
+    m_diag = diag;
+    m_upper = upper;
+    m_lower = lower;
+    m_upperProfile = upperProfile;
+    m_lowerProfile = lowerProfile;
+    m_allocatedSize = diagSize + upperSize + lowerSize;
+    m_upperSize = upperSize;
+    m_lowerSize = lowerSize;
+  }
 
-        // copy
-        memcpy(diag, m_diag, copyDiagSize * sizeof (Scalar));
-        memcpy(upper, m_upper, copyUpperSize * sizeof (Scalar));
-        memcpy(lower, m_lower, copyLowerSize * sizeof (Scalar));
-        memcpy(upperProfile, m_upperProfile, copyUpperProfileSize * sizeof (Index));
-        memcpy(lowerProfile, m_lowerProfile, copyLowerProfileSize * sizeof (Index));
-
-
-
-        // delete old stuff
-        delete[] m_diag;
-        delete[] m_upper;
-        delete[] m_lower;
-        delete[] m_upperProfile;
-        delete[] m_lowerProfile;
-        m_diag = diag;
-        m_upper = upper;
-        m_lower = lower;
-        m_upperProfile = upperProfile;
-        m_lowerProfile = lowerProfile;
-        m_allocatedSize = diagSize + upperSize + lowerSize;
-        m_upperSize = upperSize;
-        m_lowerSize = lowerSize;
-    }
-
-public:
-    Scalar* m_diag;
-    Scalar* m_upper;
-    Scalar* m_lower;
-    Index* m_upperProfile;
-    Index* m_lowerProfile;
-    Index m_diagSize;
-    Index m_upperSize;
-    Index m_lowerSize;
-    Index m_upperProfileSize;
-    Index m_lowerProfileSize;
-    Index m_allocatedSize;
-
+ public:
+  Scalar* m_diag;
+  Scalar* m_upper;
+  Scalar* m_lower;
+  Index* m_upperProfile;
+  Index* m_lowerProfile;
+  Index m_diagSize;
+  Index m_upperSize;
+  Index m_lowerSize;
+  Index m_upperProfileSize;
+  Index m_lowerProfileSize;
+  Index m_allocatedSize;
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SKYLINE_STORAGE_H
+#endif  // EIGEN_SKYLINE_STORAGE_H
diff --git a/unsupported/Eigen/src/Skyline/SkylineUtil.h b/unsupported/Eigen/src/Skyline/SkylineUtil.h
index e467fee..e9c828f 100644
--- a/unsupported/Eigen/src/Skyline/SkylineUtil.h
+++ b/unsupported/Eigen/src/Skyline/SkylineUtil.h
@@ -13,7 +13,7 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
 #ifdef NDEBUG
 #define EIGEN_DBG_SKYLINE(X)
@@ -22,71 +22,73 @@
 #endif
 
 const unsigned int SkylineBit = 0x1200;
-template<typename Lhs, typename Rhs, int ProductMode> class SkylineProduct;
-enum AdditionalProductEvaluationMode {SkylineTimeDenseProduct, SkylineTimeSkylineProduct, DenseTimeSkylineProduct};
-enum {IsSkyline = SkylineBit};
+template <typename Lhs, typename Rhs, int ProductMode>
+class SkylineProduct;
+enum AdditionalProductEvaluationMode { SkylineTimeDenseProduct, SkylineTimeSkylineProduct, DenseTimeSkylineProduct };
+enum { IsSkyline = SkylineBit };
 
-
-#define EIGEN_SKYLINE_INHERIT_ASSIGNMENT_OPERATOR(Derived, Op) \
-template<typename OtherDerived> \
-EIGEN_STRONG_INLINE Derived& operator Op(const Eigen::SkylineMatrixBase<OtherDerived>& other) \
-{ \
-  return Base::operator Op(other.derived()); \
-} \
-EIGEN_STRONG_INLINE Derived& operator Op(const Derived& other) \
-{ \
-  return Base::operator Op(other); \
-}
+#define EIGEN_SKYLINE_INHERIT_ASSIGNMENT_OPERATOR(Derived, Op)                                    \
+  template <typename OtherDerived>                                                                \
+  EIGEN_STRONG_INLINE Derived& operator Op(const Eigen::SkylineMatrixBase<OtherDerived>& other) { \
+    return Base::operator Op(other.derived());                                                    \
+  }                                                                                               \
+  EIGEN_STRONG_INLINE Derived& operator Op(const Derived & other) { return Base::operator Op(other); }
 
 #define EIGEN_SKYLINE_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, Op) \
-template<typename Other> \
-EIGEN_STRONG_INLINE Derived& operator Op(const Other& scalar) \
-{ \
-  return Base::operator Op(scalar); \
-}
+  template <typename Other>                                           \
+  EIGEN_STRONG_INLINE Derived& operator Op(const Other & scalar) {    \
+    return Base::operator Op(scalar);                                 \
+  }
 
-#define EIGEN_SKYLINE_INHERIT_ASSIGNMENT_OPERATORS(Derived) \
-  EIGEN_SKYLINE_INHERIT_ASSIGNMENT_OPERATOR(Derived, =) \
-  EIGEN_SKYLINE_INHERIT_ASSIGNMENT_OPERATOR(Derived, +=) \
-  EIGEN_SKYLINE_INHERIT_ASSIGNMENT_OPERATOR(Derived, -=) \
+#define EIGEN_SKYLINE_INHERIT_ASSIGNMENT_OPERATORS(Derived)     \
+  EIGEN_SKYLINE_INHERIT_ASSIGNMENT_OPERATOR(Derived, =)         \
+  EIGEN_SKYLINE_INHERIT_ASSIGNMENT_OPERATOR(Derived, +=)        \
+  EIGEN_SKYLINE_INHERIT_ASSIGNMENT_OPERATOR(Derived, -=)        \
   EIGEN_SKYLINE_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, *=) \
   EIGEN_SKYLINE_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, /=)
 
-#define EIGEN_SKYLINE_GENERIC_PUBLIC_INTERFACE_(Derived, BaseClass) \
-  typedef BaseClass Base; \
-  typedef typename Eigen::internal::traits<Derived>::Scalar Scalar; \
-  typedef typename Eigen::NumTraits<Scalar>::Real RealScalar; \
+#define EIGEN_SKYLINE_GENERIC_PUBLIC_INTERFACE_(Derived, BaseClass)           \
+  typedef BaseClass Base;                                                     \
+  typedef typename Eigen::internal::traits<Derived>::Scalar Scalar;           \
+  typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;                 \
   typedef typename Eigen::internal::traits<Derived>::StorageKind StorageKind; \
-  typedef typename Eigen::internal::index<StorageKind>::type Index; \
-  enum {  Flags = Eigen::internal::traits<Derived>::Flags, };
+  typedef typename Eigen::internal::index<StorageKind>::type Index;           \
+  enum {                                                                      \
+    Flags = Eigen::internal::traits<Derived>::Flags,                          \
+  };
 
 #define EIGEN_SKYLINE_GENERIC_PUBLIC_INTERFACE(Derived) \
   EIGEN_SKYLINE_GENERIC_PUBLIC_INTERFACE_(Derived, Eigen::SkylineMatrixBase<Derived>)
 
-template<typename Derived> class SkylineMatrixBase;
-template<typename Scalar_, int Flags_ = 0> class SkylineMatrix;
-template<typename Scalar_, int Flags_ = 0> class DynamicSkylineMatrix;
-template<typename Scalar_, int Flags_ = 0> class SkylineVector;
-template<typename Scalar_, int Flags_ = 0> class MappedSkylineMatrix;
+template <typename Derived>
+class SkylineMatrixBase;
+template <typename Scalar_, int Flags_ = 0>
+class SkylineMatrix;
+template <typename Scalar_, int Flags_ = 0>
+class DynamicSkylineMatrix;
+template <typename Scalar_, int Flags_ = 0>
+class SkylineVector;
+template <typename Scalar_, int Flags_ = 0>
+class MappedSkylineMatrix;
 
 namespace internal {
 
-template<typename Lhs, typename Rhs> struct skyline_product_mode;
-template<typename Lhs, typename Rhs, int ProductMode = skyline_product_mode<Lhs,Rhs>::value> struct SkylineProductReturnType;
+template <typename Lhs, typename Rhs>
+struct skyline_product_mode;
+template <typename Lhs, typename Rhs, int ProductMode = skyline_product_mode<Lhs, Rhs>::value>
+struct SkylineProductReturnType;
 
-template<typename T> class eval<T,IsSkyline>
-{
-    typedef typename traits<T>::Scalar Scalar_;
-    enum {
-          Flags_ = traits<T>::Flags
-    };
+template <typename T>
+class eval<T, IsSkyline> {
+  typedef typename traits<T>::Scalar Scalar_;
+  enum { Flags_ = traits<T>::Flags };
 
-  public:
-    typedef SkylineMatrix<Scalar_, Flags_> type;
+ public:
+  typedef SkylineMatrix<Scalar_, Flags_> type;
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SKYLINEUTIL_H
+#endif  // EIGEN_SKYLINEUTIL_H
diff --git a/unsupported/Eigen/src/SparseExtra/BlockSparseMatrix.h b/unsupported/Eigen/src/SparseExtra/BlockSparseMatrix.h
index f8f9719..6e8be84 100644
--- a/unsupported/Eigen/src/SparseExtra/BlockSparseMatrix.h
+++ b/unsupported/Eigen/src/SparseExtra/BlockSparseMatrix.h
@@ -14,57 +14,58 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 /** \ingroup SparseCore_Module
-  *
-  * \class BlockSparseMatrix
-  *
-  * \brief A versatile sparse matrix representation where each element is a block
-  *
-  * This class provides routines to manipulate block sparse matrices stored in a
-  * BSR-like representation. There are two main types :
-  *
-  * 1. All blocks have the same number of rows and columns, called block size
-  * in the following. In this case, if this block size is known at compile time,
-  * it can be given as a template parameter like
-  * \code
-  * BlockSparseMatrix<Scalar, 3, ColMajor> bmat(b_rows, b_cols);
-  * \endcode
-  * Here, bmat is a b_rows x b_cols block sparse matrix
-  * where each coefficient is a 3x3 dense matrix.
-  * If the block size is fixed but will be given at runtime,
-  * \code
-  * BlockSparseMatrix<Scalar, Dynamic, ColMajor> bmat(b_rows, b_cols);
-  * bmat.setBlockSize(block_size);
-  * \endcode
-  *
-  * 2. The second case is for variable-block sparse matrices.
-  * Here each block has its own dimensions. The only restriction is that all the blocks
-  * in a row (resp. a column) should have the same number of rows (resp. of columns).
-  * It is thus required in this case to describe the layout of the matrix by calling
-  * setBlockLayout(rowBlocks, colBlocks).
-  *
-  * In any of the previous case, the matrix can be filled by calling setFromTriplets().
-  * A regular sparse matrix can be converted to a block sparse matrix and vice versa.
-  * It is obviously required to describe the block layout beforehand by calling either
-  * setBlockSize() for fixed-size blocks or setBlockLayout for variable-size blocks.
-  *
-  * \tparam Scalar_ The Scalar type
-  * \tparam _BlockAtCompileTime The block layout option. It takes the following values
-  * Dynamic : block size known at runtime
-  * a numeric number : fixed-size block known at compile time
-  */
-template<typename Scalar_, int _BlockAtCompileTime=Dynamic, int Options_=ColMajor, typename StorageIndex_=int> class BlockSparseMatrix;
+ *
+ * \class BlockSparseMatrix
+ *
+ * \brief A versatile sparse matrix representation where each element is a block
+ *
+ * This class provides routines to manipulate block sparse matrices stored in a
+ * BSR-like representation. There are two main types :
+ *
+ * 1. All blocks have the same number of rows and columns, called block size
+ * in the following. In this case, if this block size is known at compile time,
+ * it can be given as a template parameter like
+ * \code
+ * BlockSparseMatrix<Scalar, 3, ColMajor> bmat(b_rows, b_cols);
+ * \endcode
+ * Here, bmat is a b_rows x b_cols block sparse matrix
+ * where each coefficient is a 3x3 dense matrix.
+ * If the block size is fixed but will be given at runtime,
+ * \code
+ * BlockSparseMatrix<Scalar, Dynamic, ColMajor> bmat(b_rows, b_cols);
+ * bmat.setBlockSize(block_size);
+ * \endcode
+ *
+ * 2. The second case is for variable-block sparse matrices.
+ * Here each block has its own dimensions. The only restriction is that all the blocks
+ * in a row (resp. a column) should have the same number of rows (resp. of columns).
+ * It is thus required in this case to describe the layout of the matrix by calling
+ * setBlockLayout(rowBlocks, colBlocks).
+ *
+ * In any of the previous case, the matrix can be filled by calling setFromTriplets().
+ * A regular sparse matrix can be converted to a block sparse matrix and vice versa.
+ * It is obviously required to describe the block layout beforehand by calling either
+ * setBlockSize() for fixed-size blocks or setBlockLayout for variable-size blocks.
+ *
+ * \tparam Scalar_ The Scalar type
+ * \tparam _BlockAtCompileTime The block layout option. It takes the following values
+ * Dynamic : block size known at runtime
+ * a numeric number : fixed-size block known at compile time
+ */
+template <typename Scalar_, int _BlockAtCompileTime = Dynamic, int Options_ = ColMajor, typename StorageIndex_ = int>
+class BlockSparseMatrix;
 
-template<typename BlockSparseMatrixT> class BlockSparseMatrixView;
+template <typename BlockSparseMatrixT>
+class BlockSparseMatrixView;
 
 namespace internal {
-template<typename Scalar_, int _BlockAtCompileTime, int Options_, typename Index_>
-struct traits<BlockSparseMatrix<Scalar_,_BlockAtCompileTime,Options_, Index_> >
-{
+template <typename Scalar_, int _BlockAtCompileTime, int Options_, typename Index_>
+struct traits<BlockSparseMatrix<Scalar_, _BlockAtCompileTime, Options_, Index_> > {
   typedef Scalar_ Scalar;
   typedef Index_ Index;
-  typedef Sparse StorageKind; // FIXME Where is it used ??
+  typedef Sparse StorageKind;  // FIXME Where is it used ??
   typedef MatrixXpr XprKind;
   enum {
     RowsAtCompileTime = Dynamic,
@@ -77,177 +78,142 @@
     SupportedAccessPatterns = InnerRandomAccessPattern
   };
 };
-template<typename BlockSparseMatrixT>
-struct traits<BlockSparseMatrixView<BlockSparseMatrixT> >
-{
-  typedef Ref<Matrix<typename BlockSparseMatrixT::Scalar, BlockSparseMatrixT::BlockSize, BlockSparseMatrixT::BlockSize> > Scalar;
-  typedef Ref<Matrix<typename BlockSparseMatrixT::RealScalar, BlockSparseMatrixT::BlockSize, BlockSparseMatrixT::BlockSize> > RealScalar;
-
+template <typename BlockSparseMatrixT>
+struct traits<BlockSparseMatrixView<BlockSparseMatrixT> > {
+  typedef Ref<
+      Matrix<typename BlockSparseMatrixT::Scalar, BlockSparseMatrixT::BlockSize, BlockSparseMatrixT::BlockSize> >
+      Scalar;
+  typedef Ref<
+      Matrix<typename BlockSparseMatrixT::RealScalar, BlockSparseMatrixT::BlockSize, BlockSparseMatrixT::BlockSize> >
+      RealScalar;
 };
 
 // Function object to sort a triplet list
-template<typename Iterator, bool IsColMajor>
-struct TripletComp
-{
+template <typename Iterator, bool IsColMajor>
+struct TripletComp {
   typedef typename Iterator::value_type Triplet;
-  bool operator()(const Triplet& a, const Triplet& b)
-  { if(IsColMajor)
+  bool operator()(const Triplet& a, const Triplet& b) {
+    if (IsColMajor)
       return ((a.col() == b.col() && a.row() < b.row()) || (a.col() < b.col()));
     else
       return ((a.row() == b.row() && a.col() < b.col()) || (a.row() < b.row()));
   }
 };
-} // end namespace internal
-
+}  // end namespace internal
 
 /* Proxy to view the block sparse matrix as a regular sparse matrix */
-template<typename BlockSparseMatrixT>
-class BlockSparseMatrixView : public SparseMatrixBase<BlockSparseMatrixT>
-{
-  public:
-    typedef Ref<typename BlockSparseMatrixT::BlockScalar> Scalar;
-    typedef Ref<typename BlockSparseMatrixT::BlockRealScalar> RealScalar;
-    typedef typename BlockSparseMatrixT::Index Index;
-    typedef  BlockSparseMatrixT Nested;
-    enum {
-      Flags = BlockSparseMatrixT::Options,
-      Options = BlockSparseMatrixT::Options,
-      RowsAtCompileTime = BlockSparseMatrixT::RowsAtCompileTime,
-      ColsAtCompileTime = BlockSparseMatrixT::ColsAtCompileTime,
-      MaxColsAtCompileTime = BlockSparseMatrixT::MaxColsAtCompileTime,
-      MaxRowsAtCompileTime = BlockSparseMatrixT::MaxRowsAtCompileTime
-    };
-  public:
-    BlockSparseMatrixView(const BlockSparseMatrixT& spblockmat)
-     : m_spblockmat(spblockmat)
-    {}
+template <typename BlockSparseMatrixT>
+class BlockSparseMatrixView : public SparseMatrixBase<BlockSparseMatrixT> {
+ public:
+  typedef Ref<typename BlockSparseMatrixT::BlockScalar> Scalar;
+  typedef Ref<typename BlockSparseMatrixT::BlockRealScalar> RealScalar;
+  typedef typename BlockSparseMatrixT::Index Index;
+  typedef BlockSparseMatrixT Nested;
+  enum {
+    Flags = BlockSparseMatrixT::Options,
+    Options = BlockSparseMatrixT::Options,
+    RowsAtCompileTime = BlockSparseMatrixT::RowsAtCompileTime,
+    ColsAtCompileTime = BlockSparseMatrixT::ColsAtCompileTime,
+    MaxColsAtCompileTime = BlockSparseMatrixT::MaxColsAtCompileTime,
+    MaxRowsAtCompileTime = BlockSparseMatrixT::MaxRowsAtCompileTime
+  };
 
-    Index outerSize() const
-    {
-      return (Flags&RowMajorBit) == 1 ? this->rows() : this->cols();
-    }
-    Index cols() const
-    {
-      return m_spblockmat.blockCols();
-    }
-    Index rows() const
-    {
-      return m_spblockmat.blockRows();
-    }
-    Scalar coeff(Index row, Index col)
-    {
-      return m_spblockmat.coeff(row, col);
-    }
-    Scalar coeffRef(Index row, Index col)
-    {
-      return m_spblockmat.coeffRef(row, col);
-    }
-    // Wrapper to iterate over all blocks
-    class InnerIterator : public BlockSparseMatrixT::BlockInnerIterator
-    {
-      public:
-      InnerIterator(const BlockSparseMatrixView& mat, Index outer)
-          : BlockSparseMatrixT::BlockInnerIterator(mat.m_spblockmat, outer)
-      {}
+ public:
+  BlockSparseMatrixView(const BlockSparseMatrixT& spblockmat) : m_spblockmat(spblockmat) {}
 
-    };
+  Index outerSize() const { return (Flags & RowMajorBit) == 1 ? this->rows() : this->cols(); }
+  Index cols() const { return m_spblockmat.blockCols(); }
+  Index rows() const { return m_spblockmat.blockRows(); }
+  Scalar coeff(Index row, Index col) { return m_spblockmat.coeff(row, col); }
+  Scalar coeffRef(Index row, Index col) { return m_spblockmat.coeffRef(row, col); }
+  // Wrapper to iterate over all blocks
+  class InnerIterator : public BlockSparseMatrixT::BlockInnerIterator {
+   public:
+    InnerIterator(const BlockSparseMatrixView& mat, Index outer)
+        : BlockSparseMatrixT::BlockInnerIterator(mat.m_spblockmat, outer) {}
+  };
 
-  protected:
-    const BlockSparseMatrixT& m_spblockmat;
+ protected:
+  const BlockSparseMatrixT& m_spblockmat;
 };
 
 // Proxy to view a regular vector as a block vector
-template<typename BlockSparseMatrixT, typename VectorType>
-class BlockVectorView
-{
-  public:
-    enum {
-      BlockSize = BlockSparseMatrixT::BlockSize,
-      ColsAtCompileTime = VectorType::ColsAtCompileTime,
-      RowsAtCompileTime = VectorType::RowsAtCompileTime,
-      Flags = VectorType::Flags
-    };
-    typedef Ref<const Matrix<typename BlockSparseMatrixT::Scalar, (RowsAtCompileTime==1)? 1 : BlockSize, (ColsAtCompileTime==1)? 1 : BlockSize> >Scalar;
-    typedef typename BlockSparseMatrixT::Index Index;
-  public:
-    BlockVectorView(const BlockSparseMatrixT& spblockmat, const VectorType& vec)
-    : m_spblockmat(spblockmat),m_vec(vec)
-    { }
-    inline Index cols() const
-    {
-      return m_vec.cols();
-    }
-    inline Index size() const
-    {
-      return m_spblockmat.blockRows();
-    }
-    inline Scalar coeff(Index bi) const
-    {
-      Index startRow = m_spblockmat.blockRowsIndex(bi);
-      Index rowSize = m_spblockmat.blockRowsIndex(bi+1) - startRow;
-      return m_vec.middleRows(startRow, rowSize);
-    }
-    inline Scalar coeff(Index bi, Index j) const
-    {
-      Index startRow = m_spblockmat.blockRowsIndex(bi);
-      Index rowSize = m_spblockmat.blockRowsIndex(bi+1) - startRow;
-      return m_vec.block(startRow, j, rowSize, 1);
-    }
-  protected:
-    const BlockSparseMatrixT& m_spblockmat;
-    const VectorType& m_vec;
+template <typename BlockSparseMatrixT, typename VectorType>
+class BlockVectorView {
+ public:
+  enum {
+    BlockSize = BlockSparseMatrixT::BlockSize,
+    ColsAtCompileTime = VectorType::ColsAtCompileTime,
+    RowsAtCompileTime = VectorType::RowsAtCompileTime,
+    Flags = VectorType::Flags
+  };
+  typedef Ref<const Matrix<typename BlockSparseMatrixT::Scalar, (RowsAtCompileTime == 1) ? 1 : BlockSize,
+                           (ColsAtCompileTime == 1) ? 1 : BlockSize> >
+      Scalar;
+  typedef typename BlockSparseMatrixT::Index Index;
+
+ public:
+  BlockVectorView(const BlockSparseMatrixT& spblockmat, const VectorType& vec) : m_spblockmat(spblockmat), m_vec(vec) {}
+  inline Index cols() const { return m_vec.cols(); }
+  inline Index size() const { return m_spblockmat.blockRows(); }
+  inline Scalar coeff(Index bi) const {
+    Index startRow = m_spblockmat.blockRowsIndex(bi);
+    Index rowSize = m_spblockmat.blockRowsIndex(bi + 1) - startRow;
+    return m_vec.middleRows(startRow, rowSize);
+  }
+  inline Scalar coeff(Index bi, Index j) const {
+    Index startRow = m_spblockmat.blockRowsIndex(bi);
+    Index rowSize = m_spblockmat.blockRowsIndex(bi + 1) - startRow;
+    return m_vec.block(startRow, j, rowSize, 1);
+  }
+
+ protected:
+  const BlockSparseMatrixT& m_spblockmat;
+  const VectorType& m_vec;
 };
 
-template<typename VectorType, typename Index> class BlockVectorReturn;
-
+template <typename VectorType, typename Index>
+class BlockVectorReturn;
 
 // Proxy to view a regular vector as a block vector
-template<typename BlockSparseMatrixT, typename VectorType>
-class BlockVectorReturn
-{
-  public:
-    enum {
-      ColsAtCompileTime = VectorType::ColsAtCompileTime,
-      RowsAtCompileTime = VectorType::RowsAtCompileTime,
-      Flags = VectorType::Flags
-    };
-    typedef Ref<Matrix<typename VectorType::Scalar, RowsAtCompileTime, ColsAtCompileTime> > Scalar;
-    typedef typename BlockSparseMatrixT::Index Index;
-  public:
-    BlockVectorReturn(const BlockSparseMatrixT& spblockmat, VectorType& vec)
-    : m_spblockmat(spblockmat),m_vec(vec)
-    { }
-    inline Index size() const
-    {
-      return m_spblockmat.blockRows();
-    }
-    inline Scalar coeffRef(Index bi)
-    {
-      Index startRow = m_spblockmat.blockRowsIndex(bi);
-      Index rowSize = m_spblockmat.blockRowsIndex(bi+1) - startRow;
-      return m_vec.middleRows(startRow, rowSize);
-    }
-    inline Scalar coeffRef(Index bi, Index j)
-    {
-      Index startRow = m_spblockmat.blockRowsIndex(bi);
-      Index rowSize = m_spblockmat.blockRowsIndex(bi+1) - startRow;
-      return m_vec.block(startRow, j, rowSize, 1);
-    }
+template <typename BlockSparseMatrixT, typename VectorType>
+class BlockVectorReturn {
+ public:
+  enum {
+    ColsAtCompileTime = VectorType::ColsAtCompileTime,
+    RowsAtCompileTime = VectorType::RowsAtCompileTime,
+    Flags = VectorType::Flags
+  };
+  typedef Ref<Matrix<typename VectorType::Scalar, RowsAtCompileTime, ColsAtCompileTime> > Scalar;
+  typedef typename BlockSparseMatrixT::Index Index;
 
-  protected:
-    const BlockSparseMatrixT& m_spblockmat;
-    VectorType& m_vec;
+ public:
+  BlockVectorReturn(const BlockSparseMatrixT& spblockmat, VectorType& vec) : m_spblockmat(spblockmat), m_vec(vec) {}
+  inline Index size() const { return m_spblockmat.blockRows(); }
+  inline Scalar coeffRef(Index bi) {
+    Index startRow = m_spblockmat.blockRowsIndex(bi);
+    Index rowSize = m_spblockmat.blockRowsIndex(bi + 1) - startRow;
+    return m_vec.middleRows(startRow, rowSize);
+  }
+  inline Scalar coeffRef(Index bi, Index j) {
+    Index startRow = m_spblockmat.blockRowsIndex(bi);
+    Index rowSize = m_spblockmat.blockRowsIndex(bi + 1) - startRow;
+    return m_vec.block(startRow, j, rowSize, 1);
+  }
+
+ protected:
+  const BlockSparseMatrixT& m_spblockmat;
+  VectorType& m_vec;
 };
 
 // Block version of the sparse dense product
-template<typename Lhs, typename Rhs>
+template <typename Lhs, typename Rhs>
 class BlockSparseTimeDenseProduct;
 
 namespace internal {
 
-template<typename BlockSparseMatrixT, typename VecType>
-struct traits<BlockSparseTimeDenseProduct<BlockSparseMatrixT, VecType> >
-{
+template <typename BlockSparseMatrixT, typename VecType>
+struct traits<BlockSparseTimeDenseProduct<BlockSparseMatrixT, VecType> > {
   typedef Dense StorageKind;
   typedef MatrixXpr XprKind;
   typedef typename BlockSparseMatrixT::Scalar Scalar;
@@ -261,822 +227,748 @@
     CoeffReadCost = internal::traits<BlockSparseMatrixT>::CoeffReadCost
   };
 };
-} // end namespace internal
+}  // end namespace internal
 
-template<typename Lhs, typename Rhs>
-class BlockSparseTimeDenseProduct
-  : public ProductBase<BlockSparseTimeDenseProduct<Lhs,Rhs>, Lhs, Rhs>
-{
-  public:
-    EIGEN_PRODUCT_PUBLIC_INTERFACE(BlockSparseTimeDenseProduct)
+template <typename Lhs, typename Rhs>
+class BlockSparseTimeDenseProduct : public ProductBase<BlockSparseTimeDenseProduct<Lhs, Rhs>, Lhs, Rhs> {
+ public:
+  EIGEN_PRODUCT_PUBLIC_INTERFACE(BlockSparseTimeDenseProduct)
 
-    BlockSparseTimeDenseProduct(const Lhs& lhs, const Rhs& rhs) : Base(lhs,rhs)
-    {}
+  BlockSparseTimeDenseProduct(const Lhs& lhs, const Rhs& rhs) : Base(lhs, rhs) {}
 
-    template<typename Dest> void scaleAndAddTo(Dest& dest, const typename Rhs::Scalar& alpha) const
-    {
-      BlockVectorReturn<Lhs,Dest> tmpDest(m_lhs, dest);
-      internal::sparse_time_dense_product( BlockSparseMatrixView<Lhs>(m_lhs),  BlockVectorView<Lhs, Rhs>(m_lhs, m_rhs), tmpDest, alpha);
-    }
+  template <typename Dest>
+  void scaleAndAddTo(Dest& dest, const typename Rhs::Scalar& alpha) const {
+    BlockVectorReturn<Lhs, Dest> tmpDest(m_lhs, dest);
+    internal::sparse_time_dense_product(BlockSparseMatrixView<Lhs>(m_lhs), BlockVectorView<Lhs, Rhs>(m_lhs, m_rhs),
+                                        tmpDest, alpha);
+  }
 
-  private:
-    BlockSparseTimeDenseProduct& operator=(const BlockSparseTimeDenseProduct&);
+ private:
+  BlockSparseTimeDenseProduct& operator=(const BlockSparseTimeDenseProduct&);
 };
 
-template<typename Scalar_, int _BlockAtCompileTime, int Options_, typename StorageIndex_>
-class BlockSparseMatrix : public SparseMatrixBase<BlockSparseMatrix<Scalar_,_BlockAtCompileTime, Options_,StorageIndex_> >
-{
-  public:
-    typedef Scalar_ Scalar;
-    typedef typename NumTraits<Scalar>::Real RealScalar;
-    typedef StorageIndex_ StorageIndex;
-    typedef typename internal::ref_selector<BlockSparseMatrix<Scalar_, _BlockAtCompileTime, Options_, StorageIndex_> >::type Nested;
+template <typename Scalar_, int _BlockAtCompileTime, int Options_, typename StorageIndex_>
+class BlockSparseMatrix
+    : public SparseMatrixBase<BlockSparseMatrix<Scalar_, _BlockAtCompileTime, Options_, StorageIndex_> > {
+ public:
+  typedef Scalar_ Scalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef StorageIndex_ StorageIndex;
+  typedef
+      typename internal::ref_selector<BlockSparseMatrix<Scalar_, _BlockAtCompileTime, Options_, StorageIndex_> >::type
+          Nested;
 
-    enum {
-      Options = Options_,
-      Flags = Options,
-      BlockSize=_BlockAtCompileTime,
-      RowsAtCompileTime = Dynamic,
-      ColsAtCompileTime = Dynamic,
-      MaxRowsAtCompileTime = Dynamic,
-      MaxColsAtCompileTime = Dynamic,
-      IsVectorAtCompileTime = 0,
-      IsColMajor = Flags&RowMajorBit ? 0 : 1
-    };
-    typedef Matrix<Scalar, _BlockAtCompileTime, _BlockAtCompileTime,IsColMajor ? ColMajor : RowMajor> BlockScalar;
-    typedef Matrix<RealScalar, _BlockAtCompileTime, _BlockAtCompileTime,IsColMajor ? ColMajor : RowMajor> BlockRealScalar;
-    typedef std::conditional_t<_BlockAtCompileTime==Dynamic, Scalar, BlockScalar> BlockScalarReturnType;
-    typedef BlockSparseMatrix<Scalar, BlockSize, IsColMajor ? ColMajor : RowMajor, StorageIndex> PlainObject;
-  public:
-    // Default constructor
-    BlockSparseMatrix()
-    : m_innerBSize(0),m_outerBSize(0),m_innerOffset(0),m_outerOffset(0),
-      m_nonzerosblocks(0),m_values(0),m_blockPtr(0),m_indices(0),
-      m_outerIndex(0),m_blockSize(BlockSize)
-    { }
+  enum {
+    Options = Options_,
+    Flags = Options,
+    BlockSize = _BlockAtCompileTime,
+    RowsAtCompileTime = Dynamic,
+    ColsAtCompileTime = Dynamic,
+    MaxRowsAtCompileTime = Dynamic,
+    MaxColsAtCompileTime = Dynamic,
+    IsVectorAtCompileTime = 0,
+    IsColMajor = Flags & RowMajorBit ? 0 : 1
+  };
+  typedef Matrix<Scalar, _BlockAtCompileTime, _BlockAtCompileTime, IsColMajor ? ColMajor : RowMajor> BlockScalar;
+  typedef Matrix<RealScalar, _BlockAtCompileTime, _BlockAtCompileTime, IsColMajor ? ColMajor : RowMajor>
+      BlockRealScalar;
+  typedef std::conditional_t<_BlockAtCompileTime == Dynamic, Scalar, BlockScalar> BlockScalarReturnType;
+  typedef BlockSparseMatrix<Scalar, BlockSize, IsColMajor ? ColMajor : RowMajor, StorageIndex> PlainObject;
 
+ public:
+  // Default constructor
+  BlockSparseMatrix()
+      : m_innerBSize(0),
+        m_outerBSize(0),
+        m_innerOffset(0),
+        m_outerOffset(0),
+        m_nonzerosblocks(0),
+        m_values(0),
+        m_blockPtr(0),
+        m_indices(0),
+        m_outerIndex(0),
+        m_blockSize(BlockSize) {}
 
-    /**
-     * \brief Construct and resize
-     *
-     */
-    BlockSparseMatrix(Index brow, Index bcol)
+  /**
+   * \brief Construct and resize
+   *
+   */
+  BlockSparseMatrix(Index brow, Index bcol)
       : m_innerBSize(IsColMajor ? brow : bcol),
         m_outerBSize(IsColMajor ? bcol : brow),
-        m_innerOffset(0),m_outerOffset(0),m_nonzerosblocks(0),
-        m_values(0),m_blockPtr(0),m_indices(0),
-        m_outerIndex(0),m_blockSize(BlockSize)
-    { }
+        m_innerOffset(0),
+        m_outerOffset(0),
+        m_nonzerosblocks(0),
+        m_values(0),
+        m_blockPtr(0),
+        m_indices(0),
+        m_outerIndex(0),
+        m_blockSize(BlockSize) {}
 
-    /**
-     * \brief Copy-constructor
-     */
-    BlockSparseMatrix(const BlockSparseMatrix& other)
-      : m_innerBSize(other.m_innerBSize),m_outerBSize(other.m_outerBSize),
-        m_nonzerosblocks(other.m_nonzerosblocks),m_nonzeros(other.m_nonzeros),
-        m_blockPtr(0),m_blockSize(other.m_blockSize)
-    {
-      // should we allow copying between variable-size blocks and fixed-size blocks ??
-      eigen_assert(m_blockSize == BlockSize && " CAN NOT COPY BETWEEN FIXED-SIZE AND VARIABLE-SIZE BLOCKS");
+  /**
+   * \brief Copy-constructor
+   */
+  BlockSparseMatrix(const BlockSparseMatrix& other)
+      : m_innerBSize(other.m_innerBSize),
+        m_outerBSize(other.m_outerBSize),
+        m_nonzerosblocks(other.m_nonzerosblocks),
+        m_nonzeros(other.m_nonzeros),
+        m_blockPtr(0),
+        m_blockSize(other.m_blockSize) {
+    // should we allow copying between variable-size blocks and fixed-size blocks ??
+    eigen_assert(m_blockSize == BlockSize && " CAN NOT COPY BETWEEN FIXED-SIZE AND VARIABLE-SIZE BLOCKS");
 
-      std::copy(other.m_innerOffset, other.m_innerOffset+m_innerBSize+1, m_innerOffset);
-      std::copy(other.m_outerOffset, other.m_outerOffset+m_outerBSize+1, m_outerOffset);
-      std::copy(other.m_values, other.m_values+m_nonzeros, m_values);
+    std::copy(other.m_innerOffset, other.m_innerOffset + m_innerBSize + 1, m_innerOffset);
+    std::copy(other.m_outerOffset, other.m_outerOffset + m_outerBSize + 1, m_outerOffset);
+    std::copy(other.m_values, other.m_values + m_nonzeros, m_values);
 
-      if(m_blockSize != Dynamic)
-        std::copy(other.m_blockPtr, other.m_blockPtr+m_nonzerosblocks, m_blockPtr);
+    if (m_blockSize != Dynamic) std::copy(other.m_blockPtr, other.m_blockPtr + m_nonzerosblocks, m_blockPtr);
 
-      std::copy(other.m_indices, other.m_indices+m_nonzerosblocks, m_indices);
-      std::copy(other.m_outerIndex, other.m_outerIndex+m_outerBSize, m_outerIndex);
-    }
+    std::copy(other.m_indices, other.m_indices + m_nonzerosblocks, m_indices);
+    std::copy(other.m_outerIndex, other.m_outerIndex + m_outerBSize, m_outerIndex);
+  }
 
-    friend void swap(BlockSparseMatrix& first, BlockSparseMatrix& second)
-    {
-      std::swap(first.m_innerBSize, second.m_innerBSize);
-      std::swap(first.m_outerBSize, second.m_outerBSize);
-      std::swap(first.m_innerOffset, second.m_innerOffset);
-      std::swap(first.m_outerOffset, second.m_outerOffset);
-      std::swap(first.m_nonzerosblocks, second.m_nonzerosblocks);
-      std::swap(first.m_nonzeros, second.m_nonzeros);
-      std::swap(first.m_values, second.m_values);
-      std::swap(first.m_blockPtr, second.m_blockPtr);
-      std::swap(first.m_indices, second.m_indices);
-      std::swap(first.m_outerIndex, second.m_outerIndex);
-      std::swap(first.m_BlockSize, second.m_blockSize);
-    }
+  friend void swap(BlockSparseMatrix& first, BlockSparseMatrix& second) {
+    std::swap(first.m_innerBSize, second.m_innerBSize);
+    std::swap(first.m_outerBSize, second.m_outerBSize);
+    std::swap(first.m_innerOffset, second.m_innerOffset);
+    std::swap(first.m_outerOffset, second.m_outerOffset);
+    std::swap(first.m_nonzerosblocks, second.m_nonzerosblocks);
+    std::swap(first.m_nonzeros, second.m_nonzeros);
+    std::swap(first.m_values, second.m_values);
+    std::swap(first.m_blockPtr, second.m_blockPtr);
+    std::swap(first.m_indices, second.m_indices);
+    std::swap(first.m_outerIndex, second.m_outerIndex);
+    std::swap(first.m_BlockSize, second.m_blockSize);
+  }
 
-    BlockSparseMatrix& operator=(BlockSparseMatrix other)
-    {
-      //Copy-and-swap paradigm ... avoid leaked data if thrown
-      swap(*this, other);
-      return *this;
-    }
+  BlockSparseMatrix& operator=(BlockSparseMatrix other) {
+    // Copy-and-swap paradigm ... avoid leaked data if thrown
+    swap(*this, other);
+    return *this;
+  }
 
-    // Destructor
-    ~BlockSparseMatrix()
-    {
-      delete[] m_outerIndex;
-      delete[] m_innerOffset;
-      delete[] m_outerOffset;
-      delete[] m_indices;
-      delete[] m_blockPtr;
-      delete[] m_values;
-    }
+  // Destructor
+  ~BlockSparseMatrix() {
+    delete[] m_outerIndex;
+    delete[] m_innerOffset;
+    delete[] m_outerOffset;
+    delete[] m_indices;
+    delete[] m_blockPtr;
+    delete[] m_values;
+  }
 
+  /**
+   * \brief Constructor from a sparse matrix
+   *
+   */
+  template <typename MatrixType>
+  inline BlockSparseMatrix(const MatrixType& spmat) : m_blockSize(BlockSize) {
+    EIGEN_STATIC_ASSERT((m_blockSize != Dynamic), THIS_METHOD_IS_ONLY_FOR_FIXED_SIZE);
 
-    /**
-      * \brief Constructor from a sparse matrix
-      *
-      */
-    template<typename MatrixType>
-    inline BlockSparseMatrix(const MatrixType& spmat) : m_blockSize(BlockSize)
-    {
-      EIGEN_STATIC_ASSERT((m_blockSize != Dynamic), THIS_METHOD_IS_ONLY_FOR_FIXED_SIZE);
+    *this = spmat;
+  }
 
-      *this = spmat;
-    }
+  /**
+   * \brief Assignment from a sparse matrix with the same storage order
+   *
+   * Convert from a sparse matrix to block sparse matrix.
+   * \warning Before calling this function, tt is necessary to call
+   * either setBlockLayout() (matrices with variable-size blocks)
+   * or setBlockSize() (for fixed-size blocks).
+   */
+  template <typename MatrixType>
+  inline BlockSparseMatrix& operator=(const MatrixType& spmat) {
+    eigen_assert((m_innerBSize != 0 && m_outerBSize != 0) &&
+                 "Trying to assign to a zero-size matrix, call resize() first");
+    eigen_assert(((MatrixType::Options & RowMajorBit) != IsColMajor) && "Wrong storage order");
+    typedef SparseMatrix<bool, MatrixType::Options, typename MatrixType::Index> MatrixPatternType;
+    MatrixPatternType blockPattern(blockRows(), blockCols());
+    m_nonzeros = 0;
 
-    /**
-      * \brief Assignment from a sparse matrix with the same storage order
-      *
-      * Convert from a sparse matrix to block sparse matrix.
-      * \warning Before calling this function, tt is necessary to call
-      * either setBlockLayout() (matrices with variable-size blocks)
-      * or setBlockSize() (for fixed-size blocks).
-      */
-    template<typename MatrixType>
-    inline BlockSparseMatrix& operator=(const MatrixType& spmat)
-    {
-      eigen_assert((m_innerBSize != 0 && m_outerBSize != 0)
-                   && "Trying to assign to a zero-size matrix, call resize() first");
-      eigen_assert(((MatrixType::Options&RowMajorBit) != IsColMajor) && "Wrong storage order");
-      typedef SparseMatrix<bool,MatrixType::Options,typename MatrixType::Index> MatrixPatternType;
-      MatrixPatternType  blockPattern(blockRows(), blockCols());
-      m_nonzeros = 0;
-
-      // First, compute the number of nonzero blocks and their locations
-      for(StorageIndex bj = 0; bj < m_outerBSize; ++bj)
-      {
-        // Browse each outer block and compute the structure
-        std::vector<bool> nzblocksFlag(m_innerBSize,false);  // Record the existing blocks
-        blockPattern.startVec(bj);
-        for(StorageIndex j = blockOuterIndex(bj); j < blockOuterIndex(bj+1); ++j)
-        {
-          typename MatrixType::InnerIterator it_spmat(spmat, j);
-          for(; it_spmat; ++it_spmat)
-          {
-            StorageIndex bi = innerToBlock(it_spmat.index()); // Index of the current nonzero block
-            if(!nzblocksFlag[bi])
-            {
-              // Save the index of this nonzero block
-              nzblocksFlag[bi] = true;
-              blockPattern.insertBackByOuterInnerUnordered(bj, bi) = true;
-              // Compute the total number of nonzeros (including explicit zeros in blocks)
-              m_nonzeros += blockOuterSize(bj) * blockInnerSize(bi);
-            }
+    // First, compute the number of nonzero blocks and their locations
+    for (StorageIndex bj = 0; bj < m_outerBSize; ++bj) {
+      // Browse each outer block and compute the structure
+      std::vector<bool> nzblocksFlag(m_innerBSize, false);  // Record the existing blocks
+      blockPattern.startVec(bj);
+      for (StorageIndex j = blockOuterIndex(bj); j < blockOuterIndex(bj + 1); ++j) {
+        typename MatrixType::InnerIterator it_spmat(spmat, j);
+        for (; it_spmat; ++it_spmat) {
+          StorageIndex bi = innerToBlock(it_spmat.index());  // Index of the current nonzero block
+          if (!nzblocksFlag[bi]) {
+            // Save the index of this nonzero block
+            nzblocksFlag[bi] = true;
+            blockPattern.insertBackByOuterInnerUnordered(bj, bi) = true;
+            // Compute the total number of nonzeros (including explicit zeros in blocks)
+            m_nonzeros += blockOuterSize(bj) * blockInnerSize(bi);
           }
-        } // end current outer block
-      }
-      blockPattern.finalize();
-
-      // Allocate the internal arrays
-      setBlockStructure(blockPattern);
-
-      for(StorageIndex nz = 0; nz < m_nonzeros; ++nz) m_values[nz] = Scalar(0);
-      for(StorageIndex bj = 0; bj < m_outerBSize; ++bj)
-      {
-        // Now copy the values
-        for(StorageIndex j = blockOuterIndex(bj); j < blockOuterIndex(bj+1); ++j)
-        {
-          // Browse the outer block column by column (for column-major matrices)
-          typename MatrixType::InnerIterator it_spmat(spmat, j);
-          for(; it_spmat; ++it_spmat)
-          {
-            StorageIndex idx = 0; // Position of this block in the column block
-            StorageIndex bi = innerToBlock(it_spmat.index()); // Index of the current nonzero block
-            // Go to the inner block where this element belongs to
-            while(bi > m_indices[m_outerIndex[bj]+idx]) ++idx; // Not expensive for ordered blocks
-            StorageIndex idxVal;// Get the right position in the array of values for this element
-            if(m_blockSize == Dynamic)
-            {
-              // Offset from all blocks before ...
-              idxVal =  m_blockPtr[m_outerIndex[bj]+idx];
-              // ... and offset inside the block
-              idxVal += (j - blockOuterIndex(bj)) * blockOuterSize(bj) + it_spmat.index() - m_innerOffset[bi];
-            }
-            else
-            {
-              // All blocks before
-              idxVal = (m_outerIndex[bj] + idx) * m_blockSize * m_blockSize;
-              // inside the block
-              idxVal += (j - blockOuterIndex(bj)) * m_blockSize + (it_spmat.index()%m_blockSize);
-            }
-            // Insert the value
-            m_values[idxVal] = it_spmat.value();
-          } // end of this column
-        } // end of this block
-      } // end of this outer block
-
-      return *this;
-    }
-
-    /**
-      * \brief Set the nonzero block pattern of the matrix
-      *
-      * Given a sparse matrix describing the nonzero block pattern,
-      * this function prepares the internal pointers for values.
-      * After calling this function, any *nonzero* block (bi, bj) can be set
-      * with a simple call to coeffRef(bi,bj).
-      *
-      *
-      * \warning Before calling this function, tt is necessary to call
-      * either setBlockLayout() (matrices with variable-size blocks)
-      * or setBlockSize() (for fixed-size blocks).
-      *
-      * \param blockPattern Sparse matrix of boolean elements describing the block structure
-      *
-      * \sa setBlockLayout() \sa setBlockSize()
-      */
-    template<typename MatrixType>
-    void setBlockStructure(const MatrixType& blockPattern)
-    {
-      resize(blockPattern.rows(), blockPattern.cols());
-      reserve(blockPattern.nonZeros());
-
-      // Browse the block pattern and set up the various pointers
-      m_outerIndex[0] = 0;
-      if(m_blockSize == Dynamic) m_blockPtr[0] = 0;
-      for(StorageIndex nz = 0; nz < m_nonzeros; ++nz) m_values[nz] = Scalar(0);
-      for(StorageIndex bj = 0; bj < m_outerBSize; ++bj)
-      {
-        //Browse each outer block
-
-        //First, copy and save the indices of nonzero blocks
-        //FIXME : find a way to avoid this ...
-        std::vector<int> nzBlockIdx;
-        typename MatrixType::InnerIterator it(blockPattern, bj);
-        for(; it; ++it)
-        {
-          nzBlockIdx.push_back(it.index());
         }
-        std::sort(nzBlockIdx.begin(), nzBlockIdx.end());
+      }  // end current outer block
+    }
+    blockPattern.finalize();
 
-        // Now, fill block indices and (eventually) pointers to blocks
-        for(StorageIndex idx = 0; idx < nzBlockIdx.size(); ++idx)
-        {
-          StorageIndex offset = m_outerIndex[bj]+idx; // offset in m_indices
-          m_indices[offset] = nzBlockIdx[idx];
-          if(m_blockSize == Dynamic)
-            m_blockPtr[offset] = m_blockPtr[offset-1] + blockInnerSize(nzBlockIdx[idx]) * blockOuterSize(bj);
-          // There is no blockPtr for fixed-size blocks... not needed !???
-        }
-        // Save the pointer to the next outer block
-        m_outerIndex[bj+1] = m_outerIndex[bj] + nzBlockIdx.size();
+    // Allocate the internal arrays
+    setBlockStructure(blockPattern);
+
+    for (StorageIndex nz = 0; nz < m_nonzeros; ++nz) m_values[nz] = Scalar(0);
+    for (StorageIndex bj = 0; bj < m_outerBSize; ++bj) {
+      // Now copy the values
+      for (StorageIndex j = blockOuterIndex(bj); j < blockOuterIndex(bj + 1); ++j) {
+        // Browse the outer block column by column (for column-major matrices)
+        typename MatrixType::InnerIterator it_spmat(spmat, j);
+        for (; it_spmat; ++it_spmat) {
+          StorageIndex idx = 0;                              // Position of this block in the column block
+          StorageIndex bi = innerToBlock(it_spmat.index());  // Index of the current nonzero block
+          // Go to the inner block where this element belongs to
+          while (bi > m_indices[m_outerIndex[bj] + idx]) ++idx;  // Not expensive for ordered blocks
+          StorageIndex idxVal;  // Get the right position in the array of values for this element
+          if (m_blockSize == Dynamic) {
+            // Offset from all blocks before ...
+            idxVal = m_blockPtr[m_outerIndex[bj] + idx];
+            // ... and offset inside the block
+            idxVal += (j - blockOuterIndex(bj)) * blockOuterSize(bj) + it_spmat.index() - m_innerOffset[bi];
+          } else {
+            // All blocks before
+            idxVal = (m_outerIndex[bj] + idx) * m_blockSize * m_blockSize;
+            // inside the block
+            idxVal += (j - blockOuterIndex(bj)) * m_blockSize + (it_spmat.index() % m_blockSize);
+          }
+          // Insert the value
+          m_values[idxVal] = it_spmat.value();
+        }  // end of this column
+      }    // end of this block
+    }      // end of this outer block
+
+    return *this;
+  }
+
+  /**
+   * \brief Set the nonzero block pattern of the matrix
+   *
+   * Given a sparse matrix describing the nonzero block pattern,
+   * this function prepares the internal pointers for values.
+   * After calling this function, any *nonzero* block (bi, bj) can be set
+   * with a simple call to coeffRef(bi,bj).
+   *
+   *
+   * \warning Before calling this function, tt is necessary to call
+   * either setBlockLayout() (matrices with variable-size blocks)
+   * or setBlockSize() (for fixed-size blocks).
+   *
+   * \param blockPattern Sparse matrix of boolean elements describing the block structure
+   *
+   * \sa setBlockLayout() \sa setBlockSize()
+   */
+  template <typename MatrixType>
+  void setBlockStructure(const MatrixType& blockPattern) {
+    resize(blockPattern.rows(), blockPattern.cols());
+    reserve(blockPattern.nonZeros());
+
+    // Browse the block pattern and set up the various pointers
+    m_outerIndex[0] = 0;
+    if (m_blockSize == Dynamic) m_blockPtr[0] = 0;
+    for (StorageIndex nz = 0; nz < m_nonzeros; ++nz) m_values[nz] = Scalar(0);
+    for (StorageIndex bj = 0; bj < m_outerBSize; ++bj) {
+      // Browse each outer block
+
+      // First, copy and save the indices of nonzero blocks
+      // FIXME : find a way to avoid this ...
+      std::vector<int> nzBlockIdx;
+      typename MatrixType::InnerIterator it(blockPattern, bj);
+      for (; it; ++it) {
+        nzBlockIdx.push_back(it.index());
+      }
+      std::sort(nzBlockIdx.begin(), nzBlockIdx.end());
+
+      // Now, fill block indices and (eventually) pointers to blocks
+      for (StorageIndex idx = 0; idx < nzBlockIdx.size(); ++idx) {
+        StorageIndex offset = m_outerIndex[bj] + idx;  // offset in m_indices
+        m_indices[offset] = nzBlockIdx[idx];
+        if (m_blockSize == Dynamic)
+          m_blockPtr[offset] = m_blockPtr[offset - 1] + blockInnerSize(nzBlockIdx[idx]) * blockOuterSize(bj);
+        // There is no blockPtr for fixed-size blocks... not needed !???
+      }
+      // Save the pointer to the next outer block
+      m_outerIndex[bj + 1] = m_outerIndex[bj] + nzBlockIdx.size();
+    }
+  }
+
+  /**
+   * \brief Set the number of rows and columns blocks
+   */
+  inline void resize(Index brow, Index bcol) {
+    m_innerBSize = IsColMajor ? brow : bcol;
+    m_outerBSize = IsColMajor ? bcol : brow;
+  }
+
+  /**
+   * \brief set the block size at runtime for fixed-size block layout
+   *
+   * Call this only for fixed-size blocks
+   */
+  inline void setBlockSize(Index blockSize) { m_blockSize = blockSize; }
+
+  /**
+   * \brief Set the row and column block layouts,
+   *
+   * This function set the size of each row and column block.
+   * So this function should be used only for blocks with variable size.
+   * \param rowBlocks : Number of rows per row block
+   * \param colBlocks : Number of columns per column block
+   * \sa resize(), setBlockSize()
+   */
+  inline void setBlockLayout(const VectorXi& rowBlocks, const VectorXi& colBlocks) {
+    const VectorXi& innerBlocks = IsColMajor ? rowBlocks : colBlocks;
+    const VectorXi& outerBlocks = IsColMajor ? colBlocks : rowBlocks;
+    eigen_assert(m_innerBSize == innerBlocks.size() && "CHECK THE NUMBER OF ROW OR COLUMN BLOCKS");
+    eigen_assert(m_outerBSize == outerBlocks.size() && "CHECK THE NUMBER OF ROW OR COLUMN BLOCKS");
+    m_outerBSize = outerBlocks.size();
+    //  starting index of blocks... cumulative sums
+    m_innerOffset = new StorageIndex[m_innerBSize + 1];
+    m_outerOffset = new StorageIndex[m_outerBSize + 1];
+    m_innerOffset[0] = 0;
+    m_outerOffset[0] = 0;
+    std::partial_sum(&innerBlocks[0], &innerBlocks[m_innerBSize - 1] + 1, &m_innerOffset[1]);
+    std::partial_sum(&outerBlocks[0], &outerBlocks[m_outerBSize - 1] + 1, &m_outerOffset[1]);
+
+    // Compute the total number of nonzeros
+    m_nonzeros = 0;
+    for (StorageIndex bj = 0; bj < m_outerBSize; ++bj)
+      for (StorageIndex bi = 0; bi < m_innerBSize; ++bi) m_nonzeros += outerBlocks[bj] * innerBlocks[bi];
+  }
+
+  /**
+   * \brief Allocate the internal array of pointers to blocks and their inner indices
+   *
+   * \note For fixed-size blocks, call setBlockSize() to set the block.
+   * And For variable-size blocks, call setBlockLayout() before using this function
+   *
+   * \param nonzerosblocks Number of nonzero blocks. The total number of nonzeros is
+   * is computed in setBlockLayout() for variable-size blocks
+   * \sa setBlockSize()
+   */
+  inline void reserve(const Index nonzerosblocks) {
+    eigen_assert((m_innerBSize != 0 && m_outerBSize != 0) &&
+                 "TRYING TO RESERVE ZERO-SIZE MATRICES, CALL resize() first");
+
+    // FIXME Should free if already allocated
+    m_outerIndex = new StorageIndex[m_outerBSize + 1];
+
+    m_nonzerosblocks = nonzerosblocks;
+    if (m_blockSize != Dynamic) {
+      m_nonzeros = nonzerosblocks * (m_blockSize * m_blockSize);
+      m_blockPtr = 0;
+    } else {
+      // m_nonzeros  is already computed in setBlockLayout()
+      m_blockPtr = new StorageIndex[m_nonzerosblocks + 1];
+    }
+    m_indices = new StorageIndex[m_nonzerosblocks + 1];
+    m_values = new Scalar[m_nonzeros];
+  }
+
+  /**
+   * \brief Fill values in a matrix  from a triplet list.
+   *
+   * Each triplet item has a block stored in an Eigen dense matrix.
+   * The InputIterator class should provide the functions row(), col() and value()
+   *
+   * \note For fixed-size blocks, call setBlockSize() before this function.
+   *
+   * FIXME Do not accept duplicates
+   */
+  template <typename InputIterator>
+  void setFromTriplets(const InputIterator& begin, const InputIterator& end) {
+    eigen_assert((m_innerBSize != 0 && m_outerBSize != 0) && "ZERO BLOCKS, PLEASE CALL resize() before");
+
+    /* First, sort the triplet list
+     * FIXME This can be unnecessarily expensive since only the inner indices have to be sorted
+     * The best approach is like in SparseMatrix::setFromTriplets()
+     */
+    internal::TripletComp<InputIterator, IsColMajor> tripletcomp;
+    std::sort(begin, end, tripletcomp);
+
+    /* Count the number of rows and column blocks,
+     * and the number of nonzero blocks per outer dimension
+     */
+    VectorXi rowBlocks(m_innerBSize);  // Size of each block row
+    VectorXi colBlocks(m_outerBSize);  // Size of each block column
+    rowBlocks.setZero();
+    colBlocks.setZero();
+    VectorXi nzblock_outer(m_outerBSize);  // Number of nz blocks per outer vector
+    VectorXi nz_outer(m_outerBSize);       // Number of nz per outer vector...for variable-size blocks
+    nzblock_outer.setZero();
+    nz_outer.setZero();
+    for (InputIterator it(begin); it != end; ++it) {
+      eigen_assert(it->row() >= 0 && it->row() < this->blockRows() && it->col() >= 0 && it->col() < this->blockCols());
+      eigen_assert((it->value().rows() == it->value().cols() && (it->value().rows() == m_blockSize)) ||
+                   (m_blockSize == Dynamic));
+
+      if (m_blockSize == Dynamic) {
+        eigen_assert((rowBlocks[it->row()] == 0 || rowBlocks[it->row()] == it->value().rows()) &&
+                     "NON CORRESPONDING SIZES FOR ROW BLOCKS");
+        eigen_assert((colBlocks[it->col()] == 0 || colBlocks[it->col()] == it->value().cols()) &&
+                     "NON CORRESPONDING SIZES FOR COLUMN BLOCKS");
+        rowBlocks[it->row()] = it->value().rows();
+        colBlocks[it->col()] = it->value().cols();
+      }
+      nz_outer(IsColMajor ? it->col() : it->row()) += it->value().rows() * it->value().cols();
+      nzblock_outer(IsColMajor ? it->col() : it->row())++;
+    }
+    // Allocate member arrays
+    if (m_blockSize == Dynamic) setBlockLayout(rowBlocks, colBlocks);
+    StorageIndex nzblocks = nzblock_outer.sum();
+    reserve(nzblocks);
+
+    // Temporary markers
+    VectorXi block_id(m_outerBSize);  // To be used as a block marker during insertion
+
+    // Setup outer index pointers and markers
+    m_outerIndex[0] = 0;
+    if (m_blockSize == Dynamic) m_blockPtr[0] = 0;
+    for (StorageIndex bj = 0; bj < m_outerBSize; ++bj) {
+      m_outerIndex[bj + 1] = m_outerIndex[bj] + nzblock_outer(bj);
+      block_id(bj) = m_outerIndex[bj];
+      if (m_blockSize == Dynamic) {
+        m_blockPtr[m_outerIndex[bj + 1]] = m_blockPtr[m_outerIndex[bj]] + nz_outer(bj);
       }
     }
 
-    /**
-      * \brief Set the number of rows and columns blocks
-      */
-    inline void resize(Index brow, Index bcol)
-    {
-      m_innerBSize = IsColMajor ? brow : bcol;
-      m_outerBSize = IsColMajor ? bcol : brow;
-    }
-
-    /**
-      * \brief set the block size at runtime for fixed-size block layout
-      *
-      * Call this only for fixed-size blocks
-      */
-    inline void setBlockSize(Index blockSize)
-    {
-      m_blockSize = blockSize;
-    }
-
-    /**
-      * \brief Set the row and column block layouts,
-      *
-      * This function set the size of each row and column block.
-      * So this function should be used only for blocks with variable size.
-      * \param rowBlocks : Number of rows per row block
-      * \param colBlocks : Number of columns per column block
-      * \sa resize(), setBlockSize()
-      */
-    inline void setBlockLayout(const VectorXi& rowBlocks, const VectorXi& colBlocks)
-    {
-      const VectorXi& innerBlocks = IsColMajor ? rowBlocks : colBlocks;
-      const VectorXi& outerBlocks = IsColMajor ? colBlocks : rowBlocks;
-      eigen_assert(m_innerBSize == innerBlocks.size() && "CHECK THE NUMBER OF ROW OR COLUMN BLOCKS");
-      eigen_assert(m_outerBSize == outerBlocks.size() && "CHECK THE NUMBER OF ROW OR COLUMN BLOCKS");
-      m_outerBSize = outerBlocks.size();
-      //  starting index of blocks... cumulative sums
-      m_innerOffset = new StorageIndex[m_innerBSize+1];
-      m_outerOffset = new StorageIndex[m_outerBSize+1];
-      m_innerOffset[0] = 0;
-      m_outerOffset[0] = 0;
-      std::partial_sum(&innerBlocks[0], &innerBlocks[m_innerBSize-1]+1, &m_innerOffset[1]);
-      std::partial_sum(&outerBlocks[0], &outerBlocks[m_outerBSize-1]+1, &m_outerOffset[1]);
-
-      // Compute the total number of nonzeros
-      m_nonzeros = 0;
-      for(StorageIndex bj = 0; bj < m_outerBSize; ++bj)
-        for(StorageIndex bi = 0; bi < m_innerBSize; ++bi)
-          m_nonzeros += outerBlocks[bj] * innerBlocks[bi];
-
-    }
-
-    /**
-      * \brief Allocate the internal array of pointers to blocks and their inner indices
-      *
-      * \note For fixed-size blocks, call setBlockSize() to set the block.
-      * And For variable-size blocks, call setBlockLayout() before using this function
-      *
-      * \param nonzerosblocks Number of nonzero blocks. The total number of nonzeros is
-      * is computed in setBlockLayout() for variable-size blocks
-      * \sa setBlockSize()
-      */
-    inline void reserve(const Index nonzerosblocks)
-    {
-      eigen_assert((m_innerBSize != 0 && m_outerBSize != 0) &&
-          "TRYING TO RESERVE ZERO-SIZE MATRICES, CALL resize() first");
-
-      //FIXME Should free if already allocated
-      m_outerIndex = new StorageIndex[m_outerBSize+1];
-
-      m_nonzerosblocks = nonzerosblocks;
-      if(m_blockSize != Dynamic)
-      {
-        m_nonzeros = nonzerosblocks * (m_blockSize * m_blockSize);
-        m_blockPtr = 0;
+    // Fill the matrix
+    for (InputIterator it(begin); it != end; ++it) {
+      StorageIndex outer = IsColMajor ? it->col() : it->row();
+      StorageIndex inner = IsColMajor ? it->row() : it->col();
+      m_indices[block_id(outer)] = inner;
+      StorageIndex block_size = it->value().rows() * it->value().cols();
+      StorageIndex nz_marker = blockPtr(block_id[outer]);
+      memcpy(&(m_values[nz_marker]), it->value().data(), block_size * sizeof(Scalar));
+      if (m_blockSize == Dynamic) {
+        m_blockPtr[block_id(outer) + 1] = m_blockPtr[block_id(outer)] + block_size;
       }
-      else
-      {
-        // m_nonzeros  is already computed in setBlockLayout()
-        m_blockPtr = new StorageIndex[m_nonzerosblocks+1];
-      }
-      m_indices = new StorageIndex[m_nonzerosblocks+1];
-      m_values = new Scalar[m_nonzeros];
+      block_id(outer)++;
     }
 
+    // An alternative when the outer indices are sorted...no need to use an array of markers
+    //      for(Index bcol = 0; bcol < m_outerBSize; ++bcol)
+    //      {
+    //      Index id = 0, id_nz = 0, id_nzblock = 0;
+    //      for(InputIterator it(begin); it!=end; ++it)
+    //      {
+    //        while (id<bcol) // one pass should do the job unless there are empty columns
+    //        {
+    //          id++;
+    //          m_outerIndex[id+1]=m_outerIndex[id];
+    //        }
+    //        m_outerIndex[id+1] += 1;
+    //        m_indices[id_nzblock]=brow;
+    //        Index block_size = it->value().rows()*it->value().cols();
+    //        m_blockPtr[id_nzblock+1] = m_blockPtr[id_nzblock] + block_size;
+    //        id_nzblock++;
+    //        memcpy(&(m_values[id_nz]),it->value().data(), block_size*sizeof(Scalar));
+    //        id_nz += block_size;
+    //      }
+    //      while(id < m_outerBSize-1) // Empty columns at the end
+    //      {
+    //        id++;
+    //        m_outerIndex[id+1]=m_outerIndex[id];
+    //      }
+    //      }
+  }
 
-    /**
-      * \brief Fill values in a matrix  from a triplet list.
-      *
-      * Each triplet item has a block stored in an Eigen dense matrix.
-      * The InputIterator class should provide the functions row(), col() and value()
-      *
-      * \note For fixed-size blocks, call setBlockSize() before this function.
-      *
-      * FIXME Do not accept duplicates
-      */
-    template<typename InputIterator>
-    void setFromTriplets(const InputIterator& begin, const InputIterator& end)
-    {
-      eigen_assert((m_innerBSize!=0 && m_outerBSize !=0) && "ZERO BLOCKS, PLEASE CALL resize() before");
+  /**
+   * \returns the number of rows
+   */
+  inline Index rows() const {
+    //      return blockRows();
+    return (IsColMajor ? innerSize() : outerSize());
+  }
 
-      /* First, sort the triplet list
-        * FIXME This can be unnecessarily expensive since only the inner indices have to be sorted
-        * The best approach is like in SparseMatrix::setFromTriplets()
-        */
-      internal::TripletComp<InputIterator, IsColMajor> tripletcomp;
-      std::sort(begin, end, tripletcomp);
+  /**
+   * \returns the number of cols
+   */
+  inline Index cols() const {
+    //      return blockCols();
+    return (IsColMajor ? outerSize() : innerSize());
+  }
 
-      /* Count the number of rows and column blocks,
-       * and the number of nonzero blocks per outer dimension
-       */
-      VectorXi rowBlocks(m_innerBSize); // Size of each block row
-      VectorXi colBlocks(m_outerBSize); // Size of each block column
-      rowBlocks.setZero(); colBlocks.setZero();
-      VectorXi nzblock_outer(m_outerBSize); // Number of nz blocks per outer vector
-      VectorXi nz_outer(m_outerBSize); // Number of nz per outer vector...for variable-size blocks
-      nzblock_outer.setZero();
-      nz_outer.setZero();
-      for(InputIterator it(begin); it !=end; ++it)
-      {
-        eigen_assert(it->row() >= 0 && it->row() < this->blockRows() && it->col() >= 0 && it->col() < this->blockCols());
-        eigen_assert((it->value().rows() == it->value().cols() && (it->value().rows() == m_blockSize))
-                     || (m_blockSize == Dynamic));
+  inline Index innerSize() const {
+    if (m_blockSize == Dynamic)
+      return m_innerOffset[m_innerBSize];
+    else
+      return (m_innerBSize * m_blockSize);
+  }
 
-        if(m_blockSize == Dynamic)
-        {
-          eigen_assert((rowBlocks[it->row()] == 0 || rowBlocks[it->row()] == it->value().rows()) &&
-              "NON CORRESPONDING SIZES FOR ROW BLOCKS");
-          eigen_assert((colBlocks[it->col()] == 0 || colBlocks[it->col()] == it->value().cols()) &&
-              "NON CORRESPONDING SIZES FOR COLUMN BLOCKS");
-          rowBlocks[it->row()] =it->value().rows();
-          colBlocks[it->col()] = it->value().cols();
-        }
-        nz_outer(IsColMajor ? it->col() : it->row()) += it->value().rows() * it->value().cols();
-        nzblock_outer(IsColMajor ? it->col() : it->row())++;
-      }
-      // Allocate member arrays
-      if(m_blockSize == Dynamic) setBlockLayout(rowBlocks, colBlocks);
-      StorageIndex nzblocks = nzblock_outer.sum();
-      reserve(nzblocks);
+  inline Index outerSize() const {
+    if (m_blockSize == Dynamic)
+      return m_outerOffset[m_outerBSize];
+    else
+      return (m_outerBSize * m_blockSize);
+  }
+  /** \returns the number of rows grouped by blocks */
+  inline Index blockRows() const { return (IsColMajor ? m_innerBSize : m_outerBSize); }
+  /** \returns the number of columns grouped by blocks */
+  inline Index blockCols() const { return (IsColMajor ? m_outerBSize : m_innerBSize); }
 
-       // Temporary markers
-      VectorXi block_id(m_outerBSize); // To be used as a block marker during insertion
+  inline Index outerBlocks() const { return m_outerBSize; }
+  inline Index innerBlocks() const { return m_innerBSize; }
 
-      // Setup outer index pointers and markers
-      m_outerIndex[0] = 0;
-      if (m_blockSize == Dynamic)  m_blockPtr[0] =  0;
-      for(StorageIndex bj = 0; bj < m_outerBSize; ++bj)
-      {
-        m_outerIndex[bj+1] = m_outerIndex[bj] + nzblock_outer(bj);
-        block_id(bj) = m_outerIndex[bj];
-        if(m_blockSize==Dynamic)
-        {
-          m_blockPtr[m_outerIndex[bj+1]] = m_blockPtr[m_outerIndex[bj]] + nz_outer(bj);
-        }
-      }
+  /** \returns the block index where outer belongs to */
+  inline Index outerToBlock(Index outer) const {
+    eigen_assert(outer < outerSize() && "OUTER INDEX OUT OF BOUNDS");
 
-      // Fill the matrix
-      for(InputIterator it(begin); it!=end; ++it)
-      {
-        StorageIndex outer = IsColMajor ? it->col() : it->row();
-        StorageIndex inner = IsColMajor ? it->row() : it->col();
-        m_indices[block_id(outer)] = inner;
-        StorageIndex block_size = it->value().rows()*it->value().cols();
-        StorageIndex nz_marker = blockPtr(block_id[outer]);
-        memcpy(&(m_values[nz_marker]), it->value().data(), block_size * sizeof(Scalar));
-        if(m_blockSize == Dynamic)
-        {
-          m_blockPtr[block_id(outer)+1] = m_blockPtr[block_id(outer)] + block_size;
-        }
-        block_id(outer)++;
-      }
+    if (m_blockSize != Dynamic) return (outer / m_blockSize);  // Integer division
 
-      // An alternative when the outer indices are sorted...no need to use an array of markers
-//      for(Index bcol = 0; bcol < m_outerBSize; ++bcol)
-//      {
-//      Index id = 0, id_nz = 0, id_nzblock = 0;
-//      for(InputIterator it(begin); it!=end; ++it)
-//      {
-//        while (id<bcol) // one pass should do the job unless there are empty columns
-//        {
-//          id++;
-//          m_outerIndex[id+1]=m_outerIndex[id];
-//        }
-//        m_outerIndex[id+1] += 1;
-//        m_indices[id_nzblock]=brow;
-//        Index block_size = it->value().rows()*it->value().cols();
-//        m_blockPtr[id_nzblock+1] = m_blockPtr[id_nzblock] + block_size;
-//        id_nzblock++;
-//        memcpy(&(m_values[id_nz]),it->value().data(), block_size*sizeof(Scalar));
-//        id_nz += block_size;
-//      }
-//      while(id < m_outerBSize-1) // Empty columns at the end
-//      {
-//        id++;
-//        m_outerIndex[id+1]=m_outerIndex[id];
-//      }
-//      }
+    StorageIndex b_outer = 0;
+    while (m_outerOffset[b_outer] <= outer) ++b_outer;
+    return b_outer - 1;
+  }
+  /** \returns  the block index where inner belongs to */
+  inline Index innerToBlock(Index inner) const {
+    eigen_assert(inner < innerSize() && "OUTER INDEX OUT OF BOUNDS");
+
+    if (m_blockSize != Dynamic) return (inner / m_blockSize);  // Integer division
+
+    StorageIndex b_inner = 0;
+    while (m_innerOffset[b_inner] <= inner) ++b_inner;
+    return b_inner - 1;
+  }
+
+  /**
+   *\returns a reference to the (i,j) block as an Eigen Dense Matrix
+   */
+  Ref<BlockScalar> coeffRef(Index brow, Index bcol) {
+    eigen_assert(brow < blockRows() && "BLOCK ROW INDEX OUT OF BOUNDS");
+    eigen_assert(bcol < blockCols() && "BLOCK nzblocksFlagCOLUMN OUT OF BOUNDS");
+
+    StorageIndex rsize = IsColMajor ? blockInnerSize(brow) : blockOuterSize(bcol);
+    StorageIndex csize = IsColMajor ? blockOuterSize(bcol) : blockInnerSize(brow);
+    StorageIndex inner = IsColMajor ? brow : bcol;
+    StorageIndex outer = IsColMajor ? bcol : brow;
+    StorageIndex offset = m_outerIndex[outer];
+    while (offset < m_outerIndex[outer + 1] && m_indices[offset] != inner) offset++;
+    if (m_indices[offset] == inner) {
+      return Map<BlockScalar>(&(m_values[blockPtr(offset)]), rsize, csize);
+    } else {
+      // FIXME the block does not exist, Insert it !!!!!!!!!
+      eigen_assert("DYNAMIC INSERTION IS NOT YET SUPPORTED");
     }
+  }
 
+  /**
+   * \returns the value of the (i,j) block as an Eigen Dense Matrix
+   */
+  Map<const BlockScalar> coeff(Index brow, Index bcol) const {
+    eigen_assert(brow < blockRows() && "BLOCK ROW INDEX OUT OF BOUNDS");
+    eigen_assert(bcol < blockCols() && "BLOCK COLUMN OUT OF BOUNDS");
 
-    /**
-      * \returns the number of rows
-      */
-    inline Index rows() const
-    {
-//      return blockRows();
-      return (IsColMajor ? innerSize() : outerSize());
-    }
+    StorageIndex rsize = IsColMajor ? blockInnerSize(brow) : blockOuterSize(bcol);
+    StorageIndex csize = IsColMajor ? blockOuterSize(bcol) : blockInnerSize(brow);
+    StorageIndex inner = IsColMajor ? brow : bcol;
+    StorageIndex outer = IsColMajor ? bcol : brow;
+    StorageIndex offset = m_outerIndex[outer];
+    while (offset < m_outerIndex[outer + 1] && m_indices[offset] != inner) offset++;
+    if (m_indices[offset] == inner) {
+      return Map<const BlockScalar>(&(m_values[blockPtr(offset)]), rsize, csize);
+    } else
+      //        return BlockScalar::Zero(rsize, csize);
+      eigen_assert("NOT YET SUPPORTED");
+  }
 
-    /**
-      * \returns the number of cols
-      */
-    inline Index cols() const
-    {
-//      return blockCols();
-      return (IsColMajor ? outerSize() : innerSize());
-    }
+  // Block Matrix times vector product
+  template <typename VecType>
+  BlockSparseTimeDenseProduct<BlockSparseMatrix, VecType> operator*(const VecType& lhs) const {
+    return BlockSparseTimeDenseProduct<BlockSparseMatrix, VecType>(*this, lhs);
+  }
 
-    inline Index innerSize() const
-    {
-      if(m_blockSize == Dynamic) return m_innerOffset[m_innerBSize];
-      else return  (m_innerBSize * m_blockSize) ;
-    }
+  /** \returns the number of nonzero blocks */
+  inline Index nonZerosBlocks() const { return m_nonzerosblocks; }
+  /** \returns the total number of nonzero elements, including eventual explicit zeros in blocks */
+  inline Index nonZeros() const { return m_nonzeros; }
 
-    inline Index outerSize() const
-    {
-      if(m_blockSize == Dynamic) return m_outerOffset[m_outerBSize];
-      else return  (m_outerBSize * m_blockSize) ;
-    }
-    /** \returns the number of rows grouped by blocks */
-    inline Index blockRows() const
-    {
-      return (IsColMajor ? m_innerBSize : m_outerBSize);
-    }
-    /** \returns the number of columns grouped by blocks */
-    inline Index blockCols() const
-    {
-      return (IsColMajor ? m_outerBSize : m_innerBSize);
-    }
+  inline BlockScalarReturnType* valuePtr() { return static_cast<BlockScalarReturnType*>(m_values); }
+  //    inline Scalar *valuePtr(){ return m_values; }
+  inline StorageIndex* innerIndexPtr() { return m_indices; }
+  inline const StorageIndex* innerIndexPtr() const { return m_indices; }
+  inline StorageIndex* outerIndexPtr() { return m_outerIndex; }
+  inline const StorageIndex* outerIndexPtr() const { return m_outerIndex; }
 
-    inline Index outerBlocks() const { return m_outerBSize; }
-    inline Index innerBlocks() const { return m_innerBSize; }
+  /** \brief for compatibility purposes with the SparseMatrix class */
+  inline bool isCompressed() const { return true; }
+  /**
+   * \returns the starting index of the bi row block
+   */
+  inline Index blockRowsIndex(Index bi) const { return IsColMajor ? blockInnerIndex(bi) : blockOuterIndex(bi); }
 
-    /** \returns the block index where outer belongs to */
-    inline Index outerToBlock(Index outer) const
-    {
-      eigen_assert(outer < outerSize() && "OUTER INDEX OUT OF BOUNDS");
+  /**
+   * \returns the starting index of the bj col block
+   */
+  inline Index blockColsIndex(Index bj) const { return IsColMajor ? blockOuterIndex(bj) : blockInnerIndex(bj); }
 
-      if(m_blockSize != Dynamic)
-        return (outer / m_blockSize); // Integer division
+  inline Index blockOuterIndex(Index bj) const {
+    return (m_blockSize == Dynamic) ? m_outerOffset[bj] : (bj * m_blockSize);
+  }
+  inline Index blockInnerIndex(Index bi) const {
+    return (m_blockSize == Dynamic) ? m_innerOffset[bi] : (bi * m_blockSize);
+  }
 
-      StorageIndex b_outer = 0;
-      while(m_outerOffset[b_outer] <= outer) ++b_outer;
-      return b_outer - 1;
-    }
-    /** \returns  the block index where inner belongs to */
-    inline Index innerToBlock(Index inner) const
-    {
-      eigen_assert(inner < innerSize() && "OUTER INDEX OUT OF BOUNDS");
+  // Not needed ???
+  inline Index blockInnerSize(Index bi) const {
+    return (m_blockSize == Dynamic) ? (m_innerOffset[bi + 1] - m_innerOffset[bi]) : m_blockSize;
+  }
+  inline Index blockOuterSize(Index bj) const {
+    return (m_blockSize == Dynamic) ? (m_outerOffset[bj + 1] - m_outerOffset[bj]) : m_blockSize;
+  }
 
-      if(m_blockSize != Dynamic)
-        return (inner / m_blockSize); // Integer division
+  /**
+   * \brief Browse the matrix by outer index
+   */
+  class InnerIterator;  // Browse column by column
 
-      StorageIndex b_inner = 0;
-      while(m_innerOffset[b_inner] <= inner) ++b_inner;
-      return b_inner - 1;
-    }
+  /**
+   * \brief Browse the matrix by block outer index
+   */
+  class BlockInnerIterator;  // Browse block by block
 
-    /**
-      *\returns a reference to the (i,j) block as an Eigen Dense Matrix
-      */
-    Ref<BlockScalar> coeffRef(Index brow, Index bcol)
-    {
-      eigen_assert(brow < blockRows() && "BLOCK ROW INDEX OUT OF BOUNDS");
-      eigen_assert(bcol < blockCols() && "BLOCK nzblocksFlagCOLUMN OUT OF BOUNDS");
-
-      StorageIndex rsize = IsColMajor ? blockInnerSize(brow): blockOuterSize(bcol);
-      StorageIndex csize = IsColMajor ? blockOuterSize(bcol) : blockInnerSize(brow);
-      StorageIndex inner = IsColMajor ? brow : bcol;
-      StorageIndex outer = IsColMajor ? bcol : brow;
-      StorageIndex offset = m_outerIndex[outer];
-      while(offset < m_outerIndex[outer+1] && m_indices[offset] != inner)
-        offset++;
-      if(m_indices[offset] == inner)
-      {
-        return Map<BlockScalar>(&(m_values[blockPtr(offset)]), rsize, csize);
-      }
-      else
-      {
-        //FIXME the block does not exist, Insert it !!!!!!!!!
-        eigen_assert("DYNAMIC INSERTION IS NOT YET SUPPORTED");
+  friend std::ostream& operator<<(std::ostream& s, const BlockSparseMatrix& m) {
+    for (StorageIndex j = 0; j < m.outerBlocks(); ++j) {
+      BlockInnerIterator itb(m, j);
+      for (; itb; ++itb) {
+        s << "(" << itb.row() << ", " << itb.col() << ")\n";
+        s << itb.value() << "\n";
       }
     }
+    s << std::endl;
+    return s;
+  }
 
-    /**
-      * \returns the value of the (i,j) block as an Eigen Dense Matrix
-      */
-    Map<const BlockScalar> coeff(Index brow, Index bcol) const
-    {
-      eigen_assert(brow < blockRows() && "BLOCK ROW INDEX OUT OF BOUNDS");
-      eigen_assert(bcol < blockCols() && "BLOCK COLUMN OUT OF BOUNDS");
+  /**
+   * \returns the starting position of the block \p id in the array of values
+   */
+  Index blockPtr(Index id) const {
+    if (m_blockSize == Dynamic)
+      return m_blockPtr[id];
+    else
+      return id * m_blockSize * m_blockSize;
+    // return blockDynIdx(id, std::conditional_t<(BlockSize==Dynamic), internal::true_type, internal::false_type>());
+  }
 
-      StorageIndex rsize = IsColMajor ? blockInnerSize(brow): blockOuterSize(bcol);
-      StorageIndex csize = IsColMajor ? blockOuterSize(bcol) : blockInnerSize(brow);
-      StorageIndex inner = IsColMajor ? brow : bcol;
-      StorageIndex outer = IsColMajor ? bcol : brow;
-      StorageIndex offset = m_outerIndex[outer];
-      while(offset < m_outerIndex[outer+1] && m_indices[offset] != inner) offset++;
-      if(m_indices[offset] == inner)
-      {
-        return Map<const BlockScalar> (&(m_values[blockPtr(offset)]), rsize, csize);
-      }
-      else
-//        return BlockScalar::Zero(rsize, csize);
-        eigen_assert("NOT YET SUPPORTED");
-    }
+ protected:
+  //    inline Index blockDynIdx(Index id, internal::true_type) const
+  //    {
+  //      return m_blockPtr[id];
+  //    }
+  //    inline Index blockDynIdx(Index id, internal::false_type) const
+  //    {
+  //      return id * BlockSize * BlockSize;
+  //    }
 
-    // Block Matrix times vector product
-    template<typename VecType>
-    BlockSparseTimeDenseProduct<BlockSparseMatrix, VecType> operator*(const VecType& lhs) const
-    {
-      return BlockSparseTimeDenseProduct<BlockSparseMatrix, VecType>(*this, lhs);
-    }
+  // To be implemented
+  // Insert a block at a particular location... need to make a room for that
+  Map<BlockScalar> insert(Index brow, Index bcol);
 
-    /** \returns the number of nonzero blocks */
-    inline Index nonZerosBlocks() const { return m_nonzerosblocks; }
-    /** \returns the total number of nonzero elements, including eventual explicit zeros in blocks */
-    inline Index nonZeros() const { return m_nonzeros; }
-
-    inline BlockScalarReturnType *valuePtr() {return static_cast<BlockScalarReturnType *>(m_values);}
-//    inline Scalar *valuePtr(){ return m_values; }
-    inline StorageIndex *innerIndexPtr() {return m_indices; }
-    inline const StorageIndex *innerIndexPtr() const {return m_indices; }
-    inline StorageIndex *outerIndexPtr() {return m_outerIndex; }
-    inline const StorageIndex* outerIndexPtr() const {return m_outerIndex; }
-
-    /** \brief for compatibility purposes with the SparseMatrix class */
-    inline bool isCompressed() const {return true;}
-    /**
-      * \returns the starting index of the bi row block
-      */
-    inline Index blockRowsIndex(Index bi) const
-    {
-      return IsColMajor ? blockInnerIndex(bi) : blockOuterIndex(bi);
-    }
-
-    /**
-      * \returns the starting index of the bj col block
-      */
-    inline Index blockColsIndex(Index bj) const
-    {
-      return IsColMajor ? blockOuterIndex(bj) : blockInnerIndex(bj);
-    }
-
-    inline Index blockOuterIndex(Index bj) const
-    {
-      return (m_blockSize == Dynamic) ? m_outerOffset[bj] : (bj * m_blockSize);
-    }
-    inline Index blockInnerIndex(Index bi) const
-    {
-      return (m_blockSize == Dynamic) ? m_innerOffset[bi] : (bi * m_blockSize);
-    }
-
-    // Not needed ???
-    inline Index blockInnerSize(Index bi) const
-    {
-      return (m_blockSize == Dynamic) ? (m_innerOffset[bi+1] - m_innerOffset[bi]) : m_blockSize;
-    }
-    inline Index blockOuterSize(Index bj) const
-    {
-      return (m_blockSize == Dynamic) ? (m_outerOffset[bj+1]- m_outerOffset[bj]) : m_blockSize;
-    }
-
-    /**
-      * \brief Browse the matrix by outer index
-      */
-    class InnerIterator; // Browse column by column
-
-    /**
-      * \brief Browse the matrix by block outer index
-      */
-    class BlockInnerIterator; // Browse block by block
-
-    friend std::ostream & operator << (std::ostream & s, const BlockSparseMatrix& m)
-    {
-      for (StorageIndex j = 0; j < m.outerBlocks(); ++j)
-      {
-        BlockInnerIterator itb(m, j);
-        for(; itb; ++itb)
-        {
-          s << "("<<itb.row() << ", " << itb.col() << ")\n";
-          s << itb.value() <<"\n";
-        }
-      }
-      s << std::endl;
-      return s;
-    }
-
-    /**
-      * \returns the starting position of the block \p id in the array of values
-      */
-    Index blockPtr(Index id) const
-    {
-      if(m_blockSize == Dynamic) return m_blockPtr[id];
-      else return id * m_blockSize * m_blockSize;
-      //return blockDynIdx(id, std::conditional_t<(BlockSize==Dynamic), internal::true_type, internal::false_type>());
-    }
-
-
-  protected:
-//    inline Index blockDynIdx(Index id, internal::true_type) const
-//    {
-//      return m_blockPtr[id];
-//    }
-//    inline Index blockDynIdx(Index id, internal::false_type) const
-//    {
-//      return id * BlockSize * BlockSize;
-//    }
-
-    // To be implemented
-    // Insert a block at a particular location... need to make a room for that
-    Map<BlockScalar> insert(Index brow, Index bcol);
-
-    Index m_innerBSize; // Number of block rows
-    Index m_outerBSize; // Number of block columns
-    StorageIndex *m_innerOffset; // Starting index of each inner block (size m_innerBSize+1)
-    StorageIndex *m_outerOffset; // Starting index of each outer block (size m_outerBSize+1)
-    Index m_nonzerosblocks; // Total nonzeros blocks (lower than  m_innerBSize x m_outerBSize)
-    Index m_nonzeros; // Total nonzeros elements
-    Scalar *m_values; //Values stored block column after block column (size m_nonzeros)
-    StorageIndex *m_blockPtr; // Pointer to the beginning of each block in m_values, size m_nonzeroblocks ... null for fixed-size blocks
-    StorageIndex *m_indices; //Inner block indices, size m_nonzerosblocks ... OK
-    StorageIndex *m_outerIndex; // Starting pointer of each block column in m_indices (size m_outerBSize)... OK
-    Index m_blockSize; // Size of a block for fixed-size blocks, otherwise -1
+  Index m_innerBSize;           // Number of block rows
+  Index m_outerBSize;           // Number of block columns
+  StorageIndex* m_innerOffset;  // Starting index of each inner block (size m_innerBSize+1)
+  StorageIndex* m_outerOffset;  // Starting index of each outer block (size m_outerBSize+1)
+  Index m_nonzerosblocks;       // Total nonzeros blocks (lower than  m_innerBSize x m_outerBSize)
+  Index m_nonzeros;             // Total nonzeros elements
+  Scalar* m_values;             // Values stored block column after block column (size m_nonzeros)
+  StorageIndex* m_blockPtr;     // Pointer to the beginning of each block in m_values, size m_nonzeroblocks ... null for
+                                // fixed-size blocks
+  StorageIndex* m_indices;      // Inner block indices, size m_nonzerosblocks ... OK
+  StorageIndex* m_outerIndex;   // Starting pointer of each block column in m_indices (size m_outerBSize)... OK
+  Index m_blockSize;            // Size of a block for fixed-size blocks, otherwise -1
 };
 
-template<typename Scalar_, int _BlockAtCompileTime, int Options_, typename StorageIndex_>
-class BlockSparseMatrix<Scalar_, _BlockAtCompileTime, Options_, StorageIndex_>::BlockInnerIterator
-{
-  public:
+template <typename Scalar_, int _BlockAtCompileTime, int Options_, typename StorageIndex_>
+class BlockSparseMatrix<Scalar_, _BlockAtCompileTime, Options_, StorageIndex_>::BlockInnerIterator {
+ public:
+  enum { Flags = Options_ };
 
-    enum{
-      Flags = Options_
-    };
+  BlockInnerIterator(const BlockSparseMatrix& mat, const Index outer)
+      : m_mat(mat), m_outer(outer), m_id(mat.m_outerIndex[outer]), m_end(mat.m_outerIndex[outer + 1]) {}
 
-    BlockInnerIterator(const BlockSparseMatrix& mat, const Index outer)
-    : m_mat(mat),m_outer(outer),
-      m_id(mat.m_outerIndex[outer]),
-      m_end(mat.m_outerIndex[outer+1])
-    {
-    }
+  inline BlockInnerIterator& operator++() {
+    m_id++;
+    return *this;
+  }
 
-    inline BlockInnerIterator& operator++() {m_id++; return *this; }
+  inline const Map<const BlockScalar> value() const {
+    return Map<const BlockScalar>(&(m_mat.m_values[m_mat.blockPtr(m_id)]), rows(), cols());
+  }
+  inline Map<BlockScalar> valueRef() {
+    return Map<BlockScalar>(&(m_mat.m_values[m_mat.blockPtr(m_id)]), rows(), cols());
+  }
+  // Block inner index
+  inline Index index() const { return m_mat.m_indices[m_id]; }
+  inline Index outer() const { return m_outer; }
+  // block row index
+  inline Index row() const { return index(); }
+  // block column index
+  inline Index col() const { return outer(); }
+  // FIXME Number of rows in the current block
+  inline Index rows() const {
+    return (m_mat.m_blockSize == Dynamic) ? (m_mat.m_innerOffset[index() + 1] - m_mat.m_innerOffset[index()])
+                                          : m_mat.m_blockSize;
+  }
+  // Number of columns in the current block ...
+  inline Index cols() const {
+    return (m_mat.m_blockSize == Dynamic) ? (m_mat.m_outerOffset[m_outer + 1] - m_mat.m_outerOffset[m_outer])
+                                          : m_mat.m_blockSize;
+  }
+  inline operator bool() const { return (m_id < m_end); }
 
-    inline const Map<const BlockScalar> value() const
-    {
-      return Map<const BlockScalar>(&(m_mat.m_values[m_mat.blockPtr(m_id)]),
-          rows(),cols());
-    }
-    inline Map<BlockScalar> valueRef()
-    {
-      return Map<BlockScalar>(&(m_mat.m_values[m_mat.blockPtr(m_id)]),
-          rows(),cols());
-    }
-    // Block inner index
-    inline Index index() const {return m_mat.m_indices[m_id]; }
-    inline Index outer() const { return m_outer; }
-    // block row index
-    inline Index row() const  {return index(); }
-    // block column index
-    inline Index col() const {return outer(); }
-    // FIXME Number of rows in the current block
-    inline Index rows() const { return (m_mat.m_blockSize==Dynamic) ? (m_mat.m_innerOffset[index()+1] - m_mat.m_innerOffset[index()]) : m_mat.m_blockSize; }
-    // Number of columns in the current block ...
-    inline Index cols() const { return (m_mat.m_blockSize==Dynamic) ? (m_mat.m_outerOffset[m_outer+1]-m_mat.m_outerOffset[m_outer]) : m_mat.m_blockSize;}
-    inline operator bool() const { return (m_id < m_end); }
-
-  protected:
-    const BlockSparseMatrix<Scalar_, _BlockAtCompileTime, Options_, StorageIndex>& m_mat;
-    const Index m_outer;
-    Index m_id;
-    Index m_end;
+ protected:
+  const BlockSparseMatrix<Scalar_, _BlockAtCompileTime, Options_, StorageIndex>& m_mat;
+  const Index m_outer;
+  Index m_id;
+  Index m_end;
 };
 
-template<typename Scalar_, int _BlockAtCompileTime, int Options_, typename StorageIndex_>
-class BlockSparseMatrix<Scalar_, _BlockAtCompileTime, Options_, StorageIndex_>::InnerIterator
-{
-  public:
-    InnerIterator(const BlockSparseMatrix& mat, Index outer)
-    : m_mat(mat),m_outerB(mat.outerToBlock(outer)),m_outer(outer),
-      itb(mat, mat.outerToBlock(outer)),
-      m_offset(outer - mat.blockOuterIndex(m_outerB))
-     {
-        if (itb)
-        {
-          m_id = m_mat.blockInnerIndex(itb.index());
-          m_start = m_id;
-          m_end = m_mat.blockInnerIndex(itb.index()+1);
-        }
-     }
-    inline InnerIterator& operator++()
-    {
-      m_id++;
-      if (m_id >= m_end)
-      {
-        ++itb;
-        if (itb)
-        {
-          m_id = m_mat.blockInnerIndex(itb.index());
-          m_start = m_id;
-          m_end = m_mat.blockInnerIndex(itb.index()+1);
-        }
+template <typename Scalar_, int _BlockAtCompileTime, int Options_, typename StorageIndex_>
+class BlockSparseMatrix<Scalar_, _BlockAtCompileTime, Options_, StorageIndex_>::InnerIterator {
+ public:
+  InnerIterator(const BlockSparseMatrix& mat, Index outer)
+      : m_mat(mat),
+        m_outerB(mat.outerToBlock(outer)),
+        m_outer(outer),
+        itb(mat, mat.outerToBlock(outer)),
+        m_offset(outer - mat.blockOuterIndex(m_outerB)) {
+    if (itb) {
+      m_id = m_mat.blockInnerIndex(itb.index());
+      m_start = m_id;
+      m_end = m_mat.blockInnerIndex(itb.index() + 1);
+    }
+  }
+  inline InnerIterator& operator++() {
+    m_id++;
+    if (m_id >= m_end) {
+      ++itb;
+      if (itb) {
+        m_id = m_mat.blockInnerIndex(itb.index());
+        m_start = m_id;
+        m_end = m_mat.blockInnerIndex(itb.index() + 1);
       }
-      return *this;
     }
-    inline const Scalar& value() const
-    {
-      return itb.value().coeff(m_id - m_start, m_offset);
-    }
-    inline Scalar& valueRef()
-    {
-      return itb.valueRef().coeff(m_id - m_start, m_offset);
-    }
-    inline Index index() const { return m_id; }
-    inline Index outer() const {return m_outer; }
-    inline Index col() const {return outer(); }
-    inline Index row() const { return index();}
-    inline operator bool() const
-    {
-      return itb;
-    }
-  protected:
-    const BlockSparseMatrix& m_mat;
-    const Index m_outer;
-    const Index m_outerB;
-    BlockInnerIterator itb; // Iterator through the blocks
-    const Index m_offset; // Position of this column in the block
-    Index m_start; // starting inner index of this block
-    Index m_id; // current inner index in the block
-    Index m_end; // starting inner index of the next block
+    return *this;
+  }
+  inline const Scalar& value() const { return itb.value().coeff(m_id - m_start, m_offset); }
+  inline Scalar& valueRef() { return itb.valueRef().coeff(m_id - m_start, m_offset); }
+  inline Index index() const { return m_id; }
+  inline Index outer() const { return m_outer; }
+  inline Index col() const { return outer(); }
+  inline Index row() const { return index(); }
+  inline operator bool() const { return itb; }
 
+ protected:
+  const BlockSparseMatrix& m_mat;
+  const Index m_outer;
+  const Index m_outerB;
+  BlockInnerIterator itb;  // Iterator through the blocks
+  const Index m_offset;    // Position of this column in the block
+  Index m_start;           // starting inner index of this block
+  Index m_id;              // current inner index in the block
+  Index m_end;             // starting inner index of the next block
 };
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SPARSEBLOCKMATRIX_H
+#endif  // EIGEN_SPARSEBLOCKMATRIX_H
diff --git a/unsupported/Eigen/src/SparseExtra/MarketIO.h b/unsupported/Eigen/src/SparseExtra/MarketIO.h
index 6a0a7fb..5e65b26 100644
--- a/unsupported/Eigen/src/SparseExtra/MarketIO.h
+++ b/unsupported/Eigen/src/SparseExtra/MarketIO.h
@@ -17,205 +17,194 @@
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
 
-namespace Eigen { 
+namespace Eigen {
 
-namespace internal 
-{
-  template <typename Scalar, typename StorageIndex>
-  inline void GetMarketLine (const char* line, StorageIndex& i, StorageIndex& j, Scalar& value)
-  {
-    std::stringstream sline(line);
-    sline >> i >> j >> value;
-  }
+namespace internal {
+template <typename Scalar, typename StorageIndex>
+inline void GetMarketLine(const char* line, StorageIndex& i, StorageIndex& j, Scalar& value) {
+  std::stringstream sline(line);
+  sline >> i >> j >> value;
+}
 
-  template<> inline void GetMarketLine (const char* line, int& i, int& j, float& value)
-  { std::sscanf(line, "%d %d %g", &i, &j, &value); }
+template <>
+inline void GetMarketLine(const char* line, int& i, int& j, float& value) {
+  std::sscanf(line, "%d %d %g", &i, &j, &value);
+}
 
-  template<> inline void GetMarketLine (const char* line, int& i, int& j, double& value)
-  { std::sscanf(line, "%d %d %lg", &i, &j, &value); }
+template <>
+inline void GetMarketLine(const char* line, int& i, int& j, double& value) {
+  std::sscanf(line, "%d %d %lg", &i, &j, &value);
+}
 
-  template<> inline void GetMarketLine (const char* line, int& i, int& j, std::complex<float>& value)
-  { std::sscanf(line, "%d %d %g %g", &i, &j, &numext::real_ref(value), &numext::imag_ref(value)); }
+template <>
+inline void GetMarketLine(const char* line, int& i, int& j, std::complex<float>& value) {
+  std::sscanf(line, "%d %d %g %g", &i, &j, &numext::real_ref(value), &numext::imag_ref(value));
+}
 
-  template<> inline void GetMarketLine (const char* line, int& i, int& j, std::complex<double>& value)
-  { std::sscanf(line, "%d %d %lg %lg", &i, &j, &numext::real_ref(value), &numext::imag_ref(value)); }
+template <>
+inline void GetMarketLine(const char* line, int& i, int& j, std::complex<double>& value) {
+  std::sscanf(line, "%d %d %lg %lg", &i, &j, &numext::real_ref(value), &numext::imag_ref(value));
+}
 
-  template <typename Scalar, typename StorageIndex>
-  inline void GetMarketLine (const char* line, StorageIndex& i, StorageIndex& j, std::complex<Scalar>& value)
-  {
-    std::stringstream sline(line);
-    Scalar valR, valI;
-    sline >> i >> j >> valR >> valI;
-    value = std::complex<Scalar>(valR,valI);
-  }
+template <typename Scalar, typename StorageIndex>
+inline void GetMarketLine(const char* line, StorageIndex& i, StorageIndex& j, std::complex<Scalar>& value) {
+  std::stringstream sline(line);
+  Scalar valR, valI;
+  sline >> i >> j >> valR >> valI;
+  value = std::complex<Scalar>(valR, valI);
+}
 
-  template <typename RealScalar>
-  inline void  GetDenseElt (const std::string& line, RealScalar& val)
-  {
-    std::istringstream newline(line);
-    newline >> val;  
-  }
+template <typename RealScalar>
+inline void GetDenseElt(const std::string& line, RealScalar& val) {
+  std::istringstream newline(line);
+  newline >> val;
+}
 
-  template <typename RealScalar>
-  inline void GetDenseElt (const std::string& line, std::complex<RealScalar>& val)
-  {
-    RealScalar valR, valI; 
-    std::istringstream newline(line);
-    newline >> valR >> valI; 
-    val = std::complex<RealScalar>(valR, valI);
-  }
-  
-  template<typename Scalar>
-  inline void putMarketHeader(std::string& header,int sym)
-  {
-    header= "%%MatrixMarket matrix coordinate ";
-    if(internal::is_same<Scalar, std::complex<float> >::value || internal::is_same<Scalar, std::complex<double> >::value)
-    {
-      header += " complex"; 
-      if(sym == Symmetric) header += " symmetric";
-      else if (sym == SelfAdjoint) header += " Hermitian";
-      else header += " general";
-    }
+template <typename RealScalar>
+inline void GetDenseElt(const std::string& line, std::complex<RealScalar>& val) {
+  RealScalar valR, valI;
+  std::istringstream newline(line);
+  newline >> valR >> valI;
+  val = std::complex<RealScalar>(valR, valI);
+}
+
+template <typename Scalar>
+inline void putMarketHeader(std::string& header, int sym) {
+  header = "%%MatrixMarket matrix coordinate ";
+  if (internal::is_same<Scalar, std::complex<float> >::value ||
+      internal::is_same<Scalar, std::complex<double> >::value) {
+    header += " complex";
+    if (sym == Symmetric)
+      header += " symmetric";
+    else if (sym == SelfAdjoint)
+      header += " Hermitian";
     else
-    {
-      header += " real"; 
-      if(sym == Symmetric) header += " symmetric";
-      else header += " general";
-    }
+      header += " general";
+  } else {
+    header += " real";
+    if (sym == Symmetric)
+      header += " symmetric";
+    else
+      header += " general";
   }
+}
 
-  template<typename Scalar, typename StorageIndex>
-  inline void PutMatrixElt(Scalar value, StorageIndex row, StorageIndex col, std::ofstream& out)
-  {
-    out << row << " "<< col << " " << value << "\n";
-  }
-  template<typename Scalar, typename StorageIndex>
-  inline void PutMatrixElt(std::complex<Scalar> value, StorageIndex row, StorageIndex col, std::ofstream& out)
-  {
-    out << row << " " << col << " " << value.real() << " " << value.imag() << "\n";
-  }
+template <typename Scalar, typename StorageIndex>
+inline void PutMatrixElt(Scalar value, StorageIndex row, StorageIndex col, std::ofstream& out) {
+  out << row << " " << col << " " << value << "\n";
+}
+template <typename Scalar, typename StorageIndex>
+inline void PutMatrixElt(std::complex<Scalar> value, StorageIndex row, StorageIndex col, std::ofstream& out) {
+  out << row << " " << col << " " << value.real() << " " << value.imag() << "\n";
+}
 
+template <typename Scalar>
+inline void putDenseElt(Scalar value, std::ofstream& out) {
+  out << value << "\n";
+}
+template <typename Scalar>
+inline void putDenseElt(std::complex<Scalar> value, std::ofstream& out) {
+  out << value.real() << " " << value.imag() << "\n";
+}
 
-  template<typename Scalar>
-  inline void putDenseElt(Scalar value, std::ofstream& out)
-  {
-    out << value << "\n"; 
-  }
-  template<typename Scalar>
-  inline void putDenseElt(std::complex<Scalar> value, std::ofstream& out)
-  {
-    out << value.real() << " " << value.imag()<< "\n"; 
-  }
-
-} // end namespace internal
-
+}  // end namespace internal
 
 /**
  * \ingroup SparseExtra_Module
  * @brief Reads the header of a matrixmarket file and determines the properties of a matrix
- * 
+ *
  * @param filename of the file
- * @param sym if the matrix is hermitian,symmetric or none of the latter (sym=0) 
- * @param iscomplex if the matrix has complex or real coefficients 
+ * @param sym if the matrix is hermitian,symmetric or none of the latter (sym=0)
+ * @param iscomplex if the matrix has complex or real coefficients
  * @param isdense if the matrix is dense or sparse
  * @return true if the file was found
  */
-inline bool getMarketHeader(const std::string& filename, int& sym, bool& iscomplex, bool& isdense)
-{
-  sym = 0; 
+inline bool getMarketHeader(const std::string& filename, int& sym, bool& iscomplex, bool& isdense) {
+  sym = 0;
   iscomplex = false;
   isdense = false;
-  std::ifstream in(filename.c_str(),std::ios::in);
-  if(!in)
-    return false;
-  
-  std::string line; 
-  // The matrix header is always the first line in the file 
-  std::getline(in, line); eigen_assert(in.good());
-  
-  std::stringstream fmtline(line); 
+  std::ifstream in(filename.c_str(), std::ios::in);
+  if (!in) return false;
+
+  std::string line;
+  // The matrix header is always the first line in the file
+  std::getline(in, line);
+  eigen_assert(in.good());
+
+  std::stringstream fmtline(line);
   std::string substr[5];
-  fmtline>> substr[0] >> substr[1] >> substr[2] >> substr[3] >> substr[4];
-  if(substr[2].compare("array") == 0) isdense = true;
-  if(substr[3].compare("complex") == 0) iscomplex = true;
-  if(substr[4].compare("symmetric") == 0) sym = Symmetric;
-  else if (substr[4].compare("Hermitian") == 0) sym = SelfAdjoint;
-  
+  fmtline >> substr[0] >> substr[1] >> substr[2] >> substr[3] >> substr[4];
+  if (substr[2].compare("array") == 0) isdense = true;
+  if (substr[3].compare("complex") == 0) iscomplex = true;
+  if (substr[4].compare("symmetric") == 0)
+    sym = Symmetric;
+  else if (substr[4].compare("Hermitian") == 0)
+    sym = SelfAdjoint;
+
   return true;
 }
 /**
  * \ingroup SparseExtra_Module
  * @brief Loads a sparse matrix from a matrixmarket format file.
- * 
+ *
  * @tparam SparseMatrixType to read into, symmetries are not supported
  * @param mat SparseMatrix to read into, current values are overwritten
  * @param filename to parse matrix from
  * @return returns true if file exists. Returns false if the parsing did not succeed.
  */
-template<typename SparseMatrixType>
-bool loadMarket(SparseMatrixType& mat, const std::string& filename)
-{
+template <typename SparseMatrixType>
+bool loadMarket(SparseMatrixType& mat, const std::string& filename) {
   typedef typename SparseMatrixType::Scalar Scalar;
   typedef typename SparseMatrixType::StorageIndex StorageIndex;
-  std::ifstream input(filename.c_str(),std::ios::in);
-  if(!input)
-    return false;
+  std::ifstream input(filename.c_str(), std::ios::in);
+  if (!input) return false;
 
   char rdbuffer[4096];
   input.rdbuf()->pubsetbuf(rdbuffer, 4096);
-  
+
   const int maxBuffersize = 2048;
   char buffer[maxBuffersize];
-  
+
   bool readsizes = false;
 
-  typedef Triplet<Scalar,StorageIndex> T;
+  typedef Triplet<Scalar, StorageIndex> T;
   std::vector<T> elements;
-  
+
   Index M(-1), N(-1), NNZ(-1);
   Index count = 0;
-  while(input.getline(buffer, maxBuffersize))
-  {
-    // skip comments   
-    //NOTE An appropriate test should be done on the header to get the  symmetry
-    if(buffer[0]=='%')
-      continue;
+  while (input.getline(buffer, maxBuffersize)) {
+    // skip comments
+    // NOTE An appropriate test should be done on the header to get the  symmetry
+    if (buffer[0] == '%') continue;
 
-    if(!readsizes)
-    {
+    if (!readsizes) {
       std::stringstream line(buffer);
       line >> M >> N >> NNZ;
-      if(M > 0 && N > 0)
-      {
+      if (M > 0 && N > 0) {
         readsizes = true;
-        mat.resize(M,N);
+        mat.resize(M, N);
         mat.reserve(NNZ);
         elements.reserve(NNZ);
       }
-    }
-    else
-    { 
+    } else {
       StorageIndex i(-1), j(-1);
-      Scalar value; 
+      Scalar value;
       internal::GetMarketLine(buffer, i, j, value);
 
       i--;
       j--;
-      if(i>=0 && j>=0 && i<M && j<N)
-      {
+      if (i >= 0 && j >= 0 && i < M && j < N) {
         ++count;
-        elements.push_back(T(i,j,value));
-      }
-      else
-      {
-        std::cerr << "Invalid read: " << i << "," << j << "\n";   
+        elements.push_back(T(i, j, value));
+      } else {
+        std::cerr << "Invalid read: " << i << "," << j << "\n";
         return false;
-      }     
+      }
     }
   }
 
   mat.setFromTriplets(elements.begin(), elements.end());
-  if(count!=NNZ){
+  if (count != NNZ) {
     std::cerr << count << "!=" << NNZ << "\n";
     return false;
   }
@@ -223,68 +212,66 @@
   return true;
 }
 
-
 /**
  * \ingroup SparseExtra_Module
- * @brief Loads a dense Matrix or Vector from a matrixmarket file. If a statically sized matrix has to be parsed and the file contains the wrong dimensions it is undefined behaviour.
- * 
+ * @brief Loads a dense Matrix or Vector from a matrixmarket file. If a statically sized matrix has to be parsed and the
+ * file contains the wrong dimensions it is undefined behaviour.
+ *
  * @tparam DenseMatrixType to read into
  * @param mat DenseMatrix to read into, current values are overwritten, symmetries are not supported
  * @param filename to parse matrix from
  * @return true if parsing was successful. Returns false if the parsing did not succeed.
  */
-template<typename DenseType>
-bool loadMarketDense(DenseType& mat, const std::string& filename)
-{
-   typedef typename DenseType::Scalar Scalar;
+template <typename DenseType>
+bool loadMarketDense(DenseType& mat, const std::string& filename) {
+  typedef typename DenseType::Scalar Scalar;
   std::ifstream in(filename.c_str(), std::ios::in);
-  if(!in)
-    return false;
-  
-  std::string line; 
-  Index rows(0), cols(0); 
-  do 
-  { // Skip comments
-    std::getline(in, line); eigen_assert(in.good());
+  if (!in) return false;
+
+  std::string line;
+  Index rows(0), cols(0);
+  do {  // Skip comments
+    std::getline(in, line);
+    eigen_assert(in.good());
   } while (line[0] == '%');
   std::istringstream newline(line);
-  newline  >> rows >> cols; 
+  newline >> rows >> cols;
 
-  bool sizes_not_positive=(rows<1 || cols<1);
+  bool sizes_not_positive = (rows < 1 || cols < 1);
   bool wrong_input_rows = (DenseType::MaxRowsAtCompileTime != Dynamic && rows > DenseType::MaxRowsAtCompileTime) ||
-                          (DenseType::RowsAtCompileTime!=Dynamic && rows!=DenseType::RowsAtCompileTime);
+                          (DenseType::RowsAtCompileTime != Dynamic && rows != DenseType::RowsAtCompileTime);
   bool wrong_input_cols = (DenseType::MaxColsAtCompileTime != Dynamic && cols > DenseType::MaxColsAtCompileTime) ||
-                          (DenseType::ColsAtCompileTime!=Dynamic && cols!=DenseType::ColsAtCompileTime);
+                          (DenseType::ColsAtCompileTime != Dynamic && cols != DenseType::ColsAtCompileTime);
 
-  if(sizes_not_positive || wrong_input_rows || wrong_input_cols){
-    if(sizes_not_positive){
-      std::cerr<< "non-positive row or column size in file" << filename << "\n";
-    }else{
-      std::cerr<< "Input matrix can not be resized to"<<rows<<" x "<<cols<< "as given in " << filename << "\n";
+  if (sizes_not_positive || wrong_input_rows || wrong_input_cols) {
+    if (sizes_not_positive) {
+      std::cerr << "non-positive row or column size in file" << filename << "\n";
+    } else {
+      std::cerr << "Input matrix can not be resized to" << rows << " x " << cols << "as given in " << filename << "\n";
     }
     in.close();
     return false;
   }
 
-  mat.resize(rows,cols);
+  mat.resize(rows, cols);
   Index row = 0;
-  Index col = 0; 
-  Index n=0;
-  Scalar value; 
-  while ( std::getline(in, line) && (row < rows) && (col < cols)){
-    internal::GetDenseElt(line, value); 
-    //matrixmarket format is column major
-    mat(row,col) = value; 
+  Index col = 0;
+  Index n = 0;
+  Scalar value;
+  while (std::getline(in, line) && (row < rows) && (col < cols)) {
+    internal::GetDenseElt(line, value);
+    // matrixmarket format is column major
+    mat(row, col) = value;
     row++;
-    if(row==rows){
-      row=0;
+    if (row == rows) {
+      row = 0;
       col++;
     }
     n++;
   }
   in.close();
-  if (n!=mat.size()){
-    std::cerr<< "Unable to read all elements from file " << filename << "\n";
+  if (n != mat.size()) {
+    std::cerr << "Unable to read all elements from file " << filename << "\n";
     return false;
   }
   return true;
@@ -293,94 +280,86 @@
  * \ingroup SparseExtra_Module
  * @brief Same functionality as loadMarketDense, deprecated
  */
-template<typename VectorType>
-bool loadMarketVector(VectorType& vec, const std::string& filename)
-{
- return loadMarketDense(vec, filename);
+template <typename VectorType>
+bool loadMarketVector(VectorType& vec, const std::string& filename) {
+  return loadMarketDense(vec, filename);
 }
 
 /**
  * \ingroup SparseExtra_Module
  * @brief writes a sparse Matrix to a marketmarket format file
- * 
+ *
  * @tparam SparseMatrixType to write to file
  * @param mat matrix to write to file
- * @param filename filename to write to 
+ * @param filename filename to write to
  * @param sym at the moment no symmetry operations are supported
  * @return true if writing succeeded
  */
-template<typename SparseMatrixType>
-bool saveMarket(const SparseMatrixType& mat, const std::string& filename, int sym = 0)
-{
+template <typename SparseMatrixType>
+bool saveMarket(const SparseMatrixType& mat, const std::string& filename, int sym = 0) {
   typedef typename SparseMatrixType::Scalar Scalar;
   typedef typename SparseMatrixType::RealScalar RealScalar;
-  std::ofstream out(filename.c_str(),std::ios::out);
-  if(!out)
-    return false;
-  
+  std::ofstream out(filename.c_str(), std::ios::out);
+  if (!out) return false;
+
   out.flags(std::ios_base::scientific);
   out.precision(std::numeric_limits<RealScalar>::digits10 + 2);
-  std::string header; 
-  internal::putMarketHeader<Scalar>(header, sym); 
-  out << header << std::endl; 
+  std::string header;
+  internal::putMarketHeader<Scalar>(header, sym);
+  out << header << std::endl;
   out << mat.rows() << " " << mat.cols() << " " << mat.nonZeros() << "\n";
   int count = 0;
-  for(int j=0; j<mat.outerSize(); ++j)
-    for(typename SparseMatrixType::InnerIterator it(mat,j); it; ++it)
-    {
-      ++ count;
-      internal::PutMatrixElt(it.value(), it.row()+1, it.col()+1, out);
+  for (int j = 0; j < mat.outerSize(); ++j)
+    for (typename SparseMatrixType::InnerIterator it(mat, j); it; ++it) {
+      ++count;
+      internal::PutMatrixElt(it.value(), it.row() + 1, it.col() + 1, out);
     }
   out.close();
   return true;
 }
 
-
 /**
  * \ingroup SparseExtra_Module
  * @brief writes a dense Matrix or vector to a marketmarket format file
- * 
+ *
  * @tparam DenseMatrixType to write to file
  * @param mat matrix to write to file
- * @param filename filename to write to 
+ * @param filename filename to write to
  * @return true if writing succeeded
  */
 
-template<typename DenseType>
-bool saveMarketDense (const DenseType& mat, const std::string& filename)
-{
- typedef typename DenseType::Scalar Scalar;
- typedef typename DenseType::RealScalar RealScalar;
- std::ofstream out(filename.c_str(),std::ios::out);
-  if(!out)
-    return false;
-  
+template <typename DenseType>
+bool saveMarketDense(const DenseType& mat, const std::string& filename) {
+  typedef typename DenseType::Scalar Scalar;
+  typedef typename DenseType::RealScalar RealScalar;
+  std::ofstream out(filename.c_str(), std::ios::out);
+  if (!out) return false;
+
   out.flags(std::ios_base::scientific);
   out.precision(std::numeric_limits<RealScalar>::digits10 + 2);
-  if(internal::is_same<Scalar, std::complex<float> >::value || internal::is_same<Scalar, std::complex<double> >::value)
-      out << "%%MatrixMarket matrix array complex general\n"; 
+  if (internal::is_same<Scalar, std::complex<float> >::value || internal::is_same<Scalar, std::complex<double> >::value)
+    out << "%%MatrixMarket matrix array complex general\n";
   else
-    out << "%%MatrixMarket matrix array real general\n"; 
-  out << mat.rows() << " "<< mat.cols() << "\n";
-  for (Index i=0; i < mat.cols(); i++){
-    for (Index j=0; j < mat.rows(); j++){
-      internal::putDenseElt(mat(j,i), out); 
+    out << "%%MatrixMarket matrix array real general\n";
+  out << mat.rows() << " " << mat.cols() << "\n";
+  for (Index i = 0; i < mat.cols(); i++) {
+    for (Index j = 0; j < mat.rows(); j++) {
+      internal::putDenseElt(mat(j, i), out);
     }
   }
   out.close();
-  return true; 
+  return true;
 }
 
 /**
  * \ingroup SparseExtra_Module
  * @brief Same functionality as saveMarketDense, deprecated
  */
-template<typename VectorType>
-bool saveMarketVector (const VectorType& vec, const std::string& filename)
-{
+template <typename VectorType>
+bool saveMarketVector(const VectorType& vec, const std::string& filename) {
   return saveMarketDense(vec, filename);
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SPARSE_MARKET_IO_H
+#endif  // EIGEN_SPARSE_MARKET_IO_H
diff --git a/unsupported/Eigen/src/SparseExtra/MatrixMarketIterator.h b/unsupported/Eigen/src/SparseExtra/MatrixMarketIterator.h
index e6c8a0f..15d7fb2 100644
--- a/unsupported/Eigen/src/SparseExtra/MatrixMarketIterator.h
+++ b/unsupported/Eigen/src/SparseExtra/MatrixMarketIterator.h
@@ -16,235 +16,205 @@
 
 namespace Eigen {
 
-enum {
-  SPD = 0x100,
-  NonSymmetric = 0x0
-}; 
+enum { SPD = 0x100, NonSymmetric = 0x0 };
 
-/** 
+/**
  * @brief Iterator to browse matrices from a specified folder
- * 
- * This is used to load all the matrices from a folder. 
+ *
+ * This is used to load all the matrices from a folder.
  * The matrices should be in Matrix Market format
  * It is assumed that the matrices are named as matname.mtx
  * and matname_SPD.mtx if the matrix is Symmetric and positive definite (or Hermitian)
  * The right hand side vectors are loaded as well, if they exist.
- * They should be named as matname_b.mtx. 
+ * They should be named as matname_b.mtx.
  * Note that the right hand side for a SPD matrix is named as matname_SPD_b.mtx
- * 
+ *
  * Sometimes a reference solution is available. In this case, it should be named as matname_x.mtx
- * 
+ *
  * Sample code
  * \code
- * 
+ *
  * \endcode
- * 
- * \tparam Scalar The scalar type 
+ *
+ * \tparam Scalar The scalar type
  */
 template <typename Scalar>
-class MatrixMarketIterator 
-{
-    typedef typename NumTraits<Scalar>::Real RealScalar;
-  public:
-    typedef Matrix<Scalar,Dynamic,1> VectorType; 
-    typedef SparseMatrix<Scalar,ColMajor> MatrixType; 
-  
-  public:
-    MatrixMarketIterator(const std::string &folder)
-      : m_sym(0), m_isvalid(false), m_matIsLoaded(false), m_hasRhs(false), m_hasrefX(false), m_folder(folder)
-    {
-      m_folder_id = opendir(folder.c_str());
-      if(m_folder_id)
-        Getnextvalidmatrix();
-    }
-    
-    ~MatrixMarketIterator()
-    {
-      if (m_folder_id) closedir(m_folder_id); 
-    }
-    
-    inline MatrixMarketIterator& operator++()
-    {
-      m_matIsLoaded = false;
-      m_hasrefX = false;
-      m_hasRhs = false;
-      Getnextvalidmatrix();
-      return *this;
-    }
-    inline operator bool() const { return m_isvalid;}
-    
-    /** Return the sparse matrix corresponding to the current file */
-    inline MatrixType& matrix() 
-    { 
-      // Read the matrix
-      if (m_matIsLoaded) return m_mat;
-      
-      std::string matrix_file = m_folder + "/" + m_matname + ".mtx";
-      if ( !loadMarket(m_mat, matrix_file)) 
-      {
-        std::cerr << "Warning loadMarket failed when loading \"" << matrix_file << "\"" << std::endl;
-        m_matIsLoaded = false;
-        return m_mat;
-      }
-      m_matIsLoaded = true; 
+class MatrixMarketIterator {
+  typedef typename NumTraits<Scalar>::Real RealScalar;
 
-      if (m_sym != NonSymmetric) 
-      {
-        // Check whether we need to restore a full matrix:
-        RealScalar diag_norm  = m_mat.diagonal().norm();
-        RealScalar lower_norm = m_mat.template triangularView<Lower>().norm();
-        RealScalar upper_norm = m_mat.template triangularView<Upper>().norm();
-        if(lower_norm>diag_norm && upper_norm==diag_norm)
-        {
-          // only the lower part is stored
-          MatrixType tmp(m_mat);
-          m_mat = tmp.template selfadjointView<Lower>();
-        }
-        else if(upper_norm>diag_norm && lower_norm==diag_norm)
-        {
-          // only the upper part is stored
-          MatrixType tmp(m_mat);
-          m_mat = tmp.template selfadjointView<Upper>();
-        }
-      }
-      return m_mat; 
+ public:
+  typedef Matrix<Scalar, Dynamic, 1> VectorType;
+  typedef SparseMatrix<Scalar, ColMajor> MatrixType;
+
+ public:
+  MatrixMarketIterator(const std::string& folder)
+      : m_sym(0), m_isvalid(false), m_matIsLoaded(false), m_hasRhs(false), m_hasrefX(false), m_folder(folder) {
+    m_folder_id = opendir(folder.c_str());
+    if (m_folder_id) Getnextvalidmatrix();
+  }
+
+  ~MatrixMarketIterator() {
+    if (m_folder_id) closedir(m_folder_id);
+  }
+
+  inline MatrixMarketIterator& operator++() {
+    m_matIsLoaded = false;
+    m_hasrefX = false;
+    m_hasRhs = false;
+    Getnextvalidmatrix();
+    return *this;
+  }
+  inline operator bool() const { return m_isvalid; }
+
+  /** Return the sparse matrix corresponding to the current file */
+  inline MatrixType& matrix() {
+    // Read the matrix
+    if (m_matIsLoaded) return m_mat;
+
+    std::string matrix_file = m_folder + "/" + m_matname + ".mtx";
+    if (!loadMarket(m_mat, matrix_file)) {
+      std::cerr << "Warning loadMarket failed when loading \"" << matrix_file << "\"" << std::endl;
+      m_matIsLoaded = false;
+      return m_mat;
     }
-    
-    /** Return the right hand side corresponding to the current matrix. 
-     * If the rhs file is not provided, a random rhs is generated
-     */
-    inline VectorType& rhs() 
-    { 
-       // Get the right hand side
-      if (m_hasRhs) return m_rhs;
-      
-      std::string rhs_file;
-      rhs_file = m_folder + "/" + m_matname + "_b.mtx"; // The pattern is matname_b.mtx
-      m_hasRhs = Fileexists(rhs_file);
-      if (m_hasRhs)
-      {
-        m_rhs.resize(m_mat.cols());
-        m_hasRhs = loadMarketVector(m_rhs, rhs_file);
-      }
-      if (!m_hasRhs)
-      {
-        // Generate a random right hand side
-        if (!m_matIsLoaded) this->matrix(); 
-        m_refX.resize(m_mat.cols());
-        m_refX.setRandom();
-        m_rhs = m_mat * m_refX;
-        m_hasrefX = true;
-        m_hasRhs = true;
-      }
-      return m_rhs; 
-    }
-    
-    /** Return a reference solution
-     * If it is not provided and if the right hand side is not available
-     * then refX is randomly generated such that A*refX = b 
-     * where A and b are the matrix and the rhs. 
-     * Note that when a rhs is provided, refX is not available 
-     */
-    inline VectorType& refX() 
-    { 
-      // Check if a reference solution is provided
-      if (m_hasrefX) return m_refX;
-      
-      std::string lhs_file;
-      lhs_file = m_folder + "/" + m_matname + "_x.mtx"; 
-      m_hasrefX = Fileexists(lhs_file);
-      if (m_hasrefX)
-      {
-        m_refX.resize(m_mat.cols());
-        m_hasrefX = loadMarketVector(m_refX, lhs_file);
-      }
-      else
-        m_refX.resize(0);
-      return m_refX; 
-    }
-    
-    inline std::string& matname() { return m_matname; }
-    
-    inline int sym() { return m_sym; }
-    
-    bool hasRhs() {return m_hasRhs; }
-    bool hasrefX() {return m_hasrefX; }
-    bool isFolderValid() { return bool(m_folder_id); }
-    
-  protected:
-    
-    inline bool Fileexists(std::string file)
-    {
-      std::ifstream file_id(file.c_str());
-      if (!file_id.good() ) 
-      {
-        return false;
-      }
-      else 
-      {
-        file_id.close();
-        return true;
+    m_matIsLoaded = true;
+
+    if (m_sym != NonSymmetric) {
+      // Check whether we need to restore a full matrix:
+      RealScalar diag_norm = m_mat.diagonal().norm();
+      RealScalar lower_norm = m_mat.template triangularView<Lower>().norm();
+      RealScalar upper_norm = m_mat.template triangularView<Upper>().norm();
+      if (lower_norm > diag_norm && upper_norm == diag_norm) {
+        // only the lower part is stored
+        MatrixType tmp(m_mat);
+        m_mat = tmp.template selfadjointView<Lower>();
+      } else if (upper_norm > diag_norm && lower_norm == diag_norm) {
+        // only the upper part is stored
+        MatrixType tmp(m_mat);
+        m_mat = tmp.template selfadjointView<Upper>();
       }
     }
-    
-    void Getnextvalidmatrix( )
-    {
+    return m_mat;
+  }
+
+  /** Return the right hand side corresponding to the current matrix.
+   * If the rhs file is not provided, a random rhs is generated
+   */
+  inline VectorType& rhs() {
+    // Get the right hand side
+    if (m_hasRhs) return m_rhs;
+
+    std::string rhs_file;
+    rhs_file = m_folder + "/" + m_matname + "_b.mtx";  // The pattern is matname_b.mtx
+    m_hasRhs = Fileexists(rhs_file);
+    if (m_hasRhs) {
+      m_rhs.resize(m_mat.cols());
+      m_hasRhs = loadMarketVector(m_rhs, rhs_file);
+    }
+    if (!m_hasRhs) {
+      // Generate a random right hand side
+      if (!m_matIsLoaded) this->matrix();
+      m_refX.resize(m_mat.cols());
+      m_refX.setRandom();
+      m_rhs = m_mat * m_refX;
+      m_hasrefX = true;
+      m_hasRhs = true;
+    }
+    return m_rhs;
+  }
+
+  /** Return a reference solution
+   * If it is not provided and if the right hand side is not available
+   * then refX is randomly generated such that A*refX = b
+   * where A and b are the matrix and the rhs.
+   * Note that when a rhs is provided, refX is not available
+   */
+  inline VectorType& refX() {
+    // Check if a reference solution is provided
+    if (m_hasrefX) return m_refX;
+
+    std::string lhs_file;
+    lhs_file = m_folder + "/" + m_matname + "_x.mtx";
+    m_hasrefX = Fileexists(lhs_file);
+    if (m_hasrefX) {
+      m_refX.resize(m_mat.cols());
+      m_hasrefX = loadMarketVector(m_refX, lhs_file);
+    } else
+      m_refX.resize(0);
+    return m_refX;
+  }
+
+  inline std::string& matname() { return m_matname; }
+
+  inline int sym() { return m_sym; }
+
+  bool hasRhs() { return m_hasRhs; }
+  bool hasrefX() { return m_hasrefX; }
+  bool isFolderValid() { return bool(m_folder_id); }
+
+ protected:
+  inline bool Fileexists(std::string file) {
+    std::ifstream file_id(file.c_str());
+    if (!file_id.good()) {
+      return false;
+    } else {
+      file_id.close();
+      return true;
+    }
+  }
+
+  void Getnextvalidmatrix() {
+    m_isvalid = false;
+    // Here, we return with the next valid matrix in the folder
+    while ((m_curs_id = readdir(m_folder_id)) != NULL) {
       m_isvalid = false;
-      // Here, we return with the next valid matrix in the folder
-      while ( (m_curs_id = readdir(m_folder_id)) != NULL) {
-        m_isvalid = false;
-        std::string curfile;
-        curfile = m_folder + "/" + m_curs_id->d_name;
-        // Discard if it is a folder
-        if (m_curs_id->d_type == DT_DIR) continue; //FIXME This may not be available on non BSD systems
-//         struct stat st_buf; 
-//         stat (curfile.c_str(), &st_buf);
-//         if (S_ISDIR(st_buf.st_mode)) continue;
-        
-        // Determine from the header if it is a matrix or a right hand side 
-        bool isvector,iscomplex=false;
-        if(!getMarketHeader(curfile,m_sym,iscomplex,isvector)) continue;
-        if(isvector) continue;
-        if (!iscomplex)
-        {
-          if(internal::is_same<Scalar, std::complex<float> >::value || internal::is_same<Scalar, std::complex<double> >::value)
-            continue; 
-        }
-        if (iscomplex)
-        {
-          if(internal::is_same<Scalar, float>::value || internal::is_same<Scalar, double>::value)
-            continue; 
-        }
-        
-        
-        // Get the matrix name
-        std::string filename = m_curs_id->d_name;
-        m_matname = filename.substr(0, filename.length()-4); 
-        
-        // Find if the matrix is SPD 
-        size_t found = m_matname.find("SPD");
-        if( (found!=std::string::npos) && (m_sym != NonSymmetric) )
-          m_sym = SPD;
-       
-        m_isvalid = true;
-        break; 
+      std::string curfile;
+      curfile = m_folder + "/" + m_curs_id->d_name;
+      // Discard if it is a folder
+      if (m_curs_id->d_type == DT_DIR) continue;  // FIXME This may not be available on non BSD systems
+      //         struct stat st_buf;
+      //         stat (curfile.c_str(), &st_buf);
+      //         if (S_ISDIR(st_buf.st_mode)) continue;
+
+      // Determine from the header if it is a matrix or a right hand side
+      bool isvector, iscomplex = false;
+      if (!getMarketHeader(curfile, m_sym, iscomplex, isvector)) continue;
+      if (isvector) continue;
+      if (!iscomplex) {
+        if (internal::is_same<Scalar, std::complex<float> >::value ||
+            internal::is_same<Scalar, std::complex<double> >::value)
+          continue;
       }
+      if (iscomplex) {
+        if (internal::is_same<Scalar, float>::value || internal::is_same<Scalar, double>::value) continue;
+      }
+
+      // Get the matrix name
+      std::string filename = m_curs_id->d_name;
+      m_matname = filename.substr(0, filename.length() - 4);
+
+      // Find if the matrix is SPD
+      size_t found = m_matname.find("SPD");
+      if ((found != std::string::npos) && (m_sym != NonSymmetric)) m_sym = SPD;
+
+      m_isvalid = true;
+      break;
     }
-    int m_sym; // Symmetry of the matrix
-    MatrixType m_mat; // Current matrix  
-    VectorType m_rhs;  // Current vector
-    VectorType m_refX; // The reference solution, if exists
-    std::string m_matname; // Matrix Name
-    bool m_isvalid; 
-    bool m_matIsLoaded; // Determine if the matrix has already been loaded from the file
-    bool m_hasRhs; // The right hand side exists
-    bool m_hasrefX; // A reference solution is provided
-    std::string m_folder;
-    DIR * m_folder_id;
-    struct dirent *m_curs_id; 
-    
+  }
+  int m_sym;              // Symmetry of the matrix
+  MatrixType m_mat;       // Current matrix
+  VectorType m_rhs;       // Current vector
+  VectorType m_refX;      // The reference solution, if exists
+  std::string m_matname;  // Matrix Name
+  bool m_isvalid;
+  bool m_matIsLoaded;  // Determine if the matrix has already been loaded from the file
+  bool m_hasRhs;       // The right hand side exists
+  bool m_hasrefX;      // A reference solution is provided
+  std::string m_folder;
+  DIR* m_folder_id;
+  struct dirent* m_curs_id;
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
 #endif
diff --git a/unsupported/Eigen/src/SparseExtra/RandomSetter.h b/unsupported/Eigen/src/SparseExtra/RandomSetter.h
index 8150243..2889d82 100644
--- a/unsupported/Eigen/src/SparseExtra/RandomSetter.h
+++ b/unsupported/Eigen/src/SparseExtra/RandomSetter.h
@@ -11,7 +11,7 @@
 #define EIGEN_RANDOMSETTER_H
 
 #if defined(EIGEN_GOOGLEHASH_SUPPORT)
-// Ensure the ::google namespace exists, required for checking existence of 
+// Ensure the ::google namespace exists, required for checking existence of
 // ::google::dense_hash_map and ::google::sparse_hash_map.
 namespace google {}
 #endif
@@ -22,31 +22,26 @@
 namespace Eigen {
 
 /** Represents a std::map
-  *
-  * \see RandomSetter
-  */
-template<typename Scalar> struct StdMapTraits
-{
+ *
+ * \see RandomSetter
+ */
+template <typename Scalar>
+struct StdMapTraits {
   typedef int KeyType;
-  typedef std::map<KeyType,Scalar> Type;
-  enum {
-    IsSorted = 1
-  };
+  typedef std::map<KeyType, Scalar> Type;
+  enum { IsSorted = 1 };
 
   static void setInvalidKey(Type&, const KeyType&) {}
 };
 
-
 /** Represents a std::unordered_map
-  * \see RandomSetter
-  */
-template<typename Scalar> struct StdUnorderedMapTraits
-{
+ * \see RandomSetter
+ */
+template <typename Scalar>
+struct StdUnorderedMapTraits {
   typedef int KeyType;
-  typedef std::unordered_map<KeyType,Scalar> Type;
-  enum {
-    IsSorted = 0
-  };
+  typedef std::unordered_map<KeyType, Scalar> Type;
+  enum { IsSorted = 0 };
 
   static void setInvalidKey(Type&, const KeyType&) {}
 };
@@ -54,283 +49,255 @@
 #if defined(EIGEN_GOOGLEHASH_SUPPORT)
 
 namespace google {
-  
+
 // Namespace work-around, since sometimes dense_hash_map and sparse_hash_map
 // are in the global namespace, and other times they are under ::google.
 using namespace ::google;
 
-template<typename KeyType, typename Scalar>
+template <typename KeyType, typename Scalar>
 struct DenseHashMap {
   typedef dense_hash_map<KeyType, Scalar> type;
 };
 
-template<typename KeyType, typename Scalar>
+template <typename KeyType, typename Scalar>
 struct SparseHashMap {
   typedef sparse_hash_map<KeyType, Scalar> type;
 };
 
-} // namespace google
+}  // namespace google
 
 /** Represents a google::dense_hash_map
-  *
-  * \see RandomSetter
-  */
-template<typename Scalar> struct GoogleDenseHashMapTraits
-{
+ *
+ * \see RandomSetter
+ */
+template <typename Scalar>
+struct GoogleDenseHashMapTraits {
   typedef int KeyType;
-  typedef typename google::DenseHashMap<KeyType,Scalar>::type Type;
-  enum {
-    IsSorted = 0
-  };
+  typedef typename google::DenseHashMap<KeyType, Scalar>::type Type;
+  enum { IsSorted = 0 };
 
-  static void setInvalidKey(Type& map, const KeyType& k)
-  { map.set_empty_key(k); }
+  static void setInvalidKey(Type& map, const KeyType& k) { map.set_empty_key(k); }
 };
 
 /** Represents a google::sparse_hash_map
-  *
-  * \see RandomSetter
-  */
-template<typename Scalar> struct GoogleSparseHashMapTraits
-{
+ *
+ * \see RandomSetter
+ */
+template <typename Scalar>
+struct GoogleSparseHashMapTraits {
   typedef int KeyType;
-  typedef typename google::SparseHashMap<KeyType,Scalar>::type Type;
-  enum {
-    IsSorted = 0
-  };
+  typedef typename google::SparseHashMap<KeyType, Scalar>::type Type;
+  enum { IsSorted = 0 };
 
   static void setInvalidKey(Type&, const KeyType&) {}
 };
 #endif
 
 /** \class RandomSetter
-  * \ingroup SparseExtra_Module
-  * \brief The RandomSetter is a wrapper object allowing to set/update a sparse matrix with random access
-  *
-  * \tparam SparseMatrixType the type of the sparse matrix we are updating
-  * \tparam MapTraits a traits class representing the map implementation used for the temporary sparse storage.
-  *                  Its default value depends on the system.
-  * \tparam OuterPacketBits defines the number of rows (or columns) manage by a single map object
-  *                        as a power of two exponent.
-  *
-  * This class temporarily represents a sparse matrix object using a generic map implementation allowing for
-  * efficient random access. The conversion from the compressed representation to a hash_map object is performed
-  * in the RandomSetter constructor, while the sparse matrix is updated back at destruction time. This strategy
-  * suggest the use of nested blocks as in this example:
-  *
-  * \code
-  * SparseMatrix<double> m(rows,cols);
-  * {
-  *   RandomSetter<SparseMatrix<double> > w(m);
-  *   // don't use m but w instead with read/write random access to the coefficients:
-  *   for(;;)
-  *     w(rand(),rand()) = rand;
-  * }
-  * // when w is deleted, the data are copied back to m
-  * // and m is ready to use.
-  * \endcode
-  *
-  * Since hash_map objects are not fully sorted, representing a full matrix as a single hash_map would
-  * involve a big and costly sort to update the compressed matrix back. To overcome this issue, a RandomSetter
-  * use multiple hash_map, each representing 2^OuterPacketBits columns or rows according to the storage order.
-  * To reach optimal performance, this value should be adjusted according to the average number of nonzeros
-  * per rows/columns.
-  *
-  * The possible values for the template parameter MapTraits are:
-  *  - \b StdMapTraits: corresponds to std::map. (does not perform very well)
-  *  - \b StdUnorderedMapTraits: corresponds to std::unordered_map
-  *  - \b GoogleDenseHashMapTraits: corresponds to google::dense_hash_map (best efficiency, reasonable memory consumption)
-  *  - \b GoogleSparseHashMapTraits: corresponds to google::sparse_hash_map (best memory consumption, relatively good performance)
-  *
-  * The default map implementation depends on the availability, and the preferred order is:
-  * GoogleSparseHashMapTraits, StdUnorderedMapTraits, and finally StdMapTraits.
-  *
-  * For performance and memory consumption reasons it is highly recommended to use one of
-  * Google's hash_map implementations. To enable the support for them, you must define
-  * EIGEN_GOOGLEHASH_SUPPORT. This will include both <google/dense_hash_map> and
-  * <google/sparse_hash_map> for you.
-  *
-  * \see https://github.com/sparsehash/sparsehash
-  */
-template<typename SparseMatrixType,
-         template <typename T> class MapTraits =
+ * \ingroup SparseExtra_Module
+ * \brief The RandomSetter is a wrapper object allowing to set/update a sparse matrix with random access
+ *
+ * \tparam SparseMatrixType the type of the sparse matrix we are updating
+ * \tparam MapTraits a traits class representing the map implementation used for the temporary sparse storage.
+ *                  Its default value depends on the system.
+ * \tparam OuterPacketBits defines the number of rows (or columns) manage by a single map object
+ *                        as a power of two exponent.
+ *
+ * This class temporarily represents a sparse matrix object using a generic map implementation allowing for
+ * efficient random access. The conversion from the compressed representation to a hash_map object is performed
+ * in the RandomSetter constructor, while the sparse matrix is updated back at destruction time. This strategy
+ * suggest the use of nested blocks as in this example:
+ *
+ * \code
+ * SparseMatrix<double> m(rows,cols);
+ * {
+ *   RandomSetter<SparseMatrix<double> > w(m);
+ *   // don't use m but w instead with read/write random access to the coefficients:
+ *   for(;;)
+ *     w(rand(),rand()) = rand;
+ * }
+ * // when w is deleted, the data are copied back to m
+ * // and m is ready to use.
+ * \endcode
+ *
+ * Since hash_map objects are not fully sorted, representing a full matrix as a single hash_map would
+ * involve a big and costly sort to update the compressed matrix back. To overcome this issue, a RandomSetter
+ * use multiple hash_map, each representing 2^OuterPacketBits columns or rows according to the storage order.
+ * To reach optimal performance, this value should be adjusted according to the average number of nonzeros
+ * per rows/columns.
+ *
+ * The possible values for the template parameter MapTraits are:
+ *  - \b StdMapTraits: corresponds to std::map. (does not perform very well)
+ *  - \b StdUnorderedMapTraits: corresponds to std::unordered_map
+ *  - \b GoogleDenseHashMapTraits: corresponds to google::dense_hash_map (best efficiency, reasonable memory
+ * consumption)
+ *  - \b GoogleSparseHashMapTraits: corresponds to google::sparse_hash_map (best memory consumption, relatively good
+ * performance)
+ *
+ * The default map implementation depends on the availability, and the preferred order is:
+ * GoogleSparseHashMapTraits, StdUnorderedMapTraits, and finally StdMapTraits.
+ *
+ * For performance and memory consumption reasons it is highly recommended to use one of
+ * Google's hash_map implementations. To enable the support for them, you must define
+ * EIGEN_GOOGLEHASH_SUPPORT. This will include both <google/dense_hash_map> and
+ * <google/sparse_hash_map> for you.
+ *
+ * \see https://github.com/sparsehash/sparsehash
+ */
+template <typename SparseMatrixType,
+          template <typename T> class MapTraits =
 #if defined(EIGEN_GOOGLEHASH_SUPPORT)
-          GoogleDenseHashMapTraits
+              GoogleDenseHashMapTraits
 #else
-          StdUnorderedMapTraits
+              StdUnorderedMapTraits
 #endif
-         ,int OuterPacketBits = 6>
-class RandomSetter
-{
-    typedef typename SparseMatrixType::Scalar Scalar;
-    typedef typename SparseMatrixType::StorageIndex StorageIndex;
+          ,
+          int OuterPacketBits = 6>
+class RandomSetter {
+  typedef typename SparseMatrixType::Scalar Scalar;
+  typedef typename SparseMatrixType::StorageIndex StorageIndex;
 
-    struct ScalarWrapper
-    {
-      ScalarWrapper() : value(0) {}
-      Scalar value;
-    };
-    typedef typename MapTraits<ScalarWrapper>::KeyType KeyType;
-    typedef typename MapTraits<ScalarWrapper>::Type HashMapType;
-    static constexpr int OuterPacketMask = (1 << OuterPacketBits) - 1;
-    enum {
-      SwapStorage = 1 - MapTraits<ScalarWrapper>::IsSorted,
-      TargetRowMajor = (SparseMatrixType::Flags & RowMajorBit) ? 1 : 0,
-      SetterRowMajor = SwapStorage ? 1-TargetRowMajor : TargetRowMajor
-    };
+  struct ScalarWrapper {
+    ScalarWrapper() : value(0) {}
+    Scalar value;
+  };
+  typedef typename MapTraits<ScalarWrapper>::KeyType KeyType;
+  typedef typename MapTraits<ScalarWrapper>::Type HashMapType;
+  static constexpr int OuterPacketMask = (1 << OuterPacketBits) - 1;
+  enum {
+    SwapStorage = 1 - MapTraits<ScalarWrapper>::IsSorted,
+    TargetRowMajor = (SparseMatrixType::Flags & RowMajorBit) ? 1 : 0,
+    SetterRowMajor = SwapStorage ? 1 - TargetRowMajor : TargetRowMajor
+  };
 
-  public:
-
-    /** Constructs a random setter object from the sparse matrix \a target
-      *
-      * Note that the initial value of \a target are imported. If you want to re-set
-      * a sparse matrix from scratch, then you must set it to zero first using the
-      * setZero() function.
-      */
-    inline RandomSetter(SparseMatrixType& target)
-      : mp_target(&target)
-    {
-      const Index outerSize = SwapStorage ? target.innerSize() : target.outerSize();
-      const Index innerSize = SwapStorage ? target.outerSize() : target.innerSize();
-      m_outerPackets = outerSize >> OuterPacketBits;
-      if (outerSize&OuterPacketMask)
-        m_outerPackets += 1;
-      m_hashmaps = new HashMapType[m_outerPackets];
-      // compute number of bits needed to store inner indices
-      Index aux = innerSize - 1;
-      m_keyBitsOffset = 0;
-      while (aux)
-      {
-        ++m_keyBitsOffset;
-        aux = aux >> 1;
-      }
-      KeyType ik = (1<<(OuterPacketBits+m_keyBitsOffset));
-      for (Index k=0; k<m_outerPackets; ++k)
-        MapTraits<ScalarWrapper>::setInvalidKey(m_hashmaps[k],ik);
-
-      // insert current coeffs
-      for (Index j=0; j<mp_target->outerSize(); ++j)
-        for (typename SparseMatrixType::InnerIterator it(*mp_target,j); it; ++it)
-          (*this)(TargetRowMajor?j:it.index(), TargetRowMajor?it.index():j) = it.value();
+ public:
+  /** Constructs a random setter object from the sparse matrix \a target
+   *
+   * Note that the initial value of \a target are imported. If you want to re-set
+   * a sparse matrix from scratch, then you must set it to zero first using the
+   * setZero() function.
+   */
+  inline RandomSetter(SparseMatrixType& target) : mp_target(&target) {
+    const Index outerSize = SwapStorage ? target.innerSize() : target.outerSize();
+    const Index innerSize = SwapStorage ? target.outerSize() : target.innerSize();
+    m_outerPackets = outerSize >> OuterPacketBits;
+    if (outerSize & OuterPacketMask) m_outerPackets += 1;
+    m_hashmaps = new HashMapType[m_outerPackets];
+    // compute number of bits needed to store inner indices
+    Index aux = innerSize - 1;
+    m_keyBitsOffset = 0;
+    while (aux) {
+      ++m_keyBitsOffset;
+      aux = aux >> 1;
     }
+    KeyType ik = (1 << (OuterPacketBits + m_keyBitsOffset));
+    for (Index k = 0; k < m_outerPackets; ++k) MapTraits<ScalarWrapper>::setInvalidKey(m_hashmaps[k], ik);
 
-    /** Destructor updating back the sparse matrix target */
-    ~RandomSetter()
+    // insert current coeffs
+    for (Index j = 0; j < mp_target->outerSize(); ++j)
+      for (typename SparseMatrixType::InnerIterator it(*mp_target, j); it; ++it)
+        (*this)(TargetRowMajor ? j : it.index(), TargetRowMajor ? it.index() : j) = it.value();
+  }
+
+  /** Destructor updating back the sparse matrix target */
+  ~RandomSetter() {
+    KeyType keyBitsMask = (1 << m_keyBitsOffset) - 1;
+    if (!SwapStorage)  // also means the map is sorted
     {
-      KeyType keyBitsMask = (1<<m_keyBitsOffset)-1;
-      if (!SwapStorage) // also means the map is sorted
-      {
-        mp_target->setZero();
-        mp_target->makeCompressed();
-        mp_target->reserve(nonZeros());
-        Index prevOuter = -1;
-        for (Index k=0; k<m_outerPackets; ++k)
-        {
-          const Index outerOffset = (1<<OuterPacketBits) * k;
-          typename HashMapType::iterator end = m_hashmaps[k].end();
-          for (typename HashMapType::iterator it = m_hashmaps[k].begin(); it!=end; ++it)
-          {
-            const Index outer = (it->first >> m_keyBitsOffset) + outerOffset;
-            const Index inner = it->first & keyBitsMask;
-            if (prevOuter!=outer)
-            {
-              for (Index j=prevOuter+1;j<=outer;++j)
-                mp_target->startVec(j);
-              prevOuter = outer;
-            }
-            mp_target->insertBackByOuterInner(outer, inner) = it->second.value;
+      mp_target->setZero();
+      mp_target->makeCompressed();
+      mp_target->reserve(nonZeros());
+      Index prevOuter = -1;
+      for (Index k = 0; k < m_outerPackets; ++k) {
+        const Index outerOffset = (1 << OuterPacketBits) * k;
+        typename HashMapType::iterator end = m_hashmaps[k].end();
+        for (typename HashMapType::iterator it = m_hashmaps[k].begin(); it != end; ++it) {
+          const Index outer = (it->first >> m_keyBitsOffset) + outerOffset;
+          const Index inner = it->first & keyBitsMask;
+          if (prevOuter != outer) {
+            for (Index j = prevOuter + 1; j <= outer; ++j) mp_target->startVec(j);
+            prevOuter = outer;
           }
-        }
-        mp_target->finalize();
-      }
-      else
-      {
-        VectorXi positions(mp_target->outerSize());
-        positions.setZero();
-        // pass 1
-        for (Index k=0; k<m_outerPackets; ++k)
-        {
-          typename HashMapType::iterator end = m_hashmaps[k].end();
-          for (typename HashMapType::iterator it = m_hashmaps[k].begin(); it!=end; ++it)
-          {
-            const Index outer = it->first & keyBitsMask;
-            ++positions[outer];
-          }
-        }
-        // prefix sum
-        StorageIndex count = 0;
-        for (Index j=0; j<mp_target->outerSize(); ++j)
-        {
-          StorageIndex tmp = positions[j];
-          mp_target->outerIndexPtr()[j] = count;
-          positions[j] = count;
-          count += tmp;
-        }
-        mp_target->makeCompressed();
-        mp_target->outerIndexPtr()[mp_target->outerSize()] = count;
-        mp_target->resizeNonZeros(count);
-        // pass 2
-        for (Index k=0; k<m_outerPackets; ++k)
-        {
-          const Index outerOffset = (1<<OuterPacketBits) * k;
-          typename HashMapType::iterator end = m_hashmaps[k].end();
-          for (typename HashMapType::iterator it = m_hashmaps[k].begin(); it!=end; ++it)
-          {
-            const Index inner = (it->first >> m_keyBitsOffset) + outerOffset;
-            const Index outer = it->first & keyBitsMask;
-            // sorted insertion
-            // Note that we have to deal with at most 2^OuterPacketBits unsorted coefficients,
-            // moreover those 2^OuterPacketBits coeffs are likely to be sparse, an so only a
-            // small fraction of them have to be sorted, whence the following simple procedure:
-            Index posStart = mp_target->outerIndexPtr()[outer];
-            Index i = (positions[outer]++) - 1;
-            while ( (i >= posStart) && (mp_target->innerIndexPtr()[i] > inner) )
-            {
-              mp_target->valuePtr()[i+1] = mp_target->valuePtr()[i];
-              mp_target->innerIndexPtr()[i+1] = mp_target->innerIndexPtr()[i];
-              --i;
-            }
-            mp_target->innerIndexPtr()[i+1] = internal::convert_index<StorageIndex>(inner);
-            mp_target->valuePtr()[i+1] = it->second.value;
-          }
+          mp_target->insertBackByOuterInner(outer, inner) = it->second.value;
         }
       }
-      delete[] m_hashmaps;
+      mp_target->finalize();
+    } else {
+      VectorXi positions(mp_target->outerSize());
+      positions.setZero();
+      // pass 1
+      for (Index k = 0; k < m_outerPackets; ++k) {
+        typename HashMapType::iterator end = m_hashmaps[k].end();
+        for (typename HashMapType::iterator it = m_hashmaps[k].begin(); it != end; ++it) {
+          const Index outer = it->first & keyBitsMask;
+          ++positions[outer];
+        }
+      }
+      // prefix sum
+      StorageIndex count = 0;
+      for (Index j = 0; j < mp_target->outerSize(); ++j) {
+        StorageIndex tmp = positions[j];
+        mp_target->outerIndexPtr()[j] = count;
+        positions[j] = count;
+        count += tmp;
+      }
+      mp_target->makeCompressed();
+      mp_target->outerIndexPtr()[mp_target->outerSize()] = count;
+      mp_target->resizeNonZeros(count);
+      // pass 2
+      for (Index k = 0; k < m_outerPackets; ++k) {
+        const Index outerOffset = (1 << OuterPacketBits) * k;
+        typename HashMapType::iterator end = m_hashmaps[k].end();
+        for (typename HashMapType::iterator it = m_hashmaps[k].begin(); it != end; ++it) {
+          const Index inner = (it->first >> m_keyBitsOffset) + outerOffset;
+          const Index outer = it->first & keyBitsMask;
+          // sorted insertion
+          // Note that we have to deal with at most 2^OuterPacketBits unsorted coefficients,
+          // moreover those 2^OuterPacketBits coeffs are likely to be sparse, an so only a
+          // small fraction of them have to be sorted, whence the following simple procedure:
+          Index posStart = mp_target->outerIndexPtr()[outer];
+          Index i = (positions[outer]++) - 1;
+          while ((i >= posStart) && (mp_target->innerIndexPtr()[i] > inner)) {
+            mp_target->valuePtr()[i + 1] = mp_target->valuePtr()[i];
+            mp_target->innerIndexPtr()[i + 1] = mp_target->innerIndexPtr()[i];
+            --i;
+          }
+          mp_target->innerIndexPtr()[i + 1] = internal::convert_index<StorageIndex>(inner);
+          mp_target->valuePtr()[i + 1] = it->second.value;
+        }
+      }
     }
+    delete[] m_hashmaps;
+  }
 
-    /** \returns a reference to the coefficient at given coordinates \a row, \a col */
-    Scalar& operator() (Index row, Index col)
-    {
-      const Index outer = SetterRowMajor ? row : col;
-      const Index inner = SetterRowMajor ? col : row;
-      const Index outerMajor = outer >> OuterPacketBits; // index of the packet/map
-      const Index outerMinor = outer & OuterPacketMask;  // index of the inner vector in the packet
-      const KeyType key = internal::convert_index<KeyType>((outerMinor<<m_keyBitsOffset) | inner);
-      return m_hashmaps[outerMajor][key].value;
-    }
+  /** \returns a reference to the coefficient at given coordinates \a row, \a col */
+  Scalar& operator()(Index row, Index col) {
+    const Index outer = SetterRowMajor ? row : col;
+    const Index inner = SetterRowMajor ? col : row;
+    const Index outerMajor = outer >> OuterPacketBits;  // index of the packet/map
+    const Index outerMinor = outer & OuterPacketMask;   // index of the inner vector in the packet
+    const KeyType key = internal::convert_index<KeyType>((outerMinor << m_keyBitsOffset) | inner);
+    return m_hashmaps[outerMajor][key].value;
+  }
 
-    /** \returns the number of non zero coefficients
-      *
-      * \note According to the underlying map/hash_map implementation,
-      * this function might be quite expensive.
-      */
-    Index nonZeros() const
-    {
-      Index nz = 0;
-      for (Index k=0; k<m_outerPackets; ++k)
-        nz += static_cast<Index>(m_hashmaps[k].size());
-      return nz;
-    }
+  /** \returns the number of non zero coefficients
+   *
+   * \note According to the underlying map/hash_map implementation,
+   * this function might be quite expensive.
+   */
+  Index nonZeros() const {
+    Index nz = 0;
+    for (Index k = 0; k < m_outerPackets; ++k) nz += static_cast<Index>(m_hashmaps[k].size());
+    return nz;
+  }
 
-
-  protected:
-
-    HashMapType* m_hashmaps;
-    SparseMatrixType* mp_target;
-    Index m_outerPackets;
-    unsigned char m_keyBitsOffset;
+ protected:
+  HashMapType* m_hashmaps;
+  SparseMatrixType* mp_target;
+  Index m_outerPackets;
+  unsigned char m_keyBitsOffset;
 };
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_RANDOMSETTER_H
+#endif  // EIGEN_RANDOMSETTER_H
diff --git a/unsupported/Eigen/src/SpecialFunctions/BesselFunctionsArrayAPI.h b/unsupported/Eigen/src/SpecialFunctions/BesselFunctionsArrayAPI.h
index f5ee500..25b91b5 100644
--- a/unsupported/Eigen/src/SpecialFunctions/BesselFunctionsArrayAPI.h
+++ b/unsupported/Eigen/src/SpecialFunctions/BesselFunctionsArrayAPI.h
@@ -7,7 +7,6 @@
 // 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_BESSELFUNCTIONS_ARRAYAPI_H
 #define EIGEN_BESSELFUNCTIONS_ARRAYAPI_H
 
@@ -18,272 +17,260 @@
 
 /** \returns an expression of the coefficient-wise i0(\a x) to the given
  * arrays.
-  *
-  * It returns the modified Bessel function of the first kind of order zero.
-  *
-  * \param x is the argument
-  *
-  * \note This function supports only float and double scalar types. To support
-  * other scalar types, the user has to provide implementations of i0(T) for
-  * any scalar type T to be supported.
-  *
-  * \sa ArrayBase::bessel_i0()
-  */
+ *
+ * It returns the modified Bessel function of the first kind of order zero.
+ *
+ * \param x is the argument
+ *
+ * \note This function supports only float and double scalar types. To support
+ * other scalar types, the user has to provide implementations of i0(T) for
+ * any scalar type T to be supported.
+ *
+ * \sa ArrayBase::bessel_i0()
+ */
 template <typename Derived>
-EIGEN_STRONG_INLINE const Eigen::CwiseUnaryOp<
-    Eigen::internal::scalar_bessel_i0_op<typename Derived::Scalar>, const Derived>
-bessel_i0(const Eigen::ArrayBase<Derived>& x) {
-  return Eigen::CwiseUnaryOp<
-      Eigen::internal::scalar_bessel_i0_op<typename Derived::Scalar>,
-      const Derived>(x.derived());
+EIGEN_STRONG_INLINE const
+    Eigen::CwiseUnaryOp<Eigen::internal::scalar_bessel_i0_op<typename Derived::Scalar>, const Derived>
+    bessel_i0(const Eigen::ArrayBase<Derived>& x) {
+  return Eigen::CwiseUnaryOp<Eigen::internal::scalar_bessel_i0_op<typename Derived::Scalar>, const Derived>(
+      x.derived());
 }
 
 /** \returns an expression of the coefficient-wise i0e(\a x) to the given
  * arrays.
-  *
-  * It returns the exponentially scaled modified Bessel
-  * function of the first kind of order zero.
-  *
-  * \param x is the argument
-  *
-  * \note This function supports only float and double scalar types. To support
-  * other scalar types, the user has to provide implementations of i0e(T) for
-  * any scalar type T to be supported.
-  *
-  * \sa ArrayBase::bessel_i0e()
-  */
+ *
+ * It returns the exponentially scaled modified Bessel
+ * function of the first kind of order zero.
+ *
+ * \param x is the argument
+ *
+ * \note This function supports only float and double scalar types. To support
+ * other scalar types, the user has to provide implementations of i0e(T) for
+ * any scalar type T to be supported.
+ *
+ * \sa ArrayBase::bessel_i0e()
+ */
 template <typename Derived>
-EIGEN_STRONG_INLINE const Eigen::CwiseUnaryOp<
-    Eigen::internal::scalar_bessel_i0e_op<typename Derived::Scalar>, const Derived>
-bessel_i0e(const Eigen::ArrayBase<Derived>& x) {
-  return Eigen::CwiseUnaryOp<
-      Eigen::internal::scalar_bessel_i0e_op<typename Derived::Scalar>,
-      const Derived>(x.derived());
+EIGEN_STRONG_INLINE const
+    Eigen::CwiseUnaryOp<Eigen::internal::scalar_bessel_i0e_op<typename Derived::Scalar>, const Derived>
+    bessel_i0e(const Eigen::ArrayBase<Derived>& x) {
+  return Eigen::CwiseUnaryOp<Eigen::internal::scalar_bessel_i0e_op<typename Derived::Scalar>, const Derived>(
+      x.derived());
 }
 
 /** \returns an expression of the coefficient-wise i1(\a x) to the given
  * arrays.
-  *
-  * It returns the modified Bessel function of the first kind of order one.
-  *
-  * \param x is the argument
-  *
-  * \note This function supports only float and double scalar types. To support
-  * other scalar types, the user has to provide implementations of i1(T) for
-  * any scalar type T to be supported.
-  *
-  * \sa ArrayBase::bessel_i1()
-  */
+ *
+ * It returns the modified Bessel function of the first kind of order one.
+ *
+ * \param x is the argument
+ *
+ * \note This function supports only float and double scalar types. To support
+ * other scalar types, the user has to provide implementations of i1(T) for
+ * any scalar type T to be supported.
+ *
+ * \sa ArrayBase::bessel_i1()
+ */
 template <typename Derived>
-EIGEN_STRONG_INLINE const Eigen::CwiseUnaryOp<
-    Eigen::internal::scalar_bessel_i1_op<typename Derived::Scalar>, const Derived>
-bessel_i1(const Eigen::ArrayBase<Derived>& x) {
-  return Eigen::CwiseUnaryOp<
-      Eigen::internal::scalar_bessel_i1_op<typename Derived::Scalar>,
-      const Derived>(x.derived());
+EIGEN_STRONG_INLINE const
+    Eigen::CwiseUnaryOp<Eigen::internal::scalar_bessel_i1_op<typename Derived::Scalar>, const Derived>
+    bessel_i1(const Eigen::ArrayBase<Derived>& x) {
+  return Eigen::CwiseUnaryOp<Eigen::internal::scalar_bessel_i1_op<typename Derived::Scalar>, const Derived>(
+      x.derived());
 }
 
 /** \returns an expression of the coefficient-wise i1e(\a x) to the given
  * arrays.
-  *
-  * It returns the exponentially scaled modified Bessel
-  * function of the first kind of order one.
-  *
-  * \param x is the argument
-  *
-  * \note This function supports only float and double scalar types. To support
-  * other scalar types, the user has to provide implementations of i1e(T) for
-  * any scalar type T to be supported.
-  *
-  * \sa ArrayBase::bessel_i1e()
-  */
+ *
+ * It returns the exponentially scaled modified Bessel
+ * function of the first kind of order one.
+ *
+ * \param x is the argument
+ *
+ * \note This function supports only float and double scalar types. To support
+ * other scalar types, the user has to provide implementations of i1e(T) for
+ * any scalar type T to be supported.
+ *
+ * \sa ArrayBase::bessel_i1e()
+ */
 template <typename Derived>
-EIGEN_STRONG_INLINE const Eigen::CwiseUnaryOp<
-    Eigen::internal::scalar_bessel_i1e_op<typename Derived::Scalar>, const Derived>
-bessel_i1e(const Eigen::ArrayBase<Derived>& x) {
-  return Eigen::CwiseUnaryOp<
-      Eigen::internal::scalar_bessel_i1e_op<typename Derived::Scalar>,
-      const Derived>(x.derived());
+EIGEN_STRONG_INLINE const
+    Eigen::CwiseUnaryOp<Eigen::internal::scalar_bessel_i1e_op<typename Derived::Scalar>, const Derived>
+    bessel_i1e(const Eigen::ArrayBase<Derived>& x) {
+  return Eigen::CwiseUnaryOp<Eigen::internal::scalar_bessel_i1e_op<typename Derived::Scalar>, const Derived>(
+      x.derived());
 }
 
 /** \returns an expression of the coefficient-wise k0(\a x) to the given
  * arrays.
-  *
-  * It returns the modified Bessel function of the second kind of order zero.
-  *
-  * \param x is the argument
-  *
-  * \note This function supports only float and double scalar types. To support
-  * other scalar types, the user has to provide implementations of k0(T) for
-  * any scalar type T to be supported.
-  *
-  * \sa ArrayBase::bessel_k0()
-  */
+ *
+ * It returns the modified Bessel function of the second kind of order zero.
+ *
+ * \param x is the argument
+ *
+ * \note This function supports only float and double scalar types. To support
+ * other scalar types, the user has to provide implementations of k0(T) for
+ * any scalar type T to be supported.
+ *
+ * \sa ArrayBase::bessel_k0()
+ */
 template <typename Derived>
-EIGEN_STRONG_INLINE const Eigen::CwiseUnaryOp<
-    Eigen::internal::scalar_bessel_k0_op<typename Derived::Scalar>, const Derived>
-bessel_k0(const Eigen::ArrayBase<Derived>& x) {
-  return Eigen::CwiseUnaryOp<
-      Eigen::internal::scalar_bessel_k0_op<typename Derived::Scalar>,
-      const Derived>(x.derived());
+EIGEN_STRONG_INLINE const
+    Eigen::CwiseUnaryOp<Eigen::internal::scalar_bessel_k0_op<typename Derived::Scalar>, const Derived>
+    bessel_k0(const Eigen::ArrayBase<Derived>& x) {
+  return Eigen::CwiseUnaryOp<Eigen::internal::scalar_bessel_k0_op<typename Derived::Scalar>, const Derived>(
+      x.derived());
 }
 
 /** \returns an expression of the coefficient-wise k0e(\a x) to the given
  * arrays.
-  *
-  * It returns the exponentially scaled modified Bessel
-  * function of the second kind of order zero.
-  *
-  * \param x is the argument
-  *
-  * \note This function supports only float and double scalar types. To support
-  * other scalar types, the user has to provide implementations of k0e(T) for
-  * any scalar type T to be supported.
-  *
-  * \sa ArrayBase::bessel_k0e()
-  */
+ *
+ * It returns the exponentially scaled modified Bessel
+ * function of the second kind of order zero.
+ *
+ * \param x is the argument
+ *
+ * \note This function supports only float and double scalar types. To support
+ * other scalar types, the user has to provide implementations of k0e(T) for
+ * any scalar type T to be supported.
+ *
+ * \sa ArrayBase::bessel_k0e()
+ */
 template <typename Derived>
-EIGEN_STRONG_INLINE const Eigen::CwiseUnaryOp<
-    Eigen::internal::scalar_bessel_k0e_op<typename Derived::Scalar>, const Derived>
-bessel_k0e(const Eigen::ArrayBase<Derived>& x) {
-  return Eigen::CwiseUnaryOp<
-      Eigen::internal::scalar_bessel_k0e_op<typename Derived::Scalar>,
-      const Derived>(x.derived());
+EIGEN_STRONG_INLINE const
+    Eigen::CwiseUnaryOp<Eigen::internal::scalar_bessel_k0e_op<typename Derived::Scalar>, const Derived>
+    bessel_k0e(const Eigen::ArrayBase<Derived>& x) {
+  return Eigen::CwiseUnaryOp<Eigen::internal::scalar_bessel_k0e_op<typename Derived::Scalar>, const Derived>(
+      x.derived());
 }
 
 /** \returns an expression of the coefficient-wise k1(\a x) to the given
  * arrays.
-  *
-  * It returns the modified Bessel function of the second kind of order one.
-  *
-  * \param x is the argument
-  *
-  * \note This function supports only float and double scalar types. To support
-  * other scalar types, the user has to provide implementations of k1(T) for
-  * any scalar type T to be supported.
-  *
-  * \sa ArrayBase::bessel_k1()
-  */
+ *
+ * It returns the modified Bessel function of the second kind of order one.
+ *
+ * \param x is the argument
+ *
+ * \note This function supports only float and double scalar types. To support
+ * other scalar types, the user has to provide implementations of k1(T) for
+ * any scalar type T to be supported.
+ *
+ * \sa ArrayBase::bessel_k1()
+ */
 template <typename Derived>
-EIGEN_STRONG_INLINE const Eigen::CwiseUnaryOp<
-    Eigen::internal::scalar_bessel_k1_op<typename Derived::Scalar>, const Derived>
-bessel_k1(const Eigen::ArrayBase<Derived>& x) {
-  return Eigen::CwiseUnaryOp<
-      Eigen::internal::scalar_bessel_k1_op<typename Derived::Scalar>,
-      const Derived>(x.derived());
+EIGEN_STRONG_INLINE const
+    Eigen::CwiseUnaryOp<Eigen::internal::scalar_bessel_k1_op<typename Derived::Scalar>, const Derived>
+    bessel_k1(const Eigen::ArrayBase<Derived>& x) {
+  return Eigen::CwiseUnaryOp<Eigen::internal::scalar_bessel_k1_op<typename Derived::Scalar>, const Derived>(
+      x.derived());
 }
 
 /** \returns an expression of the coefficient-wise k1e(\a x) to the given
  * arrays.
-  *
-  * It returns the exponentially scaled modified Bessel
-  * function of the second kind of order one.
-  *
-  * \param x is the argument
-  *
-  * \note This function supports only float and double scalar types. To support
-  * other scalar types, the user has to provide implementations of k1e(T) for
-  * any scalar type T to be supported.
-  *
-  * \sa ArrayBase::bessel_k1e()
-  */
+ *
+ * It returns the exponentially scaled modified Bessel
+ * function of the second kind of order one.
+ *
+ * \param x is the argument
+ *
+ * \note This function supports only float and double scalar types. To support
+ * other scalar types, the user has to provide implementations of k1e(T) for
+ * any scalar type T to be supported.
+ *
+ * \sa ArrayBase::bessel_k1e()
+ */
 template <typename Derived>
-EIGEN_STRONG_INLINE const Eigen::CwiseUnaryOp<
-    Eigen::internal::scalar_bessel_k1e_op<typename Derived::Scalar>, const Derived>
-bessel_k1e(const Eigen::ArrayBase<Derived>& x) {
-  return Eigen::CwiseUnaryOp<
-      Eigen::internal::scalar_bessel_k1e_op<typename Derived::Scalar>,
-      const Derived>(x.derived());
+EIGEN_STRONG_INLINE const
+    Eigen::CwiseUnaryOp<Eigen::internal::scalar_bessel_k1e_op<typename Derived::Scalar>, const Derived>
+    bessel_k1e(const Eigen::ArrayBase<Derived>& x) {
+  return Eigen::CwiseUnaryOp<Eigen::internal::scalar_bessel_k1e_op<typename Derived::Scalar>, const Derived>(
+      x.derived());
 }
 
 /** \returns an expression of the coefficient-wise j0(\a x) to the given
  * arrays.
-  *
-  * It returns the Bessel function of the first kind of order zero.
-  *
-  * \param x is the argument
-  *
-  * \note This function supports only float and double scalar types. To support
-  * other scalar types, the user has to provide implementations of j0(T) for
-  * any scalar type T to be supported.
-  *
-  * \sa ArrayBase::bessel_j0()
-  */
+ *
+ * It returns the Bessel function of the first kind of order zero.
+ *
+ * \param x is the argument
+ *
+ * \note This function supports only float and double scalar types. To support
+ * other scalar types, the user has to provide implementations of j0(T) for
+ * any scalar type T to be supported.
+ *
+ * \sa ArrayBase::bessel_j0()
+ */
 template <typename Derived>
-EIGEN_STRONG_INLINE const Eigen::CwiseUnaryOp<
-    Eigen::internal::scalar_bessel_j0_op<typename Derived::Scalar>, const Derived>
-bessel_j0(const Eigen::ArrayBase<Derived>& x) {
-  return Eigen::CwiseUnaryOp<
-      Eigen::internal::scalar_bessel_j0_op<typename Derived::Scalar>,
-      const Derived>(x.derived());
+EIGEN_STRONG_INLINE const
+    Eigen::CwiseUnaryOp<Eigen::internal::scalar_bessel_j0_op<typename Derived::Scalar>, const Derived>
+    bessel_j0(const Eigen::ArrayBase<Derived>& x) {
+  return Eigen::CwiseUnaryOp<Eigen::internal::scalar_bessel_j0_op<typename Derived::Scalar>, const Derived>(
+      x.derived());
 }
 
 /** \returns an expression of the coefficient-wise y0(\a x) to the given
  * arrays.
-  *
-  * It returns the Bessel function of the second kind of order zero.
-  *
-  * \param x is the argument
-  *
-  * \note This function supports only float and double scalar types. To support
-  * other scalar types, the user has to provide implementations of y0(T) for
-  * any scalar type T to be supported.
-  *
-  * \sa ArrayBase::bessel_y0()
-  */
+ *
+ * It returns the Bessel function of the second kind of order zero.
+ *
+ * \param x is the argument
+ *
+ * \note This function supports only float and double scalar types. To support
+ * other scalar types, the user has to provide implementations of y0(T) for
+ * any scalar type T to be supported.
+ *
+ * \sa ArrayBase::bessel_y0()
+ */
 template <typename Derived>
-EIGEN_STRONG_INLINE const Eigen::CwiseUnaryOp<
-    Eigen::internal::scalar_bessel_y0_op<typename Derived::Scalar>, const Derived>
-bessel_y0(const Eigen::ArrayBase<Derived>& x) {
-  return Eigen::CwiseUnaryOp<
-      Eigen::internal::scalar_bessel_y0_op<typename Derived::Scalar>,
-      const Derived>(x.derived());
+EIGEN_STRONG_INLINE const
+    Eigen::CwiseUnaryOp<Eigen::internal::scalar_bessel_y0_op<typename Derived::Scalar>, const Derived>
+    bessel_y0(const Eigen::ArrayBase<Derived>& x) {
+  return Eigen::CwiseUnaryOp<Eigen::internal::scalar_bessel_y0_op<typename Derived::Scalar>, const Derived>(
+      x.derived());
 }
 
 /** \returns an expression of the coefficient-wise j1(\a x) to the given
  * arrays.
-  *
-  * It returns the modified Bessel function of the first kind of order one.
-  *
-  * \param x is the argument
-  *
-  * \note This function supports only float and double scalar types. To support
-  * other scalar types, the user has to provide implementations of j1(T) for
-  * any scalar type T to be supported.
-  *
-  * \sa ArrayBase::bessel_j1()
-  */
+ *
+ * It returns the modified Bessel function of the first kind of order one.
+ *
+ * \param x is the argument
+ *
+ * \note This function supports only float and double scalar types. To support
+ * other scalar types, the user has to provide implementations of j1(T) for
+ * any scalar type T to be supported.
+ *
+ * \sa ArrayBase::bessel_j1()
+ */
 template <typename Derived>
-EIGEN_STRONG_INLINE const Eigen::CwiseUnaryOp<
-    Eigen::internal::scalar_bessel_j1_op<typename Derived::Scalar>, const Derived>
-bessel_j1(const Eigen::ArrayBase<Derived>& x) {
-  return Eigen::CwiseUnaryOp<
-      Eigen::internal::scalar_bessel_j1_op<typename Derived::Scalar>,
-      const Derived>(x.derived());
+EIGEN_STRONG_INLINE const
+    Eigen::CwiseUnaryOp<Eigen::internal::scalar_bessel_j1_op<typename Derived::Scalar>, const Derived>
+    bessel_j1(const Eigen::ArrayBase<Derived>& x) {
+  return Eigen::CwiseUnaryOp<Eigen::internal::scalar_bessel_j1_op<typename Derived::Scalar>, const Derived>(
+      x.derived());
 }
 
 /** \returns an expression of the coefficient-wise y1(\a x) to the given
  * arrays.
-  *
-  * It returns the Bessel function of the second kind of order one.
-  *
-  * \param x is the argument
-  *
-  * \note This function supports only float and double scalar types. To support
-  * other scalar types, the user has to provide implementations of y1(T) for
-  * any scalar type T to be supported.
-  *
-  * \sa ArrayBase::bessel_y1()
-  */
+ *
+ * It returns the Bessel function of the second kind of order one.
+ *
+ * \param x is the argument
+ *
+ * \note This function supports only float and double scalar types. To support
+ * other scalar types, the user has to provide implementations of y1(T) for
+ * any scalar type T to be supported.
+ *
+ * \sa ArrayBase::bessel_y1()
+ */
 template <typename Derived>
-EIGEN_STRONG_INLINE const Eigen::CwiseUnaryOp<
-    Eigen::internal::scalar_bessel_y1_op<typename Derived::Scalar>, const Derived>
-bessel_y1(const Eigen::ArrayBase<Derived>& x) {
-  return Eigen::CwiseUnaryOp<
-      Eigen::internal::scalar_bessel_y1_op<typename Derived::Scalar>,
-      const Derived>(x.derived());
+EIGEN_STRONG_INLINE const
+    Eigen::CwiseUnaryOp<Eigen::internal::scalar_bessel_y1_op<typename Derived::Scalar>, const Derived>
+    bessel_y1(const Eigen::ArrayBase<Derived>& x) {
+  return Eigen::CwiseUnaryOp<Eigen::internal::scalar_bessel_y1_op<typename Derived::Scalar>, const Derived>(
+      x.derived());
 }
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_BESSELFUNCTIONS_ARRAYAPI_H
+#endif  // EIGEN_BESSELFUNCTIONS_ARRAYAPI_H
diff --git a/unsupported/Eigen/src/SpecialFunctions/BesselFunctionsFunctors.h b/unsupported/Eigen/src/SpecialFunctions/BesselFunctionsFunctors.h
index da7a22a..d877417 100644
--- a/unsupported/Eigen/src/SpecialFunctions/BesselFunctionsFunctors.h
+++ b/unsupported/Eigen/src/SpecialFunctions/BesselFunctionsFunctors.h
@@ -30,9 +30,7 @@
     return bessel_i0(x);
   }
   typedef typename packet_traits<Scalar>::type Packet;
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const {
-    return internal::pbessel_i0(x);
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const { return internal::pbessel_i0(x); }
 };
 template <typename Scalar>
 struct functor_traits<scalar_bessel_i0_op<Scalar> > {
@@ -57,9 +55,7 @@
     return bessel_i0e(x);
   }
   typedef typename packet_traits<Scalar>::type Packet;
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const {
-    return internal::pbessel_i0e(x);
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const { return internal::pbessel_i0e(x); }
 };
 template <typename Scalar>
 struct functor_traits<scalar_bessel_i0e_op<Scalar> > {
@@ -83,9 +79,7 @@
     return bessel_i1(x);
   }
   typedef typename packet_traits<Scalar>::type Packet;
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const {
-    return internal::pbessel_i1(x);
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const { return internal::pbessel_i1(x); }
 };
 template <typename Scalar>
 struct functor_traits<scalar_bessel_i1_op<Scalar> > {
@@ -110,9 +104,7 @@
     return bessel_i1e(x);
   }
   typedef typename packet_traits<Scalar>::type Packet;
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const {
-    return internal::pbessel_i1e(x);
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const { return internal::pbessel_i1e(x); }
 };
 template <typename Scalar>
 struct functor_traits<scalar_bessel_i1e_op<Scalar> > {
@@ -136,9 +128,7 @@
     return bessel_j0(x);
   }
   typedef typename packet_traits<Scalar>::type Packet;
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const {
-    return internal::pbessel_j0(x);
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const { return internal::pbessel_j0(x); }
 };
 template <typename Scalar>
 struct functor_traits<scalar_bessel_j0_op<Scalar> > {
@@ -163,9 +153,7 @@
     return bessel_y0(x);
   }
   typedef typename packet_traits<Scalar>::type Packet;
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const {
-    return internal::pbessel_y0(x);
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const { return internal::pbessel_y0(x); }
 };
 template <typename Scalar>
 struct functor_traits<scalar_bessel_y0_op<Scalar> > {
@@ -190,9 +178,7 @@
     return bessel_j1(x);
   }
   typedef typename packet_traits<Scalar>::type Packet;
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const {
-    return internal::pbessel_j1(x);
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const { return internal::pbessel_j1(x); }
 };
 template <typename Scalar>
 struct functor_traits<scalar_bessel_j1_op<Scalar> > {
@@ -217,9 +203,7 @@
     return bessel_y1(x);
   }
   typedef typename packet_traits<Scalar>::type Packet;
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const {
-    return internal::pbessel_y1(x);
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const { return internal::pbessel_y1(x); }
 };
 template <typename Scalar>
 struct functor_traits<scalar_bessel_y1_op<Scalar> > {
@@ -244,9 +228,7 @@
     return bessel_k0(x);
   }
   typedef typename packet_traits<Scalar>::type Packet;
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const {
-    return internal::pbessel_k0(x);
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const { return internal::pbessel_k0(x); }
 };
 template <typename Scalar>
 struct functor_traits<scalar_bessel_k0_op<Scalar> > {
@@ -271,9 +253,7 @@
     return bessel_k0e(x);
   }
   typedef typename packet_traits<Scalar>::type Packet;
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const {
-    return internal::pbessel_k0e(x);
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const { return internal::pbessel_k0e(x); }
 };
 template <typename Scalar>
 struct functor_traits<scalar_bessel_k0e_op<Scalar> > {
@@ -298,9 +278,7 @@
     return bessel_k1(x);
   }
   typedef typename packet_traits<Scalar>::type Packet;
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const {
-    return internal::pbessel_k1(x);
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const { return internal::pbessel_k1(x); }
 };
 template <typename Scalar>
 struct functor_traits<scalar_bessel_k1_op<Scalar> > {
@@ -325,9 +303,7 @@
     return bessel_k1e(x);
   }
   typedef typename packet_traits<Scalar>::type Packet;
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const {
-    return internal::pbessel_k1e(x);
-  }
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const { return internal::pbessel_k1e(x); }
 };
 template <typename Scalar>
 struct functor_traits<scalar_bessel_k1e_op<Scalar> > {
@@ -340,9 +316,8 @@
   };
 };
 
+}  // end namespace internal
 
-} // end namespace internal
+}  // end namespace Eigen
 
-} // end namespace Eigen
-
-#endif // EIGEN_BESSELFUNCTIONS_FUNCTORS_H
+#endif  // EIGEN_BESSELFUNCTIONS_FUNCTORS_H
diff --git a/unsupported/Eigen/src/SpecialFunctions/BesselFunctionsImpl.h b/unsupported/Eigen/src/SpecialFunctions/BesselFunctionsImpl.h
index 166b1da..59bdaf1 100644
--- a/unsupported/Eigen/src/SpecialFunctions/BesselFunctionsImpl.h
+++ b/unsupported/Eigen/src/SpecialFunctions/BesselFunctionsImpl.h
@@ -39,7 +39,6 @@
 //    Good luck with your project,
 //    Steve
 
-
 /****************************************************************************
  * Implementation of Bessel function, based on Cephes                       *
  ****************************************************************************/
@@ -51,18 +50,14 @@
 
 template <typename T, typename ScalarType = typename unpacket_traits<T>::type>
 struct generic_i0e {
-  EIGEN_STATIC_ASSERT((internal::is_same<T, T>::value == false),
-                      THIS_TYPE_IS_NOT_SUPPORTED)
+  EIGEN_STATIC_ASSERT((internal::is_same<T, T>::value == false), THIS_TYPE_IS_NOT_SUPPORTED)
 
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T&) {
-    return ScalarType(0);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T&) { return ScalarType(0); }
 };
 
 template <typename T>
 struct generic_i0e<T, float> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T& x) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T& x) {
     /*  i0ef.c
      *
      *  Modified Bessel function of order zero,
@@ -96,27 +91,19 @@
      *
      */
 
-    const float A[] = {-1.30002500998624804212E-8f, 6.04699502254191894932E-8f,
-                       -2.67079385394061173391E-7f, 1.11738753912010371815E-6f,
-                       -4.41673835845875056359E-6f, 1.64484480707288970893E-5f,
-                       -5.75419501008210370398E-5f, 1.88502885095841655729E-4f,
-                       -5.76375574538582365885E-4f, 1.63947561694133579842E-3f,
-                       -4.32430999505057594430E-3f, 1.05464603945949983183E-2f,
-                       -2.37374148058994688156E-2f, 4.93052842396707084878E-2f,
-                       -9.49010970480476444210E-2f, 1.71620901522208775349E-1f,
-                       -3.04682672343198398683E-1f, 6.76795274409476084995E-1f};
+    const float A[] = {-1.30002500998624804212E-8f, 6.04699502254191894932E-8f,  -2.67079385394061173391E-7f,
+                       1.11738753912010371815E-6f,  -4.41673835845875056359E-6f, 1.64484480707288970893E-5f,
+                       -5.75419501008210370398E-5f, 1.88502885095841655729E-4f,  -5.76375574538582365885E-4f,
+                       1.63947561694133579842E-3f,  -4.32430999505057594430E-3f, 1.05464603945949983183E-2f,
+                       -2.37374148058994688156E-2f, 4.93052842396707084878E-2f,  -9.49010970480476444210E-2f,
+                       1.71620901522208775349E-1f,  -3.04682672343198398683E-1f, 6.76795274409476084995E-1f};
 
-    const float B[] = {3.39623202570838634515E-9f, 2.26666899049817806459E-8f,
-                       2.04891858946906374183E-7f, 2.89137052083475648297E-6f,
-                       6.88975834691682398426E-5f, 3.36911647825569408990E-3f,
+    const float B[] = {3.39623202570838634515E-9f, 2.26666899049817806459E-8f, 2.04891858946906374183E-7f,
+                       2.89137052083475648297E-6f, 6.88975834691682398426E-5f, 3.36911647825569408990E-3f,
                        8.04490411014108831608E-1f};
     T y = pabs(x);
-    T y_le_eight = internal::pchebevl<T, 18>::run(
-        pmadd(pset1<T>(0.5f), y, pset1<T>(-2.0f)), A);
-    T y_gt_eight = pmul(
-        internal::pchebevl<T, 7>::run(
-            psub(pdiv(pset1<T>(32.0f), y), pset1<T>(2.0f)), B),
-        prsqrt(y));
+    T y_le_eight = internal::pchebevl<T, 18>::run(pmadd(pset1<T>(0.5f), y, pset1<T>(-2.0f)), A);
+    T y_gt_eight = pmul(internal::pchebevl<T, 7>::run(psub(pdiv(pset1<T>(32.0f), y), pset1<T>(2.0f)), B), prsqrt(y));
     // TODO: Perhaps instead check whether all packet elements are in
     // [-8, 8] and evaluate a branch based off of that. It's possible
     // in practice most elements are in this region.
@@ -126,8 +113,7 @@
 
 template <typename T>
 struct generic_i0e<T, double> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T& x) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T& x) {
     /*  i0e.c
      *
      *  Modified Bessel function of order zero,
@@ -161,42 +147,28 @@
      *
      */
 
-    const double A[] = {-4.41534164647933937950E-18, 3.33079451882223809783E-17,
-                        -2.43127984654795469359E-16, 1.71539128555513303061E-15,
-                        -1.16853328779934516808E-14, 7.67618549860493561688E-14,
-                        -4.85644678311192946090E-13, 2.95505266312963983461E-12,
-                        -1.72682629144155570723E-11, 9.67580903537323691224E-11,
-                        -5.18979560163526290666E-10, 2.65982372468238665035E-9,
-                        -1.30002500998624804212E-8,  6.04699502254191894932E-8,
-                        -2.67079385394061173391E-7,  1.11738753912010371815E-6,
-                        -4.41673835845875056359E-6,  1.64484480707288970893E-5,
-                        -5.75419501008210370398E-5,  1.88502885095841655729E-4,
-                        -5.76375574538582365885E-4,  1.63947561694133579842E-3,
-                        -4.32430999505057594430E-3,  1.05464603945949983183E-2,
-                        -2.37374148058994688156E-2,  4.93052842396707084878E-2,
-                        -9.49010970480476444210E-2,  1.71620901522208775349E-1,
-                        -3.04682672343198398683E-1,  6.76795274409476084995E-1};
-    const double B[] = {
-        -7.23318048787475395456E-18, -4.83050448594418207126E-18,
-        4.46562142029675999901E-17,  3.46122286769746109310E-17,
-        -2.82762398051658348494E-16, -3.42548561967721913462E-16,
-        1.77256013305652638360E-15,  3.81168066935262242075E-15,
-        -9.55484669882830764870E-15, -4.15056934728722208663E-14,
-        1.54008621752140982691E-14,  3.85277838274214270114E-13,
-        7.18012445138366623367E-13,  -1.79417853150680611778E-12,
-        -1.32158118404477131188E-11, -3.14991652796324136454E-11,
-        1.18891471078464383424E-11,  4.94060238822496958910E-10,
-        3.39623202570838634515E-9,   2.26666899049817806459E-8,
-        2.04891858946906374183E-7,   2.89137052083475648297E-6,
-        6.88975834691682398426E-5,   3.36911647825569408990E-3,
-        8.04490411014108831608E-1};
+    const double A[] = {-4.41534164647933937950E-18, 3.33079451882223809783E-17,  -2.43127984654795469359E-16,
+                        1.71539128555513303061E-15,  -1.16853328779934516808E-14, 7.67618549860493561688E-14,
+                        -4.85644678311192946090E-13, 2.95505266312963983461E-12,  -1.72682629144155570723E-11,
+                        9.67580903537323691224E-11,  -5.18979560163526290666E-10, 2.65982372468238665035E-9,
+                        -1.30002500998624804212E-8,  6.04699502254191894932E-8,   -2.67079385394061173391E-7,
+                        1.11738753912010371815E-6,   -4.41673835845875056359E-6,  1.64484480707288970893E-5,
+                        -5.75419501008210370398E-5,  1.88502885095841655729E-4,   -5.76375574538582365885E-4,
+                        1.63947561694133579842E-3,   -4.32430999505057594430E-3,  1.05464603945949983183E-2,
+                        -2.37374148058994688156E-2,  4.93052842396707084878E-2,   -9.49010970480476444210E-2,
+                        1.71620901522208775349E-1,   -3.04682672343198398683E-1,  6.76795274409476084995E-1};
+    const double B[] = {-7.23318048787475395456E-18, -4.83050448594418207126E-18, 4.46562142029675999901E-17,
+                        3.46122286769746109310E-17,  -2.82762398051658348494E-16, -3.42548561967721913462E-16,
+                        1.77256013305652638360E-15,  3.81168066935262242075E-15,  -9.55484669882830764870E-15,
+                        -4.15056934728722208663E-14, 1.54008621752140982691E-14,  3.85277838274214270114E-13,
+                        7.18012445138366623367E-13,  -1.79417853150680611778E-12, -1.32158118404477131188E-11,
+                        -3.14991652796324136454E-11, 1.18891471078464383424E-11,  4.94060238822496958910E-10,
+                        3.39623202570838634515E-9,   2.26666899049817806459E-8,   2.04891858946906374183E-7,
+                        2.89137052083475648297E-6,   6.88975834691682398426E-5,   3.36911647825569408990E-3,
+                        8.04490411014108831608E-1};
     T y = pabs(x);
-    T y_le_eight = internal::pchebevl<T, 30>::run(
-        pmadd(pset1<T>(0.5), y, pset1<T>(-2.0)), A);
-    T y_gt_eight = pmul(
-        internal::pchebevl<T, 25>::run(
-            psub(pdiv(pset1<T>(32.0), y), pset1<T>(2.0)), B),
-        prsqrt(y));
+    T y_le_eight = internal::pchebevl<T, 30>::run(pmadd(pset1<T>(0.5), y, pset1<T>(-2.0)), A);
+    T y_gt_eight = pmul(internal::pchebevl<T, 25>::run(psub(pdiv(pset1<T>(32.0), y), pset1<T>(2.0)), B), prsqrt(y));
     // TODO: Perhaps instead check whether all packet elements are in
     // [-8, 8] and evaluate a branch based off of that. It's possible
     // in practice most elements are in this region.
@@ -206,10 +178,7 @@
 
 template <typename T>
 struct bessel_i0e_impl {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T x) {
-    return generic_i0e<T>::run(x);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T x) { return generic_i0e<T>::run(x); }
 };
 
 template <typename Scalar>
@@ -219,20 +188,14 @@
 
 template <typename T, typename ScalarType = typename unpacket_traits<T>::type>
 struct generic_i0 {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T& x) {
-    return pmul(
-        pexp(pabs(x)),
-        generic_i0e<T, ScalarType>::run(x));
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T& x) {
+    return pmul(pexp(pabs(x)), generic_i0e<T, ScalarType>::run(x));
   }
 };
 
 template <typename T>
 struct bessel_i0_impl {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T x) {
-    return generic_i0<T>::run(x);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T x) { return generic_i0<T>::run(x); }
 };
 
 template <typename Scalar>
@@ -240,20 +203,16 @@
   typedef Scalar type;
 };
 
-template <typename T, typename ScalarType = typename unpacket_traits<T>::type >
+template <typename T, typename ScalarType = typename unpacket_traits<T>::type>
 struct generic_i1e {
-  EIGEN_STATIC_ASSERT((internal::is_same<T, T>::value == false),
-                      THIS_TYPE_IS_NOT_SUPPORTED)
+  EIGEN_STATIC_ASSERT((internal::is_same<T, T>::value == false), THIS_TYPE_IS_NOT_SUPPORTED)
 
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T&) {
-    return ScalarType(0);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T&) { return ScalarType(0); }
 };
 
 template <typename T>
 struct generic_i1e<T, float> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T& x) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T& x) {
     /* i1ef.c
      *
      *  Modified Bessel function of order one,
@@ -286,30 +245,20 @@
      * See i1().
      *
      */
-    const float A[] = {9.38153738649577178388E-9f, -4.44505912879632808065E-8f,
-                       2.00329475355213526229E-7f, -8.56872026469545474066E-7f,
-                       3.47025130813767847674E-6f, -1.32731636560394358279E-5f,
-                       4.78156510755005422638E-5f, -1.61760815825896745588E-4f,
-                       5.12285956168575772895E-4f, -1.51357245063125314899E-3f,
-                       4.15642294431288815669E-3f, -1.05640848946261981558E-2f,
-                       2.47264490306265168283E-2f, -5.29459812080949914269E-2f,
-                       1.02643658689847095384E-1f, -1.76416518357834055153E-1f,
-                       2.52587186443633654823E-1f};
+    const float A[] = {9.38153738649577178388E-9f,  -4.44505912879632808065E-8f, 2.00329475355213526229E-7f,
+                       -8.56872026469545474066E-7f, 3.47025130813767847674E-6f,  -1.32731636560394358279E-5f,
+                       4.78156510755005422638E-5f,  -1.61760815825896745588E-4f, 5.12285956168575772895E-4f,
+                       -1.51357245063125314899E-3f, 4.15642294431288815669E-3f,  -1.05640848946261981558E-2f,
+                       2.47264490306265168283E-2f,  -5.29459812080949914269E-2f, 1.02643658689847095384E-1f,
+                       -1.76416518357834055153E-1f, 2.52587186443633654823E-1f};
 
-    const float B[] = {-3.83538038596423702205E-9f, -2.63146884688951950684E-8f,
-                       -2.51223623787020892529E-7f, -3.88256480887769039346E-6f,
-                       -1.10588938762623716291E-4f, -9.76109749136146840777E-3f,
+    const float B[] = {-3.83538038596423702205E-9f, -2.63146884688951950684E-8f, -2.51223623787020892529E-7f,
+                       -3.88256480887769039346E-6f, -1.10588938762623716291E-4f, -9.76109749136146840777E-3f,
                        7.78576235018280120474E-1f};
 
-
     T y = pabs(x);
-    T y_le_eight = pmul(y, internal::pchebevl<T, 17>::run(
-        pmadd(pset1<T>(0.5f), y, pset1<T>(-2.0f)), A));
-    T y_gt_eight = pmul(
-        internal::pchebevl<T, 7>::run(
-            psub(pdiv(pset1<T>(32.0f), y),
-                 pset1<T>(2.0f)), B),
-        prsqrt(y));
+    T y_le_eight = pmul(y, internal::pchebevl<T, 17>::run(pmadd(pset1<T>(0.5f), y, pset1<T>(-2.0f)), A));
+    T y_gt_eight = pmul(internal::pchebevl<T, 7>::run(psub(pdiv(pset1<T>(32.0f), y), pset1<T>(2.0f)), B), prsqrt(y));
     // TODO: Perhaps instead check whether all packet elements are in
     // [-8, 8] and evaluate a branch based off of that. It's possible
     // in practice most elements are in this region.
@@ -320,8 +269,7 @@
 
 template <typename T>
 struct generic_i1e<T, double> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T& x) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T& x) {
     /*  i1e.c
      *
      *  Modified Bessel function of order one,
@@ -354,43 +302,28 @@
      * See i1().
      *
      */
-    const double A[] = {2.77791411276104639959E-18, -2.11142121435816608115E-17,
-                        1.55363195773620046921E-16, -1.10559694773538630805E-15,
-                        7.60068429473540693410E-15, -5.04218550472791168711E-14,
-                        3.22379336594557470981E-13, -1.98397439776494371520E-12,
-                        1.17361862988909016308E-11, -6.66348972350202774223E-11,
-                        3.62559028155211703701E-10, -1.88724975172282928790E-9,
-                        9.38153738649577178388E-9,  -4.44505912879632808065E-8,
-                        2.00329475355213526229E-7,  -8.56872026469545474066E-7,
-                        3.47025130813767847674E-6,  -1.32731636560394358279E-5,
-                        4.78156510755005422638E-5,  -1.61760815825896745588E-4,
-                        5.12285956168575772895E-4,  -1.51357245063125314899E-3,
-                        4.15642294431288815669E-3,  -1.05640848946261981558E-2,
-                        2.47264490306265168283E-2,  -5.29459812080949914269E-2,
-                        1.02643658689847095384E-1,  -1.76416518357834055153E-1,
-                        2.52587186443633654823E-1};
-    const double B[] = {
-        7.51729631084210481353E-18,  4.41434832307170791151E-18,
-        -4.65030536848935832153E-17, -3.20952592199342395980E-17,
-        2.96262899764595013876E-16,  3.30820231092092828324E-16,
-        -1.88035477551078244854E-15, -3.81440307243700780478E-15,
-        1.04202769841288027642E-14,  4.27244001671195135429E-14,
-        -2.10154184277266431302E-14, -4.08355111109219731823E-13,
-        -7.19855177624590851209E-13, 2.03562854414708950722E-12,
-        1.41258074366137813316E-11,  3.25260358301548823856E-11,
-        -1.89749581235054123450E-11, -5.58974346219658380687E-10,
-        -3.83538038596423702205E-9,  -2.63146884688951950684E-8,
-        -2.51223623787020892529E-7,  -3.88256480887769039346E-6,
-        -1.10588938762623716291E-4,  -9.76109749136146840777E-3,
-        7.78576235018280120474E-1};
+    const double A[] = {2.77791411276104639959E-18,  -2.11142121435816608115E-17, 1.55363195773620046921E-16,
+                        -1.10559694773538630805E-15, 7.60068429473540693410E-15,  -5.04218550472791168711E-14,
+                        3.22379336594557470981E-13,  -1.98397439776494371520E-12, 1.17361862988909016308E-11,
+                        -6.66348972350202774223E-11, 3.62559028155211703701E-10,  -1.88724975172282928790E-9,
+                        9.38153738649577178388E-9,   -4.44505912879632808065E-8,  2.00329475355213526229E-7,
+                        -8.56872026469545474066E-7,  3.47025130813767847674E-6,   -1.32731636560394358279E-5,
+                        4.78156510755005422638E-5,   -1.61760815825896745588E-4,  5.12285956168575772895E-4,
+                        -1.51357245063125314899E-3,  4.15642294431288815669E-3,   -1.05640848946261981558E-2,
+                        2.47264490306265168283E-2,   -5.29459812080949914269E-2,  1.02643658689847095384E-1,
+                        -1.76416518357834055153E-1,  2.52587186443633654823E-1};
+    const double B[] = {7.51729631084210481353E-18,  4.41434832307170791151E-18,  -4.65030536848935832153E-17,
+                        -3.20952592199342395980E-17, 2.96262899764595013876E-16,  3.30820231092092828324E-16,
+                        -1.88035477551078244854E-15, -3.81440307243700780478E-15, 1.04202769841288027642E-14,
+                        4.27244001671195135429E-14,  -2.10154184277266431302E-14, -4.08355111109219731823E-13,
+                        -7.19855177624590851209E-13, 2.03562854414708950722E-12,  1.41258074366137813316E-11,
+                        3.25260358301548823856E-11,  -1.89749581235054123450E-11, -5.58974346219658380687E-10,
+                        -3.83538038596423702205E-9,  -2.63146884688951950684E-8,  -2.51223623787020892529E-7,
+                        -3.88256480887769039346E-6,  -1.10588938762623716291E-4,  -9.76109749136146840777E-3,
+                        7.78576235018280120474E-1};
     T y = pabs(x);
-    T y_le_eight = pmul(y, internal::pchebevl<T, 29>::run(
-        pmadd(pset1<T>(0.5), y, pset1<T>(-2.0)), A));
-    T y_gt_eight = pmul(
-        internal::pchebevl<T, 25>::run(
-            psub(pdiv(pset1<T>(32.0), y),
-                 pset1<T>(2.0)), B),
-        prsqrt(y));
+    T y_le_eight = pmul(y, internal::pchebevl<T, 29>::run(pmadd(pset1<T>(0.5), y, pset1<T>(-2.0)), A));
+    T y_gt_eight = pmul(internal::pchebevl<T, 25>::run(psub(pdiv(pset1<T>(32.0), y), pset1<T>(2.0)), B), prsqrt(y));
     // TODO: Perhaps instead check whether all packet elements are in
     // [-8, 8] and evaluate a branch based off of that. It's possible
     // in practice most elements are in this region.
@@ -401,10 +334,7 @@
 
 template <typename T>
 struct bessel_i1e_impl {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T x) {
-    return generic_i1e<T>::run(x);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T x) { return generic_i1e<T>::run(x); }
 };
 
 template <typename T>
@@ -414,20 +344,14 @@
 
 template <typename T, typename ScalarType = typename unpacket_traits<T>::type>
 struct generic_i1 {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T& x) {
-    return pmul(
-        pexp(pabs(x)),
-        generic_i1e<T, ScalarType>::run(x));
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T& x) {
+    return pmul(pexp(pabs(x)), generic_i1e<T, ScalarType>::run(x));
   }
 };
 
 template <typename T>
 struct bessel_i1_impl {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T x) {
-    return generic_i1<T>::run(x);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T x) { return generic_i1<T>::run(x); }
 };
 
 template <typename T>
@@ -437,18 +361,14 @@
 
 template <typename T, typename ScalarType = typename unpacket_traits<T>::type>
 struct generic_k0e {
-  EIGEN_STATIC_ASSERT((internal::is_same<T, T>::value == false),
-                      THIS_TYPE_IS_NOT_SUPPORTED)
+  EIGEN_STATIC_ASSERT((internal::is_same<T, T>::value == false), THIS_TYPE_IS_NOT_SUPPORTED)
 
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T&) {
-    return ScalarType(0);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T&) { return ScalarType(0); }
 };
 
 template <typename T>
 struct generic_k0e<T, float> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T& x) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T& x) {
     /*  k0ef.c
      *	Modified Bessel function, third kind, order zero,
      *	exponentially scaled
@@ -479,39 +399,27 @@
      *
      */
 
-    const float A[] = {1.90451637722020886025E-9f, 2.53479107902614945675E-7f,
-                       2.28621210311945178607E-5f, 1.26461541144692592338E-3f,
-                       3.59799365153615016266E-2f, 3.44289899924628486886E-1f,
+    const float A[] = {1.90451637722020886025E-9f, 2.53479107902614945675E-7f, 2.28621210311945178607E-5f,
+                       1.26461541144692592338E-3f, 3.59799365153615016266E-2f, 3.44289899924628486886E-1f,
                        -5.35327393233902768720E-1f};
 
-    const float B[] = {-1.69753450938905987466E-9f, 8.57403401741422608519E-9f,
-                       -4.66048989768794782956E-8f, 2.76681363944501510342E-7f,
-                       -1.83175552271911948767E-6f, 1.39498137188764993662E-5f,
-                       -1.28495495816278026384E-4f, 1.56988388573005337491E-3f,
-                       -3.14481013119645005427E-2f, 2.44030308206595545468E0f};
+    const float B[] = {-1.69753450938905987466E-9f, 8.57403401741422608519E-9f,  -4.66048989768794782956E-8f,
+                       2.76681363944501510342E-7f,  -1.83175552271911948767E-6f, 1.39498137188764993662E-5f,
+                       -1.28495495816278026384E-4f, 1.56988388573005337491E-3f,  -3.14481013119645005427E-2f,
+                       2.44030308206595545468E0f};
     const T MAXNUM = pset1<T>(NumTraits<float>::infinity());
     const T two = pset1<T>(2.0);
-    T x_le_two = internal::pchebevl<T, 7>::run(
-        pmadd(x, x, pset1<T>(-2.0)), A);
-    x_le_two = pmadd(
-        generic_i0<T, float>::run(x), pnegate(
-            plog(pmul(pset1<T>(0.5), x))), x_le_two);
+    T x_le_two = internal::pchebevl<T, 7>::run(pmadd(x, x, pset1<T>(-2.0)), A);
+    x_le_two = pmadd(generic_i0<T, float>::run(x), pnegate(plog(pmul(pset1<T>(0.5), x))), x_le_two);
     x_le_two = pmul(pexp(x), x_le_two);
-    T x_gt_two = pmul(
-            internal::pchebevl<T, 10>::run(
-                psub(pdiv(pset1<T>(8.0), x), two), B),
-            prsqrt(x));
-    return pselect(
-        pcmp_le(x, pset1<T>(0.0)),
-        MAXNUM,
-        pselect(pcmp_le(x, two), x_le_two, x_gt_two));
+    T x_gt_two = pmul(internal::pchebevl<T, 10>::run(psub(pdiv(pset1<T>(8.0), x), two), B), prsqrt(x));
+    return pselect(pcmp_le(x, pset1<T>(0.0)), MAXNUM, pselect(pcmp_le(x, two), x_le_two, x_gt_two));
   }
 };
 
 template <typename T>
 struct generic_k0e<T, double> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T& x) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T& x) {
     /*  k0e.c
      *	Modified Bessel function, third kind, order zero,
      *	exponentially scaled
@@ -542,55 +450,33 @@
      *
      */
 
-    const double A[] = {
-      1.37446543561352307156E-16,
-      4.25981614279661018399E-14,
-      1.03496952576338420167E-11,
-      1.90451637722020886025E-9,
-      2.53479107902614945675E-7,
-      2.28621210311945178607E-5,
-      1.26461541144692592338E-3,
-      3.59799365153615016266E-2,
-      3.44289899924628486886E-1,
-      -5.35327393233902768720E-1};
-    const double B[] = {
-       5.30043377268626276149E-18, -1.64758043015242134646E-17,
-       5.21039150503902756861E-17, -1.67823109680541210385E-16,
-       5.51205597852431940784E-16, -1.84859337734377901440E-15,
-       6.34007647740507060557E-15, -2.22751332699166985548E-14,
-       8.03289077536357521100E-14, -2.98009692317273043925E-13,
-       1.14034058820847496303E-12, -4.51459788337394416547E-12,
-       1.85594911495471785253E-11, -7.95748924447710747776E-11,
-       3.57739728140030116597E-10, -1.69753450938905987466E-9,
-       8.57403401741422608519E-9, -4.66048989768794782956E-8,
-       2.76681363944501510342E-7, -1.83175552271911948767E-6,
-       1.39498137188764993662E-5, -1.28495495816278026384E-4,
-       1.56988388573005337491E-3, -3.14481013119645005427E-2,
-       2.44030308206595545468E0
-    };
+    const double A[] = {1.37446543561352307156E-16, 4.25981614279661018399E-14, 1.03496952576338420167E-11,
+                        1.90451637722020886025E-9,  2.53479107902614945675E-7,  2.28621210311945178607E-5,
+                        1.26461541144692592338E-3,  3.59799365153615016266E-2,  3.44289899924628486886E-1,
+                        -5.35327393233902768720E-1};
+    const double B[] = {5.30043377268626276149E-18,  -1.64758043015242134646E-17, 5.21039150503902756861E-17,
+                        -1.67823109680541210385E-16, 5.51205597852431940784E-16,  -1.84859337734377901440E-15,
+                        6.34007647740507060557E-15,  -2.22751332699166985548E-14, 8.03289077536357521100E-14,
+                        -2.98009692317273043925E-13, 1.14034058820847496303E-12,  -4.51459788337394416547E-12,
+                        1.85594911495471785253E-11,  -7.95748924447710747776E-11, 3.57739728140030116597E-10,
+                        -1.69753450938905987466E-9,  8.57403401741422608519E-9,   -4.66048989768794782956E-8,
+                        2.76681363944501510342E-7,   -1.83175552271911948767E-6,  1.39498137188764993662E-5,
+                        -1.28495495816278026384E-4,  1.56988388573005337491E-3,   -3.14481013119645005427E-2,
+                        2.44030308206595545468E0};
     const T MAXNUM = pset1<T>(NumTraits<double>::infinity());
     const T two = pset1<T>(2.0);
-    T x_le_two = internal::pchebevl<T, 10>::run(
-        pmadd(x, x, pset1<T>(-2.0)), A);
-    x_le_two = pmadd(
-        generic_i0<T, double>::run(x), pmul(
-            pset1<T>(-1.0), plog(pmul(pset1<T>(0.5), x))), x_le_two);
+    T x_le_two = internal::pchebevl<T, 10>::run(pmadd(x, x, pset1<T>(-2.0)), A);
+    x_le_two = pmadd(generic_i0<T, double>::run(x), pmul(pset1<T>(-1.0), plog(pmul(pset1<T>(0.5), x))), x_le_two);
     x_le_two = pmul(pexp(x), x_le_two);
     x_le_two = pselect(pcmp_le(x, pset1<T>(0.0)), MAXNUM, x_le_two);
-    T x_gt_two = pmul(
-            internal::pchebevl<T, 25>::run(
-                psub(pdiv(pset1<T>(8.0), x), two), B),
-            prsqrt(x));
+    T x_gt_two = pmul(internal::pchebevl<T, 25>::run(psub(pdiv(pset1<T>(8.0), x), two), B), prsqrt(x));
     return pselect(pcmp_le(x, two), x_le_two, x_gt_two);
   }
 };
 
 template <typename T>
 struct bessel_k0e_impl {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T x) {
-    return generic_k0e<T>::run(x);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T x) { return generic_k0e<T>::run(x); }
 };
 
 template <typename T>
@@ -600,18 +486,14 @@
 
 template <typename T, typename ScalarType = typename unpacket_traits<T>::type>
 struct generic_k0 {
-  EIGEN_STATIC_ASSERT((internal::is_same<T, T>::value == false),
-                      THIS_TYPE_IS_NOT_SUPPORTED)
+  EIGEN_STATIC_ASSERT((internal::is_same<T, T>::value == false), THIS_TYPE_IS_NOT_SUPPORTED)
 
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T&) {
-    return ScalarType(0);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T&) { return ScalarType(0); }
 };
 
 template <typename T>
 struct generic_k0<T, float> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T& x) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T& x) {
     /*  k0f.c
      *	Modified Bessel function, third kind, order zero
      *
@@ -651,38 +533,28 @@
      *
      */
 
-    const float A[] = {1.90451637722020886025E-9f, 2.53479107902614945675E-7f,
-                       2.28621210311945178607E-5f, 1.26461541144692592338E-3f,
-                       3.59799365153615016266E-2f, 3.44289899924628486886E-1f,
+    const float A[] = {1.90451637722020886025E-9f, 2.53479107902614945675E-7f, 2.28621210311945178607E-5f,
+                       1.26461541144692592338E-3f, 3.59799365153615016266E-2f, 3.44289899924628486886E-1f,
                        -5.35327393233902768720E-1f};
 
-    const float B[] = {-1.69753450938905987466E-9f, 8.57403401741422608519E-9f,
-                       -4.66048989768794782956E-8f, 2.76681363944501510342E-7f,
-                       -1.83175552271911948767E-6f, 1.39498137188764993662E-5f,
-                       -1.28495495816278026384E-4f, 1.56988388573005337491E-3f,
-                       -3.14481013119645005427E-2f, 2.44030308206595545468E0f};
+    const float B[] = {-1.69753450938905987466E-9f, 8.57403401741422608519E-9f,  -4.66048989768794782956E-8f,
+                       2.76681363944501510342E-7f,  -1.83175552271911948767E-6f, 1.39498137188764993662E-5f,
+                       -1.28495495816278026384E-4f, 1.56988388573005337491E-3f,  -3.14481013119645005427E-2f,
+                       2.44030308206595545468E0f};
     const T MAXNUM = pset1<T>(NumTraits<float>::infinity());
     const T two = pset1<T>(2.0);
-    T x_le_two = internal::pchebevl<T, 7>::run(
-        pmadd(x, x, pset1<T>(-2.0)), A);
-    x_le_two = pmadd(
-        generic_i0<T, float>::run(x), pnegate(
-            plog(pmul(pset1<T>(0.5), x))), x_le_two);
+    T x_le_two = internal::pchebevl<T, 7>::run(pmadd(x, x, pset1<T>(-2.0)), A);
+    x_le_two = pmadd(generic_i0<T, float>::run(x), pnegate(plog(pmul(pset1<T>(0.5), x))), x_le_two);
     x_le_two = pselect(pcmp_le(x, pset1<T>(0.0)), MAXNUM, x_le_two);
-    T x_gt_two = pmul(
-        pmul(
-            pexp(pnegate(x)),
-            internal::pchebevl<T, 10>::run(
-                psub(pdiv(pset1<T>(8.0), x), two), B)),
-        prsqrt(x));
+    T x_gt_two =
+        pmul(pmul(pexp(pnegate(x)), internal::pchebevl<T, 10>::run(psub(pdiv(pset1<T>(8.0), x), two), B)), prsqrt(x));
     return pselect(pcmp_le(x, two), x_le_two, x_gt_two);
   }
 };
 
 template <typename T>
 struct generic_k0<T, double> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T& x) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T& x) {
     /*
      *
      *	Modified Bessel function, third kind, order zero,
@@ -713,56 +585,32 @@
      * See k0().
      *
      */
-    const double A[] = {
-      1.37446543561352307156E-16,
-      4.25981614279661018399E-14,
-      1.03496952576338420167E-11,
-      1.90451637722020886025E-9,
-      2.53479107902614945675E-7,
-      2.28621210311945178607E-5,
-      1.26461541144692592338E-3,
-      3.59799365153615016266E-2,
-      3.44289899924628486886E-1,
-      -5.35327393233902768720E-1};
-    const double B[] = {
-       5.30043377268626276149E-18, -1.64758043015242134646E-17,
-       5.21039150503902756861E-17, -1.67823109680541210385E-16,
-       5.51205597852431940784E-16, -1.84859337734377901440E-15,
-       6.34007647740507060557E-15, -2.22751332699166985548E-14,
-       8.03289077536357521100E-14, -2.98009692317273043925E-13,
-       1.14034058820847496303E-12, -4.51459788337394416547E-12,
-       1.85594911495471785253E-11, -7.95748924447710747776E-11,
-       3.57739728140030116597E-10, -1.69753450938905987466E-9,
-       8.57403401741422608519E-9, -4.66048989768794782956E-8,
-       2.76681363944501510342E-7, -1.83175552271911948767E-6,
-       1.39498137188764993662E-5, -1.28495495816278026384E-4,
-       1.56988388573005337491E-3, -3.14481013119645005427E-2,
-       2.44030308206595545468E0
-    };
+    const double A[] = {1.37446543561352307156E-16, 4.25981614279661018399E-14, 1.03496952576338420167E-11,
+                        1.90451637722020886025E-9,  2.53479107902614945675E-7,  2.28621210311945178607E-5,
+                        1.26461541144692592338E-3,  3.59799365153615016266E-2,  3.44289899924628486886E-1,
+                        -5.35327393233902768720E-1};
+    const double B[] = {5.30043377268626276149E-18,  -1.64758043015242134646E-17, 5.21039150503902756861E-17,
+                        -1.67823109680541210385E-16, 5.51205597852431940784E-16,  -1.84859337734377901440E-15,
+                        6.34007647740507060557E-15,  -2.22751332699166985548E-14, 8.03289077536357521100E-14,
+                        -2.98009692317273043925E-13, 1.14034058820847496303E-12,  -4.51459788337394416547E-12,
+                        1.85594911495471785253E-11,  -7.95748924447710747776E-11, 3.57739728140030116597E-10,
+                        -1.69753450938905987466E-9,  8.57403401741422608519E-9,   -4.66048989768794782956E-8,
+                        2.76681363944501510342E-7,   -1.83175552271911948767E-6,  1.39498137188764993662E-5,
+                        -1.28495495816278026384E-4,  1.56988388573005337491E-3,   -3.14481013119645005427E-2,
+                        2.44030308206595545468E0};
     const T MAXNUM = pset1<T>(NumTraits<double>::infinity());
     const T two = pset1<T>(2.0);
-    T x_le_two = internal::pchebevl<T, 10>::run(
-        pmadd(x, x, pset1<T>(-2.0)), A);
-    x_le_two = pmadd(
-        generic_i0<T, double>::run(x), pnegate(
-            plog(pmul(pset1<T>(0.5), x))), x_le_two);
+    T x_le_two = internal::pchebevl<T, 10>::run(pmadd(x, x, pset1<T>(-2.0)), A);
+    x_le_two = pmadd(generic_i0<T, double>::run(x), pnegate(plog(pmul(pset1<T>(0.5), x))), x_le_two);
     x_le_two = pselect(pcmp_le(x, pset1<T>(0.0)), MAXNUM, x_le_two);
-    T x_gt_two = pmul(
-        pmul(
-            pexp(-x),
-            internal::pchebevl<T, 25>::run(
-                psub(pdiv(pset1<T>(8.0), x), two), B)),
-        prsqrt(x));
+    T x_gt_two = pmul(pmul(pexp(-x), internal::pchebevl<T, 25>::run(psub(pdiv(pset1<T>(8.0), x), two), B)), prsqrt(x));
     return pselect(pcmp_le(x, two), x_le_two, x_gt_two);
   }
 };
 
 template <typename T>
 struct bessel_k0_impl {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T x) {
-    return generic_k0<T>::run(x);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T x) { return generic_k0<T>::run(x); }
 };
 
 template <typename T>
@@ -772,18 +620,14 @@
 
 template <typename T, typename ScalarType = typename unpacket_traits<T>::type>
 struct generic_k1e {
-  EIGEN_STATIC_ASSERT((internal::is_same<T, T>::value == false),
-                      THIS_TYPE_IS_NOT_SUPPORTED)
+  EIGEN_STATIC_ASSERT((internal::is_same<T, T>::value == false), THIS_TYPE_IS_NOT_SUPPORTED)
 
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T&) {
-    return ScalarType(0);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T&) { return ScalarType(0); }
 };
 
 template <typename T>
 struct generic_k1e<T, float> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T& x) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T& x) {
     /* k1ef.c
      *
      *	Modified Bessel function, third kind, order one,
@@ -817,35 +661,27 @@
      *
      */
 
-    const float A[] = {-2.21338763073472585583E-8f, -2.43340614156596823496E-6f,
-                        -1.73028895751305206302E-4f, -6.97572385963986435018E-3f,
-                        -1.22611180822657148235E-1f, -3.53155960776544875667E-1f,
-                        1.52530022733894777053E0f};
-    const float B[] = {2.01504975519703286596E-9f, -1.03457624656780970260E-8f,
-                       5.74108412545004946722E-8f, -3.50196060308781257119E-7f,
-                       2.40648494783721712015E-6f, -1.93619797416608296024E-5f,
-                       1.95215518471351631108E-4f, -2.85781685962277938680E-3f,
-                       1.03923736576817238437E-1f, 2.72062619048444266945E0f};
+    const float A[] = {-2.21338763073472585583E-8f, -2.43340614156596823496E-6f, -1.73028895751305206302E-4f,
+                       -6.97572385963986435018E-3f, -1.22611180822657148235E-1f, -3.53155960776544875667E-1f,
+                       1.52530022733894777053E0f};
+    const float B[] = {2.01504975519703286596E-9f,  -1.03457624656780970260E-8f, 5.74108412545004946722E-8f,
+                       -3.50196060308781257119E-7f, 2.40648494783721712015E-6f,  -1.93619797416608296024E-5f,
+                       1.95215518471351631108E-4f,  -2.85781685962277938680E-3f, 1.03923736576817238437E-1f,
+                       2.72062619048444266945E0f};
     const T MAXNUM = pset1<T>(NumTraits<float>::infinity());
     const T two = pset1<T>(2.0);
-    T x_le_two = pdiv(internal::pchebevl<T, 7>::run(
-        pmadd(x, x, pset1<T>(-2.0)), A), x);
-    x_le_two = pmadd(
-        generic_i1<T, float>::run(x), plog(pmul(pset1<T>(0.5), x)), x_le_two);
+    T x_le_two = pdiv(internal::pchebevl<T, 7>::run(pmadd(x, x, pset1<T>(-2.0)), A), x);
+    x_le_two = pmadd(generic_i1<T, float>::run(x), plog(pmul(pset1<T>(0.5), x)), x_le_two);
     x_le_two = pmul(x_le_two, pexp(x));
     x_le_two = pselect(pcmp_le(x, pset1<T>(0.0)), MAXNUM, x_le_two);
-    T x_gt_two = pmul(
-        internal::pchebevl<T, 10>::run(
-            psub(pdiv(pset1<T>(8.0), x), two), B),
-        prsqrt(x));
+    T x_gt_two = pmul(internal::pchebevl<T, 10>::run(psub(pdiv(pset1<T>(8.0), x), two), B), prsqrt(x));
     return pselect(pcmp_le(x, two), x_le_two, x_gt_two);
   }
 };
 
 template <typename T>
 struct generic_k1e<T, double> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T& x) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T& x) {
     /*  k1e.c
      *
      *	Modified Bessel function, third kind, order one,
@@ -878,47 +714,33 @@
      * See k1().
      *
      */
-    const double A[] = {-7.02386347938628759343E-18, -2.42744985051936593393E-15,
-                        -6.66690169419932900609E-13, -1.41148839263352776110E-10,
-                        -2.21338763073472585583E-8, -2.43340614156596823496E-6,
-                        -1.73028895751305206302E-4, -6.97572385963986435018E-3,
-                        -1.22611180822657148235E-1, -3.53155960776544875667E-1,
-                        1.52530022733894777053E0};
-    const double B[] = {-5.75674448366501715755E-18, 1.79405087314755922667E-17,
-                        -5.68946255844285935196E-17, 1.83809354436663880070E-16,
-                        -6.05704724837331885336E-16, 2.03870316562433424052E-15,
-                        -7.01983709041831346144E-15, 2.47715442448130437068E-14,
-                        -8.97670518232499435011E-14, 3.34841966607842919884E-13,
-                        -1.28917396095102890680E-12, 5.13963967348173025100E-12,
-                        -2.12996783842756842877E-11, 9.21831518760500529508E-11,
-                        -4.19035475934189648750E-10, 2.01504975519703286596E-9,
-                        -1.03457624656780970260E-8, 5.74108412545004946722E-8,
-                        -3.50196060308781257119E-7, 2.40648494783721712015E-6,
-                        -1.93619797416608296024E-5, 1.95215518471351631108E-4,
-                        -2.85781685962277938680E-3, 1.03923736576817238437E-1,
+    const double A[] = {-7.02386347938628759343E-18, -2.42744985051936593393E-15, -6.66690169419932900609E-13,
+                        -1.41148839263352776110E-10, -2.21338763073472585583E-8,  -2.43340614156596823496E-6,
+                        -1.73028895751305206302E-4,  -6.97572385963986435018E-3,  -1.22611180822657148235E-1,
+                        -3.53155960776544875667E-1,  1.52530022733894777053E0};
+    const double B[] = {-5.75674448366501715755E-18, 1.79405087314755922667E-17,  -5.68946255844285935196E-17,
+                        1.83809354436663880070E-16,  -6.05704724837331885336E-16, 2.03870316562433424052E-15,
+                        -7.01983709041831346144E-15, 2.47715442448130437068E-14,  -8.97670518232499435011E-14,
+                        3.34841966607842919884E-13,  -1.28917396095102890680E-12, 5.13963967348173025100E-12,
+                        -2.12996783842756842877E-11, 9.21831518760500529508E-11,  -4.19035475934189648750E-10,
+                        2.01504975519703286596E-9,   -1.03457624656780970260E-8,  5.74108412545004946722E-8,
+                        -3.50196060308781257119E-7,  2.40648494783721712015E-6,   -1.93619797416608296024E-5,
+                        1.95215518471351631108E-4,   -2.85781685962277938680E-3,  1.03923736576817238437E-1,
                         2.72062619048444266945E0};
     const T MAXNUM = pset1<T>(NumTraits<double>::infinity());
     const T two = pset1<T>(2.0);
-    T x_le_two = pdiv(internal::pchebevl<T, 11>::run(
-        pmadd(x, x, pset1<T>(-2.0)), A), x);
-    x_le_two = pmadd(
-        generic_i1<T, double>::run(x), plog(pmul(pset1<T>(0.5), x)), x_le_two);
+    T x_le_two = pdiv(internal::pchebevl<T, 11>::run(pmadd(x, x, pset1<T>(-2.0)), A), x);
+    x_le_two = pmadd(generic_i1<T, double>::run(x), plog(pmul(pset1<T>(0.5), x)), x_le_two);
     x_le_two = pmul(x_le_two, pexp(x));
     x_le_two = pselect(pcmp_le(x, pset1<T>(0.0)), MAXNUM, x_le_two);
-    T x_gt_two = pmul(
-        internal::pchebevl<T, 25>::run(
-            psub(pdiv(pset1<T>(8.0), x), two), B),
-        prsqrt(x));
+    T x_gt_two = pmul(internal::pchebevl<T, 25>::run(psub(pdiv(pset1<T>(8.0), x), two), B), prsqrt(x));
     return pselect(pcmp_le(x, two), x_le_two, x_gt_two);
   }
 };
 
 template <typename T>
 struct bessel_k1e_impl {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T x) {
-    return generic_k1e<T>::run(x);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T x) { return generic_k1e<T>::run(x); }
 };
 
 template <typename T>
@@ -928,18 +750,14 @@
 
 template <typename T, typename ScalarType = typename unpacket_traits<T>::type>
 struct generic_k1 {
-  EIGEN_STATIC_ASSERT((internal::is_same<T, T>::value == false),
-                      THIS_TYPE_IS_NOT_SUPPORTED)
+  EIGEN_STATIC_ASSERT((internal::is_same<T, T>::value == false), THIS_TYPE_IS_NOT_SUPPORTED)
 
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T&) {
-    return ScalarType(0);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T&) { return ScalarType(0); }
 };
 
 template <typename T>
 struct generic_k1<T, float> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T& x) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T& x) {
     /* k1f.c
      *	Modified Bessel function, third kind, order one
      *
@@ -977,36 +795,27 @@
      *
      */
 
-    const float A[] = {-2.21338763073472585583E-8f, -2.43340614156596823496E-6f,
-                        -1.73028895751305206302E-4f, -6.97572385963986435018E-3f,
-                        -1.22611180822657148235E-1f, -3.53155960776544875667E-1f,
-                        1.52530022733894777053E0f};
-    const float B[] = {2.01504975519703286596E-9f, -1.03457624656780970260E-8f,
-                       5.74108412545004946722E-8f, -3.50196060308781257119E-7f,
-                       2.40648494783721712015E-6f, -1.93619797416608296024E-5f,
-                       1.95215518471351631108E-4f, -2.85781685962277938680E-3f,
-                       1.03923736576817238437E-1f, 2.72062619048444266945E0f};
+    const float A[] = {-2.21338763073472585583E-8f, -2.43340614156596823496E-6f, -1.73028895751305206302E-4f,
+                       -6.97572385963986435018E-3f, -1.22611180822657148235E-1f, -3.53155960776544875667E-1f,
+                       1.52530022733894777053E0f};
+    const float B[] = {2.01504975519703286596E-9f,  -1.03457624656780970260E-8f, 5.74108412545004946722E-8f,
+                       -3.50196060308781257119E-7f, 2.40648494783721712015E-6f,  -1.93619797416608296024E-5f,
+                       1.95215518471351631108E-4f,  -2.85781685962277938680E-3f, 1.03923736576817238437E-1f,
+                       2.72062619048444266945E0f};
     const T MAXNUM = pset1<T>(NumTraits<float>::infinity());
     const T two = pset1<T>(2.0);
-    T x_le_two = pdiv(internal::pchebevl<T, 7>::run(
-        pmadd(x, x, pset1<T>(-2.0)), A), x);
-    x_le_two = pmadd(
-        generic_i1<T, float>::run(x), plog(pmul(pset1<T>(0.5), x)), x_le_two);
+    T x_le_two = pdiv(internal::pchebevl<T, 7>::run(pmadd(x, x, pset1<T>(-2.0)), A), x);
+    x_le_two = pmadd(generic_i1<T, float>::run(x), plog(pmul(pset1<T>(0.5), x)), x_le_two);
     x_le_two = pselect(pcmp_le(x, pset1<T>(0.0)), MAXNUM, x_le_two);
-    T x_gt_two = pmul(
-        pexp(pnegate(x)),
-        pmul(
-            internal::pchebevl<T, 10>::run(
-                psub(pdiv(pset1<T>(8.0), x), two), B),
-            prsqrt(x)));
+    T x_gt_two =
+        pmul(pexp(pnegate(x)), pmul(internal::pchebevl<T, 10>::run(psub(pdiv(pset1<T>(8.0), x), two), B), prsqrt(x)));
     return pselect(pcmp_le(x, two), x_le_two, x_gt_two);
   }
 };
 
 template <typename T>
 struct generic_k1<T, double> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T& x) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T& x) {
     /*  k1.c
      *	Modified Bessel function, third kind, order one
      *
@@ -1043,48 +852,32 @@
      * k1 domain          x <= 0          MAXNUM
      *
      */
-    const double A[] = {-7.02386347938628759343E-18, -2.42744985051936593393E-15,
-                        -6.66690169419932900609E-13, -1.41148839263352776110E-10,
-                        -2.21338763073472585583E-8, -2.43340614156596823496E-6,
-                        -1.73028895751305206302E-4, -6.97572385963986435018E-3,
-                        -1.22611180822657148235E-1, -3.53155960776544875667E-1,
-                        1.52530022733894777053E0};
-    const double B[] = {-5.75674448366501715755E-18, 1.79405087314755922667E-17,
-                        -5.68946255844285935196E-17, 1.83809354436663880070E-16,
-                        -6.05704724837331885336E-16, 2.03870316562433424052E-15,
-                        -7.01983709041831346144E-15, 2.47715442448130437068E-14,
-                        -8.97670518232499435011E-14, 3.34841966607842919884E-13,
-                        -1.28917396095102890680E-12, 5.13963967348173025100E-12,
-                        -2.12996783842756842877E-11, 9.21831518760500529508E-11,
-                        -4.19035475934189648750E-10, 2.01504975519703286596E-9,
-                        -1.03457624656780970260E-8, 5.74108412545004946722E-8,
-                        -3.50196060308781257119E-7, 2.40648494783721712015E-6,
-                        -1.93619797416608296024E-5, 1.95215518471351631108E-4,
-                        -2.85781685962277938680E-3, 1.03923736576817238437E-1,
+    const double A[] = {-7.02386347938628759343E-18, -2.42744985051936593393E-15, -6.66690169419932900609E-13,
+                        -1.41148839263352776110E-10, -2.21338763073472585583E-8,  -2.43340614156596823496E-6,
+                        -1.73028895751305206302E-4,  -6.97572385963986435018E-3,  -1.22611180822657148235E-1,
+                        -3.53155960776544875667E-1,  1.52530022733894777053E0};
+    const double B[] = {-5.75674448366501715755E-18, 1.79405087314755922667E-17,  -5.68946255844285935196E-17,
+                        1.83809354436663880070E-16,  -6.05704724837331885336E-16, 2.03870316562433424052E-15,
+                        -7.01983709041831346144E-15, 2.47715442448130437068E-14,  -8.97670518232499435011E-14,
+                        3.34841966607842919884E-13,  -1.28917396095102890680E-12, 5.13963967348173025100E-12,
+                        -2.12996783842756842877E-11, 9.21831518760500529508E-11,  -4.19035475934189648750E-10,
+                        2.01504975519703286596E-9,   -1.03457624656780970260E-8,  5.74108412545004946722E-8,
+                        -3.50196060308781257119E-7,  2.40648494783721712015E-6,   -1.93619797416608296024E-5,
+                        1.95215518471351631108E-4,   -2.85781685962277938680E-3,  1.03923736576817238437E-1,
                         2.72062619048444266945E0};
     const T MAXNUM = pset1<T>(NumTraits<double>::infinity());
     const T two = pset1<T>(2.0);
-    T x_le_two = pdiv(internal::pchebevl<T, 11>::run(
-        pmadd(x, x, pset1<T>(-2.0)), A), x);
-    x_le_two = pmadd(
-        generic_i1<T, double>::run(x), plog(pmul(pset1<T>(0.5), x)), x_le_two);
+    T x_le_two = pdiv(internal::pchebevl<T, 11>::run(pmadd(x, x, pset1<T>(-2.0)), A), x);
+    x_le_two = pmadd(generic_i1<T, double>::run(x), plog(pmul(pset1<T>(0.5), x)), x_le_two);
     x_le_two = pselect(pcmp_le(x, pset1<T>(0.0)), MAXNUM, x_le_two);
-    T x_gt_two = pmul(
-        pexp(-x),
-        pmul(
-            internal::pchebevl<T, 25>::run(
-                psub(pdiv(pset1<T>(8.0), x), two), B),
-            prsqrt(x)));
+    T x_gt_two = pmul(pexp(-x), pmul(internal::pchebevl<T, 25>::run(psub(pdiv(pset1<T>(8.0), x), two), B), prsqrt(x)));
     return pselect(pcmp_le(x, two), x_le_two, x_gt_two);
   }
 };
 
 template <typename T>
 struct bessel_k1_impl {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T x) {
-    return generic_k1<T>::run(x);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T x) { return generic_k1<T>::run(x); }
 };
 
 template <typename T>
@@ -1094,18 +887,14 @@
 
 template <typename T, typename ScalarType = typename unpacket_traits<T>::type>
 struct generic_j0 {
-  EIGEN_STATIC_ASSERT((internal::is_same<T, T>::value == false),
-                      THIS_TYPE_IS_NOT_SUPPORTED)
+  EIGEN_STATIC_ASSERT((internal::is_same<T, T>::value == false), THIS_TYPE_IS_NOT_SUPPORTED)
 
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T&) {
-    return ScalarType(0);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T&) { return ScalarType(0); }
 };
 
 template <typename T>
 struct generic_j0<T, float> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T& x) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T& x) {
     /* j0f.c
      *	Bessel function of order zero
      *
@@ -1152,25 +941,20 @@
      *
      */
 
-    const float JP[] = {-6.068350350393235E-008f, 6.388945720783375E-006f,
-                        -3.969646342510940E-004f, 1.332913422519003E-002f,
-                        -1.729150680240724E-001f};
-    const float MO[] = {-6.838999669318810E-002f, 1.864949361379502E-001f,
-                        -2.145007480346739E-001f, 1.197549369473540E-001f,
-                        -3.560281861530129E-003f, -4.969382655296620E-002f,
+    const float JP[] = {-6.068350350393235E-008f, 6.388945720783375E-006f, -3.969646342510940E-004f,
+                        1.332913422519003E-002f, -1.729150680240724E-001f};
+    const float MO[] = {-6.838999669318810E-002f, 1.864949361379502E-001f,  -2.145007480346739E-001f,
+                        1.197549369473540E-001f,  -3.560281861530129E-003f, -4.969382655296620E-002f,
                         -3.355424622293709E-006f, 7.978845717621440E-001f};
-    const float PH[] = {3.242077816988247E+001f, -3.630592630518434E+001f,
-                        1.756221482109099E+001f, -4.974978466280903E+000f,
-                        1.001973420681837E+000f, -1.939906941791308E-001f,
-                        6.490598792654666E-002f, -1.249992184872738E-001f};
-    const T DR1 =  pset1<T>(5.78318596294678452118f);
+    const float PH[] = {3.242077816988247E+001f,  -3.630592630518434E+001f, 1.756221482109099E+001f,
+                        -4.974978466280903E+000f, 1.001973420681837E+000f,  -1.939906941791308E-001f,
+                        6.490598792654666E-002f,  -1.249992184872738E-001f};
+    const T DR1 = pset1<T>(5.78318596294678452118f);
     const T NEG_PIO4F = pset1<T>(-0.7853981633974483096f); /* -pi / 4 */
     T y = pabs(x);
     T z = pmul(y, y);
-    T y_le_two = pselect(
-        pcmp_lt(y, pset1<T>(1.0e-3f)),
-        pmadd(z, pset1<T>(-0.25f), pset1<T>(1.0f)),
-        pmul(psub(z, DR1), internal::ppolevl<T, 4>::run(z, JP)));
+    T y_le_two = pselect(pcmp_lt(y, pset1<T>(1.0e-3f)), pmadd(z, pset1<T>(-0.25f), pset1<T>(1.0f)),
+                         pmul(psub(z, DR1), internal::ppolevl<T, 4>::run(z, JP)));
     T q = pdiv(pset1<T>(1.0f), y);
     T w = prsqrt(y);
     T p = pmul(w, internal::ppolevl<T, 7>::run(q, MO));
@@ -1183,8 +967,7 @@
 
 template <typename T>
 struct generic_j0<T, double> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T& x) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T& x) {
     /*  j0.c
      *	Bessel function of order zero
      *
@@ -1228,49 +1011,36 @@
      *    IEEE      0, 30       60000       4.2e-16     1.1e-16
      *
      */
-    const double PP[] = {7.96936729297347051624E-4, 8.28352392107440799803E-2,
-                        1.23953371646414299388E0, 5.44725003058768775090E0,
-                        8.74716500199817011941E0, 5.30324038235394892183E0,
-                        9.99999999999999997821E-1};
-    const double PQ[] = {9.24408810558863637013E-4, 8.56288474354474431428E-2,
-                         1.25352743901058953537E0, 5.47097740330417105182E0,
-                         8.76190883237069594232E0, 5.30605288235394617618E0,
+    const double PP[] = {7.96936729297347051624E-4, 8.28352392107440799803E-2, 1.23953371646414299388E0,
+                         5.44725003058768775090E0,  8.74716500199817011941E0,  5.30324038235394892183E0,
+                         9.99999999999999997821E-1};
+    const double PQ[] = {9.24408810558863637013E-4, 8.56288474354474431428E-2, 1.25352743901058953537E0,
+                         5.47097740330417105182E0,  8.76190883237069594232E0,  5.30605288235394617618E0,
                          1.00000000000000000218E0};
-    const double QP[] = {-1.13663838898469149931E-2, -1.28252718670509318512E0,
-                         -1.95539544257735972385E1, -9.32060152123768231369E1,
-                         -1.77681167980488050595E2, -1.47077505154951170175E2,
-                         -5.14105326766599330220E1, -6.05014350600728481186E0};
-    const double QQ[] = {1.00000000000000000000E0, 6.43178256118178023184E1,
-                         8.56430025976980587198E2, 3.88240183605401609683E3,
-                         7.24046774195652478189E3, 5.93072701187316984827E3,
+    const double QP[] = {-1.13663838898469149931E-2, -1.28252718670509318512E0, -1.95539544257735972385E1,
+                         -9.32060152123768231369E1,  -1.77681167980488050595E2, -1.47077505154951170175E2,
+                         -5.14105326766599330220E1,  -6.05014350600728481186E0};
+    const double QQ[] = {1.00000000000000000000E0, 6.43178256118178023184E1, 8.56430025976980587198E2,
+                         3.88240183605401609683E3, 7.24046774195652478189E3, 5.93072701187316984827E3,
                          2.06209331660327847417E3, 2.42005740240291393179E2};
-    const double RP[] = {-4.79443220978201773821E9, 1.95617491946556577543E12,
-                         -2.49248344360967716204E14, 9.70862251047306323952E15};
-    const double RQ[] = {1.00000000000000000000E0, 4.99563147152651017219E2,
-                         1.73785401676374683123E5, 4.84409658339962045305E7,
-                         1.11855537045356834862E10, 2.11277520115489217587E12,
-                         3.10518229857422583814E14, 3.18121955943204943306E16,
-                         1.71086294081043136091E18};
+    const double RP[] = {-4.79443220978201773821E9, 1.95617491946556577543E12, -2.49248344360967716204E14,
+                         9.70862251047306323952E15};
+    const double RQ[] = {1.00000000000000000000E0,  4.99563147152651017219E2,  1.73785401676374683123E5,
+                         4.84409658339962045305E7,  1.11855537045356834862E10, 2.11277520115489217587E12,
+                         3.10518229857422583814E14, 3.18121955943204943306E16, 1.71086294081043136091E18};
     const T DR1 = pset1<T>(5.78318596294678452118E0);
     const T DR2 = pset1<T>(3.04712623436620863991E1);
     const T SQ2OPI = pset1<T>(7.9788456080286535587989E-1); /* sqrt(2 / pi) */
-    const T NEG_PIO4 = pset1<T>(-0.7853981633974483096); /* pi / 4 */
+    const T NEG_PIO4 = pset1<T>(-0.7853981633974483096);    /* pi / 4 */
 
     T y = pabs(x);
     T z = pmul(y, y);
-    T y_le_five = pselect(
-        pcmp_lt(y, pset1<T>(1.0e-5)),
-        pmadd(z, pset1<T>(-0.25), pset1<T>(1.0)),
-        pmul(pmul(psub(z, DR1), psub(z, DR2)),
-             pdiv(internal::ppolevl<T, 3>::run(z, RP),
-                  internal::ppolevl<T, 8>::run(z, RQ))));
+    T y_le_five = pselect(pcmp_lt(y, pset1<T>(1.0e-5)), pmadd(z, pset1<T>(-0.25), pset1<T>(1.0)),
+                          pmul(pmul(psub(z, DR1), psub(z, DR2)),
+                               pdiv(internal::ppolevl<T, 3>::run(z, RP), internal::ppolevl<T, 8>::run(z, RQ))));
     T s = pdiv(pset1<T>(25.0), z);
-    T p = pdiv(
-        internal::ppolevl<T, 6>::run(s, PP),
-        internal::ppolevl<T, 6>::run(s, PQ));
-    T q = pdiv(
-        internal::ppolevl<T, 7>::run(s, QP),
-        internal::ppolevl<T, 7>::run(s, QQ));
+    T p = pdiv(internal::ppolevl<T, 6>::run(s, PP), internal::ppolevl<T, 6>::run(s, PQ));
+    T q = pdiv(internal::ppolevl<T, 7>::run(s, QP), internal::ppolevl<T, 7>::run(s, QQ));
     T yn = padd(y, NEG_PIO4);
     T w = pdiv(pset1<T>(-5.0), y);
     p = pmadd(p, pcos(yn), pmul(w, pmul(q, psin(yn))));
@@ -1281,10 +1051,7 @@
 
 template <typename T>
 struct bessel_j0_impl {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T x) {
-    return generic_j0<T>::run(x);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T x) { return generic_j0<T>::run(x); }
 };
 
 template <typename T>
@@ -1294,18 +1061,14 @@
 
 template <typename T, typename ScalarType = typename unpacket_traits<T>::type>
 struct generic_y0 {
-  EIGEN_STATIC_ASSERT((internal::is_same<T, T>::value == false),
-                      THIS_TYPE_IS_NOT_SUPPORTED)
+  EIGEN_STATIC_ASSERT((internal::is_same<T, T>::value == false), THIS_TYPE_IS_NOT_SUPPORTED)
 
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T&) {
-    return ScalarType(0);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T&) { return ScalarType(0); }
 };
 
 template <typename T>
 struct generic_y0<T, float> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T& x) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T& x) {
     /* j0f.c
      * 	Bessel function of the second kind, order zero
      *
@@ -1354,25 +1117,21 @@
      *
      */
 
-    const float YP[] = {9.454583683980369E-008f, -9.413212653797057E-006f,
-                        5.344486707214273E-004f, -1.584289289821316E-002f,
-                        1.707584643733568E-001f};
-    const float MO[] = {-6.838999669318810E-002f, 1.864949361379502E-001f,
-                        -2.145007480346739E-001f, 1.197549369473540E-001f,
-                        -3.560281861530129E-003f, -4.969382655296620E-002f,
+    const float YP[] = {9.454583683980369E-008f, -9.413212653797057E-006f, 5.344486707214273E-004f,
+                        -1.584289289821316E-002f, 1.707584643733568E-001f};
+    const float MO[] = {-6.838999669318810E-002f, 1.864949361379502E-001f,  -2.145007480346739E-001f,
+                        1.197549369473540E-001f,  -3.560281861530129E-003f, -4.969382655296620E-002f,
                         -3.355424622293709E-006f, 7.978845717621440E-001f};
-    const float PH[] = {3.242077816988247E+001f, -3.630592630518434E+001f,
-                        1.756221482109099E+001f, -4.974978466280903E+000f,
-                        1.001973420681837E+000f, -1.939906941791308E-001f,
-                        6.490598792654666E-002f, -1.249992184872738E-001f};
+    const float PH[] = {3.242077816988247E+001f,  -3.630592630518434E+001f, 1.756221482109099E+001f,
+                        -4.974978466280903E+000f, 1.001973420681837E+000f,  -1.939906941791308E-001f,
+                        6.490598792654666E-002f,  -1.249992184872738E-001f};
     const T YZ1 = pset1<T>(0.43221455686510834878f);
-    const T TWOOPI =  pset1<T>(0.636619772367581343075535f); /* 2 / pi */
-    const T NEG_PIO4F = pset1<T>(-0.7853981633974483096f); /* -pi / 4 */
+    const T TWOOPI = pset1<T>(0.636619772367581343075535f); /* 2 / pi */
+    const T NEG_PIO4F = pset1<T>(-0.7853981633974483096f);  /* -pi / 4 */
     const T NEG_MAXNUM = pset1<T>(-NumTraits<float>::infinity());
     T z = pmul(x, x);
     T x_le_two = pmul(TWOOPI, pmul(plog(x), generic_j0<T, float>::run(x)));
-    x_le_two = pmadd(
-        psub(z, YZ1), internal::ppolevl<T, 4>::run(z, YP), x_le_two);
+    x_le_two = pmadd(psub(z, YZ1), internal::ppolevl<T, 4>::run(z, YP), x_le_two);
     x_le_two = pselect(pcmp_le(x, pset1<T>(0.0)), NEG_MAXNUM, x_le_two);
     T q = pdiv(pset1<T>(1.0), x);
     T w = prsqrt(x);
@@ -1386,8 +1145,7 @@
 
 template <typename T>
 struct generic_y0<T, double> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T& x) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T& x) {
     /*  j0.c
      *	Bessel function of the second kind, order zero
      *
@@ -1427,48 +1185,36 @@
      *    IEEE      0, 30       30000       1.3e-15     1.6e-16
      *
      */
-    const double PP[] = {7.96936729297347051624E-4, 8.28352392107440799803E-2,
-                        1.23953371646414299388E0, 5.44725003058768775090E0,
-                        8.74716500199817011941E0, 5.30324038235394892183E0,
-                        9.99999999999999997821E-1};
-    const double PQ[] = {9.24408810558863637013E-4, 8.56288474354474431428E-2,
-                         1.25352743901058953537E0, 5.47097740330417105182E0,
-                         8.76190883237069594232E0, 5.30605288235394617618E0,
+    const double PP[] = {7.96936729297347051624E-4, 8.28352392107440799803E-2, 1.23953371646414299388E0,
+                         5.44725003058768775090E0,  8.74716500199817011941E0,  5.30324038235394892183E0,
+                         9.99999999999999997821E-1};
+    const double PQ[] = {9.24408810558863637013E-4, 8.56288474354474431428E-2, 1.25352743901058953537E0,
+                         5.47097740330417105182E0,  8.76190883237069594232E0,  5.30605288235394617618E0,
                          1.00000000000000000218E0};
-    const double QP[] = {-1.13663838898469149931E-2, -1.28252718670509318512E0,
-                         -1.95539544257735972385E1, -9.32060152123768231369E1,
-                         -1.77681167980488050595E2, -1.47077505154951170175E2,
-                         -5.14105326766599330220E1, -6.05014350600728481186E0};
-    const double QQ[] = {1.00000000000000000000E0, 6.43178256118178023184E1,
-                         8.56430025976980587198E2, 3.88240183605401609683E3,
-                         7.24046774195652478189E3, 5.93072701187316984827E3,
+    const double QP[] = {-1.13663838898469149931E-2, -1.28252718670509318512E0, -1.95539544257735972385E1,
+                         -9.32060152123768231369E1,  -1.77681167980488050595E2, -1.47077505154951170175E2,
+                         -5.14105326766599330220E1,  -6.05014350600728481186E0};
+    const double QQ[] = {1.00000000000000000000E0, 6.43178256118178023184E1, 8.56430025976980587198E2,
+                         3.88240183605401609683E3, 7.24046774195652478189E3, 5.93072701187316984827E3,
                          2.06209331660327847417E3, 2.42005740240291393179E2};
-    const double YP[] = {1.55924367855235737965E4, -1.46639295903971606143E7,
-                         5.43526477051876500413E9, -9.82136065717911466409E11,
-                         8.75906394395366999549E13, -3.46628303384729719441E15,
-                         4.42733268572569800351E16, -1.84950800436986690637E16};
-    const double YQ[] = {1.00000000000000000000E0,  1.04128353664259848412E3,
-                         6.26107330137134956842E5, 2.68919633393814121987E8,
-                         8.64002487103935000337E10, 2.02979612750105546709E13,
+    const double YP[] = {1.55924367855235737965E4,   -1.46639295903971606143E7, 5.43526477051876500413E9,
+                         -9.82136065717911466409E11, 8.75906394395366999549E13, -3.46628303384729719441E15,
+                         4.42733268572569800351E16,  -1.84950800436986690637E16};
+    const double YQ[] = {1.00000000000000000000E0,  1.04128353664259848412E3,  6.26107330137134956842E5,
+                         2.68919633393814121987E8,  8.64002487103935000337E10, 2.02979612750105546709E13,
                          3.17157752842975028269E15, 2.50596256172653059228E17};
     const T SQ2OPI = pset1<T>(7.9788456080286535587989E-1); /* sqrt(2 / pi) */
-    const T TWOOPI =  pset1<T>(0.636619772367581343075535); /* 2 / pi */
-    const T NEG_PIO4 = pset1<T>(-0.7853981633974483096); /* -pi / 4 */
+    const T TWOOPI = pset1<T>(0.636619772367581343075535);  /* 2 / pi */
+    const T NEG_PIO4 = pset1<T>(-0.7853981633974483096);    /* -pi / 4 */
     const T NEG_MAXNUM = pset1<T>(-NumTraits<double>::infinity());
 
     T z = pmul(x, x);
-    T x_le_five = pdiv(internal::ppolevl<T, 7>::run(z, YP),
-                       internal::ppolevl<T, 7>::run(z, YQ));
-    x_le_five = pmadd(
-        pmul(TWOOPI, plog(x)), generic_j0<T, double>::run(x), x_le_five);
+    T x_le_five = pdiv(internal::ppolevl<T, 7>::run(z, YP), internal::ppolevl<T, 7>::run(z, YQ));
+    x_le_five = pmadd(pmul(TWOOPI, plog(x)), generic_j0<T, double>::run(x), x_le_five);
     x_le_five = pselect(pcmp_le(x, pset1<T>(0.0)), NEG_MAXNUM, x_le_five);
     T s = pdiv(pset1<T>(25.0), z);
-    T p = pdiv(
-        internal::ppolevl<T, 6>::run(s, PP),
-        internal::ppolevl<T, 6>::run(s, PQ));
-    T q = pdiv(
-        internal::ppolevl<T, 7>::run(s, QP),
-        internal::ppolevl<T, 7>::run(s, QQ));
+    T p = pdiv(internal::ppolevl<T, 6>::run(s, PP), internal::ppolevl<T, 6>::run(s, PQ));
+    T q = pdiv(internal::ppolevl<T, 7>::run(s, QP), internal::ppolevl<T, 7>::run(s, QQ));
     T xn = padd(x, NEG_PIO4);
     T w = pdiv(pset1<T>(5.0), x);
     p = pmadd(p, psin(xn), pmul(w, pmul(q, pcos(xn))));
@@ -1479,10 +1225,7 @@
 
 template <typename T>
 struct bessel_y0_impl {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T x) {
-    return generic_y0<T>::run(x);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T x) { return generic_y0<T>::run(x); }
 };
 
 template <typename T>
@@ -1492,18 +1235,14 @@
 
 template <typename T, typename ScalarType = typename unpacket_traits<T>::type>
 struct generic_j1 {
-  EIGEN_STATIC_ASSERT((internal::is_same<T, T>::value == false),
-                      THIS_TYPE_IS_NOT_SUPPORTED)
+  EIGEN_STATIC_ASSERT((internal::is_same<T, T>::value == false), THIS_TYPE_IS_NOT_SUPPORTED)
 
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T&) {
-    return ScalarType(0);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T&) { return ScalarType(0); }
 };
 
 template <typename T>
 struct generic_j1<T, float> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T& x) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T& x) {
     /* j1f.c
      *	Bessel function of order one
      *
@@ -1547,25 +1286,20 @@
      *
      */
 
-    const float JP[] = {-4.878788132172128E-009f, 6.009061827883699E-007f,
-                        -4.541343896997497E-005f, 1.937383947804541E-003f,
-                        -3.405537384615824E-002f};
-    const float MO1[] = {6.913942741265801E-002f, -2.284801500053359E-001f,
-                        3.138238455499697E-001f, -2.102302420403875E-001f,
-                        5.435364690523026E-003f, 1.493389585089498E-001f,
-                        4.976029650847191E-006f, 7.978845453073848E-001f};
-    const float PH1[] = {-4.497014141919556E+001f, 5.073465654089319E+001f,
-                        -2.485774108720340E+001f, 7.222973196770240E+000f,
-                        -1.544842782180211E+000f, 3.503787691653334E-001f,
-                        -1.637986776941202E-001f, 3.749989509080821E-001f};
+    const float JP[] = {-4.878788132172128E-009f, 6.009061827883699E-007f, -4.541343896997497E-005f,
+                        1.937383947804541E-003f, -3.405537384615824E-002f};
+    const float MO1[] = {6.913942741265801E-002f,  -2.284801500053359E-001f, 3.138238455499697E-001f,
+                         -2.102302420403875E-001f, 5.435364690523026E-003f,  1.493389585089498E-001f,
+                         4.976029650847191E-006f,  7.978845453073848E-001f};
+    const float PH1[] = {-4.497014141919556E+001f, 5.073465654089319E+001f,  -2.485774108720340E+001f,
+                         7.222973196770240E+000f,  -1.544842782180211E+000f, 3.503787691653334E-001f,
+                         -1.637986776941202E-001f, 3.749989509080821E-001f};
     const T Z1 = pset1<T>(1.46819706421238932572E1f);
-    const T NEG_THPIO4F = pset1<T>(-2.35619449019234492885f);    /* -3*pi/4 */
+    const T NEG_THPIO4F = pset1<T>(-2.35619449019234492885f); /* -3*pi/4 */
 
     T y = pabs(x);
     T z = pmul(y, y);
-    T y_le_two = pmul(
-        psub(z, Z1),
-        pmul(x, internal::ppolevl<T, 4>::run(z, JP)));
+    T y_le_two = pmul(psub(z, Z1), pmul(x, internal::ppolevl<T, 4>::run(z, JP)));
     T q = pdiv(pset1<T>(1.0f), y);
     T w = prsqrt(y);
     T p = pmul(w, internal::ppolevl<T, 7>::run(q, MO1));
@@ -1574,16 +1308,14 @@
     T y_gt_two = pmul(p, pcos(padd(yn, y)));
     // j1 is an odd function. This implementation differs from cephes to
     // take this fact in to account. Cephes returns -j1(x) for y > 2 range.
-    y_gt_two = pselect(
-        pcmp_lt(x, pset1<T>(0.0f)), pnegate(y_gt_two), y_gt_two);
+    y_gt_two = pselect(pcmp_lt(x, pset1<T>(0.0f)), pnegate(y_gt_two), y_gt_two);
     return pselect(pcmp_le(y, pset1<T>(2.0f)), y_le_two, y_gt_two);
   }
 };
 
 template <typename T>
 struct generic_j1<T, double> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T& x) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T& x) {
     /*  j1.c
      *	Bessel function of order one
      *
@@ -1617,63 +1349,48 @@
      *    IEEE      0, 30       30000       2.6e-16     1.1e-16
      *
      */
-    const double PP[] = {7.62125616208173112003E-4, 7.31397056940917570436E-2,
-                         1.12719608129684925192E0, 5.11207951146807644818E0,
-                         8.42404590141772420927E0, 5.21451598682361504063E0,
+    const double PP[] = {7.62125616208173112003E-4, 7.31397056940917570436E-2, 1.12719608129684925192E0,
+                         5.11207951146807644818E0,  8.42404590141772420927E0,  5.21451598682361504063E0,
                          1.00000000000000000254E0};
-    const double PQ[] = {5.71323128072548699714E-4, 6.88455908754495404082E-2,
-                         1.10514232634061696926E0, 5.07386386128601488557E0,
-                         8.39985554327604159757E0, 5.20982848682361821619E0,
+    const double PQ[] = {5.71323128072548699714E-4, 6.88455908754495404082E-2, 1.10514232634061696926E0,
+                         5.07386386128601488557E0,  8.39985554327604159757E0,  5.20982848682361821619E0,
                          9.99999999999999997461E-1};
-    const double QP[] = {5.10862594750176621635E-2, 4.98213872951233449420E0,
-                         7.58238284132545283818E1, 3.66779609360150777800E2,
-                         7.10856304998926107277E2, 5.97489612400613639965E2,
-                         2.11688757100572135698E2, 2.52070205858023719784E1};
-    const double QQ[] = {1.00000000000000000000E0, 7.42373277035675149943E1,
-                         1.05644886038262816351E3, 4.98641058337653607651E3,
-                         9.56231892404756170795E3, 7.99704160447350683650E3,
+    const double QP[] = {5.10862594750176621635E-2, 4.98213872951233449420E0, 7.58238284132545283818E1,
+                         3.66779609360150777800E2,  7.10856304998926107277E2, 5.97489612400613639965E2,
+                         2.11688757100572135698E2,  2.52070205858023719784E1};
+    const double QQ[] = {1.00000000000000000000E0, 7.42373277035675149943E1, 1.05644886038262816351E3,
+                         4.98641058337653607651E3, 9.56231892404756170795E3, 7.99704160447350683650E3,
                          2.82619278517639096600E3, 3.36093607810698293419E2};
-    const double RP[] = {-8.99971225705559398224E8, 4.52228297998194034323E11,
-                         -7.27494245221818276015E13, 3.68295732863852883286E15};
-    const double RQ[] = {1.00000000000000000000E0, 6.20836478118054335476E2,
-                         2.56987256757748830383E5, 8.35146791431949253037E7,
-                         2.21511595479792499675E10, 4.74914122079991414898E12,
-                         7.84369607876235854894E14, 8.95222336184627338078E16,
-                         5.32278620332680085395E18};
+    const double RP[] = {-8.99971225705559398224E8, 4.52228297998194034323E11, -7.27494245221818276015E13,
+                         3.68295732863852883286E15};
+    const double RQ[] = {1.00000000000000000000E0,  6.20836478118054335476E2,  2.56987256757748830383E5,
+                         8.35146791431949253037E7,  2.21511595479792499675E10, 4.74914122079991414898E12,
+                         7.84369607876235854894E14, 8.95222336184627338078E16, 5.32278620332680085395E18};
     const T Z1 = pset1<T>(1.46819706421238932572E1);
     const T Z2 = pset1<T>(4.92184563216946036703E1);
-    const T NEG_THPIO4 = pset1<T>(-2.35619449019234492885);    /* -3*pi/4 */
+    const T NEG_THPIO4 = pset1<T>(-2.35619449019234492885); /* -3*pi/4 */
     const T SQ2OPI = pset1<T>(7.9788456080286535587989E-1); /* sqrt(2 / pi) */
     T y = pabs(x);
     T z = pmul(y, y);
-    T y_le_five = pdiv(internal::ppolevl<T, 3>::run(z, RP),
-                       internal::ppolevl<T, 8>::run(z, RQ));
+    T y_le_five = pdiv(internal::ppolevl<T, 3>::run(z, RP), internal::ppolevl<T, 8>::run(z, RQ));
     y_le_five = pmul(pmul(pmul(y_le_five, x), psub(z, Z1)), psub(z, Z2));
     T s = pdiv(pset1<T>(25.0), z);
-    T p = pdiv(
-        internal::ppolevl<T, 6>::run(s, PP),
-        internal::ppolevl<T, 6>::run(s, PQ));
-    T q = pdiv(
-        internal::ppolevl<T, 7>::run(s, QP),
-        internal::ppolevl<T, 7>::run(s, QQ));
+    T p = pdiv(internal::ppolevl<T, 6>::run(s, PP), internal::ppolevl<T, 6>::run(s, PQ));
+    T q = pdiv(internal::ppolevl<T, 7>::run(s, QP), internal::ppolevl<T, 7>::run(s, QQ));
     T yn = padd(y, NEG_THPIO4);
     T w = pdiv(pset1<T>(-5.0), y);
     p = pmadd(p, pcos(yn), pmul(w, pmul(q, psin(yn))));
     T y_gt_five = pmul(p, pmul(SQ2OPI, prsqrt(y)));
     // j1 is an odd function. This implementation differs from cephes to
     // take this fact in to account. Cephes returns -j1(x) for y > 5 range.
-    y_gt_five = pselect(
-        pcmp_lt(x, pset1<T>(0.0)), pnegate(y_gt_five), y_gt_five);
+    y_gt_five = pselect(pcmp_lt(x, pset1<T>(0.0)), pnegate(y_gt_five), y_gt_five);
     return pselect(pcmp_le(y, pset1<T>(5.0)), y_le_five, y_gt_five);
   }
 };
 
 template <typename T>
 struct bessel_j1_impl {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T x) {
-    return generic_j1<T>::run(x);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T x) { return generic_j1<T>::run(x); }
 };
 
 template <typename T>
@@ -1683,18 +1400,14 @@
 
 template <typename T, typename ScalarType = typename unpacket_traits<T>::type>
 struct generic_y1 {
-  EIGEN_STATIC_ASSERT((internal::is_same<T, T>::value == false),
-                      THIS_TYPE_IS_NOT_SUPPORTED)
+  EIGEN_STATIC_ASSERT((internal::is_same<T, T>::value == false), THIS_TYPE_IS_NOT_SUPPORTED)
 
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T&) {
-    return ScalarType(0);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T&) { return ScalarType(0); }
 };
 
 template <typename T>
 struct generic_y1<T, float> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T& x) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T& x) {
     /* j1f.c
      *	Bessel function of second kind of order one
      *
@@ -1743,29 +1456,22 @@
      *
      */
 
-    const float YP[] = {8.061978323326852E-009f, -9.496460629917016E-007f,
-                        6.719543806674249E-005f, -2.641785726447862E-003f,
-                        4.202369946500099E-002f};
-    const float MO1[] = {6.913942741265801E-002f, -2.284801500053359E-001f,
-                        3.138238455499697E-001f, -2.102302420403875E-001f,
-                        5.435364690523026E-003f, 1.493389585089498E-001f,
-                        4.976029650847191E-006f, 7.978845453073848E-001f};
-    const float PH1[] = {-4.497014141919556E+001f, 5.073465654089319E+001f,
-                        -2.485774108720340E+001f, 7.222973196770240E+000f,
-                        -1.544842782180211E+000f, 3.503787691653334E-001f,
-                        -1.637986776941202E-001f, 3.749989509080821E-001f};
+    const float YP[] = {8.061978323326852E-009f, -9.496460629917016E-007f, 6.719543806674249E-005f,
+                        -2.641785726447862E-003f, 4.202369946500099E-002f};
+    const float MO1[] = {6.913942741265801E-002f,  -2.284801500053359E-001f, 3.138238455499697E-001f,
+                         -2.102302420403875E-001f, 5.435364690523026E-003f,  1.493389585089498E-001f,
+                         4.976029650847191E-006f,  7.978845453073848E-001f};
+    const float PH1[] = {-4.497014141919556E+001f, 5.073465654089319E+001f,  -2.485774108720340E+001f,
+                         7.222973196770240E+000f,  -1.544842782180211E+000f, 3.503787691653334E-001f,
+                         -1.637986776941202E-001f, 3.749989509080821E-001f};
     const T YO1 = pset1<T>(4.66539330185668857532f);
-    const T NEG_THPIO4F = pset1<T>(-2.35619449019234492885f);    /* -3*pi/4 */
-    const T TWOOPI = pset1<T>(0.636619772367581343075535f); /* 2/pi */
+    const T NEG_THPIO4F = pset1<T>(-2.35619449019234492885f); /* -3*pi/4 */
+    const T TWOOPI = pset1<T>(0.636619772367581343075535f);   /* 2/pi */
     const T NEG_MAXNUM = pset1<T>(-NumTraits<float>::infinity());
 
     T z = pmul(x, x);
     T x_le_two = pmul(psub(z, YO1), internal::ppolevl<T, 4>::run(z, YP));
-    x_le_two = pmadd(
-       x_le_two, x,
-       pmul(TWOOPI, pmadd(
-           generic_j1<T, float>::run(x), plog(x),
-           pdiv(pset1<T>(-1.0f), x))));
+    x_le_two = pmadd(x_le_two, x, pmul(TWOOPI, pmadd(generic_j1<T, float>::run(x), plog(x), pdiv(pset1<T>(-1.0f), x))));
     x_le_two = pselect(pcmp_lt(x, pset1<T>(0.0f)), NEG_MAXNUM, x_le_two);
 
     T q = pdiv(pset1<T>(1.0), x);
@@ -1780,8 +1486,7 @@
 
 template <typename T>
 struct generic_y1<T, double> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T& x) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T& x) {
     /*  j1.c
      *	Bessel function of second kind of order one
      *
@@ -1818,51 +1523,37 @@
      * (error criterion relative when |y1| > 1).
      *
      */
-    const double PP[] = {7.62125616208173112003E-4, 7.31397056940917570436E-2,
-                         1.12719608129684925192E0, 5.11207951146807644818E0,
-                         8.42404590141772420927E0, 5.21451598682361504063E0,
+    const double PP[] = {7.62125616208173112003E-4, 7.31397056940917570436E-2, 1.12719608129684925192E0,
+                         5.11207951146807644818E0,  8.42404590141772420927E0,  5.21451598682361504063E0,
                          1.00000000000000000254E0};
-    const double PQ[] = {5.71323128072548699714E-4, 6.88455908754495404082E-2,
-                         1.10514232634061696926E0, 5.07386386128601488557E0,
-                         8.39985554327604159757E0, 5.20982848682361821619E0,
+    const double PQ[] = {5.71323128072548699714E-4, 6.88455908754495404082E-2, 1.10514232634061696926E0,
+                         5.07386386128601488557E0,  8.39985554327604159757E0,  5.20982848682361821619E0,
                          9.99999999999999997461E-1};
-    const double QP[] = {5.10862594750176621635E-2, 4.98213872951233449420E0,
-                         7.58238284132545283818E1, 3.66779609360150777800E2,
-                         7.10856304998926107277E2, 5.97489612400613639965E2,
-                         2.11688757100572135698E2, 2.52070205858023719784E1};
-    const double QQ[] = {1.00000000000000000000E0, 7.42373277035675149943E1,
-                         1.05644886038262816351E3, 4.98641058337653607651E3,
-                         9.56231892404756170795E3, 7.99704160447350683650E3,
+    const double QP[] = {5.10862594750176621635E-2, 4.98213872951233449420E0, 7.58238284132545283818E1,
+                         3.66779609360150777800E2,  7.10856304998926107277E2, 5.97489612400613639965E2,
+                         2.11688757100572135698E2,  2.52070205858023719784E1};
+    const double QQ[] = {1.00000000000000000000E0, 7.42373277035675149943E1, 1.05644886038262816351E3,
+                         4.98641058337653607651E3, 9.56231892404756170795E3, 7.99704160447350683650E3,
                          2.82619278517639096600E3, 3.36093607810698293419E2};
-    const double YP[] = {1.26320474790178026440E9, -6.47355876379160291031E11,
-                         1.14509511541823727583E14, -8.12770255501325109621E15,
-                         2.02439475713594898196E17, -7.78877196265950026825E17};
-    const double YQ[] = {1.00000000000000000000E0, 5.94301592346128195359E2,
-                         2.35564092943068577943E5, 7.34811944459721705660E7,
-                         1.87601316108706159478E10, 3.88231277496238566008E12,
-                         6.20557727146953693363E14, 6.87141087355300489866E16,
-                         3.97270608116560655612E18};
+    const double YP[] = {1.26320474790178026440E9,   -6.47355876379160291031E11, 1.14509511541823727583E14,
+                         -8.12770255501325109621E15, 2.02439475713594898196E17,  -7.78877196265950026825E17};
+    const double YQ[] = {1.00000000000000000000E0,  5.94301592346128195359E2,  2.35564092943068577943E5,
+                         7.34811944459721705660E7,  1.87601316108706159478E10, 3.88231277496238566008E12,
+                         6.20557727146953693363E14, 6.87141087355300489866E16, 3.97270608116560655612E18};
     const T SQ2OPI = pset1<T>(.79788456080286535588);
-    const T NEG_THPIO4 = pset1<T>(-2.35619449019234492885);    /* -3*pi/4 */
-    const T TWOOPI = pset1<T>(0.636619772367581343075535); /* 2/pi */
+    const T NEG_THPIO4 = pset1<T>(-2.35619449019234492885); /* -3*pi/4 */
+    const T TWOOPI = pset1<T>(0.636619772367581343075535);  /* 2/pi */
     const T NEG_MAXNUM = pset1<T>(-NumTraits<double>::infinity());
 
     T z = pmul(x, x);
-    T x_le_five = pdiv(internal::ppolevl<T, 5>::run(z, YP),
-                   internal::ppolevl<T, 8>::run(z, YQ));
-    x_le_five = pmadd(
-        x_le_five, x, pmul(
-            TWOOPI, pmadd(generic_j1<T, double>::run(x), plog(x),
-                          pdiv(pset1<T>(-1.0), x))));
+    T x_le_five = pdiv(internal::ppolevl<T, 5>::run(z, YP), internal::ppolevl<T, 8>::run(z, YQ));
+    x_le_five =
+        pmadd(x_le_five, x, pmul(TWOOPI, pmadd(generic_j1<T, double>::run(x), plog(x), pdiv(pset1<T>(-1.0), x))));
 
     x_le_five = pselect(pcmp_le(x, pset1<T>(0.0)), NEG_MAXNUM, x_le_five);
     T s = pdiv(pset1<T>(25.0), z);
-    T p = pdiv(
-        internal::ppolevl<T, 6>::run(s, PP),
-        internal::ppolevl<T, 6>::run(s, PQ));
-    T q = pdiv(
-        internal::ppolevl<T, 7>::run(s, QP),
-        internal::ppolevl<T, 7>::run(s, QQ));
+    T p = pdiv(internal::ppolevl<T, 6>::run(s, PP), internal::ppolevl<T, 6>::run(s, PQ));
+    T q = pdiv(internal::ppolevl<T, 7>::run(s, QP), internal::ppolevl<T, 7>::run(s, QQ));
     T xn = padd(x, NEG_THPIO4);
     T w = pdiv(pset1<T>(5.0), x);
     p = pmadd(p, psin(xn), pmul(w, pmul(q, pcos(xn))));
@@ -1873,10 +1564,7 @@
 
 template <typename T>
 struct bessel_y1_impl {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T x) {
-    return generic_y1<T>::run(x);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T x) { return generic_y1<T>::run(x); }
 };
 
 }  // end namespace internal
@@ -1884,74 +1572,62 @@
 namespace numext {
 
 template <typename Scalar>
-EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(bessel_i0, Scalar)
-    bessel_i0(const Scalar& x) {
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(bessel_i0, Scalar) bessel_i0(const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(bessel_i0, Scalar)::run(x);
 }
 
 template <typename Scalar>
-EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(bessel_i0e, Scalar)
-    bessel_i0e(const Scalar& x) {
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(bessel_i0e, Scalar) bessel_i0e(const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(bessel_i0e, Scalar)::run(x);
 }
 
 template <typename Scalar>
-EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(bessel_i1, Scalar)
-    bessel_i1(const Scalar& x) {
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(bessel_i1, Scalar) bessel_i1(const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(bessel_i1, Scalar)::run(x);
 }
 
 template <typename Scalar>
-EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(bessel_i1e, Scalar)
-    bessel_i1e(const Scalar& x) {
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(bessel_i1e, Scalar) bessel_i1e(const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(bessel_i1e, Scalar)::run(x);
 }
 
 template <typename Scalar>
-EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(bessel_k0, Scalar)
-    bessel_k0(const Scalar& x) {
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(bessel_k0, Scalar) bessel_k0(const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(bessel_k0, Scalar)::run(x);
 }
 
 template <typename Scalar>
-EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(bessel_k0e, Scalar)
-    bessel_k0e(const Scalar& x) {
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(bessel_k0e, Scalar) bessel_k0e(const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(bessel_k0e, Scalar)::run(x);
 }
 
 template <typename Scalar>
-EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(bessel_k1, Scalar)
-    bessel_k1(const Scalar& x) {
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(bessel_k1, Scalar) bessel_k1(const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(bessel_k1, Scalar)::run(x);
 }
 
 template <typename Scalar>
-EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(bessel_k1e, Scalar)
-    bessel_k1e(const Scalar& x) {
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(bessel_k1e, Scalar) bessel_k1e(const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(bessel_k1e, Scalar)::run(x);
 }
 
 template <typename Scalar>
-EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(bessel_j0, Scalar)
-    bessel_j0(const Scalar& x) {
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(bessel_j0, Scalar) bessel_j0(const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(bessel_j0, Scalar)::run(x);
 }
 
 template <typename Scalar>
-EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(bessel_y0, Scalar)
-    bessel_y0(const Scalar& x) {
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(bessel_y0, Scalar) bessel_y0(const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(bessel_y0, Scalar)::run(x);
 }
 
 template <typename Scalar>
-EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(bessel_j1, Scalar)
-    bessel_j1(const Scalar& x) {
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(bessel_j1, Scalar) bessel_j1(const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(bessel_j1, Scalar)::run(x);
 }
 
 template <typename Scalar>
-EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(bessel_y1, Scalar)
-    bessel_y1(const Scalar& x) {
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(bessel_y1, Scalar) bessel_y1(const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(bessel_y1, Scalar)::run(x);
 }
 
diff --git a/unsupported/Eigen/src/SpecialFunctions/BesselFunctionsPacketMath.h b/unsupported/Eigen/src/SpecialFunctions/BesselFunctionsPacketMath.h
index 95d0137..1c325fc 100644
--- a/unsupported/Eigen/src/SpecialFunctions/BesselFunctionsPacketMath.h
+++ b/unsupported/Eigen/src/SpecialFunctions/BesselFunctionsPacketMath.h
@@ -20,102 +20,89 @@
 /** \internal \returns the exponentially scaled modified Bessel function of
  * order zero i0(\a a) (coeff-wise) */
 template <typename Packet>
-EIGEN_DEVICE_FUNC EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pbessel_i0(const Packet& x) {
+EIGEN_DEVICE_FUNC EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pbessel_i0(const Packet& x) {
   return numext::bessel_i0(x);
 }
 
 /** \internal \returns the exponentially scaled modified Bessel function of
  * order zero i0e(\a a) (coeff-wise) */
 template <typename Packet>
-EIGEN_DEVICE_FUNC EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pbessel_i0e(const Packet& x) {
+EIGEN_DEVICE_FUNC EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pbessel_i0e(const Packet& x) {
   return numext::bessel_i0e(x);
 }
 
 /** \internal \returns the exponentially scaled modified Bessel function of
  * order one i1(\a a) (coeff-wise) */
 template <typename Packet>
-EIGEN_DEVICE_FUNC EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pbessel_i1(const Packet& x) {
+EIGEN_DEVICE_FUNC EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pbessel_i1(const Packet& x) {
   return numext::bessel_i1(x);
 }
 
 /** \internal \returns the exponentially scaled modified Bessel function of
  * order one i1e(\a a) (coeff-wise) */
 template <typename Packet>
-EIGEN_DEVICE_FUNC EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pbessel_i1e(const Packet& x) {
+EIGEN_DEVICE_FUNC EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pbessel_i1e(const Packet& x) {
   return numext::bessel_i1e(x);
 }
 
 /** \internal \returns the exponentially scaled modified Bessel function of
  * order zero j0(\a a) (coeff-wise) */
 template <typename Packet>
-EIGEN_DEVICE_FUNC EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pbessel_j0(const Packet& x) {
+EIGEN_DEVICE_FUNC EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pbessel_j0(const Packet& x) {
   return numext::bessel_j0(x);
 }
 
 /** \internal \returns the exponentially scaled modified Bessel function of
  * order zero j1(\a a) (coeff-wise) */
 template <typename Packet>
-EIGEN_DEVICE_FUNC EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pbessel_j1(const Packet& x) {
+EIGEN_DEVICE_FUNC EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pbessel_j1(const Packet& x) {
   return numext::bessel_j1(x);
 }
 
 /** \internal \returns the exponentially scaled modified Bessel function of
  * order one y0(\a a) (coeff-wise) */
 template <typename Packet>
-EIGEN_DEVICE_FUNC EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pbessel_y0(const Packet& x) {
+EIGEN_DEVICE_FUNC EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pbessel_y0(const Packet& x) {
   return numext::bessel_y0(x);
 }
 
 /** \internal \returns the exponentially scaled modified Bessel function of
  * order one y1(\a a) (coeff-wise) */
 template <typename Packet>
-EIGEN_DEVICE_FUNC EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pbessel_y1(const Packet& x) {
+EIGEN_DEVICE_FUNC EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pbessel_y1(const Packet& x) {
   return numext::bessel_y1(x);
 }
 
 /** \internal \returns the exponentially scaled modified Bessel function of
  * order zero k0(\a a) (coeff-wise) */
 template <typename Packet>
-EIGEN_DEVICE_FUNC EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pbessel_k0(const Packet& x) {
+EIGEN_DEVICE_FUNC EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pbessel_k0(const Packet& x) {
   return numext::bessel_k0(x);
 }
 
 /** \internal \returns the exponentially scaled modified Bessel function of
  * order zero k0e(\a a) (coeff-wise) */
 template <typename Packet>
-EIGEN_DEVICE_FUNC EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pbessel_k0e(const Packet& x) {
+EIGEN_DEVICE_FUNC EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pbessel_k0e(const Packet& x) {
   return numext::bessel_k0e(x);
 }
 
 /** \internal \returns the exponentially scaled modified Bessel function of
  * order one k1e(\a a) (coeff-wise) */
 template <typename Packet>
-EIGEN_DEVICE_FUNC EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pbessel_k1(const Packet& x) {
+EIGEN_DEVICE_FUNC EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pbessel_k1(const Packet& x) {
   return numext::bessel_k1(x);
 }
 
 /** \internal \returns the exponentially scaled modified Bessel function of
  * order one k1e(\a a) (coeff-wise) */
 template <typename Packet>
-EIGEN_DEVICE_FUNC EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pbessel_k1e(const Packet& x) {
+EIGEN_DEVICE_FUNC EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pbessel_k1e(const Packet& x) {
   return numext::bessel_k1e(x);
 }
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_BESSELFUNCTIONS_PACKETMATH_H
-
+#endif  // EIGEN_BESSELFUNCTIONS_PACKETMATH_H
diff --git a/unsupported/Eigen/src/SpecialFunctions/HipVectorCompatibility.h b/unsupported/Eigen/src/SpecialFunctions/HipVectorCompatibility.h
index 1aa8263..9119335 100644
--- a/unsupported/Eigen/src/SpecialFunctions/HipVectorCompatibility.h
+++ b/unsupported/Eigen/src/SpecialFunctions/HipVectorCompatibility.h
@@ -2,8 +2,9 @@
 #define HIP_VECTOR_COMPATIBILITY_H
 
 namespace hip_impl {
-  template <typename, typename, unsigned int> struct Scalar_accessor;
-}   // end namespace hip_impl
+template <typename, typename, unsigned int>
+struct Scalar_accessor;
+}  // end namespace hip_impl
 
 // IWYU pragma: private
 #include "./InternalHeaderCheck.h"
@@ -11,19 +12,19 @@
 namespace Eigen {
 namespace internal {
 
-#define HIP_SCALAR_ACCESSOR_BUILDER(NAME) \
-template <typename T, typename U, unsigned int n> \
-struct NAME <hip_impl::Scalar_accessor<T, U, n>> : NAME <T> {};
+#define HIP_SCALAR_ACCESSOR_BUILDER(NAME)           \
+  template <typename T, typename U, unsigned int n> \
+  struct NAME<hip_impl::Scalar_accessor<T, U, n>> : NAME<T> {};
 
-#define HIP_SCALAR_ACCESSOR_BUILDER_RETVAL(NAME) \
-template <typename T, typename U, unsigned int n> \
-struct NAME##_impl <hip_impl::Scalar_accessor<T, U, n>> : NAME##_impl <T> {}; \
-template <typename T, typename U, unsigned int n> \
-struct NAME##_retval <hip_impl::Scalar_accessor<T, U, n>> : NAME##_retval <T> {};
+#define HIP_SCALAR_ACCESSOR_BUILDER_RETVAL(NAME)                              \
+  template <typename T, typename U, unsigned int n>                           \
+  struct NAME##_impl<hip_impl::Scalar_accessor<T, U, n>> : NAME##_impl<T> {}; \
+  template <typename T, typename U, unsigned int n>                           \
+  struct NAME##_retval<hip_impl::Scalar_accessor<T, U, n>> : NAME##_retval<T> {};
 
-#define HIP_SCALAR_ACCESSOR_BUILDER_IGAMMA(NAME) \
-template <typename T, typename U, unsigned int n, IgammaComputationMode mode> \
-struct NAME <hip_impl::Scalar_accessor<T, U, n>, mode> : NAME <T, mode> {};
+#define HIP_SCALAR_ACCESSOR_BUILDER_IGAMMA(NAME)                                \
+  template <typename T, typename U, unsigned int n, IgammaComputationMode mode> \
+  struct NAME<hip_impl::Scalar_accessor<T, U, n>, mode> : NAME<T, mode> {};
 
 #if EIGEN_HAS_C99_MATH
 HIP_SCALAR_ACCESSOR_BUILDER(betainc_helper)
diff --git a/unsupported/Eigen/src/SpecialFunctions/InternalHeaderCheck.h b/unsupported/Eigen/src/SpecialFunctions/InternalHeaderCheck.h
index c80ebd8..a5ef51a 100644
--- a/unsupported/Eigen/src/SpecialFunctions/InternalHeaderCheck.h
+++ b/unsupported/Eigen/src/SpecialFunctions/InternalHeaderCheck.h
@@ -1,3 +1,4 @@
 #ifndef EIGEN_SPECIALFUNCTIONS_MODULE_H
-#error "Please include unsupported/Eigen/SpecialFunctions instead of including headers inside the src directory directly."
+#error \
+    "Please include unsupported/Eigen/SpecialFunctions instead of including headers inside the src directory directly."
 #endif
diff --git a/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsArrayAPI.h b/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsArrayAPI.h
index bcae4a5..0920d27 100644
--- a/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsArrayAPI.h
+++ b/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsArrayAPI.h
@@ -7,7 +7,6 @@
 // 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_SPECIALFUNCTIONS_ARRAYAPI_H
 #define EIGEN_SPECIALFUNCTIONS_ARRAYAPI_H
 
@@ -17,154 +16,144 @@
 namespace Eigen {
 
 /** \cpp11 \returns an expression of the coefficient-wise igamma(\a a, \a x) to the given arrays.
-  *
-  * This function computes the coefficient-wise incomplete gamma function.
-  *
-  * \note This function supports only float and double scalar types in c++11 mode. To support other scalar types,
-  * or float/double in non c++11 mode, the user has to provide implementations of igammac(T,T) for any scalar
-  * type T to be supported.
-  *
-  * \sa Eigen::igammac(), Eigen::lgamma()
-  */
-template<typename Derived,typename ExponentDerived>
-EIGEN_STRONG_INLINE const Eigen::CwiseBinaryOp<Eigen::internal::scalar_igamma_op<typename Derived::Scalar>, const Derived, const ExponentDerived>
-igamma(const Eigen::ArrayBase<Derived>& a, const Eigen::ArrayBase<ExponentDerived>& x)
-{
-  return Eigen::CwiseBinaryOp<Eigen::internal::scalar_igamma_op<typename Derived::Scalar>, const Derived, const ExponentDerived>(
-    a.derived(),
-    x.derived()
-  );
+ *
+ * This function computes the coefficient-wise incomplete gamma function.
+ *
+ * \note This function supports only float and double scalar types in c++11 mode. To support other scalar types,
+ * or float/double in non c++11 mode, the user has to provide implementations of igammac(T,T) for any scalar
+ * type T to be supported.
+ *
+ * \sa Eigen::igammac(), Eigen::lgamma()
+ */
+template <typename Derived, typename ExponentDerived>
+EIGEN_STRONG_INLINE const Eigen::CwiseBinaryOp<Eigen::internal::scalar_igamma_op<typename Derived::Scalar>,
+                                               const Derived, const ExponentDerived>
+igamma(const Eigen::ArrayBase<Derived>& a, const Eigen::ArrayBase<ExponentDerived>& x) {
+  return Eigen::CwiseBinaryOp<Eigen::internal::scalar_igamma_op<typename Derived::Scalar>, const Derived,
+                              const ExponentDerived>(a.derived(), x.derived());
 }
 
 /** \cpp11 \returns an expression of the coefficient-wise igamma_der_a(\a a, \a x) to the given arrays.
-  *
-  * This function computes the coefficient-wise derivative of the incomplete
-  * gamma function with respect to the parameter a.
-  *
-  * \note This function supports only float and double scalar types in c++11
-  * mode. To support other scalar types,
-  * or float/double in non c++11 mode, the user has to provide implementations
-  * of igamma_der_a(T,T) for any scalar
-  * type T to be supported.
-  *
-  * \sa Eigen::igamma(), Eigen::lgamma()
-  */
+ *
+ * This function computes the coefficient-wise derivative of the incomplete
+ * gamma function with respect to the parameter a.
+ *
+ * \note This function supports only float and double scalar types in c++11
+ * mode. To support other scalar types,
+ * or float/double in non c++11 mode, the user has to provide implementations
+ * of igamma_der_a(T,T) for any scalar
+ * type T to be supported.
+ *
+ * \sa Eigen::igamma(), Eigen::lgamma()
+ */
 template <typename Derived, typename ExponentDerived>
-EIGEN_STRONG_INLINE const Eigen::CwiseBinaryOp<Eigen::internal::scalar_igamma_der_a_op<typename Derived::Scalar>, const Derived, const ExponentDerived>
+EIGEN_STRONG_INLINE const Eigen::CwiseBinaryOp<Eigen::internal::scalar_igamma_der_a_op<typename Derived::Scalar>,
+                                               const Derived, const ExponentDerived>
 igamma_der_a(const Eigen::ArrayBase<Derived>& a, const Eigen::ArrayBase<ExponentDerived>& x) {
-  return Eigen::CwiseBinaryOp<Eigen::internal::scalar_igamma_der_a_op<typename Derived::Scalar>, const Derived, const ExponentDerived>(
-    a.derived(),
-    x.derived());
+  return Eigen::CwiseBinaryOp<Eigen::internal::scalar_igamma_der_a_op<typename Derived::Scalar>, const Derived,
+                              const ExponentDerived>(a.derived(), x.derived());
 }
 
-/** \cpp11 \returns an expression of the coefficient-wise gamma_sample_der_alpha(\a alpha, \a sample) to the given arrays.
-  *
-  * This function computes the coefficient-wise derivative of the sample
-  * of a Gamma(alpha, 1) random variable with respect to the parameter alpha.
-  *
-  * \note This function supports only float and double scalar types in c++11
-  * mode. To support other scalar types,
-  * or float/double in non c++11 mode, the user has to provide implementations
-  * of gamma_sample_der_alpha(T,T) for any scalar
-  * type T to be supported.
-  *
-  * \sa Eigen::igamma(), Eigen::lgamma()
-  */
+/** \cpp11 \returns an expression of the coefficient-wise gamma_sample_der_alpha(\a alpha, \a sample) to the given
+ * arrays.
+ *
+ * This function computes the coefficient-wise derivative of the sample
+ * of a Gamma(alpha, 1) random variable with respect to the parameter alpha.
+ *
+ * \note This function supports only float and double scalar types in c++11
+ * mode. To support other scalar types,
+ * or float/double in non c++11 mode, the user has to provide implementations
+ * of gamma_sample_der_alpha(T,T) for any scalar
+ * type T to be supported.
+ *
+ * \sa Eigen::igamma(), Eigen::lgamma()
+ */
 template <typename AlphaDerived, typename SampleDerived>
-EIGEN_STRONG_INLINE const Eigen::CwiseBinaryOp<Eigen::internal::scalar_gamma_sample_der_alpha_op<typename AlphaDerived::Scalar>, const AlphaDerived, const SampleDerived>
-gamma_sample_der_alpha(const Eigen::ArrayBase<AlphaDerived>& alpha, const Eigen::ArrayBase<SampleDerived>& sample) {
-  return Eigen::CwiseBinaryOp<Eigen::internal::scalar_gamma_sample_der_alpha_op<typename AlphaDerived::Scalar>, const AlphaDerived, const SampleDerived>(
-      alpha.derived(),
-      sample.derived());
+EIGEN_STRONG_INLINE const
+    Eigen::CwiseBinaryOp<Eigen::internal::scalar_gamma_sample_der_alpha_op<typename AlphaDerived::Scalar>,
+                         const AlphaDerived, const SampleDerived>
+    gamma_sample_der_alpha(const Eigen::ArrayBase<AlphaDerived>& alpha, const Eigen::ArrayBase<SampleDerived>& sample) {
+  return Eigen::CwiseBinaryOp<Eigen::internal::scalar_gamma_sample_der_alpha_op<typename AlphaDerived::Scalar>,
+                              const AlphaDerived, const SampleDerived>(alpha.derived(), sample.derived());
 }
 
 /** \cpp11 \returns an expression of the coefficient-wise igammac(\a a, \a x) to the given arrays.
-  *
-  * This function computes the coefficient-wise complementary incomplete gamma function.
-  *
-  * \note This function supports only float and double scalar types in c++11 mode. To support other scalar types,
-  * or float/double in non c++11 mode, the user has to provide implementations of igammac(T,T) for any scalar
-  * type T to be supported.
-  *
-  * \sa Eigen::igamma(), Eigen::lgamma()
-  */
-template<typename Derived,typename ExponentDerived>
-EIGEN_STRONG_INLINE const Eigen::CwiseBinaryOp<Eigen::internal::scalar_igammac_op<typename Derived::Scalar>, const Derived, const ExponentDerived>
-igammac(const Eigen::ArrayBase<Derived>& a, const Eigen::ArrayBase<ExponentDerived>& x)
-{
-  return Eigen::CwiseBinaryOp<Eigen::internal::scalar_igammac_op<typename Derived::Scalar>, const Derived, const ExponentDerived>(
-    a.derived(),
-    x.derived()
-  );
+ *
+ * This function computes the coefficient-wise complementary incomplete gamma function.
+ *
+ * \note This function supports only float and double scalar types in c++11 mode. To support other scalar types,
+ * or float/double in non c++11 mode, the user has to provide implementations of igammac(T,T) for any scalar
+ * type T to be supported.
+ *
+ * \sa Eigen::igamma(), Eigen::lgamma()
+ */
+template <typename Derived, typename ExponentDerived>
+EIGEN_STRONG_INLINE const Eigen::CwiseBinaryOp<Eigen::internal::scalar_igammac_op<typename Derived::Scalar>,
+                                               const Derived, const ExponentDerived>
+igammac(const Eigen::ArrayBase<Derived>& a, const Eigen::ArrayBase<ExponentDerived>& x) {
+  return Eigen::CwiseBinaryOp<Eigen::internal::scalar_igammac_op<typename Derived::Scalar>, const Derived,
+                              const ExponentDerived>(a.derived(), x.derived());
 }
 
 /** \cpp11 \returns an expression of the coefficient-wise polygamma(\a n, \a x) to the given arrays.
-  *
-  * It returns the \a n -th derivative of the digamma(psi) evaluated at \c x.
-  *
-  * \note This function supports only float and double scalar types in c++11 mode. To support other scalar types,
-  * or float/double in non c++11 mode, the user has to provide implementations of polygamma(T,T) for any scalar
-  * type T to be supported.
-  *
-  * \sa Eigen::digamma()
-  */
+ *
+ * It returns the \a n -th derivative of the digamma(psi) evaluated at \c x.
+ *
+ * \note This function supports only float and double scalar types in c++11 mode. To support other scalar types,
+ * or float/double in non c++11 mode, the user has to provide implementations of polygamma(T,T) for any scalar
+ * type T to be supported.
+ *
+ * \sa Eigen::digamma()
+ */
 // * \warning Be careful with the order of the parameters: x.polygamma(n) is equivalent to polygamma(n,x)
 // * \sa ArrayBase::polygamma()
-template<typename DerivedN,typename DerivedX>
-EIGEN_STRONG_INLINE const Eigen::CwiseBinaryOp<Eigen::internal::scalar_polygamma_op<typename DerivedX::Scalar>, const DerivedN, const DerivedX>
-polygamma(const Eigen::ArrayBase<DerivedN>& n, const Eigen::ArrayBase<DerivedX>& x)
-{
-  return Eigen::CwiseBinaryOp<Eigen::internal::scalar_polygamma_op<typename DerivedX::Scalar>, const DerivedN, const DerivedX>(
-    n.derived(),
-    x.derived()
-  );
+template <typename DerivedN, typename DerivedX>
+EIGEN_STRONG_INLINE const Eigen::CwiseBinaryOp<Eigen::internal::scalar_polygamma_op<typename DerivedX::Scalar>,
+                                               const DerivedN, const DerivedX>
+polygamma(const Eigen::ArrayBase<DerivedN>& n, const Eigen::ArrayBase<DerivedX>& x) {
+  return Eigen::CwiseBinaryOp<Eigen::internal::scalar_polygamma_op<typename DerivedX::Scalar>, const DerivedN,
+                              const DerivedX>(n.derived(), x.derived());
 }
 
 /** \cpp11 \returns an expression of the coefficient-wise betainc(\a x, \a a, \a b) to the given arrays.
-  *
-  * This function computes the regularized incomplete beta function (integral).
-  *
-  * \note This function supports only float and double scalar types in c++11 mode. To support other scalar types,
-  * or float/double in non c++11 mode, the user has to provide implementations of betainc(T,T,T) for any scalar
-  * type T to be supported.
-  *
-  * \sa Eigen::betainc(), Eigen::lgamma()
-  */
-template<typename ArgADerived, typename ArgBDerived, typename ArgXDerived>
-EIGEN_STRONG_INLINE const Eigen::CwiseTernaryOp<Eigen::internal::scalar_betainc_op<typename ArgXDerived::Scalar>, const ArgADerived, const ArgBDerived, const ArgXDerived>
-betainc(const Eigen::ArrayBase<ArgADerived>& a, const Eigen::ArrayBase<ArgBDerived>& b, const Eigen::ArrayBase<ArgXDerived>& x)
-{
-  return Eigen::CwiseTernaryOp<Eigen::internal::scalar_betainc_op<typename ArgXDerived::Scalar>, const ArgADerived, const ArgBDerived, const ArgXDerived>(
-    a.derived(),
-    b.derived(),
-    x.derived()
-  );
+ *
+ * This function computes the regularized incomplete beta function (integral).
+ *
+ * \note This function supports only float and double scalar types in c++11 mode. To support other scalar types,
+ * or float/double in non c++11 mode, the user has to provide implementations of betainc(T,T,T) for any scalar
+ * type T to be supported.
+ *
+ * \sa Eigen::betainc(), Eigen::lgamma()
+ */
+template <typename ArgADerived, typename ArgBDerived, typename ArgXDerived>
+EIGEN_STRONG_INLINE const Eigen::CwiseTernaryOp<Eigen::internal::scalar_betainc_op<typename ArgXDerived::Scalar>,
+                                                const ArgADerived, const ArgBDerived, const ArgXDerived>
+betainc(const Eigen::ArrayBase<ArgADerived>& a, const Eigen::ArrayBase<ArgBDerived>& b,
+        const Eigen::ArrayBase<ArgXDerived>& x) {
+  return Eigen::CwiseTernaryOp<Eigen::internal::scalar_betainc_op<typename ArgXDerived::Scalar>, const ArgADerived,
+                               const ArgBDerived, const ArgXDerived>(a.derived(), b.derived(), x.derived());
 }
 
-
 /** \returns an expression of the coefficient-wise zeta(\a x, \a q) to the given arrays.
-  *
-  * It returns the Riemann zeta function of two arguments \a x and \a q:
-  *
-  * \param x is the exponent, it must be > 1
-  * \param q is the shift, it must be > 0
-  *
-  * \note This function supports only float and double scalar types. To support other scalar types, the user has
-  * to provide implementations of zeta(T,T) for any scalar type T to be supported.
-  *
-  * \sa ArrayBase::zeta()
-  */
-template<typename DerivedX,typename DerivedQ>
-EIGEN_STRONG_INLINE const Eigen::CwiseBinaryOp<Eigen::internal::scalar_zeta_op<typename DerivedX::Scalar>, const DerivedX, const DerivedQ>
-zeta(const Eigen::ArrayBase<DerivedX>& x, const Eigen::ArrayBase<DerivedQ>& q)
-{
-  return Eigen::CwiseBinaryOp<Eigen::internal::scalar_zeta_op<typename DerivedX::Scalar>, const DerivedX, const DerivedQ>(
-    x.derived(),
-    q.derived()
-  );
+ *
+ * It returns the Riemann zeta function of two arguments \a x and \a q:
+ *
+ * \param x is the exponent, it must be > 1
+ * \param q is the shift, it must be > 0
+ *
+ * \note This function supports only float and double scalar types. To support other scalar types, the user has
+ * to provide implementations of zeta(T,T) for any scalar type T to be supported.
+ *
+ * \sa ArrayBase::zeta()
+ */
+template <typename DerivedX, typename DerivedQ>
+EIGEN_STRONG_INLINE const
+    Eigen::CwiseBinaryOp<Eigen::internal::scalar_zeta_op<typename DerivedX::Scalar>, const DerivedX, const DerivedQ>
+    zeta(const Eigen::ArrayBase<DerivedX>& x, const Eigen::ArrayBase<DerivedQ>& q) {
+  return Eigen::CwiseBinaryOp<Eigen::internal::scalar_zeta_op<typename DerivedX::Scalar>, const DerivedX,
+                              const DerivedQ>(x.derived(), q.derived());
 }
 
+}  // end namespace Eigen
 
-} // end namespace Eigen
-
-#endif // EIGEN_SPECIALFUNCTIONS_ARRAYAPI_H
+#endif  // EIGEN_SPECIALFUNCTIONS_ARRAYAPI_H
diff --git a/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsBFloat16.h b/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsBFloat16.h
index 802b818..90babae 100644
--- a/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsBFloat16.h
+++ b/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsBFloat16.h
@@ -15,28 +15,36 @@
 namespace numext {
 
 #if EIGEN_HAS_C99_MATH
-template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::bfloat16 lgamma(const Eigen::bfloat16& a) {
+template <>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::bfloat16 lgamma(const Eigen::bfloat16& a) {
   return Eigen::bfloat16(Eigen::numext::lgamma(static_cast<float>(a)));
 }
-template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::bfloat16 digamma(const Eigen::bfloat16& a) {
+template <>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::bfloat16 digamma(const Eigen::bfloat16& a) {
   return Eigen::bfloat16(Eigen::numext::digamma(static_cast<float>(a)));
 }
-template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::bfloat16 zeta(const Eigen::bfloat16& x, const Eigen::bfloat16& q) {
+template <>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::bfloat16 zeta(const Eigen::bfloat16& x, const Eigen::bfloat16& q) {
   return Eigen::bfloat16(Eigen::numext::zeta(static_cast<float>(x), static_cast<float>(q)));
 }
-template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::bfloat16 polygamma(const Eigen::bfloat16& n, const Eigen::bfloat16& x) {
+template <>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::bfloat16 polygamma(const Eigen::bfloat16& n, const Eigen::bfloat16& x) {
   return Eigen::bfloat16(Eigen::numext::polygamma(static_cast<float>(n), static_cast<float>(x)));
 }
-template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::bfloat16 erf(const Eigen::bfloat16& a) {
+template <>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::bfloat16 erf(const Eigen::bfloat16& a) {
   return Eigen::bfloat16(Eigen::numext::erf(static_cast<float>(a)));
 }
-template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::bfloat16 erfc(const Eigen::bfloat16& a) {
+template <>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::bfloat16 erfc(const Eigen::bfloat16& a) {
   return Eigen::bfloat16(Eigen::numext::erfc(static_cast<float>(a)));
 }
-template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::bfloat16 ndtri(const Eigen::bfloat16& a) {
+template <>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::bfloat16 ndtri(const Eigen::bfloat16& a) {
   return Eigen::bfloat16(Eigen::numext::ndtri(static_cast<float>(a)));
 }
-template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::bfloat16 igamma(const Eigen::bfloat16& a, const Eigen::bfloat16& x) {
+template <>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::bfloat16 igamma(const Eigen::bfloat16& a, const Eigen::bfloat16& x) {
   return Eigen::bfloat16(Eigen::numext::igamma(static_cast<float>(a), static_cast<float>(x)));
 }
 template <>
@@ -44,13 +52,17 @@
   return Eigen::bfloat16(Eigen::numext::igamma_der_a(static_cast<float>(a), static_cast<float>(x)));
 }
 template <>
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::bfloat16 gamma_sample_der_alpha(const Eigen::bfloat16& alpha, const Eigen::bfloat16& sample) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::bfloat16 gamma_sample_der_alpha(const Eigen::bfloat16& alpha,
+                                                                             const Eigen::bfloat16& sample) {
   return Eigen::bfloat16(Eigen::numext::gamma_sample_der_alpha(static_cast<float>(alpha), static_cast<float>(sample)));
 }
-template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::bfloat16 igammac(const Eigen::bfloat16& a, const Eigen::bfloat16& x) {
+template <>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::bfloat16 igammac(const Eigen::bfloat16& a, const Eigen::bfloat16& x) {
   return Eigen::bfloat16(Eigen::numext::igammac(static_cast<float>(a), static_cast<float>(x)));
 }
-template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::bfloat16 betainc(const Eigen::bfloat16& a, const Eigen::bfloat16& b, const Eigen::bfloat16& x) {
+template <>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::bfloat16 betainc(const Eigen::bfloat16& a, const Eigen::bfloat16& b,
+                                                              const Eigen::bfloat16& x) {
   return Eigen::bfloat16(Eigen::numext::betainc(static_cast<float>(a), static_cast<float>(b), static_cast<float>(x)));
 }
 #endif
diff --git a/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsFunctors.h b/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsFunctors.h
index 7723831..483c9ae 100644
--- a/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsFunctors.h
+++ b/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsFunctors.h
@@ -18,23 +18,23 @@
 
 namespace internal {
 
-
 /** \internal
-  * \brief Template functor to compute the incomplete gamma function igamma(a, x)
-  *
-  * \sa class CwiseBinaryOp, Cwise::igamma
-  */
-template<typename Scalar> struct scalar_igamma_op : binary_op_base<Scalar,Scalar>
-{
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& x) const {
-    using numext::igamma; return igamma(a, x);
+ * \brief Template functor to compute the incomplete gamma function igamma(a, x)
+ *
+ * \sa class CwiseBinaryOp, Cwise::igamma
+ */
+template <typename Scalar>
+struct scalar_igamma_op : binary_op_base<Scalar, Scalar> {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a, const Scalar& x) const {
+    using numext::igamma;
+    return igamma(a, x);
   }
-  template<typename Packet>
+  template <typename Packet>
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& x) const {
     return internal::pigamma(a, x);
   }
 };
-template<typename Scalar>
+template <typename Scalar>
 struct functor_traits<scalar_igamma_op<Scalar> > {
   enum {
     // Guesstimate
@@ -44,11 +44,11 @@
 };
 
 /** \internal
-  * \brief Template functor to compute the derivative of the incomplete gamma
-  * function igamma_der_a(a, x)
-  *
-  * \sa class CwiseBinaryOp, Cwise::igamma_der_a
-  */
+ * \brief Template functor to compute the derivative of the incomplete gamma
+ * function igamma_der_a(a, x)
+ *
+ * \sa class CwiseBinaryOp, Cwise::igamma_der_a
+ */
 template <typename Scalar>
 struct scalar_igamma_der_a_op {
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a, const Scalar& x) const {
@@ -70,12 +70,12 @@
 };
 
 /** \internal
-  * \brief Template functor to compute the derivative of the sample
-  * of a Gamma(alpha, 1) random variable with respect to the parameter alpha
-  * gamma_sample_der_alpha(alpha, sample)
-  *
-  * \sa class CwiseBinaryOp, Cwise::gamma_sample_der_alpha
-  */
+ * \brief Template functor to compute the derivative of the sample
+ * of a Gamma(alpha, 1) random variable with respect to the parameter alpha
+ * gamma_sample_der_alpha(alpha, sample)
+ *
+ * \sa class CwiseBinaryOp, Cwise::gamma_sample_der_alpha
+ */
 template <typename Scalar>
 struct scalar_gamma_sample_der_alpha_op {
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& alpha, const Scalar& sample) const {
@@ -97,22 +97,22 @@
 };
 
 /** \internal
-  * \brief Template functor to compute the complementary incomplete gamma function igammac(a, x)
-  *
-  * \sa class CwiseBinaryOp, Cwise::igammac
-  */
-template<typename Scalar> struct scalar_igammac_op : binary_op_base<Scalar,Scalar>
-{
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& x) const {
-    using numext::igammac; return igammac(a, x);
+ * \brief Template functor to compute the complementary incomplete gamma function igammac(a, x)
+ *
+ * \sa class CwiseBinaryOp, Cwise::igammac
+ */
+template <typename Scalar>
+struct scalar_igammac_op : binary_op_base<Scalar, Scalar> {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a, const Scalar& x) const {
+    using numext::igammac;
+    return igammac(a, x);
   }
-  template<typename Packet>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& x) const
-  {
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& x) const {
     return internal::pigammac(a, x);
   }
 };
-template<typename Scalar>
+template <typename Scalar>
 struct functor_traits<scalar_igammac_op<Scalar> > {
   enum {
     // Guesstimate
@@ -121,22 +121,23 @@
   };
 };
 
-
 /** \internal
-  * \brief Template functor to compute the incomplete beta integral betainc(a, b, x)
-  *
-  */
-template<typename Scalar> struct scalar_betainc_op {
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& x, const Scalar& a, const Scalar& b) const {
-    using numext::betainc; return betainc(x, a, b);
+ * \brief Template functor to compute the incomplete beta integral betainc(a, b, x)
+ *
+ */
+template <typename Scalar>
+struct scalar_betainc_op {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& x, const Scalar& a,
+                                                                const Scalar& b) const {
+    using numext::betainc;
+    return betainc(x, a, b);
   }
-  template<typename Packet>
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& x, const Packet& a, const Packet& b) const
-  {
+  template <typename Packet>
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& x, const Packet& a, const Packet& b) const {
     return internal::pbetainc(x, a, b);
   }
 };
-template<typename Scalar>
+template <typename Scalar>
 struct functor_traits<scalar_betainc_op<Scalar> > {
   enum {
     // Guesstimate
@@ -145,22 +146,22 @@
   };
 };
 
-
 /** \internal
  * \brief Template functor to compute the natural log of the absolute
  * value of Gamma of a scalar
  * \sa class CwiseUnaryOp, Cwise::lgamma()
  */
-template<typename Scalar> struct scalar_lgamma_op {
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const {
-    using numext::lgamma; return lgamma(a);
+template <typename Scalar>
+struct scalar_lgamma_op {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const {
+    using numext::lgamma;
+    return lgamma(a);
   }
   typedef typename packet_traits<Scalar>::type Packet;
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a) const { return internal::plgamma(a); }
 };
-template<typename Scalar>
-struct functor_traits<scalar_lgamma_op<Scalar> >
-{
+template <typename Scalar>
+struct functor_traits<scalar_lgamma_op<Scalar> > {
   enum {
     // Guesstimate
     Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
@@ -172,16 +173,17 @@
  * \brief Template functor to compute psi, the derivative of lgamma of a scalar.
  * \sa class CwiseUnaryOp, Cwise::digamma()
  */
-template<typename Scalar> struct scalar_digamma_op {
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const {
-    using numext::digamma; return digamma(a);
+template <typename Scalar>
+struct scalar_digamma_op {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const {
+    using numext::digamma;
+    return digamma(a);
   }
   typedef typename packet_traits<Scalar>::type Packet;
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a) const { return internal::pdigamma(a); }
 };
-template<typename Scalar>
-struct functor_traits<scalar_digamma_op<Scalar> >
-{
+template <typename Scalar>
+struct functor_traits<scalar_digamma_op<Scalar> > {
   enum {
     // Guesstimate
     Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
@@ -193,53 +195,57 @@
  * \brief Template functor to compute the Riemann Zeta function of two arguments.
  * \sa class CwiseUnaryOp, Cwise::zeta()
  */
-template<typename Scalar> struct scalar_zeta_op {
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& x, const Scalar& q) const {
-        using numext::zeta; return zeta(x, q);
-    }
-    typedef typename packet_traits<Scalar>::type Packet;
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x, const Packet& q) const { return internal::pzeta(x, q); }
+template <typename Scalar>
+struct scalar_zeta_op {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& x, const Scalar& q) const {
+    using numext::zeta;
+    return zeta(x, q);
+  }
+  typedef typename packet_traits<Scalar>::type Packet;
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x, const Packet& q) const {
+    return internal::pzeta(x, q);
+  }
 };
-template<typename Scalar>
-struct functor_traits<scalar_zeta_op<Scalar> >
-{
-    enum {
-        // Guesstimate
-        Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
-        PacketAccess = packet_traits<Scalar>::HasZeta
-    };
+template <typename Scalar>
+struct functor_traits<scalar_zeta_op<Scalar> > {
+  enum {
+    // Guesstimate
+    Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
+    PacketAccess = packet_traits<Scalar>::HasZeta
+  };
 };
 
 /** \internal
  * \brief Template functor to compute the polygamma function.
  * \sa class CwiseUnaryOp, Cwise::polygamma()
  */
-template<typename Scalar> struct scalar_polygamma_op {
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& n, const Scalar& x) const {
-        using numext::polygamma; return polygamma(n, x);
-    }
-    typedef typename packet_traits<Scalar>::type Packet;
-    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& n, const Packet& x) const { return internal::ppolygamma(n, x); }
+template <typename Scalar>
+struct scalar_polygamma_op {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& n, const Scalar& x) const {
+    using numext::polygamma;
+    return polygamma(n, x);
+  }
+  typedef typename packet_traits<Scalar>::type Packet;
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& n, const Packet& x) const {
+    return internal::ppolygamma(n, x);
+  }
 };
-template<typename Scalar>
-struct functor_traits<scalar_polygamma_op<Scalar> >
-{
-    enum {
-        // Guesstimate
-        Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
-        PacketAccess = packet_traits<Scalar>::HasPolygamma
-    };
+template <typename Scalar>
+struct functor_traits<scalar_polygamma_op<Scalar> > {
+  enum {
+    // Guesstimate
+    Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
+    PacketAccess = packet_traits<Scalar>::HasPolygamma
+  };
 };
 
 /** \internal
  * \brief Template functor to compute the error function of a scalar
  * \sa class CwiseUnaryOp, ArrayBase::erf()
  */
-template<typename Scalar> struct scalar_erf_op {
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar
-  operator()(const Scalar& a) const {
-    return numext::erf(a);
-  }
+template <typename Scalar>
+struct scalar_erf_op {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const { return numext::erf(a); }
   template <typename Packet>
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const {
     return perf(x);
@@ -249,22 +255,19 @@
 struct functor_traits<scalar_erf_op<Scalar> > {
   enum {
     PacketAccess = packet_traits<Scalar>::HasErf,
-    Cost =
-        (PacketAccess
+    Cost = (PacketAccess
 #ifdef EIGEN_VECTORIZE_FMA
-             // TODO(rmlarsen): Move the FMA cost model to a central location.
-             // Haswell can issue 2 add/mul/madd per cycle.
-             // 10 pmadd, 2 pmul, 1 div, 2 other
-             ? (2 * NumTraits<Scalar>::AddCost +
-                7 * NumTraits<Scalar>::MulCost +
-                scalar_div_cost<Scalar, packet_traits<Scalar>::HasDiv>::value)
+                // TODO(rmlarsen): Move the FMA cost model to a central location.
+                // Haswell can issue 2 add/mul/madd per cycle.
+                // 10 pmadd, 2 pmul, 1 div, 2 other
+                ? (2 * NumTraits<Scalar>::AddCost + 7 * NumTraits<Scalar>::MulCost +
+                   scalar_div_cost<Scalar, packet_traits<Scalar>::HasDiv>::value)
 #else
-             ? (12 * NumTraits<Scalar>::AddCost +
-                12 * NumTraits<Scalar>::MulCost +
-                scalar_div_cost<Scalar, packet_traits<Scalar>::HasDiv>::value)
+                ? (12 * NumTraits<Scalar>::AddCost + 12 * NumTraits<Scalar>::MulCost +
+                   scalar_div_cost<Scalar, packet_traits<Scalar>::HasDiv>::value)
 #endif
-             // Assume for simplicity that this is as expensive as an exp().
-             : (functor_traits<scalar_exp_op<Scalar> >::Cost))
+                // Assume for simplicity that this is as expensive as an exp().
+                : (functor_traits<scalar_exp_op<Scalar> >::Cost))
   };
 };
 
@@ -273,16 +276,17 @@
  * of a scalar
  * \sa class CwiseUnaryOp, Cwise::erfc()
  */
-template<typename Scalar> struct scalar_erfc_op {
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const {
-    using numext::erfc; return erfc(a);
+template <typename Scalar>
+struct scalar_erfc_op {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const {
+    using numext::erfc;
+    return erfc(a);
   }
   typedef typename packet_traits<Scalar>::type Packet;
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a) const { return internal::perfc(a); }
 };
-template<typename Scalar>
-struct functor_traits<scalar_erfc_op<Scalar> >
-{
+template <typename Scalar>
+struct functor_traits<scalar_erfc_op<Scalar> > {
   enum {
     // Guesstimate
     Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
@@ -295,16 +299,17 @@
  * function of a scalar
  * \sa class CwiseUnaryOp, Cwise::ndtri()
  */
-template<typename Scalar> struct scalar_ndtri_op {
-  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const {
-    using numext::ndtri; return ndtri(a);
+template <typename Scalar>
+struct scalar_ndtri_op {
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const {
+    using numext::ndtri;
+    return ndtri(a);
   }
   typedef typename packet_traits<Scalar>::type Packet;
   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a) const { return internal::pndtri(a); }
 };
-template<typename Scalar>
-struct functor_traits<scalar_ndtri_op<Scalar> >
-{
+template <typename Scalar>
+struct functor_traits<scalar_ndtri_op<Scalar> > {
   enum {
     // On average, We are evaluating rational functions with degree N=9 in the
     // numerator and denominator. This results in 2*N additions and 2*N
@@ -314,8 +319,8 @@
   };
 };
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SPECIALFUNCTIONS_FUNCTORS_H
+#endif  // EIGEN_SPECIALFUNCTIONS_FUNCTORS_H
diff --git a/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsHalf.h b/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsHalf.h
index 195a9c7..baba848 100644
--- a/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsHalf.h
+++ b/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsHalf.h
@@ -15,28 +15,36 @@
 namespace numext {
 
 #if EIGEN_HAS_C99_MATH
-template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::half lgamma(const Eigen::half& a) {
+template <>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::half lgamma(const Eigen::half& a) {
   return Eigen::half(Eigen::numext::lgamma(static_cast<float>(a)));
 }
-template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::half digamma(const Eigen::half& a) {
+template <>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::half digamma(const Eigen::half& a) {
   return Eigen::half(Eigen::numext::digamma(static_cast<float>(a)));
 }
-template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::half zeta(const Eigen::half& x, const Eigen::half& q) {
+template <>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::half zeta(const Eigen::half& x, const Eigen::half& q) {
   return Eigen::half(Eigen::numext::zeta(static_cast<float>(x), static_cast<float>(q)));
 }
-template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::half polygamma(const Eigen::half& n, const Eigen::half& x) {
+template <>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::half polygamma(const Eigen::half& n, const Eigen::half& x) {
   return Eigen::half(Eigen::numext::polygamma(static_cast<float>(n), static_cast<float>(x)));
 }
-template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::half erf(const Eigen::half& a) {
+template <>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::half erf(const Eigen::half& a) {
   return Eigen::half(Eigen::numext::erf(static_cast<float>(a)));
 }
-template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::half erfc(const Eigen::half& a) {
+template <>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::half erfc(const Eigen::half& a) {
   return Eigen::half(Eigen::numext::erfc(static_cast<float>(a)));
 }
-template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::half ndtri(const Eigen::half& a) {
+template <>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::half ndtri(const Eigen::half& a) {
   return Eigen::half(Eigen::numext::ndtri(static_cast<float>(a)));
 }
-template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::half igamma(const Eigen::half& a, const Eigen::half& x) {
+template <>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::half igamma(const Eigen::half& a, const Eigen::half& x) {
   return Eigen::half(Eigen::numext::igamma(static_cast<float>(a), static_cast<float>(x)));
 }
 template <>
@@ -44,13 +52,17 @@
   return Eigen::half(Eigen::numext::igamma_der_a(static_cast<float>(a), static_cast<float>(x)));
 }
 template <>
-EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::half gamma_sample_der_alpha(const Eigen::half& alpha, const Eigen::half& sample) {
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::half gamma_sample_der_alpha(const Eigen::half& alpha,
+                                                                         const Eigen::half& sample) {
   return Eigen::half(Eigen::numext::gamma_sample_der_alpha(static_cast<float>(alpha), static_cast<float>(sample)));
 }
-template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::half igammac(const Eigen::half& a, const Eigen::half& x) {
+template <>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::half igammac(const Eigen::half& a, const Eigen::half& x) {
   return Eigen::half(Eigen::numext::igammac(static_cast<float>(a), static_cast<float>(x)));
 }
-template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::half betainc(const Eigen::half& a, const Eigen::half& b, const Eigen::half& x) {
+template <>
+EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Eigen::half betainc(const Eigen::half& a, const Eigen::half& b,
+                                                          const Eigen::half& x) {
   return Eigen::half(Eigen::numext::betainc(static_cast<float>(a), static_cast<float>(b), static_cast<float>(x)));
 }
 #endif
diff --git a/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsImpl.h b/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsImpl.h
index b8b07f5..e334617 100644
--- a/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsImpl.h
+++ b/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsImpl.h
@@ -39,19 +39,15 @@
 //    Good luck with your project,
 //    Steve
 
-
 /****************************************************************************
  * Implementation of lgamma, requires C++11/C99                             *
  ****************************************************************************/
 
 template <typename Scalar>
 struct lgamma_impl {
-  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false),
-                      THIS_TYPE_IS_NOT_SUPPORTED)
+  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false), THIS_TYPE_IS_NOT_SUPPORTED)
 
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Scalar) {
-    return Scalar(0);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Scalar) { return Scalar(0); }
 };
 
 template <typename Scalar>
@@ -61,22 +57,21 @@
 
 #if EIGEN_HAS_C99_MATH
 // Since glibc 2.19
-#if defined(__GLIBC__) && ((__GLIBC__>=2 && __GLIBC_MINOR__ >= 19) || __GLIBC__>2) \
- && (defined(_DEFAULT_SOURCE) || defined(_BSD_SOURCE) || defined(_SVID_SOURCE))
+#if defined(__GLIBC__) && ((__GLIBC__ >= 2 && __GLIBC_MINOR__ >= 19) || __GLIBC__ > 2) && \
+    (defined(_DEFAULT_SOURCE) || defined(_BSD_SOURCE) || defined(_SVID_SOURCE))
 #define EIGEN_HAS_LGAMMA_R
 #endif
 
 // Glibc versions before 2.19
-#if defined(__GLIBC__) && ((__GLIBC__==2 && __GLIBC_MINOR__ < 19) || __GLIBC__<2) \
- && (defined(_BSD_SOURCE) || defined(_SVID_SOURCE))
+#if defined(__GLIBC__) && ((__GLIBC__ == 2 && __GLIBC_MINOR__ < 19) || __GLIBC__ < 2) && \
+    (defined(_BSD_SOURCE) || defined(_SVID_SOURCE))
 #define EIGEN_HAS_LGAMMA_R
 #endif
 
 template <>
 struct lgamma_impl<float> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE float run(float x) {
-#if !defined(EIGEN_GPU_COMPILE_PHASE) && defined (EIGEN_HAS_LGAMMA_R) && !defined(__APPLE__)
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE float run(float x) {
+#if !defined(EIGEN_GPU_COMPILE_PHASE) && defined(EIGEN_HAS_LGAMMA_R) && !defined(__APPLE__)
     int dummy;
     return ::lgammaf_r(x, &dummy);
 #elif defined(SYCL_DEVICE_ONLY)
@@ -89,8 +84,7 @@
 
 template <>
 struct lgamma_impl<double> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE double run(double x) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE double run(double x) {
 #if !defined(EIGEN_GPU_COMPILE_PHASE) && defined(EIGEN_HAS_LGAMMA_R) && !defined(__APPLE__)
     int dummy;
     return ::lgamma_r(x, &dummy);
@@ -129,61 +123,45 @@
  */
 template <typename Scalar>
 struct digamma_impl_maybe_poly {
-  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false),
-                        THIS_TYPE_IS_NOT_SUPPORTED)
+  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false), THIS_TYPE_IS_NOT_SUPPORTED)
 
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Scalar) {
-    return Scalar(0);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Scalar) { return Scalar(0); }
 };
 
-
 template <>
 struct digamma_impl_maybe_poly<float> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE float run(const float s) {
-    const float A[] = {
-      -4.16666666666666666667E-3f,
-      3.96825396825396825397E-3f,
-      -8.33333333333333333333E-3f,
-      8.33333333333333333333E-2f
-    };
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE float run(const float s) {
+    const float A[] = {-4.16666666666666666667E-3f, 3.96825396825396825397E-3f, -8.33333333333333333333E-3f,
+                       8.33333333333333333333E-2f};
 
     float z;
     if (s < 1.0e8f) {
       z = 1.0f / (s * s);
       return z * internal::ppolevl<float, 3>::run(z, A);
-    } else return 0.0f;
+    } else
+      return 0.0f;
   }
 };
 
 template <>
 struct digamma_impl_maybe_poly<double> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE double run(const double s) {
-    const double A[] = {
-      8.33333333333333333333E-2,
-      -2.10927960927960927961E-2,
-      7.57575757575757575758E-3,
-      -4.16666666666666666667E-3,
-      3.96825396825396825397E-3,
-      -8.33333333333333333333E-3,
-      8.33333333333333333333E-2
-    };
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE double run(const double s) {
+    const double A[] = {8.33333333333333333333E-2,  -2.10927960927960927961E-2, 7.57575757575757575758E-3,
+                        -4.16666666666666666667E-3, 3.96825396825396825397E-3,  -8.33333333333333333333E-3,
+                        8.33333333333333333333E-2};
 
     double z;
     if (s < 1.0e17) {
       z = 1.0 / (s * s);
       return z * internal::ppolevl<double, 6>::run(z, A);
-    }
-    else return 0.0;
+    } else
+      return 0.0;
   }
 };
 
 template <typename Scalar>
 struct digamma_impl {
-  EIGEN_DEVICE_FUNC
-  static Scalar run(Scalar x) {
+  EIGEN_DEVICE_FUNC static Scalar run(Scalar x) {
     /*
      *
      *     Psi (digamma) function (modified for Eigen)
@@ -269,8 +247,7 @@
           nz = q - p;
         }
         nz = m_pi / numext::tan(m_pi * nz);
-      }
-      else {
+      } else {
         nz = zero;
       }
       x = one - x;
@@ -349,10 +326,7 @@
 
 template <typename T>
 struct erf_impl {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE T run(const T& x) {
-    return generic_fast_erf_float(x);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE T run(const T& x) { return generic_fast_erf_float(x); }
 };
 
 template <typename Scalar>
@@ -363,8 +337,7 @@
 #if EIGEN_HAS_C99_MATH
 template <>
 struct erf_impl<float> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE float run(float x) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE float run(float x) {
 #if defined(SYCL_DEVICE_ONLY)
     return cl::sycl::erf(x);
 #else
@@ -375,8 +348,7 @@
 
 template <>
 struct erf_impl<double> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE double run(double x) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE double run(double x) {
 #if defined(SYCL_DEVICE_ONLY)
     return cl::sycl::erf(x);
 #else
@@ -387,17 +359,14 @@
 #endif  // EIGEN_HAS_C99_MATH
 
 /***************************************************************************
-* Implementation of erfc, requires C++11/C99                               *
-****************************************************************************/
+ * Implementation of erfc, requires C++11/C99                               *
+ ****************************************************************************/
 
 template <typename Scalar>
 struct erfc_impl {
-  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false),
-                      THIS_TYPE_IS_NOT_SUPPORTED)
+  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false), THIS_TYPE_IS_NOT_SUPPORTED)
 
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Scalar) {
-    return Scalar(0);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Scalar) { return Scalar(0); }
 };
 
 template <typename Scalar>
@@ -408,8 +377,7 @@
 #if EIGEN_HAS_C99_MATH
 template <>
 struct erfc_impl<float> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE float run(const float x) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE float run(const float x) {
 #if defined(SYCL_DEVICE_ONLY)
     return cl::sycl::erfc(x);
 #else
@@ -420,8 +388,7 @@
 
 template <>
 struct erfc_impl<double> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE double run(const double x) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE double run(const double x) {
 #if defined(SYCL_DEVICE_ONLY)
     return cl::sycl::erfc(x);
 #else
@@ -431,10 +398,9 @@
 };
 #endif  // EIGEN_HAS_C99_MATH
 
-
 /***************************************************************************
-* Implementation of ndtri.                                                 *
-****************************************************************************/
+ * Implementation of ndtri.                                                 *
+ ****************************************************************************/
 
 /* Inverse of Normal distribution function (modified for Eigen).
  *
@@ -479,34 +445,29 @@
  * ndtri domain       x == 1         INF
  * ndtri domain       x < 0, x > 1   NAN
  */
- /*
-   Cephes Math Library Release 2.2: June, 1992
-   Copyright 1985, 1987, 1992 by Stephen L. Moshier
-   Direct inquiries to 30 Frost Street, Cambridge, MA 02140
- */
-
+/*
+  Cephes Math Library Release 2.2: June, 1992
+  Copyright 1985, 1987, 1992 by Stephen L. Moshier
+  Direct inquiries to 30 Frost Street, Cambridge, MA 02140
+*/
 
 // TODO: Add a cheaper approximation for float.
 
-
-template<typename T>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T flipsign(
-    const T& should_flipsign, const T& x) {
+template <typename T>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T flipsign(const T& should_flipsign, const T& x) {
   typedef typename unpacket_traits<T>::type Scalar;
   const T sign_mask = pset1<T>(Scalar(-0.0));
   T sign_bit = pand<T>(should_flipsign, sign_mask);
   return pxor<T>(sign_bit, x);
 }
 
-template<>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double flipsign<double>(
-    const double& should_flipsign, const double& x) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double flipsign<double>(const double& should_flipsign, const double& x) {
   return should_flipsign == 0 ? x : -x;
 }
 
-template<>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float flipsign<float>(
-    const float& should_flipsign, const float& x) {
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float flipsign<float>(const float& should_flipsign, const float& x) {
   return should_flipsign == 0 ? x : -x;
 }
 
@@ -516,90 +477,65 @@
 
 template <typename T, typename ScalarType>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T generic_ndtri_gt_exp_neg_two(const T& b) {
-  const ScalarType p0[] = {
-    ScalarType(-5.99633501014107895267e1),
-    ScalarType(9.80010754185999661536e1),
-    ScalarType(-5.66762857469070293439e1),
-    ScalarType(1.39312609387279679503e1),
-    ScalarType(-1.23916583867381258016e0)
-  };
-  const ScalarType q0[] = {
-    ScalarType(1.0),
-    ScalarType(1.95448858338141759834e0),
-    ScalarType(4.67627912898881538453e0),
-    ScalarType(8.63602421390890590575e1),
-    ScalarType(-2.25462687854119370527e2),
-    ScalarType(2.00260212380060660359e2),
-    ScalarType(-8.20372256168333339912e1),
-    ScalarType(1.59056225126211695515e1),
-    ScalarType(-1.18331621121330003142e0)
-  };
+  const ScalarType p0[] = {ScalarType(-5.99633501014107895267e1), ScalarType(9.80010754185999661536e1),
+                           ScalarType(-5.66762857469070293439e1), ScalarType(1.39312609387279679503e1),
+                           ScalarType(-1.23916583867381258016e0)};
+  const ScalarType q0[] = {ScalarType(1.0),
+                           ScalarType(1.95448858338141759834e0),
+                           ScalarType(4.67627912898881538453e0),
+                           ScalarType(8.63602421390890590575e1),
+                           ScalarType(-2.25462687854119370527e2),
+                           ScalarType(2.00260212380060660359e2),
+                           ScalarType(-8.20372256168333339912e1),
+                           ScalarType(1.59056225126211695515e1),
+                           ScalarType(-1.18331621121330003142e0)};
   const T sqrt2pi = pset1<T>(ScalarType(2.50662827463100050242e0));
   const T half = pset1<T>(ScalarType(0.5));
   T c, c2, ndtri_gt_exp_neg_two;
 
   c = psub(b, half);
   c2 = pmul(c, c);
-  ndtri_gt_exp_neg_two = pmadd(c, pmul(
-      c2, pdiv(
-          internal::ppolevl<T, 4>::run(c2, p0),
-          internal::ppolevl<T, 8>::run(c2, q0))), c);
+  ndtri_gt_exp_neg_two =
+      pmadd(c, pmul(c2, pdiv(internal::ppolevl<T, 4>::run(c2, p0), internal::ppolevl<T, 8>::run(c2, q0))), c);
   return pmul(ndtri_gt_exp_neg_two, sqrt2pi);
 }
 
 template <typename T, typename ScalarType>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T generic_ndtri_lt_exp_neg_two(
-    const T& b, const T& should_flipsign) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T generic_ndtri_lt_exp_neg_two(const T& b, const T& should_flipsign) {
   /* Approximation for interval z = sqrt(-2 log a ) between 2 and 8
    * i.e., a between exp(-2) = .135 and exp(-32) = 1.27e-14.
    */
-  const ScalarType p1[] = {
-    ScalarType(4.05544892305962419923e0),
-    ScalarType(3.15251094599893866154e1),
-    ScalarType(5.71628192246421288162e1),
-    ScalarType(4.40805073893200834700e1),
-    ScalarType(1.46849561928858024014e1),
-    ScalarType(2.18663306850790267539e0),
-    ScalarType(-1.40256079171354495875e-1),
-    ScalarType(-3.50424626827848203418e-2),
-    ScalarType(-8.57456785154685413611e-4)
-  };
-  const ScalarType q1[] = {
-    ScalarType(1.0),
-    ScalarType(1.57799883256466749731e1),
-    ScalarType(4.53907635128879210584e1),
-    ScalarType(4.13172038254672030440e1),
-    ScalarType(1.50425385692907503408e1),
-    ScalarType(2.50464946208309415979e0),
-    ScalarType(-1.42182922854787788574e-1),
-    ScalarType(-3.80806407691578277194e-2),
-    ScalarType(-9.33259480895457427372e-4)
-  };
+  const ScalarType p1[] = {ScalarType(4.05544892305962419923e0),   ScalarType(3.15251094599893866154e1),
+                           ScalarType(5.71628192246421288162e1),   ScalarType(4.40805073893200834700e1),
+                           ScalarType(1.46849561928858024014e1),   ScalarType(2.18663306850790267539e0),
+                           ScalarType(-1.40256079171354495875e-1), ScalarType(-3.50424626827848203418e-2),
+                           ScalarType(-8.57456785154685413611e-4)};
+  const ScalarType q1[] = {ScalarType(1.0),
+                           ScalarType(1.57799883256466749731e1),
+                           ScalarType(4.53907635128879210584e1),
+                           ScalarType(4.13172038254672030440e1),
+                           ScalarType(1.50425385692907503408e1),
+                           ScalarType(2.50464946208309415979e0),
+                           ScalarType(-1.42182922854787788574e-1),
+                           ScalarType(-3.80806407691578277194e-2),
+                           ScalarType(-9.33259480895457427372e-4)};
   /* Approximation for interval z = sqrt(-2 log a ) between 8 and 64
    * i.e., a between exp(-32) = 1.27e-14 and exp(-2048) = 3.67e-890.
    */
-  const ScalarType p2[] = {
-    ScalarType(3.23774891776946035970e0),
-    ScalarType(6.91522889068984211695e0),
-    ScalarType(3.93881025292474443415e0),
-    ScalarType(1.33303460815807542389e0),
-    ScalarType(2.01485389549179081538e-1),
-    ScalarType(1.23716634817820021358e-2),
-    ScalarType(3.01581553508235416007e-4),
-    ScalarType(2.65806974686737550832e-6),
-    ScalarType(6.23974539184983293730e-9)
-  };
-  const ScalarType q2[] = {
-    ScalarType(1.0),
-    ScalarType(6.02427039364742014255e0),
-    ScalarType(3.67983563856160859403e0),
-    ScalarType(1.37702099489081330271e0),
-    ScalarType(2.16236993594496635890e-1),
-    ScalarType(1.34204006088543189037e-2),
-    ScalarType(3.28014464682127739104e-4),
-    ScalarType(2.89247864745380683936e-6),
-    ScalarType(6.79019408009981274425e-9)
-  };
+  const ScalarType p2[] = {ScalarType(3.23774891776946035970e0),  ScalarType(6.91522889068984211695e0),
+                           ScalarType(3.93881025292474443415e0),  ScalarType(1.33303460815807542389e0),
+                           ScalarType(2.01485389549179081538e-1), ScalarType(1.23716634817820021358e-2),
+                           ScalarType(3.01581553508235416007e-4), ScalarType(2.65806974686737550832e-6),
+                           ScalarType(6.23974539184983293730e-9)};
+  const ScalarType q2[] = {ScalarType(1.0),
+                           ScalarType(6.02427039364742014255e0),
+                           ScalarType(3.67983563856160859403e0),
+                           ScalarType(1.37702099489081330271e0),
+                           ScalarType(2.16236993594496635890e-1),
+                           ScalarType(1.34204006088543189037e-2),
+                           ScalarType(3.28014464682127739104e-4),
+                           ScalarType(2.89247864745380683936e-6),
+                           ScalarType(6.79019408009981274425e-9)};
   const T eight = pset1<T>(ScalarType(8.0));
   const T neg_two = pset1<T>(ScalarType(-2));
   T x, x0, x1, z;
@@ -607,19 +543,14 @@
   x = psqrt(pmul(neg_two, plog(b)));
   x0 = psub(x, pdiv(plog(x), x));
   z = preciprocal(x);
-  x1 = pmul(
-      z, pselect(
-          pcmp_lt(x, eight),
-          pdiv(internal::ppolevl<T, 8>::run(z, p1),
-               internal::ppolevl<T, 8>::run(z, q1)),
-          pdiv(internal::ppolevl<T, 8>::run(z, p2),
-               internal::ppolevl<T, 8>::run(z, q2))));
+  x1 =
+      pmul(z, pselect(pcmp_lt(x, eight), pdiv(internal::ppolevl<T, 8>::run(z, p1), internal::ppolevl<T, 8>::run(z, q1)),
+                      pdiv(internal::ppolevl<T, 8>::run(z, p2), internal::ppolevl<T, 8>::run(z, q2))));
   return flipsign(should_flipsign, psub(x0, x1));
 }
 
 template <typename T, typename ScalarType>
-EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
-T generic_ndtri(const T& a) {
+EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T generic_ndtri(const T& a) {
   const T maxnum = pset1<T>(NumTraits<ScalarType>::infinity());
   const T neg_maxnum = pset1<T>(-NumTraits<ScalarType>::infinity());
 
@@ -632,14 +563,10 @@
   should_flipsign = pcmp_le(a, psub(one, exp_neg_two));
   b = pselect(should_flipsign, a, psub(one, a));
 
-  ndtri = pselect(
-      pcmp_lt(exp_neg_two, b),
-      generic_ndtri_gt_exp_neg_two<T, ScalarType>(b),
-      generic_ndtri_lt_exp_neg_two<T, ScalarType>(b, should_flipsign));
+  ndtri = pselect(pcmp_lt(exp_neg_two, b), generic_ndtri_gt_exp_neg_two<T, ScalarType>(b),
+                  generic_ndtri_lt_exp_neg_two<T, ScalarType>(b, should_flipsign));
 
-  return pselect(
-      pcmp_eq(a, zero), neg_maxnum,
-      pselect(pcmp_eq(one, a), maxnum, ndtri));
+  return pselect(pcmp_eq(a, zero), neg_maxnum, pselect(pcmp_eq(one, a), maxnum, ndtri));
 }
 
 template <typename Scalar>
@@ -651,27 +578,20 @@
 
 template <typename Scalar>
 struct ndtri_impl {
-  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false),
-                      THIS_TYPE_IS_NOT_SUPPORTED)
+  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false), THIS_TYPE_IS_NOT_SUPPORTED)
 
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Scalar) {
-    return Scalar(0);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Scalar) { return Scalar(0); }
 };
 
-# else
+#else
 
 template <typename Scalar>
 struct ndtri_impl {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE Scalar run(const Scalar x) {
-    return generic_ndtri<Scalar, Scalar>(x);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Scalar x) { return generic_ndtri<Scalar, Scalar>(x); }
 };
 
 #endif  // EIGEN_HAS_C99_MATH
 
-
 /**************************************************************************************************************
  * Implementation of igammac (complemented incomplete gamma integral), based on Cephes but requires C++11/C99 *
  **************************************************************************************************************/
@@ -684,27 +604,30 @@
 // NOTE: cephes_helper is also used to implement zeta
 template <typename Scalar>
 struct cephes_helper {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE Scalar machep() { eigen_assert(false && "machep not supported for this type"); return 0.0; }
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE Scalar big() { eigen_assert(false && "big not supported for this type"); return 0.0; }
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE Scalar biginv() { eigen_assert(false && "biginv not supported for this type"); return 0.0; }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar machep() {
+    eigen_assert(false && "machep not supported for this type");
+    return 0.0;
+  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar big() {
+    eigen_assert(false && "big not supported for this type");
+    return 0.0;
+  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar biginv() {
+    eigen_assert(false && "biginv not supported for this type");
+    return 0.0;
+  }
 };
 
 template <>
 struct cephes_helper<float> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE float machep() {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE float machep() {
     return NumTraits<float>::epsilon() / 2;  // 1.0 - machep == 1.0
   }
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE float big() {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE float big() {
     // use epsneg (1.0 - epsneg == 1.0)
     return 1.0f / (NumTraits<float>::epsilon() / 2);
   }
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE float biginv() {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE float biginv() {
     // epsneg
     return machep();
   }
@@ -712,16 +635,11 @@
 
 template <>
 struct cephes_helper<double> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE double machep() {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE double machep() {
     return NumTraits<double>::epsilon() / 2;  // 1.0 - machep == 1.0
   }
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE double big() {
-    return 1.0 / NumTraits<double>::epsilon();
-  }
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE double biginv() {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE double big() { return 1.0 / NumTraits<double>::epsilon(); }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE double biginv() {
     // inverse of eps
     return NumTraits<double>::epsilon();
   }
@@ -730,21 +648,19 @@
 enum IgammaComputationMode { VALUE, DERIVATIVE, SAMPLE_DERIVATIVE };
 
 template <typename Scalar>
-EIGEN_DEVICE_FUNC
-static EIGEN_STRONG_INLINE Scalar main_igamma_term(Scalar a, Scalar x) {
-    /* Compute  x**a * exp(-x) / gamma(a)  */
-    Scalar logax = a * numext::log(x) - x - lgamma_impl<Scalar>::run(a);
-    if (logax < -numext::log(NumTraits<Scalar>::highest()) ||
-        // Assuming x and a aren't Nan.
-        (numext::isnan)(logax)) {
-      return Scalar(0);
-    }
-    return numext::exp(logax);
+EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar main_igamma_term(Scalar a, Scalar x) {
+  /* Compute  x**a * exp(-x) / gamma(a)  */
+  Scalar logax = a * numext::log(x) - x - lgamma_impl<Scalar>::run(a);
+  if (logax < -numext::log(NumTraits<Scalar>::highest()) ||
+      // Assuming x and a aren't Nan.
+      (numext::isnan)(logax)) {
+    return Scalar(0);
+  }
+  return numext::exp(logax);
 }
 
 template <typename Scalar, IgammaComputationMode mode>
-EIGEN_DEVICE_FUNC
-int igamma_num_iterations() {
+EIGEN_DEVICE_FUNC int igamma_num_iterations() {
   /* Returns the maximum number of internal iterations for igamma computation.
    */
   if (mode == VALUE) {
@@ -771,8 +687,7 @@
    *   x >= 1
    *   x >= a
    */
-  EIGEN_DEVICE_FUNC
-  static Scalar run(Scalar a, Scalar x) {
+  EIGEN_DEVICE_FUNC static Scalar run(Scalar a, Scalar x) {
     const Scalar zero = 0;
     const Scalar one = 1;
     const Scalar two = 2;
@@ -872,7 +787,7 @@
       case DERIVATIVE:
         return ans * dax_da + dans_da * ax;
       case SAMPLE_DERIVATIVE:
-      default: // this is needed to suppress clang warning
+      default:  // this is needed to suppress clang warning
         return -(dans_da + ans * dlogax_da) * x;
     }
   }
@@ -888,8 +803,7 @@
    *   a > 0
    *   !(x > 1 && x > a)
    */
-  EIGEN_DEVICE_FUNC
-  static Scalar run(Scalar a, Scalar x) {
+  EIGEN_DEVICE_FUNC static Scalar run(Scalar a, Scalar x) {
     const Scalar zero = 0;
     const Scalar one = 1;
     const Scalar machep = cephes_helper<Scalar>::machep();
@@ -943,7 +857,7 @@
       case DERIVATIVE:
         return ans * dax_da + dans_da * ax;
       case SAMPLE_DERIVATIVE:
-      default: // this is needed to suppress clang warning
+      default:  // this is needed to suppress clang warning
         return -(dans_da + ans * dlogax_da) * x / a;
     }
   }
@@ -953,20 +867,16 @@
 
 template <typename Scalar>
 struct igammac_impl {
-  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false),
-                      THIS_TYPE_IS_NOT_SUPPORTED)
+  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false), THIS_TYPE_IS_NOT_SUPPORTED)
 
-  EIGEN_DEVICE_FUNC static Scalar run(Scalar a, Scalar x) {
-    return Scalar(0);
-  }
+  EIGEN_DEVICE_FUNC static Scalar run(Scalar a, Scalar x) { return Scalar(0); }
 };
 
 #else
 
 template <typename Scalar>
 struct igammac_impl {
-  EIGEN_DEVICE_FUNC
-  static Scalar run(Scalar a, Scalar x) {
+  EIGEN_DEVICE_FUNC static Scalar run(Scalar a, Scalar x) {
     /*  igamc()
      *
      *	Incomplete gamma integral (modified for Eigen)
@@ -1052,20 +962,16 @@
 
 template <typename Scalar, IgammaComputationMode mode>
 struct igamma_generic_impl {
-  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false),
-                      THIS_TYPE_IS_NOT_SUPPORTED)
+  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false), THIS_TYPE_IS_NOT_SUPPORTED)
 
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(Scalar a, Scalar x) {
-    return Scalar(0);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(Scalar a, Scalar x) { return Scalar(0); }
 };
 
 #else
 
 template <typename Scalar, IgammaComputationMode mode>
 struct igamma_generic_impl {
-  EIGEN_DEVICE_FUNC
-  static Scalar run(Scalar a, Scalar x) {
+  EIGEN_DEVICE_FUNC static Scalar run(Scalar a, Scalar x) {
     /* Depending on the mode, returns
      * - VALUE: incomplete Gamma function igamma(a, x)
      * - DERIVATIVE: derivative of incomplete Gamma function d/da igamma(a, x)
@@ -1204,8 +1110,7 @@
 struct gamma_sample_der_alpha_retval : igamma_retval<Scalar> {};
 
 template <typename Scalar>
-struct gamma_sample_der_alpha_impl
-    : igamma_generic_impl<Scalar, SAMPLE_DERIVATIVE> {
+struct gamma_sample_der_alpha_impl : igamma_generic_impl<Scalar, SAMPLE_DERIVATIVE> {
   /* Derivative of a Gamma random variable sample with respect to alpha.
    *
    * Consider a sample of a Gamma random variable with the concentration
@@ -1251,214 +1156,199 @@
 
 template <typename Scalar>
 struct zeta_retval {
-    typedef Scalar type;
+  typedef Scalar type;
 };
 
 template <typename Scalar>
 struct zeta_impl_series {
-  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false),
-                      THIS_TYPE_IS_NOT_SUPPORTED)
+  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false), THIS_TYPE_IS_NOT_SUPPORTED)
 
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Scalar) {
-    return Scalar(0);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Scalar) { return Scalar(0); }
 };
 
 template <>
 struct zeta_impl_series<float> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE bool run(float& a, float& b, float& s, const float x, const float machep) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE bool run(float& a, float& b, float& s, const float x,
+                                                        const float machep) {
     int i = 0;
-    while(i < 9)
-    {
-        i += 1;
-        a += 1.0f;
-        b = numext::pow( a, -x );
-        s += b;
-        if( numext::abs(b/s) < machep )
-            return true;
+    while (i < 9) {
+      i += 1;
+      a += 1.0f;
+      b = numext::pow(a, -x);
+      s += b;
+      if (numext::abs(b / s) < machep) return true;
     }
 
-    //Return whether we are done
+    // Return whether we are done
     return false;
   }
 };
 
 template <>
 struct zeta_impl_series<double> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE bool run(double& a, double& b, double& s, const double x, const double machep) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE bool run(double& a, double& b, double& s, const double x,
+                                                        const double machep) {
     int i = 0;
-    while( (i < 9) || (a <= 9.0) )
-    {
-        i += 1;
-        a += 1.0;
-        b = numext::pow( a, -x );
-        s += b;
-        if( numext::abs(b/s) < machep )
-            return true;
+    while ((i < 9) || (a <= 9.0)) {
+      i += 1;
+      a += 1.0;
+      b = numext::pow(a, -x);
+      s += b;
+      if (numext::abs(b / s) < machep) return true;
     }
 
-    //Return whether we are done
+    // Return whether we are done
     return false;
   }
 };
 
 template <typename Scalar>
 struct zeta_impl {
-    EIGEN_DEVICE_FUNC
-    static Scalar run(Scalar x, Scalar q) {
-        /*							zeta.c
-         *
-         *	Riemann zeta function of two arguments
-         *
-         *
-         *
-         * SYNOPSIS:
-         *
-         * double x, q, y, zeta();
-         *
-         * y = zeta( x, q );
-         *
-         *
-         *
-         * DESCRIPTION:
-         *
-         *
-         *
-         *                 inf.
-         *                  -        -x
-         *   zeta(x,q)  =   >   (k+q)
-         *                  -
-         *                 k=0
-         *
-         * where x > 1 and q is not a negative integer or zero.
-         * The Euler-Maclaurin summation formula is used to obtain
-         * the expansion
-         *
-         *                n
-         *                -       -x
-         * zeta(x,q)  =   >  (k+q)
-         *                -
-         *               k=1
-         *
-         *           1-x                 inf.  B   x(x+1)...(x+2j)
-         *      (n+q)           1         -     2j
-         *  +  ---------  -  -------  +   >    --------------------
-         *        x-1              x      -                   x+2j+1
-         *                   2(n+q)      j=1       (2j)! (n+q)
-         *
-         * where the B2j are Bernoulli numbers.  Note that (see zetac.c)
-         * zeta(x,1) = zetac(x) + 1.
-         *
-         *
-         *
-         * ACCURACY:
-         *
-         * Relative error for single precision:
-         * arithmetic   domain     # trials      peak         rms
-         *    IEEE      0,25        10000       6.9e-7      1.0e-7
-         *
-         * Large arguments may produce underflow in powf(), in which
-         * case the results are inaccurate.
-         *
-         * REFERENCE:
-         *
-         * Gradshteyn, I. S., and I. M. Ryzhik, Tables of Integrals,
-         * Series, and Products, p. 1073; Academic Press, 1980.
-         *
-         */
+  EIGEN_DEVICE_FUNC static Scalar run(Scalar x, Scalar q) {
+    /*							zeta.c
+     *
+     *	Riemann zeta function of two arguments
+     *
+     *
+     *
+     * SYNOPSIS:
+     *
+     * double x, q, y, zeta();
+     *
+     * y = zeta( x, q );
+     *
+     *
+     *
+     * DESCRIPTION:
+     *
+     *
+     *
+     *                 inf.
+     *                  -        -x
+     *   zeta(x,q)  =   >   (k+q)
+     *                  -
+     *                 k=0
+     *
+     * where x > 1 and q is not a negative integer or zero.
+     * The Euler-Maclaurin summation formula is used to obtain
+     * the expansion
+     *
+     *                n
+     *                -       -x
+     * zeta(x,q)  =   >  (k+q)
+     *                -
+     *               k=1
+     *
+     *           1-x                 inf.  B   x(x+1)...(x+2j)
+     *      (n+q)           1         -     2j
+     *  +  ---------  -  -------  +   >    --------------------
+     *        x-1              x      -                   x+2j+1
+     *                   2(n+q)      j=1       (2j)! (n+q)
+     *
+     * where the B2j are Bernoulli numbers.  Note that (see zetac.c)
+     * zeta(x,1) = zetac(x) + 1.
+     *
+     *
+     *
+     * ACCURACY:
+     *
+     * Relative error for single precision:
+     * arithmetic   domain     # trials      peak         rms
+     *    IEEE      0,25        10000       6.9e-7      1.0e-7
+     *
+     * Large arguments may produce underflow in powf(), in which
+     * case the results are inaccurate.
+     *
+     * REFERENCE:
+     *
+     * Gradshteyn, I. S., and I. M. Ryzhik, Tables of Integrals,
+     * Series, and Products, p. 1073; Academic Press, 1980.
+     *
+     */
 
-        int i;
-        Scalar p, r, a, b, k, s, t, w;
+    int i;
+    Scalar p, r, a, b, k, s, t, w;
 
-        const Scalar A[] = {
-            Scalar(12.0),
-            Scalar(-720.0),
-            Scalar(30240.0),
-            Scalar(-1209600.0),
-            Scalar(47900160.0),
-            Scalar(-1.8924375803183791606e9), /*1.307674368e12/691*/
-            Scalar(7.47242496e10),
-            Scalar(-2.950130727918164224e12), /*1.067062284288e16/3617*/
-            Scalar(1.1646782814350067249e14), /*5.109094217170944e18/43867*/
-            Scalar(-4.5979787224074726105e15), /*8.028576626982912e20/174611*/
-            Scalar(1.8152105401943546773e17), /*1.5511210043330985984e23/854513*/
-            Scalar(-7.1661652561756670113e18) /*1.6938241367317436694528e27/236364091*/
-            };
+    const Scalar A[] = {
+        Scalar(12.0),
+        Scalar(-720.0),
+        Scalar(30240.0),
+        Scalar(-1209600.0),
+        Scalar(47900160.0),
+        Scalar(-1.8924375803183791606e9), /*1.307674368e12/691*/
+        Scalar(7.47242496e10),
+        Scalar(-2.950130727918164224e12),  /*1.067062284288e16/3617*/
+        Scalar(1.1646782814350067249e14),  /*5.109094217170944e18/43867*/
+        Scalar(-4.5979787224074726105e15), /*8.028576626982912e20/174611*/
+        Scalar(1.8152105401943546773e17),  /*1.5511210043330985984e23/854513*/
+        Scalar(-7.1661652561756670113e18)  /*1.6938241367317436694528e27/236364091*/
+    };
 
-        const Scalar maxnum = NumTraits<Scalar>::infinity();
-        const Scalar zero = Scalar(0.0), half = Scalar(0.5), one = Scalar(1.0);
-        const Scalar machep = cephes_helper<Scalar>::machep();
-        const Scalar nan = NumTraits<Scalar>::quiet_NaN();
+    const Scalar maxnum = NumTraits<Scalar>::infinity();
+    const Scalar zero = Scalar(0.0), half = Scalar(0.5), one = Scalar(1.0);
+    const Scalar machep = cephes_helper<Scalar>::machep();
+    const Scalar nan = NumTraits<Scalar>::quiet_NaN();
 
-        if( x == one )
-            return maxnum;
+    if (x == one) return maxnum;
 
-        if( x < one )
-        {
-            return nan;
+    if (x < one) {
+      return nan;
+    }
+
+    if (q <= zero) {
+      if (q == numext::floor(q)) {
+        if (x == numext::floor(x) && long(x) % 2 == 0) {
+          return maxnum;
+        } else {
+          return nan;
         }
+      }
+      p = x;
+      r = numext::floor(p);
+      if (p != r) return nan;
+    }
 
-        if( q <= zero )
-        {
-            if(q == numext::floor(q))
-            {
-                if (x == numext::floor(x) && long(x) % 2 == 0) {
-                    return maxnum;
-                }
-                else {
-                    return nan;
-                }
-            }
-            p = x;
-            r = numext::floor(p);
-            if (p != r)
-                return nan;
-        }
+    /* Permit negative q but continue sum until n+q > +9 .
+     * This case should be handled by a reflection formula.
+     * If q<0 and x is an integer, there is a relation to
+     * the polygamma function.
+     */
+    s = numext::pow(q, -x);
+    a = q;
+    b = zero;
+    // Run the summation in a helper function that is specific to the floating precision
+    if (zeta_impl_series<Scalar>::run(a, b, s, x, machep)) {
+      return s;
+    }
 
-        /* Permit negative q but continue sum until n+q > +9 .
-         * This case should be handled by a reflection formula.
-         * If q<0 and x is an integer, there is a relation to
-         * the polygamma function.
-         */
-        s = numext::pow( q, -x );
-        a = q;
-        b = zero;
-        // Run the summation in a helper function that is specific to the floating precision
-        if (zeta_impl_series<Scalar>::run(a, b, s, x, machep)) {
-            return s;
-        }
+    // If b is zero, then the tail sum will also end up being zero.
+    // Exiting early here can prevent NaNs for some large inputs, where
+    // the tail sum computed below has term `a` which can overflow to `inf`.
+    if (numext::equal_strict(b, zero)) {
+      return s;
+    }
 
-        // If b is zero, then the tail sum will also end up being zero.
-        // Exiting early here can prevent NaNs for some large inputs, where
-        // the tail sum computed below has term `a` which can overflow to `inf`.
-        if (numext::equal_strict(b, zero)) {
-          return s;
-        }
+    w = a;
+    s += b * w / (x - one);
+    s -= half * b;
+    a = one;
+    k = zero;
 
-        w = a;
-        s += b*w/(x-one);
-        s -= half * b;
-        a = one;
-        k = zero;
-        
-        for( i=0; i<12; i++ )
-        {
-            a *= x + k;
-            b /= w;
-            t = a*b/A[i];
-            s = s + t;
-            t = numext::abs(t/s);
-            if( t < machep ) {
-              break;
-            }
-            k += one;
-            a *= x + k;
-            b /= w;
-            k += one;
-        }
-        return s;
+    for (i = 0; i < 12; i++) {
+      a *= x + k;
+      b /= w;
+      t = a * b / A[i];
+      s = s + t;
+      t = numext::abs(t / s);
+      if (t < machep) {
+        break;
+      }
+      k += one;
+      a *= x + k;
+      b /= w;
+      k += one;
+    }
+    return s;
   }
 };
 
@@ -1468,44 +1358,40 @@
 
 template <typename Scalar>
 struct polygamma_retval {
-    typedef Scalar type;
+  typedef Scalar type;
 };
 
 #if !EIGEN_HAS_C99_MATH
 
 template <typename Scalar>
 struct polygamma_impl {
-    EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false),
-                        THIS_TYPE_IS_NOT_SUPPORTED)
+  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false), THIS_TYPE_IS_NOT_SUPPORTED)
 
-    EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(Scalar n, Scalar x) {
-        return Scalar(0);
-    }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(Scalar n, Scalar x) { return Scalar(0); }
 };
 
 #else
 
 template <typename Scalar>
 struct polygamma_impl {
-    EIGEN_DEVICE_FUNC
-    static Scalar run(Scalar n, Scalar x) {
-        Scalar zero = 0.0, one = 1.0;
-        Scalar nplus = n + one;
-        const Scalar nan = NumTraits<Scalar>::quiet_NaN();
+  EIGEN_DEVICE_FUNC static Scalar run(Scalar n, Scalar x) {
+    Scalar zero = 0.0, one = 1.0;
+    Scalar nplus = n + one;
+    const Scalar nan = NumTraits<Scalar>::quiet_NaN();
 
-        // Check that n is a non-negative integer
-        if (numext::floor(n) != n || n < zero) {
-            return nan;
-        }
-        // Just return the digamma function for n = 0
-        else if (n == zero) {
-            return digamma_impl<Scalar>::run(x);
-        }
-        // Use the same implementation as scipy
-        else {
-            Scalar factorial = numext::exp(lgamma_impl<Scalar>::run(nplus));
-            return numext::pow(-one, nplus) * factorial * zeta_impl<Scalar>::run(nplus, x);
-        }
+    // Check that n is a non-negative integer
+    if (numext::floor(n) != n || n < zero) {
+      return nan;
+    }
+    // Just return the digamma function for n = 0
+    else if (n == zero) {
+      return digamma_impl<Scalar>::run(x);
+    }
+    // Use the same implementation as scipy
+    else {
+      Scalar factorial = numext::exp(lgamma_impl<Scalar>::run(nplus));
+      return numext::pow(-one, nplus) * factorial * zeta_impl<Scalar>::run(nplus, x);
+    }
   }
 };
 
@@ -1524,20 +1410,16 @@
 
 template <typename Scalar>
 struct betainc_impl {
-  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false),
-                      THIS_TYPE_IS_NOT_SUPPORTED)
+  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false), THIS_TYPE_IS_NOT_SUPPORTED)
 
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(Scalar a, Scalar b, Scalar x) {
-    return Scalar(0);
-  }
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(Scalar a, Scalar b, Scalar x) { return Scalar(0); }
 };
 
 #else
 
 template <typename Scalar>
 struct betainc_impl {
-  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false),
-                      THIS_TYPE_IS_NOT_SUPPORTED)
+  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false), THIS_TYPE_IS_NOT_SUPPORTED)
 
   EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(Scalar, Scalar, Scalar) {
     /*	betaincf.c
@@ -1617,8 +1499,7 @@
  */
 template <typename Scalar>
 struct incbeta_cfe {
-  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, float>::value ||
-                       internal::is_same<Scalar, double>::value),
+  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, float>::value || internal::is_same<Scalar, double>::value),
                       THIS_TYPE_IS_NOT_SUPPORTED)
 
   EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(Scalar a, Scalar b, Scalar x, bool small_branch) {
@@ -1636,8 +1517,7 @@
     int n;
 
     const int num_iters = (internal::is_same<Scalar, float>::value) ? 100 : 300;
-    const Scalar thresh =
-        (internal::is_same<Scalar, float>::value) ? machep : Scalar(3) * machep;
+    const Scalar thresh = (internal::is_same<Scalar, float>::value) ? machep : Scalar(3) * machep;
     Scalar r = (internal::is_same<Scalar, float>::value) ? zero : one;
 
     if (small_branch) {
@@ -1729,8 +1609,7 @@
 template <>
 struct betainc_helper<float> {
   /* Core implementation, assumes a large (> 1.0) */
-  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE float incbsa(float aa, float bb,
-                                                            float xx) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE float incbsa(float aa, float bb, float xx) {
     float ans, a, b, t, x, onemx;
     bool reversed_a_b = false;
 
@@ -1768,8 +1647,7 @@
       t = (b - 1.0f) * numext::log(t);
     }
 
-    t += a * numext::log(x) + lgamma_impl<float>::run(a + b) -
-         lgamma_impl<float>::run(a) - lgamma_impl<float>::run(b);
+    t += a * numext::log(x) + lgamma_impl<float>::run(a + b) - lgamma_impl<float>::run(a) - lgamma_impl<float>::run(b);
     t += numext::log(ans / a);
     t = numext::exp(t);
 
@@ -1777,8 +1655,7 @@
     return t;
   }
 
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE float incbps(float a, float b, float x) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE float incbps(float a, float b, float x) {
     float t, u, y, s;
     const float machep = cephes_helper<float>::machep();
 
@@ -1805,8 +1682,7 @@
 
 template <>
 struct betainc_impl<float> {
-  EIGEN_DEVICE_FUNC
-  static float run(float a, float b, float x) {
+  EIGEN_DEVICE_FUNC static float run(float a, float b, float x) {
     const float nan = NumTraits<float>::quiet_NaN();
     float ans, t;
 
@@ -1822,9 +1698,8 @@
     /* transformation for small aa */
     if (a <= 1.0f) {
       ans = betainc_helper<float>::incbsa(a + 1.0f, b, x);
-      t = a * numext::log(x) + b * numext::log1p(-x) +
-          lgamma_impl<float>::run(a + b) - lgamma_impl<float>::run(a + 1.0f) -
-          lgamma_impl<float>::run(b);
+      t = a * numext::log(x) + b * numext::log1p(-x) + lgamma_impl<float>::run(a + b) -
+          lgamma_impl<float>::run(a + 1.0f) - lgamma_impl<float>::run(b);
       return (ans + numext::exp(t));
     } else {
       return betainc_helper<float>::incbsa(a, b, x);
@@ -1834,8 +1709,7 @@
 
 template <>
 struct betainc_helper<double> {
-  EIGEN_DEVICE_FUNC
-  static EIGEN_STRONG_INLINE double incbps(double a, double b, double x) {
+  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE double incbps(double a, double b, double x) {
     const double machep = cephes_helper<double>::machep();
 
     double s, t, u, v, n, t1, z, ai;
@@ -1866,16 +1740,15 @@
       s = s * t * pow(x, a);
     }
     */
-    t = lgamma_impl<double>::run(a + b) - lgamma_impl<double>::run(a) -
-        lgamma_impl<double>::run(b) + u + numext::log(s);
+    t = lgamma_impl<double>::run(a + b) - lgamma_impl<double>::run(a) - lgamma_impl<double>::run(b) + u +
+        numext::log(s);
     return s = numext::exp(t);
   }
 };
 
 template <>
 struct betainc_impl<double> {
-  EIGEN_DEVICE_FUNC
-  static double run(double aa, double bb, double xx) {
+  EIGEN_DEVICE_FUNC static double run(double aa, double bb, double xx) {
     const double nan = NumTraits<double>::quiet_NaN();
     const double machep = cephes_helper<double>::machep();
     // const double maxgam = 171.624376956302725;
@@ -1950,8 +1823,7 @@
     } else {
     */
     /* Resort to logarithms.  */
-    y += t + lgamma_impl<double>::run(a + b) - lgamma_impl<double>::run(a) -
-         lgamma_impl<double>::run(b);
+    y += t + lgamma_impl<double>::run(a + b) - lgamma_impl<double>::run(a) - lgamma_impl<double>::run(b);
     y += numext::log(w / a);
     t = numext::exp(y);
 
@@ -1976,56 +1848,47 @@
 namespace numext {
 
 template <typename Scalar>
-EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(lgamma, Scalar)
-    lgamma(const Scalar& x) {
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(lgamma, Scalar) lgamma(const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(lgamma, Scalar)::run(x);
 }
 
 template <typename Scalar>
-EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(digamma, Scalar)
-    digamma(const Scalar& x) {
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(digamma, Scalar) digamma(const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(digamma, Scalar)::run(x);
 }
 
 template <typename Scalar>
-EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(zeta, Scalar)
-zeta(const Scalar& x, const Scalar& q) {
-    return EIGEN_MATHFUNC_IMPL(zeta, Scalar)::run(x, q);
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(zeta, Scalar) zeta(const Scalar& x, const Scalar& q) {
+  return EIGEN_MATHFUNC_IMPL(zeta, Scalar)::run(x, q);
 }
 
 template <typename Scalar>
-EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(polygamma, Scalar)
-polygamma(const Scalar& n, const Scalar& x) {
-    return EIGEN_MATHFUNC_IMPL(polygamma, Scalar)::run(n, x);
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(polygamma, Scalar) polygamma(const Scalar& n, const Scalar& x) {
+  return EIGEN_MATHFUNC_IMPL(polygamma, Scalar)::run(n, x);
 }
 
 template <typename Scalar>
-EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(erf, Scalar)
-    erf(const Scalar& x) {
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(erf, Scalar) erf(const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(erf, Scalar)::run(x);
 }
 
 template <typename Scalar>
-EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(erfc, Scalar)
-    erfc(const Scalar& x) {
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(erfc, Scalar) erfc(const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(erfc, Scalar)::run(x);
 }
 
 template <typename Scalar>
-EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(ndtri, Scalar)
-    ndtri(const Scalar& x) {
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(ndtri, Scalar) ndtri(const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(ndtri, Scalar)::run(x);
 }
 
 template <typename Scalar>
-EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(igamma, Scalar)
-    igamma(const Scalar& a, const Scalar& x) {
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(igamma, Scalar) igamma(const Scalar& a, const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(igamma, Scalar)::run(a, x);
 }
 
 template <typename Scalar>
-EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(igamma_der_a, Scalar)
-    igamma_der_a(const Scalar& a, const Scalar& x) {
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(igamma_der_a, Scalar) igamma_der_a(const Scalar& a, const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(igamma_der_a, Scalar)::run(a, x);
 }
 
@@ -2036,8 +1899,7 @@
 }
 
 template <typename Scalar>
-EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(igammac, Scalar)
-    igammac(const Scalar& a, const Scalar& x) {
+EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(igammac, Scalar) igammac(const Scalar& a, const Scalar& x) {
   return EIGEN_MATHFUNC_IMPL(igammac, Scalar)::run(a, x);
 }
 
diff --git a/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsPacketMath.h b/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsPacketMath.h
index a170082..d1470db 100644
--- a/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsPacketMath.h
+++ b/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsPacketMath.h
@@ -18,65 +18,95 @@
 namespace internal {
 
 /** \internal \returns the ln(|gamma(\a a)|) (coeff-wise) */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet plgamma(const Packet& a) { using numext::lgamma; return lgamma(a); }
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plgamma(const Packet& a) {
+  using numext::lgamma;
+  return lgamma(a);
+}
 
 /** \internal \returns the derivative of lgamma, psi(\a a) (coeff-wise) */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pdigamma(const Packet& a) { using numext::digamma; return digamma(a); }
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pdigamma(const Packet& a) {
+  using numext::digamma;
+  return digamma(a);
+}
 
 /** \internal \returns the zeta function of two arguments (coeff-wise) */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pzeta(const Packet& x, const Packet& q) { using numext::zeta; return zeta(x, q); }
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pzeta(const Packet& x, const Packet& q) {
+  using numext::zeta;
+  return zeta(x, q);
+}
 
 /** \internal \returns the polygamma function (coeff-wise) */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet ppolygamma(const Packet& n, const Packet& x) { using numext::polygamma; return polygamma(n, x); }
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet ppolygamma(const Packet& n, const Packet& x) {
+  using numext::polygamma;
+  return polygamma(n, x);
+}
 
 /** \internal \returns the erf(\a a) (coeff-wise) */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet perf(const Packet& a) { using numext::erf; return erf(a); }
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet perf(const Packet& a) {
+  using numext::erf;
+  return erf(a);
+}
 
 /** \internal \returns the erfc(\a a) (coeff-wise) */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet perfc(const Packet& a) { using numext::erfc; return erfc(a); }
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet perfc(const Packet& a) {
+  using numext::erfc;
+  return erfc(a);
+}
 
 /** \internal \returns the ndtri(\a a) (coeff-wise) */
-template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
-Packet pndtri(const Packet& a) {
+template <typename Packet>
+EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pndtri(const Packet& a) {
   typedef typename unpacket_traits<Packet>::type ScalarType;
-  using internal::generic_ndtri; return generic_ndtri<Packet, ScalarType>(a);
+  using internal::generic_ndtri;
+  return generic_ndtri<Packet, ScalarType>(a);
 }
 
 /** \internal \returns the incomplete gamma function igamma(\a a, \a x) */
-template<typename Packet> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-Packet pigamma(const Packet& a, const Packet& x) { using numext::igamma; return igamma(a, x); }
+template <typename Packet>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet pigamma(const Packet& a, const Packet& x) {
+  using numext::igamma;
+  return igamma(a, x);
+}
 
 /** \internal \returns the derivative of the incomplete gamma function
  * igamma_der_a(\a a, \a x) */
 template <typename Packet>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet pigamma_der_a(const Packet& a, const Packet& x) {
-  using numext::igamma_der_a; return igamma_der_a(a, x);
+  using numext::igamma_der_a;
+  return igamma_der_a(a, x);
 }
 
 /** \internal \returns compute the derivative of the sample
-  * of Gamma(alpha, 1) random variable with respect to the parameter a
-  * gamma_sample_der_alpha(\a alpha, \a sample) */
+ * of Gamma(alpha, 1) random variable with respect to the parameter a
+ * gamma_sample_der_alpha(\a alpha, \a sample) */
 template <typename Packet>
 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet pgamma_sample_der_alpha(const Packet& alpha, const Packet& sample) {
-  using numext::gamma_sample_der_alpha; return gamma_sample_der_alpha(alpha, sample);
+  using numext::gamma_sample_der_alpha;
+  return gamma_sample_der_alpha(alpha, sample);
 }
 
 /** \internal \returns the complementary incomplete gamma function igammac(\a a, \a x) */
-template<typename Packet> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-Packet pigammac(const Packet& a, const Packet& x) { using numext::igammac; return igammac(a, x); }
+template <typename Packet>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet pigammac(const Packet& a, const Packet& x) {
+  using numext::igammac;
+  return igammac(a, x);
+}
 
 /** \internal \returns the complementary incomplete gamma function betainc(\a a, \a b, \a x) */
-template<typename Packet> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-Packet pbetainc(const Packet& a, const Packet& b,const Packet& x) { using numext::betainc; return betainc(a, b, x); }
+template <typename Packet>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet pbetainc(const Packet& a, const Packet& b, const Packet& x) {
+  using numext::betainc;
+  return betainc(a, b, x);
+}
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_SPECIALFUNCTIONS_PACKETMATH_H
+#endif  // EIGEN_SPECIALFUNCTIONS_PACKETMATH_H
diff --git a/unsupported/Eigen/src/SpecialFunctions/arch/GPU/SpecialFunctions.h b/unsupported/Eigen/src/SpecialFunctions/arch/GPU/SpecialFunctions.h
index dd3bf4d..8f3468b 100644
--- a/unsupported/Eigen/src/SpecialFunctions/arch/GPU/SpecialFunctions.h
+++ b/unsupported/Eigen/src/SpecialFunctions/arch/GPU/SpecialFunctions.h
@@ -19,187 +19,147 @@
 // we'll use on the host side (SSE, AVX, ...)
 #if defined(EIGEN_GPUCC) && defined(EIGEN_USE_GPU)
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-float4 plgamma<float4>(const float4& a)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 plgamma<float4>(const float4& a) {
   return make_float4(lgammaf(a.x), lgammaf(a.y), lgammaf(a.z), lgammaf(a.w));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-double2 plgamma<double2>(const double2& a)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 plgamma<double2>(const double2& a) {
   using numext::lgamma;
   return make_double2(lgamma(a.x), lgamma(a.y));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-float4 pdigamma<float4>(const float4& a)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pdigamma<float4>(const float4& a) {
   using numext::digamma;
   return make_float4(digamma(a.x), digamma(a.y), digamma(a.z), digamma(a.w));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-double2 pdigamma<double2>(const double2& a)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pdigamma<double2>(const double2& a) {
   using numext::digamma;
   return make_double2(digamma(a.x), digamma(a.y));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-float4 pzeta<float4>(const float4& x, const float4& q)
-{
-    using numext::zeta;
-    return make_float4(zeta(x.x, q.x), zeta(x.y, q.y), zeta(x.z, q.z), zeta(x.w, q.w));
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pzeta<float4>(const float4& x, const float4& q) {
+  using numext::zeta;
+  return make_float4(zeta(x.x, q.x), zeta(x.y, q.y), zeta(x.z, q.z), zeta(x.w, q.w));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-double2 pzeta<double2>(const double2& x, const double2& q)
-{
-    using numext::zeta;
-    return make_double2(zeta(x.x, q.x), zeta(x.y, q.y));
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pzeta<double2>(const double2& x, const double2& q) {
+  using numext::zeta;
+  return make_double2(zeta(x.x, q.x), zeta(x.y, q.y));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-float4 ppolygamma<float4>(const float4& n, const float4& x)
-{
-    using numext::polygamma;
-    return make_float4(polygamma(n.x, x.x), polygamma(n.y, x.y), polygamma(n.z, x.z), polygamma(n.w, x.w));
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 ppolygamma<float4>(const float4& n, const float4& x) {
+  using numext::polygamma;
+  return make_float4(polygamma(n.x, x.x), polygamma(n.y, x.y), polygamma(n.z, x.z), polygamma(n.w, x.w));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-double2 ppolygamma<double2>(const double2& n, const double2& x)
-{
-    using numext::polygamma;
-    return make_double2(polygamma(n.x, x.x), polygamma(n.y, x.y));
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 ppolygamma<double2>(const double2& n, const double2& x) {
+  using numext::polygamma;
+  return make_double2(polygamma(n.x, x.x), polygamma(n.y, x.y));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-float4 perf<float4>(const float4& a)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 perf<float4>(const float4& a) {
   return make_float4(erff(a.x), erff(a.y), erff(a.z), erff(a.w));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-double2 perf<double2>(const double2& a)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 perf<double2>(const double2& a) {
   using numext::erf;
   return make_double2(erf(a.x), erf(a.y));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-float4 perfc<float4>(const float4& a)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 perfc<float4>(const float4& a) {
   using numext::erfc;
   return make_float4(erfc(a.x), erfc(a.y), erfc(a.z), erfc(a.w));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-double2 perfc<double2>(const double2& a)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 perfc<double2>(const double2& a) {
   using numext::erfc;
   return make_double2(erfc(a.x), erfc(a.y));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-float4 pndtri<float4>(const float4& a)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pndtri<float4>(const float4& a) {
   using numext::ndtri;
   return make_float4(ndtri(a.x), ndtri(a.y), ndtri(a.z), ndtri(a.w));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-double2 pndtri<double2>(const double2& a)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pndtri<double2>(const double2& a) {
   using numext::ndtri;
   return make_double2(ndtri(a.x), ndtri(a.y));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-float4 pigamma<float4>(const float4& a, const float4& x)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pigamma<float4>(const float4& a, const float4& x) {
   using numext::igamma;
-  return make_float4(
-      igamma(a.x, x.x),
-      igamma(a.y, x.y),
-      igamma(a.z, x.z),
-      igamma(a.w, x.w));
+  return make_float4(igamma(a.x, x.x), igamma(a.y, x.y), igamma(a.z, x.z), igamma(a.w, x.w));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-double2 pigamma<double2>(const double2& a, const double2& x)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pigamma<double2>(const double2& a, const double2& x) {
   using numext::igamma;
   return make_double2(igamma(a.x, x.x), igamma(a.y, x.y));
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pigamma_der_a<float4>(
-    const float4& a, const float4& x) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pigamma_der_a<float4>(const float4& a, const float4& x) {
   using numext::igamma_der_a;
-  return make_float4(igamma_der_a(a.x, x.x), igamma_der_a(a.y, x.y),
-                     igamma_der_a(a.z, x.z), igamma_der_a(a.w, x.w));
+  return make_float4(igamma_der_a(a.x, x.x), igamma_der_a(a.y, x.y), igamma_der_a(a.z, x.z), igamma_der_a(a.w, x.w));
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2
-pigamma_der_a<double2>(const double2& a, const double2& x) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pigamma_der_a<double2>(const double2& a, const double2& x) {
   using numext::igamma_der_a;
   return make_double2(igamma_der_a(a.x, x.x), igamma_der_a(a.y, x.y));
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pgamma_sample_der_alpha<float4>(
-    const float4& alpha, const float4& sample) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pgamma_sample_der_alpha<float4>(const float4& alpha,
+                                                                             const float4& sample) {
   using numext::gamma_sample_der_alpha;
-  return make_float4(
-      gamma_sample_der_alpha(alpha.x, sample.x),
-      gamma_sample_der_alpha(alpha.y, sample.y),
-      gamma_sample_der_alpha(alpha.z, sample.z),
-      gamma_sample_der_alpha(alpha.w, sample.w));
+  return make_float4(gamma_sample_der_alpha(alpha.x, sample.x), gamma_sample_der_alpha(alpha.y, sample.y),
+                     gamma_sample_der_alpha(alpha.z, sample.z), gamma_sample_der_alpha(alpha.w, sample.w));
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2
-pgamma_sample_der_alpha<double2>(const double2& alpha, const double2& sample) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pgamma_sample_der_alpha<double2>(const double2& alpha,
+                                                                               const double2& sample) {
   using numext::gamma_sample_der_alpha;
-  return make_double2(
-      gamma_sample_der_alpha(alpha.x, sample.x),
-      gamma_sample_der_alpha(alpha.y, sample.y));
+  return make_double2(gamma_sample_der_alpha(alpha.x, sample.x), gamma_sample_der_alpha(alpha.y, sample.y));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-float4 pigammac<float4>(const float4& a, const float4& x)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pigammac<float4>(const float4& a, const float4& x) {
   using numext::igammac;
-  return make_float4(
-      igammac(a.x, x.x),
-      igammac(a.y, x.y),
-      igammac(a.z, x.z),
-      igammac(a.w, x.w));
+  return make_float4(igammac(a.x, x.x), igammac(a.y, x.y), igammac(a.z, x.z), igammac(a.w, x.w));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-double2 pigammac<double2>(const double2& a, const double2& x)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pigammac<double2>(const double2& a, const double2& x) {
   using numext::igammac;
   return make_double2(igammac(a.x, x.x), igammac(a.y, x.y));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-float4 pbetainc<float4>(const float4& a, const float4& b, const float4& x)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float4 pbetainc<float4>(const float4& a, const float4& b, const float4& x) {
   using numext::betainc;
-  return make_float4(
-      betainc(a.x, b.x, x.x),
-      betainc(a.y, b.y, x.y),
-      betainc(a.z, b.z, x.z),
-      betainc(a.w, b.w, x.w));
+  return make_float4(betainc(a.x, b.x, x.x), betainc(a.y, b.y, x.y), betainc(a.z, b.z, x.z), betainc(a.w, b.w, x.w));
 }
 
-template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
-double2 pbetainc<double2>(const double2& a, const double2& b, const double2& x)
-{
+template <>
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pbetainc<double2>(const double2& a, const double2& b, const double2& x) {
   using numext::betainc;
   return make_double2(betainc(a.x, b.x, x.x), betainc(a.y, b.y, x.y));
 }
@@ -211,8 +171,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2
-pbessel_i0e<double2>(const double2& x) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pbessel_i0e<double2>(const double2& x) {
   using numext::bessel_i0e;
   return make_double2(bessel_i0e(x.x), bessel_i0e(x.y));
 }
@@ -224,8 +183,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2
-pbessel_i0<double2>(const double2& x) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pbessel_i0<double2>(const double2& x) {
   using numext::bessel_i0;
   return make_double2(bessel_i0(x.x), bessel_i0(x.y));
 }
@@ -237,8 +195,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2
-pbessel_i1e<double2>(const double2& x) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pbessel_i1e<double2>(const double2& x) {
   using numext::bessel_i1e;
   return make_double2(bessel_i1e(x.x), bessel_i1e(x.y));
 }
@@ -250,8 +207,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2
-pbessel_i1<double2>(const double2& x) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pbessel_i1<double2>(const double2& x) {
   using numext::bessel_i1;
   return make_double2(bessel_i1(x.x), bessel_i1(x.y));
 }
@@ -263,8 +219,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2
-pbessel_k0e<double2>(const double2& x) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pbessel_k0e<double2>(const double2& x) {
   using numext::bessel_k0e;
   return make_double2(bessel_k0e(x.x), bessel_k0e(x.y));
 }
@@ -276,8 +231,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2
-pbessel_k0<double2>(const double2& x) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pbessel_k0<double2>(const double2& x) {
   using numext::bessel_k0;
   return make_double2(bessel_k0(x.x), bessel_k0(x.y));
 }
@@ -289,8 +243,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2
-pbessel_k1e<double2>(const double2& x) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pbessel_k1e<double2>(const double2& x) {
   using numext::bessel_k1e;
   return make_double2(bessel_k1e(x.x), bessel_k1e(x.y));
 }
@@ -302,8 +255,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2
-pbessel_k1<double2>(const double2& x) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pbessel_k1<double2>(const double2& x) {
   using numext::bessel_k1;
   return make_double2(bessel_k1(x.x), bessel_k1(x.y));
 }
@@ -315,8 +267,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2
-pbessel_j0<double2>(const double2& x) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pbessel_j0<double2>(const double2& x) {
   using numext::bessel_j0;
   return make_double2(bessel_j0(x.x), bessel_j0(x.y));
 }
@@ -328,8 +279,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2
-pbessel_j1<double2>(const double2& x) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pbessel_j1<double2>(const double2& x) {
   using numext::bessel_j1;
   return make_double2(bessel_j1(x.x), bessel_j1(x.y));
 }
@@ -341,8 +291,7 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2
-pbessel_y0<double2>(const double2& x) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pbessel_y0<double2>(const double2& x) {
   using numext::bessel_y0;
   return make_double2(bessel_y0(x.x), bessel_y0(x.y));
 }
@@ -354,16 +303,15 @@
 }
 
 template <>
-EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2
-pbessel_y1<double2>(const double2& x) {
+EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE double2 pbessel_y1<double2>(const double2& x) {
   using numext::bessel_y1;
   return make_double2(bessel_y1(x.x), bessel_y1(x.y));
 }
 
 #endif
 
-} // end namespace internal
+}  // end namespace internal
 
-} // end namespace Eigen
+}  // end namespace Eigen
 
-#endif // EIGEN_GPU_SPECIALFUNCTIONS_H
+#endif  // EIGEN_GPU_SPECIALFUNCTIONS_H
diff --git a/unsupported/Eigen/src/SpecialFunctions/arch/NEON/BesselFunctions.h b/unsupported/Eigen/src/SpecialFunctions/arch/NEON/BesselFunctions.h
index 67433b0..70d9056 100644
--- a/unsupported/Eigen/src/SpecialFunctions/arch/NEON/BesselFunctions.h
+++ b/unsupported/Eigen/src/SpecialFunctions/arch/NEON/BesselFunctions.h
@@ -6,18 +6,18 @@
 
 #if EIGEN_HAS_ARM64_FP16_VECTOR_ARITHMETIC
 
-#define NEON_HALF_TO_FLOAT_FUNCTIONS(METHOD)                            \
-template <> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                       \
-Packet8hf METHOD<Packet8hf>(const Packet8hf& x) {                       \
-  const Packet4f lo = METHOD<Packet4f>(vcvt_f32_f16(vget_low_f16(x)));  \
-  const Packet4f hi = METHOD<Packet4f>(vcvt_f32_f16(vget_high_f16(x))); \
-  return vcombine_f16(vcvt_f16_f32(lo), vcvt_f16_f32(hi));              \
-}                                                                       \
-                                                                        \
-template <> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                       \
-Packet4hf METHOD<Packet4hf>(const Packet4hf& x) {                       \
-  return vcvt_f16_f32(METHOD<Packet4f>(vcvt_f32_f16(x)));               \
-}
+#define NEON_HALF_TO_FLOAT_FUNCTIONS(METHOD)                                              \
+  template <>                                                                             \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet8hf METHOD<Packet8hf>(const Packet8hf& x) { \
+    const Packet4f lo = METHOD<Packet4f>(vcvt_f32_f16(vget_low_f16(x)));                  \
+    const Packet4f hi = METHOD<Packet4f>(vcvt_f32_f16(vget_high_f16(x)));                 \
+    return vcombine_f16(vcvt_f16_f32(lo), vcvt_f16_f32(hi));                              \
+  }                                                                                       \
+                                                                                          \
+  template <>                                                                             \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4hf METHOD<Packet4hf>(const Packet4hf& x) { \
+    return vcvt_f16_f32(METHOD<Packet4f>(vcvt_f32_f16(x)));                               \
+  }
 
 NEON_HALF_TO_FLOAT_FUNCTIONS(pbessel_i0)
 NEON_HALF_TO_FLOAT_FUNCTIONS(pbessel_i0e)
diff --git a/unsupported/Eigen/src/SpecialFunctions/arch/NEON/SpecialFunctions.h b/unsupported/Eigen/src/SpecialFunctions/arch/NEON/SpecialFunctions.h
index ec92951..5590d2b 100644
--- a/unsupported/Eigen/src/SpecialFunctions/arch/NEON/SpecialFunctions.h
+++ b/unsupported/Eigen/src/SpecialFunctions/arch/NEON/SpecialFunctions.h
@@ -6,18 +6,18 @@
 
 #if EIGEN_HAS_ARM64_FP16_VECTOR_ARITHMETIC
 
-#define NEON_HALF_TO_FLOAT_FUNCTIONS(METHOD)                            \
-template <> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                       \
-Packet8hf METHOD<Packet8hf>(const Packet8hf& x) {                       \
-  const Packet4f lo = METHOD<Packet4f>(vcvt_f32_f16(vget_low_f16(x)));  \
-  const Packet4f hi = METHOD<Packet4f>(vcvt_f32_f16(vget_high_f16(x))); \
-  return vcombine_f16(vcvt_f16_f32(lo), vcvt_f16_f32(hi));              \
-}                                                                       \
-                                                                        \
-template <> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                       \
-Packet4hf METHOD<Packet4hf>(const Packet4hf& x) {                       \
-  return vcvt_f16_f32(METHOD<Packet4f>(vcvt_f32_f16(x)));               \
-}
+#define NEON_HALF_TO_FLOAT_FUNCTIONS(METHOD)                                              \
+  template <>                                                                             \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet8hf METHOD<Packet8hf>(const Packet8hf& x) { \
+    const Packet4f lo = METHOD<Packet4f>(vcvt_f32_f16(vget_low_f16(x)));                  \
+    const Packet4f hi = METHOD<Packet4f>(vcvt_f32_f16(vget_high_f16(x)));                 \
+    return vcombine_f16(vcvt_f16_f32(lo), vcvt_f16_f32(hi));                              \
+  }                                                                                       \
+                                                                                          \
+  template <>                                                                             \
+  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4hf METHOD<Packet4hf>(const Packet4hf& x) { \
+    return vcvt_f16_f32(METHOD<Packet4f>(vcvt_f32_f16(x)));                               \
+  }
 
 NEON_HALF_TO_FLOAT_FUNCTIONS(perf)
 NEON_HALF_TO_FLOAT_FUNCTIONS(pndtri)
diff --git a/unsupported/Eigen/src/Splines/Spline.h b/unsupported/Eigen/src/Splines/Spline.h
index 486a797..6ff1eea 100644
--- a/unsupported/Eigen/src/Splines/Spline.h
+++ b/unsupported/Eigen/src/Splines/Spline.h
@@ -15,496 +15,465 @@
 
 #include "SplineFwd.h"
 
-namespace Eigen
-{
-    /**
-     * \ingroup Splines_Module
-     * \class Spline
-     * \brief A class representing multi-dimensional spline curves.
-     *
-     * The class represents B-splines with non-uniform knot vectors. Each control
-     * point of the B-spline is associated with a basis function
-     * \f{align*}
-     *   C(u) & = \sum_{i=0}^{n}N_{i,p}(u)P_i
-     * \f}
-     *
-     * \tparam Scalar_ The underlying data type (typically float or double)
-     * \tparam Dim_ The curve dimension (e.g. 2 or 3)
-     * \tparam Degree_ Per default set to Dynamic; could be set to the actual desired
-     *                degree for optimization purposes (would result in stack allocation
-     *                of several temporary variables).
-     **/
-  template <typename Scalar_, int Dim_, int Degree_>
-  class Spline
-  {
-  public:
-    typedef Scalar_ Scalar; /*!< The spline curve's scalar type. */
-    enum { Dimension = Dim_ /*!< The spline curve's dimension. */ };
-    enum { Degree = Degree_ /*!< The spline curve's degree. */ };
+namespace Eigen {
+/**
+ * \ingroup Splines_Module
+ * \class Spline
+ * \brief A class representing multi-dimensional spline curves.
+ *
+ * The class represents B-splines with non-uniform knot vectors. Each control
+ * point of the B-spline is associated with a basis function
+ * \f{align*}
+ *   C(u) & = \sum_{i=0}^{n}N_{i,p}(u)P_i
+ * \f}
+ *
+ * \tparam Scalar_ The underlying data type (typically float or double)
+ * \tparam Dim_ The curve dimension (e.g. 2 or 3)
+ * \tparam Degree_ Per default set to Dynamic; could be set to the actual desired
+ *                degree for optimization purposes (would result in stack allocation
+ *                of several temporary variables).
+ **/
+template <typename Scalar_, int Dim_, int Degree_>
+class Spline {
+ public:
+  typedef Scalar_ Scalar; /*!< The spline curve's scalar type. */
+  enum { Dimension = Dim_ /*!< The spline curve's dimension. */ };
+  enum { Degree = Degree_ /*!< The spline curve's degree. */ };
 
-    /** \brief The point type the spline is representing. */
-    typedef typename SplineTraits<Spline>::PointType PointType;
-    
-    /** \brief The data type used to store knot vectors. */
-    typedef typename SplineTraits<Spline>::KnotVectorType KnotVectorType;
+  /** \brief The point type the spline is representing. */
+  typedef typename SplineTraits<Spline>::PointType PointType;
 
-    /** \brief The data type used to store parameter vectors. */
-    typedef typename SplineTraits<Spline>::ParameterVectorType ParameterVectorType;
-    
-    /** \brief The data type used to store non-zero basis functions. */
-    typedef typename SplineTraits<Spline>::BasisVectorType BasisVectorType;
+  /** \brief The data type used to store knot vectors. */
+  typedef typename SplineTraits<Spline>::KnotVectorType KnotVectorType;
 
-    /** \brief The data type used to store the values of the basis function derivatives. */
-    typedef typename SplineTraits<Spline>::BasisDerivativeType BasisDerivativeType;
-    
-    /** \brief The data type representing the spline's control points. */
-    typedef typename SplineTraits<Spline>::ControlPointVectorType ControlPointVectorType;
-    
-    /**
-    * \brief Creates a (constant) zero spline.
-    * For Splines with dynamic degree, the resulting degree will be 0.
-    **/
-    Spline() 
-    : m_knots(1, (Degree==Dynamic ? 2 : 2*Degree+2))
-    , m_ctrls(ControlPointVectorType::Zero(Dimension,(Degree==Dynamic ? 1 : Degree+1))) 
-    {
-      // in theory this code can go to the initializer list but it will get pretty
-      // much unreadable ...
-      enum { MinDegree = (Degree==Dynamic ? 0 : Degree) };
-      m_knots.template segment<MinDegree+1>(0) = Array<Scalar,1,MinDegree+1>::Zero();
-      m_knots.template segment<MinDegree+1>(MinDegree+1) = Array<Scalar,1,MinDegree+1>::Ones();
-    }
+  /** \brief The data type used to store parameter vectors. */
+  typedef typename SplineTraits<Spline>::ParameterVectorType ParameterVectorType;
 
-    /**
-    * \brief Creates a spline from a knot vector and control points.
-    * \param knots The spline's knot vector.
-    * \param ctrls The spline's control point vector.
-    **/
-    template <typename OtherVectorType, typename OtherArrayType>
-    Spline(const OtherVectorType& knots, const OtherArrayType& ctrls) : m_knots(knots), m_ctrls(ctrls) {}
+  /** \brief The data type used to store non-zero basis functions. */
+  typedef typename SplineTraits<Spline>::BasisVectorType BasisVectorType;
 
-    /**
-    * \brief Copy constructor for splines.
-    * \param spline The input spline.
-    **/
-    template <int OtherDegree>
-    Spline(const Spline<Scalar, Dimension, OtherDegree>& spline) : 
-    m_knots(spline.knots()), m_ctrls(spline.ctrls()) {}
+  /** \brief The data type used to store the values of the basis function derivatives. */
+  typedef typename SplineTraits<Spline>::BasisDerivativeType BasisDerivativeType;
 
-    /**
-     * \brief Returns the knots of the underlying spline.
-     **/
-    const KnotVectorType& knots() const { return m_knots; }
-    
-    /**
-     * \brief Returns the ctrls of the underlying spline.
-     **/    
-    const ControlPointVectorType& ctrls() const { return m_ctrls; }
+  /** \brief The data type representing the spline's control points. */
+  typedef typename SplineTraits<Spline>::ControlPointVectorType ControlPointVectorType;
 
-    /**
-     * \brief Returns the spline value at a given site \f$u\f$.
-     *
-     * The function returns
-     * \f{align*}
-     *   C(u) & = \sum_{i=0}^{n}N_{i,p}P_i
-     * \f}
-     *
-     * \param u Parameter \f$u \in [0;1]\f$ at which the spline is evaluated.
-     * \return The spline value at the given location \f$u\f$.
-     **/
-    PointType operator()(Scalar u) const;
-
-    /**
-     * \brief Evaluation of spline derivatives of up-to given order.
-     *
-     * The function returns
-     * \f{align*}
-     *   \frac{d^i}{du^i}C(u) & = \sum_{i=0}^{n} \frac{d^i}{du^i} N_{i,p}(u)P_i
-     * \f}
-     * for i ranging between 0 and order.
-     *
-     * \param u Parameter \f$u \in [0;1]\f$ at which the spline derivative is evaluated.
-     * \param order The order up to which the derivatives are computed.
-     **/
-    typename SplineTraits<Spline>::DerivativeType
-      derivatives(Scalar u, DenseIndex order) const;
-
-    /**
-     * \copydoc Spline::derivatives
-     * Using the template version of this function is more efficieent since
-     * temporary objects are allocated on the stack whenever this is possible.
-     **/    
-    template <int DerivativeOrder>
-    typename SplineTraits<Spline,DerivativeOrder>::DerivativeType
-      derivatives(Scalar u, DenseIndex order = DerivativeOrder) const;
-
-    /**
-     * \brief Computes the non-zero basis functions at the given site.
-     *
-     * Splines have local support and a point from their image is defined
-     * by exactly \f$p+1\f$ control points \f$P_i\f$ where \f$p\f$ is the
-     * spline degree.
-     *
-     * This function computes the \f$p+1\f$ non-zero basis function values
-     * for a given parameter value \f$u\f$. It returns
-     * \f{align*}{
-     *   N_{i,p}(u), \hdots, N_{i+p+1,p}(u)
-     * \f}
-     *
-     * \param u Parameter \f$u \in [0;1]\f$ at which the non-zero basis functions 
-     *          are computed.
-     **/
-    typename SplineTraits<Spline>::BasisVectorType
-      basisFunctions(Scalar u) const;
-
-    /**
-     * \brief Computes the non-zero spline basis function derivatives up to given order.
-     *
-     * The function computes
-     * \f{align*}{
-     *   \frac{d^i}{du^i} N_{i,p}(u), \hdots, \frac{d^i}{du^i} N_{i+p+1,p}(u)
-     * \f}
-     * with i ranging from 0 up to the specified order.
-     *
-     * \param u Parameter \f$u \in [0;1]\f$ at which the non-zero basis function
-     *          derivatives are computed.
-     * \param order The order up to which the basis function derivatives are computes.
-     **/
-    typename SplineTraits<Spline>::BasisDerivativeType
-      basisFunctionDerivatives(Scalar u, DenseIndex order) const;
-
-    /**
-     * \copydoc Spline::basisFunctionDerivatives
-     * Using the template version of this function is more efficieent since
-     * temporary objects are allocated on the stack whenever this is possible.
-     **/    
-    template <int DerivativeOrder>
-    typename SplineTraits<Spline,DerivativeOrder>::BasisDerivativeType
-      basisFunctionDerivatives(Scalar u, DenseIndex order = DerivativeOrder) const;
-
-    /**
-     * \brief Returns the spline degree.
-     **/ 
-    DenseIndex degree() const;
-
-    /** 
-     * \brief Returns the span within the knot vector in which u is falling.
-     * \param u The site for which the span is determined.
-     **/
-    DenseIndex span(Scalar u) const;
-
-    /**
-     * \brief Computes the span within the provided knot vector in which u is falling.
-     **/
-    static DenseIndex Span(typename SplineTraits<Spline>::Scalar u, DenseIndex degree, const typename SplineTraits<Spline>::KnotVectorType& knots);
-    
-    /**
-     * \brief Returns the spline's non-zero basis functions.
-     *
-     * The function computes and returns
-     * \f{align*}{
-     *   N_{i,p}(u), \hdots, N_{i+p+1,p}(u)
-     * \f}
-     *
-     * \param u The site at which the basis functions are computed.
-     * \param degree The degree of the underlying spline.
-     * \param knots The underlying spline's knot vector.
-     **/
-    static BasisVectorType BasisFunctions(Scalar u, DenseIndex degree, const KnotVectorType& knots);
-
-    /**
-     * \copydoc Spline::basisFunctionDerivatives
-     * \param degree The degree of the underlying spline
-     * \param knots The underlying spline's knot vector.
-     **/    
-    static BasisDerivativeType BasisFunctionDerivatives(
-      const Scalar u, const DenseIndex order, const DenseIndex degree, const KnotVectorType& knots);
-
-  private:
-    KnotVectorType m_knots; /*!< Knot vector. */
-    ControlPointVectorType  m_ctrls; /*!< Control points. */
-
-    template <typename DerivativeType>
-    static void BasisFunctionDerivativesImpl(
-      const typename Spline<Scalar_, Dim_, Degree_>::Scalar u,
-      const DenseIndex order,
-      const DenseIndex p,
-      const typename Spline<Scalar_, Dim_, Degree_>::KnotVectorType& U,
-      DerivativeType& N_);
-  };
-
-  template <typename Scalar_, int Dim_, int Degree_>
-  DenseIndex Spline<Scalar_, Dim_, Degree_>::Span(
-    typename SplineTraits< Spline<Scalar_, Dim_, Degree_> >::Scalar u,
-    DenseIndex degree,
-    const typename SplineTraits< Spline<Scalar_, Dim_, Degree_> >::KnotVectorType& knots)
-  {
-    // Piegl & Tiller, "The NURBS Book", A2.1 (p. 68)
-    if (u <= knots(0)) return degree;
-    const Scalar* pos = std::upper_bound(knots.data()+degree-1, knots.data()+knots.size()-degree-1, u);
-    return static_cast<DenseIndex>( std::distance(knots.data(), pos) - 1 );
+  /**
+   * \brief Creates a (constant) zero spline.
+   * For Splines with dynamic degree, the resulting degree will be 0.
+   **/
+  Spline()
+      : m_knots(1, (Degree == Dynamic ? 2 : 2 * Degree + 2)),
+        m_ctrls(ControlPointVectorType::Zero(Dimension, (Degree == Dynamic ? 1 : Degree + 1))) {
+    // in theory this code can go to the initializer list but it will get pretty
+    // much unreadable ...
+    enum { MinDegree = (Degree == Dynamic ? 0 : Degree) };
+    m_knots.template segment<MinDegree + 1>(0) = Array<Scalar, 1, MinDegree + 1>::Zero();
+    m_knots.template segment<MinDegree + 1>(MinDegree + 1) = Array<Scalar, 1, MinDegree + 1>::Ones();
   }
 
-  template <typename Scalar_, int Dim_, int Degree_>
-  typename Spline<Scalar_, Dim_, Degree_>::BasisVectorType
-    Spline<Scalar_, Dim_, Degree_>::BasisFunctions(
-    typename Spline<Scalar_, Dim_, Degree_>::Scalar u,
-    DenseIndex degree,
-    const typename Spline<Scalar_, Dim_, Degree_>::KnotVectorType& knots)
-  {
-    const DenseIndex p = degree;
-    const DenseIndex i = Spline::Span(u, degree, knots);
+  /**
+   * \brief Creates a spline from a knot vector and control points.
+   * \param knots The spline's knot vector.
+   * \param ctrls The spline's control point vector.
+   **/
+  template <typename OtherVectorType, typename OtherArrayType>
+  Spline(const OtherVectorType& knots, const OtherArrayType& ctrls) : m_knots(knots), m_ctrls(ctrls) {}
 
-    const KnotVectorType& U = knots;
+  /**
+   * \brief Copy constructor for splines.
+   * \param spline The input spline.
+   **/
+  template <int OtherDegree>
+  Spline(const Spline<Scalar, Dimension, OtherDegree>& spline) : m_knots(spline.knots()), m_ctrls(spline.ctrls()) {}
 
-    BasisVectorType left(p+1); left(0) = Scalar(0);
-    BasisVectorType right(p+1); right(0) = Scalar(0);
+  /**
+   * \brief Returns the knots of the underlying spline.
+   **/
+  const KnotVectorType& knots() const { return m_knots; }
 
-    VectorBlock<BasisVectorType,Degree>(left,1,p) = u - VectorBlock<const KnotVectorType,Degree>(U,i+1-p,p).reverse();
-    VectorBlock<BasisVectorType,Degree>(right,1,p) = VectorBlock<const KnotVectorType,Degree>(U,i+1,p) - u;
+  /**
+   * \brief Returns the ctrls of the underlying spline.
+   **/
+  const ControlPointVectorType& ctrls() const { return m_ctrls; }
 
-    BasisVectorType N(1,p+1);
-    N(0) = Scalar(1);
-    for (DenseIndex j=1; j<=p; ++j)
-    {
-      Scalar saved = Scalar(0);
-      for (DenseIndex r=0; r<j; r++)
-      {
-        const Scalar tmp = N(r)/(right(r+1)+left(j-r));
-        N[r] = saved + right(r+1)*tmp;
-        saved = left(j-r)*tmp;
-      }
-      N(j) = saved;
-    }
-    return N;
-  }
+  /**
+   * \brief Returns the spline value at a given site \f$u\f$.
+   *
+   * The function returns
+   * \f{align*}
+   *   C(u) & = \sum_{i=0}^{n}N_{i,p}P_i
+   * \f}
+   *
+   * \param u Parameter \f$u \in [0;1]\f$ at which the spline is evaluated.
+   * \return The spline value at the given location \f$u\f$.
+   **/
+  PointType operator()(Scalar u) const;
 
-  template <typename Scalar_, int Dim_, int Degree_>
-  DenseIndex Spline<Scalar_, Dim_, Degree_>::degree() const
-  {
-    if (Degree_ == Dynamic)
-      return m_knots.size() - m_ctrls.cols() - 1;
-    else
-      return Degree_;
-  }
+  /**
+   * \brief Evaluation of spline derivatives of up-to given order.
+   *
+   * The function returns
+   * \f{align*}
+   *   \frac{d^i}{du^i}C(u) & = \sum_{i=0}^{n} \frac{d^i}{du^i} N_{i,p}(u)P_i
+   * \f}
+   * for i ranging between 0 and order.
+   *
+   * \param u Parameter \f$u \in [0;1]\f$ at which the spline derivative is evaluated.
+   * \param order The order up to which the derivatives are computed.
+   **/
+  typename SplineTraits<Spline>::DerivativeType derivatives(Scalar u, DenseIndex order) const;
 
-  template <typename Scalar_, int Dim_, int Degree_>
-  DenseIndex Spline<Scalar_, Dim_, Degree_>::span(Scalar u) const
-  {
-    return Spline::Span(u, degree(), knots());
-  }
-
-  template <typename Scalar_, int Dim_, int Degree_>
-  typename Spline<Scalar_, Dim_, Degree_>::PointType Spline<Scalar_, Dim_, Degree_>::operator()(Scalar u) const
-  {
-    enum { Order = SplineTraits<Spline>::OrderAtCompileTime };
-
-    const DenseIndex span = this->span(u);
-    const DenseIndex p = degree();
-    const BasisVectorType basis_funcs = basisFunctions(u);
-
-    const Replicate<BasisVectorType,Dimension,1> ctrl_weights(basis_funcs);
-    const Block<const ControlPointVectorType,Dimension,Order> ctrl_pts(ctrls(),0,span-p,Dimension,p+1);
-    return (ctrl_weights * ctrl_pts).rowwise().sum();
-  }
-
-  /* --------------------------------------------------------------------------------------------- */
-
-  template <typename SplineType, typename DerivativeType>
-  void derivativesImpl(const SplineType& spline, typename SplineType::Scalar u, DenseIndex order, DerivativeType& der)
-  {    
-    enum { Dimension = SplineTraits<SplineType>::Dimension };
-    enum { Order = SplineTraits<SplineType>::OrderAtCompileTime };
-    enum { DerivativeOrder = DerivativeType::ColsAtCompileTime };
-
-    typedef typename SplineTraits<SplineType>::ControlPointVectorType ControlPointVectorType;
-    typedef typename SplineTraits<SplineType,DerivativeOrder>::BasisDerivativeType BasisDerivativeType;
-    typedef typename BasisDerivativeType::ConstRowXpr BasisDerivativeRowXpr;    
-
-    const DenseIndex p = spline.degree();
-    const DenseIndex span = spline.span(u);
-
-    const DenseIndex n = (std::min)(p, order);
-
-    der.resize(Dimension,n+1);
-
-    // Retrieve the basis function derivatives up to the desired order...    
-    const BasisDerivativeType basis_func_ders = spline.template basisFunctionDerivatives<DerivativeOrder>(u, n+1);
-
-    // ... and perform the linear combinations of the control points.
-    for (DenseIndex der_order=0; der_order<n+1; ++der_order)
-    {
-      const Replicate<BasisDerivativeRowXpr,Dimension,1> ctrl_weights( basis_func_ders.row(der_order) );
-      const Block<const ControlPointVectorType,Dimension,Order> ctrl_pts(spline.ctrls(),0,span-p,Dimension,p+1);
-      der.col(der_order) = (ctrl_weights * ctrl_pts).rowwise().sum();
-    }
-  }
-
-  template <typename Scalar_, int Dim_, int Degree_>
-  typename SplineTraits< Spline<Scalar_, Dim_, Degree_> >::DerivativeType
-    Spline<Scalar_, Dim_, Degree_>::derivatives(Scalar u, DenseIndex order) const
-  {
-    typename SplineTraits< Spline >::DerivativeType res;
-    derivativesImpl(*this, u, order, res);
-    return res;
-  }
-
-  template <typename Scalar_, int Dim_, int Degree_>
+  /**
+   * \copydoc Spline::derivatives
+   * Using the template version of this function is more efficieent since
+   * temporary objects are allocated on the stack whenever this is possible.
+   **/
   template <int DerivativeOrder>
-  typename SplineTraits< Spline<Scalar_, Dim_, Degree_>, DerivativeOrder >::DerivativeType
-    Spline<Scalar_, Dim_, Degree_>::derivatives(Scalar u, DenseIndex order) const
-  {
-    typename SplineTraits< Spline, DerivativeOrder >::DerivativeType res;
-    derivativesImpl(*this, u, order, res);
-    return res;
-  }
+  typename SplineTraits<Spline, DerivativeOrder>::DerivativeType derivatives(Scalar u,
+                                                                             DenseIndex order = DerivativeOrder) const;
 
-  template <typename Scalar_, int Dim_, int Degree_>
-  typename SplineTraits< Spline<Scalar_, Dim_, Degree_> >::BasisVectorType
-    Spline<Scalar_, Dim_, Degree_>::basisFunctions(Scalar u) const
-  {
-    return Spline::BasisFunctions(u, degree(), knots());
-  }
+  /**
+   * \brief Computes the non-zero basis functions at the given site.
+   *
+   * Splines have local support and a point from their image is defined
+   * by exactly \f$p+1\f$ control points \f$P_i\f$ where \f$p\f$ is the
+   * spline degree.
+   *
+   * This function computes the \f$p+1\f$ non-zero basis function values
+   * for a given parameter value \f$u\f$. It returns
+   * \f{align*}{
+   *   N_{i,p}(u), \hdots, N_{i+p+1,p}(u)
+   * \f}
+   *
+   * \param u Parameter \f$u \in [0;1]\f$ at which the non-zero basis functions
+   *          are computed.
+   **/
+  typename SplineTraits<Spline>::BasisVectorType basisFunctions(Scalar u) const;
 
-  /* --------------------------------------------------------------------------------------------- */
-  
-  
-  template <typename Scalar_, int Dim_, int Degree_>
+  /**
+   * \brief Computes the non-zero spline basis function derivatives up to given order.
+   *
+   * The function computes
+   * \f{align*}{
+   *   \frac{d^i}{du^i} N_{i,p}(u), \hdots, \frac{d^i}{du^i} N_{i+p+1,p}(u)
+   * \f}
+   * with i ranging from 0 up to the specified order.
+   *
+   * \param u Parameter \f$u \in [0;1]\f$ at which the non-zero basis function
+   *          derivatives are computed.
+   * \param order The order up to which the basis function derivatives are computes.
+   **/
+  typename SplineTraits<Spline>::BasisDerivativeType basisFunctionDerivatives(Scalar u, DenseIndex order) const;
+
+  /**
+   * \copydoc Spline::basisFunctionDerivatives
+   * Using the template version of this function is more efficieent since
+   * temporary objects are allocated on the stack whenever this is possible.
+   **/
+  template <int DerivativeOrder>
+  typename SplineTraits<Spline, DerivativeOrder>::BasisDerivativeType basisFunctionDerivatives(
+      Scalar u, DenseIndex order = DerivativeOrder) const;
+
+  /**
+   * \brief Returns the spline degree.
+   **/
+  DenseIndex degree() const;
+
+  /**
+   * \brief Returns the span within the knot vector in which u is falling.
+   * \param u The site for which the span is determined.
+   **/
+  DenseIndex span(Scalar u) const;
+
+  /**
+   * \brief Computes the span within the provided knot vector in which u is falling.
+   **/
+  static DenseIndex Span(typename SplineTraits<Spline>::Scalar u, DenseIndex degree,
+                         const typename SplineTraits<Spline>::KnotVectorType& knots);
+
+  /**
+   * \brief Returns the spline's non-zero basis functions.
+   *
+   * The function computes and returns
+   * \f{align*}{
+   *   N_{i,p}(u), \hdots, N_{i+p+1,p}(u)
+   * \f}
+   *
+   * \param u The site at which the basis functions are computed.
+   * \param degree The degree of the underlying spline.
+   * \param knots The underlying spline's knot vector.
+   **/
+  static BasisVectorType BasisFunctions(Scalar u, DenseIndex degree, const KnotVectorType& knots);
+
+  /**
+   * \copydoc Spline::basisFunctionDerivatives
+   * \param degree The degree of the underlying spline
+   * \param knots The underlying spline's knot vector.
+   **/
+  static BasisDerivativeType BasisFunctionDerivatives(const Scalar u, const DenseIndex order, const DenseIndex degree,
+                                                      const KnotVectorType& knots);
+
+ private:
+  KnotVectorType m_knots;         /*!< Knot vector. */
+  ControlPointVectorType m_ctrls; /*!< Control points. */
+
   template <typename DerivativeType>
-  void Spline<Scalar_, Dim_, Degree_>::BasisFunctionDerivativesImpl(
-    const typename Spline<Scalar_, Dim_, Degree_>::Scalar u,
-    const DenseIndex order,
-    const DenseIndex p, 
-    const typename Spline<Scalar_, Dim_, Degree_>::KnotVectorType& U,
-    DerivativeType& N_)
-  {
-    typedef Spline<Scalar_, Dim_, Degree_> SplineType;
-    enum { Order = SplineTraits<SplineType>::OrderAtCompileTime };
+  static void BasisFunctionDerivativesImpl(const typename Spline<Scalar_, Dim_, Degree_>::Scalar u,
+                                           const DenseIndex order, const DenseIndex p,
+                                           const typename Spline<Scalar_, Dim_, Degree_>::KnotVectorType& U,
+                                           DerivativeType& N_);
+};
 
-    const DenseIndex span = SplineType::Span(u, p, U);
+template <typename Scalar_, int Dim_, int Degree_>
+DenseIndex Spline<Scalar_, Dim_, Degree_>::Span(
+    typename SplineTraits<Spline<Scalar_, Dim_, Degree_> >::Scalar u, DenseIndex degree,
+    const typename SplineTraits<Spline<Scalar_, Dim_, Degree_> >::KnotVectorType& knots) {
+  // Piegl & Tiller, "The NURBS Book", A2.1 (p. 68)
+  if (u <= knots(0)) return degree;
+  const Scalar* pos = std::upper_bound(knots.data() + degree - 1, knots.data() + knots.size() - degree - 1, u);
+  return static_cast<DenseIndex>(std::distance(knots.data(), pos) - 1);
+}
 
-    const DenseIndex n = (std::min)(p, order);
+template <typename Scalar_, int Dim_, int Degree_>
+typename Spline<Scalar_, Dim_, Degree_>::BasisVectorType Spline<Scalar_, Dim_, Degree_>::BasisFunctions(
+    typename Spline<Scalar_, Dim_, Degree_>::Scalar u, DenseIndex degree,
+    const typename Spline<Scalar_, Dim_, Degree_>::KnotVectorType& knots) {
+  const DenseIndex p = degree;
+  const DenseIndex i = Spline::Span(u, degree, knots);
 
-    N_.resize(n+1, p+1);
+  const KnotVectorType& U = knots;
 
-    BasisVectorType left = BasisVectorType::Zero(p+1);
-    BasisVectorType right = BasisVectorType::Zero(p+1);
+  BasisVectorType left(p + 1);
+  left(0) = Scalar(0);
+  BasisVectorType right(p + 1);
+  right(0) = Scalar(0);
 
-    Matrix<Scalar,Order,Order> ndu(p+1,p+1);
+  VectorBlock<BasisVectorType, Degree>(left, 1, p) =
+      u - VectorBlock<const KnotVectorType, Degree>(U, i + 1 - p, p).reverse();
+  VectorBlock<BasisVectorType, Degree>(right, 1, p) = VectorBlock<const KnotVectorType, Degree>(U, i + 1, p) - u;
 
-    Scalar saved, temp; // FIXME These were double instead of Scalar. Was there a reason for that?
-
-    ndu(0,0) = 1.0;
-
-    DenseIndex j;
-    for (j=1; j<=p; ++j)
-    {
-      left[j] = u-U[span+1-j];
-      right[j] = U[span+j]-u;
-      saved = 0.0;
-
-      for (DenseIndex r=0; r<j; ++r)
-      {
-        /* Lower triangle */
-        ndu(j,r) = right[r+1]+left[j-r];
-        temp = ndu(r,j-1)/ndu(j,r);
-        /* Upper triangle */
-        ndu(r,j) = static_cast<Scalar>(saved+right[r+1] * temp);
-        saved = left[j-r] * temp;
-      }
-
-      ndu(j,j) = static_cast<Scalar>(saved);
+  BasisVectorType N(1, p + 1);
+  N(0) = Scalar(1);
+  for (DenseIndex j = 1; j <= p; ++j) {
+    Scalar saved = Scalar(0);
+    for (DenseIndex r = 0; r < j; r++) {
+      const Scalar tmp = N(r) / (right(r + 1) + left(j - r));
+      N[r] = saved + right(r + 1) * tmp;
+      saved = left(j - r) * tmp;
     }
-
-    for (j = p; j>=0; --j) 
-      N_(0,j) = ndu(j,p);
-
-    // Compute the derivatives
-    DerivativeType a(n+1,p+1);
-    DenseIndex r=0;
-    for (; r<=p; ++r)
-    {
-      DenseIndex s1,s2;
-      s1 = 0; s2 = 1; // alternate rows in array a
-      a(0,0) = 1.0;
-
-      // Compute the k-th derivative
-      for (DenseIndex k=1; k<=static_cast<DenseIndex>(n); ++k)
-      {
-        Scalar d = 0.0;
-        DenseIndex rk,pk,j1,j2;
-        rk = r-k; pk = p-k;
-
-        if (r>=k)
-        {
-          a(s2,0) = a(s1,0)/ndu(pk+1,rk);
-          d = a(s2,0)*ndu(rk,pk);
-        }
-
-        if (rk>=-1) j1 = 1;
-        else        j1 = -rk;
-
-        if (r-1 <= pk) j2 = k-1;
-        else           j2 = p-r;
-
-        for (j=j1; j<=j2; ++j)
-        {
-          a(s2,j) = (a(s1,j)-a(s1,j-1))/ndu(pk+1,rk+j);
-          d += a(s2,j)*ndu(rk+j,pk);
-        }
-
-        if (r<=pk)
-        {
-          a(s2,k) = -a(s1,k-1)/ndu(pk+1,r);
-          d += a(s2,k)*ndu(r,pk);
-        }
-
-        N_(k,r) = static_cast<Scalar>(d);
-        j = s1; s1 = s2; s2 = j; // Switch rows
-      }
-    }
-
-    /* Multiply through by the correct factors */
-    /* (Eq. [2.9])                             */
-    r = p;
-    for (DenseIndex k=1; k<=static_cast<DenseIndex>(n); ++k)
-    {
-      for (j=p; j>=0; --j) N_(k,j) *= r;
-      r *= p-k;
-    }
+    N(j) = saved;
   }
+  return N;
+}
 
-  template <typename Scalar_, int Dim_, int Degree_>
-  typename SplineTraits< Spline<Scalar_, Dim_, Degree_> >::BasisDerivativeType
-    Spline<Scalar_, Dim_, Degree_>::basisFunctionDerivatives(Scalar u, DenseIndex order) const
-  {
-    typename SplineTraits<Spline<Scalar_, Dim_, Degree_> >::BasisDerivativeType der;
-    BasisFunctionDerivativesImpl(u, order, degree(), knots(), der);
-    return der;
-  }
+template <typename Scalar_, int Dim_, int Degree_>
+DenseIndex Spline<Scalar_, Dim_, Degree_>::degree() const {
+  if (Degree_ == Dynamic)
+    return m_knots.size() - m_ctrls.cols() - 1;
+  else
+    return Degree_;
+}
 
-  template <typename Scalar_, int Dim_, int Degree_>
-  template <int DerivativeOrder>
-  typename SplineTraits< Spline<Scalar_, Dim_, Degree_>, DerivativeOrder >::BasisDerivativeType
-    Spline<Scalar_, Dim_, Degree_>::basisFunctionDerivatives(Scalar u, DenseIndex order) const
-  {
-    typename SplineTraits< Spline<Scalar_, Dim_, Degree_>, DerivativeOrder >::BasisDerivativeType der;
-    BasisFunctionDerivativesImpl(u, order, degree(), knots(), der);
-    return der;
-  }
+template <typename Scalar_, int Dim_, int Degree_>
+DenseIndex Spline<Scalar_, Dim_, Degree_>::span(Scalar u) const {
+  return Spline::Span(u, degree(), knots());
+}
 
-  template <typename Scalar_, int Dim_, int Degree_>
-  typename SplineTraits<Spline<Scalar_, Dim_, Degree_> >::BasisDerivativeType
-  Spline<Scalar_, Dim_, Degree_>::BasisFunctionDerivatives(
-    const typename Spline<Scalar_, Dim_, Degree_>::Scalar u,
-    const DenseIndex order,
-    const DenseIndex degree,
-    const typename Spline<Scalar_, Dim_, Degree_>::KnotVectorType& knots)
-  {
-    typename SplineTraits<Spline>::BasisDerivativeType der;
-    BasisFunctionDerivativesImpl(u, order, degree, knots, der);
-    return der;
+template <typename Scalar_, int Dim_, int Degree_>
+typename Spline<Scalar_, Dim_, Degree_>::PointType Spline<Scalar_, Dim_, Degree_>::operator()(Scalar u) const {
+  enum { Order = SplineTraits<Spline>::OrderAtCompileTime };
+
+  const DenseIndex span = this->span(u);
+  const DenseIndex p = degree();
+  const BasisVectorType basis_funcs = basisFunctions(u);
+
+  const Replicate<BasisVectorType, Dimension, 1> ctrl_weights(basis_funcs);
+  const Block<const ControlPointVectorType, Dimension, Order> ctrl_pts(ctrls(), 0, span - p, Dimension, p + 1);
+  return (ctrl_weights * ctrl_pts).rowwise().sum();
+}
+
+/* --------------------------------------------------------------------------------------------- */
+
+template <typename SplineType, typename DerivativeType>
+void derivativesImpl(const SplineType& spline, typename SplineType::Scalar u, DenseIndex order, DerivativeType& der) {
+  enum { Dimension = SplineTraits<SplineType>::Dimension };
+  enum { Order = SplineTraits<SplineType>::OrderAtCompileTime };
+  enum { DerivativeOrder = DerivativeType::ColsAtCompileTime };
+
+  typedef typename SplineTraits<SplineType>::ControlPointVectorType ControlPointVectorType;
+  typedef typename SplineTraits<SplineType, DerivativeOrder>::BasisDerivativeType BasisDerivativeType;
+  typedef typename BasisDerivativeType::ConstRowXpr BasisDerivativeRowXpr;
+
+  const DenseIndex p = spline.degree();
+  const DenseIndex span = spline.span(u);
+
+  const DenseIndex n = (std::min)(p, order);
+
+  der.resize(Dimension, n + 1);
+
+  // Retrieve the basis function derivatives up to the desired order...
+  const BasisDerivativeType basis_func_ders = spline.template basisFunctionDerivatives<DerivativeOrder>(u, n + 1);
+
+  // ... and perform the linear combinations of the control points.
+  for (DenseIndex der_order = 0; der_order < n + 1; ++der_order) {
+    const Replicate<BasisDerivativeRowXpr, Dimension, 1> ctrl_weights(basis_func_ders.row(der_order));
+    const Block<const ControlPointVectorType, Dimension, Order> ctrl_pts(spline.ctrls(), 0, span - p, Dimension, p + 1);
+    der.col(der_order) = (ctrl_weights * ctrl_pts).rowwise().sum();
   }
 }
 
-#endif // EIGEN_SPLINE_H
+template <typename Scalar_, int Dim_, int Degree_>
+typename SplineTraits<Spline<Scalar_, Dim_, Degree_> >::DerivativeType Spline<Scalar_, Dim_, Degree_>::derivatives(
+    Scalar u, DenseIndex order) const {
+  typename SplineTraits<Spline>::DerivativeType res;
+  derivativesImpl(*this, u, order, res);
+  return res;
+}
+
+template <typename Scalar_, int Dim_, int Degree_>
+template <int DerivativeOrder>
+typename SplineTraits<Spline<Scalar_, Dim_, Degree_>, DerivativeOrder>::DerivativeType
+Spline<Scalar_, Dim_, Degree_>::derivatives(Scalar u, DenseIndex order) const {
+  typename SplineTraits<Spline, DerivativeOrder>::DerivativeType res;
+  derivativesImpl(*this, u, order, res);
+  return res;
+}
+
+template <typename Scalar_, int Dim_, int Degree_>
+typename SplineTraits<Spline<Scalar_, Dim_, Degree_> >::BasisVectorType Spline<Scalar_, Dim_, Degree_>::basisFunctions(
+    Scalar u) const {
+  return Spline::BasisFunctions(u, degree(), knots());
+}
+
+/* --------------------------------------------------------------------------------------------- */
+
+template <typename Scalar_, int Dim_, int Degree_>
+template <typename DerivativeType>
+void Spline<Scalar_, Dim_, Degree_>::BasisFunctionDerivativesImpl(
+    const typename Spline<Scalar_, Dim_, Degree_>::Scalar u, const DenseIndex order, const DenseIndex p,
+    const typename Spline<Scalar_, Dim_, Degree_>::KnotVectorType& U, DerivativeType& N_) {
+  typedef Spline<Scalar_, Dim_, Degree_> SplineType;
+  enum { Order = SplineTraits<SplineType>::OrderAtCompileTime };
+
+  const DenseIndex span = SplineType::Span(u, p, U);
+
+  const DenseIndex n = (std::min)(p, order);
+
+  N_.resize(n + 1, p + 1);
+
+  BasisVectorType left = BasisVectorType::Zero(p + 1);
+  BasisVectorType right = BasisVectorType::Zero(p + 1);
+
+  Matrix<Scalar, Order, Order> ndu(p + 1, p + 1);
+
+  Scalar saved, temp;  // FIXME These were double instead of Scalar. Was there a reason for that?
+
+  ndu(0, 0) = 1.0;
+
+  DenseIndex j;
+  for (j = 1; j <= p; ++j) {
+    left[j] = u - U[span + 1 - j];
+    right[j] = U[span + j] - u;
+    saved = 0.0;
+
+    for (DenseIndex r = 0; r < j; ++r) {
+      /* Lower triangle */
+      ndu(j, r) = right[r + 1] + left[j - r];
+      temp = ndu(r, j - 1) / ndu(j, r);
+      /* Upper triangle */
+      ndu(r, j) = static_cast<Scalar>(saved + right[r + 1] * temp);
+      saved = left[j - r] * temp;
+    }
+
+    ndu(j, j) = static_cast<Scalar>(saved);
+  }
+
+  for (j = p; j >= 0; --j) N_(0, j) = ndu(j, p);
+
+  // Compute the derivatives
+  DerivativeType a(n + 1, p + 1);
+  DenseIndex r = 0;
+  for (; r <= p; ++r) {
+    DenseIndex s1, s2;
+    s1 = 0;
+    s2 = 1;  // alternate rows in array a
+    a(0, 0) = 1.0;
+
+    // Compute the k-th derivative
+    for (DenseIndex k = 1; k <= static_cast<DenseIndex>(n); ++k) {
+      Scalar d = 0.0;
+      DenseIndex rk, pk, j1, j2;
+      rk = r - k;
+      pk = p - k;
+
+      if (r >= k) {
+        a(s2, 0) = a(s1, 0) / ndu(pk + 1, rk);
+        d = a(s2, 0) * ndu(rk, pk);
+      }
+
+      if (rk >= -1)
+        j1 = 1;
+      else
+        j1 = -rk;
+
+      if (r - 1 <= pk)
+        j2 = k - 1;
+      else
+        j2 = p - r;
+
+      for (j = j1; j <= j2; ++j) {
+        a(s2, j) = (a(s1, j) - a(s1, j - 1)) / ndu(pk + 1, rk + j);
+        d += a(s2, j) * ndu(rk + j, pk);
+      }
+
+      if (r <= pk) {
+        a(s2, k) = -a(s1, k - 1) / ndu(pk + 1, r);
+        d += a(s2, k) * ndu(r, pk);
+      }
+
+      N_(k, r) = static_cast<Scalar>(d);
+      j = s1;
+      s1 = s2;
+      s2 = j;  // Switch rows
+    }
+  }
+
+  /* Multiply through by the correct factors */
+  /* (Eq. [2.9])                             */
+  r = p;
+  for (DenseIndex k = 1; k <= static_cast<DenseIndex>(n); ++k) {
+    for (j = p; j >= 0; --j) N_(k, j) *= r;
+    r *= p - k;
+  }
+}
+
+template <typename Scalar_, int Dim_, int Degree_>
+typename SplineTraits<Spline<Scalar_, Dim_, Degree_> >::BasisDerivativeType
+Spline<Scalar_, Dim_, Degree_>::basisFunctionDerivatives(Scalar u, DenseIndex order) const {
+  typename SplineTraits<Spline<Scalar_, Dim_, Degree_> >::BasisDerivativeType der;
+  BasisFunctionDerivativesImpl(u, order, degree(), knots(), der);
+  return der;
+}
+
+template <typename Scalar_, int Dim_, int Degree_>
+template <int DerivativeOrder>
+typename SplineTraits<Spline<Scalar_, Dim_, Degree_>, DerivativeOrder>::BasisDerivativeType
+Spline<Scalar_, Dim_, Degree_>::basisFunctionDerivatives(Scalar u, DenseIndex order) const {
+  typename SplineTraits<Spline<Scalar_, Dim_, Degree_>, DerivativeOrder>::BasisDerivativeType der;
+  BasisFunctionDerivativesImpl(u, order, degree(), knots(), der);
+  return der;
+}
+
+template <typename Scalar_, int Dim_, int Degree_>
+typename SplineTraits<Spline<Scalar_, Dim_, Degree_> >::BasisDerivativeType
+Spline<Scalar_, Dim_, Degree_>::BasisFunctionDerivatives(
+    const typename Spline<Scalar_, Dim_, Degree_>::Scalar u, const DenseIndex order, const DenseIndex degree,
+    const typename Spline<Scalar_, Dim_, Degree_>::KnotVectorType& knots) {
+  typename SplineTraits<Spline>::BasisDerivativeType der;
+  BasisFunctionDerivativesImpl(u, order, degree, knots, der);
+  return der;
+}
+}  // namespace Eigen
+
+#endif  // EIGEN_SPLINE_H
diff --git a/unsupported/Eigen/src/Splines/SplineFitting.h b/unsupported/Eigen/src/Splines/SplineFitting.h
index 8f4c1aa..f6a1111 100644
--- a/unsupported/Eigen/src/Splines/SplineFitting.h
+++ b/unsupported/Eigen/src/Splines/SplineFitting.h
@@ -23,413 +23,371 @@
 #include "../../../../Eigen/LU"
 #include "../../../../Eigen/QR"
 
+namespace Eigen {
+/**
+ * \brief Computes knot averages.
+ * \ingroup Splines_Module
+ *
+ * The knots are computed as
+ * \f{align*}
+ *  u_0 & = \hdots = u_p = 0 \\
+ *  u_{m-p} & = \hdots = u_{m} = 1 \\
+ *  u_{j+p} & = \frac{1}{p}\sum_{i=j}^{j+p-1}\bar{u}_i \quad\quad j=1,\hdots,n-p
+ * \f}
+ * where \f$p\f$ is the degree and \f$m+1\f$ the number knots
+ * of the desired interpolating spline.
+ *
+ * \param[in] parameters The input parameters. During interpolation one for each data point.
+ * \param[in] degree The spline degree which is used during the interpolation.
+ * \param[out] knots The output knot vector.
+ *
+ * \sa Les Piegl and Wayne Tiller, The NURBS book (2nd ed.), 1997, 9.2.1 Global Curve Interpolation to Point Data
+ **/
+template <typename KnotVectorType>
+void KnotAveraging(const KnotVectorType& parameters, DenseIndex degree, KnotVectorType& knots) {
+  knots.resize(parameters.size() + degree + 1);
 
-namespace Eigen
-{
-  /**
-   * \brief Computes knot averages.
-   * \ingroup Splines_Module
-   *
-   * The knots are computed as
-   * \f{align*}
-   *  u_0 & = \hdots = u_p = 0 \\
-   *  u_{m-p} & = \hdots = u_{m} = 1 \\
-   *  u_{j+p} & = \frac{1}{p}\sum_{i=j}^{j+p-1}\bar{u}_i \quad\quad j=1,\hdots,n-p
-   * \f}
-   * where \f$p\f$ is the degree and \f$m+1\f$ the number knots
-   * of the desired interpolating spline.
-   *
-   * \param[in] parameters The input parameters. During interpolation one for each data point.
-   * \param[in] degree The spline degree which is used during the interpolation.
-   * \param[out] knots The output knot vector.
-   *
-   * \sa Les Piegl and Wayne Tiller, The NURBS book (2nd ed.), 1997, 9.2.1 Global Curve Interpolation to Point Data
-   **/
-  template <typename KnotVectorType>
-  void KnotAveraging(const KnotVectorType& parameters, DenseIndex degree, KnotVectorType& knots)
-  {
-    knots.resize(parameters.size()+degree+1);      
+  for (DenseIndex j = 1; j < parameters.size() - degree; ++j) knots(j + degree) = parameters.segment(j, degree).mean();
 
-    for (DenseIndex j=1; j<parameters.size()-degree; ++j)
-      knots(j+degree) = parameters.segment(j,degree).mean();
-
-    knots.segment(0,degree+1) = KnotVectorType::Zero(degree+1);
-    knots.segment(knots.size()-degree-1,degree+1) = KnotVectorType::Ones(degree+1);
-  }
-
-  /**
-   * \brief Computes knot averages when derivative constraints are present.
-   * Note that this is a technical interpretation of the referenced article
-   * since the algorithm contained therein is incorrect as written.
-   * \ingroup Splines_Module
-   *
-   * \param[in] parameters The parameters at which the interpolation B-Spline
-   *            will intersect the given interpolation points. The parameters
-   *            are assumed to be a non-decreasing sequence.
-   * \param[in] degree The degree of the interpolating B-Spline. This must be
-   *            greater than zero.
-   * \param[in] derivativeIndices The indices corresponding to parameters at
-   *            which there are derivative constraints. The indices are assumed
-   *            to be a non-decreasing sequence.
-   * \param[out] knots The calculated knot vector. These will be returned as a
-   *             non-decreasing sequence
-   *
-   * \sa Les A. Piegl, Khairan Rajab, Volha Smarodzinana. 2008.
-   * Curve interpolation with directional constraints for engineering design. 
-   * Engineering with Computers
-   **/
-  template <typename KnotVectorType, typename ParameterVectorType, typename IndexArray>
-  void KnotAveragingWithDerivatives(const ParameterVectorType& parameters,
-                                    const unsigned int degree,
-                                    const IndexArray& derivativeIndices,
-                                    KnotVectorType& knots)
-  {
-    typedef typename ParameterVectorType::Scalar Scalar;
-
-    DenseIndex numParameters = parameters.size();
-    DenseIndex numDerivatives = derivativeIndices.size();
-
-    if (numDerivatives < 1)
-    {
-      KnotAveraging(parameters, degree, knots);
-      return;
-    }
-
-    DenseIndex startIndex;
-    DenseIndex endIndex;
-  
-    DenseIndex numInternalDerivatives = numDerivatives;
-    
-    if (derivativeIndices[0] == 0)
-    {
-      startIndex = 0;
-      --numInternalDerivatives;
-    }
-    else
-    {
-      startIndex = 1;
-    }
-    if (derivativeIndices[numDerivatives - 1] == numParameters - 1)
-    {
-      endIndex = numParameters - degree;
-      --numInternalDerivatives;
-    }
-    else
-    {
-      endIndex = numParameters - degree - 1;
-    }
-
-    // There are (endIndex - startIndex + 1) knots obtained from the averaging
-    // and 2 for the first and last parameters.
-    DenseIndex numAverageKnots = endIndex - startIndex + 3;
-    KnotVectorType averageKnots(numAverageKnots);
-    averageKnots[0] = parameters[0];
-
-    int newKnotIndex = 0;
-    for (DenseIndex i = startIndex; i <= endIndex; ++i)
-      averageKnots[++newKnotIndex] = parameters.segment(i, degree).mean();
-    averageKnots[++newKnotIndex] = parameters[numParameters - 1];
-
-    newKnotIndex = -1;
-  
-    ParameterVectorType temporaryParameters(numParameters + 1);
-    KnotVectorType derivativeKnots(numInternalDerivatives);
-    for (DenseIndex i = 0; i < numAverageKnots - 1; ++i)
-    {
-      temporaryParameters[0] = averageKnots[i];
-      ParameterVectorType parameterIndices(numParameters);
-      int temporaryParameterIndex = 1;
-      for (DenseIndex j = 0; j < numParameters; ++j)
-      {
-        Scalar parameter = parameters[j];
-        if (parameter >= averageKnots[i] && parameter < averageKnots[i + 1])
-        {
-          parameterIndices[temporaryParameterIndex] = j;
-          temporaryParameters[temporaryParameterIndex++] = parameter;
-        }
-      }
-      temporaryParameters[temporaryParameterIndex] = averageKnots[i + 1];
-
-      for (int j = 0; j <= temporaryParameterIndex - 2; ++j)
-      {
-        for (DenseIndex k = 0; k < derivativeIndices.size(); ++k)
-        {
-          if (parameterIndices[j + 1] == derivativeIndices[k]
-              && parameterIndices[j + 1] != 0
-              && parameterIndices[j + 1] != numParameters - 1)
-          {
-            derivativeKnots[++newKnotIndex] = temporaryParameters.segment(j, 3).mean();
-            break;
-          }
-        }
-      }
-    }
-    
-    KnotVectorType temporaryKnots(averageKnots.size() + derivativeKnots.size());
-
-    std::merge(averageKnots.data(), averageKnots.data() + averageKnots.size(),
-               derivativeKnots.data(), derivativeKnots.data() + derivativeKnots.size(),
-               temporaryKnots.data());
-
-    // Number of knots (one for each point and derivative) plus spline order.
-    DenseIndex numKnots = numParameters + numDerivatives + degree + 1;
-    knots.resize(numKnots);
-
-    knots.head(degree).fill(temporaryKnots[0]);
-    knots.tail(degree).fill(temporaryKnots.template tail<1>()[0]);
-    knots.segment(degree, temporaryKnots.size()) = temporaryKnots;
-  }
-
-  /**
-   * \brief Computes chord length parameters which are required for spline interpolation.
-   * \ingroup Splines_Module
-   *
-   * \param[in] pts The data points to which a spline should be fit.
-   * \param[out] chord_lengths The resulting chord length vector.
-   *
-   * \sa Les Piegl and Wayne Tiller, The NURBS book (2nd ed.), 1997, 9.2.1 Global Curve Interpolation to Point Data
-   **/   
-  template <typename PointArrayType, typename KnotVectorType>
-  void ChordLengths(const PointArrayType& pts, KnotVectorType& chord_lengths)
-  {
-    typedef typename KnotVectorType::Scalar Scalar;
-
-    const DenseIndex n = pts.cols();
-
-    // 1. compute the column-wise norms
-    chord_lengths.resize(pts.cols());
-    chord_lengths[0] = 0;
-    chord_lengths.rightCols(n-1) = (pts.array().leftCols(n-1) - pts.array().rightCols(n-1)).matrix().colwise().norm();
-
-    // 2. compute the partial sums
-    std::partial_sum(chord_lengths.data(), chord_lengths.data()+n, chord_lengths.data());
-
-    // 3. normalize the data
-    chord_lengths /= chord_lengths(n-1);
-    chord_lengths(n-1) = Scalar(1);
-  }
-
-  /**
-   * \brief Spline fitting methods.
-   * \ingroup Splines_Module
-   **/     
-  template <typename SplineType>
-  struct SplineFitting
-  {
-    typedef typename SplineType::KnotVectorType KnotVectorType;
-    typedef typename SplineType::ParameterVectorType ParameterVectorType;
-
-    /**
-     * \brief Fits an interpolating Spline to the given data points.
-     *
-     * \param pts The points for which an interpolating spline will be computed.
-     * \param degree The degree of the interpolating spline.
-     *
-     * \returns A spline interpolating the initially provided points.
-     **/
-    template <typename PointArrayType>
-    static SplineType Interpolate(const PointArrayType& pts, DenseIndex degree);
-
-    /**
-     * \brief Fits an interpolating Spline to the given data points.
-     *
-     * \param pts The points for which an interpolating spline will be computed.
-     * \param degree The degree of the interpolating spline.
-     * \param knot_parameters The knot parameters for the interpolation.
-     *
-     * \returns A spline interpolating the initially provided points.
-     **/
-    template <typename PointArrayType>
-    static SplineType Interpolate(const PointArrayType& pts, DenseIndex degree, const KnotVectorType& knot_parameters);
-
-    /**
-     * \brief Fits an interpolating spline to the given data points and
-     * derivatives.
-     * 
-     * \param points The points for which an interpolating spline will be computed.
-     * \param derivatives The desired derivatives of the interpolating spline at interpolation
-     *                    points.
-     * \param derivativeIndices An array indicating which point each derivative belongs to. This
-     *                          must be the same size as @a derivatives.
-     * \param degree The degree of the interpolating spline.
-     *
-     * \returns A spline interpolating @a points with @a derivatives at those points.
-     *
-     * \sa Les A. Piegl, Khairan Rajab, Volha Smarodzinana. 2008.
-     * Curve interpolation with directional constraints for engineering design. 
-     * Engineering with Computers
-     **/
-    template <typename PointArrayType, typename IndexArray>
-    static SplineType InterpolateWithDerivatives(const PointArrayType& points,
-                                                 const PointArrayType& derivatives,
-                                                 const IndexArray& derivativeIndices,
-                                                 const unsigned int degree);
-
-    /**
-     * \brief Fits an interpolating spline to the given data points and derivatives.
-     * 
-     * \param points The points for which an interpolating spline will be computed.
-     * \param derivatives The desired derivatives of the interpolating spline at interpolation points.
-     * \param derivativeIndices An array indicating which point each derivative belongs to. This
-     *                          must be the same size as @a derivatives.
-     * \param degree The degree of the interpolating spline.
-     * \param parameters The parameters corresponding to the interpolation points.
-     *
-     * \returns A spline interpolating @a points with @a derivatives at those points.
-     *
-     * \sa Les A. Piegl, Khairan Rajab, Volha Smarodzinana. 2008.
-     * Curve interpolation with directional constraints for engineering design. 
-     * Engineering with Computers
-     */
-    template <typename PointArrayType, typename IndexArray>
-    static SplineType InterpolateWithDerivatives(const PointArrayType& points,
-                                                 const PointArrayType& derivatives,
-                                                 const IndexArray& derivativeIndices,
-                                                 const unsigned int degree,
-                                                 const ParameterVectorType& parameters);
-  };
-
-  template <typename SplineType>
-  template <typename PointArrayType>
-  SplineType SplineFitting<SplineType>::Interpolate(const PointArrayType& pts, DenseIndex degree, const KnotVectorType& knot_parameters)
-  {
-    typedef typename SplineType::KnotVectorType::Scalar Scalar;      
-    typedef typename SplineType::ControlPointVectorType ControlPointVectorType;      
-
-    typedef Matrix<Scalar,Dynamic,Dynamic> MatrixType;
-
-    KnotVectorType knots;
-    KnotAveraging(knot_parameters, degree, knots);
-
-    DenseIndex n = pts.cols();
-    MatrixType A = MatrixType::Zero(n,n);
-    for (DenseIndex i=1; i<n-1; ++i)
-    {
-      const DenseIndex span = SplineType::Span(knot_parameters[i], degree, knots);
-
-      // The segment call should somehow be told the spline order at compile time.
-      A.row(i).segment(span-degree, degree+1) = SplineType::BasisFunctions(knot_parameters[i], degree, knots);
-    }
-    A(0,0) = 1.0;
-    A(n-1,n-1) = 1.0;
-
-    HouseholderQR<MatrixType> qr(A);
-
-    // Here, we are creating a temporary due to an Eigen issue.
-    ControlPointVectorType ctrls = qr.solve(MatrixType(pts.transpose())).transpose();
-
-    return SplineType(knots, ctrls);
-  }
-
-  template <typename SplineType>
-  template <typename PointArrayType>
-  SplineType SplineFitting<SplineType>::Interpolate(const PointArrayType& pts, DenseIndex degree)
-  {
-    KnotVectorType chord_lengths; // knot parameters
-    ChordLengths(pts, chord_lengths);
-    return Interpolate(pts, degree, chord_lengths);
-  }
-  
-  template <typename SplineType>
-  template <typename PointArrayType, typename IndexArray>
-  SplineType 
-  SplineFitting<SplineType>::InterpolateWithDerivatives(const PointArrayType& points,
-                                                        const PointArrayType& derivatives,
-                                                        const IndexArray& derivativeIndices,
-                                                        const unsigned int degree,
-                                                        const ParameterVectorType& parameters)
-  {
-    typedef typename SplineType::KnotVectorType::Scalar Scalar;      
-    typedef typename SplineType::ControlPointVectorType ControlPointVectorType;
-
-    typedef Matrix<Scalar, Dynamic, Dynamic> MatrixType;
-
-    const DenseIndex n = points.cols() + derivatives.cols();
-    
-    KnotVectorType knots;
-
-    KnotAveragingWithDerivatives(parameters, degree, derivativeIndices, knots);
-    
-    // fill matrix
-    MatrixType A = MatrixType::Zero(n, n);
-
-    // Use these dimensions for quicker populating, then transpose for solving.
-    MatrixType b(points.rows(), n);
-
-    DenseIndex startRow;
-    DenseIndex derivativeStart;
-
-    // End derivatives.
-    if (derivativeIndices[0] == 0)
-    {
-      A.template block<1, 2>(1, 0) << -1, 1;
-      
-      Scalar y = (knots(degree + 1) - knots(0)) / degree;
-      b.col(1) = y*derivatives.col(0);
-      
-      startRow = 2;
-      derivativeStart = 1;
-    }
-    else
-    {
-      startRow = 1;
-      derivativeStart = 0;
-    }
-    if (derivativeIndices[derivatives.cols() - 1] == points.cols() - 1)
-    {
-      A.template block<1, 2>(n - 2, n - 2) << -1, 1;
-
-      Scalar y = (knots(knots.size() - 1) - knots(knots.size() - (degree + 2))) / degree;
-      b.col(b.cols() - 2) = y*derivatives.col(derivatives.cols() - 1);
-    }
-    
-    DenseIndex row = startRow;
-    DenseIndex derivativeIndex = derivativeStart;
-    for (DenseIndex i = 1; i < parameters.size() - 1; ++i)
-    {
-      const DenseIndex span = SplineType::Span(parameters[i], degree, knots);
-
-      if (derivativeIndex < derivativeIndices.size() && derivativeIndices[derivativeIndex] == i)
-      {
-        A.block(row, span - degree, 2, degree + 1)
-          = SplineType::BasisFunctionDerivatives(parameters[i], 1, degree, knots);
-
-        b.col(row++) = points.col(i);
-        b.col(row++) = derivatives.col(derivativeIndex++);
-      }
-      else
-      {
-        A.row(row).segment(span - degree, degree + 1)
-          = SplineType::BasisFunctions(parameters[i], degree, knots);
-        b.col(row++) = points.col(i);
-      }
-    }
-    b.col(0) = points.col(0);
-    b.col(b.cols() - 1) = points.col(points.cols() - 1);
-    A(0,0) = 1;
-    A(n - 1, n - 1) = 1;
-    
-    // Solve
-    FullPivLU<MatrixType> lu(A);
-    ControlPointVectorType controlPoints = lu.solve(MatrixType(b.transpose())).transpose();
-
-    SplineType spline(knots, controlPoints);
-    
-    return spline;
-  }
-  
-  template <typename SplineType>
-  template <typename PointArrayType, typename IndexArray>
-  SplineType
-  SplineFitting<SplineType>::InterpolateWithDerivatives(const PointArrayType& points,
-                                                        const PointArrayType& derivatives,
-                                                        const IndexArray& derivativeIndices,
-                                                        const unsigned int degree)
-  {
-    ParameterVectorType parameters;
-    ChordLengths(points, parameters);
-    return InterpolateWithDerivatives(points, derivatives, derivativeIndices, degree, parameters);
-  }
+  knots.segment(0, degree + 1) = KnotVectorType::Zero(degree + 1);
+  knots.segment(knots.size() - degree - 1, degree + 1) = KnotVectorType::Ones(degree + 1);
 }
 
-#endif // EIGEN_SPLINE_FITTING_H
+/**
+ * \brief Computes knot averages when derivative constraints are present.
+ * Note that this is a technical interpretation of the referenced article
+ * since the algorithm contained therein is incorrect as written.
+ * \ingroup Splines_Module
+ *
+ * \param[in] parameters The parameters at which the interpolation B-Spline
+ *            will intersect the given interpolation points. The parameters
+ *            are assumed to be a non-decreasing sequence.
+ * \param[in] degree The degree of the interpolating B-Spline. This must be
+ *            greater than zero.
+ * \param[in] derivativeIndices The indices corresponding to parameters at
+ *            which there are derivative constraints. The indices are assumed
+ *            to be a non-decreasing sequence.
+ * \param[out] knots The calculated knot vector. These will be returned as a
+ *             non-decreasing sequence
+ *
+ * \sa Les A. Piegl, Khairan Rajab, Volha Smarodzinana. 2008.
+ * Curve interpolation with directional constraints for engineering design.
+ * Engineering with Computers
+ **/
+template <typename KnotVectorType, typename ParameterVectorType, typename IndexArray>
+void KnotAveragingWithDerivatives(const ParameterVectorType& parameters, const unsigned int degree,
+                                  const IndexArray& derivativeIndices, KnotVectorType& knots) {
+  typedef typename ParameterVectorType::Scalar Scalar;
+
+  DenseIndex numParameters = parameters.size();
+  DenseIndex numDerivatives = derivativeIndices.size();
+
+  if (numDerivatives < 1) {
+    KnotAveraging(parameters, degree, knots);
+    return;
+  }
+
+  DenseIndex startIndex;
+  DenseIndex endIndex;
+
+  DenseIndex numInternalDerivatives = numDerivatives;
+
+  if (derivativeIndices[0] == 0) {
+    startIndex = 0;
+    --numInternalDerivatives;
+  } else {
+    startIndex = 1;
+  }
+  if (derivativeIndices[numDerivatives - 1] == numParameters - 1) {
+    endIndex = numParameters - degree;
+    --numInternalDerivatives;
+  } else {
+    endIndex = numParameters - degree - 1;
+  }
+
+  // There are (endIndex - startIndex + 1) knots obtained from the averaging
+  // and 2 for the first and last parameters.
+  DenseIndex numAverageKnots = endIndex - startIndex + 3;
+  KnotVectorType averageKnots(numAverageKnots);
+  averageKnots[0] = parameters[0];
+
+  int newKnotIndex = 0;
+  for (DenseIndex i = startIndex; i <= endIndex; ++i)
+    averageKnots[++newKnotIndex] = parameters.segment(i, degree).mean();
+  averageKnots[++newKnotIndex] = parameters[numParameters - 1];
+
+  newKnotIndex = -1;
+
+  ParameterVectorType temporaryParameters(numParameters + 1);
+  KnotVectorType derivativeKnots(numInternalDerivatives);
+  for (DenseIndex i = 0; i < numAverageKnots - 1; ++i) {
+    temporaryParameters[0] = averageKnots[i];
+    ParameterVectorType parameterIndices(numParameters);
+    int temporaryParameterIndex = 1;
+    for (DenseIndex j = 0; j < numParameters; ++j) {
+      Scalar parameter = parameters[j];
+      if (parameter >= averageKnots[i] && parameter < averageKnots[i + 1]) {
+        parameterIndices[temporaryParameterIndex] = j;
+        temporaryParameters[temporaryParameterIndex++] = parameter;
+      }
+    }
+    temporaryParameters[temporaryParameterIndex] = averageKnots[i + 1];
+
+    for (int j = 0; j <= temporaryParameterIndex - 2; ++j) {
+      for (DenseIndex k = 0; k < derivativeIndices.size(); ++k) {
+        if (parameterIndices[j + 1] == derivativeIndices[k] && parameterIndices[j + 1] != 0 &&
+            parameterIndices[j + 1] != numParameters - 1) {
+          derivativeKnots[++newKnotIndex] = temporaryParameters.segment(j, 3).mean();
+          break;
+        }
+      }
+    }
+  }
+
+  KnotVectorType temporaryKnots(averageKnots.size() + derivativeKnots.size());
+
+  std::merge(averageKnots.data(), averageKnots.data() + averageKnots.size(), derivativeKnots.data(),
+             derivativeKnots.data() + derivativeKnots.size(), temporaryKnots.data());
+
+  // Number of knots (one for each point and derivative) plus spline order.
+  DenseIndex numKnots = numParameters + numDerivatives + degree + 1;
+  knots.resize(numKnots);
+
+  knots.head(degree).fill(temporaryKnots[0]);
+  knots.tail(degree).fill(temporaryKnots.template tail<1>()[0]);
+  knots.segment(degree, temporaryKnots.size()) = temporaryKnots;
+}
+
+/**
+ * \brief Computes chord length parameters which are required for spline interpolation.
+ * \ingroup Splines_Module
+ *
+ * \param[in] pts The data points to which a spline should be fit.
+ * \param[out] chord_lengths The resulting chord length vector.
+ *
+ * \sa Les Piegl and Wayne Tiller, The NURBS book (2nd ed.), 1997, 9.2.1 Global Curve Interpolation to Point Data
+ **/
+template <typename PointArrayType, typename KnotVectorType>
+void ChordLengths(const PointArrayType& pts, KnotVectorType& chord_lengths) {
+  typedef typename KnotVectorType::Scalar Scalar;
+
+  const DenseIndex n = pts.cols();
+
+  // 1. compute the column-wise norms
+  chord_lengths.resize(pts.cols());
+  chord_lengths[0] = 0;
+  chord_lengths.rightCols(n - 1) =
+      (pts.array().leftCols(n - 1) - pts.array().rightCols(n - 1)).matrix().colwise().norm();
+
+  // 2. compute the partial sums
+  std::partial_sum(chord_lengths.data(), chord_lengths.data() + n, chord_lengths.data());
+
+  // 3. normalize the data
+  chord_lengths /= chord_lengths(n - 1);
+  chord_lengths(n - 1) = Scalar(1);
+}
+
+/**
+ * \brief Spline fitting methods.
+ * \ingroup Splines_Module
+ **/
+template <typename SplineType>
+struct SplineFitting {
+  typedef typename SplineType::KnotVectorType KnotVectorType;
+  typedef typename SplineType::ParameterVectorType ParameterVectorType;
+
+  /**
+   * \brief Fits an interpolating Spline to the given data points.
+   *
+   * \param pts The points for which an interpolating spline will be computed.
+   * \param degree The degree of the interpolating spline.
+   *
+   * \returns A spline interpolating the initially provided points.
+   **/
+  template <typename PointArrayType>
+  static SplineType Interpolate(const PointArrayType& pts, DenseIndex degree);
+
+  /**
+   * \brief Fits an interpolating Spline to the given data points.
+   *
+   * \param pts The points for which an interpolating spline will be computed.
+   * \param degree The degree of the interpolating spline.
+   * \param knot_parameters The knot parameters for the interpolation.
+   *
+   * \returns A spline interpolating the initially provided points.
+   **/
+  template <typename PointArrayType>
+  static SplineType Interpolate(const PointArrayType& pts, DenseIndex degree, const KnotVectorType& knot_parameters);
+
+  /**
+   * \brief Fits an interpolating spline to the given data points and
+   * derivatives.
+   *
+   * \param points The points for which an interpolating spline will be computed.
+   * \param derivatives The desired derivatives of the interpolating spline at interpolation
+   *                    points.
+   * \param derivativeIndices An array indicating which point each derivative belongs to. This
+   *                          must be the same size as @a derivatives.
+   * \param degree The degree of the interpolating spline.
+   *
+   * \returns A spline interpolating @a points with @a derivatives at those points.
+   *
+   * \sa Les A. Piegl, Khairan Rajab, Volha Smarodzinana. 2008.
+   * Curve interpolation with directional constraints for engineering design.
+   * Engineering with Computers
+   **/
+  template <typename PointArrayType, typename IndexArray>
+  static SplineType InterpolateWithDerivatives(const PointArrayType& points, const PointArrayType& derivatives,
+                                               const IndexArray& derivativeIndices, const unsigned int degree);
+
+  /**
+   * \brief Fits an interpolating spline to the given data points and derivatives.
+   *
+   * \param points The points for which an interpolating spline will be computed.
+   * \param derivatives The desired derivatives of the interpolating spline at interpolation points.
+   * \param derivativeIndices An array indicating which point each derivative belongs to. This
+   *                          must be the same size as @a derivatives.
+   * \param degree The degree of the interpolating spline.
+   * \param parameters The parameters corresponding to the interpolation points.
+   *
+   * \returns A spline interpolating @a points with @a derivatives at those points.
+   *
+   * \sa Les A. Piegl, Khairan Rajab, Volha Smarodzinana. 2008.
+   * Curve interpolation with directional constraints for engineering design.
+   * Engineering with Computers
+   */
+  template <typename PointArrayType, typename IndexArray>
+  static SplineType InterpolateWithDerivatives(const PointArrayType& points, const PointArrayType& derivatives,
+                                               const IndexArray& derivativeIndices, const unsigned int degree,
+                                               const ParameterVectorType& parameters);
+};
+
+template <typename SplineType>
+template <typename PointArrayType>
+SplineType SplineFitting<SplineType>::Interpolate(const PointArrayType& pts, DenseIndex degree,
+                                                  const KnotVectorType& knot_parameters) {
+  typedef typename SplineType::KnotVectorType::Scalar Scalar;
+  typedef typename SplineType::ControlPointVectorType ControlPointVectorType;
+
+  typedef Matrix<Scalar, Dynamic, Dynamic> MatrixType;
+
+  KnotVectorType knots;
+  KnotAveraging(knot_parameters, degree, knots);
+
+  DenseIndex n = pts.cols();
+  MatrixType A = MatrixType::Zero(n, n);
+  for (DenseIndex i = 1; i < n - 1; ++i) {
+    const DenseIndex span = SplineType::Span(knot_parameters[i], degree, knots);
+
+    // The segment call should somehow be told the spline order at compile time.
+    A.row(i).segment(span - degree, degree + 1) = SplineType::BasisFunctions(knot_parameters[i], degree, knots);
+  }
+  A(0, 0) = 1.0;
+  A(n - 1, n - 1) = 1.0;
+
+  HouseholderQR<MatrixType> qr(A);
+
+  // Here, we are creating a temporary due to an Eigen issue.
+  ControlPointVectorType ctrls = qr.solve(MatrixType(pts.transpose())).transpose();
+
+  return SplineType(knots, ctrls);
+}
+
+template <typename SplineType>
+template <typename PointArrayType>
+SplineType SplineFitting<SplineType>::Interpolate(const PointArrayType& pts, DenseIndex degree) {
+  KnotVectorType chord_lengths;  // knot parameters
+  ChordLengths(pts, chord_lengths);
+  return Interpolate(pts, degree, chord_lengths);
+}
+
+template <typename SplineType>
+template <typename PointArrayType, typename IndexArray>
+SplineType SplineFitting<SplineType>::InterpolateWithDerivatives(const PointArrayType& points,
+                                                                 const PointArrayType& derivatives,
+                                                                 const IndexArray& derivativeIndices,
+                                                                 const unsigned int degree,
+                                                                 const ParameterVectorType& parameters) {
+  typedef typename SplineType::KnotVectorType::Scalar Scalar;
+  typedef typename SplineType::ControlPointVectorType ControlPointVectorType;
+
+  typedef Matrix<Scalar, Dynamic, Dynamic> MatrixType;
+
+  const DenseIndex n = points.cols() + derivatives.cols();
+
+  KnotVectorType knots;
+
+  KnotAveragingWithDerivatives(parameters, degree, derivativeIndices, knots);
+
+  // fill matrix
+  MatrixType A = MatrixType::Zero(n, n);
+
+  // Use these dimensions for quicker populating, then transpose for solving.
+  MatrixType b(points.rows(), n);
+
+  DenseIndex startRow;
+  DenseIndex derivativeStart;
+
+  // End derivatives.
+  if (derivativeIndices[0] == 0) {
+    A.template block<1, 2>(1, 0) << -1, 1;
+
+    Scalar y = (knots(degree + 1) - knots(0)) / degree;
+    b.col(1) = y * derivatives.col(0);
+
+    startRow = 2;
+    derivativeStart = 1;
+  } else {
+    startRow = 1;
+    derivativeStart = 0;
+  }
+  if (derivativeIndices[derivatives.cols() - 1] == points.cols() - 1) {
+    A.template block<1, 2>(n - 2, n - 2) << -1, 1;
+
+    Scalar y = (knots(knots.size() - 1) - knots(knots.size() - (degree + 2))) / degree;
+    b.col(b.cols() - 2) = y * derivatives.col(derivatives.cols() - 1);
+  }
+
+  DenseIndex row = startRow;
+  DenseIndex derivativeIndex = derivativeStart;
+  for (DenseIndex i = 1; i < parameters.size() - 1; ++i) {
+    const DenseIndex span = SplineType::Span(parameters[i], degree, knots);
+
+    if (derivativeIndex < derivativeIndices.size() && derivativeIndices[derivativeIndex] == i) {
+      A.block(row, span - degree, 2, degree + 1) =
+          SplineType::BasisFunctionDerivatives(parameters[i], 1, degree, knots);
+
+      b.col(row++) = points.col(i);
+      b.col(row++) = derivatives.col(derivativeIndex++);
+    } else {
+      A.row(row).segment(span - degree, degree + 1) = SplineType::BasisFunctions(parameters[i], degree, knots);
+      b.col(row++) = points.col(i);
+    }
+  }
+  b.col(0) = points.col(0);
+  b.col(b.cols() - 1) = points.col(points.cols() - 1);
+  A(0, 0) = 1;
+  A(n - 1, n - 1) = 1;
+
+  // Solve
+  FullPivLU<MatrixType> lu(A);
+  ControlPointVectorType controlPoints = lu.solve(MatrixType(b.transpose())).transpose();
+
+  SplineType spline(knots, controlPoints);
+
+  return spline;
+}
+
+template <typename SplineType>
+template <typename PointArrayType, typename IndexArray>
+SplineType SplineFitting<SplineType>::InterpolateWithDerivatives(const PointArrayType& points,
+                                                                 const PointArrayType& derivatives,
+                                                                 const IndexArray& derivativeIndices,
+                                                                 const unsigned int degree) {
+  ParameterVectorType parameters;
+  ChordLengths(points, parameters);
+  return InterpolateWithDerivatives(points, derivatives, derivativeIndices, degree, parameters);
+}
+}  // namespace Eigen
+
+#endif  // EIGEN_SPLINE_FITTING_H
diff --git a/unsupported/Eigen/src/Splines/SplineFwd.h b/unsupported/Eigen/src/Splines/SplineFwd.h
index 76c9037..ff648d4 100644
--- a/unsupported/Eigen/src/Splines/SplineFwd.h
+++ b/unsupported/Eigen/src/Splines/SplineFwd.h
@@ -14,82 +14,96 @@
 #include "./InternalHeaderCheck.h"
 #include "../../../../Eigen/Core"
 
-namespace Eigen
-{
-    template <typename Scalar, int Dim, int Degree = Dynamic> class Spline;
+namespace Eigen {
+template <typename Scalar, int Dim, int Degree = Dynamic>
+class Spline;
 
-    template < typename SplineType, int DerivativeOrder = Dynamic > struct SplineTraits {};
+template <typename SplineType, int DerivativeOrder = Dynamic>
+struct SplineTraits {};
 
-    /**
-     * \ingroup Splines_Module
-     * \brief Compile-time attributes of the Spline class for Dynamic degree.
-     **/
-    template <typename Scalar_, int Dim_, int Degree_>
-    struct SplineTraits< Spline<Scalar_, Dim_, Degree_>, Dynamic >
-    {
-      typedef Scalar_ Scalar; /*!< The spline curve's scalar type. */
-      enum { Dimension = Dim_ /*!< The spline curve's dimension. */ };
-      enum { Degree = Degree_ /*!< The spline curve's degree. */ };
+/**
+ * \ingroup Splines_Module
+ * \brief Compile-time attributes of the Spline class for Dynamic degree.
+ **/
+template <typename Scalar_, int Dim_, int Degree_>
+struct SplineTraits<Spline<Scalar_, Dim_, Degree_>, Dynamic> {
+  typedef Scalar_ Scalar; /*!< The spline curve's scalar type. */
+  enum { Dimension = Dim_ /*!< The spline curve's dimension. */ };
+  enum { Degree = Degree_ /*!< The spline curve's degree. */ };
 
-      enum { OrderAtCompileTime = Degree_==Dynamic ? Dynamic : Degree_+1 /*!< The spline curve's order at compile-time. */ };
-      enum { NumOfDerivativesAtCompileTime = OrderAtCompileTime /*!< The number of derivatives defined for the current spline. */ };
-      
-      enum { DerivativeMemoryLayout = Dimension==1 ? RowMajor : ColMajor /*!< The derivative type's memory layout. */ };
+  enum {
+    OrderAtCompileTime = Degree_ == Dynamic ? Dynamic : Degree_ + 1 /*!< The spline curve's order at compile-time. */
+  };
+  enum {
+    NumOfDerivativesAtCompileTime = OrderAtCompileTime /*!< The number of derivatives defined for the current spline. */
+  };
 
-      /** \brief The data type used to store non-zero basis functions. */
-      typedef Array<Scalar,1,OrderAtCompileTime> BasisVectorType;
+  enum { DerivativeMemoryLayout = Dimension == 1 ? RowMajor : ColMajor /*!< The derivative type's memory layout. */ };
 
-      /** \brief The data type used to store the values of the basis function derivatives. */
-      typedef Array<Scalar,Dynamic,Dynamic,RowMajor,NumOfDerivativesAtCompileTime,OrderAtCompileTime> BasisDerivativeType;
-      
-      /** \brief The data type used to store the spline's derivative values. */
-      typedef Array<Scalar,Dimension,Dynamic,DerivativeMemoryLayout,Dimension,NumOfDerivativesAtCompileTime> DerivativeType;
+  /** \brief The data type used to store non-zero basis functions. */
+  typedef Array<Scalar, 1, OrderAtCompileTime> BasisVectorType;
 
-      /** \brief The point type the spline is representing. */
-      typedef Array<Scalar,Dimension,1> PointType;
-      
-      /** \brief The data type used to store knot vectors. */
-      typedef Array<Scalar,1,Dynamic> KnotVectorType;
+  /** \brief The data type used to store the values of the basis function derivatives. */
+  typedef Array<Scalar, Dynamic, Dynamic, RowMajor, NumOfDerivativesAtCompileTime, OrderAtCompileTime>
+      BasisDerivativeType;
 
-      /** \brief The data type used to store parameter vectors. */
-      typedef Array<Scalar,1,Dynamic> ParameterVectorType;
-      
-      /** \brief The data type representing the spline's control points. */
-      typedef Array<Scalar,Dimension,Dynamic> ControlPointVectorType;
-    };
+  /** \brief The data type used to store the spline's derivative values. */
+  typedef Array<Scalar, Dimension, Dynamic, DerivativeMemoryLayout, Dimension, NumOfDerivativesAtCompileTime>
+      DerivativeType;
 
-    /**
-     * \ingroup Splines_Module
-     * \brief Compile-time attributes of the Spline class for fixed degree.
-     *
-     * The traits class inherits all attributes from the SplineTraits of Dynamic degree.
-     **/
-    template < typename Scalar_, int Dim_, int Degree_, int _DerivativeOrder >
-    struct SplineTraits< Spline<Scalar_, Dim_, Degree_>, _DerivativeOrder > : public SplineTraits< Spline<Scalar_, Dim_, Degree_> >
-    {
-      enum { OrderAtCompileTime = Degree_==Dynamic ? Dynamic : Degree_+1 /*!< The spline curve's order at compile-time. */ };
-      enum { NumOfDerivativesAtCompileTime = _DerivativeOrder==Dynamic ? Dynamic : _DerivativeOrder+1 /*!< The number of derivatives defined for the current spline. */ };
-      
-      enum { DerivativeMemoryLayout = Dim_==1 ? RowMajor : ColMajor /*!< The derivative type's memory layout. */ };
+  /** \brief The point type the spline is representing. */
+  typedef Array<Scalar, Dimension, 1> PointType;
 
-      /** \brief The data type used to store the values of the basis function derivatives. */
-      typedef Array<Scalar_,Dynamic,Dynamic,RowMajor,NumOfDerivativesAtCompileTime,OrderAtCompileTime> BasisDerivativeType;
-      
-      /** \brief The data type used to store the spline's derivative values. */      
-      typedef Array<Scalar_,Dim_,Dynamic,DerivativeMemoryLayout,Dim_,NumOfDerivativesAtCompileTime> DerivativeType;
-    };
+  /** \brief The data type used to store knot vectors. */
+  typedef Array<Scalar, 1, Dynamic> KnotVectorType;
 
-    /** \brief 2D float B-spline with dynamic degree. */
-    typedef Spline<float,2> Spline2f;
-    
-    /** \brief 3D float B-spline with dynamic degree. */
-    typedef Spline<float,3> Spline3f;
+  /** \brief The data type used to store parameter vectors. */
+  typedef Array<Scalar, 1, Dynamic> ParameterVectorType;
 
-    /** \brief 2D double B-spline with dynamic degree. */
-    typedef Spline<double,2> Spline2d;
-    
-    /** \brief 3D double B-spline with dynamic degree. */
-    typedef Spline<double,3> Spline3d;
-}
+  /** \brief The data type representing the spline's control points. */
+  typedef Array<Scalar, Dimension, Dynamic> ControlPointVectorType;
+};
 
-#endif // EIGEN_SPLINES_FWD_H
+/**
+ * \ingroup Splines_Module
+ * \brief Compile-time attributes of the Spline class for fixed degree.
+ *
+ * The traits class inherits all attributes from the SplineTraits of Dynamic degree.
+ **/
+template <typename Scalar_, int Dim_, int Degree_, int _DerivativeOrder>
+struct SplineTraits<Spline<Scalar_, Dim_, Degree_>, _DerivativeOrder>
+    : public SplineTraits<Spline<Scalar_, Dim_, Degree_> > {
+  enum {
+    OrderAtCompileTime = Degree_ == Dynamic ? Dynamic : Degree_ + 1 /*!< The spline curve's order at compile-time. */
+  };
+  enum {
+    NumOfDerivativesAtCompileTime =
+        _DerivativeOrder == Dynamic
+            ? Dynamic
+            : _DerivativeOrder + 1 /*!< The number of derivatives defined for the current spline. */
+  };
+
+  enum { DerivativeMemoryLayout = Dim_ == 1 ? RowMajor : ColMajor /*!< The derivative type's memory layout. */ };
+
+  /** \brief The data type used to store the values of the basis function derivatives. */
+  typedef Array<Scalar_, Dynamic, Dynamic, RowMajor, NumOfDerivativesAtCompileTime, OrderAtCompileTime>
+      BasisDerivativeType;
+
+  /** \brief The data type used to store the spline's derivative values. */
+  typedef Array<Scalar_, Dim_, Dynamic, DerivativeMemoryLayout, Dim_, NumOfDerivativesAtCompileTime> DerivativeType;
+};
+
+/** \brief 2D float B-spline with dynamic degree. */
+typedef Spline<float, 2> Spline2f;
+
+/** \brief 3D float B-spline with dynamic degree. */
+typedef Spline<float, 3> Spline3f;
+
+/** \brief 2D double B-spline with dynamic degree. */
+typedef Spline<double, 2> Spline2d;
+
+/** \brief 3D double B-spline with dynamic degree. */
+typedef Spline<double, 3> Spline3d;
+}  // namespace Eigen
+
+#endif  // EIGEN_SPLINES_FWD_H
